- Récompense d'une quête = budget MAXIMUM pour ses questions : la somme des points des "❓ Question" ne peut plus dépasser recompense_score (routes/quests/quest_dialogues.py à l'enregistrement des dialogues, quest_update.py si on abaisse la récompense sous ce qui est déjà réparti) — message d'erreur explicite (400) dans les deux sens, affiché via alert() côté éditeur (quest-editor.js), jamais enregistré silencieusement dans un état incohérent. - Nombre de choix par question plafonné à 4 (au lieu de 8). - Deux nouveaux widgets "🖥️ Interface" (mêmes fondations que "💬 Boîte de dialogue" — screens/rendering/dialogue_box_style.py, même panneau "🎨 Style") : - "❓ Boîte à quiz" : affiche la question et ses choix, sans pied (une question se résout au clic sur un choix, pas de "Suivant"). - "🏆 Score" : affiche en continu les points gagnés, TOUJOURS visible une fois posé (contrairement aux boîtes de dialogue/quiz, masquées par défaut). - Moteur d'exécution (static/js/play/dialogue-box-controller.js, refonte) : une conversation de quête alterne maintenant répliques (boîte de dialogue) et questions (boîte à quiz) selon le type de chaque ligne. Bonne réponse -> crédite le score (compteur runtime dédié, jamais lié au score du moteur document) et avance ; mauvaise réponse -> rien, la question reste affichée pour réessayer ; aucune boîte à quiz posée -> la question est ignorée plutôt que de bloquer la conversation. Le dialogue "en_cours" épuisé (donc, s'il contenait des questions, toutes répondues) fait passer la quête "terminee" (en mémoire seulement, comme le reste de ce système — voir accepter/ refuser une offre de quête) : le joueur peut alors quitter la scène normalement, ces widgets n'étant jamais des obstacles. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
35 lines
1.5 KiB
Python
35 lines
1.5 KiB
Python
from flask import jsonify, request
|
|
|
|
import db
|
|
|
|
from core.flask_app import app
|
|
|
|
|
|
@app.route("/game/<slug>/quests/<int:quest_id>/dialogues", methods=["POST"])
|
|
def quest_dialogues(slug, quest_id):
|
|
"""Toujours les 3 colonnes ENTIÈRES (voir db.set_quest_dialogues) —
|
|
le client (renderQuestDialogueColumns, quest-editor.js) poste l'objet
|
|
complet à chaque modification plutôt qu'une réplique isolée.
|
|
|
|
Refusé (400) si la somme des récompenses des questions ("❓ Question")
|
|
dépasse la récompense totale de la quête (recompense_score) — voir
|
|
db.quest_dialogues_total_reward. Validé ICI (avant persistance)
|
|
plutôt que dans db.set_quest_dialogues, pour renvoyer un message
|
|
d'erreur explicite au lieu d'enregistrer silencieusement un état
|
|
incohérent."""
|
|
quest = db.get_quest(slug, quest_id)
|
|
if quest is None:
|
|
return jsonify({"error": "quête introuvable"}), 404
|
|
body = request.get_json(silent=True) or {}
|
|
sanitized = db.sanitize_quest_dialogues(body.get("dialogues"))
|
|
allocated = db.quest_dialogues_total_reward(sanitized)
|
|
if allocated > quest["recompense_score"]:
|
|
return jsonify({
|
|
"error": (
|
|
f"La somme des récompenses des questions ({allocated} pts) dépasse "
|
|
f"la récompense totale de la quête ({quest['recompense_score']} pts)."
|
|
),
|
|
}), 400
|
|
dialogues = db.set_quest_dialogues(slug, quest_id, body.get("dialogues"))
|
|
return jsonify({"dialogues": dialogues})
|