home · contact · privacy
Enable Hat editing with characters earned by eating cookies from a CookieSpawner.
[plomrogue2] / rogue_chat_curses.py
index 983a4221c3508b5383a32bd69497061d3cf9bd1d..e9f7f6b93c21936d37e783eb9d2d651553e8fc0d 100755 (executable)
@@ -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':