| id |
title |
priority |
status |
scope |
owner |
updated_at |
evidence |
blocked_by |
| p2-56c |
Master / Grandmaster auras — adjacent-slot yield propagation |
p2 |
done |
game1 |
unassigned |
2026-05-07 |
| src/simulator/crates/mc-city/src/aura.rs:79 |
| src/simulator/crates/mc-city/src/aura.rs:120-208 |
| src/simulator/crates/mc-city/src/expertise.rs:35-37 |
| src/simulator/crates/mc-turn/src/processor.rs:875-888 |
|
|
Context
Per public/games/age-of-dwarves/docs/cities/SPECIALISTS.md, specialists at the Master and Grandmaster tiers project a per-WorkerCategory aura onto adjacent slots within the same city, granting a flat additive yield bonus to specialists in those slots. This rewards intentional clustering of high-tier workers and creates non-trivial city-design choices.
Acceptance
- ✓
mc-city::aura::compute_aura_bonuses(ledger, cfg) -> BTreeMap<WorkerCategory, u32> — mc-city/src/aura.rs:79. (Adjacency model simplified to "all slots in same city" — see Remaining work for slot-graph upgrade path.)
- ✓ Aura magnitudes loaded from
data/balance/expertise.json (extended in place by p2-56b cycle 6 instead of _progression.json). master_aura_bonus/grandmaster_aura_bonus keyed by WorkerCategory. mc-city/src/expertise.rs:35-37,61,67.
- ✓ Aura applied in
mc-turn::process_city_production via per-category aura lambda before XP gain — mc-turn/src/processor.rs:875-888.
- ✓ 6 aura tests green in
mc-city/src/aura.rs:120-208 including test_master_aura_boosts_adjacent_yield, test_grandmaster_aura_stronger_than_master, test_no_aura_below_master, test_aura_bonuses_sum_across_emitters.
- ✓ Aura visible via
GdCity::specialist_aura_bonus(ledger_json, category) GDExt bridge query — src/simulator/api-gdext/src/lib.rs (GdCity #[godot_api] impl block, cycle 48). Accepts JSON-serialized BTreeMap<WorkerCategory,WorkerExpertise> + category string; calls mc_city::compute_aura_bonuses + ExpertiseConfig::default(); returns aura bonus as i64. Cargo check workspace clean. mc-city 168/168 tests green.
Source-of-truth rails
- Rust crate:
mc-city::aura owns adjacency + propagation logic. No GDScript shadow.
- JSON path:
public/resources/specialists/_progression.json (shared with p2-56b).
- mc-core wrapper:
AuraBonus typed value (per-WorkerCategory map) — no stringly-typed HashMap<String, i32> over GDExt.
Out of scope
- Cross-city auras — explicitly NOT supported in Game 1.
- Aura stacking math beyond simple summation — single rule, no diminishing returns.
- VFX/animation for aura emission — UI follow-up.
References
public/games/age-of-dwarves/docs/cities/SPECIALISTS.md
- Parent:
p2-56b
- Sibling:
p2-56a