home · contact · privacy
Fix screen jumping around.
[plomrogue2-experiments] / new2 / rogue_chat_curses.py
index 6f27256a728e3a8f56db9c5d171173ff03e14036..ad6f4f98e349bd5eb6e7b006e0b852c2ee7913fc 100755 (executable)
@@ -10,8 +10,6 @@ from plomrogue.mapping import YX
 from plomrogue.things import ThingBase
 from plomrogue.misc import quote
 
-# TODO: fix screen refreshes on intermediary map results
-
 def cmd_TURN(game, n):
     game.turn = n
     game.things = []
@@ -240,6 +238,10 @@ class TUI:
             stdscr.addstr(1, self.window_width, 'MODE: ' + self.mode.name)
 
         def draw_map():
+            player = self.game.get_thing(self.game.player_id, False)
+            if not player:
+                # catches race conditions where game.things still empty
+                return
             map_lines_split = []
             for y in range(self.game.map_size.y):
                 start = self.game.map_size.x * y
@@ -256,13 +258,9 @@ class TUI:
                             int(self.game.map_size.x / 2))
             window_center = YX(int(self.size.y / 2),
                                int(self.window_width / 2))
-            center = map_center
+            center = player
             if self.mode.shows_info:
                 center = self.explorer
-            else:
-                player = self.game.get_thing(self.game.player_id, False)
-                if player:
-                    center = player.position
             offset = center - window_center
             term_y = max(0, -offset.y)
             term_x = max(0, -offset.x)
@@ -330,15 +328,32 @@ class TUI:
                     self.input_ = self.input_[:max_length]
             elif self.mode == self.mode_login and key == '\n':
                 self.socket.send('LOGIN ' + quote(self.input_))
+                self.input_ = ""
             elif self.mode == self.mode_chat and key == '\n':
                 # TODO: query, nick, help, reconnect, unknown command
-                if self.input_ == ':p':
-                    self.switch_mode('play')
-                elif self.input_ == ':?':
-                    self.switch_mode('study')
+                if self.input_[0] == ':':
+                    if self.input_ in {':p', ':play'}:
+                        self.switch_mode('play')
+                    elif self.input_ in {':?', ':study'}:
+                        self.switch_mode('study')
+                    elif self.input_.startswith(':nick'):
+                        tokens = self.input_.split(maxsplit=1)
+                        if len(tokens) == 2:
+                            self.socket.send('LOGIN ' + quote(tokens[1]))
+                        else:
+                            self.log_msg('? need login name')
+                    elif self.input_.startswith(':msg'):
+                        tokens = self.input_.split(maxsplit=2)
+                        if len(tokens) == 3:
+                            self.socket.send('QUERY %s %s' % (quote(tokens[1]),
+                                                              quote(tokens[2])))
+                        else:
+                            self.log_msg('? need message target and message')
+                    else:
+                        self.log_msg('? unknown command')
                 else:
                     self.socket.send('ALL ' + quote(self.input_))
-                    self.input_ = ""
+                self.input_ = ""
             elif self.mode == self.mode_annotate and key == '\n':
                 if (self.input_ == ''):
                     self.input_ = ' '