fix(rules): apply the power attack penalty to melee touch attacks

PF1e (CRB Power Attack): "take a -1 penalty on all melee attack rolls ...
The bonus damage does not apply to touch attacks." A melee touch (kind
"touch", no range increment) is a melee attack, so _power_attack_amt now
rides its attack and confirmation rolls; the +2X/+3X damage bonus stays
gated on kind == "melee". Ranged attacks and rays are unaffected. The
test that pinned the old melee-weapon-only simplification was rewritten to
lock the corrected behavior; README and abilities.py updated.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
2026-09-11 23:35:07 +02:00
parent 8a8b813889
commit a2825e73cc
4 changed files with 30 additions and 11 deletions
+8 -3
View File
@@ -743,8 +743,11 @@ Règles modélisées :
ex. le contact paralysant du liche) n'en fait rien. Conformance P2 : le
contact de mêlée (touch sans incrément) est une **attaque de mêlée** — il
bénéficie du flanquement, de la hauteur (+1), du +4 contre une cible inerme
et peut porter une attaque sournoise ; Power Attack reste réservé aux armes
de mêlée (le contact n'en bénéficie pas).
et peut porter une attaque sournoise ; Power Attack (conformance A6 — CRB :
« a –1 penalty on all melee attack rolls… The bonus damage does not apply to
touch attacks ») s'applique à **la touche** du contact de mêlée (pénalité −X
au jet d'attaque et de confirmation) mais son bonus de dégâts reste réservé
aux armes de mêlée (le contact ne gagne pas le +2X/+3X).
- Jets de sauvegarde : `resolve_save(state, save_type, dc)` — fort/ref/will.
1 naturel = échec automatique, 20 naturel = succès automatique. Les
modificateurs d'effets (`StatModifier` avec `target` correspondant) sont
@@ -1205,7 +1208,9 @@ la lecture mais non appliquée dans la résolution.
- `abilities.py` — dons et capacités : `AbilitySpec` (dataclass avec
catégorie feat/class/racial/trait) et fabriques de dons (Weapon Focus ciblé
par arme, Toughness lié au niveau, Power Attack actif −X attaque / +2X
dégâts, X = BAB//4 + 1, mêlée uniquement, activé comme action libre via le
dégâts, X = BAB//4 + 1 — la pénalité −X vise toutes les attaques de mêlée
(contact de mêlée inclus, conformance A6), le bonus de dégâts uniquement les
armes de mêlée —, activé comme action libre via le
kind `activate_power_attack` qui pose `state.power_attack`). Conformance
B16 (CRB « Power Attack ») : le bonus de dégâts passe à **+3X (×1,5)** pour
une arme marquée `two_handed: true` dans le JSON de l'attaque (arme à deux