home · contact · privacy
Simplify using the curses client to connect to current demo server.
[plomrogue2] / rogue_chat_curses.py
index f69153f1006cb127cf9f25a24bf52e6c2b118330..e0f2f6a096b1ba43599930be8c28febb63444df6 100755 (executable)
@@ -87,6 +87,12 @@ def cmd_THING_NAME(game, thing_id, name):
         t.name = name
 cmd_THING_NAME.argtypes = 'int:nonneg string'
 
+def cmd_THING_CHAR(game, thing_id, c):
+    t = game.get_thing(thing_id)
+    if t:
+        t.player_char = c
+cmd_THING_CHAR.argtypes = 'int:nonneg char'
+
 def cmd_MAP(game, geometry, size, content):
     map_geometry_class = globals()['MapGeometry' + geometry]
     game.map_geometry = map_geometry_class(size)
@@ -123,10 +129,6 @@ def cmd_GAME_STATE_COMPLETE(game):
         game.tui.switch_mode('play')
     if game.tui.mode.shows_info:
         game.tui.query_info()
-    player = game.get_thing(game.player_id)
-    if player.position in game.portals:
-        game.tui.teleport_target_host = game.portals[player.position]
-        game.tui.switch_mode('teleport')
     game.turn_complete = True
     game.tui.do_refresh = True
 cmd_GAME_STATE_COMPLETE.argtypes = ''
@@ -164,6 +166,10 @@ def cmd_THING_TYPE(game, thing_type, symbol_hint):
     game.thing_types[thing_type] = symbol_hint
 cmd_THING_TYPE.argtypes = 'string char'
 
+def cmd_TERRAIN(game, terrain_char, terrain_desc):
+    game.terrains[terrain_char] = terrain_desc
+cmd_TERRAIN.argtypes = 'char string'
+
 def cmd_PONG(game):
     pass
 cmd_PONG.argtypes = ''
@@ -183,6 +189,8 @@ class Game(GameBase):
         self.register_command(cmd_THING)
         self.register_command(cmd_THING_TYPE)
         self.register_command(cmd_THING_NAME)
+        self.register_command(cmd_THING_CHAR)
+        self.register_command(cmd_TERRAIN)
         self.register_command(cmd_MAP)
         self.register_command(cmd_MAP_CONTROL)
         self.register_command(cmd_PORTAL)
@@ -197,6 +205,7 @@ class Game(GameBase):
         self.player_id = -1
         self.info_db = {}
         self.portals = {}
+        self.terrains = {}
 
     def get_string_options(self, string_option_type):
         if string_option_type == 'map_geometry':
@@ -236,7 +245,6 @@ class TUI:
         self.mode_waiting_for_server = self.Mode('waiting_for_server', 'Waiting for a server response.', is_intro=True)
         self.mode_login = self.Mode('login', 'Pick your player name.', has_input_prompt=True, is_intro=True)
         self.mode_post_login_wait = self.Mode('post_login_wait', 'Waiting for a server response.', is_intro=True)
-        self.mode_teleport = self.Mode('teleport', 'Follow the instructions to re-connect and log-in to another server, or enter anything else to abort.', has_input_prompt=True)
         self.mode_password = self.Mode('password', 'This mode allows you to change the password that you send to authorize yourself for editing password-protected map tiles.  Hit return to confirm and leave.', has_input_prompt=True)
         self.game = Game()
         self.game.tui = self
@@ -259,6 +267,7 @@ class TUI:
             'flatten': 'F',
             'take_thing': 'z',
             'drop_thing': 'u',
+            'teleport': 'p',
             'toggle_map_mode': 'M',
             'hex_move_upleft': 'w',
             'hex_move_upright': 'e',
@@ -304,7 +313,9 @@ class TUI:
             self.socket_thread.start()
             self.disconnected = False
             self.game.thing_types = {}
+            self.game.terrains = {}
             self.socket.send('TASKS')
+            self.socket.send('TERRAINS')
             self.socket.send('THING_TYPES')
             self.switch_mode('login')
         except ConnectionRefusedError:
@@ -365,9 +376,6 @@ class TUI:
                 self.send('LOGIN ' + quote(self.login_name))
             else:
                 self.log_msg('@ enter username')
-        elif self.mode.name == 'teleport':
-            self.log_msg("@ May teleport to %s" % (self.teleport_target_host)),
-            self.log_msg("@ Enter 'YES!' to enthusiastically affirm.");
         self.restore_input_values()
 
     def loop(self, stdscr):
@@ -442,12 +450,19 @@ class TUI:
             pos_i = self.explorer.y * self.game.map_geometry.size.x + self.explorer.x
             info = 'outside field of view'
             if self.game.fov[pos_i] == '.':
-                info = 'TERRAIN: %s\n' % self.game.map_content[pos_i]
+                terrain_char = self.game.map_content[pos_i]
+                terrain_desc = '?'
+                if terrain_char in self.game.terrains:
+                    terrain_desc = self.game.terrains[terrain_char]
+                info = 'TERRAIN: "%s" / %s\n' % (terrain_char, terrain_desc)
                 for t in self.game.things:
                     if t.position == self.explorer:
-                        info += 'THING: %s' % t.type_
+                        info += 'THING: %s / %s' % (t.type_,
+                                                    self.game.thing_types[t.type_])
+                        if hasattr(t, 'player_char'):
+                            info += t.player_char
                         if hasattr(t, 'name'):
-                            info += ' (name: %s)' % t.name
+                            info += ' (%s)' % t.name
                         info += '\n'
                 if self.explorer in self.game.portals:
                     info += 'PORTAL: ' + self.game.portals[self.explorer] + '\n'
@@ -492,22 +507,31 @@ class TUI:
             for y in range(self.game.map_geometry.size.y):
                 start = self.game.map_geometry.size.x * y
                 end = start + self.game.map_geometry.size.x
-                map_lines_split += [list(map_content[start:end])]
+                map_lines_split += [[c + ' ' for c in map_content[start:end]]]
             if self.map_mode == 'terrain':
+                for p in self.game.portals.keys():
+                    map_lines_split[p.y][p.x] = 'P '
+                used_positions = []
                 for t in self.game.things:
                     symbol = self.game.thing_types[t.type_]
-                    map_lines_split[t.position.y][t.position.x] = symbol
+                    meta_char = ' '
+                    if hasattr(t, 'player_char'):
+                        meta_char = t.player_char
+                    if t.position in used_positions:
+                        meta_char = '+'
+                    map_lines_split[t.position.y][t.position.x] = symbol + meta_char
+                    used_positions += [t.position]
             if self.mode.shows_info:
-                map_lines_split[self.explorer.y][self.explorer.x] = '?'
+                map_lines_split[self.explorer.y][self.explorer.x] = '??'
             map_lines = []
             if type(self.game.map_geometry) == MapGeometryHex:
                 indent = 0
                 for line in map_lines_split:
-                    map_lines += [indent*' ' + ' '.join(line)]
+                    map_lines += [indent*' ' + ''.join(line)]
                     indent = 0 if indent else 1
             else:
                 for line in map_lines_split:
-                    map_lines += [' '.join(line)]
+                    map_lines += [''.join(line)]
             window_center = YX(int(self.size.y / 2),
                                int(self.window_width / 2))
             player = self.game.get_thing(self.game.player_id)
@@ -541,6 +565,7 @@ class TUI:
                     content += "[%s] – drop carried thing\n" % self.keys['drop_thing']
                 if 'FLATTEN_SURROUNDINGS' in self.game.tasks:
                     content += "[%s] – flatten player's surroundings\n" % self.keys['flatten']
+                content += '[%s] – teleport to other space\n' % self.keys['teleport']
                 content += 'Other modes available from here:\n'
                 content += '[%s] – chat mode\n' % self.keys['switch_to_chat']
                 content += '[%s] – study mode\n' % self.keys['switch_to_study']
@@ -690,14 +715,6 @@ class TUI:
                                                quote(self.password)))
                 self.input_ = ""
                 self.switch_mode('play')
-            elif self.mode == self.mode_teleport and key == '\n':
-                if self.input_ == 'YES!':
-                    self.host = self.teleport_target_host
-                    self.reconnect()
-                else:
-                    self.log_msg('@ teleport aborted')
-                    self.switch_mode('play')
-                self.input_ = ''
             elif self.mode == self.mode_study:
                 if key == self.keys['switch_to_chat']:
                     self.switch_mode('chat')
@@ -731,10 +748,19 @@ class TUI:
                     self.send('TASK:PICK_UP')
                 elif key == self.keys['drop_thing'] and 'DROP' in self.game.tasks:
                     self.send('TASK:DROP')
+                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]
+                        self.reconnect()
+                    else:
+                        self.flash()
+                        self.log_msg('? not standing on portal')
                 elif key in self.movement_keys and 'MOVE' in self.game.tasks:
                     self.send('TASK:MOVE ' + self.movement_keys[key])
             elif self.mode == self.mode_edit:
                 self.send('TASK:WRITE %s %s' % (key, quote(self.password)))
                 self.switch_mode('play')
 
-TUI('localhost:5000')
+#TUI('localhost:5000')
+TUI('wss://plomlompom.com/rogue_chat/')