156 lines
3.9 KiB
Python
Executable File
156 lines
3.9 KiB
Python
Executable File
import enum
|
|
|
|
from MechFabrik.bauteile.items import Item, ItemStatus
|
|
|
|
|
|
class ZoneNames(enum.Enum):
|
|
HEAD = 'Kopf'
|
|
MIDDLE_TORSO_FRONT = 'Torso Mitte Vorn'
|
|
MIDDLE_TORSO_REAR = 'Torso Mitte Rücken'
|
|
RIGHT_TORSO_FRONT = 'Rechter Torso Vorn'
|
|
RIGHT_TORSO_REAR = 'Rechter Torso Rücken'
|
|
LEFT_TORSO_FRONT = 'Linker Torso Vorn'
|
|
LEFT_TORSO_REAR = 'Linker Torso Rücken'
|
|
RIGHT_LEG = 'Rechtes Bein'
|
|
RIGHT_ARM = 'Rechter Arm'
|
|
LEFT_LEG = 'Linkes Bein'
|
|
LEFT_ARM = 'Linker Arm'
|
|
|
|
|
|
class AreaNames(enum.Enum):
|
|
HEAD = 'Kopf'
|
|
MIDDLE_TORSO = 'Torso Mitte'
|
|
RIGHT_TORSO = 'Rechter Torso'
|
|
LEFT_TORSO = 'Linker Torso'
|
|
RIGHT_LEG = 'Rechtes Bein'
|
|
RIGHT_ARM = 'Rechter Arm'
|
|
LEFT_LEG = 'Linkes Bein'
|
|
LEFT_ARM = 'Linker Arm'
|
|
|
|
|
|
class AreaStatus(enum.Flag):
|
|
FINE = 0
|
|
DAMAGED = 1
|
|
DESTROYED = 2
|
|
|
|
|
|
class Zone:
|
|
|
|
def __init__(self):
|
|
self.__dict__['_armor'] = 0
|
|
self.__dict__['_parent'] = None
|
|
self.__dict__['_state'] = AreaStatus.FINE
|
|
|
|
def __setattr__(self, key, value):
|
|
self.__dict__['_' + key] = value
|
|
|
|
def __getattr__(self, item):
|
|
return self.__dict__['_' + item]
|
|
|
|
|
|
class Area(Zone):
|
|
|
|
def __init__(self):
|
|
super().__init__()
|
|
self.__dict__['_outer_amor'] = list()
|
|
self.__dict__['_children'] = list()
|
|
self.__dict__['_items'] = dict()
|
|
|
|
|
|
class OuterAmor(Zone):
|
|
|
|
def __init__(self, area: Area):
|
|
super().__init__()
|
|
self.__dict__['_parent'] = area
|
|
self.__dict__['_area'] = area
|
|
|
|
|
|
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 InnerStructure:
|
|
|
|
def __init__(self, tonnage: float, gyroskope: Gyroskope):
|
|
self._gyroskope = gyroskope
|
|
self._tonnage = tonnage
|
|
self._areas = dict()
|
|
self._zones = dict()
|
|
|
|
@property
|
|
def tonnage(self) -> float:
|
|
return self._tonnage
|
|
|
|
@property
|
|
def gyroskope(self) -> Gyroskope:
|
|
return self._gyroskope
|
|
|
|
@property
|
|
def areas(self) -> dict[AreaNames, Area]:
|
|
return self._areas
|
|
|
|
def add_area(self, index: AreaNames, area: Area):
|
|
self._areas[index] = area
|
|
|
|
@property
|
|
def zones(self) -> dict[ZoneNames, OuterAmor]:
|
|
return self._zones
|
|
|
|
def add_zone(self, index: ZoneNames, zone: OuterAmor):
|
|
self._zones[index] = zone
|
|
|
|
|
|
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:
|
|
self.__dict__['_item_is_empty'] = True
|
|
else:
|
|
self.__dict__['_item_is_empty'] = False
|
|
item.state = ItemStatus.DESTROYED
|
|
return self
|
|
|
|
def is_empty(self):
|
|
return self.__dict__['_item_is_empty']
|