fix(rules): trait and racial are non-stacking bonus types (APG Traits, CRB Combining Magic Effects)

This commit is contained in:
2026-09-16 21:37:03 +02:00
parent cc9fba3b52
commit fa63829385
2 changed files with 34 additions and 26 deletions
+19 -16
View File
@@ -19,20 +19,6 @@ class TestStackingTypes:
]
assert resolve_modifiers(mods) == 3
def test_two_racial_bonus_stack(self) -> None:
mods = [
StatModifier("save", 1, "racial"),
StatModifier("save", 1, "racial"),
]
assert resolve_modifiers(mods) == 2
def test_two_trait_bonus_stack(self) -> None:
mods = [
StatModifier("attack", 1, "trait"),
StatModifier("attack", 1, "trait"),
]
assert resolve_modifiers(mods) == 2
def test_two_untyped_bonus_stack(self) -> None:
mods = [
StatModifier("attack", 1),
@@ -43,8 +29,8 @@ class TestStackingTypes:
def test_mixed_stacking_types_all_sum(self) -> None:
mods = [
StatModifier("ac", 1, "dodge"),
StatModifier("ac", 2, "racial"),
StatModifier("ac", 1, "trait"),
StatModifier("ac", 2, "dodge"),
StatModifier("ac", 1),
StatModifier("ac", 1),
]
assert resolve_modifiers(mods) == 5
@@ -101,6 +87,23 @@ class TestNonStackingTypes:
]
assert resolve_modifiers(mods) == 2
def test_two_racial_bonus_do_not_stack(self) -> None:
# CRB "Combining Magic Effects": "two bonuses of the same type don't
# stack" — racial is a named type.
mods = [
StatModifier("save", 1, "racial"),
StatModifier("save", 2, "racial"),
]
assert resolve_modifiers(mods) == 2
def test_two_trait_bonus_do_not_stack(self) -> None:
# APG "Traits": "Trait bonuses do not stack".
mods = [
StatModifier("attack", 1, "trait"),
StatModifier("attack", 2, "trait"),
]
assert resolve_modifiers(mods) == 2
# ── Penalties ─────────────────────────────────────────────────────────────────