fix(rules): exclude the caster from a line spell's area

CRB Magic - Aiming a Spell: a line 'starts from any corner of your square', so the caster's own square is outside the template (SRD Lightning Bolt: 'The bolt begins at your fingertips' - it leaves the square, it does not fill it). line_cells now drops the origin and takes the length_cells squares beyond it; a degenerate aim affects nothing. Updated the Lightning Bolt and Line Sparks tests (caster no longer caught) and the README.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
2026-09-13 11:30:30 +02:00
parent ee8c8f80ff
commit 642f449b9e
4 changed files with 38 additions and 24 deletions
+6 -3
View File
@@ -916,9 +916,12 @@ Règles modélisées :
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
cône exclut la case d'origine, la ligne commence dans la case du jeteur
(« the bolt begins at your fingertips », SRD Lightning Bolt : le jeteur est
donc dans sa propre ligne). Toute créature dont une case occupée intersecte
cône exclut la case d'origine, la ligne part d'un **coin** de la case du
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
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
d'observation expose `{shape, radius_ft}` via la clé `area`.