Phase 1.2 de la feuille de route produit — un paquet SCORM tourne seul dans le LMS du client, sans serveur Forge Engine disponible. Ajoute static/js/play/offline/ (miroir JS de screens/rendering/ et data_actions/, sous window.FORGE_OFFLINE) pour que variables, score, données d'objet, répéteurs et conditions de visibilité fonctionnent entièrement en mémoire côté navigateur ; branche actions.js et bindings.js dessus au lieu d'un fetch() serveur. Ajoute publish/build_scorm_package.py (paquet statique + imsmanifest.xml SCORM 1.2 + wrapper API SCORM) et le bouton "Exporter (Web/SCORM)". Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
29 lines
1.2 KiB
Python
29 lines
1.2 KiB
Python
import json
|
|
|
|
from flask import render_template, url_for
|
|
|
|
import db
|
|
import screens
|
|
|
|
from core.flask_app import app
|
|
|
|
|
|
@app.route("/game/<slug>/play")
|
|
def game_play(slug):
|
|
"""Aperçu créateur (connecté, voir core/auth_guard.py) — une seule
|
|
partie partagée (PLAYER_SHARED, le défaut de full_game_payload), comme
|
|
avant l'état par joueur (Phase 1). Distincte de /jouer/<slug>
|
|
(routes/public_play/), la vraie route publique par joueur."""
|
|
game = db.game_meta(slug)
|
|
payload = screens.full_game_payload(slug)
|
|
return render_template(
|
|
"play.html", game=game, screens_data=payload["screens"], payload_json=json.dumps(payload),
|
|
asset_url=lambda filename: url_for("static", filename=filename),
|
|
runtime_payload_url=url_for("runtime_payload", slug=slug),
|
|
flow_node_run_data_url=url_for("flow_node_run_data", slug=slug, node_id=999999),
|
|
flow_node_run_variable_url=url_for("flow_node_run_variable", slug=slug, node_id=999999),
|
|
flow_node_run_score_url=url_for("flow_node_run_score", slug=slug, node_id=999999),
|
|
flow_node_run_status_url=url_for("flow_node_run_status", slug=slug, node_id=999999),
|
|
flow_node_run_add_row_url=url_for("flow_node_run_add_row", slug=slug, node_id=999999),
|
|
)
|