56 lines
1.8 KiB
Python
56 lines
1.8 KiB
Python
import uuid
|
|
from typing import Dict, List, Any, Tuple
|
|
|
|
from app.game.utils.common import Dice
|
|
from app.game.models.entities import Entity
|
|
from app.game.utils.loaders import TemplateStore
|
|
from app.game.systems.leveling import hp_and_mp_gain
|
|
|
|
dice = Dice()
|
|
|
|
def build_char(name:str, origin_story:str, race_id:str, class_id:str, fame:int=0) -> Entity:
|
|
|
|
templates = TemplateStore()
|
|
|
|
# base_ability_scores = {"STR":10,"DEX":10,"CON":10,"INT":10,"WIS":10,"CHA":10, "LUC":10}
|
|
|
|
race = templates.race(race_id)
|
|
profession = templates.profession(class_id)
|
|
|
|
e = Entity(
|
|
uuid = str(uuid.uuid4()),
|
|
name = name,
|
|
origin_story = origin_story,
|
|
fame = fame,
|
|
level=1,
|
|
race =race.get("name"),
|
|
profession = profession.get("name")
|
|
)
|
|
|
|
# assign hit dice
|
|
e.hit_die = profession.get("hit_die")
|
|
e.per_level.hp_die = profession.get("per_level",{}).get("hp_rule",{}).get("die","1d10")
|
|
e.per_level.mp_die = profession.get("per_level",{}).get("mp_rule",{}).get("die","1d10")
|
|
e.per_level.hp_rule = profession.get("per_level",{}).get("hp_rule",{}).get("rule","avg")
|
|
e.per_level.mp_rule = profession.get("per_level",{}).get("mp_rule",{}).get("rule","avg")
|
|
|
|
# assign hp/mp
|
|
e.hp = hp_and_mp_gain(1,e.per_level.hp_die,e.per_level.hp_rule)
|
|
e.mp = hp_and_mp_gain(1,e.per_level.mp_die,e.per_level.mp_rule)
|
|
|
|
for stat, delta in race.get("ability_mods", {}).items():
|
|
e.ability_scores[stat] = e.ability_scores.get(stat, 10) + int(delta)
|
|
|
|
# Apply class grants (spells/skills/equipment + MP base)
|
|
grants = profession.get("grants", {})
|
|
|
|
# add spells to char
|
|
grant_spells = grants.get("spells", []) or []
|
|
for spell in grant_spells:
|
|
spell_dict = templates.spell(spell)
|
|
e.spells.append(spell_dict)
|
|
|
|
# TODO
|
|
# e.skills.extend(grants.get("skills", []) or [])
|
|
|
|
return e |