Remplace le système de quêtes par des déclencheurs, ajoute l'action variable et le chaînage
Build and deploy / test-python (push) Successful in 8m45s
Build and deploy / test-js (push) Successful in 49s
Build and deploy / build-and-push (push) Skipped
Build and deploy / deploy (push) Skipped

Supprime le concept de "quête" au profit d'un onglet unique "Déclencheurs"
portant toute la logique (dialogue, condition, marquage terminé) directement
sur l'objet de scène. Ajoute une nouvelle action "Modifier une variable"
(réutilisant le vocabulaire du graphe de flow) utilisable après une
collision, une interaction ou une branche de condition, ainsi qu'un
chaînage d'actions ("then") permettant d'enchaîner plusieurs actions à la
suite et d'étendre un déclencheur déjà posé sans le recréer.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
william
2026-09-07 22:05:06 +02:00
co-authored by Claude Sonnet 5
parent c504ace167
commit d664ed5637
62 changed files with 3129 additions and 2266 deletions
+21 -31
View File
@@ -73,26 +73,28 @@ function forgeXapiObject() {
}
// Sous-activités xAPI (voir static/js/play/dialogue-box-controller.js) :
// une quête/question n'est PAS l'activité de premier niveau du jeu
// un dialogue/question n'est PAS l'activité de premier niveau du jeu
// (forgeXapiObject ci-dessus) mais une activité fille, identifiée par un
// id dérivé — assez pour que le LRS les distingue sans configuration
// supplémentaire côté créateur du jeu.
function forgeXapiQuestObject(quest) {
// supplémentaire côté créateur du jeu. `objectName` : le nom de l'objet
// de scène qui a déclenché ce dialogue (voir "ℹ️ Informations") — plus de
// "quête" pour le porter.
function forgeXapiDialogueObject(dialogueId, objectName) {
var config = window.FORGE_XAPI_CONFIG;
return {
objectType: "Activity",
id: config.activity_id + ":quest:" + quest.id,
definition: { name: { "fr-FR": quest.title || "Quête" }, type: "http://adlnet.gov/expapi/activities/simulation" },
id: config.activity_id + ":dialogue:" + dialogueId,
definition: { name: { "fr-FR": objectName || "Dialogue" }, type: "http://adlnet.gov/expapi/activities/simulation" },
};
}
function forgeXapiQuestionObject(quest, questionIndex, questionText) {
function forgeXapiQuestionObject(dialogueId, objectName, questionIndex, questionText) {
var config = window.FORGE_XAPI_CONFIG;
return {
objectType: "Activity",
id: config.activity_id + ":quest:" + quest.id + ":question:" + questionIndex,
id: config.activity_id + ":dialogue:" + dialogueId + ":question:" + questionIndex,
definition: {
name: { "fr-FR": "Question " + (questionIndex + 1) + " — " + (quest.title || "Quête") },
name: { "fr-FR": "Question " + (questionIndex + 1) + " — " + (objectName || "Dialogue") },
description: { "fr-FR": questionText || "" },
type: "http://adlnet.gov/expapi/activities/cmi.interaction",
interactionType: "choice",
@@ -146,37 +148,25 @@ function forgeXapiNotifyScoreChanged(newScore) {
);
}
// Granularité quête/quiz (voir dialogue-box-controller.js) : demande
// explicite "il faut savoir quand une quête a été acceptée, à telle
// question quel point obtenu, bien répondu ou non" — un statement DÉDIÉ
// par évènement, distinct du score/statut global (forgeXapiNotify
// ScoreChanged/StatusChanged ci-dessus, qui restent l'activité de
// premier niveau).
function forgeXapiNotifyQuestAccepted(quest) {
if (!window.FORGE_XAPI_CONFIG) return;
// "attempted" (ADL standard) : pas de verbe dédié "accepted" dans le
// vocabulaire ADL de base — attempted rend fidèlement "le joueur s'est
// engagé sur cette quête".
forgeXapiSendStatement(
"http://adlnet.gov/expapi/verbs/attempted",
null, forgeXapiQuestObject(quest)
);
}
function forgeXapiNotifyQuestCompleted(quest) {
// Granularité dialogue/quiz (voir dialogue-box-controller.js) : demande
// explicite "il faut savoir [...] à telle question quel point obtenu,
// bien répondu ou non" — un statement DÉDIÉ par évènement, distinct du
// score/statut global (forgeXapiNotifyScoreChanged/StatusChanged
// ci-dessus, qui restent l'activité de premier niveau).
function forgeXapiNotifyDialogueCompleted(dialogueId, objectName) {
if (!window.FORGE_XAPI_CONFIG) return;
forgeXapiSendStatement(
"http://adlnet.gov/expapi/verbs/completed",
{ completion: true }, forgeXapiQuestObject(quest)
{ completion: true }, forgeXapiDialogueObject(dialogueId, objectName)
);
}
function forgeXapiNotifyQuestionAnswered(quest, questionIndex, questionText, correct, scoreAwarded) {
function forgeXapiNotifyQuestionAnswered(dialogueId, objectName, questionIndex, questionText, correct, scoreAwarded) {
if (!window.FORGE_XAPI_CONFIG) return;
forgeXapiSendStatement(
"http://adlnet.gov/expapi/verbs/answered",
{ success: correct, score: { raw: scoreAwarded || 0 } },
forgeXapiQuestionObject(quest, questionIndex, questionText)
forgeXapiQuestionObject(dialogueId, objectName, questionIndex, questionText)
);
}
@@ -203,7 +193,7 @@ if (typeof window !== "undefined") {
if (typeof module !== "undefined" && module.exports) {
module.exports = {
forgeXapiSendStatement, forgeXapiNotifyScoreChanged, forgeXapiNotifyStatusChanged, FORGE_TO_XAPI_VERB,
forgeXapiNotifyQuestAccepted, forgeXapiNotifyQuestCompleted, forgeXapiNotifyQuestionAnswered,
forgeXapiQuestObject, forgeXapiQuestionObject, FORGE_XAPI_VERB_DISPLAY,
forgeXapiNotifyDialogueCompleted, forgeXapiNotifyQuestionAnswered,
forgeXapiDialogueObject, forgeXapiQuestionObject, FORGE_XAPI_VERB_DISPLAY,
};
}