✅ Vermilion bird summer winds readies and buffs
| Category | Ability |
| Status | Passing |
| Test | tests/test_abilities_familiars.py::test_vermilion_bird_summer_winds_readies_and_buffs |
Summer Winds readies a target demon and grants -1 AP Cost status.
Preconditions
-
Lane 0: P1's Vermilion Bird (084_1) — READIED.
-
Lane 1: P1's some unit (001 Duban) — EXHAUSTED.
-
P1 AP: 3.
Action
- Execute Summer Winds (ability 0 on 084_1) targeting Duban (1 AP, exhaust, 1x).
from engine.abilities import execute_ability
state = make_game_state()
state.players[Side.PLAYER_1].ap = 3
state.current_player = Side.PLAYER_1
bird = make_familiar_demon("084_1", lane=0, owner=Side.PLAYER_1)
state = place_demon(state, bird)
bird = state.demons[-1]
duban = make_demon("001", lane=1, owner=Side.PLAYER_1, state=DemonState.EXHAUSTED)
state = place_demon(state, duban)
duban = state.demons[-1]
new_state = execute_ability(state, bird, 0, targets=[duban])
duban_after = next(d for d in new_state.demons if d.unit_id == "001")
Expected Postconditions
-
Duban is READIED (was EXHAUSTED).
-
Duban has -1 AP Cost status effect.
-
Vermilion Bird is EXHAUSTED (tap_required).
-
P1 AP = 2.
Assertions
assert duban_after.state == DemonState.READIED, "Duban should be READIED after Summer Winds."
ap_mod = get_stat_modifier(new_state, duban_after, "ap_cost")
assert ap_mod == -1, f"Duban should have -1 AP Cost status, got {ap_mod}"
bird_after = next(d for d in new_state.demons if d.unit_id == "084_1")
assert bird_after.state == DemonState.EXHAUSTED, "Vermilion Bird should be exhausted (tap_required)."
assert new_state.players[Side.PLAYER_1].ap == 2