Files
security-game/TODO.md
T
zwitschi bb40a98537
Full build / Full desktop build + optional release (push) Successful in 4m2s
Full build / Import + headless tests (push) Successful in 31s
Give street props colliders, zoned placements and variants
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.
2026-11-01 10:16:53 +01:00

5.4 KiB

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.