from mech_factory.components import Area, AreaStatus, ItemStatus, OuterAmor, Zone class StrikeEvent: def __init__(self, zone: Zone, hits: int): self._zone = zone self._hits = hits @property def zone(self) -> Zone: return self._zone @property def hits(self) -> int: return self._hits @hits.setter def hits(self, hits: int): self._hits = hits def process_event(self) -> StrikeEvent: while self.hits > 0: if self.hits >= self.zone.armor: self.hits -= self.zone.armor self.zone.armor = 0 self.zone.state = AreaStatus.DESTROYED if self.hits > 0: self._zone = self.zone.parent else: self.zone.armor -= self.hits self.zone.state = AreaStatus.DAMAGED self.hits = 0 break return self class CriticalStrikeEvent: def __init__(self, zone: OuterAmor, index: tuple[int, int]): self.__dict__['_zone'] = zone self.__dict__['_area'] = zone.area self.__dict__['_index'] = index self.__dict__['_item_is_empty'] = None @property def area(self) -> Area: return self.__dict__['_area'] def process_event(self) -> CriticalStrikeEvent: self.__dict__['_zone'].state = AreaStatus.DAMAGED self.__dict__['_area'].state = AreaStatus.DAMAGED item = self.__dict__['_area'].items[self.__dict__['_index']] if item is None or item.state == ItemStatus.DESTROYED: self.__dict__['_item_is_empty'] = True else: self.__dict__['_item_is_empty'] = False item.process_strike() return self def is_empty(self): return self.__dict__['_item_is_empty']