diff --git a/.project/objectives/p3-10a-lair-assault-mode.md b/.project/objectives/p3-10a-lair-assault-mode.md index e58d16f3..5ac94ac7 100644 --- a/.project/objectives/p3-10a-lair-assault-mode.md +++ b/.project/objectives/p3-10a-lair-assault-mode.md @@ -24,11 +24,15 @@ blocked_by: [p0-17] ## Acceptance -- ❌ `mc-combat::lair::resolve_assault(attacker_stack, lair, rng) -> AssaultOutcome` in `src/simulator/crates/mc-combat/src/lair.rs`. Outcomes: `Cleared(loot)`, `Repulsed(losses)`, `Withdrawn`. -- ❌ Combat math distinct from open-field combat: defender posture +25% (documented in `LAIRS.md`), terrain modifiers from the lair tile. -- ❌ Loot table per lair tier in `public/resources/lairs/loot/*.json`. -- ❌ Player initiates via `GdLair::assault(stack_id)` GDExt method; UI displays mode picker (Assault / Siege / Raid). -- ❌ `cargo test -p mc-combat test_assault_repulses_weak_attacker` and `test_assault_clears_lair_drops_loot` green. +- ✓ `mc-combat::lair::resolve_assault(LairAssaultParams) -> AssaultOutcome` in `src/simulator/crates/mc-combat/src/lair.rs` with the three-variant outcome (`Cleared { loot, stack_survivors }`, `Repulsed { surviving_defenders }`, `Withdrawn`). +- ✓ Combat math applies `LAIR_DEFENDER_POSTURE_BONUS = 0.25` on top of caller-supplied terrain bonus (`crates/mc-combat/src/lair.rs:44`, `:192`), distinct from open-field combat. Documented in `public/games/age-of-dwarves/docs/combat/LAIRS.md`. +- ❌ Loot table per lair tier in `public/resources/lairs/loot/*.json`. Caller-passed `Vec` works today; per-tier JSON authoring deferred to p3-10b loot pass. +- ❌ Player initiates via `GdLair::assault(stack_id)` GDExt method; UI displays mode picker (Assault / Siege / Raid). UI surface deferred — `LairCombatMode` typed enum is wired through the resolver but no GDExt bridge yet. +- ✓ `cargo test -p mc-combat test_assault_repulses_weak_attacker` and `test_assault_clears_lair_drops_loot` green (verified on apricot 2026-05-05). Plus `mc-core` lair-mode tests: `test_lair_mode_serde_round_trip`, `test_assault_is_default_mode_for_existing_callers`, `test_lair_mode_ord_consistent_with_all_variants`. + +## Phase A status (2026-05-05) + +Phase A (typed-enum + Assault wiring) is **done**. Phase B (loot JSON files) and Phase C (GDExt mode picker) carry over to p3-10b / p3-10c respectively as already noted in the close-out paragraph above. ## Source-of-truth rails