X-Git-Url: https://plomlompom.com/repos/feed.xml?a=blobdiff_plain;f=rogue_chat_curses.py;h=70060275893245d4e63ba5e2838f53dbd1e53fd6;hb=5f77cabba400be428d6d402d9642836e449bd332;hp=1f93dd808b690d488b0cf9f93fd3ed80a72fa50e;hpb=0f1e35f5f1a318d6e3e610085babd46946ad3600;p=plomrogue2 diff --git a/rogue_chat_curses.py b/rogue_chat_curses.py index 1f93dd8..7006027 100755 --- a/rogue_chat_curses.py +++ b/rogue_chat_curses.py @@ -38,7 +38,7 @@ mode_helps = { }, 'take_thing': { 'short': 'take thing', - 'intro': '', + 'intro': 'Pick up a thing in reach by entering its index number. Enter nothing to abort.', 'long': 'You see a list of things which you could pick up. Enter the target thing\'s index, or, to leave, nothing.' }, 'admin_thing_protect': { @@ -84,7 +84,7 @@ mode_helps = { 'chat': { 'short': 'chat', 'intro': '', - 'long': 'This mode allows you to engage in chit-chat with other users. Any line you enter into the input prompt that does not start with a "/" will be sent out to nearby players – but barriers and distance will reduce what they can read, so stand close to them to ensure they get your message. Lines that start with a "/" are used for commands like:' + 'long': 'This mode allows you to engage in chit-chat with other users. Any line you enter into the input prompt that does not start with a "/" will be sent out to nearby players – but barriers and distance will reduce what they can read, so stand close to them to ensure they get your message. Lines that start with a "/" are used for commands like:\n\n/nick NAME – re-name yourself to NAME' }, 'login': { 'short': 'login', @@ -194,7 +194,7 @@ def cmd_PLAYER_ID(game, player_id): game.player_id = player_id cmd_PLAYER_ID.argtypes = 'int:nonneg' -def cmd_THING(game, yx, thing_type, protection, thing_id): +def cmd_THING(game, yx, thing_type, protection, thing_id, portable): t = game.get_thing(thing_id) if not t: t = ThingBase(game, thing_id) @@ -202,7 +202,8 @@ def cmd_THING(game, yx, thing_type, protection, thing_id): t.position = yx t.type_ = thing_type t.protection = protection -cmd_THING.argtypes = 'yx_tuple:nonneg string:thing_type char int:nonneg' + t.portable = portable +cmd_THING.argtypes = 'yx_tuple:nonneg string:thing_type char int:nonneg bool' def cmd_THING_NAME(game, thing_id, name): t = game.get_thing(thing_id) @@ -291,6 +292,14 @@ def cmd_THING_TYPE(game, thing_type, symbol_hint): game.thing_types[thing_type] = symbol_hint cmd_THING_TYPE.argtypes = 'string char' +def cmd_THING_INSTALLED(game, thing_id): + game.get_thing(thing_id).installed = True +cmd_THING_INSTALLED.argtypes = 'int:pos' + +def cmd_THING_CARRYING(game, thing_id): + game.get_thing(thing_id).carrying = True +cmd_THING_CARRYING.argtypes = 'int:pos' + def cmd_TERRAIN(game, terrain_char, terrain_desc): game.terrains[terrain_char] = terrain_desc cmd_TERRAIN.argtypes = 'char string' @@ -325,6 +334,8 @@ class Game(GameBase): self.register_command(cmd_THING_TYPE) self.register_command(cmd_THING_NAME) self.register_command(cmd_THING_CHAR) + self.register_command(cmd_THING_CARRYING) + self.register_command(cmd_THING_INSTALLED) self.register_command(cmd_TERRAIN) self.register_command(cmd_MAP) self.register_command(cmd_MAP_CONTROL) @@ -427,7 +438,8 @@ class TUI: self.mode_play.available_modes = ["chat", "study", "edit", "admin_enter", "command_thing", "take_thing"] self.mode_play.available_actions = ["move", "drop_thing", - "teleport", "door", "consume"] + "teleport", "door", "consume", + "install"] self.mode_study.available_modes = ["chat", "play", "admin_enter", "edit"] self.mode_study.available_actions = ["toggle_map_mode", "move_explorer"] self.mode_admin.available_modes = ["admin_thing_protect", "control_pw_type", @@ -474,6 +486,7 @@ class TUI: 'teleport': 'p', 'consume': 'C', 'door': 'D', + 'install': 'I', 'help': 'h', 'toggle_map_mode': 'L', 'toggle_tile_draw': 'm', @@ -623,11 +636,22 @@ class TUI: else: self.log_msg('@ enter username') elif self.mode.name == 'take_thing': - self.log_msg('selectable things:') + self.log_msg('Portable things in reach for pick-up:') player = self.game.get_thing(self.game.player_id) + select_range = [player.position, + player.position + YX(0,-1), + player.position + YX(0, 1), + player.position + YX(-1, 0), + player.position + YX(1, 0)] + if type(self.game.map_geometry) == MapGeometryHex: + if player.position.y % 2: + select_range += [player.position + YX(-1, 1), + player.position + YX(1, 1)] + else: + select_range += [player.position + YX(-1, -1), + player.position + YX(1, -1)] self.selectables = [t for t in self.game.things - if t != player and t.type_ != 'Player' - and t.position == player.position] + if t.portable and t.position in select_range] if len(self.selectables) == 0: self.log_msg('none') else: @@ -701,6 +725,8 @@ class TUI: info += t.thing_char if hasattr(t, 'name'): info += ' (%s)' % t.name + if hasattr(t, 'installed'): + info += ' / installed' return info def loop(self, stdscr): @@ -834,6 +860,8 @@ class TUI: meta_char = t.thing_char if t.position in used_positions: meta_char = '+' + if hasattr(t, 'carrying') and t.carrying: + meta_char = '$' map_lines_split[t.position.y][t.position.x] = symbol + meta_char used_positions += [t.position] @@ -868,7 +896,7 @@ class TUI: term_x = max(0, -self.offset.x) map_y = max(0, self.offset.y) map_x = max(0, self.offset.x) - while (term_y < self.size.y and map_y < self.game.map_geometry.size.y): + while term_y < self.size.y and map_y < len(self.map_lines): to_draw = self.map_lines[map_y][map_x:self.window_width + self.offset.x] safe_addstr(term_y, term_x, to_draw) term_y += 1 @@ -891,12 +919,6 @@ class TUI: key = self.keys[action] content += '[%s] – %s\n' % (key, action_descriptions[action]) content += '\n' - if self.mode.name == 'chat': - content += '/nick NAME – re-name yourself to NAME\n' - content += '/%s or /play – switch to play mode\n' % self.keys['switch_to_play'] - content += '/%s or /study – switch to study mode\n' % self.keys['switch_to_study'] - content += '/%s or /edit – switch to world edit mode\n' % self.keys['switch_to_edit'] - content += '/%s or /admin – switch to admin mode\n' % self.keys['switch_to_admin_enter'] content += self.mode.list_available_modes(self) for i in range(self.size.y): safe_addstr(i, @@ -937,6 +959,7 @@ class TUI: 'drop_thing': 'drop thing', 'toggle_map_mode': 'toggle map view', 'toggle_tile_draw': 'toggle protection character drawing', + 'install': '(un-)install', 'door': 'open/close', 'consume': 'consume', } @@ -946,6 +969,7 @@ class TUI: 'take_thing': 'PICK_UP', 'drop_thing': 'DROP', 'door': 'DOOR', + 'install': 'INSTALL', 'move': 'MOVE', 'command': 'COMMAND', 'consume': 'INTOXICATE', @@ -995,6 +1019,12 @@ class TUI: reset_screen_size() elif self.mode.has_input_prompt and key == 'KEY_BACKSPACE': self.input_ = self.input_[:-1] + elif self.mode.has_input_prompt and key == '\n' and self.input_ == ''\ + and self.mode.name in {'chat', 'command_thing', 'take_thing', + 'admin_enter'}: + if self.mode.name != 'chat': + self.log_msg('@ aborted') + self.switch_mode('play') elif self.mode.has_input_prompt and key == '\n' and self.input_ == '/help': self.show_help = True self.input_ = "" @@ -1011,24 +1041,18 @@ class TUI: self.send('LOGIN ' + quote(self.input_)) self.input_ = "" elif self.mode.name == 'take_thing' and key == '\n': - if self.input_ == '': - self.log_msg('@ aborted') - else: - try: - i = int(self.input_) - if i < 0 or i >= len(self.selectables): - self.log_msg('? invalid index, aborted') - else: - self.send('TASK:PICK_UP %s' % self.selectables[i].id_) - except ValueError: + try: + i = int(self.input_) + if i < 0 or i >= len(self.selectables): self.log_msg('? invalid index, aborted') + else: + self.send('TASK:PICK_UP %s' % self.selectables[i].id_) + except ValueError: + self.log_msg('? invalid index, aborted') self.input_ = '' self.switch_mode('play') elif self.mode.name == 'command_thing' and key == '\n': - if self.input_ == '': - self.log_msg('@ aborted') - self.switch_mode('play') - elif task_action_on('command'): + if task_action_on('command'): self.send('TASK:COMMAND ' + quote(self.input_)) self.input_ = "" elif self.mode.name == 'control_pw_pw' and key == '\n': @@ -1071,16 +1095,8 @@ class TUI: elif self.mode.name == 'chat' and key == '\n': if self.input_ == '': continue - if self.input_[0] == '/': # FIXME fails on empty input - if self.input_ in {'/' + self.keys['switch_to_play'], '/play'}: - self.switch_mode('play') - elif self.input_ in {'/' + self.keys['switch_to_study'], '/study'}: - self.switch_mode('study') - elif self.input_ in {'/' + self.keys['switch_to_edit'], '/edit'}: - self.switch_mode('edit') - elif self.input_ in {'/' + self.keys['switch_to_admin_enter'], '/admin'}: - self.switch_mode('admin_enter') - elif self.input_.startswith('/nick'): + if self.input_[0] == '/': + if self.input_.startswith('/nick'): tokens = self.input_.split(maxsplit=1) if len(tokens) == 2: self.send('NICK ' + quote(tokens[1])) @@ -1126,6 +1142,8 @@ class TUI: self.send('TASK:DOOR') elif key == self.keys['consume'] and task_action_on('consume'): self.send('TASK:INTOXICATE') + elif key == self.keys['install'] and task_action_on('install'): + self.send('TASK:INSTALL') elif key == self.keys['teleport']: player = self.game.get_thing(self.game.player_id) if player.position in self.game.portals: