@genex-ai/cli-demo 0.47.0-dev.70 → 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.
- package/README.md +25 -2
- package/dist/index.js +1158 -16
- package/package.json +4 -2
- package/templates/skills/genex-ai-hud/SKILL.md +381 -0
- package/templates/skills/genex-ai-hud/references/masked-fill.md +145 -0
- package/templates/skills/genex-ai-hud/references/stage1-prompt-template.md +44 -0
- package/templates/skills/genex-ai-hud/references/stage2-prompt-template.md +73 -0
- package/templates/skills/genex-ai-image/SKILL.md +14 -4
- package/templates/skills/genex-ai-menu/SKILL.md +291 -0
- package/templates/skills/genex-ai-video/SKILL.md +11 -4
- package/templates/skills/genex-getting-started/SKILL.md +5 -2
- package/templates/skills/genex-threejs-game-ui/SKILL.md +149 -18
- package/templates/skills/genex-threejs-game-ui/references/style-capsules.md +89 -0
- package/templates/skills/genex-threejs-skill-router/SKILL.md +27 -1
- package/templates/skills/genex-threejs-skill-router/references/routing-map.md +37 -17
- package/templates/skills/genex-threejs-visual-validation/SKILL.md +10 -5
|
@@ -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 —
|
|
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
|
|
9
|
-
player what to protect, what to chase, and what just happened —
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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** —
|
|
47
|
-
|
|
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
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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,
|
|
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.
|
|
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
|
-
|
|
29
|
-
architecture, planets, water, precipitation, clouds, or VFX. Show
|
|
30
|
-
|
|
31
|
-
screen; the rest of the UI states come at step
|
|
32
|
-
|
|
33
|
-
affect play — or the game aims with the mouse (shooter/FPS/turret):
|
|
34
|
-
bucket
|
|
35
|
-
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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-
|
|
43
|
-
`$genex-threejs-game-feel` (input response, camera,
|
|
44
|
-
speed).
|
|
45
|
-
|
|
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
|
|
@@ -26,11 +26,16 @@ evidence, temporal checks, budgets, and explicit rejection criteria.
|
|
|
26
26
|
|
|
27
27
|
For plain game tasks — nothing from the procedural/visual-system pack loaded —
|
|
28
28
|
this is the whole acceptance gate, and it is also the *ceiling*: a smoke check,
|
|
29
|
-
not a certification. Run it ONCE per milestone
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
29
|
+
not a certification. Run it ONCE per milestone, and only AFTER that milestone's
|
|
30
|
+
`genex preview` is pushed — ship the rough draft first, then check it; the
|
|
31
|
+
player may already be walking around your build while you do. Catch obvious
|
|
32
|
+
breakage, fix what's clearly broken, and hand the feel/polish judgment to the
|
|
33
|
+
player — don't loop re-testing the same build, don't re-test after cosmetic
|
|
34
|
+
tweaks (sounds, colors, tuning values), and don't try to exercise every button
|
|
35
|
+
and edge case yourself. This browser check is the only testing a game draft
|
|
36
|
+
needs: never add unit tests or a test framework to a game unless the user asks.
|
|
37
|
+
The player deciding "does it feel right?" is faster and truer than you clicking
|
|
38
|
+
everything twice.
|
|
34
39
|
|
|
35
40
|
1. Load the page in a real browser; the canvas renders (no black screen, no
|
|
36
41
|
console errors). For an unpublished draft, open the dev server in local
|