From 42b85d7a3cc30624691f61f76a9f95e5398cab92 Mon Sep 17 00:00:00 2001 From: Bonta-kun <40473493+Bonta0@users.noreply.github.com> Date: Thu, 9 Jan 2020 08:31:49 +0100 Subject: [PATCH] Include sphere0 items in the spoiler log and in the playthrough --- BaseClasses.py | 10 +++++++++- Main.py | 13 +++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index 5fdf3b27..16a9935a 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -214,6 +214,8 @@ class World(object): return [location for location in self.get_locations() if location.item is not None and location.item.name == item and location.item.player == player] def push_precollected(self, item): + if (item.smallkey and self.keyshuffle[item.player]) or (item.bigkey and self.bigkeyshuffle[item.player]): + item.advancement = True self.precollected_items.append(item) self.state.collect(item, True) @@ -962,6 +964,7 @@ class Spoiler(object): self.medallions = {} self.playthrough = {} self.unreachables = [] + self.startinventory = [] self.locations = {} self.paths = {} self.metadata = {} @@ -984,6 +987,8 @@ class Spoiler(object): self.medallions['Misery Mire (Player %d)' % player] = self.world.required_medallions[player][0] self.medallions['Turtle Rock (Player %d)' % player] = self.world.required_medallions[player][1] + self.startinventory = self.world.precollected_items.copy() + self.locations = OrderedDict() listed_locations = set() @@ -1081,6 +1086,7 @@ class Spoiler(object): out = OrderedDict() out['Entrances'] = list(self.entrances.values()) out.update(self.locations) + out['Starting Inventory'] = self.startinventory out['Special'] = self.medallions if self.shops: out['Shops'] = self.shops @@ -1131,12 +1137,14 @@ class Spoiler(object): for player in range(1, self.world.players + 1): outfile.write('\nMisery Mire Medallion (Player %d): %s' % (player, self.medallions['Misery Mire (Player %d)' % player])) outfile.write('\nTurtle Rock Medallion (Player %d): %s' % (player, self.medallions['Turtle Rock (Player %d)' % player])) + outfile.write('\n\nStarting Inventory:\n\n') + outfile.write('\n'.join(map(str, self.startinventory))) outfile.write('\n\nLocations:\n\n') outfile.write('\n'.join(['%s: %s' % (location, item) for grouping in self.locations.values() for (location, item) in grouping.items()])) outfile.write('\n\nShops:\n\n') outfile.write('\n'.join("{} [{}]\n {}".format(shop['location'], shop['type'], "\n ".join(item for item in [shop.get('item_0', None), shop.get('item_1', None), shop.get('item_2', None)] if item)) for shop in self.shops)) outfile.write('\n\nPlaythrough:\n\n') - outfile.write('\n'.join(['%s: {\n%s\n}' % (sphere_nr, '\n'.join([' %s: %s' % (location, item) for (location, item) in sphere.items()])) for (sphere_nr, sphere) in self.playthrough.items()])) + outfile.write('\n'.join(['%s: {\n%s\n}' % (sphere_nr, '\n'.join([' %s: %s' % (location, item) for (location, item) in sphere.items()] if sphere_nr != '0' else [f' {item}' for item in sphere])) for (sphere_nr, sphere) in self.playthrough.items()])) if self.unreachables: outfile.write('\n\nUnreachable Items:\n\n') outfile.write('\n'.join(['%s: %s' % (unreachable.item, unreachable) for unreachable in self.unreachables])) diff --git a/Main.py b/Main.py index 836a4d65..6274ede1 100644 --- a/Main.py +++ b/Main.py @@ -380,7 +380,6 @@ def create_playthrough(world): logging.getLogger('').debug('Checking if %s (Player %d) is required to beat the game.', location.item.name, location.item.player) old_item = location.item location.item = None - state.remove(old_item) if world.can_beat_game(state_cache[num]): to_delete.append(location) else: @@ -391,6 +390,14 @@ def create_playthrough(world): for location in to_delete: sphere.remove(location) + # second phase, sphere 0 + for item in [i for i in world.precollected_items if i.advancement]: + logging.getLogger('').debug('Checking if %s (Player %d) is required to beat the game.', item.name, item.player) + world.precollected_items.remove(item) + world.state.remove(item) + if not world.can_beat_game(): + world.push_precollected(item) + # we are now down to just the required progress items in collection_spheres. Unfortunately # the previous pruning stage could potentially have made certain items dependant on others # in the same or later sphere (because the location had 2 ways to access but the item originally @@ -442,4 +449,6 @@ def create_playthrough(world): old_world.spoiler.paths[str(world.get_region('Inverted Big Bomb Shop', player))] = get_path(state, world.get_region('Inverted Big Bomb Shop', player)) # we can finally output our playthrough - old_world.spoiler.playthrough = OrderedDict([(str(i + 1), {str(location): str(location.item) for location in sphere}) for i, sphere in enumerate(collection_spheres)]) + old_world.spoiler.playthrough = OrderedDict([("0", [item for item in world.precollected_items if item.advancement])]) + for i, sphere in enumerate(collection_spheres): + old_world.spoiler.playthrough[str(i + 1)] = {str(location): str(location.item) for location in sphere}