@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.
- package/bench/handlers/bake_emissive.py +2 -2
- package/bench/handlers/decimate.py +2 -2
- package/bench/handlers/fracture.py +1 -1
- package/bench/handlers/normalize_transform.py +3 -3
- package/bench/handlers/render_views.py +2 -2
- package/bench/handlers/views.py +6 -6
- package/dist/cli.js +8 -9
- package/dist/commands/feedback.js +5 -5
- package/dist/commands/init.js +1 -1
- package/dist/direct/read.js +1 -1
- package/dist/doctor/unity-checks.js +5 -5
- package/dist/doctor/unity-history.js +17 -33
- package/dist/feedback/ab.js +0 -40
- package/dist/gen/unity.js +3 -3
- package/dist/mcp/server.js +2 -1
- package/dist/pipeline/pipeline.js +6 -6
- package/dist/playtest/moments.js +1 -1
- package/dist/playtest/report.js +1 -1
- package/dist/production/mirror.js +2 -2
- package/dist/sim/curve.js +3 -3
- package/dist/spec/scaffold.js +1 -1
- package/dist/studio/pitch.js +1 -1
- package/dist/unity/probe/install.js +1 -1
- package/dist/vendor/verify/src/page/actors.js +2 -2
- package/dist/vendor/verify/src/page/capture_view.js +2 -2
- package/dist/vendor/verify/src/page/dressing.js +1 -1
- package/dist/vendor/verify/src/page/frame_honesty.js +1 -1
- package/dist/vendor/verify/src/page/front_door.js +2 -2
- package/dist/vendor/verify/src/page/grounding.js +3 -3
- package/dist/vendor/verify/src/page/hud.js +3 -3
- package/dist/vendor/verify/src/page/layout.js +5 -5
- package/dist/vendor/verify/src/page/life_anim.js +6 -6
- package/dist/vendor/verify/src/page/mechanic_check.js +1 -1
- package/dist/vendor/verify/src/page/phone_check.js +2 -2
- package/dist/vendor/verify/src/page/recorder.js +2 -2
- package/dist/vendor/verify/src/page/surfaces.js +2 -2
- package/dist/vendor/verify/src/page/world_actors.js +3 -3
- package/package.json +2 -2
- package/plugins/README.md +16 -0
- package/plugins/claude/README.md +2 -3
- package/plugins/claude/agents/art-director.md +2 -2
- package/plugins/claude/commands/playtest.md +2 -2
- package/plugins/claude/hooks/brief.md +1 -1
- package/plugins/claude/hooks/guidance.json +1 -1
- package/plugins/claude/hooks/vendor/pipeline/pipeline.mjs +6 -6
- package/plugins/claude/hooks/vendor/studio/pitch.mjs +1 -1
- package/plugins/claude/skills/3d/references/bake-off.md +3 -3
- package/plugins/claude/skills/3d/references/characters.md +1 -1
- package/plugins/claude/skills/3d/references/hero-route.md +5 -5
- package/plugins/claude/skills/3d/references/level-spec.md +1 -1
- package/plugins/claude/skills/3d/references/levels.md +3 -3
- package/plugins/claude/skills/3d/references/light-and-places.md +3 -3
- package/plugins/claude/skills/3d/references/painted-target.md +7 -7
- package/plugins/claude/skills/3d/references/three-loading.md +4 -4
- package/plugins/claude/skills/3d/references/unity.md +13 -13
- package/plugins/claude/skills/art/references/animation.md +1 -1
- package/plugins/claude/skills/art/references/cast.md +3 -3
- package/plugins/claude/skills/art/references/effects.md +2 -2
- package/plugins/claude/skills/art/references/frames.md +6 -6
- package/plugins/claude/skills/art/references/judging-frames.md +8 -8
- package/plugins/claude/skills/art/references/look.md +4 -4
- package/plugins/claude/skills/art/references/pipeline.md +2 -2
- package/plugins/claude/skills/art/references/prompts.md +4 -4
- package/plugins/claude/skills/art/references/ui.md +15 -15
- package/plugins/claude/skills/art/references/unity.md +14 -14
- package/plugins/claude/skills/audio/references/adaptive-music.md +4 -4
- package/plugins/claude/skills/audio/references/engine.md +2 -2
- package/plugins/claude/skills/audio/references/measure.md +1 -1
- package/plugins/claude/skills/audio/references/unity.md +20 -19
- package/plugins/claude/skills/game-feel/SKILL.md +4 -4
- package/plugins/claude/skills/game-feel/references/contact.md +6 -6
- package/plugins/claude/skills/game-feel/references/unity.md +18 -23
- package/plugins/claude/skills/game-logic/SKILL.md +3 -3
- package/plugins/claude/skills/game-logic/references/balance.md +2 -2
- package/plugins/claude/skills/game-logic/references/depth.md +2 -2
- package/plugins/claude/skills/game-logic/references/escalation.md +5 -5
- package/plugins/claude/skills/game-logic/references/probes.md +10 -10
- package/plugins/claude/skills/game-logic/references/unity.md +28 -28
- package/plugins/claude/skills/game-spine/SKILL.md +1 -1
- package/plugins/claude/skills/game-spine/references/performance.md +2 -2
- package/plugins/claude/skills/game-spine/references/replay.md +11 -11
- package/plugins/claude/skills/game-spine/references/room-api.md +1 -1
- package/plugins/claude/skills/game-spine/references/sdk.md +1 -1
- package/plugins/claude/skills/gdd/SKILL.md +2 -2
- package/plugins/claude/skills/gdd/references/as-built.md +2 -2
- package/plugins/claude/skills/gdd/references/design-measures.md +2 -2
- package/plugins/claude/skills/gdd/references/design-note.md +1 -1
- package/plugins/claude/skills/gdd/references/first-look.md +1 -1
- package/plugins/claude/skills/gdd/references/floors.md +2 -2
- package/plugins/claude/skills/gdd/references/gameplay-contract.md +1 -1
- package/plugins/claude/skills/gdd/references/genre-puzzle.md +4 -4
- package/plugins/claude/skills/gdd/references/genre-racing.md +2 -2
- package/plugins/claude/skills/gdd/references/genre-rpg.md +2 -2
- package/plugins/claude/skills/gdd/references/genre-shooter.md +2 -2
- package/plugins/claude/skills/gdd/references/genre-survival.md +2 -2
- package/plugins/claude/skills/gdd/references/invent-first.md +3 -3
- package/plugins/claude/skills/gdd/references/level-and-fun.md +11 -11
- package/plugins/claude/skills/gdd/references/pages.md +2 -5
- package/plugins/claude/skills/gdd/references/plan-at-size.md +5 -5
- package/plugins/claude/skills/gdd/references/production-tiers.md +11 -11
- package/plugins/claude/skills/gdd/references/sections.md +7 -7
- package/plugins/claude/skills/gdd/references/spec-folder.md +3 -3
- package/plugins/claude/skills/gdd/references/the-path.md +3 -4
- package/plugins/claude/skills/gdd/references/world-and-identity.md +4 -4
- package/plugins/claude/skills/gdd/references/worth.md +4 -4
- package/plugins/claude/skills/mobile-ui/SKILL.md +3 -3
- package/plugins/claude/skills/mobile-ui/references/hud-and-title.md +3 -3
- package/plugins/claude/skills/mobile-ui/references/phone-check.md +1 -1
- package/plugins/claude/skills/mobile-ui/references/recipes.md +1 -1
- package/plugins/claude/skills/mobile-ui/references/restyle-ui.md +11 -11
- package/plugins/claude/skills/mobile-ui/references/unity.md +23 -23
- package/plugins/claude/skills/publishing/references/compose.md +1 -1
- package/plugins/claude/skills/publishing/references/server-build.md +1 -1
- package/plugins/claude/skills/store/SKILL.md +3 -3
- package/plugins/claude/skills/store/references/app-store.md +1 -1
- package/plugins/claude/skills/store/references/google-play.md +2 -2
- package/plugins/claude/skills/store/references/ios-release.md +19 -20
- package/plugins/claude/skills/store/references/money.md +2 -2
- package/plugins/claude/skills/store/references/purchases-and-review.md +18 -18
- package/plugins/claude/skills/store/references/readiness-page.md +1 -1
- package/plugins/claude/skills/store/references/readiness.md +3 -3
- package/plugins/claude/skills/store/references/unity-store.md +9 -12
- package/plugins/claude/skills/unity-game/SKILL.md +28 -35
- package/plugins/claude/skills/unity-game/references/agent-ops.md +9 -9
- package/plugins/claude/skills/unity-game/references/fixes.md +21 -21
- package/plugins/claude/skills/unity-game/references/from-a-web-game.md +17 -17
- package/plugins/claude/skills/unity-game/references/handing-off.md +4 -4
- package/plugins/claude/skills/unity-game/references/performance.md +10 -14
- package/plugins/claude/skills/unity-game/references/probe.md +4 -4
- package/plugins/claude/skills/unity-game/references/shared-mac.md +1 -1
- package/plugins/claude/skills/unity-game/references/traps.md +13 -14
- package/plugins/claude/skills/verifying/references/bar.md +1 -1
- package/plugins/claude/skills/verifying/references/fidelity.md +11 -11
- package/plugins/claude/skills/verifying/references/mobile-qa.md +10 -10
- package/plugins/claude/skills/verifying/references/playtest.md +14 -14
- package/plugins/claude/skills/verifying/references/unity.md +11 -11
- package/plugins/claude/skills/world-and-story/SKILL.md +1 -1
- package/plugins/claude/skills/world-and-story/references/atmosphere.md +4 -4
- package/plugins/claude/skills/world-and-story/references/living-world.md +2 -2
- package/plugins/claude/skills/world-and-story/references/opening-and-chapters.md +1 -1
- package/plugins/claude/skills/world-and-story/references/story-at-size.md +2 -2
- package/plugins/claude/skills/world-and-story/references/voice.md +1 -1
- package/plugins/codex/AGENTS.md +1 -1
- package/plugins/codex/README.md +1 -1
- package/plugins/codex/hooks/brief.md +1 -1
- package/plugins/codex/hooks/guidance.json +1 -1
- package/plugins/codex/hooks/host.md +1 -1
- package/plugins/codex/hooks/vendor/pipeline/pipeline.mjs +6 -6
- package/plugins/codex/hooks/vendor/studio/pitch.mjs +1 -1
- package/plugins/codex/skills/fp-art-director/SKILL.md +2 -2
- package/plugins/codex/skills/fp-art-director/references/codex.md +1 -1
- package/plugins/codex/skills/fp-audio-director/references/codex.md +1 -1
- package/plugins/codex/skills/fp-critic/references/codex.md +1 -1
- package/plugins/codex/skills/fp-lane/references/codex.md +1 -1
- package/plugins/codex/skills/fp-level-designer/references/codex.md +1 -1
- package/plugins/codex/skills/fp-mobile-qa-seat/references/codex.md +1 -1
- package/plugins/codex/skills/fp-player/references/codex.md +1 -1
- package/plugins/codex/skills/fp-playtest/SKILL.md +2 -2
- package/plugins/codex/skills/fp-qa-lead/references/codex.md +1 -1
- package/plugins/codex/skills/fp-studio/SKILL.md +1 -1
- package/plugins/codex/skills/funpixel-3d/references/bake-off.md +3 -3
- package/plugins/codex/skills/funpixel-3d/references/characters.md +1 -1
- package/plugins/codex/skills/funpixel-3d/references/hero-route.md +5 -5
- package/plugins/codex/skills/funpixel-3d/references/level-spec.md +1 -1
- package/plugins/codex/skills/funpixel-3d/references/levels.md +3 -3
- package/plugins/codex/skills/funpixel-3d/references/light-and-places.md +3 -3
- package/plugins/codex/skills/funpixel-3d/references/painted-target.md +7 -7
- package/plugins/codex/skills/funpixel-3d/references/three-loading.md +4 -4
- package/plugins/codex/skills/funpixel-3d/references/unity.md +13 -13
- package/plugins/codex/skills/funpixel-art/references/animation.md +1 -1
- package/plugins/codex/skills/funpixel-art/references/cast.md +3 -3
- package/plugins/codex/skills/funpixel-art/references/effects.md +2 -2
- package/plugins/codex/skills/funpixel-art/references/frames.md +6 -6
- package/plugins/codex/skills/funpixel-art/references/judging-frames.md +8 -8
- package/plugins/codex/skills/funpixel-art/references/look.md +4 -4
- package/plugins/codex/skills/funpixel-art/references/pipeline.md +2 -2
- package/plugins/codex/skills/funpixel-art/references/prompts.md +4 -4
- package/plugins/codex/skills/funpixel-art/references/ui.md +15 -15
- package/plugins/codex/skills/funpixel-art/references/unity.md +14 -14
- package/plugins/codex/skills/funpixel-audio/references/adaptive-music.md +4 -4
- package/plugins/codex/skills/funpixel-audio/references/engine.md +2 -2
- package/plugins/codex/skills/funpixel-audio/references/measure.md +1 -1
- package/plugins/codex/skills/funpixel-audio/references/unity.md +20 -19
- package/plugins/codex/skills/funpixel-game-feel/SKILL.md +4 -4
- package/plugins/codex/skills/funpixel-game-feel/references/contact.md +6 -6
- package/plugins/codex/skills/funpixel-game-feel/references/unity.md +18 -23
- package/plugins/codex/skills/funpixel-game-logic/SKILL.md +3 -3
- package/plugins/codex/skills/funpixel-game-logic/references/balance.md +2 -2
- package/plugins/codex/skills/funpixel-game-logic/references/depth.md +2 -2
- package/plugins/codex/skills/funpixel-game-logic/references/escalation.md +5 -5
- package/plugins/codex/skills/funpixel-game-logic/references/probes.md +10 -10
- package/plugins/codex/skills/funpixel-game-logic/references/unity.md +28 -28
- package/plugins/codex/skills/funpixel-game-spine/SKILL.md +1 -1
- package/plugins/codex/skills/funpixel-game-spine/references/performance.md +2 -2
- package/plugins/codex/skills/funpixel-game-spine/references/replay.md +11 -11
- package/plugins/codex/skills/funpixel-game-spine/references/room-api.md +1 -1
- package/plugins/codex/skills/funpixel-game-spine/references/sdk.md +1 -1
- package/plugins/codex/skills/funpixel-gdd/SKILL.md +2 -2
- package/plugins/codex/skills/funpixel-gdd/references/as-built.md +2 -2
- package/plugins/codex/skills/funpixel-gdd/references/design-measures.md +2 -2
- package/plugins/codex/skills/funpixel-gdd/references/design-note.md +1 -1
- package/plugins/codex/skills/funpixel-gdd/references/first-look.md +1 -1
- package/plugins/codex/skills/funpixel-gdd/references/floors.md +2 -2
- package/plugins/codex/skills/funpixel-gdd/references/gameplay-contract.md +1 -1
- package/plugins/codex/skills/funpixel-gdd/references/genre-puzzle.md +4 -4
- package/plugins/codex/skills/funpixel-gdd/references/genre-racing.md +2 -2
- package/plugins/codex/skills/funpixel-gdd/references/genre-rpg.md +2 -2
- package/plugins/codex/skills/funpixel-gdd/references/genre-shooter.md +2 -2
- package/plugins/codex/skills/funpixel-gdd/references/genre-survival.md +2 -2
- package/plugins/codex/skills/funpixel-gdd/references/invent-first.md +3 -3
- package/plugins/codex/skills/funpixel-gdd/references/level-and-fun.md +11 -11
- package/plugins/codex/skills/funpixel-gdd/references/pages.md +2 -5
- package/plugins/codex/skills/funpixel-gdd/references/plan-at-size.md +5 -5
- package/plugins/codex/skills/funpixel-gdd/references/production-tiers.md +11 -11
- package/plugins/codex/skills/funpixel-gdd/references/sections.md +7 -7
- package/plugins/codex/skills/funpixel-gdd/references/spec-folder.md +3 -3
- package/plugins/codex/skills/funpixel-gdd/references/the-path.md +3 -4
- package/plugins/codex/skills/funpixel-gdd/references/world-and-identity.md +4 -4
- package/plugins/codex/skills/funpixel-gdd/references/worth.md +4 -4
- package/plugins/codex/skills/funpixel-mobile-ui/SKILL.md +3 -3
- package/plugins/codex/skills/funpixel-mobile-ui/references/hud-and-title.md +3 -3
- package/plugins/codex/skills/funpixel-mobile-ui/references/phone-check.md +1 -1
- package/plugins/codex/skills/funpixel-mobile-ui/references/recipes.md +1 -1
- package/plugins/codex/skills/funpixel-mobile-ui/references/restyle-ui.md +11 -11
- package/plugins/codex/skills/funpixel-mobile-ui/references/unity.md +23 -23
- package/plugins/codex/skills/funpixel-publish/references/compose.md +1 -1
- package/plugins/codex/skills/funpixel-publish/references/server-build.md +1 -1
- package/plugins/codex/skills/funpixel-store/SKILL.md +3 -3
- package/plugins/codex/skills/funpixel-store/references/app-store.md +1 -1
- package/plugins/codex/skills/funpixel-store/references/google-play.md +2 -2
- package/plugins/codex/skills/funpixel-store/references/ios-release.md +19 -20
- package/plugins/codex/skills/funpixel-store/references/money.md +2 -2
- package/plugins/codex/skills/funpixel-store/references/purchases-and-review.md +18 -18
- package/plugins/codex/skills/funpixel-store/references/readiness-page.md +1 -1
- package/plugins/codex/skills/funpixel-store/references/readiness.md +3 -3
- package/plugins/codex/skills/funpixel-store/references/unity-store.md +9 -12
- package/plugins/codex/skills/funpixel-unity-game/SKILL.md +28 -35
- package/plugins/codex/skills/funpixel-unity-game/references/agent-ops.md +9 -9
- package/plugins/codex/skills/funpixel-unity-game/references/fixes.md +21 -21
- package/plugins/codex/skills/funpixel-unity-game/references/from-a-web-game.md +17 -17
- package/plugins/codex/skills/funpixel-unity-game/references/handing-off.md +4 -4
- package/plugins/codex/skills/funpixel-unity-game/references/performance.md +10 -14
- package/plugins/codex/skills/funpixel-unity-game/references/probe.md +4 -4
- package/plugins/codex/skills/funpixel-unity-game/references/shared-mac.md +1 -1
- package/plugins/codex/skills/funpixel-unity-game/references/traps.md +13 -14
- package/plugins/codex/skills/funpixel-verify/references/bar.md +1 -1
- package/plugins/codex/skills/funpixel-verify/references/fidelity.md +11 -11
- package/plugins/codex/skills/funpixel-verify/references/mobile-qa.md +10 -10
- package/plugins/codex/skills/funpixel-verify/references/playtest.md +14 -14
- package/plugins/codex/skills/funpixel-verify/references/unity.md +11 -11
- package/plugins/codex/skills/funpixel-world-and-story/SKILL.md +1 -1
- package/plugins/codex/skills/funpixel-world-and-story/references/atmosphere.md +4 -4
- package/plugins/codex/skills/funpixel-world-and-story/references/living-world.md +2 -2
- package/plugins/codex/skills/funpixel-world-and-story/references/opening-and-chapters.md +1 -1
- package/plugins/codex/skills/funpixel-world-and-story/references/story-at-size.md +2 -2
- package/plugins/codex/skills/funpixel-world-and-story/references/voice.md +1 -1
- package/plugins/cursor/README.md +1 -1
- package/plugins/cursor/agents/art-director.md +2 -2
- package/plugins/cursor/commands/playtest.md +2 -2
- package/plugins/cursor/hooks/brief.md +1 -1
- package/plugins/cursor/hooks/guidance.json +1 -1
- package/plugins/cursor/hooks/vendor/pipeline/pipeline.mjs +6 -6
- package/plugins/cursor/hooks/vendor/studio/pitch.mjs +1 -1
- package/plugins/cursor/rules/funpixel-brief.mdc +1 -1
- package/plugins/cursor/skills/funpixel-3d/references/bake-off.md +3 -3
- package/plugins/cursor/skills/funpixel-3d/references/characters.md +1 -1
- package/plugins/cursor/skills/funpixel-3d/references/hero-route.md +5 -5
- package/plugins/cursor/skills/funpixel-3d/references/level-spec.md +1 -1
- package/plugins/cursor/skills/funpixel-3d/references/levels.md +3 -3
- package/plugins/cursor/skills/funpixel-3d/references/light-and-places.md +3 -3
- package/plugins/cursor/skills/funpixel-3d/references/painted-target.md +7 -7
- package/plugins/cursor/skills/funpixel-3d/references/three-loading.md +4 -4
- package/plugins/cursor/skills/funpixel-3d/references/unity.md +13 -13
- package/plugins/cursor/skills/funpixel-art/references/animation.md +1 -1
- package/plugins/cursor/skills/funpixel-art/references/cast.md +3 -3
- package/plugins/cursor/skills/funpixel-art/references/effects.md +2 -2
- package/plugins/cursor/skills/funpixel-art/references/frames.md +6 -6
- package/plugins/cursor/skills/funpixel-art/references/judging-frames.md +8 -8
- package/plugins/cursor/skills/funpixel-art/references/look.md +4 -4
- package/plugins/cursor/skills/funpixel-art/references/pipeline.md +2 -2
- package/plugins/cursor/skills/funpixel-art/references/prompts.md +4 -4
- package/plugins/cursor/skills/funpixel-art/references/ui.md +15 -15
- package/plugins/cursor/skills/funpixel-art/references/unity.md +14 -14
- package/plugins/cursor/skills/funpixel-audio/references/adaptive-music.md +4 -4
- package/plugins/cursor/skills/funpixel-audio/references/engine.md +2 -2
- package/plugins/cursor/skills/funpixel-audio/references/measure.md +1 -1
- package/plugins/cursor/skills/funpixel-audio/references/unity.md +20 -19
- package/plugins/cursor/skills/funpixel-game-feel/SKILL.md +4 -4
- package/plugins/cursor/skills/funpixel-game-feel/references/contact.md +6 -6
- package/plugins/cursor/skills/funpixel-game-feel/references/unity.md +18 -23
- package/plugins/cursor/skills/funpixel-game-logic/SKILL.md +3 -3
- package/plugins/cursor/skills/funpixel-game-logic/references/balance.md +2 -2
- package/plugins/cursor/skills/funpixel-game-logic/references/depth.md +2 -2
- package/plugins/cursor/skills/funpixel-game-logic/references/escalation.md +5 -5
- package/plugins/cursor/skills/funpixel-game-logic/references/probes.md +10 -10
- package/plugins/cursor/skills/funpixel-game-logic/references/unity.md +28 -28
- package/plugins/cursor/skills/funpixel-game-spine/SKILL.md +1 -1
- package/plugins/cursor/skills/funpixel-game-spine/references/performance.md +2 -2
- package/plugins/cursor/skills/funpixel-game-spine/references/replay.md +11 -11
- package/plugins/cursor/skills/funpixel-game-spine/references/room-api.md +1 -1
- package/plugins/cursor/skills/funpixel-game-spine/references/sdk.md +1 -1
- package/plugins/cursor/skills/funpixel-gdd/SKILL.md +2 -2
- package/plugins/cursor/skills/funpixel-gdd/references/as-built.md +2 -2
- package/plugins/cursor/skills/funpixel-gdd/references/design-measures.md +2 -2
- package/plugins/cursor/skills/funpixel-gdd/references/design-note.md +1 -1
- package/plugins/cursor/skills/funpixel-gdd/references/first-look.md +1 -1
- package/plugins/cursor/skills/funpixel-gdd/references/floors.md +2 -2
- package/plugins/cursor/skills/funpixel-gdd/references/gameplay-contract.md +1 -1
- package/plugins/cursor/skills/funpixel-gdd/references/genre-puzzle.md +4 -4
- package/plugins/cursor/skills/funpixel-gdd/references/genre-racing.md +2 -2
- package/plugins/cursor/skills/funpixel-gdd/references/genre-rpg.md +2 -2
- package/plugins/cursor/skills/funpixel-gdd/references/genre-shooter.md +2 -2
- package/plugins/cursor/skills/funpixel-gdd/references/genre-survival.md +2 -2
- package/plugins/cursor/skills/funpixel-gdd/references/invent-first.md +3 -3
- package/plugins/cursor/skills/funpixel-gdd/references/level-and-fun.md +11 -11
- package/plugins/cursor/skills/funpixel-gdd/references/pages.md +2 -5
- package/plugins/cursor/skills/funpixel-gdd/references/plan-at-size.md +5 -5
- package/plugins/cursor/skills/funpixel-gdd/references/production-tiers.md +11 -11
- package/plugins/cursor/skills/funpixel-gdd/references/sections.md +7 -7
- package/plugins/cursor/skills/funpixel-gdd/references/spec-folder.md +3 -3
- package/plugins/cursor/skills/funpixel-gdd/references/the-path.md +3 -4
- package/plugins/cursor/skills/funpixel-gdd/references/world-and-identity.md +4 -4
- package/plugins/cursor/skills/funpixel-gdd/references/worth.md +4 -4
- package/plugins/cursor/skills/funpixel-mobile-ui/SKILL.md +3 -3
- package/plugins/cursor/skills/funpixel-mobile-ui/references/hud-and-title.md +3 -3
- package/plugins/cursor/skills/funpixel-mobile-ui/references/phone-check.md +1 -1
- package/plugins/cursor/skills/funpixel-mobile-ui/references/recipes.md +1 -1
- package/plugins/cursor/skills/funpixel-mobile-ui/references/restyle-ui.md +11 -11
- package/plugins/cursor/skills/funpixel-mobile-ui/references/unity.md +23 -23
- package/plugins/cursor/skills/funpixel-publish/references/compose.md +1 -1
- package/plugins/cursor/skills/funpixel-publish/references/server-build.md +1 -1
- package/plugins/cursor/skills/funpixel-store/SKILL.md +3 -3
- package/plugins/cursor/skills/funpixel-store/references/app-store.md +1 -1
- package/plugins/cursor/skills/funpixel-store/references/google-play.md +2 -2
- package/plugins/cursor/skills/funpixel-store/references/ios-release.md +19 -20
- package/plugins/cursor/skills/funpixel-store/references/money.md +2 -2
- package/plugins/cursor/skills/funpixel-store/references/purchases-and-review.md +18 -18
- package/plugins/cursor/skills/funpixel-store/references/readiness-page.md +1 -1
- package/plugins/cursor/skills/funpixel-store/references/readiness.md +3 -3
- package/plugins/cursor/skills/funpixel-store/references/unity-store.md +9 -12
- package/plugins/cursor/skills/funpixel-unity-game/SKILL.md +28 -35
- package/plugins/cursor/skills/funpixel-unity-game/references/agent-ops.md +9 -9
- package/plugins/cursor/skills/funpixel-unity-game/references/fixes.md +21 -21
- package/plugins/cursor/skills/funpixel-unity-game/references/from-a-web-game.md +17 -17
- package/plugins/cursor/skills/funpixel-unity-game/references/handing-off.md +4 -4
- package/plugins/cursor/skills/funpixel-unity-game/references/performance.md +10 -14
- package/plugins/cursor/skills/funpixel-unity-game/references/probe.md +4 -4
- package/plugins/cursor/skills/funpixel-unity-game/references/shared-mac.md +1 -1
- package/plugins/cursor/skills/funpixel-unity-game/references/traps.md +13 -14
- package/plugins/cursor/skills/funpixel-verify/references/bar.md +1 -1
- package/plugins/cursor/skills/funpixel-verify/references/fidelity.md +11 -11
- package/plugins/cursor/skills/funpixel-verify/references/mobile-qa.md +10 -10
- package/plugins/cursor/skills/funpixel-verify/references/playtest.md +14 -14
- package/plugins/cursor/skills/funpixel-verify/references/unity.md +11 -11
- package/plugins/cursor/skills/funpixel-world-and-story/SKILL.md +1 -1
- package/plugins/cursor/skills/funpixel-world-and-story/references/atmosphere.md +4 -4
- package/plugins/cursor/skills/funpixel-world-and-story/references/living-world.md +2 -2
- package/plugins/cursor/skills/funpixel-world-and-story/references/opening-and-chapters.md +1 -1
- package/plugins/cursor/skills/funpixel-world-and-story/references/story-at-size.md +2 -2
- package/plugins/cursor/skills/funpixel-world-and-story/references/voice.md +1 -1
- package/plugins/kiro/AGENTS.md +1 -1
- package/plugins/kiro/README.md +1 -1
- package/plugins/kiro/hooks/brief.md +1 -1
- package/plugins/kiro/hooks/guidance.json +1 -1
- package/plugins/kiro/hooks/vendor/pipeline/pipeline.mjs +6 -6
- package/plugins/kiro/hooks/vendor/studio/pitch.mjs +1 -1
- package/plugins/kiro/skills/fp-art-director/SKILL.md +2 -2
- package/plugins/kiro/skills/fp-playtest/SKILL.md +2 -2
- package/plugins/kiro/skills/funpixel-3d/references/bake-off.md +3 -3
- package/plugins/kiro/skills/funpixel-3d/references/characters.md +1 -1
- package/plugins/kiro/skills/funpixel-3d/references/hero-route.md +5 -5
- package/plugins/kiro/skills/funpixel-3d/references/level-spec.md +1 -1
- package/plugins/kiro/skills/funpixel-3d/references/levels.md +3 -3
- package/plugins/kiro/skills/funpixel-3d/references/light-and-places.md +3 -3
- package/plugins/kiro/skills/funpixel-3d/references/painted-target.md +7 -7
- package/plugins/kiro/skills/funpixel-3d/references/three-loading.md +4 -4
- package/plugins/kiro/skills/funpixel-3d/references/unity.md +13 -13
- package/plugins/kiro/skills/funpixel-art/references/animation.md +1 -1
- package/plugins/kiro/skills/funpixel-art/references/cast.md +3 -3
- package/plugins/kiro/skills/funpixel-art/references/effects.md +2 -2
- package/plugins/kiro/skills/funpixel-art/references/frames.md +6 -6
- package/plugins/kiro/skills/funpixel-art/references/judging-frames.md +8 -8
- package/plugins/kiro/skills/funpixel-art/references/look.md +4 -4
- package/plugins/kiro/skills/funpixel-art/references/pipeline.md +2 -2
- package/plugins/kiro/skills/funpixel-art/references/prompts.md +4 -4
- package/plugins/kiro/skills/funpixel-art/references/ui.md +15 -15
- package/plugins/kiro/skills/funpixel-art/references/unity.md +14 -14
- package/plugins/kiro/skills/funpixel-audio/references/adaptive-music.md +4 -4
- package/plugins/kiro/skills/funpixel-audio/references/engine.md +2 -2
- package/plugins/kiro/skills/funpixel-audio/references/measure.md +1 -1
- package/plugins/kiro/skills/funpixel-audio/references/unity.md +20 -19
- package/plugins/kiro/skills/funpixel-game-feel/SKILL.md +4 -4
- package/plugins/kiro/skills/funpixel-game-feel/references/contact.md +6 -6
- package/plugins/kiro/skills/funpixel-game-feel/references/unity.md +18 -23
- package/plugins/kiro/skills/funpixel-game-logic/SKILL.md +3 -3
- package/plugins/kiro/skills/funpixel-game-logic/references/balance.md +2 -2
- package/plugins/kiro/skills/funpixel-game-logic/references/depth.md +2 -2
- package/plugins/kiro/skills/funpixel-game-logic/references/escalation.md +5 -5
- package/plugins/kiro/skills/funpixel-game-logic/references/probes.md +10 -10
- package/plugins/kiro/skills/funpixel-game-logic/references/unity.md +28 -28
- package/plugins/kiro/skills/funpixel-game-spine/SKILL.md +1 -1
- package/plugins/kiro/skills/funpixel-game-spine/references/performance.md +2 -2
- package/plugins/kiro/skills/funpixel-game-spine/references/replay.md +11 -11
- package/plugins/kiro/skills/funpixel-game-spine/references/room-api.md +1 -1
- package/plugins/kiro/skills/funpixel-game-spine/references/sdk.md +1 -1
- package/plugins/kiro/skills/funpixel-gdd/SKILL.md +2 -2
- package/plugins/kiro/skills/funpixel-gdd/references/as-built.md +2 -2
- package/plugins/kiro/skills/funpixel-gdd/references/design-measures.md +2 -2
- package/plugins/kiro/skills/funpixel-gdd/references/design-note.md +1 -1
- package/plugins/kiro/skills/funpixel-gdd/references/first-look.md +1 -1
- package/plugins/kiro/skills/funpixel-gdd/references/floors.md +2 -2
- package/plugins/kiro/skills/funpixel-gdd/references/gameplay-contract.md +1 -1
- package/plugins/kiro/skills/funpixel-gdd/references/genre-puzzle.md +4 -4
- package/plugins/kiro/skills/funpixel-gdd/references/genre-racing.md +2 -2
- package/plugins/kiro/skills/funpixel-gdd/references/genre-rpg.md +2 -2
- package/plugins/kiro/skills/funpixel-gdd/references/genre-shooter.md +2 -2
- package/plugins/kiro/skills/funpixel-gdd/references/genre-survival.md +2 -2
- package/plugins/kiro/skills/funpixel-gdd/references/invent-first.md +3 -3
- package/plugins/kiro/skills/funpixel-gdd/references/level-and-fun.md +11 -11
- package/plugins/kiro/skills/funpixel-gdd/references/pages.md +2 -5
- package/plugins/kiro/skills/funpixel-gdd/references/plan-at-size.md +5 -5
- package/plugins/kiro/skills/funpixel-gdd/references/production-tiers.md +11 -11
- package/plugins/kiro/skills/funpixel-gdd/references/sections.md +7 -7
- package/plugins/kiro/skills/funpixel-gdd/references/spec-folder.md +3 -3
- package/plugins/kiro/skills/funpixel-gdd/references/the-path.md +3 -4
- package/plugins/kiro/skills/funpixel-gdd/references/world-and-identity.md +4 -4
- package/plugins/kiro/skills/funpixel-gdd/references/worth.md +4 -4
- package/plugins/kiro/skills/funpixel-mobile-ui/SKILL.md +3 -3
- package/plugins/kiro/skills/funpixel-mobile-ui/references/hud-and-title.md +3 -3
- package/plugins/kiro/skills/funpixel-mobile-ui/references/phone-check.md +1 -1
- package/plugins/kiro/skills/funpixel-mobile-ui/references/recipes.md +1 -1
- package/plugins/kiro/skills/funpixel-mobile-ui/references/restyle-ui.md +11 -11
- package/plugins/kiro/skills/funpixel-mobile-ui/references/unity.md +23 -23
- package/plugins/kiro/skills/funpixel-publish/references/compose.md +1 -1
- package/plugins/kiro/skills/funpixel-publish/references/server-build.md +1 -1
- package/plugins/kiro/skills/funpixel-store/SKILL.md +3 -3
- package/plugins/kiro/skills/funpixel-store/references/app-store.md +1 -1
- package/plugins/kiro/skills/funpixel-store/references/google-play.md +2 -2
- package/plugins/kiro/skills/funpixel-store/references/ios-release.md +19 -20
- package/plugins/kiro/skills/funpixel-store/references/money.md +2 -2
- package/plugins/kiro/skills/funpixel-store/references/purchases-and-review.md +18 -18
- package/plugins/kiro/skills/funpixel-store/references/readiness-page.md +1 -1
- package/plugins/kiro/skills/funpixel-store/references/readiness.md +3 -3
- package/plugins/kiro/skills/funpixel-store/references/unity-store.md +9 -12
- package/plugins/kiro/skills/funpixel-unity-game/SKILL.md +28 -35
- package/plugins/kiro/skills/funpixel-unity-game/references/agent-ops.md +9 -9
- package/plugins/kiro/skills/funpixel-unity-game/references/fixes.md +21 -21
- package/plugins/kiro/skills/funpixel-unity-game/references/from-a-web-game.md +17 -17
- package/plugins/kiro/skills/funpixel-unity-game/references/handing-off.md +4 -4
- package/plugins/kiro/skills/funpixel-unity-game/references/performance.md +10 -14
- package/plugins/kiro/skills/funpixel-unity-game/references/probe.md +4 -4
- package/plugins/kiro/skills/funpixel-unity-game/references/shared-mac.md +1 -1
- package/plugins/kiro/skills/funpixel-unity-game/references/traps.md +13 -14
- package/plugins/kiro/skills/funpixel-verify/references/bar.md +1 -1
- package/plugins/kiro/skills/funpixel-verify/references/fidelity.md +11 -11
- package/plugins/kiro/skills/funpixel-verify/references/mobile-qa.md +10 -10
- package/plugins/kiro/skills/funpixel-verify/references/playtest.md +14 -14
- package/plugins/kiro/skills/funpixel-verify/references/unity.md +11 -11
- package/plugins/kiro/skills/funpixel-world-and-story/SKILL.md +1 -1
- package/plugins/kiro/skills/funpixel-world-and-story/references/atmosphere.md +4 -4
- package/plugins/kiro/skills/funpixel-world-and-story/references/living-world.md +2 -2
- package/plugins/kiro/skills/funpixel-world-and-story/references/opening-and-chapters.md +1 -1
- package/plugins/kiro/skills/funpixel-world-and-story/references/story-at-size.md +2 -2
- package/plugins/kiro/skills/funpixel-world-and-story/references/voice.md +1 -1
- package/plugins/robin/README.md +1 -1
- package/plugins/robin/claude/README.md +2 -3
- package/plugins/robin/claude/agents/art-director.md +2 -2
- package/plugins/robin/claude/commands/playtest.md +2 -2
- package/plugins/robin/claude/hooks/brief.md +1 -1
- package/plugins/robin/claude/hooks/guidance.json +1 -1
- package/plugins/robin/claude/hooks/vendor/pipeline/pipeline.mjs +6 -6
- package/plugins/robin/claude/hooks/vendor/studio/pitch.mjs +1 -1
- package/plugins/robin/claude/skills/3d/references/bake-off.md +3 -3
- package/plugins/robin/claude/skills/3d/references/characters.md +1 -1
- package/plugins/robin/claude/skills/3d/references/hero-route.md +5 -5
- package/plugins/robin/claude/skills/3d/references/level-spec.md +1 -1
- package/plugins/robin/claude/skills/3d/references/levels.md +3 -3
- package/plugins/robin/claude/skills/3d/references/light-and-places.md +3 -3
- package/plugins/robin/claude/skills/3d/references/painted-target.md +7 -7
- package/plugins/robin/claude/skills/3d/references/three-loading.md +4 -4
- package/plugins/robin/claude/skills/3d/references/unity.md +13 -13
- package/plugins/robin/claude/skills/art/references/animation.md +1 -1
- package/plugins/robin/claude/skills/art/references/cast.md +3 -3
- package/plugins/robin/claude/skills/art/references/effects.md +2 -2
- package/plugins/robin/claude/skills/art/references/frames.md +6 -6
- package/plugins/robin/claude/skills/art/references/judging-frames.md +8 -8
- package/plugins/robin/claude/skills/art/references/look.md +4 -4
- package/plugins/robin/claude/skills/art/references/pipeline.md +2 -2
- package/plugins/robin/claude/skills/art/references/prompts.md +4 -4
- package/plugins/robin/claude/skills/art/references/ui.md +15 -15
- package/plugins/robin/claude/skills/art/references/unity.md +14 -14
- package/plugins/robin/claude/skills/audio/references/adaptive-music.md +4 -4
- package/plugins/robin/claude/skills/audio/references/engine.md +2 -2
- package/plugins/robin/claude/skills/audio/references/measure.md +1 -1
- package/plugins/robin/claude/skills/audio/references/unity.md +20 -19
- package/plugins/robin/claude/skills/game-feel/SKILL.md +4 -4
- package/plugins/robin/claude/skills/game-feel/references/contact.md +6 -6
- package/plugins/robin/claude/skills/game-feel/references/unity.md +18 -23
- package/plugins/robin/claude/skills/game-logic/SKILL.md +3 -3
- package/plugins/robin/claude/skills/game-logic/references/balance.md +2 -2
- package/plugins/robin/claude/skills/game-logic/references/depth.md +2 -2
- package/plugins/robin/claude/skills/game-logic/references/escalation.md +5 -5
- package/plugins/robin/claude/skills/game-logic/references/probes.md +10 -10
- package/plugins/robin/claude/skills/game-logic/references/unity.md +28 -28
- package/plugins/robin/claude/skills/game-spine/SKILL.md +1 -1
- package/plugins/robin/claude/skills/game-spine/references/performance.md +2 -2
- package/plugins/robin/claude/skills/game-spine/references/replay.md +11 -11
- package/plugins/robin/claude/skills/game-spine/references/room-api.md +1 -1
- package/plugins/robin/claude/skills/game-spine/references/sdk.md +1 -1
- package/plugins/robin/claude/skills/gdd/SKILL.md +2 -2
- package/plugins/robin/claude/skills/gdd/references/as-built.md +2 -2
- package/plugins/robin/claude/skills/gdd/references/design-measures.md +2 -2
- package/plugins/robin/claude/skills/gdd/references/design-note.md +1 -1
- package/plugins/robin/claude/skills/gdd/references/first-look.md +1 -1
- package/plugins/robin/claude/skills/gdd/references/floors.md +2 -2
- package/plugins/robin/claude/skills/gdd/references/gameplay-contract.md +1 -1
- package/plugins/robin/claude/skills/gdd/references/genre-puzzle.md +4 -4
- package/plugins/robin/claude/skills/gdd/references/genre-racing.md +2 -2
- package/plugins/robin/claude/skills/gdd/references/genre-rpg.md +2 -2
- package/plugins/robin/claude/skills/gdd/references/genre-shooter.md +2 -2
- package/plugins/robin/claude/skills/gdd/references/genre-survival.md +2 -2
- package/plugins/robin/claude/skills/gdd/references/invent-first.md +3 -3
- package/plugins/robin/claude/skills/gdd/references/level-and-fun.md +11 -11
- package/plugins/robin/claude/skills/gdd/references/pages.md +2 -5
- package/plugins/robin/claude/skills/gdd/references/plan-at-size.md +5 -5
- package/plugins/robin/claude/skills/gdd/references/production-tiers.md +11 -11
- package/plugins/robin/claude/skills/gdd/references/sections.md +7 -7
- package/plugins/robin/claude/skills/gdd/references/spec-folder.md +3 -3
- package/plugins/robin/claude/skills/gdd/references/the-path.md +3 -4
- package/plugins/robin/claude/skills/gdd/references/world-and-identity.md +4 -4
- package/plugins/robin/claude/skills/gdd/references/worth.md +4 -4
- package/plugins/robin/claude/skills/mobile-ui/SKILL.md +3 -3
- package/plugins/robin/claude/skills/mobile-ui/references/hud-and-title.md +3 -3
- package/plugins/robin/claude/skills/mobile-ui/references/phone-check.md +1 -1
- package/plugins/robin/claude/skills/mobile-ui/references/recipes.md +1 -1
- package/plugins/robin/claude/skills/mobile-ui/references/restyle-ui.md +11 -11
- package/plugins/robin/claude/skills/mobile-ui/references/unity.md +23 -23
- package/plugins/robin/claude/skills/publishing/references/compose.md +1 -1
- package/plugins/robin/claude/skills/publishing/references/server-build.md +1 -1
- package/plugins/robin/claude/skills/store/SKILL.md +3 -3
- package/plugins/robin/claude/skills/store/references/app-store.md +1 -1
- package/plugins/robin/claude/skills/store/references/google-play.md +2 -2
- package/plugins/robin/claude/skills/store/references/ios-release.md +19 -20
- package/plugins/robin/claude/skills/store/references/money.md +2 -2
- package/plugins/robin/claude/skills/store/references/purchases-and-review.md +18 -18
- package/plugins/robin/claude/skills/store/references/readiness-page.md +1 -1
- package/plugins/robin/claude/skills/store/references/readiness.md +3 -3
- package/plugins/robin/claude/skills/store/references/unity-store.md +9 -12
- package/plugins/robin/claude/skills/unity-game/SKILL.md +28 -35
- package/plugins/robin/claude/skills/unity-game/references/agent-ops.md +9 -9
- package/plugins/robin/claude/skills/unity-game/references/fixes.md +21 -21
- package/plugins/robin/claude/skills/unity-game/references/from-a-web-game.md +17 -17
- package/plugins/robin/claude/skills/unity-game/references/handing-off.md +4 -4
- package/plugins/robin/claude/skills/unity-game/references/performance.md +10 -14
- package/plugins/robin/claude/skills/unity-game/references/probe.md +4 -4
- package/plugins/robin/claude/skills/unity-game/references/shared-mac.md +1 -1
- package/plugins/robin/claude/skills/unity-game/references/traps.md +13 -14
- package/plugins/robin/claude/skills/verifying/references/bar.md +1 -1
- package/plugins/robin/claude/skills/verifying/references/fidelity.md +11 -11
- package/plugins/robin/claude/skills/verifying/references/mobile-qa.md +10 -10
- package/plugins/robin/claude/skills/verifying/references/playtest.md +14 -14
- package/plugins/robin/claude/skills/verifying/references/unity.md +11 -11
- package/plugins/robin/claude/skills/world-and-story/SKILL.md +1 -1
- package/plugins/robin/claude/skills/world-and-story/references/atmosphere.md +4 -4
- package/plugins/robin/claude/skills/world-and-story/references/living-world.md +2 -2
- package/plugins/robin/claude/skills/world-and-story/references/opening-and-chapters.md +1 -1
- package/plugins/robin/claude/skills/world-and-story/references/story-at-size.md +2 -2
- package/plugins/robin/claude/skills/world-and-story/references/voice.md +1 -1
- package/plugins/robin/skills/fp-playtest/SKILL.md +2 -2
- package/plugins/robin/skills/funpixel-3d/references/bake-off.md +3 -3
- package/plugins/robin/skills/funpixel-3d/references/characters.md +1 -1
- package/plugins/robin/skills/funpixel-3d/references/hero-route.md +5 -5
- package/plugins/robin/skills/funpixel-3d/references/level-spec.md +1 -1
- package/plugins/robin/skills/funpixel-3d/references/levels.md +3 -3
- package/plugins/robin/skills/funpixel-3d/references/light-and-places.md +3 -3
- package/plugins/robin/skills/funpixel-3d/references/painted-target.md +7 -7
- package/plugins/robin/skills/funpixel-3d/references/three-loading.md +4 -4
- package/plugins/robin/skills/funpixel-3d/references/unity.md +13 -13
- package/plugins/robin/skills/funpixel-art/references/animation.md +1 -1
- package/plugins/robin/skills/funpixel-art/references/cast.md +3 -3
- package/plugins/robin/skills/funpixel-art/references/effects.md +2 -2
- package/plugins/robin/skills/funpixel-art/references/frames.md +6 -6
- package/plugins/robin/skills/funpixel-art/references/judging-frames.md +8 -8
- package/plugins/robin/skills/funpixel-art/references/look.md +4 -4
- package/plugins/robin/skills/funpixel-art/references/pipeline.md +2 -2
- package/plugins/robin/skills/funpixel-art/references/prompts.md +4 -4
- package/plugins/robin/skills/funpixel-art/references/ui.md +15 -15
- package/plugins/robin/skills/funpixel-art/references/unity.md +14 -14
- package/plugins/robin/skills/funpixel-audio/references/adaptive-music.md +4 -4
- package/plugins/robin/skills/funpixel-audio/references/engine.md +2 -2
- package/plugins/robin/skills/funpixel-audio/references/measure.md +1 -1
- package/plugins/robin/skills/funpixel-audio/references/unity.md +20 -19
- package/plugins/robin/skills/funpixel-brief/SKILL.md +1 -1
- package/plugins/robin/skills/funpixel-game-feel/SKILL.md +4 -4
- package/plugins/robin/skills/funpixel-game-feel/references/contact.md +6 -6
- package/plugins/robin/skills/funpixel-game-feel/references/unity.md +18 -23
- package/plugins/robin/skills/funpixel-game-logic/SKILL.md +3 -3
- package/plugins/robin/skills/funpixel-game-logic/references/balance.md +2 -2
- package/plugins/robin/skills/funpixel-game-logic/references/depth.md +2 -2
- package/plugins/robin/skills/funpixel-game-logic/references/escalation.md +5 -5
- package/plugins/robin/skills/funpixel-game-logic/references/probes.md +10 -10
- package/plugins/robin/skills/funpixel-game-logic/references/unity.md +28 -28
- package/plugins/robin/skills/funpixel-game-spine/SKILL.md +1 -1
- package/plugins/robin/skills/funpixel-game-spine/references/performance.md +2 -2
- package/plugins/robin/skills/funpixel-game-spine/references/replay.md +11 -11
- package/plugins/robin/skills/funpixel-game-spine/references/room-api.md +1 -1
- package/plugins/robin/skills/funpixel-game-spine/references/sdk.md +1 -1
- package/plugins/robin/skills/funpixel-gdd/SKILL.md +2 -2
- package/plugins/robin/skills/funpixel-gdd/references/as-built.md +2 -2
- package/plugins/robin/skills/funpixel-gdd/references/design-measures.md +2 -2
- package/plugins/robin/skills/funpixel-gdd/references/design-note.md +1 -1
- package/plugins/robin/skills/funpixel-gdd/references/first-look.md +1 -1
- package/plugins/robin/skills/funpixel-gdd/references/floors.md +2 -2
- package/plugins/robin/skills/funpixel-gdd/references/gameplay-contract.md +1 -1
- package/plugins/robin/skills/funpixel-gdd/references/genre-puzzle.md +4 -4
- package/plugins/robin/skills/funpixel-gdd/references/genre-racing.md +2 -2
- package/plugins/robin/skills/funpixel-gdd/references/genre-rpg.md +2 -2
- package/plugins/robin/skills/funpixel-gdd/references/genre-shooter.md +2 -2
- package/plugins/robin/skills/funpixel-gdd/references/genre-survival.md +2 -2
- package/plugins/robin/skills/funpixel-gdd/references/invent-first.md +3 -3
- package/plugins/robin/skills/funpixel-gdd/references/level-and-fun.md +11 -11
- package/plugins/robin/skills/funpixel-gdd/references/pages.md +2 -5
- package/plugins/robin/skills/funpixel-gdd/references/plan-at-size.md +5 -5
- package/plugins/robin/skills/funpixel-gdd/references/production-tiers.md +11 -11
- package/plugins/robin/skills/funpixel-gdd/references/sections.md +7 -7
- package/plugins/robin/skills/funpixel-gdd/references/spec-folder.md +3 -3
- package/plugins/robin/skills/funpixel-gdd/references/the-path.md +3 -4
- package/plugins/robin/skills/funpixel-gdd/references/world-and-identity.md +4 -4
- package/plugins/robin/skills/funpixel-gdd/references/worth.md +4 -4
- package/plugins/robin/skills/funpixel-mobile-ui/SKILL.md +3 -3
- package/plugins/robin/skills/funpixel-mobile-ui/references/hud-and-title.md +3 -3
- package/plugins/robin/skills/funpixel-mobile-ui/references/phone-check.md +1 -1
- package/plugins/robin/skills/funpixel-mobile-ui/references/recipes.md +1 -1
- package/plugins/robin/skills/funpixel-mobile-ui/references/restyle-ui.md +11 -11
- package/plugins/robin/skills/funpixel-mobile-ui/references/unity.md +23 -23
- package/plugins/robin/skills/funpixel-publish/references/compose.md +1 -1
- package/plugins/robin/skills/funpixel-publish/references/server-build.md +1 -1
- package/plugins/robin/skills/funpixel-store/SKILL.md +3 -3
- package/plugins/robin/skills/funpixel-store/references/app-store.md +1 -1
- package/plugins/robin/skills/funpixel-store/references/google-play.md +2 -2
- package/plugins/robin/skills/funpixel-store/references/ios-release.md +19 -20
- package/plugins/robin/skills/funpixel-store/references/money.md +2 -2
- package/plugins/robin/skills/funpixel-store/references/purchases-and-review.md +18 -18
- package/plugins/robin/skills/funpixel-store/references/readiness-page.md +1 -1
- package/plugins/robin/skills/funpixel-store/references/readiness.md +3 -3
- package/plugins/robin/skills/funpixel-store/references/unity-store.md +9 -12
- package/plugins/robin/skills/funpixel-unity-game/SKILL.md +28 -35
- package/plugins/robin/skills/funpixel-unity-game/references/agent-ops.md +9 -9
- package/plugins/robin/skills/funpixel-unity-game/references/fixes.md +21 -21
- package/plugins/robin/skills/funpixel-unity-game/references/from-a-web-game.md +17 -17
- package/plugins/robin/skills/funpixel-unity-game/references/handing-off.md +4 -4
- package/plugins/robin/skills/funpixel-unity-game/references/performance.md +10 -14
- package/plugins/robin/skills/funpixel-unity-game/references/probe.md +4 -4
- package/plugins/robin/skills/funpixel-unity-game/references/shared-mac.md +1 -1
- package/plugins/robin/skills/funpixel-unity-game/references/traps.md +13 -14
- package/plugins/robin/skills/funpixel-verify/references/bar.md +1 -1
- package/plugins/robin/skills/funpixel-verify/references/fidelity.md +11 -11
- package/plugins/robin/skills/funpixel-verify/references/mobile-qa.md +10 -10
- package/plugins/robin/skills/funpixel-verify/references/playtest.md +14 -14
- package/plugins/robin/skills/funpixel-verify/references/unity.md +11 -11
- package/plugins/robin/skills/funpixel-world-and-story/SKILL.md +1 -1
- package/plugins/robin/skills/funpixel-world-and-story/references/atmosphere.md +4 -4
- package/plugins/robin/skills/funpixel-world-and-story/references/living-world.md +2 -2
- package/plugins/robin/skills/funpixel-world-and-story/references/opening-and-chapters.md +1 -1
- package/plugins/robin/skills/funpixel-world-and-story/references/story-at-size.md +2 -2
- package/plugins/robin/skills/funpixel-world-and-story/references/voice.md +1 -1
- package/templates/common/.agents/skills/funpixel-3d/references/bake-off.md +3 -3
- package/templates/common/.agents/skills/funpixel-3d/references/characters.md +1 -1
- package/templates/common/.agents/skills/funpixel-3d/references/hero-route.md +5 -5
- package/templates/common/.agents/skills/funpixel-3d/references/level-spec.md +1 -1
- package/templates/common/.agents/skills/funpixel-3d/references/levels.md +3 -3
- package/templates/common/.agents/skills/funpixel-3d/references/light-and-places.md +3 -3
- package/templates/common/.agents/skills/funpixel-3d/references/painted-target.md +7 -7
- package/templates/common/.agents/skills/funpixel-3d/references/three-loading.md +4 -4
- package/templates/common/.agents/skills/funpixel-3d/references/unity.md +13 -13
- package/templates/common/.agents/skills/funpixel-art/references/animation.md +1 -1
- package/templates/common/.agents/skills/funpixel-art/references/cast.md +3 -3
- package/templates/common/.agents/skills/funpixel-art/references/effects.md +2 -2
- package/templates/common/.agents/skills/funpixel-art/references/frames.md +6 -6
- package/templates/common/.agents/skills/funpixel-art/references/judging-frames.md +8 -8
- package/templates/common/.agents/skills/funpixel-art/references/look.md +4 -4
- package/templates/common/.agents/skills/funpixel-art/references/pipeline.md +2 -2
- package/templates/common/.agents/skills/funpixel-art/references/prompts.md +4 -4
- package/templates/common/.agents/skills/funpixel-art/references/ui.md +15 -15
- package/templates/common/.agents/skills/funpixel-art/references/unity.md +14 -14
- package/templates/common/.agents/skills/funpixel-audio/references/adaptive-music.md +4 -4
- package/templates/common/.agents/skills/funpixel-audio/references/engine.md +2 -2
- package/templates/common/.agents/skills/funpixel-audio/references/measure.md +1 -1
- package/templates/common/.agents/skills/funpixel-audio/references/unity.md +20 -19
- package/templates/common/.agents/skills/funpixel-game-feel/SKILL.md +4 -4
- package/templates/common/.agents/skills/funpixel-game-feel/references/contact.md +6 -6
- package/templates/common/.agents/skills/funpixel-game-feel/references/unity.md +18 -23
- package/templates/common/.agents/skills/funpixel-game-logic/SKILL.md +3 -3
- package/templates/common/.agents/skills/funpixel-game-logic/references/balance.md +2 -2
- package/templates/common/.agents/skills/funpixel-game-logic/references/depth.md +2 -2
- package/templates/common/.agents/skills/funpixel-game-logic/references/escalation.md +5 -5
- package/templates/common/.agents/skills/funpixel-game-logic/references/probes.md +10 -10
- package/templates/common/.agents/skills/funpixel-game-logic/references/unity.md +28 -28
- package/templates/common/.agents/skills/funpixel-game-spine/SKILL.md +1 -1
- package/templates/common/.agents/skills/funpixel-game-spine/references/performance.md +2 -2
- package/templates/common/.agents/skills/funpixel-game-spine/references/replay.md +11 -11
- package/templates/common/.agents/skills/funpixel-game-spine/references/room-api.md +1 -1
- package/templates/common/.agents/skills/funpixel-game-spine/references/sdk.md +1 -1
- package/templates/common/.agents/skills/funpixel-gdd/SKILL.md +2 -2
- package/templates/common/.agents/skills/funpixel-gdd/references/as-built.md +2 -2
- package/templates/common/.agents/skills/funpixel-gdd/references/design-measures.md +2 -2
- package/templates/common/.agents/skills/funpixel-gdd/references/design-note.md +1 -1
- package/templates/common/.agents/skills/funpixel-gdd/references/first-look.md +1 -1
- package/templates/common/.agents/skills/funpixel-gdd/references/floors.md +2 -2
- package/templates/common/.agents/skills/funpixel-gdd/references/gameplay-contract.md +1 -1
- package/templates/common/.agents/skills/funpixel-gdd/references/genre-puzzle.md +4 -4
- package/templates/common/.agents/skills/funpixel-gdd/references/genre-racing.md +2 -2
- package/templates/common/.agents/skills/funpixel-gdd/references/genre-rpg.md +2 -2
- package/templates/common/.agents/skills/funpixel-gdd/references/genre-shooter.md +2 -2
- package/templates/common/.agents/skills/funpixel-gdd/references/genre-survival.md +2 -2
- package/templates/common/.agents/skills/funpixel-gdd/references/invent-first.md +3 -3
- package/templates/common/.agents/skills/funpixel-gdd/references/level-and-fun.md +11 -11
- package/templates/common/.agents/skills/funpixel-gdd/references/pages.md +2 -5
- package/templates/common/.agents/skills/funpixel-gdd/references/plan-at-size.md +5 -5
- package/templates/common/.agents/skills/funpixel-gdd/references/production-tiers.md +11 -11
- package/templates/common/.agents/skills/funpixel-gdd/references/sections.md +7 -7
- package/templates/common/.agents/skills/funpixel-gdd/references/spec-folder.md +3 -3
- package/templates/common/.agents/skills/funpixel-gdd/references/the-path.md +3 -4
- package/templates/common/.agents/skills/funpixel-gdd/references/world-and-identity.md +4 -4
- package/templates/common/.agents/skills/funpixel-gdd/references/worth.md +4 -4
- package/templates/common/.agents/skills/funpixel-mobile-ui/SKILL.md +3 -3
- package/templates/common/.agents/skills/funpixel-mobile-ui/references/hud-and-title.md +3 -3
- package/templates/common/.agents/skills/funpixel-mobile-ui/references/phone-check.md +1 -1
- package/templates/common/.agents/skills/funpixel-mobile-ui/references/recipes.md +1 -1
- package/templates/common/.agents/skills/funpixel-mobile-ui/references/restyle-ui.md +11 -11
- package/templates/common/.agents/skills/funpixel-mobile-ui/references/unity.md +23 -23
- package/templates/common/.agents/skills/funpixel-publish/references/compose.md +1 -1
- package/templates/common/.agents/skills/funpixel-publish/references/server-build.md +1 -1
- package/templates/common/.agents/skills/funpixel-store/SKILL.md +3 -3
- package/templates/common/.agents/skills/funpixel-store/references/app-store.md +1 -1
- package/templates/common/.agents/skills/funpixel-store/references/google-play.md +2 -2
- package/templates/common/.agents/skills/funpixel-store/references/ios-release.md +19 -20
- package/templates/common/.agents/skills/funpixel-store/references/money.md +2 -2
- package/templates/common/.agents/skills/funpixel-store/references/purchases-and-review.md +18 -18
- package/templates/common/.agents/skills/funpixel-store/references/readiness-page.md +1 -1
- package/templates/common/.agents/skills/funpixel-store/references/readiness.md +3 -3
- package/templates/common/.agents/skills/funpixel-store/references/unity-store.md +9 -12
- package/templates/common/.agents/skills/funpixel-unity-game/SKILL.md +28 -35
- package/templates/common/.agents/skills/funpixel-unity-game/references/agent-ops.md +9 -9
- package/templates/common/.agents/skills/funpixel-unity-game/references/fixes.md +21 -21
- package/templates/common/.agents/skills/funpixel-unity-game/references/from-a-web-game.md +17 -17
- package/templates/common/.agents/skills/funpixel-unity-game/references/handing-off.md +4 -4
- package/templates/common/.agents/skills/funpixel-unity-game/references/performance.md +10 -14
- package/templates/common/.agents/skills/funpixel-unity-game/references/probe.md +4 -4
- package/templates/common/.agents/skills/funpixel-unity-game/references/shared-mac.md +1 -1
- package/templates/common/.agents/skills/funpixel-unity-game/references/traps.md +13 -14
- package/templates/common/.agents/skills/funpixel-verify/references/bar.md +1 -1
- package/templates/common/.agents/skills/funpixel-verify/references/fidelity.md +11 -11
- package/templates/common/.agents/skills/funpixel-verify/references/mobile-qa.md +10 -10
- package/templates/common/.agents/skills/funpixel-verify/references/playtest.md +14 -14
- package/templates/common/.agents/skills/funpixel-verify/references/unity.md +11 -11
- package/templates/common/.agents/skills/funpixel-world-and-story/SKILL.md +1 -1
- package/templates/common/.agents/skills/funpixel-world-and-story/references/atmosphere.md +4 -4
- package/templates/common/.agents/skills/funpixel-world-and-story/references/living-world.md +2 -2
- package/templates/common/.agents/skills/funpixel-world-and-story/references/opening-and-chapters.md +1 -1
- package/templates/common/.agents/skills/funpixel-world-and-story/references/story-at-size.md +2 -2
- package/templates/common/.agents/skills/funpixel-world-and-story/references/voice.md +1 -1
- package/templates/common/AGENTS.md +1 -1
- package/templates/common/src/platform.ts +1 -1
- package/templates/common/src/probe-human.ts +3 -3
- package/templates/common/src/save.ts +1 -1
- package/templates/common/test/platform.test.ts +1 -1
- package/templates/three-world/src/budget.ts +1 -1
- package/templates/three-world/src/cutouts.ts +2 -2
- package/templates/three-world/src/game.ts +1 -1
- package/templates/three-world/src/models.ts +1 -1
- package/unity/com.funpixel.probe/Runtime/Player/Args.cs +1 -1
- package/unity/com.funpixel.probe/Runtime/Player/Bridge.cs +2 -2
- package/unity/com.funpixel.probe/Runtime/Player/Capture.cs +2 -2
- package/unity/com.funpixel.probe/Runtime/Player/Inject.cs +1 -2
- package/unity/com.funpixel.probe/Runtime/Player/Probe.cs +2 -2
- package/unity/com.funpixel.probe/Runtime/Player/UiTargets.cs +1 -1
- package/plugins/claude/skills/unity-game/references/studio-packages.md +0 -127
- package/plugins/codex/skills/funpixel-unity-game/references/studio-packages.md +0 -127
- package/plugins/cursor/skills/funpixel-unity-game/references/studio-packages.md +0 -127
- package/plugins/kiro/skills/funpixel-unity-game/references/studio-packages.md +0 -127
- package/plugins/robin/claude/skills/unity-game/references/studio-packages.md +0 -127
- package/plugins/robin/skills/funpixel-unity-game/references/studio-packages.md +0 -127
- package/templates/common/.agents/skills/funpixel-unity-game/references/studio-packages.md +0 -127
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
When a game makes more than a handful of assets from text, the games that shipped best kept them
|
|
4
4
|
as data: what each piece is, one style file, and a record of what made each file. Four of our
|
|
5
|
-
games
|
|
5
|
+
games arrived at the same shape on their own.
|
|
6
6
|
`funtools assets` is that shape, on the shelf. Use all of it, part of it, or none: hand-made,
|
|
7
7
|
procedural and one-off `gen` assets need no manifest, and nothing checks for one.
|
|
8
8
|
|
|
@@ -78,7 +78,7 @@ changed subject; `gen --only <name>` tries the same words again.
|
|
|
78
78
|
|
|
79
79
|
## At scale: the asset script
|
|
80
80
|
|
|
81
|
-
Our own games carry 70 to 250 assets (
|
|
81
|
+
Our own games carry 70 to 250 assets (one heist game: 116 paintings, 183 sounds, 11 music cues, 25
|
|
82
82
|
models). Nobody calls a tool 200 times by hand. The plan's `## Asset script` is the list, one row
|
|
83
83
|
per family with a count, and it becomes the manifest:
|
|
84
84
|
|
|
@@ -119,7 +119,7 @@ Taste goes to the `critic` agent, which grades craft within the declared style.
|
|
|
119
119
|
|
|
120
120
|
## Target frames at moments, and the loop that closes the gap
|
|
121
121
|
|
|
122
|
-
|
|
122
|
+
A three.js horror game (29 Sep 2026) made its target frames for moments of the GDD's
|
|
123
123
|
moment ladder (0:10 the moon pool, 1:00 the first enemy, 2:00 the dodge, 3:00 the splice, 5:00 the
|
|
124
124
|
seam), so each capture has one picture it should match. The loop that closed its look gap:
|
|
125
125
|
|
|
@@ -134,13 +134,13 @@ floor fixed it), a camera inside lockers the hero could walk into (collision), a
|
|
|
134
134
|
inside a door. The owner's note that started the second art pass was the same comparison: "what
|
|
135
135
|
we imagined was better; we must get close to it".
|
|
136
136
|
|
|
137
|
-
A capture only counts if it shows the moment.
|
|
137
|
+
A capture only counts if it shows the moment. That game's third panel scored 4.9 because every
|
|
138
138
|
view silently sat at t = 0 behind the opening shot after a refactor; looking at the captures before
|
|
139
139
|
reading the score found it.
|
|
140
140
|
|
|
141
141
|
## Judging generated art in the game's own light
|
|
142
142
|
|
|
143
|
-
A generator's preview is lit for the generator. Under
|
|
143
|
+
A generator's preview is lit for the generator. Under its own light that game's generated
|
|
144
144
|
textures read near-black, so the enemy's albedo was lifted ×1.9 to read in the dark; a few metres
|
|
145
145
|
into the torch's spot it then went pure white with no face. Albedo above 1 has nowhere to go under
|
|
146
146
|
a strong light. The lift went back to 1.05 and a cold rim light did the reading-in-the-dark job
|
|
@@ -153,7 +153,7 @@ When something white appears that should not, suspect a light first and hide one
|
|
|
153
153
|
|
|
154
154
|
## A rubric for a 3D cast, written before generating
|
|
155
155
|
|
|
156
|
-
|
|
156
|
+
The horror game wrote ten lines before its first 3D model, each tied to an AD rule or a target frame, and
|
|
157
157
|
turned every model on a turntable against them. Three show the shape: "light is the palette:
|
|
158
158
|
surfaces desaturated, the only saturated hues amber (station), cyan (hero, safe tech), coral
|
|
159
159
|
(enemies)"; "reads at phone size: at about 120 px tall the silhouette alone says what it is";
|
|
@@ -5,17 +5,17 @@ in the game's world, played on a real phone and judged every round with the same
|
|
|
5
5
|
characters and the levels, never a layer added at the end. The controls count too: the gesture
|
|
6
6
|
on the play, how it feels and how it answers, is part of the look.
|
|
7
7
|
|
|
8
|
-
The owner played our games on an iPhone (30 Sep 2026) and named the same fault in each.
|
|
9
|
-
|
|
10
|
-
its title was a white bold wordmark over the scene with a cyan pill and three icon circles.
|
|
11
|
-
frosty board sat under the same pills and stock glyphs ("better icons, not emojis").
|
|
12
|
-
heavy navy slabs;
|
|
13
|
-
small dark board in an empty sky.
|
|
14
|
-
carve its HUD from
|
|
8
|
+
The owner played our games on an iPhone (30 Sep 2026) and named the same fault in each. A puzzle
|
|
9
|
+
game's warm sandstone rooms wore a HUD of dark app pills with cyan outlines and system type, and
|
|
10
|
+
its title was a white bold wordmark over the scene with a cyan pill and three icon circles. An ice puzzle's
|
|
11
|
+
frosty board sat under the same pills and stock glyphs ("better icons, not emojis"). A racer had
|
|
12
|
+
heavy navy slabs; a toy game's title stacked panels over its basket; a night game's title floated a
|
|
13
|
+
small dark board in an empty sky. One game looked better only because its creator happened to
|
|
14
|
+
carve its HUD from its world's wood. The cause was ours: the look's direction covered the world,
|
|
15
15
|
the cast and the target frames, but not the interface, so every game fell back to the scaffold's
|
|
16
|
-
dark pill.
|
|
16
|
+
dark pill. Three of them still ship the scaffold's own glyphs.
|
|
17
17
|
|
|
18
|
-
We had the answer already.
|
|
18
|
+
We had the answer already. One of our games' GDD: "Every screen is drawn in the factory's own
|
|
19
19
|
kit (riveted steel plates, one hazard stripe, stencil type) and speaks in the world's voice. A
|
|
20
20
|
screen that isn't specified gets invented by whoever reaches it first." So the look covers the UI
|
|
21
21
|
by default, and the GDD specifies every screen in the world's kit: the screen list (title, how to
|
|
@@ -58,7 +58,7 @@ plan-at-size): a plate, a button in its states, a frame for cards, the icon fami
|
|
|
58
58
|
with the game (two families at most); a system stack is a choice to name, not a default.
|
|
59
59
|
3. **One icon family, drawn like the art.** Pause, sound, hint, undo, stars and the currency are
|
|
60
60
|
one set: the art's outline weight, its corner radius, its two-tone fill, the palette's roles, a
|
|
61
|
-
motif of the world (
|
|
61
|
+
motif of the world (a sun banner, a snowflake). Never a stock glyph set or emoji.
|
|
62
62
|
Read them at 24 and 48 px on the plate they sit on.
|
|
63
63
|
4. **Colour roles from the palette.** Plate, plate edge, ink on the plate, the one accent (and what
|
|
64
64
|
it means), harm. Contrast is computed: 4.5:1 for text, 3:1 for icons (skill
|
|
@@ -106,7 +106,7 @@ better. Five that fit most genres:
|
|
|
106
106
|
| Objects of the world | plates, plaques, tags and buttons made of the world's material | puzzle, adventure, cosy, 3D rooms |
|
|
107
107
|
| The frame holds the numbers | the board's or jar's own frame carries score and next | merge, match, board puzzles |
|
|
108
108
|
| The thin bar | one slim strip along an edge, everything else on the actors | cards, strategy, roguelikes |
|
|
109
|
-
| On the actor | health and state on the hero or the tool (
|
|
109
|
+
| On the actor | health and state on the hero or the tool (a horror game: "the suit is the HUD", a wrist gauge strapped to her arm) | action, platformers, 3D |
|
|
110
110
|
| Paper and ink | margin notes, stamps, torn labels, a hand-drawn line | narrative, cosy, crafting |
|
|
111
111
|
|
|
112
112
|
Then make it this game's: `npx @funpixel/tools variety` sets the title screen beside the other
|
|
@@ -133,8 +133,8 @@ game's style from its style frame and saved under `design/first-look/`; each is
|
|
|
133
133
|
the plan and judged like the HUD:
|
|
134
134
|
- **The title** is the game's first promise and the frame a player judges first. Title key art:
|
|
135
135
|
the game's own scene, never a board preview floating on a flat colour. The overlay comes from the
|
|
136
|
-
world: the wordmark carved into or lit on its surface, the start as a thing of the world (
|
|
137
|
-
|
|
136
|
+
world: the wordmark carved into or lit on its surface, the start as a thing of the world (a
|
|
137
|
+
glowing fold: step in to start), menu buttons of the world's material, icons drawn like
|
|
138
138
|
its motifs, the caption in the display face. Ask of it what a player asks: does it make me want
|
|
139
139
|
to press Play? A white bold wordmark over a pill and three icon circles is the overlay the
|
|
140
140
|
owner called plain, however good the scene behind it.
|
|
@@ -150,8 +150,8 @@ the plan and judged like the HUD:
|
|
|
150
150
|
`fp:verifying`, fidelity).
|
|
151
151
|
- `npx @funpixel/tools look --hud` reads the play and the title for the scaffold's clothes: the
|
|
152
152
|
system type stack, dark neutral plates, the scaffold's own glyphs, icons typed as characters (a
|
|
153
|
-
"★" or an emoji in a label, what the owner called "emojis" on
|
|
154
|
-
system text (a gradient washed over it is still system text:
|
|
153
|
+
"★" or an emoji in a label, what the owner called "emojis" on one game), a wordmark that is plain
|
|
154
|
+
system text (a gradient washed over it is still system text: one game's R4 title). It informs; a creator who chose any of them names why in the hand-back.
|
|
155
155
|
|
|
156
156
|
How to dress the scaffold's HUD and screens, with worked examples: skill `fp:mobile-ui`, its
|
|
157
157
|
reference `restyle-ui.md`.
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
## Tools
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Have the build method refuse to build without `Assets/_Game/Art/Icon/app_icon.png`, imported at 1024, uncompressed, no alpha. Not shipped by the kit: the Unity starter, its checks and the studio scripts (`key_green.py`, `cut_sheet.py`, a font builder). Do the rest with what exists:
|
|
8
8
|
|
|
9
9
|
- Generate with the hosted `generate_image` or `generate_sprite`, or `npx @funpixel/tools gen sprite "<prompt>" --size 1024x1024 --references target.png --unity .`: into `Assets/_Game/Generated/Sprites/` (`Images/` for plates, `Textures/` for tiles), imported on first sight as Sprite, no mipmaps, ASTC 5×5 (plates 6×6), by the rule it writes beside them (`Generated/Editor/FunpixelGenImport.cs`; no `.meta` written). Sign in once with `npx @funpixel/tools login`. Give the size: a 9:16 default made a 720×1280 icon. The studio's `gen_image.py` calls the provider with a `.env` key: no metering, no cost log.
|
|
10
10
|
- Key with the hosted `key_sprite`, or ask for `--transparent` art; cut a sheet with `npx @funpixel/tools parts sheet.png --grid 4x2 --key auto` (or `cut` for a painted reference sheet).
|
|
@@ -18,7 +18,7 @@ Checks: `texture_audit`, `glyph_coverage`, `tmp_assets_small` and `import_clean`
|
|
|
18
18
|
## Procedure
|
|
19
19
|
|
|
20
20
|
1. Generate sheets against the game's target image, on a green screen, and key them (`key_sprite`, or `--transparent` art). Background removal with BiRefNet ate white objects (a whole plate).
|
|
21
|
-
2. Read every word in generated art by OCR;
|
|
21
|
+
2. Read every word in generated art by OCR; a misspelt logo got through. Which OCR tool is not in the report.
|
|
22
22
|
3. Check sprite fill: 0.85 or more of the canvas. One sprite filled only 73%. How to measure fill is not in the report.
|
|
23
23
|
4. Rasterise at the size the sprite is drawn. The reason is not in the report.
|
|
24
24
|
5. Reuse web art: `dwebp` to PNG, pivots from the web's anchors at 100 pixels per unit.
|
|
@@ -31,7 +31,7 @@ Checks: `texture_audit`, `glyph_coverage`, `tmp_assets_small` and `import_clean`
|
|
|
31
31
|
| Splash, any mipmapped art | scaled to power of two |
|
|
32
32
|
| App icon | 1024×1024, uncompressed, no alpha |
|
|
33
33
|
|
|
34
|
-
7. Pick the ASTC block by role and measure it: round-trip each atlas with astcenc, and use 4×4 if it scores under 35 dB. 6×6 put ringing on
|
|
34
|
+
7. Pick the ASTC block by role and measure it: round-trip each atlas with astcenc, and use 4×4 if it scores under 35 dB. 6×6 put ringing on one game's ink outlines (27–35 dB); 4×4 everywhere costs +2.4 MB.
|
|
35
35
|
8. Use one material per atlas.
|
|
36
36
|
9. Match colour space to the source renderer on day one. Pixi and canvas blend in gamma; under Linear their translucent overlays were about 2× too strong.
|
|
37
37
|
10. After swapping a PNG, check its sprite rect. A PNG of a new size keeps the old rect and Unity drops the sprite; re-importing an atlas regenerates sprite ids. `import_clean`: a fresh import gives 0 `.meta` diffs and every rect fits its texture.
|
|
@@ -42,37 +42,37 @@ Text and glyphs:
|
|
|
42
42
|
12. Import TMP Essential Resources first, once in the Editor, or `CreateFontAsset` returns null (`funtools doctor` fails a project without them).
|
|
43
43
|
13. Build fonts from the full font file. A web subset lacked Ş, Ğ and İ; Nunito lacks ▶, ◀ and ★.
|
|
44
44
|
14. Run `glyph_coverage`: every character in UI strings and names exists in the atlas, 0 missing.
|
|
45
|
-
15. Warm every glyph behind the title screen. First-use baking cost 183–266 ms in
|
|
45
|
+
15. Warm every glyph behind the title screen. First-use baking cost 183–266 ms in one game and 50–270 ms in another (17–20 ms after warm-up); a missing glyph was a third game's last 48 ms hitch.
|
|
46
46
|
16. Atlases are 1024×1024 SDF, sampling 64–90, padding 8–12. The report does not settle static against dynamic.
|
|
47
47
|
|
|
48
48
|
| Atlas | Cost | Seen in |
|
|
49
49
|
|---|---|---|
|
|
50
|
-
| Static | about 5 MB for 1024² atlases |
|
|
51
|
-
| Dynamic | rewritten by every batch run, conflicts on every merge, 8 MB each in git after captures |
|
|
50
|
+
| Static | about 5 MB for 1024² atlases | one game, which then went dynamic |
|
|
51
|
+
| Dynamic | rewritten by every batch run, conflicts on every merge, 8 MB each in git after captures | one game (`Nunito ExtraBold SDF.asset`) |
|
|
52
52
|
|
|
53
53
|
If dynamic, clear the atlases after captures. `tmp_assets_small`: every `*SDF.asset` in git under 50 KB.
|
|
54
54
|
17. Ship TMP outline and underlay variants as material assets (`Resources/UiFontVariants`). Variants of materials made at runtime are stripped from release builds.
|
|
55
55
|
18. Use `textWrappingMode`; `enableWordWrapping` is obsolete in Unity 6 (`funtools doctor` warns).
|
|
56
|
-
19. Judge icon candidates small and against competitors:
|
|
56
|
+
19. Judge icon candidates small and against competitors: one game masked them at 100, 60 and 40 px in a mock search row with 41 competitor icons, for $5.95.
|
|
57
57
|
|
|
58
58
|
## Worked example
|
|
59
59
|
|
|
60
|
-
|
|
60
|
+
A 2D port from Pixi, texture pass:
|
|
61
61
|
|
|
62
62
|
1. Web sprites as PNG; pivots from the web's anchors at 100 pixels per unit, set in the game's setup script.
|
|
63
63
|
2. Colour space switched from Linear to Gamma, because translucent overlays were about 2× too strong.
|
|
64
64
|
3. ASTC by role: painted plates 8×8, sprites 6×6, hero and HUD art 5×5.
|
|
65
65
|
4. Result: textures 69 → 50 MB with no visible change.
|
|
66
|
-
5. The power-of-two splash fix
|
|
66
|
+
5. The power-of-two splash fix made every game 7–8 MiB smaller; one game's resources went 11.7 → 3.8 MB.
|
|
67
67
|
|
|
68
68
|
## Common mistakes
|
|
69
69
|
|
|
70
70
|
- A mipmapped texture that is not a power of two. The splash shipped 10.3 MB raw in every game.
|
|
71
|
-
- One block size for everything. 6×6 rang the ink outlines on
|
|
72
|
-
- Text in generated art not read:
|
|
71
|
+
- One block size for everything. 6×6 rang the ink outlines on one game's atlases.
|
|
72
|
+
- Text in generated art not read: a misspelt logo (game not named).
|
|
73
73
|
- Art that does not fill its canvas: spool art at 73% fill (game not named).
|
|
74
74
|
- A swapped PNG that kept its old sprite rect: an empty logo on TestFlight (game not named).
|
|
75
75
|
- A subset font: "KARABAŞ" broke (game not named).
|
|
76
|
-
- Outline variants not shipped: outlined numbers drew as cream blobs in
|
|
77
|
-
- Dynamic atlases left after captures: 8 MB each in git. Two review builds
|
|
78
|
-
- Icons by prompt:
|
|
76
|
+
- Outline variants not shipped: outlined numbers drew as cream blobs in one game's player build.
|
|
77
|
+
- Dynamic atlases left after captures: 8 MB each in git. Two review builds carried uncommitted reimports of 4 TMP font assets, so main no longer matched what Apple reviewed.
|
|
78
|
+
- Icons by prompt: one game spent $21.46 over 7 rounds before a pick; round one came out 720×1280 from the 9:16 default.
|
|
@@ -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
|
|
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).
|
|
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.
|
|
187
|
-
on one
|
|
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),
|
|
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 (
|
|
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.
|
|
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
|
-
|
|
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;
|
|
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
|
-
|
|
|
39
|
-
|
|
|
40
|
-
|
|
|
41
|
-
|
|
42
|
-
8. Mix in code. No game uses an AudioMixer asset.
|
|
43
|
-
9. In a port, route every sound through one tap so an audit runs headless.
|
|
44
|
-
10. Re-render procedural web audio offline in C# instead of synthesising live.
|
|
45
|
-
11. Handle interruptions: an Ambient audio session (it respects the silent switch and other apps), sound held on pause
|
|
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:
|
|
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
|
-
|
|
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:
|
|
66
|
-
- No 48 kHz setting:
|
|
67
|
-
- MP3 or ADPCM for loops: gaps
|
|
68
|
-
- Uncommitted reimports: two review builds
|
|
69
|
-
- Showing a recording before measuring it: a `simctl recordVideo` capture of
|
|
70
|
-
- Generated audio nobody heard:
|
|
71
|
-
- Many relaunches wedge the Simulator's CoreAudio (crash at audio init);
|
|
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.
|
|
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 (
|
|
96
|
-
- Limiting a helper the genre's hit never limits (
|
|
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,
|
|
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.
|
|
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
|
|
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 |
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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 (
|
|
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.
|
|
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 (
|
|
41
|
-
7. Draw particles from fixed pools; the pool is the budget.
|
|
42
|
-
8. Frequency-test every juice event with bot batches at 30 and 60 fps.
|
|
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 (
|
|
52
|
-
| Crowd
|
|
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:
|
|
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
|
-
|
|
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
|
|
72
|
-
- A follow camera
|
|
73
|
-
- A camera lift for barks (
|
|
74
|
-
- A sticker-border shader
|
|
75
|
-
- A 1.6 s freeze after goals
|
|
76
|
-
- Effects per render frame: at 120 Hz
|
|
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" (
|
|
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`).
|
|
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.
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
(
|
|
8
|
-
(
|
|
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.
|
|
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 (
|
|
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 (
|
|
25
|
-
|
|
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 (
|
|
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
|
|