init commit
This commit is contained in:
72
app/game/systems/leveling.py
Normal file
72
app/game/systems/leveling.py
Normal file
@@ -0,0 +1,72 @@
|
||||
|
||||
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)
|
||||
Reference in New Issue
Block a user