Score/Progression (Phase 1.1 de la feuille de route produit)
Build and deploy / test-python (push) Successful in 7m27s
Build and deploy / test-js (push) Successful in 1m16s
Build and deploy / build-and-push (push) Skipped
Build and deploy / deploy (push) Skipped

Concept de premier ordre, distinct du système de variables globales —
préalable identifié aux futurs exports SCORM/xAPI (note de cadrage
.claude/Forge_Engine_Cadrage.pdf) : ces standards ont besoin d'un signal
"score"/"terminé" propre, pas d'une convention sur une variable choisie
par le créateur.

- db/scoring/ (même patron que db/global_vars/) : table _scoring, un
  score numérique + un statut (non_commence/en_cours/termine/reussi/
  echoue) par joueur (voir db.PLAYER_SHARED pour l'aperçu créateur).
- Deux nouvelles actions de flux, dans les deux éditeurs (document et
  scène) : "Modifier le score" (réutilise le vocabulaire d'opérations
  déjà là pour "Modifier une variable" — incrémenter/définir/etc., aucune
  nouvelle colonne de nœud) et "Définir le statut de la partie".
- Routes créateur (routes/flow/flow_node_run_score.py,
  flow_node_run_status.py) + miroirs publics par joueur
  (routes/public_play/) — même principe que flow_node_run_variable.py.
- GET /game/<slug>/scoring/<player_id> : lecture interne, pas exposée au
  joueur, préparée pour être consommée par le futur export Web/SCORM.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
william
2026-09-02 06:23:37 +02:00
co-authored by Claude Sonnet 5
parent 76a50fa87a
commit 9776fbc057
26 changed files with 486 additions and 1 deletions
+2
View File
@@ -144,6 +144,8 @@ from .flow.blocks.blocks_view import blocks_view
from .data_actions.apply_data_action import apply_data_action
from .data_actions.apply_variable_action import apply_variable_action
from .data_actions.apply_score_action import apply_score_action
from .data_actions.apply_status_action import apply_status_action
from .data_actions.apply_add_row_action import apply_add_row_action
from .animations.ensure_animation_schema import ensure_animation_schema
@@ -0,0 +1,23 @@
import db
from .compute_operation import compute_new_value
def apply_score_action(slug, action, player_id=db.PLAYER_SHARED):
"""Exécute au moment du clic (mode jouable) une action
"modifier_score" — même vocabulaire d'opérations que
apply_variable_action.py (DATA_OPERATIONS), appliqué au score de CE
joueur (voir db/scoring/) plutôt qu'à une variable globale. Le score
est TOUJOURS numérique (pas de "type" à lire au préalable, contrairement
à une variable — is_decimal=True partout, un score entier reste exact
en float pour de petits nombres)."""
operation = action.get("data_operation")
raw_value = action.get("data_value")
if not operation:
return False
current = db.get_score(slug, player_id)["score"] or 0
try:
new_value = compute_new_value(operation, current, raw_value, True)
except ValueError:
return False
return db.set_score_value(slug, new_value, player_id)
@@ -0,0 +1,13 @@
import db
def apply_status_action(slug, action, player_id=db.PLAYER_SHARED):
"""Exécute au moment du clic (mode jouable) une action
"definir_statut_partie" — réutilise data_value (déjà un simple champ
texte générique sur le nœud action, comme pour "attendre") pour porter
la clé du statut choisi (voir db.SCORE_STATUS_LABELS), plutôt qu'une
nouvelle colonne de nœud dédiée."""
status = action.get("data_value")
if not status:
return False
return db.set_status(slug, status, player_id)
+2
View File
@@ -5,6 +5,8 @@ ACTION_TYPE_LABELS = {
"modifier_element": "Modifier un élément",
"modifier_donnee": "Modifier une donnée d'un objet",
"modifier_variable": "Modifier une variable globale",
"modifier_score": "Modifier le score",
"definir_statut_partie": "Définir le statut de la partie",
"ouvrir_ligne": "Ouvrir la ligne de Répéteur cliquée",
"activer_onglet": "Afficher cet élément, masquer tous ses frères",
"attendre": "Attendre quelques secondes avant de continuer",
+2
View File
@@ -20,6 +20,8 @@ ACTION_TYPE_LABELS_2D = {
"modifier_objet_scene": "Modifier un objet de scène",
"modifier_variable": "Modifier une variable globale",
"modifier_donnee": "Modifier une donnée d'un objet",
"modifier_score": "Modifier le score",
"definir_statut_partie": "Définir le statut de la partie",
"jouer_animation_sprite": "Jouer une animation de sprites",
"jouer_son": "Jouer un son",
"declencher_evenement": "Déclencher un événement",