From bda86a65f759c1c62342518831ebd4862a9973b7 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Sat, 27 Feb 2021 16:27:35 +0100 Subject: [PATCH] Add Grimmkin Flames logic --- BaseClasses.py | 11 +++++++++++ Fill.py | 10 ++++++---- worlds/hk/Items.py | 18 ++++++++++++++---- worlds/hk/Locations.py | 12 +++++++++++- worlds/hk/Rules.py | 12 +++++++++++- 5 files changed, 53 insertions(+), 10 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index 4663767b..6f345cb3 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -603,6 +603,17 @@ class CollectionState(object): return False + def has_flames(self, player: int, count: int): + from worlds.hk import Items as HKItems + found = 0 + + for item_name in HKItems.lookup_type_to_names["Flame"]: + found += self.prog_items[item_name, player] + if found >= count: + return True + + return False + def has_key(self, item, player, count: int = 1): if self.world.logic[player] == 'nologic': return True diff --git a/Fill.py b/Fill.py index 702754dd..d62b4955 100644 --- a/Fill.py +++ b/Fill.py @@ -90,8 +90,10 @@ def distribute_items_restrictive(world, gftower_trash=False, fill_locations=None else: restitempool.append(item) + standard_keyshuffle_players = set() + # fill in gtower locations with trash first - for player in range(1, world.players + 1): + for player in world.alttp_player_ids: if not gftower_trash or not world.ganonstower_vanilla[player] or \ world.logic[player] in {'owglitches', "nologic"}: gtower_trash_count = 0 @@ -123,17 +125,17 @@ def distribute_items_restrictive(world, gftower_trash=False, fill_locations=None world.push_item(spot_to_fill, item_to_place, False) fill_locations.remove(spot_to_fill) trashcnt += 1 + if world.mode[player] == 'standard' and world.keyshuffle[player] is True: + standard_keyshuffle_players.add(player) - world.random.shuffle(fill_locations) # Make sure the escape small key is placed first in standard with key shuffle to prevent running out of spots - standard_keyshuffle_players = {player for player, mode in world.mode.items() if mode == 'standard' and - world.keyshuffle[player] is True} if standard_keyshuffle_players: progitempool.sort( key=lambda item: 1 if item.name == 'Small Key (Hyrule Castle)' and item.player in standard_keyshuffle_players else 0) + world.random.shuffle(fill_locations) fill_restrictive(world, world.state, fill_locations, progitempool) if any(localrestitempool.values()): # we need to make sure some fills are limited to certain worlds diff --git a/worlds/hk/Items.py b/worlds/hk/Items.py index 5d5ab20a..379b5e24 100644 --- a/worlds/hk/Items.py +++ b/worlds/hk/Items.py @@ -84,7 +84,7 @@ item_table = \ 'Dreamshield': HKItemData(advancement=False, id=16777280, type='Charm'), 'Elegant_Key': HKItemData(advancement=True, id=16777291, type='Key'), 'Emilitia': HKItemData(advancement=True, id=0, type='Event'), - 'Equipped': HKItemData(advancement=False, id=16777511, type='Fake'), + 'Equipped': HKItemData(advancement=False, id=16777521, type='Fake'), 'Failed_Tramway': HKItemData(advancement=True, id=0, type='Event'), 'Far_Left_Basin': HKItemData(advancement=True, id=0, type='Event'), 'Far_Left_Waterways': HKItemData(advancement=True, id=0, type='Event'), @@ -109,6 +109,16 @@ item_table = \ 'Greenpath_Map': HKItemData(advancement=False, id=16777477, type='Map'), 'Greenpath_Stag': HKItemData(advancement=True, id=16777492, type='Stag'), 'Grimmchild': HKItemData(advancement=True, id=16777282, type='Charm'), + 'Grimmkin_Flame-Ancient_Basin': HKItemData(advancement=True, id=16777516, type='Flame'), + 'Grimmkin_Flame-Brumm': HKItemData(advancement=True, id=16777518, type='Flame'), + 'Grimmkin_Flame-City_Storerooms': HKItemData(advancement=True, id=16777509, type='Flame'), + 'Grimmkin_Flame-Crystal_Peak': HKItemData(advancement=True, id=16777511, type='Flame'), + 'Grimmkin_Flame-Fungal_Core': HKItemData(advancement=True, id=16777515, type='Flame'), + 'Grimmkin_Flame-Greenpath': HKItemData(advancement=True, id=16777510, type='Flame'), + 'Grimmkin_Flame-Hive': HKItemData(advancement=True, id=16777517, type='Flame'), + "Grimmkin_Flame-King's_Pass": HKItemData(advancement=True, id=16777512, type='Flame'), + "Grimmkin_Flame-Kingdom's_Edge": HKItemData(advancement=True, id=16777514, type='Flame'), + 'Grimmkin_Flame-Resting_Grounds': HKItemData(advancement=True, id=16777513, type='Flame'), 'Grub-Basin_Requires_Dive': HKItemData(advancement=True, id=16777452, type='Grub'), 'Grub-Basin_Requires_Wings': HKItemData(advancement=True, id=16777451, type='Grub'), "Grub-Beast's_Den": HKItemData(advancement=True, id=16777446, type='Grub'), @@ -156,7 +166,7 @@ item_table = \ 'Grub-Waterways_Main': HKItemData(advancement=True, id=16777453, type='Grub'), 'Grub-Waterways_Requires_Tram': HKItemData(advancement=True, id=16777455, type='Grub'), "Grubberfly's_Elegy": HKItemData(advancement=True, id=16777275, type='Charm'), - 'Grubfather': HKItemData(advancement=False, id=16777509, type='Fake'), + 'Grubfather': HKItemData(advancement=False, id=16777519, type='Fake'), 'Grubsong': HKItemData(advancement=False, id=16777243, type='Charm'), "Hallownest's_Crown": HKItemData(advancement=True, id=0, type='Event'), "Hallownest_Seal-Beast's_Den": HKItemData(advancement=False, id=16777389, type='Relic'), @@ -261,7 +271,7 @@ item_table = \ 'Pale_Ore-Grubs': HKItemData(advancement=False, id=16777329, type='Ore'), 'Pale_Ore-Nosk': HKItemData(advancement=False, id=16777327, type='Ore'), 'Pale_Ore-Seer': HKItemData(advancement=False, id=16777328, type='Ore'), - 'Placeholder': HKItemData(advancement=False, id=16777512, type='Fake'), + 'Placeholder': HKItemData(advancement=False, id=16777522, type='Fake'), 'Pleasure_House': HKItemData(advancement=True, id=0, type='Event'), "Queen's_Gardens_Map": HKItemData(advancement=False, id=16777488, type='Map'), "Queen's_Gardens_Stag": HKItemData(advancement=True, id=16777494, type='Stag'), @@ -297,7 +307,7 @@ item_table = \ 'Right_Fog_Canyon': HKItemData(advancement=True, id=0, type='Event'), 'Right_Waterways': HKItemData(advancement=True, id=0, type='Event'), 'Royal_Waterways_Map': HKItemData(advancement=False, id=16777485, type='Map'), - 'Seer': HKItemData(advancement=False, id=16777510, type='Fake'), + 'Seer': HKItemData(advancement=False, id=16777520, type='Fake'), 'Shade_Cloak': HKItemData(advancement=True, id=16777226, type='Skill'), 'Shade_Soul': HKItemData(advancement=True, id=16777232, type='Skill'), 'Shaman_Stone': HKItemData(advancement=False, id=16777259, type='Charm'), diff --git a/worlds/hk/Locations.py b/worlds/hk/Locations.py index 0c97f182..eae06dda 100644 --- a/worlds/hk/Locations.py +++ b/worlds/hk/Locations.py @@ -291,7 +291,17 @@ lookup_id_to_name = \ 17826081: 'Lifeblood_Cocoon-Mantis_Village', 17826082: 'Lifeblood_Cocoon-Failed_Tramway', 17826083: 'Lifeblood_Cocoon-Galien', - 17826084: "Lifeblood_Cocoon-Kingdom's_Edge"} + 17826084: "Lifeblood_Cocoon-Kingdom's_Edge", + 17826085: 'Grimmkin_Flame-City_Storerooms', + 17826086: 'Grimmkin_Flame-Greenpath', + 17826087: 'Grimmkin_Flame-Crystal_Peak', + 17826088: "Grimmkin_Flame-King's_Pass", + 17826089: 'Grimmkin_Flame-Resting_Grounds', + 17826090: "Grimmkin_Flame-Kingdom's_Edge", + 17826091: 'Grimmkin_Flame-Fungal_Core', + 17826092: 'Grimmkin_Flame-Ancient_Basin', + 17826093: 'Grimmkin_Flame-Hive', + 17826094: 'Grimmkin_Flame-Brumm'} diff --git a/worlds/hk/Rules.py b/worlds/hk/Rules.py index 529a27a0..806bc9e3 100644 --- a/worlds/hk/Rules.py +++ b/worlds/hk/Rules.py @@ -92,7 +92,7 @@ def set_rules(world, player): set_rule(world.get_location("Charm_Notch-Shrumal_Ogres", player), lambda state: state.has("Fungal_Wastes", player)) set_rule(world.get_location("Charm_Notch-Fog_Canyon", player), lambda state: ((state.has("Right_Fog_Canyon", player) and state.has("Mantis_Claw", player)) and (((state.has("Isma's_Tear", player) or (((state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) and state.has("Crystal_Heart", player)) and state.world.ACIDSKIPS[player])) or ((state.has("Monarch_Wings", player) and ((state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) or (state.world.FIREBALLSKIPS[player] and ((state.has("Vengeful_Spirit", player) or state.has("Shade_Soul", player)) or (state.has("Howling_Wraiths", player) or state.has("Abyss_Shriek", player)))))) and state.world.ACIDSKIPS[player])) or ((state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) and state.world.SPICYSKIPS[player])))) set_rule(world.get_location("Charm_Notch-Colosseum", player), lambda state: (state.has("Colosseum", player) and (((((((state.has("Vengeful_Spirit", player) and state.has("Shade_Soul", player)) or (state.has("Desolate_Dive", player) and state.has("Descending_Dark", player))) or (state.has("Howling_Wraiths", player) and state.has("Abyss_Shriek", player))) or ((state.has("Vengeful_Spirit", player) or state.has("Shade_Soul", player)) and (state.has("Desolate_Dive", player) or state.has("Descending_Dark", player)))) or ((state.has("Howling_Wraiths", player) or state.has("Abyss_Shriek", player)) and (state.has("Desolate_Dive", player) or state.has("Descending_Dark", player)))) or ((state.has("Vengeful_Spirit", player) or state.has("Shade_Soul", player)) and (state.has("Howling_Wraiths", player) or state.has("Abyss_Shriek", player)))) and ((state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) or state.world.MILDSKIPS[player])))) - set_rule(world.get_location("Charm_Notch-Grimm", player), lambda state: ((state.has("Dirtmouth", player) and state.has("Grimmchild", player)) and (((((((state.has("Vengeful_Spirit", player) and state.has("Shade_Soul", player)) or (state.has("Desolate_Dive", player) and state.has("Descending_Dark", player))) or (state.has("Howling_Wraiths", player) and state.has("Abyss_Shriek", player))) or ((state.has("Vengeful_Spirit", player) or state.has("Shade_Soul", player)) and (state.has("Desolate_Dive", player) or state.has("Descending_Dark", player)))) or ((state.has("Howling_Wraiths", player) or state.has("Abyss_Shriek", player)) and (state.has("Desolate_Dive", player) or state.has("Descending_Dark", player)))) or ((state.has("Vengeful_Spirit", player) or state.has("Shade_Soul", player)) and (state.has("Howling_Wraiths", player) or state.has("Abyss_Shriek", player)))) and ((state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) or state.world.MILDSKIPS[player])))) + set_rule(world.get_location("Charm_Notch-Grimm", player), lambda state: (((state.has("Dirtmouth", player) and state.has("Grimmchild", player)) and (((((((state.has("Vengeful_Spirit", player) and state.has("Shade_Soul", player)) or (state.has("Desolate_Dive", player) and state.has("Descending_Dark", player))) or (state.has("Howling_Wraiths", player) and state.has("Abyss_Shriek", player))) or ((state.has("Vengeful_Spirit", player) or state.has("Shade_Soul", player)) and (state.has("Desolate_Dive", player) or state.has("Descending_Dark", player)))) or ((state.has("Howling_Wraiths", player) or state.has("Abyss_Shriek", player)) and (state.has("Desolate_Dive", player) or state.has("Descending_Dark", player)))) or ((state.has("Vengeful_Spirit", player) or state.has("Shade_Soul", player)) and (state.has("Howling_Wraiths", player) or state.has("Abyss_Shriek", player)))) and ((state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) or state.world.MILDSKIPS[player]))) and state.has_flames(player, 6))) set_rule(world.get_location("Pale_Ore-Basin", player), lambda state: (state.has("Mid_Basin", player) and (((state.has("Mantis_Claw", player) or state.has("Monarch_Wings", player)) or ((state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) and state.world.MILDSKIPS[player])) or state.world.SPICYSKIPS[player]))) set_rule(world.get_location("Pale_Ore-Crystal_Peak", player), lambda state: state.has("Hallownest's_Crown", player)) set_rule(world.get_location("Pale_Ore-Nosk", player), lambda state: (((state.has("Deepnest", player) and state.has("Mantis_Claw", player)) and ((state.has("Monarch_Wings", player) or state.has("Crystal_Heart", player)) or state.world.SHADESKIPS[player])) and (((((((state.has("Vengeful_Spirit", player) and state.has("Shade_Soul", player)) or (state.has("Desolate_Dive", player) and state.has("Descending_Dark", player))) or (state.has("Howling_Wraiths", player) and state.has("Abyss_Shriek", player))) or ((state.has("Vengeful_Spirit", player) or state.has("Shade_Soul", player)) and (state.has("Desolate_Dive", player) or state.has("Descending_Dark", player)))) or ((state.has("Howling_Wraiths", player) or state.has("Abyss_Shriek", player)) and (state.has("Desolate_Dive", player) or state.has("Descending_Dark", player)))) or ((state.has("Vengeful_Spirit", player) or state.has("Shade_Soul", player)) and (state.has("Howling_Wraiths", player) or state.has("Abyss_Shriek", player)))) and ((state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) or state.world.MILDSKIPS[player])))) @@ -275,6 +275,16 @@ def set_rules(world, player): set_rule(world.get_location("Lifeblood_Cocoon-Failed_Tramway", player), lambda state: (state.has("Failed_Tramway", player) and (state.has("Mantis_Claw", player) or (state.has("Monarch_Wings", player) and (state.world.MILDSKIPS[player] or state.world.SHADESKIPS[player]))))) set_rule(world.get_location("Lifeblood_Cocoon-Galien", player), lambda state: (state.has("Dark_Deepnest", player) and state.has("Mantis_Claw", player))) set_rule(world.get_location("Lifeblood_Cocoon-Kingdom's_Edge", player), lambda state: (state.has("Upper_Kingdom's_Edge", player) and (state.has("Monarch_Wings", player) or (state.has("Mantis_Claw", player) and state.world.MILDSKIPS[player])))) + set_rule(world.get_location("Grimmkin_Flame-City_Storerooms", player), lambda state: (state.has("Left_Elevator", player) and state.has("Grimmchild", player))) + set_rule(world.get_location("Grimmkin_Flame-Greenpath", player), lambda state: (state.has("Greenpath", player) and state.has("Grimmchild", player))) + set_rule(world.get_location("Grimmkin_Flame-Crystal_Peak", player), lambda state: (((state.has("Upper_Crystal_Peak", player) and state.has("Crystal_Heart", player)) or (((state.has("King's_Pass", player) and state.has("Monarch_Wings", player)) and state.has("Crystal_Heart", player)) and (state.has("Mantis_Claw", player) or (((state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) and (state.world.FIREBALLSKIPS[player] and ((state.has("Vengeful_Spirit", player) or state.has("Shade_Soul", player)) or (state.has("Howling_Wraiths", player) or state.has("Abyss_Shriek", player))))) and state.world.SHADESKIPS[player])))) and state.has("Grimmchild", player))) + set_rule(world.get_location("Grimmkin_Flame-King's_Pass", player), lambda state: (((state.has("King's_Pass", player) and state.has("Grimmchild", player)) and state.has_flames(player, 3)) and state.has("Dirtmouth", player))) + set_rule(world.get_location("Grimmkin_Flame-Resting_Grounds", player), lambda state: (((state.has("Lower_Resting_Grounds", player) and state.has("Grimmchild", player)) and state.has_flames(player, 3)) and state.has("Dirtmouth", player))) + set_rule(world.get_location("Grimmkin_Flame-Kingdom's_Edge", player), lambda state: (((state.has("Central_Kingdom's_Edge", player) and state.has("Grimmchild", player)) and state.has_flames(player, 3)) and state.has("Dirtmouth", player))) + set_rule(world.get_location("Grimmkin_Flame-Fungal_Core", player), lambda state: ((((state.has("Fungal_Core", player) and state.has("Grimmchild", player)) and state.has_flames(player, 6)) and state.has("Dirtmouth", player)) and (((((((state.has("Vengeful_Spirit", player) and state.has("Shade_Soul", player)) or (state.has("Desolate_Dive", player) and state.has("Descending_Dark", player))) or (state.has("Howling_Wraiths", player) and state.has("Abyss_Shriek", player))) or ((state.has("Vengeful_Spirit", player) or state.has("Shade_Soul", player)) and (state.has("Desolate_Dive", player) or state.has("Descending_Dark", player)))) or ((state.has("Howling_Wraiths", player) or state.has("Abyss_Shriek", player)) and (state.has("Desolate_Dive", player) or state.has("Descending_Dark", player)))) or ((state.has("Vengeful_Spirit", player) or state.has("Shade_Soul", player)) and (state.has("Howling_Wraiths", player) or state.has("Abyss_Shriek", player)))) and ((state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) or state.world.MILDSKIPS[player])))) + set_rule(world.get_location("Grimmkin_Flame-Ancient_Basin", player), lambda state: ((((state.has("Upper_Basin", player) and state.has("Grimmchild", player)) and state.has_flames(player, 6)) and state.has("Dirtmouth", player)) and (((((((state.has("Vengeful_Spirit", player) and state.has("Shade_Soul", player)) or (state.has("Desolate_Dive", player) and state.has("Descending_Dark", player))) or (state.has("Howling_Wraiths", player) and state.has("Abyss_Shriek", player))) or ((state.has("Vengeful_Spirit", player) or state.has("Shade_Soul", player)) and (state.has("Desolate_Dive", player) or state.has("Descending_Dark", player)))) or ((state.has("Howling_Wraiths", player) or state.has("Abyss_Shriek", player)) and (state.has("Desolate_Dive", player) or state.has("Descending_Dark", player)))) or ((state.has("Vengeful_Spirit", player) or state.has("Shade_Soul", player)) and (state.has("Howling_Wraiths", player) or state.has("Abyss_Shriek", player)))) and ((state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) or state.world.MILDSKIPS[player])))) + set_rule(world.get_location("Grimmkin_Flame-Hive", player), lambda state: (((((state.has("Hive", player) and ((state.has("Mantis_Claw", player) and state.has("Monarch_Wings", player)) or (state.world.MILDSKIPS[player] and (state.has("Mantis_Claw", player) or state.has("Monarch_Wings", player))))) and state.has("Grimmchild", player)) and state.has_flames(player, 6)) and state.has("Dirtmouth", player)) and (((((((state.has("Vengeful_Spirit", player) and state.has("Shade_Soul", player)) or (state.has("Desolate_Dive", player) and state.has("Descending_Dark", player))) or (state.has("Howling_Wraiths", player) and state.has("Abyss_Shriek", player))) or ((state.has("Vengeful_Spirit", player) or state.has("Shade_Soul", player)) and (state.has("Desolate_Dive", player) or state.has("Descending_Dark", player)))) or ((state.has("Howling_Wraiths", player) or state.has("Abyss_Shriek", player)) and (state.has("Desolate_Dive", player) or state.has("Descending_Dark", player)))) or ((state.has("Vengeful_Spirit", player) or state.has("Shade_Soul", player)) and (state.has("Howling_Wraiths", player) or state.has("Abyss_Shriek", player)))) and ((state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) or state.world.MILDSKIPS[player])))) + set_rule(world.get_location("Grimmkin_Flame-Brumm", player), lambda state: ((((state.has("Distant_Village", player) and state.has("Grimmchild", player)) and state.has_flames(player, 6)) and state.has("Dirtmouth", player)) and (((((((state.has("Vengeful_Spirit", player) and state.has("Shade_Soul", player)) or (state.has("Desolate_Dive", player) and state.has("Descending_Dark", player))) or (state.has("Howling_Wraiths", player) and state.has("Abyss_Shriek", player))) or ((state.has("Vengeful_Spirit", player) or state.has("Shade_Soul", player)) and (state.has("Desolate_Dive", player) or state.has("Descending_Dark", player)))) or ((state.has("Howling_Wraiths", player) or state.has("Abyss_Shriek", player)) and (state.has("Desolate_Dive", player) or state.has("Descending_Dark", player)))) or ((state.has("Vengeful_Spirit", player) or state.has("Shade_Soul", player)) and (state.has("Howling_Wraiths", player) or state.has("Abyss_Shriek", player)))) and ((state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) or state.world.MILDSKIPS[player])))) # set_rule(world.get_location("Grubfather", player), lambda state: state.has("Crossroads", player)) # set_rule(world.get_location("Seer", player), lambda state: state.has("Upper_Resting_Grounds", player))