home · contact · privacy
Cache player object, so some player data is available even during turn update.
[plomrogue2] / rogue_chat_curses.py
index 6f136387b33f5353c1216fb13163cdb10da1ba93..f10c79650020d615ff2480ff26af0b5a384347ba 100755 (executable)
@@ -267,11 +267,12 @@ def cmd_MAP_CONTROL(game, content):
 cmd_MAP_CONTROL.argtypes = 'string'
 
 def cmd_GAME_STATE_COMPLETE(game):
-    if game.tui.mode.name == 'post_login_wait':
-        game.tui.switch_mode('play')
     game.turn_complete = True
     game.tui.do_refresh = True
     game.tui.info_cached = None
+    game.player = game.get_thing(game.player_id)
+    if game.tui.mode.name == 'post_login_wait':
+        game.tui.switch_mode('play')
 cmd_GAME_STATE_COMPLETE.argtypes = ''
 
 def cmd_PORTAL(game, position, msg):
@@ -376,6 +377,7 @@ class Game(GameBase):
         self.annotations = {}
         self.portals = {}
         self.terrains = {}
+        self.player = None
 
     def get_string_options(self, string_option_type):
         if string_option_type == 'map_geometry':
@@ -629,15 +631,14 @@ 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):
+           (not self.game.player.carrying or
+            not self.game.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)):
+        if mode_name == 'drop_thing' and not self.game.player.carrying:
             self.log_msg('? not carrying anything droppable')
             self.flash = True
             self.switch_mode('play')
@@ -646,8 +647,9 @@ class TUI:
             mode_name = 'admin'
         elif mode_name in {'name_thing', 'admin_thing_protect'}:
             thing = None
-            for t in [t for t in self.game.things if t.position == player.position
-                      and t.id_ != player.id_]:
+            for t in [t for t in self.game.things
+                      if t.position == self.game.player.position
+                      and t.id_ != self.game.player.id_]:
                 thing = t
                 break
             if not thing:
@@ -663,8 +665,8 @@ class TUI:
         elif self.mode.name != 'edit':
             self.map_mode = 'terrain + things'
         if self.mode.shows_info or self.mode.name == 'control_tile_draw':
-            player = self.game.get_thing(self.game.player_id)
-            self.explorer = YX(player.position.y, player.position.x)
+            self.explorer = YX(self.game.player.position.y,
+                               self.game.player.position.x)
         if self.mode.is_single_char_entry:
             self.show_help = True
         if len(self.mode.intro_msg) > 0:
@@ -676,19 +678,18 @@ class TUI:
                 self.log_msg('@ enter username')
         elif self.mode.name == 'take_thing':
             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)]
+            select_range = [self.game.player.position,
+                            self.game.player.position + YX(0,-1),
+                            self.game.player.position + YX(0, 1),
+                            self.game.player.position + YX(-1, 0),
+                            self.game.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)]
+                if self.game.player.position.y % 2:
+                    select_range += [self.game.player.position + YX(-1, 1),
+                                     self.game.player.position + YX(1, 1)]
                 else:
-                    select_range += [player.position + YX(-1, -1),
-                                     player.position + YX(1, -1)]
+                    select_range += [self.game.player.position + YX(-1, -1),
+                                     self.game.player.position + YX(1, -1)]
             self.selectables = [t.id_ for t in self.game.things
                                 if t.portable and t.position in select_range]
             if len(self.selectables) == 0:
@@ -925,11 +926,11 @@ class TUI:
                         draw_thing(t, used_positions)
                     for t in [t for t in self.game.things if t.type_ == 'Player']:
                         draw_thing(t, used_positions)
-                player = self.game.get_thing(self.game.player_id)
                 if self.mode.shows_info or self.mode.name == 'control_tile_draw':
                     map_lines_split[self.explorer.y][self.explorer.x] = '??'
                 elif self.map_mode != 'terrain + things':
-                    map_lines_split[player.position.y][player.position.x] = '??'
+                    map_lines_split[self.game.player.position.y]\
+                        [self.game.player.position.x] = '??'
                 self.map_lines = []
                 if type(self.game.map_geometry) == MapGeometryHex:
                     indent = 0
@@ -941,7 +942,7 @@ class TUI:
                         self.map_lines += [''.join(line)]
                 window_center = YX(int(self.size.y / 2),
                                    int(self.window_width / 2))
-                center = player.position
+                center = self.game.player.position
                 if self.mode.shows_info or self.mode.name == 'control_tile_draw':
                     center = self.explorer
                 center = YX(center.y, center.x * 2)
@@ -1086,15 +1087,20 @@ class TUI:
                 self.do_refresh = True
             except curses.error:
                 continue
-            self.show_help = False
+            keycode = None
+            if len(key) == 1:
+                keycode = ord(key)
             if key == 'KEY_RESIZE':
                 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',
-                                        'drop_thing', 'admin_enter'}:
-                if self.mode.name != 'chat':
+            elif (((not self.mode.is_intro) and keycode == 27)  # Escape
+                  or (self.mode.has_input_prompt and key == '\n'
+                      and self.input_ == ''\
+                      and self.mode.name in {'chat', 'command_thing',
+                                             'take_thing', 'drop_thing',
+                                             'admin_enter'})):
+                if self.mode.name not in {'chat', 'play', 'study', 'edit'}:
                     self.log_msg('@ aborted')
                 self.switch_mode('play')
             elif self.mode.has_input_prompt and key == '\n' and self.input_ == '/help':
@@ -1218,9 +1224,8 @@ class TUI:
                 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:
-                        self.host = self.game.portals[player.position]
+                    if self.game.player.position in self.game.portals:
+                        self.host = self.game.portals[self.game.player.position]
                         self.reconnect()
                     else:
                         self.flash = True