home · contact · privacy
Add basic non-player things system.
[plomrogue2] / rogue_chat_curses.py
index 3369aef86744b5ee00ea5e4b673341da9ff3d627..0a5ced7a0692c27b9211f9f57e7ac752b29fe447 100755 (executable)
@@ -72,14 +72,19 @@ def cmd_PLAYER_ID(game, player_id):
     game.player_id = player_id
 cmd_PLAYER_ID.argtypes = 'int:nonneg'
 
-def cmd_THING_POS(game, thing_id, position):
-    t = game.get_thing(thing_id, True)
-    t.position = position
-cmd_THING_POS.argtypes = 'int:nonneg yx_tuple:nonneg'
+def cmd_THING(game, yx, thing_type, thing_id):
+    t = game.get_thing(thing_id)
+    if not t:
+        t = ThingBase(game, thing_id)
+        game.things += [t]
+    t.position = yx
+    t.type_ = thing_type
+cmd_THING.argtypes = 'yx_tuple:nonneg string:thing_type int:nonneg'
 
 def cmd_THING_NAME(game, thing_id, name):
-    t = game.get_thing(thing_id, True)
-    t.name = name
+    t = game.get_thing(thing_id)
+    if t:
+        t.name = name
 cmd_THING_NAME.argtypes = 'int:nonneg string'
 
 def cmd_MAP(game, geometry, size, content):
@@ -118,7 +123,7 @@ 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, False)
+    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')
@@ -155,14 +160,18 @@ def cmd_TASKS(game, tasks_comma_separated):
     game.tasks = tasks_comma_separated.split(',')
 cmd_TASKS.argtypes = 'string'
 
+def cmd_THING_TYPE(game, thing_type, symbol_hint):
+    game.thing_types[thing_type] = symbol_hint
+cmd_THING_TYPE.argtypes = 'string char'
+
 def cmd_PONG(game):
     pass
 cmd_PONG.argtypes = ''
 
 class Game(GameBase):
-    thing_type = ThingBase
     turn_complete = False
     tasks = {}
+    thing_types = {}
 
     def __init__(self, *args, **kwargs):
         super().__init__(*args, **kwargs)
@@ -171,7 +180,8 @@ class Game(GameBase):
         self.register_command(cmd_CHAT)
         self.register_command(cmd_PLAYER_ID)
         self.register_command(cmd_TURN)
-        self.register_command(cmd_THING_POS)
+        self.register_command(cmd_THING)
+        self.register_command(cmd_THING_TYPE)
         self.register_command(cmd_THING_NAME)
         self.register_command(cmd_MAP)
         self.register_command(cmd_MAP_CONTROL)
@@ -191,6 +201,8 @@ class Game(GameBase):
     def get_string_options(self, string_option_type):
         if string_option_type == 'map_geometry':
             return ['Hex', 'Square']
+        elif string_option_type == 'thing_type':
+            return self.thing_types.keys()
         return None
 
     def get_command(self, command_name):
@@ -289,7 +301,9 @@ class TUI:
             self.socket_thread = threading.Thread(target=self.socket.run)
             self.socket_thread.start()
             self.disconnected = False
+            self.game.thing_types = {}
             self.socket.send('TASKS')
+            self.socket.send('THING_TYPES')
             self.switch_mode('login')
         except ConnectionRefusedError:
             self.log_msg('@ server connect failure')
@@ -338,7 +352,7 @@ class TUI:
         self.map_mode = 'terrain'
         self.mode = getattr(self, 'mode_' + mode_name)
         if self.mode.shows_info:
-            player = self.game.get_thing(self.game.player_id, False)
+            player = self.game.get_thing(self.game.player_id)
             self.explorer = YX(player.position.y, player.position.x)
         if self.mode.name == 'waiting_for_server':
             self.log_msg('@ waiting for server …')
@@ -429,7 +443,10 @@ class TUI:
                 info = 'TERRAIN: %s\n' % self.game.map_content[pos_i]
                 for t in self.game.things:
                     if t.position == self.explorer:
-                        info += 'PLAYER @: %s\n' % t.name
+                        info += 'THING: %s' % t.type_
+                        if hasattr(t, 'name'):
+                            info += ' (name: %s)' % t.name
+                        info += '\n'
                 if self.explorer in self.game.portals:
                     info += 'PORTAL: ' + self.game.portals[self.explorer] + '\n'
                 else:
@@ -476,7 +493,8 @@ class TUI:
                 map_lines_split += [list(map_content[start:end])]
             if self.map_mode == 'terrain':
                 for t in self.game.things:
-                    map_lines_split[t.position.y][t.position.x] = '@'
+                    symbol = self.game.thing_types[t.type_]
+                    map_lines_split[t.position.y][t.position.x] = symbol
             if self.mode.shows_info:
                 map_lines_split[self.explorer.y][self.explorer.x] = '?'
             map_lines = []
@@ -490,7 +508,7 @@ class TUI:
                     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, False)
+            player = self.game.get_thing(self.game.player_id)
             center = player.position
             if self.mode.shows_info:
                 center = self.explorer