Supprime le type d'écran "document" et recentre le produit sur le jeu 2D
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.
This commit is contained in:
@@ -5,6 +5,8 @@ from flask import render_template, request, abort, g
|
||||
import db
|
||||
import screens
|
||||
|
||||
from .collision_rule_objects import build_collision_rule_objects
|
||||
|
||||
|
||||
def render_scene_edit(slug, screen_id, game):
|
||||
"""Vue de l'éditeur de scène 2D — appelée par routes/screens/
|
||||
@@ -22,22 +24,17 @@ def render_scene_edit(slug, screen_id, game):
|
||||
for o in objects:
|
||||
o["rendered_html"] = screens.render_scene_object(o)
|
||||
|
||||
# "Monde" (voir static/js/play/personnage-controller.js::
|
||||
# forgeUpdateSceneWorldSize, même principe côté serveur) : un "fond"
|
||||
# posé à sa taille RÉELLE (souvent plus grande que la scène, voir
|
||||
# add_scene_object.py) rend visible/joignable, dans CET éditeur, tout
|
||||
# ce qui dépasse la scène nominale plutôt que de le rogner (le
|
||||
# "Monde" (voir screens.resolve_scene_world_size, réutilisé aussi par
|
||||
# la miniature de "Mes écrans", routes/games/game_dashboard.py) : un
|
||||
# "fond" posé à sa taille RÉELLE (souvent plus grande que la scène,
|
||||
# voir add_scene_object.py) rend visible/joignable, dans CET éditeur,
|
||||
# tout ce qui dépasse la scène nominale plutôt que de le rogner (le
|
||||
# glisser-déposer le permet déjà depuis le fix précédent — sans
|
||||
# agrandir le canevas ici, cette partie restait invisible/injoignable
|
||||
# à la souris). Le rectangle "🎥 Champ de la caméra" (voir
|
||||
# templates/scene_edit.html) marque ensuite où s'arrête la scène
|
||||
# nominale À L'INTÉRIEUR de ce monde plus grand.
|
||||
world_width, world_height = screen["scene_width"], screen["scene_height"]
|
||||
for o in objects:
|
||||
if o["kind"] == "fond":
|
||||
world_width = max(world_width, o["x"] + o["width"])
|
||||
world_height = max(world_height, o["y"] + o["height"])
|
||||
world_width, world_height = int(world_width), int(world_height)
|
||||
world_width, world_height = screens.resolve_scene_world_size(screen, objects)
|
||||
|
||||
selected_id = request.args.get("selected", type=int)
|
||||
personnage_data = None
|
||||
@@ -66,28 +63,11 @@ def render_scene_edit(slug, screen_id, game):
|
||||
o["id"]: screens.resolve_personnage_animations(o) for o in objects if o["kind"] == "personnage"
|
||||
}
|
||||
|
||||
# "🧩 Collision" (voir templates/scene_edit.html) : une carte par objet
|
||||
# ÉLIGIBLE (jamais un "fond", jamais le personnage "joueur" — ce sont
|
||||
# TOUJOURS les AUTRES objets qui réagissent à SA présence, voir
|
||||
# screens/rendering/collision_rules.py) — construit ici plutôt que
|
||||
# réutiliser `objects` tel quel, pour ne poser resolve_personnage_role
|
||||
# qu'une fois par objet personnage (déjà lu ci-dessus pour l'objet
|
||||
# SÉLECTIONNÉ, mais nécessaire ici pour TOUS les personnages).
|
||||
collision_rule_objects = []
|
||||
for o in objects:
|
||||
if o["kind"] in ("fond", "dialogue_box", "quiz_box", "score_widget"):
|
||||
continue
|
||||
role = screens.resolve_personnage_role(o) if o["kind"] == "personnage" else None
|
||||
if role == "joueur":
|
||||
continue
|
||||
collision_rule_objects.append({
|
||||
"id": o["id"],
|
||||
"name": o.get("name") or _DEFAULT_OBJECT_LABELS.get(o["kind"], "Décor"),
|
||||
"kind": o["kind"],
|
||||
"role": role,
|
||||
"thumbnail_html": o["rendered_html"],
|
||||
"rules": screens.resolve_collision_rules(o),
|
||||
})
|
||||
# "🧩 Collision" — voir build_collision_rule_objects() (routes/scenes/
|
||||
# collision_rule_objects.py, factorisé pour être réutilisé par
|
||||
# l'endpoint AJAX scene_collision_rule_objects.py, appelé après ajout/
|
||||
# suppression/changement de rôle ou de nom sans recharger la page).
|
||||
collision_rule_objects = build_collision_rule_objects(objects)
|
||||
|
||||
flow_blocks = screens.list_flow_blocks(slug, screen_id)
|
||||
flow_nodes = screens.list_flow_nodes(slug, screen_id)
|
||||
|
||||
Reference in New Issue
Block a user