diff --git a/entity.py b/entity.py index 0b784f2..4542011 100644 --- a/entity.py +++ b/entity.py @@ -7,17 +7,40 @@ class Item(Entity): pass class Creature(Entity): - def __init__(self): - self.speed = 1 + def __init__(self, codename): + self.speed = CREATURES_DATA[codename]["speed"] + self.max_hp = CREATURES_DATA[codename]["max_hp"] + self.hp = self.max_hp + self.damage = CREATURES_DATA[codename]["damage"] self.action: Action = NA() class Player(Creature): def __init__(self): - super().__init__() + super().__init__("player") + self.main_hand = None class Enemy(Creature): - def __init__(self): - super().__init__() + def __init__(self, codename): + super().__init__(codename) def calculate_action(self): - self.action: Action = Idle() \ No newline at end of file + self.action: Action = Idle() + +CREATURES_DATA = { + "player": { + "max_hp": 20, + "speed": 10, + "damage": 1 + }, + "slime": { + "max_hp": 5, + "speed": 5, + "damage": 1 + } +} + +ITEMS_DATA = { + "none": { + "damage": 1 + } +} \ No newline at end of file diff --git a/floor.py b/floor.py index 561c95e..4dfccb4 100644 --- a/floor.py +++ b/floor.py @@ -71,5 +71,4 @@ class Floor: self.entities = EntityMap() def get_tile(self, x, y) -> TileType: - print(x,y) return self.grid[x][y] diff --git a/game.py b/game.py index 2be6e9b..41c9273 100644 --- a/game.py +++ b/game.py @@ -20,6 +20,10 @@ class Game: self.ticks = 0 self.schedule = {} self.redirect_io('prints.log', 'errors.log') + self.hud_height = 3 + self.menu_width = 20 + self.camera = (0, 0) + self.hud = 0 def __del__(self): self.restore_io() @@ -43,7 +47,7 @@ class Game: Runs the game """ self.instance_creature(3, 3, self.player) - self.instance_creature(6, 4, Enemy()) + self.instance_creature(6, 4, Enemy("slime")) self.render() while not self.should_exit: self.step() @@ -71,8 +75,16 @@ class Game: """ Renders the game """ - for x in range(self.floor.width): - for y in range(self.floor.height): + + (term_width, term_height) = self.term.get_dimensions() + (floor_frame_width, floor_frame_height) = (term_width - self.menu_width, term_height - self.hud_height) + + self.term.clear() + + # Floor + + for x in range(min(self.floor.width, floor_frame_width)): + for y in range(min(self.floor.height, floor_frame_height)): if (x, y) in self.floor.entities.pos_creatures: self.term.put_char(x, y, TEXTURES[self.floor.entities.pos_creatures[(x,y)].__class__]) elif (x, y) in self.floor.entities.items: @@ -80,6 +92,18 @@ class Game: else: self.term.put_char(x, y, TEXTURES[self.floor.get_tile(x, y)]) + # HUD + for x in range(floor_frame_width): + for y in range(floor_frame_height, term_height): + self.term.put_char(x, y, ' ') + self.term.put_string(0, floor_frame_height, f"HP:{self.player.hp}/{self.player.max_hp}" ) + self.term.put_string(0, floor_frame_height + 1, f"MH:{'None' if not self.player.main_hand else 'Item'}; Damage: {self.player.damage}" ) + + # Menu + for x in range(floor_frame_width, term_width): + for y in range(term_height): + self.term.put_char(x, y, 'M') + def step(self): """ Perfoms a step in the game. Sets the `action_was_performed` attribute accordingly @@ -123,6 +147,10 @@ class Game: keycode = self.term.get_key() if keycode == "q": self.should_exit = True + elif keycode == "p": + self.hud += 1 + print(self.hud, flush=True) + self.input_event() elif keycode == "KEY_RIGHT": self.player.action = Move(1, 0) elif keycode == "KEY_LEFT": diff --git a/terminal.py b/terminal.py index b1d3614..a39a3d3 100644 --- a/terminal.py +++ b/terminal.py @@ -1,4 +1,5 @@ import curses +from typing import Tuple KEYCODES = { curses.KEY_LEFT: "KEY_LEFT", @@ -27,6 +28,9 @@ class Terminal: curses.echo() curses.endwin() + def clear(self): + self.scr.erase() + def get_key(self) -> str: """ Blocks until a key is read @@ -41,4 +45,16 @@ class Terminal: """ Prints a char at the specified position """ - self.scr.addch(y, x, char) \ No newline at end of file + self.scr.insch(y, x, char) + + def put_string(self, x, y, string): + """ + Prints a string from the specified position + """ + self.scr.addstr(y, x, string) + + def get_dimensions(self) -> Tuple[int, int]: + """ + Returns the screen dimensions as (width, height) + """ + return self.scr.getmaxyx()[::-1] \ No newline at end of file