Files
devplacepy/devplacepy/services/game/store/mastery.py
T
retoorandClaude Sonnet 5 34f76aad65 Code Farm economy rebalance: market saturation, infrastructure/defense/cosmetics, mastery track, secondary leaderboards, admin eras, underdog bonus and weekly contracts
Every purchase/upgrade path (new and pre-existing) is now race-safe against concurrent requests via atomic conditional SQL updates.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-22 23:55:46 +02:00

35 lines
1.3 KiB
Python

# retoor <retoor@molodetz.nl>
from __future__ import annotations
from .. import economy
from .common import GameError, _lvl, conditional_update_farm
from .farm import ensure_farm, get_farm
MASTERY_COLUMN = {m.key: f"mastery_{m.key}" for m in economy.MASTERY_UPGRADES}
def upgrade_mastery(user: dict, key: str) -> dict:
upgrade = economy.mastery_for(key)
if not upgrade:
raise GameError("Unknown Mastery upgrade.")
farm = ensure_farm(user["uid"])
column = MASTERY_COLUMN[upgrade.key]
level = _lvl(farm, column)
if level >= upgrade.max_level:
raise GameError("That Mastery upgrade is maxed out.")
cost = economy.mastery_cost(upgrade, level)
rows = conditional_update_farm(
farm["uid"],
set_clause=f"mastery_points = COALESCE(mastery_points, 0) - :cost, {column} = :new_level",
where_clause=f"COALESCE({column}, 0) = :current_level AND COALESCE(mastery_points, 0) >= :cost",
params={"cost": cost, "new_level": level + 1, "current_level": level},
)
if rows == 0:
farm = get_farm(user["uid"])
if _lvl(farm, column) != level:
raise GameError("That Mastery upgrade already changed - refresh and try again.")
raise GameError("Not enough Mastery points for that upgrade.")
return {"key": upgrade.key, "level": level + 1, "spent": cost}