From 7cf9821ef5b430ac64d5c663ca67b2f1a887d8a4 Mon Sep 17 00:00:00 2001
From: Christian Heller <c.heller@plomlompom.de>
Date: Thu, 9 Jul 2020 02:52:35 +0200
Subject: [PATCH] Fix bug that created multiple objects of same ID.

---
 new/plomrogue/game.py   | 9 ++++++++-
 new/plomrogue/things.py | 1 +
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/new/plomrogue/game.py b/new/plomrogue/game.py
index d20713c..74502ca 100755
--- a/new/plomrogue/game.py
+++ b/new/plomrogue/game.py
@@ -204,6 +204,10 @@ class Game(GameBase):
     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 should not happen anywhere in the
+        # code, but a break here might be more visible.
         return self.things[-1].id_ + 1
 
     def get_map(self, map_pos):
@@ -292,7 +296,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 +307,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)
diff --git a/new/plomrogue/things.py b/new/plomrogue/things.py
index 797fd6b..7789223 100644
--- a/new/plomrogue/things.py
+++ b/new/plomrogue/things.py
@@ -246,6 +246,7 @@ class ThingAnimate(Thing):
             if self is self.game.player:
                 self.game.player_is_alive = False
             else:
+                # TODO: Handle inventory.
                 del self.game.things[self.game.things.index(self)]
             return
         try:
-- 
2.30.2