✅ Black serpent unbounded hunger hits all in lane
| Category | Interaction |
| Status | Passing |
| Test | tests/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