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}')