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