From e681968aa2498c4efbc96ca99dfd5fb91c0341cf Mon Sep 17 00:00:00 2001 From: aerinon Date: Mon, 15 Jul 2024 13:02:06 -0600 Subject: [PATCH 01/12] feat: 300 Rupees marked as priority fix: PreferredLocationGroup works with priority items and pre-activated flute --- CHANGELOG.md | 11 +++++++++++ Fill.py | 6 ++---- Items.py | 2 +- Main.py | 2 +- RELEASENOTES.md | 12 +++--------- source/item/FillUtil.py | 2 ++ 6 files changed, 20 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 707d2f06..0b209701 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,17 @@ # Patch Notes Changelog archive + +* 1.4.5 + - Logic: Added appropriate enemy logic to GT Mimics 1 and 2 rooms + - Logic: Added appropriate enemy logic to Mire 2 room. Note this does change the default logical strats, due to how enemy kill logic works. + - Ice Rod + 1 Bomb is now out of logic + - Fire Rod + 1 Bomb is now out of logic + - Fire Rod + 1 magic extension is still in logic + - Byrna + 1 magic extension is newly in logic + + (One magic extension is either half magic or a bottle with the ability to purchase a blue or green potion) In general, making up for a lack of magic extension with a few bombs is something that could be added to the logic. Using the ice rod to freeze an enemy and then using that enemy to deal blunt damage and then using bombs to clear the frozen enemy is another strategy that could be added to the logic someday. If these are important to you, let me know. + - Generation: Fixed an issue with dungeonsfull shuffle * 1.4.4 - Fixed a crash near the end of the credits when total collection rate was over 1000 * 1.4.3 diff --git a/Fill.py b/Fill.py index f41f845c..feacb10b 100644 --- a/Fill.py +++ b/Fill.py @@ -448,11 +448,9 @@ def distribute_items_restrictive(world, gftower_trash=False, fill_locations=None fill_restrictive(world, world.state, fill_locations, progitempool, key_pool, vanilla=True) fill_restrictive(world, world.state, fill_locations, progitempool, key_pool) random.shuffle(fill_locations) - if world.algorithm == 'balanced': - fast_fill(world, prioitempool, fill_locations) - elif world.algorithm == 'vanilla_fill': + if world.algorithm == 'vanilla_fill': fast_vanilla_fill(world, prioitempool, fill_locations) - elif world.algorithm in ['major_only', 'dungeon_only', 'district']: + elif world.algorithm in ['balanced', 'major_only', 'dungeon_only', 'district']: filtered_fill(world, prioitempool, fill_locations) else: # just need to ensure dungeon items still get placed in dungeons fast_equitable_fill(world, prioitempool, fill_locations) diff --git a/Items.py b/Items.py index 76dd7bfc..e83c6e25 100644 --- a/Items.py +++ b/Items.py @@ -105,7 +105,7 @@ item_table = {'Bow': (True, False, None, 0x0B, 200, 'Bow!\nJoin the archer class 'Rupees (20)': (False, False, None, 0x36, 10, 'Rupees!\nJust couch\ncash.', 'and the couch cash', 'the piggy-bank kid', 'life lesson for sale', 'the witch buying drugs', 'destitute boy has lunch again', 'a red rupee'), 'Rupees (50)': (False, False, None, 0x41, 25, 'Rupees!\nA big pile!', 'and the rupee pile', 'the well-off kid', 'life lesson for sale', 'buying okay drugs', 'destitute boy has dinner again', 'fifty rupees'), 'Rupees (100)': (False, False, None, 0x40, 50, 'Rupees!\nA big stash!', 'and the rupee stash', 'the kind-of-rich kid', 'life lesson for sale', 'buying good drugs', 'affluent boy goes drinking again', 'one hundred rupees'), - 'Rupees (300)': (False, False, None, 0x46, 150, 'Rupees!\nA big hoard!', 'and the rupee hoard', 'the really-rich kid', 'life lesson for sale', 'buying the best drugs', 'fat-cat boy is rich again', 'three hundred rupees'), + 'Rupees (300)': (False, True, None, 0x46, 150, 'Rupees!\nA big hoard!', 'and the rupee hoard', 'the really-rich kid', 'life lesson for sale', 'buying the best drugs', 'fat-cat boy is rich again', 'three hundred rupees'), 'Rupoor': (False, False, None, 0x59, 0, 'Rupoor!\nI\'ll take your rupees!', 'and the toll-booth', 'the toll-booth kid', 'double loss for sale', 'witch stole your rupees', 'affluent boy steals rupees', 'a rupoor'), 'Red Clock': (False, True, None, 0x5B, 0, 'Red Clock!\nA waste of time.', 'the ruby clock', 'the ruby-time kid', 'red time for sale', 'for ruby time', 'moment boy travels time again', 'a red clock'), 'Blue Clock': (False, True, None, 0x5C, 50, 'Blue Clock!\nA bit of time!', 'the sapphire clock', 'sapphire-time kid', 'blue time for sale', 'for sapphire time', 'moment boy time travels again', 'a blue clock'), diff --git a/Main.py b/Main.py index 43bb4290..af8ba0ab 100644 --- a/Main.py +++ b/Main.py @@ -38,7 +38,7 @@ from source.enemizer.DamageTables import DamageTable from source.enemizer.Enemizer import randomize_enemies from source.rom.DataTables import init_data_tables -version_number = '1.4.5' +version_number = '1.4.6' version_branch = '-u' __version__ = f'{version_number}{version_branch}' diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 087fad11..59d49859 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -1,12 +1,6 @@ # Patch Notes -1.4.5 -- Logic: Added appropriate enemy logic to GT Mimics 1 and 2 rooms -- Logic: Added appropriate enemy logic to Mire 2 room. Note this does change the default logical strats, due to how enemy kill logic works. - - Ice Rod + 1 Bomb is now out of logic - - Fire Rod + 1 Bomb is now out of logic - - Fire Rod + 1 magic extension is still in logic - - Byrna + 1 magic extension is newly in logic +1.4.6 - (One magic extension is either half magic or a bottle with the ability to purchase a blue or green potion) In general, making up for a lack of magic extension with a few bombs is something that could be added to the logic. Using the ice rod to freeze an enemy and then using that enemy to deal blunt damage and then using bombs to clear the frozen enemy is another strategy that could be added to the logic someday. If these are important to you, let me know. -- Generation: Fixed an issue with dungeonsfull shuffle \ No newline at end of file +- The 300 Rupees item is now marked as priority, so it will not be used as GT junk fill (this matches a recent change in the VT randomizer) +- Fixed an issue around PreferredLocationGroups in customizer which would not work with pre-activated Ocraina or priority items. diff --git a/source/item/FillUtil.py b/source/item/FillUtil.py index db5a1a4f..add18502 100644 --- a/source/item/FillUtil.py +++ b/source/item/FillUtil.py @@ -408,11 +408,13 @@ def filter_locations(item_to_place, locations, world, vanilla_skip=False, potion config = world.item_pool_config if not isinstance(item_to_place, str): item_name = 'Bottle' if item_to_place.name.startswith('Bottle') else item_to_place.name + item_name = 'Ocarina' if item_name.startswith('Ocarina') else item_name else: item_name = item_to_place if world.algorithm == 'vanilla_fill': filtered = [] item_name = 'Bottle' if item_to_place.name.startswith('Bottle') else item_to_place.name + item_name = 'Ocarina' if item_name.startswith('Ocarina') else item_name if item_name in config.static_placement[item_to_place.player]: restricted = config.static_placement[item_to_place.player][item_name] filtered = [l for l in locations if l.player == item_to_place.player and l.name in restricted] From 5d5aec0325bafebaa6509260f00a4bbeb3bd0100 Mon Sep 17 00:00:00 2001 From: KrisDavie Date: Mon, 12 Aug 2024 08:31:13 +0200 Subject: [PATCH 02/12] Fix SP smalls in HMG and remove bat screen wrap from logic --- ItemList.py | 13 +++++++++++-- OverworldGlitchRules.py | 1 - 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/ItemList.py b/ItemList.py index 11b1b09b..1df02b2a 100644 --- a/ItemList.py +++ b/ItemList.py @@ -291,8 +291,6 @@ def generate_itempool(world, player): # In HMG force swamp smalls in pots to allow getting out of swamp palace placed_items['Swamp Palace - Trench 1 Pot Key'] = 'Small Key (Swamp Palace)' placed_items['Swamp Palace - Pot Row Pot Key'] = 'Small Key (Swamp Palace)' - pool.remove('Small Key (Swamp Palace)') - pool.remove('Small Key (Swamp Palace)') start_inventory = list(world.precollected_items) for item in precollected_items: @@ -369,6 +367,17 @@ def generate_itempool(world, player): or (item.bigkey and world.bigkeyshuffle[player]) or (item.map and world.mapshuffle[player]) or (item.compass and world.compassshuffle[player]))]) + + if world.logic[player] == 'hybridglitches' and world.pottery[player] not in ['none', 'cave']: + keys_to_remove = 2 + to_remove = [] + for wix, wi in enumerate(world.itempool): + if wi.name == 'Small Key (Swamp Palace)' and wi.player == player: + to_remove.append(wix) + if keys_to_remove == len(to_remove): + break + for wix in reversed(to_remove): + del world.itempool[wix] # logic has some branches where having 4 hearts is one possible requirement (of several alternatives) # rather than making all hearts/heart pieces progression items (which slows down generation considerably) diff --git a/OverworldGlitchRules.py b/OverworldGlitchRules.py index aab2ddda..97883dc6 100644 --- a/OverworldGlitchRules.py +++ b/OverworldGlitchRules.py @@ -128,7 +128,6 @@ boots_clip_exits_lw = [ ('TR Pegs Ledge Clip', 'Death Mountain TR Pegs Area', 'Death Mountain TR Pegs Ledge'), ('Mountain Pass Ledge Clip', 'Mountain Pass Area', 'Mountain Pass Ledge'), ('Mountain Pass Entry Clip', 'Kakariko Pond Area', 'Mountain Pass Entry'), - ('Bat Cave River Clip', 'Blacksmith Area', 'Blacksmith Ledge'), ('Desert Keep Clip', 'Maze Race Area', 'Desert Ledge Keep'), ('Desert Ledge Clip', 'Maze Race Area', 'Desert Ledge'), ('Maze Race Prize Clip', 'Maze Race Area', 'Maze Race Prize'), From 4f2efab8de706f550b590775887d1c7869694405 Mon Sep 17 00:00:00 2001 From: KrisDavie Date: Sun, 8 Sep 2024 19:49:14 +0200 Subject: [PATCH 03/12] Fix UW connector names + formatting --- UnderworldGlitchRules.py | 255 +++++++++++++++++++++++++-------------- 1 file changed, 162 insertions(+), 93 deletions(-) diff --git a/UnderworldGlitchRules.py b/UnderworldGlitchRules.py index c01e242f..67593631 100644 --- a/UnderworldGlitchRules.py +++ b/UnderworldGlitchRules.py @@ -2,7 +2,9 @@ from BaseClasses import Entrance import Rules from OverworldGlitchRules import create_no_logic_connections -kikiskip_spots = [("Kiki Skip", "Spectacle Rock Cave (Bottom)", "Palace of Darkness Portal")] +kikiskip_spots = [ + ("Kiki Skip", "Spectacle Rock Cave (Bottom)", "Palace of Darkness Portal") +] mireheraswamp_spots = [ ("Mire to Hera Clip", "Mire Torches Top", "Hera Portal"), @@ -12,35 +14,53 @@ mireheraswamp_spots = [ icepalace_spots = [("Ice Lobby Clip", "Ice Portal", "Ice Bomb Drop")] thievesdesert_spots = [ - ("Thieves to Desert Clip", "Thieves Attic", "Desert West Portal"), - ("Thieves to Desert Clip", "Thieves Attic", "Desert South Portal"), - ("Thieves to Desert Clip", "Thieves Attic", "Desert East Portal"), + ("Thieves to Desert West Clip", "Thieves Attic", "Desert West Portal"), + ("Thieves to Desert South Clip", "Thieves Attic", "Desert South Portal"), + ("Thieves to Desert East Clip", "Thieves Attic", "Desert East Portal"), ] -specrock_spots = [("Spec Rock Clip", "Spectacle Rock Cave (Peak)", "Spectacle Rock Cave (Top)")] +specrock_spots = [ + ("Spec Rock Clip", "Spectacle Rock Cave (Peak)", "Spectacle Rock Cave (Top)") +] -paradox_spots = [("Paradox Front Teleport", "Paradox Cave Front", "Paradox Cave Chest Area")] +paradox_spots = [ + ("Paradox Front Teleport", "Paradox Cave Front", "Paradox Cave Chest Area") +] # We need to make connectors at a separate time from the connections, because of how dungeons are linked to regions -kikiskip_connectors = [("Kiki Skip", "Spectacle Rock Cave (Bottom)", "Palace of Darkness Exit")] +kikiskip_connectors = [ + ("Kiki Skip Connector", "Spectacle Rock Cave (Bottom)", "Palace of Darkness Exit") +] mireheraswamp_connectors = [ - ("Mire to Hera Clip", "Mire Torches Top", "Tower of Hera Exit"), - ("Mire to Hera Clip", "Mire Torches Top", "Swamp Palace Exit"), + ("Mire to Hera Connector", "Mire Torches Top", "Tower of Hera Exit"), + ("Mire to Swamp Connector", "Mire Torches Top", "Swamp Palace Exit"), ] thievesdesert_connectors = [ - ("Thieves to Desert Clip", "Thieves Attic", "Desert Palace Exit (West)"), - ("Thieves to Desert Clip", "Thieves Attic", "Desert Palace Exit (South)"), - ("Thieves to Desert Clip", "Thieves Attic", "Desert Palace Exit (East)"), + ("Thieves to Desert West Connector", "Thieves Attic", "Desert Palace Exit (West)"), + ( + "Thieves to Desert South Connector", + "Thieves Attic", + "Desert Palace Exit (South)", + ), + ("Thieves to Desert East Connector", "Thieves Attic", "Desert Palace Exit (East)"), ] specrock_connectors = [ - ("Spec Rock Clip", "Spectacle Rock Cave (Peak)", "Spectacle Rock Cave Exit (Top)"), - ("Spec Rock Clip", "Spectacle Rock Cave (Peak)", "Spectacle Rock Cave Exit"), + ( + "Spec Rock Top Connector", + "Spectacle Rock Cave (Peak)", + "Spectacle Rock Cave Exit (Top)", + ), + ( + "Spec Rock Exit Connector", + "Spectacle Rock Cave (Peak)", + "Spectacle Rock Cave Exit", + ), ] @@ -65,7 +85,14 @@ def create_hybridmajor_connectors(world, player): thievesdesert_connectors, specrock_connectors, ]: - new_connectors = [(connector[0], connector[1], world.get_entrance(connector[2], player).connected_region) for connector in connectors] + new_connectors = [ + ( + connector[0], + connector[1], + world.get_entrance(connector[2], player).connected_region, + ) + for connector in connectors + ] create_no_logic_connections(player, world, new_connectors) @@ -81,12 +108,20 @@ def fake_pearl_state(state, player): # Sets the rules on where we can actually go using this clip. # Behavior differs based on what type of ER shuffle we're playing. -def dungeon_reentry_rules(world, player, clip: Entrance, dungeon_region: str, dungeon_exit: str): +def dungeon_reentry_rules( + world, player, clip: Entrance, dungeon_region: str, dungeon_exit: str +): fix_dungeon_exits = world.fix_palaceofdarkness_exit[player] fix_fake_worlds = world.fix_fake_world[player] - dungeon_entrance = [r for r in world.get_region(dungeon_region, player).entrances if r.name != clip.name][0] - if not fix_dungeon_exits: # vanilla, simple, restricted, dungeonssimple; should never have fake worlds fix + dungeon_entrance = [ + r + for r in world.get_region(dungeon_region, player).entrances + if r.name != clip.name + ][0] + if ( + not fix_dungeon_exits + ): # vanilla, simple, restricted, dungeonssimple; should never have fake worlds fix # Dungeons are only shuffled among themselves. We need to check SW, MM, and AT because they can't be reentered trivially. # entrance doesn't exist until you fire rod it from the other side @@ -95,9 +130,15 @@ def dungeon_reentry_rules(world, player, clip: Entrance, dungeon_region: str, du elif dungeon_entrance.name == "Misery Mire": if world.swords[player] == "swordless": - Rules.add_rule(clip, lambda state: state.has_misery_mire_medallion(player)) + Rules.add_rule( + clip, lambda state: state.has_misery_mire_medallion(player) + ) else: - Rules.add_rule(clip, lambda state: state.has_sword(player) and state.has_misery_mire_medallion(player)) + Rules.add_rule( + clip, + lambda state: state.has_sword(player) + and state.has_misery_mire_medallion(player), + ) elif dungeon_entrance.name == "Agahnims Tower": Rules.add_rule( @@ -108,12 +149,23 @@ def dungeon_reentry_rules(world, player, clip: Entrance, dungeon_region: str, du ) # Then we set a restriction on exiting the dungeon, so you can't leave unless you got in normally. - Rules.add_rule(world.get_entrance(dungeon_exit, player), lambda state: dungeon_entrance.can_reach(state)) - elif not fix_fake_worlds: # full, dungeonsfull; fixed dungeon exits, but no fake worlds fix + Rules.add_rule( + world.get_entrance(dungeon_exit, player), + lambda state: dungeon_entrance.can_reach(state), + ) + elif ( + not fix_fake_worlds + ): # full, dungeonsfull; fixed dungeon exits, but no fake worlds fix # Entry requires the entrance's requirements plus a fake pearl, but you don't gain logical access to the surrounding region. - Rules.add_rule(clip, lambda state: dungeon_entrance.access_rule(fake_pearl_state(state, player))) + Rules.add_rule( + clip, + lambda state: dungeon_entrance.access_rule(fake_pearl_state(state, player)), + ) # exiting restriction - Rules.add_rule(world.get_entrance(dungeon_exit, player), lambda state: dungeon_entrance.can_reach(state)) + Rules.add_rule( + world.get_entrance(dungeon_exit, player), + lambda state: dungeon_entrance.can_reach(state), + ) # Otherwise, the shuffle type is lean, lite, crossed, or insanity; all of these do not need additional rules on where we can go, # since the clip links directly to the exterior region. @@ -131,13 +183,15 @@ def underworld_glitches_rules(world, player): # Kiki Skip kks = world.get_entrance("Kiki Skip", player) Rules.set_rule(kks, lambda state: state.can_bomb_clip(kks.parent_region, player)) - dungeon_reentry_rules(world, player, kks, "Palace of Darkness Portal", "Palace of Darkness Exit") + dungeon_reentry_rules( + world, player, kks, "Palace of Darkness Portal", "Palace of Darkness Exit" + ) # Mire -> Hera -> Swamp def mire_clip(state): - return state.can_reach("Mire Torches Top", "Region", player) and state.can_dash_clip( - world.get_region("Mire Torches Top", player), player - ) + return state.can_reach( + "Mire Torches Top", "Region", player + ) and state.can_dash_clip(world.get_region("Mire Torches Top", player), player) def hera_clip(state): return state.can_reach("Hera 4F", "Region", player) and state.can_dash_clip( @@ -158,11 +212,17 @@ def underworld_glitches_rules(world, player): mire_to_hera = world.get_entrance("Mire to Hera Clip", player) mire_to_swamp = world.get_entrance("Hera to Swamp Clip", player) Rules.set_rule(mire_to_hera, mire_clip) - Rules.set_rule(mire_to_swamp, lambda state: mire_clip(state) and state.has("Flippers", player)) + Rules.set_rule( + mire_to_swamp, lambda state: mire_clip(state) and state.has("Flippers", player) + ) # Using the entrances for various ER types. Hera -> Swamp never matters because you can only logically traverse with the mire keys - dungeon_reentry_rules(world, player, mire_to_hera, "Hera Lobby", "Tower of Hera Exit") - dungeon_reentry_rules(world, player, mire_to_swamp, "Swamp Lobby", "Swamp Palace Exit") + dungeon_reentry_rules( + world, player, mire_to_hera, "Hera Lobby", "Tower of Hera Exit" + ) + dungeon_reentry_rules( + world, player, mire_to_swamp, "Swamp Lobby", "Swamp Palace Exit" + ) # We need to set _all_ swamp doors to be openable with mire keys, otherwise the small key can't be behind them - 6 keys because of Pots # Flippers required for all of these doors to prevent locks when flooding for door in [ @@ -188,90 +248,99 @@ def underworld_glitches_rules(world, player): # Rules.add_rule(world.get_entrance(door, player), lambda state: mire_clip(state) and state.has('Flippers', player), combine="or") Rules.add_rule( - world.get_location("Trench 1 Switch", player), lambda state: mire_clip(state) or hera_clip(state), combine="or" + world.get_location("Trench 1 Switch", player), + lambda state: mire_clip(state) or hera_clip(state), + combine="or", ) # Build the rule for SP moat. # We need to be able to s+q to old man, then go to either Mire or Hera at either Hera or GT. # First we require a certain type of entrance shuffle, then build the rule from its pieces. - if not world.swamp_patch_required[player]: - if world.shuffle[player] in [ - "vanilla", - "dungeonssimple", - "dungeonsfull", - "dungeonscrossed", - ]: - rule_map = { - "Mire Portal": (lambda state: state.can_reach("Mire Torches Top", "Entrance", player)), - "Hera Portal": (lambda state: state.can_reach("Hera Startile Corner NW", "Entrance", player)), - } - inverted = world.mode[player] == "inverted" - - def hera_rule(state): - return (state.has("Moon Pearl", player) or not inverted) and rule_map.get( - world.get_entrance("Tower of Hera", player).connected_region.name, lambda state: False - )(state) - - def gt_rule(state): - return (state.has("Moon Pearl", player) or inverted) and rule_map.get( - world.get_entrance(("Ganons Tower"), player).connected_region.name, lambda state: False - )(state) - - def mirrorless_moat_rule(state): - return ( - state.can_reach("Old Man S&Q", "Entrance", player) - and state.has("Flippers", player) - and mire_clip(state) - and (hera_rule(state) or gt_rule(state)) + if not world.swamp_patch_required[player] and world.shuffle[player] in [ + "vanilla", + "dungeonssimple", + "dungeonsfull", + ]: + rule_map = { + "Mire Portal": ( + lambda state: state.can_reach("Mire Torches Top", "Entrance", player) + ), + "Hera Portal": ( + lambda state: state.can_reach( + "Hera Startile Corner NW", "Entrance", player ) + ), + } + inverted = world.mode[player] == "inverted" - Rules.add_rule( - world.get_entrance("Swamp Lobby Moat", player), lambda state: mirrorless_moat_rule(state), combine="or" + def hera_rule(state): + return (state.has("Moon Pearl", player) or not inverted) and rule_map.get( + world.get_entrance("Tower of Hera", player).connected_region.name, + lambda state: False, + )(state) + + def gt_rule(state): + return (state.has("Moon Pearl", player) or inverted) and rule_map.get( + world.get_entrance(("Ganons Tower"), player).connected_region.name, + lambda state: False, + )(state) + + def mirrorless_moat_rule(state): + return ( + state.can_reach("Old Man S&Q", "Entrance", player) + and state.has("Flippers", player) + and mire_clip(state) + and (hera_rule(state) or gt_rule(state)) ) - # Thieves -> Desert - Rules.add_rule( - world.get_entrance("Thieves to Desert Clip", player), - lambda state: state.can_dash_clip(world.get_region("Thieves Attic", player), player), - ) - dungeon_reentry_rules( - world, - player, - world.get_entrance("Thieves to Desert Clip", player), - "Desert West Portal", - "Desert Palace Exit (West)", - ) - dungeon_reentry_rules( - world, - player, - world.get_entrance("Thieves to Desert Clip", player), - "Desert South Portal", - "Desert Palace Exit (South)", - ) - dungeon_reentry_rules( - world, - player, - world.get_entrance("Thieves to Desert Clip", player), - "Desert East Portal", - "Desert Palace Exit (East)", - ) + Rules.add_rule( + world.get_entrance("Swamp Lobby Moat", player), + lambda state: mirrorless_moat_rule(state), + combine="or", + ) + + for desert_exit in ["East", "South", "West"]: + Rules.add_rule( + world.get_entrance(f"Thieves to Desert {desert_exit} Connector", player), + lambda state: state.can_dash_clip( + world.get_region("Thieves Attic", player), player + ), + ) + dungeon_reentry_rules( + world, + player, + world.get_entrance(f"Thieves to Desert {desert_exit} Connector", player), + f"Desert {desert_exit} Portal", + f"Desert Palace Exit ({desert_exit})", + ) # Collecting left chests in Paradox Cave using a dash clip -> dash citrus, 1f right, teleport up - paradox_left_chests = ["Paradox Cave Lower - Far Left", "Paradox Cave Lower - Left", "Paradox Cave Lower - Middle"] + paradox_left_chests = [ + "Paradox Cave Lower - Far Left", + "Paradox Cave Lower - Left", + "Paradox Cave Lower - Middle", + ] for location in paradox_left_chests: Rules.add_rule( world.get_location(location, player), - lambda state: state.can_dash_clip(world.get_location(location, player).parent_region, player), + lambda state: state.can_dash_clip( + world.get_location(location, player).parent_region, player + ), "or", ) # Collecting right chests in Paradox Cave using a dash clip on left side -> dash citrus, 1f right, teleport up, then hitting the switch - paradox_right_chests = ["Paradox Cave Lower - Right", "Paradox Cave Lower - Far Right"] + paradox_right_chests = [ + "Paradox Cave Lower - Right", + "Paradox Cave Lower - Far Right", + ] for location in paradox_right_chests: Rules.add_rule( world.get_location(location, player), lambda state: ( - state.can_dash_clip(world.get_location(location, player).parent_region, player) + state.can_dash_clip( + world.get_location(location, player).parent_region, player + ) and state.can_hit_crystal(player) ), "or", From eaa21eda3b0e192b81d01dd3ae0b01dedf0d2ac0 Mon Sep 17 00:00:00 2001 From: KrisDavie Date: Sun, 8 Sep 2024 22:21:47 +0200 Subject: [PATCH 04/12] Update glitched tournament winners --- Text.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Text.py b/Text.py index 3ca193df..0bc30491 100644 --- a/Text.py +++ b/Text.py @@ -2027,6 +2027,7 @@ class TextTable(object): text['ganon_phase_3_alt'] = CompressedTextMapper.convert("Got wax in your ears? I cannot die!") # 190 text['sign_east_death_mountain_bridge'] = CompressedTextMapper.convert("Glitched\ntournament\nwinners\n{HARP}\n" + "~~~No Logic 2024~~~\ntam\n\n" "~~~HMG 2023~~~\ntam\n\n" "~~~No Logic 2022~~~\nChexhuman\n\n" "~~~HMG 2021~~~\nKrithel\n\n" From b52d292b1b1eec9791cfdecc191773adf541549e Mon Sep 17 00:00:00 2001 From: codemann8 Date: Wed, 18 Sep 2024 12:07:50 -0500 Subject: [PATCH 05/12] Fixed regression issue with items not drawing in dark rooms --- Rom.py | 2 +- data/base2current.bps | Bin 133894 -> 133894 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Rom.py b/Rom.py index aa890cdc..9f30f7f2 100644 --- a/Rom.py +++ b/Rom.py @@ -43,7 +43,7 @@ from source.enemizer.Enemizer import write_enemy_shuffle_settings JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = 'df80fc581f947c944f1bf558e9791d07' +RANDOMIZERBASEHASH = 'ecbd9f473eda44b9192e14c11d095f56' class JsonRom(object): diff --git a/data/base2current.bps b/data/base2current.bps index aa9084c3138fdf8bdbc958a539c7477d300a1c8f..f18a1b9fb65555a32c7ed5bd7458fdf39700477b 100644 GIT binary patch delta 1370 zcmWNP3rtgY6o)zVDMg?yI7(sE3)FxV5fKrL36_Ac`hMXQolM196()$z0Nz^!xv*O5 zKlFkf7K_FLl47pr3V}g1ZoU?4bWAa#&S_m?+Dt%K!Mo-pCnw*RoSc*VYD~f!ld$17 z?7nnogD>~=y|x=82x7X-jG-4&(+L5j=ja*#Uug}fNx99kQ(MAYiCQcI<}yGAUKZjLwuFq=+| zyvv6-G*21Dfj$%)+as?Swc?zwrd#sxW=z1ey1A|y7bxusI=q5>tnHfOxCNLugPM@Bt}UEcaB#d6Rh)#kB%YVMIU30r z5?p$!y|u?(h<)FyCpnJoxw#z!K14T`KiP8OGC6C^I$A@9qTwky1f$8R*qHAMUXcl) zHJ4t#F%PuuW%?w3`0*qoIk9uVn4Bz zbVU2sZwT{%vc9IA*iDmt5i>aOm zKnnayY(%7G894 jt)%=PL5cs8B_oY2`v;3yDvqi5k|g0L z1CLre>1AH|-Y`jj7aRlpc@Dk9MiTTh@qPdUS{t&!Q|HiA3;mS0>oIToRLHjgQhL7R zHV^DHPZq|3ACNrKB0e^#$2rTUS~lQK7@uh!c5^hM&VTeMg@7Kr(G1|8;YIb?(GDZwR6{w)A>9VX(2< z%Lxr#D*<%$$i>1WC*0|17r-JkQMSEw#B@T`ucM+y)A4 z8Zo0XAko06802VtRPG@n>UrZyt7-i&2MEV2?g+BH2F zaM2APn*bYlp~v}wn!^d2wiJbV$tfY#irA?N7j4;?IbOIXR*s#J})Zabx%JF6=$)e@VuILVK|5S{x`$#i|6JX-JjGGwD@HJdKo#-`b``WB@5thcB##0BXt?Fi4`Leh>vqm>fUI z;kX4_bQse-6Y5<93jE3~Hc$PbldVsDq}8?fT=Un|Ato)z>9_@9<+^=LpBVPUa3$fD z9Y>g~Z0Pjkew>U`Da_<1xXgz_%Ca5yKok?c189I`rf(-47eFMHTL5xMVu%7bT@8pvf_#lTCG&6!`_x^3mJJ8T;~YG1vRxzgpaz8{PB`ex0r%j zFgaIt)WU3zN7EIlN#Bk8G3Csi6VQ&&*vfKrdFDNn+65UoR`yMoS?A>ToNmvQ1+rj*G4;}z_LB5d^ zGglu#DhP`syW5_#Bdpz7zZq6hUVTvHmAYV{fn|SZ5lclgwN8>CXs^DN*SNPV@PBt- BT*m+a From 585940f768631c42b534636d88e86735d4764946 Mon Sep 17 00:00:00 2001 From: aerinon Date: Thu, 10 Oct 2024 08:16:33 -0600 Subject: [PATCH 06/12] fix: sanc & quit fix --- Rom.py | 2 +- data/base2current.bps | Bin 117944 -> 117954 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Rom.py b/Rom.py index f3067d49..a3060fcf 100644 --- a/Rom.py +++ b/Rom.py @@ -42,7 +42,7 @@ from source.enemizer.Enemizer import write_enemy_shuffle_settings JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = '40ce790628b55a05ec749f476198cd8d' +RANDOMIZERBASEHASH = '1cbe62592c0e9a7d224232c62292ecc9' class JsonRom(object): diff --git a/data/base2current.bps b/data/base2current.bps index e33c04dc7c9c7c413a4e5c5f6a82d263d9a27862..a54460176d1154a5ed35259a748b73b4324c5c25 100644 GIT binary patch delta 7706 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 aR8|_RLK$v)ei;mMdE93gXA3t*Wc)ws#7=Pl delta 7616 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 Qx&^|I#_0dz$qPsSKfP-tod5s; From c00d8ab80a0a08e953956128278a74e177d0adb3 Mon Sep 17 00:00:00 2001 From: aerinon Date: Thu, 10 Oct 2024 09:11:16 -0600 Subject: [PATCH 07/12] fix: lean/lite shuffling fairy caves when enemy drop not enabled --- source/overworld/EntranceShuffle2.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/overworld/EntranceShuffle2.py b/source/overworld/EntranceShuffle2.py index 56e1e529..40ead938 100644 --- a/source/overworld/EntranceShuffle2.py +++ b/source/overworld/EntranceShuffle2.py @@ -1064,7 +1064,7 @@ def do_vanilla_connect(pool_def, avail): if avail.world.dropshuffle[avail.player] not in ['none', 'keys']: return if 'enemy_drop' in pool_def['condition']: - if avail.world.dropshuffle[avail.player] not in ['none', 'keys'] or avail.world.enemy_shuffle[avail.player] != 'none': + if avail.world.dropshuffle[avail.player] not in ['none', 'keys'] and avail.world.enemy_shuffle[avail.player] != 'none': return defaults = {**default_connections, **(inverted_default_connections if avail.inverted else open_default_connections)} if avail.inverted: From cb66e0248bb7e9370df8d6e7653ecd5f68f08a84 Mon Sep 17 00:00:00 2001 From: aerinon Date: Thu, 10 Oct 2024 09:13:57 -0600 Subject: [PATCH 08/12] fix: minor text fix --- Text.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Text.py b/Text.py index 3ca193df..84dd463f 100644 --- a/Text.py +++ b/Text.py @@ -127,7 +127,7 @@ Triforce_texts = [ " You get one\n wish. Choose\n wisely, hero!", " Can you please\n break us three\n up? Thanks.", " Pick us up\n before we\n get dizzy!", - " Thank you,\n Mikey. You’re\n 2 minutes late", + " Thank you,\n Mikey. You're\n 2 minutes late", " This was a\n 7000 series\n train.", " I'd buy\n that for\n a rupee!", " Did you like\n that bow\n placement?", From d66632a02170d8062509d34f578541dd4f46e69d Mon Sep 17 00:00:00 2001 From: aerinon Date: Thu, 10 Oct 2024 11:03:14 -0600 Subject: [PATCH 09/12] fix: make murahdahla accessible as a bunny --- RELEASENOTES.md | 6 +++++- Rules.py | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 59d49859..53b20126 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -2,5 +2,9 @@ 1.4.6 -- The 300 Rupees item is now marked as priority, so it will not be used as GT junk fill (this matches a recent change in the VT randomizer) +- Restores original Sanc & Quit behavior, if Aga1 is not dead, then no quick pyramid warp +- Fixed problem with Lite/Lean shuffling some fairy caves unnecessarily +- The 300 Rupees item is now marked as priority, so it will not be used as GT junk fill (this matches a change in the VT randomizer) +- Murahdahla is now logically accessible in inverted mode as a bunny. May affect some beatable-only TFH seeds by allowing Moon Pearl to be inaccessible. - Fixed an issue around PreferredLocationGroups in customizer which would not work with pre-activated Ocraina or priority items. +- Minor fix on triforce text diff --git a/Rules.py b/Rules.py index ebe639a5..87742ad1 100644 --- a/Rules.py +++ b/Rules.py @@ -2028,6 +2028,7 @@ def set_bunny_rules(world, player, inverted): 'Hype Cave - Generous Guy', 'Peg Cave', 'Bumper Cave Ledge', 'Dark Blacksmith Ruins', 'Spectacle Rock', 'Bombos Tablet', 'Ether Tablet', 'Purple Chest', 'Blacksmith', 'Missing Smith', 'Master Sword Pedestal', 'Bottle Merchant', 'Sunken Treasure', 'Desert Ledge', + 'Murahdahla', 'Kakariko Shop - Left', 'Kakariko Shop - Middle', 'Kakariko Shop - Right', 'Lake Hylia Shop - Left', 'Lake Hylia Shop - Middle', 'Lake Hylia Shop - Right', 'Potion Shop - Left', 'Potion Shop - Middle', 'Potion Shop - Right', From e12c4f693bf5840a7b036224cfd41305aa262f95 Mon Sep 17 00:00:00 2001 From: aerinon Date: Thu, 10 Oct 2024 13:00:04 -0600 Subject: [PATCH 10/12] fix: report enemizer problems --- RELEASENOTES.md | 1 + source/enemizer/SpriteSheets.py | 18 ++++++++-------- source/enemizer/enemy_deny.yaml | 37 ++++++++++++++++++++------------- 3 files changed, 32 insertions(+), 24 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 53b20126..6dedb16d 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -8,3 +8,4 @@ - Murahdahla is now logically accessible in inverted mode as a bunny. May affect some beatable-only TFH seeds by allowing Moon Pearl to be inaccessible. - Fixed an issue around PreferredLocationGroups in customizer which would not work with pre-activated Ocraina or priority items. - Minor fix on triforce text +- Enemy bans for poor placements diff --git a/source/enemizer/SpriteSheets.py b/source/enemizer/SpriteSheets.py index 108ac0b3..4d89a29e 100644 --- a/source/enemizer/SpriteSheets.py +++ b/source/enemizer/SpriteSheets.py @@ -169,21 +169,21 @@ def init_sprite_requirements(): SpriteRequirement(EnemySprite.Vulture).no_drop().sub_group(2, 0x12).exclude(NoFlyingRooms), SpriteRequirement(EnemySprite.CorrectPullSwitch).affix().sub_group(3, [0x52, 0x53]), SpriteRequirement(EnemySprite.WrongPullSwitch).affix().sub_group(3, [0x52, 0x53]), - SpriteRequirement(EnemySprite.Octorok).sub_group(2, [0xc, 0x18]), + SpriteRequirement(EnemySprite.Octorok).aquaphobia().sub_group(2, [0xc, 0x18]), SpriteRequirement(EnemySprite.Moldorm).exalt().sub_group(2, 0x30), - SpriteRequirement(EnemySprite.Octorok4Way).sub_group(2, 0xc), + SpriteRequirement(EnemySprite.Octorok4Way).aquaphobia().sub_group(2, 0xc), SpriteRequirement(EnemySprite.Cucco).immune().sub_group(3, [0x15, 0x50]).exclude(NoFlyingRooms), SpriteRequirement(EnemySprite.Buzzblob).sub_group(3, 0x11), SpriteRequirement(EnemySprite.Snapdragon).sub_group(0, 0x16).sub_group(2, 0x17), SpriteRequirement(EnemySprite.Octoballoon).no_drop().sub_group(2, 0xc).exclude(NoFlyingRooms), SpriteRequirement(EnemySprite.Hinox).sub_group(0, 0x16), SpriteRequirement(EnemySprite.Moblin).sub_group(2, 0x17), - SpriteRequirement(EnemySprite.MiniHelmasaur).sub_group(1, 0x1e), + SpriteRequirement(EnemySprite.MiniHelmasaur).aquaphobia().sub_group(1, 0x1e), SpriteRequirement(EnemySprite.AntiFairy).no_drop().sub_group(3, [0x52, 0x53]) .exclude(NoFlyingRooms).exclude({0x40}), # no anti-fairies in aga tower bridge room SpriteRequirement(EnemySprite.Wiseman).affix().sub_group(2, 0x4c), SpriteRequirement(EnemySprite.Hoarder).sub_group(3, 0x11).exclude({0x10c}), - SpriteRequirement(EnemySprite.MiniMoldorm).sub_group(1, 0x1e), + SpriteRequirement(EnemySprite.MiniMoldorm).aquaphobia().sub_group(1, 0x1e), SpriteRequirement(EnemySprite.Poe).no_drop().sub_group(3, 0x15).exclude(NoFlyingRooms), SpriteRequirement(EnemySprite.Smithy).affix().sub_group(1, 0x1d).sub_group(3, 0x15), SpriteRequirement(EnemySprite.Statue).stasis().immune().sub_group(3, [0x52, 0x53]), @@ -217,11 +217,11 @@ def init_sprite_requirements(): SpriteRequirement(EnemySprite.Hoarder2).sub_group(3, 0x11).exclude({0x10c}), SpriteRequirement(EnemySprite.TutorialGuard).affix(), SpriteRequirement(EnemySprite.LightningGate).affix().sub_group(3, 0x3f), - SpriteRequirement(EnemySprite.BlueGuard).sub_group(1, [0xd, 0x49]), - SpriteRequirement(EnemySprite.GreenGuard).sub_group(1, 0x49), - SpriteRequirement(EnemySprite.RedSpearGuard).sub_group(1, [0xd, 0x49]), - SpriteRequirement(EnemySprite.BluesainBolt).sub_group(0, 0x46).sub_group(1, [0xd, 0x49]), - SpriteRequirement(EnemySprite.UsainBolt).sub_group(1, [0xd, 0x49]), + SpriteRequirement(EnemySprite.BlueGuard).aquaphobia().sub_group(1, [0xd, 0x49]), + SpriteRequirement(EnemySprite.GreenGuard).aquaphobia().sub_group(1, 0x49), + SpriteRequirement(EnemySprite.RedSpearGuard).aquaphobia().sub_group(1, [0xd, 0x49]), + SpriteRequirement(EnemySprite.BluesainBolt).aquaphobia().sub_group(0, 0x46).sub_group(1, [0xd, 0x49]), + SpriteRequirement(EnemySprite.UsainBolt).aquaphobia().sub_group(1, [0xd, 0x49]), SpriteRequirement(EnemySprite.BlueArcher).sub_group(0, 0x48).sub_group(1, 0x49), SpriteRequirement(EnemySprite.GreenBushGuard).sub_group(0, 0x48).sub_group(1, 0x49), SpriteRequirement(EnemySprite.RedJavelinGuard).sub_group(0, 0x46).sub_group(1, 0x49), diff --git a/source/enemizer/enemy_deny.yaml b/source/enemizer/enemy_deny.yaml index 04be92fa..301abda2 100644 --- a/source/enemizer/enemy_deny.yaml +++ b/source/enemizer/enemy_deny.yaml @@ -17,8 +17,8 @@ UwGeneralDeny: - [ 0x000e, 0, [ "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft" ] ] #"Ice Palace - Entrance - Freezor" - [ 0x000e, 1, [ "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft" ] ] #"Ice Palace - Bari Key - Top Bari" - [ 0x000e, 2, [ "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft" ] ] #"Ice Palace - Bari Key - Middle Bari" - - [ 0x0016, 0, [ "RollerVerticalDown", "RollerVerticalUp", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper", "GreenMimic", "RedMimic", "Pikit"] ] #"Swamp Palace - Pool - Zol 1" - - [ 0x0016, 1, [ "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper", "GreenMimic", "RedMimic", "Pikit" ] ] #"Swamp Palace - Pool - Zol 2" + - [ 0x0016, 0, [ "SparkCW", "SparkCCW", "RollerVerticalDown", "RollerVerticalUp", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper", "GreenMimic", "RedMimic", "Pikit"] ] #"Swamp Palace - Pool - Zol 1" + - [ 0x0016, 1, [ "SparkCW", "SparkCCW", "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper", "GreenMimic", "RedMimic", "Pikit" ] ] #"Swamp Palace - Pool - Zol 2" - [ 0x0016, 2, [ "SparkCW", "SparkCCW", "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper", "GreenMimic", "RedMimic", "Pikit" ] ] #"Swamp Palace - Pool - Blue Bari" - [ 0x0016, 3, [ "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Swamp Palace - Pool - Zol 3" - [ 0x0017, 5, [ "Beamos", "AntiFairyCircle", "SpikeBlock", "Bumper" ] ] #"Tower Of Hera - Bumper Room - Fire Bar (Clockwise)" @@ -28,6 +28,7 @@ UwGeneralDeny: - [ 0x0019, 3, [ "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft" ] ] #"Palace of Darkness - Dark Maze - Kodongo 4" - [ 0x001a, 0, [ "SparkCW", "SparkCCW", "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft", "Beamos", "AntiFairyCircle", "BigSpike", "FirebarCW", "FirebarCCW", "SpikeBlock", "Bumper" ] ] #"Palace of Darkness - Compass Room - Mini Helmasaur 1" - [ 0x001a, 5, [ "SparkCW", "SparkCCW", "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft", "Beamos", "AntiFairyCircle", "BigSpike", "FirebarCW", "FirebarCCW", "SpikeBlock", "Bumper" ] ] #"Palace of Darkness - Compass Room - Mini Helmasaur 2" + - [ 0x001a, 7, [ "RollerHorizontalRight", "RollerHorizontalLeft" ]] # Too long - [ 0x001b, 3, [ "Beamos", "AntiFairyCircle", "Bumper" ] ] #"Palace of Darkness - Mimics 2 - Red Eyegore" - [ 0x001b, 4, [ "RollerVerticalUp" ] ] #"Palace of Darkness - Mimics 2 - Green Eyegore L" - [ 0x001e, 3, [ "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft", "BigSpike", "Bumper" ] ] #"Ice Palace - Blob Ambush - Red Bari 3" @@ -73,8 +74,9 @@ UwGeneralDeny: - [ 0x0034, 2, [ "SparkCW", "SparkCCW", "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Swamp Palace - West Wing - Kyameron" - [ 0x0034, 4, [ "Statue", "SparkCW", "SparkCCW", "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Swamp Palace - West Wing - Zol" - [ 0x0035, 6, [ "RollerHorizontalRight" ] ] #"Swamp Palace - West Lever - Stalfos 2" + - [ 0x0035, 5, [ "AntiFairyCircle", "Bumper", "Statue", "Beamos", "BigSpike", "SpikeBlock"]] - [ 0x0035, 9, [ "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "Bumper" ] ] #"Swamp Palace - West Lever - Blue Bari" - - [0x0036, 5, ["AntiFairyCircle", "Bumper"]] + - [ 0x0036, 5, [ "AntiFairyCircle", "Bumper"]] - [ 0x0036, 7, [ "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "FirebarCW", "FirebarCCW", "SpikeBlock", "Bumper" ] ] #"Swamp Palace - Lobby - Hover 3" - [ 0x0037, 7, [ "RollerHorizontalRight" ] ] #"Swamp Palace - Water 1 - Blue Bari" - [ 0x0038, 4, [ "RollerHorizontalRight" ] ] #"Swamp Palace - Long Hall - Kyameron 2" @@ -92,11 +94,11 @@ UwGeneralDeny: - [ 0x003d, 12, [ "AntiFairyCircle", "Bumper" ] ] #"Ganon's Tower - Torches 2 - Bunny Beam" - [ 0x003d, 13, [ "AntiFairyCircle", "Bumper" ] ] #"Ganon's Tower - Torches 2 - Antifairy" - [0x003e, 8, ["Wizzrobe"]] - - [0x003e, 9, ["Wizzrobe"]] + - [0x003e, 9, ["Wizzrobe", "GreenMimic", "RedMimic", "RedEyegoreMimic", "GreenEyegoreMimic"]] # drops a key by default - [0x003e, 10, ["Wizzrobe"]] - [0x003e, 11, ["Wizzrobe"]] - [ 0x003f, 1, [ "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "FirebarCW", "FirebarCCW", "SpikeBlock", "Bumper", "Statue"] ] #"Ice Palace - P Room - Stalfos Knight 1" - - [ 0x003f, 3, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper", "Statue"] ] #"Ice Palace - P Room - Stalfos Knight 2" + - [ 0x003f, 3, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper", "Statue", "SparkCW", "SparkCCW"] ] #"Ice Palace - P Room - Stalfos Knight 2" - [ 0x003f, 4, [ "Wizzrobe", "Statue", "Bumper", "BigSpike", "AntiFairyCircle"]] # Wizzrobes can't spawn on pots - [ 0x0040, 0, [ "RollerVerticalUp", "RollerVerticalDown", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] # Agahnims Tower - Bridge - Blue Guard 1 - [ 0x0040, 1, [ "Statue", "RollerVerticalUp", "RollerVerticalDown", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] # Agahnims Tower - Bridge - Blue Guard 2 @@ -122,6 +124,7 @@ UwGeneralDeny: - [ 0x0049, 5, [ "RollerVerticalUp", "RollerVerticalDown" ] ] #"Skull Woods - Bari Pits - Gibdo 2" - [ 0x0049, 7, [ "RollerVerticalUp", "RollerVerticalDown" ] ] #"Skull Woods - Bari Pits - Gibdo 4" - [ 0x0049, 8, [ "Beamos", "AntiFairyCircle", "Bumper" ] ] #"Skull Woods - Bari Pits - Gibdo 5" + - [0x0049, 11, ["AntiFairyCircle", "Bumper"]] - [0x004b, 0, ["Beamos", "AntiFairyCircle", "Bumper", "BigSpike"]] #"Palace of Darkness - Mimics 1 - Red Eyegore" - [ 0x004b, 1, [ "RollerHorizontalRight" ] ] #"Palace of Darkness - Warp Hint - Antifairy 1" - [ 0x004b, 5, [ "RollerHorizontalLeft", "RollerHorizontalRight", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Palace of Darkness - Jelly Hall - Blue Bari 1" @@ -181,7 +184,7 @@ UwGeneralDeny: - [ 0x0065, 2, [ "Beamos", "AntiFairyCircle", "Bumper" ] ] #"Thieves' Town - Attic Window - Rat 3" - [ 0x0066, 0, [ "Beamos", "AntiFairyCircle", "BigSpike", "Bumper" ] ] #"Swamp Palace - Waterfall Room - Hover 1" - [ 0x0066, 2, [ "AntiFairyCircle", "Bumper"]] - - [ 0x0067, 1, [ "RollerVerticalUp", "RollerVerticalDown" ] ] #"Skull Woods - Firebar Pits - Blue Bari 1" + - [ 0x0067, 1, [ "RollerVerticalUp", "RollerVerticalDown", "AntiFairyCircle", "Bumper"]] #"Skull Woods - Firebar Pits - Blue Bari 1" - [ 0x0067, 2, ["Bumper"]] #"Skull Woods - Firebar Pits - Blue Bari 2" - [ 0x0067, 3, [ "RollerVerticalUp", "RollerVerticalDown" ] ] #"Skull Woods - Firebar Pits - Hardhat Beetle 1" - [ 0x0067, 4, [ "AntiFairyCircle", "Bumper" ]] @@ -221,10 +224,10 @@ UwGeneralDeny: - [ 0x007d, 8, ["RollerVerticalUp", "RollerHorizontalLeft", "RollerHorizontalRight", "StalfosKnight", "Geldman", "Blob", "Stal"]] #"Ganon's Tower - The Zoo - Red Bari" - [ 0x007d, 10, ["StalfosKnight", "Geldman", "Blob", "Stal"]] # todo - consider adding firesnake to 0-3: has a hard time moving, could block hookshots for quite a while - - [ 0x007f, 0, [ "Statue", "SparkCW", "SparkCCW", "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "FirebarCW", "FirebarCCW", "SpikeBlock", "Bumper" ] ] #"Ice Palace - Big Spikes - Red Bari 1" - - [ 0x007f, 1, [ "Statue", "SparkCW", "SparkCCW", "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "FirebarCW", "FirebarCCW", "SpikeBlock", "Bumper", "ArmosStatue" ] ] #"Ice Palace - Big Spikes - Red Bari 2" - - [ 0x007f, 2, [ "Statue", "SparkCW", "SparkCCW", "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "FirebarCW", "FirebarCCW", "SpikeBlock", "Bumper" ] ] #"Ice Palace - Big Spikes - Red Bari 3" - - [ 0x007f, 3, [ "Statue", "SparkCW", "SparkCCW", "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "FirebarCW", "FirebarCCW", "SpikeBlock", "Bumper" ] ] #"Ice Palace - Big Spikes - Red Bari 4" + - [ 0x007f, 0, [ "Statue", "SparkCW", "SparkCCW", "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "FirebarCW", "FirebarCCW", "SpikeBlock", "Bumper", "Terrorpin", "RedEyegoreMimic"] ] #"Ice Palace - Big Spikes - Red Bari 1" + - [ 0x007f, 1, [ "Statue", "SparkCW", "SparkCCW", "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "FirebarCW", "FirebarCCW", "SpikeBlock", "Bumper", "Terrorpin", "RedEyegoreMimic", "Stalfos", "ArmosStatue" ] ] #"Ice Palace - Big Spikes - Red Bari 2" + - [ 0x007f, 2, [ "Statue", "SparkCW", "SparkCCW", "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "FirebarCW", "FirebarCCW", "SpikeBlock", "Bumper", "Terrorpin", "RedEyegoreMimic" ] ] #"Ice Palace - Big Spikes - Red Bari 3" + - [ 0x007f, 3, [ "Statue", "SparkCW", "SparkCCW", "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "FirebarCW", "FirebarCCW", "SpikeBlock", "Bumper", "Terrorpin", "RedEyegoreMimic" ] ] #"Ice Palace - Big Spikes - Red Bari 4" - [ 0x007f, 4, [ "RollerVerticalDown" ] ] #"Ice Palace - Big Spikes - Big Spike Trap 1" - [ 0x007f, 5, [ "RollerVerticalDown" ] ] #"Ice Palace - Big Spikes - Big Spike Trap 2" - [ 0x0082, 0, [ "RollerVerticalDown" ] ] #"Hyrule Castle - Basement Playpit - Blue Guard 1" @@ -326,7 +329,7 @@ UwGeneralDeny: - [ 0x00bc, 7, [ "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Thieves' Town - Toilet - Stalfos 3" - [ 0x00bc, 8, [ "RollerVerticalUp", "RollerVerticalDown" ] ] #"Thieves' Town - Toilet - Stalfos 4" - [ 0x00bf, 0, [ "Wizzrobe", "Statue" ] ] # Wizzrobes can't spawn on collision - - [ 0x00c1, 3, [ "RollerVerticalUp", "RollerHorizontalLeft" ] ] #"Misery Mire - 4 Rails - Stalfos 1" + - [ 0x00c1, 3, [ "RollerVerticalUp", "RollerHorizontalLeft", "Bumper" ] ] #"Misery Mire - 4 Rails - Stalfos 1" - [ 0x00c2, 0, [ "RollerHorizontalLeft", "RollerHorizontalRight" ] ] #"Misery Mire - Main Lobby - blue - Fire Snake 1" - [ 0x00c2, 5, [ "Wizzrobe", "Statue" ] ] # Wizzrobes can't spawn on pots - [ 0x00c5, 6, [ "RollerVerticalUp", "RollerVerticalDown", "RollerHorizontalLeft", "RollerHorizontalRight", "Beamos", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #"Turtle Rock - Catwalk - Mini Helmasaur" @@ -341,6 +344,7 @@ UwGeneralDeny: - [0x00cc, 6, [ "RollerVerticalUp", "RollerVerticalDown", "AntiFairyCircle", "Bumper"]] # prevent access around - [ 0x00cc, 8, [ "RollerVerticalUp", "RollerVerticalDown", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #Prevents Pot access (Beamos okay?) - [ 0x00cc, 12, [ "RollerVerticalUp", "RollerVerticalDown", "AntiFairyCircle", "BigSpike", "SpikeBlock", "Bumper" ] ] #Prevents Pot access (Beamos okay?) + - [0x00cc, 13, ["AntiFairyCircle", "Bumper"]] # Can block path - [ 0x00ce, 0, [ "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft", "AntiFairyCircle", "Antifairy", "BigSpike", "FirebarCCW", "Bumper", "Chainchomp"]] #"Ice Palace - Over Boss - top - Red Bari 1" - [ 0x00ce, 1, [ "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft", "AntiFairyCircle", "Antifairy", "BigSpike", "FirebarCW", "Bumper" ] ] #"Ice Palace - Over Boss - top - Red Bari 2" - [ 0x00ce, 3, [ "SparkCW", "SparkCCW", "RollerVerticalDown", "RollerVerticalUp", "RollerHorizontalRight", "RollerHorizontalLeft", "Beamos", "AntiFairyCircle", "Antifairy", "BigSpike", "FirebarCW", "FirebarCCW", "SpikeBlock", "Bumper", "Chainchomp"]] #"Ice Palace - Over Boss - top - Statue" @@ -425,7 +429,9 @@ OwGeneralDeny: - [0x03, 8, ["Gibo"]] # OldMan eating Gibo - [0x03, 9, ["Gibo"]] # OldMan eating Gibo - [0x03, 10, ["Gibo"]] # OldMan eating Gibo + - [0x05, 10, ["Bumper", "AntiFairyCircle"]] # Blocks path - [0x05, 11, ["Bumper", "AntiFairyCircle"]] # Blocks path to portal + - [0x07, 3, ["Bumper", "AntiFairyCircle"]] # Blocks path to ladder - [0x1e, 3, ["Beamos", "Bumper", "BigSpike", "AntiFairyCircle"]] # forbid a beamos here - [0x35, 8, ["RollerVerticalUp", "RollerVerticalDown"]] # blocks the dock - [0x40, 0, ["Beamos", "Bumper", "BigSpike", "AntiFairyCircle", "Thief"]] @@ -458,6 +464,7 @@ OwGeneralDeny: - [0x5e, 20, ["Gibo"]] # kiki eating Gibo - [0x62, 1, ["RollerVerticalUp", "RollerVerticalDown"]] # hard to avoid roller around hammer pegs - [0x62, 3, ["RollerVerticalUp", "RollerVerticalDown"]] # hard to avoid roller around hammer pegs + - [0x6d, 3, ["Bumper"]] # can block path with multiple bumpers - [0x77, 1, ["Bumper"]] # soft-lock potential near ladder - [0x7f, 1, ["Bumper"]] # soft-lock potential near ladder UwEnemyDrop: @@ -659,10 +666,10 @@ UwEnemyDrop: - [0x003b, 6, ["GreenMimic", "RedMimic"]] - [0x003d, 6, ["GreenMimic", "RedMimic"]] - [0x003d, 7, ["GreenMimic", "RedMimic"]] - - [0x003e, 8, ["GreenMimic", "RedMimic"]] - - [0x003e, 9, ["GreenMimic", "RedMimic"]] - - [0x003e, 10, ["GreenMimic", "RedMimic"]] - - [0x003e, 11, ["GreenMimic", "RedMimic"]] + - [0x003e, 8, ["GreenMimic", "RedMimic", "RedEyegoreMimic", "GreenEyegoreMimic"]] + - [0x003e, 9, ["GreenMimic", "RedMimic", "RedEyegoreMimic", "GreenEyegoreMimic"]] + - [0x003e, 10, ["GreenMimic", "RedMimic", "RedEyegoreMimic", "GreenEyegoreMimic"]] + - [0x003e, 11, ["GreenMimic", "RedMimic", "RedEyegoreMimic", "GreenEyegoreMimic"]] - [0x0044, 0, ["GreenMimic", "RedMimic"]] - [0x0044, 1, ["GreenMimic", "RedMimic"]] - [0x0044, 2, ["GreenMimic", "RedMimic"]] From 4e6f4255d96d51f4850f0a3bfc2b965710af2f26 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Sun, 20 Oct 2024 04:07:39 -0500 Subject: [PATCH 11/12] Fixed "this" dungeon items for glitched modes --- Rom.py | 6 ++---- source/dungeon/EnemyList.py | 2 -- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/Rom.py b/Rom.py index 6b3d0b3e..3af256a0 100644 --- a/Rom.py +++ b/Rom.py @@ -438,7 +438,7 @@ def patch_rom(world, rom, player, team, is_mystery=False): if location.item.name in valid_pot_items and location.item.player == player: location.pot.item = valid_pot_items[location.item.name] else: - code = handle_native_dungeon(location, itemid) + code = itemid standing_item_flag = 0x80 if location.item.player != player: standing_item_flag |= 0x40 @@ -453,7 +453,7 @@ def patch_rom(world, rom, player, team, is_mystery=False): continue elif location.type == LocationType.Bonk: address = snes_to_pc(location.address) - rom.write_byte(address, handle_native_dungeon(location, itemid)) + rom.write_byte(address, itemid) if location.item.player != player: rom.write_byte(address+1, location.item.player) else: @@ -463,8 +463,6 @@ def patch_rom(world, rom, player, team, is_mystery=False): continue if location.item is not None: - # Keys in their native dungeon should use the original item code for keys - itemid = handle_native_dungeon(location, itemid) if world.remote_items[player]: itemid = list(location_table.keys()).index(location.name) + 1 assert itemid < 0x100 diff --git a/source/dungeon/EnemyList.py b/source/dungeon/EnemyList.py index c6027ef0..331fd310 100644 --- a/source/dungeon/EnemyList.py +++ b/source/dungeon/EnemyList.py @@ -558,8 +558,6 @@ class Sprite(object): if self.location is not None: item_id = self.location.item.code if self.location.item is not None else 0x5A code = 0xF9 if self.location.item.player != self.location.player else 0xF8 - if code == 0xF8: - item_id = handle_native_dungeon(self.location, item_id) data.append(item_id) data.append(0 if code == 0xF8 else self.location.item.player) data.append(code) From 8cfdaf7d3c227fa1cd74b5697a5c6454286fd897 Mon Sep 17 00:00:00 2001 From: codemann8 Date: Sun, 20 Oct 2024 04:14:30 -0500 Subject: [PATCH 12/12] Version bump 0.5.0.4 --- CHANGELOG.md | 6 ++++++ OverworldShuffle.py | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 71dea1f0..887d7c31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 0.5.0.4 +- Fixed dark room item gfx +- Fixed dungeon item pickup behavior in cross-dungeon glitched scenarios +- \~Merged in DR v1.4.6~ + - Fixed Sanc & Quit behavior + ## 0.5.0.3 - Fixed crash on pedestal diff --git a/OverworldShuffle.py b/OverworldShuffle.py index f34344ff..a014689e 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.5.0.3' +version_number = '0.5.0.4' # branch indicator is intentionally different across branches version_branch = '-u'