Ajoute la fonctionnalite quiz autonome/plein ecran a la boite a quiz
Introduit la double categorie de modeles (boite de dialogue / page de quiz plein ecran) avec plein ecran, minuteur, score integre et ecran de resultat pour les modeles page ; ajoute les modeles "Manga" (boite et page) et "Classique" (page), pilotables aussi par l'assistant IA Ruby. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
559331f9cf
commit
7db4803b93
@@ -8,5 +8,6 @@ from . import (
|
||||
scene_object_collision,
|
||||
scene_object_name,
|
||||
scene_object_dialogue_box_style,
|
||||
scene_object_quiz_config,
|
||||
scene_object_names_list,
|
||||
)
|
||||
|
||||
@@ -22,6 +22,18 @@ def render_scene_edit(slug, screen_id, game):
|
||||
objects = screens.list_scene_objects(slug, screen_id)
|
||||
for o in objects:
|
||||
o["rendered_html"] = screens.render_scene_object(o)
|
||||
# "Plein écran" (demande explicite : la boîte à quiz doit occuper
|
||||
# tout le canevas de CET éditeur, pas seulement au jeu, dès que ce
|
||||
# réglage est coché) — calculé pour TOUS les objets (pas
|
||||
# seulement le sélectionné) : plusieurs quiz plein écran sur le
|
||||
# même écran resteraient rares/déconseillés, mais rien n'empêche
|
||||
# techniquement d'en poser plusieurs.
|
||||
o["quiz_fullscreen"] = o["kind"] == "quiz_box" and screens.resolve_quiz_box_config(o)["fullscreen"]
|
||||
# La "notion de caméra disparaît" (demande explicite) : le cadre "🎥
|
||||
# Champ de la caméra" n'a plus aucun sens dès qu'un quiz plein écran
|
||||
# est posé sur cet écran, caméra ou pas — masqué dans ce cas (voir
|
||||
# templates/scene_edit.html).
|
||||
any_quiz_box_fullscreen = any(o["quiz_fullscreen"] for o in objects)
|
||||
|
||||
# "Monde" (voir screens.resolve_scene_world_size, réutilisé aussi par
|
||||
# la miniature de "Mes écrans", routes/games/game_dashboard.py) : un
|
||||
@@ -41,6 +53,7 @@ def render_scene_edit(slug, screen_id, game):
|
||||
personnage_role = None
|
||||
collision_settings = None
|
||||
dialogue_box_style = None
|
||||
quiz_box_config = None
|
||||
selected_obj = next((o for o in objects if o["id"] == selected_id), None) if selected_id else None
|
||||
_UI_WIDGET_KINDS = ("dialogue_box", "quiz_box", "score_widget")
|
||||
if selected_obj:
|
||||
@@ -52,6 +65,12 @@ def render_scene_edit(slug, screen_id, game):
|
||||
personnage_role = screens.resolve_personnage_role(selected_obj)
|
||||
elif selected_obj["kind"] in _UI_WIDGET_KINDS:
|
||||
dialogue_box_style = screens.resolve_dialogue_box_style(selected_obj)
|
||||
if selected_obj["kind"] == "quiz_box":
|
||||
# Plein écran/minuteur/modèle (demande explicite : quiz RH
|
||||
# autonome) — voir screens/rendering/quiz_box_config.py,
|
||||
# PANNEAU distinct de "🎨 Style" ci-dessus (couleurs/police,
|
||||
# partagé avec dialogue_box/score_widget).
|
||||
quiz_box_config = screens.resolve_quiz_box_config(selected_obj)
|
||||
|
||||
_DEFAULT_OBJECT_LABELS = {"personnage": "Personnage", "fond": "Fond"}
|
||||
object_labels = {
|
||||
@@ -117,6 +136,7 @@ def render_scene_edit(slug, screen_id, game):
|
||||
"scene_edit.html",
|
||||
game=game, screen=screen, all_screens=all_screens,
|
||||
world_width=world_width, world_height=world_height,
|
||||
any_quiz_box_fullscreen=any_quiz_box_fullscreen,
|
||||
objects=objects, selected_id=selected_id, personnage_data=personnage_data,
|
||||
personnage_commands=personnage_commands or screens.DEFAULT_PERSONNAGE_COMMANDS,
|
||||
personnage_role=personnage_role or screens.DEFAULT_PERSONNAGE_ROLE,
|
||||
@@ -124,6 +144,12 @@ def render_scene_edit(slug, screen_id, game):
|
||||
collision_settings=collision_settings or screens.DEFAULT_COLLISION_SETTINGS,
|
||||
dialogue_box_style=dialogue_box_style or screens.DEFAULT_DIALOGUE_BOX_STYLE,
|
||||
dialogue_box_font_weight_choices=screens.FONT_WEIGHT_CHOICES,
|
||||
quiz_box_config=quiz_box_config or screens.DEFAULT_QUIZ_BOX_CONFIG,
|
||||
quiz_box_timer_modes=screens.TIMER_MODES,
|
||||
quiz_box_dialog_templates=screens.QUIZ_BOX_DIALOG_TEMPLATES,
|
||||
quiz_box_dialog_template_labels=screens.QUIZ_BOX_DIALOG_TEMPLATE_LABELS,
|
||||
quiz_box_page_templates=screens.QUIZ_BOX_PAGE_TEMPLATES,
|
||||
quiz_box_page_template_labels=screens.QUIZ_BOX_PAGE_TEMPLATE_LABELS,
|
||||
sprite_library=sprite_library, sprite_library_families=sprite_library_families,
|
||||
sprite_library_json=json.dumps(sprite_library),
|
||||
background_library=background_library,
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
from flask import request, jsonify
|
||||
|
||||
import screens
|
||||
|
||||
from core.flask_app import app
|
||||
|
||||
|
||||
@app.route("/game/<slug>/scene-objects/<int:object_id>/quiz-config", methods=["POST"])
|
||||
def scene_object_quiz_config(slug, object_id):
|
||||
"""Réglages "❓ Boîte à quiz" (plein écran/minuteur/modèle, voir
|
||||
screens/rendering/quiz_box_config.py) — mirror exact de
|
||||
routes/scenes/scene_object_dialogue_box_style.py."""
|
||||
body = request.get_json(silent=True) or {}
|
||||
config = screens.set_scene_object_quiz_config(slug, object_id, body.get("config"))
|
||||
if config is None:
|
||||
return jsonify({"error": "objet introuvable"}), 404
|
||||
# Un modèle change la STRUCTURE du balisage, pas juste une classe CSS
|
||||
# (voir screens/rendering/quiz_box_templates.py) — renvoyer le HTML
|
||||
# déjà rendu permet à scene-editor.js de remplacer l'aperçu en un
|
||||
# coup, plutôt que de deviner quelle balise ajouter/retirer côté
|
||||
# client.
|
||||
obj = screens.get_scene_object(slug, object_id)
|
||||
return jsonify({"config": config, "rendered_html": screens.render_scene_object(obj)})
|
||||
Reference in New Issue
Block a user