feat(effects): add effect system with PF1e bonus stacking rules

This commit is contained in:
2026-08-17 22:49:50 +02:00
parent 94521394ef
commit 8ac6f9eabe
3 changed files with 308 additions and 7 deletions
+16 -7
View File
@@ -331,10 +331,12 @@ Règles modélisées :
l'arme ranged reste utilisable jusqu'à 10 incréments. Les armes de jet
(5 incréments max) ne sont pas distinguées des armes à projectiles.
Non modélisé en Phase 0 (couches `elevation`/`markers` présentes mais non
appliquées dans la résolution) :
Non modélisé (couches `elevation`/`markers` présentes mais non appliquées
dans la résolution) :
- Sorts, jets de sauvegarde, conditions et états.
- Sorts, jets de sauvegarde, conditions et états (le système d'effets et les
règles d'empilement sont en place via `effects.py` — l'intégration au
moteur est en cours).
- Manœuvres de combat.
- Effets mécaniques de hauteur/élévation.
- Tailles Large+ (2×2), allonge > 5 ft
@@ -357,6 +359,12 @@ appliquées dans la résolution) :
- `combat.py``CombatEngine` déterministe : initiative, actions, résolution
des attaques (couvert, ligne d'effet, pénalités de portée), états de vie,
transcripts, politique par défaut.
- `effects.py` — système d'effets : `StatModifier` (modificateur de
caractéristique avec type de bonus) et `resolve_modifiers` (application des
règles d'empilement PF1e). Types de bonus cumulables (dodge, racial, trait,
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.
- `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 +
@@ -372,7 +380,7 @@ appliquées dans la résolution) :
La gate de validation complète (tests + lint + types) :
```bash
uv run pytest -q # 219 tests
uv run pytest -q # 241 tests
uv run ruff check src tests
uv run basedpyright src # mode strict
```
@@ -386,9 +394,10 @@ 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, manœuvres de combat. Flanquement, attaques à
outrance, attaques d'opportunité, charge, retraite et pas de placement sont
déjà modélisés.
effets paramétrés, 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`) et les règles d'empilement des bonus sont en place.
- **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