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/form?a=blobdiff_plain;f=rogue_chat_curses.py;h=2207220dda4cf31f69a46c77e14683ff9cf5ca2c;hb=f403ec1356ebb44a70efe60cc21de31e3dccd92c;hp=3369aef86744b5ee00ea5e4b673341da9ff3d627;hpb=e67306357a830cabdd5ce86b2b333499d99da325;p=plomrogue2 diff --git a/rogue_chat_curses.py b/rogue_chat_curses.py index 3369aef..2207220 100755 --- a/rogue_chat_curses.py +++ b/rogue_chat_curses.py @@ -72,14 +72,19 @@ 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(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): @@ -118,7 +123,7 @@ def cmd_GAME_STATE_COMPLETE(game): 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') @@ -155,14 +160,18 @@ def cmd_TASKS(game, tasks_comma_separated): 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) @@ -171,7 +180,8 @@ class Game(GameBase): 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) @@ -191,6 +201,8 @@ class Game(GameBase): 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): @@ -245,6 +257,8 @@ class TUI: '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', @@ -289,7 +303,9 @@ class TUI: 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') @@ -338,7 +354,7 @@ class TUI: 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 …') @@ -429,7 +445,10 @@ class TUI: 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: @@ -473,24 +492,30 @@ class TUI: for y in range(self.game.map_geometry.size.y): start = self.game.map_geometry.size.x * y end = start + self.game.map_geometry.size.x - map_lines_split += [list(map_content[start:end])] + map_lines_split += [[c + ' ' for c in map_content[start:end]]] if self.map_mode == 'terrain': + used_positions = [] for t in self.game.things: - map_lines_split[t.position.y][t.position.x] = '@' + symbol = self.game.thing_types[t.type_] + if t.position in used_positions: + map_lines_split[t.position.y][t.position.x] = symbol + '+' + else: + map_lines_split[t.position.y][t.position.x] = symbol + ' ' + used_positions += [t.position] if self.mode.shows_info: - map_lines_split[self.explorer.y][self.explorer.x] = '?' + map_lines_split[self.explorer.y][self.explorer.x] = '??' map_lines = [] if type(self.game.map_geometry) == MapGeometryHex: indent = 0 for line in map_lines_split: - map_lines += [indent*' ' + ' '.join(line)] + map_lines += [indent*' ' + ''.join(line)] indent = 0 if indent else 1 else: for line in map_lines_split: 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 @@ -515,6 +540,10 @@ class TUI: 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' @@ -703,6 +732,10 @@ class TUI: 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: