@playcraft/skills 0.0.2

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 (479) hide show
  1. package/README.md +333 -0
  2. package/dist/src/index.d.ts +3 -0
  3. package/dist/src/index.d.ts.map +1 -0
  4. package/dist/src/index.js +2 -0
  5. package/dist/src/index.js.map +1 -0
  6. package/dist/src/skills.loader.d.ts +31 -0
  7. package/dist/src/skills.loader.d.ts.map +1 -0
  8. package/dist/src/skills.loader.js +200 -0
  9. package/dist/src/skills.loader.js.map +1 -0
  10. package/dist/src/skills.types.d.ts +44 -0
  11. package/dist/src/skills.types.d.ts.map +1 -0
  12. package/dist/src/skills.types.js +9 -0
  13. package/dist/src/skills.types.js.map +1 -0
  14. package/package.json +35 -0
  15. package/skills/2048_core.aigameplay/SKILL.md +123 -0
  16. package/skills/2048_core.aigameplay/manifest.json +159 -0
  17. package/skills/2048_core.aigameplay/ref/pgs-schema.json +194 -0
  18. package/skills/2048_core.aigameplay/ref/reducer.template.ts +189 -0
  19. package/skills/SKILL.md +46 -0
  20. package/skills/ad_compliance_rules.aiconfig/SKILL.md +85 -0
  21. package/skills/ad_compliance_rules.aiconfig/manifest.json +60 -0
  22. package/skills/agent_remix_orchestrator.aicomponent/SKILL.md +257 -0
  23. package/skills/agent_remix_orchestrator.aicomponent/manifest.json +12 -0
  24. package/skills/app_metadata.aiconfig/SKILL.md +53 -0
  25. package/skills/app_metadata.aiconfig/manifest.json +32 -0
  26. package/skills/appear_sfx.aiaudio/SKILL.md +59 -0
  27. package/skills/appear_sfx.aiaudio/manifest.json +45 -0
  28. package/skills/appear_sfx.aiaudio/ref/appear.mp3 +0 -0
  29. package/skills/arrow_move_error_sfx.aiaudio/SKILL.md +59 -0
  30. package/skills/arrow_move_error_sfx.aiaudio/manifest.json +45 -0
  31. package/skills/arrow_move_error_sfx.aiaudio/ref/arrow_move_error.mp3 +0 -0
  32. package/skills/arrow_path_data_format.aicomponent/SKILL.md +152 -0
  33. package/skills/arrow_path_data_format.aicomponent/manifest.json +57 -0
  34. package/skills/arrow_path_data_format.aicomponent/ref/LevelParser.ts +188 -0
  35. package/skills/arrow_path_data_format.aicomponent/ref/LevelTypes.ts +131 -0
  36. package/skills/arrow_pick_match_rules.aigameplay/SKILL.md +117 -0
  37. package/skills/arrow_pick_match_rules.aigameplay/manifest.json +105 -0
  38. package/skills/arrow_pick_match_rules.aigameplay/ref/pgs-schema.json +180 -0
  39. package/skills/asset_pipeline_scripts.aicomponent/SKILL.md +117 -0
  40. package/skills/asset_pipeline_scripts.aicomponent/manifest.json +17 -0
  41. package/skills/asset_pipeline_scripts.aicomponent/ref/gen-sprite.sh +105 -0
  42. package/skills/ball_sort.aigameplay/SKILL.md +109 -0
  43. package/skills/ball_sort.aigameplay/manifest.json +155 -0
  44. package/skills/ball_sort.aigameplay/ref/pgs-schema.json +192 -0
  45. package/skills/ball_sort.aigameplay/ref/reducer.template.ts +156 -0
  46. package/skills/basketball_shot.aigameplay/SKILL.md +94 -0
  47. package/skills/basketball_shot.aigameplay/manifest.json +150 -0
  48. package/skills/basketball_shot.aigameplay/ref/pgs-schema.json +229 -0
  49. package/skills/basketball_shot.aigameplay/ref/reducer.template.ts +189 -0
  50. package/skills/bg_music.aiaudio/SKILL.md +61 -0
  51. package/skills/bg_music.aiaudio/manifest.json +48 -0
  52. package/skills/bg_music.aiaudio/ref/bg.mp3 +0 -0
  53. package/skills/big_watermelon.aigameplay/SKILL.md +94 -0
  54. package/skills/big_watermelon.aigameplay/manifest.json +155 -0
  55. package/skills/big_watermelon.aigameplay/ref/pgs-schema.json +191 -0
  56. package/skills/big_watermelon.aigameplay/ref/reducer.template.ts +202 -0
  57. package/skills/block_puzzle.aigameplay/SKILL.md +121 -0
  58. package/skills/block_puzzle.aigameplay/manifest.json +154 -0
  59. package/skills/block_puzzle.aigameplay/ref/pgs-schema.json +170 -0
  60. package/skills/block_puzzle.aigameplay/ref/reducer.template.ts +182 -0
  61. package/skills/board_entity_sprite.aiimage/SKILL.md +255 -0
  62. package/skills/board_entity_sprite.aiimage/manifest.json +153 -0
  63. package/skills/board_entity_sprite.aiimage/ref/ProceduralCar.ts +357 -0
  64. package/skills/board_entity_sprite.aiimage/ref/car.png +0 -0
  65. package/skills/board_entity_sprite.aiimage/ref/car.webp +0 -0
  66. package/skills/bottom_ui_bar.aicomponent/SKILL.md +50 -0
  67. package/skills/bottom_ui_bar.aicomponent/manifest.json +31 -0
  68. package/skills/bottom_ui_bar.aicomponent/ref/GameBottomUI.ts +27 -0
  69. package/skills/bubble_shooter.aigameplay/SKILL.md +129 -0
  70. package/skills/bubble_shooter.aigameplay/manifest.json +181 -0
  71. package/skills/bubble_shooter.aigameplay/ref/pgs-schema.json +226 -0
  72. package/skills/bubble_shooter.aigameplay/ref/reducer.template.ts +228 -0
  73. package/skills/button_click_sfx.aiaudio/SKILL.md +59 -0
  74. package/skills/button_click_sfx.aiaudio/manifest.json +45 -0
  75. package/skills/button_click_sfx.aiaudio/ref/button_click.mp3 +0 -0
  76. package/skills/calm_piano.aiaudio/SKILL.md +68 -0
  77. package/skills/calm_piano.aiaudio/manifest.json +50 -0
  78. package/skills/camera_controller_3d.aicomponent/SKILL.md +100 -0
  79. package/skills/camera_controller_3d.aicomponent/manifest.json +52 -0
  80. package/skills/camera_controller_3d.aicomponent/ref/CameraController.ts +199 -0
  81. package/skills/camera_controller_3d.aicomponent/ref/OrbitControlsAdapter.ts +152 -0
  82. package/skills/candy_tile.aiimage/SKILL.md +62 -0
  83. package/skills/candy_tile.aiimage/manifest.json +49 -0
  84. package/skills/car_parking.aigameplay/SKILL.md +105 -0
  85. package/skills/car_parking.aigameplay/manifest.json +164 -0
  86. package/skills/car_parking.aigameplay/ref/pgs-schema.json +163 -0
  87. package/skills/car_parking.aigameplay/ref/reducer.template.ts +166 -0
  88. package/skills/castle.aiimage/SKILL.md +64 -0
  89. package/skills/castle.aiimage/manifest.json +48 -0
  90. package/skills/cheerful_ukulele.aiaudio/SKILL.md +72 -0
  91. package/skills/cheerful_ukulele.aiaudio/manifest.json +50 -0
  92. package/skills/click_sfx.aiaudio/SKILL.md +59 -0
  93. package/skills/click_sfx.aiaudio/manifest.json +45 -0
  94. package/skills/click_sfx.aiaudio/ref/click.mp3 +0 -0
  95. package/skills/combo_display.aicomponent/SKILL.md +45 -0
  96. package/skills/combo_display.aicomponent/manifest.json +31 -0
  97. package/skills/combo_display.aicomponent/ref/ComboManager.ts +362 -0
  98. package/skills/combo_display.aicomponent/ref/ComboSmallUI.ts +232 -0
  99. package/skills/combo_praise_text.aicomponent/SKILL.md +56 -0
  100. package/skills/combo_praise_text.aicomponent/manifest.json +34 -0
  101. package/skills/combo_praise_text.aicomponent/ref/ComboManager.ts +362 -0
  102. package/skills/countdown_timer.aicomponent/SKILL.md +44 -0
  103. package/skills/countdown_timer.aicomponent/manifest.json +35 -0
  104. package/skills/countdown_timer.aicomponent/ref/CountdownDisplay.ts +213 -0
  105. package/skills/cta_platform_config.aiconfig/SKILL.md +72 -0
  106. package/skills/cta_platform_config.aiconfig/manifest.json +56 -0
  107. package/skills/debug_overlay.aicomponent/SKILL.md +75 -0
  108. package/skills/debug_overlay.aicomponent/manifest.json +17 -0
  109. package/skills/debug_overlay.aicomponent/ref/DebugOverlay.ts +144 -0
  110. package/skills/desert.aiimage/SKILL.md +63 -0
  111. package/skills/desert.aiimage/manifest.json +49 -0
  112. package/skills/difficulty_curve_designer.aiconfig/SKILL.md +68 -0
  113. package/skills/difficulty_curve_designer.aiconfig/manifest.json +36 -0
  114. package/skills/digit_renderer.aicomponent/SKILL.md +43 -0
  115. package/skills/digit_renderer.aicomponent/manifest.json +25 -0
  116. package/skills/digit_renderer.aicomponent/ref/DigitRenderer.ts +237 -0
  117. package/skills/download_button.aicomponent/SKILL.md +44 -0
  118. package/skills/download_button.aicomponent/manifest.json +25 -0
  119. package/skills/download_button.aicomponent/ref/DownloadButton.ts +137 -0
  120. package/skills/draw_line_puzzle.aigameplay/SKILL.md +84 -0
  121. package/skills/draw_line_puzzle.aigameplay/manifest.json +152 -0
  122. package/skills/draw_line_puzzle.aigameplay/ref/pgs-schema.json +189 -0
  123. package/skills/draw_line_puzzle.aigameplay/ref/reducer.template.ts +194 -0
  124. package/skills/easy_to_hard.aiconfig/SKILL.md +52 -0
  125. package/skills/easy_to_hard.aiconfig/manifest.json +33 -0
  126. package/skills/eight_ball_pool.aigameplay/SKILL.md +104 -0
  127. package/skills/eight_ball_pool.aigameplay/manifest.json +152 -0
  128. package/skills/eight_ball_pool.aigameplay/ref/pgs-schema.json +205 -0
  129. package/skills/eight_ball_pool.aigameplay/ref/reducer.template.ts +198 -0
  130. package/skills/energetic_electronic.aiaudio/SKILL.md +69 -0
  131. package/skills/energetic_electronic.aiaudio/manifest.json +51 -0
  132. package/skills/fail_sfx.aiaudio/SKILL.md +59 -0
  133. package/skills/fail_sfx.aiaudio/manifest.json +44 -0
  134. package/skills/fail_sfx.aiaudio/ref/fail.mp3 +0 -0
  135. package/skills/figer_icon.aiimage/SKILL.md +58 -0
  136. package/skills/figer_icon.aiimage/manifest.json +48 -0
  137. package/skills/figer_icon.aiimage/ref/figer.png +0 -0
  138. package/skills/figer_icon.aiimage/ref/figer.webp +0 -0
  139. package/skills/forest.aiimage/SKILL.md +74 -0
  140. package/skills/forest.aiimage/manifest.json +48 -0
  141. package/skills/fruit_tile.aiimage/SKILL.md +68 -0
  142. package/skills/fruit_tile.aiimage/manifest.json +48 -0
  143. package/skills/game_over_panel.aicomponent/SKILL.md +47 -0
  144. package/skills/game_over_panel.aicomponent/manifest.json +61 -0
  145. package/skills/game_over_panel.aicomponent/ref/GameOverPanel.ts +74 -0
  146. package/skills/game_scene.aicomponent/SKILL.md +57 -0
  147. package/skills/game_scene.aicomponent/manifest.json +36 -0
  148. package/skills/game_scene.aicomponent/ref/Game.ts +748 -0
  149. package/skills/gameplay_balance_check.aivalidator/SKILL.md +69 -0
  150. package/skills/gameplay_balance_check.aivalidator/manifest.json +21 -0
  151. package/skills/gameplay_unit_test.aivalidator/SKILL.md +89 -0
  152. package/skills/gameplay_unit_test.aivalidator/manifest.json +17 -0
  153. package/skills/gameplay_unit_test.aivalidator/ref/gameplay.test.ts +202 -0
  154. package/skills/gameplay_unit_test.aivalidator/ref/vitest.config.ts +13 -0
  155. package/skills/grid_board_layout.aicomponent/SKILL.md +85 -0
  156. package/skills/grid_board_layout.aicomponent/manifest.json +69 -0
  157. package/skills/grid_board_layout.aicomponent/ref/BoardLayout.ts +416 -0
  158. package/skills/grid_board_layout.aicomponent/ref/BoardLayout3D.ts +125 -0
  159. package/skills/grid_board_layout.aicomponent/ref/BoardLayoutMath.ts +85 -0
  160. package/skills/grid_board_layout.aicomponent/ref/BoardRenderer3D.ts +298 -0
  161. package/skills/heart_lives.aicomponent/SKILL.md +42 -0
  162. package/skills/heart_lives.aicomponent/manifest.json +25 -0
  163. package/skills/heart_lives.aicomponent/ref/HeartDisplay.ts +96 -0
  164. package/skills/idle-breathe.aicomponent/SKILL.md +27 -0
  165. package/skills/idle-breathe.aicomponent/manifest.json +20 -0
  166. package/skills/idle-breathe.aicomponent/ref/phaser.js +25 -0
  167. package/skills/idle-breathe.aicomponent/ref/playcanvas.js +29 -0
  168. package/skills/jewel_tile.aiimage/SKILL.md +63 -0
  169. package/skills/jewel_tile.aiimage/manifest.json +49 -0
  170. package/skills/knife_hit.aigameplay/SKILL.md +103 -0
  171. package/skills/knife_hit.aigameplay/manifest.json +151 -0
  172. package/skills/knife_hit.aigameplay/ref/pgs-schema.json +202 -0
  173. package/skills/knife_hit.aigameplay/ref/reducer.template.ts +196 -0
  174. package/skills/left_right_parkour.aigameplay/SKILL.md +120 -0
  175. package/skills/left_right_parkour.aigameplay/manifest.json +165 -0
  176. package/skills/left_right_parkour.aigameplay/ref/pgs-schema.json +200 -0
  177. package/skills/left_right_parkour.aigameplay/ref/reducer.template.ts +194 -0
  178. package/skills/level_data_pack.aiconfig/SKILL.md +64 -0
  179. package/skills/level_data_pack.aiconfig/manifest.json +37 -0
  180. package/skills/level_data_validator.aivalidator/SKILL.md +85 -0
  181. package/skills/level_data_validator.aivalidator/manifest.json +17 -0
  182. package/skills/level_data_validator.aivalidator/ref/LevelValidator.ts +113 -0
  183. package/skills/level_lifecycle.aicomponent/SKILL.md +81 -0
  184. package/skills/level_lifecycle.aicomponent/manifest.json +87 -0
  185. package/skills/level_lifecycle.aicomponent/ref/LevelLifecycle.ts +235 -0
  186. package/skills/level_solvability_validator.aivalidator/SKILL.md +74 -0
  187. package/skills/level_solvability_validator.aivalidator/manifest.json +23 -0
  188. package/skills/level_solvability_validator.aivalidator/ref/LevelValidator.ts +186 -0
  189. package/skills/level_state.aicomponent/SKILL.md +55 -0
  190. package/skills/level_state.aicomponent/manifest.json +34 -0
  191. package/skills/level_state.aicomponent/ref/LevelDataManager.ts +26 -0
  192. package/skills/level_state.aicomponent/ref/LevelManager.ts +26 -0
  193. package/skills/loading_screen.aicomponent/SKILL.md +57 -0
  194. package/skills/loading_screen.aicomponent/manifest.json +43 -0
  195. package/skills/loading_screen.aicomponent/ref/LoadingUI.ts +339 -0
  196. package/skills/lose_result_panel.aiimage/SKILL.md +58 -0
  197. package/skills/lose_result_panel.aiimage/manifest.json +47 -0
  198. package/skills/lose_result_panel.aiimage/ref/lose.png +0 -0
  199. package/skills/lose_result_panel.aiimage/ref/lose.webp +0 -0
  200. package/skills/lose_sfx.aiaudio/SKILL.md +59 -0
  201. package/skills/lose_sfx.aiaudio/manifest.json +45 -0
  202. package/skills/lose_sfx.aiaudio/ref/lose.mp3 +0 -0
  203. package/skills/match-pop.aicomponent/SKILL.md +29 -0
  204. package/skills/match-pop.aicomponent/manifest.json +19 -0
  205. package/skills/match-pop.aicomponent/ref/phaser.js +30 -0
  206. package/skills/match-pop.aicomponent/ref/playcanvas.js +22 -0
  207. package/skills/match3_core.aigameplay/SKILL.md +125 -0
  208. package/skills/match3_core.aigameplay/manifest.json +107 -0
  209. package/skills/match3_core.aigameplay/ref/pgs-schema.json +154 -0
  210. package/skills/match3_core.aigameplay/ref/reducer.template.ts +191 -0
  211. package/skills/match_engine.aicomponent/SKILL.md +84 -0
  212. package/skills/match_engine.aicomponent/manifest.json +23 -0
  213. package/skills/match_engine.aicomponent/ref/MatchEngine.ts +75 -0
  214. package/skills/memory_match.aigameplay/SKILL.md +111 -0
  215. package/skills/memory_match.aigameplay/manifest.json +164 -0
  216. package/skills/memory_match.aigameplay/ref/pgs-schema.json +190 -0
  217. package/skills/memory_match.aigameplay/ref/reducer.template.ts +162 -0
  218. package/skills/merge_core.aigameplay/SKILL.md +112 -0
  219. package/skills/merge_core.aigameplay/manifest.json +154 -0
  220. package/skills/merge_core.aigameplay/ref/pgs-schema.json +202 -0
  221. package/skills/merge_core.aigameplay/ref/reducer.template.ts +179 -0
  222. package/skills/mistake_sfx.aiaudio/SKILL.md +59 -0
  223. package/skills/mistake_sfx.aiaudio/manifest.json +45 -0
  224. package/skills/mistake_sfx.aiaudio/ref/mistake.mp3 +0 -0
  225. package/skills/nomove_hint_overlay.aiimage/SKILL.md +58 -0
  226. package/skills/nomove_hint_overlay.aiimage/manifest.json +48 -0
  227. package/skills/nomove_hint_overlay.aiimage/ref/nomove_hint.png +0 -0
  228. package/skills/nomove_hint_overlay.aiimage/ref/nomove_hint.webp +0 -0
  229. package/skills/normal_dot.aiimage/SKILL.md +58 -0
  230. package/skills/normal_dot.aiimage/manifest.json +46 -0
  231. package/skills/normal_dot.aiimage/ref/normal_dot.png +0 -0
  232. package/skills/normal_dot.aiimage/ref/normal_dot.webp +0 -0
  233. package/skills/ocean.aiimage/SKILL.md +71 -0
  234. package/skills/ocean.aiimage/manifest.json +49 -0
  235. package/skills/particle-confetti.aicomponent/SKILL.md +32 -0
  236. package/skills/particle-confetti.aicomponent/manifest.json +21 -0
  237. package/skills/particle-confetti.aicomponent/ref/html5-spritesheet.js +17 -0
  238. package/skills/particle-confetti.aicomponent/ref/phaser.js +38 -0
  239. package/skills/particle-explosion.aicomponent/SKILL.md +37 -0
  240. package/skills/particle-explosion.aicomponent/manifest.json +24 -0
  241. package/skills/particle-explosion.aicomponent/ref/html5-spritesheet.js +40 -0
  242. package/skills/particle-explosion.aicomponent/ref/phaser.js +46 -0
  243. package/skills/particle-explosion.aicomponent/ref/playcanvas.js +33 -0
  244. package/skills/particle-trail.aicomponent/SKILL.md +25 -0
  245. package/skills/particle-trail.aicomponent/manifest.json +22 -0
  246. package/skills/particle-trail.aicomponent/ref/phaser.js +31 -0
  247. package/skills/path_animation.aicomponent/SKILL.md +82 -0
  248. package/skills/path_animation.aicomponent/manifest.json +77 -0
  249. package/skills/path_animation.aicomponent/ref/AnimationManager.ts +694 -0
  250. package/skills/path_animation.aicomponent/ref/AnimationManager3D.ts +317 -0
  251. package/skills/path_elimination_rules.aigameplay/SKILL.md +88 -0
  252. package/skills/path_elimination_rules.aigameplay/manifest.json +119 -0
  253. package/skills/path_elimination_rules.aigameplay/ref/pgs-schema.json +227 -0
  254. package/skills/path_input_handler.aicomponent/SKILL.md +87 -0
  255. package/skills/path_input_handler.aicomponent/manifest.json +97 -0
  256. package/skills/path_input_handler.aicomponent/ref/InputHandler.ts +714 -0
  257. package/skills/path_input_handler.aicomponent/ref/InputHandler3D.ts +204 -0
  258. package/skills/path_renderer.aicomponent/SKILL.md +101 -0
  259. package/skills/path_renderer.aicomponent/manifest.json +69 -0
  260. package/skills/path_renderer.aicomponent/ref/PathRenderer.ts +509 -0
  261. package/skills/path_renderer.aicomponent/ref/PathRenderer3D.ts +176 -0
  262. package/skills/path_renderer.aicomponent/ref/PathRenderers.ts +640 -0
  263. package/skills/phaser.aicomponent/SKILL.md +315 -0
  264. package/skills/phaser.aicomponent/manifest.json +156 -0
  265. package/skills/phaser.aicomponent/ref/BootScene.ts +29 -0
  266. package/skills/phaser.aicomponent/ref/GameConfig.ts +29 -0
  267. package/skills/phaser.aicomponent/ref/GameScene.ts +88 -0
  268. package/skills/phaser.aicomponent/ref/PreloaderScene.ts +78 -0
  269. package/skills/phaser.aicomponent/ref/SceneKeys.ts +7 -0
  270. package/skills/phaser.aicomponent/ref/SoundUtils.ts +21 -0
  271. package/skills/phaser.aicomponent/ref/UiLayout.ts +74 -0
  272. package/skills/phaser.aicomponent/ref/globals.d.ts +52 -0
  273. package/skills/phaser.aicomponent/ref/index.css +40 -0
  274. package/skills/phaser.aicomponent/ref/index.html +14 -0
  275. package/skills/phaser.aicomponent/ref/index.ts +48 -0
  276. package/skills/phaser.aicomponent/ref/main.ts +16 -0
  277. package/skills/phaser.aicomponent/ref/package.json +22 -0
  278. package/skills/phaser.aicomponent/ref/tsconfig.json +25 -0
  279. package/skills/phaser.aicomponent/ref/webpack.config.js +57 -0
  280. package/skills/phaser_scene_lifecycle.aicomponent/SKILL.md +63 -0
  281. package/skills/phaser_scene_lifecycle.aicomponent/manifest.json +33 -0
  282. package/skills/pick_and_match_rules.aigameplay/SKILL.md +113 -0
  283. package/skills/pick_and_match_rules.aigameplay/manifest.json +121 -0
  284. package/skills/pick_and_match_rules.aigameplay/ref/pgs-schema.json +354 -0
  285. package/skills/pin_pull.aigameplay/SKILL.md +110 -0
  286. package/skills/pin_pull.aigameplay/manifest.json +164 -0
  287. package/skills/pin_pull.aigameplay/ref/pgs-schema.json +201 -0
  288. package/skills/pin_pull.aigameplay/ref/reducer.template.ts +216 -0
  289. package/skills/playable_app_logo.aiimage/SKILL.md +58 -0
  290. package/skills/playable_app_logo.aiimage/manifest.json +47 -0
  291. package/skills/playable_app_logo.aiimage/ref/logo.png +0 -0
  292. package/skills/playable_app_logo.aiimage/ref/logo.webp +0 -0
  293. package/skills/playable_end_screen_layout.aicomponent/SKILL.md +75 -0
  294. package/skills/playable_end_screen_layout.aicomponent/manifest.json +24 -0
  295. package/skills/playable_guidance_layer.aicomponent/SKILL.md +89 -0
  296. package/skills/playable_guidance_layer.aicomponent/manifest.json +24 -0
  297. package/skills/playable_hud_layout.aicomponent/SKILL.md +96 -0
  298. package/skills/playable_hud_layout.aicomponent/manifest.json +24 -0
  299. package/skills/playable_scripts_build.aicomponent/SKILL.md +69 -0
  300. package/skills/playable_scripts_build.aicomponent/manifest.json +53 -0
  301. package/skills/playable_scripts_build.aicomponent/ref/builds.config.js +257 -0
  302. package/skills/playcraft-3d-flip-sprite/SKILL.md +336 -0
  303. package/skills/playcraft-3d-flip-sprite/renderer/flatten_glb.mjs +62 -0
  304. package/skills/playcraft-3d-flip-sprite/renderer/render.mjs +325 -0
  305. package/skills/playcraft-3d-flip-sprite/renderer/render_single.mjs +138 -0
  306. package/skills/playcraft-asset-management/SKILL.md +73 -0
  307. package/skills/playcraft-audio-generation/SKILL.md +126 -0
  308. package/skills/playcraft-build/SKILL.md +44 -0
  309. package/skills/playcraft-code-editor/SKILL.md +71 -0
  310. package/skills/playcraft-create-remix/SKILL.md +62 -0
  311. package/skills/playcraft-deploy/SKILL.md +59 -0
  312. package/skills/playcraft-image-generation/SKILL.md +148 -0
  313. package/skills/playcraft-image-processing/SKILL.md +216 -0
  314. package/skills/playcraft-platform-intro/SKILL.md +41 -0
  315. package/skills/playcraft-prefab/SKILL.md +98 -0
  316. package/skills/playcraft-project-management/SKILL.md +57 -0
  317. package/skills/playcraft-remix-workflow/SKILL.md +119 -0
  318. package/skills/playcraft-remix-workflow/references/xplatform.schema.json5 +31 -0
  319. package/skills/playcraft-save/SKILL.md +46 -0
  320. package/skills/playcraft-skill-recommender/SKILL.md +152 -0
  321. package/skills/playcraft-sprite-generation/SKILL.md +534 -0
  322. package/skills/playcraft-sprite-remix/SKILL.md +155 -0
  323. package/skills/playcraft-sprite-sheet/SKILL.md +97 -0
  324. package/skills/playtest_report.aivalidator/SKILL.md +103 -0
  325. package/skills/playtest_report.aivalidator/manifest.json +21 -0
  326. package/skills/preloader_scene.aicomponent/SKILL.md +58 -0
  327. package/skills/preloader_scene.aicomponent/manifest.json +43 -0
  328. package/skills/preloader_scene.aicomponent/ref/Preloader.ts +339 -0
  329. package/skills/progress_bar.aicomponent/SKILL.md +38 -0
  330. package/skills/progress_bar.aicomponent/manifest.json +25 -0
  331. package/skills/progress_bar.aicomponent/ref/ProgressDisplay.ts +140 -0
  332. package/skills/references/xplatform.schema.json5 +31 -0
  333. package/skills/responsive_2d_layout.aicomponent/SKILL.md +161 -0
  334. package/skills/responsive_2d_layout.aicomponent/manifest.json +43 -0
  335. package/skills/responsive_2d_layout.aicomponent/ref/UiLayout.ts +56 -0
  336. package/skills/run_context_state.aicomponent/SKILL.md +54 -0
  337. package/skills/run_context_state.aicomponent/manifest.json +40 -0
  338. package/skills/run_context_state.aicomponent/ref/RunContextRuntime.ts +30 -0
  339. package/skills/score-fly.aicomponent/SKILL.md +31 -0
  340. package/skills/score-fly.aicomponent/manifest.json +21 -0
  341. package/skills/score-fly.aicomponent/ref/phaser.js +26 -0
  342. package/skills/score-fly.aicomponent/ref/playcanvas.js +28 -0
  343. package/skills/score_goal.aiconfig/SKILL.md +46 -0
  344. package/skills/score_goal.aiconfig/manifest.json +33 -0
  345. package/skills/screen-flash.aicomponent/SKILL.md +30 -0
  346. package/skills/screen-flash.aicomponent/manifest.json +20 -0
  347. package/skills/screen-flash.aicomponent/ref/phaser.js +48 -0
  348. package/skills/screen-shake.aicomponent/SKILL.md +30 -0
  349. package/skills/screen-shake.aicomponent/manifest.json +19 -0
  350. package/skills/screen-shake.aicomponent/ref/phaser.js +23 -0
  351. package/skills/screen-shake.aicomponent/ref/playcanvas.js +44 -0
  352. package/skills/screw_puzzle.aigameplay/SKILL.md +116 -0
  353. package/skills/screw_puzzle.aigameplay/manifest.json +164 -0
  354. package/skills/screw_puzzle.aigameplay/ref/pgs-schema.json +235 -0
  355. package/skills/screw_puzzle.aigameplay/ref/reducer.template.ts +213 -0
  356. package/skills/settings_state.aicomponent/SKILL.md +61 -0
  357. package/skills/settings_state.aicomponent/manifest.json +33 -0
  358. package/skills/settings_state.aicomponent/ref/SettingsManager.ts +130 -0
  359. package/skills/slide_out_to_tray_animation.aicomponent/SKILL.md +64 -0
  360. package/skills/slide_out_to_tray_animation.aicomponent/manifest.json +58 -0
  361. package/skills/slide_out_to_tray_animation.aicomponent/ref/AnimationManager.ts +164 -0
  362. package/skills/slide_out_to_tray_animation.aicomponent/ref/AnimationManager3D.ts +198 -0
  363. package/skills/slide_out_to_tray_animation.aicomponent/ref/BezierUtils.ts +59 -0
  364. package/skills/slot_machine.aigameplay/SKILL.md +119 -0
  365. package/skills/slot_machine.aigameplay/manifest.json +166 -0
  366. package/skills/slot_machine.aigameplay/ref/pgs-schema.json +212 -0
  367. package/skills/slot_machine.aigameplay/ref/reducer.template.ts +212 -0
  368. package/skills/sniper_shot.aigameplay/SKILL.md +84 -0
  369. package/skills/sniper_shot.aigameplay/manifest.json +153 -0
  370. package/skills/sniper_shot.aigameplay/ref/pgs-schema.json +211 -0
  371. package/skills/sniper_shot.aigameplay/ref/reducer.template.ts +211 -0
  372. package/skills/solitaire.aigameplay/SKILL.md +101 -0
  373. package/skills/solitaire.aigameplay/manifest.json +151 -0
  374. package/skills/solitaire.aigameplay/ref/pgs-schema.json +200 -0
  375. package/skills/solitaire.aigameplay/ref/reducer.template.ts +176 -0
  376. package/skills/sound-effects/SKILL.md +46 -0
  377. package/skills/sound_utils.aicomponent/SKILL.md +52 -0
  378. package/skills/sound_utils.aicomponent/manifest.json +30 -0
  379. package/skills/sound_utils.aicomponent/ref/SoundUtils.ts +29 -0
  380. package/skills/sprite-animation-2d.aicomponent/SKILL.md +45 -0
  381. package/skills/sprite-animation-2d.aicomponent/manifest.json +28 -0
  382. package/skills/sprite-animation-2d.aicomponent/ref/html5.js +83 -0
  383. package/skills/sprite-animation-2d.aicomponent/ref/phaser.js +38 -0
  384. package/skills/sprite-animation-2d.aicomponent/ref/playcanvas.js +67 -0
  385. package/skills/sprite_entity_renderer.aicomponent/SKILL.md +148 -0
  386. package/skills/sprite_entity_renderer.aicomponent/manifest.json +17 -0
  387. package/skills/sprite_entity_renderer.aicomponent/ref/SpriteEntityRenderer.ts +126 -0
  388. package/skills/success_sfx.aiaudio/SKILL.md +59 -0
  389. package/skills/success_sfx.aiaudio/manifest.json +45 -0
  390. package/skills/success_sfx.aiaudio/ref/success.mp3 +0 -0
  391. package/skills/tap_blast.aigameplay/SKILL.md +116 -0
  392. package/skills/tap_blast.aigameplay/manifest.json +153 -0
  393. package/skills/tap_blast.aigameplay/ref/pgs-schema.json +208 -0
  394. package/skills/tap_blast.aigameplay/ref/reducer.template.ts +202 -0
  395. package/skills/theme_state.aicomponent/SKILL.md +53 -0
  396. package/skills/theme_state.aicomponent/manifest.json +33 -0
  397. package/skills/theme_state.aicomponent/ref/ThemeManager.ts +174 -0
  398. package/skills/theme_switcher_build.aicomponent/SKILL.md +62 -0
  399. package/skills/theme_switcher_build.aicomponent/manifest.json +38 -0
  400. package/skills/theme_switcher_build.aicomponent/ref/theme-index.ts +8 -0
  401. package/skills/theme_variant.aiconfig/SKILL.md +78 -0
  402. package/skills/theme_variant.aiconfig/manifest.json +39 -0
  403. package/skills/theme_variant.aiconfig/ref/ExampleTheme/index.ts +16 -0
  404. package/skills/theme_variant.aiconfig/ref/ExampleTheme/levelEasy.json +141 -0
  405. package/skills/threejs.aicomponent/SKILL.md +422 -0
  406. package/skills/threejs.aicomponent/manifest.json +166 -0
  407. package/skills/threejs.aicomponent/ref/AssetLoader.ts +158 -0
  408. package/skills/threejs.aicomponent/ref/BaseScene.ts +88 -0
  409. package/skills/threejs.aicomponent/ref/GameConfig.ts +47 -0
  410. package/skills/threejs.aicomponent/ref/MainScene.ts +170 -0
  411. package/skills/threejs.aicomponent/ref/PreloaderScene.ts +93 -0
  412. package/skills/threejs.aicomponent/ref/SceneKeys.ts +6 -0
  413. package/skills/threejs.aicomponent/ref/SceneManager.ts +69 -0
  414. package/skills/threejs.aicomponent/ref/ViewportManager.ts +62 -0
  415. package/skills/threejs.aicomponent/ref/globals.d.ts +74 -0
  416. package/skills/threejs.aicomponent/ref/index.css +80 -0
  417. package/skills/threejs.aicomponent/ref/index.html +20 -0
  418. package/skills/threejs.aicomponent/ref/index.ts +117 -0
  419. package/skills/threejs.aicomponent/ref/main.ts +10 -0
  420. package/skills/threejs.aicomponent/ref/package.json +23 -0
  421. package/skills/threejs.aicomponent/ref/tsconfig.json +24 -0
  422. package/skills/threejs.aicomponent/ref/webpack.config.js +61 -0
  423. package/skills/time_clear_goal.aiconfig/SKILL.md +46 -0
  424. package/skills/time_clear_goal.aiconfig/manifest.json +32 -0
  425. package/skills/time_icon.aiimage/SKILL.md +58 -0
  426. package/skills/time_icon.aiimage/manifest.json +47 -0
  427. package/skills/time_icon.aiimage/ref/time.png +0 -0
  428. package/skills/time_icon.aiimage/ref/time.webp +0 -0
  429. package/skills/top_ui_bar.aicomponent/SKILL.md +45 -0
  430. package/skills/top_ui_bar.aicomponent/manifest.json +27 -0
  431. package/skills/top_ui_bar.aicomponent/ref/GameTopUI.ts +229 -0
  432. package/skills/tower_defence.aigameplay/SKILL.md +117 -0
  433. package/skills/tower_defence.aigameplay/manifest.json +175 -0
  434. package/skills/tower_defence.aigameplay/ref/pgs-schema.json +247 -0
  435. package/skills/tower_defence.aigameplay/ref/reducer.template.ts +239 -0
  436. package/skills/tray_container.aicomponent/SKILL.md +143 -0
  437. package/skills/tray_container.aicomponent/manifest.json +58 -0
  438. package/skills/tray_container.aicomponent/ref/TrayRenderer.ts +155 -0
  439. package/skills/tray_container.aicomponent/ref/TrayRenderer3D.ts +281 -0
  440. package/skills/tray_container.aicomponent/ref/TrayRendererHtmlOverlay.ts +228 -0
  441. package/skills/tutorial_overlay.aicomponent/SKILL.md +46 -0
  442. package/skills/tutorial_overlay.aicomponent/manifest.json +34 -0
  443. package/skills/tutorial_overlay.aicomponent/ref/TutorialManager.ts +367 -0
  444. package/skills/tween-animation-2d.aicomponent/SKILL.md +35 -0
  445. package/skills/tween-animation-2d.aicomponent/manifest.json +28 -0
  446. package/skills/tween-animation-2d.aicomponent/ref/phaser.js +49 -0
  447. package/skills/tween-animation-2d.aicomponent/ref/playcanvas.js +36 -0
  448. package/skills/typescript_module_patterns.aicomponent/SKILL.md +209 -0
  449. package/skills/typescript_module_patterns.aicomponent/manifest.json +28 -0
  450. package/skills/typescript_module_patterns.aicomponent/ref/globals.d.ts +31 -0
  451. package/skills/ui-transition.aicomponent/SKILL.md +33 -0
  452. package/skills/ui-transition.aicomponent/manifest.json +19 -0
  453. package/skills/ui-transition.aicomponent/ref/phaser.js +45 -0
  454. package/skills/ux_flow_spec.aiconfig/SKILL.md +82 -0
  455. package/skills/ux_flow_spec.aiconfig/manifest.json +39 -0
  456. package/skills/wave_difficulty.aiconfig/SKILL.md +46 -0
  457. package/skills/wave_difficulty.aiconfig/manifest.json +33 -0
  458. package/skills/webpack_build.aicomponent/SKILL.md +204 -0
  459. package/skills/webpack_build.aicomponent/manifest.json +29 -0
  460. package/skills/webpack_build.aicomponent/ref/package.json +16 -0
  461. package/skills/webpack_build.aicomponent/ref/webpack.config.js +53 -0
  462. package/skills/win_anim_sfx.aiaudio/SKILL.md +59 -0
  463. package/skills/win_anim_sfx.aiaudio/manifest.json +46 -0
  464. package/skills/win_anim_sfx.aiaudio/ref/win_anim.mp3 +0 -0
  465. package/skills/win_dot.aiimage/SKILL.md +58 -0
  466. package/skills/win_dot.aiimage/manifest.json +47 -0
  467. package/skills/win_dot.aiimage/ref/win_dot.png +0 -0
  468. package/skills/win_dot.aiimage/ref/win_dot.webp +0 -0
  469. package/skills/win_result_panel.aiimage/SKILL.md +58 -0
  470. package/skills/win_result_panel.aiimage/manifest.json +47 -0
  471. package/skills/win_result_panel.aiimage/ref/win.png +0 -0
  472. package/skills/win_result_panel.aiimage/ref/win.webp +0 -0
  473. package/skills/word_connect.aigameplay/SKILL.md +86 -0
  474. package/skills/word_connect.aigameplay/manifest.json +154 -0
  475. package/skills/word_connect.aigameplay/ref/pgs-schema.json +212 -0
  476. package/skills/word_connect.aigameplay/ref/reducer.template.ts +186 -0
  477. package/src/index.ts +10 -0
  478. package/src/skills.loader.ts +225 -0
  479. package/src/skills.types.ts +42 -0
@@ -0,0 +1,422 @@
1
+ ---
2
+ name: threejs.aicomponent
3
+ description: Three.js 3D 引擎运行时 + 完整可运行空项目。提供 15 个文件:场景生命周期管理(Preloader→Main)、PBR 渲染管线(阴影/色调映射)、响应式视口(ResizeObserver)、资源加载(Texture/GLTF/Audio/CubeTexture)、OrbitControls。安装依赖后 `pnpm dev` 即可看到旋转 Torus Knot + 网格地面。
4
+ triggers: 需要初始化一个新的 Three.js 3D 项目、添加 3D 游戏引擎基础层,或配置 WebGL 渲染器和 3D 场景时触发。
5
+ ---
6
+
7
+ # Three.js 3D 引擎(Three.js Engine + Complete Project Skeleton)
8
+
9
+ ## 说明
10
+
11
+ 本 skill 是所有 Three.js skill 的基础。它贡献的 **15 个文件**构成了一个**完整可运行的 Three.js 空项目**,开箱即用:
12
+
13
+ ```bash
14
+ pnpm install
15
+ pnpm dev # 开发模式 → 浏览器显示旋转 Torus Knot + 网格地面 + 坐标轴
16
+ pnpm build # 构建产物
17
+ ```
18
+
19
+ **已内置的基础能力:**
20
+
21
+ - **场景生命周期管理**:`SceneManager` + `BaseScene` 抽象类,支持 Preloader → Main 多场景切换
22
+ - **PBR 渲染管线**:ACES Filmic 色调映射 + PCF 软阴影 + 自动 HiDPI 像素比
23
+ - **响应式视口**:`ViewportManager` 基于 ResizeObserver,自动更新 Renderer + Camera
24
+ - **资源加载系统**:`AssetLoader` 支持 Texture / GLTF / Audio / CubeTexture 批量加载 + 进度回调
25
+ - **OrbitControls**:带阻尼的轨道相机控制,可通过配置开关
26
+ - **HTML Loading Overlay**:CSS 动画进度条,加载完成自动淡出
27
+ - **TypeScript 完整支持**:资源模块声明(图片/音频/3D模型/HDR/EXR)+ `__DEV__` 全局变量
28
+
29
+ ---
30
+
31
+ ## Scaffold
32
+
33
+ | 目标路径 | 来源 | 说明 |
34
+ |---------|-----|-----|
35
+ | `src/main.ts` | `ref/main.ts` | **webpack 入口**:import CSS → DOMContentLoaded → StartGame |
36
+ | `src/index.html` | `ref/index.html` | **HTML 容器**:viewport meta + `#game-container` + `#loading-overlay` |
37
+ | `src/index.css` | `ref/index.css` | **全屏样式**:移动端适配 + Loading overlay CSS 动画 |
38
+ | `globals.d.ts` | `ref/globals.d.ts` | **类型声明**:资源模块(图片/音频/3D模型/HDR)+ `__DEV__` 全局 |
39
+ | `tsconfig.json` | `ref/tsconfig.json` | **TypeScript 配置**:target es2020, moduleResolution bundler, paths assets/* |
40
+ | `src/game/index.ts` | `ref/index.ts` | **`StartGame(containerId)`**:配置 Renderer + Camera + SceneManager + 动画主循环 |
41
+ | `src/game/GameConfig.ts` | `ref/GameConfig.ts` | **游戏配置**:渲染参数、相机、灯光、调试开关 |
42
+ | `src/game/SceneKeys.ts` | `ref/SceneKeys.ts` | **场景名枚举**:Preloader / Main |
43
+ | `src/game/SceneManager.ts` | `ref/SceneManager.ts` | **场景管理器**:注册、切换、更新、销毁 |
44
+ | `src/game/scenes/BaseScene.ts` | `ref/BaseScene.ts` | **场景基类**:init/enter/update/exit/dispose 生命周期 |
45
+ | `src/game/scenes/PreloaderScene.ts` | `ref/PreloaderScene.ts` | **预加载场景**:HTML overlay 进度条 + AssetLoader 批量加载 |
46
+ | `src/game/scenes/MainScene.ts` | `ref/MainScene.ts` | **主场景**:Hello Three.js(旋转 Torus Knot + 灯光 + 地面 + 网格) |
47
+ | `src/game/utils/ViewportManager.ts` | `ref/ViewportManager.ts` | **响应式视口**:ResizeObserver 自动更新 Renderer + Camera |
48
+ | `src/game/utils/AssetLoader.ts` | `ref/AssetLoader.ts` | **资源加载器**:Texture/GLTF/Audio/CubeTexture 批量加载 |
49
+ | `package.json` | `ref/package.json` | **依赖**:three + @types/three + webpack 工具链 |
50
+ | `webpack.config.js` | `ref/webpack.config.js` | **Webpack 5 配置**:ts-loader + 3D 模型/HDR 资源 + __DEV__ |
51
+
52
+ `package.json` 新增:`"three": "^0.172.0"`, `"@types/three": "^0.172.0"`
53
+
54
+ ---
55
+
56
+ ## 空项目文件结构
57
+
58
+ 安装本 skill 后 Remix 项目的完整文件树:
59
+
60
+ ```
61
+ <remix-project>/
62
+ ├── src/
63
+ │ ├── main.ts ← webpack 入口
64
+ │ ├── index.html ← HTML 容器(含 viewport meta + loading overlay)
65
+ │ ├── index.css ← 全屏 + 移动端适配 + Loading 动画样式
66
+ │ └── game/
67
+ │ ├── index.ts ← StartGame()
68
+ │ ├── GameConfig.ts ← 通用游戏配置
69
+ │ ├── SceneKeys.ts ← 场景名枚举
70
+ │ ├── SceneManager.ts ← 场景生命周期管理器
71
+ │ ├── scenes/
72
+ │ │ ├── BaseScene.ts ← 场景抽象基类
73
+ │ │ ├── PreloaderScene.ts ← 资源加载 + HTML 进度条
74
+ │ │ └── MainScene.ts ← Hello Three.js(主场景骨架)
75
+ │ └── utils/
76
+ │ ├── ViewportManager.ts ← 响应式视口管理
77
+ │ └── AssetLoader.ts ← 统一资源加载器
78
+ ├── assets/
79
+ │ ├── models/ ← 3D 模型(.glb, .gltf, .fbx)
80
+ │ ├── textures/ ← 贴图(.png, .jpg, .webp, .hdr)
81
+ │ └── sounds/ ← 音频(.mp3, .ogg, .wav)
82
+ ├── globals.d.ts ← 完整类型声明
83
+ ├── tsconfig.json ← TypeScript 配置
84
+ ├── package.json ← three + webpack 依赖
85
+ └── webpack.config.js ← 构建配置
86
+ ```
87
+
88
+ ---
89
+
90
+ ## 文件详解
91
+
92
+ ### src/index.ts(webpack 入口)
93
+
94
+ ```typescript
95
+ import "./index.css";
96
+ import { StartGame } from "./game";
97
+
98
+ document.addEventListener("DOMContentLoaded", () => {
99
+ StartGame("game-container");
100
+ });
101
+ ```
102
+
103
+ ### src/game/index.ts(StartGame 函数)
104
+
105
+ ```typescript
106
+ import * as THREE from "three";
107
+ import { GameConfig } from "./GameConfig";
108
+ import { SceneManager } from "./SceneManager";
109
+ import { ViewportManager } from "./utils/ViewportManager";
110
+
111
+ export function StartGame(containerId: string): GameInstance {
112
+ // 1. 创建 WebGLRenderer(抗锯齿 + 阴影 + ACES Filmic 色调映射)
113
+ // 2. 创建 PerspectiveCamera(fov/near/far/position 来自 GameConfig)
114
+ // 3. 注册 PreloaderScene + MainScene → SceneManager
115
+ // 4. 启用 ViewportManager(ResizeObserver 响应式)
116
+ // 5. requestAnimationFrame 主循环:update → render
117
+ }
118
+ ```
119
+
120
+ ### src/game/GameConfig.ts(通用配置)
121
+
122
+ ```typescript
123
+ export const GameConfig = {
124
+ antialias: true, // 抗锯齿
125
+ shadows: true, // 阴影
126
+ toneMapping: "ACESFilmic", // 色调映射
127
+ toneMappingExposure: 1.0, // 曝光度
128
+ maxPixelRatio: 2, // HiDPI 像素比上限
129
+
130
+ camera: {
131
+ fov: 60, // 视场角
132
+ near: 0.1, far: 1000, // 裁剪面
133
+ position: { x: 0, y: 3, z: 5 },
134
+ lookAt: { x: 0, y: 0, z: 0 },
135
+ },
136
+
137
+ lighting: {
138
+ ambientColor: 0x404040, // 环境光
139
+ directionalColor: 0xffffff, // 平行光
140
+ directionalPosition: { x: 5, y: 8, z: 5 },
141
+ },
142
+
143
+ clearColor: 0x1a1a2e, // 场景背景色
144
+ debugScene: "main", // 启动场景
145
+ showFps: false, // FPS 显示
146
+ showGrid: true, // 网格/坐标轴
147
+ enableOrbitControls: true, // 轨道控制器
148
+ };
149
+ ```
150
+
151
+ ### src/game/SceneManager.ts(场景管理器)
152
+
153
+ ```typescript
154
+ class SceneManager {
155
+ register(...scenes: BaseScene[]) // 注册场景
156
+ switchTo(key: SceneKey) // 切换场景(自动调用 exit/init/enter)
157
+ update(dt, elapsed) // 每帧更新活跃场景
158
+ dispose() // 销毁所有场景
159
+ }
160
+ ```
161
+
162
+ ### src/game/scenes/BaseScene.ts(场景基类)
163
+
164
+ ```typescript
165
+ abstract class BaseScene {
166
+ readonly key: SceneKey;
167
+ readonly scene: THREE.Scene; // 每个场景拥有独立的 Three.Scene
168
+
169
+ protected onInit(): void {} // 首次进入时调用(创建 3D 对象)
170
+ protected onEnter(): void {} // 每次切入时调用
171
+ protected onUpdate(dt, elapsed): void {} // 每帧调用
172
+ protected onExit(): void {} // 离开时调用
173
+ protected onDispose(): void {} // 销毁时调用
174
+
175
+ protected goToScene(key): void // 切换到其他场景
176
+ }
177
+ ```
178
+
179
+ **使用示例**:
180
+
181
+ ```typescript
182
+ import { BaseScene } from "./BaseScene";
183
+ import { SceneKeys } from "../SceneKeys";
184
+
185
+ export class MyScene extends BaseScene {
186
+ private cube!: THREE.Mesh;
187
+
188
+ constructor() {
189
+ super(SceneKeys.Main);
190
+ }
191
+
192
+ protected onInit(): void {
193
+ const geo = new THREE.BoxGeometry(1, 1, 1);
194
+ const mat = new THREE.MeshStandardMaterial({ color: 0xff6600 });
195
+ this.cube = new THREE.Mesh(geo, mat);
196
+ this.scene.add(this.cube);
197
+ }
198
+
199
+ protected onUpdate(dt: number): void {
200
+ this.cube.rotation.y += dt;
201
+ }
202
+ }
203
+ ```
204
+
205
+ ### src/game/utils/ViewportManager.ts(响应式视口)
206
+
207
+ ```typescript
208
+ class ViewportManager {
209
+ enable() // 开始监听 ResizeObserver
210
+ disable() // 停止监听
211
+ refresh() // 手动触发一次 resize
212
+ getSize() // 获取当前 { width, height, aspect }
213
+ }
214
+ ```
215
+
216
+ 与 Phaser 的 `resize → reload` 不同,Three.js 版使用 ResizeObserver 动态更新,无需刷新页面。
217
+
218
+ ### src/game/utils/AssetLoader.ts(资源加载器)
219
+
220
+ ```typescript
221
+ const loader = new AssetLoader();
222
+
223
+ await loader.loadAll({
224
+ textures: [{ key: "wood", url: woodTextureUrl }],
225
+ models: [{ key: "character", url: characterGlbUrl }],
226
+ audio: [{ key: "bgm", url: bgmMp3Url }],
227
+ cubeTextures: [{ key: "skybox", urls: [px, nx, py, ny, pz, nz] }],
228
+ }, (progress) => {
229
+ console.log(`Loading: ${(progress * 100).toFixed(0)}%`);
230
+ });
231
+
232
+ const tex = loader.getTexture("wood"); // THREE.Texture
233
+ const gltf = loader.getModel("character"); // GLTF (含 scene/animations)
234
+ const buf = loader.getAudioBuffer("bgm"); // AudioBuffer
235
+ ```
236
+
237
+ ### src/game/scenes/MainScene.ts(Hello Three.js 空白主场景)
238
+
239
+ 显示旋转 Torus Knot + 网格地面 + 坐标轴 + "Hello Three.js!" 文字精灵。
240
+ 作为开发起点,替换 `onInit()` / `onUpdate()` 内容即可开始编写游戏逻辑。
241
+
242
+ ---
243
+
244
+ ## 架构对比:Phaser vs Three.js
245
+
246
+ | 概念 | Phaser skill | Three.js skill |
247
+ |------|-------------|---------------|
248
+ | **渲染器** | `Phaser.Game` (内置 WebGL) | `THREE.WebGLRenderer` (显式创建) |
249
+ | **场景系统** | `Phaser.Scene` (引擎内置) | `BaseScene` + `SceneManager` (自建) |
250
+ | **相机** | 2D 隐式相机 | `PerspectiveCamera` (显式 3D) |
251
+ | **生命周期** | `preload/create/update` | `onInit/onEnter/onUpdate/onExit/onDispose` |
252
+ | **资源加载** | `this.load.image()` (内置) | `AssetLoader` (封装 TextureLoader/GLTFLoader) |
253
+ | **响应式** | resize → reload | ResizeObserver (无需刷新) |
254
+ | **Loading UI** | Phaser 场景内绘制 | HTML overlay (CSS 动画) |
255
+ | **坐标系** | 2D 左上角原点 | 3D 右手坐标系 (Y-up) |
256
+ | **设计基准** | 750×1334 dp | 视口宽高比 (aspect ratio) |
257
+
258
+ ---
259
+
260
+ ## 3D 坐标系与基础概念
261
+
262
+ ### 坐标系
263
+
264
+ - **右手坐标系**:X 向右,Y 向上,Z 朝屏幕外(标准 Three.js / OpenGL 约定)
265
+ - **单位**:1 Three.js 单位 = 1 米(推荐约定,方便物理/灯光计算)
266
+ - **相机默认位置**:(0, 3, 5) 看向原点 (0, 0, 0)
267
+
268
+ ### PBR 渲染管线
269
+
270
+ | 参数 | 默认值 | 说明 |
271
+ |------|-------|------|
272
+ | `antialias` | true | 抗锯齿 |
273
+ | `shadows` | true | PCF 软阴影 |
274
+ | `toneMapping` | ACESFilmic | ACES 电影级色调映射 |
275
+ | `toneMappingExposure` | 1.0 | 曝光度 |
276
+ | `maxPixelRatio` | 2 | HiDPI 像素比上限(防止 3× 设备过度渲染) |
277
+
278
+ ### 使用规则
279
+
280
+ 1. 每个场景继承 `BaseScene`,在 `onInit()` 中创建 3D 对象
281
+ 2. 通过 `this.scene.add(object)` 添加到场景图
282
+ 3. `onUpdate(dt, elapsed)` 中执行动画逻辑,`dt` 单位秒
283
+ 4. 切场景用 `this.goToScene(SceneKeys.XXX)`
284
+ 5. 重型资源在 `PreloaderScene.getManifest()` 中声明,通过 `AssetLoader` 预加载
285
+ 6. `onDispose()` 中清理事件监听等自定义资源(GPU 资源由基类自动清理)
286
+
287
+ ---
288
+
289
+ ## 移动端适配清单
290
+
291
+ | 特性 | 实现位置 | 说明 |
292
+ |------|---------|------|
293
+ | **HiDPI 清晰度** | `StartGame()` | `maxPixelRatio: 2` 限制过高 DPR |
294
+ | **禁止页面缩放** | `index.html` | `viewport` meta:`user-scalable=no, maximum-scale=1` |
295
+ | **iOS 全屏** | `index.html` | `apple-mobile-web-app-capable` + `black-translucent` 状态栏 |
296
+ | **安全区(刘海屏)** | `index.css` | `env(safe-area-inset-*)` padding |
297
+ | **禁止文字选中** | `index.css` | `user-select: none` |
298
+ | **禁止长按菜单** | `index.css` | `-webkit-touch-callout: none` |
299
+ | **禁止 iOS 回弹** | `index.css` | `overscroll-behavior: none; touch-action: none` |
300
+ | **禁止点击高亮** | `index.css` | `-webkit-tap-highlight-color: transparent` |
301
+ | **响应式 resize** | `ViewportManager` | ResizeObserver 自动更新 Renderer + Camera |
302
+ | **Canvas 全屏** | `index.css` | `width: 100% !important; height: 100% !important` |
303
+
304
+ ---
305
+
306
+ ## 新增场景的步骤
307
+
308
+ 1. 在 `SceneKeys.ts` 添加新的场景键:
309
+
310
+ ```typescript
311
+ export const SceneKeys = {
312
+ Preloader: "Preloader",
313
+ Main: "Main",
314
+ GameOver: "GameOver", // ← 新增
315
+ } as const;
316
+ ```
317
+
318
+ 2. 创建场景类(继承 `BaseScene`):
319
+
320
+ ```typescript
321
+ // src/game/scenes/GameOverScene.ts
322
+ import { BaseScene } from "./BaseScene";
323
+ import { SceneKeys } from "../SceneKeys";
324
+
325
+ export class GameOverScene extends BaseScene {
326
+ constructor() { super(SceneKeys.GameOver); }
327
+
328
+ protected onInit(): void {
329
+ // 创建 3D 对象...
330
+ }
331
+
332
+ protected onUpdate(dt: number): void {
333
+ // 动画逻辑...
334
+ }
335
+ }
336
+ ```
337
+
338
+ 3. 在 `src/game/index.ts` 注册场景:
339
+
340
+ ```typescript
341
+ import { GameOverScene } from "./scenes/GameOverScene";
342
+
343
+ sceneManager.register(
344
+ new PreloaderScene(),
345
+ new MainScene(),
346
+ new GameOverScene(), // ← 新增
347
+ );
348
+ ```
349
+
350
+ 4. 在任意场景中切换:
351
+
352
+ ```typescript
353
+ this.goToScene(SceneKeys.GameOver);
354
+ ```
355
+
356
+ ---
357
+
358
+ ## Imports
359
+
360
+ 本 skill 是所有 Three.js 组件的基础,无 skill 层依赖。
361
+
362
+ **配套 skill(推荐一起使用):**
363
+ - `webpack_build.aicomponent` — 如需自定义 webpack 配置(本 skill 已内置基础版 webpack.config.js)
364
+
365
+ **不再需要单独安装**(已内置):
366
+ - 资源模块声明 — 已合入 `globals.d.ts`
367
+ - 响应式视口 — `ViewportManager.ts` 已内置
368
+ - 资源加载器 — `AssetLoader.ts` 已内置
369
+
370
+ ## Skill Definition
371
+
372
+ ```yaml
373
+ tools:
374
+ - read_file
375
+ - write_file
376
+ inputs:
377
+ - source: ref/main.ts (webpack entry)
378
+ - source: ref/index.html (HTML container with viewport meta + loading overlay)
379
+ - source: ref/index.css (fullscreen + mobile + loading styles)
380
+ - source: ref/globals.d.ts (asset module declarations: images/audio/3D models/HDR + __DEV__)
381
+ - source: ref/tsconfig.json (TypeScript config)
382
+ - source: ref/index.ts (StartGame function)
383
+ - source: ref/GameConfig.ts (generic game config: rendering/camera/lighting/debug)
384
+ - source: ref/SceneKeys.ts (scene key enum)
385
+ - source: ref/SceneManager.ts (scene lifecycle manager)
386
+ - source: ref/BaseScene.ts (abstract scene base class)
387
+ - source: ref/PreloaderScene.ts (preloader scene with HTML overlay)
388
+ - source: ref/MainScene.ts (main scene: Hello Three.js skeleton)
389
+ - source: ref/ViewportManager.ts (responsive viewport via ResizeObserver)
390
+ - source: ref/AssetLoader.ts (unified asset loader: Texture/GLTF/Audio/CubeTexture)
391
+ outputs:
392
+ - projectSkeleton: 15 files forming a complete runnable Three.js project
393
+ - threeDep: three ^0.172.0 + @types/three ^0.172.0 npm dependencies
394
+ - sceneLifecycle: BaseScene + SceneManager multi-scene architecture
395
+ - pbrPipeline: ACES Filmic tone mapping + PCF soft shadows + HiDPI
396
+ - responsiveViewport: ViewportManager with ResizeObserver
397
+ - assetLoading: AssetLoader supporting Texture/GLTF/Audio/CubeTexture
398
+ - mobileAdaptation: viewport meta, safe areas, touch handling
399
+ ```
400
+
401
+ ## Recipe
402
+
403
+ | 决策 | 原因 |
404
+ |-----|-----|
405
+ | **BaseScene + SceneManager** | Three.js 没有内置场景生命周期,需自建;保持与 Phaser skill 相似的开发体验 |
406
+ | **HTML Loading Overlay** | 加载期间无需 Three.js 渲染,CSS 动画更轻量;加载完成后 `hidden` 类触发淡出 |
407
+ | **ResizeObserver 而非 reload** | 3D 场景状态丰富(相机位置、动画进度),reload 会丢失;ResizeObserver 高效且无副作用 |
408
+ | **maxPixelRatio: 2** | 3D 渲染远比 2D 昂贵,3× 设备(如 iPhone)全 DPR 渲染会严重影响帧率 |
409
+ | **ACES Filmic 色调映射** | 影视级色彩表现,比 Linear 更自然,是 PBR 管线的标准选择 |
410
+ | **PCF 软阴影** | 平衡画质与性能;如需更高质量可切 VSM,更轻量可关闭 |
411
+ | **OrbitControls 可配置** | 开发调试必备,正式游戏可通过 `enableOrbitControls: false` 关闭 |
412
+ | **每场景独立 THREE.Scene** | 隔离场景图、灯光、后处理;切场景时只需切 renderer.render 的 target |
413
+ | **AssetLoader 按 key 存储** | 全局唯一 key → 资源映射,任何场景都可按 key 取用;避免重复加载 |
414
+ | **ES2020 target** | Three.js 广泛使用现代 JS 特性(class fields、可选链),ES5 target 会导致问题 |
415
+
416
+ ## Adapter
417
+
418
+ - **Role**: `threejsEngine` — Three.js 3D 游戏引擎基座,所有 Three.js 系 skill 的运行时依赖
419
+ - **Provides**: `StartGame()` 启动入口、`SceneManager` 场景管理器、`BaseScene` 场景抽象基类、`ViewportManager` 响应式视口、`AssetLoader` 统一资源加载器、`GameConfig` 渲染配置
420
+ - **Requires**: 无 skill 层依赖(`webpack_build.aicomponent` 为配套工具)
421
+ - **Consumed by**: 所有以 `threejs.aicomponent` 为 Imports 硬依赖的 skill,包括 `camera_controller_3d`、`tray_container`(3D Mesh 模式)、`slide_out_to_tray_animation`(3D 模式)等
422
+ - **Integration point**: `src/main.ts` 在 `DOMContentLoaded` 中调用 `StartGame("game-container")`
@@ -0,0 +1,166 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "atomId": "threejs.aicomponent",
4
+ "bundleType": "aicomponent",
5
+ "category": "engine",
6
+ "mode": "fixed",
7
+ "label": { "zh": "Three.js 3D 引擎", "en": "Three.js 3D engine" },
8
+ "tags": ["three", "threejs", "game-engine", "webgl", "3d", "scene", "runtime", "skeleton", "responsive", "mobile"],
9
+ "bindingRoles": ["gameEngine"],
10
+ "scaffold": {
11
+ "files": {
12
+ "src/main.ts": {
13
+ "source": "ref/main.ts",
14
+ "mode": "full",
15
+ "weight": 10,
16
+ "_comment": "webpack 入口:import CSS + 调用 StartGame"
17
+ },
18
+ "src/index.html": {
19
+ "source": "ref/index.html",
20
+ "mode": "full",
21
+ "weight": 10,
22
+ "_comment": "HTML 容器,包含 viewport meta + #game-container + #loading-overlay"
23
+ },
24
+ "src/index.css": {
25
+ "source": "ref/index.css",
26
+ "mode": "full",
27
+ "weight": 10,
28
+ "_comment": "全屏样式:移动端适配、安全区、Loading overlay"
29
+ },
30
+ "globals.d.ts": {
31
+ "source": "ref/globals.d.ts",
32
+ "mode": "full",
33
+ "weight": 10,
34
+ "_comment": "资源模块声明(图片/音频/3D模型/HDR)+ __DEV__ 全局变量"
35
+ },
36
+ "tsconfig.json": {
37
+ "source": "ref/tsconfig.json",
38
+ "mode": "merge-json",
39
+ "weight": 10,
40
+ "_comment": "TypeScript 配置:target es2020, moduleResolution bundler, paths assets/*"
41
+ },
42
+ "src/game/index.ts": {
43
+ "source": "ref/index.ts",
44
+ "mode": "full",
45
+ "weight": 10,
46
+ "_comment": "StartGame(containerId) 游戏入口,配置 Renderer + Camera + SceneManager + 主循环"
47
+ },
48
+ "src/game/GameConfig.ts": {
49
+ "source": "ref/GameConfig.ts",
50
+ "mode": "full",
51
+ "weight": 10,
52
+ "_comment": "通用游戏配置:渲染参数、相机、灯光、调试开关"
53
+ },
54
+ "src/game/SceneKeys.ts": {
55
+ "source": "ref/SceneKeys.ts",
56
+ "mode": "full",
57
+ "weight": 10,
58
+ "_comment": "场景名枚举,避免字符串硬编码"
59
+ },
60
+ "src/game/SceneManager.ts": {
61
+ "source": "ref/SceneManager.ts",
62
+ "mode": "full",
63
+ "weight": 10,
64
+ "_comment": "场景生命周期管理器:注册、切换、更新、销毁"
65
+ },
66
+ "src/game/scenes/BaseScene.ts": {
67
+ "source": "ref/BaseScene.ts",
68
+ "mode": "full",
69
+ "weight": 10,
70
+ "_comment": "场景基类:统一 init/enter/update/exit/dispose 生命周期"
71
+ },
72
+ "src/game/scenes/PreloaderScene.ts": {
73
+ "source": "ref/PreloaderScene.ts",
74
+ "mode": "full",
75
+ "weight": 10,
76
+ "_comment": "预加载场景:HTML overlay 进度条 + AssetLoader 批量加载"
77
+ },
78
+ "src/game/scenes/MainScene.ts": {
79
+ "source": "ref/MainScene.ts",
80
+ "mode": "full",
81
+ "weight": 10,
82
+ "_comment": "主游戏场景:Hello Three.js(旋转 Torus Knot + 网格 + 坐标轴)"
83
+ },
84
+ "src/game/utils/ViewportManager.ts": {
85
+ "source": "ref/ViewportManager.ts",
86
+ "mode": "full",
87
+ "weight": 10,
88
+ "_comment": "响应式视口管理:ResizeObserver 自动更新 Renderer 尺寸与 Camera 宽高比"
89
+ },
90
+ "src/game/utils/AssetLoader.ts": {
91
+ "source": "ref/AssetLoader.ts",
92
+ "mode": "full",
93
+ "weight": 10,
94
+ "_comment": "统一资源加载器:Texture/GLTF/Audio/CubeTexture 批量加载 + 进度回调"
95
+ },
96
+ "package.json": {
97
+ "source": "ref/package.json",
98
+ "mode": "merge-json",
99
+ "weight": 10,
100
+ "_comment": "项目依赖:three + @types/three + webpack + ts-loader 等"
101
+ },
102
+ "webpack.config.js": {
103
+ "source": "ref/webpack.config.js",
104
+ "mode": "full",
105
+ "weight": 10,
106
+ "_comment": "Webpack 5 配置:ts-loader + 3D 模型资源 + HDR + __DEV__"
107
+ }
108
+ },
109
+ "packageJson": {
110
+ "dependencies": {
111
+ "three": { "version": "^0.172.0", "weight": 10 }
112
+ },
113
+ "devDependencies": {
114
+ "@types/three": { "version": "^0.172.0", "weight": 10 }
115
+ }
116
+ }
117
+ },
118
+ "exports": [
119
+ { "name": "StartGame", "kind": "function", "location": "src/game/index.ts" },
120
+ { "name": "GameInstance", "kind": "type", "location": "src/game/index.ts" },
121
+ { "name": "GameConfig", "kind": "object", "location": "src/game/GameConfig.ts" },
122
+ { "name": "SceneKeys", "kind": "object", "location": "src/game/SceneKeys.ts" },
123
+ { "name": "SceneManager", "kind": "class", "location": "src/game/SceneManager.ts" },
124
+ { "name": "BaseScene", "kind": "class", "location": "src/game/scenes/BaseScene.ts" },
125
+ { "name": "PreloaderScene", "kind": "class", "location": "src/game/scenes/PreloaderScene.ts" },
126
+ { "name": "MainScene", "kind": "class", "location": "src/game/scenes/MainScene.ts" },
127
+ { "name": "ViewportManager", "kind": "class", "location": "src/game/utils/ViewportManager.ts" },
128
+ { "name": "AssetLoader", "kind": "class", "location": "src/game/utils/AssetLoader.ts" }
129
+ ],
130
+ "neutralDescriptor": {
131
+ "geometry": "3D WebGL game engine runtime with complete project skeleton: scene lifecycle manager (Preloader→Main), PBR rendering pipeline (shadows, tone mapping), responsive viewport (ResizeObserver), asset loading (Texture/GLTF/Audio/CubeTexture), OrbitControls",
132
+ "layers": ["rendering", "scene-management", "input-system", "responsive-viewport", "asset-loading", "project-scaffold"],
133
+ "replaceable": ["camera type/position", "lighting setup", "scene list", "background color", "tone mapping", "renderer settings"]
134
+ },
135
+ "usageHints": [
136
+ "本 skill 提供完整 Three.js 空项目骨架(15 个文件),包含 package.json + webpack.config.js,scaffold 后 pnpm install && pnpm dev 即可运行",
137
+ "项目结构:package.json / webpack.config.js / tsconfig.json / globals.d.ts + src/ (12个源文件) + assets/models/ + assets/textures/ + assets/sounds/",
138
+ "场景生命周期:PreloaderScene(资源加载 + HTML 进度条)→ MainScene(主游戏场景)",
139
+ "BaseScene 抽象类提供 onInit/onEnter/onUpdate/onExit/onDispose 五个可覆盖方法",
140
+ "ViewportManager 使用 ResizeObserver 自动处理窗口大小变化,无需刷新页面",
141
+ "AssetLoader 支持 Texture/GLTF/Audio/CubeTexture 四种资源类型的批量加载 + 进度回调",
142
+ "PBR 渲染管线:ACES Filmic 色调映射 + PCF 软阴影 + HiDPI 像素比限制",
143
+ "globals.d.ts 已包含 3D 模型(glb/gltf/fbx/obj)和 HDR/EXR 环境贴图的模块声明",
144
+ "GameConfig.enableOrbitControls 控制 OrbitControls 开关,带阻尼平滑",
145
+ "assets/ 目录约定:assets/models/(3D 模型)+ assets/textures/(贴图)+ assets/sounds/(音频),webpack alias 已配置为 'assets' 短路径"
146
+ ],
147
+ "files": {
148
+ "skill": "SKILL.md",
149
+ "mainEntry": "ref/main.ts",
150
+ "html": "ref/index.html",
151
+ "css": "ref/index.css",
152
+ "globals": "ref/globals.d.ts",
153
+ "tsconfig": "ref/tsconfig.json",
154
+ "packageJson": "ref/package.json",
155
+ "webpackConfig": "ref/webpack.config.js",
156
+ "gameEntry": "ref/index.ts",
157
+ "gameConfig": "ref/GameConfig.ts",
158
+ "sceneKeys": "ref/SceneKeys.ts",
159
+ "sceneManager": "ref/SceneManager.ts",
160
+ "baseScene": "ref/BaseScene.ts",
161
+ "preloaderScene": "ref/PreloaderScene.ts",
162
+ "mainScene": "ref/MainScene.ts",
163
+ "viewportManager": "ref/ViewportManager.ts",
164
+ "assetLoader": "ref/AssetLoader.ts"
165
+ }
166
+ }