Plan the presentation pass: props, NPCs, movement
Full build / Import + headless tests (push) Successful in 2m12s
Full build / Full desktop build + optional release (push) Skipped

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.
This commit is contained in:
zwitschi committed 2026-11-01 10:05:04 +01:00
1 parent 3025ba1cef
commit a3e90accdd
2 files changed
+117 -5

No files matched your search

+5
View File
@@ -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 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 `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). 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` - **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 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 atlas, AI mockups for the new catalogue entries, image-to-mesh props). GUT was consciously not
+112 -5
View File
@@ -1,15 +1,122 @@
# TODO # TODO
Godot 4.3 prototype. Latest release **v0.3.2** (mockup set). Headless suite **182/182** plus Godot 4.3 prototype. Latest release **v0.3.3** (staged captures for the new screens). Headless
**53** Python tooling tests; the session, PLAN-verb, crowd, emergency, timeline, audio, scenario-content, and suite **182/182** plus **53** Python tooling tests; the session, PLAN-verb, crowd, emergency,
windowed focus/radial smokes pass. Anonymous downloads are enabled on the host. 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) ## Future ideas (optional, not scheduled)
- [ ] Live 3D body-camera replay (the timeline is text-only today). - [ ] 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. - [ ] Additional venues or seasonal events authored from the new `.tres` files.
- [ ] Real voice/dialogue audio (the crowd bed and radio crackle are procedural). - [ ] 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 - [ ] Swap the primitive prop builder for an image-to-mesh model API behind the same