- SESSION #{{ session.id }} — {{ session.name }}
- JOUR {{ session.current_day }} / TICK {{ session.current_tick }}h
- {{ session.mode | upper }}
- STATUS: {{ session.status | upper }}
- SEED: {{ session.seed_global }}
- 🔄 Actualiser
-
+
+ Session #{{ session.id }} — {{ session.name }}
+ Jour {{ session.current_day }} / Tick {{ session.current_tick }}h
+ {{ session.mode | upper }}
+ {% set st = session.status %}
+
+
+ {{ st | upper }}
+
+ Seed: {{ session.seed_global }}
+
+ ↻ Actualiser
+
+
{% endif %}
+
+
+
+
+
+ PNJ Vivants
+ {{ alive_count }}
+
+
+ PNJ Morts
+ {{ stats.get('PNJ morts', 0) }}
+
+
+ Total PNJ
+ {{ total_count }}
+
+
+ Combats
+ {{ stats.get('Combats', 0) }}
+
+
+ Rencontres
+ {{ stats.get('Rencontres', 0) }}
+
+
+Événements
+ {{ stats.get('Événements total', 0) }}
+
-
-
@@ -254,18 +704,18 @@ TEMPLATE = r"""
👥 PNJ ACTIFS ({{ alive_count }}/{{ total_count }})
+👥 PNJ ({{ alive_count }}/{{ total_count }})
| TIER | NOM | PV | FACTION | ZONE | CAPS | ||
|---|---|---|---|---|---|---|---|
| Tier | Nom | PV | Faction | Zone | Caps | ||
| - {% if c.tier == 0 %}★BOSS - {% elif c.tier == 2 %}◈ T2 - {% elif c.tier == 3 %}· T3 - {% else %}● T1{% endif %} + {% if c.tier == 0 %}★ BOSS + {% elif c.tier == 2 %}T2 + {% elif c.tier == 3 %}T3 + {% else %}T1{% endif %} | {{ c.name }} |
{% if c.is_alive %}
- {% set pct = (c.hp / c.max_hp * 100) | int if c.max_hp else 0 %}
-
- {{ c.hp }}/{{ c.max_hp }}
- {% else %}†{% endif %}
+ {{ c.hp }}/{{ c.max_hp }}
+ {% else %}†{% endif %}
|
{% set f = c.faction_slug or 'sans' %} - - {{ f[:12] }} + {{ f[:14] }} | -{{ (c.location_slug or '—')[:14] }} | -{{ c.caps }}¢ | +{{ (c.location_slug or '—')[:16] }} | +{{ c.caps }}¢ |
-
-
@@ -274,109 +724,103 @@ TEMPLATE = r"""
📡 ÉVÉNEMENTS RÉCENTS
+📡 Événements récents
| J/T | TYPE | DESCRIPTION | |||
|---|---|---|---|---|---|
| J/T | Type | Description | |||
| {{ ev.day }}/{{ ev.tick }} | -{{ ev.event_type }} | -{{ ev.description[:80] }}{% if ev.description|length > 80 %}…{% endif %} | +{{ ev.day }}/{{ ev.tick }} | +{{ ev.event_type }} | +{{ ev.description[:90] }}{% if ev.description|length > 90 %}…{% endif %} |
| Aucun événement | |||||
| Aucun événement | |||||
-
🗺 ÉTAT DU MONDE
+🗺 État du monde
{% for ws in world_state %}
{{ ws.location_slug }}
-
- 🍖
{% endfor %}
- {% if not world_state %}
- 💧
- 🛡
- 👤{{ ws.pop_count or 0 }}
+
+ 🍖 {{ ws.food_level or 0 }}%
+ 💧 {{ ws.water_level or 0 }}%
+ 🛡 {{ ws.security_level or 0 }}%
+ 👤 {{ ws.pop_count or 0 }}
Pas de données monde
{% endif %} + {% if not world_state %}Pas de données monde
{% endif %}
-
-
-
+
⚔ RELATIONS FACTIONS
+⚔ Relations factions
| FACTION A | FACTION B | SCORE | ÉTAT | ||||
|---|---|---|---|---|---|---|---|
| Faction A | Faction B | Score | État | ||||
| {{ r.faction_a[:12] }} | -{{ r.faction_b[:12] }} | -- {{ r.relation_score }} | -- {{ r.relation_label or ('HOSTILE' if r.relation_score < -20 else 'ALLIÉ' if r.relation_score > 20 else 'NEUTRE') }} - | +{{ r.faction_a[:14] }} | +{{ r.faction_b[:14] }} | +{{ r.relation_score }} | +{{ r.relation_label or ('HOSTILE' if r.relation_score < -20 else 'ALLIÉ' if r.relation_score > 20 else 'NEUTRE') }} |
| Pas de données | |||||||
| Pas de données | |||||||
-
-
-
-
-
+
-
-
-
-
📊 STATS SIMULATION
-| MÉTRIQUE | VALEUR |
|---|---|
| {{ k }} | {{ v }} |
-
🎭 PNJ PAR TIER
-| TIER | LABEL | VIVANTS | MORTS | ||||||
|---|---|---|---|---|---|---|---|---|---|
| Tier | Label | Vivants | Morts |
|---|---|---|---|
| {{ row.tier }} | {{ row.label }} | -{{ row.alive }} | {{ row.dead }} | +
| {{ row.tier }} | +{{ row.label }} | +{{ row.alive }} | +{{ row.dead }} |
-
🏙 PNJ PAR ZONE (TOP 5)
+🏙 PNJ par zone (top 5)
| ZONE | PNJ |
|---|---|
| Zone | PNJ |
| {{ row.location_slug }} | {{ row.cnt }} |
| {{ row.location_slug }} | +{{ row.cnt }} | +
-
⚡ RENCONTRES RÉCENTES
-
+
+
-
{% if boss_inventory %}
-⚡ Rencontres récentes
+| J/T | TYPE | ACTEUR | ZONE | DESCRIPTION | |||||
|---|---|---|---|---|---|---|---|---|---|
| J/T | Type | Acteur | Zone | Description | |||||
| {{ ev.day }}/{{ ev.tick }} | -{{ ev.event_type }} | -{{ ev.actor_name or '—' }} | -{{ (ev.location_slug or '—')[:14] }} | -{{ ev.description[:90] }}{% if ev.description|length > 90 %}…{% endif %} | +{{ ev.day }}/{{ ev.tick }} | +{{ ev.event_type }} | +{{ ev.actor_name or '—' }} | +{{ (ev.location_slug or '—')[:16] }} | +{{ ev.description[:90] }}{% if ev.description|length > 90 %}…{% endif %} |
| Aucune rencontre | |||||||||
| Aucune rencontre | |||||||||
-
★ ÉQUIPEMENT CHEFS DE FACTION
+
+
-
@@ -384,7 +828,6 @@ TEMPLATE = r"""
{% endif %}
+{% elif tab == 'tools' %}
+
+
+
+
+
+
+
+
★ Équipement chefs de faction
| BOSS | ITEM | TYPE | QTÉ | ÉQUIPÉ | |||
|---|---|---|---|---|---|---|---|
| Boss | Item | Type | Qté | Équipé | |||
| {{ row.char_name }} | +{{ row.char_name }} | {{ row.item_name }} | -{{ row.item_type }} | +{{ row.item_type }} | {{ row.quantity }} | -{{ '✓' if row.is_equipped else '' }} | +{{ '✓' if row.is_equipped else '' }} |
+
+
+
+🚀 Lancer une simulation
+
+
+
+
+ {% for s in all_sessions %}
+
+ {% endfor %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+📚 Lancer un enrichissement lore
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{% elif tab == 'lore' %}
-
-⚡ Stress Test LLM
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ En cours…
+ ⏳
+
+
+
+
+
+
+
+
+
+
+
+
+ SORTIE EN DIRECT
+
+
+
+
- 📜 ENRICHISSEMENT LORE — VENICE OF WASTELAND
-
- En attente : {{ lore_stats.pending }}
- Acceptées : {{ lore_stats.accepted }}
- Rejetées : {{ lore_stats.rejected }}
- Modifiées : {{ lore_stats.modified }}
-
+
+ 📜 Enrichissement Lore — Venice of Wasteland
+
+ En attente : {{ lore_stats.pending }}
+ Acceptées : {{ lore_stats.accepted }}
+ Rejetées : {{ lore_stats.rejected }}
+ Modifiées : {{ lore_stats.modified }}
+
@@ -445,19 +1161,19 @@ if (el) {
- {{ proposals|length }} proposition(s) affichée(s)
+ {{ proposals|length }} proposition(s) affichée(s)
{% if not proposals %}
-
+
@@ -492,28 +1208,28 @@ if (el) {
-
+
-
{% elif p.status == 'modified' and p.modified_text %}
-
Aucune proposition lore.
- Lancer :
{% endif %}
@@ -465,22 +1181,22 @@ if (el) {
- Lancer :
python3 lore_enricher.py --faction grand_krewe sur Ampère
+ Lancer : python3 lore_enricher.py --faction grand_krewe sur Ampère
#{{ p.id }}
- {{ p.status | upper }}
+ {{ p.status | upper }}
{{ p.change_type }}
- {{ p.faction_slug }}
+ {{ p.faction_slug }}
{% if p.field_path %}{{ p.field_path }}{% endif %}
- {{ p.created_at.strftime('%d/%m %H:%M') if p.created_at else '' }}
+ {{ p.created_at.strftime('%d/%m %H:%M') if p.created_at else '' }}
{{ p.rationale or '(pas de justification)' }}
-
ORIGINAL
+ Original
{{ p.original_text or '(ajout — pas de texte original)' }}
-
PROPOSÉ
+ Proposé
{{ p.proposed_text }}
-
@@ -525,11 +1241,15 @@ if (el) {
{% if session %}
-TEXTE MODIFIÉ ACCEPTÉ
- {{ p.modified_text }}
+
+
{% endif %}
Texte modifié accepté
+ {{ p.modified_text }}
- SESSION #{{ session.id }} — {{ session.name }}
- {{ session.mode | upper }}
- STATUS: {{ session.status | upper }}
- JOUR {{ session.current_day }} / TICK {{ session.current_tick }}h
+
+ Session #{{ session.id }} — {{ session.name }}
+ {{ session.mode | upper }}
+ {% set st = session.status %}
+
+
+ {{ st | upper }}
+
+ Jour {{ session.current_day }} / Tick {{ session.current_tick }}h
{% endif %}
@@ -537,12 +1257,12 @@ if (el) {
-