- Drop actions/cache@v4 from the checks job: the Gitea runner cannot reach GitHub's cache service (/twirp/...CacheService timeouts, ~2min retries); Godot import is fast enough without it. Add GODOT_SILENCE_ROOT_WARNING=1. - Document the cache situation and re-enable path in docs/RELEASING.md - VenueScenario.door_staff_line(context, rng): seeded-random venue lines - GameManager logs id/ticket/wand-check, refusal, and prohibited-item lines from the venue scenario (Joke Shop flavor) during inspection/screening - Test coverage: all Joke Shop contexts, unknown contexts, empty venues, deterministic seeded picks (54 tests pass)
11 KiB
11 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 prompts and reaction logic driven by escalation level and profile.
- Implement formal warnings (Level 2) and make NPC reactions depend on profile and level.
- Note (2026-10-31): the selectable dialogue tone-of-voice system (Professional/Friendly/Firm/ Suspicious) was intentionally removed from code and docs; reactions now depend solely on escalation level and NPC profile.
- 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. - Add
tools/publish_release.sh(Gitea API release + asset upload, requiresGITEA_TOKEN).
CI/CD — Gitea Actions full build
- Add
.gitea/workflows/build.ymlwith a fast checks job (import + headless tests on push/PR) and a full build job (export templates, Linux/Windows/macOS exports, artifact upload) on tags andworkflow_dispatch. - Tag builds automatically publish the Gitea release via
tools/publish_release.shusing theGITEA_TOKENsecret. - Remove the old
.github/workflows/ci.ymlto avoid double runs on hosts scanning both paths. - Document the CI flow in
docs/RELEASING.md.
Gameplay — Venue selection
- Add a
Vcontrol that cycles Hollywood Blvd → The Joke Shop → TV Studio and restarts the shift (GameManager._cycle_venue), with ahud.venue_switchedstring entry.
Gameplay — Venue door-staff dialogue
- Add
VenueScenario.door_staff_line(context, rng)picking a seeded-random line fromdoor_staff_lines(empty for unknown contexts/venues). - Wire
GameManagerto log venue lines: id/ticket check line when inspection opens, wand-check line when screening starts, prohibited-item line on correct wand refusal, and refusal line on denied entry (The Joke Shop flavor only). - Add a headless test covering all Joke Shop contexts, unknown contexts, empty venues, and deterministic seeded picks.
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 aim-free targeting (Tab) and venue cycling (V). (The earlier dialogue tone picker was superseded and removed with the tone-of-voice system.)
- 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.