create-mud 2.2.17-f1d5432fe2c9abb19fa378f790217e67d6dd8504 → 2.2.17-f88e48e47ceb4a29a3862a3f3b85891490952f0e
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -2
- package/dist/cli.d.ts +1 -2
- package/dist/cli.js +2 -9
- package/dist/cli.js.map +1 -1
- package/dist/templates/phaser/gitignore +7 -0
- package/dist/templates/phaser/packages/art/gitignore +0 -0
- package/dist/templates/phaser/packages/client/gitignore +3 -0
- package/dist/templates/phaser/packages/contracts/gitignore +9 -0
- package/dist/templates/react/gitignore +16 -0
- package/dist/templates/react/packages/client/gitignore +1 -0
- package/{templates → dist/templates}/react/packages/client/src/mud/Synced.tsx +1 -1
- package/dist/templates/react/packages/contracts/gitignore +13 -0
- package/{templates → dist/templates}/react/packages/contracts/test/MoveTest.t.sol +2 -0
- package/{templates/react-ecs → dist/templates/react}/packages/contracts/test/WorldTest.t.sol +5 -0
- package/dist/templates/react-ecs/gitignore +7 -0
- package/{templates/react → dist/templates/react-ecs}/package.json +2 -1
- package/dist/templates/react-ecs/packages/client/gitignore +3 -0
- package/{templates → dist/templates}/react-ecs/packages/client/package.json +9 -16
- package/dist/templates/react-ecs/packages/client/src/App.tsx +29 -0
- package/dist/templates/react-ecs/packages/client/src/mud/createSystemCalls.ts +51 -0
- package/dist/templates/react-ecs/packages/client/src/mud/getNetworkConfig.ts +77 -0
- package/dist/templates/react-ecs/packages/contracts/gitignore +9 -0
- package/dist/templates/threejs/gitignore +7 -0
- package/dist/templates/threejs/packages/client/gitignore +3 -0
- package/{templates/react → dist/templates/threejs}/packages/client/index.html +2 -2
- package/dist/templates/threejs/packages/client/src/MUDContext.tsx +21 -0
- package/dist/templates/threejs/packages/client/src/index.tsx +34 -0
- package/{templates/react → dist/templates/threejs}/packages/client/vite.config.ts +7 -2
- package/{templates/react-ecs → dist/templates/threejs}/packages/contracts/.env +1 -1
- package/dist/templates/threejs/packages/contracts/gitignore +9 -0
- package/dist/templates/vanilla/gitignore +7 -0
- package/dist/templates/vanilla/mprocs.yaml +13 -0
- package/dist/templates/vanilla/packages/client/gitignore +3 -0
- package/dist/templates/vanilla/packages/client/src/mud/createClientComponents.ts +21 -0
- package/dist/templates/vanilla/packages/client/src/mud/setup.ts +21 -0
- package/dist/templates/vanilla/packages/client/src/mud/setupNetwork.ts +106 -0
- package/dist/templates/vanilla/packages/client/src/mud/supportedChains.ts +20 -0
- package/dist/templates/vanilla/packages/client/src/mud/world.ts +3 -0
- package/{templates/react → dist/templates/vanilla}/packages/client/tsconfig.json +1 -1
- package/dist/templates/vanilla/packages/contracts/.env +11 -0
- package/dist/templates/vanilla/packages/contracts/gitignore +9 -0
- package/dist/templates/vanilla/packages/contracts/mud.config.ts +13 -0
- package/{templates/react → dist/templates/vanilla}/packages/contracts/package.json +0 -1
- package/{templates/react → dist/templates/vanilla}/packages/contracts/script/PostDeploy.s.sol +5 -1
- package/{templates/react/packages/contracts/src/codegen/common.sol → dist/templates/vanilla/packages/contracts/src/codegen/index.sol} +1 -6
- package/{templates/react-ecs/packages/contracts/src/codegen/tables/EntityCount.sol → dist/templates/vanilla/packages/contracts/src/codegen/tables/Counter.sol} +35 -35
- package/dist/templates/vanilla/packages/contracts/src/codegen/world/IIncrementSystem.sol +13 -0
- package/dist/templates/vanilla/packages/contracts/src/codegen/world/IWorld.sol +16 -0
- package/dist/templates/vanilla/packages/contracts/src/systems/IncrementSystem.sol +14 -0
- package/dist/templates/vanilla/packages/contracts/test/CounterTest.t.sol +31 -0
- package/dist/templates/vanilla/packages/contracts/worlds.json +5 -0
- package/package.json +11 -17
- package/bin/cli.js +0 -4
- package/templates/react/mprocs.yaml +0 -21
- package/templates/react/packages/client/postcss.config.cjs +0 -6
- package/templates/react/packages/client/src/game/useKeyboardMovement.ts +0 -26
- package/templates/react/packages/client/src/index.tsx +0 -19
- package/templates/react/packages/client/src/mud/Explorer.tsx +0 -32
- package/templates/react/packages/client/src/mud/useWorldContract.ts +0 -44
- package/templates/react/packages/client/src/ui/AsyncButton.tsx +0 -41
- package/templates/react/packages/client/src/ui/ErrorFallback.tsx +0 -58
- package/templates/react/packages/client/src/ui/icons/ArrowDownIcon.tsx +0 -22
- package/templates/react/packages/client/src/ui/icons/MUDIcon.tsx +0 -25
- package/templates/react/packages/client/src/wagmiConfig.ts +0 -49
- package/templates/react/packages/client/tailwind.config.ts +0 -10
- package/templates/react/packages/contracts/.env +0 -11
- package/templates/react/packages/contracts/test/WorldTest.t.sol +0 -16
- package/templates/react/packages/contracts/worlds.json +0 -5
- package/templates/react-ecs/packages/client/src/App.tsx +0 -74
- package/templates/react-ecs/packages/client/src/Providers.tsx +0 -29
- package/templates/react-ecs/packages/client/src/common.ts +0 -27
- package/templates/react-ecs/packages/client/src/game/GameMap.tsx +0 -112
- package/templates/react-ecs/packages/client/src/mud/Synced.tsx +0 -14
- package/templates/react-ecs/packages/client/src/mud/recs.ts +0 -6
- package/templates/react-ecs/packages/client/src/mud/useSyncStatus.ts +0 -17
- package/templates/react-ecs/packages/contracts/mud.config.ts +0 -25
- package/templates/react-ecs/packages/contracts/out/IWorld.sol/IWorld.abi.json +0 -2039
- package/templates/react-ecs/packages/contracts/src/Entity.sol +0 -20
- package/templates/react-ecs/packages/contracts/src/MoveSystem.sol +0 -30
- package/templates/react-ecs/packages/contracts/src/SpawnSystem.sol +0 -18
- package/templates/react-ecs/packages/contracts/src/codegen/index.sol +0 -8
- package/templates/react-ecs/packages/contracts/src/codegen/tables/Owner.sol +0 -202
- package/templates/react-ecs/packages/contracts/src/codegen/tables/Position.sol +0 -321
- package/templates/react-ecs/packages/contracts/src/codegen/world/IMoveSystem.sol +0 -16
- package/templates/react-ecs/packages/contracts/src/codegen/world/ISpawnSystem.sol +0 -15
- package/templates/react-ecs/packages/contracts/src/codegen/world/IWorld.sol +0 -17
- package/templates/react-ecs/packages/contracts/src/createEntity.sol +0 -11
- package/templates/react-ecs/packages/contracts/test/MoveTest.t.sol +0 -39
- /package/{templates → dist/templates}/phaser/.eslintrc +0 -0
- /package/{templates → dist/templates}/phaser/.gitattributes +0 -0
- /package/{templates → dist/templates}/phaser/.vscode/extensions.json +0 -0
- /package/{templates → dist/templates}/phaser/.vscode/settings.json +0 -0
- /package/{templates → dist/templates}/phaser/mprocs.yaml +0 -0
- /package/{templates → dist/templates}/phaser/package.json +0 -0
- /package/{templates → dist/templates}/phaser/packages/art/README.md +0 -0
- /package/{templates → dist/templates}/phaser/packages/art/config-sprites.json +0 -0
- /package/{templates → dist/templates}/phaser/packages/art/package.json +0 -0
- /package/{templates → dist/templates}/phaser/packages/art/scripts/cli.mjs +0 -0
- /package/{templates → dist/templates}/phaser/packages/art/scripts/export-tiled-types.ts +0 -0
- /package/{templates → dist/templates}/phaser/packages/art/sprites/golem/attack/0.png +0 -0
- /package/{templates → dist/templates}/phaser/packages/art/sprites/golem/attack/1.png +0 -0
- /package/{templates → dist/templates}/phaser/packages/art/sprites/golem/attack/2.png +0 -0
- /package/{templates → dist/templates}/phaser/packages/art/sprites/golem/attack/3.png +0 -0
- /package/{templates → dist/templates}/phaser/packages/art/sprites/golem/attack/4.png +0 -0
- /package/{templates → dist/templates}/phaser/packages/art/sprites/golem/attack/5.png +0 -0
- /package/{templates → dist/templates}/phaser/packages/art/sprites/golem/death/0.png +0 -0
- /package/{templates → dist/templates}/phaser/packages/art/sprites/golem/death/1.png +0 -0
- /package/{templates → dist/templates}/phaser/packages/art/sprites/golem/death/2.png +0 -0
- /package/{templates → dist/templates}/phaser/packages/art/sprites/golem/idle/0.png +0 -0
- /package/{templates → dist/templates}/phaser/packages/art/sprites/golem/idle/1.png +0 -0
- /package/{templates → dist/templates}/phaser/packages/art/sprites/golem/idle/2.png +0 -0
- /package/{templates → dist/templates}/phaser/packages/art/sprites/golem/idle/3.png +0 -0
- /package/{templates → dist/templates}/phaser/packages/art/tilesets/images/world.png +0 -0
- /package/{templates → dist/templates}/phaser/packages/art/tilesets/world.tsx +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/.env +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/.eslintrc +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/index.html +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/package.json +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/public/assets/atlases/atlas.json +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/public/assets/atlases/atlas.png +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/public/assets/tilesets/world.png +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/src/artTypes/world.ts +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/src/index.tsx +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/src/layers/network/createNetworkLayer.ts +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/src/layers/phaser/configurePhaser.ts +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/src/layers/phaser/constants.ts +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/src/layers/phaser/createPhaserLayer.ts +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/src/layers/phaser/systems/createCamera.ts +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/src/layers/phaser/systems/createMapSystem.ts +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/src/layers/phaser/systems/index.ts +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/src/layers/phaser/systems/registerSystems.ts +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/src/mud/createClientComponents.ts +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/src/mud/createSystemCalls.ts +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/src/mud/getNetworkConfig.ts +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/src/mud/setup.ts +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/src/mud/setupNetwork.ts +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/src/mud/supportedChains.ts +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/src/mud/world.ts +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/src/store.ts +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/src/ui/App.tsx +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/src/ui/LoadingScreen/BootScreen.tsx +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/src/ui/LoadingScreen/LoadingBar.tsx +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/src/ui/LoadingScreen/LoadingScreen.tsx +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/src/ui/LoadingScreen/index.ts +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/src/ui/PhaserLayer.tsx +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/src/ui/UIRoot.tsx +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/src/ui/Wrapper.tsx +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/src/ui/hooks/useNetworkLayer.tsx +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/src/ui/hooks/usePhaserLayer.tsx +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/src/ui/hooks/usePromiseValue.ts +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/src/ui/theme/ClickWrapper.tsx +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/src/ui/theme/SpriteImage.tsx +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/tsconfig.json +0 -0
- /package/{templates → dist/templates}/phaser/packages/client/vite.config.ts +0 -0
- /package/{templates → dist/templates}/phaser/packages/contracts/.env +0 -0
- /package/{templates → dist/templates}/phaser/packages/contracts/.prettierrc +0 -0
- /package/{templates → dist/templates}/phaser/packages/contracts/.solhint.json +0 -0
- /package/{templates → dist/templates}/phaser/packages/contracts/foundry.toml +0 -0
- /package/{templates → dist/templates}/phaser/packages/contracts/mud.config.ts +0 -0
- /package/{templates → dist/templates}/phaser/packages/contracts/package.json +0 -0
- /package/{templates → dist/templates}/phaser/packages/contracts/remappings.txt +0 -0
- /package/{templates → dist/templates}/phaser/packages/contracts/script/PostDeploy.s.sol +0 -0
- /package/{templates → dist/templates}/phaser/packages/contracts/src/codegen/index.sol +0 -0
- /package/{templates → dist/templates}/phaser/packages/contracts/src/codegen/tables/Counter.sol +0 -0
- /package/{templates → dist/templates}/phaser/packages/contracts/src/codegen/world/IIncrementSystem.sol +0 -0
- /package/{templates → dist/templates}/phaser/packages/contracts/src/codegen/world/IWorld.sol +0 -0
- /package/{templates → dist/templates}/phaser/packages/contracts/src/systems/IncrementSystem.sol +0 -0
- /package/{templates → dist/templates}/phaser/packages/contracts/test/CounterTest.t.sol +0 -0
- /package/{templates → dist/templates}/phaser/packages/contracts/tsconfig.json +0 -0
- /package/{templates → dist/templates}/phaser/packages/contracts/worlds.json +0 -0
- /package/{templates → dist/templates}/phaser/packages/contracts/worlds.json.d.ts +0 -0
- /package/{templates → dist/templates}/phaser/pnpm-workspace.yaml +0 -0
- /package/{templates → dist/templates}/phaser/tsconfig.json +0 -0
- /package/{templates → dist/templates}/react/.eslintrc +0 -0
- /package/{templates → dist/templates}/react/.gitattributes +0 -0
- /package/{templates → dist/templates}/react/.vscode/extensions.json +0 -0
- /package/{templates → dist/templates}/react/.vscode/settings.json +0 -0
- /package/{templates/react-ecs → dist/templates/react}/mprocs.yaml +0 -0
- /package/{templates/react-ecs → dist/templates/react}/package.json +0 -0
- /package/{templates → dist/templates}/react/packages/client/.env +0 -0
- /package/{templates → dist/templates}/react/packages/client/.eslintrc +0 -0
- /package/{templates/react-ecs → dist/templates/react}/packages/client/index.html +0 -0
- /package/{templates → dist/templates}/react/packages/client/package.json +0 -0
- /package/{templates/react-ecs → dist/templates/react}/packages/client/postcss.config.cjs +0 -0
- /package/{templates → dist/templates}/react/packages/client/src/App.tsx +0 -0
- /package/{templates → dist/templates}/react/packages/client/src/Providers.tsx +0 -0
- /package/{templates → dist/templates}/react/packages/client/src/common.ts +0 -0
- /package/{templates → dist/templates}/react/packages/client/src/game/GameMap.tsx +0 -0
- /package/{templates/react-ecs → dist/templates/react}/packages/client/src/game/useKeyboardMovement.ts +0 -0
- /package/{templates/react-ecs → dist/templates/react}/packages/client/src/index.tsx +0 -0
- /package/{templates/react-ecs → dist/templates/react}/packages/client/src/mud/Explorer.tsx +0 -0
- /package/{templates → dist/templates}/react/packages/client/src/mud/stash.ts +0 -0
- /package/{templates → dist/templates}/react/packages/client/src/mud/useSyncStatus.ts +0 -0
- /package/{templates/react-ecs → dist/templates/react}/packages/client/src/mud/useWorldContract.ts +0 -0
- /package/{templates/react-ecs → dist/templates/react}/packages/client/src/ui/AsyncButton.tsx +0 -0
- /package/{templates/react-ecs → dist/templates/react}/packages/client/src/ui/ErrorFallback.tsx +0 -0
- /package/{templates/react-ecs → dist/templates/react}/packages/client/src/ui/icons/ArrowDownIcon.tsx +0 -0
- /package/{templates/react-ecs → dist/templates/react}/packages/client/src/ui/icons/MUDIcon.tsx +0 -0
- /package/{templates/react-ecs → dist/templates/react}/packages/client/src/wagmiConfig.ts +0 -0
- /package/{templates/react-ecs → dist/templates/react}/packages/client/tailwind.config.ts +0 -0
- /package/{templates/react-ecs → dist/templates/react}/packages/client/tsconfig.json +0 -0
- /package/{templates/react-ecs → dist/templates/react}/packages/client/vite.config.ts +0 -0
- /package/{templates/vanilla → dist/templates/react}/packages/contracts/.env +0 -0
- /package/{templates → dist/templates}/react/packages/contracts/.prettierrc +0 -0
- /package/{templates → dist/templates}/react/packages/contracts/.solhint.json +0 -0
- /package/{templates → dist/templates}/react/packages/contracts/foundry.toml +0 -0
- /package/{templates → dist/templates}/react/packages/contracts/mud.config.ts +0 -0
- /package/{templates → dist/templates}/react/packages/contracts/out/IWorld.sol/IWorld.abi.json +0 -0
- /package/{templates/react-ecs → dist/templates/react}/packages/contracts/package.json +0 -0
- /package/{templates → dist/templates}/react/packages/contracts/remappings.txt +0 -0
- /package/{templates/react-ecs → dist/templates/react}/packages/contracts/script/PostDeploy.s.sol +0 -0
- /package/{templates → dist/templates}/react/packages/contracts/src/MoveSystem.sol +0 -0
- /package/{templates/react-ecs → dist/templates/react}/packages/contracts/src/codegen/common.sol +0 -0
- /package/{templates → dist/templates}/react/packages/contracts/src/codegen/index.sol +0 -0
- /package/{templates → dist/templates}/react/packages/contracts/src/codegen/tables/Position.sol +0 -0
- /package/{templates → dist/templates}/react/packages/contracts/src/codegen/world/IMoveSystem.sol +0 -0
- /package/{templates → dist/templates}/react/packages/contracts/src/codegen/world/IWorld.sol +0 -0
- /package/{templates → dist/templates}/react/packages/contracts/tsconfig.json +0 -0
- /package/{templates/react-ecs → dist/templates/react}/packages/contracts/worlds.json +0 -0
- /package/{templates → dist/templates}/react/packages/contracts/worlds.json.d.ts +0 -0
- /package/{templates → dist/templates}/react/pnpm-workspace.yaml +0 -0
- /package/{templates → dist/templates}/react/tsconfig.json +0 -0
- /package/{templates → dist/templates}/react-ecs/.eslintrc +0 -0
- /package/{templates → dist/templates}/react-ecs/.gitattributes +0 -0
- /package/{templates → dist/templates}/react-ecs/.vscode/extensions.json +0 -0
- /package/{templates → dist/templates}/react-ecs/.vscode/settings.json +0 -0
- /package/{templates/threejs → dist/templates/react-ecs}/mprocs.yaml +0 -0
- /package/{templates → dist/templates}/react-ecs/packages/client/.env +0 -0
- /package/{templates → dist/templates}/react-ecs/packages/client/.eslintrc +0 -0
- /package/{templates/threejs → dist/templates/react-ecs}/packages/client/index.html +0 -0
- /package/{templates/threejs → dist/templates/react-ecs}/packages/client/src/MUDContext.tsx +0 -0
- /package/{templates/threejs → dist/templates/react-ecs}/packages/client/src/index.tsx +0 -0
- /package/{templates/threejs → dist/templates/react-ecs}/packages/client/src/mud/createClientComponents.ts +0 -0
- /package/{templates/vanilla → dist/templates/react-ecs}/packages/client/src/mud/setup.ts +0 -0
- /package/{templates/vanilla → dist/templates/react-ecs}/packages/client/src/mud/setupNetwork.ts +0 -0
- /package/{templates/threejs → dist/templates/react-ecs}/packages/client/src/mud/supportedChains.ts +0 -0
- /package/{templates/threejs → dist/templates/react-ecs}/packages/client/src/mud/world.ts +0 -0
- /package/{templates/threejs → dist/templates/react-ecs}/packages/client/tsconfig.json +0 -0
- /package/{templates/threejs → dist/templates/react-ecs}/packages/client/vite.config.ts +0 -0
- /package/{templates/threejs → dist/templates/react-ecs}/packages/contracts/.env +0 -0
- /package/{templates → dist/templates}/react-ecs/packages/contracts/.prettierrc +0 -0
- /package/{templates → dist/templates}/react-ecs/packages/contracts/.solhint.json +0 -0
- /package/{templates → dist/templates}/react-ecs/packages/contracts/foundry.toml +0 -0
- /package/{templates/vanilla → dist/templates/react-ecs}/packages/contracts/mud.config.ts +0 -0
- /package/{templates/vanilla → dist/templates/react-ecs}/packages/contracts/package.json +0 -0
- /package/{templates → dist/templates}/react-ecs/packages/contracts/remappings.txt +0 -0
- /package/{templates/vanilla → dist/templates/react-ecs}/packages/contracts/script/PostDeploy.s.sol +0 -0
- /package/{templates/vanilla → dist/templates/react-ecs}/packages/contracts/src/codegen/index.sol +0 -0
- /package/{templates/vanilla → dist/templates/react-ecs}/packages/contracts/src/codegen/tables/Counter.sol +0 -0
- /package/{templates/vanilla → dist/templates/react-ecs}/packages/contracts/src/codegen/world/IIncrementSystem.sol +0 -0
- /package/{templates/vanilla → dist/templates/react-ecs}/packages/contracts/src/codegen/world/IWorld.sol +0 -0
- /package/{templates/vanilla → dist/templates/react-ecs}/packages/contracts/src/systems/IncrementSystem.sol +0 -0
- /package/{templates/vanilla → dist/templates/react-ecs}/packages/contracts/test/CounterTest.t.sol +0 -0
- /package/{templates → dist/templates}/react-ecs/packages/contracts/tsconfig.json +0 -0
- /package/{templates/threejs → dist/templates/react-ecs}/packages/contracts/worlds.json +0 -0
- /package/{templates → dist/templates}/react-ecs/packages/contracts/worlds.json.d.ts +0 -0
- /package/{templates → dist/templates}/react-ecs/pnpm-workspace.yaml +0 -0
- /package/{templates → dist/templates}/react-ecs/tsconfig.json +0 -0
- /package/{templates → dist/templates}/threejs/.eslintrc +0 -0
- /package/{templates → dist/templates}/threejs/.gitattributes +0 -0
- /package/{templates → dist/templates}/threejs/.vscode/extensions.json +0 -0
- /package/{templates → dist/templates}/threejs/.vscode/settings.json +0 -0
- /package/{templates/vanilla → dist/templates/threejs}/mprocs.yaml +0 -0
- /package/{templates → dist/templates}/threejs/package.json +0 -0
- /package/{templates → dist/templates}/threejs/packages/client/.env +0 -0
- /package/{templates → dist/templates}/threejs/packages/client/.eslintrc +0 -0
- /package/{templates → dist/templates}/threejs/packages/client/package.json +0 -0
- /package/{templates → dist/templates}/threejs/packages/client/src/App.tsx +0 -0
- /package/{templates/vanilla → dist/templates/threejs}/packages/client/src/mud/createClientComponents.ts +0 -0
- /package/{templates → dist/templates}/threejs/packages/client/src/mud/createSystemCalls.ts +0 -0
- /package/{templates → dist/templates}/threejs/packages/client/src/mud/getNetworkConfig.ts +0 -0
- /package/{templates → dist/templates}/threejs/packages/client/src/mud/setup.ts +0 -0
- /package/{templates → dist/templates}/threejs/packages/client/src/mud/setupNetwork.ts +0 -0
- /package/{templates/vanilla → dist/templates/threejs}/packages/client/src/mud/supportedChains.ts +0 -0
- /package/{templates/vanilla → dist/templates/threejs}/packages/client/src/mud/world.ts +0 -0
- /package/{templates → dist/templates}/threejs/packages/client/src/useKeyboardMovement.ts +0 -0
- /package/{templates/vanilla → dist/templates/threejs}/packages/client/tsconfig.json +0 -0
- /package/{templates → dist/templates}/threejs/packages/contracts/.prettierrc +0 -0
- /package/{templates → dist/templates}/threejs/packages/contracts/.solhint.json +0 -0
- /package/{templates → dist/templates}/threejs/packages/contracts/foundry.toml +0 -0
- /package/{templates → dist/templates}/threejs/packages/contracts/mud.config.ts +0 -0
- /package/{templates → dist/templates}/threejs/packages/contracts/package.json +0 -0
- /package/{templates → dist/templates}/threejs/packages/contracts/remappings.txt +0 -0
- /package/{templates → dist/templates}/threejs/packages/contracts/src/codegen/index.sol +0 -0
- /package/{templates → dist/templates}/threejs/packages/contracts/src/codegen/tables/Position.sol +0 -0
- /package/{templates → dist/templates}/threejs/packages/contracts/src/codegen/world/IMoveSystem.sol +0 -0
- /package/{templates → dist/templates}/threejs/packages/contracts/src/codegen/world/IWorld.sol +0 -0
- /package/{templates → dist/templates}/threejs/packages/contracts/src/systems/MoveSystem.sol +0 -0
- /package/{templates → dist/templates}/threejs/packages/contracts/test/WorldTest.t.sol +0 -0
- /package/{templates → dist/templates}/threejs/packages/contracts/tsconfig.json +0 -0
- /package/{templates/vanilla → dist/templates/threejs}/packages/contracts/worlds.json +0 -0
- /package/{templates → dist/templates}/threejs/packages/contracts/worlds.json.d.ts +0 -0
- /package/{templates → dist/templates}/threejs/pnpm-workspace.yaml +0 -0
- /package/{templates → dist/templates}/threejs/tsconfig.json +0 -0
- /package/{templates → dist/templates}/vanilla/.eslintrc +0 -0
- /package/{templates → dist/templates}/vanilla/.gitattributes +0 -0
- /package/{templates → dist/templates}/vanilla/.vscode/extensions.json +0 -0
- /package/{templates → dist/templates}/vanilla/.vscode/settings.json +0 -0
- /package/{templates → dist/templates}/vanilla/package.json +0 -0
- /package/{templates → dist/templates}/vanilla/packages/client/.env +0 -0
- /package/{templates → dist/templates}/vanilla/packages/client/index.html +0 -0
- /package/{templates → dist/templates}/vanilla/packages/client/package.json +0 -0
- /package/{templates → dist/templates}/vanilla/packages/client/src/index.ts +0 -0
- /package/{templates → dist/templates}/vanilla/packages/client/src/mud/createSystemCalls.ts +0 -0
- /package/{templates → dist/templates}/vanilla/packages/client/src/mud/getNetworkConfig.ts +0 -0
- /package/{templates → dist/templates}/vanilla/packages/client/vite.config.ts +0 -0
- /package/{templates → dist/templates}/vanilla/packages/contracts/.prettierrc +0 -0
- /package/{templates → dist/templates}/vanilla/packages/contracts/.solhint.json +0 -0
- /package/{templates → dist/templates}/vanilla/packages/contracts/foundry.toml +0 -0
- /package/{templates → dist/templates}/vanilla/packages/contracts/remappings.txt +0 -0
- /package/{templates → dist/templates}/vanilla/packages/contracts/tsconfig.json +0 -0
- /package/{templates → dist/templates}/vanilla/packages/contracts/worlds.json.d.ts +0 -0
- /package/{templates → dist/templates}/vanilla/pnpm-workspace.yaml +0 -0
- /package/{templates → dist/templates}/vanilla/tsconfig.json +0 -0
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { useClient } from "wagmi";
|
|
2
|
-
import { chainId, getWorldAddress } from "../common";
|
|
3
|
-
import { Account, Chain, Client, GetContractReturnType, Transport, getContract } from "viem";
|
|
4
|
-
import { useQuery } from "@tanstack/react-query";
|
|
5
|
-
import { useSessionClient } from "@latticexyz/entrykit/internal";
|
|
6
|
-
import { observer } from "@latticexyz/explorer/observer";
|
|
7
|
-
import worldAbi from "contracts/out/IWorld.sol/IWorld.abi.json";
|
|
8
|
-
|
|
9
|
-
export function useWorldContract():
|
|
10
|
-
| GetContractReturnType<
|
|
11
|
-
typeof worldAbi,
|
|
12
|
-
{
|
|
13
|
-
public: Client<Transport, Chain>;
|
|
14
|
-
wallet: Client<Transport, Chain, Account>;
|
|
15
|
-
}
|
|
16
|
-
>
|
|
17
|
-
| undefined {
|
|
18
|
-
const client = useClient({ chainId });
|
|
19
|
-
const { data: sessionClient } = useSessionClient();
|
|
20
|
-
|
|
21
|
-
const { data: worldContract } = useQuery({
|
|
22
|
-
queryKey: ["worldContract", client?.uid, sessionClient?.uid],
|
|
23
|
-
queryFn: () => {
|
|
24
|
-
if (!client || !sessionClient) {
|
|
25
|
-
throw new Error("Not connected.");
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
return getContract({
|
|
29
|
-
abi: worldAbi,
|
|
30
|
-
address: getWorldAddress(),
|
|
31
|
-
client: {
|
|
32
|
-
public: client,
|
|
33
|
-
wallet: sessionClient.extend(observer()),
|
|
34
|
-
},
|
|
35
|
-
});
|
|
36
|
-
},
|
|
37
|
-
staleTime: Infinity,
|
|
38
|
-
refetchOnMount: false,
|
|
39
|
-
refetchOnReconnect: false,
|
|
40
|
-
refetchOnWindowFocus: false,
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
return worldContract;
|
|
44
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { DetailedHTMLProps, ButtonHTMLAttributes, useState, useRef, useCallback, MouseEventHandler } from "react";
|
|
2
|
-
|
|
3
|
-
export type AsyncButtonProps = {
|
|
4
|
-
pending?: boolean;
|
|
5
|
-
};
|
|
6
|
-
|
|
7
|
-
export type Props = AsyncButtonProps & DetailedHTMLProps<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>;
|
|
8
|
-
|
|
9
|
-
export const AsyncButton = ({ pending, type, disabled, onClick, ...props }: Props) => {
|
|
10
|
-
// TODO: move all this logic into a hook so we can wrap other event handlers
|
|
11
|
-
|
|
12
|
-
const promiseRef = useRef<Promise<unknown>>();
|
|
13
|
-
const [promisePending, setPromisePending] = useState<true | undefined>(undefined);
|
|
14
|
-
|
|
15
|
-
const asyncOnClick = useCallback<MouseEventHandler<HTMLButtonElement>>(
|
|
16
|
-
(...args) => {
|
|
17
|
-
if (!onClick) return;
|
|
18
|
-
const result = onClick(...args);
|
|
19
|
-
const promise = Promise.resolve(result);
|
|
20
|
-
promiseRef.current = promise;
|
|
21
|
-
setPromisePending(true);
|
|
22
|
-
promise.finally(() => {
|
|
23
|
-
if (promiseRef.current === promise) {
|
|
24
|
-
setPromisePending(undefined);
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
},
|
|
28
|
-
[onClick],
|
|
29
|
-
);
|
|
30
|
-
|
|
31
|
-
return (
|
|
32
|
-
<button
|
|
33
|
-
type={type || "button"}
|
|
34
|
-
aria-busy={pending || promisePending}
|
|
35
|
-
aria-disabled={disabled}
|
|
36
|
-
disabled={disabled || pending || promisePending}
|
|
37
|
-
onClick={onClick ? asyncOnClick : undefined}
|
|
38
|
-
{...props}
|
|
39
|
-
/>
|
|
40
|
-
);
|
|
41
|
-
};
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import { wait } from "@latticexyz/common/utils";
|
|
2
|
-
import { useEffect, useRef, useState } from "react";
|
|
3
|
-
import { FallbackProps } from "react-error-boundary";
|
|
4
|
-
|
|
5
|
-
export function ErrorFallback({ error, resetErrorBoundary }: FallbackProps) {
|
|
6
|
-
const when = new Date();
|
|
7
|
-
const isMounted = useRef(false);
|
|
8
|
-
const [retries, setRetries] = useState(1);
|
|
9
|
-
|
|
10
|
-
useEffect(() => {
|
|
11
|
-
isMounted.current = true;
|
|
12
|
-
return () => {
|
|
13
|
-
isMounted.current = false;
|
|
14
|
-
};
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
return (
|
|
18
|
-
<div className="fixed inset-0 overflow-auto bg-red-50">
|
|
19
|
-
<div className="w-full max-w-screen-md mx-auto py-16 px-8 space-y-12">
|
|
20
|
-
<h1 className="text-4xl font-black text-red-500">Oops! It broke :(</h1>
|
|
21
|
-
<div className="space-y-6">
|
|
22
|
-
<div className="relative">
|
|
23
|
-
<div className="p-6 bg-red-100 border-l-8 -ml-[8px] border-red-500 font-semibold whitespace-pre-wrap">
|
|
24
|
-
{error instanceof Error ? error.message : String(error)}
|
|
25
|
-
</div>
|
|
26
|
-
{error instanceof Error && error.stack ? (
|
|
27
|
-
<div className="p-6 bg-white font-mono text-sm overflow-auto whitespace-pre">{error.stack}</div>
|
|
28
|
-
) : null}
|
|
29
|
-
<div className="absolute top-full right-0 text-sm text-stone-400" title={when.toISOString()}>
|
|
30
|
-
{when.toLocaleString()}
|
|
31
|
-
</div>
|
|
32
|
-
</div>
|
|
33
|
-
|
|
34
|
-
{retries > 0 ? (
|
|
35
|
-
<button
|
|
36
|
-
type="button"
|
|
37
|
-
className="group bg-red-500 text-white px-4 py-2 rounded-md hover:bg-red-600 active:bg-red-700 transition aria-busy:pointer-events-none aria-busy:animate-pulse"
|
|
38
|
-
onClick={async (event) => {
|
|
39
|
-
// if we retry and the same error occurs, it'll look like the button click did nothing
|
|
40
|
-
// so we'll fake a pending state here to give users an indication something is happening
|
|
41
|
-
event.currentTarget.ariaBusy = "true";
|
|
42
|
-
await wait(1000);
|
|
43
|
-
resetErrorBoundary();
|
|
44
|
-
if (isMounted.current) {
|
|
45
|
-
setRetries((value) => value - 1);
|
|
46
|
-
event.currentTarget.ariaBusy = null;
|
|
47
|
-
}
|
|
48
|
-
}}
|
|
49
|
-
>
|
|
50
|
-
<span className="group-aria-busy:hidden">Retry?</span>
|
|
51
|
-
<span className="hidden group-aria-busy:inline">Retrying…</span>
|
|
52
|
-
</button>
|
|
53
|
-
) : null}
|
|
54
|
-
</div>
|
|
55
|
-
</div>
|
|
56
|
-
</div>
|
|
57
|
-
);
|
|
58
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { DetailedHTMLProps, SVGAttributes } from "react";
|
|
2
|
-
import { twMerge } from "tailwind-merge";
|
|
3
|
-
|
|
4
|
-
export type Props = DetailedHTMLProps<SVGAttributes<SVGSVGElement>, SVGSVGElement>;
|
|
5
|
-
|
|
6
|
-
export function ArrowDownIcon({ className, ...props }: Props) {
|
|
7
|
-
return (
|
|
8
|
-
<svg
|
|
9
|
-
className={twMerge("h-[1em] w-[1em]", className)}
|
|
10
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
11
|
-
viewBox="0 0 16 16"
|
|
12
|
-
fill="currentColor"
|
|
13
|
-
{...props}
|
|
14
|
-
>
|
|
15
|
-
<path
|
|
16
|
-
fillRule="evenodd"
|
|
17
|
-
d="M8 2a.75.75 0 0 1 .75.75v8.69l3.22-3.22a.75.75 0 1 1 1.06 1.06l-4.5 4.5a.75.75 0 0 1-1.06 0l-4.5-4.5a.75.75 0 0 1 1.06-1.06l3.22 3.22V2.75A.75.75 0 0 1 8 2Z"
|
|
18
|
-
clipRule="evenodd"
|
|
19
|
-
/>
|
|
20
|
-
</svg>
|
|
21
|
-
);
|
|
22
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { DetailedHTMLProps, SVGAttributes } from "react";
|
|
2
|
-
import { twMerge } from "tailwind-merge";
|
|
3
|
-
|
|
4
|
-
export type Props = DetailedHTMLProps<SVGAttributes<SVGSVGElement>, SVGSVGElement>;
|
|
5
|
-
|
|
6
|
-
export function MUDIcon({ className, ...props }: Props) {
|
|
7
|
-
return (
|
|
8
|
-
<svg
|
|
9
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
10
|
-
viewBox="0 0 8 8"
|
|
11
|
-
fill="currentColor"
|
|
12
|
-
shapeRendering="crispEdges"
|
|
13
|
-
className={twMerge("-my-[0.125em] h-[1.25em] w-[1.25em]", className)}
|
|
14
|
-
{...props}
|
|
15
|
-
>
|
|
16
|
-
{/* eslint-disable-next-line max-len */}
|
|
17
|
-
<path d="M0 0h1v1H0zm0 1h1v1H0zm0 1h1v1H0zm0 1h1v1H0zm0 1h1v1H0zm0 1h1v1H0zm0 1h1v1H0zm0 1h1v1H0zm1 0h1v1H1zm1 0h1v1H2zm1 0h1v1H3zm1 0h1v1H4zm1 0h1v1H5zm2-1h1v1H7zm0 1h1v1H7zM6 7h1v1H6zm1-2h1v1H7zm0-1h1v1H7zm0-1h1v1H7z" />
|
|
18
|
-
<path
|
|
19
|
-
d="M2 2h1v1H2zm0 1h1v1H2zm0 1h1v1H2zm0 1h1v1H2zm1-3h1v1H3zm1 0h1v1H4zm1 0h1v1H5zm0 1h1v1H5zm0 1h1v1H5zm0 1h1v1H5zM4 5h1v1H4zM3 5h1v1H3z"
|
|
20
|
-
opacity=".5"
|
|
21
|
-
/>
|
|
22
|
-
<path d="M7 2h1v1H7zm0-1h1v1H7zM1 0h1v1H1zm1 0h1v1H2zm1 0h1v1H3zm1 0h1v1H4zm1 0h1v1H5zm1 0h1v1H6zm1 0h1v1H7z" />
|
|
23
|
-
</svg>
|
|
24
|
-
);
|
|
25
|
-
}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { Chain, http, webSocket } from "viem";
|
|
2
|
-
import { anvil } from "viem/chains";
|
|
3
|
-
import { createWagmiConfig } from "@latticexyz/entrykit/internal";
|
|
4
|
-
import { rhodolite, garnet, redstone } from "@latticexyz/common/chains";
|
|
5
|
-
import { chainId } from "./common";
|
|
6
|
-
|
|
7
|
-
export const chains = [
|
|
8
|
-
redstone,
|
|
9
|
-
garnet,
|
|
10
|
-
rhodolite,
|
|
11
|
-
{
|
|
12
|
-
...anvil,
|
|
13
|
-
contracts: {
|
|
14
|
-
...anvil.contracts,
|
|
15
|
-
paymaster: {
|
|
16
|
-
address: "0xf03E61E7421c43D9068Ca562882E98d1be0a6b6e",
|
|
17
|
-
},
|
|
18
|
-
},
|
|
19
|
-
blockExplorers: {
|
|
20
|
-
default: {} as never,
|
|
21
|
-
worldsExplorer: {
|
|
22
|
-
name: "MUD Worlds Explorer",
|
|
23
|
-
url: "http://localhost:13690/anvil/worlds",
|
|
24
|
-
},
|
|
25
|
-
},
|
|
26
|
-
},
|
|
27
|
-
] as const satisfies Chain[];
|
|
28
|
-
|
|
29
|
-
export const transports = {
|
|
30
|
-
[anvil.id]: webSocket(),
|
|
31
|
-
[garnet.id]: http(),
|
|
32
|
-
[rhodolite.id]: http(),
|
|
33
|
-
[redstone.id]: http(),
|
|
34
|
-
} as const;
|
|
35
|
-
|
|
36
|
-
export const wagmiConfig = createWagmiConfig({
|
|
37
|
-
chainId,
|
|
38
|
-
// TODO: swap this with another default project ID or leave empty
|
|
39
|
-
walletConnectProjectId: "14ce88fdbc0f9c294e26ec9b4d848e44",
|
|
40
|
-
appName: document.title,
|
|
41
|
-
chains,
|
|
42
|
-
transports,
|
|
43
|
-
pollingInterval: {
|
|
44
|
-
[anvil.id]: 2000,
|
|
45
|
-
[garnet.id]: 2000,
|
|
46
|
-
[rhodolite.id]: 2000,
|
|
47
|
-
[redstone.id]: 2000,
|
|
48
|
-
},
|
|
49
|
-
});
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
# This .env file is for demonstration purposes only.
|
|
2
|
-
#
|
|
3
|
-
# This should usually be excluded via .gitignore and the env vars attached to
|
|
4
|
-
# your deployment environment, but we're including this here for ease of local
|
|
5
|
-
# development. Please do not commit changes to this file!
|
|
6
|
-
#
|
|
7
|
-
# Enable debug logs for MUD CLI
|
|
8
|
-
DEBUG=mud:*
|
|
9
|
-
#
|
|
10
|
-
# Anvil default private key
|
|
11
|
-
PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: MIT
|
|
2
|
-
pragma solidity >=0.8.24;
|
|
3
|
-
|
|
4
|
-
import "forge-std/Test.sol";
|
|
5
|
-
import { MudTest } from "@latticexyz/world/test/MudTest.t.sol";
|
|
6
|
-
|
|
7
|
-
contract WorldTest is MudTest {
|
|
8
|
-
function testWorldDeployed() public {
|
|
9
|
-
uint256 codeSize;
|
|
10
|
-
address addr = worldAddress;
|
|
11
|
-
assembly {
|
|
12
|
-
codeSize := extcodesize(addr)
|
|
13
|
-
}
|
|
14
|
-
assertTrue(codeSize > 0);
|
|
15
|
-
}
|
|
16
|
-
}
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import { AccountButton } from "@latticexyz/entrykit/internal";
|
|
2
|
-
import { Direction, Entity } from "./common";
|
|
3
|
-
import mudConfig from "contracts/mud.config";
|
|
4
|
-
import { useMemo } from "react";
|
|
5
|
-
import { GameMap } from "./game/GameMap";
|
|
6
|
-
import { useWorldContract } from "./mud/useWorldContract";
|
|
7
|
-
import { Synced } from "./mud/Synced";
|
|
8
|
-
import { useSync } from "@latticexyz/store-sync/react";
|
|
9
|
-
import { components } from "./mud/recs";
|
|
10
|
-
import { useEntityQuery } from "@latticexyz/react";
|
|
11
|
-
import { Has, getComponentValueStrict } from "@latticexyz/recs";
|
|
12
|
-
import { Address } from "viem";
|
|
13
|
-
|
|
14
|
-
export function App() {
|
|
15
|
-
const playerEntities = useEntityQuery([Has(components.Owner), Has(components.Position)]);
|
|
16
|
-
const players = useMemo(
|
|
17
|
-
() =>
|
|
18
|
-
playerEntities.map((entity) => {
|
|
19
|
-
const owner = getComponentValueStrict(components.Owner, entity);
|
|
20
|
-
const position = getComponentValueStrict(components.Position, entity);
|
|
21
|
-
return {
|
|
22
|
-
entity: entity as Entity,
|
|
23
|
-
owner: owner.owner as Address,
|
|
24
|
-
x: position.x,
|
|
25
|
-
y: position.y,
|
|
26
|
-
};
|
|
27
|
-
}),
|
|
28
|
-
[playerEntities],
|
|
29
|
-
);
|
|
30
|
-
|
|
31
|
-
const sync = useSync();
|
|
32
|
-
const worldContract = useWorldContract();
|
|
33
|
-
|
|
34
|
-
const onMove = useMemo(
|
|
35
|
-
() =>
|
|
36
|
-
sync.data && worldContract
|
|
37
|
-
? async (entity: Entity, direction: Direction) => {
|
|
38
|
-
const tx = await worldContract.write.app__move([entity, mudConfig.enums.Direction.indexOf(direction)]);
|
|
39
|
-
await sync.data.waitForTransaction(tx);
|
|
40
|
-
}
|
|
41
|
-
: undefined,
|
|
42
|
-
[sync.data, worldContract],
|
|
43
|
-
);
|
|
44
|
-
|
|
45
|
-
const onSpawn = useMemo(
|
|
46
|
-
() =>
|
|
47
|
-
sync.data && worldContract
|
|
48
|
-
? async () => {
|
|
49
|
-
const tx = await worldContract.write.app__spawn();
|
|
50
|
-
await sync.data.waitForTransaction(tx);
|
|
51
|
-
}
|
|
52
|
-
: undefined,
|
|
53
|
-
[sync.data, worldContract],
|
|
54
|
-
);
|
|
55
|
-
|
|
56
|
-
return (
|
|
57
|
-
<>
|
|
58
|
-
<div className="fixed inset-0 grid place-items-center p-4">
|
|
59
|
-
<Synced
|
|
60
|
-
fallback={({ message, percentage }) => (
|
|
61
|
-
<div className="tabular-nums">
|
|
62
|
-
{message} ({percentage.toFixed(1)}%)…
|
|
63
|
-
</div>
|
|
64
|
-
)}
|
|
65
|
-
>
|
|
66
|
-
<GameMap players={players} onMove={onMove} onSpawn={onSpawn} />
|
|
67
|
-
</Synced>
|
|
68
|
-
</div>
|
|
69
|
-
<div className="fixed top-2 right-2">
|
|
70
|
-
<AccountButton />
|
|
71
|
-
</div>
|
|
72
|
-
</>
|
|
73
|
-
);
|
|
74
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { WagmiProvider } from "wagmi";
|
|
2
|
-
import { QueryClientProvider, QueryClient } from "@tanstack/react-query";
|
|
3
|
-
import { ReactNode } from "react";
|
|
4
|
-
import { SyncProvider } from "@latticexyz/store-sync/react";
|
|
5
|
-
import { defineConfig, EntryKitProvider } from "@latticexyz/entrykit/internal";
|
|
6
|
-
import { wagmiConfig } from "./wagmiConfig";
|
|
7
|
-
import { chainId, getWorldAddress, startBlock } from "./common";
|
|
8
|
-
import { syncAdapter } from "./mud/recs";
|
|
9
|
-
|
|
10
|
-
const queryClient = new QueryClient();
|
|
11
|
-
|
|
12
|
-
export type Props = {
|
|
13
|
-
children: ReactNode;
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
export function Providers({ children }: Props) {
|
|
17
|
-
const worldAddress = getWorldAddress();
|
|
18
|
-
return (
|
|
19
|
-
<WagmiProvider config={wagmiConfig}>
|
|
20
|
-
<QueryClientProvider client={queryClient}>
|
|
21
|
-
<EntryKitProvider config={defineConfig({ chainId, worldAddress })}>
|
|
22
|
-
<SyncProvider chainId={chainId} address={worldAddress} startBlock={startBlock} adapter={syncAdapter}>
|
|
23
|
-
{children}
|
|
24
|
-
</SyncProvider>
|
|
25
|
-
</EntryKitProvider>
|
|
26
|
-
</QueryClientProvider>
|
|
27
|
-
</WagmiProvider>
|
|
28
|
-
);
|
|
29
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import mudConfig from "contracts/mud.config";
|
|
2
|
-
import { chains } from "./wagmiConfig";
|
|
3
|
-
import { Chain, Hex } from "viem";
|
|
4
|
-
|
|
5
|
-
export const chainId = import.meta.env.CHAIN_ID;
|
|
6
|
-
export const worldAddress = import.meta.env.WORLD_ADDRESS;
|
|
7
|
-
export const startBlock = import.meta.env.START_BLOCK;
|
|
8
|
-
|
|
9
|
-
export const url = new URL(window.location.href);
|
|
10
|
-
|
|
11
|
-
export type Entity = Hex;
|
|
12
|
-
export type Direction = (typeof mudConfig.enums.Direction)[number];
|
|
13
|
-
|
|
14
|
-
export function getWorldAddress() {
|
|
15
|
-
if (!worldAddress) {
|
|
16
|
-
throw new Error("No world address configured. Is the world still deploying?");
|
|
17
|
-
}
|
|
18
|
-
return worldAddress;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export function getChain(): Chain {
|
|
22
|
-
const chain = chains.find((c) => c.id === chainId);
|
|
23
|
-
if (!chain) {
|
|
24
|
-
throw new Error(`No chain configured for chain ID ${chainId}.`);
|
|
25
|
-
}
|
|
26
|
-
return chain;
|
|
27
|
-
}
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
import { serialize, useAccount } from "wagmi";
|
|
2
|
-
import { useKeyboardMovement } from "./useKeyboardMovement";
|
|
3
|
-
import { Address, Hex, hexToBigInt, keccak256 } from "viem";
|
|
4
|
-
import { ArrowDownIcon } from "../ui/icons/ArrowDownIcon";
|
|
5
|
-
import { twMerge } from "tailwind-merge";
|
|
6
|
-
import { Direction, Entity } from "../common";
|
|
7
|
-
import mudConfig from "contracts/mud.config";
|
|
8
|
-
import { AsyncButton } from "../ui/AsyncButton";
|
|
9
|
-
import { useAccountModal } from "@latticexyz/entrykit/internal";
|
|
10
|
-
import { useMemo } from "react";
|
|
11
|
-
|
|
12
|
-
export type Props = {
|
|
13
|
-
readonly players?: {
|
|
14
|
-
readonly entity: Entity;
|
|
15
|
-
readonly owner: Address;
|
|
16
|
-
readonly x: number;
|
|
17
|
-
readonly y: number;
|
|
18
|
-
}[];
|
|
19
|
-
readonly onMove?: (entity: Entity, direction: Direction) => Promise<void>;
|
|
20
|
-
readonly onSpawn?: () => Promise<void>;
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
const size = 40;
|
|
24
|
-
const scale = 100 / size;
|
|
25
|
-
|
|
26
|
-
function getColorAngle(seed: Hex) {
|
|
27
|
-
return Number(hexToBigInt(keccak256(seed)) % 360n);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
const rotateClassName = {
|
|
31
|
-
North: "rotate-0",
|
|
32
|
-
East: "rotate-90",
|
|
33
|
-
South: "rotate-180",
|
|
34
|
-
West: "-rotate-90",
|
|
35
|
-
} as const satisfies Record<Direction, `${"" | "-"}rotate-${number}`>;
|
|
36
|
-
|
|
37
|
-
export function GameMap({ players = [], onMove, onSpawn }: Props) {
|
|
38
|
-
const { openAccountModal } = useAccountModal();
|
|
39
|
-
const { address: userAddress } = useAccount();
|
|
40
|
-
|
|
41
|
-
const currentPlayer = players.find((player) => player.owner.toLowerCase() === userAddress?.toLowerCase());
|
|
42
|
-
|
|
43
|
-
useKeyboardMovement(
|
|
44
|
-
useMemo(
|
|
45
|
-
() => (onMove && currentPlayer ? (direction: Direction) => onMove(currentPlayer.entity, direction) : undefined),
|
|
46
|
-
[currentPlayer, onMove],
|
|
47
|
-
),
|
|
48
|
-
);
|
|
49
|
-
|
|
50
|
-
return (
|
|
51
|
-
<div className="aspect-square w-full max-w-[40rem]">
|
|
52
|
-
<div className="relative w-full h-full border-8 border-black/10">
|
|
53
|
-
{currentPlayer && onMove
|
|
54
|
-
? mudConfig.enums.Direction.map((direction) => (
|
|
55
|
-
<button
|
|
56
|
-
key={direction}
|
|
57
|
-
title={`Move ${direction.toLowerCase()}`}
|
|
58
|
-
className={twMerge(
|
|
59
|
-
"outline-0 absolute inset-0 cursor-pointer grid p-4",
|
|
60
|
-
rotateClassName[direction],
|
|
61
|
-
"transition bg-gradient-to-t from-transparent via-transparent to-blue-50 text-blue-400 opacity-0 hover:opacity-40 active:opacity-100",
|
|
62
|
-
)}
|
|
63
|
-
style={{ clipPath: "polygon(0% 0%, 100% 0%, 50% 50%)" }}
|
|
64
|
-
onClick={() => onMove(currentPlayer.entity, direction)}
|
|
65
|
-
>
|
|
66
|
-
<ArrowDownIcon className="rotate-180 text-4xl self-start justify-self-center" />
|
|
67
|
-
</button>
|
|
68
|
-
))
|
|
69
|
-
: null}
|
|
70
|
-
|
|
71
|
-
{players.map((player) => (
|
|
72
|
-
<div
|
|
73
|
-
key={player.entity}
|
|
74
|
-
className="absolute bg-current"
|
|
75
|
-
style={{
|
|
76
|
-
color: `hwb(${getColorAngle(player.owner)} 40% 20%)`,
|
|
77
|
-
width: `${scale}%`,
|
|
78
|
-
height: `${scale}%`,
|
|
79
|
-
left: `${((((player.x + size / 2) % size) + size) % size) * scale}%`,
|
|
80
|
-
top: `${((size - ((player.y + size / 2) % size)) % size) * scale}%`,
|
|
81
|
-
}}
|
|
82
|
-
title={serialize(player, null, 2)}
|
|
83
|
-
>
|
|
84
|
-
{player === currentPlayer ? <div className="w-full h-full bg-current animate-ping opacity-50" /> : null}
|
|
85
|
-
</div>
|
|
86
|
-
))}
|
|
87
|
-
|
|
88
|
-
{!currentPlayer ? (
|
|
89
|
-
onSpawn ? (
|
|
90
|
-
<div className="absolute inset-0 grid place-items-center">
|
|
91
|
-
<AsyncButton
|
|
92
|
-
className="group outline-0 p-4 border-4 border-green-400 transition ring-green-300 hover:ring-4 active:scale-95 rounded-lg text-lg font-medium aria-busy:pointer-events-none aria-busy:animate-pulse"
|
|
93
|
-
onClick={() => onSpawn()}
|
|
94
|
-
>
|
|
95
|
-
Spawn<span className="hidden group-aria-busy:inline">ing…</span>
|
|
96
|
-
</AsyncButton>
|
|
97
|
-
</div>
|
|
98
|
-
) : (
|
|
99
|
-
<div className="absolute inset-0 grid place-items-center">
|
|
100
|
-
<button
|
|
101
|
-
className="group outline-0 p-4 border-4 border-green-400 transition ring-green-300 hover:ring-4 active:scale-95 rounded-lg text-lg font-medium aria-busy:pointer-events-none aria-busy:animate-pulse"
|
|
102
|
-
onClick={openAccountModal}
|
|
103
|
-
>
|
|
104
|
-
Sign in to play
|
|
105
|
-
</button>
|
|
106
|
-
</div>
|
|
107
|
-
)
|
|
108
|
-
) : null}
|
|
109
|
-
</div>
|
|
110
|
-
</div>
|
|
111
|
-
);
|
|
112
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { ReactNode } from "react";
|
|
2
|
-
import { useSyncStatus } from "./useSyncStatus";
|
|
3
|
-
import { ComponentValue } from "@latticexyz/recs";
|
|
4
|
-
import { components } from "./recs";
|
|
5
|
-
|
|
6
|
-
export type Props = {
|
|
7
|
-
children: ReactNode;
|
|
8
|
-
fallback?: (props: ComponentValue<(typeof components)["SyncProgress"]["schema"]>) => ReactNode;
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
export function Synced({ children, fallback }: Props) {
|
|
12
|
-
const status = useSyncStatus();
|
|
13
|
-
return status.isLive ? children : fallback?.(status);
|
|
14
|
-
}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { createWorld } from "@latticexyz/recs";
|
|
2
|
-
import { createSyncAdapter } from "@latticexyz/store-sync/recs";
|
|
3
|
-
import config from "contracts/mud.config";
|
|
4
|
-
|
|
5
|
-
export const world = createWorld();
|
|
6
|
-
export const { syncAdapter, components } = createSyncAdapter({ world, config });
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { initialProgress } from "@latticexyz/store-sync/internal";
|
|
2
|
-
import { SyncStep } from "@latticexyz/store-sync";
|
|
3
|
-
import { useMemo } from "react";
|
|
4
|
-
import { useComponentValue } from "@latticexyz/react";
|
|
5
|
-
import { singletonEntity } from "@latticexyz/store-sync/recs";
|
|
6
|
-
import { components } from "./recs";
|
|
7
|
-
|
|
8
|
-
export function useSyncStatus() {
|
|
9
|
-
const progress = useComponentValue(components.SyncProgress, singletonEntity, initialProgress);
|
|
10
|
-
return useMemo(
|
|
11
|
-
() => ({
|
|
12
|
-
...progress,
|
|
13
|
-
isLive: progress.step === SyncStep.LIVE,
|
|
14
|
-
}),
|
|
15
|
-
[progress],
|
|
16
|
-
);
|
|
17
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { defineWorld } from "@latticexyz/world";
|
|
2
|
-
|
|
3
|
-
export default defineWorld({
|
|
4
|
-
namespace: "app",
|
|
5
|
-
userTypes: {
|
|
6
|
-
Entity: { type: "bytes32", filePath: "./src/Entity.sol" },
|
|
7
|
-
},
|
|
8
|
-
enums: {
|
|
9
|
-
Direction: ["North", "East", "South", "West"],
|
|
10
|
-
},
|
|
11
|
-
tables: {
|
|
12
|
-
// singletons
|
|
13
|
-
EntityCount: { schema: { count: "uint256" }, key: [] },
|
|
14
|
-
// components
|
|
15
|
-
Owner: { id: "Entity", owner: "address" },
|
|
16
|
-
Position: { id: "Entity", x: "int32", y: "int32" },
|
|
17
|
-
},
|
|
18
|
-
modules: [
|
|
19
|
-
{
|
|
20
|
-
artifactPath:
|
|
21
|
-
"@latticexyz/world-modules/out/Unstable_CallWithSignatureModule.sol/Unstable_CallWithSignatureModule.json",
|
|
22
|
-
root: true,
|
|
23
|
-
},
|
|
24
|
-
],
|
|
25
|
-
});
|