X-Git-Url: https://plomlompom.com/repos/berlin_corona.txt?a=blobdiff_plain;f=rogue_chat_curses.py;h=0644a4ccc439ebda77eacce232162748a7aeabac;hb=6a70ba4e9d6e3ff89b2cdd40ef65e600e6ed6548;hp=3369aef86744b5ee00ea5e4b673341da9ff3d627;hpb=e67306357a830cabdd5ce86b2b333499d99da325;p=plomrogue2 diff --git a/rogue_chat_curses.py b/rogue_chat_curses.py index 3369aef..0644a4c 100755 --- a/rogue_chat_curses.py +++ b/rogue_chat_curses.py @@ -72,16 +72,27 @@ 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_THING_CHAR(game, thing_id, c): + t = game.get_thing(thing_id) + if t: + t.player_char = c +cmd_THING_CHAR.argtypes = 'int:nonneg char' + def cmd_MAP(game, geometry, size, content): map_geometry_class = globals()['MapGeometry' + geometry] game.map_geometry = map_geometry_class(size) @@ -118,10 +129,6 @@ 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) - if player.position in game.portals: - game.tui.teleport_target_host = game.portals[player.position] - game.tui.switch_mode('teleport') game.turn_complete = True game.tui.do_refresh = True cmd_GAME_STATE_COMPLETE.argtypes = '' @@ -155,14 +162,22 @@ 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_TERRAIN(game, terrain_char, terrain_desc): + game.terrains[terrain_char] = terrain_desc +cmd_TERRAIN.argtypes = 'char string' + 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,8 +186,11 @@ 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_THING_CHAR) + self.register_command(cmd_TERRAIN) self.register_command(cmd_MAP) self.register_command(cmd_MAP_CONTROL) self.register_command(cmd_PORTAL) @@ -187,10 +205,13 @@ class Game(GameBase): self.player_id = -1 self.info_db = {} self.portals = {} + self.terrains = {} 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): @@ -224,7 +245,6 @@ class TUI: self.mode_waiting_for_server = self.Mode('waiting_for_server', 'Waiting for a server response.', is_intro=True) self.mode_login = self.Mode('login', 'Pick your player name.', has_input_prompt=True, is_intro=True) self.mode_post_login_wait = self.Mode('post_login_wait', 'Waiting for a server response.', is_intro=True) - self.mode_teleport = self.Mode('teleport', 'Follow the instructions to re-connect and log-in to another server, or enter anything else to abort.', has_input_prompt=True) self.mode_password = self.Mode('password', 'This mode allows you to change the password that you send to authorize yourself for editing password-protected map tiles. Hit return to confirm and leave.', has_input_prompt=True) self.game = Game() self.game.tui = self @@ -245,6 +265,9 @@ class TUI: 'switch_to_study': '?', 'switch_to_edit': 'm', 'flatten': 'F', + 'take_thing': 'z', + 'drop_thing': 'u', + 'teleport': 'p', 'toggle_map_mode': 'M', 'hex_move_upleft': 'w', 'hex_move_upright': 'e', @@ -289,7 +312,11 @@ class TUI: self.socket_thread = threading.Thread(target=self.socket.run) self.socket_thread.start() self.disconnected = False + self.game.thing_types = {} + self.game.terrains = {} self.socket.send('TASKS') + self.socket.send('TERRAINS') + self.socket.send('THING_TYPES') self.switch_mode('login') except ConnectionRefusedError: self.log_msg('@ server connect failure') @@ -338,7 +365,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 …') @@ -349,9 +376,6 @@ class TUI: self.send('LOGIN ' + quote(self.login_name)) else: self.log_msg('@ enter username') - elif self.mode.name == 'teleport': - self.log_msg("@ May teleport to %s" % (self.teleport_target_host)), - self.log_msg("@ Enter 'YES!' to enthusiastically affirm."); self.restore_input_values() def loop(self, stdscr): @@ -426,10 +450,20 @@ class TUI: pos_i = self.explorer.y * self.game.map_geometry.size.x + self.explorer.x info = 'outside field of view' if self.game.fov[pos_i] == '.': - info = 'TERRAIN: %s\n' % self.game.map_content[pos_i] + terrain_char = self.game.map_content[pos_i] + terrain_desc = '?' + if terrain_char in self.game.terrains: + terrain_desc = self.game.terrains[terrain_char] + info = 'TERRAIN: "%s" / %s\n' % (terrain_char, terrain_desc) for t in self.game.things: if t.position == self.explorer: - info += 'PLAYER @: %s\n' % t.name + info += 'THING: %s / %s' % (t.type_, + self.game.thing_types[t.type_]) + if hasattr(t, 'player_char'): + info += t.player_char + if hasattr(t, 'name'): + info += ' (%s)' % t.name + info += '\n' if self.explorer in self.game.portals: info += 'PORTAL: ' + self.game.portals[self.explorer] + '\n' else: @@ -473,24 +507,34 @@ 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': + for p in self.game.portals.keys(): + map_lines_split[p.y][p.x] = 'P ' + used_positions = [] for t in self.game.things: - map_lines_split[t.position.y][t.position.x] = '@' + symbol = self.game.thing_types[t.type_] + meta_char = ' ' + if hasattr(t, 'player_char'): + meta_char = t.player_char + if t.position in used_positions: + meta_char = '+' + map_lines_split[t.position.y][t.position.x] = symbol + meta_char + 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)] + 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,8 +559,13 @@ 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 += '[%s] – teleport to other space\n' % self.keys['teleport'] content += 'Other modes available from here:\n' content += '[%s] – chat mode\n' % self.keys['switch_to_chat'] content += '[%s] – study mode\n' % self.keys['switch_to_study'] @@ -666,14 +715,6 @@ class TUI: quote(self.password))) self.input_ = "" self.switch_mode('play') - elif self.mode == self.mode_teleport and key == '\n': - if self.input_ == 'YES!': - self.host = self.teleport_target_host - self.reconnect() - else: - self.log_msg('@ teleport aborted') - self.switch_mode('play') - self.input_ = '' elif self.mode == self.mode_study: if key == self.keys['switch_to_chat']: self.switch_mode('chat') @@ -703,6 +744,18 @@ 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 == self.keys['teleport']: + player = self.game.get_thing(self.game.player_id) + if player.position in self.game.portals: + self.host = self.game.portals[player.position] + self.reconnect() + else: + self.flash() + self.log_msg('? not standing on portal') 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: