diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 058aa6c..612d924 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -7,6 +7,10 @@ on: pull_request: workflow_dispatch: +env: + GODOT_VERSION: "4.7.2" + GODOT_BIN: /usr/local/bin/godot + jobs: checks: name: Import + headless tests @@ -17,12 +21,23 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Install Godot 4.3 + - name: Restore Godot binary cache + uses: actions/cache@v4 + with: + path: /usr/local/bin/godot + key: godot-${{ runner.os }}-${{ env.GODOT_VERSION }}-v1 + + - name: Install Godot 4.7.2 run: | + if [ -x /usr/local/bin/godot ]; then + godot --version + exit 0 + fi curl -sL -o /tmp/godot.zip \ - https://github.com/godotengine/godot/releases/download/4.3-stable/Godot_v4.3-stable_linux.x86_64.zip + https://github.com/godotengine/godot/releases/download/4.7.2-stable/Godot_v4.7.2-stable_linux.x86_64.zip unzip -qo /tmp/godot.zip -d /tmp/godot-bin - sudo install /tmp/godot-bin/Godot_v4.3-stable_linux.x86_64 /usr/local/bin/godot + sudo install /tmp/godot-bin/Godot_v4.7.2-stable_linux.x86_64 /usr/local/bin/godot + godot --version - name: Import project (build class cache) run: godot --headless --import @@ -56,18 +71,38 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Install Godot 4.3 and export templates + - name: Restore Godot binary cache + uses: actions/cache@v4 + with: + path: /usr/local/bin/godot + key: godot-${{ runner.os }}-${{ env.GODOT_VERSION }}-v1 + + - name: Restore export templates cache + uses: actions/cache@v4 + with: + path: ~/.local/share/godot/export_templates/4.7.2.stable + key: godot-templates-${{ runner.os }}-${{ env.GODOT_VERSION }}-v1 + + - name: Install Godot 4.7.2 and export templates run: | - curl -sL -o /tmp/godot.zip \ - https://github.com/godotengine/godot/releases/download/4.3-stable/Godot_v4.3-stable_linux.x86_64.zip - unzip -qo /tmp/godot.zip -d /tmp/godot-bin - sudo install /tmp/godot-bin/Godot_v4.3-stable_linux.x86_64 /usr/local/bin/godot + if [ ! -x /usr/local/bin/godot ]; then + curl -sL -o /tmp/godot.zip \ + https://github.com/godotengine/godot/releases/download/4.7.2-stable/Godot_v4.7.2-stable_linux.x86_64.zip + unzip -qo /tmp/godot.zip -d /tmp/godot-bin + sudo install /tmp/godot-bin/Godot_v4.7.2-stable_linux.x86_64 /usr/local/bin/godot + fi + godot --version + if [ -f "$HOME/.local/share/godot/export_templates/4.7.2.stable/linux_release.x86_64" ]; then + ls "$HOME/.local/share/godot/export_templates/4.7.2.stable" | head -5 + exit 0 + fi curl -sL -o /tmp/templates.tpz \ - https://github.com/godotengine/godot/releases/download/4.3-stable/Godot_v4.3-stable_export_templates.tpz - mkdir -p ~/.local/share/godot/export_templates/4.3.stable - cd /tmp && rm -rf tpl && mkdir tpl && unzip -qo templates.tpz -d tpl - cp tpl/templates/* "$HOME/.local/share/godot/export_templates/4.3.stable/" 2>/dev/null || true - ls "$HOME/.local/share/godot/export_templates/4.3.stable" | head -5 + https://github.com/godotengine/godot/releases/download/4.7.2-stable/Godot_v4.7.2-stable_export_templates.tpz + rm -rf /tmp/tpl && mkdir -p /tmp/tpl + unzip -qo /tmp/templates.tpz -d /tmp/tpl + mkdir -p "$HOME/.local/share/godot/export_templates/4.7.2.stable" + cp /tmp/tpl/templates/* "$HOME/.local/share/godot/export_templates/4.7.2.stable/" + ls "$HOME/.local/share/godot/export_templates/4.7.2.stable" | head -5 - name: Import project run: godot --headless --import @@ -114,7 +149,7 @@ jobs: if: startsWith(github.ref, 'refs/tags/') env: # An explicit repo secret wins. Without one, publish_release.sh reuses - # the local git extraheader that actions/checkout configures for the job + # the local git extraheader that actions/checkout configures on the job # (the runner's own credentials), so tag builds still publish. GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} VERSION: ${{ github.ref_name }} diff --git a/MEMORY.md b/MEMORY.md index a712329..3d65807 100644 --- a/MEMORY.md +++ b/MEMORY.md @@ -33,17 +33,17 @@ Session memory for durable decisions, state, and gotchas. Keep concise, remove o `outfit_for`/`layer_for`/`hand_item_for` helpers. Blender = flatpak 5.2.0 LTS, sandbox cwd `/app/blender` → absolute paths for `--python`. CI stays offline (committed assets). -- Engine: Godot 4.3 stable (official editor build, `~/.local/bin/godot`). The system's preinstalled `godot-runner` (4.7.2, Fedora) cannot load projects from arbitrary paths because it was compiled without path overrides; use the official editor binary instead. +- Engine: Godot 4.7.2 stable (official editor build, `~/.local/bin/godot`). The system's preinstalled `godot-runner` cannot load projects from arbitrary paths because it was compiled without path overrides; use the official editor binary instead. - Language: GDScript. All cross-file references use explicit `preload()` constants (not `class_name` globals) so scripts compile in headless `--script` runs without the editor's class cache. - Test framework deviation: the project uses a custom minimal headless test runner (`src/test/test_runner.gd`) instead of GUT, because GUT needs the editor plugin. CI runs it with `--headless`. - Eventing: no autoload signal bus. `ShiftCoordinator` owns an `EventBus` instance (`src/core/event_bus.gd`) passed to subsystems; subsystems emit only when a bus is assigned. Autoloads at parse time are unreliable under `--script`. -- Static signals are not available in Godot 4.3 GDScript ("Expected func or var after static") — do not use them. +- Static signals are not available in Godot GDScript ("Expected func or var after static") — do not use them. - GDScript lambdas capture local variables **by value**; mutating a captured local inside a lambda does not affect the outer variable. Use member functions for accumulators in tests. - Shift length is the scenario's `shift_duration_s` (900 s in all three venues). Tests and the screenshot tool override elapsed time; they do not change the default. - RNG: NPC reactions and event scheduling are seedable for deterministic tests. - **Mouse look (v0.7.3):** guard look is handled in `GuardController._input()` (before GUI), not `_unhandled_input`; focus/click-back recaptures the cursor and the HUD is made mouse-transparent recursively. Regression tests cover yaw/pitch and HUD filters. -- **v0.9.0 production pass:** CI/release baseline remains Godot 4.3; local dev is 4.7.2 with the version-adaptive light falloff. Audio settings are `master_volume`/`sfx_volume`/`ambience_volume`; accessibility has `reduce_motion` and `captions_enabled` (HUD log is the caption surface). Budget smoke is 24 NPCs (6.94 ms headless). Coat/dress stride is scaled to 0.76 to reduce hem clipping. Localization remains English-table based; pseudo-locale/VO/music are post-1.0. +- **v0.9.0 production pass:** CI/release, local dev and project now use Godot 4.7.2; the version-adaptive light falloff remains for older editors. Audio settings are `master_volume`/`sfx_volume`/`ambience_volume`; accessibility has `reduce_motion` and `captions_enabled` (HUD log is the caption surface). Budget smoke is 24 NPCs (6.94 ms headless). Coat/dress stride is scaled to 0.76 to reduce hem clipping. Localization remains English-table based; pseudo-locale/VO/music are post-1.0. - **Radio submit fix (v0.8.1):** `RadioPanel.action_button` now connects `pressed` for normal reports; `button_down/up` remains exclusive to emergency hold-to-confirm. Regression test covers both modes. - **Campaign/v0.8.0:** `Campaign` owns Hollywood → Joke Shop → TV Studio progression. `campaign.json`, `shift_results.json`, `settings.json` and versioned `shift_state.json` persist separately; pause saves a checkpoint, review Continue advances, Settings resets with confirmation. Difficulty keys are `easy/normal/hard` (`ai_difficulty`); scripted QA bypasses tutorial unless `--tutorial` is passed. Help is searchable and generated from `InputBindings.REMAPPABLE`. - **Tutorial (0.8.0 work):** `docs/tutorial.md` is the eight-beat design; `src/game/tutorial.gd` is the pure state machine, `TutorialOverlay` is the non-blocking card, and `GameManager` wires it with a safe visitor, suppressed spawns, persisted completion/skip and Settings replay. Scripted test/capture runs bypass it unless `--tutorial` is passed; `smoke_tutorial.gd` covers completion/replay/skip. @@ -58,13 +58,12 @@ Session memory for durable decisions, state, and gotchas. Keep concise, remove o binaries + override into `gig-line-desktop-hq-.zip`; `publish_release.sh` uploads it when present. A/B report: `docs/screens/realism/2026-11-01-forward-plus/` (entrance gap 1.568→1.187). -- **Local Godot toolchain (2026-11-01):** `~/.local/bin/godot` is 4.7.2 stable; - 4.3 stable is kept as `~/.local/bin/godot-4.3.stable`. Export templates for - 4.7.2 are installed under `~/.local/share/godot/export_templates/4.7.2.stable` - (4.3 remains). The project and CI still pin 4.3 in `project.godot`/the Gitea - workflow; 4.7.2 imports, runs the 231-test suite, session-shell smoke and a - Linux export successfully. Godot 4.7 writes `*.gd.uid` files; they are kept - out of this clone's status via `.git/info/exclude` until the project upgrades. +- **Godot toolchain (updated 2026-11-01):** local `~/.local/bin/godot`, CI and + `project.godot` now use Godot 4.7.2; 4.3 remains only as a local backup binary. + Export templates for 4.7.2 are installed under + `~/.local/share/godot/export_templates/4.7.2.stable`. Godot 4.7 writes + `*.gd.uid` files; they are kept out of this clone's status via + `.git/info/exclude`. CI caches the binary/templates with Gitea Actions cache. - **Blender invocation (v0.6.0):** `flatpak run org.blender.Blender --background --python /run/media/system/DATA/Documents/06-games/security-game/tools/npc_pipeline.py -- build`. The flatpak cannot read `/tmp`; use absolute repo paths. `assets/models/npc/.gdignore` is @@ -145,7 +144,7 @@ Session memory for durable decisions, state, and gotchas. Keep concise, remove o `npc_pipeline.py` + `asset_pipeline.py` and the confirmed-asset locations. - Repo: `/run/media/system/DATA/Documents/06-games/security-game` (also reachable at - `/var/home/zwitschi/Documents/06-games/security-game`). Godot: `~/.local/bin/godot` (4.3.stable). + `/var/home/zwitschi/Documents/06-games/security-game`). Godot: `~/.local/bin/godot` (4.7.2). Tests: `godot --headless --path . --script res://src/test/test_runner.gd` → **177/177**. Python tooling tests: `cd tools && python3 -m unittest test_asset_pipeline test_screen_designs test_model_pipeline` → **53**. Session shell smoke: `godot --headless --path . --script res://src/test/smoke_session_shell.gd` → exit 0. @@ -194,7 +193,7 @@ Session memory for durable decisions, state, and gotchas. Keep concise, remove o joke_shop 700 s / studio 700 s; `--stages=` subset) and swaps textures by the material's *original* albedo path. **Gotcha:** in the SceneTree script, do not overwrite `_phase` after `_begin_stage()` sets `done`, or the run loops forever between stage/shoot (`_queue` empty). - **Gotcha:** `elapsed_s = 620` is *Evening* (dusk), 700+ is Late. Godot 4.3 + **Gotcha:** `elapsed_s = 620` is *Evening* (dusk), 700+ is Late. Godot 4.7 `StandardMaterial3D` has no `fog_enabled`; the skyline is a `ShaderMaterial` with `render_mode unshaded, cull_disabled, fog_disabled` + `ALPHA_SCISSOR_THRESHOLD` so the panorama's own haze shows. Backdrop plane is 90 m tall with 2 UV repeats (~200×90 m per @@ -577,8 +576,9 @@ Session memory for durable decisions, state, and gotchas. Keep concise, remove o - Venue cycling: `V` switches Hollywood Blvd → The Joke Shop → TV Studio and restarts the shift. - Venue door-staff dialogue: `VenueScenario.door_staff_line(context, rng)` and GameManager logging (id/ticket/wand-check, refusal, prohibited-item) — Joke Shop flavor. -- CI cache: `.gitea/workflows/build.yml` no longer uses `actions/cache` (the runner can't reach - the GitHub cache service; import is fast). `GODOT_SILENCE_ROOT_WARNING=1` set on jobs. +- CI cache: `.gitea/workflows/build.yml` caches `/usr/local/bin/godot` and the + 4.7.2 export templates with Gitea Actions cache. `GODOT_SILENCE_ROOT_WARNING=1` + is set on jobs. Logs live in `.gitea/logs/` after each run. - Visual polish (v0.2.0): phase lighting (GameManager.PHASE_LIGHTING + ProceduralSkyMaterial), street lamps + night mode in WorldBuilder.set_night_mode, marquee Label3D, crosswalk/planters/ diff --git a/PLAN.md b/PLAN.md index 33af52c..4300bf4 100644 --- a/PLAN.md +++ b/PLAN.md @@ -159,7 +159,7 @@ Primary decisions: [ADR-0007](docs/adr/0007-locomotion-and-input-layers.md), [AD ## Tech Stack -- **Engine:** Godot 4.3 baseline (local dev verified with 4.7.2), GL Compatibility renderer (Web parity); optional Forward+ Desktop HQ build. +- **Engine:** Godot 4.7.2, GL Compatibility renderer (Web parity); optional Forward+ Desktop HQ build. - **Language:** GDScript. - **Architecture:** venue-driven simulation; shared systems plus `Resource`-based scenario data. - **Navigation:** `NavigationRegion3D` / `NavigationAgent3D`. diff --git a/README.md b/README.md index d1166fc..5c9dd0d 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ decisions are recorded as ADRs in [`docs/adr/`](docs/adr/). ## Tech Stack -- **Engine:** Godot 4.3 baseline (local dev verified with 4.7.2) · **Language:** GDScript +- **Engine:** Godot 4.7.2 · **Language:** GDScript - **NPCs:** Blender-authored skinned library (`assets/models/blender/`) with procedural fallbacks; lightweight FSMs on `NpcProfile` - **World:** procedural `WorldBuilder` + generated prop models - **Art:** v2 skyline/surface textures in `assets/textures/ai/game_ready/v2/picks/`; UI/scene art in `assets/images/` @@ -119,7 +119,7 @@ Full setup, every run/test/smoke command, and the controls table are in ## Development Status v0.9.0 adds the production-quality baseline: mixer/accessibility settings, a -24-NPC performance budget and the documented Godot 4.3-CI/4.7-local matrix, on +24-NPC performance budget and the unified Godot 4.7.2 toolchain, on top of v0.8's tutorial, campaign, checkpoint resume, difficulty and Help. See [`docs/development-status.md`](docs/development-status.md) for the implemented list and [`TODO.md`](TODO.md) for the v1.0.0 roadmap. Manual verification uses diff --git a/docs/RELEASING.md b/docs/RELEASING.md index 543f58e..8c0fae1 100644 --- a/docs/RELEASING.md +++ b/docs/RELEASING.md @@ -12,11 +12,11 @@ time you export, either: matching templates), or - Install them manually from the [Godot downloads](https://godotengine.org/download/) page by placing the - `Godot_v4.3-stable_export_templates.tpz` contents into - `~/.local/share/godot/export_templates/4.3.stable/`. + `Godot_v4.7.2-stable_export_templates.tpz` contents into + `~/.local/share/godot/export_templates/4.7.2.stable/`. -The templates must match the editor binary you use locally. CI pins Godot 4.3; -the local development machine uses 4.7.2 with its matching templates. Verify with: +The templates must match the editor binary you use locally. CI and local +development both use Godot 4.7.2 with its matching templates. Verify with: ```bash godot --headless --export-release "Linux" build/gig-line-smoke.x86_64 @@ -31,7 +31,7 @@ godot --headless --export-release "Linux" build/gig-line-smoke.x86_64 The repository ships a Gitea Actions workflow (`.gitea/workflows/build.yml`): -- Every push/PR runs the **checks** job: Godot 4.3 install, project import, and the +- Every push/PR runs the **checks** job: Godot 4.7.2 install, project import, and the full headless test suite. This is the fast safety net. - **Tags (`v*`)** and **manual `workflow_dispatch`** runs additionally execute the **build** job: export templates install, import, `tools/build_releases.sh` for @@ -63,10 +63,10 @@ setup, so do not rely on it. > artifacts. If CI publishing fails again, run > `./tools/publish_release.sh ` from a checkout with `~/.git-credentials`. -> **No `actions/cache` for now:** the runner has no local actions-cache service, so -> `actions/cache` times out against GitHub's cache API. We dropped it (Godot import -> is only ~4s). If a host admin later enables Gitea `[cache.actions]` with a cache -> server, the step can be reintroduced. +> **Godot cache:** the workflow uses Gitea Actions cache for the Godot binary and the +> 4.7.2 export templates. The first run still downloads them; subsequent runs restore +> from cache. If the host cache service is unavailable, remove the cache steps and +> let the install steps download fresh copies. > The workflow lives in `.gitea/workflows/` (Gitea's canonical path). The old > `.github/workflows/ci.yml` was removed to avoid double runs on hosts that scan diff --git a/docs/architecture.md b/docs/architecture.md index 6fbd871..417a653 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -25,7 +25,7 @@ This document follows the structure of the arc42 architecture documentation temp ## 2. Constraints - The first implementation should be small enough for a playable vertical slice. -- The engine is Godot 4 with GDScript; a playable prototype vertical slice is implemented. CI pins Godot 4.3 while local development is verified with 4.7.2; the default renderer stays GL Compatibility for Web parity, with an optional Forward+ Desktop HQ build. +- The engine is Godot 4.7.2 with GDScript; a playable prototype vertical slice is implemented. CI, local development and exported builds use 4.7.2; the default renderer stays GL Compatibility for Web parity, with an optional Forward+ Desktop HQ build. - Venue-specific policies must be configurable rather than hard-coded into individual NPCs. - The game must preserve the de-escalation-first design described in [`PLAN.md`](../PLAN.md). - The project uses the repository workflow described in [`AGENTS.md`](../AGENTS.md). @@ -180,7 +180,7 @@ reputation, crowd reaction and shift review read it rather than resolving gamepl ## 7. Deployment View -The game is a single-player local client containing presentation, simulation, rules, content, and persistence for local settings and shift results. No online backend is required. A non-threaded Web export ships alongside the desktop builds and can be served from any static host without special headers. The default renderer is GL Compatibility; an optional Desktop HQ zip uses Forward+ with volumetric fog/SDFGI on Vulkan-capable desktops. CI pins Godot 4.3 while local development is verified with 4.7.2, so the light falloff path is version-adaptive until the baseline is unified. +The game is a single-player local client containing presentation, simulation, rules, content, and persistence for local settings and shift results. No online backend is required. A non-threaded Web export ships alongside the desktop builds and can be served from any static host without special headers. The default renderer is GL Compatibility; an optional Desktop HQ zip uses Forward+ with volumetric fog/SDFGI on Vulkan-capable desktops. CI, local development and exported builds use Godot 4.7.2; the light-falloff code keeps a compatibility branch for older editors but the supported baseline is unified. Future options include external analytics, cloud saves, or replay sharing, but they are not part of the current architecture. @@ -188,7 +188,7 @@ Future options include external analytics, cloud saves, or replay sharing, but t A continuous-integration pipeline keeps the headless test suite green on every change and publishes tagged releases. -- **Workflow:** `.gitea/workflows/build.yml` runs on pushes, pull requests, tags, and manual dispatches. The `checks` job installs Godot 4.3, imports the project, and runs `res://src/test/test_runner.gd`; it fails on a non-zero exit code or any `SCRIPT ERROR` in the output. +- **Workflow:** `.gitea/workflows/build.yml` runs on pushes, pull requests, tags, and manual dispatches. The `checks` job restores/caches Godot 4.7.2, imports the project, and runs `res://src/test/test_runner.gd`; it fails on a non-zero exit code or any `SCRIPT ERROR` in the output. - **Build job:** runs for tags and manual dispatches. It installs export templates, exports Linux/Windows/macOS and the non-threaded Web build, packages the NSIS installer, Linux AppImage and optional Desktop HQ zip, verifies the installer contents, and uploads the artifacts. - **Publish job:** tag builds call `tools/publish_release.sh` to create the Gitea release and upload the standard artifacts plus the optional Desktop HQ zip. The script uses `GITEA_TOKEN` when configured and otherwise reuses the runner's checkout extraheader credentials. - **Hosting:** the repository lives on Gitea (`https://git.allucanget.biz/zwitschi/security-game`). Export templates must match the pinned Godot version; macOS builds are unsigned and need quarantine guidance or notarization for wider distribution. @@ -219,7 +219,7 @@ The release process is: bump the version, run the full test suite and `tools/che - **Asset provenance and AI usage:** AI-assisted images/concepts are development inputs only; validated outputs are committed, audited and loaded through the same runtime asset contracts. Generated content must not become an offline/CI dependency. - **Campaign and checkpoint state:** `Campaign` owns venue order/progression; settings, campaign, completed shift history and a versioned pause checkpoint are separate JSON documents. The checkpoint snapshots coordinator systems, scheduler RNG and NPC presentation/access state; it deliberately does not serialize the tutorial overlay or transient input state. - **Difficulty:** easy/normal/hard only scale spawn pacing, NPC compliance tolerance and report-credibility strictness; access/escalation rules and emergency rarity are invariant. -- **Settings and accessibility:** volume/motion/caption settings persist through `settings.json`; Help is generated from the input-binding catalogue and the HUD log is the text caption surface. The supported engine matrix is explicit (CI/release 4.3, local 4.7.2) rather than an implicit version drift. +- **Settings and accessibility:** volume/motion/caption settings persist through `settings.json`; Help is generated from the input-binding catalogue and the HUD log is the text caption surface. CI/release, local development and exported builds are unified on Godot 4.7.2. - **Documentation ownership:** `PLAN.md` owns design intent; `docs/gameplay.md` owns playable mechanics; `docs/architecture.md` owns system boundaries, data flow, constraints and cross-cutting decisions; ADRs own decision history; `docs/development-status.md` owns the implemented/gap list; `TODO.md` owns the roadmap; `MEMORY.md` owns gotchas and open questions. Specialized docs link to these rather than becoming competing sources of truth. ## 9. Architecture Decisions @@ -264,7 +264,7 @@ Architecture decisions are recorded as ADRs: - Mental-health-crisis scenarios require careful writing, playtesting, and respectful presentation. - The choice of engine may affect navigation, crowd scale, tooling, and content authoring. - Reference mockups can outpace the runtime art style; compare/judge catch gross drift but not composition errors, so the staged gallery needs human review after large visual changes. -- Godot version skew (CI 4.3 vs local 4.7.2) can change lighting, import sidecars and generated UIDs; a single supported version and a visual smoke matrix are required before 1.0. +- Godot 4.7.2 is the unified CI/local/project baseline; future engine bumps still require import, visual and export smoke checks before changing that baseline. - Content volume and authoring tools are still thin; adding venues/events by editing the factory can become error-prone without schema validation and preview tooling. - Save data currently covers settings and shift history, not mid-shift resume; adding saves/replays requires a versioned schema and migration policy. - The optional judge and image-generation paths depend on an external key, model availability and budget; CI cannot make them a release gate, and keys must never be committed. diff --git a/docs/development-status.md b/docs/development-status.md index 2ed0996..1b77293 100644 --- a/docs/development-status.md +++ b/docs/development-status.md @@ -2,7 +2,7 @@ Implemented so far: -- Godot 4.3 project scaffold, input map, procedural world builder +- Godot 4.7.2 project scaffold, input map, procedural world builder - Venue-driven simulation core: `ShiftCoordinator`, `VenueScenario`, `EventScheduler`, `NPCController` + FSM, `AccessVerifier`, `EscalationManager`, `RadioSystem`, `IncidentRecorder`, `ReputationEvaluator`, `CrowdSystem` - Three authored scenarios (Hollywood Boulevard building, The Joke Shop, Late Night TV Studio) with access policies, NPC archetypes, and event pools - Headless unit tests: **250 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, `.tres` venue 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) @@ -41,7 +41,7 @@ Implemented so far: - 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. - 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 visible additive flashlight beam, and refreshed staging captures. `tools/check_screenshots.sh` is the repeatable capture/compare gate; judge is clean of `diff` verdicts. - 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 an explicit Godot 4.3-CI/4.7-local support matrix with documented upgrade/rollback requirements. +- 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 `--tutorial` is 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 `--tutorial` is passed; `smoke_tutorial.gd` covers 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). diff --git a/docs/getting-started.md b/docs/getting-started.md index 2d6a0b5..6de7cda 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -2,7 +2,7 @@ ## Setup -1. Download the Godot 4.3+ editor (official build) and put `godot` on your PATH. The supported policy is an explicit matrix: CI/release baseline 4.3, local development verified with 4.7.2. Engine upgrades require import, headless, screenshot and Desktop HQ smoke checks before changing the baseline. +1. Download Godot **4.7.2** (official build) and put `godot` on your PATH. The project, local tooling and CI use the same version; engine upgrades require import, headless, screenshot and Desktop HQ smoke checks before changing the baseline. 2. Open or run the project from this directory. ## Run and Test diff --git a/docs/smoke-checklist.md b/docs/smoke-checklist.md index 75a625e..b951787 100644 --- a/docs/smoke-checklist.md +++ b/docs/smoke-checklist.md @@ -39,4 +39,4 @@ 37. The F debug overlay lists the next eligible events; recovery events and recently played scripted events behave as authored. 38. Master/SFX/ambience volume settings clamp at 0/1 and persist; Reduce motion disables head bob; the captions toggle persists. 39. The 24-NPC budget smoke stays inside its frame budget; coats/dresses do not show obvious leg clipping in a normal walk. -40. Help remains readable with the largest HUD font scale, and the engine matrix (4.3 CI / 4.7.2 local) is used for verification. +40. Help remains readable with the largest HUD font scale, and CI/local verification use the same Godot 4.7.2 baseline. diff --git a/project.godot b/project.godot index 25c270b..cfcd7d1 100644 --- a/project.godot +++ b/project.godot @@ -14,7 +14,7 @@ config/name="Gig Line" config/description="Workplace security simulation about observation, access verification, and proportionate escalation." config/version="0.9.0" run/main_scene="res://scenes/main.tscn" -config/features=PackedStringArray("4.3", "GL Compatibility") +config/features=PackedStringArray("4.7", "GL Compatibility") [autoload] diff --git a/tools/build_releases.sh b/tools/build_releases.sh index d24a05c..746a8e2 100755 --- a/tools/build_releases.sh +++ b/tools/build_releases.sh @@ -2,7 +2,7 @@ # Build distributable desktop executables with the Godot export pipeline. # # Requirements: -# - Godot 4.3 (or the version in project.godot `config/features`) on PATH, +# - Godot 4.7.2 (or the version in project.godot `config/features`) on PATH, # with export templates installed (see docs/RELEASING.md). # - Run from the repository root. #