summer-engine 3.0.0 → 3.2.0

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 (413) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +27 -5
  3. package/.codex-plugin/plugin.json +28 -6
  4. package/.cursor-plugin/plugin.json +27 -5
  5. package/.factory-plugin/plugin.json +27 -5
  6. package/.opencode/plugins/summer.js +1 -1
  7. package/CHANGELOG.md +120 -0
  8. package/README.md +22 -7
  9. package/assets/audit/scene_audit.gd +4136 -0
  10. package/assets/seeing/seeing_probe.gd +1873 -0
  11. package/dist/cli/commands/setup.js +6 -19
  12. package/dist/cli/commands/skills.js +57 -32
  13. package/dist/core/api-client.d.ts +9 -1
  14. package/dist/core/api-client.js +21 -4
  15. package/dist/core/capabilities/agent-playbook.js +46 -0
  16. package/dist/core/capabilities/audit/accept.d.ts +55 -0
  17. package/dist/core/capabilities/audit/accept.js +147 -0
  18. package/dist/core/capabilities/audit/args.d.ts +95 -0
  19. package/dist/core/capabilities/audit/args.js +89 -0
  20. package/dist/core/capabilities/audit/audit.d.ts +56 -0
  21. package/dist/core/capabilities/audit/audit.js +287 -0
  22. package/dist/core/capabilities/audit/frame.d.ts +14 -0
  23. package/dist/core/capabilities/audit/frame.js +35 -0
  24. package/dist/core/capabilities/audit/gaps.d.ts +96 -0
  25. package/dist/core/capabilities/audit/gaps.js +257 -0
  26. package/dist/core/capabilities/audit/judge.d.ts +162 -0
  27. package/dist/core/capabilities/audit/judge.js +1134 -0
  28. package/dist/core/capabilities/audit/math.d.ts +110 -0
  29. package/dist/core/capabilities/audit/math.js +263 -0
  30. package/dist/core/capabilities/audit/summary.d.ts +74 -0
  31. package/dist/core/capabilities/audit/summary.js +212 -0
  32. package/dist/core/capabilities/board.d.ts +31 -0
  33. package/dist/core/capabilities/board.js +43 -0
  34. package/dist/core/capabilities/camera-view.d.ts +4 -2
  35. package/dist/core/capabilities/camera-view.js +6 -3
  36. package/dist/core/capabilities/connect-signal.d.ts +85 -0
  37. package/dist/core/capabilities/connect-signal.js +285 -0
  38. package/dist/core/capabilities/engine-fallbacks.d.ts +5 -0
  39. package/dist/core/capabilities/engine-fallbacks.js +5 -0
  40. package/dist/core/capabilities/engine-ops.d.ts +5 -1
  41. package/dist/core/capabilities/engine-ops.js +0 -3
  42. package/dist/core/capabilities/engine-receipt.d.ts +12 -0
  43. package/dist/core/capabilities/engine-receipt.js +26 -0
  44. package/dist/core/capabilities/file-read.d.ts +64 -0
  45. package/dist/core/capabilities/file-read.js +325 -0
  46. package/dist/core/capabilities/game-task-plan.js +4 -2
  47. package/dist/core/capabilities/grep.d.ts +60 -0
  48. package/dist/core/capabilities/grep.js +190 -0
  49. package/dist/core/capabilities/inspect-node.d.ts +56 -0
  50. package/dist/core/capabilities/inspect-node.js +225 -0
  51. package/dist/core/capabilities/inspect-resource.d.ts +61 -0
  52. package/dist/core/capabilities/inspect-resource.js +376 -0
  53. package/dist/core/capabilities/math3d.d.ts +28 -0
  54. package/dist/core/capabilities/math3d.js +88 -0
  55. package/dist/core/capabilities/motion-generation.d.ts +62 -0
  56. package/dist/core/capabilities/motion-generation.js +138 -0
  57. package/dist/core/capabilities/placement-batch.d.ts +102 -0
  58. package/dist/core/capabilities/placement-batch.js +483 -0
  59. package/dist/core/capabilities/placement-math.d.ts +70 -0
  60. package/dist/core/capabilities/placement-math.js +209 -0
  61. package/dist/core/capabilities/placement-script.d.ts +42 -0
  62. package/dist/core/capabilities/placement-script.js +1096 -0
  63. package/dist/core/capabilities/placement.d.ts +485 -0
  64. package/dist/core/capabilities/placement.js +1731 -0
  65. package/dist/core/capabilities/project-context.d.ts +33 -2
  66. package/dist/core/capabilities/project-context.js +87 -4
  67. package/dist/core/capabilities/replace-node.d.ts +91 -0
  68. package/dist/core/capabilities/replace-node.js +423 -0
  69. package/dist/core/capabilities/runtime-control.d.ts +20 -4
  70. package/dist/core/capabilities/runtime-control.js +67 -2
  71. package/dist/core/capabilities/scene-batch.d.ts +63 -0
  72. package/dist/core/capabilities/scene-batch.js +394 -0
  73. package/dist/core/capabilities/scene-readback.d.ts +36 -0
  74. package/dist/core/capabilities/scene-readback.js +54 -0
  75. package/dist/core/capabilities/seeing/args.d.ts +348 -0
  76. package/dist/core/capabilities/seeing/args.js +178 -0
  77. package/dist/core/capabilities/seeing/candidates.d.ts +127 -0
  78. package/dist/core/capabilities/seeing/candidates.js +282 -0
  79. package/dist/core/capabilities/seeing/math.d.ts +134 -0
  80. package/dist/core/capabilities/seeing/math.js +269 -0
  81. package/dist/core/capabilities/seeing/probe.d.ts +62 -0
  82. package/dist/core/capabilities/seeing/probe.js +188 -0
  83. package/dist/core/capabilities/seeing/scoring.d.ts +235 -0
  84. package/dist/core/capabilities/seeing/scoring.js +639 -0
  85. package/dist/core/capabilities/seeing/seeing.d.ts +233 -0
  86. package/dist/core/capabilities/seeing/seeing.js +1341 -0
  87. package/dist/core/capabilities/seeing/shot-store.d.ts +52 -0
  88. package/dist/core/capabilities/seeing/shot-store.js +204 -0
  89. package/dist/core/capabilities/surface-snap-mesh.d.ts +88 -0
  90. package/dist/core/capabilities/surface-snap-mesh.js +425 -0
  91. package/dist/core/capabilities/surface-snap.d.ts +77 -0
  92. package/dist/core/capabilities/surface-snap.js +461 -0
  93. package/dist/core/capabilities/tool-dispatch.js +231 -72
  94. package/dist/core/capabilities/tscn.d.ts +85 -0
  95. package/dist/core/capabilities/tscn.js +391 -0
  96. package/dist/core/capabilities/world-snapshot.d.ts +58 -0
  97. package/dist/core/capabilities/world-snapshot.js +150 -0
  98. package/dist/core/capability-skew.d.ts +5 -5
  99. package/dist/core/capability-skew.js +14 -6
  100. package/dist/core/headless/worker-engine-client.d.ts +1 -1
  101. package/dist/core/headless/worker-engine-client.js +2 -2
  102. package/dist/core/library-read.d.ts +37 -5
  103. package/dist/core/library-read.js +264 -33
  104. package/dist/core/library-search.d.ts +2 -2
  105. package/dist/core/skills-registry.d.ts +9 -1
  106. package/dist/core/skills-registry.js +25 -2
  107. package/dist/installer/agent-config.d.ts +9 -4
  108. package/dist/installer/agent-config.js +194 -392
  109. package/dist/installer/agent-table.d.ts +119 -0
  110. package/dist/installer/agent-table.js +619 -0
  111. package/dist/installer/setup.js +4 -2
  112. package/dist/installer/skill-locations.d.ts +8 -17
  113. package/dist/installer/skill-locations.js +22 -101
  114. package/dist/installer/version-check.d.ts +5 -1
  115. package/dist/installer/version-check.js +38 -28
  116. package/dist/mcp/server.js +9 -3
  117. package/dist/mcp/tools/asset-tools.js +21 -3
  118. package/dist/mcp/tools/audit-tools.d.ts +23 -0
  119. package/dist/mcp/tools/audit-tools.js +60 -0
  120. package/dist/mcp/tools/debug-tools.js +3 -1
  121. package/dist/mcp/tools/file-tools.js +17 -4
  122. package/dist/mcp/tools/generate-tools.js +74 -66
  123. package/dist/mcp/tools/library-tools.js +2 -0
  124. package/dist/mcp/tools/perception-tools.js +6 -19
  125. package/dist/mcp/tools/placement-tools.d.ts +24 -0
  126. package/dist/mcp/tools/placement-tools.js +91 -0
  127. package/dist/mcp/tools/project-tools.js +18 -15
  128. package/dist/mcp/tools/scene-tools.js +71 -83
  129. package/dist/mcp/tools/seeing-tools.d.ts +24 -0
  130. package/dist/mcp/tools/seeing-tools.js +64 -0
  131. package/dist/mcp/tools/spatial-tools.js +17 -9
  132. package/dist/mcp/tools/visual-tools.js +59 -7
  133. package/gemini-extension.json +26 -4
  134. package/integrations/README.md +48 -19
  135. package/integrations/amp/README.md +12 -0
  136. package/integrations/amp/manifest-target.json +3 -0
  137. package/integrations/antigravity/README.md +12 -0
  138. package/integrations/antigravity/manifest-target.json +3 -0
  139. package/integrations/claude-desktop/README.md +12 -0
  140. package/integrations/claude-desktop/manifest-target.json +3 -0
  141. package/integrations/cline/README.md +8 -9
  142. package/integrations/cline-cli/README.md +12 -0
  143. package/integrations/cline-cli/manifest-target.json +3 -0
  144. package/integrations/copilot-jetbrains/README.md +12 -0
  145. package/integrations/copilot-jetbrains/manifest-target.json +3 -0
  146. package/integrations/crush/README.md +12 -0
  147. package/integrations/crush/manifest-target.json +3 -0
  148. package/integrations/github-copilot/README.md +8 -8
  149. package/integrations/goose/README.md +12 -0
  150. package/integrations/goose/manifest-target.json +3 -0
  151. package/integrations/grok-build/README.md +12 -0
  152. package/integrations/grok-build/manifest-target.json +3 -0
  153. package/integrations/hermes/README.md +12 -0
  154. package/integrations/hermes/manifest-target.json +3 -0
  155. package/integrations/junie/README.md +12 -0
  156. package/integrations/junie/manifest-target.json +3 -0
  157. package/integrations/kilo-code/README.md +6 -10
  158. package/integrations/kimi-code/README.md +12 -0
  159. package/integrations/kimi-code/manifest-target.json +3 -0
  160. package/integrations/kiro/README.md +12 -0
  161. package/integrations/kiro/manifest-target.json +3 -0
  162. package/integrations/lm-studio/README.md +8 -8
  163. package/integrations/mistral-vibe/README.md +12 -0
  164. package/integrations/mistral-vibe/manifest-target.json +3 -0
  165. package/integrations/opencode/README.md +9 -12
  166. package/integrations/qoder/README.md +12 -0
  167. package/integrations/qoder/manifest-target.json +3 -0
  168. package/integrations/qwen-code/README.md +12 -0
  169. package/integrations/qwen-code/manifest-target.json +3 -0
  170. package/integrations/roo-code/README.md +8 -7
  171. package/integrations/rovo-dev/README.md +12 -0
  172. package/integrations/rovo-dev/manifest-target.json +3 -0
  173. package/integrations/trae/README.md +12 -0
  174. package/integrations/trae/manifest-target.json +3 -0
  175. package/integrations/visual-studio/README.md +12 -0
  176. package/integrations/visual-studio/manifest-target.json +3 -0
  177. package/integrations/vscode-copilot/README.md +9 -9
  178. package/integrations/warp/README.md +12 -0
  179. package/integrations/warp/manifest-target.json +3 -0
  180. package/integrations/windsurf/README.md +8 -9
  181. package/integrations/zed/README.md +12 -0
  182. package/integrations/zed/manifest-target.json +3 -0
  183. package/library/references/mcp-tools-reference/mcp-tools-reference.md +59 -15
  184. package/library/references/mcp-tools-reference/resource.yaml +1 -1
  185. package/library/references/summer-folder/resource.yaml +1 -1
  186. package/library/references/summer-folder/summer-folder.md +1 -1
  187. package/library/skills/3d-lighting/SKILL.md +1 -1
  188. package/library/skills/README.md +264 -0
  189. package/library/skills/adaptive-music/SKILL.md +1 -1
  190. package/library/skills/agent-playtesting/SKILL.md +1 -1
  191. package/library/skills/ai-characters-in-games/SKILL.md +220 -0
  192. package/library/skills/ai-characters-in-games/resource.yaml +30 -0
  193. package/library/skills/ambient-bed/SKILL.md +1 -1
  194. package/library/skills/animated-loop/SKILL.md +1 -1
  195. package/library/skills/animation-tree/SKILL.md +1 -1
  196. package/library/skills/art-direction/SKILL.md +1 -1
  197. package/library/skills/asset-strategy/SKILL.md +2 -1
  198. package/library/skills/asset-strategy/resource.yaml +2 -1
  199. package/library/skills/audio-direction/SKILL.md +1 -1
  200. package/library/skills/auto-fire-targeting/SKILL.md +1 -1
  201. package/library/skills/brainstorm-game/SKILL.md +1 -1
  202. package/library/skills/brainstorming/SKILL.md +1 -1
  203. package/library/skills/browse-templates/SKILL.md +3 -3
  204. package/library/skills/browse-templates/resource.yaml +1 -1
  205. package/library/skills/camera-rigs/SKILL.md +128 -0
  206. package/library/skills/camera-rigs/resource.yaml +29 -0
  207. package/library/skills/celeste-momentum-platforming/SKILL.md +1 -1
  208. package/library/skills/character-animation-wiring/SKILL.md +1 -1
  209. package/library/skills/character-model/SKILL.md +1 -1
  210. package/library/skills/character-movement/SKILL.md +326 -0
  211. package/library/skills/character-movement/references/default-third-person-controller.gd +201 -0
  212. package/library/skills/character-movement/references/default-third-person-verification-probe.gd +154 -0
  213. package/library/skills/character-movement/references/movement-3d.md +136 -0
  214. package/library/skills/character-movement/references/platformer-feel.md +83 -0
  215. package/library/skills/character-movement/resource.yaml +40 -0
  216. package/library/skills/character-portrait/SKILL.md +1 -1
  217. package/library/skills/cinematic-cutscene/SKILL.md +1 -1
  218. package/library/skills/combat-basics/SKILL.md +159 -0
  219. package/library/skills/combat-basics/references/projectiles-and-aoe.md +100 -0
  220. package/library/skills/combat-basics/resource.yaml +34 -0
  221. package/library/skills/concept-art/SKILL.md +1 -1
  222. package/library/skills/create-asset-sheet/SKILL.md +1 -1
  223. package/library/skills/debug/SKILL.md +1 -1
  224. package/library/skills/debugging-game-feel/SKILL.md +1 -1
  225. package/library/skills/design-level/SKILL.md +1 -1
  226. package/library/skills/design-mechanic/SKILL.md +1 -1
  227. package/library/skills/design-npc/SKILL.md +1 -1
  228. package/library/skills/diagnosing-perf-regressions/SKILL.md +1 -1
  229. package/library/skills/dispatching-parallel-agents/SKILL.md +1 -1
  230. package/library/skills/driving-the-editor-ui/SKILL.md +1 -1
  231. package/library/skills/environment-kit/SKILL.md +1 -1
  232. package/library/skills/export-and-ship/SKILL.md +1 -1
  233. package/library/skills/fabricating-assets/SKILL.md +1 -1
  234. package/library/skills/facial-and-lipsync/SKILL.md +1 -1
  235. package/library/skills/fps-controller/SKILL.md +9 -7
  236. package/library/skills/fps-controller/resource.yaml +4 -1
  237. package/library/skills/game-feel/SKILL.md +1 -1
  238. package/library/skills/gameskill/SKILL.md +1 -1
  239. package/library/skills/gdscript-patterns/SKILL.md +1 -1
  240. package/library/skills/generate-motion/SKILL.md +9 -9
  241. package/library/skills/generate-motion/resource.yaml +2 -1
  242. package/library/skills/godogen-visual-proof-game-generation/SKILL.md +1 -1
  243. package/library/skills/headless-scripting/SKILL.md +1 -1
  244. package/library/skills/in-game-purchases/SKILL.md +254 -0
  245. package/library/skills/in-game-purchases/resource.yaml +29 -0
  246. package/library/skills/instantiate-asset-pack/SKILL.md +1 -1
  247. package/library/skills/investigating-bugs/SKILL.md +1 -1
  248. package/library/skills/lumera-single-image-scene-reconstruction/SKILL.md +1 -1
  249. package/library/skills/make-game/SKILL.md +25 -3
  250. package/library/skills/make-game/references/2d-platformer-polish.md +93 -0
  251. package/library/skills/make-game/references/2d-platformer.md +117 -0
  252. package/library/skills/make-game/references/2d-rpg-content.md +234 -0
  253. package/library/skills/make-game/references/2d-rpg.md +241 -0
  254. package/library/skills/make-game/references/2d-survivors-progression.md +201 -0
  255. package/library/skills/make-game/references/2d-survivors.md +237 -0
  256. package/library/skills/make-game/references/3d-fps-systems.md +216 -0
  257. package/library/skills/make-game/references/3d-fps.md +177 -0
  258. package/library/skills/make-game/references/3d-horror-systems.md +186 -0
  259. package/library/skills/make-game/references/3d-horror.md +201 -0
  260. package/library/skills/make-game/references/3d-third-person-systems.md +220 -0
  261. package/library/skills/make-game/references/3d-third-person.md +215 -0
  262. package/library/skills/make-game/resource.yaml +6 -1
  263. package/library/skills/multiplayer/SKILL.md +150 -0
  264. package/library/skills/multiplayer/resource.yaml +33 -0
  265. package/library/skills/multiplayer-movement/SKILL.md +510 -0
  266. package/library/skills/multiplayer-movement/files.md +501 -0
  267. package/library/skills/multiplayer-movement/resource.yaml +30 -0
  268. package/library/skills/multiplayer-project/SKILL.md +521 -0
  269. package/library/skills/multiplayer-project/files.md +448 -0
  270. package/library/skills/multiplayer-project/resource.yaml +36 -0
  271. package/library/skills/multiplayer-publish/SKILL.md +229 -0
  272. package/library/skills/multiplayer-publish/export-errors.md +89 -0
  273. package/library/skills/multiplayer-publish/resource.yaml +28 -0
  274. package/library/skills/multiplayer-state/SKILL.md +438 -0
  275. package/library/skills/multiplayer-state/files.md +592 -0
  276. package/library/skills/multiplayer-state/resource.yaml +35 -0
  277. package/library/skills/multiplayer-testing/SKILL.md +236 -0
  278. package/library/skills/multiplayer-testing/resource.yaml +39 -0
  279. package/library/skills/music-track/SKILL.md +1 -1
  280. package/library/skills/navigate-summer/SKILL.md +1 -1
  281. package/library/skills/new-project/SKILL.md +1 -1
  282. package/library/skills/organic-model/SKILL.md +1 -1
  283. package/library/skills/pixel-art/SKILL.md +1 -1
  284. package/library/skills/play/SKILL.md +1 -1
  285. package/library/skills/playtesting-a-feature/SKILL.md +1 -1
  286. package/library/skills/procedural-animation/SKILL.md +2 -2
  287. package/library/skills/procedural-animation/resource.yaml +1 -1
  288. package/library/skills/prop-model/SKILL.md +1 -1
  289. package/library/skills/psx-retro-rendering/SKILL.md +1 -1
  290. package/library/skills/realtime-wet-surfaces/SKILL.md +2 -2
  291. package/library/skills/remote-deploy/SKILL.md +1 -1
  292. package/library/skills/retarget/SKILL.md +1 -1
  293. package/library/skills/running-in-the-cloud/SKILL.md +1 -1
  294. package/library/skills/save-load/SKILL.md +156 -0
  295. package/library/skills/save-load/resource.yaml +27 -0
  296. package/library/skills/scene-composition/SKILL.md +1 -1
  297. package/library/skills/scene-hierarchy-design/SKILL.md +1 -1
  298. package/library/skills/scene-scripting/SKILL.md +1 -1
  299. package/library/skills/scene-to-level/SKILL.md +1 -1
  300. package/library/skills/skill-create/SKILL.md +1 -1
  301. package/library/skills/skill-improve/SKILL.md +1 -1
  302. package/library/skills/skill-test/SKILL.md +1 -1
  303. package/library/skills/skintokens-auto-rigging/SKILL.md +1 -1
  304. package/library/skills/skybox-panorama/SKILL.md +1 -1
  305. package/library/skills/sound-effect/SKILL.md +1 -1
  306. package/library/skills/spatial-placement/SKILL.md +134 -3
  307. package/library/skills/spatial-placement/references/kit-placement-tools.md +364 -0
  308. package/library/skills/spatial-placement/resource.yaml +16 -2
  309. package/library/skills/sprite-sheet/SKILL.md +1 -1
  310. package/library/skills/summer-analytics/SKILL.md +147 -0
  311. package/library/skills/summer-analytics/resource.yaml +28 -0
  312. package/library/skills/summer-friends/SKILL.md +226 -0
  313. package/library/skills/summer-friends/resource.yaml +28 -0
  314. package/library/skills/summer-leaderboards/SKILL.md +231 -0
  315. package/library/skills/summer-leaderboards/resource.yaml +30 -0
  316. package/library/skills/summer-match-results/SKILL.md +286 -0
  317. package/library/skills/summer-match-results/resource.yaml +32 -0
  318. package/library/skills/summer-matchmaking/SKILL.md +301 -0
  319. package/library/skills/summer-matchmaking/resource.yaml +32 -0
  320. package/library/skills/summer-parties/SKILL.md +253 -0
  321. package/library/skills/summer-parties/resource.yaml +30 -0
  322. package/library/skills/summer-player-data/SKILL.md +322 -0
  323. package/library/skills/summer-player-data/resource.yaml +30 -0
  324. package/library/skills/summer-store/SKILL.md +271 -0
  325. package/library/skills/summer-store/resource.yaml +29 -0
  326. package/library/skills/summer-world-chat/SKILL.md +195 -0
  327. package/library/skills/summer-world-chat/resource.yaml +30 -0
  328. package/library/skills/summer-world-saves/SKILL.md +284 -0
  329. package/library/skills/summer-world-saves/resource.yaml +29 -0
  330. package/library/skills/text-to-motion/SKILL.md +99 -0
  331. package/library/skills/text-to-motion/prompts-and-controls.md +34 -0
  332. package/library/skills/text-to-motion/resource.yaml +41 -0
  333. package/library/skills/text-to-motion/rigging-for-text-motion.md +54 -0
  334. package/library/skills/tileable-texture/SKILL.md +1 -1
  335. package/library/skills/trailer-shot/SKILL.md +1 -1
  336. package/library/skills/tune-performance/SKILL.md +1 -1
  337. package/library/skills/ui-basics/SKILL.md +10 -1
  338. package/library/skills/ui-graphics/SKILL.md +1 -1
  339. package/library/skills/use-widget-asset/SKILL.md +1 -1
  340. package/library/skills/using-summer/SKILL.md +2 -2
  341. package/library/skills/using-summer/resource.yaml +2 -2
  342. package/library/skills/vehicle-model/SKILL.md +1 -1
  343. package/library/skills/verification-before-completion/SKILL.md +1 -1
  344. package/library/skills/verifying-scenes/SKILL.md +76 -2
  345. package/library/skills/verifying-scenes/resource.yaml +13 -2
  346. package/library/skills/vfx-dissolve/SKILL.md +1 -1
  347. package/library/skills/vfx-fire/SKILL.md +1 -1
  348. package/library/skills/vfx-hit-spark/SKILL.md +1 -1
  349. package/library/skills/vfx-lightning/SKILL.md +1 -1
  350. package/library/skills/vfx-magic-glow/SKILL.md +1 -1
  351. package/library/skills/vfx-muzzle-flash/SKILL.md +1 -1
  352. package/library/skills/vfx-smoke/SKILL.md +1 -1
  353. package/library/skills/vfx-water-ripple/SKILL.md +1 -1
  354. package/library/skills/voice-line/SKILL.md +1 -1
  355. package/library/skills/web-and-touch-input/SKILL.md +38 -0
  356. package/library/skills/web-and-touch-input/resource.yaml +28 -0
  357. package/library/skills/web-compatibility-look/SKILL.md +62 -0
  358. package/library/skills/web-compatibility-look/resource.yaml +30 -0
  359. package/library/skills/world-building-3d/SKILL.md +8 -1
  360. package/library/skills/world-building-3d/references/spatial-tools.md +1 -1
  361. package/library/skills/world-building-3d/resource.yaml +2 -1
  362. package/library/skills/writing-plans/SKILL.md +1 -1
  363. package/library/skills/writing-skills/SKILL.md +1 -1
  364. package/library/templates/3d-lan-multiplayer-starter/resource.yaml +2 -2
  365. package/library/tools/attach-to-surface/resource.yaml +142 -0
  366. package/library/tools/batch/resource.yaml +9 -3
  367. package/library/tools/connect-ports/resource.yaml +120 -0
  368. package/library/tools/connect-signal/resource.yaml +3 -2
  369. package/library/tools/debug-views/resource.yaml +94 -0
  370. package/library/tools/frame-nodes/resource.yaml +104 -0
  371. package/library/tools/frame-shot/resource.yaml +134 -0
  372. package/library/tools/generate-motion/resource.yaml +44 -9
  373. package/library/tools/get-board/resource.yaml +50 -0
  374. package/library/tools/get-project-context/resource.yaml +13 -2
  375. package/library/tools/grep/resource.yaml +77 -0
  376. package/library/tools/inspect-asset/resource.yaml +71 -0
  377. package/library/tools/inspect-node/resource.yaml +9 -2
  378. package/library/tools/inspect-resource/resource.yaml +16 -5
  379. package/library/tools/instantiate-scene/resource.yaml +27 -2
  380. package/library/tools/measure/resource.yaml +96 -0
  381. package/library/tools/place-adjacent/resource.yaml +113 -0
  382. package/library/tools/play/resource.yaml +15 -2
  383. package/library/tools/raycast/resource.yaml +101 -0
  384. package/library/tools/read-file/resource.yaml +36 -2
  385. package/library/tools/read-library/resource.yaml +2 -2
  386. package/library/tools/repeat-along/resource.yaml +129 -0
  387. package/library/tools/replace-node/resource.yaml +11 -5
  388. package/library/tools/scene-audit/resource.yaml +144 -0
  389. package/library/tools/screenshot/resource.yaml +13 -2
  390. package/library/tools/search-assets/resource.yaml +18 -0
  391. package/library/tools/shot-sheet/resource.yaml +110 -0
  392. package/library/tools/snap-to-surface/resource.yaml +4 -1
  393. package/library/tools/world-snapshot/resource.yaml +24 -3
  394. package/library/tools/zoom/resource.yaml +105 -0
  395. package/package.json +3 -3
  396. package/registry/generated/aliases.json +17 -3
  397. package/registry/generated/counts.json +3 -3
  398. package/registry/generated/gemini-extension.json +26 -4
  399. package/registry/generated/index.json +2154 -469
  400. package/registry/generated/marketplace.claude.json +2 -2
  401. package/registry/generated/plugin.claude.json +27 -5
  402. package/registry/generated/plugin.codex.json +28 -6
  403. package/registry/generated/plugin.cursor.json +27 -5
  404. package/registry/generated/plugin.factory.json +27 -5
  405. package/registry/generated/skills-index.md +264 -0
  406. package/registry/generated/skills-registry.json +901 -206
  407. package/registry/generated/templates-registry.json +2 -2
  408. package/library/skills/host-authoritative-state/SKILL.md +0 -332
  409. package/library/skills/host-authoritative-state/resource.yaml +0 -28
  410. package/library/skills/peer-to-peer-multiplayer/SKILL.md +0 -373
  411. package/library/skills/peer-to-peer-multiplayer/resource.yaml +0 -28
  412. package/library/skills/setup-multiplayer/SKILL.md +0 -336
  413. package/library/skills/setup-multiplayer/resource.yaml +0 -28
@@ -0,0 +1,136 @@
1
+ # 3D Controllers: First + Third Person
2
+
3
+ Both build on the minimal 3D walk in SKILL.md. The difference is entirely the
4
+ camera rig and how look rotation is split across nodes.
5
+
6
+ ## First-person node layout (non-negotiable)
7
+
8
+ ```
9
+ Player (CharacterBody3D) # yaw (horizontal look) rotates THIS
10
+ CollisionShape3D # CapsuleShape3D, radius 0.35, height 1.8
11
+ Head (Node3D) # y = 1.5; pitch (vertical look) rotates THIS
12
+ Camera3D # fov 70-75
13
+ WeaponHolder (Node3D) # weapons/tools ride here
14
+ ```
15
+
16
+ Yaw on the body, pitch on the Head. Never pitch the body (gimbal lock + physics
17
+ tilt). Camera is a child of Head so it inherits both rotations.
18
+
19
+ ```gdscript
20
+ extends CharacterBody3D
21
+
22
+ @export var speed: float = 5.0
23
+ @export var sprint_speed: float = 8.0
24
+ @export var jump_velocity: float = 4.5
25
+ @export var mouse_sensitivity: float = 0.002
26
+
27
+ @onready var head: Node3D = $Head
28
+ var gravity: float = ProjectSettings.get_setting("physics/3d/default_gravity")
29
+
30
+ func _ready() -> void:
31
+ Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
32
+
33
+ func _unhandled_input(event: InputEvent) -> void:
34
+ if event is InputEventMouseMotion:
35
+ rotate_y(-event.relative.x * mouse_sensitivity)
36
+ head.rotate_x(-event.relative.y * mouse_sensitivity)
37
+ head.rotation.x = clampf(head.rotation.x, -PI / 2.0, PI / 2.0)
38
+ if event.is_action_pressed("ui_cancel"):
39
+ Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
40
+
41
+ func _physics_process(delta: float) -> void:
42
+ if not is_on_floor():
43
+ velocity.y -= gravity * delta
44
+ if Input.is_action_just_pressed("jump") and is_on_floor():
45
+ velocity.y = jump_velocity
46
+ var cur_speed := sprint_speed if Input.is_action_pressed("sprint") else speed
47
+ var input_dir := Input.get_vector("move_left", "move_right", "move_forward", "move_back")
48
+ var direction := (transform.basis * Vector3(input_dir.x, 0.0, input_dir.y)).normalized()
49
+ if direction:
50
+ velocity.x = direction.x * cur_speed
51
+ velocity.z = direction.z * cur_speed
52
+ else:
53
+ velocity.x = move_toward(velocity.x, 0.0, cur_speed)
54
+ velocity.z = move_toward(velocity.z, 0.0, cur_speed)
55
+ move_and_slide()
56
+ ```
57
+
58
+ ## Crouch
59
+
60
+ Keep two collision shapes (standing + crouching), toggle `disabled`, and a
61
+ `RayCast3D` pointing up (`CeilingCheck`) so you cannot stand up under a ceiling.
62
+ Lerp the Head y from 1.5 to ~0.9 for a smooth crouch, not a snap.
63
+
64
+ ## Headbob (optional polish)
65
+
66
+ Drive the Camera's local y with `sin(time * bob_freq) * bob_amp` scaled by
67
+ horizontal speed, only while `is_on_floor()`. Keep amp under 0.08 or it nauseates.
68
+
69
+ ## Third-person node layout
70
+
71
+ ```
72
+ Player (CharacterBody3D)
73
+ CharacterRotationRoot (Node3D) # only this visual node yaws toward movement
74
+ character.tscn # normalized role-neutral visual package
75
+ CameraController (Node3D)
76
+ SpringArm3D # extends behind the -Z-facing visual on local +Z
77
+ Camera3D
78
+ ```
79
+
80
+ The `SpringArm3D` is the whole trick: it raycasts from the pivot to the camera
81
+ and shortens when a wall is in the way, so the camera never clips into geometry.
82
+ Set its `collision_mask` to your Level layer only (not the player).
83
+
84
+ Third-person differences from FPS:
85
+ - Mouse motion rotates the `CameraController` (orbit), not the body.
86
+ - The visual wrapper rotates to face the MOVEMENT direction, decoupled from the camera.
87
+ Because imported characters face Godot forward `-Z`, lerp
88
+ `CharacterRotationRoot.rotation.y` toward `atan2(-direction.x, -direction.z)`.
89
+ - Rotate only `CharacterRotationRoot.rotation.y`. Do not yaw the CharacterBody3D or add a
90
+ compensating 180-degree model rotation. The package already normalizes forward to `-Z`.
91
+ - Keep the third-person camera behind the character on the camera rig's local `+Z` side.
92
+ - Camera direction drives movement basis: build `direction` from the spring-arm's
93
+ global basis, flattened to the XZ plane, so "forward" means "where the camera
94
+ looks".
95
+
96
+ ## Canonical humanoid animation states
97
+
98
+ Keep translation in the controller and use package animations only as in-place visuals.
99
+ For a standard playable third-person character, read and copy
100
+ `default-third-person-controller.gd`. It already loads exact semantic roles
101
+ from `character.json`, selects state after `move_and_slide()`, gives airborne
102
+ Jump highest priority, changes clips only when state changes, uses camera-relative
103
+ movement, and turns only the normalized `-Z` visual root. Do not reassemble the
104
+ controller from partial examples.
105
+
106
+ Do not advance the `CharacterBody3D` from animation root translation. Rotate only the
107
+ visual child when movement is non-zero, and keep the last facing direction while idle.
108
+
109
+ ## Legacy clip-name compatibility only
110
+
111
+ Use substring discovery only for old, non-package GLBs that have no manifest. Resolve Jump
112
+ before Run and claim each real clip at most once. Never use this for a canonical package:
113
+
114
+ ```gdscript
115
+ func resolve_legacy_roles(player: AnimationPlayer) -> Dictionary:
116
+ var result: Dictionary = {}
117
+ var used_clips: Dictionary = {}
118
+ for role in [&"jump", &"idle", &"walk", &"run"]: # Jump must precede Run.
119
+ for clip in player.get_animation_list():
120
+ if used_clips.has(clip):
121
+ continue
122
+ if String(clip).to_lower().contains(String(role)):
123
+ result[role] = clip
124
+ used_clips[clip] = true
125
+ break
126
+ return result
127
+ ```
128
+
129
+ Validate every requested role after legacy resolution. Do not fall back from Jump to Walk
130
+ or Run, and do not reuse one clip for multiple roles.
131
+
132
+ ## Shared traps
133
+
134
+ - Capture/release the mouse as a pair or you trap the player (see SKILL.md).
135
+ - Sprint reads an unbound `sprint` action = silent no-op; bind it first.
136
+ - Spring arm with the wrong mask collides with the player and jams at length 0.
@@ -0,0 +1,83 @@
1
+ # Platformer Feel
2
+
3
+ The base controller in SKILL.md runs, but a raw `is_on_floor()` jump feels stiff
4
+ and unforgiving. These four additions are what separate a prototype from a game
5
+ that feels good. Add them in this order; each is independent.
6
+
7
+ ## Coyote time
8
+
9
+ Let the player jump for a few frames AFTER walking off a ledge. Without it, jumps
10
+ near edges feel like the game ate the input.
11
+
12
+ ```gdscript
13
+ @export var coyote_time: float = 0.1
14
+ var _coyote_timer: float = 0.0
15
+
16
+ func _physics_process(delta: float) -> void:
17
+ if not is_on_floor():
18
+ velocity.y += gravity * delta
19
+ _coyote_timer -= delta
20
+ else:
21
+ _coyote_timer = coyote_time
22
+ # jump check uses _coyote_timer > 0.0 instead of is_on_floor()
23
+ ```
24
+
25
+ ## Jump buffering
26
+
27
+ If the player presses jump a few frames BEFORE landing, remember it and fire on
28
+ touchdown. Without it, fast players feel like jumps get dropped.
29
+
30
+ ```gdscript
31
+ @export var jump_buffer: float = 0.1
32
+ var _buffer_timer: float = 0.0
33
+
34
+ func _physics_process(delta: float) -> void:
35
+ if Input.is_action_just_pressed("jump"):
36
+ _buffer_timer = jump_buffer
37
+ _buffer_timer -= delta
38
+ if _buffer_timer > 0.0 and _coyote_timer > 0.0:
39
+ velocity.y = jump_velocity
40
+ _buffer_timer = 0.0
41
+ _coyote_timer = 0.0
42
+ ```
43
+
44
+ ## Variable jump height
45
+
46
+ Tap = short hop, hold = full jump. Cut upward velocity when the button releases.
47
+
48
+ ```gdscript
49
+ if Input.is_action_just_released("jump") and velocity.y < 0.0:
50
+ velocity.y *= 0.4
51
+ ```
52
+
53
+ ## Asymmetric gravity (fall faster than you rise)
54
+
55
+ A heavier fall gravity is the single biggest feel upgrade. Rising floaty, falling
56
+ snappy reads as responsive.
57
+
58
+ ```gdscript
59
+ @export var fall_multiplier: float = 1.6
60
+
61
+ func _physics_process(delta: float) -> void:
62
+ var g := gravity * (fall_multiplier if velocity.y > 0.0 else 1.0)
63
+ if not is_on_floor():
64
+ velocity.y += g * delta
65
+ ```
66
+
67
+ ## One-way platforms
68
+
69
+ Use a `CollisionPolygon2D`/`CollisionShape2D` on a platform with
70
+ `one_way_collision = true` in the platform's collision shape. Drop through by
71
+ briefly disabling the player's collision with that layer, or move the player to a
72
+ lower collision layer while `move_down` is held.
73
+
74
+ ## Tuning starting points
75
+
76
+ | Feel | speed | jump_velocity | gravity scale |
77
+ |------|-------|---------------|---------------|
78
+ | Tight/precise | 180 | -320 | 1.0 (fall 1.8) |
79
+ | Floaty/explorer | 220 | -420 | 0.7 (fall 1.3) |
80
+ | Fast/action | 300 | -380 | 1.0 (fall 2.0) |
81
+
82
+ Never ship default gravity 980 with a -350 jump and call it done - that is the
83
+ "why does my jump feel bad" default. Tune fall_multiplier first.
@@ -0,0 +1,40 @@
1
+ id: skill/character-movement
2
+ kind: skill
3
+ version: 1.2.1
4
+ summary: "Player controllers for 2D and 3D, plus the canonical third-person controller for Summer humanoid packages: movement owns translation, clips follow state."
5
+ use_when:
6
+ - building or fixing player movement — gravity, collision, side-scroller, top-down, or 3D walk
7
+ - wiring an imported Summer character package (character.tscn) as the playable third-person player
8
+ - walk, run, and jump animation states, facing, or mouse look for a player controller
9
+ - the jump feels bad — coyote time, jump buffering, variable jump height, one-way platforms
10
+ do_not_use_when:
11
+ - a production first-person shooter controller with air control and external velocity — use fps-controller
12
+ - Celeste-style momentum precision platforming with dash and wall climb — use celeste-momentum-platforming
13
+ facets:
14
+ lifecycle:
15
+ - build
16
+ domains:
17
+ - character-controller
18
+ - gameplay
19
+ - 2d
20
+ - 3d
21
+ modalities:
22
+ - scripts
23
+ - scenes
24
+ - animation
25
+ compatibility:
26
+ engine: ">=4.6"
27
+ related:
28
+ skills:
29
+ - skill/make-game
30
+ - skill/camera-rigs
31
+ - skill/combat-basics
32
+ - skill/fps-controller
33
+ - skill/celeste-momentum-platforming
34
+ - skill/character-animation-wiring
35
+ - skill/character-model
36
+ - skill/playtesting-a-feature
37
+ source: official
38
+ license: MIT
39
+ status: preview
40
+ recommended: false
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: character-portrait
3
- description: Use when generating a single, polished bust/portrait of a character for dialogue UI, character-select screens, lore cards, or codex entries. One character, locked composition, VN-style. Trigger on "character portrait", "dialogue portrait", "VN portrait", "character bust", "headshot", "character select image", "lore card art".
3
+ description: "Generate a single polished character bust for dialogue UI, character select, lore cards, or codex entries. One character, locked composition, VN-style."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: 2d-assets
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: cinematic-cutscene
3
- description: Use when generating a non-interactive cutscene clip — opening scene, story beat, character intro, ending. Locks the look with a reference image, image-to-videos a 5-10s shot, optionally adds TTS dialogue, and wires it as a VideoStreamPlayer that fades in/out. Trigger on "cutscene", "intro cinematic", "opening scene", "ending cinematic", "story beat video", "character intro video", "in-engine cinematic", "non-playable scene".
3
+ description: "Generate a non-interactive cutscene — reference-locked look, a 5-10s image-to-video shot, optional TTS dialogue — wired as a fading VideoStreamPlayer."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: video
@@ -0,0 +1,159 @@
1
+ ---
2
+ name: combat-basics
3
+ description: "Damage in Summer Engine: hitbox and hurtbox Areas on opposing layers, a reusable Health component, damage signals, knockback, hit feedback, projectiles."
4
+ license: MIT
5
+ compatibility: [Cursor, Claude Code, Codex, Windsurf, Gemini, OpenCode]
6
+ category: gameplay-mechanics
7
+ user-invocable: false
8
+ allowed-tools: Read Grep summer_read_file summer_write_file summer_replace_text summer_add_node summer_set_prop summer_batch summer_project_setting summer_save_scene summer_get_script_errors summer_get_diagnostics
9
+ paths: ["**/*.gd", "**/*.tscn"]
10
+ ---
11
+
12
+ # Combat Basics
13
+
14
+ The Godot combat pattern is hitbox + hurtbox + health, wired by signals. Build it
15
+ component-first: the same three pieces work for player, enemies, and destructibles.
16
+
17
+ ## The layer model (set this up first)
18
+
19
+ Attacks are `Area2D`/`Area3D`, not solid bodies. A hitbox (the attack) detects a
20
+ hurtbox (the thing that can be hurt) via collision layers/masks:
21
+
22
+ | Node | on layer | masks (detects) |
23
+ |------|----------|-----------------|
24
+ | Player hurtbox | PlayerHurt | EnemyHit |
25
+ | Player hitbox (sword) | PlayerHit | EnemyHurt |
26
+ | Enemy hurtbox | EnemyHurt | PlayerHit |
27
+ | Enemy hitbox | EnemyHit | PlayerHurt |
28
+
29
+ Rule: every combat Area masks only the OPPOSING side. This is why the player's
30
+ sword never damages the player. An Area reports `area_entered` only for areas on
31
+ a layer in its OWN mask, so the hurtbox below (which listens) must mask the
32
+ opposing hitbox layer; a hurtbox with an empty mask never registers a hit.
33
+
34
+ Name the layers once so you are not counting bits by hand —
35
+ `summer_project_setting(key="layer_names/2d_physics/layer_4", value="PlayerHit")`
36
+ (use `layer_names/3d_physics/...` for 3D), one call per layer.
37
+
38
+ ## Health component (reuse everywhere)
39
+
40
+ Attach to any damageable node. It owns HP and fires signals; UI and death logic
41
+ just listen.
42
+
43
+ ```gdscript
44
+ class_name Health extends Node
45
+
46
+ signal damaged(amount: int, current: int)
47
+ signal died
48
+
49
+ @export var max_health: int = 100
50
+ var current: int
51
+
52
+ func _ready() -> void:
53
+ current = max_health
54
+
55
+ func take_damage(amount: int) -> void:
56
+ if current <= 0:
57
+ return
58
+ current = maxi(0, current - amount)
59
+ damaged.emit(amount, current)
60
+ if current == 0:
61
+ died.emit()
62
+
63
+ func heal(amount: int) -> void:
64
+ current = mini(max_health, current + amount)
65
+ ```
66
+
67
+ ## Hurtbox -> Health
68
+
69
+ The hurtbox is an Area on the body; when a hitbox overlaps it, read the hitbox's
70
+ damage and route it to the Health node.
71
+
72
+ ```gdscript
73
+ extends Area2D # Hurtbox, child of the character
74
+
75
+ @export var health_path: NodePath
76
+ @onready var health: Health = get_node(health_path)
77
+
78
+ func _ready() -> void:
79
+ area_entered.connect(_on_area_entered)
80
+
81
+ func _on_area_entered(hitbox: Area2D) -> void:
82
+ if hitbox.has_method("get_damage"):
83
+ health.take_damage(hitbox.get_damage())
84
+ ```
85
+
86
+ ## Hitbox
87
+
88
+ ```gdscript
89
+ extends Area2D # Hitbox, child of weapon or attack
90
+
91
+ @export var damage: int = 10
92
+ func get_damage() -> int:
93
+ return damage
94
+ ```
95
+
96
+ Enable the hitbox only during the active frames of a swing (toggle
97
+ `monitoring`/`monitorable` or the CollisionShape's `disabled`), driven by an
98
+ AnimationPlayer track. An always-on melee hitbox hits on touch, which feels wrong.
99
+
100
+ ## Death, knockback, feedback
101
+
102
+ - On `died`: `queue_free()`, spawn a death VFX, drop loot, `add_kill()` on your
103
+ game manager. For the player, switch to a GAME_OVER state instead of freeing.
104
+ - Knockback: push the victim `velocity = (victim.global_position -
105
+ attacker.global_position).normalized() * force`, decay it each frame.
106
+ - Every hit needs feedback or it reads as broken: a flash (`modulate` to white for
107
+ 0.05s), a damage number (floating Label), a small screen shake, a hitstop
108
+ (`Engine.time_scale = 0.05` for one frame). Silent damage feels like a no-op.
109
+
110
+ ## Projectiles (short version)
111
+
112
+ An `Area2D/3D` that moves forward and calls `take_damage` on what it hits, then
113
+ frees itself.
114
+
115
+ ```gdscript
116
+ extends Area2D # projectile
117
+
118
+ @export var speed: float = 600.0
119
+ @export var damage: int = 15
120
+ var direction: Vector2 = Vector2.RIGHT
121
+
122
+ func _ready() -> void:
123
+ body_entered.connect(_on_hit)
124
+ get_tree().create_timer(3.0).timeout.connect(queue_free) # lifetime
125
+
126
+ func _physics_process(delta: float) -> void:
127
+ position += direction * speed * delta
128
+
129
+ func _on_hit(body: Node) -> void:
130
+ if body.has_node("Health"):
131
+ body.get_node("Health").take_damage(damage)
132
+ queue_free()
133
+ ```
134
+
135
+ Homing, piercing, AoE, and pooling many bullets are in this skill's
136
+ `references/projectiles-and-aoe.md` — read it only when you need one of those.
137
+
138
+ ## Traps
139
+
140
+ - Hitbox on the wrong layer/mask = no hits or friendly fire. Verify the layer
141
+ table above before debugging the scripts.
142
+ - Two Areas with neither `monitoring` nor `monitorable` never report overlap.
143
+ - Freeing a node mid-signal can error - defer with `queue_free()` (safe), not
144
+ `free()`.
145
+ - Damaging in `_process` instead of on overlap = continuous per-frame damage.
146
+
147
+ ## Applying it in Summer Engine
148
+
149
+ - Scripts (`health.gd`, `hurtbox.gd`, `hitbox.gd`, `projectile.gd`) are files:
150
+ create with `summer_write_file(path=..., content=..., create_only=true)`,
151
+ change with `summer_replace_text`. Check each with `summer_get_script_errors`.
152
+ - Nodes (the Area, its CollisionShape, the Health child) are scene mutations:
153
+ `summer_add_node` / `summer_set_prop` with `scenePath`, or one `summer_batch`
154
+ with `AddNode` / `SetProp` ops so the scene saves once. Set `collision_layer`
155
+ and `collision_mask` as integers (bit values), not layer names.
156
+ - Prove a hit with a `RunVerification` probe (see `playtesting-a-feature`):
157
+ spawn or find one enemy, press the attack action, `report()` the enemy's
158
+ `Health.current` before and after. A static scene check cannot show that a
159
+ hit registered.
@@ -0,0 +1,100 @@
1
+ # Projectiles, AoE, and Pooling
2
+
3
+ Extends the base projectile in SKILL.md. Pick the behavior you need; they compose.
4
+
5
+ ## Homing
6
+
7
+ Steer the direction toward the nearest target each frame. Turn rate keeps it from
8
+ being unavoidable.
9
+
10
+ ```gdscript
11
+ @export var turn_rate: float = 4.0
12
+ var target: Node2D
13
+
14
+ func _physics_process(delta: float) -> void:
15
+ if is_instance_valid(target):
16
+ var desired := (target.global_position - global_position).normalized()
17
+ direction = direction.lerp(desired, turn_rate * delta).normalized()
18
+ position += direction * speed * delta
19
+ rotation = direction.angle()
20
+ ```
21
+
22
+ Find the nearest target by querying a group: iterate
23
+ `get_tree().get_nodes_in_group("enemies")` and keep the min `distance_to`. For
24
+ hundreds of enemies, cache the list and refresh every few frames, not per bullet.
25
+
26
+ ## Piercing
27
+
28
+ Do not free on first hit; count hits and track who was already hit.
29
+
30
+ ```gdscript
31
+ @export var pierce: int = 3
32
+ var _hit: Array = []
33
+
34
+ func _on_hit(body: Node) -> void:
35
+ if body in _hit:
36
+ return
37
+ _hit.append(body)
38
+ _apply_damage(body)
39
+ pierce -= 1
40
+ if pierce <= 0:
41
+ queue_free()
42
+ ```
43
+
44
+ ## Area of effect (explosion)
45
+
46
+ Spawn an Area with a large CollisionShape for one frame, damage everything
47
+ overlapping, then free. Scale damage by distance for a shockwave feel.
48
+
49
+ ```gdscript
50
+ func explode() -> void:
51
+ for body in $Blast.get_overlapping_bodies():
52
+ if body.has_node("Health"):
53
+ var t := 1.0 - global_position.distance_to(body.global_position) / radius
54
+ body.get_node("Health").take_damage(int(max_damage * maxf(t, 0.2)))
55
+ spawn_vfx()
56
+ queue_free()
57
+ ```
58
+
59
+ Ground DOT (burning patch): an Area that ticks damage on a `Timer.timeout` to
60
+ bodies currently inside it, for a lifetime, then frees.
61
+
62
+ ## Object pooling (many projectiles)
63
+
64
+ Instancing and freeing hundreds of bullets per second stutters. Reuse a fixed pool.
65
+
66
+ ```gdscript
67
+ extends Node2D # BulletPool autoload or level node
68
+
69
+ @export var bullet_scene: PackedScene
70
+ @export var pool_size: int = 200
71
+ var _pool: Array[Node2D] = []
72
+ var _next: int = 0
73
+
74
+ func _ready() -> void:
75
+ for i in pool_size:
76
+ var b := bullet_scene.instantiate()
77
+ b.set_process(false)
78
+ b.hide()
79
+ add_child(b)
80
+ _pool.append(b)
81
+
82
+ func fire(pos: Vector2, dir: Vector2) -> void:
83
+ var b := _pool[_next]
84
+ _next = (_next + 1) % pool_size
85
+ b.global_position = pos
86
+ b.direction = dir
87
+ b.set_process(true)
88
+ b.show()
89
+ # bullet hides + set_process(false) instead of queue_free on hit/lifetime
90
+ ```
91
+
92
+ Deactivate (hide + `set_process(false)`) instead of freeing; the pool recycles the
93
+ oldest. This is how survivors-style games sustain thousands of projectiles.
94
+
95
+ ## Traps
96
+
97
+ - Homing with no turn cap = undodgeable and unfun. Cap `turn_rate`.
98
+ - Pooled bullets that `queue_free()` defeat the pool - hide and disable instead.
99
+ - AoE that reads overlaps in `_process` re-damages every frame; do it once.
100
+ - Distance-scaled damage with no floor (`maxf(t, 0.2)`) makes edges deal 0.
@@ -0,0 +1,34 @@
1
+ id: skill/combat-basics
2
+ kind: skill
3
+ version: 1.0.0
4
+ summary: "Damage in Summer Engine: hitbox and hurtbox Areas on opposing layers, a reusable Health component, damage signals, knockback, hit feedback, projectiles."
5
+ use_when:
6
+ - adding attacks, health and damage, or enemies that can be hit and hit back
7
+ - adding projectiles or bullets — homing, piercing, area-of-effect, or pooling hundreds of them
8
+ - wiring death and respawn, or debugging hits that never land or friendly fire
9
+ do_not_use_when:
10
+ - auto-fire weapons that over-commit or overkill targets — that is the pending-damage pattern in auto-fire-targeting
11
+ - hits work but feel weak or floaty — tune the feedback layer with game-feel or debugging-game-feel
12
+ facets:
13
+ lifecycle:
14
+ - build
15
+ domains:
16
+ - gameplay
17
+ - scripting
18
+ - game-design
19
+ modalities:
20
+ - scripts
21
+ - scenes
22
+ compatibility:
23
+ engine: ">=4.6"
24
+ related:
25
+ skills:
26
+ - skill/make-game
27
+ - skill/character-movement
28
+ - skill/game-feel
29
+ - skill/auto-fire-targeting
30
+ - skill/design-npc
31
+ source: official
32
+ license: MIT
33
+ status: preview
34
+ recommended: false
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: concept-art
3
- description: Use when the user is exploring art direction — wants 3-4 rough variants of a character, environment, or prop to pick a vibe before committing to a final asset. Generates a batch of evocative concept images, not finals. Trigger on "concept art", "art direction", "explore the look", "give me some variants", "what could this character look like", "mood board", "rough sketches".
3
+ description: "Explore art direction with 3-4 rough concept variants of a character, environment, or prop to pick a vibe before committing to a final asset."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: 2d-assets
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: create-asset-sheet
3
- description: Use when the user wants to generate a pack of 2D game assets from a single prompt — a tile sheet, UI kit, menu screen, character pack, or biome set. The skill plans the prompt, generates a coherent sheet, removes the background, vision-detects each item, classifies it, and saves as a single pack ArtAsset. Trigger on "asset sheet", "asset pack", "tile sheet", "tileset", "UI kit", "asset pack for", "make me a sheet of", "generate a bunch of <category> assets".
3
+ description: "Generate a pack of 2D game assets from one prompt — tile sheet, UI kit, character pack, or biome set — sliced, classified, and saved as one pack ArtAsset."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: 2d-assets
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: debug
3
- description: Use when the user reports a bug, crash, error, or unexpected behavior in a Summer project, before making code or scene changes. Runs a disciplined script-errors, console, debugger, hypothesis, fix, and verify loop. Trigger on "debug", "crash", "error", "broken", "not working", "freezes", "wrong".
3
+ description: "Disciplined bug/crash/error loop for Summer projects — script errors, console, debugger, hypothesis, fix, verify — before making code or scene changes."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Codex, Windsurf, Gemini, OpenCode]
6
6
  category: debugging
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: debugging-game-feel
3
- description: Use when a gameplay feature works correctly but feels wrong — floaty jumps, mushy combat, sluggish camera, weightless impacts. Different from logical bug debugging; the bug is subjective and lives in tuning, timing, and feedback layers.
3
+ description: "Debug features that work but feel wrong — floaty jumps, mushy combat, sluggish camera — subjective bugs living in tuning, timing, and feedback layers."
4
4
  ---
5
5
 
6
6
  # Debugging Game Feel
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: design-level
3
- description: Use when designing a single level — layout, pacing, encounters, secrets, reward gating. Outputs a level design doc and a concrete node-tree skeleton for `summer_create_scene`. Trigger on "design a level", "design level 1", "tutorial level", "boss arena", "design the encounter", "make a level layout".
3
+ description: "Design a single level — layout, pacing, encounters, secrets, reward gating — outputs a level design doc and a node-tree skeleton for summer_create_scene."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: level-design
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: design-mechanic
3
- description: Use when designing one specific game mechanic in detail — input, response, feedback, failure modes, depth, tunables. Outputs a design doc and a scaffolding-ready node-graph sketch + GDScript stub. Trigger on "design a mechanic", "how should X work", "design the parry", "design the dash", "design the inventory", "the loop is broken".
3
+ description: "Design one game mechanic in detail — input, response, feedback, failure modes, depth, tunables — outputs a design doc, node-graph sketch, GDScript stub."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: gameplay-mechanics
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: design-npc
3
- description: Use when the user wants to design an enemy, NPC, boss, companion, civilian, or wave-spawned mob's behavior. Walks perception, personality knobs, intent layer, action state machine, telegraphs, defeat handling, and group emergence — outputs a state-machine GDScript stub plus the recommended node tree. Trigger on "enemy", "NPC", "boss", "companion", "AI", "behavior", "mob", "perception", "design enemy".
3
+ description: "Design enemy/NPC/boss/companion behavior — perception, personality, intent, action state machine, telegraphs — outputs a GDScript stub plus node tree."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: ai-and-npcs
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: diagnosing-perf-regressions
3
- description: Use when frame rate, frame time, or load time has gotten worse since a known-good state — "it used to run at 60, now it's at 30." Focused on finding the cause of a regression, not general performance tuning.
3
+ description: "Find why frame rate, frame time, or load time got worse since a known-good state — regression hunting, not general performance tuning."
4
4
  ---
5
5
 
6
6
  # Diagnosing Performance Regressions
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: dispatching-parallel-agents
3
- description: Use when facing 2+ independent tasks that can be worked on without shared state or sequential dependencies
3
+ description: "Work 2+ independent tasks in parallel when they share no state and have no sequential dependencies."
4
4
  ---
5
5
 
6
6
  # Dispatching Parallel Agents
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: driving-the-editor-ui
3
- description: Use when a task is an editor-workflow step a human would do with the mouse — open Project Settings or a dock, switch the 2D/3D/Script main screen, toggle a panel, clear a dialog that is blocking the editor, read what a dock shows — and when deciding whether a request is UI work or scene work. Drives the editor by NAME through summer_ui_actions, reads it as structure through summer_ui_tree, activates the long tail by path through summer_ui_activate, and treats summer_ui_screenshot as the pixels-last fallback. Preview — the ops ship with a follow-up engine build.
3
+ description: "Drive the editor UI by name: invoke actions, clear blocking dialogs, switch the main screen, read a dock — and route scene work to the scene tools instead."
4
4
  ---
5
5
 
6
6
  # Driving the Editor UI