magicciv/.project/objectives/p0-06-economy-integration.md
Natalie 74e1db8602 feat(@projects/@magic-civilization): finalize economy integration
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-04-17 02:16:11 -07:00

2.8 KiB

id title priority status scope updated_at evidence
p0-06 Fold gold income / upkeep / improvement yields into turn loop p0 done game1 2026-04-17
src/simulator/crates/mc-economy/src/lib.rs
src/simulator/crates/mc-economy/src/gold.rs
src/simulator/crates/mc-economy/src/treasury.rs
src/simulator/crates/mc-economy/src/stockpile.rs
src/simulator/crates/mc-turn/src/processor.rs

Summary

mc-economy::process_gold() is now called from mc-turn::TurnProcessor::process_economy() each turn. Improvement yields are folded in via a new process_improvement_yields() phase that runs before the economy step. All iteration is over BTreeMap-sorted keys for determinism. 807 tests passing, 0 failures on apricot.

Acceptance

  • ✓ Per-turn gold income = Σ(city marketplace yield + trade route yield).

    • processor.rs::process_economy() builds CityGoldInput per city, looks up building_gold_table for flat gold + gold_percent per building type, uses wealth-axis proxy for tile gold, then calls mc_economy::process_gold(&city_inputs, &unit_inputs).
    • Test: t7b_building_gold_table_adds_to_income — marketplace (+3 gold, +25%) on 10-gold base → asserts 13 net gold.
  • ✓ Unit upkeep deducted per turn; negative treasury triggers unit disbanding per difficulty.json rule.

    • process_economy() collects UnitMaintenanceInput from player.unit_upkeep. process_gold() computes net_gold including upkeep; insolvency path disbands cheapest unit.
    • Test: t7b_building_upkeep_deducted_and_insolvency — forge (20 upkeep) on 0-gold treasury → unit count drops by 1.
  • ✓ Improvement yields (farm, mine, hunting_grounds) fold into owning city's stockpile.

    • New process_improvement_yields() in processor.rs iterates player.city_improvements (Vec<Vec>), looks up improvement_yield_table for food/production deltas, adds to city.food_yield / city.prod_yield each turn.
    • Test: t7b_improvement_yields_fold_into_city — farm(+2 food) + mine(+2 prod) each turn; after 2 turns pop and production are elevated vs baseline.
  • ✓ Deterministic across seeds (BTreeMap iteration; no floating-point accumulation order issues).

    • process_economy() builds a BTreeMap<&str, &BuildingGoldEntry> from city buildings before iterating.
    • process_improvement_yields() builds a BTreeMap<&str, count> from improvement lists before applying yields.
    • No floating-point accumulation; all gold arithmetic is integer (i32).
  • mc-turn tests exercise the full income/upkeep/yield path.

    • Three new tests added at processor.rs t7b block: t7b_building_gold_table_adds_to_income, t7b_building_upkeep_deducted_and_insolvency, t7b_improvement_yields_fold_into_city.
    • cargo test --workspace on apricot: 807 passing, 0 failures.