+def cmd_TURN(game, n):
+ game.turn = n
+ game.things = []
+ game.portals = {}
+ game.turn_complete = False
+cmd_TURN.argtypes = 'int:nonneg'
+
+def cmd_LOGIN_OK(game):
+ game.tui.switch_mode('post_login_wait')
+ game.tui.send('GET_GAMESTATE')
+ game.tui.log_msg('@ welcome')
+cmd_LOGIN_OK.argtypes = ''
+
+def cmd_CHAT(game, msg):
+ game.tui.log_msg('# ' + msg)
+ game.tui.do_refresh = True
+cmd_CHAT.argtypes = 'string'
+
+def cmd_PLAYER_ID(game, player_id):
+ game.player_id = player_id
+cmd_PLAYER_ID.argtypes = 'int:nonneg'
+
+def cmd_THING_POS(game, thing_id, position):
+ t = game.get_thing(thing_id, True)
+ t.position = position
+cmd_THING_POS.argtypes = 'int:nonneg yx_tuple:nonneg'
+
+def cmd_THING_NAME(game, thing_id, name):
+ t = game.get_thing(thing_id, True)
+ t.name = name
+cmd_THING_NAME.argtypes = 'int:nonneg string'
+
+def cmd_MAP(game, size, content):
+ game.map_geometry.size = size
+ game.map_content = content
+cmd_MAP.argtypes = 'yx_tuple:pos string'
+
+def cmd_GAME_STATE_COMPLETE(game):
+ game.info_db = {}
+ if game.tui.mode.name == 'post_login_wait':
+ game.tui.switch_mode('play')
+ game.tui.help()
+ if game.tui.mode.shows_info:
+ game.tui.query_info()
+ player = game.get_thing(game.player_id, False)
+ if player.position in game.portals:
+ host, port = game.portals[player.position].split(':')
+ game.tui.teleport_target_host = host
+ game.tui.teleport_target_port = port
+ game.tui.switch_mode('teleport')
+ game.turn_complete = True
+ game.tui.do_refresh = True
+cmd_GAME_STATE_COMPLETE.argtypes = ''
+
+def cmd_PORTAL(game, position, msg):
+ game.portals[position] = msg
+cmd_PORTAL.argtypes = 'yx_tuple:nonneg string'
+
+def cmd_PLAY_ERROR(game, msg):
+ game.tui.flash()
+ game.tui.do_refresh = True
+cmd_PLAY_ERROR.argtypes = 'string'
+
+def cmd_GAME_ERROR(game, msg):
+ game.tui.log_msg('? game error: ' + msg)
+ game.tui.do_refresh = True
+cmd_GAME_ERROR.argtypes = 'string'
+
+def cmd_ARGUMENT_ERROR(game, msg):
+ game.tui.log_msg('? syntax error: ' + msg)
+ game.tui.do_refresh = True
+cmd_ARGUMENT_ERROR.argtypes = 'string'
+
+def cmd_ANNOTATION(game, position, msg):
+ game.info_db[position] = msg
+ if game.tui.mode.shows_info:
+ game.tui.do_refresh = True
+cmd_ANNOTATION.argtypes = 'yx_tuple:nonneg string'
+
+class Game(GameBase):
+ commands = {'LOGIN_OK': cmd_LOGIN_OK,
+ 'CHAT': cmd_CHAT,
+ 'PLAYER_ID': cmd_PLAYER_ID,
+ 'TURN': cmd_TURN,
+ 'THING_POS': cmd_THING_POS,
+ 'THING_NAME': cmd_THING_NAME,
+ 'MAP': cmd_MAP,
+ 'PORTAL': cmd_PORTAL,
+ 'ANNOTATION': cmd_ANNOTATION,
+ 'GAME_STATE_COMPLETE': cmd_GAME_STATE_COMPLETE,
+ 'ARGUMENT_ERROR': cmd_ARGUMENT_ERROR,
+ 'GAME_ERROR': cmd_GAME_ERROR,
+ 'PLAY_ERROR': cmd_PLAY_ERROR}
+ thing_type = ThingBase
+ turn_complete = False
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ self.map_content = ''
+ self.player_id = -1
+ self.info_db = {}
+ self.portals = {}
+
+ def get_command(self, command_name):
+ from functools import partial
+ f = partial(self.commands[command_name], self)
+ f.argtypes = self.commands[command_name].argtypes
+ return f