The Darkroom暗 房

A faceless silhouette girl walks one roll of eleven film frames, developing the world into existence with light that both reveals and destroys — until the blank final frame turns the camera on herself.

Unity · URP 2D Puzzle-Platformer Procedural Cinematic Monochrome 2026
010203 040506 070809 1011

The Darkroom is a single roll of film being developed — and you are the latent image inside it. You do not traverse the world so much as develop it: your only verb is changing exposure, and every exposure is both a chemical and a moral fact.

《暗房》是一卷正在显影的胶片,而你,是其中潜伏的影像。你并非穿越世界,而是将它显影—— 你唯一的动作是改变曝光,而每一次曝光,既是化学事实,也是道德抉择。

Margin note · f/ that-has-been "The image is already there, in the silver, before it can be seen."
Part I

The Game

Where it came from, what it is, and how to play it.

Inspiration

The game grows from one true thing: developing photographs in a darkroom. Under the safelight, an image only exists where light has touched the paper. Before the developer ever reaches it, the picture is already there — present, real, invisible, latent in the silver. That single chemical fact is the whole game's seed.

From it grows a feeling I kept returning to: the fragile trust that what you stand on only exists while it is lit. Caution first, then mastery. The darkroom's two great traditions sit underneath everything — photography as memory and mortality (the dread that the unphotographed is lost), and the inversion of light's moral value (the insistence that darkness shelters and over-illumination destroys).

The same wavelength that keeps a print safe is the one that, turned to full, destroys it.

Concept

You play a faceless silhouette girl with two glowing eyes — no face, no name, no dialogue. The core verb is changing exposure across three states, and the world re-develops around you with each switch:

  • Underexposed — a cold-blue safelight nocturne, the game's most beautiful register. Hidden dark-paths print into glowing footing; the shadow-shades sleep as harmless stone.
  • Normal — a clear, readable mid-gray. Nothing special is solid. The resting breath between shelter and exposure.
  • Overexposed — blown warm-white. It burns through paper, makes bright bridges solid, trips sensors — and wakes the shades into safelight-red, lethal recognition.

Across eleven frames you learn the darkroom's three irreversible commitments — you burn through white walls, you print a latent ghost-slab into permanent footing, you draw a long exposure into a fixed bridge. Each is a fixer-click that cannot be undone. The shades are your own shadow-self; late on the roll, one cradles a photograph you captured — longing, not malice. The roll erodes as it advances, until the eleventh frame, marked unexposed, asks you to climb a stairway of your own fixed strokes into the blank and take a self-portrait: the only frame with you in it.

Play the Game

Play the WebGL build below (desktop). A/D move · Space jump · 1/2/3 exposure · hold Shift to draw light. Click the frame first so it takes keyboard focus; sound starts after your first click.

在下方直接游玩 WebGL 版本(桌面端)。A/D 移动 · 空格跳 · 1/2/3 切曝光 · 按住 Shift 画光。先点一下画面获取键盘焦点;首次点击后才有声音。

Meanwhile — try the verb below The core mechanic is playable on this page: in Core Mechanics, switch the exposure and watch the same frame re-develop.
Part II

Designs

The life experience, the emotion it protects, the mechanics that carry it, and the structure that runs it.

Life Experience

Standing in a real darkroom, you learn to trust the dark. The safelight is the one color the paper is blind to — the only light that does not expose or destroy. You work by it, slide the print into the developer, and watch an image you cannot yet see rise out of nothing.

That moment — a picture surfacing from blank paper — is the experience the whole game translates. Not nostalgia for film, but the specific feeling of latency: that what matters is already present before it is visible, and that bringing it into the light is an act of care that can just as easily burn it away.

Core Emotion

The fragile trust that what you stand on only exists while it is lit. Caution first, then mastery. Early, the dark is a shelter you learn to rely on; later, it is a medium you command. Underexposure is tuned toward intimacy and shelter so that the Overexposed reversal — the same red that meant "safe to be seen" now meaning "threat now visible" — lands as a moral shock, not a difficulty spike.

Theme Light reveals AND destroys in the same gesture. Under shelters; Over burns and wakes the shades. Commitment is irreversible — there is no undo.

Core Mechanics

One light, three states. The same scene is solid, passable, or lethal depending on how you expose it. Switch the exposure below and watch the frame re-develop — footing appears, the shade wakes, the safelight burns.

Beyond switching, you also draw long-exposure light-strokes as terrain — and three commit-verbs make a change permanent. Each resolves on a stop/fix click, so you hear irreversibility:

Burn

Hold Over against a white wall until it burns through. Clear sight opens the way — and wakes the shades' eyes as you do.

⊗ Fixed · no undo

Print

Flash Over beside a faint latent slab and it develops solid forever. Developing = committing; what you develop, stays.

⊗ Fixed · no undo

Draw

Hold the shutter to draw a long-exposure stroke; it sets the instant you release. A three-stroke budget ratchets the oldest away, like film.

⊗ Fixed · no undo

Later frames add a genuine second puzzle axis: light becomes a substance you place. A wall too tall to jump carries a light-meter with no ground beside it — so the rising bright stroke you draw is at once the ladder you climb and the key that trips the meter. There is nowhere to scribble a shortcut; one stroke must do both, and the door it opens is permanent. The drawn light is solid footing and delivered illumination in a single gesture.

The roll resets · nothing carries over Crossing into a new frame snaps the exposure silently back to Normal — a fresh sheet of paper for each beat. What you committed stays behind you; what you were holding does not. The mechanic is the theme: the roll is consumed as it passes.

Graph & Data Structure

The entire game is generated at runtime from plain-data tables — no scene wiring. The geometry, sound and light are procedural; illustrated backdrops and full-screen shader passes layer on top without touching the build. The static root is an array of eleven room definitions; at boot a single entry point spawns the managers and walks the tables to build the world, and from then on everything talks through C# events and singleton registries.

LevelDataRoomDef[11] — value-type def arrays (boxes, enemies, sensors, doors, pickups, mechanics)
BootstrapRuntimeInitialize entry — spawns every manager, HUD, camera & player
LevelBuilderTwo passes: instantiate under one root, then resolve sensor→door ids
Self-registering objectsEach piece subscribes to exposure & light events
ExposureManager — owns the single Exposure state + the solidity matrix over a registry of ExposureObjects; fires OnExposureChanged.
ExposureObject — per-object; applies the static solidity/alpha matrix on every switch (collider toggles, alpha lerps).
TrailSystem — draws light-strokes at the feet and manages a fixed 3-stroke budget (LineRenderer + EdgeCollider2D).
LightField — a parallel emitter registry; sensors & umbral barriers probe SampleAt() with linear falloff each FixedUpdate.
AudioDirector — fully procedural synthesizer: every SFX, hum/hiss bed, mood drone and the developing leitmotif.
VisualFactory — shared procedural sprite / material / palette / sorting-order provider.
PostFXDirector — drives the per-exposure grade and the full-screen pass (solarization, halation, grain).
BackdropTint — re-tints the void, backdrop and parallax bands per exposure; fades dark layers out in Over.

The heart is a solidity matrix — a pure function of (object type, exposure). It alone decides what is footing and what is air:

Object typeUnderNormalOver
Static groundsolidsolidsolid
Dark-path / dark strokesolidghost / gonegone
Bright stroke / light bridgegoneghostsolid
Umbral barrier (curtain)solidsolidpassable

Nothing in the matrix is itself lethal — death is separate (a fall, or a light-woken shade). A shutter-jam rule refuses any switch that would develop a solid object inside you, flashing the offending piece amber. Commitment, not collision, is the danger.

Other Design Pillars

No Undo

Burn, print, and fix are permanent by design. The roll is consumed as it passes — earlier frames never persist or backtrack.

Teach, then Test

Every verb gets one consequence-free rehearsal before its lethal use. Affordance is read by color alone — no tutorial text.

Wordless

All narration is past-tense "that-has-been" margin notes and EXIF captions. No dialogue, no collectibles, no HUD clutter.

Part III

The Game World

A developed photograph you can walk through — built from a pedigree of light, sound, space, and shadow.

A row of enlargers along a darkroom bench, lit by a single safelight
The dry side — a row of enlargers, modelled on one concealed key light (Caravaggio's tenebrism)

Visual Design

Every frame should read as a developed photograph, not a generic dark platformer. The throughline is the single concealed light source — from Caravaggio's tenebrism to La Tour's candle — picking out only what matters and letting the rest fall to near-black. The shipped palette is locked, and every gesture honors it:

Void#0D0D0F
Neutral ground#6E6E6E
Cold safelight · Under#3A4A8C→#9FD8E6
Warm cream · Over#FFF3D6
Safelight red#8B1A1A · the only color

Characters are flat cut-paper silhouettes (Lotte Reiniger) read entirely by contour. The exposure-switch is sold as a solarizing tonal reversal with Mackie-line edge-glows, not a brightness fade; a shade's lethal wake is a red-orange halation bloom (the physics of CineStill film), never pure white. The contact-sheet HUD and win-screen are built from the real artifact — sprocket margins, engraved frame numbers, grease-pencil X-outs — with the eleventh frame kept blank until the self-portrait develops in Rembrandt golden key.

Three worlds, one light

Each exposure now reads as its own world, not a brightness slider. The void itself re-tints, the backdrop shifts, and a shared full-screen post pass grades the whole frame — so switching feels like stepping between rooms the way Under always did.

Underexposedcold-blue safelight · shelter
Normalneutral near-black · the resting breath
Overexposedwarm golden print · the burn of clear sight

The cinematic layer

The self-imposed "code-only, zero-asset" rule was relaxed for one purpose — beauty that serves the locked aesthetic. Everything below is built, sharing one URP full-screen pass so the gameplay plane stays razor-crisp:

Switch · §2 Sabattier

Solarization flick

Every exposure switch folds the tones with a Mackie-line edge-glow — the core verb made chemistry, not a fade.

Highlights · CineStill

Red-biased halation

An authored emulsion grain plus a halation bloom that reddens only in Over — the reserved red, kept reserved.

Over · the warm pole

Golden-print world

Over holds its tones as a warm sepia print rather than blowing to flat white; the dark midground hangings fade away so the frame stays harmonious.

Atmosphere · FBM

Volumetric light & fog

Each lamp casts a procedural god-ray cone with dust settling inside it, over a fractal-noise fog that gathers and disperses — light made volumetric.

Depth · five bands

2.5D parallax

Far scenes, a near band, hanging clutter, the lamps, and an out-of-focus foreground scroll at five distinct speeds — sparse silhouette figures work, deep behind the play space.

Character · code rig

The girl, alive

A spring-damped split rig: the skirt hem trails back and the body leans into a walk; the skirt and hair swing on every jump and landing.

Developing trays on the wet bench under a red safelight
The wet side — tray-shaped develop pools stage the irreversible commits
A quiet darkroom corner lit only by a single red safelight
Underexposed intimacy — a girl alone with one small light (La Tour)

Audio Design

Sound is the second body of the latent image — it makes the room audible before any picture resolves. The mix splits along the fiction: diegetic darkroom foley (cold, physical, irreversible) against a non-diegetic bed of one fragile leitmotif that develops across the eleven frames. The whole soundscape is synthesized in code.

That bed is now built and growing: a five-note phrase that arrives one note at a time as the roll advances — a lone struck bell in frame one, the full phrase only near the self-portrait. The three exposures are the master submix, with the predatory shade-layer gated to Over alone so the silence in Under is what sells "sleeping stone." Every world-mechanic that used to be silent now speaks — the burn sizzles through, the lifts hum as they ride, the umbral recoils and reseals, a fix-platform prints warm — and an optional loaded melody can ride over the procedural ambience from frame one.

Motif amplitude · frame 1 → 11

One fragile theme, stated bare in frame 1, re-developed across the roll, fullest only at the self-portrait (Gris / Journey).

Loops drift out of phase

A few held tones per room at coprime lengths — "as ignorable as it is interesting" — never repeating identically (Eno).

Bed erodes → one resolved tone

Tape-hiss rises and highs thin across the roll (Basinski's decay); the self-portrait resolves on a single clean tone.

Shutter + ratchet · the signature

Shutter-snap (frame taken) + film-advance ratchet (frame locked, no going back) is the game's two-part signature; predatory shade-music is gated to Over only.

Space Design

The space does what a darkroom literally does: takes you from total blindness, through a controlled threshold, into a place where latent images become permanent. The level reads as a film roll unspooling strictly left-to-right — one frame per room — with the vertical axis meaning "developing upward into the print": latent elements sit low and submerged, and every commit lifts the girl higher. A drying line of ten printed frames and one blank glows across the whole parallax backdrop from frame one — the table of contents, and a constant beacon.

Separation

The Unprinted Frame

A darkroom prologue: the eleventh frame is blank, so she lowers the room to safelight and a path develops on the empty paper — then she steps into the unfinished photograph.

Liminal

Eleven Frames

The "no longer / not yet." Each room is one film frame — sprockets, an engraved number, a hard border the camera never crosses — consumed as it passes.

Incorporation

The Final Print

A Gris-style ascent built from her own fixed strokes, climbing the blank eleventh frame into the self-portrait — which prints back into that same once-blank slot.

Now built · the bookend The prologue's enter-photo cinematic is the literal inverse of the finale — the same kit run backwards. She walks into the blank frame at the start; at the end the self-portrait develops into that exact slot. The opening question and the closing answer are one image.
A wall of prints hanging on a drying line under a single safelight
The drying line — ten printed frames and one blank, the roll's contents page and its constant beacon

Cultural Layers

The bedrock is the real chemistry and ritual of analog photography, read through the philosophy of light and shadow — pedigree for every gesture. None of it is quoted on screen; each reference is metabolized into a mechanic.

Photographic science · technique
The Latent Image

An exposed photograph already exists, invisibly, in the silver. The literal science the whole game is a metaphor for — the girl is the picture already present in the blank frame.

Roland Barthes · 1980 · essay
Camera Lucida

The punctum and "that-has-been." The self-portrait certifies she was always there; the wound surfaces last — her glowing eyes — not a triumphant reveal.

Susan Sontag · 1977 · essay
On Photography

"All photographs are memento mori." Justifies "nothing carries over" — when a shade cradles your photo, it cradles a small death.

Jun'ichirō Tanizaki · 1933 · essay
In Praise of Shadows

The charter for making Underexposed the most beautiful state — beauty as a condition of darkness, never the scariest register.

Carl Jung · c. 1938 · psychology
The Shadow Archetype

The shades are the girl's own un-integrated self — stone at rest, lethal when her light over-reaches. The arc to the self-portrait is shadow-integration.

Francesca Woodman · 1972–81 · photograph
Long-Exposure Self-Portraits

The direct ancestor of the draw-a-stroke verb and the faceless girl — a body blurring and smearing into the room, present and vanishing at once.

Caravaggio · 1599 · painting
Tenebrism

The under/over mechanic as a painting: one unseen raking light spotlights exactly the footing it wants solid and abandons the rest to black. Never show the source.

Plato · c. 375 BCE · philosophy
Allegory of the Cave — Inverted

The blinding ascent toward light, turned over: here shadow is the true, safe ground and full light is what blinds and kills. Invisible scaffolding only.

Narrative Design — The Eleven Frames

Each room is a persona the faceless girl tries on — a contact sheet of selves. Only the last stops performing. The story beat and the mechanic are the same act:

#TitleVerbBeat
01The Unprinted FramemoveSeparation rite. She walks the dark, lit only by her eyes. Darkness doesn't hide the way — it prints it.
02The Long Exposurewalk a trailThe dark keeps a promise she can't yet make. Pure wonder before agency — the draw verb is withheld.
03The White WallburnFirst irreversible commitment. She holds Over until paper burns through — and the shades' eyes wake as she does.
04The Latent ImageprintThe metaphysics made literal. A faint slab flashes solid forever. Developing = committing; what you develop, stays.
05Contact SheetriseThe roll's grammar clicks. She ascends toward the print — frames read upward — on light she's given but doesn't yet author.
06First StrokedrawShe becomes an author. The hand that develops the world is now hers; the watcher waits after the stroke.
07Sensor Testdeliver lightSeeing becomes the verb. One drawn stroke is both the ladder she climbs and the key that trips the meter.
08Still Lifefreeze a shadeFirst reconciliation with the shadow-self. She climbs onto her own frozen shadow — a foundation, not a thing to flee.
09Negative Transferswitch carefullyBetrayal felt in the hands. Switch on a bridge and it vanishes. A shade cradles a photo she captured — longing, not malice.
10The Droptrust-fallThe light prints no way down. She commits to a blind drop and a shadow rises to catch her. The floor was a photograph.
11The Final Printself-portraitIncorporation and recognition. She climbs a stairway of her own fixed strokes into the blank and takes the only frame with her in it.

She was always latent in the blank frame. Nothing carries over.

Develop the Final Frame

The ending is a developing, never a twist. The eleventh frame is visible from frame one; the self-portrait is its latency surfacing. Press develop and watch her rise from the silver — her glowing eyes last of all, on warm Rembrandt-gold.

Frame 11 · The Final Print · develop the latent self
Part IV

Development

Selected highlights from the Agent-Development-Log — building the whole game with Claude Code.

Over roughly three weeks and 123 logged interactions, the game was built almost entirely through Claude Code. The arc moves from a zero-scene, runtime-generated codebase audited against its own spec, through procedural audio, real URP 2D lighting, a fourteen-feature narrative milestone, an entirely new "light as a substance" axis, a playable prologue, a full cinematic glow-up — solarization passes, volumetric fog, a developing leitmotif — and a long tail of polish. Throughout, the collaboration stayed honest and disciplined — multi-agent adversarial reviews on its own diffs, player-reported flaws verified with jump-physics math, and a three-tier verification pipeline kept green at every step.

123
Logged interactions
11
Frames · one roll
62
Runtime C# scripts
5
ShaderLab / HLSL passes

Selected Highlights

Milestone 1 · Core systems

Zero-scene runtime generation, audited by 14 agents

The entire game was implemented runtime-generated with no scene wiring — one Bootstrap entry point builds every manager, the camera, HUD, level and player (23 C# scripts) — then a 14-agent specification audit was run on its own first-pass code.

Outcome: the audit found 9 real issues including 2 majors (the jam rule false-positived on ground strokes; a still player's sleeping Rigidbody silently broke a sensor), all fixed before the first commit.

Milestone 1 · Playtest debugging

The agent's own walkthrough was wrong — and the math proved it

Following the agent's Room 3 guide still left a block unreachable. It ran the jump-physics, confirmed the student was right and its own advice wrong, fixed the code, and rewrote the technique to "draw an arch through the apex, not a point at it."

Outcome: set a recurring pattern — player-reported design flaws verified against real physics constants rather than guessed at.

Milestone 4 · Stretch goals

A whole game's audio from hand-written waveforms

The entire soundscape was synthesized procedurally — shutter click, a seamless 55 Hz Under hum, an Over hiss, jam thud, pickup chime, win shutter, stroke sparkles and film grain — keeping the strict zero-external-assets rule.

Outcome: a fully voiced game with no audio files; later grown into ~14 scene SFX, per-room drones, and a subliminal 82 Hz pedal throb.

Milestone 7 · Premium pass

Making light the literal medium with real URP 2D lighting

Fake darkness was replaced with real URP 2D lighting: a global light driven by exposure state, a lit/unlit material split so things that ARE light render unlit, and ~20 point lights placed where light belongs — the pen tip, the dark paths, the player's own faint lamp so Under is never fully blind.

Outcome: the darkroom metaphor became mechanically real; an API deprecation was caught by the offline compile and fixed pre-commit.

Milestone 10 · Narrative imaging

The 14-feature narrative milestone, reviewed by 22 agents

Asked for design thinking, not a change list, a 7-agent design workflow landed the spine — "the run is one eleven-frame roll, frame 11 a self-portrait" — then all 14 items shipped (delayed title drop, a Room 9 corridor blackout, a PhotoAlbum that photographs the player's own run, a staged finale), under a 22-agent adversarial review.

Outcome: 7 real bugs confirmed and fixed pre-commit (incl. a blocker where any death disarmed the blackout); 13 seductive ideas explicitly rejected with reasons recorded.

Milestone 11 · Light as a mechanic

Light becomes a substance you place

An adversarial feasibility agent flagged that reading URP lights per-frame was unaffordable and that a re-solidifying barrier inverts the jam-check invariant. Three reusable systems were built instead — a static LightField emitter registry, a light-meter sensor mode, and a guarded UmbralBarrier.

Outcome: a genuine second puzzle axis where a drawn stroke is simultaneously the ladder and the key — soft-lock-proof by construction.

Milestone 11 · Prototyping

A blind-safe "mechanic lab" for un-playtestable work

With the editor held open and no reliable playtest, five new components (burn, dark trail, light bridge, fix platform, rise lift) were built alongside a dev-only five-station sandbox behind a single const and a warp key.

Outcome: every mechanic was testable in isolation and 100% removable from the graded build; winners were promoted into real rooms one at a time.

Milestone 12 · OVER re-implementation

The stale-assembly mystery: ⌘R before ⌘P

Rounds of OVER edits had no on-screen effect. A diagnostic showing zero console logs revealed Unity was running a stale assembly (Auto Refresh off). Forcing Assets→Refresh before Play made every edit live, and OVER was re-built as graded overexposure — split-toning + highlight halation, not a light flood.

Outcome: resolved an entire struggle's root cause and saved it as a persistent memory.

Milestone 13 · Environment uplift

An AI-art pipeline that slots in without touching code

An out-of-Assets pipeline was stood up — an art-direction doc with the locked palette, a prompt pack, and a prioritized authored→photo→procedural loader. When the student returned 13 generations, a script feathered the backdrops and chroma-keyed the props' gray field, with idempotent re-runs.

Outcome: AI PNGs drop into StreamingAssets and auto-load live with no code changes — including the very backdrops shown on this page.

Milestone 13 · Platform lit-lip

Adversarial review catches bugs the agent just introduced

After implementing a darker platform face with a defined lit edge, a 13-agent review of its own change confirmed two real self-introduced bugs: the lip stayed full-bright in Under (violating the spec), and an edge sprite rendered as a central streak.

Outcome: both fixed via an exposure-gated component and a corrected sprite; pre-existing low-severity findings correctly deferred.

Milestone 14 · Onboarding pacing

Re-sequencing the teaching arc, proven un-skippable by physics

The first three minutes dumped seven mechanics. The light-trail arc was re-sequenced by moving pickups (see → draw simple → draw complex). When the new draw-room was just jumpable, the jump apex was derived (≈ 2.49 units) and the room rebuilt +3.0 above it — provably un-jumpable.

Outcome: the first-draw lesson became unavoidable; a one-prompt-at-a-time HUD guard stopped teaching text from stacking.

Milestone 15 · Second puzzle axis

"The stroke is the ladder AND the key"

A 9-agent design review diagnosed the real problem: the game had one puzzle axis and three fully-built systems sitting stranded. The student rejected the first fix as "随意" (arbitrary) — opening a door with any old stroke. The redesign: a light-meter on a wall too tall to jump, with no ground beside it, so the rising bright stroke is at once the only way up and the only way to feed the meter.

Outcome: a genuine second axis, soft-lock-proof by construction (lux math: ~0.55 from a climb-stroke vs a 0.4 threshold, glow-alone peaks 0.35) — no "scribble at the door" shortcut exists.

Milestone 16–17 · Prologue

How does she enter the world? — "The Unprinted Frame"

The first switch had no motivation. From the student's written spec, the opening was rebuilt in place: she comes to develop an old roll whose eleventh frame is blank, lowers the room to safelight, watches a path develop on the empty paper, and steps into the unfinished photograph — an enter-photo cinematic cloned from the finale and run in reverse. A feasibility audit proved the hard-coded "11" was load-bearing across five systems, so the room was rebuilt and renumbered by display only.

Outcome: a motivated first minute (slider reads SAFELIGHT / WORK LIGHT / ENLARGER FLASH) and a true narrative bookend — the blank door at the start, answered by the self-portrait printing into that same slot.

Milestone 18 · Sound as scene

Every silent mechanic given a voice

A 3-agent audio audit found the signature world-mechanics were silent — burning paper, the lifts, the umbral, the fix-platforms, the guard. All were given procedural foley (a swelling burn sizzle, a pitched lift bed, umbral recoil/reseal, a warm fix-print, a guard wake-and-freeze), plus per-room mood drones at coprime frequencies, and the checkpoint reskinned to the film-advance ratchet. A loaded melody loader was added on top of the procedural bed.

Outcome: edge-driven request beds avoid the no-physics-step gutter; proximity-gated wakes mean one global switch no longer makes every enemy in the level shout.

Milestone 19 · Activate the built

Rescuing three stranded mechanics inside the eleven frames

A 5-lens → adversarial → synthesis workflow (29 proposals, 23 survivors) found the game mechanically rich but pedagogically lopsided. Rather than add rooms, the fix activated what already existed: the FixPlatform got its debut frame ("THE LATENT IMAGE"), the umbral was taught before the finale, and game-feel quick wins (accel ramp, variable jump, fall-scaled landing squash) landed — all with jump-physics held byte-stable. The R9 corridor shade now cradles one of the player's own captured frames.

Outcome: no no-op plumbing — every system earns a frame; five seductive ideas (mid-air lift handoffs, twitch-timed umbral gates) explicitly rejected with reasons recorded.

Milestone 20 · Narrative documentation

A research-grounded story-concept doc, fact-checked

Grounded first by reading the narrative-bearing code, an 8-agent workflow (~341k tokens) ran six parallel web-research agents, a fact-check pass, and a synthesis — producing STORY_CONCEPT.md, which ties every choice to the shipped mechanics and the locked palette.

Outcome: 57 references collected with 3 fact-check corrections applied — the source this very page draws on.

Milestone 21 · OVER becomes a world

From "a slightly-warmer Normal" to the warm pole

The student's note: Over didn't feel like entering another world the way Under did. Several passes found and overturned the root cause — the foreground was barely touched and an earlier "graded, not flooded" choice had made Over read like Normal. It was re-pitched as a warm golden print that holds its tones (not a white blow-out that clips surfaces to flat boxes), with the void and backdrop re-tinting per exposure and the dark midground hangings fading out so the bright frame stays harmonious.

Outcome: a full cool → neutral → warm set of worlds; the reserved red honored throughout (halation reddens in Over only).

Milestone 22 · Depth & tooling

2.5D layering, and an editor that bakes back into data

Two never-built parallax bands specified in the art bible were finally added — a near scene band and an out-of-focus foreground — for five distinct scroll speeds, with sparse silhouette figures working deep behind the play space (faceless, white eye-glints only, fading out in Over). In parallel, an edit-mode scene-preview baker let elements be dragged in the Editor without entering Play and the tuned positions baked back into the level data — and a root-cause bug where leftover build roots leaked from the open scene into Play was fixed.

Outcome: real depth without touching the razor-sharp gameplay plane (backdrop is a separate root); a faster iteration loop with the data still the source of truth.

Milestone 23 · The glow-up

Lifting the zero-asset rule — for beauty that serves the aesthetic

The engineering constraint (code-only / no external assets) was dropped while the locked soul was kept. A 6-lens ideation pass (40 ideas) became a shared URP full-screen pass: Sabattier solarization on every switch, authored grain plus red-biased CineStill halation, procedural FBM fog that gathers and disperses, volumetric god-ray shafts with dust settling inside each lamp cone, and a developing five-note leitmotif that fills out across the eleven frames.

Outcome: a cinematic layer matched to the references, procedural where it counts; one black-screen render-graph pitfall diagnosed and routed around (built-in Full Screen Pass).

Milestone 24–25 · Player rig & the roll resets

Bringing the girl alive, and making "nothing carries over" mechanical

A pure-code split rig (no skeletal authoring) gave the silhouette spring-damped secondary motion — the skirt hem trails back and the body leans into a walk, skirt and hair swing on every jump and landing, with a hip stem so a swinging hem never reveals the backdrop. And a forward-only per-frame rule snaps the exposure silently back to Normal on entering each new frame — generalizing intent the R9 blackout and a checkpoint caption already carried ("nothing carries over").

Outcome: the theme made literal in the tool itself — each frame is a fresh sheet; what you committed stays, what you held does not.

On method Multi-agent adversarial reviews scaled with the work — a 14-agent spec audit on the first code, 22 agents on the narrative diff, 13 on a single platform edge. The agent re-architected rather than patched, and deferred risky un-playtestable work rather than shipping it blind.

Built With

  • Unity 6000.4 · URP 2D
  • C# (runtime-generated)
  • Procedural audio + developing leitmotif
  • URP 2D lighting · ShaderLab/HLSL
  • Full-screen post FX · Sabattier · halation · grain
  • Volumetric god-rays · FBM fog
  • AI-art environment pipeline
  • Claude Code