Files
security-game/TODO.md
T

6.7 KiB
Raw Blame History

TODO

Godot 4.3 prototype. Latest release v0.5.0 (NPC characters and player movement). Headless suite 208/208 plus 56 Python tooling tests; the session, PLAN-verb, crowd, emergency, timeline, audio, scenario-content, props, NPC-budget, movement, and windowed focus/radial smokes pass. Anonymous downloads are enabled on the host.

The scheduled presentation pass is complete (see DONE.md). The next scheduled pass is the graphics-quality work in docs/plan-graphics-v0.6.md.

Graphics quality — Blender-authored NPC characters (v0.6.0)

Detailed plan: docs/plan-graphics-v0.6.md · ADR-0013

Phase 0 — Toolchain spike and contract freeze

  • Verify flatpak run org.blender.Blender --version reports Blender 5.2.x and runs headless in this shell.
  • Run a minimal headless Blender export using an absolute --python path (sandbox cwd is /app/blender); confirm the output file lands where expected.
  • Record the exact working invocation (flatpak + absolute paths) in MEMORY.md.
  • Freeze the NPC asset contract in docs/plan-graphics-v0.6.md and ADR-0013: file paths, bone names, material slots, triangle budget.
  • Fix the material-slot set (skin / cloth / pants / accessory / hair) and the ORM packing (R=occlusion, G=roughness, B=metallic).
  • Choose and record the initial tier-0 triangle/vertex budget (≤ ~6000 tris / ~4000 verts) in the plan.
  • Spike: confirm Godot 4.3 imports a test .glb as a PackedScene with a Skeleton3D and playable imported clips.

Phase 1 — Blender authoring + export pipeline

  • Author the low-poly base humanoid in Blender: torso, articulated arms/legs, head with a face front, hands, shoes.
  • Rig with an armature whose bones mirror the node contract (Head, HipL/R, KneeL/R, ShoulderL/R, ElbowL/R, HandL/R); origin at the feet, +Y up.
  • UV-unwrap the mesh into a power-of-two layout, one region per material slot.
  • Save the editable source as assets/models/npc/npc_base.blend (committed).
  • Add tools/npc_pipeline.py with list / build / audit subcommands, run through the Blender flatpak.
  • build exports assets/models/generated/npc_base.glb plus the material textures.
  • Bake neutral albedo per slot, normal maps (fabric weave, denim, knit), and the packed ORM map.
  • Bake ambient occlusion into the albedo or the ORM R channel (the Compatibility renderer has no SSAO).
  • audit enforces UVs in [0,1], expected bone names, triangle/vertex budget, feet at y≈0, and material-slot presence.
  • Reuse the model_pipeline.py colour-space discipline (linear factors vs sRGB textures) in the exporter.
  • Run godot --headless --path . --import and confirm npc_base.glb imports without errors.

Phase 2 — AI-assisted texturing

  • Generate seamless clothing albedos (shirt, trousers, jacket, hi-vis vest, coat, dress) with tools/asset_pipeline.py generate (OpenRouter, openai/gpt-5-image-mini) — written to assets/textures/npc/ai/ (512×512).
  • Tile-edge blending on each fabric — applied automatically by generate --role tile (make_seamless); the tile audit's edge check confirms continuity.
  • Run asset_pipeline.py audit on the outputs — 6 good, 0 bad (role tile).
  • Commit the validated textures (files are under assets/textures/npc/ai/; git commit coordinated via MEMORY.md — Phase 1 files are still uncommitted).
  • Derive per-role outfit palettes via model_pipeline.dominant_colors — written to assets/textures/npc/palette.json (npc_pipeline.py palette).
  • Bake normal/roughness procedurally and layer the AI albedos on top — npc_pipeline.py prepare + Blender build keeps the AI albedo for cloth/pants and regenerates normal/ORM; GLB audit ok (1204 tris / 2488 verts).
  • Regenerate the staged captures and run screen_designs.py judge (blocked: needs Phase 3 NpcAvatar integration to render the skinned model).

Phase 3 — Godot integration

  • Add NpcAvatar._load_model() that instantiates the imported npc_base.glb PackedScene.
  • Keep _build_body() as the offline fallback; choose per-avatar and record loaded_model / fallback_avatar for tests.
  • Map outfit_for() onto the model's material slots so seed variety, layer_for, hand_item_for, and archetype colors survive.
  • Keep accessory attachments (cap / hood / backpack / sunglasses / lanyard) under Rig / Head.
  • Add SurfaceMaterials baked-map recipes (npc() / skin() / cloth()); stop calling Materials.flat() for the body.
  • Add _set_limb_rotation() so _animate() / _idle_layer() write to bones or pivots; keep Rig/Head findable by the focus cone.
  • Update test_npc_character, test_npc_theater, and test_target_cycle for the skinned path (or document why they stay on the fallback).
  • Re-measure smoke_npc_budget.gd; tune LOD_TIERS if the skinned rig is heavier up close.
  • Re-verify the focus-cone smoke (smoke_focus_radial.gd) and the movement smoke.

Phase 4 — Environment and lighting lift

  • Bake AO for the prop set (or rebuild the props in Blender) behind the same assets/models/generated/<prop>.glb contract.
  • Regenerate higher-resolution brick / concrete / asphalt textures via asset_pipeline.py with normal maps, keeping the current UV scales.
  • Evaluate a desktop-only Forward+ export preset (SSAO/SSIL/volumetrics); keep the Web preset on GL Compatibility with thread_support=false.
  • Record the renderer decision in an ADR addendum or MEMORY.md.
  • Regenerate docs/screenshots/ with capture_screenshots.gd and run screen_designs.py compare.

Phase 5 — Verification and release

  • Headless suite green: fallback build, outfit determinism, Rig/Head presence, material recipe assertions, npc_pipeline.py audit (skip with reason when Blender is absent).
  • Windowed smokes pass: smoke_npc_budget.gd, smoke_movement.gd, smoke_focus_radial.gd, smoke_props.gd.
  • screen_designs.py compare and judge show no regressions.
  • Bump config/version to 0.6.0.
  • Update README.md, docs/architecture.md (Level 2 gains tools/npc_pipeline.py), and mark ADR-0013 Accepted.
  • Publish the release per docs/RELEASING.md.

Future ideas (optional, not scheduled)

  • Live 3D body-camera replay (the timeline is text-only today).
  • Additional venues or seasonal events authored from the new .tres files.
  • Real voice/dialogue audio (the crowd bed and radio crackle are procedural).
  • Swap the primitive prop builder for an image-to-mesh model API behind the same assets/models/generated/<prop>.glb contract.