From 861b0736332c73b9c2b0f6e148b297e8e81af8bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20L=C3=BCcke?= Date: Wed, 1 Jul 2026 16:26:52 +0200 Subject: [PATCH 01/10] tests: verarbeite kritische Treffer --- MechFabrik/bauteile/__init__.py | 3 ++ MechFabrik/bauteile/items.py | 15 ++++++++++ tests/test_mech_process.py | 52 ++++++++++++++++++++++++++++++++- 3 files changed, 69 insertions(+), 1 deletion(-) diff --git a/MechFabrik/bauteile/__init__.py b/MechFabrik/bauteile/__init__.py index c88d5fc..da0f8ec 100755 --- a/MechFabrik/bauteile/__init__.py +++ b/MechFabrik/bauteile/__init__.py @@ -137,3 +137,6 @@ class InnerStructure: def add_zone(self, index: ZoneNames, zone: Zone): self._zones[index] = zone + +class CriticalStrikeEvent: + pass \ No newline at end of file diff --git a/MechFabrik/bauteile/items.py b/MechFabrik/bauteile/items.py index 354130b..92e1139 100644 --- a/MechFabrik/bauteile/items.py +++ b/MechFabrik/bauteile/items.py @@ -11,14 +11,29 @@ class ItemTypes(enum.Enum): SUSTAINMENT = 7 +class ItemStatus(enum.Flag): + FINE = 0 + DAMAGED = 1 + DESTROYED = 2 + + class Item(object): def __init__(self, item_type: ItemTypes): self._type = item_type + self._state = ItemStatus.FINE @property def type(self): return self._type + @property + def state(self): + return self._state + + @state.setter + def state(self, new_state: ItemStatus): + self._state = new_state + class BigItem(Item): diff --git a/tests/test_mech_process.py b/tests/test_mech_process.py index 3a6ee50..5e28d36 100755 --- a/tests/test_mech_process.py +++ b/tests/test_mech_process.py @@ -1,5 +1,7 @@ +from MechFabrik import Cockpit, Sensors, Sustainment +from MechFabrik.bauteile.items import ItemStatus from test_mech import AbstractTestMechAmor, INNER_ARMOR, NEXT_OUTER_ZONE, OUTER_ARMOR -from MechFabrik.bauteile import Area, AreaStatus, OuterAmor, StrikeEvent, ZoneNames +from MechFabrik.bauteile import Area, AreaStatus, OuterAmor, StrikeEvent, CriticalStrikeEvent, ZoneNames class TestMechAmor(AbstractTestMechAmor): @@ -28,6 +30,17 @@ class TestMechAmor(AbstractTestMechAmor): self.assertEqual(10, event.hits) self.assertEqual(area, event.zone.parent) + def test_critical_process(self): + for zone_name in ZoneNames: + with self.subTest(msg=zone_name.value): + zone = self.mech.inner_structure.zones.get(zone_name) + area = zone.area + + event = self.mech.critical_strike(zone_name, (1, 2)) + self.assertIsInstance(event, CriticalStrikeEvent) + self.assertEqual(area, event.area) + self.assertIsNone(event.is_empty()) + def test_strike(self): start_outer_armor = 11 start_area_armor = 5 @@ -81,3 +94,40 @@ class TestMechAmor(AbstractTestMechAmor): self.assertNotEqual(area, event.zone) self.assertEqual(area.parent, event.zone) self.assertEqual(0, event.hits) + + def test_critical_strike(self): + parent = Area() + area = Area() + area.parent = parent + cockpit = Cockpit() + area.cockpit = cockpit + area.items = { + (1, 1): Sustainment(), + (1, 2): Sensors(), + (1, 3): cockpit, + (1, 4): None, + (1, 5): cockpit, + (1, 6): Sustainment(), + } + + zone = OuterAmor(area) + + event = CriticalStrikeEvent(zone, (1, 2)).process_event() + self.assertEqual(AreaStatus.DAMAGED, zone.state) + self.assertEqual(AreaStatus.DAMAGED, area.state) + self.assertIsInstance(event, CriticalStrikeEvent) + self.assertFalse(event.is_empty()) + self.assertEqual(area, event.area) + self.assertEqual(ItemStatus.DESTROYED, area.items[(1, 2)].state) + + event = CriticalStrikeEvent(zone, (1, 3)).process_event() + self.assertIsInstance(event, CriticalStrikeEvent) + self.assertFalse(event.is_empty()) + self.assertEqual(area, event.area) + self.assertEqual(ItemStatus.DESTROYED, area.items[(1, 3)].state) + self.assertEqual(ItemStatus.DESTROYED, area.items[(1, 5)].state) + + event = CriticalStrikeEvent(zone, (1, 4)).process_event() + self.assertIsInstance(event, CriticalStrikeEvent) + self.assertTrue(event.is_empty()) + self.assertEqual(area, event.area) -- 2.54.0 From 0c985589a27c2bf4d4e954a01d8786396d0888f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20L=C3=BCcke?= Date: Wed, 8 Jul 2026 13:39:34 +0200 Subject: [PATCH 02/10] feature: verarbeite kritische Treffer --- Hangar/mech.py | 8 +++++++- MechFabrik/bauteile/__init__.py | 30 ++++++++++++++++++++++++++---- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/Hangar/mech.py b/Hangar/mech.py index ccab62f..53b86d5 100644 --- a/Hangar/mech.py +++ b/Hangar/mech.py @@ -1,4 +1,4 @@ -from MechFabrik.bauteile import InnerStructure, Item, StrikeEvent, ZoneNames +from MechFabrik.bauteile import CriticalStrikeEvent, InnerStructure, Item, StrikeEvent, ZoneNames class Mech(object): @@ -33,3 +33,9 @@ class Mech(object): if zone is None: raise Exception(f"Zone {zone_name} not found") return StrikeEvent(zone, hits) + + def critical_strike(self, zone_name: ZoneNames, index: tuple[int, int]) -> CriticalStrikeEvent: + zone = self._inner_structure.zones.get(zone_name) + if zone is None: + raise Exception(f"Zone {zone_name} not found") + return CriticalStrikeEvent(zone, index) \ No newline at end of file diff --git a/MechFabrik/bauteile/__init__.py b/MechFabrik/bauteile/__init__.py index da0f8ec..aaf18e0 100755 --- a/MechFabrik/bauteile/__init__.py +++ b/MechFabrik/bauteile/__init__.py @@ -1,6 +1,6 @@ import enum -from MechFabrik.bauteile.items import Item +from MechFabrik.bauteile.items import Item, ItemStatus class ZoneNames(enum.Enum): @@ -131,12 +131,34 @@ class InnerStructure: self._areas[index] = area @property - def zones(self) -> dict[ZoneNames, Zone]: + def zones(self) -> dict[ZoneNames, OuterAmor]: return self._zones - def add_zone(self, index: ZoneNames, zone: Zone): + def add_zone(self, index: ZoneNames, zone: OuterAmor): self._zones[index] = zone class CriticalStrikeEvent: - pass \ No newline at end of file + 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'] -- 2.54.0 From d8df5db7f443233b51e26dffe555358e0b77f6b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20L=C3=BCcke?= Date: Thu, 9 Jul 2026 17:11:09 +0200 Subject: [PATCH 03/10] =?UTF-8?q?tests:=20verarbeite=20kritische=20Treffer?= =?UTF-8?q?=20auch=20bei=20gro=C3=9Fen=20Bauteilen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MechFabrik/__init__.py | 4 +-- MechFabrik/bauteile/__init__.py | 9 ------- MechFabrik/bauteile/items.py | 26 ++++++++++++++----- tests/test_mech_bau.py | 4 +-- tests/test_mech_process.py | 46 ++++++++++++++++++++++++--------- 5 files changed, 57 insertions(+), 32 deletions(-) diff --git a/MechFabrik/__init__.py b/MechFabrik/__init__.py index 6d43725..97c0717 100755 --- a/MechFabrik/__init__.py +++ b/MechFabrik/__init__.py @@ -1,6 +1,6 @@ from Hangar.mech import Mech -from MechFabrik.bauteile import InnerStructure, Gyroskope, Area, AreaNames, OuterAmor, ZoneNames -from MechFabrik.bauteile.items import Activator, Cockpit, Joint, Reaktor, Sensors, Sustainment +from MechFabrik.bauteile import InnerStructure, Area, AreaNames, OuterAmor, ZoneNames +from MechFabrik.bauteile.items import Activator, Cockpit, Gyroskope, Joint, Reaktor, Sensors, Sustainment from MechFabrik.reader import ComponentReader diff --git a/MechFabrik/bauteile/__init__.py b/MechFabrik/bauteile/__init__.py index aaf18e0..e2ac656 100755 --- a/MechFabrik/bauteile/__init__.py +++ b/MechFabrik/bauteile/__init__.py @@ -98,15 +98,6 @@ class StrikeEvent: 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): diff --git a/MechFabrik/bauteile/items.py b/MechFabrik/bauteile/items.py index 92e1139..f590522 100644 --- a/MechFabrik/bauteile/items.py +++ b/MechFabrik/bauteile/items.py @@ -18,7 +18,7 @@ class ItemStatus(enum.Flag): class Item(object): - def __init__(self, item_type: ItemTypes): + def __init__(self, item_type: ItemTypes, **another: dict): self._type = item_type self._state = ItemStatus.FINE @@ -37,8 +37,8 @@ class Item(object): class BigItem(Item): - def __init__(self, item_type: ItemTypes, tonnage: float): - super().__init__(item_type) + def __init__(self, item_type: ItemTypes, tonnage: float, **another: dict): + super().__init__(item_type, **another) self._tonnage = tonnage @property @@ -46,15 +46,27 @@ class BigItem(Item): return self._tonnage +class DurableItem(Item): + + def __init__(self, item_type: ItemTypes, max_strike: int, **another): + super().__init__(item_type) + self._max_strike = max_strike + + +class Gyroskope(BigItem, DurableItem): + def __init__(self, tonnage: float): + super().__init__(item_type = ItemTypes.GYROSKOPE, tonnage=tonnage, max_strike=2) + + class Cockpit(BigItem): def __init__(self): super().__init__(ItemTypes.COCKPIT, 3.0) -class Reaktor(BigItem): +class Reaktor(BigItem, DurableItem): def __init__(self, value: int, tonnage: float): - super().__init__(ItemTypes.REAKTOR, tonnage) + super().__init__(item_type = ItemTypes.REAKTOR, tonnage=tonnage, max_strike=3) self._value = value @property @@ -72,9 +84,9 @@ class Joint(Item): super().__init__(ItemTypes.JOINT) -class Sensors(Item): +class Sensors(DurableItem): def __init__(self): - super().__init__(ItemTypes.SENSORS) + super().__init__(ItemTypes.SENSORS, 2) class Sustainment(Item): diff --git a/tests/test_mech_bau.py b/tests/test_mech_bau.py index a202bda..6faff79 100755 --- a/tests/test_mech_bau.py +++ b/tests/test_mech_bau.py @@ -2,8 +2,8 @@ import unittest from Hangar.mech import Mech from MechFabrik import MechFabrik -from MechFabrik.bauteile import Gyroskope, InnerStructure, AreaNames, Area, OuterAmor, Zone, ZoneNames -from MechFabrik.bauteile.items import Cockpit, Item, ItemTypes, Reaktor +from MechFabrik.bauteile import InnerStructure, AreaNames, Area, OuterAmor, Zone, ZoneNames +from MechFabrik.bauteile.items import Cockpit, Gyroskope, Item, ItemTypes, Reaktor from test_mech import AbstractTestMechAmor, INNER_ARMOR, OUTER_ARMOR diff --git a/tests/test_mech_process.py b/tests/test_mech_process.py index 5e28d36..e6a360a 100755 --- a/tests/test_mech_process.py +++ b/tests/test_mech_process.py @@ -1,5 +1,4 @@ -from MechFabrik import Cockpit, Sensors, Sustainment -from MechFabrik.bauteile.items import ItemStatus +from MechFabrik.bauteile.items import BigItem, DurableItem, Item, ItemStatus, ItemTypes from test_mech import AbstractTestMechAmor, INNER_ARMOR, NEXT_OUTER_ZONE, OUTER_ARMOR from MechFabrik.bauteile import Area, AreaStatus, OuterAmor, StrikeEvent, CriticalStrikeEvent, ZoneNames @@ -99,32 +98,55 @@ class TestMechAmor(AbstractTestMechAmor): parent = Area() area = Area() area.parent = parent - cockpit = Cockpit() - area.cockpit = cockpit + big_item_01 = BigItem(ItemTypes.SUSTAINMENT, 5.0) + item_01 = Item(ItemTypes.SUSTAINMENT) + durable_item_01 = DurableItem(ItemTypes.SUSTAINMENT, 3) area.items = { - (1, 1): Sustainment(), - (1, 2): Sensors(), - (1, 3): cockpit, + (1, 1): big_item_01, + (1, 2): durable_item_01, + (1, 3): durable_item_01, (1, 4): None, - (1, 5): cockpit, - (1, 6): Sustainment(), + (1, 5): item_01, + (1, 6): None, } zone = OuterAmor(area) - event = CriticalStrikeEvent(zone, (1, 2)).process_event() + event = CriticalStrikeEvent(zone, (1, 1)).process_event() self.assertEqual(AreaStatus.DAMAGED, zone.state) self.assertEqual(AreaStatus.DAMAGED, area.state) self.assertIsInstance(event, CriticalStrikeEvent) self.assertFalse(event.is_empty()) self.assertEqual(area, event.area) - self.assertEqual(ItemStatus.DESTROYED, area.items[(1, 2)].state) + self.assertEqual(ItemStatus.DESTROYED, area.items[(1, 1)].state) + + event = CriticalStrikeEvent(zone, (1, 5)).process_event() + self.assertEqual(AreaStatus.DAMAGED, zone.state) + self.assertEqual(AreaStatus.DAMAGED, area.state) + self.assertIsInstance(event, CriticalStrikeEvent) + self.assertFalse(event.is_empty()) + self.assertEqual(area, event.area) + self.assertEqual(ItemStatus.DESTROYED, area.items[(1, 5)].state) + + event = CriticalStrikeEvent(zone, (1, 2)).process_event() + self.assertIsInstance(event, CriticalStrikeEvent) + self.assertFalse(event.is_empty()) + self.assertEqual(area, event.area) + self.assertEqual(ItemStatus.DAMAGED, area.items[(1, 2)].state) + self.assertEqual(ItemStatus.DAMAGED, area.items[(1, 3)].state) event = CriticalStrikeEvent(zone, (1, 3)).process_event() self.assertIsInstance(event, CriticalStrikeEvent) self.assertFalse(event.is_empty()) self.assertEqual(area, event.area) - self.assertEqual(ItemStatus.DESTROYED, area.items[(1, 3)].state) + self.assertEqual(ItemStatus.DAMAGED, area.items[(1, 2)].state) + self.assertEqual(ItemStatus.DAMAGED, area.items[(1, 3)].state) + + event = CriticalStrikeEvent(zone, (1, 2)).process_event() + self.assertIsInstance(event, CriticalStrikeEvent) + self.assertFalse(event.is_empty()) + self.assertEqual(area, event.area) + self.assertEqual(ItemStatus.DESTROYED, area.items[(1, 2)].state) self.assertEqual(ItemStatus.DESTROYED, area.items[(1, 5)].state) event = CriticalStrikeEvent(zone, (1, 4)).process_event() -- 2.54.0 From 22fbdaa82f9c0fdfe249bc85b36bd8f2c5a99de6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20L=C3=BCcke?= Date: Thu, 9 Jul 2026 23:57:03 +0200 Subject: [PATCH 04/10] =?UTF-8?q?feature:=20verarbeite=20kritische=20Treff?= =?UTF-8?q?er=20auch=20bei=20gro=C3=9Fen=20Bauteilen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MechFabrik/bauteile/__init__.py | 6 +++--- MechFabrik/bauteile/items.py | 11 +++++++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/MechFabrik/bauteile/__init__.py b/MechFabrik/bauteile/__init__.py index e2ac656..2336632 100755 --- a/MechFabrik/bauteile/__init__.py +++ b/MechFabrik/bauteile/__init__.py @@ -1,6 +1,6 @@ import enum -from MechFabrik.bauteile.items import Item, ItemStatus +from MechFabrik.bauteile.items import Gyroskope, Item, ItemStatus class ZoneNames(enum.Enum): @@ -144,11 +144,11 @@ class 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: + if item is None or item.state == ItemStatus.DESTROYED: self.__dict__['_item_is_empty'] = True else: self.__dict__['_item_is_empty'] = False - item.state = ItemStatus.DESTROYED + item.process_strike() return self def is_empty(self): diff --git a/MechFabrik/bauteile/items.py b/MechFabrik/bauteile/items.py index f590522..9313704 100644 --- a/MechFabrik/bauteile/items.py +++ b/MechFabrik/bauteile/items.py @@ -34,6 +34,9 @@ class Item(object): def state(self, new_state: ItemStatus): self._state = new_state + def process_strike(self): + self._state = ItemStatus.DESTROYED + class BigItem(Item): @@ -52,6 +55,14 @@ class DurableItem(Item): super().__init__(item_type) self._max_strike = max_strike + @property + def max_strike(self): + return self._max_strike + + def process_strike(self): + self._max_strike -= 1 + self._state = ItemStatus.DAMAGED if self._max_strike > 0 else ItemStatus.DESTROYED + class Gyroskope(BigItem, DurableItem): def __init__(self, tonnage: float): -- 2.54.0 From d4002624f48f3537122cc2c6d26dcf4140c56217 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20L=C3=BCcke?= Date: Fri, 10 Jul 2026 00:13:54 +0200 Subject: [PATCH 05/10] refactor: sammele die Events in eine eigene Datei --- events/__init__.py | 60 +++++++++++++++++++ {Hangar => hangar}/__init__.py | 0 {Hangar => hangar}/mech.py | 1 + .../components}/__init__.py | 59 ------------------ tests/test_mech_process.py | 1 + 5 files changed, 62 insertions(+), 59 deletions(-) create mode 100644 events/__init__.py rename {Hangar => hangar}/__init__.py (100%) rename {Hangar => hangar}/mech.py (96%) rename {MechFabrik/bauteile => mech_factory/components}/__init__.py (56%) diff --git a/events/__init__.py b/events/__init__.py new file mode 100644 index 0000000..c6d7081 --- /dev/null +++ b/events/__init__.py @@ -0,0 +1,60 @@ +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'] diff --git a/Hangar/__init__.py b/hangar/__init__.py similarity index 100% rename from Hangar/__init__.py rename to hangar/__init__.py diff --git a/Hangar/mech.py b/hangar/mech.py similarity index 96% rename from Hangar/mech.py rename to hangar/mech.py index 53b86d5..ac56b6d 100644 --- a/Hangar/mech.py +++ b/hangar/mech.py @@ -1,4 +1,5 @@ from MechFabrik.bauteile import CriticalStrikeEvent, InnerStructure, Item, StrikeEvent, ZoneNames +from events import CriticalStrikeEvent, StrikeEvent class Mech(object): diff --git a/MechFabrik/bauteile/__init__.py b/mech_factory/components/__init__.py similarity index 56% rename from MechFabrik/bauteile/__init__.py rename to mech_factory/components/__init__.py index 2336632..a51cfce 100755 --- a/MechFabrik/bauteile/__init__.py +++ b/mech_factory/components/__init__.py @@ -65,39 +65,6 @@ class OuterAmor(Zone): 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): @@ -127,29 +94,3 @@ class InnerStructure: 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 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'] diff --git a/tests/test_mech_process.py b/tests/test_mech_process.py index e6a360a..b1a9437 100755 --- a/tests/test_mech_process.py +++ b/tests/test_mech_process.py @@ -1,4 +1,5 @@ from MechFabrik.bauteile.items import BigItem, DurableItem, Item, ItemStatus, ItemTypes +from events import CriticalStrikeEvent, StrikeEvent from test_mech import AbstractTestMechAmor, INNER_ARMOR, NEXT_OUTER_ZONE, OUTER_ARMOR from MechFabrik.bauteile import Area, AreaStatus, OuterAmor, StrikeEvent, CriticalStrikeEvent, ZoneNames -- 2.54.0 From 84236eb324775341ba9d04becf0b05ce87292856 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20L=C3=BCcke?= Date: Fri, 10 Jul 2026 00:15:28 +0200 Subject: [PATCH 06/10] refactor: beachte, dass in Python Namen von Ordnern und Dateien immer klein geschieben werden Auch vermeide Denglisch --- hangar/mech.py | 2 +- {MechFabrik => mech_factory}/Uml/Mech.puml | 0 {MechFabrik => mech_factory}/Uml/MechStructure.puml | 0 {MechFabrik => mech_factory}/Uml/StrikeProcess.puml | 0 .../Uml/StrikeProcessSequence.puml | 0 {MechFabrik => mech_factory}/__init__.py | 8 ++++---- mech_factory/components/__init__.py | 2 +- {MechFabrik/bauteile => mech_factory/components}/items.py | 0 {MechFabrik => mech_factory}/reader.py | 2 +- {MechFabrik => mech_factory}/tabellen/bauteile.csv | 0 {MechFabrik => mech_factory}/tabellen/reaktoren.csv | 0 {MechFabrik => mech_factory}/tabellen/waffen.csv | 0 tests/test_mech/__init__.py | 4 ++-- tests/test_mech_bau.py | 8 ++++---- tests/test_mech_process.py | 5 +++-- 15 files changed, 16 insertions(+), 15 deletions(-) rename {MechFabrik => mech_factory}/Uml/Mech.puml (100%) rename {MechFabrik => mech_factory}/Uml/MechStructure.puml (100%) rename {MechFabrik => mech_factory}/Uml/StrikeProcess.puml (100%) rename {MechFabrik => mech_factory}/Uml/StrikeProcessSequence.puml (100%) rename {MechFabrik => mech_factory}/__init__.py (96%) rename {MechFabrik/bauteile => mech_factory/components}/items.py (100%) rename {MechFabrik => mech_factory}/reader.py (98%) rename {MechFabrik => mech_factory}/tabellen/bauteile.csv (100%) rename {MechFabrik => mech_factory}/tabellen/reaktoren.csv (100%) rename {MechFabrik => mech_factory}/tabellen/waffen.csv (100%) diff --git a/hangar/mech.py b/hangar/mech.py index ac56b6d..b2843ee 100644 --- a/hangar/mech.py +++ b/hangar/mech.py @@ -1,5 +1,5 @@ -from MechFabrik.bauteile import CriticalStrikeEvent, InnerStructure, Item, StrikeEvent, ZoneNames from events import CriticalStrikeEvent, StrikeEvent +from mech_factory.components import InnerStructure, Item, ZoneNames class Mech(object): diff --git a/MechFabrik/Uml/Mech.puml b/mech_factory/Uml/Mech.puml similarity index 100% rename from MechFabrik/Uml/Mech.puml rename to mech_factory/Uml/Mech.puml diff --git a/MechFabrik/Uml/MechStructure.puml b/mech_factory/Uml/MechStructure.puml similarity index 100% rename from MechFabrik/Uml/MechStructure.puml rename to mech_factory/Uml/MechStructure.puml diff --git a/MechFabrik/Uml/StrikeProcess.puml b/mech_factory/Uml/StrikeProcess.puml similarity index 100% rename from MechFabrik/Uml/StrikeProcess.puml rename to mech_factory/Uml/StrikeProcess.puml diff --git a/MechFabrik/Uml/StrikeProcessSequence.puml b/mech_factory/Uml/StrikeProcessSequence.puml similarity index 100% rename from MechFabrik/Uml/StrikeProcessSequence.puml rename to mech_factory/Uml/StrikeProcessSequence.puml diff --git a/MechFabrik/__init__.py b/mech_factory/__init__.py similarity index 96% rename from MechFabrik/__init__.py rename to mech_factory/__init__.py index 97c0717..3a8e19e 100755 --- a/MechFabrik/__init__.py +++ b/mech_factory/__init__.py @@ -1,7 +1,7 @@ -from Hangar.mech import Mech -from MechFabrik.bauteile import InnerStructure, Area, AreaNames, OuterAmor, ZoneNames -from MechFabrik.bauteile.items import Activator, Cockpit, Gyroskope, Joint, Reaktor, Sensors, Sustainment -from MechFabrik.reader import ComponentReader +from hangar.mech import Mech +from mech_factory.components import InnerStructure, Area, AreaNames, OuterAmor, ZoneNames +from mech_factory.components.items import Activator, Cockpit, Gyroskope, Joint, Reaktor, Sensors, Sustainment +from mech_factory.reader import ComponentReader class MechFabrik(object): diff --git a/mech_factory/components/__init__.py b/mech_factory/components/__init__.py index a51cfce..a6683b8 100755 --- a/mech_factory/components/__init__.py +++ b/mech_factory/components/__init__.py @@ -1,6 +1,6 @@ import enum -from MechFabrik.bauteile.items import Gyroskope, Item, ItemStatus +from mech_factory.components.items import Gyroskope, Item, ItemStatus class ZoneNames(enum.Enum): diff --git a/MechFabrik/bauteile/items.py b/mech_factory/components/items.py similarity index 100% rename from MechFabrik/bauteile/items.py rename to mech_factory/components/items.py diff --git a/MechFabrik/reader.py b/mech_factory/reader.py similarity index 98% rename from MechFabrik/reader.py rename to mech_factory/reader.py index 46f7f60..a2c79fa 100755 --- a/MechFabrik/reader.py +++ b/mech_factory/reader.py @@ -1,7 +1,7 @@ import csv import os.path -from MechFabrik import AreaNames +from mech_factory import AreaNames # noinspection SpellCheckingInspection diff --git a/MechFabrik/tabellen/bauteile.csv b/mech_factory/tabellen/bauteile.csv similarity index 100% rename from MechFabrik/tabellen/bauteile.csv rename to mech_factory/tabellen/bauteile.csv diff --git a/MechFabrik/tabellen/reaktoren.csv b/mech_factory/tabellen/reaktoren.csv similarity index 100% rename from MechFabrik/tabellen/reaktoren.csv rename to mech_factory/tabellen/reaktoren.csv diff --git a/MechFabrik/tabellen/waffen.csv b/mech_factory/tabellen/waffen.csv similarity index 100% rename from MechFabrik/tabellen/waffen.csv rename to mech_factory/tabellen/waffen.csv diff --git a/tests/test_mech/__init__.py b/tests/test_mech/__init__.py index 9072332..c689273 100644 --- a/tests/test_mech/__init__.py +++ b/tests/test_mech/__init__.py @@ -1,7 +1,7 @@ import unittest -from MechFabrik import MechFabrik -from MechFabrik.bauteile import AreaNames, ZoneNames +from mech_factory import MechFabrik +from mech_factory.components import AreaNames, ZoneNames INNER_ARMOR = { AreaNames.HEAD: 3, diff --git a/tests/test_mech_bau.py b/tests/test_mech_bau.py index 6faff79..b985a0d 100755 --- a/tests/test_mech_bau.py +++ b/tests/test_mech_bau.py @@ -1,9 +1,9 @@ import unittest -from Hangar.mech import Mech -from MechFabrik import MechFabrik -from MechFabrik.bauteile import InnerStructure, AreaNames, Area, OuterAmor, Zone, ZoneNames -from MechFabrik.bauteile.items import Cockpit, Gyroskope, Item, ItemTypes, Reaktor +from hangar.mech import Mech +from mech_factory import MechFabrik +from mech_factory.components import InnerStructure, AreaNames, Area, OuterAmor, Zone, ZoneNames +from mech_factory.components.items import Cockpit, Gyroskope, Item, ItemTypes, Reaktor from test_mech import AbstractTestMechAmor, INNER_ARMOR, OUTER_ARMOR diff --git a/tests/test_mech_process.py b/tests/test_mech_process.py index b1a9437..669a554 100755 --- a/tests/test_mech_process.py +++ b/tests/test_mech_process.py @@ -1,7 +1,7 @@ -from MechFabrik.bauteile.items import BigItem, DurableItem, Item, ItemStatus, ItemTypes from events import CriticalStrikeEvent, StrikeEvent +from mech_factory.components.items import BigItem, DurableItem, Item, ItemStatus, ItemTypes from test_mech import AbstractTestMechAmor, INNER_ARMOR, NEXT_OUTER_ZONE, OUTER_ARMOR -from MechFabrik.bauteile import Area, AreaStatus, OuterAmor, StrikeEvent, CriticalStrikeEvent, ZoneNames +from mech_factory.components import Area, AreaStatus, OuterAmor, ZoneNames class TestMechAmor(AbstractTestMechAmor): @@ -95,6 +95,7 @@ class TestMechAmor(AbstractTestMechAmor): self.assertEqual(area.parent, event.zone) self.assertEqual(0, event.hits) + # noinspection PyUnresolvedReferences def test_critical_strike(self): parent = Area() area = Area() -- 2.54.0 From dbbd772c6903f299a944c14c6d32725c74d163ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20L=C3=BCcke?= Date: Fri, 10 Jul 2026 00:29:15 +0200 Subject: [PATCH 07/10] refactor: spezifiziere das Bauteile-Lager --- events/__init__.py | 2 +- hangar/mech.py | 2 +- mech_factory/__init__.py | 4 ++-- mech_factory/{components => component_storage}/__init__.py | 2 +- mech_factory/{components => component_storage}/items.py | 0 tests/test_mech/__init__.py | 2 +- tests/test_mech_bau.py | 4 ++-- tests/test_mech_process.py | 4 ++-- 8 files changed, 10 insertions(+), 10 deletions(-) rename mech_factory/{components => component_storage}/__init__.py (96%) rename mech_factory/{components => component_storage}/items.py (100%) diff --git a/events/__init__.py b/events/__init__.py index c6d7081..ffd5749 100644 --- a/events/__init__.py +++ b/events/__init__.py @@ -1,4 +1,4 @@ -from mech_factory.components import Area, AreaStatus, ItemStatus, OuterAmor, Zone +from mech_factory.component_storage import Area, AreaStatus, ItemStatus, OuterAmor, Zone class StrikeEvent: diff --git a/hangar/mech.py b/hangar/mech.py index b2843ee..f9c6e8e 100644 --- a/hangar/mech.py +++ b/hangar/mech.py @@ -1,5 +1,5 @@ from events import CriticalStrikeEvent, StrikeEvent -from mech_factory.components import InnerStructure, Item, ZoneNames +from mech_factory.component_storage import InnerStructure, Item, ZoneNames class Mech(object): diff --git a/mech_factory/__init__.py b/mech_factory/__init__.py index 3a8e19e..dead883 100755 --- a/mech_factory/__init__.py +++ b/mech_factory/__init__.py @@ -1,6 +1,6 @@ from hangar.mech import Mech -from mech_factory.components import InnerStructure, Area, AreaNames, OuterAmor, ZoneNames -from mech_factory.components.items import Activator, Cockpit, Gyroskope, Joint, Reaktor, Sensors, Sustainment +from mech_factory.component_storage import InnerStructure, Area, AreaNames, OuterAmor, ZoneNames +from mech_factory.component_storage.items import Activator, Cockpit, Gyroskope, Joint, Reaktor, Sensors, Sustainment from mech_factory.reader import ComponentReader diff --git a/mech_factory/components/__init__.py b/mech_factory/component_storage/__init__.py similarity index 96% rename from mech_factory/components/__init__.py rename to mech_factory/component_storage/__init__.py index a6683b8..1b214fd 100755 --- a/mech_factory/components/__init__.py +++ b/mech_factory/component_storage/__init__.py @@ -1,6 +1,6 @@ import enum -from mech_factory.components.items import Gyroskope, Item, ItemStatus +from mech_factory.component_storage.items import Gyroskope, Item, ItemStatus class ZoneNames(enum.Enum): diff --git a/mech_factory/components/items.py b/mech_factory/component_storage/items.py similarity index 100% rename from mech_factory/components/items.py rename to mech_factory/component_storage/items.py diff --git a/tests/test_mech/__init__.py b/tests/test_mech/__init__.py index c689273..5e89f07 100644 --- a/tests/test_mech/__init__.py +++ b/tests/test_mech/__init__.py @@ -1,7 +1,7 @@ import unittest from mech_factory import MechFabrik -from mech_factory.components import AreaNames, ZoneNames +from mech_factory.component_storage import AreaNames, ZoneNames INNER_ARMOR = { AreaNames.HEAD: 3, diff --git a/tests/test_mech_bau.py b/tests/test_mech_bau.py index b985a0d..e1fe1d5 100755 --- a/tests/test_mech_bau.py +++ b/tests/test_mech_bau.py @@ -2,8 +2,8 @@ import unittest from hangar.mech import Mech from mech_factory import MechFabrik -from mech_factory.components import InnerStructure, AreaNames, Area, OuterAmor, Zone, ZoneNames -from mech_factory.components.items import Cockpit, Gyroskope, Item, ItemTypes, Reaktor +from mech_factory.component_storage import InnerStructure, AreaNames, Area, OuterAmor, Zone, ZoneNames +from mech_factory.component_storage.items import Cockpit, Gyroskope, Item, ItemTypes, Reaktor from test_mech import AbstractTestMechAmor, INNER_ARMOR, OUTER_ARMOR diff --git a/tests/test_mech_process.py b/tests/test_mech_process.py index 669a554..92a61a1 100755 --- a/tests/test_mech_process.py +++ b/tests/test_mech_process.py @@ -1,7 +1,7 @@ from events import CriticalStrikeEvent, StrikeEvent -from mech_factory.components.items import BigItem, DurableItem, Item, ItemStatus, ItemTypes +from mech_factory.component_storage.items import BigItem, DurableItem, Item, ItemStatus, ItemTypes from test_mech import AbstractTestMechAmor, INNER_ARMOR, NEXT_OUTER_ZONE, OUTER_ARMOR -from mech_factory.components import Area, AreaStatus, OuterAmor, ZoneNames +from mech_factory.component_storage import Area, AreaStatus, OuterAmor, ZoneNames class TestMechAmor(AbstractTestMechAmor): -- 2.54.0 From e4ed45e2fb9c95e49408bec7db4321a1d7cd26f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20L=C3=BCcke?= Date: Fri, 10 Jul 2026 16:50:50 +0200 Subject: [PATCH 08/10] tests: zentralisiere die Bauteile-Ausgabe --- tests/test_store.py | 101 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 tests/test_store.py diff --git a/tests/test_store.py b/tests/test_store.py new file mode 100644 index 0000000..f725b8d --- /dev/null +++ b/tests/test_store.py @@ -0,0 +1,101 @@ +import unittest + +from mech_factory import InnerStructure, Reaktor +from mech_factory.store import ComponentStore, ItemStore, InnerArmorStore +from mech_factory.component_storage.items import Gyroskope, Item, BigItem, DurableItem, ItemStatus, ItemTypes + + +class TestComponentStore(unittest.TestCase): + def setUp(self): + # reactor_value = 165 + self._store = ComponentStore(tonnage=55.0, movement_rate=3) + + def test_build_inner_structure(self): + item = self._store.get_inner_structure() + + self.assertIsInstance(item, InnerStructure) + self.assertIsInstance(item.gyroskope, Gyroskope) + self.assertEqual(item.tonnage, 5.5) + self.assertIsInstance(item.areas, dict) + self.assertCountEqual(item.areas, {}) + self.assertIsInstance(item.zones, dict) + self.assertCountEqual(item.zones, {}) + + def test_build_gyroscope(self): + item = self._store.get_gyroskope() + + self.assertIsInstance(item, Item) + self.assertEqual(item.state, ItemStatus.FINE) + self.assertIsInstance(item, BigItem) + self.assertEqual(item.tonnage, 2.0) + self.assertEqual(item.type, ItemTypes.GYROSKOPE) + self.assertIsInstance(item, DurableItem) + self.assertEqual(item.max_strike, 2) + + def test_build_reaktor(self): + item = self._store.get_reaktor() + + self.assertIsInstance(item, Reaktor) + self.assertIsInstance(item, Item) + self.assertEqual(item.state, ItemStatus.FINE) + self.assertIsInstance(item, BigItem) + self.assertEqual(item.tonnage, 6.0) + self.assertEqual(item.type, ItemTypes.REAKTOR) + self.assertIsInstance(item, DurableItem) + self.assertEqual(item.max_strike, 3) + +class TestItemsStore(unittest.TestCase): + + def setUp(self): + self._store = ItemStore() + + def test_build_cockpit(self): + item = self._store.get_cockpit() + + self.assertIsInstance(item, Item) + self.assertEqual(item.state, ItemStatus.FINE) + self.assertIsInstance(item, BigItem) + self.assertEqual(item.type, ItemTypes.COCKPIT) + self.assertEqual(item.tonnage, 3.0) + + def test_build_sustainment(self): + item = self._store.get_sustainment() + + self.assertIsInstance(item, Item) + self.assertEqual(item.state, ItemStatus.FINE) + self.assertEqual(item.type, ItemTypes.SUSTAINMENT) + + def test_build_sensors(self): + item = self._store.get_sensors() + + self.assertIsInstance(item, Item) + self.assertEqual(item.state, ItemStatus.FINE) + self.assertEqual(item.type, ItemTypes.SENSORS) + self.assertIsInstance(item, DurableItem) + self.assertEqual(item.max_strike, 2) + + def test_build_joint(self): + item = self._store.get_joint() + + self.assertIsInstance(item, Item) + self.assertEqual(item.state, ItemStatus.FINE) + self.assertEqual(item.type, ItemTypes.JOINT) + + def test_build_activator(self): + item = self._store.get_activator() + + self.assertIsInstance(item, Item) + self.assertEqual(item.state, ItemStatus.FINE) + self.assertEqual(item.type, ItemTypes.ACTIVATOR) + +class TestInnerAmorForTonnageAndArea(unittest.TestCase): + def setUp(self): + self._store = InnerArmorStore(tonnage=55.0) + + def test_build_inner_structure(self): + self.assertEqual(self._store.get_head_amor(), 3) + self.assertEqual(self._store.get_middle_torso_amor(), 18) + self.assertEqual(self._store.get_side_torso_amor(), 13) + self.assertEqual(self._store.get_arm_amore(), 9) + self.assertEqual(self._store.get_leg_amore(), 13) + -- 2.54.0 From af2d9430942567c970b8a961176d0ffec4e59cff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20L=C3=BCcke?= Date: Fri, 10 Jul 2026 20:36:59 +0200 Subject: [PATCH 09/10] feature: zentralisiere die Bauteile-Ausgabe --- mech_factory/__init__.py | 62 +++++++++++++++++---------------------- mech_factory/reader.py | 28 +++++++----------- mech_factory/store.py | 63 ++++++++++++++++++++++++++++++++++++++++ tests/test_store.py | 4 +-- 4 files changed, 102 insertions(+), 55 deletions(-) create mode 100644 mech_factory/store.py diff --git a/mech_factory/__init__.py b/mech_factory/__init__.py index dead883..a5154fb 100755 --- a/mech_factory/__init__.py +++ b/mech_factory/__init__.py @@ -1,13 +1,12 @@ from hangar.mech import Mech from mech_factory.component_storage import InnerStructure, Area, AreaNames, OuterAmor, ZoneNames from mech_factory.component_storage.items import Activator, Cockpit, Gyroskope, Joint, Reaktor, Sensors, Sustainment -from mech_factory.reader import ComponentReader +from mech_factory.store import ItemStore, ComponentStore, InnerAmorStore class MechFabrik(object): def __init__(self, name: str, tonnage: float, movement_rate: int): - self.__components = ComponentReader() self.__tonnage = tonnage self.__reactor_value = int(movement_rate * tonnage) self.__areas = { @@ -33,26 +32,24 @@ class MechFabrik(object): ZoneNames.LEFT_LEG: OuterAmor(self.__areas[AreaNames.LEFT_LEG]), ZoneNames.RIGHT_LEG: OuterAmor(self.__areas[AreaNames.RIGHT_LEG]), } - self.__build_inner_structure(tonnage, movement_rate) + self._item_store = ItemStore() + self._component_store = ComponentStore(tonnage, movement_rate) + self._inner_amor_store = InnerAmorStore(tonnage) + self._inner_structure = self._component_store.get_inner_structure() + self.__build_head_area() + self.__build_middle_torso_area(self._inner_structure.gyroskope) self._mech = Mech(name, tonnage, movement_rate, self._inner_structure) - def __build_inner_structure(self, tonnage: float, movement_rate: int) -> None: - reactor_value = int(movement_rate * tonnage) - gyroscope = Gyroskope(float(round(reactor_value / 100))) - self._inner_structure = InnerStructure(self.__components.inner_structure_from(tonnage), gyroscope) - self.__build_head_area() - self.__build_middle_torso_area(gyroscope) - def __build_head_area(self) -> None: - cockpit = Cockpit() + cockpit = self._item_store.get_cockpit() self.__areas[AreaNames.HEAD].cockpit = cockpit self.__areas[AreaNames.HEAD].items = { - (1, 1): Sustainment(), - (1, 2): Sensors(), + (1, 1): self._item_store.get_sustainment(), + (1, 2): self._item_store.get_sensors(), (1, 3): cockpit, (1, 4): None, - (1, 5): Sensors(), - (1, 6): Sustainment(), + (1, 5): self._item_store.get_sensors(), + (1, 6): self._item_store.get_sustainment(), } self.__areas[AreaNames.HEAD].armor = 3 self.__areas[AreaNames.HEAD].parent = self.__areas[AreaNames.MIDDLE_TORSO] @@ -60,7 +57,7 @@ class MechFabrik(object): def __build_middle_torso_area(self, gyroscope: Gyroskope) -> None: self.__areas[AreaNames.LEFT_TORSO].parent = self.__areas[AreaNames.MIDDLE_TORSO] self.__areas[AreaNames.RIGHT_TORSO].parent = self.__areas[AreaNames.MIDDLE_TORSO] - reactor = Reaktor(self.__reactor_value, self.__components.reactor_tonnage_from(self.__reactor_value)) + reactor = self._component_store.get_reaktor() self.__areas[AreaNames.MIDDLE_TORSO].reactor = reactor self.__areas[AreaNames.MIDDLE_TORSO].children = [ self.__areas[AreaNames.RIGHT_TORSO], @@ -80,16 +77,9 @@ class MechFabrik(object): (2, 5): None, (2, 6): None, } - self.__areas[AreaNames.MIDDLE_TORSO].armor = self.__components.inner_amor_for_tonnage_and_area( - self.__tonnage, - AreaNames.MIDDLE_TORSO - ) - self.__areas[AreaNames.LEFT_TORSO].armor = self.__components.inner_amor_for_tonnage_and_area( - self.__tonnage, AreaNames.LEFT_TORSO) - self.__areas[AreaNames.RIGHT_TORSO].armor = self.__components.inner_amor_for_tonnage_and_area( - self.__tonnage, - AreaNames.RIGHT_TORSO - ) + self.__areas[AreaNames.MIDDLE_TORSO].armor = self._inner_amor_store.get_middle_torso_amor() + self.__areas[AreaNames.LEFT_TORSO].armor = self._inner_amor_store.get_side_torso_amor() + self.__areas[AreaNames.RIGHT_TORSO].armor = self._inner_amor_store.get_side_torso_amor() self.__build_arm(self.__areas[AreaNames.RIGHT_TORSO], AreaNames.RIGHT_ARM) self.__build_leg(self.__areas[AreaNames.RIGHT_TORSO], AreaNames.RIGHT_LEG) self.__build_arm(self.__areas[AreaNames.LEFT_TORSO], AreaNames.LEFT_ARM) @@ -98,10 +88,10 @@ class MechFabrik(object): def __build_arm(self, parent: Area, index: AreaNames): self.__areas[index].parent = parent self.__areas[index].items = { - (1, 1): Joint(), - (1, 2): Activator(), - (1, 3): Activator(), - (1, 4): Activator(), + (1, 1): self._item_store.get_joint(), + (1, 2): self._item_store.get_activator(), + (1, 3): self._item_store.get_activator(), + (1, 4): self._item_store.get_activator(), (1, 5): None, (1, 6): None, (2, 1): None, @@ -111,20 +101,20 @@ class MechFabrik(object): (2, 5): None, (2, 6): None, } - self.__areas[index].armor = self.__components.inner_amor_for_tonnage_and_area(self.__tonnage, index) + self.__areas[index].armor = self._inner_amor_store.get_arm_amore() parent.children.append(self.__areas[index]) def __build_leg(self, parent: Area, index: AreaNames): self.__areas[index].parent = parent self.__areas[index].items = { - (1, 1): Joint(), - (1, 2): Activator(), - (1, 3): Activator(), - (1, 4): Activator(), + (1, 1): self._item_store.get_joint(), + (1, 2): self._item_store.get_activator(), + (1, 3): self._item_store.get_activator(), + (1, 4): self._item_store.get_activator(), (1, 5): None, (1, 6): None, } - self.__areas[index].armor = self.__components.inner_amor_for_tonnage_and_area(self.__tonnage, index) + self.__areas[index].armor = self._inner_amor_store.get_leg_amore() parent.children.append(self.__areas[index]) def auslieferung(self) -> Mech: diff --git a/mech_factory/reader.py b/mech_factory/reader.py index a2c79fa..e8205cf 100755 --- a/mech_factory/reader.py +++ b/mech_factory/reader.py @@ -1,15 +1,13 @@ import csv import os.path -from mech_factory import AreaNames - # noinspection SpellCheckingInspection -class CsvDialect (csv.Dialect): - lineterminator='\r\n' +class CsvDialect(csv.Dialect): + lineterminator = '\r\n' delimiter = ',' quotechar = '"' - quoting=csv.QUOTE_NONNUMERIC + quoting = csv.QUOTE_NONNUMERIC class ComponentReader: @@ -38,15 +36,11 @@ class ComponentReader: def reactor_tonnage_from(self, reactor_value: int) -> float: return float(self._reactor_data.get(reactor_value, {}).get('Tonnage', 0.0)) - def inner_amor_for_tonnage_and_area(self, tonnage: float, area: AreaNames) -> int: - match area: - case AreaNames.HEAD: - return 3 - case AreaNames.MIDDLE_TORSO: - return int(self._inner_structure_data.get(tonnage, {}).get('TorsoMitte', 0)) - case AreaNames.RIGHT_TORSO | AreaNames.LEFT_TORSO: - return int(self._inner_structure_data.get(tonnage, {}).get('TorsoSeite', 0)) - case AreaNames.RIGHT_ARM | AreaNames.LEFT_ARM: - return int(self._inner_structure_data.get(tonnage, {}).get('Arm', 0)) - case AreaNames.RIGHT_LEG | AreaNames.LEFT_LEG: - return int(self._inner_structure_data.get(tonnage, {}).get('Bein', 0)) + def inner_amor_for_tonnage(self, tonnage: float) -> dict[str, int]: + return { + 'head': 3, + 'middle_torso': int(self._inner_structure_data.get(tonnage, {}).get('TorsoMitte', 0)), + 'side_torso': int(self._inner_structure_data.get(tonnage, {}).get('TorsoSeite', 0)), + 'arm': int(self._inner_structure_data.get(tonnage, {}).get('Arm', 0)), + 'leg': int(self._inner_structure_data.get(tonnage, {}).get('Bein', 0)), + } diff --git a/mech_factory/store.py b/mech_factory/store.py new file mode 100644 index 0000000..1de990e --- /dev/null +++ b/mech_factory/store.py @@ -0,0 +1,63 @@ +from mech_factory import InnerStructure, Joint, Sustainment +from mech_factory.component_storage.items import Activator, Cockpit, Gyroskope, Reaktor, Sensors +from mech_factory.reader import ComponentReader + + +class ComponentStore(object): + def __init__(self, tonnage: float, movement_rate: int): + self.__components_reader = ComponentReader() + self.__tonnage = tonnage + self.__reactor_value = int(movement_rate * tonnage) + + def get_reaktor(self) -> Reaktor: + return Reaktor(self.__reactor_value, self.__components_reader.reactor_tonnage_from(self.__reactor_value)) + + def get_gyroskope(self) -> Gyroskope: + return Gyroskope(float(round(self.__reactor_value / 100))) + + def get_inner_structure(self) -> InnerStructure: + gyroscope = self.get_gyroskope() + return InnerStructure(self.__components_reader.inner_structure_from(self.__tonnage), gyroscope) + + +# noinspection PyMethodMayBeStatic +class ItemStore(object): + + def __init__(self): + pass + + def get_cockpit(self) -> Cockpit: + return Cockpit() + + def get_sustainment(self) -> Sustainment: + return Sustainment() + + def get_sensors(self) -> Sensors: + return Sensors() + + def get_joint(self) -> Joint: + return Joint() + + def get_activator(self) -> Activator: + return Activator() + + +class InnerAmorStore: + + def __init__(self, tonnage: float): + self.__inner_structure_data = ComponentReader().inner_amor_for_tonnage(tonnage) + + def get_head_amor(self) -> int: + return self.__inner_structure_data['head'] + + def get_middle_torso_amor(self) -> int: + return self.__inner_structure_data['middle_torso'] + + def get_side_torso_amor(self) -> int: + return self.__inner_structure_data['side_torso'] + + def get_arm_amore(self) -> int: + return self.__inner_structure_data['arm'] + + def get_leg_amore(self) -> int: + return self.__inner_structure_data['leg'] diff --git a/tests/test_store.py b/tests/test_store.py index f725b8d..04315bd 100644 --- a/tests/test_store.py +++ b/tests/test_store.py @@ -1,7 +1,7 @@ import unittest from mech_factory import InnerStructure, Reaktor -from mech_factory.store import ComponentStore, ItemStore, InnerArmorStore +from mech_factory.store import ComponentStore, ItemStore, InnerAmorStore from mech_factory.component_storage.items import Gyroskope, Item, BigItem, DurableItem, ItemStatus, ItemTypes @@ -90,7 +90,7 @@ class TestItemsStore(unittest.TestCase): class TestInnerAmorForTonnageAndArea(unittest.TestCase): def setUp(self): - self._store = InnerArmorStore(tonnage=55.0) + self._store = InnerAmorStore(tonnage=55.0) def test_build_inner_structure(self): self.assertEqual(self._store.get_head_amor(), 3) -- 2.54.0 From 36779ac71553078c800992a59498b3a487319d47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20L=C3=BCcke?= Date: Sun, 12 Jul 2026 17:34:55 +0200 Subject: [PATCH 10/10] docu: dokumentiere die Bauteile --- mech_factory/store.py | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/mech_factory/store.py b/mech_factory/store.py index 1de990e..17ebb74 100644 --- a/mech_factory/store.py +++ b/mech_factory/store.py @@ -8,13 +8,19 @@ class ComponentStore(object): self.__components_reader = ComponentReader() self.__tonnage = tonnage self.__reactor_value = int(movement_rate * tonnage) - + ''' + Erstellt den erforderlichen Reaktor + ''' def get_reaktor(self) -> Reaktor: return Reaktor(self.__reactor_value, self.__components_reader.reactor_tonnage_from(self.__reactor_value)) - + ''' + Erstellt den Bewegungs-Aparat + ''' def get_gyroskope(self) -> Gyroskope: return Gyroskope(float(round(self.__reactor_value / 100))) - + ''' + Erstellt die innere Struktur + ''' def get_inner_structure(self) -> InnerStructure: gyroscope = self.get_gyroskope() return InnerStructure(self.__components_reader.inner_structure_from(self.__tonnage), gyroscope) @@ -25,19 +31,41 @@ class ItemStore(object): def __init__(self): pass - + ''' + Erstellt das Cockpit + ''' def get_cockpit(self) -> Cockpit: return Cockpit() + ''' + Erstellt die Lebenserhaltung + ''' def get_sustainment(self) -> Sustainment: return Sustainment() + ''' + Erstellt die Sensoren + ''' def get_sensors(self) -> Sensors: return Sensors() + ''' + Erstellt die Gelenke + * Hüftgelenk + * Schultergelenk + ''' def get_joint(self) -> Joint: return Joint() + ''' + Erstellt die Aktivatoren + * Oberschenkel-Aktivator + * Unterschenkel-Aktivator + * Fuß-Aktivator + * Oberarm-Aktivator + * Unterarm-Aktivator + * Hand-Aktivator + ''' def get_activator(self) -> Activator: return Activator() -- 2.54.0