feat(combat): add attacks of opportunity (movement + ranged-in-melee triggers)

This commit is contained in:
2026-08-17 22:49:50 +02:00
parent ac18435695
commit 004d6f1c2b
4 changed files with 231 additions and 13 deletions
+14 -5
View File
@@ -273,8 +273,7 @@ Règles modélisées :
hors de portée (déplacement à pleine vitesse le long du chemin Dijkstra,
puis attaque si une arme est utilisable) et `(attack,)` sinon. Les actions
immédiates (hors-tour, consomment le prochain swift) et les actions
spéciales (AoO, flanquement, attaque à outrance, charge, retraite) ne sont
pas encore modélisées.
spéciales (charge, retraite) ne sont pas encore modélisées.
- 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
@@ -298,6 +297,15 @@ Règles modélisées :
de mêlée) menace la cible depuis la bordure ou le coin opposé. Les attaques à
distance ignorent le flanquement ; un allié désarmé ou à distance ne compte
pas pour le flanquement.
- Attaques d'opportunité : un combattant actif doté d'une arme de mêlée menace
les 8 cases adjacentes. Deux déclencheurs sont modélisés : (1) quitter une
case menacée — le mouvement est résolu pas à pas, et chaque ennemi qui menace
la case actuelle porte une AoO avant que le mouvant ne la quitte ; (2) tirer
avec une arme à distance depuis une case menacée — chaque ennemi menaçant
porte une AoO avant chaque tir. Une AoO par combattant par round (piste
`_aoo_used`, réinitialisée au début du round) ; les AoO sont toujours portées
(PF1e permet de les décliner, le simulateur ne le fait pas). Le pas de
placement (5 ft) et la retraite (à venir) évitent les AoO de mouvement.
- Distance : pénalité cumulative de 2 par incrément de portée complet au-delà
du premier, appliquée au jet d'attaque et à la confirmation de critique ;
l'arme ranged reste utilisable jusqu'à 10 incréments. Les armes de jet
@@ -307,7 +315,7 @@ Non modélisé en Phase 0 (couches `elevation`/`markers` présentes mais non
appliquées dans la résolution) :
- Sorts, jets de sauvegarde, conditions et états.
- Attaques d'opportunité, manœuvres de combat.
- Manœuvres de combat.
- Effets mécaniques de hauteur/élévation.
- Tailles Large+ (2×2), allonge > 5 ft, actions spéciales
(charge, pas de placement, retraite) et actions immédiates hors-tour.
@@ -344,7 +352,7 @@ appliquées dans la résolution) :
La gate de validation complète (tests + lint + types) :
```bash
uv run pytest -q # 206 tests
uv run pytest -q # 210 tests
uv run ruff check src tests
uv run basedpyright src # mode strict
```
@@ -358,7 +366,8 @@ uv run basedpyright src # mode strict
## Feuille de route
- **Phase 1** — magie et états : jets de sauvegarde, sorts modélisés comme
effets paramétrés, conditions, flanquement, attaques d'opportunité.
effets paramétrés, conditions, manœuvres de combat. Flanquement, attaques à
outrance et attaques d'opportunité sont déjà modélisés.
- **Phase 2** — couche tactique LLM : stratégies en langage naturel traduites
en politiques, balayage de matrices de positionnement.
- **Phase 3** — rapporteur LLM local : agrégation des statistiques et