Skip to main content

✅ Question challenge with truth deals 3 damage to challenger allies

CategoryAbility
StatusPassing
Testtests/test_abilities_familiars.py::test_question_challenge_with_truth_deals_3_damage_to_challenger_allies

A demon Challenges a Question familiar that has Truth underneath.

Preconditions

  • Lane 1: P1's Question (120_3) with hidden_card="120_1" (Truth).

  • Lane 1: P2's Duban (001) — 6 HP, 0 damage, READIED (challenger).

  • Lane 1: P2's Murmur (002) — 12 HP, 0 damage, READIED (ally of challenger).

  • P1 CP = 0, P2 CP = 0.

Action

  • Duban performs Challenge targeting Question.

  • Truth is revealed → deal 3 Fixed Damage to all Local Allied Demons

from engine.abilities_familiars import _question_challenge_handler

state = make_game_state()
state.players[Side.PLAYER_1].cp = 0
state.players[Side.PLAYER_2].cp = 0
state.players[Side.PLAYER_1].familiar_deck = []
state.players[Side.PLAYER_2].familiar_deck = []

# Place Question with Truth hidden underneath
question = make_familiar_demon("120_3", lane=1, owner=Side.PLAYER_1, current_hp=1)
question.abilities_used_this_turn = {"hidden_card": "120_1"} # Truth underneath
state = place_demon(state, question)
question = state.demons[-1]

# Place P2 demons in lane 1 (will take 3 fixed damage on Truth reveal)
duban = make_demon("001", lane=1, owner=Side.PLAYER_2)
state = place_demon(state, duban)
duban = state.demons[-1]

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

new_state = _question_challenge_handler(state, duban, [question], {}, None)

# Question removed
question_on_field = [d for d in new_state.demons if d.unit_id == "120_3"]

Expected Postconditions

  • Question removed from field.

  • Duban damage = 3 (3 Fixed Damage from Truth reveal, local ally of challenger).

  • Murmur damage = 3 (also a local ally of Duban).

  • P1 CP = 0, P2 CP = 0 (Question removal is not a death).

Assertions

assert len(question_on_field) == 0, "Question should be removed after Truth reveal."

# Duban: 3 damage (local ally of itself — challenger)
duban_after = next(d for d in new_state.demons if d.unit_id == "001")
assert duban_after.damage == 3, (
f"Duban should take 3 Fixed Damage when Truth is revealed. Got {duban_after.damage}."
)

# Murmur: 3 damage (local ally of Duban)
murmur_after = next(d for d in new_state.demons if d.unit_id == "002")
assert murmur_after.damage == 3, (
f"Murmur should take 3 Fixed Damage when Truth is revealed (local ally). "
f"Got {murmur_after.damage}."
)

# No CP change — Question removal is not a death
assert new_state.players[Side.PLAYER_1].cp == 0, "P1 should gain 0 CP (Question not dead)."
assert new_state.players[Side.PLAYER_2].cp == 0, "P2 should gain 0 CP."