Ship the 0.8.0 first-hour and campaign milestone
Full build / Import + headless tests (push) Successful in 41s
Full build / Full desktop build + optional release (push) Successful in 4m18s

Add the campaign shell, pause-safe checkpoint resume, post-shift campaign
continue, confirmed campaign reset, difficulty presets, searchable Help,
content-matrix validation, recovery events, contextual dialogue, policy/debrief
context and eligible-event previews. Extend persistence with atomic separate
files and add campaign/checkpoint/tutorial smokes. Headless 247/247, Python
94/94, tutorial/campaign/session/scenario smokes green.
This commit is contained in:
zwitschi committed 2026-11-01 21:21:43 +01:00
1 parent 86332cd401
commit aa51ee331e
38 files changed
+1361 -1144

No files matched your search

+131
View File
@@ -1336,3 +1336,134 @@ back when a provider rejects a request.
records the selected model and ~$0.006 spend.
- [x] Update `docs/asset-tooling.md`, `MEMORY.md`, `README.md` and `CHANGELOG.md`; the
public catalogue picks the cheapest image+JSON model (`z-ai/glm-5.3-flash` at run time).
## Milestone 0.8.0 — First hour and content depth
Completed 2026-11-01. Tutorial, campaign/checkpoint resume, content validation, contextual dialogue,
policy/debrief, difficulty/help and the expanded smoke matrix are in place.
Goal: a new player can learn the game inside the game, play a short campaign across the three
venues, and see enough authored variety that a second shift does not feel like a replay.
### 0.8.1 First-shift tutorial
- [x] Write the tutorial beat sheet: menu → movement/look → focus and target cycling → action
wheel → access inspection → polite direction → formal warning/body camera → radio →
shift review. Eight beats and a safe compliant visitor are specified in
[`docs/tutorial.md`](docs/tutorial.md).
- [x] Add a tutorial state machine independent of the normal shift FSM. `Tutorial` in
`src/game/tutorial.gd` owns the eight beats, accepts only the current beat's action,
supports skip/restart and has deterministic headless tests. GameManager/UI wiring starts
with the contextual-prompt task.
- [x] Add contextual prompts that advance on the performed action, not on a timer. The
non-blocking `TutorialOverlay` card updates from `Tutorial.beat_changed`; it is
mouse-transparent, skippable with F1 and does not repeat after completion/skip.
- [x] Stage a safe encounter with one compliant visitor; routine/scripted spawns are suppressed
while the tutorial is active. The tutorial uses the real wheel, inspection, warning/body
camera and radio panels.
- [x] Persist tutorial completion/skip in `settings.json` and add a "Replay tutorial" action in
Settings that clears both flags and restarts the Hollywood shift.
- [x] Add localized tutorial strings (`tutorial.*` keys) and caption-ready prompt hooks in the
overlay/state table.
- [x] Add headless tutorial-state tests and `smoke_tutorial.gd`, covering prompts, the safe
visitor, completion, settings persistence, replay and skip.
Tutorial complete (2026-11-01): the first-shift flow is wired end to end; normal
scripted test/capture runs bypass it unless `--tutorial` is passed.
### 0.8.2 Campaign and session shell
- [x] Define campaign data separately from `VenueScenario`: `src/core/campaign.gd` owns venue
order, shift number, completion, difficulty and the next venue.
- [x] Add a campaign-select/continue screen showing the next shift/venue and previous grade;
the existing venue buttons remain free-play/debug-compatible.
- [x] Add a "Continue shift" path that resumes the paused checkpoint, including RNG, elapsed
time, NPC/incident state, systems and door state.
- [x] Add campaign status to the shift review with a Continue action for the next venue and a
return-to-menu path; the review keeps retry and timeline controls.
- [x] Persist campaign state (`campaign.json`) and add a confirmed Reset campaign action in
Settings.
- [x] Add Campaign unit tests plus `smoke_campaign.gd` covering resume, shift advancement, review
continue and help.
### 0.8.3 Venue content matrix
- [x] Define the per-event content matrix in the authored event dictionaries (phase, kind, NPC
type, intent, access override, hint/recovery path and weight).
- [x] Add `ScenarioValidator`: unique IDs, existing profiles, valid phases/kinds, intent presence,
minimum routine/scripted/recovery counts and phase coverage; all three venues pass.
- [x] Each venue now has at least 12 events and 6 routine variants across the phase matrix;
recovery events were added for all three venues.
- [x] Add recent-scripted suppression and phase-aware weights in `EventScheduler`; routine
traffic remains repeatable, rare threats keep their authored probability.
- [x] Add one recovery event per venue (returning authorized guest, manager check) on top of the
existing crowd-calming/reputation feedback.
- [x] Add `EventScheduler.preview()` and wire it into the F debug overlay as the next eligible
event list.
- [x] Add content-matrix/no-repeat/spawn-multiplier tests; phase gating and authored-event
reachability remain covered by the scheduler and scenario-content tests.
### 0.8.4 NPC dialogue and negotiation
- [x] Add `NpcProfile.context_lines` for reason/refusal/de-escalation/recognition/group lines,
with deterministic `line_for()` selection and safe fallbacks.
- [x] Expand authored profile context lines and keep selection seed-deterministic; no runtime LLM
dependency.
- [x] Wire Reason, polite/warning/blocking outcomes, recognition and reaction logs to context
lines, with comply/leave vs argue/record differences visible in the HUD log.
- [x] Reuse the existing crowd watch/flee reactions for group response rather than adding
overlapping NPC chatter; nearby avatars react to aggression, responders and panic.
- [x] Add deterministic context-line tests; authored strings remain in the existing localization
table, with missing context falling back safely.
- [x] Add distinct refusal/de-escalation/recognition lines for tourist and confused-visitor
profiles and keep the existing venue-specific dialogue lines.
### 0.8.5 Objective, policy and debrief layer
- [x] Show the venue `policy_summary` in Help and in the shift review.
- [x] Log a one-line phase objective when the shift phase changes; no quest log is added.
- [x] The review already lists incidents, reputation modifiers and responder/investigation outcomes;
policy and campaign-next context were added to make the judgment actionable.
- [x] The shift review explains the grade, policy, highlights and campaign next step; the tutorial
supplies the first-shift guidance.
- [x] Existing incident/review tests cover evidence and missing/unknown outcome handling; the
policy field is sourced directly from the validated scenario.
### 0.8.6 Save, resume and settings
- [x] Add separate `settings.json`, `campaign.json`, `shift_results.json` and versioned
`shift_state.json` (schema version 1); the checkpoint deliberately omits tutorial UI state and
scheduler event objects, restoring only RNG/system/NPC state.
- [x] Write saves through a temporary file and atomic rename; malformed JSON loads as defaults and
a failed write leaves the previous file intact.
- [x] Settings merge over defaults so missing/older keys migrate in place; campaign and shift-state
readers accept missing optional fields with safe defaults.
- [x] Mid-shift checkpoint restores elapsed time, scheduler RNG, incident/evidence state, reputation,
crowd, radio, NPC positions/access state, guard pose, flashlight/body camera and door lock;
`smoke_campaign.gd` resumes and reaches the review.
- [x] Add coordinator/incident snapshot round-trip tests and the campaign/checkpoint smoke; existing
settings/shift-history persistence tests remain green.
### 0.8.7 Difficulty, pacing and help
- [x] Add easy/normal/hard presets adjusting spawn multiplier, NPC compliance tolerance and
report-credibility strictness; escalation and emergency rules are unchanged.
- [x] Expose difficulty in Settings; normal is the default and the values are documented in code.
- [x] Add the standalone `HelpOverlay` covering controls, focus/wheel, access, body camera,
radio and review, with the current venue policy.
- [x] Help has a filter field and builds remappable-action rows from `InputBindings` at open time.
- [x] Debug/event details stay behind F; normal HUD keeps the tutorial and phase objective concise.
- [x] Settings defaults and persistence tests cover difficulty; help is generated from every
`InputBindings.REMAPPABLE` action.
### 0.8.8 Verification and exit criteria
- [x] Add headless tests for tutorial progression, campaign state, content validation, dialogue,
coordinator/incident snapshot round-trips and settings/difficulty defaults.
- [x] Add `smoke_tutorial.gd` and `smoke_campaign.gd` covering tutorial completion/replay/skip,
resumed shift, campaign venue transition and Help.
- [x] Run the automated first-hour path (tutorial + campaign/resume smoke) end to end; the
external five-person playtest is tracked in the 0.9.5 release-candidate milestone.
- [x] Re-run headless/Python/smokes and update status, architecture, changelog, README and docs.
- [x] Exit: tutorial + campaign first-hour path is in place, each venue validates a repeatable
content matrix, checkpoint resume works, and the 0.8 test matrix is green.