fix(rules): README sync for the area-of-effect line-of-effect fixes - line truncation at barriers, cone/burst LoE from the origin, terrain cover Reflex half-bonus (SRD aiming-a-spell.md, cover.md); areas.py architecture entry updated

This commit is contained in:
2026-09-19 14:35:17 +02:00
parent fb6f58acc1
commit 9f8655da76
+27 -5
View File
@@ -1108,10 +1108,29 @@ Règles modélisées :
jeteur et n'affecte **pas** sa propre case (CRB « Aiming a Spell » : « It
starts from any corner of your square » — SRD Lightning Bolt : « The bolt
begins at your fingertips », le trait quitte la case du jeteur au lieu de la
remplir ; un viseur dégénéré origine==cible n'affecte personne). Toute
remplir ; un viseur dégénéré origine==cible n'affecte personne). **Ligne
d'effet des zones** (SRD « Aiming a Spell — Line of Effect ») : la **ligne**
s'arrête à la première case qui bloque la ligne d'effet (« extends to the
limit of its range or until it strikes a barrier that blocks line of
effect ») — la case-barrière est la dernière du gabarit, rien au-delà ;
le **cône** exclut toute case sans ligne d'effet depuis sa case d'origine
(« a cone... affects only an area, creature, or object to which it has
line of effect from its origin ») ; le **burst** n'affecte aucune créature
en couvert total depuis son centre (« It can't affect creatures with total
cover from its point of origin (in other words, its effects don't extend
around corners) »). Toute
créature dont une case occupée intersecte
le gabarit subit l'effet, avec sauvegarde et RS par créature comme pour un
burst (application partagée, géométrie dans `areas.py`). Le snapshot
burst (application partagée, géométrie dans `areas.py`). **Couvert et
sauvegardes de Réflexes** (SRD « Cover and Reflex Saves ») : une créature
dans la zone qui a du couvert **terrain** entre elle et le point d'origine
de l'effet (centre du burst, case du jeteur pour cône/ligne) ajoute à son
jet de Réflexes la moitié de son bonus de couvert CA (+1 partiel / +2
standard / +4 amélioré) ; le couvert mou des créatures n'accorde **aucun**
bonus de sauvegarde (SRD « Soft Cover »). Simplification documentée : la
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`.
Un `DamageEffect` peut déclarer `"scaling": {"dice": "1d6", "per_levels": 1,
"max_dice": 10}` (dés par niveau — Fireball/Lightning Bolt « 1d6 per caster
@@ -1773,9 +1792,12 @@ Limites de sorts (conformance D6-D9, documentées plutôt que bricolées) :
`cover_bonus`, +4 couvert mou des créatures) dans `resolve_attack`.
- `areas.py` — géométrie des gabarits de zone cône et ligne (CRB « Magic —
Aiming a Spell ») : `cone_cells` (quart de cercle de 90°, test d'angle ±45°
en arithmétique entière exacte, case d'origine exclue) et `line_cells`
(raie de Bresenham de 5 ft de large, longue de `radius_ft`, partant de la
case du jeteur). Les bursts restent gérés par `_creatures_in_range`.
en arithmétique entière exacte, case d'origine exclue, cases sans ligne
d'effet depuis l'origine exclues via `los.has_line_of_effect`) et
`line_cells` (raie de Bresenham de 5 ft de large, longue de `radius_ft`,
partant de la case du jeteur, tronquée à la première case `blocks_los`).
Les bursts restent gérés par `_area_creatures` (filtrés par ligne d'effet
depuis le centre).
- `combat.py` — `CombatEngine` déterministe : initiative, actions, résolution
des attaques (couvert, ligne d'effet, pénalités de portée, CA de contact
pour les attaques touch et firearms), tailles et allonges (occupation