diff --git a/dungeonbattle/enums.py b/dungeonbattle/enums.py new file mode 100644 index 0000000..2304e7e --- /dev/null +++ b/dungeonbattle/enums.py @@ -0,0 +1,41 @@ +from enum import Enum, auto + +from dungeonbattle.settings import Settings + + +class GameMode(Enum): + MAINMENU = auto() + PLAY = auto() + SETTINGS = auto() + INVENTORY = auto() + + +class KeyValues(Enum): + UP = auto() + DOWN = auto() + LEFT = auto() + RIGHT = auto() + ENTER = auto() + SPACE = auto() + + @staticmethod + def translate_key(key: str, settings: Settings) -> "KeyValues": + """ + Translate the raw string key into an enum value that we can use. + """ + if key in (settings.KEY_DOWN_SECONDARY, + settings.KEY_DOWN_PRIMARY): + return KeyValues.DOWN + elif key in (settings.KEY_LEFT_PRIMARY, + settings.KEY_LEFT_SECONDARY): + return KeyValues.LEFT + elif key in (settings.KEY_RIGHT_PRIMARY, + settings.KEY_RIGHT_SECONDARY): + return KeyValues.RIGHT + elif key in (settings.KEY_UP_PRIMARY, + settings.KEY_UP_SECONDARY): + return KeyValues.UP + elif key == settings.KEY_ENTER: + return KeyValues.ENTER + elif key == ' ': + return KeyValues.SPACE diff --git a/dungeonbattle/game.py b/dungeonbattle/game.py index ff1c91e..3869b0b 100644 --- a/dungeonbattle/game.py +++ b/dungeonbattle/game.py @@ -1,31 +1,14 @@ -import sys from random import randint from typing import Any from .entities.player import Player +from .enums import GameMode, KeyValues from .interfaces import Map from .settings import Settings -from enum import Enum, auto from . import menus from typing import Callable -class GameMode(Enum): - MAINMENU = auto() - PLAY = auto() - SETTINGS = auto() - INVENTORY = auto() - - -class KeyValues(Enum): - UP = auto() - DOWN = auto() - LEFT = auto() - RIGHT = auto() - ENTER = auto() - SPACE = auto() - - class Game: map: Map player: Player @@ -70,30 +53,9 @@ class Game: screen.refresh() self.display_refresh() key = screen.getkey() - self.handle_key_pressed(self.translate_key(key), screen) + self.handle_key_pressed(KeyValues.translate_key(key, self.settings)) - def translate_key(self, key: str) -> KeyValues: - """ - Translate the raw string key into an enum value that we can use. - """ - if key in (self.settings.KEY_DOWN_SECONDARY, - self.settings.KEY_DOWN_PRIMARY): - return KeyValues.DOWN - elif key in (self.settings.KEY_LEFT_PRIMARY, - self.settings.KEY_LEFT_SECONDARY): - return KeyValues.LEFT - elif key in (self.settings.KEY_RIGHT_PRIMARY, - self.settings.KEY_RIGHT_SECONDARY): - return KeyValues.RIGHT - elif key in (self.settings.KEY_UP_PRIMARY, - self.settings.KEY_UP_SECONDARY): - return KeyValues.UP - elif key == self.settings.KEY_ENTER: - return KeyValues.ENTER - elif key == ' ': - return KeyValues.SPACE - - def handle_key_pressed(self, key: KeyValues, screen: Any) -> None: + def handle_key_pressed(self, key: KeyValues) -> None: """ Indicates what should be done when the given key is pressed, according to the current game state. @@ -101,9 +63,9 @@ class Game: if self.state == GameMode.PLAY: self.handle_key_pressed_play(key) elif self.state == GameMode.MAINMENU: - self.handle_key_pressed_main_menu(key) + self.main_menu.handle_key_pressed(key, self) elif self.state == GameMode.SETTINGS: - self.handle_key_pressed_settings(key, screen) + self.settings_menu.handle_key_pressed(key, self.settings) self.display_refresh() def handle_key_pressed_play(self, key: KeyValues) -> None: @@ -124,38 +86,3 @@ class Game: self.map.tick() elif key == KeyValues.SPACE: self.state = GameMode.MAINMENU - - def handle_key_pressed_main_menu(self, key: KeyValues) -> None: - """ - In the main menu, we can navigate through options. - """ - if key == KeyValues.DOWN: - self.main_menu.go_down() - if key == KeyValues.UP: - self.main_menu.go_up() - if key == KeyValues.ENTER: - option = self.main_menu.validate() - if option == menus.MainMenuValues.START: - self.state = GameMode.PLAY - elif option == menus.MainMenuValues.SETTINGS: - self.state = GameMode.SETTINGS - elif option == menus.MainMenuValues.EXIT: - sys.exit(0) - - def handle_key_pressed_settings(self, key: KeyValues, screen: Any) -> None: - """ - For now, in the settings mode, we can only go backwards. - """ - if key == KeyValues.SPACE: - self.state = GameMode.MAINMENU - if key == KeyValues.DOWN: - self.settings_menu.go_down() - if key == KeyValues.UP: - self.settings_menu.go_up() - if key == KeyValues.ENTER: - option = self.settings_menu.validate().split(": ")[0] - if option != "TEXTURE_PACK": - newkey = screen.getkey() - self.settings.__setattr__(option, newkey) - self.settings.write_settings() - self.settings_menu.update_values(self.settings) diff --git a/dungeonbattle/menus.py b/dungeonbattle/menus.py index 20a103e..00e8cf4 100644 --- a/dungeonbattle/menus.py +++ b/dungeonbattle/menus.py @@ -1,5 +1,8 @@ +import sys from enum import Enum from typing import Any + +from .enums import GameMode, KeyValues from .settings import Settings @@ -31,6 +34,23 @@ class MainMenuValues(Enum): class MainMenu(Menu): values = [e for e in MainMenuValues] + def handle_key_pressed(self, key: KeyValues, game: Any) -> None: + """ + In the main menu, we can navigate through options. + """ + if key == KeyValues.DOWN: + self.go_down() + if key == KeyValues.UP: + self.go_up() + if key == KeyValues.ENTER: + option = self.validate() + if option == MainMenuValues.START: + game.state = GameMode.PLAY + elif option == MainMenuValues.SETTINGS: + game.state = GameMode.SETTINGS + elif option == MainMenuValues.EXIT: + sys.exit(0) + class SettingsMenu(Menu): def __init__(self): @@ -40,6 +60,24 @@ class SettingsMenu(Menu): s = settings.dumps_to_string() self.values = s[6:-2].replace("\"", "").split(",\n ") + def handle_key_pressed(self, key: KeyValues, settings: Settings) -> None: + """ + For now, in the settings mode, we can only go backwards. + """ + if key == KeyValues.SPACE: + self.state = GameMode.MAINMENU + if key == KeyValues.DOWN: + self.go_down() + if key == KeyValues.UP: + self.go_up() + if key == KeyValues.ENTER: + option = self.validate().split(": ")[0] + if option != "TEXTURE_PACK": + newkey = screen.getkey() + self.settings.__setattr__(option, newkey) + self.settings.write_settings() + self.settings_menu.update_values(self.settings) + class ArbitraryMenu(Menu): def __init__(self, values: list):