feat(rules): encode arcane_caster and armor_spell_failure from the sheets

- arcane_caster true: misty (Magus/Bard sheet class), nairda (Witch/
  Sorcerer), thrune_agent (Human magus 8, KB bestiary/thrune-agent.md);
  lich already true. False: oni (Cleric), tammara (Gunslinger/
  Warpriest - divine), esha (Cavalier/Rogue, spell-like only), the
  companions harvie/ierlieth/jeanne/esha_mount and the remaining
  monsters.
- armor_spell_failure stays 0 everywhere, as the effective PF1e value:
  nairda and the lich wear no armor (sheet note "Pas d'armure", KB lich
  block); misty's mithral shirt (RAW ASF 10%, magic-items/mithral-shirt
  .md) and the thrune agent's +1 studded leather (15%) are light armor
  and every spell they cast is on their own class list - magus and bard
  cast their own spells in light armor with no arcane spell failure
  (classes/magus.md, classes/bard.md).
- tests/test_spell_failure.py: the lich/oni smoke test becomes a
  full-data table pinning all 15 combatants' flags with per-entry
  sources. No shipped combatant incurs a non-zero ASF; the failure roll
  itself stays covered by the synthetic armored-caster tests.
This commit is contained in:
2026-09-20 14:30:57 +02:00
parent 91666d84b9
commit f6292f8bdc
14 changed files with 63 additions and 9 deletions
+2
View File
@@ -25,6 +25,8 @@
"ref": 5,
"will": 1
},
"arcane_caster": false,
"armor_spell_failure": 0,
"attacks": [
{
"id": "celestial_wolf:bite",
+2
View File
@@ -29,6 +29,8 @@
"ref": 2,
"will": 1
},
"arcane_caster": false,
"armor_spell_failure": 0,
"attacks": [
{
"name": "bite",
+2
View File
@@ -20,6 +20,8 @@
"initiative_mod": 6,
"speed_land_ft": 30,
"saves": { "fort": 3, "ref": 2, "will": -1 },
"arcane_caster": false,
"armor_spell_failure": 0,
"attacks": [
{
"name": "short sword",
+2
View File
@@ -21,6 +21,8 @@
"initiative_mod": 0,
"speed_land_ft": 30,
"saves": { "fort": 3, "ref": 0, "will": -1 },
"arcane_caster": false,
"armor_spell_failure": 0,
"attacks": [
{
"name": "falchion",
+2
View File
@@ -31,6 +31,8 @@
"will": 6
},
"casting_ability": "int",
"arcane_caster": true,
"armor_spell_failure": 0,
"spell_slots": {
"1": 5,
"2": 5,