✅ Conformity replace trigger swaps target with conformity familiar
| Category | Ability |
| Status | Passing |
| Test | tests/test_abilities_familiars.py::test_conformity_replace_trigger_swaps_target_with_conformity_familiar |
Conformity A resolves an action targeting a demon. That demon
Preconditions
-
Lane 0: P1's Conformity A (117_1) — 12 HP, 0 damage, READIED.
-
Lane 0: P2's Duban (001) — 6 HP, 0 damage, READIED.
-
P1's familiar_deck = ["117_2"] (Conformity B available).
Action
-
Fire ABILITY_USED event with source=Conformity A, target=Duban.
-
The Conformity replace trigger fires.
from engine.events import fire_event
state = make_game_state()
state.players[Side.PLAYER_1].familiar_deck = ["117_2"]
state.players[Side.PLAYER_2].familiar_deck = []
conformity = make_familiar_demon("117_1", lane=0, owner=Side.PLAYER_1)
state = place_demon(state, conformity)
conformity = state.demons[-1]
duban = make_demon("001", lane=0, owner=Side.PLAYER_2)
state = place_demon(state, duban)
duban = state.demons[-1]
# Fire ABILITY_USED event as if Conformity A used an action targeting Duban
event = GameEvent(
event_type=EventType.ABILITY_USED,
source=conformity,
target=duban,
value=0,
side=Side.PLAYER_1,
lane=0,
)
new_state = fire_event(state, event)
# Duban should be replaced
duban_on_field = [d for d in new_state.demons if d.unit_id == "001"]
Expected Postconditions
-
Duban is removed from field.
-
Duban's unit_id ("001") is added to P2's graveyard
-
(since Duban is not a familiar).
-
A new Conformity B demon appears in Lane 0 owned by P1.
-
P1's familiar_deck no longer contains "117_2".
Assertions
assert len(duban_on_field) == 0, "Duban should be removed from field after Conformity replace."
# A Conformity familiar should now be in lane 0 owned by P1
conformity_b_on_field = [
d for d in new_state.demons
if d.unit_id == "117_2" and d.owner == Side.PLAYER_1
]
assert len(conformity_b_on_field) == 1, (
f"Conformity B should be placed in Lane 0 after replacing Duban. "
f"Demons on field: {[(d.unit_id, d.owner, d.lane) for d in new_state.demons]}"
)
assert conformity_b_on_field[0].lane == 0, "Replacement Conformity should be in lane 0."
# Familiar_deck should no longer have "117_2"
assert "117_2" not in new_state.players[Side.PLAYER_1].familiar_deck, (
"117_2 should have been removed from familiar_deck after placement."
)
# Duban should be in P2's graveyard (it was a non-familiar unit)
assert "001" in new_state.players[Side.PLAYER_2].graveyard, (
"Duban (001) should be in P2's graveyard after being replaced."
)