X-Git-Url: https://plomlompom.com/repos/berlin_corona.txt?a=blobdiff_plain;f=rogue_chat_curses.py;h=d76c3bebd0b41622a41d3191b8db20836e989f8d;hb=74c0ec0247f058b977996f9e1e2d696f3d2d162b;hp=7d2a3b163b0d3a05f4c0a24ffe1f2e3b2b67d95a;hpb=01b6b1da2a94fe26d1ad44348afb133edcd2a273;p=plomrogue2 diff --git a/rogue_chat_curses.py b/rogue_chat_curses.py index 7d2a3b1..d76c3be 100755 --- a/rogue_chat_curses.py +++ b/rogue_chat_curses.py @@ -169,14 +169,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') @@ -202,6 +204,7 @@ cmd_CHAT.argtypes = 'string' def cmd_CHATFACE(game, thing_id): game.tui.draw_face = thing_id + game.tui.do_refresh = True cmd_CHATFACE.argtypes = 'int:pos' def cmd_PLAYER_ID(game, player_id): @@ -209,10 +212,10 @@ def cmd_PLAYER_ID(game, player_id): cmd_PLAYER_ID.argtypes = 'int:nonneg' 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 @@ -221,29 +224,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', @@ -263,24 +266,31 @@ 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.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): @@ -300,7 +310,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' @@ -318,11 +328,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): @@ -345,6 +355,7 @@ class Game(GameBase): turn_complete = False tasks = {} thing_types = {} + things_new = [] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -356,6 +367,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) @@ -380,7 +392,9 @@ class Game(GameBase): self.map_content = '' self.player_id = -1 self.annotations = {} + self.annotations_new = {} self.portals = {} + self.portals_new = {} self.terrains = {} self.player = None @@ -397,6 +411,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, @@ -548,7 +568,6 @@ class TUI: self.fov = '' self.flash = False self.map_lines = [] - self.draw_face = False self.offset = YX(0,0) curses.wrapper(self.loop) @@ -643,6 +662,7 @@ class TUI: if self.mode and self.mode.name == 'control_tile_draw': self.log_msg('@ finished tile protection drawing.') + self.draw_face = False self.tile_draw = False if mode_name == 'command_thing' and\ (not self.game.player.carrying or @@ -892,7 +912,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 = [] @@ -965,22 +985,26 @@ 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): - start_x = self.window_width - 10 - 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] + ' |') safe_addstr(end_y, start_x, '| ' + body_part[12:18] + ' |') if hasattr(t, 'face'): - draw_body_part(t.face, self.size.y - 1) + draw_body_part(t.face, self.size.y - 2) if hasattr(t, 'hat'): - draw_body_part(t.hat, self.size.y - 4) + draw_body_part(t.hat, self.size.y - 5) + safe_addstr(self.size.y - 1, start_x, '| |') def draw_help(): content = "%s help\n\n%s\n\n" % (self.mode.short_desc,