Changement sur le Readme

Ajout d'une partie spécifique pour des PNJ dans la partie campagne
This commit is contained in:
2026-04-27 15:48:04 +02:00
parent aaebeaa547
commit 389392fd1d
80 changed files with 1771 additions and 719 deletions

View File

@@ -21,6 +21,7 @@ from app.domain.models import (
ChatMessage,
ChapterSummary,
CharacterSummary,
NpcSummary,
GameSystemContext,
LoreStructuralContext,
NarrativeEntityContext,
@@ -198,10 +199,12 @@ class ChatUseCase:
else "\n(Cette campagne n'est associée à aucun univers — tu peux proposer des éléments d'ambiance libres.)"
)
characters_block = ChatUseCase._format_characters(ctx.characters)
npcs_block = ChatUseCase._format_npcs(ctx.npcs)
return (
"--- CAMPAGNE COURANTE ---\n"
f"Nom : {ctx.campaign_name}{desc}{lore_note}\n"
f"{characters_block}\n"
f"{characters_block}"
f"{npcs_block}\n"
"Structure narrative (les flèches → indiquent des transitions de scène "
"déclenchées par un choix des joueurs) :\n"
f"{arcs_block}"
@@ -231,6 +234,33 @@ class ChatUseCase:
)
return "\n".join(lines) + "\n"
@staticmethod
def _format_npcs(npcs: list[NpcSummary]) -> str:
"""Bloc PNJ — symétrique aux PJ avec sa propre instruction anti-halluci.
Distinction importante : pour les PNJ, l'IA est ENCOURAGÉE à proposer de
nouveaux PNJ (création créative = OK). En revanche, elle ne doit pas
référencer comme existant un PNJ qui n'est pas dans la liste ci-dessous.
"""
if not npcs:
return (
"\nPersonnages non-joueurs (PNJ) : aucun défini pour l'instant. "
"Tu peux librement proposer de nouveaux PNJ au MJ, mais ne "
"fais pas comme s'ils existaient déjà dans la campagne.\n"
)
lines = ["\nPersonnages non-joueurs (PNJ) connus :"]
for n in npcs:
if n.snippet:
lines.append(f"- **{n.name}** — {n.snippet}")
else:
lines.append(f"- **{n.name}** (fiche vide)")
lines.append(
"Pour une fiche complète d'un PNJ existant (apparence, motivations), "
"n'invente rien : demande au MJ d'ouvrir l'éditeur du PNJ. Tu peux "
"en revanche proposer librement de NOUVEAUX PNJ."
)
return "\n".join(lines) + "\n"
@staticmethod
def _format_arcs(arcs: list[ArcSummary]) -> str:
if not arcs:
@@ -319,7 +349,8 @@ class ChatUseCase:
"arc": "ARC",
"chapter": "CHAPITRE",
"scene": "SCÈNE",
"character": "FICHE DE PERSONNAGE",
"character": "FICHE DE PERSONNAGE (PJ)",
"npc": "FICHE DE PNJ",
}.get(ne.entity_type.lower(), ne.entity_type.upper())
if ne.fields:
fields_block = "\n".join(