From 67d04440308c656f5baed5b96899729fe9bcb1e6 Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Mon, 14 Jan 2019 17:52:59 +0100 Subject: [PATCH] Hide objects outside of visible map. --- server.py | 3 ++- server_/game.py | 46 +++++++++++++++++++++++++++++++++++++--------- 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/server.py b/server.py index fc095b7..cf70699 100755 --- a/server.py +++ b/server.py @@ -163,7 +163,8 @@ class CommandHandler(game_common.Commander, server_.game.Commander): visible_map = self.world.get_player().get_visible_map() for y in range(self.world.map_.size[0]): self.send('VISIBLE_MAP_LINE %5s "%s"' % (y, visible_map.get_line(y))) - for thing in self.world.things: + visible_things = self.world.get_player().get_visible_things() + for thing in visible_things: self.send('THING_TYPE %s %s' % (thing.id_, thing.type_)) self.send('THING_POS %s %s' % (thing.id_, stringify_yx(thing.position))) diff --git a/server_/game.py b/server_/game.py index f6a5e9e..910d608 100644 --- a/server_/game.py +++ b/server_/game.py @@ -98,6 +98,7 @@ class Thing(game_common.Thing): super().__init__(*args, **kwargs) self.task = Task(self, 'wait') self.last_task_result = None + self._stencil = None def task_wait(self): return 'success' @@ -121,13 +122,16 @@ class Thing(game_common.Thing): def proceed(self, is_AI=True): """Further the thing in its tasks. - Decrements .task.todo; if it thus falls to <= 0, enacts method whose - name is 'task_' + self.task.name and sets .task = None. If is_AI, calls - .decide_task to decide a self.task. + Decrements .task.todo; if it thus falls to <= 0, enacts method + whose name is 'task_' + self.task.name and sets .task = + None. If is_AI, calls .decide_task to decide a self.task. + + Before doing anything, ensures an empty map visibility stencil + and checks that task is still possible, and aborts it + otherwise (for AI things, decides a new task). - Before doing anything, checks that task is still possible, and aborts - it otherwise (for AI things, decides a new task). """ + self._stencil = None try: self.task.check() except GameError as e: @@ -144,9 +148,11 @@ class Thing(game_common.Thing): if is_AI and self.task is None: self.decide_task() - def get_visible_map(self): + def get_stencil(self): + if self._stencil is not None: + return self._stencil size = self.world.map_.size - m = Map(size, ' '*size[0]*size[1]) + m = Map(self.world.map_.size, '?'*size[0]*size[1]) y_me = self.position[0] x_me = self.position[1] for y in range(m.size[0]): @@ -154,10 +160,32 @@ class Thing(game_common.Thing): for x in range(m.size[1]): if x in (x_me - 1, x_me, x_me + 1): pos = y * size[1] + x - c = self.world.map_.terrain[pos] - m.terrain = m.terrain[:pos] + c + m.terrain[pos+1:] + m.terrain = m.terrain[:pos] + '.' + m.terrain[pos+1:] + self._stencil = m + return self._stencil + + def get_visible_map(self): + stencil = self.get_stencil() + size = self.world.map_.size + size_i = self.world.map_.size[0] * self.world.map_.size[1] + m = Map(size, ' '*size_i) + for i in range(size_i): + if stencil.terrain[i] == '.': + c = self.world.map_.terrain[i] + m.terrain = m.terrain[:i] + c + m.terrain[i+1:] return m + def get_visible_things(self): + stencil = self.get_stencil() + visible_things = [] + for thing in self.world.things: + print('DEBUG .....') + width = self.world.map_.size[1] + pos_i = thing.position[0] * width + thing.position[1] + if stencil.terrain[pos_i] == '.': + visible_things += [thing] + return visible_things + class Commander(): -- 2.30.2