From b07b231a611d90e9600f21c86eea27cce4917579 Mon Sep 17 00:00:00 2001 From: william Date: Wed, 9 Sep 2026 19:40:31 +0200 Subject: [PATCH 1/5] =?UTF-8?q?Ajoute=20l'assistant=20IA=20"Ruby"=20(Claud?= =?UTF-8?q?e=20+=20Scenario)=20et=20corrige=20plusieurs=20bugs=20de=20la?= =?UTF-8?q?=20sc=C3=A8ne?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Intègre un chat IA capable de manipuler la scène via les mêmes fonctions que l'éditeur manuel (objets, variables, déclencheurs, images générées), avec conversations multiples par écran façon Claude. Corrige au passage le rafraîchissement pjax hors-ordre, l'onglet IA/déclencheurs vide après sélection d'un objet, la comparaison de booléens dans les conditions, et le blocage du glisser-déposer hors du cadre caméra après un redimensionnement de fond par l'IA. Co-Authored-By: Claude Sonnet 5 --- .env.example | 30 +- .gitignore | 11 + ai/__init__.py | 15 + ai/chat.py | 229 +++++++++++ ai/client.py | 23 ++ ai/scenario_client.py | 68 ++++ ai/tools.py | 416 ++++++++++++++++++++ auth/__init__.py | 9 + auth/create_user_asset.py | 20 + auth/delete_user_asset.py | 27 ++ auth/ensure_user_assets_schema.py | 23 ++ auth/get_user_asset.py | 17 + auth/list_user_assets.py | 17 + auth/save_user_asset.py | 20 + auth/user_assets_dir.py | 10 + core/flask_app.py | 12 + db/constants.py | 9 + requirements.txt | 8 + routes/__init__.py | 2 +- routes/assets/__init__.py | 1 + routes/assets/serve_user_asset.py | 15 + routes/assets/upload_user_asset.py | 27 ++ routes/global_vars/create_global_var.py | 15 +- routes/global_vars/global_var_delete.py | 7 +- routes/global_vars/global_var_edit.py | 8 +- routes/ia/__init__.py | 1 + routes/ia/ia_chat.py | 85 ++++ routes/scenes/scene_edit_view.py | 6 + routes/scenes/scene_object_add.py | 16 +- routes/triggers/triggers.py | 10 +- screens/__init__.py | 9 + screens/ia/add_ia_chat_message.py | 33 ++ screens/ia/create_ia_conversation.py | 16 + screens/ia/delete_ia_conversation.py | 13 + screens/ia/ensure_ia_chat_schema.py | 38 ++ screens/ia/get_ia_conversation.py | 16 + screens/ia/list_ia_chat_messages.py | 16 + screens/ia/list_ia_conversations.py | 16 + screens/scenes/add_scene_object.py | 13 +- screens/scenes/append_action_to_trigger.py | 25 ++ static/branding/ruby-logo.svg | 14 + static/js/ia/ia-chat.js | 334 ++++++++++++++++ static/js/play/__tests__/conditions.test.js | 17 + static/js/play/conditions.js | 33 +- static/js/scenes/global-variables.js | 67 ++++ static/js/scenes/scene-editor.js | 20 +- static/js/screen_edit/tree-panels.js | 7 + static/pjax.js | 15 + static/style.css | 105 +++++ templates/_global_variable_row.html | 22 ++ templates/scene_edit.html | 76 ++-- tests/conftest.py | 15 + tests/test_ai_chat.py | 160 ++++++++ tests/test_ai_client.py | 19 + tests/test_ai_scenario_client.py | 74 ++++ tests/test_ai_tools.py | 315 +++++++++++++++ tests/test_collision_rules.py | 18 + tests/test_dotenv_loading.py | 34 ++ tests/test_global_variables_tab.py | 47 +++ tests/test_ia_chat.py | 121 ++++++ tests/test_scene_object_add_asset.py | 45 +++ tests/test_user_assets.py | 80 ++++ 62 files changed, 2928 insertions(+), 62 deletions(-) create mode 100644 ai/__init__.py create mode 100644 ai/chat.py create mode 100644 ai/client.py create mode 100644 ai/scenario_client.py create mode 100644 ai/tools.py create mode 100644 auth/create_user_asset.py create mode 100644 auth/delete_user_asset.py create mode 100644 auth/ensure_user_assets_schema.py create mode 100644 auth/get_user_asset.py create mode 100644 auth/list_user_assets.py create mode 100644 auth/save_user_asset.py create mode 100644 auth/user_assets_dir.py create mode 100644 routes/assets/__init__.py create mode 100644 routes/assets/serve_user_asset.py create mode 100644 routes/assets/upload_user_asset.py create mode 100644 routes/ia/__init__.py create mode 100644 routes/ia/ia_chat.py create mode 100644 screens/ia/add_ia_chat_message.py create mode 100644 screens/ia/create_ia_conversation.py create mode 100644 screens/ia/delete_ia_conversation.py create mode 100644 screens/ia/ensure_ia_chat_schema.py create mode 100644 screens/ia/get_ia_conversation.py create mode 100644 screens/ia/list_ia_chat_messages.py create mode 100644 screens/ia/list_ia_conversations.py create mode 100644 screens/scenes/append_action_to_trigger.py create mode 100644 static/branding/ruby-logo.svg create mode 100644 static/js/ia/ia-chat.js create mode 100644 static/js/scenes/global-variables.js create mode 100644 templates/_global_variable_row.html create mode 100644 tests/test_ai_chat.py create mode 100644 tests/test_ai_client.py create mode 100644 tests/test_ai_scenario_client.py create mode 100644 tests/test_ai_tools.py create mode 100644 tests/test_dotenv_loading.py create mode 100644 tests/test_ia_chat.py create mode 100644 tests/test_scene_object_add_asset.py create mode 100644 tests/test_user_assets.py diff --git a/.env.example b/.env.example index 398b04c1..6579f415 100644 --- a/.env.example +++ b/.env.example @@ -1,7 +1,13 @@ -# Ce fichier ne configure PAS l'application (elle ne lit aucune variable -# d'environnement) — il configure uniquement docker-compose.prod.yml sur le -# serveur de production. Copier en ".env" à côté de docker-compose.prod.yml -# sur le serveur et adapter les valeurs ; ne jamais committer ce ".env". +# Deux usages distincts pour ce fichier, jamais mélangés : +# - En LOCAL (poste de dev) : copier en ".env" à la racine du dépôt et +# renseigner les clés IA ci-dessous — core/flask_app.py les charge lui- +# même (python-dotenv), rien d'autre à faire. Jamais committer ce ".env" +# (déjà dans .gitignore). +# - En PRODUCTION : ce fichier configure docker-compose.prod.yml (image, +# port) — copier en ".env" à côté de docker-compose.prod.yml sur le +# serveur. L'app elle-même n'y lit AUCUN fichier .env en production +# (aucun n'y est déployé) : les variables y sont posées directement sur +# l'hôte/le conteneur, docker-compose.prod.yml les lui transmettant. # Adresse complète de l'image dans le registre Gitea, ex : # gitea.exemple.com/mon-compte/forge-engine @@ -23,3 +29,19 @@ SMTP_PORT=587 SMTP_USER= SMTP_PASSWORD= SMTP_FROM= + +# Onglet "IA" (voir ai/client.py) — clé du compte Anthropic Console +# (console.anthropic.com), PAS l'abonnement claude.ai Entreprise (deux +# systèmes de facturation séparés). Laisser vide désactive le chat IA +# (message d'erreur clair affiché au créateur, jamais une 500). +ANTHROPIC_API_KEY= + +# Génération d'images (voir ai/scenario_client.py) — compte Scenario +# (scenario.com), clé + secret (authentification Basic), et l'id du +# modèle entraîné sur le style graphique unique de Forge Engine (voir +# l'étude préalable : un seul style pour tout le moteur, pas par projet). +# Laisser vide désactive juste la génération d'images (le reste du chat +# IA continue de fonctionner). +SCENARIO_API_KEY= +SCENARIO_API_SECRET= +SCENARIO_MODEL_ID= diff --git a/.gitignore b/.gitignore index 9d4d5502..b8d44de5 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,10 @@ regles/ # Jeux créés par les utilisateurs (données runtime, pas du code) projects/ +# "Mes assets" — images par compte (données runtime, voir +# auth/user_assets_dir.py, db/constants.py::USER_ASSETS_DIR) +user_assets/ + # Comptes utilisateurs (base SQLite + clé de session) — données runtime, # jamais du code, et sensibles (mots de passe hachés, secrets 2FA). data/ @@ -38,6 +42,13 @@ Thumbs.db .vscode/ .idea/ +# Journaux de diagnostic ad-hoc (redirection stdout/stderr d'un serveur +# de dev lancé pour déboguer) — jamais du code. +_srv_out.txt +_srv_err.txt +_diag_out.txt +_diag_err.txt + # Documents internes/business (cadrage produit...) et état local de # session Claude Code — jamais du code, pas destiné à l'historique partagé. .claude/ diff --git a/ai/__init__.py b/ai/__init__.py new file mode 100644 index 00000000..d6541c65 --- /dev/null +++ b/ai/__init__.py @@ -0,0 +1,15 @@ +"""Couche IA (voir plan Phase 1) — infra transverse, distincte de +screens/ (rendu/données de jeu) : ai.tools définit les outils exposés à +l'agent (Phase 2) sans dépendre du SDK anthropic lui-même, pour rester +testable sans clé API.""" + +from .tools import TOOLS, dispatch_tool +from .client import get_client, AnthropicNotConfiguredError, MODEL +from .scenario_client import generate_image_url, ScenarioNotConfiguredError, ScenarioGenerationError +from .chat import run_chat_turn + +__all__ = [ + "TOOLS", "dispatch_tool", "get_client", "AnthropicNotConfiguredError", "MODEL", + "generate_image_url", "ScenarioNotConfiguredError", "ScenarioGenerationError", + "run_chat_turn", +] diff --git a/ai/chat.py b/ai/chat.py new file mode 100644 index 00000000..2879d1fc --- /dev/null +++ b/ai/chat.py @@ -0,0 +1,229 @@ +"""Boucle tool-use (voir plan Phase 2, §5) — Claude Sonnet 5 pilote +UNIQUEMENT les tools de ai/tools.py, jamais d'écriture directe en base : +tout ce qu'un tour de chat produit est donc TOUJOURS relisable/ +modifiable dans l'éditeur normal (même garantie que la Phase 1).""" +import json + +import db +import screens + +from .client import get_client, MODEL +from .tools import TOOLS, dispatch_tool + +# Borne dure : jamais une boucle sans fin qui dépenserait sans fin si +# Claude s'entête à rappeler des outils (bug de prompt, tool qui échoue +# en boucle, etc.) — un écran complet (fond, personnages, widgets, +# déclencheur, ajustements) peut légitimement dépasser 8 appels. +_MAX_TOOL_ITERATIONS = 12 + +_SYSTEM_PROMPT = ( + "Tu t'appelles Ruby, l'assistante IA de Forge Engine — présente-toi " + "sous ce nom si on te le demande. " + "Tu aides un créateur à construire UN SEUL écran d'un jeu de " + "formation professionnelle 2D (Forge Engine), via les outils fournis " + "— jamais autrement. Ne touche qu'à cet écran, jamais aux autres. " + "Réutilise une variable globale déjà existante UNIQUEMENT si elle " + "représente EXACTEMENT la même information (ex. un score total " + "partagé par tout le jeu) — les variables sont globales à TOUT le " + "jeu, visibles depuis n'importe quel écran, donc un drapeau \"terminé\" " + "propre à UN dialogue/quiz précis ne doit JAMAIS être partagé avec un " + "autre dialogue/quiz, même similaire, même sur un autre écran (bug " + "corrigé : un quiz réutilisait par erreur le drapeau \"terminé\" d'un " + "AUTRE quiz sans lien, les rendant mutuellement incohérents). Donne à " + "chaque nouveau drapeau un nom qui identifie clairement CE qu'il " + "suit (ex. préfixé par le nom du personnage/objet concerné). " + "N'utilise add_generated_image " + "QUE pour des fonds ou des objets 2D isolés (meubles, plantes, décor) " + "— jamais pour un personnage ou un sprite animé, la génération " + "d'image n'est pas fiable pour ça. " + "\n\n" + "CE QUE TU NE PEUX PAS FAIRE : tes outils ne pilotent QUE la logique " + "\"déclencheur de collision\" d'un objet de scène (dialogue, " + "variable, interagir, condition). Forge Engine a un AUTRE système, " + "séparé, de \"flow\" (nœuds/liaisons) pour changer d'écran, les " + "minuteurs, jouer un son, une animation de sprite — tu n'as AUCUN " + "outil pour ça. Si une demande a besoin de cette partie-là (\"passer " + "à l'écran suivant\", \"jouer un son\", \"après 5 secondes\"...), fais " + "quand même tout ce que tes outils permettent, puis DIS CLAIREMENT " + "dans ta réponse texte ce que tu n'as pas pu faire et pourquoi " + "(cette partie doit être ajoutée à la main dans l'onglet \"Flow\") — " + "ne t'acharne JAMAIS à répéter des appels d'outils pour une chose " + "qu'aucun outil ne permet, ça n'aboutira jamais." + "\n\n" + "ÉTAT DE LA SCÈNE : le message système de chaque tour te donne les " + "dimensions de la caméra, la liste des objets déjà posés sur CET " + "écran, et les variables globales déjà existantes — relis-les avant " + "d'agir plutôt que de deviner (ne recrée jamais un objet ou une " + "variable qui existe déjà, corrige/complète l'existant avec " + "set_object_geometry/set_object_name/set_object_role/set_collision_rules)." + "\n\n" + "CAMÉRA ET POSITIONNEMENT : les dimensions indiquées sont la zone " + "VISIBLE (coin haut-gauche à (0,0)) — place tout objet important " + "(personnages, widgets d'interface) DANS cette zone par défaut. Le " + "moteur RAMÈNE automatiquement dans le cadre toute position qui en " + "sortirait (voir un éventuel champ \"note\" dans le résultat de " + "set_object_geometry/add_scene_object — c'est déjà corrigé, rien à " + "refaire), donc vise une position raisonnable sans stresser sur le " + "pixel exact. Ne superpose jamais deux objets aux mêmes coordonnées " + "— espace-les clairement. Un personnage fraîchement posé fait " + "128x128 px par défaut — garde des tailles cohérentes entre " + "personnages sauf besoin explicite. RÈGLE FIXE pour un \"fond\" : " + "redimensionne-le TOUJOURS automatiquement en 2000x1000 px " + "(set_object_geometry, position (0,0)) juste après l'avoir posé, " + "SANS que le créateur ait besoin de le demander à chaque fois — " + "c'est le format standard de Forge Engine. Ne dépasse cette taille " + "que si le créateur demande explicitement un monde à explorer plus " + "grand." + "\n\n" + "JOUEUR ET PNJ : un personnage fraîchement posé a TOUJOURS le rôle " + "\"pnj\" par défaut, JAMAIS \"joueur\". Un déclencheur de type " + "\"collision\" ne se déclenche QUE par le contact du personnage au " + "rôle \"joueur\" — sans lui, la collision ne se déclenche jamais ET " + "la caméra n'a personne à suivre. Dès qu'un écran a besoin d'un " + "déclencheur de collision (quiz, dialogue déclenché en marchant " + "vers un PNJ, etc.), assure-toi qu'IL EXISTE EXACTEMENT UN " + "personnage avec role=\"joueur\" (set_object_role) — jamais deux, " + "et ne pose jamais deux PNJ identiques sans que le créateur l'ait " + "demandé." + "\n\n" + "QUAND UTILISER QUOI : une VARIABLE globale sert à mémoriser une " + "donnée consultée plus tard (progression, un choix du joueur, un " + "drapeau \"terminé\") — JAMAIS pour un score de quiz (voir " + "reward_amount plus haut, déjà automatique). Modifie une variable " + "(action \"variable\") quand un événement doit changer durablement " + "cet état (ex. marquer un drapeau \"xxx_termine\" à vrai une fois un " + "quiz fini). Utilise une CONDITION quand le comportement doit " + "VRAIMENT différer selon l'état actuel d'une variable — un simple " + "enchaînement linéaire n'a besoin que d'un chaînage \"then\", jamais " + "d'une condition. CAS CANONIQUE à connaître : un dialogue/quiz à " + "USAGE UNIQUE (ex. un PNJ qui pose un quiz une seule fois) doit être " + "protégé par une CONDITION qui vérifie D'ABORD le drapeau " + "\"xxx_termine\" — si faux (pas encore fait), lance le dialogue/quiz " + "normal (branche si_faux) PUIS termine par une action \"variable\" " + "qui passe ce drapeau à vrai ; si vrai (déjà fait), réponds par une " + "réplique courte différente (branche si_vrai) au lieu de rejouer " + "tout le quiz à chaque collision. Utilise un DIALOGUE pour toute " + "réplique ou question posée au joueur." + "\n\n" + "IMPORTANT — UN DIALOGUE/QUIZ/SCORE NE S'AFFICHE JAMAIS TOUT SEUL EN " + "JEU : il faut TOUJOURS poser en plus le widget d'interface " + "correspondant sur l'écran via add_scene_object, sinon rien n'apparaît " + "à l'écran même si le déclencheur est correctement configuré. Une " + "action \"dialogue\" dont les lignes sont de type \"replique\" a besoin " + "d'un objet kind=\"dialogue_box\" ; une action \"dialogue\" dont les " + "lignes sont de type \"question\" (quiz) a besoin d'un objet " + "kind=\"quiz_box\" (pas dialogue_box) ; si un score/des points sont " + "utilisés, ajoute aussi un objet kind=\"score_widget\" pour qu'il soit " + "visible en continu. Positionne ces widgets à un endroit raisonnable " + "de l'écran (ex. centré, ou en haut) via set_object_geometry après " + "les avoir posés." + "\n\n" + "Ton professionnel, adapté à une formation d'entreprise. Réponds " + "toujours en français, de façon concise, en confirmant ce que tu as " + "posé." +) + + +def _describe_scene_state(slug, screen_id): + """Contexte dynamique (jamais mémorisé côté Claude entre les tours, + voir run_chat_turn — seul le texte final est persisté) : sans ça, + Ruby ne "voit" jamais ce qui existe déjà sur l'écran et duplique des + objets au lieu de les corriger (bug observé : 2 PNJ identiques créés + à la place d'un seul joueur + un pnj).""" + screen = screens.get_screen(slug, screen_id) + width, height = screen["scene_width"], screen["scene_height"] + objects = screens.list_scene_objects(slug, screen_id) + # Répété ICI (pas seulement dans les instructions générales) avec les + # VRAIS chiffres de cet écran — un rappel abstrait une seule fois dans + # un long system prompt s'est montré insuffisant (bug observé deux + # fois : personnage posé à des coordonnées bien au-delà de la caméra). + lines = [ + f"Zone visible par la caméra CETTE ÉCRAN : x de 0 à {width}, y de 0 à {height} " + f"(coin haut-gauche à (0,0)). RAPPEL : place tout personnage/widget d'interface " + f"À L'INTÉRIEUR de ces bornes par défaut (ex. x autour de {width // 2}, " + f"y autour de {height // 2} pour un centrage simple), sauf demande explicite d'un " + "monde plus grand à explorer." + ] + if not objects: + lines.append("Aucun objet posé sur cet écran pour l'instant.") + else: + lines.append(f"{len(objects)} objet(s) déjà posé(s) sur cet écran :") + for o in objects: + desc = ( + f"- id={o['id']} kind={o['kind']} position=({int(o['x'])},{int(o['y'])}) " + f"taille={int(o['width'])}x{int(o['height'])}" + ) + if o.get("name"): + desc += f" nom={o['name']!r}" + if o["kind"] == "personnage": + desc += f" rôle={screens.resolve_personnage_role(o)}" + if (o.get("attributes") or {}).get("_collision_rules"): + desc += " [déclencheur déjà configuré]" + lines.append(desc) + + variables = db.list_global_variables(slug) + if variables: + lines.append("Variables globales déjà existantes dans ce jeu (jamais en recréer une du même nom) :") + for v in variables: + lines.append(f"- {v['name']} ({v['type']}, valeur actuelle : {v['value']})") + else: + lines.append("Aucune variable globale n'existe encore dans ce jeu.") + return "\n".join(lines) + + +def _history_to_messages(history): + return [{"role": m["role"], "content": m["content"]} for m in history] + + +def run_chat_turn(slug, screen_id, conversation_id, user_id, user_message): + """Un tour complet : reprend l'historique persisté de CETTE + conversation, ajoute le message du créateur, boucle tant que Claude + appelle des outils, et renvoie le texte final. `screen_id` reste + nécessaire pour les tools (voir ai/tools.py — chaque conversation + reste scopée à SON écran, une conversation ne change jamais + d'écran). Ne persiste RIEN elle-même — voir routes/ia/ia_chat.py, + seul appelant, qui décide de ce qui est sauvegardé (même séparation + que le reste du moteur : cette fonction ne fait que la logique IA).""" + client = get_client() # AnthropicNotConfiguredError si pas de clé + messages = _history_to_messages(screens.list_ia_chat_messages(slug, conversation_id)) + messages.append({"role": "user", "content": user_message}) + # État réel de la scène RE-LU à chaque tour (jamais mémorisé par + # Claude lui-même) — voir _describe_scene_state. + system_prompt = _SYSTEM_PROMPT + "\n\n" + _describe_scene_state(slug, screen_id) + + response = None + for _ in range(_MAX_TOOL_ITERATIONS): + response = client.messages.create( + # 4096 était trop bas (bug corrigé) : la réflexion adaptative + # partage le même budget que la réponse — sur une demande + # riche (plusieurs objets + logique + texte), Claude pouvait + # être coupé EN PLEINE RÉFLEXION, avant le moindre appel + # d'outil (symptôme observé : aucune progression du tout, + # "(pas de réponse textuelle)" dès le premier tour). + model=MODEL, max_tokens=16000, system=system_prompt, + tools=TOOLS, thinking={"type": "adaptive"}, messages=messages, + ) + messages.append({"role": "assistant", "content": response.content}) + if response.stop_reason != "tool_use": + break + tool_results = [] + for block in response.content: + if block.type == "tool_use": + try: + result = dispatch_tool(slug, screen_id, user_id, block.name, block.input) + except Exception as e: + result = {"error": str(e)} + tool_results.append({ + "type": "tool_result", "tool_use_id": block.id, "content": json.dumps(result), + }) + messages.append({"role": "user", "content": tool_results}) + + text = next((b.text for b in response.content if b.type == "text"), "") + if text: + return text + if response.stop_reason == "max_tokens": + return ( + "Ruby a été interrompue avant de terminer (demande trop complexe pour une seule " + "réponse) — réessaie en la découpant en plusieurs étapes plus simples." + ) + return "(pas de réponse textuelle)" diff --git a/ai/client.py b/ai/client.py new file mode 100644 index 00000000..16df7252 --- /dev/null +++ b/ai/client.py @@ -0,0 +1,23 @@ +"""Client Claude (voir plan Phase 2, §2) — même politique que +auth/send_email.py::EmailNotConfiguredError : une clé absente est une +configuration incomplète, jamais un crash brut ni une clé en dur.""" +import os + +import anthropic + +MODEL = "claude-sonnet-5" + + +class AnthropicNotConfiguredError(Exception): + """Levée quand ANTHROPIC_API_KEY est absente — voir .env.example. + Le compte claude.ai Entreprise (chat en équipe) n'est PAS une clé API : + il faut un compte Anthropic Console (console.anthropic.com) séparé.""" + + +def get_client(): + api_key = os.environ.get("ANTHROPIC_API_KEY") + if not api_key: + raise AnthropicNotConfiguredError( + "ANTHROPIC_API_KEY absente" + ) + return anthropic.Anthropic(api_key=api_key) diff --git a/ai/scenario_client.py b/ai/scenario_client.py new file mode 100644 index 00000000..17d905ac --- /dev/null +++ b/ai/scenario_client.py @@ -0,0 +1,68 @@ +"""Client Scenario (voir plan Phase 2, §3) — génération d'images (fonds/ +objets 2D uniquement, jamais de personnages/sprites — décision actée +lors de l'étude préalable). API confirmée (docs.scenario.com) : +authentification Basic (clé + secret), génération ASYNCHRONE par job — +POST déclenche un job, GET /jobs/{id} jusqu'à "success"/"failure", puis +GET /assets/{id} pour l'URL finale téléchargeable. + +Ce module reste un simple client HTTP : il renvoie l'URL de l'image, +jamais ne la télécharge/l'enregistre lui-même — ça reste le travail de +ai/tools.py::_dispatch_add_generated_image (voir "Mes assets", +auth/user_assets_dir.py), pour que ce module soit testable seul.""" +import os +import time + +import requests + +_BASE_URL = "https://api.cloud.scenario.com/v1" + + +class ScenarioNotConfiguredError(Exception): + """SCENARIO_API_KEY/SCENARIO_API_SECRET/SCENARIO_MODEL_ID absents — + voir .env.example. SCENARIO_MODEL_ID est l'id du modèle entraîné sur + le style graphique unique de Forge Engine (pas encore créé tant que + l'entraînement Scenario n'a pas été fait).""" + + +class ScenarioGenerationError(Exception): + """Le job Scenario a échoué ou n'a pas répondu à temps.""" + + +def _credentials(): + api_key = os.environ.get("SCENARIO_API_KEY") + api_secret = os.environ.get("SCENARIO_API_SECRET") + model_id = os.environ.get("SCENARIO_MODEL_ID") + if not api_key or not api_secret or not model_id: + raise ScenarioNotConfiguredError( + "SCENARIO_API_KEY/SCENARIO_API_SECRET/SCENARIO_MODEL_ID absents — voir .env.example." + ) + return (api_key, api_secret), model_id + + +def generate_image_url(prompt, width=768, height=768, timeout=120, poll_interval=2): + """Lance une génération txt2img et attend le résultat — renvoie + l'URL finale de l'image (hébergée par Scenario, à télécharger par + l'appelant). Bloquant (poll_interval secondes entre chaque + vérification), borné par `timeout` secondes au total.""" + auth, model_id = _credentials() + response = requests.post( + f"{_BASE_URL}/generate/txt2img", auth=auth, timeout=30, + json={"prompt": prompt, "modelId": model_id, "width": width, "height": height, "numSamples": 1}, + ) + response.raise_for_status() + job_id = response.json()["job"]["jobId"] + + deadline = time.monotonic() + timeout + while time.monotonic() < deadline: + status_response = requests.get(f"{_BASE_URL}/jobs/{job_id}", auth=auth, timeout=30) + status_response.raise_for_status() + job = status_response.json()["job"] + if job["status"] == "success": + asset_id = job["metadata"]["assetIds"][0] + asset_response = requests.get(f"{_BASE_URL}/assets/{asset_id}", auth=auth, timeout=30) + asset_response.raise_for_status() + return asset_response.json()["asset"]["url"] + if job["status"] == "failure": + raise ScenarioGenerationError("Scenario a échoué à générer l'image.") + time.sleep(poll_interval) + raise ScenarioGenerationError("Scenario n'a pas répondu à temps.") diff --git a/ai/tools.py b/ai/tools.py new file mode 100644 index 00000000..407ffaa3 --- /dev/null +++ b/ai/tools.py @@ -0,0 +1,416 @@ +"""Outils exposés à l'agent IA (voir plan Phase 1, §4) — chaque tool +appelle DIRECTEMENT une fonction déjà utilisée par l'éditeur no-code +manuel, jamais une structure parallèle : ce qu'un créateur voit ensuite +dans l'éditeur (Déclencheurs, Variables, panneau de propriétés) est donc +TOUJOURS le résultat du même code, qu'il ait été posé à la main ou par +l'IA. + +Aucune dépendance au SDK anthropic ici (voir ai/__init__.py) — ce module +ne fait que décrire les schémas et les relier à screens.*/db.* ; la +boucle tool-use elle-même (Phase 2) l'utilisera tel quel. + +Principe validé avec l'utilisateur : un NOUVEL outil reste une décision +explicite (jamais de réflexion automatique sur tout screens/), mais une +VALEUR interne à un outil existant (un type d'action, un opérateur de +condition, une opération de variable) doit suivre automatiquement dès +qu'elle est ajoutée côté moteur — d'où les schémas ci-dessous construits +à partir des constantes existantes (ACTION_TYPES, CONDITION_OPERATORS, +DATA_OPERATION_LABELS, ...) plutôt que recopiées en dur. Un test dédié +(tests/test_ai_tools.py) vérifie que cette référence n'est jamais +remplacée par une copie littérale.""" + +import os + +import requests +from flask import url_for + +import auth +import db +import screens +from db.dialogue_lines import QUESTION_REWARD_TYPES +from screens.rendering.collision_rules import ACTION_TYPES, LEAF_ACTION_TYPES, CONDITION_OPERATOR_KEYS +from screens.labels.data_operations import DATA_OPERATION_LABELS +from .scenario_client import generate_image_url + +_CONDITION_OPERATORS = sorted(CONDITION_OPERATOR_KEYS) +_DATA_OPERATIONS = sorted(DATA_OPERATION_LABELS) +_PERSONNAGE_ROLES = list(screens.PERSONNAGE_ROLES) +_COLLISION_SHAPES = list(screens.COLLISION_SHAPES) +_GLOBAL_VARIABLE_TYPES = sorted(db.GLOBAL_VARIABLE_TYPES) +# Catalogue COMPLET (public + admin-only, voir core/sprite_gate.py) — +# Claude doit connaître les slugs valides pour ne jamais en deviner un +# qui retomberait silencieusement sur le personnage par défaut +# (screens.add_scene_object). L'accès aux entrées admin-only reste +# vérifié à l'exécution (voir _dispatch_add_scene_object), même garde +# que la galerie manuelle. +_FORGE_CHARACTERS = sorted(screens.SPRITE_LIBRARY) +_BACKGROUNDS = sorted(screens.BACKGROUND_LIBRARY) + +_LEAF_ACTION_SCHEMA = { + "type": "object", + "description": ( + "Une action FEUILLE (\"dialogue\" ou \"variable\", voir " + "screens/rendering/collision_rules.py) — peut porter un champ " + "optionnel \"then\" (une autre feuille, chaînage borné à 4)." + ), + "properties": { + "type": {"type": "string", "enum": list(LEAF_ACTION_TYPES)}, + "id": {"type": "string", "description": "Identifiant de cette feuille, pour l'adresser plus tard via append_action_to_trigger."}, + "dialogue": { + "type": "object", + "description": ( + "Pour type=dialogue : {id, lines}. Chaque élément de `lines` est SOIT une " + "RÉPLIQUE {\"type\":\"dialogue\", \"speaker\": , \"text\": }, " + "SOIT une QUESTION DE QUIZ {\"type\":\"question\", \"text\", \"choices\": " + "[2 à 4 réponses], \"correct_index\": , " + f"\"reward_type\": {list(QUESTION_REWARD_TYPES)!r}, \"reward_amount\": }}. " + "reward_amount alimente le SCORE NATIF du jeu (visible via un objet " + "kind=\"score_widget\", nécessite aussi un objet kind=\"quiz_box\" posé pour que " + "la question s'affiche) — crédité UNIQUEMENT si la réponse est correcte, sinon " + "ignoré ; le joueur avance toujours à la ligne suivante, bonne réponse ou pas. " + "N'invente JAMAIS une variable séparée pour suivre un score de quiz : " + "reward_amount fait déjà tout, sans action \"variable\" supplémentaire." + ), + "properties": {"id": {"type": "string"}, "lines": {"type": "array"}}, + }, + "mark_completed": {"type": "boolean"}, + "target_variable": {"type": "string", "description": "Pour type=variable : nom d'une variable globale existante."}, + "data_operation": {"type": "string", "enum": _DATA_OPERATIONS}, + "data_value": {"type": "string", "description": "Absent pour definir_bool_vrai/definir_bool_faux/basculer_bool."}, + "then": {"description": "Feuille suivante (même forme), récursif."}, + }, + "required": ["type"], +} + +_ACTION_SCHEMA = { + "type": "object", + "description": "Une action de déclencheur — voir screens/rendering/collision_rules.py pour la forme exacte de chaque type.", + "properties": { + "type": {"type": "string", "enum": list(ACTION_TYPES)}, + "id": {"type": "string"}, + "dialogue": _LEAF_ACTION_SCHEMA["properties"]["dialogue"], + "mark_completed": {"type": "boolean"}, + "target_variable": {"type": "string"}, + "data_operation": {"type": "string", "enum": _DATA_OPERATIONS}, + "data_value": {"type": "string"}, + "then": {"description": "Feuille suivante (dialogue/variable), récursif."}, + "sub_action": {"description": "Pour type=interagir : une action (pas \"interagir\" à nouveau)."}, + "variable": {"type": "string", "description": "Pour type=condition."}, + "operateur": {"type": "string", "enum": _CONDITION_OPERATORS}, + "valeur": {"type": "string"}, + "si_vrai": {"description": "Pour type=condition : null ou une feuille."}, + "si_faux": {"description": "Pour type=condition : null ou une feuille."}, + }, + "required": ["type"], +} + +TOOLS = [ + { + "name": "add_scene_object", + "description": ( + "Pose un nouvel objet sur l'écran en cours (personnage, décor, fond, " + "ou widget d'interface). Pour une image générée/de \"Mes assets\", " + "utiliser image_url (jamais générer un personnage/sprite par ce biais)." + ), + "input_schema": { + "type": "object", + "properties": { + "kind": {"type": "string", "enum": ["personnage", "decor", "fond", "dialogue_box", "quiz_box", "score_widget"]}, + "forge_character": {"type": "string", "enum": _FORGE_CHARACTERS, "description": "Pour kind=personnage : slug d'un personnage de la bibliothèque Forge existante (jamais un sprite généré)."}, + "background_slug": {"type": "string", "enum": _BACKGROUNDS, "description": "Pour kind=fond : slug d'une image de fond déjà existante dans la bibliothèque Forge."}, + "image_url": {"type": "string", "description": "URL d'une image déjà uploadée/générée (voir \"Mes assets\") — kind decor/fond uniquement, prioritaire sur background_slug."}, + }, + "required": ["kind"], + }, + }, + { + "name": "set_object_geometry", + "description": "Positionne/redimensionne un objet déjà posé sur l'écran, en pixels.", + "input_schema": { + "type": "object", + "properties": { + "object_id": {"type": "integer"}, + "x": {"type": "number"}, "y": {"type": "number"}, + "width": {"type": "number"}, "height": {"type": "number"}, + }, + "required": ["object_id", "x", "y", "width", "height"], + }, + }, + { + "name": "set_object_name", + "description": ( + "Donne un nom à un objet de scène (ex. \"Stan\", \"Aka\") — affiché comme " + "\"qui parle\" dans les dialogues qui lui sont attachés." + ), + "input_schema": { + "type": "object", + "properties": { + "object_id": {"type": "integer"}, + "name": {"type": "string"}, + }, + "required": ["object_id", "name"], + }, + }, + { + "name": "set_object_role", + "description": "Change le rôle d'un objet personnage (joueur / ennemie / pnj).", + "input_schema": { + "type": "object", + "properties": { + "object_id": {"type": "integer"}, + "role": {"type": "string", "enum": _PERSONNAGE_ROLES}, + }, + "required": ["object_id", "role"], + }, + }, + { + "name": "set_object_collision", + "description": "Règle la boîte de collision d'un objet (forme, taille, décalage, activée ou non).", + "input_schema": { + "type": "object", + "properties": { + "object_id": {"type": "integer"}, + "enabled": {"type": "boolean"}, + "shape": {"type": "string", "enum": _COLLISION_SHAPES}, + "width": {"type": "number"}, "height": {"type": "number"}, + "offset_x": {"type": "number"}, "offset_y": {"type": "number"}, + }, + "required": ["object_id"], + }, + }, + { + "name": "create_global_variable", + "description": "Crée une variable globale (idempotent par nom) — utilisable ensuite dans les déclencheurs/conditions.", + "input_schema": { + "type": "object", + "properties": { + "name": {"type": "string"}, + "var_type": {"type": "string", "enum": _GLOBAL_VARIABLE_TYPES}, + "default_value": {"type": "string"}, + "per_player": {"type": "boolean"}, + }, + "required": ["name"], + }, + }, + { + "name": "set_collision_rules", + "description": ( + "Remplace TOUTES les règles \"déclencheur -> action\" d'un objet. " + "Sanitizé côté serveur (screens.sanitize_collision_rules) : toute " + "valeur invalide est silencieusement retirée plutôt que rejetée." + ), + "input_schema": { + "type": "object", + "properties": { + "object_id": {"type": "integer"}, + "rules": { + "type": "array", + "items": { + "type": "object", + "properties": { + "trigger": {"type": "string"}, + "action": _ACTION_SCHEMA, + }, + "required": ["trigger", "action"], + }, + }, + }, + "required": ["object_id", "rules"], + }, + }, + { + "name": "add_generated_image", + "description": ( + "Génère une image (fond ou objet 2D UNIQUEMENT, JAMAIS un " + "personnage/sprite — la génération d'image n'est pas fiable pour " + "ça) via Scenario, l'ajoute à \"Mes assets\" et la pose " + "automatiquement sur l'écran en cours." + ), + "input_schema": { + "type": "object", + "properties": { + "kind": {"type": "string", "enum": ["decor", "fond"]}, + "prompt": {"type": "string", "description": "Description de l'image en langage naturel."}, + }, + "required": ["kind", "prompt"], + }, + }, + { + "name": "append_action_to_trigger", + "description": ( + "Ajoute une action à la SUITE d'une chaîne déjà posée sur un " + "déclencheur existant, sans reconstruire toute la règle — " + "after_id désigne la dernière feuille de la chaîne." + ), + "input_schema": { + "type": "object", + "properties": { + "object_id": {"type": "integer"}, + "after_id": {"type": "string"}, + "action": _LEAF_ACTION_SCHEMA, + }, + "required": ["object_id", "after_id", "action"], + }, + }, +] + + +def _clamp_to_camera(slug, screen_id, kind, x, y, width, height): + """Le placement précis par coordonnées s'est montré peu fiable pour + l'IA malgré des instructions explicites ET un avertissement dans le + résultat de l'outil (bug observé à répétition — l'IA n'arrivait + toujours pas à replacer l'objet correctement, épuisant même parfois + tout le budget d'itérations sans jamais y arriver). Plutôt que de + compter sur elle pour se corriger, le moteur RAMÈNE automatiquement + tout objet (hors "fond", volontairement plus grand que la caméra — + voir screens.resolve_scene_world_size) à l'intérieur du cadre visible + dès cet appel : garantit un résultat correct du premier coup, sans + aller-retour. Renvoie (x, y, note) — note est None si aucun + ajustement n'était nécessaire.""" + if kind == "fond": + return x, y, None + screen = screens.get_screen(slug, screen_id) + if not screen: + return x, y, None + scene_width, scene_height = screen["scene_width"], screen["scene_height"] + clamped_x = min(max(x, 0), max(0, scene_width - width)) + clamped_y = min(max(y, 0), max(0, scene_height - height)) + if (clamped_x, clamped_y) == (x, y): + return x, y, None + note = ( + f"Position ajustée automatiquement de ({int(x)},{int(y)}) à " + f"({int(clamped_x)},{int(clamped_y)}) pour rester dans le cadre visible par la " + f"caméra (0,0)-({scene_width},{scene_height})." + ) + return clamped_x, clamped_y, note + + +def _dispatch_add_scene_object(slug, screen_id, user_id, kind, forge_character=None, background_slug=None, image_url=None): + # Même garde que la galerie manuelle (core/sprite_gate.py) — un + # compte non-admin ne doit pas pouvoir poser un sprite/fond + # admin-only via l'IA alors que la galerie de l'éditeur ne les lui + # propose déjà pas. + user = auth.get_user_by_id(user_id) + is_admin = bool(user and user["role"] == "admin") + if forge_character in screens.ADMIN_ONLY_CHARACTER_SLUGS and not is_admin: + forge_character = None + if background_slug in screens.ADMIN_ONLY_BACKGROUND_SLUGS and not is_admin: + background_slug = None + # screens.add_scene_object ignore SILENCIEUSEMENT un slug invalide + # (comportement voulu pour l'éditeur manuel, où un select HTML ne + # peut de toute façon proposer qu'un slug valide) — mais Claude, lui, + # peut inventer/mal orthographier une valeur malgré l'enum du schéma + # (pas de strict:true ici, voir ai/chat.py). Sans ce contrôle, + # l'outil "réussissait" en silence et Ruby annonçait un fond/ + # personnage posé qui n'apparaissait jamais (bug corrigé). Lever une + # erreur ici la remonte comme résultat d'outil (voir ai/chat.py) : + # Claude la VOIT et peut se corriger dans le même tour. + if forge_character and forge_character not in screens.SPRITE_LIBRARY: + raise ValueError(f"forge_character inconnu : {forge_character!r} (voir la liste enum du tool)") + if background_slug and background_slug not in screens.BACKGROUND_LIBRARY: + raise ValueError(f"background_slug inconnu : {background_slug!r} (voir la liste enum du tool)") + object_id = screens.add_scene_object( + slug, screen_id, kind=kind, forge_character=forge_character, + background_slug=background_slug, image_url=image_url, + ) + obj = screens.get_scene_object(slug, object_id) + # Position par défaut (100,100, voir ensure_scene_schema.py) déjà + # posée par screens.add_scene_object — reste passée par le même + # garde-fou pour rester correcte même si ce défaut changeait un jour. + clamped_x, clamped_y, note = _clamp_to_camera(slug, screen_id, kind, obj["x"], obj["y"], obj["width"], obj["height"]) + if note: + screens.update_scene_object_geometry(slug, object_id, clamped_x, clamped_y, obj["width"], obj["height"]) + result = {"object_id": object_id} + if note: + result["note"] = note + return result + + +def _dispatch_set_object_geometry(slug, screen_id, user_id, object_id, x, y, width, height): + obj = screens.get_scene_object(slug, object_id) + x, y, note = _clamp_to_camera(slug, screen_id, obj["kind"] if obj else None, x, y, width, height) + screens.update_scene_object_geometry(slug, object_id, x, y, width, height) + result = {"ok": True} + if note: + result["note"] = note + return result + + +def _dispatch_set_object_name(slug, screen_id, user_id, object_id, name): + screens.set_scene_object_name(slug, object_id, name) + return {"ok": True} + + +def _dispatch_set_object_role(slug, screen_id, user_id, object_id, role): + screens.set_scene_object_role(slug, object_id, role) + return {"ok": True} + + +def _dispatch_set_object_collision(slug, screen_id, user_id, object_id, enabled=True, shape="rectangle", + width=None, height=None, offset_x=0, offset_y=0): + # Même forme que routes/scenes/scene_object_collision.py (remplacement + # complet des réglages, jamais un merge partiel). + settings = { + "enabled": bool(enabled), + "shape": shape if shape in _COLLISION_SHAPES else "rectangle", + "width": width, "height": height, + "offset_x": offset_x or 0, "offset_y": offset_y or 0, + } + screens.set_scene_object_collision(slug, object_id, settings) + return {"ok": True} + + +def _dispatch_create_global_variable(slug, screen_id, user_id, name, var_type="texte", default_value="", per_player=True): + variable_id = db.create_global_variable(slug, name, var_type=var_type, default_value=default_value, per_player=per_player) + return {"variable_id": variable_id} + + +def _dispatch_set_collision_rules(slug, screen_id, user_id, object_id, rules): + sanitized = screens.sanitize_collision_rules(rules) + screens.set_scene_object_collision_rules(slug, object_id, sanitized) + return {"ok": True, "rules": sanitized} + + +def _dispatch_append_action_to_trigger(slug, screen_id, user_id, object_id, after_id, action): + ok = screens.append_action_to_trigger(slug, object_id, after_id, action) + return {"ok": ok} + + +def _dispatch_add_generated_image(slug, screen_id, user_id, kind, prompt): + """Scenario -> "Mes assets" (auth.save_user_asset, source="ia") -> + posée sur l'écran via LE MÊME chemin que Phase 1 + (screens.add_scene_object(image_url=...)) — jamais un chemin + parallèle. Toute erreur (Scenario mal configuré, timeout, échec) + remonte comme un résultat d'outil normal, voir ai/chat.py.""" + image_url = generate_image_url(prompt) + downloaded = requests.get(image_url, timeout=60) + downloaded.raise_for_status() + ext = os.path.splitext(image_url.split("?")[0])[1] or ".png" + asset_id, filename = auth.save_user_asset(user_id, downloaded.content, ext, original_name=prompt[:80], source="ia") + served_url = url_for("serve_user_asset", user_id=user_id, filename=filename) + object_id = screens.add_scene_object(slug, screen_id, kind=kind, image_url=served_url) + return {"object_id": object_id, "asset_id": asset_id} + + +_DISPATCH = { + "add_scene_object": _dispatch_add_scene_object, + "set_object_geometry": _dispatch_set_object_geometry, + "set_object_name": _dispatch_set_object_name, + "set_object_role": _dispatch_set_object_role, + "set_object_collision": _dispatch_set_object_collision, + "create_global_variable": _dispatch_create_global_variable, + "set_collision_rules": _dispatch_set_collision_rules, + "append_action_to_trigger": _dispatch_append_action_to_trigger, + "add_generated_image": _dispatch_add_generated_image, +} + + +def dispatch_tool(slug, screen_id, user_id, tool_name, tool_input): + """Point d'entrée UNIQUE utilisé par la boucle tool-use (Phase 2) — + lève KeyError pour un nom d'outil inconnu (jamais silencieux : un tool + annoncé par TOOLS mais absent d'ici serait un bug de ce module, pas + une entrée utilisateur à tolérer). `user_id` : nécessaire pour "Mes + assets" (scopé par compte, voir add_generated_image ci-dessus) — + ignoré par les autres outils, qui n'agissent que sur l'écran/l'objet.""" + handler = _DISPATCH[tool_name] + return handler(slug, screen_id, user_id, **tool_input) diff --git a/auth/__init__.py b/auth/__init__.py index c869ba36..5998cd40 100644 --- a/auth/__init__.py +++ b/auth/__init__.py @@ -30,6 +30,13 @@ from .update_profile import update_profile from .count_admins import count_admins from .delete_user import delete_user from .update_email import update_email, EmailUpdateError +from .ensure_user_assets_schema import ensure_user_assets_schema +from .user_assets_dir import user_assets_dir +from .create_user_asset import create_user_asset +from .list_user_assets import list_user_assets +from .get_user_asset import get_user_asset +from .delete_user_asset import delete_user_asset +from .save_user_asset import save_user_asset __all__ = [ "users_db_path", "ensure_users_schema", "is_first_user", @@ -46,4 +53,6 @@ __all__ = [ "send_password_reset_email", "EmailNotConfiguredError", "update_profile", "count_admins", "delete_user", "update_email", "EmailUpdateError", + "ensure_user_assets_schema", "user_assets_dir", "create_user_asset", + "list_user_assets", "get_user_asset", "delete_user_asset", "save_user_asset", ] diff --git a/auth/create_user_asset.py b/auth/create_user_asset.py new file mode 100644 index 00000000..98cfb208 --- /dev/null +++ b/auth/create_user_asset.py @@ -0,0 +1,20 @@ +from .connection import connect +from .ensure_user_assets_schema import ensure_user_assets_schema + + +def create_user_asset(user_id, filename, original_name=None, source="upload"): + """Enregistre une ligne "Mes assets" pour un fichier déjà écrit sur + disque (voir user_assets_dir.py) — le fichier lui-même est écrit par + l'appelant (route d'upload, ou plus tard la génération IA), cette + fonction ne fait que la partie base de données, comme + db.create_global_variable pour le reste du moteur.""" + ensure_user_assets_schema() + conn = connect() + conn.execute( + "INSERT INTO _user_assets (user_id, filename, original_name, source) VALUES (?, ?, ?, ?)", + (user_id, filename, original_name, source), + ) + asset_id = conn.execute("SELECT last_insert_rowid() AS id").fetchone()["id"] + conn.commit() + conn.close() + return asset_id diff --git a/auth/delete_user_asset.py b/auth/delete_user_asset.py new file mode 100644 index 00000000..22fc8bb4 --- /dev/null +++ b/auth/delete_user_asset.py @@ -0,0 +1,27 @@ +import os + +from .connection import connect +from .ensure_user_assets_schema import ensure_user_assets_schema +from .user_assets_dir import user_assets_dir + + +def delete_user_asset(asset_id, user_id): + """N'efface que si asset_id APPARTIENT à user_id (jamais fournie par + l'appelant sans vérification — voir get_user_asset.py) : renvoie False + sans rien faire sinon, plutôt que de lever une erreur, même patron que + screens.delete_scene_object pour un id introuvable.""" + ensure_user_assets_schema() + conn = connect() + row = conn.execute( + "SELECT filename FROM _user_assets WHERE id = ? AND user_id = ?", (asset_id, user_id) + ).fetchone() + if not row: + conn.close() + return False + conn.execute("DELETE FROM _user_assets WHERE id = ?", (asset_id,)) + conn.commit() + conn.close() + path = os.path.join(user_assets_dir(user_id), row["filename"]) + if os.path.exists(path): + os.remove(path) + return True diff --git a/auth/ensure_user_assets_schema.py b/auth/ensure_user_assets_schema.py new file mode 100644 index 00000000..b3bf759d --- /dev/null +++ b/auth/ensure_user_assets_schema.py @@ -0,0 +1,23 @@ +from .connection import connect + + +def ensure_user_assets_schema(): + """"Mes assets" (voir user_assets_dir.py) : une image appartient à un + COMPTE, jamais à un projet — table dans la base de comptes partagée + (auth/connection.py), pas dans le game.db d'un jeu (db/connection.py), + pour rester utilisable d'un projet à l'autre du même compte.""" + conn = connect() + conn.executescript( + """ + CREATE TABLE IF NOT EXISTS _user_assets ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + user_id INTEGER NOT NULL, + filename TEXT NOT NULL, + original_name TEXT, + source TEXT NOT NULL DEFAULT 'upload' CHECK (source IN ('upload', 'ia')), + created_at TEXT DEFAULT CURRENT_TIMESTAMP + ); + """ + ) + conn.commit() + conn.close() diff --git a/auth/get_user_asset.py b/auth/get_user_asset.py new file mode 100644 index 00000000..cffad34e --- /dev/null +++ b/auth/get_user_asset.py @@ -0,0 +1,17 @@ +from .connection import connect +from .ensure_user_assets_schema import ensure_user_assets_schema + + +def get_user_asset(asset_id): + """Renvoie aussi user_id — indispensable pour vérifier la PROPRIÉTÉ + avant de servir/poser un asset (voir routes/assets/serve_user_asset.py, + routes/scenes/scene_object_add.py), même esprit que l'isolation par + propriétaire déjà en place sur les projets (core/auth_guard.py).""" + ensure_user_assets_schema() + conn = connect() + row = conn.execute( + "SELECT id, user_id, filename, original_name, source, created_at FROM _user_assets WHERE id = ?", + (asset_id,), + ).fetchone() + conn.close() + return dict(row) if row else None diff --git a/auth/list_user_assets.py b/auth/list_user_assets.py new file mode 100644 index 00000000..af243d6e --- /dev/null +++ b/auth/list_user_assets.py @@ -0,0 +1,17 @@ +from .connection import connect +from .ensure_user_assets_schema import ensure_user_assets_schema + + +def list_user_assets(user_id): + """"Mes assets" d'un compte, plus récent en premier — voir + templates/scene_edit.html, bloc "Mes assets" du panneau d'ajout + d'élément.""" + ensure_user_assets_schema() + conn = connect() + rows = conn.execute( + "SELECT id, user_id, filename, original_name, source, created_at " + "FROM _user_assets WHERE user_id = ? ORDER BY id DESC", + (user_id,), + ).fetchall() + conn.close() + return [dict(row) for row in rows] diff --git a/auth/save_user_asset.py b/auth/save_user_asset.py new file mode 100644 index 00000000..9157687c --- /dev/null +++ b/auth/save_user_asset.py @@ -0,0 +1,20 @@ +import os +import uuid + +from .create_user_asset import create_user_asset +from .user_assets_dir import user_assets_dir + + +def save_user_asset(user_id, content, ext, original_name=None, source="upload"): + """Écrit `content` (bytes) sur disque + crée la ligne "Mes assets" — + factorisé pour être partagé par l'upload manuel + (routes/assets/upload_user_asset.py) ET la génération IA + (ai/tools.py::_dispatch_add_generated_image), jamais dupliqué entre + les deux. Renvoie (asset_id, filename).""" + filename = uuid.uuid4().hex + ext + asset_dir = user_assets_dir(user_id) + os.makedirs(asset_dir, exist_ok=True) + with open(os.path.join(asset_dir, filename), "wb") as f: + f.write(content) + asset_id = create_user_asset(user_id, filename, original_name=original_name, source=source) + return asset_id, filename diff --git a/auth/user_assets_dir.py b/auth/user_assets_dir.py new file mode 100644 index 00000000..2d907d63 --- /dev/null +++ b/auth/user_assets_dir.py @@ -0,0 +1,10 @@ +import os + +from db.constants import USER_ASSETS_DIR + + +def user_assets_dir(user_id): + """Dossier disque des images d'un compte (voir ensure_user_assets_schema.py + pour les métadonnées) — mirroir de db/game_dir.py, mais indexé par + utilisateur plutôt que par slug de projet.""" + return os.path.join(USER_ASSETS_DIR, str(user_id)) diff --git a/core/flask_app.py b/core/flask_app.py index effee6e5..72285248 100644 --- a/core/flask_app.py +++ b/core/flask_app.py @@ -1,8 +1,20 @@ import os import secrets +from dotenv import load_dotenv from flask import Flask +# Charge .env AVANT tout le reste (voir .env.example) — ce module est le +# tout premier import interne de app.py, donc les variables sont posées +# avant qu'un `import db`/`auth` ne les résolve à l'import (ex. +# db/constants.py::PROJECTS_DIR). Ne remplace JAMAIS une variable déjà +# présente dans os.environ (comportement par défaut de load_dotenv) — +# tests/conftest.py, qui pose ses propres variables en Python avant tout +# import, reste donc isolé d'un .env local même s'il en existe un sur le +# poste. Aucun effet en production (pas de fichier .env sur le serveur, +# les variables y sont posées directement sur l'hôte/le conteneur). +load_dotenv() + _BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) _TEMPLATE_FOLDER = os.path.join(_BASE_DIR, "templates") _STATIC_FOLDER = os.path.join(_BASE_DIR, "static") diff --git a/db/constants.py b/db/constants.py index 5eead8a7..405d6e9e 100644 --- a/db/constants.py +++ b/db/constants.py @@ -10,6 +10,15 @@ PROJECTS_DIR = os.environ.get("FORGE_PROJECTS_DIR") or os.path.join( os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "projects" ) +# "Mes assets" (voir auth/user_assets/) : stockage PAR UTILISATEUR, pas +# par jeu — distinct de PROJECTS_DIR///uploads (voir +# routes/uploads/upload_file.py), pour qu'une image reste réutilisable +# d'un projet à l'autre du même compte. Même schéma de surcharge que +# PROJECTS_DIR ci-dessus. +USER_ASSETS_DIR = os.environ.get("FORGE_USER_ASSETS_DIR") or os.path.join( + os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "user_assets" +) + # Types de champ exposés dans l'interface -> type de colonne SQLite réel. FIELD_TYPES = { "texte": {"label": "Texte court", "sql": "TEXT"}, diff --git a/requirements.txt b/requirements.txt index 66d01c43..40a623ce 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,11 @@ Flask==3.0.3 pyotp==2.10.0 qrcode==8.2 +# Onglet "IA" (voir ai/) : anthropic pour la boucle tool-use (ai/chat.py), +# requests pour le client Scenario (ai/scenario_client.py, seule +# dépendance HTTP du projet), python-dotenv pour charger .env en local +# (core/flask_app.py) — jamais utilisé en production, où les variables +# sont déjà posées sur l'hôte/le conteneur (voir .env.example). +anthropic==1.4.0 +requests==2.34.2 +python-dotenv==1.2.3 diff --git a/routes/__init__.py b/routes/__init__.py index f71ff2b9..7e986f29 100644 --- a/routes/__init__.py +++ b/routes/__init__.py @@ -1 +1 @@ -from . import auth, games, screens, flow, uploads, play, animations, global_vars, publish, custom_events, flow_blocks, scenes, onboarding, triggers +from . import auth, games, screens, flow, uploads, play, animations, global_vars, publish, custom_events, flow_blocks, scenes, onboarding, triggers, assets, ia diff --git a/routes/assets/__init__.py b/routes/assets/__init__.py new file mode 100644 index 00000000..60745d2e --- /dev/null +++ b/routes/assets/__init__.py @@ -0,0 +1 @@ +from . import upload_user_asset, serve_user_asset diff --git a/routes/assets/serve_user_asset.py b/routes/assets/serve_user_asset.py new file mode 100644 index 00000000..159dba00 --- /dev/null +++ b/routes/assets/serve_user_asset.py @@ -0,0 +1,15 @@ +from flask import g, send_from_directory, abort + +import auth + +from core.flask_app import app + + +@app.route("/assets//") +def serve_user_asset(user_id, filename): + """403 si le compte connecté n'est pas le propriétaire — même esprit + que l'isolation par propriétaire des projets (core/auth_guard.py) : + "Mes assets" ne doit jamais fuiter d'un compte à l'autre.""" + if user_id != g.current_user["id"]: + abort(403) + return send_from_directory(auth.user_assets_dir(user_id), filename) diff --git a/routes/assets/upload_user_asset.py b/routes/assets/upload_user_asset.py new file mode 100644 index 00000000..28b86d7f --- /dev/null +++ b/routes/assets/upload_user_asset.py @@ -0,0 +1,27 @@ +import os + +from flask import g, request, jsonify, url_for + +import auth + +from core.flask_app import app + + +@app.route("/assets/upload", methods=["POST"]) +def upload_user_asset(): + """"Mes assets" (voir auth/user_assets_dir.py) : mirroir de + routes/uploads/upload_file.py, mais stocké PAR COMPTE plutôt que par + jeu, pour être réutilisable dans n'importe quel projet du même + compte. Écriture disque + ligne base factorisées dans + auth.save_user_asset (partagé avec la génération IA, voir + ai/tools.py::_dispatch_add_generated_image).""" + f = request.files.get("file") + if not f or not f.filename: + return jsonify({"error": "Aucun fichier reçu"}), 400 + ext = "".join(c for c in os.path.splitext(f.filename)[1].lower() if c.isalnum() or c == ".")[:10] + user_id = g.current_user["id"] + asset_id, filename = auth.save_user_asset(user_id, f.read(), ext, original_name=f.filename, source="upload") + return jsonify({ + "id": asset_id, + "url": url_for("serve_user_asset", user_id=user_id, filename=filename), + }) diff --git a/routes/global_vars/create_global_var.py b/routes/global_vars/create_global_var.py index 146d8b10..32ab1608 100644 --- a/routes/global_vars/create_global_var.py +++ b/routes/global_vars/create_global_var.py @@ -1,4 +1,4 @@ -from flask import request, redirect, url_for +from flask import request, redirect, render_template, url_for, jsonify import db @@ -9,7 +9,10 @@ from core.flask_app import app def create_global_var(slug): """Depuis l'onglet "Variables" de l'éditeur de scène (screen_edit.html) — idempotent par nom (voir db.create_global_variable), donc sans - risque en cas de double soumission.""" + risque en cas de double soumission. Réponse AJAX (voir + static/js/scenes/global-variables.js) : renvoie le HTML de la LIGNE + créée (templates/_global_variable_row.html, partagé avec le rendu + initial de la page — jamais dupliqué), que le JS insère sans recharger.""" name = (request.form.get("name") or "").strip() var_type = request.form.get("type") or "texte" default_value = request.form.get("default_value") or "" @@ -21,6 +24,14 @@ def create_global_var(slug): per_player = request.form.get("per_player", "1") == "1" if name: db.create_global_variable(slug, name, var_type, default_value, per_player=per_player) + if request.headers.get("X-Requested-With") == "fetch": + row_html = "" + if name: + variable = db.get_global_variable(slug, name) + row_html = render_template( + "_global_variable_row.html", v=variable, global_variable_types=db.GLOBAL_VARIABLE_TYPES, + ) + return jsonify({"ok": True, "row_html": row_html}) if screen_id: return redirect(url_for("screen_edit", slug=slug, screen_id=screen_id, tab="variables")) return redirect(url_for("game_dashboard", slug=slug)) diff --git a/routes/global_vars/global_var_delete.py b/routes/global_vars/global_var_delete.py index 46e4a056..944bfab7 100644 --- a/routes/global_vars/global_var_delete.py +++ b/routes/global_vars/global_var_delete.py @@ -1,4 +1,4 @@ -from flask import request, redirect, url_for +from flask import request, redirect, url_for, jsonify import db @@ -7,8 +7,13 @@ from core.flask_app import app @app.route("/game//variables//delete", methods=["POST"]) def global_var_delete(slug, var_id): + """Suppression en AJAX (voir static/js/scenes/global-variables.js) — + même raison que global_var_edit.py. Redirection classique conservée + en secours pour tout appelant non-JS.""" screen_id = request.form.get("screen_id", type=int) db.delete_global_variable_by_id(slug, var_id) + if request.headers.get("X-Requested-With") == "fetch": + return jsonify({"ok": True}) if screen_id: return redirect(url_for("screen_edit", slug=slug, screen_id=screen_id, tab="variables")) return redirect(url_for("game_dashboard", slug=slug)) diff --git a/routes/global_vars/global_var_edit.py b/routes/global_vars/global_var_edit.py index 98733b6f..db718017 100644 --- a/routes/global_vars/global_var_edit.py +++ b/routes/global_vars/global_var_edit.py @@ -1,4 +1,4 @@ -from flask import request, redirect, url_for +from flask import request, redirect, url_for, jsonify import db @@ -7,10 +7,16 @@ from core.flask_app import app @app.route("/game//variables//edit", methods=["POST"]) def global_var_edit(slug, var_id): + """Enregistrement en AJAX (voir static/js/scenes/global-variables.js) — + demande explicite : modifier/supprimer une variable ne doit plus + recharger toute la page. Redirection classique conservée en secours + pour tout appelant non-JS (même patron que scene_object_add.py).""" var_type = request.form.get("type") or "texte" value = request.form.get("value") or "" screen_id = request.form.get("screen_id", type=int) db.update_global_variable(slug, var_id, var_type, value) + if request.headers.get("X-Requested-With") == "fetch": + return jsonify({"ok": True}) if screen_id: return redirect(url_for("screen_edit", slug=slug, screen_id=screen_id, tab="variables")) return redirect(url_for("game_dashboard", slug=slug)) diff --git a/routes/ia/__init__.py b/routes/ia/__init__.py new file mode 100644 index 00000000..9e842a9a --- /dev/null +++ b/routes/ia/__init__.py @@ -0,0 +1 @@ +from . import ia_chat diff --git a/routes/ia/ia_chat.py b/routes/ia/ia_chat.py new file mode 100644 index 00000000..068d55a7 --- /dev/null +++ b/routes/ia/ia_chat.py @@ -0,0 +1,85 @@ +from flask import g, jsonify, request + +import ai +import screens + +from core.flask_app import app + +_CONVERSATION_NOT_FOUND = {"error": "conversation introuvable"} + + +def _get_owned_conversation(slug, conversation_id): + """La portée par SLUG (db.connect(slug), voir screens/ia/) suffit + déjà à isoler les conversations d'un jeu à l'autre — un id d'une + autre base n'existe simplement pas ici, même patron que + screens.get_scene_object. Renvoie None si absente.""" + return screens.get_ia_conversation(slug, conversation_id) + + +@app.route("/game//screens//ia-conversations", methods=["GET"]) +def ia_conversations_list(slug, screen_id): + """Colonne de gauche de l'onglet "Générer avec l'IA" — toutes les + conversations de cet écran, plus récente en premier.""" + return jsonify(screens.list_ia_conversations(slug, screen_id)) + + +@app.route("/game//screens//ia-conversations", methods=["POST"]) +def ia_conversations_create(slug, screen_id): + """"+ Nouvelle conversation" — créée immédiatement, vide.""" + conversation_id = screens.create_ia_conversation(slug, screen_id) + conversation = screens.get_ia_conversation(slug, conversation_id) + return jsonify(conversation) + + +@app.route("/game//ia-conversations/", methods=["DELETE"]) +def ia_conversation_delete(slug, conversation_id): + if not _get_owned_conversation(slug, conversation_id): + return jsonify(_CONVERSATION_NOT_FOUND), 404 + screens.delete_ia_conversation(slug, conversation_id) + return jsonify({"ok": True}) + + +@app.route("/game//ia-conversations//messages", methods=["GET"]) +def ia_conversation_messages(slug, conversation_id): + """Historique complet d'UNE conversation — chargé par + static/js/ia/ia-chat.js à sa sélection dans la colonne.""" + if not _get_owned_conversation(slug, conversation_id): + return jsonify(_CONVERSATION_NOT_FOUND), 404 + return jsonify(screens.list_ia_chat_messages(slug, conversation_id)) + + +@app.route("/game//ia-conversations//messages", methods=["POST"]) +def ia_conversation_send(slug, conversation_id): + """Envoie un message dans une conversation — body {message}. Persiste + le message du créateur et la réponse, renvoie les deux. + + ai.run_chat_turn lit l'historique déjà persisté et y ajoute le + message courant EN MÉMOIRE seulement — persisté ici, APRÈS l'appel, + jamais avant (sinon il apparaîtrait deux fois dans l'historique que + la boucle envoie à Claude).""" + conversation = _get_owned_conversation(slug, conversation_id) + if not conversation: + return jsonify(_CONVERSATION_NOT_FOUND), 404 + + message = (request.get_json(silent=True) or {}).get("message", "") + message = message.strip() if isinstance(message, str) else "" + if not message: + return jsonify({"error": "message vide"}), 400 + + try: + reply = ai.run_chat_turn(slug, conversation["screen_id"], conversation_id, g.current_user["id"], message) + except (ai.AnthropicNotConfiguredError, ai.ScenarioNotConfiguredError, ai.ScenarioGenerationError) as e: + reply = f"Configuration IA incomplète : {e}" + except Exception: + # Jamais le détail brut d'une erreur inattendue au créateur (même + # politique que auth/send_email.py) — journalisée côté serveur + # par le logger par défaut de Flask (DEBUG/erreur non interceptée). + app.logger.exception("Erreur inattendue dans ai.run_chat_turn (%s, conversation %s)", slug, conversation_id) + reply = "Une erreur inattendue est survenue — réessaie dans un instant." + + user_message_id = screens.add_ia_chat_message(slug, conversation_id, "user", message) + assistant_message_id = screens.add_ia_chat_message(slug, conversation_id, "assistant", reply) + return jsonify({ + "user_message": {"id": user_message_id, "role": "user", "content": message}, + "assistant_message": {"id": assistant_message_id, "role": "assistant", "content": reply}, + }) diff --git a/routes/scenes/scene_edit_view.py b/routes/scenes/scene_edit_view.py index 2ce0bdea..a54433e1 100644 --- a/routes/scenes/scene_edit_view.py +++ b/routes/scenes/scene_edit_view.py @@ -2,6 +2,7 @@ import json from flask import render_template, request, abort, g +import auth import db import screens @@ -81,6 +82,10 @@ def render_scene_edit(slug, screen_id, game): # Images de fond CraftPix (screens.BACKGROUND_LIBRARY) : même règle # d'accès que les sprites animaux — réservées au rôle admin. background_library = screens.BACKGROUND_LIBRARY if g.current_user["role"] == "admin" else {} + # "Mes assets" (voir auth/user_assets_dir.py) : par COMPTE, jamais + # filtré par rôle contrairement à sprite_library/background_library + # ci-dessus (rien à voir avec le catalogue Forge réservé à l'admin). + user_assets = auth.list_user_assets(g.current_user["id"]) return render_template( "scene_edit.html", @@ -96,6 +101,7 @@ def render_scene_edit(slug, screen_id, game): sprite_library=sprite_library, sprite_library_families=sprite_library_families, sprite_library_json=json.dumps(sprite_library), background_library=background_library, + user_assets=user_assets, element_animations_map_json=json.dumps(element_animations_map), element_orientation_values=screens.ELEMENT_ORIENTATION_VALUES, element_orientation_labels_json=json.dumps(screens.ELEMENT_ORIENTATION_LABELS), diff --git a/routes/scenes/scene_object_add.py b/routes/scenes/scene_object_add.py index 86ec1a48..e00a1de2 100644 --- a/routes/scenes/scene_object_add.py +++ b/routes/scenes/scene_object_add.py @@ -1,5 +1,6 @@ -from flask import request, redirect, url_for, jsonify +from flask import g, request, redirect, url_for, jsonify, abort +import auth import screens from core.flask_app import app @@ -27,12 +28,23 @@ def scene_object_add(slug, screen_id): kind = request.form.get("kind", "personnage") forge_character = request.form.get("forge_character") background_slug = request.form.get("background_slug") + asset_id = request.form.get("asset_id", type=int) if forge_character: forbid_admin_only_character(forge_character) if background_slug: forbid_admin_only_background(background_slug) + image_url = None + if asset_id: + # "Mes assets" (voir auth/user_assets_dir.py) : isolation stricte + # par propriétaire, même esprit que les projets (core/auth_guard.py) + # — jamais poser l'asset d'un autre compte, même en devinant son id. + asset = auth.get_user_asset(asset_id) + if not asset or asset["user_id"] != g.current_user["id"]: + abort(403) + image_url = url_for("serve_user_asset", user_id=asset["user_id"], filename=asset["filename"]) new_id = screens.add_scene_object( - slug, screen_id, kind=kind, forge_character=forge_character, background_slug=background_slug, + slug, screen_id, kind=kind, forge_character=forge_character, + background_slug=background_slug, image_url=image_url, ) if request.headers.get("X-Requested-With") == "fetch": obj = screens.get_scene_object(slug, new_id) diff --git a/routes/triggers/triggers.py b/routes/triggers/triggers.py index d6f89647..3a751486 100644 --- a/routes/triggers/triggers.py +++ b/routes/triggers/triggers.py @@ -96,17 +96,15 @@ def trigger_append_action(slug, object_id): DERNIÈRE feuille d'une chaîne. 404 si `after_id` introuvable ou si cette feuille a déjà un "then" (jamais écrasé par cette route — un nouvel appel doit d'abord recharger la chaîne à jour).""" - obj = screens.get_scene_object(slug, object_id) - if obj is None: + if screens.get_scene_object(slug, object_id) is None: return jsonify({"error": "objet introuvable"}), 404 body = request.get_json(silent=True) or {} after_id = body.get("after_id") if not isinstance(after_id, str) or not after_id.strip(): return jsonify({"error": "after_id invalide"}), 400 - rules = screens.resolve_collision_rules(obj) - if not screens.set_then_action_in_rules(rules, after_id, body.get("action")): + # Chemin d'écriture PARTAGÉ avec l'agent IA (voir ai/tools.py) — + # ni cette route ni l'agent n'écrivent _collision_rules directement. + if not screens.append_action_to_trigger(slug, object_id, after_id, body.get("action")): return jsonify({"error": "action précédente introuvable ou déjà chaînée"}), 404 - sanitized = screens.sanitize_collision_rules(rules) - screens.set_scene_object_collision_rules(slug, object_id, sanitized) return jsonify({"ok": True}) diff --git a/screens/__init__.py b/screens/__init__.py index 6c283f73..2505cc9c 100644 --- a/screens/__init__.py +++ b/screens/__init__.py @@ -87,6 +87,7 @@ from .scenes.set_scene_object_name import set_scene_object_name from .scenes.set_scene_object_dialogue_box_style import set_scene_object_dialogue_box_style from .scenes.render_scene_object import render_scene_object from .scenes.build_collision_rule_objects import build_collision_rule_objects +from .scenes.append_action_to_trigger import append_action_to_trigger from .rendering.trigger_graph import ( list_all_triggers, list_all_collision_objects, collect_all_dialogue_lines, list_completable_dialogue_ids, @@ -128,3 +129,11 @@ from .custom_events.list_custom_event_usages import list_custom_event_usages from .custom_events.delete_custom_event import delete_custom_event from .payload.full_game_payload import full_game_payload + +from .ia.ensure_ia_chat_schema import ensure_ia_chat_schema +from .ia.list_ia_chat_messages import list_ia_chat_messages +from .ia.add_ia_chat_message import add_ia_chat_message +from .ia.create_ia_conversation import create_ia_conversation +from .ia.list_ia_conversations import list_ia_conversations +from .ia.get_ia_conversation import get_ia_conversation +from .ia.delete_ia_conversation import delete_ia_conversation diff --git a/screens/ia/add_ia_chat_message.py b/screens/ia/add_ia_chat_message.py new file mode 100644 index 00000000..882b96c8 --- /dev/null +++ b/screens/ia/add_ia_chat_message.py @@ -0,0 +1,33 @@ +import db + +from .ensure_ia_chat_schema import ensure_ia_chat_schema + +_DEFAULT_TITLE = "Nouvelle conversation" +_TITLE_MAX_LENGTH = 50 + + +def add_ia_chat_message(slug, conversation_id, role, content): + """Ajoute un message (role "user" ou "assistant") à une conversation + — voir routes/ia/ia_chat.py, seul appelant. + + Titre automatique (comme claude.ai) : le premier message "user" d'une + conversation encore au titre par défaut renomme la conversation avec + ses ~50 premiers caractères, pour que la colonne de gauche affiche + autre chose que "Nouvelle conversation" pour toutes les entrées.""" + ensure_ia_chat_schema(slug) + conn = db.connect(slug) + conn.execute( + "INSERT INTO _ia_chat_messages (conversation_id, role, content) VALUES (?, ?, ?)", + (conversation_id, role, content), + ) + message_id = conn.execute("SELECT last_insert_rowid() AS id").fetchone()["id"] + if role == "user": + conversation = conn.execute( + "SELECT title FROM _ia_conversations WHERE id = ?", (conversation_id,) + ).fetchone() + if conversation and conversation["title"] == _DEFAULT_TITLE: + title = content.strip()[:_TITLE_MAX_LENGTH] + conn.execute("UPDATE _ia_conversations SET title = ? WHERE id = ?", (title, conversation_id)) + conn.commit() + conn.close() + return message_id diff --git a/screens/ia/create_ia_conversation.py b/screens/ia/create_ia_conversation.py new file mode 100644 index 00000000..6370a7ef --- /dev/null +++ b/screens/ia/create_ia_conversation.py @@ -0,0 +1,16 @@ +import db + +from .ensure_ia_chat_schema import ensure_ia_chat_schema + + +def create_ia_conversation(slug, screen_id): + """"+ Nouvelle conversation" (voir static/js/ia/ia-chat.js) : créée + IMMÉDIATEMENT, vide — visible tout de suite dans la colonne, pas + besoin d'attendre un premier message.""" + ensure_ia_chat_schema(slug) + conn = db.connect(slug) + conn.execute("INSERT INTO _ia_conversations (screen_id) VALUES (?)", (screen_id,)) + conversation_id = conn.execute("SELECT last_insert_rowid() AS id").fetchone()["id"] + conn.commit() + conn.close() + return conversation_id diff --git a/screens/ia/delete_ia_conversation.py b/screens/ia/delete_ia_conversation.py new file mode 100644 index 00000000..5ba538f5 --- /dev/null +++ b/screens/ia/delete_ia_conversation.py @@ -0,0 +1,13 @@ +import db + +from .ensure_ia_chat_schema import ensure_ia_chat_schema + + +def delete_ia_conversation(slug, conversation_id): + """Cascade sur les messages (ON DELETE CASCADE, voir + ensure_ia_chat_schema.py).""" + ensure_ia_chat_schema(slug) + conn = db.connect(slug) + conn.execute("DELETE FROM _ia_conversations WHERE id = ?", (conversation_id,)) + conn.commit() + conn.close() diff --git a/screens/ia/ensure_ia_chat_schema.py b/screens/ia/ensure_ia_chat_schema.py new file mode 100644 index 00000000..b871a0ca --- /dev/null +++ b/screens/ia/ensure_ia_chat_schema.py @@ -0,0 +1,38 @@ +import db + + +def ensure_ia_chat_schema(slug): + """Chat "Générer avec l'IA" — plusieurs CONVERSATIONS par écran + (demande explicite : gérer plusieurs fils, comme claude.ai), chacune + portant sa propre liste de messages. ON DELETE CASCADE à chaque + niveau (écran supprimé -> ses conversations -> leurs messages), + même patron que _scene_objects (screens/scenes/ensure_scene_schema.py).""" + conn = db.connect(slug) + # _ia_chat_messages existait déjà (phase précédente, une seule + # conversation par écran, colonne screen_id directe) sur les projets + # déjà testés avant ce chantier — CREATE TABLE IF NOT EXISTS ne + # migrerait pas son schéma. Aucune donnée à préserver (fonctionnalité + # tout juste testée manuellement) : on repart d'une table neuve plutôt + # que d'écrire une vraie migration pour quelques messages de test. + cols = {row["name"] for row in conn.execute("PRAGMA table_info(_ia_chat_messages)").fetchall()} + if cols and "conversation_id" not in cols: + conn.execute("DROP TABLE _ia_chat_messages") + conn.executescript( + """ + CREATE TABLE IF NOT EXISTS _ia_conversations ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + screen_id INTEGER NOT NULL REFERENCES _screens(id) ON DELETE CASCADE, + title TEXT NOT NULL DEFAULT 'Nouvelle conversation', + created_at TEXT DEFAULT CURRENT_TIMESTAMP + ); + CREATE TABLE IF NOT EXISTS _ia_chat_messages ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + conversation_id INTEGER NOT NULL REFERENCES _ia_conversations(id) ON DELETE CASCADE, + role TEXT NOT NULL CHECK (role IN ('user', 'assistant')), + content TEXT NOT NULL, + created_at TEXT DEFAULT CURRENT_TIMESTAMP + ); + """ + ) + conn.commit() + conn.close() diff --git a/screens/ia/get_ia_conversation.py b/screens/ia/get_ia_conversation.py new file mode 100644 index 00000000..144690e0 --- /dev/null +++ b/screens/ia/get_ia_conversation.py @@ -0,0 +1,16 @@ +import db + +from .ensure_ia_chat_schema import ensure_ia_chat_schema + + +def get_ia_conversation(slug, conversation_id): + """Renvoie aussi screen_id — indispensable pour vérifier + l'appartenance à CE jeu avant de supprimer/lire/écrire (voir + routes/ia/ia_chat.py), même patron que auth.get_user_asset.""" + ensure_ia_chat_schema(slug) + conn = db.connect(slug) + row = conn.execute( + "SELECT id, screen_id, title, created_at FROM _ia_conversations WHERE id = ?", (conversation_id,) + ).fetchone() + conn.close() + return dict(row) if row else None diff --git a/screens/ia/list_ia_chat_messages.py b/screens/ia/list_ia_chat_messages.py new file mode 100644 index 00000000..73f15e1e --- /dev/null +++ b/screens/ia/list_ia_chat_messages.py @@ -0,0 +1,16 @@ +import db + +from .ensure_ia_chat_schema import ensure_ia_chat_schema + + +def list_ia_chat_messages(slug, conversation_id): + """Historique d'UNE conversation, dans l'ordre chronologique (voir + static/js/ia/ia-chat.js, qui les affiche tels quels).""" + ensure_ia_chat_schema(slug) + conn = db.connect(slug) + rows = conn.execute( + "SELECT id, role, content, created_at FROM _ia_chat_messages WHERE conversation_id = ? ORDER BY id ASC", + (conversation_id,), + ).fetchall() + conn.close() + return [dict(row) for row in rows] diff --git a/screens/ia/list_ia_conversations.py b/screens/ia/list_ia_conversations.py new file mode 100644 index 00000000..f8d94be9 --- /dev/null +++ b/screens/ia/list_ia_conversations.py @@ -0,0 +1,16 @@ +import db + +from .ensure_ia_chat_schema import ensure_ia_chat_schema + + +def list_ia_conversations(slug, screen_id): + """Conversations d'un écran, plus récente en premier (voir la + colonne de gauche de l'onglet "Générer avec l'IA").""" + ensure_ia_chat_schema(slug) + conn = db.connect(slug) + rows = conn.execute( + "SELECT id, title, created_at FROM _ia_conversations WHERE screen_id = ? ORDER BY id DESC", + (screen_id,), + ).fetchall() + conn.close() + return [dict(row) for row in rows] diff --git a/screens/scenes/add_scene_object.py b/screens/scenes/add_scene_object.py index 03555bf9..873f42ac 100644 --- a/screens/scenes/add_scene_object.py +++ b/screens/scenes/add_scene_object.py @@ -15,7 +15,7 @@ _QUIZ_BOX_DEFAULT_SIZE = (340, 240) _SCORE_WIDGET_DEFAULT_SIZE = (140, 50) -def add_scene_object(slug, scene_id, kind="personnage", forge_character=None, background_slug=None): +def add_scene_object(slug, scene_id, kind="personnage", forge_character=None, background_slug=None, image_url=None): """Pose un nouvel objet sur une scène (voir ensure_scene_schema.py). kind="personnage" : attributes._personnage_data, MÊME structure/mêmes fonctions resolve_personnage_* que le widget "personnage" de l'éditeur @@ -28,7 +28,14 @@ def add_scene_object(slug, scene_id, kind="personnage", forge_character=None, ba static/style.css .sceneBackground) et à la taille RÉELLE de l'image choisie (voir screens/labels/background_library.py) par défaut — une image plus grande que la scène devient alors le "monde" que la caméra - suit en défilant (voir static/js/play/personnage-controller.js).""" + suit en défilant (voir static/js/play/personnage-controller.js). + + image_url (kind "fond"/"decor" uniquement) : une image ARBITRAIRE + (voir "Mes assets", auth/user_assets/) plutôt qu'une clé de + BACKGROUND_LIBRARY — prioritaire sur background_slug si les deux sont + fournis. Pas de largeur/hauteur connues d'avance ici (contrairement à + BACKGROUND_LIBRARY qui les documente) : retombe sur les colonnes par + défaut de _scene_objects, exactement comme un "decor" ordinaire.""" ensure_scene_schema(slug) kind = kind if kind in _KINDS else "personnage" attributes = {} @@ -52,6 +59,8 @@ def add_scene_object(slug, scene_id, kind="personnage", forge_character=None, ba # et disparaîtrait à tort de "🧩 Collision" (voir scene_edit_view.py, # qui exclut toujours le joueur). attributes["_personnage_role"] = "pnj" + elif kind in ("fond", "decor") and image_url: + attributes["src"] = image_url elif kind == "fond" and background_slug: from ..labels.background_library import BACKGROUND_LIBRARY background = BACKGROUND_LIBRARY.get(background_slug) diff --git a/screens/scenes/append_action_to_trigger.py b/screens/scenes/append_action_to_trigger.py new file mode 100644 index 00000000..fe5cc66a --- /dev/null +++ b/screens/scenes/append_action_to_trigger.py @@ -0,0 +1,25 @@ +from .get_scene_object import get_scene_object +from .set_scene_object_collision_rules import set_scene_object_collision_rules +from ..rendering.collision_rules import resolve_collision_rules, sanitize_collision_rules, set_then_action_in_rules + + +def append_action_to_trigger(slug, object_id, after_id, raw_action): + """"+ Ajouter une action" en bout de chaîne — extrait de + routes/triggers/triggers.py::trigger_append_action pour être + l'UNIQUE chemin d'écriture, partagé par la route HTTP ET par l'agent + IA (voir ai/tools.py) : ni l'un ni l'autre n'écrit `_collision_rules` + directement, tous deux passent par ici. `after_id` : dialogue.id + (feuille "dialogue") ou id (feuille "variable") de la DERNIÈRE + feuille d'une chaîne. Renvoie False si l'objet, `after_id`, ou + `raw_action` sont invalides, ou si la feuille visée a déjà un "then" + (jamais écrasé par cette fonction — set_then_action_in_rules ne fait + qu'ajouter en bout de chaîne réelle).""" + obj = get_scene_object(slug, object_id) + if obj is None: + return False + rules = resolve_collision_rules(obj) + if not set_then_action_in_rules(rules, after_id, raw_action): + return False + sanitized = sanitize_collision_rules(rules) + set_scene_object_collision_rules(slug, object_id, sanitized) + return True diff --git a/static/branding/ruby-logo.svg b/static/branding/ruby-logo.svg new file mode 100644 index 00000000..ae4c13a2 --- /dev/null +++ b/static/branding/ruby-logo.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/static/js/ia/ia-chat.js b/static/js/ia/ia-chat.js new file mode 100644 index 00000000..cf404641 --- /dev/null +++ b/static/js/ia/ia-chat.js @@ -0,0 +1,334 @@ +// ---------- Onglet "Générer avec l'IA" — chat scopé à L'ÉCRAN OUVERT ---------- +// Persiste la conversation (routes/ia/ia_chat.py) et pilote l'agent +// Ruby (Claude Sonnet 5) via des tools qui appellent les mêmes fonctions +// que l'éditeur manuel (voir ai/tools.py) — ce que l'IA pose doit donc +// apparaître ICI sans recharger la page, sinon on croit que ça ne marche +// pas (demande explicite) : voir iaChatRefreshAfterTurn() plus bas. +// +// Plusieurs CONVERSATIONS par écran (demande explicite : gérer/créer/ +// supprimer des fils, comme claude.ai) — _iaActiveConversationId retient +// laquelle est affichée dans le fil de droite. +var _iaActiveConversationId = null; + +function iaChatEmptyStateHtml() { + return ( + '
' + + '' + + 'Décris ce que tu veux à Ruby' + + 'Des images, des dialogues, une variable, ou un écran complet — décris-le en une phrase et envoie.' + + '
' + ); +} + +// #iaChatLog défile lui-même (voir static/style.css — maquette validée : +// header/body/footer par colonne, seul le BODY de chaque colonne défile, +// jamais l'onglet entier). +function iaChatScrollToBottom() { + var log = document.getElementById('iaChatLog'); + if (log) log.scrollTop = log.scrollHeight; +} + +// "Ruby" — identité visuelle de l'IA (demande explicite) : même mark que +// Forge (static/branding/forge-logo.svg), recoloré rouge/rose pâle (voir +// static/branding/ruby-logo.svg), jamais un logo différent. +function iaChatSenderHtml(isUser) { + if (isUser) return 'Toi'; + return ' Ruby'; +} + +function iaChatRowHtml(message) { + var isUser = message.role === 'user'; + var row = document.createElement('div'); + row.className = 'iaChatRow ' + (isUser ? 'iaChatRow-user' : 'iaChatRow-assistant'); + var sender = document.createElement('div'); + sender.className = 'iaChatSender'; + sender.innerHTML = iaChatSenderHtml(isUser); + var bubble = document.createElement('div'); + bubble.className = 'iaChatBubble'; + bubble.textContent = message.content; + row.appendChild(sender); + row.appendChild(bubble); + return row; +} + +// Affichée à la place de la réponse le temps que Ruby/les outils +// travaillent (peut prendre plusieurs secondes, un écran complet enchaîne +// plusieurs appels d'outils) — sans ça, un créateur qui ne voit rien +// bouger clique à nouveau, pensant que ça n'a pas marché. +function iaChatLoaderRowHtml() { + var row = document.createElement('div'); + row.className = 'iaChatRow iaChatRow-assistant'; + var sender = document.createElement('div'); + sender.className = 'iaChatSender'; + sender.innerHTML = iaChatSenderHtml(false); + var bubble = document.createElement('div'); + bubble.className = 'iaChatBubble iaChatTyping'; + bubble.innerHTML = ''; + row.appendChild(sender); + row.appendChild(bubble); + return row; +} + +function iaChatAutoGrow(textarea) { + textarea.style.height = 'auto'; + textarea.style.height = Math.min(textarea.scrollHeight, 200) + 'px'; +} + +// Un tour peut poser des objets/variables/déclencheurs (voir ai/tools.py) +// — jamais su à l'avance lesquels depuis la seule réponse texte, donc on +// rafraîchit systématiquement les 3 zones que l'IA peut modifier : +// Déclencheurs (déjà un composant JS, triggerLoadAll() suffit), Variables +// et la scène (tous deux rendus côté serveur — on re-télécharge CETTE +// MÊME page et on ne récupère que ces deux fragments, jamais un +// rechargement visible/perte de l'onglet IA en cours). +function iaChatRefreshAfterTurn() { + if (typeof triggerLoadAll === 'function') triggerLoadAll(); + + fetch(window.location.href) + .then(function (r) { return r.text(); }) + .then(function (html) { + var doc = new DOMParser().parseFromString(html, 'text/html'); + + var newCanvasFrame = doc.querySelector('.canvasFrame'); + var oldCanvasFrame = document.querySelector('.canvasFrame'); + if (newCanvasFrame && oldCanvasFrame) { + oldCanvasFrame.innerHTML = newCanvasFrame.innerHTML; + // Bug corrigé ("plus moyen de rien poser hors du champ de la + // caméra") : SCENE_WIDTH/SCENE_HEIGHT (posées une seule fois à + // l'ouverture de la page, voir templates/scene_edit.html) ne sont + // jamais rejouées par ce rafraîchissement partiel — un fond + // agrandi par l'IA (le "monde" devient plus grand que la caméra + // nominale) laissait ces globales à leur ANCIENNE valeur, et le + // glisser-déposer (scene-editor.js) continuait de tout borner à + // l'ancien cadre. #canvas vient d'être remplacé avec sa VRAIE + // taille à jour (voir world_width/world_height, + // routes/scenes/scene_edit_view.py) — on la relit directement + // dessus plutôt que de rejouer un script inline. + var canvas = document.getElementById('canvas'); + if (canvas) { + var newWidth = parseFloat(canvas.style.width); + var newHeight = parseFloat(canvas.style.height); + if (!isNaN(newWidth)) window.SCENE_WIDTH = newWidth; + if (!isNaN(newHeight)) window.SCENE_HEIGHT = newHeight; + } + } + + var newVariablesPanel = doc.getElementById('variablesTabPanel'); + var oldVariablesPanel = document.getElementById('variablesTabPanel'); + if (newVariablesPanel && oldVariablesPanel) oldVariablesPanel.innerHTML = newVariablesPanel.innerHTML; + + // Relance les aperçus animés (voir personnage-preview.js) — un + // personnage tout juste posé par l'IA reste sur sa frame statique + // (ELEMENT_ANIMATIONS_MAP n'est mis à jour qu'au vrai rechargement + // de page), léger mais sans conséquence fonctionnelle. + if (typeof startAllPersonnagePreviews === 'function') startAllPersonnagePreviews(); + }); +} + +function iaChatSend() { + var input = document.getElementById('iaChatInput'); + var sendBtn = document.getElementById('iaChatSendBtn'); + if (sendBtn.disabled) return; // déjà une requête en cours — jamais spammer l'IA + var message = (input.value || '').trim(); + if (!message || !_iaActiveConversationId) return; + var log = document.getElementById('iaChatLog'); + var emptyState = log.querySelector('.iaChatEmpty'); + if (emptyState) emptyState.remove(); + + // Le message du créateur s'affiche TOUT DE SUITE (avant même la + // requête) — sinon, tant que l'IA travaille, l'écran semble ignorer ce + // qu'on vient de taper. + log.appendChild(iaChatRowHtml({ role: 'user', content: message })); + var loaderRow = iaChatLoaderRowHtml(); + log.appendChild(loaderRow); + iaChatScrollToBottom(); + + input.value = ''; + iaChatAutoGrow(input); + input.disabled = true; + sendBtn.disabled = true; + + var conversationId = _iaActiveConversationId; + fetch('/game/' + GAME_SLUG + '/ia-conversations/' + conversationId + '/messages', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ message: message }), + }) + .then(function (r) { return r.json(); }) + .then(function (json) { + loaderRow.remove(); + if (json.assistant_message) log.appendChild(iaChatRowHtml(json.assistant_message)); + iaChatScrollToBottom(); + iaChatRefreshAfterTurn(); + // Le titre de la conversation vient de se dériver de ce premier + // message (voir screens/ia/add_ia_chat_message.py) — recharge la + // colonne pour l'afficher sans attendre un changement d'onglet. + iaChatLoadConversationsList(conversationId); + }) + .catch(function () { + loaderRow.remove(); + log.appendChild(iaChatRowHtml({ role: 'assistant', content: 'Erreur réseau — réessaie dans un instant.' })); + iaChatScrollToBottom(); + }) + .finally(function () { + input.disabled = false; + sendBtn.disabled = false; + input.focus(); + }); +} + +function iaChatInputKeydown(event) { + if (event.key === 'Enter' && !event.shiftKey) { + event.preventDefault(); + iaChatSend(); + } +} + +// ---------- Colonne "Conversations" (CRUD, comme claude.ai) ---------- + +function iaChatConversationItemHtml(conversation) { + var active = conversation.id === _iaActiveConversationId; + return ( + '' + ); +} + +function _iaEscapeHtml(text) { + var div = document.createElement('div'); + div.textContent = text || ''; + return div.innerHTML; +} + +function iaChatRenderConversationsList(conversations) { + var list = document.getElementById('iaConversationsList'); + if (!list) return; + list.innerHTML = conversations.map(iaChatConversationItemHtml).join(''); +} + +function iaChatLoadConversationsList(activeIdOverride) { + fetch('/game/' + GAME_SLUG + '/screens/' + SCREEN_ID + '/ia-conversations') + .then(function (r) { return r.json(); }) + .then(function (conversations) { + if (activeIdOverride) _iaActiveConversationId = activeIdOverride; + iaChatRenderConversationsList(conversations); + }); +} + +function iaChatLoadMessages(conversationId) { + var log = document.getElementById('iaChatLog'); + log.innerHTML = ''; + fetch('/game/' + GAME_SLUG + '/ia-conversations/' + conversationId + '/messages') + .then(function (r) { return r.json(); }) + .then(function (messages) { + if (!messages || !messages.length) { + log.innerHTML = iaChatEmptyStateHtml(); + return; + } + messages.forEach(function (message) { log.appendChild(iaChatRowHtml(message)); }); + iaChatScrollToBottom(); + }); +} + +function iaChatSelectConversation(conversationId) { + _iaActiveConversationId = conversationId; + document.querySelectorAll('.iaConversationItem').forEach(function (el) { el.classList.remove('active'); }); + var item = document.querySelector('.iaConversationItem[data-conversation-id="' + conversationId + '"]'); + if (item) item.classList.add('active'); + iaChatLoadMessages(conversationId); +} + +function iaChatCreateConversation() { + fetch('/game/' + GAME_SLUG + '/screens/' + SCREEN_ID + '/ia-conversations', { method: 'POST' }) + .then(function (r) { return r.json(); }) + .then(function (conversation) { + _iaActiveConversationId = conversation.id; + iaChatLoadConversationsList(conversation.id); + var log = document.getElementById('iaChatLog'); + log.innerHTML = iaChatEmptyStateHtml(); + document.getElementById('iaChatInput').focus(); + }); +} + +function iaChatDeleteConversation(event, conversationId) { + event.stopPropagation(); // jamais sélectionner la conversation qu'on supprime + if (!confirm('Supprimer cette conversation ? Cette action est irréversible.')) return; + fetch('/game/' + GAME_SLUG + '/ia-conversations/' + conversationId, { method: 'DELETE' }) + .then(function () { return fetch('/game/' + GAME_SLUG + '/screens/' + SCREEN_ID + '/ia-conversations'); }) + .then(function (r) { return r.json(); }) + .then(function (conversations) { + if (conversationId === _iaActiveConversationId) { + if (conversations.length) { + _iaActiveConversationId = conversations[0].id; + iaChatLoadMessages(_iaActiveConversationId); + iaChatRenderConversationsList(conversations); + } else { + // Plus aucune conversation — en recrée une tout de suite (le + // fil de droite doit toujours pouvoir recevoir un message). + iaChatCreateConversation(); + } + } else { + iaChatRenderConversationsList(conversations); + } + }); +} + +// Même patron que initTriggersTab() (trigger-editor.js) : appelé +// directement, pas de DOMContentLoaded — rejoué par pjax.js à chaque +// remplacement de
. +function initIaTab() { + var body = document.getElementById('iaTabPanelBody'); + if (!body) return; + // Maquette validée (Artifact "Maquette Ruby") : une div pleine + // hauteur/largeur de l'onglet, 2 colonnes (gauche 40%, droite 60%), + // chacune header/body/footer. Les deux zones non précisées (footer + // gauche, header droite) restent vides pour l'instant. + body.innerHTML = + '
' + + '
' + + '
' + + '' + + 'Ruby' + + '
' + + '
' + + '' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '' + + '' + + '
' + + '
' + + '
' + + '
'; + + fetch('/game/' + GAME_SLUG + '/screens/' + SCREEN_ID + '/ia-conversations') + .then(function (r) { return r.json(); }) + .then(function (conversations) { + if (!conversations.length) { + // Premier passage sur cet écran : aucune conversation encore — + // en crée une tout de suite, jamais un onglet vide sans rien à + // cliquer. + iaChatCreateConversation(); + return; + } + _iaActiveConversationId = conversations[0].id; // la plus récente + iaChatRenderConversationsList(conversations); + iaChatLoadMessages(_iaActiveConversationId); + }); +} + +initIaTab(); diff --git a/static/js/play/__tests__/conditions.test.js b/static/js/play/__tests__/conditions.test.js index aa4be5fc..69716a38 100644 --- a/static/js/play/__tests__/conditions.test.js +++ b/static/js/play/__tests__/conditions.test.js @@ -41,12 +41,29 @@ test('compareValues — repli sur comparaison de chaînes si non numérique', () assert.equal(compareValues('abc', 'different', 'xyz'), true); }); +test('compareValues — "egal"/"different" sur du texte, insensible à la casse (bug corrigé)', () => { + assert.equal(compareValues('Vrai', 'egal', 'vrai'), true); + assert.equal(compareValues('VRAI', 'egal', 'vrai'), true); + assert.equal(compareValues('Vrai', 'different', 'vrai'), false); + assert.equal(compareValues('Vrai', 'egal', 'faux'), false); +}); + test('compareValues — champ booléen, vocabulaire oui/non insensible à la casse', () => { assert.equal(compareValues(true, 'egal', 'Oui', 'booleen'), true); assert.equal(compareValues(false, 'egal', 'non', 'booleen'), true); assert.equal(compareValues(true, 'different', 'non', 'booleen'), true); }); +test('compareValues — champ booléen, la valeur RÉELLE stockée en texte "faux" est bien fausse (bug corrigé)', () => { + // Une variable booléenne est stockée en texte ("vrai"/"faux") — la + // chaîne "faux" est non vide, donc VRAIE au sens JS naïf : sans + // normalisation des DEUX côtés, "faux" == "Vrai" ressortait vrai à tort. + assert.equal(compareValues('faux', 'egal', 'Vrai', 'booleen'), false); + assert.equal(compareValues('faux', 'different', 'Vrai', 'booleen'), true); + assert.equal(compareValues('vrai', 'egal', 'Vrai', 'booleen'), true); + assert.equal(compareValues('non', 'egal', 'oui', 'booleen'), false); +}); + test('resolveVariablePath — chemin vide renvoie la valeur brute', () => { assert.equal(resolveVariablePath('42', ''), '42'); }); diff --git a/static/js/play/conditions.js b/static/js/play/conditions.js index c33ed97c..790cac41 100644 --- a/static/js/play/conditions.js +++ b/static/js/play/conditions.js @@ -25,14 +25,22 @@ function readFieldValue(definitionId, rowId, fieldName) { function compareValues(actual, operator, expected, fieldType) { if (fieldType === 'booleen') { - const a = actual ? 1 : 0; + // Bug corrigé : une variable booléenne est stockée en TEXTE + // ("vrai"/"faux", voir gameData.variables) — `actual ? 1 : 0` prenait + // n'importe quelle chaîne non vide pour vraie, y compris la chaîne + // "faux" elle-même ! Les deux côtés doivent passer par la MÊME + // normalisation texte->booléen, pas seulement le côté "expected". // "oui"/"non" (voir data_list.html) est le vocabulaire affiché - // partout ailleurs pour un champ booléen — une valeur de comparaison - // fixe tapée "Oui" doit donc être reconnue vraie ici aussi, pas - // seulement "1"/"true" (et insensible à la casse, aligné avec - // _compare() côté Python, voir filter_repeater_rows.py). - const expectedStr = String(expected).trim().toLowerCase(); - const e = (expected === true || ['1', 'true', 'vrai', 'oui'].includes(expectedStr)) ? 1 : 0; + // partout ailleurs pour un champ booléen — une valeur tapée "Oui" + // doit donc être reconnue vraie ici aussi, pas seulement "1"/"true" + // (et insensible à la casse, aligné avec _compare() côté Python). + const normalizeBool = function (v) { + if (v === true) return 1; + if (v === false || v === null || v === undefined) return 0; + return ['1', 'true', 'vrai', 'oui'].includes(String(v).trim().toLowerCase()) ? 1 : 0; + }; + const a = normalizeBool(actual); + const e = normalizeBool(expected); return operator === 'different' ? a !== e : a === e; } const an = parseFloat(actual), en = parseFloat(expected); @@ -49,9 +57,16 @@ function compareValues(actual, operator, expected, fieldType) { } const as = (actual === undefined || actual === null) ? '' : String(actual); const es = (expected === undefined || expected === null) ? '' : String(expected); + // "egal"/"different" insensibles à la casse (bug corrigé : une valeur de + // comparaison texte tapée avec une casse différente de la valeur réelle + // — ex. "Vrai" vs "vrai" — était jugée différente à tort, alors que le + // créateur/l'IA n'a aucun moyen de connaître la casse EXACTE attendue). + // superieur/inferieur restent une comparaison lexicographique brute + // (l'ordre alphabétique dépend de la casse, hors du champ de ce bug). + const asLower = as.toLowerCase(), esLower = es.toLowerCase(); switch (operator) { - case 'egal': return as === es; - case 'different': return as !== es; + case 'egal': return asLower === esLower; + case 'different': return asLower !== esLower; case 'superieur': return as > es; case 'inferieur': return as < es; case 'superieur_egal': return as >= es; diff --git a/static/js/scenes/global-variables.js b/static/js/scenes/global-variables.js new file mode 100644 index 00000000..2d5db2f3 --- /dev/null +++ b/static/js/scenes/global-variables.js @@ -0,0 +1,67 @@ +// ---------- Onglet "Variables" — CRUD en AJAX ---------- +// Demande explicite : modifier/supprimer une variable rechargeait toute +// la page (formulaires classiques + navigation pjax) — remplacé par de +// vrais appels fetch(), sans jamais recharger ni naviguer. + +// Enregistre automatiquement dès qu'un champ (type/valeur) change — plus +// besoin d'un bouton "Enregistrer" séparé (demande explicite : "que la +// modification s'enregistre automatiquement"). +function saveGlobalVariable(varId) { + var row = document.querySelector('tr[data-var-row="' + varId + '"]'); + if (!row) return; + var type = row.querySelector('select[name="type"]').value; + var value = row.querySelector('input[name="value"]').value; + var status = document.getElementById('varSaveStatus' + varId); + var body = new FormData(); + body.append('type', type); + body.append('value', value); + fetch('/game/' + GAME_SLUG + '/variables/' + varId + '/edit', { + method: 'POST', headers: { 'X-Requested-With': 'fetch' }, body: body, + }) + .then(function (r) { + if (!r.ok) { window.location.reload(); return; } + if (status) { + status.textContent = 'Enregistré ✓'; + setTimeout(function () { status.textContent = ''; }, 2000); + } + }) + .catch(function () { window.location.reload(); }); +} + +function deleteGlobalVariable(varId, name) { + if (!confirm('Supprimer la variable « ' + name + ' » ? Toute condition/action qui la référence encore cessera de fonctionner.')) return; + var body = new FormData(); + fetch('/game/' + GAME_SLUG + '/variables/' + varId + '/delete', { + method: 'POST', headers: { 'X-Requested-With': 'fetch' }, body: body, + }) + .then(function (r) { + if (!r.ok) { window.location.reload(); return; } + var row = document.querySelector('tr[data-var-row="' + varId + '"]'); + if (row) row.remove(); + var body2 = document.getElementById('globalVariablesBody'); + var emptyHint = document.getElementById('globalVariablesEmptyHint'); + if (body2 && emptyHint) emptyHint.style.display = body2.children.length ? 'none' : ''; + }) + .catch(function () { window.location.reload(); }); +} + +function createGlobalVariable(event) { + event.preventDefault(); + var form = event.target; + var body = new FormData(form); + fetch('/game/' + GAME_SLUG + '/variables/new', { + method: 'POST', headers: { 'X-Requested-With': 'fetch' }, body: body, + }) + .then(function (r) { return r.ok ? r.json() : Promise.reject(); }) + .then(function (json) { + if (!json.row_html) { window.location.reload(); return; } + var tbody = document.getElementById('globalVariablesBody'); + tbody.insertAdjacentHTML('beforeend', json.row_html); + var emptyHint = document.getElementById('globalVariablesEmptyHint'); + if (emptyHint) emptyHint.style.display = 'none'; + form.reset(); + form.style.display = 'none'; // même comportement que toggleDashCreate() après création + }) + .catch(function () { window.location.reload(); }); + return false; +} diff --git a/static/js/scenes/scene-editor.js b/static/js/scenes/scene-editor.js index 96fa1f72..d38a2584 100644 --- a/static/js/scenes/scene-editor.js +++ b/static/js/scenes/scene-editor.js @@ -16,11 +16,14 @@ // automatiquement sélectionné/ouvert dans le panneau de propriétés (voir // onSceneObjectMouseDown, qui recharge encore la page pour ça) — juste // posé sur le canevas, cliquable ensuite comme n'importe quel autre. -function addSceneObject(kind, forgeCharacter, backgroundSlug) { +function addSceneObject(kind, forgeCharacter, backgroundSlug, assetId) { var body = new FormData(); body.append('kind', kind); if (forgeCharacter) body.append('forge_character', forgeCharacter); if (backgroundSlug) body.append('background_slug', backgroundSlug); + // "Mes assets" (voir auth/user_assets_dir.py) : une image importée par + // le créateur ou générée par l'IA, distincte de BACKGROUND_LIBRARY. + if (assetId) body.append('asset_id', assetId); fetch("/game/" + GAME_SLUG + "/screens/" + SCREEN_ID + "/scene-objects/add", { method: 'POST', headers: { 'X-Requested-With': 'fetch' }, body: body, }) @@ -62,6 +65,21 @@ function addSceneObject(kind, forgeCharacter, backgroundSlug) { .catch(function () { window.location.reload(); }); } +// "Mes assets" (voir routes/assets/upload_user_asset.py, panneau "Mes +// assets" de scene_edit.html) : un simple rechargement après l'upload — +// la galerie est rendue côté serveur (user_assets), pas la peine de la +// reconstruire en JS pour un flux qui n'arrive pas souvent. +function uploadUserAsset(inputEl) { + var file = inputEl.files && inputEl.files[0]; + if (!file) return; + var body = new FormData(); + body.append('file', file); + fetch('/assets/upload', { method: 'POST', body: body }) + .then(function (r) { return r.json(); }) + .then(function () { window.location.reload(); }) + .catch(function () { window.location.reload(); }); +} + // AJAX (voir routes/scenes/scene_object_delete.py) : bouton 🗑️ du panneau // de propriétés (toujours l'objet SÉLECTIONNÉ, seul cas où ce bouton est // affiché) — supprime l'objet SANS recharger la page ni même redemander diff --git a/static/js/screen_edit/tree-panels.js b/static/js/screen_edit/tree-panels.js index b0df3276..a77f1ab6 100644 --- a/static/js/screen_edit/tree-panels.js +++ b/static/js/screen_edit/tree-panels.js @@ -556,6 +556,13 @@ function refreshBuilderPanel(selectedId) { // aperçu animé des personnages) — rien à faire ici pour l'éditeur // document, où cette fonction n'existe simplement pas. if (typeof initSceneBuilderPanel === "function") initSceneBuilderPanel(); + // Bug corrigé : #builder3 contient AUSSI les onglets "Déclencheurs" + // et "Générer avec l'IA" (composants JS, pas de simple HTML statique) + // — curBuilder.innerHTML = ... ne réexécute aucun script, et sans cet + // appel explicite leur contenu restait vide (jusqu'à un vrai + // rechargement de page) dès qu'on sélectionnait un objet de la scène. + if (typeof initTriggersTab === "function") initTriggersTab(); + if (typeof initIaTab === "function") initIaTab(); }) .catch(function () { // Échec réseau : on retombe sur une vraie navigation plutôt que de diff --git a/static/pjax.js b/static/pjax.js index 7ed7377b..3744c6ca 100644 --- a/static/pjax.js +++ b/static/pjax.js @@ -31,6 +31,20 @@ } function runScriptsIn(container) { + // Bug corrigé : un + + {% endblock %} diff --git a/tests/conftest.py b/tests/conftest.py index 534d34f3..1b991959 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -24,6 +24,10 @@ sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) _TEST_AUTH_DIR = tempfile.mkdtemp(prefix="forge_test_auth_") os.environ["FORGE_USERS_DB_PATH"] = os.path.join(_TEST_AUTH_DIR, "users.db") os.environ["FORGE_SECRET_KEY_PATH"] = os.path.join(_TEST_AUTH_DIR, "secret_key") +# "Mes assets" (voir auth/user_assets_dir.py, db/constants.py::USER_ASSETS_DIR) : +# même raison que FORGE_USERS_DB_PATH ci-dessus — jamais écrire dans le +# vrai user_assets/ du poste pendant les tests. +os.environ["FORGE_USER_ASSETS_DIR"] = os.path.join(_TEST_AUTH_DIR, "user_assets") import pytest @@ -37,6 +41,17 @@ from core import recovery_codes_flash # noqa: F401 - enregistre pop_recovery_co import auth import db +# Onglet "IA" (voir ai/) : jamais un vrai appel réseau depuis les tests, +# même si un .env réel existe sur ce poste avec de vraies clés — +# load_dotenv() (core.flask_app, importé ci-dessus) les aurait déjà +# chargées dans os.environ à ce stade ; on les retire explicitement pour +# que CHAQUE test parte de "IA non configurée" par défaut. Un test qui +# veut simuler une IA configurée monkeypatche directement +# ai.client.get_client/ai.scenario_client.generate_image_url — jamais via +# une vraie clé, quel que soit le contenu du .env local. +for _ai_env_key in ("ANTHROPIC_API_KEY", "SCENARIO_API_KEY", "SCENARIO_API_SECRET", "SCENARIO_MODEL_ID"): + os.environ.pop(_ai_env_key, None) + # Un seul compte admin pour toute la session de tests : les ~80 routes # existantes s'attendent (comportement d'avant l'authentification) à un # accès sans restriction — "admin" est le seul rôle illimité (voir diff --git a/tests/test_ai_chat.py b/tests/test_ai_chat.py new file mode 100644 index 00000000..3dd807cb --- /dev/null +++ b/tests/test_ai_chat.py @@ -0,0 +1,160 @@ +"""ai/chat.py — la boucle tool-use (voir plan Phase 2, §5). Jamais un +vrai appel à l'API Claude ici : client.messages.create est monkeypatché +par une fausse classe qui rejoue une séquence de réponses programmée.""" +import ai +import db +import screens + + +def _create_jeu2d_game_with_conversation(client, tmp_game_slug_cleanup, name="pytest_ai_chat"): + resp = client.post("/games/new", data={"name": name}, follow_redirects=False) + slug = tmp_game_slug_cleanup(resp.headers["Location"].rstrip("/").split("/")[-1]) + screen_id = screens.create_screen(slug, "Scène 1", kind="jeu_2d") + conversation_id = screens.create_ia_conversation(slug, screen_id) + return slug, screen_id, conversation_id + + +class _FakeBlock: + def __init__(self, type, text=None, id=None, name=None, input=None): + self.type = type + self.text = text + self.id = id + self.name = name + self.input = input or {} + + +class _FakeResponse: + def __init__(self, content, stop_reason): + self.content = content + self.stop_reason = stop_reason + + +class _FakeMessages: + def __init__(self, responses): + self._responses = list(responses) + self.call_count = 0 + self.last_kwargs = None + + def create(self, **kwargs): + self.call_count += 1 + self.last_kwargs = kwargs + if len(self._responses) > 1: + return self._responses.pop(0) + return self._responses[0] # rejoue la dernière indéfiniment (voir test de la borne) + + +class _FakeClient: + def __init__(self, responses): + self.messages = _FakeMessages(responses) + + +def test_run_chat_turn_returns_text_directly_when_no_tool_is_used(client, tmp_game_slug_cleanup, monkeypatch): + slug, screen_id, conversation_id = _create_jeu2d_game_with_conversation(client, tmp_game_slug_cleanup) + fake_client = _FakeClient([_FakeResponse([_FakeBlock("text", text="Bonjour, que veux-tu créer ?")], "end_turn")]) + monkeypatch.setattr("ai.chat.get_client", lambda: fake_client) + + reply = ai.run_chat_turn(slug, screen_id, conversation_id, 1, "Salut") + assert reply == "Bonjour, que veux-tu créer ?" + assert fake_client.messages.call_count == 1 + + +def test_run_chat_turn_dispatches_a_tool_call_then_returns_the_final_text(client, tmp_game_slug_cleanup, monkeypatch): + slug, screen_id, conversation_id = _create_jeu2d_game_with_conversation(client, tmp_game_slug_cleanup) + tool_use_response = _FakeResponse( + [_FakeBlock("tool_use", id="t1", name="create_global_variable", input={"name": "score_ia", "var_type": "nombre_entier"})], + "tool_use", + ) + final_response = _FakeResponse([_FakeBlock("text", text="Variable créée.")], "end_turn") + fake_client = _FakeClient([tool_use_response, final_response]) + monkeypatch.setattr("ai.chat.get_client", lambda: fake_client) + + reply = ai.run_chat_turn(slug, screen_id, conversation_id, 1, "Crée une variable score_ia") + assert reply == "Variable créée." + names = [v["name"] for v in db.list_global_variables(slug)] + assert "score_ia" in names + + +def test_run_chat_turn_stops_after_the_max_iterations_even_if_claude_keeps_calling_tools(client, tmp_game_slug_cleanup, monkeypatch): + slug, screen_id, conversation_id = _create_jeu2d_game_with_conversation(client, tmp_game_slug_cleanup) + always_tool_use = _FakeResponse( + [_FakeBlock("tool_use", id="t1", name="create_global_variable", input={"name": "boucle_infinie"})], + "tool_use", + ) + fake_client = _FakeClient([always_tool_use]) + monkeypatch.setattr("ai.chat.get_client", lambda: fake_client) + + reply = ai.run_chat_turn(slug, screen_id, conversation_id, 1, "Fais quelque chose") + assert fake_client.messages.call_count == ai.chat._MAX_TOOL_ITERATIONS + assert reply == "(pas de réponse textuelle)" + + +def test_run_chat_turn_explains_when_cut_short_by_max_tokens(client, tmp_game_slug_cleanup, monkeypatch): + """Bug corrigé : max_tokens=4096 pouvait couper Claude EN PLEINE + RÉFLEXION sur une demande riche, avant le moindre appel d'outil — + symptôme observé : "(pas de réponse textuelle)" dès le premier tour, + aucune progression. Message désormais plus clair pour le créateur.""" + slug, screen_id, conversation_id = _create_jeu2d_game_with_conversation(client, tmp_game_slug_cleanup) + cut_short = _FakeResponse([], "max_tokens") # aucun bloc texte, coupé en cours de réflexion + fake_client = _FakeClient([cut_short]) + monkeypatch.setattr("ai.chat.get_client", lambda: fake_client) + + reply = ai.run_chat_turn(slug, screen_id, conversation_id, 1, "Fais quelque chose de complexe") + assert "interrompue" in reply + assert fake_client.messages.call_count == 1 # stop_reason != "tool_use" -> sort dès le premier tour + + +def test_run_chat_turn_uses_a_generous_max_tokens_not_the_old_lowballed_value(client, tmp_game_slug_cleanup, monkeypatch): + slug, screen_id, conversation_id = _create_jeu2d_game_with_conversation(client, tmp_game_slug_cleanup) + fake_client = _FakeClient([_FakeResponse([_FakeBlock("text", text="ok")], "end_turn")]) + monkeypatch.setattr("ai.chat.get_client", lambda: fake_client) + + ai.run_chat_turn(slug, screen_id, conversation_id, 1, "Salut") + assert fake_client.messages.last_kwargs["max_tokens"] >= 16000 + + +def test_run_chat_turn_raises_when_anthropic_is_not_configured(client, tmp_game_slug_cleanup): + slug, screen_id, conversation_id = _create_jeu2d_game_with_conversation(client, tmp_game_slug_cleanup) + try: + ai.run_chat_turn(slug, screen_id, conversation_id, 1, "Salut") + assert False, "devrait lever AnthropicNotConfiguredError" + except ai.AnthropicNotConfiguredError: + pass + + +# ---------- État de scène ré-injecté à chaque tour (bug corrigé : Ruby +# dupliquait des objets faute de voir ce qui existait déjà) ---------- + +def test_describe_scene_state_reports_dimensions_and_no_objects(client, tmp_game_slug_cleanup): + slug, screen_id, _ = _create_jeu2d_game_with_conversation(client, tmp_game_slug_cleanup) + description = ai.chat._describe_scene_state(slug, screen_id) + assert "0 à 960" in description and "0 à 540" in description + assert "Aucun objet" in description + + +def test_describe_scene_state_lists_existing_objects_with_role_and_trigger_flag(client, tmp_game_slug_cleanup): + slug, screen_id, _ = _create_jeu2d_game_with_conversation(client, tmp_game_slug_cleanup) + player_id = screens.add_scene_object(slug, screen_id, kind="personnage") + screens.set_scene_object_role(slug, player_id, "joueur") + pnj_id = screens.add_scene_object(slug, screen_id, kind="personnage") + screens.set_scene_object_collision_rules(slug, pnj_id, screens.sanitize_collision_rules([ + {"trigger": "collision", "action": {"type": "dialogue", "dialogue": {"id": "d_1", "lines": []}}}, + ])) + + description = ai.chat._describe_scene_state(slug, screen_id) + assert f"id={player_id}" in description + assert "rôle=joueur" in description + assert f"id={pnj_id}" in description + assert "rôle=pnj" in description + assert "[déclencheur déjà configuré]" in description + + +def test_run_chat_turn_passes_the_scene_state_in_the_system_prompt(client, tmp_game_slug_cleanup, monkeypatch): + slug, screen_id, conversation_id = _create_jeu2d_game_with_conversation(client, tmp_game_slug_cleanup) + screens.add_scene_object(slug, screen_id, kind="personnage") + fake_client = _FakeClient([_FakeResponse([_FakeBlock("text", text="ok")], "end_turn")]) + monkeypatch.setattr("ai.chat.get_client", lambda: fake_client) + + ai.run_chat_turn(slug, screen_id, conversation_id, 1, "Salut") + system_prompt = fake_client.messages.last_kwargs["system"] + assert "0 à 960" in system_prompt and "0 à 540" in system_prompt + assert "1 objet(s)" in system_prompt diff --git a/tests/test_ai_client.py b/tests/test_ai_client.py new file mode 100644 index 00000000..dac844cd --- /dev/null +++ b/tests/test_ai_client.py @@ -0,0 +1,19 @@ +"""ai/client.py — voir plan Phase 2, §2 : une clé absente est une +configuration incomplète (AnthropicNotConfiguredError), jamais un crash +brut ni une vraie clé nécessaire pour faire tourner ce test (voir +tests/conftest.py, qui retire ANTHROPIC_API_KEY avant chaque test).""" +import ai + + +def test_get_client_raises_when_the_api_key_is_missing(): + try: + ai.get_client() + assert False, "devrait lever AnthropicNotConfiguredError" + except ai.AnthropicNotConfiguredError: + pass + + +def test_get_client_returns_a_client_when_the_api_key_is_set(monkeypatch): + monkeypatch.setenv("ANTHROPIC_API_KEY", "sk-ant-fake-key-for-tests") + client = ai.get_client() + assert client is not None diff --git a/tests/test_ai_scenario_client.py b/tests/test_ai_scenario_client.py new file mode 100644 index 00000000..158e4ec1 --- /dev/null +++ b/tests/test_ai_scenario_client.py @@ -0,0 +1,74 @@ +"""ai/scenario_client.py — voir plan Phase 2, §3 : jamais un vrai appel +réseau ici (requests.post/get monkeypatchés), et une configuration +incomplète (clé/secret/modèle absents) doit échouer proprement AVANT +toute tentative réseau.""" +import ai +from ai.scenario_client import generate_image_url + + +def test_generate_image_url_raises_when_not_configured(): + try: + generate_image_url("un bureau moderne") + assert False, "devrait lever ScenarioNotConfiguredError" + except ai.ScenarioNotConfiguredError: + pass + + +class _FakeResponse: + def __init__(self, json_data): + self._json = json_data + + def raise_for_status(self): + pass + + def json(self): + return self._json + + +def test_generate_image_url_polls_until_success_then_returns_the_asset_url(monkeypatch): + monkeypatch.setenv("SCENARIO_API_KEY", "fake-key") + monkeypatch.setenv("SCENARIO_API_SECRET", "fake-secret") + monkeypatch.setenv("SCENARIO_MODEL_ID", "fake-model") + + calls = {"jobs": 0} + + def fake_post(url, auth=None, json=None, timeout=None): + assert url.endswith("/generate/txt2img") + assert json["prompt"] == "un bureau moderne" + assert json["modelId"] == "fake-model" + return _FakeResponse({"job": {"jobId": "job_1"}}) + + def fake_get(url, auth=None, timeout=None): + if "/jobs/" in url: + calls["jobs"] += 1 + # Simule un job encore en cours au premier appel, réussi ensuite. + status = "running" if calls["jobs"] == 1 else "success" + body = {"job": {"status": status}} + if status == "success": + body["job"]["metadata"] = {"assetIds": ["asset_1"]} + return _FakeResponse(body) + assert url.endswith("/assets/asset_1") + return _FakeResponse({"asset": {"url": "https://scenario.example/final.png"}}) + + monkeypatch.setattr("ai.scenario_client.requests.post", fake_post) + monkeypatch.setattr("ai.scenario_client.requests.get", fake_get) + monkeypatch.setattr("ai.scenario_client.time.sleep", lambda s: None) + + url = generate_image_url("un bureau moderne") + assert url == "https://scenario.example/final.png" + assert calls["jobs"] == 2 + + +def test_generate_image_url_raises_on_job_failure(monkeypatch): + monkeypatch.setenv("SCENARIO_API_KEY", "fake-key") + monkeypatch.setenv("SCENARIO_API_SECRET", "fake-secret") + monkeypatch.setenv("SCENARIO_MODEL_ID", "fake-model") + + monkeypatch.setattr("ai.scenario_client.requests.post", lambda *a, **k: _FakeResponse({"job": {"jobId": "job_1"}})) + monkeypatch.setattr("ai.scenario_client.requests.get", lambda *a, **k: _FakeResponse({"job": {"status": "failure"}})) + + try: + generate_image_url("un bureau") + assert False, "devrait lever ScenarioGenerationError" + except ai.ScenarioGenerationError: + pass diff --git a/tests/test_ai_tools.py b/tests/test_ai_tools.py new file mode 100644 index 00000000..6d469b21 --- /dev/null +++ b/tests/test_ai_tools.py @@ -0,0 +1,315 @@ +"""Couche outils IA (voir plan Phase 1, §4 — ai/tools.py) : chaque +dispatch doit appeler DIRECTEMENT la fonction screens.*/db.* existante +(jamais une structure parallèle), et les schémas doivent suivre les +constantes SOURCE plutôt qu'une copie littérale (principe validé avec +l'utilisateur : une nouvelle valeur d'énum doit suivre automatiquement).""" +import ai +import auth +import db +import screens +from ai.tools import TOOLS, dispatch_tool + + +def _tool(name): + return next(t for t in TOOLS if t["name"] == name) + + +def _create_jeu2d_game(client, tmp_game_slug_cleanup, name="pytest_ai_tools"): + resp = client.post("/games/new", data={"name": name}, follow_redirects=False) + slug = tmp_game_slug_cleanup(resp.headers["Location"].rstrip("/").split("/")[-1]) + screen_id = screens.create_screen(slug, "Scène 1", kind="jeu_2d") + return slug, screen_id + + +def test_dispatch_add_scene_object_calls_the_real_function(client, tmp_game_slug_cleanup): + slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) + result = dispatch_tool(slug, screen_id, 1, "add_scene_object", {"kind": "decor", "image_url": "/assets/1/x.png"}) + obj = screens.get_scene_object(slug, result["object_id"]) + assert obj["kind"] == "decor" + assert obj["attributes"]["src"] == "/assets/1/x.png" + + +def test_dispatch_add_scene_object_with_background_slug_uses_the_library_image(client, tmp_game_slug_cleanup): + slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) + with client.session_transaction() as sess: + admin_id = sess["user_id"] + bg_slug = next(iter(screens.BACKGROUND_LIBRARY)) + result = dispatch_tool(slug, screen_id, admin_id, "add_scene_object", {"kind": "fond", "background_slug": bg_slug}) + obj = screens.get_scene_object(slug, result["object_id"]) + assert obj["attributes"]["src"] == screens.BACKGROUND_LIBRARY[bg_slug]["url"] + + +def test_dispatch_add_scene_object_raises_for_an_unknown_background_slug(client, tmp_game_slug_cleanup): + """Bug corrigé : un slug inventé/mal orthographié par Claude était + ignoré en silence (screens.add_scene_object, pensé pour un , pas un + # champ texte libre, voir static/js/triggers/trigger-editor.js). + # Optionnel : une réplique reste valide sans voix off. + audio_url = raw_line.get("audio_url") + if isinstance(audio_url, str) and audio_url.strip(): + line["audio_url"] = audio_url.strip() + return line def _sanitize_question_line(raw_line): diff --git a/requirements.txt b/requirements.txt index 40a623ce..7334b0ee 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,3 +9,8 @@ qrcode==8.2 anthropic==1.4.0 requests==2.34.2 python-dotenv==1.2.3 +# "Mes assets" — validation de la durée d'un son uploadé (voir +# routes/assets/upload_user_asset.py) : lit la durée d'un fichier audio +# quel que soit son format (mp3/wav/ogg/m4a/...) sans dépendance +# compilée (pur Python). +mutagen==1.48.1 diff --git a/routes/assets/__init__.py b/routes/assets/__init__.py index 60745d2e..5959703a 100644 --- a/routes/assets/__init__.py +++ b/routes/assets/__init__.py @@ -1 +1 @@ -from . import upload_user_asset, serve_user_asset +from . import upload_user_asset, serve_user_asset, delete_user_asset, set_user_asset_scene_kind diff --git a/routes/assets/delete_user_asset.py b/routes/assets/delete_user_asset.py new file mode 100644 index 00000000..bbd73929 --- /dev/null +++ b/routes/assets/delete_user_asset.py @@ -0,0 +1,17 @@ +from flask import g, jsonify + +import auth + +from core.flask_app import app + + +@app.route("/assets/", methods=["DELETE"]) +def delete_user_asset_route(asset_id): + """Supprime un fichier de "Mes assets" (demande explicite : "voir, + utiliser ou supprimer des son, image et vidéo") — auth.delete_user_asset + vérifie déjà que `asset_id` appartient bien au compte connecté avant + de toucher au disque/à la base, jamais fourni tel quel.""" + ok = auth.delete_user_asset(asset_id, g.current_user["id"]) + if not ok: + return jsonify({"error": "Fichier introuvable"}), 404 + return jsonify({"ok": True}) diff --git a/routes/assets/set_user_asset_scene_kind.py b/routes/assets/set_user_asset_scene_kind.py new file mode 100644 index 00000000..03630990 --- /dev/null +++ b/routes/assets/set_user_asset_scene_kind.py @@ -0,0 +1,21 @@ +from flask import g, request, jsonify + +import auth + +from core.flask_app import app + + +@app.route("/assets//scene-kind", methods=["POST"]) +def set_user_asset_scene_kind_route(asset_id): + """Reclasse une image "Mes assets" entre "Fonds" et "Décors/objets" + sans avoir à la ré-importer (voir auth/update_user_asset_scene_kind.py + — diagnostiqué depuis un "décalage" signalé par le créateur : une + image importée avant la séparation fond/décor, ou via le mauvais + bouton, restait bloquée dans la mauvaise section).""" + scene_kind = request.get_json(force=True).get("scene_kind") + if scene_kind not in ("decor", "fond"): + return jsonify({"error": "Type invalide"}), 400 + ok = auth.update_user_asset_scene_kind(asset_id, g.current_user["id"], scene_kind) + if not ok: + return jsonify({"error": "Fichier introuvable"}), 404 + return jsonify({"ok": True}) diff --git a/routes/assets/upload_user_asset.py b/routes/assets/upload_user_asset.py index 28b86d7f..1ed9a72f 100644 --- a/routes/assets/upload_user_asset.py +++ b/routes/assets/upload_user_asset.py @@ -19,8 +19,39 @@ def upload_user_asset(): if not f or not f.filename: return jsonify({"error": "Aucun fichier reçu"}), 400 ext = "".join(c for c in os.path.splitext(f.filename)[1].lower() if c.isalnum() or c == ".")[:10] + content = f.read() + file_kind = auth.user_asset_kind(f.filename) + # Un son ne doit jamais dépasser 3 minutes (demande explicite, voir + # auth/validate_audio_duration.py) — vérifié sur le CONTENU réel du + # fichier (mutagen lit ses métadonnées), jamais sur une durée + # annoncée par le client, qui ne serait pas fiable. + if file_kind == "audio": + error = auth.validate_audio_duration(content) + if error: + return jsonify({"error": error}), 400 + # Une vidéo ne doit jamais dépasser 5 minutes, et SEUL le format MP4 + # est accepté (demande explicite) — mutagen (qui lit déjà la durée + # d'un son ci-dessus) ne sait fiablement lire la durée que du + # conteneur MP4/MOV, jamais de webm/avi ; sans cette restriction, + # d'autres extensions passeraient la limite de durée sans jamais être + # vérifiées. + if file_kind == "video": + if ext != ".mp4": + return jsonify({"error": "Seul le format MP4 est accepté pour une vidéo."}), 400 + error = auth.validate_video_duration(content, filename=f.filename) + if error: + return jsonify({"error": error}), 400 + # "decor"/"fond" (demande explicite : "un bouton d'import séparé pour + # les images de fond et les objets") — décide comment un clic sur la + # tuile pose l'objet (voir screens/scenes/add_scene_object.py). Sans + # objet ("son"/"vidéo"), le champ n'a pas de sens : jamais transmis. + scene_kind = None + if file_kind == "image": + scene_kind = request.form.get("scene_kind") + if scene_kind not in ("decor", "fond"): + scene_kind = "decor" user_id = g.current_user["id"] - asset_id, filename = auth.save_user_asset(user_id, f.read(), ext, original_name=f.filename, source="upload") + asset_id, filename = auth.save_user_asset(user_id, content, ext, original_name=f.filename, source="upload", scene_kind=scene_kind) return jsonify({ "id": asset_id, "url": url_for("serve_user_asset", user_id=user_id, filename=filename), diff --git a/routes/scenes/scene_edit_view.py b/routes/scenes/scene_edit_view.py index a54433e1..ef73c0bb 100644 --- a/routes/scenes/scene_edit_view.py +++ b/routes/scenes/scene_edit_view.py @@ -1,6 +1,6 @@ import json -from flask import render_template, request, abort, g +from flask import render_template, request, abort, g, url_for import auth import db @@ -85,7 +85,33 @@ def render_scene_edit(slug, screen_id, game): # "Mes assets" (voir auth/user_assets_dir.py) : par COMPTE, jamais # filtré par rôle contrairement à sprite_library/background_library # ci-dessus (rien à voir avec le catalogue Forge réservé à l'admin). - user_assets = auth.list_user_assets(g.current_user["id"]) + all_user_assets = auth.list_user_assets(g.current_user["id"]) + # Sélecteur "asset_url" des actions "son"/"vidéo" (voir static/js/ + # scenes/collision-rules-editor.js) — TOUS les assets (pas seulement + # les images) : url_for calculée ici (pas possible côté JS), le reste + # (id, nom) sert juste à l'affichage. + for a in all_user_assets: + a["url"] = url_for("serve_user_asset", user_id=a["user_id"], filename=a["filename"]) + a["kind"] = auth.user_asset_kind(a["filename"]) + user_assets_options = [ + {"id": a["id"], "url": a["url"], "name": a["original_name"] or a["filename"], "kind": a["kind"]} + for a in all_user_assets + ] + # "Mes assets" : sous-sections Fonds/Décors/Sons/Vidéos (demande + # explicite : "voir, utiliser ou supprimer des son, image et vidéo", + # PUIS "un bouton d'import séparé pour les images de fond et les + # objets" — sans ça, un clic posait TOUJOURS l'image en kind="decor", + # jamais en "fond", voir screens/scenes/add_scene_object.py). Une + # image importée AVANT ce réglage (scene_kind NULL) retombe sur + # "decor", comportement inchangé. Les sons/vidéos ne posent rien sur + # la scène (ils s'utilisent depuis le sélecteur de fichier des + # actions "son"/"vidéo", voir user_assets_options ci-dessus) — les + # quatre listent néanmoins un bouton "Supprimer" (voir + # deleteUserAsset(), static/js/scenes/scene-editor.js). + user_assets_fond = [a for a in all_user_assets if a["kind"] == "image" and a["scene_kind"] == "fond"] + user_assets_decor = [a for a in all_user_assets if a["kind"] == "image" and a["scene_kind"] != "fond"] + user_assets_audio = [a for a in all_user_assets if a["kind"] == "audio"] + user_assets_video = [a for a in all_user_assets if a["kind"] == "video"] return render_template( "scene_edit.html", @@ -101,7 +127,8 @@ def render_scene_edit(slug, screen_id, game): sprite_library=sprite_library, sprite_library_families=sprite_library_families, sprite_library_json=json.dumps(sprite_library), background_library=background_library, - user_assets=user_assets, + user_assets_fond=user_assets_fond, user_assets_decor=user_assets_decor, + user_assets_audio=user_assets_audio, user_assets_video=user_assets_video, element_animations_map_json=json.dumps(element_animations_map), element_orientation_values=screens.ELEMENT_ORIENTATION_VALUES, element_orientation_labels_json=json.dumps(screens.ELEMENT_ORIENTATION_LABELS), @@ -134,4 +161,12 @@ def render_scene_edit(slug, screen_id, game): # donnés à N'IMPORTE QUEL objet de scène (personnage, décor, # fond), toutes scènes du jeu confondues. scene_object_names_json=json.dumps(screens.list_named_scene_object_names(slug)), + # Nouveaux déclencheurs/actions (voir screens/rendering/ + # collision_rules.py, screens/rendering/screen_triggers.py) : + # vocabulaire des nouvelles actions feuilles + assets disponibles + # pour "son"/"vidéo", posés en JS comme le reste ci-dessus. + surbrillance_labels_json=json.dumps(screens.SURBRILLANCE_LABELS), + video_mode_labels_json=json.dumps(screens.VIDEO_MODE_LABELS), + user_assets_options_json=json.dumps(user_assets_options), + screen_triggers=screens.resolve_screen_triggers(screen), ) diff --git a/routes/scenes/scene_object_add.py b/routes/scenes/scene_object_add.py index e00a1de2..32ef2064 100644 --- a/routes/scenes/scene_object_add.py +++ b/routes/scenes/scene_object_add.py @@ -29,11 +29,19 @@ def scene_object_add(slug, screen_id): forge_character = request.form.get("forge_character") background_slug = request.form.get("background_slug") asset_id = request.form.get("asset_id", type=int) + # Vrai glisser-déposer depuis la galerie (demande explicite : "n'importe + # où sur la scène", voir static/js/scenes/scene-editor.js::onCanvasDrop) + # — position EXACTE du dépôt, en pixels "monde" déjà calculés côté + # client (pas de zoom sur #canvas, voir onCanvasDrop). Absents pour un + # simple clic sur la galerie (comportement par défaut inchangé). + drop_x = request.form.get("x", type=float) + drop_y = request.form.get("y", type=float) if forge_character: forbid_admin_only_character(forge_character) if background_slug: forbid_admin_only_background(background_slug) image_url = None + image_width = image_height = None if asset_id: # "Mes assets" (voir auth/user_assets_dir.py) : isolation stricte # par propriétaire, même esprit que les projets (core/auth_guard.py) @@ -42,10 +50,49 @@ def scene_object_add(slug, screen_id): if not asset or asset["user_id"] != g.current_user["id"]: abort(403) image_url = url_for("serve_user_asset", user_id=asset["user_id"], filename=asset["filename"]) + if kind == "fond": + # Sans ça, un "fond" importé (contrairement à un fond du + # catalogue Forge, voir background_library.py) retombait + # TOUJOURS sur 128×128 (les valeurs par défaut du schéma) — + # trop petit pour agrandir le "monde" au-delà du champ de la + # caméra, rendant impossible d'y poser un objet en dehors de + # ce champ (voir screens.resolve_scene_world_size). Un "decor" + # n'en a pas besoin (demande explicite : toujours 200×200 à la + # pose, voir add_scene_object.py::_DECOR_DEFAULT_SIZE). + import os + path = os.path.join(auth.user_assets_dir(asset["user_id"]), asset["filename"]) + try: + with open(path, "rb") as fh: + dims = auth.image_dimensions(fh.read()) + except OSError: + dims = None + if dims: + image_width, image_height = dims + # Un "fond" reste TOUJOURS ancré au coin haut-gauche du monde (0,0), + # jamais à la position du dépôt (bug corrigé : "décalage" — le vrai + # glisser-déposer envoie une position EXACTE même pour un fond, ce qui + # le décalait du coin de la scène et laissait un bandeau de canevas vide + # visible sur le dessus/le côté). Un "decor"/"personnage" garde lui sa + # position de dépôt normale. new_id = screens.add_scene_object( slug, screen_id, kind=kind, forge_character=forge_character, background_slug=background_slug, image_url=image_url, + image_width=image_width, image_height=image_height, + x=(None if kind == "fond" else drop_x), y=(None if kind == "fond" else drop_y), ) + if drop_x is not None and drop_y is not None and kind != "fond": + # Ramène dans le cadre de la caméra si le dépôt était trop proche + # d'un bord (l'objet, une fois sa taille réelle connue, pourrait + # légèrement déborder) — même esprit que ai/tools.py:: + # _clamp_to_camera pour l'IA, ici pour un dépôt manuel. + obj_for_clamp = screens.get_scene_object(slug, new_id) + screen = screens.get_screen(slug, screen_id) + max_x = max(0, screen["scene_width"] - obj_for_clamp["width"]) + max_y = max(0, screen["scene_height"] - obj_for_clamp["height"]) + clamped_x = min(max(drop_x, 0), max_x) + clamped_y = min(max(drop_y, 0), max_y) + if (clamped_x, clamped_y) != (obj_for_clamp["x"], obj_for_clamp["y"]): + screens.update_scene_object_geometry(slug, new_id, clamped_x, clamped_y, obj_for_clamp["width"], obj_for_clamp["height"]) if request.headers.get("X-Requested-With") == "fetch": obj = screens.get_scene_object(slug, new_id) return jsonify({ diff --git a/routes/scenes/scene_object_geometry.py b/routes/scenes/scene_object_geometry.py index 2f264c21..c34df287 100644 --- a/routes/scenes/scene_object_geometry.py +++ b/routes/scenes/scene_object_geometry.py @@ -16,4 +16,14 @@ def scene_object_geometry(slug, object_id): x=float(data["x"]), y=float(data["y"]), width=float(data["width"]), height=float(data["height"]), ) - return jsonify({"ok": True}) + # Un "fond" agrandi manuellement au-delà du champ de la caméra doit + # élargir le "monde" tout de suite (voir screens.resolve_scene_world_size) + # — sans ça, rien ne rafraîchissait window.SCENE_WIDTH/SCENE_HEIGHT côté + # JS après un redimensionnement manuel (contrairement au tour de Ruby, + # voir iaChatRefreshAfterTurn() dans static/js/ia/ia-chat.js), rendant + # injoignable à la souris tout ce qui dépassait la scène nominale. + obj = screens.get_scene_object(slug, object_id) + screen = screens.get_screen(slug, obj["scene_id"]) + objects = screens.list_scene_objects(slug, obj["scene_id"]) + world_width, world_height = screens.resolve_scene_world_size(screen, objects) + return jsonify({"ok": True, "world_width": world_width, "world_height": world_height}) diff --git a/routes/screens/__init__.py b/routes/screens/__init__.py index f1ab84df..4a365076 100644 --- a/routes/screens/__init__.py +++ b/routes/screens/__init__.py @@ -1 +1 @@ -from . import screens_new, screen_rename, screen_move, screen_delete, screen_edit, screen_set_background_music, screen_set_scene_size +from . import screens_new, screen_rename, screen_move, screen_delete, screen_edit, screen_set_background_music, screen_set_scene_size, screen_triggers diff --git a/routes/screens/screen_triggers.py b/routes/screens/screen_triggers.py new file mode 100644 index 00000000..cb048a9c --- /dev/null +++ b/routes/screens/screen_triggers.py @@ -0,0 +1,132 @@ +from flask import jsonify, request + +import screens + +from core.flask_app import app + + +@app.route("/game//screens//triggers", methods=["GET"]) +def screen_triggers_get(slug, screen_id): + """Déclencheurs D'ÉCRAN de CET écran (voir "Déclencheurs de l'écran", + screens/rendering/screen_triggers.py) — SANS objet requis, pour de la + narration/cinématique dès l'affichage.""" + screen = screens.get_screen(slug, screen_id) + if screen is None: + return jsonify({"error": "écran introuvable"}), 404 + rules = screens.resolve_screen_triggers(screen) + # Rétro-remplissage des feuilles sans id (voir screens/rendering/ + # trigger_graph.py::list_all_triggers, même logique côté objet) — + # persisté dès ce premier affichage. + if screens.backfill_missing_leaf_ids(rules): + screens.set_screen_triggers(slug, screen_id, rules) + return jsonify(rules) + + +@app.route("/game//screens//triggers", methods=["POST"]) +def screen_triggers_add(slug, screen_id): + """Ajoute une règle "déclencheur d'écran -> action" — body {rule}, même + contrat "liste ENTIÈRE" que routes/triggers/triggers.py::triggers_add : + on recharge les règles existantes de l'écran, on y ajoute la nouvelle, + on sauvegarde la liste complète.""" + screen = screens.get_screen(slug, screen_id) + if screen is None: + return jsonify({"error": "écran introuvable"}), 404 + body = request.get_json(silent=True) or {} + new_rule = body.get("rule") + if not isinstance(new_rule, dict): + return jsonify({"error": "rule invalide"}), 400 + + rules = screens.resolve_screen_triggers(screen) + rules.append(new_rule) + sanitized = screens.sanitize_screen_triggers(rules) + screens.set_screen_triggers(slug, screen_id, sanitized) + return jsonify({"ok": True}) + + +@app.route("/game//screens//triggers", methods=["DELETE"]) +def screen_triggers_clear(slug, screen_id): + """Retire TOUTES les règles d'écran de CET écran.""" + if screens.get_screen(slug, screen_id) is None: + return jsonify({"error": "écran introuvable"}), 404 + screens.set_screen_triggers(slug, screen_id, []) + return jsonify({"ok": True}) + + +@app.route("/game//screens//triggers/", methods=["DELETE"]) +def screen_trigger_delete_one(slug, screen_id, index): + """Retire UNE SEULE règle d'écran (son index dans la liste) — + contrairement aux déclencheurs d'objet (un seul par objet en + pratique), un écran peut porter plusieurs règles "affichage" côte à + côte : la suppression doit donc cibler l'une d'elles, pas tout + vider (voir screen_triggers_clear ci-dessus, conservée pour un vidage + complet).""" + screen = screens.get_screen(slug, screen_id) + if screen is None: + return jsonify({"error": "écran introuvable"}), 404 + rules = screens.resolve_screen_triggers(screen) + if index < 0 or index >= len(rules): + return jsonify({"error": "règle introuvable"}), 404 + del rules[index] + screens.set_screen_triggers(slug, screen_id, rules) + return jsonify({"ok": True}) + + +@app.route("/game//screens//triggers/action/", methods=["DELETE"]) +def screen_trigger_remove_action(slug, screen_id, leaf_id): + """Retire UNE action précise d'un déclencheur d'écran — même contrat + que routes/triggers/triggers.py::trigger_remove_action.""" + if not screens.remove_action_from_screen_trigger(slug, screen_id, leaf_id): + return jsonify({"error": "action introuvable"}), 404 + return jsonify({"ok": True}) + + +@app.route("/game//screens//triggers/action//move", methods=["POST"]) +def screen_trigger_move_action(slug, screen_id, leaf_id): + """Déplace une action précise d'un cran ("up"/"down") dans sa chaîne, + pour un déclencheur d'écran — même contrat que + routes/triggers/triggers.py::trigger_move_action.""" + body = request.get_json(silent=True) or {} + direction = body.get("direction") + if direction not in ("up", "down"): + return jsonify({"error": "direction invalide"}), 400 + if not screens.move_action_in_screen_trigger(slug, screen_id, leaf_id, direction): + return jsonify({"error": "action introuvable"}), 404 + return jsonify({"ok": True}) + + +@app.route("/game//screens//triggers/dialogue", methods=["POST"]) +def screen_trigger_dialogue_update(slug, screen_id): + """Édition EN LIGNE des répliques d'un dialogue porté par un + déclencheur d'écran — même contrat que + routes/triggers/triggers.py::trigger_dialogue_update.""" + screen = screens.get_screen(slug, screen_id) + if screen is None: + return jsonify({"error": "écran introuvable"}), 404 + body = request.get_json(silent=True) or {} + dialogue_id = body.get("dialogue_id") + if not isinstance(dialogue_id, str) or not dialogue_id.strip(): + return jsonify({"error": "dialogue_id invalide"}), 400 + + rules = screens.resolve_screen_triggers(screen) + if not screens.set_dialogue_lines_in_rules(rules, dialogue_id, body.get("lines")): + return jsonify({"error": "dialogue introuvable"}), 404 + sanitized = screens.sanitize_screen_triggers(rules) + screens.set_screen_triggers(slug, screen_id, sanitized) + return jsonify({"ok": True}) + + +@app.route("/game//screens//triggers/append-action", methods=["POST"]) +def screen_trigger_append_action(slug, screen_id): + """"+ Ajouter une action" en bout de chaîne, pour un déclencheur + d'écran — même contrat que + routes/triggers/triggers.py::trigger_append_action.""" + if screens.get_screen(slug, screen_id) is None: + return jsonify({"error": "écran introuvable"}), 404 + body = request.get_json(silent=True) or {} + after_id = body.get("after_id") + if not isinstance(after_id, str) or not after_id.strip(): + return jsonify({"error": "after_id invalide"}), 400 + + if not screens.append_action_to_screen_trigger(slug, screen_id, after_id, body.get("action")): + return jsonify({"error": "action précédente introuvable"}), 404 + return jsonify({"ok": True}) diff --git a/routes/triggers/triggers.py b/routes/triggers/triggers.py index 3a751486..f82ee61a 100644 --- a/routes/triggers/triggers.py +++ b/routes/triggers/triggers.py @@ -89,13 +89,14 @@ def trigger_dialogue_update(slug, object_id): @app.route("/game//triggers//append-action", methods=["POST"]) def trigger_append_action(slug, object_id): - """"+ Ajouter une action" en bout de chaîne (voir screens/rendering/ - collision_rules.py::set_then_action_in_rules, static/js/triggers/ - trigger-editor.js) — body {after_id, action} : `after_id` est le - dialogue.id (feuille "dialogue") ou id (feuille "variable") de la - DERNIÈRE feuille d'une chaîne. 404 si `after_id` introuvable ou si - cette feuille a déjà un "then" (jamais écrasé par cette route — un - nouvel appel doit d'abord recharger la chaîne à jour).""" + """"+ Ajouter une action" (voir screens/rendering/collision_rules.py:: + set_then_action_in_rules, static/js/triggers/trigger-editor.js) — + body {after_id, action} : `after_id` est le dialogue.id (feuille + "dialogue") ou id (toute autre feuille) de N'IMPORTE QUEL bloc de la + chaîne, pas forcément le dernier — la nouvelle action s'INSÈRE juste + après lui, une suite déjà présente passant derrière elle (demande + explicite : "pouvoir ajouter n'importe quelle action à n'importe quel + niveau du schéma"). 404 seulement si `after_id` est introuvable.""" if screens.get_scene_object(slug, object_id) is None: return jsonify({"error": "objet introuvable"}), 404 body = request.get_json(silent=True) or {} @@ -106,5 +107,30 @@ def trigger_append_action(slug, object_id): # Chemin d'écriture PARTAGÉ avec l'agent IA (voir ai/tools.py) — # ni cette route ni l'agent n'écrivent _collision_rules directement. if not screens.append_action_to_trigger(slug, object_id, after_id, body.get("action")): - return jsonify({"error": "action précédente introuvable ou déjà chaînée"}), 404 + return jsonify({"error": "action précédente introuvable"}), 404 + return jsonify({"ok": True}) + + +@app.route("/game//triggers//action/", methods=["DELETE"]) +def trigger_remove_action(slug, object_id, leaf_id): + """Retire UNE action précise (demande explicite : "chaque bloc + étiquette + action doit être supprimable") — voir screens/rendering/ + collision_rules.py::remove_action_from_rules, même chemin d'écriture + partagé avec l'agent IA.""" + if not screens.remove_action_from_trigger(slug, object_id, leaf_id): + return jsonify({"error": "action introuvable"}), 404 + return jsonify({"ok": True}) + + +@app.route("/game//triggers//action//move", methods=["POST"]) +def trigger_move_action(slug, object_id, leaf_id): + """Déplace une action précise d'un cran ("up"/"down", body + {direction}) dans sa chaîne — demande explicite : "chaque bloc + étiquette + action doit être déplaçable".""" + body = request.get_json(silent=True) or {} + direction = body.get("direction") + if direction not in ("up", "down"): + return jsonify({"error": "direction invalide"}), 400 + if not screens.move_action_in_trigger(slug, object_id, leaf_id, direction): + return jsonify({"error": "action introuvable"}), 404 return jsonify({"ok": True}) diff --git a/screens/__init__.py b/screens/__init__.py index 2505cc9c..9342bdeb 100644 --- a/screens/__init__.py +++ b/screens/__init__.py @@ -55,7 +55,11 @@ from .rendering.personnage_role import resolve_personnage_role, PERSONNAGE_ROLES from .rendering.collision_settings import resolve_collision_settings, DEFAULT_COLLISION_SETTINGS, COLLISION_SHAPES from .rendering.collision_rules import ( resolve_collision_rules, sanitize_collision_rules, set_dialogue_lines_in_rules, set_then_action_in_rules, + remove_action_from_rules, move_action_in_rules, backfill_missing_leaf_ids, ) +from .rendering.screen_triggers import resolve_screen_triggers, sanitize_screen_triggers, TRIGGER_TYPES_SCREEN +from .labels.surbrillance_values import SURBRILLANCE_VALUES, SURBRILLANCE_LABELS +from .labels.video_modes import VIDEO_MODES, VIDEO_MODE_LABELS from .rendering.personnage_commands import resolve_personnage_commands, DEFAULT_PERSONNAGE_COMMANDS, sanitize_extra_commands from .rendering.scene_object_names import list_named_scene_object_names from .rendering.dialogue_box_style import resolve_dialogue_box_style, sanitize_dialogue_box_style, DEFAULT_DIALOGUE_BOX_STYLE, FONT_WEIGHT_CHOICES @@ -70,6 +74,10 @@ from .screens_repo.move_screen import move_screen from .screens_repo.screens_referencing import screens_referencing from .screens_repo.set_scene_size import set_scene_size from .screens_repo.set_screen_background_music import set_screen_background_music +from .screens_repo.set_screen_triggers import set_screen_triggers +from .screens_repo.append_action_to_screen_trigger import append_action_to_screen_trigger +from .screens_repo.remove_action_from_screen_trigger import remove_action_from_screen_trigger +from .screens_repo.move_action_in_screen_trigger import move_action_in_screen_trigger from .scenes.ensure_scene_schema import ensure_scene_schema from .scenes.add_scene_object import add_scene_object @@ -88,6 +96,8 @@ from .scenes.set_scene_object_dialogue_box_style import set_scene_object_dialogu from .scenes.render_scene_object import render_scene_object from .scenes.build_collision_rule_objects import build_collision_rule_objects from .scenes.append_action_to_trigger import append_action_to_trigger +from .scenes.remove_action_from_trigger import remove_action_from_trigger +from .scenes.move_action_in_trigger import move_action_in_trigger from .rendering.trigger_graph import ( list_all_triggers, list_all_collision_objects, collect_all_dialogue_lines, list_completable_dialogue_ids, diff --git a/screens/labels/surbrillance_values.py b/screens/labels/surbrillance_values.py new file mode 100644 index 00000000..4220ae64 --- /dev/null +++ b/screens/labels/surbrillance_values.py @@ -0,0 +1,12 @@ +# Vocabulaire de l'action "surbrillance" (voir screens/rendering/ +# collision_rules.py) — MÊME vocabulaire que la propriété "surbrillance" +# de "Modifier un élément" (voir static/js/play/actions.js:: +# applyElementProperty, scripts/build_demo_dialogues.py), réutilisée telle +# quelle (classe CSS .forgeHighlight) plutôt que réinventée pour les objets +# de scène. +SURBRILLANCE_VALUES = [ + ("on", "Activer la surbrillance"), + ("off", "Désactiver la surbrillance"), + ("toggle", "Basculer la surbrillance"), +] +SURBRILLANCE_LABELS = dict(SURBRILLANCE_VALUES) diff --git a/screens/labels/video_modes.py b/screens/labels/video_modes.py new file mode 100644 index 00000000..8cb5c56a --- /dev/null +++ b/screens/labels/video_modes.py @@ -0,0 +1,9 @@ +# Mode d'affichage de l'action "video" (voir screens/rendering/ +# collision_rules.py) — "plein_ecran" couvre tout l'écran de jeu (usage +# cinématique/narration), "incrustation" reste une petite fenêtre par +# dessus la scène (le joueur voit encore le décor autour). +VIDEO_MODES = [ + ("plein_ecran", "Plein écran"), + ("incrustation", "Incrustation (petite fenêtre)"), +] +VIDEO_MODE_LABELS = dict(VIDEO_MODES) diff --git a/screens/payload/full_game_payload.py b/screens/payload/full_game_payload.py index 4b22ab94..8f779e93 100644 --- a/screens/payload/full_game_payload.py +++ b/screens/payload/full_game_payload.py @@ -9,6 +9,7 @@ from ..rendering.personnage_commands import resolve_personnage_commands from ..rendering.personnage_role import resolve_personnage_role from ..rendering.collision_settings import resolve_collision_settings from ..rendering.collision_rules import resolve_collision_rules +from ..rendering.screen_triggers import resolve_screen_triggers from ..rendering.dialogue_box_style import resolve_dialogue_box_style from ..rendering.trigger_graph import list_completable_dialogue_ids from ..scenes.list_scene_objects import list_scene_objects @@ -76,6 +77,12 @@ def full_game_payload(slug, player_id=db.PLAYER_SHARED): # l'inverse). if o["kind"] != "fond" and not (o["kind"] == "personnage" and o.get("personnage_role") == "joueur"): o["collision_rules"] = resolve_collision_rules(o) + # Déclencheurs D'ÉCRAN (voir "Déclencheurs de l'écran", sans objet + # requis — narration/cinématique dès l'affichage) : résolus ici + # comme collision_rules ci-dessus, sous un nom distinct de la + # colonne brute _screen_triggers (laissée telle quelle par ailleurs + # dans `s`, comme le reste des colonnes _screens). + s["screen_triggers"] = resolve_screen_triggers(s) payload_screens.append({**s, "elements": objects}) # Le graphe de logique et les animations sont, eux, lus pour TOUS les diff --git a/screens/rendering/collision_rules.py b/screens/rendering/collision_rules.py index f8b85950..ad70fd0d 100644 --- a/screens/rendering/collision_rules.py +++ b/screens/rendering/collision_rules.py @@ -1,8 +1,12 @@ import json +import uuid from db.dialogue_lines import sanitize_dialogue_lines from screens.flow.constants import CONDITION_OPERATORS from screens.labels.data_operations import DATA_OPERATION_LABELS +from screens.labels.element_visibility import ELEMENT_VISIBILITY_LABELS +from screens.labels.surbrillance_values import SURBRILLANCE_LABELS +from screens.labels.video_modes import VIDEO_MODE_LABELS # Éditeur de déclencheurs (voir static/js/triggers/trigger-editor.js:: # openTriggerWizard et static/js/scenes/collision-rule-wizard.js) : chaque @@ -10,10 +14,17 @@ from screens.labels.data_operations import DATA_OPERATION_LABELS # personnage_role.py — et un "fond", jamais une cible/source de collision) # porte une LISTE de règles "déclencheur -> action". # -# Déclencheur : "collision" (chevauchement direct, voir -# static/js/play/conditions.js::forgeShapesOverlap) — seul déclencheur -# encore proposé ("perimetre" retiré, ne servait à rien pour l'instant, -# demande explicite). +# Déclencheur : +# - "collision" : chevauchement direct avec le joueur (voir +# static/js/play/conditions.js::forgeShapesOverlap) — +# nécessite un personnage "joueur" sur l'écran +# ("perimetre" retiré, ne servait à rien pour l'instant, +# demande explicite). +# - "clic" : l'objet est cliqué/touché — pas besoin de joueur, écouteur +# posé directement sur l'objet (voir static/js/play/ +# collision-rules-controller.js::forgeBindClicSurvolRules). +# - "survol" : le pointeur survole l'objet (souris) — même remarque +# que "clic". # # Action : # - "dialogue" : la logique n'est plus portée par une "quête" mais @@ -53,12 +64,43 @@ from screens.labels.data_operations import DATA_OPERATION_LABELS # screens/flow/constants.py::CONDITION_OPERATORS, même # vocabulaire que le nœud Condition de l'éditeur de # logique) -> exécute `si_vrai` ou `si_faux` (chacun soit -# None — "ne rien faire", soit une FEUILLE — "dialogue" -# ou "variable", voir maquette validée, JAMAIS une -# nouvelle "interagir"/"condition" imbriquée : une -# branche reste une feuille). +# None — "ne rien faire", soit une FEUILLE (voir +# LEAF_ACTION_TYPES ci-dessous), voir maquette validée, +# JAMAIS une nouvelle "interagir"/"condition" imbriquée : +# une branche reste une feuille). +# - "surbrillance" : met un objet en surbrillance (n'importe lequel de +# l'écran, pas forcément celui qui porte la règle — voir +# `object_id`). MÊME vocabulaire ("on"/"off"/"toggle", +# classe CSS .forgeHighlight) que la propriété +# "surbrillance" de "Modifier un élément" (voir +# static/js/play/actions.js::applyElementProperty, +# screens/labels/surbrillance_values.py), réutilisée telle +# quelle plutôt que réinventée. +# - "visibilite" : rend un objet visible/masqué/invisible (voir +# `object_id`, screens/labels/element_visibility.py:: +# ELEMENT_VISIBILITY_VALUES, même vocabulaire que +# "Modifier un élément" côté Flow). +# - "son" : joue un effet sonore ponctuel, non bouclé (voir +# `asset_url`) — même comportement que l'action "Jouer un +# son" du Flow (static/js/play/actions.js, `new +# Audio(url).play()`), indépendant de la musique de fond. +# - "video" : joue une vidéo uploadée dans "Mes assets" (voir +# `asset_url`, `mode` ∈ VIDEO_MODES) — bloque la suite de +# la chaîne "then" jusqu'à la fin de la vidéo (ou "passer"), +# comme un dialogue. +# - "indication": affiche une bulle de texte courte près d'un objet (voir +# `object_id`, `texte`, `duree_ms` optionnel — disparaît +# automatiquement après ce délai, par défaut voir +# static/js/play/collision-rules-controller.js) — même +# esprit que la bulle "Appuie sur [touche]" déjà utilisée +# par "interagir". +# - "attendre" : suspend la chaîne "then" pendant `data_value` SECONDES +# (même vocabulaire que l'action "attendre" du Flow, voir +# static/js/play/actions.js) avant de continuer — utile +# par ex. pour laisser un temps de lecture après une +# narration à l'affichage de l'écran. # -# CHAÎNAGE : une feuille ("dialogue" ou "variable") peut porter un champ +# CHAÎNAGE : une FEUILLE (voir LEAF_ACTION_TYPES) peut porter un champ # optionnel "then" — l'action suivante à exécuter une fois celle-ci # terminée, elle-même une feuille, qui peut à son tour avoir un "then" # (borné par _MAX_THEN_CHAIN) — demande explicite : "pouvoir modifier un @@ -67,15 +109,25 @@ from screens.labels.data_operations import DATA_OPERATION_LABELS # # ("attaque"/"evenement" retirés — ne servaient à rien pour l'instant, # demande explicite.) -ACTION_TYPES = ["dialogue", "variable", "interagir", "condition"] -LEAF_ACTION_TYPES = ("dialogue", "variable") -TRIGGER_TYPES = ["collision"] +ACTION_TYPES = [ + "dialogue", "variable", "surbrillance", "visibilite", "son", "video", "indication", "attendre", + "interagir", "condition", +] +TRIGGER_TYPES = ["collision", "clic", "survol"] CONDITION_OPERATOR_KEYS = {key for key, _label in CONDITION_OPERATORS} # Profondeur max d'imbrication ("interagir" -> sous-action) — évite une # structure sans fin construite par un JSON posté à la main. _MAX_ACTION_DEPTH = 2 -# Longueur max d'une chaîne de "then" — même esprit que _MAX_ACTION_DEPTH. -_MAX_THEN_CHAIN = 4 +# Longueur max d'une chaîne de "then" — même esprit que _MAX_ACTION_DEPTH +# (jamais illimité, mais large : voir "+ Ajouter une action" posé après +# CHAQUE bloc, demande explicite "n'importe quel niveau du schéma"). Bug +# corrigé : à 4, une chaîne suffisait à peine à enchaîner attendre -> +# dialogue -> surbrillance -> attendre — le 5e maillon ajouté par +# l'utilisateur (ex. une seconde surbrillance pour désactiver) était +# TRONQUÉ EN SILENCE par la resanitisation qui suit chaque écriture +# (set_then_action_in_rules), donnant l'impression que l'ajout n'avait +# aucun effet alors qu'il avait bien été inséré en mémoire. +_MAX_THEN_CHAIN = 30 _MAX_ACTION_ID_LENGTH = 40 @@ -129,20 +181,112 @@ def _sanitize_variable_action(raw_action): return action +def _sanitize_object_id(raw_action): + object_id = raw_action.get("object_id") + try: + return int(object_id) + except (TypeError, ValueError): + return None + + +def _with_optional_id(action, raw_action): + """Ajoute le champ `id` (optionnel, généré côté client) commun à + toutes les feuilles autres que "dialogue" — sert à adresser CETTE + feuille précise pour y attacher un "then" plus tard (voir + set_then_action_in_rules), même rôle que `variable.id`.""" + action_id = raw_action.get("id") + if isinstance(action_id, str) and action_id.strip(): + action["id"] = action_id.strip()[:_MAX_ACTION_ID_LENGTH] + return action + + +def _sanitize_surbrillance_action(raw_action): + object_id = _sanitize_object_id(raw_action) + valeur = raw_action.get("valeur") + if object_id is None or valeur not in SURBRILLANCE_LABELS: + return None + return _with_optional_id({"type": "surbrillance", "object_id": object_id, "valeur": valeur}, raw_action) + + +def _sanitize_visibilite_action(raw_action): + object_id = _sanitize_object_id(raw_action) + valeur = raw_action.get("valeur") + if object_id is None or valeur not in ELEMENT_VISIBILITY_LABELS: + return None + return _with_optional_id({"type": "visibilite", "object_id": object_id, "valeur": valeur}, raw_action) + + +def _sanitize_son_action(raw_action): + asset_url = raw_action.get("asset_url") + if not isinstance(asset_url, str) or not asset_url.strip(): + return None + return _with_optional_id({"type": "son", "asset_url": asset_url.strip()}, raw_action) + + +def _sanitize_video_action(raw_action): + asset_url = raw_action.get("asset_url") + mode = raw_action.get("mode") + if not isinstance(asset_url, str) or not asset_url.strip() or mode not in VIDEO_MODE_LABELS: + return None + return _with_optional_id({"type": "video", "asset_url": asset_url.strip(), "mode": mode}, raw_action) + + +def _sanitize_indication_action(raw_action): + object_id = _sanitize_object_id(raw_action) + texte = raw_action.get("texte") + if object_id is None or not isinstance(texte, str) or not texte.strip(): + return None + action = {"type": "indication", "object_id": object_id, "texte": texte.strip()[:200]} + duree_ms = raw_action.get("duree_ms") + if isinstance(duree_ms, (int, float)) and not isinstance(duree_ms, bool) and duree_ms > 0: + action["duree_ms"] = int(duree_ms) + return _with_optional_id(action, raw_action) + + +def _sanitize_attendre_action(raw_action): + """"Attendre N secondes" avant de continuer la chaîne — MÊME + vocabulaire que l'action "attendre" du Flow (voir static/js/play/ + actions.js, `data_value` en SECONDES, pas en ms) : suspend le "then" + plutôt que de l'exécuter immédiatement (comme "video"), utile par ex. + pour une narration à l'affichage de l'écran qui doit laisser un temps + de lecture avant d'enchaîner.""" + raw_value = raw_action.get("data_value") + try: + seconds = float(raw_value) + except (TypeError, ValueError): + return None + if seconds < 0: + return None + return _with_optional_id({"type": "attendre", "data_value": str(seconds)}, raw_action) + + +# Une seule table de vérité pour les feuilles : ajouter un type ici suffit +# (voir LEAF_ACTION_TYPES dérivé de ses clés) — évite le if/elif qui aurait +# dû être répété à chaque nouvel ajout. +_LEAF_ACTION_SANITIZERS = { + "dialogue": _sanitize_dialogue_action, + "variable": _sanitize_variable_action, + "surbrillance": _sanitize_surbrillance_action, + "visibilite": _sanitize_visibilite_action, + "son": _sanitize_son_action, + "video": _sanitize_video_action, + "indication": _sanitize_indication_action, + "attendre": _sanitize_attendre_action, +} +LEAF_ACTION_TYPES = tuple(_LEAF_ACTION_SANITIZERS) + + def _sanitize_leaf_action(raw_action, depth=1): - """Sanitize une FEUILLE ("dialogue" ou "variable") et son éventuelle + """Sanitize une FEUILLE (voir LEAF_ACTION_TYPES) et son éventuelle chaîne "then" (bornée à _MAX_THEN_CHAIN) — utilisée partout où une feuille est attendue : action de premier niveau, sous "interagir", ou branche Vrai/Faux de "condition".""" if not isinstance(raw_action, dict): return None - action_type = raw_action.get("type") - if action_type == "dialogue": - action = _sanitize_dialogue_action(raw_action) - elif action_type == "variable": - action = _sanitize_variable_action(raw_action) - else: + sanitizer = _LEAF_ACTION_SANITIZERS.get(raw_action.get("type")) + if not sanitizer: return None + action = sanitizer(raw_action) if not action: return None if depth < _MAX_THEN_CHAIN: @@ -193,11 +337,17 @@ def _sanitize_action(raw_action, depth=1): } -def sanitize_collision_rules(raw_rules): +def sanitize_collision_rules(raw_rules, allowed_triggers=None): """Valide/nettoie une liste de règles postée par le client (voir routes/triggers/) — une règle invalide (déclencheur/action inconnus, imbrication trop profonde...) est IGNORÉE plutôt que de faire planter - la sauvegarde entière.""" + la sauvegarde entière. `allowed_triggers` (par défaut TRIGGER_TYPES) : + réutilisé tel quel par screens/rendering/screen_triggers.py pour les + déclencheurs D'ÉCRAN (sans objet), qui partagent la même logique de + sanitisation d'action mais un vocabulaire de déclencheur différent + (seulement "affichage").""" + if allowed_triggers is None: + allowed_triggers = TRIGGER_TYPES if not isinstance(raw_rules, list): return [] cleaned = [] @@ -205,7 +355,7 @@ def sanitize_collision_rules(raw_rules): if not isinstance(raw_rule, dict): continue trigger = raw_rule.get("trigger") - if trigger not in TRIGGER_TYPES: + if trigger not in allowed_triggers: continue action = _sanitize_action(raw_rule.get("action")) if not action: @@ -224,7 +374,7 @@ def _apply_dialogue_lines(action, dialogue_id, lines): action["dialogue"] = {"id": dialogue_id, "lines": lines} return True return _apply_dialogue_lines(action.get("then"), dialogue_id, lines) - if action_type == "variable": + if action_type in LEAF_ACTION_TYPES: return _apply_dialogue_lines(action.get("then"), dialogue_id, lines) if action_type == "interagir": return _apply_dialogue_lines(action.get("sub_action"), dialogue_id, lines) @@ -255,7 +405,7 @@ def _leaf_id(action): if action.get("type") == "dialogue": dialogue = action.get("dialogue") return dialogue.get("id") if isinstance(dialogue, dict) else None - if action.get("type") == "variable": + if action.get("type") in LEAF_ACTION_TYPES: return action.get("id") return None @@ -266,8 +416,15 @@ def _apply_then_action(action, leaf_id, then_action): action_type = action.get("type") if action_type in LEAF_ACTION_TYPES: if _leaf_id(action) == leaf_id: - if "then" in action: - return False # jamais écraser un chaînage déjà posé + # INSÈRE `then_action` juste après cette feuille — l'éventuelle + # suite déjà présente passe DERRIÈRE elle plutôt que d'être + # écrasée (demande explicite : "pouvoir ajouter n'importe + # quelle action à n'importe quel niveau du schéma", pas + # seulement en bout de chaîne — comportement précédent, qui + # refusait si "then" existait déjà). + existing_then = action.get("then") + if existing_then: + then_action["then"] = existing_then action["then"] = then_action return True return _apply_then_action(action.get("then"), leaf_id, then_action) @@ -282,15 +439,16 @@ def _apply_then_action(action, leaf_id, then_action): def set_then_action_in_rules(rules, leaf_id, raw_then_action): - """Attache EN PLACE une NOUVELLE action `then` sur la feuille - ("dialogue" ou "variable") identifiée par `leaf_id` (dialogue.id pour - une feuille dialogue, id pour une feuille variable) — n'importe où - dans l'arbre d'action d'une des règles. Utilisé par routes/triggers/ - pour "+ Ajouter une action" en bout de chaîne (voir static/js/triggers/ - trigger-editor.js). Retourne False sans rien modifier si `leaf_id` - est introuvable, OU si la feuille trouvée a DÉJÀ un "then" (on - n'écrase jamais un chaînage existant par cette route — seulement - ajouter à la fin réelle de la chaîne).""" + """INSÈRE EN PLACE une NOUVELLE action juste après la feuille + identifiée par `leaf_id` (dialogue.id pour une feuille dialogue, id + pour toute autre feuille) — n'importe où dans l'arbre d'action d'une + des règles. Utilisé par "+ Ajouter une action", posé après CHAQUE + bloc de la chaîne (voir static/js/triggers/trigger-editor.js) : si la + feuille visée a déjà une suite ("then"), celle-ci passe DERRIÈRE la + nouvelle action plutôt que d'être remplacée — permet d'insérer une + action à N'IMPORTE QUEL niveau, pas seulement en bout de chaîne + réelle. Retourne False sans rien modifier si `leaf_id` est + introuvable.""" then_action = _sanitize_leaf_action(raw_then_action) if not then_action: return False @@ -300,6 +458,211 @@ def set_then_action_in_rules(rules, leaf_id, raw_then_action): return False +# ---------- Suppression/réordonnancement d'un maillon précis (demande +# explicite : "que chaque bloc étiquette + action soit déplaçable ou +# supprimable par l'utilisateur ET par l'IA") ---------- +# Les deux opérations ci-dessous reconstruisent l'arbre par le HAUT +# (renvoient un NOUVEL arbre plutôt que de muter les dicts en place, voir +# _remove_leaf_id/_move_in_action_tree) — plus sûr qu'un patch en place +# pour un maillon qui peut être la TÊTE d'une règle (auquel cas la +# RÈGLE elle-même doit être remplacée ou retirée, pas juste un champ +# interne). + +def _remove_leaf_id(action, leaf_id): + """Retire la feuille `leaf_id` de l'arbre `action` — renvoie + (nouvel_arbre_ou_None, trouvé). `nouvel_arbre` vaut None si `action` + lui-même était la cible et n'avait rien pour le remplacer (ni "then", + ni sous-action restante pour "interagir").""" + if not isinstance(action, dict): + return action, False + action_type = action.get("type") + if action_type in LEAF_ACTION_TYPES: + if _leaf_id(action) == leaf_id: + return action.get("then"), True + new_then, removed = _remove_leaf_id(action.get("then"), leaf_id) + if not removed: + return action, False + new_action = dict(action) + if new_then: + new_action["then"] = new_then + else: + new_action.pop("then", None) + return new_action, True + if action_type == "interagir": + new_sub, removed = _remove_leaf_id(action.get("sub_action"), leaf_id) + if not removed: + return action, False + if new_sub is None: + # Plus de sous-action : "interagir" perd son sens (une touche + # qui ne déclenche plus rien), retiré à son tour. + return None, True + new_action = dict(action) + new_action["sub_action"] = new_sub + return new_action, True + if action_type == "condition": + new_action = dict(action) + changed = False + for branch_key in ("si_vrai", "si_faux"): + new_branch, removed = _remove_leaf_id(action.get(branch_key), leaf_id) + if removed: + new_action[branch_key] = new_branch + changed = True + return (new_action, True) if changed else (action, False) + return action, False + + +def remove_action_from_rules(rules, leaf_id): + """Retire EN PLACE l'action `leaf_id` n'importe où dans l'arbre d'une + des règles (feuille directe d'une règle, maillon d'une chaîne "then", + sous-action d'un "interagir", ou dans une branche de "condition"). Si + l'action retirée était la TÊTE d'une règle : la règle est remplacée + par sa suite ("then") si elle en avait une, sinon la RÈGLE ENTIÈRE + disparaît (plus rien à garder). Renvoie True si quelque chose a été + retiré.""" + for i, rule in enumerate(rules): + new_action, removed = _remove_leaf_id(rule.get("action"), leaf_id) + if not removed: + continue + if new_action is None: + del rules[i] + else: + rules[i] = {"trigger": rule["trigger"], "action": new_action} + return True + return False + + +def _chain_as_list(head_action): + """Aplatit une chaîne de FEUILLES pures (voir LEAF_ACTION_TYPES) en + liste — le réordonnancement ne s'applique qu'à l'intérieur d'une + chaîne "then" (jamais entre deux branches différentes d'une + condition, ni entre une "interagir" et ce qui l'entoure).""" + items = [] + node = head_action + while isinstance(node, dict) and node.get("type") in LEAF_ACTION_TYPES: + items.append(node) + node = node.get("then") + return items + + +def _relink_chain(items): + items = [dict(n) for n in items] + for i in range(len(items) - 1): + items[i]["then"] = items[i + 1] + if items: + items[-1].pop("then", None) + return items[0] if items else None + + +def _move_in_action_tree(action, leaf_id, direction): + """Cherche, dans `action`, LA chaîne "then" qui contient `leaf_id` + (au premier niveau, sous une "interagir", ou dans une branche de + "condition"), et échange `leaf_id` avec son voisin immédiat + ("up"/"down") DANS CETTE CHAÎNE. Renvoie le nouvel arbre, ou None si + `leaf_id` n'a été trouvé nulle part dans `action` (jamais rien à + changer dans ce cas — distinct d'un déplacement sans effet parce que + déjà en bout de chaîne, qui renvoie quand même un arbre, identique à + l'original).""" + if not isinstance(action, dict): + return None + action_type = action.get("type") + if action_type in LEAF_ACTION_TYPES: + chain = _chain_as_list(action) + ids = [_leaf_id(n) for n in chain] + if leaf_id not in ids: + return None + idx = ids.index(leaf_id) + swap_idx = idx - 1 if direction == "up" else idx + 1 + if 0 <= swap_idx < len(chain): + chain[idx], chain[swap_idx] = chain[swap_idx], chain[idx] + return _relink_chain(chain) + if action_type == "interagir": + new_sub = _move_in_action_tree(action.get("sub_action"), leaf_id, direction) + if new_sub is None: + return None + new_action = dict(action) + new_action["sub_action"] = new_sub + return new_action + if action_type == "condition": + for branch_key in ("si_vrai", "si_faux"): + new_branch = _move_in_action_tree(action.get(branch_key), leaf_id, direction) + if new_branch is not None: + new_action = dict(action) + new_action[branch_key] = new_branch + return new_action + return None + return None + + +def move_action_in_rules(rules, leaf_id, direction): + """Déplace EN PLACE la feuille `leaf_id` d'un cran vers le haut + ("up") ou le bas ("down") DANS SA PROPRE CHAÎNE "then" (jamais + au-delà de sa branche de condition/sous-action interagir — voir + _move_in_action_tree). `direction` autre que "up"/"down" : aucun + effet. Renvoie True si `leaf_id` a été trouvé (même si déjà en bout + de chaîne et donc sans déplacement réel — la règle est alors + réécrite à l'identique).""" + if direction not in ("up", "down"): + return False + for i, rule in enumerate(rules): + new_action = _move_in_action_tree(rule.get("action"), leaf_id, direction) + if new_action is not None: + rules[i] = {"trigger": rule["trigger"], "action": new_action} + return True + return False + + +def _generate_leaf_id(): + return "d_" + uuid.uuid4().hex[:12] + + +def _backfill_leaf_ids(action): + """Assure EN PLACE qu'un id STABLE existe sur toute feuille non- + "dialogue" (qui a déjà le sien via dialogue.id) qui n'en avait pas — + ex. une action "variable" posée AVANT que ce champ ne devienne + systématique, ou par l'IA (le champ reste optionnel dans son schéma, + voir ai/tools.py). Sans id, une feuille reste à jamais impossible à + adresser (chaînage/ajout/retrait/déplacement ciblé, voir + "+ Ajouter une action" posé après CHAQUE bloc). Renvoie True si + quelque chose a été ajouté — l'appelant doit alors PERSISTER `action` + (voir backfill_missing_leaf_ids), sans quoi l'id resterait instable + d'une lecture à l'autre (régénéré à chaque appel).""" + if not isinstance(action, dict): + return False + changed = False + action_type = action.get("type") + if action_type in LEAF_ACTION_TYPES: + if action_type != "dialogue" and not action.get("id"): + action["id"] = _generate_leaf_id() + changed = True + if _backfill_leaf_ids(action.get("then")): + changed = True + elif action_type == "interagir": + if _backfill_leaf_ids(action.get("sub_action")): + changed = True + elif action_type == "condition": + if _backfill_leaf_ids(action.get("si_vrai")): + changed = True + if _backfill_leaf_ids(action.get("si_faux")): + changed = True + return changed + + +def backfill_missing_leaf_ids(rules): + """Applique _backfill_leaf_ids à CHAQUE règle de `rules` (mutées EN + PLACE) — renvoie True si au moins une règle a été modifiée, auquel + cas l'appelant DOIT persister `rules` (voir routes/triggers/ + triggers.py::triggers_get, routes/screens/screen_triggers.py:: + screen_triggers_get, screens/rendering/trigger_graph.py:: + list_all_triggers — appelé à la LECTURE, pour que le premier + affichage d'une règle ancienne rende ses feuilles adressables une + bonne fois pour toutes).""" + changed = False + for rule in rules: + if _backfill_leaf_ids(rule.get("action")): + changed = True + return changed + + def resolve_collision_rules(obj): """Décode attributes._collision_rules en liste Python, jamais None — un attribut absent/corrompu retombe sur aucune règle (comportement diff --git a/screens/rendering/screen_triggers.py b/screens/rendering/screen_triggers.py new file mode 100644 index 00000000..c6fec8c7 --- /dev/null +++ b/screens/rendering/screen_triggers.py @@ -0,0 +1,36 @@ +import json + +from .collision_rules import sanitize_collision_rules + +# Déclencheurs D'ÉCRAN (voir _screens._screen_triggers, screens_repo/ +# ensure_schema.py) — contrairement à _collision_rules (porté par un +# OBJET de scène), ceux-ci se déclenchent sans avoir besoin d'un objet : +# demande explicite pour de la narration/cinématique dès l'affichage +# d'un écran. Seul déclencheur pour l'instant : "affichage" (à +# l'affichage de l'écran) — même forme d'action que collision_rules.py +# (dialogue/variable/surbrillance/visibilite/son/video/indication/ +# interagir/condition), réutilisée telle quelle plutôt que dupliquée. +TRIGGER_TYPES_SCREEN = ["affichage"] + + +def sanitize_screen_triggers(raw_rules): + """Valide/nettoie une liste de règles "déclencheur d'écran -> action" + postée par le client (voir routes/screens/screen_triggers.py) — même + garanties que sanitize_collision_rules, juste un vocabulaire de + déclencheur restreint à TRIGGER_TYPES_SCREEN.""" + return sanitize_collision_rules(raw_rules, allowed_triggers=TRIGGER_TYPES_SCREEN) + + +def resolve_screen_triggers(screen): + """Décode _screens._screen_triggers en liste Python, jamais None — un + écran créé avant l'ajout de cette fonctionnalité (colonne NULL) + retombe sur aucune règle, même principe que resolve_collision_rules + pour un objet.""" + raw = (screen or {}).get("_screen_triggers") + if not raw: + return [] + try: + parsed = json.loads(raw) + except (TypeError, ValueError): + return [] + return sanitize_screen_triggers(parsed) diff --git a/screens/rendering/trigger_graph.py b/screens/rendering/trigger_graph.py index 09d01909..40e0331c 100644 --- a/screens/rendering/trigger_graph.py +++ b/screens/rendering/trigger_graph.py @@ -17,36 +17,49 @@ def _game_objects_with_thumbnails(slug, screens_mod): return result +from .collision_rules import LEAF_ACTION_TYPES + +# Champs affichés pour chaque type de feuille (voir screens/rendering/ +# collision_rules.py pour la forme exacte de chacune) — un simple filtre +# sur l'action déjà sanitizée, jamais une recopie de valeur : ajouter un +# type de feuille suffit à l'ajouter ici, sans dupliquer sa logique de +# sanitisation. +_LEAF_DISPLAY_FIELDS = { + "dialogue": ("dialogue",), + "variable": ("id", "target_variable", "data_operation", "data_value"), + "surbrillance": ("id", "object_id", "valeur"), + "visibilite": ("id", "object_id", "valeur"), + "son": ("id", "asset_url"), + "video": ("id", "asset_url", "mode"), + "indication": ("id", "object_id", "texte", "duree_ms"), + "attendre": ("id", "data_value"), +} + + def _describe_leaf(action): - """Une seule feuille ("dialogue" ou "variable", voir - screens/rendering/collision_rules.py) décrite pour l'affichage, - SANS son éventuel "then" (voir _describe_chain, qui aplatit la - chaîne complète).""" - if action.get("type") == "dialogue": - return {"type": "dialogue", "dialogue": action.get("dialogue")} - return { - "type": "variable", - "id": action.get("id"), - "target_variable": action.get("target_variable"), - "data_operation": action.get("data_operation"), - "data_value": action.get("data_value"), - } + """Une seule feuille (voir LEAF_ACTION_TYPES, screens/rendering/ + collision_rules.py) décrite pour l'affichage, SANS son éventuel + "then" (voir _describe_chain, qui aplatit la chaîne complète).""" + action_type = action.get("type") + fields = _LEAF_DISPLAY_FIELDS.get(action_type, ()) + return {"type": action_type, **{f: action[f] for f in fields if f in action}} def _describe_chain(action): """Aplatit une feuille + ses "then" successifs en une LISTE, dans l'ordre d'exécution — voir maquette validée ("plusieurs actions - chaînées"). Liste vide si `action` n'est ni "dialogue" ni "variable".""" + chaînées"). Liste vide si `action` n'est pas une feuille reconnue + (voir LEAF_ACTION_TYPES).""" chain = [] node = action - while isinstance(node, dict) and node.get("type") in ("dialogue", "variable"): + while isinstance(node, dict) and node.get("type") in LEAF_ACTION_TYPES: chain.append(_describe_leaf(node)) node = node.get("then") return chain def _branch_info(branch): - if not isinstance(branch, dict) or branch.get("type") not in ("dialogue", "variable"): + if not isinstance(branch, dict) or branch.get("type") not in LEAF_ACTION_TYPES: return None return {"chain": _describe_chain(branch)} @@ -54,19 +67,19 @@ def _branch_info(branch): def _resolve_action_trigger(action, has_interagir=False): """Décrit ENTIÈREMENT un arbre d'action (voir screens/rendering/ collision_rules.py) pour l'affichage dans l'onglet "Déclencheurs" — - chaque feuille ("dialogue"/"variable") affiche DIRECTEMENT son propre - contenu, où qu'elle soit dans l'arbre (y compris CHAQUE branche d'une - "condition", indépendamment l'une de l'autre), et sa chaîne "then" - complète (voir _describe_chain). Retourne {has_interagir, chain, - condition} — `chain` est une LISTE (jamais None, vide si l'action ne - se termine par aucune feuille reconnue) ; `condition` est None sauf - pour une action "condition", auquel cas il porte {variable, operateur, - valeur, si_vrai, si_faux} où si_vrai/si_faux valent chacun None ("ne - rien faire") ou {chain: [...]}.""" + chaque feuille affiche DIRECTEMENT son propre contenu, où qu'elle soit + dans l'arbre (y compris CHAQUE branche d'une "condition", + indépendamment l'une de l'autre), et sa chaîne "then" complète (voir + _describe_chain). Retourne {has_interagir, chain, condition} — + `chain` est une LISTE (jamais None, vide si l'action ne se termine + par aucune feuille reconnue) ; `condition` est None sauf pour une + action "condition", auquel cas il porte {variable, operateur, valeur, + si_vrai, si_faux} où si_vrai/si_faux valent chacun None ("ne rien + faire") ou {chain: [...]}.""" if not isinstance(action, dict): return {"has_interagir": has_interagir, "chain": [], "condition": None} action_type = action.get("type") - if action_type in ("dialogue", "variable"): + if action_type in LEAF_ACTION_TYPES: return {"has_interagir": has_interagir, "chain": _describe_chain(action), "condition": None} if action_type == "interagir": return _resolve_action_trigger(action.get("sub_action") or {}, has_interagir=True) @@ -96,6 +109,15 @@ def list_all_triggers(slug): result = [] for obj in rule_objects: + # Rétro-remplissage des feuilles posées avant que "id" ne devienne + # systématique (ex. par l'IA, ce champ restant optionnel dans son + # schéma) — sans ça, "+ Ajouter une action"/le retrait/le + # déplacement restent silencieusement indisponibles sur ce bloc + # précis (voir screens/rendering/collision_rules.py:: + # backfill_missing_leaf_ids). Persisté dès ce premier affichage, + # jamais régénéré ensuite. + if screens_mod.backfill_missing_leaf_ids(obj["rules"]): + screens_mod.set_scene_object_collision_rules(slug, obj["id"], obj["rules"]) for rule in obj["rules"]: info = _resolve_action_trigger(rule["action"]) result.append({ @@ -119,7 +141,7 @@ def _collect_dialogue_lines_from_action(action, acc): if isinstance(dialogue, dict): acc.append(dialogue.get("lines") or []) _collect_dialogue_lines_from_action(action.get("then"), acc) - elif action_type == "variable": + elif action_type in LEAF_ACTION_TYPES: _collect_dialogue_lines_from_action(action.get("then"), acc) elif action_type == "interagir": _collect_dialogue_lines_from_action(action.get("sub_action"), acc) @@ -145,6 +167,8 @@ def collect_all_dialogue_lines(slug): for obj in screens_mod.list_scene_objects(slug, s["id"]): for rule in screens_mod.resolve_collision_rules(obj): _collect_dialogue_lines_from_action(rule.get("action"), acc) + for rule in screens_mod.resolve_screen_triggers(s): + _collect_dialogue_lines_from_action(rule.get("action"), acc) return acc @@ -157,7 +181,7 @@ def _collect_completable_ids_from_action(action, acc): if action.get("mark_completed") and isinstance(dialogue, dict) and dialogue.get("id"): acc.append(dialogue["id"]) _collect_completable_ids_from_action(action.get("then"), acc) - elif action_type == "variable": + elif action_type in LEAF_ACTION_TYPES: _collect_completable_ids_from_action(action.get("then"), acc) elif action_type == "interagir": _collect_completable_ids_from_action(action.get("sub_action"), acc) @@ -182,6 +206,8 @@ def list_completable_dialogue_ids(slug): for obj in screens_mod.list_scene_objects(slug, s["id"]): for rule in screens_mod.resolve_collision_rules(obj): _collect_completable_ids_from_action(rule.get("action"), acc) + for rule in screens_mod.resolve_screen_triggers(s): + _collect_completable_ids_from_action(rule.get("action"), acc) return acc diff --git a/screens/scenes/add_scene_object.py b/screens/scenes/add_scene_object.py index 873f42ac..8665836a 100644 --- a/screens/scenes/add_scene_object.py +++ b/screens/scenes/add_scene_object.py @@ -13,9 +13,18 @@ _KINDS = {"personnage", "decor", "fond", "dialogue_box", "quiz_box", "score_widg _DIALOGUE_BOX_DEFAULT_SIZE = (320, 150) _QUIZ_BOX_DEFAULT_SIZE = (340, 240) _SCORE_WIDGET_DEFAULT_SIZE = (140, 50) +# "decor" (demande explicite) : taille fixe à la pose, JAMAIS la taille +# réelle de l'image importée (contrairement à "fond", voir plus bas) — +# une photo/illustration "Mes assets" est souvent bien plus grande qu'un +# petit objet de décor, 200×200 reste un point de départ raisonnable à +# ajuster ensuite à la poignée. La boîte de collision, elle, est posée +# plus PETITE que l'objet (150×150, centrée — voir collision_settings.py) +# pour rester proche de la silhouette réelle plutôt que du cadre entier. +_DECOR_DEFAULT_SIZE = (200, 200) +_DECOR_COLLISION_SIZE = (150, 150) -def add_scene_object(slug, scene_id, kind="personnage", forge_character=None, background_slug=None, image_url=None): +def add_scene_object(slug, scene_id, kind="personnage", forge_character=None, background_slug=None, image_url=None, image_width=None, image_height=None, x=None, y=None): """Pose un nouvel objet sur une scène (voir ensure_scene_schema.py). kind="personnage" : attributes._personnage_data, MÊME structure/mêmes fonctions resolve_personnage_* que le widget "personnage" de l'éditeur @@ -33,9 +42,20 @@ def add_scene_object(slug, scene_id, kind="personnage", forge_character=None, ba image_url (kind "fond"/"decor" uniquement) : une image ARBITRAIRE (voir "Mes assets", auth/user_assets/) plutôt qu'une clé de BACKGROUND_LIBRARY — prioritaire sur background_slug si les deux sont - fournis. Pas de largeur/hauteur connues d'avance ici (contrairement à - BACKGROUND_LIBRARY qui les documente) : retombe sur les colonnes par - défaut de _scene_objects, exactement comme un "decor" ordinaire.""" + fournis. image_width/image_height (kind "fond" uniquement, voir + routes/scenes/scene_object_add.py::auth.image_dimensions) : taille + RÉELLE de l'image quand connue, pour que le "monde" puisse s'agrandir + à sa vraie taille. Un "decor" les ignore volontairement (demande + explicite) : toujours posé à _DECOR_DEFAULT_SIZE (200×200), quelle que + soit la taille réelle de l'image importée. + + x/y (optionnels) : position EXACTE demandée par le créateur (voir + "vrai glisser-déposer" depuis la galerie, static/js/scenes/ + scene-editor.js::onGalleryDragStart/onCanvasDrop) — remplace le + défaut habituel (100,100 posé par le schéma, voir + ensure_scene_schema.py) pour TOUT type d'objet, y compris "fond" + (qui, SANS position explicite, continue de démarrer au coin + haut-gauche du monde comme avant).""" ensure_scene_schema(slug) kind = kind if kind in _KINDS else "personnage" attributes = {} @@ -59,8 +79,16 @@ def add_scene_object(slug, scene_id, kind="personnage", forge_character=None, ba # et disparaîtrait à tort de "🧩 Collision" (voir scene_edit_view.py, # qui exclut toujours le joueur). attributes["_personnage_role"] = "pnj" - elif kind in ("fond", "decor") and image_url: + elif kind == "fond" and image_url: attributes["src"] = image_url + if image_width is not None and image_height is not None: + width, height = image_width, image_height + elif kind == "decor" and image_url: + attributes["src"] = image_url + width, height = _DECOR_DEFAULT_SIZE + attributes["_collision"] = json.dumps({ + "width": _DECOR_COLLISION_SIZE[0], "height": _DECOR_COLLISION_SIZE[1], + }) elif kind == "fond" and background_slug: from ..labels.background_library import BACKGROUND_LIBRARY background = BACKGROUND_LIBRARY.get(background_slug) @@ -83,11 +111,17 @@ def add_scene_object(slug, scene_id, kind="personnage", forge_character=None, ba cols = ["scene_id", "kind", "attributes", "z_index"] values = [scene_id, kind, json.dumps(attributes), z_index] if width is not None: - # x=0/y=0 (jamais le défaut 100/100, voir ensure_scene_schema.py) : - # un fond commence au coin haut-gauche de la scène/du monde, pas - # décalé arbitrairement comme un objet ordinaire. - cols += ["width", "height", "x", "y"] - values += [width, height, 0, 0] + cols += ["width", "height"] + values += [width, height] + if x is None and y is None and kind == "fond": + # Comportement inchangé pour un fond posé SANS position explicite + # (galerie Forge/Mes assets par simple clic) : jamais le défaut + # 100/100 (voir ensure_scene_schema.py), toujours le coin + # haut-gauche de la scène/du monde. + x, y = 0, 0 + if x is not None and y is not None: + cols += ["x", "y"] + values += [x, y] placeholders = ", ".join(["?"] * len(values)) conn.execute(f"INSERT INTO _scene_objects ({', '.join(cols)}) VALUES ({placeholders})", values) object_id = conn.execute("SELECT last_insert_rowid() AS id").fetchone()["id"] diff --git a/screens/scenes/append_action_to_trigger.py b/screens/scenes/append_action_to_trigger.py index fe5cc66a..ef5f58c0 100644 --- a/screens/scenes/append_action_to_trigger.py +++ b/screens/scenes/append_action_to_trigger.py @@ -4,16 +4,18 @@ from ..rendering.collision_rules import resolve_collision_rules, sanitize_collis def append_action_to_trigger(slug, object_id, after_id, raw_action): - """"+ Ajouter une action" en bout de chaîne — extrait de - routes/triggers/triggers.py::trigger_append_action pour être - l'UNIQUE chemin d'écriture, partagé par la route HTTP ET par l'agent - IA (voir ai/tools.py) : ni l'un ni l'autre n'écrit `_collision_rules` - directement, tous deux passent par ici. `after_id` : dialogue.id - (feuille "dialogue") ou id (feuille "variable") de la DERNIÈRE - feuille d'une chaîne. Renvoie False si l'objet, `after_id`, ou - `raw_action` sont invalides, ou si la feuille visée a déjà un "then" - (jamais écrasé par cette fonction — set_then_action_in_rules ne fait - qu'ajouter en bout de chaîne réelle).""" + """"+ Ajouter une action" — extrait de routes/triggers/triggers.py:: + trigger_append_action pour être l'UNIQUE chemin d'écriture, partagé + par la route HTTP ET par l'agent IA (voir ai/tools.py) : ni l'un ni + l'autre n'écrit `_collision_rules` directement, tous deux passent par + ici. `after_id` : dialogue.id (feuille "dialogue") ou id (toute autre + feuille) — INSÈRE `raw_action` juste après cette feuille, où qu'elle + soit dans la chaîne (pas seulement en bout réel — voir + set_then_action_in_rules, demande explicite : "pouvoir ajouter + n'importe quelle action à n'importe quel niveau du schéma") : une + suite déjà présente passe DERRIÈRE la nouvelle action, jamais + écrasée. Renvoie False si l'objet, `after_id`, ou `raw_action` sont + invalides.""" obj = get_scene_object(slug, object_id) if obj is None: return False diff --git a/screens/scenes/move_action_in_trigger.py b/screens/scenes/move_action_in_trigger.py new file mode 100644 index 00000000..d41ce741 --- /dev/null +++ b/screens/scenes/move_action_in_trigger.py @@ -0,0 +1,18 @@ +from .get_scene_object import get_scene_object +from .set_scene_object_collision_rules import set_scene_object_collision_rules +from ..rendering.collision_rules import resolve_collision_rules, sanitize_collision_rules, move_action_in_rules + + +def move_action_in_trigger(slug, object_id, leaf_id, direction): + """Déplace une action précise d'un cran ("up"/"down", voir + screens/rendering/collision_rules.py::move_action_in_rules) dans son + déclencheur d'OBJET — même patron qu'append_action_to_trigger.""" + obj = get_scene_object(slug, object_id) + if obj is None: + return False + rules = resolve_collision_rules(obj) + if not move_action_in_rules(rules, leaf_id, direction): + return False + sanitized = sanitize_collision_rules(rules) + set_scene_object_collision_rules(slug, object_id, sanitized) + return True diff --git a/screens/scenes/remove_action_from_trigger.py b/screens/scenes/remove_action_from_trigger.py new file mode 100644 index 00000000..3a5882d9 --- /dev/null +++ b/screens/scenes/remove_action_from_trigger.py @@ -0,0 +1,20 @@ +from .get_scene_object import get_scene_object +from .set_scene_object_collision_rules import set_scene_object_collision_rules +from ..rendering.collision_rules import resolve_collision_rules, sanitize_collision_rules, remove_action_from_rules + + +def remove_action_from_trigger(slug, object_id, leaf_id): + """Retire une action précise (voir screens/rendering/collision_rules.py + ::remove_action_from_rules) d'un déclencheur d'OBJET — même patron + qu'append_action_to_trigger : UNIQUE chemin d'écriture, partagé par la + route HTTP (routes/triggers/triggers.py) et l'agent IA (voir + ai/tools.py). Renvoie False si l'objet ou `leaf_id` sont introuvables.""" + obj = get_scene_object(slug, object_id) + if obj is None: + return False + rules = resolve_collision_rules(obj) + if not remove_action_from_rules(rules, leaf_id): + return False + sanitized = sanitize_collision_rules(rules) + set_scene_object_collision_rules(slug, object_id, sanitized) + return True diff --git a/screens/screens_repo/append_action_to_screen_trigger.py b/screens/screens_repo/append_action_to_screen_trigger.py new file mode 100644 index 00000000..fb8bfb47 --- /dev/null +++ b/screens/screens_repo/append_action_to_screen_trigger.py @@ -0,0 +1,20 @@ +from .get_screen import get_screen +from .set_screen_triggers import set_screen_triggers +from ..rendering.screen_triggers import resolve_screen_triggers, sanitize_screen_triggers +from ..rendering.collision_rules import set_then_action_in_rules + + +def append_action_to_screen_trigger(slug, screen_id, after_id, raw_action): + """Équivalent de screens.append_action_to_trigger (voir scenes/ + append_action_to_trigger.py) pour un déclencheur D'ÉCRAN plutôt que + d'un objet — même chemin d'écriture UNIQUE partagé par la route HTTP + (routes/screens/screen_triggers.py) et l'agent IA (voir ai/tools.py).""" + screen = get_screen(slug, screen_id) + if screen is None: + return False + rules = resolve_screen_triggers(screen) + if not set_then_action_in_rules(rules, after_id, raw_action): + return False + sanitized = sanitize_screen_triggers(rules) + set_screen_triggers(slug, screen_id, sanitized) + return True diff --git a/screens/screens_repo/ensure_schema.py b/screens/screens_repo/ensure_schema.py index dd091dc1..45a6f48b 100644 --- a/screens/screens_repo/ensure_schema.py +++ b/screens/screens_repo/ensure_schema.py @@ -60,5 +60,13 @@ def ensure_schema(slug): # d'un jeu créé avant l'existence de cette colonne). conn.execute("ALTER TABLE _screens ADD COLUMN kind TEXT NOT NULL DEFAULT 'jeu_2d'") conn.execute("UPDATE _screens SET kind = ?", (db.get_game_type(slug),)) + if "_screen_triggers" not in screen_cols: + # Déclencheurs D'ÉCRAN (voir screens/rendering/screen_triggers.py) — + # section "Déclencheurs de l'écran" de l'éditeur de scène : SANS + # objet propriétaire, contrairement à _collision_rules (porté par + # un objet, colonne JSON dans _scene_objects.attributes). NULL + # (aucune règle) pour tout écran créé avant l'ajout de cette + # fonctionnalité, comme pour les autres colonnes ci-dessus. + conn.execute("ALTER TABLE _screens ADD COLUMN _screen_triggers TEXT") conn.commit() conn.close() diff --git a/screens/screens_repo/move_action_in_screen_trigger.py b/screens/screens_repo/move_action_in_screen_trigger.py new file mode 100644 index 00000000..3ac83076 --- /dev/null +++ b/screens/screens_repo/move_action_in_screen_trigger.py @@ -0,0 +1,18 @@ +from .get_screen import get_screen +from .set_screen_triggers import set_screen_triggers +from ..rendering.screen_triggers import resolve_screen_triggers, sanitize_screen_triggers +from ..rendering.collision_rules import move_action_in_rules + + +def move_action_in_screen_trigger(slug, screen_id, leaf_id, direction): + """Équivalent de screens.move_action_in_trigger pour un déclencheur + D'ÉCRAN plutôt que d'un objet.""" + screen = get_screen(slug, screen_id) + if screen is None: + return False + rules = resolve_screen_triggers(screen) + if not move_action_in_rules(rules, leaf_id, direction): + return False + sanitized = sanitize_screen_triggers(rules) + set_screen_triggers(slug, screen_id, sanitized) + return True diff --git a/screens/screens_repo/remove_action_from_screen_trigger.py b/screens/screens_repo/remove_action_from_screen_trigger.py new file mode 100644 index 00000000..171b7755 --- /dev/null +++ b/screens/screens_repo/remove_action_from_screen_trigger.py @@ -0,0 +1,19 @@ +from .get_screen import get_screen +from .set_screen_triggers import set_screen_triggers +from ..rendering.screen_triggers import resolve_screen_triggers, sanitize_screen_triggers +from ..rendering.collision_rules import remove_action_from_rules + + +def remove_action_from_screen_trigger(slug, screen_id, leaf_id): + """Équivalent de screens.remove_action_from_trigger pour un + déclencheur D'ÉCRAN plutôt que d'un objet — même chemin d'écriture + UNIQUE partagé par la route HTTP et l'agent IA.""" + screen = get_screen(slug, screen_id) + if screen is None: + return False + rules = resolve_screen_triggers(screen) + if not remove_action_from_rules(rules, leaf_id): + return False + sanitized = sanitize_screen_triggers(rules) + set_screen_triggers(slug, screen_id, sanitized) + return True diff --git a/screens/screens_repo/set_screen_triggers.py b/screens/screens_repo/set_screen_triggers.py new file mode 100644 index 00000000..3b6e6ec7 --- /dev/null +++ b/screens/screens_repo/set_screen_triggers.py @@ -0,0 +1,20 @@ +import json + +import db + +from .ensure_schema import ensure_schema + + +def set_screen_triggers(slug, screen_id, rules): + """Remplace TOUTES les règles "déclencheur d'écran -> action" de cet + écran (voir screens/rendering/screen_triggers.py) — même patron que + set_scene_object_collision_rules pour un objet, mais stocké + directement sur _screens (aucun objet propriétaire).""" + ensure_schema(slug) + conn = db.connect(slug) + conn.execute( + "UPDATE _screens SET _screen_triggers = ? WHERE id = ?", + (json.dumps(rules), screen_id), + ) + conn.commit() + conn.close() diff --git a/static/js/play/__tests__/collision-rules-controller.test.js b/static/js/play/__tests__/collision-rules-controller.test.js index d09b036a..a5a9e799 100644 --- a/static/js/play/__tests__/collision-rules-controller.test.js +++ b/static/js/play/__tests__/collision-rules-controller.test.js @@ -19,6 +19,7 @@ global.forgeApplyVariableActionOffline = global.forgeApplyVariableActionOffline const { forgeCollisionRuleTriggerActive, forgeRunCollisionRuleAction, forgeCollisionRuleTick, forgeStartCollisionRuleControllers, forgeStopCollisionRuleControllers, + forgeBindClicSurvolRules, forgeUnbindClicSurvolRules, } = require('../collision-rules-controller.js'); // La bulle "Appuie sur X" est ajoutée comme SŒUR de l'objet dans son @@ -179,6 +180,137 @@ test('forgeRunCollisionRuleAction — "dialogue" transmet son "then" à forgeSho assert.deepEqual(calls, [['d_1', 'Crokine', [], undefined, thenAction]]); }); +test('forgeRunCollisionRuleAction — "surbrillance" bascule .forgeHighlight sur l\'objet CIBLÉ (object_id), pas forcément l\'objet du déclencheur', () => { + const targetEl = fakeEl(); + const previousDoc = global.document; + global.document = { querySelector: sel => (sel.includes('"9"') ? targetEl : undefined) }; + try { + forgeRunCollisionRuleAction({ type: 'surbrillance', object_id: 9, valeur: 'on' }, fakeEl(), { id: 1, name: 'Interrupteur' }); + assert.equal(targetEl.classList.contains('forgeHighlight'), true); + } finally { global.document = previousDoc; } +}); + +test('forgeRunCollisionRuleAction — "visibilite" masque l\'objet CIBLÉ', () => { + const targetEl = fakeEl(); + const previousDoc = global.document; + global.document = { querySelector: () => targetEl }; + try { + forgeRunCollisionRuleAction({ type: 'visibilite', object_id: 4, valeur: 'masque' }, fakeEl(), { id: 1, name: 'x' }); + assert.equal(targetEl.style.display, 'none'); + } finally { global.document = previousDoc; } +}); + +test('forgeRunCollisionRuleAction — "surbrillance" sans objet trouvé (référence orpheline) ne plante pas et exécute quand même "then"', () => { + const previousDoc = global.document; + global.document = { querySelector: () => undefined }; + global.gameData = { variables: { score: { type: 'nombre_entier', value: '0' } } }; + try { + forgeRunCollisionRuleAction({ + type: 'surbrillance', object_id: 999, valeur: 'on', + then: { type: 'variable', target_variable: 'score', data_operation: 'incrementer', data_value: '1' }, + }, fakeEl(), { id: 1, name: 'x' }); + assert.equal(gameData.variables.score.value, '1'); + } finally { global.document = previousDoc; } +}); + +test('forgeRunCollisionRuleAction — "son" joue l\'URL fournie via Audio, instantané (then exécuté tout de suite)', () => { + const previousAudio = global.Audio; + const played = []; + global.Audio = function (url) { + played.push(url); + return { play: () => Promise.resolve() }; + }; + global.gameData = { variables: { score: { type: 'nombre_entier', value: '0' } } }; + try { + forgeRunCollisionRuleAction({ + type: 'son', asset_url: '/assets/1/bip.mp3', + then: { type: 'variable', target_variable: 'score', data_operation: 'incrementer', data_value: '1' }, + }, fakeEl(), { id: 1, name: 'x' }); + assert.deepEqual(played, ['/assets/1/bip.mp3']); + assert.equal(gameData.variables.score.value, '1'); + } finally { global.Audio = previousAudio; } +}); + +test('forgeRunCollisionRuleAction — "video" attend forgeShowVideoOverlay avant d\'exécuter "then"', () => { + const previousShow = global.forgeShowVideoOverlay; + let capturedDone; + global.forgeShowVideoOverlay = (url, mode, onDone) => { capturedDone = onDone; }; + global.gameData = { variables: { score: { type: 'nombre_entier', value: '0' } } }; + try { + forgeRunCollisionRuleAction({ + type: 'video', asset_url: '/assets/1/intro.mp4', mode: 'plein_ecran', + then: { type: 'variable', target_variable: 'score', data_operation: 'incrementer', data_value: '1' }, + }, fakeEl(), { id: 1, name: 'x' }); + assert.equal(gameData.variables.score.value, '0'); // pas encore, la vidéo "joue" + capturedDone(); + assert.equal(gameData.variables.score.value, '1'); // maintenant, la vidéo est "finie" + } finally { global.forgeShowVideoOverlay = previousShow; } +}); + +test('forgeRunCollisionRuleAction — "attendre" suspend "then" jusqu\'à la fin du délai (data_value en secondes)', async () => { + global.gameData = { variables: { score: { type: 'nombre_entier', value: '0' } } }; + forgeRunCollisionRuleAction({ + type: 'attendre', data_value: '0', + then: { type: 'variable', target_variable: 'score', data_operation: 'incrementer', data_value: '1' }, + }, fakeEl(), { id: 1, name: 'x' }); + assert.equal(gameData.variables.score.value, '0'); // pas encore, setTimeout pas encore résolu + await new Promise(function (resolve) { setTimeout(resolve, 10); }); + assert.equal(gameData.variables.score.value, '1'); +}); + +test('forgeRunCollisionRuleAction — "indication" affiche une bulle temporisée près de l\'objet CIBLÉ', () => { + const parentEl = fakeParentEl(); + const targetEl = fakeEl(parentEl); + const previousDoc = global.document; + global.document = fakeDocument({ 4: targetEl }); + try { + forgeRunCollisionRuleAction({ type: 'indication', object_id: 4, texte: 'Regarde ici !' }, fakeEl(), { id: 1, name: 'x' }); + const bubble = parentEl.querySelector('.collisionIndicationBubble[data-for-object-id="4"]'); + assert.equal(bubble.textContent, 'Regarde ici !'); + assert.equal(bubble.style.display, 'block'); + } finally { global.document = previousDoc; } +}); + +test('forgeBindClicSurvolRules — "clic" exécute l\'action au clic, sans joueur ni tick', () => { + const targetEl = { addEventListener(event, handler) { this._handlers = this._handlers || {}; this._handlers[event] = handler; }, removeEventListener() {} }; + const previousDoc = global.document; + global.document = { querySelector: () => targetEl }; + global.gameData = { variables: { score: { type: 'nombre_entier', value: '0' } } }; + try { + forgeBindClicSurvolRules({ + elements: [{ + id: 5, collision_rules: [{ + trigger: 'clic', + action: { type: 'variable', target_variable: 'score', data_operation: 'incrementer', data_value: '1' }, + }], + }], + }); + targetEl._handlers.click(); + assert.equal(gameData.variables.score.value, '1'); + } finally { global.document = previousDoc; forgeUnbindClicSurvolRules(); } +}); + +test('forgeBindClicSurvolRules — "survol" se lie sur mouseenter, jamais sur click', () => { + const targetEl = { addEventListener(event, handler) { this._handlers = this._handlers || {}; this._handlers[event] = handler; }, removeEventListener() {} }; + const previousDoc = global.document; + global.document = { querySelector: () => targetEl }; + try { + forgeBindClicSurvolRules({ elements: [{ id: 6, collision_rules: [{ trigger: 'survol', action: { type: 'dialogue' } }] }] }); + assert.equal(typeof targetEl._handlers.mouseenter, 'function'); + assert.equal(targetEl._handlers.click, undefined); + } finally { global.document = previousDoc; forgeUnbindClicSurvolRules(); } +}); + +test('forgeBindClicSurvolRules — un déclencheur "collision" n\'est jamais lié en écouteur DOM (reste géré par le tick)', () => { + const targetEl = { addEventListener(event, handler) { this._handlers = this._handlers || {}; this._handlers[event] = handler; }, removeEventListener() {} }; + const previousDoc = global.document; + global.document = { querySelector: () => targetEl }; + try { + forgeBindClicSurvolRules({ elements: [{ id: 7, collision_rules: [{ trigger: 'collision', action: { type: 'dialogue' } }] }] }); + assert.equal(targetEl._handlers, undefined); + } finally { global.document = previousDoc; forgeUnbindClicSurvolRules(); } +}); + test('tick — la collision entre le joueur et un objet ne redéclenche pas "dialogue" tant que le contact persiste', () => { const player = { id: 1, kind: 'personnage', personnage_role: 'joueur', personnage_commandes: { interagir: 'e' } }; const npc = { id: 2, kind: 'personnage', name: 'Crokine', collision_rules: [{ trigger: 'collision', action: { type: 'dialogue', dialogue: { id: 'd_7', lines: [] } } }] }; @@ -261,6 +393,14 @@ test('tick — "interagir" affiche la bulle "Appuie sur [touche]" pendant la col }); test('forgeStartCollisionRuleControllers — inactif sans joueur ou sans règle (aucun intervalle démarré)', () => { - assert.doesNotThrow(() => forgeStartCollisionRuleControllers({ kind: 'jeu_2d', elements: [{ kind: 'personnage', personnage_role: 'joueur' }] })); - assert.doesNotThrow(() => forgeStartCollisionRuleControllers({ kind: 'jeu_2d', elements: [{ kind: 'personnage', collision_rules: [{ trigger: 'collision', action: { type: 'dialogue' } }] }] })); + // "clic"/"survol" sont liés inconditionnellement (forgeBindClicSurvolRules, + // voir plus bas) — jamais de joueur requis pour EUX, donc document.querySelector + // est bien appelé même dans ces deux cas où le tick de collision, lui, ne + // démarre pas ; un document minimal (aucun élément trouvé) suffit ici. + const previousDoc = global.document; + global.document = { querySelector: () => undefined }; + try { + assert.doesNotThrow(() => forgeStartCollisionRuleControllers({ kind: 'jeu_2d', elements: [{ kind: 'personnage', personnage_role: 'joueur' }] })); + assert.doesNotThrow(() => forgeStartCollisionRuleControllers({ kind: 'jeu_2d', elements: [{ kind: 'personnage', collision_rules: [{ trigger: 'collision', action: { type: 'dialogue' } }] }] })); + } finally { global.document = previousDoc; } }); diff --git a/static/js/play/__tests__/dialogue-box-controller.test.js b/static/js/play/__tests__/dialogue-box-controller.test.js index 33291672..75916194 100644 --- a/static/js/play/__tests__/dialogue-box-controller.test.js +++ b/static/js/play/__tests__/dialogue-box-controller.test.js @@ -103,6 +103,54 @@ test('forgeShowDialogueBox puis forgeDialogueBoxAdvance — cycle toutes les ré } finally { global.document = previousDoc; } }); +test('forgeShowDialogueBox — une réplique avec audio_url joue la voix off dès son affichage', () => { + const widget = fakeWidget(42); + const previousDoc = global.document; + const previousAudio = global.Audio; + const played = []; + global.document = { querySelector: () => widget }; + global.Audio = function (url) { + played.push(url); + return { play: () => Promise.resolve(), pause: () => {} }; + }; + try { + forgeShowDialogueBox('d_9', 'Marc', [{ speaker: 'Marc', text: 'Bonjour !', audio_url: '/assets/1/bonjour.mp3' }]); + assert.deepEqual(played, ['/assets/1/bonjour.mp3']); + } finally { global.document = previousDoc; global.Audio = previousAudio; } +}); + +test('forgeShowDialogueBox — une réplique SANS audio_url ne tente jamais de jouer un son', () => { + const widget = fakeWidget(42); + const previousDoc = global.document; + const previousAudio = global.Audio; + let called = false; + global.document = { querySelector: () => widget }; + global.Audio = function () { called = true; return { play: () => Promise.resolve(), pause: () => {} }; }; + try { + forgeShowDialogueBox('d_9', 'Marc', [{ speaker: 'Marc', text: 'Bonjour !' }]); + assert.equal(called, false); + } finally { global.document = previousDoc; global.Audio = previousAudio; } +}); + +test('forgeShowDialogueBox puis forgeDialogueBoxAdvance — la voix off de la réplique précédente s\'arrête sur la suivante', () => { + const widget = fakeWidget(42); + const previousDoc = global.document; + const previousAudio = global.Audio; + const paused = []; + global.document = { querySelector: () => widget }; + global.Audio = function (url) { + return { url: url, play: () => Promise.resolve(), pause: function () { paused.push(this.url); } }; + }; + try { + forgeShowDialogueBox('d_9', 'Marc', [ + { speaker: 'Marc', text: 'Bonjour !', audio_url: '/assets/1/a.mp3' }, + { speaker: 'Marc', text: 'Ça va ?', audio_url: '/assets/1/b.mp3' }, + ]); + forgeDialogueBoxAdvance(42); + assert.deepEqual(paused, ['/assets/1/a.mp3']); + } finally { global.document = previousDoc; global.Audio = previousAudio; } +}); + test('fin de dialogue SANS mark_completed : le dialogue n\'est jamais marqué terminé', () => { const widget = fakeWidget(42); const previousDoc = global.document; diff --git a/static/js/play/__tests__/screen-triggers-controller.test.js b/static/js/play/__tests__/screen-triggers-controller.test.js new file mode 100644 index 00000000..9b08b292 --- /dev/null +++ b/static/js/play/__tests__/screen-triggers-controller.test.js @@ -0,0 +1,45 @@ +// Déclencheurs D'ÉCRAN "à l'affichage" (voir +// static/js/play/screen-triggers-controller.js, screens/rendering/ +// screen_triggers.py) — SANS objet requis, narration/cinématique. +const test = require('node:test'); +const assert = require('node:assert/strict'); + +global.window = global.window || {}; +global.gameData = global.gameData || {}; + +const actionsMod = require('../actions.js'); +Object.assign(global, actionsMod); +require('../personnage-controller.js'); +global.forgeApplyVariableActionOffline = global.forgeApplyVariableActionOffline || require('../offline/apply-actions.js').forgeApplyVariableActionOffline; +global.forgeRunCollisionRuleAction = require('../collision-rules-controller.js').forgeRunCollisionRuleAction; + +const { forgeRunScreenTriggers } = require('../screen-triggers-controller.js'); + +test('forgeRunScreenTriggers — ignore un écran sans screen_triggers', () => { + assert.doesNotThrow(() => forgeRunScreenTriggers({ id: 1 })); + assert.doesNotThrow(() => forgeRunScreenTriggers(null)); +}); + +test('forgeRunScreenTriggers — exécute une action "variable" pour un déclencheur "affichage"', () => { + global.gameData = { variables: { intro_vue: { type: 'booleen', value: 'faux' } } }; + forgeRunScreenTriggers({ + id: 1, + screen_triggers: [{ + trigger: 'affichage', + action: { type: 'variable', target_variable: 'intro_vue', data_operation: 'definir_bool_vrai' }, + }], + }); + assert.equal(gameData.variables.intro_vue.value, '1'); +}); + +test('forgeRunScreenTriggers — ignore tout déclencheur autre que "affichage" (jamais posé en pratique, garde-fou)', () => { + global.gameData = { variables: { score: { type: 'nombre_entier', value: '0' } } }; + forgeRunScreenTriggers({ + id: 1, + screen_triggers: [{ + trigger: 'collision', + action: { type: 'variable', target_variable: 'score', data_operation: 'incrementer', data_value: '1' }, + }], + }); + assert.equal(gameData.variables.score.value, '0'); +}); diff --git a/static/js/play/collision-rules-controller.js b/static/js/play/collision-rules-controller.js index 6e25a278..b748f2b8 100644 --- a/static/js/play/collision-rules-controller.js +++ b/static/js/play/collision-rules-controller.js @@ -112,6 +112,42 @@ function forgeHideCollisionInteractBubble(objectId, objectEl) { if (bubble) bubble.style.display = 'none'; } +// ---------- Action "indication" — bulle de texte libre, temporisée ---------- +// Distincte de la bulle "Appuie sur X" ci-dessus (sa propre classe CSS, +// sa propre minuterie) : ne dépend jamais du cycle "actif tant que la +// collision dure" d'un déclencheur "interagir", peut être posée sur +// N'IMPORTE QUEL objet de l'écran (voir action.object_id, pas +// nécessairement l'objet qui porte le déclencheur). +var FORGE_INDICATION_DEFAULT_DURATION_MS = 3000; +var forgeIndicationTimeouts = {}; + +function forgeIndicationBubbleEl(objectId, parentEl) { + var bubble = parentEl.querySelector('.collisionIndicationBubble[data-for-object-id="' + objectId + '"]'); + if (!bubble) { + bubble = document.createElement('div'); + bubble.className = 'collisionIndicationBubble'; + bubble.setAttribute('data-for-object-id', objectId); + parentEl.appendChild(bubble); + } + return bubble; +} + +function forgeShowIndicationBubble(objectId, texte, dureeMs) { + var targetEl = document.querySelector('[data-object-id="' + objectId + '"]'); + var parentEl = targetEl && targetEl.parentElement; + if (!targetEl || !parentEl || !texte) return; + var objRect = forgeElementBoxRect(targetEl); + var bubble = forgeIndicationBubbleEl(objectId, parentEl); + bubble.textContent = texte; + bubble.style.display = 'block'; + bubble.style.left = (objRect.left + objRect.width / 2) + 'px'; + bubble.style.top = objRect.top + 'px'; + if (forgeIndicationTimeouts[objectId]) clearTimeout(forgeIndicationTimeouts[objectId]); + forgeIndicationTimeouts[objectId] = setTimeout(function () { + bubble.style.display = 'none'; + }, dureeMs || FORGE_INDICATION_DEFAULT_DURATION_MS); +} + // Exécute une action (top-level, sub_action d'un "interagir", ou branche // si_vrai/si_faux d'une "condition") — jamais appelée pour un "interagir" // lui-même à ce niveau, voir forgeCollisionRuleTick qui le gère à part @@ -156,6 +192,40 @@ function forgeRunCollisionRuleAction(action, targetEl, obj) { }); var branch = isTrue ? action.si_vrai : action.si_faux; if (branch) forgeRunCollisionRuleAction(branch, targetEl, obj); + } else if (action.type === 'surbrillance' || action.type === 'visibilite') { + // Cible N'IMPORTE QUEL objet de l'écran (action.object_id, pas + // forcément celui qui porte le déclencheur) — réutilise TEL QUEL + // applyObjectProperty (static/js/play/actions.js, équivalent scène 2D + // d'applyElementProperty), plutôt que de dupliquer cette logique. + var targetObjEl = document.querySelector('[data-object-id="' + action.object_id + '"]'); + if (targetObjEl) applyObjectProperty(targetObjEl, action.type, action.valeur); + if (action.then) forgeRunCollisionRuleAction(action.then, targetEl, obj); + } else if (action.type === 'son') { + // Effet sonore ponctuel, non bouclé — même comportement que l'action + // "Jouer un son" du Flow (static/js/play/actions.js), instantané : + // `then` s'exécute tout de suite, sans attendre la fin du son. + if (action.asset_url) new Audio(action.asset_url).play().catch(function () {}); + if (action.then) forgeRunCollisionRuleAction(action.then, targetEl, obj); + } else if (action.type === 'video') { + // Bloque la suite de la chaîne "then" jusqu'à la fin de la vidéo (ou + // "Passer") — voir static/js/play/video-overlay.js, même esprit + // qu'un dialogue ci-dessus. + forgeShowVideoOverlay(action.asset_url, action.mode, function () { + if (action.then) forgeRunCollisionRuleAction(action.then, targetEl, obj); + }); + } else if (action.type === 'indication') { + forgeShowIndicationBubble(action.object_id, action.texte, action.duree_ms); + if (action.then) forgeRunCollisionRuleAction(action.then, targetEl, obj); + } else if (action.type === 'attendre') { + // Suspend la chaîne "then" pendant data_value SECONDES — même + // vocabulaire que l'action "attendre" du Flow (static/js/play/ + // actions.js), utile ex. pour laisser un temps de lecture après une + // narration à l'affichage de l'écran. + var seconds = parseFloat(action.data_value); + var ms = isNaN(seconds) ? 0 : Math.max(0, seconds) * 1000; + setTimeout(function () { + if (action.then) forgeRunCollisionRuleAction(action.then, targetEl, obj); + }, ms); } } @@ -174,6 +244,11 @@ function forgeCollisionRuleTick(screenData) { var anyInteractActive = false; rules.forEach(function (rule, ruleIndex) { + // "clic"/"survol" sont liés à part (voir forgeBindClicSurvolRules, + // écouteurs DOM directs) — jamais évalués ici, sans quoi ils + // s'exécuteraient EN PLUS, à la proximité du joueur, en plus de + // leur propre déclencheur. + if (rule.trigger !== 'collision') return; var stateKey = forgeCollisionRuleStateKey(obj.id, ruleIndex); var isActive = forgeCollisionRuleTriggerActive(rule, objRect, playerRect); var wasActive = !!forgeCollisionRuleActiveState[stateKey]; @@ -217,6 +292,36 @@ function forgeStartCollisionRuleInteractListener(screenData) { window.addEventListener('keydown', activeCollisionRuleInteractListener); } +// ---------- Déclencheurs "clic"/"survol" — écouteurs DOM directs ---------- +// Contrairement à "collision" (tick + proximité du joueur), ces deux +// déclencheurs n'ont besoin NI d'un joueur NI d'un tick : un écouteur +// posé une fois par objet suffit (voir screens/rendering/ +// collision_rules.py). Re-attachés à chaque affichage d'écran, comme le +// reste de ce fichier. +var activeClicSurvolListeners = []; + +function forgeUnbindClicSurvolRules() { + activeClicSurvolListeners.forEach(function (l) { l.el.removeEventListener(l.event, l.handler); }); + activeClicSurvolListeners = []; +} + +function forgeBindClicSurvolRules(screenData) { + forgeUnbindClicSurvolRules(); + (screenData.elements || []).forEach(function (obj) { + var rules = obj.collision_rules; + if (!rules || !rules.length) return; + var targetEl = document.querySelector('[data-object-id="' + obj.id + '"]'); + if (!targetEl) return; + rules.forEach(function (rule) { + if (rule.trigger !== 'clic' && rule.trigger !== 'survol') return; + var eventName = rule.trigger === 'clic' ? 'click' : 'mouseenter'; + var handler = function () { forgeRunCollisionRuleAction(rule.action, targetEl, obj); }; + targetEl.addEventListener(eventName, handler); + activeClicSurvolListeners.push({ el: targetEl, event: eventName, handler: handler }); + }); + }); +} + function forgeStopCollisionRuleControllers() { if (activeCollisionRuleInterval) { clearInterval(activeCollisionRuleInterval); @@ -226,16 +331,20 @@ function forgeStopCollisionRuleControllers() { window.removeEventListener('keydown', activeCollisionRuleInteractListener); activeCollisionRuleInteractListener = null; } + forgeUnbindClicSurvolRules(); forgeCollisionRuleActiveState = {}; } // Même patron par écran que forgeStartPersonnageControllers — appelé -// juste après lui (voir static/js/play/screens.js), n'a d'effet que si -// l'écran a un joueur ET au moins un objet avec des règles. +// juste après lui (voir static/js/play/screens.js). "clic"/"survol" sont +// liés inconditionnellement (aucun joueur requis) ; le tick de collision +// + l'écouteur "interagir" ne démarrent, eux, que si l'écran a un joueur +// ET au moins un objet avec des règles. function forgeStartCollisionRuleControllers(screenData) { forgeStopCollisionRuleControllers(); if (!screenData || screenData.kind !== 'jeu_2d') return; var elements = screenData.elements || []; + forgeBindClicSurvolRules(screenData); var hasPlayer = elements.some(function (o) { return o.kind === 'personnage' && o.personnage_role === 'joueur'; }); var hasRules = elements.some(function (o) { return o.collision_rules && o.collision_rules.length; }); if (!hasPlayer || !hasRules) return; @@ -249,6 +358,7 @@ if (typeof module !== 'undefined' && module.exports) { forgeCollisionRuleTriggerActive, forgeRunCollisionRuleAction, forgeCollisionRuleTick, forgeStartCollisionRuleControllers, forgeStopCollisionRuleControllers, forgeCollisionRuleStateKey, forgeElementBoxRect, forgeExpandRect, + forgeBindClicSurvolRules, forgeUnbindClicSurvolRules, forgeShowIndicationBubble, }; const conditionsMod = require('./conditions.js'); global.forgeCollisionRectFromBox = global.forgeCollisionRectFromBox || conditionsMod.forgeCollisionRectFromBox; @@ -259,4 +369,8 @@ if (typeof module !== 'undefined' && module.exports) { global.FORGE_PERSONNAGE_FPS = global.FORGE_PERSONNAGE_FPS || 8; const dialogueBoxMod = require('./dialogue-box-controller.js'); global.forgeShowDialogueBox = global.forgeShowDialogueBox || dialogueBoxMod.forgeShowDialogueBox; + const actionsMod = require('./actions.js'); + global.applyObjectProperty = global.applyObjectProperty || actionsMod.applyObjectProperty; + const videoOverlayMod = require('./video-overlay.js'); + global.forgeShowVideoOverlay = global.forgeShowVideoOverlay || videoOverlayMod.forgeShowVideoOverlay; } diff --git a/static/js/play/dialogue-box-controller.js b/static/js/play/dialogue-box-controller.js index 0aaab103..af7e6ba8 100644 --- a/static/js/play/dialogue-box-controller.js +++ b/static/js/play/dialogue-box-controller.js @@ -73,11 +73,30 @@ function forgeDialogueBoxFooterEl(widget) { return widget.querySelector('[data-dialogue-role="footer"]'); } +// Voix off d'une réplique (demande explicite : "ajouter une réplique +// audio", voir db/dialogue_lines.py::"dialogue".audio_url) — jouée dès +// que la bulle s'affiche, arrêtée dès qu'une AUTRE ligne (avec ou sans +// sa propre voix off) prend sa place, pour ne jamais superposer deux +// voix off en même temps si le joueur avance vite dans la conversation. +var forgeDialogueLineAudio = null; + +function forgeStopDialogueLineAudio() { + if (forgeDialogueLineAudio) { + forgeDialogueLineAudio.pause(); + forgeDialogueLineAudio = null; + } +} + function forgeRenderDialogueBoxLine(widget, line) { var header = widget.querySelector('[data-dialogue-role="header"]'); var body = widget.querySelector('[data-dialogue-role="body"]'); if (header) header.textContent = line.speaker; if (body) body.textContent = line.text; + forgeStopDialogueLineAudio(); + if (line.audio_url) { + forgeDialogueLineAudio = new Audio(line.audio_url); + forgeDialogueLineAudio.play().catch(function () {}); // lecture bloquée par le navigateur (pas d'interaction récente) : la bulle reste lisible sans voix off plutôt que de planter. + } } // Remet le pied de la boîte dans son état "dialogue" (un seul bouton @@ -257,6 +276,7 @@ function forgeAdvanceConversation(dialogueObjectId) { if (!state) return; state.index += 1; if (state.index >= state.lines.length) { + forgeStopDialogueLineAudio(); forgeHideQuizBoxOnCurrentScreen(); var widget = forgeDialogueBoxWidgetById(dialogueObjectId); if (state.markCompleted) forgeCompleteDialogue(state.dialogueId, state.objectName); diff --git a/static/js/play/screen-triggers-controller.js b/static/js/play/screen-triggers-controller.js new file mode 100644 index 00000000..3770e821 --- /dev/null +++ b/static/js/play/screen-triggers-controller.js @@ -0,0 +1,23 @@ +// ---------- Déclencheurs D'ÉCRAN — "à l'affichage" (SANS objet) ---------- +// Voir screens/rendering/screen_triggers.py, section "Déclencheurs de +// l'écran" — narration/cinématique dès l'affichage, sans avoir besoin +// d'un objet de scène. Réutilise TEL QUEL le même moteur d'exécution +// d'action que collision-rules-controller.js (forgeRunCollisionRuleAction) +// plutôt que d'en dupliquer un second : targetEl/obj passés vides, une +// action qui a besoin d'un objet précis le porte elle-même (object_id, +// voir surbrillance/visibilite/indication). +function forgeRunScreenTriggers(screenData) { + if (!screenData) return; + var rules = screenData.screen_triggers; + if (!rules || !rules.length) return; + rules.forEach(function (rule) { + if (rule.trigger !== 'affichage') return; + forgeRunCollisionRuleAction(rule.action, null, {}); + }); +} + +// static/js/play/__tests__/ (node:test) — même garde que le reste de +// static/js/play/. +if (typeof module !== 'undefined' && module.exports) { + module.exports = { forgeRunScreenTriggers }; +} diff --git a/static/js/play/screens.js b/static/js/play/screens.js index 68dfedc6..7a1eb9a3 100644 --- a/static/js/play/screens.js +++ b/static/js/play/screens.js @@ -57,6 +57,10 @@ function showScreen(id) { // static/js/play/collision-rules-controller.js) — démarré juste après // le contrôleur de personnage dont il dépend (position du joueur). forgeStartCollisionRuleControllers(screensData.find(function(s) { return s.id === id; })); + // Déclencheurs D'ÉCRAN "à l'affichage" (voir screen-triggers-controller.js, + // screens/rendering/screen_triggers.py) — narration/cinématique sans + // objet requis, exécutée à chaque affichage de CET écran. + forgeRunScreenTriggers(screensData.find(function(s) { return s.id === id; })); // Widget "🏆 Score" (voir static/js/play/dialogue-box-controller.js) : // synchronise le compteur affiché sur CET écran avec le total déjà // gagné — sans ça, un score posé sur un écran affiché APRÈS que le diff --git a/static/js/play/video-overlay.js b/static/js/play/video-overlay.js new file mode 100644 index 00000000..33307a67 --- /dev/null +++ b/static/js/play/video-overlay.js @@ -0,0 +1,58 @@ +// ---------- Action "video" — lecture d'une vidéo de "Mes assets" ---------- +// Voir screens/rendering/collision_rules.py::"video" — bloque la suite de +// la chaîne "then" jusqu'à la fin de la vidéo (ou un clic sur "Passer"), +// même esprit qu'un dialogue (voir dialogue-box-controller.js). Un seul +// overlay posé sur , réutilisé pour chaque lecture (pas la peine +// d'en recréer un par appel). + +var forgeVideoOverlayEl = null; + +function forgeVideoOverlayRoot() { + if (forgeVideoOverlayEl) return forgeVideoOverlayEl; + var el = document.createElement('div'); + el.className = 'forgeVideoOverlay'; + el.innerHTML = + '' + + ''; + document.body.appendChild(el); + forgeVideoOverlayEl = el; + return el; +} + +// `onDone` : appelé une fois (fin naturelle OU "Passer") — jamais les +// deux, `finished` protège contre un double appel (l'événement 'ended' +// pouvant encore se déclencher juste après un clic sur "Passer"). +function forgeShowVideoOverlay(url, mode, onDone) { + if (!url) { + if (onDone) onDone(); + return; + } + var root = forgeVideoOverlayRoot(); + root.className = 'forgeVideoOverlay ' + (mode === 'incrustation' ? 'forgeVideoOverlay-incrustation' : 'forgeVideoOverlay-pleinEcran'); + root.style.display = 'flex'; + var player = root.querySelector('.forgeVideoOverlayPlayer'); + var skipBtn = root.querySelector('.forgeVideoOverlaySkip'); + var finished = false; + + function finish() { + if (finished) return; + finished = true; + root.style.display = 'none'; + player.pause(); + player.removeAttribute('src'); + player.onended = null; + skipBtn.onclick = null; + if (onDone) onDone(); + } + + player.src = url; + player.onended = finish; + skipBtn.onclick = finish; + player.play().catch(function () {}); // lecture bloquée par le navigateur (pas d'interaction récente) : reste affichée, "Passer" fonctionne toujours. +} + +// static/js/play/__tests__/ (node:test) — même garde que le reste de +// static/js/play/. +if (typeof module !== 'undefined' && module.exports) { + module.exports = { forgeShowVideoOverlay }; +} diff --git a/static/js/scenes/__tests__/collision-rules-editor.test.js b/static/js/scenes/__tests__/collision-rules-editor.test.js new file mode 100644 index 00000000..fb3983fe --- /dev/null +++ b/static/js/scenes/__tests__/collision-rules-editor.test.js @@ -0,0 +1,196 @@ +// Assistant "déclencheur -> action" (voir static/js/scenes/ +// collision-rules-editor.js, static/js/triggers/trigger-editor.js) — ce +// fichier n'a pas de module.exports (script de navigateur, pas un module +// CommonJS) : on l'exécute via vm.runInThisContext (comme une vraie +// balise + + diff --git a/tests/test_ai_chat.py b/tests/test_ai_chat.py index 3dd807cb..8d54162c 100644 --- a/tests/test_ai_chat.py +++ b/tests/test_ai_chat.py @@ -148,6 +148,40 @@ def test_describe_scene_state_lists_existing_objects_with_role_and_trigger_flag( assert "[déclencheur déjà configuré]" in description +def test_describe_scene_state_reports_no_screen_trigger_by_default(client, tmp_game_slug_cleanup): + slug, screen_id, _ = _create_jeu2d_game_with_conversation(client, tmp_game_slug_cleanup) + description = ai.chat._describe_scene_state(slug, screen_id) + assert "Aucun déclencheur d'écran" in description + + +def test_describe_scene_state_reports_an_existing_screen_trigger(client, tmp_game_slug_cleanup): + slug, screen_id, _ = _create_jeu2d_game_with_conversation(client, tmp_game_slug_cleanup) + screens.set_screen_triggers(slug, screen_id, screens.sanitize_screen_triggers([ + {"trigger": "affichage", "action": {"type": "dialogue"}}, + ])) + description = ai.chat._describe_scene_state(slug, screen_id) + assert "1 déclencheur(s) D'ÉCRAN" in description + + +def test_system_prompt_documents_the_new_triggers_and_actions(): + """Bug à éviter : ajouter un type de déclencheur/action côté moteur + (screens/rendering/collision_rules.py) sans jamais le documenter dans + le system prompt le rendrait invisible pour Ruby malgré l'outil qui + l'accepte techniquement.""" + prompt = ai.chat._SYSTEM_PROMPT + for keyword in ("\"clic\"", "\"survol\"", "\"affichage\"", "surbrillance", "visibilite", "\"son\"", "\"video\"", "indication"): + assert keyword in prompt, keyword + + +def test_system_prompt_asks_ruby_to_clarify_ambiguous_trigger_choice(): + assert "pose la question" in ai.chat._SYSTEM_PROMPT + + +def test_system_prompt_asks_ruby_to_clarify_interagir_vs_immediate_action(): + assert "interagir" in ai.chat._SYSTEM_PROMPT + assert "APPUYER SUR UNE TOUCHE" in ai.chat._SYSTEM_PROMPT + + def test_run_chat_turn_passes_the_scene_state_in_the_system_prompt(client, tmp_game_slug_cleanup, monkeypatch): slug, screen_id, conversation_id = _create_jeu2d_game_with_conversation(client, tmp_game_slug_cleanup) screens.add_scene_object(slug, screen_id, kind="personnage") diff --git a/tests/test_ai_tools.py b/tests/test_ai_tools.py index 6d469b21..3094209f 100644 --- a/tests/test_ai_tools.py +++ b/tests/test_ai_tools.py @@ -200,6 +200,92 @@ def test_dispatch_append_action_to_trigger_extends_an_existing_chain(client, tmp assert screens.resolve_collision_rules(obj)[0]["action"]["then"]["target_variable"] == "score_ia" +def test_dispatch_set_collision_rules_accepts_clic_and_survol_triggers(client, tmp_game_slug_cleanup): + slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) + object_id = screens.add_scene_object(slug, screen_id, kind="decor") + rules = [{"trigger": "clic", "action": {"type": "surbrillance", "object_id": object_id, "valeur": "toggle"}}] + dispatch_tool(slug, screen_id, 1, "set_collision_rules", {"object_id": object_id, "rules": rules}) + obj = screens.get_scene_object(slug, object_id) + assert screens.resolve_collision_rules(obj) == rules + + +def test_dispatch_set_screen_triggers_sanitizes_and_stores(client, tmp_game_slug_cleanup): + slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) + rules = [{"trigger": "affichage", "action": {"type": "video", "asset_url": "/assets/1/intro.mp4", "mode": "plein_ecran"}}] + result = dispatch_tool(slug, screen_id, 1, "set_screen_triggers", {"rules": rules}) + assert result["ok"] is True + screen = screens.get_screen(slug, screen_id) + assert screens.resolve_screen_triggers(screen) == rules + + +def test_dispatch_append_action_to_screen_trigger_extends_an_existing_chain(client, tmp_game_slug_cleanup): + slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) + screens.set_screen_triggers(slug, screen_id, screens.sanitize_screen_triggers([ + {"trigger": "affichage", "action": {"type": "dialogue", "dialogue": {"id": "d_1", "lines": []}}}, + ])) + result = dispatch_tool(slug, screen_id, 1, "append_action_to_screen_trigger", { + "after_id": "d_1", + "action": {"type": "variable", "target_variable": "score_ia", "data_operation": "incrementer", "data_value": "1"}, + }) + assert result["ok"] is True + screen = screens.get_screen(slug, screen_id) + assert screens.resolve_screen_triggers(screen)[0]["action"]["then"]["target_variable"] == "score_ia" + + +def test_dispatch_remove_trigger_action_removes_a_leaf(client, tmp_game_slug_cleanup): + slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) + object_id = screens.add_scene_object(slug, screen_id, kind="decor") + screens.set_scene_object_collision_rules(slug, object_id, screens.sanitize_collision_rules([ + {"trigger": "collision", "action": {"type": "dialogue", "dialogue": {"id": "d_1", "lines": []}}}, + ])) + result = dispatch_tool(slug, screen_id, 1, "remove_trigger_action", {"object_id": object_id, "leaf_id": "d_1"}) + assert result["ok"] is True + obj = screens.get_scene_object(slug, object_id) + assert screens.resolve_collision_rules(obj) == [] + + +def test_dispatch_move_trigger_action_swaps_a_leaf_up(client, tmp_game_slug_cleanup): + slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) + object_id = screens.add_scene_object(slug, screen_id, kind="decor") + screens.set_scene_object_collision_rules(slug, object_id, screens.sanitize_collision_rules([{ + "trigger": "collision", + "action": { + "type": "variable", "id": "v_1", "target_variable": "score", "data_operation": "incrementer", "data_value": "1", + "then": {"type": "dialogue", "dialogue": {"id": "d_1", "lines": []}}, + }, + }])) + result = dispatch_tool(slug, screen_id, 1, "move_trigger_action", {"object_id": object_id, "leaf_id": "d_1", "direction": "up"}) + assert result["ok"] is True + obj = screens.get_scene_object(slug, object_id) + assert screens.resolve_collision_rules(obj)[0]["action"]["type"] == "dialogue" + + +def test_dispatch_remove_screen_trigger_action_removes_a_leaf(client, tmp_game_slug_cleanup): + slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) + screens.set_screen_triggers(slug, screen_id, screens.sanitize_screen_triggers([ + {"trigger": "affichage", "action": {"type": "dialogue", "dialogue": {"id": "d_1", "lines": []}}}, + ])) + result = dispatch_tool(slug, screen_id, 1, "remove_screen_trigger_action", {"leaf_id": "d_1"}) + assert result["ok"] is True + screen = screens.get_screen(slug, screen_id) + assert screens.resolve_screen_triggers(screen) == [] + + +def test_dispatch_move_screen_trigger_action_swaps_a_leaf_up(client, tmp_game_slug_cleanup): + slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) + screens.set_screen_triggers(slug, screen_id, screens.sanitize_screen_triggers([{ + "trigger": "affichage", + "action": { + "type": "attendre", "id": "a_1", "data_value": "2", + "then": {"type": "dialogue", "dialogue": {"id": "d_1", "lines": []}}, + }, + }])) + result = dispatch_tool(slug, screen_id, 1, "move_screen_trigger_action", {"leaf_id": "d_1", "direction": "up"}) + assert result["ok"] is True + screen = screens.get_screen(slug, screen_id) + assert screens.resolve_screen_triggers(screen)[0]["action"]["type"] == "dialogue" + + def test_dispatch_tool_raises_for_an_unknown_tool_name(client, tmp_game_slug_cleanup): slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) try: @@ -269,6 +355,24 @@ def test_set_collision_rules_action_type_enum_matches_the_source_constant(): assert action_schema["properties"]["type"]["enum"] == list(ACTION_TYPES) +def test_set_collision_rules_trigger_enum_matches_the_source_constant(): + from screens.rendering.collision_rules import TRIGGER_TYPES + rules_schema = _tool("set_collision_rules")["input_schema"]["properties"]["rules"]["items"] + assert rules_schema["properties"]["trigger"]["enum"] == list(TRIGGER_TYPES) + + +def test_set_screen_triggers_trigger_enum_matches_the_source_constant(): + from screens.rendering.screen_triggers import TRIGGER_TYPES_SCREEN + rules_schema = _tool("set_screen_triggers")["input_schema"]["properties"]["rules"]["items"] + assert rules_schema["properties"]["trigger"]["enum"] == list(TRIGGER_TYPES_SCREEN) + + +def test_set_collision_rules_video_mode_enum_matches_the_source_constant(): + from screens.labels.video_modes import VIDEO_MODE_LABELS + action_schema = _tool("set_collision_rules")["input_schema"]["properties"]["rules"]["items"]["properties"]["action"] + assert set(action_schema["properties"]["mode"]["enum"]) == set(VIDEO_MODE_LABELS) + + def test_set_collision_rules_condition_operator_enum_matches_the_source_constant(): from screens.rendering.collision_rules import CONDITION_OPERATOR_KEYS action_schema = _tool("set_collision_rules")["input_schema"]["properties"]["rules"]["items"]["properties"]["action"] diff --git a/tests/test_collision_rules.py b/tests/test_collision_rules.py index 29968736..7ac4207b 100644 --- a/tests/test_collision_rules.py +++ b/tests/test_collision_rules.py @@ -257,10 +257,14 @@ def test_sanitize_collision_rules_keeps_a_then_chain_of_leaves(): def test_sanitize_collision_rules_bounds_a_then_chain_that_is_too_long(): """_MAX_THEN_CHAIN borne la chaîne — une chaîne trop longue postée à la main est coupée plutôt que rejetée entièrement (même tolérance que le - reste de ce moteur).""" + reste de ce moteur). Bug corrigé : à 4 (l'ancienne valeur), un + créateur enchaînant "attendre -> dialogue -> surbrillance -> attendre" + (4 maillons, un scénario tout à fait normal) voyait déjà TOUT + 5e maillon ajouté ensuite tronqué en silence — voir + screens/rendering/collision_rules.py::_MAX_THEN_CHAIN.""" chain = {"type": "variable", "target_variable": "score", "data_operation": "incrementer", "data_value": "1"} node = chain - for _ in range(10): # largement au-delà de _MAX_THEN_CHAIN (4) + for _ in range(50): # largement au-delà de _MAX_THEN_CHAIN (30) node["then"] = {"type": "variable", "target_variable": "score", "data_operation": "incrementer", "data_value": "1"} node = node["then"] rules = screens.sanitize_collision_rules([{"trigger": "collision", "action": chain}]) @@ -269,7 +273,36 @@ def test_sanitize_collision_rules_bounds_a_then_chain_that_is_too_long(): while node: depth += 1 node = node.get("then") - assert depth == 4 # _MAX_THEN_CHAIN, jamais plus + assert depth == 30 # _MAX_THEN_CHAIN, jamais plus + + +def test_sanitize_collision_rules_keeps_a_then_chain_of_five_leaves_the_bug_that_broke_the_user(): + """Reproduction directe du bug signalé : attendre -> dialogue -> + surbrillance -> attendre -> surbrillance (5 maillons) doit survivre + intact à la resanitisation qui suit chaque écriture (voir + append_action_to_screen_trigger/set_then_action_in_rules).""" + rules = screens.sanitize_collision_rules([{ + "trigger": "collision", + "action": { + "type": "attendre", "id": "a_1", "data_value": "2", + "then": { + "type": "dialogue", "dialogue": {"id": "d_1", "lines": []}, + "then": { + "type": "surbrillance", "id": "s_1", "object_id": 37, "valeur": "on", + "then": { + "type": "attendre", "id": "a_2", "data_value": "3", + "then": {"type": "surbrillance", "id": "s_2", "object_id": 37, "valeur": "off"}, + }, + }, + }, + }, + }]) + depth = 0 + node = rules[0]["action"] + while node: + depth += 1 + node = node.get("then") + assert depth == 5 def test_set_then_action_in_rules_attaches_a_new_leaf_at_the_end_of_a_dialogue_chain(): @@ -300,7 +333,11 @@ def test_set_then_action_in_rules_returns_false_for_an_unknown_leaf_id(): assert screens.set_then_action_in_rules(rules, "d_absent", {"type": "variable", "target_variable": "score", "data_operation": "incrementer"}) is False -def test_set_then_action_in_rules_never_overwrites_an_existing_then(): +def test_set_then_action_in_rules_inserts_between_a_leaf_and_its_existing_then(): + """Demande explicite : "pouvoir ajouter n'importe quelle action à + n'importe quel niveau du schéma" — la suite déjà posée (ici "score") + passe DERRIÈRE la nouvelle action insérée ("vies"), jamais écrasée + (comportement précédent : refuser purement et simplement).""" rules = screens.sanitize_collision_rules([{ "trigger": "collision", "action": { @@ -309,8 +346,321 @@ def test_set_then_action_in_rules_never_overwrites_an_existing_then(): }, }]) attached = screens.set_then_action_in_rules(rules, "d_1", {"type": "variable", "target_variable": "vies", "data_operation": "decrementer", "data_value": "1"}) - assert attached is False - assert rules[0]["action"]["then"]["target_variable"] == "score" # inchangé + assert attached is True + action = rules[0]["action"] + assert action["then"]["target_variable"] == "vies" + assert action["then"]["then"] == {"type": "variable", "id": "v_1", "target_variable": "score", "data_operation": "incrementer", "data_value": "1"} + + +def test_sanitize_collision_rules_accepts_clic_and_survol_triggers(): + """"clic"/"survol" — nouveaux déclencheurs sans besoin d'un joueur, + voir screens/rendering/collision_rules.py.""" + rules = screens.sanitize_collision_rules([ + {"trigger": "clic", "action": {"type": "dialogue"}}, + {"trigger": "survol", "action": {"type": "dialogue"}}, + ]) + assert [r["trigger"] for r in rules] == ["clic", "survol"] + + +def test_sanitize_collision_rules_keeps_a_surbrillance_action(): + rules = screens.sanitize_collision_rules([{ + "trigger": "clic", + "action": {"type": "surbrillance", "object_id": 7, "valeur": "toggle"}, + }]) + assert rules == [{"trigger": "clic", "action": {"type": "surbrillance", "object_id": 7, "valeur": "toggle"}}] + + +def test_sanitize_collision_rules_drops_a_surbrillance_action_with_an_unknown_valeur_or_object_id(): + rules = screens.sanitize_collision_rules([ + {"trigger": "clic", "action": {"type": "surbrillance", "object_id": 7, "valeur": "sorcellerie"}}, + {"trigger": "clic", "action": {"type": "surbrillance", "object_id": "pas-un-id", "valeur": "on"}}, + ]) + assert rules == [] + + +def test_sanitize_collision_rules_keeps_a_visibilite_action(): + rules = screens.sanitize_collision_rules([{ + "trigger": "collision", + "action": {"type": "visibilite", "object_id": 3, "valeur": "masque"}, + }]) + assert rules == [{"trigger": "collision", "action": {"type": "visibilite", "object_id": 3, "valeur": "masque"}}] + + +def test_sanitize_collision_rules_drops_a_visibilite_action_with_an_unknown_valeur(): + rules = screens.sanitize_collision_rules([ + {"trigger": "collision", "action": {"type": "visibilite", "object_id": 3, "valeur": "sorcellerie"}}, + ]) + assert rules == [] + + +def test_sanitize_collision_rules_keeps_a_son_action(): + rules = screens.sanitize_collision_rules([{ + "trigger": "clic", + "action": {"type": "son", "asset_url": "/assets/1/bip.mp3"}, + }]) + assert rules == [{"trigger": "clic", "action": {"type": "son", "asset_url": "/assets/1/bip.mp3"}}] + + +def test_sanitize_collision_rules_drops_a_son_action_without_asset_url(): + rules = screens.sanitize_collision_rules([{"trigger": "clic", "action": {"type": "son", "asset_url": ""}}]) + assert rules == [] + + +def test_sanitize_collision_rules_keeps_a_video_action(): + rules = screens.sanitize_collision_rules([{ + "trigger": "survol", + "action": {"type": "video", "asset_url": "/assets/1/intro.mp4", "mode": "plein_ecran"}, + }]) + assert rules == [{ + "trigger": "survol", + "action": {"type": "video", "asset_url": "/assets/1/intro.mp4", "mode": "plein_ecran"}, + }] + + +def test_sanitize_collision_rules_drops_a_video_action_with_an_unknown_mode(): + rules = screens.sanitize_collision_rules([{ + "trigger": "survol", + "action": {"type": "video", "asset_url": "/assets/1/intro.mp4", "mode": "sorcellerie"}, + }]) + assert rules == [] + + +def test_sanitize_collision_rules_keeps_an_indication_action_with_and_without_duree_ms(): + rules = screens.sanitize_collision_rules([{ + "trigger": "collision", + "action": {"type": "indication", "object_id": 5, "texte": "Regarde ici !", "duree_ms": 2000}, + }]) + assert rules == [{ + "trigger": "collision", + "action": {"type": "indication", "object_id": 5, "texte": "Regarde ici !", "duree_ms": 2000}, + }] + rules_no_duree = screens.sanitize_collision_rules([{ + "trigger": "collision", + "action": {"type": "indication", "object_id": 5, "texte": "Regarde ici !"}, + }]) + assert "duree_ms" not in rules_no_duree[0]["action"] + + +def test_sanitize_collision_rules_drops_an_indication_action_without_texte(): + rules = screens.sanitize_collision_rules([{ + "trigger": "collision", + "action": {"type": "indication", "object_id": 5, "texte": " "}, + }]) + assert rules == [] + + +def test_sanitize_collision_rules_chains_a_video_then_a_dialogue(): + """Une "video" reste une FEUILLE chaînable, comme dialogue/variable + (demande explicite : pouvoir enchaîner plusieurs actions).""" + rules = screens.sanitize_collision_rules([{ + "trigger": "collision", + "action": { + "type": "video", "id": "v_1", "asset_url": "/assets/1/intro.mp4", "mode": "plein_ecran", + "then": {"type": "dialogue", "dialogue": {"id": "d_1", "lines": []}}, + }, + }]) + assert rules[0]["action"]["then"] == {"type": "dialogue", "dialogue": {"id": "d_1", "lines": []}} + + +def test_sanitize_collision_rules_keeps_an_attendre_action(): + rules = screens.sanitize_collision_rules([{ + "trigger": "collision", + "action": {"type": "attendre", "data_value": "2.5"}, + }]) + assert rules == [{"trigger": "collision", "action": {"type": "attendre", "data_value": "2.5"}}] + + +def test_sanitize_collision_rules_drops_an_attendre_action_with_an_invalid_or_negative_value(): + rules = screens.sanitize_collision_rules([ + {"trigger": "collision", "action": {"type": "attendre", "data_value": "pas-un-nombre"}}, + {"trigger": "collision", "action": {"type": "attendre", "data_value": "-1"}}, + ]) + assert rules == [] + + +def test_sanitize_collision_rules_chains_an_attendre_then_a_dialogue(): + rules = screens.sanitize_collision_rules([{ + "trigger": "collision", + "action": { + "type": "attendre", "id": "a_1", "data_value": "2", + "then": {"type": "dialogue", "dialogue": {"id": "d_1", "lines": []}}, + }, + }]) + assert rules[0]["action"]["then"] == {"type": "dialogue", "dialogue": {"id": "d_1", "lines": []}} + + +def test_set_then_action_in_rules_addresses_a_surbrillance_leaf_by_its_own_id(): + rules = screens.sanitize_collision_rules([{ + "trigger": "clic", + "action": {"type": "surbrillance", "id": "s_1", "object_id": 7, "valeur": "on"}, + }]) + attached = screens.set_then_action_in_rules(rules, "s_1", {"type": "son", "asset_url": "/assets/1/bip.mp3"}) + assert attached is True + assert rules[0]["action"]["then"] == {"type": "son", "asset_url": "/assets/1/bip.mp3"} + + +def test_remove_action_from_rules_removes_the_whole_rule_when_removing_a_single_head_leaf(): + rules = screens.sanitize_collision_rules([{ + "trigger": "collision", + "action": {"type": "dialogue", "dialogue": {"id": "d_1", "lines": []}}, + }]) + removed = screens.remove_action_from_rules(rules, "d_1") + assert removed is True + assert rules == [] + + +def test_remove_action_from_rules_promotes_the_then_when_removing_the_head_of_a_chain(): + rules = screens.sanitize_collision_rules([{ + "trigger": "collision", + "action": { + "type": "attendre", "id": "a_1", "data_value": "2", + "then": {"type": "dialogue", "dialogue": {"id": "d_1", "lines": []}}, + }, + }]) + removed = screens.remove_action_from_rules(rules, "a_1") + assert removed is True + assert rules == [{"trigger": "collision", "action": {"type": "dialogue", "dialogue": {"id": "d_1", "lines": []}}}] + + +def test_remove_action_from_rules_removes_a_middle_leaf_and_reconnects_the_chain(): + rules = screens.sanitize_collision_rules([{ + "trigger": "collision", + "action": { + "type": "variable", "id": "v_1", "target_variable": "score", "data_operation": "incrementer", "data_value": "1", + "then": { + "type": "attendre", "id": "a_1", "data_value": "2", + "then": {"type": "dialogue", "dialogue": {"id": "d_1", "lines": []}}, + }, + }, + }]) + removed = screens.remove_action_from_rules(rules, "a_1") + assert removed is True + action = rules[0]["action"] + assert action["type"] == "variable" + assert action["then"] == {"type": "dialogue", "dialogue": {"id": "d_1", "lines": []}} + + +def test_remove_action_from_rules_returns_false_for_an_unknown_leaf_id(): + rules = screens.sanitize_collision_rules([{ + "trigger": "collision", + "action": {"type": "dialogue", "dialogue": {"id": "d_1", "lines": []}}, + }]) + assert screens.remove_action_from_rules(rules, "d_absent") is False + assert len(rules) == 1 + + +def test_remove_action_from_rules_removes_a_leaf_inside_a_condition_branch(): + rules = screens.sanitize_collision_rules([{ + "trigger": "collision", + "action": { + "type": "condition", "variable": "score", "operateur": "egal", "valeur": "1", + "si_vrai": {"type": "dialogue", "dialogue": {"id": "d_vrai", "lines": []}}, "si_faux": None, + }, + }]) + removed = screens.remove_action_from_rules(rules, "d_vrai") + assert removed is True + assert rules[0]["action"]["si_vrai"] is None + + +def test_remove_action_from_rules_removes_interagir_entirely_when_its_only_sub_action_is_removed(): + rules = screens.sanitize_collision_rules([{ + "trigger": "collision", + "action": {"type": "interagir", "sub_action": {"type": "dialogue", "dialogue": {"id": "d_1", "lines": []}}}, + }]) + removed = screens.remove_action_from_rules(rules, "d_1") + assert removed is True + assert rules == [] + + +def test_move_action_in_rules_swaps_adjacent_leaves_up_and_down(): + rules = screens.sanitize_collision_rules([{ + "trigger": "collision", + "action": { + "type": "variable", "id": "v_1", "target_variable": "score", "data_operation": "incrementer", "data_value": "1", + "then": { + "type": "attendre", "id": "a_1", "data_value": "2", + "then": {"type": "dialogue", "dialogue": {"id": "d_1", "lines": []}}, + }, + }, + }]) + moved = screens.move_action_in_rules(rules, "a_1", "up") + assert moved is True + action = rules[0]["action"] + assert action["type"] == "attendre" + assert action["then"]["type"] == "variable" + assert action["then"]["then"] == {"type": "dialogue", "dialogue": {"id": "d_1", "lines": []}} + + +def test_move_action_in_rules_at_the_start_of_the_chain_moving_up_has_no_effect_but_still_found(): + rules = screens.sanitize_collision_rules([{ + "trigger": "collision", + "action": { + "type": "variable", "id": "v_1", "target_variable": "score", "data_operation": "incrementer", "data_value": "1", + "then": {"type": "dialogue", "dialogue": {"id": "d_1", "lines": []}}, + }, + }]) + moved = screens.move_action_in_rules(rules, "v_1", "up") + assert moved is True + assert rules[0]["action"]["target_variable"] == "score" # inchangé, déjà en tête + + +def test_move_action_in_rules_returns_false_for_an_unknown_leaf_id(): + rules = screens.sanitize_collision_rules([{ + "trigger": "collision", + "action": {"type": "dialogue", "dialogue": {"id": "d_1", "lines": []}}, + }]) + assert screens.move_action_in_rules(rules, "d_absent", "up") is False + + +def test_backfill_missing_leaf_ids_assigns_a_stable_id_to_a_variable_leaf_without_one(): + """Bug corrigé : une action "variable" posée sans "id" (ex. par l'IA, + ce champ restant optionnel dans son schéma, ou une session + antérieure à cette convention) restait à jamais impossible à + adresser — "+ Ajouter une action" n'apparaissait jamais après elle.""" + rules = [{ + "trigger": "collision", + "action": {"type": "variable", "target_variable": "score", "data_operation": "incrementer", "data_value": "1"}, + }] + changed = screens.backfill_missing_leaf_ids(rules) + assert changed is True + assert rules[0]["action"]["id"] + + +def test_backfill_missing_leaf_ids_reaches_inside_condition_branches_and_then_chains(): + rules = [{ + "trigger": "collision", + "action": { + "type": "condition", "variable": "x", "operateur": "egal", "valeur": "1", + "si_vrai": { + "type": "dialogue", "dialogue": {"id": "d_1", "lines": []}, + "then": {"type": "variable", "target_variable": "score", "data_operation": "incrementer", "data_value": "1"}, + }, + "si_faux": None, + }, + }] + changed = screens.backfill_missing_leaf_ids(rules) + assert changed is True + assert rules[0]["action"]["si_vrai"]["then"]["id"] + + +def test_backfill_missing_leaf_ids_is_a_noop_when_every_leaf_already_has_one(): + rules = screens.sanitize_collision_rules([{ + "trigger": "collision", + "action": {"type": "variable", "id": "v_1", "target_variable": "score", "data_operation": "incrementer", "data_value": "1"}, + }]) + changed = screens.backfill_missing_leaf_ids(rules) + assert changed is False + assert rules[0]["action"]["id"] == "v_1" + + +def test_backfill_missing_leaf_ids_never_touches_a_dialogue_leaf_which_already_has_its_own_id(): + rules = screens.sanitize_collision_rules([{ + "trigger": "collision", + "action": {"type": "dialogue", "dialogue": {"id": "d_1", "lines": []}}, + }]) + changed = screens.backfill_missing_leaf_ids(rules) + assert changed is False + assert "id" not in rules[0]["action"] def test_sanitize_collision_rules_drops_malformed_or_unknown_rules(): diff --git a/tests/test_dialogue_lines.py b/tests/test_dialogue_lines.py new file mode 100644 index 00000000..f143724b --- /dev/null +++ b/tests/test_dialogue_lines.py @@ -0,0 +1,32 @@ +"""Lignes de dialogue (voir db/dialogue_lines.py) — réplique audio +(demande explicite : "ajouter une réplique audio"), voix off jouée en +même temps que la bulle de réplique s'affiche (voir static/js/play/ +dialogue-box-controller.js::forgeRenderDialogueBoxLine).""" +import db + + +def test_sanitize_dialogue_lines_keeps_a_valid_audio_url_on_a_dialogue_line(): + lines = db.sanitize_dialogue_lines([ + {"speaker": "Marc", "text": "Bonjour !", "audio_url": "/assets/1/bonjour.mp3"}, + ]) + assert lines == [{"type": "dialogue", "speaker": "Marc", "text": "Bonjour !", "audio_url": "/assets/1/bonjour.mp3"}] + + +def test_sanitize_dialogue_lines_omits_audio_url_when_absent(): + lines = db.sanitize_dialogue_lines([{"speaker": "Marc", "text": "Bonjour !"}]) + assert "audio_url" not in lines[0] + + +def test_sanitize_dialogue_lines_omits_a_blank_audio_url(): + lines = db.sanitize_dialogue_lines([{"speaker": "Marc", "text": "Bonjour !", "audio_url": " "}]) + assert "audio_url" not in lines[0] + + +def test_sanitize_dialogue_lines_ignores_audio_url_on_a_question_line(): + """L'audio n'a de sens que pour une RÉPLIQUE — une question à choix + ("❓ Question") reste inchangée, voir QUESTION_REWARD_TYPES.""" + lines = db.sanitize_dialogue_lines([{ + "type": "question", "text": "2+2 ?", "choices": ["3", "4"], "correct_index": 1, + "audio_url": "/assets/1/question.mp3", + }]) + assert "audio_url" not in lines[0] diff --git a/tests/test_scene_edit_view.py b/tests/test_scene_edit_view.py index 7993487f..88304a1d 100644 --- a/tests/test_scene_edit_view.py +++ b/tests/test_scene_edit_view.py @@ -23,6 +23,62 @@ def test_jeu2d_game_dispatches_to_scene_editor(client, tmp_game_slug_cleanup): assert "Personnages" in html +def test_scene_edit_view_splits_my_assets_into_fond_decor_sons_videos_subsections(client, tmp_game_slug_cleanup): + """Demande explicite : "des sous-menu pour voir, utiliser ou + supprimer des son, image et video", PUIS "un bouton d'import séparé + pour les images de fond et les objets" — "Mes assets" doit séparer + Fonds/Décors/Sons/Vidéos (voir auth/user_asset_kind.py, + auth/create_user_asset.py::scene_kind), chacun avec son bouton de + suppression ; le sélecteur de fichier des actions "son"/"vidéo" + (USER_ASSETS_OPTIONS), lui, voit TOUJOURS tout, peu importe le type.""" + import auth + slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) + with client.session_transaction() as sess: + user_id = sess["user_id"] + fond_id = auth.create_user_asset(user_id, "ciel.png", original_name="ciel.png", source="upload", scene_kind="fond") + decor_id = auth.create_user_asset(user_id, "photo.png", original_name="photo.png", source="upload", scene_kind="decor") + audio_id = auth.create_user_asset(user_id, "bip.mp3", original_name="bip.mp3", source="upload") + video_id = auth.create_user_asset(user_id, "clip.mp4", original_name="clip.mp4", source="upload") + + html = client.get(f"/game/{slug}/screens/{screen_id}/edit").get_data(as_text=True) + m = re.search(r"var USER_ASSETS_OPTIONS = (\[.*?\]);", html) + names = [o["name"] for o in json.loads(m.group(1))] + assert set(names) == {"ciel.png", "photo.png", "bip.mp3", "clip.mp4"} + + fond_section = html.split('Fonds', 1)[1].split("", 1)[0] + decor_section = html.split('Décors/objets', 1)[1].split("", 1)[0] + sons_section = html.split('Sons', 1)[1].split("", 1)[0] + videos_section = html.split('Vidéos', 1)[1].split("", 1)[0] + + assert "ciel.png" in fond_section and "photo.png" not in fond_section + assert "addSceneObject('fond', null, null, {})".format(fond_id) in fond_section + assert "photo.png" in decor_section and "ciel.png" not in decor_section + assert "addSceneObject('decor', null, null, {})".format(decor_id) in decor_section + assert "bip.mp3" in sons_section and "photo.png" not in sons_section + assert "clip.mp4" in videos_section and "photo.png" not in videos_section + + # Un bouton de suppression pour chacun (demande explicite). + for asset_id in (fond_id, decor_id, audio_id, video_id): + assert "deleteUserAsset({},".format(asset_id) in html + + +def test_scene_edit_view_defaults_a_legacy_image_without_scene_kind_to_decor(client, tmp_game_slug_cleanup): + """Une image importée AVANT l'ajout de scene_kind (NULL en base) doit + rester utilisable — comportement inchangé : "decor", jamais perdue + dans un vide entre les deux sous-sections.""" + import auth + slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) + with client.session_transaction() as sess: + user_id = sess["user_id"] + auth.create_user_asset(user_id, "ancienne.png", original_name="ancienne.png", source="upload") + + html = client.get(f"/game/{slug}/screens/{screen_id}/edit").get_data(as_text=True) + decor_section = html.split('Décors/objets', 1)[1].split("", 1)[0] + fond_section = html.split('Fonds', 1)[1].split("", 1)[0] + assert "ancienne.png" in decor_section + assert "ancienne.png" not in fond_section + + def test_scene_edit_view_renders_with_a_personnage_object_selected(client, tmp_game_slug_cleanup): slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) resp = client.post( diff --git a/tests/test_scene_object_add_ajax.py b/tests/test_scene_object_add_ajax.py index 8215f317..a68200bd 100644 --- a/tests/test_scene_object_add_ajax.py +++ b/tests/test_scene_object_add_ajax.py @@ -4,9 +4,18 @@ JSON (posée quand l'appelant envoie X-Requested-With: fetch) remplace le rechargement complet de page — sans ça, poser un objet "vidait" un instant l'éditeur de collision/quêtes (tout l'état JS repartait de zéro à chaque ajout).""" +import io +import struct + +import auth import screens +def _png_bytes(width, height): + ihdr = struct.pack(">II", width, height) + b"\x08\x02\x00\x00\x00" + return b"\x89PNG\r\n\x1a\n" + b"\x00\x00\x00\x0d" + b"IHDR" + ihdr + b"\x00\x00\x00\x00" + + def _create_jeu2d_game(client, tmp_game_slug_cleanup, name="pytest_add_ajax"): resp = client.post("/games/new", data={"name": name}, follow_redirects=False) slug = tmp_game_slug_cleanup(resp.headers["Location"].rstrip("/").split("/")[-1]) @@ -31,6 +40,83 @@ def test_ajax_add_returns_json_instead_of_redirecting(client, tmp_game_slug_clea assert body["animations"] +def test_ajax_add_with_drop_position_places_the_object_exactly_there(client, tmp_game_slug_cleanup): + """Vrai glisser-déposer (demande explicite : "n'importe où sur la + scène") — x/y postés remplacent le défaut 100/100.""" + slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) + resp = _add_ajax(client, slug, screen_id, kind="decor", x="300", y="220") + assert resp.status_code == 200 + body = resp.get_json() + assert body["x"] == 300 + assert body["y"] == 220 + + +def test_ajax_add_with_drop_position_near_the_edge_is_clamped_into_the_camera(client, tmp_game_slug_cleanup): + """Un dépôt trop proche d'un bord ne doit jamais laisser l'objet + déborder du cadre visible par la caméra une fois sa taille réelle + connue (même esprit que ai/tools.py::_clamp_to_camera pour l'IA).""" + slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) + resp = _add_ajax(client, slug, screen_id, kind="decor", x="999999", y="999999") + assert resp.status_code == 200 + body = resp.get_json() + assert body["x"] <= 960 - body["width"] + assert body["y"] <= 540 - body["height"] + + +# ---------- Fond importé ("Mes assets") posé à sa taille RÉELLE — bug : +# "je ne peux pas poser un objet hors du champ de la caméra quand +# j'utilise un fond de scène importé" (sans ça, l'image retombait +# toujours sur 128×128, trop petite pour agrandir le "monde" au-delà de +# la caméra nominale 960×540) ---------- + +def test_ajax_add_fond_ignores_the_drop_position_and_stays_anchored_at_the_origin(client, tmp_game_slug_cleanup): + """Bug corrigé ("décalage") : le vrai glisser-déposer envoie une + position EXACTE même pour un fond — sans ce garde-fou, un fond + déposé ailleurs qu'au coin haut-gauche restait décalé, laissant un + bandeau de canevas vide visible entre le bord de la scène et + l'image.""" + slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) + resp = _add_ajax(client, slug, screen_id, kind="fond", x="450", y="300") + assert resp.status_code == 200 + body = resp.get_json() + assert (body["x"], body["y"]) == (0, 0) + + +def test_ajax_add_fond_from_user_asset_uses_the_real_image_dimensions(client, tmp_game_slug_cleanup): + slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) + with client.session_transaction() as sess: + user_id = sess["user_id"] + asset_id, _filename = auth.save_user_asset( + user_id, _png_bytes(1920, 1080), ".png", original_name="ciel.png", source="upload", scene_kind="fond", + ) + resp = _add_ajax(client, slug, screen_id, kind="fond", asset_id=str(asset_id)) + assert resp.status_code == 200 + body = resp.get_json() + assert body["width"] == 1920 + assert body["height"] == 1080 + + +# ---------- Redimensionnement manuel d'un "fond" — la route /geometry +# doit renvoyer le "monde" recalculé pour que scene-editor.js puisse +# rafraîchir SCENE_WIDTH/SCENE_HEIGHT tout de suite (même bug que +# ci-dessus, mais via le redimensionnement à la souris plutôt qu'un +# import — sans ça, l'agrandissement n'était visible qu'après un +# rechargement complet de la page) ---------- + +def test_geometry_route_returns_the_recomputed_world_size_for_an_enlarged_fond(client, tmp_game_slug_cleanup): + slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) + resp = _add_ajax(client, slug, screen_id, kind="fond") + obj_id = resp.get_json()["id"] + geo = client.post( + f"/game/{slug}/scene-objects/{obj_id}/geometry", + json={"x": 0, "y": 0, "width": 2000, "height": 1200}, + ) + assert geo.status_code == 200 + body = geo.get_json() + assert body["world_width"] >= 2000 + assert body["world_height"] >= 1200 + + def test_non_ajax_add_still_redirects(client, tmp_game_slug_cleanup): """Secours pour tout appelant non-JS (aucun connu, mais gratuit à garder) — comportement inchangé : redirection classique, sans le header AJAX.""" diff --git a/tests/test_scene_objects.py b/tests/test_scene_objects.py index e01f74bb..0ef4ee81 100644 --- a/tests/test_scene_objects.py +++ b/tests/test_scene_objects.py @@ -40,6 +40,33 @@ def test_add_decor_scene_object(tmp_game_slug_cleanup): assert obj["kind"] == "decor" +def test_add_decor_scene_object_with_an_image_defaults_to_200x200_with_a_150x150_collision_box(tmp_game_slug_cleanup): + """Demande explicite : un objet/décor posé depuis "Mes assets" doit + toujours démarrer à 200×200 (jamais la taille réelle, souvent bien + plus grande, ni le défaut 128×128 du schéma), avec une boîte de + collision plus petite (150×150, centrée) pour rester proche de la + silhouette réelle.""" + slug, screen_id = _create_jeu2d_game(tmp_game_slug_cleanup) + obj_id = screens.add_scene_object(slug, screen_id, kind="decor", image_url="/assets/1/photo.png") + obj = screens.get_scene_object(slug, obj_id) + assert (obj["width"], obj["height"]) == (200, 200) + collision = screens.resolve_collision_settings(obj) + assert (collision["width"], collision["height"]) == (150, 150) + + +def test_add_decor_scene_object_with_an_image_ignores_real_image_dimensions(tmp_game_slug_cleanup): + """Contrairement à "fond" (voir add_scene_object.py), un "decor" ne + doit JAMAIS être posé à la taille réelle de l'image importée — même + quand elle est connue (image_width/image_height fournis).""" + slug, screen_id = _create_jeu2d_game(tmp_game_slug_cleanup) + obj_id = screens.add_scene_object( + slug, screen_id, kind="decor", image_url="/assets/1/photo.png", + image_width=5504, image_height=3072, + ) + obj = screens.get_scene_object(slug, obj_id) + assert (obj["width"], obj["height"]) == (200, 200) + + def test_scene_object_geometry_is_pixels_not_percent(tmp_game_slug_cleanup): slug, screen_id = _create_jeu2d_game(tmp_game_slug_cleanup) obj_id = screens.add_scene_object(slug, screen_id) @@ -108,6 +135,44 @@ def test_render_scene_object_fond_alt_is_always_empty_rgaa(tmp_game_slug_cleanup assert 'alt=""' in html +def test_add_scene_object_with_explicit_position_uses_it_instead_of_the_default(tmp_game_slug_cleanup): + """Vrai glisser-déposer depuis la galerie (demande explicite : + "n'importe où sur la scène") — x/y explicites remplacent le défaut + 100/100 posé par le schéma (voir ensure_scene_schema.py).""" + slug, screen_id = _create_jeu2d_game(tmp_game_slug_cleanup) + obj_id = screens.add_scene_object(slug, screen_id, kind="decor", x=250, y=340) + obj = screens.get_scene_object(slug, obj_id) + assert obj["x"] == 250 + assert obj["y"] == 340 + + +def test_add_scene_object_without_position_still_defaults_to_100_100(tmp_game_slug_cleanup): + slug, screen_id = _create_jeu2d_game(tmp_game_slug_cleanup) + obj_id = screens.add_scene_object(slug, screen_id, kind="decor") + obj = screens.get_scene_object(slug, obj_id) + assert obj["x"] == 100 + assert obj["y"] == 100 + + +def test_add_scene_object_fond_with_explicit_position_overrides_the_top_left_default(tmp_game_slug_cleanup): + """Un "fond" reste au coin haut-gauche (0,0) SANS position explicite + (comportement inchangé), mais un glisser-déposer précis doit pouvoir + le positionner ailleurs si le créateur le demande explicitement.""" + slug, screen_id = _create_jeu2d_game(tmp_game_slug_cleanup) + obj_id = screens.add_scene_object(slug, screen_id, kind="fond", background_slug="foret", x=50, y=60) + obj = screens.get_scene_object(slug, obj_id) + assert obj["x"] == 50 + assert obj["y"] == 60 + + +def test_add_scene_object_fond_without_position_still_defaults_to_top_left(tmp_game_slug_cleanup): + slug, screen_id = _create_jeu2d_game(tmp_game_slug_cleanup) + obj_id = screens.add_scene_object(slug, screen_id, kind="fond", background_slug="foret") + obj = screens.get_scene_object(slug, obj_id) + assert obj["x"] == 0 + assert obj["y"] == 0 + + def test_delete_scene_object_cleans_up_referencing_flow_nodes(tmp_game_slug_cleanup): slug, screen_id = _create_jeu2d_game(tmp_game_slug_cleanup) obj_id = screens.add_scene_object(slug, screen_id) diff --git a/tests/test_screen_triggers.py b/tests/test_screen_triggers.py new file mode 100644 index 00000000..251d0e8f --- /dev/null +++ b/tests/test_screen_triggers.py @@ -0,0 +1,262 @@ +"""Déclencheurs D'ÉCRAN (voir screens/rendering/screen_triggers.py) : une +règle "déclencheur (affichage) -> action" posée sur un ÉCRAN plutôt que +sur un objet — SANS objet requis, pour de la narration/cinématique dès +l'affichage. Section "Déclencheurs de l'écran" de l'éditeur de scène.""" +import screens + + +def _create_jeu2d_game(client, tmp_game_slug_cleanup, name="pytest_screen_triggers"): + resp = client.post("/games/new", data={"name": name}, follow_redirects=False) + slug = tmp_game_slug_cleanup(resp.headers["Location"].rstrip("/").split("/")[-1]) + screen_id = screens.create_screen(slug, "Scène 1", kind="jeu_2d") + return slug, screen_id + + +def test_freshly_created_screen_has_no_screen_triggers(client, tmp_game_slug_cleanup): + slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) + screen = screens.get_screen(slug, screen_id) + assert screens.resolve_screen_triggers(screen) == [] + + +def test_sanitize_screen_triggers_keeps_an_affichage_trigger(): + rules = screens.sanitize_screen_triggers([ + {"trigger": "affichage", "action": {"type": "dialogue"}}, + ]) + assert rules == [{"trigger": "affichage", "action": {"type": "dialogue"}}] + + +def test_sanitize_screen_triggers_rejects_triggers_not_allowed_at_screen_level(): + """Un déclencheur d'OBJET ("collision"/"clic"/"survol") n'a pas de + sens sans objet — seul "affichage" est autorisé pour un déclencheur + d'écran (voir TRIGGER_TYPES_SCREEN).""" + rules = screens.sanitize_screen_triggers([ + {"trigger": "collision", "action": {"type": "dialogue"}}, + {"trigger": "clic", "action": {"type": "dialogue"}}, + {"trigger": "survol", "action": {"type": "dialogue"}}, + ]) + assert rules == [] + + +def test_sanitize_screen_triggers_keeps_a_video_action(): + rules = screens.sanitize_screen_triggers([{ + "trigger": "affichage", + "action": {"type": "video", "asset_url": "/assets/1/intro.mp4", "mode": "plein_ecran"}, + }]) + assert rules == [{ + "trigger": "affichage", + "action": {"type": "video", "asset_url": "/assets/1/intro.mp4", "mode": "plein_ecran"}, + }] + + +def test_sanitize_screen_triggers_keeps_an_attendre_then_dialogue_chain(): + """Cas d'usage demandé : "à l'affichage de l'écran" -> attendre N + secondes -> déclencher un dialogue.""" + rules = screens.sanitize_screen_triggers([{ + "trigger": "affichage", + "action": { + "type": "attendre", "data_value": "3", + "then": {"type": "dialogue", "dialogue": {"id": "d_1", "lines": []}}, + }, + }]) + assert rules[0]["action"]["type"] == "attendre" + assert rules[0]["action"]["then"]["type"] == "dialogue" + + +def test_set_screen_triggers_persists_and_resolve_reads_it_back(client, tmp_game_slug_cleanup): + slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) + screens.set_screen_triggers(slug, screen_id, [{"trigger": "affichage", "action": {"type": "dialogue"}}]) + screen = screens.get_screen(slug, screen_id) + assert screens.resolve_screen_triggers(screen) == [{"trigger": "affichage", "action": {"type": "dialogue"}}] + + +def test_screen_triggers_are_isolated_between_screens(client, tmp_game_slug_cleanup): + slug, screen_id_1 = _create_jeu2d_game(client, tmp_game_slug_cleanup) + screen_id_2 = screens.create_screen(slug, "Scène 2", kind="jeu_2d") + screens.set_screen_triggers(slug, screen_id_1, [{"trigger": "affichage", "action": {"type": "dialogue"}}]) + screen_2 = screens.get_screen(slug, screen_id_2) + assert screens.resolve_screen_triggers(screen_2) == [] + + +def test_append_action_to_screen_trigger_attaches_a_leaf_at_the_end_of_the_chain(client, tmp_game_slug_cleanup): + slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) + screens.set_screen_triggers(slug, screen_id, [{ + "trigger": "affichage", + "action": {"type": "dialogue", "dialogue": {"id": "d_1", "lines": []}}, + }]) + ok = screens.append_action_to_screen_trigger( + slug, screen_id, "d_1", + {"type": "variable", "target_variable": "score", "data_operation": "incrementer", "data_value": "1"}, + ) + assert ok is True + screen = screens.get_screen(slug, screen_id) + rules = screens.resolve_screen_triggers(screen) + assert rules[0]["action"]["then"]["type"] == "variable" + + +def test_append_action_to_screen_trigger_returns_false_for_an_unknown_screen(client, tmp_game_slug_cleanup): + slug, _ = _create_jeu2d_game(client, tmp_game_slug_cleanup) + assert screens.append_action_to_screen_trigger(slug, 999999, "d_1", {"type": "dialogue"}) is False + + +def test_full_game_payload_exposes_screen_triggers(client, tmp_game_slug_cleanup): + slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) + screens.set_screen_triggers(slug, screen_id, [{"trigger": "affichage", "action": {"type": "dialogue"}}]) + payload = screens.full_game_payload(slug) + scene_screen = next(s for s in payload["screens"] if s["id"] == screen_id) + assert scene_screen["screen_triggers"] == [{"trigger": "affichage", "action": {"type": "dialogue"}}] + + +def test_screen_triggers_get_route_returns_the_saved_rules(client, tmp_game_slug_cleanup): + slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) + screens.set_screen_triggers(slug, screen_id, [{"trigger": "affichage", "action": {"type": "dialogue"}}]) + resp = client.get(f"/game/{slug}/screens/{screen_id}/triggers") + assert resp.status_code == 200 + assert resp.get_json() == [{"trigger": "affichage", "action": {"type": "dialogue"}}] + + +def test_screen_triggers_post_route_appends_a_rule(client, tmp_game_slug_cleanup): + slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) + resp = client.post( + f"/game/{slug}/screens/{screen_id}/triggers", + json={"rule": {"trigger": "affichage", "action": {"type": "dialogue"}}}, + ) + assert resp.status_code == 200 + screen = screens.get_screen(slug, screen_id) + assert screens.resolve_screen_triggers(screen) == [{"trigger": "affichage", "action": {"type": "dialogue"}}] + + +def test_screen_trigger_delete_one_route_removes_only_the_targeted_rule(client, tmp_game_slug_cleanup): + slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) + screens.set_screen_triggers(slug, screen_id, [ + {"trigger": "affichage", "action": {"type": "dialogue"}}, + {"trigger": "affichage", "action": {"type": "son", "asset_url": "/assets/1/bip.mp3"}}, + ]) + resp = client.delete(f"/game/{slug}/screens/{screen_id}/triggers/0") + assert resp.status_code == 200 + screen = screens.get_screen(slug, screen_id) + rules = screens.resolve_screen_triggers(screen) + assert len(rules) == 1 + assert rules[0]["action"]["type"] == "son" + + +def test_screen_trigger_delete_one_route_404s_for_an_out_of_range_index(client, tmp_game_slug_cleanup): + slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) + resp = client.delete(f"/game/{slug}/screens/{screen_id}/triggers/0") + assert resp.status_code == 404 + + +def test_screen_triggers_delete_route_clears_all_rules(client, tmp_game_slug_cleanup): + slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) + screens.set_screen_triggers(slug, screen_id, [{"trigger": "affichage", "action": {"type": "dialogue"}}]) + resp = client.delete(f"/game/{slug}/screens/{screen_id}/triggers") + assert resp.status_code == 200 + screen = screens.get_screen(slug, screen_id) + assert screens.resolve_screen_triggers(screen) == [] + + +def test_screen_triggers_get_route_backfills_and_persists_a_missing_leaf_id(client, tmp_game_slug_cleanup): + slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) + screens.set_screen_triggers(slug, screen_id, [{ + "trigger": "affichage", + "action": {"type": "variable", "target_variable": "score", "data_operation": "incrementer", "data_value": "1"}, + }]) + + resp1 = client.get(f"/game/{slug}/screens/{screen_id}/triggers") + leaf_id = resp1.get_json()[0]["action"]["id"] + assert leaf_id + + resp2 = client.get(f"/game/{slug}/screens/{screen_id}/triggers") + assert resp2.get_json()[0]["action"]["id"] == leaf_id # stable + + append_resp = client.post( + f"/game/{slug}/screens/{screen_id}/triggers/append-action", + json={"after_id": leaf_id, "action": {"type": "dialogue", "dialogue": {"id": "d_1", "lines": []}}}, + ) + assert append_resp.status_code == 200 + + +def test_screen_triggers_get_route_404s_for_an_unknown_screen(client, tmp_game_slug_cleanup): + slug, _ = _create_jeu2d_game(client, tmp_game_slug_cleanup) + resp = client.get(f"/game/{slug}/screens/999999/triggers") + assert resp.status_code == 404 + + +def test_screen_trigger_dialogue_update_route_edits_the_matching_dialogue(client, tmp_game_slug_cleanup): + slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) + screens.set_screen_triggers(slug, screen_id, [{ + "trigger": "affichage", + "action": {"type": "dialogue", "dialogue": {"id": "d_1", "lines": []}}, + }]) + resp = client.post( + f"/game/{slug}/screens/{screen_id}/triggers/dialogue", + json={"dialogue_id": "d_1", "lines": [{"speaker": "narrateur", "text": "Bienvenue !"}]}, + ) + assert resp.status_code == 200 + screen = screens.get_screen(slug, screen_id) + rules = screens.resolve_screen_triggers(screen) + assert rules[0]["action"]["dialogue"]["lines"] == [{"type": "dialogue", "speaker": "narrateur", "text": "Bienvenue !"}] + + +def test_screen_trigger_remove_action_route_removes_the_whole_rule_when_it_is_the_only_leaf(client, tmp_game_slug_cleanup): + slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) + screens.set_screen_triggers(slug, screen_id, [{ + "trigger": "affichage", + "action": {"type": "dialogue", "dialogue": {"id": "d_1", "lines": []}}, + }]) + resp = client.delete(f"/game/{slug}/screens/{screen_id}/triggers/action/d_1") + assert resp.status_code == 200 + screen = screens.get_screen(slug, screen_id) + assert screens.resolve_screen_triggers(screen) == [] + + +def test_screen_trigger_remove_action_route_404s_for_an_unknown_leaf_id(client, tmp_game_slug_cleanup): + slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) + screens.set_screen_triggers(slug, screen_id, [{ + "trigger": "affichage", + "action": {"type": "dialogue", "dialogue": {"id": "d_1", "lines": []}}, + }]) + resp = client.delete(f"/game/{slug}/screens/{screen_id}/triggers/action/d_absent") + assert resp.status_code == 404 + + +def test_screen_trigger_move_action_route_swaps_a_leaf_up_in_its_chain(client, tmp_game_slug_cleanup): + slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) + screens.set_screen_triggers(slug, screen_id, [{ + "trigger": "affichage", + "action": { + "type": "attendre", "id": "a_1", "data_value": "2", + "then": {"type": "dialogue", "dialogue": {"id": "d_1", "lines": []}}, + }, + }]) + resp = client.post(f"/game/{slug}/screens/{screen_id}/triggers/action/d_1/move", json={"direction": "up"}) + assert resp.status_code == 200 + screen = screens.get_screen(slug, screen_id) + action = screens.resolve_screen_triggers(screen)[0]["action"] + assert action["type"] == "dialogue" + assert action["then"]["type"] == "attendre" + + +def test_screen_trigger_move_action_route_400s_for_an_invalid_direction(client, tmp_game_slug_cleanup): + slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) + screens.set_screen_triggers(slug, screen_id, [{ + "trigger": "affichage", + "action": {"type": "dialogue", "dialogue": {"id": "d_1", "lines": []}}, + }]) + resp = client.post(f"/game/{slug}/screens/{screen_id}/triggers/action/d_1/move", json={"direction": "sideways"}) + assert resp.status_code == 400 + + +def test_screen_trigger_append_action_route_attaches_a_leaf(client, tmp_game_slug_cleanup): + slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) + screens.set_screen_triggers(slug, screen_id, [{ + "trigger": "affichage", + "action": {"type": "dialogue", "dialogue": {"id": "d_1", "lines": []}}, + }]) + resp = client.post( + f"/game/{slug}/screens/{screen_id}/triggers/append-action", + json={"after_id": "d_1", "action": {"type": "son", "asset_url": "/assets/1/bip.mp3"}}, + ) + assert resp.status_code == 200 + screen = screens.get_screen(slug, screen_id) + rules = screens.resolve_screen_triggers(screen) + assert rules[0]["action"]["then"] == {"type": "son", "asset_url": "/assets/1/bip.mp3"} diff --git a/tests/test_triggers.py b/tests/test_triggers.py index d688fd25..2a9cc97a 100644 --- a/tests/test_triggers.py +++ b/tests/test_triggers.py @@ -295,7 +295,11 @@ def test_trigger_append_action_route_404s_for_an_unknown_after_id(client, tmp_ga assert resp.status_code == 404 -def test_trigger_append_action_route_404s_when_the_leaf_already_has_a_then(client, tmp_game_slug_cleanup): +def test_trigger_append_action_route_inserts_between_a_leaf_and_its_existing_then(client, tmp_game_slug_cleanup): + """Demande explicite : "pouvoir ajouter n'importe quelle action à + n'importe quel niveau du schéma" — poser "+ Ajouter une action" sur + un bloc qui a déjà une suite INSÈRE la nouvelle action devant cette + suite plutôt que d'échouer (comportement précédent).""" slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) obj_id = _add_personnage(client, slug, screen_id, role="pnj") _set_rules(slug, obj_id, [{ @@ -310,9 +314,11 @@ def test_trigger_append_action_route_404s_when_the_leaf_already_has_a_then(clien f"/game/{slug}/triggers/{obj_id}/append-action", json={"after_id": "d_1", "action": {"type": "variable", "target_variable": "vies", "data_operation": "decrementer"}}, ) - assert resp.status_code == 404 + assert resp.status_code == 200 obj = screens.get_scene_object(slug, obj_id) - assert screens.resolve_collision_rules(obj)[0]["action"]["then"]["target_variable"] == "score" # inchangé + action = screens.resolve_collision_rules(obj)[0]["action"] + assert action["then"]["target_variable"] == "vies" + assert action["then"]["then"]["target_variable"] == "score" def test_trigger_append_action_route_404s_for_an_unknown_object(client, game): @@ -320,6 +326,89 @@ def test_trigger_append_action_route_404s_for_an_unknown_object(client, game): assert resp.status_code == 404 +def test_trigger_remove_action_route_removes_the_whole_rule_when_it_is_the_only_leaf(client, tmp_game_slug_cleanup): + slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) + obj_id = _add_personnage(client, slug, screen_id, role="pnj") + _set_rules(slug, obj_id, [{ + "trigger": "collision", + "action": {"type": "dialogue", "dialogue": {"id": "d_1", "lines": []}}, + }]) + + resp = client.delete(f"/game/{slug}/triggers/{obj_id}/action/d_1") + assert resp.status_code == 200 + obj = screens.get_scene_object(slug, obj_id) + assert screens.resolve_collision_rules(obj) == [] + + +def test_trigger_remove_action_route_404s_for_an_unknown_leaf_id(client, tmp_game_slug_cleanup): + slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) + obj_id = _add_personnage(client, slug, screen_id, role="pnj") + _set_rules(slug, obj_id, [{ + "trigger": "collision", + "action": {"type": "dialogue", "dialogue": {"id": "d_1", "lines": []}}, + }]) + + resp = client.delete(f"/game/{slug}/triggers/{obj_id}/action/d_absent") + assert resp.status_code == 404 + + +def test_trigger_move_action_route_swaps_a_leaf_up_in_its_chain(client, tmp_game_slug_cleanup): + slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) + obj_id = _add_personnage(client, slug, screen_id, role="pnj") + _set_rules(slug, obj_id, [{ + "trigger": "collision", + "action": { + "type": "variable", "id": "v_1", "target_variable": "score", "data_operation": "incrementer", "data_value": "1", + "then": {"type": "dialogue", "dialogue": {"id": "d_1", "lines": []}}, + }, + }]) + + resp = client.post(f"/game/{slug}/triggers/{obj_id}/action/d_1/move", json={"direction": "up"}) + assert resp.status_code == 200 + obj = screens.get_scene_object(slug, obj_id) + action = screens.resolve_collision_rules(obj)[0]["action"] + assert action["type"] == "dialogue" + assert action["then"]["target_variable"] == "score" + + +def test_trigger_move_action_route_400s_for_an_invalid_direction(client, tmp_game_slug_cleanup): + slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) + obj_id = _add_personnage(client, slug, screen_id, role="pnj") + _set_rules(slug, obj_id, [{ + "trigger": "collision", + "action": {"type": "dialogue", "dialogue": {"id": "d_1", "lines": []}}, + }]) + + resp = client.post(f"/game/{slug}/triggers/{obj_id}/action/d_1/move", json={"direction": "sideways"}) + assert resp.status_code == 400 + + +def test_triggers_get_route_backfills_and_persists_a_missing_leaf_id(client, tmp_game_slug_cleanup): + """Bug corrigé : une action "variable" posée sans "id" (par une + session antérieure ou par l'IA) restait à jamais impossible à + adresser via append-action — le premier GET /triggers doit la rendre + adressable, DE FAÇON STABLE (persisté, pas régénéré à chaque appel).""" + slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) + obj_id = _add_personnage(client, slug, screen_id, role="pnj") + _set_rules(slug, obj_id, [{ + "trigger": "collision", + "action": {"type": "variable", "target_variable": "score", "data_operation": "incrementer", "data_value": "1"}, + }]) + + resp1 = client.get(f"/game/{slug}/triggers") + leaf_id = resp1.get_json()[0]["chain"][0]["id"] + assert leaf_id + + resp2 = client.get(f"/game/{slug}/triggers") + assert resp2.get_json()[0]["chain"][0]["id"] == leaf_id # stable, pas régénéré + + append_resp = client.post( + f"/game/{slug}/triggers/{obj_id}/append-action", + json={"after_id": leaf_id, "action": {"type": "dialogue", "dialogue": {"id": "d_1", "lines": []}}}, + ) + assert append_resp.status_code == 200 + + def test_objects_catalog_lists_eligible_objects_with_thumbnails(client, tmp_game_slug_cleanup): slug, screen_id = _create_jeu2d_game(client, tmp_game_slug_cleanup) _add_personnage(client, slug, screen_id, role="pnj") @@ -350,6 +439,10 @@ def test_triggers_route_is_isolated_like_other_game_routes(anon_client): assert resp.status_code == 403 resp = anon_client.post("/game/un-projet-qui-nest-pas-le-sien/triggers/1/append-action", json={}) assert resp.status_code == 403 + resp = anon_client.delete("/game/un-projet-qui-nest-pas-le-sien/triggers/1/action/d_1") + assert resp.status_code == 403 + resp = anon_client.post("/game/un-projet-qui-nest-pas-le-sien/triggers/1/action/d_1/move", json={"direction": "up"}) + assert resp.status_code == 403 resp = anon_client.get("/game/un-projet-qui-nest-pas-le-sien/triggers/objects-catalog") assert resp.status_code == 403 finally: diff --git a/tests/test_user_assets.py b/tests/test_user_assets.py index 61b6bb5d..fce5fd88 100644 --- a/tests/test_user_assets.py +++ b/tests/test_user_assets.py @@ -3,10 +3,54 @@ COMPTE, distincte du dossier d'un jeu (routes/uploads/upload_file.py) : réutilisable d'un projet à l'autre du MÊME compte, jamais visible par un autre.""" import io +import struct +import wave import auth +def _png_bytes(width, height): + """Un PNG minimal — seule la signature + l'en-tête IHDR (largeur/ + hauteur) comptent pour auth.image_dimensions, le reste du fichier + n'a pas besoin d'être une image RÉELLEMENT décodable (voir + add_scene_object.py, qui ne fait que lire ces dimensions, jamais le + pixel lui-même).""" + ihdr = struct.pack(">II", width, height) + b"\x08\x02\x00\x00\x00" + return b"\x89PNG\r\n\x1a\n" + b"\x00\x00\x00\x0d" + b"IHDR" + ihdr + b"\x00\x00\x00\x00" + + +def _mp4_box(box_type, payload): + return struct.pack(">I4s", len(payload) + 8, box_type) + payload + + +def _mp4_bytes(seconds, timescale=1000): + """Un MP4 minimal — juste "ftyp" + "moov/mvhd" (durée/timescale), + suffisant pour que mutagen (auth/validate_video_duration.py) lise sa + durée, sans piste vidéo/audio réelle ni "mdat" (jamais décodé, seule + la durée annoncée compte ici).""" + ftyp = _mp4_box(b"ftyp", b"isom" + struct.pack(">I", 0) + b"isom" + b"mp42") + duration = int(seconds * timescale) + mvhd_payload = ( + struct.pack(">I", 0) + struct.pack(">II", 0, 0) + + struct.pack(">II", timescale, duration) + b"\x00" * 80 + ) + moov = _mp4_box(b"moov", _mp4_box(b"mvhd", mvhd_payload)) + return ftyp + moov + + +def _wav_bytes(seconds, framerate=8000): + """Un WAV de silence, durée EXACTE (au sample près) — 8kHz mono 8-bit + pour rester petit même sur 3+ minutes (voir test de la limite de + durée d'un son, auth/validate_audio_duration.py).""" + buf = io.BytesIO() + with wave.open(buf, "wb") as w: + w.setnchannels(1) + w.setsampwidth(1) + w.setframerate(framerate) + w.writeframes(b"\x80" * int(seconds * framerate)) + return buf.getvalue() + + def test_create_and_list_user_asset(client): with client.session_transaction() as sess: user_id = sess["user_id"] @@ -60,6 +104,70 @@ def test_upload_user_asset_route_requires_a_file(client): assert resp.status_code == 400 +# ---------- scene_kind ("fond"/"decor" — demande explicite : "un bouton +# d'import séparé pour les images de fond et les objets") ---------- + +def test_create_user_asset_stores_the_scene_kind(client): + with client.session_transaction() as sess: + user_id = sess["user_id"] + asset_id = auth.create_user_asset(user_id, "ciel.png", source="upload", scene_kind="fond") + assets = auth.list_user_assets(user_id) + asset = next(a for a in assets if a["id"] == asset_id) + assert asset["scene_kind"] == "fond" + + +def test_create_user_asset_scene_kind_defaults_to_none(client): + with client.session_transaction() as sess: + user_id = sess["user_id"] + asset_id = auth.create_user_asset(user_id, "ancienne.png", source="upload") + assets = auth.list_user_assets(user_id) + asset = next(a for a in assets if a["id"] == asset_id) + assert asset["scene_kind"] is None + + +def test_upload_route_stores_the_posted_scene_kind_for_an_image(client): + resp = client.post( + "/assets/upload", + data={"file": (io.BytesIO(b"fake-image-bytes"), "ciel.png"), "scene_kind": "fond"}, + content_type="multipart/form-data", + ) + assert resp.status_code == 200 + with client.session_transaction() as sess: + user_id = sess["user_id"] + assets = auth.list_user_assets(user_id) + asset = next(a for a in assets if a["id"] == resp.get_json()["id"]) + assert asset["scene_kind"] == "fond" + + +def test_upload_route_defaults_an_image_without_scene_kind_to_decor(client): + resp = client.post( + "/assets/upload", + data={"file": (io.BytesIO(b"fake-image-bytes"), "photo.png")}, + content_type="multipart/form-data", + ) + with client.session_transaction() as sess: + user_id = sess["user_id"] + assets = auth.list_user_assets(user_id) + asset = next(a for a in assets if a["id"] == resp.get_json()["id"]) + assert asset["scene_kind"] == "decor" + + +def test_upload_route_ignores_scene_kind_for_a_non_image_file(client): + """scene_kind n'a de sens que pour une IMAGE (voir + auth/user_asset_kind.py) — un son/une vidéo ne "posent" rien sur la + scène, peu importe ce que le client aurait posté.""" + resp = client.post( + "/assets/upload", + data={"file": (io.BytesIO(_wav_bytes(2)), "bip.wav"), "scene_kind": "fond"}, + content_type="multipart/form-data", + ) + with client.session_transaction() as sess: + user_id = sess["user_id"] + assets = auth.list_user_assets(user_id) + asset = next(a for a in assets if a["id"] == resp.get_json()["id"]) + assert asset["scene_kind"] is None + + def test_serve_user_asset_route_403s_for_another_account(client, user_client): # Un compte "user" fraîchement inscrit (sans projet) est redirigé vers # l'onboarding pour toute route hors _REACHABLE_WITHOUT_PROJECT (voir @@ -78,3 +186,236 @@ def test_serve_user_asset_route_403s_for_another_account(client, user_client): url = resp.get_json()["url"] resp2 = user_client.get(url) assert resp2.status_code == 403 + + +# ---------- "Mes assets" — upload d'un son, limité à 3 minutes (demande +# explicite) ---------- + +def test_user_asset_kind_classifies_by_extension(): + assert auth.user_asset_kind("photo.PNG") == "image" + assert auth.user_asset_kind("bip.mp3") == "audio" + assert auth.user_asset_kind("bip.WAV") == "audio" + assert auth.user_asset_kind("notes.txt") == "other" + + +def test_validate_audio_duration_accepts_a_short_wav(): + content = _wav_bytes(2) + assert auth.validate_audio_duration(content) is None + + +def test_validate_audio_duration_rejects_a_wav_over_the_limit(): + content = _wav_bytes(200) # > 180s (auth.MAX_AUDIO_SECONDS) + error = auth.validate_audio_duration(content) + assert error is not None + assert "3 minutes" in error + + +def test_validate_audio_duration_rejects_unrecognized_content(): + assert auth.validate_audio_duration(b"pas-un-vrai-fichier-audio") is not None + + +def test_upload_route_accepts_a_short_audio_file(client): + resp = client.post( + "/assets/upload", + data={"file": (io.BytesIO(_wav_bytes(2)), "bip.wav")}, + content_type="multipart/form-data", + ) + assert resp.status_code == 200 + with client.session_transaction() as sess: + user_id = sess["user_id"] + assets = auth.list_user_assets(user_id) + assert any(a["filename"].endswith(".wav") for a in assets) + + +def test_upload_route_rejects_an_audio_file_over_three_minutes(client): + resp = client.post( + "/assets/upload", + data={"file": (io.BytesIO(_wav_bytes(200)), "trop-long.wav")}, + content_type="multipart/form-data", + ) + assert resp.status_code == 400 + assert "3 minutes" in resp.get_json()["error"] + with client.session_transaction() as sess: + user_id = sess["user_id"] + assets = auth.list_user_assets(user_id) + assert not any(a["original_name"] == "trop-long.wav" for a in assets) + + +# ---------- "Mes assets" — upload d'une vidéo, format MP4 uniquement, +# limité à 5 minutes (demande explicite) ---------- + +def test_validate_video_duration_accepts_a_short_mp4(): + assert auth.validate_video_duration(_mp4_bytes(30)) is None + + +def test_validate_video_duration_rejects_an_mp4_over_the_limit(): + error = auth.validate_video_duration(_mp4_bytes(400)) + assert error is not None + assert "5 minutes" in error + + +def test_validate_video_duration_rejects_unrecognized_content(): + assert auth.validate_video_duration(b"pas-une-vraie-video") is not None + + +def test_upload_route_accepts_a_short_mp4_video(client): + resp = client.post( + "/assets/upload", + data={"file": (io.BytesIO(_mp4_bytes(30)), "clip.mp4")}, + content_type="multipart/form-data", + ) + assert resp.status_code == 200 + with client.session_transaction() as sess: + user_id = sess["user_id"] + assets = auth.list_user_assets(user_id) + assert any(a["filename"].endswith(".mp4") for a in assets) + + +def test_upload_route_rejects_an_mp4_video_over_five_minutes(client): + resp = client.post( + "/assets/upload", + data={"file": (io.BytesIO(_mp4_bytes(400)), "trop-long.mp4")}, + content_type="multipart/form-data", + ) + assert resp.status_code == 400 + assert "5 minutes" in resp.get_json()["error"] + with client.session_transaction() as sess: + user_id = sess["user_id"] + assets = auth.list_user_assets(user_id) + assert not any(a["original_name"] == "trop-long.mp4" for a in assets) + + +def test_upload_route_rejects_a_non_mp4_video_format(client): + """Demande explicite : "une vidéo au format MP4" — webm/mov/avi sont + reconnus comme "vidéo" par auth/user_asset_kind.py (rétrocompatibilité + de l'organisation "Mes assets"), mais plus ACCEPTÉS à l'upload.""" + resp = client.post( + "/assets/upload", + data={"file": (io.BytesIO(b"peu-importe-le-contenu"), "clip.webm")}, + content_type="multipart/form-data", + ) + assert resp.status_code == 400 + assert "MP4" in resp.get_json()["error"] + + +def test_upload_route_rejects_unrecognized_mp4_content(client): + resp = client.post( + "/assets/upload", + data={"file": (io.BytesIO(b"pas-une-vraie-video"), "faux.mp4")}, + content_type="multipart/form-data", + ) + assert resp.status_code == 400 + + +# ---------- Suppression d'un asset (demande explicite : "voir, utiliser +# ou supprimer des son, image et vidéo") ---------- + +def test_delete_user_asset_route_removes_it(client): + with client.session_transaction() as sess: + user_id = sess["user_id"] + asset_id = auth.create_user_asset(user_id, "abc123.png", original_name="photo.png", source="upload") + resp = client.delete(f"/assets/{asset_id}") + assert resp.status_code == 200 + assert auth.get_user_asset(asset_id) is None + + +def test_delete_user_asset_route_404s_for_an_unknown_id(client): + resp = client.delete("/assets/999999") + assert resp.status_code == 404 + + +def test_delete_user_asset_route_refuses_another_accounts_asset(client, user_client): + # Un compte "user" fraîchement inscrit (sans projet) est redirigé vers + # l'onboarding pour toute route hors _REACHABLE_WITHOUT_PROJECT (voir + # core/auth_guard.py) — lui assigner un projet isole ce test sur le + # SEUL comportement voulu : l'isolation par propriétaire. + with client.session_transaction() as sess: + admin_id = sess["user_id"] + with user_client.session_transaction() as sess: + other_user_id = sess["user_id"] + auth.set_project_slug(other_user_id, "pytest_dummy_project_delete") + asset_id = auth.create_user_asset(admin_id, "admin_only.png") + resp = user_client.delete(f"/assets/{asset_id}") + assert resp.status_code == 404 + assert auth.get_user_asset(asset_id) is not None + + +# ---------- Reclasser un asset DÉJÀ importé entre "Fonds" et +# "Décors/objets" sans ré-upload (diagnostiqué depuis un "décalage" : une +# image importée par le mauvais bouton, ou avant la séparation fond/décor, +# restait bloquée dans la mauvaise section) ---------- + +def test_update_user_asset_scene_kind_reclassifies_the_asset(client): + with client.session_transaction() as sess: + user_id = sess["user_id"] + asset_id = auth.create_user_asset(user_id, "ciel.png", source="upload", scene_kind="decor") + assert auth.update_user_asset_scene_kind(asset_id, user_id, "fond") is True + asset = auth.get_user_asset(asset_id) + assets = auth.list_user_assets(user_id) + assert next(a for a in assets if a["id"] == asset_id)["scene_kind"] == "fond" + + +def test_update_user_asset_scene_kind_refuses_when_not_the_owner(client, user_client): + with client.session_transaction() as sess: + admin_id = sess["user_id"] + with user_client.session_transaction() as sess: + other_user_id = sess["user_id"] + asset_id = auth.create_user_asset(admin_id, "ciel.png", source="upload", scene_kind="decor") + assert auth.update_user_asset_scene_kind(asset_id, other_user_id, "fond") is False + + +def test_update_user_asset_scene_kind_refuses_a_non_image_asset(client): + with client.session_transaction() as sess: + user_id = sess["user_id"] + asset_id = auth.create_user_asset(user_id, "bip.mp3", source="upload") + assert auth.update_user_asset_scene_kind(asset_id, user_id, "fond") is False + + +def test_set_scene_kind_route_reclassifies_the_asset(client): + with client.session_transaction() as sess: + user_id = sess["user_id"] + asset_id = auth.create_user_asset(user_id, "ciel.png", source="upload", scene_kind="decor") + resp = client.post(f"/assets/{asset_id}/scene-kind", json={"scene_kind": "fond"}) + assert resp.status_code == 200 + assets = auth.list_user_assets(user_id) + assert next(a for a in assets if a["id"] == asset_id)["scene_kind"] == "fond" + + +def test_set_scene_kind_route_rejects_an_invalid_value(client): + with client.session_transaction() as sess: + user_id = sess["user_id"] + asset_id = auth.create_user_asset(user_id, "ciel.png", source="upload", scene_kind="decor") + resp = client.post(f"/assets/{asset_id}/scene-kind", json={"scene_kind": "autre"}) + assert resp.status_code == 400 + + +def test_set_scene_kind_route_404s_for_another_accounts_asset(client, user_client): + with client.session_transaction() as sess: + admin_id = sess["user_id"] + with user_client.session_transaction() as sess: + other_user_id = sess["user_id"] + auth.set_project_slug(other_user_id, "pytest_dummy_project_scene_kind") + asset_id = auth.create_user_asset(admin_id, "ciel.png", source="upload", scene_kind="decor") + resp = user_client.post(f"/assets/{asset_id}/scene-kind", json={"scene_kind": "fond"}) + assert resp.status_code == 404 + + +# ---------- Dimensions réelles d'une image importée (bug : "je ne peux +# pas poser un objet hors du champ de la caméra quand j'utilise un fond +# de scène importé" — voir auth/image_dimensions.py) ---------- + +def test_image_dimensions_reads_a_png_header(): + assert auth.image_dimensions(_png_bytes(1920, 1080)) == (1920, 1080) + + +def test_image_dimensions_returns_none_for_unrecognized_content(): + assert auth.image_dimensions(b"pas-une-image") is None + + +def test_upload_route_rejects_unrecognized_audio_content(client): + resp = client.post( + "/assets/upload", + data={"file": (io.BytesIO(b"pas-un-vrai-son"), "faux.mp3")}, + content_type="multipart/form-data", + ) + assert resp.status_code == 400 -- 2.54.0 From 7db4803b9367bd1193c7626bebe4ba3222a0ba3e Mon Sep 17 00:00:00 2001 From: william Date: Sun, 13 Sep 2026 15:07:23 +0200 Subject: [PATCH 3/5] 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 --- ai/chat.py | 27 + ai/tools.py | 51 ++ routes/scenes/__init__.py | 1 + routes/scenes/scene_edit_view.py | 26 + routes/scenes/scene_object_quiz_config.py | 23 + screens/__init__.py | 6 + screens/payload/full_game_payload.py | 21 + screens/rendering/quiz_box_config.py | 97 +++ screens/rendering/quiz_box_templates.py | 337 ++++++++++ screens/scenes/render_scene_object.py | 39 +- .../scenes/set_scene_object_quiz_config.py | 22 + .../__tests__/dialogue-box-controller.test.js | 427 +++++++++++- .../play/__tests__/quiz-box-templates.test.js | 225 +++++++ static/js/play/dialogue-box-controller.js | 306 ++++++++- static/js/play/quiz-box-templates.js | 165 +++++ static/js/scenes/scene-editor.js | 74 ++ static/quiz-templates/classique.png | Bin 0 -> 78146 bytes static/quiz-templates/defaut.png | Bin 0 -> 14575 bytes static/quiz-templates/manga.png | Bin 0 -> 943956 bytes static/quiz-templates/manga_dialogue.png | Bin 0 -> 40743 bytes static/style.css | 561 +++++++++++++++- templates/play.html | 15 +- templates/scene_edit.html | 114 +++- tests/test_ai_chat.py | 23 + tests/test_ai_tools.py | 43 ++ tests/test_quiz_box_config.py | 630 ++++++++++++++++++ 26 files changed, 3173 insertions(+), 60 deletions(-) create mode 100644 routes/scenes/scene_object_quiz_config.py create mode 100644 screens/rendering/quiz_box_config.py create mode 100644 screens/rendering/quiz_box_templates.py create mode 100644 screens/scenes/set_scene_object_quiz_config.py create mode 100644 static/js/play/__tests__/quiz-box-templates.test.js create mode 100644 static/js/play/quiz-box-templates.js create mode 100644 static/quiz-templates/classique.png create mode 100644 static/quiz-templates/defaut.png create mode 100644 static/quiz-templates/manga.png create mode 100644 static/quiz-templates/manga_dialogue.png create mode 100644 tests/test_quiz_box_config.py diff --git a/ai/chat.py b/ai/chat.py index 6b02e01c..f72d486e 100644 --- a/ai/chat.py +++ b/ai/chat.py @@ -161,6 +161,33 @@ _SYSTEM_PROMPT = ( "de l'écran (ex. centré, ou en haut) via set_object_geometry après " "les avoir posés." "\n\n" + "QUIZ AUTONOME (RH/formation, pas narratif) : quand le créateur décrit " + "un besoin de quiz \"tout seul\" (pas un personnage/dialogue de jeu), " + "utilise set_quiz_box_config sur l'objet kind=\"quiz_box\" pour régler " + "le PLEIN ÉCRAN (fullscreen) et un MINUTEUR pour répondre (timer_mode : " + "jamais imposé par défaut — demande TOUJOURS si le créateur en veut un " + "avant d'en activer un, \"question\" redémarre à chaque question, " + "\"quiz\" est un seul compte à rebours pour tout le quiz, timer_seconds " + "sa durée)." + "\n\n" + "MODÈLES VISUELS — DEUX catégories bien distinctes, jamais confondues : " + "dialog_template (modèles \"boîte de dialogue\" : \"defaut\" — Classique — " + "ou \"manga_dialogue\", le pendant en petite carte du thème manga) ne " + "s'affiche QUE si fullscreen=false. " + "page_template (modèles \"page de quiz\" : \"classique\" — sobre/" + "professionnel, couleurs reprises du modèle \"boîte de dialogue\" de " + "base — ou \"manga\", un thème dessiné/typographié entièrement à part) " + "ne s'affiche QUE si fullscreen=true — chacun un thème complet et " + "autonome (police, formes, couleurs ET structure entièrement propres à " + "ce modèle), pensé pour un quiz qui occupe tout l'écran. Les deux " + "réglages sont conservés " + "INDÉPENDAMMENT (jamais l'un n'écrase l'autre) : ne règle QUE celui qui " + "correspond au mode (plein écran ou non) réellement voulu par le " + "créateur, et demande le style souhaité s'il n'en a mentionné aucun " + "plutôt que d'en choisir un au hasard. En plein écran, le score choisi " + "via score_widget/reward_amount s'affiche automatiquement DANS la boîte " + "à quiz, sans réglage supplémentaire." + "\n\n" "Ton professionnel, adapté à une formation d'entreprise. Réponds " "toujours en français, de façon concise, en confirmant ce que tu as " "posé." diff --git a/ai/tools.py b/ai/tools.py index 56475e2e..794e3549 100644 --- a/ai/tools.py +++ b/ai/tools.py @@ -40,6 +40,9 @@ _CONDITION_OPERATORS = sorted(CONDITION_OPERATOR_KEYS) _DATA_OPERATIONS = sorted(DATA_OPERATION_LABELS) _PERSONNAGE_ROLES = list(screens.PERSONNAGE_ROLES) _COLLISION_SHAPES = list(screens.COLLISION_SHAPES) +_QUIZ_BOX_TIMER_MODES = list(screens.TIMER_MODES) +_QUIZ_BOX_DIALOG_TEMPLATES = list(screens.QUIZ_BOX_DIALOG_TEMPLATES) +_QUIZ_BOX_PAGE_TEMPLATES = list(screens.QUIZ_BOX_PAGE_TEMPLATES) _GLOBAL_VARIABLE_TYPES = sorted(db.GLOBAL_VARIABLE_TYPES) # Catalogue COMPLET (public + admin-only, voir core/sprite_gate.py) — # Claude doit connaître les slugs valides pour ne jamais en deviner un @@ -210,6 +213,32 @@ TOOLS = [ "required": ["object_id"], }, }, + { + "name": "set_quiz_box_config", + "description": ( + "Règle les options d'une \"❓ Boîte à quiz\" pensées pour un quiz AUTONOME " + "(RH/formation) : plein écran, minuteur (jamais imposé — \"aucun\" par défaut, " + "au choix du créateur : \"question\" redémarre à chaque question, \"quiz\" est un " + "seul compte à rebours pour tout le quiz), et DEUX modèles visuels INDÉPENDANTS " + "(les deux réglages sont conservés en même temps, jamais l'un n'écrase l'autre) : " + "dialog_template (visible SEULEMENT hors plein écran — variantes de forme/couleur " + "sur une structure proche de \"Classique\") et page_template (visible SEULEMENT en " + "plein écran — thème complet et autonome, structure HTML propre à chaque modèle). " + "En plein écran, le score se retrouve affiché directement dans la boîte." + ), + "input_schema": { + "type": "object", + "properties": { + "object_id": {"type": "integer"}, + "fullscreen": {"type": "boolean"}, + "timer_mode": {"type": "string", "enum": _QUIZ_BOX_TIMER_MODES}, + "timer_seconds": {"type": "integer", "description": "Durée du minuteur (3 à 600s), ignorée si timer_mode=\"aucun\"."}, + "dialog_template": {"type": "string", "enum": _QUIZ_BOX_DIALOG_TEMPLATES, "description": "Modèle \"boîte de dialogue\" — ne s'affiche que si fullscreen=false."}, + "page_template": {"type": "string", "enum": _QUIZ_BOX_PAGE_TEMPLATES, "description": "Modèle \"page de quiz\" — ne s'affiche que si fullscreen=true."}, + }, + "required": ["object_id"], + }, + }, { "name": "create_global_variable", "description": "Crée une variable globale (idempotent par nom) — utilisable ensuite dans les déclencheurs/conditions.", @@ -502,6 +531,27 @@ def _dispatch_set_object_collision(slug, screen_id, user_id, object_id, enabled= return {"ok": True} +def _dispatch_set_quiz_box_config(slug, screen_id, user_id, object_id, fullscreen=False, + timer_mode="aucun", timer_seconds=20, + dialog_template="defaut", page_template="classique"): + # Même forme que screens.set_scene_object_quiz_config (remplacement + # complet des réglages, jamais un merge partiel) — screens.py sanitize + # de toute façon toute valeur hors énumération, ce garde-fou ici sert + # juste à ne jamais transmettre None à sanitize_quiz_box_config. + # dialog_template/page_template sont conservés INDÉPENDAMMENT (voir + # screens/rendering/quiz_box_config.py) : Ruby peut en régler un seul + # sans jamais écraser l'autre. + config = { + "fullscreen": bool(fullscreen), + "timer_mode": timer_mode if timer_mode in _QUIZ_BOX_TIMER_MODES else "aucun", + "timer_seconds": timer_seconds or 20, + "dialog_template": dialog_template if dialog_template in _QUIZ_BOX_DIALOG_TEMPLATES else "defaut", + "page_template": page_template if page_template in _QUIZ_BOX_PAGE_TEMPLATES else "classique", + } + screens.set_scene_object_quiz_config(slug, object_id, config) + return {"ok": True} + + def _dispatch_create_global_variable(slug, screen_id, user_id, name, var_type="texte", default_value="", per_player=True): variable_id = db.create_global_variable(slug, name, var_type=var_type, default_value=default_value, per_player=per_player) return {"variable_id": variable_id} @@ -571,6 +621,7 @@ _DISPATCH = { "set_object_name": _dispatch_set_object_name, "set_object_role": _dispatch_set_object_role, "set_object_collision": _dispatch_set_object_collision, + "set_quiz_box_config": _dispatch_set_quiz_box_config, "create_global_variable": _dispatch_create_global_variable, "set_collision_rules": _dispatch_set_collision_rules, "append_action_to_trigger": _dispatch_append_action_to_trigger, diff --git a/routes/scenes/__init__.py b/routes/scenes/__init__.py index decff8e4..b1518dbc 100644 --- a/routes/scenes/__init__.py +++ b/routes/scenes/__init__.py @@ -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, ) diff --git a/routes/scenes/scene_edit_view.py b/routes/scenes/scene_edit_view.py index ef73c0bb..53a84154 100644 --- a/routes/scenes/scene_edit_view.py +++ b/routes/scenes/scene_edit_view.py @@ -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, diff --git a/routes/scenes/scene_object_quiz_config.py b/routes/scenes/scene_object_quiz_config.py new file mode 100644 index 00000000..8fdd183e --- /dev/null +++ b/routes/scenes/scene_object_quiz_config.py @@ -0,0 +1,23 @@ +from flask import request, jsonify + +import screens + +from core.flask_app import app + + +@app.route("/game//scene-objects//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)}) diff --git a/screens/__init__.py b/screens/__init__.py index 9342bdeb..cafe563b 100644 --- a/screens/__init__.py +++ b/screens/__init__.py @@ -63,6 +63,11 @@ from .labels.video_modes import VIDEO_MODES, VIDEO_MODE_LABELS from .rendering.personnage_commands import resolve_personnage_commands, DEFAULT_PERSONNAGE_COMMANDS, sanitize_extra_commands from .rendering.scene_object_names import list_named_scene_object_names from .rendering.dialogue_box_style import resolve_dialogue_box_style, sanitize_dialogue_box_style, DEFAULT_DIALOGUE_BOX_STYLE, FONT_WEIGHT_CHOICES +from .rendering.quiz_box_config import ( + resolve_quiz_box_config, sanitize_quiz_box_config, DEFAULT_QUIZ_BOX_CONFIG, + TIMER_MODES, QUIZ_BOX_DIALOG_TEMPLATES, QUIZ_BOX_DIALOG_TEMPLATE_LABELS, + QUIZ_BOX_PAGE_TEMPLATES, QUIZ_BOX_PAGE_TEMPLATE_LABELS, +) from .screens_repo.ensure_schema import ensure_schema from .screens_repo.list_screens import list_screens @@ -93,6 +98,7 @@ from .scenes.set_scene_object_collision import set_scene_object_collision from .scenes.set_scene_object_collision_rules import set_scene_object_collision_rules from .scenes.set_scene_object_name import set_scene_object_name from .scenes.set_scene_object_dialogue_box_style import set_scene_object_dialogue_box_style +from .scenes.set_scene_object_quiz_config import set_scene_object_quiz_config from .scenes.render_scene_object import render_scene_object from .scenes.build_collision_rule_objects import build_collision_rule_objects from .scenes.append_action_to_trigger import append_action_to_trigger diff --git a/screens/payload/full_game_payload.py b/screens/payload/full_game_payload.py index 8f779e93..d028ed61 100644 --- a/screens/payload/full_game_payload.py +++ b/screens/payload/full_game_payload.py @@ -11,6 +11,7 @@ from ..rendering.collision_settings import resolve_collision_settings from ..rendering.collision_rules import resolve_collision_rules from ..rendering.screen_triggers import resolve_screen_triggers from ..rendering.dialogue_box_style import resolve_dialogue_box_style +from ..rendering.quiz_box_config import resolve_quiz_box_config from ..rendering.trigger_graph import list_completable_dialogue_ids from ..scenes.list_scene_objects import list_scene_objects from ..scenes.render_scene_object import render_scene_object @@ -62,6 +63,13 @@ def full_game_payload(slug, player_id=db.PLAYER_SHARED): # collision, ni cible/source de règle — juste leur # style, lu par static/js/play/dialogue-box-controller.js. o["dialogue_box_style"] = resolve_dialogue_box_style(o) + if o["kind"] == "quiz_box": + # Plein écran/minuteur/modèle (voir screens/rendering/ + # quiz_box_config.py) — même convention que + # dialogue_box_style ci-dessus (cohérence de contrat), + # même si le JS runtime lit en pratique les data-* + # déjà posés sur rendered_html. + o["quiz_config"] = resolve_quiz_box_config(o) continue # Boîte de collision (voir static/js/play/conditions.js:: # elementsOverlap) : posée sur TOUT objet de scène, pas @@ -83,6 +91,19 @@ def full_game_payload(slug, player_id=db.PLAYER_SHARED): # colonne brute _screen_triggers (laissée telle quelle par ailleurs # dans `s`, comme le reste des colonnes _screens). s["screen_triggers"] = resolve_screen_triggers(s) + # "La notion de caméra disparaît" quand un quiz plein écran existe + # sur cet écran (demande explicite) — pas seulement le widget lui- + # même : ".playScreen.playScene" (templates/play.html), dont la + # taille EST la "caméra" (scene_width/scene_height) et qui reste + # centré via un `transform`, casse `position:fixed` pour tout + # descendant (voir static/js/play/dialogue-box-controller.js:: + # forgeEscapeCameraForFullscreen). Exposé ici pour que play.html + # rende directement CET écran en plein viewport, sans transform ni + # taille caméra — le réglage "Caméra (px)" ne s'applique alors plus + # du tout tant que ce quiz reste plein écran. + s["any_quiz_box_fullscreen"] = any( + o["kind"] == "quiz_box" and o.get("quiz_config", {}).get("fullscreen") for o in objects + ) payload_screens.append({**s, "elements": objects}) # Le graphe de logique et les animations sont, eux, lus pour TOUS les diff --git a/screens/rendering/quiz_box_config.py b/screens/rendering/quiz_box_config.py new file mode 100644 index 00000000..f6462ecf --- /dev/null +++ b/screens/rendering/quiz_box_config.py @@ -0,0 +1,97 @@ +import json + +# Réglages "❓ Boîte à quiz" propres au quiz AUTONOME/plein écran (demande +# explicite : "étendre les fonctionnalités de la boîte à quiz pour les RH +# qui veulent juste faire un quiz") — DISTINCT de "🎨 Style" +# (dialogue_box_style.py, partagé avec dialogue_box/score_widget) : ce +# fichier ne gère QUE plein écran/minuteur/modèle, jamais police/couleur. +# +# DEUX catégories de modèles bien distinctes (demande explicite, précisée +# après coup — les 5 premiers modèles construits avant cette précision +# étaient tous de la première catégorie) : +# - "dialog_template" (modèles "boîte de dialogue", visibles SEULEMENT +# quand fullscreen=False) : variantes de forme/couleur/interaction sur +# une structure HTML qui reste globalement la même que "Classique". +# - "page_template" (modèles "page de quiz", visibles SEULEMENT quand +# fullscreen=True) : thème complet et autonome — police, formes, +# couleurs ET structure HTML totalement propres à CHAQUE modèle, +# aucune structure partagée entre eux ni avec les modèles "boîte". +# Les deux réglages sont conservés INDÉPENDAMMENT (jamais écrasés l'un par +# l'autre) : activer/désactiver le plein écran change juste lequel des +# deux s'applique, sans jamais perdre le choix de l'autre. +DEFAULT_QUIZ_BOX_CONFIG = { + "fullscreen": False, + "timer_mode": "aucun", + "timer_seconds": 20, + "dialog_template": "defaut", + "page_template": "classique", +} + +# "aucun" : pas de minuteur (réglage par défaut, jamais imposé — demande +# explicite du créateur). "question" : redémarre à chaque question. +# "quiz" : un seul compte à rebours pour l'ensemble du quiz. +TIMER_MODES = ["aucun", "question", "quiz"] + +# "defaut" (Classique) = le CSS/HTML déjà existant, AUCUN changement +# visuel pour un quiz non reconfiguré (voir quiz_box_templates.py) — +# "Verre dépoli"/"Néon"/"Minimal"/"Ludique" ont été retirés (demande +# explicite : "supprime tous les modele de boite sauf le base"). +# "manga_dialogue" (Manga) : pendant, en petite carte flottante (jamais +# plein écran), du modèle "page de quiz" "Manga" — validé par le créateur +# via une maquette interactive avant intégration (voir +# screens/rendering/quiz_box_templates.py::render_quiz_box_manga_dialogue). +# Clé DIFFÉRENTE du modèle "page" "manga" (registre d'effets JS partagé +# entre les deux catégories, voir static/js/play/quiz-box-templates.js) +# — reste proche de la structure de "Classique" (demande explicite : +# les modèles "boîte" ne changent que forme/couleur/interaction). +QUIZ_BOX_DIALOG_TEMPLATES = ["defaut", "manga_dialogue"] +QUIZ_BOX_DIALOG_TEMPLATE_LABELS = { + "defaut": "Classique", + "manga_dialogue": "Manga", +} + +# "classique" (Classique) : modèle de PAGE DE QUIZ de base — sobre/ +# professionnel, reprend les couleurs par défaut du modèle "boîte de +# dialogue" de base (demande explicite : "respecte les couleurs du modele +# de boite de base pour le modele de page de base") plutôt que sa propre +# palette, contrairement à "manga" qui est un thème pleinement autonome. +# "manga" : thème/typographie/structure entièrement dédiés, validé par le +# créateur via une maquette interactive avant intégration (voir +# screens/rendering/quiz_box_templates.py::render_quiz_box_page_manga). +QUIZ_BOX_PAGE_TEMPLATES = ["classique", "manga"] +QUIZ_BOX_PAGE_TEMPLATE_LABELS = { + "classique": "Classique", + "manga": "Manga", +} + +_MIN_TIMER_SECONDS = 3 +_MAX_TIMER_SECONDS = 600 + + +def sanitize_quiz_box_config(raw_config): + config = dict(DEFAULT_QUIZ_BOX_CONFIG) + if not isinstance(raw_config, dict): + return config + config["fullscreen"] = bool(raw_config.get("fullscreen")) + if raw_config.get("timer_mode") in TIMER_MODES: + config["timer_mode"] = raw_config["timer_mode"] + try: + config["timer_seconds"] = max(_MIN_TIMER_SECONDS, min(_MAX_TIMER_SECONDS, int(raw_config.get("timer_seconds")))) + except (TypeError, ValueError): + pass + if raw_config.get("dialog_template") in QUIZ_BOX_DIALOG_TEMPLATES: + config["dialog_template"] = raw_config["dialog_template"] + if raw_config.get("page_template") in QUIZ_BOX_PAGE_TEMPLATES: + config["page_template"] = raw_config["page_template"] + return config + + +def resolve_quiz_box_config(obj): + raw = (obj.get("attributes") or {}).get("_quiz_box_config") + if not raw: + return dict(DEFAULT_QUIZ_BOX_CONFIG) + try: + parsed = json.loads(raw) + except (TypeError, ValueError): + return dict(DEFAULT_QUIZ_BOX_CONFIG) + return sanitize_quiz_box_config(parsed) diff --git a/screens/rendering/quiz_box_templates.py b/screens/rendering/quiz_box_templates.py new file mode 100644 index 00000000..054e0d2e --- /dev/null +++ b/screens/rendering/quiz_box_templates.py @@ -0,0 +1,337 @@ +import html as html_lib + +# ---------- "❓ Boîte à quiz" — DEUX catégories de modèles bien distinctes +# (voir screens/rendering/quiz_box_config.py) : +# - "boîte de dialogue" (dialog_template, visibles SEULEMENT hors plein +# écran) : "defaut" (Classique) + "manga_dialogue" (Manga), voir +# render_quiz_box_manga_dialogue plus bas — "Verre dépoli"/"Néon"/ +# "Minimal"/"Ludique" ont été retirés (demande explicite : "supprime +# tous les modele de boite sauf le base") ; +# - "page de quiz" (page_template, visibles SEULEMENT en plein écran, +# voir render_quiz_box_page_classique/render_quiz_box_page_manga plus +# bas) : thème complet et autonome, structure HTML totalement propre +# à CHAQUE modèle, aucune structure partagée avec les modèles +# "boîte" ni entre eux. +# Chaque modèle a son propre bloc CSS (static/style.css) + éventuellement +# son propre effet JS (static/js/play/quiz-box-templates.js), mais TOUS +# doivent respecter le même "contrat" de points d'ancrage pour que le +# moteur PARTAGÉ (static/js/play/dialogue-box-controller.js) fonctionne +# quel que soit le modèle choisi : +# - le conteneur racine porte class="quizBoxWidget[ quizBoxWidget--X]", +# data-object-id/data-element-id, data-quiz-template, data-fullscreen, +# data-timer-mode, data-timer-seconds (voir _quiz_data_attrs) ; +# - [data-quiz-role="header"] / "question" / "choices" — JS y écrit +# TOUJOURS via .textContent ou remplace .innerHTML en entier (jamais +# un ajout) : ne JAMAIS poser de décoration (icône, badge, score...) +# comme ENFANT de ces éléments précis, elle serait effacée au premier +# rafraîchissement — un ::before CSS est la seule façon sûre d'ajouter +# une icône à ces zones-là. C'est pourquoi le score/minuteur (voir +# juste en dessous) vit dans un élément FRÈRE du header (jamais son +# enfant), même si visuellement il doit apparaître à l'intérieur du +# même bandeau (demande explicite : "le score doit être à l'intérieur +# de la boîte à quiz, pas à l'extérieur") — voir _quiz_header_row_html, +# qui les pose côte à côte dans un même bandeau partageant le même +# fond, plutôt qu'en deux bandes empilées de couleurs différentes ; +# - [data-quiz-role="score"]/[data-quiz-role="timer"] — un modèle +# "boîte" les regroupe dans un [data-quiz-role="topbar"] (masqué hors +# plein écran par static/style.css) ; un modèle "page" n'a pas besoin +# de ce regroupement/masquage (il n'existe QUE plein écran) et peut +# les placer où il veut (voir render_quiz_box_page_manga) — le moteur +# JS ne cherche jamais "topbar" lui-même, seulement score/timer. +# "defaut" (Classique) reste visuellement identique au style déjà en +# place avant cette extension (pas de suffixe de classe) — voir +# render_quiz_box_defaut. + + +def _quiz_data_attrs(obj, config, active_template): + return ( + f'data-object-id="{obj["id"]}" data-element-id="{obj["id"]}" ' + f'data-quiz-template="{active_template}" ' + f'data-fullscreen="{"1" if config["fullscreen"] else "0"}" ' + f'data-timer-mode="{config["timer_mode"]}" data-timer-seconds="{config["timer_seconds"]}"' + ) + + +def _quiz_box_style(obj, style): + return ( + f"position:absolute; left:{obj['x']}px; top:{obj['y']}px; " + f"width:{obj['width']}px; height:{obj['height']}px; z-index:{obj['z_index']}; " + f"font-family:{html_lib.escape(style['font_family'])}; font-size:{style['font_size']}px; " + f"font-weight:{style['font_weight']}; color:{html_lib.escape(style['text_color'])};" + ) + + +def _quiz_topbar_html(): + return ( + '
' + 'Score : 0' + '' + '
' + ) + + +def _quiz_header_row_html(header_text, header_bg=None): + # Le score/minuteur (topbar) est un FRÈRE du header, jamais son enfant + # (voir le commentaire d'en-tête) — les deux partagent ici le MÊME + # bandeau (fond commun posé sur ".quizBoxHeaderRow", jamais sur le + # header seul) pour que le score, une fois visible en plein écran, + # apparaisse comme faisant partie du même bloc plutôt qu'une bande à + # part au-dessus (demande explicite). `header_bg=None` : aucun fond + # posé, le bandeau reste transparent (repli disponible pour un futur + # modèle qui n'en aurait pas besoin). + bg_style = f' style="background:{html_lib.escape(header_bg)}"' if header_bg else '' + return ( + f'
' + f'
{header_text}
' + + _quiz_topbar_html() + + '
' + ) + + +def render_quiz_box_defaut(obj, config, style): + return ( + f'' + ) + + +def render_quiz_box_manga_dialogue(obj, config, style): + # "Manga" (boîte de dialogue) — pendant, en petite carte flottante + # JAMAIS plein écran, du modèle "page de quiz" "Manga" (voir + # render_quiz_box_page_manga), validé par le créateur via une + # maquette interactive avant intégration. Réutilise TELLE QUELLE la + # structure partagée des modèles "boîte" (quizBoxHeaderRow/ + # quizBoxHeader/quizBoxTopBar/quizBoxBody/quizBoxQuestionText/ + # quizBoxChoices/quizBoxChoiceBtn) — seule la DÉCORATION change (voir + # CSS), jamais la structure (demande explicite : les modèles "boîte" + # "s'éloignent peu du modèle basic", contrairement aux modèles + # "page" qui ont chacun leur structure propre). + # .quizMangaDialogueFrame : enveloppe portant la forme dentelée/le + # cadre (voir CSS) SANS l'appliquer au conteneur racine (qui doit + # rester positionnable/redimensionnable normalement) — même principe + # que les anciens modèles "Verre dépoli"/"Néon". + # "Titre de la quête" seul ici (pas "Quête : Titre de la quête") : le + # préfixe "Quête : " est posé en CSS pur (::before sur .quizBoxHeader, + # voir static/style.css) pour survivre à l'écrasement JS du header + # (voir le commentaire de classe ci-dessus) — l'écrire aussi ici le + # doublerait dans l'aperçu éditeur (jamais réécrit par le JS avant le + # premier vrai jeu). + return ( + f'' + ) + + +def render_quiz_box_page_manga(obj, config, style): + # "Manga" — premier modèle "PAGE DE QUIZ" (voir screens/rendering/ + # quiz_box_config.py::QUIZ_BOX_PAGE_TEMPLATES) : thème complet et + # autonome, validé par le créateur via une maquette interactive avant + # intégration — structure HTML totalement propre à ce modèle, AUCUNE + # réutilisation de _quiz_header_row_html/quizBoxHeader/quizBoxBody des + # modèles "boîte" ci-dessus (demande explicite : "la structure du html + # qui change totalement"). Respecte quand même le contrat minimal + # (data-quiz-role="header"/"question"/"choices"/"score"/"timer") pour + # que le moteur JS partagé fonctionne sans modification. + # + # Score/minuteur : PAS de "topbar" à masquer/afficher ici (ce modèle + # n'existe QUE plein écran, il n'y a jamais lieu de les cacher) — deux + # plaques séparées de part et d'autre d'un cartouche de titre, comme + # dans la maquette validée. Les lettres A/B/C/D + le tampon "正解"/ + # "不正解" à la révélation sont posés en CSS pur (::before/::after, + # voir static/style.css) : les boutons de choix injectés par le + # moteur JS (static/js/play/dialogue-box-controller.js) restent de + # simples ' + '' + '' + # Écran de résultat de fin de quiz — voir forgeQuizMangaOnQuizComplete + # (static/js/play/quiz-box-templates.js), même mécanique que + # "classique" (render_quiz_box_page_classique) mais dans le thème + # manga propre à ce modèle. Pas de conteneur "content" à part ici + # (contrairement à .classiqueContent) : c'est la RACINE du widget + # elle-même qui bascule en classe "is-showing-result" (voir + # static/style.css) pour masquer question/choix, en gardant le + # bandeau topbar/score + la barre d'étapes visibles. data-manga- + # role (pas data-quiz-role) : décoration propre à ce modèle. + '
' + '' + ) + + +def render_quiz_box_page_classique(obj, config, style): + # "Classique" — modèle de PAGE DE QUIZ DE BASE (sobre/professionnel), + # validé par le créateur via une maquette interactive (formation + # sécurité incendie comme exemple). Reprend VOLONTAIREMENT les + # couleurs par défaut du modèle "boîte de dialogue" de base + # (header_bg/body_bg/text_color, voir dialogue_box_style.py) — demande + # explicite : "respecte les couleurs du modele de boite de base pour + # le modele de page de base" — plutôt que d'inventer sa propre + # palette comme "manga". + # + # Titre = le champ "Nom" de CET objet (déjà existant aujourd'hui, + # aucun nouveau champ "titre" nécessaire, demande explicite) — rendu + # ICI, une bonne fois pour toutes côté serveur, jamais réécrit par le + # moteur JS (à l'inverse de [data-quiz-role="header"] plus bas, qui + # sert ici à autre chose : voir le commentaire dessus). + title = html_lib.escape(obj.get("name") or "Quiz") + timer_placeholder = "Aucun" if config["timer_mode"] == "aucun" else "" + return ( + # `--classique-footer-bg` (custom property posée sur la racine) : + # lue par .classiqueChoices .quizBoxContinueBtn (voir plus bas) — + # le bouton "Continuer →" du moteur partagé (injecté APRÈS coup + # dans [data-quiz-role="choices"]) se pose en bandeau bas façon + # pied de page, dans la couleur configurée via "🎨 Style" + # (footer_bg), jamais une couleur figée en dur. + f'' + ) + + +QUIZ_BOX_DIALOG_RENDERERS = { + "defaut": render_quiz_box_defaut, + "manga_dialogue": render_quiz_box_manga_dialogue, +} + +QUIZ_BOX_PAGE_RENDERERS = { + "classique": render_quiz_box_page_classique, + "manga": render_quiz_box_page_manga, +} + + +def render_quiz_box(obj, config, style): + """Point d'entrée UNIQUE (voir screens/scenes/render_scene_object.py) + — bascule entre les deux catégories de modèles selon `fullscreen` + (demande explicite : ces modèles ne se voient JAMAIS dans l'autre + mode) plutôt que de laisser l'appelant deviner quelle liste + consulter.""" + if config["fullscreen"]: + renderer = QUIZ_BOX_PAGE_RENDERERS.get(config["page_template"], render_quiz_box_page_classique) + else: + renderer = QUIZ_BOX_DIALOG_RENDERERS.get(config["dialog_template"], render_quiz_box_defaut) + return renderer(obj, config, style) diff --git a/screens/scenes/render_scene_object.py b/screens/scenes/render_scene_object.py index d86da49d..86624dad 100644 --- a/screens/scenes/render_scene_object.py +++ b/screens/scenes/render_scene_object.py @@ -2,6 +2,8 @@ import html as html_lib from ..rendering.personnage_data import resolve_personnage_idle_frame from ..rendering.dialogue_box_style import resolve_dialogue_box_style +from ..rendering.quiz_box_config import resolve_quiz_box_config +from ..rendering.quiz_box_templates import render_quiz_box def render_scene_object(obj): @@ -72,31 +74,20 @@ def render_scene_object(obj): ) if obj["kind"] == "quiz_box": # Widget "❓ Boîte à quiz" (voir "🖥️ Interface") — réutilise le - # MÊME style que "💬 Boîte de dialogue" (resolve_dialogue_box_style/ - # set_scene_object_dialogue_box_style, une seule "🎨 Style" pour - # les deux) : header = "Quête : " (comme demandé), corps = - # la question ET ses choix de réponse ensemble (remplis EN JEU par - # static/js/play/dialogue-box-controller.js, data-quiz-role sert de - # sélecteur) — pas de pied (une question se résout au clic sur un - # choix, pas de "Suivant"). Masqué par défaut au jeu, comme la - # boîte de dialogue. + # MÊME style couleur/police que "💬 Boîte de dialogue" + # (resolve_dialogue_box_style/set_scene_object_dialogue_box_style, + # une seule "🎨 Style" pour les deux, appliquée à TOUS les + # modèles ci-dessous). Le rendu HTML lui-même dépend du modèle + # choisi (plein écran/minuteur/modèle, voir + # screens/rendering/quiz_box_config.py) — voir + # screens/rendering/quiz_box_templates.py pour le détail de + # chacun (thèmes complets HTML+CSS+JS, demande explicite) ; tous + # respectent le même contrat de data-quiz-role, lu EN JEU par + # static/js/play/dialogue-box-controller.js. "defaut" (Classique) + # reste pixel-identique au rendu d'avant cette extension. style = resolve_dialogue_box_style(obj) - box_style = ( - f"position:absolute; left:{obj['x']}px; top:{obj['y']}px; " - f"width:{obj['width']}px; height:{obj['height']}px; z-index:{obj['z_index']}; " - f"font-family:{html_lib.escape(style['font_family'])}; font-size:{style['font_size']}px; " - f"font-weight:{style['font_weight']}; color:{html_lib.escape(style['text_color'])};" - ) - return ( - f'' - ) + config = resolve_quiz_box_config(obj) + return render_quiz_box(obj, config, style) if obj["kind"] == "score_widget": # Widget "🏆 Score" (voir "🖥️ Interface") — toujours VISIBLE une # fois posé (pas de collision/déclencheur, contrairement aux deux diff --git a/screens/scenes/set_scene_object_quiz_config.py b/screens/scenes/set_scene_object_quiz_config.py new file mode 100644 index 00000000..54535430 --- /dev/null +++ b/screens/scenes/set_scene_object_quiz_config.py @@ -0,0 +1,22 @@ +import json + +import db + +from ..rendering.quiz_box_config import sanitize_quiz_box_config +from .ensure_scene_schema import ensure_scene_schema + + +def set_scene_object_quiz_config(slug, object_id, raw_config): + ensure_scene_schema(slug) + conn = db.connect(slug) + row = conn.execute("SELECT attributes FROM _scene_objects WHERE id = ?", (object_id,)).fetchone() + if not row: + conn.close() + return None + attributes = json.loads(row["attributes"] or "{}") + config = sanitize_quiz_box_config(raw_config) + attributes["_quiz_box_config"] = json.dumps(config) + conn.execute("UPDATE _scene_objects SET attributes = ? WHERE id = ?", (json.dumps(attributes), object_id)) + conn.commit() + conn.close() + return config diff --git a/static/js/play/__tests__/dialogue-box-controller.test.js b/static/js/play/__tests__/dialogue-box-controller.test.js index 75916194..0a781ada 100644 --- a/static/js/play/__tests__/dialogue-box-controller.test.js +++ b/static/js/play/__tests__/dialogue-box-controller.test.js @@ -14,9 +14,10 @@ global.gameData = {}; const { forgeShowDialogueBox, forgeDialogueBoxAdvance, forgeCompleteDialogue, - forgeQuizBoxAnswer, forgeQuizBoxContinue, forgeUpdateAllScoreWidgets, + forgeQuizBoxAnswer, forgeQuizBoxContinue, forgeQuizBoxTimeout, forgeUpdateAllScoreWidgets, forgeAddQuizScore, forgeSyncAllDialoguesCompletionToScorm, - forgeComputeFinalScormStatus, + forgeComputeFinalScormStatus, forgeEscapeCameraForFullscreen, + forgeQuizResultQuit, } = require('../dialogue-box-controller.js'); function fakeWidget(objectId) { @@ -28,7 +29,10 @@ function fakeWidget(objectId) { const classes = new Set(); return { getAttribute: attr => (attr === 'data-object-id' ? String(objectId) : null), - classList: { add: c => classes.add(c), remove: c => classes.delete(c), contains: c => classes.has(c) }, + classList: { + add: c => classes.add(c), remove: c => classes.delete(c), contains: c => classes.has(c), + toggle: (c, force) => { const on = force === undefined ? !classes.has(c) : !!force; if (on) classes.add(c); else classes.delete(c); return on; }, + }, querySelector: sel => { if (sel === '[data-dialogue-role="header"]') return roles.header; if (sel === '[data-dialogue-role="body"]') return roles.body; @@ -39,6 +43,45 @@ function fakeWidget(objectId) { }; } +// Bug signalé : "aucune différence, la taille de la fenêtre de jeu est +// la même alors qu'il n'y a plus de caméra" — ".playScreen.playScene" +// (templates/play.html) est transformé (centré via translate), ce qui +// casse position:fixed pour tout descendant : un plein écran ne peut +// couvrir le VRAI viewport qu'en s'échappant de ce conteneur, comme +// static/js/play/video-overlay.js le fait déjà pour son propre overlay. +test('forgeEscapeCameraForFullscreen déplace le widget en enfant de et retient l\'écran d\'origine', () => { + const screenEl = { getAttribute: attr => (attr === 'data-screen-id' ? '7' : null) }; + const attrs = {}; + const classes = new Set(); + const bodyChildren = []; + const body = { appendChild: el => { bodyChildren.push(el); el.parentNode = body; } }; + const widget = { + parentNode: null, + closest: sel => (sel === '.playScreen' ? screenEl : null), + setAttribute: (k, v) => { attrs[k] = v; }, + classList: { add: c => classes.add(c) }, + }; + const previousDoc = global.document; + global.document = { body }; + try { + forgeEscapeCameraForFullscreen(widget); + assert.equal(bodyChildren[0], widget); + assert.equal(widget.parentNode, body); + assert.equal(attrs['data-owner-screen-id'], '7'); + assert.equal(classes.has('quizBoxWidget--detachedForFullscreen'), true); + } finally { global.document = previousDoc; } +}); + +test('forgeEscapeCameraForFullscreen ne fait rien si déjà enfant de (jamais déplacé deux fois)', () => { + const body = { appendChild: () => { throw new Error('ne doit pas être rappelé'); } }; + const widget = { parentNode: body }; + const previousDoc = global.document; + global.document = { body }; + try { + assert.doesNotThrow(() => forgeEscapeCameraForFullscreen(widget)); + } finally { global.document = previousDoc; } +}); + test.beforeEach(() => { global.window.currentScreenId = 1; // Compteurs de réussite (voir forgeComputeFinalScormStatus) : remis à @@ -228,27 +271,58 @@ function fakeQuizChoiceBtn() { return { disabled: false, classList: { add: c => classes.add(c), contains: c => classes.has(c) }, _classes: classes }; } -function fakeQuizWidget(objectId, choiceCount) { - const roles = { header: { textContent: '' }, question: { textContent: '' }, choices: { innerHTML: '' } }; +function fakeQuizWidget(objectId, choiceCount, attrs) { + attrs = attrs || {}; + const roles = { + header: { textContent: '' }, question: { textContent: '' }, choices: { innerHTML: '' }, + score: { textContent: '' }, timer: { textContent: '', classList: { add() {}, remove() {}, toggle() {} } }, + }; + // Posé désactivé par forgeShowQuizBox dès la question (jamais recréé + // par forgeQuizBoxAnswer, qui se contente de .disabled=false) — voir + // les tests dédiés plus bas. Un objet à part (pas dérivé de + // roles.choices.innerHTML, une simple chaîne dans ce mock) pour + // pouvoir observer .disabled/.textContent comme un vrai élément DOM. + const continueBtn = { disabled: true, textContent: 'Continuer →' }; const classes = new Set(); // querySelectorAll('.quizBoxChoiceBtn') n'a pas besoin de refléter le // HTML réellement injecté dans roles.choices.innerHTML (voir // forgeShowQuizBox) pour ces tests — juste le bon NOMBRE de boutons, // marqués correct/wrong par forgeQuizBoxAnswer via ces mêmes objets. const buttons = Array.from({ length: choiceCount }, () => fakeQuizChoiceBtn()); - return { - getAttribute: attr => (attr === 'data-object-id' ? String(objectId) : null), - classList: { add: c => classes.add(c), remove: c => classes.delete(c), contains: c => classes.has(c) }, + const widget = { + parentNode: null, + // Simule ".closest('.playScreen')" (voir forgeEscapeCameraForFullscreen) : + // un widget "posé sur l'écran courant" est toujours, au départ, + // l'enfant d'un ".playScreen" fictif portant le même id d'écran. + closest: sel => (sel === '.playScreen' ? { getAttribute: a => (a === 'data-screen-id' ? String(window.currentScreenId) : null) } : null), + getAttribute: attr => { + if (attr === 'data-object-id') return String(objectId); + if (attr in attrs) return attrs[attr]; + return null; + }, + setAttribute: (k, v) => { attrs[k] = v; }, + classList: { + // Variadique (comme le vrai DOMTokenList.remove/add) : le moteur + // appelle parfois .remove('is-active', 'is-fullscreen') d'un coup + // (voir forgeQuizResultQuit/forgeHideQuizBoxOnCurrentScreen). + add: (...cs) => cs.forEach(c => classes.add(c)), remove: (...cs) => cs.forEach(c => classes.delete(c)), + contains: c => classes.has(c), + toggle: (c, force) => { const on = force === undefined ? !classes.has(c) : !!force; if (on) classes.add(c); else classes.delete(c); return on; }, + }, querySelector: sel => { if (sel === '[data-quiz-role="header"]') return roles.header; if (sel === '[data-quiz-role="question"]') return roles.question; if (sel === '[data-quiz-role="choices"]') return roles.choices; + if (sel === '[data-quiz-role="score"]') return roles.score; + if (sel === '[data-quiz-role="timer"]') return roles.timer; + if (sel === '.quizBoxContinueBtn') return continueBtn; return null; }, querySelectorAll: sel => (sel === '.quizBoxChoiceBtn' ? buttons : []), offsetWidth: 100, - _roles: roles, _classes: classes, _buttons: buttons, + _roles: roles, _classes: classes, _buttons: buttons, _continueBtn: continueBtn, }; + return widget; } function docWithDialogueAndQuiz(dialogueWidget, quizWidget) { @@ -260,7 +334,18 @@ function docWithDialogueAndQuiz(dialogueWidget, quizWidget) { if (sel.indexOf('data-object-id="42"') !== -1) return dialogueWidget; // forgeDialogueBoxWidgetById return null; }, - querySelectorAll: () => [], // aucun widget "🏆 Score" dans ces tests + querySelectorAll(sel) { + // aucun widget "🏆 Score" dans ces tests — seul le score AFFICHÉ + // DANS la boîte à quiz elle-même (voir forgeUpdateQuizBoxScoreDisplays) + // a besoin d'être résolu ici, via le rôle déjà exposé par + // fakeQuizWidget ci-dessus. + if (sel === '.quizBoxWidget [data-quiz-role="score"]') return quizWidget ? [quizWidget._roles.score] : []; + return []; + }, + // Nécessaire pour un quiz PLEIN ÉCRAN (voir forgeEscapeCameraForFullscreen) : + // pas besoin de simuler un vrai retrait/réinsertion DOM pour ces + // tests, juste que l'appel ne plante pas. + body: { appendChild: () => {} }, }; } @@ -274,6 +359,197 @@ test.beforeEach(() => { window.forgeQuizScore = 0; }); +// Bug signalé : "j'ai créé un quiz à l'affichage de l'écran avec l'ia, +// mais quand je fais jouer rien ne s'affiche" — un quiz RH AUTONOME (que +// des questions, aucune réplique) n'a besoin d'AUCUNE "💬 Boîte de +// dialogue" posée, seulement d'une "❓ Boîte à quiz" ; forgeShowDialogueBox +// sortait pourtant en silence dès le départ faute de boîte de dialogue, +// empêchant même la première question de s'afficher. +function docWithQuizOnlyNoDialogueBox(quizWidget) { + return { + querySelector(sel) { + if (sel.indexOf('.quizBoxWidget') !== -1 && sel.indexOf('data-object-id') === -1) return quizWidget || null; + if (sel.indexOf('data-object-id="99"') !== -1) return quizWidget || null; + return null; // jamais de ".dialogueBoxWidget" sur cet écran + }, + querySelectorAll: sel => (sel === '.quizBoxWidget [data-quiz-role="score"]' ? [quizWidget._roles.score] : []), + body: { appendChild: () => {} }, + }; +} + +test('un quiz SANS aucune "💬 Boîte de dialogue" posée (que des questions) affiche bien la première question', () => { + const quizWidget = fakeQuizWidget(99, 2, { 'data-timer-mode': 'aucun' }); + const previousDoc = global.document; + global.document = docWithQuizOnlyNoDialogueBox(quizWidget); + try { + forgeShowDialogueBox('d_30', 'Quiz', [ + { type: 'question', text: 'Qui es-tu ?', choices: ['A', 'B'], correct_index: 0, reward_amount: 1 }, + ]); + assert.equal(quizWidget._classes.has('is-active'), true); + assert.equal(quizWidget._roles.question.textContent, 'Qui es-tu ?'); + } finally { global.document = previousDoc; } +}); + +test('un quiz SANS boîte de dialogue : répondre avance/termine correctement (markCompleted inclus)', () => { + const quizWidget = fakeQuizWidget(99, 2, { 'data-timer-mode': 'aucun' }); + const previousDoc = global.document; + global.document = docWithQuizOnlyNoDialogueBox(quizWidget); + try { + forgeShowDialogueBox('d_31', 'Quiz', [ + { type: 'question', text: 'Qui es-tu ?', choices: ['A', 'B'], correct_index: 0, reward_amount: 1 }, + ], true); // markCompleted + forgeQuizBoxAnswer(99, 0); // bonne réponse + assert.equal(window.forgeQuizScore, 1); + forgeQuizBoxContinue(99); // -> plus aucune ligne, dialogue épuisé + assert.equal(window.forgeCompletedDialogueIds['d_31'], true); + assert.equal(quizWidget._classes.has('is-active'), false); + } finally { global.document = previousDoc; } +}); + +// ---------- Écran de résultat de fin de quiz ("classique" uniquement, +// voir static/js/play/quiz-box-templates.js::forgeQuizClassiqueOnQuizComplete) +// demande explicite : "la page de resultat est cassee... elle affiche un +// conteneur qui reaffiche le contenu du quiz au lieu du resultat" — le +// vrai moteur n'en avait aucun jusqu'ici. `forgeQuizTemplateEffects` est +// une variable GLOBALE (voir quiz-box-templates.js, jamais requise ici) : +// simulée au cas par cas, jamais définie par défaut — donc TOUS les +// tests ci-dessus (aucun modèle enregistré) continuent de suivre +// l'ancien chemin (masquage simple), inchangé. ---------- + +function withFakeTemplateEffects(effects, fn) { + const previous = global.forgeQuizTemplateEffects; + global.forgeQuizTemplateEffects = effects; + try { fn(); } finally { global.forgeQuizTemplateEffects = previous; } +} + +test('forgeQuizBoxContinue à la DERNIÈRE question d\'un modèle avec écran de résultat : reste actif/plein écran, appelle onQuizComplete avec le score DE CE QUIZ', () => { + const quizWidget = fakeQuizWidget(99, 2, { 'data-timer-mode': 'aucun', 'data-fullscreen': '1', 'data-quiz-template': 'classique' }); + const previousDoc = global.document; + let completeCalledWith = null; + global.document = docWithQuizOnlyNoDialogueBox(quizWidget); + withFakeTemplateEffects({ classique: { onQuizComplete: (w, result) => { completeCalledWith = result; } } }, () => { + try { + forgeShowDialogueBox('d_50', 'Quiz', [ + { type: 'question', text: 'Qui es-tu ?', choices: ['A', 'B'], correct_index: 0, reward_amount: 1 }, + ]); + forgeQuizBoxAnswer(99, 0); // bonne réponse — seule et dernière question + forgeQuizBoxContinue(99); + assert.equal(quizWidget._classes.has('is-active'), true, 'reste visible pour montrer le résultat, pas masqué'); + assert.equal(quizWidget._classes.has('is-fullscreen'), true); + assert.deepEqual(completeCalledWith, { correctCount: 1, totalCount: 1 }); + } finally { global.document = previousDoc; } + }); +}); + +test('forgeQuizBoxContinue AVANT la dernière question : jamais d\'écran de résultat, même avec un modèle qui en propose un', () => { + const quizWidget = fakeQuizWidget(99, 2, { 'data-timer-mode': 'aucun', 'data-fullscreen': '1', 'data-quiz-template': 'classique' }); + const previousDoc = global.document; + let completeCalled = false; + global.document = docWithQuizOnlyNoDialogueBox(quizWidget); + withFakeTemplateEffects({ classique: { onQuizComplete: () => { completeCalled = true; } } }, () => { + try { + forgeShowDialogueBox('d_51', 'Quiz', [ + { type: 'question', text: 'Question 1 ?', choices: ['A', 'B'], correct_index: 0, reward_amount: 1 }, + { type: 'question', text: 'Question 2 ?', choices: ['A', 'B'], correct_index: 0, reward_amount: 1 }, + ]); + forgeQuizBoxAnswer(99, 0); + forgeQuizBoxContinue(99); // avance vers la question 2, pas la fin + assert.equal(completeCalled, false); + assert.equal(quizWidget._roles.question.textContent, 'Question 2 ?'); + } finally { global.document = previousDoc; } + }); +}); + +test('forgeQuizResultQuit (bouton de l\'écran de résultat) masque le widget PUIS tente de fermer l\'onglet — demande explicite : quitter carrément, jamais recommencer', () => { + const quizWidget = fakeQuizWidget(99, 2, { 'data-timer-mode': 'aucun', 'data-fullscreen': '1', 'data-quiz-template': 'classique' }); + const previousDoc = global.document; + const previousClose = window.close; + let closeCalled = false; + window.close = () => { closeCalled = true; }; + global.document = docWithQuizOnlyNoDialogueBox(quizWidget); + withFakeTemplateEffects({ classique: { onQuizComplete: () => {} } }, () => { + try { + forgeShowDialogueBox('d_52', 'Quiz', [ + { type: 'question', text: 'Qui es-tu ?', choices: ['A', 'B'], correct_index: 0, reward_amount: 1 }, + ]); + forgeQuizBoxAnswer(99, 0); + forgeQuizBoxContinue(99); // -> écran de résultat, widget toujours actif + forgeQuizResultQuit(99); + assert.equal(quizWidget._classes.has('is-active'), false); + assert.equal(quizWidget._classes.has('is-fullscreen'), false); + // window.close() ne ferme RÉELLEMENT que les onglets ouverts par + // script (restriction navigateur, voir le commentaire dans + // dialogue-box-controller.js) — on ne peut donc tester ici que + // "l'appel a bien été tenté", jamais qu'un onglet a vraiment fermé. + assert.equal(closeCalled, true); + } finally { global.document = previousDoc; window.close = previousClose; } + }); +}); + +test('forgeQuizResultQuit ne plante jamais si window.close n\'existe pas (navigateur qui ne l\'expose pas)', () => { + const quizWidget = fakeQuizWidget(99, 2, { 'data-timer-mode': 'aucun', 'data-fullscreen': '1', 'data-quiz-template': 'classique' }); + const previousDoc = global.document; + const previousClose = window.close; + delete window.close; + global.document = docWithQuizOnlyNoDialogueBox(quizWidget); + withFakeTemplateEffects({ classique: { onQuizComplete: () => {} } }, () => { + try { + forgeShowDialogueBox('d_54', 'Quiz', [ + { type: 'question', text: 'Qui es-tu ?', choices: ['A', 'B'], correct_index: 0, reward_amount: 1 }, + ]); + forgeQuizBoxAnswer(99, 0); + forgeQuizBoxContinue(99); + assert.doesNotThrow(() => forgeQuizResultQuit(99)); + } finally { global.document = previousDoc; window.close = previousClose; } + }); +}); + +test('forgeQuizResultQuit ne fait rien sans widget correspondant', () => { + const previousDoc = global.document; + global.document = { querySelector: () => null }; + try { + assert.doesNotThrow(() => forgeQuizResultQuit(999999)); + } finally { global.document = previousDoc; } +}); + +test('forgeQuizBoxTimeout (minuteur du quiz ENTIER expiré) affiche l\'écran de résultat même s\'il restait des questions', (t) => { + t.mock.timers.enable({ apis: ['setTimeout'] }); + const quizWidget = fakeQuizWidget(99, 2, { 'data-timer-mode': 'quiz', 'data-timer-seconds': '5', 'data-fullscreen': '1', 'data-quiz-template': 'classique' }); + const previousDoc = global.document; + let completeCalledWith = null; + global.document = docWithQuizOnlyNoDialogueBox(quizWidget); + withFakeTemplateEffects({ classique: { onQuizComplete: (w, result) => { completeCalledWith = result; } } }, () => { + try { + forgeShowDialogueBox('d_53', 'Quiz', [ + { type: 'question', text: 'Question 1 ?', choices: ['A', 'B'], correct_index: 0, reward_amount: 1 }, + { type: 'question', text: 'Question 2 ?', choices: ['A', 'B'], correct_index: 0, reward_amount: 1 }, + ]); + forgeQuizBoxTimeout(99, true); // encore la question 2 à venir + t.mock.timers.tick(1500); + assert.deepEqual(completeCalledWith, { correctCount: 0, totalCount: 1 }); + assert.equal(quizWidget._classes.has('is-active'), true); + } finally { global.document = previousDoc; } + }); +}); + +test('"Continuer →" est TOUJOURS présent dès la question (désactivé), jamais recréé — juste activé par une réponse (demande explicite, comme la maquette manga)', () => { + const dialogueWidget = fakeWidget(42); + const quizWidget = fakeQuizWidget(99, 2); + const previousDoc = global.document; + global.document = docWithDialogueAndQuiz(dialogueWidget, quizWidget); + try { + forgeShowDialogueBox('d_60', 'Le sorcier', QUIZ_LINES); + forgeDialogueBoxAdvance(42); // -> question + // Dès l'affichage de la question, AVANT toute réponse : présent + // dans le balisage des choix ET désactivé. + assert.match(quizWidget._roles.choices.innerHTML, /forgeQuizBoxContinue\(99\)/); + assert.equal(quizWidget._continueBtn.disabled, true); + forgeQuizBoxAnswer(99, 1); // bonne réponse (correct_index=1) + // Le MÊME objet, juste activé — jamais un nouveau bouton recréé. + assert.equal(quizWidget._continueBtn.disabled, false); + } finally { global.document = previousDoc; } +}); + test('une ligne "question" est affichée dans la boîte à QUIZ (header = nom de l\'objet déclencheur, corps = question+choix), pas la boîte de dialogue', () => { const dialogueWidget = fakeWidget(42); dialogueWidget.getAttribute = attr => (attr === 'data-object-id' ? '42' : null); @@ -372,11 +648,120 @@ test('aucune boîte à quiz posée sur la scène : la question est ignorée, la } finally { global.document = previousDoc; } }); +// ---------- Plein écran + score affiché (demande explicite) ---------- + +test('forgeShowQuizBox pose ".is-fullscreen" quand data-fullscreen="1", jamais sinon', () => { + const dialogueWidget = fakeWidget(42); + const quizWidgetOn = fakeQuizWidget(99, 2, { 'data-fullscreen': '1', 'data-timer-mode': 'aucun' }); + const previousDoc = global.document; + global.document = docWithDialogueAndQuiz(dialogueWidget, quizWidgetOn); + try { + forgeShowDialogueBox('d_10', 'Le sorcier', QUIZ_LINES); + forgeDialogueBoxAdvance(42); + assert.equal(quizWidgetOn._classes.has('is-fullscreen'), true); + } finally { global.document = previousDoc; } + + const quizWidgetOff = fakeQuizWidget(99, 2, { 'data-fullscreen': '0', 'data-timer-mode': 'aucun' }); + global.document = docWithDialogueAndQuiz(fakeWidget(42), quizWidgetOff); + try { + forgeShowDialogueBox('d_11', 'Le sorcier', QUIZ_LINES); + forgeDialogueBoxAdvance(42); + assert.equal(quizWidgetOff._classes.has('is-fullscreen'), false); + } finally { global.document = previousDoc; } +}); + +test('le score affiché DANS la boîte à quiz (data-quiz-role="score") se met à jour à chaque question et bonne réponse', () => { + const dialogueWidget = fakeWidget(42); + const quizWidget = fakeQuizWidget(99, 2, { 'data-timer-mode': 'aucun' }); + const previousDoc = global.document; + global.document = docWithDialogueAndQuiz(dialogueWidget, quizWidget); + try { + forgeShowDialogueBox('d_10', 'Le sorcier', QUIZ_LINES); + forgeDialogueBoxAdvance(42); + assert.equal(quizWidget._roles.score.textContent, 'Score : 0'); + forgeQuizBoxAnswer(99, 1); // bonne réponse, +5 + assert.equal(quizWidget._roles.score.textContent, 'Score : 5'); + } finally { global.document = previousDoc; } +}); + +// ---------- Minuteur (optionnel, "aucun" par défaut — demande explicite : +// "pouvoir paramétrer un timer pour répondre aux questions") ---------- + +test('minuteur "par question" expiré : révèle la bonne réponse (aucun bouton marqué faux), puis "Continuer →" fonctionne normalement', (t) => { + t.mock.timers.enable({ apis: ['setInterval', 'setTimeout'] }); + const dialogueWidget = fakeWidget(42); + const quizWidget = fakeQuizWidget(99, 2, { 'data-timer-mode': 'question', 'data-timer-seconds': '10' }); + const previousDoc = global.document; + global.document = docWithDialogueAndQuiz(dialogueWidget, quizWidget); + try { + forgeShowDialogueBox('d_10', 'Le sorcier', QUIZ_LINES); + forgeDialogueBoxAdvance(42); // -> question, démarre le minuteur (10s) + t.mock.timers.tick(10000); // le minuteur expire tout seul + assert.equal(quizWidget._buttons[1]._classes.has('is-correct'), true); // la bonne réponse (index 1) révélée + assert.equal(quizWidget._buttons[0]._classes.has('is-wrong'), false); // aucun clic -> aucun bouton "faux" + assert.equal(window.forgeQuizScore, 0); // comptée fausse, aucun point + assert.equal(window.forgeQuizTotalAnswered, 1); + forgeQuizBoxContinue(99); // "Continuer →" fonctionne normalement après un minuteur expiré + assert.equal(dialogueWidget._roles.body.textContent, 'Bien joué !'); + } finally { global.document = previousDoc; } +}); + +test('un minuteur "par question" toujours en cours est arrêté dès qu\'on répond (jamais de double expiration)', (t) => { + t.mock.timers.enable({ apis: ['setInterval', 'setTimeout'] }); + const dialogueWidget = fakeWidget(42); + const quizWidget = fakeQuizWidget(99, 2, { 'data-timer-mode': 'question', 'data-timer-seconds': '10' }); + const previousDoc = global.document; + global.document = docWithDialogueAndQuiz(dialogueWidget, quizWidget); + try { + forgeShowDialogueBox('d_10', 'Le sorcier', QUIZ_LINES); + forgeDialogueBoxAdvance(42); + forgeQuizBoxAnswer(99, 1); // répond avant l'expiration + assert.equal(window.forgeQuizScore, 5); + t.mock.timers.tick(10000); // le minuteur, s'il tournait encore, exploserait ici + assert.equal(window.forgeQuizTotalAnswered, 1); // toujours une seule réponse comptée + } finally { global.document = previousDoc; } +}); + +test('minuteur "pour tout le quiz" expiré : révèle la bonne réponse PUIS termine le quiz tout seul (markCompleted/thenAction inclus)', (t) => { + t.mock.timers.enable({ apis: ['setInterval', 'setTimeout'] }); + const dialogueWidget = fakeWidget(42); + const quizWidget = fakeQuizWidget(99, 2, { 'data-timer-mode': 'quiz', 'data-timer-seconds': '5' }); + const previousDoc = global.document; + global.document = docWithDialogueAndQuiz(dialogueWidget, quizWidget); + try { + forgeShowDialogueBox('d_20', 'Le sorcier', QUIZ_LINES, true); // markCompleted=true + forgeDialogueBoxAdvance(42); // -> question, démarre le minuteur "quiz" (5s) + t.mock.timers.tick(5000); // expire : révèle la bonne réponse + assert.equal(quizWidget._buttons[1]._classes.has('is-correct'), true); + assert.equal(window.forgeCompletedDialogueIds['d_20'], undefined); // pas encore, le délai de lecture tourne + t.mock.timers.tick(1500); // délai de lecture écoulé -> fin forcée du quiz + assert.equal(window.forgeCompletedDialogueIds['d_20'], true); + assert.equal(quizWidget._classes.has('is-active'), false); + assert.equal(quizWidget._classes.has('is-fullscreen'), false); + } finally { global.document = previousDoc; } +}); + +test('forgeQuizBoxTimeout n\'a aucun effet si la question est déjà résolue (pas de double révélation)', () => { + const dialogueWidget = fakeWidget(42); + const quizWidget = fakeQuizWidget(99, 2, { 'data-timer-mode': 'question', 'data-timer-seconds': '10' }); + const previousDoc = global.document; + global.document = docWithDialogueAndQuiz(dialogueWidget, quizWidget); + try { + forgeShowDialogueBox('d_10', 'Le sorcier', QUIZ_LINES); + forgeDialogueBoxAdvance(42); + forgeQuizBoxAnswer(99, 1); // déjà répondu + assert.doesNotThrow(() => forgeQuizBoxTimeout(99, false)); + assert.equal(window.forgeQuizTotalAnswered, 1); // pas compté deux fois + } finally { global.document = previousDoc; } +}); + test('forgeUpdateAllScoreWidgets — met à jour tous les widgets "🏆 Score" affichés', () => { const values = [{ textContent: '' }, { textContent: '' }]; const previousDoc = global.document; window.forgeQuizScore = 42; - global.document = { querySelectorAll: () => values }; + global.document = { + querySelectorAll: sel => (sel === '.scoreWidget [data-score-role="value"]' ? values : []), + }; try { forgeUpdateAllScoreWidgets(); assert.equal(values[0].textContent, 42); @@ -384,6 +769,22 @@ test('forgeUpdateAllScoreWidgets — met à jour tous les widgets "🏆 Score" a } finally { global.document = previousDoc; } }); +test('forgeUpdateAllScoreWidgets — met aussi à jour le score affiché DANS une boîte à quiz plein écran', () => { + // Demande explicite : "lorsque la boîte à quiz prend tout l'écran, le + // score s'affiche dans la boîte à quiz" — voir + // forgeUpdateQuizBoxScoreDisplays, appelée par forgeUpdateAllScoreWidgets. + const quizScoreEl = { textContent: '' }; + const previousDoc = global.document; + window.forgeQuizScore = 7; + global.document = { + querySelectorAll: sel => (sel === '.quizBoxWidget [data-quiz-role="score"]' ? [quizScoreEl] : []), + }; + try { + forgeUpdateAllScoreWidgets(); + assert.equal(quizScoreEl.textContent, 'Score : 7'); + } finally { global.document = previousDoc; } +}); + // ---------- Pont vers SCORM (gameData.scoring, voir static/js/play/offline/scorm-api.js) ---------- // Bug signalé : "les indicateurs qu'on utilise pour les dialogues // devraient aussi servir aux indicateurs SCORM, or ce n'est pas le cas" — @@ -500,7 +901,7 @@ test('répondre à une question notifie xAPI avec la bonne/mauvaise réponse et const dialogueWidget = fakeWidget(42); const quizWidget = { getAttribute: attr => (attr === 'data-object-id' ? '99' : null), - classList: { add: () => {}, remove: () => {} }, + classList: { add: () => {}, remove: () => {}, toggle: () => {} }, querySelector: sel => (sel.indexOf('choices') !== -1 ? { innerHTML: '' } : { textContent: '' }), querySelectorAll: () => [], }; @@ -527,7 +928,7 @@ test('répondre à une question notifie AUSSI le SCORM 2004 (cmi.interactions.n. const dialogueWidget = fakeWidget(42); const quizWidget = { getAttribute: attr => (attr === 'data-object-id' ? '99' : null), - classList: { add: () => {}, remove: () => {} }, + classList: { add: () => {}, remove: () => {}, toggle: () => {} }, querySelector: sel => (sel.indexOf('choices') !== -1 ? { innerHTML: '' } : { textContent: '' }), querySelectorAll: () => [], }; diff --git a/static/js/play/__tests__/quiz-box-templates.test.js b/static/js/play/__tests__/quiz-box-templates.test.js new file mode 100644 index 00000000..73128c31 --- /dev/null +++ b/static/js/play/__tests__/quiz-box-templates.test.js @@ -0,0 +1,225 @@ +// Effets visuels par modèle de "❓ Boîte à quiz" (voir static/js/play/ +// quiz-box-templates.js, appelé par dialogue-box-controller.js aux +// points d'extension du moteur partagé). +const test = require('node:test'); +const assert = require('node:assert/strict'); + +global.window = global.window || {}; +global.document = global.document || { + createElement() { return { style: {}, className: '', appendChild() {} }; }, +}; + +const { + forgeQuizTemplateEffects, + forgeQuizMangaOnShow, forgeQuizMangaOnQuizComplete, + forgeQuizClassiqueOnShow, forgeQuizClassiqueOnQuizComplete, +} = require('../quiz-box-templates.js'); + +test('les 4 modèles sont bien enregistrés ("defaut"/"manga_dialogue" boîte de dialogue + "classique"/"manga" page de quiz)', () => { + assert.deepEqual( + Object.keys(forgeQuizTemplateEffects).sort(), + ['classique', 'defaut', 'manga', 'manga_dialogue'], + ); +}); + +test('le registre ne branche aucun effet pour les modèles "boîte de dialogue" ("defaut"/"manga_dialogue" restent proches du modèle de base, décoration CSS uniquement)', () => { + assert.deepEqual(forgeQuizTemplateEffects.defaut, {}); + assert.deepEqual(forgeQuizTemplateEffects.manga_dialogue, {}); +}); + +function fakeMangaWidget() { + const header = { textContent: 'PNJ' }; + const progress = { innerHTML: '' }; + const resultZone = { innerHTML: '' }; + const classes = new Set(); + return { + getAttribute(attr) { return attr === 'data-object-id' ? '42' : null; }, + querySelector(sel) { + if (sel === '[data-quiz-role="header"]') return header; + if (sel === '[data-manga-role="progress"]') return progress; + if (sel === '[data-manga-role="result"]') return resultZone; + return null; + }, + classList: { add: c => classes.add(c), remove: c => classes.delete(c), contains: c => classes.has(c) }, + _header: header, _progress: progress, _resultZone: resultZone, _classes: classes, + }; +} + +test('forgeQuizMangaOnShow ("manga", onShow) affiche "Question N/M" (uniquement les lignes de type question) et une barre d\'étapes', () => { + global.forgeQuizBoxState = { 42: { dialogueObjectId: 7 } }; + global.forgeDialogueBoxState = { + 7: { + index: 3, // 0:dialogue 1:question 2:dialogue 3:question(courante) 4:question + lines: [ + { type: 'dialogue' }, + { type: 'question' }, + { type: 'dialogue' }, + { type: 'question' }, + { type: 'question' }, + ], + }, + }; + const widget = fakeMangaWidget(); + forgeQuizMangaOnShow(widget); + assert.equal(widget._header.textContent, 'Question 2/3'); + assert.equal(widget._progress.innerHTML, ''); + delete global.forgeQuizBoxState; + delete global.forgeDialogueBoxState; +}); + +test('forgeQuizMangaOnShow ne plante jamais sans widget/état', () => { + assert.doesNotThrow(() => forgeQuizMangaOnShow(null)); + delete global.forgeQuizBoxState; + delete global.forgeDialogueBoxState; + assert.doesNotThrow(() => forgeQuizMangaOnShow(fakeMangaWidget())); + global.forgeQuizBoxState = { 42: { dialogueObjectId: 7 } }; + assert.doesNotThrow(() => forgeQuizMangaOnShow(fakeMangaWidget())); // pas de forgeDialogueBoxState + delete global.forgeQuizBoxState; +}); + +test('forgeQuizMangaOnShow ne touche à rien si le dialogue ne contient aucune question (total === 0)', () => { + global.forgeQuizBoxState = { 42: { dialogueObjectId: 7 } }; + global.forgeDialogueBoxState = { 7: { index: 0, lines: [{ type: 'dialogue' }] } }; + const widget = fakeMangaWidget(); + forgeQuizMangaOnShow(widget); + assert.equal(widget._header.textContent, 'PNJ'); + assert.equal(widget._progress.innerHTML, ''); + delete global.forgeQuizBoxState; + delete global.forgeDialogueBoxState; +}); + +test('forgeQuizMangaOnShow retire "is-showing-result" (défensif — widget réutilisé pour un quiz déclenché à nouveau)', () => { + const widget = fakeMangaWidget(); + widget.classList.add('is-showing-result'); + forgeQuizMangaOnShow(widget); + assert.equal(widget._classes.has('is-showing-result'), false); +}); + +test('forgeQuizMangaOnQuizComplete remplit l\'écran de résultat manga (badge 合格/不合格), remplit la barre d\'étapes à 100% et bascule la RACINE du widget en "is-showing-result"', () => { + const widget = fakeMangaWidget(); + const previousThreshold = window.FORGE_SUCCESS_THRESHOLD_PERCENT; + window.FORGE_SUCCESS_THRESHOLD_PERCENT = 70; + try { + forgeQuizMangaOnQuizComplete(widget, { correctCount: 4, totalCount: 5 }); + assert.equal(widget._classes.has('is-showing-result'), true); + assert.match(widget._resultZone.innerHTML, /Score final : 4 \/ 5/); + assert.match(widget._resultZone.innerHTML, /mangaResultBadge pass/); + assert.match(widget._resultZone.innerHTML, /合格/); + assert.match(widget._resultZone.innerHTML, /forgeQuizResultQuit\(42\)/); + assert.equal(widget._progress.innerHTML, ''.repeat(5)); + } finally { window.FORGE_SUCCESS_THRESHOLD_PERCENT = previousThreshold; } +}); + +test('forgeQuizMangaOnQuizComplete affiche le badge "不合格" (échoué) sous le seuil de réussite', () => { + const widget = fakeMangaWidget(); + const previousThreshold = window.FORGE_SUCCESS_THRESHOLD_PERCENT; + window.FORGE_SUCCESS_THRESHOLD_PERCENT = 70; + try { + forgeQuizMangaOnQuizComplete(widget, { correctCount: 1, totalCount: 5 }); + assert.match(widget._resultZone.innerHTML, /mangaResultBadge fail/); + assert.match(widget._resultZone.innerHTML, /不合格/); + } finally { window.FORGE_SUCCESS_THRESHOLD_PERCENT = previousThreshold; } +}); + +test('forgeQuizMangaOnQuizComplete ne plante jamais sans widget/sans le conteneur de résultat', () => { + assert.doesNotThrow(() => forgeQuizMangaOnQuizComplete(null, { correctCount: 1, totalCount: 1 })); + assert.doesNotThrow(() => forgeQuizMangaOnQuizComplete({ querySelector: () => null }, { correctCount: 1, totalCount: 1 })); +}); + +// "classique" réutilise le même calcul générique (forgeQuizProgressOnShow) +// que "manga", juste avec son propre sélecteur de barre d'étapes +// (data-classique-role, jamais data-manga-role). +function fakeClassiqueWidget() { + const header = { textContent: 'PNJ' }; + const progress = { innerHTML: '' }; + return { + getAttribute(attr) { return attr === 'data-object-id' ? '42' : null; }, + querySelector(sel) { + if (sel === '[data-quiz-role="header"]') return header; + if (sel === '[data-classique-role="progress"]') return progress; + return null; + }, + _header: header, _progress: progress, + }; +} + +test('forgeQuizClassiqueOnShow ("classique", onShow) affiche "Question N/M" et une barre d\'étapes, comme "manga"', () => { + global.forgeQuizBoxState = { 42: { dialogueObjectId: 7 } }; + global.forgeDialogueBoxState = { + 7: { index: 1, lines: [{ type: 'question' }, { type: 'question' }] }, + }; + const widget = fakeClassiqueWidget(); + forgeQuizClassiqueOnShow(widget); + assert.equal(widget._header.textContent, 'Question 2/2'); + assert.equal(widget._progress.innerHTML, ''); + delete global.forgeQuizBoxState; + delete global.forgeDialogueBoxState; +}); + +test('forgeQuizClassiqueOnShow ne plante jamais sans widget/état', () => { + assert.doesNotThrow(() => forgeQuizClassiqueOnShow(null)); + assert.doesNotThrow(() => forgeQuizClassiqueOnShow(fakeClassiqueWidget())); +}); + +// ---------- Écran de résultat ("classique" uniquement) ---------- + +function fakeClassiqueWidgetForResult() { + const contentClasses = new Set(); + const content = { classList: { add: c => contentClasses.add(c), remove: c => contentClasses.delete(c), contains: c => contentClasses.has(c) } }; + const resultZone = { innerHTML: '' }; + const headerTitle = { textContent: 'Formation Sécurité Incendie' }; + return { + getAttribute(attr) { return attr === 'data-object-id' ? '42' : null; }, + querySelector(sel) { + if (sel === '.classiqueContent') return content; + if (sel === '[data-classique-role="result"]') return resultZone; + if (sel === '.classiqueHeaderTitle') return headerTitle; + return null; + }, + _content: content, _contentClasses: contentClasses, _resultZone: resultZone, _headerTitle: headerTitle, + }; +} + +test('forgeQuizClassiqueOnQuizComplete remplit l\'écran de résultat (score, badge réussi) et bascule .classiqueContent en "is-showing-result"', () => { + const widget = fakeClassiqueWidgetForResult(); + const previousThreshold = window.FORGE_SUCCESS_THRESHOLD_PERCENT; + window.FORGE_SUCCESS_THRESHOLD_PERCENT = 70; + try { + forgeQuizClassiqueOnQuizComplete(widget, { correctCount: 3, totalCount: 4 }); + assert.equal(widget._contentClasses.has('is-showing-result'), true); + assert.match(widget._resultZone.innerHTML, /75%/); + assert.match(widget._resultZone.innerHTML, /3 bonnes réponses sur 4/); + assert.match(widget._resultZone.innerHTML, /Formation Sécurité Incendie/); + assert.match(widget._resultZone.innerHTML, /classiqueResultBadge pass/); + assert.match(widget._resultZone.innerHTML, /Module validé/); + assert.match(widget._resultZone.innerHTML, /forgeQuizResultQuit\(42\)/); + assert.match(widget._resultZone.innerHTML, /Quitter le quiz/); + } finally { window.FORGE_SUCCESS_THRESHOLD_PERCENT = previousThreshold; } +}); + +test('forgeQuizClassiqueOnQuizComplete affiche le badge "échoué" sous le seuil de réussite', () => { + const widget = fakeClassiqueWidgetForResult(); + const previousThreshold = window.FORGE_SUCCESS_THRESHOLD_PERCENT; + window.FORGE_SUCCESS_THRESHOLD_PERCENT = 70; + try { + forgeQuizClassiqueOnQuizComplete(widget, { correctCount: 2, totalCount: 4 }); + assert.match(widget._resultZone.innerHTML, /50%/); + assert.match(widget._resultZone.innerHTML, /classiqueResultBadge fail/); + assert.match(widget._resultZone.innerHTML, /Module non validé — seuil 70%/); + } finally { window.FORGE_SUCCESS_THRESHOLD_PERCENT = previousThreshold; } +}); + +test('forgeQuizClassiqueOnQuizComplete ne plante jamais sans widget/sans les éléments attendus', () => { + assert.doesNotThrow(() => forgeQuizClassiqueOnQuizComplete(null, { correctCount: 1, totalCount: 1 })); + assert.doesNotThrow(() => forgeQuizClassiqueOnQuizComplete({ querySelector: () => null }, { correctCount: 1, totalCount: 1 })); +}); + +test('forgeQuizClassiqueOnShow retire "is-showing-result" (défensif — un futur modèle "Recommencer" réutiliserait ce garde-fou)', () => { + const widget = fakeClassiqueWidgetForResult(); + widget._content.classList.add('is-showing-result'); + // fakeClassiqueWidgetForResult n'a pas les rôles attendus par + // forgeQuizProgressOnShow (header/progress) : seul le retrait de la + // classe nous intéresse ici, le reste no-op sans état global posé. + forgeQuizClassiqueOnShow(widget); + assert.equal(widget._contentClasses.has('is-showing-result'), false); +}); diff --git a/static/js/play/dialogue-box-controller.js b/static/js/play/dialogue-box-controller.js index af7e6ba8..35a2ca5f 100644 --- a/static/js/play/dialogue-box-controller.js +++ b/static/js/play/dialogue-box-controller.js @@ -110,16 +110,93 @@ function forgeResetDialogueBoxFooter(widget, objectId) { // ---------- Boîte à quiz ---------- function forgeQuizBoxWidgetOnCurrentScreen() { - return document.querySelector('.playScreen[data-screen-id="' + window.currentScreenId + '"] .quizBoxWidget'); + var scoped = document.querySelector('.playScreen[data-screen-id="' + window.currentScreenId + '"] .quizBoxWidget'); + if (scoped) return scoped; + // Un quiz PLEIN ÉCRAN a été déplacé hors de ".playScreen" (voir + // forgeEscapeCameraForFullscreen ci-dessous) : ne s'y trouve donc plus + // une fois la première question affichée — retrouvé via l'attribut + // posé au déplacement plutôt que par sa position dans le DOM. + return document.querySelector('.quizBoxWidget[data-owner-screen-id="' + window.currentScreenId + '"]'); } function forgeQuizBoxWidgetById(objectId) { return document.querySelector('.quizBoxWidget[data-object-id="' + objectId + '"]'); } +// Bug signalé : "aucune différence, la taille de la fenêtre de jeu est +// la même alors qu'il n'y a plus de caméra" — ".playScreen.playScene" +// (templates/play.html) est centré via `transform:translate(-50%,-50%)`, +// ce qui en fait la référence de positionnement ("containing block") de +// tout descendant `position:fixed` : le plein écran de la boîte à quiz +// ne couvrait donc que CE conteneur (toujours à la taille scene_width/ +// scene_height, la "caméra"), jamais le VRAI viewport du navigateur. +// Seul un déplacement hors de ce conteneur (comme static/js/play/ +// video-overlay.js le fait déjà pour son overlay) permet à +// `position:fixed` de couvrir tout l'écran pour de vrai. `data-owner- +// screen-id` (posé ici) permet à forgeQuizBoxWidgetOnCurrentScreen ci- +// dessus de le retrouver malgré le déplacement. +function forgeEscapeCameraForFullscreen(widget) { + if (widget.parentNode === document.body) return; + var screenEl = widget.closest('.playScreen'); + if (screenEl) widget.setAttribute('data-owner-screen-id', screenEl.getAttribute('data-screen-id')); + widget.classList.add('quizBoxWidget--detachedForFullscreen'); + document.body.appendChild(widget); +} + +// Point de sortie UNIQUE de la boîte à quiz (fin d'une question réussie +// vers la ligne suivante, OU fin de tout le dialogue) — y arrêter aussi +// le minuteur/retirer le plein écran ici garantit qu'aucun des deux +// n'est jamais laissé actif par erreur, quel que soit le chemin de +// sortie (voir forgeShowCurrentConversationLine/forgeAdvanceConversation). function forgeHideQuizBoxOnCurrentScreen() { var widget = forgeQuizBoxWidgetOnCurrentScreen(); - if (widget) widget.classList.remove('is-active'); + if (!widget) return; + widget.classList.remove('is-active', 'is-fullscreen'); + var objectId = widget.getAttribute('data-object-id'); + forgeStopQuizTimer(objectId); +} + +// ---------- Minuteur (plein écran, demande explicite : "un timer pour +// répondre aux questions") ---------- +// Optionnel — "aucun" (screens/rendering/quiz_box_config.py) est le +// réglage par défaut, jamais imposé. Porté par data-timer-mode/ +// data-timer-seconds sur le widget lui-même (voir screens/rendering/ +// quiz_box_templates.py), lus ici plutôt que par un nouveau canal de +// payload séparé — cohérent avec le reste de ce moteur (data-* posés au +// rendu, jamais un aller-retour serveur pour du pur affichage). +var forgeQuizTimerState = {}; + +function forgeStopQuizTimer(objectId) { + var t = forgeQuizTimerState[objectId]; + if (t && t.intervalId) clearInterval(t.intervalId); + delete forgeQuizTimerState[objectId]; +} + +// mode "question" : redémarre à CHAQUE question (reset=true, appelé +// depuis forgeShowQuizBox). mode "quiz" : démarré UNE SEULE FOIS pour +// tout le quiz (reset=false une fois déjà en cours), continue de tourner +// d'une question à l'autre sans se réinitialiser. +function forgeStartQuizTimer(objectId, widget, seconds, onExpire) { + forgeStopQuizTimer(objectId); + var state = { remaining: seconds }; + forgeQuizTimerState[objectId] = state; + var timerEl = widget.querySelector('[data-quiz-role="timer"]'); + function render() { + if (!timerEl) return; + var remaining = Math.max(0, state.remaining); + var m = Math.floor(remaining / 60), s = remaining % 60; + timerEl.textContent = '⏱ ' + m + ':' + (s < 10 ? '0' : '') + s; + timerEl.classList.toggle('is-urgent', remaining <= 5); + } + render(); + state.intervalId = setInterval(function () { + state.remaining -= 1; + render(); + if (state.remaining <= 0) { + forgeStopQuizTimer(objectId); + onExpire(); + } + }, 1000); } // ---------- Score ---------- @@ -127,6 +204,17 @@ function forgeHideQuizBoxOnCurrentScreen() { function forgeUpdateAllScoreWidgets() { var values = document.querySelectorAll('.scoreWidget [data-score-role="value"]'); for (var i = 0; i < values.length; i++) values[i].textContent = window.forgeQuizScore; + forgeUpdateQuizBoxScoreDisplays(); +} + +// Score affiché DANS la boîte à quiz elle-même (demande explicite : +// "lorsque la boîte à quiz prend tout l'écran, le score s'affiche dans +// la boîte à quiz") — masqué par CSS hors plein écran (voir +// .quizBoxTopBar, static/style.css), donc sans effet visuel pour un quiz +// non-plein-écran, mais tenu à jour dans tous les cas (coûte rien). +function forgeUpdateQuizBoxScoreDisplays() { + var values = document.querySelectorAll('.quizBoxWidget [data-quiz-role="score"]'); + for (var i = 0; i < values.length; i++) values[i].textContent = 'Score : ' + window.forgeQuizScore; } // Alimente aussi gameData.scoring (voir static/js/play/offline/ @@ -237,9 +325,19 @@ function forgeShowCurrentConversationLine(dialogueObjectId) { function forgeShowDialogueBox(dialogueId, objectName, lines, markCompleted, thenAction) { if (!dialogueId) return; lines = lines || []; + // Bug corrigé : "j'ai créé un quiz à l'affichage de l'écran, rien ne + // s'affiche" — un dialogue fait UNIQUEMENT de questions (quiz RH + // autonome, aucune réplique) n'a besoin d'AUCUNE "💬 Boîte de dialogue" + // posée sur l'écran, seulement d'une "❓ Boîte à quiz" — cette fonction + // sortait pourtant en silence dès le départ s'il n'y avait aucune boîte + // de dialogue, empêchant même la première question de s'afficher. Sans + // widget réel pour porter la clé d'état, `dialogueId` sert de repli + // (unique par action "Déclencher ce dialogue") — une ligne "réplique" + // sans boîte de dialogue posée reste ignorée plus loin (voir + // forgeShowCurrentConversationLine), même logique symétrique qu'une + // question sans boîte à quiz posée (voir forgeShowQuizBox). var widget = forgeDialogueBoxWidgetOnCurrentScreen(); - if (!widget) return; - var objectId = widget.getAttribute('data-object-id'); + var stateKey = widget ? widget.getAttribute('data-object-id') : ('_sansBoiteDialogue_' + dialogueId); forgeSyncDialogueStartedToScorm(); if (!lines.length) { // Rien à jouer : applique quand même markCompleted PUIS thenAction @@ -248,11 +346,11 @@ function forgeShowDialogueBox(dialogueId, objectName, lines, markCompleted, then if (thenAction) forgeRunCollisionRuleAction(thenAction, null, { name: objectName }); return; } - forgeDialogueBoxState[objectId] = { + forgeDialogueBoxState[stateKey] = { dialogueId: dialogueId, objectName: objectName, lines: lines, index: 0, markCompleted: !!markCompleted, thenAction: thenAction, }; - forgeShowCurrentConversationLine(objectId); + forgeShowCurrentConversationLine(stateKey); } // Marque un dialogue `completed` (RUNTIME uniquement, jamais persisté — @@ -308,9 +406,22 @@ function forgeShowQuizBox(dialogueObjectId, dialogueId, objectName, line, questi var widget = forgeQuizBoxWidgetOnCurrentScreen(); if (!widget) { forgeAdvanceConversation(dialogueObjectId); return; } var quizObjectId = widget.getAttribute('data-object-id'); + var previousState = forgeQuizBoxState[quizObjectId]; forgeQuizBoxState[quizObjectId] = { dialogueObjectId: dialogueObjectId, correctIndex: line.correct_index, rewardAmount: line.reward_amount, resolved: false, dialogueId: dialogueId, objectName: objectName, questionIndex: questionIndex, questionText: line.text, + // Minuteur "pour tout le quiz" (voir forgeStartQuizTimer plus bas) : + // ne démarre qu'à la PREMIÈRE question, continue de tourner ensuite + // sans se réinitialiser — ce drapeau survit d'une question à l'autre + // via l'état précédent de CE MÊME quiz. + quizTimerStarted: previousState ? previousState.quizTimerStarted : false, + // Score DE CE QUIZ (jamais window.forgeQuizScore/forgeQuizCorrectAnswered, + // cumulés sur TOUTE la partie, voir plus haut) — survit d'une + // question à l'autre comme quizTimerStarted : sert à afficher "X + // bonnes réponses sur Y" à la fin (voir forgeQuizBoxContinue/ + // forgeQuizPrepareResultScreen plus bas). + correctCount: previousState ? previousState.correctCount : 0, + answeredCount: previousState ? previousState.answeredCount : 0, }; var header = widget.querySelector('[data-quiz-role="header"]'); var questionEl = widget.querySelector('[data-quiz-role="question"]'); @@ -321,6 +432,33 @@ function forgeShowQuizBox(dialogueObjectId, dialogueId, objectName, line, questi choicesEl.innerHTML = line.choices.map(function (choice, i) { return ''; }).join(''); + // "Continuer →" TOUJOURS présent dès la question (demande explicite : + // "le bouton continuer est toujours visible mais activé seulement + // quand un choix est fait", comme la maquette manga validée) — + // désactivé jusqu'à ce que forgeQuizBoxAnswer le réactive (jamais + // recréé à ce moment-là, juste .disabled=false, voir plus bas). + choicesEl.innerHTML += ''; + } + // "Plein écran" (demande explicite) — reposé à CHAQUE question, + // sans effet si déjà présent (voir .quizBoxWidget.is-fullscreen, + // static/style.css). Échappe d'abord au conteneur de scène transformé + // (voir forgeEscapeCameraForFullscreen) — sinon position:fixed reste + // borné à sa taille "caméra" au lieu du vrai écran du joueur. + var isFullscreen = widget.getAttribute('data-fullscreen') === '1'; + if (isFullscreen) forgeEscapeCameraForFullscreen(widget); + widget.classList.toggle('is-fullscreen', isFullscreen); + forgeUpdateQuizBoxScoreDisplays(); + // Minuteur (optionnel — "aucun" reste le réglage par défaut, jamais + // imposé, voir screens/rendering/quiz_box_config.py). + var timerMode = widget.getAttribute('data-timer-mode'); + var timerSeconds = parseInt(widget.getAttribute('data-timer-seconds'), 10) || 0; + if (timerMode === 'question') { + forgeStartQuizTimer(quizObjectId, widget, timerSeconds, function () { forgeQuizBoxTimeout(quizObjectId, false); }); + } else if (timerMode === 'quiz' && !forgeQuizBoxState[quizObjectId].quizTimerStarted) { + forgeQuizBoxState[quizObjectId].quizTimerStarted = true; + forgeStartQuizTimer(quizObjectId, widget, timerSeconds, function () { forgeQuizBoxTimeout(quizObjectId, true); }); + } else if (timerMode !== 'quiz') { + forgeStopQuizTimer(quizObjectId); } // Rejoue l'animation d'entrée (@keyframes quizPopIn) même si la boîte // était déjà "is-active" juste avant (2 questions à la suite) : sans @@ -329,6 +467,18 @@ function forgeShowQuizBox(dialogueObjectId, dialogueId, objectName, line, questi widget.classList.remove('is-active'); void widget.offsetWidth; widget.classList.add('is-active'); + // Effet d'entrée propre au modèle (voir static/js/play/ + // quiz-box-templates.js) — optionnel, "defaut" n'en a aucun. + var showFx = forgeQuizTemplateEffectsFor(widget).onShow; + if (showFx) showFx(widget); +} + +// Registre d'effets par modèle (voir static/js/play/quiz-box- +// templates.js, chargé AVANT ce fichier) — absent en environnement de +// test qui ne charge pas ce script, d'où la garde `typeof`. +function forgeQuizTemplateEffectsFor(widget) { + var template = (widget && widget.getAttribute('data-quiz-template')) || 'defaut'; + return (typeof forgeQuizTemplateEffects !== 'undefined' && forgeQuizTemplateEffects[template]) || {}; } // Appelée par le clic sur un choix (les boutons sont injectés EN JEU par @@ -346,6 +496,12 @@ function forgeQuizBoxAnswer(quizObjectId, choiceIndex) { state.resolved = true; var widget = forgeQuizBoxWidgetById(quizObjectId); var correct = choiceIndex === state.correctIndex; + // Minuteur "par question" : cette question est résolue (bonne réponse, + // mauvaise réponse, OU minuteur expiré via forgeQuizBoxTimeout, qui + // appelle CETTE fonction avec choiceIndex=-1) — jamais le minuteur + // "pour tout le quiz", qui doit continuer à tourner sans interruption + // d'une question à l'autre. + if (widget && widget.getAttribute('data-timer-mode') === 'question') forgeStopQuizTimer(quizObjectId); if (widget) { var buttons = widget.querySelectorAll('.quizBoxChoiceBtn'); for (var i = 0; i < buttons.length; i++) { @@ -355,9 +511,15 @@ function forgeQuizBoxAnswer(quizObjectId, choiceIndex) { } } window.forgeQuizTotalAnswered += 1; + state.answeredCount += 1; + var fx = forgeQuizTemplateEffectsFor(widget); if (correct) { window.forgeQuizCorrectAnswered += 1; + state.correctCount += 1; forgeAddQuizScore(state.rewardAmount); + if (fx.onCorrect) fx.onCorrect(widget); + } else if (fx.onWrong) { + fx.onWrong(widget); } if (typeof forgeXapiNotifyQuestionAnswered === "function") { forgeXapiNotifyQuestionAnswered(state.dialogueId, state.objectName, state.questionIndex, state.questionText, correct, correct ? state.rewardAmount : 0); @@ -371,26 +533,133 @@ function forgeQuizBoxAnswer(quizObjectId, choiceIndex) { // après un délai fixe (700ms/1400ms), jamais assez pour un lecteur // lent ou un utilisateur de lecteur d'écran — l'avancée dépend // maintenant uniquement d'un clic sur "Continuer →", jamais d'un - // minuteur. Le bouton est ajouté APRÈS les choix (jamais en remplaçant - // choicesEl.innerHTML, qui effacerait le surlignage vert/rouge déjà posé). + // minuteur. Le bouton existe déjà (posé désactivé par forgeShowQuizBox + // ci-dessus, TOUJOURS visible — demande explicite, comme la maquette + // manga) : on se contente ici de l'ACTIVER, jamais de le recréer (ça + // effacerait le surlignage vert/rouge qu'on vient de poser sur les + // choix juste au-dessus). if (widget) { - var choicesEl = widget.querySelector('[data-quiz-role="choices"]'); - if (choicesEl) { - choicesEl.innerHTML += ''; - } + var continueBtnToEnable = widget.querySelector('.quizBoxContinueBtn'); + if (continueBtnToEnable) continueBtnToEnable.disabled = false; } } +// Prépare l'écran de résultat de fin de quiz (voir static/js/play/ +// quiz-box-templates.js::onQuizComplete, ex. forgeQuizClassiqueOnQuizComplete) +// et renvoie une fonction à appeler APRÈS forgeAdvanceConversation (qui +// masque sinon le widget, voir forgeHideQuizBoxOnCurrentScreen) — null +// si ce n'est pas la fin du quiz (forceEnd=false : encore des lignes +// après) ou si le modèle actif n'a aucun écran de résultat (seul +// "classique" en a un pour l'instant, "manga"/les modèles "boîte" +// gardent leur comportement d'avant, inchangé : la boîte se masque +// simplement). `forceEnd` (true) : le minuteur du quiz ENTIER vient +// d'expirer (forgeQuizBoxTimeout) — le quiz se termine MÊME s'il +// restait des questions, jamais une simple question de position dans +// les lignes. +function forgeQuizPrepareResultScreen(quizObjectId, widget, state, forceEnd) { + if (!widget) return null; + var dialogueState = forgeDialogueBoxState[state.dialogueObjectId]; + if (!dialogueState) return null; + var isEnding = forceEnd || (dialogueState.index + 1 >= dialogueState.lines.length); + if (!isEnding) return null; + var completeFx = forgeQuizTemplateEffectsFor(widget).onQuizComplete; + if (!completeFx) return null; + var correctCount = state.correctCount; + var answeredCount = state.answeredCount; + return function () { + widget.classList.add('is-active'); + if (widget.getAttribute('data-fullscreen') === '1') widget.classList.add('is-fullscreen'); + completeFx(widget, { correctCount: correctCount, totalCount: answeredCount }); + }; +} + +// Bouton de l'écran de résultat (voir forgeQuizPrepareResultScreen +// ci-dessus) — demande explicite : QUITTER carrément (fermer l'onglet/ +// la page du navigateur), jamais recommencer le quiz. Le dialogue est +// déjà épuisé (forgeAdvanceConversation l'a fait avant d'afficher ce +// résultat) — masque quand même le widget D'ABORD (repli si la fermeture +// est refusée, voir ci-dessous), avant de tenter de fermer. "is-showing- +// result" est retirée des DEUX emplacements possibles ("manga" la pose +// sur la racine du widget, "classique" sur .classiqueContent, voir +// static/js/play/quiz-box-templates.js) — l'un des deux est toujours un +// no-op inoffensif. +// +// window.close() : un navigateur ne ferme RÉELLEMENT que les onglets +// ouverts PAR SCRIPT (window.open) ou la page auto-générée d'un +// téléchargement — jamais un onglet atteint par une navigation normale +// (tapée, cliquée, ou un lien) : restriction de sécurité du navigateur +// lui-même, aucun moyen de la contourner en JS. window.close() échoue +// alors silencieusement (aucune erreur, aucun retour) : le repli +// ci-dessus (widget déjà masqué) est donc le résultat visible le plus +// courant en pratique. +function forgeQuizResultQuit(quizObjectId) { + var widget = forgeQuizBoxWidgetById(quizObjectId); + if (widget) { + widget.classList.remove('is-active', 'is-fullscreen', 'is-showing-result'); + var content = widget.querySelector('.classiqueContent'); + if (content) content.classList.remove('is-showing-result'); + } + if (typeof window !== 'undefined' && typeof window.close === 'function') window.close(); +} + // Appelé par le bouton "Continuer →" ajouté par forgeQuizBoxAnswer -// ci-dessus — masque la boîte à quiz et avance la conversation, jamais +// ci-dessus — masque la boîte à quiz et avance la conversation (SAUF à +// la toute dernière question d'un modèle qui sait afficher un écran de +// résultat, voir forgeQuizPrepareResultScreen ci-dessus), jamais // automatique (voir le commentaire ci-dessus). function forgeQuizBoxContinue(quizObjectId) { var state = forgeQuizBoxState[quizObjectId]; if (!state) return; var widget = forgeQuizBoxWidgetById(quizObjectId); - if (widget) widget.classList.remove('is-active'); + var showResultScreen = forgeQuizPrepareResultScreen(quizObjectId, widget, state, false); + if (widget && !showResultScreen) widget.classList.remove('is-active'); delete forgeQuizBoxState[quizObjectId]; forgeAdvanceConversation(state.dialogueObjectId); + if (showResultScreen) showResultScreen(); +} + +// Minuteur expiré (demande explicite : "pouvoir paramétrer un timer pour +// répondre aux questions", jamais imposé — "aucun" reste le réglage par +// défaut) : mode "question" — cette question est comptée fausse (0 +// point), la bonne réponse s'affiche, puis "Continuer →" fonctionne +// normalement. Mode "quiz" (wholeQuizExpired) — même révélation, mais +// plus AUCUN temps pour la suite : le quiz se termine tout seul après un +// court délai de lecture plutôt que d'attendre un clic. Réutilise +// EXACTEMENT le chemin d'une mauvaise réponse (forgeQuizBoxAnswer) avec +// choiceIndex=-1 (ne correspond à aucun bouton : révèle la bonne réponse +// sans en marquer une "fausse"), jamais de code dupliqué. +function forgeQuizBoxTimeout(quizObjectId, wholeQuizExpired) { + var state = forgeQuizBoxState[quizObjectId]; + if (!state || state.resolved) return; + forgeQuizBoxAnswer(quizObjectId, -1); + if (!wholeQuizExpired) return; + var widget = forgeQuizBoxWidgetById(quizObjectId); + // Pas de "Continuer →" ici : rien à continuer, le temps du quiz ENTIER + // est écoulé — désactivé/relibellé pour éviter toute course avec la + // fin automatique programmée juste en dessous. + if (widget) { + var continueBtn = widget.querySelector('.quizBoxContinueBtn'); + if (continueBtn) { continueBtn.disabled = true; continueBtn.textContent = 'Temps écoulé…'; } + } + setTimeout(function () { + var s = forgeQuizBoxState[quizObjectId]; + if (!s) return; // déjà fermé entre-temps + // forceEnd=true : le quiz ENTIER se termine ici, qu'il reste ou non + // des questions (voir forgeQuizPrepareResultScreen) — capturé AVANT + // que forgeAdvanceConversation ne supprime forgeDialogueBoxState. + var showResultScreen = forgeQuizPrepareResultScreen(quizObjectId, widget, s, true); + if (widget && !showResultScreen) widget.classList.remove('is-active', 'is-fullscreen'); + delete forgeQuizBoxState[quizObjectId]; + // Force l'épuisement des lignes restantes — même sortie que la fin + // naturelle d'un dialogue (markCompleted/thenAction inclus, voir + // forgeAdvanceConversation), sans dupliquer cette logique. + var dialogueState = forgeDialogueBoxState[s.dialogueObjectId]; + if (dialogueState) { + dialogueState.index = dialogueState.lines.length; + forgeAdvanceConversation(s.dialogueObjectId); + } + if (showResultScreen) showResultScreen(); + }, 1500); } // static/js/play/__tests__/ (node:test) — même garde que les autres @@ -400,9 +669,14 @@ if (typeof module !== 'undefined' && module.exports) { forgeShowDialogueBox, forgeDialogueBoxAdvance, forgeCompleteDialogue, forgeDialogueBoxWidgetOnCurrentScreen, forgeDialogueBoxWidgetById, forgeRenderDialogueBoxLine, forgeResetDialogueBoxFooter, - forgeShowQuizBox, forgeQuizBoxAnswer, forgeQuizBoxContinue, forgeQuizBoxWidgetOnCurrentScreen, forgeQuizBoxWidgetById, - forgeUpdateAllScoreWidgets, forgeAddQuizScore, forgeAdvanceConversation, forgeShowCurrentConversationLine, + forgeShowQuizBox, forgeQuizBoxAnswer, forgeQuizBoxContinue, forgeQuizBoxTimeout, + forgeQuizBoxWidgetOnCurrentScreen, forgeQuizBoxWidgetById, forgeHideQuizBoxOnCurrentScreen, + forgeUpdateAllScoreWidgets, forgeUpdateQuizBoxScoreDisplays, forgeAddQuizScore, + forgeAdvanceConversation, forgeShowCurrentConversationLine, forgeSyncQuizScoreToScorm, forgeSyncDialogueStartedToScorm, forgeSyncAllDialoguesCompletionToScorm, forgeComputeFinalScormStatus, + forgeStartQuizTimer, forgeStopQuizTimer, forgeQuizTimerState, + forgeEscapeCameraForFullscreen, + forgeQuizPrepareResultScreen, forgeQuizResultQuit, }; } diff --git a/static/js/play/quiz-box-templates.js b/static/js/play/quiz-box-templates.js new file mode 100644 index 00000000..c2f2e293 --- /dev/null +++ b/static/js/play/quiz-box-templates.js @@ -0,0 +1,165 @@ +// ---------- Effets visuels par modèle de "❓ Boîte à quiz" ---------- +// Registre appelé par static/js/play/dialogue-box-controller.js (JAMAIS +// l'inverse) aux points d'extension du moteur PARTAGÉ (forgeShowQuizBox, +// forgeQuizBoxAnswer) — voir screens/rendering/quiz_box_templates.py +// pour le HTML/CSS de chaque modèle. Ajouter un futur modèle n'oblige +// donc jamais à toucher dialogue-box-controller.js : juste une nouvelle +// entrée ici (optionnelle) + son CSS/HTML. + +// Effet PARTAGÉ entre plusieurs modèles "page de quiz" (Manga, Classique, +// et tout futur modèle qui voudrait la même mécanique) — demande +// explicite : au-dessus de la question, "Question N/M" (nombre de +// QUESTIONS de ce dialogue, pas la position brute dans lines qui mélange +// aussi les répliques) plutôt que le nom de l'objet déclencheur — et une +// barre d'étapes juste en dessous du bandeau. `forgeQuizBoxState`/ +// `forgeDialogueBoxState` (déclarés dans dialogue-box-controller.js, +// chargé à côté de ce fichier) sont des variables GLOBALES de script +// classique (pas de module), lisibles ici telles quelles. +// `progressSelector` : chaque modèle a son propre conteneur de barre +// d'étapes (data-manga-role/data-classique-role, jamais data-quiz-role — +// décoration propre à CHAQUE modèle, pas du contrat partagé). +function forgeQuizProgressOnShow(widget, progressSelector) { + if (!widget) return; + var quizObjectId = widget.getAttribute('data-object-id'); + var quizState = (typeof forgeQuizBoxState !== 'undefined') ? forgeQuizBoxState[quizObjectId] : null; + if (!quizState) return; + var dialogueState = (typeof forgeDialogueBoxState !== 'undefined') ? forgeDialogueBoxState[quizState.dialogueObjectId] : null; + if (!dialogueState) return; + function isQuestion(line) { return line && line.type === 'question'; } + var total = dialogueState.lines.filter(isQuestion).length; + if (total === 0) return; + var current = dialogueState.lines.slice(0, dialogueState.index + 1).filter(isQuestion).length; + var header = widget.querySelector('[data-quiz-role="header"]'); + if (header) header.textContent = 'Question ' + current + '/' + total; + var progressEl = widget.querySelector(progressSelector); + if (progressEl) { + var bars = []; + for (var i = 1; i <= total; i++) { + bars.push(''); + } + progressEl.innerHTML = bars.join(''); + } +} + +function forgeQuizMangaOnShow(widget) { + // Défensif : si CE widget est réutilisé pour un quiz déclenché à + // nouveau plus tard dans la partie (voir forgeQuizResultQuit, + // dialogue-box-controller.js — le widget lui-même n'est jamais + // reconstruit, juste masqué), une question fraîchement affichée ne + // doit jamais rester sur l'écran de résultat de la fois précédente. + if (widget) widget.classList.remove('is-showing-result'); + forgeQuizProgressOnShow(widget, '[data-manga-role="progress"]'); +} + +function forgeQuizClassiqueOnShow(widget) { + // Même garde-fou que forgeQuizMangaOnShow ci-dessus, ici posée sur + // .classiqueContent (pas la racine du widget, voir + // render_quiz_box_page_classique) plutôt que sur le widget lui-même. + if (widget) { + var content = widget.querySelector('.classiqueContent'); + if (content) content.classList.remove('is-showing-result'); + } + forgeQuizProgressOnShow(widget, '[data-classique-role="progress"]'); +} + +// Écrans de résultat de fin de quiz ("classique" ci-dessous, "manga" +// plus bas) — appelés par forgeQuizPrepareResultScreen +// (dialogue-box-controller.js) UNIQUEMENT à la toute dernière question +// (ou si le minuteur du quiz ENTIER expire). `result.correctCount`/ +// `result.totalCount` : comptés PAR CE QUIZ (voir forgeQuizBoxState dans +// dialogue-box-controller.js), jamais window.forgeQuizScore/ +// forgeQuizCorrectAnswered qui cumulent TOUTE la partie. Le seuil de +// réussite réutilise EXACTEMENT window.FORGE_SUCCESS_THRESHOLD_PERCENT +// (déjà utilisé pour le statut SCORM final, voir +// forgeComputeFinalScormStatus) plutôt qu'un réglage à part. Le bouton +// QUITTE le quiz (jamais ne le recommence, demande explicite) — voir +// forgeQuizResultQuit, dialogue-box-controller.js. +function forgeQuizClassiqueOnQuizComplete(widget, result) { + if (!widget) return; + var content = widget.querySelector('.classiqueContent'); + var zone = widget.querySelector('[data-classique-role="result"]'); + if (!content || !zone) return; + var total = (result && result.totalCount) || 0; + var correct = (result && result.correctCount) || 0; + var pct = total > 0 ? Math.round((correct / total) * 100) : 0; + var threshold = (typeof window !== 'undefined' && typeof window.FORGE_SUCCESS_THRESHOLD_PERCENT === 'number') + ? window.FORGE_SUCCESS_THRESHOLD_PERCENT : 70; + var passed = pct >= threshold; + var titleEl = widget.querySelector('.classiqueHeaderTitle'); + var title = titleEl ? titleEl.textContent : 'Quiz'; + var quizObjectId = widget.getAttribute('data-object-id'); + zone.innerHTML = + '
' + pct + '%
' + + '

' + correct + ' bonne' + (correct > 1 ? 's' : '') + ' réponse' + (correct > 1 ? 's' : '') + ' sur ' + total + '

' + + '

« ' + (typeof forgeEscapeHtml === 'function' ? forgeEscapeHtml(title) : title) + ' »

' + + '
' + + (passed ? '✓ Module validé' : '✕ Module non validé — seuil ' + threshold + '%') + + '
' + + ''; + content.classList.add('is-showing-result'); +} + +// "Manga" — même mécanique que forgeQuizClassiqueOnQuizComplete +// ci-dessus, thème manga propre à ce modèle (voir static/style.css) : +// pas de conteneur "content" à part ici (contrairement à +// .classiqueContent), la classe "is-showing-result" bascule sur la +// RACINE du widget elle-même (voir render_quiz_box_page_manga). La +// barre d'étapes est reposée à 100% "terminé" (tous les segments +// is-done) : forgeQuizProgressOnShow ne le fait pas toute seule, sa +// dernière question reste "is-current" (jamais "is-done", il n'y a +// plus de question suivante vers laquelle avancer) — un quiz FINI doit +// visuellement se lire comme entièrement complété. +function forgeQuizMangaOnQuizComplete(widget, result) { + if (!widget) return; + var zone = widget.querySelector('[data-manga-role="result"]'); + if (!zone) return; + var total = (result && result.totalCount) || 0; + var correct = (result && result.correctCount) || 0; + var pct = total > 0 ? Math.round((correct / total) * 100) : 0; + var threshold = (typeof window !== 'undefined' && typeof window.FORGE_SUCCESS_THRESHOLD_PERCENT === 'number') + ? window.FORGE_SUCCESS_THRESHOLD_PERCENT : 70; + var passed = pct >= threshold; + var quizObjectId = widget.getAttribute('data-object-id'); + zone.innerHTML = + '
' + + 'Fin du quiz' + + '

Score final : ' + correct + ' / ' + total + '

' + + '
' + (passed ? '合格' : '不合格') + '
' + + '
' + + '
'; + var progressEl = widget.querySelector('[data-manga-role="progress"]'); + if (progressEl && total > 0) { + var bars = []; + for (var i = 0; i < total; i++) bars.push(''); + progressEl.innerHTML = bars.join(''); + } + widget.classList.add('is-showing-result'); +} + +var forgeQuizTemplateEffects = { + // Modèles "boîte de dialogue" (voir screens/rendering/quiz_box_config.py + // ::QUIZ_BOX_DIALOG_TEMPLATES) — "Verre dépoli"/"Néon"/"Minimal"/ + // "Ludique" ont été retirés (demande explicite : "supprime tous les + // modele de boite sauf le base"). "manga_dialogue" (clé DIFFÉRENTE du + // modèle "page" "manga" ci-dessous, même registre partagé) reste + // proche de "defaut" — aucun effet JS particulier, juste sa propre + // décoration CSS (voir render_quiz_box_manga_dialogue). + defaut: {}, + manga_dialogue: {}, + // Modèles "page de quiz" (QUIZ_BOX_PAGE_TEMPLATES) — le tampon "正解"/ + // "不正解" du modèle "manga" est posé en CSS pur (::after sur + // .is-correct/.is-wrong, voir static/style.css), seul "Question N/M" + + // la barre d'étapes ont besoin d'un vrai calcul JS (onShow ci-dessus). + manga: { onShow: forgeQuizMangaOnShow, onQuizComplete: forgeQuizMangaOnQuizComplete }, + classique: { onShow: forgeQuizClassiqueOnShow, onQuizComplete: forgeQuizClassiqueOnQuizComplete }, +}; + +// static/js/play/__tests__/ (node:test) — même garde que le reste de +// static/js/play/. +if (typeof module !== 'undefined' && module.exports) { + module.exports = { + forgeQuizTemplateEffects, + forgeQuizProgressOnShow, forgeQuizMangaOnShow, forgeQuizMangaOnQuizComplete, + forgeQuizClassiqueOnShow, forgeQuizClassiqueOnQuizComplete, + }; +} diff --git a/static/js/scenes/scene-editor.js b/static/js/scenes/scene-editor.js index 545268f6..860c5d1e 100644 --- a/static/js/scenes/scene-editor.js +++ b/static/js/scenes/scene-editor.js @@ -796,6 +796,80 @@ function saveDialogueBoxStyle(objectId) { }); } +// "🖼️ Modèles" (voir templates/scene_edit.html, "❓ Boîte à quiz") — DEUX +// galeries INDÉPENDANTES (demande explicite : "boîte de dialogue" hors +// plein écran, "page de quiz" en plein écran, jamais confondues) — une +// SEULE des deux est rendue à la fois (voir quiz_box_config.fullscreen +// côté serveur), chacune surligne la vignette cliquée sur sa propre +// grille (data-selected-template) puis sauvegarde tout de suite (même +// geste qu'un clic sur une tuile de personnage/décor). +function _selectQuizBoxTemplate(objectId, key, gridId) { + var grid = document.getElementById(gridId); + if (grid) { + grid.setAttribute('data-selected-template', key); + var tiles = grid.querySelectorAll('.quizTemplateTile'); + for (var i = 0; i < tiles.length; i++) { + tiles[i].classList.toggle('is-selected', tiles[i].getAttribute('data-template') === key); + } + } + saveQuizBoxConfig(objectId); +} +function selectQuizBoxDialogTemplate(objectId, key) { _selectQuizBoxTemplate(objectId, key, 'quizDialogTemplateGrid'); } +function selectQuizBoxPageTemplate(objectId, key) { _selectQuizBoxTemplate(objectId, key, 'quizPageTemplateGrid'); } + +// "⚙️ Options du quiz" + "🖼️ Modèles" (demande explicite : quiz RH +// autonome — plein écran/minuteur/DEUX modèles indépendants) — mirror de +// saveDialogueBoxStyle, mais un objet de config à PART (voir +// screens/rendering/quiz_box_config.py), jamais mélangé à "🎨 Style" +// (couleurs/police, inchangé, voir plus haut). Remplace l'aperçu par le +// HTML fraîchement rendu une fois sauvegardé — un modèle change la +// STRUCTURE du balisage (voir screens/rendering/quiz_box_templates.py), +// pas juste une classe CSS : deviner quelle balise ajouter/retirer côté +// client casserait la plupart des modèles. +// +// dialog_template/page_template : SEULE une des deux grilles est rendue +// à la fois (voir templates/scene_edit.html) — celle qui est ABSENTE +// garde sa valeur via #quizBoxTemplateMeta (posé par le serveur), jamais +// écrasée par un défaut. +// +// "Plein écran" (demande explicite : "elle doit occuper tout l'écran", +// "être visible par défaut", "la notion de caméra disparaît" — DANS CET +// ÉDITEUR aussi, pas seulement au jeu) : rechargement complet dès que ce +// réglage CHANGE de valeur — le cadre "🎥 Champ de la caméra" dépend de +// TOUS les quiz de l'écran (pas seulement celui-ci, voir +// routes/scenes/scene_edit_view.py::any_quiz_box_fullscreen), ET la +// galerie de modèles à afficher change entièrement (boîte <-> page) : +// un simple patch DOM ne pourrait recalculer ni l'un ni l'autre ici. +function saveQuizBoxConfig(objectId) { + var meta = document.getElementById('quizBoxTemplateMeta'); + function currentTemplate(gridId, metaAttr) { + var grid = document.getElementById(gridId); + if (!grid) return meta ? meta.getAttribute(metaAttr) : null; + var selectedTile = grid.querySelector('.quizTemplateTile.is-selected'); + return grid.getAttribute('data-selected-template') || (selectedTile && selectedTile.getAttribute('data-template')); + } + var fullscreenEl = document.getElementById('quiz-fullscreen'); + var fullscreenChanged = fullscreenEl.checked !== (fullscreenEl.getAttribute('data-was-checked') === '1'); + var config = { + fullscreen: fullscreenEl.checked, + timer_mode: document.getElementById('quiz-timer-mode').value, + timer_seconds: Number(document.getElementById('quiz-timer-seconds').value), + dialog_template: currentTemplate('quizDialogTemplateGrid', 'data-dialog-template') || 'defaut', + page_template: currentTemplate('quizPageTemplateGrid', 'data-page-template') || 'manga', + }; + fetch('/game/' + GAME_SLUG + '/scene-objects/' + objectId + '/quiz-config', { + method: 'POST', headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ config: config }), + }) + .then(function (r) { return r.json(); }) + .then(function (data) { + if (fullscreenChanged) { window.location.reload(); return; } + var el = document.getElementById('el-' + objectId); + var widget = el && el.querySelector('.quizBoxWidget'); + if (widget && data.rendered_html) widget.outerHTML = data.rendered_html; + }); +} + function initPersonnageCommandsPanel() { var body = document.getElementById('personnageCommandsBody'); if (!body) return; diff --git a/static/quiz-templates/classique.png b/static/quiz-templates/classique.png new file mode 100644 index 0000000000000000000000000000000000000000..59f096cc4ed8a1c31950a4b3bb82d1d87c8451a5 GIT binary patch literal 78146 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 literal 0 HcmV?d00001 diff --git a/static/quiz-templates/defaut.png b/static/quiz-templates/defaut.png new file mode 100644 index 0000000000000000000000000000000000000000..209f989ee3302abbd14504ad8d6810f57f536469 GIT binary patch literal 14575 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 P1*EE^^&Io;<@^5uEJ*|s literal 0 HcmV?d00001 diff --git a/static/quiz-templates/manga.png b/static/quiz-templates/manga.png new file mode 100644 index 0000000000000000000000000000000000000000..faec8a3aa52dbd68fb496e593f631ea604489752 GIT binary patch literal 943956 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

Wbu=%oaT0L}WL_2RqYFM5wQFCI#}*BLpA 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Ⓢ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%0A|q4d{w*VA7XMM&WlZ=#K;}xMNi` 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

=OVsD$KiVMaudJ0Ke0*;QGQpa>@+q*oxe! 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�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

xB4&BRcG3qFJLq#F$PV9D0K z09ID7km;F;Zc?}H1SH+b7LI9Q_lLcQzFOI=dhvPEs5r%v!i&irnDv&LGV&@r&E$>w z_VnvUmIK1woO{+_>3>O`E;bOs%&x=@s+gK7Lc^5kT21`&L{!OspC&M>Ra~LM>wcBa z6a8}2SHVMfph0eo$l!-?%2sI2y@%K#N-BCkJo`GfXcU@5hqrz5*|;#Ph;eIlItj;nFB>Syvcil@&ADNRB(i7a$py)!#w`AwaP!Py>pE9M$nc{LMu&~jjy zwOp$$nt4`@JTpDCF_ctG!e(XrFAFuSkpHeExo3y7a55w2J>u3dy9fl2{}N^})}2Y0vE9y8Fq7d%$0>^h%k6ok%ssKs6DyqD|BR)y@niY7 zT;T4{$2qYz*G(O2`S3^t6EJ!yZv{F=lVCQpQ3fjq;U)T$qu@EJ1)Kw6FRPB4Ox3w! zc6q3b&OBdklxR;VBN>MX`>p{#1}{5FJ ze@j!`oaBITxva|UnJ0X~j|;<-PzPRvA*uz8RrWjRI8?aRl3dSPaHzNE2M1awUZAv& zt_ah&^^H5!NJf7{+CR78xyxBp`5xnbc8O6^^?wQKPqEJAd1?jV1jHToT!RAP@GiEKRkLqp{NG*s{mXQRfG;|Ye%pKa_gwblA) z10K`5;oO8+@~C>)iGjlg%~?B~vp;y-Q4LU2K5{F!oiv_f`Khg*u()#9J{L2gb*A;% zTO0sISH6u{;r@~fFG=~H-2Yc8-+zZQ1smeO$qvphX;?gOMMKXnINvV`@`{Ie3{~Ah z_g`ncRFgWs(eay3-RbV?<2pwhLh3go^J*fOm!lTca(2cRM^;br&8xKyGu}92mW5LPrDb!O1VO4z;Ji6jpS+XBx$oYBb9<5~S zbNU{gXdqC@8R1u#A`m%*nEayvXl1)hH!c>tj-B7omF5_?7e3~++L2Kcu=uj zO}-&jor`ZZ<;K_#DXG`;>#p7NfgT8_Fu8P$G^}id4&Fh)MHOPpQ3r~P1&N&abs2%k z)z!7}>$hO5n@v4`u>p$!r7k12+o#Hr842vs+f1Jj!iZMC(AOBVxMy)*@k*c2D~F@I zxP8(M;OROog5^miP9p4FT#AieOb(@nzqt!&T-uqLGR9PMkdav%bQh{WK8t=Y2AgyB z9bpwLL;WmD(1LYC=&UPG6vwY18 zvB}w-PL$bV7IA=h_-R{(LJXbH+sV_gVtVSkW%e<9Vix_+r+{n|4c}GWBxh_Je@dBws#Kiy zkIMaI8W4{N{GAsKxyCtgvtGO+hERE^JZL*6f%9^g{GxVOa$y+KQ7Ok#9SnGCkpl;v zucnq{V8XwdJFGLxX$+Anl2rFMV#l3Rznd~34^QKLd^MMp0`6Y!S3B$d4Rbz>-j1fe zqD{%8PrxhCAsJ2qz zs8&(~!JA|6GguN&OEaRehk|a~&H~Qo40_IHo3G9R>eSa53 zc+xp9^MtBEz5H&<{&X_urKM)hfG}r9JiU2|i%@hAR31h8j89WeGHAe7|L&62NSo() z8I7Cz=HB=`cz}&ape*?>bm5^i_a-b=jY+u4aj~5czt;US^Pq4~q_q-j59(F?*4Mb)$+(K4vNpZ|M!tu}^+Y@9i*=58O2Sqz>hlB-Sn=Dr)!(HF;i zSko~@k#g(UJ5BeYN!4>dkHbd3$sL`wGR=8<1Id8^3+khEJGEk6lZ7z^f_N6W z824@45_PcP$epCXaKD0$pkUJI6oy7j@I!#;Xo_C(!aT6r%($}`W!fhl*j%TQYYsf3 z`6hTW;F$~a6fp&4oVJz5q)nA6DNbq`a|7Dviu(To=v38jfw^ zs=!W6l+lbne;VB)T^5}}51?~`-v{Ie?{Kin``qg}PL3o*y~$yR5~KF0JNfNE<1^kf zo_{|U$}nFY4sM%f^na_ezs5)q>2vh~>7*oW>pj1A9Tk=l^iX}VYWl5K*y6w{jq{e} zgL_=VOSyC39}{mIOvYv~pVVt}-M_1^)W#t98EPxQT~S)}5bFWD;2GBhI5*T#J5UxI zUEV{q4!|g2jwP)uT~bbECTh1c@nhshw^{gx)T;Tl=ye#z?A#VP26WZYXTEA>YSopt zwEgBxpNa<*DEWtQiWQvWq0swRH)@eSX;1sfOZ`9STMWIhBy+5y} zh{V_K;6*1KJV>2RE?_WyDNOU$WfkDPn_gJ=)X<%-#5~+@kQ_KixG%?N$Gv}rD#vzUmg)=mvw(`_y_0Pn*NpP2k{PDRUaN(h&0;_2N& zALzmxXa;zbd1rIknKQ8QMid8+@B?WliwXwvV{gkv!%Y2913bPEciw-r8aWcwI@O~^^L0@HH2B7LigTP7}MhN zJDSR?!ph-|Zz_MVoX+32*WqLh$pL+43_0QL4KvpxiO}*JkjbblRZg}u5A1OIZw-Uh zai&o&Q%TNDw3<_$i&@LLn?V{?_j*ylo1-f^&|+E*e?L^b7w?0EEh(e4-C3uG`pqv# zIW88b$rZk7aPSN@`DFLw7B z@c3MI(@G zGrG%oQ6YN-aI@-7uhZ1M-RnDn;C(6{859tcPZ3h&&@<`A@&0~9V?@)UqurvP_*=7w zD3>-E5^?*XCq(5FC$Nn`=noOG00q{*lsRtrYGFaOIDtd+={-`}sy||}(6NjhVlM#QWQtVCO zl#a{1PTPy_Vha5gJ=5$|$&BJ{af!vcC($?HISZTU_B!Y0T}aV?XsYu~#(bZ2+o zTOh%Tvu+5d%x5dxN6Y|e3%bs$5*)W#9a+JOBb%K{#~L*#23NByfKcpEFZz3UreC!I zt|oR3g1**XqUx0*ib@MZa!V!-O95vFLT&CR+ED8Ir?ZrLeQ=iB8t&ljnzRcband-$ z{&}kzYs1S!L6rLuR?K~WBcE97B3}hOvr;L0!Erg-i@wi2{&hO#%-^gifB#m0%EJGf zH1&VBx7bQ$b!?!EVBU+3I++%9Vn3c{=a{c&Q!Da+7 z)jjpy3=w*A-hmg6i>NRa!a66LO)9FEHYIg)k_wUd;~b&0X)@p1IYG$U&XO$Hm3odZ zdGt<GL!w{cVWet(|H>5M?51y`={Nhe?*Vn=%!{4YoI;I_rZ z=(Vi;=7&l9Cp>M_T^%C7_lFTrLMH(NH?44=wf?m^jQG~1!Uz1;Komu7n9`is7H_rh z_`}7wN^i-WS(H^FC9ti})o>E}(89i_FTujSch`y6!Hw9ii-@{cgAX>r!xn5!1t&BO z(&wNf&1vLrI&SN%4?a=UFX_(d_tSUdX*zo17<=k*0~CO3NVYEFji0D(mW>(=Nn4MA zhdIKzCb)&X5@hSj-BUjmF{V+SmU0dpbud!}ZoUMX`;m1_<&98s6y56HdNPyT?M=)a zHk#8;J1F5aTWLM|U?vNX+4SQ*I(9%)I6Ms`4F&3d*pqBhTrsD~e>`1$v6t#)u=8i5 z`3wCfbFVQ$W8?g-?!sspQX6wD6Z^x2O(Q}RK) z%cqjA#OV)*FK7{-J(byU*WEBncpx38W3#vga>Tvb{`3jG`<$Yd3!O=}Ir&qEVT;iN zr+Yb%g>Xfwpm6YAVemYb!D0DUBnzu*?k$xAYWb=9R(xU}CS`~=Wz2C9=7XyQD`w*< zidT+K4EYIQW1gHEIj`o;b++h6{yK990+AMQbWX9bSLBhFVwZsO*^dAn zD~T{FDG*7|H2LLA7nHo#B3zEN<9#VpOPk!=uHlVG-uQg}%qVsaZ*-aFBnF4;IK;7< zcpRamnuBH?QpTa;)ZpEUb2u47eWPNQ*O5oosx3s$M(h zguAhoPli@IkV>huotLCi4XyJMM#pms(=j=s&pSu2t*KN#xl*#1hFuF(!lBGVq>>1F^{2^T!ap%k_%WL(_UQY1Yg6y=VeG&mwe*VSWpwl} zj#2DMlb{m0Q+V%`y6o!Ut0>h3;NM%Au8OBM50ibRG=sE5W`zA|w%qF{B1hqT5-p+0 zwNPW^HBXczm+b-PbdFGfU2uH6d~^zw0td^vhGB=yQnq(+6{Da}^iBbvdp7Rkonp!t zjvi=r(V;JXNWOmnoqy|J|7VRsYkJ7^sN&yEd`s0V{jy*c; zkG@3C#nhs`4sw&BWI3qf&3h0nGmjdNt4ort!lDpVJgOTzA?kEhVdrdhN>70*tlEn{ zf&YsiPzxfVk}Z+|0nZMxv5#AaNyCJH4avZ`UJWtM5q2}5qZdxAr705a8;=YHozFc; zNp5A(fVSW?EQia_8Jw`hhtQv>l5O&EC(6r#E;Ot+oB+&tLV<~H+Z8~EM#2n2*Nh^| zA8O@AE*61ev$`^dRdy6J;{J8_Al-XaRb@AE( zR6BAkS)2xCS_t1GV@Ab30Yn!dd1~H-y}RlrHo>Voh7$Prq*(L(|hBtR8iWfBVz}FKi;_4|t>`&Q8!O!(HE#Cij9?bbg=<@^~ zi3ckIkbQo(VsJ#xOL3^g+F2vBa&8*dm`!ErOf@20VhNUxrmV?K{jv4!VT+f`tVF$R zkx_yMYk^QT4H1Y`I9tiAiLK+iwZ0G)IIAoTcdqzr`zJP=-(P2e2#JkOxC#kSUOPEJ+gq$wemDF z=G;*F4#nY*c$+3&lvbCc^o`(g_+)LPxvY{Tj`$o@XAem-)?Pte6|^^mT( zLj8YLqEwvj!rxKcyGIFfdldiH^HC*j%F7@}=C_Y)gezK3>wn>`gXp(4B@h0-joh8% zDl{us2f-q~$!Oh^7md(s2R192dfIp7V|F&?nr)T@vom>wqJ7D%%H{iWNUG*^R zLHqGH(fs3Mwp>pAao|W8oliFU3o$ACnDv<d_S`zd`DNq=$t*LKX&!`Ti=#(-eoi8wC-j!!PXUKPZ!-BU4e3) zrKF4}`roi#{yg$_2t!8aKC63lj>JqN(OE5NFXE(p9!E)$Wvc>0)av=XgV(I-M}ab( za>^LgW?LZgj;}Q8pgAvWqp3h5lDt6!_9v zpY*0Bdmfcq+{!rHSP=Bf*hz-2;=b=n5Z4)utJwy{+xMDHFZtptKf3$*OKrU^1B z&Tx1J&u%qN7IOP6FcORk-!F9{F!_(K-^-YrE~*W8r_Rl1`_3WRvr^)#(etFpEh53D zw9warm6KH9hWiAM!E5Q*05^I&|II_bRT_^X*g!wHEKYQ74#h?T$x`PgudKJ8>7tI> z878hK-q8w0>jV*tNzvu$nsicY!D z)(lfuD6eBNeF68_>fQ%Dxz+yc>>TC&&lD(2hl_EfclS>6Mvl4+HwHtRcBS?={3@5{L@VN&NST&_T79 z`RbmOJUuzq>LonGql~Byk$kq@YMb^Tm-g;-9F||Z)qA(n;!D0VV2%17U~ED{+7YP4 z`r;C9VaT-ldE1|&Brv7D4aBIv@ z_ZMwt$kCdrShW~>El{*6KH6uqq*-E=l+>BsC%hGU?3&3st;Q@&e+O0Ad1VR~_fq3g zNW>O6?4-a{74hmSf9o@K(-CLfDS>jiuj!$QPzqfS>oTte4P6s3Xp{CDdp<#Uz$t|A z{U}KV(k13{9DKKWg7(3%F`Fl4)YCX8bSgG>%X!gVD#{t&5{XfCk$Us=yn|43M3u@0 zp=49-yxL^SDlutkAq2R!u=nXK`1}?9*>!ZM7G={zTyYxE<{h-*t- ztXeT!<30qhZY3DRIr$Jv9!6Wk!L>Ud-*Xx7+2TXD6I*4W8m=PN+-=j-Z4^q5dQqza zqAqLD0XfZ#Q9Ljp3QVQf_pnmci(7E1wB=9f{Wte~V&q1+u`a$3uA*O@DqEKmC7l)B zT98I4mO{^itdbm`dTqb8(0N51UO&NuT2!y;C)wuYXPMU!61uV+8N`9($Ijm*zEBab zN?$`YomJwkd_9givgZ$}Ow?jZnd0 z|N1e@f&8FHiGGmXTcL_4pq@ab%pansowKaJ1WoEsxfGc zw$p_dp2{pf5BzK6l(qwx3DZ6d^BQ29JJ3s6hgD-|M*bPyZRMqiOMvw02&o&Mt^&;T zWodmEqY|~+ecgs z48*51aSyh>pY>Ts#|LqPeLkBxdd}``-ImhZ)H*f2BuQEgv`B;~%8zg-Im5ZERP;>s zI=`9SRN%$zJNb4~f7tEW2pdDzCKq16GUw_Q!wLtWLF%f$!9rA!gHu=h$amUlqrY&~ znU}jT3nHF=kU|+Skp^mFvIKJ}jni2Nl7;O4|D>A$2l!w4Vr?E@wqkoX+A2U5$^{43 zEIdIES`PMqkc*MolI*H~Z}wga4~9N-Ojp4f>iIkorYnpSa9(a&E?M>}zDIp<123Ao zdGR$dBkEIPNv3U1iQx#0t6G(MWXNO*>1uLJw%P1vjxrj%@q~wC#c18J+#%YB(JY1X z5v0eh2M7ab%WNwlD$}c9$6fs#BUh;R^vDlkn_BCya1%0J!;DVC3TBZ8nUj-(IXN#5 zxp-mGG*ksYJ`Z#s3)B*k^rHB6* zY3k>23|jSbC-Lz*e2cP;ku?WD5ZVEMn;ZxqU7wwO`IO+2v2(+dIidWUpzwG+k~B5{ zO5sB&7x>X-ZyuQcu<+WKP#dxZaTp^Hf@tCt|KfOJ1AEr@G%TfQ@T%soTv!xWlFlL- zkI`|N;9y{CW74MM_sM*X-fe$;mjj+&Azx!1WE@!IB(`voX>dh?mQ*x(4J-IAl||^w z)XhHTH8>CYLuKgFLA-Br%0%q3^Oqt)4AA8CA6Y6!^3{oEgFOs~@EbmG<@e{MxIW&& z!Ps`uRx)oc%x-1e=)L7jHo2HdGEcDC4kx*Ve5>jC`}s# zE6bVJbM1OR+Qyyc@R;TclAMxOVI&sZ(ew>m)Lp=KBcwJ5`LmCa@+)@$ZBk*2*PeH} zp@}>q=UK4A8QPF;OXjeB#nr;Ur4oXG94gTTckt(|o{=*$`QBjn|41Bi>Y^+nkYBao zVoCjU6=a5POKhMf|h3uBjUoGwwlP!O~cd{YZNY0CG|aUCdRv z`9TGV746A~hn@gSNterOzt4cUo1kgjx{^8GxgvkbTc@u}NY2HKqpo$NbkZvTF1AS{ z85;zv)}wrU5mbu|dq#h=v)H+56mcWoN*YI5g;@#|6RAa>mP>|DmK^Ml*tbMI5+yLf zxk{4l$Z^O2$BJak5W(kK zMgew=V4yRiPpbA#@t}P@_wE6q(>u0 zuD2l~%AydPKp%bbVN!Ia1$74VbU#V*EC_mc$s}h$EiP3Byv1oG=A_XU~R z5<|^=95UmS-p6NyHnb;!?#n!T=6VD+&rTJS&By^{E7V$uSwzS7xUC@CDNm>n;Mbsb z1Q;F7q>r$j(#!O!SC`%IYrgepXg#opJH;9~MPgYC+%sHxt5X#}o<@WJ19oDKj>b9r zc<4B1$z_Kegn*Z`{?3fSU~nOYopyexi<F9a}WZr82Y9G_z6^ zwV4(xODijv3|uNIO9b3-fi{=QAT_rH8FR{964zWpOigix%9Pv}L^4Da+)&Zqh0Su` z^PT7U-S_i6f7Blxb{rjX@%g;3^L?JL6Z|7cVZY%NS_poLQ3ZhkVaFfcocuQWT?SHO ztd?Gx0XGE;yVtdwiFvVV^QUC~EBE2PDYRLhJ;b@oAI5r7IDiR3_B%UPw-ql>S2sHr zCny#_URy$bzgl&HzBzRalBZ+K((!!a+gpwCWckU~D}!r+OlGA}mQ}-;D_9Sf6q-Ai-KW}_uGE99%Mu0M zUIy*>0MCEKZ;UWv97G82n2+)dCv9_mhZX(nxwK7nm;sgDT+g1M1j9v5xvUFy3Waxwg4Z~jQX zNz-OdJ<%|ue^u?wY$F_?-M5rFhcg6gVa@Oz!w{l7kv|+7zY&=I!F}7(^((a6AA`_92;G+o?OL_TO;$ z!65$3WDc}MsQ4O$e{+dxiS9ZXzQZ-^u@m&&=x+ltzTEusq9RXTV39x%2+;h9$;CS( zc*Ywnm_^BD%4X*>g>~|o{oY}5X zwivu;6+(k62CG2>u5vL;wF}S(kJTl3*ff*hv=LBhm~^!N{QB?Erhr%WZ&Kdwr5b6p zxJ(}EG7F-IlZr>Y0?wM*z#sRv%h*lT2*7UoJPYei#5Rr(x)b1Uz*#yEnbv{!n{4Kd zKc*nQs$~^L2gU@Fmv?c#TB;czjTLyQB%}}bJjHyC?*Z;z?|Y>#*wWXSG26X12Y35z zAxi7x(;-RvMQ)#?#U)usx_mFxLIcc0c@5GJnMV`4_)hs?rNaC+y6Tct<;YnXiAnaN z{2!)pzm{ey{BIbre|1Uzp+Wu|suO>SPjq(4)w6a!U15B)U;d=i$#t@!zPRUk)$I8M ziNW9-kpp)bXN2XL-alJ$qDs!s{{9$x3;y<%*Ce99+B|W??kGvoMt8)o?|&1eoLnDD zFsd$Sz^GpVpIwp}vG6L`zJawt(XS1f-K8 zl2zn;#)CYbUcZ<8fqu_*>cnXEFNmQSlQfEY3TD0O~vDlUhqZTHxG5+5=8KG0;f z*d2TOm#YAuB6yCQ{ed6hq|VymxL0H`KJbr89N@o{tI z(y+U3_~noZ zL5k*7N1v}+%+b=SPmbmX0FF>~nh#$m_@2@Q;Ajw8l866KBI|#W({14ZQ^_&^-l{EK zJe$1+A8M3eK5dY}|YmO8e8vpUo(5k0Admq{|fc$lEX>r$VCwe(Qc~g$eIpnaLQa(7|!~;o3 zlHez0bjeR*g0;o)wZh=p?c$1_qc&z3|GprGHVrljj3wB%@=#z?li@F{{Y&47x;PiH z!r5=M$?1<&wiAdw%^WmCgbLjw=CA;Df7POHT1sQJeY9)Mf(S0h@a(-${s7z`vZxzQ zpA&R^fYURosJ%}F?AzN%l@QnIcV!436C!K7ig;61jATvq&U}1L08WP&GIV;R4w@?n zz?D!qQ)(`LPnt{&Q#YCH^}QIuvc{1vkL6u{_71B5%ys|Eny*B_IE}i3-w)toQPCTS zQMJw3P_b7eW^67PQMnUCJfx6=IqVJSOZ^qB6_@cl{MB3<%gu&14e3S%tQVv1vi*ui zq0Y9?E!|hK68KG|WtogyNI}gb_93P-k|@DwXmn{VOITSwzhf49NQ46D@aL0qVP^)> zjcgz)7$ueVKf@pTKezh--3t4CPfNj7JY46LG-wdR@-={5e6qJ%WblqpQhBvaLEb1p zP36r~2)*vh5=GE8tW?wRX*RCHNw` zuZU9P`BYb)sP?+G01bCn`#}--LN1>KBT7cq=bk+2sPN~7dX;@0OOwbN&Nef=&ZB<>Q6BM;T&(+r;){PPl0o=tJpa^hn{^pF+nB$+JxpFdO&S{G}|YpvtCrA z8iP%?p~bjE*DrtFYp~Axu}A})j8%RQ3$&01J6ed#?d}a84m~j-SJhxDL}lS%2tg*z zTzcfzg(UaIt;>f9+#y?f?>@ja5Eo@%C=}LU7poP{9Ayd;9?fp?%`RWPDTV>R5B#rv z2JZsb$UkTvWr(5%7p1DleUrpE0AhGO^*xcBlRzmi6;s76e0dOj!$|$50rT4}V;NWJ zwH?GpwXAMRn-G3?laN|+$wH$o&T4L-O2mVMx`0NEj`c)xIYYXn?YqZkS5#WM+5?;XS9%{o4X71M**VSN5f-_&EtVdABG+#<~@H?or`%>&3x0qyb^3j(K} z^Mo73k>lMxub@Ip04M2|j%bV{n&_T1<4#YlPCax|PK=7=kj4oI{H1d6fpZZPH64$~cSrW_R7^#MyU!WMalJiI;k&iZ5PSDYW#d&gMl-pAEdsFv9>zWYuq{YoR3z^9l&6@;Y54n61!@ zosQ-f7yYDHddWBb!hHST+^xRP%>Y+VHHnj=m><_D-&i{edOP25foK0xUbQBCSJUZX zV~F0D(-4re#6Ff}40H2;m7BgFcO|XA*RpRa!f4m;{-e?PBSQ{PxXb{?0VdOQvt-32ecoGNGJXQA>P2@0g_@fE(^A_qe3q-T z2jqMgyb$eWkc!KSC;R1|fMno;q83h+=`3^mk}DP!bd0&^$9i>}QHv)cZ+b%VXb`E8 zG=6%m9@$=1{T9E{8BRA6T|RAa+kl|By2IHWBwJ=y@+G#9xl5+T)jgs1jHYFWl1q)s zGK}z5P+JmuXfxS?1=kYRn2$c*co*=-DV~{Apy5DaR;c9rL>W?Ti}u$%hedC#6LBI? zuf*;@a?;Tb6hpNrI}Jr5Ns|Ss*5+OhI%`At+FfQ9nTlGcHWST@JTHq-wpGp)TvO~M z%sR*3_|r%fN8Uhrs^gnOXSmlo@Vsw#Zng%jrOL^a8VW1*t0r8y&m_pQUQOfMYPlD4 zEn*X|$Uq1_$vTVoRTFPP%%S1-=MR)gX36yUqkj{^h5tkww6Onz)!qHs0q&Z* z9_F7cDq3_Uy5Nzs!O#b$yh&e$4tFb_I#tgqP?Pt*p{DG)PjvcL@rc&vIP|rBw(%nCUm~6Rruu272bcYrB*^ouu@qXH`U&5SxvQ*t#l0-6(TfBiaJvxS2 z#%*2lrUnaw(>KFc7+0LrU|}0McMGdWP3Q0DM6chlK$$lwovRk@etAOQ4+P>a5;d>F zOlDmP>Tzugq@^a{^nNTokiP^&n#hY}QJGx#~WSVoo`qd8FkTFxzN1IqzlB!=M8+0_7b`bXPJCdj7! zy=~<`Fz^HC$nU62;vi3T?kv{n$=w(7E@w%iN~X1z_uHCa7eSHI%bP4`-orx%Kd>>L zMCbmxBQ`gBS0ri7+ohZ~$zb4jMtD#V{!qO7TtiNF?oFQfCuP_}@!lvMHr6d1_)290 z;3Qh_Fh6eshLf|E7gVEZS#_j#D{(&u=#HQ36pai{TNuWf={KV#{?i;a@CFojamo_P z*x4fmMsqxXMC$5sr`ih`qOM5_lkKLH0c8vDg9ZiB=j+oxcGV?Vj$gqZuCDTt7O_AU z5|tF)2HC#Er6W6%$0)){%YlFtR<9m6GUsGzGjTy&=xmb>Q+ei+;|2RwJ0jzzu;dy1 z>u9%;8p1EN#BSyT4WgB~igC}ckfN&sDDIBDjO=Yp@@oBs$lc;#27_rY zK%Gn!6Z^S2?O4)bY2^jI8{yWyjt!m#V;6owosR88~f=h9ff7)ptO= zGs`QPOMh!WbZM`Z<%_j+gTrPz1~b?1blZgy`ah@H*k5=fZYiO2DhSzkwNVahBJ-F{971+` zIjYyAp%VP5*NZAz_6x>Wf#J({>--;s4^+G{ZyI2fLUu_$%3shZw8av|ciqm)KZFo@ z$=`<8y)=n{@S*xakL4d0Y8t3MW9iYBy&K&BM8xuM$hrNRMLXo6YnceLX){OZ_sMrm zi1H&Fi7YgOTDEr*z;Oj6Kj$`!IXxTs7-GL{h(ekt(Mj&S0$*A3R-Avx!Q2*VCKN-c z>`@^Rs65g_J?mKUXkzz#+xTePa?Du)zKTKiv6wLcHf`V4zG2voGpA~;NV4m?qRXM_ z=@P(OjKN@Xw2n~pW!VJ4avHz=Qonh7kA0}W{0^7fdUvjBT*$JfV z+@m%-GgF^xUT>uezxK%5%5o-Cx&UeYWLKuk(SD4_}Bm+x3iIVJ5deFw01Ro!-UGIeB+w++x96Dc^s{yk1kty-oL&E(2*o0 z4`m{RLNSjpp7*t2W+hbSWFO#=u}-fp4bZ$Mcg-pT{;eo)L$@LY1xhR;iF<>$0Iw^! zu_ws-jE#>Kic~uSgTIm_7pZI`2Rh87m`byZpp``oJS{Lvm1@o0v|8x!9S+vZUlUr9^ybuuz22|up|SG&5Iu*I51gWdT&*r1{~>UFY|PHSr$PryGtDrF-Ve3P zb;oQV8tTgQWj69wXR{=05#vQKkSBleR|^Cw|16O5-)mVBNb&_!(YGoPbo7VH&^v+mD7(4*O2S_XMZ@LEa2fE0A<1rLmFF1WXk zW{!WIWA^TF63#j4?P)}LP^B^ikk=!2cD*{gclr{##0a4gC>)gH!mbXNW$c|kbVnUB zsU_n>*g!CN{>f7~s?fXAu4r_*&Z^F5179y}v=D5;Lt|@%lh3#@z0`kk0X>M->3*lu z1wWsJ`P~krU*$;PYd12LKt0tgj(T_(A{2>9$3Km6-&{9wnmBv!Ff}_x-Ka}go>Qhi zz~5&T{1Pw;hO7oUk4wf+5i5826c20zO+L-nz@T!fb5P}bDVXf}G2KF&S@nlyXaVTI zsVvdb8eFUXoyb?~jkqM8KJsVQ{<}*|^ACtS;2#NS&1k)!(ohbgpGIJ~y9jyMt}HQG zEkH@R=Cs2KEl1w!0fy2!ks&y%1|cW`kbFjkqbF1K!E^N_@H?}7m;~eb_x2O{O()C| zj9&^_lC|(kf^~^Z{;8y?%m2v7)_U&XP2lLnZhoLq*&2p=+(t=^2{V4aWC%D!=^eSq+NYN`Vbuui=*j$qwXk7;2qhp>FH97v%N zzRB^~i@6(jt9VDmu?F>LZy_e5j0Y6yv3@3vh@RIH1+fV1QTK^9F11eL#l!XM&o)?H z6gQg>FLwsfcLIpMD|tc@piQtJ=1{^dAKJTMw;yYlDA90+esCunpGnjVFdiQ&)0aHjCT6R{3z61 zf3(bL72~?3;S7E-MLfJMIJk*(b1YPib=EYiu-E6VwOd=;%Tp48lkvrME3TAjcg&Xz&Agwzx9{MnsMmv z2vrV)qa-QKI-?sI#wW<-`8;_i|O^qyrk7!Fvqa z{Q511E*HeqPefqvhz>FZQfDu1o_d87xb`F#j~-|;7IpDck_zGYyURrl%jx)ZU`g)m zs?}mK!@eVogD)fjK3XqFqD)2oj50@nk>gYg4r;ZZtB`6%@(IT-a$18O-}pv6)fWI^ zh^8GiyNfJ@qq?6<_G`NM>g?HHWIVs6YtW(p11?m+F`0wvJ7)3Xt}nk%uDmF2FL}FK zrrFd@#2Y(I3un~%u>$u$R2uYpnDsK#hSJ+(CADGH*0FHvoE5X%7 z?ITCi*LkZg(1TSZD`eguuL*}~(JHa0)mVV5P6n-eDU*w(-?1S)0u^rxdmzubqv5nr zP%@a+YOLB-C!0V(bj+yZgC;%c5j*TbFXYf&4vNGR1jctG_8HV`xsTcHt(xA?UP-g4LJy(qisxNTmZWkdgM0LM+H#^rrzRd8 z?|-i*sws6wfkL;=YyH^~prB#|iJlcD4wYcP2`yeO9dc5m#ma^jgWLY<+lkR9S67ew z_Ke6~(NB;+A*J#%5}rYVpV+jMG$ZBdXUb zCfa~#)nFK2z63#?6OMZc%KBp zj4GejIX|WrwH@TWe3|l7Jq=RmBtY)b-XQ_As^iO4**hR}ShDGssbq-kejdtk%D6dy z5y2Jkr}ZuH0TlRa8W{OI1T{I)=gqqNv}`m-%uYI8p3woSOsECfWz^q8V`7BzoXoIu zE)%bozE!g378K#E|W(@(SD%1 zrn-~g+Cn-U?S}J10{T|Nl82vimMM0G_g%+A-RB6PbyrQQ59xehM8tN)&r2(5?Z7^{ zN6iIGn>?&PlpkZFmimWebDq$&*>h+yc+z}6H3sW8Wc+w|#?{LBp)bT))gv{iNVERz zrny~jN5)w_``%qw6VJUMVX^wI@Awd~m>5bZc%+tUjfxH9=d85rVTfu#|D-8n@t~n8 zT}zQ74ocAmJ%e_8ssa+#G#KpFIrtr$>qohDw6UjQgmb~(T>@FAz7P^|A^yQ&Plvj0()mP}^!OWWU$eMBxH$Zfr1X5f4r z`-tCFzjJr#2f^0KbaVGe`(R|2$=DLSB;nZZqDXn`b&u3o>B_&J6EzgSEx81-7J(K2 zTwFy_3--J`oaL+G*O?_&V*Db=E#)0{*pS}tV-v{`^_wyjT#u7HY>Owr3aC(s>8d?Z z2(QW+QJAkh;$qJ3sz(IUjXsR4nJtBg+`v;x&EWE9K{qq*$^!w~*-Dezju@bEqQFaX z7qLBHHfh!l`Ix`{5<&NzWmb%lhmdQfrjmJOra;ZY2BruHVhur}?pUtsW^ZD$IN~^_pTqOICM+`K?C9yMAc%`D=}~D_iK1 zhaMJS6n$o%6!P!^bFX-0EwNp9&+hN$owR;b>K98-Tj^>nO-siTXQq;cK~=7PW}Ow# zP-zn8+wt|ND_Dt{^j=@*0XAa&Be`}E@hV%X=H$&O^^g35m%dR_1M)fjncd<8ZyhXo zPqB4I3iK>tW5<4fqPyA&kn0K)+Yn&X{hUu?4u7c=N@GzcJu=0zJgt9nTH)jrT?qno z8w)cHLemB{b-ngYgpwKhexa{yOf+X6MS@n{TU042{Dp+-GY(&O{I7PbziBrAKuN#! zXLIDAas9uk&6kQ>H1&SymD^GfqQ9Rfx3$EaOS`R&b_j^XI9)qiA9v+PkO%3m9NxxM zezwoQS3Rz;;#u~G{zaUONmV#5!m&&IivU<|zF)-Ob9Om?+ku1-^E}zuMi2P{jNhS? z_aOTTNN!Zl>9=H$P&(^r>9VPl*-Y8XkS=g|GTF`f>ZxbYX4^OlX|CfesWC!dV&QkQ z=R#<0IJ8YkX*B*GI~!Q-Eh`v6$m<=vTi`Q`Y7q)4BHgz|`eNlu))lskN<8u_5>zZ8 zd9PmHL~1*~8 zWJ0;nXE(Ywn`QFYIAC1@<8>t9XgDU_xwL^TkfeEdHKvs`U1&FCYUf$bnQtxY4yp{L zeZ03W4vXU{RB_&*S6P8~*aIJ%F@Mn0d|!Qoq{x3(5i5M?%h0fa_n&T2Uf@>C-v-Gp z)p|7`<;*ZEn>k8&i@1m;lWqg$OS7;FpsNjre%cP<-e;GYB(8QYM1Mk)B?^`Zt7 z4V`$aJjVCV++xs~i=LAto+HX8r(Go?gNONlI19l)Hh>dHI<8hS8lp}jBWpWM`m3+V;s9yY= z5ToB!y9<>C@`Nwi3p+E^Zvu#V0{j6Mv3aGCYHCZhw>?Z7DWq6g7=m>N)_KxAN#%mD zPL3b+NK;<^?bDHlnNAGBtav?_OXMQ!`5`_nO4b;@}2OTOF&1!(0No za&njm=^Q%ij-SVC?t-X z@j3_IceBpgGnYTx_4YKlF1o+Qz3bAzS2(4~q{s27!v(hc;H=Tz+%}J||L29G3j_MU zReJLV!`{O;=u|8r-rQ2N$i27T&_><^O~5a<@N#xQhZ~br;z8+j@voO3QR>%#m0pUP z%)v7dvg_d^we%eCp`vqdWM#vfOih*EnZ(UL5Es3f+5(7WyOEF9Kw(^Y-Vi21{aMw_uHsj zR{W*oEVYY~9F2KjFIp!BN=?aHgoe1Nylqz4y(Zpm*!jzK-CQO=0#%uZuwO4!%e*?DUB(_Q&+q4|b}d&6(TRn07|XiSN~?MU z@+y7<_?l+5Buu*BQ!~PyEi2)aDbwfW^`gTWb@DGiXvT?$?MeLOo>HYbW{LXcLU7zr% zp!&4(TZ|=7H-@c0AXguMgQ5UkZ79zO>7JzXAk?tFC|bmyIa7=`0F5nkWb7Kgv<0NMo|`h}6!)+xDDSw*L`N=vWA*+4FLuxF$<-RD^u4C< zW&=Xhv74|K2X#yoH+R1}UJm-XF!xG%eB!&`OzL}0PR*!|4^Oty+Cu=_iVeonn;>-# zweI9aFpM{NEJeE9bs*WY*C|H~xjv-&kkQWw`120xXb{juwT^&9Kd zWeAN}*zM!ob#Ye@D?^s$#LDxuRW-9`!gI2>4ga)Vbn{N#=9EIl26!n8*fJv$&gm!o z8RI&tQ5Lxo`}ru76Ldg`vQYH#9fY2jk^l~#Uh`oRVsA;!^97gPM2^%cJ;v5;QmUqz zE`W0GVaF83lV;th;~><4Hv+vJZy20S#CbkRR*zT8(7YnpiHKovRqk8?gDtCWZT)0f z{-F&SLHJqSP@U@4p9Hfj-u?{a8G@R8K|8ip;qgd#o>K$c$>x-k69X}HKBWcNYH9A&a!MCO<@Qf13CgI&%ZLQhSg)z1+@W+jh{fW z1>mM__m^d|tP%?5O(Kds;|M4~_scIQ;)zFXWLBF?mb|&`1DuJR$-_jD+tO~> z4H7o4>b{yjB9m&OAoLOCxZ&lJaIp!L@@QimeQlgj5^4(3k23$J?o#9y18zbb@08vH zL=zjU+DkfH&k7DFC9x1DXGmrrEz3=HEV5X0077^Xu*iERlU=vdkUvykuYs&OSX-V@ zd2nS+Lkb)4#4wioGR{y!GM{0HyR$Q+^db zTL3N_#Uu9}HQ@DDklj5$!pAqeGhPJf|9Ncg1c|qLaYmuTh`fn5IF7(0vM$Da%++B9 zn*qwtsoV~w%a`CsaLYhbT00Hoko;HQ)U>Q9p2m_3#Bz&@X05q;V4IA#m_Pm+ih#Z9 ztP5*Ja%tI9dCr6dUf3~(ZVJ!LF=oN?5XWt8C>JpBW=J~BSkv-}@G>}D1-`i_u$_)2 z!50*2C+%NBVLW`*i0O<$jxg6ZBK0P#IF2Ze&3n0LS^8^5OtAEoqCuAB_-OK-#ClFW zzdL0}Hw= z%<=wg00}Dd6@7+R_0E*Wti=xbYw)e^?4_cHke5H^yz{5Dx`7#_p1nK?#Lz_^!RxUb z!$_kygSS7gNh^zLLN&M^y#H=6to6&5lVB97P3zVU`#6Y(Ne|@JYtqEv0oD1oELQ4< z`A(t(FOdJRoAI9pk%h(|=iT+cSiYBM_bo{b+VVi&82v)d=tghN;#hg>eU=)agY`93 zKU)$mv)J7H$do?^^}N3YmL0vjBl!aom<;3<Y~5B9N8 zMJqC6{ALS1rpZ-7{-WZ*Z=z2=pe!oyY#?(dxFTZ)CuU47Ue!&oI*r?Q!WR{55zX}X zi&{A4GZ;_Hs0AarY+voy0b0s2p1d~1fEY&Q1-8|uC*ivR`lG|29?74y!r>cBDVpxV z_r}cX$tDUUOB^1?JHtXgQ2+_M?LM=P&_2D|g5!@Y=2nW*FW^e+#QEQ&R6GLTz5ikJ zxJ0XKL$Pq0?jmrTOIAOdNeB?aBnrCx%a1syhAN*{4P2mm^sm_x z0@}oIt98hIwc`GrR%L4~HCQ8eYs9JzoR_M~P|i~`9&ll4yJMk7)!K+*gAE3htAwW0 z<{Cb_3XsA)nT0V4QgY@^26UCxO@u<_69=>NwpRU&+{1*MkH3Z^(Kf-@?KJaM$ahkXSP-5a)_M8(4l)9HQN8d6pa!jYEY#nDV=rcgGlWarT z4c3^Gxf4cWT^h`)bUdJx0CEcRQd?e%u*}r5+MQxxiqJ2O6Z!=;=K`FLY#mh)Ac5EH z_y1Cfe>f2z$1ZDtalNV`k;a zSG$D}2Y-}SesO`KGih24YHNTxqnJ?uNMC)ZQ-b#z8k&x8nF*EkOYeNO2iN^OApjyI zoB(M>Fjuqm)TMgZ_Yc%ywyGXh%V|0}n9LM5Uwhehb&BGb+u}uozVtJ8{a;hj=|YaR|P$^ch~SkJ#zd@mo^u$?ERYZE{GrJ$bk`Z+ zSU&&Khfp@xIjiyaGxd*t<%QCx?{Np=<}4L6V5VrDY zZyVHgtNx*)6HIFpo6D0*VIjL+du<*W+5{g(5&^kc;L?I)X7~I;8Q9c^vPhgXp@eB@ zV*FM%ZEiYF3*FS{g#FZw30|J)feu7$j`h@RBo?>#_*^mujVts+4&dU9a&2ZJawlM2 zxY8Q{N|ho3+S;=*2!Ap$B|`q)*j&2URu!jUfYQkrn{zVj+W$rUsz9LDoR54m;4D@` z1lI-K+h@%S>-RaN9~^942X);^)hzFr{_*Xydhvk@G;cpMt$cbKe}5s#0x?kZsl3jc z+BdgfgF-16OW+3hhno)UA@~RzZC|(tO@hv-y|`H*b?jvcza&pV+l#&8sMdwXP`Ydm-3_5hNnxGMPsT#TXF%H>!+seFAl?EDZ-- z=sEg;N$h@u=T$|9c7_)<{!U)*I2NDht77x?s=omdT#k!I(^y}58$gl$>hmve*xWH3 zYLA%y7ivx+WFn)scJynM2Qw-{(rfPhkB|$n)K2{4g#72KE%+P%GB~d^LrU_!Ue>v} zKJFJ8BtDYcK?7 z;E%cK%dC>CI(%3LrOZ65hJX5E0uwqGx}j#5yd)8(`dH;y|J*0cg8QMlM_a8q|Wxy zD<14rt5(HqdRI$>ndptECCKH`!uiP2k)!JRuJGW#`*}e8sfL5aD0GLJL747K+!5Ed zrph!EpMgTvwVqGfTuD}QE>@`Mo>~J|>3!LVLjG`B*wwxTw@jZq! z!4Wz(APLk+DxySvY}6NX`kEBHW<_^2U3GMYIf)6A>k>ehEHdAkRPC$l1kIg(e{Vq_$#@r+=H<)~&;uaLfDzUT1-t zbR%b%j@rHsC9%GxQ2n746^pR+K8T31n&3%LXhXZvMi`|xX}mTy4Nj?yRzp< z#`H}5qkr=>h@Af3NB+<5DK(iC%)Ih@a4O5J`9wNw2q3$^_}_VOHRso(d91ll5alPA zNn4c4aMfo0ypWXgR}v&3IKCEPUB8Wbpd6+@F_Smq`!Y4)jy9#qeb8-& zLX-wiRnPB-R?gV+2=WEzSbTJ{VXWEG!Py%Gwnr=Oh-NoxP}o^L4u!`e`ZI{S`swd@ zk9DmJD8T9ZL5qMvsz#tm?`Mb}{$2k`@FRRI>K-G6l(cD$nT$+rO+dj)v5 zFE(&eRq4d>S!y*g`%ruXHVD@jw0`_%qkXMCI3?o8JG6oLZsXT=TeBWxWLW|A{2qCt za0YR-JGw0E>LPA~lxnm;Vb{qlrV(_NVupSR19mpz9_K6H%Q}Y1lx)U94|0?dZh7~qTFi3^%3*UQ>(h$ zde0f9^D&KJzRiO0zgafKe%CxwGS~rZ_>I5!bp01?sK4{J!9(Mr88Xu0*H5GQdvp-I z8)m4-kjPY?_<`Im=EoBH`@8CT&DRW-JH{j@f%!oM+!E2nairZ-X+=!Gy~@*1BSyKP zS&Qm(O5VM1ly>@PPR;0fhVthjpIAE;UDL8>mtTXB{_Z(>KX9?SN}ex>?wMZV4|_Ee z9Qus}TS^M7%KSWMPjITA&<$wYl9`m4IFC13`1DIBDJ?VY#;sPNg;OgD=`$Uo^Fx>S z*E>F&{ARFycUHMM9{9`y2L*h4+nFppFu}CD&g!yxt&byPf((|f$0+KGpPIuG89xn5 z>;iGk&nV5s!vU}_BKGu3vs=yLw%MnWwY<5z$H&UbyP9TcR z%2<7%Esm>%y~N&%gvc<-`-`~X5?v$g_KQS9z^H>rwHgVxjMEnJLnbpn<4xZ?men*T z5IxX?_3q`X57MGzQfn^Cf=P!Js5(_62Mp?s-iQ~;C`}Jkp16z^GA;H@9{~-gstnS$ zO4PFn0OXT|^Cijh^Y={ifwe&EIu&c*9%bpWkxvHfjM#_b)8> z2A2Kt&Ukk6?{H+Wf&RA*j$eAruJJxwRJ6mBPbipIileFUeazg}={I(bm7f&$q>=hQ z5o-=XEERco3&dw56~ElttDN;&bkp@DsPaYWwNh%PzGl^v+9r?90*B3F-8~&? zA=E1t(LiH;bg2gcq@Cii*{M%N-YYt52q--#3#|tidUe%8?#AREKd8<6TszKRRoFzINn7TPsH(}p4ssH#FExlp7G!}mei zgNI9Di%3wG6{NsXmfxWxjla^z_Mgk|*@@DkS%hfx_XdBv@|`6miUJ zWYVl-!*T44#=vBnMhc~!G`%)U_lL5Ug2=U9R!iK!V2+xnnSYOsoCSprmud?nTY?h* zs&m)~m&W~Y795I&P2bu7>|OA`5?2@CSy{N(+A^#J`NoUWLd6TG!$Wq2xG#?K&e`R(wi=%jp)2i9rNTIDz4 zP{XH~I`C%1GFc^6ppps{vu$LEm2bqCpKSQ7aeQO{%YNeMhc2zK}Os(R6v2A12#n&j!xb?~JE4)y)@PZfwgENz}C;Qp0#ikugI zmBtV;!tpZWvR##8aKq~Vh3c*E$jkHRi+j~U`!|EL0~l*C!(5IY8QJ50b&%sEInyFq zw>&p(yfY!+TZ3v)Hr6{mooQmR&kKVMD#1B(mQ2k~otaqQRWkRQo6-2bA07j?*#s-29}d3Hjf4#QcUVgGpS7a1@9ptz}C#NEi#dSV59~I_sHTLt5@yl|HGS%9|l>(QTeqD3$LtK>O{t zaevrPTB3*}Fdx|Flr}9sbc7!g(zZ>xiMWrgW}Zq84hiocdgn(;wKJf?AmhK)`#ra6VY=BR`aC%K~U)}ib>SC0%y*R0b z-A!EX2}N?Jr%SIufaVqOo5QM%}$%kE+>t zA{07LW|Dt_EN!@A{Zaw^zc!}1Xkv^xuyJy}_uaQbP{)dW zui6&yo4UsN6XR5Rl4q_j+F=p3eYu9>&K9QDukB%K;!O~uV|P)cJ&WihPL-KrUQ0;6 z=y;s~QNCWhW)vo$4j(m%Xiu=oneRxd*6JTsAkF#@Fv_g@Cy`Sf4;kk*3_M@`jHx|u zfUYQdMJo0Je~(zhFIkhuiN`SNsX$EWcw3_Xh$kU_b_;s*&2#7-#Uc9OenZ6gHF&`%HQaYe=wCBksZyDWiER09f4pDM1|H`mc{5 z{w0;cKYZSQjY}`h_}|zDvRCEz<-r0s>3>wzjL%H(RL)*C5}PV#+HMm=F6!c&UCfSF zF1hwH6M(LPt#}Qv6-R|>Ydw>o_|srJt~F%iR{ZW|bt}Po%jCmAi3UJxU?F9&4eSd^ zOvVnx7w%Mu(;7*tiY|0GuQkL;yO6|+_GAM`l!D*m2`D~HZiGAP4zx@&%)pT$7cBsk zRL3tnG?Rer(RzL}Y!8$A-r?2i-awBT|A$oC`_fsxYPm%wrHc8$+-aktJ07GsS#8e? zbOf;zkO-&4k_8;?$}+|Vw(szRhm&Pze8U{gL|UND;ae%us%npy-Y+*81C=>@0pa;5;V}YNA5}gN{*e`Or z6h3trG`f!MlF^INjgA**2U)PI{Qsv8h4lSav*iz0=A6EAJLh0HMDJC*Th50g1M{+N zz)lr;XMflFANArQ4i9r5#&M4)Z-L(xEuN_vQ=0iuK@t?b=a@d=VCDA@T^XXaFge(B zvW(It0{qqUD~<=mr6PErQ3tu=nkp;j1M=zM%aco2sd_M*S@YeHGKZaF4cVto8IjqA zbq%WvfL)5+YJ0V-Ha&(2;F0RCPHzMa8OZs7sr@c+``U482$+OzO?A|x16by31xkf*&quoDt{x> zwoXfol~-e>V5(-n?Fh_SYb4A+l4W5zD+PSe%NB%(lAY_t>@(FS5u+e?-By#}8eHvF z&RP9)1V+g{EWGzNim* zRUc?w`>nIS%Uwse)_)?(uFU$V`Dbo_rbS9wyV_BA;}p#(iKBHF8gz(kZ<3T$8tilU zM((a}bluXa{74S^8VsUioE>^A zl;khI=Md3vPG8kYMIEDM2_t;y6kuif5*C%^jTD8#n4fkU6zmH zfZuD`<6Mscn$cqDir#X?TaweTN$1|zWf;m_o)6& zwC~+i2}g}qNiQE#)j6U2je#2&II0ezaw4`^#hUX*Wm20ocL>Ffv zta@f+?+hV3nszxs);NJ7hm>3tA3C>G;3{bjaK^-5Eg4;)=mEWL%^z`qe}={ovS9p6 zyj)qgQPcRF|NpV&y1q3z0RK?VU_GOPj3KF%Kw}ZrpCkr3(HXq9wDQ`VcLOV;<>hi}#w;M5)H!JN1H`a%Yv>*fb-ZQlukU4u&8M7vl;>UZY(u156SzfUNX7aq( zEPHPYmN`AwE>3!yDe!Z<_EdVh3y>M5{sQo-U@X4@#5Yh;P*5rh6llW9lS~Rz0@}-j zMwTq&g_i~{G%yB~voJ5tT`(ri#iZD`1EO{9>-DAx`*AA;Gs4e?m2NRUz z`b* zhfK?{(0ALaQ_DvQB*E;c{|cD~13)q(6B{_frTD&j(J|w1;l2YM*Q3+Q5fY9j(Ide< zXaYiEZb?0AMm$vW5l<@v<72J9P{nAczQ~ZbX>^|%Iv*Mv(F!n)AgvUk5V2SBr^0AO zvn2U0F7$Sg79!+h_r|qd_+3NBs)Qy7k%m<%!qgg$ydldtD>3qh!G|7wJi~YO!g_B3 zG%O306-*l4)vc9HlDoI%|BLnLUvJ01f8+nsR8#r4{#Y1(U*l+jIfAx=7or=8ty8mHy)|g@N024t8Hww!(MEEO^SPdSV6+qR(Z#FHZk~Fa=X(?%@@?&xBfz|8CT;t z({<`ablUh3VT|z@>GL57edj=YEE;4%s*v$W0z8BIg5&| zsrSLBCQnn(ZBHcnD5ET{M1`AzC z1O!x+lF&kniiijjQK^Qo6%myZ5a}fpC6tgz4N^i0BtYl^LP_~nbhqa@&-phx#}DIl3ddl6}3$01h+W{1aOl z^h-0*X9;u|{@0ki!n-vsH)~9;1ul84wrupKyZneYm(`c9ISuw#B9LWr=vE={u6IlV zdz-M8EWm}un%34e>>8_>JjS#o16Q@`?Y=W!N&`m=czNY}QhE=#Oz6E<|1RM(6(3Th z2-vXwo=<38eTL?}SL8`Y17IK{RgO3~wv!h)!`m{sy0&s#6zNtSWYgI@SUHphKJ5OE zgWr!?!QBb=bTw3#zRP$wtViOhUiw#G{#WKd9bo{u;Qz_D4qQGzYDf~`@}M0npetq+ zZV^YU;he+=Wh7-+{PtNG00pb#XDW|4RnkbSUoDp-#vfNdfWh~hHMq*fK59i4tr=Pj ztO+&DgKBHMy}YQkZx38oY37R_K}*5B;Ro&l_B>3^&h*5J&vpHo;%<{$d<<&BF#5z_(!^t4 zRP&hSyeLshOE<1iH`-D${+yHtUwLW`^3lt6s7QiC42>DaD{TItqbTnZ$uIeV_@=#en1l3Mh+3q!i4i;mqE^xYRD9dDjx*r4FqA}FQwI=t{I z)yO?tS3`~qryZsbOv_3`%o@@u)o;7R0%h&q2d#X1(Pjafx0jmY73&5Yz(2;nws20O zf&^!rL2u>0q)7;{iV>Nfne!8BPOrEM;y}}cVxw z#NN|z|9T^16Az1Fmwp*#beX&_R2m)OY7zq0>0o=j^Uuch$0ne4DTuuNue5RW&PDkd zbJ51Y&h>BGs{cC!DyzvRhqEIzRMYeHmByfEX!J z!_s#i50MOW>m5;>n^CP}uT!Ro_6M@%_|GjHiR%6tWpNkc#OX}k9fon^9-Yw~6V<#Q z9xpDezPwzcju;t6{kRjHORO7`uP2a8$!C z6YwKPjN6<7R9)KX4cE#a?|O^qH%RyC2BNc!wg!UkEzixd$If2Rk_;%kcd!$nKO#@x z($ew<_hcT?8es&l#cGxt!%3NRM!7~d6UcQtY)qA$}TCEQ;!+e z+(o$Ekd5m(k`bf|v>ld>FW7++EoXqMR6f=PWchsW1`BAt zz)AV4e5?@DPiF_X!Zpz&Z+?9E?ss4V^aCH^A5nY`(7hyEgyI;h^u)|ZAKjQm z*|D8t5+0>mpOF0h)(A`#AXUPyTNTrt+ZT1?I3YL^OWMPL(2u@o;0rvYubJ4Z+~~=Y zXT2U&1BcCrc|FFu{Ru3S+k*2(kVi^GPPn4hr#3+$^40%$n)vW+!uJ(oJ}qx-!@rr*zFCphr&of&RY7_)^Rrb^bJ)Wo7!5| zYwzNQhAN+dffmTmalj;NkyCUESh;Dck3OpS%{ThPs5G{xYjfBTm* zxXhLg{hQ%0vMu|6i0%0yVC)swcXv{at&tVKKA)@DSNQCaH2JLC;2?BIFr?_)*};cv zwUd!HXZPwJIxR~-#?|_Bo*+65?6mMQ`|#9G!|l1rRsOVsR3* zYJ@TYm8C5^YJBemx09=RlZe8tXQ*OxJkOU}CLjrXkW|I6p=t$s%vx%Pb6V>UL|&uF zB=avGneXm}igF++tA%jO((@211Xsw0B6LZ4{^=<@$sBBoAR{i;(1Y|wfgXgR!t_=b7i0sP0s(ClbpQnp|v|H;*Z{HIIQGd28*Gqb|ZVXuyPtr%~e^+ zy2+$m^ajzM68KGB4O^V+1W7H66827bogGos`jNrX*-2*E(mb?mPRv@!jaB@;6l!_vAHT${m)>+L%nr7S{D_M@Ie3VwOl zMc)ACb(sPj8d?+oI52+K8UUSW;)k7gA|9M9NP`s1)*Q&w0VY8+OEn-fvnXwJ=(}IDK?`<>lNcs}AI|t@8hHkI*h&KJGT^ar zhtI>P!#`%|AB+YY9n2Yz{J*>2pQI&G+k4CHdfv|fLNH!y2O0l|SV6#mZ1?vDrw-T) z-EslN5m8l@FuLkZ_F<)b@rj}P{8LzQ_iecx#AD&&2iB3abp=U@k<-JRk>(lLGcsouC6~wCLJl7n7FsR z4y$|Fuk7F>uC7;UWk8@^Z<~+tz}mesApN^)*?cVR`au-#T`T1fKX2d+yoVCyPxaa{ zx+k(`#bmPL0Lb)a7|+pQ)F0{YA^_~ax*hxvHK6~(T$!+NCD0Y&ejzckl{yj^jyja| znNY-?9?Kd05YJjYQ$p1R;G|`4Wi6UoEv9zm0eX$&N3>P_FVgcjAYW6}qr;HF3Y4|3 zl8e9itdF>G!>s)4gwi`_yxO)WV>!QD4au;c^G}^QqWq$-a7B4E_h-IS(^+~^VY}qF zrC)syKU0m(YoE~(xwmk6jI~n_*dR7w8CAaZT?~ysR!Z@b0_{Uvk)@E%JD7n$Ff#b% zkj=>A`x@@O3;?OsW3_u_>YC9pWw%=sUvfh81W?*2COF+zUeiD5HL5PX^n}fz+q0fE z@756rmNhd=TCA5w2VCy5l&fn1>8MdIz95am3O|bw7O=!TDqo>T2+}@!vE$?;Y1!2~ zYCe$j7^N?v1BZ2CtwwBi$YF>yU98G;z;9AMy4vKLE^M1y-^U`# z^2N=MQ~)cU`nFa~4PvpB651(SRXTI{s`i5y9NYb|1xiG?-|U*kjslAoc?K2QlD z`7sBsV9_ZE`FA)^$AR_L31z^NrG=rD_23^%7!PO^r!*)cZYVm(5*^VrX>jokCg@%5 zwnbUD!5BzuACQOs8hW1D)YCBaWdVH#PYPzbobaokzH`7O3+ztS?h2p`hfg*Dd{1gy zR&I*<LqB-Gv=w92MPQ! z;Gg^cGJp=k)`q@G5IJ^)520Mad#+Ym74AP83R<{82VLs1vlPj-pt zM+q;0IHk?B1wJI#j&N!Bq$;b1tsXZ2*0v=o)q{67KT4r z)J9`wDedRb>?#|K;PxDhXr3j}hx;M?kt|BFQ-c9b@zRp3h6a`8OfL@J8~vl;e!?k( z4G-k2>KR>;oFl)7Dc68F+DJUeDWLEOUuDuzvPY|0$t|0Y zzwVVI+2%qGhrq3)6&z&p2a@7D(=k~qLQZp^aqybbtPb~bcX(t z5oD^3oF!6#aD7sw`T@FTZCad8)C;*E?zt|oG|#@relrwN^sr1 zJDPD7*rB2X*P1FN`1KTP_0Q)(t#KX{mnKP%Ub4!r9mk3ZRt4I|D@7?fE!{)Q`Cp_n z_FT%QbY<8LmVSBXFNaL))Y(xqJ9K}SxGta|LqUSmyGH2jzC+o+zyWi7Hjo@xeMXhV zx;11j%AJYH^(vuQL$}@>vTPoH8%jl8&~u+wp|H#g3T8^O=i%i;tv8cnb_tI`i1!I( z@8z3@1FbjRhg`wHf(MFs71i&8a6mawb^j2Hg=fQ0;R;SJc}EzA6fCT)cOl z%5g$lL{)F7U|qg#jFIo3+vBF0o~`utsT>}lExEYGoQFxPR)?Kj%a*Qn5viDI2Gn#I z^}UCPjvL!tYMcU7(oDE0gnb0{B+Bmkqn<|d=-$y;A`*)YyX{Zt1#~h05=`<>fcIYn zLDoznyMD*!9wjK42QSRh;e@mfh*;qEDRgTDG9*cPzllw>p0r zGO+*&r89-9AYA#wkt|D3NS389_?m8KW4!uZBfzX|YFjQz_7M5Ut1Z5=v&FWK?i6_~ zlqd+UekRG$6g!&K%P4P-Wx01Q4$ocXFQt3)Ewbk&k!N#!6tsE_6W#rnm#!g*1zAFN zMj5_e zU5PI@aNih>g=TdxQ4_bnD(XIZHr2%e=? zo{E}da!mH!8N*U|6P`j)c{9!S9UNagPU&P9iI*R`rNHqob0`sak-+3A$-@S8O_gal zpKP3>K)?j~J|=C8PRtm&>KLQ~;ftO$)=@%Wg+E9#xrQrQ@OxQ_bKAesw(dja)ZH2> zCT}4OjQJ3*@2d;O7?{gQ1FEhjysM=!e8vmteu$nX6@d&phb!osmz){DQ;$Fbp;^X^ zUy4H*uv6I$Fch;cSChe(&97d{;C1#UU>hJ3vnv2z_1JxI8|Z-C>vT_OoANi%o&qgU zRGN5}jQ&IAGeO&bW*=kSu>Fp>GuEiC>EYsB|2x_VSs(0BS+IZj-~K;`*;up)BdYYu zKRhqnK37X2*sx_q?p}?CU&7)vtQr_P-Ho9V zOcz^QV0H|G+A=d4#QvRxOox(WiZ7#UkJm3}5Ot;Mu@B$1uHp|HbJ%Ua_dxt4d z2Q4iPA9^RhDRf>^#=AMEo3 zEV%=7)a@U}P>A+oBmPlo)rHK+=}xMdBbDFCsojksOpZ?fKucua9d(pBYQ4#~vatU% zo;0(j#f`aZ@)uN406HjB_C>vG(F%q!_33gOpBLRw zFC>Yu6XRWDXL-29*Ita#k{DDhZO5YTQ1q==Kl`270;Ib(dV+>YTJ;sGYtBbRkK zh<3@%*7%x{i{O=ip&_EskIQl%>~(Y3tQilKD3f)77FV`5yzZRV0e^|mrQdrRLiGyn z;aP$m^X(y*oOw7LRm5m+Gw7|mP2|=X1ICiR?fcI&s?*;Iv;+#HeqjEx;N84!2IZw< z-;q+u+Q3KpZ)W^YqCA75!C0mLu#Vx`ee^2Je*{1$Map9y=Le_#hirjg#x@#_0F?LC zTDJJH9a9UOY2dL_;UAnGmV-K^+juShvU@Deii*{4=cFHXl)GRU5Nzcr>Or=?s|6X? zTz4P~I#N@}Br~*X_SO)pbjzZrAFMxC7dAni(X?F~u&G+up`UWp(p+I<7#iOs5F)N6 ziI+$0-Lh)E&2anV4Lh7SJl1EAp4!BKN9~N4+N{|A+kgOdvCbpW(pPx}^pF@@ z6{3v}G4Krhl|Zo~I?%IfC1Sldj8mppCoXUTWDK0L5U8xW))ow=~@fWOzsW45}z{xPHwzNm9A-QwldG6s?7nQu?0zyO@(m!S>U&7o6 zk&y!9Em5=l9|j95A_S&9r39Pzk5IJ|+EQzPb-FhWfA}A5FWxM@ZuW!6kQ)9yW9Xs$ z4O~LB4rOZCUTlTJJn?B~w6_AcK~`m-XTYHB1TN$*Mg@d;3@j}k0704peTTE1C>r_( zyzYtY@`lFGVncWX8LhmzjUe$&EqtI9{NF^gL2w7TKRTk}=tDu;=Dc4%} z{Iq46VQ@QRymO(H+}VI04}MK6;M?8dn)!ws>v6HpUT6I#i(rT7h*(+Q2HBG3P5OGU zdy?6Zo$li01DE<+`?symndQ4{b@ zuspzDSO*{?N0!%#DpGN);!tC(qs!ruZF#cmv{k7u3bTVApz)XRu15xVYxDLoCG=)? zee(JJ7^Wv!jJsAqe{w-Rd)@-%HL6CMA=)C1gtojSJdkyw!C572MTy#%*W% zYQtd*uS1+oMxjktA4!$+)Z3t33xyKmS4-ZUjZ_rB)n|osaG%Nis~gz4U_hk45vEWNlpt9T6*JOflG+?v%Dm?l!-T1SVy*INW4-I$M7IjwhTZdz zDFtAyzKX8r{wxwb6Vo!-XB*PUzg3tpF&Otk>i62}O$X|LmFMy!RqOtTxWh09T((YP z9%EW(5)+`ORSOwS_JZLTsv(5h?fW)0eUVq0CkgfsD!==nrH3hlcbMK&wVq}>2>a)e z=PBQzI5B)8DtzS%4`o$K!Dh=(&lj~A>9GKL89dDTc)N>@v&>!@XPAAttGvdq{G|Kd z?)rcPmD?dUyCYEtnDHu}_RDKH(AQ9!f7#BE7)DPT(@(I6eLu!@*l_GadrDw_$@zc- z8kw8ka+9k&ko#D{nM0X;VuFUMq1B~^Ys(ls7v+b^98_xu-L5DIIkxvn((P@xhgNVn zHKYskiz&xoN$Hzss8k$3u0wj^Chu}RLHlq*>9Z6EiXKH7b^4ZqHH#m~$~6?kptb4h zgBv1vu+k6O-q?nrzW$?szNDXa-&{Klzx8rYTp5XJTTW*y+AN3M;*b?KxjwhRRI zX4?(EE;V9`O*TV6iO&VsA1^ICP27R3TUg%SZxYi# zz;x|bhIs~OBPTfeT2b2ex6uXMS9EE|sBMaC3>=_YFJHe{dEApca=glKS4DOH-90X; zU020642|i@CSeJUy7ZdlI9|Y`4!HR>Z;J@R`Ci{%>%Y$+(XhikcjGTe1wb^e)|m_u z_u$3E=0D5uC-q>$QSGn83RD_5%z~|Jkk?+~dMXn}*Y}u}uBm<~msk;tR82duTj9F3 zr?M(jw`Ej6QtFl81FZA-5Y#08O?cE-xfz_rz`zGJ_+SUZQ}`_TMsSj<-131Ti{Pld z2wWO(TR}B$Ii^c$2f7Kp>V+F&NY)6Uu+JhDB7YaRrJc;6UWgBFk0~9Vg;_73bIG%6 zfb}&ZZaZfN%D24*kt3Y?aZ_CCQ#%zO{oZ4bNEE zwM2s~@V|;3J${E)j`3U(vz$DvMG9`P?#1N!)$r}dxI2xGkd_fDx^BYdlD!$Ix(>nt z6lQnGKzs^G?)iAri6OuHU*?_cewjc*BTMauTJ4H_2SZ!dHat+ZuER-Q(Dnkgt$&y~ zGEIUy%}mJkNCh~L?;$ZPaDxLU8bai-+?`>J{T^fA);St`4f#POrk1u!KC6?{lq4Y> zJ0%U665?l(JWn(}0N=9GseAHJj|u;H*-O-DAP#g4@_I!i>qO(xvBD|DUy@eOr9t?7 zmxzS$&*KJE%ui}T59x1+E~@1!NZ4)n^uL|y`yp%mHSf4r3hI+6tXrvg5Q8n<-g6f*>wB5dHv*DcZpSHZkL*in9b)c zt`zeTOCK$4i*sp9b5Vk~!F&QxK+|RtZ5ASELUqY+y)c#!sMm`FXU~M)~A(H)a4{u&-}%`cf*3swH z8ZJzz7ZNtQId(fN}T6_w{zAKvF?yUz*^&b(ZS znLI^_R6r%)!A7Me$Vh75a);0r-;I;`KuBjLeMw^oHw&*#$m7&^f0F0cFGl7b#=LQ- z`(pk8-u$opu@P|U{}CJW^C0r#+6-AW{9E6nXKeZrq!azyJ!dTHlevJrt!r?r^e#B1 z-rHb2;G1EEL&F-+S`d5E=E>*>*y}ji=4!)F^EaG#6o_Y0x~p(11D^V(vycYkD5;Rn z4EdX<)qCK`o7#KFi`a5itw|MiKB2gG!=I7CNwQ;)wAa*Zxa0&lTwxHr*u>M?%)q^? zr{7tuX@YFJ(T+aDl5DdHj?vj%>#}*pg5HO7EQ3R?YD2yQn4FUx=Dj8vg|h^^tSvsq zu#)H7*@$d8tF|nfyXS>CHyb^=P@=7NZdpf%X49ZlV5sOtCv|sLrw3|&dPeIo@Az%d z2{b7OA-R->4J=td8b%;0|IJ!c~KnHyzlB4$W*2 zsxIz3Z&Amu*$}4w2&@cXt6A31K3D zLb$s3Bqfn&+9!rj-9F}?&c zTSU`UCZky{zz!8~n*Kc325Qse*s<$ROGr37HQ+mD?|p7>u)@Ja!P%+_v40<(>l^D@BdhEvqr#izOnzEJ z7tTLhz7ddkY5zQlAzc)I_DdHH={qGoYlM+rIIU_8VfB@jE7PBdcd7U#>e$u3 zsPx{gs4RkN;SScW2Z&Of^A?AabY8u>;KHY&pV&;gD>9e(MPHB=i9iS-mc-R6h&Aku z^6TYR^ENF@fB{H{NB2-pw^5f(yr{mUoF?ch1kk!3~NI3{kil-pl=8ISBu^zL;<6%AY=*v)^R)fEGV> z=DY;-M0SYhzH=1&0jji&%9SCxeV3FkN(s#Iur;bL68%sXDuPaXWpZDv)R(mW#9Q3wtd-EyW4W5kH;D-NEu{(Keak`)^mZ z&biIo>?>CKZLX8YgT9hBq+Zzcbo#-KK*jeg;|$WV?}hK5DIH|uRU@n4GC&1nPA5^Q zI$R8R+2AyqeHMvk3BgN)$v+rJQRPYw2pkseBv8)5^0gE0qg*5Ml3-+4BtJ%{Q!9;| z7BvCJbGXYG?PU>WN#+!0hm2{!_0r>0*)ICtmNg2X6vWfmzvzdB1%|$^>+WAbEhm&# zmRC)$EYs8f4!;rntBy-y?eGCWSa1x>FPvCF$LqjN54h_a$ebh3S;`JCm`!9?>?LSz ziBDff11CPzW|Zo-f*@=h84KTX1bxcJ|87eAo+ zo}i2$HVBvx?Kg%p6IcJntK49=0Mj*9X^iVtp6cz59YU^p>5Q|#;y|N%d}%W9vud}j z%7tEp0;4nGK)IVQrSg;dS0A4-DlWw+wJg@SCb&V?PABVz@*<)z4tG)Jg1qIrE8`&v zD)DWy-*)ldY_GbFj<0Qxc8p0xm(*GYZI`_B8Rs2qJaX=sTJG(+;uGgsmLf$lc>SL` zXIcdN2I;NG?dAtJk^z6gy%^@e>ibRdj6;Bs<*GI5Y+!g+_F$w`9~*rPY{uR=OypGQ zW-z-RsXiQ;=isrh?{j{6HU6dP=w5(39M-@V%oUanl~!5Y>XzJYICGb@y~-k1l&A9VT1(hTq{%#{ z`VU)5W(&uy;mENx9Muo$zgBUPo%g6^DHuguwW3xaQ>kv?=6ne^)MRM`5&=TQ0xQxg zT;!Jf6Ibh&Dugpur`>`(>rHLMdWa3Ik{YY1Ebd#KM%FW47bp}b9gvAadO;gma_rw^ zCySa(d#xe*OE9m-;qs~@l9KoqLv0sBhRzW-+~<)f*K+no&vftl+ke0Kc)jVi|52;( zUq|9uL{^Liy$XHIv+CODidzz;zr-y?Ft_Bp>rf7j*e7e2T}tSGjADhKTrOA1KsCDH zRIF}gLB5^0eRlEU6G1RB*JrF3R0G}QYCt^zPhda56LP`bhM7L->6?2>q)P9)#~67B zKwck2LP(ruXUqd%o4Sv&1v2S(bv9iuIvG#4_7B)Doo}j1mC}ogTX%nn<+NmsexLVT zOny*e-Qafk*VTcx?526)^F^b!53axG^N9c~=_6)naP+kZTY&7$ve27<1-{cNZ(eNS z82XCq?zr1!m=Rm|U?yJ*a>B~*tMYRShl}C+4+XB#|4Q&yV@@b)n#Gf(`}s!(2Sdj% zYq`j?Sh8v^rEvD*R?cGId_}7xYi4O-drv5P&M(kb!JX}iu6wOjF4<+i@T6M#Q6##g zB6FEg#oy(_Lf6EN^!p)fN-&Lfth?(#`|#)lEN4 zolOhnrz6uw;&bR73c7>u?^cVUA!$;(U+Qp!f3y-$GLo>C1&q0avWT*=j2+Y~Bjw9k zpG4RPq5_PrX2p}`>3NZ}8#Ag}ASbHLv51EueBF`S35atXq;inG)Ru-%J zFa}vpu_9}k4phx=V4_d5P?=|N#NXSWqDq6kT+J-q?sQk~GVnMEvQ_Mep*S&%JZKY) zQo#4y(%~;`E~48KVIYa#|BZdh_B(H9epCcivQAI2l6U?)VeC+OfO%cogwwpa{0Fp}n~tl=>+&5E(?sA6P36#`3A zNuqdG;b2)9-yMr)2!;+i!tjot3!8ILD*(>)uujf2Z16B?B32I7-QBdlFBeml#VU0Gxk#lKIUOLo$&WV@y^E^v0bL`knVye_2>c|)DmfjM9#rolcrt_27w z0Kj6sPFYRjlj@%d27J4f(JkufxbmtY9b$cLEE1~G@Hk0iwJ%~$;D2hY;tN)ZabWT0l# z0Xqd`!k#L>d+m8xuqD0z#Rkid2H6yyN7aGin9C)&mZm4+c9~E?>BA4PrZc}~ZmB^x zjbJ{_zW}3Ks%`lqW6eVGtf063s{0zj>CAojdHC6@Zg2X)FC+3z5 z6DomcdrGuQ_Y20xZ%cyQnhy5^B*EI>Tg<6;2F6&(UP73}L6Z3Xd;}7DaYgZD)=+EG z>!gI@1D|{GMtbTYOD2<7D@+x9<@d|ROh`_OCg6VqasSsN z&fnFiGa-q=;m!^+zPvGFg`fFCBoa5Qp5iGuj6-wI7DQ~g;_ahr9@;52S-YrFLGsBl z7^g~Mb&aFCNa5!g1}5YxaHS;3+m352av}3B6Ix*o3U;i*fh%LCl*N-k!3;WFUtQC4 z&EtE3ce=ZDkxDzg-m}UaG(xIA9pa79i#OQhXLnSvHHA43^Y;|#7xhz#ByN? zDKwan-sLmEk+Q=G&KOc&Ybn&)4s}II^|=;#y>uAw4k<1>W?5bizh96&aHU+{KZut` z!us>jU>CIbX+Q*imV-{%kG`Bl8iK)Y>AxS3CoFv`U*)bp?|Q3b_);111Qy+wWm`xY z5!|%~*!2`xi*3#(Mn}-eE0-_###v052FS_9mSja-AHQ^qFhm~y9m!0OQa#HW2OF}6 z#YoPGnx0u_9nJeUna?c(WAdDeTz4v|v74N?I-?;muVkYlWWGU`C8p!3zc)(kSG1j{ z(}az>!T2|Eiv0Vo4{iyLu(PCIweJ%r^iI7SZ<#+#YFSEfEOR1Z?lg2^lS1d1QDyO{ z<`P-1Zu#huV}P`T(L-St2!G=KY~98M2b3sO{$JpS{7mCd>a|7nl3lINFrX|2M| zlQ^88x&1fv?A@-F75BLk75#`aV)Y@MHA+oUI+q>bE{fI{%?5CA&B5^Wz+SFbz>(ZY zm7Sh=kW3L+!&sBmS}<;RM{H_g4P1MAq$8&niG^(A4C{qy#?+?AWSmD2`cMcu5y#-W zBUQ}81Gnkl9K6$Uvx9~Kq((u+txKf2U-`>t(o zGV}YSFN2GiIWN_hiZt2Pxp;)xzEfj>pZ5}B&tH5E1F}=uP14pF0ax=$rG+{g=$L9mao5Lzn{5)9Nb*9wDBV4qP*Hexk*V5E}-P=Fo{h1 zklB1H+8W}*)EQ(}0#%glxLuv&BM6VU`RqSHWLw7`ZD`#*_Bv?)dSKo`jel*b_FR;pXu0WRRo8Za8P`_1X zaB$a+4P$kB45W81o;Y%?E5CmZ^LrCIB2Skv=Q=6qHOp+rybEFbcI8*g_4#4$`QZ7% z$AX1mUQcA*GSVm3blW)a1(B-OZ5-<{ee`QFC4(<98S!(h{{4?4m1dPzeMp0iuJ9`RGM-MRnY*i7VNC;METc{{#l&al;Zyw^uf?kbDqAB}C=1MIizcH57+&CUum4dcxz7b0O2%LYzkRBfR;u}$tgne=)FKrM1h zuj{=L?Q8Fiz8r7e{2P;Bg)OUiZCiP%&&hf%C&bU2=}*N08*QpK+Sk5@?RWPaUXU7FQ7nU1{2r1P{1g}sXdGaq=gDGC0f70lME15i zL+M9J!IhTa9W<%qeY_h>(QDY(a;IlPFm?RTHIS%BNt$!&7X|aqz72o)_xJx-4NcpP z#1D$Uha1C9&gxyqR4fbPG)>+|M`9p$tUkYir-K$zkvf)NPNkU83%K^dk30t~UO8dT zFgHB$7Ibl|p$Q9K*}tr~WSBTz`YW-wgOF#d!@U~O1Y>!>7He$XXdjoPax;AX;c2*6 zl6VdA{Zn2r@r4|P z{Y*~kk4~lKGA~3v>1ldu2yADv<;=r5{)wcOa${YwJ?_KHFWfcfEh#r^m&?W1#TeHJ zJiLgt8Jwez#56KLY?CZH~(PgMy$7x^o9<4{QB^So2hQXHw%v>NoV{POPAx8 z=o?9h8^JwMat&AI^3yrn-GB32ZnajMXzGEz|AQ?v+?6-lE7U0skIArF3SuFainIFp zw&lcjdhgsahRt~$j~JAO)$X!bUp?Q+Qsx=KEp6-SS7&W`^aL_sAZNM0dis0*^hW!+ zX?Y$0h`czI0lbZ21J-d*#$9Ttm-?H^A8$t&2@j_jy_)0yCe2~LjeL~~xC0&PGe=7< zIgbmbpBP2&{;a`%o=v&1X*+)WHR7~BN7mGY(5D{u^2E^b#U&dl=D2@6R-?a9eO%f( z$;H-3Orm`)tRVhc6#p4#yO@Wcyq&}B=hb4mzS(YE-tT5h_dYr&Yp$6Ov-N>K1vm;7 z{SY81jl*gt{sj%w=14=vJJ+T8vPzY|K$9pDcuu^R`(FtH|8ojT6GPetE$-r18;&C5 zWy&aB`Qj$>zxF6R?+ztqQ^qT#UP{Qge8Ra*EyN`&Eyss|7!j!#g+bd04XRV+Wi1=7 z)O!wGO{Q54-iDaTRDi{7Y1rNB?Nuvop1jo|fvRh*j0RMcB!2}tQ>!ZWdC94jeTakZ zcX}PTTdVEMn-Q(+;JYslnv7#@DbuBS-!T=?mF2O?PS8ZoCiz2_>s5!!$n~7P>UWa+ z?8~!U@hWB=u-BX-3ndA(cSUE15HWZzGgLGn(^8uW88w1las;g+oF8#}u#D#N+tL#4 zl_a%oT?*2TQlP==z0McdI`RcV4H-RaOnJT`hOr?6!q$aRZ@#e79||-qGSHm!NTiW` zhs)5ef#F%Cbbs4xGu-8%TewZzCp-&lG0S+5(QnQ{n5)+(h_yUDmS5M@N<-&BYiHYN zSzCWas}c;^js+1>O$5u;%SO(Z&`+nu6m#Y+6iki7dnB{A?CS!+Tk(rvwugEzC&c%b z#LLyJ71@(uyr#T<(X{;-vbS-V>{oV19Wrl3Nt2&q=|iuNCfDw-l(?QMX0mdsT)zij zu#5{*afH1cdrX@P&7@Sm5*UQYViDTgWFJp|PK})VGGDRVB^BcRd5giXzjfxz7jhv4 zttE&ADPg{NDxN{t67vVcF~IkhTzS83pWN*B7k&Om%*sx_^4P_{S__jA(U5x{+#LoZ z^ol1$x;D>S5CMwH~W}C#QySJVU1+ZbRME zU3*~acR9O@p2c6j#RS9{Pt@h)mGV6&%%gBj-c{EwcHp*2eG|X*AwPp(9lMjU%)4Dr zAZGb-5Y=A8aIm%MNaBQje8S;N=_LcIlLLO!ijC+u7@T{6V|H_g@D9fM4 zhjH62;i%B%g4%n0v&MvJl0C6T1iMHkjJ7U<{ZKmj#9#%PWL;+jGqWxsnbdZsTs^i1 zPFpLd>j6`*%jp%TIC**Ox70ig3A&yYTfLGqohPHNX*ktUIhfiVF<;@gaw{j~6~su= z2%mD*&g{|{_6$YrS&nYDiO-5B930zSOTo8(Vf1bdLsdt9f1bDmM78ll^+RM0!yVk| z;U5YTar%mucL+IN77@ajCtR&#F@O4SF=ksefM52%5(fTf6VAVEj2qtrsP|3y*~3a} zR9a8qvbX6niA3G-P0)(oUPK2yV%+mV`H&^L)9OH>kecs*p za8cb66Nlcwug6%!n4TxMDIolVZ$p0DtHxZ>H*zAY>ilXM8ag%RzFel&@0^_sbWu&W zsoEKAY4ei{c~GZu7357;_vE5aJki2-cVxkZeCcKBBo%<&pHZ-4$r@GZCLGq5SNpA^ zfg1;T_XCr81v$@5x80rbOb5^*zr|Q~s+NDd2NXiMpCfe?a)PEZeD2sP(~olqAjL>( zoSSTX&->IOyfMC;By8x^2dE6)A2Zgl-IBAkOiWRu4E`DnhrsGO^*I@3Q;SdEm&T_t zL`UwOCn6RED}hRImXmHLp$sxeSW5`X81ghg=wl19z+%}97qM@0m^jj86LwN;>H!tq zn~iW?yjde4%RYtngB<4ZJ-&_0B|8D{Np4wj1(kMU!b?F`{yJbM?XGJ&F(#>S=?(um z!=5>QFm2+C;~u(CaGx1Yef-`WS5q>h8$5>EW4~=FO4K^x*nw(r}92&d1JtU zQ>xfPg(LBa-12G9=bY8AAl0YOm?p3>WmA=BJpeY7URvLwwFeuOOnQ>Ey0qLup(|l` zD_B$7O>=iZ$38zd*M%R_9K0_MIV>wAd?`~Pb)hFlgoon{8gn|2#>pYnz?Q4_N}@0i z@1^MYQ@Z>I%|NI85Kj3gx(C4Ib5RITgx~@l{$F%GDo+bC+aXJ5GC$Ak`0dmi**(#D zj6lWjaE4J@_&IBR$kZ2QtQ7iQS8nNmo^+(nwb}?W%<8iu^T7+-05W>jHdgKQ-17}r zLJUl{sp@Cdrds~0%j)PYBFQ~L&-zF4cW`#b$#d?eh%FpM(}Sy~PccE*b1L9yth}BQ zlW`l(1h$S60p~o(yX!2C$9kQ~+KBPpgwMVUXZRnx zE&${Ya5HVn7JI}j00m5!&#v^IoZAp%GbdQ$I-3QzBh1oKPr3J*%ccTBo4+u<46~zW z`qVg`%c65Jvw*ZoaZN^$RWr9(G~`mhu7sS=nLk;cRd`Z{RX1-`c0}-j1r^vJ2oI~h z(X}Fy3u4sM1=}z^KKbdP&-*)wh6EDCY*KQ?|3})}$1|b-|NkU8%As>4)X>F|qFmO= z7%Hc9BI=wX#g-_Q3UfIZo61F`>58GDa!MDNix7>uo{QNkWkg1^jaV)GXvW=w*jp8thUCXH`0YV zf>2sA5?7U+QsLOzSp#9e-OZvff+omdE;W&N#qm*28iI8{XU0k``PJ;pd(dDuYvAa7 zD)8zJFcs7Z^!N&|?GbNDFL%ED`uc%__>p+(mE3U<81r<8{Kfn8 z5&S3r(|?wK|L$$s{=CNk>e~#(QP%ljHS2>uy{<96Ty>E)W6gWsc%T37ve9M>KH_|Y zL%LUW8wTS6Tc=TSourUP-eR=J;&+v{@LSz0u7@|g&$>8}cFxu<^izyC{IYPe2w59z zbNCsZxwNcO_B#1APE!u=MeYon5@Jpp!>GmpWOaCFS7Okzef*QXyC9$tFO=8NAIlW|c4o*_`|HkNB@RhX?UTpNmmm<@6=?hluEgV-OF;3hTMov`8kB``m)eFR#F-5zMV5LR!1@^@Pp~o$i#I{I$iW_@= z$oJkO0%6B=bhJOzR`5I3PJM{C;BxF$z9vEUBQ!}S*dwas{_3h1(@@Eq3p9EBV-!TC?BQ| zpjYxyxKxRW&ccjc)^rAEm>8R`7-xi5MF*ZrDA|L?@(Qlxhu;DW_tV8St;E|$x8=1& z*3Mc?>3e+V+at=+A<(y*Sv=oqK<3G+F4|IVoe;s`s6C}RCHfa-W?3o0|bDljIkxH^6epsh6uOK{G0(r5Dw`Oe(hntIy|9FcfYBe#Ox1iQCYFBk7Ox5cr1+& z(!=CGPnD>ZESjp0FRJCoQhOz%3(|38ChD4lsep@0R9bdMrpwf@|5Rz))w}I~WSZCQ zD>L=mG%0hrr*-P*clq7ZgPYIqI+%=l1xzq_sH0InE^Ec5U~8%IofWMr53o8ZspPZ? zTivv^D4fPj3b8ekc>1x@MdU|M=&KQfa?yM@`vWPoe5YKT0N} z+iJ6Q-gm;yU0;u#PGUvlSi6W@%^Iu?_gRHnPFml3WF zl%QIP7rEQDvA+%6!c0ZQ#1Sv{`$$#!qCktNdyE%*j%}ecU;UsqG_2y*3`DviK5vqN z)mZ&*=I-2l4YijB9p_1O2X{u@C*2lW3J}z@c50WI61v8s^sQ2X{z-=HNO6^$F75Y@ z0nF({V=zfPr92kfAFT8_qYo>|EGJ)TkM!)R@2@jN4bO&KggG|8ZV##_(AQuC`YUfL zu_6az_E0UWPa%95L#Mq*=TBiJ$mYd*e=3+Nks)a+Ad{v#4&&4?BiH#82eDac1sy{r zh@)6;cV?ANcB*V=BR$<}ge--2hI3yM%)@|o25WS0VHgvanL z^*GJ=I8WQid2v%Rfr4jJa6kLX?q=E)Cp|D@2qPM;gHx-nFMgkosv6K{<$%@b!fm1{QA9&#iz3x%Net z$9J8`DDPUyHAq@^m9HtsEQ%j7Tc1ebvY%(}f7v}$^Wr0*y~&G{0m81GOKeD*ooLp* zjQmNNA^+r~i~uRlR6NIs776o26?M<5(U^0!vQU=6^zFixiN%b(aV}#^lV7VA*cKgn z_Y;^F0A=<9SJ*Re$c};?@tws7@3plvwGFqc>t;4)V%nz@bsH?5O2v(6KX=d~-C@fMV{UJsqx)(>eR3c0v=li9^H+9xZlX8A*z6eu&rBfCrtc3GB=_dd9zNml=9 zS-Mi>wDsXvx4TuZ4W#pdf&oO6T4Hgh5ByYwr33j;7fWg1qk+TD9V`fq&zT6Mm|q)~ zUGwDdf109hG&(D~KhS-WwHdc~PP!!t*kMIGkIB&VNT!Nw@|?IcClf?TI-)%>_P=a0 z8+jtdR|JCRW(&|}LLx!&V3Nb1Yn;41mWuBjXBy0g#vJXey6A!Go11q{Tj8v(-HKD6 z;ceyD)oPkT)jqv@&~<+AU@T7K!bz$`I}5>qFgx)+MB1L#vYxQ-`!Dtn#>z4{k)m`R z3B>U-O8MNhg4m#V-Hn9i$q+CRWsaTa-6EJx(O=|<4~F1EM89HGA46acCAdpQAuEZd z&W)B%9s_N$JM-x?w?P@dGTjr<%E$ujbr70Y5OLSPZwaWGsqrF$dUuRmV zIU0L3C~}&ZsZ?k7BlDcinZliwDqkAt`~)QYw%Jfg-H-VOA=Xr5x*novVyj4H^ZlEQ zUj;3X+x^~VOA=c5|MeXM{53F3-wBo5@83rDe={%qpUJ%F6As8_$(-aPl>3=TH_buo zG|jdRwxt-nbx)fTIr)$chu(mKQebWc_`rT!AE@t*>U40u(!&P9)M_aCw+#kOA1+g! zKTtIZpG0l^i)7HMK&=&oSIKkyJ9U>bpBRFy(bf^e#3*%Rm1%3FkTdHr^=ftmxq9$Uu(%VO{yCypJXV5`rT^nBo!Lk{FHEFjb$lE-{HuX(rtX?w< zGV{)a4`W)f?l^Vw(5bVWUVQ-F51Jq$sgv{T2-cU)aGm~PprdL0JrIknOP@BI z$du=AcBgp3)_3rl*R=u`WVh* zJvlj7^?I_GB}YpWy$7Rs2{#)t;4osOTi;Lyob)qcPUb@2>u(5U0!^q_djdcH=P!lK zU=|ZKPE#6(`Oa@H7<{OjI0=hfPp&I=VUG*sDWjECeIz}z})0&@mY!+u1p>wJZf2)aUddTKfhsL>3OH!j*Y2%h+Vg~!*YNk_Os-_}j z1a&b6P&oDCbVxR!Y_gX1k6pgeIKQ(--+@y|X5?EJwv7iRnCCcum2#wB42LoCHcrr9 zIFQFkTZKS0oLy8H62aPdWt%Ugsc%rx*!+fCSNQTu=r#vdWG2eCx&U8eCEQn67% zouzTYQtg!WNf_L#-Pp3at%c^IH}W62?u z@$m$;0eGK%r`}vaWL)Zp{Bf8+S#05fbkf+L#3V1dLu{=cUvW0R{HDk8^=k7k#|qA~ z&u^%jAug;IT055mMLF>ETEvg3^3eU4=9@V?Y4)>&{002KD1#0@_BAvK+*^>m+tYTT z@}k1_hUXL8d0Y75RLuf)ZJ=$Hpzg0v{>y(+Z}->sk#D-dkGBWLSA7lu!0qh zWbLFO#0xL838(hj_653uVxbx|2k9uo#YIzE|-6_qyv1yHhk|N zC{Jw#4WB&*oLY#{{fa)#d=H(^P^t3#_M{R$H~d4=Ph9kEn6+EUkCOuicu-~Ss&h5e zz<44?W|j878v2QjB^&jlHuMxsG^Z%nct_)hdbr5Fru#QtOV<<6U0Z*SCb^)#xZ($B z-_#zgk##4^0W9jB%CkHYQZTboV8mY|z5`nCWt<($j-O*~4xE%79ITu)2SJpjUB}Tz zgChsr6NtDIbn-P~Xl-S&tX#Bta4f2b<*(z)rW6U?s5_6ZcL_wCT2-NPiIv9#npAMm z!T#h)nH_UpA#iC)4#6X37nD>w2 z#-RFj%T@NN=8`B13#VRkA_1 z3x)pcLT9Mc%)4Y`_^PXEzZ3kdG`5YYFr{yl&%1ZU(01 zvJKhEzxns+P1o@e#%@N(A8p;FwmM`=1y<5lL`*9sJwYgs6O(*pX{TXnx4_q>)^`}A zSCaW%&mI19wV_kdnVUE17!wPfhhjk_09zSoG34ed>c-E{MJW&d?A3mN&G1oJsX1?* zmMSWnS?;3%5(b{>LQ>=W@6O;O)F8aL^1YS8dp*{HS|obA*j686qnzK`AE zT2{y#TqkdL)J1%sXPe*6z!T0kyL+!!Z*qU%7ZHqq(lVh;SRs9cJab57@v3A4j@rO$-q>D*x4GZ=VtAVl z&52q@8h6q3PqTJe{7f-4GC}S>tD)IYS04!{n+wa&%wk#qok5kO8uHN2=a#lNNBdau z$vbeTh?Dyx0jjpUPp5Id+stxA-q*jM=>em2xpfmV_DeBlus()S*+i_scnsRqQ5O$t zBFgh{lQJ%UB%igetkW3jXI!NxxR*T?(({Fk_=Nmb5hHSkPQA~P z7@t?8HhHv|*dib&-&i=x9`*H1i--bz&3d1`wzv2q!VLyw&at(K_kaqxAis~iL|%v` zb{3M!4EE{R!x%DNw8q`mg$`cr&t81g z($H*Kh4U(IYcbh5IvMmxYeXoZB6Ih9e5#R$p6I$_U6gkzLQ$bI#{=%TkG{x_iLFhU zJgBX?tlDnaZ;wwy*kA)v`QC5RgKX8b9q7{_pERi`L0HX=A0GUGamUu?vink;hr`Z` z$&gpTYMUoKSJ#2wHc})pW2uli8pt|0pNK}k4$Q^ecr(Y1kO*avrjG#j66_>}1jeEZ zn3whU1(phs#bk#a_Dp0<1_8fD&jytk7!7W(O0ra-p#EWC4Q8BZU1w%B#rBc)gIhzS z`o(+0c@}uWYfR?|6>sC^7dl_hTK*QKP^>ssxnBBLDoBh0!b82^fLg&CKqrXiw_jCR zjs%zD`mG~G#E^Z2HbiX5$p*6mx&3>1?zv8F%jm#^?C2bW5oIu^5Nsu@JBBw$F50Qh zqfeZKO|8jip1VOT4mgVmoLxugEgm_Bp)&CaVN2#d)XZGvyjaNX=#!|ZD?ui%cb)q` z)at(YE&k&(vVg0Qj-qxwW&ZMnSesEm(Nv}(@vk$=3Fc8|1?o3JWB@DO6MI1=wvy+(J9=rPdq zs|RHWq$WMeRm}r6YV-OOu zEN6iE8qnE+U-IeIj`f}Qn1MNb3HBt+?iL0^Zz8tN`<_oVxp3K;>w8}408-y5Z`30u zENOXuf!bB;*}%)4Ci}-HL&(zed@T;TdogMZz0LZMRLS~GTVOSzVj;Nh_Z_*QPtS5ld@A8zeKv=v(hYL$W@@(Z zI|66^d@S`m?@p)?v+nD{_%HUD1$pZA|3=XLc1S+=S4gclQ()^6XiV_)&j@33@^3p@ zRUNO`h7e}zH*k{ODdROufhVyuORv@yAE(7{v*9Ek+wSu;(<#I1^9C}+=*LswTG31? zpX^MP>`3&L(V@jFTTNC&0yW+_Si0%jxj-}}C#cmVXK4H)hYX^U!Hv2sUd$uHJv_}M z)#yd0l5`|K42*(rAMLFx#ROvY`9BbgXSIhM)sy-|sGNeGX@&eBnQ$8ollY^^p>g&v zz@y_8b}>2!cdU4&dk44q5vVx&^SaV>A{_F-yr6;zG@-@i{wDD|Djhz#$3}EUgCrcj zE3YHSk|t-nEQIvkm7HaK~U_o>Zb;p37(?zYYosT%uR1@#+*5ADq1Cz}`7v4iWj1`Nga@0Gn)IC1EAPp;WQ0Pm&`|gD3mSeS@YvHM$;*e8dSM>vvAQK~_ z#7-AXd#?M)Tj=Zf_PZybVJj_^tNdUFJ02(JBlmbWA|D>3Y#hgLnpqvvh7??kPBPNO zpl9$#*shZ>f`oW+JFnulGaG%$Vj)u9r0B>@*>ytTwLg;7eYd{^zMLEG=LQ*J6+jN&%K+N@b z=B+$4bKcbLq^(d(K>4s2D|u+$-f}fp1xmvDjrz^{V#yx9lg27JPC{ccGc1mt7g=9e z{{VAdEtF^+aqQ%6W+w+Vg>qHF2b0P}ZS^7!jgZx&P7&#y>WkbH~;Pf{NhRFp8ns(>3q!Lakt=oDcRGjLET#?uUDQg3815Hyuko8 zdahJCa>p&_=?C4-g@rkg$WIvs$tSkcp5Y6yN(%2yb*`0?4!G!T>38T*Hi919Y&rr1 z6D&t8LE9+fhS2&j==ov|3nd&CkJNcU!SjdE=s!5VEtU^2qeE*keiIRA4ng>3c{EV( zwoIB?!#AVE$pg3#Pk{{F*uIo}1+xWluH_M6f#~J7OyP|#e1;JGDbC=lPR^~6xUqSh zSX(+d0F`}5#w5z`suOe!mzzdSDibu(#l`BX>VW#V0l0 zD$JRo2Yf%t6|P1e5?>APaI-p@qjL?dI$1FQa@&z>VM7Nl8{?*oV_Hk|kW)N*hX&pz zvU|Bt-ehImQ-3Rh$(QSDl(QoWKi zI+2nFyvo%K&l#70|H-{qZ;Y7 zSjAL|vBXhL_LqzkS+D&7I5ABmme^CW#+L4Nt$cNpsr;HE3RC!Wz`bG-QLafb>3uiD zQ+q$~6ar=2eqV^K;`(AN38jP);+|vM0w)ojPQ0?Aj$OGP-vwNdnRyn!oE@y(O42mj z&U@cI_l(~+P=of%EnKnN6gnh^po*W)8TsysSQuhQnIY z3*W+IG0vi2T+w*Ct{&=<%8K)-DHic({juPc%m)T*oH8nzTDVZ#BVV%JTM;;q+XgoR z`4FVpNTkgvssusnq?p88FguSxAcOwXl4TX+V$E2_ZzR$=t0Ov+OrA=v|JD&rs-Bn! z!+d(Mwf)0ds9d(guEn2x!ug`SK<)Q?o(g5_lhGa3jIrH@3!-Y<(EV99o64xWIb&%5 z-Uv%UlWtDnA~)LC(odcO-k*g}Yx5 zs1Z95oxeO%z&cEN_a*QBFEqukJgIN3GZ=P%VI+P#3qULe$LsGvp~@Eij;7RADhi$4 zALj`(xQ(-x(_j&zo-s=`^#?6VRuQ1Bj) zj1XDs85nIx_&dZo{k{fn8K8H;(&k{r=88!sA;Y4@R0QEAa3z>o?7|zbp6@1JrE3|j z>Re=)Z|8^I07N|j<8Br2^RONA6M7tOZGEFmXy(@}~3YAR_3|b`JG5x`EU`$rk)eA8= zK+ePtNzy#v*G1p$d)0WTt7`Jbeh61vL7cvmHglIpysINjlVGqI%$WVM5`>+%6bXQJ zuIVa0)t_Fw;h>1!*)>~6TrcLanu*@?7E0E4orzoLHMoOH6XHb4lS=j7_KI#&^_Y|1rL<<^IxGaX)}Gcor`xzV5N>yHFYXtdZ6%()SXh#1Dfi6c`A z3cKv5m(NGXUIviFR*yidL!<+2$aumgdQQ5PKIR@!?w%8ScKCpj&^;{UQTcHSm@Wl< z{SsxLuRk>T_QK%*feP^-wb_657IU=R2bc4&-G>oI5mETwN5@zgTl=%CH(94l-a?Vk zf-A#6a!im=&gj*Y$`I3>UEx#_9{kz!0c^2!;n;HPyGokV9SVdb*(2_=IPF`wr7XN^1)wT+bz z^fqrFRBeY)CH(FuMUfWb+{4OCW@4T=BsYx}#sc#I=qh{0`BeK17AHEU@%@A5;8%`#7!Bz1s*^+7K$x! zR{N-?ysRJ-c}Zr3{TMGfip|;Y0z&LV@mFP=mO&&3@U#F*AuLw`uk|Z5HeV^%3-K4aCX3f=4BZ}vcY+c~n zeVwNJ{07B@+=DzL`kjVsCyY)Z&Vu>&Kbpk4mt zr*NMT@&O_T|LXblewFExVrRce*x`vKN)`gTR`@MNlxHNX0y+2rVdb_ffTx9U2XaIe z9p<{|ENWvd*K#rmsfh6mPA~_TP^_C zm=x5K^MUrc!)(#9!Il)~N02q*@t94dD!Eo482y28C{ng-5hi;FV4L4{Pcno(oV28i zjO+d5v{!4!X`S}q6`teB?&)uREjlXm8(5-sh9P@*Rap~HOF9#J*6N0vP!gM2K zZ*gRRb#n$}m6ml3E3ujH)$})SHV^bT4M=jEypSHlR#-`Bmm(w*@L(*Xu6O2!Pb(zd zpy?`|7UoQ@tnIwM3!BgIC!Xjcc{LXyLx^TJdT@`LFG#+fMstD=j?;O4i49H_wzh4q}b&-*&Vr(9{vFV^o4JcuSgi z+zU*0iAlUJ18CvO@RC@wS9eevNm>`;+{>O_(rA%5jTBosz}Ih`O2cy!@bpOppb7cZr{mE)&0eiH9a zb$Fb_jNLscT`w$$!Uw@VLbCa_kU&mvV5!6y5j^G5<*iOxT!)|t^<QH&ncQp1bspBT&MJc`x-XRKU^qm;$<)m1~Q#-aoZi<$RKHoA)b4F3TT<#Q^ zz=7^#yku^v(BV-Tve{n^9o!S{*{-&4zjV$@C68Lg<{uI&Wp`*W=T40TI>-k7F`^G+%J1uLw zCBtb~tsh+Q?ukMF;K#qA&VP6AvrCWZj8d!Wfh&9K3Y~Wd&&%pJL>Ncdp@ysvyKok5 ztj$ygbSFT8DPqX`*J#-KvXW<;3kqr zdI$2Hu&870&u$~mNUM$Ma%zWmR$za4W|hF-G#0HND?cF45QD9oM=E$%n;c#!Y?r=< z<}nuLAML2)DQvgDZGyk_DzfDM_PX<_jAF~&f}g>`Y_l!$3wt5?A%D*NNQfO82lUUO zSVkE{7okpb#^}@BKcVKPvN=sxIhGT z!fa)nYa{u=kCijkyXRz?1#As=<#Vu1sK z@#_Qcfs;`d+vheCWJd;SKQLL%(wM3#HIhBW5|_G}6z8Z{S0zsD$d3ZnSc)@h@Por} zyQtk0ya?$KSGdd$ddk+#s}Mv(_<}kiu9!GF2ZFa5 zGc!_VA8;BvkQ$3(@)^$GfzUuYqRz<6V3eoKvh-thQ)K7MYVi!c|G zsBdOqxn^fJU*fJ{MnD+0Yq&T-8bFQFPRll4J(bQpeRM$IJGf0w%T*)`oUut+RnG^W zhjYgo_Hj=3SKahiKPLN*-ISqbgzBGHtlOTX)XHRQHoCyOSgIE|b->lzqO$m+Ti|Ki ztfIE@y2@@1q{qq8k&DqrskxR0dFhC5KAYw&50~pz>vOsM<+6+iKAf0KE&pf>{gl(lx{O$fw zDK%x%GJb)h6EOkY6oN2mGjnO<9G2y>kzgDKlxf#7)Xw2dN zP7~`O9)J2(pF9~AV@8%B_rjfURdpEaj%v(~{5;=9#V~d{SnX=H8r^)6j3!cjl+UH( z@M6!9&9B}KW;wQrF592?UltczknY@?J4|^`M%ijRZ9-DavU1WA%B{J~D1a7u4;n@K%r2BQ+=u^aM`=|eZmXrTGhJ!7( z3IkEt+PQ|k9=cMKdhJ0ytou>>$PU+>6;JqOU^{{f?74;Z69BXO@zw5$l&!$vWbHb? zmD6jMJ%&lN5^x|`P5{UhaZfu*qU&SertIK^@2$OjloUW_BP^o1_stcDF1ML|nyO(~ z2M(P0W@%Su)35*!g4y17Fg!F%Dg4!Puc=7CfW zCuAQ$w^(%r?;UKjAy`OS3BNmSAMn0@m8tB%~()M z13q1NE^q$U*sgv#=4UftxJUuRrBTjsq00RxJ-}~Lxcc7IqgOJe(tj;;7rw~v5sRnF zH~nQ!0uk2#mDTZ&{ZwiN8g?!DG?*Kgp49NkePhVZvdDI_mMKSmEY2~)Dw^X$v}f?K z+TG~p@jaS@^Je4SOD(Ev{j9rQZooY+YD+iQ54wTDFypHvX2mb#C9A6ZAM43f%>XyJ z?#XKo%^@Q$GZ+4PnLv<-G`5@>!3YaHT)W6L2EJ`Zzx(c1|xZl_auHS;?u zoWoXxm8)qX*^Fd*P;CZ(z@du}eN6Ys?Y!{ZxGf(vrR&HIVRm$JfNXn&(M(t}urbXP z#_qy)^q&C#`Qwo01u3ILGwFcXVXlYE>03k>GSZ?wNhH~dp1i>FUe#rQTk+#Ab~S*z z7_M87mA61Z-4twM?w@EVbBL z{*VN{_<-#o4d?2<+7`s#zz}Tnp{~F=YbRY=siv*FDliZn3#b9%%!IbRkN+2hu0E`Y zqUXtxp9?S8X5&oxxzN>XzDndpZYOIZGsdwRpirgzj+|~$`NPg`-3_`&P3#Tt%e>G$ z|27>NsDsyizc^I=VTxG(1W{6zo%&v%Usn7emN6Z>OFFw+IKR0MSMpbqP_CT)_lA?N zRPFyk&i!q}NJP;bIXU^X&lS%Ef;BDm&Ei1~%{O3e%q0@F+Sh>^Hl%t^-v|jR4bhIo z<-W4Hl5u}noD?<;7_YKM<}WS2m!QQIEpM=_JC|`+7)zV^;x-Xlg-!$3%Fh;NQdOhlG${kwXKyUj4v`0nss!Aw!zgi<7ofG=qYGv3rgkoy z^}}jiXTwa2j+h&JxLmsRT$r~KSDee5Sl}17=G83Xd-CYx3muha z&?EErfSS6O%}-YQw3y+=QNDD88w!UYHUQsT2ei(GI<-8Bw{uAJ7_rvQlpvBrZ6s|E z8p-P5`-0V%nXXrPBL!~+&2z!nK_+OFC;u zAqA>_?7iTI#DYT~>rw^=dN6)#1_>}iK+UJy)E%!HM7nUgTv6GH*3XYMlVOH>#A#Go zt!xbVn2*!mi1|!fQV++uZ;s=6gSPOVHcZmy z9Bt=a2i>W>g#5BJ;m@qte-j`J^>Otd}L)N=WzOr_2KPZJIE52>WzU8v5q)I4RBX}DrE5%Z}>TJ zpzJOA{AL^K7Y|wnz?w>lNcCTfJr<`GLZwXU+u(>&hYC_vME3Y(w2oQkDRn)lchIli zk6{mUh8Za`!{c(_%~+l|mn2I|~Qn-;t6}ZyN+0 z(L5)wJ-Ee?0;)$V(4YE-VCo8qx6{pBKr3m03e63v*`os|IQ0vW;}R!Mk#Hwjb4UX; zwT~dRc-){Y&E8;y(|LVUy}w9zYB6TEZ+WJ|RDp~y@+kDvstSyi;>g->R)~h@AEjx_ z^O2%;Zs2y^X9-g&v(&Dn z!-~9OrNK?!;(enKs8Bgk|1ZbL`!*AZtILqPzQNY(Uer=d2M8XE4Nu2Z{HzrBDYN@> z;^dMfd^-ExJTKwJX?6{AZ){qclI-ts%=X9!6O?87KFUagYIbj(jECqkyMSqZ zFhJF$S#y%nHWBNM9>;ilOrL+a7CBItA#TFsbzH3oI@6k)>Lt?RKEY7rDcp#=tKKgz zyMf2CsdL7L;$)FaTO+QYS^Q<6Oai8&=b>(gMu6r90LCH2lYXX>B-57$F~4Y{--W+? zMOK{-jd>KaolhI)qLAtO`;?*-qZCdV=P8@)@HO#=Y?F|DZ zi?T!T*+341^HxkdJSdh5(cM>XrB6BqjY|-m9df5V0m%@!m_2+UOgQF38X0{e^Qx->;7BB)Xud)>A z=2qtSTc;dCvHBtV;Tn2Juq1_2yO3MV1LX8cEacVtKo77=82DSWl=SmPyo=X)w*^o> zZqQv;3WK9xt3f1JaT+guA$br!X)nj4VB< zYoja4q|?_#0{KZH2Bx@e*(Gk5-dt5=y*#M{0ro%-GoxUA5Ls_k^~5>s`^rAW`ZBN><9UUs&427y#HugH=gakU32|QUf4Fo1Z!~3~ z+Dd|9Z`3};mp{A?IRa;z=!cCq20$GNT$ruAAhZ5^JSt z8m3jV$2!&%_jmve9E@YcIl=NhGPS5sN>$08V^CUuY2FMBneA9<2g(>MXkJ2Q`%rm- zYY8upP&M>0hi3$r<>?=1;C0p%Yxf(md<;#d=y$~a_7>!Z<;Wg_o)}|ATR0jhbR#Z` zwFz`EWg-~`*2+eS0x4PYjIlGIA166J7$u|U8FkkDG?^DU9#YCWdV5H}F{*t4!WCu=pBp?!q67Hsq*Cw&w){^~1?Ju8E=2GP>=t z5&#HQ$rlD;2M%K;zawF{%06n6s&-Cxk<w5+2+Z!$d2UlGGN4MMLa3Fz9CFws_ zze5PQS#Cz!u4vz>oYzs|D{BkSJ*$nZK->WP7ow!e{H5g8LL1PbzzbeBwn61P76OGpCLrzeOx&Y>>M*?Pm;7aw(#mInyI=nmAX=`**RR$fXAJiyG4ZAz!l zfMsEytEU_1sRpbTo^K9M!|)pYJ+tS+Vv0!s@1;jt+T6=(`#Sf54!!!yNkC0_1C&i^ z98GtHiPa#v8T}sBC0S?B9KY^v^H}STYCFNJ&4{W9_DUprDD6Ym7P8)FqG>2*ze)V? ziuJw@o9(mYLWjyee^XH9D3QiAqTBGOc%?|9R4czA_4Wjy(4kJd8pYX8{U{IF{G_{t z@Od}f36(W$PVPPc_bKG6mCpkr`%@%)5bzree&+&5Bki|odd->1d1Er5l;(~8DhK-i zDSYy-Kg|AXa085ot}${T<=?lDWxM=029WV%5`{lB-*2~VFqi8Y%uT+?Gx+)AnbqAa zuR~c)%~j9UwgjHQ@88S^ng)b=q7k{oD@!H~I=xPN)6Gwp-&Nwax=jNPmJ5m@U(AC} zXNuO6#bB98-(Yz(aR@K9wG(3UU9=wpWU<6qs1nk@N#)W+-nkR_Wj5QD*$-KMuG*0>eK7{WqzZ zrwm=!3+4r(l>oD~P#yh{G&9#nA!I9?%Ov zG2#yQ88ln$T_MNs8(6^|g6d;n{<_P|?QixqjZ$1oa3DuV)j&U{h<{DIo(ex>e}7F9 zud*X#lfy}z#r8hO81u>&aiwxA`WjSUxMNvdedv%;X1b-|`H?z1fz!Qe#xLC5GoH0) zCg@S7Ir23r|I1|mKWX3KApC7n>OXQ07OK$-&A;r-_T1RFB5}8x5g>TPm+orV8I;>w zxfPgmGDjaHRl)?`6v7FASm5bp4IqpQz>*u89ZOw{+8$M@aNeqh8|jF7Kqrzfy3Em` z8O_W%YYwfbh9M*rO{@k;)!5<)0D|*D@D?+ArLgGO5``*1;?z`oOioP4XlrX8zjC-^ zSH+?$u@?0(94hlD#5mLnt-ph{{lIMioyQhBmmo{gy7XQXnrF{w1#l-G3K z#TztnC@eT(Zhpj=3tYZ;`EEKie>u3MWGkV5u|Cl()h&4O^I6ylP-WBj7JSibiV6OT z%Dh;d4|ylJ_2BC6kBA|&{TE1|k&l?M{pE|VOZ!V?zu1<8Y?roaUVUfHvcUr;`%S<{ zqeqc65bH*rm#EBMxyH%-vf$@(y^XCCJ#J{bwnp~yaAojCqbV^l!?qN88T zx(-En9vQMwP#;;F5kgkGHM{`_l1KebN|JP#vA>%vsTdj-aqILB`RNPkGL&WH&Ym9r ziWT-Iz25w-3ILsKv&Vl0x%kidsl11Iv5cS%kY?5MhSKI?$B3aJ4%tvs73y||y|__B zleLtKu@&Uw=LHtsORJY)KFPN;^<6gVMSZ8aw^Vi-edEEMQp`C+lLi}F-(GA&T06kf z>Z7zxJU_lieHxNh85Q!gaqgo_aDl>P$7AP|QT>CSgH2&cz(nA{K3aHkBZ$LY)VKDPnG=ERBSZ*g4D>~Bl0P5aD!gncw>FU+C_a4o?^CXN|ZX3)@?g1W-_>PP+25Ov*W&?w6Dfi;X#;*L6F_7^tE#@=q!Y#d#M z73F2y{h;w_larcO-PPZ#{A0k(nKi&VbdG~Q0<}`}vzNxV13Si>z@ghjYAjV_`FVS0 zZcKEbDk6BZO?W+OA9>x}{16K2z*^b&gRgAXJdRLegbw7!TbS9xm*qiYhUOCzFZr`3 zMrE&e;67r8)-4`H)Qt)BtN>Zi^)xU5r}|NZ|VTF^Q&`16^;(x6THo#X)3N7u_Ir|lMf}4lVH0Kb@;$C zpS?fWj3k8B2G&YZ61Ikizq?`)Z54sXPMH2EgXKE=t#6>@>^sZz0I`A?eKG{6L@ z0p<Iy8-4#2`dbP2%4pXQe=sK;jKZq>I4QRTkSYCk`;n3qBizz0kgN9-ZW> zKfFs?RiLqYbP?j10h}1_%zFv$pO%6YE2oQh)CbnnId3Te%uf5D&vsz*_E_Xy_mrX= zh!BT+Rk};%>SzcEt@>ff(8MOu(=q`Jfd`|=2&BPZHHTg4+Y>p$zt~43kKZNQySS+L z8EMp@|J@s{XLe+;qOZD!??425W&ctl0heS8;=+~pHV6MLuy5xXVLkg4HSeY@9S%>vBf_Kib|up6UJn|5xhhC!OO6>)k z`&V6dapZVDA3yH*`|WnUMP%iBRW`W**+F_l0kIC*cc8%9Fz&Lp1n5kFam4DrFY-xQI$A?YJQ=KbJSo&jX;o~rz?E{Q(R?B>^)Z&Os{e+ zv+kB}VTZf;@P|;#jjw?5q!xE^Ov7i0=L#IxIBZ@eJ`D4v(ne$qCZ+)NDcrn_F;Q}5 zIq)P|J8*a1X?m`=Y4F*pwMBO-MC9}bczTCc_5|q_rthTPZT8iHP_$7a`Z+h=0}?c) zXo3bY77^}jL78irMmQ(7F5mcJ*6#6*$Cn~0(C9Y z7G%uI=QoIkpU+@8q|;gI1|(ooTkhM?a*`nxrG;S1kuNDVRDHN|5U)0X8Tde|l5z(R_!ohRi?vaRkZ}2yAbD>)chP(#?Hma$GoOK66 z3PNebsKaLiVYo+a49=<|u!}%_bK$H z^K@ig0Qt^(Q)B1$uo8h__AOP!FhCSoH9MF3>9ZakNmI@t>o+d7aZ?zho*lGJ^$k{`nQmW#WVBr?k%d- z{aOGlDbb&Fh7f;u61@D ze2*M!ky}vEm2d4rEsmDpjA;64FM+9s&)1{7Ug9QSS?emjHIPQrv^s-o0PyBF2MFyA z#TDeQE*C&F7V`@~{$$BJKMt=DYo>`UYA3?G5MO>A|6Zabn zC@vSWC9g^I1*?I?PWnX_F4aw%2TUX&HCiye<}goKy~ECGm%PtCYOUD73-neFu?-0# zfgfPD?n10GdL4!v#w7r?bqaBKlE;Ff11<3&&A<-?70+yJBUr4AxW*i92C1Fi`4!We zSXpeldKx?o^AlnPM2s1@lfV#HNMxos@9QbD^ohCKUp3j4$Uu6{Sx~6CvZ>QI`ATl9 zc)d4Yo%dba@N=A#ii*`&Ml@~2)IyZud!Exj?QGu1-JN*9_EgYa9ci;!&G$Fm&@{HR=`{?E?%w~H(=B!DdHFE@|;ug2}zaupS{O4PuHBe+(p{GY{} zt5mPe7XWdl%^Fv#Wo+JI&(>qy`Rh!1KSY64xNN;m91p*3E<=E45TV`|DOojX@jW_$9c6n#q|>c{E=kdeSUv1CTHBb6Iz(5m%z zKq9;9VTC_&Er19(YIk_DH^|^5QI4OY43qcu_-c%f$*z>=P=)5jpH}u?29U zjQH6g(uD~RHVe^q(56-=eeh4M=@V* zpy0EB_ayhp`aJi@lQhC$>t1(2l-ZFgyGH1)Q({3*j+=DqsEm1L=}32+xJlkD{UIXt zkIvNJN{VCumG=S&o&V39F7IIZ{Et%AHJfPf4Ò-(CiHVahk^pz`{xgwh=TvTCY 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�P7YGV$Gh2jjy*2tT1RcDR`z&x1(fp56H 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 main.content{ flex:1 1 auto; min-height:0; overflow:hidden; d .iconGallery.personnageGallery{ grid-template-columns:repeat(2, 1fr); gap:10px; max-height:420px; } .personnageThumb{ width:100%; height:100%; object-fit:contain; image-rendering:pixelated; } +/* "🖼️ Modèles" de la "❓ Boîte à quiz" (dialogue ET page, voir + templates/scene_edit.html, screens/rendering/quiz_box_templates.py) — + chaque modèle est un thème complet et autonome (structure/police/ + couleurs propres) : plutôt que reproduire sa structure/CSS en + miniature (fragile, vite désynchronisé d'un vrai thème complet), la + vignette est une vraie capture d'écran du modèle (static/ + quiz-templates/.png, une par modèle). */ +.quizTemplateGrid{ display:grid; grid-template-columns:repeat(2, 1fr); gap:10px; margin-top:6px; } +.quizTemplateTile{ + display:flex; flex-direction:column; gap:6px; padding:6px; background:var(--panel2); + border:2px solid var(--border); border-radius:8px; cursor:pointer; +} +.quizTemplateTile:hover{ border-color:var(--accent); } +.quizTemplateTile.is-selected{ border-color:var(--accent); box-shadow:0 0 0 2px var(--accent) inset; } +.quizTemplateName{ font-size:11.5px; color:var(--text-dim); text-align:center; } +.quizTemplatePreviewImg{ display:block; width:100%; height:170px; overflow:hidden; border-radius:4px; } +.quizTemplatePreviewImg img{ width:100%; height:100%; object-fit:cover; object-position:top; display:block; } + /* "Mes assets" — sous-sections Images/Sons/Vidéos (demande explicite : "voir, utiliser ou supprimer des son, image et vidéo") : une tuile image garde son bouton de pose (clic/glisser-déposer, voir @@ -795,6 +813,27 @@ body.builderBody > main.content{ flex:1 1 auto; min-height:0; overflow:hidden; d } .playScreen .quizBoxWidget{ display:none; } .playScreen .quizBoxWidget.is-active{ display:flex; animation:quizPopIn .3s ease; } +/* Un quiz PLEIN ÉCRAN est déplacé en enfant direct de au premier + affichage (voir forgeEscapeCameraForFullscreen, dialogue-box-controller.js + — ".playScreen.playScene" est transformé/centré, ce qui casserait + position:fixed s'il y restait) : plus dans ".playScreen" ensuite, donc + plus couvert par les deux règles ci-dessus — cette classe reproduit le + même masquage par défaut/affichage sur ".is-active", posée au moment du + déplacement. */ +.quizBoxWidget--detachedForFullscreen{ display:none; } +.quizBoxWidget--detachedForFullscreen.is-active{ display:flex; animation:quizPopIn .3s ease; } +/* Bandeau partagé header + score/minuteur (demande explicite : "le score + doit être à l'intérieur de la boîte à quiz, pas à l'extérieur") — le + score (topbar) vit dans un élément FRÈRE du header (voir le + commentaire d'en-tête de screens/rendering/quiz_box_templates.py, JS + écrase les enfants du header via .textContent), posé ici CÔTE À CÔTE + avec lui dans le MÊME bandeau plutôt qu'empilé au-dessus dans une bande + à part — un seul fond commun (posé sur CE conteneur, jamais sur le + header seul, voir _quiz_header_row_html), pas deux bandes de couleurs + différentes. */ +.quizBoxHeaderRow{ display:flex; align-items:stretch; } +.quizBoxHeaderRow .quizBoxHeader{ flex:1 1 auto; min-width:0; } +.quizBoxHeaderRow .quizBoxTopBar{ width:auto; flex:0 0 auto; } .quizBoxHeader{ padding:8px 12px; font-weight:700; } .quizBoxBody{ padding:10px 12px; flex:1; overflow-y:auto; display:flex; flex-direction:column; gap:10px; } .quizBoxQuestionText{ margin:0; font-weight:600; } @@ -818,12 +857,530 @@ body.builderBody > main.content{ flex:1 1 auto; min-height:0; overflow:hidden; d .quizBoxChoiceBtn.is-wrong{ background:#e0524d !important; border-color:#e0524d !important; animation:quizWrongShake .4s ease; } /* Bouton "Continuer →" (voir forgeQuizBoxAnswer/forgeQuizBoxContinue, RGAA/WCAG 2.2.1) — remplace l'ancienne avancée automatique après un - délai fixe : l'apprenant décide lui-même quand passer à la suite. */ + délai fixe : l'apprenant décide lui-même quand passer à la suite. + TOUJOURS présent dès la question (posé désactivé par forgeShowQuizBox, + activé par forgeQuizBoxAnswer une fois répondu — demande explicite, + comme la maquette manga validée) : ":disabled" générique ici, commun + à TOUS les modèles, quelle que soit leur propre couleur d'action. */ .quizBoxContinueBtn{ margin-top:4px; background:#2f6fed; color:#fff; border:1px solid #2f6fed; border-radius:6px; padding:8px 10px; font:inherit; font-size:13px; font-weight:600; cursor:pointer; } -.quizBoxContinueBtn:hover{ background:#255bc4; } +.quizBoxContinueBtn:hover:not(:disabled){ background:#255bc4; } +.quizBoxContinueBtn:disabled{ opacity:.45; cursor:not-allowed; } + +/* "Plein écran" (demande explicite : quiz RH autonome, voir + screens/rendering/quiz_box_config.py) — la boîte à quiz elle-même + devient la surface plein écran (pas besoin d'un overlay séparé comme + static/js/play/video-overlay.js : son propre fond couvre déjà tout). + z-index 1001 : au-dessus de .forgeVideoOverlay (1000) par précaution, + au cas où une vidéo serait encore visible. Commun à tous les modèles. */ +.quizBoxWidget.is-fullscreen{ + position:fixed !important; inset:0 !important; left:0 !important; top:0 !important; + width:100vw !important; height:100vh !important; + z-index:1001 !important; display:flex !important; flex-direction:column !important; +} +/* Demande explicite : "pas de bordure visible, pas de bord arrondi" en + plein écran — une bordure/un coin arrondi/une ombre portée n'ont plus + de sens une fois que la boîte occupe TOUT l'écran (rien derrière/autour + d'elle à en distinguer), quel que soit le modèle. */ +.quizBoxWidget.is-fullscreen{ + border-radius:0 !important; box-shadow:none !important; border:none !important; +} +/* Bug corrigé : "rien ne s'affiche" — align-items:center/justify-content:center + posés ici auparavant retiraient l'étirement (stretch) par défaut d'un + conteneur flex en colonne, réduisant .quizBoxHeader/.quizBoxBody à la + largeur de LEUR PROPRE contenu au lieu de toute la largeur — dans + certains navigateurs, combiné à .quizBoxBody (lui-même un conteneur + flex en colonne, voir plus haut), ce rétrécissement en cascade + ramenait la zone de texte à une largeur quasi nulle, rendant le + header/la question/les choix invisibles bien qu'ils soient bien posés + dans le DOM avec leur texte. Un simple empilement plein largeur/pleine + hauteur (comportement déjà éprouvé hors plein écran) suffit : pas + besoin de centrer quoi que ce soit, la boîte occupe déjà tout l'écran.*/ +.quizBoxWidget.is-fullscreen .quizBoxBody{ min-height:0; } +/* Éditeur (voir templates/scene_edit.html) : occuper le VIEWPORT du + navigateur (comme au jeu) casserait l'édition — un fond opaque + couvrirait aussi le panneau de propriétés. "Plein écran" occupe ici + tout le CANEVAS (le "monde" de la scène) à la place, posé sur + .canvasElement (voir plus bas, jamais sur .quizBoxWidget lui-même — + déjà forcé à 100%/100% de .canvasElement par .canvasElementInner > + .quizBoxWidget, voir plus haut dans ce fichier) : suffisant pour que + le créateur voie tout de suite l'effet, sans avoir à lancer le jeu. + La "notion de caméra disparaît" (demande explicite) : le cadre "🎥 + Champ de la caméra" est masqué côté serveur dès qu'un quiz plein écran + existe sur l'écran (voir routes/scenes/scene_edit_view.py), puisqu'il + n'a plus aucun sens une fois que ce widget couvre tout, caméra ou pas.*/ +.canvasElement.isQuizFullscreenPreview{ + left:0 !important; top:0 !important; width:100% !important; height:100% !important; z-index:9000 !important; +} +/* Barre score/minuteur — visible SEULEMENT en plein écran (une boîte à + quiz "normale", posée dans le décor, n'a pas besoin d'afficher un + score/minuteur en permanence) : masquée par défaut, quel que soit le + modèle, pour ne rien changer à l'apparence d'un quiz existant. */ +.quizBoxTopBar{ + display:none; width:100%; padding:6px 10px; font-weight:700; font-size:13px; + align-items:center; justify-content:space-between; gap:10px; box-sizing:border-box; +} +.quizBoxWidget.is-fullscreen .quizBoxTopBar{ display:flex; } +.quizBoxTimerDisplay:empty{ display:none; } +.quizBoxTimerDisplay{ + font-variant-numeric:tabular-nums; padding:2px 10px; border-radius:999px; + background:rgba(255,255,255,.15); +} +.quizBoxTimerDisplay.is-urgent{ background:#e0524d; color:#fff; } + +/* ---------- Modèle "Manga" (boîte de dialogue) — voir + screens/rendering/quiz_box_templates.py::render_quiz_box_manga_dialogue, + validé par le créateur via une maquette interactive. Pendant, en + petite carte flottante (JAMAIS plein écran), du modèle "page de quiz" + "Manga" plus bas — réutilise la structure PARTAGÉE des modèles + "boîte" (quizBoxHeaderRow/quizBoxHeader/quizBoxTopBar/quizBoxBody/ + quizBoxQuestionText/quizBoxChoices/quizBoxChoiceBtn/ + quizBoxContinueBtn), seule la décoration change. .quizMangaDialogueFrame + porte la forme/le fond (jamais le conteneur racine, qui doit rester + positionnable/redimensionnable normalement) — même principe que les + anciens modèles "Verre dépoli"/"Néon". Police : Montserrat/Poppins + (déjà auto-hébergées, voir static/vendor/fonts/fonts.css) — jamais + Bangers/Noto Sans JP de la maquette (Google Fonts), même contrainte + SCORM hors-ligne déjà rencontrée pour le modèle "page" "Manga". */ +.quizBoxWidget--mangaDialogue{ + position:relative; background:#151316; border-radius:0 !important; + box-shadow:6px 6px 0 rgba(0,0,0,.4) !important; border:3px solid #000 !important; +} +.quizBoxWidget--mangaDialogue .quizMangaDialogueFrame{ + display:flex; flex-direction:column; flex:1; width:100%; height:100%; overflow:hidden; + font-family:"Poppins", system-ui, sans-serif; color:#f3ead6; background:#151316; +} +.quizBoxWidget--mangaDialogue .quizBoxHeaderRow{ + /* Identité de marque FIXE (rouge), jamais la couleur configurable du + panneau "🎨 Style" (header_bg, posée en style INLINE par + _quiz_header_row_html — !important nécessaire pour la dominer) — + même principe déjà appliqué par l'ancien modèle "Ludique" avant sa + suppression, conforme à la maquette validée. */ + background-color:#d81e3e !important; + clip-path:polygon(0 0, 100% 0, 97% 100%, 0 100%); padding:10px 20px 12px 18px; position:relative; + background-image:radial-gradient(rgba(255,255,255,.16) 1px, transparent 1.4px); background-size:7px 7px; + /* Un `border` classique ne suit pas un clip-path — le liseré noir le + long du bord dentelé (demande explicite : "des bords stylisés" sur + la maquette) vient d'un drop-shadow qui, lui, épouse la silhouette + RÉELLEMENT visible après découpe (contrairement à box-shadow, qui + resterait un simple rectangle). */ + filter:drop-shadow(2px 0 0 #000) drop-shadow(-2px 0 0 #000) drop-shadow(0 2px 0 #000); +} +.quizBoxWidget--mangaDialogue .quizBoxHeader{ + font-family:"Montserrat", sans-serif; font-weight:700; font-style:italic; letter-spacing:.02em; + text-transform:uppercase; font-size:15px; color:#fff2ec; text-shadow:2px 2px 0 #8f0f24; +} +/* "Quête : " devant le nom (JS n'écrit QUE le nom brut de l'objet + déclencheur dans [data-quiz-role="header"], voir forgeShowQuizBox, + dialogue-box-controller.js — contrat partagé par tous les modèles + "boîte") — un ::before CSS pur, jamais touché par ce .textContent, + pour reproduire le "Quête : X" de la maquette validée. */ +.quizBoxWidget--mangaDialogue .quizBoxHeader::before{ content:"Quête : "; } +.quizBoxWidget--mangaDialogue .quizBoxTopBar{ margin-top:6px; } +.quizBoxWidget--mangaDialogue .quizBoxScoreDisplay, +.quizBoxWidget--mangaDialogue .quizBoxTimerDisplay{ background:rgba(0,0,0,.28); color:#fff; border-radius:2px; } +/* Corps CRÈME (papier), comme la maquette — jamais la couleur + configurable du panneau "🎨 Style" (body_bg, posée en style INLINE) : + !important nécessaire pour la dominer, même raison que le bandeau + ci-dessus. padding-bottom réservé pour ne jamais passer SOUS le + bandeau de pied de page toujours visible (voir + .quizMangaDialogueFooterBand plus bas). + Coin dentelé du bas (demande explicite) SANS clip-path ni décor à + part : un `background` (dégradé quasi-plat, juste 3° d'inclinaison, + qui BASCULE net de crème à encre) — deux essais précédents (clip-path + sur .quizBoxBody, puis un décor z-index:-1 séparé) ont chacun rogné + ou fait disparaître le bouton "Continuer →" du moteur partagé + (DESCENDANT de cet élément, positionné en absolute par rapport au + widget) : un clip-path/overflow sur un ANCÊTRE le rogne TOUJOURS, + quel que soit son propre positionnement ; un contexte d'empilement + (position+z-index) posé ici l'emprisonne aussi, l'empêchant de + ressortir au-dessus du bandeau bas. Un simple `background` ne clippe + ni n'empile RIEN — le bouton reste entièrement libre. */ +.quizBoxWidget--mangaDialogue .quizBoxBody{ + /* Fond CRÈME plat (demande explicite : coins bas arrondis) — le + dégradé diagonal précédent aurait rendu l'arrondi invisible : ses + 18% du bas étaient DÉJÀ encre, un coin arrondi encre sur un fond + encre (le bandeau du bas) ne se voit tout simplement pas, aucun + contraste. Coin plat + arrondi net = le seul réglage qui reste + visible. */ + background:#f3ead6 !important; + color:#151316; padding:16px 18px 78px; overflow:visible; + /* Un `border-radius` seul, SANS toucher à overflow (reste visible), + ne clippe RIEN : contrairement à un clip-path ou un + overflow:hidden, il ne rogne le bouton "Continuer →" (descendant + qui doit rester libre de déborder, voir le commentaire au-dessus) + que si overflow est masqué — jamais le cas ici. */ + border-bottom-left-radius:16px; border-bottom-right-radius:16px; +} +.quizBoxWidget--mangaDialogue .quizBoxChoices{ overflow:visible; } +.quizBoxWidget--mangaDialogue .quizBoxQuestionText{ font-family:"Montserrat", sans-serif; font-weight:700; color:#151316; } +.quizBoxWidget--mangaDialogue .quizBoxChoices{ gap:8px; counter-reset:mangaDialogueChoice; } +.quizBoxWidget--mangaDialogue .quizBoxChoiceBtn{ + counter-increment:mangaDialogueChoice; position:relative; background:#fff; color:#151316; + border:2px solid #000; border-radius:0; padding:8px 10px 8px 38px; font-family:inherit; +} +.quizBoxWidget--mangaDialogue .quizBoxChoiceBtn::before{ + content:counter(mangaDialogueChoice, upper-alpha); position:absolute; left:8px; top:50%; transform:translateY(-50%); + width:22px; height:22px; border-radius:50%; background:#151316; color:#f3ead6; + display:flex; align-items:center; justify-content:center; + font-family:"Montserrat", sans-serif; font-weight:700; font-size:11px; +} +.quizBoxWidget--mangaDialogue .quizBoxChoiceBtn:hover:not(:disabled){ background:#fff7e6; } +/* border-color:#000 !important nécessaire : le contrat partagé + (static/style.css, règle générique .quizBoxChoiceBtn.is-correct/ + is-wrong) pose déjà un liseré vert/rouge "!important" — sans ce + repli, il resterait visible par-dessus le fond gold/rouge-foncé + propre à ce modèle (demande explicite : "il n'y a pas le liseré + vert" sur la maquette — bordure NOIRE partout, jamais colorée). */ +.quizBoxWidget--mangaDialogue .quizBoxChoiceBtn.is-correct{ background:#e7b923 !important; border-color:#000 !important; color:#151316; } +.quizBoxWidget--mangaDialogue .quizBoxChoiceBtn.is-wrong{ background:#8f0f24 !important; border-color:#000 !important; color:#fff; text-decoration:line-through; } +.quizBoxWidget--mangaDialogue .quizBoxChoiceBtn.is-correct::after, +.quizBoxWidget--mangaDialogue .quizBoxChoiceBtn.is-wrong::after{ + position:absolute; right:10px; top:50%; transform:translateY(-50%); + font-family:"Montserrat", sans-serif; font-weight:700; font-size:10px; + padding:2px 6px; border:1.5px solid currentColor; border-radius:3px; +} +.quizBoxWidget--mangaDialogue .quizBoxChoiceBtn.is-correct::after{ content:"正解"; } +.quizBoxWidget--mangaDialogue .quizBoxChoiceBtn.is-wrong::after{ content:"不正解"; } +/* Bandeau de pied de page TOUJOURS visible (voir + quizMangaDialogueFooterBand, render_quiz_box_manga_dialogue) — comme + la maquette validée : une bande sombre distincte, jamais la même + couleur que le corps crème. */ +.quizBoxWidget--mangaDialogue .quizMangaDialogueFooterBand{ + /* 44px auparavant : trop bas pour le bouton (padding 8px×2 + texte + + bordure 2px×2 ≈ 40px) et son décalage bottom:8px — il débordait par + le HAUT, à moitié caché sous le panneau crème (demande explicite : + "ou dois etre le bouton"). 72px laisse une vraie marge de respir, + comme la maquette. */ + position:absolute; left:0; right:0; bottom:0; height:72px; + background:#151316; pointer-events:none; + /* Coin haut-gauche dentelé (demande explicite : "les bords du bas + doivent être retravaillés") — écho du bandeau titre découpé en + haut, plutôt qu'un bas de carte parfaitement rectangulaire. Même + technique drop-shadow que le bandeau titre (un `border` classique + ne suit pas un clip-path) pour un liseré qui épouse la VRAIE + silhouette découpée. */ + clip-path:polygon(4% 0, 100% 0, 100% 100%, 0 100%, 0 4%); + filter:drop-shadow(0 -2px 0 #000) drop-shadow(-2px 0 0 #000) drop-shadow(2px 0 0 #000) drop-shadow(0 2px 0 #000); +} +/* Le bouton "Continuer →" du moteur partagé atterrit en DERNIER enfant + de .quizBoxChoices (jamais dans quizMangaDialogueFooterBand, que le + moteur ne remplit jamais) — posé PAR-DESSUS ce bandeau en + position:absolute (.quizBoxWidget--mangaDialogue est position:relative, + voir plus haut), petit et skewé aligné à droite comme la maquette + (sans ce repli, il s'étire à la largeur des choix — .quizBoxChoices + est un flex-column, stretch par défaut). */ +.quizBoxWidget--mangaDialogue .quizBoxContinueBtn{ + position:absolute; right:20px; bottom:20px; z-index:1; margin:0; + background:#d81e3e; border:2px solid #000; color:#fff2ec; border-radius:0; + padding:8px 20px; transform:skewX(-6deg); font-family:"Montserrat", sans-serif; font-weight:700; + box-shadow:3px 3px 0 #000; +} +.quizBoxWidget--mangaDialogue .quizBoxContinueBtn:hover:not(:disabled){ background:#8f0f24; } + +/* ---------- Modèle "Manga" — premier "PAGE DE QUIZ" (voir + screens/rendering/quiz_box_templates.py::render_quiz_box_page_manga), + validé par le créateur via une maquette interactive avant intégration. + Thème complet et autonome : structure/police/formes/couleurs propres, + AUCUNE règle partagée avec les modèles "boîte de dialogue" ci-dessus + (à part .quizBoxChoiceBtn/.quizBoxContinueBtn, injectés par le moteur + JS partagé, voir static/js/play/dialogue-box-controller.js). + Polices : Montserrat/Poppins (déjà auto-hébergées, voir + static/vendor/fonts/fonts.css) plutôt que Bangers/Noto Sans JP de la + maquette d'origine — un paquet SCORM exporté tourne SANS accès + internet dans le LMS du client, une police chargée depuis Google + Fonts y resterait invisible (repli silencieux sur la police système). */ +.quizBoxWidget--manga{ + background:#151316; color:#f3ead6; + font-family:"Poppins", "Montserrat", system-ui, sans-serif; + display:flex; flex-direction:column; align-items:center; gap:18px; padding:20px; + overflow-y:auto; + background-image: + radial-gradient(circle at 14% 8%, rgba(216,30,62,.16), transparent 42%), + repeating-linear-gradient(115deg, rgba(255,255,255,.03) 0 2px, transparent 2px 26px); +} +/* Contenu centré en colonne confortable (demande explicite, comme la + maquette validée) plutôt qu'étiré sur toute la largeur de l'écran. */ +.quizBoxWidget--manga .mangaTopbar, +.quizBoxWidget--manga .mangaProgress, +.quizBoxWidget--manga .mangaPanelQuestion, +.quizBoxWidget--manga .mangaChoices{ width:100%; max-width:860px; flex-shrink:0; } +/* Barre d'étapes (voir forgeQuizMangaOnShow, static/js/play/ + quiz-box-templates.js) — un par question de CE dialogue, remplie + EN JEU (le nombre total de questions n'est connu qu'à l'exécution). */ +.quizBoxWidget--manga .mangaProgress{ display:flex; gap:6px; } +.quizBoxWidget--manga .mangaProgress i{ flex:1; height:6px; background:rgba(243,234,214,.18); border-radius:1px; font-style:normal; } +.quizBoxWidget--manga .mangaProgress i.is-done{ background:#d81e3e; } +.quizBoxWidget--manga .mangaProgress i.is-current{ background:#e7b923; } +.quizBoxWidget--manga .mangaTopbar{ display:flex; align-items:stretch; gap:12px; flex-wrap:wrap; } +.quizBoxWidget--manga .mangaPlate{ + background:#f3ead6; color:#151316; border:3px solid #151316; box-shadow:4px 4px 0 #1d1a1f; + padding:8px 14px; display:flex; flex-direction:column; justify-content:center; gap:2px; min-width:118px; +} +.quizBoxWidget--manga .mangaPlateLabel{ font-size:10px; font-weight:600; letter-spacing:.14em; text-transform:uppercase; opacity:.65; } +.quizBoxWidget--manga .mangaPlateValue{ + font-family:"Montserrat", sans-serif; font-weight:700; font-size:22px; line-height:1; + letter-spacing:.02em; font-variant-numeric:tabular-nums; +} +.quizBoxWidget--manga .mangaPlate--score .mangaPlateValue{ color:#8f0f24; } +.quizBoxWidget--manga .mangaPlate--timer:has(.quizBoxTimerDisplay.is-urgent){ + background:#d81e3e; color:#f3ead6; animation:mangaTimerPulse .5s ease infinite; +} +.quizBoxWidget--manga .mangaPlate--timer:has(.quizBoxTimerDisplay.is-urgent) .mangaPlateValue{ color:#f3ead6; } +@keyframes mangaTimerPulse{ 0%,100%{ transform:scale(1); } 50%{ transform:scale(1.05); } } +.quizBoxWidget--manga .mangaTitlemark{ + flex:1 1 200px; min-width:180px; background:#1d1a1f; border:3px solid #151316; outline:3px solid #f3ead6; outline-offset:-8px; + display:flex; align-items:center; justify-content:center; padding:10px; + background-image:radial-gradient(rgba(243,234,214,.14) 1.3px, transparent 1.5px); background-size:8px 8px; +} +.quizBoxWidget--manga .mangaTitlemark span{ + font-family:"Montserrat", sans-serif; font-weight:700; font-style:italic; text-transform:uppercase; + font-size:clamp(16px,3vw,24px); letter-spacing:.02em; color:#f3ead6; + -webkit-text-stroke:1px #f3ead6; text-shadow:2px 2px 0 #d81e3e; transform:skewX(-8deg); display:inline-block; +} +.quizBoxWidget--manga .mangaPanelQuestion{ + background:#f3ead6; color:#151316; border:3px solid #151316; box-shadow:6px 6px 0 #1d1a1f; + clip-path:polygon(0 0, 100% 0%, 100% 92%, 97% 100%, 3% 100%, 0 88%); + padding:22px 26px 30px; flex:0 0 auto; +} +.quizBoxWidget--manga .mangaKicker{ + display:inline-block; font-size:11px; font-weight:700; letter-spacing:.14em; text-transform:uppercase; + background:#d81e3e; color:#f3ead6; padding:3px 10px; margin-bottom:12px; transform:rotate(-2deg); +} +.quizBoxWidget--manga .mangaQuestionText{ + margin:0; font-family:"Montserrat", sans-serif; font-weight:700; font-style:italic; line-height:1.2; + font-size:clamp(19px,2.6vw,28px); letter-spacing:-.01em; text-transform:uppercase; text-wrap:balance; +} +.quizBoxWidget--manga .mangaChoices{ + display:grid; grid-template-columns:1fr 1fr; gap:14px; flex:1 1 auto; align-content:start; +} +@media (max-width:620px){ .quizBoxWidget--manga .mangaChoices{ grid-template-columns:1fr; } } +.quizBoxWidget--manga .quizBoxChoiceBtn{ + counter-increment:mangaChoice; position:relative; display:flex; align-items:center; gap:14px; + background:#1d1a1f; color:#f3ead6; border:3px solid #151316; outline:2px solid rgba(243,234,214,.5); outline-offset:-7px; + padding:12px 16px 12px 12px; font-family:inherit; font-size:15px; font-weight:500; text-align:left; + border-radius:0; box-shadow:none; +} +.quizBoxWidget--manga .mangaChoices{ counter-reset:mangaChoice; } +.quizBoxWidget--manga .quizBoxChoiceBtn::before{ + content:counter(mangaChoice, upper-alpha); flex:0 0 auto; width:34px; height:34px; border-radius:50%; + background:#f3ead6; color:#151316; border:3px solid #151316; display:flex; align-items:center; justify-content:center; + font-family:"Montserrat", sans-serif; font-weight:700; font-size:15px; +} +.quizBoxWidget--manga .quizBoxChoiceBtn:hover:not(:disabled){ background:#26222a; transform:translate(-2px,-2px); } +.quizBoxWidget--manga .quizBoxChoiceBtn.is-correct{ background:#e7b923 !important; color:#151316; border-color:#151316 !important; } +.quizBoxWidget--manga .quizBoxChoiceBtn.is-correct::before{ background:#151316; color:#e7b923; border-color:#151316; } +.quizBoxWidget--manga .quizBoxChoiceBtn.is-wrong{ background:#8f0f24 !important; border-color:#151316 !important; } +.quizBoxWidget--manga .quizBoxChoiceBtn.is-correct::after, +.quizBoxWidget--manga .quizBoxChoiceBtn.is-wrong::after{ + position:absolute; top:50%; right:14px; transform:translateY(-50%) rotate(-8deg); + font-family:"Montserrat", sans-serif; font-weight:700; font-size:13px; letter-spacing:.06em; + padding:2px 8px; border:2px solid currentColor; border-radius:4px; +} +.quizBoxWidget--manga .quizBoxChoiceBtn.is-correct::after{ content:"正解"; color:#151316; } +.quizBoxWidget--manga .quizBoxChoiceBtn.is-wrong::after{ content:"不正解"; color:#f3ead6; } +/* Une réponse fausse est barrée (demande explicite, comme la maquette) — + jamais le badge lettré (::before), qui reste un simple repère A/B/C/D. */ +.quizBoxWidget--manga .quizBoxChoiceBtn.is-wrong{ text-decoration:line-through; text-decoration-thickness:2px; } +.quizBoxWidget--manga .quizBoxChoiceBtn.is-wrong::before{ text-decoration:none; } +/* Posé DANS la grille des choix (voir forgeQuizBoxAnswer, moteur partagé) + mais sur sa propre ligne, aligné à droite en petit pavé (comme la + maquette) plutôt qu'étiré à la largeur d'une case de la grille — et + relabellisé en "Suite ▶" (texte "Continuer →" du moteur partagé + conservé pour les lecteurs d'écran, juste masqué visuellement). */ +.quizBoxWidget--manga .quizBoxContinueBtn{ + grid-column:1 / -1; justify-self:end; width:max-content; + font-family:"Montserrat", sans-serif; font-weight:700; letter-spacing:.03em; font-size:0; + background:#d81e3e; color:#f3ead6; border:3px solid #151316; box-shadow:3px 3px 0 #1d1a1f; + padding:9px 22px; transform:skewX(-6deg); border-radius:0; +} +.quizBoxWidget--manga .quizBoxContinueBtn::after{ content:"Suite ▶"; font-size:14px; } +.quizBoxWidget--manga .quizBoxContinueBtn:hover:not(:disabled){ background:#8f0f24; } + +/* Écran de résultat de fin de quiz (voir forgeQuizMangaOnQuizComplete, + static/js/play/quiz-box-templates.js) — demande explicite : "il faut + aussi adapter le modele manga pour avoir sa page de résultat", même + mécanique que "classique" mais dans le thème manga propre à ce + modèle. Pas de conteneur "content" à part ici : c'est la RACINE + (.quizBoxWidget--manga) qui bascule en "is-showing-result" — le + bandeau topbar/score et la barre d'étapes (déjà remplie à 100%, + voir le JS) restent visibles, seuls le panneau question et les choix + disparaissent. */ +.quizBoxWidget--manga.is-showing-result > .mangaPanelQuestion, +.quizBoxWidget--manga.is-showing-result > .mangaChoices{ display:none; } +.mangaResultZone{ + display:none; flex-direction:column; align-items:center; justify-content:center; + width:100%; max-width:860px; text-align:center; flex:1 1 auto; +} +.quizBoxWidget--manga.is-showing-result .mangaResultZone{ display:flex; } +.mangaResultCard{ + background:#f3ead6; color:#151316; border:3px solid #151316; box-shadow:6px 6px 0 #1d1a1f; + clip-path:polygon(0 0, 100% 0%, 100% 92%, 97% 100%, 3% 100%, 0 88%); + padding:32px 30px 40px; width:100%; +} +.mangaResultTitle{ + font-family:"Montserrat", sans-serif; font-weight:700; font-style:italic; text-transform:uppercase; + font-size:clamp(26px,4vw,38px); text-shadow:3px 3px 0 #d81e3e; transform:skewX(-4deg); + display:inline-block; margin:0 0 10px; +} +.mangaResultScore{ font-family:"Montserrat", sans-serif; font-weight:700; font-size:19px; color:#8f0f24; margin:0 0 18px; } +.mangaResultBadge{ + display:inline-block; font-family:"Montserrat", sans-serif; font-weight:700; font-size:22px; + letter-spacing:.05em; padding:6px 22px; border:3px solid #151316; margin-bottom:24px; transform:rotate(-2deg); +} +.mangaResultBadge.pass{ background:#e7b923; } +.mangaResultBadge.fail{ background:#8f0f24; color:#f3ead6; } +.mangaQuitBtn{ + font-family:"Montserrat", sans-serif; font-weight:700; letter-spacing:.03em; cursor:pointer; + background:#151316; color:#f3ead6; border:3px solid #151316; box-shadow:3px 3px 0 #d81e3e; + padding:10px 26px; transform:skewX(-6deg); border-radius:0; +} +.mangaQuitBtn:hover{ background:#26222a; } + +/* "Classique" (modèle "page de quiz" DE BASE) — maquette interactive + validée par le créateur (formation sécurité incendie comme exemple) : + couleurs VOLONTAIREMENT identiques à celles par défaut du modèle + "boîte de dialogue" de base (#2f6fed/#1a1d24/#11141b, voir + screens/rendering/dialogue_box_style.py::DEFAULT_DIALOGUE_BOX_STYLE) + plutôt qu'une palette propre — contrairement à "manga". */ +/* Police : "Poppins" (déjà auto-hébergée pour "manga", voir + static/vendor/fonts/fonts.css) — jamais "IBM Plex Sans/Mono" de la + maquette (Google Fonts), qui casserait l'export SCORM hors-ligne, même + contrainte déjà rencontrée pour "manga". */ +.quizBoxWidget--classique{ + position:relative; display:flex; flex-direction:column; font-family:"Poppins", system-ui, sans-serif; +} +.classiqueHeaderBar{ + display:flex; align-items:center; justify-content:space-between; gap:14px; flex-wrap:wrap; + padding:14px 20px; color:#fff; +} +.classiqueHeaderTitleWrap{ display:flex; flex-direction:column; gap:1px; min-width:0; } +.classiqueHeaderEyebrow{ font-size:10px; font-weight:600; letter-spacing:.09em; text-transform:uppercase; color:rgba(255,255,255,.7); } +.classiqueHeaderTitle{ font-size:16px; font-weight:700; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; } +.classiqueHeaderChips{ display:flex; gap:8px; flex-shrink:0; } +.classiqueChip{ + display:flex; flex-direction:column; align-items:center; justify-content:center; + background:rgba(255,255,255,.14); border-radius:8px; padding:4px 12px; min-width:56px; +} +.classiqueChipLabel{ font-size:9px; font-weight:600; letter-spacing:.08em; text-transform:uppercase; color:rgba(255,255,255,.65); } +.classiqueChipValue{ + font-family:"Roboto", monospace; font-size:13.5px; font-weight:600; color:#fff; + font-variant-numeric:tabular-nums; +} +/* Bug identifié (demande répétée : "le mot aucun a une background + color... un bord arrondi") : [data-quiz-role="timer"] porte AUSSI la + classe partagée .quizBoxTimerDisplay (voir plus haut dans ce fichier — + nécessaire pour le mécanisme commun ":empty"/".is-urgent") qui pose + SA PROPRE pastille (fond + border-radius:999px) — DEUX pastilles + s'empilaient donc : celle, correcte et voulue, du conteneur + ".classiqueChip" (même fond que "Score"), et celle, parasite, de + ".quizBoxTimerDisplay" collée UNIQUEMENT autour du mot "Aucun"/du + temps restant. On neutralise ICI cette seconde pastille (le + conteneur ".classiqueChip" reste seul responsable du fond, TOUJOURS + visible, identique que pour "Score", avec ou sans minuteur réglé). */ +.classiqueChipValue.quizBoxTimerDisplay{ background:none; padding:0; border-radius:0; } +.classiqueChip--timer:has(.quizBoxTimerDisplay.is-urgent){ background:rgba(224,82,77,.35); } +.classiqueChip--timer:has(.quizBoxTimerDisplay.is-urgent) .classiqueChipValue, +.classiqueChip--timer:has(.quizBoxTimerDisplay.is-urgent) .classiqueChipLabel{ color:#ffb3b0; } + +.classiqueBody{ flex:1; display:flex; flex-direction:column; align-items:center; padding:24px 20px 96px; overflow-y:auto; } +.classiqueContent{ width:100%; max-width:640px; display:flex; flex-direction:column; flex:1; } + +/* Barre d'étapes — voir forgeQuizClassiqueOnShow (static/js/play/ + quiz-box-templates.js), même mécanique que "manga". */ +.classiqueProgress{ display:flex; gap:6px; margin-bottom:24px; } +.classiqueProgress i{ flex:1; height:4px; border-radius:2px; background:rgba(255,255,255,.14); font-style:normal; } +.classiqueProgress i.is-done{ background:#2ecc71; } +.classiqueProgress i.is-current{ background:#fff; } + +.classiqueKicker{ + display:inline-block; align-self:flex-start; background:rgba(255,255,255,.14); border-radius:999px; + padding:4px 12px; font-size:11.5px; font-weight:600; color:rgba(255,255,255,.75); margin-bottom:16px; +} +.classiqueQuestionText{ margin:0 0 22px; font-weight:600; line-height:1.35; font-size:clamp(18px,2.6vw,22px); text-wrap:balance; } + +.classiqueChoices{ display:flex; flex-direction:column; gap:10px; } +.classiqueChoices .quizBoxChoiceBtn{ + display:flex; align-items:center; gap:14px; border-radius:8px; padding:13px 16px; +} +.classiqueChoices .quizBoxChoiceBtn.is-correct{ color:#08210f; } +.classiqueChoices .quizBoxChoiceBtn.is-wrong{ text-decoration:line-through; opacity:.85; } +/* Bandeau de pied de page TOUJOURS visible (voir classiqueFooterBand, + render_quiz_box_page_classique) — couleur configurable "🎨 Style" + (footer_bg, voir --classique-footer-bg posée sur la racine du widget) + plutôt qu'une couleur figée en dur, demande explicite : "il manque le + footer foncé avec le bouton" (comme la maquette validée). */ +.classiqueFooterBand{ + position:absolute; left:0; right:0; bottom:0; height:66px; + background:var(--classique-footer-bg, #11141b); border-top:1px solid rgba(255,255,255,.08); + pointer-events:none; +} +/* Le bouton "Continuer →" du moteur partagé atterrit en DERNIER enfant + de .classiqueChoices (jamais dans classiqueFooterBand, que le moteur + ne remplit jamais) — posé PAR-DESSUS ce bandeau en position:absolute + (.quizBoxWidget--classique est position:relative, voir plus haut). + Demande explicite : aligné à DROITE — dans la même colonne centrée de + 640px que le corps (.classiqueContent) : `max(20px, calc(50vw - 320px))` + recalcule le bord DROIT de CETTE colonne (640px = 2×320px, 20px = le + padding latéral de .classiqueBody) plutôt que le bord droit de TOUT le + widget. 50vw est fiable ici : ce modèle n'existe qu'en plein écran, où + `.is-fullscreen` force déjà `width:100vw`. */ +.classiqueChoices .quizBoxContinueBtn{ + position:absolute; right:max(20px, calc(50vw - 320px)); bottom:14px; z-index:1; margin:0; + background:#2f6fed; border:1px solid #2f6fed; border-radius:7px; padding:10px 22px; font-weight:600; +} +.classiqueChoices .quizBoxContinueBtn:hover:not(:disabled){ background:#255bc4; } + +/* Encart d'explication après réponse — RÉSERVÉ pour une fonctionnalité + FUTURE non encore implémentée (voir le commentaire dans + render_quiz_box_page_classique, screens/rendering/quiz_box_templates.py) + : reste toujours vide aujourd'hui, donc toujours caché — seul :not(:empty) + le fera apparaître le jour où un vrai contenu y sera écrit. */ +.classiqueExplain:not(:empty){ + margin-top:14px; padding:14px 16px; border-radius:8px; background:rgba(255,255,255,.06); + border:1px solid rgba(255,255,255,.14); font-size:13.5px; color:rgba(255,255,255,.75); line-height:1.5; +} + +/* Écran de résultat de fin de quiz (voir forgeQuizClassiqueOnQuizComplete/ + forgeQuizResultRestart, static/js/play/quiz-box-templates.js et + dialogue-box-controller.js) — demande explicite : "la page de resultat + est cassee... elle affiche un conteneur qui reaffiche le contenu du + quiz au lieu du resultat" (le vrai moteur n'avait jusqu'ici AUCUN écran + de fin, juste la maquette artifact). ".classiqueContent.is-showing- + result" masque tout le reste (progression/question/choix/explication) + pour ne laisser QUE ce bloc visible, sans reconstruire le DOM du + widget (le contrat data-quiz-role="header/question/choices/score/ + timer" reste intact pour un "Recommencer" qui relance normalement). */ +.classiqueContent.is-showing-result > *{ display:none; } +.classiqueContent.is-showing-result .classiqueResultZone{ display:flex; } +.classiqueResultZone{ + display:none; flex:1; flex-direction:column; align-items:center; justify-content:center; + text-align:center; padding:20px 0; +} +.classiqueResultRing{ + width:112px; height:112px; margin:0 0 20px; border-radius:50%; + display:flex; align-items:center; justify-content:center; position:relative; + background:conic-gradient(#2f6fed calc(var(--pct, 0) * 1%), rgba(255,255,255,.14) 0); +} +.classiqueResultRing::before{ + content:""; position:absolute; inset:8px; border-radius:50%; background:var(--classique-body-bg, #1a1d24); +} +.classiqueResultRing span{ position:relative; font-weight:700; font-size:22px; font-variant-numeric:tabular-nums; } +.classiqueResultTitle{ font-size:19px; font-weight:700; margin:0 0 6px; } +.classiqueResultSub{ font-size:13.5px; color:rgba(255,255,255,.62); margin:0 0 22px; } +.classiqueResultBadge{ + display:inline-flex; align-items:center; gap:6px; padding:6px 16px; border-radius:999px; + font-size:12.5px; font-weight:700; margin-bottom:26px; +} +.classiqueResultBadge.pass{ background:rgba(46,204,113,.16); color:#2ecc71; } +.classiqueResultBadge.fail{ background:rgba(224,82,77,.16); color:#e0524d; } +.classiqueQuitBtn{ + font:inherit; font-weight:600; font-size:13.5px; color:#fff; background:transparent; + border:1px solid rgba(255,255,255,.3); border-radius:9px; padding:10px 20px; cursor:pointer; +} +.classiqueQuitBtn:hover{ border-color:#2f6fed; background:rgba(255,255,255,.08); } /* Widget "🏆 Score" — TOUJOURS visible une fois posé (pas de collision/ déclencheur, contrairement aux deux widgets ci-dessus), voir diff --git a/templates/play.html b/templates/play.html index 0590a416..2b146ecc 100644 --- a/templates/play.html +++ b/templates/play.html @@ -42,6 +42,18 @@ #playFrame.sceneMode{ width:100vw; height:100vh; } .playScreen{ position:absolute; inset:0; display:none; } .playScreen.playScene{ inset:auto; top:50%; left:50%; transform:translate(-50%, -50%); background:#1a1d24; } + /* "La notion de caméra disparaît" quand un quiz plein écran existe sur + cet écran (demande explicite, voir screens/payload/full_game_payload.py + ::any_quiz_box_fullscreen) — le réglage "Caméra (px)" (scene_width/ + scene_height, qui donne à .playScene ci-dessus sa taille ET son + `transform` de centrage) ne s'applique alors plus DU TOUT : cet écran + devient lui-même plein viewport, sans transform (qui casserait + position:fixed pour tout descendant, voir dialogue-box-controller.js + ::forgeEscapeCameraForFullscreen — plus nécessaire ici puisque + .playScene n'a elle-même plus de transform dans ce cas). */ + .playScreen.playScene.playScene--quizFullscreen{ + position:fixed; inset:0; top:0; left:0; width:100vw; height:100vh; transform:none; + } .playElement{ position:absolute; box-sizing:border-box; font-family:system-ui,sans-serif; } @@ -89,7 +101,7 @@ -

+
+
- {% if world_width > screen.scene_width or world_height > screen.scene_height %} + {% if not any_quiz_box_fullscreen and (world_width > screen.scene_width or world_height > screen.scene_height) %} + gêne jamais la sélection/le glisser d'un objet dessous. + Masqué dès qu'un quiz PLEIN ÉCRAN existe sur cet écran + (demande explicite : "la notion de caméra disparaît") — + il n'a plus aucun sens une fois que ce widget couvre tout. -->
{% endif %} {% for o in objects %} -
{{ o.rendered_html|safe }}
@@ -562,6 +576,98 @@ {% endif %} + {% if obj.kind == 'quiz_box' %} + +
+ Options du quiz +
+ +
+ +
+ +
+
+
+ +
+ +
+
+

Le plein écran et le minuteur ne s'appliquent qu'au jeu (jamais dans cet éditeur).

+
+
+ + + + + {% if quiz_box_config.fullscreen %} +
+ Modèles — page de quiz +
+

Visibles seulement en plein écran — un thème complet et autonome par modèle (police, formes, couleurs et structure propres à chacun).

+
+ {% for key in quiz_box_page_templates %} + + {% endfor %} +
+
+
+ {% else %} +
+ Modèles — boîte de dialogue +
+

Visibles seulement hors plein écran — un thème complet et autonome par modèle (police, formes, couleurs et structure propres à chacun).

+
+ {% for key in quiz_box_dialog_templates %} + + {% endfor %} +
+
+
+ {% endif %} + {% endif %} + {% if obj.kind not in ('fond', 'dialogue_box', 'quiz_box', 'score_widget') %} "; - if (hasDataBinding) markers += ""; + const hasDataBinding = !!attrsRaw._data_definition_id; + const mark = function (htmlStr) { + let markers = ''; + if (hasVisibilityCondition) markers += ''; + if (hasDataBinding) markers += ''; return htmlStr + markers; }; - var boundCtx = forgeResolveBoundRowCtx(gameData, attrsRaw); - if (boundCtx) ctx = Object.assign({}, ctx || {}, boundCtx); + const boundCtx = forgeResolveBoundRowCtx(gameData, attrsRaw); + if (boundCtx) ctx = { ...ctx || {}, ...boundCtx }; // meta d'un widget à special_render : fixedAttrs propre (voir // screens/widgets/registry.py — seul "tableau" en a un, "class":"table"), // jamais celui de "conteneur" ("class":"box" polluerait tout le reste). - var meta = simple || { fixedAttrs: FORGE_SPECIAL_WIDGET_FIXED_ATTRS[widgetKey] || {} }; + const meta = simple || { fixedAttrs: FORGE_SPECIAL_WIDGET_FIXED_ATTRS[widgetKey] || {} }; if (specialKey) { - var renderer = forgeSpecialRenderer(specialKey); + const renderer = forgeSpecialRenderer(specialKey); return mark(renderer(el, meta, gameData, childrenMap, ctx, parentFlexDirection)); } - var tag = meta.tag; + let { tag } = meta; if (tag === null) { // widget à balise dynamique (ex: "titre" -> h1/h2/h3) - var niveau = attrsRaw._niveau || "2"; - tag = "h" + niveau; + const niveau = attrsRaw._niveau || '2'; + tag = `h${niveau}`; } - var attrs = forgeVisibleAttrs(el, meta, ctx); - var style = forgeStyleString(el, parentFlexDirection, widgetKey); + const attrs = forgeVisibleAttrs(el, meta, ctx); + const style = forgeStyleString(el, parentFlexDirection, widgetKey); - var hoverText = attrsRaw._survol_texte; - if (hoverText) attrs["data-hover-text"] = forgeApplyCtx(hoverText, ctx); + const hoverText = attrsRaw._survol_texte; + if (hoverText) attrs['data-hover-text'] = forgeApplyCtx(hoverText, ctx); // alt (RGAA/WCAG 1.1.1) : le widget "image" n'a pas de champ de // description dédié dans l'éditeur — alt="" (décoratif) par défaut // plutôt qu'aucun attribut du tout, jamais le nom de fichier brut par // défaut du navigateur. Ne touche pas à un alt déjà posé (pass-through // via forgeVisibleAttrs, si l'auteur en règle un un jour). - if (tag === "img" && !("alt" in attrs)) attrs.alt = ""; + if (tag === 'img' && !('alt' in attrs)) attrs.alt = ''; if (meta.selfClosing) { - return mark("<" + tag + " " + forgeAttrString(attrs, style) + ">"); + return mark(`<${tag} ${forgeAttrString(attrs, style)}>`); } - var content = forgeApplyCtx(el.content || "", ctx); - var childResult = el.element_type_id ? forgeRenderElementTypeChildren(el, gameData, ctx) : [null, false]; - var childHtml = childResult[0], isOverlayTemplate = childResult[1]; + const content = forgeApplyCtx(el.content || '', ctx); + const childResult = el.element_type_id ? forgeRenderElementTypeChildren(el, gameData, ctx) : [null, false]; + let childHtml = childResult[0]; const + isOverlayTemplate = childResult[1]; if (childHtml === null) { childHtml = forgeRenderChildren(el, gameData, childrenMap, ctx); } else if (isOverlayTemplate) { delete attrs.class; - return mark("
" + childHtml + "
"); + return mark(`
${childHtml}
`); } - if (tag === "ul" || tag === "ol") { - var items = content.split("\n").map(function (l) { return l.trim(); }).filter(Boolean); - var inner = items.map(function (item) { return "
  • " + forgeHtmlEscape(item) + "
  • "; }).join("") + childHtml; - return mark("<" + tag + " " + forgeAttrString(attrs, style) + ">" + inner + ""); + if (tag === 'ul' || tag === 'ol') { + const items = content.split('\n').map((l) => l.trim()).filter(Boolean); + const inner = items.map((item) => `
  • ${forgeHtmlEscape(item)}
  • `).join('') + childHtml; + return mark(`<${tag} ${forgeAttrString(attrs, style)}>${inner}`); } - var safeContent = content ? forgeHtmlEscape(content).replace(/\n/g, "
    ") : ""; - return mark("<" + tag + " " + forgeAttrString(attrs, style) + ">" + safeContent + childHtml + ""); + const safeContent = content ? forgeHtmlEscape(content).replace(/\n/g, '
    ') : ''; + return mark(`<${tag} ${forgeAttrString(attrs, style)}>${safeContent}${childHtml}`); } // NOTE (node:test uniquement) : forgeRenderElementHtml() référence, pour @@ -324,14 +336,24 @@ function forgeRenderElementHtml(el, gameData, childrenMap, ctx, parentFlexDirect // fonctions ci-dessus pour leurs propres enfants/onglets/superposition). if (typeof module !== 'undefined' && module.exports) { module.exports = { - forgeHtmlEscape, forgeApplyCtx, forgeAutoId, forgeParentFlexDirection, forgeStyleString, - forgeAttrString, forgeVisibleAttrs, forgeRenderChildren, forgeRenderElementHtml, - forgeResolveBoundRowCtx, forgeRenderElementTypeChildren, forgeSpecialRenderer, - FORGE_SIMPLE_WIDGETS, FORGE_SPECIAL_RENDER_BY_WIDGET, + forgeHtmlEscape, + forgeApplyCtx, + forgeAutoId, + forgeParentFlexDirection, + forgeStyleString, + forgeAttrString, + forgeVisibleAttrs, + forgeRenderChildren, + forgeRenderElementHtml, + forgeResolveBoundRowCtx, + forgeRenderElementTypeChildren, + forgeSpecialRenderer, + FORGE_SIMPLE_WIDGETS, + FORGE_SPECIAL_RENDER_BY_WIDGET, }; global.forgeIsElementVisibleOffline = global.forgeIsElementVisibleOffline || require('./visibility-condition.js').forgeIsElementVisibleOffline; - var filterMod = require('./filter-repeater-rows.js'); + const filterMod = require('./filter-repeater-rows.js'); global.forgeResolveFilterValue = global.forgeResolveFilterValue || filterMod.forgeResolveFilterValue; global.forgeResolveVariablePath = global.forgeResolveVariablePath || filterMod.forgeResolveVariablePath; global.forgeDecodeClauses = global.forgeDecodeClauses || filterMod.forgeDecodeClauses; diff --git a/static/js/play/offline/render-jauge.js b/static/js/play/offline/render-jauge.js index 8f52862c..6024bb31 100644 --- a/static/js/play/offline/render-jauge.js +++ b/static/js/play/offline/render-jauge.js @@ -4,16 +4,17 @@ // au lieu d'une requête SQL (voir _read_field_value côté serveur). function forgeHexToRgb(hexColor) { - var hex = (hexColor || "#5b8cff").replace(/^#/, ""); - if (hex.length !== 6) hex = "5b8cff"; + let hex = (hexColor || '#5b8cff').replace(/^#/, ''); + if (hex.length !== 6) hex = '5b8cff'; return [parseInt(hex.substr(0, 2), 16), parseInt(hex.substr(2, 2), 16), parseInt(hex.substr(4, 2), 16)]; } function forgeInterpolateColor(lowHex, highHex, ratio) { - var lo = forgeHexToRgb(lowHex), hi = forgeHexToRgb(highHex); - var mixed = lo.map(function (c, i) { return Math.round(c + (hi[i] - c) * ratio); }); - var toHex = function (n) { return n.toString(16).padStart(2, "0"); }; - return "#" + mixed.map(toHex).join(""); + const lo = forgeHexToRgb(lowHex); const + hi = forgeHexToRgb(highHex); + const mixed = lo.map((c, i) => Math.round(c + (hi[i] - c) * ratio)); + const toHex = function (n) { return n.toString(16).padStart(2, '0'); }; + return `#${mixed.map(toHex).join('')}`; } // Port de _read_field_value — repli sur la ligne la PLUS RÉCENTE si @@ -22,88 +23,84 @@ function forgeInterpolateColor(lowHex, highHex, ratio) { function forgeReadFieldValue(gameData, definitionId, rowId, fieldName) { if (!definitionId || !fieldName) return null; definitionId = String(definitionId); - var rows = gameData.data && gameData.data[definitionId]; + const rows = gameData.data && gameData.data[definitionId]; if (!rows || !rows.length) return null; - var row = null; - if (rowId) row = rows.find(function (r) { return String(r.id) === String(rowId); }); + let row = null; + if (rowId) row = rows.find((r) => String(r.id) === String(rowId)); if (!row) row = rows[0]; return row[fieldName]; } function forgeRenderJauge(el, meta, gameData, childrenMap, ctx, parentFlexDirection) { - var attrs = el.attributes || {}; - var nomPosition = attrs._nom_position || "dessus"; - var nomAlignement = attrs._nom_alignement || "centre"; - var nomPolice = attrs._nom_police || "inherit"; - var nomTaille = attrs._nom_taille || "12"; - var nomGras = attrs._nom_gras === "1"; - var nomItalique = attrs._nom_italique === "1"; - var flexDir = nomPosition === "cote" ? "row" : "column"; - var alignItems = nomPosition === "cote" ? "center" : "stretch"; - var style = forgeStyleString( - el, parentFlexDirection, el.widget - ) + " display:flex; flex-direction:" + flexDir + "; align-items:" + alignItems + "; justify-content:center; gap:4px;"; + const attrs = el.attributes || {}; + const nomPosition = attrs._nom_position || 'dessus'; + const nomAlignement = attrs._nom_alignement || 'centre'; + const nomPolice = attrs._nom_police || 'inherit'; + const nomTaille = attrs._nom_taille || '12'; + const nomGras = attrs._nom_gras === '1'; + const nomItalique = attrs._nom_italique === '1'; + const flexDir = nomPosition === 'cote' ? 'row' : 'column'; + const alignItems = nomPosition === 'cote' ? 'center' : 'stretch'; + const style = `${forgeStyleString(el, parentFlexDirection, el.widget)} display:flex; flex-direction:${flexDir}; align-items:${alignItems}; justify-content:center; gap:4px;`; - var definitionId = attrs._definition_id; - var rowId = attrs._row_id; - var fieldName = (attrs._champ || "").trim(); - var fieldNameNom = (attrs._champ_nom || "").trim(); - var minV = parseFloat(attrs._min); if (isNaN(minV)) minV = 0; - var maxV = parseFloat(attrs._max); if (isNaN(maxV)) maxV = 100; - var couleurBasse = attrs._couleur_basse || "#e05252"; - var couleurHaute = attrs._couleur_haute || "#4caf50"; - var afficherValeur = attrs._afficher_valeur === "1"; + const definitionId = attrs._definition_id; + const rowId = attrs._row_id; + const fieldName = (attrs._champ || '').trim(); + const fieldNameNom = (attrs._champ_nom || '').trim(); + let minV = parseFloat(attrs._min); if (Number.isNaN(minV)) minV = 0; + let maxV = parseFloat(attrs._max); if (Number.isNaN(maxV)) maxV = 100; + const couleurBasse = attrs._couleur_basse || '#e05252'; + const couleurHaute = attrs._couleur_haute || '#4caf50'; + const afficherValeur = attrs._afficher_valeur === '1'; - var rawValue = fieldName ? forgeReadFieldValue(gameData, definitionId, rowId, fieldName) : null; - var value = parseFloat(rawValue); - if (isNaN(value)) value = minV; + const rawValue = fieldName ? forgeReadFieldValue(gameData, definitionId, rowId, fieldName) : null; + let value = parseFloat(rawValue); + if (Number.isNaN(value)) value = minV; - var span = (maxV - minV) || 1; - var ratio = Math.max(0, Math.min(1, (value - minV) / span)); - var percent = Math.round(ratio * 1000) / 10; - var fillColor = forgeInterpolateColor(couleurBasse, couleurHaute, ratio); + const span = (maxV - minV) || 1; + const ratio = Math.max(0, Math.min(1, (value - minV) / span)); + const percent = Math.round(ratio * 1000) / 10; + const fillColor = forgeInterpolateColor(couleurBasse, couleurHaute, ratio); - var labelHtml = ""; + let labelHtml = ''; if (afficherValeur) { - labelHtml = - '
    ' + - forgeHtmlEscape(rawValue !== null && rawValue !== undefined ? String(rawValue) : "—") + '
    '; + labelHtml = '
    ${ + forgeHtmlEscape(rawValue !== null && rawValue !== undefined ? String(rawValue) : '—')}
    `; } - var nameHtml = ""; + let nameHtml = ''; if (fieldNameNom) { - var nomValue = forgeReadFieldValue(gameData, definitionId, rowId, fieldNameNom); - if (nomValue !== null && nomValue !== undefined && nomValue !== "") { - var textAlign = (nomPosition === "dessus" && nomAlignement === "gauche") ? "left" : "center"; - nameHtml = - '
    ' + forgeHtmlEscape(String(nomValue)) + '
    '; + const nomValue = forgeReadFieldValue(gameData, definitionId, rowId, fieldNameNom); + if (nomValue !== null && nomValue !== undefined && nomValue !== '') { + const textAlign = (nomPosition === 'dessus' && nomAlignement === 'gauche') ? 'left' : 'center'; + nameHtml = `
    ${forgeHtmlEscape(String(nomValue))}
    `; } } - var extraClasses = Object.keys(attrs) - .filter(function (k) { return k.indexOf("_class_") === 0 && attrs[k]; }) - .map(function (k) { return attrs[k]; }).join(" "); - var barClass = forgeHtmlEscape(("progress jaugeBar " + extraClasses).trim()); - var bar = - '' + percent + '%'; - var barWrap = - '
    ' + bar + labelHtml + '
    '; - return '
    ' + - nameHtml + barWrap + '
    '; + const extraClasses = Object.keys(attrs) + .filter((k) => k.indexOf('_class_') === 0 && attrs[k]) + .map((k) => attrs[k]).join(' '); + const barClass = forgeHtmlEscape((`progress jaugeBar ${extraClasses}`).trim()); + const bar = `${percent}%`; + const barWrap = '
    ${bar}${labelHtml}
    `; + return `
    ${ + nameHtml}${barWrap}
    `; } if (typeof module !== 'undefined' && module.exports) { - module.exports = { forgeRenderJauge, forgeHexToRgb, forgeInterpolateColor, forgeReadFieldValue }; - var renderMod = require('./render-element.js'); + module.exports = { + forgeRenderJauge, forgeHexToRgb, forgeInterpolateColor, forgeReadFieldValue, + }; + const renderMod = require('./render-element.js'); global.forgeStyleString = global.forgeStyleString || renderMod.forgeStyleString; global.forgeHtmlEscape = global.forgeHtmlEscape || renderMod.forgeHtmlEscape; global.forgeAutoId = global.forgeAutoId || renderMod.forgeAutoId; diff --git a/static/js/play/offline/render-overlay.js b/static/js/play/offline/render-overlay.js index b81ce4bb..0958000e 100644 --- a/static/js/play/offline/render-overlay.js +++ b/static/js/play/offline/render-overlay.js @@ -4,47 +4,46 @@ // dans l'éditeur (non pertinent hors ligne, qui ne sert jamais l'éditeur, // mais le port reste fidèle pour ne pas diverger inutilement). function forgeRenderOverlay(el, meta, gameData, childrenMap, ctx, parentFlexDirection) { - var isPlayMode = !!(ctx && ctx._forge_play_mode); - var attrsRaw = el.attributes || {}; - var boxColor = attrsRaw._couleur_boite || "#1f2430"; - var radius = attrsRaw._arrondi || "12"; + const isPlayMode = !!(ctx && ctx._forge_play_mode); + const attrsRaw = el.attributes || {}; + const boxColor = attrsRaw._couleur_boite || '#1f2430'; + const radius = attrsRaw._arrondi || '12'; - var attrs = forgeVisibleAttrs(el, meta, ctx); - var style, wrapperClass; + const attrs = forgeVisibleAttrs(el, meta, ctx); + let style; let + wrapperClass; if (isPlayMode) { - var baseOverlayStyle = - "position:fixed; inset:0; z-index:9999; display:flex; " + - "align-items:center; justify-content:center; background:rgba(0,0,0,0.6);"; - style = baseOverlayStyle + " " + forgeStyleString(el, parentFlexDirection, el.widget); - wrapperClass = "modal is-active"; + const baseOverlayStyle = 'position:fixed; inset:0; z-index:9999; display:flex; ' + + 'align-items:center; justify-content:center; background:rgba(0,0,0,0.6);'; + style = `${baseOverlayStyle} ${forgeStyleString(el, parentFlexDirection, el.widget)}`; + wrapperClass = 'modal is-active'; } else { style = forgeStyleString(el, parentFlexDirection, el.widget); - wrapperClass = ""; + wrapperClass = ''; } - var attrParts = ['style="' + forgeHtmlEscape(style) + '"']; - Object.keys(attrs).forEach(function (k) { - var v = attrs[k]; - if (v === null || v === undefined || v === "" || v === false) return; - attrParts.push(v === true ? forgeHtmlEscape(k) : forgeHtmlEscape(k) + '="' + forgeHtmlEscape(v) + '"'); + const attrParts = [`style="${forgeHtmlEscape(style)}"`]; + Object.keys(attrs).forEach((k) => { + const v = attrs[k]; + if (v === null || v === undefined || v === '' || v === false) return; + attrParts.push(v === true ? forgeHtmlEscape(k) : `${forgeHtmlEscape(k)}="${forgeHtmlEscape(v)}"`); }); - var boxStyle = - "background:" + forgeHtmlEscape(String(boxColor)) + "; border-radius:" + forgeHtmlEscape(String(radius)) + "px; " + - "color:#e8eaf0; padding:24px; width:100%; max-width:min(560px, 90%); max-height:90%; overflow:auto; box-sizing:border-box;"; - var childHtml = forgeRenderChildren(el, gameData, childrenMap, ctx); - var wrapperClassAttr = wrapperClass ? 'class="' + wrapperClass + '" ' : ""; + const boxStyle = `background:${forgeHtmlEscape(String(boxColor))}; border-radius:${forgeHtmlEscape(String(radius))}px; ` + + 'color:#e8eaf0; padding:24px; width:100%; max-width:min(560px, 90%); max-height:90%; overflow:auto; box-sizing:border-box;'; + const childHtml = forgeRenderChildren(el, gameData, childrenMap, ctx); + const wrapperClassAttr = wrapperClass ? `class="${wrapperClass}" ` : ''; return ( - '
    ' + - '
    ' + childHtml + '
    ' + - '
    ' + `
    ` + + `
    ${childHtml}
    ` + + '
    ' ); } if (typeof module !== 'undefined' && module.exports) { module.exports = { forgeRenderOverlay }; - var renderMod = require('./render-element.js'); - ["forgeVisibleAttrs", "forgeStyleString", "forgeHtmlEscape", "forgeRenderChildren"].forEach(function (name) { + const renderMod = require('./render-element.js'); + ['forgeVisibleAttrs', 'forgeStyleString', 'forgeHtmlEscape', 'forgeRenderChildren'].forEach((name) => { global[name] = global[name] || renderMod[name]; }); } diff --git a/static/js/play/offline/render-repeater.js b/static/js/play/offline/render-repeater.js index 0db08a9d..981f2817 100644 --- a/static/js/play/offline/render-repeater.js +++ b/static/js/play/offline/render-repeater.js @@ -4,75 +4,71 @@ // d'un écran-modèle d'élément de jeu réutilisable, précalculé une fois à // l'export) au lieu de screens/element_types/load_template_tree.py. function forgeRenderRepeater(el, meta, gameData, childrenMap, ctx, parentFlexDirection) { - var style = forgeStyleString(el, parentFlexDirection, el.widget) + " overflow:auto;"; - var attrsRaw = el.attributes || {}; - var definitionId = attrsRaw._definition_id; - var definitionAttr = definitionId ? ' data-definition-id="' + forgeHtmlEscape(String(definitionId)) + '"' : ""; - var templateTypeId = attrsRaw._template_type_id; - var template = forgeApplyCtx(el.content || "", ctx); - var children = (childrenMap && childrenMap[el.id]) || []; + const style = `${forgeStyleString(el, parentFlexDirection, el.widget)} overflow:auto;`; + const attrsRaw = el.attributes || {}; + let definitionId = attrsRaw._definition_id; + const definitionAttr = definitionId ? ` data-definition-id="${forgeHtmlEscape(String(definitionId))}"` : ''; + const templateTypeId = attrsRaw._template_type_id; + const template = forgeApplyCtx(el.content || '', ctx); + const children = (childrenMap && childrenMap[el.id]) || []; if (!definitionId) { - return '
    Répéteur : choisis un objet de données dans les propriétés.
    '; + return `
    Répéteur : choisis un objet de données dans les propriétés.
    `; } definitionId = String(definitionId); - var fieldsMetaForDef = gameData.fields_meta && gameData.fields_meta[definitionId]; + const fieldsMetaForDef = gameData.fields_meta && gameData.fields_meta[definitionId]; if (!fieldsMetaForDef) { - return '
    Objet introuvable — a-t-il été supprimé ?
    '; + return `
    Objet introuvable — a-t-il été supprimé ?
    `; } - var rows = gameData.data[definitionId] || []; + let rows = gameData.data[definitionId] || []; rows = forgeFilterRepeaterRows(gameData, definitionId, rows, attrsRaw); - var templateTree = null; + let templateTree = null; if (templateTypeId) { templateTree = gameData.element_type_templates && gameData.element_type_templates[String(templateTypeId)]; } - var items = rows.map(function (row) { - var rowCtx = Object.assign({}, ctx || {}); + const items = rows.map((row) => { + const rowCtx = { ...ctx || {} }; // gameData.data est déjà indexé par le nom D'AFFICHAGE du champ (voir // full_game_payload.py), jamais par sa colonne SQL — row[f.name] lit // donc directement la bonne valeur, y compris pour un champ "relation" // (voir filter-repeater-rows.js pour le détail de ce piège). - fieldsMetaForDef.forEach(function (f) { - var v = row[f.name]; - rowCtx[f.name] = v === null || v === undefined ? "" : String(v); + fieldsMetaForDef.forEach((f) => { + const v = row[f.name]; + rowCtx[f.name] = v === null || v === undefined ? '' : String(v); }); - var inner; + let inner; if (templateTree) { - inner = templateTree.top.map(function (c) { - return forgeRenderElementHtml(c, gameData, templateTree.children_map, rowCtx); - }).join(""); + inner = templateTree.top.map((c) => forgeRenderElementHtml(c, gameData, templateTree.children_map, rowCtx)).join(''); } else if (children.length) { - inner = children.map(function (c) { - return forgeRenderElementHtml(c, gameData, childrenMap, rowCtx); - }).join(""); + inner = children.map((c) => forgeRenderElementHtml(c, gameData, childrenMap, rowCtx)).join(''); } else { - var line = template; - Object.keys(rowCtx).forEach(function (fname) { - if (fname === "_forge_play_mode") return; - line = line.split("{{" + fname + "}}").join(rowCtx[fname]); + let line = template; + Object.keys(rowCtx).forEach((fname) => { + if (fname === '_forge_play_mode') return; + line = line.split(`{{${fname}}}`).join(rowCtx[fname]); }); inner = forgeHtmlEscape(line); } - return '
    ' + inner + '
    '; + return `
    ${inner}
    `; }); - var emptyMsg = attrsRaw._filtre_champ ? "Aucune ligne ne correspond au filtre réglé." : "Aucune donnée dans cet objet pour l'instant."; - var innerAll = items.length ? items.join("") : "" + emptyMsg + ""; - return '
    ' + innerAll + '
    '; + const emptyMsg = attrsRaw._filtre_champ ? 'Aucune ligne ne correspond au filtre réglé.' : "Aucune donnée dans cet objet pour l'instant."; + const innerAll = items.length ? items.join('') : `${emptyMsg}`; + return `
    ${innerAll}
    `; } if (typeof module !== 'undefined' && module.exports) { module.exports = { forgeRenderRepeater }; - var renderMod = require('./render-element.js'); - ["forgeStyleString", "forgeHtmlEscape", "forgeAutoId", "forgeApplyCtx", "forgeRenderElementHtml"].forEach(function (name) { + const renderMod = require('./render-element.js'); + ['forgeStyleString', 'forgeHtmlEscape', 'forgeAutoId', 'forgeApplyCtx', 'forgeRenderElementHtml'].forEach((name) => { global[name] = global[name] || renderMod[name]; }); - var filterMod = require('./filter-repeater-rows.js'); + const filterMod = require('./filter-repeater-rows.js'); global.forgeFilterRepeaterRows = global.forgeFilterRepeaterRows || filterMod.forgeFilterRepeaterRows; } diff --git a/static/js/play/offline/render-special-widgets.js b/static/js/play/offline/render-special-widgets.js index c3994994..6b15a909 100644 --- a/static/js/play/offline/render-special-widgets.js +++ b/static/js/play/offline/render-special-widgets.js @@ -9,57 +9,56 @@ // forgeParentFlexDirection/forgeRenderChildren), chargé avant ce fichier. function forgeRenderCheckboxOrRadio(el, meta, gameData, childrenMap, ctx, parentFlexDirection) { - var inputType = el.widget === "case_a_cocher" ? "checkbox" : "radio"; - var attrs = forgeVisibleAttrs(el, meta, ctx); + const inputType = el.widget === 'case_a_cocher' ? 'checkbox' : 'radio'; + const attrs = forgeVisibleAttrs(el, meta, ctx); attrs.type = inputType; - var style = forgeStyleString(el, parentFlexDirection, el.widget) + " display:flex; align-items:center; gap:8px;"; - var content = forgeApplyCtx(el.content || "", ctx); - return ''; + const style = `${forgeStyleString(el, parentFlexDirection, el.widget)} display:flex; align-items:center; gap:8px;`; + const content = forgeApplyCtx(el.content || '', ctx); + return ``; } function forgeRenderSelect(el, meta, gameData, childrenMap, ctx, parentFlexDirection) { - var outerAttrs = forgeVisibleAttrs(el, meta, ctx); - var bulmaClasses = outerAttrs.class || ""; - var selectAttrs = {}, wrapperAttrs = {}; - Object.keys(outerAttrs).forEach(function (k) { - if (k === "id" || k === "data-element-id" || k === "data-anim-target") wrapperAttrs[k] = outerAttrs[k]; - else if (k !== "class") selectAttrs[k] = outerAttrs[k]; + const outerAttrs = forgeVisibleAttrs(el, meta, ctx); + const bulmaClasses = outerAttrs.class || ''; + const selectAttrs = {}; const + wrapperAttrs = {}; + Object.keys(outerAttrs).forEach((k) => { + if (k === 'id' || k === 'data-element-id' || k === 'data-anim-target') wrapperAttrs[k] = outerAttrs[k]; + else if (k !== 'class') selectAttrs[k] = outerAttrs[k]; }); - var style = forgeStyleString(el, parentFlexDirection, el.widget) + " display:flex;"; - var content = forgeApplyCtx(el.content || "", ctx); - var options = content.split("\n").map(function (o) { return o.trim(); }).filter(Boolean); - var optsHtml = options.map(function (o) { - var esc = forgeHtmlEscape(o); - return ''; - }).join(""); - var selectHtml = ''; - var selectWrapClass = forgeHtmlEscape(("select is-fullwidth " + bulmaClasses).trim()); - return '
    ' + selectHtml + '
    '; + const style = `${forgeStyleString(el, parentFlexDirection, el.widget)} display:flex;`; + const content = forgeApplyCtx(el.content || '', ctx); + const options = content.split('\n').map((o) => o.trim()).filter(Boolean); + const optsHtml = options.map((o) => { + const esc = forgeHtmlEscape(o); + return ``; + }).join(''); + const selectHtml = ``; + const selectWrapClass = forgeHtmlEscape((`select is-fullwidth ${bulmaClasses}`).trim()); + return `
    ${selectHtml}
    `; } function forgeRenderFieldset(el, meta, gameData, childrenMap, ctx, parentFlexDirection) { - var attrs = forgeVisibleAttrs(el, meta, ctx); - var style = forgeStyleString(el, parentFlexDirection, el.widget); - var content = forgeApplyCtx(el.content || "", ctx) || "Groupe de champs"; - var childHtml = forgeRenderChildren(el, gameData, childrenMap, ctx); - return '
    ' + forgeHtmlEscape(content) + '' + childHtml + '
    '; + const attrs = forgeVisibleAttrs(el, meta, ctx); + const style = forgeStyleString(el, parentFlexDirection, el.widget); + const content = forgeApplyCtx(el.content || '', ctx) || 'Groupe de champs'; + const childHtml = forgeRenderChildren(el, gameData, childrenMap, ctx); + return `
    ${forgeHtmlEscape(content)}${childHtml}
    `; } function forgeRenderTable(el, meta, gameData, childrenMap, ctx, parentFlexDirection) { - var attrs = forgeVisibleAttrs(el, meta, ctx); - var headerRow = ["1", "true", "on"].indexOf((el.attributes || {})._header_row) !== -1; - var content = forgeApplyCtx(el.content || "", ctx); - var style = forgeStyleString(el, parentFlexDirection, el.widget); - var rows = content.split("\n").filter(function (r) { return r.trim(); }); - var htmlRows = rows.map(function (r, i) { - var cells = r.split(";"); - var cellTag = (headerRow && i === 0) ? "th" : "td"; - var cellsHtml = cells.map(function (c) { - return "<" + cellTag + ">" + forgeHtmlEscape(c.trim()) + ""; - }).join(""); - return "" + cellsHtml + ""; - }).join(""); - return '' + htmlRows + '
    '; + const attrs = forgeVisibleAttrs(el, meta, ctx); + const headerRow = ['1', 'true', 'on'].indexOf((el.attributes || {})._header_row) !== -1; + const content = forgeApplyCtx(el.content || '', ctx); + const style = forgeStyleString(el, parentFlexDirection, el.widget); + const rows = content.split('\n').filter((r) => r.trim()); + const htmlRows = rows.map((r, i) => { + const cells = r.split(';'); + const cellTag = (headerRow && i === 0) ? 'th' : 'td'; + const cellsHtml = cells.map((c) => `<${cellTag}>${forgeHtmlEscape(c.trim())}`).join(''); + return `${cellsHtml}`; + }).join(''); + return `${htmlRows}
    `; } function forgeRenderIcone(el, meta, gameData, childrenMap, ctx, parentFlexDirection) { @@ -67,12 +66,12 @@ function forgeRenderIcone(el, meta, gameData, childrenMap, ctx, parentFlexDirect // catalogue curaté (screens/widgets/fontawesome_icons.py) : une valeur // invalide ne peut être enregistrée que depuis l'éditeur, qui la valide // déjà à la sauvegarde — un jeu EXPORTÉ n'en produit jamais. - var rawAttrs = el.attributes || {}; - var iconSlug = rawAttrs._icon_slug || "star"; - var attrs = forgeVisibleAttrs(el, meta, ctx); - var existingClass = attrs.class || ""; + const rawAttrs = el.attributes || {}; + const iconSlug = rawAttrs._icon_slug || 'star'; + const attrs = forgeVisibleAttrs(el, meta, ctx); + const existingClass = attrs.class || ''; delete attrs.class; - attrs.class = (existingClass + " icon-svg").trim(); + attrs.class = (`${existingClass} icon-svg`).trim(); // data: URI pré-calculée à l'export (voir gameData.icon_data_uris, // publish/build_scorm_package.py::_build_icon_data_uris) — jamais un // chemin de fichier, même relatif : Firefox traite chaque ressource @@ -84,49 +83,50 @@ function forgeRenderIcone(el, meta, gameData, childrenMap, ctx, parentFlexDirect // devrait pas arriver : _collect_icon_slugs scanne tous les widgets // "icone", posés directement ou nichés dans un élément de jeu // réutilisable) — au moins un lien exploitable plutôt qu'un vide. - var iconUrl = (gameData.icon_data_uris && gameData.icon_data_uris[iconSlug]) || ("icons/" + iconSlug + ".svg"); - var style = forgeStyleString(el, parentFlexDirection, el.widget) + " --icon-url:url('" + iconUrl + "');"; + const iconUrl = (gameData.icon_data_uris && gameData.icon_data_uris[iconSlug]) || (`icons/${iconSlug}.svg`); + const style = `${forgeStyleString(el, parentFlexDirection, el.widget)} --icon-url:url('${iconUrl}');`; // aria-hidden (RGAA/WCAG 1.1.1) : une icône seule (pas de champ de // description dédié dans l'éditeur) est traitée comme purement // décorative — jamais annoncée par un lecteur d'écran, comme le nom du // slug FontAwesome ("star") n'aurait aucun sens lu à voix haute. - if (!("aria-hidden" in attrs)) attrs["aria-hidden"] = "true"; - return ""; + if (!('aria-hidden' in attrs)) attrs['aria-hidden'] = 'true'; + return ``; } function forgeRenderOnglets(el, meta, gameData, childrenMap, ctx, parentFlexDirection) { - var tabs = (childrenMap && childrenMap[el.id]) || []; - var attrs = forgeVisibleAttrs(el, meta, ctx); - var tabsExtraClasses = attrs.class || ""; + const tabs = (childrenMap && childrenMap[el.id]) || []; + const attrs = forgeVisibleAttrs(el, meta, ctx); + const tabsExtraClasses = attrs.class || ''; delete attrs.class; - var style = forgeStyleString(el, parentFlexDirection, el.widget) + " display:flex; flex-direction:column;"; - var groupId = forgeAutoId(el); + const style = `${forgeStyleString(el, parentFlexDirection, el.widget)} display:flex; flex-direction:column;`; + const groupId = forgeAutoId(el); if (!tabs.length) { - return '
    Onglets — ajoute au moins un onglet dans ses réglages.
    '; + return `
    Onglets — ajoute au moins un onglet dans ses réglages.
    `; } - var flexDir = forgeParentFlexDirection(el); - var barItems = [], panels = []; - tabs.forEach(function (tab, i) { - var label = tab.name || ("Onglet " + (i + 1)); - var active = i === 0; - var tabHtml = forgeRenderElementHtml(tab, gameData, childrenMap, ctx, flexDir); - var targetId = "tabpanel-" + tab.id; + const flexDir = forgeParentFlexDirection(el); + const barItems = []; const + panels = []; + tabs.forEach((tab, i) => { + const label = tab.name || (`Onglet ${i + 1}`); + const active = i === 0; + const tabHtml = forgeRenderElementHtml(tab, gameData, childrenMap, ctx, flexDir); + const targetId = `tabpanel-${tab.id}`; barItems.push( - '
  • ' + forgeHtmlEscape(String(label)) + '
  • ' + `
  • ${forgeHtmlEscape(String(label))}
  • `, ); - var hiddenStyle = active ? "" : ' style="display:none;"'; - panels.push('
    ' + tabHtml + '
    '); + const hiddenStyle = active ? '' : ' style="display:none;"'; + panels.push(`
    ${tabHtml}
    `); }); - var tabsClass = forgeHtmlEscape(("tabs " + tabsExtraClasses).trim()); + const tabsClass = forgeHtmlEscape((`tabs ${tabsExtraClasses}`).trim()); return ( - '
    ' + - '
      ' + barItems.join("") + '
    ' + - '
    ' + panels.join("") + '
    ' + - '
    ' + `
    ` + + `
      ${barItems.join('')}
    ` + + `
    ${panels.join('')}
    ` + + '
    ' ); } @@ -136,27 +136,32 @@ function forgeRenderOnglets(el, meta, gameData, childrenMap, ctx, parentFlexDire // travail est fait UNE fois, à la génération du paquet, jamais à chaque // rendu côté client. function forgeRenderPersonnage(el, meta, gameData, childrenMap, ctx, parentFlexDirection) { - var attrs = forgeVisibleAttrs(el, meta, ctx); - attrs["data-personnage"] = "1"; - var animations = gameData.personnage_animations && gameData.personnage_animations[String(el.id)]; - var frames = animations ? (animations.idle || animations[Object.keys(animations)[0]]) : null; - var idleFrame = frames && frames.length ? frames[0] : ""; + const attrs = forgeVisibleAttrs(el, meta, ctx); + attrs['data-personnage'] = '1'; + const animations = gameData.personnage_animations && gameData.personnage_animations[String(el.id)]; + const frames = animations ? (animations.idle || animations[Object.keys(animations)[0]]) : null; + const idleFrame = frames && frames.length ? frames[0] : ''; if (idleFrame) attrs.src = idleFrame; // alt (RGAA/WCAG 1.1.1) : voir render-element.js pour le même défaut // décoratif sur le widget "image" générique. - if (!("alt" in attrs)) attrs.alt = ""; - var style = forgeStyleString(el, parentFlexDirection, el.widget); - return ""; + if (!('alt' in attrs)) attrs.alt = ''; + const style = forgeStyleString(el, parentFlexDirection, el.widget); + return ``; } if (typeof module !== 'undefined' && module.exports) { module.exports = { - forgeRenderCheckboxOrRadio, forgeRenderSelect, forgeRenderFieldset, forgeRenderTable, - forgeRenderIcone, forgeRenderOnglets, forgeRenderPersonnage, + forgeRenderCheckboxOrRadio, + forgeRenderSelect, + forgeRenderFieldset, + forgeRenderTable, + forgeRenderIcone, + forgeRenderOnglets, + forgeRenderPersonnage, }; - var renderMod = require('./render-element.js'); - ["forgeVisibleAttrs", "forgeStyleString", "forgeAttrString", "forgeApplyCtx", "forgeHtmlEscape", - "forgeAutoId", "forgeParentFlexDirection", "forgeRenderChildren", "forgeRenderElementHtml"].forEach(function (name) { - global[name] = global[name] || renderMod[name]; - }); + const renderMod = require('./render-element.js'); + ['forgeVisibleAttrs', 'forgeStyleString', 'forgeAttrString', 'forgeApplyCtx', 'forgeHtmlEscape', + 'forgeAutoId', 'forgeParentFlexDirection', 'forgeRenderChildren', 'forgeRenderElementHtml'].forEach((name) => { + global[name] = global[name] || renderMod[name]; + }); } diff --git a/static/js/play/offline/scorm-api.js b/static/js/play/offline/scorm-api.js index 36c588cd..d4cb3dd0 100644 --- a/static/js/play/offline/scorm-api.js +++ b/static/js/play/offline/scorm-api.js @@ -16,68 +16,73 @@ function forgeScormFindApi(win, triesLeft) { return null; } -var forgeScormApi = null; -var forgeScormLastSync = null; // évite de spammer LMSCommit() si rien n'a changé +let forgeScormApi = null; +let forgeScormLastSync = null; // évite de spammer LMSCommit() si rien n'a changé function forgeScormInit() { forgeScormApi = forgeScormFindApi(window, 10); if (!forgeScormApi) return; // ouvert hors LMS (test local) : dégrade en silence - forgeScormApi.LMSInitialize(""); + forgeScormApi.LMSInitialize(''); // cmi.core.score.min/max (voir publish/build_scorm_package.py, // db/dialogue_lines.py::sum_question_rewards) : sans eux, le LMS n'a que le score BRUT // (cmi.core.score.raw, un total de points sans barème) et l'affiche // parfois à tort avec un "%" — en fournissant aussi min/max une seule // fois ici, le LMS peut calculer raw/max lui-même, un vrai pourcentage. // Omis si le jeu n'a aucune question de quiz (max=0, rien à barémer). - var maxScore = typeof window !== "undefined" ? window.FORGE_MAX_QUIZ_SCORE : 0; + const maxScore = typeof window !== 'undefined' ? window.FORGE_MAX_QUIZ_SCORE : 0; if (maxScore) { - forgeScormApi.LMSSetValue("cmi.core.score.min", "0"); - forgeScormApi.LMSSetValue("cmi.core.score.max", String(maxScore)); + forgeScormApi.LMSSetValue('cmi.core.score.min', '0'); + forgeScormApi.LMSSetValue('cmi.core.score.max', String(maxScore)); } } // Statut Forge (voir db/constants.py, SCORM_STATUS_KEYS) -> vocabulaire // figé cmi.core.lesson_status (SCORM 1.2) : pas de mapping 1-pour-1 pour // "en_cours" (SCORM n'a pas d'équivalent "en cours" hors "incomplete"). -var FORGE_TO_SCORM_STATUS = { - non_commence: "not attempted", en_cours: "incomplete", termine: "completed", - reussi: "passed", echoue: "failed", +const FORGE_TO_SCORM_STATUS = { + non_commence: 'not attempted', + en_cours: 'incomplete', + termine: 'completed', + reussi: 'passed', + echoue: 'failed', }; function forgeScormSyncScore(gameData) { if (!forgeScormApi || !gameData || !gameData.scoring) return; - var score = gameData.scoring.score || 0; - var status = FORGE_TO_SCORM_STATUS[gameData.scoring.status] || "incomplete"; - var key = score + "|" + status; + const score = gameData.scoring.score || 0; + const status = FORGE_TO_SCORM_STATUS[gameData.scoring.status] || 'incomplete'; + const key = `${score}|${status}`; if (key === forgeScormLastSync) return; forgeScormLastSync = key; - forgeScormApi.LMSSetValue("cmi.core.score.raw", String(score)); - forgeScormApi.LMSSetValue("cmi.core.lesson_status", status); - forgeScormApi.LMSCommit(""); + forgeScormApi.LMSSetValue('cmi.core.score.raw', String(score)); + forgeScormApi.LMSSetValue('cmi.core.lesson_status', status); + forgeScormApi.LMSCommit(''); } function forgeScormFinish() { if (!forgeScormApi) return; - forgeScormApi.LMSFinish(""); + forgeScormApi.LMSFinish(''); } -if (typeof window !== "undefined") { - window.addEventListener("load", forgeScormInit); - window.addEventListener("beforeunload", forgeScormFinish); +if (typeof window !== 'undefined') { + window.addEventListener('load', forgeScormInit); + window.addEventListener('beforeunload', forgeScormFinish); // gameData est déjà en mémoire (window.FORGE_OFFLINE) — pas de fetch à // attendre, un intervalle court suffit à refléter score/statut sans // devoir faire dépendre bindings.js de ce fichier optionnel. - var forgeScormSyncTimer = setInterval(function () { - if (typeof gameData !== "undefined") forgeScormSyncScore(gameData); + const forgeScormSyncTimer = setInterval(() => { + if (typeof gameData !== 'undefined') forgeScormSyncScore(gameData); }, 2000); // .unref() n'existe pas sur la valeur renvoyée par setInterval() d'un // navigateur (juste un nombre) — seulement sous Node (static/js/play/ // offline/__tests__/) : sans ça, `node --test` ne se termine jamais. - if (forgeScormSyncTimer && typeof forgeScormSyncTimer.unref === "function") { + if (forgeScormSyncTimer && typeof forgeScormSyncTimer.unref === 'function') { forgeScormSyncTimer.unref(); } } -if (typeof module !== "undefined" && module.exports) { - module.exports = { forgeScormFindApi, forgeScormInit, forgeScormSyncScore, forgeScormFinish, FORGE_TO_SCORM_STATUS }; +if (typeof module !== 'undefined' && module.exports) { + module.exports = { + forgeScormFindApi, forgeScormInit, forgeScormSyncScore, forgeScormFinish, FORGE_TO_SCORM_STATUS, + }; } diff --git a/static/js/play/offline/scorm2004-api.js b/static/js/play/offline/scorm2004-api.js index 0291e603..d556da73 100644 --- a/static/js/play/offline/scorm2004-api.js +++ b/static/js/play/offline/scorm2004-api.js @@ -24,21 +24,21 @@ function forgeScorm2004FindApi(win, triesLeft) { return null; } -var forgeScorm2004Api = null; -var forgeScorm2004LastSync = null; // évite de spammer Commit() si rien n'a changé +let forgeScorm2004Api = null; +let forgeScorm2004LastSync = null; // évite de spammer Commit() si rien n'a changé function forgeScorm2004Init() { forgeScorm2004Api = forgeScorm2004FindApi(window, 10); if (!forgeScorm2004Api) return; // ouvert hors LMS (test local) : dégrade en silence - forgeScorm2004Api.Initialize(""); + forgeScorm2004Api.Initialize(''); // cmi.score.min/max (voir static/js/play/offline/scorm-api.js pour le // même réglage côté 1.2) : cmi.score.scaled (forgeScorm2004SyncScore) // couvre déjà le pourcentage correctement, mais min/max reste utile // pour tout LMS qui affiche plutôt raw/max. - var maxScore = typeof window !== "undefined" ? window.FORGE_MAX_QUIZ_SCORE : 0; + const maxScore = typeof window !== 'undefined' ? window.FORGE_MAX_QUIZ_SCORE : 0; if (maxScore) { - forgeScorm2004Api.SetValue("cmi.score.min", "0"); - forgeScorm2004Api.SetValue("cmi.score.max", String(maxScore)); + forgeScorm2004Api.SetValue('cmi.score.min', '0'); + forgeScorm2004Api.SetValue('cmi.score.max', String(maxScore)); } } @@ -46,33 +46,33 @@ function forgeScorm2004Init() { // (completion_status, success_status) SCORM 2004 — contrairement à la // 1.2, "echoue" reste "completed" (l'apprenant a fini la formation) avec // success_status="failed", au lieu de retomber en "incomplete". -var FORGE_TO_SCORM2004_STATUS = { - non_commence: { completion: "not attempted", success: "unknown" }, - en_cours: { completion: "incomplete", success: "unknown" }, - termine: { completion: "completed", success: "unknown" }, - reussi: { completion: "completed", success: "passed" }, - echoue: { completion: "completed", success: "failed" }, +const FORGE_TO_SCORM2004_STATUS = { + non_commence: { completion: 'not attempted', success: 'unknown' }, + en_cours: { completion: 'incomplete', success: 'unknown' }, + termine: { completion: 'completed', success: 'unknown' }, + reussi: { completion: 'completed', success: 'passed' }, + echoue: { completion: 'completed', success: 'failed' }, }; function forgeScorm2004SyncScore(gameData) { if (!forgeScorm2004Api || !gameData || !gameData.scoring) return; - var score = gameData.scoring.score || 0; - var statuses = FORGE_TO_SCORM2004_STATUS[gameData.scoring.status] || FORGE_TO_SCORM2004_STATUS.en_cours; - var key = score + "|" + statuses.completion + "|" + statuses.success; + const score = gameData.scoring.score || 0; + const statuses = FORGE_TO_SCORM2004_STATUS[gameData.scoring.status] || FORGE_TO_SCORM2004_STATUS.en_cours; + const key = `${score}|${statuses.completion}|${statuses.success}`; if (key === forgeScorm2004LastSync) return; forgeScorm2004LastSync = key; - forgeScorm2004Api.SetValue("cmi.score.raw", String(score)); + forgeScorm2004Api.SetValue('cmi.score.raw', String(score)); // cmi.score.scaled (-1..1, ici toujours 0..1) : uniquement dérivable du // taux de bonnes réponses au quiz (voir dialogue-box-controller.js), // jamais de gameData.scoring.score qui n'est qu'un total de points sans // maximum connu — omis si aucune question n'a encore été répondue. - if (typeof window !== "undefined" && window.forgeQuizTotalAnswered) { - var scaled = window.forgeQuizCorrectAnswered / window.forgeQuizTotalAnswered; - forgeScorm2004Api.SetValue("cmi.score.scaled", String(scaled)); + if (typeof window !== 'undefined' && window.forgeQuizTotalAnswered) { + const scaled = window.forgeQuizCorrectAnswered / window.forgeQuizTotalAnswered; + forgeScorm2004Api.SetValue('cmi.score.scaled', String(scaled)); } - forgeScorm2004Api.SetValue("cmi.completion_status", statuses.completion); - forgeScorm2004Api.SetValue("cmi.success_status", statuses.success); - forgeScorm2004Api.Commit(""); + forgeScorm2004Api.SetValue('cmi.completion_status', statuses.completion); + forgeScorm2004Api.SetValue('cmi.success_status', statuses.success); + forgeScorm2004Api.Commit(''); } // cmi.interactions.n.* (voir dialogue-box-controller.js::forgeQuizBoxAnswer, @@ -90,47 +90,60 @@ function forgeScorm2004SyncScore(gameData) { // silencieusement (SetValue échoue sans erreur visible : le champ reste // vide). "…T19:49:39" (sans les millisecondes ni le "Z") passe partout. function forgeScorm2004Timestamp() { - return new Date().toISOString().replace(/\.\d+Z$/, ""); + return new Date().toISOString().replace(/\.\d+Z$/, ''); } -function forgeScorm2004NotifyQuestionAnswered(dialogueId, objectName, questionIndex, questionText, correct, choiceIndex, correctIndex) { +function forgeScorm2004NotifyQuestionAnswered( + dialogueId, + objectName, + questionIndex, + questionText, + correct, + choiceIndex, + correctIndex, +) { if (!forgeScorm2004Api) return; - var n = parseInt(forgeScorm2004Api.GetValue("cmi.interactions._count"), 10); - if (isNaN(n)) n = 0; - var prefix = "cmi.interactions." + n + "."; - forgeScorm2004Api.SetValue(prefix + "id", "dialogue:" + dialogueId + ":question:" + questionIndex); - forgeScorm2004Api.SetValue(prefix + "type", "choice"); - forgeScorm2004Api.SetValue(prefix + "timestamp", forgeScorm2004Timestamp()); - forgeScorm2004Api.SetValue(prefix + "description", "{fr-FR}" + (questionText || "")); - forgeScorm2004Api.SetValue(prefix + "learner_response", String(choiceIndex)); - forgeScorm2004Api.SetValue(prefix + "result", correct ? "correct" : "incorrect"); - forgeScorm2004Api.SetValue(prefix + "correct_responses.0.pattern", String(correctIndex)); - forgeScorm2004Api.Commit(""); + let n = parseInt(forgeScorm2004Api.GetValue('cmi.interactions._count'), 10); + if (Number.isNaN(n)) n = 0; + const prefix = `cmi.interactions.${n}.`; + forgeScorm2004Api.SetValue(`${prefix}id`, `dialogue:${dialogueId}:question:${questionIndex}`); + forgeScorm2004Api.SetValue(`${prefix}type`, 'choice'); + forgeScorm2004Api.SetValue(`${prefix}timestamp`, forgeScorm2004Timestamp()); + forgeScorm2004Api.SetValue(`${prefix}description`, `{fr-FR}${questionText || ''}`); + forgeScorm2004Api.SetValue(`${prefix}learner_response`, String(choiceIndex)); + forgeScorm2004Api.SetValue(`${prefix}result`, correct ? 'correct' : 'incorrect'); + forgeScorm2004Api.SetValue(`${prefix}correct_responses.0.pattern`, String(correctIndex)); + forgeScorm2004Api.Commit(''); } function forgeScorm2004Finish() { if (!forgeScorm2004Api) return; - forgeScorm2004Api.Terminate(""); + forgeScorm2004Api.Terminate(''); } -if (typeof window !== "undefined") { - window.addEventListener("load", forgeScorm2004Init); - window.addEventListener("beforeunload", forgeScorm2004Finish); - var forgeScorm2004SyncTimer = setInterval(function () { - if (typeof gameData !== "undefined") forgeScorm2004SyncScore(gameData); +if (typeof window !== 'undefined') { + window.addEventListener('load', forgeScorm2004Init); + window.addEventListener('beforeunload', forgeScorm2004Finish); + const forgeScorm2004SyncTimer = setInterval(() => { + if (typeof gameData !== 'undefined') forgeScorm2004SyncScore(gameData); }, 2000); // .unref() n'existe pas sur la valeur renvoyée par setInterval() d'un // navigateur (juste un nombre) — seulement sous Node (static/js/play/ // offline/__tests__/) : sans ça, `node --test` ne se termine jamais // (l'intervalle garde le process vivant indéfiniment). - if (forgeScorm2004SyncTimer && typeof forgeScorm2004SyncTimer.unref === "function") { + if (forgeScorm2004SyncTimer && typeof forgeScorm2004SyncTimer.unref === 'function') { forgeScorm2004SyncTimer.unref(); } } -if (typeof module !== "undefined" && module.exports) { +if (typeof module !== 'undefined' && module.exports) { module.exports = { - forgeScorm2004FindApi, forgeScorm2004Init, forgeScorm2004SyncScore, forgeScorm2004Finish, - forgeScorm2004NotifyQuestionAnswered, forgeScorm2004Timestamp, FORGE_TO_SCORM2004_STATUS, + forgeScorm2004FindApi, + forgeScorm2004Init, + forgeScorm2004SyncScore, + forgeScorm2004Finish, + forgeScorm2004NotifyQuestionAnswered, + forgeScorm2004Timestamp, + FORGE_TO_SCORM2004_STATUS, }; } diff --git a/static/js/play/offline/visibility-condition.js b/static/js/play/offline/visibility-condition.js index 158ba3bc..e35bdda8 100644 --- a/static/js/play/offline/visibility-condition.js +++ b/static/js/play/offline/visibility-condition.js @@ -11,38 +11,38 @@ // serveur : sans ça, tous les exemplaires d'un même modèle de ligne // évalueraient la MÊME ligne au lieu de chacun la sienne). function forgeIsElementVisibleOffline(gameData, attrs, ctx) { - var mode = attrs._visibilite_cond_mode; - if (mode !== "variable" && mode !== "objet") return true; - var operator = attrs._visibilite_cond_operateur || "egal"; - var expected = forgeResolveFilterValue(gameData, attrs._visibilite_cond_valeur || ""); + const mode = attrs._visibilite_cond_mode; + if (mode !== 'variable' && mode !== 'objet') return true; + const operator = attrs._visibilite_cond_operateur || 'egal'; + const expected = forgeResolveFilterValue(gameData, attrs._visibilite_cond_valeur || ''); - if (mode === "variable") { - var varName = attrs._visibilite_cond_variable; + if (mode === 'variable') { + const varName = attrs._visibilite_cond_variable; if (!varName) return true; - var variable = gameData.variables && gameData.variables[varName]; + const variable = gameData.variables && gameData.variables[varName]; if (!variable) return true; // variable supprimée depuis : ne bloque jamais l'affichage - var value = variable.value; - var path = attrs._visibilite_cond_variable_chemin; + let { value } = variable; + const path = attrs._visibilite_cond_variable_chemin; if (path) value = forgeResolveVariablePath(value, path); - return compareValues(value, operator, expected, variable.type || "texte"); + return compareValues(value, operator, expected, variable.type || 'texte'); } - var definitionId = attrs._visibilite_cond_definition_id; - var fieldName = attrs._visibilite_cond_champ; + let definitionId = attrs._visibilite_cond_definition_id; + const fieldName = attrs._visibilite_cond_champ; if (!definitionId || !fieldName) return true; definitionId = String(definitionId); - var fieldsMetaForDef = gameData.fields_meta && gameData.fields_meta[definitionId]; + const fieldsMetaForDef = gameData.fields_meta && gameData.fields_meta[definitionId]; if (!fieldsMetaForDef) return true; - var field = fieldsMetaForDef.find(function (f) { return f.name === fieldName; }); - var fieldType = field ? field.type : "texte"; + const field = fieldsMetaForDef.find((f) => f.name === fieldName); + const fieldType = field ? field.type : 'texte'; if (ctx && Object.prototype.hasOwnProperty.call(ctx, fieldName)) { return compareValues(ctx[fieldName], operator, expected, fieldType); } - var rows = gameData.data && gameData.data[definitionId]; + const rows = gameData.data && gameData.data[definitionId]; if (!rows || !rows.length) return true; // objet sans donnée pour l'instant : ne bloque pas - var row = rows[0]; // convention "état de partie" : une seule ligne + const row = rows[0]; // convention "état de partie" : une seule ligne // row[fieldName] : gameData.data est déjà indexé par le nom D'AFFICHAGE // du champ (voir full_game_payload.py), jamais par sa colonne SQL. return compareValues(row[fieldName], operator, expected, fieldType); @@ -50,7 +50,7 @@ function forgeIsElementVisibleOffline(gameData, attrs, ctx) { if (typeof module !== 'undefined' && module.exports) { module.exports = { forgeIsElementVisibleOffline }; - var filterMod = require('./filter-repeater-rows.js'); + const filterMod = require('./filter-repeater-rows.js'); global.forgeResolveFilterValue = global.forgeResolveFilterValue || filterMod.forgeResolveFilterValue; global.forgeResolveVariablePath = global.forgeResolveVariablePath || filterMod.forgeResolveVariablePath; global.compareValues = global.compareValues || require('../conditions.js').compareValues; diff --git a/static/js/play/offline/xapi-client.js b/static/js/play/offline/xapi-client.js index e61c6aba..0fb0f6a0 100644 --- a/static/js/play/offline/xapi-client.js +++ b/static/js/play/offline/xapi-client.js @@ -15,15 +15,25 @@ // // Best-effort partout : un LRS injoignable/mal configuré ne doit JAMAIS // bloquer ni ralentir la partie du joueur. +// +// NOSONAR S5332 (toutes occurrences "http://adlnet.gov/..." de ce fichier +// + les 2 assertions de __tests__/xapi-client.test.js) : identifiants du +// vocabulaire xAPI standard ADL, jamais dérérencés/appelés en réseau (de +// simples chaînes comparées/embarquées) — le "http://" fait partie de la +// chaîne fixée par la spec, jamais "https://" (changer casserait +// l'interopérabilité avec n'importe quel LRS). Le VRAI endpoint réseau +// (voir forgeXapiSendStatement plus bas) est toujours `config.endpoint`, +// saisi par le créateur (routes/publish/xapi_settings.py), jamais un +// littéral de ce fichier. // Statut Forge -> verbe xAPI ADL standard, uniquement pour les statuts // qui marquent une VRAIE fin de partie — "non_commence"/"en_cours" ne // génèrent rien ici (bruit inutile pour un suivi volontairement léger, // voir le plan). -var FORGE_TO_XAPI_VERB = { - termine: { id: "http://adlnet.gov/expapi/verbs/completed" }, - reussi: { id: "http://adlnet.gov/expapi/verbs/passed" }, - echoue: { id: "http://adlnet.gov/expapi/verbs/failed" }, +const FORGE_TO_XAPI_VERB = { + termine: { id: 'http://adlnet.gov/expapi/verbs/completed' }, // NOSONAR S5332 + reussi: { id: 'http://adlnet.gov/expapi/verbs/passed' }, // NOSONAR S5332 + echoue: { id: 'http://adlnet.gov/expapi/verbs/failed' }, // NOSONAR S5332 }; // Libellé humain par verbe — l'id xAPI (http://adlnet.gov/expapi/verbs/...) @@ -33,18 +43,18 @@ var FORGE_TO_XAPI_VERB = { // français ?" — un LRS qui préfère le français (ou n'importe quelle // langue ici) affichera la bonne entrée au lieu de rester bloqué sur // l'anglais. -var FORGE_XAPI_VERB_DISPLAY = { - "http://adlnet.gov/expapi/verbs/initialized": { "en-US": "initialized", "fr-FR": "initialisé" }, - "http://adlnet.gov/expapi/verbs/terminated": { "en-US": "terminated", "fr-FR": "quitté" }, - "http://adlnet.gov/expapi/verbs/completed": { "en-US": "completed", "fr-FR": "terminé" }, - "http://adlnet.gov/expapi/verbs/passed": { "en-US": "passed", "fr-FR": "réussi" }, - "http://adlnet.gov/expapi/verbs/failed": { "en-US": "failed", "fr-FR": "échoué" }, - "http://adlnet.gov/expapi/verbs/scored": { "en-US": "scored", "fr-FR": "noté" }, - "http://adlnet.gov/expapi/verbs/attempted": { "en-US": "attempted", "fr-FR": "commencé" }, - "http://adlnet.gov/expapi/verbs/answered": { "en-US": "answered", "fr-FR": "répondu" }, +const FORGE_XAPI_VERB_DISPLAY = { + 'http://adlnet.gov/expapi/verbs/initialized': { 'en-US': 'initialized', 'fr-FR': 'initialisé' }, // NOSONAR S5332 + 'http://adlnet.gov/expapi/verbs/terminated': { 'en-US': 'terminated', 'fr-FR': 'quitté' }, // NOSONAR S5332 + 'http://adlnet.gov/expapi/verbs/completed': { 'en-US': 'completed', 'fr-FR': 'terminé' }, // NOSONAR S5332 + 'http://adlnet.gov/expapi/verbs/passed': { 'en-US': 'passed', 'fr-FR': 'réussi' }, // NOSONAR S5332 + 'http://adlnet.gov/expapi/verbs/failed': { 'en-US': 'failed', 'fr-FR': 'échoué' }, // NOSONAR S5332 + 'http://adlnet.gov/expapi/verbs/scored': { 'en-US': 'scored', 'fr-FR': 'noté' }, // NOSONAR S5332 + 'http://adlnet.gov/expapi/verbs/attempted': { 'en-US': 'attempted', 'fr-FR': 'commencé' }, // NOSONAR S5332 + 'http://adlnet.gov/expapi/verbs/answered': { 'en-US': 'answered', 'fr-FR': 'répondu' }, // NOSONAR S5332 }; -var forgeXapiLastStatusSent = null; // évite de renvoyer le même statement si le statut ne change pas réellement +let forgeXapiLastStatusSent = null; // évite de renvoyer le même statement si le statut ne change pas réellement // Identité de l'apprenant : réutilise l'API SCORM déjà trouvée par // scorm-api.js (window.forgeScormApi, posée sur "load" — voir plus bas, @@ -52,23 +62,23 @@ var forgeXapiLastStatusSent = null; // évite de renvoyer le même statement si // si le paquet tourne dans un LMS ; sinon, un acteur anonyme générique. function forgeXapiActor() { try { - if (typeof forgeScormApi !== "undefined" && forgeScormApi) { - var name = forgeScormApi.LMSGetValue("cmi.core.student_name"); - var id = forgeScormApi.LMSGetValue("cmi.core.student_id"); + if (typeof forgeScormApi !== 'undefined' && forgeScormApi) { + const name = forgeScormApi.LMSGetValue('cmi.core.student_name'); + const id = forgeScormApi.LMSGetValue('cmi.core.student_id'); if (id) { - return { objectType: "Agent", name: name || id, account: { homePage: "urn:forge-engine", name: id } }; + return { objectType: 'Agent', name: name || id, account: { homePage: 'urn:forge-engine', name: id } }; } } } catch (e) { /* API SCORM présente mais qui répond mal — repli silencieux */ } - return { objectType: "Agent", name: "Apprenant", mbox: "mailto:anonymous@forge-engine.local" }; + return { objectType: 'Agent', name: 'Apprenant', mbox: 'mailto:anonymous@forge-engine.local' }; } function forgeXapiObject() { - var config = window.FORGE_XAPI_CONFIG; + const config = window.FORGE_XAPI_CONFIG; return { - objectType: "Activity", + objectType: 'Activity', id: config.activity_id, - definition: { name: { "fr-FR": config.activity_name } }, + definition: { name: { 'fr-FR': config.activity_name } }, }; } @@ -80,24 +90,24 @@ function forgeXapiObject() { // de scène qui a déclenché ce dialogue (voir "ℹ️ Informations") — plus de // "quête" pour le porter. function forgeXapiDialogueObject(dialogueId, objectName) { - var config = window.FORGE_XAPI_CONFIG; + const config = window.FORGE_XAPI_CONFIG; return { - objectType: "Activity", - id: config.activity_id + ":dialogue:" + dialogueId, - definition: { name: { "fr-FR": objectName || "Dialogue" }, type: "http://adlnet.gov/expapi/activities/simulation" }, + objectType: 'Activity', + id: `${config.activity_id}:dialogue:${dialogueId}`, + definition: { name: { 'fr-FR': objectName || 'Dialogue' }, type: 'http://adlnet.gov/expapi/activities/simulation' }, // NOSONAR S5332 }; } function forgeXapiQuestionObject(dialogueId, objectName, questionIndex, questionText) { - var config = window.FORGE_XAPI_CONFIG; + const config = window.FORGE_XAPI_CONFIG; return { - objectType: "Activity", - id: config.activity_id + ":dialogue:" + dialogueId + ":question:" + questionIndex, + objectType: 'Activity', + id: `${config.activity_id}:dialogue:${dialogueId}:question:${questionIndex}`, definition: { - name: { "fr-FR": "Question " + (questionIndex + 1) + " — " + (objectName || "Dialogue") }, - description: { "fr-FR": questionText || "" }, - type: "http://adlnet.gov/expapi/activities/cmi.interaction", - interactionType: "choice", + name: { 'fr-FR': `Question ${questionIndex + 1} — ${objectName || 'Dialogue'}` }, + description: { 'fr-FR': questionText || '' }, + type: 'http://adlnet.gov/expapi/activities/cmi.interaction', // NOSONAR S5332 + interactionType: 'choice', }, }; } @@ -110,27 +120,27 @@ function forgeXapiQuestionObject(dialogueId, objectName, questionIndex, question // (forgeXapiObject), ou une sous-activité quête/question // (forgeXapiQuestObject/forgeXapiQuestionObject) pour un suivi plus fin. function forgeXapiSendStatement(verbId, result, object) { - var config = window.FORGE_XAPI_CONFIG; + const config = window.FORGE_XAPI_CONFIG; if (!config || !config.endpoint) return; - var statement = { + const statement = { actor: forgeXapiActor(), - verb: { id: verbId, display: FORGE_XAPI_VERB_DISPLAY[verbId] || { "en-US": verbId } }, + verb: { id: verbId, display: FORGE_XAPI_VERB_DISPLAY[verbId] || { 'en-US': verbId } }, object: object || forgeXapiObject(), timestamp: new Date().toISOString(), }; if (result) statement.result = result; - var endpoint = config.endpoint.replace(/\/+$/, "") + "/statements"; + const endpoint = `${config.endpoint.replace(/\/+$/, '')}/statements`; try { fetch(endpoint, { - method: "POST", + method: 'POST', headers: { - "Content-Type": "application/json", - "X-Experience-API-Version": "1.0.3", - "Authorization": "Basic " + btoa(config.login + ":" + config.password), + 'Content-Type': 'application/json', + 'X-Experience-API-Version': '1.0.3', + Authorization: `Basic ${btoa(`${config.login}:${config.password}`)}`, }, body: JSON.stringify(statement), - }).catch(function (err) { - console.warn("xAPI: envoi du statement échoué (LRS injoignable ?)", err); + }).catch((err) => { + console.warn('xAPI: envoi du statement échoué (LRS injoignable ?)', err); }); } catch (err) { console.warn("xAPI: impossible d'envoyer le statement", err); @@ -143,8 +153,8 @@ function forgeXapiSendStatement(verbId, result, object) { function forgeXapiNotifyScoreChanged(newScore) { if (!window.FORGE_XAPI_CONFIG) return; forgeXapiSendStatement( - "http://adlnet.gov/expapi/verbs/scored", - { score: { raw: newScore } } + 'http://adlnet.gov/expapi/verbs/scored', // NOSONAR S5332 + { score: { raw: newScore } }, ); } @@ -156,44 +166,51 @@ function forgeXapiNotifyScoreChanged(newScore) { function forgeXapiNotifyDialogueCompleted(dialogueId, objectName) { if (!window.FORGE_XAPI_CONFIG) return; forgeXapiSendStatement( - "http://adlnet.gov/expapi/verbs/completed", - { completion: true }, forgeXapiDialogueObject(dialogueId, objectName) + 'http://adlnet.gov/expapi/verbs/completed', // NOSONAR S5332 + { completion: true }, + forgeXapiDialogueObject(dialogueId, objectName), ); } function forgeXapiNotifyQuestionAnswered(dialogueId, objectName, questionIndex, questionText, correct, scoreAwarded) { if (!window.FORGE_XAPI_CONFIG) return; forgeXapiSendStatement( - "http://adlnet.gov/expapi/verbs/answered", + 'http://adlnet.gov/expapi/verbs/answered', // NOSONAR S5332 { success: correct, score: { raw: scoreAwarded || 0 } }, - forgeXapiQuestionObject(dialogueId, objectName, questionIndex, questionText) + forgeXapiQuestionObject(dialogueId, objectName, questionIndex, questionText), ); } function forgeXapiNotifyStatusChanged(newStatus) { if (!window.FORGE_XAPI_CONFIG) return; - var verb = FORGE_TO_XAPI_VERB[newStatus]; + const verb = FORGE_TO_XAPI_VERB[newStatus]; if (!verb || newStatus === forgeXapiLastStatusSent) return; forgeXapiLastStatusSent = newStatus; forgeXapiSendStatement(verb.id, { completion: true, - success: newStatus !== "echoue", + success: newStatus !== 'echoue', }); } -if (typeof window !== "undefined") { - window.addEventListener("load", function () { - if (window.FORGE_XAPI_CONFIG) forgeXapiSendStatement("http://adlnet.gov/expapi/verbs/initialized"); +if (typeof window !== 'undefined') { + window.addEventListener('load', () => { + if (window.FORGE_XAPI_CONFIG) forgeXapiSendStatement('http://adlnet.gov/expapi/verbs/initialized'); // NOSONAR S5332 }); - window.addEventListener("beforeunload", function () { - if (window.FORGE_XAPI_CONFIG) forgeXapiSendStatement("http://adlnet.gov/expapi/verbs/terminated"); + window.addEventListener('beforeunload', () => { + if (window.FORGE_XAPI_CONFIG) forgeXapiSendStatement('http://adlnet.gov/expapi/verbs/terminated'); // NOSONAR S5332 }); } -if (typeof module !== "undefined" && module.exports) { +if (typeof module !== 'undefined' && module.exports) { module.exports = { - forgeXapiSendStatement, forgeXapiNotifyScoreChanged, forgeXapiNotifyStatusChanged, FORGE_TO_XAPI_VERB, - forgeXapiNotifyDialogueCompleted, forgeXapiNotifyQuestionAnswered, - forgeXapiDialogueObject, forgeXapiQuestionObject, FORGE_XAPI_VERB_DISPLAY, + forgeXapiSendStatement, + forgeXapiNotifyScoreChanged, + forgeXapiNotifyStatusChanged, + FORGE_TO_XAPI_VERB, + forgeXapiNotifyDialogueCompleted, + forgeXapiNotifyQuestionAnswered, + forgeXapiDialogueObject, + forgeXapiQuestionObject, + FORGE_XAPI_VERB_DISPLAY, }; } diff --git a/static/js/play/personnage-controller.js b/static/js/play/personnage-controller.js index 8637b9e3..5ce27e77 100644 --- a/static/js/play/personnage-controller.js +++ b/static/js/play/personnage-controller.js @@ -11,17 +11,17 @@ // mécanique que "Modifier un objet de scène"/"Jouer une animation", // jamais dupliquée. -var activePersonnageControllerInterval = null; -var activePersonnageInteractListener = null; +let activePersonnageControllerInterval = null; +let activePersonnageInteractListener = null; // Un seul rythme pour TOUTES les poses (marche, idle, interagir, touches // supplémentaires) — les désynchroniser (ex. idle plus lent que walk) // n'a aucune justification et se voit immédiatement au jeu (bug signalé // par l'utilisateur). -var FORGE_PERSONNAGE_FPS = 8; +const FORGE_PERSONNAGE_FPS = 8; function forgePersonnageAnimExists(elementId, animName) { - var byAnim = (gameData.personnage_animations || {})[elementId]; + const byAnim = (gameData.personnage_animations || {})[elementId]; return !!(byAnim && byAnim[animName] && byAnim[animName].length); } @@ -48,15 +48,16 @@ function forgePersonnageIdleAnim(elementId) { // borne un déplacement au monde entier, pas seulement au petit cadre // visible de la scène. function forgeUpdateSceneWorldSize(screenData) { - var width = screenData.scene_width, height = screenData.scene_height; - (screenData.elements || []).forEach(function (o) { + let width = screenData.scene_width; let + height = screenData.scene_height; + (screenData.elements || []).forEach((o) => { if (o.kind !== 'fond') return; width = Math.max(width, (o.x || 0) + (o.width || 0)); height = Math.max(height, (o.y || 0) + (o.height || 0)); }); screenData.world_width = width; screenData.world_height = height; - return { width: width, height: height }; + return { width, height }; } // Caméra qui suit le personnage (le premier objet kind="personnage" @@ -68,22 +69,32 @@ function forgeUpdateSceneWorldSize(screenData) { // dépasse pas la scène — c'est ce qui garde le comportement identique à // avant pour tout jeu sans fond plus grand que sa scène. function forgeUpdateSceneCamera(screenData) { - var worldEl = document.querySelector('.playScreen[data-screen-id="' + screenData.id + '"] .sceneWorld'); + const worldEl = document.querySelector(`.playScreen[data-screen-id="${screenData.id}"] .sceneWorld`); if (!worldEl) return; - var world = forgeUpdateSceneWorldSize(screenData); - worldEl.style.width = world.width + 'px'; - worldEl.style.height = world.height + 'px'; + const world = forgeUpdateSceneWorldSize(screenData); + worldEl.style.width = `${world.width}px`; + worldEl.style.height = `${world.height}px`; if (world.width <= screenData.scene_width && world.height <= screenData.scene_height) { worldEl.style.transform = ''; return; } - var player = (screenData.elements || []).find(function (o) { return o.kind === 'personnage' && o.personnage_role === 'joueur'; }); - var playerEl = player && document.querySelector('[data-object-id="' + player.id + '"]'); - var px = playerEl ? (parseFloat(playerEl.style.left) || 0) + (parseFloat(playerEl.style.width) || 0) / 2 : world.width / 2; - var py = playerEl ? (parseFloat(playerEl.style.top) || 0) + (parseFloat(playerEl.style.height) || 0) / 2 : world.height / 2; - var offsetX = Math.min(Math.max(px - screenData.scene_width / 2, 0), Math.max(0, world.width - screenData.scene_width)); - var offsetY = Math.min(Math.max(py - screenData.scene_height / 2, 0), Math.max(0, world.height - screenData.scene_height)); - worldEl.style.transform = 'translate(' + (-offsetX) + 'px, ' + (-offsetY) + 'px)'; + const player = (screenData.elements || []).find((o) => o.kind === 'personnage' && o.personnage_role === 'joueur'); + const playerEl = player && document.querySelector(`[data-object-id="${player.id}"]`); + const px = playerEl + ? (parseFloat(playerEl.style.left) || 0) + (parseFloat(playerEl.style.width) || 0) / 2 + : world.width / 2; + const py = playerEl + ? (parseFloat(playerEl.style.top) || 0) + (parseFloat(playerEl.style.height) || 0) / 2 + : world.height / 2; + const offsetX = Math.min( + Math.max(px - screenData.scene_width / 2, 0), + Math.max(0, world.width - screenData.scene_width), + ); + const offsetY = Math.min( + Math.max(py - screenData.scene_height / 2, 0), + Math.max(0, world.height - screenData.scene_height), + ); + worldEl.style.transform = `translate(${-offsetX}px, ${-offsetY}px)`; } function forgeStopPersonnageControllers() { @@ -103,7 +114,9 @@ function forgeStopPersonnageControllers() { // (conditions.js, déjà chargé avant ce fichier dans templates/play.html), // la MÊME formule que la condition de collision de flow (elementsOverlap). function forgeObjectCollisionRectAt(left, top, width, height, collision) { - return forgeCollisionRectFromBox({ left: left, top: top, width: width, height: height }, collision); + return forgeCollisionRectFromBox({ + left, top, width, height, + }, collision); } // Tout objet de scène potentiellement "solide" pour le déplacement au @@ -112,9 +125,7 @@ function forgeObjectCollisionRectAt(left, top, width, height, collision) { // objet dont la collision est explicitement désactivée, ni l'objet qui // se déplace lui-même. function forgeSolidObstacles(screenData, movingId) { - return (screenData.elements || []).filter(function (o) { - return o.id !== movingId && o.kind !== 'fond' && o.kind !== 'dialogue_box' && o.kind !== 'quiz_box' && o.kind !== 'score_widget' && !(o.collision && o.collision.enabled === false); - }); + return (screenData.elements || []).filter((o) => o.id !== movingId && o.kind !== 'fond' && o.kind !== 'dialogue_box' && o.kind !== 'quiz_box' && o.kind !== 'score_widget' && !(o.collision && o.collision.enabled === false)); } // Est-ce que le personnage, À la position candidate (newLeft/newTop), @@ -130,7 +141,7 @@ function forgeWouldCollide(screenData, movingObj, newLeft, newTop, width, height const obstacles = forgeSolidObstacles(screenData, movingObj.id); for (let i = 0; i < obstacles.length; i++) { const other = obstacles[i]; - const otherEl = document.querySelector('[data-object-id="' + other.id + '"]'); + const otherEl = document.querySelector(`[data-object-id="${other.id}"]`); if (!otherEl) continue; const otherLeft = parseFloat(otherEl.style.left) || 0; const otherTop = parseFloat(otherEl.style.top) || 0; @@ -146,16 +157,17 @@ function forgeWouldCollide(screenData, movingObj, newLeft, newTop, width, height // (triggers.js), pour un déplacement perçu comme continu. function forgeRunPersonnageControllerTick(screenData) { forgeUpdateSceneCamera(screenData); - (screenData.elements || []).forEach(function (obj) { + (screenData.elements || []).forEach((obj) => { // Seul le personnage "joueur" (voir screens/rendering/personnage_role.py) // est déplacé/animé au clavier — "ennemie"/"pnj" restent immobiles tant // qu'aucune logique de flow ne les pilote (voir add_scene_object.py). if (obj.kind !== 'personnage' || obj.personnage_role !== 'joueur' || !obj.personnage_commandes) return; - var cmd = obj.personnage_commandes; - var targetEl = document.querySelector('[data-object-id="' + obj.id + '"]'); + const cmd = obj.personnage_commandes; + const targetEl = document.querySelector(`[data-object-id="${obj.id}"]`); if (!targetEl) return; - var rawDx = 0, rawDy = 0; + let rawDx = 0; let + rawDy = 0; if (cmd.axe !== 'vertical') { if (heldKeys.has(cmd.gauche)) rawDx -= cmd.vitesse; if (heldKeys.has(cmd.droite)) rawDx += cmd.vitesse; @@ -168,17 +180,18 @@ function forgeRunPersonnageControllerTick(screenData) { // Bloque le déplacement axe par axe (pas les deux à la fois dès qu'un // seul est gêné) — glisser le long d'un mur en diagonale reste // possible, plus naturel qu'un blocage total au moindre contact. - var curLeft = parseFloat(targetEl.style.left) || 0; - var curTop = parseFloat(targetEl.style.top) || 0; - var boxWidth = parseFloat(targetEl.style.width) || 0; - var boxHeight = parseFloat(targetEl.style.height) || 0; - var dx = rawDx, dy = rawDy; + const curLeft = parseFloat(targetEl.style.left) || 0; + const curTop = parseFloat(targetEl.style.top) || 0; + const boxWidth = parseFloat(targetEl.style.width) || 0; + const boxHeight = parseFloat(targetEl.style.height) || 0; + let dx = rawDx; let + dy = rawDy; if (dx !== 0) { - var candidateLeft = clampSceneObjectPosition(targetEl, 'left', curLeft + dx); + const candidateLeft = clampSceneObjectPosition(targetEl, 'left', curLeft + dx); if (forgeWouldCollide(screenData, obj, candidateLeft, curTop, boxWidth, boxHeight)) dx = 0; } if (dy !== 0) { - var candidateTop = clampSceneObjectPosition(targetEl, 'top', curTop + dy); + const candidateTop = clampSceneObjectPosition(targetEl, 'top', curTop + dy); if (forgeWouldCollide(screenData, obj, curLeft, candidateTop, boxWidth, boxHeight)) dy = 0; } // Se tourne vers la direction TENTÉE même si le déplacement est @@ -191,14 +204,24 @@ function forgeRunPersonnageControllerTick(screenData) { // animations sont lentes à côté de la marche" — aucune raison réelle // de les désynchroniser). if (dx === 0 && dy === 0) { - var idleAnim = forgePersonnageIdleAnim(obj.id); - if (idleAnim) runSpriteAnimation(targetEl, resolveSpriteFrames(obj.id, { animation: idleAnim, fps: FORGE_PERSONNAGE_FPS, loop: true })); + const idleAnim = forgePersonnageIdleAnim(obj.id); + if (idleAnim) { + runSpriteAnimation( + targetEl, + resolveSpriteFrames(obj.id, { animation: idleAnim, fps: FORGE_PERSONNAGE_FPS, loop: true }), + ); + } return; } if (dx !== 0) applyObjectProperty(targetEl, 'pos_x_relatif', dx); if (dy !== 0) applyObjectProperty(targetEl, 'pos_y_relatif', dy); - var moveAnim = forgePersonnageMovementAnim(obj.id); - if (moveAnim) runSpriteAnimation(targetEl, resolveSpriteFrames(obj.id, { animation: moveAnim, fps: FORGE_PERSONNAGE_FPS, loop: true })); + const moveAnim = forgePersonnageMovementAnim(obj.id); + if (moveAnim) { + runSpriteAnimation( + targetEl, + resolveSpriteFrames(obj.id, { animation: moveAnim, fps: FORGE_PERSONNAGE_FPS, loop: true }), + ); + } }); } @@ -209,7 +232,7 @@ function forgeRunPersonnageControllerTick(screenData) { // (sauter, attaquer, courir...) sans ajouter un champ fixe par pose. function forgePersonnageActionAnim(cmd, key) { if (cmd.interagir === key) return 'interact'; - var extraMatch = (cmd.extra || []).find(function (e) { return e.touche === key; }); + const extraMatch = (cmd.extra || []).find((e) => e.touche === key); return extraMatch ? extraMatch.animation : null; } @@ -218,13 +241,16 @@ function forgePersonnageActionAnim(cmd, key) { // attaquer...), jamais un mouvement continu. function forgeStartPersonnageInteractListener(screenData) { activePersonnageInteractListener = function (ev) { - (screenData.elements || []).forEach(function (obj) { + (screenData.elements || []).forEach((obj) => { if (obj.kind !== 'personnage' || obj.personnage_role !== 'joueur' || !obj.personnage_commandes) return; - var animName = forgePersonnageActionAnim(obj.personnage_commandes, ev.key); + const animName = forgePersonnageActionAnim(obj.personnage_commandes, ev.key); if (!animName || !forgePersonnageAnimExists(obj.id, animName)) return; - var targetEl = document.querySelector('[data-object-id="' + obj.id + '"]'); + const targetEl = document.querySelector(`[data-object-id="${obj.id}"]`); if (!targetEl) return; - runSpriteAnimation(targetEl, resolveSpriteFrames(obj.id, { animation: animName, fps: FORGE_PERSONNAGE_FPS, loop: false })); + runSpriteAnimation( + targetEl, + resolveSpriteFrames(obj.id, { animation: animName, fps: FORGE_PERSONNAGE_FPS, loop: false }), + ); }); }; window.addEventListener('keydown', activePersonnageInteractListener); @@ -236,9 +262,9 @@ function forgeStartPersonnageInteractListener(screenData) { function forgeStartPersonnageControllers(screenData) { forgeStopPersonnageControllers(); if (!screenData || screenData.kind !== 'jeu_2d') return; - var elements = screenData.elements || []; - var hasPersonnage = elements.some(function (o) { return o.kind === 'personnage' && o.personnage_role === 'joueur'; }); - var hasFond = elements.some(function (o) { return o.kind === 'fond'; }); + const elements = screenData.elements || []; + const hasPersonnage = elements.some((o) => o.kind === 'personnage' && o.personnage_role === 'joueur'); + const hasFond = elements.some((o) => o.kind === 'fond'); // Appliqué tout de suite (avant le premier tick de l'intervalle, 50ms // plus tard) pour éviter un flash d'une frame à la taille/caméra par // défaut. Un fond seul (sans personnage) n'a besoin que de CET appel @@ -246,7 +272,7 @@ function forgeStartPersonnageControllers(screenData) { // tick régulier pour le déplacement continu au clavier. if (hasFond) forgeUpdateSceneCamera(screenData); if (!hasPersonnage) return; - activePersonnageControllerInterval = setInterval(function () { forgeRunPersonnageControllerTick(screenData); }, 50); + activePersonnageControllerInterval = setInterval(() => { forgeRunPersonnageControllerTick(screenData); }, 50); forgeStartPersonnageInteractListener(screenData); } @@ -255,10 +281,19 @@ function forgeStartPersonnageControllers(screenData) { // client. if (typeof module !== 'undefined' && module.exports) { module.exports = { - forgePersonnageAnimExists, forgePersonnageMovementAnim, forgePersonnageIdleAnim, forgePersonnageActionAnim, - forgeRunPersonnageControllerTick, forgeStartPersonnageControllers, forgeStopPersonnageControllers, - forgeStartPersonnageInteractListener, forgeUpdateSceneWorldSize, forgeUpdateSceneCamera, - forgeObjectCollisionRectAt, forgeSolidObstacles, forgeWouldCollide, + forgePersonnageAnimExists, + forgePersonnageMovementAnim, + forgePersonnageIdleAnim, + forgePersonnageActionAnim, + forgeRunPersonnageControllerTick, + forgeStartPersonnageControllers, + forgeStopPersonnageControllers, + forgeStartPersonnageInteractListener, + forgeUpdateSceneWorldSize, + forgeUpdateSceneCamera, + forgeObjectCollisionRectAt, + forgeSolidObstacles, + forgeWouldCollide, }; // node:test charge ce fichier isolément (voir __tests__/) — jamais un //