Quiz jouable : budget de récompense, boîte à quiz, widget score
- 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>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
e972acf9e6
commit
b5546df044
+2
-1
@@ -88,6 +88,7 @@ from .quests.update_quest import update_quest
|
||||
from .quests.delete_quest import delete_quest
|
||||
from .quests.set_quest_dialogues import set_quest_dialogues
|
||||
from .quests.sanitize_quest_dialogues import sanitize_quest_dialogues, QUESTION_REWARD_TYPES
|
||||
from .quests.reward_budget import quest_dialogues_total_reward
|
||||
|
||||
__all__ = [
|
||||
"PROJECTS_DIR", "FIELD_TYPES", "GLOBAL_VARIABLE_TYPES", "PLAYER_SHARED",
|
||||
@@ -108,5 +109,5 @@ __all__ = [
|
||||
"list_custom_events", "get_custom_event", "create_custom_event", "update_custom_event",
|
||||
"QUEST_STATUS_CHOICES", "QUEST_STATUS_LABELS", "QUEST_RESULT_CHOICES", "QUEST_RESULT_LABELS",
|
||||
"list_quests", "get_quest", "create_quest", "update_quest", "delete_quest",
|
||||
"set_quest_dialogues", "sanitize_quest_dialogues", "QUESTION_REWARD_TYPES",
|
||||
"set_quest_dialogues", "sanitize_quest_dialogues", "QUESTION_REWARD_TYPES", "quest_dialogues_total_reward",
|
||||
]
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
def quest_dialogues_total_reward(dialogues):
|
||||
"""Somme des récompenses de toutes les questions ("❓ Question", voir
|
||||
sanitize_quest_dialogues.py), TOUTES colonnes/statuts confondus — une
|
||||
quête n'a qu'UNE SEULE récompense totale (quest["recompense_score"]),
|
||||
jamais une par statut. Utilisée pour empêcher d'enregistrer plus de
|
||||
points répartis entre les questions que la quête n'en offre (voir
|
||||
routes/quests/quest_dialogues.py et quest_update.py)."""
|
||||
total = 0
|
||||
for lines in (dialogues or {}).values():
|
||||
if not isinstance(lines, list):
|
||||
continue
|
||||
for line in lines:
|
||||
if isinstance(line, dict) and line.get("type") == "question":
|
||||
total += line.get("reward_amount", 0) or 0
|
||||
return total
|
||||
@@ -11,7 +11,7 @@ _MAX_SPEAKER_LENGTH = 60
|
||||
# d'autres plus tard sans changer la forme des données.
|
||||
QUESTION_REWARD_TYPES = ["score"]
|
||||
_MIN_CHOICES = 2
|
||||
_MAX_CHOICES = 8
|
||||
_MAX_CHOICES = 4
|
||||
|
||||
|
||||
def _sanitize_dialogue_line(raw_line):
|
||||
|
||||
Reference in New Issue
Block a user