import enum 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 ItemTypes(enum.Enum): COCKPIT = 1 REAKTOR = 2 GYROSKOPE = 3 ACTIVATOR = 4 JOINT = 5 SENSORS = 6 SUSTAINMENT = 7 class Item(object): def __init__(self, item_type: ItemTypes): self._type = item_type @property def type(self): return self._type class BigItem(Item): def __init__(self, item_type: ItemTypes, tonnage: float): super().__init__(item_type) self._tonnage = tonnage @property def tonnage(self) -> float: return self._tonnage class Cockpit(BigItem): def __init__(self): super().__init__(ItemTypes.COCKPIT, 3.0) class Reaktor(BigItem): def __init__(self, value: int, tonnage: float): super().__init__(ItemTypes.REAKTOR, tonnage) self._value = value @property def value(self): return self._value class Activator(Item): def __init__(self): super().__init__(ItemTypes.ACTIVATOR) class Joint(Item): def __init__(self): super().__init__(ItemTypes.JOINT) class Sensors(Item): def __init__(self): super().__init__(ItemTypes.SENSORS) class Sustainment(Item): def __init__(self): super().__init__(ItemTypes.SUSTAINMENT) 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 Gyroskope: def __init__(self, tonnage: float): self._tonnage = tonnage @property def tonnage(self) -> float: return self._tonnage 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, Zone]: return self._zones def add_zone(self, index: ZoneNames, zone: Zone): self._zones[index] = zone class Mech(object): def __init__(self, name: str, tonnage: float, movement_rate: int, inner_structure: InnerStructure): self._movement_rate = movement_rate self._tonnage = tonnage self._name = name self._inner_structure = inner_structure @property def name(self) -> str: return self._name @property def tonnage(self) -> float: return self._tonnage @property def inner_structure(self) -> InnerStructure: return self._inner_structure @property def movement_rate(self) -> int: return self._movement_rate def set_item(self, key: tuple, item: Item): pass def strike(self, zone_name: ZoneNames, hits: int) -> StrikeEvent: zone = self._inner_structure.zones.get(zone_name) if zone is None: raise Exception(f"Zone {zone_name} not found") return StrikeEvent(zone, hits)