Éditeur de quêtes : titre/objectif/récompense/statut/résultat + dialogue à 3 colonnes
Nouvel espace "🗺️ Quêtes" (game-wide, comme les événements personnalisés) : liste de cartes + "+ Nouvelle quête", chaque carte ouvrant une modale d'arbre de dialogue en bulles de théâtre ("speaker: texte"), une colonne par statut de quête (nouvelle/en cours/terminée) puisque le dialogue joué dépend de l'état de la quête au moment où le joueur parle au PNJ. Bulles alternées joueur/PNJ, couleur différente selon qui parle. L'action "Déclencher une quête" de l'éditeur de collision n'est plus un champ texte libre : elle ouvre directement CETTE MÊME modale (picker de quêtes existantes + création à la volée), et finalise la règle avec l'id numérique de la quête choisie — collision_rules.py migré en conséquence (quete_id devient un entier, comme evenement_id). Corrige aussi la miniature d'objet de la carte "🧩 Collision", 3× plus grande (120px) comme demandé. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
4391b36d45
commit
51427b5297
@@ -0,0 +1,30 @@
|
||||
from .constants import QUEST_STATUS_CHOICES, QUEST_SPEAKER_CHOICES
|
||||
|
||||
_MAX_LINES_PER_COLUMN = 200
|
||||
|
||||
|
||||
def sanitize_quest_dialogues(raw_dialogues):
|
||||
"""Une réplique = {speaker: 'joueur'|'pnj', text: '...'} — une colonne
|
||||
par statut de quête (voir QUEST_STATUS_CHOICES), la même forme que
|
||||
resolve_collision_rules.sanitize_collision_rules : rejette tout
|
||||
élément invalide plutôt que de lever, ne garde jamais un texte vide."""
|
||||
result = {status: [] for status in QUEST_STATUS_CHOICES}
|
||||
if not isinstance(raw_dialogues, dict):
|
||||
return result
|
||||
for status in QUEST_STATUS_CHOICES:
|
||||
raw_lines = raw_dialogues.get(status)
|
||||
if not isinstance(raw_lines, list):
|
||||
continue
|
||||
cleaned = []
|
||||
for raw_line in raw_lines[:_MAX_LINES_PER_COLUMN]:
|
||||
if not isinstance(raw_line, dict):
|
||||
continue
|
||||
speaker = raw_line.get("speaker")
|
||||
text = raw_line.get("text")
|
||||
if speaker not in QUEST_SPEAKER_CHOICES:
|
||||
continue
|
||||
if not isinstance(text, str) or not text.strip():
|
||||
continue
|
||||
cleaned.append({"speaker": speaker, "text": text.strip()})
|
||||
result[status] = cleaned
|
||||
return result
|
||||
Reference in New Issue
Block a user