✅ Vapula ap cost aura fused bottom projects
| Category | Interaction |
| Status | Passing |
| Test | tests/test_abilities_passive.py::test_vapula_ap_cost_aura_fused_bottom_projects |
Vapula is the fused bottom. Local enemies get +1 basic_ap_cost;
Preconditions
-
Lane 0: P1's fused demon — Flauros (#013) top, Vapula (#100) bottom
-
Lane 0: P2's Sabnock (#003) — Local enemy (should get +1 basic_ap_cost)
-
Lane 0: P1's Murmur (#002) — Local ally (no aura; Murmur's own -2 ap_cost is fine)
-
Lane 1: P2's Duban (#001) — Distant enemy (no aura — Local only)
Action
- Query basic_ap_cost passive modifier on each demon
fused = make_fused_demon("013", "100", lane=0, owner=Side.PLAYER_1)
sabnock_enemy = make_demon("003", lane=0, owner=Side.PLAYER_2)
murmur_ally = make_demon("002", lane=0, owner=Side.PLAYER_1)
duban_distant = make_demon("001", lane=1, owner=Side.PLAYER_2)
state = make_game_state()
state = place_demon(state, fused)
state = place_demon(state, sabnock_enemy)
state = place_demon(state, murmur_ally)
state = place_demon(state, duban_distant)
sabnock_p = next(d for d in state.demons if d.unit_id == "003")
murmur_p = next(d for d in state.demons if d.unit_id == "002")
duban_p = next(d for d in state.demons if d.unit_id == "001")
Expected Postconditions
-
Sabnock basic_ap_cost modifier == 1 (Vapula fused-bottom aura projects)
-
Murmur basic_ap_cost modifier == 0 (ally, excluded)
-
Duban basic_ap_cost modifier == 0 (different lane)
Assertions
assert get_passive_modifiers(state, sabnock_p, "basic_ap_cost") == 1, (
"Local enemy of Vapula-fused-bottom must get +1 basic_ap_cost."
)
assert get_passive_modifiers(state, murmur_p, "basic_ap_cost") == 0, (
"Local ally must NOT receive Vapula's enemy-only aura."
)
assert get_passive_modifiers(state, duban_p, "basic_ap_cost") == 0, (
"Distant enemy must not receive Local-only aura."
)