Build a **mobile-portrait DOOM-style first-person shooter** — raycast renderer, one small level, big atmosphere. Static web app, touch-first. The user: *"i don't need much here, but the walls, enemies, guns seem really hard, it never looks good. no need to build much depth, but would like to see."* So: SHALLOW SCOPE, MAXIMUM LOOK.

NAME IT YOURSELF — doom-adjacent energy (grimy industrial hell, derelict station, flooded bunker... your theme call).

## ⚠️ THE ART CHALLENGE — make a raycaster look GOOD:
This is where these clones always die: programmer walls, floating cardboard enemies, a gun that looks pasted on. Your weapons against that:

- **Walls**: generate 2-3 distinct 1024² wall PANELS with gpt-image-2 (rusted bulkhead, cable-run wall, demonic-grate...). DON'T ask for "seamless tileable" (it drifts — known weakness). Instead map ONE panel per wall block so seams land on block corners, like your per-block platform trick in Lumen Vale. Slight per-block brightness jitter sells variety.
- **Enemies**: billboard sprites, magenta chroma key, ONE front-facing pose per enemy (2 enemy types max + optionally 1 boss-ish heavy). Painted in a consistent gritty style constant. Scale by distance, bob slightly, hit-flash white.
- **Gun viewmodel**: 1024² chroma sprite of first-person hands + weapon at bottom-center, painted in the SAME lighting/style. Muzzle flash = procedural overlay + brief light boost on the scene. Gun kicks (translate+rotate) on fire, sways with movement (sine bob).
- **The real look-maker is the LIGHTING, which is yours, not gpt-image-2's**: distance fog (exponential falloff to near-black), column-height shading, floor/ceiling gradient (or simple texture-cast if cheap), flickering light zones, red damage vignette, muzzle-flash illumination. THIS is what separates "looks good" from cardboard — spend your effort here.
- Budget cap **$0.50 (≤12 generations, one-shot)**: 2-3 wall panels, 2 enemies (+1 heavy optional), 1 gun viewmodel, 1 skybox/backdrop strip, 1 door panel, maybe 1 pickup.

## GAMEPLAY (deliberately shallow):
- Raycast renderer (column DDA, canvas) — you know the drill. Portrait: view on top ~65%, controls below.
- One hand-authored small level (~24×24 grid): a few rooms + corridors, 6-10 enemies placed, ammo + medkit pickups, one locked door + keycard, exit pad = win screen.
- ONE gun (hitscan, satisfying), enemy AI: idle → alert on sight/sound → approach + melee or slow projectile. 3-4 HP each, player 100 HP.
- Touch: left virtual stick = move/strafe, drag right half = turn, tap FIRE button (also keyboard WASD + arrows/mouse on desktop).
- HUD: HP, ammo, keycard icon, doom-style bottom bar (a procedural face that grimaces as HP drops would be a delightful nod — optional).
- Web Audio: gunshot, enemy growls, door hiss, ambient drone hum.

## TECH:
- Vite + TS, single canvas + DOM touch controls, `base: './'`, portrait 390×844. TS strict.
- `window.__game` hook: { phase, hp, ammo, enemies, hasKey, teleport(x,y) }.
- Playwright e2e (portrait): title → start → renderer draws (canvas non-black) → move forward → shoot → enemy count drops. No console errors.

## SHIPPING DISCIPLINE (checkpoint culture — user may stop you anytime):
- ~turn 12: raycaster renders textured walls + movement, COMMIT green build
- ~turn 25: enemies + gun + combat, COMMIT
- ~turn 38: door/keycard/exit + lighting polish + audio, COMMIT
- Hard cap **45 turns**.

OUT OF SCOPE: multiple levels, weapon variety beyond 1 (2 max if cheap), strafe-running physics nuance, multiplayer, difficulty modes.

WHEN DONE: one-line summary with the name + theme you chose.
