Files

70 lines
2.2 KiB
Python

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