diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml
new file mode 100644
index 0000000..4a2771a
--- /dev/null
+++ b/.gitea/workflows/deploy.yml
@@ -0,0 +1,90 @@
+name: Deploy to Production
+
+on:
+ push:
+ branches:
+ - main
+ - master
+
+jobs:
+ deploy:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v3
+
+ - name: Deploy to server
+ run: |
+ echo "🚀 Deploying to /var/www/html/games"
+ echo "📁 Current directory: $(pwd)"
+ echo "📁 GITHUB_WORKSPACE: $GITHUB_WORKSPACE"
+
+ # Read game info from readme.md
+ if [ -f "$GITHUB_WORKSPACE/readme.md" ]; then
+ GAME_TITLE=$(sed -n '1p' "$GITHUB_WORKSPACE/readme.md")
+ GAME_DESC=$(sed -n '2p' "$GITHUB_WORKSPACE/readme.md")
+ GAME_TYPE=$(sed -n '3p' "$GITHUB_WORKSPACE/readme.md")
+ else
+ GAME_TITLE="Untitled Game"
+ GAME_DESC="No description"
+ GAME_TYPE="quiz"
+ fi
+
+ # Create base directory
+ mkdir -p /var/www/html/games/
+
+ # Find and deploy all game folders (exclude source, .git, .gitea, etc.)
+ DEPLOYED_FOLDERS=""
+ DEPLOYED_URLS=""
+ for folder in $GITHUB_WORKSPACE/*/; do
+ folder_name=$(basename "$folder")
+
+ # Skip excluded folders
+ if [[ "$folder_name" == "source" ]] || \
+ [[ "$folder_name" == ".git" ]] || \
+ [[ "$folder_name" == ".gitea" ]] || \
+ [[ "$folder_name" == "node_modules" ]] || \
+ [[ "$folder_name" == "logs" ]] || \
+ [[ "$folder_name" == "uploads" ]]; then
+ echo "⏭️ Skipping: $folder_name"
+ continue
+ fi
+
+ # Deploy the folder
+ echo "📦 Deploying: $folder_name"
+ rsync -av --delete "$folder" "/var/www/html/games/$folder_name/"
+ DEPLOYED_FOLDERS="$DEPLOYED_FOLDERS $folder_name"
+ GAME_URL="https://senaai.tech/games/$folder_name/"
+ DEPLOYED_URLS="$DEPLOYED_URLS\n 🔗 $GAME_URL"
+
+ # Get thumbnail (first image found or default)
+ THUMBNAIL=$(find "$folder" -type f \( -name "*.png" -o -name "*.jpg" -o -name "*.jpeg" \) 2>/dev/null | head -n 1 || true)
+ if [ -z "$THUMBNAIL" ]; then
+ THUMBNAIL="https://senaai.tech/games/$folder_name/images/default.png"
+ else
+ THUMBNAIL="https://senaai.tech/games/$folder_name/$(basename "$THUMBNAIL")"
+ fi
+
+ # Submit game info to API
+ echo "📤 Submitting game info to API..."
+ curl --location 'http://senaai.tech:10000/api/games/save-with-check' \
+ --header 'Content-Type: application/x-www-form-urlencoded' \
+ --data-urlencode "title=$GAME_TITLE" \
+ --data-urlencode "description=$GAME_DESC" \
+ --data-urlencode "url=$GAME_URL" \
+ --data-urlencode "thumbnail=$THUMBNAIL" \
+ --data-urlencode "type=$GAME_TYPE" || true
+ echo ""
+ done
+
+ # Show deployment summary
+ echo ""
+ echo "=========================================="
+ echo "🎉 Deployment Completed Successfully!"
+ echo "=========================================="
+ echo ""
+ echo "📍 Deployed URLs:"
+ echo -e "$DEPLOYED_URLS"
+ echo ""
+ echo "=========================================="
\ No newline at end of file
diff --git a/GuessWhatImage/c2runtime.js b/GuessWhatImage/c2runtime.js
index 762b919..b635580 100644
--- a/GuessWhatImage/c2runtime.js
+++ b/GuessWhatImage/c2runtime.js
@@ -19347,6 +19347,15 @@ cr.plugins_.SenaPlugin = function (runtime) {
this.bgMusicPlaying = false;
this.bgMusicPaused = false;
this.calculatedPositions = [];
+ this.customData = {
+ data1: "",
+ data2: "",
+ data3: "",
+ data4: "",
+ data5: ""
+ };
+ this.lastMessageData = null;
+ this.lastSenderUUID = "";
};
instanceProto.onDestroy = function () {
if (this.sdk) {
@@ -19382,6 +19391,9 @@ cr.plugins_.SenaPlugin = function (runtime) {
Cnds.prototype.OnPairWrong = function () {
return true;
};
+ Cnds.prototype.OnMessage = function () {
+ return true;
+ };
pluginProto.cnds = new Cnds();
function Acts() {}
Acts.prototype.Load = function () {
@@ -19389,6 +19401,16 @@ cr.plugins_.SenaPlugin = function (runtime) {
var gameCode = this.properties[0] || "G2510S1T30";
if (window["SenaSDK"]) {
this.sdk = new window["SenaSDK"](gameCode);
+ this.sdk.onCustomMessage = function (data, senderUuid) {
+ console.log('Runtime received custom message from:', senderUuid);
+ console.log('Data:', data);
+ self.lastMessageData = data;
+ self.lastSenderUUID = senderUuid;
+ window["SenaTrigger"].runtime.trigger(
+ cr.plugins_.SenaPlugin.prototype.cnds.OnMessage,
+ window["SenaTrigger"]
+ );
+ };
this.sdk.load(function (success) {
if (success) {
console.log("SDK loaded successfully");
@@ -19512,16 +19534,46 @@ cr.plugins_.SenaPlugin = function (runtime) {
objectWidth,
margin,
maxWidth,
+ rowBreak,
+ rowGap,
+ type,
+ groupGap
) {
- var self = this;
this.calculatedPositions = [];
- var totalWidth = count * objectWidth + (count - 1) * margin;
- var startX = (maxWidth - totalWidth) / 2;
- for (var i = 0; i < count; i++) {
- var posX = startX + i * (objectWidth + margin) + objectWidth / 2;
- this.calculatedPositions.push(posX);
+ if (count <= 0) return;
+ var rows = [];
+ if (rowBreak > 0) {
+ for (var i = 0; i < count; i += rowBreak) {
+ rows.push(Math.min(rowBreak, count - i));
+ }
+ } else {
+ if (count <= 5) {
+ rows.push(count);
+ } else {
+ var top = Math.ceil((count + 1) / 2);
+ var bottom = count - top;
+ rows.push(top);
+ rows.push(bottom);
+ }
}
- console.log("Calculated positions:", this.calculatedPositions);
+ var baseY = 0;
+ if (type === "word") {
+ baseY = groupGap || (rowGap * rows.length); // word always below slot
+ }
+ var index = 0;
+ for (var r = 0; r < rows.length; r++) {
+ var itemsInRow = rows[r];
+ var rowWidth = itemsInRow * objectWidth + (itemsInRow - 1) * margin;
+ var startX = (maxWidth - rowWidth) / 2;
+ for (var i = 0; i < itemsInRow; i++) {
+ this.calculatedPositions.push({
+ x: startX + i * (objectWidth + margin) + objectWidth / 2,
+ y: baseY + r * rowGap
+ });
+ index++;
+ }
+ }
+ console.log("Calculated positions (multi-row):", this.calculatedPositions);
};
Acts.prototype.LoadLevelG5 = function (levelIndex) {
if (this.sdk && this.sdk.loadLevelG5) {
@@ -19546,6 +19598,29 @@ cr.plugins_.SenaPlugin = function (runtime) {
});
}
};
+ Acts.prototype.SetData = function (data1, data2, data3, data4, data5) {
+ this.customData.data1 = data1 || "";
+ this.customData.data2 = data2 || "";
+ this.customData.data3 = data3 || "";
+ this.customData.data4 = data4 || "";
+ this.customData.data5 = data5 || "";
+ console.log('Custom data set:', this.customData);
+ };
+ Acts.prototype.PostMessage = function () {
+ if (this.sdk && this.sdk.sendMessageToParent) {
+ var dataToSend = {
+ data1: this.customData.data1,
+ data2: this.customData.data2,
+ data3: this.customData.data3,
+ data4: this.customData.data4,
+ data5: this.customData.data5
+ };
+ this.sdk.sendMessageToParent(dataToSend);
+ console.log('Posted message to parent:', dataToSend);
+ } else {
+ console.error('SDK not initialized or sendMessageToParent not available');
+ }
+ };
pluginProto.acts = new Acts();
function Exps() {}
Exps.prototype.getQuestionValue = function (ret) {
@@ -19687,12 +19762,15 @@ cr.plugins_.SenaPlugin = function (runtime) {
}
};
Exps.prototype.getPosXbyIndex = function (ret, index) {
- if (
- this.calculatedPositions &&
- index >= 0 &&
- index < this.calculatedPositions.length
- ) {
- ret.set_float(this.calculatedPositions[index]);
+ if (this.calculatedPositions[index]) {
+ ret.set_float(this.calculatedPositions[index].x);
+ } else {
+ ret.set_float(0);
+ }
+ };
+ Exps.prototype.getPosYbyIndex = function (ret, index) {
+ if (this.calculatedPositions[index]) {
+ ret.set_float(this.calculatedPositions[index].y);
} else {
ret.set_float(0);
}
@@ -19754,7 +19832,11 @@ cr.plugins_.SenaPlugin = function (runtime) {
}
};
Exps.prototype.GetCardType = function (ret, index) {
- ret.set_string(this.sdk.getCardType(index));
+ if (this.sdk && this.sdk.getCardType) {
+ ret.set_string(this.sdk.getCardType(index));
+ } else {
+ ret.set_string("");
+ }
};
Exps.prototype.getCardID = function (ret, index) {
if (this.sdk && this.sdk.getCardID) {
@@ -19763,6 +19845,24 @@ cr.plugins_.SenaPlugin = function (runtime) {
ret.set_string("");
}
};
+ Exps.prototype.getData = function (ret, dataIndex) {
+ var dataKey = "data" + dataIndex;
+ if (this.customData && this.customData[dataKey] !== undefined) {
+ ret.set_string(this.customData[dataKey]);
+ } else {
+ ret.set_string("");
+ }
+ };
+ Exps.prototype.getLastSenderUUID = function (ret) {
+ ret.set_string(this.lastSenderUUID || "");
+ };
+ Exps.prototype.getLastMessageJSON = function (ret) {
+ if (this.lastMessageData) {
+ ret.set_string(JSON.stringify(this.lastMessageData));
+ } else {
+ ret.set_string("{}");
+ }
+ };
pluginProto.exps = new Exps();
})();
;
diff --git a/GuessWhatImage/data.js b/GuessWhatImage/data.js
index c1938e8..500b46f 100644
--- a/GuessWhatImage/data.js
+++ b/GuessWhatImage/data.js
@@ -1 +1 @@
-{"project": [null,"game",[[0,true,false,false,false,false,false,false,false,false],[1,true,false,false,false,false,false,false,false,false],[2,true,false,false,false,false,false,false,false,false],[3,true,false,false,false,false,false,false,false,false],[4,false,true,true,true,true,true,true,true,false],[5,false,true,true,true,true,true,true,true,false],[6,true,false,false,false,false,false,false,false,false]],[["t0",4,false,[975465759455818,729104275525496,825507314807987,649217891506031,857609135091132,479423668631189,576819880283526,380937195801304],2,0,null,[["Ani_0",0,false,1,0,false,765947751205185,[["images/card-sheet0.png",395539,0,0,500,500,1,0.5,0.5,[],[],0]]]],[["MoveTo",7,293060518385490],["EaseTween",8,758420754134964]],false,false,683799850332326,[],null],["t1",6,false,[],0,0,null,null,[],false,false,988199772847772,[],null,[1]],["t2",2,false,[],0,0,null,null,[],false,false,822656763098836,[],null,[]],["t3",4,false,[],1,0,null,[["Default",0,false,0,0,false,231747565259900,[["images/game_logo-sheet0.png",72528,0,0,455,159,1,0.5010989308357239,0.5031446814537048,[],[],0]]]],[["Anchor",9,500302417811445]],false,false,254675350440992,[],null],["t4",1,false,[],0,0,null,null,[],false,false,239749088210304,[],null,[]],["t5",4,false,[],4,0,null,[["Default",0,false,1,0,false,383657897249491,[["images/sound_btn-sheet0.png",41500,0,0,149,150,1,0.5033556818962097,0.5,[],[],0]]]],[["Fade",10,253918331834878],["Sine",11,478982365635894],["Anchor",9,912131601440584],["Flash",12,569631461092848]],false,false,953181240130935,[],null],["t6",0,false,[],0,0,null,null,[],false,false,928073173971798,[],null,[0,0,0,1,1,600,600,10000,1]],["t7",4,false,[],2,0,null,[["Default",5,false,1,0,false,791150261241347,[["images/back_btn-sheet0.png",850678,0,0,927,931,1,0.5005393624305725,0.5005370378494263,[],[],0]]]],[["Fade",10,977477371507092],["Flash",12,979927353431974]],false,false,237964247192166,[],null],["t8",4,false,[],2,0,null,[["Default",5,false,1,0,false,157434990924857,[["images/next_btn-sheet0.png",846966,0,0,927,931,1,0.4994606375694275,0.5005370378494263,[],[0.5005393624305725,0.4994629621505737,-0.4994606375694275,0.4994629621505737,-0.4994606375694275,-0.5005370378494263,0.5005393624305725,-0.5005370378494263],0]]]],[["Fade",10,374331319080943],["Flash",12,979284546822042]],false,false,805470565721167,[],null],["t9",4,false,[],1,0,null,[["Default",0,false,1,0,false,321828237677783,[["images/khunganh-sheet0.png",24743,0,0,270,330,1,0.5,0.5,[],[],0]]]],[["Pin",13,825267291423553]],false,false,295036696221311,[],null],["t10",3,false,[],0,0,null,null,[],false,false,503236530930145,[],null,["G5110S1T30"]],["t11",5,false,[],1,0,null,null,[["Anchor",9,846250038771104]],false,false,181130729589984,[],null],["t12",5,false,[951227828334189],2,0,null,null,[["Fade",10,615153456636755],["Pin",13,819994868205948]],false,false,982339991252922,[],null],["t13",4,false,[],2,0,null,[["Default",5,false,1,0,false,848658425611024,[["images/khungword-sheet0.png",56879,0,0,400,200,1,0.5,0.5,[],[],0]]]],[["Pin",13,144523262253220],["Flash",12,695693298000049]],false,false,409440786715511,[],null]],[],[["game",1200,1200,false,"game",731166720789077,[["Layer 0",0,236552894161706,true,[255,255,255],true,0,0,1,false,false,0,0,0,[[[600,500,0,570,570,0,0,1,0.5,0.5,0,0,[]],0,0,[[0],[1],[0],[0],[0],[""],[""],[0]],[[1,1500,0,0],[0,7,0,"300, 300","390, 390",0.5,"0,0",0,0,1,0,""]],[0,"Toto",0,1]],[[183.2669982910156,70,0,352.5509948730469,123.1991958618164,0,0,1,0.5010989308357239,0.5031446814537048,0,0,[]],3,28,[],[[0,0,0,0,1]],[0,"Default",0,1]],[[1130,70,0,120,120,0,0,1,0.5033556818962097,0.5,0,0,[]],5,29,[],[[1,0.4,0,0,0],[0,2,0,1.5,0,0,0,10,0],[1,0,1,1,1],[]],[1,"Default",0,1]],[[87,1110,0,150,150,0,0,1,0.5005393624305725,0.5005370378494263,0,0,[]],7,1,[],[[0,2.5,0,0,0],[]],[0,"Default",0,1]],[[1115,1110,0,150,150,0,0,1,0.4994606375694275,0.5005370378494263,0,0,[]],8,3,[],[[0,2.5,0,0,0],[]],[0,"Default",0,1]],[[600,610,0,788.6084594726563,963.854736328125,0,0,1,0.5,0.5,0,0,[]],9,7,[],[[]],[0,"Default",0,1]],[[600,70,0,373.4697265625,135.6093902587891,0,0,1,0.5,0.5,0,0,[]],11,11,[],[[2,0,0,0,1]],["",1,"italic 72pt Cooper Black","rgb(0,0,0)",1,1,4,0,0]],[[600,900,0,509.8548889160156,254.9274444580078,0,0,1,0.5,0.5,0,0,[]],13,13,[],[[],[]],[0,"Default",0,1]],[[600,880,0,582,205,0,0,1,0.5,0.5,0,0,[]],12,12,[[0]],[[0,0.4,0,0,0],[]],["WordTxt",1,"120pt Cooper Black","rgb(0,0,0)",1,1,4,0,0]]],[]]],[],[]]],[["game",[[1,"isAnswered",0,0,false,false,721783914678024,false],[1,"isShowCard",0,0,false,false,696259973358206,false],[1,"isSelect",0,0,false,false,284264120358678,false],[1,"TotalLevels",0,1,false,false,982492760099667,false],[1,"LevelIndex",0,1,false,false,806302704874710,false],[0,null,false,null,217103863945609,[[-1,14,null,1,false,false,false,101909987686571,false]],[[0,15,null,175989127941217,false],[9,15,null,992006096135561,false],[13,15,null,320441319187071,false],[5,16,null,979389846999231,false,[[3,0]]],[10,17,null,461156092453576,false]]],[0,null,false,null,757021961611976,[[10,18,null,1,false,false,false,461682631118177,false]],[[10,19,null,642371324528895,false]]],[0,null,false,null,493776937014364,[[-1,20,null,0,false,false,false,150147469108772,false,[[7,[23,"LevelIndex"]],[8,0],[7,[0,1]]]]],[[7,16,null,762922129416663,false,[[3,0]]]]],[0,null,false,null,272731491884337,[[-1,20,null,0,false,false,false,854554106824119,false,[[7,[23,"LevelIndex"]],[8,5],[7,[23,"TotalLevels"]]]]],[[8,16,null,143596271356101,false,[[3,0]]]]],[0,null,false,null,169385224197935,[[10,21,null,1,false,false,false,492583807860482,false]],[[-1,22,null,941036648489897,false,[[11,"TotalLevels"],[7,[19,23,[[20,4,24,false,null,[[2,"window.Sena_TotalLevels"]]]]]]]],[2,25,null,405721744804825,false,[[1,[2,"loadCardInfo"]],[13]]]]],[0,null,false,null,684429374740194,[[1,26,null,1,false,false,false,458587190035044,false,[[4,5]]],[5,27,null,0,false,false,false,984592513384585,false],[-1,28,null,0,false,false,false,803123909512606,false,[[11,"isAnswered"],[8,0],[7,[0,1]]]]],[[6,29,null,622730582422694,false,[[2,["bubble-pop-389501",false]],[3,0],[0,[0,0]],[1,[2,""]]]],[5,30,"Flash",266725771249830,false,[[0,[1,0.1]],[0,[1,0.1]],[0,[1,0.4]]]],[-1,31,null,683315478819125,false,[[0,[1,0.5]]]],[4,32,null,268429162294308,false,[[1,[10,[10,[2,"if(window.senaAudio) window.senaAudio.pause(); window.senaAudio = new Audio('"],[21,0,true,null,6]],[2,"'); window.senaAudio.play();"]]]]]]],[0,null,false,null,419463852296985,[[2,33,null,2,false,false,false,318036699234215,false,[[1,[2,"loadCardInfo"]]]]],[[11,34,null,600615528495773,false,[[7,[10,[10,[23,"LevelIndex"],[2,"/"]],[23,"TotalLevels"]]]]],[11,35,null,262037359086793,false,[[3,1]]],[-1,22,null,510831577304047,false,[[11,"isAnswered"],[7,[0,0]]]],[0,15,null,561087997040425,false],[9,15,null,820033603497003,false],[13,15,null,401894325229006,false],[12,36,null,746876531325977,false],[5,16,null,907729363689173,false,[[3,0]]],[-1,37,null,542297324207384,false,[[4,0],[5,[0,0]],[0,[0,600]],[0,[0,3000]]]],[-1,37,null,328132306969883,false,[[4,9],[5,[0,0]],[0,[20,0,38,false,null]],[0,[4,[20,0,39,false,null],[0,110]]]]],[0,40,null,265822402908942,false,[[10,3],[7,[0,600]]]],[0,40,null,924546211037543,false,[[10,4],[7,[0,500]]]],[9,41,"Pin",132719609704425,false,[[4,0],[3,1]]],[-1,37,null,197032459307950,false,[[4,13],[5,[0,0]],[0,[20,0,38,false,null]],[0,[4,[20,0,39,false,null],[0,390]]]]],[13,41,"Pin",936147973231556,false,[[4,0],[3,0]]],[-1,37,null,565887315642314,false,[[4,12],[5,[0,0]],[0,[20,0,38,false,null]],[0,[4,[20,0,39,false,null],[0,400]]]]],[12,34,null,559903272008684,false,[[7,[20,10,42,true,null,[[0,0]]]]]],[12,43,null,361637019092684,false,[[0,[19,44,[[6,[0,48],[7,[0,8],[19,45,[[0,1],[19,46,[[20,12,47,true,null]]]]]]],[0,36],[0,120]]]]]],[12,41,"Pin",513775112079069,false,[[4,0],[3,0]]],[12,35,null,531888382216080,false,[[3,0]]]],[[0,null,false,null,690714029755197,[],[[-1,31,null,691582355437284,false,[[0,[1,0.001]]]],[2,25,null,927552591189718,false,[[1,[2,"fillCardInfo"]],[13]]]],[[0,null,false,null,479617940469453,[[-1,20,null,0,false,false,false,510862544493008,false,[[7,[23,"TotalLevels"]],[8,4],[7,[0,0]]]]],[[7,16,null,580766305751680,false,[[3,1]]]]],[0,null,false,null,236839672226595,[[-1,20,null,0,false,false,false,278995991937589,false,[[7,[23,"LevelIndex"]],[8,2],[7,[23,"TotalLevels"]]]]],[[8,16,null,700977039271119,false,[[3,1]]]]]]]]],[0,null,false,null,788340971630226,[[2,33,null,2,false,false,false,936501693225623,false,[[1,[2,"fillCardInfo"]]]]],[[0,40,null,606020689905980,false,[[10,5],[7,[20,10,48,true,null,[[0,0]]]]]],[0,49,null,583677158247186,false,[[1,[21,0,true,null,5]],[3,1],[3,0]]],[0,40,null,291772826593629,false,[[10,6],[7,[20,10,50,true,null,[[0,0]]]]]]]],[0,null,false,null,600664721449028,[[0,51,null,1,false,false,false,905486229983800,false]],[[-1,31,null,400772186436529,false,[[0,[1,0.5]]]],[0,52,"MoveTo",700198768840950,false,[[0,[21,0,false,null,3]],[0,[21,0,false,null,4]]]],[-1,31,null,185970977374212,false,[[0,[1,0.5]]]]]],[0,null,false,null,122085279532729,[[1,26,null,1,false,false,false,529668355207196,false,[[4,8]]],[8,27,null,0,false,false,false,698535954788029,false]],[[6,29,null,294505429920824,false,[[2,["button-124476",false]],[3,0],[0,[0,30]],[1,[2,""]]]],[-1,53,null,916816963174213,false,[[11,"LevelIndex"],[7,[0,1]]]],[8,30,"Flash",287272233347458,false,[[0,[1,0.1]],[0,[1,0.1]],[0,[1,0.4]]]],[-1,31,null,909490174479384,false,[[0,[1,0.5]]]],[8,16,null,902371119294717,false,[[3,0]]],[10,54,null,563013083325415,false,[[0,[23,"LevelIndex"]]]],[2,25,null,788381876084925,false,[[1,[2,"loadCardInfo"]],[13]]],[8,55,"Fade",913768022421514,false],[7,55,"Fade",383210746522068,false]]],[0,null,false,null,470324472522613,[[1,26,null,1,false,false,false,310798396079510,false,[[4,7]]],[7,27,null,0,false,false,false,829064289684603,false]],[[6,29,null,599777186176114,false,[[2,["button-124476",false]],[3,0],[0,[0,30]],[1,[2,""]]]],[-1,56,null,814921513408808,false,[[11,"LevelIndex"],[7,[0,1]]]],[7,30,"Flash",203769182686037,false,[[0,[1,0.1]],[0,[1,0.1]],[0,[1,0.4]]]],[-1,31,null,122526801090360,false,[[0,[1,0.5]]]],[7,16,null,779528114036304,false,[[3,0]]],[10,54,null,971783826696615,false,[[0,[23,"LevelIndex"]]]],[2,25,null,978540482999268,false,[[1,[2,"loadCardInfo"]],[13]]],[8,55,"Fade",288645156407944,false],[7,55,"Fade",598331710108056,false]]],[0,null,false,null,978731514592730,[[1,26,null,1,false,false,false,440724442284029,false,[[4,13]]],[-1,28,null,0,false,false,false,426248066064324,false,[[11,"isAnswered"],[8,1],[7,[0,1]]]]],[[-1,22,null,185684112090752,false,[[11,"isAnswered"],[7,[0,1]]]],[6,29,null,902750167429973,false,[[2,["bubble-pop-389501",false]],[3,0],[0,[0,0]],[1,[2,""]]]],[13,30,"Flash",295677783289412,false,[[0,[1,0.1]],[0,[1,0.1]],[0,[1,0.5]]]],[12,55,"Fade",460355304434110,false],[5,55,"Fade",468241337826015,false],[-1,31,null,703407656018188,false,[[0,[1,0.4]]]],[13,15,null,636619207258367,false],[12,57,null,984213059243036,false],[12,35,null,187281603213804,false,[[3,1]]],[5,16,null,704013734391456,false,[[3,1]]]]]]]],[["alert-234711.ogg",23907],["bubble-pop-389501.ogg",18257],["button-124476.ogg",13157]],"media/",false,1200,1200,3,true,true,true,"1.0.0.0",true,false,3,0,31,false,true,1,true,"GuessWhatImage",0,[]]}
\ No newline at end of file
+{"project": [null,"game",[[0,true,false,false,false,false,false,false,false,false],[1,true,false,false,false,false,false,false,false,false],[2,true,false,false,false,false,false,false,false,false],[3,true,false,false,false,false,false,false,false,false],[4,false,true,true,true,true,true,true,true,false],[5,false,true,true,true,true,true,true,true,false],[6,true,false,false,false,false,false,false,false,false]],[["t0",4,false,[975465759455818,729104275525496,825507314807987,649217891506031,857609135091132,479423668631189,576819880283526,380937195801304],2,0,null,[["Ani_0",0,false,1,0,false,765947751205185,[["images/card-sheet0.png",349,0,0,500,500,1,0.5,0.5,[],[],3]]]],[["MoveTo",7,293060518385490],["EaseTween",8,758420754134964]],false,false,683799850332326,[],null],["t1",6,false,[],0,0,null,null,[],false,false,988199772847772,[],null,[1]],["t2",2,false,[],0,0,null,null,[],false,false,822656763098836,[],null,[]],["t3",4,false,[],1,0,null,[["Default",0,false,0,0,false,231747565259900,[["images/game_logo-sheet0.png",72528,0,0,455,159,1,0.5010989308357239,0.5031446814537048,[],[],0]]]],[["Anchor",9,500302417811445]],false,false,254675350440992,[],null],["t4",1,false,[],0,0,null,null,[],false,false,239749088210304,[],null,[]],["t5",4,false,[],4,0,null,[["Default",0,false,1,0,false,383657897249491,[["images/sound_btn-sheet0.png",41500,0,0,149,150,1,0.5033556818962097,0.5,[],[],0]]]],[["Fade",10,253918331834878],["Sine",11,478982365635894],["Anchor",9,912131601440584],["Flash",12,569631461092848]],false,false,953181240130935,[],null],["t6",0,false,[],0,0,null,null,[],false,false,928073173971798,[],null,[0,0,0,1,1,600,600,10000,1]],["t7",4,false,[],2,0,null,[["Default",5,false,1,0,false,791150261241347,[["images/back_btn-sheet0.png",850678,0,0,927,931,1,0.5005393624305725,0.5005370378494263,[],[],0]]]],[["Fade",10,977477371507092],["Flash",12,979927353431974]],false,false,237964247192166,[],null],["t8",4,false,[],2,0,null,[["Default",5,false,1,0,false,157434990924857,[["images/next_btn-sheet0.png",846966,0,0,927,931,1,0.4994606375694275,0.5005370378494263,[],[0.5005393624305725,0.4994629621505737,-0.4994606375694275,0.4994629621505737,-0.4994606375694275,-0.5005370378494263,0.5005393624305725,-0.5005370378494263],0]]]],[["Fade",10,374331319080943],["Flash",12,979284546822042]],false,false,805470565721167,[],null],["t9",4,false,[],1,0,null,[["Default",0,false,1,0,false,321828237677783,[["images/khunganh-sheet0.png",24743,0,0,270,330,1,0.5,0.5,[],[],0]]]],[["Pin",13,825267291423553]],false,false,295036696221311,[],null],["t10",3,false,[],0,0,null,null,[],false,false,503236530930145,[],null,["G5110S1T30"]],["t11",5,false,[],1,0,null,null,[["Anchor",9,846250038771104]],false,false,181130729589984,[],null],["t12",5,false,[951227828334189],2,0,null,null,[["Fade",10,615153456636755],["Pin",13,819994868205948]],false,false,982339991252922,[],null],["t13",4,false,[],2,0,null,[["Default",5,false,1,0,false,848658425611024,[["images/khungword-sheet0.png",56879,0,0,400,200,1,0.5,0.5,[],[],0]]]],[["Pin",13,144523262253220],["Flash",12,695693298000049]],false,false,409440786715511,[],null]],[],[["game",1200,1200,false,"game",731166720789077,[["Layer 0",0,236552894161706,true,[255,255,255],true,0,0,1,false,false,0,0,0,[[[600,500,0,570,570,0,0,1,0.5,0.5,0,0,[]],0,0,[[0],[1],[0],[0],[0],[""],[""],[0]],[[1,1500,0,0],[0,7,0,"300, 300","390, 390",0.5,"0,0",0,0,1,0,""]],[0,"Toto",0,1]],[[183.2669982910156,70,0,352.5509948730469,123.1991958618164,0,0,1,0.5010989308357239,0.5031446814537048,0,0,[]],3,28,[],[[0,0,0,0,1]],[0,"Default",0,1]],[[1130,70,0,120,120,0,0,1,0.5033556818962097,0.5,0,0,[]],5,29,[],[[1,0.4,0,0,0],[0,2,0,1.5,0,0,0,10,0],[1,0,1,1,1],[]],[1,"Default",0,1]],[[87,1110,0,150,150,0,0,1,0.5005393624305725,0.5005370378494263,0,0,[]],7,1,[],[[0,2.5,0,0,0],[]],[0,"Default",0,1]],[[1115,1110,0,150,150,0,0,1,0.4994606375694275,0.5005370378494263,0,0,[]],8,3,[],[[0,2.5,0,0,0],[]],[0,"Default",0,1]],[[600,610,0,788.6084594726563,963.854736328125,0,0,1,0.5,0.5,0,0,[]],9,7,[],[[]],[0,"Default",0,1]],[[600,75,0,373.4697265625,135.6093902587891,0,0,1,0.5,0.5,0,0,[]],11,11,[],[[2,0,0,0,1]],["",1,"bold 72pt Segoe UI","rgb(0,0,0)",1,1,4,0,0]],[[600,900,0,509.8548889160156,254.9274444580078,0,0,1,0.5,0.5,0,0,[]],13,13,[],[[],[]],[0,"Default",0,1]],[[600,880,0,582,205,0,0,1,0.5,0.5,0,0,[]],12,12,[[0]],[[0,0.4,0,0,0],[]],["WordTxt",1,"bold 120pt Segoe UI","rgb(0,0,0)",1,1,4,0,0]]],[]]],[],[]]],[["game",[[1,"isAnswered",0,0,false,false,721783914678024,false],[1,"isShowCard",0,0,false,false,696259973358206,false],[1,"isSelect",0,0,false,false,284264120358678,false],[1,"TotalLevels",0,1,false,false,982492760099667,false],[1,"LevelIndex",0,1,false,false,806302704874710,false],[0,null,false,null,217103863945609,[[-1,14,null,1,false,false,false,101909987686571,false]],[[0,15,null,175989127941217,false],[9,15,null,992006096135561,false],[13,15,null,320441319187071,false],[5,16,null,979389846999231,false,[[3,0]]],[10,17,null,461156092453576,false]]],[0,null,false,null,757021961611976,[[10,18,null,1,false,false,false,461682631118177,false]],[[10,19,null,642371324528895,false]]],[0,null,false,null,493776937014364,[[-1,20,null,0,false,false,false,150147469108772,false,[[7,[23,"LevelIndex"]],[8,0],[7,[0,1]]]]],[[7,16,null,762922129416663,false,[[3,0]]]]],[0,null,false,null,272731491884337,[[-1,20,null,0,false,false,false,854554106824119,false,[[7,[23,"LevelIndex"]],[8,5],[7,[23,"TotalLevels"]]]]],[[8,16,null,143596271356101,false,[[3,0]]]]],[0,null,false,null,169385224197935,[[10,21,null,1,false,false,false,492583807860482,false]],[[-1,22,null,941036648489897,false,[[11,"TotalLevels"],[7,[19,23,[[20,4,24,false,null,[[2,"window.Sena_TotalLevels"]]]]]]]],[2,25,null,405721744804825,false,[[1,[2,"loadCardInfo"]],[13]]]]],[0,null,false,null,684429374740194,[[1,26,null,1,false,false,false,458587190035044,false,[[4,5]]],[5,27,null,0,false,false,false,984592513384585,false],[-1,28,null,0,false,false,false,803123909512606,false,[[11,"isAnswered"],[8,0],[7,[0,1]]]]],[[6,29,null,622730582422694,false,[[2,["bubble-pop-389501",false]],[3,0],[0,[0,0]],[1,[2,""]]]],[5,30,"Flash",266725771249830,false,[[0,[1,0.1]],[0,[1,0.1]],[0,[1,0.4]]]],[-1,31,null,683315478819125,false,[[0,[1,0.5]]]],[4,32,null,268429162294308,false,[[1,[10,[10,[2,"if(window.senaAudio) window.senaAudio.pause(); window.senaAudio = new Audio('"],[21,0,true,null,6]],[2,"'); window.senaAudio.play();"]]]]]]],[0,null,false,null,419463852296985,[[2,33,null,2,false,false,false,318036699234215,false,[[1,[2,"loadCardInfo"]]]]],[[11,34,null,600615528495773,false,[[7,[10,[10,[23,"LevelIndex"],[2,"/"]],[23,"TotalLevels"]]]]],[11,35,null,262037359086793,false,[[3,1]]],[-1,22,null,510831577304047,false,[[11,"isAnswered"],[7,[0,0]]]],[0,15,null,561087997040425,false],[9,15,null,820033603497003,false],[13,15,null,401894325229006,false],[12,36,null,746876531325977,false],[5,16,null,907729363689173,false,[[3,0]]],[-1,37,null,542297324207384,false,[[4,0],[5,[0,0]],[0,[0,600]],[0,[0,3000]]]],[-1,37,null,328132306969883,false,[[4,9],[5,[0,0]],[0,[20,0,38,false,null]],[0,[4,[20,0,39,false,null],[0,110]]]]],[0,40,null,265822402908942,false,[[10,3],[7,[0,600]]]],[0,40,null,924546211037543,false,[[10,4],[7,[0,500]]]],[9,41,"Pin",132719609704425,false,[[4,0],[3,1]]],[-1,37,null,197032459307950,false,[[4,13],[5,[0,0]],[0,[20,0,38,false,null]],[0,[4,[20,0,39,false,null],[0,390]]]]],[13,41,"Pin",936147973231556,false,[[4,0],[3,0]]],[-1,37,null,565887315642314,false,[[4,12],[5,[0,0]],[0,[20,0,38,false,null]],[0,[4,[20,0,39,false,null],[0,400]]]]],[12,34,null,559903272008684,false,[[7,[20,10,42,true,null,[[0,0]]]]]],[12,43,null,361637019092684,false,[[0,[19,44,[[6,[0,48],[7,[0,8],[19,45,[[0,1],[19,46,[[20,12,47,true,null]]]]]]],[0,36],[0,120]]]]]],[12,41,"Pin",513775112079069,false,[[4,0],[3,0]]],[12,35,null,531888382216080,false,[[3,0]]]],[[0,null,false,null,690714029755197,[],[[-1,31,null,691582355437284,false,[[0,[1,0.001]]]],[2,25,null,927552591189718,false,[[1,[2,"fillCardInfo"]],[13]]]],[[0,null,false,null,479617940469453,[[-1,20,null,0,false,false,false,510862544493008,false,[[7,[23,"TotalLevels"]],[8,4],[7,[0,0]]]]],[[7,16,null,580766305751680,false,[[3,1]]]]],[0,null,false,null,236839672226595,[[-1,20,null,0,false,false,false,278995991937589,false,[[7,[23,"LevelIndex"]],[8,2],[7,[23,"TotalLevels"]]]]],[[8,16,null,700977039271119,false,[[3,1]]]]]]]]],[0,null,false,null,788340971630226,[[2,33,null,2,false,false,false,936501693225623,false,[[1,[2,"fillCardInfo"]]]]],[[0,40,null,606020689905980,false,[[10,5],[7,[20,10,48,true,null,[[0,0]]]]]],[0,49,null,583677158247186,false,[[1,[21,0,true,null,5]],[3,1],[3,0]]],[0,40,null,291772826593629,false,[[10,6],[7,[20,10,50,true,null,[[0,0]]]]]]]],[0,null,false,null,600664721449028,[[0,51,null,1,false,false,false,905486229983800,false]],[[-1,31,null,400772186436529,false,[[0,[1,0.5]]]],[0,52,"MoveTo",700198768840950,false,[[0,[21,0,false,null,3]],[0,[21,0,false,null,4]]]],[-1,31,null,185970977374212,false,[[0,[1,0.5]]]]]],[0,null,false,null,122085279532729,[[1,26,null,1,false,false,false,529668355207196,false,[[4,8]]],[8,27,null,0,false,false,false,698535954788029,false]],[[6,29,null,294505429920824,false,[[2,["button-124476",false]],[3,0],[0,[0,30]],[1,[2,""]]]],[-1,53,null,916816963174213,false,[[11,"LevelIndex"],[7,[0,1]]]],[8,30,"Flash",287272233347458,false,[[0,[1,0.1]],[0,[1,0.1]],[0,[1,0.4]]]],[-1,31,null,909490174479384,false,[[0,[1,0.5]]]],[8,16,null,902371119294717,false,[[3,0]]],[10,54,null,563013083325415,false,[[0,[23,"LevelIndex"]]]],[2,25,null,788381876084925,false,[[1,[2,"loadCardInfo"]],[13]]],[8,55,"Fade",913768022421514,false],[7,55,"Fade",383210746522068,false]]],[0,null,false,null,470324472522613,[[1,26,null,1,false,false,false,310798396079510,false,[[4,7]]],[7,27,null,0,false,false,false,829064289684603,false]],[[6,29,null,599777186176114,false,[[2,["button-124476",false]],[3,0],[0,[0,30]],[1,[2,""]]]],[-1,56,null,814921513408808,false,[[11,"LevelIndex"],[7,[0,1]]]],[7,30,"Flash",203769182686037,false,[[0,[1,0.1]],[0,[1,0.1]],[0,[1,0.4]]]],[-1,31,null,122526801090360,false,[[0,[1,0.5]]]],[7,16,null,779528114036304,false,[[3,0]]],[10,54,null,971783826696615,false,[[0,[23,"LevelIndex"]]]],[2,25,null,978540482999268,false,[[1,[2,"loadCardInfo"]],[13]]],[8,55,"Fade",288645156407944,false],[7,55,"Fade",598331710108056,false]]],[0,null,false,null,978731514592730,[[1,26,null,1,false,false,false,440724442284029,false,[[4,13]]],[-1,28,null,0,false,false,false,426248066064324,false,[[11,"isAnswered"],[8,1],[7,[0,1]]]]],[[-1,22,null,185684112090752,false,[[11,"isAnswered"],[7,[0,1]]]],[6,29,null,902750167429973,false,[[2,["bubble-pop-389501",false]],[3,0],[0,[0,0]],[1,[2,""]]]],[13,30,"Flash",295677783289412,false,[[0,[1,0.1]],[0,[1,0.1]],[0,[1,0.5]]]],[12,55,"Fade",460355304434110,false],[5,55,"Fade",468241337826015,false],[-1,31,null,703407656018188,false,[[0,[1,0.4]]]],[13,15,null,636619207258367,false],[12,57,null,984213059243036,false],[12,35,null,187281603213804,false,[[3,1]]],[5,16,null,704013734391456,false,[[3,1]]]]]]]],[["alert-234711.ogg",23907],["bubble-pop-389501.ogg",18257],["button-124476.ogg",13157]],"media/",false,1200,1200,3,true,true,true,"1.0.0.0",true,false,3,0,31,false,true,1,true,"GuessWhatImage",0,[]]}
\ No newline at end of file
diff --git a/GuessWhatImage/images/card-sheet0.png b/GuessWhatImage/images/card-sheet0.png
index d301c35..34e46e3 100644
Binary files a/GuessWhatImage/images/card-sheet0.png and b/GuessWhatImage/images/card-sheet0.png differ
diff --git a/GuessWhatImage/index.html b/GuessWhatImage/index.html
index f177c73..ca04462 100644
--- a/GuessWhatImage/index.html
+++ b/GuessWhatImage/index.html
@@ -81,7 +81,7 @@
-
+
diff --git a/GuessWhatImage/loading-logo.png b/GuessWhatImage/loading-logo.png
index 534eebc..104b882 100644
Binary files a/GuessWhatImage/loading-logo.png and b/GuessWhatImage/loading-logo.png differ
diff --git a/GuessWhatImage/offline.js b/GuessWhatImage/offline.js
index 5c5a663..051febd 100644
--- a/GuessWhatImage/offline.js
+++ b/GuessWhatImage/offline.js
@@ -1,5 +1,5 @@
{
- "version": 1770529725,
+ "version": 1772168306,
"fileList": [
"data.js",
"c2runtime.js",
@@ -21,7 +21,6 @@
"icon-128.png",
"icon-256.png",
"loading-logo.png",
- "bg.mp4",
"sena_sdk.js"
]
}
\ No newline at end of file
diff --git a/GuessWhatImage/sena_sdk.js b/GuessWhatImage/sena_sdk.js
index 6443755..306dfa5 100644
--- a/GuessWhatImage/sena_sdk.js
+++ b/GuessWhatImage/sena_sdk.js
@@ -50,6 +50,7 @@ function SenaSDK(gid = "G2510S1T30") {
// 'preview' - Timeout 5s rồi fallback sample (testing với data thật)
// 'dev' - Load sample ngay lập tức (development)
this.mode = "preview"; // Default mode
+ this.role = "student"; // Default role
}
/**
@@ -118,6 +119,7 @@ SenaSDK.prototype.loadFromPostMessage = function (inputJson, callback) {
console.warn("⚠️ Sena SDK: tdv_sdk not found, storing data locally");
self.data = inputJson.data;
self.correctAnswer = inputJson.answer;
+ self._parseGameCode(); // Thêm dòng này để SDK đọc đuôi thời gian T30
if (callback) callback(true);
}
return true;
@@ -373,9 +375,15 @@ SenaSDK.prototype.load = function (callback, template = "G2510S1T30") {
self.mode = urlMode.toLowerCase();
}
+ // THÊM 2 DÒNG NÀY: Lấy role từ URL
+ const urlRole = urlParams.get("role");
+ if (urlRole) self.role = urlRole.toLowerCase();
+
console.log(
"🎮 Sena SDK: Mode =",
self.mode.toUpperCase(),
+ "| Role =",
+ self.role || "student",
"| GameCode =",
self.gameCode,
);
@@ -878,14 +886,12 @@ SenaSDK.prototype.guide = function () {
return guide;
};
/**
- * Get the question text
- * @returns {string} Question or request text
+ * Get the question text/url
+ * @returns {string} Question, request text, or URL
*/
SenaSDK.prototype.getQuestionValue = function () {
var q = String(this.data.question || "").trim();
- if (q.toLowerCase().startsWith("http")) {
- return "";
- }
+ // Đã bỏ chặn URL để có thể lấy link ảnh/audio
return q;
};
/**
@@ -1138,10 +1144,13 @@ SenaSDK.prototype.end = function (answer, callback) {
}
}
- // 3. COMPARE (UNORDERED - So sánh không cần thứ tự)
- // Sort cả 2 mảng để so sánh tập hợp
- const sortedUser = [...userAnswers].sort();
- const sortedCorrect = [...correctAnswers].sort();
+ // 3. COMPARE
+ // Nếu là Game Type 2 (Sort) thì giữ nguyên thứ tự, nếu không thì sort (unordered)
+ const isStrictOrder = self.gameType === 2;
+ const finalUser = isStrictOrder ? [...userAnswers] : [...userAnswers].sort();
+ const finalCorrect = isStrictOrder
+ ? [...correctAnswers]
+ : [...correctAnswers].sort();
let isCorrect = false;
@@ -1155,9 +1164,9 @@ SenaSDK.prototype.end = function (answer, callback) {
}
};
- if (sortedUser.length === sortedCorrect.length) {
- isCorrect = sortedUser.every((uVal, index) => {
- let cVal = sortedCorrect[index];
+ if (finalUser.length === finalCorrect.length) {
+ isCorrect = finalUser.every((uVal, index) => {
+ let cVal = finalCorrect[index];
if (uVal === cVal) return true;
// Fuzzy match cho URL (so sánh tên file ảnh)
if (uVal.startsWith("http") || cVal.startsWith("http")) {
@@ -1170,7 +1179,12 @@ SenaSDK.prototype.end = function (answer, callback) {
// -----------------------------------------------------------
// [BƯỚC 1] Kiểm tra Time Limit TRƯỚC (Sửa biến isCorrect)
// -----------------------------------------------------------
- if (self.timeLimit > 0 && duration > self.timeLimit) {
+ // THÊM ĐIỀU KIỆN: Nếu là teacher thì bỏ qua kiểm tra thời gian
+ if (
+ self.role !== "teacher" &&
+ self.timeLimit > 0 &&
+ duration > self.timeLimit
+ ) {
isCorrect = false; // CHỈ sửa biến boolean, KHÔNG gọi result.isCorrect
console.log("🎮 Sena SDK: Time Limit Exceeded -> Result set to False");
}
@@ -1373,6 +1387,17 @@ SenaSDK.prototype.registerPostMessageListener = function () {
}
break;
+ case "SEQUENCE_SYNC":
+ console.log("📥 Sena SDK: Received SEQUENCE_SYNC", event.data);
+ if (event.data.uuid === self.uuid) {
+ console.log("🔄 Sena SDK: Own message echoed back, processing...");
+ }
+
+ if (typeof self.onCustomMessage === "function") {
+ self.onCustomMessage(event.data.data, event.data.uuid);
+ }
+ break;
+
case "SDK_ERROR":
// Server gửi error
console.error("❌ Sena SDK: Received SDK_ERROR", event.data.payload);
@@ -1855,6 +1880,33 @@ SenaSDK.prototype.checkPair = function (idx1, idx2, callback) {
if (callback) callback(isMatch);
};
+/**
+ * [NEW v2.2] Gửi Custom Data lên Parent Window
+ * @param {Object} data - Object chứa 5 trường data1 -> data5
+ */
+SenaSDK.prototype.sendMessageToParent = function (data) {
+ let self = this;
+
+ // Tự động tạo UUID cho session nếu chưa có
+ if (!self.uuid) {
+ self.uuid =
+ "session-" + Date.now() + "-" + Math.floor(Math.random() * 10000);
+ }
+
+ // Đóng gói payload đúng chuẩn tài liệu v2.2
+ let payload = {
+ type: "SEQUENCE_SYNC",
+ uuid: self.uuid,
+ data: data,
+ timestamp: Date.now(),
+ };
+
+ console.log("📤 Sena SDK: Sending SEQUENCE_SYNC to parent:", payload);
+
+ // Gửi lên Parent Window (Backend/Iframe parent)
+ window.parent.postMessage(payload, "*");
+};
+
if (typeof module !== "undefined" && module.exports) {
module.exports = SenaSDK;
} else if (typeof define === "function" && define.amd) {
diff --git a/readme.md b/readme.md
new file mode 100644
index 0000000..a35323d
--- /dev/null
+++ b/readme.md
@@ -0,0 +1,3 @@
+Sequence Word TextOnly
+Mô tả của trò chơi
+Sequence
\ No newline at end of file
diff --git a/source/GuessWhatImage.capx b/source/GuessWhatImage.capx
index 9ad220b..e900e4e 100644
Binary files a/source/GuessWhatImage.capx and b/source/GuessWhatImage.capx differ