feat(combat): activate standard+move economy (full-speed movement, move-then-attack)
- default_policy returns (move, attack) when target out of reach: full-speed move along the Dijkstra path (up to speed cells, 5-10-5 diagonals, stops adjacent to nearest enemy), then attack if a weapon is usable; returns (attack,) when already in range. - _move logs the full path in one line (start)->(step1)->...->(end); silent on empty path. _execute is silent on invalid attacks/moves (no spurious wait log); run() adds a wait line only when a combatant's turn produced no transcript line. - Extract _take_turn helper from run() to keep cyclomatic complexity <= 10. - Module docstring updated for activated economy. - 4 pinned transcripts regenerated (move-then-attack shifts combat pacing): test_default_policy_moves_toward_enemy, test_scripted_2v2_transcript (monsters win in R2 instead of R3 — orc-2 moves + attacks same turn), test_ranged_no_line_of_effect_moves_around_wall (archer rounds wall and shoots in 1 turn), test_ranged_weapon_unusable_beyond_maximum_range (archer moves 6 cells then attacks at -14 penalty). - README: demo numbers refreshed (1v2: 49.6%->22.0%, 11.4->5.2 rounds; 3v2: 97.8%->91.4%, 6.9->6.0 rounds), rules and non-modeled sections updated for the activated economy.
This commit is contained in:
@@ -72,10 +72,10 @@ players : 3 combatants
|
||||
monsters : 2 combatants
|
||||
1000 combats simulés (seed 1, plafond 100 rounds)
|
||||
|
||||
Victoires players : 97.8% (978) — bande 3σ : [96.4%, 99.2%]
|
||||
Victoires monsters : 2.2% (22) — bande 3σ : [0.8%, 3.6%]
|
||||
Victoires players : 91.4% (914) — bande 3σ : [88.7%, 94.1%]
|
||||
Victoires monsters : 8.6% (86) — bande 3σ : [5.9%, 11.3%]
|
||||
Nuls : 0.0% (0)
|
||||
Rounds moyens : 6.9
|
||||
Rounds moyens : 6.0
|
||||
```
|
||||
|
||||
## Utilisation de la CLI
|
||||
@@ -130,11 +130,13 @@ confiance à 3σ calculée en forme fermée (modèle binomial) :
|
||||
immobiles, camps inaccessibles…).
|
||||
|
||||
Exemple vérifié — 1 gobelin (players) contre 2 orcs (monsters), 1000 runs,
|
||||
seed 1 : players 49,6 %, bande 3σ [44,9 % ; 54,3 %], 0 nuls, 11,4 rounds moyens.
|
||||
seed 1 : players 22,0 %, bande 3σ [18,1 % ; 25,9 %], 0 nuls, 5,2 rounds moyens.
|
||||
Sans ligne de visée depuis la zone de départ, l'archer gobelin doit contourner
|
||||
le mur central avant de tirer ; une fois la ligne de visée gagnée, il tire de
|
||||
loin avec la pénalité de portée au lieu de s'approcher — c'est ce qui équilibre
|
||||
le face-à-face à 1 contre 2.
|
||||
le mur central avant de tirer ; mais avec l'économie d'action activée, les orcs
|
||||
parcourent toute leur vitesse (30 ft) puis frappent dans le même tour — le
|
||||
gobelin solitaire ne peut plus les distancer et tombe vite en mêlée sous les
|
||||
2d4+4 des falchions. C'est ce déséquilibre de cadence qui penche fortement le
|
||||
face-à-face à 1 contre 2 du côté des monstres.
|
||||
|
||||
## Formats de données
|
||||
|
||||
@@ -264,14 +266,24 @@ Règles modélisées :
|
||||
multiplication, les types perforants annulent la RD, les dégâts plancher à 0.
|
||||
- Mort quand `hp < min(-10, -CON)` ; `hp ≤ 0` = inactif.
|
||||
- Initiative : triée sur (total, modificateur, ordre de liste), sans re-jet.
|
||||
- Une action par tour : se déplacer OU attaquer.
|
||||
- Économie d'action : un tour normal donne une action standard + une action de
|
||||
mouvement (ou une action à round complet), plus swift/free/immediate. La
|
||||
politique renvoie une séquence ordonnée d'actions exécutées dans l'ordre ;
|
||||
`default_policy` renvoie `(move, attack)` quand l'ennemi le plus proche est
|
||||
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.
|
||||
- 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
|
||||
rafale. Les itératifs de BAB (2e attaque à BAB +6…) ne sont pas modélisés.
|
||||
- Mêlée : allonge d'une case ; mouvement : un pas par action, le long du plus
|
||||
court chemin réel (champ de coût Dijkstra depuis la cible — les combattants
|
||||
contournent les murs au lieu d'osciller contre eux).
|
||||
- Mêlée : allonge d'une case ; mouvement : un déplacement parcourt jusqu'à la
|
||||
vitesse du combattant en cases le long du plus court chemin réel (champ de
|
||||
coût Dijkstra depuis la cible, diagonales 5-10-5), en s'arrêtant adjacent à
|
||||
l'ennemi le plus proche — les combattants contournent les murs au lieu
|
||||
d'osciller contre eux.
|
||||
- Ligne d'effet : une cible entièrement derrière un terrain `blocks_los` ne
|
||||
peut pas être attaquée — la politique se déplace jusqu'à gagner une ligne de
|
||||
visée.
|
||||
@@ -290,8 +302,9 @@ appliquées dans la résolution) :
|
||||
- Sorts, jets de sauvegarde, conditions et états.
|
||||
- Attaques d'opportunité, flanquement, manœuvres de combat.
|
||||
- Effets mécaniques de hauteur/élévation.
|
||||
- Tailles Large+ (2×2), allonge > 5 ft, itératifs de BAB, économie d'action
|
||||
complète (charge, pas de placement…).
|
||||
- Tailles Large+ (2×2), allonge > 5 ft, itératifs de BAB, actions spéciales
|
||||
(attaque à outrance, charge, pas de placement, retraite) et actions
|
||||
immédiates hors-tour.
|
||||
|
||||
## Architecture
|
||||
|
||||
|
||||
Reference in New Issue
Block a user