feat(@projects/@magic-civilization): mark culture research tree as complete

Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
This commit is contained in:
Natalie 2026-04-26 08:18:37 -07:00
parent b5957a43f4
commit 7f5fa6c2c3
3 changed files with 25 additions and 8 deletions

View file

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

View file

@ -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()