From 68bc3a5171c1b0e22daf54c705d12435836c0a7d Mon Sep 17 00:00:00 2001 From: Mateusz Grzonka Date: Sat, 21 Jan 2023 14:17:28 +0100 Subject: [PATCH 1/2] Add stats manager --- src/objects/{ => agent}/agent.py | 17 ++++++++++++----- src/objects/agent/stats_manager.py | 14 ++++++++++++++ src/scene.py | 2 +- 3 files changed, 27 insertions(+), 6 deletions(-) rename src/objects/{ => agent}/agent.py (86%) create mode 100644 src/objects/agent/stats_manager.py diff --git a/src/objects/agent.py b/src/objects/agent/agent.py similarity index 86% rename from src/objects/agent.py rename to src/objects/agent/agent.py index 010e302..07c64bb 100644 --- a/src/objects/agent.py +++ b/src/objects/agent/agent.py @@ -9,10 +9,9 @@ from src.common.point import Point from src.objects.object import Object from src.common.serializable import Properties +from src.objects.agent.stats_manager import StatsManager from src.actions.wait_for_code import WaitForCode -AGENT_HP = 100 - class Agent(Object): """ @@ -23,13 +22,21 @@ class Agent(Object): scene: 'Scene' walkable: bool items: list - hp: int + stats_manager: StatsManager - def __init__(self, scene: 'Scene', position: Point = Point(0, 0)) -> None: + def __init__(self, scene: 'Scene', position: Point = Point(0, 0), stats_manager=StatsManager()) -> None: super().__init__(position, scene) self.items = [] self.wait_for_code: WaitForCode = WaitForCode(self.scene.runtime.interactive) - self.hp = AGENT_HP + self.stats_manager = stats_manager + + @property + def hp(self): + return self.stats_manager.hp + + @hp.setter + def hp(self, val): + self.stats_manager.hp = val def tick(self) -> None: """ diff --git a/src/objects/agent/stats_manager.py b/src/objects/agent/stats_manager.py new file mode 100644 index 0000000..6b64928 --- /dev/null +++ b/src/objects/agent/stats_manager.py @@ -0,0 +1,14 @@ +AGENT_HP = 100 + + +class StatsManager: + def __init__(self, experience=0, hp=AGENT_HP) -> None: + self.experience = experience + self.hp = hp + + def get_level(self) -> int: + LEVEL_TRESHOLDS = [100, 300, 500, 1000, 1500, 2500] + for i, treshold in enumerate(LEVEL_TRESHOLDS): + if self.experience < treshold: + return i + 1 + return len(LEVEL_TRESHOLDS) + 1 diff --git a/src/scene.py b/src/scene.py index a5d28c9..fff644f 100644 --- a/src/scene.py +++ b/src/scene.py @@ -2,7 +2,7 @@ from typing import Dict, List from src.common.point import Point -from src.objects.agent import Agent +from src.objects.agent.agent import Agent from src.objects.floor import Floor from src.objects.portal import Portal from src.objects.object import Object From 0c18c5c86542c2413bea9acfb5a93d5b812aa9e3 Mon Sep 17 00:00:00 2001 From: Mateusz Grzonka Date: Thu, 26 Jan 2023 15:40:46 +0100 Subject: [PATCH 2/2] Add level property to stats manager --- src/objects/agent/stats_manager.py | 17 +++++++++++++++-- tests/stats_manager_test.py | 13 +++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 tests/stats_manager_test.py diff --git a/src/objects/agent/stats_manager.py b/src/objects/agent/stats_manager.py index 6b64928..4fde277 100644 --- a/src/objects/agent/stats_manager.py +++ b/src/objects/agent/stats_manager.py @@ -1,4 +1,5 @@ AGENT_HP = 100 +LEVEL_TRESHOLDS = [100, 300, 500, 1000, 1500, 2500] class StatsManager: @@ -6,9 +7,21 @@ def __init__(self, experience=0, hp=AGENT_HP) -> None: self.experience = experience self.hp = hp - def get_level(self) -> int: - LEVEL_TRESHOLDS = [100, 300, 500, 1000, 1500, 2500] + @property + def level(self) -> int: for i, treshold in enumerate(LEVEL_TRESHOLDS): if self.experience < treshold: return i + 1 return len(LEVEL_TRESHOLDS) + 1 + + @level.setter + def level(self, new_val): + if new_val == 1: + self.experience = 0 + return + + for i, _ in enumerate(LEVEL_TRESHOLDS): + if i + 1 == new_val: + self.experience = LEVEL_TRESHOLDS[i - 1] + return + self.experience = LEVEL_TRESHOLDS[-1] diff --git a/tests/stats_manager_test.py b/tests/stats_manager_test.py new file mode 100644 index 0000000..e3066b1 --- /dev/null +++ b/tests/stats_manager_test.py @@ -0,0 +1,13 @@ +from src.objects.agent.stats_manager import StatsManager, LEVEL_TRESHOLDS + + +def test_set_level(): + sm = StatsManager() + sm.level = 3 + assert sm.experience == LEVEL_TRESHOLDS[1] + + +def test_get_level(): + sm = StatsManager() + sm.experience = LEVEL_TRESHOLDS[2] + 1 + assert sm.level == 4