finished out skills per level, added skill trees to professions templates

This commit is contained in:
2025-11-02 19:08:36 -06:00
parent fd572076e0
commit 31aa0000cc
16 changed files with 361 additions and 26 deletions

View File

@@ -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 (01) 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)