Skip to content

feat: rebuild the menu and Hidden Garden prologue as one system - #170

Merged
arudaev merged 100 commits into
mainfrom
slice/prologue
Oct 24, 2026
Merged

arudaev merged 100 commits into
mainfrom
slice/prologue

Conversation

@arudaev

@arudaev arudaev commented Oct 24, 2026 •

Copy link
Copy Markdown
Member

The prologue slice rebuild (docs/15): from the loading screen, through the menu and the whole Hidden Garden prologue, into the anomaly. Five workstreams were built in parallel against one contract, merged and played here. It also carries #154 (Dexter at the coffee machine), #164 (walk and run by stride), the chair pickup and #163 (Jenny's fight), so this branch plays from the title to the ending.

Closes #50, #52, #57, #159. Part of #51, #156, #158, #160.

flowchart LR
  L["loading<br/>pocket-computer CRT,<br/>real progress, never stalls"] --> M["menu<br/>DEGGSTER.EXE over the<br/>garden key art"]
  M -->|"fade, no black frame"| G["Hidden Garden<br/>wind, falling leaves,<br/>blurred foreground over the hero,<br/>pond reflections, feet in the grass"]
  G --> D["Dexter on the bench<br/>hops off, leads, waits,<br/>looks back, points at the roof"]
  D --> S["secrets<br/>muffin in the hollow,<br/>roof glint"]
  S --> P["the pond<br/>the reflection goes wrong:<br/>the rust maze in the water"]
  P --> X["the shove → 404<br/>'404: Hidden Garden not found.'"]
  X --> A["pulled into the void →<br/>clean Rusty Creek"]
Loading

The five workstreams

# PR What it delivers
5 art #165 art/inventory.csv; fx-leaves, fx-ground and fx-water boards; Dexter's dexter-prologue poses (approved); the menu key art; scripts/readability.py (#159)
3 hero #166 surfaces.json: feet sink 1–3 px by material with grass tufts over them; footstep and landing puffs from fx-ground; jump and fall follow the arc; drawn hurt frames instead of a white flash; steady camera
1 boot #167 one loader in game/src/boot/, with boards as data in stage/boards.json, retry/continue on failure and a watchdog; the pocket-computer loading screen; the menu over the key art with a live garden behind it
2 atmosphere #168 depth bands (stage/depth.ts); wind shader anchored on each plant's base; front and back leaves; blurred foreground drawn over the hero; pond ripples, shimmer, lily pads, the hero's reflection; the wrong reflection on anomaly-reveal; addRim
4 prologue #169 Dexter's tested guide and pond finale models; the 404 crossing variant; secrets; docs/03's prologue as an 8-beat wordless arc

Wave 2: the playtest fixes (P1–P8)

PR What it fixes
#171 Dexter he leads at walking pace and is never overtaken (smallest lead 74 px); the hero spawns at the gate, right of the entrance
#172 motion steadier creek movement, jump buffering instead of slow spam, idles that breathe
#173 terrain walkability from the art: water respawns at the bank, planks and stairs are steps (≤ 16 px) not slopes, logs and walls block, no falling through
#174 layers every layer rendered whole in fixed depth bands, so no cut-outs; grass in front of the feet
#175 Region 1 the 404 lands on the creek path (not the rail bridge), one clear ram, the chair moment with a J / X glyph, more rovers, Jenny's knockback and tells

After wave 2:

  • Grass strip: the near grass was painted pink; it now matches the hues of the art under it (autumn red and orange).
  • Carried chair: the hero has no carrying frames, so the chair vanished after the pick-up. It now rides on his back between swings.
  • Gaps: three collision gaps in the creek and the garden were closed, so the creek runs at full speed with 0 resets.
  • CI: the art-pipeline job now installs numpy.

Integration fixes on this branch:

  • Jenny's ram: the hero kept walking and she passed behind him, so input is now locked from her entrance to the crash.
  • ?boss-test spawn: it was 10 px under the floor and looped through resets; it now lands on the walk line.
  • Extra region images: Preload now loads the images listed in atmosphere.json assets, after the JSON wave. Without this the pond's wrong reflection was never requested.
  • Conflicts: the BOARDS conflicts were resolved by moving the list to boards.json.

Checks

  • Tests: typecheck passes, 268 game tests pass, the build passes, 111 script tests pass, check_docs.py passes, collision_check.py reports 0 problems, and export_stage.py --verify rebuilds every chunk exactly.
  • Played in the browser:
    • loading screen → menu → Start fades into the garden
    • 58 fps with the full atmosphere
    • the hero grounded 3 px into the grass
    • Dexter leading
    • the wrong-reflection texture loaded and the reveal ready
  • Played by the prologue agent with ?skip-menu: the whole prologue, through the 404 and the pull. Screenshots are in game/verification/prologue/.
  • Vercel preview: the preview of this branch builds (it needs the Vercel login).
  • Region 1 on the integrated code (stepped in a background tab):
    • clean bridge → Jenny's ram with the hero frozen at x 3238 → crash → OK → maze start, with input back
    • coffee save → bow, sweat, give, idle
    • boss gate → "Jenny 30/30" → 30 hits → boss-defeated → Ending (glitch) with the stage frozen

How to test

git switch slice/prologue
cd game && npm ci && npm run dev

Restart npm run dev after any asset export, because Vite only serves public files that existed when it started.

  1. Menu: open it; it loads with progress. Press Start.
  2. The garden: walk right (A/D or arrows, hold to run, Space to jump). Watch the grass under the hero's feet, the leaves, the foreground plants passing over him, and the pond.
  3. Dexter: walk up to the bench and follow him through the garden. The muffin is in the hollow behind the grass; the glint is on the shed roof.
  4. The ending: at the jetty, look at the water, take the shove, press OK on the 404, and get pulled into clean Rusty Creek.

Dev shortcuts:

  • ?skip-menu skips the menu.
  • game.scene.getScene('Flow').prologue.skipToPond() jumps to the jetty.
  • game.scene.getScene('Preload').tracker.summary() shows the load state.

Known gaps

  • No mud: the garden art has no mud, so no 4 px material is authored.
  • Carrying: the carried chair is the drawn chair frame on his back, not drawn carrying poses.
  • Timed run: the 8–12 minute run from title to ending still needs a human player.
  • No turn-around: there are no turn-around frames, so facing flips.
  • Water: the scene isn't mirrored live; the painted reflection is animated instead.
  • Not replayed after the merge: the reveal dimming (it runs on real-time tweens); a full manual run of the maze between the start and the coffee machine.
  • Not in this branch: docs: one owner for the whole game after Codex stopped #162 (docs: one owner) is a separate PR.

Three boards from the Mensa and lab photos, sized against the 76 px hero: the coffee machine at 80 px fills its 40 x 80 save box, the food pickups are 13-18 px, the pocket computer is a 19 x 10 px case. Awaiting review; not exported yet.
CoffeeVisit seats Dexter beside every coffee machine that has a Dexter spawn. The first save there plays bow, sweat and the pocket computer and muffin gift, which unlocks the map. Pools from defeated enemies wait until the next save, when he absorbs them. Story scenes now share one atlas loader so their preloads no longer collide. Dev: Shift + F4.
Both branches added a scene to the registry: Flow from the stack and CoffeeVisit here. Fixes found playing it on the merged stage: Preload loads every atlas (story scenes loading the same keys stalled it), the machine uses the approved coffee-machine atlas, and Dexter's first pose follows a save made between frames. Dev builds expose window.game.
Jenny revs, charges nose first, crashes at the far wall, sheds parts and is stunned, in three phases over 30 hits. Her armoured nose takes chair hits only from behind or while she is stunned. The arena comes from collision (boss gate and floor line), and clip lengths come from her anims.json. Beating her emits boss-defeated, which starts the ending. Dev: ?boss-test.
compare.py stride measures the approved cycles: the walk's stride is 43 px and the run's 82 px. export_atlas passes the stride into anims.json, and locomotion plays both cycles by distance, so the planted foot no longer slides. Speeds drop from 3.5 / 6 m/s, 2.3-2.5x too fast for the art, to 2.2 / 4.6 m/s. The rover's spot range is its own value. Part of #156.
The chair is armed by its pickup box (item chair), not by the region name. The approved chair-pickup frame lies there, and the carried state lives in the game registry, so it survives region swaps and respawns. Dev test URLs start with it. Part of #156.
…logue

# Conflicts:
#	game/src/stage/assets.ts
docs/15 sets the bar Alexander asked for (menu, loading, layers, wind, leaves, water, grounding, story), the five workstreams and the files each owns, and the contracts between them. Progress goes in docs/prologue-tracker.csv.
readability.py puts prologue sprites at 1x on Hidden Garden bands, reports fill and outline contrast, flags LOW sprites and previews a 1 px rim light. export_key_art.py writes opaque 16:9 menu art into game/public/assets/ui.
fx-leaves (birch, maple, oak 5 each), fx-ground (dust, grass, leaf-kick, splash 4 each), fx-water (lily-bob, ripple, sparkle 4 each) exported for review; dexter-prologue (look-back 3, wait 3, sit 2) in tmp review only; menu-key 1280x720 into game/public/assets/ui.
art: prologue FX, Dexter additions, menu key art, inventory
Alexander approved dexter-prologue (look-back 3, wait 3, sit 2 at 27 px), so it is exported into the game and loaded with the other boards.
Far and mid plates rendered whole and quilted again; the sky cross-fades.
Water, path and rear filled behind the foreground (no black holes when it
slides). A grass strip (06-near, z 6, scroll 1) painted along every chunk's
trail covers the feet; the chunks' art carries it. atmosphere.json sways it
from its base.
Walk-offs shorter than 0.12 s keep the locomotion cycle, step drops under 10 px land without a pose, a moving landing is its crouch only and goes straight into the cycle the body is in (no idle and run-start at full speed). The jump crouch shows for one rendered frame and is skipped out of a landing; a released jump brakes at 3x gravity once it can still reach 52 px, so a tap hop tops out in 0.18 s instead of 0.29 s. Idle variants start at the idle loop, hold their key pose and never repeat; check-wounds plays back out.
The standing hero is drawn as three crops of its own frame: the chest rises 1 px for two idle loops in four (the split row doubled), the poncho's lower half takes 1 px downwind while a gust of the region's atmosphere wind passes (hysteresis, 0.35 s hold), the legs never move. Whole pixels only; any frame that is not a hero idle frame is drawn whole.
depth_layers.py clear: rear pieces that touch the chunk's top and end above
320 px are repainted as sky, far and mid by the model; their pixels go to
sky where sky-coloured, else to the nearer of far and mid.
The grown chunks hg-1-0 to hg-3-0 lose the canopy pieces with straight cuts
(the hill oak is a stump on the crest now); sky, far and mid rebuilt from
the new masks, parallax.png at five camera positions.
docs/09 gets the hot-dog steps (clear, near, under, complete, fills);
docs/15 the NEAR_DEPTH band and the P2/P3 tracker rows.
…/prologue

# Conflicts:
#	docs/15-PROLOGUE-SLICE.md
…e/prologue

# Conflicts:
#	docs/15-PROLOGUE-SLICE.md
The near grass strip and its under-fills were painted along the walk lines from before the terrain rework (#173), which moved several of them (the hg-1-0 line by 30 px). depth_layers near and under ran again for all five chunks, then split_layers. export_stage --verify rebuilds every chunk exactly, using the layers worktree's newer rest plates.
@arudaev

arudaev commented Oct 24, 2026

Copy link
Copy Markdown
Member Author

Wave 2: Alexander's playtest fixes, all merged into slice/prologue (docs/15 "Wave 2", tracker P1–P8):

# PR Fix
P1 #173 Typed terrain. Steps (≤ 16 px) step up; ledges are faces you jump; walls and logs stop you; planks and stairs are flat treads; water is never floor and respawns you. The garden collision is re-authored chunk by chunk.
P2, P3 #174 + 6adf191 Every plate is complete, in hot-dog bands. The near grass strip (depth 120) draws over the hero. It was repainted along the new terrain lines and now covers his feet on 46–68 % of the trail; the rest is paving, planks and stones.
P4 #171 Dexter leads at your pace and can't be overtaken. You start in the gate.
P5, P7, P8 #175 Region 1. You land on the creek path, not the rail bridge. Jenny's ram is one event from the front. The chair has a pickup moment and a J/X glyph. There are 4 more rovers, plus crab and drone controllers. Jenny gets knockback, a rev tell, a glowing open back, hit feedback and hazard parts.
P6 #172 Hero motion. The creek fidget was the deck seams (24 → 5 off-cycle frames per step). Jumps stay crisp under button spam. Idles breathe and the poncho sways with the wind.
#158 84cf740 scripts/assets.py status · check · next: the inventory checked against the repo.

Checks on slice/prologue (6adf191): typecheck passes, 268 game tests pass, the build passes, 110 script tests pass, check_docs passes, collision_check reports 0 problems, and export_stage --verify rebuilds every chunk exactly.

Replayed with the game stepped by hand:

  • the garden from the gate to the pond finale, with Dexter's smallest lead 74 px and 0 overtakes
  • the creek landing on the path at y 566, then Jenny's ram, then the crash window

Known and still open:

@arudaev
arudaev marked this pull request as ready for review October 24, 2026 04:48
rc-0-0's 557 deck stopped 2 px short of the 515 deck, so a running hero fell into the water and reset; it now meets the 42 px face, which he jumps. rc-2-0's 572 floor left a 5 px gap and a 17 px rise, 1 px over the step-up; it now meets the 555 floor as a 16 px step. hg-3-0's first stone starts 8 px earlier, inside its painted edge, so a jump off the rubble at a full run reaches it.
depth_layers near now matches the strip's hue to the chunk's own art under it (match_hue) and pulls pink-magenta plants 70 % of the way to red; the garden has no pink. The five strips were recoloured from their saved paintings (--reuse, no new image calls). The 300-330 degree share fell to under 2 %, and export_stage --verify rebuilds every chunk exactly.
depth_layers and collision_check import numpy, so the art-pipeline job failed on the runner.
The hero has no carrying frames, so after the pick-up the chair vanished until the first swing. The drawn chair-pickup frame now rides behind the hero (seat behind the backpack, legs over the shoulder), follows his facing, and hides while a chair pose or the pick-up holds it in his hands.
@arudaev
arudaev merged commit 1594081 into main Oct 24, 2026
9 of 10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:art Sprite sheets, stage plates, direction pack area:combat Chair, guard, health, damage, save points, pickups area:docs Design docs, README, contributor guides area:enemies Autonomous robots and Jenny area:pipeline Rerunnable art and export scripts area:player Hero movement, animation state, camera area:stage Chunks, layers, collision, clean/anomaly states area:story Prologue, Dexter, crossings, ending area:ui HUD, crash window, title, menus

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[M3-S3] Follow Dexter through the Hidden Garden to the pond

1 participant