@genex-ai/cli-demo 0.47.0-dev.71 → 0.47.0-dev.74

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.
@@ -1,15 +1,80 @@
1
1
  ---
2
2
  name: genex-threejs-game-ui
3
- description: Design the 2D interface of a Genex Three.js game — HUD, menus, pause/win/lose screens, score and health displays, overlays, loading screens, and UI state flow. Use whenever the game needs on-screen text, meters, buttons, or menus, or when the interface reads as a generic dashboard, covers the action, or shifts around as numbers change.
3
+ description: Design the 2D interface of a Genex Three.js game — plan the full screen set up front (loader, menu, HUD, pause/win/lose, lobby) under one shared art direction, then build it as an animated DOM overlay. Use for every new game before writing UI code, and whenever the game needs on-screen text, meters, buttons, or menus, or the interface reads as a generic dashboard, covers the action, or shifts as numbers change.
4
4
  ---
5
5
 
6
6
  # Genex Three.js Game UI
7
7
 
8
- The interface is part of the game, not chrome around it. A strong HUD tells the
9
- player what to protect, what to chase, and what just happened — without ever
10
- stealing attention from the scene. This skill covers the 2D layer of a vanilla
11
- Three.js game: architecture, the states every game needs, readability rules,
12
- and wiring UI to game state.
8
+ The interface is part of the game, not chrome around it. A strong UI layer tells
9
+ the player what to protect, what to chase, and what just happened — and it moves:
10
+ screens fade and stagger in, values tween, defeat feels different from victory.
11
+ This skill is the UI director for the 2D layer of a vanilla Three.js game: the
12
+ plan, the architecture, the states, motion, and readability rules.
13
+
14
+ ## Plan the UI first — before any UI code
15
+
16
+ Run this gate ONCE, right after the game concept is locked. It takes two
17
+ minutes and prevents the two failure modes no later polish can fix: a screen
18
+ set discovered piecemeal, and a menu styled in one world while the HUD lives
19
+ in another.
20
+
21
+ **1. Screen inventory — derived from the game type, not discovered later:**
22
+
23
+ | Screen | When it exists | Default tier |
24
+ | --- | --- | --- |
25
+ | Loader | always | 1 — branded (see loader spec below) |
26
+ | Main menu | always for a game headed to publish | 2 — cinematic (`$genex-ai-menu`); 1 for a quick prototype |
27
+ | Pause | always | 1 — menu backdrop under a dark overlay |
28
+ | Fail / retry | always | 1 — a *graded* variant of the menu screen |
29
+ | Win / next | always | 1 — graded variant, warm |
30
+ | Settings | when there is anything to set | 1 |
31
+ | Lobby / waiting | multiplayer only | 1 over the menu backdrop |
32
+ | HUD | always | 1 CSS; 2 (`$genex-ai-hud`) when the identity earns it |
33
+
34
+ The lobby row is bound by `$genex-threejs-multiplayer`'s MANDATORY rule: the
35
+ waiting overlay's visibility is re-read from `mm.matchmaking.status` every
36
+ frame and closes the instant it flips to `playing` — verified in two browser
37
+ windows. Plan the lobby as a styled screen (roster + count over the menu
38
+ backdrop), not an afterthought `<div>`.
39
+
40
+ **2. One shared style brief — for the WHOLE game, not just the UI.** Write it
41
+ once — 4–5 named hues, materials, one display + one body font, mood — and
42
+ store it as a comment block near the UI code. `$genex-ai-menu`,
43
+ `$genex-ai-hud`, the loader, and every plain-CSS screen consume THIS brief
44
+ verbatim — and so does the scene: the visual-direction plan (the router's
45
+ next gate) derives its lighting mood, fog, grading, and post-stack choices
46
+ from the same block. Two style briefs in one game is a bug; a scene graded in
47
+ one world under a UI styled in another is the same bug.
48
+
49
+ **3. Name your references.** Pick the closest capsule in
50
+ [references/style-capsules.md](references/style-capsules.md), name 2–3 top
51
+ games of the genre, and state in one line which structural conventions you're
52
+ borrowing. Conventions only — never logos, exact layouts, or trade dress.
53
+
54
+ **4. Ask only when genuinely ambiguous.** If the concept pins the mood (a
55
+ "gothic horror dungeon crawler" pins it), decide and state the plan in one
56
+ line. Only when the art direction is truly open, ask ONE structured question
57
+ (your environment's `AskUserQuestion`-style tool) with 2–3 concrete directions,
58
+ each naming its palette + font pair. Never ask about the screen inventory —
59
+ it derives from the game type.
60
+
61
+ **5. Style follows THIS game's concept.** The examples in every Genex skill
62
+ are examples, not defaults. Do not default to neon/cyberpunk/synthwave — or
63
+ any other single register — unless the concept calls for it.
64
+
65
+ ## The tier ladder
66
+
67
+ - **Tier 1 — instant baseline, every game.** Everything in this skill: planned
68
+ screens, shared brief, branded loader, animated CSS menu with keyboard
69
+ navigation, phase transitions, UI sounds, vignette. Zero generations — the
70
+ game is playable immediately.
71
+ - **Tier 2 — generated upgrades, async.** The cinematic menu video
72
+ (`$genex-ai-menu`) and the sprite HUD (`$genex-ai-hud`). Enqueue with
73
+ `--no-wait`, keep building, pick results up with `npx genex wait <id>`, swap
74
+ them in as they land. **Tier 2 must never block a playable v0.**
75
+ - **Tier 3 — offer, don't build.** Video layers over the HUD, 9-slice panel
76
+ sprites, a generated logotype, animated menu sprites. Offer in one line
77
+ after the player has seen Tier 1+2 working; build on request.
13
78
 
14
79
  ## Architecture: DOM overlay by default
15
80
 
@@ -43,8 +108,8 @@ exception for things that belong to the world, not the default.
43
108
  Build these as show/hide layers over one state machine, not as ad-hoc DOM
44
109
  edits scattered through the code:
45
110
 
46
- 1. **Loading** — visible until assets are ready; players must never stare at a
47
- black screen. Even "Loading… 3/5" over the dark background is enough.
111
+ 1. **Loading** — the branded loader below; players must never stare at a black
112
+ screen or a bare percentage.
48
113
  2. **Playing HUD** — the minimal always-on layer (see hierarchy below).
49
114
  3. **Pause** — freeze the loop, dim the scene, show resume/restart. (With the
50
115
  bundled physics pack, freezing is built in: `physics.paused = true` plus
@@ -59,6 +124,67 @@ edits scattered through the code:
59
124
  HUD state come from `$genex-threejs-multiplayer`; render what the SDK
60
125
  reports, don't guess at it.
61
126
 
127
+ ## The loader
128
+
129
+ The loader is the first thing every player sees — a bare "Loading… 3/5" over
130
+ black reads as a broken page. The branded version costs nothing:
131
+
132
+ - **Background:** the menu's still frame — when the game has a cinematic menu,
133
+ that image exists BEFORE the video does; show it dimmed
134
+ (`filter: brightness(0.6)`) behind the progress. Menu-less game: one
135
+ `npx genex image` key-art call in the house style, enqueued first thing.
136
+ Until the image arrives, the flat darkest hue from the style brief.
137
+ - **Progress:** a thin bar styled from the brief (its accent hue), driven by
138
+ real asset counts — never an indeterminate spinner alone.
139
+ - **Reveal:** when ready, fade the loader out (400–600 ms) into the menu or
140
+ game. No hard cut.
141
+
142
+ ## Motion — screens move or the game feels dead
143
+
144
+ Phase changes animate. `hidden` alone hard-cuts; pair it with a class so
145
+ opacity can transition:
146
+
147
+ ```ts
148
+ function setPhase(phase: "loading" | "playing" | "paused" | "over" | "won") {
149
+ for (const s of document.querySelectorAll<HTMLElement>("#ui .screen")) {
150
+ const on = s.dataset.phase === phase;
151
+ s.classList.toggle("is-on", on);
152
+ if (on) s.hidden = false; // show immediately, then fade in
153
+ else setTimeout(() => { if (!s.classList.contains("is-on")) s.hidden = true; }, 300);
154
+ }
155
+ }
156
+ ```
157
+
158
+ ```css
159
+ #ui .screen { opacity: 0; transition: opacity 280ms ease; }
160
+ #ui .screen.is-on { opacity: 1; }
161
+
162
+ /* Entrance choreography: title first, buttons staggered, corner text last.
163
+ Stamp --i per element: <button class="stagger" style="--i: 1"> … */
164
+ .screen .stagger { opacity: 0; transform: translateY(12px);
165
+ transition: opacity 320ms ease, transform 320ms ease;
166
+ transition-delay: calc(var(--i, 0) * 70ms); }
167
+ .screen.is-on .stagger { opacity: 1; transform: none; }
168
+ ```
169
+
170
+ - **Defeat and victory are grades, not new screens.** Same backdrop, different
171
+ emotion via CSS `filter` on the background — defeat
172
+ `saturate(0.25) brightness(0.55)` with a ~600 ms beat before buttons stagger
173
+ in; victory `saturate(1.15) brightness(1.05)` with the score counting up
174
+ (tween the displayed number over ~800 ms; never snap it).
175
+ - **Buttons react**: a hover/focus state (scale, glow, or an indicator chevron)
176
+ plus a pressed state. Menus are keyboard-first — ↑/↓ moves focus, Enter
177
+ activates, and the hovered/focused item is visibly selected.
178
+ - **Values tween.** Score, coins, timers tick to their new value; health bars
179
+ slide. A number that teleports reads as a bug even when it's correct.
180
+
181
+ ## Sound — a silent UI is a bug
182
+
183
+ Hover tick, confirm click, and a fail/win stinger are three
184
+ `npx genex sfx` calls (`$genex-ai-sfx`); a cinematic menu also wants a quiet
185
+ ambient loop, because its video is necessarily muted. Wire hover sounds to
186
+ `mouseenter`/`focus` (throttled), keep them short and quiet.
187
+
62
188
  ## Hierarchy: if everything shouts, nothing reads
63
189
 
64
190
  Order the HUD by what the player loses the game for ignoring:
@@ -79,6 +205,10 @@ Order the HUD by what the player loses the game for ignoring:
79
205
  - **Contrast against the real scene.** Test text over the brightest AND
80
206
  darkest areas of actual gameplay; a soft dark plate or text-shadow beats
81
207
  restyling per level.
208
+ - **One cohesion layer.** A single full-screen vignette div (a subtle radial
209
+ gradient darkening the corners, optionally faint grain) over canvas + UI is
210
+ the cheapest way to make DOM-over-WebGL read as one composed image instead
211
+ of a web page floating over a game. Keep it `pointer-events: none`.
82
212
  - **Desktop first.** Verify at desktop sizes and survive window resizes
83
213
  without clipping; don't design phone layouts or test mobile viewports unless
84
214
  the user asks. Exception: when a bundled controller (character/car/drone) is
@@ -94,26 +224,27 @@ timer in the game WILL drift apart). Buttons and menu keys emit the same
94
224
  intents the gameplay input path uses — a "Restart" button and the R key must
95
225
  run identical code.
96
226
 
97
- ```ts
98
- // Each .screen carries data-phase (see the HTML block above); the names must match exactly.
99
- function setPhase(phase: "loading" | "playing" | "paused" | "over" | "won") {
100
- for (const s of document.querySelectorAll<HTMLElement>("#ui .screen"))
101
- s.hidden = s.dataset.phase !== phase;
102
- }
103
- ```
104
-
105
- UI sounds (clicks, confirms, win stingers) are one `npx genex sfx` away — see
106
- `$genex-ai-sfx`.
227
+ When the game deserves generated art in this layer: a cinematic menu (looping
228
+ video backdrop behind the buttons) is `$genex-ai-menu`; an art-directed HUD
229
+ built from a generated sprite set is `$genex-ai-hud`. Both slot into this
230
+ exact `#ui` + `data-phase` architecture and consume the shared style brief.
107
231
 
108
232
  ## Failure modes to catch before the player does
109
233
 
234
+ - No UI plan: screens invented one at a time, menu and HUD styled in two
235
+ different worlds.
110
236
  - A generic stat dashboard (rows of labels + numbers) instead of a designed
111
237
  HUD — pick the 2–3 numbers that matter and style them by hierarchy.
238
+ - Hard-cut phase swaps, a menu whose elements just appear, numbers that
239
+ teleport.
240
+ - A silent menu; a bare "Loading…" over black.
112
241
  - UI panels covering the player or the thing about to kill them.
113
242
  - Layout shifting as numbers grow.
114
243
  - A fail state with no visible restart key, or a restart that reloads the page.
115
244
  - Buttons that render but don't emit the game's real input intents.
116
245
  - UI logic duplicating game rules and drifting out of sync.
246
+ - A waiting/lobby overlay that can miss its dismissal — see the multiplayer
247
+ skill's status-driven rule.
117
248
 
118
249
  Before calling UI done, check it over real gameplay footage at desktop size —
119
250
  `$genex-threejs-visual-validation` has the capture discipline.
@@ -0,0 +1,89 @@
1
+ # Style capsules — top-tier UI conventions by genre
2
+
3
+ How to use: pick the capsule closest to the game, name 2–3 top games of the
4
+ genre yourself (you know them), and state in one line which structural
5
+ conventions you're borrowing. Borrow **conventions** — placement, hierarchy,
6
+ type treatment, material language. Never logos, exact layouts, or a specific
7
+ game's trade dress. Then write the shared style brief in the game's OWN world:
8
+ the capsule says a racing HUD leans oblique and bottom-right-heavy; your brief
9
+ says what it's made of in THIS game.
10
+
11
+ Every capsule below assumes the base rules from the skill: corners/edges for
12
+ UI, one display + one body font, tabular numerals, contrast plates over
13
+ arbitrary scenes.
14
+
15
+ ## Fantasy / action RPG
16
+
17
+ - Survival cluster anchored to the bottom corners or bottom-center (orbs,
18
+ framed bars); ability/item hotbar bottom-center; quest/objective text
19
+ top-right, quiet.
20
+ - Ornament lives on widget FRAMES (metal, carved wood, parchment edges) —
21
+ never as full-screen ambient texture.
22
+ - Serif or engraved display type; humanist body; muted earthy palette with ONE
23
+ saturated accent reserved for danger/low-health.
24
+ - Feedback is material: gold glints on pickup, red vignette pulse on damage.
25
+
26
+ ## Clean sci-fi / space
27
+
28
+ - Hairline strokes (1px), thin geometric panels, generous empty space between
29
+ widgets; data clusters hug the screen edges.
30
+ - Uppercase display type with wide letter-spacing; small caps or condensed
31
+ body; monochrome (near-white on near-black) plus a single accent hue.
32
+ - Panels read as glass: slight transparency, subtle inner glow, no drop
33
+ shadows heavier than a whisper.
34
+ - Motion is precise and quick (120–200 ms), no bounce.
35
+
36
+ ## Racing / arcade sport
37
+
38
+ - Speed/tacho cluster bottom-right — one huge numeral, small unit label;
39
+ position/lap counter top-left; the top edge stays nearly empty (the road is
40
+ the point).
41
+ - Oblique/italic display type reads as speed; chunky high-contrast chips for
42
+ position and lap deltas.
43
+ - Saturated team/brand hues are fine — but two, not six.
44
+ - Values tween FAST (speed) or pop (position change); a gear change may
45
+ flash — a full-screen flash may not.
46
+
47
+ ## Military / modern shooter
48
+
49
+ - Ammo bottom-right (large current mag / small reserve), health bottom-left,
50
+ compass strip top-center, hit markers at the crosshair.
51
+ - Stencil or condensed grotesque display; desaturated palette — amber/red
52
+ exist ONLY as warnings, so they still mean something.
53
+ - Damage reads as a directional vignette, not a number cloud.
54
+
55
+ ## Horror
56
+
57
+ - The strongest HUD is almost none: surface health/resources on change, then
58
+ fade them away; keep permanent chrome minimal and dim.
59
+ - Typewriter, worn serif, or handwriting display type; heavy vignette and
60
+ grain in the cohesion layer.
61
+ - UI motion is slow (400 ms+) and quiet; a sudden UI move is itself a scare —
62
+ spend it deliberately.
63
+
64
+ ## Retro / 8-bit
65
+
66
+ - Pixel font at INTEGER scales only, hard edges — no anti-aliasing, no blur,
67
+ no gradients; 4–8 color palette total, chosen once.
68
+ - Score top-left or top-center, lives as repeated icons — conventions players
69
+ already know; lean on them.
70
+ - Motion is stepped (frame-quantized), not eased; an optional scanline overlay
71
+ in the cohesion layer sells it.
72
+
73
+ ## Cozy / casual
74
+
75
+ - Rounded shapes, soft single-direction shadows, cream/pastel palette with one
76
+ warm accent; big friendly numerals.
77
+ - Buttons are plump and obviously pressable; transitions bounce slightly
78
+ (scale 0.95 → 1.02 → 1) instead of fading.
79
+ - Nothing flashes red; even failure is gentle (desaturate + a soft "try
80
+ again").
81
+
82
+ ## Painterly / stylized adventure
83
+
84
+ - UI elements read as brushwork: irregular edges, hand-drawn frames, paper or
85
+ canvas texture on PLATES (not full-screen).
86
+ - A display face with calligraphic character; body stays clean for
87
+ readability.
88
+ - Palette lifted from the scene's own key art — sample it, don't invent a
89
+ second palette.
@@ -40,7 +40,9 @@ map, execution order, and acceptance gate.
40
40
  | eye adaptation, tone mapping, LUT grading, output color | `$genex-threejs-exposure-color-grading` |
41
41
  | shared depth/normal/velocity ownership and multi-pass ordering | `$genex-threejs-image-pipeline` |
42
42
  | fixed-view diagnostics, seed sweeps, temporal and budget evidence | `$genex-threejs-visual-validation` |
43
- | HUD, menus, pause/win/lose screens, score and health displays, overlays, loading screens, on-screen text and buttons, UI state flow | `$genex-threejs-game-ui` |
43
+ | the 2D interface — HUD, menus, pause/win/lose screens, loaders, lobby, on-screen text and buttons, UI state flow — **mandatory for every game**, and its "Plan the UI first" gate runs right after the concept is locked | `$genex-threejs-game-ui` |
44
+ | a cinematic menu — main menu/title/pause/victory/defeat/lobby/credits with a looping generated video backdrop behind DOM buttons | `$genex-ai-menu` |
45
+ | a cohesive art-directed HUD — generated sprite set (matched frames, masks, icons in one style) wired with masked fills | `$genex-ai-hud` |
44
46
  | the game works but feels flat, floaty, or unresponsive: input response, acceleration curves, camera shake, hit feedback, hitstop, cooldowns, difficulty ramp, fail/retry loop | `$genex-threejs-game-feel` |
45
47
  | realtime multiplayer: movement sync, a shared ball/NPC, host-run scores/enemies, shots/emotes, persistence | `$genex-threejs-multiplayer` |
46
48
  | player identity, sign-in, guests, saves/progress, per-player state, a shared persistent world, leaderboards — **mandatory for every game** | `$genex-threejs-embed-auth` |
@@ -51,6 +53,23 @@ map, execution order, and acceptance gate.
51
53
  mentions sign-in, saves, progress, per-player state, a persistent world, or
52
54
  leaderboards. Multiplayer auth (`getColyseusAuth`) comes from it too.
53
55
 
56
+ **UI is mandatory routing:** every game has an interface — load
57
+ `$genex-threejs-game-ui` for every NEW game and run its "Plan the UI first" gate
58
+ (screen inventory, one shared style brief, tier decisions) right after the game
59
+ concept is locked, before any UI code. Its Tier-2 generations (cinematic menu,
60
+ sprite HUD) are enqueued async (`--no-wait` + `npx genex wait <id>`) so they land
61
+ while the game is being built — they never block a playable v0.
62
+
63
+ **The look is planned up front too:** right after the UI gate, lock the visual
64
+ direction in the same plan block — the camera rig + pointer bucket
65
+ (`$genex-threejs-camera-direction`), the renderer baseline (tone mapping,
66
+ exposure, output color space — set deliberately at boot; stock three.js
67
+ defaults are not a look, `$genex-threejs-exposure-color-grading`), the post
68
+ stack this game ships and deliberately skips (bloom/AO/grade — justified by
69
+ the shared style brief; `$genex-threejs-image-pipeline` owns ordering when 2+
70
+ compose), and the lighting/atmosphere mood from that same brief. Planning is
71
+ not building — effects still land last in the execution order.
72
+
54
73
  **Multiplayer is mandatory routing:** if the game has 2+ players sharing a world, loading
55
74
  `$genex-threejs-multiplayer` is **required** before any networking code — the SDK auto-smooths
56
75
  remote players **and shared objects**, and gives you server-enforced object ownership (a ball) and
@@ -106,9 +125,16 @@ concept-driven — a richer first build beats a grey-box one.
106
125
  cursor-heavy UI core). **Never** — cursor-core games (click-to-move, tower
107
126
  defense, builder, card/puzzle), orbit showcases, touch-only. The mechanism and
108
127
  the full aim contract live in `$genex-threejs-camera-direction`.
128
+ - Art direction follows THIS game's concept. The style examples inside skills
129
+ are examples, not defaults — never default to neon/cyberpunk/synthwave (or any
130
+ other single register) unless the concept calls for it.
109
131
  - Build silhouette, motion, and material readability before adding image effects.
110
132
  Never dress a primitive shape in glow or bloom to fake quality — authored
111
133
  forms first, then materials, then lighting, then effects last.
134
+ - Set the renderer baseline deliberately at boot — tone mapping, exposure,
135
+ output color space (`$genex-threejs-exposure-color-grading`). A game that
136
+ ships on stock defaults hasn't chosen a look; a game that stacks post
137
+ effects it never planned has chosen several.
112
138
  - Prefer deterministic seeds and named controls for every procedural system.
113
139
  - Keep game logic, simulation state, visual fields, and screen-space passes
114
140
  separated unless coupling is intentional.
@@ -20,29 +20,49 @@ Three.js release or branch, and do not blindly copy demo architecture.
20
20
  2. Wire player identity before any boot code: `$genex-threejs-embed-auth` is
21
21
  mandatory for every game (`initEmbed(...)` + the `waitForPlayer()` gate) —
22
22
  saves, leaderboards, and multiplayer auth all come from it.
23
- 3. Wire the gameplay layer for the player verb: the physics world via
23
+ 3. Run `$genex-threejs-game-ui`'s "Plan the UI first" gate: screen inventory,
24
+ one shared style brief, a tier per screen. Enqueue any Tier-2 UI
25
+ generations now with `--no-wait` (pick them up later with
26
+ `npx genex wait <id>`) — they render server-side while you build the game.
27
+ 4. Lock the visual direction — the same plan-first logic as the UI gate, in
28
+ the same plan block, before any rendering code:
29
+ - **camera**: the rig type and the pointer bucket
30
+ (`$genex-threejs-camera-direction` — the bucket decision is mandatory);
31
+ - **renderer baseline**: tone mapping, exposure, and output color space set
32
+ deliberately at boot (`$genex-threejs-exposure-color-grading` owns the
33
+ staging — stock three.js defaults are not a look);
34
+ - **the post stack**: which image effects THIS game ships (bloom? AO?
35
+ grade?) and which it deliberately doesn't — each named and justified by
36
+ the shared style brief; when 2+ effects compose,
37
+ `$genex-threejs-image-pipeline` owns the pass ordering;
38
+ - **lighting/atmosphere mood** from the SAME shared style brief the UI gate
39
+ wrote — one art direction across scene and UI.
40
+ Planning is not building: effects still land LAST (steps 10–11); this step
41
+ only fixes the target so the look isn't improvised pass-by-pass at the end.
42
+ 5. Wire the gameplay layer for the player verb: the physics world via
24
43
  `$genex-threejs-physics-rapier` when anything falls, collides, or gets
25
44
  pushed; on-foot movement via `$genex-threejs-character-controller`;
26
45
  driving/flying and character↔vehicle enter/exit via
27
46
  `$genex-threejs-vehicle-controllers`.
28
- 4. Select the minimum scene-generation skills: geometry, materials, vegetation,
29
- architecture, planets, water, precipitation, clouds, or VFX. Show a loading
30
- overlay from the very first asset load — a player must never stare at a black
31
- screen; the rest of the UI states come at step 10.
32
- 5. Add camera direction when framing, controls, transitions, or scale perception
33
- affect play — or the game aims with the mouse (shooter/FPS/turret): pointer-lock
34
- bucket decisions live there.
35
- 6. Add procedural animation when object motion needs authored phases,
47
+ 6. Select the minimum scene-generation skills: geometry, materials, vegetation,
48
+ architecture, planets, water, precipitation, clouds, or VFX. Show the
49
+ planned loader from the very first asset load — a player must never stare
50
+ at a black screen; the rest of the UI states come at step 12.
51
+ 7. Add camera direction when framing, controls, transitions, or scale perception
52
+ affect play — or the game aims with the mouse (shooter/FPS/turret): the
53
+ step-4 bucket decision executes here.
54
+ 8. Add procedural animation when object motion needs authored phases,
36
55
  convergence, looping, or deterministic timelines.
37
- 7. Add shared fields before writing multiple independent noise layers.
38
- 8. Add lighting, atmosphere, and shadows only after the no-post baseline reads.
39
- 9. Add image-pipeline, bloom, exposure, grading, or AO last.
40
- 10. Once the loop is playable, wire the interface states via
56
+ 9. Add shared fields before writing multiple independent noise layers.
57
+ 10. Add lighting, atmosphere, and shadows only after the no-post baseline reads.
58
+ 11. Add image-pipeline, bloom, exposure, grading, or AO last — building out the
59
+ step-4 post plan, not inventing one now.
60
+ 12. Once the loop is playable, build the planned interface states via
41
61
  `$genex-threejs-game-ui` (HUD, pause, fail/retry, win, and the full loading
42
- state grown from the step-4 overlay) and run a feel pass via
43
- `$genex-threejs-game-feel` (input response, camera, impact feedback, retry
44
- speed).
45
- 11. Validate in a real browser with fixed seeds, captures, interaction checks,
62
+ state grown from the step-6 loader), swap in any landed Tier-2 UI assets,
63
+ and run a feel pass via `$genex-threejs-game-feel` (input response, camera,
64
+ impact feedback, retry speed).
65
+ 13. Validate in a real browser with fixed seeds, captures, interaction checks,
46
66
  and performance evidence.
47
67
 
48
68
  ## Acceptance gate