package economy // مقادیر اقتصادی پایه (قابل تنظیم بر اساس بیزینس‌پلن). const ( DailyReward = 200 // سکه روزانه AdReward = 50 // سکه به ازای هر تبلیغ rewardedِ کامل AdDailyCap = 50 // سقف تعداد تبلیغ پاداش‌دار در روز ) // CoinPackage بسته‌ی سکه با پول واقعی (IAP) — ممکن است VIP هم بدهد. type CoinPackage struct { ID string `json:"id"` Title string `json:"title"` Coins int64 `json:"coins"` VIPDays int `json:"vip_days"` PriceToman int `json:"price_toman"` BonusPct int `json:"bonus_pct"` } // TicketPackage بسته‌ی بلیط با پول واقعی (IAP). type TicketPackage struct { ID string `json:"id"` Title string `json:"title"` Tickets int64 `json:"tickets"` PriceToman int `json:"price_toman"` } // CardSkin اسکین کارت که با سکه باز می‌شود (قیمت ۰ یعنی پیش‌فرض رایگان). type CardSkin struct { ID string `json:"id"` Title string `json:"title"` PriceCoins int64 `json:"price_coins"` } // Booster بوستر XP با پول واقعی (IAP). type Booster struct { ID string `json:"id"` Title string `json:"title"` Multiplier int `json:"multiplier"` Hours int `json:"hours"` PriceToman int `json:"price_toman"` } // TableTier نوع میز: تعداد دست، ورودی، جایزه، XP و جام. type TableTier struct { ID string `json:"id"` Title string `json:"title"` Hands int `json:"hands"` Entry int64 `json:"entry"` Prize int64 `json:"prize"` XP int `json:"xp"` Trophy int `json:"trophy"` } // Catalog کل کاتالوگ فروشگاه (برای GET /api/shop). type Catalog struct { CoinPackages []CoinPackage `json:"coin_packages"` TicketPackages []TicketPackage `json:"ticket_packages"` CardSkins []CardSkin `json:"card_skins"` Boosters []Booster `json:"boosters"` TableTiers []TableTier `json:"table_tiers"` } // coinPackages — مطابق فروشگاه مرجع. var coinPackages = []CoinPackage{ {ID: "small", Title: "بسته کوچک", Coins: 6000, VIPDays: 0, PriceToman: 14950, BonusPct: 0}, {ID: "medium", Title: "بسته متوسط", Coins: 20000, VIPDays: 3, PriceToman: 37900, BonusPct: 20}, {ID: "large", Title: "بسته بزرگ", Coins: 80000, VIPDays: 7, PriceToman: 134900, BonusPct: 30}, {ID: "xlarge", Title: "بسته خیلی بزرگ", Coins: 180000, VIPDays: 15, PriceToman: 279900, BonusPct: 40}, {ID: "luxury", Title: "بسته لاکچری", Coins: 280000, VIPDays: 20, PriceToman: 379900, BonusPct: 50}, {ID: "sultans", Title: "بسته سلاطین", Coins: 700000, VIPDays: 30, PriceToman: 999000, BonusPct: 60}, } var ticketPackages = []TicketPackage{ {ID: "small", Title: "بسته کوچک", Tickets: 10, PriceToman: 6900}, {ID: "medium", Title: "بسته متوسط", Tickets: 50, PriceToman: 24900}, {ID: "large", Title: "بسته بزرگ", Tickets: 150, PriceToman: 64900}, {ID: "xlarge", Title: "بسته خیلی بزرگ", Tickets: 500, PriceToman: 199900}, } var cardSkins = []CardSkin{ {ID: "simple", Title: "بسته کارت ساده", PriceCoins: 0}, {ID: "swiss", Title: "بسته کارت سوئیسی", PriceCoins: 6000}, {ID: "wizard", Title: "بسته کارت جادوگر", PriceCoins: 10000}, {ID: "western", Title: "بسته کارت وسترن", PriceCoins: 12000}, {ID: "french", Title: "بسته کارت فرانسوی", PriceCoins: 20000}, {ID: "epic", Title: "بسته کارت حماسی", PriceCoins: 25000}, } var boosters = []Booster{ {ID: "xp2", Title: "بسته تجربه دو برابر", Multiplier: 2, Hours: 12, PriceToman: 6900}, {ID: "xp3", Title: "بسته تجربه سه برابر", Multiplier: 3, Hours: 24, PriceToman: 19900}, } // tableTiers — انواع میز (ورودی/جایزه/XP/جام). var tableTiers = []TableTier{ {ID: "beginner", Title: "مبتدی", Hands: 3, Entry: 100, Prize: 250, XP: 15, Trophy: 50}, {ID: "amateur", Title: "پیوست", Hands: 3, Entry: 2500, Prize: 5000, XP: 25, Trophy: 100}, {ID: "pro", Title: "حرفه‌ای", Hands: 7, Entry: 2500, Prize: 5000, XP: 25, Trophy: 100}, {ID: "master", Title: "استادان", Hands: 7, Entry: 20000, Prize: 40000, XP: 40, Trophy: 200}, } // FullCatalog کل کاتالوگ را برمی‌گرداند. func FullCatalog() Catalog { return Catalog{ CoinPackages: coinPackages, TicketPackages: ticketPackages, CardSkins: cardSkins, Boosters: boosters, TableTiers: tableTiers, } } func findCoinPackage(id string) *CoinPackage { for i := range coinPackages { if coinPackages[i].ID == id { return &coinPackages[i] } } return nil } func findTicketPackage(id string) *TicketPackage { for i := range ticketPackages { if ticketPackages[i].ID == id { return &ticketPackages[i] } } return nil } func findCardSkin(id string) *CardSkin { for i := range cardSkins { if cardSkins[i].ID == id { return &cardSkins[i] } } return nil } func findBooster(id string) *Booster { for i := range boosters { if boosters[i].ID == id { return &boosters[i] } } return nil } // FindTier نوع میز را برمی‌گرداند (برای لایه بازی). func FindTier(id string) *TableTier { for i := range tableTiers { if tableTiers[i].ID == id { return &tableTiers[i] } } return nil } // LevelInfo سطح فعلی، XP درون‌سطح و XP لازم برای سطح بعد را از XP کل محاسبه می‌کند. // نیاز هر سطح: ۵۰ × شماره سطح (مثلاً سطح ۸ ⇒ ۴۰۰). func LevelInfo(totalXP int64) (level int, into int64, need int64) { level = 1 remaining := totalXP for { need = int64(50 * level) if remaining < need { break } remaining -= need level++ } into = remaining return level, into, need }