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:
2026-09-19 10:41:21 +02:00
parent d0db208610
commit 6d0ee1bfeb
4 changed files with 50 additions and 15 deletions
+15 -9
View File
@@ -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"})),
],
)