fix(rules): self-centered bursts for bless and bane - AreaEffect gains a data-driven 'centered_on_caster' flag (bless.json/bane.json set it per SRD bless.md '50-ft. burst, centered on the caster' and bane.md 'centered on you'); the burst origin is the caster's square regardless of the resolved target or a U7b target_pos, and with no chosen origin there is no primary save - every creature in the area rolls its own (mirror of the point-cast path); snapshot area key exposes centered_on_caster; golden transcript unchanged; +6 tests

This commit is contained in:
2026-09-19 22:38:39 +02:00
parent 4665a1c245
commit 9f0d86273a
7 changed files with 189 additions and 10 deletions
+10 -3
View File
@@ -1170,7 +1170,14 @@ Règles modélisées :
- Formes de zone (S1a) et scalage par niveau d'incanteur (S1b) :
`AreaEffect.shape` vaut `burst` (défaut), `cone` ou `line` (CRB « Magic —
Aiming a Spell »). Le **burst** reste un cercle centré sur la case résolue
(cible ou `target_pos`, U7b). Le **cône** (90° — « a quarter-circle », la
(cible ou `target_pos`, U7b) — **sauf** si l'`AreaEffect` déclare
`"centered_on_caster": true` : le point d'origine est alors **la case du
jeteur**, quel que soit la cible résolue ou le `target_pos` (SRD
spells/bless.md : « The caster and all allies within a 50-ft. burst,
centered on the caster » ; spells/bane.md : « 50-ft.-radius burst, centered
on you ») ; faute de cible primaire désignée, la sauvegarde primaire est
sautée et **chaque** créature de la zone jette la sienne (comme au
point-cast U7b). `bless.json` et `bane.json` portent le drapeau.. Le **cône** (90° — « a quarter-circle », la
largeur valant la longueur à chaque distance) et la **ligne** (5 ft de large,
longueur = `radius_ft`) partent de la **case du jeteur** et sont pointés
vers la cible résolue (`target_id`) ou le point désigné (`target_pos`) — le
@@ -1201,7 +1208,7 @@ Règles modélisées :
sauvegarde primaire de la cible résolue, jetée sur le chemin générique des
sorts avant la résolution de la zone, ne rejoue pas ce bonus (nul pour un
burst centré sur la cible, l'origine étant sa propre case). Le snapshot
d'observation expose `{shape, radius_ft}` via la clé `area`.
d'observation expose `{shape, radius_ft, centered_on_caster}` via la clé `area`.
Un `DamageEffect` peut déclarer `"scaling": {"dice": "1d6", "per_levels": 1,
"max_dice": 10}` (dés par niveau — Fireball/Lightning Bolt « 1d6 per caster
level (maximum 10d6) », Burning Hands « 1d4 per level (maximum 5d4) »,
@@ -1672,7 +1679,7 @@ Règles modélisées :
spells (résumés enrichis du registre : name, level, school, range_ft,
save, dc, summary, half_on_save, save_negates (E4), harmless (sort «
(harmless) » du SRD — sauvegarde sautée sur cible consentante), area {shape,
radius_ft} | None (U7a : premier AreaEffect de niveau supérieur du sort,
radius_ft, centered_on_caster} | None (U7a : premier AreaEffect de niveau supérieur du sort,
gabarit de zone structuré, None si le sort n'a pas de zone), cast_time
(code de temps d'incantation, « standard » pour un sort inconnu du
registre)),