squirrel-battle/squirrelbattle/settings.py

105 lines
3.8 KiB
Python
Raw Normal View History

2021-01-10 09:46:17 +00:00
# Copyright (C) 2020-2021 by ÿnérant, eichhornchen, nicomarg, charlse
2020-11-27 15:33:17 +00:00
# SPDX-License-Identifier: GPL-3.0-or-later
2020-11-06 13:56:21 +00:00
import json
2020-11-27 19:53:24 +00:00
import locale
import os
2020-11-06 13:56:21 +00:00
from typing import Any, Generator
2020-11-06 13:29:05 +00:00
from .resources import ResourceManager
2020-11-27 21:19:41 +00:00
from .translations import gettext as _
2020-11-06 13:29:05 +00:00
class Settings:
2020-11-06 13:56:21 +00:00
"""
This class stores the settings of the game.
2020-12-18 16:46:38 +00:00
Settings can be obtained by using for example settings.TEXTURE_PACK
directly.
The comment can be obtained by using settings.get_comment('TEXTURE_PACK').
We can set the setting by simply using settings.TEXTURE_PACK = 'new_key'
2020-11-06 13:56:21 +00:00
"""
2020-11-06 13:29:05 +00:00
def __init__(self):
2020-11-27 21:19:41 +00:00
self.KEY_UP_PRIMARY = ['z', 'Main key to move up']
self.KEY_UP_SECONDARY = ['KEY_UP', 'Secondary key to move up']
self.KEY_DOWN_PRIMARY = ['s', 'Main key to move down']
self.KEY_DOWN_SECONDARY = ['KEY_DOWN', 'Secondary key to move down']
self.KEY_LEFT_PRIMARY = ['q', 'Main key to move left']
self.KEY_LEFT_SECONDARY = ['KEY_LEFT', 'Secondary key to move left']
self.KEY_RIGHT_PRIMARY = ['d', 'Main key to move right']
self.KEY_RIGHT_SECONDARY = ['KEY_RIGHT', 'Secondary key to move right']
self.KEY_ENTER = ['\n', 'Key to validate a menu']
self.KEY_INVENTORY = ['i', 'Key used to open the inventory']
self.KEY_USE = ['u', 'Key used to use an item in the inventory']
self.KEY_EQUIP = ['e', 'Key used to equip an item in the inventory']
self.KEY_DROP = ['r', 'Key used to drop an item in the inventory']
2020-12-09 14:32:37 +00:00
self.KEY_CHAT = ['t', 'Key used to talk to a friendly entity']
2020-12-12 17:12:37 +00:00
self.KEY_WAIT = ['w', 'Key used to wait']
2021-01-06 13:55:16 +00:00
self.KEY_LADDER = ['<', 'Key used to use ladders']
2021-01-08 17:06:26 +00:00
self.KEY_LAUNCH = ['l', 'Key used to use a bow']
2021-01-10 16:10:00 +00:00
self.KEY_DANCE = ['y', 'Key used to dance']
2020-11-27 21:19:41 +00:00
self.TEXTURE_PACK = ['ascii', 'Texture pack']
self.LOCALE = [locale.getlocale()[0][:2], 'Language']
2020-11-06 13:29:05 +00:00
def __getattribute__(self, item: str) -> Any:
superattribute = super().__getattribute__(item)
2020-11-06 13:56:21 +00:00
if item.isupper() and item in self.settings_keys:
return superattribute[0]
2020-11-06 13:29:05 +00:00
return superattribute
2020-11-06 13:56:21 +00:00
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)
2020-11-06 13:29:05 +00:00
def get_comment(self, item: str) -> str:
"""
Retrieves the comment relative to a setting.
2020-11-06 13:29:05 +00:00
"""
2020-11-06 14:08:29 +00:00
if item in self.settings_keys:
2020-11-27 21:19:41 +00:00
return _(object.__getattribute__(self, item)[1])
2020-11-06 13:29:05 +00:00
for key in self.settings_keys:
if getattr(self, key) == item:
2020-11-27 21:19:41 +00:00
return _(object.__getattribute__(self, key)[1])
2020-11-06 13:29:05 +00:00
@property
2020-11-06 13:56:21 +00:00
def settings_keys(self) -> Generator[str, Any, None]:
2020-11-06 13:29:05 +00:00
"""
Gets the list of all parameters.
2020-11-06 13:29:05 +00:00
"""
return (key for key in self.__dict__)
2020-11-06 13:56:21 +00:00
def loads_from_string(self, json_str: str) -> None:
"""
Loads settings.
2020-11-06 13:56:21 +00:00
"""
d = json.loads(json_str)
for key in d:
if hasattr(self, key):
setattr(self, key, d[key])
2020-11-06 13:56:21 +00:00
def dumps_to_string(self) -> str:
"""
Dumps settings.
2020-11-06 13:56:21 +00:00
"""
d = dict()
for key in self.settings_keys:
d[key] = getattr(self, key)
return json.dumps(d, indent=4)
2020-11-06 13:56:21 +00:00
def load_settings(self) -> None:
"""
Loads the settings from a file
"""
file_path = ResourceManager.get_config_path("settings.json")
if os.path.isfile(file_path):
with open(file_path, "r") as f:
self.loads_from_string(f.read())
2020-11-06 13:56:21 +00:00
def write_settings(self) -> None:
"""
Dumps the settings into a file
"""
with open(ResourceManager.get_config_path("settings.json"), "w") as f:
2020-11-06 13:56:21 +00:00
f.write(self.dumps_to_string())