Ajoute la fonctionnalite quiz autonome/plein ecran a la boite a quiz
Build and deploy / test-python (push) Successful in 12m10s
Build and deploy / test-js (push) Successful in 1m27s
Build and deploy / build-and-push (push) Skipped
Build and deploy / deploy (push) Skipped

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:
william
2026-09-13 15:07:23 +02:00
co-authored by Claude Sonnet 5
parent 559331f9cf
commit 7db4803b93
26 changed files with 3173 additions and 60 deletions
+1
View File
@@ -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,
)
+26
View File
@@ -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,
+23
View File
@@ -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)})