From abcc2690f07cef8c70570b48708b396fe841e948 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Fri, 26 Feb 2021 21:03:16 +0100 Subject: [PATCH] Add "Fake" (Randomizer-only) Hollow Knight items --- BaseClasses.py | 139 +++++++++++++++++++++--------------------- Main.py | 6 +- worlds/__init__.py | 12 +++- worlds/alttp/Items.py | 15 +++++ worlds/hk/Items.py | 12 +++- worlds/hk/Rules.py | 54 ++++++++-------- worlds/hk/__init__.py | 3 +- 7 files changed, 141 insertions(+), 100 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index fb1de6f6..4663767b 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -260,9 +260,6 @@ class MultiWorld(): ret.prog_items['Silver Bow', item.player] += 1 elif self.difficulty_requirements[item.player].progressive_bow_limit >= 1: ret.prog_items['Bow', item.player] += 1 - elif item.name.startswith('Bottle'): - if ret.bottle_count(item.player) < self.difficulty_requirements[item.player].progressive_bottle_limit: - ret.prog_items[item.name, item.player] += 1 elif item.advancement or item.smallkey or item.bigkey: ret.prog_items[item.name, item.player] += 1 @@ -484,7 +481,8 @@ class MultiWorld(): if not sphere: # ran out of places and did not finish yet, quit - logging.debug(f"Could not access required locations.") + logging.warning(f"Could not access required locations for accessibility check." + f" Missing: {locations}") return False for location in sphere: @@ -590,17 +588,19 @@ class CollectionState(object): def has(self, item, player: int, count: int = 1): return self.prog_items[item, player] >= count - def has_essence(self, count:int, player: int): - # TODO: implement - return True + def has_essence(self, player: int, count: int): + return self.prog_items["Dream_Nail", player] + # return self.prog_items["Essence", player] >= count + + def has_grubs(self, player: int, count: int): + from worlds.hk import Items as HKItems + found = 0 + + for item_name in HKItems.lookup_type_to_names["Grub"]: + found += self.prog_items[item_name, player] + if found >= count: + return True - def has_grubs(self, count:int, player: int): - found: int = 0 - for (item, item_player), count in self.prog_items.items(): - if item_player == player and "Grub" in item: - found += count - if found > count: - return True return False def has_key(self, item, player, count: int = 1): @@ -642,10 +642,12 @@ class CollectionState(object): found: int = 0 for bottlename in item_name_groups["Bottles"]: found += self.prog_items[bottlename, player] - return found + return min(self.world.difficulty_requirements[player].progressive_bottle_limit, found) def has_bottles(self, bottles: int, player: int) -> bool: """Version of bottle_count that allows fast abort""" + if bottles > self.world.difficulty_requirements[player].progressive_bottle_limit: + return False found: int = 0 for bottlename in item_name_groups["Bottles"]: found += self.prog_items[bottlename, player] @@ -796,58 +798,59 @@ class CollectionState(object): if location: self.locations_checked.add(location) changed = False - if item.name.startswith('Progressive '): - if 'Sword' in item.name: - if self.has('Golden Sword', item.player): - pass - elif self.has('Tempered Sword', item.player) and self.world.difficulty_requirements[ - item.player].progressive_sword_limit >= 4: - self.prog_items['Golden Sword', item.player] += 1 - changed = True - elif self.has('Master Sword', item.player) and self.world.difficulty_requirements[item.player].progressive_sword_limit >= 3: - self.prog_items['Tempered Sword', item.player] += 1 - changed = True - elif self.has('Fighter Sword', item.player) and self.world.difficulty_requirements[item.player].progressive_sword_limit >= 2: - self.prog_items['Master Sword', item.player] += 1 - changed = True - elif self.world.difficulty_requirements[item.player].progressive_sword_limit >= 1: - self.prog_items['Fighter Sword', item.player] += 1 - changed = True - elif 'Glove' in item.name: - if self.has('Titans Mitts', item.player): - pass - elif self.has('Power Glove', item.player): - self.prog_items['Titans Mitts', item.player] += 1 - changed = True - else: - self.prog_items['Power Glove', item.player] += 1 - changed = True - elif 'Shield' in item.name: - if self.has('Mirror Shield', item.player): - pass - elif self.has('Red Shield', item.player) and self.world.difficulty_requirements[item.player].progressive_shield_limit >= 3: - self.prog_items['Mirror Shield', item.player] += 1 - changed = True - elif self.has('Blue Shield', item.player) and self.world.difficulty_requirements[item.player].progressive_shield_limit >= 2: - self.prog_items['Red Shield', item.player] += 1 - changed = True - elif self.world.difficulty_requirements[item.player].progressive_shield_limit >= 1: - self.prog_items['Blue Shield', item.player] += 1 - changed = True - elif 'Bow' in item.name: - if self.has('Silver Bow', item.player): - pass - elif self.has('Bow', item.player): - self.prog_items['Silver Bow', item.player] += 1 - changed = True - else: - self.prog_items['Bow', item.player] += 1 - changed = True - elif item.name.startswith('Bottle'): - if self.bottle_count(item.player) < self.world.difficulty_requirements[item.player].progressive_bottle_limit: - self.prog_items[item.name, item.player] += 1 - changed = True - elif event or item.advancement: + + # TODO: create a mapping for progressive items in each game and use that + if item.game == "A Link to the Past": + if item.name.startswith('Progressive '): + if 'Sword' in item.name: + if self.has('Golden Sword', item.player): + pass + elif self.has('Tempered Sword', item.player) and self.world.difficulty_requirements[ + item.player].progressive_sword_limit >= 4: + self.prog_items['Golden Sword', item.player] += 1 + changed = True + elif self.has('Master Sword', item.player) and self.world.difficulty_requirements[item.player].progressive_sword_limit >= 3: + self.prog_items['Tempered Sword', item.player] += 1 + changed = True + elif self.has('Fighter Sword', item.player) and self.world.difficulty_requirements[item.player].progressive_sword_limit >= 2: + self.prog_items['Master Sword', item.player] += 1 + changed = True + elif self.world.difficulty_requirements[item.player].progressive_sword_limit >= 1: + self.prog_items['Fighter Sword', item.player] += 1 + changed = True + elif 'Glove' in item.name: + if self.has('Titans Mitts', item.player): + pass + elif self.has('Power Glove', item.player): + self.prog_items['Titans Mitts', item.player] += 1 + changed = True + else: + self.prog_items['Power Glove', item.player] += 1 + changed = True + elif 'Shield' in item.name: + if self.has('Mirror Shield', item.player): + pass + elif self.has('Red Shield', item.player) and self.world.difficulty_requirements[item.player].progressive_shield_limit >= 3: + self.prog_items['Mirror Shield', item.player] += 1 + changed = True + elif self.has('Blue Shield', item.player) and self.world.difficulty_requirements[item.player].progressive_shield_limit >= 2: + self.prog_items['Red Shield', item.player] += 1 + changed = True + elif self.world.difficulty_requirements[item.player].progressive_shield_limit >= 1: + self.prog_items['Blue Shield', item.player] += 1 + changed = True + elif 'Bow' in item.name: + if self.has('Silver Bow', item.player): + pass + elif self.has('Bow', item.player): + self.prog_items['Silver Bow', item.player] += 1 + changed = True + else: + self.prog_items['Bow', item.player] += 1 + changed = True + + + if not changed and (event or item.advancement): self.prog_items[item.name, item.player] += 1 changed = True @@ -1108,7 +1111,7 @@ class Location(): class Item(): location: Optional[Location] = None - world: Optional[World] = None + world: Optional[MultiWorld] = None game: str = "Generic" type: str = None pedestal_credit_text = "and the Unknown Item" diff --git a/Main.py b/Main.py index 9a507e85..f931b6ce 100644 --- a/Main.py +++ b/Main.py @@ -9,7 +9,7 @@ import concurrent.futures import pickle from BaseClasses import MultiWorld, CollectionState, Region, Item -from worlds.alttp import ALttPLocation, ALttPItem +from worlds.alttp import ALttPLocation from worlds.alttp.Items import ItemFactory, item_table, item_name_groups from worlds.alttp.Regions import create_regions, mark_light_world_regions, \ lookup_vanilla_location_to_entrance @@ -25,6 +25,7 @@ from Utils import output_path, parse_player_names, get_options, __version__, _ve from worlds.hk import gen_hollow, set_rules as set_hk_rules from worlds.hk import create_regions as hk_create_regions from worlds.generic.Rules import locality_rules +from worlds import Games import Patch seeddigits = 20 @@ -396,7 +397,7 @@ def main(args, seed=None): for location in [loc for loc in world.get_filled_locations() if type(loc.address) is int]: main_entrance = get_entrance_to_region(location.parent_region) - if location.game == "Hollow Knight": + if location.game == Games.HK: checks_in_area[location.player]["Light World"].append(location.address) elif location.parent_region.dungeon: dungeonname = {'Inverted Agahnims Tower': 'Agahnims Tower', @@ -573,6 +574,7 @@ def copy_world(world): item.location = ret.get_location(location.name, location.player) item.world = ret item.type = location.item.type + item.game = location.item.game if location.event: ret.get_location(location.name, location.player).event = True diff --git a/worlds/__init__.py b/worlds/__init__.py index 3d06205a..172b5b20 100644 --- a/worlds/__init__.py +++ b/worlds/__init__.py @@ -1,5 +1,9 @@ +import enum + __all__ = {"lookup_any_item_id_to_name", - "lookup_any_location_id_to_name"} + "lookup_any_location_id_to_name", + "network_data_package", + "Games"} from .alttp.Items import lookup_id_to_name as alttp from .hk.Items import lookup_id_to_name as hk @@ -13,3 +17,9 @@ lookup_any_location_id_to_name = {**Regions.lookup_id_to_name, **Locations.looku network_data_package = {"lookup_any_location_id_to_name": lookup_any_location_id_to_name, "lookup_any_item_id_to_name": lookup_any_item_id_to_name, "version": 1} + +@enum.unique +class Games(str, enum.Enum): + HK = "Hollow Knight" + LTTP = "A Link to the Past" + diff --git a/worlds/alttp/Items.py b/worlds/alttp/Items.py index 6b43742c..5057bd45 100644 --- a/worlds/alttp/Items.py +++ b/worlds/alttp/Items.py @@ -200,6 +200,21 @@ item_table = {'Bow': (True, None, 0x0B, 'You have\nchosen the\narcher class.', ' 'Open Floodgate': (True, 'Event', None, None, None, None, None, None, None, None), } +progression_mapping = { + "Golden Sword": ("Progressive Sword", 4), + "Tempered Sword": ("Progressive Sword", 3), + "Master Sword": ("Progressive Sword", 2), + "Fighter Sword": ("Progressive Sword", 1), + "Titans Mitts": ("Progressive Glove", 2), + "Power Glove": ("Progressive Glove", 1), + "Blue Shield": ("Progressive Shield", 1), + "Red Shield": ("Progressive Shield", 2), + "Mirror Shield": ("Progressive Shield", 3), + "Silver Bow": ("Progressive Bow", 2), + "Bow": ("Progressive Bow", 1) + +} + lookup_id_to_name = {data[2]: name for name, data in item_table.items() if type(data[2]) == int} hint_blacklist = {"Triforce"} diff --git a/worlds/hk/Items.py b/worlds/hk/Items.py index 639a4091..5d5ab20a 100644 --- a/worlds/hk/Items.py +++ b/worlds/hk/Items.py @@ -2,10 +2,12 @@ # do not edit manually from .Types import HKItemData +from typing import Dict, Set item_table = \ { '150_Geo-Resting_Grounds_Chest': HKItemData(advancement=False, id=16777336, type='Geo'), '160_Geo-Weavers_Den_Chest': HKItemData(advancement=False, id=16777338, type='Geo'), + '1_Geo': HKItemData(advancement=False, id=16777339, type='Fake'), '200_Geo-False_Knight_Chest': HKItemData(advancement=False, id=16777331, type='Geo'), '380_Geo-Soul_Master_Chest': HKItemData(advancement=False, id=16777332, type='Geo'), '620_Geo-Mantis_Lords_Chest': HKItemData(advancement=False, id=16777335, type='Geo'), @@ -78,9 +80,11 @@ item_table = \ 'Dream_Gate': HKItemData(advancement=True, id=16777229, type='Skill'), 'Dream_Nail': HKItemData(advancement=True, id=16777228, type='Skill'), 'Dream_Wielder': HKItemData(advancement=False, id=16777270, type='Charm'), + 'Dreamer': HKItemData(advancement=True, id=16777221, type='Fake'), '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'), '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'), @@ -152,6 +156,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'), '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'), @@ -256,6 +261,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'), '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'), @@ -291,6 +297,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'), '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'), @@ -374,4 +381,7 @@ item_table = \ 'Whispering_Root-Waterways': HKItemData(advancement=True, id=16777410, type='Root'), 'World_Sense': HKItemData(advancement=False, id=16777220, type='Dreamer')} -lookup_id_to_name = {data.id: item_name for item_name, data in item_table.items()} \ No newline at end of file +lookup_id_to_name:Dict[int, str] = {data.id: item_name for item_name, data in item_table.items()} +lookup_type_to_names:Dict[str, Set[str]] = {} +for item, item_data in item_table.items(): + lookup_type_to_names.setdefault(item_data.type, set()).add(item) \ No newline at end of file diff --git a/worlds/hk/Rules.py b/worlds/hk/Rules.py index c339be07..529a27a0 100644 --- a/worlds/hk/Rules.py +++ b/worlds/hk/Rules.py @@ -5,9 +5,6 @@ from ..generic.Rules import set_rule def set_rules(world, player): if world.logic[player] != 'nologic': - # world.completion_condition[player] = lambda state: state.has('Lurien', player) and \ - # state.has('Monomon', player) and \ - # state.has('Herrah', player) world.completion_condition[player] = lambda state: state.has('Hollow Knight', player) @@ -22,8 +19,8 @@ def set_rules(world, player): set_rule(world.get_location("Shade_Cloak", player), lambda state: (state.has("Abyss", player) and ((state.has("Mantis_Claw", player) and ((state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) or state.has("Monarch_Wings", player))) or (state.has("Monarch_Wings", player) and ((state.world.SHADESKIPS[player] or (state.has("Mothwing_Cloak", player) and state.has("Shade_Cloak", player))) or ((state.has("Queen_Fragment", player) and state.has("King_Fragment", player)) and state.has("Void_Heart", player))))))) set_rule(world.get_location("Isma's_Tear", player), lambda state: state.has("Isma's_Grove", player)) set_rule(world.get_location("Dream_Nail", player), lambda state: state.has("Upper_Resting_Grounds", player)) - set_rule(world.get_location("Dream_Gate", player), lambda state: (state.has("Upper_Resting_Grounds", player) and state.has_essence(1000, player))) - set_rule(world.get_location("Awoken_Dream_Nail", player), lambda state: (state.has("Upper_Resting_Grounds", player) and state.has_essence(1000, player))) + set_rule(world.get_location("Dream_Gate", player), lambda state: (state.has("Upper_Resting_Grounds", player) and state.has_essence(player, 300))) + set_rule(world.get_location("Awoken_Dream_Nail", player), lambda state: (state.has("Upper_Resting_Grounds", player) and state.has_essence(player, 300))) set_rule(world.get_location("Vengeful_Spirit", player), lambda state: state.has("Ancestral_Mound", player)) set_rule(world.get_location("Shade_Soul", player), lambda state: ((state.has("Soul_Sanctum", player) and state.has("Elegant_Key", 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))) or (state.has("Desolate_Dive", player) or state.has("Descending_Dark", player))) or state.world.SPICYSKIPS[player]))) set_rule(world.get_location("Desolate_Dive", player), lambda state: (state.has("Soul_Sanctum", player) and (state.has("Mantis_Claw", player) or state.has("Monarch_Wings", player)))) @@ -34,7 +31,7 @@ def set_rules(world, player): set_rule(world.get_location("Dash_Slash", player), lambda state: state.has("Oro_Bench", player)) set_rule(world.get_location("Great_Slash", player), lambda state: (state.has("Greenpath", player) and (state.has("Mantis_Claw", player) and (((state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) and (state.has("Crystal_Heart", player) or state.has("Monarch_Wings", player))) or (state.has("Monarch_Wings", player) and state.has("Crystal_Heart", player)))))) set_rule(world.get_location("Focus", player), lambda state: state.has("King's_Pass", player)) - set_rule(world.get_location("Grubsong", player), lambda state: (state.has("Crossroads", player) and state.has_grubs(30, player))) + set_rule(world.get_location("Grubsong", player), lambda state: (state.has("Crossroads", player) and state.has_grubs(player, 5))) set_rule(world.get_location("Baldur_Shell", player), lambda state: ((((((((state.has("Vengeful_Spirit", player) or state.has("Shade_Soul", player)) or (state.has("Desolate_Dive", player) or state.has("Descending_Dark", player))) or state.has("Grubberfly's_Elegy", player)) or state.has("Glowing_Womb", player)) or ((state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) and state.has("Dash_Slash", player))) or (state.world.MILDSKIPS[player] and (state.has("Weaversong", player) or (state.has("Spore_Shroom", player) and (state.world.NOTCURSED[player] or state.has("Focus", player)))))) or (((state.has("Mark_of_Pride", player) or state.has("Cyclone_Slash", player)) or (state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player))) and state.world.SPICYSKIPS[player])) and (state.has("Howling_Cliffs", player) or (state.has("Greenpath", 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))) or state.has("Crystal_Heart", player)) or state.world.SHADESKIPS[player]))))) set_rule(world.get_location("Fury_of_the_Fallen", player), lambda state: state.has("King's_Pass", player)) set_rule(world.get_location("Lifeblood_Core", player), lambda state: ((state.has("Abyss", player) and ((state.has("Lifeblood_Heart", player) or state.has("Lifeblood_Core", player)) or state.has("Joni's_Blessing", player))) and (state.world.SPICYSKIPS[player] or ((state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) and state.has("Monarch_Wings", player))))) @@ -46,17 +43,17 @@ def set_rules(world, player): set_rule(world.get_location("Spore_Shroom", player), lambda state: ((state.has("Bottom_Left_Fungal_Wastes", player) and (state.has("Mantis_Claw", player) or state.has("Monarch_Wings", player))) and ((state.has("Isma's_Tear", player) or (state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player))) or (state.has("Mantis_Claw", player) and state.has("Crystal_Heart", player))))) set_rule(world.get_location("Soul_Catcher", player), lambda state: (state.has("Ancestral_Mound", player) and ((state.has("Mantis_Claw", player) or (((((((state.has("Vengeful_Spirit", player) or state.has("Shade_Soul", player)) or (state.has("Desolate_Dive", player) or state.has("Descending_Dark", player))) or state.has("Grubberfly's_Elegy", player)) or state.has("Glowing_Womb", player)) or ((state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) and state.has("Dash_Slash", player))) or (state.world.MILDSKIPS[player] and (state.has("Weaversong", player) or (state.has("Spore_Shroom", player) and (state.world.NOTCURSED[player] or state.has("Focus", player)))))) or (((state.has("Mark_of_Pride", player) or state.has("Cyclone_Slash", player)) or (state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player))) and state.world.SPICYSKIPS[player]))) or (state.has("Monarch_Wings", player) and state.world.SHADESKIPS[player])))) set_rule(world.get_location("Soul_Eater", player), lambda state: ((state.has("Upper_Resting_Grounds", player) and (state.has("Desolate_Dive", player) or state.has("Descending_Dark", player))) and (state.has("Mantis_Claw", player) or state.has("Monarch_Wings", player)))) - set_rule(world.get_location("Glowing_Womb", player), lambda state: ((state.has("Crossroads", player) and (state.has("Crystal_Heart", player) or ((state.world.SPIKETUNNELS[player] and (state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player))) and ((state.has("Dashmaster", player) or (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.has("Mantis_Claw", player) or state.has("Monarch_Wings", player)) or (((state.has("Lurien", player) or state.has("Monomon", player)) or state.has("Herrah", player)) and state.world.SPICYSKIPS[player])))) + set_rule(world.get_location("Glowing_Womb", player), lambda state: ((state.has("Crossroads", player) and (state.has("Crystal_Heart", player) or ((state.world.SPIKETUNNELS[player] and (state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player))) and ((state.has("Dashmaster", player) or (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.has("Mantis_Claw", player) or state.has("Monarch_Wings", player)) or ((((state.has("Lurien", player) or state.has("Monomon", player)) or state.has("Herrah", player)) or state.has("Dreamer", player)) and state.world.SPICYSKIPS[player])))) set_rule(world.get_location("Nailmaster's_Glory", player), lambda state: ((((state.has("Dirtmouth", player) and state.has("Crossroads", player)) and state.has("Cyclone_Slash", player)) and state.has("Dash_Slash", player)) and state.has("Great_Slash", player))) set_rule(world.get_location("Joni's_Blessing", player), lambda state: (state.has("Howling_Cliffs", player) and (state.world.DARKROOMS[player] or state.has("Lumafly_Lantern", player)))) - set_rule(world.get_location("Shape_of_Unn", player), lambda state: (state.has("Lake_of_Unn", player) and (((state.has("Isma's_Tear", player) and (state.has("Mantis_Claw", player) or state.has("Monarch_Wings", player))) or ((((((state.has("Mantis_Claw", player) and (state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player))) and state.has("Crystal_Heart", player)) and state.world.ACIDSKIPS[player]) and state.has("Monarch_Wings", player)) and (((state.has("Vengeful_Spirit", player) or state.has("Shade_Soul", player)) and state.world.FIREBALLSKIPS[player]) or ((state.has("Sharp_Shadow", player) and state.has("Mothwing_Cloak", player)) and state.has("Shade_Cloak", player)))) and state.world.SPICYSKIPS[player])) or ((((state.world.SPICYSKIPS[player] and state.world.ACIDSKIPS[player]) and state.has("Monarch_Wings", player)) and state.has("Crystal_Heart", player)) and ((state.has("Sharp_Shadow", player) and state.has("Mothwing_Cloak", player)) and state.has("Shade_Cloak", player)))))) + set_rule(world.get_location("Shape_of_Unn", player), lambda state: (state.has("Lake_of_Unn", player) and (((state.has("Isma's_Tear", player) and (state.has("Mantis_Claw", player) or state.has("Monarch_Wings", player))) or ((((((state.has("Mantis_Claw", player) and (state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player))) and state.has("Crystal_Heart", player)) and state.world.ACIDSKIPS[player]) and state.has("Monarch_Wings", player)) and (((state.has("Vengeful_Spirit", player) or state.has("Shade_Soul", player)) and state.world.FIREBALLSKIPS[player]) or (state.has("Sharp_Shadow", player) and (state.has("Mothwing_Cloak", player) and state.has("Shade_Cloak", player))))) and state.world.SPICYSKIPS[player])) or ((((state.world.SPICYSKIPS[player] and state.world.ACIDSKIPS[player]) and state.has("Monarch_Wings", player)) and state.has("Crystal_Heart", player)) and (state.has("Sharp_Shadow", player) and (state.has("Mothwing_Cloak", player) and state.has("Shade_Cloak", player))))))) set_rule(world.get_location("Hiveblood", 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("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("Dream_Wielder", player), lambda state: (state.has("Upper_Resting_Grounds", player) and state.has_essence(1000, player))) + set_rule(world.get_location("Dream_Wielder", player), lambda state: (state.has("Upper_Resting_Grounds", player) and state.has_essence(player, 300))) set_rule(world.get_location("Dashmaster", player), lambda state: state.has("Mantis_Outskirts", player)) set_rule(world.get_location("Quick_Slash", player), lambda state: (((state.has("Oro_Bench", player) and (state.has("Mantis_Claw", player) or state.has("Monarch_Wings", player))) and (state.has("Desolate_Dive", player) or state.has("Descending_Dark", player))) and ((state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) or state.world.SPIKETUNNELS[player]))) set_rule(world.get_location("Spell_Twister", player), lambda state: (state.has("Soul_Sanctum", player) and (state.has("Mantis_Claw", player) or state.has("Monarch_Wings", player)))) set_rule(world.get_location("Deep_Focus", player), lambda state: (state.has("Upper_Crystal_Peak", player) and (((state.has("Mantis_Claw", player) or state.has("Monarch_Wings", player)) and state.has("Crystal_Heart", player)) or ((state.world.SPICYSKIPS[player] and state.has("Monarch_Wings", player)) and (state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)))))) - set_rule(world.get_location("Grubberfly's_Elegy", player), lambda state: (state.has("Crossroads", player) and state.has_grubs(30, player))) + set_rule(world.get_location("Grubberfly's_Elegy", player), lambda state: (state.has("Crossroads", player) and state.has_grubs(player, 5))) set_rule(world.get_location("Queen_Fragment", player), lambda state: (((state.has("Far_Queen's_Gardens", player) and (state.has("Mothwing_Cloak", player) and state.has("Shade_Cloak", player))) and (state.has("Mantis_Claw", player) or state.has("Monarch_Wings", 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("King_Fragment", player), lambda state: (((((state.has("Palace_Grounds", player) and ((state.has("Dream_Nail", player) and state.has("Dream_Gate", player)) and state.has("Awoken_Dream_Nail", player))) and state.has("Mantis_Claw", player)) and (state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player))) and state.has("Monarch_Wings", player)) and state.has("Crystal_Heart", player))) set_rule(world.get_location("Void_Heart", player), lambda state: ((((state.has("Abyss", player) and (state.has("Mothwing_Cloak", player) and state.has("Shade_Cloak", player))) and ((state.has("Dream_Nail", player) or state.has("Dream_Gate", player)) or state.has("Awoken_Dream_Nail", player))) and (((state.has("Queen_Fragment", player) and state.has("King_Fragment", player)) or (state.has("Queen_Fragment", player) and state.has("Void_Heart", player))) or (state.has("King_Fragment", player) and state.has("Void_Heart", player)))) and ((state.world.MILDSKIPS[player] or state.has("Mantis_Claw", player)) or state.has("Monarch_Wings", player)))) @@ -69,12 +66,12 @@ def set_rules(world, player): set_rule(world.get_location("Simple_Key-City", player), lambda state: (state.has("Left_Elevator", player) and ((((state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) or state.has("Monarch_Wings", player)) or state.has("Crystal_Heart", player)) or state.world.MILDSKIPS[player]))) set_rule(world.get_location("Simple_Key-Lurker", player), lambda state: ((state.has("Pale_Lurker_Area", player) and state.has("Mantis_Claw", 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("Shopkeeper's_Key", player), lambda state: (state.has("Upper_Crystal_Peak", player) and (state.has("Mantis_Claw", player) or state.has("Monarch_Wings", player)))) - set_rule(world.get_location("Love_Key", player), lambda state: (state.has("Bottom_Right_Queen's_Gardens", player) and (((state.has("Isma's_Tear", player) or (((state.has("Mantis_Claw", player) and (state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player))) and state.has("Crystal_Heart", player)) and state.world.ACIDSKIPS[player])) or ((((state.world.ACIDSKIPS[player] and state.has("Mantis_Claw", player)) and (state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player))) and state.has("Monarch_Wings", player)) and (state.has("Dashmaster", 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))))))) or (((state.world.SPICYSKIPS[player] and state.world.ACIDSKIPS[player]) and ((state.has("Sharp_Shadow", player) and state.has("Mothwing_Cloak", player)) and state.has("Shade_Cloak", player))) and state.has("Monarch_Wings", player))))) + set_rule(world.get_location("Love_Key", player), lambda state: (state.has("Bottom_Right_Queen's_Gardens", player) and (((state.has("Isma's_Tear", player) or (((state.has("Mantis_Claw", player) and (state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player))) and state.has("Crystal_Heart", player)) and state.world.ACIDSKIPS[player])) or ((((state.world.ACIDSKIPS[player] and state.has("Mantis_Claw", player)) and (state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player))) and state.has("Monarch_Wings", player)) and (state.has("Dashmaster", 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))))))) or (((state.world.SPICYSKIPS[player] and state.world.ACIDSKIPS[player]) and (state.has("Sharp_Shadow", player) and (state.has("Mothwing_Cloak", player) and state.has("Shade_Cloak", player)))) and state.has("Monarch_Wings", player))))) set_rule(world.get_location("King's_Brand", player), lambda state: (state.has("Cast_Off_Shell", 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("Godtuner", player), lambda state: (state.has("Junk_Pit", player) and (((state.has("Simple_Key-Sly", player) and state.has("Simple_Key-City", player)) and state.has("Simple_Key-Basin", player)) and state.has("Simple_Key-Lurker", player)))) set_rule(world.get_location("Collector's_Map", player), lambda state: (((state.has("Tower_of_Love", player) and state.has("Love_Key", player)) and (state.has("Mantis_Claw", player) or (state.has("Monarch_Wings", player) and state.world.SPICYSKIPS[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("Mask_Shard-Seer", player), lambda state: (state.has("Upper_Resting_Grounds", player) and state.has_essence(1000, player))) - set_rule(world.get_location("Mask_Shard-5_Grubs", player), lambda state: (state.has("Crossroads", player) and state.has_grubs(30, player))) + set_rule(world.get_location("Mask_Shard-Seer", player), lambda state: (state.has("Upper_Resting_Grounds", player) and state.has_essence(player, 300))) + set_rule(world.get_location("Mask_Shard-5_Grubs", player), lambda state: (state.has("Crossroads", player) and state.has_grubs(player, 5))) set_rule(world.get_location("Mask_Shard-Brooding_Mawlek", player), lambda state: (state.has("Crossroads", 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))) or (state.has("Desolate_Dive", player) or state.has("Descending_Dark", player))) or state.world.SPICYSKIPS[player]))) set_rule(world.get_location("Mask_Shard-Crossroads_Goam", player), lambda state: (state.has("Crossroads", player) and ((state.has("Mantis_Claw", player) or state.has("Monarch_Wings", player)) or state.world.MILDSKIPS[player]))) set_rule(world.get_location("Mask_Shard-Stone_Sanctuary", player), lambda state: state.has("Stone_Sanctuary", player)) @@ -85,7 +82,7 @@ def set_rules(world, player): set_rule(world.get_location("Mask_Shard-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)))))) set_rule(world.get_location("Mask_Shard-Grey_Mourner", player), lambda state: (((((((state.has("Upper_Resting_Grounds", player) and state.has("Top_Left_Queen's_Gardens", player)) and (state.has("Desolate_Dive", player) or state.has("Descending_Dark", player))) and state.has("Mantis_Claw", player)) and state.has("Monarch_Wings", player)) and state.has("Crystal_Heart", player)) and state.has("Isma's_Tear", player)) and (state.has("Mothwing_Cloak", player) and state.has("Shade_Cloak", player)))) set_rule(world.get_location("Mask_Shard-Bretta", player), lambda state: (((state.has("Mantis_Outskirts", player) and state.has("Dirtmouth", player)) and state.has("Mantis_Claw", player)) and ((((state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) or state.has("Monarch_Wings", player)) or state.has("Crystal_Heart", 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.SHADESKIPS[player])))) - set_rule(world.get_location("Vessel_Fragment-Seer", player), lambda state: (state.has("Upper_Resting_Grounds", player) and state.has_essence(1000, player))) + set_rule(world.get_location("Vessel_Fragment-Seer", player), lambda state: (state.has("Upper_Resting_Grounds", player) and state.has_essence(player, 300))) set_rule(world.get_location("Vessel_Fragment-Greenpath", player), lambda state: (state.has("Greenpath", player) and (state.has("Mantis_Claw", player) or (state.world.SPICYSKIPS[player] and state.has("Monarch_Wings", player))))) set_rule(world.get_location("Vessel_Fragment-City", player), lambda state: (state.has("Upper_King's_Station", 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))) or (state.has("Desolate_Dive", player) or state.has("Descending_Dark", player))) or state.world.SPICYSKIPS[player]))) set_rule(world.get_location("Vessel_Fragment-Crossroads", player), lambda state: state.has("Left_Elevator", player)) @@ -99,8 +96,8 @@ def set_rules(world, player): 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])))) - set_rule(world.get_location("Pale_Ore-Seer", player), lambda state: (state.has("Upper_Resting_Grounds", player) and state.has_essence(1000, player))) - set_rule(world.get_location("Pale_Ore-Grubs", player), lambda state: (state.has("Crossroads", player) and state.has_grubs(30, player))) + set_rule(world.get_location("Pale_Ore-Seer", player), lambda state: (state.has("Upper_Resting_Grounds", player) and state.has_essence(player, 300))) + set_rule(world.get_location("Pale_Ore-Grubs", player), lambda state: (state.has("Crossroads", player) and state.has_grubs(player, 5))) set_rule(world.get_location("Pale_Ore-Colosseum", player), lambda state: ((state.has("Colosseum", player) and (state.has("Mantis_Claw", player) or (state.world.SPICYSKIPS[player] and state.has("Monarch_Wings", 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("200_Geo-False_Knight_Chest", player), lambda state: state.has("Crossroads", player)) set_rule(world.get_location("380_Geo-Soul_Master_Chest", player), lambda state: (state.has("Soul_Sanctum", player) and state.has("Mantis_Claw", player))) @@ -110,7 +107,7 @@ def set_rules(world, player): set_rule(world.get_location("150_Geo-Resting_Grounds_Chest", player), lambda state: (state.has("Upper_Resting_Grounds", player) and (state.has("Desolate_Dive", player) or state.has("Descending_Dark", player)))) set_rule(world.get_location("80_Geo-Crystal_Peak_Chest", player), lambda state: (state.has("Upper_Crystal_Peak", player) and ((state.has("Mantis_Claw", player) and (((state.has("Sprintmaster", player) and state.has("Dashmaster", player)) or (state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player))) or (state.has("Crystal_Heart", player) and state.world.SPICYSKIPS[player]))) or ((((state.has("Monarch_Wings", player) and state.has("Grubberfly's_Elegy", player)) and state.world.SHADESKIPS[player]) and state.world.SPICYSKIPS[player]) and ((state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) or (state.has("Sprintmaster", player) and state.has("Dashmaster", player))))))) set_rule(world.get_location("160_Geo-Weavers_Den_Chest", player), lambda state: (((state.has("Weaver's_Den", player) and (state.has("Mantis_Claw", player) or (state.has("Monarch_Wings", player) and state.world.SPICYSKIPS[player]))) and (((state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) and state.has("Monarch_Wings", player)) or state.has("Crystal_Heart", player))) and ((state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) or state.world.SPIKETUNNELS[player]))) - set_rule(world.get_location("Rancid_Egg-Grubs", player), lambda state: (state.has("Crossroads", player) and state.has_grubs(30, player))) + set_rule(world.get_location("Rancid_Egg-Grubs", player), lambda state: (state.has("Crossroads", player) and state.has_grubs(player, 5))) set_rule(world.get_location("Rancid_Egg-Sheo", player), lambda state: ((state.has("Greenpath", player) and state.has("Mantis_Claw", player)) and (((state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) and (state.has("Crystal_Heart", player) or state.has("Monarch_Wings", player))) or (state.has("Monarch_Wings", player) and state.has("Crystal_Heart", player))))) set_rule(world.get_location("Rancid_Egg-Fungal_Core", player), lambda state: (state.has("Fungal_Core", player) and (state.has("Mantis_Claw", player) or state.has("Monarch_Wings", player)))) set_rule(world.get_location("Rancid_Egg-Queen's_Gardens", player), lambda state: (state.has("Top_Right_Queen's_Gardens", 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))))) @@ -143,15 +140,15 @@ def set_rules(world, player): set_rule(world.get_location("Wanderer's_Journal-Kingdom's_Edge_Entrance", player), lambda state: (state.has("Central_Kingdom's_Edge", player) and state.has("Mantis_Claw", player))) set_rule(world.get_location("Wanderer's_Journal-Kingdom's_Edge_Camp", player), lambda state: (state.has("Center_Right_Kingdom's_Edge", player) and (state.has("Monarch_Wings", player) or (state.has("Mantis_Claw", player) and (state.world.SPICYSKIPS[player] or state.has("Cast_Off_Shell", player)))))) set_rule(world.get_location("Wanderer's_Journal-Kingdom's_Edge_Requires_Dive", player), lambda state: (state.has("Center_Right_Kingdom's_Edge", player) and (state.has("Desolate_Dive", player) or state.has("Descending_Dark", player)))) - set_rule(world.get_location("Hallownest_Seal-Crossroads_Well", player), lambda state: (state.has("Crossroads", player) and ((state.has("Mantis_Claw", player) or (state.has("Monarch_Wings", player) and (state.world.SHADESKIPS[player] or (((state.has("Lurien", player) or state.has("Monomon", player)) or state.has("Herrah", player)) and state.world.SPICYSKIPS[player])))) or (((((state.has("Lurien", player) or state.has("Monomon", player)) or state.has("Herrah", player)) and state.world.SPICYSKIPS[player]) and (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)))))))) - set_rule(world.get_location("Hallownest_Seal-Grubs", player), lambda state: (state.has("Crossroads", player) and state.has_grubs(30, player))) + set_rule(world.get_location("Hallownest_Seal-Crossroads_Well", player), lambda state: (state.has("Crossroads", player) and ((state.has("Mantis_Claw", player) or (state.has("Monarch_Wings", player) and (state.world.SHADESKIPS[player] or ((((state.has("Lurien", player) or state.has("Monomon", player)) or state.has("Herrah", player)) or state.has("Dreamer", player)) and state.world.SPICYSKIPS[player])))) or ((((((state.has("Lurien", player) or state.has("Monomon", player)) or state.has("Herrah", player)) or state.has("Dreamer", player)) and state.world.SPICYSKIPS[player]) and (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)))))))) + set_rule(world.get_location("Hallownest_Seal-Grubs", player), lambda state: (state.has("Crossroads", player) and state.has_grubs(player, 5))) set_rule(world.get_location("Hallownest_Seal-Greenpath", player), lambda state: (state.has("Greenpath", player) and (((state.has("Isma's_Tear", player) or (state.has("Monarch_Wings", 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)))))) 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)))) or state.has("Dashmaster", player)) or state.has("Monarch_Wings", player)) or state.has("Mantis_Claw", player)))) or state.has("Crystal_Heart", player)))) set_rule(world.get_location("Hallownest_Seal-Fog_Canyon_West", player), lambda state: state.has("Left_Fog_Canyon", player)) set_rule(world.get_location("Hallownest_Seal-Fog_Canyon_East", player), lambda state: ((state.has("Right_Fog_Canyon", 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.has("Crossroads", player) and ((state.has("Isma's_Tear", player) or (((state.has("Mantis_Claw", player) and (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))) and state.world.ACIDSKIPS[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))) or state.has("Crystal_Heart", player)) or state.world.SPICYSKIPS[player])))) set_rule(world.get_location("Hallownest_Seal-Queen's_Station", player), lambda state: (state.has("Queen's_Station", player) and state.has("Monarch_Wings", player))) set_rule(world.get_location("Hallownest_Seal-Fungal_Wastes_Sporgs", player), lambda state: state.has("Fungal_Wastes", player)) set_rule(world.get_location("Hallownest_Seal-Mantis_Lords", player), lambda state: (state.has("Mantis_Village", player) and (state.has("Mantis_Claw", player) or (state.has("Monarch_Wings", player) and state.world.MILDSKIPS[player])))) - set_rule(world.get_location("Hallownest_Seal-Seer", player), lambda state: (state.has("Upper_Resting_Grounds", player) and state.has_essence(1000, player))) + set_rule(world.get_location("Hallownest_Seal-Seer", player), lambda state: (state.has("Upper_Resting_Grounds", player) and state.has_essence(player, 300))) set_rule(world.get_location("Hallownest_Seal-Resting_Grounds_Catacombs", player), lambda state: (state.has("Upper_Resting_Grounds", player) and (state.has("Desolate_Dive", player) or state.has("Descending_Dark", player)))) set_rule(world.get_location("Hallownest_Seal-King's_Station", player), lambda state: (state.has("Upper_King's_Station", player) and (state.has("Mantis_Claw", player) or state.has("Monarch_Wings", player)))) set_rule(world.get_location("Hallownest_Seal-City_Rafters", player), lambda state: state.has("Left_City", player)) @@ -160,7 +157,7 @@ def set_rules(world, player): set_rule(world.get_location("Hallownest_Seal-Deepnest_By_Mantis_Lords", player), lambda state: (state.has("Far_Right_Deepnest", player) and state.has("Mantis_Claw", player))) set_rule(world.get_location("Hallownest_Seal-Beast's_Den", player), lambda state: state.has("Beast's_Den", player)) set_rule(world.get_location("Hallownest_Seal-Queen's_Gardens", player), lambda state: (state.has("Top_Left_Queen's_Gardens", 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.SPICYSKIPS[player])))) - set_rule(world.get_location("King's_Idol-Grubs", player), lambda state: (state.has("Crossroads", player) and state.has_grubs(30, player))) + set_rule(world.get_location("King's_Idol-Grubs", player), lambda state: (state.has("Crossroads", player) and state.has_grubs(player, 5))) set_rule(world.get_location("King's_Idol-Cliffs", player), lambda state: state.has("Howling_Cliffs", player)) set_rule(world.get_location("King's_Idol-Crystal_Peak", player), lambda state: (state.has("Upper_Crystal_Peak", player) and ((state.has("Mantis_Claw", player) and (state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player))) or state.has("Monarch_Wings", player)))) set_rule(world.get_location("King's_Idol-Glade_of_Hope", player), lambda state: (state.has("Spirits_Glade", player) and (state.has("Mantis_Claw", player) or (state.has("Monarch_Wings", player) and (state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)))))) @@ -168,11 +165,11 @@ def set_rules(world, player): set_rule(world.get_location("King's_Idol-Great_Hopper", player), lambda state: state.has("Top_Kingdom's_Edge", player)) set_rule(world.get_location("King's_Idol-Pale_Lurker", player), lambda state: state.has("Pale_Lurker_Area", player)) set_rule(world.get_location("King's_Idol-Deepnest", player), lambda state: state.has("Failed_Tramway", player)) - set_rule(world.get_location("Arcane_Egg-Seer", player), lambda state: (state.has("Upper_Resting_Grounds", player) and state.has_essence(1000, player))) + set_rule(world.get_location("Arcane_Egg-Seer", player), lambda state: (state.has("Upper_Resting_Grounds", player) and state.has_essence(player, 300))) set_rule(world.get_location("Arcane_Egg-Lifeblood_Core", player), lambda state: ((state.has("Abyss", player) and ((state.has("Lifeblood_Heart", player) or state.has("Lifeblood_Core", player)) or state.has("Joni's_Blessing", player))) and (state.has("Crystal_Heart", player) and (state.has("Mantis_Claw", player) or state.has("Monarch_Wings", player))))) set_rule(world.get_location("Arcane_Egg-Shade_Cloak", player), lambda state: ((state.has("Abyss", player) and ((state.has("Mantis_Claw", player) and (state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player))) or state.has("Monarch_Wings", player))) and ((state.has("Mothwing_Cloak", player) and state.has("Shade_Cloak", player)) or ((state.has("Queen_Fragment", player) and state.has("King_Fragment", player)) and state.has("Void_Heart", player))))) set_rule(world.get_location("Arcane_Egg-Birthplace", player), lambda state: (state.has("Abyss", player) and (((state.has("Queen_Fragment", player) and state.has("King_Fragment", player)) or (state.has("Queen_Fragment", player) and state.has("Void_Heart", player))) or (state.has("King_Fragment", player) and state.has("Void_Heart", player))))) - set_rule(world.get_location("Whispering_Root-Crossroads", player), lambda state: (((state.has("Crossroads", player) and state.has("Mantis_Claw", player)) and (((state.has("Monarch_Wings", player) or state.has("Crystal_Heart", player)) or (state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player))) or (((state.has("Lurien", player) or state.has("Monomon", player)) or state.has("Herrah", player)) and state.world.SPICYSKIPS[player]))) and ((state.has("Dream_Nail", player) or state.has("Dream_Gate", player)) or state.has("Awoken_Dream_Nail", player)))) + set_rule(world.get_location("Whispering_Root-Crossroads", player), lambda state: (((state.has("Crossroads", player) and state.has("Mantis_Claw", player)) and (((state.has("Monarch_Wings", player) or state.has("Crystal_Heart", player)) or (state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player))) or ((((state.has("Lurien", player) or state.has("Monomon", player)) or state.has("Herrah", player)) or state.has("Dreamer", player)) and state.world.SPICYSKIPS[player]))) and ((state.has("Dream_Nail", player) or state.has("Dream_Gate", player)) or state.has("Awoken_Dream_Nail", player)))) set_rule(world.get_location("Whispering_Root-Greenpath", player), lambda state: (((state.has("Far_Queen's_Gardens", player) and state.has("Greenpath", player)) and state.has("Mantis_Claw", player)) and ((state.has("Dream_Nail", player) or state.has("Dream_Gate", player)) or state.has("Awoken_Dream_Nail", player)))) set_rule(world.get_location("Whispering_Root-Leg_Eater", player), lambda state: (state.has("Right_Fog_Canyon", player) and ((state.has("Dream_Nail", player) or state.has("Dream_Gate", player)) or state.has("Awoken_Dream_Nail", player)))) set_rule(world.get_location("Whispering_Root-Mantis_Village", player), lambda state: ((state.has("Fungal_Wastes", player) and state.has("Mantis_Claw", player)) and ((state.has("Dream_Nail", player) or state.has("Dream_Gate", player)) or state.has("Awoken_Dream_Nail", player)))) @@ -194,7 +191,7 @@ def set_rules(world, player): set_rule(world.get_location("Boss_Essence-No_Eyes", player), lambda state: (((state.has("Stone_Sanctuary", player) and state.has("Lumafly_Lantern", player)) and ((state.has("Dream_Nail", player) or state.has("Dream_Gate", player)) or state.has("Awoken_Dream_Nail", 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.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) or state.world.MILDSKIPS[player])) or state.world.SPICYSKIPS[player]))) set_rule(world.get_location("Boss_Essence-Galien", player), lambda state: ((((state.has("Failed_Tramway", player) and (state.has("Lumafly_Lantern", player) or state.world.DARKROOMS[player])) or (state.has("Dark_Deepnest", player) and state.has("Mantis_Claw", player))) and ((state.has("Dream_Nail", player) or state.has("Dream_Gate", player)) or state.has("Awoken_Dream_Nail", 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.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) or state.world.MILDSKIPS[player])) or state.world.SPICYSKIPS[player]))) set_rule(world.get_location("Boss_Essence-Markoth", player), lambda state: (((state.has("Center_Right_Kingdom's_Edge", player) and (state.has("Mothwing_Cloak", player) and state.has("Shade_Cloak", player))) and ((state.has("Dream_Nail", player) or state.has("Dream_Gate", player)) or state.has("Awoken_Dream_Nail", 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.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) or state.world.MILDSKIPS[player])) or state.world.SPICYSKIPS[player]))) - set_rule(world.get_location("Boss_Essence-Failed_Champion", player), lambda state: (((state.has("Crossroads", player) and ((state.has("Mantis_Claw", player) and ((state.has("Monarch_Wings", player) or (state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player))) or state.has("Crystal_Heart", player))) or (state.has("Monarch_Wings", player) and (((state.has("Lurien", player) or state.has("Monomon", player)) or state.has("Herrah", player)) and state.world.SPICYSKIPS[player])))) and ((state.has("Dream_Nail", player) or state.has("Dream_Gate", player)) or state.has("Awoken_Dream_Nail", 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("Boss_Essence-Failed_Champion", player), lambda state: (((state.has("Crossroads", player) and ((state.has("Mantis_Claw", player) and ((state.has("Monarch_Wings", player) or (state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player))) or state.has("Crystal_Heart", player))) or (state.has("Monarch_Wings", player) and ((((state.has("Lurien", player) or state.has("Monomon", player)) or state.has("Herrah", player)) or state.has("Dreamer", player)) and state.world.SPICYSKIPS[player])))) and ((state.has("Dream_Nail", player) or state.has("Dream_Gate", player)) or state.has("Awoken_Dream_Nail", 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("Boss_Essence-Soul_Tyrant", player), lambda state: (((state.has("Soul_Sanctum", player) and (state.has("Mantis_Claw", player) or state.has("Monarch_Wings", player))) and ((state.has("Dream_Nail", player) or state.has("Dream_Gate", player)) or state.has("Awoken_Dream_Nail", 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("Boss_Essence-Lost_Kin", player), lambda state: (((state.has("Far_Left_Basin", player) and (state.has("Mantis_Claw", player) or (state.has("Monarch_Wings", player) and state.world.MILDSKIPS[player]))) and ((state.has("Dream_Nail", player) or state.has("Dream_Gate", player)) or state.has("Awoken_Dream_Nail", 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("Boss_Essence-White_Defender", player), lambda state: (((((((state.has("Central_Left_Waterways", player) and (state.has("Mantis_Claw", player) or (state.has("Monarch_Wings", player) and state.world.SPICYSKIPS[player]))) and (state.has("Desolate_Dive", player) or state.has("Descending_Dark", player))) and ((state.has("Dream_Nail", player) or state.has("Dream_Gate", player)) or state.has("Awoken_Dream_Nail", 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("Lurien", player)) and state.has("Monomon", player)) and state.has("Herrah", player))) @@ -278,12 +275,15 @@ 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("Grubfather", player), lambda state: state.has("Crossroads", player)) + # set_rule(world.get_location("Seer", player), lambda state: state.has("Upper_Resting_Grounds", player)) # Events set_rule(world.get_location("Hollow Knight", player), lambda state: state.has('Lurien', player) and \ state.has('Monomon', player) and \ state.has('Herrah', player)) + set_rule(world.get_location("King's_Pass", player), lambda state: (state.has("Howling_Cliffs", player) or (state.has("Dirtmouth", player) and state.has("Mantis_Claw", player)))) set_rule(world.get_location("Dirtmouth", player), lambda state: ((((state.has("Crossroads", player) or ((state.has("Upper_Crystal_Peak", player) and state.has("Mantis_Claw", player)) and state.has("Crystal_Heart", player))) or state.has("King's_Pass", player)) or (state.has("Howling_Cliffs", player) and (state.has("Crystal_Heart", player) or (state.has("Monarch_Wings", player) and (state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)))))) or (state.has("Dirtmouth_Stag", player) and state.has("Can_Stag", player)))) set_rule(world.get_location("Can_Stag", player), lambda state: (((((((((state.has("Crossroads", player) or state.has("Greenpath", player)) or state.has("Queen's_Station", player)) or state.has("Top_Left_Queen's_Gardens", player)) or state.has("Left_Elevator", player)) or state.has("Upper_King's_Station", player)) or (state.has("Right_City", player) and (state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)))) or state.has("Upper_Resting_Grounds", player)) or (state.has("Distant_Village", player) and ((state.has("Mantis_Claw", player) or state.has("Monarch_Wings", player)) or (state.has("Beast's_Den", player) and (state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)))))) or state.has("Palace_Grounds", player))) set_rule(world.get_location("Crossroads", player), lambda state: ((((((((state.has("Dirtmouth", player) or (state.has("Crystal_Peak", player) and state.has("Lumafly_Lantern", player))) or (state.has("Blue_Lake", player) and (state.has("Mantis_Claw", player) or state.has("Monarch_Wings", player)))) or (state.has("Fungal_Wastes", player) and ((((state.has("Isma's_Tear", player) or (state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player))) or state.has("Crystal_Heart", player)) or state.has("Mantis_Claw", player)) or state.has("Monarch_Wings", player)))) or (state.has("Right_Fog_Canyon", player) and (state.has("Mantis_Claw", player) and (state.has("Isma's_Tear", player) or ((state.has("Crystal_Heart", player) or (state.has("Monarch_Wings", player) and (state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)))) and state.world.ACIDSKIPS[player]))))) or state.has("Ancestral_Mound", player)) or state.has("Upper_Tram", player)) or (state.has("Crossroads_Stag", player) and state.has("Can_Stag", player))) or state.has("Left_Elevator", player))) @@ -297,7 +297,7 @@ def set_rules(world, player): set_rule(world.get_location("Right_Fog_Canyon", player), lambda state: ((((state.has("Left_Fog_Canyon", player) and (state.has("Mothwing_Cloak", player) and state.has("Shade_Cloak", player))) or (state.has("Fungal_Wastes", player) and state.has("Isma's_Tear", player))) or (state.has("Crossroads", player) and (state.has("Isma's_Tear", player) or (((state.has("Mantis_Claw", player) and state.has("Crystal_Heart", player)) or (state.has("Monarch_Wings", player) and (state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)))) and state.world.ACIDSKIPS[player])))) or state.has("Teacher's_Archives", player))) set_rule(world.get_location("Teacher's_Archives", player), lambda state: state.has("Right_Fog_Canyon", player)) set_rule(world.get_location("Queen's_Station", player), lambda state: ((state.has("Left_Fog_Canyon", player) or state.has("Fungal_Wastes", player)) or (state.has("Queen's_Station_Stag", player) and state.has("Can_Stag", player)))) - set_rule(world.get_location("Fungal_Wastes", player), lambda state: (((((((state.has("Queen's_Station", 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))) or state.has("Crystal_Heart", 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)))))) or (state.has("Isma's_Tear", player) and state.has("Right_Fog_Canyon", player))) or (state.has("Crossroads", player) and ((((state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) or state.has("Monarch_Wings", player)) or (((state.has("Lurien", player) or state.has("Monomon", player)) or state.has("Herrah", player)) and state.world.SPICYSKIPS[player])) or (state.has("Mantis_Claw", 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)))))))) or (((state.has("Left_City", player) or state.has("Left_Elevator", player)) and state.has("Mantis_Claw", player)) and (state.has("Desolate_Dive", player) or state.has("Descending_Dark", player)))) or (state.has("Fungal_Core", player) and (state.has("Mantis_Claw", player) or state.has("Monarch_Wings", player)))) or (state.has("Mantis_Village", player) and ((state.has("Mantis_Claw", player) or state.has("Monarch_Wings", player)) or state.world.MILDSKIPS[player]))) or (state.has("Mantis_Outskirts", player) and (((((state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) or state.has("Mantis_Claw", player)) or state.has("Monarch_Wings", player)) or state.has("Isma's_Tear", player)) or state.world.MILDSKIPS[player])))) + set_rule(world.get_location("Fungal_Wastes", player), lambda state: (((((((state.has("Queen's_Station", 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))) or state.has("Crystal_Heart", 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)))))) or (state.has("Isma's_Tear", player) and state.has("Right_Fog_Canyon", player))) or (state.has("Crossroads", player) and ((((state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) or state.has("Monarch_Wings", player)) or ((((state.has("Lurien", player) or state.has("Monomon", player)) or state.has("Herrah", player)) or state.has("Dreamer", player)) and state.world.SPICYSKIPS[player])) or (state.has("Mantis_Claw", 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)))))))) or (((state.has("Left_City", player) or state.has("Left_Elevator", player)) and state.has("Mantis_Claw", player)) and (state.has("Desolate_Dive", player) or state.has("Descending_Dark", player)))) or (state.has("Fungal_Core", player) and (state.has("Mantis_Claw", player) or state.has("Monarch_Wings", player)))) or (state.has("Mantis_Village", player) and ((state.has("Mantis_Claw", player) or state.has("Monarch_Wings", player)) or state.world.MILDSKIPS[player]))) or (state.has("Mantis_Outskirts", player) and (((((state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) or state.has("Mantis_Claw", player)) or state.has("Monarch_Wings", player)) or state.has("Isma's_Tear", player)) or state.world.MILDSKIPS[player])))) set_rule(world.get_location("Bottom_Left_Fungal_Wastes", player), lambda state: (((state.has("Fungal_Wastes", player) and (state.has("Mantis_Claw", player) or (state.has("Monarch_Wings", player) and (state.world.SHADESKIPS[player] or state.world.SPICYSKIPS[player])))) or state.has("Bottom_Right_Queen's_Gardens", player)) or (state.has("Upper_Deepnest", player) and ((state.has("Mantis_Claw", player) and (((((state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) or state.has("Crystal_Heart", player)) or state.has("Monarch_Wings", player)) or state.world.SHADESKIPS[player]) or state.world.SPICYSKIPS[player])) or (state.has("Monarch_Wings", player) and (state.world.SHADESKIPS[player] or state.world.SPICYSKIPS[player])))))) set_rule(world.get_location("Fungal_Core", player), lambda state: ((state.has("Fungal_Wastes", player) and state.has("Mantis_Claw", player)) and state.has("Monarch_Wings", player))) set_rule(world.get_location("Mantis_Outskirts", player), lambda state: (state.has("Fungal_Wastes", player) or (state.has("Mantis_Village", player) and ((((state.has("Mantis_Claw", player) or state.has("Monarch_Wings", player)) or state.has("Isma's_Tear", player)) or state.has("Crystal_Heart", player)) or ((state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) and state.world.MILDSKIPS[player]))))) @@ -351,9 +351,9 @@ def set_rules(world, player): set_rule(world.get_location("Crystallized_Mound", player), lambda state: ((state.has("Crystal_Peak", player) and (state.has("Lumafly_Lantern", player) or state.world.DARKROOMS[player])) and (((state.has("Monarch_Wings", player) and (state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player))) or state.has("Crystal_Heart", 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.has("Monarch_Wings", player) or (state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player))))))) set_rule(world.get_location("Upper_Tram", player), lambda state: (state.has("Tram_Pass", player) and (state.has("Crossroads", player) or state.has("Upper_Resting_Grounds", player)))) set_rule(world.get_location("Upper_Resting_Grounds", player), lambda state: (((((state.has("Upper_Tram", player) or (state.has("Lower_Resting_Grounds", player) and ((((state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) or state.has("Mantis_Claw", player)) or state.has("Monarch_Wings", player)) or state.world.MILDSKIPS[player]))) or (state.has("Crystal_Peak", player) and (state.has("Lumafly_Lantern", player) or state.world.DARKROOMS[player]))) or state.has("Crystallized_Mound", player)) or state.has("Spirits_Glade", player)) or (state.has("Resting_Grounds_Stag", player) and state.has("Can_Stag", player)))) - set_rule(world.get_location("Spirits_Glade", player), lambda state: (state.has_essence(200, player) and state.has("Upper_Resting_Grounds", player))) + set_rule(world.get_location("Spirits_Glade", player), lambda state: (state.has_essence(player, 200) and state.has("Upper_Resting_Grounds", player))) set_rule(world.get_location("Lower_Resting_Grounds", player), lambda state: (((state.has("Upper_Resting_Grounds", player) and (state.has("Desolate_Dive", player) or state.has("Descending_Dark", player))) or state.has("Blue_Lake", player)) or state.has("Right_Elevator", player))) - set_rule(world.get_location("Blue_Lake", player), lambda state: ((state.has("Crossroads", player) and (((state.has("Mantis_Claw", player) and (state.has("Monarch_Wings", player) or state.has("Crystal_Heart", player))) or (((state.has("Lurien", player) or state.has("Monomon", player)) or state.has("Herrah", player)) and state.world.SPICYSKIPS[player])) or (state.world.SHADESKIPS[player] and ((state.has("Mantis_Claw", player) or state.has("Monarch_Wings", player)) or ((state.world.SPICYSKIPS[player] and (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))))))))) or (state.has("Lower_Resting_Grounds", player) and (state.has("Mantis_Claw", player) or state.has("Monarch_Wings", player))))) + set_rule(world.get_location("Blue_Lake", player), lambda state: ((state.has("Crossroads", player) and (((state.has("Mantis_Claw", player) and (state.has("Monarch_Wings", player) or state.has("Crystal_Heart", player))) or ((((state.has("Lurien", player) or state.has("Monomon", player)) or state.has("Herrah", player)) or state.has("Dreamer", player)) and state.world.SPICYSKIPS[player])) or (state.world.SHADESKIPS[player] and ((state.has("Mantis_Claw", player) or state.has("Monarch_Wings", player)) or ((state.world.SPICYSKIPS[player] and (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))))))))) or (state.has("Lower_Resting_Grounds", player) and (state.has("Mantis_Claw", player) or state.has("Monarch_Wings", player))))) set_rule(world.get_location("Top_Right_Queen's_Gardens", player), lambda state: ((state.has("Left_Fog_Canyon", player) and ((state.has("Isma's_Tear", player) or (((state.has("Mantis_Claw", player) and (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("Mothwing_Cloak", player) and state.has("Shade_Cloak", player)))) or (state.has("Top_Left_Queen's_Gardens", player) and ((state.has("Crystal_Heart", player) or (state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player))) or state.has("Monarch_Wings", player))))) set_rule(world.get_location("Bottom_Right_Queen's_Gardens", player), lambda state: ((state.has("Top_Right_Queen's_Gardens", player) and ((state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) or ((state.has("Mantis_Claw", player) or state.has("Monarch_Wings", player)) and state.has("Crystal_Heart", player)))) or (state.has("Bottom_Left_Queen's_Gardens", player) and state.has("Mantis_Claw", player)))) set_rule(world.get_location("Bottom_Left_Queen's_Gardens", player), lambda state: ((state.has("Bottom_Right_Queen's_Gardens", player) or ((state.has("Top_Left_Queen's_Gardens", 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))) or (state.has("Desolate_Dive", player) or state.has("Descending_Dark", player))) or state.world.SPICYSKIPS[player])) and ((state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) or state.has("Monarch_Wings", player)))) or (((state.has("Dark_Deepnest", player) and state.has("Mantis_Claw", player)) and (state.has("Monarch_Wings", player) or ((state.has("Mothwing_Cloak", player) or state.has("Shade_Cloak", player)) and state.world.MILDSKIPS[player]))) and (state.has("Lumafly_Lantern", player) or (state.world.DARKROOMS[player] and state.world.SPICYSKIPS[player]))))) diff --git a/worlds/hk/__init__.py b/worlds/hk/__init__.py index a38fc552..183f224e 100644 --- a/worlds/hk/__init__.py +++ b/worlds/hk/__init__.py @@ -62,7 +62,8 @@ def gen_items(world: MultiWorld, player: int): event_location.locked = True if item.name == "King's_Pass": world.push_precollected(item) - + elif item_data.type == "Fake": + pass else: pool.append(item)