roguepy/game.py

65 lines
2.0 KiB
Python

from terminal import Terminal
from entity import Character, Player, Item
from actions import *
from floor import Floor, TileType
TEXTURES = {
TileType.WALL: '#',
TileType.AIR: '.',
Player: '@'
}
class Game:
def __init__(self):
self.term = Terminal()
self.player = Player()
self.floor = Floor(20, 10)
self.should_exit = False
def run(self):
"""
Runs the game
"""
self.floor.add_entity(3, 3, self.player)
while not self.should_exit:
self.render()
self.get_event()
self.step()
def render(self):
"""
Renders the game
"""
for x in range(self.floor.width):
for y in range(self.floor.height):
if (x, y) in self.floor.entities[Character]:
self.term.put_char(x, y, TEXTURES[Player])
elif (x, y) in self.floor.entities[Item]:
self.term.put_char(x, y, 'i')
else:
self.term.put_char(x, y, TEXTURES[self.floor.get_tile(x, y)])
def step(self):
"""
Performs a turn in the game
"""
for (pos, character) in dict(self.floor.entities[Character]).items():
if isinstance(character.action, Move):
character = self.floor.entities[Character].pop(pos)
self.floor.add_entity(pos[0] + character.action.x, pos[1] + character.action.y, character)
def get_event(self):
"""
Waits for a game event to happen
"""
keycode = self.term.get_key()
if keycode == "q":
self.should_exit = True
elif keycode == "KEY_RIGHT":
self.player.action = Move(1, 0)
elif keycode == "KEY_LEFT":
self.player.action = Move(-1, 0)
elif keycode == "KEY_DOWN":
self.player.action = Move(0, 1)
elif keycode == "KEY_UP":
self.player.action = Move(0, -1)