From af363dabfee3b8161f1bdfd1d729182ed1ce5644 Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Fri, 6 Nov 2020 14:56:21 +0100 Subject: [PATCH] Add write and load settings --- .gitignore | 3 ++ dungeonbattle/settings.py | 70 +++++++++++++++++++++++++++++++-------- 2 files changed, 59 insertions(+), 14 deletions(-) diff --git a/.gitignore b/.gitignore index 3269e7f..7221e66 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,6 @@ venv/ .pytest_cache/ __pycache__ + +# Don't commit settings +settings.json diff --git a/dungeonbattle/settings.py b/dungeonbattle/settings.py index 7e44427..e3808e8 100644 --- a/dungeonbattle/settings.py +++ b/dungeonbattle/settings.py @@ -1,24 +1,37 @@ -from typing import Any +import json +from typing import Any, Generator class Settings: + """ + This class stores the settings of the game. + Settings can be get by using for example settings.TEXTURE_PACK directly. + The comment can be get by using settings.get_comment('TEXTURE_PACK'). + We can define the setting by simply use settings.TEXTURE_PACK = 'new_key' + """ def __init__(self): - self.KEY_UP_PRIMARY = 'z', 'Touche principale pour aller vers le haut' - self.KEY_UP_SECONDARY = 'KEY_UP', 'Touche secondaire pour aller vers le haut' - self.KEY_DOWN_PRIMARY = 's', 'Touche principale pour aller vers le bas' - self.KEY_DOWN_SECONDARY = 'KEY_DOWN', 'Touche secondaire pour aller vers le bas' - self.KEY_LEFT_PRIMARY = 'q', 'Touche principale pour aller vers la gauche' - self.KEY_LEFT_SECONDARY = 'KEY_LEFT', 'Touche secondaire pour aller vers la gauche' - self.KEY_RIGHT_PRIMARY = 'd', 'Touche principale pour aller vers la droite' - self.KEY_RIGHT_SECONDARY = 'KEY_RIGHT', 'Touche secondaire pour aller vers la droite' - self.TEXTURE_PACK = 'ASCII', 'Pack de textures utilisé' + self.KEY_UP_PRIMARY = ['z', 'Touche principale pour aller vers le haut'] + self.KEY_UP_SECONDARY = ['KEY_UP', 'Touche secondaire pour aller vers le haut'] + self.KEY_DOWN_PRIMARY = ['s', 'Touche principale pour aller vers le bas'] + self.KEY_DOWN_SECONDARY = ['KEY_DOWN', 'Touche secondaire pour aller vers le bas'] + self.KEY_LEFT_PRIMARY = ['q', 'Touche principale pour aller vers la gauche'] + self.KEY_LEFT_SECONDARY = ['KEY_LEFT', 'Touche secondaire pour aller vers la gauche'] + self.KEY_RIGHT_PRIMARY = ['d', 'Touche principale pour aller vers la droite'] + self.KEY_RIGHT_SECONDARY = ['KEY_RIGHT', 'Touche secondaire pour aller vers la droite'] + self.TEXTURE_PACK = ['ASCII', 'Pack de textures utilisé'] def __getattribute__(self, item: str) -> Any: superattribute = super().__getattribute__(item) - if isinstance(superattribute, tuple) and item.isupper(): - return super().__getattribute__(item)[0] + if item.isupper() and item in self.settings_keys: + return superattribute[0] return superattribute + def __setattr__(self, name: str, value: Any) -> None: + if name in self.settings_keys: + object.__getattribute__(self, name)[0] = value + return + return super().__setattr__(name, value) + def get_comment(self, item: str) -> str: """ Retrieve the comment of a setting. @@ -26,14 +39,43 @@ class Settings: if hasattr(self, item) and isinstance(object.__getattribute__(self, item), tuple): return object.__getattribute__(self, item)[1] for key in self.settings_keys: - print(key) if getattr(self, key) == item: return object.__getattribute__(self, key)[1] @property - def settings_keys(self): + def settings_keys(self) -> Generator[str, Any, None]: """ Get the list of all parameters. """ return (key for key in self.__dict__) + def loads_from_string(self, json_str: str) -> None: + """ + Dump settings + """ + d = json.loads(json_str) + for key in d: + setattr(self, key, d[key]) + + def dumps_to_string(self) -> str: + """ + Dump settings + """ + d = dict() + for key in self.settings_keys: + d[key] = getattr(self, key) + return json.dumps(d) + + def load_settings(self) -> None: + """ + Loads the settings from a file + """ + with open("settings.json", "r") as f: + self.loads_from_string(f.read()) + + def write_settings(self) -> None: + """ + Dumps the settings into a file + """ + with open("settings.json", "w") as f: + f.write(self.dumps_to_string())