From a3e90accddf831b64a54bf9fc5532f2d30b98296 Mon Sep 17 00:00:00 2001 From: Zwitschi Date: Sun, 1 Nov 2026 10:05:04 +0100 Subject: [PATCH] Plan the presentation pass: props, NPCs, movement Replace the flat "future ideas" list with three scheduled sections and concrete, reviewable checkboxes (41 tasks): - Better Props: colliders for the generated models (they have none today), a placement table with variants, sign/bus-stop/shelter/street-lamp props, a close-range detail layer, pipeline audits, and a prop-gallery capture. - Better NPC Characters: articulated rig, layered outfits and accessories, face and hair variety, idle/conversation animation, door-queue staging, reaction readability, LOD tiers, and a re-measured NPC budget. - Better Player Movement: accel/decel split, step-up assist, head bob/FOV and a motion-sickness toggle, precision-walk feedback, surface footsteps, gamepad support, input remapping, and movement tests. Kept live 3D replay, extra venues, voice audio, and the image-to-mesh swap in Future ideas. Memory notes the grounding facts (props have no colliders, rigid NPC rig, single accel value). Docs-only: no version bump or release. --- MEMORY.md | 5 +++ TODO.md | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 117 insertions(+), 5 deletions(-) diff --git a/MEMORY.md b/MEMORY.md index 30fa39c..7fd03e3 100644 --- a/MEMORY.md +++ b/MEMORY.md @@ -46,6 +46,11 @@ Session memory for durable decisions, state, and gotchas. Keep concise, remove o until it alerts, then jump to 760 s after staging for night lighting. The timeline needs `recorder.close_all_open()`, because `to_dict()` only lists closed incidents. The escalation HUD mockup is third-person now; `judge` still classes it `review` (no diff). +- **Presentation pass planned (TODO):** three sections — props, NPC characters, player movement. + Grounding facts: generated props currently have **no colliders** (only ground/building/steps do), + prop placement is a fixed list in `_build_street_detail()`, the NPC rig is rigid capsules with a + whole-limb swing, and `guard_controller.gd` uses one `accel` value. Work through the sections in + order; each task should get its own windowed smoke or capture where it changes feel/looks. - **Backlog complete:** every planned TODO section is done and moved to `DONE.md`; `TODO.md` now only lists optional future ideas (live 3D replay, NPC LOD, more venues, real audio, prop atlas, AI mockups for the new catalogue entries, image-to-mesh props). GUT was consciously not diff --git a/TODO.md b/TODO.md index 3077b5a..a532c67 100644 --- a/TODO.md +++ b/TODO.md @@ -1,15 +1,122 @@ # TODO -Godot 4.3 prototype. Latest release **v0.3.2** (mockup set). Headless suite **182/182** plus -**53** Python tooling tests; the session, PLAN-verb, crowd, emergency, timeline, audio, scenario-content, and -windowed focus/radial smokes pass. Anonymous downloads are enabled on the host. +Godot 4.3 prototype. Latest release **v0.3.3** (staged captures for the new screens). Headless +suite **182/182** plus **53** Python tooling tests; the session, PLAN-verb, crowd, emergency, +timeline, audio, scenario-content, and windowed focus/radial smokes pass. Anonymous downloads are +enabled on the host. -All planned backlog sections are complete (see `DONE.md`). Optional future ideas live below. +The three sections below are the planned presentation pass: props, NPC characters, and player +movement. Each task is meant to be a small, reviewable slice with its own verification. + +## Better Props + +### Collision and placement + +- [ ] Give every generated prop a real collider. Add a simple box/cylinder collision shape to the + `.glb` (or emit a `physics` block per part that `WorldBuilder` turns into a + `StaticBody3D`), so benches, bins, planters, hydrants, and newspaper boxes cannot be walked + through. +- [ ] Add a windowed check that the guard and NPCs path around props instead of through them, and + that the fallback primitive props get the same colliders as the modelled ones. +- [ ] Replace the hard-coded prop positions in `_build_street_detail()` with a placement table + (zone, offset, rotation, variant) so clusters read as street furniture: entrance pair, + curb line, mid-block, wall side. Assert no overlaps with the door, steps, or spawn lane. +- [ ] Reuse one `PackedScene` per prop type but expose deterministic variants (rotation, scale, + optional accessory such as a chain, sign, or bag) so repeated props stop looking cloned. + +### New props and detail + +- [ ] Add street-sign props: parking sign, no-parking sign, one-way sign, and a small post + (text via the atlas, not a texture per sign). +- [ ] Add a bus-stop shelter with a bench, roof, and side panel; a bike rack; a mailbox; and a + phone booth or newspaper stand. +- [ ] Add a traffic signal (pole, arm, three lenses) and a street lamp variant that matches the + lamps placed by `WorldBuilder`. +- [ ] Add cafe/shop clutter: sandwich board, stacked crates, café table + two chairs, and a tied + trash-bag pile for the Joke Shop edge. +- [ ] Detail the existing six props: chamfered edges on boxes, rim rings on bollard and bin, + bolts on the hydrant, bench slats with gaps, visible soil plus foliage on the planter. +- [ ] Add a close-range detail layer: pack a subtle grunge/AO strip into the atlas (or a shared + detail normal) so props do not read as flat-coloured boxes at conversation distance. + +### Pipeline and checks + +- [ ] Extend `audit_glb()` with a triangle budget, degenerate-triangle test, `TEXCOORD_0` inside + the atlas, minimum-y ≈ 0, and a material-count check per prop. +- [ ] Add a `prop_gallery` capture to `capture_screenshots.gd` (each prop close-up on a plain + backdrop) and wire it to `screen_designs.py` so prop regressions show up in `compare`. +- [ ] Verify all prop instances share their imported material (no per-instance duplication) and + keep a documented triangle/vertex budget in the pipeline docstring. +- [ ] Update the README prop list and the `model_pipeline.py` catalogue docs when new props land. + +## Better NPC Characters + +### Appearance and rig + +- [ ] Replace the rigid capsule limbs with an articulated rig: shoulder, elbow, hip, and knee + joints, so a walk cycle can bend knees and swing arms instead of rotating whole capsules. +- [ ] Add layered clothing: jacket over shirt, hi-vis vest, security uniform, dress/skirt, and + coat, with deterministic per-profile colourways and material roles. +- [ ] Extend the accessory catalogue: bag, umbrella, phone, camera, clipboard, headphones, and a + coffee cup; attach them to the correct hand/back socket. +- [ ] Add face and hair variety: several hair silhouettes, beards, hats, eye/brow shapes, age and + height ranges, and a small set of face textures or decal planes so heads are not identical. +- [ ] Keep appearance deterministic per `(profile, seed)` and add a test that the same seed + produces the same outfit while different types stay recognisable. + +### Animation and staging + +- [ ] Add an idle layer: breathing, weight shift, occasional look-around, phone check, and + arms-crossed, blended with the current walk and reaction states. +- [ ] Add conversation gestures: facing the guard when addressed, talking hand movement, nodding, + backing away, and pointing, driven by the existing reaction/escalation events. +- [ ] Improve the walk cycle: stride length tied to speed, foot planting without sliding, and a + distinct hurry/flee gait that matches `FLEE_SPEED`. +- [ ] Stage a door queue: waiting offsets, one-at-a-time approach, no overlapping capsules, and a + step-aside after the admission decision. +- [ ] Make reactions readable at a distance with body language plus a short icon/label + (rubberneck, panic, calm, angry) so crowd state is legible without the debug panel. + +### Performance and budgets + +- [ ] Add three LOD tiers (full rig, simplified mesh, billboard) with distance hysteresis, and + disable shadows for far tiers; keep the switch deterministic and testable. +- [ ] Re-measure the live-NPC budget with the full rig at `MAX_LIVE_NPCS`, and add a perf smoke + that fails when frame time crosses the documented budget. +- [ ] Add tests for animation state transitions (idle → walk → react) and for queue spacing at + the door. + +## Better Player Movement + +### Feel and handling + +- [ ] Split acceleration and deceleration in `guard_controller.gd` (faster stop than start, no + ice-skating), then tune `move_speed` and `accel` against a windowed feel pass. +- [ ] Add step-up assist for kerbs and the entrance steps (about 0.3 m) and keep wall sliding + smooth so the guard does not stick on doorframes, railings, or prop colliders. +- [ ] Add subtle head bob tied to stride and speed, a small FOV change in precision walk, and a + landing dip; expose a motion-sickness toggle in settings with persistence. +- [ ] Give precision walk (Shift) visible feedback: a HUD state chip and an audio tick when it + engages, in addition to the slower speed. +- [ ] Add surface-aware footsteps (concrete, asphalt, stone steps) with stride-synced timing and + a distinct landing sound, reusing the procedural audio helpers. + +### Input and accessibility + +- [ ] Add gamepad support: move/look actions, radial and action bindings, deadzone and look + sensitivity, with prompts that follow the active device. +- [ ] Move the remaining hard-coded keys into `InputMap` actions and persist any remaps through + the settings panel (keyboard and gamepad). +- [ ] Add a mouse-sensitivity and invert-Y setting if missing, and test the values survive a + settings save/load round trip. +- [ ] Add movement tests: acceleration ramp, step-up height limit, precision-walk speed, wall + slide, and gamepad deadzone. +- [ ] Run one windowed movement smoke per change above (walk the full block, climb the steps, + strafe along the wall) and capture a short screenshot set for the compare tool. ## Future ideas (optional, not scheduled) - [ ] Live 3D body-camera replay (the timeline is text-only today). -- [ ] LOD/culling for NPCs if `MAX_LIVE_NPCS` grows past the measured 16-avatar budget. - [ ] Additional venues or seasonal events authored from the new `.tres` files. - [ ] Real voice/dialogue audio (the crowd bed and radio crackle are procedural). - [ ] Swap the primitive prop builder for an image-to-mesh model API behind the same