Save entities

This commit is contained in:
Yohann D'ANELLO 2020-11-19 00:10:37 +01:00
parent 657345e6f7
commit 81b20b72bc
5 changed files with 56 additions and 119 deletions

View File

@ -37,12 +37,13 @@ class Item(Entity):
self.map.remove_entity(self) self.map.remove_entity(self)
player.inventory.append(self) player.inventory.append(self)
def save_state(self) -> None: def save_state(self) -> dict:
""" """
Saves the state of the entity into a dictionary Saves the state of the entity into a dictionary
""" """
d = super().save_state() d = super().save_state()
d["held"] = self.held d["held"] = self.held
return d
class Heart(Item): class Heart(Item):
@ -62,13 +63,6 @@ class Heart(Item):
player.health = min(player.maxhealth, player.health + self.healing) player.health = min(player.maxhealth, player.health + self.healing)
self.map.remove_entity(self) 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): class Bomb(Item):
""" """
@ -96,10 +90,3 @@ class Bomb(Item):
if abs(e.x - self.x) + abs(e.y - self.y) <= 1 and \ if abs(e.x - self.x) + abs(e.y - self.y) <= 1 and \
isinstance(e, FightingEntity): isinstance(e, FightingEntity):
e.take_damage(self, self.damage) 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"

View File

@ -81,13 +81,6 @@ class Rabbit(Monster):
super().__init__(name="rabbit", strength=strength, super().__init__(name="rabbit", strength=strength,
maxhealth=maxhealth, *args, **kwargs) 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): class TeddyBear(Monster):
""" """
@ -97,10 +90,3 @@ class TeddyBear(Monster):
*args, **kwargs) -> None: *args, **kwargs) -> None:
super().__init__(name="teddy_bear", strength=strength, super().__init__(name="teddy_bear", strength=strength,
maxhealth=maxhealth, *args, **kwargs) 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"

View File

@ -13,34 +13,16 @@ class Player(FightingEntity):
inventory: list inventory: list
paths: Dict[Tuple[int, int], Tuple[int, int]] paths: Dict[Tuple[int, int], Tuple[int, int]]
## def __init__(self, maxhealth: int = 20, strength: int = 5, def __init__(self, maxhealth: int = 20, strength: int = 5,
## intelligence: int = 1, charisma: int = 1, dexterity: int = 1, intelligence: int = 1, charisma: int = 1, dexterity: int = 1,
## constitution: int = 1, level: int = 1, current_xp: int = 0, constitution: int = 1, level: int = 1, current_xp: int = 0,
## max_xp: int = 10, *args, **kwargs) -> None: max_xp: int = 10, *args, **kwargs) -> None:
## super().__init__(name="player", maxhealth=maxhealth, strength=strength, super().__init__(name="player", maxhealth=maxhealth, strength=strength,
## intelligence=intelligence, charisma=charisma, intelligence=intelligence, charisma=charisma,
## dexterity=dexterity, constitution=constitution, dexterity=dexterity, constitution=constitution,
## level=level, *args, **kwargs) level=level, *args, **kwargs)
## self.current_xp = current_xp self.current_xp = current_xp
## self.max_xp = max_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.inventory = list()
self.paths = dict() self.paths = dict()
@ -122,13 +104,12 @@ class Player(FightingEntity):
distances[(new_y, new_x)] = distances[(y, x)] + 1 distances[(new_y, new_x)] = distances[(y, x)] + 1
queue.append((new_y, new_x)) queue.append((new_y, new_x))
self.paths = predecessors self.paths = predecessors
def save_state(self) -> dict: def save_state(self) -> dict:
""" """
Saves the state of the entity into a dictionary Saves the state of the entity into a dictionary
""" """
d = super().save_state() d = super().save_state()
d["type"] = "Player"
d["current_xp"] = self.current_xp d["current_xp"] = self.current_xp
d["max_xp"] = self.max_xp d["max_xp"] = self.max_xp
return d return d

View File

@ -132,7 +132,9 @@ class Map:
d["currenty"] = self.currenty d["currenty"] = self.currenty
d["entities"] = [] d["entities"] = []
for enti in self.entities: for enti in self.entities:
d.append(enti.save_state()) if enti.save_state() is None:
raise Exception(enti)
d["entities"].append(enti.save_state())
d["map"] = self.draw_string(TexturePack.ASCII_PACK) d["map"] = self.draw_string(TexturePack.ASCII_PACK)
return d return d
@ -148,9 +150,9 @@ class Map:
self.currenty = d["currenty"] self.currenty = d["currenty"]
self.tiles = self.load_dungeon_from_string(d["map"]) self.tiles = self.load_dungeon_from_string(d["map"])
self.entities = [] self.entities = []
dictclasses = get_all_entity_classes_in_a_dict() dictclasses = Entity.get_all_entity_classes_in_a_dict()
for entisave in d["entities"] : for entisave in d["entities"]:
self.add_entity(dictclasses[entisave["type"]](entisave)) self.add_entity(dictclasses[entisave["type"]](**entisave))
class Tile(Enum): class Tile(Enum):
@ -200,27 +202,13 @@ class Entity:
name: str name: str
map: Map map: Map
## # noinspection PyShadowingBuiltins # noinspection PyShadowingBuiltins
## def __init__(self, y: int = 0, x: int = 0, name: Optional[str] = None, def __init__(self, y: int = 0, x: int = 0, name: Optional[str] = None,
## map: Optional[Map] = None): map: Optional[Map] = None, *ignored, **ignored2):
## self.y = y self.y = y
## self.x = x self.x = x
## self.name = name self.name = name
## self.map = map 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)\ def check_move(self, y: int, x: int, move_if_possible: bool = False)\
-> bool: -> bool:
@ -314,10 +302,21 @@ class Entity:
@staticmethod @staticmethod
def get_all_entity_classes_in_a_dict() -> dict: def get_all_entity_classes_in_a_dict() -> dict:
""" """
Returns all entities subclasses in a dictionnary Returns all entities subclasses in a dictionary
""" """
from dungeonbattle.entities.player import Player from dungeonbattle.entities.player import Player
return {"Beaver" : Beaver, "Bomb" : Bomb, "Heart" : Heart, "Hedgehog" : Hedgehog, "Rabbit" : Rabbit, "Teddy" : TeddyBear, "Player" : Player} from dungeonbattle.entities.monsters import Beaver, Hedgehog, Rabbit, \
TeddyBear
from dungeonbattle.entities.items import Bomb, Heart
return {
"Beaver": Beaver,
"Bomb": Bomb,
"Heart": Heart,
"Hedgehog": Hedgehog,
"Rabbit": Rabbit,
"TeddyBear": TeddyBear,
"Player": Player,
}
def save_state(self) -> dict: def save_state(self) -> dict:
""" """
@ -326,6 +325,7 @@ class Entity:
d = dict() d = dict()
d["x"] = self.x d["x"] = self.x
d["y"] = self.y d["y"] = self.y
d["type"] = self.__class__.__name__
return d return d
@ -343,36 +343,19 @@ class FightingEntity(Entity):
constitution: int constitution: int
level: int level: int
## def __init__(self, maxhealth: int = 0, health: Optional[int] = None, def __init__(self, maxhealth: int = 0, health: Optional[int] = None,
## strength: int = 0, intelligence: int = 0, charisma: int = 0, strength: int = 0, intelligence: int = 0, charisma: int = 0,
## dexterity: int = 0, constitution: int = 0, level: int = 0, dexterity: int = 0, constitution: int = 0, level: int = 0,
## *args, **kwargs) -> None: *args, **kwargs) -> None:
## super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
## self.maxhealth = maxhealth self.maxhealth = maxhealth
## self.health = maxhealth if health is None else health self.health = maxhealth if health is None else health
## self.strength = strength self.strength = strength
## self.intelligence = intelligence self.intelligence = intelligence
## self.charisma = charisma self.charisma = charisma
## self.dexterity = dexterity self.dexterity = dexterity
## self.constitution = constitution self.constitution = constitution
## self.level = level 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 @property
def dead(self) -> bool: def dead(self) -> bool:
@ -402,7 +385,7 @@ class FightingEntity(Entity):
""" """
Returns a fighting entities specific attributes Returns a fighting entities specific attributes
""" """
return ["maxhealth", "health", "level", "dead", "strength", return ["maxhealth", "health", "level", "strength",
"intelligence", "charisma", "dexterity", "constitution"] "intelligence", "charisma", "dexterity", "constitution"]
def save_state(self) -> dict: def save_state(self) -> dict:
@ -411,5 +394,5 @@ class FightingEntity(Entity):
""" """
d = super().save_state() d = super().save_state()
for name in self.keys(): for name in self.keys():
d[name] = self.__getattribute__(name) d[name] = getattr(self, name)
return d return d

View File

@ -1 +1 @@
{"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 ################ ############ "} {"width": 80, "height": 40, "start_y": 1, "start_x": 17, "currentx": 14, "currenty": 11, "entities": [{"x": 14, "y": 11, "type": "Player", "maxhealth": 20, "health": 20, "level": 1, "strength": 5, "intelligence": 1, "charisma": 1, "dexterity": 1, "constitution": 1, "current_xp": 0, "max_xp": 10}, {"x": 50, "y": 37, "type": "Rabbit", "maxhealth": 15, "health": 15, "level": 0, "strength": 1, "intelligence": 0, "charisma": 0, "dexterity": 0, "constitution": 0}, {"x": 16, "y": 22, "type": "Rabbit", "maxhealth": 15, "health": 15, "level": 0, "strength": 1, "intelligence": 0, "charisma": 0, "dexterity": 0, "constitution": 0}, {"x": 12, "y": 7, "type": "Bomb", "held": false}, {"x": 69, "y": 38, "type": "Hedgehog", "maxhealth": 10, "health": 10, "level": 0, "strength": 3, "intelligence": 0, "charisma": 0, "dexterity": 0, "constitution": 0}, {"x": 64, "y": 28, "type": "Hedgehog", "maxhealth": 10, "health": 10, "level": 0, "strength": 3, "intelligence": 0, "charisma": 0, "dexterity": 0, "constitution": 0}, {"x": 37, "y": 29, "type": "TeddyBear", "maxhealth": 50, "health": 50, "level": 0, "strength": 0, "intelligence": 0, "charisma": 0, "dexterity": 0, "constitution": 0}, {"x": 16, "y": 17, "type": "Rabbit", "maxhealth": 15, "health": 15, "level": 0, "strength": 1, "intelligence": 0, "charisma": 0, "dexterity": 0, "constitution": 0}, {"x": 39, "y": 22, "type": "Rabbit", "maxhealth": 15, "health": 15, "level": 0, "strength": 1, "intelligence": 0, "charisma": 0, "dexterity": 0, "constitution": 0}, {"x": 35, "y": 28, "type": "Heart", "held": false}], "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 ################ ############ "}