✅ Familiars are demons
| Category | Regression |
| Status | Passing |
| Test | tests/test_abilities_familiars.py::test_familiars_are_demons |
Regression: confusion #2 — Familiars ARE demons.
Preconditions
-
Lane 0: P1's Seir (unit "050") — 9 HP, 5 damage, READIED.
-
Lane 0: P1's Locusts A (058_1) familiar — 1 HP, 0 damage, READIED.
-
Custom trigger registered on Seir: "When a local allied demon dies,
-
remove all damage from Seir."
-
(Unit "050" (Seir) has no existing triggers from the familiar module,
-
so registering here does not conflict with other tests.)
Action
-
Locusts A becomes fatally wounded and dies (resolve_fatally_wounded).
-
The FATALLY_WOUNDED event fires with Locust as target.
-
Seir's passive should fire because Locusts A IS a demon (confusion #2).
state_after_event = fire_event(
state_after_fw,
GameEvent(
event_type=EventType.FATALLY_WOUNDED,
source=None,
target=locust, # Locust IS a demon — this should trigger Seir
value=0,
side=Side.PLAYER_1,
lane=0,
),
)
# Seir should have 0 damage (passive triggered)
seir_after = next(d for d in state_after_event.demons if d.unit_id == "050")
Expected Postconditions
-
Seir's damage = 0 (passive triggered on Locust's death).
-
Locusts A removed from field and added to P1's familiar_deck.
-
P1's CP = 0 (Locusts CP = 0, so no increase).
-
Regression: Familiars ARE demons — "when a demon dies" triggers on familiar death.
Assertions
assert seir_after.damage == 0, (
f"Seir should have 0 damage after Locust dies (familiars ARE demons), "
f"got {seir_after.damage}. Regression: confusion #2."
)
# Locust removed from field
locust_on_field = [d for d in state_after_event.demons if d.unit_id == "058_1"]
assert len(locust_on_field) == 0, "Locust should have been removed from field."
# Locust returned to familiar_deck (not graveyard)
assert "058_1" in state_after_event.players[Side.PLAYER_1].familiar_deck, (
"Locust should be in familiar_deck after death, not graveyard."
)
assert "058_1" not in state_after_event.players[Side.PLAYER_1].graveyard, (
"Locust must NOT be in graveyard — familiars return to familiar_deck."
)