diff --git a/dungeonbattle/entities/player.py b/dungeonbattle/entities/player.py index 8b5bc3a..53f0ccf 100644 --- a/dungeonbattle/entities/player.py +++ b/dungeonbattle/entities/player.py @@ -6,13 +6,13 @@ class Player(FightingEntity): strength = 5 def move_up(self) -> None: - self.y -= 1 + self.check_move(self.y - 1, self.x, True) def move_down(self) -> None: - self.y += 1 + self.check_move(self.y + 1, self.x, True) def move_left(self) -> None: - self.x -= 1 + self.check_move(self.y, self.x - 1, True) def move_right(self) -> None: - self.x += 1 + self.check_move(self.y, self.x + 1, True) diff --git a/dungeonbattle/game.py b/dungeonbattle/game.py index 5e0acad..8f5bb5a 100644 --- a/dungeonbattle/game.py +++ b/dungeonbattle/game.py @@ -23,7 +23,7 @@ class Game: m = Map.load("example_map.txt") player = Player() self.player = player - m.entities.append(player) + m.add_entity(player) player.move(1, 6) d = MapDisplay(m, player) while True: @@ -43,4 +43,3 @@ class Game: self.player.move_left() if key == 'd' or key == 'KEY_RIGHT': self.player.move_right() - diff --git a/dungeonbattle/interfaces.py b/dungeonbattle/interfaces.py index 6546523..f9d177d 100644 --- a/dungeonbattle/interfaces.py +++ b/dungeonbattle/interfaces.py @@ -11,12 +11,18 @@ class Map: height: int tiles: list - def __init__(self, width: int, height: int, tiles: list, - entities: list = None): + def __init__(self, width: int, height: int, tiles: list): self.width = width self.height = height self.tiles = tiles - self.entities = entities or [] + self.entities = [] + + def add_entity(self, entity: "Entity") -> None: + """ + Register a new entity in the map. + """ + self.entities.append(entity) + entity.map = self @staticmethod def load(filename: str): @@ -39,7 +45,7 @@ class Map: tiles = [[Tile(c) for x, c in enumerate(line)] for y, line in enumerate(lines)] - return Map(width, height, tiles, []) + return Map(width, height, tiles) def draw_string(self) -> str: """ @@ -68,11 +74,19 @@ class Tile(Enum): class Entity: y: int x: int + map: Map def __init__(self): self.y = 0 self.x = 0 + def check_move(self, y: int, x: int, move_if_possible: bool = False)\ + -> bool: + tile = self.map.tiles[y][x] + if tile.can_walk() and move_if_possible: + self.move(y, x) + return tile.can_walk() + def move(self, y: int, x: int) -> None: self.y = y self.x = x diff --git a/dungeonbattle/tests/entities_test.py b/dungeonbattle/tests/entities_test.py index f7d75f1..043919a 100644 --- a/dungeonbattle/tests/entities_test.py +++ b/dungeonbattle/tests/entities_test.py @@ -59,8 +59,8 @@ class TestEntities(unittest.TestCase): """ item = Bomb() squirrel = Squirrel() - self.map.entities.append(item) - self.map.entities.append(squirrel) + self.map.add_entity(item) + self.map.add_entity(squirrel) squirrel.health = 2 squirrel.move(41, 42) item.act(self.map)