Implement control pass: focus cone, action wheel, named inputs, boot fixes
- 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.
This commit is contained in:
1 parent
69484866db
commit
f11b441c07
28 files changed
+1433
-249
No files matched your search
@@ -302,3 +302,91 @@ Completed task sections moved from `TODO.md`. Sections are moved only when every
|
||||
- [x] Regenerate the AI asset set at role-specific aspect ratios and dimensions.
|
||||
- [x] Audit, process, and wire every generated asset into the game runtime.
|
||||
- [x] Add screenshot auditing and refresh the README screenshot gallery.
|
||||
|
||||
## Access artifacts actually match the venue
|
||||
|
||||
Completed in the working tree (uncommitted with the control pass). Headless **74/74**.
|
||||
|
||||
- [x] Build artifacts from the event (`override_access`, carried items) and the venue policy,
|
||||
not from `NpcType` alone. (`src/core/access_loadout.gd`; spawn signal is
|
||||
`(profile, intent, npc_id, event)`.)
|
||||
- [x] Joke Shop: valid ID+ticket, ID without ticket, expired/missing ID. Recognition does not
|
||||
auto-grant on every `AUTHORIZED_GUEST`.
|
||||
- [x] Wand venues roll `carried_items` per spawn (seeded); override can force a pocket.
|
||||
- [x] Studio counterfeit / follow-through events carry `override_access`.
|
||||
- [x] `AccessVerifier.verify(..., already_screened)` so a screened guest is not still denied.
|
||||
- [x] Joke Shop / Studio `sidewalk` and `steps_end` waypoints so film/photo intents do not walk
|
||||
to the entrance.
|
||||
- [x] Wand shortcut is `C`, not `W`. Tests: `src/test/tests/test_access_loadout.gd`.
|
||||
|
||||
## Player control, focus ring, and radial action menu
|
||||
|
||||
Completed 2026-10-31 with ADR-0007–0010. Headless **77/77**, plus a windowed smoke
|
||||
(`src/test/smoke_focus_radial.gd`) that opens the wheel and saves screenshots.
|
||||
|
||||
### Locomotion
|
||||
|
||||
- [x] Wand off `W` (now `C` + wheel). `A`/`D` allow/deny only while inspect/wand is open
|
||||
(they step the wheel while it is open). `Q` remains a closed-menu polite shortcut.
|
||||
- [x] Accel/decel on walk; gravity only when airborne; `floor_snap_length` 0.3.
|
||||
- [x] Mouse look only while captured and `not input_locked`. Freeze walk+look while radial /
|
||||
inspect / wand / radio / review is up. Recapture on close.
|
||||
- [x] `cancel` (Esc / RMB) closes the top modal first; with nothing open, Esc toggles mouse
|
||||
capture and RMB does nothing.
|
||||
|
||||
### Focus and head ring
|
||||
|
||||
- [x] Focus cone in `src/game/npc_focus.gd` (~10 m, ~10°). Closest-to-forward wins; occlusion
|
||||
ray skips building hits. `Tab` still cycles 12 m.
|
||||
- [x] 8-frame miss grace so walk-bob does not drop focus.
|
||||
- [x] Billboarded torus on `Rig/Head`; gold idle, brighter while the radial is open; `Label3D`
|
||||
`display_name`. HUD target line uses the display name, not the node name.
|
||||
- [x] Screen-center crosshair.
|
||||
|
||||
### Radial HUD
|
||||
|
||||
- [x] `src/game/ui/action_radial.gd`: LMB or `Space` opens when someone is focused. Opening
|
||||
click ignored for 120 ms. Slices: raise hand, point, head shake, polite, inspect, wand
|
||||
(grey if no wand), warning, block, radio assist. Emergency stays on `R`.
|
||||
- [x] Highlight by mouse angle, or `A`/`D` / arrows. Click slice or `Space` confirms. `Esc` /
|
||||
RMB closes with no action (no recorder event).
|
||||
- [x] Inspect / wand / radio slices close the wheel then open the existing panels. Freeze until
|
||||
that panel closes.
|
||||
- [x] Number keys `1`–`6` still work when the wheel is closed.
|
||||
|
||||
### NPC display
|
||||
|
||||
- [x] Procedural rig: neck, shoes, hair cap from seed, two eye spheres. Props, height
|
||||
variation, walk bob, notice-head-turn kept. Collision capsule scaled to rig height.
|
||||
Named `Head` is the ring attach point. Group `npc`.
|
||||
|
||||
### Input, copy, tests
|
||||
|
||||
- [x] Named input map: `action_menu` (Space/LMB), `confirm` (Space/Enter), `cancel`
|
||||
(Esc/RMB), `inspect` (E), `wand` (C). `GameManager` uses `is_action_pressed`.
|
||||
- [x] Windowed smoke: focus ring + name, wheel open/step/confirm/cancel
|
||||
(`src/test/smoke_focus_radial.gd`, exits non-zero on failure).
|
||||
- [x] README controls table, smoke checklist, test count, implemented/not-yet lists.
|
||||
|
||||
## Runtime boot and spawn fixes
|
||||
|
||||
Found while running the windowed smoke; all verified with a boot run and regenerated
|
||||
screenshots.
|
||||
|
||||
- [x] `GameManager` did not compile: `radial` was typed `CanvasLayer`, so
|
||||
`radial.is_open` / `confirm_selected()` made `:=` inference fail. Typed as
|
||||
`ActionRadial` (the parse error would have broken the whole main scene).
|
||||
- [x] Camera sat at the guard's feet: `Head` had no height offset, and the new gravity pulled
|
||||
the guard to the floor. `Head` is now at y=1.6, and the guard spawns on the landing.
|
||||
- [x] Guard spawned inside the building collider and fell through the world. Building volume
|
||||
moved back to z ∈ [-8, -4] so the door / awning / marquee sit on its front face; the
|
||||
guard spawns in front of the door facing the street.
|
||||
- [x] Steps rose away from the door; treads now rise toward the entrance.
|
||||
- [x] Event scheduler was polled every physics frame (~60 Hz), spawning >1200 NPCs in
|
||||
seconds. `ShiftCoordinator` now accumulates time and pulls once per simulated second;
|
||||
regression test in `test_scenarios.gd`.
|
||||
- [x] Live NPCs capped at `MAX_LIVE_NPCS` (16); routine traffic is dropped at the cap and a
|
||||
scripted event evicts the oldest unfocused NPC.
|
||||
- [x] Removed the skyline backdrop planes (opaque black texture). Tracked as a follow-up in
|
||||
`TODO.md`.
|
||||
- [x] README screenshots regenerated with the fixed eye height and entrance staging.
|
||||
Reference in new issue
Block a user