41 lines
1.1 KiB
Python
41 lines
1.1 KiB
Python
"""Pure gold/XP math. State lives in game.py."""
|
|
|
|
|
|
def interest(gold: int, cfg: dict) -> int:
|
|
g = cfg["gold"]
|
|
return min(gold // 10 * g["interest_per_10"], g["interest_cap"])
|
|
|
|
|
|
def streak_gold(streak: int, cfg: dict) -> int:
|
|
bonus = 0
|
|
for min_streak, gold in cfg["gold"]["streak_gold"]:
|
|
if abs(streak) >= min_streak:
|
|
bonus = gold
|
|
return bonus
|
|
|
|
|
|
def round_income(gold: int, streak: int, won: bool, round_label: str, cfg: dict) -> int:
|
|
g = cfg["gold"]
|
|
base = g["early_income"].get(round_label, g["base_income"])
|
|
income = base + interest(gold, cfg) + streak_gold(streak, cfg)
|
|
if won:
|
|
income += g["win_bonus"]
|
|
return income
|
|
|
|
|
|
def xp_to_next(level: int, cfg: dict) -> int | None:
|
|
xp = cfg["xp"]
|
|
if level >= xp["max_level"]:
|
|
return None
|
|
return xp["to_next"][level - xp.get("start_level", 1)]
|
|
|
|
|
|
def apply_xp(level: int, xp: int, gained: int, cfg: dict) -> tuple[int, int]:
|
|
xp += gained
|
|
while (need := xp_to_next(level, cfg)) is not None and xp >= need:
|
|
xp -= need
|
|
level += 1
|
|
if level >= cfg["xp"]["max_level"]:
|
|
xp = 0
|
|
return level, xp
|