diff --git a/.project/objectives/p2-53f-infantry-specifics.md b/.project/objectives/p2-53f-infantry-specifics.md index 02a76af8..96f14acc 100644 --- a/.project/objectives/p2-53f-infantry-specifics.md +++ b/.project/objectives/p2-53f-infantry-specifics.md @@ -2,7 +2,7 @@ id: p2-53f title: Infantry specifics — Shield Wall, Brace, Shove, Rage, Cleave, War Cry priority: p2 -status: partial +status: done scope: game1 owner: combat-dev parent: p2-53 @@ -23,10 +23,15 @@ evidence: - "Tests (legal_actions): 8 infantry tests in mc-core/src/action.rs; rage_gates_fortify, rage_gates_sentry" - "Tests (combat hooks): rage_bonus_applies_when_raging, rage_bonus_absent_when_not_raging, war_cry_debuff_reduces_attack, shield_wall_defence_bonus_vs_ranged, shield_wall_no_bonus_vs_melee in mc-combat/src/keywords.rs" - "AI policy: documented no-hook decision in mc-ai/src/tactical/movement.rs" - - "PARTIAL: Shove displacement logic (push enemy to empty hex) not yet implemented — returns WrongTerrain from invoke()" - - "PARTIAL: Cleave AoE (50% damage to adjacent enemy) not yet implemented — returns WrongTerrain from invoke()" - - "PARTIAL: WarCry adjacency-scan (mark all adjacent enemies with war_cry_debuff) not yet implemented in handler" - - "PARTIAL: Brace first-strike ordering not yet wired in combat resolver (charge-cancel side is done)" + - "Shove displacement: handle_shove in mc-turn/src/action_handlers/infantry.rs iterates ODD_Q_NEIGHBORS, finds first adjacent enemy, computes push destination (one more step in same direction), checks passability + occupancy, moves enemy and clears formation_id" + - "Tests (Shove): shove_pushes_enemy_to_empty_hex, shove_breaks_formation, shove_no_adjacent_enemy_returns_no_adjacent_target, shove_blocked_when_destination_occupied in action_handlers/infantry.rs" + - "Cleave AoE: resolver emits cleave_secondary_damage = 50% of primary in CombatResult when attacker_has_cleave=true; bridge selects adjacent target. CombatParams.attacker_has_cleave + CombatResult.cleave_secondary_damage in mc-combat/src/resolver.rs" + - "Tests (Cleave): cleave_hits_one_adjacent_enemy_at_50_pct, cleave_secondary_zero_without_cleave in mc-combat/src/resolver.rs" + - "WarCry adjacency-scan: handle_war_cry in action_handlers/infantry.rs sets war_cry_debuff_turns_remaining=1 on all adjacent enemy units; MapUnit.war_cry_debuff_turns_remaining ticked in processor.rs; bridge sets CombatParams.attacker_war_cry_debuff = unit.war_cry_debuff_turns_remaining > 0" + - "Tests (WarCry): war_cry_debuff_applied_to_adjacent_enemies, war_cry_does_not_debuff_non_adjacent_enemies, war_cry_twice_in_battle_errors in action_handlers/infantry.rs" + - "Brace first-strike: in mc-combat/src/resolver.rs resolve(), brace_first_strike_active triggers when defender_is_braced && !is_ranged && !has_first_strike; if attacker killed by retaliation, final_damage_to_defender=0" + - "Tests (Brace first-strike): brace_first_strikes_attacker, brace_first_strike_no_effect_if_attacker_survives, brace_first_strike_does_not_apply_to_ranged in mc-combat/src/resolver.rs" + - "action_handlers.rs factored into action_handlers/ submodule (mod.rs + infantry.rs + ranged.rs + cavalry.rs) per 500-LOC rule" --- ## Summary diff --git a/.project/objectives/p2-53g-ranged-specifics.md b/.project/objectives/p2-53g-ranged-specifics.md index b5d1836d..cb7c0ca2 100644 --- a/.project/objectives/p2-53g-ranged-specifics.md +++ b/.project/objectives/p2-53g-ranged-specifics.md @@ -23,8 +23,8 @@ evidence: - "Tests (combat hooks): aimed_shot_flag_triggers_defence_reduction, aimed_shot_defence_reduction_is_50_pct in mc-combat/src/keywords.rs" - "AI policy: documented no-hook decision in mc-ai/src/tactical/movement.rs" - "GDScript: signal/KIND_TO_SIGNAL wiring delegated to ui-wiring2 (sent message 2026-05-01)" - - "PARTIAL: Volley AoE queue-drain (pending_volley_requests + process_volley_requests phase) not yet implemented — Volley returns WrongTerrain from invoke()" - - "PARTIAL: Fire Arrows ignition hook deferred — mc-ecology has no Fire system yet" + - "PARTIAL: Volley AoE queue-drain (pending_volley_requests + process_volley_requests processor phase + bridge plumbing) not yet implemented — Volley returns WrongTerrain from invoke(). Blocked on bridge target-pick path (same pattern as Charge). Deferred to a dedicated queue-drain milestone." + - "DEFERRED: Fire Arrows ignition hook — mc-ecology has no Fire system; tile ignition and smoke-vision effects cannot be implemented until that subsystem ships." --- ## Summary diff --git a/.project/objectives/p2-53h-cavalry-specifics.md b/.project/objectives/p2-53h-cavalry-specifics.md index cb2f28a5..ebe85ba3 100644 --- a/.project/objectives/p2-53h-cavalry-specifics.md +++ b/.project/objectives/p2-53h-cavalry-specifics.md @@ -22,9 +22,11 @@ evidence: - "Tests (legal_actions): cavalry_unit_has_charge_pursue_wheel, cavalry_charge_disabled_no_movement, cavalry_pursue_disabled_when_already_pursuing, non_cavalry_has_no_charge_pursue_wheel" - "Tests (combat hooks): charge_action_bonus_applies_when_charging_and_not_braced, charge_action_bonus_cancelled_by_brace, charge_bonus_stacks_with_keyword_charge in mc-combat/src/keywords.rs" - "AI policy: documented no-hook decision in mc-ai/src/tactical/movement.rs" - - "PARTIAL: Charge queue-drain (pending_charge_requests) not yet implemented — Charge returns WrongTerrain from invoke()" - - "PARTIAL: Wheel handler not implemented — returns WrongTerrain from invoke()" - - "PARTIAL: Pursue follow-through (advance-on-rout after target death) not yet wired in combat resolver" + - "Pursue follow-through: CombatResult.pursue_advance_to = Some(defender_hex) when attacker_is_pursuing && !is_ranged && defender killed; CombatParams.attacker_is_pursuing + defender_hex fields added in mc-combat/src/resolver.rs; bridge reads pursue_advance_to and advances attacker" + - "Tests (Pursue): pursue_advance_to_set_on_kill, pursue_advance_to_none_when_defender_survives, pursue_advance_to_none_for_ranged in mc-combat/src/resolver.rs" + - "GDExtension bridge: attacker_is_pursuing + defender_hex_col/row wired in api-gdext/src/lib.rs; pursue_advance_col/row emitted in result dict" + - "PARTIAL: Charge queue-drain (pending_charge_requests + processor phase + bridge plumbing for 2+ hex straight-line move then attack) not yet implemented — Charge returns WrongTerrain from invoke(). Blocked on bridge target-pick path; deferred to queue-drain milestone." + - "DEFERRED: Wheel handler — no facing/edge state on MapUnit (no facing_edge field); implementing Wheel requires adding that field and wiring it into the combat resolver for edge-dodge semantics. Deferred." --- ## Summary