from typing import Any from mech_factory.component_storage import AreaNames, InnerStructure from mech_factory.component_storage.items import BigItem class Watcher: def __init__(self, tonnage: float): self._tonnage = tonnage self._weight_watcher = WeightWatcher(tonnage) self._amor_watcher = ArmorWatcher() def add_item(self, item: Any) -> Any: if isinstance(item, InnerStructure): self._amor_watcher.set_inner_structure(item) return self._weight_watcher.add_item(item) @property def actual_weight(self): return self._weight_watcher.actual_weight + self._amor_watcher.actual_armor_tonnage @property def rest_weight(self): return self._tonnage - self.actual_weight def add_armor(self, area: AreaNames, armor: int): self._amor_watcher.add_armor(area, armor) class ArmorWatcher: def __init__(self): self._inner_structure = None self._areas = {} @property def actual_armor_tonnage(self): actual_armor = sum(self._areas.values()) if actual_armor % 8 > 0: raise ValueError('Armor is not valid') return actual_armor / 16 def set_inner_structure(self, inner_structure: InnerStructure): self._inner_structure = inner_structure def add_armor(self, area: AreaNames, armor: int): max_armor = self._inner_structure.areas[area].armor * 2 if area is AreaNames.HEAD and armor > 9: raise ValueError(AreaNames.HEAD.name + 'Armor cannot be greater than 9') elif armor > max_armor: raise ValueError(AreaNames.HEAD.name + 'Armor cannot be greater than ' + str(max_armor)) self._areas[area] = armor class WeightWatcher: def __init__(self, max_weight: float): self._max_weight = max_weight self._items = {} self._armor = 0 @property def actual_weight(self): return sum(self._items.values()) def add_item(self, item: Any) -> Any: if isinstance(item, BigItem): self._items[item] = item.tonnage if isinstance(item, InnerStructure): self._items[item] = item.tonnage return item def set_armor(self, armor: int): self._armor = armor