+ 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:
+ 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
+
+
+def fib(n):
+ """Calculate n-th Fibonacci number. Very inefficiently."""
+ if n in (1, 2):
+ return 1
+ else:
+ return fib(n-1) + fib(n-2)
+
+
+class CommandHandler(game_common.Commander):
+
+ def __init__(self, game_file_name):
+ self.queues_out = {}
+ self.world = World()
+ self.parser = parser.Parser(self)
+ self.game_file_name = game_file_name
+ # self.pool and self.pool_result are currently only needed by the FIB
+ # command and the demo of a parallelized game loop in cmd_inc_p.
+ from multiprocessing import Pool
+ self.pool = Pool()
+ self.pool_result = None
+
+ def quote(self, string):
+ """Quote & escape string so client interprets it as single token."""
+ quoted = []
+ quoted += ['"']
+ for c in string:
+ if c in {'"', '\\'}:
+ quoted += ['\\']
+ quoted += [c]
+ quoted += ['"']
+ return ''.join(quoted)
+
+ def handle_input(self, input_, connection_id=None, store=True):
+ """Process input_ to command grammar, call command handler if found."""
+ from inspect import signature
+
+ def answer(connection_id, msg):
+ if connection_id:
+ self.send(msg, connection_id)
+ else:
+ print(msg)