student 3 nedēļas atpakaļ
vecāks
revīzija
ef40a659c0

+ 5 - 1
KittyFallWs/KittyFallWs/src/com/vas/webservices/KittyFallWs.java

@@ -212,6 +212,9 @@ public class KittyFallWs extends WebserviceAbstract {
                 db.iInsertRegisterInfo(reg);
             }
 
+            db.addTurnSpin(msisdn,productInfo.getNumberSpin());
+            logger.info("add turn success Register " + msisdn + ", turn " + productInfo.getNumberSpin());
+            
             //insert chargelog
             if (fee > 0) {
                 ChargeLog chargeLog = new ChargeLog();
@@ -1507,7 +1510,8 @@ public class KittyFallWs extends WebserviceAbstract {
                                 chargeLog.setStatus(Common.Constant.REGISTER_STATUS);
                                 db.iInsertChargeLog(chargeLog);
                             }
-
+                            db.addTurnSpin(msisdn,productInfo.getNumberSpin());
+                            logger.info("add turn success Register " + msisdn + ", turn " + productInfo.getNumberSpin());
                             // create a new account_user for this user
                             boolean isCreated = true;
                             // check existed

+ 1 - 1
Kitty_Fall/Kitty_Fall/Kitty_Fall.Apis/Business/Game/GameBusinessImpl.cs

@@ -1024,7 +1024,7 @@ namespace Kitty_Fall.Apis.Business.Game
         {
             // Tru 1 luot tu goi con han cu nhat cho moi phien choi.
             var turns = await dbContext.LuckySpins
-                .Where(x => x.Msisdn == msisdn && (x.ExpireTime == null || x.ExpireTime >= now))
+                .Where(x => x.Msisdn == msisdn)
                 .OrderBy(x => x.ExpireTime ?? DateTime.MaxValue)
                 .ThenBy(x => x.InsertTime ?? DateTime.MaxValue)
                 .ThenBy(x => x.Id)

+ 7 - 0
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Controllers/HomeController.cs

@@ -30,6 +30,7 @@ namespace Kitty_Fall.Website.Controllers
         {
             await LoadHomeDataAsync();
             ViewBag.AutoOpenSubscriptionConfirm = Request.Query.ContainsKey("quickregister");
+            ViewBag.AutoOpenBuyTurn = Request.Query.ContainsKey("buyturn");
             return View();
         }
 
@@ -194,6 +195,12 @@ namespace Kitty_Fall.Website.Controllers
                 var jObject = JObject.Parse(res.data);
                 var errorCode = ReadErrorCode(jObject);
                 var message = jObject["message"]?.ToString() ?? jObject["msg"]?.ToString() ?? "";
+                if (errorCode == CommonErrorCode.SUCCESS)
+                {
+                    // Dong bo lai totalTurn ngay sau khi VAS cong luot thanh cong.
+                    await LoadHomeDataAsync();
+                }
+
                 return Json(new
                 {
                     errorCode,

+ 1 - 1
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Views/DailyWinners/Index.cshtml

@@ -4,7 +4,7 @@
     var profile = Model?.profile ?? new Common.Http.Apis.Request.UserGameActivityProfile();
     var profilePicture = string.IsNullOrWhiteSpace(profile.picture)
         ? Url.Content("~/kitty/assets/kitty-fall/avatar.png")
-        : profile.picture;
+        : Url.Content("~/kitty/assets/kitty-fall/") + profile.picture;
     var selectedDate = Model?.selectedDate ?? "";
     var calendarMinDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).ToString("yyyy-MM-dd");
     var calendarMaxDate = DateTime.Now.ToString("yyyy-MM-dd");

+ 1 - 1
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Views/Guide/Index.cshtml

@@ -4,7 +4,7 @@
     var profile = Model ?? new Common.Http.Apis.Request.UserGameActivityProfile();
     var profilePicture = string.IsNullOrWhiteSpace(profile.picture)
         ? Url.Content("~/kitty/assets/kitty-fall/avatar.png")
-        : profile.picture;
+        : Url.Content("~/kitty/assets/kitty-fall/") + profile.picture;
 }
 
 <main class="kitty-app is-winner-screen is-guide-screen" aria-label="@Lang.GuideAriaLabel">

+ 1 - 1
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Views/History/Index.cshtml

@@ -4,7 +4,7 @@
     var profile = Model?.profile ?? new Common.Http.Apis.Request.UserGameActivityProfile();
     var profilePicture = string.IsNullOrWhiteSpace(profile.picture)
         ? Url.Content("~/kitty/assets/kitty-fall/avatar.png")
-        : profile.picture;
+        : Url.Content("~/kitty/assets/kitty-fall/") + profile.picture;
     var pageNumber = Model?.pageNumber > 0 ? Model.pageNumber : 1;
     var totalPage = Model?.totalPage ?? 0;
     var fromDate = Model?.fromDate ?? "";

+ 13 - 6
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Views/Home/Index.cshtml

@@ -2,7 +2,7 @@
     ViewData["Title"] = "Kitty Fall";
     var msisdn = ViewBag.Msisdn as string;
     var profilePicture = ViewBag.ProfilePicture as string;
-    var avatarUrl = string.IsNullOrWhiteSpace(profilePicture) ? Url.Content("~/kitty/assets/kitty-fall/avatar.png") : profilePicture;
+    var avatarUrl = string.IsNullOrWhiteSpace(profilePicture) ? Url.Content("~/kitty/assets/kitty-fall/avatar.png") : Url.Content("~/kitty/assets/kitty-fall/") + profilePicture;
     var totalPoint = ViewBag.TotalPoint is null ? 0L : Convert.ToInt64(ViewBag.TotalPoint);
     var totalTurn = ViewBag.TotalTurn is null ? 0L : Convert.ToInt64(ViewBag.TotalTurn);
     var packageFee = ViewBag.PackageFee is null ? 179M : Convert.ToDecimal(ViewBag.PackageFee);
@@ -14,6 +14,7 @@
     var isSubscriber = Context.Session.IsSubscriber();
     var packageAction = isSubscriber ? "buy-turn" : "subscribe";
     var autoOpenSubscriptionConfirm = (ViewBag.AutoOpenSubscriptionConfirm as bool?) == true && !isSubscriber;
+    var autoOpenBuyTurn = (ViewBag.AutoOpenBuyTurn as bool?) == true && isSubscriber;
     var turnPackages = ViewBag.TurnPackages as List<Dictionary<string, object?>> ?? new List<Dictionary<string, object?>>();
     var firstTurnPackage = turnPackages.FirstOrDefault();
     var buyTurnFee = firstTurnPackage != null && firstTurnPackage.TryGetValue("fee", out var buyTurnFeeValue) && decimal.TryParse(buyTurnFeeValue?.ToString(), out var parsedBuyTurnFee)
@@ -114,7 +115,9 @@
         </div>
     </section>
 
-    <div class="subscription-modal" data-subscription-modal data-auto-open-subscription="@(autoOpenSubscriptionConfirm ? "true" : "false")" aria-hidden="true">
+    <div class="subscription-modal" data-subscription-modal
+         data-auto-open-subscription="@(autoOpenSubscriptionConfirm ? "true" : "false")"
+         data-auto-open-buy-turn="@(autoOpenBuyTurn ? "true" : "false")" aria-hidden="true">
         <button class="subscription-backdrop" type="button" data-close-subscription aria-label="@Lang.ConfirmSubscription"></button>
         <section class="confirm-dialog-shell scale-floor modal-panel is-active" data-modal-panel="confirm" data-scale-floor="361" data-scale-height="540" role="dialog" aria-modal="true" aria-label="@Lang.ConfirmSubscription">
             <div class="confirm-dialog scale-floor-inner">
@@ -266,9 +269,11 @@
                     </button>
 
                     <img class="result-status-icon result-status-success" src="~/kitty/assets/kitty-fall/result-success-icon.png" alt="">
-                    <p class="result-title result-title-success">@Lang.SubscriptionSuccessMessage</p>
+                    <p class="result-title result-title-success" data-success-title
+                       data-subscription-title="@Lang.SubscriptionSuccessMessage"
+                       data-buy-turn-template="You have successfully purchased {0} turn(s)!">@Lang.SubscriptionSuccessMessage</p>
 
-                    <div class="result-benefits">
+                    <div class="result-benefits" data-success-benefits>
                         <div class="result-benefit">
                             <span class="result-ticket-icon">
                                 <img src="~/kitty/assets/kitty-fall/ticket.png" alt="">
@@ -286,9 +291,11 @@
                         </div>
                     </div>
 
-                    <button class="result-button confirm-button" type="button" data-close-subscription>
+                    <button class="result-button confirm-button" type="button" data-close-subscription
+                            data-success-action-button data-confirm-label="@Lang.Confirm"
+                            data-play-label="@Lang.PlayNow" data-play-url="@Url.Action("Index", "Play")">
                         <span class="confirm-button-icon" aria-hidden="true"></span>
-                        <span>@Lang.Confirm</span>
+                        <span data-success-action-label>@Lang.Confirm</span>
                     </button>
                 </div>
             </div>

+ 1 - 1
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Views/Leaderboard/Index.cshtml

@@ -5,7 +5,7 @@
     var currentUser = Model?.currentUser ?? new Common.Http.Apis.Request.UserLeaderboardCurrentUser();
     var profilePicture = string.IsNullOrWhiteSpace(profile.picture)
         ? Url.Content("~/kitty/assets/kitty-fall/avatar.png")
-        : profile.picture;
+        : Url.Content("~/kitty/assets/kitty-fall/") + profile.picture;
     var pageNumber = Model?.pageNumber > 0 ? Model.pageNumber : 1;
     var totalPage = Model?.totalPage ?? 0;
     var startPage = totalPage <= 5 ? 1 : Math.Max(1, Math.Min(pageNumber - 2, totalPage - 4));

+ 1 - 1
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Views/MonthlyWinners/Index.cshtml

@@ -4,7 +4,7 @@
     var profile = Model?.profile ?? new Common.Http.Apis.Request.UserGameActivityProfile();
     var profilePicture = string.IsNullOrWhiteSpace(profile.picture)
         ? Url.Content("~/kitty/assets/kitty-fall/avatar.png")
-        : profile.picture;
+        : Url.Content("~/kitty/assets/kitty-fall/") + profile.picture;
 }
 
 <main class="kitty-app is-winner-screen is-monthly-winner-screen" aria-label="@Lang.MonthlyWinnerList">

+ 20 - 3
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Views/Play/Index.cshtml

@@ -1,14 +1,15 @@
-@model Kitty_Fall.Website.Models.PlayGameViewModel
+@model Kitty_Fall.Website.Models.PlayGameViewModel
 @{
     ViewData["Title"] = "Kitty Fall - Play";
     var avatarUrl = string.IsNullOrWhiteSpace(Model.ProfilePicture)
         ? Url.Content("~/kitty/assets/kitty-fall/avatar.png")
-        : Model.ProfilePicture;
+        : Url.Content("~/kitty/assets/kitty-fall/") + Model.ProfilePicture;
 }
 
 <main class="kitty-app is-play-screen" aria-label="Kitty Fall play screen"
       data-play-game data-msisdn="@Model.Msisdn" data-token="@Model.Token"
-      data-trans-id="@Model.TransId" data-root="@Model.Root" data-game-url="@Model.GameUrl">
+      data-trans-id="@Model.TransId" data-root="@Model.Root" data-game-url="@Model.GameUrl"
+      data-total-turn="@Model.TotalTurn">
     <img class="kitty-bg" src="~/kitty/assets/kitty-fall/bg.png" alt="">
     <div class="kitty-bg-fade"></div>
 
@@ -136,4 +137,20 @@
             </a>
         </div>
     </section>
+
+    <section class="game-over-modal" data-turn-over-modal aria-hidden="true">
+        <div class="game-over-backdrop" data-turn-over-close></div>
+        <div class="game-over-card" role="dialog" aria-modal="true" aria-labelledby="turn-over-title">
+            <button class="game-over-close" type="button" data-turn-over-close aria-label="Close">×</button>
+            <img class="game-over-cat" src="~/kitty/assets/kitty-fall/cat.png" alt="">
+            <h2 id="turn-over-title">Turn Over</h2>
+            <p>You have no play turns left.</p>
+            <a class="game-over-play-button" href="@Url.Action("Index", "Home", new { buyturn = true })">
+                <span class="play-icon">
+                    <img src="~/kitty/assets/kitty-fall/ticket.png" alt="">
+                </span>
+                <strong>@Lang.BuyTurn</strong>
+            </a>
+        </div>
+    </section>
 </main>

+ 1 - 1
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Views/Winner/Index.cshtml

@@ -4,7 +4,7 @@
     var profile = Model ?? new Common.Http.Apis.Request.UserGameActivityProfile();
     var profilePicture = string.IsNullOrWhiteSpace(profile.picture)
         ? Url.Content("~/kitty/assets/kitty-fall/avatar.png")
-        : profile.picture;
+        : Url.Content("~/kitty/assets/kitty-fall/") + profile.picture ;
 }
 
 <main class="kitty-app is-winner-screen" aria-label="@Lang.WinnerList">

+ 4 - 0
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/kitty/css/all.min.css

@@ -3519,6 +3519,10 @@ button {
     display: none;
 }
 
+.is-buy-turn-result [data-success-benefits] {
+    display: none;
+}
+
 .result-ticket-icon {
     width: 32px;
     height: 32px;

+ 4 - 0
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/kitty/css/input.css

@@ -3519,6 +3519,10 @@ button {
     display: none;
 }
 
+.is-buy-turn-result [data-success-benefits] {
+    display: none;
+}
+
 .result-ticket-icon {
     width: 32px;
     height: 32px;

+ 60 - 4
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/kitty/js/all.min.js

@@ -250,6 +250,8 @@ const initKittyFall = () => {
     if (playGameRoot) {
         const levelButtons = playGameRoot.querySelectorAll("[data-level]");
         const startGameButton = playGameRoot.querySelector("[data-start-game]");
+        const turnOverModal = playGameRoot.querySelector("[data-turn-over-modal]");
+        const turnOverCloseButtons = playGameRoot.querySelectorAll("[data-turn-over-close]");
         const gameShell = playGameRoot.querySelector("[data-game-shell]");
         const gameFrame = playGameRoot.querySelector("[data-game-frame]");
         const gameOverModal = playGameRoot.querySelector("[data-game-over-modal]");
@@ -262,6 +264,20 @@ const initKittyFall = () => {
             || "Easy";
         let gameStarted = false;
         let startingGame = false;
+
+        const showTurnOverModal = () => {
+            if (!turnOverModal) return;
+            turnOverModal.classList.add("is-open");
+            turnOverModal.setAttribute("aria-hidden", "false");
+        };
+
+        const hideTurnOverModal = () => {
+            if (!turnOverModal) return;
+            turnOverModal.classList.remove("is-open");
+            turnOverModal.setAttribute("aria-hidden", "true");
+        };
+
+        turnOverCloseButtons.forEach((button) => button.addEventListener("click", hideTurnOverModal));
         let finishingGame = false;
         let runRewards = {
             score: 0,
@@ -413,7 +429,12 @@ const initKittyFall = () => {
             try {
                 const result = await startSession();
                 if (!result?.success) {
-                    window.alert(result?.message || "Unable to start game.");
+                    const message = String(result?.message || "");
+                    if (message.toLowerCase().includes("turn over")) {
+                        showTurnOverModal();
+                    } else {
+                        window.alert(message || "Unable to start game.");
+                    }
                     return;
                 }
 
@@ -440,6 +461,7 @@ const initKittyFall = () => {
 
     if (subscriptionModal) {
         let reloadAfterSubscriptionSuccess = false;
+        let playAfterSubscriptionSuccess = false;
         const modalPanels = subscriptionModal.querySelectorAll("[data-modal-panel]");
         let ignoreBackdropUntil = 0;
 
@@ -491,6 +513,12 @@ const initKittyFall = () => {
             event?.preventDefault();
             event?.stopPropagation();
 
+            const successActionButton = event?.target?.closest("[data-success-action-button]");
+            if (playAfterSubscriptionSuccess && successActionButton) {
+                window.location.replace(successActionButton.dataset.playUrl || "/Play");
+                return;
+            }
+
             if (event?.target?.matches(".subscription-backdrop") && Date.now() < ignoreBackdropUntil) {
                 return;
             }
@@ -501,7 +529,10 @@ const initKittyFall = () => {
             setActivePanel("confirm");
 
             if (reloadAfterSubscriptionSuccess) {
-                window.location.reload();
+                const cleanUrl = new URL(window.location.href);
+                cleanUrl.searchParams.delete("buyturn");
+                cleanUrl.searchParams.delete("quickregister");
+                window.location.replace(cleanUrl.toString());
             }
         };
 
@@ -575,7 +606,22 @@ const initKittyFall = () => {
                 turnCountElement.textContent = confirmButton.dataset.turnCount;
             }
             const successPanel = subscriptionModal.querySelector('[data-modal-panel="success"]');
-            successPanel?.classList.toggle("is-buy-turn-result", confirmButton.dataset.packageAction === "buy-turn");
+            const isBuyTurn = confirmButton.dataset.packageAction === "buy-turn";
+            successPanel?.classList.toggle("is-buy-turn-result", isBuyTurn);
+            const successActionButton = subscriptionModal.querySelector("[data-success-action-button]");
+            const successActionLabel = successActionButton?.querySelector("[data-success-action-label]");
+            const successTitle = subscriptionModal.querySelector("[data-success-title]");
+            const successBenefits = subscriptionModal.querySelector("[data-success-benefits]");
+
+            if (successTitle) {
+                const turnCount = confirmButton.dataset.turnCount || "0";
+                successTitle.textContent = isBuyTurn
+                    ? (successTitle.dataset.buyTurnTemplate || "You have successfully purchased {0} turn(s)!").replace("{0}", turnCount)
+                    : successTitle.dataset.subscriptionTitle || "";
+            }
+            if (successBenefits) {
+                successBenefits.hidden = isBuyTurn;
+            }
             const actionUrl = confirmButton.dataset.packageAction === "buy-turn"
                 ? "/Home/BuyTurnQAction"
                 : "/Home/RegisterQAction";
@@ -588,7 +634,13 @@ const initKittyFall = () => {
                 },
                 success: function (response) {
                     const isSuccess = response && String(response.errorCode) === "0";
-                    reloadAfterSubscriptionSuccess = isSuccess && confirmButton.dataset.packageAction === "subscribe";
+                    reloadAfterSubscriptionSuccess = isSuccess;
+                    playAfterSubscriptionSuccess = isSuccess;
+                    if (successActionLabel && successActionButton) {
+                        successActionLabel.textContent = playAfterSubscriptionSuccess
+                            ? successActionButton.dataset.playLabel || "PLAY NOW"
+                            : successActionButton.dataset.confirmLabel || "CONFIRM";
+                    }
                     showSubscriptionResult(isSuccess ? "success" : "fail", response?.message || "");
                 },
                 error: function () {
@@ -608,6 +660,10 @@ const initKittyFall = () => {
             openSubscriptionModal();
         }
 
+        if (subscriptionModal.dataset.autoOpenBuyTurn === "true") {
+            openBuyTurnModal();
+        }
+
         openBuyTurnButtons.forEach((button) => {
             button.addEventListener("click", openBuyTurnModal);
         });

+ 60 - 4
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/kitty/js/input.js

@@ -250,6 +250,8 @@ const initKittyFall = () => {
     if (playGameRoot) {
         const levelButtons = playGameRoot.querySelectorAll("[data-level]");
         const startGameButton = playGameRoot.querySelector("[data-start-game]");
+        const turnOverModal = playGameRoot.querySelector("[data-turn-over-modal]");
+        const turnOverCloseButtons = playGameRoot.querySelectorAll("[data-turn-over-close]");
         const gameShell = playGameRoot.querySelector("[data-game-shell]");
         const gameFrame = playGameRoot.querySelector("[data-game-frame]");
         const gameOverModal = playGameRoot.querySelector("[data-game-over-modal]");
@@ -262,6 +264,20 @@ const initKittyFall = () => {
             || "Easy";
         let gameStarted = false;
         let startingGame = false;
+
+        const showTurnOverModal = () => {
+            if (!turnOverModal) return;
+            turnOverModal.classList.add("is-open");
+            turnOverModal.setAttribute("aria-hidden", "false");
+        };
+
+        const hideTurnOverModal = () => {
+            if (!turnOverModal) return;
+            turnOverModal.classList.remove("is-open");
+            turnOverModal.setAttribute("aria-hidden", "true");
+        };
+
+        turnOverCloseButtons.forEach((button) => button.addEventListener("click", hideTurnOverModal));
         let finishingGame = false;
         let runRewards = {
             score: 0,
@@ -413,7 +429,12 @@ const initKittyFall = () => {
             try {
                 const result = await startSession();
                 if (!result?.success) {
-                    window.alert(result?.message || "Unable to start game.");
+                    const message = String(result?.message || "");
+                    if (message.toLowerCase().includes("turn over")) {
+                        showTurnOverModal();
+                    } else {
+                        window.alert(message || "Unable to start game.");
+                    }
                     return;
                 }
 
@@ -440,6 +461,7 @@ const initKittyFall = () => {
 
     if (subscriptionModal) {
         let reloadAfterSubscriptionSuccess = false;
+        let playAfterSubscriptionSuccess = false;
         const modalPanels = subscriptionModal.querySelectorAll("[data-modal-panel]");
         let ignoreBackdropUntil = 0;
 
@@ -491,6 +513,12 @@ const initKittyFall = () => {
             event?.preventDefault();
             event?.stopPropagation();
 
+            const successActionButton = event?.target?.closest("[data-success-action-button]");
+            if (playAfterSubscriptionSuccess && successActionButton) {
+                window.location.replace(successActionButton.dataset.playUrl || "/Play");
+                return;
+            }
+
             if (event?.target?.matches(".subscription-backdrop") && Date.now() < ignoreBackdropUntil) {
                 return;
             }
@@ -501,7 +529,10 @@ const initKittyFall = () => {
             setActivePanel("confirm");
 
             if (reloadAfterSubscriptionSuccess) {
-                window.location.reload();
+                const cleanUrl = new URL(window.location.href);
+                cleanUrl.searchParams.delete("buyturn");
+                cleanUrl.searchParams.delete("quickregister");
+                window.location.replace(cleanUrl.toString());
             }
         };
 
@@ -575,7 +606,22 @@ const initKittyFall = () => {
                 turnCountElement.textContent = confirmButton.dataset.turnCount;
             }
             const successPanel = subscriptionModal.querySelector('[data-modal-panel="success"]');
-            successPanel?.classList.toggle("is-buy-turn-result", confirmButton.dataset.packageAction === "buy-turn");
+            const isBuyTurn = confirmButton.dataset.packageAction === "buy-turn";
+            successPanel?.classList.toggle("is-buy-turn-result", isBuyTurn);
+            const successActionButton = subscriptionModal.querySelector("[data-success-action-button]");
+            const successActionLabel = successActionButton?.querySelector("[data-success-action-label]");
+            const successTitle = subscriptionModal.querySelector("[data-success-title]");
+            const successBenefits = subscriptionModal.querySelector("[data-success-benefits]");
+
+            if (successTitle) {
+                const turnCount = confirmButton.dataset.turnCount || "0";
+                successTitle.textContent = isBuyTurn
+                    ? (successTitle.dataset.buyTurnTemplate || "You have successfully purchased {0} turn(s)!").replace("{0}", turnCount)
+                    : successTitle.dataset.subscriptionTitle || "";
+            }
+            if (successBenefits) {
+                successBenefits.hidden = isBuyTurn;
+            }
             const actionUrl = confirmButton.dataset.packageAction === "buy-turn"
                 ? "/Home/BuyTurnQAction"
                 : "/Home/RegisterQAction";
@@ -588,7 +634,13 @@ const initKittyFall = () => {
                 },
                 success: function (response) {
                     const isSuccess = response && String(response.errorCode) === "0";
-                    reloadAfterSubscriptionSuccess = isSuccess && confirmButton.dataset.packageAction === "subscribe";
+                    reloadAfterSubscriptionSuccess = isSuccess;
+                    playAfterSubscriptionSuccess = isSuccess;
+                    if (successActionLabel && successActionButton) {
+                        successActionLabel.textContent = playAfterSubscriptionSuccess
+                            ? successActionButton.dataset.playLabel || "PLAY NOW"
+                            : successActionButton.dataset.confirmLabel || "CONFIRM";
+                    }
                     showSubscriptionResult(isSuccess ? "success" : "fail", response?.message || "");
                 },
                 error: function () {
@@ -608,6 +660,10 @@ const initKittyFall = () => {
             openSubscriptionModal();
         }
 
+        if (subscriptionModal.dataset.autoOpenBuyTurn === "true") {
+            openBuyTurnModal();
+        }
+
         openBuyTurnButtons.forEach((button) => {
             button.addEventListener("click", openBuyTurnModal);
         });

BIN
Kitty_Fall/catpuzzle1.zip