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>
43 lines
1.7 KiB
Python
43 lines
1.7 KiB
Python
from ..connection import connect
|
|
from .constants import QUEST_STATUS_CHOICES, QUEST_RESULT_CHOICES
|
|
from .ensure_quests_schema import ensure_quests_schema
|
|
from .get_quest import get_quest
|
|
|
|
|
|
def update_quest(slug, quest_id, fields):
|
|
"""Met à jour uniquement les clés reconnues et valides de `fields` —
|
|
ignore tout le reste plutôt que de lever, même esprit que
|
|
sanitize_collision_rules (jamais confiance dans ce qu'envoie le
|
|
client). title vide => ignoré (garde l'ancien plutôt qu'un titre vide)."""
|
|
ensure_quests_schema(slug)
|
|
if get_quest(slug, quest_id) is None:
|
|
return None
|
|
updates = {}
|
|
if "title" in fields:
|
|
title = (fields["title"] or "").strip()
|
|
if title:
|
|
updates["title"] = title
|
|
if "objectif" in fields:
|
|
updates["objectif"] = (fields["objectif"] or "").strip()
|
|
if "recompense_score" in fields:
|
|
try:
|
|
updates["recompense_score"] = int(fields["recompense_score"])
|
|
except (TypeError, ValueError):
|
|
pass
|
|
if "status" in fields and fields["status"] in QUEST_STATUS_CHOICES:
|
|
updates["status"] = fields["status"]
|
|
if "resultat" in fields:
|
|
resultat = fields["resultat"]
|
|
if resultat in QUEST_RESULT_CHOICES:
|
|
updates["resultat"] = resultat
|
|
elif resultat is None:
|
|
updates["resultat"] = None
|
|
if not updates:
|
|
return get_quest(slug, quest_id)
|
|
conn = connect(slug)
|
|
set_clause = ", ".join(f"{key} = ?" for key in updates)
|
|
conn.execute(f"UPDATE _quests SET {set_clause} WHERE id = ?", (*updates.values(), quest_id))
|
|
conn.commit()
|
|
conn.close()
|
|
return get_quest(slug, quest_id)
|