Retire l'export exécutable (.exe) et la partie publique en ligne (/jouer)
Build and deploy / test-python (push) Successful in 7m5s
Build and deploy / test-js (push) Successful in 58s
Build and deploy / build-and-push (push) Skipped
Build and deploy / deploy (push) Skipped

Décision produit : seul l'export Web/SCORM (LMS) est pertinent — l'export
exécutable Windows autonome (publish/build_package.py, bouton "Publier")
et la partie publique par joueur (/jouer/<slug>, routes/public_play/,
"Publier en ligne") sont jugés redondants et retirés.

Conserve le mécanisme d'état "par joueur" (db/global_vars,
db/rows, per_player) : infrastructure générique déjà utilisée par
Score/Progression et testée indépendamment de toute route publique
(voir tests/test_player_state.py), aucune raison de la retirer.

_STATIC_ITEMS/_copy_characters (copie sélective des sprites CraftPix
réellement utilisés) migrent de build_package.py vers
build_scorm_package.py, seul appelant restant.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
william
2026-09-02 10:59:28 +02:00
co-authored by Claude Sonnet 5
parent 82d00b3800
commit e82eb7ce88
37 changed files with 115 additions and 1106 deletions
+1 -3
View File
@@ -29,8 +29,6 @@ from .connection import connect
from .games.list_games import list_games
from .games.game_meta import game_meta
from .games.is_public_played import is_public_played
from .games.set_public_played import set_public_played
from .games.get_game_type import get_game_type, DEFAULT_GAME_TYPE
from .games.create_game import create_game
from .games.update_game_name import update_game_name
@@ -85,7 +83,7 @@ __all__ = [
"SCORE_STATUS_CHOICES", "SCORE_STATUS_LABELS", "get_score", "set_score_value", "set_status",
"slugify", "table_name_for", "game_dir", "db_path", "connect",
"list_games", "game_meta", "create_game", "update_game_name", "delete_game", "move_game",
"is_public_played", "set_public_played", "get_game_type", "DEFAULT_GAME_TYPE",
"get_game_type", "DEFAULT_GAME_TYPE",
"ONBOARDING_TYPES", "DEFAULT_ONBOARDING_TYPE", "get_onboarding_type",
"get_onboarding_type_raw", "set_onboarding_type", "is_restricted",
"list_definitions", "get_definition", "create_definition", "rename_definition",
+3 -7
View File
@@ -3,13 +3,9 @@
import os
# Surchargeable via FORGE_PROJECTS_DIR (même schéma que
# auth/connection.py::FORGE_USERS_DB_PATH) — utilisé par le serveur
# joueur autonome (publish/player_app_template.py), qui pose cette
# variable AVANT d'importer db/ pour pointer vers son propre dossier
# "projects/" embarqué plutôt que celui, réel, du poste de développement.
# Résolu ici, à l'IMPORT (pas par un appel de fonction) : la variable
# d'environnement doit donc déjà être posée avant le tout premier
# `import db`.
# auth/connection.py::FORGE_USERS_DB_PATH). Résolu ici, à l'IMPORT (pas
# par un appel de fonction) : la variable d'environnement doit donc déjà
# être posée avant le tout premier `import db`.
PROJECTS_DIR = os.environ.get("FORGE_PROJECTS_DIR") or os.path.join(
os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "projects"
)
-6
View File
@@ -1,5 +1,4 @@
from ..connection import connect
from .is_public_played import is_public_played
from .game_type_catalog import get_onboarding_type
@@ -9,11 +8,6 @@ def game_meta(slug):
conn.close()
return {
"slug": slug, "name": row["value"] if row else slug,
# État par joueur (Phase 1) : disponible partout où `game` est
# dans le contexte du template (base.html, la bascule "Publier en
# ligne" en a besoin pour afficher son état actuel), sans avoir à
# appeler is_public_played(slug) séparément dans chaque route.
"is_public_played": is_public_played(slug),
# Onboarding guidé (voir game_type_catalog.py) : utilisé par
# templates/base.html pour cacher le lien "Tableau de bord" à un
# compte "restreint" (quiz/embranchement/rpg).
+1 -1
View File
@@ -10,7 +10,7 @@ accessible ensuite, ou seulement sa version simplifiée (juste les écrans
en cartes — voir routes/games/game_dashboard.py, restricted).
_meta['onboarding_type'] (une ligne _meta par projet, même convention que
is_public_played/l'ancien game_type) retient CE choix — jamais lu par le
game_type) retient CE choix — jamais lu par le
rendu jouable, seulement par le routage (routes/games/game_dashboard.py,
routes/screens/screens_new.py)."""
import db
+4 -3
View File
@@ -8,9 +8,10 @@ def get_game_type(slug):
(éditeur générique actuel — quiz/formulaires/contenus, écrans =
éléments HTML positionnés en %) ou "jeu_2d" (éditeur de scène dédié —
voir screens/scenes/, écrans = objets pixel-positionnés en couches).
Réutilise _meta comme is_public_played — aucune nouvelle table. Un jeu
créé avant l'existence de cette clé (absente de _meta) retombe sur
"document", son comportement d'avant, inchangé."""
Stocké dans _meta (une table générique clé/valeur, déjà utilisée pour
d'autres réglages de projet) — aucune nouvelle table. Un jeu créé avant
l'existence de cette clé (absente de _meta) retombe sur "document",
son comportement d'avant, inchangé."""
conn = connect(slug)
row = conn.execute("SELECT value FROM _meta WHERE key = 'game_type'").fetchone()
conn.close()
-14
View File
@@ -1,14 +0,0 @@
from ..connection import connect
def is_public_played(slug):
"""Un jeu n'est jouable sur la route publique /jouer/<slug> (voir
routes/public_play/) que si le créateur l'a explicitement basculé
"Publier en ligne" dans son tableau de bord — jamais par défaut, pour
ne pas exposer un jeu en cours de conception. Réutilise la table
générique _meta (voir game_meta.py, déjà utilisée pour 'name'),
aucune nouvelle colonne/table nécessaire."""
conn = connect(slug)
row = conn.execute("SELECT value FROM _meta WHERE key = 'is_public_played'").fetchone()
conn.close()
return bool(row and row["value"] == "1")
-14
View File
@@ -1,14 +0,0 @@
from ..connection import connect
def set_public_played(slug, value):
"""Bascule "Publier en ligne" (tableau de bord) — voir
is_public_played.py. `value` : bool."""
conn = connect(slug)
conn.execute(
"INSERT INTO _meta (key, value) VALUES ('is_public_played', ?) "
"ON CONFLICT(key) DO UPDATE SET value = excluded.value",
("1" if value else "0",),
)
conn.commit()
conn.close()