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/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) 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: 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..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 @@ -230,15 +230,26 @@ def link_overworld(world, player): f += 1 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: b += 1 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: @@ -964,6 +975,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/Rom.py b/Rom.py index 26911e9f..eb8b6e6e 100644 --- a/Rom.py +++ b/Rom.py @@ -33,7 +33,7 @@ from source.classes.SFX import randomize_sfx JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = '99f3f57ab2c9449172cade4927a462d6' +RANDOMIZERBASEHASH = '3f7cd4772ea4a3f503691ef8807f5d84' class JsonRom(object): diff --git a/Rules.py b/Rules.py index 3e50c6d4..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) @@ -1487,6 +1489,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) 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 24256d14..08be9f59 100644 Binary files a/data/base2current.bps and b/data/base2current.bps differ