home · contact · privacy
Some mode code refactoring.
[plomrogue2] / plomrogue / game.py
index 84bebb98c2d4a45f0a1f68619681790f07ce5d99..8b3edb16127cf184886cca687412832326a2f15b 100755 (executable)
@@ -64,6 +64,7 @@ class Game(GameBase):
         self.portals = {}
         self.player_chars = string.digits + string.ascii_letters
         self.player_char_i = -1
+        self.admin_passwords = []
         self.terrains = {
             '.': 'floor',
             'X': 'wall',
@@ -119,12 +120,18 @@ class Game(GameBase):
     def get_map_geometry_shape(self):
         return self.map_geometry.__class__.__name__[len('MapGeometry'):]
 
+    def get_player(self, connection_id):
+        if not connection_id in self.sessions:
+            return None
+        player = self.get_thing(self.sessions[connection_id]['thing_id'])
+        return player
+
     def send_gamestate(self, connection_id=None):
         """Send out game state data relevant to clients."""
 
         self.io.send('TURN ' + str(self.turn))
         for c_id in self.sessions:
-            player = self.get_thing(self.sessions[c_id])
+            player = self.get_player(c_id)
             visible_terrain = player.fov_stencil_map()
             self.io.send('FOV %s' % quote(player.fov_stencil.terrain), c_id)
             self.io.send('MAP %s %s %s' % (self.get_map_geometry_shape(),
@@ -163,7 +170,7 @@ class Game(GameBase):
                     connection_id_found = True
                     break
             if not connection_id_found:
-                t = self.get_thing(self.sessions[connection_id])
+                t = self.get_player(connection_id)
                 if hasattr(t, 'name'):
                     self.io.send('CHAT ' + quote(t.name + ' left the map.'))
                 self.things.remove(t)
@@ -177,11 +184,11 @@ class Game(GameBase):
                     t.proceed()
                 except GameError as e:
                     for connection_id in [c_id for c_id in self.sessions
-                                          if self.sessions[c_id] == t.id_]:
+                                          if self.sessions[c_id]['thing_id'] == t.id_]:
                         self.io.send('GAME_ERROR ' + quote(str(e)), connection_id)
                 except PlayError as e:
                     for connection_id in [c_id for c_id in self.sessions
-                                          if self.sessions[c_id] == t.id_]:
+                                          if self.sessions[c_id]['thing_id'] == t.id_]:
                         self.io.send('PLAY_ERROR ' + quote(str(e)), connection_id)
         if self.changed:
             self.turn += 1
@@ -198,9 +205,9 @@ class Game(GameBase):
             return p
 
         def cmd_TASK_colon(task_name, game, *args, connection_id):
-            if connection_id not in game.sessions:
+            t = self.get_player(connection_id)
+            if not t:
                 raise GameError('Not registered as player.')
-            t = game.get_thing(game.sessions[connection_id])
             t.set_next_task(task_name, args)
 
         def task_prefixed(command_name, task_prefix, task_command):
@@ -259,6 +266,8 @@ class Game(GameBase):
           for tile_class in self.map_control_passwords:
               write(f, 'MAP_CONTROL_PW %s %s' % (tile_class,
                                                  self.map_control_passwords[tile_class]))
+          for pw in self.admin_passwords:
+                  write(f, 'ADMIN_PASSWORD %s' % pw)
           for t in [t for t in self.things if not t.type_ == 'Player']:
               write(f, 'THING %s %s %s %s' % (t.position[0],
                                               t.position[1], t.type_, t.id_))