From a4482849aedf0be889f6c5a10a72fd2f167d5f08 Mon Sep 17 00:00:00 2001 From: eichhornchen Date: Wed, 18 Nov 2020 22:42:46 +0100 Subject: [PATCH] Fix for loading game in progress, there remains to change all entities __init__ to allow being initialized by a dictionnary (work in progress, breaks the game) --- dungeonbattle/entities/items.py | 21 ++++++ dungeonbattle/entities/monsters.py | 14 ++++ dungeonbattle/entities/player.py | 48 +++++++++++--- dungeonbattle/interfaces.py | 102 ++++++++++++++++++----------- save.json | 2 +- 5 files changed, 139 insertions(+), 48 deletions(-) diff --git a/dungeonbattle/entities/items.py b/dungeonbattle/entities/items.py index dbfd455..442e00b 100644 --- a/dungeonbattle/entities/items.py +++ b/dungeonbattle/entities/items.py @@ -37,6 +37,13 @@ class Item(Entity): self.map.remove_entity(self) player.inventory.append(self) + def save_state(self) -> None: + """ + Saves the state of the entity into a dictionary + """ + d = super().save_state() + d["held"] = self.held + class Heart(Item): """ @@ -55,6 +62,13 @@ class Heart(Item): player.health = min(player.maxhealth, player.health + self.healing) self.map.remove_entity(self) + def save_state(self) -> None: + """ + Saves the state of the entity into a dictionary + """ + d = super().save_state() + d["type"] = "Heart" + class Bomb(Item): """ @@ -82,3 +96,10 @@ class Bomb(Item): if abs(e.x - self.x) + abs(e.y - self.y) <= 1 and \ isinstance(e, FightingEntity): e.take_damage(self, self.damage) + + def save_state(self) -> None: + """ + Saves the state of the entity into a dictionary + """ + d = super().save_state() + d["type"] = "Bomb" diff --git a/dungeonbattle/entities/monsters.py b/dungeonbattle/entities/monsters.py index 1f04372..76fdb7a 100644 --- a/dungeonbattle/entities/monsters.py +++ b/dungeonbattle/entities/monsters.py @@ -81,6 +81,13 @@ class Rabbit(Monster): super().__init__(name="rabbit", strength=strength, maxhealth=maxhealth, *args, **kwargs) + def save_state(self) -> None: + """ + Saves the state of the entity into a dictionary + """ + d = super().save_state() + d["type"] = "Rabbit" + class TeddyBear(Monster): """ @@ -90,3 +97,10 @@ class TeddyBear(Monster): *args, **kwargs) -> None: super().__init__(name="teddy_bear", strength=strength, maxhealth=maxhealth, *args, **kwargs) + + def save_state(self) -> None: + """ + Saves the state of the entity into a dictionary + """ + d = super().save_state() + d["type"] = "Teddy" diff --git a/dungeonbattle/entities/player.py b/dungeonbattle/entities/player.py index 6abe397..0b84135 100644 --- a/dungeonbattle/entities/player.py +++ b/dungeonbattle/entities/player.py @@ -13,16 +13,34 @@ class Player(FightingEntity): inventory: list paths: Dict[Tuple[int, int], Tuple[int, int]] - def __init__(self, maxhealth: int = 20, strength: int = 5, - intelligence: int = 1, charisma: int = 1, dexterity: int = 1, - constitution: int = 1, level: int = 1, current_xp: int = 0, - max_xp: int = 10, *args, **kwargs) -> None: - super().__init__(name="player", maxhealth=maxhealth, strength=strength, - intelligence=intelligence, charisma=charisma, - dexterity=dexterity, constitution=constitution, - level=level, *args, **kwargs) - self.current_xp = current_xp - self.max_xp = max_xp +## def __init__(self, maxhealth: int = 20, strength: int = 5, +## intelligence: int = 1, charisma: int = 1, dexterity: int = 1, +## constitution: int = 1, level: int = 1, current_xp: int = 0, +## max_xp: int = 10, *args, **kwargs) -> None: +## super().__init__(name="player", maxhealth=maxhealth, strength=strength, +## intelligence=intelligence, charisma=charisma, +## dexterity=dexterity, constitution=constitution, +## level=level, *args, **kwargs) +## self.current_xp = current_xp +## self.max_xp = max_xp +## self.inventory = list() +## self.paths = dict() + + def __init__(self, *args, **kwargs) -> None: + super().__init__(*args, **kwargs) + validkeys = {"current_xp" : 0,"max_xp" : 0} + + for dictionary in args : + for key in validkeys : + if key in dictionary : + self.__setattr__(key, dictionary[key]) + else : + self.__setattr__(key, validkeys[key]) + for key in validkeys: + if key in kwargs : + self.__setattr__(key, kwargs[key]) + else : + self.__setattr__(key, validkeys[key]) self.inventory = list() self.paths = dict() @@ -104,3 +122,13 @@ class Player(FightingEntity): distances[(new_y, new_x)] = distances[(y, x)] + 1 queue.append((new_y, new_x)) self.paths = predecessors + + def save_state(self) -> dict: + """ + Saves the state of the entity into a dictionary + """ + d = super().save_state() + d["type"] = "Player" + d["current_xp"] = self.current_xp + d["max_xp"] = self.max_xp + return d diff --git a/dungeonbattle/interfaces.py b/dungeonbattle/interfaces.py index 2e7add9..ae87700 100644 --- a/dungeonbattle/interfaces.py +++ b/dungeonbattle/interfaces.py @@ -130,8 +130,9 @@ class Map: d["start_x"] = self.start_x d["currentx"] = self.currentx d["currenty"] = self.currenty + d["entities"] = [] for enti in self.entities: - d.update(enti.save_state()) + d.append(enti.save_state()) d["map"] = self.draw_string(TexturePack.ASCII_PACK) return d @@ -146,7 +147,10 @@ class Map: self.currentx = d["currentx"] self.currenty = d["currenty"] self.tiles = self.load_dungeon_from_string(d["map"]) - # add entities + self.entities = [] + dictclasses = get_all_entity_classes_in_a_dict() + for entisave in d["entities"] : + self.add_entity(dictclasses[entisave["type"]](entisave)) class Tile(Enum): @@ -196,13 +200,27 @@ class Entity: name: str map: Map - # noinspection PyShadowingBuiltins - def __init__(self, y: int = 0, x: int = 0, name: Optional[str] = None, - map: Optional[Map] = None): - self.y = y - self.x = x - self.name = name - self.map = map +## # noinspection PyShadowingBuiltins +## def __init__(self, y: int = 0, x: int = 0, name: Optional[str] = None, +## map: Optional[Map] = None): +## self.y = y +## self.x = x +## self.name = name +## self.map = map + + def __init__(self, dictionary, **kwargs) -> None: + validkeys = self.attributes() + for key in validkeys : + self.__setattr__(key, dictionary[key]) + for key in validkeys: + self.__setattr__(key, kwargs[key]) + + @staticmethod + def attributes(self) -> list: + """ + Returns the list of attributes + """ + return ["x", "y", "name"] def check_move(self, y: int, x: int, move_if_possible: bool = False)\ -> bool: @@ -293,6 +311,14 @@ class Entity: Rabbit, TeddyBear return [Beaver, Bomb, Heart, Hedgehog, Rabbit, TeddyBear] + @staticmethod + def get_all_entity_classes_in_a_dict() -> dict: + """ + Returns all entities subclasses in a dictionnary + """ + from dungeonbattle.entities.player import Player + return {"Beaver" : Beaver, "Bomb" : Bomb, "Heart" : Heart, "Hedgehog" : Hedgehog, "Rabbit" : Rabbit, "Teddy" : TeddyBear, "Player" : Player} + def save_state(self) -> dict: """ Saves the coordinates of the entity @@ -302,13 +328,6 @@ class Entity: d["y"] = self.y return d - def recover_state(self, d: dict) -> None: - """ - Loads the coordinates of the entity from a dictionnary - """ - self.x = d["x"] - self.y = d["y"] - class FightingEntity(Entity): """ @@ -324,19 +343,36 @@ class FightingEntity(Entity): constitution: int level: int - def __init__(self, maxhealth: int = 0, health: Optional[int] = None, - strength: int = 0, intelligence: int = 0, charisma: int = 0, - dexterity: int = 0, constitution: int = 0, level: int = 0, - *args, **kwargs) -> None: - super().__init__(*args, **kwargs) - self.maxhealth = maxhealth - self.health = maxhealth if health is None else health - self.strength = strength - self.intelligence = intelligence - self.charisma = charisma - self.dexterity = dexterity - self.constitution = constitution - self.level = level +## def __init__(self, maxhealth: int = 0, health: Optional[int] = None, +## strength: int = 0, intelligence: int = 0, charisma: int = 0, +## dexterity: int = 0, constitution: int = 0, level: int = 0, +## *args, **kwargs) -> None: +## super().__init__(*args, **kwargs) +## self.maxhealth = maxhealth +## self.health = maxhealth if health is None else health +## self.strength = strength +## self.intelligence = intelligence +## self.charisma = charisma +## self.dexterity = dexterity +## self.constitution = constitution +## self.level = level + + def __init__(self, *args, **kwargs) -> None: + validkeys = {"maxhealth" : 0,"health" : 0,"strength" : 0 \ + ,"intelligence" : 0,"charisma" : 0,"dexterity" : 0\ + ,"constitution" : 0,"level" : 0} + #All the keys we wan to set in this init, with their default value + for dictionary in args : + for key in validkeys : + if key in dictionary : + self.__setattr__(key, dictionary[key]) + else : + self.__setattr__(key, validkeys[key]) + for key in validkeys: + if key in kwargs : + self.__setattr__(key, kwargs[key]) + else : + self.__setattr__(key, validkeys[key]) @property def dead(self) -> bool: @@ -377,11 +413,3 @@ class FightingEntity(Entity): for name in self.keys(): d[name] = self.__getattribute__(name) return d - - def recover_state(self, d: dict) -> None: - """ - Loads the state of an entity from a dictionary - """ - super().recover_state(d) - for name in d.keys(): - setattr(self, name, d[name]) diff --git a/save.json b/save.json index 0cdcad5..067eac1 100644 --- a/save.json +++ b/save.json @@ -1 +1 @@ -{"width": 80, "height": 40, "start_y": 1, "start_x": 17, "currentx": 29, "currenty": 25, "x": 74, "y": 22, "maxhealth": 50, "health": 0, "level": 1, "dead": false, "strength": 0, "intelligence": 0, "charisma": 0, "dexterity": 0, "constitution": 0, "map": " ########### ######### \n #.........# #.......# \n #.........# ############.......# \n #.........###############..........#.......############## \n #.........#........................#....................# \n #.........#.............#..........#.......#............# \n ########.########.............#..................#............# \n #.........# #.............####.#######.......#............# \n #.........# #.............##.........###################### \n #.........# #####.##########.........# ########### \n #.........# #......# #.........# #.........# \n ########.##########......# #.........# #.........# \n #...........##......# #.........# #.........# \n #...........##......# #.........# #.........# \n #...........##......# #.........# ################.###### \n #...........##......# #.........# #.................############\n #...........##......# ########.########.......#.........#..........#\n #...........##......# #...............#.......#.........#..........#\n #...........######### #...............#.......#.........#..........#\n #...........# #...............#.......#....................#\n #####.####### #.......................#.........#..........#\n #.........# #...............###################..........#\n #.........############ #...............# #..........#\n #.........#..........# #...............# ############\n #....................#####.###########.############# \n ########.#########...................# #.............# \n #........# #..........#........# #.............######### \n #........# ######.##########........# #.............#.......# \n #........# #..........# #........# #.....................# \n #........# #..........# #........# #.............#.......# \n #........# #..........# #........# #.............#.......# \n #........# #..........# #........# #.............#.......# \n #........# #..........#########.##### #.............#.......# \n #........# #..........#.........# ##########.############.####### \n #........# #..........#.........# #..............# #..........# \n ########## #..........#.........# #..............# #..........# \n ############.........# #..............# #..........# \n #.........# #..............# #..........# \n ########### #..............# #..........# \n ################ ############ "} \ No newline at end of file +{"width": 80, "height": 40, "start_y": 1, "start_x": 17, "currentx": 54, "currenty": 38, "x": 56, "y": 19, "maxhealth": 15, "health": 15, "level": 0, "dead": false, "strength": 1, "intelligence": 0, "charisma": 0, "dexterity": 0, "constitution": 0, "map": " ########### ######### \n #.........# #.......# \n #.........# ############.......# \n #.........###############..........#.......############## \n #.........#........................#....................# \n #.........#.............#..........#.......#............# \n ########.########.............#..................#............# \n #.........# #.............####.#######.......#............# \n #.........# #.............##.........###################### \n #.........# #####.##########.........# ########### \n #.........# #......# #.........# #.........# \n ########.##########......# #.........# #.........# \n #...........##......# #.........# #.........# \n #...........##......# #.........# #.........# \n #...........##......# #.........# ################.###### \n #...........##......# #.........# #.................############\n #...........##......# ########.########.......#.........#..........#\n #...........##......# #...............#.......#.........#..........#\n #...........######### #...............#.......#.........#..........#\n #...........# #...............#.......#....................#\n #####.####### #.......................#.........#..........#\n #.........# #...............###################..........#\n #.........############ #...............# #..........#\n #.........#..........# #...............# ############\n #....................#####.###########.############# \n ########.#########...................# #.............# \n #........# #..........#........# #.............######### \n #........# ######.##########........# #.............#.......# \n #........# #..........# #........# #.....................# \n #........# #..........# #........# #.............#.......# \n #........# #..........# #........# #.............#.......# \n #........# #..........# #........# #.............#.......# \n #........# #..........#########.##### #.............#.......# \n #........# #..........#.........# ##########.############.####### \n #........# #..........#.........# #..............# #..........# \n ########## #..........#.........# #..............# #..........# \n ############.........# #..............# #..........# \n #.........# #..............# #..........# \n ########### #..............# #..........# \n ################ ############ "}