feat(abilities): add passive feats system (Weapon Focus, Iron Will, Dodge, Point-Blank Shot)

This commit is contained in:
2026-08-17 22:49:50 +02:00
parent a32444f804
commit ba1c3c2117
5 changed files with 439 additions and 9 deletions
+12 -5
View File
@@ -340,9 +340,9 @@ Non modélisé (couches `elevation`/`markers` présentes mais non appliquées
dans la résolution) :
- Sorts (le système d'effets `effects.py`, les règles d'empilement des
bonus, les jets de sauvegarde `resolve_save` et le système de conditions
`conditions.py` sont en place — l'intégration des sorts au moteur est en
cours).
bonus, les jets de sauvegarde `resolve_save`, le système de conditions
`conditions.py` et les dons passifs `abilities.py` sont en place —
l'intégration des sorts au moteur est en cours).
- Manœuvres de combat.
- Effets mécaniques de hauteur/élévation.
- Tailles Large+ (2×2), allonge > 5 ft
@@ -378,6 +378,12 @@ dans la résolution) :
staggered, frightened, panicked, cowering). Les modificateurs sont intégrés
à `resolve_attack` (attaque, dégâts, CA) et `resolve_save` (jets de
sauvegarde) via `_stat_modifiers` qui collecte effets + conditions.
- `abilities.py` — dons et capacités : `AbilitySpec` (dataclass avec
catégorie feat/class/racial/trait) et dons passifs prédéfinis (Weapon Focus,
Toughness, Iron Will, Great Fortitude, Lightning Reflexes, Alertness,
Point-Blank Shot, Dodge). Les modificateurs sont collectés par
`_stat_modifiers` avec filtrage par arme (`weapon_filter`). Le champ
`features` de `Combatant` contient les aptitudes permanentes.
- `metrics.py` — statistiques en forme fermée : `win_rate`, `win_rate_sigma`,
`win_rate_band` (bande 3σ bornée à [0, 1]).
- `runner.py``EncounterSpec`/`Side`, `build_states` (placement en zone +
@@ -393,7 +399,7 @@ dans la résolution) :
La gate de validation complète (tests + lint + types) :
```bash
uv run pytest -q # 276 tests
uv run pytest -q # 293 tests
uv run ruff check src tests
uv run basedpyright src # mode strict
```
@@ -410,7 +416,8 @@ uv run basedpyright src # mode strict
conditions, manœuvres de combat, dons et capacités de classe. Flanquement,
attaques à outrance, attaques d'opportunité, charge, retraite et pas de
placement sont déjà modélisés. Le système d'effets (`effects.py`), les
règles d'empilement des bonus et les jets de sauvegarde (`resolve_save`)
règles d'empilement des bonus, les jets de sauvegarde (`resolve_save`), le
système de conditions (`conditions.py`) et les dons passifs (`abilities.py`)
sont en place.
- **Phase 2** — couche tactique LLM : stratégies en langage naturel traduites
en politiques, balayage de matrices de positionnement.