159 lines
4.2 KiB
JavaScript
159 lines
4.2 KiB
JavaScript
/**
|
||
* =========================================
|
||
* TDV_SDK – SENTENCE SEQUENCE (G120)
|
||
* Compatible with Construct 2
|
||
* =========================================
|
||
*/
|
||
|
||
var tdv_sdk = {
|
||
|
||
/* ================= CORE ================= */
|
||
mode: "preview",
|
||
game_code: "G120",
|
||
|
||
gameData: [],
|
||
currentQuestionIndex: 0,
|
||
currentQuestion: null,
|
||
|
||
/* ================= QUESTION ================= */
|
||
correctSentence: "",
|
||
correctWords: [],
|
||
currentWords: [],
|
||
blankCount: 1,
|
||
|
||
/* ================= SLOT ================= */
|
||
placedWords: [],
|
||
blankIndexes: [],
|
||
missingWords: [],
|
||
canSubmit: 0,
|
||
|
||
/* ================= INIT ================= */
|
||
init: function (config) {
|
||
console.log("✅ tdv_sdk.init called", config);
|
||
|
||
window.answerResult = -1;
|
||
window.gameState = 0;
|
||
|
||
// Data được push từ SDK Bridge
|
||
if (window.SDK_GAME_DATA) {
|
||
this.gameData = window.SDK_GAME_DATA;
|
||
}
|
||
|
||
this.loadQuestions();
|
||
},
|
||
|
||
/* ================= LOAD QUESTION ================= */
|
||
loadQuestions: function () {
|
||
var q = this.gameData[this.currentQuestionIndex];
|
||
if (!q) {
|
||
console.warn("No question data");
|
||
return;
|
||
}
|
||
|
||
this.currentQuestion = q;
|
||
|
||
// Chuẩn G120
|
||
this.correctSentence = q.sentence || "";
|
||
this.correctWords = this.correctSentence.split(/\s+/);
|
||
this.blankCount = q.blank_count || 1;
|
||
|
||
this.currentWords = [...this.correctWords];
|
||
|
||
this.resetPlacedWords();
|
||
this.generateBlankIndexes();
|
||
this.generateMissingWords();
|
||
|
||
console.log("📝 Loaded sentence:", this.correctSentence);
|
||
},
|
||
|
||
/* ================= SLOT LOGIC ================= */
|
||
resetPlacedWords: function () {
|
||
this.placedWords = new Array(this.correctWords.length).fill("");
|
||
this.canSubmit = 0;
|
||
},
|
||
|
||
setWordAtSlot: function (word, index) {
|
||
this.placedWords[index] = word;
|
||
this.updateSubmitState();
|
||
},
|
||
|
||
updateSubmitState: function () {
|
||
var filled = this.blankIndexes.filter(i => this.placedWords[i]).length;
|
||
this.canSubmit = (filled === this.blankIndexes.length) ? 1 : 0;
|
||
},
|
||
|
||
/* ================= BLANK ================= */
|
||
generateBlankIndexes: function () {
|
||
var pool = [...Array(this.correctWords.length).keys()];
|
||
pool.sort(() => Math.random() - 0.5);
|
||
this.blankIndexes = pool.slice(0, this.blankCount);
|
||
},
|
||
|
||
generateMissingWords: function () {
|
||
this.missingWords = this.blankIndexes.map(i => this.correctWords[i]);
|
||
},
|
||
|
||
/* ================= BUILD ================= */
|
||
buildUserSentence: function () {
|
||
var result = [];
|
||
for (var i = 0; i < this.correctWords.length; i++) {
|
||
if (this.blankIndexes.includes(i)) {
|
||
result.push(this.placedWords[i] || "");
|
||
} else {
|
||
result.push(this.correctWords[i]);
|
||
}
|
||
}
|
||
return result.join(" ").replace(/\s+/g, " ").trim();
|
||
},
|
||
|
||
/* ================= SUBMIT ================= */
|
||
submitAnswer: function () {
|
||
if (this.canSubmit !== 1) return -1;
|
||
|
||
var userSentence = this.buildUserSentence();
|
||
console.log("📤 SUBMIT:", userSentence);
|
||
|
||
window.answerResult = (userSentence === this.correctSentence) ? 1 : 0;
|
||
window.gameState = 2;
|
||
|
||
return window.answerResult;
|
||
},
|
||
|
||
/* ================= API FOR CONSTRUCT 2 ================= */
|
||
getInstructions: function () {
|
||
return "Drag the missing words to complete the sentence.";
|
||
},
|
||
|
||
getWordsCount: function () {
|
||
return this.correctWords.length;
|
||
},
|
||
|
||
getBlankCount: function () {
|
||
return this.blankIndexes.length;
|
||
},
|
||
|
||
canSubmitAnswer: function () {
|
||
return this.canSubmit;
|
||
},
|
||
|
||
getCurrentScore: function () {
|
||
return window.answerResult === 1 ? 1 : 0;
|
||
},
|
||
|
||
getRemainingTime: function () {
|
||
return 0;
|
||
},
|
||
|
||
getCorrectResultText: function () {
|
||
return this.correctSentence;
|
||
},
|
||
|
||
forceFinishGame: function () {
|
||
window.gameState = 2;
|
||
},
|
||
|
||
leaderboard: function () {
|
||
return "";
|
||
}
|
||
};
|