fix(rules): Lonely and Bitter drawbacks replace bogus +1 Will bonuses (SRD: Lonely -2 Sense Motive and -2 saves vs charm with mind_affecting standing in; Bitter reduces ally-sourced healing by 1 via engine hook)
This commit is contained in:
@@ -13,9 +13,9 @@ Supported condition families (plan B1):
|
||||
real Axe to Grind trait is a documented no-op, see test_feats.py).
|
||||
- save descriptors (fear, cold, electricity, fey, divination, poison,
|
||||
disease, mind_affecting) — the saving throw's context, threaded from the
|
||||
fear aura and from spell effects/schools (Bitter, Lonely, Breeze-Kissed,
|
||||
Fey-touched, Spell Vulnerability, Born Damned, Pingre, Half-Forgotten
|
||||
Secrets).
|
||||
fear aura and from spell effects/schools (Breeze-Kissed, Fey-touched,
|
||||
Spell Vulnerability, Pingre, Half-Forgotten Secrets, Lonely's -2 vs
|
||||
mind_affecting standing in for charm).
|
||||
- Unsupported (mounted, adjacent_ally_stealth_synergy, weapon_finesse,
|
||||
alcohol) and unknown names always evaluate to False.
|
||||
"""
|
||||
@@ -28,8 +28,6 @@ from typing import Literal
|
||||
import pytest
|
||||
|
||||
from pf1e_simulator.abilities import (
|
||||
BITTER,
|
||||
BORN_DAMNED,
|
||||
BREEZE_KISSED,
|
||||
FEY_TOUCHED,
|
||||
FORTIFIED_DRINKER,
|
||||
@@ -227,8 +225,6 @@ def test_axe_condition_inactive_without_axe() -> None:
|
||||
@pytest.mark.parametrize(
|
||||
("feat", "save_type", "dc", "descriptors"),
|
||||
[
|
||||
(BITTER, "will", 19, frozenset({"fear"})),
|
||||
(LONELY, "will", 19, frozenset({"fear"})),
|
||||
(BREEZE_KISSED, "fort", 20, frozenset({"cold"})),
|
||||
(BREEZE_KISSED, "ref", 20, frozenset({"electricity"})),
|
||||
(FEY_TOUCHED, "will", 19, frozenset({"fey"})),
|
||||
@@ -249,13 +245,25 @@ def test_conditioned_save_bonus_applies_when_descriptor_present(
|
||||
assert result.success is True
|
||||
|
||||
|
||||
def test_lonely_is_a_negative_mind_affecting_penalty() -> None:
|
||||
"""Lonely (drawback): -2 Will vs mind_affecting (charm stands in), never a bonus."""
|
||||
penalized = _resolve_save(
|
||||
LONELY, "will", 17, save_descriptors=frozenset({"mind_affecting"}), roll=18,
|
||||
)
|
||||
assert penalized.total == 16 # 18 - 2
|
||||
assert penalized.success is False
|
||||
unaffected = _resolve_save(
|
||||
LONELY, "will", 17, save_descriptors=frozenset({"fear"}), roll=18,
|
||||
)
|
||||
assert unaffected.total == 18
|
||||
assert unaffected.success is True
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
("feat", "save_type", "dc", "descriptors"),
|
||||
[
|
||||
(BITTER, "will", 19, frozenset({"cold"})),
|
||||
(BREEZE_KISSED, "fort", 19, frozenset({"fear"})),
|
||||
(HALF_FORGOTTEN_SECRETS, "will", 19, frozenset({"fear"})),
|
||||
(BORN_DAMNED, "fort", 19, frozenset({"cold"})),
|
||||
(PINGRE, "fort", 19, frozenset({"cold"})),
|
||||
],
|
||||
)
|
||||
@@ -303,7 +311,7 @@ def test_mounted_condition_unsupported_stays_excluded() -> None:
|
||||
|
||||
|
||||
def test_alcohol_condition_unsupported_stays_excluded() -> None:
|
||||
"""Fortified Drinker: 'alcohol' context never exists -> excluded."""
|
||||
"""Fortified Drinker is an inert no-op: no bonus on any save context."""
|
||||
result = _resolve_save(
|
||||
FORTIFIED_DRINKER, "fort", 19, save_descriptors=frozenset({"poison"}), roll=18,
|
||||
)
|
||||
@@ -336,10 +344,17 @@ def _make_fear_aura_lich() -> Combatant:
|
||||
)
|
||||
|
||||
|
||||
_FEAR_SAVE_PROBE = AbilitySpec(
|
||||
name="Fear Save Probe",
|
||||
category="feat",
|
||||
effects=(StatModifier(target="will", value=1, condition="fear"),),
|
||||
)
|
||||
|
||||
|
||||
def test_fear_aura_save_carries_fear_descriptor() -> None:
|
||||
"""The lich's fear aura save carries 'fear': Lonely's +1 flips the save."""
|
||||
"""The lich's fear aura save carries 'fear': a +1 fear bonus flips the save."""
|
||||
lich = _make_fear_aura_lich()
|
||||
foe = make_combatant("foe", will=0, features=(LONELY,))
|
||||
foe = make_combatant("foe", will=0, features=(_FEAR_SAVE_PROBE,))
|
||||
lich_state = make_state(lich, "monsters", (1, 1))
|
||||
foe_state = make_state(foe, "players", (1, 2)) # 5 ft, inside aura range
|
||||
engine = make_engine([21], [lich_state, foe_state]) # 21 + 0 + 1 = 22 >= DC 22
|
||||
|
||||
Reference in New Issue
Block a user