- Responder outcomes now reach the shift review
(ShiftCoordinator.responder_outcomes), and the review screen names them.
- "evacuation" (emergency call, low danger, no weapon) actually clears the entrance:
the door is locked, every NPC flees and is marked as leaving, and a
security_failure reputation hit applies.
- An emergency call the situation did not justify (no weapon, danger <= 1) appends
an investigation note, records investigation_opened, and applies the existing
false_report hit. The review lists the investigations.
- Fix dispatch dying after the first shift: coordinator.setup() builds a new
RadioSystem, so the responder_arrived connection made in _ready was lost on every
venue switch/restart. _connect_radio() re-wires it beside _connect_crowd().
Tests/docs
- Headless suite 105 -> 113 (test_emergency_aftermath.gd), new smoke_emergency.gd
covering the investigation, evacuation aftermath, and review copy.
- README controls/status/smoke checklist, TODO section moved to DONE, MEMORY notes.
- Version 0.2.5.
NPC navigation (previously dead in the live game)
- Only assign NavigationAgent3D.target_position when it changes: re-assigning every
frame invalidated the path, so get_next_path_position() kept returning the current
point and avatars never moved.
- Follow the first path point that is closer to the destination than the avatars are.
Nav points sit on the navmesh plane (y=0) while bodies stand at y~0.5, so the old
3D distance test always looked "already there"; path[0] is also the old start point,
so a naive "far enough away" pick steered backwards and oscillated.
- Fix fsm.state -> fsm.current_state in the idle-lifetime check.
Crowd presentation
- Aggressive behavior, visible weapons, and responder arrivals make idle bystanders
stop and face the incident for 12 s; someone waiting at the entrance keeps focus.
- Panic (mood >= 0.75) walks people away from the door at 2.4 m/s, then they despawn.
- Wire reactions to EventBus.crowd_changed: CrowdSystem.apply_event() emits on the bus,
not on its own `changed` signal (the first wiring received nothing).
- Measured a 16-NPC entrance at ~1.2 ms/frame (824 fps, vsync off), so no LOD/culling.
World and HUD
- Skyline is now a ring of four alpha-scissored planes at 200 m instead of a single
plane; PlaneMesh defaults to horizontal, which is why the backdrop rendered as a band
overhead. Larger ground plane, mipmapped texture, scissor threshold 0.5 (0.3 left
mip dashes in the sky), lifted albedo so the city is not pure black.
- Flashlight aims straight ahead and lights the person/door instead of the ground.
- Shorter HUD controls line so it stops overlapping itself.
Tests, tooling, docs
- Headless suite 98 -> 105 (new test_crowd_presentation.gd, 7 tests).
- New smoke_crowd.gd: rubbernecking, panic, and flee-target sanity.
- capture_screenshots.gd starts a shift from the venue menu and stages the night set
properly; all six README screenshots regenerated.
- README, TODO/DONE (crowd section moved), MEMORY updated. Version 0.2.4.
Verbs (PLAN levels 1-3)
- Eye contact: own Level 1 radial slice, logged as "eye contact".
- Recognition is a player decision: "Recognize" sets NPCController.player_recognized,
writes access evidence, and GameManager only then appends a RECOGNITION artifact.
It is no longer implied by NPC type.
- Body camera: real flag (off by default) driving the REC overlay; B toggles it and
a formal warning arms it automatically, writing a body_camera incident event.
- Blocking stations the guard 0.9 m from the person toward the entrance and turns
to face them, instead of only emitting the escalation level.
- Request reason: Level 3 ask answered from the NPC's seeded dialogue_lines.
- Radial grows to 12 slices (174 px outer radius, centered labels).
Incident recording fix
- IncidentRecorder.start_incident() was never called, so add_event /
add_access_evidence / add_escalation silently no-opped and the shift review
always reported zero incidents. Incidents now open on focus (guarded by
has_open_incident), verbs call _ensure_incident, and ShiftCoordinator closes
leftovers as "unresolved" before building the review.
Copy and docs
- 9 new string keys (eye contact, body camera, recognition, reason, station).
- README controls, 26-step smoke checklist, test count, status lists.
- TODO section moved to DONE; MEMORY records the verb design and the recorder bug.
Verification: headless 98/98, smoke_plan_verbs.gd + smoke_session_shell.gd +
windowed smoke_focus_radial.gd all pass. Version bumped to 0.2.3.
- Venue-correct access artifacts (AccessLoadout) and screened-aware verify
- Cone focus on NPC heads with billboarded ring + display name (ADR-0008)
- Action wheel with de-escalation-first slices (ADR-0009); Esc/RMB cancel
- Procedural NPC face/hair/neck/shoes (ADR-0010); named input actions
- Fix GameManager parse error (radial typed as ActionRadial)
- Fix first-person camera height and guard spawning inside the building
- Move building volume back so the door/awning/marquee are visible
- Pull the event scheduler once per simulated second; cap live NPCs
- Regenerate README screenshots; update TODO/DONE/MEMORY/README; 77 tests
Adds src/test/smoke_focus_radial.gd for the windowed focus/radial smoke.
- Add a 'Verify Windows installer contents' step (7z l shows Step Line.exe +
uninstall.exe) so the TODO verification items are proven by CI output
- Rebuild 0.2.1 binaries (embedded PCK) and AppImage locally; smoke clean;
57/57 tests
- Phase-based lighting: sun direction/energy/color, ProceduralSkyMaterial
gradient, and ambient per shift phase (GameManager.PHASE_LIGHTING),
applied on phase transitions and shift start
- WorldBuilder: street lamp poles with emissive bulbs + OmniLights,
set_night_mode(), glowing STEP LINE marquee (Label3D + emissive bars),
crosswalk stripes, planters, low-poly street trees
- NPC avatars: per-seed height/brightness variation (deterministic LCG)
- Denser routine traffic probabilities
- capture_screenshots.gd: fast-forward to LATE phase and capture night set;
README gallery is now 2x3 day+night; docs/screenshots regenerated
- Version bumped to 0.2.0; build/ artifacts rebuilt; Linux binary smoke-tested
- New headless tests for phased lighting config and street dressing (56 total)
- Install Godot 4.3 export templates locally and fix macOS export
(enable rendering/textures/vram_compression/import_etc2_astc)
- Build Linux/Windows/macOS artifacts into build/ via tools/build_releases.sh;
Linux binary passes headless smoke test
- Add tools/publish_release.sh (creates Gitea release + uploads assets with a token)
- TODO: mark build/install steps done; publishing v0.1.0 + link verification
remain as the single action blocker (needs GITEA_TOKEN)