mirror of
https://github.com/Threnklyn/dungeon-sheets.git
synced 2026-05-25 15:18:28 +02:00
69 lines
1.9 KiB
Python
69 lines
1.9 KiB
Python
def create_spell(**params):
|
|
"""Create a new subclass of ``Spell`` with given default parameters.
|
|
|
|
Useful for spells that haven't been entered into the ``spells.py``
|
|
file yet.
|
|
|
|
Parameters
|
|
----------
|
|
params : optional
|
|
Saved as attributes of the new class.
|
|
|
|
Returns
|
|
-------
|
|
NewSpell
|
|
New spell class, subclass of ``Spell``, with given params.
|
|
"""
|
|
NewSpell = Spell
|
|
NewSpell.name = params.get('name', 'Unknown Spell')
|
|
NewSpell.level = params.get('level', 9)
|
|
return NewSpell
|
|
|
|
|
|
class Spell():
|
|
"""A magical spell castable by a player character."""
|
|
level = 0
|
|
name = "Unknown spell"
|
|
casting_time = "1 action"
|
|
casting_range = "60 ft"
|
|
components = ()
|
|
materials = ""
|
|
duration = "instantaneous"
|
|
ritual = False
|
|
magic_school = ""
|
|
classes = ()
|
|
|
|
def __str__(self):
|
|
s = self.name + ' ({:s}) '.format(','.join(self.components))
|
|
# Indicate if this is a ritual or a concentration
|
|
indicators = [('R', self.ritual), ('C', self.concentration), ('$', self.special_material)]
|
|
indicators = tuple(letter for letter, is_active in indicators if is_active)
|
|
if len(indicators):
|
|
s += f' ({", ".join(indicators)})'
|
|
return s
|
|
|
|
def __repr__(self):
|
|
return "\"{:s}\"".format(self.name)
|
|
|
|
def __eq__(self, other):
|
|
return (self.name == other.name) and (self.level == other.level)
|
|
|
|
def __hash__(self):
|
|
return 0
|
|
|
|
@property
|
|
def component_string(self):
|
|
s = f'{", ".join(self.components)}'
|
|
if "M" in self.components:
|
|
s += f' ({self.materials})'
|
|
return s
|
|
|
|
@property
|
|
def concentration(self):
|
|
return ('concentration' in self.duration.lower())
|
|
|
|
@property
|
|
def special_material(self):
|
|
return ('worth at least' in self.materials.lower())
|
|
|