squirrel-battle/dungeonbattle/game.py

109 lines
3.2 KiB
Python
Raw Normal View History

2020-11-06 14:33:26 +00:00
from typing import Any
2020-11-06 17:06:28 +00:00
import sys
2020-10-23 12:53:08 +00:00
from .interfaces import Map
2020-10-23 13:00:59 +00:00
from .mapdisplay import MapDisplay
from .settings import Settings
2020-10-23 12:53:08 +00:00
from .term_manager import TermManager
2020-11-06 16:24:20 +00:00
from enum import Enum, auto
2020-11-06 17:06:28 +00:00
from . import menus
2020-11-06 16:24:20 +00:00
class GameMode(Enum):
MAINMENU = auto()
PLAY = auto()
SETTINGS = auto()
INVENTORY = auto()
class KeyValues(Enum):
UP = auto()
DOWN = auto()
LEFT = auto()
RIGHT = auto()
ENTER = auto()
2020-10-23 12:53:08 +00:00
class Game:
INSTANCE = None
def init(self) -> None:
Game.INSTANCE = self
2020-11-06 16:24:20 +00:00
self.state = GameMode.MAINMENU
2020-11-06 17:06:28 +00:00
self.main_menu = menus.MainMenu()
self.settings = Settings()
self.settings.load_settings()
self.settings.write_settings()
2020-10-23 12:53:08 +00:00
2020-10-23 16:01:39 +00:00
def new_game(self):
# TODO generate a new map procedurally
2020-11-06 13:23:12 +00:00
self.m = Map.load("example_map.txt")
2020-10-23 16:01:39 +00:00
self.player = Player()
self.player.y = 1
self.player.x = 6
2020-11-06 16:02:59 +00:00
self.d = MapDisplay(self.m, self.player)
2020-10-23 16:01:39 +00:00
2020-11-06 17:06:28 +00:00
@staticmethod
2020-10-23 16:01:39 +00:00
def load_game(filename):
# TODO loading map from a file
raise NotImplementedError()
def run(self, screen):
2020-10-23 12:53:08 +00:00
while True:
2020-10-23 13:40:32 +00:00
screen.clear()
2020-10-23 12:53:08 +00:00
screen.refresh()
2020-11-06 16:02:59 +00:00
self.d.display(self.player.y, self.player.x)
2020-10-23 12:53:08 +00:00
key = screen.getkey()
2020-11-06 16:24:20 +00:00
self.handle_key_pressed(self.translate_key(key))
def translate_key(self, key:str) -> KeyValues:
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
def handle_key_pressed(self, key: KeyValues) -> None:
2020-11-06 17:06:28 +00:00
if self.state == GameMode.PLAY:
if key == KeyValues.UP:
self.player.move_up()
if key == KeyValues.DOWN:
self.player.move_down()
if key == KeyValues.LEFT:
self.player.move_left()
if key == KeyValues.RIGHT:
self.player.move_right()
if self.state == GameMode.MAINMENU:
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)
2020-10-23 13:14:19 +00:00
class Player:
# FIXME Should be elsewhere, only useful to don't break the previous code
y: int = 0
x: int = 0
2020-11-06 14:33:26 +00:00
def move_up(self) -> None:
2020-10-23 13:14:19 +00:00
self.y -= 1
2020-11-06 14:33:26 +00:00
def move_down(self) -> None:
2020-10-23 13:14:19 +00:00
self.y += 1
2020-11-06 14:33:26 +00:00
def move_left(self) -> None:
2020-10-23 13:14:19 +00:00
self.x -= 1
2020-11-06 14:33:26 +00:00
def move_right(self) -> None:
2020-10-23 13:14:19 +00:00
self.x += 1