home · contact · privacy
Cache player object, so some player data is available even during turn update.
authorChristian Heller <c.heller@plomlompom.de>
Thu, 10 Dec 2020 23:17:04 +0000 (00:17 +0100)
committerChristian Heller <c.heller@plomlompom.de>
Thu, 10 Dec 2020 23:17:04 +0000 (00:17 +0100)
plomrogue/things.py
rogue_chat.html
rogue_chat_curses.py

index 09cf7f0b8bac496e17c2e980494afd369ce09dcb..9bf03b2f0d881364c56a32999d6a16c8fe1b13c4 100644 (file)
@@ -7,6 +7,7 @@ import random
 
 class ThingBase:
     type_ = '?'
+    carrying = False
 
     def __init__(self, game, id_=0, position=(YX(0, 0), YX(0, 0))):
         self.game = game
@@ -24,7 +25,6 @@ class Thing(ThingBase):
     protection = '.'
     commandable = False
     carried = False
-    carrying = False
 
     def __init__(self, *args, **kwargs):
         super().__init__(*args, **kwargs)
index 86c4644af7c17e74399d5b14332337af7ba5fa7b..d8d9db7c896535082a37e36ff8ac9bc3b25ebc5c 100644 (file)
@@ -530,11 +530,13 @@ let server = {
             game.map_control = tokens[1]
         } else if (tokens[0] === 'GAME_STATE_COMPLETE') {
             game.turn_complete = true;
+            game.player = game.things[game.player_id];
+            explorer.info_cached = false;
             if (tui.mode.name == 'post_login_wait') {
                 tui.switch_mode('play');
+            } else {
+                tui.full_refresh();
             }
-            explorer.info_cached = false;
-            tui.full_refresh();
         } else if (tokens[0] === 'CHAT') {
              tui.log_msg('# ' + tokens[1], 1);
         } else if (tokens[0] === 'REPLY') {
@@ -765,14 +767,14 @@ let tui = {
         tui.log_msg('@ finished tile protection drawing.')
     }
     this.tile_draw = false;
-    const player = game.things[game.player_id];
-    if (mode_name == 'command_thing' && (!player.carrying || !player.carrying.commandable)) {
+      if (mode_name == 'command_thing' && (!game.player.carrying
+                                           || !game.player.carrying.commandable)) {
         this.log_msg('? not carrying anything commandable');
         terminal.blink_screen();
         this.switch_mode('play');
         return;
     };
-    if (mode_name == 'drop_thing' && (!player.carrying)) {
+    if (mode_name == 'drop_thing' && (!game.player.carrying)) {
         this.log_msg('? not carrying anything droppable');
         terminal.blink_screen();
         this.switch_mode('play');
@@ -787,8 +789,8 @@ let tui = {
                 continue;
             }
             let t = game.things[t_id];
-            if (player.position[0] == t.position[0]
-                && player.position[1] == t.position[1]) {
+            if (game.player.position[0] == t.position[0]
+                && game.player.position[1] == t.position[1]) {
                 thing_id = t_id;
                 break;
             }
@@ -811,7 +813,7 @@ let tui = {
         this.inputEl.focus();
     }
     if (game.player_id in game.things && (this.mode.shows_info || this.mode.name == 'control_tile_draw')) {
-        explorer.position = game.things[game.player_id].position;
+        explorer.position = game.player.position;
     }
     this.inputEl.value = "";
     this.restore_input_values();
@@ -848,9 +850,8 @@ let tui = {
         this.show_help = true;
     } else if (this.mode.name == 'take_thing') {
         this.log_msg("Portable things in reach for pick-up:");
-        const player = game.things[game.player_id];
-        const y = player.position[0]
-        const x = player.position[1]
+        const y = game.player.position[0]
+        const x = game.player.position[1]
         let select_range = [y.toString() + ':' + x.toString(),
                             (y + 0).toString() + ':' + (x - 1).toString(),
                             (y + 0).toString() + ':' + (x + 1).toString(),
@@ -1080,11 +1081,10 @@ let tui = {
                 }
             };
         }
-        let player = game.things[game.player_id];
         if (tui.mode.shows_info || tui.mode.name == 'control_tile_draw') {
             map_lines_split[explorer.position[0]][explorer.position[1]] = '??';
         } else if (tui.map_mode != 'terrain + things') {
-            map_lines_split[player.position[0]][player.position[1]] = '??';
+            map_lines_split[game.player.position[0]][game.player.position[1]] = '??';
         }
         this.map_lines = []
         if (game.map_geometry == 'Square') {
@@ -1103,7 +1103,7 @@ let tui = {
             };
         }
         let window_center = [terminal.rows / 2, this.window_width / 2];
-        let center_position = [player.position[0], player.position[1]];
+        let center_position = [game.player.position[0], game.player.position[1]];
         if (tui.mode.shows_info || tui.mode.name == 'control_tile_draw') {
             center_position = [explorer.position[0], explorer.position[1]];
         }
@@ -1325,9 +1325,8 @@ let game = {
         return target;
     },
     teleport: function() {
-        let player = this.get_thing(game.player_id);
-        if (player.position in this.portals) {
-            server.reconnect_to(this.portals[player.position]);
+        if (game.player.position in this.portals) {
+            server.reconnect_to(this.portals[game.player.position]);
         } else {
             terminal.blink_screen();
             tui.log_msg('? not standing on portal')
index 8fc2817cbaf45dd1582a84d83e630f38e2cabb5a..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)
@@ -1223,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