Props were decoration: the guard and guests walked straight through benches, bins, bollards and planters. They now block movement and steer guests around. Collision - _add_prop_model() fits a StaticBody3D from the model's mesh bounds in holder-local space: a cylinder for bollard/bin/hydrant, a box otherwise, so placement rotation and variant scale carry over. - Fallback primitives go through the same fit, so a missing .glb cannot silently remove collision. - Each prop also publishes a NavigationObstacle3D; NpcAvatar enables agent avoidance and moves with the safe velocity from velocity_computed. The navmesh stays a flat walkable plane and avoidance does the steering. Placement - PROP_PLACEMENTS groups furniture by entrance, mid-block and curb zones, with a static placement_problems() validator for bounds, overlap/min-spacing, duplicates, and the door/steps/guest-lane exclusions. - variant_for(index) gives deterministic yaw jitter, subtle scale, and optional clutter (bag by the bin, crate by the newspaper boxes, cone by the hydrant). Verification - New windowed smoke_props.gd: guard walks into a bench and stops; a guest headed beyond the bench routes around it and never enters the collider. - Headless 182 -> 187: placement validation and its failure modes, variant determinism/range, collider + obstacle on every placed prop, fallback collider. - Other smokes (PLAN verbs, crowd, emergency, timeline) still pass; Python tooling 53/53; screenshots recaptured; compare 9 good / 0 bad. - Version 0.4.0. TODO: collision/placement section moved to DONE; prop pipeline checks remain.
95 lines
5.4 KiB
Markdown
95 lines
5.4 KiB
Markdown
# TODO
|
|
|
|
Godot 4.3 prototype. Latest release **v0.4.0** (prop collision, placement, variants). Headless
|
|
suite **187/187** plus **53** Python tooling tests; the session, PLAN-verb, crowd, emergency,
|
|
timeline, audio, scenario-content, props, and windowed focus/radial smokes pass. Anonymous
|
|
downloads are enabled on the host.
|
|
|
|
The sections below are the rest of the presentation pass: prop pipeline checks, NPC characters,
|
|
and player movement. Each task is meant to be a small, reviewable slice with its own verification.
|
|
|
|
## Better Props
|
|
|
|
### 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).
|
|
- [ ] 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
|
|
`assets/models/generated/<prop>.glb` contract.
|