From b513bbef1b8d946e5496ea468552564729906911 Mon Sep 17 00:00:00 2001 From: aerinon Date: Thu, 23 Mar 2023 15:33:29 -0600 Subject: [PATCH 1/7] Logic fix: hookshot needed for pots in GT Conveyor Cross --- DoorShuffle.py | 2 ++ Doors.py | 2 ++ Dungeons.py | 14 ++++++++------ Regions.py | 3 ++- Rules.py | 4 ++-- 5 files changed, 16 insertions(+), 9 deletions(-) diff --git a/DoorShuffle.py b/DoorShuffle.py index d7255077..56fda019 100644 --- a/DoorShuffle.py +++ b/DoorShuffle.py @@ -3806,6 +3806,8 @@ logical_connections = [ ('GT Blocked Stairs Block Path', 'GT Big Chest'), ('GT Speed Torch South Path', 'GT Speed Torch'), ('GT Speed Torch North Path', 'GT Speed Torch Upper'), + ('GT Conveyor Cross Hammer Path', 'GT Conveyor Cross Across Pits'), + ('GT Conveyor Cross Hookshot Path', 'GT Conveyor Cross'), ('GT Hookshot East-Mid Path', 'GT Hookshot Mid Platform'), ('GT Hookshot Mid-East Path', 'GT Hookshot East Platform'), ('GT Hookshot North-Mid Path', 'GT Hookshot Mid Platform'), diff --git a/Doors.py b/Doors.py index 0bd13742..e97505ee 100644 --- a/Doors.py +++ b/Doors.py @@ -1115,6 +1115,8 @@ def create_doors(world, player): create_door(player, 'GT Invisible Catwalk NE', Nrml).dir(No, 0x9c, Right, High).pos(2), create_door(player, 'GT Conveyor Cross EN', Nrml).dir(Ea, 0x8b, Top, High).pos(2), create_door(player, 'GT Conveyor Cross WN', Intr).dir(We, 0x8b, Top, High).pos(0), + create_door(player, 'GT Conveyor Cross Hammer Path', Lgcl), + create_door(player, 'GT Conveyor Cross Hookshot Path', Lgcl), create_door(player, 'GT Hookshot EN', Intr).dir(Ea, 0x8b, Top, High).pos(0), create_door(player, 'GT Hookshot East-Mid Path', Lgcl), create_door(player, 'GT Hookshot Mid-East Path', Lgcl), diff --git a/Dungeons.py b/Dungeons.py index 9d862b05..3835ef62 100644 --- a/Dungeons.py +++ b/Dungeons.py @@ -190,10 +190,11 @@ gt_regions = [ 'GT Tile Room', 'GT Speed Torch', 'GT Speed Torch Upper', 'GT Pots n Blocks', 'GT Crystal Conveyor', 'GT Crystal Conveyor Corner', 'GT Crystal Conveyor Left', 'GT Crystal Conveyor - Ranged Crystal', 'GT Crystal Conveyor Corner - Ranged Crystal', 'GT Compass Room', 'GT Invisible Bridges', 'GT Invisible Catwalk', - 'GT Conveyor Cross', 'GT Hookshot East Platform', 'GT Hookshot Mid Platform', 'GT Hookshot North Platform', - 'GT Hookshot South Platform', 'GT Hookshot South Entry', 'GT Hookshot South Entry - Ranged Crystal', 'GT Map Room', - 'GT Double Switch Entry', 'GT Double Switch Pot Corners - Ranged Switches', 'GT Double Switch Pot Corners', - 'GT Double Switch Left', 'GT Double Switch Left - Crystal', 'GT Double Switch Entry - Ranged Switches', + 'GT Conveyor Cross', 'GT Conveyor Cross Across Pits', 'GT Hookshot East Platform', 'GT Hookshot Mid Platform', + 'GT Hookshot North Platform', 'GT Hookshot South Platform', 'GT Hookshot South Entry', + 'GT Hookshot South Entry - Ranged Crystal', 'GT Map Room', 'GT Double Switch Entry', + 'GT Double Switch Pot Corners - Ranged Switches', 'GT Double Switch Pot Corners', 'GT Double Switch Left', + 'GT Double Switch Left - Crystal', 'GT Double Switch Entry - Ranged Switches', 'GT Double Switch Exit', 'GT Spike Crystal Left', 'GT Spike Crystal Right', 'GT Warp Maze - Left Section', 'GT Warp Maze - Mid Section', 'GT Warp Maze - Right Section', 'GT Warp Maze - Pit Section', 'GT Warp Maze - Pit Exit Warp Spot', @@ -204,8 +205,9 @@ gt_regions = [ 'GT Dash Hall', 'GT Hidden Spikes', 'GT Cannonball Bridge', 'GT Refill', 'GT Gauntlet 1', 'GT Gauntlet 2', 'GT Gauntlet 3', 'GT Gauntlet 4', 'GT Gauntlet 5', 'GT Beam Dash', 'GT Lanmolas 2', 'GT Quad Pot', 'GT Wizzrobes 1', 'GT Dashing Bridge', 'GT Wizzrobes 2', 'GT Conveyor Bridge', 'GT Torch Cross', 'GT Staredown', 'GT Falling Torches', - 'GT Mini Helmasaur Room', 'GT Bomb Conveyor', 'GT Crystal Circles', 'GT Crystal Inner Circle', 'GT Crystal Circles - Ranged Crystal', - 'GT Left Moldorm Ledge', 'GT Right Moldorm Ledge', 'GT Moldorm', 'GT Moldorm Pit', 'GT Validation', 'GT Validation Door', + 'GT Mini Helmasaur Room', 'GT Bomb Conveyor', 'GT Crystal Circles', 'GT Crystal Inner Circle', + 'GT Crystal Circles - Ranged Crystal', 'GT Left Moldorm Ledge', 'GT Right Moldorm Ledge', 'GT Moldorm', + 'GT Moldorm Pit', 'GT Validation', 'GT Validation Door', 'GT Frozen Over', 'GT Brightly Lit Hall', 'GT Agahnim 2', 'Ganons Tower Portal' ] diff --git a/Regions.py b/Regions.py index 6be2bbf3..a90e9f99 100644 --- a/Regions.py +++ b/Regions.py @@ -769,7 +769,8 @@ def create_dungeon_regions(world, player): ['GT Compass Room EN', 'GT Compass Room Warp']), create_dungeon_region(player, 'GT Invisible Bridges', 'Ganon\'s Tower', None, ['GT Invisible Bridges WS']), create_dungeon_region(player, 'GT Invisible Catwalk', 'Ganon\'s Tower', None, ['GT Invisible Catwalk ES', 'GT Invisible Catwalk WS', 'GT Invisible Catwalk NW', 'GT Invisible Catwalk NE']), - create_dungeon_region(player, 'GT Conveyor Cross', 'Ganon\'s Tower', ['Ganons Tower - Conveyor Cross Pot Key'], ['GT Conveyor Cross EN', 'GT Conveyor Cross WN']), + create_dungeon_region(player, 'GT Conveyor Cross', 'Ganon\'s Tower', ['Ganons Tower - Conveyor Cross Pot Key'], ['GT Conveyor Cross EN', 'GT Conveyor Cross Hammer Path']), + create_dungeon_region(player, 'GT Conveyor Cross Across Pits', 'Ganon\'s Tower', None, ['GT Conveyor Cross Hookshot Path', 'GT Conveyor Cross WN']), create_dungeon_region(player, 'GT Hookshot East Platform', 'Ganon\'s Tower', None, ['GT Hookshot EN', 'GT Hookshot East-Mid Path']), create_dungeon_region(player, 'GT Hookshot Mid Platform', 'Ganon\'s Tower', None, ['GT Hookshot Mid-East Path', 'GT Hookshot Mid-South Path', 'GT Hookshot Mid-North Path']), create_dungeon_region(player, 'GT Hookshot North Platform', 'Ganon\'s Tower', None, ['GT Hookshot NW', 'GT Hookshot North-Mid Path']), diff --git a/Rules.py b/Rules.py index 9e048b38..576fa5a0 100644 --- a/Rules.py +++ b/Rules.py @@ -387,8 +387,8 @@ def global_rules(world, player): set_rule(world.get_location('Ganons Tower - Bob\'s Torch', player), lambda state: state.has_Boots(player)) set_rule(world.get_entrance('GT Hope Room EN', player), lambda state: state.has('Cane of Somaria', player)) - set_rule(world.get_entrance('GT Conveyor Cross WN', player), lambda state: state.has('Hammer', player)) - set_rule(world.get_entrance('GT Conveyor Cross EN', player), lambda state: state.has('Hookshot', player)) + set_rule(world.get_entrance('GT Conveyor Cross Hammer Path', player), lambda state: state.has('Hammer', player)) + set_rule(world.get_entrance('GT Conveyor Cross Hookshot Path', player), lambda state: state.has('Hookshot', player)) if not world.get_door('GT Speed Torch SE', player).entranceFlag: set_rule(world.get_entrance('GT Speed Torch SE', player), lambda state: state.has('Fire Rod', player)) set_rule(world.get_entrance('GT Hookshot South-Mid Path', player), lambda state: state.has('Hookshot', player)) From 4a1efb141ab124f0007b1addffb4b9322e40d3af Mon Sep 17 00:00:00 2001 From: aerinon Date: Fri, 24 Mar 2023 09:12:46 -0600 Subject: [PATCH 2/7] Add collection_rate to customizer --- source/classes/CustomSettings.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/classes/CustomSettings.py b/source/classes/CustomSettings.py index 53105764..ba5bd705 100644 --- a/source/classes/CustomSettings.py +++ b/source/classes/CustomSettings.py @@ -116,6 +116,7 @@ class CustomSettings(object): args.crystals_gt[p] = get_setting(settings['crystals_gt'], args.crystals_gt[p]) args.crystals_ganon[p] = get_setting(settings['crystals_ganon'], args.crystals_ganon[p]) args.experimental[p] = get_setting(settings['experimental'], args.experimental[p]) + args.collection_rate[p] = get_setting(settings['collection_rate'], args.collection_rate[p]) args.openpyramid[p] = get_setting(settings['openpyramid'], args.openpyramid[p]) args.bigkeyshuffle[p] = get_setting(settings['bigkeyshuffle'], args.bigkeyshuffle[p]) args.keyshuffle[p] = get_setting(settings['keyshuffle'], args.keyshuffle[p]) @@ -244,6 +245,7 @@ class CustomSettings(object): settings_dict[p]['crystals_gt'] = world.crystals_gt_orig[p] settings_dict[p]['crystals_ganon'] = world.crystals_ganon_orig[p] settings_dict[p]['experimental'] = world.experimental[p] + settings_dict[p]['collection_rate'] = world.collection_rate[p] settings_dict[p]['openpyramid'] = world.open_pyramid[p] settings_dict[p]['bigkeyshuffle'] = world.bigkeyshuffle[p] settings_dict[p]['keyshuffle'] = world.keyshuffle[p] From abb11558d8a39029256ecd3d4c638f06938e00b3 Mon Sep 17 00:00:00 2001 From: aerinon Date: Wed, 5 Apr 2023 15:58:16 -0600 Subject: [PATCH 3/7] Correct version bump --- Main.py | 2 +- RELEASENOTES.md | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Main.py b/Main.py index 2894194e..8f97ef46 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.14' +version_number = '1.2.0.15' version_branch = '-u' __version__ = f'{version_number}{version_branch}' diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 8ee37b73..730f7bda 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -109,9 +109,7 @@ These are now independent of retro mode and have three options: None, Random, an # Bug Fixes and Notes -* 1.2.0.14u - * Small fix for key logic validation (got rid of a false negative) - * Customized doors in ice cross work properly now +* 1.2.0.15u * GUI reorganization * Auto option for pyramid open (trinity or ER + crystals goal) * World model refactor (combining inverted and normal world models) @@ -120,6 +118,9 @@ These are now independent of retro mode and have three options: None, Random, an * Reduced universal keys in pool slightly for non-vanilla dungeons * Fake world fix finally * Some extra restrictions on links house placement for lite/lean +* 1.2.0.14u + * Small fix for key logic validation (got rid of a false negative) + * Customized doors in ice cross work properly now * 1.2.0.13u * Allow green/blue potion refills to be customized * OW Map showing dungeon entrance at Snitch Lady (West) fixed (instead of @ HC Courtyard) From 3c18dc6e3a4bb9d8e795d6808045ac48d65ec0aa Mon Sep 17 00:00:00 2001 From: aerinon Date: Thu, 6 Apr 2023 11:22:12 -0600 Subject: [PATCH 4/7] Re-vamp multiple settings as buttons. Minor logic clean up. --- DoorShuffle.py | 2 +- Rules.py | 1 - resources/app/gui/lang/en.json | 3 +- resources/app/gui/randomize/item/widgets.json | 30 ++++--- source/classes/constants.py | 1 + source/gui/loadcliargs.py | 5 +- source/gui/randomize/item.py | 13 ++- source/gui/widgets.py | 87 ++++++++++--------- 8 files changed, 85 insertions(+), 57 deletions(-) diff --git a/DoorShuffle.py b/DoorShuffle.py index a0a6a8f8..407509c8 100644 --- a/DoorShuffle.py +++ b/DoorShuffle.py @@ -3295,7 +3295,7 @@ def find_inaccessible_regions(world, player): while len(queue) > 0: next_region = queue.popleft() visited_regions.add(next_region) - if next_region.name == 'Dark Sanctuary Hint': # special spawn point in cave + if world.mode[player] == 'inverted' and next_region.name == 'Dark Sanctuary Hint': # special spawn point in cave for ent in next_region.entrances: parent = ent.parent_region if parent and parent.type is not RegionType.Dungeon and parent not in queue and parent not in visited_regions: diff --git a/Rules.py b/Rules.py index e1ee26cb..a1c795a3 100644 --- a/Rules.py +++ b/Rules.py @@ -192,7 +192,6 @@ def global_rules(world, player): set_rule(world.get_location('Purple Chest', player), lambda state: state.has('Pick Up Purple Chest', player)) # Can S&Q with chest # underworld rules - set_rule(world.get_entrance('Old Man Cave Exit (West)', player), lambda state: False) # drop cannot be climbed up set_rule(world.get_location('Mimic Cave', player), lambda state: state.has('Hammer', player)) set_rule(world.get_entrance('Paradox Cave Push Block Reverse', player), lambda state: state.has_Mirror(player)) # can erase block - overridden in noglitches set_rule(world.get_location('Potion Shop', player), lambda state: state.has('Mushroom', player) and state.can_reach('Potion Shop Area', 'Region', player)) diff --git a/resources/app/gui/lang/en.json b/resources/app/gui/lang/en.json index 0395b3bc..eb53f640 100644 --- a/resources/app/gui/lang/en.json +++ b/resources/app/gui/lang/en.json @@ -226,6 +226,7 @@ "randomizer.item.worldstate.open": "Open", "randomizer.item.worldstate.inverted": "Inverted", "randomizer.item.worldstate.retro": "Retro", + "randomizer.item.retro": "Enable Retro", "randomizer.item.logiclevel": "Logic Level", "randomizer.item.logiclevel.noglitches": "No Glitches", @@ -320,7 +321,7 @@ "randomizer.item.potshuffle": "Pot Shuffle (Legacy)", "randomizer.item.dropshuffle": "Shuffle Enemy Key Drops", - "randomizer.item.keydropshuffle": "Key Drop Shuffle (Legacy)", + "randomizer.item.keydropshuffle": "Enable Key Drop Shuffle (Legacy)", "randomizer.item.take_any": "Take Any Caves", "randomizer.item.take_any.none": "None", diff --git a/resources/app/gui/randomize/item/widgets.json b/resources/app/gui/randomize/item/widgets.json index fad77e14..9857c45e 100644 --- a/resources/app/gui/randomize/item/widgets.json +++ b/resources/app/gui/randomize/item/widgets.json @@ -11,12 +11,8 @@ "options": [ "standard", "open", - "inverted", - "retro" - ], - "config": { - "command": "worldstate" - } + "inverted" + ] }, "logiclevel": { "type": "selectbox", @@ -65,6 +61,12 @@ } }, "rightItemFrame": { + "retro": { + "type": "button", + "config": { + "command": "retro" + } + }, "sortingalgo": { "type": "selectbox", "default": "balanced", @@ -140,20 +142,28 @@ "colorizepots": { "type": "checkbox", "config": { - "padx": [50,0] + "padx": [ + 50, + 0 + ] } }, "potshuffle": { "type": "checkbox", "config": { - "padx": [50,0] + "padx": [ + 50, + 0 + ] } }, "dropshuffle": { "type": "checkbox" - }, + } + }, + "leftPoolFrame2": { "keydropshuffle": { - "type": "checkbox", + "type": "button", "config": { "command": "keydropshuffle" } diff --git a/source/classes/constants.py b/source/classes/constants.py index 3f0fb620..812042b8 100644 --- a/source/classes/constants.py +++ b/source/classes/constants.py @@ -66,6 +66,7 @@ SETTINGSTOPROCESS = { "crystals_ganon": "crystals_ganon", "weapons": "swords", + "retro": "retro", "sortingalgo": "algorithm", "accessibility": "accessibility", "restrict_boss_items": "restrict_boss_items", diff --git a/source/gui/loadcliargs.py b/source/gui/loadcliargs.py index 6d358853..aec14a72 100644 --- a/source/gui/loadcliargs.py +++ b/source/gui/loadcliargs.py @@ -57,7 +57,10 @@ def loadcliargs(gui, args, settings=None): pagewidgets[widget].selectbox.options = theseOptions elif thisType == "spinbox": pagewidgets[widget].label.configure(text=label) - pagewidgets[widget].storageVar.set(args[arg]) + elif thisType == 'button': + pagewidgets[widget].button.configure(text=label) + if hasattr(pagewidgets[widget], 'storageVar'): + pagewidgets[widget].storageVar.set(args[arg]) # If we're on the Game Options page and it's not about Hints if subpage == "gameoptions" and widget not in ["hints", "collection_rate"]: # Check if we've got settings diff --git a/source/gui/randomize/item.py b/source/gui/randomize/item.py index 6898c75f..63a96997 100644 --- a/source/gui/randomize/item.py +++ b/source/gui/randomize/item.py @@ -43,7 +43,10 @@ def item_page(parent): self.frames["leftPoolHeader"].pack(side=TOP, anchor=W) self.frames["leftPoolFrame"] = Frame(self.frames["leftPoolContainer"]) - self.frames["leftPoolFrame"].pack(side=LEFT, fill=Y) + self.frames["leftPoolFrame"].pack(side=TOP, fill=Y) + + self.frames["leftPoolFrame2"] = Frame(self.frames["leftPoolContainer"]) + self.frames["leftPoolFrame2"].pack(side=LEFT, fill=Y) self.frames["rightPoolFrame"] = Frame(self.frames["poolFrame"]) self.frames["rightPoolFrame"].pack(side=RIGHT) @@ -62,14 +65,16 @@ def item_page(parent): for key in dictWidgets: self.widgets[key] = dictWidgets[key] packAttrs = {"anchor":E} - if self.widgets[key].type == "checkbox" or framename == "leftPoolFrame": + if key == "retro": + packAttrs["side"] = RIGHT + if self.widgets[key].type == "checkbox" or framename.startswith("leftPoolFrame"): packAttrs["anchor"] = W if framename == "checkboxes": packAttrs["side"] = LEFT - packAttrs["padx"] = (10,0) + packAttrs["padx"] = (10, 0) elif framename == "leftPoolHeader": packAttrs["side"] = LEFT - packAttrs["padx"] = (0,20) + packAttrs["padx"] = (0, 20) packAttrs = widgets.add_padding_from_config(packAttrs, theseWidgets[key]) self.widgets[key].pack(packAttrs) diff --git a/source/gui/widgets.py b/source/gui/widgets.py index 4723a526..be664369 100644 --- a/source/gui/widgets.py +++ b/source/gui/widgets.py @@ -1,4 +1,6 @@ + from tkinter import messagebox, Checkbutton, Entry, Frame, IntVar, Label, OptionMenu, Spinbox, StringVar, LEFT, RIGHT, X +from tkinter import Button from source.classes.Empty import Empty # Override Spinbox to include mousewheel support for changing value @@ -172,6 +174,22 @@ def make_textbox(self, parent, label, storageVar, manager, managerAttrs): widget.textbox.pack(managerAttrs["textbox"] if managerAttrs is not None and "textbox" in managerAttrs else None) return widget + +def make_button(self, parent, label, manager, managerAttrs, config): + self = Frame(parent) + if config and "command" in config: + self.command = config["command"] + else: + self.command = lambda: None + + self.button = Button(parent, text=label, command=lambda: widget_command(self, self.command)) + if managerAttrs is not None: + self.button.pack(managerAttrs) + else: + self.button.pack(anchor='w') + return self + + # Make a generic widget def make_widget(self, type, parent, label, storageVar=None, manager=None, managerAttrs=dict(), options=None, config=None): @@ -201,6 +219,8 @@ def make_widget(self, type, parent, label, storageVar=None, manager=None, manage if thisStorageVar is None: thisStorageVar = StringVar() widget = make_textbox(self, parent, label, thisStorageVar, manager, managerAttrs) + elif type == 'button': + widget = make_button(self, parent, label, manager, managerAttrs, config) widget.type = type return widget @@ -243,47 +263,36 @@ def add_padding_from_config(packAttrs, defn): def widget_command(widget, command=""): root = widget.winfo_toplevel() text_output = "" - if command == "worldstate": - if widget.storageVar.get() == 'retro': - temp_widget = root.pages["randomizer"].pages["dungeon"].widgets["smallkeyshuffle"] - text_output += f'\n {temp_widget.label.cget("text")}' - temp_widget.storageVar.set('universal') + if command == "retro": + temp_widget = root.pages["randomizer"].pages["dungeon"].widgets["smallkeyshuffle"] + text_output += f'\n {temp_widget.label.cget("text")}' + temp_widget.storageVar.set('universal') - temp_widget = root.pages["randomizer"].pages["item"].widgets["bow_mode"] - text_output += f'\n {temp_widget.label.cget("text")}' - if temp_widget.storageVar.get() == 'progressive': - temp_widget.storageVar.set('retro') - elif temp_widget.storageVar.get() == 'silvers': - temp_widget.storageVar.set('retro_silvers') + temp_widget = root.pages["randomizer"].pages["item"].widgets["bow_mode"] + text_output += f'\n {temp_widget.label.cget("text")}' + if temp_widget.storageVar.get() == 'progressive': + temp_widget.storageVar.set('retro') + elif temp_widget.storageVar.get() == 'silvers': + temp_widget.storageVar.set('retro_silvers') - temp_widget = root.pages["randomizer"].pages["item"].widgets["take_any"] - text_output += f'\n {temp_widget.label.cget("text")}' - if temp_widget.storageVar.get() == 'none': - temp_widget.storageVar.set('random') + temp_widget = root.pages["randomizer"].pages["item"].widgets["take_any"] + text_output += f'\n {temp_widget.label.cget("text")}' + if temp_widget.storageVar.get() == 'none': + temp_widget.storageVar.set('random') - widget.storageVar.set('open') - messagebox.showinfo('', f'The following settings were changed:{text_output}') + messagebox.showinfo('', f'The following settings were changed:{text_output}') elif command == "keydropshuffle": - if widget.storageVar.get() > 0: - temp_widget = root.pages["randomizer"].pages["item"].widgets["pottery"] - if temp_widget.storageVar.get() == 'none': - text_output += f'\n {temp_widget.label.cget("text")}' - temp_widget.storageVar.set('keys') + temp_widget = root.pages["randomizer"].pages["item"].widgets["pottery"] + text_output += f'\n {temp_widget.label.cget("text")}' + if temp_widget.storageVar.get() == 'none': + + temp_widget.storageVar.set('keys') + + temp_widget = root.pages["randomizer"].pages["item"].widgets["dropshuffle"] + text_output += f'\n {temp_widget.checkbox.cget("text")}' + if temp_widget.storageVar.get() == 0: + temp_widget.storageVar.set(1) + + if text_output: + messagebox.showinfo('', f'The following settings were changed:{text_output}') - temp_widget = root.pages["randomizer"].pages["item"].widgets["dropshuffle"] - if temp_widget.storageVar.get() == 0: - temp_widget.storageVar.set(1) - text_output += f'\n {temp_widget.checkbox.cget("text")}' - if text_output: - messagebox.showinfo('', f'The following settings were changed:{text_output}') - else: - temp_widget = root.pages["randomizer"].pages["item"].widgets["pottery"] - if temp_widget.storageVar.get() == 'keys': - text_output += f'\n {temp_widget.label.cget("text")}' - temp_widget.storageVar.set('none') - temp_widget = root.pages["randomizer"].pages["item"].widgets["dropshuffle"] - if temp_widget.storageVar.get() == 1: - temp_widget.storageVar.set(0) - text_output += f'\n {temp_widget.checkbox.cget("text")}' - if text_output: - messagebox.showinfo('', f'The following settings were changed:{text_output}') From 10eac87922ccd381425ba2a00ff85cd7d312a30d Mon Sep 17 00:00:00 2001 From: aerinon Date: Thu, 6 Apr 2023 11:23:04 -0600 Subject: [PATCH 5/7] Logic fix: hookshot needed for pots in GT conveyor cross --- DoorShuffle.py | 2 ++ Doors.py | 2 ++ Dungeons.py | 14 ++++++++------ Regions.py | 3 ++- Rules.py | 4 ++-- 5 files changed, 16 insertions(+), 9 deletions(-) diff --git a/DoorShuffle.py b/DoorShuffle.py index 407509c8..b236cd9e 100644 --- a/DoorShuffle.py +++ b/DoorShuffle.py @@ -3806,6 +3806,8 @@ logical_connections = [ ('GT Blocked Stairs Block Path', 'GT Big Chest'), ('GT Speed Torch South Path', 'GT Speed Torch'), ('GT Speed Torch North Path', 'GT Speed Torch Upper'), + ('GT Conveyor Cross Hammer Path', 'GT Conveyor Cross Across Pits'), + ('GT Conveyor Cross Hookshot Path', 'GT Conveyor Cross'), ('GT Hookshot East-Mid Path', 'GT Hookshot Mid Platform'), ('GT Hookshot Mid-East Path', 'GT Hookshot East Platform'), ('GT Hookshot North-Mid Path', 'GT Hookshot Mid Platform'), diff --git a/Doors.py b/Doors.py index 0bd13742..e97505ee 100644 --- a/Doors.py +++ b/Doors.py @@ -1115,6 +1115,8 @@ def create_doors(world, player): create_door(player, 'GT Invisible Catwalk NE', Nrml).dir(No, 0x9c, Right, High).pos(2), create_door(player, 'GT Conveyor Cross EN', Nrml).dir(Ea, 0x8b, Top, High).pos(2), create_door(player, 'GT Conveyor Cross WN', Intr).dir(We, 0x8b, Top, High).pos(0), + create_door(player, 'GT Conveyor Cross Hammer Path', Lgcl), + create_door(player, 'GT Conveyor Cross Hookshot Path', Lgcl), create_door(player, 'GT Hookshot EN', Intr).dir(Ea, 0x8b, Top, High).pos(0), create_door(player, 'GT Hookshot East-Mid Path', Lgcl), create_door(player, 'GT Hookshot Mid-East Path', Lgcl), diff --git a/Dungeons.py b/Dungeons.py index 9d862b05..3835ef62 100644 --- a/Dungeons.py +++ b/Dungeons.py @@ -190,10 +190,11 @@ gt_regions = [ 'GT Tile Room', 'GT Speed Torch', 'GT Speed Torch Upper', 'GT Pots n Blocks', 'GT Crystal Conveyor', 'GT Crystal Conveyor Corner', 'GT Crystal Conveyor Left', 'GT Crystal Conveyor - Ranged Crystal', 'GT Crystal Conveyor Corner - Ranged Crystal', 'GT Compass Room', 'GT Invisible Bridges', 'GT Invisible Catwalk', - 'GT Conveyor Cross', 'GT Hookshot East Platform', 'GT Hookshot Mid Platform', 'GT Hookshot North Platform', - 'GT Hookshot South Platform', 'GT Hookshot South Entry', 'GT Hookshot South Entry - Ranged Crystal', 'GT Map Room', - 'GT Double Switch Entry', 'GT Double Switch Pot Corners - Ranged Switches', 'GT Double Switch Pot Corners', - 'GT Double Switch Left', 'GT Double Switch Left - Crystal', 'GT Double Switch Entry - Ranged Switches', + 'GT Conveyor Cross', 'GT Conveyor Cross Across Pits', 'GT Hookshot East Platform', 'GT Hookshot Mid Platform', + 'GT Hookshot North Platform', 'GT Hookshot South Platform', 'GT Hookshot South Entry', + 'GT Hookshot South Entry - Ranged Crystal', 'GT Map Room', 'GT Double Switch Entry', + 'GT Double Switch Pot Corners - Ranged Switches', 'GT Double Switch Pot Corners', 'GT Double Switch Left', + 'GT Double Switch Left - Crystal', 'GT Double Switch Entry - Ranged Switches', 'GT Double Switch Exit', 'GT Spike Crystal Left', 'GT Spike Crystal Right', 'GT Warp Maze - Left Section', 'GT Warp Maze - Mid Section', 'GT Warp Maze - Right Section', 'GT Warp Maze - Pit Section', 'GT Warp Maze - Pit Exit Warp Spot', @@ -204,8 +205,9 @@ gt_regions = [ 'GT Dash Hall', 'GT Hidden Spikes', 'GT Cannonball Bridge', 'GT Refill', 'GT Gauntlet 1', 'GT Gauntlet 2', 'GT Gauntlet 3', 'GT Gauntlet 4', 'GT Gauntlet 5', 'GT Beam Dash', 'GT Lanmolas 2', 'GT Quad Pot', 'GT Wizzrobes 1', 'GT Dashing Bridge', 'GT Wizzrobes 2', 'GT Conveyor Bridge', 'GT Torch Cross', 'GT Staredown', 'GT Falling Torches', - 'GT Mini Helmasaur Room', 'GT Bomb Conveyor', 'GT Crystal Circles', 'GT Crystal Inner Circle', 'GT Crystal Circles - Ranged Crystal', - 'GT Left Moldorm Ledge', 'GT Right Moldorm Ledge', 'GT Moldorm', 'GT Moldorm Pit', 'GT Validation', 'GT Validation Door', + 'GT Mini Helmasaur Room', 'GT Bomb Conveyor', 'GT Crystal Circles', 'GT Crystal Inner Circle', + 'GT Crystal Circles - Ranged Crystal', 'GT Left Moldorm Ledge', 'GT Right Moldorm Ledge', 'GT Moldorm', + 'GT Moldorm Pit', 'GT Validation', 'GT Validation Door', 'GT Frozen Over', 'GT Brightly Lit Hall', 'GT Agahnim 2', 'Ganons Tower Portal' ] diff --git a/Regions.py b/Regions.py index 44f065db..bcbb76d4 100644 --- a/Regions.py +++ b/Regions.py @@ -786,7 +786,8 @@ def create_dungeon_regions(world, player): ['GT Compass Room EN', 'GT Compass Room Warp']), create_dungeon_region(player, 'GT Invisible Bridges', 'Ganon\'s Tower', None, ['GT Invisible Bridges WS']), create_dungeon_region(player, 'GT Invisible Catwalk', 'Ganon\'s Tower', None, ['GT Invisible Catwalk ES', 'GT Invisible Catwalk WS', 'GT Invisible Catwalk NW', 'GT Invisible Catwalk NE']), - create_dungeon_region(player, 'GT Conveyor Cross', 'Ganon\'s Tower', ['Ganons Tower - Conveyor Cross Pot Key'], ['GT Conveyor Cross EN', 'GT Conveyor Cross WN']), + create_dungeon_region(player, 'GT Conveyor Cross', 'Ganon\'s Tower', ['Ganons Tower - Conveyor Cross Pot Key'], ['GT Conveyor Cross EN', 'GT Conveyor Cross Hammer Path']), + create_dungeon_region(player, 'GT Conveyor Cross Across Pits', 'Ganon\'s Tower', None, ['GT Conveyor Cross Hookshot Path', 'GT Conveyor Cross WN']), create_dungeon_region(player, 'GT Hookshot East Platform', 'Ganon\'s Tower', None, ['GT Hookshot EN', 'GT Hookshot East-Mid Path']), create_dungeon_region(player, 'GT Hookshot Mid Platform', 'Ganon\'s Tower', None, ['GT Hookshot Mid-East Path', 'GT Hookshot Mid-South Path', 'GT Hookshot Mid-North Path']), create_dungeon_region(player, 'GT Hookshot North Platform', 'Ganon\'s Tower', None, ['GT Hookshot NW', 'GT Hookshot North-Mid Path']), diff --git a/Rules.py b/Rules.py index a1c795a3..e8dc7aa5 100644 --- a/Rules.py +++ b/Rules.py @@ -467,8 +467,8 @@ def global_rules(world, player): set_rule(world.get_location('Ganons Tower - Bob\'s Torch', player), lambda state: state.has_Boots(player)) set_rule(world.get_entrance('GT Hope Room EN', player), lambda state: state.has('Cane of Somaria', player)) - set_rule(world.get_entrance('GT Conveyor Cross WN', player), lambda state: state.has('Hammer', player)) - set_rule(world.get_entrance('GT Conveyor Cross EN', player), lambda state: state.has('Hookshot', player)) + set_rule(world.get_entrance('GT Conveyor Cross Hammer Path', player), lambda state: state.has('Hammer', player)) + set_rule(world.get_entrance('GT Conveyor Cross Hookshot Path', player), lambda state: state.has('Hookshot', player)) if not world.get_door('GT Speed Torch SE', player).entranceFlag: set_rule(world.get_entrance('GT Speed Torch SE', player), lambda state: state.has('Fire Rod', player)) set_rule(world.get_entrance('GT Hookshot South-Mid Path', player), lambda state: state.has('Hookshot', player)) From 85afd0c09ebb415511fbb95efe06a29292b89b16 Mon Sep 17 00:00:00 2001 From: aerinon Date: Thu, 6 Apr 2023 11:23:54 -0600 Subject: [PATCH 6/7] Add collection_rate to customizer --- source/classes/CustomSettings.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/classes/CustomSettings.py b/source/classes/CustomSettings.py index 53105764..ba5bd705 100644 --- a/source/classes/CustomSettings.py +++ b/source/classes/CustomSettings.py @@ -116,6 +116,7 @@ class CustomSettings(object): args.crystals_gt[p] = get_setting(settings['crystals_gt'], args.crystals_gt[p]) args.crystals_ganon[p] = get_setting(settings['crystals_ganon'], args.crystals_ganon[p]) args.experimental[p] = get_setting(settings['experimental'], args.experimental[p]) + args.collection_rate[p] = get_setting(settings['collection_rate'], args.collection_rate[p]) args.openpyramid[p] = get_setting(settings['openpyramid'], args.openpyramid[p]) args.bigkeyshuffle[p] = get_setting(settings['bigkeyshuffle'], args.bigkeyshuffle[p]) args.keyshuffle[p] = get_setting(settings['keyshuffle'], args.keyshuffle[p]) @@ -244,6 +245,7 @@ class CustomSettings(object): settings_dict[p]['crystals_gt'] = world.crystals_gt_orig[p] settings_dict[p]['crystals_ganon'] = world.crystals_ganon_orig[p] settings_dict[p]['experimental'] = world.experimental[p] + settings_dict[p]['collection_rate'] = world.collection_rate[p] settings_dict[p]['openpyramid'] = world.open_pyramid[p] settings_dict[p]['bigkeyshuffle'] = world.bigkeyshuffle[p] settings_dict[p]['keyshuffle'] = world.keyshuffle[p] From ef63511bd8305b2d44845b44b4ffc7d64f6063e1 Mon Sep 17 00:00:00 2001 From: aerinon Date: Thu, 6 Apr 2023 11:25:32 -0600 Subject: [PATCH 7/7] Update notes --- RELEASENOTES.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 730f7bda..71b3ec75 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -111,6 +111,7 @@ These are now independent of retro mode and have three options: None, Random, an * 1.2.0.15u * GUI reorganization + * Logic fix for pots in GT conveyor cross * Auto option for pyramid open (trinity or ER + crystals goal) * World model refactor (combining inverted and normal world models) * Partitioned fix for lamp logic and links house @@ -118,6 +119,7 @@ These are now independent of retro mode and have three options: None, Random, an * Reduced universal keys in pool slightly for non-vanilla dungeons * Fake world fix finally * Some extra restrictions on links house placement for lite/lean + * Collection_rate works in customizer files * 1.2.0.14u * Small fix for key logic validation (got rid of a false negative) * Customized doors in ice cross work properly now