X-Git-Url: https://plomlompom.com/repos/berlin_corona.txt?a=blobdiff_plain;f=rogue_chat_curses.py;h=6f136387b33f5353c1216fb13163cdb10da1ba93;hb=52b01fc00d6ea2c053f9022981498b97ebd05839;hp=c539062bcfe19db3e5d2fef294d7c220c2222eb9;hpb=35714a1e0616ada0be5929d5fb8100047e46cdd2;p=plomrogue2 diff --git a/rogue_chat_curses.py b/rogue_chat_curses.py index c539062..6f13638 100755 --- a/rogue_chat_curses.py +++ b/rogue_chat_curses.py @@ -41,11 +41,21 @@ mode_helps = { '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.' }, + 'drop_thing': { + 'short': 'drop thing', + 'intro': 'Enter number of direction to which you want to drop thing.', + 'long': 'Drop currently carried thing by entering the target direction index. Enter nothing to return to play mode..' + }, 'admin_thing_protect': { 'short': 'change thing protection', 'intro': '@ enter thing protection character:', 'long': 'Change protection character for thing here.' }, + 'enter_face': { + 'short': 'enter your face', + 'intro': '@ enter face line (enter nothing to abort):', + 'long': 'Draw your face as ASCII art. The string you enter must be 18 characters long, and will be divided on display into 3 lines of 6 characters each, from top to bottom..' + }, 'write': { 'short': 'change terrain', 'intro': '', @@ -194,7 +204,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, commandable): t = game.get_thing(thing_id) if not t: t = ThingBase(game, thing_id) @@ -202,19 +212,29 @@ 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 + t.commandable = commandable +cmd_THING.argtypes = 'yx_tuple:nonneg string:thing_type char int:nonneg bool bool' def cmd_THING_NAME(game, thing_id, name): t = game.get_thing(thing_id) - if t: - t.name = name -cmd_THING_NAME.argtypes = 'int:nonneg string' + t.name = name +cmd_THING_NAME.argtypes = 'int:pos string' + +def cmd_THING_FACE(game, thing_id, face): + t = game.get_thing(thing_id) + t.face = face +cmd_THING_FACE.argtypes = 'int:pos string' + +def cmd_THING_HAT(game, thing_id, hat): + t = game.get_thing(thing_id) + t.hat = hat +cmd_THING_HAT.argtypes = 'int:pos string' def cmd_THING_CHAR(game, thing_id, c): t = game.get_thing(thing_id) - if t: - t.thing_char = c -cmd_THING_CHAR.argtypes = 'int:nonneg char' + t.thing_char = c +cmd_THING_CHAR.argtypes = 'int:pos char' def cmd_MAP(game, geometry, size, content): map_geometry_class = globals()['MapGeometry' + geometry] @@ -285,15 +305,20 @@ def cmd_TASKS(game, tasks_comma_separated): game.tui.mode_write.legal = 'WRITE' in game.tasks game.tui.mode_command_thing.legal = 'COMMAND' in game.tasks game.tui.mode_take_thing.legal = 'PICK_UP' in game.tasks + game.tui.mode_drop_thing.legal = 'DROP' in game.tasks 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_THING_CARRYING(game, thing_id): - game.get_thing(thing_id).carrying = True -cmd_THING_CARRYING.argtypes = 'int:nonneg' +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, carried_id): + game.get_thing(thing_id).carrying = game.get_thing(carried_id) +cmd_THING_CARRYING.argtypes = 'int:pos int:pos' def cmd_TERRAIN(game, terrain_char, terrain_desc): game.terrains[terrain_char] = terrain_desc @@ -329,7 +354,10 @@ 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_FACE) + self.register_command(cmd_THING_HAT) 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) @@ -423,6 +451,8 @@ class TUI: mode_name_thing = Mode('name_thing', has_input_prompt=True, shows_info=True) mode_command_thing = Mode('command_thing', has_input_prompt=True) mode_take_thing = Mode('take_thing', has_input_prompt=True) + mode_drop_thing = Mode('drop_thing', has_input_prompt=True) + mode_enter_face = Mode('enter_face', has_input_prompt=True) is_admin = False tile_draw = False @@ -430,10 +460,10 @@ class TUI: import os import json 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", - "install"] + "command_thing", "take_thing", + "drop_thing"] + self.mode_play.available_actions = ["move", "teleport", "door", "consume", + "install", "wear", "spin"] 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", @@ -445,7 +475,7 @@ class TUI: "toggle_tile_draw"] self.mode_edit.available_modes = ["write", "annotate", "portal", "name_thing", "password", "chat", "study", "play", - "admin_enter"] + "admin_enter", "enter_face"] self.mode_edit.available_actions = ["move", "flatten", "toggle_map_mode"] self.mode = None self.host = host @@ -475,12 +505,15 @@ class TUI: 'switch_to_control_tile_type': 'Q', 'switch_to_admin_thing_protect': 'T', 'flatten': 'F', + 'switch_to_enter_face': 'f', 'switch_to_take_thing': 'z', - 'drop_thing': 'u', + 'switch_to_drop_thing': 'u', 'teleport': 'p', 'consume': 'C', 'door': 'D', 'install': 'I', + 'wear': 'W', + 'spin': 'S', 'help': 'h', 'toggle_map_mode': 'L', 'toggle_tile_draw': 'm', @@ -596,10 +629,22 @@ class TUI: if self.mode and self.mode.name == 'control_tile_draw': self.log_msg('@ finished tile protection drawing.') self.tile_draw = False + player = self.game.get_thing(self.game.player_id) + if mode_name == 'command_thing' and\ + (not hasattr(player, 'carrying') or not player.carrying.commandable): + self.log_msg('? not carrying anything commandable') + self.flash = True + self.switch_mode('play') + return + if mode_name == 'drop_thing' and\ + not (hasattr(player, 'carrying' or player.carrying)): + self.log_msg('? not carrying anything droppable') + self.flash = True + self.switch_mode('play') + return if mode_name == 'admin_enter' and self.is_admin: mode_name = 'admin' elif mode_name in {'name_thing', 'admin_thing_protect'}: - player = self.game.get_thing(self.game.player_id) thing = None for t in [t for t in self.game.things if t.position == player.position and t.id_ != player.id_]: @@ -630,7 +675,7 @@ class TUI: else: self.log_msg('@ enter username') elif self.mode.name == 'take_thing': - self.log_msg('Things in reach for pick-up:') + 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), @@ -644,15 +689,23 @@ class TUI: 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 in select_range] + self.selectables = [t.id_ for t in self.game.things + if t.portable and t.position in select_range] if len(self.selectables) == 0: self.log_msg('none') + self.flash = True + self.switch_mode('play') + return else: for i in range(len(self.selectables)): - t = self.selectables[i] + t = self.game.get_thing(self.selectables[i]) self.log_msg(str(i) + ': ' + self.get_thing_info(t)) + elif self.mode.name == 'drop_thing': + self.log_msg('Direction to drop thing to:') + self.selectables =\ + ['HERE'] + list(self.game.tui.movement_keys.values()) + for i in range(len(self.selectables)): + self.log_msg(str(i) + ': ' + self.selectables[i]) elif self.mode.name == 'command_thing': self.send('TASK:COMMAND ' + quote('HELP')) elif self.mode.name == 'control_pw_pw': @@ -685,6 +738,21 @@ class TUI: if len(self.game.fov) > pos_i and self.game.fov[pos_i] != '.': info_to_cache += 'outside field of view' else: + for t in self.game.things: + if t.position == self.explorer: + info_to_cache += 'THING: %s' % self.get_thing_info(t) + protection = t.protection + if protection == '.': + protection = 'none' + info_to_cache += ' / protection: %s\n' % protection + if hasattr(t, 'hat'): + info_to_cache += t.hat[0:6] + '\n' + info_to_cache += t.hat[6:12] + '\n' + info_to_cache += t.hat[12:18] + '\n' + if hasattr(t, 'face'): + info_to_cache += t.face[0:6] + '\n' + info_to_cache += t.face[6:12] + '\n' + info_to_cache += t.face[12:18] + '\n' terrain_char = self.game.map_content[pos_i] terrain_desc = '?' if terrain_char in self.game.terrains: @@ -695,13 +763,6 @@ class TUI: if protection == '.': protection = 'unprotected' info_to_cache += 'PROTECTION: %s\n' % protection - for t in self.game.things: - if t.position == self.explorer: - info_to_cache += 'THING: %s' % self.get_thing_info(t) - protection = t.protection - if protection == '.': - protection = 'none' - info_to_cache += ' / protection: %s\n' % protection if self.explorer in self.game.portals: info_to_cache += 'PORTAL: ' +\ self.game.portals[self.explorer] + '\n' @@ -720,6 +781,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): @@ -889,7 +952,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 @@ -944,6 +1007,18 @@ class TUI: if self.show_help: draw_help() + def pick_selectable(task_name): + try: + i = int(self.input_) + if i < 0 or i >= len(self.selectables): + self.log_msg('? invalid index, aborted') + else: + self.send('TASK:%s %s' % (task_name, self.selectables[i])) + except ValueError: + self.log_msg('? invalid index, aborted') + self.input_ = '' + self.switch_mode('play') + action_descriptions = { 'move': 'move', 'flatten': 'flatten surroundings', @@ -952,9 +1027,11 @@ class TUI: 'drop_thing': 'drop thing', 'toggle_map_mode': 'toggle map view', 'toggle_tile_draw': 'toggle protection character drawing', - 'install': 'install', + 'install': '(un-)install', + 'wear': '(un-)wear', 'door': 'open/close', 'consume': 'consume', + 'spin': 'spin', } action_tasks = { @@ -963,9 +1040,11 @@ class TUI: 'drop_thing': 'DROP', 'door': 'DOOR', 'install': 'INSTALL', + 'wear': 'WEAR', 'move': 'MOVE', 'command': 'COMMAND', 'consume': 'INTOXICATE', + 'spin': 'SPIN', } curses.curs_set(False) # hide cursor @@ -1014,7 +1093,7 @@ class TUI: 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'}: + 'drop_thing', 'admin_enter'}: if self.mode.name != 'chat': self.log_msg('@ aborted') self.switch_mode('play') @@ -1033,21 +1112,20 @@ class TUI: self.login_name = self.input_ self.send('LOGIN ' + quote(self.input_)) self.input_ = "" + elif self.mode.name == 'enter_face' and key == '\n': + if len(self.input_) != 18: + self.log_msg('? wrong input length, aborting') + else: + self.send('PLAYER_FACE %s' % quote(self.input_)) + self.input_ = "" + self.switch_mode('edit') elif self.mode.name == 'take_thing' and key == '\n': - 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') + pick_selectable('PICK_UP') + elif self.mode.name == 'drop_thing' and key == '\n': + pick_selectable('DROP') elif self.mode.name == 'command_thing' and key == '\n': - if task_action_on('command'): - self.send('TASK:COMMAND ' + quote(self.input_)) - self.input_ = "" + self.send('TASK:COMMAND ' + quote(self.input_)) + self.input_ = "" elif self.mode.name == 'control_pw_pw' and key == '\n': if self.input_ == '': self.log_msg('@ aborted') @@ -1129,14 +1207,16 @@ class TUI: elif self.mode.name == 'play': if self.mode.mode_switch_on_key(self, key): continue - elif key == self.keys['drop_thing'] and task_action_on('drop_thing'): - self.send('TASK:DROP') elif key == self.keys['door'] and task_action_on('door'): 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['wear'] and task_action_on('wear'): + self.send('TASK:WEAR') + elif key == self.keys['spin'] and task_action_on('spin'): + self.send('TASK:SPIN') elif key == self.keys['teleport']: player = self.game.get_thing(self.game.player_id) if player.position in self.game.portals: