diff --git a/.project/objectives/p1-28-culture-research-tree.md b/.project/objectives/p1-28-culture-research-tree.md index 35e4e036..3434da23 100644 --- a/.project/objectives/p1-28-culture-research-tree.md +++ b/.project/objectives/p1-28-culture-research-tree.md @@ -2,14 +2,15 @@ id: p1-28 title: "Culture research tree — real graph, bridge, UI" priority: p1 -status: partial +status: done scope: game1 owner: shipwright updated_at: 2026-04-26 evidence: - GdCultureWeb registered in libmagic_civ_physics.x86_64.so (built 2026-04-26 on apricot from HEAD) - - "culture_tree_proof.gd runs without crash — UI chrome (title bar, close, detail panel) renders correctly" - - "BLOCKER: DataLoader.get_all_culture() returns 0 entries in proof-scene context (TurnManager.get_culture_web() builds empty web). DataLoader loads 700 entries from age-of-dwarves theme but culture category isn't accessible via get_all_culture() in headless proof-scene initialization path. Feature Rust code, GdCultureWeb bridge, GDScript UI are all done; only proof-scene DataLoader wiring is missing." + - "culture_tree_proof.tscn renders correctly: title 'Culture Tree', 6 pillars, 30 traditions, available T1 cards yellow with Research buttons, indicator badges (B/E/W), detail-panel hint text" + - "Phase-gate screenshot at .project/screenshots/culture_tree_proof_2026-04-26.png (1920×1080, 116 KB)" + - "DataLoader BLOCKER fixed: proof scene now calls DataLoader.load_theme + ThemeVocabulary.load_vocabulary if not populated; capture_screenshot.gd's culture_tree_proof route ensures the theme is loaded before scene change" - "5 dangling culture prereqs fixed in artisanship.json/legacy.json/oral_tradition.json/philosophy.json/statecraft.json (civil_engineering, world_theory, scholarship, governance×2, clan_law, high_lore removed)" --- ## Summary @@ -128,11 +129,22 @@ buildings / wonders / lenses / mechanics on completion. and is mid-research on a third, captures a screenshot via the standard `tools/screenshot.sh` flow. -- ✗ **Phase-gate proof screenshot** — captured via - `tools/screenshot.sh culture_tree_proof` and approved in conversation. - **Pending: this is the only outstanding bullet; the headless capture - has not been run yet.** Status remains `partial` until the screenshot - lands. (Per `phase-gate-protocol.md`.) +- ✓ **Phase-gate proof screenshot** — captured 2026-04-26 on apricot via + `WAYLAND_DISPLAY=wayland-1 flatpak run org.godotengine.Godot --path + src/game --rendering-method gl_compatibility engine/scenes/tests/culture_tree_proof.tscn`. + Archived at `.project/screenshots/culture_tree_proof_2026-04-26.png`. + Image renders: title "Culture Tree", close button "X", six pillar + columns (Ancestor Worship, Artisanship, Legacy, Oral Tradition, + Philosophy, Statecraft), 30 traditions arranged by tier, T1 + available cards yellow with `Research` buttons, locked cards gray, + indicator badges (B/E/W) visible, detail-panel hint text rendering + correctly. Two infrastructure fixes landed alongside: (a) + `culture_tree_proof.gd` now calls `DataLoader.load_theme` and + `ThemeVocabulary.load_vocabulary` if not already populated (every + other proof scene does the same — without it `get_all_culture()` + returns 0 and lookups fall back to title-cased keys); (b) + `capture_screenshot.gd`'s `culture_tree_proof` route loads the + theme before changing scenes for the same reason. ## Notes diff --git a/.project/screenshots/culture_tree_proof_2026-04-26.png b/.project/screenshots/culture_tree_proof_2026-04-26.png new file mode 100644 index 00000000..3ffa0cc6 Binary files /dev/null and b/.project/screenshots/culture_tree_proof_2026-04-26.png differ diff --git a/src/game/engine/scenes/tests/culture_tree_proof.gd b/src/game/engine/scenes/tests/culture_tree_proof.gd index a776a841..a3e16c69 100644 --- a/src/game/engine/scenes/tests/culture_tree_proof.gd +++ b/src/game/engine/scenes/tests/culture_tree_proof.gd @@ -30,6 +30,11 @@ func _ready() -> void: # proof scene calls this for the same reason. if DataLoader.get_all_culture().is_empty(): DataLoader.load_theme("age-of-dwarves") + # Vocabulary lookup falls back to title-casing the key when the + # vocabulary dict is empty — meaning the title bar would render + # "Culture Tree Close Mark" instead of "X". Load the dwarf pack. + if not ThemeVocabulary.has_key("culture_tree"): + ThemeVocabulary.load_vocabulary("age-of-dwarves") await get_tree().process_frame _setup_game_state()