evomeme 0.1.9 → 0.1.10-beta.13

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.
Files changed (477) hide show
  1. package/README.md +2 -0
  2. package/dist/canvas-public/app.js +509 -5999
  3. package/dist/canvas-public/assets/presets/catalog.json +47 -0
  4. package/dist/canvas-public/assets/presets/tiles/A_01_CaoDi.png +0 -0
  5. package/dist/canvas-public/assets/presets/tiles/A_02_ShaMo.png +0 -0
  6. package/dist/canvas-public/assets/presets/tiles/A_03_TianKong.png +0 -0
  7. package/dist/canvas-public/assets/presets/tiles/A_04_ShuiBo.png +0 -0
  8. package/dist/canvas-public/assets/presets/tiles/A_05_HaiMian.png +0 -0
  9. package/dist/canvas-public/assets/presets/tiles/A_06_MuDiBan.png +0 -0
  10. package/dist/canvas-public/assets/presets/tiles/A_07_ShiZhuan.png +0 -0
  11. package/dist/canvas-public/assets/presets/tiles/A_08_AnRongYan.png +0 -0
  12. package/dist/canvas-public/assets/presets/tiles/A_09_QingTaiShi.png +0 -0
  13. package/dist/canvas-public/assets/presets/tiles/A_10_ShenHai.png +0 -0
  14. package/dist/canvas-public/assets/presets/tiles/A_11_HuiYanShi.png +0 -0
  15. package/dist/canvas-public/assets/presets/tiles/A_12_HongTu.png +0 -0
  16. package/dist/canvas-public/assets/presets/tiles/A_13_GengDi.png +0 -0
  17. package/dist/canvas-public/assets/presets/tiles/A_14_HuoShanYan.png +0 -0
  18. package/dist/canvas-public/assets/presets/tiles/A_15_NiTu.png +0 -0
  19. package/dist/canvas-public/assets/presets/tiles/A_16_HuangSha.png +0 -0
  20. package/dist/canvas-public/assets/presets/tiles/A_17_CongLin.png +0 -0
  21. package/dist/canvas-public/assets/presets/tiles/A_18_ZiYanShi.png +0 -0
  22. package/dist/canvas-public/assets/presets/tiles/A_19_MoGuTu.png +0 -0
  23. package/dist/canvas-public/assets/presets/tiles/A_20_HuaDian.png +0 -0
  24. package/dist/canvas-public/assets/presets/tiles/A_21_HaiLang.png +0 -0
  25. package/dist/canvas-public/assets/presets/tiles/A_22_GanTu.png +0 -0
  26. package/dist/canvas-public/assets/presets/tiles/A_23_QingTaiShiBan.png +0 -0
  27. package/dist/canvas-public/assets/presets/tiles/A_24_XingKong.png +0 -0
  28. package/dist/canvas-public/assets/presets/tiles/A_25_MoFaFuWen.png +0 -0
  29. package/dist/canvas-public/assets/presets/tiles/A_26_ShiTuYeDi.png +0 -0
  30. package/dist/canvas-public/assets/presets/tiles/A_27_LanZhuan.png +0 -0
  31. package/dist/canvas-public/assets/presets/tiles/A_28_HongZhuan.png +0 -0
  32. package/dist/canvas-public/assets/presets/tiles/A_29_YueQiu.png +0 -0
  33. package/dist/canvas-public/assets/presets/tiles/A_30_JinShuGe.png +0 -0
  34. package/dist/canvas-public/assets/presets/tiles/A_31_JinShuJingGai.png +0 -0
  35. package/dist/canvas-public/assets/presets/tiles/A_32_ShuZiChuang.png +0 -0
  36. package/dist/canvas-public/canvas/actions.js +144 -0
  37. package/dist/canvas-public/canvas/camera.js +28 -0
  38. package/dist/canvas-public/canvas/chrome.js +14 -0
  39. package/dist/canvas-public/canvas/data.js +123 -0
  40. package/dist/canvas-public/canvas/dependencies.js +19 -0
  41. package/dist/canvas-public/canvas/interactions.js +544 -0
  42. package/dist/canvas-public/canvas/panel-resize.js +5 -0
  43. package/dist/canvas-public/canvas/renderer.js +297 -0
  44. package/dist/canvas-public/canvas/selection.js +62 -0
  45. package/dist/canvas-public/canvas/serialization.js +118 -0
  46. package/dist/canvas-public/canvas/sync.js +202 -0
  47. package/dist/canvas-public/core/api.js +32 -0
  48. package/dist/canvas-public/core/feature-registry.js +29 -0
  49. package/dist/canvas-public/core/feature-state.js +228 -0
  50. package/dist/canvas-public/core/layout.js +133 -0
  51. package/dist/canvas-public/core/operations.js +38 -0
  52. package/dist/canvas-public/core/project.js +203 -0
  53. package/dist/canvas-public/core/state.js +27 -0
  54. package/dist/canvas-public/dialogs/context-menu.js +118 -0
  55. package/dist/canvas-public/elements/base.js +100 -0
  56. package/dist/canvas-public/elements/connections.js +105 -0
  57. package/dist/canvas-public/elements/drag.js +53 -0
  58. package/dist/canvas-public/elements/image.js +259 -0
  59. package/dist/canvas-public/elements/loading-recovery.js +5 -0
  60. package/dist/canvas-public/elements/loading.js +21 -0
  61. package/dist/canvas-public/elements/map.js +64 -0
  62. package/dist/canvas-public/elements/registry.js +58 -0
  63. package/dist/canvas-public/elements/replacement.js +78 -0
  64. package/dist/canvas-public/elements/resize.js +210 -0
  65. package/dist/canvas-public/elements/task-pipeline.js +235 -0
  66. package/dist/canvas-public/elements/types.js +21 -0
  67. package/dist/canvas-public/elements/ui.js +14 -0
  68. package/dist/canvas-public/elements/video.js +64 -0
  69. package/dist/canvas-public/features/assets/local-assets.js +72 -0
  70. package/dist/canvas-public/features/assets/official-assets.js +539 -0
  71. package/dist/canvas-public/features/editing/canvas-size.js +532 -0
  72. package/dist/canvas-public/features/editing/color-key.js +471 -0
  73. package/dist/canvas-public/features/editing/cutout.js +20 -0
  74. package/dist/canvas-public/features/editing/interactive-image-editing.js +982 -0
  75. package/dist/canvas-public/features/editing/layer-decomposition.js +45 -0
  76. package/dist/canvas-public/features/editing/manual-split.js +115 -0
  77. package/dist/canvas-public/features/editing/perfect-pixel.js +299 -0
  78. package/dist/canvas-public/features/editing/scroll-preview.js +130 -0
  79. package/dist/canvas-public/features/editing/scroll-seam-elimination.js +71 -0
  80. package/dist/canvas-public/features/editing/seam-elimination.js +46 -0
  81. package/dist/canvas-public/features/editing/smart-split.js +49 -0
  82. package/dist/canvas-public/features/editing/source-preview.js +43 -0
  83. package/dist/canvas-public/features/editing/video-cycle.js +49 -0
  84. package/dist/canvas-public/features/editing/video-frames.js +35 -0
  85. package/dist/canvas-public/features/frame-editor/frame-editing.js +755 -0
  86. package/dist/canvas-public/features/frame-editor/frame-model.js +63 -0
  87. package/dist/canvas-public/features/frame-editor/playback.js +83 -0
  88. package/dist/canvas-public/features/frame-editor/preview.js +151 -0
  89. package/dist/canvas-public/features/generation/animation.js +272 -0
  90. package/dist/canvas-public/features/generation/asset-batch.js +102 -0
  91. package/dist/canvas-public/features/generation/direction.js +163 -0
  92. package/dist/canvas-public/features/generation/fields.js +73 -0
  93. package/dist/canvas-public/features/generation/game-ui.js +64 -0
  94. package/dist/canvas-public/features/generation/image.js +96 -0
  95. package/dist/canvas-public/features/generation/scroll-image.js +157 -0
  96. package/dist/canvas-public/features/generation/seamless-tile.js +52 -0
  97. package/dist/canvas-public/features/generation/tile-transition-atlas.js +79 -0
  98. package/dist/canvas-public/features/generation/video.js +105 -0
  99. package/dist/canvas-public/features/map/creation.js +73 -0
  100. package/dist/canvas-public/features/map/tile-map-editor.js +2520 -0
  101. package/dist/canvas-public/features/registry.js +59 -0
  102. package/dist/canvas-public/index.html +84 -259
  103. package/dist/canvas-public/inspector/controls.js +49 -0
  104. package/dist/canvas-public/inspector/frame-preview.js +11 -0
  105. package/dist/canvas-public/inspector/inspector.js +190 -0
  106. package/dist/canvas-public/inspector/media-inspector.js +517 -0
  107. package/dist/canvas-public/inspector/media-preview.js +56 -0
  108. package/dist/canvas-public/inspector/number-stepper.js +96 -0
  109. package/dist/canvas-public/inspector/resize.js +88 -0
  110. package/dist/canvas-public/inspector/scroll-preview.js +11 -0
  111. package/dist/canvas-public/inspector/ui-inspector.js +14 -0
  112. package/dist/canvas-public/language/en-US.js +1059 -0
  113. package/dist/canvas-public/language/index.js +91 -0
  114. package/dist/canvas-public/language/zh-CN.js +1059 -0
  115. package/dist/canvas-public/map/export.js +10 -0
  116. package/dist/canvas-public/map/inspector.js +8 -0
  117. package/dist/canvas-public/map/model.js +409 -0
  118. package/dist/canvas-public/map/tile-map-editor.js +2 -0
  119. package/dist/canvas-public/media/metadata.js +183 -0
  120. package/dist/canvas-public/media/support.js +183 -0
  121. package/dist/canvas-public/styles/base.css +49 -0
  122. package/dist/canvas-public/styles/canvas.css +127 -0
  123. package/dist/canvas-public/styles/controls.css +203 -0
  124. package/dist/canvas-public/styles/dialogs.css +521 -0
  125. package/dist/canvas-public/styles/feature-form.css +409 -0
  126. package/dist/canvas-public/styles/inspector.css +441 -0
  127. package/dist/canvas-public/styles/layout.css +344 -0
  128. package/dist/canvas-public/styles/map.css +11 -0
  129. package/dist/canvas-public/styles/nodes.css +636 -0
  130. package/dist/canvas-public/styles.css +9 -2247
  131. package/dist/canvas-public/ui/controls.js +222 -0
  132. package/dist/canvas-public/ui/elements.js +9 -0
  133. package/dist/canvas-public/ui/feature-controller.js +296 -0
  134. package/dist/canvas-public/ui/feature-form.js +402 -0
  135. package/dist/canvas-public/ui/settings.js +84 -0
  136. package/dist/canvas-public/ui/toolbar.js +55 -0
  137. package/dist/canvas-public/vendor/pixi-tilemap.js +126 -0
  138. package/dist/canvas-public/vendor/pixi.min.js +2340 -0
  139. package/dist/canvas-public/workers/color-key-worker.js +289 -0
  140. package/dist/image-workers/perfect-pixel/perfect-pixel-core.js +441 -0
  141. package/dist/image-workers/perfect-pixel/perfect-pixel-worker.cjs +10 -0
  142. package/dist/index.js +46710 -12400
  143. package/dist/skills/en-US/evomeme-canvas/SKILL.md +52 -0
  144. package/dist/skills/en-US/evomeme-canvas/agents/openai.yaml +7 -0
  145. package/dist/skills/en-US/evomeme-cloud-fs/SKILL.md +203 -0
  146. package/dist/skills/en-US/evomeme-cloud-fs/agents/openai.yaml +7 -0
  147. package/dist/skills/en-US/evomeme-cover/SKILL.md +131 -0
  148. package/dist/skills/en-US/evomeme-cover/agents/openai.yaml +7 -0
  149. package/dist/skills/en-US/evomeme-game-maker/SKILL.md +288 -0
  150. package/dist/skills/en-US/evomeme-game-maker/agents/openai.yaml +4 -0
  151. package/dist/skills/en-US/evomeme-login/SKILL.md +97 -0
  152. package/dist/skills/en-US/evomeme-login/agents/openai.yaml +7 -0
  153. package/dist/skills/en-US/evomeme-mcp/SKILL.md +71 -0
  154. package/dist/skills/en-US/evomeme-mcp/agents/openai.yaml +7 -0
  155. package/dist/skills/en-US/evomeme-mcp/references/troubleshooting.md +55 -0
  156. package/dist/skills/en-US/evomeme-native-bridge-sdk/SKILL.md +286 -0
  157. package/dist/skills/en-US/evomeme-native-bridge-sdk/agents/openai.yaml +8 -0
  158. package/dist/skills/en-US/evomeme-tos-upload/SKILL.md +47 -0
  159. package/dist/skills/en-US/evomeme-tos-upload/agents/openai.yaml +5 -0
  160. package/dist/skills/en-US/evomeme-ui/SKILL.md +123 -0
  161. package/dist/skills/en-US/evomeme-ui/agents/openai.yaml +4 -0
  162. package/dist/skills/en-US/evomeme-ui/references/host-layout.md +69 -0
  163. package/dist/skills/en-US/game-art/SKILL.md +121 -0
  164. package/dist/skills/en-US/game-art/agents/openai.yaml +8 -0
  165. package/dist/skills/en-US/game-asset-align/SKILL.md +47 -0
  166. package/dist/skills/en-US/game-asset-align/agents/openai.yaml +8 -0
  167. package/dist/skills/en-US/game-asset-align/references/alignment-contract.md +61 -0
  168. package/dist/skills/en-US/game-asset-align/references/blender-scene-pipeline.md +35 -0
  169. package/dist/skills/en-US/game-asset-align/references/canonical-package.md +26 -0
  170. package/dist/skills/en-US/game-asset-align/references/engine-capabilities.md +14 -0
  171. package/dist/skills/en-US/game-asset-align/references/lightweight-review.md +34 -0
  172. package/dist/skills/en-US/game-asset-align/references/repair-policy.md +30 -0
  173. package/dist/skills/en-US/game-asset-align/references/tool-contract.md +69 -0
  174. package/dist/skills/en-US/game-asset-align/references/visual-review.md +26 -0
  175. package/dist/skills/en-US/game-asset-batch-generator/SKILL.md +117 -0
  176. package/dist/skills/en-US/game-asset-batch-generator/agents/openai.yaml +7 -0
  177. package/dist/skills/en-US/game-asset-image-generator/SKILL.md +86 -0
  178. package/dist/skills/en-US/game-asset-image-generator/agents/openai.yaml +7 -0
  179. package/dist/skills/en-US/game-asset-image-generator/references/background.md +34 -0
  180. package/dist/skills/en-US/game-asset-image-generator/references/static-game-assets.md +38 -0
  181. package/dist/skills/en-US/game-asset-mesh-generator/SKILL.md +35 -0
  182. package/dist/skills/en-US/game-asset-mesh-generator/agents/openai.yaml +7 -0
  183. package/dist/skills/en-US/game-asset-mesh-generator/references/animation-presets.md +313 -0
  184. package/dist/skills/en-US/game-asset-mesh-generator/references/generation-contracts.md +131 -0
  185. package/dist/skills/en-US/game-asset-mesh-generator/references/image-generator-workflows.md +65 -0
  186. package/dist/skills/en-US/game-asset-mesh-generator/references/postprocess-contracts.md +187 -0
  187. package/dist/skills/en-US/game-asset-mesh-generator/references/threejs-integration.md +113 -0
  188. package/dist/skills/en-US/game-asset-mesh-generator/references/tool-reference.md +67 -0
  189. package/dist/skills/en-US/game-audio/SKILL.md +121 -0
  190. package/dist/skills/en-US/game-audio/agents/openai.yaml +4 -0
  191. package/{skills → dist/skills/en-US}/game-audio/references/bgm-cdn.md +7 -11
  192. package/{skills → dist/skills/en-US}/game-audio/references/sfx-cdn.md +6 -4
  193. package/dist/skills/en-US/game-character-view-generator/SKILL.md +110 -0
  194. package/dist/skills/en-US/game-character-view-generator/agents/openai.yaml +7 -0
  195. package/dist/skills/en-US/game-demo/SKILL.md +103 -0
  196. package/dist/skills/en-US/game-demo/agents/openai.yaml +7 -0
  197. package/dist/skills/en-US/game-image-layer-decomposer/SKILL.md +99 -0
  198. package/dist/skills/en-US/game-image-layer-decomposer/agents/openai.yaml +7 -0
  199. package/dist/skills/en-US/game-image-splitter/SKILL.md +114 -0
  200. package/dist/skills/en-US/game-image-splitter/agents/openai.yaml +7 -0
  201. package/dist/skills/en-US/game-maker/SKILL.md +111 -0
  202. package/dist/skills/en-US/game-maker/agents/openai.yaml +4 -0
  203. package/dist/skills/en-US/game-perfect-pixel/SKILL.md +123 -0
  204. package/dist/skills/en-US/game-perfect-pixel/agents/openai.yaml +7 -0
  205. package/dist/skills/en-US/game-scroll-generator/SKILL.md +110 -0
  206. package/dist/skills/en-US/game-scroll-generator/agents/openai.yaml +7 -0
  207. package/dist/skills/en-US/game-test/SKILL.md +58 -0
  208. package/dist/skills/en-US/game-test/agents/openai.yaml +7 -0
  209. package/dist/skills/en-US/game-tile-generator/SKILL.md +152 -0
  210. package/dist/skills/en-US/game-tile-generator/agents/openai.yaml +7 -0
  211. package/dist/skills/en-US/game-ui/SKILL.md +177 -0
  212. package/dist/skills/en-US/game-ui/agents/openai.yaml +4 -0
  213. package/dist/skills/en-US/game-ui-generator/SKILL.md +82 -0
  214. package/dist/skills/en-US/game-ui-generator/agents/openai.yaml +7 -0
  215. package/dist/skills/en-US/game-ui-generator/references/component-patterns.md +65 -0
  216. package/dist/skills/en-US/game-ui-generator/references/runtime-integration.md +45 -0
  217. package/dist/skills/en-US/game-video-cycle/SKILL.md +98 -0
  218. package/dist/skills/en-US/game-video-cycle/agents/openai.yaml +7 -0
  219. package/dist/skills/en-US/game-video-generator/SKILL.md +78 -0
  220. package/dist/skills/en-US/game-video-generator/agents/openai.yaml +7 -0
  221. package/dist/skills/en-US/godot-3d-game/SKILL.md +41 -0
  222. package/dist/skills/en-US/godot-3d-game/agents/openai.yaml +8 -0
  223. package/dist/skills/en-US/godot-3d-game/references/alignment-gates.md +26 -0
  224. package/dist/skills/en-US/godot-3d-game/references/appearance-alignment.md +54 -0
  225. package/dist/skills/en-US/godot-3d-game/references/build-and-qa.md +22 -0
  226. package/dist/skills/en-US/godot-3d-game/references/canonical-asset-runtime.md +27 -0
  227. package/dist/skills/en-US/godot-3d-game/references/import-and-wrapper-scenes.md +20 -0
  228. package/dist/skills/en-US/godot-3d-game/references/physics-colliders.md +13 -0
  229. package/dist/skills/en-US/godot-3d-game/references/project-structure.md +22 -0
  230. package/dist/skills/en-US/godot-3d-game/references/skeleton-animation.md +16 -0
  231. package/dist/skills/en-US/phaser-2d-game/SKILL.md +127 -0
  232. package/dist/skills/en-US/phaser-2d-game/agents/openai.yaml +8 -0
  233. package/dist/skills/en-US/phaser-2d-game/references/engine-performance.md +64 -0
  234. package/dist/skills/en-US/phaser-2d-game/references/engine-physics.md +139 -0
  235. package/dist/skills/en-US/phaser-2d-game/references/engine-runtime.md +129 -0
  236. package/dist/skills/en-US/phaser-2d-game/references/engine-spritesheets.md +99 -0
  237. package/dist/skills/en-US/phaser-2d-game/references/engine-tilemaps.md +80 -0
  238. package/dist/skills/en-US/phaser-2d-game/references/file-structure.md +94 -0
  239. package/dist/skills/en-US/phaser-2d-graphics-builder/SKILL.md +68 -0
  240. package/dist/skills/en-US/phaser-2d-graphics-builder/agents/openai.yaml +7 -0
  241. package/dist/skills/en-US/threejs-3d-game/SKILL.md +117 -0
  242. package/dist/skills/en-US/threejs-3d-game/agents/openai.yaml +7 -0
  243. package/dist/skills/en-US/threejs-3d-game/references/engine-asset-pipeline.md +155 -0
  244. package/dist/skills/en-US/threejs-3d-game/references/engine-audio.md +70 -0
  245. package/dist/skills/en-US/threejs-3d-game/references/engine-input-camera.md +84 -0
  246. package/dist/skills/en-US/threejs-3d-game/references/engine-performance.md +96 -0
  247. package/dist/skills/en-US/threejs-3d-game/references/engine-physics.md +142 -0
  248. package/dist/skills/en-US/threejs-3d-game/references/engine-runtime.md +199 -0
  249. package/dist/skills/en-US/threejs-3d-game/references/file-structure.md +353 -0
  250. package/dist/skills/en-US/threejs-aaa-graphics-builder/SKILL.md +62 -0
  251. package/dist/skills/en-US/threejs-aaa-graphics-builder/agents/openai.yaml +7 -0
  252. package/{skills → dist/skills/zh-CN}/evomeme-cloud-fs/SKILL.md +33 -6
  253. package/{skills → dist/skills/zh-CN}/evomeme-cover/SKILL.md +7 -8
  254. package/{skills → dist/skills/zh-CN}/evomeme-game-maker/SKILL.md +91 -88
  255. package/{skills → dist/skills/zh-CN}/evomeme-login/SKILL.md +5 -0
  256. package/dist/skills/zh-CN/evomeme-mcp/SKILL.md +71 -0
  257. package/dist/skills/zh-CN/evomeme-mcp/agents/openai.yaml +7 -0
  258. package/dist/skills/zh-CN/evomeme-mcp/references/troubleshooting.md +55 -0
  259. package/{skills → dist/skills/zh-CN}/evomeme-tos-upload/SKILL.md +6 -5
  260. package/dist/skills/zh-CN/evomeme-ui/SKILL.md +123 -0
  261. package/dist/skills/zh-CN/evomeme-ui/agents/openai.yaml +4 -0
  262. package/dist/skills/zh-CN/evomeme-ui/references/host-layout.md +69 -0
  263. package/dist/skills/zh-CN/game-asset-align/SKILL.md +47 -0
  264. package/dist/skills/zh-CN/game-asset-align/agents/openai.yaml +8 -0
  265. package/dist/skills/zh-CN/game-asset-align/references/alignment-contract.md +61 -0
  266. package/dist/skills/zh-CN/game-asset-align/references/blender-scene-pipeline.md +35 -0
  267. package/dist/skills/zh-CN/game-asset-align/references/canonical-package.md +26 -0
  268. package/dist/skills/zh-CN/game-asset-align/references/engine-capabilities.md +14 -0
  269. package/dist/skills/zh-CN/game-asset-align/references/lightweight-review.md +34 -0
  270. package/dist/skills/zh-CN/game-asset-align/references/repair-policy.md +30 -0
  271. package/dist/skills/zh-CN/game-asset-align/references/tool-contract.md +69 -0
  272. package/dist/skills/zh-CN/game-asset-align/references/visual-review.md +26 -0
  273. package/dist/skills/zh-CN/game-asset-batch-generator/SKILL.md +117 -0
  274. package/dist/skills/zh-CN/game-asset-batch-generator/agents/openai.yaml +7 -0
  275. package/dist/skills/zh-CN/game-asset-image-generator/SKILL.md +86 -0
  276. package/{skills → dist/skills/zh-CN}/game-asset-image-generator/references/background.md +3 -1
  277. package/{skills → dist/skills/zh-CN}/game-asset-image-generator/references/static-game-assets.md +2 -2
  278. package/dist/skills/zh-CN/game-asset-mesh-generator/SKILL.md +35 -0
  279. package/dist/skills/zh-CN/game-asset-mesh-generator/agents/openai.yaml +7 -0
  280. package/dist/skills/zh-CN/game-asset-mesh-generator/references/animation-presets.md +313 -0
  281. package/dist/skills/zh-CN/game-asset-mesh-generator/references/generation-contracts.md +131 -0
  282. package/dist/skills/zh-CN/game-asset-mesh-generator/references/image-generator-workflows.md +65 -0
  283. package/dist/skills/zh-CN/game-asset-mesh-generator/references/postprocess-contracts.md +187 -0
  284. package/dist/skills/zh-CN/game-asset-mesh-generator/references/threejs-integration.md +113 -0
  285. package/dist/skills/zh-CN/game-asset-mesh-generator/references/tool-reference.md +67 -0
  286. package/dist/skills/zh-CN/game-audio/SKILL.md +121 -0
  287. package/dist/skills/zh-CN/game-audio/agents/openai.yaml +4 -0
  288. package/dist/skills/zh-CN/game-audio/references/bgm-cdn.md +123 -0
  289. package/dist/skills/zh-CN/game-audio/references/sfx-cdn.md +79 -0
  290. package/dist/skills/zh-CN/game-character-view-generator/SKILL.md +110 -0
  291. package/dist/skills/zh-CN/game-character-view-generator/agents/openai.yaml +7 -0
  292. package/dist/skills/zh-CN/game-image-layer-decomposer/SKILL.md +99 -0
  293. package/dist/skills/zh-CN/game-image-layer-decomposer/agents/openai.yaml +7 -0
  294. package/dist/skills/zh-CN/game-image-splitter/SKILL.md +114 -0
  295. package/dist/skills/zh-CN/game-image-splitter/agents/openai.yaml +7 -0
  296. package/dist/skills/zh-CN/game-perfect-pixel/SKILL.md +123 -0
  297. package/dist/skills/zh-CN/game-perfect-pixel/agents/openai.yaml +7 -0
  298. package/dist/skills/zh-CN/game-scroll-generator/SKILL.md +110 -0
  299. package/dist/skills/zh-CN/game-scroll-generator/agents/openai.yaml +7 -0
  300. package/dist/skills/zh-CN/game-test/references/checklists/playtest-qa.md +12 -0
  301. package/dist/skills/zh-CN/game-tile-generator/SKILL.md +151 -0
  302. package/dist/skills/zh-CN/game-tile-generator/agents/openai.yaml +7 -0
  303. package/{skills → dist/skills/zh-CN}/game-ui/SKILL.md +9 -1
  304. package/dist/skills/zh-CN/game-ui/references/checklists/game-ui-quality.md +14 -0
  305. package/dist/skills/zh-CN/game-ui/references/checklists/hud-readability.md +12 -0
  306. package/dist/skills/zh-CN/game-ui/references/checklists/mobile-input.md +12 -0
  307. package/dist/skills/zh-CN/game-ui/references/checklists/responsive-ui-fit.md +12 -0
  308. package/dist/skills/zh-CN/game-ui/references/ui-patterns.md +140 -0
  309. package/dist/skills/zh-CN/game-ui/references/ui-prompt-templates.md +63 -0
  310. package/dist/skills/zh-CN/game-ui-generator/SKILL.md +82 -0
  311. package/dist/skills/zh-CN/game-ui-generator/agents/openai.yaml +7 -0
  312. package/dist/skills/zh-CN/game-ui-generator/references/component-patterns.md +65 -0
  313. package/dist/skills/zh-CN/game-ui-generator/references/runtime-integration.md +45 -0
  314. package/dist/skills/zh-CN/game-video-cycle/SKILL.md +98 -0
  315. package/dist/skills/zh-CN/game-video-cycle/agents/openai.yaml +7 -0
  316. package/dist/skills/zh-CN/game-video-generator/SKILL.md +78 -0
  317. package/dist/skills/zh-CN/game-video-generator/agents/openai.yaml +7 -0
  318. package/dist/skills/zh-CN/godot-3d-game/SKILL.md +41 -0
  319. package/dist/skills/zh-CN/godot-3d-game/agents/openai.yaml +8 -0
  320. package/dist/skills/zh-CN/godot-3d-game/references/alignment-gates.md +26 -0
  321. package/dist/skills/zh-CN/godot-3d-game/references/appearance-alignment.md +54 -0
  322. package/dist/skills/zh-CN/godot-3d-game/references/build-and-qa.md +22 -0
  323. package/dist/skills/zh-CN/godot-3d-game/references/canonical-asset-runtime.md +27 -0
  324. package/dist/skills/zh-CN/godot-3d-game/references/import-and-wrapper-scenes.md +20 -0
  325. package/dist/skills/zh-CN/godot-3d-game/references/physics-colliders.md +13 -0
  326. package/dist/skills/zh-CN/godot-3d-game/references/project-structure.md +22 -0
  327. package/dist/skills/zh-CN/godot-3d-game/references/skeleton-animation.md +16 -0
  328. package/dist/skills/zh-CN/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-1.jpeg +0 -0
  329. package/dist/skills/zh-CN/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-2.jpeg +0 -0
  330. package/dist/skills/zh-CN/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-3.jpg +0 -0
  331. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/checklists/compose-quality.md +10 -0
  332. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/checklists/performance-safe-visual-detail.md +9 -0
  333. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/checklists/premium-game-quality-gate.md +15 -0
  334. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/checklists/sprite-quality.md +10 -0
  335. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/checklists/technical-art-quality.md +9 -0
  336. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/checklists/visual-scorecard.md +9 -0
  337. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/compose-recipes.md +71 -0
  338. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/graphics-prompt-templates.md +33 -0
  339. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/implementation-blueprint.md +82 -0
  340. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/sprite-recipes.md +90 -0
  341. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/technical-art.md +67 -0
  342. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/vfx-recipes.md +67 -0
  343. package/dist/skills/zh-CN/phaser-2d-graphics-builder/references/visual-scorecard.md +129 -0
  344. package/{skills → dist/skills/zh-CN}/threejs-3d-game/SKILL.md +6 -2
  345. package/dist/skills/zh-CN/threejs-3d-game/references/engine-asset-pipeline.md +155 -0
  346. package/{skills → dist/skills/zh-CN}/threejs-aaa-graphics-builder/SKILL.md +6 -6
  347. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-1.jpg +0 -0
  348. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-2.jpg +0 -0
  349. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-3.jpg +0 -0
  350. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/checklists/aaa-game-quality-gate.md +23 -0
  351. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/checklists/aaa-visual-scorecard.md +19 -0
  352. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/checklists/material-lighting-quality.md +14 -0
  353. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/checklists/performance-safe-visual-detail.md +14 -0
  354. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/checklists/procedural-model-quality.md +15 -0
  355. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/checklists/technical-art-quality.md +17 -0
  356. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/graphics-prompt-templates.md +236 -0
  357. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/implementation-blueprint.md +161 -0
  358. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/model-recipes.md +146 -0
  359. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/render-recipes.md +90 -0
  360. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/shader-cookbook.md +292 -0
  361. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/technical-art.md +167 -0
  362. package/dist/skills/zh-CN/threejs-aaa-graphics-builder/references/visual-scorecard.md +147 -0
  363. package/dist/stage-blender/bake_materials.py +102 -0
  364. package/dist/stage-blender/export_scene.py +275 -0
  365. package/dist/stage-blender/preview_camera.py +90 -0
  366. package/dist/stage-blender/repair_mesh.py +112 -0
  367. package/dist/stage-public/app.js +759 -0
  368. package/dist/stage-public/baked/bakePilot.js +44 -0
  369. package/dist/stage-public/baked/bakedScene.js +129 -0
  370. package/dist/stage-public/baked/sceneAppearance.js +225 -0
  371. package/dist/stage-public/baked/sceneCamera.js +45 -0
  372. package/dist/stage-public/comparison-contract.js +28 -0
  373. package/dist/stage-public/delivery.html +4 -0
  374. package/dist/stage-public/delivery.js +17 -0
  375. package/dist/stage-public/godot/appearance.gd +170 -0
  376. package/dist/stage-public/godot/preview.gd +79 -0
  377. package/dist/stage-public/index.html +141 -0
  378. package/dist/stage-public/review-app.js +289 -0
  379. package/dist/stage-public/review-runtime.js +63 -0
  380. package/dist/stage-public/review.css +24 -0
  381. package/dist/stage-public/review.html +47 -0
  382. package/dist/stage-public/scene-runtime.js +212 -0
  383. package/dist/stage-public/sceneContractRuntime.js +235 -0
  384. package/dist/stage-public/styles.css +328 -0
  385. package/dist/stage-public/three-appearance.js +104 -0
  386. package/dist/stage-public/vendor/three170/LICENSE +21 -0
  387. package/dist/stage-public/vendor/three170/build/three.module.js +54571 -0
  388. package/dist/stage-public/vendor/three170/examples/jsm/controls/OrbitControls.js +1523 -0
  389. package/dist/stage-public/vendor/three170/examples/jsm/environments/RoomEnvironment.js +144 -0
  390. package/dist/stage-public/vendor/three170/examples/jsm/libs/fflate.module.js +2672 -0
  391. package/dist/stage-public/vendor/three170/examples/jsm/loaders/EXRLoader.js +2563 -0
  392. package/dist/stage-public/vendor/three170/examples/jsm/loaders/GLTFLoader.js +4727 -0
  393. package/dist/stage-public/vendor/three170/examples/jsm/utils/BufferGeometryUtils.js +1373 -0
  394. package/dist/tile-transition-mask.svg +40 -0
  395. package/package.json +24 -8
  396. package/dist/canvas-public/cycle-detect.js +0 -166
  397. package/dist/canvas-public/smart-split.js +0 -185
  398. package/skills/game-asset-image-generator/SKILL.md +0 -104
  399. package/skills/game-audio/SKILL.md +0 -82
  400. package/skills/game-audio/agents/openai.yaml +0 -4
  401. package/skills/threejs-3d-game/references/engine-asset-pipeline.md +0 -116
  402. /package/{skills → dist/skills/en-US}/game-test/references/checklists/playtest-qa.md +0 -0
  403. /package/{skills → dist/skills/en-US}/game-ui/references/checklists/game-ui-quality.md +0 -0
  404. /package/{skills → dist/skills/en-US}/game-ui/references/checklists/hud-readability.md +0 -0
  405. /package/{skills → dist/skills/en-US}/game-ui/references/checklists/mobile-input.md +0 -0
  406. /package/{skills → dist/skills/en-US}/game-ui/references/checklists/responsive-ui-fit.md +0 -0
  407. /package/{skills → dist/skills/en-US}/game-ui/references/ui-patterns.md +0 -0
  408. /package/{skills → dist/skills/en-US}/game-ui/references/ui-prompt-templates.md +0 -0
  409. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-1.jpeg +0 -0
  410. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-2.jpeg +0 -0
  411. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/assets/scorecard-anchors/scene-3.jpg +0 -0
  412. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/checklists/compose-quality.md +0 -0
  413. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/checklists/performance-safe-visual-detail.md +0 -0
  414. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/checklists/premium-game-quality-gate.md +0 -0
  415. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/checklists/sprite-quality.md +0 -0
  416. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/checklists/technical-art-quality.md +0 -0
  417. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/checklists/visual-scorecard.md +0 -0
  418. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/compose-recipes.md +0 -0
  419. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/graphics-prompt-templates.md +0 -0
  420. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/implementation-blueprint.md +0 -0
  421. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/sprite-recipes.md +0 -0
  422. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/technical-art.md +0 -0
  423. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/vfx-recipes.md +0 -0
  424. /package/{skills → dist/skills/en-US}/phaser-2d-graphics-builder/references/visual-scorecard.md +0 -0
  425. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-1.jpg +0 -0
  426. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-2.jpg +0 -0
  427. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/assets/scorecard-anchors/scene-3.jpg +0 -0
  428. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/checklists/aaa-game-quality-gate.md +0 -0
  429. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/checklists/aaa-visual-scorecard.md +0 -0
  430. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/checklists/material-lighting-quality.md +0 -0
  431. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/checklists/performance-safe-visual-detail.md +0 -0
  432. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/checklists/procedural-model-quality.md +0 -0
  433. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/checklists/technical-art-quality.md +0 -0
  434. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/graphics-prompt-templates.md +0 -0
  435. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/implementation-blueprint.md +0 -0
  436. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/model-recipes.md +0 -0
  437. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/render-recipes.md +0 -0
  438. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/shader-cookbook.md +0 -0
  439. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/technical-art.md +0 -0
  440. /package/{skills → dist/skills/en-US}/threejs-aaa-graphics-builder/references/visual-scorecard.md +0 -0
  441. /package/{skills → dist/skills/zh-CN}/evomeme-canvas/SKILL.md +0 -0
  442. /package/{skills → dist/skills/zh-CN}/evomeme-canvas/agents/openai.yaml +0 -0
  443. /package/{skills → dist/skills/zh-CN}/evomeme-cloud-fs/agents/openai.yaml +0 -0
  444. /package/{skills → dist/skills/zh-CN}/evomeme-cover/agents/openai.yaml +0 -0
  445. /package/{skills → dist/skills/zh-CN}/evomeme-game-maker/agents/openai.yaml +0 -0
  446. /package/{skills → dist/skills/zh-CN}/evomeme-login/agents/openai.yaml +0 -0
  447. /package/{skills → dist/skills/zh-CN}/evomeme-native-bridge-sdk/SKILL.md +0 -0
  448. /package/{skills → dist/skills/zh-CN}/evomeme-native-bridge-sdk/agents/openai.yaml +0 -0
  449. /package/{skills → dist/skills/zh-CN}/evomeme-tos-upload/agents/openai.yaml +0 -0
  450. /package/{skills → dist/skills/zh-CN}/game-art/SKILL.md +0 -0
  451. /package/{skills → dist/skills/zh-CN}/game-art/agents/openai.yaml +0 -0
  452. /package/{skills → dist/skills/zh-CN}/game-asset-image-generator/agents/openai.yaml +0 -0
  453. /package/{skills → dist/skills/zh-CN}/game-demo/SKILL.md +0 -0
  454. /package/{skills → dist/skills/zh-CN}/game-demo/agents/openai.yaml +0 -0
  455. /package/{skills → dist/skills/zh-CN}/game-maker/SKILL.md +0 -0
  456. /package/{skills → dist/skills/zh-CN}/game-maker/agents/openai.yaml +0 -0
  457. /package/{skills → dist/skills/zh-CN}/game-test/SKILL.md +0 -0
  458. /package/{skills → dist/skills/zh-CN}/game-test/agents/openai.yaml +0 -0
  459. /package/{skills → dist/skills/zh-CN}/game-ui/agents/openai.yaml +0 -0
  460. /package/{skills → dist/skills/zh-CN}/phaser-2d-game/SKILL.md +0 -0
  461. /package/{skills → dist/skills/zh-CN}/phaser-2d-game/agents/openai.yaml +0 -0
  462. /package/{skills → dist/skills/zh-CN}/phaser-2d-game/references/engine-performance.md +0 -0
  463. /package/{skills → dist/skills/zh-CN}/phaser-2d-game/references/engine-physics.md +0 -0
  464. /package/{skills → dist/skills/zh-CN}/phaser-2d-game/references/engine-runtime.md +0 -0
  465. /package/{skills → dist/skills/zh-CN}/phaser-2d-game/references/engine-spritesheets.md +0 -0
  466. /package/{skills → dist/skills/zh-CN}/phaser-2d-game/references/engine-tilemaps.md +0 -0
  467. /package/{skills → dist/skills/zh-CN}/phaser-2d-game/references/file-structure.md +0 -0
  468. /package/{skills → dist/skills/zh-CN}/phaser-2d-graphics-builder/SKILL.md +0 -0
  469. /package/{skills → dist/skills/zh-CN}/phaser-2d-graphics-builder/agents/openai.yaml +0 -0
  470. /package/{skills → dist/skills/zh-CN}/threejs-3d-game/agents/openai.yaml +0 -0
  471. /package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/engine-audio.md +0 -0
  472. /package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/engine-input-camera.md +0 -0
  473. /package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/engine-performance.md +0 -0
  474. /package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/engine-physics.md +0 -0
  475. /package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/engine-runtime.md +0 -0
  476. /package/{skills → dist/skills/zh-CN}/threejs-3d-game/references/file-structure.md +0 -0
  477. /package/{skills → dist/skills/zh-CN}/threejs-aaa-graphics-builder/agents/openai.yaml +0 -0
@@ -0,0 +1,7 @@
1
+ interface:
2
+ display_name: "Phaser 2D Graphics Builder"
3
+ short_description: "Comprehensively improve a 2D game's characters, scenes, composition, effects, and overall visual quality"
4
+ default_prompt: "Please use $phaser-2d-graphics-builder to improve this 2D game's overall visual quality, and refine its characters, scene layering, composition, and effects presentation."
5
+
6
+ policy:
7
+ allow_implicit_invocation: false
@@ -0,0 +1,117 @@
1
+ ---
2
+ name: threejs-3d-game
3
+ description: Implement 3D browser games with Three.js, React Three Fiber, TypeScript, and Vite. Use when R3F Canvas, simulation systems, DOM HUD overlays, event-bus bridging, or 3D project file structure is needed.
4
+ ---
5
+
6
+ # Three.js 3D Game Implementation
7
+
8
+ ## Overview
9
+
10
+ This skill is for the concrete implementation phase of 3D browser games.
11
+
12
+ Tech stack: **Three.js + React + R3F + TypeScript + Vite + pnpm**. R3F `<Canvas>` owns the 3D / WebGL world; React DOM (`src/ui`) owns the HUD, menus, and narrative panels. Cross-layer communication goes through the event bus, unified input actions, and serializable simulation state.
13
+
14
+ ## Architecture Principles
15
+
16
+ 1. **Separate R3F and DOM**
17
+ - `<Canvas>` / `game/three` owns scenes, meshes, lights, `AnimationMixer`, and camera orchestration.
18
+ - `src/ui` owns the formal HUD, menus, settings, inventory, quests, and narrative panels.
19
+ - MUST NOT use R3F `<Html>` as a replacement for the formal HUD.
20
+
21
+ 2. **Simulation Before Rendering**
22
+ - Rules, values, win/loss, and saves belong in `game/simulation`, with no Three / React dependencies. (Aligned with the System layer in the 2D skill: the rules source-of-truth layer.)
23
+ - `useFrame` only orchestrates: read input/simulation -> sync `Object3D` -> mixer/camera; it does not write core rules.
24
+
25
+ 3. **Pure Three Modules Must Be Unit-Testable**
26
+ - `game/three/*` MUST NOT import React; scene construction and math helpers can be verified independently.
27
+
28
+ 4. **Stable Asset Keys + Canonical Semantics**
29
+ - All game code references assets through `manifest` / `public/config.json` / canonical packages, and does not hardcode glTF / texture paths in business code.
30
+ - **3D meshes MUST come from** `assets/canonical/<id>/` (or from `evomeme asset sync <id> --target three_js --project "<project>" --workspace "<workspace>" --json` syncing to `public/assets/canonical/<id>/`).
31
+ - After loading, orientation/scale **MUST** be applied according to `asset.json` (see `references/engine-asset-pipeline.md`); hardcoding `rotation.y += Math.PI` inside entities is prohibited.
32
+ - Alignment and preview default to `game-asset-align` + CLI `evomeme stage --asset <id> --target three_js`. Read the [CLI contract](../game-asset-align/references/tool-contract.md): `evomeme` abbreviates `npx -y evomeme@latest` or a local build of the same version; supply `--workspace` and use `--json` for automation. Keep Stage in a persistent session, return its URL at startup, and run subsequent commands in another terminal.
33
+ - **After Blender modeling or modification, Stage MUST be opened first, and the asset may only be imported after the user views and confirms the current Three.js version.** `alignment.ready=true` or `asset align` does not replace user confirmation; do not manually copy or click on behalf of the user to bypass the gate.
34
+
35
+ ## Implementation Guidance
36
+
37
+ - Use `gameBus` (mitt) so React UI emits `command:*`, and the game runtime emits factual events such as `game:*` / `player:*`.
38
+ - Centralize physical input mapping in `game/input`; UI and Canvas only consume unified semantic actions.
39
+ - Put content data (levels, encounters, items) in `game/content`, decoupled from the rendering lifecycle.
40
+ - Centralize audio in `game/audio`, driven by bus events; MUST NOT play in-game SFX with `new Audio()` inside the HUD (see `references/engine-audio.md` for details).
41
+ - Canvas / gl / DPR defaults and R3F loading boundaries are covered in `references/engine-runtime.md`.
42
+
43
+ ## Covered 3D Game Types
44
+
45
+ - Third-person / top-down exploration and lightweight action
46
+ - Endless runners and obstacle dodging
47
+ - Vehicles, pinball, and rigid-body sketches
48
+ - Lightweight shooting or encounter battles
49
+ - Casual gameplay that needs spatial 3D presentation
50
+
51
+ ## Camera and Presentation
52
+
53
+ - Decide the camera model early: follow, orbit, lock-on, over-the-shoulder.
54
+ - Separate camera logic from game rules; shake / FOV changes serve readability.
55
+ - Resources MUST be disposed on StrictMode remount / unmount (geometry, materials, mixer, bus subscriptions).
56
+ - See `references/engine-input-camera.md` for details.
57
+
58
+ ## Engine References (Load As Needed)
59
+
60
+ When writing/modifying 3D runtime code, load references by task in addition to `file-structure.md`; do not pre-read everything at once:
61
+
62
+ | Task | Load |
63
+ | --- | --- |
64
+ | Frame loop, Canvas/gl defaults, dispose, blank screen/double loop, R3F policy, diagnostic hooks | `references/engine-runtime.md` |
65
+ | Input intent, touch stickiness, camera follow / FOV | `references/engine-input-camera.md` |
66
+ | Physics selection, Rapier/fixed step, collision proxies | `references/engine-physics.md` |
67
+ | GLB/FBX import, AnimationMixer, root motion, import performance | `references/engine-asset-pipeline.md` |
68
+ | Stutter, pooling, InstancedMesh, DPR, LOD, hot-path allocation | `references/engine-performance.md` |
69
+ | AudioContext unlock, bus-driven audio playback, mute, restart cleanup | `references/engine-audio.md` |
70
+
71
+ Directory structure and layering are governed by this skill's `file-structure.md`; **do not** create separate directories based on the unrelated `core/entities/systems` scaffold.
72
+
73
+ ## UI Integration
74
+
75
+ - HUDs, command menus, settings, and narrative interfaces use React DOM, overlaid above Canvas (`App` composition).
76
+ - `GameCanvas.tsx` is the WebGL <-> React DOM boundary.
77
+ - Business UI goes in `src/ui`; shared non-business primitives go in `src/components`.
78
+
79
+ ## Scaffolding and Configuration
80
+
81
+ New project entry points: `index.html`, `src/main.tsx`, `public/config.json`. The package manager is **pnpm**. Build artifacts go to `dist/`, which must include `dist/index.html` and `dist/config.json`.
82
+
83
+ Directory layout, layering responsibilities, config schema, and deployment paths use `references/file-structure.md` as the only normative source.
84
+
85
+ ## Common Anti-Patterns
86
+
87
+ - Writing combat/win-loss rules in `useFrame` or `Hud.tsx`
88
+ - Piling formal menus and settings into R3F `<Html>`
89
+ - Importing React hooks / components inside `game/three`
90
+ - HUD directly holding an `Object3D` reference and changing `position` every frame
91
+ - Hardcoding the same glTF / texture path in multiple places
92
+ - Adding an extra `new WebGLRenderer` or a second rAF that competes with R3F's loop
93
+ - Not capping DPR; aggressively creating meshes/audio sources on hot paths
94
+ - Playing in-game SFX with `new Audio()` inside the HUD
95
+ - Replacing this specification with a CRA / Next.js / npm-only scaffold (unless the user explicitly requests it)
96
+
97
+ ## References
98
+
99
+ **Engine (This Skill)**
100
+ - File structure and layering: `references/file-structure.md`
101
+ - Runtime / Canvas / R3F policy: `references/engine-runtime.md`
102
+ - Input and camera: `references/engine-input-camera.md`
103
+ - Physics and collision: `references/engine-physics.md`
104
+ - Asset loading and animation: `references/engine-asset-pipeline.md`
105
+ - Performance: `references/engine-performance.md`
106
+ - Audio runtime: `references/engine-audio.md`
107
+
108
+ **Cross-Skill (Gameplay / Acceptance, Not Engine Implementation Details)**
109
+ - Gameplay workflow: `../game-designer/references/gameplay-workflows.md`
110
+ - Game-feel tuning: `../game-designer/references/game-feel.md`
111
+ - Level design: `../game-designer/references/game-design-level-design.md`
112
+ - Physics selection (design-side comparison): `../game-designer/references/physics-engine-selection.md`
113
+ - Definition of done for new games: `../game-designer/references/checklists/new-game-definition-of-done.md`
114
+ - Art style guide: `../game-art/references/art-styles.md`
115
+ - UI style specification: `../game-ui/references/ui-styles.md`
116
+ - Audio asset generation: `../game-audio/SKILL.md`
117
+ - QA / performance profiling: `../game-test/SKILL.md`
@@ -0,0 +1,7 @@
1
+ interface:
2
+ display_name: "Three.js 3D Game"
3
+ short_description: "Build clearly structured 3D browser games, separating gameplay simulation, scene rendering, and interface"
4
+ default_prompt: "Please use $threejs-3d-game to implement this 3D browser game according to my requirements, while keeping the boundaries between gameplay simulation, 3D scene, and interface clear."
5
+
6
+ policy:
7
+ allow_implicit_invocation: true
@@ -0,0 +1,155 @@
1
+ # Engine: Asset Loading and Animation Pipeline
2
+
3
+ Focuses on **how to safely connect GLB at runtime**, and how to consume **canonical asset packages** (`model.glb` + `asset.json`).
4
+
5
+ Load this file when loading/binding meshes, `AnimationMixer`, root motion, collision proxies, or post-import performance. Paths and config contracts are still governed by `file-structure.md`. For the alignment process, see skill `game-asset-align`.
6
+
7
+ Resolve the `evomeme` launcher through the [CLI contract](../../game-asset-align/references/tool-contract.md) and supply the workspace explicitly. Keep Stage in a persistent foreground session and run sync in another terminal.
8
+
9
+ ## Canonical Package (Mandatory)
10
+
11
+ **After Blender modeling/modification, the Stage board MUST be opened first. Only after the user views it and clicks "confirm current version, allow import" may the next import step proceed.** `evomeme stage --asset <id> --workspace "<workspace>" --target three_js --json`; format checks and `alignment.ready` only indicate technical status and cannot skip confirmation. After changing the model, textures, lights, or display configuration, the old confirmation becomes invalid and it MUST be viewed and confirmed again.
12
+
13
+ Before entering the game, Tripo / code-modeled / Blender / uploaded models MUST be:
14
+
15
+ ```text
16
+ assets/canonical/<asset_id>/model.glb
17
+ assets/canonical/<asset_id>/asset.json
18
+ ```
19
+
20
+ Sync into the Vite project:
21
+
22
+ ```text
23
+ evomeme asset sync <id> --target three_js --project "<project>" --workspace "<workspace>" --json
24
+ -> public/assets/canonical/<asset_id>/
25
+ ```
26
+
27
+ Key fields in `asset.json`: `forward_axis`, `scale_hint_metres`, `yaw/pitch/roll_offset_degrees`, `verified_by`.
28
+ For directional assets (characters/firearms/vehicles), `verified_by` MUST NOT be `unverified`.
29
+
30
+ Runtime convention: **-Z forward, +Y up** (same as Godot). For full scenes, use the synced `src/evomeme-stage/<id>/canonical_loader.js` and call `loadReviewedScene`. It shares scene-runtime.js and three-appearance.js with Stage, reproducing the confirmed PBR, lights, environment, camera, and existing baked display path. The project must use Three.js **0.170.0**; mismatched versions will error and require dependencies to be unified before viewing again.
31
+
32
+ The package includes three.appearance.json (confirmed profile, diagnostics, and file fingerprints), THREE_IMPORT.md, the pinned runtime, and independently viewable three-preview.html. The old applyCanonicalOrientation.ts is only for compatibility with old model code; it is not responsible for full-scene display.
33
+
34
+ ## Output and Loading Preferences
35
+
36
+ | Purpose | Format |
37
+ | --- | --- |
38
+ | Three runtime | Prefer GLB (PBR) + same-directory `asset.json` |
39
+ | Animation exchange | FBX as needed, then import carefully or convert offline to GLB |
40
+ | Printing / AR | STL/3MF, USDZ - not the default for this game runtime |
41
+
42
+ - Use `GLTFLoader` (`three/addons/loaders/GLTFLoader.js`).
43
+ - Runtime URL: `./` relative paths, `/assets/canonical/<id>/model.glb`, or external `http(s)`; arbitrary site-root absolute paths are prohibited (see deployment rules).
44
+ - Put loading in the asset layer / `game/three` helpers; **do not** `load` inside entity per-frame update.
45
+ - Business code references assets through `manifest` / `config` / canonical `asset_id`, and does not hardcode bare URLs.
46
+
47
+ ```ts
48
+ import * as THREE from 'three';
49
+ import { loadReviewedScene } from '../../evomeme-stage/courtyard/canonical_loader.js';
50
+
51
+ // assetBase comes from deployment resource config, points to this scene directory, and ends with /.
52
+ const runtime = await loadReviewedScene({
53
+ renderer, world: scene, camera, assetBase: config.assets.courtyard,
54
+ });
55
+ // Game main loop; the game is responsible for updating camera aspect and renderer size.
56
+ runtime.render(camera, deltaSeconds);
57
+ // When leaving the scene
58
+ runtime.dispose();
59
+ ```
60
+
61
+ A full environment is loaded only once inside one Scene. Props use appearanceEnabled:false to attach to an existing environment. The returned root node already has canonical TRS applied; do not wrap it in compensating rotation or scale again. The return value also includes animations and stats; gameplay, physics, and animation playback are taken over by the game's asset layer. R3F or custom postprocessing must take over the render loop and call runtime.render; merely letting the framework call renderer.render will skip the full scene bake/postprocessing path.
62
+
63
+ ## Wrapping Entities
64
+
65
+ When importing a scene package into game entities, explicitly handle:
66
+
67
+ - **MUST** use `asset.json` to unify scale, pivot, and orientation (outer `Group`)
68
+ - Bounding boxes / logical bounds
69
+ - **Collision proxy separated from visuals**
70
+ - Loading failure placeholder or error state
71
+ - Records: file size, triangle count, material count, texture dimensions, clip names, `verified_by`
72
+
73
+ ## AnimationMixer
74
+
75
+ ```ts
76
+ const mixer = new THREE.AnimationMixer(gltf.scene);
77
+ const action = mixer.clipAction(gltf.animations[0]);
78
+ action.play();
79
+
80
+ // After useFrame / simulation: seconds
81
+ mixer.update(deltaSeconds);
82
+ ```
83
+
84
+ - Map gameplay states to clips: idle / walk-run / jump / attack / hurt / fall / turn, etc.
85
+ - Arcade default: **in-place animation + code-driven displacement**; if root motion is retained, it MUST be intentional.
86
+ - On restart, stop actions and dispose the mixer to avoid stacked playback.
87
+
88
+ ## Root Motion and Imported Animation Notes (Engine Side)
89
+
90
+ If upstream rigging/retargeting pitfalls exist, fix them on the engine side this way:
91
+
92
+ 1. When in-place animation is needed, handle it preferentially **after import**; do not depend on uncontrolled upstream `animate_in_place` behavior.
93
+ 2. When making an animation in-place, change only the top-level root bone position track (common name `Root.position`), and pin only horizontal XZ; **preserve Y** (jumping rise/fall).
94
+ 3. Do not broadly delete Hip/Pelvis or twist tracks: some rigs skin limbs to twist bones, and deleting tracks will collapse limbs.
95
+
96
+ ```ts
97
+ for (const clip of clips) {
98
+ for (const tr of clip.tracks) {
99
+ if (tr.name !== 'Root.position') continue;
100
+ const v = tr.values;
101
+ const x0 = v[0];
102
+ const z0 = v[2];
103
+ for (let i = 0; i < v.length; i += 3) {
104
+ v[i] = x0;
105
+ v[i + 2] = z0;
106
+ }
107
+ }
108
+ }
109
+ ```
110
+
111
+ If batch retargeting produces `NlaTrack` / `NlaTrack.001`: map to preset names by index according to the **request order**, then after loading set `clip.name = 'walk'` and select by name.
112
+
113
+ Log after loading: `gltf.animations.map(c => \`${c.name} ${c.tracks.length} tracks\`)`. Healthy humanoid clips should drive many bones; very few tracks usually mean upstream rigging is broken, so fix rigging first.
114
+
115
+ ### FBX Intake (Common for Humanoid Retargeting)
116
+
117
+ - `FBXLoader` depends on `fflate`; bundlers generally include it automatically.
118
+ - The same take may produce two clips with different `|` path depths: **keep the shallower** one.
119
+ - Select clips with keywords (walk / idle / attack); do not blindly use `animations[0]` unless the pipeline guarantees a single take.
120
+ - FBX is often Phong and darker than GLB PBR; final art alignment can convert offline to GLB.
121
+ - Apart from "pinning horizontal motion on a single root bone", avoid further loader-side animation "fixes" (they easily make things worse).
122
+
123
+ ## Performance Discipline
124
+
125
+ - Browser/mobile: control polygon count and texture dimensions; hero pieces high quality + instanced/procedural supporting elements.
126
+ - Share geometry/material as much as possible when cloning.
127
+ - Dispose loaded resources on scene exit / level change.
128
+ - Record renderer diagnostics before and after import: calls, triangles, geometries, textures, materials, file size.
129
+ - Runtime stutter, pooling, DPR, and LOD are covered in `engine-performance.md`.
130
+
131
+ ## Import Checkup Checklist
132
+
133
+ - [ ] File size and triangle count are acceptable
134
+ - [ ] Mesh / material / texture counts and dimensions
135
+ - [ ] PBR appearance under current lighting
136
+ - [ ] Metric scale and pivot / bounds come from `asset.json`, not guesses
137
+ - [ ] `verified_by` is recorded (directional assets are not unverified)
138
+ - [ ] Collision proxy is separate and visible in debug
139
+ - [ ] Clip names, durations, and root-motion strategy are clear
140
+ - [ ] Failure has a placeholder; success path enters manifest/config/canonical
141
+ - [ ] No leaks on unload and restart
142
+ - [ ] No hardcoded compensating rotation in gameplay code
143
+
144
+ ## Common Fixes
145
+
146
+ | Problem | Handling |
147
+ | --- | --- |
148
+ | Too large/small | Normalize bounds on the outer Group |
149
+ | Wrong orientation | **Change asset.json / return to the board**, do not permanently hard-rotate inside gameplay wrappers |
150
+ | Wrong scale | Write `scale_hint_metres`, then reload |
151
+ | Broken geometry | Edit and re-export from Blender (`evomeme asset repair <id>` supports origin/grounding) -> confirm in Stage again -> sync |
152
+ | Animation foot sliding/drifting away | Keep exported root motion, then pin only XZ as above |
153
+ | Too expensive | Reduce geometry, shrink textures, reduce unique retopology |
154
+ | Material too dark/bright | Color space, tone mapping, ambient light, exposure |
155
+ | Strange collision | Visual mesh does not participate in physics; create a separate proxy |
@@ -0,0 +1,70 @@
1
+ # Engine: Audio Runtime
2
+
3
+ The audio runtime lives in `game/audio` + `gameBus`. Asset generation and music selection go through `../game-audio`; this file only governs **runtime wiring and lifecycle**.
4
+
5
+ Load this file when changing in-game BGM/SFX playback, unlock, mute, or restart cleanup.
6
+
7
+ ## Ownership
8
+
9
+ | Item | Location |
10
+ | --- | --- |
11
+ | Playback / decode / dispose | `game/audio` (`audioManager`, etc.) |
12
+ | Gameplay facts -> sound | `audioHooks` subscribes to `gameBus` (`game:*` / `player:*` / `game:feedback`) |
13
+ | Mute / volume preferences | HUD emits `command:audio-prefs` -> `audioPrefs` applies |
14
+ | URL / toggles | `public/config.json` or `game/assets` manifest |
15
+
16
+ Prohibited:
17
+
18
+ - Playing in-game SFX with `new Audio()` inside HUD / `useFrame`
19
+ - Creating new audio sources or footstep loops every frame
20
+ - Duplicating playback logic across multiple components
21
+
22
+ ## User-Gesture Unlock
23
+
24
+ Browsers require resuming `AudioContext` (or equivalent unlock) after a **user gesture**:
25
+
26
+ - The first "start / continue / tap Canvas" path calls `audioManager.unlock()` (or `context.resume()`)
27
+ - Unlock failure must be visible (logs / diagnostics); do not fail silently
28
+ - Mobile MUST be verified once on a real device or with a simulated gesture
29
+
30
+ ## Event-Driven Hooks (Minimum Set)
31
+
32
+ Play sounds by state, not as random decoration:
33
+
34
+ | Event Class | Examples |
35
+ | --- | --- |
36
+ | UI | Click, pause, retry |
37
+ | Progress | Pickup, score, milestone / combo |
38
+ | Pressure | Hurt, failure, danger approaching |
39
+ | Ability | Dash / accelerate / fire |
40
+ | Ambience | BGM or environment loop (toggleable) |
41
+
42
+ Payloads such as `game:feedback` / `player:movement` use plain data; `game/audio` maps them to concrete clips, and does not write URLs into UI.
43
+
44
+ ## Lifecycle
45
+
46
+ - **Pause / hidden page**: stop or lower in-game BGM; `visibilitychange` MUST NOT stack a second loop
47
+ - **Failure / results / restart**: stop in-game loops and short SFX; remove subscriptions for this run only; return pooled audio sources (if any)
48
+ - **Level change**: unload buffers unique to this level; common UI sounds may remain
49
+ - **Mute / volume**: preferences MUST apply to all groups (BGM / SFX / UI)
50
+
51
+ ## With config
52
+
53
+ `http(s)` URLs for BGM/SFX, default volume, and whether music is enabled go into flat `config.json`; code reads through `getSetting` / manifest keys, and scattered hardcoded paths are prohibited.
54
+
55
+ ## Troubleshooting
56
+
57
+ - File URL, MIME, CORS
58
+ - Whether decode/load rejects are visible
59
+ - Whether `play` is called without ever unlocking
60
+ - Whether SFX is triggered every frame
61
+ - Whether pause/restart causes double BGM
62
+ - Whether mute misses any group
63
+
64
+ ## Engine Anti-Patterns
65
+
66
+ - UI buttons directly call `new Audio(url).play()`
67
+ - Depending on autoplay without unlocking
68
+ - BGM residue / stacked listeners after restart
69
+ - Business code hardcodes audio URLs
70
+ - Writing generation-pipeline details into `game/audio` (generation belongs to the `game-audio` skill)
@@ -0,0 +1,84 @@
1
+ # Engine: Input and Camera
2
+
3
+ Input and camera live in `game/input` + `game/three`. This does not include UI visual design or numerical juice recipes (for game feel, see `game-designer/references/game-feel.md`).
4
+
5
+ Load this file when changing controls, touch stickiness, camera follow, FOV, or pointer lock.
6
+
7
+ ## Input: Intent and Ownership
8
+
9
+ 1. **Collection** (keyboard/mouse / pointer / touch / gamepad) is separated from **simulation**.
10
+ 2. Physical device -> semantic action (such as `move`, `dash`, `confirm`) is centralized in `game/input`.
11
+ 3. `GameCanvas` / DOM HUD only reads the unified input surface; hardcoded keybindings MUST NOT be scattered inside `useFrame`.
12
+ 4. UI buttons enter the runtime through the same action set or `command:*`, and do not duplicate a separate rule set inside buttons.
13
+
14
+ ### Stickiness and Cancellation
15
+
16
+ - MUST handle `pointerup` / `pointercancel` / `blur` / `visibilitychange` to avoid stuck joysticks or dash buttons.
17
+ - Pointer controls use `setPointerCapture`; test environments may not have a real pointerId, so tolerate that.
18
+ - Use `event.code` for keys (layout-independent); do not rely only on `key`.
19
+ - CSS `touch-action` is set intentionally and with controlled scope; avoid full-page scrolling stealing gestures.
20
+ - After failure / pause / restart, restore focus and make restarted controls usable.
21
+
22
+ ### Movement Composition (Desktop + Joystick)
23
+
24
+ Normalize if the sum of the key vector and joystick vector has length > 1 (scaffold pattern):
25
+
26
+ ```ts
27
+ target.copy(keyVector).add(pointerVector);
28
+ if (target.lengthSq() > 1) target.normalize();
29
+ ```
30
+
31
+ When mobile is in scope: the virtual joystick is in DOM (`src/ui`) and writes to the same `move` intent through `game/input`; do not bind another conflicting listener set inside Canvas.
32
+
33
+ ### Input Troubleshooting
34
+
35
+ - Whether focus is on a page that can receive keyboard input
36
+ - Whether listeners are attached to the correct element
37
+ - `touch-action` / viewport meta / safe area
38
+ - Whether DPR makes touch hit areas too small
39
+ - Whether resize updates after rotation
40
+ - Whether desktop keyboard/mouse still works after adding mobile controls
41
+ - Whether UI emits intent instead of directly changing simulation root state
42
+
43
+ ## Camera: Model and Responsibilities
44
+
45
+ Choose one primary model early and write it into the implementation (logic in `game/three`; rules still in simulation):
46
+
47
+ | Model | Applies To |
48
+ | --- | --- |
49
+ | Follow + fixed offset | Runners, top-down action, arcade |
50
+ | Orbit / inspect | Showcases, slower exploration |
51
+ | Target lock | Tactical, lock-on combat |
52
+ | Over-the-shoulder | Lightweight third-person |
53
+
54
+ Rules:
55
+
56
+ - Separate camera from game rules: the camera reads "follow target pose / event pulses" and does not rewrite win/loss state.
57
+ - Shake / FOV kick only serve readability and MUST NOT block the next decision area.
58
+ - Readability: the next decision is visible, the player is sufficiently centered, and threats are not hidden by HUD/camera clipping.
59
+ - Accessibility: avoid excessive shake, flashing, and uncontrollable motion; respect hooks such as `setReducedMotion`.
60
+
61
+ ### Follow Lag (Exponential Smoothing)
62
+
63
+ Common scaffold form (`lag` is the time constant in seconds; it may come from `camera_follow_lag` in `config.json`):
64
+
65
+ ```ts
66
+ const desired = target.clone().add(offset);
67
+ const factor = 1 - Math.exp(-delta / Math.max(0.001, lag));
68
+ camera.position.lerp(desired, factor);
69
+ camera.lookAt(lookTarget);
70
+ ```
71
+
72
+ Tunable axes (change engine parameters, not rules): follow lag, look-ahead, height, distance, FOV, near/far planes, pull-in strategy for collision/occlusion.
73
+
74
+ ### Verify Camera and Controls Together
75
+
76
+ After changing speed or acceleration, MUST retest:
77
+
78
+ - Whether high speed clips through geometry or the camera loses the target
79
+ - Whether turning fights with look-ahead
80
+ - Whether pointer should freeze or unlock when pause/menu opens
81
+
82
+ ## Config Contract
83
+
84
+ Tunable items such as camera lag, FOV, and whether screen shake is enabled go into flat `public/config.json` (see `file-structure.md`); copying magic numbers across multiple camera files is prohibited.
@@ -0,0 +1,96 @@
1
+ # Engine: Performance
2
+
3
+ Load when addressing stutter, frame drops, generation spikes, or low mobile frame rate.
4
+
5
+ Profiling flow and acceptance evidence are in `../game-test`; AAA rendering budgets / LOD art-side guidance is in `../threejs-aaa-graphics-builder/references/technical-art.md`. This file only governs **implementation-time engine constraints**.
6
+
7
+ ## First Things to Prioritize
8
+
9
+ 1. **Object pools**: bullets, pickups, fragments, short-lived VFX carriers - hot paths MUST NOT aggressively `new` / `dispose` meshes
10
+ 2. **Shared resources**: repeated pieces use `InstancedMesh` or shared geometry / material / texture
11
+ 3. **DPR cap**: default cap `2` (see `engine-runtime.md` Canvas config); mobile may go lower
12
+ 4. **Zero allocation on hot paths**: `useFrame` / simulation does not create `{}` / `new Vector3` every frame; reuse temporary vectors
13
+ 5. **Reduce physics cost first**: simple colliders, sleeping, fewer dynamic bodies, narrow sensors; CCD only for bodies that need it (see `engine-physics.md`)
14
+
15
+ ## Rendering Side
16
+
17
+ | Technique | When |
18
+ | --- | --- |
19
+ | `InstancedMesh` | Lane markers, bolts, windows, grass, debris, repeated props |
20
+ | Shared geometry/material | Do not clone each material chain separately when cloning entities |
21
+ | Frustum / distance culling | Far scenery and offscreen dynamic bodies |
22
+ | `LOD` | Background pieces, dense world kits |
23
+ | Shadow reduction | Fewer casters, smaller shadow maps, contact shadows/blob substitutes |
24
+ | Postprocessing throttling | Keep only passes required for readability |
25
+ | Texture discipline | Controlled size, reuse, mipmap; avoid many unique large textures on screen |
26
+
27
+ Optimization order: **check DPR / post / shadow / instancing / culling first**, then reduce visual density; do not start by deleting hero-piece readability.
28
+
29
+ User-facing performance is governed by **production preview** (`pnpm build` + preview); do not use dev server frame rate as evidence.
30
+
31
+ ## Object Pools (3D)
32
+
33
+ ```ts
34
+ // Illustration: the pool holds constructed Object3D + optional physics body handles
35
+ function acquireBullet(): BulletView {
36
+ const b = pool.pop() ?? createBulletView();
37
+ b.root.visible = true;
38
+ // Enable collider / reset transform
39
+ return b;
40
+ }
41
+
42
+ function releaseBullet(b: BulletView): void {
43
+ b.root.visible = false;
44
+ // Stop mixer, disable body, remove listeners; do not dispose shared geometry
45
+ pool.push(b);
46
+ }
47
+ ```
48
+
49
+ On level restart: return all active pooled instances, then clean non-pooled level-specific resources.
50
+
51
+ ## CPU and Throttling
52
+
53
+ - Movement / camera / mixer every frame; AI, pathfinding, and distant cleanup can run at 5-10Hz.
54
+ - Multiple `AnimationMixer` instances update only visible / nearby entities.
55
+ - DOM HUD is pushed by events/store; avoid forcing the whole React tree to rerender every frame.
56
+
57
+ ## Physics Cost (Summary)
58
+
59
+ - Visual mesh != collider; use primitives / compounds.
60
+ - Offscreen or resting bodies can sleep; narrow sensors.
61
+ - Expose body / collider / CCD / sensor counts in diagnostics (see runtime hooks).
62
+
63
+ ## Memory and Level Changes
64
+
65
+ - On level change, dispose: level-unique geometry, materials, textures, render targets, mixers, physics bodies.
66
+ - Common material libraries / shared atlases may remain.
67
+ - Audio resource cleanup is covered in `engine-audio.md`.
68
+
69
+ ## Diagnostic Fields (Implementation Side)
70
+
71
+ Provide as much as possible in `__THREE_GAME_DIAGNOSTICS__`:
72
+
73
+ - `renderer.info`: `render.calls`, `triangles`, `memory.geometries`, `memory.textures`
74
+ - DPR, shadow/postprocessing toggle summary
75
+ - Entity count, pool size, active mixer count
76
+ - Physics (if any): engine, timestep, bodies, colliders, sensors, ccdBodies
77
+
78
+ ## Quick Check Table
79
+
80
+ | Symptom | Common Cause | Handling |
81
+ | --- | --- | --- |
82
+ | Slower over time | Missing dispose / stacked subscriptions | Check restart and pool return |
83
+ | Periodic hitch | GC | Pooling, reduce `useFrame` allocation |
84
+ | Always low frame rate | draw call / triangles / DPR | Instancing, LOD, cap DPR, reduce shadow |
85
+ | Generation spike | Creating meshes on the spot | Pre-pool / preload |
86
+ | Physics stutter | Too many bodies/contacts | Simpler colliders, sleeping, fewer dynamic bodies |
87
+ | Sharp drop after import | Retopology / large textures | Reduce geometry, shrink textures (generation side + import checkup) |
88
+
89
+ ## Engine Anti-Patterns
90
+
91
+ - Cutting art detail before measuring
92
+ - Using dev server FPS as release performance evidence
93
+ - Creating new geometry / material / `Audio` every frame
94
+ - Many unique meshes that could use `InstancedMesh`
95
+ - Detailed imported mesh as collider
96
+ - Not capping DPR on mobile