diff --git a/MEMORY.md b/MEMORY.md index 5d3bd9c..53ca3c7 100644 --- a/MEMORY.md +++ b/MEMORY.md @@ -56,6 +56,16 @@ Session memory for durable decisions, state, and gotchas. Keep concise, remove o `--variants N` — generates N alternatives saved as `-1..N.png` (N=1 keeps the unsuffixed path). Python tooling tests still pass (exit 0). +- **Screenshots + docs (2026-11-01):** regenerated the eleven README captures + (`capture_screenshots.gd` + `capture_prop_gallery.gd`) — ten changed, the + prop gallery is byte-identical (props unchanged). README gained an NPC + character-model subsection, a "Confirmed game assets" section (linked + `game_ready` textures, generated models, NPC maps), and refreshed + dev-status / not-yet lines; `docs/architecture.md` Level 2 now lists + `npc_pipeline.py` + `asset_pipeline.py` and the confirmed-asset locations. + **Foreign, left uncommitted:** a TODO section "Bug Fix NPCs walking backwards" + from another agent — do not touch or commit it. + - 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). Tests: `godot --headless --path . --script res://src/test/test_runner.gd` → **177/177**. diff --git a/README.md b/README.md index d2ac2cd..974b39e 100644 --- a/README.md +++ b/README.md @@ -144,7 +144,7 @@ The architecture maps onto Godot 4 nodes, scenes, and custom resources as descri - **NPC behavior:** Custom lightweight finite state machines driven by `NpcProfile` resources - **UI and audio:** Godot `Control` nodes, themes, audio buses, and `AudioStreamPlayer` nodes - **Art assets:** authored PNGs and the in-game generated set in `assets/textures/ai/game_ready/`; street-furniture models in `assets/models/generated/` build from `tools/model_pipeline.py`; structural geometry stays procedural (`WorldBuilder`). The legacy `tools/generate_textures.py --ai` batch remains available. -- **Asset tooling:** `tools/asset_pipeline.py` generates role-aware assets through OpenRouter and provides crop, resize, seamless-tile, and image-audit commands, including gameplay screenshot checks. `tools/model_pipeline.py` builds and audits the prop `.glb` models. +- **Asset tooling:** `tools/asset_pipeline.py` generates role-aware assets through OpenRouter (`--variants N` produces alternative images) and provides crop, resize, seamless-tile, and image-audit commands, including gameplay screenshot checks. `tools/model_pipeline.py` builds and audits the street-prop `.glb` models; `tools/npc_pipeline.py` builds and audits the skinned NPC base model. - **Testing:** GUT (Godot Unit Test) in headless mode - **Source control:** git on a Gitea host with Gitea Actions (`.gitea/workflows/build.yml`) for headless tests and desktop release builds - **Targets:** Windows, Linux, and macOS desktop first; web later @@ -221,6 +221,57 @@ Surface materials share one definition in `src/game/materials.gd`: named roughness/metallic profiles per surface, plus the environment tune-up (ACES tonemapping, glow, fog, colour grading) that the phase lighting applies. +### NPC character model + +NPCs are moving from the procedural capsule rig to a skinned, UV-mapped base +character authored in Blender ([ADR-0013](docs/adr/0013-blender-authored-npc-characters.md)). +`tools/npc_pipeline.py` builds `assets/models/generated/npc_base.glb` plus the +per-slot material maps, and `NpcAvatar` keeps the procedural rig as the offline +fallback until the model is wired in (see the [graphics plan](docs/plan-graphics-v0.6.md)). + +```bash +# Print the frozen contract (slots, bone names, triangle budget) +python3 tools/npc_pipeline.py list + +# Rebuild the skinned base mesh + neutral maps in Blender and validate it +flatpak run org.blender.Blender --background --python "$PWD/tools/npc_pipeline.py" -- build +python3 tools/npc_pipeline.py audit + +# Layer the AI clothing albedos (shirt/trousers) over the procedural weave, and +# derive per-fabric outfit colours for the avatar palette +python3 tools/npc_pipeline.py prepare +python3 tools/npc_pipeline.py palette +``` + +`prepare` resizes the AI fabric tiles (kept locally in `assets/textures/npc/ai/`, +which is gitignored) onto the `cloth`/`pants` albedos; `build` bakes them into the +`.glb` and regenerates the procedural normal + packed ORM maps. `palette` writes +`assets/textures/npc/palette.json` using `model_pipeline.dominant_colors`. + +### Confirmed game assets + +Everything below is audited and shipped in the game; development-only outputs +(AI concept sheets, Blender sources, raw AI fabrics) are gitignored. + +| | | +| --- | --- | +| ![brick facade](assets/textures/ai/game_ready/brick_facade.png) | ![concrete](assets/textures/ai/game_ready/concrete.png) | +| ![asphalt](assets/textures/ai/game_ready/asphalt.png) | ![awning](assets/textures/ai/game_ready/awning.png) | +| ![skyline](assets/textures/ai/game_ready/skyline.png) | ![vignette](assets/textures/ai/game_ready/vignette.png) | + +- **Surface textures:** the six tiles above, loaded by `src/game/materials.gd` and `WorldBuilder`. +- **UI art:** `assets/textures/ai/game_ready/icons/` (flashlight, door lock, wand, REC) and `assets/textures/ai/game_ready/cards/` (ID, wristband, ticket, credential, guest list), loaded by `src/game/ui/hud.gd`. +- **Generated models:** `assets/models/generated/*.glb` — bollard, bench, trash bin, planter, newspaper box, hydrant, and the NPC base — plus their colour atlases. +- **NPC material maps:** `assets/textures/npc/*_{albedo,normal,orm}.png` and `palette.json`. + +Audit them all: + +```bash +python3 tools/asset_pipeline.py audit assets/textures/ai/game_ready +python3 tools/model_pipeline.py audit +python3 tools/npc_pipeline.py audit +``` + ### Screen design references Screen mockups and screenshot comparison use `tools/screen_designs.py`. It turns the @@ -428,10 +479,11 @@ Implemented so far: - 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.py` packs 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; `audit` enforces the contract - Generated prop models (v0.3.0 work): `tools/model_pipeline.py` builds bollards, benches, bins, planters, newspaper boxes and a hydrant as `.glb` props with per-part materials, loaded by `WorldBuilder` with a procedural fallback; the optional AI concept step (`model_pipeline.py concept`) supplies per-prop colour palettes +- NPC base model (v0.6.0 assets): `tools/npc_pipeline.py` builds a skinned, UV-mapped base character (`assets/models/generated/npc_base.glb`) with per-slot albedo/normal/ORM maps and an armature matching the procedural rig's node names; AI fabric albedos (shirt/trousers) and a derived `palette.json` are layered in. Runtime integration into `NpcAvatar` is pending, so the procedural rig still renders - Web build: `build/step-line-web-.zip` (Godot's non-threaded web template, no COOP/COEP headers needed) built by `tools/build_releases.sh` and published with the desktop artifacts; serve the unzipped folder from any static host - Aim-free selection pass (v0.3.0 work, [ADR-0011](docs/adr/0011-aim-free-selection-and-precision-walk.md)): the focus cone ranks candidates by angle then distance, `Tab` and 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 holding `Shift` walks at half speed for close work -Not yet implemented: the v0.6.0 graphics pass (Blender-authored NPC characters, see [`docs/plan-graphics-v0.6.md`](docs/plan-graphics-v0.6.md)), live 3D body-camera replay, editor-based GUT integration, and crowd performance profiling/LOD (see `TODO.md`). +Not yet implemented: wiring the authored NPC base model into the live game (`NpcAvatar._load_model`, see [`docs/plan-graphics-v0.6.md`](docs/plan-graphics-v0.6.md) — the procedural rig still renders for now), live 3D body-camera replay, editor-based GUT integration, and crowd performance profiling/LOD (see `TODO.md`). ### Smoke Test Checklist diff --git a/docs/architecture.md b/docs/architecture.md index a5a1c32..4537f40 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -78,7 +78,11 @@ The player interacts with NPCs, venue entrances, access artifacts, equipment, st - `ShiftReview` presents decisions, consequences, and improvement opportunities. - `SurfaceMaterials` (`src/game/materials.gd`) holds the surface profiles, glass/emissive recipes, and the environment tune-up (tonemapping, glow, fog, grading) that the phase lighting applies. - `WorldBuilder` assembles the procedural venue and instantiates the generated prop models from `assets/models/generated/` with a procedural fallback. -- `tools/model_pipeline.py` builds and audits those prop models; `tools/screen_designs.py` generates screen references and judges captures. +- `tools/model_pipeline.py` builds and audits the street-prop `.glb` models and packs their colour atlases. +- `tools/npc_pipeline.py` builds and audits the skinned NPC base model (`assets/models/generated/npc_base.glb`) and its per-slot material maps, with an optional AI fabric override (ADR-0013). +- `tools/asset_pipeline.py` generates and audits role-aware textures; `tools/screen_designs.py` generates screen references and judges captures. + +Confirmed game assets live in `assets/textures/ai/game_ready/` (audited surface, UI, and card textures), `assets/models/generated/` (prop and NPC `.glb` models plus their texture atlases), and `assets/textures/npc/` (NPC material maps and `palette.json`). Development-only outputs — AI concept sheets, Blender sources, raw AI fabrics — are gitignored and regenerated by the tools. ## 6. Runtime View diff --git a/docs/screenshots/01-venue-overview.png b/docs/screenshots/01-venue-overview.png index f5d7f1a..bd697a7 100644 Binary files a/docs/screenshots/01-venue-overview.png and b/docs/screenshots/01-venue-overview.png differ diff --git a/docs/screenshots/02-targeting-npc.png b/docs/screenshots/02-targeting-npc.png index 1f0adcb..8cf5bf7 100644 Binary files a/docs/screenshots/02-targeting-npc.png and b/docs/screenshots/02-targeting-npc.png differ diff --git a/docs/screenshots/03-access-inspection.png b/docs/screenshots/03-access-inspection.png index f7b8504..05d9726 100644 Binary files a/docs/screenshots/03-access-inspection.png and b/docs/screenshots/03-access-inspection.png differ diff --git a/docs/screenshots/04-radio-report.png b/docs/screenshots/04-radio-report.png index 002dc2b..e6057e0 100644 Binary files a/docs/screenshots/04-radio-report.png and b/docs/screenshots/04-radio-report.png differ diff --git a/docs/screenshots/05-late-night-avenue.png b/docs/screenshots/05-late-night-avenue.png index 4b41b36..ff72e31 100644 Binary files a/docs/screenshots/05-late-night-avenue.png and b/docs/screenshots/05-late-night-avenue.png differ diff --git a/docs/screenshots/06-night-flashlight.png b/docs/screenshots/06-night-flashlight.png index b1d9160..24fe0c3 100644 Binary files a/docs/screenshots/06-night-flashlight.png and b/docs/screenshots/06-night-flashlight.png differ diff --git a/docs/screenshots/07-wand-screening.png b/docs/screenshots/07-wand-screening.png index 1ab2dab..be99dc3 100644 Binary files a/docs/screenshots/07-wand-screening.png and b/docs/screenshots/07-wand-screening.png differ diff --git a/docs/screenshots/08-escalation-hud.png b/docs/screenshots/08-escalation-hud.png index 7544626..5c53ed8 100644 Binary files a/docs/screenshots/08-escalation-hud.png and b/docs/screenshots/08-escalation-hud.png differ diff --git a/docs/screenshots/09-body-camera-timeline.png b/docs/screenshots/09-body-camera-timeline.png index e2e2b95..afc2ec1 100644 Binary files a/docs/screenshots/09-body-camera-timeline.png and b/docs/screenshots/09-body-camera-timeline.png differ diff --git a/docs/screenshots/11-precision-walk.png b/docs/screenshots/11-precision-walk.png index 5dc79f5..d7679ff 100644 Binary files a/docs/screenshots/11-precision-walk.png and b/docs/screenshots/11-precision-walk.png differ