62 lines
1.6 KiB
Python
62 lines
1.6 KiB
Python
|
|
from .component import Component
|
|
from .. import gameobjects
|
|
|
|
|
|
class Equipment(Component):
|
|
|
|
|
|
def __init__(self, slots=None):
|
|
if slots is None:
|
|
slots = {}
|
|
self.slots = {key: None for key in slots}
|
|
self.owner = None
|
|
for slot, item in slots.items():
|
|
self.equip(slot, item)
|
|
|
|
def attach(self, obj):
|
|
self.owner = obj
|
|
|
|
def getBonus(self, skill):
|
|
return sum(item.getComponent("item").getStat(skill) for item in self.slots.values() if item)
|
|
|
|
def equip(self, slot, item):
|
|
if slot in self.slots:
|
|
oldItem = self.slots[slot]
|
|
if oldItem:
|
|
self.owner.trigger("take", oldItem)
|
|
self.slots[slot] = item
|
|
if self.owner:
|
|
self.owner.trigger("equipmentchange")
|
|
else:
|
|
# todo: better exception
|
|
raise Exception("No such slot")
|
|
|
|
def unEquip(self, slot):
|
|
if slot in self.slots:
|
|
self.slots[slot] = None
|
|
if self.owner:
|
|
self.owner.trigger("equipmentchange")
|
|
|
|
def getSlots(self):
|
|
return self.slots.copy()
|
|
|
|
def canEquip(self, item):
|
|
return item.getSlot() in self.slots
|
|
|
|
|
|
def toJSON(self):
|
|
return {
|
|
slotName: item.serialize() if item else None
|
|
for slotName, item in self.slots.items()
|
|
}
|
|
|
|
@classmethod
|
|
def fromJSON(cls, slots):
|
|
return cls({
|
|
slotname: gameobjects.createEntity(item) if item else None
|
|
for slotname, item in slots.items()
|
|
})
|
|
|
|
|