Skip to main content

✅ Marchosias basic attack redirect

CategoryInteraction
StatusPassing
Testtests/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}"
)