fix(rules): natural weapons get no BAB iteratives, secondary attacks at -5

PF1e (CRB "Natural Attacks"):
- Natural weapons (natural=true) get exactly one swing per full attack,
  regardless of BAB (no BAB iteratives for natural attacks).
- Secondary natural attacks (secondary=true) attack at BAB -5; the
  Multiattack feat reduces this to -2.
- Manifested in combat.py (_full_attack_weapon, _resolve_swing),
  models.py (AttackSpec.natural/secondary), 6 data JSONs, 4 new tests,
  and README documentation.

1461 passed, ruff clean, basedpyright 0 errors.
This commit is contained in:
2026-09-16 12:25:30 +02:00
parent 59caf67909
commit e5691bdb6f
10 changed files with 739 additions and 508 deletions
+10 -3
View File
@@ -647,9 +647,16 @@ Règles modélisées :
résout `count` balayages indépendants dans la même action ; les balayages
restants sont perdus si la cible tombe (inconsciente ou morte) en cours de
rafale. Attaque à outrance (action à round complet) : à BAB +6/+11/+16, des
attaques supplémentaires à -5/-10/-15 ; les armes naturelles (`count` > 1)
ne gagnent pas d'itératifs. Plusieurs armes naturelles en une seule attaque
à outrance ne sont pas modélisées.
attaques supplémentaires à -5/-10/-15 pour les armes manufacturées. Les
armes naturelles (`natural: true` dans le JSON — morsures, griffes, sabots,
talons…) ne gagnent **jamais** d'itératifs : une attaque à outrance avec une
arme naturelle résout **un seul** balayage quel que soit le BAB (CRB
« Natural Attacks » : « You do not receive additional natural attacks for a
high base attack bonus »). Une attaque naturelle marquée `secondary: true`
(les attaques secondaires du bestiaire) frappe à **BAB −5** ; le don
Multiattack réduit cette pénalité à **−2** (CRB « Natural Attacks » /
« Multiattack »). Plusieurs armes naturelles en une seule attaque à outrance
ne sont pas modélisées.
Choix de l'arme : `Action(kind="attack", weapon_id=...)` et
`Action(kind="full_attack", weapon_id=...)` frappent avec l'arme désignée
(l'arc plutôt que l'épée, l'arme principale plutôt que la secondaire) au