diff --git a/Gui.py b/Gui.py index 5ca88ac1..a0f4726f 100755 --- a/Gui.py +++ b/Gui.py @@ -144,14 +144,14 @@ def guiMain(args=None): self.pages["randomizer"].pages["entrance"] = entrando_page(self.pages["randomizer"].notebook) self.pages["randomizer"].notebook.add(self.pages["randomizer"].pages["entrance"], text="Entrances") + # Dungeons + self.pages["randomizer"].pages["dungeon"] = dungeon_page(self.pages["randomizer"].notebook) + self.pages["randomizer"].notebook.add(self.pages["randomizer"].pages["dungeon"], text="Dungeons") + # Enemizer self.pages["randomizer"].pages["enemizer"],self.settings = enemizer_page(self.pages["randomizer"].notebook,self.settings) self.pages["randomizer"].notebook.add(self.pages["randomizer"].pages["enemizer"], text="Enemizer") - # Dungeon Shuffle - self.pages["randomizer"].pages["dungeon"] = dungeon_page(self.pages["randomizer"].notebook) - self.pages["randomizer"].notebook.add(self.pages["randomizer"].pages["dungeon"], text="Dungeon Shuffle") - # Multiworld # self.pages["randomizer"].pages["multiworld"],self.settings = multiworld_page(self.pages["randomizer"].notebook,self.settings) # self.pages["randomizer"].notebook.add(self.pages["randomizer"].pages["multiworld"], text="Multiworld") diff --git a/resources/app/gui/custom/overview/widgets.json b/resources/app/gui/custom/overview/widgets.json index ee7be421..03c7fbaf 100644 --- a/resources/app/gui/custom/overview/widgets.json +++ b/resources/app/gui/custom/overview/widgets.json @@ -1,4 +1,22 @@ { + "startHeader": { + "usestartinventory": { + "type": "checkbox", + "config": { + "padx": [10,0], + "pady": [10,10] + } + } + }, + "customHeader": { + "usecustompool": { + "type": "checkbox", + "config": { + "padx": [10,0], + "pady": [10,10] + } + } + }, "itemList1": { "bow": { "type": "textbox", diff --git a/resources/app/gui/lang/en.json b/resources/app/gui/lang/en.json index 5598f292..feadd457 100644 --- a/resources/app/gui/lang/en.json +++ b/resources/app/gui/lang/en.json @@ -57,21 +57,7 @@ "randomizer.dungeon.smallkeyshuffle.wild": "Randomized", "randomizer.dungeon.smallkeyshuffle.universal": "Universal", "randomizer.dungeon.bigkeyshuffle": "Big Keys", - "randomizer.dungeon.keydropshuffle": "Key Drop Shuffle (Legacy)", "randomizer.dungeon.decoupledoors": "Decouple Doors", - "randomizer.dungeon.dropshuffle": "Shuffle Enemy Key Drops", - "randomizer.dungeon.potshuffle": "Pot Shuffle (Legacy)", - "randomizer.dungeon.pottery": "Pottery", - "randomizer.dungeon.pottery.none": "None", - "randomizer.dungeon.pottery.keys": "Key Pots", - "randomizer.dungeon.pottery.cave": "Cave Pots", - "randomizer.dungeon.pottery.cavekeys": "Cave+Key Pots", - "randomizer.dungeon.pottery.reduced": "Reduced Dungeon Pots (Dynamic)", - "randomizer.dungeon.pottery.clustered": "Clustered Dungeon Pots (Dynamic)", - "randomizer.dungeon.pottery.nonempty": "Excludes Empty Pots", - "randomizer.dungeon.pottery.dungeon": "Dungeon Pots", - "randomizer.dungeon.pottery.lottery": "Lottery (All Pots and Large Blocks)", - "randomizer.dungeon.colorizepots": "Colorize Randomized Pots", "randomizer.dungeon.dungeondoorshuffle": "Dungeon Door Shuffle", "randomizer.dungeon.dungeondoorshuffle.vanilla": "Vanilla", @@ -123,7 +109,7 @@ "randomizer.enemizer.enemyshuffle.none": "None", "randomizer.enemizer.enemyshuffle.shuffled": "Shuffled", "randomizer.enemizer.enemyshuffle.random": "Random", - "randomizer.enemizer.enemyshuffle.legacy": "Random (including Thieves)", + "randomizer.enemizer.enemyshuffle.legacy": "Random (50/50 Thieves)", "randomizer.enemizer.bossshuffle": "Boss Shuffle", "randomizer.enemizer.bossshuffle.none": "None", @@ -168,8 +154,6 @@ "randomizer.overworld.whirlpool": "Whirlpool Shuffle", - "randomizer.overworld.bonk_drops": "Bonk Drops", - "randomizer.overworld.overworldflute": "Flute Shuffle", "randomizer.overworld.overworldflute.vanilla": "Vanilla", "randomizer.overworld.overworldflute.balanced": "Balanced", @@ -200,11 +184,6 @@ "randomizer.entrance.entranceshuffle.dungeonsfull": "Dungeons + Full", "randomizer.entrance.entranceshuffle.dungeonssimple": "Dungeons + Simple", - "randomizer.entrance.take_any": "Take Any Caves", - "randomizer.entrance.take_any.none": "None", - "randomizer.entrance.take_any.random": "Random", - "randomizer.entrance.take_any.fixed": "Fixed", - "randomizer.gameoptions.nobgm": "Disable Music & MSU-1", "randomizer.gameoptions.quickswap": "L/R Quickswapping", "randomizer.gameoptions.reduce_flashing": "Reduce Flashing", @@ -253,9 +232,6 @@ "randomizer.generation.createrom": "Create Patched ROM", "randomizer.generation.calcplaythrough": "Calculate Playthrough", "randomizer.generation.print_custom_yaml": "Print Customizer File", - "randomizer.generation.usestartinventory": "Use Starting Inventory", - "randomizer.generation.usecustompool": "Use Custom Item Pool", - "randomizer.generation.race": "Generate \"Race\" ROM", "randomizer.generation.saveonexit": "Save Settings on Exit", "randomizer.generation.saveonexit.ask": "Ask Me", @@ -267,10 +243,10 @@ "randomizer.generation.rom.dialog.romfiles": "Rom Files", "randomizer.generation.rom.dialog.allfiles": "All Files", - "randomizer.item.hints": "Include Helpful Hints", + "randomizer.item.hints": "Hints", + "randomizer.item.race": "Generate \"Race\" ROM", "randomizer.item.retro": "Retro mode", - "randomizer.item.pseudoboots": "Start with Pseudo Boots", - "randomizer.item.bombbag": "Bombbag", + "randomizer.item.pseudoboots": "Pseudoboots", "randomizer.item.worldstate": "World State", "randomizer.item.worldstate.standard": "Standard", @@ -322,24 +298,66 @@ "randomizer.item.weapons.swordless": "Swordless", "randomizer.item.weapons.vanilla": "Vanilla", - "randomizer.item.beemizer": "Beemizer", - "randomizer.item.beemizer.0": "No Bee Traps", - "randomizer.item.beemizer.1": "25% Bee Traps", - "randomizer.item.beemizer.2": "40% Traps, 20% Refills", - "randomizer.item.beemizer.3": "50% Traps, 50% Refills", - "randomizer.item.beemizer.4": "100% Bee Traps", + "randomizer.item.sortingalgo": "Item Fill", + "randomizer.item.sortingalgo.balanced": "Balanced", + "randomizer.item.sortingalgo.vanilla_fill": "Vanilla Fill", + "randomizer.item.sortingalgo.major_only": "Major Location Restriction", + "randomizer.item.sortingalgo.dungeon_only": "Dungeon Restriction", + "randomizer.item.sortingalgo.district": "District Restriction", - "randomizer.item.itempool": "Item Pool", - "randomizer.item.itempool.normal": "Normal", - "randomizer.item.itempool.hard": "Hard", - "randomizer.item.itempool.expert": "Expert", + "randomizer.item.accessibility": "Accessibility", + "randomizer.item.accessibility.items": "100% Inventory", + "randomizer.item.accessibility.locations": "100% Locations", + "randomizer.item.accessibility.none": "Beatable", - "randomizer.item.shopsanity": "Shopsanity", + "randomizer.item.restrict_boss_items": "Forbidden Boss Items", + "randomizer.item.restrict_boss_items.none": "None", + "randomizer.item.restrict_boss_items.mapcompass": "Map & Compass", + "randomizer.item.restrict_boss_items.dungeon": "Map & Compass & Keys", "randomizer.item.itemfunction": "Item Functionality", "randomizer.item.itemfunction.normal": "Normal", "randomizer.item.itemfunction.hard": "Hard", "randomizer.item.itemfunction.expert": "Expert", + + "randomizer.item.timer": "Timer Setting", + "randomizer.item.timer.none": "No Timer", + "randomizer.item.timer.display": "Stopwatch", + "randomizer.item.timer.timed": "Timed", + "randomizer.item.timer.timed-ohko": "Timed OHKO", + "randomizer.item.timer.ohko": "OHKO", + "randomizer.item.timer.timed-countdown": "Timed Countdown", + + "randomizer.item.shopsanity": "Shopsanity", + + "randomizer.item.bonk_drops": "Bonk Drops", + + "randomizer.item.pottery": "Pottery", + "randomizer.item.pottery.none": "None", + "randomizer.item.pottery.keys": "Key Pots", + "randomizer.item.pottery.cave": "Cave Pots", + "randomizer.item.pottery.cavekeys": "Cave+Key Pots", + "randomizer.item.pottery.reduced": "Reduced Dungeon Pots (Dynamic)", + "randomizer.item.pottery.clustered": "Clustered Dungeon Pots (Dynamic)", + "randomizer.item.pottery.nonempty": "Excludes Empty Pots", + "randomizer.item.pottery.dungeon": "Dungeon Pots", + "randomizer.item.pottery.lottery": "Lottery (All Pots and Large Blocks)", + + "randomizer.item.colorizepots": "Colorize Randomized Pots", + "randomizer.item.potshuffle": "Pot Shuffle (Legacy)", + + "randomizer.item.dropshuffle": "Shuffle Enemy Key Drops", + "randomizer.item.keydropshuffle": "Key Drop Shuffle (Legacy)", + + "randomizer.item.take_any": "Take Any Caves", + "randomizer.item.take_any.none": "None", + "randomizer.item.take_any.random": "Random", + "randomizer.item.take_any.fixed": "Fixed", + + "randomizer.item.itempool": "Item Pool", + "randomizer.item.itempool.normal": "Normal", + "randomizer.item.itempool.hard": "Hard", + "randomizer.item.itempool.expert": "Expert", "randomizer.item.flute_mode": "Flute Mode", "randomizer.item.flute_mode.normal": "Normal", @@ -351,30 +369,17 @@ "randomizer.item.bow_mode.retro": "Retro (Progressive)", "randomizer.item.bow_mode.retro_silvers": "Retro + Silvers", - "randomizer.item.timer": "Timer Setting", - "randomizer.item.timer.none": "No Timer", - "randomizer.item.timer.display": "Stopwatch", - "randomizer.item.timer.timed": "Timed", - "randomizer.item.timer.timed-ohko": "Timed OHKO", - "randomizer.item.timer.ohko": "OHKO", - "randomizer.item.timer.timed-countdown": "Timed Countdown", + "randomizer.item.beemizer": "Beemizer", + "randomizer.item.beemizer.0": "No Bee Traps", + "randomizer.item.beemizer.1": "25% Bee Traps", + "randomizer.item.beemizer.2": "40% Traps, 20% Refills", + "randomizer.item.beemizer.3": "50% Traps, 50% Refills", + "randomizer.item.beemizer.4": "100% Bee Traps", - "randomizer.item.accessibility": "Accessibility", - "randomizer.item.accessibility.items": "100% Inventory", - "randomizer.item.accessibility.locations": "100% Locations", - "randomizer.item.accessibility.none": "Beatable", + "randomizer.item.bombbag": "Bombbag", - "randomizer.item.sortingalgo": "Item Sorting", - "randomizer.item.sortingalgo.balanced": "Balanced", - "randomizer.item.sortingalgo.vanilla_fill": "Vanilla Fill", - "randomizer.item.sortingalgo.major_only": "Major Location Restriction", - "randomizer.item.sortingalgo.dungeon_only": "Dungeon Restriction", - "randomizer.item.sortingalgo.district": "District Restriction", - - "randomizer.item.restrict_boss_items": "Forbidden Boss Items", - "randomizer.item.restrict_boss_items.none": "None", - "randomizer.item.restrict_boss_items.mapcompass": "Map & Compass", - "randomizer.item.restrict_boss_items.dungeon": "Map & Compass & Keys", + "startinventory.usestartinventory": "Use Starting Inventory", + "custom.usecustompool": "Use Custom Item Pool", "bottom.content.worlds": "Worlds", "bottom.content.names": "Player names", diff --git a/resources/app/gui/randomize/dungeon/keysanity.json b/resources/app/gui/randomize/dungeon/keysanity.json index ffd9bc92..ec3ae380 100644 --- a/resources/app/gui/randomize/dungeon/keysanity.json +++ b/resources/app/gui/randomize/dungeon/keysanity.json @@ -1,5 +1,13 @@ { "keysanity": { + "smallkeyshuffle": { + "type": "selectbox", + "options": [ + "none", + "wild", + "universal" + ] + }, "mapshuffle": { "type": "checkbox" }, "compassshuffle": { "type": "checkbox" }, "bigkeyshuffle": { "type": "checkbox" } diff --git a/resources/app/gui/randomize/dungeon/widgets.json b/resources/app/gui/randomize/dungeon/widgets.json index e0cd2bdd..3f0abe94 100644 --- a/resources/app/gui/randomize/dungeon/widgets.json +++ b/resources/app/gui/randomize/dungeon/widgets.json @@ -1,12 +1,17 @@ { "widgets": { - "smallkeyshuffle": { + "key_logic_algorithm": { "type": "selectbox", + "default": "default", "options": [ - "none", - "wild", - "universal" - ] + "default", + "partial", + "strict" + ], + "config": { + "padx": [20,0], + "pady": [0,20] + } }, "dungeondoorshuffle": { "type": "selectbox", @@ -28,7 +33,8 @@ "random" ], "config": { - "width": 45 + "width": 45, + "padx": [20,0] } }, "door_type_mode": { @@ -41,7 +47,8 @@ "chaos" ], "config": { - "width": 45 + "width": 45, + "padx": [20,0] } }, "trap_door_mode": { @@ -54,41 +61,17 @@ "oneway" ], "config": { - "width": 30 + "width": 30, + "padx": [20,0] } }, - "key_logic_algorithm": { - "type": "selectbox", - "default": "default", - "options": [ - "default", - "partial", - "strict" - ] - }, - "decoupledoors": { "type": "checkbox" }, - "keydropshuffle": { "type": "checkbox" }, - "pottery": { - "type": "selectbox", - "default": "none", - "options": [ - "none", - "keys", - "cave", - "cavekeys", - "reduced", - "clustered", - "nonempty", - "dungeon", - "lottery" - ], + "decoupledoors": { + "type": "checkbox", "config": { - "width": 35 + "padx": [20,0], + "pady": [0,20] } }, - "colorizepots": { "type": "checkbox" }, - "dropshuffle": { "type": "checkbox" }, - "potshuffle": { "type": "checkbox" }, "experimental": { "type": "checkbox" }, "dungeon_counters": { "type": "selectbox", diff --git a/resources/app/gui/randomize/entrando/widgets.json b/resources/app/gui/randomize/entrando/widgets.json index 41413ebd..adc16d18 100644 --- a/resources/app/gui/randomize/entrando/widgets.json +++ b/resources/app/gui/randomize/entrando/widgets.json @@ -1,38 +1,5 @@ { "widgets": { - "openpyramid": { - "type": "selectbox", - "options": [ - "auto", - "yes", - "no" - ], - "config": { - "width": 10 - } - }, - "take_any": { - "type": "selectbox", - "options": [ - "none", - "random", - "fixed" - ] - }, - "shuffleganon": { "type": "checkbox" }, - "shufflelinks": { "type": "checkbox" }, - "shuffletavern": { "type": "checkbox" }, - "overworld_map": { - "type": "selectbox", - "options": [ - "default", - "compass", - "map" - ], - "config": { - "width": 45 - } - }, "entranceshuffle": { "type": "selectbox", "options": [ @@ -47,6 +14,47 @@ "dungeonsfull", "dungeonssimple" ] + }, + "shuffleganon": { + "type": "checkbox", + "config": { + "padx": [20,0] + } + }, + "shufflelinks": { + "type": "checkbox", + "config": { + "padx": [20,0] + } + }, + "shuffletavern": { + "type": "checkbox", + "config": { + "padx": [20,0] + } + }, + "openpyramid": { + "type": "selectbox", + "options": [ + "auto", + "yes", + "no" + ], + "config": { + "width": 6, + "pady": [20,0] + } + }, + "overworld_map": { + "type": "selectbox", + "options": [ + "default", + "compass", + "map" + ], + "config": { + "width": 45 + } } } } diff --git a/resources/app/gui/randomize/generation/checkboxes.json b/resources/app/gui/randomize/generation/checkboxes.json index b1ee4c84..6e377027 100644 --- a/resources/app/gui/randomize/generation/checkboxes.json +++ b/resources/app/gui/randomize/generation/checkboxes.json @@ -4,9 +4,6 @@ "bps": { "type": "checkbox" }, "createspoiler": { "type": "checkbox" }, "calcplaythrough": { "type": "checkbox" }, - "print_custom_yaml": { "type": "checkbox" }, - "usestartinventory": { "type": "checkbox" }, - "usecustompool": { "type": "checkbox" }, - "race": { "type": "checkbox" } + "print_custom_yaml": { "type": "checkbox" } } } diff --git a/resources/app/gui/randomize/item/widgets.json b/resources/app/gui/randomize/item/widgets.json index a2cde0ea..9bb62bfe 100644 --- a/resources/app/gui/randomize/item/widgets.json +++ b/resources/app/gui/randomize/item/widgets.json @@ -1,12 +1,8 @@ { "checkboxes": { - "retro": { "type": "checkbox" }, - "bombbag": { "type": "checkbox" }, - "shopsanity": { "type": "checkbox" }, - "hints": { - "type": "checkbox" - }, - "pseudoboots": { "type": "checkbox" } + "hints": { "type": "checkbox" }, + "pseudoboots": { "type": "checkbox" }, + "race": { "type": "checkbox" } }, "leftItemFrame": { "worldstate": { @@ -17,7 +13,10 @@ "open", "inverted", "retro" - ] + ], + "config": { + "command": "worldstate" + } }, "logiclevel": { "type": "selectbox", @@ -63,16 +62,38 @@ "swordless", "vanilla" ] - }, - "beemizer": { - "type": "selectbox", - "options": [ - "0", "1", "2", "3", "4" - ] } }, "rightItemFrame": { - "itempool": { + "sortingalgo": { + "type": "selectbox", + "default": "balanced", + "options": [ + "balanced", + "vanilla_fill", + "major_only", + "dungeon_only", + "district" + ] + }, + "accessibility": { + "type": "selectbox", + "options": [ + "items", + "locations", + "none" + ] + }, + "restrict_boss_items": { + "type": "selectbox", + "default": "none", + "options": [ + "none", + "mapcompass", + "dungeon" + ] + }, + "itemfunction": { "type": "selectbox", "options": [ "normal", @@ -80,7 +101,78 @@ "expert" ] }, - "itemfunction": { + "timer": { + "type": "selectbox", + "options": [ + "none", + "display", + "timed", + "timed-ohko", + "ohko", + "timed-countdown" + ] + } + }, + "leftPoolHeader": { + "shopsanity": { + "type": "checkbox" + }, + "bonk_drops": { + "type": "checkbox", + "default": false + } + }, + "leftPoolFrame": { + "pottery": { + "type": "selectbox", + "default": "none", + "options": [ + "none", + "keys", + "cave", + "cavekeys", + "reduced", + "clustered", + "nonempty", + "dungeon", + "lottery" + ], + "config": { + "width": 35 + } + }, + "colorizepots": { + "type": "checkbox", + "config": { + "padx": [50,0] + } + }, + "potshuffle": { + "type": "checkbox", + "config": { + "padx": [50,0] + } + }, + "dropshuffle": { + "type": "checkbox" + }, + "keydropshuffle": { + "type": "checkbox", + "config": { + "command": "keydropshuffle" + } + }, + "take_any": { + "type": "selectbox", + "options": [ + "none", + "random", + "fixed" + ] + } + }, + "rightPoolFrame": { + "itempool": { "type": "selectbox", "options": [ "normal", @@ -104,44 +196,17 @@ "retro_silvers" ] }, - "timer": { + "beemizer": { "type": "selectbox", "options": [ - "none", - "display", - "timed", - "timed-ohko", - "ohko", - "timed-countdown" + "0", "1", "2", "3", "4" ] }, - "accessibility": { - "type": "selectbox", - "options": [ - "items", - "locations", - "none" - ] - }, - "sortingalgo": { - "type": "selectbox", - "default": "balanced", - "options": [ - "balanced", - "vanilla_fill", - "major_only", - "dungeon_only", - "district" - ] - }, - "restrict_boss_items": { - "type": "selectbox", - "default": "none", - "options": [ - "none", - "mapcompass", - "dungeon" - ] + "bombbag": { + "type": "checkbox", + "config": { + "padx": [64,0] + } } } } diff --git a/resources/app/gui/randomize/overworld/widgets.json b/resources/app/gui/randomize/overworld/widgets.json index d349cfc0..c9438deb 100644 --- a/resources/app/gui/randomize/overworld/widgets.json +++ b/resources/app/gui/randomize/overworld/widgets.json @@ -1,10 +1,5 @@ { - "topOverworldFrame": { - "bonk_drops": { - "type": "checkbox", - "default": false - } - }, + "topOverworldFrame": {}, "leftOverworldFrame": { "overworldshuffle": { "type": "selectbox", @@ -28,11 +23,17 @@ }, "mixed": { "type": "checkbox", - "default": false + "default": false, + "config": { + "padx": [79,0] + } }, "whirlpool": { "type": "checkbox", - "default": false + "default": false, + "config": { + "padx": [79,0] + } }, "overworldflute": { "type": "selectbox", @@ -41,17 +42,26 @@ "vanilla", "balanced", "random" - ] + ], + "config": { + "pady": [20,0] + } } }, "rightOverworldFrame": { "terrain": { "type": "checkbox", - "default": false + "default": false, + "config": { + "pady": [3,0] + } }, "keepsimilar": { "type": "checkbox", - "default": false + "default": false, + "config": { + "pady": [6,0] + } } } } \ No newline at end of file diff --git a/source/classes/constants.py b/source/classes/constants.py index e816f61b..19b93027 100644 --- a/source/classes/constants.py +++ b/source/classes/constants.py @@ -56,25 +56,36 @@ SETTINGSTOPROCESS = { "randomizer": { "item": { "hints": "hints", - "retro": "retro", - "bombbag": "bombbag", - "shopsanity": "shopsanity", "pseudoboots": "pseudoboots", + "race": "race", + "worldstate": "mode", "logiclevel": "logic", "goal": "goal", "crystals_gt": "crystals_gt", "crystals_ganon": "crystals_ganon", "weapons": "swords", - "itempool": "difficulty", + + "sortingalgo": "algorithm", + "accessibility": "accessibility", + "restrict_boss_items": "restrict_boss_items", "itemfunction": "item_functionality", + "timer": "timer", + + "shopsanity": "shopsanity", + "bonk_drops": "bonk_drops", + "pottery": "pottery", + "colorizepots": "colorizepots", + "potshuffle": "shufflepots", + "dropshuffle": "dropshuffle", + "keydropshuffle": "keydropshuffle", + "take_any": "take_any", + + "itempool": "difficulty", "flute_mode": "flute_mode", "bow_mode": "bow_mode", - "timer": "timer", - "accessibility": "accessibility", - "sortingalgo": "algorithm", "beemizer": "beemizer", - "restrict_boss_items": "restrict_boss_items" + "bombbag": "bombbag" }, "overworld": { "overworldshuffle": "ow_shuffle", @@ -83,17 +94,31 @@ SETTINGSTOPROCESS = { "keepsimilar": "ow_keepsimilar", "mixed": "ow_mixed", "whirlpool": "ow_whirlpool", - "bonk_drops": "bonk_drops", "overworldflute": "ow_fluteshuffle" }, "entrance": { - "openpyramid": "openpyramid", + "entranceshuffle": "shuffle", "shuffleganon": "shuffleganon", "shufflelinks": "shufflelinks", "shuffletavern": "shuffletavern", - "entranceshuffle": "shuffle", + "openpyramid": "openpyramid", "overworld_map": "overworld_map", - "take_any": "take_any", + }, + "dungeon": { + "smallkeyshuffle": "keyshuffle", + "mapshuffle": "mapshuffle", + "compassshuffle": "compassshuffle", + "bigkeyshuffle": "bigkeyshuffle", + "key_logic_algorithm": "key_logic_algorithm", + "dungeondoorshuffle": "door_shuffle", + "dungeonintensity": "intensity", + "door_type_mode": "door_type_mode", + "trap_door_mode": "trap_door_mode", + "decoupledoors": "decoupledoors", + "experimental": "experimental", + "dungeon_counters": "dungeon_counters", + "mixed_travel": "mixed_travel", + "standardize_palettes": "standardize_palettes" }, "enemizer": { "enemyshuffle": "shuffleenemies", @@ -101,27 +126,6 @@ SETTINGSTOPROCESS = { "enemydamage": "enemy_damage", "enemyhealth": "enemy_health" }, - "dungeon": { - "mapshuffle": "mapshuffle", - "compassshuffle": "compassshuffle", - "smallkeyshuffle": "keyshuffle", - "bigkeyshuffle": "bigkeyshuffle", - "dungeondoorshuffle": "door_shuffle", - "dungeonintensity": "intensity", - "door_type_mode": "door_type_mode", - "trap_door_mode": "trap_door_mode", - "key_logic_algorithm": "key_logic_algorithm", - "decoupledoors": "decoupledoors", - "keydropshuffle": "keydropshuffle", - "dropshuffle": "dropshuffle", - "pottery": "pottery", - "colorizepots": "colorizepots", - "potshuffle": "shufflepots", - "experimental": "experimental", - "dungeon_counters": "dungeon_counters", - "mixed_travel": "mixed_travel", - "standardize_palettes": "standardize_palettes" - }, "gameoptions": { "nobgm": "disablemusic", "quickswap": "quickswap", @@ -141,12 +145,15 @@ SETTINGSTOPROCESS = { "createrom": "create_rom", "calcplaythrough": "calc_playthrough", "print_custom_yaml": "print_custom_yaml", - "usestartinventory": "usestartinventory", - "usecustompool": "custom", - "race": "race", "saveonexit": "saveonexit" } }, + "startinventory": { + "usestartinventory": "usestartinventory" + }, + "custom": { + "usecustompool": "custom" + }, "bottom": { "content": { "names": "names", diff --git a/source/gui/bottom.py b/source/gui/bottom.py index 27a22217..93976c75 100644 --- a/source/gui/bottom.py +++ b/source/gui/bottom.py @@ -203,13 +203,19 @@ def create_guiargs(parent): # Cycle through each page for mainpage in options: + subpage = None + _, v = next(iter(options[mainpage].items())) + if isinstance(v, str): + subpage = "" # Cycle through each subpage (in case of Item Randomizer) - for subpage in options[mainpage]: + for subpage in (options[mainpage] if subpage is None else [subpage]): # Cycle through each widget - for widget in options[mainpage][subpage]: + for widget in (options[mainpage][subpage] if subpage != "" else options[mainpage]): # Get the value and set it - arg = options[mainpage][subpage][widget] - setattr(guiargs, arg, parent.pages[mainpage].pages[subpage].widgets[widget].storageVar.get()) + arg = options[mainpage][subpage][widget] if subpage != "" else options[mainpage][widget] + page = parent.pages[mainpage].pages[subpage] if subpage != "" else parent.pages[mainpage] + pagewidgets = page.content.customWidgets if mainpage == "custom" else page.content.startingWidgets if mainpage == "startinventory" else page.widgets + setattr(guiargs, arg, pagewidgets[widget].storageVar.get()) # Get EnemizerCLI setting guiargs.enemizercli = parent.pages["randomizer"].pages["enemizer"].widgets["enemizercli"].storageVar.get() @@ -226,7 +232,7 @@ def create_guiargs(parent): guiargs.customizer = customizer_value # Get if we're using the Custom Item Pool - guiargs.custom = bool(parent.pages["randomizer"].pages["generation"].widgets["usecustompool"].storageVar.get()) + guiargs.custom = bool(parent.pages["custom"].content.customWidgets["usecustompool"].storageVar.get()) # Get Seed ID guiargs.seed = None @@ -285,7 +291,7 @@ def create_guiargs(parent): guiargs.dropshuffle = 1 guiargs.pottery = 'keys' if guiargs.pottery == 'none' else guiargs.pottery - if guiargs.retro or guiargs.mode == 'retro': + if (hasattr(guiargs, 'retro') and guiargs.retro) or guiargs.mode == 'retro': if guiargs.bow_mode == 'progressive': guiargs.bow_mode = 'retro' elif guiargs.bow_mode == 'silvers': diff --git a/source/gui/custom/overview.py b/source/gui/custom/overview.py index c51c35be..b62bff71 100644 --- a/source/gui/custom/overview.py +++ b/source/gui/custom/overview.py @@ -1,4 +1,4 @@ -from tkinter import ttk, Frame, N, E, W, LEFT, X, VERTICAL, Y +from tkinter import ttk, Frame, N, E, W, LEFT, TOP, X, VERTICAL, Y import source.gui.widgets as widgets import json import os @@ -11,10 +11,10 @@ def custom_page(top,parent): # Create uniform list columns def create_list_frame(parent, framename): - parent.frames[framename] = Frame(parent) - parent.frames[framename].pack(side=LEFT, padx=(0,0), anchor=N) - parent.frames[framename].thisRow = 0 - parent.frames[framename].thisCol = 0 + self.frames[framename] = Frame(parent) + self.frames[framename].pack(side=LEFT, padx=(0,0), anchor=N) + self.frames[framename].thisRow = 0 + self.frames[framename].thisCol = 0 # Create a vertical rule to help with splitting columns visually def create_vertical_rule(num=1): @@ -34,6 +34,8 @@ def custom_page(top,parent): # Custom Item Pool option sections self.frames = {} + self.frames["customHeader"] = Frame(self) + self.frames["customHeader"].pack(side=TOP, anchor=W) # Create 5 columns with 2 vertical rules in between each create_list_frame(self, "itemList1") create_vertical_rule(2) @@ -50,9 +52,14 @@ def custom_page(top,parent): with open(os.path.join("resources", "app", "gui", "custom", "overview", "widgets.json")) as widgetDefns: myDict = json.load(widgetDefns) for framename,theseWidgets in myDict.items(): - dictWidgets = widgets.make_widgets_from_dict(self, theseWidgets, self.frames[framename]) - for key in dictWidgets: - self.customWidgets[key] = dictWidgets[key] + if framename in self.frames: + dictWidgets = widgets.make_widgets_from_dict(self, theseWidgets, self.frames[framename]) + for key in dictWidgets: + self.customWidgets[key] = dictWidgets[key] + if framename == "customHeader": + packAttrs = {"anchor":W} + packAttrs = widgets.add_padding_from_config(packAttrs, theseWidgets[key]) + self.customWidgets[key].pack(packAttrs) # Load Custom Item Pool settings from settings file for key in CONST.CUSTOMITEMS: diff --git a/source/gui/loadcliargs.py b/source/gui/loadcliargs.py index 0130f8ad..6d358853 100644 --- a/source/gui/loadcliargs.py +++ b/source/gui/loadcliargs.py @@ -23,34 +23,41 @@ def loadcliargs(gui, args, settings=None): # Cycle through each page for mainpage in options: + subpage = None + _, v = next(iter(options[mainpage].items())) + if isinstance(v, str): + subpage = "" # Cycle through each subpage (in case of Item Randomizer) - for subpage in options[mainpage]: + for subpage in (options[mainpage] if subpage is None else [subpage]): # Cycle through each widget - for widget in options[mainpage][subpage]: - if widget in gui.pages[mainpage].pages[subpage].widgets: + for widget in (options[mainpage][subpage] if subpage != "" else options[mainpage]): + page = gui.pages[mainpage].pages[subpage] if subpage != "" else gui.pages[mainpage] + pagewidgets = page.content.customWidgets if mainpage == "custom" else page.content.startingWidgets if mainpage == "startinventory" else page.widgets + if widget in pagewidgets: thisType = "" # Get the value and set it - arg = options[mainpage][subpage][widget] + arg = options[mainpage][subpage][widget] if subpage != "" else options[mainpage][widget] if args[arg] == None: args[arg] = "" - label = fish.translate("gui","gui",mainpage + '.' + subpage + '.' + widget) - if hasattr(gui.pages[mainpage].pages[subpage].widgets[widget],"type"): - thisType = gui.pages[mainpage].pages[subpage].widgets[widget].type + label_ref = mainpage + ('.' + subpage if subpage != "" else '') + '.' + widget + label = fish.translate("gui","gui", label_ref) + if hasattr(pagewidgets[widget],"type"): + thisType = pagewidgets[widget].type if thisType == "checkbox": - gui.pages[mainpage].pages[subpage].widgets[widget].checkbox.configure(text=label) + pagewidgets[widget].checkbox.configure(text=label) elif thisType == "selectbox": - theseOptions = gui.pages[mainpage].pages[subpage].widgets[widget].selectbox.options - gui.pages[mainpage].pages[subpage].widgets[widget].label.configure(text=label) + theseOptions = pagewidgets[widget].selectbox.options + pagewidgets[widget].label.configure(text=label) i = 0 for value in theseOptions["values"]: - gui.pages[mainpage].pages[subpage].widgets[widget].selectbox.options["labels"][i] = fish.translate("gui","gui",mainpage + '.' + subpage + '.' + widget + '.' + str(value)) + pagewidgets[widget].selectbox.options["labels"][i] = fish.translate("gui","gui", label_ref + '.' + str(value)) i += 1 for i in range(0, len(theseOptions["values"])): - gui.pages[mainpage].pages[subpage].widgets[widget].selectbox["menu"].entryconfigure(i, label=theseOptions["labels"][i]) - gui.pages[mainpage].pages[subpage].widgets[widget].selectbox.options = theseOptions + pagewidgets[widget].selectbox["menu"].entryconfigure(i, label=theseOptions["labels"][i]) + pagewidgets[widget].selectbox.options = theseOptions elif thisType == "spinbox": - gui.pages[mainpage].pages[subpage].widgets[widget].label.configure(text=label) - gui.pages[mainpage].pages[subpage].widgets[widget].storageVar.set(args[arg]) + pagewidgets[widget].label.configure(text=label) + 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/dungeon.py b/source/gui/randomize/dungeon.py index 01985982..7400dbe4 100644 --- a/source/gui/randomize/dungeon.py +++ b/source/gui/randomize/dungeon.py @@ -1,4 +1,4 @@ -from tkinter import ttk, Frame, Label, E, W, LEFT, RIGHT +from tkinter import ttk, Frame, Label, E, W, LEFT, RIGHT, TOP import source.gui.widgets as widgets import json import os @@ -16,8 +16,8 @@ def dungeon_page(parent): self.frames["keysanity"].pack(anchor=W) ## Dungeon Item Shuffle - mscbLabel = Label(self.frames["keysanity"], text="Shuffle: ") - mscbLabel.pack(side=LEFT) + mscbLabel = Label(self.frames["keysanity"], text="Dungeon Items: ") + mscbLabel.pack(side=TOP, anchor=W) # Load Dungeon Shuffle option widgets as defined by JSON file # Defns include frame name, widget type, widget options, widget placement attributes @@ -28,7 +28,9 @@ def dungeon_page(parent): dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["keysanity"]) for key in dictWidgets: self.widgets[key] = dictWidgets[key] - self.widgets[key].pack(side=LEFT) + packAttrs = {"side":LEFT} + packAttrs = widgets.add_padding_from_config(packAttrs, myDict[key]) + self.widgets[key].pack(packAttrs) # These get split left & right self.frames["widgets"] = Frame(self) @@ -39,6 +41,8 @@ def dungeon_page(parent): dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["widgets"]) for key in dictWidgets: self.widgets[key] = dictWidgets[key] - self.widgets[key].pack(anchor=W) + packAttrs = {"anchor":W} + packAttrs = widgets.add_padding_from_config(packAttrs, myDict[key]) + self.widgets[key].pack(packAttrs) return self diff --git a/source/gui/randomize/entrando.py b/source/gui/randomize/entrando.py index bfc911b4..ba2bc365 100644 --- a/source/gui/randomize/entrando.py +++ b/source/gui/randomize/entrando.py @@ -26,9 +26,8 @@ def entrando_page(parent): dictWidgets = widgets.make_widgets_from_dict(self, theseWidgets, self.frames[framename]) for key in dictWidgets: self.widgets[key] = dictWidgets[key] - packAttrs = {"anchor":E} - if self.widgets[key].type == "checkbox" or key in ["openpyramid", "take_any"]: - packAttrs["anchor"] = W + packAttrs = {"anchor":W} + packAttrs = widgets.add_padding_from_config(packAttrs, theseWidgets[key]) self.widgets[key].pack(packAttrs) return self diff --git a/source/gui/randomize/item.py b/source/gui/randomize/item.py index 81c957ce..6898c75f 100644 --- a/source/gui/randomize/item.py +++ b/source/gui/randomize/item.py @@ -1,4 +1,4 @@ -from tkinter import ttk, Frame, E, W, LEFT, RIGHT, Label +from tkinter import ttk, font, Frame, E, W, NW, TOP, LEFT, RIGHT, Y, Label import source.gui.widgets as widgets import json import os @@ -17,13 +17,39 @@ def item_page(parent): self.frames["checkboxes"] = Frame(self) self.frames["checkboxes"].pack(anchor=W) - various_options = Label(self.frames["checkboxes"], text="") + various_options = Label(self.frames["checkboxes"], text="Options: ") various_options.pack(side=LEFT) - self.frames["leftItemFrame"] = Frame(self) - self.frames["rightItemFrame"] = Frame(self) + self.frames["mainFrame"] = Frame(self) + self.frames["mainFrame"].pack(side=TOP, pady=(20,0)) + + self.frames["poolFrame"] = Frame(self) + self.frames["poolFrame"].pack(fill=Y) + + self.frames["leftItemFrame"] = Frame(self.frames["mainFrame"]) self.frames["leftItemFrame"].pack(side=LEFT) + self.frames["rightItemFrame"] = Frame(self.frames["mainFrame"]) self.frames["rightItemFrame"].pack(side=RIGHT) + + self.frames["leftPoolContainer"] = Frame(self.frames["poolFrame"]) + self.frames["leftPoolContainer"].pack(side=LEFT, padx=(0,20)) + + base_font = font.nametofont('TkTextFont').actual() + underline_font = f'"{base_font["family"]}" {base_font["size"]} underline' + various_options = Label(self.frames["leftPoolContainer"], text="Pool Expansions", font=underline_font) + various_options.pack(side=TOP, pady=(20,0)) + + self.frames["leftPoolHeader"] = Frame(self.frames["leftPoolContainer"]) + 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["rightPoolFrame"] = Frame(self.frames["poolFrame"]) + self.frames["rightPoolFrame"].pack(side=RIGHT) + + various_options = Label(self.frames["rightPoolFrame"], text="Pool Modifications", font=underline_font) + various_options.pack(side=TOP, pady=(20,0)) # Load Item Randomizer option widgets as defined by JSON file # Defns include frame name, widget type, widget options, widget placement attributes @@ -36,8 +62,15 @@ def item_page(parent): for key in dictWidgets: self.widgets[key] = dictWidgets[key] packAttrs = {"anchor":E} - if self.widgets[key].type == "checkbox": + if self.widgets[key].type == "checkbox" or framename == "leftPoolFrame": + packAttrs["anchor"] = W + if framename == "checkboxes": packAttrs["side"] = LEFT + packAttrs["padx"] = (10,0) + elif framename == "leftPoolHeader": + packAttrs["side"] = LEFT + packAttrs["padx"] = (0,20) + packAttrs = widgets.add_padding_from_config(packAttrs, theseWidgets[key]) self.widgets[key].pack(packAttrs) return self diff --git a/source/gui/randomize/overworld.py b/source/gui/randomize/overworld.py index 190a750a..54120417 100644 --- a/source/gui/randomize/overworld.py +++ b/source/gui/randomize/overworld.py @@ -15,33 +15,24 @@ def overworld_page(parent): # Load Overworld Shuffle option widgets as defined by JSON file # Defns include frame name, widget type, widget options, widget placement attributes - self.frames["topOverworldFrame"] = Frame(self) self.frames["leftOverworldFrame"] = Frame(self) self.frames["rightOverworldFrame"] = Frame(self) - self.frames["topOverworldFrame"].pack(side=TOP, anchor=NW) self.frames["leftOverworldFrame"].pack(side=LEFT, anchor=NW, fill=Y) self.frames["rightOverworldFrame"].pack(anchor=NW, fill=Y) - - shuffleLabel = Label(self.frames["topOverworldFrame"], text="Shuffle: ") - shuffleLabel.pack(side=LEFT) with open(os.path.join("resources","app","gui","randomize","overworld","widgets.json")) as overworldWidgets: myDict = json.load(overworldWidgets) for framename,theseWidgets in myDict.items(): + if not theseWidgets: + continue dictWidgets = widgets.make_widgets_from_dict(self, theseWidgets, self.frames[framename]) for key in dictWidgets: self.widgets[key] = dictWidgets[key] - packAttrs = {"anchor":E} - if key == "terrain": - packAttrs = {"anchor":W, "pady":(3,0)} - elif key == "keepsimilar": - packAttrs = {"anchor":W, "pady":(6,0)} - elif key == "overworldflute": - packAttrs["pady"] = (20,0) - elif key in ["mixed", "whirlpool"]: - packAttrs = {"anchor":W, "padx":(79,0)} - + packAttrs = {"anchor":W} + if self.widgets[key].type != "checkbox": + packAttrs["anchor"] = E + packAttrs = widgets.add_padding_from_config(packAttrs, theseWidgets[key]) self.widgets[key].pack(packAttrs) return self diff --git a/source/gui/startinventory/overview.py b/source/gui/startinventory/overview.py index fce40e5f..97784521 100644 --- a/source/gui/startinventory/overview.py +++ b/source/gui/startinventory/overview.py @@ -1,4 +1,4 @@ -from tkinter import ttk, Frame, N, E, W, LEFT, X, VERTICAL, Y +from tkinter import ttk, Frame, N, E, W, LEFT, TOP, X, VERTICAL, Y import source.gui.widgets as widgets import json import os @@ -11,10 +11,10 @@ def startinventory_page(top,parent): # Create uniform list columns def create_list_frame(parent, framename): - parent.frames[framename] = Frame(parent) - parent.frames[framename].pack(side=LEFT, padx=(0,0), anchor=N) - parent.frames[framename].thisRow = 0 - parent.frames[framename].thisCol = 0 + self.frames[framename] = Frame(parent) + self.frames[framename].pack(side=LEFT, padx=(0,0), anchor=N) + self.frames[framename].thisRow = 0 + self.frames[framename].thisCol = 0 # Create a vertical rule to help with splitting columns visually def create_vertical_rule(num=1): @@ -34,6 +34,8 @@ def startinventory_page(top,parent): # Starting Inventory option sections self.frames = {} + self.frames["startHeader"] = Frame(self) + self.frames["startHeader"].pack(side=TOP, anchor=W) # Create 5 columns with 2 vertical rules in between each create_list_frame(self,"itemList1") create_vertical_rule(2) @@ -55,9 +57,14 @@ def startinventory_page(top,parent): if key in myDict[thisList]: del myDict[thisList][key] for framename,theseWidgets in myDict.items(): - dictWidgets = widgets.make_widgets_from_dict(self, theseWidgets, self.frames[framename]) - for key in dictWidgets: - self.startingWidgets[key] = dictWidgets[key] + if framename in self.frames: + dictWidgets = widgets.make_widgets_from_dict(self, theseWidgets, self.frames[framename]) + for key in dictWidgets: + self.startingWidgets[key] = dictWidgets[key] + if framename == "startHeader": + packAttrs = {"anchor":W} + packAttrs = widgets.add_padding_from_config(packAttrs, theseWidgets[key]) + self.startingWidgets[key].pack(packAttrs) # Load Custom Starting Inventory settings from settings file, ignoring ones to be excluded for key in CONST.CUSTOMITEMS: diff --git a/source/gui/widgets.py b/source/gui/widgets.py index aedb573d..0198a43a 100644 --- a/source/gui/widgets.py +++ b/source/gui/widgets.py @@ -1,4 +1,4 @@ -from tkinter import Checkbutton, Entry, Frame, IntVar, Label, OptionMenu, Spinbox, StringVar, LEFT, RIGHT, X +from tkinter import messagebox, Checkbutton, Entry, Frame, IntVar, Label, OptionMenu, Spinbox, StringVar, LEFT, RIGHT, X from source.classes.Empty import Empty # Override Spinbox to include mousewheel support for changing value @@ -16,7 +16,7 @@ class mySpinbox(Spinbox): self.invoke('buttonup') # Make a Checkbutton with a label -def make_checkbox(self, parent, label, storageVar, manager, managerAttrs): +def make_checkbox(self, parent, label, storageVar, manager, managerAttrs, config): self = Frame(parent) self.storageVar = storageVar if managerAttrs is not None and "default" in managerAttrs: @@ -25,7 +25,10 @@ def make_checkbox(self, parent, label, storageVar, manager, managerAttrs): elif managerAttrs["default"] == "false" or managerAttrs["default"] == False: self.storageVar.set(False) del managerAttrs["default"] - self.checkbox = Checkbutton(self, text=label, variable=self.storageVar) + options = {"text":label, "variable":self.storageVar} + if config and "command" in config: + options.update({"command":lambda m=config["command"]: widget_command(self, m)}) + self.checkbox = Checkbutton(self, options) if managerAttrs is not None: self.checkbox.pack(managerAttrs) else: @@ -43,7 +46,11 @@ def make_selectbox(self, parent, label, options, storageVar, manager, managerAtt self.labelVar = StringVar() self.storageVar = storageVar - self.selectbox = OptionMenu(self, self.labelVar, *labels) + if config and "command" in config: + self.command = config["command"] + self.selectbox = OptionMenu(self, self.labelVar, *labels, command=lambda m: widget_command(self, self.command)) + else: + self.selectbox = OptionMenu(self, self.labelVar, *labels) self.selectbox.options = {} if isinstance(options,dict): @@ -96,7 +103,7 @@ def make_selectbox(self, parent, label, options, storageVar, manager, managerAtt else: self.label.pack(side=LEFT) - self.selectbox.config(width=config['width'] if config and config['width'] else 20) + self.selectbox.config(width=config['width'] if config and 'width' in config else 20) idx = 0 default = self.selectbox.options["values"][idx] if managerAttrs is not None and "default" in managerAttrs: @@ -181,7 +188,7 @@ def make_widget(self, type, parent, label, storageVar=None, manager=None, manage if type == "checkbox": if thisStorageVar is None: thisStorageVar = IntVar() - widget = make_checkbox(self, parent, label, thisStorageVar, manager, managerAttrs) + widget = make_checkbox(self, parent, label, thisStorageVar, manager, managerAttrs, config) elif type == "selectbox": if thisStorageVar is None: thisStorageVar = StringVar() @@ -221,3 +228,51 @@ def make_widgets_from_dict(self, defns, parent): for key,defn in defns.items(): widgets[key] = make_widget_from_dict(self, defn, parent) return widgets + +# Add padding to widget +def add_padding_from_config(packAttrs, defn): + if "config" in defn: + config = defn["config"] + if 'padx' in config: + packAttrs["padx"] = config['padx'] + if 'pady' in config: + packAttrs["pady"] = config['pady'] + return packAttrs + +# Callback when a widget issues a command +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') + + 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') + + widget.storageVar.set('open') + 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"] + 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"] + temp_widget.storageVar.set(1) + text_output += f'\n {temp_widget.checkbox.cget("text")}' + + widget.storageVar.set(0) + messagebox.showinfo('', f'The following settings were changed:{text_output}')