From 0f7c3e5559d61d352ae529239e667e9da5e284fd Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Sun, 21 Apr 2019 21:00:50 +0200 Subject: [PATCH] Don't generate objects at illegal positions. Plus, refactor. --- new/example_client.py | 5 ++--- new/plomrogue/game.py | 18 ++++++++++++++++-- new/plomrogue/tasks.py | 4 ++-- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/new/example_client.py b/new/example_client.py index 45f5be0..675d0a2 100755 --- a/new/example_client.py +++ b/new/example_client.py @@ -320,9 +320,8 @@ class DescriptorWidget(TextLinesWidget): get_position_index(self.tui.examiner_position) terrain = self.tui.game.world.map_.terrain[pos_i] lines = [terrain] - for t in self.tui.game.world.things: - if t.position == self.tui.examiner_position: - lines += [t.type_] + for t in self.tui.game.world.things_at_pos(self.tui.examiner_position): + lines += [t.type_] return lines diff --git a/new/plomrogue/game.py b/new/plomrogue/game.py index 25cb3e7..da8fe1a 100755 --- a/new/plomrogue/game.py +++ b/new/plomrogue/game.py @@ -33,6 +33,13 @@ class WorldBase: return t return None + def things_at_pos(self, yx): + things = [] + for t in self.things: + if t.position == yx: + things += [t] + return things + class World(WorldBase): @@ -84,8 +91,15 @@ class World(WorldBase): def add_thing(type_): t = self.game.thing_types[type_](self) - t.position = (random.randint(0, yx[0] -1), - random.randint(0, yx[1] - 1)) + while True: + new_pos = (random.randint(0, yx[0] -1), + random.randint(0, yx[1] - 1)) + if self.map_[new_pos] != '.': + continue + if len(self.things_at_pos(new_pos)) > 0: + continue + break + t.position = new_pos self.things += [t] return t diff --git a/new/plomrogue/tasks.py b/new/plomrogue/tasks.py index c9ce45e..dfd22f7 100644 --- a/new/plomrogue/tasks.py +++ b/new/plomrogue/tasks.py @@ -41,8 +41,8 @@ class Task_MOVE(Task): raise GameError('would move outside map bounds') if self.thing.world.map_[test_pos] != '.': raise GameError('%s would move into illegal terrain' % self.thing.id_) - for t in self.thing.world.things: - if t.blocking and t.position == test_pos: + for t in self.thing.world.things_at_pos(test_pos): + if t.blocking: raise GameError('%s would move into other thing' % self.thing.id_) def do(self): -- 2.30.2