From 1902877cfe2601f9129aa00ec09cee96d86bfa33 Mon Sep 17 00:00:00 2001 From: ctan Date: Sat, 19 Sep 2026 12:04:30 +0200 Subject: [PATCH] fix(rules): document the spell_slots data convention - JSON slots are final per-encounter budgets, engine computes no bonus spells (evidence: PC sheets carry the base class table without bonus, lich slots match no RAW daily table) --- README.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d5fdc1d..4ac1632 100644 --- a/README.md +++ b/README.md @@ -962,7 +962,23 @@ Règles modélisées : conditions de peur, écoles enchantement/divination) et les effets de zone. Toute condition inconnue ou non supportée reste exclue (False). - Incantation : chaque `CombatantState` porte `spell_slots_left` (initialisé depuis - le champ `spell_slots` du JSON, ex. `{"1": 4, ...}`) ; `_cast_spell` dépense + le champ `spell_slots` du JSON, ex. `{"1": 4, ...}`) — convention de données : + `spell_slots` est une valeur **finale** par rencontre et le moteur ne calcule + **jamais** les sorts bonus de la caractéristique d'incantation élevée (SRD + « Abilities and Spellcasters » + Table 1-3 « Ability Modifiers and Bonus + Spells » : sagesse 18 (+4) → +1 sort par niveau 1-4) — les éventuels sorts + bonus doivent être **encodés dans le JSON par l'auteur de la fiche**. + Preuve du choix (constat 2026-09) : les fiches PJ actuelles encodent la + table de classe de BASE sans bonus (oni, clerc 4, SAG 18 → `{1:4, 2:3}` = + table de base 4/3, alors que le RAW avec bonus serait 5/4 ; nairda, sorcière + 4, INT 21 → `{1:4, 2:3}` au lieu de 6/4), tandis que le liche (INT 20, + niveau d'incanteur 11) porte `{1:4, 2:4, 3:4, 4:4, 5:4, 6:3}`, qui ne + correspond à AUCUNE table quotidienne RAW (sorcier 11 : 7/7/7/6/6/4 + bonus) + — les slots sont donc un budget abstrait d'encounter authored, pas une + progression RAW ; un calcul moteur de bonus s'appliquerait sur des données + non-RAW et gonflerait arbitrairement le budget. Conséquence assumée : les + PJ incanteurs tiennent moins de sorts par rencontre que le RAW ne le + permettrait. `_cast_spell` dépense l'emplacement du niveau concerné (`spend_spell_slot`) — **sans emplacement disponible, l'incantation est refusée** (journalisée `NO SPELL SLOT`, feedback `ok=False, reason="no_slot"`, aucun jet consommé) ; les cantrips (niveau 0) s'incantent librement. Le DD vaut `10 + niveau du