finished out skills per level, added skill trees to professions templates
This commit is contained in:
@@ -1,9 +1,14 @@
|
||||
# utils/leveling.py
|
||||
import math
|
||||
import random
|
||||
from typing import Dict, Any, Callable, Optional, List, Tuple
|
||||
|
||||
from app.game.generators.level_progression import LevelProgression
|
||||
from app.game.models.entities import Entity
|
||||
from app.game.generators.abilities_factory import newly_unlocked_abilities
|
||||
|
||||
GLOBAL_CHANCE_PER_LEVEL = 0.3
|
||||
|
||||
def set_level(entity:Entity, target_level: int, prog: LevelProgression) -> None:
|
||||
"""
|
||||
Snap an entity to a *specific* level. Sets XP to that level's floor.
|
||||
@@ -25,12 +30,15 @@ def set_level(entity:Entity, target_level: int, prog: LevelProgression) -> None:
|
||||
# set next level xp as xp needed for next level
|
||||
entity.xp_to_next_level = prog.xp_for_level(target_level + 1)
|
||||
|
||||
spells_list = newly_unlocked_abilities(class_name=entity.profession.name,
|
||||
path="Hellknight",
|
||||
# entity get's a random number of spells based on the number of levels gained
|
||||
skills_per_level = calculate_skills_gained(current,target_level)
|
||||
|
||||
skills = newly_unlocked_abilities(class_name=entity.profession.name,
|
||||
path=entity.ability_pathway,
|
||||
level=target_level,
|
||||
per_tier=1,
|
||||
per_tier=skills_per_level,
|
||||
primary=entity.profession.primary_stat)
|
||||
_add_abilities(entity,spells_list)
|
||||
_add_abilities(entity,skills)
|
||||
|
||||
_recalc(entity)
|
||||
|
||||
@@ -46,12 +54,12 @@ def grant_xp(entity:Entity, amount: int, prog: LevelProgression) -> Tuple[int, i
|
||||
|
||||
if new_level > old_level:
|
||||
for L in range(old_level + 1, new_level + 1):
|
||||
spells_list = newly_unlocked_abilities(class_name=entity.profession.name,
|
||||
path="Hellknight",
|
||||
skills = newly_unlocked_abilities(class_name=entity.profession.name,
|
||||
path=entity.ability_pathway,
|
||||
level=new_level,
|
||||
per_tier=1,
|
||||
primary=entity.profession.primary_stat)
|
||||
_add_abilities(entity,spells_list)
|
||||
_add_abilities(entity,skills)
|
||||
|
||||
if new_level > old_level:
|
||||
entity.level = new_level
|
||||
@@ -70,6 +78,30 @@ def grant_xp(entity:Entity, amount: int, prog: LevelProgression) -> Tuple[int, i
|
||||
|
||||
# ---------- reward + recalc helpers ----------
|
||||
|
||||
def calculate_skills_gained(current_level: int, target_level: int, chance_per_level: float = GLOBAL_CHANCE_PER_LEVEL) -> int:
|
||||
"""
|
||||
Returns the number of new skills a player might gain
|
||||
when leveling from current_level to target_level.
|
||||
|
||||
chance_per_level: probability (0–1) of gaining a skill per level.
|
||||
Guarantees at least 2 skills for small level gains.
|
||||
"""
|
||||
levels_gained = max(0, target_level - current_level)
|
||||
if levels_gained == 0:
|
||||
return 0
|
||||
|
||||
# Simulate random gain per level
|
||||
gained = sum(1 for _ in range(levels_gained) if random.random() < chance_per_level)
|
||||
|
||||
# Guarantee at least 2 skills if the player barely leveled
|
||||
if levels_gained < 3:
|
||||
gained = max(gained, 2)
|
||||
|
||||
# Smooth scaling: for huge jumps, don't explode linearly
|
||||
# (cap roughly at 40% of total levels gained)
|
||||
cap = math.ceil(levels_gained * 0.4)
|
||||
return min(gained, cap)
|
||||
|
||||
def _add_abilities(entity:Entity, abilities_list:list) -> None:
|
||||
for ability in abilities_list:
|
||||
entity.abilities.append(ability)
|
||||
|
||||
Reference in New Issue
Block a user