fix(rules): Born Damned and Axe to Grind become documented no-ops (SRD: +2 saves vs curses has no curse descriptor; +1 damage vs foes threatened only by you is not expressible - old Fort-vs-poison and axe-damage bonuses were wrong)
This commit is contained in:
@@ -9,7 +9,8 @@ Then: the modifier applies only when the runtime condition holds;
|
||||
Supported condition families (plan B1):
|
||||
- ``target_within_30ft_ranged`` — ranged-style weapon (or touch with
|
||||
increment) fired at a target within 30 ft (Point-Blank Shot).
|
||||
- ``axe`` — wielded weapon whose name contains "axe" (Axe to Grind).
|
||||
- ``axe`` — wielded weapon whose name contains "axe" (engine capability; the
|
||||
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,
|
||||
@@ -27,7 +28,6 @@ from typing import Literal
|
||||
import pytest
|
||||
|
||||
from pf1e_simulator.abilities import (
|
||||
AXE_TO_GRIND,
|
||||
BITTER,
|
||||
BORN_DAMNED,
|
||||
BREEZE_KISSED,
|
||||
@@ -190,9 +190,16 @@ def test_point_blank_shot_inactive_for_melee_weapons() -> None:
|
||||
assert t.hp == 17 # damage 3, no +1
|
||||
|
||||
|
||||
def test_axe_to_grind_applies_to_axe_weapon() -> None:
|
||||
"""Axe to Grind: +1 damage with a weapon whose name contains 'axe'."""
|
||||
hero = make_combatant("hero", weapon_name="Battleaxe", features=(AXE_TO_GRIND,))
|
||||
_AXE_DAMAGE_PROBE = AbilitySpec(
|
||||
name="Axe Damage Probe",
|
||||
category="feat",
|
||||
effects=(StatModifier(target="damage", value=1, condition="axe"),),
|
||||
)
|
||||
|
||||
|
||||
def test_axe_condition_applies_to_axe_weapon() -> None:
|
||||
"""Engine 'axe' condition: +1 damage with a weapon whose name contains 'axe'."""
|
||||
hero = make_combatant("hero", weapon_name="Battleaxe", features=(_AXE_DAMAGE_PROBE,))
|
||||
foe = make_combatant("foe", ac_total=16, hp=20)
|
||||
a = make_state(hero, "players", (1, 1))
|
||||
t = make_state(foe, "monsters", (1, 2))
|
||||
@@ -202,9 +209,9 @@ def test_axe_to_grind_applies_to_axe_weapon() -> None:
|
||||
assert t.hp == 16 # 3 + 1 (axe)
|
||||
|
||||
|
||||
def test_axe_to_grind_inactive_without_axe() -> None:
|
||||
"""Axe to Grind: no bonus when the weapon is not an axe."""
|
||||
hero = make_combatant("hero", weapon_name="Shortsword", features=(AXE_TO_GRIND,))
|
||||
def test_axe_condition_inactive_without_axe() -> None:
|
||||
"""Engine 'axe' condition: no bonus when the weapon is not an axe."""
|
||||
hero = make_combatant("hero", weapon_name="Shortsword", features=(_AXE_DAMAGE_PROBE,))
|
||||
foe = make_combatant("foe", ac_total=16, hp=20)
|
||||
a = make_state(hero, "players", (1, 1))
|
||||
t = make_state(foe, "monsters", (1, 2))
|
||||
@@ -227,7 +234,6 @@ def test_axe_to_grind_inactive_without_axe() -> None:
|
||||
(FEY_TOUCHED, "will", 19, frozenset({"fey"})),
|
||||
(HALF_FORGOTTEN_SECRETS, "fort", 20, frozenset({"disease"})),
|
||||
(HALF_FORGOTTEN_SECRETS, "will", 20, frozenset({"mind_affecting"})),
|
||||
(BORN_DAMNED, "fort", 20, frozenset({"poison"})),
|
||||
(PINGRE, "fort", 19, frozenset({"poison"})),
|
||||
],
|
||||
)
|
||||
|
||||
@@ -12,6 +12,8 @@ import json
|
||||
from pathlib import Path
|
||||
|
||||
from pf1e_simulator.abilities import (
|
||||
AXE_TO_GRIND,
|
||||
BORN_DAMNED,
|
||||
COMBAT_REFLEXES,
|
||||
EXALTED_SOCIETY,
|
||||
FORTIFIED_DRINKER,
|
||||
@@ -253,3 +255,20 @@ def test_fortified_drinker_is_inert_documented_noop() -> None:
|
||||
poison, condition='alcohol'" modifier is gone)."""
|
||||
assert FORTIFIED_DRINKER.effects == ()
|
||||
assert "not modeled" in FORTIFIED_DRINKER.source_detail
|
||||
|
||||
|
||||
def test_born_damned_is_inert_documented_noop() -> None:
|
||||
"""SRD (Tiefling race trait): +2 trait bonus on saves against curses. No
|
||||
'curse' save descriptor exists -> inert no-op (old +2 Fort vs poison was
|
||||
the wrong bonus entirely)."""
|
||||
assert BORN_DAMNED.effects == ()
|
||||
assert "not modeled" in BORN_DAMNED.source_detail
|
||||
|
||||
|
||||
def test_axe_to_grind_is_inert_documented_noop() -> None:
|
||||
"""SRD (APG combat trait): +1 trait bonus on damage against foes
|
||||
threatened by only you. The threat-map gate is not expressible in the
|
||||
StatModifier condition system -> inert no-op (old +1 damage with axes was
|
||||
the wrong effect; the SRD bonus is not tied to axes)."""
|
||||
assert AXE_TO_GRIND.effects == ()
|
||||
assert "not modeled" in AXE_TO_GRIND.source_detail
|
||||
|
||||
Reference in New Issue
Block a user