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(game, yx, thing_type, thing_id):
+ t = game.get_thing(thing_id)
+ if not t:
+ t = ThingBase(game, thing_id)
+ game.things += [t]
+ t.position = yx
+ t.type_ = thing_type
+cmd_THING.argtypes = 'yx_tuple:nonneg string:thing_type int:nonneg'
def cmd_THING_NAME(game, thing_id, name):
- t = game.get_thing(thing_id, True)
- t.name = name
+ t = game.get_thing(thing_id)
+ if t:
+ t.name = name
cmd_THING_NAME.argtypes = 'int:nonneg string'
def cmd_MAP(game, geometry, size, content):
game.tui.switch_mode('play')
if game.tui.mode.shows_info:
game.tui.query_info()
- player = game.get_thing(game.player_id, False)
+ player = game.get_thing(game.player_id)
if player.position in game.portals:
game.tui.teleport_target_host = game.portals[player.position]
game.tui.switch_mode('teleport')
game.tasks = tasks_comma_separated.split(',')
cmd_TASKS.argtypes = 'string'
+def cmd_THING_TYPE(game, thing_type, symbol_hint):
+ game.thing_types[thing_type] = symbol_hint
+cmd_THING_TYPE.argtypes = 'string char'
+
def cmd_PONG(game):
pass
cmd_PONG.argtypes = ''
class Game(GameBase):
- thing_type = ThingBase
turn_complete = False
tasks = {}
+ thing_types = {}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.register_command(cmd_CHAT)
self.register_command(cmd_PLAYER_ID)
self.register_command(cmd_TURN)
- self.register_command(cmd_THING_POS)
+ self.register_command(cmd_THING)
+ self.register_command(cmd_THING_TYPE)
self.register_command(cmd_THING_NAME)
self.register_command(cmd_MAP)
self.register_command(cmd_MAP_CONTROL)
def get_string_options(self, string_option_type):
if string_option_type == 'map_geometry':
return ['Hex', 'Square']
+ elif string_option_type == 'thing_type':
+ return self.thing_types.keys()
return None
def get_command(self, command_name):
'switch_to_study': '?',
'switch_to_edit': 'm',
'flatten': 'F',
+ 'take_thing': 'z',
+ 'drop_thing': 'u',
'toggle_map_mode': 'M',
'hex_move_upleft': 'w',
'hex_move_upright': 'e',
self.socket_thread = threading.Thread(target=self.socket.run)
self.socket_thread.start()
self.disconnected = False
+ self.game.thing_types = {}
self.socket.send('TASKS')
+ self.socket.send('THING_TYPES')
self.switch_mode('login')
except ConnectionRefusedError:
self.log_msg('@ server connect failure')
self.map_mode = 'terrain'
self.mode = getattr(self, 'mode_' + mode_name)
if self.mode.shows_info:
- player = self.game.get_thing(self.game.player_id, False)
+ player = self.game.get_thing(self.game.player_id)
self.explorer = YX(player.position.y, player.position.x)
if self.mode.name == 'waiting_for_server':
self.log_msg('@ waiting for server …')
info = 'TERRAIN: %s\n' % self.game.map_content[pos_i]
for t in self.game.things:
if t.position == self.explorer:
- info += 'PLAYER @: %s\n' % t.name
+ info += 'THING: %s' % t.type_
+ if hasattr(t, 'name'):
+ info += ' (name: %s)' % t.name
+ info += '\n'
if self.explorer in self.game.portals:
info += 'PORTAL: ' + self.game.portals[self.explorer] + '\n'
else:
map_lines_split += [list(map_content[start:end])]
if self.map_mode == 'terrain':
for t in self.game.things:
- map_lines_split[t.position.y][t.position.x] = '@'
+ symbol = self.game.thing_types[t.type_]
+ map_lines_split[t.position.y][t.position.x] = symbol
if self.mode.shows_info:
map_lines_split[self.explorer.y][self.explorer.x] = '?'
map_lines = []
map_lines += [' '.join(line)]
window_center = YX(int(self.size.y / 2),
int(self.window_width / 2))
- player = self.game.get_thing(self.game.player_id, False)
+ player = self.game.get_thing(self.game.player_id)
center = player.position
if self.mode.shows_info:
center = self.explorer
content += "Available actions:\n"
if 'MOVE' in self.game.tasks:
content += "[%s] – move player\n" % ','.join(self.movement_keys)
+ if 'PICK_UP' in self.game.tasks:
+ content += "[%s] – take thing under player\n" % self.keys['take_thing']
+ if 'DROP' in self.game.tasks:
+ content += "[%s] – drop carried thing\n" % self.keys['drop_thing']
if 'FLATTEN_SURROUNDINGS' in self.game.tasks:
content += "[%s] – flatten player's surroundings\n" % self.keys['flatten']
content += 'Other modes available from here:\n'
elif key == self.keys['flatten'] and\
'FLATTEN_SURROUNDINGS' in self.game.tasks:
self.send('TASK:FLATTEN_SURROUNDINGS ' + quote(self.password))
+ elif key == self.keys['take_thing'] and 'PICK_UP' in self.game.tasks:
+ self.send('TASK:PICK_UP')
+ elif key == self.keys['drop_thing'] and 'DROP' in self.game.tasks:
+ self.send('TASK:DROP')
elif key in self.movement_keys and 'MOVE' in self.game.tasks:
self.send('TASK:MOVE ' + self.movement_keys[key])
elif self.mode == self.mode_edit: