X-Git-Url: https://plomlompom.com/repos/%7B%7B%20web_path%20%7D%7D/decks/%7B%7Bdeck_id%7D%7D/cards/%7B%7Bcard_id%7D%7D/static/gitweb.css?a=blobdiff_plain;ds=sidebyside;f=server.py;h=6008346cfde27f0374e9b46817a5812c9dafcdd1;hb=3c28c76381a634dd23642abeb4f03a92ec4f1f94;hp=8a9d0578b210199c930f84d2484d4c236a697d4d;hpb=0fc41c2a7adfcf282beeea4e7df0fb7bfd6dc5ab;p=plomrogue2-experiments diff --git a/server.py b/server.py index 8a9d057..6008346 100755 --- a/server.py +++ b/server.py @@ -4,6 +4,7 @@ import socketserver import threading import queue from parser import ArgError, Parser +from server_.game import World, GameError # Avoid "Address already in use" errors. @@ -81,77 +82,6 @@ class IO_Handler(socketserver.BaseRequestHandler): self.request.close() -class Task: - - def __init__(self, name, args=(), kwargs={}): - self.name = name - self.args = args - self.kwargs = kwargs - self.todo = 1 - - -class Thing: - - def __init__(self, type_, position): - self.type = type_ - self.position = position - self.task = Task('wait') - - def task_wait(self): - pass - - def task_move(self, direction): - if direction == 'UP': - self.position[0] -= 1 - elif direction == 'DOWN': - self.position[0] += 1 - elif direction == 'RIGHT': - self.position[1] += 1 - elif direction == 'LEFT': - self.position[1] -= 1 - - def decide_task(self): - if self.position[1] > 1: - self.set_task('move', 'LEFT') - elif self.position[1] < 3: - self.set_task('move', 'RIGHT') - else: - self.set_task('wait') - - def set_task(self, task, *args, **kwargs): - self.task = Task(task, args, kwargs) - - 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. - """ - self.task.todo -= 1 - if self.task.todo <= 0: - task = getattr(self, 'task_' + self.task.name) - task(*self.task.args, **self.task.kwargs) - self.task = None - if is_AI and self.task is None: - self.decide_task() - - -class World: - - def __init__(self): - self.turn = 0 - self.map_size = (5, 5) - self.map_ = 'xxxxx\n' +\ - 'x...x\n' +\ - 'x.X.x\n' +\ - 'x...x\n' +\ - 'xxxxx' - self.things = [Thing('human', [3, 3]), Thing('monster', [1, 1])] - self.player_i = 0 - self.player = self.things[self.player_i] - - def fib(n): """Calculate n-th Fibonacci number. Very inefficiently.""" if n in (1, 2): @@ -182,6 +112,8 @@ class CommandHandler: command(connection_id=connection_id) except ArgError as e: self.send_to(connection_id, 'ARGUMENT ERROR: ' + str(e)) + except GameError as e: + self.send_to(connection_id, 'GAME ERROR: ' + str(e)) def send_to(self, connection_id, msg): """Send msg to client of connection_id.""" @@ -207,13 +139,25 @@ class CommandHandler: quoted += ['"'] return ''.join(quoted) + def quoted_map(self, map_string, map_width): + """Put \n into map_string at map_width intervals, return quoted whole.""" + map_lines = [] + map_size = len(map_string) + start_cut = 0 + while start_cut < map_size: + limit = start_cut + map_width + map_lines += [map_string[start_cut:limit]] + start_cut = limit + return self.quoted("\n".join(map_lines)) + def send_all_gamestate(self): """Send out game state data relevant to clients.""" self.send_all('NEW_TURN ' + str(self.world.turn)) self.send_all('MAP_SIZE ' + self.stringify_yx(self.world.map_size)) - self.send_all('TERRAIN\n' + self.quoted(self.world.map_)) + self.send_all('TERRAIN\n' + self.quoted_map(self.world.map_, + self.world.map_size[1])) for thing in self.world.things: - self.send_all('THING TYPE:' + thing.type + ' ' + self.send_all('THING TYPE:' + thing.type_ + ' ' + self.stringify_yx(thing.position)) def proceed_to_next_player_turn(self, connection_id):