CI / headless-tests (push) Successful in 55s
- Fix LATE shift phase (start 700s) so the violent-threat event is reachable - Add PROTESTER archetype (rules, profile, colors, events in public venues) - Add CALL_SOMEONE reaction (FSM -> ARGUING, influencer/trespasser/protester weights) - Door lock: DoorState core class, L binding, red/green visual indicator, locked doors thwart FORCE_ENTRY - Flashlight: G binding, SpotLight3D, perception radius bonus at evening/late - Persistence: save shift results via Save autoload, history + best score on review screen, round-trip test - Navigation: flat NavigationRegion3D navmesh, NavigationAgent3D path following with direct-movement fallback; steps made visual-only so NPCs reach entrance - Localization: strings moved to content/strings.en.json (loader keeps lookup/fmt signatures; coverage test over all keys) - Distribution: export_presets.cfg (Linux/Windows/macOS), tools/build_releases.sh, docs/RELEASING.md, prominent README Downloads section - Remove stale signal_bus.gd (invalid static-signal experiment) - Tests: 53 passing across 9 suites
9.2 KiB
9.2 KiB
DONE
Completed task sections moved from TODO.md. Sections are moved only when every item is finished and verified.
Project Setup
- Confirm Godot 4.x editor version to standardize on (Godot 4.3 stable, official build).
- Initialize a git repository and add a sensible root
.gitignorefor Godot and export artifacts. - Scaffold the Godot project (
project.godot, input map, folder structure). - Add the GUT test framework and a runnable headless test command. (Deviation: GUT requires the editor plugin; replaced with a lightweight custom harness in
src/test/test_runner.gdthat runs without the editor.) - Document setup, run, and test commands in
README.md.
Prototype Scene
- Build a placeholder Hollywood Boulevard building entrance with steps, sidewalk, and a restricted door (procedural
WorldBuilder). - Add a controllable guard character with first-person camera controls (
GuardController). - Add basic keyboard/mouse input: move, look, interact, and cancel.
- Add a debug overlay showing NPC intent, escalation level, and shift timer (
Ftoggles).
Core Simulation — Systems
- Implement
ShiftCoordinatorto start, advance, and end a shift. - Implement
VenueScenarioas aResourcewith locations, rules, NPC pools, and event pools. - Implement an event scheduler that emits routine traffic and occasional scripted events (
EventScheduler). - Implement
NPCControllerwith movement toward waypoints, doors, and queues (movement handled byNpcAvatar).
NPC Interaction
- Define
NpcProfileresources with intent, temperament, compliance, and escalation tolerances. - Implement a lightweight finite state machine for NPC states (
FSM). - Implement the observation phase (Level 0) without forced intervention.
- Implement simple deterrence (Level 1): raise hand, point, eye contact, and head shake.
- Implement polite dialogue with professional, friendly, firm, and suspicious tones (logic level; tone picker UI deferred).
- Implement formal warnings (Level 2) and make NPC reactions depend on profile and tone.
- Implement blocking and physical positioning (Level 3) without default force.
- Wire typical NPC reactions: leave, argue, ignore, record, move closer, or return later.
Access Verification
- Implement
AccessVerifierwith input from recognition, wristbands, IDs, tickets, credentials, and guest lists. - Add wristband inspection UI showing color, pattern, date, and event marking.
- Model valid, expired, counterfeit, mismatched, missing, and ambiguous access artifacts.
- Record admit, redirect, hold, and refuse decisions for shift review.
- Add feedback scoring for incorrectly denying an authorized person or admitting an unauthorized one.
Escalation and Radio — Core
- Implement
EscalationManagerwith explicit levels 0 through 5 and available-action gating. - Implement the security-assistance radio call (Level 4) with a report form and arrival delay.
- Implement the emergency radio (Level 5) with hold-to-confirm and a report form.
- Add radio cooldown and battery limits to prevent spam.
Incident, Reputation, and Shift Review
- Implement
IncidentRecorderemitting structured events (actor, behavior, action, evidence, escalation, outcome). - Implement body-camera evidence tied to incident events.
- Implement
ReputationEvaluatorfor peaceful resolutions, accuracy, complaints, damage, and entrance security. - Implement
CrowdSystemreactions to calm, aggressive, armed, and emergency situations. - Implement the end-of-shift review screen summarizing decisions, consequences, and justification.
Scenario Content — Venue Data
- Author a minimal Hollywood Boulevard building scenario with tourist, confused-visitor, and simple-trespasser NPCs.
- Author a rare violent-threat event that requires justified emergency escalation.
- Add The Joke Shop scenario data: ID checks, guest lists, and wand-screening policy.
- Add the Hollywood Boulevard Late Night TV Studio scenario data with the full NPC mix and credential checks.
- Add a mental-health-crisis event with careful, respectful de-escalation guidance.
Tooling and Quality
- Add headless test coverage for access verification rules.
- Add headless test coverage for escalation transitions and scoring.
- Add fixed-seed scenario tests for deterministic NPC behavior.
- Set up GitHub Actions to run headless tests on push (
ci.yml). - Add a smoke-test checklist for launching one full shift (in
README.md).
Bug Fixes — LATE shift phase
- Add a
Rules.Phase.LATEentry (start_s700) toshift_phasesin all three venues. - Confirm the LATE-tagged
violent_emergency_eventis now pulled fromEventScheduler.pull_due. - Add a test asserting the LATE phase is reached and the event is eligible in phase.
Missing PLAN Features — Protester NPC
- Add
PROTESTERtoRules.NpcTypeandNPC_TYPE_NAMES. - Add a protester profile (id
"protester") with ARGUE/IGNORE/RECORD/CALL_SOMEONE reactions. - Add a
TYPE_COLORSentry forPROTESTERinnpc_avatar.gd. - Add routine protester events to the Hollywood Boulevard and TV Studio event pools.
- Add scenario tests asserting the protester profile and events exist.
Missing PLAN Features — “Call someone else” reaction
- Add
CALL_SOMEONEtoRules.Reaction. - Handle
CALL_SOMEONEinNPCController._update_state_for_reaction(transitions to ARGUING). - Give influencer, trespasser, and protester profiles CALL_SOMEONE weights.
- Add a reaction log line in
GameManagerand aStringsentry. - Add a test that CALL_SOMEONE can be rolled and updates the FSM.
Missing PLAN Features — Door lock/secure
- Add a
DoorStatecore class with locked/unlocked state andattempt_force(). - Add a visible door lock indicator (green open / red locked) to the world.
- Add the
Lkey binding toggling the door lock, with HUD indication. - Make FORCE_ENTRY reactions fail while the door is locked (thwarted outcome).
- Add
Stringsentries and a headless test for the lock state machine.
Missing PLAN Features — Flashlight
- Add a
Gkey binding toggling the guard's flashlight. - Attach a
SpotLight3Dto the guard that toggles with the flashlight. - Widen NPC perception radius while lit at evening/late phases (
perceive_guardbonus). - Add
Stringsentries and a headless test for the perception effect.
Persistence
- Call
Save.save_shift_result(review)fromGameManager._on_shift_ended. - Load past results and show record count + best score on the shift review screen.
- Add a test that a saved review round-trips through the
Savehelper.
Navigation
- Add a
NavigationRegion3Dwith a hand-authored flat navmesh covering sidewalk, steps, and entrance. - Switch
NpcAvatarfrom direct movement toNavigationAgent3Dpath following (with direct-movement fallback). - Keep per-intent waypoint and returning-trespasser re-targeting on the navmesh.
- Make the step geometry visual-only (no collider) so pathing to the entrance works.
Localization — JSON strings
- Move the string table to
res://content/strings.en.json(41 keys). - Load the JSON at startup;
Strings.lookup/Strings.fmtsignatures unchanged. - Update the strings tests to confirm every JSON key resolves to a real value.
Distribution — Downloadable executables
- Commit
export_presets.cfgwith Linux, Windows, and macOS desktop presets. - Add
tools/build_releases.shfor headless release exports. - Add
docs/RELEASING.mdwith template installation, build, and Gitea release steps. - Add a prominent Downloads section at the top of
README.mdlinking to the release page.
Core Simulation — NPC Perception
- Implement a perception pass so NPCs react to the guard's gestures and proximity.
- Give NPCs local waypoints per intent (photo spots, queue, stage door, sidewalk exit) instead of all walking to the entrance.
- Add returning-trespasser behavior: an NPC that was directed away may circle back later in the shift.
Escalation and Radio — Responder Dispatch
- Spawn a dispatched security NPC / armed responder avatar that arrives at the venue after the call delay.
- Give the responder command, restraint, evacuation, and arrest outcomes that resolve the incident.
- Add a visible emergency-radio cooldown indicator in the HUD.
Scenario Content — Wand Screening (The Joke Shop)
- Implement the handheld wand inspection interaction with alerts from keys, belts, phones, and weapons.
- Enforce screening-before-entry flow and record false alarm / prohibited item decisions.
- Add venue-specific dialogue lines for door staff.
Polish and Accessibility
- Add dialogue tone picker (Professional / Friendly / Firm / Suspicious) before addressing an NPC.
- Add interaction alternatives that do not require precise aiming (e.g. scan-and-select pinned list of nearby NPCs).
- Add visual and audio feedback per escalation level (colors, tones, shake).
- Add audio for crowd ambience, radio responses, and confirmation prompts.
- Externalize dialogue and UI text for localization.