student 2 週間 前
コミット
08e50d4bec
25 ファイル変更267 行追加115 行削除
  1. BIN
      Kitty_Fall/Content.xlsx
  2. BIN
      Kitty_Fall/Content_da_dich_2.xlsx
  3. 1 1
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Apis/Language/Lang.Designer.cs
  4. 2 2
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Apis/Language/Lang.resx
  5. 57 50
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Apis/Language/Lang.vi.resx
  6. 0 1
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Language/Lang.Designer.cs
  7. 0 0
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/catpuzzle/data.json
  8. BIN
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/catpuzzle/images/block1a-sheet0.webp
  9. BIN
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/catpuzzle/images/block1a-sheet1.webp
  10. BIN
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/catpuzzle/images/cats-sheet4.webp
  11. BIN
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/catpuzzle/images/shared-0-sheet1.webp
  12. BIN
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/catpuzzle/images/shared-0-sheet2.webp
  13. BIN
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/catpuzzle/images/shared-0-sheet3.webp
  14. BIN
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/catpuzzle/images/shared-0-sheet4.webp
  15. BIN
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/catpuzzle/images/shared-0-sheet5.webp
  16. BIN
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/catpuzzle/images/shared-0-sheet6.webp
  17. BIN
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/catpuzzle/images/sprite3-sheet0.webp
  18. BIN
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/catpuzzle/images/sprite3-sheet1.webp
  19. BIN
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/catpuzzle/images/sprite3-sheet2.webp
  20. 1 1
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/catpuzzle/offline.json
  21. 0 0
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/catpuzzle/scripts/c3runtime.js
  22. 0 0
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/catpuzzle/scripts/main.js
  23. 14 11
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/catpuzzle/scripts/objRefTable.js
  24. 116 49
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/catpuzzle/scripts/project/main.js
  25. 76 0
      Kitty_Fall/Kitty_Fall/sql/20260716_sync_game_sequences.sql

BIN
Kitty_Fall/Content.xlsx


BIN
Kitty_Fall/Content_da_dich_2.xlsx


+ 1 - 1
Kitty_Fall/Kitty_Fall/Kitty_Fall.Apis/Language/Lang.Designer.cs

@@ -340,7 +340,7 @@ namespace Kitty_Fall.Apis.Language {
         }
         
         /// <summary>
-        ///   Looks up a localized string similar to HobbyHub Modpas ou se :.
+        ///   Looks up a localized string similar to KittyFall Modpas ou se :.
         /// </summary>
         public static string passwordIs {
             get {

+ 2 - 2
Kitty_Fall/Kitty_Fall/Kitty_Fall.Apis/Language/Lang.resx

@@ -178,7 +178,7 @@
     <value>Package not found</value>
   </data>
   <data name="passwordIs" xml:space="preserve">
-    <value>HobbyHub Modpas ou se :</value>
+    <value>KittyFall Modpas ou se :</value>
   </data>
   <data name="registerSuccess" xml:space="preserve">
     <value>Register success!</value>
@@ -252,4 +252,4 @@
   <data name="ussdTimeout" xml:space="preserve">
     <value>USSD request timed out</value>
   </data>
-</root>
+</root>

+ 57 - 50
Kitty_Fall/Kitty_Fall/Kitty_Fall.Apis/Language/Lang.vi.resx

@@ -118,164 +118,171 @@
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
   <data name="accountExisted" xml:space="preserve">
-    <value>အကောင့်ရှိပြီးသားဖြစ်ပါသည်။</value>
+    <value>အကောင့်ရှိပြီးသား</value>
   </data>
   <data name="accountInvalid" xml:space="preserve">
-    <value>အကောင့်ကို မတွေ့ရှိပါ။</value>
+    <value>အကောင့်ရှာမတွေ့ပါ</value>
   </data>
   <data name="accountNotExisted" xml:space="preserve">
-    <value>သင့်အကောင့် မရှိပါ။</value>
+    <value>Kont ou pa egziste.</value>
   </data>
   <data name="buyTurnSuccess" xml:space="preserve">
-    <value>အောင်မြင်စွာ ဝယ်ယူပြီးပါပြီ။
-</value>
+    <value>အောင်မြင်စွာဝယ်ယူပြီးပါပြီ</value>
   </data>
   <data name="buyTurnSuccessWaiting" xml:space="preserve">
-    <value>SMS မှ OTP ကို ထည့်သွင်းပါ။
-</value>
+    <value>sms က otp ရိုက်ထည့်ပါ</value>
   </data>
   <data name="enoughPoints" xml:space="preserve">
-    <value>ယနေ့အတွက် အမှတ်များ လုံလောက်စွာ ရရှိပြီးပါပြီ။
-</value>
+    <value>ဒီနေ့အတွက် အမှတ်တွေ စုဆောင်းပြီးပါပြီ။</value>
   </data>
   <data name="ErrorOutTime" xml:space="preserve">
-    <value>OTP ကို သတ်မှတ်ထားသော အချိန်ကျော်လွန်ပြီး ပေးပို့ထားပါသည်။ ၅ မိနစ်စောင့်ပြီး ထပ်မံကြိုးစားပါ။
-</value>
+    <value>သတ်မှတ်ထားသောအချိန်ထက်ကျော်လွန်၍ otp ပို့လိုက်ပါပြီ၊ ၅ မိနစ်စောင့်ပြီး ထပ်မံကြိုးစားပါ။</value>
   </data>
   <data name="ErrorOutTimeReal" xml:space="preserve">
-    <value>OTP သက်တမ်းကုန်သွားပါပြီ
+    <value>OTP သက်တမ်းကုန်ဆုံးသွားပါပြီ
 </value>
   </data>
   <data name="messOtp" xml:space="preserve">
-    <value>သင့် အကောင့်ဝင်ရန် ကုဒ်မှာ: %OTP% ဖြစ်ပါသည်
+    <value>သင့်ရဲ့ အကောင့်ဝင်ကုဒ်က %OTP% ပါ
 </value>
   </data>
   <data name="missionHistoryInvalid" xml:space="preserve">
-    <value>မစ်ရှင်မရှိတော့ပါ သို့မဟုတ် ရယူပြီးဖြစ်ပါသည်။
+    <value>Istwa misyon an pa egziste oswa li deja reklame.
 </value>
   </data>
   <data name="missionInvalid" xml:space="preserve">
-    <value>ဖုန်းနံပါတ် ဖြည့်ရန်လိုအပ်ပါသည်
+    <value>ဖုန်းနံပါတ် လိုအပ်ပါသည်
 </value>
   </data>
   <data name="msgTemplateNotFound" xml:space="preserve">
-    <value>မက်ဆေ့ချ် Template ကို မတွေ့ရှိပါ။
+    <value>မက်ဆေ့ချ်ပုံစံကို ရှာမတွေ့ပါ
 </value>
   </data>
   <data name="msisdnInvalid" xml:space="preserve">
-    <value>မတွေ့ရှိပါ။
+    <value>ဖုန်းနံပါတ် လိုအပ်ပါသည်
 </value>
   </data>
   <data name="otpnotfound" xml:space="preserve">
-    <value>ကျေးဇူးပြု၍ OTP ကို ထည့်သွင်းပါ။
+    <value>ကျေးဇူးပြု၍ otp ကို ရိုက်ထည့်ပါ
 </value>
   </data>
   <data name="otpwrong" xml:space="preserve">
-    <value>OTP မမှန်ကန်ပါ။
+    <value>OTP မှားနေပါတယ်
 </value>
   </data>
   <data name="outOfMoney" xml:space="preserve">
-    <value>လက်ကျန်ငွေ မလုံလောက်ပါ။
+    <value>ပိုက်ဆံကုန်တယ်
 </value>
   </data>
   <data name="overTurn" xml:space="preserve">
-    <value>လွှဲပြောင်းပြီး
+    <value>လှည့်ပါ
 </value>
   </data>
   <data name="packageAlready" xml:space="preserve">
-    <value>Package ကို စာရင်းသွင်းပြီးပါပြီ။</value>
+    <value>သင်သည် ပက်ကေ့ဂျ်ကို စာရင်းသွင်းပြီးပါပြီ
+</value>
   </data>
   <data name="packageInvalid" xml:space="preserve">
-    <value>ပက်ကေ့ဂျ်လိုအပ်သည်</value>
+    <value>ပက်ကေ့ဂျ် လိုအပ်ပါသည်
+</value>
   </data>
   <data name="packgsnotpound" xml:space="preserve">
-    <value>ပက်ကေ့ဂျ်ရှာမတွေ့ပါ</value>
+    <value>ပက်ကေ့ဂျ်ကို ရှာမတွေ့ပါ
+</value>
   </data>
   <data name="passwordIs" xml:space="preserve">
     <value>သင်၏ လျှို့ဝှက်နံပါတ်မှာ:</value>
   </data>
   <data name="registerSuccess" xml:space="preserve">
-    <value>စာရင်းသွင်းမှု အောင်မြင်ပါသည်
+    <value>မှတ်ပုံတင်ခြင်း အောင်မြင်ပါပြီ
 </value>
   </data>
   <data name="registerSuccessWaiting" xml:space="preserve">
-    <value>စာရင်းသွင်းမှုအတည်ပြုရန် Message မှ OTP ကို ထည့်သွင်းပါ။
+    <value>မှတ်ပုံတင်ခြင်းကို အတည်ပြုရန် မက်ဆေ့ချ်မှ otp ကို ရိုက်ထည့်ပါ။
 </value>
   </data>
   <data name="senderOtpSucces" xml:space="preserve">
-    <value>Message မှ OTP ကို ထည့်သွင်းပါ။
+    <value>မက်ဆေ့ချ်မှ OTP ကို ​​ရိုက်ထည့်ပါ
 </value>
   </data>
   <data name="spinSuccess" xml:space="preserve">
-    <value>ဂုဏ်ယူပါသည်! %prizename% ကို သင့်အဓိကအကောင့် လက်ကျန်ငွေထဲသို့ ထည့်သွင်းပြီးပါပြီ။ လက်ဆောင်များရရှိရန် ဆက်လက်ကစားပါ။
+    <value>ဂုဏ်ယူပါတယ်။ %prizename% ကို သင့်ရဲ့ အဓိကအကောင့်လက်ကျန်ငွေထဲ ထည့်သွင်းပြီးပါပြီ။ လက်ဆောင်တွေရဖို့ ဆက်လက်ကစားပါ။
 </value>
   </data>
   <data name="success" xml:space="preserve">
-    <value>အောင်မြင်ပါသည်။
+    <value>အောင်မြင်မှု
 </value>
   </data>
   <data name="timeoutConfirgOtp" xml:space="preserve">
-    <value>OTP သတ်မှတ်ချိန် ကုန်ဆုံးသွားပါပြီ
+    <value>OTP သည် သီးသန့်ဖြစ်သည်
 </value>
   </data>
   <data name="userOrPassWrong" xml:space="preserve">
-    <value>Username သို့မဟုတ် Password မမှန်ကန်ပါ
+    <value>Non itilizatè ou oswa modpas ou pa kòrèk
 </value>
   </data>
   <data name="unauthorized" xml:space="preserve">
-    <value>ခွင့်ပြုချက်မရှိပါ။
+    <value>ခွင့်ပြုချက်မရှိသော
 </value>
   </data>
   <data name="notFound" xml:space="preserve">
-    <value>ရှာမတွေ့ပါ</value>
+    <value>ရှာမတွေ့ပါ
+</value>
   </data>
   <data name="updated" xml:space="preserve">
-    <value>အပ်ဒိတ်လုပ်ပြီးပါပြီ။
+    <value>အပ်ဒိတ်လုပ်ထားသည်
 </value>
   </data>
   <data name="deleted" xml:space="preserve">
-    <value>ဖျက်ပြီးပါပြီ။
-</value>
+    <value>ဖျက်လိုက်ပါပြီ</value>
   </data>
   <data name="alreadyApplied" xml:space="preserve">
-    <value>ဤအလုပ်အတွက် လျှောက်ထားပြီးဖြစ်ပါသည်။
-</value>
+    <value>ဒီအလုပ်အတွက် လျှောက်ထားပြီးပါပြီ</value>
   </data>
   <data name="unauthorizedOrNotEmployer" xml:space="preserve">
-    <value>ခွင့်ပြုချက်မရှိပါ သို့မဟုတ် အလုပ်ရှင်အကောင့် မဟုတ်ပါ။
+    <value>ခွင့်ပြုချက်မရှိသူ သို့မဟုတ် အလုပ်ရှင်မဟုတ်သူ
 </value>
   </data>
   <data name="badRequest" xml:space="preserve">
-    <value>Bad request</value>
+    <value>တောင်းဆိုမှုမှားယွင်းနေပါသည်။</value>
   </data>
   <data name="errorOccurred" xml:space="preserve">
-    <value>An error occurred</value>
+    <value>အမှားတစ်ခု ဖြစ်ပွားခဲ့သည်</value>
   </data>
   <data name="missingTransactionId" xml:space="preserve">
-    <value>Transaction ID is required</value>
+    <value>ငွေပေးငွေယူ ID လိုအပ်ပါသည်
+</value>
   </data>
   <data name="gameModeNotConfigured" xml:space="preserve">
-    <value>Game mode is not configured</value>
+    <value>ဂိမ်းမုဒ်ကို သတ်မှတ်မထားပါ
+</value>
   </data>
   <data name="gameLevelNotConfigured" xml:space="preserve">
-    <value>Game level is not configured</value>
+    <value>ဂိမ်းအဆင့်ကို သတ်မှတ်မထားပါ
+</value>
   </data>
   <data name="missingMyIdAccessToken" xml:space="preserve">
-    <value>MyID access token is required</value>
+    <value>MyID ဝင်ရောက်ခွင့် တိုကင် လိုအပ်ပါသည်
+</value>
   </data>
   <data name="myIdAuthenticationFailed" xml:space="preserve">
-    <value>MyID authentication failed</value>
+    <value>MyID အထောက်အထားစိစစ်ခြင်း မအောင်မြင်ပါ
+</value>
   </data>
   <data name="waitingOtp" xml:space="preserve">
-    <value>Waiting for OTP</value>
+    <value>OTP ကို ​​စောင့်ဆိုင်းနေသည်
+</value>
   </data>
   <data name="otpInvalid" xml:space="preserve">
-    <value>OTP is invalid</value>
+    <value>OTP မှားယွင်းနေပါသည်
+</value>
   </data>
   <data name="serviceAlreadyRegistered" xml:space="preserve">
-    <value>You have registered this service</value>
+    <value>ဤဝန်ဆောင်မှုကို မှတ်ပုံတင်ပြီးပါပြီ
+</value>
   </data>
   <data name="ussdTimeout" xml:space="preserve">
-    <value>USSD request timed out</value>
+    <value>USSD တောင်းဆိုမှု အချိန်ကုန်သွားပါပြီ
+</value>
   </data>
 </root>

+ 0 - 1
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Language/Lang.Designer.cs

@@ -1940,6 +1940,5 @@ namespace Kitty_Fall.Website.Language {
                 return ResourceManager.GetString("YourGameActivity", resourceCulture);
             }
         }
-
     }
 }

ファイルの差分が大きいため隠しています
+ 0 - 0
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/catpuzzle/data.json


BIN
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/catpuzzle/images/block1a-sheet0.webp


BIN
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/catpuzzle/images/block1a-sheet1.webp


BIN
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/catpuzzle/images/cats-sheet4.webp


BIN
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/catpuzzle/images/shared-0-sheet1.webp


BIN
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/catpuzzle/images/shared-0-sheet2.webp


BIN
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/catpuzzle/images/shared-0-sheet3.webp


BIN
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/catpuzzle/images/shared-0-sheet4.webp


BIN
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/catpuzzle/images/shared-0-sheet5.webp


BIN
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/catpuzzle/images/shared-0-sheet6.webp


BIN
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/catpuzzle/images/sprite3-sheet0.webp


BIN
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/catpuzzle/images/sprite3-sheet1.webp


BIN
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/catpuzzle/images/sprite3-sheet2.webp


+ 1 - 1
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/catpuzzle/offline.json

@@ -1 +1 @@
-{"version":1784272300500,"fileList":["scripts/main.js","scripts/c3runtime.js","scripts/objRefTable.js","scripts/project/main.js","scripts/c3main.js","scripts/dispatchworker.js","scripts/jobworker.js","data.json","scripts/modernjscheck.js","scripts/supportcheck.js","scripts/offlineclient.js","icons/loading-logo.png","icons/icon-16.png","icons/icon-32.png","icons/icon-64.png","icons/icon-128.png","icons/icon-256.png","icons/icon-512.png","media/congratulations.webm","media/click.webm","media/Button03.webm","media/cute-cat-352656.webm","media/win2.webm","media/timeup_.webm","media/click_sound.webm","media/playground.webm","box2d.wasm","box2d.wasm.js","style.css","images/shared-0-sheet0.webp","images/shared-0-sheet1.webp","images/shared-0-sheet2.webp","images/shared-0-sheet3.webp","images/shared-0-sheet4.webp","images/shared-0-sheet5.webp","images/shared-0-sheet6.webp","images/block1a-sheet0.webp","images/block1a-sheet1.webp","images/cats-sheet0.webp","images/cats-sheet1.webp","images/cats-sheet2.webp","images/cats-sheet3.webp","images/cats-sheet4.webp","images/confettix-sheet0.webp","images/confettix-sheet1.webp","images/sprite3-sheet0.webp","images/sprite3-sheet1.webp","images/sprite3-sheet2.webp","images/scroll-sheet0.webp","images/btn_lvl-sheet0.webp","images/btn_lvl-sheet1.webp","scripts/register-sw.js"]}
+{"version":1784640300607,"fileList":["scripts/main.js","scripts/c3runtime.js","scripts/objRefTable.js","scripts/project/main.js","scripts/c3main.js","scripts/dispatchworker.js","scripts/jobworker.js","data.json","scripts/modernjscheck.js","scripts/supportcheck.js","scripts/offlineclient.js","icons/loading-logo.png","icons/icon-16.png","icons/icon-32.png","icons/icon-64.png","icons/icon-128.png","icons/icon-256.png","icons/icon-512.png","media/congratulations.webm","media/click.webm","media/Button03.webm","media/cute-cat-352656.webm","media/win2.webm","media/timeup_.webm","media/click_sound.webm","media/playground.webm","box2d.wasm.js","box2d.wasm","style.css","images/shared-0-sheet0.webp","images/shared-0-sheet1.webp","images/shared-0-sheet2.webp","images/shared-0-sheet3.webp","images/shared-0-sheet4.webp","images/shared-0-sheet5.webp","images/block1a-sheet0.webp","images/block1a-sheet1.webp","images/cats-sheet0.webp","images/cats-sheet1.webp","images/cats-sheet2.webp","images/cats-sheet3.webp","images/cats-sheet4.webp","images/confettix-sheet0.webp","images/confettix-sheet1.webp","images/sprite3-sheet0.webp","images/sprite3-sheet1.webp","images/sprite3-sheet2.webp","images/scroll-sheet0.webp","images/btn_lvl-sheet0.webp","images/btn_lvl-sheet1.webp","scripts/register-sw.js"]}

ファイルの差分が大きいため隠しています
+ 0 - 0
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/catpuzzle/scripts/c3runtime.js


ファイルの差分が大きいため隠しています
+ 0 - 0
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/catpuzzle/scripts/main.js


+ 14 - 11
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/catpuzzle/scripts/objRefTable.js

@@ -15,6 +15,7 @@ self.C3_GetObjectRefTable = function () {
 		C3.Behaviors.Sin,
 		C3.Plugins.Particles,
 		C3.Plugins.TiledBg,
+		C3.Plugins.Browser,
 		C3.Plugins.System.Cnds.IsGroupActive,
 		C3.Plugins.System.Cnds.OnLayoutStart,
 		C3.Plugins.System.Acts.SetLayerOpacity,
@@ -92,8 +93,10 @@ self.C3_GetObjectRefTable = function () {
 		C3.Plugins.System.Acts.AddVar,
 		C3.Plugins.System.Acts.GoToLayoutByName,
 		C3.Plugins.LocalStorage.Acts.SetItem,
+		C3.Plugins.Browser.Acts.ConsoleLog,
 		C3.Plugins.System.Acts.RestartLayout,
 		C3.Plugins.Sprite.Acts.SetScale,
+		C3.Plugins.LocalStorage.Cnds.OnItemSet,
 		C3.Plugins.Touch.Cnds.OnTouchStart,
 		C3.Plugins.Audio.Acts.SetMasterVolume,
 		C3.Plugins.Audio.Cnds.IsTagPlaying,
@@ -101,16 +104,17 @@ self.C3_GetObjectRefTable = function () {
 		C3.Plugins.System.Cnds.Else,
 		C3.Plugins.Function.Cnds.OnFunction,
 		C3.Plugins.Function.Acts.CallFunction,
-		C3.Plugins.LocalStorage.Acts.CheckItemExists,
+		C3.Plugins.TiledBg.Cnds.CompareY,
+		C3.Behaviors.DragnDrop.Acts.Drop,
+		C3.Behaviors.Tween.Acts.TweenOneProperty,
+		C3.Plugins.Sprite.Cnds.IsAnimPlaying,
 		C3.Plugins.LocalStorage.Cnds.OnItemExists,
 		C3.Plugins.LocalStorage.Acts.GetItem,
+		C3.Plugins.LocalStorage.Cnds.OnItemMissing,
 		C3.Plugins.LocalStorage.Cnds.OnItemGet,
 		C3.Plugins.LocalStorage.Exps.ItemValue,
-		C3.Plugins.TiledBg.Cnds.CompareY,
-		C3.Behaviors.DragnDrop.Acts.Drop,
-		C3.Behaviors.Tween.Acts.TweenOneProperty,
 		C3.Plugins.Sprite.Acts.SetAnim,
-		C3.Plugins.Sprite.Cnds.IsAnimPlaying
+		C3.Plugins.LocalStorage.Acts.CheckItemExists
 	];
 };
 self.C3_JsPropNameTable = [
@@ -174,8 +178,7 @@ self.C3_JsPropNameTable = [
 	{txtScore: 0},
 	{txt: 0},
 	{txtLevelDisplay: 0},
-	{txtGiftValues: 0},
-	{txtGiftText: 0},
+	{Browser: 0},
 	{Physics2: 0},
 	{blocks: 0},
 	{match: 0},
@@ -203,13 +206,14 @@ self.C3_JsPropNameTable = [
 	{exitGame: 0},
 	{score: 0},
 	{isShowComplete: 0},
-	{gGiftText: 0},
-	{gGiftValues: 0},
 	{touchX: 0},
 	{touchY: 0},
 	{audio: 0},
 	{unlocked_level: 0},
 	{gameType: 0},
+	{InitGameSuccess: 0},
+	{InitUnLockSucess: 0},
+	{InitGameTypeSuccess: 0},
 	{cur_level: 0}
 ];
 
@@ -258,7 +262,6 @@ self.InstanceType = {
 	txtScore: class extends self.ITextInstance {},
 	txt: class extends self.ITextInstance {},
 	txtLevelDisplay: class extends self.ITextInstance {},
-	txtGiftValues: class extends self.ITextInstance {},
-	txtGiftText: class extends self.ITextInstance {},
+	Browser: class extends self.IInstance {},
 	blocks: class extends self.ISpriteInstance {}
 }

+ 116 - 49
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/catpuzzle/scripts/project/main.js

@@ -3,6 +3,8 @@
 let levelSending = false;
 let gameOverSending = false;
 let lastExitGame=false;
+let exitSending = false;
+let exitTimeoutId = 0;
 
 let lastLevelCompleted = 0;
 let lastGameOver = 0;
@@ -78,6 +80,8 @@ function HandleMessage(runtime, event)
 			runtime.globalVars.root =
 				event.data.root ?? "";
 
+			runtime.globalVars.InitGameTypeSuccess =1;
+
 			console.log(
 				"Game Init:",
 				runtime.globalVars.gameType,
@@ -85,6 +89,17 @@ function HandleMessage(runtime, event)
 			);
 
 			break;
+
+		case "EXIT_GAME_RESULT":
+			// DEV NOTE: callback Exit chay trong iframe an, chuyen ket qua len MVC.
+			exitSending = false;
+			if (exitTimeoutId)
+			{
+				clearTimeout(exitTimeoutId);
+				exitTimeoutId = 0;
+			}
+			window.parent.postMessage(event.data, "*");
+			break;
 	}
 }
 
@@ -155,67 +170,80 @@ function Tick(runtime)
 //Set showPrizePopup = 0
 async function SaveLevelResult(runtime)
 {
+	// DEV NOTE: levelCompleted co the giu gia tri 1 qua nhieu tick.
+	// Khoa request de mot level khong bi ghi nhieu lan.
+	if (levelSending)
+		return;
+
+	levelSending = true;
+
 	try
 	{
 		console.log("Calling SaveLevelResult...");
-
+		
 		const body = {
-			token: runtime.globalVars.token,
-			msisdn: runtime.globalVars.msisdn,
-			transId: runtime.globalVars.transId,
-			level: runtime.globalVars.cur_level,
-			score: runtime.globalVars.score,
-			gameType: runtime.globalVars.gameType,
-			gameOver: 0
-		};
-
+						token: runtime.globalVars.token,
+						msisdn: runtime.globalVars.msisdn,
+						transId: runtime.globalVars.transId,
+						level: runtime.globalVars.cur_level,
+						score: runtime.globalVars.score,
+						gameType: runtime.globalVars.gameType,
+						gameOver: 0
+					};
 		console.log("Request Body:", body);
+		console.log("JSON:", JSON.stringify(body));
 
-		const response = await fetch(
-			runtime.globalVars.root + "/Game/SaveLevelResult",
-			{
-				method: "POST",
-				headers: {
-					"Content-Type": "application/json"
-				},
-				body: JSON.stringify(body)
-			}
-		);
+		const response = await fetch(runtime.globalVars.root+"/Game/SaveLevelResult", 
+						{
+							method: "POST",
+							headers: {
+								"Content-Type": "application/json"
+							},
+							body: JSON.stringify(body)
+						});
+
+		if (!response.ok)
+			throw new Error("Save level HTTP " + response.status);
 
 		const result = await response.json();
 
 		console.log("Level Result:", result);
 
-		// Lưu dữ liệu gốc
-		runtime.globalVars.point = Number(result.point ?? 0);
-		runtime.globalVars.data = Number(result.data ?? 0);
-		runtime.globalVars.score = Number(result.score ?? 0);
-		runtime.globalVars.transId = result.transId ?? "";
+		if (!result || result.success !== true)
+			throw new Error(result?.message || "Save level failed");
 
-		// Xác định phần thưởng
-		runtime.globalVars.gGiftValues = 0;
-		runtime.globalVars.gGiftText = "";
+		// Ví dụ dữ liệu trả về
+		runtime.globalVars.point =
+			result.point ?? "0";
 
-		if (runtime.globalVars.point > 0)
-		{
-			runtime.globalVars.gGiftValues = runtime.globalVars.point;
-			runtime.globalVars.gGiftText = "POINTS";
-		}
-		else if (runtime.globalVars.data > 0)
-		{
-			runtime.globalVars.gGiftValues = runtime.globalVars.data;
-			runtime.globalVars.gGiftText = "DATA";
-		}
-		else if (runtime.globalVars.score > 0)
-		{
-			runtime.globalVars.gGiftValues = runtime.globalVars.score;
-			runtime.globalVars.gGiftText = "SCORE";
-		}
+		runtime.globalVars.data =
+			result.data ?? "";
+
+		runtime.globalVars.score =
+			result.score ?? "0";
 
+		runtime.globalVars.transId =
+			result.transId ?? runtime.globalVars.transId;
+
+		// Chi hien popup sau khi MVC xac nhan luu thanh cong.
 		runtime.globalVars.showPrizePopup = 1;
 
-		console.log("Gift Type:", runtime.globalVars.gGiftText);
-		console.log("Gift Value:", runtime.globalVars.gGiftValues);
+		// DEV NOTE: Website dung message nay de tong hop thuong cua phien choi.
+		window.parent.postMessage({
+			type: "LEVEL_REWARD",
+			level: runtime.globalVars.cur_level,
+			point: result.point ?? "0",
+			data: result.data ?? "",
+			score: result.score ?? "0",
+			rewardType: result.rewardType ?? "",
+			rewardValue: result.rewardValue ?? 0,
+			rewardUnit: result.rewardUnit ?? "",
+			transId: runtime.globalVars.transId
+		}, "*");
+		console.log("Chuẩn bị gọi vào function trong event sheet:");
+		//runtime.callFunction("Quangbh");
+		console.log("Da goi goi vao function event sheet xong nhe!!!");
+		
 	}
 	catch (error)
 	{
@@ -227,14 +255,39 @@ async function SaveLevelResult(runtime)
 	}
 }
 
+
 // Khi muốn thoát game về MVC
 function SaveExitGame(runtime)
 {
+	// DEV NOTE: khoa ngay lan bam dau de tranh tao nhieu request Exit.
+	if (exitSending)
+		return;
+
+	exitSending = true;
+	const btn = runtime.objects.btn_exit?.getFirstInstance?.();
 	try
 	{
+
+		if (btn)
+		{
+			btn.isCollisionEnabled = false;
+		}
+
+		let targetFrame = document.getElementById("kitty-exit-target");
+		if (!targetFrame)
+		{
+			targetFrame = document.createElement("iframe");
+			targetFrame.id = "kitty-exit-target";
+			targetFrame.name = "kitty-exit-target";
+			targetFrame.hidden = true;
+			document.body.appendChild(targetFrame);
+		}
+
 		const form = document.createElement("form");
 		form.method = "POST";
 		form.action = runtime.globalVars.root + "/Game/ExitGame";
+		form.target = targetFrame.name;
+		form.hidden = true;
 
 		// Thêm input hidden
 		function add(name, value)
@@ -255,12 +308,29 @@ function SaveExitGame(runtime)
 		add("gameOver", runtime.globalVars.gameOver);
 
 		document.body.appendChild(form);
-
 		// Submit form
 		HTMLFormElement.prototype.submit.call(form);
+		form.remove();
+
+		exitTimeoutId = window.setTimeout(() =>
+		{
+			exitSending = false;
+			exitTimeoutId = 0;
+			lastExitGame = 0;
+			runtime.globalVars.exitGame = 0;
+			if (btn)
+				btn.isCollisionEnabled = true;
+			console.error("ExitGame timeout");
+		}, 15000);
+
 	}
 	catch (error)
 	{
+		exitSending = false;
+		lastExitGame = 0;
+		runtime.globalVars.exitGame = 0;
+		if (btn)
+			btn.isCollisionEnabled = true;
 		console.error("SaveExitGame Error:", error);
 	}
 }
@@ -373,6 +443,3 @@ function MovePlayer(offsetX, offsetY)
     player.x += offsetX;
     player.y += offsetY;
 }
-
-
-

+ 76 - 0
Kitty_Fall/Kitty_Fall/sql/20260716_sync_game_sequences.sql

@@ -0,0 +1,76 @@
+-- Dong bo sequence voi ID lon nhat dang co trong cac bang game.
+-- Script chi tien sequence ve phia truoc, khong sua/xoa du lieu nghiep vu.
+-- Nen chay bang schema KITTY_FALL truoc khi deploy API/Worker moi.
+
+SET SERVEROUTPUT ON;
+
+DECLARE
+    PROCEDURE sync_sequence(
+        p_sequence_name IN VARCHAR2,
+        p_table_name    IN VARCHAR2,
+        p_id_column     IN VARCHAR2
+    ) IS
+        v_sequence_name VARCHAR2(128);
+        v_table_name    VARCHAR2(128);
+        v_id_column     VARCHAR2(128);
+        v_max_id        NUMBER;
+        v_current_id    NUMBER;
+        v_increment     NUMBER;
+    BEGIN
+        v_sequence_name := DBMS_ASSERT.SIMPLE_SQL_NAME(UPPER(p_sequence_name));
+        v_table_name := DBMS_ASSERT.SIMPLE_SQL_NAME(UPPER(p_table_name));
+        v_id_column := DBMS_ASSERT.SIMPLE_SQL_NAME(UPPER(p_id_column));
+
+        EXECUTE IMMEDIATE
+            'SELECT NVL(MAX(' || v_id_column || '), 0) FROM ' || v_table_name
+            INTO v_max_id;
+
+        EXECUTE IMMEDIATE
+            'SELECT ' || v_sequence_name || '.NEXTVAL FROM DUAL'
+            INTO v_current_id;
+
+        IF v_current_id < v_max_id THEN
+            v_increment := v_max_id - v_current_id;
+            EXECUTE IMMEDIATE
+                'ALTER SEQUENCE ' || v_sequence_name || ' INCREMENT BY ' || TO_CHAR(v_increment);
+            EXECUTE IMMEDIATE
+                'SELECT ' || v_sequence_name || '.NEXTVAL FROM DUAL'
+                INTO v_current_id;
+            EXECUTE IMMEDIATE
+                'ALTER SEQUENCE ' || v_sequence_name || ' INCREMENT BY 1';
+        END IF;
+
+        DBMS_OUTPUT.PUT_LINE(
+            RPAD(v_sequence_name, 40)
+            || ' table_max=' || v_max_id
+            || ', sequence_current=' || v_current_id
+            || ', next_application_id=' || (v_current_id + 1)
+        );
+    EXCEPTION
+        WHEN OTHERS THEN
+            BEGIN
+                EXECUTE IMMEDIATE
+                    'ALTER SEQUENCE ' || v_sequence_name || ' INCREMENT BY 1';
+            EXCEPTION
+                WHEN OTHERS THEN NULL;
+            END;
+            RAISE;
+    END;
+BEGIN
+    sync_sequence('SEQ_GAME_PLAY_SESSION',        'GAME_PLAY_SESSION',        'SESSION_ID');
+    sync_sequence('SEQ_GAME_LEVEL_ATTEMPT',       'GAME_LEVEL_ATTEMPT',       'ATTEMPT_ID');
+    sync_sequence('SEQ_GAME_REWARD_LOG',          'GAME_REWARD_LOG',          'REWARD_LOG_ID');
+    sync_sequence('SEQ_GAME_SCORE_LEDGER',        'GAME_SCORE_LEDGER',        'LEDGER_ID');
+    sync_sequence('SEQ_GAME_MONTHLY_RANKING',     'GAME_MONTHLY_RANKING',     'RANKING_ID');
+    sync_sequence('SEQ_GAME_REWARD_LIMIT_USAGE',  'GAME_REWARD_LIMIT_USAGE',  'LIMIT_USAGE_ID');
+    sync_sequence('SEQ_GAME_MONTHLY_DRAW',        'GAME_MONTHLY_DRAW',        'DRAW_ID');
+    sync_sequence('SEQ_GAME_MONTHLY_DRAW_TICKET', 'GAME_MONTHLY_DRAW_TICKET', 'TICKET_ID');
+    sync_sequence('SEQ_GAME_MONTHLY_WINNER',      'GAME_MONTHLY_WINNER',      'WINNER_ID');
+END;
+/
+
+-- Xac nhan rieng loi PK_GAME_LEVEL_ATTEMPT vua gap:
+SELECT MAX(ATTEMPT_ID) AS MAX_ATTEMPT_ID FROM GAME_LEVEL_ATTEMPT;
+SELECT SEQUENCE_NAME, LAST_NUMBER, INCREMENT_BY, CYCLE_FLAG
+FROM USER_SEQUENCES
+WHERE SEQUENCE_NAME = 'SEQ_GAME_LEVEL_ATTEMPT';

この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません