30 KiB
Development Status
Current planning priorities are the unversioned 3D model and local map re-evaluation and
Character development tracks in TODO.md; none is part of the implemented list
below yet. The re-evaluation scores the existing characters, gear, props and
venues against the locally installed Blender skill guidance before the roster expands. The 0.10.0
release candidate remains the next versioned release.
Implemented so far:
-
3D re-evaluation — facade and prop pass (unversioned, 2026-11-03): the Masonic/El Capitan facade uses the photo-anchored
limestone_ashlarfield and warm-tinted stone; the TV Studio reusesmasonic_facade(same Jimmy Kimmel starting point); the Joke Shop canopy signature band is white over black, the red curtain bays are seven tied-back hourglass drapes, and the hall wall usesdark_stucco. Thefire_hydrantwas rebuilt with a bolted flange, bonnet cap nut and larger outlets;bollardgained a flared base collar andnewspaper_boxa recessed window slot and door seam. A venue light-falloff gate asserts physical attenuation, andtools/describe_image.pyadds free-form vision review alongside the structured judges. The scorecard, measurements and accepted limits are in3d-model-review.md. -
Godot 4.7.2 project scaffold, input map, procedural world builder (CI/local/release unified)
-
Venue-driven simulation core:
ShiftCoordinator,VenueScenario,EventScheduler,NPCController+ FSM,AccessVerifier,EscalationManager,RadioSystem,IncidentRecorder,ReputationEvaluator,CrowdSystem -
Three authored scenarios (El Capitan Entertainment Centre / Hollywood Boulevard, The Joke Shop, Late Night TV Studio) with access policies, NPC archetypes, and event pools
-
Headless unit tests: 277 passing (access rules and venue-correct access loadout, escalation, radio cooldown/battery, NPC reaction determinism, door lock, flashlight perception, persistence round-trip, settings round-trip, input remaps, navmesh, step colliders, skyline alpha, scenario data, full-shift simulation, wand screening, responder dispatch, localization strings, focus cone, action wheel, session shell, PLAN verbs and incident recording, crowd presentation, emergency aftermath, body-camera timeline, NPC theater poses, audio, accessibility, authored scenario content, string formatting,
.tresvenue round-trip, surface materials and environment, focus ranking and outfit/gait helpers, generated prop models, web export preset, prop atlas material, player movement, NPC character layers/LOD/queue, input bindings, venue light-falloff gate, prop collider coverage) -
Simulation extras: protester archetype, CALL_SOMEONE reaction, door lock/secure mechanic (visual indicator), flashlight with night perception bonus, LATE shift phase reaching the violent-threat event
-
First-person prototype with interaction HUD, access inspection, wand screening, radio report form (incl. emergency hold-to-confirm), dispatched responder avatars, aim-free targeting, venue cycling between all three scenarios, color-coded escalation feedback, procedural audio cues, navigation-mesh NPC paths, JSON-backed localized strings, persisted shift history, debug overlay, and shift review
-
Control pass: focus cone on NPC heads with a billboarded blue circle in front of the face and name, action wheel (LMB/Space) with de-escalation-first slices, mouse-look freeze while a panel is open, acceleration-based walking, and named input actions (
action_menu,confirm,cancel,inspect,wand) -
Session shell: venue start menu (keyboard + mouse), Esc pause overlay (resume / restart / settings / quit to menu), settings panel with mouse-look sensitivity and HUD font scale persisted to
user://settings.json, and "Run another shift" returning to the venue menu -
World presentation: skyline backdrop rendered with an alpha material, walkable step and landing colliders, larger marquee text, and larger focus circle / name tag
-
Routine traffic despawns after a while at its waypoint so the crowd cap no longer fills with idle standers
-
PLAN verbs: eye contact (distinct Level 1 cue), recognizing a person as a player decision recorded as access evidence, a body-camera flag that a formal warning arms (and
Btoggles), blocking that physically stations the guard between the person and the door, and a Level 3 request-reason ask answered from the NPC'sdialogue_lines -
Incidents are now actually opened on focus and closed at shift end, so player actions, access evidence, escalation levels, and unresolved interactions reach the review (previously every recorded event was dropped)
-
Crowd presentation: aggressive behavior and responder arrivals make idle bystanders stop and face the incident; panic sends people away from the door (and they leave the scene). A busy 16-NPC entrance measured ~1.2 ms/frame, so no LOD/culling was needed at the current cap
-
Distant skyline ring: four alpha-scissored planes at 200 m read as a hazy city on the horizon (the baked backdrop used to show as a black slab), with a larger ground plane so the buildings meet the street
-
Flashlight aims straight ahead and lights the person/door being checked instead of the ground in front of the guard
-
Emergency aftermath: the
evacuationoutcome locks the door and clears the entrance, an emergency call that the situation did not justify opens an investigation and applies the false-report hit, and the shift review names the responder outcome and any investigations -
Body-camera timeline: the shift review opens a text timeline of every recorded incident event (time, person, action/outcome) that you step through with the arrow keys or buttons. No live 3D replay yet
-
NPC theater: seated guests sit on the steps with bent legs, influencers and tourists raise a camera prop while photographing, performers sway their sign, and filming visitors pan slowly — all once they reach their intent's waypoint
-
Audio: a looping procedural crowd bed (filtered murmur) whose volume follows
CrowdSystem.mood, plus radio open/close crackle. All generated at runtime, no audio assets, and safe with a dummy audio server -
Accessibility: the escalation cue shows a shape meter plus the numeric level (
Escalation: Blocking [###--] L3/5) so it reads in grayscale, and the HUD font scale from settings is applied at boot by resizing fonts (not Control.scale, which broke the right-aligned layout) -
Editor-ready venues:
tools/export_venues.gdwritescontent/venues/<id>.tresfromScenarioFactory, and the.tresfiles load back with events, profiles, policy, phases, door lines, and locations intact (the factory stays the source of truth) -
Localization safety:
Strings.fmtvalidates the placeholder count before formatting and fails safe (warns, returns the template) instead of raising an engine error,Strings.placeholder_countignores%%, andStrings.validate()lints the table for trailing%, unsupported conversions, and mixed positional/sequential placeholders -
Authored scenario content: Joke Shop reservation-without-ID, borrowed/mismatched ID, a guest who refuses the wand screen, and a late arrival during a performance; Studio filming-boundary repeats and a celebrity arrival that draws a small crowd; Building events that point the player at the body camera and request-reason verbs
-
Visual polish pass (v0.2.0): phase-based lighting (sun/sky/ambient per shift phase), street lamps with night-mode bulbs and omni lights, glowing marquee signage, crosswalk, planters and low-poly street trees, NPC height/brightness variety, denser routine traffic — day and late-night screenshot sets
-
Assets pass: authored textures in
assets/textures/(brick facade, concrete, asphalt, awning, skyline, vignette, HUD icons, access-card art) generated bytools/generate_textures.py, soft sun shadows, humanoid NPC rigs with archetype props + procedural walk bob and attention head-turn, inspection artifact cards, escalation vignette, mode icons, and a body-camera overlay (REC + shift clock) -
Rendering pass (v0.3.0 work, ADR-0012): one material module with roughness/metallic profiles per surface, ACES tonemapping, glow, aerial fog and colour grading driven by the shift phase, correctly scaled brick, framed facade windows that light up at night, door trim and handles, a curb and lane dashes, and the glowing marquee/lamp bulbs. NPCs gained per-role clothing palettes, caps/hoods/backpacks/sunglasses/lanyards, hands and shoes, and an arm/leg walk swing
-
NPC characters (v0.5.0): articulated limb rigs, layered outfits, hand items, face/hair variety, idle behaviour (phone, clipboard, crossed arms, look-around), escalation gestures, readable reaction symbols, door-queue offsets, and three LOD tiers with a billboard impostor
-
Player movement (v0.5.0): separate acceleration/braking, step-up assist, head bob and landing dip (toggleable), precision-walk FOV/chip/tick, surface-aware footsteps, gamepad support, and persistent key/button remapping in settings
-
Prop collision and placement (v0.4.0): every prop fits a static collider from its mesh bounds and publishes a navigation obstacle, so the guard and guests cannot walk through benches, bins, or bollards; placements are grouped into zones with a validator, and deterministic variants add rotation, scale, and small clutter
-
Prop atlas (v0.3.1):
tools/model_pipeline.pypacks each prop's palette into one power-of-two colour atlas plus a metallic/roughness atlas and emits a single material with per-vertex UVs, so a prop is one draw material rather than one per part;auditenforces the contract -
Generated prop models (v0.3.0 work):
tools/model_pipeline.pybuilds bollards, benches, bins, planters, newspaper boxes and a hydrant as.glbprops with per-part materials, loaded byWorldBuilderwith a procedural fallback; the optional AI concept step (model_pipeline.py concept) supplies per-prop colour palettes -
Environment pass (v0.6.0): 1024² brick/concrete/asphalt with derived tangent normal maps, 256² baked AO maps for every Blender character/gear/prop, and library props whose bulbs/LEDs/sign faces follow the day/night phase
-
NPC characters + library (v0.6.0):
NpcAvatarloads one of 8 Blender-authored skinned variants (role/seed selected) with five tintable material slots,Rig/Headfocus anchor, and attach-point gear;npc_base.glband the procedural rig remain fallbacks.tools/blender_assets.pybuilds/audits the character, gear, and 20-prop library;WorldBuilderloads the replacements and new street dressing (lamp, trees, palms, planters, barriers, podium, doors, marquee, sedan, handrail) with colliders, navigation obstacles, and phase-driven emissives -
Web build:
build/gig-line-web-<version>.zip(Godot's non-threaded web template, no COOP/COEP headers needed) built bytools/build_releases.shand published with the desktop artifacts; serve the unzipped folder from any static host -
Aim-free selection pass (v0.3.0 work, ADR-0011): the focus cone ranks candidates by angle then distance,
Taband the mouse wheel cycle nearby people nearest-first and pin the selection, right click clears focus with a short re-acquire grace, the HUD reports how many people are in the ring, and holdingShiftwalks at half speed for close work -
Visual alignment: start/venue menu, pause, settings, shift review, radio, wand, inspection, timeline, HUD target chip/escalation bar, and radial menu now use or match their AI references in
assets/images/ui/. The runtime art loader (src/game/ui/art.gd) falls back cleanly when a file is missing. The wand panel lists the guest's carried items, and multiline HUD/wand strings render real line breaks. -
NPC neck/shoulder transition (0.9.4 work): the body graph now uses a fuller neck base, a slightly tapered neck top and a lower shoulder root, giving the head/neck/shoulder line a trapezius slope instead of a thin post. The full character library was rebuilt with a final degenerate-face cleanup; the baseline comparison is
sheet_npc_baseline_compare-body.jpg. -
NPC face-depth pass (0.9.4 work): sclera are recessed and capped by a thin upper lid, and the separate jaw/cheek spheres are replaced by a chin plate and cheekbones sculpted into the head mesh. The full library was rebuilt; the comparison is
sheet_npc_baseline_compare-face.jpg. -
NPC torso/hip transition (0.9.4 work): the pelvis and chest are slightly wider than the waist, giving shirts and jackets a readable taper into the hips without changing the build multipliers or the skeleton. The comparison is
sheet_npc_baseline_compare-torso.jpg. -
Release v0.9.6 (2026-11-03): the tagged commit
4bb2896passed Gitea Actions run 1296 (checks + full build) and published seven artifacts (Linux, Windows, macOS, NSIS setup, AppImage, Web and Desktop HQ). Release page: https://git.allucanget.biz/zwitschi/security-game/releases/tag/v0.9.6. -
Release candidate (0.10.0-rc.1, 2026-11-03): clean worktree
a9658ecbuilt Linux 161.5 MB, Windows 197.2 MB, macOS 148.0 MB, Web 97.8 MB and Desktop HQ 241.6 MB. The Web/HQ archives containCREDITS.md,PRIVACY.md,docs/accessibility.mdanddocs/known-limitations.md; SHA-256 checksums were generated, the Linux and HQ binaries launched headless, and the Web index/wasm/pck/docs served with HTTP 200. The candidate is not published: external playtest, AI-provider/legal approval, macOS signing and the Windows/macOS target matrix remain open blockers. -
Save migration and reliability (0.10.0 work): committed 0.8-era settings/campaign/history fixtures and a 0.9.0 checkpoint. The loader default-fills old settings, keeps campaign progress and validates checkpoints for all three venues with an open incident, NPC rows, door, flashlight and body-camera state. Corrupt and partial files fall back to defaults; a blocked atomic replace leaves the prior valid file intact.
_load_jsonuses the non-logging JSON parser; save locations and rollback are documented ingetting-started.md. Suite is 277/277; Python tooling is 161/161 after the GLBinspectintake coverage. -
Integration checkpoint (0.9.6 work): the clean worktree at
f5b8ef2rebuilt all five release packages and the Desktop HQ zip without ignoredtmp//build/content (Linux 161.5 MB, Windows 197.1 MB, macOS 148.0 MB, Web 97.8 MB, HQ 241.5 MB). The Web zip containsindex.html,index.wasmandindex.pck; the HQ zip containsoverride.cfgand launches headless with the Forward+ override. Current verification: Godot 263/263, Python 101/101, 14 smokes green, 24-NPC budget 6.90 ms / 168 meshes / 131,616 triangles, gallery 21 good / 0 bad, screen judge 21/21 match with 0 review/diff, and a pinned realism judge (z-ai/glm-5.3-flash, one pass per shot) at mean overall 2.1 and Pillow gap 0.291. No new gameplay or content changes. -
Release v0.9.5 (2026-11-02): the tagged commit
4bc6390passed Gitea Actions run 922 (checks + full build) and published seven artifacts (Linux, Windows, macOS, NSIS setup, AppImage, Web and Desktop HQ). Release page: https://git.allucanget.biz/zwitschi/security-game/releases/tag/v0.9.5. -
Release v0.9.4 (2026-11-02): the tagged commit
a57b86cpassed the Gitea checks and full build and published seven artifacts (Linux, Windows, macOS, NSIS setup, AppImage, Web and Desktop HQ). Release page: https://git.allucanget.biz/zwitschi/security-game/releases/tag/v0.9.4. -
Environment texture pass (0.9.5 work):
capture_realism.gdnow has hidden-HUDsurfaces/surfaces_jokeclose-up stages. The Walk of Fame band uses the paver texture as dark terrazzo, the neighbour awning keeps its cream stripe, and the skyline shader blends its lower 42 m toward a per-phase haze colour. Brick, asphalt, limestone and paver UV scales/profiles passed without replacement. -
Texture/prop audit (0.9.5 work): all 21 screen-art textures are 1280×720 and referenced; access cards are 256×128 and HUD icons 64×64. No oversized or unused runtime texture was found; the legacy root textures remain only as the texture-generator/asset-test fallback. The 24-NPC smoke now reports 168 meshes, 131,616 triangles and 6.94 ms (50 ms budget); compressed payload is 24.55 MB of surface picks, 22.67 MB of screen art and 0.48 MB of NPC maps.
-
NPC texture pass (0.9.5 work): the NPC base and all eight library characters now use 256² albedo/normal/ORM maps instead of 128². Cloth and pants use
NPC_FABRIC_UV_SCALE(4× weave) and skip the baked per-character AO, removing the large blotchy patches in portraits; skin, hair and gear keep baked AO. The base and eight GLBs plus AO maps were rebuilt; the 24-NPC smoke remains green. -
Texture visual verification (0.9.5 work): the nine-stage realism run used
z-ai/glm-5.3-flashonce per shot; meanafterscores were overall 1.8, lighting 2.3, materials 1.8, texture detail 1.2, backdrop 2.0 and characters 1.2, with a Pillow metric gap of 0.306. The judge remains an optional review aid, not a CI gate. The committed before/after close-up sheet isblender_previews/sheet_texture_refinement_0.9.5.jpg; it records that the paver/Walk of Fame and NPC fabric repairs are visible, while asphalt, limestone and skyline picks held without a replacement.tools/check_screenshots.shpassed 21 good / 0 bad and the screen-design judge passed 21/21 match with 0 review. -
NPC visual optimization (0.9.4, complete 2026-11-02): all eight variants passed the portrait/readability, proportion, gear, foot/shoe, headgear and final-context gates. The library uses an 8,000-triangle / 8,000-glTF-vertex cap (up from 6,000/5,000;
npc_basefallback remains 6,000/4,000); current characters measure 4,482–5,474 triangles and 4,260–5,494 vertices. The 48-frame baseline and 96-frame final-context review pass, the hand/gear offset and shoes are in, and the accepted stylized limits are documented innpc-visual-review.md. -
NPC face-detail pass (0.9.4 work): ala wings and a smaller nose bridge/tip, one rounded mouth slot, and a darker ear concha; all eight rebuilt. The comparison is
sheet_npc_baseline_compare-face-detail.jpg. -
NPC face realism pass (2026-11-03/04): all eight variants now use the
seg=24/rings=16head with a subtle brow ridge, a fuller lower lip and both eyelids (recessed creases were rejected because they bake as dark AO patches). Vision-reviewed as cleaner/more realistic than the 0.9.4 face; characters measure 5,038–5,900 tris / 4,756–5,902 verts (still under 8,000).sheet_npc_baseline.jpgwas refreshed. -
Crowd-variety roster (character development, 2026-11-04): four new variants —
npc_crowd_a(slim/bun/sunglasses),npc_crowd_b(broad/bald/beard/shoulder bag),npc_crowd_c(coat/umbrella),npc_crowd_d(slim/hood/cup) — built with the realistic face and wired intoCHARACTER_POOLSso the routine crowd roles (tourist, confused visitor, intoxicated) pick them by seed instead of cloningnpc_casual. The 24-NPC smoke is now 152,464 tris / 168 meshes / 6.94 ms (under the 50 ms budget). -
NPC headgear clearance (0.9.4 work): the 96-frame final-context review after the face-detail pass confirms the cap, firefighter helmet, hood and sunglasses clear the refined brow and eyes; no gear rebuild was needed.
-
NPC footwear pass (0.9.4 work): casual shoes gained rounded toe and heel caps; responder/firefighter boots gained matching toe/heel volumes while retaining the black rubber boot language. All eight rebuilt; comparison
sheet_npc_baseline_compare-shoes.jpg. -
NPC hand-item grip (0.9.4 work): runtime
HAND_ITEM_FORWARDmoves every hand gear 4 cm forward from the wrist proxy, so phone, cup, clipboard, camera, flashlight, wand and radio sit in the open palm instead of partly inside it. The open-hand/no-finger-rig limit is accepted for this stylized release; the comparison issheet_npc_hands_grip_compare.jpg. -
NPC hand pass (0.9.4 work): wider, shallower palms; four two-segment bent fingers with rounded tips and a separate bent thumb; optional
--view=handcapture at 0.80 m. The hand comparison issheet_npc_hands_compare.jpg; the forward offset is in and the open-palm limit is accepted. -
NPC proportion audit (0.9.4 work):
tools/npc_proportions.pymeasures all eight GLBs against a stylized height/head/shoulder/hip/torso/leg/arm/foot guide. All variants pass; the head and broad-build silhouettes are the nearest upper bounds. Results are innpc-proportion-audit.md. -
NPC P1 portrait fixes (0.9.4 work): tourists now hide their photo-pose camera bag outside
photo/filmposes, removing the duplicate-backpack silhouette; the backpack gear was rebuilt with flattened, forward chest straps and a fresh AO map. The before/after sheet isblender_previews/sheet_npc_baseline_compare-p1.jpg; the remaining face/hand work was closed under the 0.9.4 acceptance limits. -
NPC visual baseline (0.9.4 work):
src/test/capture_npc_baseline.gdcaptures all eight library characters from front, three-quarter, profile, back, full-body and crowd views in a neutral studio (48 frames). The criteria, measurements and ranked gaps are innpc-visual-review.md; the committed sheet isblender_previews/sheet_npc_baseline.jpg. No model changes were made in this baseline step. -
UI-state capture pass (0.9.3 work):
src/test/capture_ui_states.gdadds committed captures 14–21 for the start menu, pause, settings, shift review, emergency radio, action wheel, crowd panic and responder arrival. Every one of the 21 catalogue entries now has a current-build capture;tools/check_screenshots.shreports 21 good / 0 bad and the automatic judge reports 21/21 match, 0 diff. Crowd panic and responder arrival are staged presentation frames, not gameplay changes. -
Realism adoption (post-v0.6.0): v2 per-phase skylines and surface tiles with normal maps, retuned sun/exposure/fog, wet asphalt, denser foliage, a tight additive flashlight spot with no beam geometry, and refreshed staging captures.
tools/check_screenshots.shis the repeatable capture/compare gate; judge is clean ofdiffverdicts. -
Input/reliability fixes: selecting a venue releases the start-menu input lock and recaptures the mouse; the body-camera overlay no longer covers the shift status. Mouse look now reads at
_input, restores capture on window focus/click-back, and the HUD is mouse-transparent. Normal radio reports submit on click; emergency calls still require the hold-to-confirm path. -
Production-quality pass (v0.9.0): mixer/accessibility settings, audio volume clamping, 24-NPC budget smoke, shortened coat/dress stride, and a unified Godot 4.7.2 CI/local support baseline with documented upgrade/rollback requirements.
-
Campaign and first-hour pass (v0.8.0): campaign progression, checkpoint resume, difficulty presets, a searchable Help overlay, recovery events, contextual dialogue, policy/debrief lines and tutorial/replay/skip. Scripted QA bypasses the tutorial unless
--tutorialis passed. -
Tutorial pass (0.8.0 work): the eight-beat first shift is wired through a non-blocking prompt overlay, a safe compliant visitor, real wheel/inspection/warning/radio panels, persisted completion/skip and a Settings replay action. Scripted tests/captures bypass it unless
--tutorialis passed;smoke_tutorial.gdcovers the full flow. -
Vision judge (v0.7.2): discovers the cheapest current OpenRouter image+JSON model, reports the model/fallbacks used, and clears the full screen-design judge (13/13 match, 0 diff).
-
Desktop HQ (v0.7.1): optional Forward+ Windows/Linux zip with volumetric fog, SDFGI and a volumetric flashlight; the default Compatibility/Web builds and headless tests gate the effect off. A/B captures are generated locally under
docs/screens/realism/(gitignored). -
Hollywood landmark map (map optimization): the default venue is now a stylized reconstruction of 6840 Hollywood Blvd (the 1921 Masonic Temple / El Capitan Entertainment Centre) with a six-column Ionic portico, eight stone steps, Masonic parapet motto and medallions, three red event banners, central and side entrances, the El Capitan Theatre and east retail neighbours, the Ovation Hollywood arcade opposite, the Walk of Fame terrazzo and a four-lane boulevard with red kerb paint. The facade uses the shared limestone/stone material; the whole venue measures 58,884 triangles across 409 meshes in the map-budget test. The venue menu exposes separate Day and Night Hollywood rows; the night row resolves to the same scenario with a late-phase offset, so its whole shift stays after dark. Real-site references and the geometry mapping are in
hollywood-boulevard-map.md. -
Day/night scenery variants (map optimization): the Hollywood row in the venue menu is split into Day and Night entries, with localized names/blurbs. The night entry uses
ShiftCoordinator.phase_offset_sto start a full-length shift inLATEwhile the clock still starts at 00:00; the scheduler reads the offset time so late-night routine traffic and the late violent-threat event still fire, and the offset round-trips through checkpoints. ThreeLATEroutine events keep the night street populated. Local lights were retuned from constant falloff to linear attenuation so sconces pool instead of flooding the stone. -
Joke Shop / Sunset Strip map (map optimization): the second venue is now a stylized reconstruction of The Comedy Store block at 8433 Sunset Blvd, with a 27 m black hall, signature-covered sloping canopy, circular THE JOKE SHOP blade sign, seven tied-back red velvet curtain drapes, a west-end entrance, cream and white low-rise neighbours, a dry hillside with stucco houses and palms behind the roofline, and a low retail/billboard frontage across Sunset. The same geometry serves day and late lighting through the phase system. Real-site references and limits are in
joke-shop-map.md; the map measures 25,828 triangles across 518 meshes in the budget test. -
Venue geometry (v0.7.0, Joke Shop frontage superseded by the map-optimization pass): the TV Studio is the same El Capitan block restaged for a late-night arrival — a stone facade, bulb canopy, glossy black car and barrier line.
WorldBuilder.VENUE_SPECSdrives facade/street/nav dimensions, andGameManagerrebuilds only the world container when the venue changes. -
Gear fit (post-v0.6.0): Blender gear is measured against the avatar head/skirt silhouette and the checks run in both the Python tooling and the headless suite. Sunglasses, the shoulder bag and the firefighter helmet were fitted to the new faces; the Influencer portrait and gallery were recaptured with a before/after report.
-
End-to-end interaction pass (0.9.3 work):
smoke_ui_flows.gddrives inspection allow/deny, normal vs emergency radio, Help filtering, wand allow/deny and review return-to-menu in the real scene; campaign and timeline smokes cover review continue and timeline round-trips. -
Destructive-action pass (0.9.3 work): reset campaign and tutorial replay share a guarded confirmation dialog (one open instance, one emission, Cancel is inert); emergency send remains hold-to-confirm with no post-submit double-fire. Covered by session/radio tests and recorded in
docs/ui-copy.md. -
Font/layout pass (0.9.3 work): HUD font scale was exercised at 0.75× and 1.75×; the target chip measures and caps scaled names, top labels clip, and shared action buttons ellipsize long 1.5–2× labels instead of overflowing. Covered by accessibility/button tests and recorded in
docs/ui-copy.md. -
Modal-close pass (0.9.3 work): one top-modal close path handles Esc/right-click for every overlay, Settings opened from the menu restores the menu, Help no longer opens Pause behind it, and pointer/guard freeze state is recaptured after each close. The session smoke covers these paths.
-
Keyboard/gamepad focus pass (0.9.3 work):
UiFocusrings wrap through visible/enabled controls, hidden Continue and disabled timeline actions are skipped, each modal has a default focus, and A/B are bound toui_accept/ui_cancelfor pad-only navigation. Recorded indocs/ui-copy.md. -
Button-state pass (0.9.3 work): a shared
UiStyleshelper now gives every action button explicit normal, hover, pressed, focus and disabled styles; the timeline disables Previous/Next at its boundaries, while hidden continue states and the keyboard-only tutorial skip remain intentional. Recorded indocs/ui-copy.md. -
Dialogue pass (0.9.3 work): NPC reason answers now use the authored
reasoncontext, with an in-character answer for every shared archetype; Hollywood and Studio gained door-staff lines; radio cancellation, tutorial Ask terminology, help, start hints and campaign reset copy were clarified. Audit recorded indocs/ui-copy.md. -
Pre-build NPC review (2026-11-02): all eight library characters were staged at portrait, conversation and crowd distance on Hollywood and the Joke Shop, in day and night lighting, with the normal crowd hidden (
src/test/capture_npc_review.gd). No P0 issues were found. Two P1 gear-fit issues were fixed with runtime attach offsets: the authorized-guest lanyard badge now clears the jacket and the firefighter helmet sits above the eyes. Backpack straps, caps, hands and the intentionally low-poly faces were accepted for the stylized target; close-range flashlight wash remains an optional-lighting follow-up. The 24-NPC budget stayed at 6.94 ms, the gallery passed 13 good / 0 bad and the screen-design judge stayed 13/13, and a clean portrait scored a 0.732 vision gap against the photoreal concept.
Current gaps for the 0.x release line: deeper authored content/dialogue, animation and audio production, localization/accessibility expansion, 24-NPC/platform profiling, external playtesting, and signed/notarized release packaging. The full gap analysis and milestone plan live in TODO.md; the current architecture and documentation ownership map are in docs/architecture.md.