From 621e6442ce3e3a7c8cf454fd4651db9a431fae3c Mon Sep 17 00:00:00 2001 From: codemann8 Date: Wed, 18 Aug 2021 09:23:13 -0500 Subject: [PATCH 1/9] Fixed Standard mode to exclude Flute exits from traversal logic --- DoorShuffle.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DoorShuffle.py b/DoorShuffle.py index 769f4c4a..7c6250c0 100644 --- a/DoorShuffle.py +++ b/DoorShuffle.py @@ -1868,7 +1868,7 @@ def find_accessible_entrances(world, player, builder): connect = ext.connected_region if connect is None or ext.door and ext.door.blocked: continue - if world.mode[player] == 'standard' and builder.name == 'Hyrule Castle' and ext.name in ['Hyrule Castle Main Gate (North)', 'Top of Pyramid (Inner)', 'Inverted Pyramid Entrance' ]: + if world.mode[player] == 'standard' and builder.name == 'Hyrule Castle' and (ext.name.startswith('Flute From') or ext.name in ['Hyrule Castle Main Gate (North)', 'Top of Pyramid (Inner)', 'Inverted Pyramid Entrance']): continue if connect.name in entrances and connect not in visited_entrances: visited_entrances.append(connect.name) From e06b99854b9a69d865488d71bf233b5fcc83dde8 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Thu, 19 Aug 2021 08:36:25 -0500 Subject: [PATCH 2/9] Fixed missing Swordless Mire entry rule --- Rules.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Rules.py b/Rules.py index 3e50c6d4..5b40ec28 100644 --- a/Rules.py +++ b/Rules.py @@ -1487,6 +1487,7 @@ def swordless_rules(world, player): if world.mode[player] != 'inverted': set_rule(world.get_entrance('Agahnims Tower', player), lambda state: state.has('Cape', player) or state.has('Hammer', player) or state.has('Beat Agahnim 1', player)) # barrier gets removed after killing agahnim, relevant for entrance shuffle + set_rule(world.get_entrance('Misery Mire', player), lambda state: state.has_misery_mire_medallion(player)) # sword not required to use medallion for opening in swordless (!) set_rule(world.get_entrance('Turtle Rock', player), lambda state: state.has_turtle_rock_medallion(player) and state.can_reach('Turtle Rock Ledge', 'Region', player)) # sword not required to use medallion for opening in swordless (!) add_bunny_rule(world.get_entrance('Turtle Rock', player), player) add_bunny_rule(world.get_entrance('Misery Mire', player), player) From f2432e13fb2adbd6c51d8bb700bbf138506b62b7 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Thu, 19 Aug 2021 08:37:46 -0500 Subject: [PATCH 3/9] Added new Dark Graveyard North region --- OWEdges.py | 1 + OverworldShuffle.py | 2 ++ Regions.py | 3 ++- Rules.py | 2 ++ 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/OWEdges.py b/OWEdges.py index 4d231070..ebf1b15b 100644 --- a/OWEdges.py +++ b/OWEdges.py @@ -870,6 +870,7 @@ OWTileRegions = bidict({ 'Dark Chapel Area': 0x53, 'Dark Graveyard Area': 0x54, + 'Dark Graveyard North': 0x54, 'Qirn Jump Area': 0x55, 'Qirn Jump East Bank': 0x55, diff --git a/OverworldShuffle.py b/OverworldShuffle.py index c41f9097..ba2e4152 100644 --- a/OverworldShuffle.py +++ b/OverworldShuffle.py @@ -964,6 +964,8 @@ mandatory_connections = [# Whirlpool Connections ('Skull Woods Pass Bush Row (East)', 'Skull Woods Pass West Area'), #pearl ('Skull Woods Pass Rock (Top)', 'Skull Woods Pass East Bottom Area'), #mitts ('Skull Woods Pass Rock (Bottom)', 'Skull Woods Pass East Top Area'), #mitts + ('Dark Graveyard Bush (South)', 'Dark Graveyard North'), #pearl + ('Dark Graveyard Bush (North)', 'Dark Graveyard Area'), #pearl ('Qirn Jump Water Drop', 'Qirn Jump Water'), #flippers ('Qirn Jump East Water Drop', 'Qirn Jump Water'), #flippers ('Qirn Jump Pier', 'Qirn Jump East Bank'), diff --git a/Regions.py b/Regions.py index 9ce0abbc..a7907180 100644 --- a/Regions.py +++ b/Regions.py @@ -148,7 +148,8 @@ def create_regions(world, player): create_dw_region(player, 'Dark Fortune Area', None, ['Fortune Teller (Dark)', 'Kakariko Fortune Mirror Spot', 'Dark Fortune NE', 'Dark Fortune EN', 'Dark Fortune ES', 'Dark Fortune SC']), create_dw_region(player, 'Outcast Pond Area', None, ['Kakariko Pond Mirror Spot', 'Outcast Pond NE', 'Outcast Pond WN', 'Outcast Pond WS', 'Outcast Pond SW', 'Outcast Pond SE', 'Outcast Pond EN', 'Outcast Pond ES']), create_dw_region(player, 'Dark Chapel Area', None, ['Dark Sanctuary Hint', 'Sanctuary Mirror Spot', 'Bonk Rock Ledge Mirror Spot', 'Dark Chapel WN', 'Dark Chapel WS', 'Dark Chapel EC']), - create_dw_region(player, 'Dark Graveyard Area', None, ['Graveyard Ledge Mirror Spot', 'Kings Grave Mirror Spot', 'Dark Graveyard WC', 'Dark Graveyard EC']), + create_dw_region(player, 'Dark Graveyard Area', None, ['Dark Graveyard Bush (South)', 'Dark Graveyard WC', 'Dark Graveyard EC']), + create_dw_region(player, 'Dark Graveyard North', None, ['Graveyard Ledge Mirror Spot', 'Kings Grave Mirror Spot', 'Dark Graveyard Bush (North)']), create_dw_region(player, 'Qirn Jump Area', None, ['Qirn Jump Water Drop', 'River Bend Mirror Spot', 'Qirn Jump WC', 'Qirn Jump SW']), create_dw_region(player, 'Qirn Jump East Bank', None, ['Qirn Jump East Water Drop', 'River Bend East Mirror Spot', 'Qirn Jump SE', 'Qirn Jump EC', 'Qirn Jump ES']), create_dw_region(player, 'Qirn Jump Water', None, ['Qirn Jump Pier', 'Qirn Jump Whirlpool', 'Qirn Jump EN', 'Qirn Jump SC'], Terrain.Water), diff --git a/Rules.py b/Rules.py index 5b40ec28..a148be20 100644 --- a/Rules.py +++ b/Rules.py @@ -1263,6 +1263,8 @@ def ow_bunny_rules(world, player): add_bunny_rule(world.get_entrance('Skull Woods Pass Bush Row (East)', player), player) add_bunny_rule(world.get_entrance('Skull Woods Pass Rock (Top)', player), player) add_bunny_rule(world.get_entrance('Skull Woods Pass Rock (Bottom)', player), player) + add_bunny_rule(world.get_entrance('Dark Graveyard Bush (South)', player), player) + add_bunny_rule(world.get_entrance('Dark Graveyard Bush (North)', player), player) add_bunny_rule(world.get_entrance('Dark Witch Rock (North)', player), player) add_bunny_rule(world.get_entrance('Dark Witch Rock (South)', player), player) add_bunny_rule(world.get_entrance('Catfish Approach Rocks (West)', player), player) From 340e4f766e6c6eab3578dcfe875a899a2494aba0 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Thu, 19 Aug 2021 08:38:52 -0500 Subject: [PATCH 4/9] Added new indirect connections in prep for Big Bomb rules --- EntranceShuffle.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/EntranceShuffle.py b/EntranceShuffle.py index 6d3e0099..7e3ec63a 100644 --- a/EntranceShuffle.py +++ b/EntranceShuffle.py @@ -2369,13 +2369,24 @@ inverted_default_dungeon_connections = [('Ganons Tower', 'Agahnims Tower Portal' indirect_connections = { 'Turtle Rock Ledge': 'Turtle Rock', - 'Pyramid Area': 'Pyramid Fairy', - #'East Dark World': 'Pyramid Fairy', 'Big Bomb Shop': 'Pyramid Fairy', + #'East Dark World': 'Pyramid Fairy', + 'Pyramid Area': 'Pyramid Fairy', # HC Ledge/Courtyard #'Dark Desert': 'Pyramid Fairy', + 'Misery Mire Area': 'Pyramid Fairy', # Desert/Checkerboard Ledge #'West Dark World': 'Pyramid Fairy', + 'Dark Chapel Area': 'Pyramid Fairy', # Bonk Rocks + 'Dark Graveyard North': 'Pyramid Fairy', # Graveyard Ledge/Kings Tomb #'South Dark World': 'Pyramid Fairy', + 'Dig Game Ledge': 'Pyramid Fairy', # Brother House Left + 'Stumpy Approach Area': 'Pyramid Fairy', # Cave 45 + # Inverted Cases #'Light World': 'Pyramid Fairy', + 'Lost Woods West Area': 'Pyramid Fairy', # Skull Woods Back + 'East Death Mountain (Top East)': 'Pyramid Fairy', # Floating Island + 'Blacksmith Area': 'Pyramid Fairy', # Hammerpegs + 'Forgotten Forest Area': 'Pyramid Fairy', # Shield Shop + 'Desert Area': 'Pyramid Fairy', # Mire Area 'Old Man Cave': 'Old Man S&Q' } # format: From 03e9f24ce2b7519cec51da412264ca9420c6f785 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Thu, 19 Aug 2021 09:58:41 -0500 Subject: [PATCH 5/9] Fixed infinite loop issue in OW Shuffle --- OverworldShuffle.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OverworldShuffle.py b/OverworldShuffle.py index ba2e4152..6b3aca9d 100644 --- a/OverworldShuffle.py +++ b/OverworldShuffle.py @@ -230,11 +230,15 @@ def link_overworld(world, player): f += 1 if f < len(forward_edge_sets): forward_set = forward_edge_sets[f] + else: + break f += 1 while back_set[0] in connected_edges: b += 1 if b < len(back_edge_sets): back_set = back_edge_sets[b] + else: + break b += 1 assert len(forward_set) == len(back_set) for (forward_edge, back_edge) in zip(forward_set, back_set): From 4e8758c647c1dcae145cd0c4e7e0d067d639c36b Mon Sep 17 00:00:00 2001 From: codemann8 Date: Thu, 19 Aug 2021 18:48:44 -0500 Subject: [PATCH 6/9] Fixed missing OW flag check changes --- Rom.py | 2 +- data/base2current.bps | Bin 141164 -> 141164 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Rom.py b/Rom.py index 26911e9f..2214c15b 100644 --- a/Rom.py +++ b/Rom.py @@ -33,7 +33,7 @@ from source.classes.SFX import randomize_sfx JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = '99f3f57ab2c9449172cade4927a462d6' +RANDOMIZERBASEHASH = '0a8d3886c789945bd64c4c3f16a6194f' class JsonRom(object): diff --git a/data/base2current.bps b/data/base2current.bps index 24256d1451f20acfbeb2557b8a911cb00c387721..fa7152f57bb8c20c79c0c3e79787fa7d1dca50e6 100644 GIT binary patch delta 38 ucmaEJj^oWajt!oS%=P*Wn|&CC3K?0NW)N@eNt`aJ+D6%T>{ delta 38 ucmaEJj^oWajt!oS%&q!Wn|&CC3K Date: Thu, 19 Aug 2021 20:02:12 -0500 Subject: [PATCH 7/9] Moved OW flag checks to global variable --- Rom.py | 2 +- asm/owrando.asm | 2 +- data/base2current.bps | Bin 141164 -> 141164 bytes 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Rom.py b/Rom.py index 2214c15b..eb8b6e6e 100644 --- a/Rom.py +++ b/Rom.py @@ -33,7 +33,7 @@ from source.classes.SFX import randomize_sfx JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = '0a8d3886c789945bd64c4c3f16a6194f' +RANDOMIZERBASEHASH = '3f7cd4772ea4a3f503691ef8807f5d84' class JsonRom(object): diff --git a/asm/owrando.asm b/asm/owrando.asm index 98be93c0..63107a0e 100644 --- a/asm/owrando.asm +++ b/asm/owrando.asm @@ -341,7 +341,7 @@ OWNewDestination: sep #$30 : lda OWOppSlotOffset,y : !add $04 : asl : and #$7f : sta $700 ; crossed OW shuffle - lda.l OWMode+1 : and.b #$02 : beq .return + LDA.l OWMode+1 : AND.b #!FLAG_OW_CROSSED : beq .return ldx $05 : lda.l OWTileWorldAssoc,x : sta.l $7ef3ca ; change world ; toggle bunny mode diff --git a/data/base2current.bps b/data/base2current.bps index fa7152f57bb8c20c79c0c3e79787fa7d1dca50e6..08be9f59afac55702b9c3e60f5a4916cab14174c 100644 GIT binary patch delta 39 xcmV+?0NDTR&Is(z2(U>31ivsq&$CSd5OD!1gI;pCUUC5jwFuxu&hR#(_Y_L;5Rd=> delta 39 xcmV+?0NDTR&Is(z2(U>31b;7p(6dbe5OD#?gI;pCUUC5jwFo}g>LjJ7f4ozA5f%Ud From b58a194956b0d063a2a5eb3984d3f5a43016ea6c Mon Sep 17 00:00:00 2001 From: codemann8 Date: Thu, 19 Aug 2021 20:34:02 -0500 Subject: [PATCH 8/9] Fixed Parallel+Crossed failing generation --- OverworldShuffle.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/OverworldShuffle.py b/OverworldShuffle.py index 6b3aca9d..9a058cb6 100644 --- a/OverworldShuffle.py +++ b/OverworldShuffle.py @@ -231,6 +231,7 @@ def link_overworld(world, player): if f < len(forward_edge_sets): forward_set = forward_edge_sets[f] else: + forward_set = None break f += 1 while back_set[0] in connected_edges: @@ -238,11 +239,17 @@ def link_overworld(world, player): if b < len(back_edge_sets): back_set = back_edge_sets[b] else: + back_set = None break b += 1 - assert len(forward_set) == len(back_set) - for (forward_edge, back_edge) in zip(forward_set, back_set): - connect_two_way(world, forward_edge, back_edge, player, connected_edges) + if forward_set is not None and back_set is not None: + assert len(forward_set) == len(back_set) + for (forward_edge, back_edge) in zip(forward_set, back_set): + connect_two_way(world, forward_edge, back_edge, player, connected_edges) + elif forward_set is not None: + logging.getLogger('').warning("Edge '%s' could not find a valid connection" % forward_set[0]) + elif back_set is not None: + logging.getLogger('').warning("Edge '%s' could not find a valid connection" % back_set[0]) else: # vanilla/crossed shuffle for (forward_edge_sets, back_edge_sets) in groups: From af1960fe663471282368d2241136adf7c5307325 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Thu, 19 Aug 2021 20:37:55 -0500 Subject: [PATCH 9/9] Version bump 0.1.8.1 --- CHANGELOG.md | 7 +++++++ OverworldShuffle.py | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a113cdc..8b287ea8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +### 0.1.8.1 +- Fixed issue with activating flute in DW (OW Mixed) +- Fixed issue with Parallel+Crossed not generating +- Fixed issue with Standard not generating +- Fixed issue with Swordless not generating +- Fixed logic for Graveyard Ledge and Kings Tomb + ### 0.1.8.0 - Moved Crossed to its own checkbox option - Removed Legacy ER shuffles diff --git a/OverworldShuffle.py b/OverworldShuffle.py index 9a058cb6..0eb7f78e 100644 --- a/OverworldShuffle.py +++ b/OverworldShuffle.py @@ -2,7 +2,7 @@ import RaceRandom as random, logging, copy from BaseClasses import OWEdge, WorldType, RegionType, Direction, Terrain, PolSlot, Entrance from OWEdges import OWTileRegions, OWTileGroups, OWEdgeGroups, OpenStd, parallel_links, IsParallel -__version__ = '0.1.8.0-u' +__version__ = '0.1.8.1-u' def link_overworld(world, player): # setup mandatory connections