feat(combat): add aid another and run actions

This commit is contained in:
2026-09-10 16:56:38 +02:00
parent 06555f7b49
commit f637f87a8c
3 changed files with 743 additions and 23 deletions
+39 -2
View File
@@ -355,6 +355,22 @@ Règles modélisées :
présente, l'action est rejetée (`already_prone`). Le kind ne requiert pas de
cible. `default_policy` ne la choisit pas (disponible via une politique
personnalisée).
- Aider autrui (`Action(kind="aid_another", aid_mode=...)`, action standard,
U5e) : l'aidant **doit avoir une arme de mêlée utilisable** ; il fait un jet
d'attaque `d20 + bonus d'attaque de sa première arme de mêlée utilisable`
contre le CA 10 (20 naturel réussit toujours, 1 naturel échoue toujours —
convention des jets d'attaque du moteur). Sur succès, la cible empile **+2**
soit à son prochain jet d'attaque (`aid_mode="attack"` ou absent — consommé
one-shot par `resolve_attack`, attaque et confirmation de critique), soit à
sa CA contre la prochaine attaque la ciblant (`aid_mode="ac"`). Plusieurs
aides s'additionnent (le bonus s'ajoute, ne se remplace pas) ; tout bonus
inutilisé expire au début du prochain tour du bénéficiaire. Simplifications
documentées : pas de vérification d'adjacence/ligne d'effet vers l'allié,
toute cible résolue peut être aidée, et la progression de compétence d'aide
(+5 avec 5 rangs, +8 avec 10) n'est pas modélisée. Sans cible →
`missing_target` ; sans arme de mêlée utilisable → `no_weapon`.
`default_policy` ne la choisit pas (disponible via une politique
personnalisée).
- Retour d'exécution des actions : chaque action produit un `ActionResult`
explicite (kind, ok, reason) consigné dans le snapshot (`last_turn_results`
au tour suivant). Les actions invalides sont rejetées et journalisées au lieu
@@ -370,7 +386,10 @@ Règles modélisées :
reason="already_prone"` ; attaque avec un `weapon_id` choisi inutilisable →
`ok=False, reason="weapon_unavailable"` ; incantation avec un `target_pos`
hors carte ou sans ligne d'effet → `ok=False, reason="invalid_destination"`
(U7b).
(U7b) ; course ou aide sans cible **et** sans destination →
`missing_target` ; aide sans arme de mêlée utilisable → `no_weapon` ;
course vers une `destination` hors du budget 4× →
`unreachable_destination` (U5e).
- 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
@@ -470,6 +489,18 @@ Règles modélisées :
ultérieures provoquent des AoO normalement (résolues pas à pas, comme pour
le mouvement). `default_policy` ne choisit pas la retraite (disponible via
une politique personnalisée).
- Course (`Action(kind="run")`, action à round complet, U5e) : le combattant
se déplace jusqu'à **4× sa vitesse** vers `target_id` (auto-dirigé,
s'arrête adjacent à la cible) ou vers une `destination` explicite (U5c), en
réutilisant exactement la mécanique de `move` (descente du champ de coût
Dijkstra, pas à pas avec provocation d'AoO — courir ne protège pas des
AoO). À l'achèvement, le combattant est `running` jusqu'au début de son
prochain tour : il **perd son bonus de Dextérité à la CA** (résolu par le
même chemin flat-footed/`denies_dex_to_ac` que les conditions). Une
`destination` hors budget 4× (ou invalide) est rejetée
(`unreachable_destination`) ; sans cible ni destination, rejet
(`missing_target`). `default_policy` ne choisit pas la course (disponible
via une politique personnalisée).
- Pas de placement (5-foot step) : action libre qui déplace le combattant d'une
case vers l'ennemi le plus proche sans provoquer d'AoO. Exclusivité mutuelle
avec tout autre mouvement (move, charge, retraite) dans le même tour —
@@ -673,7 +704,13 @@ Règles modélisées :
jets d'attaque et de confirmation jusqu'au prochain tour), aoo_remaining
(int — attaques d'opportunité restantes ce round : `_aoo_allowance`
(1 par défaut, 1 + mod de Dex avec Combat Reflexes, plancher 1) moins les
AoO déjà consommées, réinitialisé à chaque nouveau round, jamais négatif).
AoO déjà consommées, réinitialisé à chaque nouveau round, jamais négatif),
aid_attack_bonus (int — bonus d'aide autrui (+2 par aide réussie, cumulatif)
ajouté au prochain jet d'attaque du combattant puis consommé, expiré au
début de son tour s'il est inutilisé), aid_ac_bonus (int — bonus d'aide
autrui (+2 par aide réussie, cumulatif) ajouté à sa CA, expiré au début de
son tour), running (bool — course en cours jusqu'au prochain tour du
combattant : il perd son bonus de Dextérité à la CA).
- Par paire combattant actif × cible : target_index, distance_ft, weapon_for,
range_penalty, can_charge, can_step5_to_attack, has_line_of_effect,
flanking, movement_cost_ft, target_threatens_me, enemies_threatening_me,