65 lines
2.0 KiB
Python
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) |