✅ Marchosias basic attack redirect
| Category | Interaction |
| Status | Passing |
| Test | tests/test_abilities_passive.py::test_marchosias_basic_attack_redirect |
P2 attacks P1's Duban in lane 0 where Marchosias also stands.
Preconditions
-
P2 Main Phase, P2 has 3 AP
-
Lane 0: P1's Duban (#001) — 6 HP, 0 damage, READIED
-
Lane 0: P1's Marchosias (#087) — 15 HP, 0 damage, READIED
-
Lane 0: P2's Camio (#098) — 9 HP, 0 damage, READIED, PWR 4, Range LOCAL
-
No status effects
Action
-
P2 attacks with Camio targeting Duban
-
Marchosias intercepts — redirect target to Marchosias
from engine.game_loop import execute_action
from engine.rng import DeterministicRNG
state = make_game_state(current_side=Side.PLAYER_2)
state.players[Side.PLAYER_2].ap = 3
duban = make_demon("001", lane=0, owner=Side.PLAYER_1)
state = place_demon(state, duban)
duban_id = state.demons[-1].instance_id
marchosias = make_demon("087", lane=0, owner=Side.PLAYER_1)
state = place_demon(state, marchosias)
march_id = state.demons[-1].instance_id
camio = make_demon("098", lane=0, owner=Side.PLAYER_2)
state = place_demon(state, camio)
camio_id = state.demons[-1].instance_id
rng = DeterministicRNG(seed=42)
result = execute_action(state, "attack", {
"demon_id": camio_id,
"target_id": duban_id,
}, rng)
duban_after = next(d for d in result.demons if d.instance_id == duban_id)
march_after = next(d for d in result.demons if d.instance_id == march_id)
Expected Postconditions
-
Marchosias: damage = 4 (took Camio's 4 PWR, Marchosias has 0 DEF)
-
Duban: damage = 0 (untouched)
Assertions
assert duban_after.damage == 0, (
f"Duban should be untouched (redirected). Got damage={duban_after.damage}"
)
assert march_after.damage == 4, (
f"Marchosias should have taken 4 damage. Got damage={march_after.damage}"
)