Turn timer + auto-play, disconnect/reconnect, cosmetics, queue & paid plan

- Turn timer (20s) for play/trump; system auto-plays a smart move on timeout
- Disconnect handling (mock): wait-for-return countdown, system covers turns
- Cosmetics: titles, card-back styles, custom profile-image upload, badges;
  pickers in Profile; shop sells card styles; reward modal shows new titles
- Paid plan (pro): free players queue when server busy, pro skips; upgrade flow
- OnlineService extended (upgradePlan, richer profile patch); mock implements
  queue + plans; gamification adds TITLES + CARD_STYLES

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
soroush.asadi
2026-06-04 10:49:54 +03:30
parent 5776036d78
commit 13ec0d4300
16 changed files with 682 additions and 61 deletions
+46
View File
@@ -196,6 +196,29 @@ const fa: Dict = {
"daily.come": "فردا برگردید",
"rank.label": "لیگ",
"dc.waiting": "{name} قطع شد — منتظر بازگشت ({s})",
"profile.titleLabel": "عنوان",
"profile.cardStyleLabel": "طرح کارت",
"profile.image": "تصویر پروفایل",
"profile.upload": "آپلود تصویر",
"profile.plan": "اشتراک",
"plan.pro": "ویژه",
"plan.free": "رایگان",
"plan.upgrade": "ارتقا به ویژه",
"plan.proDesc": "بازی بدون صف، در هر زمان",
"plan.active": "اشتراک ویژه فعال است",
"queue.title": "در صف بازی",
"queue.busy": "سرور شلوغ است",
"queue.position": "نفر {n} در صف",
"queue.skip": "با اشتراک ویژه بدون صف وارد شوید",
"queue.upgrade": "ورود سریع (ویژه)",
"shop.cardstyles": "طرح کارت‌ها",
"reward.newTitle": "عنوان جدید",
};
const en: Dict = {
@@ -381,6 +404,29 @@ const en: Dict = {
"daily.come": "Come back tomorrow",
"rank.label": "League",
"dc.waiting": "{name} disconnected — waiting ({s})",
"profile.titleLabel": "Title",
"profile.cardStyleLabel": "Card style",
"profile.image": "Profile image",
"profile.upload": "Upload image",
"profile.plan": "Plan",
"plan.pro": "Pro",
"plan.free": "Free",
"plan.upgrade": "Upgrade to Pro",
"plan.proDesc": "Skip the queue, play anytime",
"plan.active": "Pro plan active",
"queue.title": "In queue",
"queue.busy": "Server is busy",
"queue.position": "{n} in line",
"queue.skip": "Go Pro to skip the queue",
"queue.upgrade": "Skip queue (Pro)",
"shop.cardstyles": "Card styles",
"reward.newTitle": "New title",
};
const DICTS: Record<Locale, Dict> = { fa, en };