Commit graph

1659 commits

Author SHA1 Message Date
Natalie
4daab42f72 refactor(@projects/@magic-civilization): 🎨 delete 14 redundant Label font_color=text.primary overrides (p2-87)
These Label nodes set font_color to text.primary — which is already the Label
theme default in ui_theme.tres — so the override was a no-op duplicate. Deleted
across 12 scenes; the Labels now inherit the default. Value-preserving by
construction (default == deleted value); all targets confirmed Label-typed.

gdlint: no new issues (pre-existing class-order/const-name in some files
untouched). knowledge_tree render-verified via tech_tree_proof (exit 0).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 04:39:54 -05:00
Natalie
3942adf26b refactor(@projects/@magic-civilization): 🎨 top_bar happiness label → conditional theme_type_variation (p2-87)
Migrate the %HappinessLabel state-conditional font_color (positive/negative/
neutral) to theme_type_variation (LabelPositive/Negative/Secondary). It's a
Label (top_bar.tscn:86), so the variation applies cleanly and is value-preserving.

This completes the static Label font_color override→inheritance migration. The
only remaining add_theme_color_override("font_color", ...) are 2 Button
state-toggles (lens_switcher active-lens, overlay_panel) — genuinely dynamic
(toggled per UI state, would need a Button-based variation), left as the
dynamic carve-out.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 04:32:01 -05:00
Natalie
dc78a15670 refactor(@projects/@magic-civilization): 🎨 migrate 19 scenes' Label colours to theme_type_variation (p2-87 override→inheritance)
Node-type-aware batch: replace add_theme_color_override("font_color",
ThemeAssets.color("<token>")) with theme_type_variation on declared Label vars
only (35 overrides across 19 HUD/menu/notification/world-map scenes). Non-Label
targets (Buttons in top_bar/overlay_panel/lens_switcher) and dynamic/param
colours are left as overrides — a Label variation would break a Button's
stylebox lookup.

Value-preserving (each variation carries the identical token colour; instance
font_size overrides are untouched). All changed files gdlint-clean. Pattern is
render-proven by the statistics + hotkey_sheet iterations; live world_map render
skipped here because the working tree carries a concurrent session's uncommitted
world_map.gd / tile_info_panel edits (left unstaged).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 04:27:37 -05:00
Natalie
3f82ff6fb5 refactor(@projects/@magic-civilization): 🎨 happiness_breakdown_panel labels → theme_type_variation (p2-87)
Migrate 5 font_color overrides to theme_type_variation
(LabelTitle/Secondary/Positive/Negative/Muted). Inline StyleBoxFlat (panel bg)
left for the StyleBox sub-sweep.

Value-preserving (variations carry the same token colours) + gdlint clean. No
direct render harness (this panel opens on in-game interaction, not coverable by
a proof scene or the magic-civ open_screen surface); the variation pattern is
render-proven by the statistics + hotkey_sheet iterations.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 04:20:26 -05:00
Natalie
3b09bb35a1 refactor(@projects/@magic-civilization): 🎨 hotkey_sheet labels → theme_type_variation (p2-87 override→inheritance)
Migrate 6 font_color overrides to theme_type_variation
(LabelTitle/Muted/Gold/Disabled) and delete 1 redundant text.primary override
(== Label theme default). Inline StyleBoxFlat (panel bg) left for the StyleBox
sub-sweep.

Value-preserving; render-verified via hotkey_sheet_proof — title/headers gold,
keys gold, descriptions inherit default, no regressions.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 04:17:35 -05:00
Natalie
a86aa6f67c refactor(@projects/@magic-civilization): 🎨 statistics screen labels → theme_type_variation (p2-87 override→inheritance)
Migrate 15 add_theme_color_override("font_color", ...) calls in statistics.gd to
theme_type_variation (LabelTitle/Secondary/Muted/Disabled/Positive/Negative).
Widgets inherit the colour from ui_theme.tres instead of hand-setting it.

Value-preserving (variations carry the same token colours). Render-verified on
plum via statistics_proof — all 5 tabs render; Rankings shows title gold, metric
secondary, trend arrows green, no regressions.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 04:12:47 -05:00
Natalie
b26116acc9 refactor(@projects/@magic-civilization): 🎨 knowledge_tree labels inherit via theme_type_variation (p2-87 pilot)
First override→inheritance migration, proving the pattern. Replace 4
add_theme_color_override("font_color", ...) calls with theme_type_variation:
cost→LabelMuted, hint→LabelDisabled, title→LabelTitle, flavor→LabelSecondary.
Widgets now inherit the colour from ui_theme.tres instead of hand-setting it.

Value-preserving (variations carry the same token colours). Render-verified on
plum via tech_tree_proof — cost labels render the muted colour correctly, tree
unchanged. Remaining accent-param labels (_make_pill/_make_section) stay as
overrides (dynamic colour). The redundant text.primary overrides (= Label
default) are a separate delete-pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 02:50:37 -05:00
Natalie
b6573bcb30 refactor(@projects/@magic-civilization): 🎨 route city/world_gen_lab proofs to biome_colors single source (p2-87 phase 1d)
Delete the hardcoded TERRAIN_COLORS dict copies in city_proof.gd and
world_gen_lab_proof.gd; both now call DataLoader.get_biome_color(tile.biome_id)
(both load the theme, so the source is populated). Verified: city_proof renders
correct biome colours (ocean/forest/plains/mountains/volcano), no magenta.

Remaining phase-1d copies: climate_proof (also draws a colour legend off the
dict) + improvement_proof / world_map_proof (don't load_theme — would need a
theme-load added first). Tracked in p2-87.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 01:43:25 -05:00
Natalie
ca7aa6d797 fix(@projects/@magic-civilization): 🎨 minimap reads biome colour from single source + biome_id bugfix (p2-87 phase 1c)
Delete minimap.gd's divergent hardcoded TERRAIN_COLORS dict (+ DEFAULT_TERRAIN_COLOR);
terrain colour now comes from DataLoader.get_biome_color() — the same single
source (biome_colors.json) the main map renderer uses.

Also fixes a latent bug: the minimap keyed on `raw_tile.get("terrain_id")`, but
tiles only carry `biome_id` (map_loader.gd:119) — so the old terrain lookup
returned nothing and the dict's simple-name keys never matched the biome_id
namespace. Now reads biome_id, matching hex_renderer.

Value-preserving (get_biome_color returns hex_renderer's lifted values) and a
strict improvement over the broken terrain_id path. gdlint clean.

NOTE: populated-minimap visual proof deferred — a standalone mount can't
reproduce the minimap's world_map HUD context (camera/scale/GameMapScript); to
be confirmed via a real world_map render (magic-civ rendered driver).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 00:01:40 -05:00
Natalie
eb1a81f009 refactor(@projects/@magic-civilization): 🎨 hex_renderer reads biome colour from single source (p2-87 phase 1b)
Delete hex_renderer.gd's hardcoded 69-entry TERRAIN_COLORS dict; the terrain
sprite fallback now calls DataLoader.get_biome_color(biome_id) (the values were
lifted from this very dict in phase 1a, so value-preserving). One fewer copy of
the biome palette; file drops ~82 lines. gdlint clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 23:47:30 -05:00
Natalie
16bfb2ad31 feat(@projects/@magic-civilization): 🎨 single-source biome_colors.json + DataLoader.get_biome_color (p2-87 phase 1a)
Establish ONE data source for biome render colour, lifting hex_renderer.gd's
authoritative 69-entry palette (value-preserving, biome_id -> [r,g,b] 0-255).

- public/games/age-of-dwarves/data/biome_colors.json — the single source.
- DataLoader: _load_biome_colors() at theme load + get_biome_color(biome_id)
  with '_default' fallback then magenta sentinel.

Additive only — no consumer rerouted yet (next phases: hex_renderer, minimap,
proof scenes all read this + delete their hardcoded TERRAIN_COLORS dicts).
Verified: headless load clean, biome_colors.json parses, 0 script errors.
(data_loader.gd max-file-lines is pre-existing, tracked by p2-10k.)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 23:44:50 -05:00
Natalie
5c06a9d923 feat(@projects/@magic-civilization): rendered MCP driver — TCP screenshot/open_screen (p2-86 phase 1)
New mcp_render_driver autoload (active only on MC_MCP_RENDER=1): listens on a
localhost TCP socket polled in _process and handles screenshot / open_screen /
ping / quit against the LIVE rendered game.

TCP, not stdin: OS.read_string_from_stdin blocks an open pipe and would freeze a
rendered main loop (the player_api_main stdin pump only works --headless); a
polled TCPServer is non-blocking and also dodges Godot's windowed-stdout
buffering. Inert (set_process(false)) unless the env flag is set — zero cost in
normal play.

Verified end-to-end with NO MCP needed: MC_AUTO_START=1 MC_MCP_RENDER=1 godot +
a raw TCP client -> ping ok, screenshot -> real 3420x1923 PNG of the live world
map. Phase 2 (claude-player-mcp tools + npm install + .mcp.json + restart) next.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 20:29:51 -05:00
Natalie
e1c26bded2 feat(@projects/@magic-civilization): MC_AUTO_START — boot straight into an interactive seeded game (p2-86)
main.gd: MC_AUTO_START=1 skips the menu/setup and boots an interactive seeded
game (MC_AUTOSTART_SEED / _PLAYERS / _MAP_SIZE overrides), mirroring the AI_ARENA
auto-boot but NON-spectator (local slot stays interactively controllable).

Phase-1 prerequisite for the rendered MCP driver (p2-86), and independently
fixes proof-capture: screenshots can now reach in-game screens without a human
clicking "New Game". Verified: MC_AUTO_START=1 ./run play reaches
world_map._start_game / the prologue (menu skipped), gdlint clean, 0 errors.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 20:07:53 -05:00
Natalie
0eaa979171 fix(@projects/@magic-civilization): 🐛 route tech-web lookup to TurnManager (proof harness)
`GameState.get_tech_web()` no longer exists — the accessor moved to
`TurnManager.get_tech_web()` (turn_manager.gd:132, builds the graph lazily
after DataLoader loads a theme), which is what production tech_tree.gd uses.

- tech_tree_proof.gd:56 — was raising `SCRIPT ERROR: Invalid call.
  Nonexistent function 'get_tech_web'` mid-setup; switched to
  `TurnManager.get_tech_web() as TechWebScript`.
- end_game_stats.gd:241 — same stale call (guarded, so it silently fell to
  null); switched to the live accessor.

culture_tree_proof.gd already used TurnManager.get_culture_web() — unchanged.

Verified on plum (headed render, warm cache): tech_tree_proof exits 0, ZERO
SCRIPT ERROR (was 1), diagnostics print "TechWeb: 115 techs, 10 pillars" +
all 10 domains; screenshot reviewed in conversation.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 19:50:45 -05:00
Natalie
7df76174cb feat(@projects/@magic-civilization): lair overlay sprite-capable + larger legible fallback
- lair_overlay_renderer now loads sprites/lairs/<type_id>.png (via
  DrawHelpers.scaled_sprite_size, POI fraction 0.45) and draws it in place of
  the diamond marker when the asset is present.
- Enlarge + keep-labeled the diamond fallback (radius 18→26) so a lair is at
  least legible until the art lands.
- Sprite path is a no-op until the standin pipeline emits sprites/lairs/*
  (tracked as a follow-up objective).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 19:47:38 -05:00
Natalie
fd24254a7a feat(@projects/@magic-civilization): prologue wanderers visible + tile-dominant unit/city sprites
- Reveal the prologue spawn box in recalculate_vision: the player owns no units
  during the turn -1/0/1 cold-open, so unit-derived fog left the whole map black
  and the wanderers invisible. Reveal the local player's box (LOS from centroid +
  each wanderer hex) whenever a prologue is active.
- Prologue overlay: draw the real dwarf_wanderer / dwarf_tribe sprites, centered
  on the hex (+ hex_center, was drawing at the corner), scaled to match in-game
  units. Marker glyph kept only as a missing-asset fallback.
- Scale all unit sprites to 0.6 of hex width and city sprites to 0.75 via
  DrawHelpers.scaled_sprite_size — Civ-like tile dominance instead of the tiny
  native 64px blit that read as unreadable tokens.
- Add toggleable leveled Log autoload (dev/info/warn/error via MC_LOG_LEVEL,
  default info); route prologue diagnostics through it with durable tags
  (prologue / prologue-overlay), not objective ids.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 19:41:19 -05:00
Natalie
1b67eba7b4 refactor(@projects/@magic-civilization): 🎨 tokenize ui menu colours (p2-74 cluster 5)
Route scenes/ui/ingame_menu.gd (4) and scenes/ui/lens_switcher.gd (4)
off inline Color() literals onto existing design tokens (no token
additions, no theme rebuild needed).

- ingame_menu save status: green/red → semantic.positive / semantic.negative.
- lens_switcher active-lens font → semantic.positive; panel bg →
  background.deepest (alpha 0.82 preserved) + border → border.panel.
- Wrap two _show_status calls to satisfy max-line-length.

Both files gdlint-clean; all token refs resolve. 0 inline Color() remain.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 22:17:49 -05:00
Natalie
fd5d6f1e88 refactor(@projects/@magic-civilization): 🎨 tokenize throne_room colours (p2-74 cluster 4)
Route scenes/menus/throne_room.gd off its 12 inline Color() literals
(the _layer_to_color placeholder palette) onto design tokens.

- Add color.throne.* (12 decoration-category placeholder colours) to
  design-tokens.json using exact-hex equivalents — zero visual change.
- Regenerate ui_theme.tres via tools/build-ui-theme.py (--check clean).
- Refactor _layer_to_color from a 13-return if-chain to a const
  LAYER_COLOR_TOKENS dict + 2 returns (DRY; clears a pre-existing
  max-returns gdlint warning too).

Verified on plum: JSON valid, theme --check clean, all 13 token refs
resolve, 0 Color() remain, gdlint fully clean on the file. Apricot visual
proof pending (placeholders render only on missing decoration sprites).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 21:57:49 -05:00
Natalie
021d57336f refactor(@projects/@magic-civilization): 🎨 tokenize knowledge_tree colours (p2-74 cluster 3)
Route the knowledge-tree (tech/culture) screen off 26 inline Color()
literals onto the design-token system.

- Add color.tech.* (8 node-state bg/border) + color.unlockAccent.* (7
  badge accents + dim) to design-tokens.json using exact-hex equivalents
  of the prior literals — zero visual change for cards/badges by
  construction.
- Regenerate ui_theme.tres via tools/build-ui-theme.py (--check clean).
- Remap detail-panel/text literals to existing background.panel /
  border.panel / border.divider / text.* / accent.* tokens.
- const→var refactor seeded in _resolve_theme_colors() (ThemeAssets.color
  isn't const-eval safe), called before _build_layout().
- Compact the indicator-badge spec block to a data-driven loop (identical
  tooltip output, fixes max-line-length).

Verified on plum: JSON valid, theme --check clean, all 26 token refs
resolve, no stale const refs (incl. subclasses), gdlint clean except the
pre-existing max-file-lines (file predates this pass; engine/scenes/ is
not gdlint-gated). Apricot visual proof pending (no godot import on plum).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 20:14:02 -05:00
Natalie
2c145ce5a3 fix(@projects/@magic-civilization): 🐛 verify hydrology mutations survive round-trip save-load
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-10 04:37:47 -07:00
Natalie
20de41a246 feat(@projects): add compute profiling layer for dev debugging
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-10 04:26:34 -07:00
Natalie
31f88a2e95 feat(@projects): document parallel simulation design
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-10 04:20:43 -07:00
Natalie
e20a576d90 feat(@projects/@magic-civilization): update objective statuses and priorities
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-10 04:02:08 -07:00
Natalie
242e717fb6 feat(@projects/@magic-civilization): add bunker test improvements
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-10 03:54:56 -07:00
Natalie
c88e136469 fix(@projects): 🐛 update deployment and guide workflows
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-10 03:38:03 -07:00
Natalie
6588c0cc76 feat(@projects/@magic-civilization): add river gap blocking for bunkers
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-10 02:27:17 -07:00
Natalie
161213a795 test(@projects/@magic-civilization): 📸 add bunker proof test scene
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-09 23:18:24 -07:00
Natalie
da5f138c23 fix(@projects/@magic-civilization): 🐛 update bunker status and acceptance criteria
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-09 23:11:43 -07:00
Natalie
d8288b2a9d feat(@projects/@magic-civilization): add suppressed tile yield suppression logic
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-09 23:05:17 -07:00
Natalie
257d16eee5 feat(@projects/@magic-civilization): add bunker river gap blocking logic
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-09 22:58:46 -07:00
Natalie
a94c0f18e5 feat(@projects/@magic-civilization): add flora transition chronicle events
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-09 22:55:29 -07:00
Natalie
77f2550fd7 feat(@projects): complete flora lifecycle chronicle events
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-09 22:48:59 -07:00
Natalie
c8491ead8d feat(engine): add flora succession test suite
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-09 22:42:21 -07:00
Natalie
147095355c fix(@projects/@magic-civilization): 🐛 adjust carrying_capacity for stable succession test
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-09 22:35:51 -07:00
Natalie
12141f4c15 feat(@projects/@magic-civilization): add flora succession bridge test
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-09 21:11:01 -07:00
Natalie
5d234523b6 feat(@projects/@magic-civilization): expose flora succession transitions
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-09 21:04:33 -07:00
Natalie
6931b934ec feat(@projects/@magic-civilization): expose flora succession transitions
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-09 20:58:07 -07:00
Natalie
97fde477c2 feat(@projects/@magic-civilization): integrate flora lifecycle into played turns
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-09 20:51:34 -07:00
Natalie
ef25e2cf8b feat(api): add round-trip serialization tests for city data
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-09 20:44:17 -07:00
Natalie
0763db8e2d feat(game): persist wind_direction for climate fidelity
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-09 01:17:04 -07:00
Natalie
00e98329fa feat(@projects/@magic-civilization): update objectives dashboard and climate integration
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-09 01:07:07 -07:00
Natalie
fdcf67801c fix(@projects/@magic-civilization): 🐛 adjust science yield calculation
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-08 20:29:12 -07:00
Natalie
9c10a90075 feat(@projects/@magic-civilization): add player economy field mapping
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-08 20:09:35 -07:00
Natalie
94d9a8b483 feat(ai): add accurate per-city yields to learned obs
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-08 19:37:33 -07:00
Natalie
c94faa3a11 feat(ai): improve move vs combat parity tracking
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-08 18:52:56 -07:00
Natalie
88bb753876 feat(ai): add parity sampling for move validation
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-08 18:39:56 -07:00
Natalie
6a15d0a418 feat(@projects/@magic-civilization): add learned slot turn execution logic
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-08 18:19:24 -07:00
Natalie
a5de8ad517 feat(@projects/@magic-civilization): add recording variant for learned slot actions
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-08 18:05:47 -07:00
Natalie
a804ceb430 fix(@projects/@magic-civilization): 🐛 fix axial-to-offset conversion for grid visibility
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-08 17:51:48 -07:00
Natalie
d83ded529e feat(@projects/@magic-civilization): add learned-controller probe integration
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-08 12:22:03 -07:00