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