diff --git a/BaseClasses.py b/BaseClasses.py index 5a1c25c0..b00c3afc 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -104,6 +104,7 @@ class World(object): self.__dict__.setdefault(attr, {})[player] = val set_player_attr('_region_cache', {}) set_player_attr('player_names', []) + set_player_attr('owswaps', [[],[],[]]) set_player_attr('remote_items', False) set_player_attr('required_medallions', ['Ether', 'Quake']) set_player_attr('swamp_patch_required', False) @@ -111,7 +112,7 @@ class World(object): set_player_attr('ganon_at_pyramid', True) set_player_attr('ganonstower_vanilla', True) set_player_attr('sewer_light_cone', self.mode[player] == 'standard') - set_player_attr('fix_trock_doors', self.shuffle[player] != 'vanilla' or self.mode[player] == 'inverted') + set_player_attr('fix_trock_doors', self.shuffle[player] != 'vanilla' or ((self.mode[player] == 'inverted') != (0x05 in self.owswaps[player][0] and self.owMixed[player]))) set_player_attr('fix_skullwoods_exit', self.shuffle[player] not in ['vanilla', 'simple', 'restricted', 'dungeonssimple'] or self.doorShuffle[player] not in ['vanilla']) set_player_attr('fix_palaceofdarkness_exit', self.shuffle[player] not in ['vanilla', 'simple', 'restricted', 'dungeonssimple']) set_player_attr('fix_trock_exit', self.shuffle[player] not in ['vanilla', 'simple', 'restricted', 'dungeonssimple']) @@ -149,7 +150,6 @@ class World(object): set_player_attr('mixed_travel', 'prevent') set_player_attr('standardize_palettes', 'standardize') set_player_attr('force_fix', {'gt': False, 'sw': False, 'pod': False, 'tr': False}) - set_player_attr('owswaps', [[],[],[]]) set_player_attr('prizes', {'pull': [0, 0, 0], 'crab': [0, 0], 'stun': 0, 'fish': 0}) set_player_attr('exp_cache', defaultdict(dict)) @@ -3049,7 +3049,6 @@ class Settings(object): args.shufflepots[p] = True if settings[7] & 0x4 else False -@unique class KeyRuleType(FastEnum): WorstCase = 0 AllowSmall = 1 diff --git a/DoorShuffle.py b/DoorShuffle.py index 0f7ee939..94d7ff32 100644 --- a/DoorShuffle.py +++ b/DoorShuffle.py @@ -89,7 +89,7 @@ def link_doors_main(world, player): if world.mode[player] == 'standard': world.get_portal('Sanctuary', player).destination = True world.get_portal('Desert East', player).destination = True - if world.mode[player] == 'inverted': + if (world.mode[player] == 'inverted') != (0x30 in world.owswaps[player][0] and world.owMixed[player]): world.get_portal('Desert West', player).destination = True else: world.get_portal('Skull 2 West', player).destination = True @@ -1838,7 +1838,9 @@ def find_accessible_entrances(world, player, builder): elif world.mode[player] != 'inverted': start_regions = ['Links House', 'Sanctuary'] else: - start_regions = ['Links House', 'Dark Sanctuary Hint', 'Hyrule Castle Ledge'] + start_regions = ['Links House', 'Dark Sanctuary Hint'] + if (world.mode[player] == 'inverted') != (0x1b in world.owswaps[player][0] and world.owMixed[player]): + start_regions.append('Hyrule Castle Ledge') regs = convert_regions(start_regions, world, player) visited_regions = set() visited_entrances = [] @@ -1853,7 +1855,7 @@ def find_accessible_entrances(world, player, builder): while len(queue) > 0: next_region = queue.popleft() visited_regions.add(next_region) - if world.mode[player] == 'inverted' and next_region.name == 'Tower Agahnim 1': + if (world.mode[player] == 'inverted') != (0x1b in world.owswaps[player][0] and world.owMixed[player]) and next_region.name == 'Tower Agahnim 1': connect = world.get_region('Hyrule Castle Ledge', player) if connect not in queue and connect not in visited_regions: queue.append(connect) diff --git a/EntranceShuffle.py b/EntranceShuffle.py index afd46fff..8fda03fc 100644 --- a/EntranceShuffle.py +++ b/EntranceShuffle.py @@ -1230,6 +1230,7 @@ def simple_shuffle_dungeons(world, player): dungeon_entrances.append('Ganons Tower') dungeon_exits.append('Ganons Tower Exit') else: + # TODO: Should we be ignoring world.shuffle_ganon?? dungeon_entrances.append('Ganons Tower') dungeon_exits.append('Agahnims Tower Exit') diff --git a/Fill.py b/Fill.py index 43acd0e2..015760ca 100644 --- a/Fill.py +++ b/Fill.py @@ -697,7 +697,7 @@ def balance_money_progression(world): sphere_locations = get_sphere_locations(state, unchecked_locations) checked_locations = [] for player in range(1, world.players+1): - kiki_payable = state.prog_items[('Moon Pearl', player)] > 0 or world.mode[player] == 'inverted' + kiki_payable = state.prog_items[('Moon Pearl', player)] > 0 or (world.mode[player] == 'inverted') != (0x1e in world.owswaps[player][0] and world.owMixed[player]) if kiki_payable and world.get_region('Palace of Darkness Area', player) in state.reachable_regions[player]: if not kiki_paid[player]: kiki_check[player] = True diff --git a/ItemList.py b/ItemList.py index aac8a010..9e8b3245 100644 --- a/ItemList.py +++ b/ItemList.py @@ -398,6 +398,7 @@ def set_up_take_anys(world, player): if world.mode[player] == 'inverted': if 'Dark Sanctuary Hint' in take_any_locations: take_any_locations.remove('Dark Sanctuary Hint') + if (world.mode[player] == 'inverted') != (0x29 in world.owswaps[player][0] and world.owMixed[player]): if 'Archery Game' in take_any_locations: take_any_locations.remove('Archery Game') diff --git a/KeyDoorShuffle.py b/KeyDoorShuffle.py index 5a59180d..860e1d93 100644 --- a/KeyDoorShuffle.py +++ b/KeyDoorShuffle.py @@ -1898,7 +1898,7 @@ def val_mire(key_logic, world, player): def val_turtle(key_logic, world, player): # todo: check vanilla key logic when TR back doors are accessible - if world.shuffle[player] == 'vanilla' and world.mode[player] != 'inverted' and world.logic[player] in ('noglitches', 'minorglitches'): + if world.shuffle[player] == 'vanilla' and (world.mode[player] == 'inverted') == (0x05 in world.owswaps[player][0] and world.owMixed[player]) and world.logic[player] in ('noglitches', 'minorglitches'): val_rule(key_logic.door_rules['TR Hub NW'], 1) val_rule(key_logic.door_rules['TR Pokey 1 NW'], 2) val_rule(key_logic.door_rules['TR Chain Chomps Down Stairs'], 3) diff --git a/Regions.py b/Regions.py index a7907180..d2d977d5 100644 --- a/Regions.py +++ b/Regions.py @@ -1116,7 +1116,7 @@ def mark_dark_world_regions(world, player): def create_shops(world, player): world.shops[player] = [] for region_name, (room_id, type, shopkeeper, custom, locked, inventory, sram) in shop_table.items(): - if world.mode[player] == 'inverted' and region_name == 'Dark Lake Hylia Shop': + if (world.mode[player] == 'inverted') != (0x35 in world.owswaps[player][0] and world.owMixed[player]) and region_name == 'Dark Lake Hylia Shop': locked = True inventory = [('Blue Potion', 160), ('Blue Shield', 50), ('Bombs (10)', 50)] region = world.get_region(region_name, player) diff --git a/Rom.py b/Rom.py index f5435f31..67077dc6 100644 --- a/Rom.py +++ b/Rom.py @@ -2471,6 +2471,7 @@ def set_inverted_mode(world, player, rom, inverted_buffer): if world.doorShuffle[player] == 'vanilla' or world.intensity[player] < 3: write_int16(rom, 0x15AEE + 2*0x38, 0x00E0) write_int16(rom, 0x15AEE + 2*0x25, 0x000C) + if (world.mode[player] == 'inverted') != (0x03 in world.owswaps[player][0] and world.owMixed[player]): if world.shuffle[player] in ['vanilla', 'dungeonsfull', 'dungeonssimple']: rom.write_bytes(snes_to_pc(0x308350), [0x00, 0x00, 0x01]) # mountain cave starts on OW diff --git a/Rules.py b/Rules.py index 0404ab8f..c3842593 100644 --- a/Rules.py +++ b/Rules.py @@ -1491,8 +1491,8 @@ def swordless_rules(world, player): set_rule(world.get_entrance('Misery Mire', player), lambda state: state.has_misery_mire_medallion(player)) # sword not required to use medallion for opening in swordless (!) set_rule(world.get_entrance('Turtle Rock', player), lambda state: state.has_turtle_rock_medallion(player) and state.can_reach('Turtle Rock Ledge', 'Region', player)) # sword not required to use medallion for opening in swordless (!) - add_bunny_rule(world.get_entrance('Turtle Rock', player), player) add_bunny_rule(world.get_entrance('Misery Mire', player), player) + add_bunny_rule(world.get_entrance('Turtle Rock', player), player) std_kill_rooms = { 'Hyrule Dungeon Armory Main': ['Hyrule Dungeon Armory S', 'Hyrule Dungeon Armory ES'], # One green guard