7.9 KiB
7.9 KiB
ROADMAP — Fallout: Venice of Wasteland
État au 16 juin 2026. Projet : moteur de simulation JDR Fallout 2D20 autonome, Louisiane post-nucléaire.
✅ Phase 1 — Moteur de base (TERMINÉ)
- Moteur de tick Python (survie, économie, rencontres)
- Système PNJ 4 tiers (Tier 0 Boss / Tier 1 Actifs / Tier 2 PNJ+ / Tier 3 Passage)
- Combats 2D20 (combat_engine.py)
- Sessions multiples isolées (session_id sur toutes les tables)
- Config JSON par session avec deep-merge par mode
- Hot-reload config au début de chaque jour (sans redémarrer)
- Vérification statut DB dans la boucle principale (stop depuis dashboard)
- Zones sûres (safe zones) — pas de rencontres lambda, commerce PNJ-à-PNJ
- Système de raids de faction dans les zones sûres (faible probabilité)
- Relations factions avec score de volatilité
✅ Phase 2 — RAG & Lore (TERMINÉ)
- ChromaDB avec 1403 chunks (règles 2D20 + lore canon Venice of Wasteland)
- Bible Venice of Wasteland v1.1 & v2.0 indexée (lore_canon, 32 chunks)
- Correction des 299 chunks avec métadonnée
type→category - Pipeline d'enrichissement lore (lore_enricher.py)
- RAG depuis fallout_lore (lore_canon + regles_core + lore_inspiration)
- Appel qwen2.5:14b avec prompt structuré JDR
- Propositions stockées dans
lore_proposals(PostgreSQL) - Validation manuelle depuis le PipBoy
- Propositions acceptées →
fallout_lore_enriched(Chroma)
✅ Phase 3 — Dashboard PipBoy (TERMINÉ)
- Dashboard Flask accessible sur fallout.coyoteos.ovh
- Onglet SIM LIBRE : état temps réel (PNJ, events, world state, factions, rencontres)
- Onglet OUTILS : génération commandes + stress test LLM avec console live
- Onglet ENRICHISSEMENT : validation propositions lore (accept/reject/modifier)
- Onglet PARAMÈTRES : config session, modes, reset jour/tick, statut DB
- Switcher de sessions (S1/S2)
- Auto-refresh 30s sur l'onglet simulation
- Métriques cards (PNJ vivants/morts, combats, rencontres)
- Bouton "Exécuter" stress test avec console live (polling 1.5s)
- Accès Ollama depuis le container Docker (iptables + host.docker.internal)
✅ Phase 4 — Tests de performance (TERMINÉ)
- Script stress test LLM (llm_crash_test.py) — modes simultane/decale/solo
- Script capacity test (capacity_test.py) — simulation N joueurs simultanés
- Résultats mesurés : 1/5/10/50 joueurs, tick 35s → 3m32
- Conclusion : 10-15 joueurs actifs simultanés recommandés sur l'infra actuelle
🔄 Phase 5 — LLM intégré à la simulation (EN COURS / PROCHAIN)
5a — Animation PNJ par LLM (priorité haute)
- Appel LLM 7b uniquement sur interaction joueur directe avec Tier 0/1
- Contexte RAG injecté : lore_canon faction + règles pertinentes
- Mémoire courte terme : 3 derniers échanges du PNJ en contexte
- Réponse stockée en DB (events table) avec attribution actor_id
- Limit : max N appels LLM PNJ simultanés par tick (configurable)
5b — MJ narrateur par LLM (priorité haute)
- Synthèse narrative du tick par le 14b (résumé de ce qui s'est passé)
- Stockée comme événement
narrative_ticken DB - Affichage dans PipBoy onglet SIM
- Contexte : world_state + top 10 événements du tick + relations factions
5c — Onglet SIM LLM dans PipBoy
- Vue dédiée pour les sessions avec LLM actif
- Feed narratif du MJ en temps réel
- Indicateur de charge LLM (requêtes en queue)
🔮 Phase 6 — Arbitre & Cohérence (CONÇU, NON IMPLÉMENTÉ)
Système de vérification automatique entre les ticks, utilisant la marge de 6m30 disponible.
Architecture
Tick N (3m30) → Résultats en DB
Arbitre LLM (3m00) → Vérification cohérence + règles
├── Auto-correction (patterns connus)
└── File manuelle → PipBoy validation
Tick N+1 → Démarre sur une base cohérente
Tables à créer
tick_validations— anomalies détectées par tickcorrection_patterns— patterns appris, score de confiance
Logique d'apprentissage
- Chaque validation manuelle augmente la confiance du pattern (+delta)
- Chaque rejet diminue la confiance (-delta)
- Seuil configurable (défaut 0.8) → bascule en auto-correction
- Types de patterns :
stat_check|location|economy|narrative
Ce que l'arbitre vérifie
- Auto (confiance rapide) : caps négatifs, HP > max, PNJ mort qui agit, localisation impossible
- Manuel (confiance lente) : cohérence narrative, comportement faction vs lore, conflits de traités
🔮 Phase 7 — Ticks temps réel (IDÉE VALIDÉE, NON IMPLÉMENTÉ)
Synchroniser les ticks sur l'heure réelle de la Louisiane (UTC-5/UTC-6).
Principe
- 1 tick = 1 heure réelle (timezone
America/Chicago) run.pycalcule le tick courant depuisdatetime.now(tz)au lieu d'incrémenter- Résout la dérive en cas de redémarrage
- Nuit en jeu = vraiment la nuit (20h-8h Louisiana = 2h-14h France)
Impact joueur
- Action possible toutes les X minutes réelles
- Le MJ et les PNJ "vivent" même quand le joueur est absent
- Journées réelles = journées en jeu
Config à ajouter dans sim_XXX.json
"tick": {
"mode": "realtime",
"realtime_timezone": "America/Chicago",
"fixed_tick_sleep_sec": 60
}
Considération fuseau horaire
- France UTC+2 vs Louisiane UTC-5/6 → 7-8h de décalage
- Midi à NOLA = 18h-19h en France → créneau jouable en soirée
- Nuit à NOLA se passe pendant les heures de travail en France → cohérent narrativement
🔮 Phase 8 — Météo procédurale (IDÉE, NON IMPLÉMENTÉ)
Système météo calé sur la météo réelle de la Louisiane.
- API météo New Orleans → injectée dans le contexte LLM chaque jour
- Impact mécanique : pluie = -visibilité, chaleur extrême = drain eau ×1.5
- Événements saisonniers : saison des ouragans (juin-novembre), Mardi Gras
- Stocké dans
world_statepar zone avec colonneweather_json
🔮 Phase 9 — Joueurs réels (VISION LONG TERME)
Interface pour que de vrais joueurs envoient des actions.
- API REST ou bot Discord → reçoit les actions joueur
- Action validée par l'arbitre (Phase 6) avant d'être exécutée
- Réponse PNJ via LLM 7b dans la foulée (<10s)
- Résumé MJ 14b envoyé à la fin du tick
- Gestion des absences : le PNJ joueur survit en mode automatique (Tier 1)
Backlog technique (bugs connus / dettes)
fallout-visu/app.pyetdashboard/app.pysont deux fichiers séparés à synchroniser manuellement → à unifier avec un mount symlink ou CI- Le container PipBoy se réinstalle à chaque restart (pip install au démarrage) → créer une image Docker dédiée
capacity_test.pyécrit en root depuis le container (permission denied) → monter le volume avec le bon uid- 8 timeouts sur 50 joueurs simultanés → augmenter timeout à 300s ou implémenter une queue avec backpressure
- Pas de persistance de l'iptables après reboot complet du host → vérifier que
netfilter-persistentest installé
Décisions d'architecture à retenir
| Décision | Raison |
|---|---|
| LLM PNJ déclenché sur interaction seulement (pas chaque tick) | Évite de saturer Ollama sur les 100+ PNJ de la sim |
fallout_lore en lecture seule |
Source de vérité immuable — les enrichissements vont dans fallout_lore_enriched |
| Validation manuelle avant auto (Phase 6) | Constituer un corpus de corrections avant d'automatiser |
| Ticks temps réel en option (pas par défaut) | Handicap pour les joueurs français si activé sans réflexion |
| PostgreSQL sur Vigile (OVH) séparé d'Ampère | Résilience — si Ampère tombe, les données persistent |
Sessions isolées par session_id |
Permet tests en parallèle sans collision de données |