mirror of
https://github.com/Threnklyn/dungeon-sheets.git
synced 2026-05-19 12:33:27 +02:00
49 lines
1.5 KiB
Python
49 lines
1.5 KiB
Python
from collections import defaultdict
|
|
|
|
|
|
class CharClass():
|
|
"""
|
|
A generic Character Class (not to be confused with builtin class)
|
|
"""
|
|
class_name = ""
|
|
class_level = 1
|
|
hit_dice_faces = None
|
|
weapon_proficiencies = ()
|
|
_proficiencies_text = ()
|
|
multiclass_weapon_proficiencies = ()
|
|
_multiclass_proficiencies_text = ()
|
|
languages = ()
|
|
class_skill_choices = ()
|
|
num_skill_choices = 2
|
|
spellcasting_ability = None
|
|
spell_slots_by_level = None
|
|
subclass = None
|
|
features_by_level = defaultdict(list)
|
|
|
|
def __init__(self, level, subclass=None, **params):
|
|
self.class_level = level
|
|
self.subclass = subclass
|
|
for k, v in params.items():
|
|
setattr(self, k, v)
|
|
|
|
@property
|
|
def features(self):
|
|
features = ()
|
|
for lvl in range(1, self.class_level+1):
|
|
features += tuple(self.features_by_level[lvl])
|
|
if self.subclass is not None and not isinstance(self.subclass, str):
|
|
features += tuple(self.subclass.features_by_level[lvl])
|
|
return features
|
|
|
|
@property
|
|
def is_spellcaster(self):
|
|
result = (self.spellcasting_ability is not None)
|
|
return result
|
|
|
|
def spell_slots(self, spell_level):
|
|
"""How many spells slots are available for this spell level."""
|
|
if self.spell_slots_by_level is None:
|
|
return 0
|
|
else:
|
|
return self.spell_slots_by_level[self.class_level][spell_level]
|