- 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.
Control pass (ADRs 0007-0010) stays first. Added the holes the audit found:
venue-correct access artifacts (override_access unread), session shell,
leftover PLAN verbs, crowd rubberneck, emergency aftermath, replay, NPC
poses, real ambience, a few Joke Shop/Studio events, and doc drift.
Host sign-in remains deferred. Generated-asset integration stays out
(already in DONE).
- 0007: input layers so WASD/look never fire person-verbs; freeze while modal
- 0008: cone focus + billboarded head ring; no type names in the world
- 0009: doughnut action menu (LMB/Space open, click or A/D then Space, Esc/RMB
cancel); emergency stays on R
- 0010: keep procedural rigs, add face/hair/neck; no Mixamo this pass
Linked from architecture.md, PLAN.md, TODO.md, MEMORY.md.
Document the next playable pass: WASD/look stop fighting action keys, cone
focus with a billboarded head ring, doughnut HUD opened by LMB or Space
(click or A/D then Space to confirm, Esc/RMB cancel). Emergency stays on R.
Wand leaves W. NPC rigs stay procedural but get a face/hair/neck. Host
REQUIRE_SIGNIN_VIEW follow-up deferred.
- Script uploaded only the three portable binaries; v0.2.1 release was
missing step-line-setup-0.2.1.exe and the AppImage. Now uploads the full
set (extras when present), reuses existing releases (adds missing assets),
and falls back to ~/.git-credentials basic auth when GITEA_TOKEN is unset
- Back-filled both missing assets onto the live v0.2.1 release via API
(release now carries all 5 artifacts)
- TODO/RELEASING/MEMORY document the findings and the host admin steps for
anonymous downloads ([service] REQUIRE_SIGNIN_VIEW)
- CI run 1110 proved NSIS + AppImage packaging and published v0.2.1
(installers uploaded); Mark TODO installer/appimage items done (moved to
DONE.md), README Latest -> v0.2.1, MEMORY records NSIS -D/absolute-path/
BMP-ICO gotchas and appstreamcli strictness
- 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
- Regenerate icon.ico with classic BMP entries (16/32/48) — PNG-compressed
ICO entries can fail NSIS' icon loader on some builds
- CI copies assets/textures/icon.ico onto the packaging path right before
makensis, removing any stale/missing-copy failures
- Recreate v0.2.1 tag after this fix
- AppImage validation now passes appstreamcli --pedantic locally; builds with
metainfo named net.stepline.game.appdata.xml + desktop in usr/share/applications
- Add a 'Verify Windows installer contents' step (7z l shows Step Line.exe +
uninstall.exe) so the TODO verification items are proven by CI output
- Rebuild 0.2.1 binaries (embedded PCK) and AppImage locally; smoke clean;
57/57 tests
- tools/generate_textures.py: --ai mode (OPENROUTER_API_KEY, --prompt,
--name, --model, --size; base64 PNG decode; clamp to <=1024px) with a
default batch covering the authored texture set; seedream minimum-size
handled by requesting 2048 and downscaling
- Generated AI asset set committed under assets/textures/ai/ (15 files,
1024x1024 each), kept separate from the deterministic PIL set
- README/MEMORY/TODO document the mode and live verification
- (work authored in a parallel session; linted/verified here — 57/57 tests)
- FSM holds owner via WeakRef; ShiftCoordinator is RefCounted (logic-only);
persistence tests free the Save node -> test suite exits with zero
'resources still in use' warnings (was ~13) and 57/57 pass
- GameManager uses each scenario's shift_duration_s (900s ~ 10-15 min) for
real shifts instead of the 300s test duration
- Wand screening gets a 0.8s recharge cooldown with a wand.recharge message
- TODO/DONE/MEMORY/README synced
- Tag v0.2.0 pushed; Gitea Actions build job exported Linux/Windows/macOS
and published the release via the host's GITEA_TOKEN secret (CI run 1095:
'Release live: .../releases/tag/v0.2.0', Job succeeded)
- Verified tag page + /releases are public (HTTP 200); anonymous asset
downloads require sign-in on the host (tracked as host-config follow-up)
- TODO cleaned per AGENTS.md; PRIORITY section moved to DONE.md
- README Downloads notes v0.2.0 live + sign-in caveat; MEMORY updated
- TODO.md: drop fully-done sections (CI cache mitigation, Detailed Graphics
completed items, CI packaging follow-up — all recorded in DONE.md); keep the
PRIORITY release task (token-blocked), backlog, polish, and perf-only items
- Rebuild build/ artifacts so the shipped graphics include textures/rigs/HUD
- Linux binary smoke-tested (0 script errors); suite 57/57
- 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)
- Mark cache-timeout fix verified (run 1090: zero CacheService lines,
54/54 tests, job succeeded)
- Ignore .gitea/logs/ (runner writes logs into the checkout)
- Leave collaborator's radio-easter-egg changes in the working tree
(strings.en.json, game_manager.gd) uncommitted for review
- 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)
- 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
- Install Godot 4.3 export templates locally and fix macOS export
(enable rendering/textures/vram_compression/import_etc2_astc)
- Build Linux/Windows/macOS artifacts into build/ via tools/build_releases.sh;
Linux binary passes headless smoke test
- Add tools/publish_release.sh (creates Gitea release + uploads assets with a token)
- TODO: mark build/install steps done; publishing v0.1.0 + link verification
remain as the single action blocker (needs GITEA_TOKEN)
- Fix LATE shift phase (start 700s) so the violent-threat event is reachable
- Add PROTESTER archetype (rules, profile, colors, events in public venues)
- Add CALL_SOMEONE reaction (FSM -> ARGUING, influencer/trespasser/protester weights)
- Door lock: DoorState core class, L binding, red/green visual indicator,
locked doors thwart FORCE_ENTRY
- Flashlight: G binding, SpotLight3D, perception radius bonus at evening/late
- Persistence: save shift results via Save autoload, history + best score on
review screen, round-trip test
- Navigation: flat NavigationRegion3D navmesh, NavigationAgent3D path following
with direct-movement fallback; steps made visual-only so NPCs reach entrance
- Localization: strings moved to content/strings.en.json (loader keeps
lookup/fmt signatures; coverage test over all keys)
- Distribution: export_presets.cfg (Linux/Windows/macOS), tools/build_releases.sh,
docs/RELEASING.md, prominent README Downloads section
- Remove stale signal_bus.gd (invalid static-signal experiment)
- Tests: 53 passing across 9 suites
- Introduced README.md outlining game concept, mechanics, and planned venues.
- Added ADRs for venue-driven architecture, de-escalation-first model, explicit access verification, local single-player focus, event-based incident recording, and choice of Godot 4 with GDScript.