home · contact · privacy
Enforce sane create_unfound decisions.
[plomrogue2-experiments] / new / plomrogue / game.py
index d20713cd61fa219d387808ef3c2e9bdbd8ac4fff..ffedbfaff14200e0af6a4f2335af5b5e0f66448b 100755 (executable)
@@ -41,7 +41,9 @@ class GameBase:
         self.turn = 0
         self.things = []
 
-    def get_thing(self, id_, create_unfound=True):
+    def get_thing(self, id_, create_unfound):
+        # No default for create_unfound because every call to get_thing
+        # should be accompanied by serious consideration whether to use it.
         for thing in self.things:
             if id_ == thing.id_:
                 return thing
@@ -133,7 +135,7 @@ class Game(GameBase):
         else:
             self.io.send('PLAYER_INVENTORY ,')
         for id_ in self.player.inventory:
-            thing = self.get_thing(id_)
+            thing = self.get_thing(id_, create_unfound=False)
             send_thing(thing)
         self.io.send('GAME_STATE_COMPLETE')
 
@@ -199,11 +201,17 @@ class Game(GameBase):
 
     @property
     def player(self):
-        return self.get_thing(self.player_id)
+        return self.get_thing(self.player_id, create_unfound=False)
 
     def new_thing_id(self):
         if len(self.things) == 0:
             return 0
+        # DANGEROUS – if anywhere we append a thing to the list of lower
+        # ID than the highest-value ID, this might lead to re-using an
+        # already active ID.  This condition /should/ not be fulfilled
+        # anywhere in the code, but if it does, trouble here is one of
+        # the more obvious indicators that it does – that's why there's
+        # no safeguard here against this.
         return self.things[-1].id_ + 1
 
     def get_map(self, map_pos):
@@ -292,7 +300,9 @@ class Game(GameBase):
                 # inside are disappeared.
                 elif m.awake > 0:
                     m.awake -= 1
-                    for t in self.things:
+                    # We iterate over a list comprehension of self.things,
+                    # since we might delete elements of self.things.
+                    for t in [t for t in self.things]:
                         if t.position[0] == map_pos:
                             if not t.type_ in m.stats:
                                 m.stats[t.type_] = {'population': 0,
@@ -301,6 +311,7 @@ class Game(GameBase):
                             if isinstance(t, ThingAnimate):
                                 m.stats[t.type_]['health'] += t.health
                             if not m.awake:
+                                # TODO: Handle inventory.
                                 del self.things[self.things.index(t)]
                     #if not m.awake:
                     #    print('DEBUG sleep stats', map_pos, m.stats)