feat(conditions): add condition system with 18 PF1e conditions

This commit is contained in:
2026-08-17 22:49:50 +02:00
parent 2cd8a33a4d
commit a32444f804
4 changed files with 558 additions and 12 deletions
+12 -4
View File
@@ -339,9 +339,10 @@ Règles modélisées :
Non modélisé (couches `elevation`/`markers` présentes mais non appliquées
dans la résolution) :
- Sorts et conditions (le système d'effets `effects.py`, les règles
d'empilement des bonus et les jets de sauvegarde `resolve_save` sont en
place — l'intégration des sorts et conditions au moteur est en cours).
- 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).
- Manœuvres de combat.
- Effets mécaniques de hauteur/élévation.
- Tailles Large+ (2×2), allonge > 5 ft
@@ -370,6 +371,13 @@ dans la résolution) :
sans type) s'additionnent ; types non-cumulables (morale, sacré, profane,
enhancement…) gardent la valeur la plus élevée. Les pénalités suivent les
mêmes règles. Fondation pour sorts, conditions, dons et capacités de classe.
- `conditions.py` — conditions PF1e : `Condition` (dataclass avec
modificateurs + flags comportementaux) et 18 conditions prédéfinies
(shaken, sickened, fatigued, exhausted, entangled, dazzled, blinded,
deafened, flat-footed, prone, stunned, paralyzed, nauseated, dazed,
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.
- `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 +
@@ -385,7 +393,7 @@ dans la résolution) :
La gate de validation complète (tests + lint + types) :
```bash
uv run pytest -q # 253 tests
uv run pytest -q # 276 tests
uv run ruff check src tests
uv run basedpyright src # mode strict
```