fix(rules): scale Power Attack for two-handed weapons and apply its CMB penalty

This commit is contained in:
2026-09-11 00:19:06 +02:00
parent 890b7959d4
commit 1960b8f655
5 changed files with 213 additions and 8 deletions
+15 -2
View File
@@ -2260,7 +2260,14 @@ class CombatEngine:
sum(c.formula.roll(self._rng) for c in weapon.damage) + weapon.damage_bonus
)
damage += resolve_modifiers(dmg_mods)
damage += pa_amt * 2 if weapon.kind == "melee" else 0
# PF1e (CRB Power Attack): +2X damage with a melee weapon, +3X (the
# bonus increased by half) with a two-handed weapon, a one-handed
# weapon used in two hands, or a primary natural with 1.5x Strength
# (modeled via the weapon's `two_handed` flag). The off-hand /
# secondary-natural halving (-50%, +1X) is NOT modeled: two-weapon
# fighting is not in the engine (documented simplification).
if weapon.kind == "melee":
damage += pa_amt * (3 if weapon.two_handed else 2)
if crit:
damage *= weapon.crit_mult
damage += sneak_total
@@ -3607,7 +3614,13 @@ class CombatEngine:
if not state.active:
return
attacker_cmb = self._maneuver_cmb(state)
# PF1e (CRB Power Attack): the -X penalty applies to all melee attack
# rolls AND combat maneuver checks while the feat is active. The
# escape option that substitutes an Acrobatics/Escape Artist skill
# check is not penalized (a skill check is not a CMB check) — see
# _maneuver_escape.
pa_amt = self._power_attack_amt(state)
attacker_cmb = self._maneuver_cmb(state) - pa_amt
target_cmd = self._maneuver_cmd(target)
roll = self._rng.d20()
total = roll + attacker_cmb
+5 -1
View File
@@ -239,7 +239,10 @@ class AttackSpec(_FrozenModel):
the same entry twice. `reach_ft` applies to melee/touch kinds,
`range_increment_ft` to ranged/touch kinds. `firearm` marks a ranged-touch
weapon (gun) whose shots resolve against touch AC within the first range
increment and against full AC beyond it.
increment and against full AC beyond it. `two_handed` marks a weapon swung
in two hands (two-handed weapon, one-handed weapon used two hands, or a
primary natural with 1.5x Strength) — PF1e Power Attack rolls +50% damage
with such a weapon (CRB "Power Attack").
"""
id: str
@@ -254,6 +257,7 @@ class AttackSpec(_FrozenModel):
range_increment_ft: int | None = None
count: int = Field(default=1, ge=1)
firearm: bool = False
two_handed: bool = False
class DamageReduction(_FrozenModel):