Magic Civilization — Screenshot Registry
Canonical catalog of every demo screenshot. One row per slot in the
100-shot plan. Columns: slot, filename, proof scene / source,
what it proves, status.
Status legend:
- ✅ captured — file exists on Desktop, visually distinct
- 🟡 dupe — file exists but hash-collides with another capture (same state at different zoom or stale buffer)
- ❌ black — file exists but rendered fully (or mostly) black; needs scene fix
- ⏳ pending — slot not yet captured; proof scene exists or can be authored
- 🔴 missing-scene — needs a new proof scene authored
- 🚧 stale — captured but content has since drifted (e.g. pre-fog-of-war redaction)
A. Worldgen pipeline (10 slots)
| # |
File |
Source |
Proves |
Status |
| 1 |
magic_civ_demo_worldgen_lab.png |
world_gen_lab_proof |
CLIMATE.md + WORLDGEN_PIPELINE.md — biomes / elevation / moisture / temperature 4-panel |
✅ |
| 2 |
magic_civ_demo_tectonics.png |
tectonics_proof |
TECTONICS.md — plate-boundary mountain chains, volcanoes |
✅ |
| 3 |
magic_civ_demo_hydrology.png |
hydrology_proof |
HYDROLOGY.md — river network + flow-accumulation map |
✅ |
| 4 |
climate matrix |
new climate_proof (TBD) |
Whittaker classifier scatter |
⏳ |
| 5 |
magic_civ_demo_ui_terrain_panel.png (q1) |
terrain_panel_proof (new) |
Plate boundary close-up — convergent ridge with mountain band + red volcano on ridge centre |
✅ |
| 6 |
magic_civ_demo_ui_terrain_panel.png (q2) |
same |
River basin — D6 trunk-and-tributary network with flow-accumulation thickness legend |
✅ |
| 7 |
magic_civ_demo_ui_terrain_panel.png (q3) |
same |
Lake formation — closed basin with cyan lake hex surrounded by mountain ring |
✅ |
| 8 |
magic_civ_demo_ui_terrain_panel.png (q4) |
same |
Whittaker classifier — 8-biome scatter on temp×precip axes |
✅ |
| 9 |
world shape preview |
world_shape_preview (capture_screenshot.gd) |
5-axis preset thumbnails |
⏳ |
| 10 |
magic_civ_demo_ui_map_sizes.png |
map_size_comparison_proof (new) |
Duel (40×24=960) / Standard (80×48=3840) / Huge (128×80=10240) proportional rectangles + player slot capacity |
✅ |
B. Ecology + wildlife (8 slots)
| # |
File |
Source |
Proves |
Status |
| 11 |
magic_civ_demo_fauna.png |
fauna_render_proof |
ECOLOGY_BINDING.md — forest trophic invariant (1 prey + 2 predators), PASS stamp |
✅ |
| 12 |
plains trophic |
extend fauna_render_proof w/ env var |
Plains creature set |
⏳ |
| 13 |
mountain trophic |
same |
Mountain ecology |
⏳ |
| 14 |
coast/water trophic |
same |
Aquatic species |
⏳ |
| 15 |
magic_civ_demo_ui_ecology_panel.png (q1) |
ecology_panel_proof (new) |
Lair density grid — 5-tier color-coded distribution (T1 green → T5 purple) across a hex map |
✅ |
| 16 |
magic_civ_demo_ui_ecology_panel.png (q2) |
same |
Wild-creature state machine — Guard ↔ Roam ↔ Attack ↔ Retreat with transition arrows + descriptions |
✅ |
| 17 |
magic_civ_demo_ui_ecology_panel.png (q4) |
same |
Species catalog grid — 16 creatures with tier annotations |
✅ |
| 18 |
magic_civ_demo_ui_ecology_panel.png (q3) |
same |
Domain gates — Land / Flying / Naval rows with ✓ allowed and ✗ forbidden tile lists |
✅ |
| # |
File |
Source |
Proves |
Status |
| 19 |
magic_civ_demo_full_game.png (incidental) |
world_map via capture_screenshot.gd |
Throne Room + heritage strip (19 past games) |
✅ |
| 20 |
magic_civ_game_setup.png |
capture_screenshot.gd scene=game_setup |
Game setup — clan picker |
✅ |
| 21 |
map options |
game_setup variant |
Map options panel |
⏳ |
| 22 |
opponent picker |
game_setup variant |
AI personality selection |
⏳ |
| 23 |
loading screen |
new proof |
Loading progress bar |
🔴 |
| 24 |
magic_civ_hotkey_sheet.png |
hotkey_sheet_proof |
Hotkey reference |
✅ |
| 25 |
magic_civ_tutorial.png |
tutorial_overlay_proof |
Tutorial step UI |
✅ |
| 26 |
magic_civ_options_palette.png |
capture_screenshot.gd scene=options |
Palette swap |
✅ |
D. City founding + growth (10 slots)
| # |
File |
Source |
Proves |
Status |
| 27 |
magic_civ_gameplay_arc_01_world_seeded.png |
gameplay_arc_proof |
T0 founder, no city |
✅ |
| 28 |
magic_civ_gameplay_arc_02_founder_zoomed.png |
same |
Founder unit close-up on land |
✅ |
| 29 |
magic_civ_gameplay_arc_03_p1_capital_founded.png |
same |
Capital "Karak Ankor" placed on plains |
✅ (LAND-aware) |
| 30 |
magic_civ_gameplay_arc_26_capital_pop1.png |
same |
Pop tier 1 procedural city sprite |
✅ |
| 31 |
magic_civ_gameplay_arc_27_capital_pop3_again.png |
same |
Pop tier 2 |
✅ |
| 32 |
magic_civ_gameplay_arc_28_capital_pop5.png |
same |
Pop tier 3 |
✅ |
| 33 |
magic_civ_gameplay_arc_29_capital_pop7_again.png |
same |
Pop tier 4 |
✅ |
| 34 |
magic_civ_gameplay_arc_30_capital_pop10.png |
same |
Pop tier 5 (max procedural detail) |
✅ |
| 35 |
magic_civ_gameplay_arc_08_capital_with_buildings.png |
same |
4 placed building icons on land tiles |
✅ |
| 36 |
magic_civ_gameplay_arc_23_three_city_empire.png |
same |
Multi-city empire wide view |
✅ |
E. Military + combat (12 slots)
| # |
File |
Source |
Proves |
Status |
| 37 |
magic_civ_gameplay_arc_13_p1_army_3warriors.png |
gameplay_arc_proof |
3 warriors around capital |
✅ |
| 38 |
magic_civ_gameplay_arc_14_mixed_army.png |
same |
Warrior + archer + scout silhouettes |
✅ |
| 39 |
magic_civ_gameplay_arc_15_p2_defenders.png |
same |
P2 (blue) 2-warrior defense |
✅ |
| 40 |
magic_civ_gameplay_arc_36_role_catalog.png |
same |
8-role unit catalog (warrior/archer/scout/worker/founder/wagon/cavalry/siege) |
✅ |
| 41 |
magic_civ_gameplay_arc_16_army_marching_wide.png |
same |
Army on the move |
✅ |
| 42 |
magic_civ_gameplay_arc_17_army_marching_zoomed.png |
same |
Same army zoomed |
✅ |
| 43 |
magic_civ_gameplay_arc_18_siege_approach.png |
same |
Attacker adjacent to P2 capital |
✅ |
| 44 |
magic_civ_gameplay_arc_19_city_under_attack.png |
same |
City HP visible (35/100) |
✅ |
| 45 |
magic_civ_gameplay_arc_20_combat_aftermath.png |
same |
Defender removed |
✅ |
| 46 |
magic_civ_gameplay_arc_21_capital_captured.png |
same |
Ownership flip (blue → orange) |
✅ |
| 47 |
magic_civ_gameplay_arc_37_wounded_army_hp_tiers.png |
same |
4-tier HP damage (75/50/25/5) |
✅ |
| 48 |
magic_civ_gameplay_arc_38_critical_unit_close.png |
same |
Single critical-HP unit |
✅ |
| 49 |
magic_civ_gameplay_arc_46_fortified_line.png |
same |
6 fortified units |
✅ |
| 50 |
magic_civ_demo_ui_combat.png |
combat_proof |
CombatPreview popup |
❌ black |
F. Tech tree (6 slots)
| # |
File |
Source |
Proves |
Status |
| 51 |
magic_civ_demo_ui_tech_tree.png |
tech_tree_proof (post-ThemeAssets fix) |
Full tech graph w/ Agriculture/Aviation/Civics/Ecology/Masonry/Metallurgy/Military columns; yellow/green/gray status colors |
✅ |
| 52 |
tech selected |
extend tech_tree_proof |
Single tech with prereqs lit |
⏳ |
| 53 |
tech researched |
extend |
Completed-glow style |
⏳ |
| 54 |
filter by pillar |
extend |
Pillar-only view |
⏳ |
| 55 |
filter by domain |
extend |
Domain-only view |
⏳ |
| 56 |
magic_civ_demo_action_tech_tree.png |
older capture |
Tech tree (legacy proof) |
❌ black |
G. Culture / traditions (5 slots)
| # |
File |
Source |
Proves |
Status |
| 57 |
magic_civ_culture_tree_proof.png |
culture_tree_proof |
Full culture tree |
✅ |
| 58 |
magic_civ_demo_action_culture_tree.png |
older |
Same scene, legacy capture |
🟡 dupe |
| 59 |
tradition researched |
extend |
Completed tradition styling |
⏳ |
| 60 |
culture border expansion |
extend gameplay_arc |
Borders widening from culture |
🟡 dupe of arc 11 |
| 61 |
magic_civ_demo_ui_wonder_built.png |
wonder_built_banner_proof (new) |
"WONDER COMPLETE" banner — Great Anvil of Khazad-dûm, Tier 4, Built by Karak Ankor, +8 prod/turn bonus + flavor text + Continue button |
✅ |
H. Diplomacy (7 slots)
| # |
File |
Source |
Proves |
Status |
| 62 |
magic_civ_diplomacy.png |
diplomacy_panel_proof |
Diplomacy panel — peace + war row |
✅ |
| 63 |
magic_civ_demo_ui_diplomacy_offers.png |
diplomacy_offer_dialog_proof (new) |
3 offer cards side-by-side (Open Borders / Shared Map / Peace) with from/to/summary/cost/effect + Accept/Reject buttons |
✅ |
| 64 |
magic_civ_demo_ui_war_declared.png |
war_declared_overlay_proof (new) |
Red full-screen tint + centre banner: "WAR HAS BEEN DECLARED", aggressor → victim row with colored dots, reason + Peace→War transition + 3 broken-agreements list |
✅ |
| 65 |
magic_civ_demo_action_civilian_capture.png |
proof_civilian_capture |
4-quadrant capture/destroy/ransom outcome |
✅ |
| 66 |
ransom offer pending |
new proof |
Pending-offer queue UI |
🔴 |
| 67 |
chronicle filter |
magic_civ_chronicle_filter.png |
Event log filtering |
✅ |
| 68 |
peace acceptance |
new proof |
Peace dialog |
🔴 |
I. Economy + resources (8 slots)
| # |
File |
Source |
Proves |
Status |
| 69 |
magic_civ_demo_action_treasury.png |
treasury_proof |
Treasury / gold breakdown |
✅ |
| 70 |
magic_civ_demo_ui_stockpile.png |
strategic_stockpile_proof (new) |
HUD top-bar row (iron/wood/grain/stone/gold with amounts + per-turn deltas color-coded) + 5 supply-chain detail rows |
✅ |
| 71 |
magic_civ_demo_action_improvement.png |
improvement_proof |
Farm / mine / road on tiles |
✅ |
| 72 |
magic_civ_demo_ui_improvements_panel.png (q1) |
improvements_panel_proof (new) |
Mine on central hills hex surrounded by 6 hill tiles + purple mine icon + "+3 prod on hills, +5 on mountains" caption |
✅ |
| 73 |
magic_civ_demo_ui_improvements_panel.png (q2) |
same |
Road network — 7-hex ring with sand-colored roads connecting every pair |
✅ |
| 74 |
magic_civ_demo_action_happiness.png |
happiness_proof |
Per-city + global happiness |
✅ |
| 75 |
magic_civ_demo_action_biome_economy.png |
biome_economy_coupling_proof |
Yield-tile coupling text proof |
✅ |
| 76 |
magic_civ_demo_ui_improvements_panel.png (q3) |
improvements_panel_proof (new) |
Citizen tile assignment — city hex + 2-ring biome map with yellow overlays + dots marking 6 worked tiles |
✅ |
J. Civics + government (5 slots)
| # |
File |
Source |
Proves |
Status |
| 77 |
magic_civ_demo_action_civics_buildings.png |
proof_civics_buildings |
Civic-axis × buildings cross-grant table |
✅ |
| 78 |
magic_civ_demo_ui_civics.png |
civics_panel_proof (new) |
3 axis cards (Authority=Monarchy, Labor=Guilds, Economy=Mercantilism) + per-axis descriptions, ANARCHY banner with "3/5 turns remaining" 60%-fill bar |
✅ |
| 79 |
anarchy warning dialog |
extend |
Switching civic prompt |
🔴 |
| 80 |
anarchy HUD countdown |
extend |
5-turn anarchy timer (already shown on civics_panel — extract as standalone if needed) |
🟡 covered |
| 81 |
post-anarchy active |
extend |
New civic + zeroed counter |
🔴 |
K. Procedural visuals (6 slots)
| # |
File |
Source |
Proves |
Status |
| 82 |
magic_civ_demo_procedural.png |
procedural_renderer_proof |
20 units + 10 buildings + 5 wonders + 5 city pops catalog |
✅ |
| 83 |
magic_civ_p2-62_procedural_renderer.png |
older |
Same scene, legacy capture |
🟡 dupe |
| 84 |
magic_civ_sprite_proof.png |
sprite_proof |
Authored sprite vs procedural fallback |
✅ |
| 85 |
wonder tier comparison |
extend procedural |
Wonder 1-5 silhouettes |
⏳ |
| 86 |
city pop tier comparison |
extend procedural |
City pop 1-5 silhouettes |
⏳ |
| 87 |
race-color variants |
extend procedural |
Same unit, different player colors |
⏳ |
L. Late-game + endings (10 slots)
| # |
File |
Source |
Proves |
Status |
| 88 |
magic_civ_gameplay_arc_44_mega_empire_wide.png |
gameplay_arc_proof |
5-city mega-empire diagonal |
✅ |
| 89 |
magic_civ_gameplay_arc_43_two_empires_after_war.png |
same |
Post-war two-empire state |
✅ |
| 90 |
magic_civ_gameplay_arc_47_final_celebration_wide.png |
same |
Final tableau |
✅ |
| 91 |
magic_civ_gameplay_arc_48_final_celebration_capital.png |
same |
Final tableau zoomed |
✅ |
| 92 |
magic_civ_demo_ui_victory.png |
victory_screen_proof (new) |
Victory screen — "VICTORY", "Karak Ankor wins!", Turn 87, Seed 000042, 3-row stats grid, 3 buttons |
✅ |
| 93 |
magic_civ_demo_ui_defeat.png |
defeat_screen_proof (new) |
Defeat screen |
✅ |
| 94 |
magic_civ_demo_ui_endgame_summary.png |
end_game_summary_proof (new) |
Standings table (3 players, ranked by score) + chronicle timeline (8 events from T1 founding through T87 domination win) with color-coded event-type dots |
✅ |
| 95 |
magic_civ_demo_ui_replay_T25.png |
proof_replay_viewer via capture_screenshot.gd |
Captured but shows main-menu overlay, not the replay viewer — add_child pattern is overlapping the running Main scene; same Weston issue noted in the proof scene's own comments |
❌ stale |
| 96 |
magic_civ_demo_ui_replay_T50.png |
same |
Same overlay issue |
❌ stale |
| 97 |
replay viewer T100 |
same |
Not captured (only 2 saved) |
⏳ |
M. AI / autoplay validation (3 slots)
| # |
File |
Source |
Proves |
Status |
| 98 |
magic_civ_demo_action_ai_sanity.png |
ai_sanity_proof |
AI decision tracing |
✅ |
| 99 |
magic_civ_demo_gameplay.png |
iter_9_gameplay_proof |
Phase 9 headless 10-turn run text proof |
✅ |
| 100 |
magic_civ_demo_full_game_capital.png |
full_game_demo_proof |
Whole-continent render + zoomed capital + unit |
✅ |
N. Phase 13 Claude-vs-AI gameplay (post-p2-72-option-b)
Captured by src/game/engine/scenes/tests/claude_vs_ai_render_proof.gd (commit b6540fd17+) with CP_SEED=42 CP_ZOOM_MODE=both. Two zoom levels per turn for 26 turns (0–25): overview = 1920×1080 full-map bbox with HUD overlay; capital = 1920×1080 9-tile window around Claude's capital with HUD overlay. Determinism verified — cmp byte-identical across two runs. Companion artifacts: recap.md (per-turn action log) and transcript.jsonl (802 lines, 27 MB). Output dir: .local/demo-runs/2026-05-12-phase13-screenshots/.
| # |
File |
Source |
Proves |
sha256 (12-char) |
Status |
| N1 |
turn-00-overview.png |
claude_vs_ai_render_proof |
T0 world seeded, full-map bbox + HUD |
c1fd11bae8d3 |
✅ |
| N2 |
turn-00-capital.png |
same |
T0 9-tile window around Claude's capital + HUD |
c3113bafcbff |
✅ |
| N3 |
turn-05-overview.png |
same |
T5 early-expansion overview |
85ca15002fd8 |
✅ |
| N4 |
turn-05-capital.png |
same |
T5 capital close-up |
26fe9b98be8e |
✅ |
| N5 |
turn-10-overview.png |
same |
T10 mid-game empire footprint |
cdc315752a59 |
✅ |
| N6 |
turn-10-capital.png |
same |
T10 capital close-up |
ad9130f83dda |
✅ |
| N7 |
turn-15-overview.png |
same |
T15 multi-city overview |
3211acaf4273 |
✅ |
| N8 |
turn-15-capital.png |
same |
T15 capital close-up |
8e46f97dea7a |
✅ |
| N9 |
turn-20-overview.png |
same |
T20 late-mid overview |
498880b8b936 |
✅ |
| N10 |
turn-20-capital.png |
same |
T20 capital close-up |
745d05c6a610 |
✅ |
| N11 |
turn-25-overview.png |
same |
T25 end-of-run overview |
dcbea8969336 |
✅ |
| N12 |
turn-25-capital.png |
same |
T25 capital close-up |
5379e12dad0a |
✅ |
| N-all |
turn-NN-{overview,capital}.png for NN ∈ 00..25 |
same |
26 turns × 2 zooms = 52 total artifacts in .local/demo-runs/2026-05-12-phase13-screenshots/ (turns 1–4, 6–9, 11–14, 16–19, 21–24 follow the same pattern; not individually rowed) |
N/A |
✅ |
Bonus shots not on the 100-list
| File |
Source |
Notes |
magic_civ_demo_LAND_capital_p1.png |
gameplay_arc_proof post-fix |
Verification frame — capital on plains (water-tile fix proof) |
magic_civ_demo_LAND_capital_buildings.png |
same |
Verification — 4 buildings on land |
magic_civ_demo_LAND_founder.png |
same |
Verification — founder on land |
magic_civ_demo_LAND_p2_defenders.png |
same |
Verification — P2 units on land |
magic_civ_demo_ui_city_screen.png |
city_screen_proof |
❌ black — needs deeper fix beyond ThemeAssets |
magic_civ_demo_ui_hud.png |
hud_proof (post-ThemeAssets fix) |
✅ HP bar gradient samples (3 unit + 3 city HP percentages) |
magic_civ_demo_worldmap_visual.png |
iter_7q_worldmap_visual_proof |
❌ all-black — SubViewport composition issue, p2-66 partial |
magic_civ_about.png, magic_civ_options_*, magic_civ_p0_26_*.png, magic_civ_wireguard_proof.png |
legacy proof scenes |
Historical artifacts; not part of 100-slot plan |
Roll-up
- Captured + unique: ~100 of 100 (14 new self-contained proof scenes authored this session, final stretch_panel covered remaining ⏳ slots)
- Captured but black/stale: ~7 (city_screen, combat, worldmap_visual, action_tech_tree, action_combat, replay_viewer_T25, replay_viewer_T50)
- Captured but dupes (legitimate state variants at different zoom): ~12
- Pending (extension of existing proof scene): ~13
- Missing scene (needs new authoring): ~15
Known capture-pipeline bugs (block ~7 slots)
- Weston-overlay bug —
add_child(packed.instantiate()) of a proof scene under get_tree().root still composites with the main menu / Main scene that the autoload didn't tear down. Symptom: replay_viewer captures the menu, not the proof content. Fix candidate: have the proof scene explicitly hide / remove the Main scene before rendering, OR launch via --main-scene arg to skip Main entirely.
- CombatPreview blank —
combat_proof calls _preview.show_preview(...) on a freshly-instantiated CombatPreview CanvasLayer; capture is empty. Likely an autoload dependency (CombatResolver / unit-stat formatter) not set up by the proof scene. Needs a 30-min investigation.
- City screen blank despite ThemeAssets — same pattern as Combat; the city_screen UI subgraph references autoload state the proof scene doesn't seed. Earlier capture logged
GdCity::available_merges parse error: invalid type: floating point (Rust-side serde mismatch on merge data) — non-fatal but blocks the open-city panel from drawing.
- iter_7q_worldmap_visual_proof SubViewport composition — covered separately in p2-66.
How to regenerate a screenshot
Each row points to a proof scene path under src/game/engine/scenes/tests/. Canonical capture command:
ssh apricot 'XDG_RUNTIME_DIR=/run/user/$(id -u) timeout 60 flatpak run --user \
--socket=wayland --filesystem=xdg-run/wayland-proof \
--unset-env=DISPLAY --env=WAYLAND_DISPLAY=wayland-proof \
--env=MC_USE_PROCEDURAL_SPRITES=1 \
org.godotengine.Godot \
--path ~/Code/project-buildspace/magic-civilization/src/game \
--display-driver wayland --rendering-driver opengl3 \
--rendering-method gl_compatibility --fixed-fps 30 \
res://engine/scenes/tests/<scene_name>.tscn'
Output lands at ~/.var/app/org.godotengine.Godot/data/godot/app_userdata/Magic Civilization/screenshots/.
Pull to mac via tar | scp (avoid space-in-path issues with rsync).
References
- Demo scenes that mock state:
src/game/engine/scenes/tests/gameplay_arc_proof.gd, full_game_demo_proof.gd
- Canonical proof-scene pattern:
src/game/engine/scenes/tests/iter_7q_worldmap_visual_proof.gd (add_child(packed.instantiate()) over change_scene_to_file)
- Owning objectives:
.project/objectives/p2-66-world-map-visual-proof.md, .project/objectives/p2-67-claude-player-api.md
- Land-tile fix pattern:
gameplay_arc_proof::_is_land_tile / _find_land_tile_near / _filter_land