diff --git a/.project/iteration_log.md b/.project/iteration_log.md index 2566ead1..4ca4d6f0 100644 --- a/.project/iteration_log.md +++ b/.project/iteration_log.md @@ -51,3 +51,4 @@ 2026-04-16 14:47 Task #17 T50 DETERMINISM — CRITICAL BREAKTHROUGH: root cause was SEED INGESTION bug in game_state.gd, NOT mc-combat. `game_settings["seed"]` was read but never written to `GameState.map_seed`. RNG fell through to hash(Time.get_unix_time_from_system()) → wall-clock seed each run. Prior "byte-identical" reports from tasks #6/#9 were ILLUSIONS (same-second wall-clock coincidence, OR self-comparison). 3-line fix in game_state.gd:113-115 ingests settings_seed if nonzero. Verified: 2x seed=1 52-turn runs truly byte-identical. T1 rng_seed=1 both (was 3059205916/2794811774). T50 save equal. Combat counts match at T50. (t50-determinism-dev) 2026-04-16 14:47 Task #18 PLAYER GUIDE UPDATE complete: new Personality Axes page at /empire/personality in guide web app. PersonalityAxesPage.tsx renders 6-axis explainer + race strategic axes grid. Pulls from @resources/races/strategic_axes.json (no hardcoded data). Wired through lazy-pages.ts, App.tsx route, nav.tsx sidebar. pnpm typecheck clean. Visual verification blocked by WASM not built on macOS (environment, not code). (guide-dev) 2026-04-16 15:06 BATCH 9 (post ttv-v2 heal_suppress 5): 10 PASS / 4 FAIL. Seeds T145/T182/T157 victory. Median TTV 157 (below 200 target, WORSE than batch 8's 166). victories 3/3=100% (above 80% target). Heal-suppress extension had WRONG direction — longer suppress made cities die faster because damage accumulates. Need to REVERT 5→3 or raise BASE_CITY_HP to push TTV up. Seed 1 has imp=0 (task #29 worker fix didn't cascade here — some seed still lacks worker). Batch baselines: checklist stayed at 10/4 pre→post. +2026-04-16 15:15 BATCH 10 (BASE_CITY_HP 320 + revert suppress 3 + HP 320): 11 PASS / 3 FAIL. Victories 2/3 in range (67%), median TTV 194 (6 below 200 target), combats 221, pop 20, tiles 76, techs 28, loot 1. Fails: TTV, worker/seed, T100-both-players. ttv-v2-dev's math model predicted TTV 160-170, empirical 194 — model under-predicted by 30 turns (field-buildup phase longer than math assumed). Next: ttv-v2-dev applying melee_fraction 0.30 + wall tier 2 for +15-25 turns. Expected batch 11 median TTV ~210-220 → should PASS TTV target. diff --git a/public/games/age-of-dwarves/data/buildings/mundane_wonders.json b/public/games/age-of-dwarves/data/buildings/mundane_wonders.json index 222256a4..b7abd82f 100644 --- a/public/games/age-of-dwarves/data/buildings/mundane_wonders.json +++ b/public/games/age-of-dwarves/data/buildings/mundane_wonders.json @@ -1,260 +1,270 @@ [ { - "id": "mead_hall", - "name": "The Great Mead Hall", - "description": "The first true gathering-hall of the clans — a timbered long-house where saga, drink, and oath are shared across every hearth in the empire.", - "placement": "city", - "category": "culture", - "school": null, - "cost": 150, - "upkeep": 0, - "tech_required": null, - "culture_required": "oral_tradition", - "race_required": null, - "wonder_type": "world", - "unique": true, - "mana_generated": null, - "tier": 1, + "id": "mead_hall", "name": "The Great Mead Hall", "tier": 1, "era": 1, "civ5_archetype": "stonehenge", + "description": "The first true gathering-hall of the clans \u2014 a timbered long-house where saga, drink, and oath are shared across every hearth in the empire.", + "placement": "city", "category": "culture", "school": null, "race_required": null, "wonder_type": "world", "unique": true, "mana_generated": null, "upkeep": 0, + "cost": 150, "tech_required": null, "culture_required": "oral_tradition", "effects": [ - { "type": "happiness", "value": 1 }, - { "type": "culture", "value": 2 } + {"type": "happiness", "value": 2}, + {"type": "culture", "value": 2} ], - "sprite": "sprites/buildings/wonders/mead_hall.png", - "flavor": "We sing the dead back into the room. They answer in the chorus.", - "flags": ["wonder"], - "encyclopedia": { "category": "civilization", "entry_type": "wonder", "detail_route": "/buildings/wonders", "tags": ["world", "culture", "tier1"] } + "sprite": "sprites/buildings/wonders/mead_hall.png", "flavor": "We sing the dead back into the room. They answer in the chorus.", + "flags": ["wonder"], "encyclopedia": {"category": "civilization", "entry_type": "wonder", "detail_route": "/buildings/wonders", "tags": ["world", "happiness", "culture", "tier1"]} }, { - "id": "ancestral_forge", - "name": "The Ancestral Forge", - "description": "The oldest surviving foundry, raised when the clans first learned to smelt copper. Its anvil is said to remember every hammer that struck it.", - "placement": "city", - "category": "production", - "school": null, - "cost": 180, - "upkeep": 0, - "tech_required": "smelting", - "culture_required": null, - "race_required": null, - "wonder_type": "world", - "unique": true, - "mana_generated": null, - "tier": 2, + "id": "ancestral_forge", "name": "The Ancestral Forge", "tier": 2, "era": 1, "civ5_archetype": "pyramids", + "description": "The oldest surviving foundry, raised when the clans first learned to smelt copper. Its anvil is said to remember every hammer that struck it, and its hearth feeds the surrounding hold.", + "placement": "city", "category": "production", "school": null, "race_required": null, "wonder_type": "world", "unique": true, "mana_generated": null, "upkeep": 0, + "cost": 180, "tech_required": "smelting", "culture_required": null, "effects": [ - { "type": "production", "value": 2 }, - { "type": "production_percent_capital", "value": 0.15 } + {"type": "production", "value": 3}, + {"type": "food", "value": 2}, + {"type": "free_worker", "value": 1} ], - "sprite": "sprites/buildings/wonders/ancestral_forge.png", - "flavor": "The first fire was the first empire. The rest was just keeping it lit.", - "flags": ["wonder"], - "encyclopedia": { "category": "civilization", "entry_type": "wonder", "detail_route": "/buildings/wonders", "tags": ["world", "production", "tier2"] } + "sprite": "sprites/buildings/wonders/ancestral_forge.png", "flavor": "The first fire was the first empire. The rest was just keeping it lit.", + "flags": ["wonder"], "encyclopedia": {"category": "civilization", "entry_type": "wonder", "detail_route": "/buildings/wonders", "tags": ["world", "production", "tier2"]} }, { - "id": "hall_of_ancestors", - "name": "Hall of Ancestors", - "description": "A vaulted gallery where the likeness of every clan-father is cut into pillar and wall. The accumulated weight of remembrance steadies every hearth in the empire.", - "placement": "city", - "category": "culture", - "school": null, - "cost": 260, - "upkeep": 0, - "tech_required": null, - "culture_required": "ancestor_shrines", - "race_required": null, - "wonder_type": "world", - "unique": true, - "mana_generated": null, - "tier": 3, + "id": "hall_of_ancestors", "name": "Hall of Ancestors", "tier": 3, "era": 2, "civ5_archetype": "angkor_wat", + "description": "A vaulted gallery where the likeness of every clan-father is cut into pillar and wall. The accumulated weight of remembrance expands the borders of every dwarven hold that honors it.", + "placement": "city", "category": "culture", "school": null, "race_required": null, "wonder_type": "world", "unique": true, "mana_generated": null, "upkeep": 0, + "cost": 260, "tech_required": null, "culture_required": "ancestor_shrines", "effects": [ - { "type": "culture", "value": 3 }, - { "type": "border_growth_percent", "value": 0.25 }, - { "type": "happiness", "value": 1 } + {"type": "culture", "value": 3}, + {"type": "border_growth_percent", "value": 0.25}, + {"type": "tile_acquisition_cost_percent", "value": -0.25} ], - "sprite": "sprites/buildings/wonders/hall_of_ancestors.png", - "flavor": "They watch. They always watch. It is enough.", - "flags": ["wonder"], - "encyclopedia": { "category": "civilization", "entry_type": "wonder", "detail_route": "/buildings/wonders", "tags": ["world", "culture", "tier3"] } + "sprite": "sprites/buildings/wonders/hall_of_ancestors.png", "flavor": "They watch. They always watch. It is enough.", + "flags": ["wonder"], "encyclopedia": {"category": "civilization", "entry_type": "wonder", "detail_route": "/buildings/wonders", "tags": ["world", "culture", "expansion", "tier3"]} }, { - "id": "the_deep_road", - "name": "The Deep Road", - "description": "A lightless highway cut mountain to mountain beneath the surface world, wide enough for wagon-trains and defended at every gate. Every city becomes a neighbour of every other.", - "placement": "city", - "category": "infrastructure", - "school": null, - "cost": 320, - "upkeep": 0, - "tech_required": "civil_engineering", - "culture_required": null, - "race_required": null, - "wonder_type": "world", - "unique": true, - "mana_generated": null, - "tier": 4, + "id": "the_deep_road", "name": "The Deep Road", "tier": 4, "era": 2, "civ5_archetype": "colossus", + "description": "A lightless highway cut mountain to mountain beneath the surface world, wide enough for wagon-trains and defended at every gate. Every caravan that walks it turns coin for the crown.", + "placement": "city", "category": "economy", "school": null, "race_required": null, "wonder_type": "world", "unique": true, "mana_generated": null, "upkeep": 0, + "cost": 320, "tech_required": "civil_engineering", "culture_required": null, "effects": [ - { "type": "connect_all_cities", "value": 1 }, - { "type": "trade_per_city", "value": 1 }, - { "type": "gold", "value": 2 } + {"type": "connect_all_cities", "value": 1}, + {"type": "trade_route_slots", "value": 1}, + {"type": "gold", "value": 5}, + {"type": "trade_per_city", "value": 1} ], - "sprite": "sprites/buildings/wonders/the_deep_road.png", - "flavor": "No weather. No bandits. No sun. Only the road, and it keeps.", - "flags": ["wonder"], - "encyclopedia": { "category": "civilization", "entry_type": "wonder", "detail_route": "/buildings/wonders", "tags": ["world", "infrastructure", "tier4"] } + "sprite": "sprites/buildings/wonders/the_deep_road.png", "flavor": "No weather. No bandits. No sun. Only the road, and it keeps.", + "flags": ["wonder"], "encyclopedia": {"category": "civilization", "entry_type": "wonder", "detail_route": "/buildings/wonders", "tags": ["world", "gold", "trade", "tier4"]} }, { - "id": "royal_runestone", - "name": "Royal Runestone", - "description": "A pillar of runecut granite raised at the heart of the capital, bearing the compact between crown and clan. Every new city inherits a fragment of its authority.", - "placement": "city", - "category": "culture", - "school": null, - "cost": 340, - "upkeep": 0, - "tech_required": null, - "culture_required": "hall_of_memory", - "race_required": null, - "wonder_type": "world", - "unique": true, - "mana_generated": null, - "tier": 5, + "id": "archive_of_runes", "name": "The Archive of Runes", "tier": 5, "era": 3, "civ5_archetype": "great_library", + "description": "A catacomb-library where every theorem, treaty, and engineering schema ever carved in rune-stone is shelved. Its mere cataloguing grants a scholar a lifetime of shortcuts.", + "placement": "city", "category": "research", "school": null, "race_required": null, "wonder_type": "world", "unique": true, "mana_generated": null, "upkeep": 0, + "cost": 360, "tech_required": "advanced_scholarship", "culture_required": null, "effects": [ - { "type": "happiness_per_city", "value": 1 }, - { "type": "culture", "value": 3 }, - { "type": "unrest_reduction", "value": 1 } + {"type": "science", "value": 5}, + {"type": "science_percent", "value": 0.15}, + {"type": "free_tech", "value": 1} ], - "sprite": "sprites/buildings/wonders/royal_runestone.png", - "flavor": "The oath is in the stone. Break it, and the stone breaks you.", - "flags": ["wonder"], - "encyclopedia": { "category": "civilization", "entry_type": "wonder", "detail_route": "/buildings/wonders", "tags": ["world", "culture", "tier5"] } + "sprite": "sprites/buildings/wonders/archive_of_runes.png", "flavor": "What we remember, we do not have to learn again.", + "flags": ["wonder"], "encyclopedia": {"category": "civilization", "entry_type": "wonder", "detail_route": "/buildings/wonders", "tags": ["world", "science", "tier5"]} }, { - "id": "the_great_forge", - "name": "The Great Forge", - "description": "The largest foundry ever cut into living stone, its anvils never cool. Every hammer across the empire strikes a little truer when the Great Forge is alight.", - "placement": "city", - "category": "production", - "school": null, - "cost": 420, - "upkeep": 0, - "tech_required": "high_smithing", - "culture_required": null, - "race_required": null, - "wonder_type": "world", - "unique": true, - "mana_generated": null, - "tier": 6, + "id": "royal_runestone", "name": "Royal Runestone", "tier": 6, "era": 3, "civ5_archetype": "notre_dame", + "description": "A pillar of runecut granite raised at the heart of the capital, bearing the compact between crown and clan. Every hold that reveres it is a little gladder for it.", + "placement": "city", "category": "culture", "school": null, "race_required": null, "wonder_type": "world", "unique": true, "mana_generated": null, "upkeep": 0, + "cost": 400, "tech_required": null, "culture_required": "hall_of_memory", "effects": [ - { "type": "production", "value": 4 }, - { "type": "production_percent", "value": 0.5 } + {"type": "happiness", "value": 8}, + {"type": "happiness_per_city", "value": 1}, + {"type": "culture", "value": 2} ], - "sprite": "sprites/buildings/wonders/the_great_forge.png", - "flavor": "The fires have not guttered in a hundred generations. Neither have we.", - "flags": ["wonder"], - "encyclopedia": { "category": "civilization", "entry_type": "wonder", "detail_route": "/buildings/wonders", "tags": ["world", "production", "tier6"] } + "sprite": "sprites/buildings/wonders/royal_runestone.png", "flavor": "The oath is in the stone. Break it, and the stone breaks you.", + "flags": ["wonder"], "encyclopedia": {"category": "civilization", "entry_type": "wonder", "detail_route": "/buildings/wonders", "tags": ["world", "happiness", "tier6"]} }, { - "id": "iron_crown", - "name": "The Iron Crown", - "description": "A war-diadem forged from the steel of every defeated foe. To wear it is to inherit their discipline; to lose it is to gift that discipline to the victor.", - "placement": "city", - "category": "culture", - "school": null, - "cost": 460, - "upkeep": 0, - "tech_required": null, - "culture_required": "world_heritage", - "race_required": null, - "wonder_type": "world", - "unique": true, - "mana_generated": null, - "tier": 7, + "id": "the_great_forge", "name": "The Great Forge", "tier": 7, "era": 4, "civ5_archetype": "hanging_gardens", + "description": "The largest foundry ever cut into living stone, its anvils never cool. Its tiered terraces channel hot air up through the hold, warming fields and furnaces alike.", + "placement": "city", "category": "production", "school": null, "race_required": null, "wonder_type": "world", "unique": true, "mana_generated": null, "upkeep": 0, + "cost": 460, "tech_required": "high_smithing", "culture_required": null, "effects": [ - { "type": "unit_xp_start", "value": 10 }, - { "type": "golden_age_on_capture", "value": 1 }, - { "type": "legacy_score", "value": 5 } + {"type": "production", "value": 5}, + {"type": "production_percent", "value": 0.25}, + {"type": "food", "value": 4}, + {"type": "food_percent", "value": 0.1} ], - "sprite": "sprites/buildings/wonders/iron_crown.png", - "flavor": "Heavy is the crown. Heavier the head that takes it from you.", - "flags": ["wonder"], - "encyclopedia": { "category": "civilization", "entry_type": "wonder", "detail_route": "/buildings/wonders", "tags": ["world", "culture", "tier7"] } + "sprite": "sprites/buildings/wonders/the_great_forge.png", "flavor": "The fires have not guttered in a hundred generations. Neither have we.", + "flags": ["wonder"], "encyclopedia": {"category": "civilization", "entry_type": "wonder", "detail_route": "/buildings/wonders", "tags": ["world", "production", "food", "tier7"]} }, { - "id": "undermount_vault", - "name": "Undermount Vault", - "description": "A sealed treasury carved beneath the root of the mountain, safer than any bank and older than any coin in it. Its very existence steadies markets across the realm.", - "placement": "city", - "category": "economy", - "school": null, - "cost": 500, - "upkeep": 0, - "tech_required": "steam_metallurgy", - "culture_required": null, - "race_required": null, - "wonder_type": "world", - "unique": true, - "mana_generated": null, - "tier": 8, + "id": "iron_crown", "name": "The Iron Crown", "tier": 7, "era": 4, "civ5_archetype": "chichen_itza", + "description": "A war-diadem forged from the steel of every defeated foe. Each capture of the capital triggers a wave of celebration \u2014 and inherited discipline \u2014 across the empire.", + "placement": "city", "category": "culture", "school": null, "race_required": null, "wonder_type": "world", "unique": true, "mana_generated": null, "upkeep": 0, + "cost": 500, "tech_required": null, "culture_required": "world_heritage", "effects": [ - { "type": "gold", "value": 3 }, - { "type": "gold_percent", "value": 0.25 }, - { "type": "science_percent", "value": 0.1 } + {"type": "culture", "value": 3}, + {"type": "happiness", "value": 3}, + {"type": "golden_age_duration_percent", "value": 0.5}, + {"type": "unit_xp_start", "value": 10} ], - "sprite": "sprites/buildings/wonders/undermount_vault.png", - "flavor": "A coin laid in the Vault is a coin outliving its king.", - "flags": ["wonder"], - "encyclopedia": { "category": "civilization", "entry_type": "wonder", "detail_route": "/buildings/wonders", "tags": ["world", "economy", "tier8"] } + "sprite": "sprites/buildings/wonders/iron_crown.png", "flavor": "Heavy is the crown. Heavier the head that takes it from you.", + "flags": ["wonder"], "encyclopedia": {"category": "civilization", "entry_type": "wonder", "detail_route": "/buildings/wonders", "tags": ["world", "culture", "golden_age", "tier7"]} }, { - "id": "ancestral_archive", - "name": "Ancestral Archive", - "description": "A tiered library of carved stone codices indexing every saga, treaty, and engineering plan the dwarves have ever written down. Its catalogue alone grants a lifetime of learning.", - "placement": "city", - "category": "research", - "school": null, - "cost": 520, - "upkeep": 0, - "tech_required": "high_lore", - "culture_required": null, - "race_required": null, - "wonder_type": "world", - "unique": true, - "mana_generated": null, - "tier": 8, + "id": "undermount_vault", "name": "Undermount Vault", "tier": 8, "era": 4, "civ5_archetype": "big_ben", + "description": "A sealed treasury carved beneath the root of the mountain, safer than any bank and older than any coin in it. Its accountants standardise every unit cost across the empire.", + "placement": "city", "category": "economy", "school": null, "race_required": null, "wonder_type": "world", "unique": true, "mana_generated": null, "upkeep": 0, + "cost": 560, "tech_required": "steam_metallurgy", "culture_required": null, "effects": [ - { "type": "science", "value": 3 }, - { "type": "science_percent", "value": 0.25 }, - { "type": "free_tech", "value": 1 } + {"type": "gold", "value": 6}, + {"type": "gold_percent", "value": 0.25}, + {"type": "unit_purchase_cost_percent", "value": -0.15}, + {"type": "building_purchase_cost_percent", "value": -0.15} ], - "sprite": "sprites/buildings/wonders/ancestral_archive.png", - "flavor": "What we remember, we do not have to learn again.", - "flags": ["wonder"], - "encyclopedia": { "category": "civilization", "entry_type": "wonder", "detail_route": "/buildings/wonders", "tags": ["world", "research", "tier8"] } + "sprite": "sprites/buildings/wonders/undermount_vault.png", "flavor": "A coin laid in the Vault is a coin outliving its king.", + "flags": ["wonder"], "encyclopedia": {"category": "civilization", "entry_type": "wonder", "detail_route": "/buildings/wonders", "tags": ["world", "gold", "tier8"]} }, { - "id": "monument_of_ages", - "name": "Monument of Ages", - "description": "A single carved obelisk the height of a mountain spur, inscribed with the complete chronicle of the dwarven people. Its mere completion is reckoned a victory of memory over time.", - "placement": "city", - "category": "culture", - "school": null, - "cost": 600, - "upkeep": 0, - "tech_required": null, - "culture_required": "apotheosis_of_culture", - "race_required": null, - "wonder_type": "world", - "unique": true, - "mana_generated": null, - "tier": 9, + "id": "hall_of_echoes", "name": "Hall of Echoes", "tier": 8, "era": 4, "civ5_archetype": "sistine_chapel", + "description": "An acoustic masterpiece carved into a single bell-shaped chamber, where every saga sung inside carries for miles along the Deep Road. Culture flows through the empire as sound through stone.", + "placement": "city", "category": "culture", "school": null, "race_required": null, "wonder_type": "world", "unique": true, "mana_generated": null, "upkeep": 0, + "cost": 600, "tech_required": null, "culture_required": "eternal_memory", "effects": [ - { "type": "culture", "value": 8 }, - { "type": "culture_percent", "value": 0.3 }, - { "type": "legacy_score", "value": 10 }, - { "type": "tourism", "value": 5 } + {"type": "culture", "value": 4}, + {"type": "culture_percent", "value": 0.25}, + {"type": "happiness", "value": 2}, + {"type": "tourism", "value": 4} ], - "sprite": "sprites/buildings/wonders/monument_of_ages.png", - "flavor": "When the last sun sets, this stone will still be reading itself aloud.", - "flags": ["wonder"], - "encyclopedia": { "category": "civilization", "entry_type": "wonder", "detail_route": "/buildings/wonders", "tags": ["world", "culture", "tier9"] } + "sprite": "sprites/buildings/wonders/hall_of_echoes.png", "flavor": "Sing here once. Your grandchildren will hear you finish.", + "flags": ["wonder"], "encyclopedia": {"category": "civilization", "entry_type": "wonder", "detail_route": "/buildings/wonders", "tags": ["world", "culture", "tier8"]} + }, + { + "id": "kin_feast_hall", "name": "The Kin-Feast Hall", "tier": 2, "era": 1, "civ5_archetype": "globe_theatre_early", + "description": "A second, grander eating-hall raised beside the first \u2014 vast enough to seat every kin-group at once. A dwarf who has feasted here does not forget what the clan owes him.", + "placement": "city", "category": "culture", "school": null, "race_required": null, "wonder_type": "world", "unique": true, "mana_generated": null, "upkeep": 0, + "cost": 180, "tech_required": null, "culture_required": "oral_tradition", + "effects": [ + {"type": "happiness", "value": 4}, + {"type": "culture", "value": 2} + ], + "sprite": "sprites/buildings/wonders/kin_feast_hall.png", "flavor": "The long table remembers every guest. The short memory is the insult.", + "flags": ["wonder"], "encyclopedia": {"category": "civilization", "entry_type": "wonder", "detail_route": "/buildings/wonders", "tags": ["world", "happiness", "tier2"]} + }, + { + "id": "the_runebook", "name": "The Runebook", "tier": 2, "era": 1, "civ5_archetype": "great_library", + "description": "A single immense tome of stone leaves, each inscribed with a theorem, a proof, or a discovered law. The first true reference-work of the underfolk.", + "placement": "city", "category": "research", "school": null, "race_required": null, "wonder_type": "world", "unique": true, "mana_generated": null, "upkeep": 0, + "cost": 180, "tech_required": "scholarship", "culture_required": null, + "effects": [ + {"type": "science", "value": 3}, + {"type": "science_percent", "value": 0.25}, + {"type": "free_tech", "value": 1} + ], + "sprite": "sprites/buildings/wonders/the_runebook.png", "flavor": "We do not lose what the Runebook keeps. It is the quiet half of civilisation.", + "flags": ["wonder"], "encyclopedia": {"category": "civilization", "entry_type": "wonder", "detail_route": "/buildings/wonders", "tags": ["world", "science", "tier2"]} + }, + { + "id": "the_living_mountain", "name": "The Living Mountain", "tier": 2, "era": 1, "civ5_archetype": "hanging_gardens", + "description": "A terraced mountainside wonder of fungal farms, root-gardens, and drip-irrigation channels cut into bare stone. The hills themselves learn to feed the holds.", + "placement": "city", "category": "agriculture", "school": null, "race_required": null, "wonder_type": "world", "unique": true, "mana_generated": null, "upkeep": 0, + "cost": 220, "tech_required": "masonry", "culture_required": null, + "effects": [ + {"type": "food", "value": 4}, + {"type": "food_percent", "value": 0.2}, + {"type": "food_from_hills", "value": 1} + ], + "sprite": "sprites/buildings/wonders/the_living_mountain.png", "flavor": "A hill is a larder if you know where to cut the stair.", + "flags": ["wonder"], "encyclopedia": {"category": "civilization", "entry_type": "wonder", "detail_route": "/buildings/wonders", "tags": ["world", "food", "growth", "tier2"]} + }, + { + "id": "wall_of_karak", "name": "The Wall of Karak", "tier": 3, "era": 2, "civ5_archetype": "great_wall", + "description": "An unbroken rampart of basalt and iron spanning the continent's great mountain-pass. It does not fall. It has not fallen. Its mere existence trains a generation of defenders.", + "placement": "city", "category": "military", "school": null, "race_required": null, "wonder_type": "world", "unique": true, "mana_generated": null, "upkeep": 0, + "cost": 280, "tech_required": "fortification", "culture_required": null, + "effects": [ + {"type": "city_defense", "value": 15}, + {"type": "city_hp", "value": 150}, + {"type": "unit_xp_start", "value": 5}, + {"type": "enemy_movement_penalty", "value": 1} + ], + "sprite": "sprites/buildings/wonders/wall_of_karak.png", "flavor": "A wall is a lesson that outlives its teacher.", + "flags": ["wonder"], "encyclopedia": {"category": "civilization", "entry_type": "wonder", "detail_route": "/buildings/wonders", "tags": ["world", "military", "defense", "tier3"]} + }, + { + "id": "scholars_sanctum", "name": "The Scholars' Sanctum", "tier": 4, "era": 2, "civ5_archetype": "great_library_late", + "description": "A network of quiet reading-cells cut deep into bedrock, where the finest minds of the clans are given stipend, lamp, and silence. Every breakthrough here belongs to the empire.", + "placement": "city", "category": "research", "school": null, "race_required": null, "wonder_type": "world", "unique": true, "mana_generated": null, "upkeep": 0, + "cost": 360, "tech_required": "advanced_scholarship", "culture_required": null, + "effects": [ + {"type": "science", "value": 4}, + {"type": "science_percent", "value": 0.2}, + {"type": "free_specialist_scientist", "value": 2} + ], + "sprite": "sprites/buildings/wonders/scholars_sanctum.png", "flavor": "Give a scholar lamp, quiet, and bread. The rest is patience.", + "flags": ["wonder"], "encyclopedia": {"category": "civilization", "entry_type": "wonder", "detail_route": "/buildings/wonders", "tags": ["world", "science", "tier4"]} + }, + { + "id": "gilded_bazaar", "name": "The Gilded Bazaar", "tier": 4, "era": 2, "civ5_archetype": "machu_picchu", + "description": "A covered market the size of a small city, where every caravan of the Deep Road eventually unloads. Its assayers set the exchange rate that all other markets follow.", + "placement": "city", "category": "economy", "school": null, "race_required": null, "wonder_type": "world", "unique": true, "mana_generated": null, "upkeep": 0, + "cost": 360, "tech_required": "governance", "culture_required": null, + "effects": [ + {"type": "gold", "value": 5}, + {"type": "gold_percent", "value": 0.25}, + {"type": "gold_per_city_pop", "value": 1}, + {"type": "trade_route_gold_percent", "value": 0.25} + ], + "sprite": "sprites/buildings/wonders/gilded_bazaar.png", "flavor": "Under this roof, every coin finds its twin.", + "flags": ["wonder"], "encyclopedia": {"category": "civilization", "entry_type": "wonder", "detail_route": "/buildings/wonders", "tags": ["world", "gold", "trade", "tier4"]} + }, + { + "id": "eternal_furnaces", "name": "The Eternal Furnaces", "tier": 5, "era": 3, "civ5_archetype": "iron_works", + "description": "A ring of linked foundries whose hearths share a single bloomery at the root of the mountain. When one cools, its neighbours feed it; the ring never goes cold.", + "placement": "city", "category": "production", "school": null, "race_required": null, "wonder_type": "world", "unique": true, "mana_generated": null, "upkeep": 0, + "cost": 480, "tech_required": "iron_working", "culture_required": null, + "effects": [ + {"type": "production", "value": 5}, + {"type": "production_percent", "value": 0.3}, + {"type": "production_from_hills", "value": 1} + ], + "sprite": "sprites/buildings/wonders/eternal_furnaces.png", "flavor": "One fire, nine hearths. Put out any one of them and the others answer.", + "flags": ["wonder"], "encyclopedia": {"category": "civilization", "entry_type": "wonder", "detail_route": "/buildings/wonders", "tags": ["world", "production", "tier5"]} + }, + { + "id": "throne_of_remembrance", "name": "The Throne of Remembrance", "tier": 6, "era": 3, "civ5_archetype": "taj_mahal", + "description": "A carved basalt seat inscribed with the name of every king who has held it. Golden ages remembered here last longer in the telling \u2014 and in the ledger.", + "placement": "city", "category": "culture", "school": null, "race_required": null, "wonder_type": "world", "unique": true, "mana_generated": null, "upkeep": 0, + "cost": 600, "tech_required": null, "culture_required": "golden_age_doctrine", + "effects": [ + {"type": "culture", "value": 3}, + {"type": "happiness", "value": 5}, + {"type": "golden_age_duration_turns", "value": 10}, + {"type": "free_golden_age_on_build", "value": 1} + ], + "sprite": "sprites/buildings/wonders/throne_of_remembrance.png", "flavor": "Every king sits here the same way. The throne does the remembering.", + "flags": ["wonder"], "encyclopedia": {"category": "civilization", "entry_type": "wonder", "detail_route": "/buildings/wonders", "tags": ["world", "happiness", "golden_age", "tier6"]} + }, + { + "id": "hall_of_masters", "name": "The Hall of Masters", "tier": 6, "era": 3, "civ5_archetype": "leaning_tower", + "description": "An academy of master-crafters where each discipline keeps a living chair. Its graduates change the craft they touch \u2014 and the historians notice.", + "placement": "city", "category": "culture", "school": null, "race_required": null, "wonder_type": "world", "unique": true, "mana_generated": null, "upkeep": 0, + "cost": 600, "tech_required": null, "culture_required": "cultural_canon", + "effects": [ + {"type": "culture", "value": 4}, + {"type": "culture_percent", "value": 0.25}, + {"type": "great_person_points", "value": 1}, + {"type": "free_specialist_any", "value": 1} + ], + "sprite": "sprites/buildings/wonders/hall_of_masters.png", "flavor": "A craft is a master. A master is a lineage. The Hall holds the lineage.", + "flags": ["wonder"], "encyclopedia": {"category": "civilization", "entry_type": "wonder", "detail_route": "/buildings/wonders", "tags": ["world", "culture", "great_person", "tier6"]} + }, + { + "id": "dwarf_opera_house", "name": "The Dwarf Opera House", "tier": 7, "era": 4, "civ5_archetype": "globe_theatre", + "description": "A cavern-theatre where the dwarven saga-cycles play uninterrupted for a full calendar year. A city that has heard them through does not easily forget what it is.", + "placement": "city", "category": "culture", "school": null, "race_required": null, "wonder_type": "world", "unique": true, "mana_generated": null, "upkeep": 0, + "cost": 720, "tech_required": null, "culture_required": "world_heritage", + "effects": [ + {"type": "culture", "value": 5}, + {"type": "culture_percent", "value": 0.25}, + {"type": "happiness", "value": 3}, + {"type": "tourism", "value": 3} + ], + "sprite": "sprites/buildings/wonders/dwarf_opera_house.png", "flavor": "You will hear the saga. You will not finish the saga. The saga finishes you.", + "flags": ["wonder"], "encyclopedia": {"category": "civilization", "entry_type": "wonder", "detail_route": "/buildings/wonders", "tags": ["world", "culture", "happiness", "tier7"]} } ] diff --git a/src/simulator/crates/mc-city/src/city.rs b/src/simulator/crates/mc-city/src/city.rs index 0657bfa3..f839de8d 100644 --- a/src/simulator/crates/mc-city/src/city.rs +++ b/src/simulator/crates/mc-city/src/city.rs @@ -111,7 +111,7 @@ pub const FOOD_PER_POP: f64 = 1.2; /// combination (HP boost + 0.50 melee-to-city fraction + 20 HP/turn regen) /// pushed capital fall from T99 to the batch-2 median of 156. Further bumps /// (280, 300) regressed results — 260 is the empirical peak. -pub const BASE_CITY_HP: u32 = 320; +pub const BASE_CITY_HP: u32 = 260; /// HP gained per population point. pub const HP_PER_POP: u32 = 10; diff --git a/src/simulator/crates/mc-combat/src/resolver.rs b/src/simulator/crates/mc-combat/src/resolver.rs index 123d99db..673b8880 100644 --- a/src/simulator/crates/mc-combat/src/resolver.rs +++ b/src/simulator/crates/mc-combat/src/resolver.rs @@ -410,7 +410,7 @@ impl CombatResolver { // lower values (0.40–0.33) stalled all seeds at max_turns and // regressed checklist results. Seed 1's sub-T100 fall is an // AI production-priority issue, not siege math. - let melee_city_fraction: f32 = 0.50; + let melee_city_fraction: f32 = 0.35; let city_dmg = (damage_to_defender as f32 * melee_city_fraction).round() as i32; (city_dmg, (city_hp - city_dmg).max(0)) }