@funpixel/tools 0.1.0 → 0.1.1

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 (784) hide show
  1. package/bench/handlers/bake_emissive.py +2 -2
  2. package/bench/handlers/decimate.py +2 -2
  3. package/bench/handlers/fracture.py +1 -1
  4. package/bench/handlers/normalize_transform.py +3 -3
  5. package/bench/handlers/render_views.py +2 -2
  6. package/bench/handlers/views.py +6 -6
  7. package/dist/cli.js +8 -9
  8. package/dist/commands/feedback.js +5 -5
  9. package/dist/commands/init.js +1 -1
  10. package/dist/direct/read.js +1 -1
  11. package/dist/doctor/unity-checks.js +5 -5
  12. package/dist/doctor/unity-history.js +17 -33
  13. package/dist/feedback/ab.js +0 -40
  14. package/dist/gen/unity.js +3 -3
  15. package/dist/mcp/server.js +2 -1
  16. package/dist/pipeline/pipeline.js +6 -6
  17. package/dist/playtest/moments.js +1 -1
  18. package/dist/playtest/report.js +1 -1
  19. package/dist/production/mirror.js +2 -2
  20. package/dist/sim/curve.js +3 -3
  21. package/dist/spec/scaffold.js +1 -1
  22. package/dist/studio/pitch.js +1 -1
  23. package/dist/unity/probe/install.js +1 -1
  24. package/dist/vendor/verify/src/page/actors.js +2 -2
  25. package/dist/vendor/verify/src/page/capture_view.js +2 -2
  26. package/dist/vendor/verify/src/page/dressing.js +1 -1
  27. package/dist/vendor/verify/src/page/frame_honesty.js +1 -1
  28. package/dist/vendor/verify/src/page/front_door.js +2 -2
  29. package/dist/vendor/verify/src/page/grounding.js +3 -3
  30. package/dist/vendor/verify/src/page/hud.js +3 -3
  31. package/dist/vendor/verify/src/page/layout.js +5 -5
  32. package/dist/vendor/verify/src/page/life_anim.js +6 -6
  33. package/dist/vendor/verify/src/page/mechanic_check.js +1 -1
  34. package/dist/vendor/verify/src/page/phone_check.js +2 -2
  35. package/dist/vendor/verify/src/page/recorder.js +2 -2
  36. package/dist/vendor/verify/src/page/surfaces.js +2 -2
  37. package/dist/vendor/verify/src/page/world_actors.js +3 -3
  38. package/package.json +2 -2
  39. package/plugins/README.md +16 -0
  40. package/plugins/claude/README.md +2 -3
  41. package/plugins/claude/agents/art-director.md +2 -2
  42. package/plugins/claude/commands/playtest.md +2 -2
  43. package/plugins/claude/hooks/brief.md +1 -1
  44. package/plugins/claude/hooks/guidance.json +1 -1
  45. package/plugins/claude/hooks/vendor/pipeline/pipeline.mjs +6 -6
  46. package/plugins/claude/hooks/vendor/studio/pitch.mjs +1 -1
  47. package/plugins/claude/skills/3d/references/bake-off.md +3 -3
  48. package/plugins/claude/skills/3d/references/characters.md +1 -1
  49. package/plugins/claude/skills/3d/references/hero-route.md +5 -5
  50. package/plugins/claude/skills/3d/references/level-spec.md +1 -1
  51. package/plugins/claude/skills/3d/references/levels.md +3 -3
  52. package/plugins/claude/skills/3d/references/light-and-places.md +3 -3
  53. package/plugins/claude/skills/3d/references/painted-target.md +7 -7
  54. package/plugins/claude/skills/3d/references/three-loading.md +4 -4
  55. package/plugins/claude/skills/3d/references/unity.md +13 -13
  56. package/plugins/claude/skills/art/references/animation.md +1 -1
  57. package/plugins/claude/skills/art/references/cast.md +3 -3
  58. package/plugins/claude/skills/art/references/effects.md +2 -2
  59. package/plugins/claude/skills/art/references/frames.md +6 -6
  60. package/plugins/claude/skills/art/references/judging-frames.md +8 -8
  61. package/plugins/claude/skills/art/references/look.md +4 -4
  62. package/plugins/claude/skills/art/references/pipeline.md +2 -2
  63. package/plugins/claude/skills/art/references/prompts.md +4 -4
  64. package/plugins/claude/skills/art/references/ui.md +15 -15
  65. package/plugins/claude/skills/art/references/unity.md +14 -14
  66. package/plugins/claude/skills/audio/references/adaptive-music.md +4 -4
  67. package/plugins/claude/skills/audio/references/engine.md +2 -2
  68. package/plugins/claude/skills/audio/references/measure.md +1 -1
  69. package/plugins/claude/skills/audio/references/unity.md +20 -19
  70. package/plugins/claude/skills/game-feel/SKILL.md +4 -4
  71. package/plugins/claude/skills/game-feel/references/contact.md +6 -6
  72. package/plugins/claude/skills/game-feel/references/unity.md +18 -23
  73. package/plugins/claude/skills/game-logic/SKILL.md +3 -3
  74. package/plugins/claude/skills/game-logic/references/balance.md +2 -2
  75. package/plugins/claude/skills/game-logic/references/depth.md +2 -2
  76. package/plugins/claude/skills/game-logic/references/escalation.md +5 -5
  77. package/plugins/claude/skills/game-logic/references/probes.md +10 -10
  78. package/plugins/claude/skills/game-logic/references/unity.md +28 -28
  79. package/plugins/claude/skills/game-spine/SKILL.md +1 -1
  80. package/plugins/claude/skills/game-spine/references/performance.md +2 -2
  81. package/plugins/claude/skills/game-spine/references/replay.md +11 -11
  82. package/plugins/claude/skills/game-spine/references/room-api.md +1 -1
  83. package/plugins/claude/skills/game-spine/references/sdk.md +1 -1
  84. package/plugins/claude/skills/gdd/SKILL.md +2 -2
  85. package/plugins/claude/skills/gdd/references/as-built.md +2 -2
  86. package/plugins/claude/skills/gdd/references/design-measures.md +2 -2
  87. package/plugins/claude/skills/gdd/references/design-note.md +1 -1
  88. package/plugins/claude/skills/gdd/references/first-look.md +1 -1
  89. package/plugins/claude/skills/gdd/references/floors.md +2 -2
  90. package/plugins/claude/skills/gdd/references/gameplay-contract.md +1 -1
  91. package/plugins/claude/skills/gdd/references/genre-puzzle.md +4 -4
  92. package/plugins/claude/skills/gdd/references/genre-racing.md +2 -2
  93. package/plugins/claude/skills/gdd/references/genre-rpg.md +2 -2
  94. package/plugins/claude/skills/gdd/references/genre-shooter.md +2 -2
  95. package/plugins/claude/skills/gdd/references/genre-survival.md +2 -2
  96. package/plugins/claude/skills/gdd/references/invent-first.md +3 -3
  97. package/plugins/claude/skills/gdd/references/level-and-fun.md +11 -11
  98. package/plugins/claude/skills/gdd/references/pages.md +2 -5
  99. package/plugins/claude/skills/gdd/references/plan-at-size.md +5 -5
  100. package/plugins/claude/skills/gdd/references/production-tiers.md +11 -11
  101. package/plugins/claude/skills/gdd/references/sections.md +7 -7
  102. package/plugins/claude/skills/gdd/references/spec-folder.md +3 -3
  103. package/plugins/claude/skills/gdd/references/the-path.md +3 -4
  104. package/plugins/claude/skills/gdd/references/world-and-identity.md +4 -4
  105. package/plugins/claude/skills/gdd/references/worth.md +4 -4
  106. package/plugins/claude/skills/mobile-ui/SKILL.md +3 -3
  107. package/plugins/claude/skills/mobile-ui/references/hud-and-title.md +3 -3
  108. package/plugins/claude/skills/mobile-ui/references/phone-check.md +1 -1
  109. package/plugins/claude/skills/mobile-ui/references/recipes.md +1 -1
  110. package/plugins/claude/skills/mobile-ui/references/restyle-ui.md +11 -11
  111. package/plugins/claude/skills/mobile-ui/references/unity.md +23 -23
  112. package/plugins/claude/skills/publishing/references/compose.md +1 -1
  113. package/plugins/claude/skills/publishing/references/server-build.md +1 -1
  114. package/plugins/claude/skills/store/SKILL.md +3 -3
  115. package/plugins/claude/skills/store/references/app-store.md +1 -1
  116. package/plugins/claude/skills/store/references/google-play.md +2 -2
  117. package/plugins/claude/skills/store/references/ios-release.md +19 -20
  118. package/plugins/claude/skills/store/references/money.md +2 -2
  119. package/plugins/claude/skills/store/references/purchases-and-review.md +18 -18
  120. package/plugins/claude/skills/store/references/readiness-page.md +1 -1
  121. package/plugins/claude/skills/store/references/readiness.md +3 -3
  122. package/plugins/claude/skills/store/references/unity-store.md +9 -12
  123. package/plugins/claude/skills/unity-game/SKILL.md +28 -35
  124. package/plugins/claude/skills/unity-game/references/agent-ops.md +9 -9
  125. package/plugins/claude/skills/unity-game/references/fixes.md +21 -21
  126. package/plugins/claude/skills/unity-game/references/from-a-web-game.md +17 -17
  127. package/plugins/claude/skills/unity-game/references/handing-off.md +4 -4
  128. package/plugins/claude/skills/unity-game/references/performance.md +10 -14
  129. package/plugins/claude/skills/unity-game/references/probe.md +4 -4
  130. package/plugins/claude/skills/unity-game/references/shared-mac.md +1 -1
  131. package/plugins/claude/skills/unity-game/references/traps.md +13 -14
  132. package/plugins/claude/skills/verifying/references/bar.md +1 -1
  133. package/plugins/claude/skills/verifying/references/fidelity.md +11 -11
  134. package/plugins/claude/skills/verifying/references/mobile-qa.md +10 -10
  135. package/plugins/claude/skills/verifying/references/playtest.md +14 -14
  136. package/plugins/claude/skills/verifying/references/unity.md +11 -11
  137. package/plugins/claude/skills/world-and-story/SKILL.md +1 -1
  138. package/plugins/claude/skills/world-and-story/references/atmosphere.md +4 -4
  139. package/plugins/claude/skills/world-and-story/references/living-world.md +2 -2
  140. package/plugins/claude/skills/world-and-story/references/opening-and-chapters.md +1 -1
  141. package/plugins/claude/skills/world-and-story/references/story-at-size.md +2 -2
  142. package/plugins/claude/skills/world-and-story/references/voice.md +1 -1
  143. package/plugins/codex/AGENTS.md +1 -1
  144. package/plugins/codex/README.md +1 -1
  145. package/plugins/codex/hooks/brief.md +1 -1
  146. package/plugins/codex/hooks/guidance.json +1 -1
  147. package/plugins/codex/hooks/host.md +1 -1
  148. package/plugins/codex/hooks/vendor/pipeline/pipeline.mjs +6 -6
  149. package/plugins/codex/hooks/vendor/studio/pitch.mjs +1 -1
  150. package/plugins/codex/skills/fp-art-director/SKILL.md +2 -2
  151. package/plugins/codex/skills/fp-art-director/references/codex.md +1 -1
  152. package/plugins/codex/skills/fp-audio-director/references/codex.md +1 -1
  153. package/plugins/codex/skills/fp-critic/references/codex.md +1 -1
  154. package/plugins/codex/skills/fp-lane/references/codex.md +1 -1
  155. package/plugins/codex/skills/fp-level-designer/references/codex.md +1 -1
  156. package/plugins/codex/skills/fp-mobile-qa-seat/references/codex.md +1 -1
  157. package/plugins/codex/skills/fp-player/references/codex.md +1 -1
  158. package/plugins/codex/skills/fp-playtest/SKILL.md +2 -2
  159. package/plugins/codex/skills/fp-qa-lead/references/codex.md +1 -1
  160. package/plugins/codex/skills/fp-studio/SKILL.md +1 -1
  161. package/plugins/codex/skills/funpixel-3d/references/bake-off.md +3 -3
  162. package/plugins/codex/skills/funpixel-3d/references/characters.md +1 -1
  163. package/plugins/codex/skills/funpixel-3d/references/hero-route.md +5 -5
  164. package/plugins/codex/skills/funpixel-3d/references/level-spec.md +1 -1
  165. package/plugins/codex/skills/funpixel-3d/references/levels.md +3 -3
  166. package/plugins/codex/skills/funpixel-3d/references/light-and-places.md +3 -3
  167. package/plugins/codex/skills/funpixel-3d/references/painted-target.md +7 -7
  168. package/plugins/codex/skills/funpixel-3d/references/three-loading.md +4 -4
  169. package/plugins/codex/skills/funpixel-3d/references/unity.md +13 -13
  170. package/plugins/codex/skills/funpixel-art/references/animation.md +1 -1
  171. package/plugins/codex/skills/funpixel-art/references/cast.md +3 -3
  172. package/plugins/codex/skills/funpixel-art/references/effects.md +2 -2
  173. package/plugins/codex/skills/funpixel-art/references/frames.md +6 -6
  174. package/plugins/codex/skills/funpixel-art/references/judging-frames.md +8 -8
  175. package/plugins/codex/skills/funpixel-art/references/look.md +4 -4
  176. package/plugins/codex/skills/funpixel-art/references/pipeline.md +2 -2
  177. package/plugins/codex/skills/funpixel-art/references/prompts.md +4 -4
  178. package/plugins/codex/skills/funpixel-art/references/ui.md +15 -15
  179. package/plugins/codex/skills/funpixel-art/references/unity.md +14 -14
  180. package/plugins/codex/skills/funpixel-audio/references/adaptive-music.md +4 -4
  181. package/plugins/codex/skills/funpixel-audio/references/engine.md +2 -2
  182. package/plugins/codex/skills/funpixel-audio/references/measure.md +1 -1
  183. package/plugins/codex/skills/funpixel-audio/references/unity.md +20 -19
  184. package/plugins/codex/skills/funpixel-game-feel/SKILL.md +4 -4
  185. package/plugins/codex/skills/funpixel-game-feel/references/contact.md +6 -6
  186. package/plugins/codex/skills/funpixel-game-feel/references/unity.md +18 -23
  187. package/plugins/codex/skills/funpixel-game-logic/SKILL.md +3 -3
  188. package/plugins/codex/skills/funpixel-game-logic/references/balance.md +2 -2
  189. package/plugins/codex/skills/funpixel-game-logic/references/depth.md +2 -2
  190. package/plugins/codex/skills/funpixel-game-logic/references/escalation.md +5 -5
  191. package/plugins/codex/skills/funpixel-game-logic/references/probes.md +10 -10
  192. package/plugins/codex/skills/funpixel-game-logic/references/unity.md +28 -28
  193. package/plugins/codex/skills/funpixel-game-spine/SKILL.md +1 -1
  194. package/plugins/codex/skills/funpixel-game-spine/references/performance.md +2 -2
  195. package/plugins/codex/skills/funpixel-game-spine/references/replay.md +11 -11
  196. package/plugins/codex/skills/funpixel-game-spine/references/room-api.md +1 -1
  197. package/plugins/codex/skills/funpixel-game-spine/references/sdk.md +1 -1
  198. package/plugins/codex/skills/funpixel-gdd/SKILL.md +2 -2
  199. package/plugins/codex/skills/funpixel-gdd/references/as-built.md +2 -2
  200. package/plugins/codex/skills/funpixel-gdd/references/design-measures.md +2 -2
  201. package/plugins/codex/skills/funpixel-gdd/references/design-note.md +1 -1
  202. package/plugins/codex/skills/funpixel-gdd/references/first-look.md +1 -1
  203. package/plugins/codex/skills/funpixel-gdd/references/floors.md +2 -2
  204. package/plugins/codex/skills/funpixel-gdd/references/gameplay-contract.md +1 -1
  205. package/plugins/codex/skills/funpixel-gdd/references/genre-puzzle.md +4 -4
  206. package/plugins/codex/skills/funpixel-gdd/references/genre-racing.md +2 -2
  207. package/plugins/codex/skills/funpixel-gdd/references/genre-rpg.md +2 -2
  208. package/plugins/codex/skills/funpixel-gdd/references/genre-shooter.md +2 -2
  209. package/plugins/codex/skills/funpixel-gdd/references/genre-survival.md +2 -2
  210. package/plugins/codex/skills/funpixel-gdd/references/invent-first.md +3 -3
  211. package/plugins/codex/skills/funpixel-gdd/references/level-and-fun.md +11 -11
  212. package/plugins/codex/skills/funpixel-gdd/references/pages.md +2 -5
  213. package/plugins/codex/skills/funpixel-gdd/references/plan-at-size.md +5 -5
  214. package/plugins/codex/skills/funpixel-gdd/references/production-tiers.md +11 -11
  215. package/plugins/codex/skills/funpixel-gdd/references/sections.md +7 -7
  216. package/plugins/codex/skills/funpixel-gdd/references/spec-folder.md +3 -3
  217. package/plugins/codex/skills/funpixel-gdd/references/the-path.md +3 -4
  218. package/plugins/codex/skills/funpixel-gdd/references/world-and-identity.md +4 -4
  219. package/plugins/codex/skills/funpixel-gdd/references/worth.md +4 -4
  220. package/plugins/codex/skills/funpixel-mobile-ui/SKILL.md +3 -3
  221. package/plugins/codex/skills/funpixel-mobile-ui/references/hud-and-title.md +3 -3
  222. package/plugins/codex/skills/funpixel-mobile-ui/references/phone-check.md +1 -1
  223. package/plugins/codex/skills/funpixel-mobile-ui/references/recipes.md +1 -1
  224. package/plugins/codex/skills/funpixel-mobile-ui/references/restyle-ui.md +11 -11
  225. package/plugins/codex/skills/funpixel-mobile-ui/references/unity.md +23 -23
  226. package/plugins/codex/skills/funpixel-publish/references/compose.md +1 -1
  227. package/plugins/codex/skills/funpixel-publish/references/server-build.md +1 -1
  228. package/plugins/codex/skills/funpixel-store/SKILL.md +3 -3
  229. package/plugins/codex/skills/funpixel-store/references/app-store.md +1 -1
  230. package/plugins/codex/skills/funpixel-store/references/google-play.md +2 -2
  231. package/plugins/codex/skills/funpixel-store/references/ios-release.md +19 -20
  232. package/plugins/codex/skills/funpixel-store/references/money.md +2 -2
  233. package/plugins/codex/skills/funpixel-store/references/purchases-and-review.md +18 -18
  234. package/plugins/codex/skills/funpixel-store/references/readiness-page.md +1 -1
  235. package/plugins/codex/skills/funpixel-store/references/readiness.md +3 -3
  236. package/plugins/codex/skills/funpixel-store/references/unity-store.md +9 -12
  237. package/plugins/codex/skills/funpixel-unity-game/SKILL.md +28 -35
  238. package/plugins/codex/skills/funpixel-unity-game/references/agent-ops.md +9 -9
  239. package/plugins/codex/skills/funpixel-unity-game/references/fixes.md +21 -21
  240. package/plugins/codex/skills/funpixel-unity-game/references/from-a-web-game.md +17 -17
  241. package/plugins/codex/skills/funpixel-unity-game/references/handing-off.md +4 -4
  242. package/plugins/codex/skills/funpixel-unity-game/references/performance.md +10 -14
  243. package/plugins/codex/skills/funpixel-unity-game/references/probe.md +4 -4
  244. package/plugins/codex/skills/funpixel-unity-game/references/shared-mac.md +1 -1
  245. package/plugins/codex/skills/funpixel-unity-game/references/traps.md +13 -14
  246. package/plugins/codex/skills/funpixel-verify/references/bar.md +1 -1
  247. package/plugins/codex/skills/funpixel-verify/references/fidelity.md +11 -11
  248. package/plugins/codex/skills/funpixel-verify/references/mobile-qa.md +10 -10
  249. package/plugins/codex/skills/funpixel-verify/references/playtest.md +14 -14
  250. package/plugins/codex/skills/funpixel-verify/references/unity.md +11 -11
  251. package/plugins/codex/skills/funpixel-world-and-story/SKILL.md +1 -1
  252. package/plugins/codex/skills/funpixel-world-and-story/references/atmosphere.md +4 -4
  253. package/plugins/codex/skills/funpixel-world-and-story/references/living-world.md +2 -2
  254. package/plugins/codex/skills/funpixel-world-and-story/references/opening-and-chapters.md +1 -1
  255. package/plugins/codex/skills/funpixel-world-and-story/references/story-at-size.md +2 -2
  256. package/plugins/codex/skills/funpixel-world-and-story/references/voice.md +1 -1
  257. package/plugins/cursor/README.md +1 -1
  258. package/plugins/cursor/agents/art-director.md +2 -2
  259. package/plugins/cursor/commands/playtest.md +2 -2
  260. package/plugins/cursor/hooks/brief.md +1 -1
  261. package/plugins/cursor/hooks/guidance.json +1 -1
  262. package/plugins/cursor/hooks/vendor/pipeline/pipeline.mjs +6 -6
  263. package/plugins/cursor/hooks/vendor/studio/pitch.mjs +1 -1
  264. package/plugins/cursor/rules/funpixel-brief.mdc +1 -1
  265. package/plugins/cursor/skills/funpixel-3d/references/bake-off.md +3 -3
  266. package/plugins/cursor/skills/funpixel-3d/references/characters.md +1 -1
  267. package/plugins/cursor/skills/funpixel-3d/references/hero-route.md +5 -5
  268. package/plugins/cursor/skills/funpixel-3d/references/level-spec.md +1 -1
  269. package/plugins/cursor/skills/funpixel-3d/references/levels.md +3 -3
  270. package/plugins/cursor/skills/funpixel-3d/references/light-and-places.md +3 -3
  271. package/plugins/cursor/skills/funpixel-3d/references/painted-target.md +7 -7
  272. package/plugins/cursor/skills/funpixel-3d/references/three-loading.md +4 -4
  273. package/plugins/cursor/skills/funpixel-3d/references/unity.md +13 -13
  274. package/plugins/cursor/skills/funpixel-art/references/animation.md +1 -1
  275. package/plugins/cursor/skills/funpixel-art/references/cast.md +3 -3
  276. package/plugins/cursor/skills/funpixel-art/references/effects.md +2 -2
  277. package/plugins/cursor/skills/funpixel-art/references/frames.md +6 -6
  278. package/plugins/cursor/skills/funpixel-art/references/judging-frames.md +8 -8
  279. package/plugins/cursor/skills/funpixel-art/references/look.md +4 -4
  280. package/plugins/cursor/skills/funpixel-art/references/pipeline.md +2 -2
  281. package/plugins/cursor/skills/funpixel-art/references/prompts.md +4 -4
  282. package/plugins/cursor/skills/funpixel-art/references/ui.md +15 -15
  283. package/plugins/cursor/skills/funpixel-art/references/unity.md +14 -14
  284. package/plugins/cursor/skills/funpixel-audio/references/adaptive-music.md +4 -4
  285. package/plugins/cursor/skills/funpixel-audio/references/engine.md +2 -2
  286. package/plugins/cursor/skills/funpixel-audio/references/measure.md +1 -1
  287. package/plugins/cursor/skills/funpixel-audio/references/unity.md +20 -19
  288. package/plugins/cursor/skills/funpixel-game-feel/SKILL.md +4 -4
  289. package/plugins/cursor/skills/funpixel-game-feel/references/contact.md +6 -6
  290. package/plugins/cursor/skills/funpixel-game-feel/references/unity.md +18 -23
  291. package/plugins/cursor/skills/funpixel-game-logic/SKILL.md +3 -3
  292. package/plugins/cursor/skills/funpixel-game-logic/references/balance.md +2 -2
  293. package/plugins/cursor/skills/funpixel-game-logic/references/depth.md +2 -2
  294. package/plugins/cursor/skills/funpixel-game-logic/references/escalation.md +5 -5
  295. package/plugins/cursor/skills/funpixel-game-logic/references/probes.md +10 -10
  296. package/plugins/cursor/skills/funpixel-game-logic/references/unity.md +28 -28
  297. package/plugins/cursor/skills/funpixel-game-spine/SKILL.md +1 -1
  298. package/plugins/cursor/skills/funpixel-game-spine/references/performance.md +2 -2
  299. package/plugins/cursor/skills/funpixel-game-spine/references/replay.md +11 -11
  300. package/plugins/cursor/skills/funpixel-game-spine/references/room-api.md +1 -1
  301. package/plugins/cursor/skills/funpixel-game-spine/references/sdk.md +1 -1
  302. package/plugins/cursor/skills/funpixel-gdd/SKILL.md +2 -2
  303. package/plugins/cursor/skills/funpixel-gdd/references/as-built.md +2 -2
  304. package/plugins/cursor/skills/funpixel-gdd/references/design-measures.md +2 -2
  305. package/plugins/cursor/skills/funpixel-gdd/references/design-note.md +1 -1
  306. package/plugins/cursor/skills/funpixel-gdd/references/first-look.md +1 -1
  307. package/plugins/cursor/skills/funpixel-gdd/references/floors.md +2 -2
  308. package/plugins/cursor/skills/funpixel-gdd/references/gameplay-contract.md +1 -1
  309. package/plugins/cursor/skills/funpixel-gdd/references/genre-puzzle.md +4 -4
  310. package/plugins/cursor/skills/funpixel-gdd/references/genre-racing.md +2 -2
  311. package/plugins/cursor/skills/funpixel-gdd/references/genre-rpg.md +2 -2
  312. package/plugins/cursor/skills/funpixel-gdd/references/genre-shooter.md +2 -2
  313. package/plugins/cursor/skills/funpixel-gdd/references/genre-survival.md +2 -2
  314. package/plugins/cursor/skills/funpixel-gdd/references/invent-first.md +3 -3
  315. package/plugins/cursor/skills/funpixel-gdd/references/level-and-fun.md +11 -11
  316. package/plugins/cursor/skills/funpixel-gdd/references/pages.md +2 -5
  317. package/plugins/cursor/skills/funpixel-gdd/references/plan-at-size.md +5 -5
  318. package/plugins/cursor/skills/funpixel-gdd/references/production-tiers.md +11 -11
  319. package/plugins/cursor/skills/funpixel-gdd/references/sections.md +7 -7
  320. package/plugins/cursor/skills/funpixel-gdd/references/spec-folder.md +3 -3
  321. package/plugins/cursor/skills/funpixel-gdd/references/the-path.md +3 -4
  322. package/plugins/cursor/skills/funpixel-gdd/references/world-and-identity.md +4 -4
  323. package/plugins/cursor/skills/funpixel-gdd/references/worth.md +4 -4
  324. package/plugins/cursor/skills/funpixel-mobile-ui/SKILL.md +3 -3
  325. package/plugins/cursor/skills/funpixel-mobile-ui/references/hud-and-title.md +3 -3
  326. package/plugins/cursor/skills/funpixel-mobile-ui/references/phone-check.md +1 -1
  327. package/plugins/cursor/skills/funpixel-mobile-ui/references/recipes.md +1 -1
  328. package/plugins/cursor/skills/funpixel-mobile-ui/references/restyle-ui.md +11 -11
  329. package/plugins/cursor/skills/funpixel-mobile-ui/references/unity.md +23 -23
  330. package/plugins/cursor/skills/funpixel-publish/references/compose.md +1 -1
  331. package/plugins/cursor/skills/funpixel-publish/references/server-build.md +1 -1
  332. package/plugins/cursor/skills/funpixel-store/SKILL.md +3 -3
  333. package/plugins/cursor/skills/funpixel-store/references/app-store.md +1 -1
  334. package/plugins/cursor/skills/funpixel-store/references/google-play.md +2 -2
  335. package/plugins/cursor/skills/funpixel-store/references/ios-release.md +19 -20
  336. package/plugins/cursor/skills/funpixel-store/references/money.md +2 -2
  337. package/plugins/cursor/skills/funpixel-store/references/purchases-and-review.md +18 -18
  338. package/plugins/cursor/skills/funpixel-store/references/readiness-page.md +1 -1
  339. package/plugins/cursor/skills/funpixel-store/references/readiness.md +3 -3
  340. package/plugins/cursor/skills/funpixel-store/references/unity-store.md +9 -12
  341. package/plugins/cursor/skills/funpixel-unity-game/SKILL.md +28 -35
  342. package/plugins/cursor/skills/funpixel-unity-game/references/agent-ops.md +9 -9
  343. package/plugins/cursor/skills/funpixel-unity-game/references/fixes.md +21 -21
  344. package/plugins/cursor/skills/funpixel-unity-game/references/from-a-web-game.md +17 -17
  345. package/plugins/cursor/skills/funpixel-unity-game/references/handing-off.md +4 -4
  346. package/plugins/cursor/skills/funpixel-unity-game/references/performance.md +10 -14
  347. package/plugins/cursor/skills/funpixel-unity-game/references/probe.md +4 -4
  348. package/plugins/cursor/skills/funpixel-unity-game/references/shared-mac.md +1 -1
  349. package/plugins/cursor/skills/funpixel-unity-game/references/traps.md +13 -14
  350. package/plugins/cursor/skills/funpixel-verify/references/bar.md +1 -1
  351. package/plugins/cursor/skills/funpixel-verify/references/fidelity.md +11 -11
  352. package/plugins/cursor/skills/funpixel-verify/references/mobile-qa.md +10 -10
  353. package/plugins/cursor/skills/funpixel-verify/references/playtest.md +14 -14
  354. package/plugins/cursor/skills/funpixel-verify/references/unity.md +11 -11
  355. package/plugins/cursor/skills/funpixel-world-and-story/SKILL.md +1 -1
  356. package/plugins/cursor/skills/funpixel-world-and-story/references/atmosphere.md +4 -4
  357. package/plugins/cursor/skills/funpixel-world-and-story/references/living-world.md +2 -2
  358. package/plugins/cursor/skills/funpixel-world-and-story/references/opening-and-chapters.md +1 -1
  359. package/plugins/cursor/skills/funpixel-world-and-story/references/story-at-size.md +2 -2
  360. package/plugins/cursor/skills/funpixel-world-and-story/references/voice.md +1 -1
  361. package/plugins/kiro/AGENTS.md +1 -1
  362. package/plugins/kiro/README.md +1 -1
  363. package/plugins/kiro/hooks/brief.md +1 -1
  364. package/plugins/kiro/hooks/guidance.json +1 -1
  365. package/plugins/kiro/hooks/vendor/pipeline/pipeline.mjs +6 -6
  366. package/plugins/kiro/hooks/vendor/studio/pitch.mjs +1 -1
  367. package/plugins/kiro/skills/fp-art-director/SKILL.md +2 -2
  368. package/plugins/kiro/skills/fp-playtest/SKILL.md +2 -2
  369. package/plugins/kiro/skills/funpixel-3d/references/bake-off.md +3 -3
  370. package/plugins/kiro/skills/funpixel-3d/references/characters.md +1 -1
  371. package/plugins/kiro/skills/funpixel-3d/references/hero-route.md +5 -5
  372. package/plugins/kiro/skills/funpixel-3d/references/level-spec.md +1 -1
  373. package/plugins/kiro/skills/funpixel-3d/references/levels.md +3 -3
  374. package/plugins/kiro/skills/funpixel-3d/references/light-and-places.md +3 -3
  375. package/plugins/kiro/skills/funpixel-3d/references/painted-target.md +7 -7
  376. package/plugins/kiro/skills/funpixel-3d/references/three-loading.md +4 -4
  377. package/plugins/kiro/skills/funpixel-3d/references/unity.md +13 -13
  378. package/plugins/kiro/skills/funpixel-art/references/animation.md +1 -1
  379. package/plugins/kiro/skills/funpixel-art/references/cast.md +3 -3
  380. package/plugins/kiro/skills/funpixel-art/references/effects.md +2 -2
  381. package/plugins/kiro/skills/funpixel-art/references/frames.md +6 -6
  382. package/plugins/kiro/skills/funpixel-art/references/judging-frames.md +8 -8
  383. package/plugins/kiro/skills/funpixel-art/references/look.md +4 -4
  384. package/plugins/kiro/skills/funpixel-art/references/pipeline.md +2 -2
  385. package/plugins/kiro/skills/funpixel-art/references/prompts.md +4 -4
  386. package/plugins/kiro/skills/funpixel-art/references/ui.md +15 -15
  387. package/plugins/kiro/skills/funpixel-art/references/unity.md +14 -14
  388. package/plugins/kiro/skills/funpixel-audio/references/adaptive-music.md +4 -4
  389. package/plugins/kiro/skills/funpixel-audio/references/engine.md +2 -2
  390. package/plugins/kiro/skills/funpixel-audio/references/measure.md +1 -1
  391. package/plugins/kiro/skills/funpixel-audio/references/unity.md +20 -19
  392. package/plugins/kiro/skills/funpixel-game-feel/SKILL.md +4 -4
  393. package/plugins/kiro/skills/funpixel-game-feel/references/contact.md +6 -6
  394. package/plugins/kiro/skills/funpixel-game-feel/references/unity.md +18 -23
  395. package/plugins/kiro/skills/funpixel-game-logic/SKILL.md +3 -3
  396. package/plugins/kiro/skills/funpixel-game-logic/references/balance.md +2 -2
  397. package/plugins/kiro/skills/funpixel-game-logic/references/depth.md +2 -2
  398. package/plugins/kiro/skills/funpixel-game-logic/references/escalation.md +5 -5
  399. package/plugins/kiro/skills/funpixel-game-logic/references/probes.md +10 -10
  400. package/plugins/kiro/skills/funpixel-game-logic/references/unity.md +28 -28
  401. package/plugins/kiro/skills/funpixel-game-spine/SKILL.md +1 -1
  402. package/plugins/kiro/skills/funpixel-game-spine/references/performance.md +2 -2
  403. package/plugins/kiro/skills/funpixel-game-spine/references/replay.md +11 -11
  404. package/plugins/kiro/skills/funpixel-game-spine/references/room-api.md +1 -1
  405. package/plugins/kiro/skills/funpixel-game-spine/references/sdk.md +1 -1
  406. package/plugins/kiro/skills/funpixel-gdd/SKILL.md +2 -2
  407. package/plugins/kiro/skills/funpixel-gdd/references/as-built.md +2 -2
  408. package/plugins/kiro/skills/funpixel-gdd/references/design-measures.md +2 -2
  409. package/plugins/kiro/skills/funpixel-gdd/references/design-note.md +1 -1
  410. package/plugins/kiro/skills/funpixel-gdd/references/first-look.md +1 -1
  411. package/plugins/kiro/skills/funpixel-gdd/references/floors.md +2 -2
  412. package/plugins/kiro/skills/funpixel-gdd/references/gameplay-contract.md +1 -1
  413. package/plugins/kiro/skills/funpixel-gdd/references/genre-puzzle.md +4 -4
  414. package/plugins/kiro/skills/funpixel-gdd/references/genre-racing.md +2 -2
  415. package/plugins/kiro/skills/funpixel-gdd/references/genre-rpg.md +2 -2
  416. package/plugins/kiro/skills/funpixel-gdd/references/genre-shooter.md +2 -2
  417. package/plugins/kiro/skills/funpixel-gdd/references/genre-survival.md +2 -2
  418. package/plugins/kiro/skills/funpixel-gdd/references/invent-first.md +3 -3
  419. package/plugins/kiro/skills/funpixel-gdd/references/level-and-fun.md +11 -11
  420. package/plugins/kiro/skills/funpixel-gdd/references/pages.md +2 -5
  421. package/plugins/kiro/skills/funpixel-gdd/references/plan-at-size.md +5 -5
  422. package/plugins/kiro/skills/funpixel-gdd/references/production-tiers.md +11 -11
  423. package/plugins/kiro/skills/funpixel-gdd/references/sections.md +7 -7
  424. package/plugins/kiro/skills/funpixel-gdd/references/spec-folder.md +3 -3
  425. package/plugins/kiro/skills/funpixel-gdd/references/the-path.md +3 -4
  426. package/plugins/kiro/skills/funpixel-gdd/references/world-and-identity.md +4 -4
  427. package/plugins/kiro/skills/funpixel-gdd/references/worth.md +4 -4
  428. package/plugins/kiro/skills/funpixel-mobile-ui/SKILL.md +3 -3
  429. package/plugins/kiro/skills/funpixel-mobile-ui/references/hud-and-title.md +3 -3
  430. package/plugins/kiro/skills/funpixel-mobile-ui/references/phone-check.md +1 -1
  431. package/plugins/kiro/skills/funpixel-mobile-ui/references/recipes.md +1 -1
  432. package/plugins/kiro/skills/funpixel-mobile-ui/references/restyle-ui.md +11 -11
  433. package/plugins/kiro/skills/funpixel-mobile-ui/references/unity.md +23 -23
  434. package/plugins/kiro/skills/funpixel-publish/references/compose.md +1 -1
  435. package/plugins/kiro/skills/funpixel-publish/references/server-build.md +1 -1
  436. package/plugins/kiro/skills/funpixel-store/SKILL.md +3 -3
  437. package/plugins/kiro/skills/funpixel-store/references/app-store.md +1 -1
  438. package/plugins/kiro/skills/funpixel-store/references/google-play.md +2 -2
  439. package/plugins/kiro/skills/funpixel-store/references/ios-release.md +19 -20
  440. package/plugins/kiro/skills/funpixel-store/references/money.md +2 -2
  441. package/plugins/kiro/skills/funpixel-store/references/purchases-and-review.md +18 -18
  442. package/plugins/kiro/skills/funpixel-store/references/readiness-page.md +1 -1
  443. package/plugins/kiro/skills/funpixel-store/references/readiness.md +3 -3
  444. package/plugins/kiro/skills/funpixel-store/references/unity-store.md +9 -12
  445. package/plugins/kiro/skills/funpixel-unity-game/SKILL.md +28 -35
  446. package/plugins/kiro/skills/funpixel-unity-game/references/agent-ops.md +9 -9
  447. package/plugins/kiro/skills/funpixel-unity-game/references/fixes.md +21 -21
  448. package/plugins/kiro/skills/funpixel-unity-game/references/from-a-web-game.md +17 -17
  449. package/plugins/kiro/skills/funpixel-unity-game/references/handing-off.md +4 -4
  450. package/plugins/kiro/skills/funpixel-unity-game/references/performance.md +10 -14
  451. package/plugins/kiro/skills/funpixel-unity-game/references/probe.md +4 -4
  452. package/plugins/kiro/skills/funpixel-unity-game/references/shared-mac.md +1 -1
  453. package/plugins/kiro/skills/funpixel-unity-game/references/traps.md +13 -14
  454. package/plugins/kiro/skills/funpixel-verify/references/bar.md +1 -1
  455. package/plugins/kiro/skills/funpixel-verify/references/fidelity.md +11 -11
  456. package/plugins/kiro/skills/funpixel-verify/references/mobile-qa.md +10 -10
  457. package/plugins/kiro/skills/funpixel-verify/references/playtest.md +14 -14
  458. package/plugins/kiro/skills/funpixel-verify/references/unity.md +11 -11
  459. package/plugins/kiro/skills/funpixel-world-and-story/SKILL.md +1 -1
  460. package/plugins/kiro/skills/funpixel-world-and-story/references/atmosphere.md +4 -4
  461. package/plugins/kiro/skills/funpixel-world-and-story/references/living-world.md +2 -2
  462. package/plugins/kiro/skills/funpixel-world-and-story/references/opening-and-chapters.md +1 -1
  463. package/plugins/kiro/skills/funpixel-world-and-story/references/story-at-size.md +2 -2
  464. package/plugins/kiro/skills/funpixel-world-and-story/references/voice.md +1 -1
  465. package/plugins/robin/README.md +1 -1
  466. package/plugins/robin/claude/README.md +2 -3
  467. package/plugins/robin/claude/agents/art-director.md +2 -2
  468. package/plugins/robin/claude/commands/playtest.md +2 -2
  469. package/plugins/robin/claude/hooks/brief.md +1 -1
  470. package/plugins/robin/claude/hooks/guidance.json +1 -1
  471. package/plugins/robin/claude/hooks/vendor/pipeline/pipeline.mjs +6 -6
  472. package/plugins/robin/claude/hooks/vendor/studio/pitch.mjs +1 -1
  473. package/plugins/robin/claude/skills/3d/references/bake-off.md +3 -3
  474. package/plugins/robin/claude/skills/3d/references/characters.md +1 -1
  475. package/plugins/robin/claude/skills/3d/references/hero-route.md +5 -5
  476. package/plugins/robin/claude/skills/3d/references/level-spec.md +1 -1
  477. package/plugins/robin/claude/skills/3d/references/levels.md +3 -3
  478. package/plugins/robin/claude/skills/3d/references/light-and-places.md +3 -3
  479. package/plugins/robin/claude/skills/3d/references/painted-target.md +7 -7
  480. package/plugins/robin/claude/skills/3d/references/three-loading.md +4 -4
  481. package/plugins/robin/claude/skills/3d/references/unity.md +13 -13
  482. package/plugins/robin/claude/skills/art/references/animation.md +1 -1
  483. package/plugins/robin/claude/skills/art/references/cast.md +3 -3
  484. package/plugins/robin/claude/skills/art/references/effects.md +2 -2
  485. package/plugins/robin/claude/skills/art/references/frames.md +6 -6
  486. package/plugins/robin/claude/skills/art/references/judging-frames.md +8 -8
  487. package/plugins/robin/claude/skills/art/references/look.md +4 -4
  488. package/plugins/robin/claude/skills/art/references/pipeline.md +2 -2
  489. package/plugins/robin/claude/skills/art/references/prompts.md +4 -4
  490. package/plugins/robin/claude/skills/art/references/ui.md +15 -15
  491. package/plugins/robin/claude/skills/art/references/unity.md +14 -14
  492. package/plugins/robin/claude/skills/audio/references/adaptive-music.md +4 -4
  493. package/plugins/robin/claude/skills/audio/references/engine.md +2 -2
  494. package/plugins/robin/claude/skills/audio/references/measure.md +1 -1
  495. package/plugins/robin/claude/skills/audio/references/unity.md +20 -19
  496. package/plugins/robin/claude/skills/game-feel/SKILL.md +4 -4
  497. package/plugins/robin/claude/skills/game-feel/references/contact.md +6 -6
  498. package/plugins/robin/claude/skills/game-feel/references/unity.md +18 -23
  499. package/plugins/robin/claude/skills/game-logic/SKILL.md +3 -3
  500. package/plugins/robin/claude/skills/game-logic/references/balance.md +2 -2
  501. package/plugins/robin/claude/skills/game-logic/references/depth.md +2 -2
  502. package/plugins/robin/claude/skills/game-logic/references/escalation.md +5 -5
  503. package/plugins/robin/claude/skills/game-logic/references/probes.md +10 -10
  504. package/plugins/robin/claude/skills/game-logic/references/unity.md +28 -28
  505. package/plugins/robin/claude/skills/game-spine/SKILL.md +1 -1
  506. package/plugins/robin/claude/skills/game-spine/references/performance.md +2 -2
  507. package/plugins/robin/claude/skills/game-spine/references/replay.md +11 -11
  508. package/plugins/robin/claude/skills/game-spine/references/room-api.md +1 -1
  509. package/plugins/robin/claude/skills/game-spine/references/sdk.md +1 -1
  510. package/plugins/robin/claude/skills/gdd/SKILL.md +2 -2
  511. package/plugins/robin/claude/skills/gdd/references/as-built.md +2 -2
  512. package/plugins/robin/claude/skills/gdd/references/design-measures.md +2 -2
  513. package/plugins/robin/claude/skills/gdd/references/design-note.md +1 -1
  514. package/plugins/robin/claude/skills/gdd/references/first-look.md +1 -1
  515. package/plugins/robin/claude/skills/gdd/references/floors.md +2 -2
  516. package/plugins/robin/claude/skills/gdd/references/gameplay-contract.md +1 -1
  517. package/plugins/robin/claude/skills/gdd/references/genre-puzzle.md +4 -4
  518. package/plugins/robin/claude/skills/gdd/references/genre-racing.md +2 -2
  519. package/plugins/robin/claude/skills/gdd/references/genre-rpg.md +2 -2
  520. package/plugins/robin/claude/skills/gdd/references/genre-shooter.md +2 -2
  521. package/plugins/robin/claude/skills/gdd/references/genre-survival.md +2 -2
  522. package/plugins/robin/claude/skills/gdd/references/invent-first.md +3 -3
  523. package/plugins/robin/claude/skills/gdd/references/level-and-fun.md +11 -11
  524. package/plugins/robin/claude/skills/gdd/references/pages.md +2 -5
  525. package/plugins/robin/claude/skills/gdd/references/plan-at-size.md +5 -5
  526. package/plugins/robin/claude/skills/gdd/references/production-tiers.md +11 -11
  527. package/plugins/robin/claude/skills/gdd/references/sections.md +7 -7
  528. package/plugins/robin/claude/skills/gdd/references/spec-folder.md +3 -3
  529. package/plugins/robin/claude/skills/gdd/references/the-path.md +3 -4
  530. package/plugins/robin/claude/skills/gdd/references/world-and-identity.md +4 -4
  531. package/plugins/robin/claude/skills/gdd/references/worth.md +4 -4
  532. package/plugins/robin/claude/skills/mobile-ui/SKILL.md +3 -3
  533. package/plugins/robin/claude/skills/mobile-ui/references/hud-and-title.md +3 -3
  534. package/plugins/robin/claude/skills/mobile-ui/references/phone-check.md +1 -1
  535. package/plugins/robin/claude/skills/mobile-ui/references/recipes.md +1 -1
  536. package/plugins/robin/claude/skills/mobile-ui/references/restyle-ui.md +11 -11
  537. package/plugins/robin/claude/skills/mobile-ui/references/unity.md +23 -23
  538. package/plugins/robin/claude/skills/publishing/references/compose.md +1 -1
  539. package/plugins/robin/claude/skills/publishing/references/server-build.md +1 -1
  540. package/plugins/robin/claude/skills/store/SKILL.md +3 -3
  541. package/plugins/robin/claude/skills/store/references/app-store.md +1 -1
  542. package/plugins/robin/claude/skills/store/references/google-play.md +2 -2
  543. package/plugins/robin/claude/skills/store/references/ios-release.md +19 -20
  544. package/plugins/robin/claude/skills/store/references/money.md +2 -2
  545. package/plugins/robin/claude/skills/store/references/purchases-and-review.md +18 -18
  546. package/plugins/robin/claude/skills/store/references/readiness-page.md +1 -1
  547. package/plugins/robin/claude/skills/store/references/readiness.md +3 -3
  548. package/plugins/robin/claude/skills/store/references/unity-store.md +9 -12
  549. package/plugins/robin/claude/skills/unity-game/SKILL.md +28 -35
  550. package/plugins/robin/claude/skills/unity-game/references/agent-ops.md +9 -9
  551. package/plugins/robin/claude/skills/unity-game/references/fixes.md +21 -21
  552. package/plugins/robin/claude/skills/unity-game/references/from-a-web-game.md +17 -17
  553. package/plugins/robin/claude/skills/unity-game/references/handing-off.md +4 -4
  554. package/plugins/robin/claude/skills/unity-game/references/performance.md +10 -14
  555. package/plugins/robin/claude/skills/unity-game/references/probe.md +4 -4
  556. package/plugins/robin/claude/skills/unity-game/references/shared-mac.md +1 -1
  557. package/plugins/robin/claude/skills/unity-game/references/traps.md +13 -14
  558. package/plugins/robin/claude/skills/verifying/references/bar.md +1 -1
  559. package/plugins/robin/claude/skills/verifying/references/fidelity.md +11 -11
  560. package/plugins/robin/claude/skills/verifying/references/mobile-qa.md +10 -10
  561. package/plugins/robin/claude/skills/verifying/references/playtest.md +14 -14
  562. package/plugins/robin/claude/skills/verifying/references/unity.md +11 -11
  563. package/plugins/robin/claude/skills/world-and-story/SKILL.md +1 -1
  564. package/plugins/robin/claude/skills/world-and-story/references/atmosphere.md +4 -4
  565. package/plugins/robin/claude/skills/world-and-story/references/living-world.md +2 -2
  566. package/plugins/robin/claude/skills/world-and-story/references/opening-and-chapters.md +1 -1
  567. package/plugins/robin/claude/skills/world-and-story/references/story-at-size.md +2 -2
  568. package/plugins/robin/claude/skills/world-and-story/references/voice.md +1 -1
  569. package/plugins/robin/skills/fp-playtest/SKILL.md +2 -2
  570. package/plugins/robin/skills/funpixel-3d/references/bake-off.md +3 -3
  571. package/plugins/robin/skills/funpixel-3d/references/characters.md +1 -1
  572. package/plugins/robin/skills/funpixel-3d/references/hero-route.md +5 -5
  573. package/plugins/robin/skills/funpixel-3d/references/level-spec.md +1 -1
  574. package/plugins/robin/skills/funpixel-3d/references/levels.md +3 -3
  575. package/plugins/robin/skills/funpixel-3d/references/light-and-places.md +3 -3
  576. package/plugins/robin/skills/funpixel-3d/references/painted-target.md +7 -7
  577. package/plugins/robin/skills/funpixel-3d/references/three-loading.md +4 -4
  578. package/plugins/robin/skills/funpixel-3d/references/unity.md +13 -13
  579. package/plugins/robin/skills/funpixel-art/references/animation.md +1 -1
  580. package/plugins/robin/skills/funpixel-art/references/cast.md +3 -3
  581. package/plugins/robin/skills/funpixel-art/references/effects.md +2 -2
  582. package/plugins/robin/skills/funpixel-art/references/frames.md +6 -6
  583. package/plugins/robin/skills/funpixel-art/references/judging-frames.md +8 -8
  584. package/plugins/robin/skills/funpixel-art/references/look.md +4 -4
  585. package/plugins/robin/skills/funpixel-art/references/pipeline.md +2 -2
  586. package/plugins/robin/skills/funpixel-art/references/prompts.md +4 -4
  587. package/plugins/robin/skills/funpixel-art/references/ui.md +15 -15
  588. package/plugins/robin/skills/funpixel-art/references/unity.md +14 -14
  589. package/plugins/robin/skills/funpixel-audio/references/adaptive-music.md +4 -4
  590. package/plugins/robin/skills/funpixel-audio/references/engine.md +2 -2
  591. package/plugins/robin/skills/funpixel-audio/references/measure.md +1 -1
  592. package/plugins/robin/skills/funpixel-audio/references/unity.md +20 -19
  593. package/plugins/robin/skills/funpixel-brief/SKILL.md +1 -1
  594. package/plugins/robin/skills/funpixel-game-feel/SKILL.md +4 -4
  595. package/plugins/robin/skills/funpixel-game-feel/references/contact.md +6 -6
  596. package/plugins/robin/skills/funpixel-game-feel/references/unity.md +18 -23
  597. package/plugins/robin/skills/funpixel-game-logic/SKILL.md +3 -3
  598. package/plugins/robin/skills/funpixel-game-logic/references/balance.md +2 -2
  599. package/plugins/robin/skills/funpixel-game-logic/references/depth.md +2 -2
  600. package/plugins/robin/skills/funpixel-game-logic/references/escalation.md +5 -5
  601. package/plugins/robin/skills/funpixel-game-logic/references/probes.md +10 -10
  602. package/plugins/robin/skills/funpixel-game-logic/references/unity.md +28 -28
  603. package/plugins/robin/skills/funpixel-game-spine/SKILL.md +1 -1
  604. package/plugins/robin/skills/funpixel-game-spine/references/performance.md +2 -2
  605. package/plugins/robin/skills/funpixel-game-spine/references/replay.md +11 -11
  606. package/plugins/robin/skills/funpixel-game-spine/references/room-api.md +1 -1
  607. package/plugins/robin/skills/funpixel-game-spine/references/sdk.md +1 -1
  608. package/plugins/robin/skills/funpixel-gdd/SKILL.md +2 -2
  609. package/plugins/robin/skills/funpixel-gdd/references/as-built.md +2 -2
  610. package/plugins/robin/skills/funpixel-gdd/references/design-measures.md +2 -2
  611. package/plugins/robin/skills/funpixel-gdd/references/design-note.md +1 -1
  612. package/plugins/robin/skills/funpixel-gdd/references/first-look.md +1 -1
  613. package/plugins/robin/skills/funpixel-gdd/references/floors.md +2 -2
  614. package/plugins/robin/skills/funpixel-gdd/references/gameplay-contract.md +1 -1
  615. package/plugins/robin/skills/funpixel-gdd/references/genre-puzzle.md +4 -4
  616. package/plugins/robin/skills/funpixel-gdd/references/genre-racing.md +2 -2
  617. package/plugins/robin/skills/funpixel-gdd/references/genre-rpg.md +2 -2
  618. package/plugins/robin/skills/funpixel-gdd/references/genre-shooter.md +2 -2
  619. package/plugins/robin/skills/funpixel-gdd/references/genre-survival.md +2 -2
  620. package/plugins/robin/skills/funpixel-gdd/references/invent-first.md +3 -3
  621. package/plugins/robin/skills/funpixel-gdd/references/level-and-fun.md +11 -11
  622. package/plugins/robin/skills/funpixel-gdd/references/pages.md +2 -5
  623. package/plugins/robin/skills/funpixel-gdd/references/plan-at-size.md +5 -5
  624. package/plugins/robin/skills/funpixel-gdd/references/production-tiers.md +11 -11
  625. package/plugins/robin/skills/funpixel-gdd/references/sections.md +7 -7
  626. package/plugins/robin/skills/funpixel-gdd/references/spec-folder.md +3 -3
  627. package/plugins/robin/skills/funpixel-gdd/references/the-path.md +3 -4
  628. package/plugins/robin/skills/funpixel-gdd/references/world-and-identity.md +4 -4
  629. package/plugins/robin/skills/funpixel-gdd/references/worth.md +4 -4
  630. package/plugins/robin/skills/funpixel-mobile-ui/SKILL.md +3 -3
  631. package/plugins/robin/skills/funpixel-mobile-ui/references/hud-and-title.md +3 -3
  632. package/plugins/robin/skills/funpixel-mobile-ui/references/phone-check.md +1 -1
  633. package/plugins/robin/skills/funpixel-mobile-ui/references/recipes.md +1 -1
  634. package/plugins/robin/skills/funpixel-mobile-ui/references/restyle-ui.md +11 -11
  635. package/plugins/robin/skills/funpixel-mobile-ui/references/unity.md +23 -23
  636. package/plugins/robin/skills/funpixel-publish/references/compose.md +1 -1
  637. package/plugins/robin/skills/funpixel-publish/references/server-build.md +1 -1
  638. package/plugins/robin/skills/funpixel-store/SKILL.md +3 -3
  639. package/plugins/robin/skills/funpixel-store/references/app-store.md +1 -1
  640. package/plugins/robin/skills/funpixel-store/references/google-play.md +2 -2
  641. package/plugins/robin/skills/funpixel-store/references/ios-release.md +19 -20
  642. package/plugins/robin/skills/funpixel-store/references/money.md +2 -2
  643. package/plugins/robin/skills/funpixel-store/references/purchases-and-review.md +18 -18
  644. package/plugins/robin/skills/funpixel-store/references/readiness-page.md +1 -1
  645. package/plugins/robin/skills/funpixel-store/references/readiness.md +3 -3
  646. package/plugins/robin/skills/funpixel-store/references/unity-store.md +9 -12
  647. package/plugins/robin/skills/funpixel-unity-game/SKILL.md +28 -35
  648. package/plugins/robin/skills/funpixel-unity-game/references/agent-ops.md +9 -9
  649. package/plugins/robin/skills/funpixel-unity-game/references/fixes.md +21 -21
  650. package/plugins/robin/skills/funpixel-unity-game/references/from-a-web-game.md +17 -17
  651. package/plugins/robin/skills/funpixel-unity-game/references/handing-off.md +4 -4
  652. package/plugins/robin/skills/funpixel-unity-game/references/performance.md +10 -14
  653. package/plugins/robin/skills/funpixel-unity-game/references/probe.md +4 -4
  654. package/plugins/robin/skills/funpixel-unity-game/references/shared-mac.md +1 -1
  655. package/plugins/robin/skills/funpixel-unity-game/references/traps.md +13 -14
  656. package/plugins/robin/skills/funpixel-verify/references/bar.md +1 -1
  657. package/plugins/robin/skills/funpixel-verify/references/fidelity.md +11 -11
  658. package/plugins/robin/skills/funpixel-verify/references/mobile-qa.md +10 -10
  659. package/plugins/robin/skills/funpixel-verify/references/playtest.md +14 -14
  660. package/plugins/robin/skills/funpixel-verify/references/unity.md +11 -11
  661. package/plugins/robin/skills/funpixel-world-and-story/SKILL.md +1 -1
  662. package/plugins/robin/skills/funpixel-world-and-story/references/atmosphere.md +4 -4
  663. package/plugins/robin/skills/funpixel-world-and-story/references/living-world.md +2 -2
  664. package/plugins/robin/skills/funpixel-world-and-story/references/opening-and-chapters.md +1 -1
  665. package/plugins/robin/skills/funpixel-world-and-story/references/story-at-size.md +2 -2
  666. package/plugins/robin/skills/funpixel-world-and-story/references/voice.md +1 -1
  667. package/templates/common/.agents/skills/funpixel-3d/references/bake-off.md +3 -3
  668. package/templates/common/.agents/skills/funpixel-3d/references/characters.md +1 -1
  669. package/templates/common/.agents/skills/funpixel-3d/references/hero-route.md +5 -5
  670. package/templates/common/.agents/skills/funpixel-3d/references/level-spec.md +1 -1
  671. package/templates/common/.agents/skills/funpixel-3d/references/levels.md +3 -3
  672. package/templates/common/.agents/skills/funpixel-3d/references/light-and-places.md +3 -3
  673. package/templates/common/.agents/skills/funpixel-3d/references/painted-target.md +7 -7
  674. package/templates/common/.agents/skills/funpixel-3d/references/three-loading.md +4 -4
  675. package/templates/common/.agents/skills/funpixel-3d/references/unity.md +13 -13
  676. package/templates/common/.agents/skills/funpixel-art/references/animation.md +1 -1
  677. package/templates/common/.agents/skills/funpixel-art/references/cast.md +3 -3
  678. package/templates/common/.agents/skills/funpixel-art/references/effects.md +2 -2
  679. package/templates/common/.agents/skills/funpixel-art/references/frames.md +6 -6
  680. package/templates/common/.agents/skills/funpixel-art/references/judging-frames.md +8 -8
  681. package/templates/common/.agents/skills/funpixel-art/references/look.md +4 -4
  682. package/templates/common/.agents/skills/funpixel-art/references/pipeline.md +2 -2
  683. package/templates/common/.agents/skills/funpixel-art/references/prompts.md +4 -4
  684. package/templates/common/.agents/skills/funpixel-art/references/ui.md +15 -15
  685. package/templates/common/.agents/skills/funpixel-art/references/unity.md +14 -14
  686. package/templates/common/.agents/skills/funpixel-audio/references/adaptive-music.md +4 -4
  687. package/templates/common/.agents/skills/funpixel-audio/references/engine.md +2 -2
  688. package/templates/common/.agents/skills/funpixel-audio/references/measure.md +1 -1
  689. package/templates/common/.agents/skills/funpixel-audio/references/unity.md +20 -19
  690. package/templates/common/.agents/skills/funpixel-game-feel/SKILL.md +4 -4
  691. package/templates/common/.agents/skills/funpixel-game-feel/references/contact.md +6 -6
  692. package/templates/common/.agents/skills/funpixel-game-feel/references/unity.md +18 -23
  693. package/templates/common/.agents/skills/funpixel-game-logic/SKILL.md +3 -3
  694. package/templates/common/.agents/skills/funpixel-game-logic/references/balance.md +2 -2
  695. package/templates/common/.agents/skills/funpixel-game-logic/references/depth.md +2 -2
  696. package/templates/common/.agents/skills/funpixel-game-logic/references/escalation.md +5 -5
  697. package/templates/common/.agents/skills/funpixel-game-logic/references/probes.md +10 -10
  698. package/templates/common/.agents/skills/funpixel-game-logic/references/unity.md +28 -28
  699. package/templates/common/.agents/skills/funpixel-game-spine/SKILL.md +1 -1
  700. package/templates/common/.agents/skills/funpixel-game-spine/references/performance.md +2 -2
  701. package/templates/common/.agents/skills/funpixel-game-spine/references/replay.md +11 -11
  702. package/templates/common/.agents/skills/funpixel-game-spine/references/room-api.md +1 -1
  703. package/templates/common/.agents/skills/funpixel-game-spine/references/sdk.md +1 -1
  704. package/templates/common/.agents/skills/funpixel-gdd/SKILL.md +2 -2
  705. package/templates/common/.agents/skills/funpixel-gdd/references/as-built.md +2 -2
  706. package/templates/common/.agents/skills/funpixel-gdd/references/design-measures.md +2 -2
  707. package/templates/common/.agents/skills/funpixel-gdd/references/design-note.md +1 -1
  708. package/templates/common/.agents/skills/funpixel-gdd/references/first-look.md +1 -1
  709. package/templates/common/.agents/skills/funpixel-gdd/references/floors.md +2 -2
  710. package/templates/common/.agents/skills/funpixel-gdd/references/gameplay-contract.md +1 -1
  711. package/templates/common/.agents/skills/funpixel-gdd/references/genre-puzzle.md +4 -4
  712. package/templates/common/.agents/skills/funpixel-gdd/references/genre-racing.md +2 -2
  713. package/templates/common/.agents/skills/funpixel-gdd/references/genre-rpg.md +2 -2
  714. package/templates/common/.agents/skills/funpixel-gdd/references/genre-shooter.md +2 -2
  715. package/templates/common/.agents/skills/funpixel-gdd/references/genre-survival.md +2 -2
  716. package/templates/common/.agents/skills/funpixel-gdd/references/invent-first.md +3 -3
  717. package/templates/common/.agents/skills/funpixel-gdd/references/level-and-fun.md +11 -11
  718. package/templates/common/.agents/skills/funpixel-gdd/references/pages.md +2 -5
  719. package/templates/common/.agents/skills/funpixel-gdd/references/plan-at-size.md +5 -5
  720. package/templates/common/.agents/skills/funpixel-gdd/references/production-tiers.md +11 -11
  721. package/templates/common/.agents/skills/funpixel-gdd/references/sections.md +7 -7
  722. package/templates/common/.agents/skills/funpixel-gdd/references/spec-folder.md +3 -3
  723. package/templates/common/.agents/skills/funpixel-gdd/references/the-path.md +3 -4
  724. package/templates/common/.agents/skills/funpixel-gdd/references/world-and-identity.md +4 -4
  725. package/templates/common/.agents/skills/funpixel-gdd/references/worth.md +4 -4
  726. package/templates/common/.agents/skills/funpixel-mobile-ui/SKILL.md +3 -3
  727. package/templates/common/.agents/skills/funpixel-mobile-ui/references/hud-and-title.md +3 -3
  728. package/templates/common/.agents/skills/funpixel-mobile-ui/references/phone-check.md +1 -1
  729. package/templates/common/.agents/skills/funpixel-mobile-ui/references/recipes.md +1 -1
  730. package/templates/common/.agents/skills/funpixel-mobile-ui/references/restyle-ui.md +11 -11
  731. package/templates/common/.agents/skills/funpixel-mobile-ui/references/unity.md +23 -23
  732. package/templates/common/.agents/skills/funpixel-publish/references/compose.md +1 -1
  733. package/templates/common/.agents/skills/funpixel-publish/references/server-build.md +1 -1
  734. package/templates/common/.agents/skills/funpixel-store/SKILL.md +3 -3
  735. package/templates/common/.agents/skills/funpixel-store/references/app-store.md +1 -1
  736. package/templates/common/.agents/skills/funpixel-store/references/google-play.md +2 -2
  737. package/templates/common/.agents/skills/funpixel-store/references/ios-release.md +19 -20
  738. package/templates/common/.agents/skills/funpixel-store/references/money.md +2 -2
  739. package/templates/common/.agents/skills/funpixel-store/references/purchases-and-review.md +18 -18
  740. package/templates/common/.agents/skills/funpixel-store/references/readiness-page.md +1 -1
  741. package/templates/common/.agents/skills/funpixel-store/references/readiness.md +3 -3
  742. package/templates/common/.agents/skills/funpixel-store/references/unity-store.md +9 -12
  743. package/templates/common/.agents/skills/funpixel-unity-game/SKILL.md +28 -35
  744. package/templates/common/.agents/skills/funpixel-unity-game/references/agent-ops.md +9 -9
  745. package/templates/common/.agents/skills/funpixel-unity-game/references/fixes.md +21 -21
  746. package/templates/common/.agents/skills/funpixel-unity-game/references/from-a-web-game.md +17 -17
  747. package/templates/common/.agents/skills/funpixel-unity-game/references/handing-off.md +4 -4
  748. package/templates/common/.agents/skills/funpixel-unity-game/references/performance.md +10 -14
  749. package/templates/common/.agents/skills/funpixel-unity-game/references/probe.md +4 -4
  750. package/templates/common/.agents/skills/funpixel-unity-game/references/shared-mac.md +1 -1
  751. package/templates/common/.agents/skills/funpixel-unity-game/references/traps.md +13 -14
  752. package/templates/common/.agents/skills/funpixel-verify/references/bar.md +1 -1
  753. package/templates/common/.agents/skills/funpixel-verify/references/fidelity.md +11 -11
  754. package/templates/common/.agents/skills/funpixel-verify/references/mobile-qa.md +10 -10
  755. package/templates/common/.agents/skills/funpixel-verify/references/playtest.md +14 -14
  756. package/templates/common/.agents/skills/funpixel-verify/references/unity.md +11 -11
  757. package/templates/common/.agents/skills/funpixel-world-and-story/SKILL.md +1 -1
  758. package/templates/common/.agents/skills/funpixel-world-and-story/references/atmosphere.md +4 -4
  759. package/templates/common/.agents/skills/funpixel-world-and-story/references/living-world.md +2 -2
  760. package/templates/common/.agents/skills/funpixel-world-and-story/references/opening-and-chapters.md +1 -1
  761. package/templates/common/.agents/skills/funpixel-world-and-story/references/story-at-size.md +2 -2
  762. package/templates/common/.agents/skills/funpixel-world-and-story/references/voice.md +1 -1
  763. package/templates/common/AGENTS.md +1 -1
  764. package/templates/common/src/platform.ts +1 -1
  765. package/templates/common/src/probe-human.ts +3 -3
  766. package/templates/common/src/save.ts +1 -1
  767. package/templates/common/test/platform.test.ts +1 -1
  768. package/templates/three-world/src/budget.ts +1 -1
  769. package/templates/three-world/src/cutouts.ts +2 -2
  770. package/templates/three-world/src/game.ts +1 -1
  771. package/templates/three-world/src/models.ts +1 -1
  772. package/unity/com.funpixel.probe/Runtime/Player/Args.cs +1 -1
  773. package/unity/com.funpixel.probe/Runtime/Player/Bridge.cs +2 -2
  774. package/unity/com.funpixel.probe/Runtime/Player/Capture.cs +2 -2
  775. package/unity/com.funpixel.probe/Runtime/Player/Inject.cs +1 -2
  776. package/unity/com.funpixel.probe/Runtime/Player/Probe.cs +2 -2
  777. package/unity/com.funpixel.probe/Runtime/Player/UiTargets.cs +1 -1
  778. package/plugins/claude/skills/unity-game/references/studio-packages.md +0 -127
  779. package/plugins/codex/skills/funpixel-unity-game/references/studio-packages.md +0 -127
  780. package/plugins/cursor/skills/funpixel-unity-game/references/studio-packages.md +0 -127
  781. package/plugins/kiro/skills/funpixel-unity-game/references/studio-packages.md +0 -127
  782. package/plugins/robin/claude/skills/unity-game/references/studio-packages.md +0 -127
  783. package/plugins/robin/skills/funpixel-unity-game/references/studio-packages.md +0 -127
  784. package/templates/common/.agents/skills/funpixel-unity-game/references/studio-packages.md +0 -127
@@ -159,7 +159,7 @@ music.muffle(0.2);
159
159
  ## Prove it follows play (free, before anyone listens)
160
160
 
161
161
  A mix driven by a timer reads as a playlist; one that never moves is a single loop with extra
162
- files. Keep the decision pure and beside the rules, as Gesundheit's `src/mix.ts` does:
162
+ files. Keep the decision pure and beside the rules, as one game's `src/mix.ts` does:
163
163
  `musicMix(run, screen, lift) → { calm, swarm, lift }`, where `swarm` rises with the bugs on the
164
164
  field and sniffling ones count more. The `Music` class sets gains from it each frame, and a probe
165
165
  can chart the same function while a bot plays, with no browser and no audio device:
@@ -171,7 +171,7 @@ timelines: [{ name: 'wave 3', follow: [{ layer: 'swarm', driver: 'threats' }], r
171
171
  ```
172
172
 
173
173
  `npx @funpixel/tools sim` then says, per layer: it never moved (warn), it moved but not with what
174
- it follows (note, with the correlation), or it follows (r and the sample count). Gesundheit's
174
+ it follows (note, with the correlation), or it follows (r and the sample count). That game's
175
175
  `music-timeline.ts` printed the same chart as bars per half second with the chain and bloom
176
176
  marks beside them, which is how its creator saw the lift arrive on the payoff. The numbers
177
177
  cannot say it sounds good; listen once the chart says it moves.
@@ -183,8 +183,8 @@ cannot say it sounds good; listen once the chart says it moves.
183
183
  between them is part of the music.
184
184
  - The set piece: `muffle()` down for a beat before it, `sting()` on the reveal, then
185
185
  `switchOnBar()` to the `wonder` take, and leave it on while the player looks.
186
- - A score built on the game's own sound. Held Note (a horror game, 29 Sep 2026) built its music
187
- on one held note that bends as an enemy nears and gains layers with the threat, per-room ambience
186
+ - A score built on the game's own sound. A horror game (29 Sep 2026) built its music
187
+ on one sustained note that bends as an enemy nears and gains layers with the threat, per-room ambience
188
188
  beds under it, stingers on reveals, and real silence between phrases; the silence is what
189
189
  makes the next phrase land. Its radio voices were band-limited and driven like a small speaker
190
190
  with line noise, so a recording sounds like a recording.
@@ -21,10 +21,10 @@ line below answers a failure our games shipped with.
21
21
  sound per overlapping frame turns one hit into four (the tide-pool chime in the skill's worked
22
22
  example read `sounds` +4 per match until a 50 ms cooldown made it 1). ±6% pitch jitter keeps a
23
23
  repeated sound from reading as a loop. For the sounds a player hears most (footsteps, the core
24
- hit), Held Note generated 2–4 takes and picked one at random per play with ±4% pitch and ±2 dB,
24
+ hit), one game generated 2–4 takes and picked one at random per play with ±4% pitch and ±2 dB,
25
25
  which hid the repeat better than jitter on one take.
26
26
  - **Voices over everything else.** Duck music and beds under a voice line, and let a sound
27
- behind a wall go through a low-pass (Held Note's occlusion), so the voice and the room stay
27
+ behind a wall go through a low-pass (occlusion), so the voice and the room stay
28
28
  legible.
29
29
  - **Mute where the player looks first.** Players who want silence look on the first screen and in
30
30
  the HUD; a mute that resets on reload, or lives only in a settings menu, sends them away.
@@ -88,7 +88,7 @@ ffmpeg -i pool.mp3 -af loudnorm=I=-18:TP=-1 -ac 1 -b:a 96k pool-m.mp3
88
88
  ```
89
89
 
90
90
  `loudnorm` cannot measure a clip under about 0.4 s (its integrated loudness needs longer blocks),
91
- and on short files it silently changes how it behaves. Held Note (29 Sep 2026) levelled its short
91
+ and on short files it silently changes how it behaves. One game (29 Sep 2026) levelled its short
92
92
  sounds by their loudest 100 ms instead (the snippet above uses a 300 ms window; shorten `w` for
93
93
  clips that short), and kept `loudnorm` for music and loops.
94
94
 
@@ -4,9 +4,10 @@ The audio bug these games hit most was no sound at all. Four games went to TestF
4
4
 
5
5
  ## Tools
6
6
 
7
- The studio's `com.joydle.core` package carries the player side (fp:unity-game, `references/studio-packages.md`): `Sfx.Create(musicClip)` makes 8 pooled one-shot sources and one looping music source at volume 0.45 and calls `Sfx.EnsureListener()`, which adds an `AudioListener` when none exists; `Play(clip, volume)` jitters pitch by 0.06; `Settings.Sound` and `Settings.Music` are the player's toggles; `BuildTools.SimulatorMuted` builds a Simulator build with audio off for captures and restores the setting after. Not shipped by the kit or the package: the Unity starter, its checks and the studio scripts (the upload pre-flight, a music length check, a one-funnel effect tap, the audio import rule). Do those with what exists:
7
+ Not shipped by the kit: the Unity starter, its checks and the studio scripts (the upload pre-flight, a music length check, a one-funnel effect tap, the audio import rule). Do those with what exists:
8
8
 
9
9
  - Generate into the project: `npx @funpixel/tools gen sound "<cue>" --unity .` (`gen music`, `gen line`; `--loop` for a bed), after `npx @funpixel/tools login`. It lands 48 kHz WAV (ffmpeg trims the MP3's encoder padding) in `Assets/_Game/Generated/Sfx/`, `Loops/`, `Music/` or `Voice/`, and a rule set once per file: effects mono, ADPCM, decompress on load, normalisation off; loops PCM; music Vorbis, streaming. The studio's `gen_sfx.py` and `gen_music.py` call the same providers with `.env` keys: no metering, no cost log.
10
+ - A sound class of your own: 8 pooled one-shot sources with a pitch jitter of about 0.06, one looping music source at volume 0.45, an `AudioListener` added when none exists, and the player's Sound and Music toggles.
10
11
  - Before every upload, read `ProjectSettings/AudioManager.asset` yourself: `grep "m_DisableAudio: 1"` must find nothing.
11
12
  - `npx @funpixel/tools loudness Assets/Audio` reads every cue against its loudness target (ffmpeg EBU R128); ffmpeg's `ebur128`, `volumedetect` and `silencedetect` filters do the same by hand. `npx @funpixel/tools beats Assets/Audio/Music` writes each track's beat map.
12
13
  - Music length: an Edit Mode test that compares each clip's `AudioClip.samples` with its reference length.
@@ -18,7 +19,7 @@ Checks: `audio_runtime` and `recording_check` are proposed, not built. The studi
18
19
 
19
20
  ## Procedure
20
21
 
21
- 1. Make exactly one AudioListener and assert it at startup. A scene generated by code gets none by default; `Sfx.Create` adds it (or call `Sfx.EnsureListener()`).
22
+ 1. Make exactly one AudioListener and assert it at startup. A scene generated by code gets none by default; have the sound class add one when none exists.
22
23
  2. Set the project through the setup script, not a copied file: audio on (`m_DisableAudio: 0`) and `m_SampleRate` 48000. A cloned project carried `m_DisableAudio: 1`, and the Simulator mixed at 24 kHz without the rate.
23
24
  3. Write import rules in code and change the rule, never the `.meta`. A size pass that edited 190 SFX metas by hand was silently reverted by the rule on the next import.
24
25
 
@@ -35,23 +36,23 @@ Checks: `audio_runtime` and `recording_check` are proposed, not built. The studi
35
36
 
36
37
  | Game | Figure |
37
38
  |---|---|
38
- | Pocket Crew | music −18.5 LUFS, peaks at most −1 dBFS |
39
- | Stitch Pop | SFX mean −18 to −28 dB; music volume 0.45, about 7 dB under SFX |
40
- | Noodle Nights | crowd bed −30 LUFS |
41
-
42
- 8. Mix in code. No game uses an AudioMixer asset. Dead Letter ports its web mixer: buses, an 8-voice cap, round-robin variants, cooldowns, ±6% pitch, music crossfade, stinger ducks, and a tension loop that ducks music by 4 dB.
43
- 9. In a port, route every sound through one tap so an audit runs headless. Pocket Crew: 468 events, 0 mismatches against the web.
44
- 10. Re-render procedural web audio offline in C# instead of synthesising live. Dawg Ball's 70 clips (17.7 s) warm in 64 ms at boot; The Hot Gates' 41 cues and 3 loops match Chromium sample for sample (138 tests).
45
- 11. Handle interruptions: an Ambient audio session (it respects the silent switch and other apps), sound held on pause and during the studio splash (`JoydleSplash` pauses the game's audio until it ends; start the title music once `JoydleSplash.Playing` is false), resumed after backgrounding, calls or Siri. `OnApplicationPause(true)` also fires on resign-active (Control Center, Siri, call banners, Face ID).
39
+ | A 3D platformer | music −18.5 LUFS, peaks at most −1 dBFS |
40
+ | A casual game | SFX mean −18 to −28 dB; music volume 0.45, about 7 dB under SFX |
41
+ | An idle game | crowd bed −30 LUFS |
42
+
43
+ 8. Mix in code. No game uses an AudioMixer asset. One port carries over its web mixer: buses, an 8-voice cap, round-robin variants, cooldowns, ±6% pitch, music crossfade, stinger ducks, and a tension loop that ducks music by 4 dB.
44
+ 9. In a port, route every sound through one tap so an audit runs headless. One port: 468 events, 0 mismatches against the web.
45
+ 10. Re-render procedural web audio offline in C# instead of synthesising live. One game's 70 clips (17.7 s) warm in 64 ms at boot; another's 41 cues and 3 loops match Chromium sample for sample (138 tests).
46
+ 11. Handle interruptions: an Ambient audio session (it respects the silent switch and other apps), sound held on pause, resumed after backgrounding, calls or Siri. `OnApplicationPause(true)` also fires on resign-active (Control Center, Siri, call banners, Face ID).
46
47
  12. Run `audio_runtime` in the player: 1 listener, 48 kHz output, music playing within 3 s (of the splash's end, when one plays).
47
48
  13. Before sharing or uploading any video, run `recording_check`: 0 frame gaps over 34 ms and audio at 44.1 kHz or higher.
48
49
  14. Run the numeric lint (LUFS, peak, seam), then have a person listen. An agent can measure audio but not hear it, so the listen is a required gate on every game's ship-blocker list.
49
50
 
50
- Music that follows play: Dawg Ball's crowd volume swells near goals; Dead Letter crossfades and ducks on stingers. No game has layered adaptive music.
51
+ Music that follows play: one sports game's crowd volume swells near goals; another game crossfades and ducks on stingers. No game has layered adaptive music.
51
52
 
52
53
  ## Worked example
53
54
 
54
- Scrap Riot (a 2D port from Pixi), music loops and SFX levels:
55
+ A 2D port from Pixi, music loops and SFX levels:
55
56
 
56
57
  1. The MP3 loops decoded 1,245–1,997 samples long, so loops gapped.
57
58
  2. The loops were rebuilt as OGG from the web's `.m4a` at exact sample counts. Background music went 96 → 10 MB.
@@ -62,12 +63,12 @@ Scrap Riot (a 2D port from Pixi), music loops and SFX levels:
62
63
  ## Common mistakes
63
64
 
64
65
  - A code-made camera with no AudioListener: all four first games reached TestFlight silent; it cost one TestFlight round for three of them. `funtools doctor` warns when nothing adds one.
65
- - A cloned ProjectSettings: Dead Letter inherited `m_DisableAudio: 1`; the studio's upload pre-flight (proposed for the kit) caught it.
66
- - No 48 kHz setting: The Hot Gates mixed at 24 kHz and sounded muffled.
67
- - MP3 or ADPCM for loops: gaps (Scrap Riot) or clicks.
68
- - Uncommitted reimports: two review builds (Dead Letter, Scrap Riot) carried 190 reimported `.wav.meta` files, so main no longer matched what Apple reviewed.
69
- - Showing a recording before measuring it: a `simctl recordVideo` capture of The Hot Gates had 19 frame gaps up to 0.85 s and 24 kHz audio, cost about 1 h and was cancelled.
70
- - Generated audio nobody heard: Dawg Ball's 70 sounds, as of 29 Sep.
71
- - Many relaunches wedge the Simulator's CoreAudio (crash at audio init); `BuildTools.SimulatorMuted` (audio off for that build only, restored after) avoids it for capture runs, and the upload pre-flight refuses any build with audio off.
66
+ - A cloned ProjectSettings: one game inherited `m_DisableAudio: 1`; the studio's upload pre-flight (proposed for the kit) caught it.
67
+ - No 48 kHz setting: one game mixed at 24 kHz and sounded muffled.
68
+ - MP3 or ADPCM for loops: gaps or clicks.
69
+ - Uncommitted reimports: two review builds carried 190 reimported `.wav.meta` files, so main no longer matched what Apple reviewed.
70
+ - Showing a recording before measuring it: a `simctl recordVideo` capture of one game had 19 frame gaps up to 0.85 s and 24 kHz audio, cost about 1 h and was cancelled.
71
+ - Generated audio nobody heard: one game's 70 sounds, as of 29 Sep.
72
+ - Many relaunches wedge the Simulator's CoreAudio (crash at audio init); a Simulator build with audio off for that build only, restored after, avoids it for capture runs, and the upload pre-flight refuses any build with audio off.
72
73
  - `git commit -a` after a headless run: every run rewrites AudioManager.
73
74
  - The silent switch mutes Unity's Ambient session; accepted for casual games.
@@ -46,7 +46,7 @@ responses. More particles or shake do not automatically mean better feel.
46
46
  compulsory bundle. Keep the most important event distinct from routine actions. In an action
47
47
  game with several weapons, one contact function they all call keeps the feel consistent and
48
48
  tunable in one place; a new weapon that opens or cashes a state the old verbs already make
49
- (a reeling enemy) gives combos without new systems. Held Note's values, its weapons as tools
49
+ (a reeling enemy) gives combos without new systems. One action game's values, its weapons as tools
50
50
  of a pillar, and what its blind player caught: [references/contact.md](references/contact.md).
51
51
 
52
52
  3. **Protect control and fairness.** Hitstop freezes the picture, not the player: a press during
@@ -92,13 +92,13 @@ input problem may instead need a contact pose and a short impact cue.
92
92
  - Deleting feedback in reduced motion instead of replacing uncomfortable effects.
93
93
  - Calling effects measured in a quiet one-second sample proof that attacks read correctly.
94
94
  - A verb that exists only in the sim: with no pose, sound or visible result, players report it
95
- missing (Held Note's shove, for weeks).
96
- - Limiting a helper the genre's hit never limits (Lantern Night's capped jar, reported as a bug
95
+ missing (one game's shove, for weeks).
96
+ - Limiting a helper the genre's hit never limits (one game's capped jar, reported as a bug
97
97
  twice; Peggle's bucket never runs out). A real resource keeps its empty state visible.
98
98
  - A tell carried by sound alone: a muted phone never hears it, so the visual has to build across
99
99
  the whole warning.
100
100
 
101
- Where this comes from: our own games (the juice tables, Held Note's contact work, the `feel`
101
+ Where this comes from: our own games (the juice tables, one action game's contact work, the `feel`
102
102
  measures) and the hits in research 18; the juice vocabulary from Vlambeer's talks and "Juice it or
103
103
  lose it"; review habits from Claude Code Game Studios (MIT); hitstop that freezes the picture, not
104
104
  the player, began as a platform engine note.
@@ -1,6 +1,6 @@
1
1
  # Contact, verbs and weapons in an action game
2
2
 
3
- What one 3D action game learned about hits, verbs and weapons. Held Note is a third-person
3
+ What one 3D action game learned about hits, verbs and weapons. It is a third-person
4
4
  deep-sea horror game in three.js, built with the GDK's tools in September 2026 (its making notes:
5
5
  `design/MAKING.md`, `PERF.md`, `assets.md`). Between its first and second playtest, the round
6
6
  that added the contact work below, the blind critic panel's juice score went 5.60 → 6.17 and look
@@ -9,10 +9,10 @@ reason, not a proven recipe. A quiet puzzle needs none of this.
9
9
 
10
10
  ## One contact function
11
11
 
12
- Every weapon in Held Note calls one `impact(target, dir, kind)`, so a weapon added later inherits
12
+ Every weapon in it calls one `impact(target, dir, kind)`, so a weapon added later inherits
13
13
  the feel, and tuning happens in one place. What that function did:
14
14
 
15
- | Part | Held Note's value | Why |
15
+ | Part | Its value | Why |
16
16
  |---|---|---|
17
17
  | Target jolt | along the hit direction | shows where the force went |
18
18
  | Flash | the struck part goes white for a few frames | says "that one", even in the dark |
@@ -40,7 +40,7 @@ export function impact(t: Target, dir: Vec3, kind: 'hit' | 'sever' | 'kill') {
40
40
 
41
41
  ## A verb nobody can see does not exist
42
42
 
43
- Held Note's shove worked in the sim for weeks with no body animation, and the owner asked "don't we
43
+ The game's shove worked in the sim for weeks with no body animation, and the owner asked "don't we
44
44
  have a melee attack?". To a player, a verb without a pose, a sound and a visible result is not
45
45
  there. A two-handed shove and a slash fixed it. `funtools feel` reads each actor's look per state
46
46
  ([measure](measure.md)), which shows a state that borrows another's pose.
@@ -61,7 +61,7 @@ A question to ask of any new verb or weapon: which state does it open, and which
61
61
 
62
62
  ## Weapons as tools that serve a pillar
63
63
 
64
- Held Note's three tools each answer a design pillar and draw on the one shared resource (the gas
64
+ The game's three tools each answer a design pillar and draw on the one shared resource (the gas
65
65
  canister), so adding them kept the economy:
66
66
 
67
67
  - the cutter takes joints (the core verb);
@@ -104,7 +104,7 @@ sound can add to it without carrying it alone.
104
104
 
105
105
  ## Films need a bot that fights
106
106
 
107
- Held Note's route bots only cut, so films made from their runs showed no combat and a review could
107
+ The game's route bots only cut, so films made from their runs showed no combat and a review could
108
108
  not judge the weapons. A `fighter` bot style, for films only (the tests keep the median bot), plays
109
109
  the verbs a keen player would: Counters, knives, rivets, a death. If the payoff is a fight, film a
110
110
  fight.
@@ -1,28 +1,23 @@
1
1
  # Game feel: motion, juice and haptics
2
2
 
3
- Feel bugs pass every test. Dawg Ball's sim (the engine-free rules, stepped at a fixed 60 Hz) was correct, but 1 frame in 8 advanced 0 or 2 sim ticks, so the ball stalled and then jumped all match; the owner called it trembling. This skill gives each moment a measured answer and names the effects that were built, then removed.
3
+ Feel bugs pass every test. One soccer game's sim (the engine-free rules, stepped at a fixed 60 Hz) was correct, but 1 frame in 8 advanced 0 or 2 sim ticks, so the ball stalled and then jumped all match; the owner called it trembling. This skill gives each moment a measured answer and names the effects that were built, then removed.
4
4
 
5
5
  ## Tools
6
6
 
7
- The studio's `com.joydle.core` package carries the tweens and haptics (fp:unity-game, `references/studio-packages.md`):
8
-
9
- - `Juice.Tween(duration, step, unscaled)` with `EaseOutBack`, `EaseOutCubic` and `EaseInQuad`; `Juice.Pop` (scale 0.18 over 0.22 s, keeping the true rest scale) and `Juice.Shake` (0.08 over 0.25 s); `Juice.Ring` and `Juice.Dot` sprites for ripples and sparkles.
10
- - `Haptics.Light`, `Medium`, `Heavy`, `Success` and `Error`: iOS taptics through the package's native plugin, Android vibration effects, off when `Settings.Haptics` is. The throttle and merge in step 5 are the game's.
11
-
12
- Not in the kit or the package: the Unity starter, a frame-owner `GameDriver`, an interpolation blend with a trace flag, a near-miss tracker and the `moment_freq` check. Write those yourself:
7
+ Not in the kit: the Unity starter, coroutine tweens (a pop, a shake, eases), haptics by strength (iOS taptics through a native plugin, Android vibration effects, off with the player's setting), a frame-owner `GameDriver`, an interpolation blend with a trace flag, a near-miss tracker and the `moment_freq` check. Write those yourself:
13
8
 
14
9
  - A frame owner: one `MonoBehaviour` that reads input, steps the sim at a fixed rate (`sim.Update(dt)`), sends events to presenters and draws with `Render(alpha)`.
15
10
  - Interpolation and its trace: blend the drawn state between the last two ticks, and a dev-only launch flag that writes per-frame tick counts to a `trace.csv`.
16
11
  - A near-miss detector in the engine-free core, so bots can count it.
17
12
  - Frequency tests: bot batches in an Edit Mode test (`funtools unity run -- -nographics -runTests -testPlatform EditMode -testResults results.xml`, never with `-quit`: the test runner exits by itself), or `dotnet test` on an engine-free core, at 30 and 60 fps.
18
13
 
19
- No game uses DOTween (`Juice` does the tweens). Gallery Heist's views branch aims its camera with Cinemachine 6.6 and plays its intro on Timeline; the rest drive the camera in code. Nothing checks sliding feet or loop pops.
14
+ No game uses DOTween (coroutine tweens do). One game's views branch aims its camera with Cinemachine 6.6 and plays its intro on Timeline; the rest drive the camera in code. Nothing checks sliding feet or loop pops.
20
15
 
21
16
  ## Procedure
22
17
 
23
18
  1. Render interpolated between the last two fixed sim ticks. Check: 100% of frames with steps other than 1 are blended, and drawn-ball jerk p99 is under a threshold (value not in the report). A teleported or thrown ball blends for 0.18 s.
24
19
  2. Tie per-frame effects to sim steps, or scale them by dt (`1 - Math.Pow(0.4, dt*60)`). Check: headless runs at 60 and 120 Hz give the same end-state hash and effect counts per sim second.
25
- 3. Buffer the main action. Dawg Ball's kick has a 200 ms buffer (`BufferMs`): a press arms it and the foot swings when the ball arrives.
20
+ 3. Buffer the main action. The soccer game's kick has a 200 ms buffer (`BufferMs`): a press arms it and the foot swings when the ball arrives.
26
21
  4. Answer each moment from the table.
27
22
 
28
23
  | Moment | Answer | Duration |
@@ -37,9 +32,9 @@ No game uses DOTween (`Juice` does the tweens). Gallery Heist's views branch aim
37
32
  | Goal | net bulge, goal shake, the only big callout | no slow-mo |
38
33
 
39
34
  5. Map haptics by strength: a web vibration of 30 ms or more is heavy, 14 ms or more medium, else light. Throttle to 80–90 ms and merge pulses inside 120 ms into the strongest, so a light tap does not swallow a heavy one.
40
- 6. Keep each tween's true rest scale (`Juice.Pop` keys it by Transform); otherwise a second pop records a mid-pop scale as the base.
41
- 7. Draw particles from fixed pools; the pool is the budget. Dead Letter: 2 quad batches, 600 particles. Dawg Ball: 220 sprites, 120 confetti, 14 rings in 6 batched meshes. At most 120 spawns per second, oldest recycled; ambient at most 40 live.
42
- 8. Frequency-test every juice event with bot batches at 30 and 60 fps. Dawg Ball's targets: own goals at most 0.3 per match, misses and blocks 2–5 per 90 s.
35
+ 6. Keep each tween's true rest scale (key it by Transform); otherwise a second pop records a mid-pop scale as the base.
36
+ 7. Draw particles from fixed pools; the pool is the budget. One 2D game: 2 quad batches, 600 particles. The soccer game: 220 sprites, 120 confetti, 14 rings in 6 batched meshes. At most 120 spawns per second, oldest recycled; ambient at most 40 live.
37
+ 8. Frequency-test every juice event with bot batches at 30 and 60 fps. The soccer game's targets: own goals at most 0.3 per match, misses and blocks 2–5 per 90 s.
43
38
  9. Keep in-match overlays minimal; do not freeze or slow play while the clock runs.
44
39
  10. Measure a camera change against the problem it is meant to fix, in frames.
45
40
  11. Honour the effects setting: shake is skipped when "Shake & flashes" is off, and the kickoff dolly (about 1/3 closer over the 1.5 s countdown) when screen effects are off.
@@ -48,17 +43,17 @@ No game uses DOTween (`Juice` does the tweens). Gallery Heist's views branch aim
48
43
  | Role | How | Numbers |
49
44
  |---|---|---|
50
45
  | Hero | code; ports copy the web's procedural rig | pose tweens 0.22–0.4 s |
51
- | Rigged cast (Noodle Nights only) | Animator blend trees | transitions 0.12–0.15 s, exit time 0.9 |
52
- | Crowd (The Hot Gates) | vertex-animation textures, GPU instancing | 1,800 units in 18 draws |
46
+ | Rigged cast (one game only) | Animator blend trees | transitions 0.12–0.15 s, exit time 0.9 |
47
+ | Crowd | vertex-animation textures, GPU instancing | 1,800 units in 18 draws |
53
48
  | UI | coroutine tweens | defaults above |
54
49
 
55
50
  Root motion is off everywhere: the sim owns positions.
56
51
  13. Show the owner a zoomed close-up on one asset before rolling out a style.
57
- 14. Finish with a person playing on a phone: Dawg Ball's feel bugs came from the owner's TestFlight play.
52
+ 14. Finish with a person playing on a phone: the soccer game's feel bugs came from the owner's TestFlight play.
58
53
 
59
54
  ## Worked example
60
55
 
61
- Dawg Ball (a 3D port from three.js):
56
+ A soccer game (a 3D port from three.js):
62
57
 
63
58
  1. A dev trace flag wrote `trace.csv`: at a 60 Hz sim, 1 frame in 8 (12%) advanced 0 or 2 ticks.
64
59
  2. A blend draws every frame between the last two ticks.
@@ -68,11 +63,11 @@ Dawg Ball (a 3D port from three.js):
68
63
 
69
64
  ## Common mistakes
70
65
 
71
- - Slow-mo on goals (Dawg Ball): fired 14 times a match, read as lag, and shipped in every TestFlight build until 1 Oct.
72
- - A follow camera (Dawg Ball) showed both goals only 18–40% of the time; reverted to a fixed full-pitch view. With the next item, two rounds lost.
73
- - A camera lift for barks (Dead Letter): changed 0 covered frames (2–8 of 165 either way) and added a 25–69 pt view shift; PR #11 was reverted in PR #12.
74
- - A sticker-border shader (Dawg Ball): a 2D mock-up style put on dogs, ball and goals before a close-up was shown. It did not transfer to 3D, broke static merging (dozens more draws), cost about 3 builds and was removed: "it was much better before". Four more decorations were reverted the same way in 24 h.
75
- - A 1.6 s freeze after goals (Dawg Ball) read as "freezy".
76
- - Effects per render frame: at 120 Hz Pocket Crew's bobs and sparkles ran twice as fast.
66
+ - Slow-mo on goals: fired 14 times a match, read as lag, and shipped in every TestFlight build until 1 Oct.
67
+ - A follow camera showed both goals only 18–40% of the time; reverted to a fixed full-pitch view. With the next item, two rounds lost.
68
+ - A camera lift for barks (a 2D game): changed 0 covered frames (2–8 of 165 either way) and added a 25–69 pt view shift; PR #11 was reverted in PR #12.
69
+ - A sticker-border shader: a 2D mock-up style put on dogs, ball and goals before a close-up was shown. It did not transfer to 3D, broke static merging (dozens more draws), cost about 3 builds and was removed: "it was much better before". Four more decorations were reverted the same way in 24 h.
70
+ - A 1.6 s freeze after goals read as "freezy".
71
+ - Effects per render frame: at 120 Hz one game's bobs and sparkles ran twice as fast.
77
72
  - Concurrent pop tweens on one Transform: the cash pill grew huge (game not named).
78
- - "44 of 304 kicks connected" (Dawg Ball) is cited for this skill; its cause and fix are not in the report.
73
+ - "44 of 304 kicks connected" (the soccer game) is cited for this skill; its cause and fix are not in the report.
@@ -49,7 +49,7 @@ native in about a day each, and the ports found four bugs the tests had missed (
49
49
  `__FPX_STATE__()` exposes `seed`.
50
50
  3. **Rules as numbered, named constants** (`R1 jump height 3.2 tiles`, `R2 coyote 80 ms`) in
51
51
  `src/sim/rules.ts`, listed in the design note, each proved by a test named after it
52
- (`R2: a jump 70 ms after leaving a ledge still fires`). Dead Letter's rule ids let traversal tests
52
+ (`R2: a jump 70 ms after leaving a ledge still fires`). One game's rule ids let traversal tests
53
53
  catch a ledge with 64 px of headroom (research 12); a change then moves the note, the constant and
54
54
  the test together.
55
55
  4. **Determinism as a test.** Same seed and inputs, same state hash; a tiebreaker on every sort and a
@@ -68,7 +68,7 @@ hand-made anchors plus a seeded recipe the bots check: [references/content-at-sc
68
68
  ## Escalation changes what the player does
69
69
 
70
70
  Faster alone leaves the game the same, only harder to read, and `check_plan` flags a ramp that is
71
- speed alone. Dead Letter's review found its ramp invisible: the area indicator was computed and not
71
+ speed alone. One game's review found its ramp invisible: the area indicator was computed and not
72
72
  drawn. A ramp as a list of what changes, new things one at a time, waves with rests, and a ramp the
73
73
  player can see: [references/escalation.md](references/escalation.md).
74
74
 
@@ -83,7 +83,7 @@ option with its reason; the bots below measure them.
83
83
 
84
84
  A headless loop over `src/sim` plays thousands of runs in seconds, where a browser session plays
85
85
  one, so tuning from bots, a frozen novice floor, a bot that finishes the level in `npm test` (in
86
- Held Note it caught a speed change that starved a route), a blind phone player, a parameter sweep
86
+ one game it caught a speed change that starved a route), a blind phone player, a parameter sweep
87
87
  and a hunt for what bots never do all come cheap once the rules stand alone. Each, with its reason
88
88
  and where it came from: [references/balance.md](references/balance.md); the five probe players and
89
89
  `sim`: [references/probes.md](references/probes.md).
@@ -33,10 +33,10 @@ fitted the seeds or the game. This floor is a regression check: it predicts no h
33
33
  and fails the suite when it no longer reaches the end, is the other half: a balance change that
34
34
  makes the level unfinishable turns the tests red at once. A `funtools init` game starts with one
35
35
  (`rules.test.ts`: `botRound` wins a round on seed 5); a longer game grows it. This is a lesson from
36
- one game, Held Note (a 3D horror chapter, September 2026, gathered by the Held Note lane), and no
36
+ one game (a 3D horror chapter, September 2026, gathered by its lane), and no
37
37
  first-try action game has tested it yet.
38
38
 
39
- Held Note's chapter test (`chapter.test.ts`, "Contract H", named after the GDD's numbers) carried:
39
+ Its chapter test (`chapter.test.ts`, "Contract H", named after the GDD's numbers) carried:
40
40
 
41
41
  - `median_bot_finishes` for each of two routes (seal every weldable door, or fight through) on five
42
42
  seeds. The bot plays through the same intent a thumb produces, with a human reaction budget.
@@ -4,8 +4,8 @@ What a player gets from a game over ten minutes, and what brings them back for r
4
4
  in one session can match a hit on feel per second; the next thing it loses on is depth. In our
5
5
  head-to-heads against the genre hits (29 Sep), the player seat chose the hit almost every time and
6
6
  said why: "a dense, escalating ten-minute score attack against a single sparse maze, a 1:38 run"
7
- (Riad Rush against Pac-Man CE DX), "the early basket is too sparse, there is no packing pressure"
8
- (Plush Pop against Suika Game), "no endless mode, no leaderboard" (Gesundheit). Depth here is
7
+ (a maze game against Pac-Man CE DX), "the early basket is too sparse, there is no packing pressure"
8
+ (a merge game against Suika Game), "no endless mode, no leaderboard" (an arcade game). Depth here is
9
9
  structure and numbers, not content volume, so it is within a session's reach. Everything below is an
10
10
  option with its reason; pick what serves the game and write the choice into the design note.
11
11
 
@@ -1,7 +1,7 @@
1
1
  # Escalation that changes what the player does
2
2
 
3
3
  Detail for the escalation section of the game-logic skill. Faster alone leaves the game the same,
4
- only harder to read. Dead Letter's review found its ramp invisible: the area indicator was computed
4
+ only harder to read. One game's review found its ramp invisible: the area indicator was computed
5
5
  and not drawn. What has worked:
6
6
 
7
7
  1. A ramp written as a list of what changes: a new enemy type, a pattern, a narrower gap, a second
@@ -19,12 +19,12 @@ and not drawn. What has worked:
19
19
  novice and skilled players, how many clear each level, how many lose there and how long they spend.
20
20
  It warns on four shapes that lost players on 30 Sep:
21
21
 
22
- - **Flat**: everyone clears it, nobody loses, in under 45 s (Lantern Night's first garden gave three
22
+ - **Flat**: everyone clears it, nobody loses, in under 45 s (one game's first garden gave three
23
23
  stars in 35 s). A first level may teach; a flat level mid-ramp is time with nothing to learn.
24
- - **A wall for people**: the skilled bot clears it only at 60 decisions a second (Saltwake's Dusk
25
- Cup). Wrap the sharp policy in `humanRate` (12 decisions a second, 200 ms to react; a thumb makes
24
+ - **A wall for people**: the skilled bot clears it only at 60 decisions a second (one racer's last
25
+ cup). Wrap the sharp policy in `humanRate` (12 decisions a second, 200 ms to react; a thumb makes
26
26
  10–15) and read both: a level the twin cannot clear asks for superhuman input.
27
- - **Cannot be lost**: no player lost a run over minutes of play (Sunhop). A puzzle or toy on purpose
27
+ - **Cannot be lost**: no player lost a run over minutes of play (one of our games). A puzzle or toy on purpose
28
28
  says so; else a threat, a clock or a resource can end a run.
29
29
  - **No ramp**: the novice loses no more and takes no longer later than early.
30
30
 
@@ -16,15 +16,15 @@ the game means to have, so a good run can end on its own.
16
16
 
17
17
  | Role | Plays | Finds | Where it came from |
18
18
  |---|---|---|---|
19
- | `idle` | never presses | standing still wins, or waves clear themselves | Gesundheit: the blind phone player idled ~12 s reading the screen and wave 3 cleared itself; `idle-probe.ts` then measured it on 40 seeds per wave |
19
+ | `idle` | never presses | standing still wins, or waves clear themselves | one arcade game: the blind phone player idled ~12 s reading the screen and wave 3 cleared itself; `idle-probe.ts` then measured it on 40 seeds per wave |
20
20
  | `naive` | steers straight at the nearest target, human-slow | no skill ceiling: the objective set holds no challenge | Research 19 §15 lesson 9: if a naive steer-to-marker bot clears everything, the design note says so on purpose |
21
- | `taught` | does exactly what the tutorial teaches, with ~0.2 s reaction | a tutorial that teaches a losing line; a mechanic that hurts the player who uses it | Gesundheit `core-metrics.ts`: "tap a bug, wait for the wedge to go white, slip sideways out"; it measured how often the bee was safe from its own chain and whether the chain's reward reached it |
21
+ | `taught` | does exactly what the tutorial teaches, with ~0.2 s reaction | a tutorial that teaches a losing line; a mechanic that hurts the player who uses it | the same game's `core-metrics.ts`: "tap a bug, wait for the wedge to go white, slip sideways out"; it measured how often the bee was safe from its own chain and whether the chain's reward reached it |
22
22
  | `skilled` | the sharp line, fast | exploits, and whether a win is reachable at all | every bar game's balance bot |
23
- | `novice` | slow, hesitates, one press in five wrong, only what a player sees | onboarding: does a newcomer reach the first success? | Gesundheit `novice.ts`: frozen policy and policy hash, 100 fixed seeds plus 100 held out, deaths by cause |
24
- | `middle` (optional) | SOME of what is taught (leans and rests, never takes cover) | a difficulty cliff: half the lesson loses like none of it | Blue Freight r4: the careless and the careful bots, nothing between |
23
+ | `novice` | slow, hesitates, one press in five wrong, only what a player sees | onboarding: does a newcomer reach the first success? | the same game's `novice.ts`: frozen policy and policy hash, 100 fixed seeds plus 100 held out, deaths by cause |
24
+ | `middle` (optional) | SOME of what is taught (leans and rests, never takes cover) | a difficulty cliff: half the lesson loses like none of it | one game's round 4: the careless and the careful bots, nothing between |
25
25
 
26
26
  Each player sees only what a player could see: positions, marks, the HUD, never the rules'
27
- private state. A policy that clones the run or simulates seconds ahead (Blue Freight r4's sharp bot:
27
+ private state. A policy that clones the run or simulates seconds ahead (that round's sharp bot:
28
28
  `glare()` looked 4–7 s ahead) is not a person at any rate: say so with `foresight: '<what it
29
29
  knows>'` on the policy, and sim does not count its wins as a careful player's at a human pace. Freeze the novice (its code, its seeds) before tuning, or the floor moves with
30
30
  the balance.
@@ -39,7 +39,7 @@ the balance.
39
39
  - **note**: no skill ceiling. The naive player wins as often, and as fast, as the sharp one; or
40
40
  wins as often and skill shows only as time. Fine for a toy, a relaxed game or a race against
41
41
  the clock: say so in the design note. Otherwise give the verb something to master: a risk that
42
- pays (Gesundheit's chain that reaches the bee), a line to read, a combo that holds.
42
+ pays (the arcade game's chain that reaches the bee), a line to read, a combo that holds.
43
43
  - **length**: how long the sharp bot's run lasts (with its spread over seeds, and the second it
44
44
  reached each level when `level(run)` is given) against 15 minutes (funpixel.json
45
45
  `play_min_minutes` moves it) and the design doc's `Play length:` line. Under it is a warn: a game
@@ -48,7 +48,7 @@ the balance.
48
48
  - **ending**: `ended(run)` on the game names the ending (the last content reached, an end screen; a
49
49
  won outcome counts too), and the cohort reports `ended` (seeds) and `endedAt` (the mean second)
50
50
  apart from losses. A skilled run that never ends warns "no ending reached in 900 s" (content that
51
- loops, as Riad Rush's three mazes did); an endless score attack says "on purpose" on its line.
51
+ loops, as one game's three mazes did); an endless score attack says "on purpose" on its line.
52
52
  - **curve** (with `level(run)`): clear rate, loss rate and time per level for each player. A flat
53
53
  level, a wall, a run nothing loses and a missing ramp are named ([escalation.md](escalation.md)).
54
54
  A human-rate twin of the sharp player (`humanRate(skilled, game.dt, { rest: 0 })` from `src/probe-human.ts`, 12 decisions a
@@ -77,14 +77,14 @@ wiring, and it replaces a hand-written bot script. A probe still importing the d
77
77
  so when `sim` runs it; `--timeout` gives a campaign probe more than 300 s, and anything the probe
78
78
  prints to stderr is shown.
79
79
 
80
- The worst case matters, not the average (Iron Line's playtest tracked the deepest overlap and
80
+ The worst case matters, not the average (one game's playtest tracked the deepest overlap and
81
81
  the longest stuck time over 240 s of AI against AI). What should not happen at all goes in `broken()`.
82
82
 
83
83
  ## Stage the signature moment from the rules
84
84
 
85
85
  Critics judge stills, and a moment view that fakes its payoff shows a frame play cannot reach.
86
86
  `stageMoment(game, skilled, { seeds, at: [6, 8, 10, 12], window: 6, score })` plays each seed to
87
- each start time, then scores the events in the window after (Gesundheit's `moment.ts`: the longest
87
+ each start time, then scores the events in the window after (the arcade game's `moment.ts`: the longest
88
88
  real chain within 6 s). `sim` prints the best seed and time. The moment view replays it through
89
89
  the rules:
90
90
 
@@ -97,7 +97,7 @@ const views = {
97
97
  `capture` then shoots a payoff the game really reaches, and a later rules change that breaks the
98
98
  moment shows up as a lower score in `sim`, not as a stale picture.
99
99
 
100
- ## Numbers from Gesundheit (its own probes, 100 seeds unless named)
100
+ ## Numbers from one arcade game (its own probes, 100 seeds unless named)
101
101
 
102
102
  - Idle: the blind phone player idled about 12 s and wave 3 cleared itself. On today's rules an
103
103
  idle bee clears 0 of 40 seeds in every combat wave and lives 17 to 28 s (`idle-probe.ts`, 29 Sep).
@@ -1,9 +1,9 @@
1
1
  # Game logic in a Unity game
2
2
 
3
3
  Rules kept in plain C#, outside the engine, can be tested in seconds and played by bots thousands
4
- of times. That only helps when the tests and bots see what a player sees. Pocket Crew's first
4
+ of times. That only helps when the tests and bots see what a player sees. A 3D platformer's first
5
5
  TestFlight build drew every moving platform frozen after the first level behind 1,118 green
6
- tests, and Porcelain Panic was tuned twice against bots that aimed worse than a person, who then
6
+ tests, and a ball puzzle was tuned twice against bots that aimed worse than a person, who then
7
7
  cleared level 62 in one shot.
8
8
 
9
9
  ## Tools
@@ -13,7 +13,7 @@ learned with (`unity_check.py` among them) are proposed. "Partial" below means a
13
13
  studio's games, not in the kit. Until the starter ships, run what exists: `dotnet test` on an
14
14
  engine-free core (seconds, many agents at once), Unity's own test runner for the rest
15
15
  (`funtools unity run -- -nographics -runTests -testPlatform EditMode -testResults results.xml`,
16
- or `-testPlatform PlayMode` for tests that need a running scene, as Floe Jam's `FloeJam.PlayTests` do,
16
+ or `-testPlatform PlayMode` for tests that need a running scene, as one game's `PlayTests` assembly does,
17
17
  queued one run per project across agents, and never with `-quit`: the test runner exits by itself), and each check below as an ordinary test in your own project.
18
18
 
19
19
  | Check | Pass | Status and tool |
@@ -22,14 +22,14 @@ queued one run per project across agents, and never with `-quit`: the test runne
22
22
  | `core_tests` | 0 failures, count ≥ baseline, csproj tracked | partial: a `CoreTests~` project; count and csproj checks proposed |
23
23
  | `core_engine_free` | no `UnityEngine` in Core | partial: compiler-enforced, no lint guards the flag |
24
24
  | `determinism_lint` | 0 uses of `Math.Round`, `List.Sort`, `Mathf.*` and similar outside the JS-math shims | proposed |
25
- | `web_goldens` | 0 diffs against web traces | partial: Hot Gates |
25
+ | `web_goldens` | 0 diffs against web traces | partial: one port |
26
26
  | `rules_guard` | `Rules.Mobile` with fix flags off equals `Rules.WebParity` | partial: branches |
27
27
  | `alloc_quiet` | 0 B per warm sim step | partial: an allocation test in one game |
28
- | `balance_gate` | every character 40–60% at every AI level, N ≥ 200 per pairing | partial: Dawg Ball, one level only |
29
- | `difficulty_bots` | sharp bot ≥ 2 shots past onboarding; noisy bot ≥ 75% clears per section | partial: Porcelain Panic |
30
- | `softlock_bot` | 0 states with no valid action | partial: Dead Letter level tests |
31
- | `economy_pacing` | time to finish in band; offline pay ≤ next purchase | partial: Noodle Nights, Dawg Ball |
32
- | `physics_fuzz` | 0 inside-solid, tunnel, NaN or stuck | partial: Pocket Crew |
28
+ | `balance_gate` | every character 40–60% at every AI level, N ≥ 200 per pairing | partial: one game, one level only |
29
+ | `difficulty_bots` | sharp bot ≥ 2 shots past onboarding; noisy bot ≥ 75% clears per section | partial: one game |
30
+ | `softlock_bot` | 0 states with no valid action | partial: one game's level tests |
31
+ | `economy_pacing` | time to finish in band; offline pay ≤ next purchase | partial: two games |
32
+ | `physics_fuzz` | 0 inside-solid, tunnel, NaN or stuck | partial: one game |
33
33
 
34
34
  `Rules` flags are default-off switches in the Core for experiments and mobile fixes. The report
35
35
  defines `Rules.WebParity` and `Rules.Mobile` only through `rules_guard`.
@@ -48,43 +48,43 @@ defines `Rules.WebParity` and `Rules.Mobile` only through `rules_guard`.
48
48
 
49
49
  | Pattern | Proof | Game |
50
50
  |---|---|---|
51
- | Generated, solvable by construction | a solver test | Koi Out: 600 levels by reverse removal, 29 tests |
52
- | Generated, fitted to a bot | budgets fitted to sharp-bot shots, then capped from human play | Porcelain Panic |
51
+ | Generated, solvable by construction | a solver test | a puzzle game: 600 levels by reverse removal, 29 tests |
52
+ | Generated, fitted to a bot | budgets fitted to sharp-bot shots, then capped from human play | the ball puzzle |
53
53
  | Data from the web build | level laws as tests | every port |
54
54
 
55
- Level laws are properties held as tests. Pocket Crew's: widest gap, dock distance, player at
55
+ Level laws are properties held as tests. The platformer's: widest gap, dock distance, player at
56
56
  least 9% of screen height, every attack at least 0.6 s after its tell, plus a journey bot
57
57
  that frees all crew on 5 seeds.
58
58
  5. Set difficulty with two bots and a person. A sharp bot plays like a sharp player and gives
59
- the floor; a noisy bot gives the clear rate; the cap comes from a person playing. Porcelain
60
- Panic ended at budget = bot estimate × 0.5, capped at 10 balls (one room) and 14 (two).
59
+ the floor; a noisy bot gives the clear rate; the cap comes from a person playing. The ball
60
+ puzzle ended at budget = bot estimate × 0.5, capped at 10 balls (one room) and 14 (two).
61
61
  6. Gate balance at every AI level, on unseen seeds, one change at a time. Four matches per
62
62
  pairing is ±5 points of noise, so use 200. Run the sweep before building art for a rule
63
- change: Dawg Ball built two rounds of goal art first.
63
+ change: a soccer game built two rounds of goal art first.
64
64
  7. Judge a power-up with paired seeds at large N. Pass: the holder's goal delta is under 0.3
65
- either way (2,400 pairs, about 10 minutes, in Dawg Ball).
65
+ either way (2,400 pairs, about 10 minutes, in the soccer game).
66
66
  8. Simulate the economy with offline earnings and a spend-everything bot.
67
67
  9. Hold the warm sim step at 0 B of garbage with a test: a 40-robot chain went from 4 KB to 0 B
68
- (game not in the report), and Hot Gates holds 0 B over 600 frames.
68
+ (game not in the report), and one port holds 0 B over 600 frames.
69
69
  10. Fuzz physics per level: a short fuzz every run, a deep fuzz before TestFlight.
70
70
  11. Test levels the way players reach them: enter each as a second or later level through Next,
71
71
  Continue or Restart (the check `entry_path`, proposed).
72
- 12. Run each new regression test against the parent commit, where it must fail. A Dawg Ball
72
+ 12. Run each new regression test against the parent commit, where it must fail. A soccer-game
73
73
  cheat test passed on the old server too.
74
74
  13. Play by hand through remote input after the bots pass. Bots miss readability: hand play in
75
- Pocket Crew found fans that looked walkable.
75
+ the platformer found fans that looked walkable.
76
76
  14. Test the save: migration from every earlier format and corruption (the games test 12 kinds of
77
77
  bad JSON). Unity's NUnit is old (no `Assert.Multiple`, no `Does.Contain` on an enum), so write
78
78
  those tests for the plain .NET project or keep to the old asserts.
79
79
  15. Treat a hit you are measuring against as a reference, not a target: measure it frame by frame
80
80
  (the owner's recording at `ffmpeg -vf fps=1`, contact sheets, a timed log) before copying a
81
- number. Dawg Ball's ball was 40% too big and play 1.6× faster than Head Ball 2's; a taller goal
81
+ number. The soccer game's ball was 40% too big and play 1.6× faster than Head Ball 2's; a taller goal
82
82
  to match it added 15–20% goals and was rejected ("if it makes scoring too easy, don't"). A tempo
83
83
  of 0.75 matched its 10.5 goals per 90 s.
84
84
 
85
85
  ## Worked example
86
86
 
87
- Dawg Ball's balance gate (a three.js port with several characters and AI levels):
87
+ The soccer game's balance gate (a three.js port with several characters and AI levels):
88
88
  1. A narrower pitch with ground goals looked fine at the "good" AI level.
89
89
  2. At the Alpha level it spread 33–68%.
90
90
  3. The dead end cost about 220,000 simulated matches.
@@ -93,16 +93,16 @@ Dawg Ball's balance gate (a three.js port with several characters and AI levels)
93
93
 
94
94
  ## Common mistakes
95
95
 
96
- - Tuning against a weak bot: Porcelain Panic's random-aim bot won 90–100% everywhere, and its
96
+ - Tuning against a weak bot: the ball puzzle's random-aim bot won 90–100% everywhere, and its
97
97
  "human-style" bot left 33 balls on level 72. Two redesigns in two days.
98
- - Calibrating at one AI level: a Dawg Ball head then spread 15–76% at Alpha.
99
- - Leaving offline pay out of the economy sim: Noodle Nights paid about $50K for two hours away
98
+ - Calibrating at one AI level: one head then spread 15–76% at Alpha.
99
+ - Leaving offline pay out of the economy sim: an idle city game paid about $50K for two hours away
100
100
  at minute 5, about the price of the whole city. Offline pay is now ≤ the next pad's cost, and
101
101
  cost growth 1.12 gives a 162-minute city.
102
102
  - A bot that takes only legal actions: it missed food picked up with nowhere to deliver it
103
- (reported with Noodle Nights).
104
- - Starting every level fresh at boot: Pocket Crew's movers drew frozen in every level after the
103
+ (reported with the idle game).
104
+ - Starting every level fresh at boot: the platformer's movers drew frozen in every level after the
105
105
  first; the audit's frozen count went 219 → 0 once fixed.
106
- - Skipping the physics fuzz: Pocket Crew had 1,988 respawns inside solid geometry on 24 of 26
106
+ - Skipping the physics fuzz: the platformer had 1,988 respawns inside solid geometry on 24 of 26
107
107
  levels.
108
- - A test that never asserts: Dawg Ball's "always ends with a winner" did not.
108
+ - A test that never asserts: the soccer game's "always ends with a winner" did not.
@@ -70,7 +70,7 @@ bundles ESM packages, and a CDN script is a runtime fetch the build cannot see.
70
70
 
71
71
  No model was trained on `@funpixel/sdk`, so a guessed name costs a build, and a guess that
72
72
  type-checks can do nothing at runtime: look it up in [references/sdk.md](references/sdk.md) or
73
- `node_modules/@funpixel/sdk/dist/*.d.ts`, never cast it. Pin it exactly (`"0.6.0"`). The six worth
73
+ `node_modules/@funpixel/sdk/dist/*.d.ts`, never cast it. Pin it exactly (`"0.7.0"`). The six worth
74
74
  using: `setupGameResize` from `@funpixel/sdk` (the only root export), `AudioEngine` from
75
75
  `@funpixel/sdk/audio`, `SaveManager` from `@funpixel/sdk/save`, `initLiveParams` from
76
76
  `@funpixel/sdk/liveParams`, `safeArea` from `@funpixel/sdk/device`, and `Room`, `getGameKey`,
@@ -86,10 +86,10 @@ handful of characters and some dozens of props spend about a millisecond in simu
86
86
 
87
87
  ## Worked examples
88
88
 
89
- - The per-stage frame budget: Knockout Lap's `src/game/prof.ts`, with its marks in
89
+ - The per-stage frame budget: one racer's `src/game/prof.ts`, with its marks in
90
90
  `src/game/loop.ts` (private repository; copy the approach). It reads as `window.__FPX_PROF__()`
91
91
  and on screen behind `#prof`.
92
- - Measuring a load: Gallery Heist's repository (private; copy the approach, not a dependency) keeps
92
+ - Measuring a load: one game's repository (private; copy the approach, not a dependency) keeps
93
93
  the measuring scripts in `game/tools/perf/`: `phone-load.mjs` (the throttled load: time to Play,
94
94
  bytes before it, long tasks and 20 s of play, as one JSON line), `phone-ab.sh` (builds
95
95
  alternated), `phone-profile.mjs` (a CPU profile of the load) and `gpu-mem.mjs` with `gputrack.js`