def __init__(self, owner: str, upstream: str, active: bool, sheet_type: str, import_version: int, name: str, description: str, image: str, stats: dict, levels: dict, attacks: list, skills: dict, resistances: dict, saves: dict, ac: int, max_hp: int, hp: int, temp_hp: int, cvars: dict, options: dict, overrides: dict, consumables: list, death_saves: dict, spellbook: dict, live, race: str, background: str, **kwargs): if kwargs: log.warning(f"Unused kwargs: {kwargs}") # sheet metadata self._owner = owner self._upstream = upstream self._active = active self._sheet_type = sheet_type self._import_version = import_version # main character info self.name = name self._description = description self._image = image self.stats = BaseStats.from_dict(stats) self.levels = Levels.from_dict(levels) self._attacks = [Attack.from_dict(atk) for atk in attacks] self.skills = Skills.from_dict(skills) self.resistances = Resistances.from_dict(resistances) self.saves = Saves.from_dict(saves) # hp/ac self.ac = ac self.max_hp = max_hp self._hp = hp self._temp_hp = temp_hp # customization self.cvars = cvars self.options = CharOptions.from_dict(options) self.overrides = ManualOverrides.from_dict(overrides) # ccs self.consumables = [ CustomCounter.from_dict(self, cons) for cons in consumables ] self.death_saves = DeathSaves.from_dict(death_saves) # spellbook spellbook = Spellbook.from_dict(spellbook) super(Character, self).__init__(spellbook) # live sheet integrations self._live = live integration = INTEGRATION_MAP.get(live) if integration: self._live_integration = integration(self) else: self._live_integration = None # misc research things self.race = race self.background = background
def get_levels(self) -> Levels: """Returns a dict with the character's level and class levels.""" if self.character_data is None: raise Exception('You must call get_character() first.') if self.levels: return self.levels character = self.character_data levels = collections.defaultdict(lambda: 0) for _class in character.get('classes', []): levelName = _class.get('definition', {}).get('name') levels[levelName] += _class.get('level') out = {} for level, v in levels.items(): cleaned_name = re.sub(r'[.$]', '_', level) out[cleaned_name] = v level_obj = Levels(out) self.levels = level_obj return level_obj
def get_levels(self): if self.character_data is None: raise Exception('You must call get_character() first.') try: total_level = int(self.character_data.cell("AL6").value) self.total_level = total_level except ValueError: raise MissingAttribute("Character level") level_dict = {} if self.additional: for rownum in range(69, 79): # sheet2, C69:C78 namecell = f"C{rownum}" levelcell = f"N{rownum}" classname = self.additional.cell(namecell).value if classname: classlevel = int(self.additional.cell(levelcell).value) level_dict[classname] = classlevel else: # classes should be top-aligned break levels = Levels(level_dict, total_level) return levels
def get_levels(self) -> Levels: """Returns a dict with the character's level and class levels.""" if self.character_data is None: raise Exception('You must call get_character() first.') if self.levels: return self.levels character = self.character_data levels = collections.defaultdict(lambda: 0) for level in character.get('classes', []): if level.get('removed', False): continue level_name = level['name'] levels[level_name] += level['level'] out = {} for level, v in levels.items(): cleaned_name = re.sub(r'[.$]', '_', level) out[cleaned_name] = v self.evaluator.names[f"{cleaned_name}Level"] = v level_obj = Levels(out) self.levels = level_obj self.evaluator.names['level'] = level_obj.total_level return level_obj