from app.utils.logging import get_logger from app.game.utils.common import Dice from app.game.models.entities import Entity logger = get_logger(__file__) dice = Dice() def calculate_xp_and_level(current_xp: int, xp_gain: int, base_xp: int = 100, growth_rate: float = 1.2): """ Calculates new XP and level after gaining experience. Args: current_xp (int): The player's current total XP. xp_gain (int): The amount of XP gained. base_xp (int): XP required for level 1 → 2. growth_rate (float): Multiplier for each level’s XP requirement. Returns: dict: { 'new_xp': int, 'new_level': int, 'xp_to_next_level': int, 'remaining_xp_to_next': int } """ # Calculate current level based on XP level = 1 xp_needed = base_xp total_xp_for_next = xp_needed # Determine current level from current_xp while current_xp >= total_xp_for_next: level += 1 xp_needed = int(base_xp * (growth_rate ** (level - 1))) total_xp_for_next += xp_needed # Add new XP new_xp = current_xp + xp_gain # Check if level up(s) occurred new_level = level while new_xp >= total_xp_for_next: new_level += 1 xp_needed = int(base_xp * (growth_rate ** (new_level - 1))) total_xp_for_next += xp_needed # XP required for next level xp_to_next_level = xp_needed levels_gained = new_level - level return { "new_xp": new_xp, "new_level": new_level, "xp_to_next_level": xp_to_next_level, "levels_gained": levels_gained } def hp_and_mp_gain(level: int, hit_die: str, rule: str) -> int: rule = (rule or "avg").lower() if level == 1: # Common RPG convention: level 1 gets max die return dice.max_of_die(hit_die) if rule == "max": return dice.max_of_die(hit_die) if rule == "avg": return dice.roll_dice(hit_die) # default fallback return dice.roll_dice(hit_die)