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 -6
View File
@@ -259,11 +259,17 @@ WEAPON_FINESSE = AbilitySpec(
effects=(StatModifier(target="attack", value=0, condition="weapon_finesse"),),
)
# Axe to Grind: +1 trait bonus on damage with axes
# Axe to Grind (Basic Combat trait, APG): "+1 trait bonus on damage against
# foes who are threatened by only you." The "threatened by only you" gate
# needs the target's threat map at damage-modifier resolution time, which the
# StatModifier condition system does not carry (conditions are evaluated from
# weapon/range/save-descriptor context only) -> documented traced no-op. The
# previous "+1 damage with axes, condition='axe'" was the wrong effect (the
# SRD bonus is not tied to wielding an axe at all).
AXE_TO_GRIND = AbilitySpec(
name="Axe to Grind",
category="trait",
effects=(StatModifier(target="damage", value=1, condition="axe"),),
source_detail="trait (not modeled: +1 damage vs foes threatened only by you)",
)
# Spell Vulnerability (divination): -2 penalty on saves vs divination
@@ -276,13 +282,16 @@ SPELL_VULNERABILITY_DIVINATION = AbilitySpec(
),
)
# Born Damned (tiefling): darkness 1/day, +2 on saves vs poison
# Born Damned (Race trait, Tiefling): "You gain a +2 trait bonus on saving
# throws against curses and magical effects that produce curses." The engine
# has no "curse" save descriptor (curses are not modeled as spell effects),
# so the bonus has nothing to gate on -> documented traced no-op. The
# previous "+2 Fort vs poison" was the wrong effect (poison is not a curse).
# The tiefling darkness 1/day SLA is likewise not modeled.
BORN_DAMNED = AbilitySpec(
name="Born Damned (race: tiefling)",
category="racial",
effects=(
StatModifier(target="fort", value=2, condition="poison"),
),
source_detail="racial (not modeled: +2 saves vs curses; no curse descriptor)",
)
# Gifted Adept: +1 caster level for one spell