From: Christian Heller Date: Thu, 9 Jul 2020 00:52:35 +0000 (+0200) Subject: Fix bug that created multiple objects of same ID. X-Git-Url: https://plomlompom.com/repos/%7B%7Bdb.prefix%7D%7D/%7B%7B%20web_path%20%7D%7D/decks/index.html?a=commitdiff_plain;h=7cf9821ef5b430ac64d5c663ca67b2f1a887d8a4;p=plomrogue2-experiments Fix bug that created multiple objects of same ID. --- 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: