From 9f8655da76d1fb4fe75a1e7c66c0c6240ece66cc Mon Sep 17 00:00:00 2001 From: ctan Date: Sat, 19 Sep 2026 14:35:17 +0200 Subject: [PATCH] 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 --- README.md | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 3ee4106..7af0ac5 100644 --- a/README.md +++ b/README.md @@ -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