From cf2e001447df40b479aa17b9f8ea00ef6401016e Mon Sep 17 00:00:00 2001 From: aerinon Date: Thu, 17 Aug 2023 13:42:45 -0600 Subject: [PATCH 01/16] Fix for TFH --- source/item/FillUtil.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/item/FillUtil.py b/source/item/FillUtil.py index 6a055584..595e86c9 100644 --- a/source/item/FillUtil.py +++ b/source/item/FillUtil.py @@ -357,7 +357,7 @@ def determine_major_items(world, player): major_item_set.add('Single Arrow') if world.keyshuffle[player] == 'universal': major_item_set.add('Small Key (Universal)') - if world.goal == 'triforcehunt': + if world.goal[player] == 'triforcehunt': major_item_set.add('Triforce Piece') if world.bombbag[player]: major_item_set.add('Bomb Upgrade (+10)') From 2b3c635680f935d1731cfdd38f8f93024c2a57af Mon Sep 17 00:00:00 2001 From: codemann8 Date: Sun, 24 Sep 2023 01:17:55 -0500 Subject: [PATCH 02/16] Fixed issue with limit_crossed affecting other modes outside Unrestricted Crossed OWR --- OverworldShuffle.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/OverworldShuffle.py b/OverworldShuffle.py index a4e54cca..354e6941 100644 --- a/OverworldShuffle.py +++ b/OverworldShuffle.py @@ -225,7 +225,8 @@ def link_overworld(world, player): edge = world.get_owedge(edgename, player) force_noncrossed.add(edge.name) if 'limit_crossed' in custom_crossed: - limited_crossed = custom_crossed['limit_crossed'] + if world.owCrossed[player] == 'unrestricted': + limited_crossed = custom_crossed['limit_crossed'] if 'undefined_chance' in custom_crossed: undefined_chance = custom_crossed['undefined_chance'] @@ -1266,6 +1267,7 @@ def adjust_edge_groups(world, trimmed_groups, edges_to_swap, player): if world.customizer: custom_crossed = world.customizer.get_owcrossed() limited_crossed = custom_crossed and (player in custom_crossed) and ('limit_crossed' in custom_crossed[player]) + limited_crossed = limited_crossed and world.owCrossed[player] == 'unrestricted' custom_edge_groups = world.customizer.get_owedges() if custom_edge_groups and player in custom_edge_groups: custom_edge_groups = custom_edge_groups[player] From 4f5779143dc19d03747a2f101153823bcfb383a8 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Sun, 24 Sep 2023 01:19:56 -0500 Subject: [PATCH 03/16] Restructured forced crossed/noncrossed to share code --- OverworldShuffle.py | 124 +++++++++++++++++--------------------------- 1 file changed, 49 insertions(+), 75 deletions(-) diff --git a/OverworldShuffle.py b/OverworldShuffle.py index 354e6941..2caf6725 100644 --- a/OverworldShuffle.py +++ b/OverworldShuffle.py @@ -444,6 +444,23 @@ def link_overworld(world, player): connected_edge_cache = connected_edges.copy() groups_cache = copy.deepcopy(groups) while not valid_layout and tries > 0: + def remove_connected(forward_sets, back_sets): + deleted_edges = [] + def remove_from_sets(sets): + s = 0 + while s < len(sets): + if sets[s][0] in connected_edges: + deleted_edges.extend(sets[s]) + del sets[s] + continue + s += 1 + remove_from_sets(forward_sets) + remove_from_sets(back_sets) + if len(forward_sets) != len(back_sets): + x=', '.join(deleted_edges) + x=0 + assert len(forward_sets) == len(back_sets), "OW edge pool is uneven due to prior connections: " + ', '.join(deleted_edges) + def connect_set(forward_set, back_set, connected_edges): if forward_set is not None and back_set is not None: assert len(forward_set) == len(back_set) @@ -468,32 +485,10 @@ def link_overworld(world, player): for key in groupKeys: (mode, wrld, dir, terrain, parallel, count, _) = key (forward_edge_sets, back_edge_sets) = groups[key] - def remove_connected(): - deleted_edges = [] - s = 0 - while s < len(forward_edge_sets): - forward_set = forward_edge_sets[s] - if forward_set[0] in connected_edges: - deleted_edges.extend(forward_edge_sets[s]) - del forward_edge_sets[s] - continue - s += 1 - s = 0 - while s < len(back_edge_sets): - back_set = back_edge_sets[s] - if back_set[0] in connected_edges: - deleted_edges.extend(back_edge_sets[s]) - del back_edge_sets[s] - continue - s += 1 - if len(forward_edge_sets) != len(back_edge_sets): - x=', '.join(deleted_edges) - x=0 - assert len(forward_edge_sets) == len(back_edge_sets), "OW edge pool is uneven due to prior connections: " + ', '.join(deleted_edges) - remove_connected() random.shuffle(forward_edge_sets) random.shuffle(back_edge_sets) + if wrld is None and len(force_crossed) + len(force_noncrossed) > 0: # divide forward/back sets into LW/DW forward_lw_sets, forward_dw_sets = [], [] @@ -501,24 +496,20 @@ def link_overworld(world, player): forward_parallel_lw_sets, forward_parallel_dw_sets = [], [] back_parallel_lw_sets, back_parallel_dw_sets = [], [] + def add_edgeset_to_worldsets(edge_set, sets, parallel_sets): + sets.append(edge_set) + if parallel == IsParallel.Yes: + parallel_sets.append([parallel_links_new[e] for e in edge_set]) for edge_set in forward_edge_sets: if world.get_owedge(edge_set[0], player).is_lw(world): - forward_lw_sets.append(edge_set) - if parallel == IsParallel.Yes: - forward_parallel_lw_sets.append([parallel_links_new[e] for e in edge_set]) + add_edgeset_to_worldsets(edge_set, forward_lw_sets, forward_parallel_lw_sets) else: - forward_dw_sets.append(edge_set) - if parallel == IsParallel.Yes: - forward_parallel_dw_sets.append([parallel_links_new[e] for e in edge_set]) + add_edgeset_to_worldsets(edge_set, forward_dw_sets, forward_parallel_dw_sets) for edge_set in back_edge_sets: if world.get_owedge(edge_set[0], player).is_lw(world): - back_lw_sets.append(edge_set) - if parallel == IsParallel.Yes: - back_parallel_lw_sets.append([parallel_links_new[e] for e in edge_set]) + add_edgeset_to_worldsets(edge_set, back_lw_sets, back_parallel_lw_sets) else: - back_dw_sets.append(edge_set) - if parallel == IsParallel.Yes: - back_parallel_dw_sets.append([parallel_links_new[e] for e in edge_set]) + add_edgeset_to_worldsets(edge_set, back_dw_sets, back_parallel_dw_sets) crossed_sets = [] noncrossed_sets = [] @@ -527,7 +518,7 @@ def link_overworld(world, player): affected_edges = set(sets[i]+(parallel_sets[i] if parallel == IsParallel.Yes else [])) if sets[i] not in crossed_sets and len(set.intersection(set(force_crossed), affected_edges)) > 0: crossed_sets.append(sets[i]) - if sets not in noncrossed_sets and len(set.intersection(set(force_noncrossed), affected_edges)) > 0: + if sets[i] not in noncrossed_sets and len(set.intersection(set(force_noncrossed), affected_edges)) > 0: noncrossed_sets.append(sets[i]) if sets[i] in crossed_sets and sets[i] in noncrossed_sets: raise GenerationException('Conflict in force crossed/non-crossed definition') @@ -537,50 +528,33 @@ def link_overworld(world, player): add_to_crossed_sets(back_dw_sets, back_parallel_dw_sets) # random connect forced crossed/noncrossed - c = 0 - while c < len(noncrossed_sets): - if noncrossed_sets[c] in forward_edge_sets: - forward_set = noncrossed_sets[c] - if forward_set in forward_lw_sets: - back_set = next(s for s in back_lw_sets if s in back_edge_sets and s not in crossed_sets) + def connect_forced(forced_sets, is_crossed, opposite_sets=[]): + c = 0 + while c < len(forced_sets): + if forced_sets[c] in forward_edge_sets: + forward_set = forced_sets[c] + if (forward_set in forward_lw_sets) != is_crossed: + back_set = next(s for s in back_lw_sets if s in back_edge_sets and s not in opposite_sets) + else: + back_set = next(s for s in back_dw_sets if s in back_edge_sets and s not in opposite_sets) + elif forced_sets[c] in back_edge_sets: + back_set = forced_sets[c] + if (back_set in back_lw_sets) != is_crossed: + forward_set = next(s for s in forward_lw_sets if s in forward_edge_sets and s not in opposite_sets) + else: + forward_set = next(s for s in forward_dw_sets if s in forward_edge_sets and s not in opposite_sets) else: - back_set = next(s for s in back_dw_sets if s in back_edge_sets and s not in crossed_sets) - elif noncrossed_sets[c] in back_edge_sets: - back_set = noncrossed_sets[c] - if back_set in back_lw_sets: - forward_set = next(s for s in forward_lw_sets if s in forward_edge_sets and s not in crossed_sets) - else: - forward_set = next(s for s in forward_dw_sets if s in forward_edge_sets and s not in crossed_sets) - else: + c = c + 1 + continue + connect_set(forward_set, back_set, connected_edges) + remove_connected(forward_edge_sets, back_edge_sets) c = c + 1 - continue - connect_set(forward_set, back_set, connected_edges) - remove_connected() - c = c + 1 - c = 0 - while c < len(crossed_sets): - if crossed_sets[c] in forward_edge_sets: - forward_set = crossed_sets[c] - if forward_set in forward_lw_sets: - back_set = next(s for s in back_dw_sets if s in back_edge_sets) - else: - back_set = next(s for s in back_lw_sets if s in back_edge_sets) - elif crossed_sets[c] in back_edge_sets: - back_set = crossed_sets[c] - if back_set in back_lw_sets: - forward_set = next(s for s in forward_dw_sets if s in forward_edge_sets) - else: - forward_set = next(s for s in forward_lw_sets if s in forward_edge_sets) - else: - c = c + 1 - continue - connect_set(forward_set, back_set, connected_edges) - remove_connected() - c = c + 1 + connect_forced(noncrossed_sets, False, crossed_sets) + connect_forced(crossed_sets, True) while len(forward_edge_sets) > 0 and len(back_edge_sets) > 0: connect_set(forward_edge_sets[0], back_edge_sets[0], connected_edges) - remove_connected() + remove_connected(forward_edge_sets, back_edge_sets) assert len(connected_edges) == len(default_connections) * 2, connected_edges world.owsectors[player] = build_sectors(world, player) From 9c04140134f797a38a3abc7f33e127c596b5870d Mon Sep 17 00:00:00 2001 From: codemann8 Date: Sun, 24 Sep 2023 01:21:13 -0500 Subject: [PATCH 04/16] Remove some commented out code --- OverworldShuffle.py | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/OverworldShuffle.py b/OverworldShuffle.py index 2caf6725..ca31e3c3 100644 --- a/OverworldShuffle.py +++ b/OverworldShuffle.py @@ -1459,18 +1459,6 @@ def build_sectors(world, player): else: sectors2.append(explored_regions) sectors[s] = sectors2 - - #TODO: Keep largest LW sector for Links House consideration, keep sector containing WDM for Old Man consideration - # sector_entrances = list() - # for sector in sectors: - # entrances = list() - # for s2 in sector: - # for region_name in s2: - # region = world.get_region(region_name, player) - # for exit in region.exits: - # if exit.spot_type == 'Entrance' and exit.name in entrance_pool: - # entrances.append(exit.name) - # sector_entrances.append(entrances) return sectors From 32c55cc0a5c9e70c32b7774df1ad685718ac0399 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Mon, 25 Sep 2023 19:19:03 -0500 Subject: [PATCH 05/16] Converting flute data to owid-based rather than by owslot --- Rom.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rom.py b/Rom.py index 27a1a38f..8837e1de 100644 --- a/Rom.py +++ b/Rom.py @@ -694,7 +694,7 @@ def patch_rom(world, rom, player, team, enemized, is_mystery=False): offset = 0 data = flute_data[owid] - if world.is_tile_swapped(data[1], player): + if world.is_tile_swapped(owid, player): offset = 0x40 write_int16(rom, snes_to_pc(0x02E849 + (o * 2)), owid + offset) # owid From d8b4419b041f25f1960bc37ee6fddc02850d60fa Mon Sep 17 00:00:00 2001 From: codemann8 Date: Mon, 25 Sep 2023 19:19:03 -0500 Subject: [PATCH 06/16] Converting flute data to owid-based rather than by owslot --- OverworldShuffle.py | 2 +- Rom.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/OverworldShuffle.py b/OverworldShuffle.py index ca31e3c3..20ad2d9e 100644 --- a/OverworldShuffle.py +++ b/OverworldShuffle.py @@ -2523,7 +2523,7 @@ isolated_regions = [ ] flute_data = { - #Slot LW Region DW Region OWID VRAM BG Y BG X Link Y Link X Cam Y Cam X Unk1 Unk2 IconY IconX AltY AltX AltVRAM AltBGY AltBGX AltCamY AltCamX AltUnk1 AltUnk2 AltIconY AltIconX + #OWID LW Region DW Region Slot VRAM BG Y BG X Link Y Link X Cam Y Cam X Unk1 Unk2 IconY IconX AltY AltX AltVRAM AltBGY AltBGX AltCamY AltCamX AltUnk1 AltUnk2 AltIconY AltIconX 0x00: (['Lost Woods East Area', 'Skull Woods Forest'], 0x09, 0x1042, 0x022e, 0x0202, 0x0290, 0x0288, 0x029b, 0x028f, 0xfff2, 0x000e, 0x0290, 0x0288, 0x0290, 0x0290), 0x02: (['Lumberjack Area', 'Dark Lumberjack Area'], 0x02, 0x059c, 0x00d6, 0x04e6, 0x0138, 0x0558, 0x0143, 0x0563, 0xfffa, 0xfffa, 0x0138, 0x0550), 0x03: (['West Death Mountain (Bottom)', 'West Dark Death Mountain (Top)'], 0x0b, 0x1600, 0x02ca, 0x060e, 0x0328, 0x0678, 0x0337, 0x0683, 0xfff6, 0xfff2, 0x035b, 0x0680, 0x0118, 0x0860, 0x05c0, 0x00b8, 0x07ec, 0x0127, 0x086b, 0xfff8, 0x0004, 0x0148, 0x0850), diff --git a/Rom.py b/Rom.py index 27a1a38f..8837e1de 100644 --- a/Rom.py +++ b/Rom.py @@ -694,7 +694,7 @@ def patch_rom(world, rom, player, team, enemized, is_mystery=False): offset = 0 data = flute_data[owid] - if world.is_tile_swapped(data[1], player): + if world.is_tile_swapped(owid, player): offset = 0x40 write_int16(rom, snes_to_pc(0x02E849 + (o * 2)), owid + offset) # owid From 27ed92cfcb60108ff4b80c160c4d0d5c905a2abf Mon Sep 17 00:00:00 2001 From: codemann8 Date: Tue, 26 Sep 2023 13:03:18 -0500 Subject: [PATCH 07/16] Restructured forced crossed/noncrossed to share code --- OverworldShuffle.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OverworldShuffle.py b/OverworldShuffle.py index 20ad2d9e..76b2e1e9 100644 --- a/OverworldShuffle.py +++ b/OverworldShuffle.py @@ -485,7 +485,7 @@ def link_overworld(world, player): for key in groupKeys: (mode, wrld, dir, terrain, parallel, count, _) = key (forward_edge_sets, back_edge_sets) = groups[key] - remove_connected() + remove_connected(forward_edge_sets, back_edge_sets) random.shuffle(forward_edge_sets) random.shuffle(back_edge_sets) From e722a1129f3b704787d873d6540db89e6e6190de Mon Sep 17 00:00:00 2001 From: aerinon Date: Thu, 28 Sep 2023 10:31:02 -0600 Subject: [PATCH 08/16] Rule fix for zelda to throne room --- Rules.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Rules.py b/Rules.py index 0b390f3d..4140469c 100644 --- a/Rules.py +++ b/Rules.py @@ -1322,13 +1322,15 @@ def standard_rules(world, player): add_rule(ent, lambda state: standard_escape_rule(state)) set_rule(world.get_location('Zelda Pickup', player), lambda state: state.has('Big Key (Escape)', player)) - set_rule(world.get_entrance('Hyrule Castle Throne Room Tapestry', player), lambda state: state.has('Zelda Herself', player)) set_rule(world.get_entrance('Hyrule Castle Tapestry Backwards', player), lambda state: state.has('Zelda Herself', player)) def check_rule_list(state, r_list): return True if len(r_list) <= 0 else r_list[0](state) and check_rule_list(state, r_list[1:]) rule_list, debug_path = find_rules_for_zelda_delivery(world, player) - set_rule(world.get_location('Zelda Drop Off', player), lambda state: state.has('Zelda Herself', player) and check_rule_list(state, rule_list)) + set_rule(world.get_entrance('Hyrule Castle Throne Room Tapestry', player), + lambda state: state.has('Zelda Herself', player) and check_rule_list(state, rule_list)) + set_rule(world.get_location('Zelda Drop Off', player), + lambda state: state.has('Zelda Herself', player) and check_rule_list(state, rule_list)) for location in ['Mushroom', 'Bottle Merchant', 'Flute Spot', 'Sunken Treasure', 'Purple Chest']: add_rule(world.get_location(location, player), lambda state: state.has('Zelda Delivered', player)) From dc96c53a95bacde8b761307c77be4bc80268cbf1 Mon Sep 17 00:00:00 2001 From: aerinon Date: Mon, 21 Aug 2023 08:25:17 -0600 Subject: [PATCH 09/16] Fix for Ganonhunt and various algorithms --- source/item/FillUtil.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/item/FillUtil.py b/source/item/FillUtil.py index 595e86c9..8b5225b0 100644 --- a/source/item/FillUtil.py +++ b/source/item/FillUtil.py @@ -357,7 +357,7 @@ def determine_major_items(world, player): major_item_set.add('Single Arrow') if world.keyshuffle[player] == 'universal': major_item_set.add('Small Key (Universal)') - if world.goal[player] == 'triforcehunt': + if world.goal[player] in {'triforcehunt', 'ganonhunt'}: major_item_set.add('Triforce Piece') if world.bombbag[player]: major_item_set.add('Bomb Upgrade (+10)') From 329367e04a58a3dd2d0f2e8c32d2f4a1dfa7a1a0 Mon Sep 17 00:00:00 2001 From: aerinon Date: Thu, 14 Sep 2023 11:09:58 -0600 Subject: [PATCH 10/16] Account for vanilla BK doors in Stitcher --- source/dungeon/DungeonStitcher.py | 90 ++++++++++++++++++++++--------- 1 file changed, 64 insertions(+), 26 deletions(-) diff --git a/source/dungeon/DungeonStitcher.py b/source/dungeon/DungeonStitcher.py index 504fc03b..84139157 100644 --- a/source/dungeon/DungeonStitcher.py +++ b/source/dungeon/DungeonStitcher.py @@ -72,11 +72,13 @@ def generate_dungeon_find_proposal(builder, entrance_region_names, split_dungeon entrance_regions = [x for x in entrance_regions if x not in excluded.keys()] doors_to_connect, idx = {}, 0 all_regions = set() + bk_special = False for sector in builder.sectors: for door in sector.outstanding_doors: doors_to_connect[door.name] = door, idx idx += 1 all_regions.update(sector.regions) + bk_special |= check_for_special(sector.regions) finished = False # flag if standard and this is hyrule castle paths = determine_paths_for_dungeon(world, player, all_regions, name) @@ -95,9 +97,9 @@ def generate_dungeon_find_proposal(builder, entrance_region_names, split_dungeon if hash_code not in hash_code_set: hash_code_set.add(hash_code) explored_state = explore_proposal(name, entrance_regions, all_regions, proposed_map, doors_to_connect, - world, player) + bk_special, world, player) if check_valid(name, explored_state, proposed_map, doors_to_connect, all_regions, - paths, entrance_regions, world, player): + paths, entrance_regions, bk_special, world, player): finished = True else: proposed_map, hash_code = modify_proposal(proposed_map, explored_state, doors_to_connect, @@ -229,21 +231,24 @@ def modify_proposal(proposed_map, explored_state, doors_to_connect, hash_code_se return proposed_map, hash_code -def explore_proposal(name, entrance_regions, all_regions, proposed_map, valid_doors, world, player): +def explore_proposal(name, entrance_regions, all_regions, proposed_map, valid_doors, bk_special, world, player): start = ExplorationState(dungeon=name) + bk_relevant = (world.door_type_mode[player] == 'original' and not world.bigkeyshuffle[player]) or bk_special + start.big_key_special = bk_special original_state = extend_reachable_state_lenient(entrance_regions, start, proposed_map, - all_regions, valid_doors, world, player) + all_regions, valid_doors, bk_relevant, world, player) return original_state def check_valid(name, exploration_state, proposed_map, doors_to_connect, all_regions, - paths, entrance_regions, world, player): + paths, entrance_regions, bk_special, world, player): all_visited = set() all_visited.update(exploration_state.visited_blue) all_visited.update(exploration_state.visited_orange) if len(all_regions.difference(all_visited)) > 0: return False - if not valid_paths(name, paths, entrance_regions, doors_to_connect, all_regions, proposed_map, world, player): + if not valid_paths(name, paths, entrance_regions, doors_to_connect, all_regions, proposed_map, + bk_special, world, player): return False return True @@ -266,7 +271,7 @@ def check_for_special(regions): return False -def valid_paths(name, paths, entrance_regions, valid_doors, all_regions, proposed_map, world, player): +def valid_paths(name, paths, entrance_regions, valid_doors, all_regions, proposed_map, bk_special, world, player): for path in paths: if type(path) is tuple: target = path[1] @@ -278,12 +283,13 @@ def valid_paths(name, paths, entrance_regions, valid_doors, all_regions, propose else: target = path start_regions = entrance_regions - if not valid_path(name, start_regions, target, valid_doors, proposed_map, all_regions, world, player): + if not valid_path(name, start_regions, target, valid_doors, proposed_map, all_regions, + bk_special, world, player): return False return True -def valid_path(name, starting_regions, target, valid_doors, proposed_map, all_regions, world, player): +def valid_path(name, starting_regions, target, valid_doors, proposed_map, all_regions, bk_special, world, player): target_regions = set() if type(target) is not list: for region in all_regions: @@ -296,8 +302,10 @@ def valid_path(name, starting_regions, target, valid_doors, proposed_map, all_re target_regions.add(region) start = ExplorationState(dungeon=name) + bk_relevant = (world.door_type_mode[player] == 'original' and not world.bigkeyshuffle[player]) or bk_special + start.big_key_special = bk_special original_state = extend_reachable_state_lenient(starting_regions, start, proposed_map, all_regions, - valid_doors, world, player) + valid_doors, bk_relevant, world, player) for exp_door in original_state.unattached_doors: if not exp_door.door.blocked or exp_door.door.trapFlag != 0: @@ -531,7 +539,7 @@ class ExplorationState(object): self.crystal = exp_door.crystal return exp_door - def visit_region(self, region, key_region=None, key_checks=False, bk_flag=False): + def visit_region(self, region, key_region=None, key_checks=False, bk_relevant=False): if region.type != RegionType.Dungeon: self.crystal = CrystalBarrier.Orange if self.crystal == CrystalBarrier.Either: @@ -552,8 +560,14 @@ class ExplorationState(object): self.ttl_locations += 1 if location not in self.found_locations: self.found_locations.append(location) - if not bk_flag: - self.bk_found.add(location) + if bk_relevant: + if self.big_key_special: + if special_big_key_found(self): + self.bk_found.add(location) + self.re_add_big_key_doors() + else: + self.bk_found.add(location) + self.re_add_big_key_doors() if location.name in dungeon_events and location.name not in self.events: if self.flooded_key_check(location): self.perform_event(location.name, key_region) @@ -574,6 +588,14 @@ class ExplorationState(object): return True return False + def re_add_big_key_doors(self): + self.big_key_opened = True + queue = collections.deque(self.big_doors) + while len(queue) > 0: + exp_door = queue.popleft() + self.avail_doors.append(exp_door) + self.big_doors.remove(exp_door) + def perform_event(self, location_name, key_region): self.events.add(location_name) queue = collections.deque(self.event_doors) @@ -640,7 +662,7 @@ class ExplorationState(object): self.append_door_to_list(door, self.avail_doors, flag) # same as above but traps are ignored, and flag is not used - def add_all_doors_check_proposed_2(self, region, proposed_map, valid_doors, world, player): + def add_all_doors_check_proposed_2(self, region, proposed_map, valid_doors, bk_relevant, world, player): for door in get_doors(world, region, player): if door in proposed_map and door.name in valid_doors: self.visited_doors.add(door) @@ -654,14 +676,18 @@ class ExplorationState(object): other = self.find_door_in_list(door, self.unattached_doors) if self.crystal != other.crystal: other.crystal = CrystalBarrier.Either - elif door.req_event is not None and door.req_event not in self.events and not self.in_door_list(door, - self.event_doors): + elif (door.req_event is not None and door.req_event not in self.events + and not self.in_door_list(door, self.event_doors)): self.append_door_to_list(door, self.event_doors) + elif (bk_relevant and (door.bigKey or door.name in get_special_big_key_doors(world, player)) + and not self.big_key_opened): + if not self.in_door_list(door, self.big_doors): + self.append_door_to_list(door, self.big_doors) elif not self.in_door_list(door, self.avail_doors): self.append_door_to_list(door, self.avail_doors) # same as above but traps are checked for - def add_all_doors_check_proposed_3(self, region, proposed_map, valid_doors, world, player): + def add_all_doors_check_proposed_3(self, region, proposed_map, valid_doors, bk_relevant, world, player): for door in get_doors(world, region, player): if door in proposed_map and door.name in valid_doors: self.visited_doors.add(door) @@ -675,9 +701,13 @@ class ExplorationState(object): other = self.find_door_in_list(door, self.unattached_doors) if self.crystal != other.crystal: other.crystal = CrystalBarrier.Either - elif door.req_event is not None and door.req_event not in self.events and not self.in_door_list(door, - self.event_doors): + elif (door.req_event is not None and door.req_event not in self.events + and not self.in_door_list(door, self.event_doors)): self.append_door_to_list(door, self.event_doors) + elif (bk_relevant and (door.bigKey or door.name in get_special_big_key_doors(world, player)) + and not self.big_key_opened): + if not self.in_door_list(door, self.big_doors): + self.append_door_to_list(door, self.big_doors) elif not self.in_door_list(door, self.avail_doors): self.append_door_to_list(door, self.avail_doors) @@ -863,16 +893,22 @@ def extend_reachable_state_improved(search_regions, state, proposed_map, all_reg return local_state -def extend_reachable_state_lenient(search_regions, state, proposed_map, all_regions, valid_doors, world, player): +# bk_relevant means the big key doors need to be checks +def extend_reachable_state_lenient(search_regions, state, proposed_map, all_regions, valid_doors, bk_relevant, + world, player): local_state = state.copy() for region in search_regions: - local_state.visit_region(region) + local_state.visit_region(region, bk_relevant=bk_relevant) if world.trap_door_mode[player] == 'vanilla': - local_state.add_all_doors_check_proposed_3(region, proposed_map, valid_doors, world, player) + local_state.add_all_doors_check_proposed_3(region, proposed_map, valid_doors, bk_relevant, world, player) else: - local_state.add_all_doors_check_proposed_2(region, proposed_map, valid_doors, world, player) + local_state.add_all_doors_check_proposed_2(region, proposed_map, valid_doors, bk_relevant, world, player) while len(local_state.avail_doors) > 0: explorable_door = local_state.next_avail_door() + if explorable_door.door.bigKey: + if bk_relevant and (not special_big_key_found(local_state) if local_state.big_key_special + else local_state.count_locations_exclude_specials(world, player) == 0): + continue if explorable_door.door in proposed_map: connect_region = world.get_entrance(proposed_map[explorable_door.door].name, player).parent_region else: @@ -880,11 +916,13 @@ def extend_reachable_state_lenient(search_regions, state, proposed_map, all_regi if connect_region is not None: if (valid_region_to_explore_in_regions(connect_region, all_regions, world, player) and not local_state.visited(connect_region)): - local_state.visit_region(connect_region) + local_state.visit_region(connect_region, bk_relevant=bk_relevant) if world.trap_door_mode[player] == 'vanilla': - local_state.add_all_doors_check_proposed_3(connect_region, proposed_map, valid_doors, world, player) + local_state.add_all_doors_check_proposed_3(connect_region, proposed_map, valid_doors, + bk_relevant, world, player) else: - local_state.add_all_doors_check_proposed_2(connect_region, proposed_map, valid_doors, world, player) + local_state.add_all_doors_check_proposed_2(connect_region, proposed_map, valid_doors, + bk_relevant, world, player) return local_state From fd749553a97ffacbc329bf363a40119def629a93 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Thu, 28 Sep 2023 22:05:31 -0500 Subject: [PATCH 11/16] New solution for mirror portal disabling in Crossed OWR --- Rom.py | 3 ++- data/base2current.bps | Bin 107722 -> 107648 bytes 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Rom.py b/Rom.py index 8837e1de..de4d9cbc 100644 --- a/Rom.py +++ b/Rom.py @@ -38,7 +38,7 @@ from source.dungeon.RoomList import Room0127 JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = 'da111397d4118054e5ab4b9375cfb9e4' +RANDOMIZERBASEHASH = '86a1b18573f57f5035a6937463d5d2cc' class JsonRom(object): @@ -1403,6 +1403,7 @@ def patch_rom(world, rom, player, team, enemized, is_mystery=False): rom.write_byte(0x18004A, 0x00 if world.mode[player] != 'inverted' else 0x01) # Inverted mode rom.write_byte(0x18005D, 0x00) # Hammer always breaks barrier + rom.write_byte(0x02AF79, 0xD0 if world.mode[player] != 'inverted' else 0xF0) # vortexes: Normal (D0=light to dark, F0=dark to light, 42 = both) rom.write_byte(0x03A943, 0xD0 if world.mode[player] != 'inverted' else 0xF0) # Mirror: Normal (D0=Dark to Light, F0=light to dark, 42 = both) rom.write_byte(0x03A96D, 0xF0 if world.mode[player] != 'inverted' else 0xD0) # Residual Portal: Normal (F0= Light Side, D0=Dark Side, 42 = both (Darth Vader)) rom.write_byte(0x03A9A7, 0xD0) # Residual Portal: Normal (D0= Light Side, F0=Dark Side, 42 = both (Darth Vader)) diff --git a/data/base2current.bps b/data/base2current.bps index eaa221120b9a2369d26459c3f834b8664ce2f261..b8fe1dc27a4202adcb7a7bd05c87e9f74a961d59 100644 GIT binary patch delta 16292 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 OI-WePXK(x+&;JL%ipTr_ From 7a16ea4fe11a0afa36b52ba160ed246cbf513d89 Mon Sep 17 00:00:00 2001 From: aerinon Date: Fri, 29 Sep 2023 09:33:33 -0600 Subject: [PATCH 12/16] Rule fix for zelda to throne room Minor fix to standard generation and spoilers --- DoorShuffle.py | 10 +++++++++- Main.py | 2 +- RELEASENOTES.md | 4 ++++ Rom.py | 2 +- data/base2current.bps | Bin 94175 -> 94199 bytes test/customizer/zelda_escape.yaml | 14 ++++++++++++++ 6 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 test/customizer/zelda_escape.yaml diff --git a/DoorShuffle.py b/DoorShuffle.py index aa988351..b8c78f9f 100644 --- a/DoorShuffle.py +++ b/DoorShuffle.py @@ -177,6 +177,7 @@ def create_door_spoiler(world, player): queue = deque(world.dungeon_layouts[player].values()) while len(queue) > 0: builder = queue.popleft() + std_flag = world.mode[player] == 'standard' and builder.name == 'Hyrule Castle' and world.shuffle[player] == 'vanilla' done = set() start_regions = set(convert_regions(builder.layout_starts, world, player)) # todo: set all_entrances for basic reg_queue = deque(start_regions) @@ -205,11 +206,15 @@ def create_door_spoiler(world, player): logger.warning('This is a bug during door spoiler') elif not isinstance(door_b, Region): logger.warning('Door not connected: %s', door_a.name) - if connect and connect.type == RegionType.Dungeon and connect not in visited: + if valid_connection(connect, std_flag, world, player) and connect not in visited: visited.add(connect) reg_queue.append(connect) +def valid_connection(region, std_flag, world, player): + return region and (region.type == RegionType.Dungeon or region.name in world.inaccessible_regions[player] or + (std_flag and region.name == 'Hyrule Castle Ledge')) + def vanilla_key_logic(world, player): builders = [] world.dungeon_layouts[player] = {} @@ -3328,6 +3333,9 @@ def find_inaccessible_regions(world, player): ledge = world.get_region('Hyrule Castle Ledge', player) if any(x for x in ledge.exits if x.connected_region.name == 'Agahnims Tower Portal'): world.inaccessible_regions[player].append('Hyrule Castle Ledge') + # this should be considered as part of the inaccessible regions, dungeonssimple? + if world.mode[player] == 'standard' and world.shuffle[player] == 'vanilla': + world.inaccessible_regions[player].append('Hyrule Castle Ledge') logger = logging.getLogger('') logger.debug('Inaccessible Regions:') for r in world.inaccessible_regions[player]: diff --git a/Main.py b/Main.py index 259d7a4b..24fa0080 100644 --- a/Main.py +++ b/Main.py @@ -34,7 +34,7 @@ from source.overworld.EntranceShuffle2 import link_entrances_new from source.tools.BPS import create_bps_from_data from source.classes.CustomSettings import CustomSettings -version_number = '1.2.0.20' +version_number = '1.2.0.21' version_branch = '-u' __version__ = f'{version_number}{version_branch}' diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 336c604e..cae2bc56 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -109,6 +109,10 @@ These are now independent of retro mode and have three options: None, Random, an # Bug Fixes and Notes +* 1.2.0.21u + * Fix that should force items needed for leaving Zelda's cell to before the throne room, so S&Q isn't mandatory + * Small fix for Tavern Shuffle (thanks Catobat) + * Several small generation fixes * 1.2.0.20u * New generation feature that allows Spiral Stair to link to themselves (thank Catobat) * Added logic for trap doors that could be opened using existing room triggers diff --git a/Rom.py b/Rom.py index 5dc3652a..9351970c 100644 --- a/Rom.py +++ b/Rom.py @@ -37,7 +37,7 @@ from source.dungeon.RoomList import Room0127 JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = '61662913cc0cb12fb870d794937d88d9' +RANDOMIZERBASEHASH = '9b6e57f6e9d92934ce14276afd715849' class JsonRom(object): diff --git a/data/base2current.bps b/data/base2current.bps index 23872f82d3be21e2fabd52ac809761a819691b9f..643e68f74b79b1aa1e7712e5e48e71831c6eedc5 100644 GIT binary patch delta 5989 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 delta 5929 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 E50@W(RR910 diff --git a/test/customizer/zelda_escape.yaml b/test/customizer/zelda_escape.yaml new file mode 100644 index 00000000..e779bbac --- /dev/null +++ b/test/customizer/zelda_escape.yaml @@ -0,0 +1,14 @@ +meta: + players: 1 +settings: + 1: + door_shuffle: crossed + intensity: 3 + mode: standard + pottery: keys + dropshuffle: 'on' +doors: + 1: + doors: + Hyrule Dungeon Cellblock Up Stairs: + dest: Ice Hammer Block Down Stairs From 9d6e2c770d3e6b6d7bb066b8e5192b859e5f9d09 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Sun, 1 Oct 2023 06:13:36 -0500 Subject: [PATCH 13/16] New solution for mirror portal disabling in Crossed OWR Map check correctly displays mirror portal sprite --- Rom.py | 2 +- asm/owrando.asm | 113 +++++++++++++++++++----------------------- data/base2current.bps | Bin 107648 -> 107671 bytes 3 files changed, 52 insertions(+), 63 deletions(-) diff --git a/Rom.py b/Rom.py index de4d9cbc..a99e98c7 100644 --- a/Rom.py +++ b/Rom.py @@ -38,7 +38,7 @@ from source.dungeon.RoomList import Room0127 JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = '86a1b18573f57f5035a6937463d5d2cc' +RANDOMIZERBASEHASH = '52317b2dd4fb303887f26ecc40a4cae3' class JsonRom(object): diff --git a/asm/owrando.asm b/asm/owrando.asm index d74718dd..adc7635e 100644 --- a/asm/owrando.asm +++ b/asm/owrando.asm @@ -56,16 +56,17 @@ Link_ResetSwimmingState: ; mirror hooks -org $02FBAB -JSL OWMirrorSpriteRestore : NOP +org $0283DC ; override world check when spawning mirror portal sprite in Crossed OWR +jsl.l OWLightWorldOrCrossed org $05AF75 Sprite_6C_MirrorPortal: -jsl OWPreserveMirrorSprite : nop #2 ; LDA $7EF3CA : BNE $05AFDF +jsl OWMirrorSpriteDisable ; LDA $7EF3CA +org $05AF88 +jsl OWMirrorSpriteSkipDraw : NOP ; LDA.w $0FC6 : CMP.b #$03 org $05AFDF Sprite_6C_MirrorPortal_missing_mirror: -JML OWMirrorSpriteDelete : NOP ; STZ $0DD0,X : BRA $05AFF1 -org $0ABFBF -JSL OWMirrorSpriteOnMap : BRA + : NOP #6 : + +org $0ABFB6 +jsl OWMirrorSpriteOnMap : NOP ; LDA.w $008A : CMP.b #$40 ; whirlpool shuffle cross world change org $02b3bd @@ -100,10 +101,6 @@ jsl OWOldManSpeed ;org $09c957 ; <- 4c957 ;dw #$cb5f ; matches value on Central Bonk Rocks screen -; override world check when spawning mirror portal sprite in Crossed OWR -org $0283dc -jsl.l OWLightWorldOrCrossed - ; override world check when viewing overworld (incl. title screen portion) org $0aba6c ; < ? - Bank0a.asm:474 () jsl.l OWMapWorldCheck16 : nop @@ -172,6 +169,11 @@ plb : rtl nop #3 + +; follower hooks +;org $8689D9 +;SpritePrep_BombShoppe: +;JML BombShoppe_ConditionalSpawn : NOP + ;Code org $aa8800 OWTransitionDirection: @@ -257,66 +259,42 @@ OWDestroyItemSprites: DEX : BPL .nextSprite PLX : RTL } + OWMirrorSpriteOnMap: { - lda.w $1ac0,x : bit.b #$f0 : beq .continue - lda.b #$00 : rtl - .continue - ora.w $1ab0,x - ora.w $1ad0,x - ora.w $1ae0,x - rtl + JSL OWWorldCheck + CMP.b #$40 ; part of what we wrote over + RTL } -OWPreserveMirrorSprite: +OWMirrorSpriteDisable: { - lda.l OWMode+1 : and.b #!FLAG_OW_CROSSED : beq .vanilla ; if OW Crossed, skip world check and continue - lda.b $10 : cmp.b #$0f : beq .vanilla ; if performing mirror superbunny - rtl + LDA.b $10 : CMP.b #$0F : BNE + ; avoid rare freeze during mirror superbunny + PLA : PLA : PLA : JML Sprite_6C_MirrorPortal_missing_mirror + + + + lda.l OWMode+1 : and.b #!FLAG_OW_CROSSED : beq .vanilla + lda.l InvertedMode : beq + + lda.b #$40 + + rtl .vanilla - lda.l InvertedMode : beq + - lda.l CurrentWorld : beq .deleteMirror - rtl - + lda.l CurrentWorld : bne .deleteMirror - rtl - - .deleteMirror - lda.b $10 : cmp.b #$0f : bne + - jsr.w OWMirrorSpriteMove ; if performing mirror superbunny - + pla : pla : pla : jml Sprite_6C_MirrorPortal_missing_mirror -} -OWMirrorSpriteMove: -{ - lda.l OWMode+1 : and.b #!FLAG_OW_CROSSED : beq + - lda.w $1acf : ora.b #$40 : sta.w $1acf - + rts -} -OWMirrorSpriteBonk: -{ - jsr.w OWMirrorSpriteMove - lda.b #$2c : jml SetGameModeLikeMirror ; what we wrote over -} -OWMirrorSpriteDelete: -{ - stz.w $0dd0,x ; what we wrote over - jsr.w OWMirrorSpriteMove - jml Sprite_6C_MirrorPortal_dont_do_warp -} -OWMirrorSpriteRestore: -{ - lda.l OWMode+1 : and.b #!FLAG_OW_CROSSED : beq .return - lda.l InvertedMode : beq + - lda.l CurrentWorld : beq .return - bra .restorePortal - + lda.l CurrentWorld : bne .return - - .restorePortal - lda.w $1acf : and.b #$0f : sta.w $1acf - - .return - rep #$30 : lda.w $04AC ; what we wrote over + lda.l CurrentWorld ; what we wrote over rtl } +OWMirrorSpriteSkipDraw: +{ + lda.l OWMode+1 : and.b #!FLAG_OW_CROSSED : beq .vanilla + lda.l InvertedMode : beq + + lda.l CurrentWorld : eor.b #$40 + bra ++ + + lda.l CurrentWorld : ++ beq .vanilla + stz.w $0D90,x ; disables collision + sec : rtl + + .vanilla + LDA.w $0FC6 : CMP.b #$03 ; what we wrote over + RTL +} OWLightWorldOrCrossed: { lda.l OWMode+1 : and.b #!FLAG_OW_CROSSED : beq ++ @@ -563,6 +541,7 @@ OWBonkDrops: INX : LDA.w OWBonkPrizeData,X : PHX : PHA ; S = FlagBitmask, X (row + 2) LDX.b $8A : LDA.l OverworldEventDataWRAM,X : AND 1,S : PHA : BNE + ; S = Collected, FlagBitmask, X (row + 2) LDA.b #$1B : STA $12F ; JSL Sound_SetSfx3PanLong ; seems that when you bonk, there is a pending bonk sfx, so we clear that out and replace with reveal secret sfx + ; JSLSpriteSFX_QueueSFX3WithPan + LDA 3,S : TAX : INX : LDA.w OWBonkPrizeData,X PHA : INX : LDA.w OWBonkPrizeData,X : BEQ + @@ -894,6 +873,7 @@ OWNewDestination: ++ lda $84 : !add 1,s : sta $84 : pla : pla .adjustMainAxis + ;LDA $84 : SEC : SBC #$0400 : AND #$0F80 : ASL : XBA : STA $88 ; vram LDA $84 : SEC : SBC #$0400 : AND #$0F00 : ASL : XBA : STA $88 ; vram LDA $84 : SEC : SBC #$0010 : AND #$003E : LSR : STA $86 @@ -956,6 +936,7 @@ OWNewDestination: sep #$30 : lda $04 : and #$3f : !add OWOppSlotOffset,y : asl : sta $700 ; crossed OW shuffle and terrain + ;lda $8a : JSR OWDetermineScreensPaletteSet : STX $04 ldx $05 : ldy $08 : jsr OWWorldTerrainUpdate ldx $8a : lda $05 : sta $8a : stx $05 ; $05 is prev screen id, $8a is dest screen @@ -1180,6 +1161,14 @@ OWEndScrollTransition: RTL } +; BombShoppe_ConditionalSpawn: +; { +; nop +; INC.w $0BA0,X : LDA.b #$B5 ; what we wrote over +; JML SpritePrep_BombShoppe+5 +; nop#20 +; } + ;Data org $aaa000 OWEdgeOffsets: diff --git a/data/base2current.bps b/data/base2current.bps index b8fe1dc27a4202adcb7a7bd05c87e9f74a961d59..3c56274a00f1b9d319f2082083e17de09264ec86 100644 GIT binary patch delta 489 zcmVP`fsrDWh^p#XfwQp>PBH=t zih}_{mjOZnE==|B`fDOUh^omzYo!p$56}l_XlPvDuLZ9IfT}41@V^Rr+Lul@rhyrk zZ+n)OQ3s%bfR}q+1%Rmqo{$YVYpuo)$pfEkS{;C=t>u?-LID~oj}(BJsQ`}#P=9Nd zR(GVK&;(q)w+ik60+*Sk@C>E$$w1HssR5I!uRoW!LIGg`_Lmt$0b~JmmwrP58!Hft zkBfbQ$*|A`sd-HBipfII2O?Ol22Avd$u!Ufso6~Mipe$51*zIh@R!6x0XP94m;FNl zJ^>$>JVXIp0YI0TL;*%MD-!~Mg(Cr<6b%A^(W3*Z=)C~DNa(!)yYL0dXiU6}%4nOS zg_4Y;gvFMO$u!Ugso5Azl9v=k0cIXkBDt4bZIQEdGp3PD8;$z#mw9snfQd{SjbDHS zbeEV#0WJd{m2sEJMFBPf5J#5*Mgiss8gK)Eflr@Ox9>&)9RmplD;1ugtNd8 zPBH@giGvVAmk>e$E<%a#`fHP6bAXdl5Z<|5->(I)1AwY20`MrD#t)Ye8I6`v2cUs~ zmV94?p$Mr1jm8h2&<(p6JC2t^H>Rg=H>MGQmx@9G8Z086=>n+$j|NbGYnDzHpP|qM zT)npn?f?RpVmPLy@C>E$$w1HssR5I!uOpYvLIGg`=$9}<0c1yJi&~qnLGpen0!YvW zsT++i0j~hOs_>UPZjXfmi;s(afyuDY1*v&V;)=;a&<7$|tp-fyipez41*zFg;)=;N z&;_a5OyZZ@LjgDe5tkH10X_i{ms3OmTmdAPutWhy3J((kfQ2IgpLh(GMFA8Su8hiP zo1%q;jH86bh>XcJ&<3g57)*qhD@6fj9ycPnmt1X;vsg2xkxUJZ`tX-sa{_>gObv}+ zfM|1 Date: Mon, 2 Oct 2023 21:52:34 -0500 Subject: [PATCH 14/16] Some fixes to OWR district shuffle yamls --- presets/world/owr_districtshuffle-full.yaml | 2 -- presets/world/owr_districtshuffle-vanillaborders.yaml | 2 -- 2 files changed, 4 deletions(-) diff --git a/presets/world/owr_districtshuffle-full.yaml b/presets/world/owr_districtshuffle-full.yaml index 6ce0ac7a..e9e62916 100644 --- a/presets/world/owr_districtshuffle-full.yaml +++ b/presets/world/owr_districtshuffle-full.yaml @@ -121,8 +121,6 @@ ow-edges: - Lake Hylia NW* - Tree Line SC* - Lake Hylia NC* - - Lake Hylia WS* - - South Pass ES* - Lake Hylia EC* - Octoballoon WC* - Lake Hylia ES* diff --git a/presets/world/owr_districtshuffle-vanillaborders.yaml b/presets/world/owr_districtshuffle-vanillaborders.yaml index 6e622648..016dd9da 100644 --- a/presets/world/owr_districtshuffle-vanillaborders.yaml +++ b/presets/world/owr_districtshuffle-vanillaborders.yaml @@ -138,8 +138,6 @@ ow-edges: - Lake Hylia NW* - Tree Line SC* - Lake Hylia NC* - - Lake Hylia WS* - - South Pass ES* - Lake Hylia EC* - Octoballoon WC* - Lake Hylia ES* From 346d91fe375e0c87bbcc119409bba0f5861def07 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Thu, 5 Oct 2023 00:43:12 -0500 Subject: [PATCH 15/16] More OWR yamls and some adjustments to existing ones --- presets/world/owr_flute-nearvanilla.yaml | 31 + .../world/owr_quadrantshuffle-diagonal.yaml | 308 ++++++++++ presets/world/owr_quadrantshuffle-full.yaml | 573 +++++++++--------- .../owr_quadrantshuffle-vanillaborders.yaml | 492 +++++++-------- presets/world/owr_ringshuffle-borders.yaml | 214 +++++++ presets/world/owr_ringshuffle-full.yaml | 313 ++++++++++ presets/world/owr_ringshuffle-interiors.yaml | 258 ++++++++ presets/world/owr_shuffle-largescreens.yaml | 4 +- .../world/owr_shuffle-separatemountain.yaml | 24 +- presets/world/owr_shuffle-splitsimilar.yaml | 123 ++++ .../owr_shuffle-splitsimilarterrain.yaml | 175 ++++++ presets/world/owr_shuffle-vertical.yaml | 4 +- presets/world/owr_shuffle-verticalbyrows.yaml | 4 +- 13 files changed, 1969 insertions(+), 554 deletions(-) create mode 100644 presets/world/owr_flute-nearvanilla.yaml create mode 100644 presets/world/owr_quadrantshuffle-diagonal.yaml create mode 100644 presets/world/owr_ringshuffle-borders.yaml create mode 100644 presets/world/owr_ringshuffle-full.yaml create mode 100644 presets/world/owr_ringshuffle-interiors.yaml create mode 100644 presets/world/owr_shuffle-splitsimilar.yaml create mode 100644 presets/world/owr_shuffle-splitsimilarterrain.yaml diff --git a/presets/world/owr_flute-nearvanilla.yaml b/presets/world/owr_flute-nearvanilla.yaml new file mode 100644 index 00000000..5941d344 --- /dev/null +++ b/presets/world/owr_flute-nearvanilla.yaml @@ -0,0 +1,31 @@ +settings: + 1: + ow_fluteshuffle: balanced +ow-flutespots: + 1: + forbid: + - 0x00 # Lost Woods + - 0x02 # Lumberjack + - 0x07 # Death Mountain TR Pegs + - 0x0A # Mountain Pass + - 0x0F # Zora Waterfall + - 0x10 # Lost Woods Pass + - 0x12 # Kakariko Pond + - 0x13 # Sanctuary + - 0x14 # Graveyard + - 0x17 # Zora Approach + - 0x1A # Forgotten Forest + - 0x1D # Wooden Bridge + - 0x22 # Blacksmith + - 0x25 # Sand Dunes + - 0x28 # Maze Race + - 0x29 # Kakariko Suburb + - 0x2A # Flute Boy + - 0x2B # Central Bonk Rocks + - 0x2D # Stone Bridge + - 0x2E # Tree Line + - 0x32 # Flute Boy Approach + - 0x34 # Statues + - 0x37 # Ice Cave + - 0x3A # Desert Pass + - 0x3C # South Pass diff --git a/presets/world/owr_quadrantshuffle-diagonal.yaml b/presets/world/owr_quadrantshuffle-diagonal.yaml new file mode 100644 index 00000000..010d9e3c --- /dev/null +++ b/presets/world/owr_quadrantshuffle-diagonal.yaml @@ -0,0 +1,308 @@ +ow-edges: + 1: + groups: + north: + - Lost Woods NW + - Lost Woods EN + - Skull Woods EN + - Lumberjack WN + - Lumberjack SW + - Dark Lumberjack WN + - Dark Lumberjack SW + - West Death Mountain EN + - West Death Mountain ES + - West Dark Death Mountain EN + - West Dark Death Mountain ES + - East Death Mountain WN + - East Death Mountain WS + - East Death Mountain EN + - East Dark Death Mountain WN + - East Dark Death Mountain WS + - East Dark Death Mountain EN + - Death Mountain TR Pegs WN + - Turtle Rock WN + - Mountain Pass NW + - Mountain Pass SE + - Bumper Cave NW + - Bumper Cave SE + - Kakariko Pond NE + - Kakariko Pond EN + - Kakariko Pond ES + - Outcast Pond NE + - Outcast Pond EN + - Outcast Pond ES + - Sanctuary WN + - Sanctuary WS + - Sanctuary EC + - Dark Chapel WN + - Dark Chapel WS + - Dark Chapel EC + - Graveyard WC + - Graveyard EC + - Dark Graveyard WC + - Dark Graveyard EC + - River Bend WC + - Qirn Jump WC + - Master Sword Meadow SC + east: + - Zora Waterfall NE + - Zora Waterfall SE + - Catfish SE + - River Bend EN + - River Bend EC + - River Bend ES + - River Bend SW + - River Bend SC + - River Bend SE + - Qirn Jump EN + - Qirn Jump EC + - Qirn Jump ES + - Qirn Jump SW + - Qirn Jump SC + - Qirn Jump SE + - Potion Shop WN + - Potion Shop WC + - Potion Shop WS + - Potion Shop EN + - Potion Shop EC + - Dark Witch WN + - Dark Witch WC + - Dark Witch WS + - Dark Witch EN + - Dark Witch EC + - Zora Approach NE + - Zora Approach WN + - Zora Approach WC + - Catfish Approach NE + - Catfish Approach WN + - Catfish Approach WC + - Hyrule Castle ES + - Pyramid ES + - Wooden Bridge NW + - Wooden Bridge NC + - Wooden Bridge NE + - Wooden Bridge SW + - Broken Bridge NW + - Broken Bridge NC + - Broken Bridge NE + - Broken Bridge SW + - Eastern Palace SW + - Eastern Palace SE + - Palace of Darkness SW + - Palace of Darkness SE + - Sand Dunes NW + - Sand Dunes WN + - Sand Dunes SC + - Dark Dunes NW + - Dark Dunes WN + - Dark Dunes SC + - Stone Bridge NC + - Stone Bridge EN + - Stone Bridge EC + - Hammer Bridge NC + - Hammer Bridge EN + - Hammer Bridge EC + - Tree Line NW + - Tree Line WN + - Tree Line WC + - Tree Line SC + - Tree Line SE + - Dark Tree Line NW + - Dark Tree Line WN + - Dark Tree Line WC + - Dark Tree Line SC + - Dark Tree Line SE + - Eastern Nook NE + - Palace of Darkness Nook NE + - Lake Hylia NC + - Lake Hylia NE + - Ice Lake NC + - Ice Lake NE + - Ice Cave SW + - Ice Cave SE + - Shopping Mall SW + - Shopping Mall SE + - Octoballoon NW + - Octoballoon NE + - Bomber Corner NW + - Bomber Corner NE + - Zoras Domain SW + south: + - Hyrule Castle SW + - Hyrule Castle SE + - Pyramid SW + - Pyramid SE + - Flute Boy SW + - Flute Boy SC + - Stumpy SW + - Stumpy SC + - Central Bonk Rocks NW + - Central Bonk Rocks EN + - Central Bonk Rocks EC + - Central Bonk Rocks ES + - Central Bonk Rocks SW + - Dark Bonk Rocks NW + - Dark Bonk Rocks EN + - Dark Bonk Rocks EC + - Dark Bonk Rocks ES + - Dark Bonk Rocks SW + - Links House NE + - Links House WN + - Links House WC + - Links House WS + - Links House SC + - Links House ES + - Big Bomb Shop NE + - Big Bomb Shop WN + - Big Bomb Shop WC + - Big Bomb Shop WS + - Big Bomb Shop SC + - Big Bomb Shop ES + - Stone Bridge WC + - Stone Bridge WS + - Stone Bridge SC + - Hammer Bridge WS + - Hammer Bridge SC + - Desert EC + - Desert ES + - Flute Boy Approach NW + - Flute Boy Approach NC + - Flute Boy Approach EC + - Stumpy Approach NW + - Stumpy Approach NC + - Stumpy Approach EC + - C Whirlpool NW + - C Whirlpool WC + - C Whirlpool EN + - C Whirlpool EC + - C Whirlpool ES + - C Whirlpool SC + - Dark C Whirlpool NW + - Dark C Whirlpool WC + - Dark C Whirlpool EN + - Dark C Whirlpool EC + - Dark C Whirlpool ES + - Dark C Whirlpool SC + - Statues NC + - Statues WN + - Statues WC + - Statues WS + - Statues SC + - Hype Cave NC + - Hype Cave WN + - Hype Cave WC + - Hype Cave WS + - Hype Cave SC + - Lake Hylia NW + - Lake Hylia WS + - Lake Hylia EC + - Lake Hylia ES + - Ice Lake NW + - Ice Lake WS + - Ice Lake EC + - Ice Lake ES + - Desert Pass WC + - Desert Pass WS + - Desert Pass EC + - Desert Pass ES + - Swamp Nook EC + - Swamp Nook ES + - Dam NC + - Dam WC + - Dam WS + - Dam EC + - Swamp NC + - Swamp WC + - Swamp WS + - Swamp EC + - South Pass NC + - South Pass WC + - South Pass ES + - Dark South Pass NC + - Dark South Pass WC + - Dark South Pass ES + - Octoballoon WC + - Octoballoon WS + - Bomber Corner WC + - Bomber Corner WS + - Hobo EC + west: + - Lost Woods SW + - Lost Woods SC + - Lost Woods SE + - Skull Woods SW + - Skull Woods SC + - Skull Woods SE + - Lost Woods Pass NW + - Lost Woods Pass NE + - Lost Woods Pass SW + - Lost Woods Pass SE + - Skull Woods Pass NW + - Skull Woods Pass NE + - Skull Woods Pass SW + - Skull Woods Pass SE + - Kakariko Fortune NE + - Kakariko Fortune EN + - Kakariko Fortune ES + - Kakariko Fortune SC + - Dark Fortune NE + - Dark Fortune EN + - Dark Fortune ES + - Dark Fortune SC + - Kakariko Pond WN + - Kakariko Pond WS + - Kakariko Pond SW + - Kakariko Pond SE + - Outcast Pond WN + - Outcast Pond WS + - Outcast Pond SW + - Outcast Pond SE + - Kakariko NW + - Kakariko NC + - Kakariko NE + - Kakariko ES + - Kakariko SE + - Village of Outcasts NW + - Village of Outcasts NC + - Village of Outcasts NE + - Village of Outcasts ES + - Village of Outcasts SE + - Forgotten Forest NW + - Forgotten Forest NE + - Forgotten Forest ES + - Shield Shop NW + - Shield Shop NE + - Hyrule Castle WN + - Blacksmith WS + - Hammer Pegs WS + - Maze Race ES + - Dig Game EC + - Dig Game ES + - Kakariko Suburb NE + - Kakariko Suburb WS + - Kakariko Suburb ES + - Frog NE + - Frog WC + - Frog WS + - Frog ES + - Flute Boy WS + - Stumpy WS +ow-tileflips: + 1: + force_together: + PedHobo: + - 0x00 + - 0x2d + - 0x80 + Zora: + - 0x0f + - 0x81 + Forest: + - 0x1a + - 0x1b + FrogDig: + - 0x28 + - 0x29 + Desert: + - 0x30 + - 0x3a \ No newline at end of file diff --git a/presets/world/owr_quadrantshuffle-full.yaml b/presets/world/owr_quadrantshuffle-full.yaml index 8538f709..6dabad7c 100644 --- a/presets/world/owr_quadrantshuffle-full.yaml +++ b/presets/world/owr_quadrantshuffle-full.yaml @@ -2,297 +2,290 @@ ow-edges: 1: groups: northwest: - - Lost Woods NW - - Lost Woods EN - - Lost Woods SW - - Lost Woods SC - - Lost Woods SE - - Skull Woods EN - - Skull Woods SW - - Skull Woods SC - - Skull Woods SE - - Lumberjack WN - - Lumberjack SW - - Dark Lumberjack WN - - Dark Lumberjack SW - - Mountain Pass NW - - Mountain Pass SE - - Bumper Cave NW - - Bumper Cave SE - - Lost Woods Pass NW - - Lost Woods Pass NE - - Lost Woods Pass SW - - Lost Woods Pass SE - - Skull Woods Pass NW - - Skull Woods Pass NE - - Skull Woods Pass SW - - Skull Woods Pass SE - - Kakariko Fortune NE - - Kakariko Fortune EN - - Kakariko Fortune ES - - Kakariko Fortune SC - - Dark Fortune NE - - Dark Fortune EN - - Dark Fortune ES - - Dark Fortune SC - - Kakariko Pond NE - - Kakariko Pond WN - - Kakariko Pond WS - - Kakariko Pond EN - - Kakariko Pond ES - - Kakariko Pond SW - - Kakariko Pond SE - - Outcast Pond NE - - Outcast Pond WN - - Outcast Pond WS - - Outcast Pond EN - - Outcast Pond ES - - Outcast Pond SW - - Outcast Pond SE - - Sanctuary WN - - Sanctuary WS - - Kakariko NW - - Kakariko NC - - Kakariko NE - - Dark Chapel WN - - Dark Chapel WS - - Village of Outcasts NW - - Village of Outcasts NC - - Village of Outcasts NE - - Forgotten Forest NW - - Forgotten Forest NE - - Forgotten Forest ES - - Shield Shop NW - - Shield Shop NE - - Hyrule Castle WN - - Master Sword Meadow SC + - Lost Woods NW + - Lost Woods EN + - Lost Woods SW + - Lost Woods SC + - Lost Woods SE + - Skull Woods EN + - Skull Woods SW + - Skull Woods SC + - Skull Woods SE + - Lumberjack WN + - Lumberjack SW + - Dark Lumberjack WN + - Dark Lumberjack SW + - Mountain Pass NW + - Mountain Pass SE + - Bumper Cave NW + - Bumper Cave SE + - Lost Woods Pass NW + - Lost Woods Pass NE + - Lost Woods Pass SW + - Lost Woods Pass SE + - Skull Woods Pass NW + - Skull Woods Pass NE + - Skull Woods Pass SW + - Skull Woods Pass SE + - Kakariko Fortune NE + - Kakariko Fortune EN + - Kakariko Fortune ES + - Kakariko Fortune SC + - Dark Fortune NE + - Dark Fortune EN + - Dark Fortune ES + - Dark Fortune SC + - Kakariko Pond NE + - Kakariko Pond WN + - Kakariko Pond WS + - Kakariko Pond EN + - Kakariko Pond ES + - Kakariko Pond SW + - Kakariko Pond SE + - Outcast Pond NE + - Outcast Pond WN + - Outcast Pond WS + - Outcast Pond EN + - Outcast Pond ES + - Outcast Pond SW + - Outcast Pond SE + - Sanctuary WN + - Sanctuary WS + - Kakariko NW + - Kakariko NC + - Kakariko NE + - Dark Chapel WN + - Dark Chapel WS + - Village of Outcasts NW + - Village of Outcasts NC + - Village of Outcasts NE + - Forgotten Forest NW + - Forgotten Forest NE + - Forgotten Forest ES + - Shield Shop NW + - Shield Shop NE + - Hyrule Castle WN + - Master Sword Meadow SC northeast: - - West Death Mountain EN - - West Death Mountain ES - - West Dark Death Mountain EN - - West Dark Death Mountain ES - - East Death Mountain WN - - East Death Mountain WS - - East Death Mountain EN - - East Dark Death Mountain WN - - East Dark Death Mountain WS - - East Dark Death Mountain EN - - Death Mountain TR Pegs WN - - Turtle Rock WN - - Zora Waterfall NE - - Zora Waterfall SE - - Catfish SE - - Graveyard EC - - Dark Graveyard EC - - River Bend WC - - River Bend EN - - River Bend EC - - River Bend ES - - River Bend SW - - River Bend SC - - River Bend SE - - Qirn Jump WC - - Qirn Jump EN - - Qirn Jump EC - - Qirn Jump ES - - Qirn Jump SW - - Qirn Jump SC - - Qirn Jump SE - - Potion Shop WN - - Potion Shop WC - - Potion Shop WS - - Potion Shop EN - - Potion Shop EC - - Dark Witch WN - - Dark Witch WC - - Dark Witch WS - - Dark Witch EN - - Dark Witch EC - - Zora Approach NE - - Zora Approach WN - - Zora Approach WC - - Catfish Approach NE - - Catfish Approach WN - - Catfish Approach WC - - Wooden Bridge NW - - Wooden Bridge NC - - Wooden Bridge NE - - Broken Bridge NW - - Broken Bridge NC - - Broken Bridge NE - - Zoras Domain SW + - West Death Mountain EN + - West Death Mountain ES + - West Dark Death Mountain EN + - West Dark Death Mountain ES + - East Death Mountain WN + - East Death Mountain WS + - East Death Mountain EN + - East Dark Death Mountain WN + - East Dark Death Mountain WS + - East Dark Death Mountain EN + - Death Mountain TR Pegs WN + - Turtle Rock WN + - Zora Waterfall NE + - Zora Waterfall SE + - Catfish SE + - Graveyard EC + - Dark Graveyard EC + - River Bend WC + - River Bend EN + - River Bend EC + - River Bend ES + - River Bend SW + - River Bend SC + - River Bend SE + - Qirn Jump WC + - Qirn Jump EN + - Qirn Jump EC + - Qirn Jump ES + - Qirn Jump SW + - Qirn Jump SC + - Qirn Jump SE + - Potion Shop WN + - Potion Shop WC + - Potion Shop WS + - Potion Shop EN + - Potion Shop EC + - Dark Witch WN + - Dark Witch WC + - Dark Witch WS + - Dark Witch EN + - Dark Witch EC + - Zora Approach NE + - Zora Approach WN + - Zora Approach WC + - Catfish Approach NE + - Catfish Approach WN + - Catfish Approach WC + - Wooden Bridge NW + - Wooden Bridge NC + - Wooden Bridge NE + - Broken Bridge NW + - Broken Bridge NC + - Broken Bridge NE + - Zoras Domain SW southwest: - - Kakariko ES - - Kakariko SE - - Village of Outcasts ES - - Village of Outcasts SE - - Hyrule Castle SW - - Pyramid SW - - Blacksmith WS - - Hammer Pegs WS - - Maze Race ES - - Dig Game EC - - Dig Game ES - - Kakariko Suburb NE - - Kakariko Suburb WS - - Kakariko Suburb ES - - Frog NE - - Frog WC - - Frog WS - - Frog ES - - Flute Boy WS - - Flute Boy SW - - Flute Boy SC - - Stumpy WS - - Stumpy SW - - Stumpy SC - - Central Bonk Rocks NW - - Central Bonk Rocks SW - - Dark Bonk Rocks NW - - Dark Bonk Rocks SW - - Desert EC - - Desert ES - - Flute Boy Approach NW - - Flute Boy Approach NC - - Flute Boy Approach EC - - Stumpy Approach NW - - Stumpy Approach NC - - Stumpy Approach EC - - C Whirlpool NW - - C Whirlpool WC - - C Whirlpool SC - - Dark C Whirlpool NW - - Dark C Whirlpool WC - - Dark C Whirlpool SC - - Desert Pass WC - - Desert Pass WS - - Desert Pass EC - - Desert Pass ES - - Swamp Nook EC - - Swamp Nook ES - - Dam NC - - Dam WC - - Dam WS - - Swamp NC - - Swamp WC - - Swamp WS + - Kakariko ES + - Kakariko SE + - Village of Outcasts ES + - Village of Outcasts SE + - Hyrule Castle SW + - Pyramid SW + - Blacksmith WS + - Hammer Pegs WS + - Maze Race ES + - Dig Game EC + - Dig Game ES + - Kakariko Suburb NE + - Kakariko Suburb WS + - Kakariko Suburb ES + - Frog NE + - Frog WC + - Frog WS + - Frog ES + - Flute Boy WS + - Flute Boy SW + - Flute Boy SC + - Stumpy WS + - Stumpy SW + - Stumpy SC + - Central Bonk Rocks NW + - Central Bonk Rocks SW + - Dark Bonk Rocks NW + - Dark Bonk Rocks SW + - Desert EC + - Desert ES + - Flute Boy Approach NW + - Flute Boy Approach NC + - Flute Boy Approach EC + - Stumpy Approach NW + - Stumpy Approach NC + - Stumpy Approach EC + - C Whirlpool NW + - C Whirlpool WC + - C Whirlpool SC + - Dark C Whirlpool NW + - Dark C Whirlpool WC + - Dark C Whirlpool SC + - Desert Pass WC + - Desert Pass WS + - Desert Pass EC + - Desert Pass ES + - Swamp Nook EC + - Swamp Nook ES + - Dam NC + - Dam WC + - Dam WS + - Swamp NC + - Swamp WC + - Swamp WS southeast: - - Hyrule Castle ES - - Hyrule Castle SE - - Pyramid ES - - Pyramid SE - - Eastern Palace SW - - Eastern Palace SE - - Palace of Darkness SW - - Palace of Darkness SE - - Sand Dunes WN - - Sand Dunes SC - - Dark Dunes WN - - Dark Dunes SC - - Links House NE - - Links House SC - - Links House ES - - Big Bomb Shop NE - - Big Bomb Shop SC - - Big Bomb Shop ES - - Stone Bridge NC - - Stone Bridge WC - - Stone Bridge WS - - Stone Bridge EN - - Stone Bridge EC - - Stone Bridge SC - - Hammer Bridge NC - - Hammer Bridge WS - - Hammer Bridge EN - - Hammer Bridge EC - - Hammer Bridge SC - - Tree Line NW - - Tree Line WN - - Tree Line WC - - Tree Line SC - - Tree Line SE - - Dark Tree Line NW - - Dark Tree Line WN - - Dark Tree Line WC - - Dark Tree Line SC - - Dark Tree Line SE - - Eastern Nook NE - - Palace of Darkness Nook NE - - Statues NC - - Statues SC - - Hype Cave NC - - Hype Cave SC - - Lake Hylia NW - - Lake Hylia NC - - Lake Hylia NE - - Lake Hylia WS - - Lake Hylia EC - - Lake Hylia ES - - Ice Lake NW - - Ice Lake NC - - Ice Lake NE - - Ice Lake WS - - Ice Lake EC - - Ice Lake ES - - Ice Cave SW - - Ice Cave SE - - Shopping Mall SW - - Shopping Mall SE - - South Pass NC - - South Pass ES - - Dark South Pass NC - - Dark South Pass ES - - Octoballoon NW - - Octoballoon NE - - Octoballoon WC - - Octoballoon WS - - Bomber Corner NW - - Bomber Corner NE - - Bomber Corner WC - - Bomber Corner WS - - Hobo EC + - Hyrule Castle ES + - Hyrule Castle SE + - Pyramid ES + - Pyramid SE + - Eastern Palace SW + - Eastern Palace SE + - Palace of Darkness SW + - Palace of Darkness SE + - Sand Dunes WN + - Sand Dunes SC + - Dark Dunes WN + - Dark Dunes SC + - Links House NE + - Links House SC + - Links House ES + - Big Bomb Shop NE + - Big Bomb Shop SC + - Big Bomb Shop ES + - Stone Bridge NC + - Stone Bridge WC + - Stone Bridge WS + - Stone Bridge EN + - Stone Bridge EC + - Stone Bridge SC + - Hammer Bridge NC + - Hammer Bridge WS + - Hammer Bridge EN + - Hammer Bridge EC + - Hammer Bridge SC + - Tree Line NW + - Tree Line WN + - Tree Line WC + - Tree Line SC + - Tree Line SE + - Dark Tree Line NW + - Dark Tree Line WN + - Dark Tree Line WC + - Dark Tree Line SC + - Dark Tree Line SE + - Eastern Nook NE + - Palace of Darkness Nook NE + - Statues NC + - Statues SC + - Hype Cave NC + - Hype Cave SC + - Lake Hylia NW + - Lake Hylia NC + - Lake Hylia NE + - Lake Hylia WS + - Lake Hylia EC + - Lake Hylia ES + - Ice Lake NW + - Ice Lake NC + - Ice Lake NE + - Ice Lake WS + - Ice Lake EC + - Ice Lake ES + - Ice Cave SW + - Ice Cave SE + - Shopping Mall SW + - Shopping Mall SE + - South Pass NC + - South Pass ES + - Dark South Pass NC + - Dark South Pass ES + - Octoballoon NW + - Octoballoon NE + - Octoballoon WC + - Octoballoon WS + - Bomber Corner NW + - Bomber Corner NE + - Bomber Corner WC + - Bomber Corner WS + - Hobo EC borders: - - Zora Whirlpool - - Kakariko Pond Whirlpool - - Sanctuary EC - - Dark Chapel EC - - Graveyard WC - - Dark Graveyard WC - - River Bend Whirlpool - - Qirn Jump Whirlpool - - Wooden Bridge SW - - Broken Bridge SW - - Sand Dunes NW - - Dark Dunes NW - - Central Bonk Rocks EN - - Central Bonk Rocks EC - - Central Bonk Rocks ES - - Dark Bonk Rocks EN - - Dark Bonk Rocks EC - - Dark Bonk Rocks ES - - Links House WN - - Links House WC - - Links House WS - - Big Bomb Shop WN - - Big Bomb Shop WC - - Big Bomb Shop WS - - C Whirlpool EN - - C Whirlpool EC - - C Whirlpool ES - - C Whirlpool - - Dark C Whirlpool EN - - Dark C Whirlpool EC - - Dark C Whirlpool ES - - Statues WN - - Statues WC - - Statues WS - - Hype Cave WN - - Hype Cave WC - - Hype Cave WS - - Lake Hylia Whirlpool - - Dam EC - - Swamp EC - - South Pass WC - - Dark South Pass WC - - Octoballoon Whirlpool - - Bomber Corner Whirlpool + - Sanctuary EC + - Dark Chapel EC + - Graveyard WC + - Dark Graveyard WC + - Wooden Bridge SW + - Broken Bridge SW + - Sand Dunes NW + - Dark Dunes NW + - Central Bonk Rocks EN + - Central Bonk Rocks EC + - Central Bonk Rocks ES + - Dark Bonk Rocks EN + - Dark Bonk Rocks EC + - Dark Bonk Rocks ES + - Links House WN + - Links House WC + - Links House WS + - Big Bomb Shop WN + - Big Bomb Shop WC + - Big Bomb Shop WS + - C Whirlpool EN + - C Whirlpool EC + - C Whirlpool ES + - C Whirlpool + - Dark C Whirlpool EN + - Dark C Whirlpool EC + - Dark C Whirlpool ES + - Statues WN + - Statues WC + - Statues WS + - Hype Cave WN + - Hype Cave WC + - Hype Cave WS + - Dam EC + - Swamp EC + - South Pass WC + - Dark South Pass WC \ No newline at end of file diff --git a/presets/world/owr_quadrantshuffle-vanillaborders.yaml b/presets/world/owr_quadrantshuffle-vanillaborders.yaml index f446011c..22f9e8fb 100644 --- a/presets/world/owr_quadrantshuffle-vanillaborders.yaml +++ b/presets/world/owr_quadrantshuffle-vanillaborders.yaml @@ -24,252 +24,252 @@ ow-edges: Swamp EC*: Dark South Pass WC* groups: northwest: - - Lost Woods NW - - Lost Woods EN - - Lost Woods SW - - Lost Woods SC - - Lost Woods SE - - Skull Woods EN - - Skull Woods SW - - Skull Woods SC - - Skull Woods SE - - Lumberjack WN - - Lumberjack SW - - Dark Lumberjack WN - - Dark Lumberjack SW - - Mountain Pass NW - - Mountain Pass SE - - Bumper Cave NW - - Bumper Cave SE - - Lost Woods Pass NW - - Lost Woods Pass NE - - Lost Woods Pass SW - - Lost Woods Pass SE - - Skull Woods Pass NW - - Skull Woods Pass NE - - Skull Woods Pass SW - - Skull Woods Pass SE - - Kakariko Fortune NE - - Kakariko Fortune EN - - Kakariko Fortune ES - - Kakariko Fortune SC - - Dark Fortune NE - - Dark Fortune EN - - Dark Fortune ES - - Dark Fortune SC - - Kakariko Pond NE - - Kakariko Pond WN - - Kakariko Pond WS - - Kakariko Pond EN - - Kakariko Pond ES - - Kakariko Pond SW - - Kakariko Pond SE - - Outcast Pond NE - - Outcast Pond WN - - Outcast Pond WS - - Outcast Pond EN - - Outcast Pond ES - - Outcast Pond SW - - Outcast Pond SE - - Sanctuary WN - - Sanctuary WS - - Kakariko NW - - Kakariko NC - - Kakariko NE - - Dark Chapel WN - - Dark Chapel WS - - Village of Outcasts NW - - Village of Outcasts NC - - Village of Outcasts NE - - Forgotten Forest NW - - Forgotten Forest NE - - Forgotten Forest ES - - Shield Shop NW - - Shield Shop NE - - Hyrule Castle WN - - Master Sword Meadow SC + - Lost Woods NW + - Lost Woods EN + - Lost Woods SW + - Lost Woods SC + - Lost Woods SE + - Skull Woods EN + - Skull Woods SW + - Skull Woods SC + - Skull Woods SE + - Lumberjack WN + - Lumberjack SW + - Dark Lumberjack WN + - Dark Lumberjack SW + - Mountain Pass NW + - Mountain Pass SE + - Bumper Cave NW + - Bumper Cave SE + - Lost Woods Pass NW + - Lost Woods Pass NE + - Lost Woods Pass SW + - Lost Woods Pass SE + - Skull Woods Pass NW + - Skull Woods Pass NE + - Skull Woods Pass SW + - Skull Woods Pass SE + - Kakariko Fortune NE + - Kakariko Fortune EN + - Kakariko Fortune ES + - Kakariko Fortune SC + - Dark Fortune NE + - Dark Fortune EN + - Dark Fortune ES + - Dark Fortune SC + - Kakariko Pond NE + - Kakariko Pond WN + - Kakariko Pond WS + - Kakariko Pond EN + - Kakariko Pond ES + - Kakariko Pond SW + - Kakariko Pond SE + - Outcast Pond NE + - Outcast Pond WN + - Outcast Pond WS + - Outcast Pond EN + - Outcast Pond ES + - Outcast Pond SW + - Outcast Pond SE + - Sanctuary WN + - Sanctuary WS + - Kakariko NW + - Kakariko NC + - Kakariko NE + - Dark Chapel WN + - Dark Chapel WS + - Village of Outcasts NW + - Village of Outcasts NC + - Village of Outcasts NE + - Forgotten Forest NW + - Forgotten Forest NE + - Forgotten Forest ES + - Shield Shop NW + - Shield Shop NE + - Hyrule Castle WN + - Master Sword Meadow SC northeast: - - West Death Mountain EN - - West Death Mountain ES - - West Dark Death Mountain EN - - West Dark Death Mountain ES - - East Death Mountain WN - - East Death Mountain WS - - East Death Mountain EN - - East Dark Death Mountain WN - - East Dark Death Mountain WS - - East Dark Death Mountain EN - - Death Mountain TR Pegs WN - - Turtle Rock WN - - Zora Waterfall NE - - Zora Waterfall SE - - Catfish SE - - Graveyard EC - - Dark Graveyard EC - - River Bend WC - - River Bend EN - - River Bend EC - - River Bend ES - - River Bend SW - - River Bend SC - - River Bend SE - - Qirn Jump WC - - Qirn Jump EN - - Qirn Jump EC - - Qirn Jump ES - - Qirn Jump SW - - Qirn Jump SC - - Qirn Jump SE - - Potion Shop WN - - Potion Shop WC - - Potion Shop WS - - Potion Shop EN - - Potion Shop EC - - Dark Witch WN - - Dark Witch WC - - Dark Witch WS - - Dark Witch EN - - Dark Witch EC - - Zora Approach NE - - Zora Approach WN - - Zora Approach WC - - Catfish Approach NE - - Catfish Approach WN - - Catfish Approach WC - - Wooden Bridge NW - - Wooden Bridge NC - - Wooden Bridge NE - - Broken Bridge NW - - Broken Bridge NC - - Broken Bridge NE - - Zoras Domain SW + - West Death Mountain EN + - West Death Mountain ES + - West Dark Death Mountain EN + - West Dark Death Mountain ES + - East Death Mountain WN + - East Death Mountain WS + - East Death Mountain EN + - East Dark Death Mountain WN + - East Dark Death Mountain WS + - East Dark Death Mountain EN + - Death Mountain TR Pegs WN + - Turtle Rock WN + - Zora Waterfall NE + - Zora Waterfall SE + - Catfish SE + - Graveyard EC + - Dark Graveyard EC + - River Bend WC + - River Bend EN + - River Bend EC + - River Bend ES + - River Bend SW + - River Bend SC + - River Bend SE + - Qirn Jump WC + - Qirn Jump EN + - Qirn Jump EC + - Qirn Jump ES + - Qirn Jump SW + - Qirn Jump SC + - Qirn Jump SE + - Potion Shop WN + - Potion Shop WC + - Potion Shop WS + - Potion Shop EN + - Potion Shop EC + - Dark Witch WN + - Dark Witch WC + - Dark Witch WS + - Dark Witch EN + - Dark Witch EC + - Zora Approach NE + - Zora Approach WN + - Zora Approach WC + - Catfish Approach NE + - Catfish Approach WN + - Catfish Approach WC + - Wooden Bridge NW + - Wooden Bridge NC + - Wooden Bridge NE + - Broken Bridge NW + - Broken Bridge NC + - Broken Bridge NE + - Zoras Domain SW southwest: - - Kakariko ES - - Kakariko SE - - Village of Outcasts ES - - Village of Outcasts SE - - Hyrule Castle SW - - Pyramid SW - - Blacksmith WS - - Hammer Pegs WS - - Maze Race ES - - Dig Game EC - - Dig Game ES - - Kakariko Suburb NE - - Kakariko Suburb WS - - Kakariko Suburb ES - - Frog NE - - Frog WC - - Frog WS - - Frog ES - - Flute Boy WS - - Flute Boy SW - - Flute Boy SC - - Stumpy WS - - Stumpy SW - - Stumpy SC - - Central Bonk Rocks NW - - Central Bonk Rocks SW - - Dark Bonk Rocks NW - - Dark Bonk Rocks SW - - Desert EC - - Desert ES - - Flute Boy Approach NW - - Flute Boy Approach NC - - Flute Boy Approach EC - - Stumpy Approach NW - - Stumpy Approach NC - - Stumpy Approach EC - - C Whirlpool NW - - C Whirlpool WC - - C Whirlpool SC - - Dark C Whirlpool NW - - Dark C Whirlpool WC - - Dark C Whirlpool SC - - Desert Pass WC - - Desert Pass WS - - Desert Pass EC - - Desert Pass ES - - Swamp Nook EC - - Swamp Nook ES - - Dam NC - - Dam WC - - Dam WS - - Swamp NC - - Swamp WC - - Swamp WS + - Kakariko ES + - Kakariko SE + - Village of Outcasts ES + - Village of Outcasts SE + - Hyrule Castle SW + - Pyramid SW + - Blacksmith WS + - Hammer Pegs WS + - Maze Race ES + - Dig Game EC + - Dig Game ES + - Kakariko Suburb NE + - Kakariko Suburb WS + - Kakariko Suburb ES + - Frog NE + - Frog WC + - Frog WS + - Frog ES + - Flute Boy WS + - Flute Boy SW + - Flute Boy SC + - Stumpy WS + - Stumpy SW + - Stumpy SC + - Central Bonk Rocks NW + - Central Bonk Rocks SW + - Dark Bonk Rocks NW + - Dark Bonk Rocks SW + - Desert EC + - Desert ES + - Flute Boy Approach NW + - Flute Boy Approach NC + - Flute Boy Approach EC + - Stumpy Approach NW + - Stumpy Approach NC + - Stumpy Approach EC + - C Whirlpool NW + - C Whirlpool WC + - C Whirlpool SC + - Dark C Whirlpool NW + - Dark C Whirlpool WC + - Dark C Whirlpool SC + - Desert Pass WC + - Desert Pass WS + - Desert Pass EC + - Desert Pass ES + - Swamp Nook EC + - Swamp Nook ES + - Dam NC + - Dam WC + - Dam WS + - Swamp NC + - Swamp WC + - Swamp WS southeast: - - Hyrule Castle ES - - Hyrule Castle SE - - Pyramid ES - - Pyramid SE - - Eastern Palace SW - - Eastern Palace SE - - Palace of Darkness SW - - Palace of Darkness SE - - Sand Dunes WN - - Sand Dunes SC - - Dark Dunes WN - - Dark Dunes SC - - Links House NE - - Links House SC - - Links House ES - - Big Bomb Shop NE - - Big Bomb Shop SC - - Big Bomb Shop ES - - Stone Bridge NC - - Stone Bridge WC - - Stone Bridge WS - - Stone Bridge EN - - Stone Bridge EC - - Stone Bridge SC - - Hammer Bridge NC - - Hammer Bridge WS - - Hammer Bridge EN - - Hammer Bridge EC - - Hammer Bridge SC - - Tree Line NW - - Tree Line WN - - Tree Line WC - - Tree Line SC - - Tree Line SE - - Dark Tree Line NW - - Dark Tree Line WN - - Dark Tree Line WC - - Dark Tree Line SC - - Dark Tree Line SE - - Eastern Nook NE - - Palace of Darkness Nook NE - - Statues NC - - Statues SC - - Hype Cave NC - - Hype Cave SC - - Lake Hylia NW - - Lake Hylia NC - - Lake Hylia NE - - Lake Hylia WS - - Lake Hylia EC - - Lake Hylia ES - - Ice Lake NW - - Ice Lake NC - - Ice Lake NE - - Ice Lake WS - - Ice Lake EC - - Ice Lake ES - - Ice Cave SW - - Ice Cave SE - - Shopping Mall SW - - Shopping Mall SE - - South Pass NC - - South Pass ES - - Dark South Pass NC - - Dark South Pass ES - - Octoballoon NW - - Octoballoon NE - - Octoballoon WC - - Octoballoon WS - - Bomber Corner NW - - Bomber Corner NE - - Bomber Corner WC - - Bomber Corner WS - - Hobo EC \ No newline at end of file + - Hyrule Castle ES + - Hyrule Castle SE + - Pyramid ES + - Pyramid SE + - Eastern Palace SW + - Eastern Palace SE + - Palace of Darkness SW + - Palace of Darkness SE + - Sand Dunes WN + - Sand Dunes SC + - Dark Dunes WN + - Dark Dunes SC + - Links House NE + - Links House SC + - Links House ES + - Big Bomb Shop NE + - Big Bomb Shop SC + - Big Bomb Shop ES + - Stone Bridge NC + - Stone Bridge WC + - Stone Bridge WS + - Stone Bridge EN + - Stone Bridge EC + - Stone Bridge SC + - Hammer Bridge NC + - Hammer Bridge WS + - Hammer Bridge EN + - Hammer Bridge EC + - Hammer Bridge SC + - Tree Line NW + - Tree Line WN + - Tree Line WC + - Tree Line SC + - Tree Line SE + - Dark Tree Line NW + - Dark Tree Line WN + - Dark Tree Line WC + - Dark Tree Line SC + - Dark Tree Line SE + - Eastern Nook NE + - Palace of Darkness Nook NE + - Statues NC + - Statues SC + - Hype Cave NC + - Hype Cave SC + - Lake Hylia NW + - Lake Hylia NC + - Lake Hylia NE + - Lake Hylia WS + - Lake Hylia EC + - Lake Hylia ES + - Ice Lake NW + - Ice Lake NC + - Ice Lake NE + - Ice Lake WS + - Ice Lake EC + - Ice Lake ES + - Ice Cave SW + - Ice Cave SE + - Shopping Mall SW + - Shopping Mall SE + - South Pass NC + - South Pass ES + - Dark South Pass NC + - Dark South Pass ES + - Octoballoon NW + - Octoballoon NE + - Octoballoon WC + - Octoballoon WS + - Bomber Corner NW + - Bomber Corner NE + - Bomber Corner WC + - Bomber Corner WS + - Hobo EC \ No newline at end of file diff --git a/presets/world/owr_ringshuffle-borders.yaml b/presets/world/owr_ringshuffle-borders.yaml new file mode 100644 index 00000000..3cbdb28f --- /dev/null +++ b/presets/world/owr_ringshuffle-borders.yaml @@ -0,0 +1,214 @@ +ow-edges: + 1: + two-way: + Lost Woods NW: Master Sword Meadow SC + Lost Woods EN*: Lumberjack WN* + Lost Woods SW*: Lost Woods Pass NW* + Lost Woods SC*: Lost Woods Pass NE* + Skull Woods EN*: Dark Lumberjack WN* + Skull Woods SW*: Skull Woods Pass NW* + Skull Woods SC*: Skull Woods Pass NE* + West Death Mountain EN*: East Death Mountain WN* + West Dark Death Mountain EN*: East Dark Death Mountain WN* + East Death Mountain EN*: Death Mountain TR Pegs WN* + East Dark Death Mountain EN*: Turtle Rock WN* + Zora Waterfall NE: Zoras Domain SW + Zora Waterfall SE*: Zora Approach NE* + Catfish SE*: Catfish Approach NE* + Lost Woods Pass SW*: Kakariko NW* + Lost Woods Pass SE*: Kakariko NC* + Skull Woods Pass SW*: Village of Outcasts NW* + Skull Woods Pass SE*: Village of Outcasts NC* + Eastern Palace SE*: Eastern Nook NE* + Palace of Darkness SE*: Palace of Darkness Nook NE* + Desert EC: Desert Pass WC + Desert ES: Desert Pass WS + Lake Hylia WS*: South Pass ES* + Lake Hylia EC*: Octoballoon WC* + Lake Hylia ES*: Octoballoon WS* + Ice Lake WS*: Dark South Pass ES* + Ice Lake EC*: Bomber Corner WC* + Ice Lake ES*: Bomber Corner WS* + Ice Cave SW*: Octoballoon NW* + Ice Cave SE*: Octoballoon NE* + Shopping Mall SW*: Bomber Corner NW* + Shopping Mall SE*: Bomber Corner NE* + Desert Pass EC*: Dam WC* + Desert Pass ES*: Dam WS* + Swamp Nook EC*: Swamp WC* + Swamp Nook ES*: Swamp WS* + Dam EC*: South Pass WC* + Swamp EC*: Dark South Pass WC* + Lost Woods SE*: Kakariko Fortune NE* + Skull Woods SE*: Dark Fortune NE* + West Death Mountain ES*: East Death Mountain WS* + West Dark Death Mountain ES*: East Dark Death Mountain WS* + Kakariko Fortune SC*: Kakariko NE* + Dark Fortune SC*: Village of Outcasts NE* + Kakariko SE*: Kakariko Suburb NE* + Village of Outcasts SE*: Frog NE* + Eastern Palace SW*: Tree Line NW* + Palace of Darkness SW*: Dark Tree Line NW* + Tree Line SC*: Lake Hylia NC* + Tree Line SE*: Lake Hylia NE* + Dark Tree Line SC*: Ice Lake NC* + Dark Tree Line SE*: Ice Lake NE* + Flute Boy Approach EC*: C Whirlpool WC* + Stumpy Approach EC*: Dark C Whirlpool WC* + C Whirlpool EN*: Statues WN* + C Whirlpool EC*: Statues WC* + C Whirlpool ES*: Statues WS* + Dark C Whirlpool EN*: Hype Cave WN* + Dark C Whirlpool EC*: Hype Cave WC* + Dark C Whirlpool ES*: Hype Cave WS* + Kakariko Pond EN*: Sanctuary WN* + Kakariko Pond ES*: Sanctuary WS* + Kakariko Pond SW*: Forgotten Forest NW* + Kakariko Pond SE*: Forgotten Forest NE* + Outcast Pond EN*: Dark Chapel WN* + Outcast Pond ES*: Dark Chapel WS* + Outcast Pond SW*: Shield Shop NW* + Outcast Pond SE*: Shield Shop NE* + Sanctuary EC*: Graveyard WC* + Dark Chapel EC*: Dark Graveyard WC* + Graveyard EC*: River Bend WC* + Dark Graveyard EC*: Qirn Jump WC* + River Bend SW*: Wooden Bridge NW* + River Bend SC*: Wooden Bridge NC* + River Bend SE*: Wooden Bridge NE* + Qirn Jump SW*: Broken Bridge NW* + Qirn Jump SC*: Broken Bridge NC* + Qirn Jump SE*: Broken Bridge NE* + Wooden Bridge SW*: Sand Dunes NW* + Broken Bridge SW*: Dark Dunes NW* + Sand Dunes SC*: Stone Bridge NC* + Dark Dunes SC*: Hammer Bridge NC* + Central Bonk Rocks EN*: Links House WN* + Central Bonk Rocks EC*: Links House WC* + Central Bonk Rocks ES*: Links House WS* + Dark Bonk Rocks EN*: Big Bomb Shop WN* + Dark Bonk Rocks EC*: Big Bomb Shop WC* + Dark Bonk Rocks ES*: Big Bomb Shop WS* + Links House ES*: Stone Bridge WS* + Big Bomb Shop ES*: Hammer Bridge WS* + Stone Bridge WC: Hobo EC + groups: + border12_nw: + - Potion Shop EN + - Potion Shop EC + - Dark Witch EN + - Dark Witch EC + - Zora Approach WN + - Zora Approach WC + - Catfish Approach WN + - Catfish Approach WC + - C Whirlpool SC + - Dark C Whirlpool SC + - Statues SC + - Hype Cave SC + - Dam NC + - Swamp NC + - South Pass NC + - Dark South Pass NC + border12_es: + - Lumberjack SW + - Dark Lumberjack SW + - Mountain Pass NW + - Bumper Cave NW + - Maze Race ES + - Dig Game EC + - Dig Game ES + - Kakariko Suburb WS + - Frog WC + - Frog WS + border23_nw: + - River Bend EN + - River Bend EC + - River Bend ES + - Qirn Jump EN + - Qirn Jump EC + - Qirn Jump ES + - Potion Shop WN + - Potion Shop WC + - Potion Shop WS + - Dark Witch WN + - Dark Witch WC + - Dark Witch WS + - Flute Boy SW + - Flute Boy SC + - Stumpy SW + - Stumpy SC + - Central Bonk Rocks SW + - Dark Bonk Rocks SW + - Links House SC + - Big Bomb Shop SC + - Stone Bridge EN + - Stone Bridge EC + - Stone Bridge SC + - Hammer Bridge EN + - Hammer Bridge EC + - Hammer Bridge SC + - Tree Line WN + - Tree Line WC + - Dark Tree Line WN + - Dark Tree Line WC + - Flute Boy Approach NW + - Flute Boy Approach NC + - Stumpy Approach NW + - Stumpy Approach NC + - C Whirlpool NW + - Dark C Whirlpool NW + - Statues NC + - Hype Cave NC + - Lake Hylia NW + - Ice Lake NW + border23_es: + - Mountain Pass SE + - Bumper Cave SE + - Kakariko Fortune EN + - Kakariko Fortune ES + - Dark Fortune EN + - Dark Fortune ES + - Kakariko Pond NE + - Kakariko Pond WN + - Kakariko Pond WS + - Outcast Pond NE + - Outcast Pond WN + - Outcast Pond WS + - Kakariko ES + - Village of Outcasts ES + - Blacksmith WS + - Hammer Pegs WS + - Kakariko Suburb ES + - Frog ES + - Flute Boy WS + - Stumpy WS + border34_nw: + - Hyrule Castle ES + - Hyrule Castle SW + - Hyrule Castle SE + - Pyramid ES + - Pyramid SW + - Pyramid SE + - Sand Dunes WN + - Dark Dunes WN + - Central Bonk Rocks NW + - Dark Bonk Rocks NW + - Links House NE + - Big Bomb Shop NE + border34_es: + - Forgotten Forest ES + - Hyrule Castle WN +ow-whirlpools: + 1: + two-way: + Zora Whirlpool: Lake Hylia Whirlpool +ow-tileflips: + 1: + force_together: + Forest: + - 0x1a + - 0x1b + FrogDig: + - 0x28 + - 0x29 \ No newline at end of file diff --git a/presets/world/owr_ringshuffle-full.yaml b/presets/world/owr_ringshuffle-full.yaml new file mode 100644 index 00000000..c271befe --- /dev/null +++ b/presets/world/owr_ringshuffle-full.yaml @@ -0,0 +1,313 @@ +ow-edges: + 1: + groups: + ring1: + - Lost Woods NW + - Lost Woods EN + - Lost Woods SW + - Lost Woods SC + - Skull Woods EN + - Skull Woods SW + - Skull Woods SC + - Lumberjack WN + - Dark Lumberjack WN + - West Death Mountain EN + - West Dark Death Mountain EN + - East Death Mountain WN + - East Death Mountain EN + - East Dark Death Mountain WN + - East Dark Death Mountain EN + - Death Mountain TR Pegs WN + - Turtle Rock WN + - Zora Waterfall NE + - Zora Waterfall SE + - Catfish SE + - Lost Woods Pass NW + - Lost Woods Pass NE + - Lost Woods Pass SW + - Lost Woods Pass SE + - Skull Woods Pass NW + - Skull Woods Pass NE + - Skull Woods Pass SW + - Skull Woods Pass SE + - Zora Approach NE + - Catfish Approach NE + - Kakariko NW + - Kakariko NC + - Village of Outcasts NW + - Village of Outcasts NC + - Eastern Palace SE + - Palace of Darkness SE + - Eastern Nook NE + - Palace of Darkness Nook NE + - Desert EC + - Desert ES + - Lake Hylia WS + - Lake Hylia EC + - Lake Hylia ES + - Ice Lake WS + - Ice Lake EC + - Ice Lake ES + - Ice Cave SW + - Ice Cave SE + - Shopping Mall SW + - Shopping Mall SE + - Desert Pass WC + - Desert Pass WS + - Desert Pass EC + - Desert Pass ES + - Swamp Nook EC + - Swamp Nook ES + - Dam WC + - Dam WS + - Dam EC + - Swamp WC + - Swamp WS + - Swamp EC + - South Pass WC + - South Pass ES + - Dark South Pass WC + - Dark South Pass ES + - Octoballoon NW + - Octoballoon NE + - Octoballoon WC + - Octoballoon WS + - Bomber Corner NW + - Bomber Corner NE + - Bomber Corner WC + - Bomber Corner WS + - Master Sword Meadow SC + - Zoras Domain SW + ring2: + - Lost Woods SE + - Skull Woods SE + - West Death Mountain ES + - West Dark Death Mountain ES + - East Death Mountain WS + - East Dark Death Mountain WS + - Kakariko Fortune NE + - Kakariko Fortune SC + - Dark Fortune NE + - Dark Fortune SC + - Kakariko NE + - Kakariko SE + - Village of Outcasts NE + - Village of Outcasts SE + - Eastern Palace SW + - Palace of Darkness SW + - Kakariko Suburb NE + - Frog NE + - Tree Line NW + - Tree Line SC + - Tree Line SE + - Dark Tree Line NW + - Dark Tree Line SC + - Dark Tree Line SE + - Flute Boy Approach EC + - Stumpy Approach EC + - C Whirlpool WC + - C Whirlpool EN + - C Whirlpool EC + - C Whirlpool ES + - Dark C Whirlpool WC + - Dark C Whirlpool EN + - Dark C Whirlpool EC + - Dark C Whirlpool ES + - Statues WN + - Statues WC + - Statues WS + - Hype Cave WN + - Hype Cave WC + - Hype Cave WS + - Lake Hylia NC + - Lake Hylia NE + - Ice Lake NC + - Ice Lake NE + ring3: + - Kakariko Pond EN + - Kakariko Pond ES + - Kakariko Pond SW + - Kakariko Pond SE + - Outcast Pond EN + - Outcast Pond ES + - Outcast Pond SW + - Outcast Pond SE + - Sanctuary WN + - Sanctuary WS + - Sanctuary EC + - Dark Chapel WN + - Dark Chapel WS + - Dark Chapel EC + - Graveyard WC + - Graveyard EC + - Dark Graveyard WC + - Dark Graveyard EC + - River Bend WC + - River Bend SW + - River Bend SC + - River Bend SE + - Qirn Jump WC + - Qirn Jump SW + - Qirn Jump SC + - Qirn Jump SE + - Forgotten Forest NW + - Forgotten Forest NE + - Shield Shop NW + - Shield Shop NE + - Wooden Bridge NW + - Wooden Bridge NC + - Wooden Bridge NE + - Wooden Bridge SW + - Broken Bridge NW + - Broken Bridge NC + - Broken Bridge NE + - Broken Bridge SW + - Sand Dunes NW + - Sand Dunes SC + - Dark Dunes NW + - Dark Dunes SC + - Central Bonk Rocks EN + - Central Bonk Rocks EC + - Central Bonk Rocks ES + - Dark Bonk Rocks EN + - Dark Bonk Rocks EC + - Dark Bonk Rocks ES + - Links House WN + - Links House WC + - Links House WS + - Links House ES + - Big Bomb Shop WN + - Big Bomb Shop WC + - Big Bomb Shop WS + - Big Bomb Shop ES + - Stone Bridge NC + - Stone Bridge WC + - Stone Bridge WS + - Hammer Bridge NC + - Hammer Bridge WS + - Hobo EC + border12_nw: + - Potion Shop EN + - Potion Shop EC + - Dark Witch EN + - Dark Witch EC + - Zora Approach WN + - Zora Approach WC + - Catfish Approach WN + - Catfish Approach WC + - C Whirlpool SC + - Dark C Whirlpool SC + - Statues SC + - Hype Cave SC + - Dam NC + - Swamp NC + - South Pass NC + - Dark South Pass NC + border12_es: + - Lumberjack SW + - Dark Lumberjack SW + - Mountain Pass NW + - Bumper Cave NW + - Maze Race ES + - Dig Game EC + - Dig Game ES + - Kakariko Suburb WS + - Frog WC + - Frog WS + border23_nw: + - River Bend EN + - River Bend EC + - River Bend ES + - Qirn Jump EN + - Qirn Jump EC + - Qirn Jump ES + - Potion Shop WN + - Potion Shop WC + - Potion Shop WS + - Dark Witch WN + - Dark Witch WC + - Dark Witch WS + - Flute Boy SW + - Flute Boy SC + - Stumpy SW + - Stumpy SC + - Central Bonk Rocks SW + - Dark Bonk Rocks SW + - Links House SC + - Big Bomb Shop SC + - Stone Bridge EN + - Stone Bridge EC + - Stone Bridge SC + - Hammer Bridge EN + - Hammer Bridge EC + - Hammer Bridge SC + - Tree Line WN + - Tree Line WC + - Dark Tree Line WN + - Dark Tree Line WC + - Flute Boy Approach NW + - Flute Boy Approach NC + - Stumpy Approach NW + - Stumpy Approach NC + - C Whirlpool NW + - Dark C Whirlpool NW + - Statues NC + - Hype Cave NC + - Lake Hylia NW + - Ice Lake NW + border23_es: + - Mountain Pass SE + - Bumper Cave SE + - Kakariko Fortune EN + - Kakariko Fortune ES + - Dark Fortune EN + - Dark Fortune ES + - Kakariko Pond NE + - Kakariko Pond WN + - Kakariko Pond WS + - Outcast Pond NE + - Outcast Pond WN + - Outcast Pond WS + - Kakariko ES + - Village of Outcasts ES + - Blacksmith WS + - Hammer Pegs WS + - Kakariko Suburb ES + - Frog ES + - Flute Boy WS + - Stumpy WS + border34_nw: + - Hyrule Castle ES + - Hyrule Castle SW + - Hyrule Castle SE + - Pyramid ES + - Pyramid SW + - Pyramid SE + - Sand Dunes WN + - Dark Dunes WN + - Central Bonk Rocks NW + - Dark Bonk Rocks NW + - Links House NE + - Big Bomb Shop NE + border34_es: + - Forgotten Forest ES + - Hyrule Castle WN +ow-tileflips: + 1: + force_together: + PedHobo: + - 0x00 + - 0x2d + - 0x80 + Zora: + - 0x0f + - 0x81 + Forest: + - 0x1a + - 0x1b + FrogDig: + - 0x28 + - 0x29 + Desert: + - 0x30 + - 0x3a \ No newline at end of file diff --git a/presets/world/owr_ringshuffle-interiors.yaml b/presets/world/owr_ringshuffle-interiors.yaml new file mode 100644 index 00000000..0dcfbaa7 --- /dev/null +++ b/presets/world/owr_ringshuffle-interiors.yaml @@ -0,0 +1,258 @@ +ow-edges: + 1: + two-way: + Lumberjack SW: Mountain Pass NW + Dark Lumberjack SW: Bumper Cave NW + Potion Shop EN: Zora Approach WN + Potion Shop EC: Zora Approach WC + Dark Witch EN: Catfish Approach WN + Dark Witch EC: Catfish Approach WC + Maze Race ES: Kakariko Suburb WS + Dig Game EC: Frog WC + Dig Game ES: Frog WS + C Whirlpool SC: Dam NC + Dark C Whirlpool SC: Swamp NC + Statues SC: South Pass NC + Hype Cave SC: Dark South Pass NC + Mountain Pass SE: Kakariko Pond NE + Bumper Cave SE: Outcast Pond NE + Kakariko Fortune EN: Kakariko Pond WN + Kakariko Fortune ES: Kakariko Pond WS + Dark Fortune EN: Outcast Pond WN + Dark Fortune ES: Outcast Pond WS + River Bend EN: Potion Shop WN + River Bend EC: Potion Shop WC + River Bend ES: Potion Shop WS + Qirn Jump EN: Dark Witch WN + Qirn Jump EC: Dark Witch WC + Qirn Jump ES: Dark Witch WS + Kakariko ES: Blacksmith WS + Village of Outcasts ES: Hammer Pegs WS + Kakariko Suburb ES: Flute Boy WS + Frog ES: Stumpy WS + Flute Boy SW: Flute Boy Approach NW + Flute Boy SC: Flute Boy Approach NC + Stumpy SW: Stumpy Approach NW + Stumpy SC: Stumpy Approach NC + Central Bonk Rocks SW: C Whirlpool NW + Dark Bonk Rocks SW: Dark C Whirlpool NW + Links House SC: Statues NC + Big Bomb Shop SC: Hype Cave NC + Stone Bridge EN: Tree Line WN + Stone Bridge EC: Tree Line WC + Stone Bridge SC: Lake Hylia NW + Hammer Bridge EN: Dark Tree Line WN + Hammer Bridge EC: Dark Tree Line WC + Hammer Bridge SC: Ice Lake NW + Forgotten Forest ES: Hyrule Castle WN + Hyrule Castle ES: Sand Dunes WN + Hyrule Castle SW: Central Bonk Rocks NW + Hyrule Castle SE: Links House NE + Pyramid ES: Dark Dunes WN + Pyramid SW: Dark Bonk Rocks NW + Pyramid SE: Big Bomb Shop NE + groups: + ring1: + - Lost Woods NW + - Lost Woods EN + - Lost Woods SW + - Lost Woods SC + - Skull Woods EN + - Skull Woods SW + - Skull Woods SC + - Lumberjack WN + - Dark Lumberjack WN + - West Death Mountain EN + - West Dark Death Mountain EN + - East Death Mountain WN + - East Death Mountain EN + - East Dark Death Mountain WN + - East Dark Death Mountain EN + - Death Mountain TR Pegs WN + - Turtle Rock WN + - Zora Waterfall NE + - Zora Waterfall SE + - Catfish SE + - Lost Woods Pass NW + - Lost Woods Pass NE + - Lost Woods Pass SW + - Lost Woods Pass SE + - Skull Woods Pass NW + - Skull Woods Pass NE + - Skull Woods Pass SW + - Skull Woods Pass SE + - Zora Approach NE + - Catfish Approach NE + - Kakariko NW + - Kakariko NC + - Village of Outcasts NW + - Village of Outcasts NC + - Eastern Palace SE + - Palace of Darkness SE + - Eastern Nook NE + - Palace of Darkness Nook NE + - Desert EC + - Desert ES + - Lake Hylia WS + - Lake Hylia EC + - Lake Hylia ES + - Ice Lake WS + - Ice Lake EC + - Ice Lake ES + - Ice Cave SW + - Ice Cave SE + - Shopping Mall SW + - Shopping Mall SE + - Desert Pass WC + - Desert Pass WS + - Desert Pass EC + - Desert Pass ES + - Swamp Nook EC + - Swamp Nook ES + - Dam WC + - Dam WS + - Dam EC + - Swamp WC + - Swamp WS + - Swamp EC + - South Pass WC + - South Pass ES + - Dark South Pass WC + - Dark South Pass ES + - Octoballoon NW + - Octoballoon NE + - Octoballoon WC + - Octoballoon WS + - Bomber Corner NW + - Bomber Corner NE + - Bomber Corner WC + - Bomber Corner WS + - Master Sword Meadow SC + - Zoras Domain SW + ring2: + - Lost Woods SE + - Skull Woods SE + - West Death Mountain ES + - West Dark Death Mountain ES + - East Death Mountain WS + - East Dark Death Mountain WS + - Kakariko Fortune NE + - Kakariko Fortune SC + - Dark Fortune NE + - Dark Fortune SC + - Kakariko NE + - Kakariko SE + - Village of Outcasts NE + - Village of Outcasts SE + - Eastern Palace SW + - Palace of Darkness SW + - Kakariko Suburb NE + - Frog NE + - Tree Line NW + - Tree Line SC + - Tree Line SE + - Dark Tree Line NW + - Dark Tree Line SC + - Dark Tree Line SE + - Flute Boy Approach EC + - Stumpy Approach EC + - C Whirlpool WC + - C Whirlpool EN + - C Whirlpool EC + - C Whirlpool ES + - Dark C Whirlpool WC + - Dark C Whirlpool EN + - Dark C Whirlpool EC + - Dark C Whirlpool ES + - Statues WN + - Statues WC + - Statues WS + - Hype Cave WN + - Hype Cave WC + - Hype Cave WS + - Lake Hylia NC + - Lake Hylia NE + - Ice Lake NC + - Ice Lake NE + ring3: + - Kakariko Pond EN + - Kakariko Pond ES + - Kakariko Pond SW + - Kakariko Pond SE + - Outcast Pond EN + - Outcast Pond ES + - Outcast Pond SW + - Outcast Pond SE + - Sanctuary WN + - Sanctuary WS + - Sanctuary EC + - Dark Chapel WN + - Dark Chapel WS + - Dark Chapel EC + - Graveyard WC + - Graveyard EC + - Dark Graveyard WC + - Dark Graveyard EC + - River Bend WC + - River Bend SW + - River Bend SC + - River Bend SE + - Qirn Jump WC + - Qirn Jump SW + - Qirn Jump SC + - Qirn Jump SE + - Forgotten Forest NW + - Forgotten Forest NE + - Shield Shop NW + - Shield Shop NE + - Wooden Bridge NW + - Wooden Bridge NC + - Wooden Bridge NE + - Wooden Bridge SW + - Broken Bridge NW + - Broken Bridge NC + - Broken Bridge NE + - Broken Bridge SW + - Sand Dunes NW + - Sand Dunes SC + - Dark Dunes NW + - Dark Dunes SC + - Central Bonk Rocks EN + - Central Bonk Rocks EC + - Central Bonk Rocks ES + - Dark Bonk Rocks EN + - Dark Bonk Rocks EC + - Dark Bonk Rocks ES + - Links House WN + - Links House WC + - Links House WS + - Links House ES + - Big Bomb Shop WN + - Big Bomb Shop WC + - Big Bomb Shop WS + - Big Bomb Shop ES + - Stone Bridge NC + - Stone Bridge WC + - Stone Bridge WS + - Hammer Bridge NC + - Hammer Bridge WS + - Hobo EC +ow-whirlpools: + 1: + two-way: + Kakariko Pond Whirlpool: Octoballoon Whirlpool + Qirn Jump Whirlpool: Bomber Corner Whirlpool + River Bend Whirlpool: C Whirlpool +ow-tileflips: + 1: + force_together: + PedHobo: + - 0x00 + - 0x2d + - 0x80 + Zora: + - 0x0f + - 0x81 + Desert: + - 0x30 + - 0x3a \ No newline at end of file diff --git a/presets/world/owr_shuffle-largescreens.yaml b/presets/world/owr_shuffle-largescreens.yaml index 6c54658c..47798cfa 100644 --- a/presets/world/owr_shuffle-largescreens.yaml +++ b/presets/world/owr_shuffle-largescreens.yaml @@ -202,9 +202,9 @@ ow-edges: ow-tileflips: 1: force_together: - 1: + Pedestal: - 0x00 - 0x80 - 2: + Zora: - 0x0f - 0x81 \ No newline at end of file diff --git a/presets/world/owr_shuffle-separatemountain.yaml b/presets/world/owr_shuffle-separatemountain.yaml index b1078849..02a53d9c 100644 --- a/presets/world/owr_shuffle-separatemountain.yaml +++ b/presets/world/owr_shuffle-separatemountain.yaml @@ -2,15 +2,15 @@ ow-edges: 1: groups: mountain: - - West Death Mountain EN - - West Death Mountain ES - - West Dark Death Mountain EN - - West Dark Death Mountain ES - - East Death Mountain WN - - East Death Mountain WS - - East Death Mountain EN - - East Dark Death Mountain WN - - East Dark Death Mountain WS - - East Dark Death Mountain EN - - Death Mountain TR Pegs WN - - Turtle Rock WN + - West Death Mountain EN + - West Death Mountain ES + - West Dark Death Mountain EN + - West Dark Death Mountain ES + - East Death Mountain WN + - East Death Mountain WS + - East Death Mountain EN + - East Dark Death Mountain WN + - East Dark Death Mountain WS + - East Dark Death Mountain EN + - Death Mountain TR Pegs WN + - Turtle Rock WN diff --git a/presets/world/owr_shuffle-splitsimilar.yaml b/presets/world/owr_shuffle-splitsimilar.yaml new file mode 100644 index 00000000..bf1dde3d --- /dev/null +++ b/presets/world/owr_shuffle-splitsimilar.yaml @@ -0,0 +1,123 @@ +settings: + 1: + ow_terrain: false +ow-edges: + 1: + groups: + similar_2_left_top: + - Lost Woods SW + - Skull Woods SW + - Lost Woods Pass NW + - Lost Woods Pass SW + - Skull Woods Pass NW + - Skull Woods Pass SW + - Kakariko Fortune EN + - Dark Fortune EN + - Kakariko Pond WN + - Kakariko Pond EN + - Kakariko Pond SW + - Outcast Pond WN + - Outcast Pond EN + - Outcast Pond SW + - Sanctuary WN + - Dark Chapel WN + - River Bend EC + - River Bend SW + - Qirn Jump EC + - Qirn Jump SW + - Potion Shop WC + - Dark Witch WC + - Kakariko NW + - Village of Outcasts NW + - Forgotten Forest NW + - Shield Shop NW + - Wooden Bridge NW + - Broken Bridge NW + - Dig Game EC + - Frog WC + - Flute Boy SW + - Stumpy SW + - Desert EC + - Flute Boy Approach NW + - Stumpy Approach NW + - C Whirlpool EN + - Dark C Whirlpool EN + - Statues WN + - Hype Cave WN + - Desert Pass WC + - Desert Pass EC + - Swamp Nook EC + - Dam WC + - Swamp WC + similar_2_right_bottom: + - Lost Woods SC + - Skull Woods SC + - Lost Woods Pass NE + - Lost Woods Pass SE + - Skull Woods Pass NE + - Skull Woods Pass SE + - Kakariko Fortune ES + - Dark Fortune ES + - Kakariko Pond WS + - Kakariko Pond ES + - Kakariko Pond SE + - Outcast Pond WS + - Outcast Pond ES + - Outcast Pond SE + - Sanctuary WS + - Dark Chapel WS + - River Bend ES + - River Bend SE + - Qirn Jump ES + - Qirn Jump SE + - Potion Shop WS + - Dark Witch WS + - Kakariko NC + - Village of Outcasts NC + - Forgotten Forest NE + - Shield Shop NE + - Wooden Bridge NE + - Broken Bridge NE + - Dig Game ES + - Frog WS + - Flute Boy SC + - Stumpy SC + - Desert ES + - Flute Boy Approach NC + - Stumpy Approach NC + - C Whirlpool ES + - Dark C Whirlpool ES + - Statues WS + - Hype Cave WS + - Desert Pass WS + - Desert Pass ES + - Swamp Nook ES + - Dam WS + - Swamp WS + similar_3_left_top: + - Central Bonk Rocks EN + - Dark Bonk Rocks EN + - Links House WN + - Big Bomb Shop WN + similar_3_middle: + - Central Bonk Rocks EC + - Dark Bonk Rocks EC + - Links House WC + - Big Bomb Shop WC + similar_3_right_bottom: + - Central Bonk Rocks ES + - Dark Bonk Rocks ES + - Links House WS + - Big Bomb Shop WS +ow-tileflips: + 1: + force_together: + Forest: + - 0x1a + - 0x1b + FrogDig: + - 0x28 + - 0x29 + Desert: + - 0x30 + - 0x3a \ No newline at end of file diff --git a/presets/world/owr_shuffle-splitsimilarterrain.yaml b/presets/world/owr_shuffle-splitsimilarterrain.yaml new file mode 100644 index 00000000..2ade18e4 --- /dev/null +++ b/presets/world/owr_shuffle-splitsimilarterrain.yaml @@ -0,0 +1,175 @@ +settings: + 1: + ow_terrain: true +ow-edges: + 1: + groups: + similar_2_left_top: + - Lost Woods SW + - Skull Woods SW + - Lost Woods Pass NW + - Lost Woods Pass SW + - Skull Woods Pass NW + - Skull Woods Pass SW + - Kakariko Fortune EN + - Dark Fortune EN + - Kakariko Pond WN + - Kakariko Pond EN + - Kakariko Pond SW + - Outcast Pond WN + - Outcast Pond EN + - Outcast Pond SW + - Sanctuary WN + - Dark Chapel WN + - Potion Shop EN + - Dark Witch EN + - Zora Approach WN + - Catfish Approach WN + - Kakariko NW + - Village of Outcasts NW + - Forgotten Forest NW + - Shield Shop NW + - Dig Game EC + - Frog WC + - Flute Boy SW + - Stumpy SW + - Stone Bridge EN + - Hammer Bridge EN + - Tree Line WN + - Tree Line SC + - Dark Tree Line WN + - Dark Tree Line SC + - Desert EC + - Flute Boy Approach NW + - Stumpy Approach NW + - Lake Hylia NC + - Lake Hylia EC + - Ice Lake NC + - Ice Lake EC + - Ice Cave SW + - Shopping Mall SW + - Desert Pass WC + - Desert Pass EC + - Swamp Nook EC + - Dam WC + - Swamp WC + - Octoballoon NW + - Octoballoon WC + - Bomber Corner NW + - Bomber Corner WC + similar_2_right_bottom: + - Lost Woods SC + - Skull Woods SC + - Lost Woods Pass NE + - Lost Woods Pass SE + - Skull Woods Pass NE + - Skull Woods Pass SE + - Kakariko Fortune ES + - Dark Fortune ES + - Kakariko Pond WS + - Kakariko Pond ES + - Kakariko Pond SE + - Outcast Pond WS + - Outcast Pond ES + - Outcast Pond SE + - Sanctuary WS + - Dark Chapel WS + - Potion Shop EC + - Dark Witch EC + - Zora Approach WC + - Catfish Approach WC + - Kakariko NC + - Village of Outcasts NC + - Forgotten Forest NE + - Shield Shop NE + - Dig Game ES + - Frog WS + - Flute Boy SC + - Stumpy SC + - Stone Bridge EC + - Hammer Bridge EC + - Tree Line WC + - Tree Line SE + - Dark Tree Line WC + - Dark Tree Line SE + - Desert ES + - Flute Boy Approach NC + - Stumpy Approach NC + - Lake Hylia NE + - Lake Hylia ES + - Ice Lake NE + - Ice Lake ES + - Ice Cave SE + - Shopping Mall SE + - Desert Pass WS + - Desert Pass ES + - Swamp Nook ES + - Dam WS + - Swamp WS + - Octoballoon NE + - Octoballoon WS + - Bomber Corner NE + - Bomber Corner WS + similar_3_left_top: + - River Bend EN + - River Bend SW + - Qirn Jump EN + - Qirn Jump SW + - Potion Shop WN + - Dark Witch WN + - Wooden Bridge NW + - Broken Bridge NW + - Central Bonk Rocks EN + - Dark Bonk Rocks EN + - Links House WN + - Big Bomb Shop WN + - C Whirlpool EN + - Dark C Whirlpool EN + - Statues WN + - Hype Cave WN + similar_3_middle: + - River Bend EC + - River Bend SC + - Qirn Jump EC + - Qirn Jump SC + - Potion Shop WC + - Dark Witch WC + - Wooden Bridge NC + - Broken Bridge NC + - Central Bonk Rocks EC + - Dark Bonk Rocks EC + - Links House WC + - Big Bomb Shop WC + - C Whirlpool EC + - Dark C Whirlpool EC + - Statues WC + - Hype Cave WC + similar_3_right_bottom: + - River Bend ES + - River Bend SE + - Qirn Jump ES + - Qirn Jump SE + - Potion Shop WS + - Dark Witch WS + - Wooden Bridge NE + - Broken Bridge NE + - Central Bonk Rocks ES + - Dark Bonk Rocks ES + - Links House WS + - Big Bomb Shop WS + - C Whirlpool ES + - Dark C Whirlpool ES + - Statues WS + - Hype Cave WS +ow-tileflips: + 1: + force_together: + Forest: + - 0x1a + - 0x1b + FrogDig: + - 0x28 + - 0x29 + Desert: + - 0x30 + - 0x3a \ No newline at end of file diff --git a/presets/world/owr_shuffle-vertical.yaml b/presets/world/owr_shuffle-vertical.yaml index 222834c9..d037f0c7 100644 --- a/presets/world/owr_shuffle-vertical.yaml +++ b/presets/world/owr_shuffle-vertical.yaml @@ -79,9 +79,9 @@ ow-edges: ow-tileflips: 1: force_together: - 1: + Pedestal: - 0x00 - 0x80 - 2: + Zora: - 0x0f - 0x81 \ No newline at end of file diff --git a/presets/world/owr_shuffle-verticalbyrows.yaml b/presets/world/owr_shuffle-verticalbyrows.yaml index 0799a25b..25650d60 100644 --- a/presets/world/owr_shuffle-verticalbyrows.yaml +++ b/presets/world/owr_shuffle-verticalbyrows.yaml @@ -219,9 +219,9 @@ ow-edges: ow-tileflips: 1: force_together: - 1: + Pedestal: - 0x00 - 0x80 - 2: + Zora: - 0x0f - 0x81 \ No newline at end of file From a1f2ee8d916dfa5b9a27845b6f6d4928ce4d9ecb Mon Sep 17 00:00:00 2001 From: codemann8 Date: Thu, 5 Oct 2023 01:05:16 -0500 Subject: [PATCH 16/16] Version bump 0.3.3.1 --- CHANGELOG.md | 8 +++++++- OverworldShuffle.py | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 041d2816..16a5a53d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,15 @@ # Changelog +## 0.3.3.1 +- \~Merged in DR v1.2.0.21~ +- Fixed issue with Old Man death spawning on Pyramid/Castle +- Fixed issue with Mixed OWR + Flute Shuffle placing spots on large screens +- Fixed issue with mirror portals disappearing in Crossed OWR +- Added more OWR preset yamls + some fixes to the existing ones + ## 0.3.3.0 - Added Customizer support for all remaining OWR options - Added several OWR preset yamls (many ideas are thanks to Catobat) -- Fixed issue with Mixed OWR + Flute Shuffle placing spots on large screens - Removed Limited Crossed OWR and renamed Chaos Crossed to Unrestricted Crossed ## 0.3.2.2 diff --git a/OverworldShuffle.py b/OverworldShuffle.py index 76b2e1e9..cd41b663 100644 --- a/OverworldShuffle.py +++ b/OverworldShuffle.py @@ -8,7 +8,7 @@ from OWEdges import OWTileRegions, OWEdgeGroups, OWEdgeGroupsTerrain, OWExitType from OverworldGlitchRules import create_owg_connections from Utils import bidict -version_number = '0.3.3.0' +version_number = '0.3.3.1' # branch indicator is intentionally different across branches version_branch = '-u'