X-Git-Url: https://plomlompom.com/repos/feed.xml?a=blobdiff_plain;f=rogue_chat_curses.py;h=e9f7f6b93c21936d37e783eb9d2d651553e8fc0d;hb=aab94ffb12aa0dedc240d7b29001699b95c49249;hp=983a4221c3508b5383a32bd69497061d3cf9bd1d;hpb=b3274c1e3219d50cc67487684608c7b4bd456675;p=plomrogue2 diff --git a/rogue_chat_curses.py b/rogue_chat_curses.py index 983a422..e9f7f6b 100755 --- a/rogue_chat_curses.py +++ b/rogue_chat_curses.py @@ -56,6 +56,11 @@ mode_helps = { '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..' }, + 'enter_hat': { + 'short': 'enter your hat', + 'intro': '@ enter hat line (enter nothing to abort):', + 'long': 'Draw your hat 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': '', @@ -169,14 +174,16 @@ class PlomSocketClient(PlomSocket): pass # we assume socket will be known as dead by now def cmd_TURN(game, n): - game.annotations = {} game.turn = n - game.things = [] - game.portals = {} game.turn_complete = False - game.fov = '' cmd_TURN.argtypes = 'int:nonneg' +def cmd_PSEUDO_FOV_WIPE(game): + game.portals_new = {} + game.annotations_new = {} + game.things_new = [] +cmd_PSEUDO_FOV_WIPE.argtypes = '' + def cmd_LOGIN_OK(game): game.tui.switch_mode('post_login_wait') game.tui.send('GET_GAMESTATE') @@ -209,11 +216,15 @@ def cmd_PLAYER_ID(game, player_id): game.player_id = player_id cmd_PLAYER_ID.argtypes = 'int:nonneg' +def cmd_PLAYERS_HAT_CHARS(game, hat_chars): + game.players_hat_chars_new = hat_chars +cmd_PLAYERS_HAT_CHARS.argtypes = 'string' + def cmd_THING(game, yx, thing_type, protection, thing_id, portable, commandable): - t = game.get_thing(thing_id) + t = game.get_thing_temp(thing_id) if not t: t = ThingBase(game, thing_id) - game.things += [t] + game.things_new += [t] t.position = yx t.type_ = thing_type t.protection = protection @@ -222,29 +233,29 @@ def cmd_THING(game, yx, thing_type, protection, thing_id, portable, 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) + t = game.get_thing_temp(thing_id) 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 = game.get_thing_temp(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 = game.get_thing_temp(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) + t = game.get_thing_temp(thing_id) t.thing_char = c cmd_THING_CHAR.argtypes = 'int:pos char' def cmd_MAP(game, geometry, size, content): map_geometry_class = globals()['MapGeometry' + geometry] - game.map_geometry = map_geometry_class(size) - game.map_content = content + game.map_geometry_new = map_geometry_class(size) + game.map_content_new = content if type(game.map_geometry) == MapGeometrySquare: game.tui.movement_keys = { game.tui.keys['square_move_up']: 'UP', @@ -264,24 +275,32 @@ def cmd_MAP(game, geometry, size, content): cmd_MAP.argtypes = 'string:map_geometry yx_tuple:pos string' def cmd_FOV(game, content): - game.fov = content + game.fov_new = content cmd_FOV.argtypes = 'string' def cmd_MAP_CONTROL(game, content): - game.map_control_content = content + game.map_control_content_new = content cmd_MAP_CONTROL.argtypes = 'string' def cmd_GAME_STATE_COMPLETE(game): - game.turn_complete = True game.tui.do_refresh = True game.tui.info_cached = None + game.things = game.things_new + game.portals = game.portals_new + game.annotations = game.annotations_new + game.fov = game.fov_new + game.map_geometry = game.map_geometry_new + game.map_content = game.map_content_new + game.map_control_content = game.map_control_content_new game.player = game.get_thing(game.player_id) + game.players_hat_chars = game.players_hat_chars_new + game.turn_complete = True if game.tui.mode.name == 'post_login_wait': game.tui.switch_mode('play') cmd_GAME_STATE_COMPLETE.argtypes = '' def cmd_PORTAL(game, position, msg): - game.portals[position] = msg + game.portals_new[position] = msg cmd_PORTAL.argtypes = 'yx_tuple:nonneg string' def cmd_PLAY_ERROR(game, msg): @@ -301,7 +320,7 @@ def cmd_ARGUMENT_ERROR(game, msg): cmd_ARGUMENT_ERROR.argtypes = 'string' def cmd_ANNOTATION(game, position, msg): - game.annotations[position] = msg + game.annotations_new[position] = msg if game.tui.mode.shows_info: game.tui.do_refresh = True cmd_ANNOTATION.argtypes = 'yx_tuple:nonneg string' @@ -319,11 +338,11 @@ def cmd_THING_TYPE(game, thing_type, symbol_hint): cmd_THING_TYPE.argtypes = 'string char' def cmd_THING_INSTALLED(game, thing_id): - game.get_thing(thing_id).installed = True + game.get_thing_temp(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) + game.get_thing_temp(thing_id).carrying = game.get_thing(carried_id) cmd_THING_CARRYING.argtypes = 'int:pos int:pos' def cmd_TERRAIN(game, terrain_char, terrain_desc): @@ -346,6 +365,7 @@ class Game(GameBase): turn_complete = False tasks = {} thing_types = {} + things_new = [] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -357,6 +377,7 @@ class Game(GameBase): self.register_command(cmd_REPLY) self.register_command(cmd_PLAYER_ID) self.register_command(cmd_TURN) + self.register_command(cmd_PSEUDO_FOV_WIPE) self.register_command(cmd_THING) self.register_command(cmd_THING_TYPE) self.register_command(cmd_THING_NAME) @@ -371,6 +392,7 @@ class Game(GameBase): self.register_command(cmd_PORTAL) self.register_command(cmd_ANNOTATION) self.register_command(cmd_GAME_STATE_COMPLETE) + self.register_command(cmd_PLAYERS_HAT_CHARS) self.register_command(cmd_ARGUMENT_ERROR) self.register_command(cmd_GAME_ERROR) self.register_command(cmd_PLAY_ERROR) @@ -379,9 +401,12 @@ class Game(GameBase): self.register_command(cmd_DEFAULT_COLORS) self.register_command(cmd_RANDOM_COLORS) self.map_content = '' + self.players_hat_chars = '' self.player_id = -1 self.annotations = {} + self.annotations_new = {} self.portals = {} + self.portals_new = {} self.terrains = {} self.player = None @@ -398,6 +423,12 @@ class Game(GameBase): f.argtypes = self.commands[command_name].argtypes return f + def get_thing_temp(self, id_): + for thing in self.things_new: + if id_ == thing.id_: + return thing + return None + class Mode: def __init__(self, name, has_input_prompt=False, shows_info=False, @@ -461,6 +492,7 @@ class TUI: 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) + mode_enter_hat = Mode('enter_hat', has_input_prompt=True) is_admin = False tile_draw = False @@ -482,7 +514,7 @@ class TUI: self.mode_control_tile_draw.available_actions = ["move_explorer", "toggle_tile_draw"] self.mode_edit.available_modes = ["write", "annotate", "portal", - "name_thing", "enter_face", "password", + "name_thing", "enter_face", "enter_hat", "password", "chat", "study", "play", "admin_enter"] self.mode_edit.available_actions = ["move", "flatten", "install", "toggle_map_mode"] @@ -515,6 +547,7 @@ class TUI: 'switch_to_admin_thing_protect': 'T', 'flatten': 'F', 'switch_to_enter_face': 'f', + 'switch_to_enter_hat': 'H', 'switch_to_take_thing': 'z', 'switch_to_drop_thing': 'u', 'teleport': 'p', @@ -712,6 +745,8 @@ class TUI: ['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 == 'enter_hat': + self.log_msg('legal characters: ' + self.game.players_hat_chars) elif self.mode.name == 'command_thing': self.send('TASK:COMMAND ' + quote('HELP')) elif self.mode.name == 'control_pw_pw': @@ -893,7 +928,7 @@ class TUI: 'MODE: %s – %s' % (self.mode.short_desc, help)) def draw_map(): - if not self.game.turn_complete and len(self.map_lines) == 0: + if (not self.game.turn_complete) and len(self.map_lines) == 0: return if self.game.turn_complete: map_lines_split = [] @@ -966,13 +1001,16 @@ class TUI: def draw_face_popup(): t = self.game.get_thing(self.draw_face) - if not t: + if not t or not hasattr(t, 'face'): self.draw_face = False return start_x = self.window_width - 10 + t_char = ' ' + if hasattr(t, 'thing_char'): + t_char = t.thing_char def draw_body_part(body_part, end_y): - safe_addstr(end_y - 4, start_x, ' ________ ') + safe_addstr(end_y - 4, start_x, ' _[ @' + t_char + ' ]_ ') safe_addstr(end_y - 3, start_x, '| |') safe_addstr(end_y - 2, start_x, '| ' + body_part[0:6] + ' |') safe_addstr(end_y - 1, start_x, '| ' + body_part[6:12] + ' |') @@ -1154,6 +1192,13 @@ class TUI: self.send('PLAYER_FACE %s' % quote(self.input_)) self.input_ = "" self.switch_mode('edit') + elif self.mode.name == 'enter_hat' and key == '\n': + if len(self.input_) != 18: + self.log_msg('? wrong input length, aborting') + else: + self.send('PLAYER_HAT %s' % quote(self.input_)) + self.input_ = "" + self.switch_mode('edit') elif self.mode.name == 'take_thing' and key == '\n': pick_selectable('PICK_UP') elif self.mode.name == 'drop_thing' and key == '\n':