"""Prestige resets and the prestige upgrade shop.""" from __future__ import annotations from ..pb_client import DatabaseError from ..emoji import EMOJI as E from .store import PRESTIGE_SHOP, _commit, _locked_by, _txn, get_user from .levels import get_level PRESTIGE_ROLE = "TipiPRESTIGE" PRESTIGE_MIN_LEVEL = 30 # minimum level required to prestige # --------------------------------------------------------------------------- # /prestige # --------------------------------------------------------------------------- @_locked_by(0) async def do_prestige(user_id: int) -> dict: """Prestige: requires level 30, earns PP, resets balance/exp/items/cooldowns.""" try: user = await get_user(user_id) except DatabaseError: return {"ok": False, "reason": "db_error"} if user.get("eco_banned"): return {"ok": False, "reason": "banned"} exp = user.get("exp", 0) level = get_level(exp) if level < PRESTIGE_MIN_LEVEL: return {"ok": False, "reason": "level_too_low", "level": level, "required": PRESTIGE_MIN_LEVEL} pp_earned = max(1, exp // 1000) new_prestige_level = user.get("prestige_level", 0) + 1 # Preserve: fish_book, fish_inventory, lifetime stats, prestige_points, season_total_exp, prestige_upgrades user["balance"] = 0 user["exp"] = 0 user["items"] = [] user["item_uses"] = {} user["last_daily"] = None user["last_work"] = None user["last_beg"] = None user["last_crime"] = None user["last_rob"] = None user["last_fish"] = None user["last_heist"] = None user["daily_streak"] = 0 user["last_streak_date"] = None user["jailed_until"] = None user["jailbreak_used"] = False user["prestige_level"] = new_prestige_level user["prestige_points"] = user.get("prestige_points", 0) + pp_earned await _commit(user_id, user) _txn("PRESTIGE", user=user_id, pp_earned=pp_earned, prestige=new_prestige_level, old_exp=exp) return { "ok": True, "pp_earned": pp_earned, "prestige_level": new_prestige_level, "prestige_points": user["prestige_points"], "old_exp": exp, } @_locked_by(0) async def do_prestige_buy(user_id: int, upgrade_id: str) -> dict: """Spend PP to buy a prestige upgrade level.""" if upgrade_id not in PRESTIGE_SHOP: return {"ok": False, "reason": "not_found"} try: user = await get_user(user_id) except DatabaseError: return {"ok": False, "reason": "db_error"} if user.get("eco_banned"): return {"ok": False, "reason": "banned"} upgrade = PRESTIGE_SHOP[upgrade_id] upgrades: dict = user.get("prestige_upgrades") or {} current_level = upgrades.get(upgrade_id, 0) if current_level >= upgrade["max_level"]: return {"ok": False, "reason": "maxed", "max": upgrade["max_level"]} pp = user.get("prestige_points", 0) cost = upgrade["pp_cost"] if pp < cost: return {"ok": False, "reason": "insufficient_pp", "have": pp, "need": cost} upgrades[upgrade_id] = current_level + 1 user["prestige_upgrades"] = upgrades user["prestige_points"] = pp - cost await _commit(user_id, user) _txn("PRESTIGE_BUY", user=user_id, upgrade=upgrade_id, new_level=upgrades[upgrade_id], pp_left=user["prestige_points"]) return { "ok": True, "upgrade_id": upgrade_id, "new_level": upgrades[upgrade_id], "max_level": upgrade["max_level"], "pp_remaining": user["prestige_points"], }