Skip to main content

✅ Black serpent unbounded hunger hits all in lane

CategoryInteraction
StatusPassing
Testtests/test_abilities_familiars.py::test_black_serpent_unbounded_hunger_hits_all_in_lane

Unbounded Hunger deals PWR Fixed Damage to EACH demon in target lane,

Preconditions

  • Lane 1: P1's Black Serpent (098_1) — READIED, PWR=6.

  • Lane 1: P2's Duban (001) — 0 damage.

  • Lane 1: P2's Murmur (002) — 0 damage.

  • Lane 1: P1's some ally (unit "003") — 0 damage (to verify friendly fire).

  • P1 AP: 5.

Action

  • Execute Unbounded Hunger (ability 2 on 098_1) targeting lane 1.
from engine.abilities import execute_ability

state = make_game_state()
state.players[Side.PLAYER_1].ap = 5
state.current_player = Side.PLAYER_1

serpent = make_familiar_demon("098_1", lane=1, owner=Side.PLAYER_1)
state = place_demon(state, serpent)
serpent = state.demons[-1]

duban = make_demon("001", lane=1, owner=Side.PLAYER_2)
state = place_demon(state, duban)

murmur = make_demon("002", lane=1, owner=Side.PLAYER_2)
state = place_demon(state, murmur)

ally = make_demon("003", lane=1, owner=Side.PLAYER_1)
state = place_demon(state, ally)

expected_damage = get_effective_pwr(state, serpent) # 6

new_state = execute_ability(state, serpent, 2, targets=[], choices={"target_lane": 1})

murmur_after = next(d for d in new_state.demons if d.unit_id == "002")
ally_after = next(d for d in new_state.demons if d.unit_id == "003")

# Duban (HP=6) takes 6 Fixed → fatally wounded → removed from board

Expected Postconditions

  • Duban damage = 6 (PWR fixed).

  • Murmur damage = 6.

  • P1's ally in lane 1 also takes 6 damage (friendly fire).

  • P1 AP = 2 (spent 3).

Assertions

assert not any(d.unit_id == "001" for d in new_state.demons), (
f"Duban (HP=6) must be removed — {expected_damage} Fixed Damage is fatal"
)
assert "001" in new_state.players[Side.PLAYER_2].graveyard, (
"Duban must be in P2's graveyard"
)
assert murmur_after.damage == expected_damage, f"Murmur damage should be {expected_damage}, got {murmur_after.damage}"
assert ally_after.damage == expected_damage, (
f"Ally should also take {expected_damage} damage (friendly fire — no enemy qualifier), "
f"got {ally_after.damage}"
)
assert new_state.players[Side.PLAYER_1].ap == 2