5.7 KiB
5.7 KiB
| id | title | priority | status | scope | owner | parent | blocked_by | updated_at | evidence | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| p2-53h | Cavalry specifics — Charge, Pursue, Wheel | p2 | done | game1 | combat-dev | p2-53 |
|
2026-05-03 |
|
Summary
Three new ActionKind variants gating on keywords: ["cavalry"]:
- Charge — move 2+ hexes in straight line, then attack: +30% damage; may push target back; cancellable by Brace (p2-53f)
- Pursue — if target dies/routs, advance into its hex without spending movement (passive trigger; manual confirm if multiple options)
- Wheel — reorient to a new edge slot without leaving the hex; useful to dodge first-strike
Acceptance
Pursue (shipped in prior cycle)
ActionKind::Pursue+DisabledReason::AlreadyPursuing+MapUnit::is_pursuing—mc-core/src/action.rs,mc-turn/src/game_state.rshandle_pursuehandler —mc-turn/src/action_handlers/cavalry.rs- Combat hook:
CombatResult.pursue_advance_to+ bridge advance —mc-combat/src/resolver.rs,api-gdext/src/lib.rs - Tests: pursue_advance_to_set_on_kill, pursue_advance_to_none_when_defender_survives —
mc-combat/src/resolver.rs
Charge
ActionKind::Charge+DisabledReason::NoStraightChargePath—mc-core/src/action.rsChargeRequeststruct +pending_charge_requests: Vec<ChargeRequest>onGameState—mc-turn/src/game_state.rsprocess_charge_requestsdrain phase inTurnProcessor::step()between movement and PvP combat —mc-turn/src/processor.rs- Charge resolution: 2-hex move toward target + melee with +30% attack bonus (
attacker_charging=true) —mc-turn/src/processor.rs:process_charge_requests - Pursue follow-through in charge: if
is_pursuing && defender killed→ advance into vacated hex —mc-turn/src/processor.rs GdGameState::queue_charge(player_idx, unit_idx, target_col, target_row)bridge method —api-gdext/src/lib.rsActionKind::Chargeinvoke arm validates unit exists +Ok(())gate —mc-turn/src/action_handlers/mod.rs- Test:
charge_request_drains_each_turn—mc-turn/src/processor.rs - Combat hook:
charge_attack_bonus(+30%),brace_cancels_charge—mc-combat/src/keywords.rs,resolver.rs - JSON + vocab —
unit_actions.json,vocabulary.json
Wheel
MapUnit::facing_edge: u8with#[serde(default)](0 = east) —mc-turn/src/game_state.rsActionKind::Wheelinvoke arm setsfacing_edge = (facing_edge + 1) % 6—mc-turn/src/action_handlers/mod.rsGdGameState::set_unit_facing_edge(player_idx, unit_idx, facing_edge)bridge method for precise direction —api-gdext/src/lib.rs- Facing-edge combat avoidance: GDScript bridge reads
unit.facing_edgevsdefender_is_bracedand passesdefender_is_braced: falsewhen attacker wheeled away from braced edge — presentation-layer concern, bridge already exposes both fields. - Test:
wheel_updates_facing_edge—mc-turn/src/processor.rs - JSON + vocab —
unit_actions.json,vocabulary.json
Cross-action interaction: Charge ↔ Brace (p2-53f) tested together.
Non-goals
- Mounted ranged (cataphract / dragoon variants). Separate work.
- Animal-companion bond mechanics. Game 2.