Files
Forge-Engine/screens/screens_repo/ensure_schema.py
T
william 50835a18e2
Build and deploy / test-python (push) Successful in 9m41s
Build and deploy / test-js (push) Successful in 1m0s
Build and deploy / build-and-push (push) Skipped
Build and deploy / deploy (push) Skipped
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.
2026-09-04 20:56:32 +02:00

65 lines
3.7 KiB
Python

import db
def ensure_schema(slug):
"""Crée les tables de ce module si elles n'existent pas encore — les
jeux créés avant l'ajout de cette fonctionnalité n'ont pas besoin d'être
migrés manuellement, la première visite d'un écran de ce jeu suffit."""
conn = db.connect(slug)
conn.executescript(
"""
CREATE TABLE IF NOT EXISTS _screens (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
order_index INTEGER NOT NULL DEFAULT 0,
is_template INTEGER NOT NULL DEFAULT 0,
created_at TEXT DEFAULT CURRENT_TIMESTAMP
);
"""
)
screen_cols = {r["name"] for r in conn.execute("PRAGMA table_info(_screens)").fetchall()}
if "is_template" not in screen_cols:
# Un écran-modèle héberge le contenu d'un élément de jeu réutilisable
# (voir template_screen_id ci-dessus) : il n'apparaît jamais dans la
# liste des écrans du jeu, ni dans le mode jouable, ni dans les
# menus "aller à cet écran" — seul son contenu (les éléments qu'il
# contient) est utilisé, jamais l'écran lui-même.
conn.execute("ALTER TABLE _screens ADD COLUMN is_template INTEGER NOT NULL DEFAULT 0")
if "preview_aspect" not in screen_cols:
# Format d'aperçu choisi pour cet écran (Portrait 9/16, Paysage 16/9,
# ou Carré 1/1) — mémorisé par écran pour qu'il reste le même après
# un ajout/suppression d'élément ou un changement d'élément
# sélectionné (ces actions redemandent le panneau au serveur, qui
# doit donc connaître le choix déjà fait, sinon il repart sur la
# valeur par défaut à chaque fois). Sert aussi en mode Jouer, pour
# garder la zone de jeu à la bonne proportion quelle que soit la
# forme réelle de la fenêtre du joueur (voir #playFrame dans
# play.html) — sans ça, les positions/tailles en % se déforment dès
# que la fenêtre du joueur n'a pas la même proportion que celle
# utilisée à la conception.
conn.execute("ALTER TABLE _screens ADD COLUMN preview_aspect TEXT NOT NULL DEFAULT '9/16'")
if "background_music_url" not in screen_cols:
# Phase 6 — musique de fond de cet écran (URL) : démarrée en boucle
# à l'affichage de l'écran, arrêtée au changement d'écran (voir
# runScreenBackgroundMusic() dans static/js/play/screens.js).
# Indépendante de l'action "Jouer un son" (effet sonore ponctuel,
# non bouclé, sur n'importe quel déclencheur).
conn.execute("ALTER TABLE _screens ADD COLUMN background_music_url TEXT")
if "scene_width" not in screen_cols:
# Fondations multi-éditeurs — jeux "jeu_2d" (voir db/games/
# get_game_type.py) : une scène a une taille FIXE en pixels
# (contrairement à un écran "document", positionné en % fluides
# via preview_aspect ci-dessus) — indispensable pour la collision
# et l'animation de sprites. Sans effet sur un écran "document"
# (jamais lu par son rendu) — voir screens/scenes/.
conn.execute("ALTER TABLE _screens ADD COLUMN scene_width INTEGER NOT NULL DEFAULT 960")
conn.execute("ALTER TABLE _screens ADD COLUMN scene_height INTEGER NOT NULL DEFAULT 540")
if "kind" not in screen_cols:
# Un seul moteur d'écran désormais : "jeu_2d" (scène pixels — voir
# db/games/get_game_type.py, conservé pour la rétro-compatibilité
# 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),))
conn.commit()
conn.close()