Files
ctan f61fc5c61f docs: reorganize documentation structure
- Clean README.md with installation, usage, CLI, examples
- Move data formats to docs/data-formats/ (map.md, monster.md, pc-sheets.md, index.md)
- Move architecture to docs/architecture/ (index.md, technical-architecture.md, phase-2-llm-architecture.md)
- Add contributing guidelines in docs/contributing.md
- Clean README.md: install, usage, CLI, data-formats/rules/architecture links, contributing link
2026-09-26 20:12:05 +02:00

3.4 KiB
Raw Permalink Blame History

Architecture & Plan d'implémentation

Vue d'ensemble

Structure du code

src/pf1e_simulator/
├── combat.py          # CombatEngine, résolution attaques, actions, states
├── dice.py            # parseur notation dés (2d4+1)
├── rng.py             # SeededRng, ScriptedRng
├── models.py          # schémas Pydantic v2 (Combatant, AttackSpec, etc.)
├── map.py             # MapSpec, chargement YAML, validation
├── grid.py            # grille 5-10-5, Dijkstra, airborne_view
├── los.py             # ligne d'effet, couvert (règle des coins)
├── areas.py           # cône, ligne, burst (géométrie zones)
├── effects.py         # StatModifier, resolve_modifiers (empilement bonus)
├── conditions.py      # 29 conditions PF1e + flags comportementaux
├── abilities.py       # dons (Weapon Focus, Power Attack, etc.)
├── spells.py          # SpellSpec, effets, scalage, métamagie
├── metrics.py         # win_rate, win_rate_sigma, win_rate_band
├── runner.py          # EncounterSpec, run_encounter, EncounterReport
├── objectives.py      # primitives Phase 2 (P(survie), P(TPK), etc.)
├── phase2_spike.py    # politique "focus fire", danger cartography
├── cli.py             # argparse, rapport FR, flags LLM
├── loaders/
│   ├── combatant.py   # chargeur PJ + monstres + dons/sorts
│   └── foundry.py     # migration Foundry (one-shot, incomplet)
└── report.py          # LLM report writer (Phase 3)

Décisions clés (D-table)

ID Domaine Décision
D1 Économie d'action Résolue par deux étages (budget général + filtres spécialisés)
D2 Cartographie danger Non exhaustive : région d'échec + frontière + sensibilité
D3 Priorité v1 Cartographie d'abord, puis optimiseur (mêmes briques)
D4 Fournisseur/modèle Client agnostique ; implémentation distante d'abord, locale ensuite ; mode JSON/schéma requis
D5 Budget Plafonds petits (≤ 50 appels/campagne, ≤ 20 combats vitrine) + coupe-circuit
D6 Reproductibilité Cache obligatoire ; clé composite incluant le modèle ; replay call_seq
D7 Prompts Externes / dépôt séparé (voir §14)

Gate de validation

uv run pytest -q
uv run ruff check src tests
uv run basedpyright src
  • Ruff : select = ["ALL"], longueur ligne 100
  • Basedpyright : typeCheckingMode = "strict" sur src et tests
  • Transcripts épinglés + assertions statistiques (matchup symétrique dans bande 3σ)

Feuille de route

  • Phase 0 ✅ — socle combat (initiative, attaques, critiques, RD, états, déplacement, mêlée/distance)
  • Phase 1 ✅ — magie/états (108 sorts, DD/sauvegardes, concentration, invocation, conditions, manœuvres, dons, capacités de classe)
  • Phase 2 ✅ — couche tactique LLM (few-shot, réparation bornée, contrat Observation/LLMPolicy)
  • Phase 3 ✅ — rapporteur LLM local (agrégation stats + rédaction FR, report.py, --llm-report)
  • Phase 4 (futur) — optimiseur de scénarios, campagnes multi-rencontres