move inventory verbs to inventory map from character
This commit is contained in:
@@ -10,7 +10,6 @@ from ttfrog.db.base import BaseObject, SlugMixin
|
||||
from ttfrog.db.schema.classes import CharacterClass, ClassFeature
|
||||
from ttfrog.db.schema.constants import DamageType, Defenses
|
||||
from ttfrog.db.schema.inventory import Inventory, InventoryMap, InventoryType
|
||||
from ttfrog.db.schema.item import ItemType
|
||||
from ttfrog.db.schema.modifiers import Modifier, ModifierMixin, Stat
|
||||
from ttfrog.db.schema.skill import Skill
|
||||
|
||||
@@ -422,47 +421,6 @@ class Character(BaseObject, SlugMixin, ModifierMixin):
|
||||
mapping.attuned = False
|
||||
return True
|
||||
|
||||
def equip(self, mapping):
|
||||
if mapping.equipped:
|
||||
return False
|
||||
mapping.equipped = True
|
||||
return True
|
||||
|
||||
def unequip(self, mapping):
|
||||
if not mapping.equipped:
|
||||
return False
|
||||
mapping.equipped = False
|
||||
return True
|
||||
|
||||
def prepare(self, mapping):
|
||||
if mapping.item.item_type != ItemType.SPELL:
|
||||
return False
|
||||
if mapping.item.level > 0 and not self.spell_slots_by_level[mapping.item.level]:
|
||||
return False
|
||||
return self.equip(mapping)
|
||||
|
||||
def unprepare(self, mapping):
|
||||
if mapping.item.item_type != ItemType.SPELL:
|
||||
return False
|
||||
return self.unequip(mapping)
|
||||
|
||||
def cast(self, mapping: InventoryMap, level=0):
|
||||
if not mapping.prepared:
|
||||
return False
|
||||
if not level:
|
||||
level = mapping.item.level
|
||||
|
||||
# cantrips
|
||||
if level == 0:
|
||||
return True
|
||||
|
||||
# expend the spell slot
|
||||
avail = self.spell_slots_available[level]
|
||||
if not avail:
|
||||
return False
|
||||
avail[0].expended = True
|
||||
return True
|
||||
|
||||
def level_in_class(self, charclass):
|
||||
mapping = [mapping for mapping in self.class_map if mapping.character_class_id == charclass.id]
|
||||
if not mapping:
|
||||
|
||||
@@ -41,6 +41,8 @@ class Inventory(BaseObject):
|
||||
uselist=True, cascade="all,delete,delete-orphan", lazy="immediate", default_factory=lambda: []
|
||||
)
|
||||
|
||||
character = relationship("Character", init=False, viewonly=True, lazy="immediate")
|
||||
|
||||
def get(self, item):
|
||||
return self.get_all(item)[0]
|
||||
|
||||
@@ -101,6 +103,30 @@ class InventoryMap(BaseObject):
|
||||
if self.item.item_type == ItemType.SPELL:
|
||||
return self.equipped or self.always_prepared
|
||||
|
||||
def equip(self):
|
||||
if self.equipped:
|
||||
return False
|
||||
self.equipped = True
|
||||
return True
|
||||
|
||||
def unequip(self):
|
||||
if not self.equipped:
|
||||
return False
|
||||
self.equipped = False
|
||||
return True
|
||||
|
||||
def prepare(self):
|
||||
if self.item.item_type != ItemType.SPELL:
|
||||
return False
|
||||
if self.item.level > 0 and not self.inventory.character.spell_slots_by_level[self.item.level]:
|
||||
return False
|
||||
return self.equip()
|
||||
|
||||
def unprepare(self):
|
||||
if self.item.item_type != ItemType.SPELL:
|
||||
return False
|
||||
return self.unequip()
|
||||
|
||||
def use(self, item_property: ItemProperty, charges=None):
|
||||
if item_property.charge_cost is None:
|
||||
return True
|
||||
@@ -126,6 +152,42 @@ class InventoryMap(BaseObject):
|
||||
return 0
|
||||
return self.count
|
||||
|
||||
def cast(self, level=0):
|
||||
if self.item.item_type != ItemType.SPELL:
|
||||
return False
|
||||
|
||||
if not self.prepared:
|
||||
return False
|
||||
if not level:
|
||||
level = self.item.level
|
||||
|
||||
# cantrips
|
||||
if level == 0:
|
||||
return True
|
||||
|
||||
# expend the spell slot
|
||||
avail = self.inventory.character.spell_slots_available[level]
|
||||
if not avail:
|
||||
return False
|
||||
avail[0].expended = True
|
||||
return True
|
||||
|
||||
def attune(self):
|
||||
if self.attuned:
|
||||
return False
|
||||
if not self.item.requires_attunement:
|
||||
return False
|
||||
if len(self.inventory.character.attuned_items) >= 3:
|
||||
return False
|
||||
self.attuned = True
|
||||
return True
|
||||
|
||||
def unattune(self):
|
||||
if not self.attuned:
|
||||
return False
|
||||
self.attuned = False
|
||||
return True
|
||||
|
||||
|
||||
class Charge(BaseObject):
|
||||
__tablename__ = "charge"
|
||||
|
||||
Reference in New Issue
Block a user