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
+67 -43
View File
@@ -1,46 +1,70 @@
{
"name": "Giant Belostomatid",
"level": 3,
"size": "Large",
"cr": "3",
"xp": 800,
"source": "Bestiary > Giant Belostomatid",
"notes": "Digestive enzyme (DC 15 Fort or paralyzed 1d4 rounds + 1d2 Con damage/round) and grab on claws not modeled in Phase 0; Int - (mindless) modeled as 0; immune to mind-affecting not modeled; swim 40 ft / fly 20 ft (poor) not modeled, land speed only.",
"abilities": {
"str_score": 15,
"dex_score": 13,
"con_score": 16,
"int_score": 0,
"wis_score": 11,
"cha_score": 2
},
"hp_max": 30,
"ac": { "total": 15, "touch": 10, "flat_footed": 14 },
"bab": 3,
"initiative_mod": 1,
"speed_land_ft": 20,
"saves": { "fort": 7, "ref": 2, "will": 1 },
"attacks": [
"name": "Giant Belostomatid",
"level": 3,
"size": "Large",
"cr": "3",
"xp": 800,
"source": "Bestiary > Giant Belostomatid",
"notes": "Digestive enzyme (DC 15 Fort or paralyzed 1d4 rounds + 1d2 Con damage/round) and grab on claws not modeled in Phase 0; Int - (mindless) modeled as 0; immune to mind-affecting not modeled; swim 40 ft / fly 20 ft (poor) not modeled, land speed only.",
"abilities": {
"str_score": 15,
"dex_score": 13,
"con_score": 16,
"int_score": 0,
"wis_score": 11,
"cha_score": 2
},
"hp_max": 30,
"ac": {
"total": 15,
"touch": 10,
"flat_footed": 14
},
"bab": 3,
"initiative_mod": 1,
"speed_land_ft": 20,
"saves": {
"fort": 7,
"ref": 2,
"will": 1
},
"attacks": [
{
"name": "bite",
"kind": "melee",
"attack_bonus": 4,
"damage": [
{
"name": "bite",
"kind": "melee",
"attack_bonus": 4,
"damage": [{ "formula": "1d6", "types": ["piercing"] }],
"damage_bonus": 2,
"crit_mult": 2,
"reach_ft": 10
},
{
"name": "claw",
"kind": "melee",
"attack_bonus": 4,
"damage": [{ "formula": "1d4", "types": ["slashing"] }],
"damage_bonus": 2,
"crit_mult": 2,
"count": 2,
"reach_ft": 10
"formula": "1d6",
"types": [
"piercing"
]
}
],
"cmb": 6,
"cmd": 17
}
],
"damage_bonus": 2,
"crit_mult": 2,
"reach_ft": 10,
"natural": true
},
{
"name": "claw",
"kind": "melee",
"attack_bonus": 4,
"damage": [
{
"formula": "1d4",
"types": [
"slashing"
]
}
],
"damage_bonus": 2,
"crit_mult": 2,
"count": 2,
"reach_ft": 10,
"natural": true
}
],
"cmb": 6,
"cmd": 17
}