✅ Vual hp aura fused bottom projects
| Category | Interaction |
| Status | Passing |
| Test | tests/test_abilities_passive.py::test_vual_hp_aura_fused_bottom_projects |
Vual is the fused bottom. The +PWR HP aura still projects to
Preconditions
-
Lane 0: P1's fused demon — Flauros (#013) top, Vual (#083) bottom
-
Effective PWR = 2 (Flauros) + 1 (Vual fPWR) = 3
-
Lane 0: P1's Sabnock (#003) — Local ally (should receive +3 HP aura)
-
Lane 1: P1's Murmur (#002) — Distant ally (no buff)
-
Lane 0: P2's Duban (#001) — Local enemy (no buff — aura is Allied-only)
Action
- Query hp passive modifier on each demon
fused = make_fused_demon("013", "083", lane=0, owner=Side.PLAYER_1)
sabnock = make_demon("003", lane=0, owner=Side.PLAYER_1)
murmur = make_demon("002", lane=1, owner=Side.PLAYER_1)
duban = make_demon("001", lane=0, owner=Side.PLAYER_2)
state = make_game_state()
state = place_demon(state, fused)
state = place_demon(state, sabnock)
state = place_demon(state, murmur)
state = place_demon(state, duban)
fused_p = next(d for d in state.demons if d.is_fused)
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 hp modifier == 3 (Vual fused-bottom aura projects)
-
Fused demon itself hp modifier == 0 ('Other' self-exclusion via instance_id)
-
Murmur hp modifier == 0 (different lane)
-
Duban hp modifier == 0 (enemy side)
Assertions
assert get_passive_modifiers(state, sabnock_p, "hp") == 3, (
"Local ally of Vual-fused-bottom must get +3 HP aura."
)
assert get_passive_modifiers(state, fused_p, "hp") == 0, (
"Fused demon IS Vual (via bottom) — 'Other' self-exclusion must return 0."
)
assert get_passive_modifiers(state, murmur_p, "hp") == 0, (
"Distant ally must not receive the Local-only aura."
)
assert get_passive_modifiers(state, duban_p, "hp") == 0, (
"Local enemy must not receive the Allied-only aura."
)