107 lines
3.5 KiB
Python
107 lines
3.5 KiB
Python
"""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"],
|
|
}
|