Le document de cadrage produit cible des formateurs non techniques créant
des serious games/quiz gamifiés — l'éditeur générique "document" (blocs de
logique en nœuds, timeline d'animation, définitions d'objets/relations,
templates réutilisables) est une complexité hors cible que l'effort
d'ingénierie récent avait déjà abandonnée au profit du jeu_2d.
- Onboarding : ne garde que le parcours "RPG" (jeu_2d), retire
Quiz/Embranchement/Créer mon jeu de A à Z (tous document-only)
- Suppression en bloc des modules exclusifs au document : routes/elements,
routes/element_types, routes/objects, routes/legacy_actions,
screens/elements, screens/element_types, screens/widgets,
screens/legacy_actions, le rendu render_element_html.py et son cluster,
templates/screen_edit.html, templates/game_dashboard.html,
flow-editor.js/tabs-and-blocks.js/animation-timeline.js
- Dashboard toujours simplifié (un seul mode possible désormais)
- Tests document-only supprimés, tests de logique partagée (flow,
événements personnalisés, animations) retargetés sur des écrans jeu_2d
- Aucune régression jeu_2d : 299 tests passent
Carte d'onboarding retravaillée : argumentaire RH non technique (liste à
coche, badge "Compatible LMS"), taille et interaction de retournement
ajustées.
Le graphe de logique d'une scène s'affichait jusqu'ici sur un seul
canevas plat (toutes les scènes accumulant leurs nœuds sur la même
grille), ce qui ne tient pas à l'échelle dès qu'une scène évolue au fil
de l'avancée du joueur et accumule des centaines/milliers de nœuds.
Ajoute les "Blocs de logique" : un bloc regroupe un sous-ensemble de
nœuds/arêtes d'un écran sous un nom et une description (comme une
fonction). L'onglet "Logique de la scène" devient une liste de blocs
(nom, description tronquée à 3 phrases, éléments concernés, nombre de
nœuds, bouton "Ouvrir"). Ouvrir un bloc affiche SON graphe dans une
modale plein écran, redimensionnable et déplaçable (patron déjà mûr
dans game_dashboard.html, porté tel quel : makeFloatPanelDraggable/
Resizable/Fullscreenable).
Décision d'architecture : un bloc est un automate FERMÉ — impossible de
relier un nœud d'un bloc à un nœud d'un autre bloc (rejeté côté serveur
dans flow_edge_add.py). Toute communication entre deux blocs passe par
le système d'événements personnalisés déjà en place
(declencher_evenement / trigger_event="evenement").
Détails techniques :
- Nouvelle colonne _flow_nodes.block_id (nullable, sans FK — même
rationale que trigger_element_id/target_element_id, voir
screens/elements/delete_element.py) et nouvelle table _flow_blocks
(screens/flow/ensure_flow_schema.py,
screens/flow/blocks/ensure_flow_blocks_schema.py).
- Migration douce et automatique : les nœuds posés avant l'existence
des blocs (block_id NULL) sont rattachés, à la première ouverture de
l'onglet, à un "Bloc principal" auto-créé (screens/flow/blocks/
list_flow_blocks.py) — aucun script de migration séparé, aucune
donnée perdue.
- Suppression d'un bloc = cascade complète (bloc + tous ses nœuds/
arêtes), patron identique à screens/custom_events/delete_custom_event.py
mais scopé à un seul bloc plutôt que game-wide.
- Routes CRUD sous routes/flow_blocks/, montées comme routes/custom_events/.
- templates/screen_edit.html : FLOW (global unique) renommé en ALL_FLOW
(toutes les données de l'écran) ; un seul bloc ouvert à la fois
(modale unique, à la Unity) — currentBlockNodes()/currentBlockEdges()
filtrent ALL_FLOW par CURRENT_BLOCK_ID à chaque rendu, sans tenir de
seconde copie à synchroniser manuellement.
Vérifié : 215 tests passent (7 nouveaux dans tests/test_flow_blocks.py,
dont un qui verrouille l'ordre d'appel list_flow_blocks()/
list_flow_nodes() dans screen_edit.py — la migration douce doit tourner
AVANT le chargement des nœuds, sinon le compte de nœuds affiché juste
après une migration est périmé), syntaxe JS validée (script de
screen_edit.html rendu via le client de test puis node --check).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>