From 06dc1b897cc6e58fc8b5d438dee51a67aedc59fe Mon Sep 17 00:00:00 2001 From: Bryce Wilson Date: Sat, 9 May 2026 07:58:01 -0700 Subject: [PATCH] Pokemon Emerald: Switch to rule builder (#5923) --- worlds/pokemon_emerald/locations.py | 2 +- worlds/pokemon_emerald/options.py | 2 +- worlds/pokemon_emerald/pokemon.py | 4 +- worlds/pokemon_emerald/rules.py | 1925 +++++++-------------------- worlds/pokemon_emerald/util.py | 2 +- 5 files changed, 469 insertions(+), 1466 deletions(-) diff --git a/worlds/pokemon_emerald/locations.py b/worlds/pokemon_emerald/locations.py index fd8d0ebc7d..8150d2b244 100644 --- a/worlds/pokemon_emerald/locations.py +++ b/worlds/pokemon_emerald/locations.py @@ -177,7 +177,7 @@ def set_legendary_cave_entrances(world: "PokemonEmeraldWorld") -> None: terra_cave_location_location = world.multiworld.get_location("TERRA_CAVE_LOCATION", world.player) terra_cave_location_location.item = None terra_cave_location_location.place_locked_item(world.create_event(terra_cave_location_name)) - + marine_cave_location_name = world.random.choice([ "MARINE_CAVE_ROUTE_105_1", "MARINE_CAVE_ROUTE_105_2", diff --git a/worlds/pokemon_emerald/options.py b/worlds/pokemon_emerald/options.py index 9529be877e..ebd36898ab 100644 --- a/worlds/pokemon_emerald/options.py +++ b/worlds/pokemon_emerald/options.py @@ -594,7 +594,7 @@ class NormalizeEncounterRates(Toggle): Make every slot on an encounter table approximately equally likely. This does NOT mean each species is equally likely. In the vanilla game, each species may occupy more than one slot, and slots vary in probability. - + Species will still occupy the same slots as vanilla, but the slots will be equally weighted. The minimum encounter rate will be 8% (higher in water). """ display_name = "Normalize Encounter Rates" diff --git a/worlds/pokemon_emerald/pokemon.py b/worlds/pokemon_emerald/pokemon.py index 76285d11da..d51b80f353 100644 --- a/worlds/pokemon_emerald/pokemon.py +++ b/worlds/pokemon_emerald/pokemon.py @@ -502,7 +502,7 @@ def randomize_learnsets(world: "PokemonEmeraldWorld") -> None: species.learnset = new_learnset - + def randomize_starters(world: "PokemonEmeraldWorld") -> None: if world.options.starters == RandomizeStarters.option_vanilla: return @@ -682,7 +682,7 @@ def randomize_misc_pokemon(world: "PokemonEmeraldWorld") -> None: ] if should_match_bst: candidates = filter_species_by_nearby_bst(candidates, sum(original_species.base_stats)) - + player_filtered_candidates = [ species for species in candidates diff --git a/worlds/pokemon_emerald/rules.py b/worlds/pokemon_emerald/rules.py index 30ebf72e4d..ce3d48ca15 100644 --- a/worlds/pokemon_emerald/rules.py +++ b/worlds/pokemon_emerald/rules.py @@ -1,14 +1,16 @@ """ Logic rule definitions for Pokemon Emerald """ -from typing import TYPE_CHECKING, Callable, Dict +from collections import defaultdict +from typing import TYPE_CHECKING, Literal -from BaseClasses import CollectionState -from worlds.generic.Rules import add_rule, set_rule +from rule_builder.rules import (Rule, CanReachEntrance, Has, HasAll, HasAny, HasFromListUnique, HasGroupUnique, + OptionFilter, True_) from .data import LocationCategory, NATIONAL_ID_TO_SPECIES_ID, NUM_REAL_SPECIES, data from .locations import PokemonEmeraldLocation -from .options import DarkCavesRequireFlash, EliteFourRequirement, NormanRequirement, Goal +from .options import (DarkCavesRequireFlash, EliteFourRequirement, NormanRequirement, Goal, ModifyRoute118, + ExtraBoulders, ExtraBumpySlope, RemoveRoadblocks) if TYPE_CHECKING: from . import PokemonEmeraldWorld @@ -17,23 +19,18 @@ if TYPE_CHECKING: # Rules are organized by town/route/dungeon and ordered approximately # by when you would first reach that place in a vanilla playthrough. def set_rules(world: "PokemonEmeraldWorld") -> None: - hm_rules: Dict[str, Callable[[CollectionState], bool]] = {} + entrance_rules: defaultdict[str, Rule] = defaultdict(True_) + location_rules: defaultdict[str, Rule] = defaultdict(True_) + + hm_rules: dict[str, Rule] = {} for hm, badges in world.hm_requirements.items(): if isinstance(badges, list): - hm_rules[hm] = lambda state, hm=hm, badges=badges: \ - state.has(hm, world.player) and state.has_all(badges, world.player) + hm_rules[hm] = Has(hm) & HasAll(*badges) else: - hm_rules[hm] = lambda state, hm=hm, badges=badges: \ - state.has(hm, world.player) and state.has_group_unique("Badge", world.player, badges) + hm_rules[hm] = Has(hm) & HasGroupUnique("Badge", badges) - def has_acro_bike(state: CollectionState): - return state.has("Acro Bike", world.player) - - def has_mach_bike(state: CollectionState): - return state.has("Mach Bike", world.player) - - def defeated_n_gym_leaders(state: CollectionState, n: int) -> bool: - return state.has_from_list_unique([ + def create_defeated_n_gym_leaders_rule(n: int) -> Rule: + return HasFromListUnique( "EVENT_DEFEAT_ROXANNE", "EVENT_DEFEAT_BRAWLY", "EVENT_DEFEAT_WATTSON", @@ -42,7 +39,8 @@ def set_rules(world: "PokemonEmeraldWorld") -> None: "EVENT_DEFEAT_WINONA", "EVENT_DEFEAT_TATE_AND_LIZA", "EVENT_DEFEAT_JUAN", - ], world.player, n) + count=n + ) huntable_legendary_events = [ f"EVENT_ENCOUNTER_{key}" @@ -63,1485 +61,573 @@ def set_rules(world: "PokemonEmeraldWorld") -> None: if name in world.options.allowed_legendary_hunt_encounters.value ] - def encountered_n_legendaries(state: CollectionState, n: int) -> bool: - return state.has_from_list_unique(huntable_legendary_events, world.player, n) - - def get_entrance(entrance: str): - return world.multiworld.get_entrance(entrance, world.player) - - def get_location(location: str): - if location in data.locations: - location = data.locations[location].label - - return world.multiworld.get_location(location, world.player) - - if world.options.goal == Goal.option_champion: - completion_condition = lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player) - elif world.options.goal == Goal.option_steven: - completion_condition = lambda state: state.has("EVENT_DEFEAT_STEVEN", world.player) - elif world.options.goal == Goal.option_norman: - completion_condition = lambda state: state.has("EVENT_DEFEAT_NORMAN", world.player) - elif world.options.goal == Goal.option_legendary_hunt: - completion_condition = lambda state: encountered_n_legendaries(state, world.options.legendary_hunt_count.value) - - world.multiworld.completion_condition[world.player] = completion_condition + world.set_completion_rule( + (OptionFilter(Goal, Goal.option_champion) & Has("EVENT_DEFEAT_CHAMPION")) | + (OptionFilter(Goal, Goal.option_steven) & Has("EVENT_DEFEAT_STEVEN")) | + (OptionFilter(Goal, Goal.option_norman) & Has("EVENT_DEFEAT_NORMAN")) | + (OptionFilter(Goal, Goal.option_legendary_hunt) & HasFromListUnique( + *huntable_legendary_events, + count=world.options.legendary_hunt_count.value, + )) + ) if world.options.legendary_hunt_catch: - set_rule(get_location("EVENT_ENCOUNTER_GROUDON"), - lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player)) - set_rule(get_location("EVENT_ENCOUNTER_KYOGRE"), - lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player)) - set_rule(get_location("EVENT_ENCOUNTER_RAYQUAZA"), - lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player)) - set_rule(get_location("EVENT_ENCOUNTER_LATIAS"), - lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player)) + location_rules["EVENT_ENCOUNTER_GROUDON"] = Has("EVENT_DEFEAT_CHAMPION") + location_rules["EVENT_ENCOUNTER_KYOGRE"] = Has("EVENT_DEFEAT_CHAMPION") + location_rules["EVENT_ENCOUNTER_RAYQUAZA"] = Has("EVENT_DEFEAT_CHAMPION") + location_rules["EVENT_ENCOUNTER_LATIAS"] = Has("EVENT_DEFEAT_CHAMPION") # Latios already only requires defeating the champion and access to Route 117 - # set_rule(get_location("EVENT_ENCOUNTER_LATIOS"), - # lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player)) - set_rule(get_location("EVENT_ENCOUNTER_REGIROCK"), - lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player)) - set_rule(get_location("EVENT_ENCOUNTER_REGICE"), - lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player)) - set_rule(get_location("EVENT_ENCOUNTER_REGISTEEL"), - lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player)) - set_rule(get_location("EVENT_ENCOUNTER_MEW"), - lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player)) - set_rule(get_location("EVENT_ENCOUNTER_DEOXYS"), - lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player)) - set_rule(get_location("EVENT_ENCOUNTER_HO_OH"), - lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player)) - set_rule(get_location("EVENT_ENCOUNTER_LUGIA"), - lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player)) + # location_rules["EVENT_ENCOUNTER_LATIOS"] = Has("EVENT_DEFEAT_CHAMPION") + location_rules["EVENT_ENCOUNTER_REGIROCK"] = Has("EVENT_DEFEAT_CHAMPION") + location_rules["EVENT_ENCOUNTER_REGICE"] = Has("EVENT_DEFEAT_CHAMPION") + location_rules["EVENT_ENCOUNTER_REGISTEEL"] = Has("EVENT_DEFEAT_CHAMPION") + location_rules["EVENT_ENCOUNTER_MEW"] = Has("EVENT_DEFEAT_CHAMPION") + location_rules["EVENT_ENCOUNTER_DEOXYS"] = Has("EVENT_DEFEAT_CHAMPION") + location_rules["EVENT_ENCOUNTER_HO_OH"] = Has("EVENT_DEFEAT_CHAMPION") + location_rules["EVENT_ENCOUNTER_LUGIA"] = Has("EVENT_DEFEAT_CHAMPION") # Sky - set_rule( - get_entrance("REGION_LITTLEROOT_TOWN/MAIN -> REGION_SKY"), - hm_rules["HM02 Fly"] - ) - set_rule( - get_entrance("REGION_SKY -> REGION_LITTLEROOT_TOWN/MAIN"), - lambda state: state.has("EVENT_VISITED_LITTLEROOT_TOWN", world.player) - ) - set_rule( - get_entrance("REGION_SKY -> REGION_OLDALE_TOWN/MAIN"), - lambda state: state.has("EVENT_VISITED_OLDALE_TOWN", world.player) - ) - set_rule( - get_entrance("REGION_SKY -> REGION_PETALBURG_CITY/MAIN"), - lambda state: state.has("EVENT_VISITED_PETALBURG_CITY", world.player) - ) - set_rule( - get_entrance("REGION_SKY -> REGION_RUSTBORO_CITY/MAIN"), - lambda state: state.has("EVENT_VISITED_RUSTBORO_CITY", world.player) - ) - set_rule( - get_entrance("REGION_SKY -> REGION_DEWFORD_TOWN/MAIN"), - lambda state: state.has("EVENT_VISITED_DEWFORD_TOWN", world.player) - ) - set_rule( - get_entrance("REGION_SKY -> REGION_SLATEPORT_CITY/MAIN"), - lambda state: state.has("EVENT_VISITED_SLATEPORT_CITY", world.player) - ) - set_rule( - get_entrance("REGION_SKY -> REGION_MAUVILLE_CITY/MAIN"), - lambda state: state.has("EVENT_VISITED_MAUVILLE_CITY", world.player) - ) - set_rule( - get_entrance("REGION_SKY -> REGION_VERDANTURF_TOWN/MAIN"), - lambda state: state.has("EVENT_VISITED_VERDANTURF_TOWN", world.player) - ) - set_rule( - get_entrance("REGION_SKY -> REGION_FALLARBOR_TOWN/MAIN"), - lambda state: state.has("EVENT_VISITED_FALLARBOR_TOWN", world.player) - ) - set_rule( - get_entrance("REGION_SKY -> REGION_LAVARIDGE_TOWN/MAIN"), - lambda state: state.has("EVENT_VISITED_LAVARIDGE_TOWN", world.player) - ) - set_rule( - get_entrance("REGION_SKY -> REGION_FORTREE_CITY/MAIN"), - lambda state: state.has("EVENT_VISITED_FORTREE_CITY", world.player) - ) - set_rule( - get_entrance("REGION_SKY -> REGION_LILYCOVE_CITY/MAIN"), - lambda state: state.has("EVENT_VISITED_LILYCOVE_CITY", world.player) - ) - set_rule( - get_entrance("REGION_SKY -> REGION_MOSSDEEP_CITY/MAIN"), - lambda state: state.has("EVENT_VISITED_MOSSDEEP_CITY", world.player) - ) - set_rule( - get_entrance("REGION_SKY -> REGION_SOOTOPOLIS_CITY/EAST"), - lambda state: state.has("EVENT_VISITED_SOOTOPOLIS_CITY", world.player) - ) - set_rule( - get_entrance("REGION_SKY -> REGION_EVER_GRANDE_CITY/SOUTH"), - lambda state: state.has("EVENT_VISITED_EVER_GRANDE_CITY", world.player) - ) + entrance_rules["REGION_LITTLEROOT_TOWN/MAIN -> REGION_SKY"] = hm_rules["HM02 Fly"] + entrance_rules["REGION_SKY -> REGION_LITTLEROOT_TOWN/MAIN"] = Has("EVENT_VISITED_LITTLEROOT_TOWN") + entrance_rules["REGION_SKY -> REGION_OLDALE_TOWN/MAIN"] = Has("EVENT_VISITED_OLDALE_TOWN") + entrance_rules["REGION_SKY -> REGION_PETALBURG_CITY/MAIN"] = Has("EVENT_VISITED_PETALBURG_CITY") + entrance_rules["REGION_SKY -> REGION_RUSTBORO_CITY/MAIN"] = Has("EVENT_VISITED_RUSTBORO_CITY") + entrance_rules["REGION_SKY -> REGION_DEWFORD_TOWN/MAIN"] = Has("EVENT_VISITED_DEWFORD_TOWN") + entrance_rules["REGION_SKY -> REGION_SLATEPORT_CITY/MAIN"] = Has("EVENT_VISITED_SLATEPORT_CITY") + entrance_rules["REGION_SKY -> REGION_MAUVILLE_CITY/MAIN"] = Has("EVENT_VISITED_MAUVILLE_CITY") + entrance_rules["REGION_SKY -> REGION_VERDANTURF_TOWN/MAIN"] = Has("EVENT_VISITED_VERDANTURF_TOWN") + entrance_rules["REGION_SKY -> REGION_FALLARBOR_TOWN/MAIN"] = Has("EVENT_VISITED_FALLARBOR_TOWN") + entrance_rules["REGION_SKY -> REGION_LAVARIDGE_TOWN/MAIN"] = Has("EVENT_VISITED_LAVARIDGE_TOWN") + entrance_rules["REGION_SKY -> REGION_FORTREE_CITY/MAIN"] = Has("EVENT_VISITED_FORTREE_CITY") + entrance_rules["REGION_SKY -> REGION_LILYCOVE_CITY/MAIN"] = Has("EVENT_VISITED_LILYCOVE_CITY") + entrance_rules["REGION_SKY -> REGION_MOSSDEEP_CITY/MAIN"] = Has("EVENT_VISITED_MOSSDEEP_CITY") + entrance_rules["REGION_SKY -> REGION_SOOTOPOLIS_CITY/EAST"] = Has("EVENT_VISITED_SOOTOPOLIS_CITY") + entrance_rules["REGION_SKY -> REGION_EVER_GRANDE_CITY/SOUTH"] = Has("EVENT_VISITED_EVER_GRANDE_CITY") # Littleroot Town - set_rule( - get_location("NPC_GIFT_RECEIVED_SS_TICKET"), - lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player) - ) - set_rule( - get_location("NPC_GIFT_RECEIVED_AURORA_TICKET"), - lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player) - ) - set_rule( - get_location("NPC_GIFT_RECEIVED_EON_TICKET"), - lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player) - ) - set_rule( - get_location("NPC_GIFT_RECEIVED_MYSTIC_TICKET"), - lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player) - ) - set_rule( - get_location("NPC_GIFT_RECEIVED_OLD_SEA_MAP"), - lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player) - ) + location_rules["NPC_GIFT_RECEIVED_SS_TICKET"] = Has("EVENT_DEFEAT_CHAMPION") + location_rules["NPC_GIFT_RECEIVED_AURORA_TICKET"] = Has("EVENT_DEFEAT_CHAMPION") + location_rules["NPC_GIFT_RECEIVED_EON_TICKET"] = Has("EVENT_DEFEAT_CHAMPION") + location_rules["NPC_GIFT_RECEIVED_MYSTIC_TICKET"] = Has("EVENT_DEFEAT_CHAMPION") + location_rules["NPC_GIFT_RECEIVED_OLD_SEA_MAP"] = Has("EVENT_DEFEAT_CHAMPION") # Route 102 - set_rule( - get_entrance("REGION_ROUTE102/MAIN -> REGION_ROUTE102/POND"), - hm_rules["HM03 Surf"] - ) + entrance_rules["REGION_ROUTE102/MAIN -> REGION_ROUTE102/POND"] = hm_rules["HM03 Surf"] # Route 103 - set_rule( - get_entrance("REGION_ROUTE103/EAST -> REGION_ROUTE103/WATER"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_ROUTE103/WEST -> REGION_ROUTE103/WATER"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_ROUTE103/EAST -> REGION_ROUTE103/EAST_TREE_MAZE"), - hm_rules["HM01 Cut"] - ) + entrance_rules["REGION_ROUTE103/EAST -> REGION_ROUTE103/WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_ROUTE103/WEST -> REGION_ROUTE103/WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_ROUTE103/EAST -> REGION_ROUTE103/EAST_TREE_MAZE"] = hm_rules["HM01 Cut"] # Petalburg City - set_rule( - get_entrance("REGION_PETALBURG_CITY/MAIN -> REGION_PETALBURG_CITY/SOUTH_POND"), - hm_rules["HM03 Surf"] + location_rules["NPC_GIFT_RECEIVED_HM_SURF"] = Has("EVENT_DEFEAT_NORMAN") + + entrance_rules["REGION_PETALBURG_CITY/MAIN -> REGION_PETALBURG_CITY/SOUTH_POND"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_PETALBURG_CITY/MAIN -> REGION_PETALBURG_CITY/NORTH_POND"] = hm_rules["HM03 Surf"] + entrance_rules["MAP_PETALBURG_CITY_GYM:2/MAP_PETALBURG_CITY_GYM:3"] = ( + ( + OptionFilter(NormanRequirement, NormanRequirement.option_badges) & + HasGroupUnique("Badge", world.options.norman_count.value) + ) | + ( + OptionFilter(NormanRequirement, NormanRequirement.option_gyms) & + create_defeated_n_gym_leaders_rule(world.options.norman_count.value) + ) ) - set_rule( - get_entrance("REGION_PETALBURG_CITY/MAIN -> REGION_PETALBURG_CITY/NORTH_POND"), - hm_rules["HM03 Surf"] + entrance_rules["MAP_PETALBURG_CITY_GYM:5/MAP_PETALBURG_CITY_GYM:6"] = ( + ( + OptionFilter(NormanRequirement, NormanRequirement.option_badges) & + HasGroupUnique("Badge", world.options.norman_count.value) + ) | + ( + OptionFilter(NormanRequirement, NormanRequirement.option_gyms) & + create_defeated_n_gym_leaders_rule(world.options.norman_count.value) + ) ) - set_rule( - get_location("NPC_GIFT_RECEIVED_HM_SURF"), - lambda state: state.has("EVENT_DEFEAT_NORMAN", world.player) - ) - if world.options.norman_requirement == NormanRequirement.option_badges: - set_rule( - get_entrance("MAP_PETALBURG_CITY_GYM:2/MAP_PETALBURG_CITY_GYM:3"), - lambda state: state.has_group_unique("Badge", world.player, world.options.norman_count.value) - ) - set_rule( - get_entrance("MAP_PETALBURG_CITY_GYM:5/MAP_PETALBURG_CITY_GYM:6"), - lambda state: state.has_group_unique("Badge", world.player, world.options.norman_count.value) - ) - else: - set_rule( - get_entrance("MAP_PETALBURG_CITY_GYM:2/MAP_PETALBURG_CITY_GYM:3"), - lambda state: defeated_n_gym_leaders(state, world.options.norman_count.value) - ) - set_rule( - get_entrance("MAP_PETALBURG_CITY_GYM:5/MAP_PETALBURG_CITY_GYM:6"), - lambda state: defeated_n_gym_leaders(state, world.options.norman_count.value) - ) # Route 104 - set_rule( - get_entrance("REGION_ROUTE104/SOUTH -> REGION_ROUTE104/SOUTH_WATER"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_ROUTE104/NORTH -> REGION_ROUTE104/NORTH_POND"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_ROUTE104/NORTH -> REGION_ROUTE104/TREE_ALCOVE_2"), - hm_rules["HM01 Cut"] - ) - set_rule( - get_entrance("REGION_ROUTE104_MR_BRINEYS_HOUSE/MAIN -> REGION_DEWFORD_TOWN/MAIN"), - lambda state: state.has("EVENT_TALK_TO_MR_STONE", world.player) - ) + entrance_rules["REGION_ROUTE104/SOUTH -> REGION_ROUTE104/SOUTH_WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_ROUTE104/NORTH -> REGION_ROUTE104/NORTH_POND"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_ROUTE104/NORTH -> REGION_ROUTE104/TREE_ALCOVE_2"] = hm_rules["HM01 Cut"] + entrance_rules["REGION_ROUTE104_MR_BRINEYS_HOUSE/MAIN -> REGION_DEWFORD_TOWN/MAIN"] = Has("EVENT_TALK_TO_MR_STONE") # Petalburg Woods - set_rule( - get_entrance("REGION_PETALBURG_WOODS/WEST_PATH -> REGION_PETALBURG_WOODS/EAST_PATH"), - hm_rules["HM01 Cut"] - ) + entrance_rules["REGION_PETALBURG_WOODS/WEST_PATH -> REGION_PETALBURG_WOODS/EAST_PATH"] = hm_rules["HM01 Cut"] # Rustboro City - set_rule( - get_location("EVENT_RETURN_DEVON_GOODS"), - lambda state: state.has("EVENT_RECOVER_DEVON_GOODS", world.player) - ) + location_rules["EVENT_RETURN_DEVON_GOODS"] = Has("EVENT_RECOVER_DEVON_GOODS") if world.options.trainersanity: - set_rule( - get_location("TRAINER_BRENDAN_RUSTBORO_MUDKIP_REWARD"), - lambda state: state.has("EVENT_RETURN_DEVON_GOODS", world.player) - ) + location_rules["TRAINER_BRENDAN_RUSTBORO_MUDKIP_REWARD"] = Has("EVENT_RETURN_DEVON_GOODS") # Devon Corp - set_rule( - get_entrance("MAP_RUSTBORO_CITY_DEVON_CORP_1F:2/MAP_RUSTBORO_CITY_DEVON_CORP_2F:0"), - lambda state: state.has("EVENT_RETURN_DEVON_GOODS", world.player) - ) + entrance_rules["MAP_RUSTBORO_CITY_DEVON_CORP_1F:2/MAP_RUSTBORO_CITY_DEVON_CORP_2F:0"] = Has("EVENT_RETURN_DEVON_GOODS") # Route 116 - set_rule( - get_entrance("REGION_ROUTE116/WEST -> REGION_ROUTE116/WEST_ABOVE_LEDGE"), - hm_rules["HM01 Cut"] + entrance_rules["REGION_ROUTE116/WEST -> REGION_ROUTE116/WEST_ABOVE_LEDGE"] = hm_rules["HM01 Cut"] + entrance_rules["REGION_ROUTE116/EAST -> REGION_TERRA_CAVE_ENTRANCE/MAIN"] = ( + HasAll("EVENT_DEFEAT_CHAMPION", "TERRA_CAVE_ROUTE_116_1", "EVENT_DEFEAT_SHELLY") ) - set_rule( - get_entrance("REGION_ROUTE116/EAST -> REGION_TERRA_CAVE_ENTRANCE/MAIN"), - lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player) - and state.has("TERRA_CAVE_ROUTE_116_1", world.player) - and state.has("EVENT_DEFEAT_SHELLY", world.player) - ) - set_rule( - get_entrance("REGION_ROUTE116/WEST -> REGION_TERRA_CAVE_ENTRANCE/MAIN"), - lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player) - and state.has("TERRA_CAVE_ROUTE_116_2", world.player) - and state.has("EVENT_DEFEAT_SHELLY", world.player) + entrance_rules["REGION_ROUTE116/WEST -> REGION_TERRA_CAVE_ENTRANCE/MAIN"] = ( + HasAll("EVENT_DEFEAT_CHAMPION", "TERRA_CAVE_ROUTE_116_2", "EVENT_DEFEAT_SHELLY") ) # Rusturf Tunnel - set_rule( - get_entrance("REGION_RUSTURF_TUNNEL/WEST -> REGION_RUSTURF_TUNNEL/EAST"), - hm_rules["HM06 Rock Smash"] - ) - set_rule( - get_entrance("REGION_RUSTURF_TUNNEL/EAST -> REGION_RUSTURF_TUNNEL/WEST"), - hm_rules["HM06 Rock Smash"] - ) - set_rule( - get_location("NPC_GIFT_RECEIVED_HM_STRENGTH"), - hm_rules["HM06 Rock Smash"] - ) - set_rule( - get_location("EVENT_RECOVER_DEVON_GOODS"), - lambda state: state.has("EVENT_DEFEAT_ROXANNE", world.player) - ) + location_rules["NPC_GIFT_RECEIVED_HM_STRENGTH"] = hm_rules["HM06 Rock Smash"] + location_rules["EVENT_RECOVER_DEVON_GOODS"] = Has("EVENT_DEFEAT_ROXANNE") + + entrance_rules["REGION_RUSTURF_TUNNEL/WEST -> REGION_RUSTURF_TUNNEL/EAST"] = hm_rules["HM06 Rock Smash"] + entrance_rules["REGION_RUSTURF_TUNNEL/EAST -> REGION_RUSTURF_TUNNEL/WEST"] = hm_rules["HM06 Rock Smash"] # Route 115 - set_rule( - get_entrance("REGION_ROUTE115/SOUTH_BELOW_LEDGE -> REGION_ROUTE115/SEA"), - hm_rules["HM03 Surf"] + entrance_rules["REGION_ROUTE115/SOUTH_BELOW_LEDGE -> REGION_ROUTE115/SEA"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_ROUTE115/SOUTH_BEACH_NEAR_CAVE -> REGION_ROUTE115/SEA"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_ROUTE115/SOUTH_ABOVE_LEDGE -> REGION_ROUTE115/SOUTH_BEHIND_ROCK"] = hm_rules["HM06 Rock Smash"] + entrance_rules["REGION_ROUTE115/NORTH_BELOW_SLOPE -> REGION_ROUTE115/SEA"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_ROUTE115/NORTH_BELOW_SLOPE -> REGION_ROUTE115/NORTH_ABOVE_SLOPE"] = Has("Mach Bike") + entrance_rules["REGION_ROUTE115/NORTH_BELOW_SLOPE -> REGION_TERRA_CAVE_ENTRANCE/MAIN"] = ( + HasAll("EVENT_DEFEAT_CHAMPION", "TERRA_CAVE_ROUTE_115_1", "EVENT_DEFEAT_SHELLY") ) - set_rule( - get_entrance("REGION_ROUTE115/SOUTH_BEACH_NEAR_CAVE -> REGION_ROUTE115/SEA"), - hm_rules["HM03 Surf"] + entrance_rules["REGION_ROUTE115/NORTH_ABOVE_SLOPE -> REGION_TERRA_CAVE_ENTRANCE/MAIN"] = ( + HasAll("EVENT_DEFEAT_CHAMPION", "TERRA_CAVE_ROUTE_115_2", "EVENT_DEFEAT_SHELLY") ) - set_rule( - get_entrance("REGION_ROUTE115/SOUTH_ABOVE_LEDGE -> REGION_ROUTE115/SOUTH_BEHIND_ROCK"), - hm_rules["HM06 Rock Smash"] + entrance_rules["REGION_ROUTE115/SOUTH_BEACH_NEAR_CAVE -> REGION_ROUTE115/SOUTH_ABOVE_LEDGE"] = ( + (OptionFilter(ExtraBoulders, ExtraBoulders.option_true) & hm_rules["HM04 Strength"]) | + (OptionFilter(ExtraBoulders, ExtraBoulders.option_false)) ) - set_rule( - get_entrance("REGION_ROUTE115/NORTH_BELOW_SLOPE -> REGION_ROUTE115/SEA"), - hm_rules["HM03 Surf"] + entrance_rules["REGION_ROUTE115/SOUTH_ABOVE_LEDGE -> REGION_ROUTE115/SOUTH_BEACH_NEAR_CAVE"] = ( + (OptionFilter(ExtraBoulders, ExtraBoulders.option_true) & hm_rules["HM04 Strength"]) | + (OptionFilter(ExtraBoulders, ExtraBoulders.option_false)) ) - set_rule( - get_entrance("REGION_ROUTE115/NORTH_BELOW_SLOPE -> REGION_ROUTE115/NORTH_ABOVE_SLOPE"), - has_mach_bike + entrance_rules["REGION_ROUTE115/SOUTH_BELOW_LEDGE -> REGION_ROUTE115/SOUTH_ABOVE_LEDGE"] = ( + OptionFilter(ExtraBumpySlope, ExtraBumpySlope.option_true) & Has("Acro Bike") ) - set_rule( - get_entrance("REGION_ROUTE115/NORTH_BELOW_SLOPE -> REGION_TERRA_CAVE_ENTRANCE/MAIN"), - lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player) - and state.has("TERRA_CAVE_ROUTE_115_1", world.player) - and state.has("EVENT_DEFEAT_SHELLY", world.player) - ) - set_rule( - get_entrance("REGION_ROUTE115/NORTH_ABOVE_SLOPE -> REGION_TERRA_CAVE_ENTRANCE/MAIN"), - lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player) - and state.has("TERRA_CAVE_ROUTE_115_2", world.player) - and state.has("EVENT_DEFEAT_SHELLY", world.player) - ) - - if world.options.extra_boulders: - set_rule( - get_entrance("REGION_ROUTE115/SOUTH_BEACH_NEAR_CAVE -> REGION_ROUTE115/SOUTH_ABOVE_LEDGE"), - hm_rules["HM04 Strength"] - ) - set_rule( - get_entrance("REGION_ROUTE115/SOUTH_ABOVE_LEDGE -> REGION_ROUTE115/SOUTH_BEACH_NEAR_CAVE"), - hm_rules["HM04 Strength"] - ) - - if world.options.extra_bumpy_slope: - set_rule( - get_entrance("REGION_ROUTE115/SOUTH_BELOW_LEDGE -> REGION_ROUTE115/SOUTH_ABOVE_LEDGE"), - has_acro_bike - ) - else: - set_rule( - get_entrance("REGION_ROUTE115/SOUTH_BELOW_LEDGE -> REGION_ROUTE115/SOUTH_ABOVE_LEDGE"), - lambda state: False - ) # Route 105 - set_rule( - get_entrance("REGION_UNDERWATER_ROUTE105/MARINE_CAVE_ENTRANCE_1 -> REGION_UNDERWATER_MARINE_CAVE/MAIN"), - lambda state: hm_rules["HM08 Dive"](state) - and state.has("EVENT_DEFEAT_CHAMPION", world.player) - and state.has("MARINE_CAVE_ROUTE_105_1", world.player) - and state.has("EVENT_DEFEAT_SHELLY", world.player) + entrance_rules["REGION_UNDERWATER_ROUTE105/MARINE_CAVE_ENTRANCE_1 -> REGION_UNDERWATER_MARINE_CAVE/MAIN"] = ( + hm_rules["HM08 Dive"] & HasAll("EVENT_DEFEAT_CHAMPION", "MARINE_CAVE_ROUTE_105_1", "EVENT_DEFEAT_SHELLY") ) - set_rule( - get_entrance("REGION_UNDERWATER_ROUTE105/MARINE_CAVE_ENTRANCE_2 -> REGION_UNDERWATER_MARINE_CAVE/MAIN"), - lambda state: hm_rules["HM08 Dive"](state) - and state.has("EVENT_DEFEAT_CHAMPION", world.player) - and state.has("MARINE_CAVE_ROUTE_105_2", world.player) - and state.has("EVENT_DEFEAT_SHELLY", world.player) - ) - set_rule( - get_entrance("MAP_ROUTE105:0/MAP_ISLAND_CAVE:0"), - lambda state: state.has("EVENT_UNDO_REGI_SEAL", world.player) + entrance_rules["REGION_UNDERWATER_ROUTE105/MARINE_CAVE_ENTRANCE_2 -> REGION_UNDERWATER_MARINE_CAVE/MAIN"] = ( + hm_rules["HM08 Dive"] & HasAll("EVENT_DEFEAT_CHAMPION", "MARINE_CAVE_ROUTE_105_2", "EVENT_DEFEAT_SHELLY") ) + entrance_rules["MAP_ROUTE105:0/MAP_ISLAND_CAVE:0"] = Has("EVENT_UNDO_REGI_SEAL") # Route 106 - set_rule( - get_entrance("REGION_ROUTE106/EAST -> REGION_ROUTE106/SEA"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_ROUTE106/WEST -> REGION_ROUTE106/SEA"), - hm_rules["HM03 Surf"] - ) + entrance_rules["REGION_ROUTE106/EAST -> REGION_ROUTE106/SEA"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_ROUTE106/WEST -> REGION_ROUTE106/SEA"] = hm_rules["HM03 Surf"] # Dewford Town - entrance = get_entrance("REGION_DEWFORD_TOWN/MAIN -> REGION_ROUTE109/BEACH") - set_rule( - entrance, - lambda state: - state.can_reach("REGION_ROUTE104_MR_BRINEYS_HOUSE/MAIN -> REGION_DEWFORD_TOWN/MAIN", "Entrance", world.player) - and state.has("EVENT_TALK_TO_MR_STONE", world.player) - and state.has("EVENT_DELIVER_LETTER", world.player) + entrance_rules["REGION_DEWFORD_TOWN/MAIN -> REGION_ROUTE109/BEACH"] = ( + CanReachEntrance("REGION_ROUTE104_MR_BRINEYS_HOUSE/MAIN -> REGION_DEWFORD_TOWN/MAIN") & + HasAll("EVENT_TALK_TO_MR_STONE", "EVENT_DELIVER_LETTER") ) - world.multiworld.register_indirect_condition( - get_entrance("REGION_ROUTE104_MR_BRINEYS_HOUSE/MAIN -> REGION_DEWFORD_TOWN/MAIN").parent_region, entrance) - set_rule( - get_entrance("REGION_DEWFORD_TOWN/MAIN -> REGION_ROUTE104_MR_BRINEYS_HOUSE/MAIN"), - lambda state: - state.can_reach("REGION_ROUTE104_MR_BRINEYS_HOUSE/MAIN -> REGION_DEWFORD_TOWN/MAIN", "Entrance", world.player) - and state.has("EVENT_TALK_TO_MR_STONE", world.player) - ) - set_rule( - get_entrance("REGION_DEWFORD_TOWN/MAIN -> REGION_DEWFORD_TOWN/WATER"), - hm_rules["HM03 Surf"] + entrance_rules["REGION_DEWFORD_TOWN/MAIN -> REGION_ROUTE104_MR_BRINEYS_HOUSE/MAIN"] = ( + CanReachEntrance("REGION_ROUTE104_MR_BRINEYS_HOUSE/MAIN -> REGION_DEWFORD_TOWN/MAIN") & + Has("EVENT_TALK_TO_MR_STONE") ) + entrance_rules["REGION_DEWFORD_TOWN/MAIN -> REGION_DEWFORD_TOWN/WATER"] = hm_rules["HM03 Surf"] # Granite Cave - set_rule( - get_entrance("REGION_GRANITE_CAVE_STEVENS_ROOM/MAIN -> REGION_GRANITE_CAVE_STEVENS_ROOM/LETTER_DELIVERED"), - lambda state: state.has("Letter", world.player) - ) - set_rule( - get_entrance("REGION_GRANITE_CAVE_B1F/LOWER -> REGION_GRANITE_CAVE_B1F/UPPER"), - has_mach_bike - ) + entrance_rules["REGION_GRANITE_CAVE_STEVENS_ROOM/MAIN -> REGION_GRANITE_CAVE_STEVENS_ROOM/LETTER_DELIVERED"] = Has("Letter") + entrance_rules["REGION_GRANITE_CAVE_B1F/LOWER -> REGION_GRANITE_CAVE_B1F/UPPER"] = Has("Mach Bike") # Route 107 - set_rule( - get_entrance("REGION_DEWFORD_TOWN/MAIN -> REGION_ROUTE107/MAIN"), - hm_rules["HM03 Surf"] - ) + entrance_rules["REGION_DEWFORD_TOWN/MAIN -> REGION_ROUTE107/MAIN"] = hm_rules["HM03 Surf"] # Route 109 - entrance = get_entrance("REGION_ROUTE109/BEACH -> REGION_DEWFORD_TOWN/MAIN") - set_rule( - entrance, - lambda state: - state.can_reach("REGION_ROUTE104_MR_BRINEYS_HOUSE/MAIN -> REGION_DEWFORD_TOWN/MAIN", "Entrance", world.player) - and state.can_reach("REGION_DEWFORD_TOWN/MAIN -> REGION_ROUTE109/BEACH", "Entrance", world.player) - and state.has("EVENT_TALK_TO_MR_STONE", world.player) - and state.has("EVENT_DELIVER_LETTER", world.player) - ) - world.multiworld.register_indirect_condition( - get_entrance("REGION_ROUTE104_MR_BRINEYS_HOUSE/MAIN -> REGION_DEWFORD_TOWN/MAIN").parent_region, entrance) - set_rule( - get_entrance("REGION_ROUTE109/BEACH -> REGION_ROUTE109/SEA"), - hm_rules["HM03 Surf"] + entrance_rules["REGION_ROUTE109/BEACH -> REGION_DEWFORD_TOWN/MAIN"] = ( + CanReachEntrance("REGION_ROUTE104_MR_BRINEYS_HOUSE/MAIN -> REGION_DEWFORD_TOWN/MAIN") & + CanReachEntrance("REGION_DEWFORD_TOWN/MAIN -> REGION_ROUTE109/BEACH") & + HasAll("EVENT_TALK_TO_MR_STONE", "EVENT_DELIVER_LETTER") ) + entrance_rules["REGION_ROUTE109/BEACH -> REGION_ROUTE109/SEA"] = hm_rules["HM03 Surf"] # Slateport City - set_rule( - get_entrance("REGION_SLATEPORT_CITY/MAIN -> REGION_SLATEPORT_CITY/WATER"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_location("EVENT_TALK_TO_DOCK"), - lambda state: state.has("Devon Goods", world.player) - ) - set_rule( - get_entrance("MAP_SLATEPORT_CITY:5,7/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:0,1"), - lambda state: state.has("EVENT_TALK_TO_DOCK", world.player) - ) - set_rule( - get_location("EVENT_AQUA_STEALS_SUBMARINE"), - lambda state: state.has("EVENT_RELEASE_GROUDON", world.player) - ) - set_rule( - get_entrance("REGION_SLATEPORT_CITY_HARBOR/MAIN -> REGION_SS_TIDAL_CORRIDOR/MAIN"), - lambda state: state.has("S.S. Ticket", world.player) - ) + location_rules["EVENT_TALK_TO_DOCK"] = Has("Devon Goods") + location_rules["EVENT_AQUA_STEALS_SUBMARINE"] = Has("EVENT_RELEASE_GROUDON") + + entrance_rules["REGION_SLATEPORT_CITY/MAIN -> REGION_SLATEPORT_CITY/WATER"] = hm_rules["HM03 Surf"] + entrance_rules["MAP_SLATEPORT_CITY:5,7/MAP_SLATEPORT_CITY_OCEANIC_MUSEUM_1F:0,1"] = Has("EVENT_TALK_TO_DOCK") + entrance_rules["REGION_SLATEPORT_CITY_HARBOR/MAIN -> REGION_SS_TIDAL_CORRIDOR/MAIN"] = Has("S.S. Ticket") # Route 110 - set_rule( - get_entrance("REGION_ROUTE110/MAIN -> REGION_ROUTE110/SOUTH_WATER"), - hm_rules["HM03 Surf"] + entrance_rules["REGION_ROUTE110/MAIN -> REGION_ROUTE110/SOUTH_WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_ROUTE110/MAIN -> REGION_ROUTE110/NORTH_WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE/WEST -> REGION_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE/EAST"] = HasAny("Acro Bike", "Mach Bike") + entrance_rules["REGION_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE/WEST -> REGION_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE/EAST"] = HasAny("Acro Bike", "Mach Bike") + entrance_rules["REGION_ROUTE110/SOUTH -> REGION_ROUTE110/MAIN"] = ( + OptionFilter(RemoveRoadblocks, "Route 110 Aqua Grunts", "contains") | Has("EVENT_RESCUE_CAPT_STERN") ) - set_rule( - get_entrance("REGION_ROUTE110/MAIN -> REGION_ROUTE110/NORTH_WATER"), - hm_rules["HM03 Surf"] + entrance_rules["REGION_ROUTE110/MAIN -> REGION_ROUTE110/SOUTH"] = ( + OptionFilter(RemoveRoadblocks, "Route 110 Aqua Grunts", "contains") | Has("EVENT_RESCUE_CAPT_STERN") ) - set_rule( - get_entrance("REGION_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE/WEST -> REGION_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE/EAST"), - lambda state: has_acro_bike(state) or has_mach_bike(state) - ) - set_rule( - get_entrance("REGION_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE/WEST -> REGION_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE/EAST"), - lambda state: has_acro_bike(state) or has_mach_bike(state) - ) - if "Route 110 Aqua Grunts" not in world.options.remove_roadblocks.value: - set_rule( - get_entrance("REGION_ROUTE110/SOUTH -> REGION_ROUTE110/MAIN"), - lambda state: state.has("EVENT_RESCUE_CAPT_STERN", world.player) - ) - set_rule( - get_entrance("REGION_ROUTE110/MAIN -> REGION_ROUTE110/SOUTH"), - lambda state: state.has("EVENT_RESCUE_CAPT_STERN", world.player) - ) # Trick House - set_rule( - get_entrance("REGION_ROUTE110_TRICK_HOUSE_PUZZLE1/ENTRANCE -> REGION_ROUTE110_TRICK_HOUSE_PUZZLE1/REWARDS"), - hm_rules["HM01 Cut"] - ) - set_rule( - get_entrance("REGION_ROUTE110_TRICK_HOUSE_ENTRANCE/MAIN -> REGION_ROUTE110_TRICK_HOUSE_PUZZLE2/ENTRANCE"), - lambda state: state.has("Dynamo Badge", world.player) and state.has("EVENT_COMPLETE_TRICK_HOUSE_1", world.player) - ) - set_rule( - get_entrance("REGION_ROUTE110_TRICK_HOUSE_ENTRANCE/MAIN -> REGION_ROUTE110_TRICK_HOUSE_PUZZLE3/ENTRANCE"), - lambda state: state.has("Heat Badge", world.player) and state.has("EVENT_COMPLETE_TRICK_HOUSE_2", world.player) - ) - set_rule( - get_entrance("REGION_ROUTE110_TRICK_HOUSE_PUZZLE3/ENTRANCE -> REGION_ROUTE110_TRICK_HOUSE_PUZZLE3/REWARDS"), - hm_rules["HM06 Rock Smash"] - ) - set_rule( - get_entrance("REGION_ROUTE110_TRICK_HOUSE_ENTRANCE/MAIN -> REGION_ROUTE110_TRICK_HOUSE_PUZZLE4/ENTRANCE"), - lambda state: state.has("Balance Badge", world.player) and state.has("EVENT_COMPLETE_TRICK_HOUSE_3", world.player) - ) - set_rule( - get_entrance("REGION_ROUTE110_TRICK_HOUSE_PUZZLE4/ENTRANCE -> REGION_ROUTE110_TRICK_HOUSE_PUZZLE4/REWARDS"), - hm_rules["HM04 Strength"] - ) - set_rule( - get_entrance("REGION_ROUTE110_TRICK_HOUSE_ENTRANCE/MAIN -> REGION_ROUTE110_TRICK_HOUSE_PUZZLE5/ENTRANCE"), - lambda state: state.has("Feather Badge", world.player) and state.has("EVENT_COMPLETE_TRICK_HOUSE_4", world.player) - ) - set_rule( - get_entrance("REGION_ROUTE110_TRICK_HOUSE_ENTRANCE/MAIN -> REGION_ROUTE110_TRICK_HOUSE_PUZZLE6/ENTRANCE"), - lambda state: state.has("Mind Badge", world.player) and state.has("EVENT_COMPLETE_TRICK_HOUSE_5", world.player) - ) - set_rule( - get_entrance("REGION_ROUTE110_TRICK_HOUSE_ENTRANCE/MAIN -> REGION_ROUTE110_TRICK_HOUSE_PUZZLE7/ENTRANCE"), - lambda state: state.has("Rain Badge", world.player) and state.has("EVENT_COMPLETE_TRICK_HOUSE_6", world.player) - ) - set_rule( - get_entrance("REGION_ROUTE110_TRICK_HOUSE_ENTRANCE/MAIN -> REGION_ROUTE110_TRICK_HOUSE_PUZZLE8/ENTRANCE"), - lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player) and state.has("EVENT_COMPLETE_TRICK_HOUSE_7", world.player) - ) + entrance_rules["REGION_ROUTE110_TRICK_HOUSE_PUZZLE1/ENTRANCE -> REGION_ROUTE110_TRICK_HOUSE_PUZZLE1/REWARDS"] = hm_rules["HM01 Cut"] + entrance_rules["REGION_ROUTE110_TRICK_HOUSE_ENTRANCE/MAIN -> REGION_ROUTE110_TRICK_HOUSE_PUZZLE2/ENTRANCE"] = HasAll("Dynamo Badge", "EVENT_COMPLETE_TRICK_HOUSE_1") + entrance_rules["REGION_ROUTE110_TRICK_HOUSE_ENTRANCE/MAIN -> REGION_ROUTE110_TRICK_HOUSE_PUZZLE3/ENTRANCE"] = HasAll("Heat Badge", "EVENT_COMPLETE_TRICK_HOUSE_2") + entrance_rules["REGION_ROUTE110_TRICK_HOUSE_PUZZLE3/ENTRANCE -> REGION_ROUTE110_TRICK_HOUSE_PUZZLE3/REWARDS"] = hm_rules["HM06 Rock Smash"] + entrance_rules["REGION_ROUTE110_TRICK_HOUSE_ENTRANCE/MAIN -> REGION_ROUTE110_TRICK_HOUSE_PUZZLE4/ENTRANCE"] = HasAll("Balance Badge", "EVENT_COMPLETE_TRICK_HOUSE_3") + entrance_rules["REGION_ROUTE110_TRICK_HOUSE_PUZZLE4/ENTRANCE -> REGION_ROUTE110_TRICK_HOUSE_PUZZLE4/REWARDS"] = hm_rules["HM04 Strength"] + entrance_rules["REGION_ROUTE110_TRICK_HOUSE_ENTRANCE/MAIN -> REGION_ROUTE110_TRICK_HOUSE_PUZZLE5/ENTRANCE"] = HasAll("Feather Badge", "EVENT_COMPLETE_TRICK_HOUSE_4") + entrance_rules["REGION_ROUTE110_TRICK_HOUSE_ENTRANCE/MAIN -> REGION_ROUTE110_TRICK_HOUSE_PUZZLE6/ENTRANCE"] = HasAll("Mind Badge", "EVENT_COMPLETE_TRICK_HOUSE_5") + entrance_rules["REGION_ROUTE110_TRICK_HOUSE_ENTRANCE/MAIN -> REGION_ROUTE110_TRICK_HOUSE_PUZZLE7/ENTRANCE"] = HasAll("Rain Badge", "EVENT_COMPLETE_TRICK_HOUSE_6") + entrance_rules["REGION_ROUTE110_TRICK_HOUSE_ENTRANCE/MAIN -> REGION_ROUTE110_TRICK_HOUSE_PUZZLE8/ENTRANCE"] = HasAll("EVENT_DEFEAT_CHAMPION", "EVENT_COMPLETE_TRICK_HOUSE_7") # Mauville City - set_rule( - get_location("NPC_GIFT_GOT_BASEMENT_KEY_FROM_WATTSON"), - lambda state: state.has("EVENT_DEFEAT_NORMAN", world.player) - ) - set_rule( - get_location("NPC_GIFT_RECEIVED_COIN_CASE"), - lambda state: state.has("EVENT_BUY_HARBOR_MAIL", world.player) - ) + location_rules["NPC_GIFT_GOT_BASEMENT_KEY_FROM_WATTSON"] = Has("EVENT_DEFEAT_NORMAN") + location_rules["NPC_GIFT_RECEIVED_COIN_CASE"] = Has("EVENT_BUY_HARBOR_MAIL") # Route 117 - set_rule( - get_entrance("REGION_ROUTE117/MAIN -> REGION_ROUTE117/PONDS"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_location("EVENT_ENCOUNTER_LATIOS"), - lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player) - ) + location_rules["EVENT_ENCOUNTER_LATIOS"] = Has("EVENT_DEFEAT_CHAMPION") + + entrance_rules["REGION_ROUTE117/MAIN -> REGION_ROUTE117/PONDS"] = hm_rules["HM03 Surf"] # Route 111 - set_rule( - get_entrance("REGION_ROUTE111/MIDDLE -> REGION_ROUTE111/DESERT"), - lambda state: state.has("Go Goggles", world.player) - ) - set_rule( - get_entrance("REGION_ROUTE111/NORTH -> REGION_ROUTE111/DESERT"), - lambda state: state.has("Go Goggles", world.player) - ) - set_rule( - get_entrance("REGION_ROUTE111/NORTH -> REGION_ROUTE111/ABOVE_SLOPE"), - has_mach_bike - ) - set_rule( - get_entrance("REGION_ROUTE111/MIDDLE -> REGION_ROUTE111/SOUTH"), - hm_rules["HM06 Rock Smash"] - ) - set_rule( - get_entrance("REGION_ROUTE111/SOUTH -> REGION_ROUTE111/SOUTH_POND"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_ROUTE111/SOUTH -> REGION_ROUTE111/MIDDLE"), - hm_rules["HM06 Rock Smash"] - ) - set_rule( - get_entrance("MAP_ROUTE111:4/MAP_TRAINER_HILL_ENTRANCE:0"), - lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player) - ) - set_rule( - get_entrance("MAP_ROUTE111:1/MAP_DESERT_RUINS:0"), - lambda state: state.has("EVENT_UNDO_REGI_SEAL", world.player) - ) - set_rule( - get_entrance("MAP_DESERT_RUINS:0/MAP_ROUTE111:1"), - hm_rules["HM06 Rock Smash"] - ) + entrance_rules["REGION_ROUTE111/MIDDLE -> REGION_ROUTE111/DESERT"] = Has("Go Goggles") + entrance_rules["REGION_ROUTE111/NORTH -> REGION_ROUTE111/DESERT"] = Has("Go Goggles") + entrance_rules["REGION_ROUTE111/NORTH -> REGION_ROUTE111/ABOVE_SLOPE"] = Has("Mach Bike") + entrance_rules["REGION_ROUTE111/MIDDLE -> REGION_ROUTE111/SOUTH"] = hm_rules["HM06 Rock Smash"] + entrance_rules["REGION_ROUTE111/SOUTH -> REGION_ROUTE111/SOUTH_POND"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_ROUTE111/SOUTH -> REGION_ROUTE111/MIDDLE"] = hm_rules["HM06 Rock Smash"] + entrance_rules["MAP_ROUTE111:4/MAP_TRAINER_HILL_ENTRANCE:0"] = Has("EVENT_DEFEAT_CHAMPION") + entrance_rules["MAP_ROUTE111:1/MAP_DESERT_RUINS:0"] = Has("EVENT_UNDO_REGI_SEAL") + entrance_rules["MAP_DESERT_RUINS:0/MAP_ROUTE111:1"] = hm_rules["HM06 Rock Smash"] # Route 112 - if "Route 112 Magma Grunts" not in world.options.remove_roadblocks.value: - set_rule( - get_entrance("REGION_ROUTE112/SOUTH_EAST -> REGION_ROUTE112/CABLE_CAR_STATION_ENTRANCE"), - lambda state: state.has("EVENT_MAGMA_STEALS_METEORITE", world.player) - ) - set_rule( - get_entrance("REGION_ROUTE112/CABLE_CAR_STATION_ENTRANCE -> REGION_ROUTE112/SOUTH_EAST"), - lambda state: state.has("EVENT_MAGMA_STEALS_METEORITE", world.player) - ) + entrance_rules["REGION_ROUTE112/SOUTH_EAST -> REGION_ROUTE112/CABLE_CAR_STATION_ENTRANCE"] = ( + OptionFilter(RemoveRoadblocks, "Route 112 Magma Grunts", "contains") | Has("EVENT_MAGMA_STEALS_METEORITE") + ) + entrance_rules["REGION_ROUTE112/CABLE_CAR_STATION_ENTRANCE -> REGION_ROUTE112/SOUTH_EAST"] = ( + OptionFilter(RemoveRoadblocks, "Route 112 Magma Grunts", "contains") | Has("EVENT_MAGMA_STEALS_METEORITE") + ) # Fiery Path - set_rule( - get_entrance("REGION_FIERY_PATH/MAIN -> REGION_FIERY_PATH/BEHIND_BOULDER"), - hm_rules["HM04 Strength"] - ) + entrance_rules["REGION_FIERY_PATH/MAIN -> REGION_FIERY_PATH/BEHIND_BOULDER"] = hm_rules["HM04 Strength"] # Route 114 - set_rule( - get_entrance("REGION_ROUTE114/MAIN -> REGION_ROUTE114/WATER"), - hm_rules["HM03 Surf"] + entrance_rules["REGION_ROUTE114/MAIN -> REGION_ROUTE114/WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_ROUTE114/WATER -> REGION_ROUTE114/ABOVE_WATERFALL"] = hm_rules["HM07 Waterfall"] + entrance_rules["MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:2/MAP_DESERT_UNDERPASS:0"] = Has("EVENT_DEFEAT_CHAMPION") + entrance_rules["REGION_ROUTE114/ABOVE_WATERFALL -> REGION_TERRA_CAVE_ENTRANCE/MAIN"] = ( + HasAll("EVENT_DEFEAT_CHAMPION", "TERRA_CAVE_ROUTE_114_1", "EVENT_DEFEAT_SHELLY") ) - set_rule( - get_entrance("REGION_ROUTE114/WATER -> REGION_ROUTE114/ABOVE_WATERFALL"), - hm_rules["HM07 Waterfall"] - ) - set_rule( - get_entrance("MAP_ROUTE114_FOSSIL_MANIACS_TUNNEL:2/MAP_DESERT_UNDERPASS:0"), - lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player) - ) - set_rule( - get_entrance("REGION_ROUTE114/ABOVE_WATERFALL -> REGION_TERRA_CAVE_ENTRANCE/MAIN"), - lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player) - and state.has("TERRA_CAVE_ROUTE_114_1", world.player) - and state.has("EVENT_DEFEAT_SHELLY", world.player) - ) - set_rule( - get_entrance("REGION_ROUTE114/MAIN -> REGION_TERRA_CAVE_ENTRANCE/MAIN"), - lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player) - and state.has("TERRA_CAVE_ROUTE_114_2", world.player) - and state.has("EVENT_DEFEAT_SHELLY", world.player) + entrance_rules["REGION_ROUTE114/MAIN -> REGION_TERRA_CAVE_ENTRANCE/MAIN"] = ( + HasAll("EVENT_DEFEAT_CHAMPION", "TERRA_CAVE_ROUTE_114_2", "EVENT_DEFEAT_SHELLY") ) # Meteor Falls - set_rule( - get_entrance("REGION_METEOR_FALLS_1F_1R/MAIN -> REGION_METEOR_FALLS_1F_1R/WATER"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_METEOR_FALLS_1F_1R/WATER -> REGION_METEOR_FALLS_1F_1R/WATER_ABOVE_WATERFALL"), - hm_rules["HM07 Waterfall"] - ) - set_rule( - get_entrance("REGION_METEOR_FALLS_1F_1R/ABOVE_WATERFALL -> REGION_METEOR_FALLS_1F_1R/WATER_ABOVE_WATERFALL"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("MAP_METEOR_FALLS_1F_1R:5/MAP_METEOR_FALLS_STEVENS_CAVE:0"), - lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player) - ) - set_rule( - get_entrance("REGION_METEOR_FALLS_1F_2R/LEFT_SPLIT -> REGION_METEOR_FALLS_1F_2R/LEFT_SPLIT_WATER"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_METEOR_FALLS_1F_2R/RIGHT_SPLIT -> REGION_METEOR_FALLS_1F_2R/RIGHT_SPLIT_WATER"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_METEOR_FALLS_B1F_1R/HIGHEST_LADDER -> REGION_METEOR_FALLS_B1F_1R/WATER"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_METEOR_FALLS_B1F_1R/NORTH_SHORE -> REGION_METEOR_FALLS_B1F_1R/WATER"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_METEOR_FALLS_B1F_1R/SOUTH_SHORE -> REGION_METEOR_FALLS_B1F_1R/WATER"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_METEOR_FALLS_B1F_2R/ENTRANCE -> REGION_METEOR_FALLS_B1F_2R/WATER"), - hm_rules["HM03 Surf"] - ) + entrance_rules["REGION_METEOR_FALLS_1F_1R/MAIN -> REGION_METEOR_FALLS_1F_1R/WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_METEOR_FALLS_1F_1R/WATER -> REGION_METEOR_FALLS_1F_1R/WATER_ABOVE_WATERFALL"] = hm_rules["HM07 Waterfall"] + entrance_rules["REGION_METEOR_FALLS_1F_1R/ABOVE_WATERFALL -> REGION_METEOR_FALLS_1F_1R/WATER_ABOVE_WATERFALL"] = hm_rules["HM03 Surf"] + entrance_rules["MAP_METEOR_FALLS_1F_1R:5/MAP_METEOR_FALLS_STEVENS_CAVE:0"] = Has("EVENT_DEFEAT_CHAMPION") + entrance_rules["REGION_METEOR_FALLS_1F_2R/LEFT_SPLIT -> REGION_METEOR_FALLS_1F_2R/LEFT_SPLIT_WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_METEOR_FALLS_1F_2R/RIGHT_SPLIT -> REGION_METEOR_FALLS_1F_2R/RIGHT_SPLIT_WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_METEOR_FALLS_B1F_1R/HIGHEST_LADDER -> REGION_METEOR_FALLS_B1F_1R/WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_METEOR_FALLS_B1F_1R/NORTH_SHORE -> REGION_METEOR_FALLS_B1F_1R/WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_METEOR_FALLS_B1F_1R/SOUTH_SHORE -> REGION_METEOR_FALLS_B1F_1R/WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_METEOR_FALLS_B1F_2R/ENTRANCE -> REGION_METEOR_FALLS_B1F_2R/WATER"] = hm_rules["HM03 Surf"] # Jagged Pass - set_rule( - get_entrance("REGION_JAGGED_PASS/BOTTOM -> REGION_JAGGED_PASS/MIDDLE"), - has_acro_bike - ) - set_rule( - get_entrance("REGION_JAGGED_PASS/MIDDLE -> REGION_JAGGED_PASS/TOP"), - has_acro_bike - ) - set_rule( - get_entrance("MAP_JAGGED_PASS:4/MAP_MAGMA_HIDEOUT_1F:0"), - lambda state: state.has("Magma Emblem", world.player) - ) + entrance_rules["REGION_JAGGED_PASS/BOTTOM -> REGION_JAGGED_PASS/MIDDLE"] = Has("Acro Bike") + entrance_rules["REGION_JAGGED_PASS/MIDDLE -> REGION_JAGGED_PASS/TOP"] = Has("Acro Bike") + entrance_rules["MAP_JAGGED_PASS:4/MAP_MAGMA_HIDEOUT_1F:0"] = Has("Magma Emblem") # Lavaridge Town - set_rule( - get_location("NPC_GIFT_RECEIVED_GO_GOGGLES"), - lambda state: state.has("EVENT_DEFEAT_FLANNERY", world.player) - ) + location_rules["NPC_GIFT_RECEIVED_GO_GOGGLES"] = Has("EVENT_DEFEAT_FLANNERY") # Mirage Tower - set_rule( - get_entrance("REGION_MIRAGE_TOWER_2F/TOP -> REGION_MIRAGE_TOWER_2F/BOTTOM"), - has_mach_bike - ) - set_rule( - get_entrance("REGION_MIRAGE_TOWER_2F/BOTTOM -> REGION_MIRAGE_TOWER_2F/TOP"), - has_mach_bike - ) - set_rule( - get_entrance("REGION_MIRAGE_TOWER_3F/TOP -> REGION_MIRAGE_TOWER_3F/BOTTOM"), - hm_rules["HM06 Rock Smash"] - ) - set_rule( - get_entrance("REGION_MIRAGE_TOWER_3F/BOTTOM -> REGION_MIRAGE_TOWER_3F/TOP"), - hm_rules["HM06 Rock Smash"] - ) - set_rule( - get_entrance("REGION_MIRAGE_TOWER_4F/MAIN -> REGION_MIRAGE_TOWER_4F/FOSSIL_PLATFORM"), - hm_rules["HM06 Rock Smash"] - ) + entrance_rules["REGION_MIRAGE_TOWER_2F/TOP -> REGION_MIRAGE_TOWER_2F/BOTTOM"] = Has("Mach Bike") + entrance_rules["REGION_MIRAGE_TOWER_2F/BOTTOM -> REGION_MIRAGE_TOWER_2F/TOP"] = Has("Mach Bike") + entrance_rules["REGION_MIRAGE_TOWER_3F/TOP -> REGION_MIRAGE_TOWER_3F/BOTTOM"] = hm_rules["HM06 Rock Smash"] + entrance_rules["REGION_MIRAGE_TOWER_3F/BOTTOM -> REGION_MIRAGE_TOWER_3F/TOP"] = hm_rules["HM06 Rock Smash"] + entrance_rules["REGION_MIRAGE_TOWER_4F/MAIN -> REGION_MIRAGE_TOWER_4F/FOSSIL_PLATFORM"] = hm_rules["HM06 Rock Smash"] # Abandoned Ship - set_rule( - get_entrance("REGION_ABANDONED_SHIP_ROOMS_B1F/CENTER -> REGION_ABANDONED_SHIP_UNDERWATER1/MAIN"), - hm_rules["HM08 Dive"] - ) - set_rule( - get_entrance("REGION_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS/MAIN -> REGION_ABANDONED_SHIP_UNDERWATER2/MAIN"), - hm_rules["HM08 Dive"] - ) - set_rule( - get_entrance("MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:0/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:0"), - lambda state: state.has("Room 1 Key", world.player) - ) - set_rule( - get_entrance("MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:1/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:2"), - lambda state: state.has("Room 2 Key", world.player) - ) - set_rule( - get_entrance("MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:3/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:6"), - lambda state: state.has("Room 4 Key", world.player) - ) - set_rule( - get_entrance("MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:5/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:8"), - lambda state: state.has("Room 6 Key", world.player) - ) - set_rule( - get_entrance("MAP_ABANDONED_SHIP_CORRIDORS_B1F:5/MAP_ABANDONED_SHIP_ROOM_B1F:0"), - lambda state: state.has("Storage Key", world.player) - ) + entrance_rules["REGION_ABANDONED_SHIP_ROOMS_B1F/CENTER -> REGION_ABANDONED_SHIP_UNDERWATER1/MAIN"] = hm_rules["HM08 Dive"] + entrance_rules["REGION_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS/MAIN -> REGION_ABANDONED_SHIP_UNDERWATER2/MAIN"] = hm_rules["HM08 Dive"] + entrance_rules["MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:0/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:0"] = Has("Room 1 Key") + entrance_rules["MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:1/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:2"] = Has("Room 2 Key") + entrance_rules["MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:3/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:6"] = Has("Room 4 Key") + entrance_rules["MAP_ABANDONED_SHIP_HIDDEN_FLOOR_CORRIDORS:5/MAP_ABANDONED_SHIP_HIDDEN_FLOOR_ROOMS:8"] = Has("Room 6 Key") + entrance_rules["MAP_ABANDONED_SHIP_CORRIDORS_B1F:5/MAP_ABANDONED_SHIP_ROOM_B1F:0"] = Has("Storage Key") # New Mauville - set_rule( - get_entrance("MAP_NEW_MAUVILLE_ENTRANCE:1/MAP_NEW_MAUVILLE_INSIDE:0"), - lambda state: state.has("Basement Key", world.player) - ) + entrance_rules["MAP_NEW_MAUVILLE_ENTRANCE:1/MAP_NEW_MAUVILLE_INSIDE:0"] = Has("Basement Key") # Route 118 - if world.options.modify_118: - set_rule( - get_entrance("REGION_ROUTE118/WEST -> REGION_ROUTE118/EAST"), - has_acro_bike - ) - set_rule( - get_entrance("REGION_ROUTE118/EAST -> REGION_ROUTE118/WEST"), - has_acro_bike - ) - set_rule( - get_entrance("REGION_ROUTE118/WEST_WATER -> REGION_ROUTE118/EAST_WATER"), - lambda state: False - ) - set_rule( - get_entrance("REGION_ROUTE118/EAST_WATER -> REGION_ROUTE118/WEST_WATER"), - lambda state: False - ) - else: - set_rule( - get_entrance("REGION_ROUTE118/WEST -> REGION_ROUTE118/EAST"), - lambda state: False - ) - set_rule( - get_entrance("REGION_ROUTE118/EAST -> REGION_ROUTE118/WEST"), - lambda state: False - ) - - set_rule( - get_entrance("REGION_ROUTE118/WEST -> REGION_ROUTE118/WEST_WATER"), - hm_rules["HM03 Surf"] + entrance_rules["REGION_ROUTE118/WEST -> REGION_ROUTE118/EAST"] = ( + OptionFilter(ModifyRoute118, ModifyRoute118.option_true) & Has("Acro Bike") ) - set_rule( - get_entrance("REGION_ROUTE118/EAST -> REGION_ROUTE118/EAST_WATER"), - hm_rules["HM03 Surf"] + entrance_rules["REGION_ROUTE118/EAST -> REGION_ROUTE118/WEST"] = ( + OptionFilter(ModifyRoute118, ModifyRoute118.option_true) & Has("Acro Bike") ) - set_rule( - get_entrance("REGION_ROUTE118/EAST -> REGION_TERRA_CAVE_ENTRANCE/MAIN"), - lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player) - and state.has("TERRA_CAVE_ROUTE_118_1", world.player) - and state.has("EVENT_DEFEAT_SHELLY", world.player) + entrance_rules["REGION_ROUTE118/WEST_WATER -> REGION_ROUTE118/EAST_WATER"] = ( + OptionFilter(ModifyRoute118, ModifyRoute118.option_false) & True_() ) - set_rule( - get_entrance("REGION_ROUTE118/WEST -> REGION_TERRA_CAVE_ENTRANCE/MAIN"), - lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player) - and state.has("TERRA_CAVE_ROUTE_118_2", world.player) - and state.has("EVENT_DEFEAT_SHELLY", world.player) + entrance_rules["REGION_ROUTE118/EAST_WATER -> REGION_ROUTE118/WEST_WATER"] = ( + OptionFilter(ModifyRoute118, ModifyRoute118.option_false) & True_() + ) + entrance_rules["REGION_ROUTE118/WEST -> REGION_ROUTE118/WEST_WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_ROUTE118/EAST -> REGION_ROUTE118/EAST_WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_ROUTE118/EAST -> REGION_TERRA_CAVE_ENTRANCE/MAIN"] = ( + HasAll("EVENT_DEFEAT_CHAMPION", "TERRA_CAVE_ROUTE_118_1", "EVENT_DEFEAT_SHELLY") + ) + entrance_rules["REGION_ROUTE118/WEST -> REGION_TERRA_CAVE_ENTRANCE/MAIN"] = ( + HasAll("EVENT_DEFEAT_CHAMPION", "TERRA_CAVE_ROUTE_118_2", "EVENT_DEFEAT_SHELLY") ) # Route 119 - set_rule( - get_entrance("REGION_ROUTE119/LOWER -> REGION_ROUTE119/LOWER_WATER"), - hm_rules["HM03 Surf"] + entrance_rules["REGION_ROUTE119/LOWER -> REGION_ROUTE119/LOWER_WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_ROUTE119/LOWER -> REGION_ROUTE119/LOWER_ACROSS_RAILS"] = Has("Acro Bike") + entrance_rules["REGION_ROUTE119/LOWER_ACROSS_RAILS -> REGION_ROUTE119/LOWER"] = Has("Acro Bike") + entrance_rules["REGION_ROUTE119/UPPER -> REGION_ROUTE119/MIDDLE_RIVER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_ROUTE119/MIDDLE_RIVER -> REGION_ROUTE119/ABOVE_WATERFALL"] = hm_rules["HM07 Waterfall"] + entrance_rules["REGION_ROUTE119/ABOVE_WATERFALL -> REGION_ROUTE119/MIDDLE_RIVER"] = hm_rules["HM07 Waterfall"] + entrance_rules["REGION_ROUTE119/ABOVE_WATERFALL -> REGION_ROUTE119/ABOVE_WATERFALL_ACROSS_RAILS"] = Has("Acro Bike") + entrance_rules["REGION_ROUTE119/MIDDLE -> REGION_ROUTE119/UPPER"] = ( + OptionFilter(RemoveRoadblocks, "Route 119 Aqua Grunts", "contains") | Has("EVENT_DEFEAT_SHELLY") ) - set_rule( - get_entrance("REGION_ROUTE119/LOWER -> REGION_ROUTE119/LOWER_ACROSS_RAILS"), - has_acro_bike + entrance_rules["REGION_ROUTE119/UPPER -> REGION_ROUTE119/MIDDLE"] = ( + OptionFilter(RemoveRoadblocks, "Route 119 Aqua Grunts", "contains") | Has("EVENT_DEFEAT_SHELLY") ) - set_rule( - get_entrance("REGION_ROUTE119/LOWER_ACROSS_RAILS -> REGION_ROUTE119/LOWER"), - has_acro_bike - ) - set_rule( - get_entrance("REGION_ROUTE119/UPPER -> REGION_ROUTE119/MIDDLE_RIVER"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_ROUTE119/MIDDLE_RIVER -> REGION_ROUTE119/ABOVE_WATERFALL"), - hm_rules["HM07 Waterfall"] - ) - set_rule( - get_entrance("REGION_ROUTE119/ABOVE_WATERFALL -> REGION_ROUTE119/MIDDLE_RIVER"), - hm_rules["HM07 Waterfall"] - ) - set_rule( - get_entrance("REGION_ROUTE119/ABOVE_WATERFALL -> REGION_ROUTE119/ABOVE_WATERFALL_ACROSS_RAILS"), - has_acro_bike - ) - if "Route 119 Aqua Grunts" not in world.options.remove_roadblocks.value: - set_rule( - get_entrance("REGION_ROUTE119/MIDDLE -> REGION_ROUTE119/UPPER"), - lambda state: state.has("EVENT_DEFEAT_SHELLY", world.player) - ) - set_rule( - get_entrance("REGION_ROUTE119/UPPER -> REGION_ROUTE119/MIDDLE"), - lambda state: state.has("EVENT_DEFEAT_SHELLY", world.player) - ) # Fortree City - set_rule( - get_entrance("REGION_FORTREE_CITY/MAIN -> REGION_FORTREE_CITY/BEFORE_GYM"), - lambda state: state.has("Devon Scope", world.player) - ) - set_rule( - get_entrance("REGION_FORTREE_CITY/BEFORE_GYM -> REGION_FORTREE_CITY/MAIN"), - lambda state: state.has("Devon Scope", world.player) - ) + entrance_rules["REGION_FORTREE_CITY/MAIN -> REGION_FORTREE_CITY/BEFORE_GYM"] = Has("Devon Scope") + entrance_rules["REGION_FORTREE_CITY/BEFORE_GYM -> REGION_FORTREE_CITY/MAIN"] = Has("Devon Scope") # Route 120 - set_rule( - get_entrance("REGION_ROUTE120/NORTH -> REGION_ROUTE120/NORTH_POND_SHORE"), - lambda state: state.has("Devon Scope", world.player) - ) - set_rule( - get_entrance("REGION_ROUTE120/NORTH_POND_SHORE -> REGION_ROUTE120/NORTH"), - lambda state: state.has("Devon Scope", world.player) - ) - set_rule( - get_entrance("REGION_ROUTE120/NORTH_POND_SHORE -> REGION_ROUTE120/NORTH_POND"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_ROUTE120/SOUTH -> REGION_ROUTE120/SOUTH_ALCOVE"), - hm_rules["HM01 Cut"] - ) - set_rule( - get_entrance("REGION_ROUTE120/SOUTH -> REGION_ROUTE120/SOUTH_PONDS"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_ROUTE120/SOUTH_ALCOVE -> REGION_ROUTE120/SOUTH"), - hm_rules["HM01 Cut"] - ) - set_rule( - get_entrance("MAP_ROUTE120:0/MAP_ANCIENT_TOMB:0"), - lambda state: state.has("EVENT_UNDO_REGI_SEAL", world.player) - ) - set_rule( - get_entrance("MAP_ANCIENT_TOMB:1/MAP_ANCIENT_TOMB:2"), - hm_rules["HM05 Flash"] - ) + entrance_rules["REGION_ROUTE120/NORTH -> REGION_ROUTE120/NORTH_POND_SHORE"] = Has("Devon Scope") + entrance_rules["REGION_ROUTE120/NORTH_POND_SHORE -> REGION_ROUTE120/NORTH"] = Has("Devon Scope") + entrance_rules["REGION_ROUTE120/NORTH_POND_SHORE -> REGION_ROUTE120/NORTH_POND"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_ROUTE120/SOUTH -> REGION_ROUTE120/SOUTH_ALCOVE"] = hm_rules["HM01 Cut"] + entrance_rules["REGION_ROUTE120/SOUTH -> REGION_ROUTE120/SOUTH_PONDS"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_ROUTE120/SOUTH_ALCOVE -> REGION_ROUTE120/SOUTH"] = hm_rules["HM01 Cut"] + entrance_rules["MAP_ROUTE120:0/MAP_ANCIENT_TOMB:0"] = Has("EVENT_UNDO_REGI_SEAL") + entrance_rules["MAP_ANCIENT_TOMB:1/MAP_ANCIENT_TOMB:2"] = hm_rules["HM05 Flash"] # Route 121 - set_rule( - get_entrance("REGION_ROUTE121/EAST -> REGION_ROUTE121/WEST"), - hm_rules["HM01 Cut"] - ) - set_rule( - get_entrance("REGION_ROUTE121/EAST -> REGION_ROUTE121/WATER"), - hm_rules["HM03 Surf"] - ) + entrance_rules["REGION_ROUTE121/EAST -> REGION_ROUTE121/WEST"] = hm_rules["HM01 Cut"] + entrance_rules["REGION_ROUTE121/EAST -> REGION_ROUTE121/WATER"] = hm_rules["HM03 Surf"] # Safari Zone - set_rule( - get_entrance("MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:0,1/MAP_SAFARI_ZONE_SOUTH:0"), - lambda state: state.has("Pokeblock Case", world.player) + entrance_rules["MAP_ROUTE121_SAFARI_ZONE_ENTRANCE:0,1/MAP_SAFARI_ZONE_SOUTH:0"] = Has("Pokeblock Case") + entrance_rules["REGION_SAFARI_ZONE_NORTHWEST/MAIN -> REGION_SAFARI_ZONE_NORTHWEST/POND"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_SAFARI_ZONE_SOUTH/MAIN -> REGION_SAFARI_ZONE_NORTH/MAIN"] = Has("Acro Bike") + entrance_rules["REGION_SAFARI_ZONE_SOUTHWEST/MAIN -> REGION_SAFARI_ZONE_NORTHWEST/MAIN"] = Has("Mach Bike") + entrance_rules["REGION_SAFARI_ZONE_SOUTHWEST/MAIN -> REGION_SAFARI_ZONE_SOUTHWEST/POND"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_SAFARI_ZONE_SOUTHEAST/MAIN -> REGION_SAFARI_ZONE_SOUTHEAST/WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_SAFARI_ZONE_SOUTH/MAIN -> REGION_SAFARI_ZONE_SOUTHEAST/MAIN"] = ( + OptionFilter(RemoveRoadblocks, "Safari Zone Construction Workers", "contains") | Has("EVENT_DEFEAT_CHAMPION") ) - set_rule( - get_entrance("REGION_SAFARI_ZONE_NORTHWEST/MAIN -> REGION_SAFARI_ZONE_NORTHWEST/POND"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_SAFARI_ZONE_SOUTH/MAIN -> REGION_SAFARI_ZONE_NORTH/MAIN"), - has_acro_bike - ) - set_rule( - get_entrance("REGION_SAFARI_ZONE_SOUTHWEST/MAIN -> REGION_SAFARI_ZONE_NORTHWEST/MAIN"), - has_mach_bike - ) - set_rule( - get_entrance("REGION_SAFARI_ZONE_SOUTHWEST/MAIN -> REGION_SAFARI_ZONE_SOUTHWEST/POND"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_SAFARI_ZONE_SOUTHEAST/MAIN -> REGION_SAFARI_ZONE_SOUTHEAST/WATER"), - hm_rules["HM03 Surf"] - ) - if "Safari Zone Construction Workers" not in world.options.remove_roadblocks.value: - set_rule( - get_entrance("REGION_SAFARI_ZONE_SOUTH/MAIN -> REGION_SAFARI_ZONE_SOUTHEAST/MAIN"), - lambda state: state.has("EVENT_DEFEAT_CHAMPION", world.player) - ) # Route 122 - set_rule( - get_entrance("REGION_ROUTE122/MT_PYRE_ENTRANCE -> REGION_ROUTE122/SEA"), - hm_rules["HM03 Surf"] - ) + entrance_rules["REGION_ROUTE122/MT_PYRE_ENTRANCE -> REGION_ROUTE122/SEA"] = hm_rules["HM03 Surf"] # Route 123 - set_rule( - get_entrance("REGION_ROUTE123/EAST -> REGION_ROUTE122/SEA"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_ROUTE123/EAST -> REGION_ROUTE123/POND"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_ROUTE123/EAST -> REGION_ROUTE123/EAST_BEHIND_TREE"), - hm_rules["HM01 Cut"] - ) + entrance_rules["REGION_ROUTE123/EAST -> REGION_ROUTE122/SEA"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_ROUTE123/EAST -> REGION_ROUTE123/POND"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_ROUTE123/EAST -> REGION_ROUTE123/EAST_BEHIND_TREE"] = hm_rules["HM01 Cut"] # Lilycove City - set_rule( - get_entrance("REGION_LILYCOVE_CITY/MAIN -> REGION_LILYCOVE_CITY/SEA"), - hm_rules["HM03 Surf"] + entrance_rules["REGION_LILYCOVE_CITY/MAIN -> REGION_LILYCOVE_CITY/SEA"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_LILYCOVE_CITY_HARBOR/MAIN -> REGION_SS_TIDAL_CORRIDOR/MAIN"] = Has("S.S. Ticket") + entrance_rules["REGION_LILYCOVE_CITY_HARBOR/MAIN -> REGION_SOUTHERN_ISLAND_EXTERIOR/MAIN"] = Has("Eon Ticket") + entrance_rules["REGION_LILYCOVE_CITY_HARBOR/MAIN -> REGION_FARAWAY_ISLAND_ENTRANCE/MAIN"] = Has("Old Sea Map") + entrance_rules["REGION_LILYCOVE_CITY_HARBOR/MAIN -> REGION_BIRTH_ISLAND_HARBOR/MAIN"] = Has("Aurora Ticket") + entrance_rules["REGION_LILYCOVE_CITY_HARBOR/MAIN -> REGION_NAVEL_ROCK_HARBOR/MAIN"] = Has("Mystic Ticket") + entrance_rules["REGION_LILYCOVE_CITY/SEA -> REGION_ROUTE124/MAIN"] = ( + OptionFilter(RemoveRoadblocks, "Lilycove City Wailmer", "contains") | Has("EVENT_CLEAR_AQUA_HIDEOUT") ) - set_rule( - get_entrance("REGION_LILYCOVE_CITY_HARBOR/MAIN -> REGION_SS_TIDAL_CORRIDOR/MAIN"), - lambda state: state.has("S.S. Ticket", world.player) + entrance_rules["REGION_ROUTE124/MAIN -> REGION_LILYCOVE_CITY/SEA"] = ( + OptionFilter(RemoveRoadblocks, "Lilycove City Wailmer", "contains") | Has("EVENT_CLEAR_AQUA_HIDEOUT") ) - set_rule( - get_entrance("REGION_LILYCOVE_CITY_HARBOR/MAIN -> REGION_SOUTHERN_ISLAND_EXTERIOR/MAIN"), - lambda state: state.has("Eon Ticket", world.player) - ) - set_rule( - get_entrance("REGION_LILYCOVE_CITY_HARBOR/MAIN -> REGION_FARAWAY_ISLAND_ENTRANCE/MAIN"), - lambda state: state.has("Old Sea Map", world.player) - ) - set_rule( - get_entrance("REGION_LILYCOVE_CITY_HARBOR/MAIN -> REGION_BIRTH_ISLAND_HARBOR/MAIN"), - lambda state: state.has("Aurora Ticket", world.player) - ) - set_rule( - get_entrance("REGION_LILYCOVE_CITY_HARBOR/MAIN -> REGION_NAVEL_ROCK_HARBOR/MAIN"), - lambda state: state.has("Mystic Ticket", world.player) - ) - - if "Lilycove City Wailmer" not in world.options.remove_roadblocks.value: - set_rule( - get_entrance("REGION_LILYCOVE_CITY/SEA -> REGION_ROUTE124/MAIN"), - lambda state: state.has("EVENT_CLEAR_AQUA_HIDEOUT", world.player) - ) - set_rule( - get_entrance("REGION_ROUTE124/MAIN -> REGION_LILYCOVE_CITY/SEA"), - lambda state: state.has("EVENT_CLEAR_AQUA_HIDEOUT", world.player) - ) # Magma Hideout - set_rule( - get_entrance("REGION_MAGMA_HIDEOUT_1F/ENTRANCE -> REGION_MAGMA_HIDEOUT_1F/MAIN"), - hm_rules["HM04 Strength"] - ) - set_rule( - get_entrance("REGION_MAGMA_HIDEOUT_1F/MAIN -> REGION_MAGMA_HIDEOUT_1F/ENTRANCE"), - hm_rules["HM04 Strength"] - ) + entrance_rules["REGION_MAGMA_HIDEOUT_1F/ENTRANCE -> REGION_MAGMA_HIDEOUT_1F/MAIN"] = hm_rules["HM04 Strength"] + entrance_rules["REGION_MAGMA_HIDEOUT_1F/MAIN -> REGION_MAGMA_HIDEOUT_1F/ENTRANCE"] = hm_rules["HM04 Strength"] # Aqua Hideout - if "Aqua Hideout Grunts" not in world.options.remove_roadblocks.value: - set_rule( - get_entrance("REGION_AQUA_HIDEOUT_1F/WATER -> REGION_AQUA_HIDEOUT_1F/MAIN"), - lambda state: state.has("EVENT_AQUA_STEALS_SUBMARINE", world.player) - ) - set_rule( - get_entrance("REGION_AQUA_HIDEOUT_1F/MAIN -> REGION_AQUA_HIDEOUT_1F/WATER"), - lambda state: hm_rules["HM03 Surf"](state) and state.has("EVENT_AQUA_STEALS_SUBMARINE", world.player) - ) + entrance_rules["REGION_AQUA_HIDEOUT_1F/WATER -> REGION_AQUA_HIDEOUT_1F/MAIN"] = ( + OptionFilter(RemoveRoadblocks, "Aqua Hideout Grunts", "contains") | Has("EVENT_AQUA_STEALS_SUBMARINE") + ) + entrance_rules["REGION_AQUA_HIDEOUT_1F/MAIN -> REGION_AQUA_HIDEOUT_1F/WATER"] = ( + OptionFilter(RemoveRoadblocks, "Aqua Hideout Grunts", "contains") | + (hm_rules["HM03 Surf"] & Has("EVENT_AQUA_STEALS_SUBMARINE")) + ) # Route 124 - set_rule( - get_entrance("REGION_ROUTE124/MAIN -> REGION_UNDERWATER_ROUTE124/BIG_AREA"), - hm_rules["HM08 Dive"] - ) - set_rule( - get_entrance("REGION_ROUTE124/MAIN -> REGION_UNDERWATER_ROUTE124/SMALL_AREA_1"), - hm_rules["HM08 Dive"] - ) - set_rule( - get_entrance("REGION_ROUTE124/MAIN -> REGION_UNDERWATER_ROUTE124/SMALL_AREA_2"), - hm_rules["HM08 Dive"] - ) - set_rule( - get_entrance("REGION_ROUTE124/MAIN -> REGION_UNDERWATER_ROUTE124/SMALL_AREA_3"), - hm_rules["HM08 Dive"] - ) - set_rule( - get_entrance("REGION_ROUTE124/MAIN -> REGION_UNDERWATER_ROUTE124/TUNNEL_1"), - hm_rules["HM08 Dive"] - ) - set_rule( - get_entrance("REGION_ROUTE124/MAIN -> REGION_UNDERWATER_ROUTE124/TUNNEL_2"), - hm_rules["HM08 Dive"] - ) - set_rule( - get_entrance("REGION_ROUTE124/MAIN -> REGION_UNDERWATER_ROUTE124/TUNNEL_3"), - hm_rules["HM08 Dive"] - ) - set_rule( - get_entrance("REGION_ROUTE124/MAIN -> REGION_UNDERWATER_ROUTE124/TUNNEL_4"), - hm_rules["HM08 Dive"] - ) - set_rule( - get_entrance("REGION_ROUTE124/NORTH_ENCLOSED_AREA_1 -> REGION_UNDERWATER_ROUTE124/TUNNEL_1"), - hm_rules["HM08 Dive"] - ) - set_rule( - get_entrance("REGION_ROUTE124/NORTH_ENCLOSED_AREA_2 -> REGION_UNDERWATER_ROUTE124/TUNNEL_1"), - hm_rules["HM08 Dive"] - ) - set_rule( - get_entrance("REGION_ROUTE124/NORTH_ENCLOSED_AREA_3 -> REGION_UNDERWATER_ROUTE124/TUNNEL_2"), - hm_rules["HM08 Dive"] - ) - set_rule( - get_entrance("REGION_ROUTE124/SOUTH_ENCLOSED_AREA_1 -> REGION_UNDERWATER_ROUTE124/TUNNEL_3"), - hm_rules["HM08 Dive"] - ) - set_rule( - get_entrance("REGION_ROUTE124/SOUTH_ENCLOSED_AREA_2 -> REGION_UNDERWATER_ROUTE124/TUNNEL_3"), - hm_rules["HM08 Dive"] - ) - set_rule( - get_entrance("REGION_ROUTE124/SOUTH_ENCLOSED_AREA_3 -> REGION_UNDERWATER_ROUTE124/TUNNEL_4"), - hm_rules["HM08 Dive"] - ) + entrance_rules["REGION_ROUTE124/MAIN -> REGION_UNDERWATER_ROUTE124/BIG_AREA"] = hm_rules["HM08 Dive"] + entrance_rules["REGION_ROUTE124/MAIN -> REGION_UNDERWATER_ROUTE124/SMALL_AREA_1"] = hm_rules["HM08 Dive"] + entrance_rules["REGION_ROUTE124/MAIN -> REGION_UNDERWATER_ROUTE124/SMALL_AREA_2"] = hm_rules["HM08 Dive"] + entrance_rules["REGION_ROUTE124/MAIN -> REGION_UNDERWATER_ROUTE124/SMALL_AREA_3"] = hm_rules["HM08 Dive"] + entrance_rules["REGION_ROUTE124/MAIN -> REGION_UNDERWATER_ROUTE124/TUNNEL_1"] = hm_rules["HM08 Dive"] + entrance_rules["REGION_ROUTE124/MAIN -> REGION_UNDERWATER_ROUTE124/TUNNEL_2"] = hm_rules["HM08 Dive"] + entrance_rules["REGION_ROUTE124/MAIN -> REGION_UNDERWATER_ROUTE124/TUNNEL_3"] = hm_rules["HM08 Dive"] + entrance_rules["REGION_ROUTE124/MAIN -> REGION_UNDERWATER_ROUTE124/TUNNEL_4"] = hm_rules["HM08 Dive"] + entrance_rules["REGION_ROUTE124/NORTH_ENCLOSED_AREA_1 -> REGION_UNDERWATER_ROUTE124/TUNNEL_1"] = hm_rules["HM08 Dive"] + entrance_rules["REGION_ROUTE124/NORTH_ENCLOSED_AREA_2 -> REGION_UNDERWATER_ROUTE124/TUNNEL_1"] = hm_rules["HM08 Dive"] + entrance_rules["REGION_ROUTE124/NORTH_ENCLOSED_AREA_3 -> REGION_UNDERWATER_ROUTE124/TUNNEL_2"] = hm_rules["HM08 Dive"] + entrance_rules["REGION_ROUTE124/SOUTH_ENCLOSED_AREA_1 -> REGION_UNDERWATER_ROUTE124/TUNNEL_3"] = hm_rules["HM08 Dive"] + entrance_rules["REGION_ROUTE124/SOUTH_ENCLOSED_AREA_2 -> REGION_UNDERWATER_ROUTE124/TUNNEL_3"] = hm_rules["HM08 Dive"] + entrance_rules["REGION_ROUTE124/SOUTH_ENCLOSED_AREA_3 -> REGION_UNDERWATER_ROUTE124/TUNNEL_4"] = hm_rules["HM08 Dive"] # Mossdeep City - set_rule( - get_entrance("REGION_MOSSDEEP_CITY/MAIN -> REGION_MOSSDEEP_CITY/WATER"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_MOSSDEEP_CITY/MAIN -> REGION_ROUTE124/MAIN"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_MOSSDEEP_CITY/MAIN -> REGION_ROUTE125/SEA"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_MOSSDEEP_CITY/MAIN -> REGION_ROUTE127/MAIN"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_location("EVENT_DEFEAT_MAXIE_AT_SPACE_STATION"), - lambda state: state.has("EVENT_DEFEAT_TATE_AND_LIZA", world.player) - ) - set_rule( - get_location("EVENT_STEVEN_GIVES_DIVE"), - lambda state: state.has("EVENT_DEFEAT_MAXIE_AT_SPACE_STATION", world.player) - ) - set_rule( - get_location("NPC_GIFT_RECEIVED_HM_DIVE"), - lambda state: state.has("EVENT_DEFEAT_MAXIE_AT_SPACE_STATION", world.player) - ) + location_rules["EVENT_DEFEAT_MAXIE_AT_SPACE_STATION"] = Has("EVENT_DEFEAT_TATE_AND_LIZA") + location_rules["EVENT_STEVEN_GIVES_DIVE"] = Has("EVENT_DEFEAT_MAXIE_AT_SPACE_STATION") + location_rules["NPC_GIFT_RECEIVED_HM_DIVE"] = Has("EVENT_DEFEAT_MAXIE_AT_SPACE_STATION") + + entrance_rules["REGION_MOSSDEEP_CITY/MAIN -> REGION_MOSSDEEP_CITY/WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_MOSSDEEP_CITY/MAIN -> REGION_ROUTE124/MAIN"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_MOSSDEEP_CITY/MAIN -> REGION_ROUTE125/SEA"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_MOSSDEEP_CITY/MAIN -> REGION_ROUTE127/MAIN"] = hm_rules["HM03 Surf"] # Route 125 - set_rule( - get_entrance("REGION_UNDERWATER_ROUTE125/MARINE_CAVE_ENTRANCE_1 -> REGION_UNDERWATER_MARINE_CAVE/MAIN"), - lambda state: hm_rules["HM08 Dive"](state) - and state.has("EVENT_DEFEAT_CHAMPION", world.player) - and state.has("MARINE_CAVE_ROUTE_125_1", world.player) - and state.has("EVENT_DEFEAT_SHELLY", world.player) + entrance_rules["REGION_UNDERWATER_ROUTE125/MARINE_CAVE_ENTRANCE_1 -> REGION_UNDERWATER_MARINE_CAVE/MAIN"] = ( + hm_rules["HM08 Dive"] & HasAll("EVENT_DEFEAT_CHAMPION", "MARINE_CAVE_ROUTE_125_1", "EVENT_DEFEAT_SHELLY") ) - set_rule( - get_entrance("REGION_UNDERWATER_ROUTE125/MARINE_CAVE_ENTRANCE_2 -> REGION_UNDERWATER_MARINE_CAVE/MAIN"), - lambda state: hm_rules["HM08 Dive"](state) - and state.has("EVENT_DEFEAT_CHAMPION", world.player) - and state.has("MARINE_CAVE_ROUTE_125_2", world.player) - and state.has("EVENT_DEFEAT_SHELLY", world.player) + entrance_rules["REGION_UNDERWATER_ROUTE125/MARINE_CAVE_ENTRANCE_2 -> REGION_UNDERWATER_MARINE_CAVE/MAIN"] = ( + hm_rules["HM08 Dive"] & HasAll("EVENT_DEFEAT_CHAMPION", "MARINE_CAVE_ROUTE_125_2", "EVENT_DEFEAT_SHELLY") ) # Shoal Cave - set_rule( - get_entrance("REGION_SHOAL_CAVE_ENTRANCE_ROOM/SOUTH -> REGION_SHOAL_CAVE_ENTRANCE_ROOM/HIGH_TIDE_WATER"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_SHOAL_CAVE_ENTRANCE_ROOM/NORTH_WEST_CORNER -> REGION_SHOAL_CAVE_ENTRANCE_ROOM/HIGH_TIDE_WATER"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_SHOAL_CAVE_ENTRANCE_ROOM/NORTH_EAST_CORNER -> REGION_SHOAL_CAVE_ENTRANCE_ROOM/HIGH_TIDE_WATER"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_SHOAL_CAVE_INNER_ROOM/HIGH_TIDE_EAST_MIDDLE_GROUND -> REGION_SHOAL_CAVE_INNER_ROOM/SOUTH_EAST_WATER"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_SHOAL_CAVE_INNER_ROOM/HIGH_TIDE_EAST_MIDDLE_GROUND -> REGION_SHOAL_CAVE_INNER_ROOM/EAST_WATER"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_SHOAL_CAVE_INNER_ROOM/HIGH_TIDE_EAST_MIDDLE_GROUND -> REGION_SHOAL_CAVE_INNER_ROOM/NORTH_WEST_WATER"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_SHOAL_CAVE_INNER_ROOM/SOUTH_WEST_CORNER -> REGION_SHOAL_CAVE_INNER_ROOM/NORTH_WEST_WATER"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_SHOAL_CAVE_INNER_ROOM/RARE_CANDY_PLATFORM -> REGION_SHOAL_CAVE_INNER_ROOM/SOUTH_EAST_WATER"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM/NORTH_WEST -> REGION_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM/EAST"), - hm_rules["HM04 Strength"] - ) - set_rule( - get_entrance("REGION_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM/EAST -> REGION_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM/NORTH_WEST"), - hm_rules["HM04 Strength"] - ) + entrance_rules["REGION_SHOAL_CAVE_ENTRANCE_ROOM/SOUTH -> REGION_SHOAL_CAVE_ENTRANCE_ROOM/HIGH_TIDE_WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_SHOAL_CAVE_ENTRANCE_ROOM/NORTH_WEST_CORNER -> REGION_SHOAL_CAVE_ENTRANCE_ROOM/HIGH_TIDE_WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_SHOAL_CAVE_ENTRANCE_ROOM/NORTH_EAST_CORNER -> REGION_SHOAL_CAVE_ENTRANCE_ROOM/HIGH_TIDE_WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_SHOAL_CAVE_INNER_ROOM/HIGH_TIDE_EAST_MIDDLE_GROUND -> REGION_SHOAL_CAVE_INNER_ROOM/SOUTH_EAST_WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_SHOAL_CAVE_INNER_ROOM/HIGH_TIDE_EAST_MIDDLE_GROUND -> REGION_SHOAL_CAVE_INNER_ROOM/EAST_WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_SHOAL_CAVE_INNER_ROOM/HIGH_TIDE_EAST_MIDDLE_GROUND -> REGION_SHOAL_CAVE_INNER_ROOM/NORTH_WEST_WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_SHOAL_CAVE_INNER_ROOM/SOUTH_WEST_CORNER -> REGION_SHOAL_CAVE_INNER_ROOM/NORTH_WEST_WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_SHOAL_CAVE_INNER_ROOM/RARE_CANDY_PLATFORM -> REGION_SHOAL_CAVE_INNER_ROOM/SOUTH_EAST_WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM/NORTH_WEST -> REGION_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM/EAST"] = hm_rules["HM04 Strength"] + entrance_rules["REGION_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM/EAST -> REGION_SHOAL_CAVE_LOW_TIDE_LOWER_ROOM/NORTH_WEST"] = hm_rules["HM04 Strength"] # Route 126 - set_rule( - get_entrance("REGION_ROUTE126/MAIN -> REGION_UNDERWATER_ROUTE126/MAIN"), - hm_rules["HM08 Dive"] - ) - set_rule( - get_entrance("REGION_ROUTE126/MAIN -> REGION_UNDERWATER_ROUTE126/SMALL_AREA_2"), - hm_rules["HM08 Dive"] - ) - set_rule( - get_entrance("REGION_ROUTE126/NEAR_ROUTE_124 -> REGION_UNDERWATER_ROUTE126/TUNNEL"), - hm_rules["HM08 Dive"] - ) - set_rule( - get_entrance("REGION_ROUTE126/NORTH_WEST_CORNER -> REGION_UNDERWATER_ROUTE126/TUNNEL"), - hm_rules["HM08 Dive"] - ) - set_rule( - get_entrance("REGION_ROUTE126/WEST -> REGION_UNDERWATER_ROUTE126/MAIN"), - hm_rules["HM08 Dive"] - ) - set_rule( - get_entrance("REGION_ROUTE126/WEST -> REGION_UNDERWATER_ROUTE126/SMALL_AREA_1"), - hm_rules["HM08 Dive"] - ) + entrance_rules["REGION_ROUTE126/MAIN -> REGION_UNDERWATER_ROUTE126/MAIN"] = hm_rules["HM08 Dive"] + entrance_rules["REGION_ROUTE126/MAIN -> REGION_UNDERWATER_ROUTE126/SMALL_AREA_2"] = hm_rules["HM08 Dive"] + entrance_rules["REGION_ROUTE126/NEAR_ROUTE_124 -> REGION_UNDERWATER_ROUTE126/TUNNEL"] = hm_rules["HM08 Dive"] + entrance_rules["REGION_ROUTE126/NORTH_WEST_CORNER -> REGION_UNDERWATER_ROUTE126/TUNNEL"] = hm_rules["HM08 Dive"] + entrance_rules["REGION_ROUTE126/WEST -> REGION_UNDERWATER_ROUTE126/MAIN"] = hm_rules["HM08 Dive"] + entrance_rules["REGION_ROUTE126/WEST -> REGION_UNDERWATER_ROUTE126/SMALL_AREA_1"] = hm_rules["HM08 Dive"] # Sootopolis City - set_rule( - get_entrance("REGION_SOOTOPOLIS_CITY/WATER -> REGION_UNDERWATER_SOOTOPOLIS_CITY/MAIN"), - hm_rules["HM08 Dive"] - ) - set_rule( - get_entrance("REGION_SOOTOPOLIS_CITY/EAST -> REGION_SOOTOPOLIS_CITY/WATER"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_SOOTOPOLIS_CITY/WEST -> REGION_SOOTOPOLIS_CITY/WATER"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_SOOTOPOLIS_CITY/ISLAND -> REGION_SOOTOPOLIS_CITY/WATER"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("MAP_SOOTOPOLIS_CITY:3/MAP_CAVE_OF_ORIGIN_ENTRANCE:0"), - lambda state: state.has("EVENT_RELEASE_KYOGRE", world.player) - ) - set_rule( - get_entrance("MAP_SOOTOPOLIS_CITY:2/MAP_SOOTOPOLIS_CITY_GYM_1F:0"), - lambda state: state.has("EVENT_RAYQUAZA_STOPS_FIGHT", world.player) - ) - set_rule( - get_location("NPC_GIFT_RECEIVED_HM_WATERFALL"), - lambda state: state.has("EVENT_RAYQUAZA_STOPS_FIGHT", world.player) - ) - set_rule( - get_location("EVENT_RAYQUAZA_STOPS_FIGHT"), - lambda state: state.has("EVENT_RELEASE_KYOGRE", world.player) - ) + location_rules["NPC_GIFT_RECEIVED_HM_WATERFALL"] = Has("EVENT_RAYQUAZA_STOPS_FIGHT") + location_rules["EVENT_RAYQUAZA_STOPS_FIGHT"] = Has("EVENT_RELEASE_KYOGRE") + + entrance_rules["REGION_SOOTOPOLIS_CITY/WATER -> REGION_UNDERWATER_SOOTOPOLIS_CITY/MAIN"] = hm_rules["HM08 Dive"] + entrance_rules["REGION_SOOTOPOLIS_CITY/EAST -> REGION_SOOTOPOLIS_CITY/WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_SOOTOPOLIS_CITY/WEST -> REGION_SOOTOPOLIS_CITY/WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_SOOTOPOLIS_CITY/ISLAND -> REGION_SOOTOPOLIS_CITY/WATER"] = hm_rules["HM03 Surf"] + entrance_rules["MAP_SOOTOPOLIS_CITY:3/MAP_CAVE_OF_ORIGIN_ENTRANCE:0"] = Has("EVENT_RELEASE_KYOGRE") + entrance_rules["MAP_SOOTOPOLIS_CITY:2/MAP_SOOTOPOLIS_CITY_GYM_1F:0"] = Has("EVENT_RAYQUAZA_STOPS_FIGHT") # Route 127 - set_rule( - get_entrance("REGION_ROUTE127/MAIN -> REGION_UNDERWATER_ROUTE127/MAIN"), - hm_rules["HM08 Dive"] + entrance_rules["REGION_ROUTE127/MAIN -> REGION_UNDERWATER_ROUTE127/MAIN"] = hm_rules["HM08 Dive"] + entrance_rules["REGION_ROUTE127/MAIN -> REGION_UNDERWATER_ROUTE127/TUNNEL"] = hm_rules["HM08 Dive"] + entrance_rules["REGION_ROUTE127/MAIN -> REGION_UNDERWATER_ROUTE127/AREA_1"] = hm_rules["HM08 Dive"] + entrance_rules["REGION_ROUTE127/MAIN -> REGION_UNDERWATER_ROUTE127/AREA_2"] = hm_rules["HM08 Dive"] + entrance_rules["REGION_ROUTE127/MAIN -> REGION_UNDERWATER_ROUTE127/AREA_3"] = hm_rules["HM08 Dive"] + entrance_rules["REGION_ROUTE127/ENCLOSED_AREA -> REGION_UNDERWATER_ROUTE127/TUNNEL"] = hm_rules["HM08 Dive"] + entrance_rules["REGION_UNDERWATER_ROUTE127/MARINE_CAVE_ENTRANCE_1 -> REGION_UNDERWATER_MARINE_CAVE/MAIN"] = ( + hm_rules["HM08 Dive"] & HasAll("EVENT_DEFEAT_CHAMPION", "MARINE_CAVE_ROUTE_127_1", "EVENT_DEFEAT_SHELLY") ) - set_rule( - get_entrance("REGION_ROUTE127/MAIN -> REGION_UNDERWATER_ROUTE127/TUNNEL"), - hm_rules["HM08 Dive"] - ) - set_rule( - get_entrance("REGION_ROUTE127/MAIN -> REGION_UNDERWATER_ROUTE127/AREA_1"), - hm_rules["HM08 Dive"] - ) - set_rule( - get_entrance("REGION_ROUTE127/MAIN -> REGION_UNDERWATER_ROUTE127/AREA_2"), - hm_rules["HM08 Dive"] - ) - set_rule( - get_entrance("REGION_ROUTE127/MAIN -> REGION_UNDERWATER_ROUTE127/AREA_3"), - hm_rules["HM08 Dive"] - ) - set_rule( - get_entrance("REGION_ROUTE127/ENCLOSED_AREA -> REGION_UNDERWATER_ROUTE127/TUNNEL"), - hm_rules["HM08 Dive"] - ) - set_rule( - get_entrance("REGION_UNDERWATER_ROUTE127/MARINE_CAVE_ENTRANCE_1 -> REGION_UNDERWATER_MARINE_CAVE/MAIN"), - lambda state: hm_rules["HM08 Dive"](state) - and state.has("EVENT_DEFEAT_CHAMPION", world.player) - and state.has("MARINE_CAVE_ROUTE_127_1", world.player) - and state.has("EVENT_DEFEAT_SHELLY", world.player) - ) - set_rule( - get_entrance("REGION_UNDERWATER_ROUTE127/MARINE_CAVE_ENTRANCE_2 -> REGION_UNDERWATER_MARINE_CAVE/MAIN"), - lambda state: hm_rules["HM08 Dive"](state) - and state.has("EVENT_DEFEAT_CHAMPION", world.player) - and state.has("MARINE_CAVE_ROUTE_127_2", world.player) - and state.has("EVENT_DEFEAT_SHELLY", world.player) + entrance_rules["REGION_UNDERWATER_ROUTE127/MARINE_CAVE_ENTRANCE_2 -> REGION_UNDERWATER_MARINE_CAVE/MAIN"] = ( + hm_rules["HM08 Dive"] & HasAll("EVENT_DEFEAT_CHAMPION", "MARINE_CAVE_ROUTE_127_2", "EVENT_DEFEAT_SHELLY") ) # Route 128 - set_rule( - get_entrance("REGION_ROUTE128/MAIN -> REGION_UNDERWATER_ROUTE128/MAIN"), - hm_rules["HM08 Dive"] - ) - set_rule( - get_entrance("REGION_ROUTE128/MAIN -> REGION_UNDERWATER_ROUTE128/AREA_1"), - hm_rules["HM08 Dive"] - ) - set_rule( - get_entrance("REGION_ROUTE128/MAIN -> REGION_UNDERWATER_ROUTE128/AREA_2"), - hm_rules["HM08 Dive"] - ) + entrance_rules["REGION_ROUTE128/MAIN -> REGION_UNDERWATER_ROUTE128/MAIN"] = hm_rules["HM08 Dive"] + entrance_rules["REGION_ROUTE128/MAIN -> REGION_UNDERWATER_ROUTE128/AREA_1"] = hm_rules["HM08 Dive"] + entrance_rules["REGION_ROUTE128/MAIN -> REGION_UNDERWATER_ROUTE128/AREA_2"] = hm_rules["HM08 Dive"] # Seafloor Cavern - set_rule( - get_entrance("REGION_SEAFLOOR_CAVERN_ENTRANCE/MAIN -> REGION_SEAFLOOR_CAVERN_ENTRANCE/WATER"), - hm_rules["HM03 Surf"] + entrance_rules["REGION_SEAFLOOR_CAVERN_ENTRANCE/MAIN -> REGION_SEAFLOOR_CAVERN_ENTRANCE/WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_SEAFLOOR_CAVERN_ENTRANCE/WATER -> REGION_UNDERWATER_SEAFLOOR_CAVERN/MAIN"] = hm_rules["HM08 Dive"] + entrance_rules["REGION_SEAFLOOR_CAVERN_ROOM1/SOUTH -> REGION_SEAFLOOR_CAVERN_ROOM1/NORTH"] = hm_rules["HM06 Rock Smash"] & hm_rules["HM04 Strength"] + entrance_rules["REGION_SEAFLOOR_CAVERN_ROOM1/NORTH -> REGION_SEAFLOOR_CAVERN_ROOM1/SOUTH"] = hm_rules["HM04 Strength"] + entrance_rules["REGION_SEAFLOOR_CAVERN_ROOM2/SOUTH_WEST -> REGION_SEAFLOOR_CAVERN_ROOM2/NORTH_WEST"] = hm_rules["HM04 Strength"] + entrance_rules["REGION_SEAFLOOR_CAVERN_ROOM2/NORTH_WEST -> REGION_SEAFLOOR_CAVERN_ROOM2/SOUTH_WEST"] = hm_rules["HM04 Strength"] + entrance_rules["REGION_SEAFLOOR_CAVERN_ROOM2/SOUTH_WEST -> REGION_SEAFLOOR_CAVERN_ROOM2/SOUTH_EAST"] = hm_rules["HM06 Rock Smash"] + entrance_rules["REGION_SEAFLOOR_CAVERN_ROOM2/SOUTH_EAST -> REGION_SEAFLOOR_CAVERN_ROOM2/SOUTH_WEST"] = hm_rules["HM06 Rock Smash"] + entrance_rules["REGION_SEAFLOOR_CAVERN_ROOM2/NORTH_WEST -> REGION_SEAFLOOR_CAVERN_ROOM2/NORTH_EAST"] = hm_rules["HM06 Rock Smash"] & hm_rules["HM04 Strength"] + entrance_rules["REGION_SEAFLOOR_CAVERN_ROOM2/NORTH_WEST -> REGION_SEAFLOOR_CAVERN_ROOM2/SOUTH_EAST"] = hm_rules["HM06 Rock Smash"] & hm_rules["HM04 Strength"] + entrance_rules["REGION_SEAFLOOR_CAVERN_ROOM5/NORTH_WEST -> REGION_SEAFLOOR_CAVERN_ROOM5/EAST"] = hm_rules["HM06 Rock Smash"] & hm_rules["HM04 Strength"] + entrance_rules["REGION_SEAFLOOR_CAVERN_ROOM5/EAST -> REGION_SEAFLOOR_CAVERN_ROOM5/NORTH_WEST"] = hm_rules["HM04 Strength"] + entrance_rules["REGION_SEAFLOOR_CAVERN_ROOM5/NORTH_WEST -> REGION_SEAFLOOR_CAVERN_ROOM5/SOUTH_WEST"] = hm_rules["HM06 Rock Smash"] & hm_rules["HM04 Strength"] + entrance_rules["REGION_SEAFLOOR_CAVERN_ROOM5/SOUTH_WEST -> REGION_SEAFLOOR_CAVERN_ROOM5/NORTH_WEST"] = hm_rules["HM06 Rock Smash"] & hm_rules["HM04 Strength"] + entrance_rules["REGION_SEAFLOOR_CAVERN_ROOM6/NORTH_WEST -> REGION_SEAFLOOR_CAVERN_ROOM6/WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_SEAFLOOR_CAVERN_ROOM6/SOUTH -> REGION_SEAFLOOR_CAVERN_ROOM6/WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_SEAFLOOR_CAVERN_ROOM7/SOUTH -> REGION_SEAFLOOR_CAVERN_ROOM7/WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_SEAFLOOR_CAVERN_ROOM7/NORTH -> REGION_SEAFLOOR_CAVERN_ROOM7/WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_SEAFLOOR_CAVERN_ROOM8/NORTH -> REGION_SEAFLOOR_CAVERN_ROOM8/SOUTH"] = hm_rules["HM04 Strength"] + entrance_rules["REGION_SEAFLOOR_CAVERN_ROOM8/SOUTH -> REGION_SEAFLOOR_CAVERN_ROOM8/NORTH"] = hm_rules["HM04 Strength"] + entrance_rules["MAP_SEAFLOOR_CAVERN_ENTRANCE:1/MAP_SEAFLOOR_CAVERN_ROOM1:0"] = ( + OptionFilter(RemoveRoadblocks, "Seafloor Cavern Aqua Grunt", "contains") | Has("EVENT_STEVEN_GIVES_DIVE") ) - set_rule( - get_entrance("REGION_SEAFLOOR_CAVERN_ENTRANCE/WATER -> REGION_UNDERWATER_SEAFLOOR_CAVERN/MAIN"), - hm_rules["HM08 Dive"] - ) - set_rule( - get_entrance("REGION_SEAFLOOR_CAVERN_ROOM1/SOUTH -> REGION_SEAFLOOR_CAVERN_ROOM1/NORTH"), - lambda state: hm_rules["HM06 Rock Smash"](state) and hm_rules["HM04 Strength"](state) - ) - set_rule( - get_entrance("REGION_SEAFLOOR_CAVERN_ROOM1/NORTH -> REGION_SEAFLOOR_CAVERN_ROOM1/SOUTH"), - hm_rules["HM04 Strength"] - ) - set_rule( - get_entrance("REGION_SEAFLOOR_CAVERN_ROOM2/SOUTH_WEST -> REGION_SEAFLOOR_CAVERN_ROOM2/NORTH_WEST"), - hm_rules["HM04 Strength"] - ) - set_rule( - get_entrance("REGION_SEAFLOOR_CAVERN_ROOM2/NORTH_WEST -> REGION_SEAFLOOR_CAVERN_ROOM2/SOUTH_WEST"), - hm_rules["HM04 Strength"] - ) - set_rule( - get_entrance("REGION_SEAFLOOR_CAVERN_ROOM2/SOUTH_WEST -> REGION_SEAFLOOR_CAVERN_ROOM2/SOUTH_EAST"), - hm_rules["HM06 Rock Smash"] - ) - set_rule( - get_entrance("REGION_SEAFLOOR_CAVERN_ROOM2/SOUTH_EAST -> REGION_SEAFLOOR_CAVERN_ROOM2/SOUTH_WEST"), - hm_rules["HM06 Rock Smash"] - ) - set_rule( - get_entrance("REGION_SEAFLOOR_CAVERN_ROOM2/NORTH_WEST -> REGION_SEAFLOOR_CAVERN_ROOM2/NORTH_EAST"), - lambda state: hm_rules["HM06 Rock Smash"](state) and hm_rules["HM04 Strength"](state) - ) - set_rule( - get_entrance("REGION_SEAFLOOR_CAVERN_ROOM2/NORTH_WEST -> REGION_SEAFLOOR_CAVERN_ROOM2/SOUTH_EAST"), - lambda state: hm_rules["HM06 Rock Smash"](state) and hm_rules["HM04 Strength"](state) - ) - set_rule( - get_entrance("REGION_SEAFLOOR_CAVERN_ROOM5/NORTH_WEST -> REGION_SEAFLOOR_CAVERN_ROOM5/EAST"), - lambda state: hm_rules["HM06 Rock Smash"](state) and hm_rules["HM04 Strength"](state) - ) - set_rule( - get_entrance("REGION_SEAFLOOR_CAVERN_ROOM5/EAST -> REGION_SEAFLOOR_CAVERN_ROOM5/NORTH_WEST"), - hm_rules["HM04 Strength"] - ) - set_rule( - get_entrance("REGION_SEAFLOOR_CAVERN_ROOM5/NORTH_WEST -> REGION_SEAFLOOR_CAVERN_ROOM5/SOUTH_WEST"), - lambda state: hm_rules["HM06 Rock Smash"](state) and hm_rules["HM04 Strength"](state) - ) - set_rule( - get_entrance("REGION_SEAFLOOR_CAVERN_ROOM5/SOUTH_WEST -> REGION_SEAFLOOR_CAVERN_ROOM5/NORTH_WEST"), - lambda state: hm_rules["HM06 Rock Smash"](state) and hm_rules["HM04 Strength"](state) - ) - set_rule( - get_entrance("REGION_SEAFLOOR_CAVERN_ROOM6/NORTH_WEST -> REGION_SEAFLOOR_CAVERN_ROOM6/WATER"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_SEAFLOOR_CAVERN_ROOM6/SOUTH -> REGION_SEAFLOOR_CAVERN_ROOM6/WATER"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_SEAFLOOR_CAVERN_ROOM7/SOUTH -> REGION_SEAFLOOR_CAVERN_ROOM7/WATER"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_SEAFLOOR_CAVERN_ROOM7/NORTH -> REGION_SEAFLOOR_CAVERN_ROOM7/WATER"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_SEAFLOOR_CAVERN_ROOM8/NORTH -> REGION_SEAFLOOR_CAVERN_ROOM8/SOUTH"), - hm_rules["HM04 Strength"] - ) - set_rule( - get_entrance("REGION_SEAFLOOR_CAVERN_ROOM8/SOUTH -> REGION_SEAFLOOR_CAVERN_ROOM8/NORTH"), - hm_rules["HM04 Strength"] - ) - if "Seafloor Cavern Aqua Grunt" not in world.options.remove_roadblocks.value: - set_rule( - get_entrance("MAP_SEAFLOOR_CAVERN_ENTRANCE:1/MAP_SEAFLOOR_CAVERN_ROOM1:0"), - lambda state: state.has("EVENT_STEVEN_GIVES_DIVE", world.player) - ) # Route 129 - set_rule( - get_entrance("REGION_UNDERWATER_ROUTE129/MARINE_CAVE_ENTRANCE_1 -> REGION_UNDERWATER_MARINE_CAVE/MAIN"), - lambda state: hm_rules["HM08 Dive"](state) - and state.has("EVENT_DEFEAT_CHAMPION", world.player) - and state.has("MARINE_CAVE_ROUTE_129_1", world.player) - and state.has("EVENT_DEFEAT_SHELLY", world.player) + entrance_rules["REGION_UNDERWATER_ROUTE129/MARINE_CAVE_ENTRANCE_1 -> REGION_UNDERWATER_MARINE_CAVE/MAIN"] = ( + hm_rules["HM08 Dive"] & HasAll("EVENT_DEFEAT_CHAMPION", "MARINE_CAVE_ROUTE_129_1", "EVENT_DEFEAT_SHELLY") ) - set_rule( - get_entrance("REGION_UNDERWATER_ROUTE129/MARINE_CAVE_ENTRANCE_2 -> REGION_UNDERWATER_MARINE_CAVE/MAIN"), - lambda state: hm_rules["HM08 Dive"](state) - and state.has("EVENT_DEFEAT_CHAMPION", world.player) - and state.has("MARINE_CAVE_ROUTE_129_2", world.player) - and state.has("EVENT_DEFEAT_SHELLY", world.player) + entrance_rules["REGION_UNDERWATER_ROUTE129/MARINE_CAVE_ENTRANCE_2 -> REGION_UNDERWATER_MARINE_CAVE/MAIN"] = ( + hm_rules["HM08 Dive"] & HasAll("EVENT_DEFEAT_CHAMPION", "MARINE_CAVE_ROUTE_129_2", "EVENT_DEFEAT_SHELLY") ) # Pacifidlog Town - set_rule( - get_entrance("REGION_PACIFIDLOG_TOWN/MAIN -> REGION_PACIFIDLOG_TOWN/WATER"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_PACIFIDLOG_TOWN/MAIN -> REGION_ROUTE131/MAIN"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_PACIFIDLOG_TOWN/MAIN -> REGION_ROUTE132/EAST"), - hm_rules["HM03 Surf"] - ) + entrance_rules["REGION_PACIFIDLOG_TOWN/MAIN -> REGION_PACIFIDLOG_TOWN/WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_PACIFIDLOG_TOWN/MAIN -> REGION_ROUTE131/MAIN"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_PACIFIDLOG_TOWN/MAIN -> REGION_ROUTE132/EAST"] = hm_rules["HM03 Surf"] # Sky Pillar - set_rule( - get_entrance("MAP_SKY_PILLAR_OUTSIDE:1/MAP_SKY_PILLAR_1F:0"), - lambda state: state.has("EVENT_RELEASE_KYOGRE", world.player) - ) - add_rule( - get_location("EVENT_ENCOUNTER_RAYQUAZA"), - lambda state: state.has("EVENT_RAYQUAZA_STOPS_FIGHT", world.player) - ) - set_rule( - get_entrance("REGION_SKY_PILLAR_2F/RIGHT -> REGION_SKY_PILLAR_2F/LEFT"), - has_mach_bike - ) - set_rule( - get_entrance("REGION_SKY_PILLAR_2F/LEFT -> REGION_SKY_PILLAR_2F/RIGHT"), - has_mach_bike - ) - set_rule( - get_entrance("REGION_SKY_PILLAR_4F/MAIN -> REGION_SKY_PILLAR_4F/ABOVE_3F_TOP_CENTER"), - has_mach_bike - ) + location_rules["EVENT_ENCOUNTER_RAYQUAZA"] = Has("EVENT_RAYQUAZA_STOPS_FIGHT") + + entrance_rules["MAP_SKY_PILLAR_OUTSIDE:1/MAP_SKY_PILLAR_1F:0"] = Has("EVENT_RELEASE_KYOGRE") + entrance_rules["REGION_SKY_PILLAR_2F/RIGHT -> REGION_SKY_PILLAR_2F/LEFT"] = Has("Mach Bike") + entrance_rules["REGION_SKY_PILLAR_2F/LEFT -> REGION_SKY_PILLAR_2F/RIGHT"] = Has("Mach Bike") + entrance_rules["REGION_SKY_PILLAR_4F/MAIN -> REGION_SKY_PILLAR_4F/ABOVE_3F_TOP_CENTER"] = Has("Mach Bike") # Route 134 - set_rule( - get_entrance("REGION_ROUTE134/MAIN -> REGION_UNDERWATER_ROUTE134/MAIN"), - hm_rules["HM08 Dive"] - ) - set_rule( - get_location("EVENT_UNDO_REGI_SEAL"), - lambda state: state.has("CATCH_SPECIES_WAILORD", world.player) and state.has("CATCH_SPECIES_RELICANTH", world.player) - ) - set_rule( - get_entrance("REGION_SEALED_CHAMBER_OUTER_ROOM/MAIN -> REGION_SEALED_CHAMBER_OUTER_ROOM/CRUMBLED_WALL"), - lambda state: state.has("EVENT_MOVE_TUTOR_DIG", world.player) - ) + location_rules["EVENT_UNDO_REGI_SEAL"] = HasAll("CATCH_SPECIES_WAILORD", "CATCH_SPECIES_RELICANTH") + + entrance_rules["REGION_ROUTE134/MAIN -> REGION_UNDERWATER_ROUTE134/MAIN"] = hm_rules["HM08 Dive"] + entrance_rules["REGION_SEALED_CHAMBER_OUTER_ROOM/MAIN -> REGION_SEALED_CHAMBER_OUTER_ROOM/CRUMBLED_WALL"] = Has("EVENT_MOVE_TUTOR_DIG") # Ever Grande City - set_rule( - get_entrance("REGION_EVER_GRANDE_CITY/SEA -> REGION_EVER_GRANDE_CITY/SOUTH"), - hm_rules["HM07 Waterfall"] - ) - set_rule( - get_entrance("REGION_EVER_GRANDE_CITY/SOUTH -> REGION_EVER_GRANDE_CITY/SEA"), - hm_rules["HM03 Surf"] - ) + entrance_rules["REGION_EVER_GRANDE_CITY/SEA -> REGION_EVER_GRANDE_CITY/SOUTH"] = hm_rules["HM07 Waterfall"] + entrance_rules["REGION_EVER_GRANDE_CITY/SOUTH -> REGION_EVER_GRANDE_CITY/SEA"] = hm_rules["HM03 Surf"] # Victory Road - set_rule( - get_entrance("REGION_VICTORY_ROAD_B1F/SOUTH_WEST_MAIN -> REGION_VICTORY_ROAD_B1F/SOUTH_WEST_LADDER_UP"), - lambda state: hm_rules["HM06 Rock Smash"](state) and hm_rules["HM04 Strength"](state) - ) - set_rule( - get_entrance("REGION_VICTORY_ROAD_B1F/SOUTH_WEST_LADDER_UP -> REGION_VICTORY_ROAD_B1F/SOUTH_WEST_MAIN"), - lambda state: hm_rules["HM06 Rock Smash"](state) and hm_rules["HM04 Strength"](state) - ) - set_rule( - get_entrance("REGION_VICTORY_ROAD_B1F/MAIN_UPPER -> REGION_VICTORY_ROAD_B1F/MAIN_LOWER_EAST"), - lambda state: hm_rules["HM06 Rock Smash"](state) and hm_rules["HM04 Strength"](state) - ) - set_rule( - get_entrance("REGION_VICTORY_ROAD_B1F/MAIN_LOWER_EAST -> REGION_VICTORY_ROAD_B1F/MAIN_LOWER_WEST"), - hm_rules["HM06 Rock Smash"] - ) - set_rule( - get_entrance("REGION_VICTORY_ROAD_B1F/MAIN_LOWER_WEST -> REGION_VICTORY_ROAD_B1F/MAIN_LOWER_EAST"), - lambda state: hm_rules["HM06 Rock Smash"](state) and hm_rules["HM04 Strength"](state) - ) - set_rule( - get_entrance("REGION_VICTORY_ROAD_B1F/MAIN_LOWER_WEST -> REGION_VICTORY_ROAD_B1F/MAIN_UPPER"), - lambda state: hm_rules["HM06 Rock Smash"](state) and hm_rules["HM04 Strength"](state) - ) - set_rule( - get_entrance("REGION_VICTORY_ROAD_B2F/LOWER_WEST -> REGION_VICTORY_ROAD_B2F/LOWER_WEST_WATER"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_VICTORY_ROAD_B2F/LOWER_WEST_ISLAND -> REGION_VICTORY_ROAD_B2F/LOWER_WEST_WATER"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_VICTORY_ROAD_B2F/LOWER_EAST -> REGION_VICTORY_ROAD_B2F/LOWER_EAST_WATER"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_VICTORY_ROAD_B2F/LOWER_WEST_WATER -> REGION_VICTORY_ROAD_B2F/UPPER_WATER"), - hm_rules["HM07 Waterfall"] - ) - set_rule( - get_entrance("REGION_VICTORY_ROAD_B2F/LOWER_EAST_WATER -> REGION_VICTORY_ROAD_B2F/UPPER_WATER"), - hm_rules["HM07 Waterfall"] - ) - set_rule( - get_entrance("REGION_VICTORY_ROAD_B2F/UPPER -> REGION_VICTORY_ROAD_B2F/UPPER_WATER"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_VICTORY_ROAD_B2F/UPPER -> REGION_VICTORY_ROAD_B2F/LOWER_EAST_WATER"), - hm_rules["HM03 Surf"] - ) + entrance_rules["REGION_VICTORY_ROAD_B1F/SOUTH_WEST_MAIN -> REGION_VICTORY_ROAD_B1F/SOUTH_WEST_LADDER_UP"] = hm_rules["HM06 Rock Smash"] & hm_rules["HM04 Strength"] + entrance_rules["REGION_VICTORY_ROAD_B1F/SOUTH_WEST_LADDER_UP -> REGION_VICTORY_ROAD_B1F/SOUTH_WEST_MAIN"] = hm_rules["HM06 Rock Smash"] & hm_rules["HM04 Strength"] + entrance_rules["REGION_VICTORY_ROAD_B1F/MAIN_UPPER -> REGION_VICTORY_ROAD_B1F/MAIN_LOWER_EAST"] = hm_rules["HM06 Rock Smash"] & hm_rules["HM04 Strength"] + entrance_rules["REGION_VICTORY_ROAD_B1F/MAIN_LOWER_EAST -> REGION_VICTORY_ROAD_B1F/MAIN_LOWER_WEST"] = hm_rules["HM06 Rock Smash"] + entrance_rules["REGION_VICTORY_ROAD_B1F/MAIN_LOWER_WEST -> REGION_VICTORY_ROAD_B1F/MAIN_LOWER_EAST"] = hm_rules["HM06 Rock Smash"] & hm_rules["HM04 Strength"] + entrance_rules["REGION_VICTORY_ROAD_B1F/MAIN_LOWER_WEST -> REGION_VICTORY_ROAD_B1F/MAIN_UPPER"] = hm_rules["HM06 Rock Smash"] & hm_rules["HM04 Strength"] + entrance_rules["REGION_VICTORY_ROAD_B2F/LOWER_WEST -> REGION_VICTORY_ROAD_B2F/LOWER_WEST_WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_VICTORY_ROAD_B2F/LOWER_WEST_ISLAND -> REGION_VICTORY_ROAD_B2F/LOWER_WEST_WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_VICTORY_ROAD_B2F/LOWER_EAST -> REGION_VICTORY_ROAD_B2F/LOWER_EAST_WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_VICTORY_ROAD_B2F/LOWER_WEST_WATER -> REGION_VICTORY_ROAD_B2F/UPPER_WATER"] = hm_rules["HM07 Waterfall"] + entrance_rules["REGION_VICTORY_ROAD_B2F/LOWER_EAST_WATER -> REGION_VICTORY_ROAD_B2F/UPPER_WATER"] = hm_rules["HM07 Waterfall"] + entrance_rules["REGION_VICTORY_ROAD_B2F/UPPER -> REGION_VICTORY_ROAD_B2F/UPPER_WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_VICTORY_ROAD_B2F/UPPER -> REGION_VICTORY_ROAD_B2F/LOWER_EAST_WATER"] = hm_rules["HM03 Surf"] # Pokemon League - if world.options.elite_four_requirement == EliteFourRequirement.option_badges: - set_rule( - get_entrance("REGION_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F/MAIN -> REGION_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F/BEHIND_BADGE_CHECKERS"), - lambda state: state.has_group_unique("Badge", world.player, world.options.elite_four_count.value) - ) - else: - set_rule( - get_entrance("REGION_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F/MAIN -> REGION_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F/BEHIND_BADGE_CHECKERS"), - lambda state: defeated_n_gym_leaders(state, world.options.elite_four_count.value) + entrance_rules["REGION_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F/MAIN -> REGION_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F/BEHIND_BADGE_CHECKERS"] = ( + ( + OptionFilter(EliteFourRequirement, EliteFourRequirement.option_badges) & + HasGroupUnique("Badge", world.options.elite_four_count.value) + ) | + ( + OptionFilter(EliteFourRequirement, EliteFourRequirement.option_gyms) & + create_defeated_n_gym_leaders_rule(world.options.elite_four_count.value) ) + ) # Battle Frontier - set_rule( - get_entrance("REGION_BATTLE_FRONTIER_OUTSIDE_WEST/DOCK -> REGION_SS_TIDAL_CORRIDOR/MAIN"), - lambda state: state.has("S.S. Ticket", world.player) - ) - set_rule( - get_entrance("REGION_BATTLE_FRONTIER_OUTSIDE_WEST/CAVE_ENTRANCE -> REGION_BATTLE_FRONTIER_OUTSIDE_WEST/WATER"), - hm_rules["HM03 Surf"] - ) - set_rule( - get_entrance("REGION_BATTLE_FRONTIER_OUTSIDE_EAST/MAIN -> REGION_BATTLE_FRONTIER_OUTSIDE_EAST/ABOVE_WATERFALL"), - lambda state: state.has("Wailmer Pail", world.player) and hm_rules["HM03 Surf"](state) - ) - set_rule( - get_entrance("REGION_BATTLE_FRONTIER_OUTSIDE_EAST/ABOVE_WATERFALL -> REGION_BATTLE_FRONTIER_OUTSIDE_EAST/MAIN"), - lambda state: state.has("Wailmer Pail", world.player) - ) - set_rule( - get_entrance("REGION_BATTLE_FRONTIER_OUTSIDE_EAST/WATER -> REGION_BATTLE_FRONTIER_OUTSIDE_EAST/ABOVE_WATERFALL"), - hm_rules["HM07 Waterfall"] - ) + entrance_rules["REGION_BATTLE_FRONTIER_OUTSIDE_WEST/DOCK -> REGION_SS_TIDAL_CORRIDOR/MAIN"] = Has("S.S. Ticket") + entrance_rules["REGION_BATTLE_FRONTIER_OUTSIDE_WEST/CAVE_ENTRANCE -> REGION_BATTLE_FRONTIER_OUTSIDE_WEST/WATER"] = hm_rules["HM03 Surf"] + entrance_rules["REGION_BATTLE_FRONTIER_OUTSIDE_EAST/MAIN -> REGION_BATTLE_FRONTIER_OUTSIDE_EAST/ABOVE_WATERFALL"] = Has("Wailmer Pail") & hm_rules["HM03 Surf"] + entrance_rules["REGION_BATTLE_FRONTIER_OUTSIDE_EAST/ABOVE_WATERFALL -> REGION_BATTLE_FRONTIER_OUTSIDE_EAST/MAIN"] = Has("Wailmer Pail") + entrance_rules["REGION_BATTLE_FRONTIER_OUTSIDE_EAST/WATER -> REGION_BATTLE_FRONTIER_OUTSIDE_EAST/ABOVE_WATERFALL"] = hm_rules["HM07 Waterfall"] # Pokedex Rewards if world.options.dexsanity: @@ -1551,183 +637,100 @@ def set_rules(world: "PokemonEmeraldWorld") -> None: if species.species_id in world.blacklisted_wilds or species.species_id not in world.allowed_dexsanity_species: continue - set_rule( - get_location(f"Pokedex - {species.label}"), - lambda state, species_name=species.name: state.has(f"CATCH_{species_name}", world.player) - ) + location_rules[f"Pokedex - {species.label}"] = Has(f"CATCH_{species.name}") # Legendary hunt prevents Latios from being a wild spawn so the roamer # can be tracked, and also guarantees that the roamer is a Latios. if world.options.goal == Goal.option_legendary_hunt and \ data.constants["SPECIES_LATIOS"] in world.allowed_dexsanity_species: - set_rule( - get_location(f"Pokedex - Latios"), - lambda state: state.has("EVENT_ENCOUNTER_LATIOS", world.player) - ) + location_rules[f"Pokedex - Latios"] = Has("EVENT_ENCOUNTER_LATIOS") # Overworld Items if world.options.overworld_items: # Route 117 - set_rule( - get_location("ITEM_ROUTE_117_REVIVE"), - hm_rules["HM01 Cut"] - ) + location_rules["ITEM_ROUTE_117_REVIVE"] = hm_rules["HM01 Cut"] # Route 114 - set_rule( - get_location("ITEM_ROUTE_114_PROTEIN"), - hm_rules["HM06 Rock Smash"] - ) + location_rules["ITEM_ROUTE_114_PROTEIN"] = hm_rules["HM06 Rock Smash"] # Victory Road - set_rule( - get_location("ITEM_VICTORY_ROAD_B1F_FULL_RESTORE"), - lambda state: hm_rules["HM06 Rock Smash"](state) and hm_rules["HM04 Strength"](state) - ) + location_rules["ITEM_VICTORY_ROAD_B1F_FULL_RESTORE"] = hm_rules["HM06 Rock Smash"] & hm_rules["HM04 Strength"] # Hidden Items if world.options.hidden_items: # Route 120 - set_rule( - get_location("HIDDEN_ITEM_ROUTE_120_RARE_CANDY_1"), - hm_rules["HM01 Cut"] - ) + location_rules["HIDDEN_ITEM_ROUTE_120_RARE_CANDY_1"] = hm_rules["HM01 Cut"] # Route 121 - set_rule( - get_location("HIDDEN_ITEM_ROUTE_121_NUGGET"), - hm_rules["HM01 Cut"] - ) + location_rules["HIDDEN_ITEM_ROUTE_121_NUGGET"] = hm_rules["HM01 Cut"] # NPC Gifts if world.options.npc_gifts: # Littleroot Town - set_rule( - get_location("NPC_GIFT_RECEIVED_AMULET_COIN"), - lambda state: state.has("EVENT_TALK_TO_MR_STONE", world.player) and state.has("Balance Badge", world.player) - ) + location_rules["NPC_GIFT_RECEIVED_AMULET_COIN"] = HasAll("EVENT_TALK_TO_MR_STONE", "Balance Badge") # Route 104 - set_rule( - get_location("NPC_GIFT_RECEIVED_WHITE_HERB"), - lambda state: state.has("Dynamo Badge", world.player) and state.has("EVENT_MEET_FLOWER_SHOP_OWNER", world.player) - ) + location_rules["NPC_GIFT_RECEIVED_WHITE_HERB"] = HasAll("Dynamo Badge", "EVENT_MEET_FLOWER_SHOP_OWNER") # Devon Corp - set_rule( - get_location("NPC_GIFT_RECEIVED_EXP_SHARE"), - lambda state: state.has("EVENT_DELIVER_LETTER", world.player) - ) + location_rules["NPC_GIFT_RECEIVED_EXP_SHARE"] = Has("EVENT_DELIVER_LETTER") # Route 116 - set_rule( - get_location("NPC_GIFT_RECEIVED_REPEAT_BALL"), - lambda state: state.has("EVENT_RESCUE_CAPT_STERN", world.player) - ) + location_rules["NPC_GIFT_RECEIVED_REPEAT_BALL"] = Has("EVENT_RESCUE_CAPT_STERN") # Dewford Town - set_rule( - get_location("NPC_GIFT_RECEIVED_TM_SLUDGE_BOMB"), - lambda state: state.has("EVENT_DEFEAT_NORMAN", world.player) - ) + location_rules["NPC_GIFT_RECEIVED_TM_SLUDGE_BOMB"] = Has("EVENT_DEFEAT_NORMAN") # Slateport City - set_rule( - get_location("NPC_GIFT_RECEIVED_DEEP_SEA_TOOTH"), - lambda state: state.has("EVENT_AQUA_STEALS_SUBMARINE", world.player) - and state.has("Scanner", world.player) - and state.has("Mind Badge", world.player) + location_rules["NPC_GIFT_RECEIVED_DEEP_SEA_TOOTH"] = ( + HasAll("EVENT_AQUA_STEALS_SUBMARINE", "Scanner", "Mind Badge") ) - set_rule( - get_location("NPC_GIFT_RECEIVED_DEEP_SEA_SCALE"), - lambda state: state.has("EVENT_AQUA_STEALS_SUBMARINE", world.player) - and state.has("Scanner", world.player) - and state.has("Mind Badge", world.player) + location_rules["NPC_GIFT_RECEIVED_DEEP_SEA_SCALE"] = ( + HasAll("EVENT_AQUA_STEALS_SUBMARINE", "Scanner", "Mind Badge") ) # Mauville City - set_rule( - get_location("NPC_GIFT_GOT_TM_THUNDERBOLT_FROM_WATTSON"), - lambda state: state.has("EVENT_DEFEAT_NORMAN", world.player) and state.has("EVENT_TURN_OFF_GENERATOR", world.player) + location_rules["NPC_GIFT_GOT_TM_THUNDERBOLT_FROM_WATTSON"] = ( + HasAll("EVENT_DEFEAT_NORMAN", "EVENT_TURN_OFF_GENERATOR") ) # Fallarbor Town - set_rule( - get_location("NPC_GIFT_RECEIVED_TM_RETURN"), - lambda state: state.has("EVENT_RECOVER_METEORITE", world.player) and state.has("Meteorite", world.player) - ) + location_rules["NPC_GIFT_RECEIVED_TM_RETURN"] = HasAll("EVENT_RECOVER_METEORITE", "Meteorite") # Fortree City - set_rule( - get_location("NPC_GIFT_RECEIVED_MENTAL_HERB"), - lambda state: state.has("EVENT_WINGULL_QUEST_2", world.player) - ) + location_rules["NPC_GIFT_RECEIVED_MENTAL_HERB"] = Has("EVENT_WINGULL_QUEST_2") # Add Itemfinder requirement to hidden items if world.options.require_itemfinder: for location in world.multiworld.get_locations(world.player): assert isinstance(location, PokemonEmeraldLocation) if location.key is not None and data.locations[location.key].category == LocationCategory.HIDDEN_ITEM: - add_rule( - location, - lambda state: state.has("Itemfinder", world.player) - ) + location_rules[location.key] &= Has("Itemfinder") # Add Flash requirements to dark caves # Granite Cave if world.options.require_flash in [DarkCavesRequireFlash.option_only_granite_cave, DarkCavesRequireFlash.option_both]: - add_rule( - get_entrance("MAP_GRANITE_CAVE_1F:2/MAP_GRANITE_CAVE_B1F:1"), - hm_rules["HM05 Flash"] - ) - add_rule( - get_entrance("MAP_GRANITE_CAVE_B1F:3/MAP_GRANITE_CAVE_B2F:1"), - hm_rules["HM05 Flash"] - ) + entrance_rules["MAP_GRANITE_CAVE_1F:2/MAP_GRANITE_CAVE_B1F:1"] &= hm_rules["HM05 Flash"] + entrance_rules["MAP_GRANITE_CAVE_B1F:3/MAP_GRANITE_CAVE_B2F:1"] &= hm_rules["HM05 Flash"] # Victory Road if world.options.require_flash in [DarkCavesRequireFlash.option_only_victory_road, DarkCavesRequireFlash.option_both]: - add_rule( - get_entrance("MAP_VICTORY_ROAD_1F:2/MAP_VICTORY_ROAD_B1F:5"), - hm_rules["HM05 Flash"] - ) - add_rule( - get_entrance("MAP_VICTORY_ROAD_1F:4/MAP_VICTORY_ROAD_B1F:4"), - hm_rules["HM05 Flash"] - ) - add_rule( - get_entrance("MAP_VICTORY_ROAD_1F:3/MAP_VICTORY_ROAD_B1F:2"), - hm_rules["HM05 Flash"] - ) - add_rule( - get_entrance("MAP_VICTORY_ROAD_B1F:3/MAP_VICTORY_ROAD_B2F:1"), - hm_rules["HM05 Flash"] - ) - add_rule( - get_entrance("MAP_VICTORY_ROAD_B1F:1/MAP_VICTORY_ROAD_B2F:2"), - hm_rules["HM05 Flash"] - ) - add_rule( - get_entrance("MAP_VICTORY_ROAD_B1F:6/MAP_VICTORY_ROAD_B2F:3"), - hm_rules["HM05 Flash"] - ) - add_rule( - get_entrance("MAP_VICTORY_ROAD_B1F:0/MAP_VICTORY_ROAD_B2F:0"), - hm_rules["HM05 Flash"] - ) - add_rule( - get_entrance("MAP_VICTORY_ROAD_B2F:3/MAP_VICTORY_ROAD_B1F:6"), - hm_rules["HM05 Flash"] - ) - add_rule( - get_entrance("MAP_VICTORY_ROAD_B2F:2/MAP_VICTORY_ROAD_B1F:1"), - hm_rules["HM05 Flash"] - ) - add_rule( - get_entrance("MAP_VICTORY_ROAD_B2F:0/MAP_VICTORY_ROAD_B1F:0"), - hm_rules["HM05 Flash"] - ) - add_rule( - get_entrance("MAP_VICTORY_ROAD_B2F:1/MAP_VICTORY_ROAD_B1F:3"), - hm_rules["HM05 Flash"] - ) + entrance_rules["MAP_VICTORY_ROAD_1F:2/MAP_VICTORY_ROAD_B1F:5"] &= hm_rules["HM05 Flash"] + entrance_rules["MAP_VICTORY_ROAD_1F:4/MAP_VICTORY_ROAD_B1F:4"] &= hm_rules["HM05 Flash"] + entrance_rules["MAP_VICTORY_ROAD_1F:3/MAP_VICTORY_ROAD_B1F:2"] &= hm_rules["HM05 Flash"] + entrance_rules["MAP_VICTORY_ROAD_B1F:3/MAP_VICTORY_ROAD_B2F:1"] &= hm_rules["HM05 Flash"] + entrance_rules["MAP_VICTORY_ROAD_B1F:1/MAP_VICTORY_ROAD_B2F:2"] &= hm_rules["HM05 Flash"] + entrance_rules["MAP_VICTORY_ROAD_B1F:6/MAP_VICTORY_ROAD_B2F:3"] &= hm_rules["HM05 Flash"] + entrance_rules["MAP_VICTORY_ROAD_B1F:0/MAP_VICTORY_ROAD_B2F:0"] &= hm_rules["HM05 Flash"] + entrance_rules["MAP_VICTORY_ROAD_B2F:3/MAP_VICTORY_ROAD_B1F:6"] &= hm_rules["HM05 Flash"] + entrance_rules["MAP_VICTORY_ROAD_B2F:2/MAP_VICTORY_ROAD_B1F:1"] &= hm_rules["HM05 Flash"] + entrance_rules["MAP_VICTORY_ROAD_B2F:0/MAP_VICTORY_ROAD_B1F:0"] &= hm_rules["HM05 Flash"] + entrance_rules["MAP_VICTORY_ROAD_B2F:1/MAP_VICTORY_ROAD_B1F:3"] &= hm_rules["HM05 Flash"] + + for name, rule in entrance_rules.items(): + world.set_rule(world.get_entrance(name), rule) + + for name, rule in location_rules.items(): + if name in data.locations: + name = data.locations[name].label + world.set_rule(world.get_location(name), rule) diff --git a/worlds/pokemon_emerald/util.py b/worlds/pokemon_emerald/util.py index 3215113075..268ba9bf5f 100644 --- a/worlds/pokemon_emerald/util.py +++ b/worlds/pokemon_emerald/util.py @@ -100,7 +100,7 @@ def get_encounter_type_label(encounter_type: EncounterType, slot: int) -> str: 8: "Super Rod", 9: "Super Rod", }[slot] - + return { EncounterType.LAND: 'Land', EncounterType.WATER: 'Water',