student 3 viikkoa sitten
vanhempi
commit
036df9fcfa

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

@@ -932,6 +932,11 @@ namespace Kitty_Fall.Apis.Business.Game
                 await UpsertMonthlyRankingAsync(msisdn, account?.Id, mode.ModeId, awardedScore + rewardScoreDelta, session.MaxLevelReached, now);
                 await dbContext.SaveChangesAsync();
 
+                // Response cho popup LEVEL COMPLETE chi tra thuong cua level vua
+                // hoan thanh. Tong diem van duoc luu trong session/ranking va chi
+                // tra qua nhanh gameOver/exit o tren.
+                var levelScoreAwarded = awardedScore + rewardScoreDelta;
+
                 return CommonLogic.BuildResponse(
                     url,
                     json,
@@ -941,7 +946,7 @@ namespace Kitty_Fall.Apis.Business.Game
                     {
                         point = responsePoint,
                         data = responseData,
-                        score = session.TotalScore.ToString(CultureInfo.InvariantCulture),
+                        score = levelScoreAwarded.ToString(CultureInfo.InvariantCulture),
                         transId = request.transId,
                         rewardType = responseRewardType,
                         rewardValue = responseRewardValue,

+ 2 - 1
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Controllers/GameController.cs

@@ -71,7 +71,8 @@ namespace Kitty_Fall.Website.Controllers
                 {
                     point = "0",
                     data = "",
-                    score = request.score.ToString(),
+                    // Khong tra lai score cu cua level truoc khi API ghi level loi.
+                    score = "0",
                     transId = request.transId ?? "",
                     rewardType = "",
                     rewardValue = 0,

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

@@ -1322,5 +1322,8 @@ namespace Kitty_Fall.Website.Language {
         public static string AccountEnglish => ResourceManager.GetString("AccountEnglish", resourceCulture);
         public static string AccountMyanmar => ResourceManager.GetString("AccountMyanmar", resourceCulture);
         public static string AccountSecurityNote => ResourceManager.GetString("AccountSecurityNote", resourceCulture);
+        public static string AccountAvatarAlt => ResourceManager.GetString("AccountAvatarAlt", resourceCulture);
+        public static string AccountCancelCatAlt => ResourceManager.GetString("AccountCancelCatAlt", resourceCulture);
+        public static string BuyTurnSuccessMessage => ResourceManager.GetString("BuyTurnSuccessMessage", resourceCulture);
     }
 }

+ 9 - 0
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Language/Lang.resx

@@ -630,4 +630,13 @@
   <data name="AccountSecurityNote" xml:space="preserve">
     <value>Your game experience and rewards are saved to this account securely.</value>
   </data>
+  <data name="AccountAvatarAlt" xml:space="preserve">
+    <value>Account avatar</value>
+  </data>
+  <data name="AccountCancelCatAlt" xml:space="preserve">
+    <value>Kitty Fall cat</value>
+  </data>
+  <data name="BuyTurnSuccessMessage" xml:space="preserve">
+    <value>You have successfully purchased {0} turns!</value>
+  </data>
 </root>

+ 11 - 2
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Language/Lang.vi.resx

@@ -544,10 +544,10 @@
     <value>Each subscriber is eligible to receive a monthly prize only once within the most recent 3-month period.</value>
   </data>
   <data name="AccountLoyaltyPoints" xml:space="preserve">
-    <value>LOYALTY POINTS</value>
+    <value>သစ္စာရှိမှုအမှတ်များ</value>
   </data>
   <data name="AccountTotalLoyaltyPoints" xml:space="preserve">
-    <value>Total loyalty points</value>
+    <value>သစ္စာရှိမှုအမှတ် စုစုပေါင်း</value>
   </data>
   <data name="AccountTitle" xml:space="preserve">
     <value>အကောင့်</value>
@@ -630,4 +630,13 @@
   <data name="AccountSecurityNote" xml:space="preserve">
     <value>သင့်ဂိမ်းအတွေ့အကြုံနှင့် ဆုများကို ဤအကောင့်တွင် လုံခြုံစွာ သိမ်းဆည်းထားပါသည်။</value>
   </data>
+  <data name="AccountAvatarAlt" xml:space="preserve">
+    <value>အကောင့်ပုံ</value>
+  </data>
+  <data name="AccountCancelCatAlt" xml:space="preserve">
+    <value>Kitty Fall ကြောင်</value>
+  </data>
+  <data name="BuyTurnSuccessMessage" xml:space="preserve">
+    <value>သင်သည် ကစားခွင့် {0} ကြိမ်ကို အောင်မြင်စွာ ဝယ်ယူပြီးပါပြီ။</value>
+  </data>
 </root>

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

@@ -271,7 +271,7 @@
                     <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" data-success-title
                        data-subscription-title="@Lang.SubscriptionSuccessMessage"
-                       data-buy-turn-template="You have successfully purchased {0} turn(s)!">@Lang.SubscriptionSuccessMessage</p>
+                       data-buy-turn-template="@Lang.BuyTurnSuccessMessage">@Lang.SubscriptionSuccessMessage</p>
 
                     <div class="result-benefits" data-success-benefits>
                         <div class="result-benefit">

+ 31 - 29
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Views/Shared/_Layout.cshtml

@@ -36,10 +36,10 @@
         bool.TryParse((x["status"] ?? x["Status"])?.ToString(), out var active) && active);
     var packageNameRaw = (activeReg?["productName"] ?? activeReg?["ProductName"])?.ToString() ?? "";
     var packageName = string.IsNullOrWhiteSpace(packageNameRaw)
-        ? "No active package"
+        ? Lang.AccountNoActivePackage
         : packageNameRaw.Contains("DAYLY", StringComparison.OrdinalIgnoreCase)
             || packageNameRaw.Contains("DAILY", StringComparison.OrdinalIgnoreCase)
-                ? "Daily Package"
+                ? Lang.AccountDailyPackage
                 : packageNameRaw.Replace("_", " ");
     var packageTurns = (activeReg?["numberSpin"] ?? activeReg?["NumberSpin"])?.ToString() ?? "0";
     var packageRegisterText = (activeReg?["registerTime"] ?? activeReg?["RegisterTime"])?.ToString();
@@ -56,31 +56,31 @@
     @RenderBody()
 
     <div class="account-menu-modal" data-account-menu aria-hidden="true">
-        <button class="account-menu-backdrop" type="button" data-account-close aria-label="Close account menu"></button>
-        <section class="account-menu-card" role="dialog" aria-modal="true" aria-label="Account">
-            <div class="account-menu-ribbon"><span>ACCOUNT</span></div>
-            <button class="account-menu-close" type="button" data-account-close aria-label="Close account menu">×</button>
+        <button class="account-menu-backdrop" type="button" data-account-close aria-label="@Lang.AccountCloseMenu"></button>
+        <section class="account-menu-card" role="dialog" aria-modal="true" aria-label="@Lang.AccountTitle">
+            <div class="account-menu-ribbon"><span>@Lang.AccountTitle</span></div>
+            <button class="account-menu-close" type="button" data-account-close aria-label="@Lang.AccountCloseMenu">×</button>
 
             <div class="account-menu-content">
                 <section class="account-profile-card">
-                    <img class="account-profile-avatar" src="@accountAvatar" alt="Account avatar">
+                    <img class="account-profile-avatar" src="@accountAvatar" alt="@Lang.AccountAvatarAlt">
                     <div>
-                        <small>ACCOUNT (PHONE NUMBER)</small>
+                        <small>@Lang.AccountPhoneNumber</small>
                         <strong>@accountMsisdn</strong>
-                        <p>This is your default account.</p>
+                        <p>@Lang.AccountDefaultDescription</p>
                     </div>
                 </section>
 
                 <section class="account-summary-card">
-                    <h2><span>▣</span> TOTAL THIS MONTH</h2>
+                    <h2><span>▣</span> @Lang.AccountTotalThisMonth</h2>
                     <div class="account-summary-grid">
                         <div class="account-summary-item is-score">
                             <img src="~/kitty/assets/kitty-fall/coin.png" alt="">
-                            <span><small>POINTS</small><strong>@accountScore.ToString("N0")</strong><em>Total points</em></span>
+                            <span><small>@Lang.AccountPoints</small><strong>@accountScore.ToString("N0")</strong><em>@Lang.AccountTotalPoints</em></span>
                         </div>
                         <div class="account-summary-item is-data">
                             <i class="account-metric-icon is-data">MB</i>
-                            <span><small>DATA (MB)</small><strong>@accountDataMb.ToString("N0")</strong><em>Total data won</em></span>
+                            <span><small>@Lang.AccountDataMb</small><strong>@accountDataMb.ToString("N0")</strong><em>@Lang.AccountTotalDataWon</em></span>
                         </div>
                         <div class="account-summary-item is-loyalty">
                             <i class="account-metric-icon is-loyalty">🐾</i>
@@ -88,37 +88,39 @@
                         </div>
                     </div>
                     <p class="account-summary-note">
-                        <span>i</span> Points, data and rewards are accumulated from
-                        @monthStart.ToString("dd/MM") - @monthEnd.ToString("dd/MM") and reset monthly.
+                        <span>i</span> @string.Format(Lang.AccountMonthlySummary, monthStart.ToString("dd/MM"), monthEnd.ToString("dd/MM"))
                     </p>
                 </section>
 
                 <section class="account-package-card">
                     <span class="account-section-icon">★</span>
                     <div class="account-package-info">
-                        <small>CURRENT PACKAGE @if (activeReg != null) { <b>ACTIVE SUBSCRIPTION</b> }</small>
+                        <small>
+                            @Lang.AccountCurrentPackage
+                            @if (activeReg != null) { <b>@Lang.AccountActiveSubscription</b> }
+                        </small>
                         <strong>@packageName</strong>
                         @if (activeReg != null)
                         {
                             <p>
-                                @packageTurns plays per day
+                                @string.Format(Lang.AccountPlaysPerDay, packageTurns)
                                 @if (hasPackageExpireTime)
                                 {
-                                    <span>• Expires @packageExpireTime.ToString("dd/MM/yyyy")</span>
+                                    <span>• @string.Format(Lang.AccountExpires, packageExpireTime.ToString("dd/MM/yyyy"))</span>
                                 }
                                 else if (isPackageRenewing)
                                 {
-                                    <span>• Auto renew</span>
+                                    <span>• @Lang.AccountAutoRenew</span>
                                 }
                             </p>
                             @if (hasPackageRegisterTime)
                             {
-                                <em>Subscribed since @packageRegisterTime.ToString("dd/MM/yyyy")</em>
+                                <em>@string.Format(Lang.AccountSubscribedSince, packageRegisterTime.ToString("dd/MM/yyyy"))</em>
                             }
                         }
                         else
                         {
-                            <p>Subscription information is not available.</p>
+                            <p>@Lang.AccountSubscriptionUnavailable</p>
                         }
                     </div>
                 </section>
@@ -126,30 +128,30 @@
                 <section class="account-cancel-card">
                     <span class="account-section-icon">☏</span>
                     <div>
-                        <small>HOW TO CANCEL</small>
-                        <p>If you want to cancel the service, please send</p>
-                        <strong>@cancelKeyword to @cancelShortCode</strong>
-                        <p>and follow the instructions.</p>
+                        <small>@Lang.AccountHowToCancel</small>
+                        <p>@Lang.AccountCancelInstruction</p>
+                        <strong>@string.Format(Lang.AccountCancelCommand, cancelKeyword, cancelShortCode)</strong>
+                        <p>@Lang.AccountFollowInstructions</p>
                     </div>
-                    <img src="~/kitty/assets/kitty-fall/account-cat-cancel.png" alt="Kitty Fall cat">
+                    <img src="~/kitty/assets/kitty-fall/account-cat-cancel.png" alt="@Lang.AccountCancelCatAlt">
                 </section>
 
                 <section class="account-language-card">
                     <span class="account-section-icon">◎</span>
                     <div class="account-language-main">
-                        <small>LANGUAGE</small>
+                        <small>@Lang.AccountLanguage</small>
                         <div class="account-language-options">
                             <button class="account-language-option @(currentCulture == "en" ? "active" : null)" type="button" onclick="changeLang('en')">
-                                <img src="~/kitty/assets/kitty-fall/flag-gb.svg" alt=""><strong>ENGLISH</strong><b>✓</b>
+                                <img src="~/kitty/assets/kitty-fall/flag-gb.svg" alt=""><strong>@Lang.AccountEnglish</strong><b>✓</b>
                             </button>
                             <button class="account-language-option @(currentCulture == "vi" ? "active" : null)" type="button" onclick="changeLang('vi')">
-                                <img src="~/kitty/assets/kitty-fall/flag-mm.svg" alt=""><strong>MYANMAR</strong><b>✓</b>
+                                <img src="~/kitty/assets/kitty-fall/flag-mm.svg" alt=""><strong>@Lang.AccountMyanmar</strong><b>✓</b>
                             </button>
                         </div>
                     </div>
                 </section>
 
-                <p class="account-security-note"><span>×</span>Your game experience and rewards are saved to this account securely.</p>
+                <p class="account-security-note"><span>×</span>@Lang.AccountSecurityNote</p>
             </div>
         </section>
     </div>

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

@@ -3534,6 +3534,20 @@ button {
     display: none;
 }
 
+.result-dialog-shell-success.is-buy-turn-result,
+.result-dialog-shell-success.is-buy-turn-result .result-dialog {
+    height: 470px;
+}
+
+.is-buy-turn-result .result-card-success {
+    height: 360px;
+    padding-bottom: 24px;
+}
+
+.is-buy-turn-result .result-button.confirm-button {
+    bottom: 24px;
+}
+
 .result-ticket-icon {
     width: 32px;
     height: 32px;

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

@@ -3534,6 +3534,20 @@ button {
     display: none;
 }
 
+.result-dialog-shell-success.is-buy-turn-result,
+.result-dialog-shell-success.is-buy-turn-result .result-dialog {
+    height: 470px;
+}
+
+.is-buy-turn-result .result-card-success {
+    height: 360px;
+    padding-bottom: 24px;
+}
+
+.is-buy-turn-result .result-button.confirm-button {
+    bottom: 24px;
+}
+
 .result-ticket-icon {
     width: 32px;
     height: 32px;

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

@@ -609,6 +609,9 @@ const initKittyFall = () => {
             const successPanel = subscriptionModal.querySelector('[data-modal-panel="success"]');
             const isBuyTurn = confirmButton.dataset.packageAction === "buy-turn";
             successPanel?.classList.toggle("is-buy-turn-result", isBuyTurn);
+            if (successPanel) {
+                successPanel.dataset.scaleHeight = isBuyTurn ? "470" : "608";
+            }
             const successActionButton = subscriptionModal.querySelector("[data-success-action-button]");
             const successActionLabel = successActionButton?.querySelector("[data-success-action-label]");
             const successTitle = subscriptionModal.querySelector("[data-success-title]");
@@ -617,7 +620,7 @@ const initKittyFall = () => {
             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.buyTurnTemplate || "You have successfully purchased {0} turns!").replace("{0}", turnCount)
                     : successTitle.dataset.subscriptionTitle || "";
             }
             if (successBenefits) {

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

@@ -609,6 +609,9 @@ const initKittyFall = () => {
             const successPanel = subscriptionModal.querySelector('[data-modal-panel="success"]');
             const isBuyTurn = confirmButton.dataset.packageAction === "buy-turn";
             successPanel?.classList.toggle("is-buy-turn-result", isBuyTurn);
+            if (successPanel) {
+                successPanel.dataset.scaleHeight = isBuyTurn ? "470" : "608";
+            }
             const successActionButton = subscriptionModal.querySelector("[data-success-action-button]");
             const successActionLabel = successActionButton?.querySelector("[data-success-action-label]");
             const successTitle = subscriptionModal.querySelector("[data-success-title]");
@@ -617,7 +620,7 @@ const initKittyFall = () => {
             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.buyTurnTemplate || "You have successfully purchased {0} turns!").replace("{0}", turnCount)
                     : successTitle.dataset.subscriptionTitle || "";
             }
             if (successBenefits) {