feat(combat): allow point-targeted spell areas

This commit is contained in:
2026-09-10 15:19:36 +02:00
parent 7fafbe43cf
commit 26f86f416d
3 changed files with 599 additions and 47 deletions
+15 -2
View File
@@ -368,7 +368,9 @@ Règles modélisées :
`ok=True, reason="ready"` ; relèvement sans `prone` → `ok=False,
reason="not_prone"` ; se jeter à terre déjà `prone` → `ok=False,
reason="already_prone"` ; attaque avec un `weapon_id` choisi inutilisable →
`ok=False, reason="weapon_unavailable"`.
`ok=False, reason="weapon_unavailable"` ; incantation avec un `target_pos`
hors carte ou sans ligne d'effet → `ok=False, reason="invalid_destination"`
(U7b).
- Attaques multiples par action : une arme avec `count` > 1 (« 2x Talons »)
résout `count` balayages indépendants dans la même action ; les balayages
restants sont perdus si la cible tombe (inconsciente ou morte) en cours de
@@ -515,7 +517,18 @@ Règles modélisées :
sur un échec et **aucun dégât sur un succès** (la sauvegarde annule) ; le
demi-dégât sur sauvegarde réussie ne s'applique que là où l'effet le déclare
(`half_on_save: true` pour les rayons/lignes/cônes, `AreaEffect.save_for_half`
pour les explosions). `default_policy` choisit soin / offensif / buff via
pour les explosions). Ciblage par point (U7b) : `Action(kind="cast_spell",
target_pos=(r, c))` centre l'`AreaEffect` de niveau supérieur du sort sur la
case `(r, c)` désignée au lieu de la position de la cible créature — poser un
Fireball au sol, pas seulement sur une tête. Le point doit être dans la carte
et avoir une ligne d'effet depuis le jeteur (sinon rejet `invalid_destination`,
aucun sort lancé). Avec `target_pos` et pas de cible résolue, l'incantation se
fait sur le point : la sauvegarde primaire est sautée et chaque créature de la
zone effectue sa propre sauvegarde (SR incluse). `target_pos` n'a de sens que
pour un sort à zone : pour un sort ciblé sans `AreaEffect`, il est ignoré et
la cible résolue est utilisée normalement. Sans `target_pos`, le comportement
centré sur la créature est inchangé. `default_policy` ne choisit pas de point
(disponible via une politique personnalisée). `default_policy` choisit soin / offensif / buff via
`_find_heal_spell`, `_find_offensive_spell` et `_find_ally_needing_heal`.
- Résistance aux sorts (SR) et résistances/immunités énergétiques : un combattant
avec `spell_resistance > 0` oppose sa SR à chaque sort qui le cible — jet