Rendering and presentation
- Shared surface-material module (src/game/materials.gd) with per-surface
roughness/metallic/uv profiles; ACES tonemapping, glow, fog and phase-driven sky
energy. WorldBuilder rebuilt on those profiles with facade windows that light up,
door trim/handles, curb, lane dashes, bollards, bench, bin and planter foliage.
- NPC silhouettes: per-role clothing palettes, caps/hoods/backpacks/sunglasses,
hands and shoes, arm/leg walk swing.
- Six generated low-poly GLB props (bollards, bench, bin, planter, newspaper box,
hydrant) built by tools/model_pipeline.py, loaded by WorldBuilder with a
procedural fallback; ADR-0012.
Selection and movement
- Focus ranking by view angle then distance (NpcFocus.rank_indices); Tab and the
mouse wheel cycle nearby people initially, right click clears focus with a
re-acquire grace, HUD shows the candidate count, Shift walks at half speed.
ADR-0011. Windowed smoke extended to cover wheel cycling and clearing.
QA tooling
- screen_designs.py catalogue grown to 19 screens (8 scene, 11 UI) plus a `list`
subcommand; draft generation keeps existing AI references unless --force.
Web export
- New Web preset using the non-threaded Godot template (static hosting, no
COOP/COEP). tools/build_releases.sh exports build/web and packages
build/step-line-web-<ver>.zip; publish_release.sh uploads it with the desktop
artifacts. test_web_export.gd covers the preset and release wiring.
Verification
- Headless suite 177 -> 181, Python tooling 53 tests, all eight smokes pass
(including the windowed focus/wheel smoke). Web bundle serves index.html,
index.wasm (35 MB) and index.pck (30 MB) with HTTP 200 from a static server.
- Version 0.3.0; README, PLAN, RELEASING, TODO/DONE and MEMORY updated.
NPC navigation (previously dead in the live game)
- Only assign NavigationAgent3D.target_position when it changes: re-assigning every
frame invalidated the path, so get_next_path_position() kept returning the current
point and avatars never moved.
- Follow the first path point that is closer to the destination than the avatars are.
Nav points sit on the navmesh plane (y=0) while bodies stand at y~0.5, so the old
3D distance test always looked "already there"; path[0] is also the old start point,
so a naive "far enough away" pick steered backwards and oscillated.
- Fix fsm.state -> fsm.current_state in the idle-lifetime check.
Crowd presentation
- Aggressive behavior, visible weapons, and responder arrivals make idle bystanders
stop and face the incident for 12 s; someone waiting at the entrance keeps focus.
- Panic (mood >= 0.75) walks people away from the door at 2.4 m/s, then they despawn.
- Wire reactions to EventBus.crowd_changed: CrowdSystem.apply_event() emits on the bus,
not on its own `changed` signal (the first wiring received nothing).
- Measured a 16-NPC entrance at ~1.2 ms/frame (824 fps, vsync off), so no LOD/culling.
World and HUD
- Skyline is now a ring of four alpha-scissored planes at 200 m instead of a single
plane; PlaneMesh defaults to horizontal, which is why the backdrop rendered as a band
overhead. Larger ground plane, mipmapped texture, scissor threshold 0.5 (0.3 left
mip dashes in the sky), lifted albedo so the city is not pure black.
- Flashlight aims straight ahead and lights the person/door instead of the ground.
- Shorter HUD controls line so it stops overlapping itself.
Tests, tooling, docs
- Headless suite 98 -> 105 (new test_crowd_presentation.gd, 7 tests).
- New smoke_crowd.gd: rubbernecking, panic, and flee-target sanity.
- capture_screenshots.gd starts a shift from the venue menu and stages the night set
properly; all six README screenshots regenerated.
- README, TODO/DONE (crowd section moved), MEMORY updated. Version 0.2.4.
- 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.
- makensis resolves relative -DICON/-DARTIFACT against the script directory,
so CI now passes $PWD-based absolute paths (reproduced locally in the same
ubuntu:24.04 container; installer builds, 7z shows step-line.exe +
uninstall.exe)
- Install as step-line.exe (no spaces: NSIS /oname splits on whitespace)
- OutFile overridable via -DOUT
- tools/generate_textures.py icon.ico now produced via ImageMagick with
classic BMP entries (NSIS-compatible); PIL PNG-compressed ICOs rejected by
NSIS
- Phase-based lighting: sun direction/energy/color, ProceduralSkyMaterial
gradient, and ambient per shift phase (GameManager.PHASE_LIGHTING),
applied on phase transitions and shift start
- WorldBuilder: street lamp poles with emissive bulbs + OmniLights,
set_night_mode(), glowing STEP LINE marquee (Label3D + emissive bars),
crosswalk stripes, planters, low-poly street trees
- NPC avatars: per-seed height/brightness variation (deterministic LCG)
- Denser routine traffic probabilities
- capture_screenshots.gd: fast-forward to LATE phase and capture night set;
README gallery is now 2x3 day+night; docs/screenshots regenerated
- Version bumped to 0.2.0; build/ artifacts rebuilt; Linux binary smoke-tested
- New headless tests for phased lighting config and street dressing (56 total)
- Delete Rules.Tone/TONE_NAMES, NpcProfile.tone_modifiers, tone params on
NPCController.roll_reaction/apply_player_action; dialogue_lines flattened
to Array[String]; HUD tone label, T binding, and hud.tone_prefix removed
- Docs updated everywhere (PLAN, README, DONE, MEMORY); PLAN section heading
'Tone and Design Direction' -> 'Design Direction'
- Add .gitea/workflows/build.yml: checks job (import+tests) on push/PR; full
build job (export templates, Linux/Windows/macOS exports, artifact upload,
and tag-based Gitea release publish via GITEA_TOKEN) on tags/dispatch
- Remove old .github/workflows/ci.yml to avoid double runs
- Add venue cycling (V) across all three scenarios with hud.venue_switched
- Refresh README screenshots to match the new HUD
- 53/53 tests pass, boot smoke clean
- New capture tool src/test/capture_screenshots.gd (windowed, staged:
venue overview, targeting an NPC, access inspection, radio report)
- Generated shots saved to docs/screenshots/ and embedded as a 2x2 gallery
in README above the Downloads section