From 98c7ee02f21cc5e6ae42a52ac9e62c11f8080939 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 8 Feb 2020 10:17:55 -0800 Subject: [PATCH 001/117] Move everything out of work area Move stuff to a throwaway tab for now Create packages for eventual destinations of stuff --- Gui.py | 24 +++++++++++++----------- gui/__init__.py | 1 + gui/about/__init__.py | 1 + gui/adjust/__init__.py | 1 + gui/custom/__init__.py | 1 + gui/randomize/__init__.py | 1 + 6 files changed, 18 insertions(+), 11 deletions(-) create mode 100644 gui/__init__.py create mode 100644 gui/about/__init__.py create mode 100644 gui/adjust/__init__.py create mode 100644 gui/custom/__init__.py create mode 100644 gui/randomize/__init__.py diff --git a/Gui.py b/Gui.py index 9df8dffa..659f7eaa 100755 --- a/Gui.py +++ b/Gui.py @@ -28,9 +28,11 @@ def guiMain(args=None): randomizerWindow = ttk.Frame(notebook) adjustWindow = ttk.Frame(notebook) customWindow = ttk.Frame(notebook) + sortWindow = ttk.Frame(notebook) notebook.add(randomizerWindow, text='Randomize') notebook.add(adjustWindow, text='Adjust') notebook.add(customWindow, text='Custom') + notebook.add(sortWindow, text='SORT') notebook.pack() # Shared Controls @@ -55,7 +57,7 @@ def guiMain(args=None): # randomizer controls - topFrame = Frame(randomizerWindow) + topFrame = Frame(sortWindow) rightHalfFrame = Frame(topFrame) checkBoxFrame = Frame(rightHalfFrame) @@ -338,7 +340,7 @@ def guiMain(args=None): accessibilityFrame.pack(expand=True, anchor=E) algorithmFrame.pack(expand=True, anchor=E) - enemizerFrame = LabelFrame(randomizerWindow, text="Enemizer", padx=5, pady=2) + enemizerFrame = LabelFrame(sortWindow, text="Enemizer", padx=5, pady=2) enemizerFrame.columnconfigure(0, weight=1) enemizerFrame.columnconfigure(1, weight=1) enemizerFrame.columnconfigure(2, weight=1) @@ -400,18 +402,18 @@ def guiMain(args=None): bottomFrame = Frame(randomizerWindow, pady=5) - worldLabel = Label(bottomFrame, text='Worlds') + worldLabel = Label(sortWindow, text='Worlds') worldVar = StringVar() - worldSpinbox = Spinbox(bottomFrame, from_=1, to=100, width=5, textvariable=worldVar) - namesLabel = Label(bottomFrame, text='Player names') + worldSpinbox = Spinbox(sortWindow, from_=1, to=100, width=5, textvariable=worldVar) + namesLabel = Label(sortWindow, text='Player names') namesVar = StringVar() - namesEntry = Entry(bottomFrame, textvariable=namesVar) - seedLabel = Label(bottomFrame, text='Seed #') + namesEntry = Entry(sortWindow, textvariable=namesVar) + seedLabel = Label(farBottomFrame, text='Seed #') seedVar = StringVar() - seedEntry = Entry(bottomFrame, width=15, textvariable=seedVar) - countLabel = Label(bottomFrame, text='Count') + seedEntry = Entry(farBottomFrame, width=15, textvariable=seedVar) + countLabel = Label(farBottomFrame, text='Count') countVar = StringVar() - countSpinbox = Spinbox(bottomFrame, from_=1, to=100, width=5, textvariable=countVar) + countSpinbox = Spinbox(farBottomFrame, from_=1, to=100, width=5, textvariable=countVar) def generateRom(): guiargs = Namespace() @@ -491,7 +493,7 @@ def guiMain(args=None): else: messagebox.showinfo(title="Success", message="Rom patched successfully") - generateButton = Button(bottomFrame, text='Generate Patched Rom', command=generateRom) + generateButton = Button(farBottomFrame, text='Generate Patched Rom', command=generateRom) worldLabel.pack(side=LEFT) worldSpinbox.pack(side=LEFT) diff --git a/gui/__init__.py b/gui/__init__.py new file mode 100644 index 00000000..8c5232bc --- /dev/null +++ b/gui/__init__.py @@ -0,0 +1 @@ +# do nothing, just exist to make "gui" package diff --git a/gui/about/__init__.py b/gui/about/__init__.py new file mode 100644 index 00000000..1ad9a517 --- /dev/null +++ b/gui/about/__init__.py @@ -0,0 +1 @@ +# do nothing, just exist to make "gui.about" package diff --git a/gui/adjust/__init__.py b/gui/adjust/__init__.py new file mode 100644 index 00000000..3e1ae764 --- /dev/null +++ b/gui/adjust/__init__.py @@ -0,0 +1 @@ +# do nothing, just exist to make "gui.adjust" package diff --git a/gui/custom/__init__.py b/gui/custom/__init__.py new file mode 100644 index 00000000..33cec31c --- /dev/null +++ b/gui/custom/__init__.py @@ -0,0 +1 @@ +# do nothing, just exist to make "gui.custom" package diff --git a/gui/randomize/__init__.py b/gui/randomize/__init__.py new file mode 100644 index 00000000..ecf3a271 --- /dev/null +++ b/gui/randomize/__init__.py @@ -0,0 +1 @@ +# do nothing, just exist to make "gui.randomize" package From cdd246f811d6adcb8d03d8a5dc49f4bf6960a133 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 8 Feb 2020 10:31:12 -0800 Subject: [PATCH 002/117] Prepare pages for elements --- Gui.py | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/Gui.py b/Gui.py index 659f7eaa..af6772a3 100755 --- a/Gui.py +++ b/Gui.py @@ -57,6 +57,48 @@ def guiMain(args=None): # randomizer controls + # Randomize notebook page: + # make notebook pages: Item, Entrances, Enemizer, Dungeon Shuffle, Multiworld, Game Options, Generation Setup + # Item: Item Randomizer settings + # Entrances: Entrance Randomizer settings + # Enemizer: Enemy Randomizer settings + # Dungeon Shuffle: Dungeon Door Randomizer settings + # Multiworld: Multiworld settings + # Game Options: Cosmetic settings that don't affect logic/placement + # Generation Setup: Primarily one&done settings + randomizerNotebook = ttk.Notebook(randomizerWindow) + + # Item Randomizer + itemWindow = ttk.Frame(randomizerNotebook) + randomizerNotebook.add(itemWindow, text="Items") + + # Entrance Randomizer + entrandoWindow = ttk.Frame(randomizerNotebook) + randomizerNotebook.add(entrandoWindow, text="Entrances") + + # Enemizer + enemizerWindow = ttk.Frame(randomizerNotebook) + randomizerNotebook.add(enemizerWindow, text="Enemizer") + + # Dungeon Shuffle + dungeonRandoWindow = ttk.Frame(randomizerNotebook) + randomizerNotebook.add(dungeonRandoWindow, text="Dungeon Shuffle") + + # Multiworld + multiworldWindow = ttk.Frame(randomizerNotebook) + randomizerNotebook.add(multiworldWindow, text="Multiworld") + + # Game Options + gameOptionsWindow = ttk.Frame(randomizerNotebook) + randomizerNotebook.add(gameOptionsWindow, text="Game Options") + + # Generation Setup + generationSetupWindow = ttk.Frame(randomizerNotebook) + randomizerNotebook.add(generationSetupWindow, text="Generation Setup") + + # add randomizer notebook to main window + randomizerNotebook.pack() + topFrame = Frame(sortWindow) rightHalfFrame = Frame(topFrame) checkBoxFrame = Frame(rightHalfFrame) From 1059c9b40a3b8f1b2316acc9f9340152c42aa887 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 8 Feb 2020 11:00:51 -0800 Subject: [PATCH 003/117] Sort Item Randomizer --- Gui.py | 172 +++++++----------------------------------- gui/randomize/item.py | 139 ++++++++++++++++++++++++++++++++++ 2 files changed, 167 insertions(+), 144 deletions(-) create mode 100644 gui/randomize/item.py diff --git a/Gui.py b/Gui.py index af6772a3..b4f60fd2 100755 --- a/Gui.py +++ b/Gui.py @@ -12,6 +12,7 @@ from urllib.request import urlopen from AdjusterMain import adjust from DungeonRandomizer import parse_arguments +from gui.randomize.item import item_page from GuiUtils import ToolTips, set_icon, BackgroundTaskProgress from Main import main, __version__ as ESVersion from Rom import Sprite @@ -69,7 +70,7 @@ def guiMain(args=None): randomizerNotebook = ttk.Notebook(randomizerWindow) # Item Randomizer - itemWindow = ttk.Frame(randomizerNotebook) + itemWindow = item_page(randomizerNotebook) randomizerNotebook.add(itemWindow, text="Items") # Entrance Randomizer @@ -119,8 +120,6 @@ def guiMain(args=None): keyshuffleCheckbutton = Checkbutton(mcsbshuffleFrame, text="Keys", variable=keyshuffleVar) bigkeyshuffleVar = IntVar() bigkeyshuffleCheckbutton = Checkbutton(mcsbshuffleFrame, text="BigKeys", variable=bigkeyshuffleVar) - retroVar = IntVar() - retroCheckbutton = Checkbutton(checkBoxFrame, text="Retro mode (universal keys)", variable=retroVar) shuffleGanonVar = IntVar() shuffleGanonVar.set(1) #set default shuffleGanonCheckbutton = Checkbutton(checkBoxFrame, text="Include Ganon's Tower and Pyramid Hole in shuffle pool", variable=shuffleGanonVar) @@ -139,7 +138,6 @@ def guiMain(args=None): compassshuffleCheckbutton.grid(row=0, column=2) keyshuffleCheckbutton.grid(row=0, column=3) bigkeyshuffleCheckbutton.grid(row=0, column=4) - retroCheckbutton.pack(expand=True, anchor=W) shuffleGanonCheckbutton.pack(expand=True, anchor=W) hintsCheckbutton.pack(expand=True, anchor=W) customCheckbutton.pack(expand=True, anchor=W) @@ -252,102 +250,6 @@ def guiMain(args=None): drowDownFrame = Frame(topFrame) - modeFrame = Frame(drowDownFrame) - modeVar = StringVar() - modeVar.set('open') - modeOptionMenu = OptionMenu(modeFrame, modeVar, 'standard', 'open', 'inverted') - modeOptionMenu.pack(side=RIGHT) - modeLabel = Label(modeFrame, text='Game mode') - modeLabel.pack(side=LEFT) - - logicFrame = Frame(drowDownFrame) - logicVar = StringVar() - logicVar.set('noglitches') - logicOptionMenu = OptionMenu(logicFrame, logicVar, 'noglitches', 'minorglitches', 'nologic') - logicOptionMenu.pack(side=RIGHT) - logicLabel = Label(logicFrame, text='Game logic') - logicLabel.pack(side=LEFT) - - goalFrame = Frame(drowDownFrame) - goalVar = StringVar() - goalVar.set('ganon') - goalOptionMenu = OptionMenu(goalFrame, goalVar, 'ganon', 'pedestal', 'dungeons', 'triforcehunt', 'crystals') - goalOptionMenu.pack(side=RIGHT) - goalLabel = Label(goalFrame, text='Game goal') - goalLabel.pack(side=LEFT) - - crystalsGTFrame = Frame(drowDownFrame) - crystalsGTVar = StringVar() - crystalsGTVar.set('7') - crystalsGTOptionMenu = OptionMenu(crystalsGTFrame, crystalsGTVar, '0', '1', '2', '3', '4', '5', '6', '7', 'random') - crystalsGTOptionMenu.pack(side=RIGHT) - crystalsGTLabel = Label(crystalsGTFrame, text='Crystals to open Ganon\'s Tower') - crystalsGTLabel.pack(side=LEFT) - - crystalsGanonFrame = Frame(drowDownFrame) - crystalsGanonVar = StringVar() - crystalsGanonVar.set('7') - crystalsGanonOptionMenu = OptionMenu(crystalsGanonFrame, crystalsGanonVar, '0', '1', '2', '3', '4', '5', '6', '7', 'random') - crystalsGanonOptionMenu.pack(side=RIGHT) - crystalsGanonLabel = Label(crystalsGanonFrame, text='Crystals to fight Ganon') - crystalsGanonLabel.pack(side=LEFT) - - swordFrame = Frame(drowDownFrame) - swordVar = StringVar() - swordVar.set('random') - swordOptionMenu = OptionMenu(swordFrame, swordVar, 'random', 'assured', 'swordless', 'vanilla') - swordOptionMenu.pack(side=RIGHT) - swordLabel = Label(swordFrame, text='Sword availability') - swordLabel.pack(side=LEFT) - - difficultyFrame = Frame(drowDownFrame) - difficultyVar = StringVar() - difficultyVar.set('normal') - difficultyOptionMenu = OptionMenu(difficultyFrame, difficultyVar, 'normal', 'hard', 'expert') - difficultyOptionMenu.pack(side=RIGHT) - difficultyLabel = Label(difficultyFrame, text='Difficulty: item pool') - difficultyLabel.pack(side=LEFT) - - itemfunctionFrame = Frame(drowDownFrame) - itemfunctionVar = StringVar() - itemfunctionVar.set('normal') - itemfunctionOptionMenu = OptionMenu(itemfunctionFrame, itemfunctionVar, 'normal', 'hard', 'expert') - itemfunctionOptionMenu.pack(side=RIGHT) - itemfunctionLabel = Label(itemfunctionFrame, text='Difficulty: item functionality') - itemfunctionLabel.pack(side=LEFT) - - timerFrame = Frame(drowDownFrame) - timerVar = StringVar() - timerVar.set('none') - timerOptionMenu = OptionMenu(timerFrame, timerVar, 'none', 'display', 'timed', 'timed-ohko', 'ohko', 'timed-countdown') - timerOptionMenu.pack(side=RIGHT) - timerLabel = Label(timerFrame, text='Timer setting') - timerLabel.pack(side=LEFT) - - progressiveFrame = Frame(drowDownFrame) - progressiveVar = StringVar() - progressiveVar.set('on') - progressiveOptionMenu = OptionMenu(progressiveFrame, progressiveVar, 'on', 'off', 'random') - progressiveOptionMenu.pack(side=RIGHT) - progressiveLabel = Label(progressiveFrame, text='Progressive equipment') - progressiveLabel.pack(side=LEFT) - - accessibilityFrame = Frame(drowDownFrame) - accessibilityVar = StringVar() - accessibilityVar.set('items') - accessibilityOptionMenu = OptionMenu(accessibilityFrame, accessibilityVar, 'items', 'locations', 'none') - accessibilityOptionMenu.pack(side=RIGHT) - accessibilityLabel = Label(accessibilityFrame, text='Item accessibility') - accessibilityLabel.pack(side=LEFT) - - algorithmFrame = Frame(drowDownFrame) - algorithmVar = StringVar() - algorithmVar.set('balanced') - algorithmOptionMenu = OptionMenu(algorithmFrame, algorithmVar, 'freshness', 'flood', 'vt21', 'vt22', 'vt25', 'vt26', 'balanced') - algorithmOptionMenu.pack(side=RIGHT) - algorithmLabel = Label(algorithmFrame, text='Item distribution algorithm') - algorithmLabel.pack(side=LEFT) - shuffleFrame = Frame(drowDownFrame) shuffleVar = StringVar() shuffleVar.set('vanilla') @@ -364,24 +266,6 @@ def guiMain(args=None): doorShuffleLabel = Label(doorShuffleFrame, text='Door shuffle algorithm') doorShuffleLabel.pack(side=LEFT) - logicFrame.pack(expand=True, anchor=E) - accessibilityFrame.pack(expand=True, anchor=E) - - goalFrame.pack(expand=True, anchor=E) - crystalsGTFrame.pack(expand=True, anchor=E) - crystalsGanonFrame.pack(expand=True, anchor=E) - - modeFrame.pack(expand=True, anchor=E) - shuffleFrame.pack(expand=True, anchor=E) - doorShuffleFrame.pack(expand=True, anchor=E) - - difficultyFrame.pack(expand=True, anchor=E) - itemfunctionFrame.pack(expand=True, anchor=E) - timerFrame.pack(expand=True, anchor=E) - progressiveFrame.pack(expand=True, anchor=E) - accessibilityFrame.pack(expand=True, anchor=E) - algorithmFrame.pack(expand=True, anchor=E) - enemizerFrame = LabelFrame(sortWindow, text="Enemizer", padx=5, pady=2) enemizerFrame.columnconfigure(0, weight=1) enemizerFrame.columnconfigure(1, weight=1) @@ -463,19 +347,19 @@ def guiMain(args=None): guiargs.names = namesVar.get() guiargs.seed = int(seedVar.get()) if seedVar.get() else None guiargs.count = int(countVar.get()) if countVar.get() != '1' else None - guiargs.mode = modeVar.get() - guiargs.logic = logicVar.get() + guiargs.mode = itemWindow.modeVar.get() + guiargs.logic = itemWindow.logicVar.get() - guiargs.goal = goalVar.get() - guiargs.crystals_gt = crystalsGTVar.get() - guiargs.crystals_ganon = crystalsGanonVar.get() - guiargs.swords = swordVar.get() - guiargs.difficulty = difficultyVar.get() - guiargs.item_functionality = itemfunctionVar.get() - guiargs.timer = timerVar.get() - guiargs.progressive = progressiveVar.get() - guiargs.accessibility = accessibilityVar.get() - guiargs.algorithm = algorithmVar.get() + guiargs.goal = itemWindow.goalVar.get() + guiargs.crystals_gt = itemWindow.crystalsGTVar.get() + guiargs.crystals_ganon = itemWindow.crystalsGanonVar.get() + guiargs.swords = itemWindow.swordVar.get() + guiargs.difficulty = itemWindow.difficultyVar.get() + guiargs.item_functionality = itemWindow.itemfunctionVar.get() + guiargs.timer = itemWindow.timerVar.get() + guiargs.progressive = itemWindow.progressiveVar.get() + guiargs.accessibility = itemWindow.accessibilityVar.get() + guiargs.algorithm = itemWindow.algorithmVar.get() guiargs.shuffle = shuffleVar.get() guiargs.door_shuffle = doorShuffleVar.get() guiargs.heartbeep = heartbeepVar.get() @@ -489,7 +373,7 @@ def guiMain(args=None): guiargs.compassshuffle = bool(compassshuffleVar.get()) guiargs.keyshuffle = bool(keyshuffleVar.get()) guiargs.bigkeyshuffle = bool(bigkeyshuffleVar.get()) - guiargs.retro = bool(retroVar.get()) + guiargs.retro = bool(itemWindow.retroVar.get()) guiargs.quickswap = bool(quickSwapVar.get()) guiargs.disablemusic = bool(disableMusicVar.get()) guiargs.ow_palettes = owPalettesVar.get() @@ -1273,7 +1157,7 @@ def guiMain(args=None): compassshuffleVar.set(args.compassshuffle) keyshuffleVar.set(args.keyshuffle) bigkeyshuffleVar.set(args.bigkeyshuffle) - retroVar.set(args.retro) + itemWindow.retroVar.set(args.retro) openpyramidVar.set(args.openpyramid) quickSwapVar.set(int(args.quickswap)) disableMusicVar.set(int(args.disablemusic)) @@ -1283,23 +1167,23 @@ def guiMain(args=None): countVar.set(str(args.count)) if args.seed: seedVar.set(str(args.seed)) - modeVar.set(args.mode) - swordVar.set(args.swords) - difficultyVar.set(args.difficulty) - itemfunctionVar.set(args.item_functionality) - timerVar.set(args.timer) - progressiveVar.set(args.progressive) - accessibilityVar.set(args.accessibility) - goalVar.set(args.goal) - crystalsGTVar.set(args.crystals_gt) - crystalsGanonVar.set(args.crystals_ganon) - algorithmVar.set(args.algorithm) + itemWindow.modeVar.set(args.mode) + itemWindow.swordVar.set(args.swords) + itemWindow.difficultyVar.set(args.difficulty) + itemWindow.itemfunctionVar.set(args.item_functionality) + itemWindow.timerVar.set(args.timer) + itemWindow.progressiveVar.set(args.progressive) + itemWindow.accessibilityVar.set(args.accessibility) + itemWindow.goalVar.set(args.goal) + itemWindow.crystalsGTVar.set(args.crystals_gt) + itemWindow.crystalsGanonVar.set(args.crystals_ganon) + itemWindow.algorithmVar.set(args.algorithm) shuffleVar.set(args.shuffle) doorShuffleVar.set(args.door_shuffle) heartcolorVar.set(args.heartcolor) heartbeepVar.set(args.heartbeep) fastMenuVar.set(args.fastmenu) - logicVar.set(args.logic) + itemWindow.logicVar.set(args.logic) romVar.set(args.rom) shuffleGanonVar.set(args.shuffleganon) hintsVar.set(args.hints) diff --git a/gui/randomize/item.py b/gui/randomize/item.py new file mode 100644 index 00000000..550c9544 --- /dev/null +++ b/gui/randomize/item.py @@ -0,0 +1,139 @@ +from tkinter import ttk, IntVar, StringVar, Checkbutton, Frame, Label, OptionMenu, E, W, LEFT, RIGHT + +def item_page(parent): + # Item Randomizer + self = ttk.Frame(parent) + + # Item Randomizer options + ## Retro (eventually needs to become a World State) + self.retroVar = IntVar() + retroCheckbutton = Checkbutton(self, text="Retro mode (universal keys)", variable=self.retroVar) + retroCheckbutton.pack(anchor=W) + + leftItemFrame = Frame(self) + rightItemFrame = Frame(self) + leftItemFrame.pack(side=LEFT) + rightItemFrame.pack(side=RIGHT) + + ## World State + modeFrame = Frame(leftItemFrame) + self.modeVar = StringVar() + self.modeVar.set('open') + modeOptionMenu = OptionMenu(modeFrame, self.modeVar, 'standard', 'open', 'inverted') + modeOptionMenu.pack(side=RIGHT) + modeLabel = Label(modeFrame, text='World State') + modeLabel.pack(side=LEFT) + modeFrame.pack(anchor=E) + + ## Logic Level + logicFrame = Frame(leftItemFrame) + self.logicVar = StringVar() + self.logicVar.set('noglitches') + logicOptionMenu = OptionMenu(logicFrame, self.logicVar, 'noglitches', 'minorglitches', 'nologic') + logicOptionMenu.pack(side=RIGHT) + logicLabel = Label(logicFrame, text='Game Logic') + logicLabel.pack(side=LEFT) + logicFrame.pack(anchor=E) + + ## Goal + goalFrame = Frame(leftItemFrame) + self.goalVar = StringVar() + self.goalVar.set('ganon') + goalOptionMenu = OptionMenu(goalFrame, self.goalVar, 'ganon', 'pedestal', 'dungeons', 'triforcehunt', 'crystals') + goalOptionMenu.pack(side=RIGHT) + goalLabel = Label(goalFrame, text='Goal') + goalLabel.pack(side=LEFT) + goalFrame.pack(anchor=E) + + ## Number of crystals to open GT + crystalsGTFrame = Frame(leftItemFrame) + self.crystalsGTVar = StringVar() + self.crystalsGTVar.set('7') + crystalsGTOptionMenu = OptionMenu(crystalsGTFrame, self.crystalsGTVar, '0', '1', '2', '3', '4', '5', '6', '7', 'random') + crystalsGTOptionMenu.pack(side=RIGHT) + crystalsGTLabel = Label(crystalsGTFrame, text='Crystals to open Ganon\'s Tower') + crystalsGTLabel.pack(side=LEFT) + crystalsGTFrame.pack(anchor=E) + + ## Number of crystals to damage Ganon + crystalsGanonFrame = Frame(leftItemFrame) + self.crystalsGanonVar = StringVar() + self.crystalsGanonVar.set('7') + crystalsGanonOptionMenu = OptionMenu(crystalsGanonFrame, self.crystalsGanonVar, '0', '1', '2', '3', '4', '5', '6', '7', 'random') + crystalsGanonOptionMenu.pack(side=RIGHT) + crystalsGanonLabel = Label(crystalsGanonFrame, text='Crystals to fight Ganon') + crystalsGanonLabel.pack(side=LEFT) + crystalsGanonFrame.pack(anchor=E) + + ## Weapons + swordFrame = Frame(leftItemFrame) + self.swordVar = StringVar() + self.swordVar.set('random') + swordOptionMenu = OptionMenu(swordFrame, self.swordVar, 'random', 'assured', 'swordless', 'vanilla') + swordOptionMenu.pack(side=RIGHT) + swordLabel = Label(swordFrame, text='Sword availability') + swordLabel.pack(side=LEFT) + swordFrame.pack(anchor=E) + + ## Item Pool + difficultyFrame = Frame(rightItemFrame) + self.difficultyVar = StringVar() + self.difficultyVar.set('normal') + difficultyOptionMenu = OptionMenu(difficultyFrame, self.difficultyVar, 'normal', 'hard', 'expert') + difficultyOptionMenu.pack(side=RIGHT) + difficultyLabel = Label(difficultyFrame, text='Difficulty: item pool') + difficultyLabel.pack(side=LEFT) + difficultyFrame.pack(anchor=E) + + ## Item Functionality + itemfunctionFrame = Frame(rightItemFrame) + self.itemfunctionVar = StringVar() + self.itemfunctionVar.set('normal') + itemfunctionOptionMenu = OptionMenu(itemfunctionFrame, self.itemfunctionVar, 'normal', 'hard', 'expert') + itemfunctionOptionMenu.pack(side=RIGHT) + itemfunctionLabel = Label(itemfunctionFrame, text='Difficulty: item functionality') + itemfunctionLabel.pack(side=LEFT) + itemfunctionFrame.pack(anchor=E) + + ## Timer setting + timerFrame = Frame(rightItemFrame) + self.timerVar = StringVar() + self.timerVar.set('none') + timerOptionMenu = OptionMenu(timerFrame, self.timerVar, 'none', 'display', 'timed', 'timed-ohko', 'ohko', 'timed-countdown') + timerOptionMenu.pack(side=RIGHT) + timerLabel = Label(timerFrame, text='Timer setting') + timerLabel.pack(side=LEFT) + timerFrame.pack(anchor=E) + + ## Progressives: On/Off + progressiveFrame = Frame(rightItemFrame) + self.progressiveVar = StringVar() + self.progressiveVar.set('on') + progressiveOptionMenu = OptionMenu(progressiveFrame, self.progressiveVar, 'on', 'off', 'random') + progressiveOptionMenu.pack(side=RIGHT) + progressiveLabel = Label(progressiveFrame, text='Progressive equipment') + progressiveLabel.pack(side=LEFT) + progressiveFrame.pack(anchor=E) + + ## Accessibilty + accessibilityFrame = Frame(rightItemFrame) + self.accessibilityVar = StringVar() + self.accessibilityVar.set('items') + accessibilityOptionMenu = OptionMenu(accessibilityFrame, self.accessibilityVar, 'items', 'locations', 'none') + accessibilityOptionMenu.pack(side=RIGHT) + accessibilityLabel = Label(accessibilityFrame, text='Item accessibility') + accessibilityLabel.pack(side=LEFT) + accessibilityFrame.pack(anchor=E) + accessibilityFrame.pack(anchor=E) + + ## Item Sorting Algorithm + algorithmFrame = Frame(rightItemFrame) + self.algorithmVar = StringVar() + self.algorithmVar.set('balanced') + algorithmOptionMenu = OptionMenu(algorithmFrame, self.algorithmVar, 'freshness', 'flood', 'vt21', 'vt22', 'vt25', 'vt26', 'balanced') + algorithmOptionMenu.pack(side=RIGHT) + algorithmLabel = Label(algorithmFrame, text='Item distribution algorithm') + algorithmLabel.pack(side=LEFT) + algorithmFrame.pack(anchor=E) + + return self From 441a3a745268507f9775837e4aec25480f5fdeab Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 8 Feb 2020 11:08:58 -0800 Subject: [PATCH 004/117] Sort Entrance Randomizer --- Gui.py | 30 ++++++++---------------------- gui/randomize/entrando.py | 27 +++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 22 deletions(-) create mode 100644 gui/randomize/entrando.py diff --git a/Gui.py b/Gui.py index b4f60fd2..b769c4cc 100755 --- a/Gui.py +++ b/Gui.py @@ -13,6 +13,7 @@ from urllib.request import urlopen from AdjusterMain import adjust from DungeonRandomizer import parse_arguments from gui.randomize.item import item_page +from gui.randomize.entrando import entrando_page from GuiUtils import ToolTips, set_icon, BackgroundTaskProgress from Main import main, __version__ as ESVersion from Rom import Sprite @@ -74,7 +75,7 @@ def guiMain(args=None): randomizerNotebook.add(itemWindow, text="Items") # Entrance Randomizer - entrandoWindow = ttk.Frame(randomizerNotebook) + entrandoWindow = entrando_page(randomizerNotebook) randomizerNotebook.add(entrandoWindow, text="Entrances") # Enemizer @@ -108,8 +109,6 @@ def guiMain(args=None): createSpoilerCheckbutton = Checkbutton(checkBoxFrame, text="Create Spoiler Log", variable=createSpoilerVar) suppressRomVar = IntVar() suppressRomCheckbutton = Checkbutton(checkBoxFrame, text="Do not create patched Rom", variable=suppressRomVar) - openpyramidVar = IntVar() - openpyramidCheckbutton = Checkbutton(checkBoxFrame, text="Pre-open Pyramid Hole", variable=openpyramidVar) mcsbshuffleFrame = Frame(checkBoxFrame) mcsbLabel = Label(mcsbshuffleFrame, text="Shuffle: ") mapshuffleVar = IntVar() @@ -120,9 +119,6 @@ def guiMain(args=None): keyshuffleCheckbutton = Checkbutton(mcsbshuffleFrame, text="Keys", variable=keyshuffleVar) bigkeyshuffleVar = IntVar() bigkeyshuffleCheckbutton = Checkbutton(mcsbshuffleFrame, text="BigKeys", variable=bigkeyshuffleVar) - shuffleGanonVar = IntVar() - shuffleGanonVar.set(1) #set default - shuffleGanonCheckbutton = Checkbutton(checkBoxFrame, text="Include Ganon's Tower and Pyramid Hole in shuffle pool", variable=shuffleGanonVar) hintsVar = IntVar() hintsVar.set(1) #set default hintsCheckbutton = Checkbutton(checkBoxFrame, text="Include Helpful Hints", variable=hintsVar) @@ -131,14 +127,12 @@ def guiMain(args=None): createSpoilerCheckbutton.pack(expand=True, anchor=W) suppressRomCheckbutton.pack(expand=True, anchor=W) - openpyramidCheckbutton.pack(expand=True, anchor=W) mcsbshuffleFrame.pack(expand=True, anchor=W) mcsbLabel.grid(row=0, column=0) mapshuffleCheckbutton.grid(row=0, column=1) compassshuffleCheckbutton.grid(row=0, column=2) keyshuffleCheckbutton.grid(row=0, column=3) bigkeyshuffleCheckbutton.grid(row=0, column=4) - shuffleGanonCheckbutton.pack(expand=True, anchor=W) hintsCheckbutton.pack(expand=True, anchor=W) customCheckbutton.pack(expand=True, anchor=W) @@ -250,14 +244,6 @@ def guiMain(args=None): drowDownFrame = Frame(topFrame) - shuffleFrame = Frame(drowDownFrame) - shuffleVar = StringVar() - shuffleVar.set('vanilla') - shuffleOptionMenu = OptionMenu(shuffleFrame, shuffleVar, 'vanilla', 'simple', 'restricted', 'full', 'crossed', 'insanity', 'restricted_legacy', 'full_legacy', 'madness_legacy', 'insanity_legacy', 'dungeonsfull', 'dungeonssimple') - shuffleOptionMenu.pack(side=RIGHT) - shuffleLabel = Label(shuffleFrame, text='Entrance shuffle algorithm') - shuffleLabel.pack(side=LEFT) - doorShuffleFrame = Frame(drowDownFrame) doorShuffleVar = StringVar() doorShuffleVar.set('basic') @@ -360,7 +346,7 @@ def guiMain(args=None): guiargs.progressive = itemWindow.progressiveVar.get() guiargs.accessibility = itemWindow.accessibilityVar.get() guiargs.algorithm = itemWindow.algorithmVar.get() - guiargs.shuffle = shuffleVar.get() + guiargs.shuffle = entrandoWindow.shuffleVar.get() guiargs.door_shuffle = doorShuffleVar.get() guiargs.heartbeep = heartbeepVar.get() guiargs.heartcolor = heartcolorVar.get() @@ -368,7 +354,7 @@ def guiMain(args=None): guiargs.create_spoiler = bool(createSpoilerVar.get()) guiargs.skip_playthrough = not bool(createSpoilerVar.get()) guiargs.suppress_rom = bool(suppressRomVar.get()) - guiargs.openpyramid = bool(openpyramidVar.get()) + guiargs.openpyramid = bool(entrandoWindow.openpyramidVar.get()) guiargs.mapshuffle = bool(mapshuffleVar.get()) guiargs.compassshuffle = bool(compassshuffleVar.get()) guiargs.keyshuffle = bool(keyshuffleVar.get()) @@ -378,7 +364,7 @@ def guiMain(args=None): guiargs.disablemusic = bool(disableMusicVar.get()) guiargs.ow_palettes = owPalettesVar.get() guiargs.uw_palettes = uwPalettesVar.get() - guiargs.shuffleganon = bool(shuffleGanonVar.get()) + guiargs.shuffleganon = bool(entrandoWindow.shuffleGanonVar.get()) guiargs.hints = bool(hintsVar.get()) guiargs.enemizercli = enemizerCLIpathVar.get() guiargs.shufflebosses = enemizerBossVar.get() @@ -1158,7 +1144,7 @@ def guiMain(args=None): keyshuffleVar.set(args.keyshuffle) bigkeyshuffleVar.set(args.bigkeyshuffle) itemWindow.retroVar.set(args.retro) - openpyramidVar.set(args.openpyramid) + entrandoWindow.openpyramidVar.set(args.openpyramid) quickSwapVar.set(int(args.quickswap)) disableMusicVar.set(int(args.disablemusic)) if args.multi: @@ -1178,14 +1164,14 @@ def guiMain(args=None): itemWindow.crystalsGTVar.set(args.crystals_gt) itemWindow.crystalsGanonVar.set(args.crystals_ganon) itemWindow.algorithmVar.set(args.algorithm) - shuffleVar.set(args.shuffle) + entrandoWindow.shuffleVar.set(args.shuffle) doorShuffleVar.set(args.door_shuffle) heartcolorVar.set(args.heartcolor) heartbeepVar.set(args.heartbeep) fastMenuVar.set(args.fastmenu) itemWindow.logicVar.set(args.logic) romVar.set(args.rom) - shuffleGanonVar.set(args.shuffleganon) + entrandoWindow.shuffleGanonVar.set(args.shuffleganon) hintsVar.set(args.hints) enemizerCLIpathVar.set(args.enemizercli) potShuffleVar.set(args.shufflepots) diff --git a/gui/randomize/entrando.py b/gui/randomize/entrando.py new file mode 100644 index 00000000..69dad09f --- /dev/null +++ b/gui/randomize/entrando.py @@ -0,0 +1,27 @@ +from tkinter import ttk, IntVar, StringVar, Checkbutton, Frame, Label, OptionMenu, E, W, LEFT, RIGHT + +def entrando_page(parent): + # Entrance Randomizer + self = ttk.Frame(parent) + + # Entrance Randomizer options + ## Pyramid pre-opened + self.openpyramidVar = IntVar() + openpyramidCheckbutton = Checkbutton(self, text="Pre-open Pyramid Hole", variable=self.openpyramidVar) + openpyramidCheckbutton.pack(anchor=W) + ## Shuffle Ganon + self.shuffleGanonVar = IntVar() + self.shuffleGanonVar.set(1) #set default + shuffleGanonCheckbutton = Checkbutton(self, text="Include Ganon's Tower and Pyramid Hole in shuffle pool", variable=self.shuffleGanonVar) + shuffleGanonCheckbutton.pack(anchor=W) + ## Entrance Shuffle + shuffleFrame = Frame(self) + self.shuffleVar = StringVar() + self.shuffleVar.set('vanilla') + shuffleOptionMenu = OptionMenu(shuffleFrame, self.shuffleVar, 'vanilla', 'simple', 'restricted', 'full', 'crossed', 'insanity', 'restricted_legacy', 'full_legacy', 'madness_legacy', 'insanity_legacy', 'dungeonsfull', 'dungeonssimple') + shuffleOptionMenu.pack(side=RIGHT) + shuffleLabel = Label(shuffleFrame, text='Entrance shuffle algorithm') + shuffleLabel.pack(side=LEFT) + shuffleFrame.pack(anchor=W) + + return self From 479da54dc1e7c378e67dddd271577a11e5154244 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 8 Feb 2020 11:44:24 -0800 Subject: [PATCH 005/117] Sort Enemizer Coming back to implement working dirs --- Gui.py | 88 +++++++-------------------------------- gui/randomize/enemizer.py | 79 +++++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+), 74 deletions(-) create mode 100644 gui/randomize/enemizer.py diff --git a/Gui.py b/Gui.py index b769c4cc..b2d5583e 100755 --- a/Gui.py +++ b/Gui.py @@ -14,6 +14,7 @@ from AdjusterMain import adjust from DungeonRandomizer import parse_arguments from gui.randomize.item import item_page from gui.randomize.entrando import entrando_page +from gui.randomize.enemizer import enemizer_page from GuiUtils import ToolTips, set_icon, BackgroundTaskProgress from Main import main, __version__ as ESVersion from Rom import Sprite @@ -79,7 +80,7 @@ def guiMain(args=None): randomizerNotebook.add(entrandoWindow, text="Entrances") # Enemizer - enemizerWindow = ttk.Frame(randomizerNotebook) + enemizerWindow = enemizer_page(randomizerNotebook) randomizerNotebook.add(enemizerWindow, text="Enemizer") # Dungeon Shuffle @@ -252,66 +253,6 @@ def guiMain(args=None): doorShuffleLabel = Label(doorShuffleFrame, text='Door shuffle algorithm') doorShuffleLabel.pack(side=LEFT) - enemizerFrame = LabelFrame(sortWindow, text="Enemizer", padx=5, pady=2) - enemizerFrame.columnconfigure(0, weight=1) - enemizerFrame.columnconfigure(1, weight=1) - enemizerFrame.columnconfigure(2, weight=1) - enemizerFrame.columnconfigure(3, weight=1) - - enemizerPathFrame = Frame(enemizerFrame) - enemizerPathFrame.grid(row=0, column=0, columnspan=3, sticky=W+E, padx=3) - enemizerCLIlabel = Label(enemizerPathFrame, text="EnemizerCLI path: ") - enemizerCLIlabel.pack(side=LEFT) - enemizerCLIpathVar = StringVar(value="EnemizerCLI/EnemizerCLI.Core") - enemizerCLIpathEntry = Entry(enemizerPathFrame, textvariable=enemizerCLIpathVar) - enemizerCLIpathEntry.pack(side=LEFT, expand=True, fill=X) - def EnemizerSelectPath(): - path = filedialog.askopenfilename(filetypes=[("EnemizerCLI executable", "*EnemizerCLI*")]) - if path: - enemizerCLIpathVar.set(path) - enemizerCLIbrowseButton = Button(enemizerPathFrame, text='...', command=EnemizerSelectPath) - enemizerCLIbrowseButton.pack(side=LEFT) - - potShuffleVar = IntVar() - potShuffleButton = Checkbutton(enemizerFrame, text="Pot shuffle", variable=potShuffleVar) - potShuffleButton.grid(row=0, column=3) - - enemizerEnemyFrame = Frame(enemizerFrame) - enemizerEnemyFrame.grid(row=1, column=0, pady=5) - enemizerEnemyLabel = Label(enemizerEnemyFrame, text='Enemy shuffle') - enemizerEnemyLabel.pack(side=LEFT) - enemyShuffleVar = StringVar() - enemyShuffleVar.set('none') - enemizerEnemyOption = OptionMenu(enemizerEnemyFrame, enemyShuffleVar, 'none', 'shuffled', 'chaos') - enemizerEnemyOption.pack(side=LEFT) - - enemizerBossFrame = Frame(enemizerFrame) - enemizerBossFrame.grid(row=1, column=1) - enemizerBossLabel = Label(enemizerBossFrame, text='Boss shuffle') - enemizerBossLabel.pack(side=LEFT) - enemizerBossVar = StringVar() - enemizerBossVar.set('none') - enemizerBossOption = OptionMenu(enemizerBossFrame, enemizerBossVar, 'none', 'basic', 'normal', 'chaos') - enemizerBossOption.pack(side=LEFT) - - enemizerDamageFrame = Frame(enemizerFrame) - enemizerDamageFrame.grid(row=1, column=2) - enemizerDamageLabel = Label(enemizerDamageFrame, text='Enemy damage') - enemizerDamageLabel.pack(side=LEFT) - enemizerDamageVar = StringVar() - enemizerDamageVar.set('default') - enemizerDamageOption = OptionMenu(enemizerDamageFrame, enemizerDamageVar, 'default', 'shuffled', 'chaos') - enemizerDamageOption.pack(side=LEFT) - - enemizerHealthFrame = Frame(enemizerFrame) - enemizerHealthFrame.grid(row=1, column=3) - enemizerHealthLabel = Label(enemizerHealthFrame, text='Enemy health') - enemizerHealthLabel.pack(side=LEFT) - enemizerHealthVar = StringVar() - enemizerHealthVar.set('default') - enemizerHealthOption = OptionMenu(enemizerHealthFrame, enemizerHealthVar, 'default', 'easy', 'normal', 'hard', 'expert') - enemizerHealthOption.pack(side=LEFT) - bottomFrame = Frame(randomizerWindow, pady=5) worldLabel = Label(sortWindow, text='Worlds') @@ -366,12 +307,12 @@ def guiMain(args=None): guiargs.uw_palettes = uwPalettesVar.get() guiargs.shuffleganon = bool(entrandoWindow.shuffleGanonVar.get()) guiargs.hints = bool(hintsVar.get()) - guiargs.enemizercli = enemizerCLIpathVar.get() - guiargs.shufflebosses = enemizerBossVar.get() - guiargs.shuffleenemies = enemyShuffleVar.get() - guiargs.enemy_health = enemizerHealthVar.get() - guiargs.enemy_damage = enemizerDamageVar.get() - guiargs.shufflepots = bool(potShuffleVar.get()) + guiargs.enemizercli = enemizerWindow.enemizerCLIpathVar.get() + guiargs.shufflebosses = enemizerWindow.enemizerBossVar.get() + guiargs.shuffleenemies = enemizerWindow.enemyShuffleVar.get() + guiargs.enemy_health = enemizerWindow.enemizerHealthVar.get() + guiargs.enemy_damage = enemizerWindow.enemizerDamageVar.get() + guiargs.shufflepots = bool(enemizerWindow.potShuffleVar.get()) guiargs.custom = bool(customVar.get()) guiargs.customitemarray = [int(bowVar.get()), int(silverarrowVar.get()), int(boomerangVar.get()), int(magicboomerangVar.get()), int(hookshotVar.get()), int(mushroomVar.get()), int(magicpowderVar.get()), int(firerodVar.get()), int(icerodVar.get()), int(bombosVar.get()), int(etherVar.get()), int(quakeVar.get()), int(lampVar.get()), int(hammerVar.get()), int(shovelVar.get()), int(fluteVar.get()), int(bugnetVar.get()), @@ -423,7 +364,6 @@ def guiMain(args=None): rightHalfFrame.pack(side=RIGHT) topFrame.pack(side=TOP) bottomFrame.pack(side=BOTTOM) - enemizerFrame.pack(side=BOTTOM, fill=BOTH) # Adjuster Controls @@ -1173,12 +1113,12 @@ def guiMain(args=None): romVar.set(args.rom) entrandoWindow.shuffleGanonVar.set(args.shuffleganon) hintsVar.set(args.hints) - enemizerCLIpathVar.set(args.enemizercli) - potShuffleVar.set(args.shufflepots) - enemyShuffleVar.set(args.shuffleenemies) - enemizerBossVar.set(args.shufflebosses) - enemizerDamageVar.set(args.enemy_damage) - enemizerHealthVar.set(args.enemy_health) + enemizerWindow.enemizerCLIpathVar.set(args.enemizercli) + enemizerWindow.potShuffleVar.set(args.shufflepots) + enemizerWindow.enemyShuffleVar.set(args.shuffleenemies) + enemizerWindow.enemizerBossVar.set(args.shufflebosses) + enemizerWindow.enemizerDamageVar.set(args.enemy_damage) + enemizerWindow.enemizerHealthVar.set(args.enemy_health) owPalettesVar.set(args.ow_palettes) uwPalettesVar.set(args.uw_palettes) if args.sprite is not None: diff --git a/gui/randomize/enemizer.py b/gui/randomize/enemizer.py new file mode 100644 index 00000000..9b0e7340 --- /dev/null +++ b/gui/randomize/enemizer.py @@ -0,0 +1,79 @@ +import os +from tkinter import ttk, filedialog, IntVar, StringVar, Button, Checkbutton, Entry, Frame, Label, LabelFrame, OptionMenu, E, W, LEFT, RIGHT, X + +def enemizer_page(parent):#,working_dirs): + self = ttk.Frame(parent) + + # Enemizer + enemizerFrame = LabelFrame(self, text="Enemizer") + enemizerFrame.columnconfigure(0, weight=1) + enemizerFrame.columnconfigure(1, weight=1) + enemizerFrame.columnconfigure(2, weight=1) + enemizerFrame.columnconfigure(3, weight=1) + + ## Enemizer CLI Path + enemizerPathFrame = Frame(self) + enemizerPathFrame.grid(row=0, column=0, columnspan=3, sticky=W+E) + enemizerCLIlabel = Label(enemizerPathFrame, text="EnemizerCLI path: ") + enemizerCLIlabel.pack(side=LEFT) + self.enemizerCLIpathVar = StringVar() + def saveEnemizerPath(caller,_,mode): + pass + #working_dirs["enemizer.cli"] = self.enemizerCLIpathVar.get() + self.enemizerCLIpathVar.trace_add("write",saveEnemizerPath) + enemizerCLIpathEntry = Entry(enemizerPathFrame, textvariable=self.enemizerCLIpathVar) + enemizerCLIpathEntry.pack(side=LEFT, fill=X, expand=True) + def EnemizerSelectPath(): + path = filedialog.askopenfilename(filetypes=[("EnemizerCLI executable", "*EnemizerCLI*")], initialdir=os.path.join(".")) + if path: + self.enemizerCLIpathVar.set(path) + #working_dirs["enemizer.cli"] = path + enemizerCLIbrowseButton = Button(enemizerPathFrame, text='...', command=EnemizerSelectPath) + enemizerCLIbrowseButton.pack(side=LEFT) + + ## Pot Shuffle + self.potShuffleVar = IntVar() + potShuffleButton = Checkbutton(self, text="Pot shuffle", variable=self.potShuffleVar) + potShuffleButton.grid(row=0, column=3) + + ## Randomize Enemies + enemizerEnemyFrame = Frame(self) + enemizerEnemyFrame.grid(row=1, column=0) + enemizerEnemyLabel = Label(enemizerEnemyFrame, text='Enemy shuffle') + enemizerEnemyLabel.pack(side=LEFT) + self.enemyShuffleVar = StringVar() + self.enemyShuffleVar.set('none') + enemizerEnemyOption = OptionMenu(enemizerEnemyFrame, self.enemyShuffleVar, 'none', 'shuffled', 'chaos') + enemizerEnemyOption.pack(side=LEFT) + + ## Randomize Bosses + enemizerBossFrame = Frame(self) + enemizerBossFrame.grid(row=1, column=1) + enemizerBossLabel = Label(enemizerBossFrame, text='Boss shuffle') + enemizerBossLabel.pack(side=LEFT) + self.enemizerBossVar = StringVar() + self.enemizerBossVar.set('none') + enemizerBossOption = OptionMenu(enemizerBossFrame, self.enemizerBossVar, 'none', 'basic', 'normal', 'chaos') + enemizerBossOption.pack(side=LEFT) + + ## Enemy Damage + enemizerDamageFrame = Frame(self) + enemizerDamageFrame.grid(row=1, column=2) + enemizerDamageLabel = Label(enemizerDamageFrame, text='Enemy damage') + enemizerDamageLabel.pack(side=LEFT) + self.enemizerDamageVar = StringVar() + self.enemizerDamageVar.set('default') + enemizerDamageOption = OptionMenu(enemizerDamageFrame, self.enemizerDamageVar, 'default', 'shuffled', 'chaos') + enemizerDamageOption.pack(side=LEFT) + + ## Enemy Health + enemizerHealthFrame = Frame(self) + enemizerHealthFrame.grid(row=1, column=3) + enemizerHealthLabel = Label(enemizerHealthFrame, text='Enemy health') + enemizerHealthLabel.pack(side=LEFT) + self.enemizerHealthVar = StringVar() + self.enemizerHealthVar.set('default') + enemizerHealthOption = OptionMenu(enemizerHealthFrame, self.enemizerHealthVar, 'default', 'easy', 'normal', 'hard', 'expert') + enemizerHealthOption.pack(side=LEFT) + + return self#,working_dirs From 934245f785c9b15da8394dcaa2611670a0b5c0df Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 8 Feb 2020 11:50:00 -0800 Subject: [PATCH 006/117] Sort Dungeon Randomizer --- Gui.py | 35 ++++++++++------------------------- gui/randomize/dungeon.py | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 25 deletions(-) create mode 100644 gui/randomize/dungeon.py diff --git a/Gui.py b/Gui.py index b2d5583e..12b544ef 100755 --- a/Gui.py +++ b/Gui.py @@ -15,6 +15,7 @@ from DungeonRandomizer import parse_arguments from gui.randomize.item import item_page from gui.randomize.entrando import entrando_page from gui.randomize.enemizer import enemizer_page +from gui.randomize.dungeon import dungeon_page from GuiUtils import ToolTips, set_icon, BackgroundTaskProgress from Main import main, __version__ as ESVersion from Rom import Sprite @@ -84,7 +85,7 @@ def guiMain(args=None): randomizerNotebook.add(enemizerWindow, text="Enemizer") # Dungeon Shuffle - dungeonRandoWindow = ttk.Frame(randomizerNotebook) + dungeonRandoWindow = dungeon_page(randomizerNotebook) randomizerNotebook.add(dungeonRandoWindow, text="Dungeon Shuffle") # Multiworld @@ -110,16 +111,6 @@ def guiMain(args=None): createSpoilerCheckbutton = Checkbutton(checkBoxFrame, text="Create Spoiler Log", variable=createSpoilerVar) suppressRomVar = IntVar() suppressRomCheckbutton = Checkbutton(checkBoxFrame, text="Do not create patched Rom", variable=suppressRomVar) - mcsbshuffleFrame = Frame(checkBoxFrame) - mcsbLabel = Label(mcsbshuffleFrame, text="Shuffle: ") - mapshuffleVar = IntVar() - mapshuffleCheckbutton = Checkbutton(mcsbshuffleFrame, text="Maps", variable=mapshuffleVar) - compassshuffleVar = IntVar() - compassshuffleCheckbutton = Checkbutton(mcsbshuffleFrame, text="Compasses", variable=compassshuffleVar) - keyshuffleVar = IntVar() - keyshuffleCheckbutton = Checkbutton(mcsbshuffleFrame, text="Keys", variable=keyshuffleVar) - bigkeyshuffleVar = IntVar() - bigkeyshuffleCheckbutton = Checkbutton(mcsbshuffleFrame, text="BigKeys", variable=bigkeyshuffleVar) hintsVar = IntVar() hintsVar.set(1) #set default hintsCheckbutton = Checkbutton(checkBoxFrame, text="Include Helpful Hints", variable=hintsVar) @@ -128,12 +119,6 @@ def guiMain(args=None): createSpoilerCheckbutton.pack(expand=True, anchor=W) suppressRomCheckbutton.pack(expand=True, anchor=W) - mcsbshuffleFrame.pack(expand=True, anchor=W) - mcsbLabel.grid(row=0, column=0) - mapshuffleCheckbutton.grid(row=0, column=1) - compassshuffleCheckbutton.grid(row=0, column=2) - keyshuffleCheckbutton.grid(row=0, column=3) - bigkeyshuffleCheckbutton.grid(row=0, column=4) hintsCheckbutton.pack(expand=True, anchor=W) customCheckbutton.pack(expand=True, anchor=W) @@ -296,10 +281,10 @@ def guiMain(args=None): guiargs.skip_playthrough = not bool(createSpoilerVar.get()) guiargs.suppress_rom = bool(suppressRomVar.get()) guiargs.openpyramid = bool(entrandoWindow.openpyramidVar.get()) - guiargs.mapshuffle = bool(mapshuffleVar.get()) - guiargs.compassshuffle = bool(compassshuffleVar.get()) - guiargs.keyshuffle = bool(keyshuffleVar.get()) - guiargs.bigkeyshuffle = bool(bigkeyshuffleVar.get()) + guiargs.mapshuffle = bool(dungeonRandoWindow.mapshuffleVar.get()) + guiargs.compassshuffle = bool(dungeonRandoWindow.compassshuffleVar.get()) + guiargs.keyshuffle = bool(dungeonRandoWindow.keyshuffleVar.get()) + guiargs.bigkeyshuffle = bool(dungeonRandoWindow.bigkeyshuffleVar.get()) guiargs.retro = bool(itemWindow.retroVar.get()) guiargs.quickswap = bool(quickSwapVar.get()) guiargs.disablemusic = bool(disableMusicVar.get()) @@ -1079,10 +1064,10 @@ def guiMain(args=None): # load values from commandline args createSpoilerVar.set(int(args.create_spoiler)) suppressRomVar.set(int(args.suppress_rom)) - mapshuffleVar.set(args.mapshuffle) - compassshuffleVar.set(args.compassshuffle) - keyshuffleVar.set(args.keyshuffle) - bigkeyshuffleVar.set(args.bigkeyshuffle) + dungeonRandoWindow.mapshuffleVar.set(args.mapshuffle) + dungeonRandoWindow.compassshuffleVar.set(args.compassshuffle) + dungeonRandoWindow.keyshuffleVar.set(args.keyshuffle) + dungeonRandoWindow.bigkeyshuffleVar.set(args.bigkeyshuffle) itemWindow.retroVar.set(args.retro) entrandoWindow.openpyramidVar.set(args.openpyramid) quickSwapVar.set(int(args.quickswap)) diff --git a/gui/randomize/dungeon.py b/gui/randomize/dungeon.py new file mode 100644 index 00000000..c0fabfb7 --- /dev/null +++ b/gui/randomize/dungeon.py @@ -0,0 +1,38 @@ +from tkinter import ttk, IntVar, StringVar, Checkbutton, Frame, Label, OptionMenu, E, W, LEFT, RIGHT + +def dungeon_page(parent): + self = ttk.Frame(parent) + + # Dungeon Shuffle options + ## Dungeon Item Shuffle + mcsbshuffleFrame = Frame(self) + mcsbshuffleFrame.pack(anchor=W) + mcsbLabel = Label(mcsbshuffleFrame, text="Shuffle: ") + mcsbLabel.grid(row=0, column=0) + ## Map Shuffle + self.mapshuffleVar = IntVar() + mapshuffleCheckbutton = Checkbutton(mcsbshuffleFrame, text="Maps", variable=self.mapshuffleVar) + mapshuffleCheckbutton.grid(row=0, column=1) + ## Compass Shuffle + self.compassshuffleVar = IntVar() + compassshuffleCheckbutton = Checkbutton(mcsbshuffleFrame, text="Compasses", variable=self.compassshuffleVar) + compassshuffleCheckbutton.grid(row=0, column=2) + ## Small Key Shuffle + self.keyshuffleVar = IntVar() + keyshuffleCheckbutton = Checkbutton(mcsbshuffleFrame, text="Keys", variable=self.keyshuffleVar) + keyshuffleCheckbutton.grid(row=0, column=3) + ## Big Key Shuffle + self.bigkeyshuffleVar = IntVar() + bigkeyshuffleCheckbutton = Checkbutton(mcsbshuffleFrame, text="BigKeys", variable=self.bigkeyshuffleVar) + bigkeyshuffleCheckbutton.grid(row=0, column=4) + ## Dungeon Door Shuffle + doorShuffleFrame = Frame(self) + self.doorShuffleVar = StringVar() + self.doorShuffleVar.set('basic') + doorShuffleOptionMenu = OptionMenu(doorShuffleFrame, self.doorShuffleVar, 'vanilla', 'basic', 'crossed', 'experimental') + doorShuffleOptionMenu.pack(side=RIGHT) + doorShuffleLabel = Label(doorShuffleFrame, text='Door shuffle algorithm') + doorShuffleLabel.pack(side=LEFT) + doorShuffleFrame.pack(anchor=W) + + return self From cd8c3f78f3392006a2549dc64951e271d5dd4d04 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 8 Feb 2020 11:55:36 -0800 Subject: [PATCH 007/117] Sort Multiworld Coming back to implement working dirs --- Gui.py | 19 +++++-------------- gui/randomize/multiworld.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 14 deletions(-) create mode 100644 gui/randomize/multiworld.py diff --git a/Gui.py b/Gui.py index 12b544ef..1cd3446c 100755 --- a/Gui.py +++ b/Gui.py @@ -16,6 +16,7 @@ from gui.randomize.item import item_page from gui.randomize.entrando import entrando_page from gui.randomize.enemizer import enemizer_page from gui.randomize.dungeon import dungeon_page +from gui.randomize.multiworld import multiworld_page from GuiUtils import ToolTips, set_icon, BackgroundTaskProgress from Main import main, __version__ as ESVersion from Rom import Sprite @@ -89,7 +90,7 @@ def guiMain(args=None): randomizerNotebook.add(dungeonRandoWindow, text="Dungeon Shuffle") # Multiworld - multiworldWindow = ttk.Frame(randomizerNotebook) + multiworldWindow = multiworld_page(randomizerNotebook) randomizerNotebook.add(multiworldWindow, text="Multiworld") # Game Options @@ -240,12 +241,6 @@ def guiMain(args=None): bottomFrame = Frame(randomizerWindow, pady=5) - worldLabel = Label(sortWindow, text='Worlds') - worldVar = StringVar() - worldSpinbox = Spinbox(sortWindow, from_=1, to=100, width=5, textvariable=worldVar) - namesLabel = Label(sortWindow, text='Player names') - namesVar = StringVar() - namesEntry = Entry(sortWindow, textvariable=namesVar) seedLabel = Label(farBottomFrame, text='Seed #') seedVar = StringVar() seedEntry = Entry(farBottomFrame, width=15, textvariable=seedVar) @@ -255,8 +250,8 @@ def guiMain(args=None): def generateRom(): guiargs = Namespace() - guiargs.multi = int(worldVar.get()) - guiargs.names = namesVar.get() + guiargs.multi = int(multiworldWindow.worldVar.get()) + guiargs.names = multiworldWindow.namesVar.get() guiargs.seed = int(seedVar.get()) if seedVar.get() else None guiargs.count = int(countVar.get()) if countVar.get() != '1' else None guiargs.mode = itemWindow.modeVar.get() @@ -333,10 +328,6 @@ def guiMain(args=None): generateButton = Button(farBottomFrame, text='Generate Patched Rom', command=generateRom) - worldLabel.pack(side=LEFT) - worldSpinbox.pack(side=LEFT) - namesLabel.pack(side=LEFT) - namesEntry.pack(side=LEFT) seedLabel.pack(side=LEFT, padx=(5, 0)) seedEntry.pack(side=LEFT) countLabel.pack(side=LEFT, padx=(5, 0)) @@ -1073,7 +1064,7 @@ def guiMain(args=None): quickSwapVar.set(int(args.quickswap)) disableMusicVar.set(int(args.disablemusic)) if args.multi: - worldVar.set(str(args.multi)) + multiworldWindow.worldVar.set(str(args.multi)) if args.count: countVar.set(str(args.count)) if args.seed: diff --git a/gui/randomize/multiworld.py b/gui/randomize/multiworld.py new file mode 100644 index 00000000..2e37a4dd --- /dev/null +++ b/gui/randomize/multiworld.py @@ -0,0 +1,28 @@ +from tkinter import ttk, StringVar, Entry, Frame, Label, Spinbox, E, W, LEFT, RIGHT + +def multiworld_page(parent):#,working_dirs): + self = ttk.Frame(parent) + + # Multiworld + multiFrame = Frame(self) + ## Number of Worlds + worldLabel = Label(multiFrame, text='Worlds') +# self.worldVar = StringVar(value=working_dirs["multi.worlds"]) + self.worldVar = StringVar(value="1") + worldSpinbox = Spinbox(multiFrame, from_=1, to=100, width=5, textvariable=self.worldVar) + worldLabel.pack(side=LEFT) + worldSpinbox.pack(side=LEFT) + ## List of Player Names + namesLabel = Label(multiFrame, text='Player names') + self.namesVar = StringVar() +# self.namesVar = StringVar(value=working_dirs["multi.names"]) + def saveMultiNames(caller,_,mode): + pass + #working_dirs["multi.names"] = self.namesVar.get() + self.namesVar.trace_add("write",saveMultiNames) + namesEntry = Entry(multiFrame, textvariable=self.namesVar) + namesLabel.pack(side=LEFT) + namesEntry.pack(side=LEFT) + multiFrame.pack(anchor=W) + + return self#,working_dirs From 65750d257124e4099455d9e21d8fded301643a1f Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 8 Feb 2020 14:00:54 -0800 Subject: [PATCH 008/117] Sort Game Options Placate Adjuster in the interim --- Gui.py | 161 ++++------------- classes/SpriteSelector.py | 341 +++++++++++++++++++++++++++++++++++ classes/__init__.py | 1 + gui/randomize/gameoptions.py | 108 +++++++++++ 4 files changed, 489 insertions(+), 122 deletions(-) create mode 100644 classes/SpriteSelector.py create mode 100644 classes/__init__.py create mode 100644 gui/randomize/gameoptions.py diff --git a/Gui.py b/Gui.py index 1cd3446c..2113ca0e 100755 --- a/Gui.py +++ b/Gui.py @@ -17,6 +17,7 @@ from gui.randomize.entrando import entrando_page from gui.randomize.enemizer import enemizer_page from gui.randomize.dungeon import dungeon_page from gui.randomize.multiworld import multiworld_page +from gui.randomize.gameoptions import gameoptions_page from GuiUtils import ToolTips, set_icon, BackgroundTaskProgress from Main import main, __version__ as ESVersion from Rom import Sprite @@ -94,7 +95,7 @@ def guiMain(args=None): randomizerNotebook.add(multiworldWindow, text="Multiworld") # Game Options - gameOptionsWindow = ttk.Frame(randomizerNotebook) + gameOptionsWindow = gameoptions_page(randomizerNotebook) randomizerNotebook.add(gameOptionsWindow, text="Game Options") # Generation Setup @@ -112,15 +113,11 @@ def guiMain(args=None): createSpoilerCheckbutton = Checkbutton(checkBoxFrame, text="Create Spoiler Log", variable=createSpoilerVar) suppressRomVar = IntVar() suppressRomCheckbutton = Checkbutton(checkBoxFrame, text="Do not create patched Rom", variable=suppressRomVar) - hintsVar = IntVar() - hintsVar.set(1) #set default - hintsCheckbutton = Checkbutton(checkBoxFrame, text="Include Helpful Hints", variable=hintsVar) customVar = IntVar() customCheckbutton = Checkbutton(checkBoxFrame, text="Use custom item pool", variable=customVar) createSpoilerCheckbutton.pack(expand=True, anchor=W) suppressRomCheckbutton.pack(expand=True, anchor=W) - hintsCheckbutton.pack(expand=True, anchor=W) customCheckbutton.pack(expand=True, anchor=W) romOptionsFrame = LabelFrame(rightHalfFrame, text="Rom options") @@ -129,87 +126,6 @@ def guiMain(args=None): for i in range(5): romOptionsFrame.rowconfigure(i, weight=1) - disableMusicVar = IntVar() - disableMusicCheckbutton = Checkbutton(romOptionsFrame, text="Disable music", variable=disableMusicVar) - disableMusicCheckbutton.grid(row=0, column=0, sticky=E) - - spriteDialogFrame = Frame(romOptionsFrame) - spriteDialogFrame.grid(row=0, column=1) - baseSpriteLabel = Label(spriteDialogFrame, text='Sprite:') - - spriteNameVar = StringVar() - sprite = None - def set_sprite(sprite_param): - nonlocal sprite - if sprite_param is None or not sprite_param.valid: - sprite = None - spriteNameVar.set('(unchanged)') - else: - sprite = sprite_param - spriteNameVar.set(sprite.name) - - set_sprite(None) - spriteNameVar.set('(unchanged)') - spriteEntry = Label(spriteDialogFrame, textvariable=spriteNameVar) - - def SpriteSelect(): - SpriteSelector(mainWindow, set_sprite) - - spriteSelectButton = Button(spriteDialogFrame, text='...', command=SpriteSelect) - - baseSpriteLabel.pack(side=LEFT) - spriteEntry.pack(side=LEFT) - spriteSelectButton.pack(side=LEFT) - - quickSwapVar = IntVar() - quickSwapCheckbutton = Checkbutton(romOptionsFrame, text="L/R Quickswapping", variable=quickSwapVar) - quickSwapCheckbutton.grid(row=1, column=0, sticky=E) - - fastMenuFrame = Frame(romOptionsFrame) - fastMenuFrame.grid(row=1, column=1, sticky=E) - fastMenuLabel = Label(fastMenuFrame, text='Menu speed') - fastMenuLabel.pack(side=LEFT) - fastMenuVar = StringVar() - fastMenuVar.set('normal') - fastMenuOptionMenu = OptionMenu(fastMenuFrame, fastMenuVar, 'normal', 'instant', 'double', 'triple', 'quadruple', 'half') - fastMenuOptionMenu.pack(side=LEFT) - - heartcolorFrame = Frame(romOptionsFrame) - heartcolorFrame.grid(row=2, column=0, sticky=E) - heartcolorLabel = Label(heartcolorFrame, text='Heart color') - heartcolorLabel.pack(side=LEFT) - heartcolorVar = StringVar() - heartcolorVar.set('red') - heartcolorOptionMenu = OptionMenu(heartcolorFrame, heartcolorVar, 'red', 'blue', 'green', 'yellow', 'random') - heartcolorOptionMenu.pack(side=LEFT) - - heartbeepFrame = Frame(romOptionsFrame) - heartbeepFrame.grid(row=2, column=1, sticky=E) - heartbeepLabel = Label(heartbeepFrame, text='Heartbeep') - heartbeepLabel.pack(side=LEFT) - heartbeepVar = StringVar() - heartbeepVar.set('normal') - heartbeepOptionMenu = OptionMenu(heartbeepFrame, heartbeepVar, 'double', 'normal', 'half', 'quarter', 'off') - heartbeepOptionMenu.pack(side=LEFT) - - owPalettesFrame = Frame(romOptionsFrame) - owPalettesFrame.grid(row=3, column=0, sticky=E) - owPalettesLabel = Label(owPalettesFrame, text='Overworld palettes') - owPalettesLabel.pack(side=LEFT) - owPalettesVar = StringVar() - owPalettesVar.set('default') - owPalettesOptionMenu = OptionMenu(owPalettesFrame, owPalettesVar, 'default', 'random', 'blackout') - owPalettesOptionMenu.pack(side=LEFT) - - uwPalettesFrame = Frame(romOptionsFrame) - uwPalettesFrame.grid(row=3, column=1, sticky=E) - uwPalettesLabel = Label(uwPalettesFrame, text='Dungeon palettes') - uwPalettesLabel.pack(side=LEFT) - uwPalettesVar = StringVar() - uwPalettesVar.set('default') - uwPalettesOptionMenu = OptionMenu(uwPalettesFrame, uwPalettesVar, 'default', 'random', 'blackout') - uwPalettesOptionMenu.pack(side=LEFT) - romDialogFrame = Frame(romOptionsFrame) romDialogFrame.grid(row=4, column=0, columnspan=2, sticky=W+E) @@ -269,9 +185,9 @@ def guiMain(args=None): guiargs.algorithm = itemWindow.algorithmVar.get() guiargs.shuffle = entrandoWindow.shuffleVar.get() guiargs.door_shuffle = doorShuffleVar.get() - guiargs.heartbeep = heartbeepVar.get() - guiargs.heartcolor = heartcolorVar.get() - guiargs.fastmenu = fastMenuVar.get() + guiargs.heartbeep = gameOptionsWindow.heartbeepVar.get() + guiargs.heartcolor = gameOptionsWindow.heartcolorVar.get() + guiargs.fastmenu = gameOptionsWindow.fastMenuVar.get() guiargs.create_spoiler = bool(createSpoilerVar.get()) guiargs.skip_playthrough = not bool(createSpoilerVar.get()) guiargs.suppress_rom = bool(suppressRomVar.get()) @@ -281,12 +197,12 @@ def guiMain(args=None): guiargs.keyshuffle = bool(dungeonRandoWindow.keyshuffleVar.get()) guiargs.bigkeyshuffle = bool(dungeonRandoWindow.bigkeyshuffleVar.get()) guiargs.retro = bool(itemWindow.retroVar.get()) - guiargs.quickswap = bool(quickSwapVar.get()) - guiargs.disablemusic = bool(disableMusicVar.get()) - guiargs.ow_palettes = owPalettesVar.get() - guiargs.uw_palettes = uwPalettesVar.get() + guiargs.quickswap = bool(gameOptionsWindow.quickSwapVar.get()) + guiargs.disablemusic = bool(gameOptionsWindow.disableMusicVar.get()) + guiargs.ow_palettes = gameOptionsWindow.owPalettesVar.get() + guiargs.uw_palettes = gameOptionsWindow.uwPalettesVar.get() guiargs.shuffleganon = bool(entrandoWindow.shuffleGanonVar.get()) - guiargs.hints = bool(hintsVar.get()) + guiargs.hints = bool(gameOptionsWindow.hintsVar.get()) guiargs.enemizercli = enemizerWindow.enemizerCLIpathVar.get() guiargs.shufflebosses = enemizerWindow.enemizerBossVar.get() guiargs.shuffleenemies = enemizerWindow.enemyShuffleVar.get() @@ -304,7 +220,7 @@ def guiMain(args=None): int(rupee300Var.get()), int(rupoorVar.get()), int(blueclockVar.get()), int(greenclockVar.get()), int(redclockVar.get()), int(progbowVar.get()), int(bomb10Var.get()), int(triforcepieceVar.get()), int(triforcecountVar.get()), int(triforceVar.get()), int(rupoorcostVar.get()), int(universalkeyVar.get())] guiargs.rom = romVar.get() - guiargs.sprite = sprite +# guiargs.sprite = gameOptionsWindow.sprite guiargs.outputpath = args.outputpath if args else None # get default values for missing parameters for k,v in vars(parse_arguments(['--multi', str(guiargs.multi)])).items(): @@ -347,8 +263,8 @@ def guiMain(args=None): rightHalfFrame2 = Frame(topFrame2) checkBoxFrame2 = Frame(rightHalfFrame2) - quickSwapCheckbutton2 = Checkbutton(checkBoxFrame2, text="Enabled L/R Item quickswapping", variable=quickSwapVar) - disableMusicCheckbutton2 = Checkbutton(checkBoxFrame2, text="Disable game music", variable=disableMusicVar) + quickSwapCheckbutton2 = Checkbutton(checkBoxFrame2, text="Enabled L/R Item quickswapping", variable=gameOptionsWindow.quickSwapVar) + disableMusicCheckbutton2 = Checkbutton(checkBoxFrame2, text="Disable game music", variable=gameOptionsWindow.disableMusicVar) quickSwapCheckbutton2.pack(expand=True, anchor=W) disableMusicCheckbutton2.pack(expand=True, anchor=W) @@ -371,10 +287,11 @@ def guiMain(args=None): spriteDialogFrame2 = Frame(fileDialogFrame2) baseSpriteLabel2 = Label(spriteDialogFrame2, text='Link Sprite') - spriteEntry2 = Label(spriteDialogFrame2, textvariable=spriteNameVar) + spriteEntry2 = Label(spriteDialogFrame2, textvariable=gameOptionsWindow.spriteNameVar) def SpriteSelectAdjuster(): - SpriteSelector(mainWindow, set_sprite, adjuster=True) + pass +# SpriteSelector(mainWindow, gameOptionsWindow.set_sprite, adjuster=True) spriteSelectButton2 = Button(spriteDialogFrame2, text='Select Sprite', command=SpriteSelectAdjuster) @@ -390,31 +307,31 @@ def guiMain(args=None): drowDownFrame2 = Frame(topFrame2) heartbeepFrame2 = Frame(drowDownFrame2) - heartbeepOptionMenu2 = OptionMenu(heartbeepFrame2, heartbeepVar, 'double', 'normal', 'half', 'quarter', 'off') + heartbeepOptionMenu2 = OptionMenu(heartbeepFrame2, gameOptionsWindow.heartbeepVar, 'double', 'normal', 'half', 'quarter', 'off') heartbeepOptionMenu2.pack(side=RIGHT) heartbeepLabel2 = Label(heartbeepFrame2, text='Heartbeep sound rate') heartbeepLabel2.pack(side=LEFT) heartcolorFrame2 = Frame(drowDownFrame2) - heartcolorOptionMenu2 = OptionMenu(heartcolorFrame2, heartcolorVar, 'red', 'blue', 'green', 'yellow', 'random') + heartcolorOptionMenu2 = OptionMenu(heartcolorFrame2, gameOptionsWindow.heartcolorVar, 'red', 'blue', 'green', 'yellow', 'random') heartcolorOptionMenu2.pack(side=RIGHT) heartcolorLabel2 = Label(heartcolorFrame2, text='Heart color') heartcolorLabel2.pack(side=LEFT) fastMenuFrame2 = Frame(drowDownFrame2) - fastMenuOptionMenu2 = OptionMenu(fastMenuFrame2, fastMenuVar, 'normal', 'instant', 'double', 'triple', 'quadruple', 'half') + fastMenuOptionMenu2 = OptionMenu(fastMenuFrame2, gameOptionsWindow.fastMenuVar, 'normal', 'instant', 'double', 'triple', 'quadruple', 'half') fastMenuOptionMenu2.pack(side=RIGHT) fastMenuLabel2 = Label(fastMenuFrame2, text='Menu speed') fastMenuLabel2.pack(side=LEFT) owPalettesFrame2 = Frame(drowDownFrame2) - owPalettesOptionMenu2 = OptionMenu(owPalettesFrame2, owPalettesVar, 'default', 'random', 'blackout') + owPalettesOptionMenu2 = OptionMenu(owPalettesFrame2, gameOptionsWindow.owPalettesVar, 'default', 'random', 'blackout') owPalettesOptionMenu2.pack(side=RIGHT) owPalettesLabel2 = Label(owPalettesFrame2, text='Overworld palettes') owPalettesLabel2.pack(side=LEFT) uwPalettesFrame2 = Frame(drowDownFrame2) - uwPalettesOptionMenu2 = OptionMenu(uwPalettesFrame2, uwPalettesVar, 'default', 'random', 'blackout') + uwPalettesOptionMenu2 = OptionMenu(uwPalettesFrame2, gameOptionsWindow.uwPalettesVar, 'default', 'random', 'blackout') uwPalettesOptionMenu2.pack(side=RIGHT) uwPalettesLabel2 = Label(uwPalettesFrame2, text='Dungeon palettes') uwPalettesLabel2.pack(side=LEFT) @@ -429,16 +346,16 @@ def guiMain(args=None): def adjustRom(): guiargs = Namespace() - guiargs.heartbeep = heartbeepVar.get() - guiargs.heartcolor = heartcolorVar.get() - guiargs.fastmenu = fastMenuVar.get() - guiargs.ow_palettes = owPalettesVar.get() - guiargs.uw_palettes = uwPalettesVar.get() - guiargs.quickswap = bool(quickSwapVar.get()) - guiargs.disablemusic = bool(disableMusicVar.get()) + guiargs.heartbeep = gameOptionsWindow.heartbeepVar.get() + guiargs.heartcolor = gameOptionsWindow.heartcolorVar.get() + guiargs.fastmenu = gameOptionsWindow.fastMenuVar.get() + guiargs.ow_palettes = gameOptionsWindow.owPalettesVar.get() + guiargs.uw_palettes = gameOptionsWindow.uwPalettesVar.get() + guiargs.quickswap = bool(gameOptionsWindow.quickSwapVar.get()) + guiargs.disablemusic = bool(gameOptionsWindow.disableMusicVar.get()) guiargs.rom = romVar2.get() guiargs.baserom = romVar.get() - guiargs.sprite = sprite +# guiargs.sprite = sprite try: adjust(args=guiargs) except Exception as e: @@ -1061,8 +978,8 @@ def guiMain(args=None): dungeonRandoWindow.bigkeyshuffleVar.set(args.bigkeyshuffle) itemWindow.retroVar.set(args.retro) entrandoWindow.openpyramidVar.set(args.openpyramid) - quickSwapVar.set(int(args.quickswap)) - disableMusicVar.set(int(args.disablemusic)) + gameOptionsWindow.quickSwapVar.set(int(args.quickswap)) + gameOptionsWindow.disableMusicVar.set(int(args.disablemusic)) if args.multi: multiworldWindow.worldVar.set(str(args.multi)) if args.count: @@ -1082,23 +999,23 @@ def guiMain(args=None): itemWindow.algorithmVar.set(args.algorithm) entrandoWindow.shuffleVar.set(args.shuffle) doorShuffleVar.set(args.door_shuffle) - heartcolorVar.set(args.heartcolor) - heartbeepVar.set(args.heartbeep) - fastMenuVar.set(args.fastmenu) + gameOptionsWindow.heartcolorVar.set(args.heartcolor) + gameOptionsWindow.heartbeepVar.set(args.heartbeep) + gameOptionsWindow.fastMenuVar.set(args.fastmenu) itemWindow.logicVar.set(args.logic) romVar.set(args.rom) entrandoWindow.shuffleGanonVar.set(args.shuffleganon) - hintsVar.set(args.hints) + gameOptionsWindow.hintsVar.set(args.hints) enemizerWindow.enemizerCLIpathVar.set(args.enemizercli) enemizerWindow.potShuffleVar.set(args.shufflepots) enemizerWindow.enemyShuffleVar.set(args.shuffleenemies) enemizerWindow.enemizerBossVar.set(args.shufflebosses) enemizerWindow.enemizerDamageVar.set(args.enemy_damage) enemizerWindow.enemizerHealthVar.set(args.enemy_health) - owPalettesVar.set(args.ow_palettes) - uwPalettesVar.set(args.uw_palettes) - if args.sprite is not None: - set_sprite(Sprite(args.sprite)) + gameOptionsWindow.owPalettesVar.set(args.ow_palettes) + gameOptionsWindow.uwPalettesVar.set(args.uw_palettes) +# if args.sprite is not None: +# gameOptionsWindow.set_sprite(Sprite(args.sprite)) mainWindow.mainloop() diff --git a/classes/SpriteSelector.py b/classes/SpriteSelector.py new file mode 100644 index 00000000..3208b3e7 --- /dev/null +++ b/classes/SpriteSelector.py @@ -0,0 +1,341 @@ +from tkinter import filedialog, messagebox, Button, Canvas, Label, LabelFrame, Frame, PhotoImage, Scrollbar, Toplevel, ALL, NSEW, LEFT, BOTTOM, X, RIGHT, TOP, HORIZONTAL, EW, NS +from glob import glob +import json +import os +import random +import shutil +from urllib.parse import urlparse +from urllib.request import urlopen +from GuiUtils import ToolTips, set_icon, BackgroundTaskProgress +from Rom import Sprite +from Utils import is_bundled, local_path, output_path, open_file + +class SpriteSelector(object): + def __init__(self, parent, callback, adjuster=False): + if is_bundled(): + self.deploy_icons() + self.parent = parent + self.window = Toplevel(parent) + self.window.geometry("900x768") + self.sections = [] + self.callback = callback + self.adjuster = adjuster + + self.window.wm_title("TAKE ANY ONE YOU WANT") + self.window['padx'] = 5 + self.window['pady'] = 5 + self.all_sprites = [] + + def open_unofficial_sprite_dir(_evt): + open_file(self.unofficial_sprite_dir) + + official_frametitle = Label(self.window, text='Official Sprites') + + unofficial_frametitle = Frame(self.window) + title_text = Label(unofficial_frametitle, text="Unofficial Sprites") + title_link = Label(unofficial_frametitle, text="(open)", fg="blue", cursor="hand2") + title_text.pack(side=LEFT) + title_link.pack(side=LEFT) + title_link.bind("", open_unofficial_sprite_dir) + + self.icon_section(official_frametitle, self.official_sprite_dir+'/*', 'Official sprites not found. Click "Update official sprites" to download them.') + self.icon_section(unofficial_frametitle, self.unofficial_sprite_dir+'/*', 'Put sprites in the unofficial sprites folder (see open link above) to have them appear here.') + + frame = Frame(self.window) + frame.pack(side=BOTTOM, fill=X, pady=5) + + button = Button(frame, text="Browse for file...", command=self.browse_for_sprite) + button.pack(side=RIGHT, padx=(5, 0)) + + button = Button(frame, text="Update official sprites", command=self.update_official_sprites) + button.pack(side=RIGHT, padx=(5, 0)) + + button = Button(frame, text="Default Link sprite", command=self.use_default_link_sprite) + button.pack(side=LEFT, padx=(0, 5)) + + button = Button(frame, text="Random sprite", command=self.use_random_sprite) + button.pack(side=LEFT, padx=(0, 5)) + + if adjuster: + button = Button(frame, text="Current sprite from rom", command=self.use_default_sprite) + button.pack(side=LEFT, padx=(0, 5)) + + set_icon(self.window) + self.window.focus() + + def icon_section(self, frame_label, path, no_results_label): + self.frame = LabelFrame(self.window, labelwidget=frame_label, padx=5, pady=5) +# self.canvas = Canvas(self.frame) + + """ + self.frame.grid_rowconfigure(0, weight=1) + self.frame.grid_columnconfigure(0, weight=1) + + xscrollbar = Scrollbar(self.frame, orient=HORIZONTAL) + xscrollbar.grid(row=1, column=0, sticky=EW) + + yscrollbar = Scrollbar(self.frame) + yscrollbar.grid(row=0, column=1, sticky=NS) + + self.canvas.configure(scrollregion=self.canvas.bbox(ALL),xscrollcommand=xscrollbar.set, yscrollcommand=yscrollbar.set) + self.canvas.grid(row=0, column=0, sticky=NSEW) + + xscrollbar.config(command=self.canvas.xview) + yscrollbar.config(command=self.canvas.yview) + """ + + self.frame.pack(side=TOP, fill=X) + + sprites = [] + + for file in glob(output_path(path)): + sprites.append(Sprite(file)) + + sprites.sort(key=lambda s: str.lower(s.name or "").strip()) + + i = 0 + for sprite in sprites: + image = get_image_for_sprite(sprite) + if image is None: + continue + self.all_sprites.append(sprite) + button = Button(self.frame, image=image, command=lambda spr=sprite: self.select_sprite(spr)) + ToolTips.register(button, sprite.name + ("\nBy: %s" % sprite.author_name if sprite.author_name else "")) + button.image = image + button.grid(row=i // 16, column=i % 16) + i += 1 + + if i == 0: + label = Label(self.frame, text=no_results_label) + label.pack() + + + def update_official_sprites(self): + # need to wrap in try catch. We don't want errors getting the json or downloading the files to break us. + self.window.destroy() + self.parent.update() + def work(task): + resultmessage = "" + successful = True + + def finished(): + task.close_window() + if successful: + messagebox.showinfo("Sprite Updater", resultmessage) + else: + messagebox.showerror("Sprite Updater", resultmessage) + SpriteSelector(self.parent, self.callback, self.adjuster) + + try: + task.update_status("Downloading official sprites list") + with urlopen('https://alttpr.com/sprites') as response: + sprites_arr = json.loads(response.read().decode("utf-8")) + except Exception as e: + resultmessage = "Error getting list of official sprites. Sprites not updated.\n\n%s: %s" % (type(e).__name__, e) + successful = False + task.queue_event(finished) + return + + try: + task.update_status("Determining needed sprites") + current_sprites = [os.path.basename(file) for file in glob(self.official_sprite_dir+'/*')] + official_sprites = [(sprite['file'], os.path.basename(urlparse(sprite['file']).path)) for sprite in sprites_arr] + needed_sprites = [(sprite_url, filename) for (sprite_url, filename) in official_sprites if filename not in current_sprites] + bundled_sprites = [os.path.basename(file) for file in glob(self.local_official_sprite_dir+'/*')] + # todo: eventually use the above list to avoid downloading any sprites that we already have cached in the bundle. + + official_filenames = [filename for (_, filename) in official_sprites] + obsolete_sprites = [sprite for sprite in current_sprites if sprite not in official_filenames] + except Exception as e: + resultmessage = "Error Determining which sprites to update. Sprites not updated.\n\n%s: %s" % (type(e).__name__, e) + successful = False + task.queue_event(finished) + return + + updated = 0 + for (sprite_url, filename) in needed_sprites: + try: + task.update_status("Downloading needed sprite %g/%g" % (updated + 1, len(needed_sprites))) + target = os.path.join(self.official_sprite_dir, filename) + with urlopen(sprite_url) as response, open(target, 'wb') as out: + shutil.copyfileobj(response, out) + except Exception as e: + resultmessage = "Error downloading sprite. Not all sprites updated.\n\n%s: %s" % (type(e).__name__, e) + successful = False + updated += 1 + + deleted = 0 + for sprite in obsolete_sprites: + try: + task.update_status("Removing obsolete sprite %g/%g" % (deleted + 1, len(obsolete_sprites))) + os.remove(os.path.join(self.official_sprite_dir, sprite)) + except Exception as e: + resultmessage = "Error removing obsolete sprite. Not all sprites updated.\n\n%s: %s" % (type(e).__name__, e) + successful = False + deleted += 1 + + if successful: + resultmessage = "official sprites updated successfully" + + task.queue_event(finished) + + BackgroundTaskProgress(self.parent, work, "Updating Sprites") + + + def browse_for_sprite(self): + sprite = filedialog.askopenfilename( + filetypes=[("All Sprite Sources", (".zspr", ".spr", ".sfc", ".smc")), + ("ZSprite files", ".zspr"), + ("Sprite files", ".spr"), + ("Rom Files", (".sfc", ".smc")), + ("All Files", "*")]) + try: + self.callback(Sprite(sprite)) + except Exception: + self.callback(None) + self.window.destroy() + + + def use_default_sprite(self): + self.callback(None) + self.window.destroy() + + def use_default_link_sprite(self): + self.callback(Sprite.default_link_sprite()) + self.window.destroy() + + def use_random_sprite(self): + self.callback(random.choice(self.all_sprites) if self.all_sprites else None) + self.window.destroy() + + def select_sprite(self, spritename): + self.callback(spritename) + self.window.destroy() + + + def deploy_icons(self): + if not os.path.exists(self.unofficial_sprite_dir): + os.makedirs(self.unofficial_sprite_dir) + if not os.path.exists(self.official_sprite_dir): + shutil.copytree(self.local_official_sprite_dir, self.official_sprite_dir) + + @property + def official_sprite_dir(self): + if is_bundled(): + return output_path("sprites/official") + return self.local_official_sprite_dir + + @property + def local_official_sprite_dir(self): + return local_path("data/sprites/official") + + @property + def unofficial_sprite_dir(self): + if is_bundled(): + return output_path("sprites/unofficial") + return self.local_unofficial_sprite_dir + + @property + def local_unofficial_sprite_dir(self): + return local_path("data/sprites/unofficial") + + +def get_image_for_sprite(sprite): + if not sprite.valid: + return None + height = 24 + width = 16 + + def draw_sprite_into_gif(add_palette_color, set_pixel_color_index): + + def drawsprite(spr, pal_as_colors, offset): + for y, row in enumerate(spr): + for x, pal_index in enumerate(row): + if pal_index: + color = pal_as_colors[pal_index - 1] + set_pixel_color_index(x + offset[0], y + offset[1], color) + + add_palette_color(16, (40, 40, 40)) + shadow = [ + [0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0], + [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0], + [0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0], + ] + + drawsprite(shadow, [16], (2, 17)) + + palettes = sprite.decode_palette() + for i in range(15): + add_palette_color(i + 1, palettes[0][i]) + + body = sprite.decode16(0x4C0) + drawsprite(body, list(range(1, 16)), (0, 8)) + head = sprite.decode16(0x40) + drawsprite(head, list(range(1, 16)), (0, 0)) + + def make_gif(callback): + gif_header = b'GIF89a' + + gif_lsd = bytearray(7) + gif_lsd[0] = width + gif_lsd[2] = height + gif_lsd[4] = 0xF4 # 32 color palette follows. transparant + 15 for sprite + 1 for shadow=17 which rounds up to 32 as nearest power of 2 + gif_lsd[5] = 0 # background color is zero + gif_lsd[6] = 0 # aspect raio not specified + gif_gct = bytearray(3 * 32) + + gif_gce = bytearray(8) + gif_gce[0] = 0x21 # start of extention blocked + gif_gce[1] = 0xF9 # identifies this as the Graphics Control extension + gif_gce[2] = 4 # we are suppling only the 4 four bytes + gif_gce[3] = 0x01 # this gif includes transparency + gif_gce[4] = gif_gce[5] = 0 # animation frrame delay (unused) + gif_gce[6] = 0 # transparent color is index 0 + gif_gce[7] = 0 # end of gif_gce + gif_id = bytearray(10) + gif_id[0] = 0x2c + # byte 1,2 are image left. 3,4 are image top both are left as zerosuitsamus + gif_id[5] = width + gif_id[7] = height + gif_id[9] = 0 # no local color table + + gif_img_minimum_code_size = bytes([7]) # we choose 7 bits, so that each pixel is represented by a byte, for conviennce. + + clear = 0x80 + stop = 0x81 + + unchunked_image_data = bytearray(height * (width + 1) + 1) + # we technically need a Clear code once every 125 bytes, but we do it at the start of every row for simplicity + for row in range(height): + unchunked_image_data[row * (width + 1)] = clear + unchunked_image_data[-1] = stop + + def add_palette_color(index, color): + gif_gct[3 * index] = color[0] + gif_gct[3 * index + 1] = color[1] + gif_gct[3 * index + 2] = color[2] + + def set_pixel_color_index(x, y, color): + unchunked_image_data[y * (width + 1) + x + 1] = color + + callback(add_palette_color, set_pixel_color_index) + + def chunk_image(img): + for i in range(0, len(img), 255): + chunk = img[i:i + 255] + yield bytes([len(chunk)]) + yield chunk + + gif_img = b''.join([gif_img_minimum_code_size] + list(chunk_image(unchunked_image_data)) + [b'\x00']) + + gif = b''.join([gif_header, gif_lsd, gif_gct, gif_gce, gif_id, gif_img, b'\x3b']) + + return gif + + gif_data = make_gif(draw_sprite_into_gif) + image = PhotoImage(data=gif_data) + + return image.zoom(2) diff --git a/classes/__init__.py b/classes/__init__.py new file mode 100644 index 00000000..a9d60931 --- /dev/null +++ b/classes/__init__.py @@ -0,0 +1 @@ +# do nothing, just exist to make "classes" package diff --git a/gui/randomize/gameoptions.py b/gui/randomize/gameoptions.py new file mode 100644 index 00000000..103aa2aa --- /dev/null +++ b/gui/randomize/gameoptions.py @@ -0,0 +1,108 @@ +from tkinter import ttk, IntVar, StringVar, Button, Checkbutton, Entry, Frame, Label, OptionMenu, E, W, LEFT, RIGHT +from classes.SpriteSelector import SpriteSelector + +def gameoptions_page(parent): + self = ttk.Frame(parent) + + # Game Options options + ## Hints: Useful/Not useful + self.hintsVar = IntVar() + self.hintsVar.set(1) #set default + hintsCheckbutton = Checkbutton(self, text="Include Helpful Hints", variable=self.hintsVar) + hintsCheckbutton.pack(anchor=W) + + ## Disable BGM + self.disableMusicVar = IntVar() + disableMusicCheckbutton = Checkbutton(self, text="Disable music", variable=self.disableMusicVar) + disableMusicCheckbutton.pack(anchor=W) + + ## L/R Quickswap + self.quickSwapVar = IntVar() + quickSwapCheckbutton = Checkbutton(self, text="L/R Quickswapping", variable=self.quickSwapVar) + quickSwapCheckbutton.pack(anchor=W) + + leftRomOptionsFrame = Frame(self) + rightRomOptionsFrame = Frame(self) + leftRomOptionsFrame.pack(side=LEFT) + rightRomOptionsFrame.pack(side=RIGHT) + + ## Heart Color + heartcolorFrame = Frame(leftRomOptionsFrame) + heartcolorLabel = Label(heartcolorFrame, text='Heart color') + heartcolorLabel.pack(side=LEFT) + self.heartcolorVar = StringVar() + self.heartcolorVar.set('red') + heartcolorOptionMenu = OptionMenu(heartcolorFrame, self.heartcolorVar, 'red', 'blue', 'green', 'yellow', 'random') + heartcolorOptionMenu.pack(side=RIGHT) + heartcolorFrame.pack(anchor=E) + + ## Heart Beep Speed + heartbeepFrame = Frame(leftRomOptionsFrame) + heartbeepLabel = Label(heartbeepFrame, text='Heart Beep sound rate') + heartbeepLabel.pack(side=LEFT) + self.heartbeepVar = StringVar() + self.heartbeepVar.set('normal') + heartbeepOptionMenu = OptionMenu(heartbeepFrame, self.heartbeepVar, 'double', 'normal', 'half', 'quarter', 'off') + heartbeepOptionMenu.pack(side=LEFT) + heartbeepFrame.pack(anchor=E) + + ## Sprite selection + spriteDialogFrame = Frame(leftRomOptionsFrame) + baseSpriteLabel = Label(spriteDialogFrame, text='Sprite:') + + self.spriteNameVar = StringVar() + sprite = None + def set_sprite(sprite_param): + nonlocal sprite + if sprite_param is None or not sprite_param.valid: + sprite = None + self.spriteNameVar.set('(unchanged)') + else: + sprite = sprite_param + self.spriteNameVar.set(sprite.name) + + set_sprite(None) + self.spriteNameVar.set('(unchanged)') + spriteEntry = Label(spriteDialogFrame, textvariable=self.spriteNameVar) + + def SpriteSelect(): + SpriteSelector(parent, set_sprite) + + spriteSelectButton = Button(spriteDialogFrame, text='...', command=SpriteSelect) + + baseSpriteLabel.pack(side=LEFT) + spriteEntry.pack(side=LEFT) + spriteSelectButton.pack(side=LEFT) + spriteDialogFrame.pack(anchor=E) + + ## Menu Speed + fastMenuFrame = Frame(rightRomOptionsFrame) + fastMenuLabel = Label(fastMenuFrame, text='Menu speed') + fastMenuLabel.pack(side=LEFT) + self.fastMenuVar = StringVar() + self.fastMenuVar.set('normal') + fastMenuOptionMenu = OptionMenu(fastMenuFrame, self.fastMenuVar, 'normal', 'instant', 'double', 'triple', 'quadruple', 'half') + fastMenuOptionMenu.pack(side=LEFT) + fastMenuFrame.pack(anchor=E) + + ## Overworld Palettes (not Enemizer) + owPalettesFrame = Frame(rightRomOptionsFrame) + owPalettesLabel = Label(owPalettesFrame, text='Overworld palettes') + owPalettesLabel.pack(side=LEFT) + self.owPalettesVar = StringVar() + self.owPalettesVar.set('default') + owPalettesOptionMenu = OptionMenu(owPalettesFrame, self.owPalettesVar, 'default', 'random', 'blackout') + owPalettesOptionMenu.pack(side=LEFT) + owPalettesFrame.pack(anchor=E) + + ## Underworld Palettes (not Enemizer) + uwPalettesFrame = Frame(rightRomOptionsFrame) + uwPalettesLabel = Label(uwPalettesFrame, text='Dungeon palettes') + uwPalettesLabel.pack(side=LEFT) + self.uwPalettesVar = StringVar() + self.uwPalettesVar.set('default') + uwPalettesOptionMenu = OptionMenu(uwPalettesFrame, self.uwPalettesVar, 'default', 'random', 'blackout') + uwPalettesOptionMenu.pack(side=LEFT) + uwPalettesFrame.pack(anchor=E) + + return self From 5d62d9bd5e50f849502812a322afab421c6de2aa Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 8 Feb 2020 14:11:42 -0800 Subject: [PATCH 009/117] Sort Generation Options Fix a couple Dungeon Shuffle things Coming back to implement working dirs --- Gui.py | 80 ++++++------------------------------- gui/randomize/generation.py | 41 +++++++++++++++++++ 2 files changed, 54 insertions(+), 67 deletions(-) create mode 100644 gui/randomize/generation.py diff --git a/Gui.py b/Gui.py index 2113ca0e..b057046e 100755 --- a/Gui.py +++ b/Gui.py @@ -18,6 +18,7 @@ from gui.randomize.enemizer import enemizer_page from gui.randomize.dungeon import dungeon_page from gui.randomize.multiworld import multiworld_page from gui.randomize.gameoptions import gameoptions_page +from gui.randomize.generation import generation_page from GuiUtils import ToolTips, set_icon, BackgroundTaskProgress from Main import main, __version__ as ESVersion from Rom import Sprite @@ -34,11 +35,9 @@ def guiMain(args=None): randomizerWindow = ttk.Frame(notebook) adjustWindow = ttk.Frame(notebook) customWindow = ttk.Frame(notebook) - sortWindow = ttk.Frame(notebook) notebook.add(randomizerWindow, text='Randomize') notebook.add(adjustWindow, text='Adjust') notebook.add(customWindow, text='Custom') - notebook.add(sortWindow, text='SORT') notebook.pack() # Shared Controls @@ -99,62 +98,12 @@ def guiMain(args=None): randomizerNotebook.add(gameOptionsWindow, text="Game Options") # Generation Setup - generationSetupWindow = ttk.Frame(randomizerNotebook) + generationSetupWindow = generation_page(randomizerNotebook) randomizerNotebook.add(generationSetupWindow, text="Generation Setup") # add randomizer notebook to main window randomizerNotebook.pack() - topFrame = Frame(sortWindow) - rightHalfFrame = Frame(topFrame) - checkBoxFrame = Frame(rightHalfFrame) - - createSpoilerVar = IntVar() - createSpoilerCheckbutton = Checkbutton(checkBoxFrame, text="Create Spoiler Log", variable=createSpoilerVar) - suppressRomVar = IntVar() - suppressRomCheckbutton = Checkbutton(checkBoxFrame, text="Do not create patched Rom", variable=suppressRomVar) - customVar = IntVar() - customCheckbutton = Checkbutton(checkBoxFrame, text="Use custom item pool", variable=customVar) - - createSpoilerCheckbutton.pack(expand=True, anchor=W) - suppressRomCheckbutton.pack(expand=True, anchor=W) - customCheckbutton.pack(expand=True, anchor=W) - - romOptionsFrame = LabelFrame(rightHalfFrame, text="Rom options") - romOptionsFrame.columnconfigure(0, weight=1) - romOptionsFrame.columnconfigure(1, weight=1) - for i in range(5): - romOptionsFrame.rowconfigure(i, weight=1) - - romDialogFrame = Frame(romOptionsFrame) - romDialogFrame.grid(row=4, column=0, columnspan=2, sticky=W+E) - - baseRomLabel = Label(romDialogFrame, text='Base Rom: ') - romVar = StringVar(value="Zelda no Densetsu - Kamigami no Triforce (Japan).sfc") - romEntry = Entry(romDialogFrame, textvariable=romVar) - - def RomSelect(): - rom = filedialog.askopenfilename(filetypes=[("Rom Files", (".sfc", ".smc")), ("All Files", "*")]) - romVar.set(rom) - romSelectButton = Button(romDialogFrame, text='Select Rom', command=RomSelect) - - baseRomLabel.pack(side=LEFT) - romEntry.pack(side=LEFT, expand=True, fill=X) - romSelectButton.pack(side=LEFT) - - checkBoxFrame.pack(side=TOP, anchor=W, padx=5, pady=10) - romOptionsFrame.pack(expand=True, fill=BOTH, padx=3) - - drowDownFrame = Frame(topFrame) - - doorShuffleFrame = Frame(drowDownFrame) - doorShuffleVar = StringVar() - doorShuffleVar.set('basic') - doorShuffleOptionMenu = OptionMenu(doorShuffleFrame, doorShuffleVar, 'vanilla', 'basic', 'crossed', 'experimental') - doorShuffleOptionMenu.pack(side=RIGHT) - doorShuffleLabel = Label(doorShuffleFrame, text='Door shuffle algorithm') - doorShuffleLabel.pack(side=LEFT) - bottomFrame = Frame(randomizerWindow, pady=5) seedLabel = Label(farBottomFrame, text='Seed #') @@ -184,13 +133,13 @@ def guiMain(args=None): guiargs.accessibility = itemWindow.accessibilityVar.get() guiargs.algorithm = itemWindow.algorithmVar.get() guiargs.shuffle = entrandoWindow.shuffleVar.get() - guiargs.door_shuffle = doorShuffleVar.get() + guiargs.door_shuffle = dungeonRandoWindow.doorShuffleVar.get() guiargs.heartbeep = gameOptionsWindow.heartbeepVar.get() guiargs.heartcolor = gameOptionsWindow.heartcolorVar.get() guiargs.fastmenu = gameOptionsWindow.fastMenuVar.get() - guiargs.create_spoiler = bool(createSpoilerVar.get()) - guiargs.skip_playthrough = not bool(createSpoilerVar.get()) - guiargs.suppress_rom = bool(suppressRomVar.get()) + guiargs.create_spoiler = bool(generationSetupWindow.createSpoilerVar.get()) + guiargs.skip_playthrough = not bool(generationSetupWindow.createSpoilerVar.get()) + guiargs.suppress_rom = bool(generationSetupWindow.suppressRomVar.get()) guiargs.openpyramid = bool(entrandoWindow.openpyramidVar.get()) guiargs.mapshuffle = bool(dungeonRandoWindow.mapshuffleVar.get()) guiargs.compassshuffle = bool(dungeonRandoWindow.compassshuffleVar.get()) @@ -209,7 +158,7 @@ def guiMain(args=None): guiargs.enemy_health = enemizerWindow.enemizerHealthVar.get() guiargs.enemy_damage = enemizerWindow.enemizerDamageVar.get() guiargs.shufflepots = bool(enemizerWindow.potShuffleVar.get()) - guiargs.custom = bool(customVar.get()) + guiargs.custom = bool(generationSetupWindow.customVar.get()) guiargs.customitemarray = [int(bowVar.get()), int(silverarrowVar.get()), int(boomerangVar.get()), int(magicboomerangVar.get()), int(hookshotVar.get()), int(mushroomVar.get()), int(magicpowderVar.get()), int(firerodVar.get()), int(icerodVar.get()), int(bombosVar.get()), int(etherVar.get()), int(quakeVar.get()), int(lampVar.get()), int(hammerVar.get()), int(shovelVar.get()), int(fluteVar.get()), int(bugnetVar.get()), int(bookVar.get()), int(bottleVar.get()), int(somariaVar.get()), int(byrnaVar.get()), int(capeVar.get()), int(mirrorVar.get()), int(bootsVar.get()), int(powergloveVar.get()), int(titansmittVar.get()), @@ -219,7 +168,7 @@ def guiMain(args=None): int(arrow1Var.get()), int(arrow10Var.get()), int(bomb1Var.get()), int(bomb3Var.get()), int(rupee1Var.get()), int(rupee5Var.get()), int(rupee20Var.get()), int(rupee50Var.get()), int(rupee100Var.get()), int(rupee300Var.get()), int(rupoorVar.get()), int(blueclockVar.get()), int(greenclockVar.get()), int(redclockVar.get()), int(progbowVar.get()), int(bomb10Var.get()), int(triforcepieceVar.get()), int(triforcecountVar.get()), int(triforceVar.get()), int(rupoorcostVar.get()), int(universalkeyVar.get())] - guiargs.rom = romVar.get() + guiargs.rom = generationSetupWindow.romVar.get() # guiargs.sprite = gameOptionsWindow.sprite guiargs.outputpath = args.outputpath if args else None # get default values for missing parameters @@ -252,9 +201,6 @@ def guiMain(args=None): openOutputButton.pack(side=RIGHT) - drowDownFrame.pack(side=LEFT) - rightHalfFrame.pack(side=RIGHT) - topFrame.pack(side=TOP) bottomFrame.pack(side=BOTTOM) # Adjuster Controls @@ -354,7 +300,7 @@ def guiMain(args=None): guiargs.quickswap = bool(gameOptionsWindow.quickSwapVar.get()) guiargs.disablemusic = bool(gameOptionsWindow.disableMusicVar.get()) guiargs.rom = romVar2.get() - guiargs.baserom = romVar.get() + guiargs.baserom = generationSetupWindow.romVar.get() # guiargs.sprite = sprite try: adjust(args=guiargs) @@ -970,8 +916,8 @@ def guiMain(args=None): if type(v) is dict: setattr(args, k, v[1]) # only get values for player 1 for now # load values from commandline args - createSpoilerVar.set(int(args.create_spoiler)) - suppressRomVar.set(int(args.suppress_rom)) + generationSetupWindow.createSpoilerVar.set(int(args.create_spoiler)) + generationSetupWindow.suppressRomVar.set(int(args.suppress_rom)) dungeonRandoWindow.mapshuffleVar.set(args.mapshuffle) dungeonRandoWindow.compassshuffleVar.set(args.compassshuffle) dungeonRandoWindow.keyshuffleVar.set(args.keyshuffle) @@ -998,12 +944,12 @@ def guiMain(args=None): itemWindow.crystalsGanonVar.set(args.crystals_ganon) itemWindow.algorithmVar.set(args.algorithm) entrandoWindow.shuffleVar.set(args.shuffle) - doorShuffleVar.set(args.door_shuffle) + dungeonRandoWindow.doorShuffleVar.set(args.door_shuffle) gameOptionsWindow.heartcolorVar.set(args.heartcolor) gameOptionsWindow.heartbeepVar.set(args.heartbeep) gameOptionsWindow.fastMenuVar.set(args.fastmenu) itemWindow.logicVar.set(args.logic) - romVar.set(args.rom) + generationSetupWindow.romVar.set(args.rom) entrandoWindow.shuffleGanonVar.set(args.shuffleganon) gameOptionsWindow.hintsVar.set(args.hints) enemizerWindow.enemizerCLIpathVar.set(args.enemizercli) diff --git a/gui/randomize/generation.py b/gui/randomize/generation.py new file mode 100644 index 00000000..9082d229 --- /dev/null +++ b/gui/randomize/generation.py @@ -0,0 +1,41 @@ +import os +from tkinter import ttk, filedialog, IntVar, StringVar, Button, Checkbutton, Entry, Frame, Label, E, W, LEFT, RIGHT, X + +def generation_page(parent):#,working_dirs): + self = ttk.Frame(parent) + + # Generation Setup options + ## Generate Spoiler + self.createSpoilerVar = IntVar() + createSpoilerCheckbutton = Checkbutton(self, text="Create Spoiler Log", variable=self.createSpoilerVar) + createSpoilerCheckbutton.pack(anchor=W) + ## Don't make ROM + self.suppressRomVar = IntVar() + suppressRomCheckbutton = Checkbutton(self, text="Do not create patched Rom", variable=self.suppressRomVar) + suppressRomCheckbutton.pack(anchor=W) + ## Use Custom Item Pool as defined in Custom tab + self.customVar = IntVar() + customCheckbutton = Checkbutton(self, text="Use custom item pool", variable=self.customVar) + customCheckbutton.pack(anchor=W) + ## Locate base ROM + baseRomFrame = Frame(self) + baseRomLabel = Label(baseRomFrame, text='Base Rom: ') + self.romVar = StringVar() + def saveBaseRom(caller,_,mode): + pass +# working_dirs["rom.base"] = self.romVar.get() + self.romVar.trace_add("write",saveBaseRom) + romEntry = Entry(baseRomFrame, textvariable=self.romVar) +# self.romVar.set(working_dirs["rom.base"]) + + def RomSelect(): + rom = filedialog.askopenfilename(filetypes=[("Rom Files", (".sfc", ".smc")), ("All Files", "*")], initialdir=os.path.join(".")) + self.romVar.set(rom) + romSelectButton = Button(baseRomFrame, text='Select Rom', command=RomSelect) + + baseRomLabel.pack(side=LEFT) + romEntry.pack(side=LEFT, fill=X, expand=True) + romSelectButton.pack(side=LEFT) + baseRomFrame.pack(fill=X, expand=True) + + return self#,working_dirs From acbb775775f662b3a9508bd39ea4872cb8f7aba9 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 8 Feb 2020 15:11:46 -0800 Subject: [PATCH 010/117] Factor out Bottom Frame Factor out ArgParser Factor out working dirs for future Bind everything to the main window so that Custom tab doesn't complain --- CLI.py | 339 +++++++++++++++++++ Gui.py | 883 +++++++++++++------------------------------------- gui/bottom.py | 133 ++++++++ 3 files changed, 703 insertions(+), 652 deletions(-) create mode 100644 CLI.py create mode 100644 gui/bottom.py diff --git a/CLI.py b/CLI.py new file mode 100644 index 00000000..2f18d21e --- /dev/null +++ b/CLI.py @@ -0,0 +1,339 @@ +import argparse +import copy +import json +import os +import logging +import random +import textwrap +import shlex +import sys + +from Main import main +from Rom import get_sprite_from_name +from Utils import is_bundled, close_console +from Fill import FillError + + +class ArgumentDefaultsHelpFormatter(argparse.RawTextHelpFormatter): + + def _get_help_string(self, action): + return textwrap.dedent(action.help) + +def parse_arguments(argv, no_defaults=False): + def defval(value): + return value if not no_defaults else None + + # we need to know how many players we have first + parser = argparse.ArgumentParser(add_help=False) + parser.add_argument('--multi', default=defval(1), type=lambda value: min(max(int(value), 1), 255)) + multiargs, _ = parser.parse_known_args(argv) + + parser = argparse.ArgumentParser(formatter_class=ArgumentDefaultsHelpFormatter) + parser.add_argument('--create_spoiler', help='Output a Spoiler File', action='store_true') + parser.add_argument('--logic', default=defval('noglitches'), const='noglitches', nargs='?', choices=['noglitches', 'minorglitches', 'nologic'], + help='''\ + Select Enforcement of Item Requirements. (default: %(default)s) + No Glitches: + Minor Glitches: May require Fake Flippers, Bunny Revival + and Dark Room Navigation. + No Logic: Distribute items without regard for + item requirements. + ''') + parser.add_argument('--mode', default=defval('open'), const='open', nargs='?', choices=['standard', 'open', 'inverted'], + help='''\ + Select game mode. (default: %(default)s) + Open: World starts with Zelda rescued. + Standard: Fixes Hyrule Castle Secret Entrance and Front Door + but may lead to weird rain state issues if you exit + through the Hyrule Castle side exits before rescuing + Zelda in a full shuffle. + Inverted: Starting locations are Dark Sanctuary in West Dark + World or at Link's House, which is shuffled freely. + Requires the moon pearl to be Link in the Light World + instead of a bunny. + ''') + parser.add_argument('--swords', default=defval('random'), const='random', nargs='?', choices= ['random', 'assured', 'swordless', 'vanilla'], + help='''\ + Select sword placement. (default: %(default)s) + Random: All swords placed randomly. + Assured: Start game with a sword already. + Swordless: No swords. Curtains in Skull Woods and Agahnim\'s + Tower are removed, Agahnim\'s Tower barrier can be + destroyed with hammer. Misery Mire and Turtle Rock + can be opened without a sword. Hammer damages Ganon. + Ether and Bombos Tablet can be activated with Hammer + (and Book). Bombos pads have been added in Ice + Palace, to allow for an alternative to firerod. + Vanilla: Swords are in vanilla locations. + ''') + parser.add_argument('--goal', default=defval('ganon'), const='ganon', nargs='?', choices=['ganon', 'pedestal', 'dungeons', 'triforcehunt', 'crystals'], + help='''\ + Select completion goal. (default: %(default)s) + Ganon: Collect all crystals, beat Agahnim 2 then + defeat Ganon. + Crystals: Collect all crystals then defeat Ganon. + Pedestal: Places the Triforce at the Master Sword Pedestal. + All Dungeons: Collect all crystals, pendants, beat both + Agahnim fights and then defeat Ganon. + Triforce Hunt: Places 30 Triforce Pieces in the world, collect + 20 of them to beat the game. + ''') + parser.add_argument('--difficulty', default=defval('normal'), const='normal', nargs='?', choices=['normal', 'hard', 'expert'], + help='''\ + Select game difficulty. Affects available itempool. (default: %(default)s) + Normal: Normal difficulty. + Hard: A harder setting with less equipment and reduced health. + Expert: A harder yet setting with minimum equipment and health. + ''') + parser.add_argument('--item_functionality', default=defval('normal'), const='normal', nargs='?', choices=['normal', 'hard', 'expert'], + help='''\ + Select limits on item functionality to increase difficulty. (default: %(default)s) + Normal: Normal functionality. + Hard: Reduced functionality. + Expert: Greatly reduced functionality. + ''') + parser.add_argument('--timer', default=defval('none'), const='normal', nargs='?', choices=['none', 'display', 'timed', 'timed-ohko', 'ohko', 'timed-countdown'], + help='''\ + Select game timer setting. Affects available itempool. (default: %(default)s) + None: No timer. + Display: Displays a timer but does not affect + the itempool. + Timed: Starts with clock at zero. Green Clocks + subtract 4 minutes (Total: 20), Blue Clocks + subtract 2 minutes (Total: 10), Red Clocks add + 2 minutes (Total: 10). Winner is player with + lowest time at the end. + Timed OHKO: Starts clock at 10 minutes. Green Clocks add + 5 minutes (Total: 25). As long as clock is at 0, + Link will die in one hit. + OHKO: Like Timed OHKO, but no clock items are present + and the clock is permenantly at zero. + Timed Countdown: Starts with clock at 40 minutes. Same clocks as + Timed mode. If time runs out, you lose (but can + still keep playing). + ''') + parser.add_argument('--progressive', default=defval('on'), const='normal', nargs='?', choices=['on', 'off', 'random'], + help='''\ + Select progressive equipment setting. Affects available itempool. (default: %(default)s) + On: Swords, Shields, Armor, and Gloves will + all be progressive equipment. Each subsequent + item of the same type the player finds will + upgrade that piece of equipment by one stage. + Off: Swords, Shields, Armor, and Gloves will not + be progressive equipment. Higher level items may + be found at any time. Downgrades are not possible. + Random: Swords, Shields, Armor, and Gloves will, per + category, be randomly progressive or not. + Link will die in one hit. + ''') + parser.add_argument('--algorithm', default=defval('balanced'), const='balanced', nargs='?', choices=['freshness', 'flood', 'vt21', 'vt22', 'vt25', 'vt26', 'balanced'], + help='''\ + Select item filling algorithm. (default: %(default)s + balanced: vt26 derivative that aims to strike a balance between + the overworld heavy vt25 and the dungeon heavy vt26 + algorithm. + vt26: Shuffle items and place them in a random location + that it is not impossible to be in. This includes + dungeon keys and items. + vt25: Shuffle items and place them in a random location + that it is not impossible to be in. + vt21: Unbiased in its selection, but has tendency to put + Ice Rod in Turtle Rock. + vt22: Drops off stale locations after 1/3 of progress + items were placed to try to circumvent vt21\'s + shortcomings. + Freshness: Keep track of stale locations (ones that cannot be + reached yet) and decrease likeliness of selecting + them the more often they were found unreachable. + Flood: Push out items starting from Link\'s House and + slightly biased to placing progression items with + less restrictions. + ''') + parser.add_argument('--shuffle', default=defval('vanilla'), const='full', nargs='?', choices=['vanilla', 'simple', 'restricted', 'full', 'crossed', 'insanity', 'restricted_legacy', 'full_legacy', 'madness_legacy', 'insanity_legacy', 'dungeonsfull', 'dungeonssimple'], + help='''\ + Select Entrance Shuffling Algorithm. (default: %(default)s) + Full: Mix cave and dungeon entrances freely while limiting + multi-entrance caves to one world. + Simple: Shuffle Dungeon Entrances/Exits between each other + and keep all 4-entrance dungeons confined to one + location. All caves outside of death mountain are + shuffled in pairs and matched by original type. + Restricted: Use Dungeons shuffling from Simple but freely + connect remaining entrances. + Crossed: Mix cave and dungeon entrances freely while allowing + caves to cross between worlds. + Insanity: Decouple entrances and exits from each other and + shuffle them freely. Caves that used to be single + entrance will still exit to the same location from + which they are entered. + Vanilla: All entrances are in the same locations they were + in the base game. + Legacy shuffles preserve behavior from older versions of the + entrance randomizer including significant technical limitations. + The dungeon variants only mix up dungeons and keep the rest of + the overworld vanilla. + ''') + parser.add_argument('--door_shuffle', default=defval('basic'), const='vanilla', nargs='?', choices=['vanilla', 'basic', 'crossed', 'experimental'], + help='''\ + Select Door Shuffling Algorithm. (default: %(default)s) + Basic: Doors are mixed within a single dungeon. + (Not yet implemented) + Crossed: Doors are mixed between all dungeons. + (Not yet implemented) + Vanilla: All doors are connected the same way they were in the + base game. + Experimental: Experimental mixes live here. Use at your own risk. + ''') + parser.add_argument('--crystals_ganon', default=defval('7'), const='7', nargs='?', choices=['random', '0', '1', '2', '3', '4', '5', '6', '7'], + help='''\ + How many crystals are needed to defeat ganon. Any other + requirements for ganon for the selected goal still apply. + This setting does not apply when the all dungeons goal is + selected. (default: %(default)s) + Random: Picks a random value between 0 and 7 (inclusive). + 0-7: Number of crystals needed + ''') + parser.add_argument('--crystals_gt', default=defval('7'), const='7', nargs='?', choices=['random', '0', '1', '2', '3', '4', '5', '6', '7'], + help='''\ + How many crystals are needed to open GT. For inverted mode + this applies to the castle tower door instead. (default: %(default)s) + Random: Picks a random value between 0 and 7 (inclusive). + 0-7: Number of crystals needed + ''') + parser.add_argument('--openpyramid', default=defval(False), help='''\ + Pre-opens the pyramid hole, this removes the Agahnim 2 requirement for it + ''', action='store_true') + parser.add_argument('--rom', default=defval('Zelda no Densetsu - Kamigami no Triforce (Japan).sfc'), help='Path to an ALttP JAP(1.0) rom to use as a base.') + parser.add_argument('--loglevel', default=defval('info'), const='info', nargs='?', choices=['error', 'info', 'warning', 'debug'], help='Select level of logging for output.') + parser.add_argument('--seed', help='Define seed number to generate.', type=int) + parser.add_argument('--count', help='''\ + Use to batch generate multiple seeds with same settings. + If --seed is provided, it will be used for the first seed, then + used to derive the next seed (i.e. generating 10 seeds with + --seed given will produce the same 10 (different) roms each + time). + ''', type=int) + parser.add_argument('--fastmenu', default=defval('normal'), const='normal', nargs='?', choices=['normal', 'instant', 'double', 'triple', 'quadruple', 'half'], + help='''\ + Select the rate at which the menu opens and closes. + (default: %(default)s) + ''') + parser.add_argument('--quickswap', default=defval(False), help='Enable quick item swapping with L and R.', action='store_true') + parser.add_argument('--disablemusic', default=defval(False), help='Disables game music.', action='store_true') + parser.add_argument('--mapshuffle', default=defval(False), help='Maps are no longer restricted to their dungeons, but can be anywhere', action='store_true') + parser.add_argument('--compassshuffle', default=defval(False), help='Compasses are no longer restricted to their dungeons, but can be anywhere', action='store_true') + parser.add_argument('--keyshuffle', default=defval(False), help='Small Keys are no longer restricted to their dungeons, but can be anywhere', action='store_true') + parser.add_argument('--bigkeyshuffle', default=defval(False), help='Big Keys are no longer restricted to their dungeons, but can be anywhere', action='store_true') + parser.add_argument('--keysanity', default=defval(False), help=argparse.SUPPRESS, action='store_true') + parser.add_argument('--retro', default=defval(False), help='''\ + Keys are universal, shooting arrows costs rupees, + and a few other little things make this more like Zelda-1. + ''', action='store_true') + parser.add_argument('--startinventory', default=defval(''), help='Specifies a list of items that will be in your starting inventory (separated by commas)') + parser.add_argument('--custom', default=defval(False), help='Not supported.') + parser.add_argument('--customitemarray', default=defval(False), help='Not supported.') + parser.add_argument('--accessibility', default=defval('items'), const='items', nargs='?', choices=['items', 'locations', 'none'], help='''\ + Select Item/Location Accessibility. (default: %(default)s) + Items: You can reach all unique inventory items. No guarantees about + reaching all locations or all keys. + Locations: You will be able to reach every location in the game. + None: You will be able to reach enough locations to beat the game. + ''') + parser.add_argument('--hints', default=defval(False), help='''\ + Make telepathic tiles and storytellers give helpful hints. + ''', action='store_true') + # included for backwards compatibility + parser.add_argument('--shuffleganon', help=argparse.SUPPRESS, action='store_true', default=defval(True)) + parser.add_argument('--no-shuffleganon', help='''\ + If set, the Pyramid Hole and Ganon's Tower are not + included entrance shuffle pool. + ''', action='store_false', dest='shuffleganon') + parser.add_argument('--heartbeep', default=defval('normal'), const='normal', nargs='?', choices=['double', 'normal', 'half', 'quarter', 'off'], + help='''\ + Select the rate at which the heart beep sound is played at + low health. (default: %(default)s) + ''') + parser.add_argument('--heartcolor', default=defval('red'), const='red', nargs='?', choices=['red', 'blue', 'green', 'yellow', 'random'], + help='Select the color of Link\'s heart meter. (default: %(default)s)') + parser.add_argument('--ow_palettes', default=defval('default'), choices=['default', 'random', 'blackout']) + parser.add_argument('--uw_palettes', default=defval('default'), choices=['default', 'random', 'blackout']) + parser.add_argument('--sprite', help='''\ + Path to a sprite sheet to use for Link. Needs to be in + binary format and have a length of 0x7000 (28672) bytes, + or 0x7078 (28792) bytes including palette data. + Alternatively, can be a ALttP Rom patched with a Link + sprite that will be extracted. + ''') + parser.add_argument('--suppress_rom', help='Do not create an output rom file.', action='store_true') + parser.add_argument('--gui', help='Launch the GUI', action='store_true') + parser.add_argument('--jsonout', action='store_true', help='''\ + Output .json patch to stdout instead of a patched rom. Used + for VT site integration, do not use otherwise. + ''') + parser.add_argument('--skip_playthrough', action='store_true', default=defval(False)) + parser.add_argument('--enemizercli', default=defval('EnemizerCLI/EnemizerCLI.Core')) + parser.add_argument('--shufflebosses', default=defval('none'), choices=['none', 'basic', 'normal', 'chaos']) + parser.add_argument('--shuffleenemies', default=defval('none'), choices=['none', 'shuffled', 'chaos']) + parser.add_argument('--enemy_health', default=defval('default'), choices=['default', 'easy', 'normal', 'hard', 'expert']) + parser.add_argument('--enemy_damage', default=defval('default'), choices=['default', 'shuffled', 'chaos']) + parser.add_argument('--shufflepots', default=defval(False), action='store_true') + parser.add_argument('--beemizer', default=defval(0), type=lambda value: min(max(int(value), 0), 4)) + parser.add_argument('--remote_items', default=defval(False), action='store_true') + parser.add_argument('--multi', default=defval(1), type=lambda value: min(max(int(value), 1), 255)) + parser.add_argument('--names', default=defval('')) + parser.add_argument('--teams', default=defval(1), type=lambda value: max(int(value), 1)) + parser.add_argument('--outputpath') + parser.add_argument('--race', default=defval(False), action='store_true') + parser.add_argument('--outputname') + + if multiargs.multi: + for player in range(1, multiargs.multi + 1): + parser.add_argument(f'--p{player}', default=defval(''), help=argparse.SUPPRESS) + + ret = parser.parse_args(argv) + if ret.keysanity: + ret.mapshuffle, ret.compassshuffle, ret.keyshuffle, ret.bigkeyshuffle = [True] * 4 + + if multiargs.multi: + defaults = copy.deepcopy(ret) + for player in range(1, multiargs.multi + 1): + playerargs = parse_arguments(shlex.split(getattr(ret,f"p{player}")), True) + + for name in ['logic', 'mode', 'swords', 'goal', 'difficulty', 'item_functionality', + 'shuffle', 'door_shuffle', 'crystals_ganon', 'crystals_gt', 'openpyramid', + 'mapshuffle', 'compassshuffle', 'keyshuffle', 'bigkeyshuffle', 'startinventory', + 'retro', 'accessibility', 'hints', 'beemizer', + 'shufflebosses', 'shuffleenemies', 'enemy_health', 'enemy_damage', 'shufflepots', + 'ow_palettes', 'uw_palettes', 'sprite', 'disablemusic', 'quickswap', 'fastmenu', 'heartcolor', 'heartbeep', + 'remote_items']: + value = getattr(defaults, name) if getattr(playerargs, name) is None else getattr(playerargs, name) + if player == 1: + setattr(ret, name, {1: value}) + else: + getattr(ret, name)[player] = value + + return ret + +def get_working_dirs(): + # set default working dirs to same dir as script + working_dirs = { + "adjust.rom": os.path.join("."), + "enemizer.cli": os.path.join(".","EnemizerCLI","EnemizerCLI.Core"), + "multi.worlds": 1, + "multi.names": "", + "rom.base": os.path.join(".","Zelda no Densetsu - Kamigami no Triforce (Japan).sfc"), + "gen.seed": "", + "gen.count": 1, + "outputpath": os.path.join("."), + } + if sys.platform.lower().find("windows"): + working_dirs["enemizer.cli"] += ".exe" + + # read saved working dirs file if it exists and set these + working_dirs_path = os.path.join(".","resources","user","working_dirs.json") + if os.path.exists(working_dirs_path): + with(open(working_dirs_path)) as json_file: + data = json.load(json_file) + for k,v in data.items(): + working_dirs[k] = v + return working_dirs diff --git a/Gui.py b/Gui.py index b057046e..7a616284 100755 --- a/Gui.py +++ b/Gui.py @@ -19,6 +19,7 @@ from gui.randomize.dungeon import dungeon_page from gui.randomize.multiworld import multiworld_page from gui.randomize.gameoptions import gameoptions_page from gui.randomize.generation import generation_page +from gui.bottom import bottom_frame from GuiUtils import ToolTips, set_icon, BackgroundTaskProgress from Main import main, __version__ as ESVersion from Rom import Sprite @@ -27,39 +28,20 @@ from Utils import is_bundled, local_path, output_path, open_file def guiMain(args=None): mainWindow = Tk() + self = mainWindow mainWindow.wm_title("Door Shuffle %s" % ESVersion) set_icon(mainWindow) - notebook = ttk.Notebook(mainWindow) - randomizerWindow = ttk.Frame(notebook) - adjustWindow = ttk.Frame(notebook) - customWindow = ttk.Frame(notebook) - notebook.add(randomizerWindow, text='Randomize') - notebook.add(adjustWindow, text='Adjust') - notebook.add(customWindow, text='Custom') + notebook = ttk.Notebook(self) + self.randomizerWindow = ttk.Frame(notebook) + self.adjustWindow = ttk.Frame(notebook) + self.customWindow = ttk.Frame(notebook) + notebook.add(self.randomizerWindow, text='Randomize') + notebook.add(self.adjustWindow, text='Adjust') + notebook.add(self.customWindow, text='Custom') notebook.pack() - # Shared Controls - - farBottomFrame = Frame(mainWindow) - - def open_output(): - if args and args.outputpath: - open_file(output_path(args.outputpath)) - else: - open_file(output_path('')) - - openOutputButton = Button(farBottomFrame, text='Open Output Directory', command=open_output) - - if os.path.exists(local_path('README.html')): - def open_readme(): - open_file(local_path('README.html')) - openReadmeButton = Button(farBottomFrame, text='Open Documentation', command=open_readme) - openReadmeButton.pack(side=LEFT) - - farBottomFrame.pack(side=BOTTOM, fill=X, padx=5, pady=5) - # randomizer controls # Randomize notebook page: @@ -71,146 +53,52 @@ def guiMain(args=None): # Multiworld: Multiworld settings # Game Options: Cosmetic settings that don't affect logic/placement # Generation Setup: Primarily one&done settings - randomizerNotebook = ttk.Notebook(randomizerWindow) + self.randomizerNotebook = ttk.Notebook(self.randomizerWindow) # Item Randomizer - itemWindow = item_page(randomizerNotebook) - randomizerNotebook.add(itemWindow, text="Items") + self.itemWindow = item_page(self.randomizerNotebook) + self.randomizerNotebook.add(self.itemWindow, text="Items") # Entrance Randomizer - entrandoWindow = entrando_page(randomizerNotebook) - randomizerNotebook.add(entrandoWindow, text="Entrances") + self.entrandoWindow = entrando_page(self.randomizerNotebook) + self.randomizerNotebook.add(self.entrandoWindow, text="Entrances") # Enemizer - enemizerWindow = enemizer_page(randomizerNotebook) - randomizerNotebook.add(enemizerWindow, text="Enemizer") + self.enemizerWindow = enemizer_page(self.randomizerNotebook) + self.randomizerNotebook.add(self.enemizerWindow, text="Enemizer") # Dungeon Shuffle - dungeonRandoWindow = dungeon_page(randomizerNotebook) - randomizerNotebook.add(dungeonRandoWindow, text="Dungeon Shuffle") + self.dungeonRandoWindow = dungeon_page(self.randomizerNotebook) + self.randomizerNotebook.add(self.dungeonRandoWindow, text="Dungeon Shuffle") # Multiworld - multiworldWindow = multiworld_page(randomizerNotebook) - randomizerNotebook.add(multiworldWindow, text="Multiworld") + self.multiworldWindow = multiworld_page(self.randomizerNotebook) + self.randomizerNotebook.add(self.multiworldWindow, text="Multiworld") # Game Options - gameOptionsWindow = gameoptions_page(randomizerNotebook) - randomizerNotebook.add(gameOptionsWindow, text="Game Options") + self.gameOptionsWindow = gameoptions_page(self.randomizerNotebook) + self.randomizerNotebook.add(self.gameOptionsWindow, text="Game Options") # Generation Setup - generationSetupWindow = generation_page(randomizerNotebook) - randomizerNotebook.add(generationSetupWindow, text="Generation Setup") + self.generationSetupWindow = generation_page(self.randomizerNotebook) + self.randomizerNotebook.add(self.generationSetupWindow, text="Generation Setup") # add randomizer notebook to main window - randomizerNotebook.pack() + self.randomizerNotebook.pack() - bottomFrame = Frame(randomizerWindow, pady=5) - - seedLabel = Label(farBottomFrame, text='Seed #') - seedVar = StringVar() - seedEntry = Entry(farBottomFrame, width=15, textvariable=seedVar) - countLabel = Label(farBottomFrame, text='Count') - countVar = StringVar() - countSpinbox = Spinbox(farBottomFrame, from_=1, to=100, width=5, textvariable=countVar) - - def generateRom(): - guiargs = Namespace() - guiargs.multi = int(multiworldWindow.worldVar.get()) - guiargs.names = multiworldWindow.namesVar.get() - guiargs.seed = int(seedVar.get()) if seedVar.get() else None - guiargs.count = int(countVar.get()) if countVar.get() != '1' else None - guiargs.mode = itemWindow.modeVar.get() - guiargs.logic = itemWindow.logicVar.get() - - guiargs.goal = itemWindow.goalVar.get() - guiargs.crystals_gt = itemWindow.crystalsGTVar.get() - guiargs.crystals_ganon = itemWindow.crystalsGanonVar.get() - guiargs.swords = itemWindow.swordVar.get() - guiargs.difficulty = itemWindow.difficultyVar.get() - guiargs.item_functionality = itemWindow.itemfunctionVar.get() - guiargs.timer = itemWindow.timerVar.get() - guiargs.progressive = itemWindow.progressiveVar.get() - guiargs.accessibility = itemWindow.accessibilityVar.get() - guiargs.algorithm = itemWindow.algorithmVar.get() - guiargs.shuffle = entrandoWindow.shuffleVar.get() - guiargs.door_shuffle = dungeonRandoWindow.doorShuffleVar.get() - guiargs.heartbeep = gameOptionsWindow.heartbeepVar.get() - guiargs.heartcolor = gameOptionsWindow.heartcolorVar.get() - guiargs.fastmenu = gameOptionsWindow.fastMenuVar.get() - guiargs.create_spoiler = bool(generationSetupWindow.createSpoilerVar.get()) - guiargs.skip_playthrough = not bool(generationSetupWindow.createSpoilerVar.get()) - guiargs.suppress_rom = bool(generationSetupWindow.suppressRomVar.get()) - guiargs.openpyramid = bool(entrandoWindow.openpyramidVar.get()) - guiargs.mapshuffle = bool(dungeonRandoWindow.mapshuffleVar.get()) - guiargs.compassshuffle = bool(dungeonRandoWindow.compassshuffleVar.get()) - guiargs.keyshuffle = bool(dungeonRandoWindow.keyshuffleVar.get()) - guiargs.bigkeyshuffle = bool(dungeonRandoWindow.bigkeyshuffleVar.get()) - guiargs.retro = bool(itemWindow.retroVar.get()) - guiargs.quickswap = bool(gameOptionsWindow.quickSwapVar.get()) - guiargs.disablemusic = bool(gameOptionsWindow.disableMusicVar.get()) - guiargs.ow_palettes = gameOptionsWindow.owPalettesVar.get() - guiargs.uw_palettes = gameOptionsWindow.uwPalettesVar.get() - guiargs.shuffleganon = bool(entrandoWindow.shuffleGanonVar.get()) - guiargs.hints = bool(gameOptionsWindow.hintsVar.get()) - guiargs.enemizercli = enemizerWindow.enemizerCLIpathVar.get() - guiargs.shufflebosses = enemizerWindow.enemizerBossVar.get() - guiargs.shuffleenemies = enemizerWindow.enemyShuffleVar.get() - guiargs.enemy_health = enemizerWindow.enemizerHealthVar.get() - guiargs.enemy_damage = enemizerWindow.enemizerDamageVar.get() - guiargs.shufflepots = bool(enemizerWindow.potShuffleVar.get()) - guiargs.custom = bool(generationSetupWindow.customVar.get()) - guiargs.customitemarray = [int(bowVar.get()), int(silverarrowVar.get()), int(boomerangVar.get()), int(magicboomerangVar.get()), int(hookshotVar.get()), int(mushroomVar.get()), int(magicpowderVar.get()), int(firerodVar.get()), - int(icerodVar.get()), int(bombosVar.get()), int(etherVar.get()), int(quakeVar.get()), int(lampVar.get()), int(hammerVar.get()), int(shovelVar.get()), int(fluteVar.get()), int(bugnetVar.get()), - int(bookVar.get()), int(bottleVar.get()), int(somariaVar.get()), int(byrnaVar.get()), int(capeVar.get()), int(mirrorVar.get()), int(bootsVar.get()), int(powergloveVar.get()), int(titansmittVar.get()), - int(proggloveVar.get()), int(flippersVar.get()), int(pearlVar.get()), int(heartpieceVar.get()), int(fullheartVar.get()), int(sancheartVar.get()), int(sword1Var.get()), int(sword2Var.get()), - int(sword3Var.get()), int(sword4Var.get()), int(progswordVar.get()), int(shield1Var.get()), int(shield2Var.get()), int(shield3Var.get()), int(progshieldVar.get()), int(bluemailVar.get()), - int(redmailVar.get()), int(progmailVar.get()), int(halfmagicVar.get()), int(quartermagicVar.get()), int(bcap5Var.get()), int(bcap10Var.get()), int(acap5Var.get()), int(acap10Var.get()), - int(arrow1Var.get()), int(arrow10Var.get()), int(bomb1Var.get()), int(bomb3Var.get()), int(rupee1Var.get()), int(rupee5Var.get()), int(rupee20Var.get()), int(rupee50Var.get()), int(rupee100Var.get()), - int(rupee300Var.get()), int(rupoorVar.get()), int(blueclockVar.get()), int(greenclockVar.get()), int(redclockVar.get()), int(progbowVar.get()), int(bomb10Var.get()), int(triforcepieceVar.get()), - int(triforcecountVar.get()), int(triforceVar.get()), int(rupoorcostVar.get()), int(universalkeyVar.get())] - guiargs.rom = generationSetupWindow.romVar.get() -# guiargs.sprite = gameOptionsWindow.sprite - guiargs.outputpath = args.outputpath if args else None - # get default values for missing parameters - for k,v in vars(parse_arguments(['--multi', str(guiargs.multi)])).items(): - if k not in vars(guiargs): - setattr(guiargs, k, v) - elif type(v) is dict: # use same settings for every player - setattr(guiargs, k, {player: getattr(guiargs, k) for player in range(1, guiargs.multi + 1)}) - try: - if guiargs.count is not None: - seed = guiargs.seed - for _ in range(guiargs.count): - main(seed=seed, args=guiargs) - seed = random.randint(0, 999999999) - else: - main(seed=guiargs.seed, args=guiargs) - except Exception as e: - logging.exception(e) - messagebox.showerror(title="Error while creating seed", message=str(e)) - else: - messagebox.showinfo(title="Success", message="Rom patched successfully") - - generateButton = Button(farBottomFrame, text='Generate Patched Rom', command=generateRom) - - seedLabel.pack(side=LEFT, padx=(5, 0)) - seedEntry.pack(side=LEFT) - countLabel.pack(side=LEFT, padx=(5, 0)) - countSpinbox.pack(side=LEFT) - generateButton.pack(side=LEFT, padx=(5, 0)) - - openOutputButton.pack(side=RIGHT) - - bottomFrame.pack(side=BOTTOM) + # bottom of window: Open Output Directory, Open Documentation (if exists) + self.farBottomFrame = bottom_frame(self,self,None) + # set bottom frame to main window + self.farBottomFrame.pack(side=BOTTOM, fill=X, padx=5, pady=5) # Adjuster Controls - topFrame2 = Frame(adjustWindow) + topFrame2 = Frame(self.adjustWindow) rightHalfFrame2 = Frame(topFrame2) checkBoxFrame2 = Frame(rightHalfFrame2) - quickSwapCheckbutton2 = Checkbutton(checkBoxFrame2, text="Enabled L/R Item quickswapping", variable=gameOptionsWindow.quickSwapVar) - disableMusicCheckbutton2 = Checkbutton(checkBoxFrame2, text="Disable game music", variable=gameOptionsWindow.disableMusicVar) + quickSwapCheckbutton2 = Checkbutton(checkBoxFrame2, text="Enabled L/R Item quickswapping", variable=self.gameOptionsWindow.quickSwapVar) + disableMusicCheckbutton2 = Checkbutton(checkBoxFrame2, text="Disable game music", variable=self.gameOptionsWindow.disableMusicVar) quickSwapCheckbutton2.pack(expand=True, anchor=W) disableMusicCheckbutton2.pack(expand=True, anchor=W) @@ -233,7 +121,7 @@ def guiMain(args=None): spriteDialogFrame2 = Frame(fileDialogFrame2) baseSpriteLabel2 = Label(spriteDialogFrame2, text='Link Sprite') - spriteEntry2 = Label(spriteDialogFrame2, textvariable=gameOptionsWindow.spriteNameVar) + spriteEntry2 = Label(spriteDialogFrame2, textvariable=self.gameOptionsWindow.spriteNameVar) def SpriteSelectAdjuster(): pass @@ -253,31 +141,31 @@ def guiMain(args=None): drowDownFrame2 = Frame(topFrame2) heartbeepFrame2 = Frame(drowDownFrame2) - heartbeepOptionMenu2 = OptionMenu(heartbeepFrame2, gameOptionsWindow.heartbeepVar, 'double', 'normal', 'half', 'quarter', 'off') + heartbeepOptionMenu2 = OptionMenu(heartbeepFrame2, self.gameOptionsWindow.heartbeepVar, 'double', 'normal', 'half', 'quarter', 'off') heartbeepOptionMenu2.pack(side=RIGHT) heartbeepLabel2 = Label(heartbeepFrame2, text='Heartbeep sound rate') heartbeepLabel2.pack(side=LEFT) heartcolorFrame2 = Frame(drowDownFrame2) - heartcolorOptionMenu2 = OptionMenu(heartcolorFrame2, gameOptionsWindow.heartcolorVar, 'red', 'blue', 'green', 'yellow', 'random') + heartcolorOptionMenu2 = OptionMenu(heartcolorFrame2, self.gameOptionsWindow.heartcolorVar, 'red', 'blue', 'green', 'yellow', 'random') heartcolorOptionMenu2.pack(side=RIGHT) heartcolorLabel2 = Label(heartcolorFrame2, text='Heart color') heartcolorLabel2.pack(side=LEFT) fastMenuFrame2 = Frame(drowDownFrame2) - fastMenuOptionMenu2 = OptionMenu(fastMenuFrame2, gameOptionsWindow.fastMenuVar, 'normal', 'instant', 'double', 'triple', 'quadruple', 'half') + fastMenuOptionMenu2 = OptionMenu(fastMenuFrame2, self.gameOptionsWindow.fastMenuVar, 'normal', 'instant', 'double', 'triple', 'quadruple', 'half') fastMenuOptionMenu2.pack(side=RIGHT) fastMenuLabel2 = Label(fastMenuFrame2, text='Menu speed') fastMenuLabel2.pack(side=LEFT) owPalettesFrame2 = Frame(drowDownFrame2) - owPalettesOptionMenu2 = OptionMenu(owPalettesFrame2, gameOptionsWindow.owPalettesVar, 'default', 'random', 'blackout') + owPalettesOptionMenu2 = OptionMenu(owPalettesFrame2, self.gameOptionsWindow.owPalettesVar, 'default', 'random', 'blackout') owPalettesOptionMenu2.pack(side=RIGHT) owPalettesLabel2 = Label(owPalettesFrame2, text='Overworld palettes') owPalettesLabel2.pack(side=LEFT) uwPalettesFrame2 = Frame(drowDownFrame2) - uwPalettesOptionMenu2 = OptionMenu(uwPalettesFrame2, gameOptionsWindow.uwPalettesVar, 'default', 'random', 'blackout') + uwPalettesOptionMenu2 = OptionMenu(uwPalettesFrame2, self.gameOptionsWindow.uwPalettesVar, 'default', 'random', 'blackout') uwPalettesOptionMenu2.pack(side=RIGHT) uwPalettesLabel2 = Label(uwPalettesFrame2, text='Dungeon palettes') uwPalettesLabel2.pack(side=LEFT) @@ -292,15 +180,15 @@ def guiMain(args=None): def adjustRom(): guiargs = Namespace() - guiargs.heartbeep = gameOptionsWindow.heartbeepVar.get() - guiargs.heartcolor = gameOptionsWindow.heartcolorVar.get() - guiargs.fastmenu = gameOptionsWindow.fastMenuVar.get() - guiargs.ow_palettes = gameOptionsWindow.owPalettesVar.get() - guiargs.uw_palettes = gameOptionsWindow.uwPalettesVar.get() - guiargs.quickswap = bool(gameOptionsWindow.quickSwapVar.get()) - guiargs.disablemusic = bool(gameOptionsWindow.disableMusicVar.get()) + guiargs.heartbeep = self.gameOptionsWindow.heartbeepVar.get() + guiargs.heartcolor = self.gameOptionsWindow.heartcolorVar.get() + guiargs.fastmenu = self.gameOptionsWindow.fastMenuVar.get() + guiargs.ow_palettes = self.gameOptionsWindow.owPalettesVar.get() + guiargs.uw_palettes = self.gameOptionsWindow.uwPalettesVar.get() + guiargs.quickswap = bool(self.gameOptionsWindow.quickSwapVar.get()) + guiargs.disablemusic = bool(self.gameOptionsWindow.disableMusicVar.get()) guiargs.rom = romVar2.get() - guiargs.baserom = generationSetupWindow.romVar.get() + guiargs.baserom = self.generationSetupWindow.romVar.get() # guiargs.sprite = sprite try: adjust(args=guiargs) @@ -321,7 +209,7 @@ def guiMain(args=None): # Custom Controls - topFrame3 = Frame(customWindow) + topFrame3 = Frame(self.customWindow) def validation(P): if str.isdigit(P) or P == "": @@ -338,568 +226,568 @@ def guiMain(args=None): bowFrame = Frame(itemList1) bowLabel = Label(bowFrame, text='Bow') - bowVar = StringVar(value='0') - bowEntry = Entry(bowFrame, textvariable=bowVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.bowVar = StringVar(value='0') + bowEntry = Entry(bowFrame, textvariable=self.customWindow.bowVar, width=3, validate='all', vcmd=vcmd) bowFrame.pack() bowLabel.pack(anchor=W, side=LEFT, padx=(0,53)) bowEntry.pack(anchor=E) progbowFrame = Frame(itemList1) progbowLabel = Label(progbowFrame, text='Prog.Bow') - progbowVar = StringVar(value='2') - progbowEntry = Entry(progbowFrame, textvariable=progbowVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.progbowVar = StringVar(value='2') + progbowEntry = Entry(progbowFrame, textvariable=self.customWindow.progbowVar, width=3, validate='all', vcmd=vcmd) progbowFrame.pack() progbowLabel.pack(anchor=W, side=LEFT, padx=(0,25)) progbowEntry.pack(anchor=E) boomerangFrame = Frame(itemList1) boomerangLabel = Label(boomerangFrame, text='Boomerang') - boomerangVar = StringVar(value='1') - boomerangEntry = Entry(boomerangFrame, textvariable=boomerangVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.boomerangVar = StringVar(value='1') + boomerangEntry = Entry(boomerangFrame, textvariable=self.customWindow.boomerangVar, width=3, validate='all', vcmd=vcmd) boomerangFrame.pack() boomerangLabel.pack(anchor=W, side=LEFT, padx=(0,14)) boomerangEntry.pack(anchor=E) magicboomerangFrame = Frame(itemList1) magicboomerangLabel = Label(magicboomerangFrame, text='M.Boomerang') - magicboomerangVar = StringVar(value='1') - magicboomerangEntry = Entry(magicboomerangFrame, textvariable=magicboomerangVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.magicboomerangVar = StringVar(value='1') + magicboomerangEntry = Entry(magicboomerangFrame, textvariable=self.customWindow.magicboomerangVar, width=3, validate='all', vcmd=vcmd) magicboomerangFrame.pack() magicboomerangLabel.pack(anchor=W, side=LEFT) magicboomerangEntry.pack(anchor=E) hookshotFrame = Frame(itemList1) hookshotLabel = Label(hookshotFrame, text='Hookshot') - hookshotVar = StringVar(value='1') - hookshotEntry = Entry(hookshotFrame, textvariable=hookshotVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.hookshotVar = StringVar(value='1') + hookshotEntry = Entry(hookshotFrame, textvariable=self.customWindow.hookshotVar, width=3, validate='all', vcmd=vcmd) hookshotFrame.pack() hookshotLabel.pack(anchor=W, side=LEFT, padx=(0,24)) hookshotEntry.pack(anchor=E) mushroomFrame = Frame(itemList1) mushroomLabel = Label(mushroomFrame, text='Mushroom') - mushroomVar = StringVar(value='1') - mushroomEntry = Entry(mushroomFrame, textvariable=mushroomVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.mushroomVar = StringVar(value='1') + mushroomEntry = Entry(mushroomFrame, textvariable=self.customWindow.mushroomVar, width=3, validate='all', vcmd=vcmd) mushroomFrame.pack() mushroomLabel.pack(anchor=W, side=LEFT, padx=(0,17)) mushroomEntry.pack(anchor=E) magicpowderFrame = Frame(itemList1) magicpowderLabel = Label(magicpowderFrame, text='Magic Powder') - magicpowderVar = StringVar(value='1') - magicpowderEntry = Entry(magicpowderFrame, textvariable=magicpowderVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.magicpowderVar = StringVar(value='1') + magicpowderEntry = Entry(magicpowderFrame, textvariable=self.customWindow.magicpowderVar, width=3, validate='all', vcmd=vcmd) magicpowderFrame.pack() magicpowderLabel.pack(anchor=W, side=LEFT) magicpowderEntry.pack(anchor=E) firerodFrame = Frame(itemList1) firerodLabel = Label(firerodFrame, text='Fire Rod') - firerodVar = StringVar(value='1') - firerodEntry = Entry(firerodFrame, textvariable=firerodVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.firerodVar = StringVar(value='1') + firerodEntry = Entry(firerodFrame, textvariable=self.customWindow.firerodVar, width=3, validate='all', vcmd=vcmd) firerodFrame.pack() firerodLabel.pack(anchor=W, side=LEFT, padx=(0,33)) firerodEntry.pack(anchor=E) icerodFrame = Frame(itemList1) icerodLabel = Label(icerodFrame, text='Ice Rod') - icerodVar = StringVar(value='1') - icerodEntry = Entry(icerodFrame, textvariable=icerodVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.icerodVar = StringVar(value='1') + icerodEntry = Entry(icerodFrame, textvariable=self.customWindow.icerodVar, width=3, validate='all', vcmd=vcmd) icerodFrame.pack() icerodLabel.pack(anchor=W, side=LEFT, padx=(0,37)) icerodEntry.pack(anchor=E) bombosFrame = Frame(itemList1) bombosLabel = Label(bombosFrame, text='Bombos') - bombosVar = StringVar(value='1') - bombosEntry = Entry(bombosFrame, textvariable=bombosVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.bombosVar = StringVar(value='1') + bombosEntry = Entry(bombosFrame, textvariable=self.customWindow.bombosVar, width=3, validate='all', vcmd=vcmd) bombosFrame.pack() bombosLabel.pack(anchor=W, side=LEFT, padx=(0,32)) bombosEntry.pack(anchor=E) etherFrame = Frame(itemList1) etherLabel = Label(etherFrame, text='Ether') - etherVar = StringVar(value='1') - etherEntry = Entry(etherFrame, textvariable=etherVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.etherVar = StringVar(value='1') + etherEntry = Entry(etherFrame, textvariable=self.customWindow.etherVar, width=3, validate='all', vcmd=vcmd) etherFrame.pack() etherLabel.pack(anchor=W, side=LEFT, padx=(0,49)) etherEntry.pack(anchor=E) quakeFrame = Frame(itemList1) quakeLabel = Label(quakeFrame, text='Quake') - quakeVar = StringVar(value='1') - quakeEntry = Entry(quakeFrame, textvariable=quakeVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.quakeVar = StringVar(value='1') + quakeEntry = Entry(quakeFrame, textvariable=self.customWindow.quakeVar, width=3, validate='all', vcmd=vcmd) quakeFrame.pack() quakeLabel.pack(anchor=W, side=LEFT, padx=(0,42)) quakeEntry.pack(anchor=E) lampFrame = Frame(itemList1) lampLabel = Label(lampFrame, text='Lamp') - lampVar = StringVar(value='1') - lampEntry = Entry(lampFrame, textvariable=lampVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.lampVar = StringVar(value='1') + lampEntry = Entry(lampFrame, textvariable=self.customWindow.lampVar, width=3, validate='all', vcmd=vcmd) lampFrame.pack() lampLabel.pack(anchor=W, side=LEFT, padx=(0,46)) lampEntry.pack(anchor=E) hammerFrame = Frame(itemList1) hammerLabel = Label(hammerFrame, text='Hammer') - hammerVar = StringVar(value='1') - hammerEntry = Entry(hammerFrame, textvariable=hammerVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.hammerVar = StringVar(value='1') + hammerEntry = Entry(hammerFrame, textvariable=self.customWindow.hammerVar, width=3, validate='all', vcmd=vcmd) hammerFrame.pack() hammerLabel.pack(anchor=W, side=LEFT, padx=(0,29)) hammerEntry.pack(anchor=E) shovelFrame = Frame(itemList1) shovelLabel = Label(shovelFrame, text='Shovel') - shovelVar = StringVar(value='1') - shovelEntry = Entry(shovelFrame, textvariable=shovelVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.shovelVar = StringVar(value='1') + shovelEntry = Entry(shovelFrame, textvariable=self.customWindow.shovelVar, width=3, validate='all', vcmd=vcmd) shovelFrame.pack() shovelLabel.pack(anchor=W, side=LEFT, padx=(0,41)) shovelEntry.pack(anchor=E) fluteFrame = Frame(itemList1) fluteLabel = Label(fluteFrame, text='Flute') - fluteVar = StringVar(value='1') - fluteEntry = Entry(fluteFrame, textvariable=fluteVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.fluteVar = StringVar(value='1') + fluteEntry = Entry(fluteFrame, textvariable=self.customWindow.fluteVar, width=3, validate='all', vcmd=vcmd) fluteFrame.pack() fluteLabel.pack(anchor=W, side=LEFT, padx=(0,50)) fluteEntry.pack(anchor=E) bugnetFrame = Frame(itemList2) bugnetLabel = Label(bugnetFrame, text='Bug Net') - bugnetVar = StringVar(value='1') - bugnetEntry = Entry(bugnetFrame, textvariable=bugnetVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.bugnetVar = StringVar(value='1') + bugnetEntry = Entry(bugnetFrame, textvariable=self.customWindow.bugnetVar, width=3, validate='all', vcmd=vcmd) bugnetFrame.pack() bugnetLabel.pack(anchor=W, side=LEFT, padx=(0,41)) bugnetEntry.pack(anchor=E) bookFrame = Frame(itemList2) bookLabel = Label(bookFrame, text='Book') - bookVar = StringVar(value='1') - bookEntry = Entry(bookFrame, textvariable=bookVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.bookVar = StringVar(value='1') + bookEntry = Entry(bookFrame, textvariable=self.customWindow.bookVar, width=3, validate='all', vcmd=vcmd) bookFrame.pack() bookLabel.pack(anchor=W, side=LEFT, padx=(0,57)) bookEntry.pack(anchor=E) bottleFrame = Frame(itemList2) bottleLabel = Label(bottleFrame, text='Bottle') - bottleVar = StringVar(value='4') - bottleEntry = Entry(bottleFrame, textvariable=bottleVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.bottleVar = StringVar(value='4') + bottleEntry = Entry(bottleFrame, textvariable=self.customWindow.bottleVar, width=3, validate='all', vcmd=vcmd) bottleFrame.pack() bottleLabel.pack(anchor=W, side=LEFT, padx=(0,53)) bottleEntry.pack(anchor=E) somariaFrame = Frame(itemList2) somariaLabel = Label(somariaFrame, text='C.Somaria') - somariaVar = StringVar(value='1') - somariaEntry = Entry(somariaFrame, textvariable=somariaVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.somariaVar = StringVar(value='1') + somariaEntry = Entry(somariaFrame, textvariable=self.customWindow.somariaVar, width=3, validate='all', vcmd=vcmd) somariaFrame.pack() somariaLabel.pack(anchor=W, side=LEFT, padx=(0,30)) somariaEntry.pack(anchor=E) byrnaFrame = Frame(itemList2) byrnaLabel = Label(byrnaFrame, text='C.Byrna') - byrnaVar = StringVar(value='1') - byrnaEntry = Entry(byrnaFrame, textvariable=byrnaVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.byrnaVar = StringVar(value='1') + byrnaEntry = Entry(byrnaFrame, textvariable=self.customWindow.byrnaVar, width=3, validate='all', vcmd=vcmd) byrnaFrame.pack() byrnaLabel.pack(anchor=W, side=LEFT, padx=(0,43)) byrnaEntry.pack(anchor=E) capeFrame = Frame(itemList2) capeLabel = Label(capeFrame, text='Magic Cape') - capeVar = StringVar(value='1') - capeEntry = Entry(capeFrame, textvariable=capeVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.capeVar = StringVar(value='1') + capeEntry = Entry(capeFrame, textvariable=self.customWindow.capeVar, width=3, validate='all', vcmd=vcmd) capeFrame.pack() capeLabel.pack(anchor=W, side=LEFT, padx=(0,21)) capeEntry.pack(anchor=E) mirrorFrame = Frame(itemList2) mirrorLabel = Label(mirrorFrame, text='Magic Mirror') - mirrorVar = StringVar(value='1') - mirrorEntry = Entry(mirrorFrame, textvariable=mirrorVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.mirrorVar = StringVar(value='1') + mirrorEntry = Entry(mirrorFrame, textvariable=self.customWindow.mirrorVar, width=3, validate='all', vcmd=vcmd) mirrorFrame.pack() mirrorLabel.pack(anchor=W, side=LEFT, padx=(0,15)) mirrorEntry.pack(anchor=E) bootsFrame = Frame(itemList2) bootsLabel = Label(bootsFrame, text='Pegasus Boots') - bootsVar = StringVar(value='1') - bootsEntry = Entry(bootsFrame, textvariable=bootsVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.bootsVar = StringVar(value='1') + bootsEntry = Entry(bootsFrame, textvariable=self.customWindow.bootsVar, width=3, validate='all', vcmd=vcmd) bootsFrame.pack() bootsLabel.pack(anchor=W, side=LEFT, padx=(0,8)) bootsEntry.pack(anchor=E) powergloveFrame = Frame(itemList2) powergloveLabel = Label(powergloveFrame, text='Power Glove') - powergloveVar = StringVar(value='0') - powergloveEntry = Entry(powergloveFrame, textvariable=powergloveVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.powergloveVar = StringVar(value='0') + powergloveEntry = Entry(powergloveFrame, textvariable=self.customWindow.powergloveVar, width=3, validate='all', vcmd=vcmd) powergloveFrame.pack() powergloveLabel.pack(anchor=W, side=LEFT, padx=(0,18)) powergloveEntry.pack(anchor=E) titansmittFrame = Frame(itemList2) titansmittLabel = Label(titansmittFrame, text='Titan\'s Mitt') - titansmittVar = StringVar(value='0') - titansmittEntry = Entry(titansmittFrame, textvariable=titansmittVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.titansmittVar = StringVar(value='0') + titansmittEntry = Entry(titansmittFrame, textvariable=self.customWindow.titansmittVar, width=3, validate='all', vcmd=vcmd) titansmittFrame.pack() titansmittLabel.pack(anchor=W, side=LEFT, padx=(0,24)) titansmittEntry.pack(anchor=E) proggloveFrame = Frame(itemList2) proggloveLabel = Label(proggloveFrame, text='Prog.Glove') - proggloveVar = StringVar(value='2') - proggloveEntry = Entry(proggloveFrame, textvariable=proggloveVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.proggloveVar = StringVar(value='2') + proggloveEntry = Entry(proggloveFrame, textvariable=self.customWindow.proggloveVar, width=3, validate='all', vcmd=vcmd) proggloveFrame.pack() proggloveLabel.pack(anchor=W, side=LEFT, padx=(0,26)) proggloveEntry.pack(anchor=E) flippersFrame = Frame(itemList2) flippersLabel = Label(flippersFrame, text='Flippers') - flippersVar = StringVar(value='1') - flippersEntry = Entry(flippersFrame, textvariable=flippersVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.flippersVar = StringVar(value='1') + flippersEntry = Entry(flippersFrame, textvariable=self.customWindow.flippersVar, width=3, validate='all', vcmd=vcmd) flippersFrame.pack() flippersLabel.pack(anchor=W, side=LEFT, padx=(0,43)) flippersEntry.pack(anchor=E) pearlFrame = Frame(itemList2) pearlLabel = Label(pearlFrame, text='Moon Pearl') - pearlVar = StringVar(value='1') - pearlEntry = Entry(pearlFrame, textvariable=pearlVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.pearlVar = StringVar(value='1') + pearlEntry = Entry(pearlFrame, textvariable=self.customWindow.pearlVar, width=3, validate='all', vcmd=vcmd) pearlFrame.pack() pearlLabel.pack(anchor=W, side=LEFT, padx=(0,23)) pearlEntry.pack(anchor=E) heartpieceFrame = Frame(itemList2) heartpieceLabel = Label(heartpieceFrame, text='Piece of Heart') - heartpieceVar = StringVar(value='24') - heartpieceEntry = Entry(heartpieceFrame, textvariable=heartpieceVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.heartpieceVar = StringVar(value='24') + heartpieceEntry = Entry(heartpieceFrame, textvariable=self.customWindow.heartpieceVar, width=3, validate='all', vcmd=vcmd) heartpieceFrame.pack() heartpieceLabel.pack(anchor=W, side=LEFT, padx=(0,10)) heartpieceEntry.pack(anchor=E) fullheartFrame = Frame(itemList2) fullheartLabel = Label(fullheartFrame, text='Heart Container') - fullheartVar = StringVar(value='10') - fullheartEntry = Entry(fullheartFrame, textvariable=fullheartVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.fullheartVar = StringVar(value='10') + fullheartEntry = Entry(fullheartFrame, textvariable=self.customWindow.fullheartVar, width=3, validate='all', vcmd=vcmd) fullheartFrame.pack() fullheartLabel.pack(anchor=W, side=LEFT) fullheartEntry.pack(anchor=E) sancheartFrame = Frame(itemList2) sancheartLabel = Label(sancheartFrame, text='Sanctuary Heart') - sancheartVar = StringVar(value='1') - sancheartEntry = Entry(sancheartFrame, textvariable=sancheartVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.sancheartVar = StringVar(value='1') + sancheartEntry = Entry(sancheartFrame, textvariable=self.customWindow.sancheartVar, width=3, validate='all', vcmd=vcmd) sancheartFrame.pack() sancheartLabel.pack(anchor=W, side=LEFT) sancheartEntry.pack(anchor=E) sword1Frame = Frame(itemList3) sword1Label = Label(sword1Frame, text='Sword 1') - sword1Var = StringVar(value='0') - sword1Entry = Entry(sword1Frame, textvariable=sword1Var, width=3, validate='all', vcmd=vcmd) + self.customWindow.sword1Var = StringVar(value='0') + sword1Entry = Entry(sword1Frame, textvariable=self.customWindow.sword1Var, width=3, validate='all', vcmd=vcmd) sword1Frame.pack() sword1Label.pack(anchor=W, side=LEFT, padx=(0,34)) sword1Entry.pack(anchor=E) sword2Frame = Frame(itemList3) sword2Label = Label(sword2Frame, text='Sword 2') - sword2Var = StringVar(value='0') - sword2Entry = Entry(sword2Frame, textvariable=sword2Var, width=3, validate='all', vcmd=vcmd) + self.customWindow.sword2Var = StringVar(value='0') + sword2Entry = Entry(sword2Frame, textvariable=self.customWindow.sword2Var, width=3, validate='all', vcmd=vcmd) sword2Frame.pack() sword2Label.pack(anchor=W, side=LEFT, padx=(0,34)) sword2Entry.pack(anchor=E) sword3Frame = Frame(itemList3) sword3Label = Label(sword3Frame, text='Sword 3') - sword3Var = StringVar(value='0') - sword3Entry = Entry(sword3Frame, textvariable=sword3Var, width=3, validate='all', vcmd=vcmd) + self.customWindow.sword3Var = StringVar(value='0') + sword3Entry = Entry(sword3Frame, textvariable=self.customWindow.sword3Var, width=3, validate='all', vcmd=vcmd) sword3Frame.pack() sword3Label.pack(anchor=W, side=LEFT, padx=(0,34)) sword3Entry.pack(anchor=E) sword4Frame = Frame(itemList3) sword4Label = Label(sword4Frame, text='Sword 4') - sword4Var = StringVar(value='0') - sword4Entry = Entry(sword4Frame, textvariable=sword4Var, width=3, validate='all', vcmd=vcmd) + self.customWindow.sword4Var = StringVar(value='0') + sword4Entry = Entry(sword4Frame, textvariable=self.customWindow.sword4Var, width=3, validate='all', vcmd=vcmd) sword4Frame.pack() sword4Label.pack(anchor=W, side=LEFT, padx=(0,34)) sword4Entry.pack(anchor=E) progswordFrame = Frame(itemList3) progswordLabel = Label(progswordFrame, text='Prog.Sword') - progswordVar = StringVar(value='4') - progswordEntry = Entry(progswordFrame, textvariable=progswordVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.progswordVar = StringVar(value='4') + progswordEntry = Entry(progswordFrame, textvariable=self.customWindow.progswordVar, width=3, validate='all', vcmd=vcmd) progswordFrame.pack() progswordLabel.pack(anchor=W, side=LEFT, padx=(0,15)) progswordEntry.pack(anchor=E) shield1Frame = Frame(itemList3) shield1Label = Label(shield1Frame, text='Shield 1') - shield1Var = StringVar(value='0') - shield1Entry = Entry(shield1Frame, textvariable=shield1Var, width=3, validate='all', vcmd=vcmd) + self.customWindow.shield1Var = StringVar(value='0') + shield1Entry = Entry(shield1Frame, textvariable=self.customWindow.shield1Var, width=3, validate='all', vcmd=vcmd) shield1Frame.pack() shield1Label.pack(anchor=W, side=LEFT, padx=(0,35)) shield1Entry.pack(anchor=E) shield2Frame = Frame(itemList3) shield2Label = Label(shield2Frame, text='Shield 2') - shield2Var = StringVar(value='0') - shield2Entry = Entry(shield2Frame, textvariable=shield2Var, width=3, validate='all', vcmd=vcmd) + self.customWindow.shield2Var = StringVar(value='0') + shield2Entry = Entry(shield2Frame, textvariable=self.customWindow.shield2Var, width=3, validate='all', vcmd=vcmd) shield2Frame.pack() shield2Label.pack(anchor=W, side=LEFT, padx=(0,35)) shield2Entry.pack(anchor=E) shield3Frame = Frame(itemList3) shield3Label = Label(shield3Frame, text='Shield 3') - shield3Var = StringVar(value='0') - shield3Entry = Entry(shield3Frame, textvariable=shield3Var, width=3, validate='all', vcmd=vcmd) + self.customWindow.shield3Var = StringVar(value='0') + shield3Entry = Entry(shield3Frame, textvariable=self.customWindow.shield3Var, width=3, validate='all', vcmd=vcmd) shield3Frame.pack() shield3Label.pack(anchor=W, side=LEFT, padx=(0,35)) shield3Entry.pack(anchor=E) progshieldFrame = Frame(itemList3) progshieldLabel = Label(progshieldFrame, text='Prog.Shield') - progshieldVar = StringVar(value='3') - progshieldEntry = Entry(progshieldFrame, textvariable=progshieldVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.progshieldVar = StringVar(value='3') + progshieldEntry = Entry(progshieldFrame, textvariable=self.customWindow.progshieldVar, width=3, validate='all', vcmd=vcmd) progshieldFrame.pack() progshieldLabel.pack(anchor=W, side=LEFT, padx=(0,16)) progshieldEntry.pack(anchor=E) bluemailFrame = Frame(itemList3) bluemailLabel = Label(bluemailFrame, text='Blue Mail') - bluemailVar = StringVar(value='0') - bluemailEntry = Entry(bluemailFrame, textvariable=bluemailVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.bluemailVar = StringVar(value='0') + bluemailEntry = Entry(bluemailFrame, textvariable=self.customWindow.bluemailVar, width=3, validate='all', vcmd=vcmd) bluemailFrame.pack() bluemailLabel.pack(anchor=W, side=LEFT, padx=(0,27)) bluemailEntry.pack(anchor=E) redmailFrame = Frame(itemList3) redmailLabel = Label(redmailFrame, text='Red Mail') - redmailVar = StringVar(value='0') - redmailEntry = Entry(redmailFrame, textvariable=redmailVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.redmailVar = StringVar(value='0') + redmailEntry = Entry(redmailFrame, textvariable=self.customWindow.redmailVar, width=3, validate='all', vcmd=vcmd) redmailFrame.pack() redmailLabel.pack(anchor=W, side=LEFT, padx=(0,30)) redmailEntry.pack(anchor=E) progmailFrame = Frame(itemList3) progmailLabel = Label(progmailFrame, text='Prog.Mail') - progmailVar = StringVar(value='2') - progmailEntry = Entry(progmailFrame, textvariable=progmailVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.progmailVar = StringVar(value='2') + progmailEntry = Entry(progmailFrame, textvariable=self.customWindow.progmailVar, width=3, validate='all', vcmd=vcmd) progmailFrame.pack() progmailLabel.pack(anchor=W, side=LEFT, padx=(0,25)) progmailEntry.pack(anchor=E) halfmagicFrame = Frame(itemList3) halfmagicLabel = Label(halfmagicFrame, text='Half Magic') - halfmagicVar = StringVar(value='1') - halfmagicEntry = Entry(halfmagicFrame, textvariable=halfmagicVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.halfmagicVar = StringVar(value='1') + halfmagicEntry = Entry(halfmagicFrame, textvariable=self.customWindow.halfmagicVar, width=3, validate='all', vcmd=vcmd) halfmagicFrame.pack() halfmagicLabel.pack(anchor=W, side=LEFT, padx=(0,18)) halfmagicEntry.pack(anchor=E) quartermagicFrame = Frame(itemList3) quartermagicLabel = Label(quartermagicFrame, text='Quarter Magic') - quartermagicVar = StringVar(value='0') - quartermagicEntry = Entry(quartermagicFrame, textvariable=quartermagicVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.quartermagicVar = StringVar(value='0') + quartermagicEntry = Entry(quartermagicFrame, textvariable=self.customWindow.quartermagicVar, width=3, validate='all', vcmd=vcmd) quartermagicFrame.pack() quartermagicLabel.pack(anchor=W, side=LEFT) quartermagicEntry.pack(anchor=E) bcap5Frame = Frame(itemList3) bcap5Label = Label(bcap5Frame, text='Bomb C.+5') - bcap5Var = StringVar(value='0') - bcap5Entry = Entry(bcap5Frame, textvariable=bcap5Var, width=3, validate='all', vcmd=vcmd) + self.customWindow.bcap5Var = StringVar(value='0') + bcap5Entry = Entry(bcap5Frame, textvariable=self.customWindow.bcap5Var, width=3, validate='all', vcmd=vcmd) bcap5Frame.pack() bcap5Label.pack(anchor=W, side=LEFT, padx=(0,16)) bcap5Entry.pack(anchor=E) bcap10Frame = Frame(itemList3) bcap10Label = Label(bcap10Frame, text='Bomb C.+10') - bcap10Var = StringVar(value='0') - bcap10Entry = Entry(bcap10Frame, textvariable=bcap10Var, width=3, validate='all', vcmd=vcmd) + self.customWindow.bcap10Var = StringVar(value='0') + bcap10Entry = Entry(bcap10Frame, textvariable=self.customWindow.bcap10Var, width=3, validate='all', vcmd=vcmd) bcap10Frame.pack() bcap10Label.pack(anchor=W, side=LEFT, padx=(0,10)) bcap10Entry.pack(anchor=E) acap5Frame = Frame(itemList4) acap5Label = Label(acap5Frame, text='Arrow C.+5') - acap5Var = StringVar(value='0') - acap5Entry = Entry(acap5Frame, textvariable=acap5Var, width=3, validate='all', vcmd=vcmd) + self.customWindow.acap5Var = StringVar(value='0') + acap5Entry = Entry(acap5Frame, textvariable=self.customWindow.acap5Var, width=3, validate='all', vcmd=vcmd) acap5Frame.pack() acap5Label.pack(anchor=W, side=LEFT, padx=(0,7)) acap5Entry.pack(anchor=E) acap10Frame = Frame(itemList4) acap10Label = Label(acap10Frame, text='Arrow C.+10') - acap10Var = StringVar(value='0') - acap10Entry = Entry(acap10Frame, textvariable=acap10Var, width=3, validate='all', vcmd=vcmd) + self.customWindow.acap10Var = StringVar(value='0') + acap10Entry = Entry(acap10Frame, textvariable=self.customWindow.acap10Var, width=3, validate='all', vcmd=vcmd) acap10Frame.pack() acap10Label.pack(anchor=W, side=LEFT, padx=(0,1)) acap10Entry.pack(anchor=E) arrow1Frame = Frame(itemList4) arrow1Label = Label(arrow1Frame, text='Arrow (1)') - arrow1Var = StringVar(value='1') - arrow1Entry = Entry(arrow1Frame, textvariable=arrow1Var, width=3, validate='all', vcmd=vcmd) + self.customWindow.arrow1Var = StringVar(value='1') + arrow1Entry = Entry(arrow1Frame, textvariable=self.customWindow.arrow1Var, width=3, validate='all', vcmd=vcmd) arrow1Frame.pack() arrow1Label.pack(anchor=W, side=LEFT, padx=(0,18)) arrow1Entry.pack(anchor=E) arrow10Frame = Frame(itemList4) arrow10Label = Label(arrow10Frame, text='Arrows (10)') - arrow10Var = StringVar(value='12') - arrow10Entry = Entry(arrow10Frame, textvariable=arrow10Var, width=3, validate='all', vcmd=vcmd) + self.customWindow.arrow10Var = StringVar(value='12') + arrow10Entry = Entry(arrow10Frame, textvariable=self.customWindow.arrow10Var, width=3, validate='all', vcmd=vcmd) arrow10Frame.pack() arrow10Label.pack(anchor=W, side=LEFT, padx=(0,7)) arrow10Entry.pack(anchor=E) bomb1Frame = Frame(itemList4) bomb1Label = Label(bomb1Frame, text='Bomb (1)') - bomb1Var = StringVar(value='0') - bomb1Entry = Entry(bomb1Frame, textvariable=bomb1Var, width=3, validate='all', vcmd=vcmd) + self.customWindow.bomb1Var = StringVar(value='0') + bomb1Entry = Entry(bomb1Frame, textvariable=self.customWindow.bomb1Var, width=3, validate='all', vcmd=vcmd) bomb1Frame.pack() bomb1Label.pack(anchor=W, side=LEFT, padx=(0,18)) bomb1Entry.pack(anchor=E) bomb3Frame = Frame(itemList4) bomb3Label = Label(bomb3Frame, text='Bombs (3)') - bomb3Var = StringVar(value='16') - bomb3Entry = Entry(bomb3Frame, textvariable=bomb3Var, width=3, validate='all', vcmd=vcmd) + self.customWindow.bomb3Var = StringVar(value='16') + bomb3Entry = Entry(bomb3Frame, textvariable=self.customWindow.bomb3Var, width=3, validate='all', vcmd=vcmd) bomb3Frame.pack() bomb3Label.pack(anchor=W, side=LEFT, padx=(0,13)) bomb3Entry.pack(anchor=E) bomb10Frame = Frame(itemList4) bomb10Label = Label(bomb10Frame, text='Bombs (10)') - bomb10Var = StringVar(value='1') - bomb10Entry = Entry(bomb10Frame, textvariable=bomb10Var, width=3, validate='all', vcmd=vcmd) + self.customWindow.bomb10Var = StringVar(value='1') + bomb10Entry = Entry(bomb10Frame, textvariable=self.customWindow.bomb10Var, width=3, validate='all', vcmd=vcmd) bomb10Frame.pack() bomb10Label.pack(anchor=W, side=LEFT, padx=(0,7)) bomb10Entry.pack(anchor=E) rupee1Frame = Frame(itemList4) rupee1Label = Label(rupee1Frame, text='Rupee (1)') - rupee1Var = StringVar(value='2') - rupee1Entry = Entry(rupee1Frame, textvariable=rupee1Var, width=3, validate='all', vcmd=vcmd) + self.customWindow.rupee1Var = StringVar(value='2') + rupee1Entry = Entry(rupee1Frame, textvariable=self.customWindow.rupee1Var, width=3, validate='all', vcmd=vcmd) rupee1Frame.pack() rupee1Label.pack(anchor=W, side=LEFT, padx=(0,17)) rupee1Entry.pack(anchor=E) rupee5Frame = Frame(itemList4) rupee5Label = Label(rupee5Frame, text='Rupees (5)') - rupee5Var = StringVar(value='4') - rupee5Entry = Entry(rupee5Frame, textvariable=rupee5Var, width=3, validate='all', vcmd=vcmd) + self.customWindow.rupee5Var = StringVar(value='4') + rupee5Entry = Entry(rupee5Frame, textvariable=self.customWindow.rupee5Var, width=3, validate='all', vcmd=vcmd) rupee5Frame.pack() rupee5Label.pack(anchor=W, side=LEFT, padx=(0,12)) rupee5Entry.pack(anchor=E) rupee20Frame = Frame(itemList4) rupee20Label = Label(rupee20Frame, text='Rupees (20)') - rupee20Var = StringVar(value='28') - rupee20Entry = Entry(rupee20Frame, textvariable=rupee20Var, width=3, validate='all', vcmd=vcmd) + self.customWindow.rupee20Var = StringVar(value='28') + rupee20Entry = Entry(rupee20Frame, textvariable=self.customWindow.rupee20Var, width=3, validate='all', vcmd=vcmd) rupee20Frame.pack() rupee20Label.pack(anchor=W, side=LEFT, padx=(0,6)) rupee20Entry.pack(anchor=E) rupee50Frame = Frame(itemList4) rupee50Label = Label(rupee50Frame, text='Rupees (50)') - rupee50Var = StringVar(value='7') - rupee50Entry = Entry(rupee50Frame, textvariable=rupee50Var, width=3, validate='all', vcmd=vcmd) + self.customWindow.rupee50Var = StringVar(value='7') + rupee50Entry = Entry(rupee50Frame, textvariable=self.customWindow.rupee50Var, width=3, validate='all', vcmd=vcmd) rupee50Frame.pack() rupee50Label.pack(anchor=W, side=LEFT, padx=(0,6)) rupee50Entry.pack(anchor=E) rupee100Frame = Frame(itemList4) rupee100Label = Label(rupee100Frame, text='Rupees (100)') - rupee100Var = StringVar(value='1') - rupee100Entry = Entry(rupee100Frame, textvariable=rupee100Var, width=3, validate='all', vcmd=vcmd) + self.customWindow.rupee100Var = StringVar(value='1') + rupee100Entry = Entry(rupee100Frame, textvariable=self.customWindow.rupee100Var, width=3, validate='all', vcmd=vcmd) rupee100Frame.pack() rupee100Label.pack(anchor=W, side=LEFT, padx=(0,0)) rupee100Entry.pack(anchor=E) rupee300Frame = Frame(itemList4) rupee300Label = Label(rupee300Frame, text='Rupees (300)') - rupee300Var = StringVar(value='5') - rupee300Entry = Entry(rupee300Frame, textvariable=rupee300Var, width=3, validate='all', vcmd=vcmd) + self.customWindow.rupee300Var = StringVar(value='5') + rupee300Entry = Entry(rupee300Frame, textvariable=self.customWindow.rupee300Var, width=3, validate='all', vcmd=vcmd) rupee300Frame.pack() rupee300Label.pack(anchor=W, side=LEFT, padx=(0,0)) rupee300Entry.pack(anchor=E) blueclockFrame = Frame(itemList4) blueclockLabel = Label(blueclockFrame, text='Blue Clock') - blueclockVar = StringVar(value='0') - blueclockEntry = Entry(blueclockFrame, textvariable=blueclockVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.blueclockVar = StringVar(value='0') + blueclockEntry = Entry(blueclockFrame, textvariable=self.customWindow.blueclockVar, width=3, validate='all', vcmd=vcmd) blueclockFrame.pack() blueclockLabel.pack(anchor=W, side=LEFT, padx=(0,11)) blueclockEntry.pack(anchor=E) greenclockFrame = Frame(itemList4) greenclockLabel = Label(greenclockFrame, text='Green Clock') - greenclockVar = StringVar(value='0') - greenclockEntry = Entry(greenclockFrame, textvariable=greenclockVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.greenclockVar = StringVar(value='0') + greenclockEntry = Entry(greenclockFrame, textvariable=self.customWindow.greenclockVar, width=3, validate='all', vcmd=vcmd) greenclockFrame.pack() greenclockLabel.pack(anchor=W, side=LEFT, padx=(0,3)) greenclockEntry.pack(anchor=E) redclockFrame = Frame(itemList4) redclockLabel = Label(redclockFrame, text='Red Clock') - redclockVar = StringVar(value='0') - redclockEntry = Entry(redclockFrame, textvariable=redclockVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.redclockVar = StringVar(value='0') + redclockEntry = Entry(redclockFrame, textvariable=self.customWindow.redclockVar, width=3, validate='all', vcmd=vcmd) redclockFrame.pack() redclockLabel.pack(anchor=W, side=LEFT, padx=(0,14)) redclockEntry.pack(anchor=E) silverarrowFrame = Frame(itemList5) silverarrowLabel = Label(silverarrowFrame, text='Silver Arrow') - silverarrowVar = StringVar(value='0') - silverarrowEntry = Entry(silverarrowFrame, textvariable=silverarrowVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.silverarrowVar = StringVar(value='0') + silverarrowEntry = Entry(silverarrowFrame, textvariable=self.customWindow.silverarrowVar, width=3, validate='all', vcmd=vcmd) silverarrowFrame.pack() silverarrowLabel.pack(anchor=W, side=LEFT, padx=(0,64)) silverarrowEntry.pack(anchor=E) universalkeyFrame = Frame(itemList5) universalkeyLabel = Label(universalkeyFrame, text='Universal Key') - universalkeyVar = StringVar(value='0') - universalkeyEntry = Entry(universalkeyFrame, textvariable=universalkeyVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.universalkeyVar = StringVar(value='0') + universalkeyEntry = Entry(universalkeyFrame, textvariable=self.customWindow.universalkeyVar, width=3, validate='all', vcmd=vcmd) universalkeyFrame.pack() universalkeyLabel.pack(anchor=W, side=LEFT, padx=(0,57)) universalkeyEntry.pack(anchor=E) triforcepieceFrame = Frame(itemList5) triforcepieceLabel = Label(triforcepieceFrame, text='Triforce Piece') - triforcepieceVar = StringVar(value='0') - triforcepieceEntry = Entry(triforcepieceFrame, textvariable=triforcepieceVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.triforcepieceVar = StringVar(value='0') + triforcepieceEntry = Entry(triforcepieceFrame, textvariable=self.customWindow.triforcepieceVar, width=3, validate='all', vcmd=vcmd) triforcepieceFrame.pack() triforcepieceLabel.pack(anchor=W, side=LEFT, padx=(0,55)) triforcepieceEntry.pack(anchor=E) triforcecountFrame = Frame(itemList5) triforcecountLabel = Label(triforcecountFrame, text='Triforce Pieces Required') - triforcecountVar = StringVar(value='0') - triforcecountEntry = Entry(triforcecountFrame, textvariable=triforcecountVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.triforcecountVar = StringVar(value='0') + triforcecountEntry = Entry(triforcecountFrame, textvariable=self.customWindow.triforcecountVar, width=3, validate='all', vcmd=vcmd) triforcecountFrame.pack() triforcecountLabel.pack(anchor=W, side=LEFT, padx=(0,0)) triforcecountEntry.pack(anchor=E) triforceFrame = Frame(itemList5) triforceLabel = Label(triforceFrame, text='Triforce (win game)') - triforceVar = StringVar(value='0') - triforceEntry = Entry(triforceFrame, textvariable=triforceVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.triforceVar = StringVar(value='0') + triforceEntry = Entry(triforceFrame, textvariable=self.customWindow.triforceVar, width=3, validate='all', vcmd=vcmd) triforceFrame.pack() triforceLabel.pack(anchor=W, side=LEFT, padx=(0,23)) triforceEntry.pack(anchor=E) rupoorFrame = Frame(itemList5) rupoorLabel = Label(rupoorFrame, text='Rupoor') - rupoorVar = StringVar(value='0') - rupoorEntry = Entry(rupoorFrame, textvariable=rupoorVar, width=3, validate='all', vcmd=vcmd) + self.customWindow.rupoorVar = StringVar(value='0') + rupoorEntry = Entry(rupoorFrame, textvariable=self.customWindow.rupoorVar, width=3, validate='all', vcmd=vcmd) rupoorFrame.pack() rupoorLabel.pack(anchor=W, side=LEFT, padx=(0,87)) rupoorEntry.pack(anchor=E) rupoorcostFrame = Frame(itemList5) rupoorcostLabel = Label(rupoorcostFrame, text='Rupoor Cost') - rupoorcostVar = StringVar(value='10') - rupoorcostEntry = Entry(rupoorcostFrame, textvariable=rupoorcostVar, width=6, validate='all', vcmd=vcmd) + self.customWindow.rupoorcostVar = StringVar(value='10') + rupoorcostEntry = Entry(rupoorcostFrame, textvariable=self.customWindow.rupoorcostVar, width=6, validate='all', vcmd=vcmd) rupoorcostFrame.pack() rupoorcostLabel.pack(anchor=W, side=LEFT, padx=(0,43)) rupoorcostEntry.pack(anchor=E) @@ -916,363 +804,54 @@ def guiMain(args=None): if type(v) is dict: setattr(args, k, v[1]) # only get values for player 1 for now # load values from commandline args - generationSetupWindow.createSpoilerVar.set(int(args.create_spoiler)) - generationSetupWindow.suppressRomVar.set(int(args.suppress_rom)) - dungeonRandoWindow.mapshuffleVar.set(args.mapshuffle) - dungeonRandoWindow.compassshuffleVar.set(args.compassshuffle) - dungeonRandoWindow.keyshuffleVar.set(args.keyshuffle) - dungeonRandoWindow.bigkeyshuffleVar.set(args.bigkeyshuffle) - itemWindow.retroVar.set(args.retro) - entrandoWindow.openpyramidVar.set(args.openpyramid) - gameOptionsWindow.quickSwapVar.set(int(args.quickswap)) - gameOptionsWindow.disableMusicVar.set(int(args.disablemusic)) + self.generationSetupWindow.createSpoilerVar.set(int(args.create_spoiler)) + self.generationSetupWindow.suppressRomVar.set(int(args.suppress_rom)) + self.dungeonRandoWindow.mapshuffleVar.set(args.mapshuffle) + self.dungeonRandoWindow.compassshuffleVar.set(args.compassshuffle) + self.dungeonRandoWindow.keyshuffleVar.set(args.keyshuffle) + self.dungeonRandoWindow.bigkeyshuffleVar.set(args.bigkeyshuffle) + self.itemWindow.retroVar.set(args.retro) + self.entrandoWindow.openpyramidVar.set(args.openpyramid) + self.gameOptionsWindow.quickSwapVar.set(int(args.quickswap)) + self.gameOptionsWindow.disableMusicVar.set(int(args.disablemusic)) if args.multi: - multiworldWindow.worldVar.set(str(args.multi)) + self.multiworldWindow.worldVar.set(str(args.multi)) if args.count: - countVar.set(str(args.count)) + self.farBottomFrame.countVar.set(str(args.count)) if args.seed: - seedVar.set(str(args.seed)) - itemWindow.modeVar.set(args.mode) - itemWindow.swordVar.set(args.swords) - itemWindow.difficultyVar.set(args.difficulty) - itemWindow.itemfunctionVar.set(args.item_functionality) - itemWindow.timerVar.set(args.timer) - itemWindow.progressiveVar.set(args.progressive) - itemWindow.accessibilityVar.set(args.accessibility) - itemWindow.goalVar.set(args.goal) - itemWindow.crystalsGTVar.set(args.crystals_gt) - itemWindow.crystalsGanonVar.set(args.crystals_ganon) - itemWindow.algorithmVar.set(args.algorithm) - entrandoWindow.shuffleVar.set(args.shuffle) - dungeonRandoWindow.doorShuffleVar.set(args.door_shuffle) - gameOptionsWindow.heartcolorVar.set(args.heartcolor) - gameOptionsWindow.heartbeepVar.set(args.heartbeep) - gameOptionsWindow.fastMenuVar.set(args.fastmenu) - itemWindow.logicVar.set(args.logic) - generationSetupWindow.romVar.set(args.rom) - entrandoWindow.shuffleGanonVar.set(args.shuffleganon) - gameOptionsWindow.hintsVar.set(args.hints) - enemizerWindow.enemizerCLIpathVar.set(args.enemizercli) - enemizerWindow.potShuffleVar.set(args.shufflepots) - enemizerWindow.enemyShuffleVar.set(args.shuffleenemies) - enemizerWindow.enemizerBossVar.set(args.shufflebosses) - enemizerWindow.enemizerDamageVar.set(args.enemy_damage) - enemizerWindow.enemizerHealthVar.set(args.enemy_health) - gameOptionsWindow.owPalettesVar.set(args.ow_palettes) - gameOptionsWindow.uwPalettesVar.set(args.uw_palettes) + self.farBottomFrame.seedVar.set(str(args.seed)) + self.itemWindow.modeVar.set(args.mode) + self.itemWindow.swordVar.set(args.swords) + self.itemWindow.difficultyVar.set(args.difficulty) + self.itemWindow.itemfunctionVar.set(args.item_functionality) + self.itemWindow.timerVar.set(args.timer) + self.itemWindow.progressiveVar.set(args.progressive) + self.itemWindow.accessibilityVar.set(args.accessibility) + self.itemWindow.goalVar.set(args.goal) + self.itemWindow.crystalsGTVar.set(args.crystals_gt) + self.itemWindow.crystalsGanonVar.set(args.crystals_ganon) + self.itemWindow.algorithmVar.set(args.algorithm) + self.entrandoWindow.shuffleVar.set(args.shuffle) + self.dungeonRandoWindow.doorShuffleVar.set(args.door_shuffle) + self.gameOptionsWindow.heartcolorVar.set(args.heartcolor) + self.gameOptionsWindow.heartbeepVar.set(args.heartbeep) + self.gameOptionsWindow.fastMenuVar.set(args.fastmenu) + self.itemWindow.logicVar.set(args.logic) + self.generationSetupWindow.romVar.set(args.rom) + self.entrandoWindow.shuffleGanonVar.set(args.shuffleganon) + self.gameOptionsWindow.hintsVar.set(args.hints) + self.enemizerWindow.enemizerCLIpathVar.set(args.enemizercli) + self.enemizerWindow.potShuffleVar.set(args.shufflepots) + self.enemizerWindow.enemyShuffleVar.set(args.shuffleenemies) + self.enemizerWindow.enemizerBossVar.set(args.shufflebosses) + self.enemizerWindow.enemizerDamageVar.set(args.enemy_damage) + self.enemizerWindow.enemizerHealthVar.set(args.enemy_health) + self.gameOptionsWindow.owPalettesVar.set(args.ow_palettes) + self.gameOptionsWindow.uwPalettesVar.set(args.uw_palettes) # if args.sprite is not None: -# gameOptionsWindow.set_sprite(Sprite(args.sprite)) +# self.gameOptionsWindow.set_sprite(Sprite(args.sprite)) mainWindow.mainloop() -class SpriteSelector(object): - def __init__(self, parent, callback, adjuster=False): - if is_bundled(): - self.deploy_icons() - self.parent = parent - self.window = Toplevel(parent) - self.callback = callback - self.adjuster = adjuster - - self.window.wm_title("TAKE ANY ONE YOU WANT") - self.window['padx'] = 5 - self.window['pady'] = 5 - self.all_sprites = [] - - def open_unofficial_sprite_dir(_evt): - open_file(self.unofficial_sprite_dir) - - official_frametitle = Label(self.window, text='Official Sprites') - - unofficial_frametitle = Frame(self.window) - title_text = Label(unofficial_frametitle, text="Unofficial Sprites") - title_link = Label(unofficial_frametitle, text="(open)", fg="blue", cursor="hand2") - title_text.pack(side=LEFT) - title_link.pack(side=LEFT) - title_link.bind("", open_unofficial_sprite_dir) - - self.icon_section(official_frametitle, self.official_sprite_dir+'/*', 'Official sprites not found. Click "Update official sprites" to download them.') - self.icon_section(unofficial_frametitle, self.unofficial_sprite_dir+'/*', 'Put sprites in the unofficial sprites folder (see open link above) to have them appear here.') - - frame = Frame(self.window) - frame.pack(side=BOTTOM, fill=X, pady=5) - - button = Button(frame, text="Browse for file...", command=self.browse_for_sprite) - button.pack(side=RIGHT, padx=(5, 0)) - - button = Button(frame, text="Update official sprites", command=self.update_official_sprites) - button.pack(side=RIGHT, padx=(5, 0)) - - button = Button(frame, text="Default Link sprite", command=self.use_default_link_sprite) - button.pack(side=LEFT, padx=(0, 5)) - - button = Button(frame, text="Random sprite", command=self.use_random_sprite) - button.pack(side=LEFT, padx=(0, 5)) - - if adjuster: - button = Button(frame, text="Current sprite from rom", command=self.use_default_sprite) - button.pack(side=LEFT, padx=(0, 5)) - - set_icon(self.window) - self.window.focus() - - def icon_section(self, frame_label, path, no_results_label): - frame = LabelFrame(self.window, labelwidget=frame_label, padx=5, pady=5) - frame.pack(side=TOP, fill=X) - - sprites = [] - - for file in glob(output_path(path)): - sprites.append(Sprite(file)) - - sprites.sort(key=lambda s: str.lower(s.name or "").strip()) - - i = 0 - for sprite in sprites: - image = get_image_for_sprite(sprite) - if image is None: - continue - self.all_sprites.append(sprite) - button = Button(frame, image=image, command=lambda spr=sprite: self.select_sprite(spr)) - ToolTips.register(button, sprite.name + ("\nBy: %s" % sprite.author_name if sprite.author_name else "")) - button.image = image - button.grid(row=i // 16, column=i % 16) - i += 1 - - if i == 0: - label = Label(frame, text=no_results_label) - label.pack() - - - def update_official_sprites(self): - # need to wrap in try catch. We don't want errors getting the json or downloading the files to break us. - self.window.destroy() - self.parent.update() - def work(task): - resultmessage = "" - successful = True - - def finished(): - task.close_window() - if successful: - messagebox.showinfo("Sprite Updater", resultmessage) - else: - messagebox.showerror("Sprite Updater", resultmessage) - SpriteSelector(self.parent, self.callback, self.adjuster) - - try: - task.update_status("Downloading official sprites list") - with urlopen('https://alttpr.com/sprites') as response: - sprites_arr = json.loads(response.read().decode("utf-8")) - except Exception as e: - resultmessage = "Error getting list of official sprites. Sprites not updated.\n\n%s: %s" % (type(e).__name__, e) - successful = False - task.queue_event(finished) - return - - try: - task.update_status("Determining needed sprites") - current_sprites = [os.path.basename(file) for file in glob(self.official_sprite_dir+'/*')] - official_sprites = [(sprite['file'], os.path.basename(urlparse(sprite['file']).path)) for sprite in sprites_arr] - needed_sprites = [(sprite_url, filename) for (sprite_url, filename) in official_sprites if filename not in current_sprites] - bundled_sprites = [os.path.basename(file) for file in glob(self.local_official_sprite_dir+'/*')] - # todo: eventually use the above list to avoid downloading any sprites that we already have cached in the bundle. - - official_filenames = [filename for (_, filename) in official_sprites] - obsolete_sprites = [sprite for sprite in current_sprites if sprite not in official_filenames] - except Exception as e: - resultmessage = "Error Determining which sprites to update. Sprites not updated.\n\n%s: %s" % (type(e).__name__, e) - successful = False - task.queue_event(finished) - return - - updated = 0 - for (sprite_url, filename) in needed_sprites: - try: - task.update_status("Downloading needed sprite %g/%g" % (updated + 1, len(needed_sprites))) - target = os.path.join(self.official_sprite_dir, filename) - with urlopen(sprite_url) as response, open(target, 'wb') as out: - shutil.copyfileobj(response, out) - except Exception as e: - resultmessage = "Error downloading sprite. Not all sprites updated.\n\n%s: %s" % (type(e).__name__, e) - successful = False - updated += 1 - - deleted = 0 - for sprite in obsolete_sprites: - try: - task.update_status("Removing obsolete sprite %g/%g" % (deleted + 1, len(obsolete_sprites))) - os.remove(os.path.join(self.official_sprite_dir, sprite)) - except Exception as e: - resultmessage = "Error removing obsolete sprite. Not all sprites updated.\n\n%s: %s" % (type(e).__name__, e) - successful = False - deleted += 1 - - if successful: - resultmessage = "official sprites updated successfully" - - task.queue_event(finished) - - BackgroundTaskProgress(self.parent, work, "Updating Sprites") - - - def browse_for_sprite(self): - sprite = filedialog.askopenfilename( - filetypes=[("All Sprite Sources", (".zspr", ".spr", ".sfc", ".smc")), - ("ZSprite files", ".zspr"), - ("Sprite files", ".spr"), - ("Rom Files", (".sfc", ".smc")), - ("All Files", "*")]) - try: - self.callback(Sprite(sprite)) - except Exception: - self.callback(None) - self.window.destroy() - - - def use_default_sprite(self): - self.callback(None) - self.window.destroy() - - def use_default_link_sprite(self): - self.callback(Sprite.default_link_sprite()) - self.window.destroy() - - def use_random_sprite(self): - self.callback(random.choice(self.all_sprites) if self.all_sprites else None) - self.window.destroy() - - def select_sprite(self, spritename): - self.callback(spritename) - self.window.destroy() - - - def deploy_icons(self): - if not os.path.exists(self.unofficial_sprite_dir): - os.makedirs(self.unofficial_sprite_dir) - if not os.path.exists(self.official_sprite_dir): - shutil.copytree(self.local_official_sprite_dir, self.official_sprite_dir) - - @property - def official_sprite_dir(self): - if is_bundled(): - return output_path("sprites/official") - return self.local_official_sprite_dir - - @property - def local_official_sprite_dir(self): - return local_path("data/sprites/official") - - @property - def unofficial_sprite_dir(self): - if is_bundled(): - return output_path("sprites/unofficial") - return self.local_unofficial_sprite_dir - - @property - def local_unofficial_sprite_dir(self): - return local_path("data/sprites/unofficial") - - -def get_image_for_sprite(sprite): - if not sprite.valid: - return None - height = 24 - width = 16 - - def draw_sprite_into_gif(add_palette_color, set_pixel_color_index): - - def drawsprite(spr, pal_as_colors, offset): - for y, row in enumerate(spr): - for x, pal_index in enumerate(row): - if pal_index: - color = pal_as_colors[pal_index - 1] - set_pixel_color_index(x + offset[0], y + offset[1], color) - - add_palette_color(16, (40, 40, 40)) - shadow = [ - [0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0], - [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0], - [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], - [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], - [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0], - [0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0], - ] - - drawsprite(shadow, [16], (2, 17)) - - palettes = sprite.decode_palette() - for i in range(15): - add_palette_color(i + 1, palettes[0][i]) - - body = sprite.decode16(0x4C0) - drawsprite(body, list(range(1, 16)), (0, 8)) - head = sprite.decode16(0x40) - drawsprite(head, list(range(1, 16)), (0, 0)) - - def make_gif(callback): - gif_header = b'GIF89a' - - gif_lsd = bytearray(7) - gif_lsd[0] = width - gif_lsd[2] = height - gif_lsd[4] = 0xF4 # 32 color palette follows. transparant + 15 for sprite + 1 for shadow=17 which rounds up to 32 as nearest power of 2 - gif_lsd[5] = 0 # background color is zero - gif_lsd[6] = 0 # aspect raio not specified - gif_gct = bytearray(3 * 32) - - gif_gce = bytearray(8) - gif_gce[0] = 0x21 # start of extention blocked - gif_gce[1] = 0xF9 # identifies this as the Graphics Control extension - gif_gce[2] = 4 # we are suppling only the 4 four bytes - gif_gce[3] = 0x01 # this gif includes transparency - gif_gce[4] = gif_gce[5] = 0 # animation frrame delay (unused) - gif_gce[6] = 0 # transparent color is index 0 - gif_gce[7] = 0 # end of gif_gce - gif_id = bytearray(10) - gif_id[0] = 0x2c - # byte 1,2 are image left. 3,4 are image top both are left as zerosuitsamus - gif_id[5] = width - gif_id[7] = height - gif_id[9] = 0 # no local color table - - gif_img_minimum_code_size = bytes([7]) # we choose 7 bits, so that each pixel is represented by a byte, for conviennce. - - clear = 0x80 - stop = 0x81 - - unchunked_image_data = bytearray(height * (width + 1) + 1) - # we technically need a Clear code once every 125 bytes, but we do it at the start of every row for simplicity - for row in range(height): - unchunked_image_data[row * (width + 1)] = clear - unchunked_image_data[-1] = stop - - def add_palette_color(index, color): - gif_gct[3 * index] = color[0] - gif_gct[3 * index + 1] = color[1] - gif_gct[3 * index + 2] = color[2] - - def set_pixel_color_index(x, y, color): - unchunked_image_data[y * (width + 1) + x + 1] = color - - callback(add_palette_color, set_pixel_color_index) - - def chunk_image(img): - for i in range(0, len(img), 255): - chunk = img[i:i + 255] - yield bytes([len(chunk)]) - yield chunk - - gif_img = b''.join([gif_img_minimum_code_size] + list(chunk_image(unchunked_image_data)) + [b'\x00']) - - gif = b''.join([gif_header, gif_lsd, gif_gct, gif_gce, gif_id, gif_img, b'\x3b']) - - return gif - - gif_data = make_gif(draw_sprite_into_gif) - image = PhotoImage(data=gif_data) - - return image.zoom(2) - if __name__ == '__main__': guiMain() diff --git a/gui/bottom.py b/gui/bottom.py new file mode 100644 index 00000000..25e38979 --- /dev/null +++ b/gui/bottom.py @@ -0,0 +1,133 @@ +from tkinter import ttk, messagebox, StringVar, Button, Entry, Frame, Label, Spinbox, E, W, LEFT, RIGHT, X +from argparse import Namespace +import logging +import os +import random +from CLI import parse_arguments, get_working_dirs +from Main import main +from Utils import local_path, output_path, open_file + +def bottom_frame(self,parent,args=None): +# working_dirs = get_working_dirs() + + self = ttk.Frame(parent) + seedCountFrame = Frame(self) + seedCountFrame.pack() + ## Seed # + seedLabel = Label(self, text='Seed #') +# self.seedVar = StringVar(value=parent.working_dirs["gen.seed"]) + self.seedVar = StringVar() + def saveSeed(caller,_,mode): + pass +# parent.working_dirs["gen.seed"] = self.seedVar.get() + self.seedVar.trace_add("write",saveSeed) + seedEntry = Entry(self, width=15, textvariable=self.seedVar) + seedLabel.pack(side=LEFT) + seedEntry.pack(side=LEFT) + ## Number of Generation attempts + countLabel = Label(self, text='Count') +# self.countVar = StringVar(value=working_dirs["gen.count"]) + self.countVar = StringVar() + countSpinbox = Spinbox(self, from_=1, to=100, width=5, textvariable=self.countVar) + countLabel.pack(side=LEFT) + countSpinbox.pack(side=LEFT) + + def generateRom(): + guiargs = Namespace() + guiargs.multi = int(parent.multiworldWindow.worldVar.get()) + guiargs.names = parent.multiworldWindow.namesVar.get() + guiargs.seed = int(parent.farBottomFrame.seedVar.get()) if parent.farBottomFrame.seedVar.get() else None + guiargs.count = int(parent.farBottomFrame.countVar.get()) if parent.farBottomFrame.countVar.get() != '1' else None + guiargs.mode = parent.itemWindow.modeVar.get() + guiargs.logic = parent.itemWindow.logicVar.get() + + guiargs.goal = parent.itemWindow.goalVar.get() + guiargs.crystals_gt = parent.itemWindow.crystalsGTVar.get() + guiargs.crystals_ganon = parent.itemWindow.crystalsGanonVar.get() + guiargs.swords = parent.itemWindow.swordVar.get() + guiargs.difficulty = parent.itemWindow.difficultyVar.get() + guiargs.item_functionality = parent.itemWindow.itemfunctionVar.get() + guiargs.timer = parent.itemWindow.timerVar.get() + guiargs.progressive = parent.itemWindow.progressiveVar.get() + guiargs.accessibility = parent.itemWindow.accessibilityVar.get() + guiargs.algorithm = parent.itemWindow.algorithmVar.get() + guiargs.shuffle = parent.entrandoWindow.shuffleVar.get() + guiargs.door_shuffle = parent.dungeonRandoWindow.doorShuffleVar.get() + guiargs.heartbeep = parent.gameOptionsWindow.heartbeepVar.get() + guiargs.heartcolor = parent.gameOptionsWindow.heartcolorVar.get() + guiargs.fastmenu = parent.gameOptionsWindow.fastMenuVar.get() + guiargs.create_spoiler = bool(parent.generationSetupWindow.createSpoilerVar.get()) + guiargs.skip_playthrough = not bool(parent.generationSetupWindow.createSpoilerVar.get()) + guiargs.suppress_rom = bool(parent.generationSetupWindow.suppressRomVar.get()) + guiargs.openpyramid = bool(parent.entrandoWindow.openpyramidVar.get()) + guiargs.mapshuffle = bool(parent.dungeonRandoWindow.mapshuffleVar.get()) + guiargs.compassshuffle = bool(parent.dungeonRandoWindow.compassshuffleVar.get()) + guiargs.keyshuffle = bool(parent.dungeonRandoWindow.keyshuffleVar.get()) + guiargs.bigkeyshuffle = bool(parent.dungeonRandoWindow.bigkeyshuffleVar.get()) + guiargs.retro = bool(parent.itemWindow.retroVar.get()) + guiargs.quickswap = bool(parent.gameOptionsWindow.quickSwapVar.get()) + guiargs.disablemusic = bool(parent.gameOptionsWindow.disableMusicVar.get()) + guiargs.ow_palettes = parent.gameOptionsWindow.owPalettesVar.get() + guiargs.uw_palettes = parent.gameOptionsWindow.uwPalettesVar.get() + guiargs.shuffleganon = bool(parent.entrandoWindow.shuffleGanonVar.get()) + guiargs.hints = bool(parent.gameOptionsWindow.hintsVar.get()) + guiargs.enemizercli = parent.enemizerWindow.enemizerCLIpathVar.get() + guiargs.shufflebosses = parent.enemizerWindow.enemizerBossVar.get() + guiargs.shuffleenemies = parent.enemizerWindow.enemyShuffleVar.get() + guiargs.enemy_health = parent.enemizerWindow.enemizerHealthVar.get() + guiargs.enemy_damage = parent.enemizerWindow.enemizerDamageVar.get() + guiargs.shufflepots = bool(parent.enemizerWindow.potShuffleVar.get()) + guiargs.custom = bool(parent.generationSetupWindow.customVar.get()) + guiargs.customitemarray = [int(parent.customWindow.bowVar.get()), int(parent.customWindow.silverarrowVar.get()), int(parent.customWindow.boomerangVar.get()), int(parent.customWindow.magicboomerangVar.get()), int(parent.customWindow.hookshotVar.get()), int(parent.customWindow.mushroomVar.get()), int(parent.customWindow.magicpowderVar.get()), int(parent.customWindow.firerodVar.get()), + int(parent.customWindow.icerodVar.get()), int(parent.customWindow.bombosVar.get()), int(parent.customWindow.etherVar.get()), int(parent.customWindow.quakeVar.get()), int(parent.customWindow.lampVar.get()), int(parent.customWindow.hammerVar.get()), int(parent.customWindow.shovelVar.get()), int(parent.customWindow.fluteVar.get()), int(parent.customWindow.bugnetVar.get()), + int(parent.customWindow.bookVar.get()), int(parent.customWindow.bottleVar.get()), int(parent.customWindow.somariaVar.get()), int(parent.customWindow.byrnaVar.get()), int(parent.customWindow.capeVar.get()), int(parent.customWindow.mirrorVar.get()), int(parent.customWindow.bootsVar.get()), int(parent.customWindow.powergloveVar.get()), int(parent.customWindow.titansmittVar.get()), + int(parent.customWindow.proggloveVar.get()), int(parent.customWindow.flippersVar.get()), int(parent.customWindow.pearlVar.get()), int(parent.customWindow.heartpieceVar.get()), int(parent.customWindow.fullheartVar.get()), int(parent.customWindow.sancheartVar.get()), int(parent.customWindow.sword1Var.get()), int(parent.customWindow.sword2Var.get()), + int(parent.customWindow.sword3Var.get()), int(parent.customWindow.sword4Var.get()), int(parent.customWindow.progswordVar.get()), int(parent.customWindow.shield1Var.get()), int(parent.customWindow.shield2Var.get()), int(parent.customWindow.shield3Var.get()), int(parent.customWindow.progshieldVar.get()), int(parent.customWindow.bluemailVar.get()), + int(parent.customWindow.redmailVar.get()), int(parent.customWindow.progmailVar.get()), int(parent.customWindow.halfmagicVar.get()), int(parent.customWindow.quartermagicVar.get()), int(parent.customWindow.bcap5Var.get()), int(parent.customWindow.bcap10Var.get()), int(parent.customWindow.acap5Var.get()), int(parent.customWindow.acap10Var.get()), + int(parent.customWindow.arrow1Var.get()), int(parent.customWindow.arrow10Var.get()), int(parent.customWindow.bomb1Var.get()), int(parent.customWindow.bomb3Var.get()), int(parent.customWindow.rupee1Var.get()), int(parent.customWindow.rupee5Var.get()), int(parent.customWindow.rupee20Var.get()), int(parent.customWindow.rupee50Var.get()), int(parent.customWindow.rupee100Var.get()), + int(parent.customWindow.rupee300Var.get()), int(parent.customWindow.rupoorVar.get()), int(parent.customWindow.blueclockVar.get()), int(parent.customWindow.greenclockVar.get()), int(parent.customWindow.redclockVar.get()), int(parent.customWindow.progbowVar.get()), int(parent.customWindow.bomb10Var.get()), int(parent.customWindow.triforcepieceVar.get()), + int(parent.customWindow.triforcecountVar.get()), int(parent.customWindow.triforceVar.get()), int(parent.customWindow.rupoorcostVar.get()), int(parent.customWindow.universalkeyVar.get())] + guiargs.rom = parent.generationSetupWindow.romVar.get() +# guiargs.sprite = parent.gameOptionsWindow.sprite + guiargs.outputpath = args.outputpath if args else None + # get default values for missing parameters + for k,v in vars(parse_arguments(['--multi', str(guiargs.multi)])).items(): + if k not in vars(guiargs): + setattr(guiargs, k, v) + elif type(v) is dict: # use same settings for every player + setattr(guiargs, k, {player: getattr(guiargs, k) for player in range(1, guiargs.multi + 1)}) + try: + if guiargs.count is not None: + seed = guiargs.seed + for _ in range(guiargs.count): + main(seed=seed, args=guiargs) + seed = random.randint(0, 999999999) + else: + main(seed=guiargs.seed, args=guiargs) + except Exception as e: + logging.exception(e) + messagebox.showerror(title="Error while creating seed", message=str(e)) + else: + messagebox.showinfo(title="Success", message="Rom patched successfully") + + ## Generate Button + generateButton = Button(self, text='Generate Patched Rom', command=generateRom) + generateButton.pack(side=LEFT) + + def open_output(): + if args and args.outputpath: + open_file(output_path(args.outputpath)) + else: + open_file(output_path(".")) +# open_file(output_path(working_dirs["outputpath"])) + + openOutputButton = Button(self, text='Open Output Directory', command=open_output) + openOutputButton.pack(side=RIGHT) + + if os.path.exists(local_path('README.html')): + def open_readme(): + open_file(local_path('README.html')) + openReadmeButton = Button(self, text='Open Documentation', command=open_readme) + openReadmeButton.pack() + + return self From b80ae5a17160c1abafcb69762c1ce1a17d52edbc Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 8 Feb 2020 16:16:15 -0800 Subject: [PATCH 011/117] Sort Adjust Frame Make it look like Game Options frame for consistency --- Gui.py | 118 ++-------------------------------- gui/adjust/overview.py | 143 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 147 insertions(+), 114 deletions(-) create mode 100644 gui/adjust/overview.py diff --git a/Gui.py b/Gui.py index 7a616284..fc1bc2e2 100755 --- a/Gui.py +++ b/Gui.py @@ -12,6 +12,7 @@ from urllib.request import urlopen from AdjusterMain import adjust from DungeonRandomizer import parse_arguments +from gui.adjust.overview import adjust_page from gui.randomize.item import item_page from gui.randomize.entrando import entrando_page from gui.randomize.enemizer import enemizer_page @@ -92,120 +93,9 @@ def guiMain(args=None): self.farBottomFrame.pack(side=BOTTOM, fill=X, padx=5, pady=5) # Adjuster Controls - - topFrame2 = Frame(self.adjustWindow) - rightHalfFrame2 = Frame(topFrame2) - checkBoxFrame2 = Frame(rightHalfFrame2) - - quickSwapCheckbutton2 = Checkbutton(checkBoxFrame2, text="Enabled L/R Item quickswapping", variable=self.gameOptionsWindow.quickSwapVar) - disableMusicCheckbutton2 = Checkbutton(checkBoxFrame2, text="Disable game music", variable=self.gameOptionsWindow.disableMusicVar) - - quickSwapCheckbutton2.pack(expand=True, anchor=W) - disableMusicCheckbutton2.pack(expand=True, anchor=W) - - fileDialogFrame2 = Frame(rightHalfFrame2) - - romDialogFrame2 = Frame(fileDialogFrame2) - baseRomLabel2 = Label(romDialogFrame2, text='Rom to adjust') - romVar2 = StringVar() - romEntry2 = Entry(romDialogFrame2, textvariable=romVar2) - - def RomSelect2(): - rom = filedialog.askopenfilename(filetypes=[("Rom Files", (".sfc", ".smc")), ("All Files", "*")]) - romVar2.set(rom) - romSelectButton2 = Button(romDialogFrame2, text='Select Rom', command=RomSelect2) - - baseRomLabel2.pack(side=LEFT) - romEntry2.pack(side=LEFT) - romSelectButton2.pack(side=LEFT) - - spriteDialogFrame2 = Frame(fileDialogFrame2) - baseSpriteLabel2 = Label(spriteDialogFrame2, text='Link Sprite') - spriteEntry2 = Label(spriteDialogFrame2, textvariable=self.gameOptionsWindow.spriteNameVar) - - def SpriteSelectAdjuster(): - pass -# SpriteSelector(mainWindow, gameOptionsWindow.set_sprite, adjuster=True) - - spriteSelectButton2 = Button(spriteDialogFrame2, text='Select Sprite', command=SpriteSelectAdjuster) - - baseSpriteLabel2.pack(side=LEFT) - spriteEntry2.pack(side=LEFT) - spriteSelectButton2.pack(side=LEFT) - - romDialogFrame2.pack() - spriteDialogFrame2.pack() - - checkBoxFrame2.pack() - fileDialogFrame2.pack() - - drowDownFrame2 = Frame(topFrame2) - heartbeepFrame2 = Frame(drowDownFrame2) - heartbeepOptionMenu2 = OptionMenu(heartbeepFrame2, self.gameOptionsWindow.heartbeepVar, 'double', 'normal', 'half', 'quarter', 'off') - heartbeepOptionMenu2.pack(side=RIGHT) - heartbeepLabel2 = Label(heartbeepFrame2, text='Heartbeep sound rate') - heartbeepLabel2.pack(side=LEFT) - - heartcolorFrame2 = Frame(drowDownFrame2) - heartcolorOptionMenu2 = OptionMenu(heartcolorFrame2, self.gameOptionsWindow.heartcolorVar, 'red', 'blue', 'green', 'yellow', 'random') - heartcolorOptionMenu2.pack(side=RIGHT) - heartcolorLabel2 = Label(heartcolorFrame2, text='Heart color') - heartcolorLabel2.pack(side=LEFT) - - fastMenuFrame2 = Frame(drowDownFrame2) - fastMenuOptionMenu2 = OptionMenu(fastMenuFrame2, self.gameOptionsWindow.fastMenuVar, 'normal', 'instant', 'double', 'triple', 'quadruple', 'half') - fastMenuOptionMenu2.pack(side=RIGHT) - fastMenuLabel2 = Label(fastMenuFrame2, text='Menu speed') - fastMenuLabel2.pack(side=LEFT) - - owPalettesFrame2 = Frame(drowDownFrame2) - owPalettesOptionMenu2 = OptionMenu(owPalettesFrame2, self.gameOptionsWindow.owPalettesVar, 'default', 'random', 'blackout') - owPalettesOptionMenu2.pack(side=RIGHT) - owPalettesLabel2 = Label(owPalettesFrame2, text='Overworld palettes') - owPalettesLabel2.pack(side=LEFT) - - uwPalettesFrame2 = Frame(drowDownFrame2) - uwPalettesOptionMenu2 = OptionMenu(uwPalettesFrame2, self.gameOptionsWindow.uwPalettesVar, 'default', 'random', 'blackout') - uwPalettesOptionMenu2.pack(side=RIGHT) - uwPalettesLabel2 = Label(uwPalettesFrame2, text='Dungeon palettes') - uwPalettesLabel2.pack(side=LEFT) - - heartbeepFrame2.pack(expand=True, anchor=E) - heartcolorFrame2.pack(expand=True, anchor=E) - fastMenuFrame2.pack(expand=True, anchor=E) - owPalettesFrame2.pack(expand=True, anchor=E) - uwPalettesFrame2.pack(expand=True, anchor=E) - - bottomFrame2 = Frame(topFrame2) - - def adjustRom(): - guiargs = Namespace() - guiargs.heartbeep = self.gameOptionsWindow.heartbeepVar.get() - guiargs.heartcolor = self.gameOptionsWindow.heartcolorVar.get() - guiargs.fastmenu = self.gameOptionsWindow.fastMenuVar.get() - guiargs.ow_palettes = self.gameOptionsWindow.owPalettesVar.get() - guiargs.uw_palettes = self.gameOptionsWindow.uwPalettesVar.get() - guiargs.quickswap = bool(self.gameOptionsWindow.quickSwapVar.get()) - guiargs.disablemusic = bool(self.gameOptionsWindow.disableMusicVar.get()) - guiargs.rom = romVar2.get() - guiargs.baserom = self.generationSetupWindow.romVar.get() -# guiargs.sprite = sprite - try: - adjust(args=guiargs) - except Exception as e: - logging.exception(e) - messagebox.showerror(title="Error while creating seed", message=str(e)) - else: - messagebox.showinfo(title="Success", message="Rom patched successfully") - - adjustButton = Button(bottomFrame2, text='Adjust Rom', command=adjustRom) - - adjustButton.pack(side=LEFT, padx=(5, 0)) - - drowDownFrame2.pack(side=LEFT, pady=(0, 40)) - rightHalfFrame2.pack(side=RIGHT) - topFrame2.pack(side=TOP, pady=70) - bottomFrame2.pack(side=BOTTOM, pady=(180, 0)) + self.adjustContent = adjust_page(self,self.adjustWindow) +# self.adjustContent,self.working_dirs = adjust_page(self,self.adjustWindow,self.working_dirs) + self.adjustContent.pack(side=TOP, fill=BOTH, expand=True) # Custom Controls diff --git a/gui/adjust/overview.py b/gui/adjust/overview.py new file mode 100644 index 00000000..7344c2f1 --- /dev/null +++ b/gui/adjust/overview.py @@ -0,0 +1,143 @@ +from tkinter import ttk, filedialog, messagebox, IntVar, StringVar, Button, Checkbutton, Entry, Frame, Label, OptionMenu, E, W, LEFT, RIGHT, X, BOTTOM +from AdjusterMain import adjust +from argparse import Namespace +from classes.SpriteSelector import SpriteSelector +import logging + +def adjust_page(top,parent):#,working_dirs): + self = ttk.Frame(parent) + + # Disable BGM + self.disableMusicVar2 = IntVar() + disableMusicCheckbutton2 = Checkbutton(self, text="Disable music", variable=self.disableMusicVar2) + disableMusicCheckbutton2.pack(anchor=W) + + # L/R Quickswap + self.quickSwapVar2 = IntVar() + quickSwapCheckbutton2 = Checkbutton(self, text="L/R Quickswapping", variable=self.quickSwapVar2) + quickSwapCheckbutton2.pack(anchor=W) + + selectOptionsFrame = Frame(self) + leftAdjustFrame = Frame(selectOptionsFrame) + rightAdjustFrame = Frame(selectOptionsFrame) + bottomAdjustFrame = Frame(self) + selectOptionsFrame.pack(fill=X, expand=True) + leftAdjustFrame.pack(side=LEFT) + rightAdjustFrame.pack(side=RIGHT) + bottomAdjustFrame.pack(fill=X, expand=True) + + # Heart Color + heartcolorFrame2 = Frame(leftAdjustFrame) + heartcolorLabel2 = Label(heartcolorFrame2, text='Heart color') + heartcolorLabel2.pack(side=LEFT) + self.heartcolorVar2 = StringVar() + self.heartcolorVar2.set('red') + heartcolorOptionMenu2 = OptionMenu(heartcolorFrame2, self.heartcolorVar2, 'red', 'blue', 'green', 'yellow', 'random') + heartcolorOptionMenu2.pack(side=RIGHT) + heartcolorFrame2.pack(anchor=E) + + # Heart Beep Speed + heartbeepFrame2 = Frame(leftAdjustFrame) + heartbeepLabel2 = Label(heartbeepFrame2, text='Heart Beep sound rate') + heartbeepLabel2.pack(side=LEFT) + self.heartbeepVar2 = StringVar() + self.heartbeepVar2.set('normal') + heartbeepOptionMenu2 = OptionMenu(heartbeepFrame2, self.heartbeepVar2, 'double', 'normal', 'half', 'quarter', 'off') + heartbeepOptionMenu2.pack(side=RIGHT) + heartbeepFrame2.pack(anchor=E) + + # Sprite Selection + self.spriteNameVar2 = StringVar() + spriteDialogFrame2 = Frame(leftAdjustFrame) + baseSpriteLabel2 = Label(spriteDialogFrame2, text='Sprite:') + self.spriteNameVar2.set('(unchanged)') + spriteEntry2 = Label(spriteDialogFrame2, textvariable=self.spriteNameVar2) + + def set_sprite(sprite_param): + if sprite_param is None or not sprite_param.valid: + sprite = None + self.spriteNameVar2.set('(unchanged)') + else: + sprite = sprite_param + self.spriteNameVar2.set(sprite.name) + + def SpriteSelectAdjuster(): + SpriteSelector(parent, set_sprite, adjuster=True) + + spriteSelectButton2 = Button(spriteDialogFrame2, text='...', command=SpriteSelectAdjuster) + + baseSpriteLabel2.pack(side=LEFT) + spriteEntry2.pack(side=LEFT) + spriteSelectButton2.pack(side=LEFT) + spriteDialogFrame2.pack(anchor=E) + + # Menu Speed + fastMenuFrame2 = Frame(rightAdjustFrame) + fastMenuLabel2 = Label(fastMenuFrame2, text='Menu speed') + fastMenuLabel2.pack(side=LEFT) + self.fastMenuVar2 = StringVar() + self.fastMenuVar2.set("normal") + fastMenuOptionMenu2 = OptionMenu(fastMenuFrame2, self.fastMenuVar2, 'normal', 'instant', 'double', 'triple', 'quadruple', 'half') + fastMenuOptionMenu2.pack(side=RIGHT) + fastMenuFrame2.pack(anchor=E) + + owPalettesFrame2 = Frame(rightAdjustFrame) + owPalettesLabel2 = Label(owPalettesFrame2, text='Overworld palettes') + owPalettesLabel2.pack(side=LEFT) + self.owPalettesVar2 = StringVar() + self.owPalettesVar2.set("default") + owPalettesOptionMenu2 = OptionMenu(owPalettesFrame2, self.owPalettesVar2, 'default', 'random', 'blackout') + owPalettesOptionMenu2.pack(side=RIGHT) + owPalettesFrame2.pack(anchor=E) + + uwPalettesFrame2 = Frame(rightAdjustFrame) + uwPalettesLabel2 = Label(uwPalettesFrame2, text='Dungeon palettes') + uwPalettesLabel2.pack(side=LEFT) + self.uwPalettesVar2 = StringVar() + self.uwPalettesVar2.set("default") + uwPalettesOptionMenu2 = OptionMenu(uwPalettesFrame2, self.uwPalettesVar2, 'default', 'random', 'blackout') + uwPalettesOptionMenu2.pack(side=RIGHT) + uwPalettesFrame2.pack(anchor=E) + + adjustRomFrame = Frame(bottomAdjustFrame) + adjustRomLabel = Label(adjustRomFrame, text='Rom to adjust: ') + self.romVar2 = StringVar() +# romVar2 = StringVar(value=working_dirs["adjust.rom"]) + romEntry2 = Entry(adjustRomFrame, textvariable=self.romVar2) + + def RomSelect2(): + rom = filedialog.askopenfilename(filetypes=[("Rom Files", (".sfc", ".smc")), ("All Files", "*")]) + if rom: +# working_dirs["adjust.rom"] = rom + self.romVar2.set(rom) + romSelectButton2 = Button(adjustRomFrame, text='Select Rom', command=RomSelect2) + + adjustRomLabel.pack(side=LEFT) + romEntry2.pack(side=LEFT, fill=X, expand=True) + romSelectButton2.pack(side=LEFT) + adjustRomFrame.pack(fill=X, expand=True) + + def adjustRom(): + guiargs = Namespace() + guiargs.heartbeep = self.heartbeepVar2.get() + guiargs.heartcolor = self.heartcolorVar2.get() + guiargs.fastmenu = self.fastMenuVar2.get() + guiargs.ow_palettes = self.owPalettesVar2.get() + guiargs.uw_palettes = self.uwPalettesVar2.get() + guiargs.quickswap = bool(self.quickSwapVar2.get()) + guiargs.disablemusic = bool(self.disableMusicVar2.get()) + guiargs.rom = self.romVar2.get() + guiargs.baserom = top.generationSetupWindow.romVar.get() +# guiargs.sprite = sprite + try: + adjust(args=guiargs) + except Exception as e: + logging.exception(e) + messagebox.showerror(title="Error while creating seed", message=str(e)) + else: + messagebox.showinfo(title="Success", message="Rom patched successfully") + + adjustButton = Button(bottomAdjustFrame, text='Adjust Rom', command=adjustRom) + adjustButton.pack(side=BOTTOM, padx=(5, 0)) + + return self#,working_dirs From 96b414402244e5c7870c7186aa0f3639db2685df Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 8 Feb 2020 16:25:44 -0800 Subject: [PATCH 012/117] Fix Adjuster script --- AdjusterMain.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/AdjusterMain.py b/AdjusterMain.py index 30092b15..b1d5cadf 100644 --- a/AdjusterMain.py +++ b/AdjusterMain.py @@ -21,6 +21,9 @@ def adjust(args): else: raise RuntimeError('Provided Rom is not a valid Link to the Past Randomizer Rom. Please provide one for adjusting.') + if not hasattr(args,"sprite"): + args.sprite = None + apply_rom_settings(rom, args.heartbeep, args.heartcolor, args.quickswap, args.fastmenu, args.disablemusic, args.sprite, args.ow_palettes, args.uw_palettes) rom.write_to_file(output_path('%s.sfc' % outfilebase)) From 9d3f378d9feaac1ebd8457bf4b8290e5f8b7d96f Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 8 Feb 2020 16:31:28 -0800 Subject: [PATCH 013/117] Factor out Custom Item Pool --- Gui.py | 588 +--------------------------------------- gui/custom/overview.py | 593 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 597 insertions(+), 584 deletions(-) create mode 100644 gui/custom/overview.py diff --git a/Gui.py b/Gui.py index fc1bc2e2..ab1de816 100755 --- a/Gui.py +++ b/Gui.py @@ -13,6 +13,7 @@ from urllib.request import urlopen from AdjusterMain import adjust from DungeonRandomizer import parse_arguments from gui.adjust.overview import adjust_page +from gui.custom.overview import custom_page from gui.randomize.item import item_page from gui.randomize.entrando import entrando_page from gui.randomize.enemizer import enemizer_page @@ -98,596 +99,15 @@ def guiMain(args=None): self.adjustContent.pack(side=TOP, fill=BOTH, expand=True) # Custom Controls - - topFrame3 = Frame(self.customWindow) + self.customContent = custom_page(self,self.customWindow) + self.customContent.pack(side=TOP, pady=(17,0)) def validation(P): if str.isdigit(P) or P == "": return True else: return False - vcmd=(topFrame3.register(validation), '%P') - - itemList1 = Frame(topFrame3) - itemList2 = Frame(topFrame3) - itemList3 = Frame(topFrame3) - itemList4 = Frame(topFrame3) - itemList5 = Frame(topFrame3) - - bowFrame = Frame(itemList1) - bowLabel = Label(bowFrame, text='Bow') - self.customWindow.bowVar = StringVar(value='0') - bowEntry = Entry(bowFrame, textvariable=self.customWindow.bowVar, width=3, validate='all', vcmd=vcmd) - bowFrame.pack() - bowLabel.pack(anchor=W, side=LEFT, padx=(0,53)) - bowEntry.pack(anchor=E) - - progbowFrame = Frame(itemList1) - progbowLabel = Label(progbowFrame, text='Prog.Bow') - self.customWindow.progbowVar = StringVar(value='2') - progbowEntry = Entry(progbowFrame, textvariable=self.customWindow.progbowVar, width=3, validate='all', vcmd=vcmd) - progbowFrame.pack() - progbowLabel.pack(anchor=W, side=LEFT, padx=(0,25)) - progbowEntry.pack(anchor=E) - - boomerangFrame = Frame(itemList1) - boomerangLabel = Label(boomerangFrame, text='Boomerang') - self.customWindow.boomerangVar = StringVar(value='1') - boomerangEntry = Entry(boomerangFrame, textvariable=self.customWindow.boomerangVar, width=3, validate='all', vcmd=vcmd) - boomerangFrame.pack() - boomerangLabel.pack(anchor=W, side=LEFT, padx=(0,14)) - boomerangEntry.pack(anchor=E) - - magicboomerangFrame = Frame(itemList1) - magicboomerangLabel = Label(magicboomerangFrame, text='M.Boomerang') - self.customWindow.magicboomerangVar = StringVar(value='1') - magicboomerangEntry = Entry(magicboomerangFrame, textvariable=self.customWindow.magicboomerangVar, width=3, validate='all', vcmd=vcmd) - magicboomerangFrame.pack() - magicboomerangLabel.pack(anchor=W, side=LEFT) - magicboomerangEntry.pack(anchor=E) - - hookshotFrame = Frame(itemList1) - hookshotLabel = Label(hookshotFrame, text='Hookshot') - self.customWindow.hookshotVar = StringVar(value='1') - hookshotEntry = Entry(hookshotFrame, textvariable=self.customWindow.hookshotVar, width=3, validate='all', vcmd=vcmd) - hookshotFrame.pack() - hookshotLabel.pack(anchor=W, side=LEFT, padx=(0,24)) - hookshotEntry.pack(anchor=E) - - mushroomFrame = Frame(itemList1) - mushroomLabel = Label(mushroomFrame, text='Mushroom') - self.customWindow.mushroomVar = StringVar(value='1') - mushroomEntry = Entry(mushroomFrame, textvariable=self.customWindow.mushroomVar, width=3, validate='all', vcmd=vcmd) - mushroomFrame.pack() - mushroomLabel.pack(anchor=W, side=LEFT, padx=(0,17)) - mushroomEntry.pack(anchor=E) - - magicpowderFrame = Frame(itemList1) - magicpowderLabel = Label(magicpowderFrame, text='Magic Powder') - self.customWindow.magicpowderVar = StringVar(value='1') - magicpowderEntry = Entry(magicpowderFrame, textvariable=self.customWindow.magicpowderVar, width=3, validate='all', vcmd=vcmd) - magicpowderFrame.pack() - magicpowderLabel.pack(anchor=W, side=LEFT) - magicpowderEntry.pack(anchor=E) - - firerodFrame = Frame(itemList1) - firerodLabel = Label(firerodFrame, text='Fire Rod') - self.customWindow.firerodVar = StringVar(value='1') - firerodEntry = Entry(firerodFrame, textvariable=self.customWindow.firerodVar, width=3, validate='all', vcmd=vcmd) - firerodFrame.pack() - firerodLabel.pack(anchor=W, side=LEFT, padx=(0,33)) - firerodEntry.pack(anchor=E) - - icerodFrame = Frame(itemList1) - icerodLabel = Label(icerodFrame, text='Ice Rod') - self.customWindow.icerodVar = StringVar(value='1') - icerodEntry = Entry(icerodFrame, textvariable=self.customWindow.icerodVar, width=3, validate='all', vcmd=vcmd) - icerodFrame.pack() - icerodLabel.pack(anchor=W, side=LEFT, padx=(0,37)) - icerodEntry.pack(anchor=E) - - bombosFrame = Frame(itemList1) - bombosLabel = Label(bombosFrame, text='Bombos') - self.customWindow.bombosVar = StringVar(value='1') - bombosEntry = Entry(bombosFrame, textvariable=self.customWindow.bombosVar, width=3, validate='all', vcmd=vcmd) - bombosFrame.pack() - bombosLabel.pack(anchor=W, side=LEFT, padx=(0,32)) - bombosEntry.pack(anchor=E) - - etherFrame = Frame(itemList1) - etherLabel = Label(etherFrame, text='Ether') - self.customWindow.etherVar = StringVar(value='1') - etherEntry = Entry(etherFrame, textvariable=self.customWindow.etherVar, width=3, validate='all', vcmd=vcmd) - etherFrame.pack() - etherLabel.pack(anchor=W, side=LEFT, padx=(0,49)) - etherEntry.pack(anchor=E) - - quakeFrame = Frame(itemList1) - quakeLabel = Label(quakeFrame, text='Quake') - self.customWindow.quakeVar = StringVar(value='1') - quakeEntry = Entry(quakeFrame, textvariable=self.customWindow.quakeVar, width=3, validate='all', vcmd=vcmd) - quakeFrame.pack() - quakeLabel.pack(anchor=W, side=LEFT, padx=(0,42)) - quakeEntry.pack(anchor=E) - - lampFrame = Frame(itemList1) - lampLabel = Label(lampFrame, text='Lamp') - self.customWindow.lampVar = StringVar(value='1') - lampEntry = Entry(lampFrame, textvariable=self.customWindow.lampVar, width=3, validate='all', vcmd=vcmd) - lampFrame.pack() - lampLabel.pack(anchor=W, side=LEFT, padx=(0,46)) - lampEntry.pack(anchor=E) - - hammerFrame = Frame(itemList1) - hammerLabel = Label(hammerFrame, text='Hammer') - self.customWindow.hammerVar = StringVar(value='1') - hammerEntry = Entry(hammerFrame, textvariable=self.customWindow.hammerVar, width=3, validate='all', vcmd=vcmd) - hammerFrame.pack() - hammerLabel.pack(anchor=W, side=LEFT, padx=(0,29)) - hammerEntry.pack(anchor=E) - - shovelFrame = Frame(itemList1) - shovelLabel = Label(shovelFrame, text='Shovel') - self.customWindow.shovelVar = StringVar(value='1') - shovelEntry = Entry(shovelFrame, textvariable=self.customWindow.shovelVar, width=3, validate='all', vcmd=vcmd) - shovelFrame.pack() - shovelLabel.pack(anchor=W, side=LEFT, padx=(0,41)) - shovelEntry.pack(anchor=E) - - fluteFrame = Frame(itemList1) - fluteLabel = Label(fluteFrame, text='Flute') - self.customWindow.fluteVar = StringVar(value='1') - fluteEntry = Entry(fluteFrame, textvariable=self.customWindow.fluteVar, width=3, validate='all', vcmd=vcmd) - fluteFrame.pack() - fluteLabel.pack(anchor=W, side=LEFT, padx=(0,50)) - fluteEntry.pack(anchor=E) - - bugnetFrame = Frame(itemList2) - bugnetLabel = Label(bugnetFrame, text='Bug Net') - self.customWindow.bugnetVar = StringVar(value='1') - bugnetEntry = Entry(bugnetFrame, textvariable=self.customWindow.bugnetVar, width=3, validate='all', vcmd=vcmd) - bugnetFrame.pack() - bugnetLabel.pack(anchor=W, side=LEFT, padx=(0,41)) - bugnetEntry.pack(anchor=E) - - bookFrame = Frame(itemList2) - bookLabel = Label(bookFrame, text='Book') - self.customWindow.bookVar = StringVar(value='1') - bookEntry = Entry(bookFrame, textvariable=self.customWindow.bookVar, width=3, validate='all', vcmd=vcmd) - bookFrame.pack() - bookLabel.pack(anchor=W, side=LEFT, padx=(0,57)) - bookEntry.pack(anchor=E) - - bottleFrame = Frame(itemList2) - bottleLabel = Label(bottleFrame, text='Bottle') - self.customWindow.bottleVar = StringVar(value='4') - bottleEntry = Entry(bottleFrame, textvariable=self.customWindow.bottleVar, width=3, validate='all', vcmd=vcmd) - bottleFrame.pack() - bottleLabel.pack(anchor=W, side=LEFT, padx=(0,53)) - bottleEntry.pack(anchor=E) - - somariaFrame = Frame(itemList2) - somariaLabel = Label(somariaFrame, text='C.Somaria') - self.customWindow.somariaVar = StringVar(value='1') - somariaEntry = Entry(somariaFrame, textvariable=self.customWindow.somariaVar, width=3, validate='all', vcmd=vcmd) - somariaFrame.pack() - somariaLabel.pack(anchor=W, side=LEFT, padx=(0,30)) - somariaEntry.pack(anchor=E) - - byrnaFrame = Frame(itemList2) - byrnaLabel = Label(byrnaFrame, text='C.Byrna') - self.customWindow.byrnaVar = StringVar(value='1') - byrnaEntry = Entry(byrnaFrame, textvariable=self.customWindow.byrnaVar, width=3, validate='all', vcmd=vcmd) - byrnaFrame.pack() - byrnaLabel.pack(anchor=W, side=LEFT, padx=(0,43)) - byrnaEntry.pack(anchor=E) - - capeFrame = Frame(itemList2) - capeLabel = Label(capeFrame, text='Magic Cape') - self.customWindow.capeVar = StringVar(value='1') - capeEntry = Entry(capeFrame, textvariable=self.customWindow.capeVar, width=3, validate='all', vcmd=vcmd) - capeFrame.pack() - capeLabel.pack(anchor=W, side=LEFT, padx=(0,21)) - capeEntry.pack(anchor=E) - - mirrorFrame = Frame(itemList2) - mirrorLabel = Label(mirrorFrame, text='Magic Mirror') - self.customWindow.mirrorVar = StringVar(value='1') - mirrorEntry = Entry(mirrorFrame, textvariable=self.customWindow.mirrorVar, width=3, validate='all', vcmd=vcmd) - mirrorFrame.pack() - mirrorLabel.pack(anchor=W, side=LEFT, padx=(0,15)) - mirrorEntry.pack(anchor=E) - - bootsFrame = Frame(itemList2) - bootsLabel = Label(bootsFrame, text='Pegasus Boots') - self.customWindow.bootsVar = StringVar(value='1') - bootsEntry = Entry(bootsFrame, textvariable=self.customWindow.bootsVar, width=3, validate='all', vcmd=vcmd) - bootsFrame.pack() - bootsLabel.pack(anchor=W, side=LEFT, padx=(0,8)) - bootsEntry.pack(anchor=E) - - powergloveFrame = Frame(itemList2) - powergloveLabel = Label(powergloveFrame, text='Power Glove') - self.customWindow.powergloveVar = StringVar(value='0') - powergloveEntry = Entry(powergloveFrame, textvariable=self.customWindow.powergloveVar, width=3, validate='all', vcmd=vcmd) - powergloveFrame.pack() - powergloveLabel.pack(anchor=W, side=LEFT, padx=(0,18)) - powergloveEntry.pack(anchor=E) - - titansmittFrame = Frame(itemList2) - titansmittLabel = Label(titansmittFrame, text='Titan\'s Mitt') - self.customWindow.titansmittVar = StringVar(value='0') - titansmittEntry = Entry(titansmittFrame, textvariable=self.customWindow.titansmittVar, width=3, validate='all', vcmd=vcmd) - titansmittFrame.pack() - titansmittLabel.pack(anchor=W, side=LEFT, padx=(0,24)) - titansmittEntry.pack(anchor=E) - - proggloveFrame = Frame(itemList2) - proggloveLabel = Label(proggloveFrame, text='Prog.Glove') - self.customWindow.proggloveVar = StringVar(value='2') - proggloveEntry = Entry(proggloveFrame, textvariable=self.customWindow.proggloveVar, width=3, validate='all', vcmd=vcmd) - proggloveFrame.pack() - proggloveLabel.pack(anchor=W, side=LEFT, padx=(0,26)) - proggloveEntry.pack(anchor=E) - - flippersFrame = Frame(itemList2) - flippersLabel = Label(flippersFrame, text='Flippers') - self.customWindow.flippersVar = StringVar(value='1') - flippersEntry = Entry(flippersFrame, textvariable=self.customWindow.flippersVar, width=3, validate='all', vcmd=vcmd) - flippersFrame.pack() - flippersLabel.pack(anchor=W, side=LEFT, padx=(0,43)) - flippersEntry.pack(anchor=E) - - pearlFrame = Frame(itemList2) - pearlLabel = Label(pearlFrame, text='Moon Pearl') - self.customWindow.pearlVar = StringVar(value='1') - pearlEntry = Entry(pearlFrame, textvariable=self.customWindow.pearlVar, width=3, validate='all', vcmd=vcmd) - pearlFrame.pack() - pearlLabel.pack(anchor=W, side=LEFT, padx=(0,23)) - pearlEntry.pack(anchor=E) - - heartpieceFrame = Frame(itemList2) - heartpieceLabel = Label(heartpieceFrame, text='Piece of Heart') - self.customWindow.heartpieceVar = StringVar(value='24') - heartpieceEntry = Entry(heartpieceFrame, textvariable=self.customWindow.heartpieceVar, width=3, validate='all', vcmd=vcmd) - heartpieceFrame.pack() - heartpieceLabel.pack(anchor=W, side=LEFT, padx=(0,10)) - heartpieceEntry.pack(anchor=E) - - fullheartFrame = Frame(itemList2) - fullheartLabel = Label(fullheartFrame, text='Heart Container') - self.customWindow.fullheartVar = StringVar(value='10') - fullheartEntry = Entry(fullheartFrame, textvariable=self.customWindow.fullheartVar, width=3, validate='all', vcmd=vcmd) - fullheartFrame.pack() - fullheartLabel.pack(anchor=W, side=LEFT) - fullheartEntry.pack(anchor=E) - - sancheartFrame = Frame(itemList2) - sancheartLabel = Label(sancheartFrame, text='Sanctuary Heart') - self.customWindow.sancheartVar = StringVar(value='1') - sancheartEntry = Entry(sancheartFrame, textvariable=self.customWindow.sancheartVar, width=3, validate='all', vcmd=vcmd) - sancheartFrame.pack() - sancheartLabel.pack(anchor=W, side=LEFT) - sancheartEntry.pack(anchor=E) - - sword1Frame = Frame(itemList3) - sword1Label = Label(sword1Frame, text='Sword 1') - self.customWindow.sword1Var = StringVar(value='0') - sword1Entry = Entry(sword1Frame, textvariable=self.customWindow.sword1Var, width=3, validate='all', vcmd=vcmd) - sword1Frame.pack() - sword1Label.pack(anchor=W, side=LEFT, padx=(0,34)) - sword1Entry.pack(anchor=E) - - sword2Frame = Frame(itemList3) - sword2Label = Label(sword2Frame, text='Sword 2') - self.customWindow.sword2Var = StringVar(value='0') - sword2Entry = Entry(sword2Frame, textvariable=self.customWindow.sword2Var, width=3, validate='all', vcmd=vcmd) - sword2Frame.pack() - sword2Label.pack(anchor=W, side=LEFT, padx=(0,34)) - sword2Entry.pack(anchor=E) - - sword3Frame = Frame(itemList3) - sword3Label = Label(sword3Frame, text='Sword 3') - self.customWindow.sword3Var = StringVar(value='0') - sword3Entry = Entry(sword3Frame, textvariable=self.customWindow.sword3Var, width=3, validate='all', vcmd=vcmd) - sword3Frame.pack() - sword3Label.pack(anchor=W, side=LEFT, padx=(0,34)) - sword3Entry.pack(anchor=E) - - sword4Frame = Frame(itemList3) - sword4Label = Label(sword4Frame, text='Sword 4') - self.customWindow.sword4Var = StringVar(value='0') - sword4Entry = Entry(sword4Frame, textvariable=self.customWindow.sword4Var, width=3, validate='all', vcmd=vcmd) - sword4Frame.pack() - sword4Label.pack(anchor=W, side=LEFT, padx=(0,34)) - sword4Entry.pack(anchor=E) - - progswordFrame = Frame(itemList3) - progswordLabel = Label(progswordFrame, text='Prog.Sword') - self.customWindow.progswordVar = StringVar(value='4') - progswordEntry = Entry(progswordFrame, textvariable=self.customWindow.progswordVar, width=3, validate='all', vcmd=vcmd) - progswordFrame.pack() - progswordLabel.pack(anchor=W, side=LEFT, padx=(0,15)) - progswordEntry.pack(anchor=E) - - shield1Frame = Frame(itemList3) - shield1Label = Label(shield1Frame, text='Shield 1') - self.customWindow.shield1Var = StringVar(value='0') - shield1Entry = Entry(shield1Frame, textvariable=self.customWindow.shield1Var, width=3, validate='all', vcmd=vcmd) - shield1Frame.pack() - shield1Label.pack(anchor=W, side=LEFT, padx=(0,35)) - shield1Entry.pack(anchor=E) - - shield2Frame = Frame(itemList3) - shield2Label = Label(shield2Frame, text='Shield 2') - self.customWindow.shield2Var = StringVar(value='0') - shield2Entry = Entry(shield2Frame, textvariable=self.customWindow.shield2Var, width=3, validate='all', vcmd=vcmd) - shield2Frame.pack() - shield2Label.pack(anchor=W, side=LEFT, padx=(0,35)) - shield2Entry.pack(anchor=E) - - shield3Frame = Frame(itemList3) - shield3Label = Label(shield3Frame, text='Shield 3') - self.customWindow.shield3Var = StringVar(value='0') - shield3Entry = Entry(shield3Frame, textvariable=self.customWindow.shield3Var, width=3, validate='all', vcmd=vcmd) - shield3Frame.pack() - shield3Label.pack(anchor=W, side=LEFT, padx=(0,35)) - shield3Entry.pack(anchor=E) - - progshieldFrame = Frame(itemList3) - progshieldLabel = Label(progshieldFrame, text='Prog.Shield') - self.customWindow.progshieldVar = StringVar(value='3') - progshieldEntry = Entry(progshieldFrame, textvariable=self.customWindow.progshieldVar, width=3, validate='all', vcmd=vcmd) - progshieldFrame.pack() - progshieldLabel.pack(anchor=W, side=LEFT, padx=(0,16)) - progshieldEntry.pack(anchor=E) - - bluemailFrame = Frame(itemList3) - bluemailLabel = Label(bluemailFrame, text='Blue Mail') - self.customWindow.bluemailVar = StringVar(value='0') - bluemailEntry = Entry(bluemailFrame, textvariable=self.customWindow.bluemailVar, width=3, validate='all', vcmd=vcmd) - bluemailFrame.pack() - bluemailLabel.pack(anchor=W, side=LEFT, padx=(0,27)) - bluemailEntry.pack(anchor=E) - - redmailFrame = Frame(itemList3) - redmailLabel = Label(redmailFrame, text='Red Mail') - self.customWindow.redmailVar = StringVar(value='0') - redmailEntry = Entry(redmailFrame, textvariable=self.customWindow.redmailVar, width=3, validate='all', vcmd=vcmd) - redmailFrame.pack() - redmailLabel.pack(anchor=W, side=LEFT, padx=(0,30)) - redmailEntry.pack(anchor=E) - - progmailFrame = Frame(itemList3) - progmailLabel = Label(progmailFrame, text='Prog.Mail') - self.customWindow.progmailVar = StringVar(value='2') - progmailEntry = Entry(progmailFrame, textvariable=self.customWindow.progmailVar, width=3, validate='all', vcmd=vcmd) - progmailFrame.pack() - progmailLabel.pack(anchor=W, side=LEFT, padx=(0,25)) - progmailEntry.pack(anchor=E) - - halfmagicFrame = Frame(itemList3) - halfmagicLabel = Label(halfmagicFrame, text='Half Magic') - self.customWindow.halfmagicVar = StringVar(value='1') - halfmagicEntry = Entry(halfmagicFrame, textvariable=self.customWindow.halfmagicVar, width=3, validate='all', vcmd=vcmd) - halfmagicFrame.pack() - halfmagicLabel.pack(anchor=W, side=LEFT, padx=(0,18)) - halfmagicEntry.pack(anchor=E) - - quartermagicFrame = Frame(itemList3) - quartermagicLabel = Label(quartermagicFrame, text='Quarter Magic') - self.customWindow.quartermagicVar = StringVar(value='0') - quartermagicEntry = Entry(quartermagicFrame, textvariable=self.customWindow.quartermagicVar, width=3, validate='all', vcmd=vcmd) - quartermagicFrame.pack() - quartermagicLabel.pack(anchor=W, side=LEFT) - quartermagicEntry.pack(anchor=E) - - bcap5Frame = Frame(itemList3) - bcap5Label = Label(bcap5Frame, text='Bomb C.+5') - self.customWindow.bcap5Var = StringVar(value='0') - bcap5Entry = Entry(bcap5Frame, textvariable=self.customWindow.bcap5Var, width=3, validate='all', vcmd=vcmd) - bcap5Frame.pack() - bcap5Label.pack(anchor=W, side=LEFT, padx=(0,16)) - bcap5Entry.pack(anchor=E) - - bcap10Frame = Frame(itemList3) - bcap10Label = Label(bcap10Frame, text='Bomb C.+10') - self.customWindow.bcap10Var = StringVar(value='0') - bcap10Entry = Entry(bcap10Frame, textvariable=self.customWindow.bcap10Var, width=3, validate='all', vcmd=vcmd) - bcap10Frame.pack() - bcap10Label.pack(anchor=W, side=LEFT, padx=(0,10)) - bcap10Entry.pack(anchor=E) - - acap5Frame = Frame(itemList4) - acap5Label = Label(acap5Frame, text='Arrow C.+5') - self.customWindow.acap5Var = StringVar(value='0') - acap5Entry = Entry(acap5Frame, textvariable=self.customWindow.acap5Var, width=3, validate='all', vcmd=vcmd) - acap5Frame.pack() - acap5Label.pack(anchor=W, side=LEFT, padx=(0,7)) - acap5Entry.pack(anchor=E) - - acap10Frame = Frame(itemList4) - acap10Label = Label(acap10Frame, text='Arrow C.+10') - self.customWindow.acap10Var = StringVar(value='0') - acap10Entry = Entry(acap10Frame, textvariable=self.customWindow.acap10Var, width=3, validate='all', vcmd=vcmd) - acap10Frame.pack() - acap10Label.pack(anchor=W, side=LEFT, padx=(0,1)) - acap10Entry.pack(anchor=E) - - arrow1Frame = Frame(itemList4) - arrow1Label = Label(arrow1Frame, text='Arrow (1)') - self.customWindow.arrow1Var = StringVar(value='1') - arrow1Entry = Entry(arrow1Frame, textvariable=self.customWindow.arrow1Var, width=3, validate='all', vcmd=vcmd) - arrow1Frame.pack() - arrow1Label.pack(anchor=W, side=LEFT, padx=(0,18)) - arrow1Entry.pack(anchor=E) - - arrow10Frame = Frame(itemList4) - arrow10Label = Label(arrow10Frame, text='Arrows (10)') - self.customWindow.arrow10Var = StringVar(value='12') - arrow10Entry = Entry(arrow10Frame, textvariable=self.customWindow.arrow10Var, width=3, validate='all', vcmd=vcmd) - arrow10Frame.pack() - arrow10Label.pack(anchor=W, side=LEFT, padx=(0,7)) - arrow10Entry.pack(anchor=E) - - bomb1Frame = Frame(itemList4) - bomb1Label = Label(bomb1Frame, text='Bomb (1)') - self.customWindow.bomb1Var = StringVar(value='0') - bomb1Entry = Entry(bomb1Frame, textvariable=self.customWindow.bomb1Var, width=3, validate='all', vcmd=vcmd) - bomb1Frame.pack() - bomb1Label.pack(anchor=W, side=LEFT, padx=(0,18)) - bomb1Entry.pack(anchor=E) - - bomb3Frame = Frame(itemList4) - bomb3Label = Label(bomb3Frame, text='Bombs (3)') - self.customWindow.bomb3Var = StringVar(value='16') - bomb3Entry = Entry(bomb3Frame, textvariable=self.customWindow.bomb3Var, width=3, validate='all', vcmd=vcmd) - bomb3Frame.pack() - bomb3Label.pack(anchor=W, side=LEFT, padx=(0,13)) - bomb3Entry.pack(anchor=E) - - bomb10Frame = Frame(itemList4) - bomb10Label = Label(bomb10Frame, text='Bombs (10)') - self.customWindow.bomb10Var = StringVar(value='1') - bomb10Entry = Entry(bomb10Frame, textvariable=self.customWindow.bomb10Var, width=3, validate='all', vcmd=vcmd) - bomb10Frame.pack() - bomb10Label.pack(anchor=W, side=LEFT, padx=(0,7)) - bomb10Entry.pack(anchor=E) - - rupee1Frame = Frame(itemList4) - rupee1Label = Label(rupee1Frame, text='Rupee (1)') - self.customWindow.rupee1Var = StringVar(value='2') - rupee1Entry = Entry(rupee1Frame, textvariable=self.customWindow.rupee1Var, width=3, validate='all', vcmd=vcmd) - rupee1Frame.pack() - rupee1Label.pack(anchor=W, side=LEFT, padx=(0,17)) - rupee1Entry.pack(anchor=E) - - rupee5Frame = Frame(itemList4) - rupee5Label = Label(rupee5Frame, text='Rupees (5)') - self.customWindow.rupee5Var = StringVar(value='4') - rupee5Entry = Entry(rupee5Frame, textvariable=self.customWindow.rupee5Var, width=3, validate='all', vcmd=vcmd) - rupee5Frame.pack() - rupee5Label.pack(anchor=W, side=LEFT, padx=(0,12)) - rupee5Entry.pack(anchor=E) - - rupee20Frame = Frame(itemList4) - rupee20Label = Label(rupee20Frame, text='Rupees (20)') - self.customWindow.rupee20Var = StringVar(value='28') - rupee20Entry = Entry(rupee20Frame, textvariable=self.customWindow.rupee20Var, width=3, validate='all', vcmd=vcmd) - rupee20Frame.pack() - rupee20Label.pack(anchor=W, side=LEFT, padx=(0,6)) - rupee20Entry.pack(anchor=E) - - rupee50Frame = Frame(itemList4) - rupee50Label = Label(rupee50Frame, text='Rupees (50)') - self.customWindow.rupee50Var = StringVar(value='7') - rupee50Entry = Entry(rupee50Frame, textvariable=self.customWindow.rupee50Var, width=3, validate='all', vcmd=vcmd) - rupee50Frame.pack() - rupee50Label.pack(anchor=W, side=LEFT, padx=(0,6)) - rupee50Entry.pack(anchor=E) - - rupee100Frame = Frame(itemList4) - rupee100Label = Label(rupee100Frame, text='Rupees (100)') - self.customWindow.rupee100Var = StringVar(value='1') - rupee100Entry = Entry(rupee100Frame, textvariable=self.customWindow.rupee100Var, width=3, validate='all', vcmd=vcmd) - rupee100Frame.pack() - rupee100Label.pack(anchor=W, side=LEFT, padx=(0,0)) - rupee100Entry.pack(anchor=E) - - rupee300Frame = Frame(itemList4) - rupee300Label = Label(rupee300Frame, text='Rupees (300)') - self.customWindow.rupee300Var = StringVar(value='5') - rupee300Entry = Entry(rupee300Frame, textvariable=self.customWindow.rupee300Var, width=3, validate='all', vcmd=vcmd) - rupee300Frame.pack() - rupee300Label.pack(anchor=W, side=LEFT, padx=(0,0)) - rupee300Entry.pack(anchor=E) - - blueclockFrame = Frame(itemList4) - blueclockLabel = Label(blueclockFrame, text='Blue Clock') - self.customWindow.blueclockVar = StringVar(value='0') - blueclockEntry = Entry(blueclockFrame, textvariable=self.customWindow.blueclockVar, width=3, validate='all', vcmd=vcmd) - blueclockFrame.pack() - blueclockLabel.pack(anchor=W, side=LEFT, padx=(0,11)) - blueclockEntry.pack(anchor=E) - - greenclockFrame = Frame(itemList4) - greenclockLabel = Label(greenclockFrame, text='Green Clock') - self.customWindow.greenclockVar = StringVar(value='0') - greenclockEntry = Entry(greenclockFrame, textvariable=self.customWindow.greenclockVar, width=3, validate='all', vcmd=vcmd) - greenclockFrame.pack() - greenclockLabel.pack(anchor=W, side=LEFT, padx=(0,3)) - greenclockEntry.pack(anchor=E) - - redclockFrame = Frame(itemList4) - redclockLabel = Label(redclockFrame, text='Red Clock') - self.customWindow.redclockVar = StringVar(value='0') - redclockEntry = Entry(redclockFrame, textvariable=self.customWindow.redclockVar, width=3, validate='all', vcmd=vcmd) - redclockFrame.pack() - redclockLabel.pack(anchor=W, side=LEFT, padx=(0,14)) - redclockEntry.pack(anchor=E) - - silverarrowFrame = Frame(itemList5) - silverarrowLabel = Label(silverarrowFrame, text='Silver Arrow') - self.customWindow.silverarrowVar = StringVar(value='0') - silverarrowEntry = Entry(silverarrowFrame, textvariable=self.customWindow.silverarrowVar, width=3, validate='all', vcmd=vcmd) - silverarrowFrame.pack() - silverarrowLabel.pack(anchor=W, side=LEFT, padx=(0,64)) - silverarrowEntry.pack(anchor=E) - - universalkeyFrame = Frame(itemList5) - universalkeyLabel = Label(universalkeyFrame, text='Universal Key') - self.customWindow.universalkeyVar = StringVar(value='0') - universalkeyEntry = Entry(universalkeyFrame, textvariable=self.customWindow.universalkeyVar, width=3, validate='all', vcmd=vcmd) - universalkeyFrame.pack() - universalkeyLabel.pack(anchor=W, side=LEFT, padx=(0,57)) - universalkeyEntry.pack(anchor=E) - - triforcepieceFrame = Frame(itemList5) - triforcepieceLabel = Label(triforcepieceFrame, text='Triforce Piece') - self.customWindow.triforcepieceVar = StringVar(value='0') - triforcepieceEntry = Entry(triforcepieceFrame, textvariable=self.customWindow.triforcepieceVar, width=3, validate='all', vcmd=vcmd) - triforcepieceFrame.pack() - triforcepieceLabel.pack(anchor=W, side=LEFT, padx=(0,55)) - triforcepieceEntry.pack(anchor=E) - - triforcecountFrame = Frame(itemList5) - triforcecountLabel = Label(triforcecountFrame, text='Triforce Pieces Required') - self.customWindow.triforcecountVar = StringVar(value='0') - triforcecountEntry = Entry(triforcecountFrame, textvariable=self.customWindow.triforcecountVar, width=3, validate='all', vcmd=vcmd) - triforcecountFrame.pack() - triforcecountLabel.pack(anchor=W, side=LEFT, padx=(0,0)) - triforcecountEntry.pack(anchor=E) - - triforceFrame = Frame(itemList5) - triforceLabel = Label(triforceFrame, text='Triforce (win game)') - self.customWindow.triforceVar = StringVar(value='0') - triforceEntry = Entry(triforceFrame, textvariable=self.customWindow.triforceVar, width=3, validate='all', vcmd=vcmd) - triforceFrame.pack() - triforceLabel.pack(anchor=W, side=LEFT, padx=(0,23)) - triforceEntry.pack(anchor=E) - - rupoorFrame = Frame(itemList5) - rupoorLabel = Label(rupoorFrame, text='Rupoor') - self.customWindow.rupoorVar = StringVar(value='0') - rupoorEntry = Entry(rupoorFrame, textvariable=self.customWindow.rupoorVar, width=3, validate='all', vcmd=vcmd) - rupoorFrame.pack() - rupoorLabel.pack(anchor=W, side=LEFT, padx=(0,87)) - rupoorEntry.pack(anchor=E) - - rupoorcostFrame = Frame(itemList5) - rupoorcostLabel = Label(rupoorcostFrame, text='Rupoor Cost') - self.customWindow.rupoorcostVar = StringVar(value='10') - rupoorcostEntry = Entry(rupoorcostFrame, textvariable=self.customWindow.rupoorcostVar, width=6, validate='all', vcmd=vcmd) - rupoorcostFrame.pack() - rupoorcostLabel.pack(anchor=W, side=LEFT, padx=(0,43)) - rupoorcostEntry.pack(anchor=E) - - itemList1.pack(side=LEFT, padx=(0,0)) - itemList2.pack(side=LEFT, padx=(0,0)) - itemList3.pack(side=LEFT, padx=(0,0)) - itemList4.pack(side=LEFT, padx=(0,0)) - itemList5.pack(side=LEFT, padx=(0,0)) - topFrame3.pack(side=TOP, pady=(17,0)) + vcmd=(self.customContent.register(validation), '%P') if args is not None: for k,v in vars(args).items(): diff --git a/gui/custom/overview.py b/gui/custom/overview.py new file mode 100644 index 00000000..ead1572b --- /dev/null +++ b/gui/custom/overview.py @@ -0,0 +1,593 @@ +from tkinter import ttk, StringVar, Entry, Frame, Label, E, W, LEFT, RIGHT, X + +def custom_page(top,parent): + self = ttk.Frame(parent) + + def validation(P): + if str.isdigit(P) or P == "": + return True + else: + return False + vcmd=(self.register(validation), '%P') + + itemList1 = Frame(self) + itemList2 = Frame(self) + itemList3 = Frame(self) + itemList4 = Frame(self) + itemList5 = Frame(self) + + bowFrame = Frame(itemList1) + bowLabel = Label(bowFrame, text='Bow') + self.bowVar = StringVar(value='0') + bowEntry = Entry(bowFrame, textvariable=self.bowVar, width=3, validate='all', vcmd=vcmd) + bowFrame.pack() + bowLabel.pack(anchor=W, side=LEFT, padx=(0,53)) + bowEntry.pack(anchor=E) + + progbowFrame = Frame(itemList1) + progbowLabel = Label(progbowFrame, text='Prog.Bow') + self.progbowVar = StringVar(value='2') + progbowEntry = Entry(progbowFrame, textvariable=self.progbowVar, width=3, validate='all', vcmd=vcmd) + progbowFrame.pack() + progbowLabel.pack(anchor=W, side=LEFT, padx=(0,25)) + progbowEntry.pack(anchor=E) + + boomerangFrame = Frame(itemList1) + boomerangLabel = Label(boomerangFrame, text='Boomerang') + self.boomerangVar = StringVar(value='1') + boomerangEntry = Entry(boomerangFrame, textvariable=self.boomerangVar, width=3, validate='all', vcmd=vcmd) + boomerangFrame.pack() + boomerangLabel.pack(anchor=W, side=LEFT, padx=(0,14)) + boomerangEntry.pack(anchor=E) + + magicboomerangFrame = Frame(itemList1) + magicboomerangLabel = Label(magicboomerangFrame, text='M.Boomerang') + self.magicboomerangVar = StringVar(value='1') + magicboomerangEntry = Entry(magicboomerangFrame, textvariable=self.magicboomerangVar, width=3, validate='all', vcmd=vcmd) + magicboomerangFrame.pack() + magicboomerangLabel.pack(anchor=W, side=LEFT) + magicboomerangEntry.pack(anchor=E) + + hookshotFrame = Frame(itemList1) + hookshotLabel = Label(hookshotFrame, text='Hookshot') + self.hookshotVar = StringVar(value='1') + hookshotEntry = Entry(hookshotFrame, textvariable=self.hookshotVar, width=3, validate='all', vcmd=vcmd) + hookshotFrame.pack() + hookshotLabel.pack(anchor=W, side=LEFT, padx=(0,24)) + hookshotEntry.pack(anchor=E) + + mushroomFrame = Frame(itemList1) + mushroomLabel = Label(mushroomFrame, text='Mushroom') + self.mushroomVar = StringVar(value='1') + mushroomEntry = Entry(mushroomFrame, textvariable=self.mushroomVar, width=3, validate='all', vcmd=vcmd) + mushroomFrame.pack() + mushroomLabel.pack(anchor=W, side=LEFT, padx=(0,17)) + mushroomEntry.pack(anchor=E) + + magicpowderFrame = Frame(itemList1) + magicpowderLabel = Label(magicpowderFrame, text='Magic Powder') + self.magicpowderVar = StringVar(value='1') + magicpowderEntry = Entry(magicpowderFrame, textvariable=self.magicpowderVar, width=3, validate='all', vcmd=vcmd) + magicpowderFrame.pack() + magicpowderLabel.pack(anchor=W, side=LEFT) + magicpowderEntry.pack(anchor=E) + + firerodFrame = Frame(itemList1) + firerodLabel = Label(firerodFrame, text='Fire Rod') + self.firerodVar = StringVar(value='1') + firerodEntry = Entry(firerodFrame, textvariable=self.firerodVar, width=3, validate='all', vcmd=vcmd) + firerodFrame.pack() + firerodLabel.pack(anchor=W, side=LEFT, padx=(0,33)) + firerodEntry.pack(anchor=E) + + icerodFrame = Frame(itemList1) + icerodLabel = Label(icerodFrame, text='Ice Rod') + self.icerodVar = StringVar(value='1') + icerodEntry = Entry(icerodFrame, textvariable=self.icerodVar, width=3, validate='all', vcmd=vcmd) + icerodFrame.pack() + icerodLabel.pack(anchor=W, side=LEFT, padx=(0,37)) + icerodEntry.pack(anchor=E) + + bombosFrame = Frame(itemList1) + bombosLabel = Label(bombosFrame, text='Bombos') + self.bombosVar = StringVar(value='1') + bombosEntry = Entry(bombosFrame, textvariable=self.bombosVar, width=3, validate='all', vcmd=vcmd) + bombosFrame.pack() + bombosLabel.pack(anchor=W, side=LEFT, padx=(0,32)) + bombosEntry.pack(anchor=E) + + etherFrame = Frame(itemList1) + etherLabel = Label(etherFrame, text='Ether') + self.etherVar = StringVar(value='1') + etherEntry = Entry(etherFrame, textvariable=self.etherVar, width=3, validate='all', vcmd=vcmd) + etherFrame.pack() + etherLabel.pack(anchor=W, side=LEFT, padx=(0,49)) + etherEntry.pack(anchor=E) + + quakeFrame = Frame(itemList1) + quakeLabel = Label(quakeFrame, text='Quake') + self.quakeVar = StringVar(value='1') + quakeEntry = Entry(quakeFrame, textvariable=self.quakeVar, width=3, validate='all', vcmd=vcmd) + quakeFrame.pack() + quakeLabel.pack(anchor=W, side=LEFT, padx=(0,42)) + quakeEntry.pack(anchor=E) + + lampFrame = Frame(itemList1) + lampLabel = Label(lampFrame, text='Lamp') + self.lampVar = StringVar(value='1') + lampEntry = Entry(lampFrame, textvariable=self.lampVar, width=3, validate='all', vcmd=vcmd) + lampFrame.pack() + lampLabel.pack(anchor=W, side=LEFT, padx=(0,46)) + lampEntry.pack(anchor=E) + + hammerFrame = Frame(itemList1) + hammerLabel = Label(hammerFrame, text='Hammer') + self.hammerVar = StringVar(value='1') + hammerEntry = Entry(hammerFrame, textvariable=self.hammerVar, width=3, validate='all', vcmd=vcmd) + hammerFrame.pack() + hammerLabel.pack(anchor=W, side=LEFT, padx=(0,29)) + hammerEntry.pack(anchor=E) + + shovelFrame = Frame(itemList1) + shovelLabel = Label(shovelFrame, text='Shovel') + self.shovelVar = StringVar(value='1') + shovelEntry = Entry(shovelFrame, textvariable=self.shovelVar, width=3, validate='all', vcmd=vcmd) + shovelFrame.pack() + shovelLabel.pack(anchor=W, side=LEFT, padx=(0,41)) + shovelEntry.pack(anchor=E) + + fluteFrame = Frame(itemList1) + fluteLabel = Label(fluteFrame, text='Flute') + self.fluteVar = StringVar(value='1') + fluteEntry = Entry(fluteFrame, textvariable=self.fluteVar, width=3, validate='all', vcmd=vcmd) + fluteFrame.pack() + fluteLabel.pack(anchor=W, side=LEFT, padx=(0,50)) + fluteEntry.pack(anchor=E) + + bugnetFrame = Frame(itemList2) + bugnetLabel = Label(bugnetFrame, text='Bug Net') + self.bugnetVar = StringVar(value='1') + bugnetEntry = Entry(bugnetFrame, textvariable=self.bugnetVar, width=3, validate='all', vcmd=vcmd) + bugnetFrame.pack() + bugnetLabel.pack(anchor=W, side=LEFT, padx=(0,41)) + bugnetEntry.pack(anchor=E) + + bookFrame = Frame(itemList2) + bookLabel = Label(bookFrame, text='Book') + self.bookVar = StringVar(value='1') + bookEntry = Entry(bookFrame, textvariable=self.bookVar, width=3, validate='all', vcmd=vcmd) + bookFrame.pack() + bookLabel.pack(anchor=W, side=LEFT, padx=(0,57)) + bookEntry.pack(anchor=E) + + bottleFrame = Frame(itemList2) + bottleLabel = Label(bottleFrame, text='Bottle') + self.bottleVar = StringVar(value='4') + bottleEntry = Entry(bottleFrame, textvariable=self.bottleVar, width=3, validate='all', vcmd=vcmd) + bottleFrame.pack() + bottleLabel.pack(anchor=W, side=LEFT, padx=(0,53)) + bottleEntry.pack(anchor=E) + + somariaFrame = Frame(itemList2) + somariaLabel = Label(somariaFrame, text='C.Somaria') + self.somariaVar = StringVar(value='1') + somariaEntry = Entry(somariaFrame, textvariable=self.somariaVar, width=3, validate='all', vcmd=vcmd) + somariaFrame.pack() + somariaLabel.pack(anchor=W, side=LEFT, padx=(0,30)) + somariaEntry.pack(anchor=E) + + byrnaFrame = Frame(itemList2) + byrnaLabel = Label(byrnaFrame, text='C.Byrna') + self.byrnaVar = StringVar(value='1') + byrnaEntry = Entry(byrnaFrame, textvariable=self.byrnaVar, width=3, validate='all', vcmd=vcmd) + byrnaFrame.pack() + byrnaLabel.pack(anchor=W, side=LEFT, padx=(0,43)) + byrnaEntry.pack(anchor=E) + + capeFrame = Frame(itemList2) + capeLabel = Label(capeFrame, text='Magic Cape') + self.capeVar = StringVar(value='1') + capeEntry = Entry(capeFrame, textvariable=self.capeVar, width=3, validate='all', vcmd=vcmd) + capeFrame.pack() + capeLabel.pack(anchor=W, side=LEFT, padx=(0,21)) + capeEntry.pack(anchor=E) + + mirrorFrame = Frame(itemList2) + mirrorLabel = Label(mirrorFrame, text='Magic Mirror') + self.mirrorVar = StringVar(value='1') + mirrorEntry = Entry(mirrorFrame, textvariable=self.mirrorVar, width=3, validate='all', vcmd=vcmd) + mirrorFrame.pack() + mirrorLabel.pack(anchor=W, side=LEFT, padx=(0,15)) + mirrorEntry.pack(anchor=E) + + bootsFrame = Frame(itemList2) + bootsLabel = Label(bootsFrame, text='Pegasus Boots') + self.bootsVar = StringVar(value='1') + bootsEntry = Entry(bootsFrame, textvariable=self.bootsVar, width=3, validate='all', vcmd=vcmd) + bootsFrame.pack() + bootsLabel.pack(anchor=W, side=LEFT, padx=(0,8)) + bootsEntry.pack(anchor=E) + + powergloveFrame = Frame(itemList2) + powergloveLabel = Label(powergloveFrame, text='Power Glove') + self.powergloveVar = StringVar(value='0') + powergloveEntry = Entry(powergloveFrame, textvariable=self.powergloveVar, width=3, validate='all', vcmd=vcmd) + powergloveFrame.pack() + powergloveLabel.pack(anchor=W, side=LEFT, padx=(0,18)) + powergloveEntry.pack(anchor=E) + + titansmittFrame = Frame(itemList2) + titansmittLabel = Label(titansmittFrame, text='Titan\'s Mitt') + self.titansmittVar = StringVar(value='0') + titansmittEntry = Entry(titansmittFrame, textvariable=self.titansmittVar, width=3, validate='all', vcmd=vcmd) + titansmittFrame.pack() + titansmittLabel.pack(anchor=W, side=LEFT, padx=(0,24)) + titansmittEntry.pack(anchor=E) + + proggloveFrame = Frame(itemList2) + proggloveLabel = Label(proggloveFrame, text='Prog.Glove') + self.proggloveVar = StringVar(value='2') + proggloveEntry = Entry(proggloveFrame, textvariable=self.proggloveVar, width=3, validate='all', vcmd=vcmd) + proggloveFrame.pack() + proggloveLabel.pack(anchor=W, side=LEFT, padx=(0,26)) + proggloveEntry.pack(anchor=E) + + flippersFrame = Frame(itemList2) + flippersLabel = Label(flippersFrame, text='Flippers') + self.flippersVar = StringVar(value='1') + flippersEntry = Entry(flippersFrame, textvariable=self.flippersVar, width=3, validate='all', vcmd=vcmd) + flippersFrame.pack() + flippersLabel.pack(anchor=W, side=LEFT, padx=(0,43)) + flippersEntry.pack(anchor=E) + + pearlFrame = Frame(itemList2) + pearlLabel = Label(pearlFrame, text='Moon Pearl') + self.pearlVar = StringVar(value='1') + pearlEntry = Entry(pearlFrame, textvariable=self.pearlVar, width=3, validate='all', vcmd=vcmd) + pearlFrame.pack() + pearlLabel.pack(anchor=W, side=LEFT, padx=(0,23)) + pearlEntry.pack(anchor=E) + + heartpieceFrame = Frame(itemList2) + heartpieceLabel = Label(heartpieceFrame, text='Piece of Heart') + self.heartpieceVar = StringVar(value='24') + heartpieceEntry = Entry(heartpieceFrame, textvariable=self.heartpieceVar, width=3, validate='all', vcmd=vcmd) + heartpieceFrame.pack() + heartpieceLabel.pack(anchor=W, side=LEFT, padx=(0,10)) + heartpieceEntry.pack(anchor=E) + + fullheartFrame = Frame(itemList2) + fullheartLabel = Label(fullheartFrame, text='Heart Container') + self.fullheartVar = StringVar(value='10') + fullheartEntry = Entry(fullheartFrame, textvariable=self.fullheartVar, width=3, validate='all', vcmd=vcmd) + fullheartFrame.pack() + fullheartLabel.pack(anchor=W, side=LEFT) + fullheartEntry.pack(anchor=E) + + sancheartFrame = Frame(itemList2) + sancheartLabel = Label(sancheartFrame, text='Sanctuary Heart') + self.sancheartVar = StringVar(value='1') + sancheartEntry = Entry(sancheartFrame, textvariable=self.sancheartVar, width=3, validate='all', vcmd=vcmd) + sancheartFrame.pack() + sancheartLabel.pack(anchor=W, side=LEFT) + sancheartEntry.pack(anchor=E) + + sword1Frame = Frame(itemList3) + sword1Label = Label(sword1Frame, text='Sword 1') + self.sword1Var = StringVar(value='0') + sword1Entry = Entry(sword1Frame, textvariable=self.sword1Var, width=3, validate='all', vcmd=vcmd) + sword1Frame.pack() + sword1Label.pack(anchor=W, side=LEFT, padx=(0,34)) + sword1Entry.pack(anchor=E) + + sword2Frame = Frame(itemList3) + sword2Label = Label(sword2Frame, text='Sword 2') + self.sword2Var = StringVar(value='0') + sword2Entry = Entry(sword2Frame, textvariable=self.sword2Var, width=3, validate='all', vcmd=vcmd) + sword2Frame.pack() + sword2Label.pack(anchor=W, side=LEFT, padx=(0,34)) + sword2Entry.pack(anchor=E) + + sword3Frame = Frame(itemList3) + sword3Label = Label(sword3Frame, text='Sword 3') + self.sword3Var = StringVar(value='0') + sword3Entry = Entry(sword3Frame, textvariable=self.sword3Var, width=3, validate='all', vcmd=vcmd) + sword3Frame.pack() + sword3Label.pack(anchor=W, side=LEFT, padx=(0,34)) + sword3Entry.pack(anchor=E) + + sword4Frame = Frame(itemList3) + sword4Label = Label(sword4Frame, text='Sword 4') + self.sword4Var = StringVar(value='0') + sword4Entry = Entry(sword4Frame, textvariable=self.sword4Var, width=3, validate='all', vcmd=vcmd) + sword4Frame.pack() + sword4Label.pack(anchor=W, side=LEFT, padx=(0,34)) + sword4Entry.pack(anchor=E) + + progswordFrame = Frame(itemList3) + progswordLabel = Label(progswordFrame, text='Prog.Sword') + self.progswordVar = StringVar(value='4') + progswordEntry = Entry(progswordFrame, textvariable=self.progswordVar, width=3, validate='all', vcmd=vcmd) + progswordFrame.pack() + progswordLabel.pack(anchor=W, side=LEFT, padx=(0,15)) + progswordEntry.pack(anchor=E) + + shield1Frame = Frame(itemList3) + shield1Label = Label(shield1Frame, text='Shield 1') + self.shield1Var = StringVar(value='0') + shield1Entry = Entry(shield1Frame, textvariable=self.shield1Var, width=3, validate='all', vcmd=vcmd) + shield1Frame.pack() + shield1Label.pack(anchor=W, side=LEFT, padx=(0,35)) + shield1Entry.pack(anchor=E) + + shield2Frame = Frame(itemList3) + shield2Label = Label(shield2Frame, text='Shield 2') + self.shield2Var = StringVar(value='0') + shield2Entry = Entry(shield2Frame, textvariable=self.shield2Var, width=3, validate='all', vcmd=vcmd) + shield2Frame.pack() + shield2Label.pack(anchor=W, side=LEFT, padx=(0,35)) + shield2Entry.pack(anchor=E) + + shield3Frame = Frame(itemList3) + shield3Label = Label(shield3Frame, text='Shield 3') + self.shield3Var = StringVar(value='0') + shield3Entry = Entry(shield3Frame, textvariable=self.shield3Var, width=3, validate='all', vcmd=vcmd) + shield3Frame.pack() + shield3Label.pack(anchor=W, side=LEFT, padx=(0,35)) + shield3Entry.pack(anchor=E) + + progshieldFrame = Frame(itemList3) + progshieldLabel = Label(progshieldFrame, text='Prog.Shield') + self.progshieldVar = StringVar(value='3') + progshieldEntry = Entry(progshieldFrame, textvariable=self.progshieldVar, width=3, validate='all', vcmd=vcmd) + progshieldFrame.pack() + progshieldLabel.pack(anchor=W, side=LEFT, padx=(0,16)) + progshieldEntry.pack(anchor=E) + + bluemailFrame = Frame(itemList3) + bluemailLabel = Label(bluemailFrame, text='Blue Mail') + self.bluemailVar = StringVar(value='0') + bluemailEntry = Entry(bluemailFrame, textvariable=self.bluemailVar, width=3, validate='all', vcmd=vcmd) + bluemailFrame.pack() + bluemailLabel.pack(anchor=W, side=LEFT, padx=(0,27)) + bluemailEntry.pack(anchor=E) + + redmailFrame = Frame(itemList3) + redmailLabel = Label(redmailFrame, text='Red Mail') + self.redmailVar = StringVar(value='0') + redmailEntry = Entry(redmailFrame, textvariable=self.redmailVar, width=3, validate='all', vcmd=vcmd) + redmailFrame.pack() + redmailLabel.pack(anchor=W, side=LEFT, padx=(0,30)) + redmailEntry.pack(anchor=E) + + progmailFrame = Frame(itemList3) + progmailLabel = Label(progmailFrame, text='Prog.Mail') + self.progmailVar = StringVar(value='2') + progmailEntry = Entry(progmailFrame, textvariable=self.progmailVar, width=3, validate='all', vcmd=vcmd) + progmailFrame.pack() + progmailLabel.pack(anchor=W, side=LEFT, padx=(0,25)) + progmailEntry.pack(anchor=E) + + halfmagicFrame = Frame(itemList3) + halfmagicLabel = Label(halfmagicFrame, text='Half Magic') + self.halfmagicVar = StringVar(value='1') + halfmagicEntry = Entry(halfmagicFrame, textvariable=self.halfmagicVar, width=3, validate='all', vcmd=vcmd) + halfmagicFrame.pack() + halfmagicLabel.pack(anchor=W, side=LEFT, padx=(0,18)) + halfmagicEntry.pack(anchor=E) + + quartermagicFrame = Frame(itemList3) + quartermagicLabel = Label(quartermagicFrame, text='Quarter Magic') + self.quartermagicVar = StringVar(value='0') + quartermagicEntry = Entry(quartermagicFrame, textvariable=self.quartermagicVar, width=3, validate='all', vcmd=vcmd) + quartermagicFrame.pack() + quartermagicLabel.pack(anchor=W, side=LEFT) + quartermagicEntry.pack(anchor=E) + + bcap5Frame = Frame(itemList3) + bcap5Label = Label(bcap5Frame, text='Bomb C.+5') + self.bcap5Var = StringVar(value='0') + bcap5Entry = Entry(bcap5Frame, textvariable=self.bcap5Var, width=3, validate='all', vcmd=vcmd) + bcap5Frame.pack() + bcap5Label.pack(anchor=W, side=LEFT, padx=(0,16)) + bcap5Entry.pack(anchor=E) + + bcap10Frame = Frame(itemList3) + bcap10Label = Label(bcap10Frame, text='Bomb C.+10') + self.bcap10Var = StringVar(value='0') + bcap10Entry = Entry(bcap10Frame, textvariable=self.bcap10Var, width=3, validate='all', vcmd=vcmd) + bcap10Frame.pack() + bcap10Label.pack(anchor=W, side=LEFT, padx=(0,10)) + bcap10Entry.pack(anchor=E) + + acap5Frame = Frame(itemList4) + acap5Label = Label(acap5Frame, text='Arrow C.+5') + self.acap5Var = StringVar(value='0') + acap5Entry = Entry(acap5Frame, textvariable=self.acap5Var, width=3, validate='all', vcmd=vcmd) + acap5Frame.pack() + acap5Label.pack(anchor=W, side=LEFT, padx=(0,7)) + acap5Entry.pack(anchor=E) + + acap10Frame = Frame(itemList4) + acap10Label = Label(acap10Frame, text='Arrow C.+10') + self.acap10Var = StringVar(value='0') + acap10Entry = Entry(acap10Frame, textvariable=self.acap10Var, width=3, validate='all', vcmd=vcmd) + acap10Frame.pack() + acap10Label.pack(anchor=W, side=LEFT, padx=(0,1)) + acap10Entry.pack(anchor=E) + + arrow1Frame = Frame(itemList4) + arrow1Label = Label(arrow1Frame, text='Arrow (1)') + self.arrow1Var = StringVar(value='1') + arrow1Entry = Entry(arrow1Frame, textvariable=self.arrow1Var, width=3, validate='all', vcmd=vcmd) + arrow1Frame.pack() + arrow1Label.pack(anchor=W, side=LEFT, padx=(0,18)) + arrow1Entry.pack(anchor=E) + + arrow10Frame = Frame(itemList4) + arrow10Label = Label(arrow10Frame, text='Arrows (10)') + self.arrow10Var = StringVar(value='12') + arrow10Entry = Entry(arrow10Frame, textvariable=self.arrow10Var, width=3, validate='all', vcmd=vcmd) + arrow10Frame.pack() + arrow10Label.pack(anchor=W, side=LEFT, padx=(0,7)) + arrow10Entry.pack(anchor=E) + + bomb1Frame = Frame(itemList4) + bomb1Label = Label(bomb1Frame, text='Bomb (1)') + self.bomb1Var = StringVar(value='0') + bomb1Entry = Entry(bomb1Frame, textvariable=self.bomb1Var, width=3, validate='all', vcmd=vcmd) + bomb1Frame.pack() + bomb1Label.pack(anchor=W, side=LEFT, padx=(0,18)) + bomb1Entry.pack(anchor=E) + + bomb3Frame = Frame(itemList4) + bomb3Label = Label(bomb3Frame, text='Bombs (3)') + self.bomb3Var = StringVar(value='16') + bomb3Entry = Entry(bomb3Frame, textvariable=self.bomb3Var, width=3, validate='all', vcmd=vcmd) + bomb3Frame.pack() + bomb3Label.pack(anchor=W, side=LEFT, padx=(0,13)) + bomb3Entry.pack(anchor=E) + + bomb10Frame = Frame(itemList4) + bomb10Label = Label(bomb10Frame, text='Bombs (10)') + self.bomb10Var = StringVar(value='1') + bomb10Entry = Entry(bomb10Frame, textvariable=self.bomb10Var, width=3, validate='all', vcmd=vcmd) + bomb10Frame.pack() + bomb10Label.pack(anchor=W, side=LEFT, padx=(0,7)) + bomb10Entry.pack(anchor=E) + + rupee1Frame = Frame(itemList4) + rupee1Label = Label(rupee1Frame, text='Rupee (1)') + self.rupee1Var = StringVar(value='2') + rupee1Entry = Entry(rupee1Frame, textvariable=self.rupee1Var, width=3, validate='all', vcmd=vcmd) + rupee1Frame.pack() + rupee1Label.pack(anchor=W, side=LEFT, padx=(0,17)) + rupee1Entry.pack(anchor=E) + + rupee5Frame = Frame(itemList4) + rupee5Label = Label(rupee5Frame, text='Rupees (5)') + self.rupee5Var = StringVar(value='4') + rupee5Entry = Entry(rupee5Frame, textvariable=self.rupee5Var, width=3, validate='all', vcmd=vcmd) + rupee5Frame.pack() + rupee5Label.pack(anchor=W, side=LEFT, padx=(0,12)) + rupee5Entry.pack(anchor=E) + + rupee20Frame = Frame(itemList4) + rupee20Label = Label(rupee20Frame, text='Rupees (20)') + self.rupee20Var = StringVar(value='28') + rupee20Entry = Entry(rupee20Frame, textvariable=self.rupee20Var, width=3, validate='all', vcmd=vcmd) + rupee20Frame.pack() + rupee20Label.pack(anchor=W, side=LEFT, padx=(0,6)) + rupee20Entry.pack(anchor=E) + + rupee50Frame = Frame(itemList4) + rupee50Label = Label(rupee50Frame, text='Rupees (50)') + self.rupee50Var = StringVar(value='7') + rupee50Entry = Entry(rupee50Frame, textvariable=self.rupee50Var, width=3, validate='all', vcmd=vcmd) + rupee50Frame.pack() + rupee50Label.pack(anchor=W, side=LEFT, padx=(0,6)) + rupee50Entry.pack(anchor=E) + + rupee100Frame = Frame(itemList4) + rupee100Label = Label(rupee100Frame, text='Rupees (100)') + self.rupee100Var = StringVar(value='1') + rupee100Entry = Entry(rupee100Frame, textvariable=self.rupee100Var, width=3, validate='all', vcmd=vcmd) + rupee100Frame.pack() + rupee100Label.pack(anchor=W, side=LEFT, padx=(0,0)) + rupee100Entry.pack(anchor=E) + + rupee300Frame = Frame(itemList4) + rupee300Label = Label(rupee300Frame, text='Rupees (300)') + self.rupee300Var = StringVar(value='5') + rupee300Entry = Entry(rupee300Frame, textvariable=self.rupee300Var, width=3, validate='all', vcmd=vcmd) + rupee300Frame.pack() + rupee300Label.pack(anchor=W, side=LEFT, padx=(0,0)) + rupee300Entry.pack(anchor=E) + + blueclockFrame = Frame(itemList4) + blueclockLabel = Label(blueclockFrame, text='Blue Clock') + self.blueclockVar = StringVar(value='0') + blueclockEntry = Entry(blueclockFrame, textvariable=self.blueclockVar, width=3, validate='all', vcmd=vcmd) + blueclockFrame.pack() + blueclockLabel.pack(anchor=W, side=LEFT, padx=(0,11)) + blueclockEntry.pack(anchor=E) + + greenclockFrame = Frame(itemList4) + greenclockLabel = Label(greenclockFrame, text='Green Clock') + self.greenclockVar = StringVar(value='0') + greenclockEntry = Entry(greenclockFrame, textvariable=self.greenclockVar, width=3, validate='all', vcmd=vcmd) + greenclockFrame.pack() + greenclockLabel.pack(anchor=W, side=LEFT, padx=(0,3)) + greenclockEntry.pack(anchor=E) + + redclockFrame = Frame(itemList4) + redclockLabel = Label(redclockFrame, text='Red Clock') + self.redclockVar = StringVar(value='0') + redclockEntry = Entry(redclockFrame, textvariable=self.redclockVar, width=3, validate='all', vcmd=vcmd) + redclockFrame.pack() + redclockLabel.pack(anchor=W, side=LEFT, padx=(0,14)) + redclockEntry.pack(anchor=E) + + silverarrowFrame = Frame(itemList5) + silverarrowLabel = Label(silverarrowFrame, text='Silver Arrow') + self.silverarrowVar = StringVar(value='0') + silverarrowEntry = Entry(silverarrowFrame, textvariable=self.silverarrowVar, width=3, validate='all', vcmd=vcmd) + silverarrowFrame.pack() + silverarrowLabel.pack(anchor=W, side=LEFT, padx=(0,64)) + silverarrowEntry.pack(anchor=E) + + universalkeyFrame = Frame(itemList5) + universalkeyLabel = Label(universalkeyFrame, text='Universal Key') + self.universalkeyVar = StringVar(value='0') + universalkeyEntry = Entry(universalkeyFrame, textvariable=self.universalkeyVar, width=3, validate='all', vcmd=vcmd) + universalkeyFrame.pack() + universalkeyLabel.pack(anchor=W, side=LEFT, padx=(0,57)) + universalkeyEntry.pack(anchor=E) + + triforcepieceFrame = Frame(itemList5) + triforcepieceLabel = Label(triforcepieceFrame, text='Triforce Piece') + self.triforcepieceVar = StringVar(value='0') + triforcepieceEntry = Entry(triforcepieceFrame, textvariable=self.triforcepieceVar, width=3, validate='all', vcmd=vcmd) + triforcepieceFrame.pack() + triforcepieceLabel.pack(anchor=W, side=LEFT, padx=(0,55)) + triforcepieceEntry.pack(anchor=E) + + triforcecountFrame = Frame(itemList5) + triforcecountLabel = Label(triforcecountFrame, text='Triforce Pieces Required') + self.triforcecountVar = StringVar(value='0') + triforcecountEntry = Entry(triforcecountFrame, textvariable=self.triforcecountVar, width=3, validate='all', vcmd=vcmd) + triforcecountFrame.pack() + triforcecountLabel.pack(anchor=W, side=LEFT, padx=(0,0)) + triforcecountEntry.pack(anchor=E) + + triforceFrame = Frame(itemList5) + triforceLabel = Label(triforceFrame, text='Triforce (win game)') + self.triforceVar = StringVar(value='0') + triforceEntry = Entry(triforceFrame, textvariable=self.triforceVar, width=3, validate='all', vcmd=vcmd) + triforceFrame.pack() + triforceLabel.pack(anchor=W, side=LEFT, padx=(0,23)) + triforceEntry.pack(anchor=E) + + rupoorFrame = Frame(itemList5) + rupoorLabel = Label(rupoorFrame, text='Rupoor') + self.rupoorVar = StringVar(value='0') + rupoorEntry = Entry(rupoorFrame, textvariable=self.rupoorVar, width=3, validate='all', vcmd=vcmd) + rupoorFrame.pack() + rupoorLabel.pack(anchor=W, side=LEFT, padx=(0,87)) + rupoorEntry.pack(anchor=E) + + rupoorcostFrame = Frame(itemList5) + rupoorcostLabel = Label(rupoorcostFrame, text='Rupoor Cost') + self.rupoorcostVar = StringVar(value='10') + rupoorcostEntry = Entry(rupoorcostFrame, textvariable=self.rupoorcostVar, width=6, validate='all', vcmd=vcmd) + rupoorcostFrame.pack() + rupoorcostLabel.pack(anchor=W, side=LEFT, padx=(0,43)) + rupoorcostEntry.pack(anchor=E) + + itemList1.pack(side=LEFT, padx=(0,0)) + itemList2.pack(side=LEFT, padx=(0,0)) + itemList3.pack(side=LEFT, padx=(0,0)) + itemList4.pack(side=LEFT, padx=(0,0)) + itemList5.pack(side=LEFT, padx=(0,0)) + + return self From 0e57f1323550fc68300197109b10b3a65de6bb8a Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 8 Feb 2020 16:40:10 -0800 Subject: [PATCH 014/117] Hook up Gui.py to CLI args --- Gui.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Gui.py b/Gui.py index ab1de816..000f228a 100755 --- a/Gui.py +++ b/Gui.py @@ -164,4 +164,5 @@ def guiMain(args=None): mainWindow.mainloop() if __name__ == '__main__': - guiMain() + args = parse_arguments(None) + guiMain(args) From 2c91550e50e78c53ea9a34b747d87a1a01b12b25 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 8 Feb 2020 16:51:35 -0800 Subject: [PATCH 015/117] Factor out CLI args --- DungeonRandomizer.py | 302 +------------------------------------------ Gui.py | 54 +------- gui/loadcliargs.py | 52 ++++++++ 3 files changed, 56 insertions(+), 352 deletions(-) create mode 100644 gui/loadcliargs.py diff --git a/DungeonRandomizer.py b/DungeonRandomizer.py index d04d6fb5..f7b481c3 100755 --- a/DungeonRandomizer.py +++ b/DungeonRandomizer.py @@ -8,312 +8,12 @@ import textwrap import shlex import sys +from CLI import parse_arguments from Main import main from Rom import get_sprite_from_name from Utils import is_bundled, close_console from Fill import FillError - -class ArgumentDefaultsHelpFormatter(argparse.RawTextHelpFormatter): - - def _get_help_string(self, action): - return textwrap.dedent(action.help) - -def parse_arguments(argv, no_defaults=False): - def defval(value): - return value if not no_defaults else None - - # we need to know how many players we have first - parser = argparse.ArgumentParser(add_help=False) - parser.add_argument('--multi', default=defval(1), type=lambda value: min(max(int(value), 1), 255)) - multiargs, _ = parser.parse_known_args(argv) - - parser = argparse.ArgumentParser(formatter_class=ArgumentDefaultsHelpFormatter) - parser.add_argument('--create_spoiler', help='Output a Spoiler File', action='store_true') - parser.add_argument('--logic', default=defval('noglitches'), const='noglitches', nargs='?', choices=['noglitches', 'minorglitches', 'nologic'], - help='''\ - Select Enforcement of Item Requirements. (default: %(default)s) - No Glitches: - Minor Glitches: May require Fake Flippers, Bunny Revival - and Dark Room Navigation. - No Logic: Distribute items without regard for - item requirements. - ''') - parser.add_argument('--mode', default=defval('open'), const='open', nargs='?', choices=['standard', 'open', 'inverted'], - help='''\ - Select game mode. (default: %(default)s) - Open: World starts with Zelda rescued. - Standard: Fixes Hyrule Castle Secret Entrance and Front Door - but may lead to weird rain state issues if you exit - through the Hyrule Castle side exits before rescuing - Zelda in a full shuffle. - Inverted: Starting locations are Dark Sanctuary in West Dark - World or at Link's House, which is shuffled freely. - Requires the moon pearl to be Link in the Light World - instead of a bunny. - ''') - parser.add_argument('--swords', default=defval('random'), const='random', nargs='?', choices= ['random', 'assured', 'swordless', 'vanilla'], - help='''\ - Select sword placement. (default: %(default)s) - Random: All swords placed randomly. - Assured: Start game with a sword already. - Swordless: No swords. Curtains in Skull Woods and Agahnim\'s - Tower are removed, Agahnim\'s Tower barrier can be - destroyed with hammer. Misery Mire and Turtle Rock - can be opened without a sword. Hammer damages Ganon. - Ether and Bombos Tablet can be activated with Hammer - (and Book). Bombos pads have been added in Ice - Palace, to allow for an alternative to firerod. - Vanilla: Swords are in vanilla locations. - ''') - parser.add_argument('--goal', default=defval('ganon'), const='ganon', nargs='?', choices=['ganon', 'pedestal', 'dungeons', 'triforcehunt', 'crystals'], - help='''\ - Select completion goal. (default: %(default)s) - Ganon: Collect all crystals, beat Agahnim 2 then - defeat Ganon. - Crystals: Collect all crystals then defeat Ganon. - Pedestal: Places the Triforce at the Master Sword Pedestal. - All Dungeons: Collect all crystals, pendants, beat both - Agahnim fights and then defeat Ganon. - Triforce Hunt: Places 30 Triforce Pieces in the world, collect - 20 of them to beat the game. - ''') - parser.add_argument('--difficulty', default=defval('normal'), const='normal', nargs='?', choices=['normal', 'hard', 'expert'], - help='''\ - Select game difficulty. Affects available itempool. (default: %(default)s) - Normal: Normal difficulty. - Hard: A harder setting with less equipment and reduced health. - Expert: A harder yet setting with minimum equipment and health. - ''') - parser.add_argument('--item_functionality', default=defval('normal'), const='normal', nargs='?', choices=['normal', 'hard', 'expert'], - help='''\ - Select limits on item functionality to increase difficulty. (default: %(default)s) - Normal: Normal functionality. - Hard: Reduced functionality. - Expert: Greatly reduced functionality. - ''') - parser.add_argument('--timer', default=defval('none'), const='normal', nargs='?', choices=['none', 'display', 'timed', 'timed-ohko', 'ohko', 'timed-countdown'], - help='''\ - Select game timer setting. Affects available itempool. (default: %(default)s) - None: No timer. - Display: Displays a timer but does not affect - the itempool. - Timed: Starts with clock at zero. Green Clocks - subtract 4 minutes (Total: 20), Blue Clocks - subtract 2 minutes (Total: 10), Red Clocks add - 2 minutes (Total: 10). Winner is player with - lowest time at the end. - Timed OHKO: Starts clock at 10 minutes. Green Clocks add - 5 minutes (Total: 25). As long as clock is at 0, - Link will die in one hit. - OHKO: Like Timed OHKO, but no clock items are present - and the clock is permenantly at zero. - Timed Countdown: Starts with clock at 40 minutes. Same clocks as - Timed mode. If time runs out, you lose (but can - still keep playing). - ''') - parser.add_argument('--progressive', default=defval('on'), const='normal', nargs='?', choices=['on', 'off', 'random'], - help='''\ - Select progressive equipment setting. Affects available itempool. (default: %(default)s) - On: Swords, Shields, Armor, and Gloves will - all be progressive equipment. Each subsequent - item of the same type the player finds will - upgrade that piece of equipment by one stage. - Off: Swords, Shields, Armor, and Gloves will not - be progressive equipment. Higher level items may - be found at any time. Downgrades are not possible. - Random: Swords, Shields, Armor, and Gloves will, per - category, be randomly progressive or not. - Link will die in one hit. - ''') - parser.add_argument('--algorithm', default=defval('balanced'), const='balanced', nargs='?', choices=['freshness', 'flood', 'vt21', 'vt22', 'vt25', 'vt26', 'balanced'], - help='''\ - Select item filling algorithm. (default: %(default)s - balanced: vt26 derivative that aims to strike a balance between - the overworld heavy vt25 and the dungeon heavy vt26 - algorithm. - vt26: Shuffle items and place them in a random location - that it is not impossible to be in. This includes - dungeon keys and items. - vt25: Shuffle items and place them in a random location - that it is not impossible to be in. - vt21: Unbiased in its selection, but has tendency to put - Ice Rod in Turtle Rock. - vt22: Drops off stale locations after 1/3 of progress - items were placed to try to circumvent vt21\'s - shortcomings. - Freshness: Keep track of stale locations (ones that cannot be - reached yet) and decrease likeliness of selecting - them the more often they were found unreachable. - Flood: Push out items starting from Link\'s House and - slightly biased to placing progression items with - less restrictions. - ''') - parser.add_argument('--shuffle', default=defval('vanilla'), const='full', nargs='?', choices=['vanilla', 'simple', 'restricted', 'full', 'crossed', 'insanity', 'restricted_legacy', 'full_legacy', 'madness_legacy', 'insanity_legacy', 'dungeonsfull', 'dungeonssimple'], - help='''\ - Select Entrance Shuffling Algorithm. (default: %(default)s) - Full: Mix cave and dungeon entrances freely while limiting - multi-entrance caves to one world. - Simple: Shuffle Dungeon Entrances/Exits between each other - and keep all 4-entrance dungeons confined to one - location. All caves outside of death mountain are - shuffled in pairs and matched by original type. - Restricted: Use Dungeons shuffling from Simple but freely - connect remaining entrances. - Crossed: Mix cave and dungeon entrances freely while allowing - caves to cross between worlds. - Insanity: Decouple entrances and exits from each other and - shuffle them freely. Caves that used to be single - entrance will still exit to the same location from - which they are entered. - Vanilla: All entrances are in the same locations they were - in the base game. - Legacy shuffles preserve behavior from older versions of the - entrance randomizer including significant technical limitations. - The dungeon variants only mix up dungeons and keep the rest of - the overworld vanilla. - ''') - parser.add_argument('--door_shuffle', default=defval('basic'), const='vanilla', nargs='?', choices=['vanilla', 'basic', 'crossed', 'experimental'], - help='''\ - Select Door Shuffling Algorithm. (default: %(default)s) - Basic: Doors are mixed within a single dungeon. - (Not yet implemented) - Crossed: Doors are mixed between all dungeons. - (Not yet implemented) - Vanilla: All doors are connected the same way they were in the - base game. - Experimental: Experimental mixes live here. Use at your own risk. - ''') - parser.add_argument('--crystals_ganon', default=defval('7'), const='7', nargs='?', choices=['random', '0', '1', '2', '3', '4', '5', '6', '7'], - help='''\ - How many crystals are needed to defeat ganon. Any other - requirements for ganon for the selected goal still apply. - This setting does not apply when the all dungeons goal is - selected. (default: %(default)s) - Random: Picks a random value between 0 and 7 (inclusive). - 0-7: Number of crystals needed - ''') - parser.add_argument('--crystals_gt', default=defval('7'), const='7', nargs='?', choices=['random', '0', '1', '2', '3', '4', '5', '6', '7'], - help='''\ - How many crystals are needed to open GT. For inverted mode - this applies to the castle tower door instead. (default: %(default)s) - Random: Picks a random value between 0 and 7 (inclusive). - 0-7: Number of crystals needed - ''') - parser.add_argument('--openpyramid', default=defval(False), help='''\ - Pre-opens the pyramid hole, this removes the Agahnim 2 requirement for it - ''', action='store_true') - parser.add_argument('--rom', default=defval('Zelda no Densetsu - Kamigami no Triforce (Japan).sfc'), help='Path to an ALttP JAP(1.0) rom to use as a base.') - parser.add_argument('--loglevel', default=defval('info'), const='info', nargs='?', choices=['error', 'info', 'warning', 'debug'], help='Select level of logging for output.') - parser.add_argument('--seed', help='Define seed number to generate.', type=int) - parser.add_argument('--count', help='''\ - Use to batch generate multiple seeds with same settings. - If --seed is provided, it will be used for the first seed, then - used to derive the next seed (i.e. generating 10 seeds with - --seed given will produce the same 10 (different) roms each - time). - ''', type=int) - parser.add_argument('--fastmenu', default=defval('normal'), const='normal', nargs='?', choices=['normal', 'instant', 'double', 'triple', 'quadruple', 'half'], - help='''\ - Select the rate at which the menu opens and closes. - (default: %(default)s) - ''') - parser.add_argument('--quickswap', default=defval(False), help='Enable quick item swapping with L and R.', action='store_true') - parser.add_argument('--disablemusic', default=defval(False), help='Disables game music.', action='store_true') - parser.add_argument('--mapshuffle', default=defval(False), help='Maps are no longer restricted to their dungeons, but can be anywhere', action='store_true') - parser.add_argument('--compassshuffle', default=defval(False), help='Compasses are no longer restricted to their dungeons, but can be anywhere', action='store_true') - parser.add_argument('--keyshuffle', default=defval(False), help='Small Keys are no longer restricted to their dungeons, but can be anywhere', action='store_true') - parser.add_argument('--bigkeyshuffle', default=defval(False), help='Big Keys are no longer restricted to their dungeons, but can be anywhere', action='store_true') - parser.add_argument('--keysanity', default=defval(False), help=argparse.SUPPRESS, action='store_true') - parser.add_argument('--retro', default=defval(False), help='''\ - Keys are universal, shooting arrows costs rupees, - and a few other little things make this more like Zelda-1. - ''', action='store_true') - parser.add_argument('--startinventory', default=defval(''), help='Specifies a list of items that will be in your starting inventory (separated by commas)') - parser.add_argument('--custom', default=defval(False), help='Not supported.') - parser.add_argument('--customitemarray', default=defval(False), help='Not supported.') - parser.add_argument('--accessibility', default=defval('items'), const='items', nargs='?', choices=['items', 'locations', 'none'], help='''\ - Select Item/Location Accessibility. (default: %(default)s) - Items: You can reach all unique inventory items. No guarantees about - reaching all locations or all keys. - Locations: You will be able to reach every location in the game. - None: You will be able to reach enough locations to beat the game. - ''') - parser.add_argument('--hints', default=defval(False), help='''\ - Make telepathic tiles and storytellers give helpful hints. - ''', action='store_true') - # included for backwards compatibility - parser.add_argument('--shuffleganon', help=argparse.SUPPRESS, action='store_true', default=defval(True)) - parser.add_argument('--no-shuffleganon', help='''\ - If set, the Pyramid Hole and Ganon's Tower are not - included entrance shuffle pool. - ''', action='store_false', dest='shuffleganon') - parser.add_argument('--heartbeep', default=defval('normal'), const='normal', nargs='?', choices=['double', 'normal', 'half', 'quarter', 'off'], - help='''\ - Select the rate at which the heart beep sound is played at - low health. (default: %(default)s) - ''') - parser.add_argument('--heartcolor', default=defval('red'), const='red', nargs='?', choices=['red', 'blue', 'green', 'yellow', 'random'], - help='Select the color of Link\'s heart meter. (default: %(default)s)') - parser.add_argument('--ow_palettes', default=defval('default'), choices=['default', 'random', 'blackout']) - parser.add_argument('--uw_palettes', default=defval('default'), choices=['default', 'random', 'blackout']) - parser.add_argument('--sprite', help='''\ - Path to a sprite sheet to use for Link. Needs to be in - binary format and have a length of 0x7000 (28672) bytes, - or 0x7078 (28792) bytes including palette data. - Alternatively, can be a ALttP Rom patched with a Link - sprite that will be extracted. - ''') - parser.add_argument('--suppress_rom', help='Do not create an output rom file.', action='store_true') - parser.add_argument('--gui', help='Launch the GUI', action='store_true') - parser.add_argument('--jsonout', action='store_true', help='''\ - Output .json patch to stdout instead of a patched rom. Used - for VT site integration, do not use otherwise. - ''') - parser.add_argument('--skip_playthrough', action='store_true', default=defval(False)) - parser.add_argument('--enemizercli', default=defval('EnemizerCLI/EnemizerCLI.Core')) - parser.add_argument('--shufflebosses', default=defval('none'), choices=['none', 'basic', 'normal', 'chaos']) - parser.add_argument('--shuffleenemies', default=defval('none'), choices=['none', 'shuffled', 'chaos']) - parser.add_argument('--enemy_health', default=defval('default'), choices=['default', 'easy', 'normal', 'hard', 'expert']) - parser.add_argument('--enemy_damage', default=defval('default'), choices=['default', 'shuffled', 'chaos']) - parser.add_argument('--shufflepots', default=defval(False), action='store_true') - parser.add_argument('--beemizer', default=defval(0), type=lambda value: min(max(int(value), 0), 4)) - parser.add_argument('--remote_items', default=defval(False), action='store_true') - parser.add_argument('--multi', default=defval(1), type=lambda value: min(max(int(value), 1), 255)) - parser.add_argument('--names', default=defval('')) - parser.add_argument('--teams', default=defval(1), type=lambda value: max(int(value), 1)) - parser.add_argument('--outputpath') - parser.add_argument('--race', default=defval(False), action='store_true') - parser.add_argument('--outputname') - - if multiargs.multi: - for player in range(1, multiargs.multi + 1): - parser.add_argument(f'--p{player}', default=defval(''), help=argparse.SUPPRESS) - - ret = parser.parse_args(argv) - if ret.keysanity: - ret.mapshuffle, ret.compassshuffle, ret.keyshuffle, ret.bigkeyshuffle = [True] * 4 - - if multiargs.multi: - defaults = copy.deepcopy(ret) - for player in range(1, multiargs.multi + 1): - playerargs = parse_arguments(shlex.split(getattr(ret,f"p{player}")), True) - - for name in ['logic', 'mode', 'swords', 'goal', 'difficulty', 'item_functionality', - 'shuffle', 'door_shuffle', 'crystals_ganon', 'crystals_gt', 'openpyramid', - 'mapshuffle', 'compassshuffle', 'keyshuffle', 'bigkeyshuffle', 'startinventory', - 'retro', 'accessibility', 'hints', 'beemizer', - 'shufflebosses', 'shuffleenemies', 'enemy_health', 'enemy_damage', 'shufflepots', - 'ow_palettes', 'uw_palettes', 'sprite', 'disablemusic', 'quickswap', 'fastmenu', 'heartcolor', 'heartbeep', - 'remote_items']: - value = getattr(defaults, name) if getattr(playerargs, name) is None else getattr(playerargs, name) - if player == 1: - setattr(ret, name, {1: value}) - else: - getattr(ret, name)[player] = value - - return ret - def start(): args = parse_arguments(None) diff --git a/Gui.py b/Gui.py index 000f228a..02db9e42 100755 --- a/Gui.py +++ b/Gui.py @@ -14,6 +14,7 @@ from AdjusterMain import adjust from DungeonRandomizer import parse_arguments from gui.adjust.overview import adjust_page from gui.custom.overview import custom_page +from gui.loadcliargs import loadcliargs from gui.randomize.item import item_page from gui.randomize.entrando import entrando_page from gui.randomize.enemizer import enemizer_page @@ -109,57 +110,8 @@ def guiMain(args=None): return False vcmd=(self.customContent.register(validation), '%P') - if args is not None: - for k,v in vars(args).items(): - if type(v) is dict: - setattr(args, k, v[1]) # only get values for player 1 for now - # load values from commandline args - self.generationSetupWindow.createSpoilerVar.set(int(args.create_spoiler)) - self.generationSetupWindow.suppressRomVar.set(int(args.suppress_rom)) - self.dungeonRandoWindow.mapshuffleVar.set(args.mapshuffle) - self.dungeonRandoWindow.compassshuffleVar.set(args.compassshuffle) - self.dungeonRandoWindow.keyshuffleVar.set(args.keyshuffle) - self.dungeonRandoWindow.bigkeyshuffleVar.set(args.bigkeyshuffle) - self.itemWindow.retroVar.set(args.retro) - self.entrandoWindow.openpyramidVar.set(args.openpyramid) - self.gameOptionsWindow.quickSwapVar.set(int(args.quickswap)) - self.gameOptionsWindow.disableMusicVar.set(int(args.disablemusic)) - if args.multi: - self.multiworldWindow.worldVar.set(str(args.multi)) - if args.count: - self.farBottomFrame.countVar.set(str(args.count)) - if args.seed: - self.farBottomFrame.seedVar.set(str(args.seed)) - self.itemWindow.modeVar.set(args.mode) - self.itemWindow.swordVar.set(args.swords) - self.itemWindow.difficultyVar.set(args.difficulty) - self.itemWindow.itemfunctionVar.set(args.item_functionality) - self.itemWindow.timerVar.set(args.timer) - self.itemWindow.progressiveVar.set(args.progressive) - self.itemWindow.accessibilityVar.set(args.accessibility) - self.itemWindow.goalVar.set(args.goal) - self.itemWindow.crystalsGTVar.set(args.crystals_gt) - self.itemWindow.crystalsGanonVar.set(args.crystals_ganon) - self.itemWindow.algorithmVar.set(args.algorithm) - self.entrandoWindow.shuffleVar.set(args.shuffle) - self.dungeonRandoWindow.doorShuffleVar.set(args.door_shuffle) - self.gameOptionsWindow.heartcolorVar.set(args.heartcolor) - self.gameOptionsWindow.heartbeepVar.set(args.heartbeep) - self.gameOptionsWindow.fastMenuVar.set(args.fastmenu) - self.itemWindow.logicVar.set(args.logic) - self.generationSetupWindow.romVar.set(args.rom) - self.entrandoWindow.shuffleGanonVar.set(args.shuffleganon) - self.gameOptionsWindow.hintsVar.set(args.hints) - self.enemizerWindow.enemizerCLIpathVar.set(args.enemizercli) - self.enemizerWindow.potShuffleVar.set(args.shufflepots) - self.enemizerWindow.enemyShuffleVar.set(args.shuffleenemies) - self.enemizerWindow.enemizerBossVar.set(args.shufflebosses) - self.enemizerWindow.enemizerDamageVar.set(args.enemy_damage) - self.enemizerWindow.enemizerHealthVar.set(args.enemy_health) - self.gameOptionsWindow.owPalettesVar.set(args.ow_palettes) - self.gameOptionsWindow.uwPalettesVar.set(args.uw_palettes) -# if args.sprite is not None: -# self.gameOptionsWindow.set_sprite(Sprite(args.sprite)) + # load args from CLI into options + loadcliargs(self,args) mainWindow.mainloop() diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py new file mode 100644 index 00000000..4b8fb2c4 --- /dev/null +++ b/gui/loadcliargs.py @@ -0,0 +1,52 @@ +def loadcliargs(gui,args): + if args is not None: + for k,v in vars(args).items(): + if type(v) is dict: + setattr(args, k, v[1]) # only get values for player 1 for now + # load values from commandline args + gui.generationSetupWindow.createSpoilerVar.set(int(args.create_spoiler)) + gui.generationSetupWindow.suppressRomVar.set(int(args.suppress_rom)) + gui.dungeonRandoWindow.mapshuffleVar.set(args.mapshuffle) + gui.dungeonRandoWindow.compassshuffleVar.set(args.compassshuffle) + gui.dungeonRandoWindow.keyshuffleVar.set(args.keyshuffle) + gui.dungeonRandoWindow.bigkeyshuffleVar.set(args.bigkeyshuffle) + gui.itemWindow.retroVar.set(args.retro) + gui.entrandoWindow.openpyramidVar.set(args.openpyramid) + gui.gameOptionsWindow.quickSwapVar.set(int(args.quickswap)) + gui.gameOptionsWindow.disableMusicVar.set(int(args.disablemusic)) + if args.multi: + gui.multiworldWindow.worldVar.set(str(args.multi)) + if args.count: + gui.farBottomFrame.countVar.set(str(args.count)) + if args.seed: + gui.farBottomFrame.seedVar.set(str(args.seed)) + gui.itemWindow.modeVar.set(args.mode) + gui.itemWindow.swordVar.set(args.swords) + gui.itemWindow.difficultyVar.set(args.difficulty) + gui.itemWindow.itemfunctionVar.set(args.item_functionality) + gui.itemWindow.timerVar.set(args.timer) + gui.itemWindow.progressiveVar.set(args.progressive) + gui.itemWindow.accessibilityVar.set(args.accessibility) + gui.itemWindow.goalVar.set(args.goal) + gui.itemWindow.crystalsGTVar.set(args.crystals_gt) + gui.itemWindow.crystalsGanonVar.set(args.crystals_ganon) + gui.itemWindow.algorithmVar.set(args.algorithm) + gui.entrandoWindow.shuffleVar.set(args.shuffle) + gui.dungeonRandoWindow.doorShuffleVar.set(args.door_shuffle) + gui.gameOptionsWindow.heartcolorVar.set(args.heartcolor) + gui.gameOptionsWindow.heartbeepVar.set(args.heartbeep) + gui.gameOptionsWindow.fastMenuVar.set(args.fastmenu) + gui.itemWindow.logicVar.set(args.logic) + gui.generationSetupWindow.romVar.set(args.rom) + gui.entrandoWindow.shuffleGanonVar.set(args.shuffleganon) + gui.gameOptionsWindow.hintsVar.set(args.hints) + gui.enemizerWindow.enemizerCLIpathVar.set(args.enemizercli) + gui.enemizerWindow.potShuffleVar.set(args.shufflepots) + gui.enemizerWindow.enemyShuffleVar.set(args.shuffleenemies) + gui.enemizerWindow.enemizerBossVar.set(args.shufflebosses) + gui.enemizerWindow.enemizerDamageVar.set(args.enemy_damage) + gui.enemizerWindow.enemizerHealthVar.set(args.enemy_health) + gui.gameOptionsWindow.owPalettesVar.set(args.ow_palettes) + gui.gameOptionsWindow.uwPalettesVar.set(args.uw_palettes) +# if args.sprite is not None: +# gui.gameOptionsWindow.set_sprite(Sprite(args.sprite)) \ No newline at end of file From 03431f0b83a5f32e285c72cb6759f4cefca82383 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 8 Feb 2020 19:01:15 -0800 Subject: [PATCH 016/117] Implement save system Add to .gitignore Add to default CLI args Add to each page that needs it * Rom Adjuster * Seed * Generation attempts * Enemizer CLI path * Base ROM * Multiworld worlds * Multiworld names --- .gitignore | 2 ++ CLI.py | 17 ++++++++++------- Gui.py | 32 ++++++++++++++++++++++++++++---- gui/adjust/overview.py | 9 ++++----- gui/bottom.py | 16 ++++++---------- gui/randomize/enemizer.py | 11 +++++------ gui/randomize/generation.py | 9 ++++----- gui/randomize/multiworld.py | 13 +++++-------- 8 files changed, 64 insertions(+), 45 deletions(-) diff --git a/.gitignore b/.gitignore index 8c5d8669..c242b833 100644 --- a/.gitignore +++ b/.gitignore @@ -18,5 +18,7 @@ EnemizerCLI/ RaceRom.py weights/ +working_dirs.json + venv test diff --git a/CLI.py b/CLI.py index 2f18d21e..d29a3b41 100644 --- a/CLI.py +++ b/CLI.py @@ -23,6 +23,9 @@ def parse_arguments(argv, no_defaults=False): def defval(value): return value if not no_defaults else None + # get working dirs + working_dirs = get_working_dirs() + # we need to know how many players we have first parser = argparse.ArgumentParser(add_help=False) parser.add_argument('--multi', default=defval(1), type=lambda value: min(max(int(value), 1), 255)) @@ -203,10 +206,10 @@ def parse_arguments(argv, no_defaults=False): parser.add_argument('--openpyramid', default=defval(False), help='''\ Pre-opens the pyramid hole, this removes the Agahnim 2 requirement for it ''', action='store_true') - parser.add_argument('--rom', default=defval('Zelda no Densetsu - Kamigami no Triforce (Japan).sfc'), help='Path to an ALttP JAP(1.0) rom to use as a base.') + parser.add_argument('--rom', default=defval(working_dirs["rom.base"]), help='Path to an ALttP JAP(1.0) rom to use as a base.') parser.add_argument('--loglevel', default=defval('info'), const='info', nargs='?', choices=['error', 'info', 'warning', 'debug'], help='Select level of logging for output.') - parser.add_argument('--seed', help='Define seed number to generate.', type=int) - parser.add_argument('--count', help='''\ + parser.add_argument('--seed', default=defval(int(working_dirs["gen.seed"]) if working_dirs["gen.seed"] is not "" and working_dirs["gen.seed"] is not None else None), help='Define seed number to generate.', type=int) + parser.add_argument('--count', default=defval(int(working_dirs["gen.count"])), help='''\ Use to batch generate multiple seeds with same settings. If --seed is provided, it will be used for the first seed, then used to derive the next seed (i.e. generating 10 seeds with @@ -271,7 +274,7 @@ def parse_arguments(argv, no_defaults=False): for VT site integration, do not use otherwise. ''') parser.add_argument('--skip_playthrough', action='store_true', default=defval(False)) - parser.add_argument('--enemizercli', default=defval('EnemizerCLI/EnemizerCLI.Core')) + parser.add_argument('--enemizercli', default=defval(working_dirs["enemizer.cli"])) parser.add_argument('--shufflebosses', default=defval('none'), choices=['none', 'basic', 'normal', 'chaos']) parser.add_argument('--shuffleenemies', default=defval('none'), choices=['none', 'shuffled', 'chaos']) parser.add_argument('--enemy_health', default=defval('default'), choices=['default', 'easy', 'normal', 'hard', 'expert']) @@ -279,10 +282,10 @@ def parse_arguments(argv, no_defaults=False): parser.add_argument('--shufflepots', default=defval(False), action='store_true') parser.add_argument('--beemizer', default=defval(0), type=lambda value: min(max(int(value), 0), 4)) parser.add_argument('--remote_items', default=defval(False), action='store_true') - parser.add_argument('--multi', default=defval(1), type=lambda value: min(max(int(value), 1), 255)) - parser.add_argument('--names', default=defval('')) + parser.add_argument('--multi', default=defval(working_dirs["multi.worlds"]), type=lambda value: min(max(int(value), 1), 255)) + parser.add_argument('--names', default=defval(working_dirs["multi.names"])) parser.add_argument('--teams', default=defval(1), type=lambda value: max(int(value), 1)) - parser.add_argument('--outputpath') + parser.add_argument('--outputpath', default=defval(working_dirs["outputpath"])) parser.add_argument('--race', default=defval(False), action='store_true') parser.add_argument('--outputname') diff --git a/Gui.py b/Gui.py index 02db9e42..cd7ae882 100755 --- a/Gui.py +++ b/Gui.py @@ -6,11 +6,13 @@ import logging import random import os import shutil +import sys from tkinter import Checkbutton, OptionMenu, Toplevel, LabelFrame, PhotoImage, Tk, LEFT, RIGHT, BOTTOM, TOP, StringVar, IntVar, Frame, Label, W, E, X, BOTH, Entry, Spinbox, Button, filedialog, messagebox, ttk from urllib.parse import urlparse from urllib.request import urlopen from AdjusterMain import adjust +from CLI import get_working_dirs from DungeonRandomizer import parse_arguments from gui.adjust.overview import adjust_page from gui.custom.overview import custom_page @@ -30,12 +32,34 @@ from Utils import is_bundled, local_path, output_path, open_file def guiMain(args=None): + # save working dirs + def save_working_dirs(): + user_resources_path = os.path.join(".","resources","user") + working_dirs_path = os.path.join(user_resources_path) + if not os.path.exists(working_dirs_path): + os.makedirs(working_dirs_path) + with open(os.path.join(working_dirs_path,"working_dirs.json"),"w+") as f: + f.write(json.dumps(self.working_dirs,indent=2)) + os.chmod(os.path.join(working_dirs_path,"working_dirs.json"),0o755) + + # routine for exiting the app + def guiExit(): + save_working_dirs() + sys.exit(0) + + # make main window + # add program title & version number mainWindow = Tk() self = mainWindow mainWindow.wm_title("Door Shuffle %s" % ESVersion) + mainWindow.protocol("WM_DELETE_WINDOW",guiExit) # intercept when user clicks the X + # set program icon set_icon(mainWindow) + # get working dirs + self.working_dirs = get_working_dirs() + notebook = ttk.Notebook(self) self.randomizerWindow = ttk.Frame(notebook) self.adjustWindow = ttk.Frame(notebook) @@ -67,7 +91,7 @@ def guiMain(args=None): self.randomizerNotebook.add(self.entrandoWindow, text="Entrances") # Enemizer - self.enemizerWindow = enemizer_page(self.randomizerNotebook) + self.enemizerWindow,self.working_dirs = enemizer_page(self.randomizerNotebook,self.working_dirs) self.randomizerNotebook.add(self.enemizerWindow, text="Enemizer") # Dungeon Shuffle @@ -75,7 +99,7 @@ def guiMain(args=None): self.randomizerNotebook.add(self.dungeonRandoWindow, text="Dungeon Shuffle") # Multiworld - self.multiworldWindow = multiworld_page(self.randomizerNotebook) + self.multiworldWindow,self.working_dirs = multiworld_page(self.randomizerNotebook,self.working_dirs) self.randomizerNotebook.add(self.multiworldWindow, text="Multiworld") # Game Options @@ -83,7 +107,7 @@ def guiMain(args=None): self.randomizerNotebook.add(self.gameOptionsWindow, text="Game Options") # Generation Setup - self.generationSetupWindow = generation_page(self.randomizerNotebook) + self.generationSetupWindow,self.working_dirs = generation_page(self.randomizerNotebook,self.working_dirs) self.randomizerNotebook.add(self.generationSetupWindow, text="Generation Setup") # add randomizer notebook to main window @@ -95,7 +119,7 @@ def guiMain(args=None): self.farBottomFrame.pack(side=BOTTOM, fill=X, padx=5, pady=5) # Adjuster Controls - self.adjustContent = adjust_page(self,self.adjustWindow) + self.adjustContent,self.working_dirs = adjust_page(self,self.adjustWindow,self.working_dirs) # self.adjustContent,self.working_dirs = adjust_page(self,self.adjustWindow,self.working_dirs) self.adjustContent.pack(side=TOP, fill=BOTH, expand=True) diff --git a/gui/adjust/overview.py b/gui/adjust/overview.py index 7344c2f1..842a9b37 100644 --- a/gui/adjust/overview.py +++ b/gui/adjust/overview.py @@ -4,7 +4,7 @@ from argparse import Namespace from classes.SpriteSelector import SpriteSelector import logging -def adjust_page(top,parent):#,working_dirs): +def adjust_page(top,parent,working_dirs): self = ttk.Frame(parent) # Disable BGM @@ -101,14 +101,13 @@ def adjust_page(top,parent):#,working_dirs): adjustRomFrame = Frame(bottomAdjustFrame) adjustRomLabel = Label(adjustRomFrame, text='Rom to adjust: ') - self.romVar2 = StringVar() -# romVar2 = StringVar(value=working_dirs["adjust.rom"]) + self.romVar2 = StringVar(value=working_dirs["adjust.rom"]) romEntry2 = Entry(adjustRomFrame, textvariable=self.romVar2) def RomSelect2(): rom = filedialog.askopenfilename(filetypes=[("Rom Files", (".sfc", ".smc")), ("All Files", "*")]) if rom: -# working_dirs["adjust.rom"] = rom + working_dirs["adjust.rom"] = rom self.romVar2.set(rom) romSelectButton2 = Button(adjustRomFrame, text='Select Rom', command=RomSelect2) @@ -140,4 +139,4 @@ def adjust_page(top,parent):#,working_dirs): adjustButton = Button(bottomAdjustFrame, text='Adjust Rom', command=adjustRom) adjustButton.pack(side=BOTTOM, padx=(5, 0)) - return self#,working_dirs + return self,working_dirs diff --git a/gui/bottom.py b/gui/bottom.py index 25e38979..205bd16d 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -8,26 +8,23 @@ from Main import main from Utils import local_path, output_path, open_file def bottom_frame(self,parent,args=None): -# working_dirs = get_working_dirs() - self = ttk.Frame(parent) seedCountFrame = Frame(self) seedCountFrame.pack() ## Seed # seedLabel = Label(self, text='Seed #') -# self.seedVar = StringVar(value=parent.working_dirs["gen.seed"]) - self.seedVar = StringVar() + savedSeed = parent.working_dirs["gen.seed"] + self.seedVar = StringVar(value=savedSeed) def saveSeed(caller,_,mode): - pass -# parent.working_dirs["gen.seed"] = self.seedVar.get() + savedSeed = self.seedVar.get() + parent.working_dirs["gen.seed"] = int(savedSeed) if savedSeed.isdigit() else None self.seedVar.trace_add("write",saveSeed) seedEntry = Entry(self, width=15, textvariable=self.seedVar) seedLabel.pack(side=LEFT) seedEntry.pack(side=LEFT) ## Number of Generation attempts countLabel = Label(self, text='Count') -# self.countVar = StringVar(value=working_dirs["gen.count"]) - self.countVar = StringVar() + self.countVar = StringVar(value=parent.working_dirs["gen.count"]) countSpinbox = Spinbox(self, from_=1, to=100, width=5, textvariable=self.countVar) countLabel.pack(side=LEFT) countSpinbox.pack(side=LEFT) @@ -118,8 +115,7 @@ def bottom_frame(self,parent,args=None): if args and args.outputpath: open_file(output_path(args.outputpath)) else: - open_file(output_path(".")) -# open_file(output_path(working_dirs["outputpath"])) + open_file(output_path(parent.working_dirs["outputpath"])) openOutputButton = Button(self, text='Open Output Directory', command=open_output) openOutputButton.pack(side=RIGHT) diff --git a/gui/randomize/enemizer.py b/gui/randomize/enemizer.py index 9b0e7340..dfab0537 100644 --- a/gui/randomize/enemizer.py +++ b/gui/randomize/enemizer.py @@ -1,7 +1,7 @@ import os from tkinter import ttk, filedialog, IntVar, StringVar, Button, Checkbutton, Entry, Frame, Label, LabelFrame, OptionMenu, E, W, LEFT, RIGHT, X -def enemizer_page(parent):#,working_dirs): +def enemizer_page(parent,working_dirs): self = ttk.Frame(parent) # Enemizer @@ -16,10 +16,9 @@ def enemizer_page(parent):#,working_dirs): enemizerPathFrame.grid(row=0, column=0, columnspan=3, sticky=W+E) enemizerCLIlabel = Label(enemizerPathFrame, text="EnemizerCLI path: ") enemizerCLIlabel.pack(side=LEFT) - self.enemizerCLIpathVar = StringVar() + self.enemizerCLIpathVar = StringVar(value=working_dirs["enemizer.cli"]) def saveEnemizerPath(caller,_,mode): - pass - #working_dirs["enemizer.cli"] = self.enemizerCLIpathVar.get() + working_dirs["enemizer.cli"] = self.enemizerCLIpathVar.get() self.enemizerCLIpathVar.trace_add("write",saveEnemizerPath) enemizerCLIpathEntry = Entry(enemizerPathFrame, textvariable=self.enemizerCLIpathVar) enemizerCLIpathEntry.pack(side=LEFT, fill=X, expand=True) @@ -27,7 +26,7 @@ def enemizer_page(parent):#,working_dirs): path = filedialog.askopenfilename(filetypes=[("EnemizerCLI executable", "*EnemizerCLI*")], initialdir=os.path.join(".")) if path: self.enemizerCLIpathVar.set(path) - #working_dirs["enemizer.cli"] = path + working_dirs["enemizer.cli"] = path enemizerCLIbrowseButton = Button(enemizerPathFrame, text='...', command=EnemizerSelectPath) enemizerCLIbrowseButton.pack(side=LEFT) @@ -76,4 +75,4 @@ def enemizer_page(parent):#,working_dirs): enemizerHealthOption = OptionMenu(enemizerHealthFrame, self.enemizerHealthVar, 'default', 'easy', 'normal', 'hard', 'expert') enemizerHealthOption.pack(side=LEFT) - return self#,working_dirs + return self,working_dirs diff --git a/gui/randomize/generation.py b/gui/randomize/generation.py index 9082d229..b0f7a565 100644 --- a/gui/randomize/generation.py +++ b/gui/randomize/generation.py @@ -1,7 +1,7 @@ import os from tkinter import ttk, filedialog, IntVar, StringVar, Button, Checkbutton, Entry, Frame, Label, E, W, LEFT, RIGHT, X -def generation_page(parent):#,working_dirs): +def generation_page(parent,working_dirs): self = ttk.Frame(parent) # Generation Setup options @@ -22,11 +22,10 @@ def generation_page(parent):#,working_dirs): baseRomLabel = Label(baseRomFrame, text='Base Rom: ') self.romVar = StringVar() def saveBaseRom(caller,_,mode): - pass -# working_dirs["rom.base"] = self.romVar.get() + working_dirs["rom.base"] = self.romVar.get() self.romVar.trace_add("write",saveBaseRom) romEntry = Entry(baseRomFrame, textvariable=self.romVar) -# self.romVar.set(working_dirs["rom.base"]) + self.romVar.set(working_dirs["rom.base"]) def RomSelect(): rom = filedialog.askopenfilename(filetypes=[("Rom Files", (".sfc", ".smc")), ("All Files", "*")], initialdir=os.path.join(".")) @@ -38,4 +37,4 @@ def generation_page(parent):#,working_dirs): romSelectButton.pack(side=LEFT) baseRomFrame.pack(fill=X, expand=True) - return self#,working_dirs + return self,working_dirs diff --git a/gui/randomize/multiworld.py b/gui/randomize/multiworld.py index 2e37a4dd..dcacf293 100644 --- a/gui/randomize/multiworld.py +++ b/gui/randomize/multiworld.py @@ -1,28 +1,25 @@ from tkinter import ttk, StringVar, Entry, Frame, Label, Spinbox, E, W, LEFT, RIGHT -def multiworld_page(parent):#,working_dirs): +def multiworld_page(parent,working_dirs): self = ttk.Frame(parent) # Multiworld multiFrame = Frame(self) ## Number of Worlds worldLabel = Label(multiFrame, text='Worlds') -# self.worldVar = StringVar(value=working_dirs["multi.worlds"]) - self.worldVar = StringVar(value="1") + self.worldVar = StringVar(value=working_dirs["multi.worlds"]) worldSpinbox = Spinbox(multiFrame, from_=1, to=100, width=5, textvariable=self.worldVar) worldLabel.pack(side=LEFT) worldSpinbox.pack(side=LEFT) ## List of Player Names namesLabel = Label(multiFrame, text='Player names') - self.namesVar = StringVar() -# self.namesVar = StringVar(value=working_dirs["multi.names"]) + self.namesVar = StringVar(value=working_dirs["multi.names"]) def saveMultiNames(caller,_,mode): - pass - #working_dirs["multi.names"] = self.namesVar.get() + working_dirs["multi.names"] = self.namesVar.get() self.namesVar.trace_add("write",saveMultiNames) namesEntry = Entry(multiFrame, textvariable=self.namesVar) namesLabel.pack(side=LEFT) namesEntry.pack(side=LEFT) multiFrame.pack(anchor=W) - return self#,working_dirs + return self,working_dirs From cc8ce4a623034cbbff06255debd8e2a946572906 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 8 Feb 2020 19:04:16 -0800 Subject: [PATCH 017/117] Fix Custom item pool --- gui/bottom.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/gui/bottom.py b/gui/bottom.py index 205bd16d..b009d30d 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -75,15 +75,15 @@ def bottom_frame(self,parent,args=None): guiargs.enemy_damage = parent.enemizerWindow.enemizerDamageVar.get() guiargs.shufflepots = bool(parent.enemizerWindow.potShuffleVar.get()) guiargs.custom = bool(parent.generationSetupWindow.customVar.get()) - guiargs.customitemarray = [int(parent.customWindow.bowVar.get()), int(parent.customWindow.silverarrowVar.get()), int(parent.customWindow.boomerangVar.get()), int(parent.customWindow.magicboomerangVar.get()), int(parent.customWindow.hookshotVar.get()), int(parent.customWindow.mushroomVar.get()), int(parent.customWindow.magicpowderVar.get()), int(parent.customWindow.firerodVar.get()), - int(parent.customWindow.icerodVar.get()), int(parent.customWindow.bombosVar.get()), int(parent.customWindow.etherVar.get()), int(parent.customWindow.quakeVar.get()), int(parent.customWindow.lampVar.get()), int(parent.customWindow.hammerVar.get()), int(parent.customWindow.shovelVar.get()), int(parent.customWindow.fluteVar.get()), int(parent.customWindow.bugnetVar.get()), - int(parent.customWindow.bookVar.get()), int(parent.customWindow.bottleVar.get()), int(parent.customWindow.somariaVar.get()), int(parent.customWindow.byrnaVar.get()), int(parent.customWindow.capeVar.get()), int(parent.customWindow.mirrorVar.get()), int(parent.customWindow.bootsVar.get()), int(parent.customWindow.powergloveVar.get()), int(parent.customWindow.titansmittVar.get()), - int(parent.customWindow.proggloveVar.get()), int(parent.customWindow.flippersVar.get()), int(parent.customWindow.pearlVar.get()), int(parent.customWindow.heartpieceVar.get()), int(parent.customWindow.fullheartVar.get()), int(parent.customWindow.sancheartVar.get()), int(parent.customWindow.sword1Var.get()), int(parent.customWindow.sword2Var.get()), - int(parent.customWindow.sword3Var.get()), int(parent.customWindow.sword4Var.get()), int(parent.customWindow.progswordVar.get()), int(parent.customWindow.shield1Var.get()), int(parent.customWindow.shield2Var.get()), int(parent.customWindow.shield3Var.get()), int(parent.customWindow.progshieldVar.get()), int(parent.customWindow.bluemailVar.get()), - int(parent.customWindow.redmailVar.get()), int(parent.customWindow.progmailVar.get()), int(parent.customWindow.halfmagicVar.get()), int(parent.customWindow.quartermagicVar.get()), int(parent.customWindow.bcap5Var.get()), int(parent.customWindow.bcap10Var.get()), int(parent.customWindow.acap5Var.get()), int(parent.customWindow.acap10Var.get()), - int(parent.customWindow.arrow1Var.get()), int(parent.customWindow.arrow10Var.get()), int(parent.customWindow.bomb1Var.get()), int(parent.customWindow.bomb3Var.get()), int(parent.customWindow.rupee1Var.get()), int(parent.customWindow.rupee5Var.get()), int(parent.customWindow.rupee20Var.get()), int(parent.customWindow.rupee50Var.get()), int(parent.customWindow.rupee100Var.get()), - int(parent.customWindow.rupee300Var.get()), int(parent.customWindow.rupoorVar.get()), int(parent.customWindow.blueclockVar.get()), int(parent.customWindow.greenclockVar.get()), int(parent.customWindow.redclockVar.get()), int(parent.customWindow.progbowVar.get()), int(parent.customWindow.bomb10Var.get()), int(parent.customWindow.triforcepieceVar.get()), - int(parent.customWindow.triforcecountVar.get()), int(parent.customWindow.triforceVar.get()), int(parent.customWindow.rupoorcostVar.get()), int(parent.customWindow.universalkeyVar.get())] + guiargs.customitemarray = [int(parent.customContent.bowVar.get()), int(parent.customContent.silverarrowVar.get()), int(parent.customContent.boomerangVar.get()), int(parent.customContent.magicboomerangVar.get()), int(parent.customContent.hookshotVar.get()), int(parent.customContent.mushroomVar.get()), int(parent.customContent.magicpowderVar.get()), int(parent.customContent.firerodVar.get()), + int(parent.customContent.icerodVar.get()), int(parent.customContent.bombosVar.get()), int(parent.customContent.etherVar.get()), int(parent.customContent.quakeVar.get()), int(parent.customContent.lampVar.get()), int(parent.customContent.hammerVar.get()), int(parent.customContent.shovelVar.get()), int(parent.customContent.fluteVar.get()), int(parent.customContent.bugnetVar.get()), + int(parent.customContent.bookVar.get()), int(parent.customContent.bottleVar.get()), int(parent.customContent.somariaVar.get()), int(parent.customContent.byrnaVar.get()), int(parent.customContent.capeVar.get()), int(parent.customContent.mirrorVar.get()), int(parent.customContent.bootsVar.get()), int(parent.customContent.powergloveVar.get()), int(parent.customContent.titansmittVar.get()), + int(parent.customContent.proggloveVar.get()), int(parent.customContent.flippersVar.get()), int(parent.customContent.pearlVar.get()), int(parent.customContent.heartpieceVar.get()), int(parent.customContent.fullheartVar.get()), int(parent.customContent.sancheartVar.get()), int(parent.customContent.sword1Var.get()), int(parent.customContent.sword2Var.get()), + int(parent.customContent.sword3Var.get()), int(parent.customContent.sword4Var.get()), int(parent.customContent.progswordVar.get()), int(parent.customContent.shield1Var.get()), int(parent.customContent.shield2Var.get()), int(parent.customContent.shield3Var.get()), int(parent.customContent.progshieldVar.get()), int(parent.customContent.bluemailVar.get()), + int(parent.customContent.redmailVar.get()), int(parent.customContent.progmailVar.get()), int(parent.customContent.halfmagicVar.get()), int(parent.customContent.quartermagicVar.get()), int(parent.customContent.bcap5Var.get()), int(parent.customContent.bcap10Var.get()), int(parent.customContent.acap5Var.get()), int(parent.customContent.acap10Var.get()), + int(parent.customContent.arrow1Var.get()), int(parent.customContent.arrow10Var.get()), int(parent.customContent.bomb1Var.get()), int(parent.customContent.bomb3Var.get()), int(parent.customContent.rupee1Var.get()), int(parent.customContent.rupee5Var.get()), int(parent.customContent.rupee20Var.get()), int(parent.customContent.rupee50Var.get()), int(parent.customContent.rupee100Var.get()), + int(parent.customContent.rupee300Var.get()), int(parent.customContent.rupoorVar.get()), int(parent.customContent.blueclockVar.get()), int(parent.customContent.greenclockVar.get()), int(parent.customContent.redclockVar.get()), int(parent.customContent.progbowVar.get()), int(parent.customContent.bomb10Var.get()), int(parent.customContent.triforcepieceVar.get()), + int(parent.customContent.triforcecountVar.get()), int(parent.customContent.triforceVar.get()), int(parent.customContent.rupoorcostVar.get()), int(parent.customContent.universalkeyVar.get())] guiargs.rom = parent.generationSetupWindow.romVar.get() # guiargs.sprite = parent.gameOptionsWindow.sprite guiargs.outputpath = args.outputpath if args else None From 18e0008a998c92b3789c1e2c93282679e9e45ed2 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 8 Feb 2020 23:59:58 -0800 Subject: [PATCH 018/117] Pretty Item Rando options --- gui/bottom.py | 26 ++-- gui/loadcliargs.py | 26 ++-- gui/randomize/item.py | 299 ++++++++++++++++++++++++++++-------------- gui/widgets.py | 61 +++++++++ 4 files changed, 286 insertions(+), 126 deletions(-) create mode 100644 gui/widgets.py diff --git a/gui/bottom.py b/gui/bottom.py index b009d30d..3f4e13f5 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -35,19 +35,19 @@ def bottom_frame(self,parent,args=None): guiargs.names = parent.multiworldWindow.namesVar.get() guiargs.seed = int(parent.farBottomFrame.seedVar.get()) if parent.farBottomFrame.seedVar.get() else None guiargs.count = int(parent.farBottomFrame.countVar.get()) if parent.farBottomFrame.countVar.get() != '1' else None - guiargs.mode = parent.itemWindow.modeVar.get() - guiargs.logic = parent.itemWindow.logicVar.get() + guiargs.mode = parent.itemWindow.itemWidgets["worldState"].storageVar.get() + guiargs.logic = parent.itemWindow.itemWidgets["logicLevel"].storageVar.get() - guiargs.goal = parent.itemWindow.goalVar.get() - guiargs.crystals_gt = parent.itemWindow.crystalsGTVar.get() - guiargs.crystals_ganon = parent.itemWindow.crystalsGanonVar.get() - guiargs.swords = parent.itemWindow.swordVar.get() - guiargs.difficulty = parent.itemWindow.difficultyVar.get() - guiargs.item_functionality = parent.itemWindow.itemfunctionVar.get() - guiargs.timer = parent.itemWindow.timerVar.get() - guiargs.progressive = parent.itemWindow.progressiveVar.get() - guiargs.accessibility = parent.itemWindow.accessibilityVar.get() - guiargs.algorithm = parent.itemWindow.algorithmVar.get() + guiargs.goal = parent.itemWindow.itemWidgets["goal"].storageVar.get() + guiargs.crystals_gt = parent.itemWindow.itemWidgets["crystals_gt"].storageVar.get() + guiargs.crystals_ganon = parent.itemWindow.itemWidgets["crystals_ganon"].storageVar.get() + guiargs.swords = parent.itemWindow.itemWidgets["weapons"].storageVar.get() + guiargs.difficulty = parent.itemWindow.itemWidgets["itempool"].storageVar.get() + guiargs.item_functionality = parent.itemWindow.itemWidgets["itemfunction"].storageVar.get() + guiargs.timer = parent.itemWindow.itemWidgets["timer"].storageVar.get() + guiargs.progressive = parent.itemWindow.itemWidgets["progressives"].storageVar.get() + guiargs.accessibility = parent.itemWindow.itemWidgets["accessibility"].storageVar.get() + guiargs.algorithm = parent.itemWindow.itemWidgets["sortingalgo"].storageVar.get() guiargs.shuffle = parent.entrandoWindow.shuffleVar.get() guiargs.door_shuffle = parent.dungeonRandoWindow.doorShuffleVar.get() guiargs.heartbeep = parent.gameOptionsWindow.heartbeepVar.get() @@ -61,7 +61,7 @@ def bottom_frame(self,parent,args=None): guiargs.compassshuffle = bool(parent.dungeonRandoWindow.compassshuffleVar.get()) guiargs.keyshuffle = bool(parent.dungeonRandoWindow.keyshuffleVar.get()) guiargs.bigkeyshuffle = bool(parent.dungeonRandoWindow.bigkeyshuffleVar.get()) - guiargs.retro = bool(parent.itemWindow.retroVar.get()) + guiargs.retro = bool(parent.itemWindow.itemWidgets["retro"].storageVar.get()) guiargs.quickswap = bool(parent.gameOptionsWindow.quickSwapVar.get()) guiargs.disablemusic = bool(parent.gameOptionsWindow.disableMusicVar.get()) guiargs.ow_palettes = parent.gameOptionsWindow.owPalettesVar.get() diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index 4b8fb2c4..e88180d9 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -10,7 +10,7 @@ def loadcliargs(gui,args): gui.dungeonRandoWindow.compassshuffleVar.set(args.compassshuffle) gui.dungeonRandoWindow.keyshuffleVar.set(args.keyshuffle) gui.dungeonRandoWindow.bigkeyshuffleVar.set(args.bigkeyshuffle) - gui.itemWindow.retroVar.set(args.retro) + gui.itemWindow.itemWidgets["retro"].storageVar.set(args.retro) gui.entrandoWindow.openpyramidVar.set(args.openpyramid) gui.gameOptionsWindow.quickSwapVar.set(int(args.quickswap)) gui.gameOptionsWindow.disableMusicVar.set(int(args.disablemusic)) @@ -20,23 +20,23 @@ def loadcliargs(gui,args): gui.farBottomFrame.countVar.set(str(args.count)) if args.seed: gui.farBottomFrame.seedVar.set(str(args.seed)) - gui.itemWindow.modeVar.set(args.mode) - gui.itemWindow.swordVar.set(args.swords) - gui.itemWindow.difficultyVar.set(args.difficulty) - gui.itemWindow.itemfunctionVar.set(args.item_functionality) - gui.itemWindow.timerVar.set(args.timer) - gui.itemWindow.progressiveVar.set(args.progressive) - gui.itemWindow.accessibilityVar.set(args.accessibility) - gui.itemWindow.goalVar.set(args.goal) - gui.itemWindow.crystalsGTVar.set(args.crystals_gt) - gui.itemWindow.crystalsGanonVar.set(args.crystals_ganon) - gui.itemWindow.algorithmVar.set(args.algorithm) + gui.itemWindow.itemWidgets["worldState"].storageVar.set(args.mode) + gui.itemWindow.itemWidgets["weapons"].storageVar.set(args.swords) + gui.itemWindow.itemWidgets["itempool"].storageVar.set(args.difficulty) + gui.itemWindow.itemWidgets["itemfunction"].storageVar.set(args.item_functionality) + gui.itemWindow.itemWidgets["timer"].storageVar.set(args.timer) + gui.itemWindow.itemWidgets["progressives"].storageVar.set(args.progressive) + gui.itemWindow.itemWidgets["accessibility"].storageVar.set(args.accessibility) + gui.itemWindow.itemWidgets["goal"].storageVar.set(args.goal) + gui.itemWindow.itemWidgets["crystals_gt"].storageVar.set(args.crystals_gt) + gui.itemWindow.itemWidgets["crystals_ganon"].storageVar.set(args.crystals_ganon) + gui.itemWindow.itemWidgets["sortingalgo"].storageVar.set(args.algorithm) gui.entrandoWindow.shuffleVar.set(args.shuffle) gui.dungeonRandoWindow.doorShuffleVar.set(args.door_shuffle) gui.gameOptionsWindow.heartcolorVar.set(args.heartcolor) gui.gameOptionsWindow.heartbeepVar.set(args.heartbeep) gui.gameOptionsWindow.fastMenuVar.set(args.fastmenu) - gui.itemWindow.logicVar.set(args.logic) + gui.itemWindow.itemWidgets["logicLevel"].storageVar.set(args.logic) gui.generationSetupWindow.romVar.set(args.rom) gui.entrandoWindow.shuffleGanonVar.set(args.shuffleganon) gui.gameOptionsWindow.hintsVar.set(args.hints) diff --git a/gui/randomize/item.py b/gui/randomize/item.py index 550c9544..2ab1c781 100644 --- a/gui/randomize/item.py +++ b/gui/randomize/item.py @@ -1,4 +1,5 @@ from tkinter import ttk, IntVar, StringVar, Checkbutton, Frame, Label, OptionMenu, E, W, LEFT, RIGHT +import gui.widgets as widgets def item_page(parent): # Item Randomizer @@ -6,9 +7,16 @@ def item_page(parent): # Item Randomizer options ## Retro (eventually needs to become a World State) - self.retroVar = IntVar() - retroCheckbutton = Checkbutton(self, text="Retro mode (universal keys)", variable=self.retroVar) - retroCheckbutton.pack(anchor=W) + self.itemWidgets = {} + + self.itemWidgets["retro"] = widgets.make_widget( + self, + "checkbox", + self, + "Retro mode (universal keys)", + None + ) + self.itemWidgets["retro"].pack(anchor=W) leftItemFrame = Frame(self) rightItemFrame = Frame(self) @@ -16,124 +24,215 @@ def item_page(parent): rightItemFrame.pack(side=RIGHT) ## World State - modeFrame = Frame(leftItemFrame) - self.modeVar = StringVar() - self.modeVar.set('open') - modeOptionMenu = OptionMenu(modeFrame, self.modeVar, 'standard', 'open', 'inverted') - modeOptionMenu.pack(side=RIGHT) - modeLabel = Label(modeFrame, text='World State') - modeLabel.pack(side=LEFT) - modeFrame.pack(anchor=E) + key = "worldState" + self.itemWidgets[key] = widgets.make_widget( + self, + "selectbox", + leftItemFrame, + "World State", + None, + {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}, "default": "Open"}, + { + "Standard": "standard", + "Open": "open", + "Inverted": "inverted" + } + ) + self.itemWidgets[key].pack(anchor=E) ## Logic Level - logicFrame = Frame(leftItemFrame) - self.logicVar = StringVar() - self.logicVar.set('noglitches') - logicOptionMenu = OptionMenu(logicFrame, self.logicVar, 'noglitches', 'minorglitches', 'nologic') - logicOptionMenu.pack(side=RIGHT) - logicLabel = Label(logicFrame, text='Game Logic') - logicLabel.pack(side=LEFT) - logicFrame.pack(anchor=E) + key = "logicLevel" + self.itemWidgets[key] = widgets.make_widget( + self, + "selectbox", + leftItemFrame, + "Logic Level", + None, + {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, + { + "No Glitches": "noglitches", + "Minor Glitches": "minorglitches", + "No Logic": "nologic" + } + ) + self.itemWidgets[key].pack(anchor=E) ## Goal - goalFrame = Frame(leftItemFrame) - self.goalVar = StringVar() - self.goalVar.set('ganon') - goalOptionMenu = OptionMenu(goalFrame, self.goalVar, 'ganon', 'pedestal', 'dungeons', 'triforcehunt', 'crystals') - goalOptionMenu.pack(side=RIGHT) - goalLabel = Label(goalFrame, text='Goal') - goalLabel.pack(side=LEFT) - goalFrame.pack(anchor=E) + key = "goal" + self.itemWidgets[key] = widgets.make_widget( + self, + "selectbox", + leftItemFrame, + "Goal", + None, + {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, + { + "Defeat Ganon": "ganon", + "Master Sword Pedestal": "pedestal", + "All Dungeons": "dungeons", + "Triforce Hunt": "triforcehunt", + "Crystals": "crystals" + } + ) + self.itemWidgets[key].pack(anchor=E) ## Number of crystals to open GT - crystalsGTFrame = Frame(leftItemFrame) - self.crystalsGTVar = StringVar() - self.crystalsGTVar.set('7') - crystalsGTOptionMenu = OptionMenu(crystalsGTFrame, self.crystalsGTVar, '0', '1', '2', '3', '4', '5', '6', '7', 'random') - crystalsGTOptionMenu.pack(side=RIGHT) - crystalsGTLabel = Label(crystalsGTFrame, text='Crystals to open Ganon\'s Tower') - crystalsGTLabel.pack(side=LEFT) - crystalsGTFrame.pack(anchor=E) + key = "crystals_gt" + keys = [*map(str,range(0,7+1)),"Random"] + vals = [*map(str,range(0,7+1)),"random"] + options = {keys[i]: vals[i] for i in range(len(keys))} + self.itemWidgets[key] = widgets.make_widget( + self, + "selectbox", + leftItemFrame, + "Crystals to open GT", + None, + {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, + options + ) + self.itemWidgets[key].pack(anchor=E) ## Number of crystals to damage Ganon - crystalsGanonFrame = Frame(leftItemFrame) - self.crystalsGanonVar = StringVar() - self.crystalsGanonVar.set('7') - crystalsGanonOptionMenu = OptionMenu(crystalsGanonFrame, self.crystalsGanonVar, '0', '1', '2', '3', '4', '5', '6', '7', 'random') - crystalsGanonOptionMenu.pack(side=RIGHT) - crystalsGanonLabel = Label(crystalsGanonFrame, text='Crystals to fight Ganon') - crystalsGanonLabel.pack(side=LEFT) - crystalsGanonFrame.pack(anchor=E) + key = "crystals_ganon" + keys = [*map(str,range(0,7+1)),"Random"] + vals = [*map(str,range(0,7+1)),"random"] + options = {keys[i]: vals[i] for i in range(len(keys))} + self.itemWidgets[key] = widgets.make_widget( + self, + "selectbox", + leftItemFrame, + "Crystals to harm Ganon", + None, + {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, + options + ) + self.itemWidgets[key].pack(anchor=E) ## Weapons - swordFrame = Frame(leftItemFrame) - self.swordVar = StringVar() - self.swordVar.set('random') - swordOptionMenu = OptionMenu(swordFrame, self.swordVar, 'random', 'assured', 'swordless', 'vanilla') - swordOptionMenu.pack(side=RIGHT) - swordLabel = Label(swordFrame, text='Sword availability') - swordLabel.pack(side=LEFT) - swordFrame.pack(anchor=E) + key = "weapons" + self.itemWidgets[key] = widgets.make_widget( + self, + "selectbox", + leftItemFrame, + "Weapons", + None, + {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, + { + "Randomized": "random", + "Assured": "assured", + "Swordless": "swordless", + "Vanilla": "vanilla" + } + ) + self.itemWidgets[key].pack(anchor=E) ## Item Pool - difficultyFrame = Frame(rightItemFrame) - self.difficultyVar = StringVar() - self.difficultyVar.set('normal') - difficultyOptionMenu = OptionMenu(difficultyFrame, self.difficultyVar, 'normal', 'hard', 'expert') - difficultyOptionMenu.pack(side=RIGHT) - difficultyLabel = Label(difficultyFrame, text='Difficulty: item pool') - difficultyLabel.pack(side=LEFT) - difficultyFrame.pack(anchor=E) + key = "itempool" + self.itemWidgets[key] = widgets.make_widget( + self, + "selectbox", + rightItemFrame, + "Item Pool", + None, + {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, + { + "Normal": "normal", + "Hard": "hard", + "Expert": "expert" + } + ) + self.itemWidgets[key].pack(anchor=E) ## Item Functionality - itemfunctionFrame = Frame(rightItemFrame) - self.itemfunctionVar = StringVar() - self.itemfunctionVar.set('normal') - itemfunctionOptionMenu = OptionMenu(itemfunctionFrame, self.itemfunctionVar, 'normal', 'hard', 'expert') - itemfunctionOptionMenu.pack(side=RIGHT) - itemfunctionLabel = Label(itemfunctionFrame, text='Difficulty: item functionality') - itemfunctionLabel.pack(side=LEFT) - itemfunctionFrame.pack(anchor=E) + key = "itemfunction" + self.itemWidgets[key] = widgets.make_widget( + self, + "selectbox", + rightItemFrame, + "Item Functionality", + None, + {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, + { + "Normal": "normal", + "Hard": "hard", + "Expert": "expert" + } + ) + self.itemWidgets[key].pack(anchor=E) ## Timer setting - timerFrame = Frame(rightItemFrame) - self.timerVar = StringVar() - self.timerVar.set('none') - timerOptionMenu = OptionMenu(timerFrame, self.timerVar, 'none', 'display', 'timed', 'timed-ohko', 'ohko', 'timed-countdown') - timerOptionMenu.pack(side=RIGHT) - timerLabel = Label(timerFrame, text='Timer setting') - timerLabel.pack(side=LEFT) - timerFrame.pack(anchor=E) + key = "timer" + self.itemWidgets[key] = widgets.make_widget( + self, + "selectbox", + rightItemFrame, + "Timer Setting", + None, + {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, + { + "No Timer": "none", + "Stopwatch": "display", + "Timed": "timed", + "Timed OHKO": "timed-ohko", + "OHKO": "ohko", + "Timed Countdown": "timed-countdown" + } + ) + self.itemWidgets[key].pack(anchor=E) ## Progressives: On/Off - progressiveFrame = Frame(rightItemFrame) - self.progressiveVar = StringVar() - self.progressiveVar.set('on') - progressiveOptionMenu = OptionMenu(progressiveFrame, self.progressiveVar, 'on', 'off', 'random') - progressiveOptionMenu.pack(side=RIGHT) - progressiveLabel = Label(progressiveFrame, text='Progressive equipment') - progressiveLabel.pack(side=LEFT) - progressiveFrame.pack(anchor=E) + key = "progressives" + self.itemWidgets[key] = widgets.make_widget( + self, + "selectbox", + rightItemFrame, + "Progressive Items", + None, + {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, + { + "On": "on", + "Off": "off", + "Random": "random" + } + ) + self.itemWidgets[key].pack(anchor=E) ## Accessibilty - accessibilityFrame = Frame(rightItemFrame) - self.accessibilityVar = StringVar() - self.accessibilityVar.set('items') - accessibilityOptionMenu = OptionMenu(accessibilityFrame, self.accessibilityVar, 'items', 'locations', 'none') - accessibilityOptionMenu.pack(side=RIGHT) - accessibilityLabel = Label(accessibilityFrame, text='Item accessibility') - accessibilityLabel.pack(side=LEFT) - accessibilityFrame.pack(anchor=E) - accessibilityFrame.pack(anchor=E) + key = "accessibility" + self.itemWidgets[key] = widgets.make_widget( + self, + "selectbox", + rightItemFrame, + "Accessibility", + None, + {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, + { + "100% Inventory": "items", + "100% Locations": "locations", + "Beatable": "none" + } + ) + self.itemWidgets[key].pack(anchor=E) ## Item Sorting Algorithm - algorithmFrame = Frame(rightItemFrame) - self.algorithmVar = StringVar() - self.algorithmVar.set('balanced') - algorithmOptionMenu = OptionMenu(algorithmFrame, self.algorithmVar, 'freshness', 'flood', 'vt21', 'vt22', 'vt25', 'vt26', 'balanced') - algorithmOptionMenu.pack(side=RIGHT) - algorithmLabel = Label(algorithmFrame, text='Item distribution algorithm') - algorithmLabel.pack(side=LEFT) - algorithmFrame.pack(anchor=E) + key = "sortingalgo" + self.itemWidgets[key] = widgets.make_widget( + self, + "selectbox", + rightItemFrame, + "Item Sorting", + None, + {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}, "default": "Balanced"}, + { + "Freshness": "freshness", + "Flood": "flood", + "VT8.21": "vt21", + "VT8.22": "vt22", + "VT8.25": "vt25", + "VT8.26": "vt26", + "Balanced": "balanced" + } + ) + self.itemWidgets[key].pack(anchor=E) return self diff --git a/gui/widgets.py b/gui/widgets.py new file mode 100644 index 00000000..5887919a --- /dev/null +++ b/gui/widgets.py @@ -0,0 +1,61 @@ +from tkinter import Checkbutton, Entry, Frame, IntVar, Label, OptionMenu, StringVar + +def make_checkbox(self, parent, label, storageVar, packAttrs): + self = Frame(parent) + self.storageVar = storageVar + self.checkbox = Checkbutton(self, text=label, variable=self.storageVar) + self.checkbox.pack(packAttrs) + return self + +def make_selectbox(self, parent, label, options, storageVar, packAttrs): + def change_storage(*args): + self.storageVar.set(options[self.labelVar.get()]) + def change_selected(*args): + keys = options.keys() + vals = options.values() + keysList = list(keys) + valsList = list(vals) + self.labelVar.set(keysList[valsList.index(str(self.storageVar.get()))]) + self = Frame(parent) + self.storageVar = storageVar + self.storageVar.trace_add("write",change_selected) + self.labelVar = StringVar() + self.labelVar.trace_add("write",change_storage) + self.label = Label(self, text=label) + self.label.pack(packAttrs["label"]) + self.selectbox = OptionMenu(self, self.labelVar, *options.keys()) + self.labelVar.set(packAttrs["default"] if "default" in packAttrs else list(options.keys())[0]) + self.selectbox.pack(packAttrs["selectbox"]) + return self + +def make_textbox(self, parent, label, storageVar, packAttrs): + self = Frame(parent) + self.storageVar = storageVar + self.label = Label(self, text=label) + self.label.pack(packAttrs["label"]) + self.textbox = Entry(self) + self.textbox.pack(packAttrs["textbox"]) + return self + +def make_widget(self, type, parent, label, storageVar=None, packAttrs=dict(), options=None): + widget = None + thisStorageVar = None + if isinstance(storageVar,str): + if storageVar == "int" or storageVar == "integer": + thisStorageVar = IntVar() + elif storageVar == "str" or storageVar == "string": + thisStorageVar = StringVar() + + if type == "checkbox": + if thisStorageVar is None: + thisStorageVar = IntVar() + widget = make_checkbox(self, parent, label, thisStorageVar, packAttrs) + elif type == "selectbox": + if thisStorageVar is None: + thisStorageVar = StringVar() + widget = make_selectbox(self, parent, label, options, thisStorageVar, packAttrs) + elif type == "textbox": + if thisStorageVar is None: + thisStorageVar = StringVar() + widget = make_textbox(self, parent, label, thisStorageVar, packAttrs) + return widget From f9fcfee57b6dad1665a2e25d05da937ccd7a6173 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sun, 9 Feb 2020 15:53:45 -0800 Subject: [PATCH 019/117] Pretty Entrando options --- gui/bottom.py | 10 +++---- gui/loadcliargs.py | 10 +++---- gui/randomize/entrando.py | 62 +++++++++++++++++++++++++++++---------- gui/randomize/item.py | 11 +++---- 4 files changed, 63 insertions(+), 30 deletions(-) diff --git a/gui/bottom.py b/gui/bottom.py index 3f4e13f5..2d16bd1d 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -35,8 +35,8 @@ def bottom_frame(self,parent,args=None): guiargs.names = parent.multiworldWindow.namesVar.get() guiargs.seed = int(parent.farBottomFrame.seedVar.get()) if parent.farBottomFrame.seedVar.get() else None guiargs.count = int(parent.farBottomFrame.countVar.get()) if parent.farBottomFrame.countVar.get() != '1' else None - guiargs.mode = parent.itemWindow.itemWidgets["worldState"].storageVar.get() - guiargs.logic = parent.itemWindow.itemWidgets["logicLevel"].storageVar.get() + guiargs.mode = parent.itemWindow.itemWidgets["worldstate"].storageVar.get() + guiargs.logic = parent.itemWindow.itemWidgets["logiclevel"].storageVar.get() guiargs.goal = parent.itemWindow.itemWidgets["goal"].storageVar.get() guiargs.crystals_gt = parent.itemWindow.itemWidgets["crystals_gt"].storageVar.get() @@ -48,7 +48,7 @@ def bottom_frame(self,parent,args=None): guiargs.progressive = parent.itemWindow.itemWidgets["progressives"].storageVar.get() guiargs.accessibility = parent.itemWindow.itemWidgets["accessibility"].storageVar.get() guiargs.algorithm = parent.itemWindow.itemWidgets["sortingalgo"].storageVar.get() - guiargs.shuffle = parent.entrandoWindow.shuffleVar.get() + guiargs.shuffle = parent.entrandoWindow.entrandoWidgets["entranceshuffle"].storageVar.get() guiargs.door_shuffle = parent.dungeonRandoWindow.doorShuffleVar.get() guiargs.heartbeep = parent.gameOptionsWindow.heartbeepVar.get() guiargs.heartcolor = parent.gameOptionsWindow.heartcolorVar.get() @@ -56,7 +56,7 @@ def bottom_frame(self,parent,args=None): guiargs.create_spoiler = bool(parent.generationSetupWindow.createSpoilerVar.get()) guiargs.skip_playthrough = not bool(parent.generationSetupWindow.createSpoilerVar.get()) guiargs.suppress_rom = bool(parent.generationSetupWindow.suppressRomVar.get()) - guiargs.openpyramid = bool(parent.entrandoWindow.openpyramidVar.get()) + guiargs.openpyramid = bool(parent.entrandoWindow.entrandoWidgets["openpyramid"].storageVar.get()) guiargs.mapshuffle = bool(parent.dungeonRandoWindow.mapshuffleVar.get()) guiargs.compassshuffle = bool(parent.dungeonRandoWindow.compassshuffleVar.get()) guiargs.keyshuffle = bool(parent.dungeonRandoWindow.keyshuffleVar.get()) @@ -66,7 +66,7 @@ def bottom_frame(self,parent,args=None): guiargs.disablemusic = bool(parent.gameOptionsWindow.disableMusicVar.get()) guiargs.ow_palettes = parent.gameOptionsWindow.owPalettesVar.get() guiargs.uw_palettes = parent.gameOptionsWindow.uwPalettesVar.get() - guiargs.shuffleganon = bool(parent.entrandoWindow.shuffleGanonVar.get()) + guiargs.shuffleganon = bool(parent.entrandoWindow.entrandoWidgets["shuffleganon"].storageVar.get()) guiargs.hints = bool(parent.gameOptionsWindow.hintsVar.get()) guiargs.enemizercli = parent.enemizerWindow.enemizerCLIpathVar.get() guiargs.shufflebosses = parent.enemizerWindow.enemizerBossVar.get() diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index e88180d9..28aa5662 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -11,7 +11,7 @@ def loadcliargs(gui,args): gui.dungeonRandoWindow.keyshuffleVar.set(args.keyshuffle) gui.dungeonRandoWindow.bigkeyshuffleVar.set(args.bigkeyshuffle) gui.itemWindow.itemWidgets["retro"].storageVar.set(args.retro) - gui.entrandoWindow.openpyramidVar.set(args.openpyramid) + gui.entrandoWindow.entrandoWidgets["openpyramid"].storageVar.set(args.openpyramid) gui.gameOptionsWindow.quickSwapVar.set(int(args.quickswap)) gui.gameOptionsWindow.disableMusicVar.set(int(args.disablemusic)) if args.multi: @@ -20,7 +20,7 @@ def loadcliargs(gui,args): gui.farBottomFrame.countVar.set(str(args.count)) if args.seed: gui.farBottomFrame.seedVar.set(str(args.seed)) - gui.itemWindow.itemWidgets["worldState"].storageVar.set(args.mode) + gui.itemWindow.itemWidgets["worldstate"].storageVar.set(args.mode) gui.itemWindow.itemWidgets["weapons"].storageVar.set(args.swords) gui.itemWindow.itemWidgets["itempool"].storageVar.set(args.difficulty) gui.itemWindow.itemWidgets["itemfunction"].storageVar.set(args.item_functionality) @@ -31,14 +31,14 @@ def loadcliargs(gui,args): gui.itemWindow.itemWidgets["crystals_gt"].storageVar.set(args.crystals_gt) gui.itemWindow.itemWidgets["crystals_ganon"].storageVar.set(args.crystals_ganon) gui.itemWindow.itemWidgets["sortingalgo"].storageVar.set(args.algorithm) - gui.entrandoWindow.shuffleVar.set(args.shuffle) + gui.entrandoWindow.entrandoWidgets["entranceshuffle"].storageVar.set(args.shuffle) gui.dungeonRandoWindow.doorShuffleVar.set(args.door_shuffle) gui.gameOptionsWindow.heartcolorVar.set(args.heartcolor) gui.gameOptionsWindow.heartbeepVar.set(args.heartbeep) gui.gameOptionsWindow.fastMenuVar.set(args.fastmenu) - gui.itemWindow.itemWidgets["logicLevel"].storageVar.set(args.logic) + gui.itemWindow.itemWidgets["logiclevel"].storageVar.set(args.logic) gui.generationSetupWindow.romVar.set(args.rom) - gui.entrandoWindow.shuffleGanonVar.set(args.shuffleganon) + gui.entrandoWindow.entrandoWidgets["shuffleganon"].storageVar.set(args.shuffleganon) gui.gameOptionsWindow.hintsVar.set(args.hints) gui.enemizerWindow.enemizerCLIpathVar.set(args.enemizercli) gui.enemizerWindow.potShuffleVar.set(args.shufflepots) diff --git a/gui/randomize/entrando.py b/gui/randomize/entrando.py index 69dad09f..ab218d23 100644 --- a/gui/randomize/entrando.py +++ b/gui/randomize/entrando.py @@ -1,27 +1,59 @@ from tkinter import ttk, IntVar, StringVar, Checkbutton, Frame, Label, OptionMenu, E, W, LEFT, RIGHT +import gui.widgets as widgets def entrando_page(parent): # Entrance Randomizer self = ttk.Frame(parent) # Entrance Randomizer options + self.entrandoWidgets = {} + ## Pyramid pre-opened - self.openpyramidVar = IntVar() - openpyramidCheckbutton = Checkbutton(self, text="Pre-open Pyramid Hole", variable=self.openpyramidVar) - openpyramidCheckbutton.pack(anchor=W) + key = "openpyramid" + self.entrandoWidgets[key] = widgets.make_widget( + self, + "checkbox", + self, + "Pre-open Pyramid Hole", + None + ) + self.entrandoWidgets[key].pack(anchor=W) + ## Shuffle Ganon - self.shuffleGanonVar = IntVar() - self.shuffleGanonVar.set(1) #set default - shuffleGanonCheckbutton = Checkbutton(self, text="Include Ganon's Tower and Pyramid Hole in shuffle pool", variable=self.shuffleGanonVar) - shuffleGanonCheckbutton.pack(anchor=W) + key = "shuffleganon" + self.entrandoWidgets[key] = widgets.make_widget( + self, + "checkbox", + self, + "Include Ganon's Tower and Pyramid Hole in shuffle pool", + {"default": 1} + ) + self.entrandoWidgets[key].pack(anchor=W) + ## Entrance Shuffle - shuffleFrame = Frame(self) - self.shuffleVar = StringVar() - self.shuffleVar.set('vanilla') - shuffleOptionMenu = OptionMenu(shuffleFrame, self.shuffleVar, 'vanilla', 'simple', 'restricted', 'full', 'crossed', 'insanity', 'restricted_legacy', 'full_legacy', 'madness_legacy', 'insanity_legacy', 'dungeonsfull', 'dungeonssimple') - shuffleOptionMenu.pack(side=RIGHT) - shuffleLabel = Label(shuffleFrame, text='Entrance shuffle algorithm') - shuffleLabel.pack(side=LEFT) - shuffleFrame.pack(anchor=W) + key = "entranceshuffle" + self.entrandoWidgets[key] = widgets.make_widget( + self, + "selectbox", + self, + "Entrance Shuffle", + None, + {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, + { + "Vanilla": "vanilla", + "Simple": "simple", + "Restricted": "restricted", + "Full": "full", + "Crossed": "crossed", + "Insanity": "insanity", + "Restricted (Legacy)": "restricted_legacy", + "Full (Legacy)": "full_legacy", + "Madness (Legacy)": "madness_legacy", + "Insanity (Legacy)": "insanity_legacy", + "Dungeons + Full": "dungeonsfull", + "Dungeons + Simple": "dungeonssimple" + } + ) + self.entrandoWidgets[key].pack(anchor=W) return self diff --git a/gui/randomize/item.py b/gui/randomize/item.py index 2ab1c781..b1803f44 100644 --- a/gui/randomize/item.py +++ b/gui/randomize/item.py @@ -6,17 +6,18 @@ def item_page(parent): self = ttk.Frame(parent) # Item Randomizer options - ## Retro (eventually needs to become a World State) self.itemWidgets = {} - self.itemWidgets["retro"] = widgets.make_widget( + ## Retro (eventually needs to become a World State) + key = "retro" + self.itemWidgets[key] = widgets.make_widget( self, "checkbox", self, "Retro mode (universal keys)", None ) - self.itemWidgets["retro"].pack(anchor=W) + self.itemWidgets[key].pack(anchor=W) leftItemFrame = Frame(self) rightItemFrame = Frame(self) @@ -24,7 +25,7 @@ def item_page(parent): rightItemFrame.pack(side=RIGHT) ## World State - key = "worldState" + key = "worldstate" self.itemWidgets[key] = widgets.make_widget( self, "selectbox", @@ -41,7 +42,7 @@ def item_page(parent): self.itemWidgets[key].pack(anchor=E) ## Logic Level - key = "logicLevel" + key = "logiclevel" self.itemWidgets[key] = widgets.make_widget( self, "selectbox", From a830c20a53dcd40676e85cb7f12a1127797433ee Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Tue, 11 Feb 2020 00:50:07 -0800 Subject: [PATCH 020/117] Pretty Enemizer options --- gui/bottom.py | 10 +-- gui/loadcliargs.py | 10 +-- gui/randomize/enemizer.py | 128 +++++++++++++++++++++++++------------- 3 files changed, 94 insertions(+), 54 deletions(-) diff --git a/gui/bottom.py b/gui/bottom.py index 2d16bd1d..87dc6ead 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -69,11 +69,11 @@ def bottom_frame(self,parent,args=None): guiargs.shuffleganon = bool(parent.entrandoWindow.entrandoWidgets["shuffleganon"].storageVar.get()) guiargs.hints = bool(parent.gameOptionsWindow.hintsVar.get()) guiargs.enemizercli = parent.enemizerWindow.enemizerCLIpathVar.get() - guiargs.shufflebosses = parent.enemizerWindow.enemizerBossVar.get() - guiargs.shuffleenemies = parent.enemizerWindow.enemyShuffleVar.get() - guiargs.enemy_health = parent.enemizerWindow.enemizerHealthVar.get() - guiargs.enemy_damage = parent.enemizerWindow.enemizerDamageVar.get() - guiargs.shufflepots = bool(parent.enemizerWindow.potShuffleVar.get()) + guiargs.shufflebosses = parent.enemizerWindow.enemizerWidgets["bossshuffle"].storageVar.get() + guiargs.shuffleenemies = parent.enemizerWindow.enemizerWidgets["enemyshuffle"].storageVar.get() + guiargs.enemy_health = parent.enemizerWindow.enemizerWidgets["enemyhealth"].storageVar.get() + guiargs.enemy_damage = parent.enemizerWindow.enemizerWidgets["enemydamage"].storageVar.get() + guiargs.shufflepots = bool(parent.enemizerWindow.enemizerWidgets["potshuffle"].storageVar.get()) guiargs.custom = bool(parent.generationSetupWindow.customVar.get()) guiargs.customitemarray = [int(parent.customContent.bowVar.get()), int(parent.customContent.silverarrowVar.get()), int(parent.customContent.boomerangVar.get()), int(parent.customContent.magicboomerangVar.get()), int(parent.customContent.hookshotVar.get()), int(parent.customContent.mushroomVar.get()), int(parent.customContent.magicpowderVar.get()), int(parent.customContent.firerodVar.get()), int(parent.customContent.icerodVar.get()), int(parent.customContent.bombosVar.get()), int(parent.customContent.etherVar.get()), int(parent.customContent.quakeVar.get()), int(parent.customContent.lampVar.get()), int(parent.customContent.hammerVar.get()), int(parent.customContent.shovelVar.get()), int(parent.customContent.fluteVar.get()), int(parent.customContent.bugnetVar.get()), diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index 28aa5662..a8c4b42b 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -41,11 +41,11 @@ def loadcliargs(gui,args): gui.entrandoWindow.entrandoWidgets["shuffleganon"].storageVar.set(args.shuffleganon) gui.gameOptionsWindow.hintsVar.set(args.hints) gui.enemizerWindow.enemizerCLIpathVar.set(args.enemizercli) - gui.enemizerWindow.potShuffleVar.set(args.shufflepots) - gui.enemizerWindow.enemyShuffleVar.set(args.shuffleenemies) - gui.enemizerWindow.enemizerBossVar.set(args.shufflebosses) - gui.enemizerWindow.enemizerDamageVar.set(args.enemy_damage) - gui.enemizerWindow.enemizerHealthVar.set(args.enemy_health) + gui.enemizerWindow.enemizerWidgets["potshuffle"].storageVar.set(args.shufflepots) + gui.enemizerWindow.enemizerWidgets["enemyshuffle"].storageVar.set(args.shuffleenemies) + gui.enemizerWindow.enemizerWidgets["bossshuffle"].storageVar.set(args.shufflebosses) + gui.enemizerWindow.enemizerWidgets["enemydamage"].storageVar.set(args.enemy_damage) + gui.enemizerWindow.enemizerWidgets["enemyhealth"].storageVar.set(args.enemy_health) gui.gameOptionsWindow.owPalettesVar.set(args.ow_palettes) gui.gameOptionsWindow.uwPalettesVar.set(args.uw_palettes) # if args.sprite is not None: diff --git a/gui/randomize/enemizer.py b/gui/randomize/enemizer.py index dfab0537..d7ae0524 100644 --- a/gui/randomize/enemizer.py +++ b/gui/randomize/enemizer.py @@ -1,19 +1,27 @@ import os -from tkinter import ttk, filedialog, IntVar, StringVar, Button, Checkbutton, Entry, Frame, Label, LabelFrame, OptionMenu, E, W, LEFT, RIGHT, X +from tkinter import ttk, filedialog, IntVar, StringVar, Button, Checkbutton, Entry, Frame, Label, LabelFrame, OptionMenu, N, E, W, LEFT, RIGHT, X +import gui.widgets as widgets def enemizer_page(parent,working_dirs): + # Enemizer self = ttk.Frame(parent) - # Enemizer - enemizerFrame = LabelFrame(self, text="Enemizer") - enemizerFrame.columnconfigure(0, weight=1) - enemizerFrame.columnconfigure(1, weight=1) - enemizerFrame.columnconfigure(2, weight=1) - enemizerFrame.columnconfigure(3, weight=1) + # Enemizer options + self.enemizerWidgets = {} + + # Pot Shuffle + key = "potshuffle" + self.enemizerWidgets[key] = widgets.make_widget( + self, + "checkbox", + self, + "Pot Shuffle", + None + ) + self.enemizerWidgets[key].pack(anchor=W) ## Enemizer CLI Path enemizerPathFrame = Frame(self) - enemizerPathFrame.grid(row=0, column=0, columnspan=3, sticky=W+E) enemizerCLIlabel = Label(enemizerPathFrame, text="EnemizerCLI path: ") enemizerCLIlabel.pack(side=LEFT) self.enemizerCLIpathVar = StringVar(value=working_dirs["enemizer.cli"]) @@ -29,50 +37,82 @@ def enemizer_page(parent,working_dirs): working_dirs["enemizer.cli"] = path enemizerCLIbrowseButton = Button(enemizerPathFrame, text='...', command=EnemizerSelectPath) enemizerCLIbrowseButton.pack(side=LEFT) + enemizerPathFrame.pack(fill=X, expand=True) - ## Pot Shuffle - self.potShuffleVar = IntVar() - potShuffleButton = Checkbutton(self, text="Pot shuffle", variable=self.potShuffleVar) - potShuffleButton.grid(row=0, column=3) + leftEnemizerFrame = Frame(self) + rightEnemizerFrame = Frame(self) + leftEnemizerFrame.pack(side=LEFT, anchor=N) + rightEnemizerFrame.pack(side=RIGHT, anchor=N) ## Randomize Enemies - enemizerEnemyFrame = Frame(self) - enemizerEnemyFrame.grid(row=1, column=0) - enemizerEnemyLabel = Label(enemizerEnemyFrame, text='Enemy shuffle') - enemizerEnemyLabel.pack(side=LEFT) - self.enemyShuffleVar = StringVar() - self.enemyShuffleVar.set('none') - enemizerEnemyOption = OptionMenu(enemizerEnemyFrame, self.enemyShuffleVar, 'none', 'shuffled', 'chaos') - enemizerEnemyOption.pack(side=LEFT) + key = "enemyshuffle" + self.enemizerWidgets[key] = widgets.make_widget( + self, + "selectbox", + leftEnemizerFrame, + "Enemy Shuffle", + None, + {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, + { + "Vanilla": "none", + "Shuffled": "shuffled", + "Chaos": "chaos" + } + ) + self.enemizerWidgets[key].pack(anchor=W) ## Randomize Bosses - enemizerBossFrame = Frame(self) - enemizerBossFrame.grid(row=1, column=1) - enemizerBossLabel = Label(enemizerBossFrame, text='Boss shuffle') - enemizerBossLabel.pack(side=LEFT) - self.enemizerBossVar = StringVar() - self.enemizerBossVar.set('none') - enemizerBossOption = OptionMenu(enemizerBossFrame, self.enemizerBossVar, 'none', 'basic', 'normal', 'chaos') - enemizerBossOption.pack(side=LEFT) + key = "bossshuffle" + self.enemizerWidgets[key] = widgets.make_widget( + self, + "selectbox", + leftEnemizerFrame, + "Boss Shuffle", + None, + {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, + { + "Vanilla": "none", + "Basic": "basic", + "Normal": "normal", + "Chaos": "chaos" + } + ) + self.enemizerWidgets[key].pack(anchor=W) ## Enemy Damage - enemizerDamageFrame = Frame(self) - enemizerDamageFrame.grid(row=1, column=2) - enemizerDamageLabel = Label(enemizerDamageFrame, text='Enemy damage') - enemizerDamageLabel.pack(side=LEFT) - self.enemizerDamageVar = StringVar() - self.enemizerDamageVar.set('default') - enemizerDamageOption = OptionMenu(enemizerDamageFrame, self.enemizerDamageVar, 'default', 'shuffled', 'chaos') - enemizerDamageOption.pack(side=LEFT) + key = "enemydamage" + self.enemizerWidgets[key] = widgets.make_widget( + self, + "selectbox", + rightEnemizerFrame, + "Enemy Damage", + None, + {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, + { + "Vanilla": "default", + "Shuffled": "shuffled", + "Chaos": "chaos" + } + ) + self.enemizerWidgets[key].pack(anchor=E) ## Enemy Health - enemizerHealthFrame = Frame(self) - enemizerHealthFrame.grid(row=1, column=3) - enemizerHealthLabel = Label(enemizerHealthFrame, text='Enemy health') - enemizerHealthLabel.pack(side=LEFT) - self.enemizerHealthVar = StringVar() - self.enemizerHealthVar.set('default') - enemizerHealthOption = OptionMenu(enemizerHealthFrame, self.enemizerHealthVar, 'default', 'easy', 'normal', 'hard', 'expert') - enemizerHealthOption.pack(side=LEFT) + key = "enemyhealth" + self.enemizerWidgets[key] = widgets.make_widget( + self, + "selectbox", + rightEnemizerFrame, + "Enemy Health", + None, + {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, + { + "Vanilla": "default", + "Easy": "easy", + "Normal": "normal", + "Hard": "hard", + "Expert": "expert" + } + ) + self.enemizerWidgets[key].pack(anchor=E) return self,working_dirs From 3065d17d63be76e900f42a4133408b63d842526e Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Tue, 11 Feb 2020 01:28:15 -0800 Subject: [PATCH 021/117] Pretty Dungeon options --- gui/bottom.py | 10 ++--- gui/loadcliargs.py | 10 ++--- gui/randomize/dungeon.py | 85 +++++++++++++++++++++++++++++----------- 3 files changed, 73 insertions(+), 32 deletions(-) diff --git a/gui/bottom.py b/gui/bottom.py index 87dc6ead..cc426d16 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -49,7 +49,7 @@ def bottom_frame(self,parent,args=None): guiargs.accessibility = parent.itemWindow.itemWidgets["accessibility"].storageVar.get() guiargs.algorithm = parent.itemWindow.itemWidgets["sortingalgo"].storageVar.get() guiargs.shuffle = parent.entrandoWindow.entrandoWidgets["entranceshuffle"].storageVar.get() - guiargs.door_shuffle = parent.dungeonRandoWindow.doorShuffleVar.get() + guiargs.door_shuffle = parent.dungeonRandoWindow.dungeonWidgets["dungeondoorshuffle"].storageVar.get() guiargs.heartbeep = parent.gameOptionsWindow.heartbeepVar.get() guiargs.heartcolor = parent.gameOptionsWindow.heartcolorVar.get() guiargs.fastmenu = parent.gameOptionsWindow.fastMenuVar.get() @@ -57,10 +57,10 @@ def bottom_frame(self,parent,args=None): guiargs.skip_playthrough = not bool(parent.generationSetupWindow.createSpoilerVar.get()) guiargs.suppress_rom = bool(parent.generationSetupWindow.suppressRomVar.get()) guiargs.openpyramid = bool(parent.entrandoWindow.entrandoWidgets["openpyramid"].storageVar.get()) - guiargs.mapshuffle = bool(parent.dungeonRandoWindow.mapshuffleVar.get()) - guiargs.compassshuffle = bool(parent.dungeonRandoWindow.compassshuffleVar.get()) - guiargs.keyshuffle = bool(parent.dungeonRandoWindow.keyshuffleVar.get()) - guiargs.bigkeyshuffle = bool(parent.dungeonRandoWindow.bigkeyshuffleVar.get()) + guiargs.mapshuffle = bool(parent.dungeonRandoWindow.dungeonWidgets["mapshuffle"].storageVar.get()) + guiargs.compassshuffle = bool(parent.dungeonRandoWindow.dungeonWidgets["compassshuffle"].storageVar.get()) + guiargs.keyshuffle = bool(parent.dungeonRandoWindow.dungeonWidgets["smallkeyshuffle"].storageVar.get()) + guiargs.bigkeyshuffle = bool(parent.dungeonRandoWindow.dungeonWidgets["bigkeyshuffle"].storageVar.get()) guiargs.retro = bool(parent.itemWindow.itemWidgets["retro"].storageVar.get()) guiargs.quickswap = bool(parent.gameOptionsWindow.quickSwapVar.get()) guiargs.disablemusic = bool(parent.gameOptionsWindow.disableMusicVar.get()) diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index a8c4b42b..4a5afa7a 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -6,10 +6,10 @@ def loadcliargs(gui,args): # load values from commandline args gui.generationSetupWindow.createSpoilerVar.set(int(args.create_spoiler)) gui.generationSetupWindow.suppressRomVar.set(int(args.suppress_rom)) - gui.dungeonRandoWindow.mapshuffleVar.set(args.mapshuffle) - gui.dungeonRandoWindow.compassshuffleVar.set(args.compassshuffle) - gui.dungeonRandoWindow.keyshuffleVar.set(args.keyshuffle) - gui.dungeonRandoWindow.bigkeyshuffleVar.set(args.bigkeyshuffle) + gui.dungeonRandoWindow.dungeonWidgets["mapshuffle"].storageVar.set(args.mapshuffle) + gui.dungeonRandoWindow.dungeonWidgets["compassshuffle"].storageVar.set(args.compassshuffle) + gui.dungeonRandoWindow.dungeonWidgets["smallkeyshuffle"].storageVar.set(args.keyshuffle) + gui.dungeonRandoWindow.dungeonWidgets["bigkeyshuffle"].storageVar.set(args.bigkeyshuffle) gui.itemWindow.itemWidgets["retro"].storageVar.set(args.retro) gui.entrandoWindow.entrandoWidgets["openpyramid"].storageVar.set(args.openpyramid) gui.gameOptionsWindow.quickSwapVar.set(int(args.quickswap)) @@ -32,7 +32,7 @@ def loadcliargs(gui,args): gui.itemWindow.itemWidgets["crystals_ganon"].storageVar.set(args.crystals_ganon) gui.itemWindow.itemWidgets["sortingalgo"].storageVar.set(args.algorithm) gui.entrandoWindow.entrandoWidgets["entranceshuffle"].storageVar.set(args.shuffle) - gui.dungeonRandoWindow.doorShuffleVar.set(args.door_shuffle) + gui.dungeonRandoWindow.dungeonWidgets["dungeondoorshuffle"].storageVar.set(args.door_shuffle) gui.gameOptionsWindow.heartcolorVar.set(args.heartcolor) gui.gameOptionsWindow.heartbeepVar.set(args.heartbeep) gui.gameOptionsWindow.fastMenuVar.set(args.fastmenu) diff --git a/gui/randomize/dungeon.py b/gui/randomize/dungeon.py index c0fabfb7..b036389f 100644 --- a/gui/randomize/dungeon.py +++ b/gui/randomize/dungeon.py @@ -1,38 +1,79 @@ from tkinter import ttk, IntVar, StringVar, Checkbutton, Frame, Label, OptionMenu, E, W, LEFT, RIGHT +import gui.widgets as widgets def dungeon_page(parent): + # Dungeon Shuffle self = ttk.Frame(parent) # Dungeon Shuffle options + self.dungeonWidgets = {} + ## Dungeon Item Shuffle mcsbshuffleFrame = Frame(self) mcsbshuffleFrame.pack(anchor=W) - mcsbLabel = Label(mcsbshuffleFrame, text="Shuffle: ") - mcsbLabel.grid(row=0, column=0) + mscbLabel = Label(mcsbshuffleFrame, text="Shuffle: ") + mscbLabel.pack(side=LEFT) + ## Map Shuffle - self.mapshuffleVar = IntVar() - mapshuffleCheckbutton = Checkbutton(mcsbshuffleFrame, text="Maps", variable=self.mapshuffleVar) - mapshuffleCheckbutton.grid(row=0, column=1) + key = "mapshuffle" + self.dungeonWidgets[key] = widgets.make_widget( + self, + "checkbox", + mcsbshuffleFrame, + "Maps", + None + ) + self.dungeonWidgets[key].pack(side=LEFT) + ## Compass Shuffle - self.compassshuffleVar = IntVar() - compassshuffleCheckbutton = Checkbutton(mcsbshuffleFrame, text="Compasses", variable=self.compassshuffleVar) - compassshuffleCheckbutton.grid(row=0, column=2) + key = "compassshuffle" + self.dungeonWidgets[key] = widgets.make_widget( + self, + "checkbox", + mcsbshuffleFrame, + "Compasses", + None + ) + self.dungeonWidgets[key].pack(side=LEFT) + ## Small Key Shuffle - self.keyshuffleVar = IntVar() - keyshuffleCheckbutton = Checkbutton(mcsbshuffleFrame, text="Keys", variable=self.keyshuffleVar) - keyshuffleCheckbutton.grid(row=0, column=3) + key = "smallkeyshuffle" + self.dungeonWidgets[key] = widgets.make_widget( + self, + "checkbox", + mcsbshuffleFrame, + "Small Keys", + None + ) + self.dungeonWidgets[key].pack(side=LEFT) + ## Big Key Shuffle - self.bigkeyshuffleVar = IntVar() - bigkeyshuffleCheckbutton = Checkbutton(mcsbshuffleFrame, text="BigKeys", variable=self.bigkeyshuffleVar) - bigkeyshuffleCheckbutton.grid(row=0, column=4) + key = "bigkeyshuffle" + self.dungeonWidgets[key] = widgets.make_widget( + self, + "checkbox", + mcsbshuffleFrame, + "Big Keys", + None + ) + self.dungeonWidgets[key].pack(side=LEFT) + ## Dungeon Door Shuffle - doorShuffleFrame = Frame(self) - self.doorShuffleVar = StringVar() - self.doorShuffleVar.set('basic') - doorShuffleOptionMenu = OptionMenu(doorShuffleFrame, self.doorShuffleVar, 'vanilla', 'basic', 'crossed', 'experimental') - doorShuffleOptionMenu.pack(side=RIGHT) - doorShuffleLabel = Label(doorShuffleFrame, text='Door shuffle algorithm') - doorShuffleLabel.pack(side=LEFT) - doorShuffleFrame.pack(anchor=W) + key = "dungeondoorshuffle" + self.dungeonWidgets[key] = widgets.make_widget( + self, + "selectbox", + self, + "Dungeon Door Shuffle", + None, + {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}, "default": "Basic"}, + { + "Vanilla": "vanilla", + "Basic": "basic", + "Crossed": "crossed", + "Experimental": "experimental" + } + ) + self.dungeonWidgets[key].pack(anchor=W) return self From 64e0d8ebcf7c369af2d876a14621d51f86889d65 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Tue, 11 Feb 2020 01:59:41 -0800 Subject: [PATCH 022/117] Pretty Multiworld options --- gui/bottom.py | 2 +- gui/loadcliargs.py | 2 +- gui/randomize/multiworld.py | 34 ++++++++++++++++++++++------------ gui/widgets.py | 22 +++++++++++++++++++++- 4 files changed, 45 insertions(+), 15 deletions(-) diff --git a/gui/bottom.py b/gui/bottom.py index cc426d16..3eee7427 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -31,7 +31,7 @@ def bottom_frame(self,parent,args=None): def generateRom(): guiargs = Namespace() - guiargs.multi = int(parent.multiworldWindow.worldVar.get()) + guiargs.multi = int(parent.multiworldWindow.multiworldWidgets["worlds"].storageVar.get()) guiargs.names = parent.multiworldWindow.namesVar.get() guiargs.seed = int(parent.farBottomFrame.seedVar.get()) if parent.farBottomFrame.seedVar.get() else None guiargs.count = int(parent.farBottomFrame.countVar.get()) if parent.farBottomFrame.countVar.get() != '1' else None diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index 4a5afa7a..d72209d7 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -15,7 +15,7 @@ def loadcliargs(gui,args): gui.gameOptionsWindow.quickSwapVar.set(int(args.quickswap)) gui.gameOptionsWindow.disableMusicVar.set(int(args.disablemusic)) if args.multi: - gui.multiworldWindow.worldVar.set(str(args.multi)) + gui.multiworldWindow.multiworldWidgets["worlds"].storageVar.set(str(args.multi)) if args.count: gui.farBottomFrame.countVar.set(str(args.count)) if args.seed: diff --git a/gui/randomize/multiworld.py b/gui/randomize/multiworld.py index dcacf293..8e5e6f7c 100644 --- a/gui/randomize/multiworld.py +++ b/gui/randomize/multiworld.py @@ -1,25 +1,35 @@ -from tkinter import ttk, StringVar, Entry, Frame, Label, Spinbox, E, W, LEFT, RIGHT +from tkinter import ttk, StringVar, Entry, Frame, Label, Spinbox, N, E, W, X, LEFT, RIGHT +import gui.widgets as widgets def multiworld_page(parent,working_dirs): + # Multiworld self = ttk.Frame(parent) - # Multiworld - multiFrame = Frame(self) + # Multiworld options + self.multiworldWidgets = {} + ## Number of Worlds - worldLabel = Label(multiFrame, text='Worlds') - self.worldVar = StringVar(value=working_dirs["multi.worlds"]) - worldSpinbox = Spinbox(multiFrame, from_=1, to=100, width=5, textvariable=self.worldVar) - worldLabel.pack(side=LEFT) - worldSpinbox.pack(side=LEFT) + key = "worlds" + self.multiworldWidgets[key] = widgets.make_widget( + self, + "spinbox", + self, + "Worlds", + None, + {"label": {"side": LEFT}, "spinbox": {"side": RIGHT}} + ) + self.multiworldWidgets[key].pack(side=LEFT, anchor=N) + ## List of Player Names - namesLabel = Label(multiFrame, text='Player names') + namesFrame = Frame(self) + namesLabel = Label(namesFrame, text='Player names') self.namesVar = StringVar(value=working_dirs["multi.names"]) def saveMultiNames(caller,_,mode): working_dirs["multi.names"] = self.namesVar.get() self.namesVar.trace_add("write",saveMultiNames) - namesEntry = Entry(multiFrame, textvariable=self.namesVar) + namesEntry = Entry(namesFrame, textvariable=self.namesVar) namesLabel.pack(side=LEFT) - namesEntry.pack(side=LEFT) - multiFrame.pack(anchor=W) + namesEntry.pack(side=LEFT, fill=X, expand=True) + namesFrame.pack(anchor=N, fill=X, expand=True) return self,working_dirs diff --git a/gui/widgets.py b/gui/widgets.py index 5887919a..db2629e8 100644 --- a/gui/widgets.py +++ b/gui/widgets.py @@ -1,4 +1,4 @@ -from tkinter import Checkbutton, Entry, Frame, IntVar, Label, OptionMenu, StringVar +from tkinter import Checkbutton, Entry, Frame, IntVar, Label, OptionMenu, Spinbox, StringVar def make_checkbox(self, parent, label, storageVar, packAttrs): self = Frame(parent) @@ -28,6 +28,22 @@ def make_selectbox(self, parent, label, options, storageVar, packAttrs): self.selectbox.pack(packAttrs["selectbox"]) return self +def make_spinbox(self, parent, label, storageVar, packAttrs): + self = Frame(parent) + self.storageVar = storageVar + self.label = Label(self, text=label) + self.label.pack(packAttrs["label"]) + fromNum = 1 + toNum = 100 + if "spinbox" in packAttrs: + if "from" in packAttrs: + fromNum = packAttrs["spinbox"]["from"] + if "to" in packAttrs: + toNum = packAttrs["spinbox"]["to"] + self.spinbox = Spinbox(self, from_=fromNum, to=toNum, width=5, textvariable=self.storageVar) + self.spinbox.pack(packAttrs["spinbox"]) + return self + def make_textbox(self, parent, label, storageVar, packAttrs): self = Frame(parent) self.storageVar = storageVar @@ -54,6 +70,10 @@ def make_widget(self, type, parent, label, storageVar=None, packAttrs=dict(), op if thisStorageVar is None: thisStorageVar = StringVar() widget = make_selectbox(self, parent, label, options, thisStorageVar, packAttrs) + elif type == "spinbox": + if thisStorageVar is None: + thisStorageVar = StringVar() + widget = make_spinbox(self, parent, label, thisStorageVar, packAttrs) elif type == "textbox": if thisStorageVar is None: thisStorageVar = StringVar() From 88bb18f12f2ebeb2290e904b10c274ace3eab37a Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Tue, 11 Feb 2020 02:17:50 -0800 Subject: [PATCH 023/117] Pretty Game Options options --- gui/bottom.py | 16 ++-- gui/loadcliargs.py | 16 ++-- gui/randomize/enemizer.py | 4 +- gui/randomize/gameoptions.py | 163 ++++++++++++++++++++++++----------- 4 files changed, 131 insertions(+), 68 deletions(-) diff --git a/gui/bottom.py b/gui/bottom.py index 3eee7427..71b99040 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -50,9 +50,9 @@ def bottom_frame(self,parent,args=None): guiargs.algorithm = parent.itemWindow.itemWidgets["sortingalgo"].storageVar.get() guiargs.shuffle = parent.entrandoWindow.entrandoWidgets["entranceshuffle"].storageVar.get() guiargs.door_shuffle = parent.dungeonRandoWindow.dungeonWidgets["dungeondoorshuffle"].storageVar.get() - guiargs.heartbeep = parent.gameOptionsWindow.heartbeepVar.get() - guiargs.heartcolor = parent.gameOptionsWindow.heartcolorVar.get() - guiargs.fastmenu = parent.gameOptionsWindow.fastMenuVar.get() + guiargs.heartbeep = parent.gameOptionsWindow.gameOptionsWidgets["heartbeep"].storageVar.get() + guiargs.heartcolor = parent.gameOptionsWindow.gameOptionsWidgets["heartcolor"].storageVar.get() + guiargs.fastmenu = parent.gameOptionsWindow.gameOptionsWidgets["menuspeed"].storageVar.get() guiargs.create_spoiler = bool(parent.generationSetupWindow.createSpoilerVar.get()) guiargs.skip_playthrough = not bool(parent.generationSetupWindow.createSpoilerVar.get()) guiargs.suppress_rom = bool(parent.generationSetupWindow.suppressRomVar.get()) @@ -62,12 +62,12 @@ def bottom_frame(self,parent,args=None): guiargs.keyshuffle = bool(parent.dungeonRandoWindow.dungeonWidgets["smallkeyshuffle"].storageVar.get()) guiargs.bigkeyshuffle = bool(parent.dungeonRandoWindow.dungeonWidgets["bigkeyshuffle"].storageVar.get()) guiargs.retro = bool(parent.itemWindow.itemWidgets["retro"].storageVar.get()) - guiargs.quickswap = bool(parent.gameOptionsWindow.quickSwapVar.get()) - guiargs.disablemusic = bool(parent.gameOptionsWindow.disableMusicVar.get()) - guiargs.ow_palettes = parent.gameOptionsWindow.owPalettesVar.get() - guiargs.uw_palettes = parent.gameOptionsWindow.uwPalettesVar.get() + guiargs.quickswap = bool(parent.gameOptionsWindow.gameOptionsWidgets["quickswap"].storageVar.get()) + guiargs.disablemusic = bool(parent.gameOptionsWindow.gameOptionsWidgets["nobgm"].storageVar.get()) + guiargs.ow_palettes = parent.gameOptionsWindow.gameOptionsWidgets["owpalettes"].storageVar.get() + guiargs.uw_palettes = parent.gameOptionsWindow.gameOptionsWidgets["uwpalettes"].storageVar.get() guiargs.shuffleganon = bool(parent.entrandoWindow.entrandoWidgets["shuffleganon"].storageVar.get()) - guiargs.hints = bool(parent.gameOptionsWindow.hintsVar.get()) + guiargs.hints = bool(parent.gameOptionsWindow.gameOptionsWidgets["hints"].storageVar.get()) guiargs.enemizercli = parent.enemizerWindow.enemizerCLIpathVar.get() guiargs.shufflebosses = parent.enemizerWindow.enemizerWidgets["bossshuffle"].storageVar.get() guiargs.shuffleenemies = parent.enemizerWindow.enemizerWidgets["enemyshuffle"].storageVar.get() diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index d72209d7..f9c73c23 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -12,8 +12,8 @@ def loadcliargs(gui,args): gui.dungeonRandoWindow.dungeonWidgets["bigkeyshuffle"].storageVar.set(args.bigkeyshuffle) gui.itemWindow.itemWidgets["retro"].storageVar.set(args.retro) gui.entrandoWindow.entrandoWidgets["openpyramid"].storageVar.set(args.openpyramid) - gui.gameOptionsWindow.quickSwapVar.set(int(args.quickswap)) - gui.gameOptionsWindow.disableMusicVar.set(int(args.disablemusic)) + gui.gameOptionsWindow.gameOptionsWidgets["quickswap"].storageVar.set(int(args.quickswap)) + gui.gameOptionsWindow.gameOptionsWidgets["nobgm"].storageVar.set(int(args.disablemusic)) if args.multi: gui.multiworldWindow.multiworldWidgets["worlds"].storageVar.set(str(args.multi)) if args.count: @@ -33,20 +33,20 @@ def loadcliargs(gui,args): gui.itemWindow.itemWidgets["sortingalgo"].storageVar.set(args.algorithm) gui.entrandoWindow.entrandoWidgets["entranceshuffle"].storageVar.set(args.shuffle) gui.dungeonRandoWindow.dungeonWidgets["dungeondoorshuffle"].storageVar.set(args.door_shuffle) - gui.gameOptionsWindow.heartcolorVar.set(args.heartcolor) - gui.gameOptionsWindow.heartbeepVar.set(args.heartbeep) - gui.gameOptionsWindow.fastMenuVar.set(args.fastmenu) + gui.gameOptionsWindow.gameOptionsWidgets["heartcolor"].storageVar.set(args.heartcolor) + gui.gameOptionsWindow.gameOptionsWidgets["heartbeep"].storageVar.set(args.heartbeep) + gui.gameOptionsWindow.gameOptionsWidgets["menuspeed"].storageVar.set(args.fastmenu) gui.itemWindow.itemWidgets["logiclevel"].storageVar.set(args.logic) gui.generationSetupWindow.romVar.set(args.rom) gui.entrandoWindow.entrandoWidgets["shuffleganon"].storageVar.set(args.shuffleganon) - gui.gameOptionsWindow.hintsVar.set(args.hints) + gui.gameOptionsWindow.gameOptionsWidgets["hints"].storageVar.set(args.hints) gui.enemizerWindow.enemizerCLIpathVar.set(args.enemizercli) gui.enemizerWindow.enemizerWidgets["potshuffle"].storageVar.set(args.shufflepots) gui.enemizerWindow.enemizerWidgets["enemyshuffle"].storageVar.set(args.shuffleenemies) gui.enemizerWindow.enemizerWidgets["bossshuffle"].storageVar.set(args.shufflebosses) gui.enemizerWindow.enemizerWidgets["enemydamage"].storageVar.set(args.enemy_damage) gui.enemizerWindow.enemizerWidgets["enemyhealth"].storageVar.set(args.enemy_health) - gui.gameOptionsWindow.owPalettesVar.set(args.ow_palettes) - gui.gameOptionsWindow.uwPalettesVar.set(args.uw_palettes) + gui.gameOptionsWindow.gameOptionsWidgets["owpalettes"].storageVar.set(args.ow_palettes) + gui.gameOptionsWindow.gameOptionsWidgets["uwpalettes"].storageVar.set(args.uw_palettes) # if args.sprite is not None: # gui.gameOptionsWindow.set_sprite(Sprite(args.sprite)) \ No newline at end of file diff --git a/gui/randomize/enemizer.py b/gui/randomize/enemizer.py index d7ae0524..74e570d7 100644 --- a/gui/randomize/enemizer.py +++ b/gui/randomize/enemizer.py @@ -59,7 +59,7 @@ def enemizer_page(parent,working_dirs): "Chaos": "chaos" } ) - self.enemizerWidgets[key].pack(anchor=W) + self.enemizerWidgets[key].pack(anchor=E) ## Randomize Bosses key = "bossshuffle" @@ -77,7 +77,7 @@ def enemizer_page(parent,working_dirs): "Chaos": "chaos" } ) - self.enemizerWidgets[key].pack(anchor=W) + self.enemizerWidgets[key].pack(anchor=E) ## Enemy Damage key = "enemydamage" diff --git a/gui/randomize/gameoptions.py b/gui/randomize/gameoptions.py index 103aa2aa..2cd1d863 100644 --- a/gui/randomize/gameoptions.py +++ b/gui/randomize/gameoptions.py @@ -1,25 +1,46 @@ from tkinter import ttk, IntVar, StringVar, Button, Checkbutton, Entry, Frame, Label, OptionMenu, E, W, LEFT, RIGHT from classes.SpriteSelector import SpriteSelector +import gui.widgets as widgets def gameoptions_page(parent): + # Game Options self = ttk.Frame(parent) # Game Options options + self.gameOptionsWidgets = {} + ## Hints: Useful/Not useful - self.hintsVar = IntVar() - self.hintsVar.set(1) #set default - hintsCheckbutton = Checkbutton(self, text="Include Helpful Hints", variable=self.hintsVar) - hintsCheckbutton.pack(anchor=W) + key = "hints" + self.gameOptionsWidgets[key] = widgets.make_widget( + self, + "checkbox", + self, + "Include Helpful Hints", + None + ) + self.gameOptionsWidgets[key].pack(anchor=W) ## Disable BGM - self.disableMusicVar = IntVar() - disableMusicCheckbutton = Checkbutton(self, text="Disable music", variable=self.disableMusicVar) - disableMusicCheckbutton.pack(anchor=W) + key = "nobgm" + self.gameOptionsWidgets[key] = widgets.make_widget( + self, + "checkbox", + self, + "Disable Music & MSU-1", + None + ) + self.gameOptionsWidgets[key].pack(anchor=W) ## L/R Quickswap - self.quickSwapVar = IntVar() - quickSwapCheckbutton = Checkbutton(self, text="L/R Quickswapping", variable=self.quickSwapVar) - quickSwapCheckbutton.pack(anchor=W) + key = "quickswap" + self.gameOptionsWidgets[key] = widgets.make_widget( + self, + "checkbox", + self, + "L/R Quickswapping", + None + ) + self.gameOptionsWidgets[key].pack(anchor=W) leftRomOptionsFrame = Frame(self) rightRomOptionsFrame = Frame(self) @@ -27,24 +48,42 @@ def gameoptions_page(parent): rightRomOptionsFrame.pack(side=RIGHT) ## Heart Color - heartcolorFrame = Frame(leftRomOptionsFrame) - heartcolorLabel = Label(heartcolorFrame, text='Heart color') - heartcolorLabel.pack(side=LEFT) - self.heartcolorVar = StringVar() - self.heartcolorVar.set('red') - heartcolorOptionMenu = OptionMenu(heartcolorFrame, self.heartcolorVar, 'red', 'blue', 'green', 'yellow', 'random') - heartcolorOptionMenu.pack(side=RIGHT) - heartcolorFrame.pack(anchor=E) + key = "heartcolor" + self.gameOptionsWidgets[key] = widgets.make_widget( + self, + "selectbox", + leftRomOptionsFrame, + "Heart Color", + None, + {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, + { + "Red": "red", + "Blue": "blue", + "Green": "green", + "Yellow": "yellow", + "Random": "random" + } + ) + self.gameOptionsWidgets[key].pack(anchor=E) ## Heart Beep Speed - heartbeepFrame = Frame(leftRomOptionsFrame) - heartbeepLabel = Label(heartbeepFrame, text='Heart Beep sound rate') - heartbeepLabel.pack(side=LEFT) - self.heartbeepVar = StringVar() - self.heartbeepVar.set('normal') - heartbeepOptionMenu = OptionMenu(heartbeepFrame, self.heartbeepVar, 'double', 'normal', 'half', 'quarter', 'off') - heartbeepOptionMenu.pack(side=LEFT) - heartbeepFrame.pack(anchor=E) + key = "heartbeep" + self.gameOptionsWidgets[key] = widgets.make_widget( + self, + "selectbox", + leftRomOptionsFrame, + "Heart Beep sound rate", + None, + {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}, "default": "Normal"}, + { + "Double": "double", + "Normal": "normal", + "Half": "half", + "Quarter": "quarter", + "Off": "off" + } + ) + self.gameOptionsWidgets[key].pack(anchor=W) ## Sprite selection spriteDialogFrame = Frame(leftRomOptionsFrame) @@ -76,33 +115,57 @@ def gameoptions_page(parent): spriteDialogFrame.pack(anchor=E) ## Menu Speed - fastMenuFrame = Frame(rightRomOptionsFrame) - fastMenuLabel = Label(fastMenuFrame, text='Menu speed') - fastMenuLabel.pack(side=LEFT) - self.fastMenuVar = StringVar() - self.fastMenuVar.set('normal') - fastMenuOptionMenu = OptionMenu(fastMenuFrame, self.fastMenuVar, 'normal', 'instant', 'double', 'triple', 'quadruple', 'half') - fastMenuOptionMenu.pack(side=LEFT) - fastMenuFrame.pack(anchor=E) + key = "menuspeed" + self.gameOptionsWidgets[key] = widgets.make_widget( + self, + "selectbox", + rightRomOptionsFrame, + "Menu Speed", + None, + {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}, "default": "Normal"}, + { + "Instant": "instant", + "Quadruple": "quadruple", + "Triple": "triple", + "Double": "double", + "Normal": "normal", + "Half": "half" + } + ) + self.gameOptionsWidgets[key].pack(anchor=E) ## Overworld Palettes (not Enemizer) - owPalettesFrame = Frame(rightRomOptionsFrame) - owPalettesLabel = Label(owPalettesFrame, text='Overworld palettes') - owPalettesLabel.pack(side=LEFT) - self.owPalettesVar = StringVar() - self.owPalettesVar.set('default') - owPalettesOptionMenu = OptionMenu(owPalettesFrame, self.owPalettesVar, 'default', 'random', 'blackout') - owPalettesOptionMenu.pack(side=LEFT) - owPalettesFrame.pack(anchor=E) + key = "owpalettes" + self.gameOptionsWidgets[key] = widgets.make_widget( + self, + "selectbox", + rightRomOptionsFrame, + "Overworld Palettes", + None, + {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, + { + "Default": "default", + "Random": "random", + "Blackout": "blackout" + } + ) + self.gameOptionsWidgets[key].pack(anchor=E) ## Underworld Palettes (not Enemizer) - uwPalettesFrame = Frame(rightRomOptionsFrame) - uwPalettesLabel = Label(uwPalettesFrame, text='Dungeon palettes') - uwPalettesLabel.pack(side=LEFT) - self.uwPalettesVar = StringVar() - self.uwPalettesVar.set('default') - uwPalettesOptionMenu = OptionMenu(uwPalettesFrame, self.uwPalettesVar, 'default', 'random', 'blackout') - uwPalettesOptionMenu.pack(side=LEFT) - uwPalettesFrame.pack(anchor=E) + key = "uwpalettes" + self.gameOptionsWidgets[key] = widgets.make_widget( + self, + "selectbox", + rightRomOptionsFrame, + "Underworld Palettes", + None, + {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, + { + "Default": "default", + "Random": "random", + "Blackout": "blackout" + } + ) + self.gameOptionsWidgets[key].pack(anchor=E) return self From 8788a2bec288d43b366b8822ef750249dff47085 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Tue, 11 Feb 2020 02:25:09 -0800 Subject: [PATCH 024/117] Pretty Generation Setup options --- gui/bottom.py | 6 +++--- gui/loadcliargs.py | 4 ++-- gui/randomize/generation.py | 43 +++++++++++++++++++++++++++++-------- 3 files changed, 39 insertions(+), 14 deletions(-) diff --git a/gui/bottom.py b/gui/bottom.py index 71b99040..c7e74c72 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -53,9 +53,9 @@ def bottom_frame(self,parent,args=None): guiargs.heartbeep = parent.gameOptionsWindow.gameOptionsWidgets["heartbeep"].storageVar.get() guiargs.heartcolor = parent.gameOptionsWindow.gameOptionsWidgets["heartcolor"].storageVar.get() guiargs.fastmenu = parent.gameOptionsWindow.gameOptionsWidgets["menuspeed"].storageVar.get() - guiargs.create_spoiler = bool(parent.generationSetupWindow.createSpoilerVar.get()) - guiargs.skip_playthrough = not bool(parent.generationSetupWindow.createSpoilerVar.get()) - guiargs.suppress_rom = bool(parent.generationSetupWindow.suppressRomVar.get()) + guiargs.create_spoiler = bool(parent.generationSetupWindow.generationWidgets["spoiler"].storageVar.get()) + guiargs.skip_playthrough = not bool(parent.generationSetupWindow.generationWidgets["spoiler"].storageVar.get()) + guiargs.suppress_rom = bool(parent.generationSetupWindow.generationWidgets["suppressrom"].storageVar.get()) guiargs.openpyramid = bool(parent.entrandoWindow.entrandoWidgets["openpyramid"].storageVar.get()) guiargs.mapshuffle = bool(parent.dungeonRandoWindow.dungeonWidgets["mapshuffle"].storageVar.get()) guiargs.compassshuffle = bool(parent.dungeonRandoWindow.dungeonWidgets["compassshuffle"].storageVar.get()) diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index f9c73c23..c2fbfe69 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -4,8 +4,8 @@ def loadcliargs(gui,args): if type(v) is dict: setattr(args, k, v[1]) # only get values for player 1 for now # load values from commandline args - gui.generationSetupWindow.createSpoilerVar.set(int(args.create_spoiler)) - gui.generationSetupWindow.suppressRomVar.set(int(args.suppress_rom)) + gui.generationSetupWindow.generationWidgets["spoiler"].storageVar.set(int(args.create_spoiler)) + gui.generationSetupWindow.generationWidgets["suppressrom"].storageVar.set(int(args.suppress_rom)) gui.dungeonRandoWindow.dungeonWidgets["mapshuffle"].storageVar.set(args.mapshuffle) gui.dungeonRandoWindow.dungeonWidgets["compassshuffle"].storageVar.set(args.compassshuffle) gui.dungeonRandoWindow.dungeonWidgets["smallkeyshuffle"].storageVar.set(args.keyshuffle) diff --git a/gui/randomize/generation.py b/gui/randomize/generation.py index b0f7a565..ecccd3e3 100644 --- a/gui/randomize/generation.py +++ b/gui/randomize/generation.py @@ -1,22 +1,47 @@ import os from tkinter import ttk, filedialog, IntVar, StringVar, Button, Checkbutton, Entry, Frame, Label, E, W, LEFT, RIGHT, X +import gui.widgets as widgets def generation_page(parent,working_dirs): + # Generation Setup self = ttk.Frame(parent) # Generation Setup options + self.generationWidgets = {} + ## Generate Spoiler - self.createSpoilerVar = IntVar() - createSpoilerCheckbutton = Checkbutton(self, text="Create Spoiler Log", variable=self.createSpoilerVar) - createSpoilerCheckbutton.pack(anchor=W) + key = "spoiler" + self.generationWidgets[key] = widgets.make_widget( + self, + "checkbox", + self, + "Create Spoiler Log", + None + ) + self.generationWidgets[key].pack(anchor=W) + ## Don't make ROM - self.suppressRomVar = IntVar() - suppressRomCheckbutton = Checkbutton(self, text="Do not create patched Rom", variable=self.suppressRomVar) - suppressRomCheckbutton.pack(anchor=W) + key = "suppressrom" + self.generationWidgets[key] = widgets.make_widget( + self, + "checkbox", + self, + "Do not create patched ROM", + None + ) + self.generationWidgets[key].pack(anchor=W) + ## Use Custom Item Pool as defined in Custom tab - self.customVar = IntVar() - customCheckbutton = Checkbutton(self, text="Use custom item pool", variable=self.customVar) - customCheckbutton.pack(anchor=W) + key = "usecustompool" + self.generationWidgets[key] = widgets.make_widget( + self, + "checkbox", + self, + "Use custom item pool", + None + ) + self.generationWidgets[key].pack(anchor=W) + ## Locate base ROM baseRomFrame = Frame(self) baseRomLabel = Label(baseRomFrame, text='Base Rom: ') From 0ade328e27ed11ddacb4ff5edc37ff3ea7a748d5 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Tue, 11 Feb 2020 02:31:05 -0800 Subject: [PATCH 025/117] Standardize width of selectboxes --- gui/widgets.py | 1 + 1 file changed, 1 insertion(+) diff --git a/gui/widgets.py b/gui/widgets.py index db2629e8..2b91584e 100644 --- a/gui/widgets.py +++ b/gui/widgets.py @@ -24,6 +24,7 @@ def make_selectbox(self, parent, label, options, storageVar, packAttrs): self.label = Label(self, text=label) self.label.pack(packAttrs["label"]) self.selectbox = OptionMenu(self, self.labelVar, *options.keys()) + self.selectbox.config(width=15) self.labelVar.set(packAttrs["default"] if "default" in packAttrs else list(options.keys())[0]) self.selectbox.pack(packAttrs["selectbox"]) return self From fdc55cc8a1668d75c7a38480cfb1238cf5b30c6f Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Tue, 11 Feb 2020 02:37:05 -0800 Subject: [PATCH 026/117] Pretty Adjust options --- gui/adjust/overview.py | 177 +++++++++++++++++++++++++++-------------- 1 file changed, 119 insertions(+), 58 deletions(-) diff --git a/gui/adjust/overview.py b/gui/adjust/overview.py index 842a9b37..1db8dd51 100644 --- a/gui/adjust/overview.py +++ b/gui/adjust/overview.py @@ -2,20 +2,37 @@ from tkinter import ttk, filedialog, messagebox, IntVar, StringVar, Button, Chec from AdjusterMain import adjust from argparse import Namespace from classes.SpriteSelector import SpriteSelector +import gui.widgets as widgets import logging def adjust_page(top,parent,working_dirs): + # Adjust page self = ttk.Frame(parent) - # Disable BGM - self.disableMusicVar2 = IntVar() - disableMusicCheckbutton2 = Checkbutton(self, text="Disable music", variable=self.disableMusicVar2) - disableMusicCheckbutton2.pack(anchor=W) + # Adjust options + self.adjustWidgets = {} - # L/R Quickswap - self.quickSwapVar2 = IntVar() - quickSwapCheckbutton2 = Checkbutton(self, text="L/R Quickswapping", variable=self.quickSwapVar2) - quickSwapCheckbutton2.pack(anchor=W) + ## Disable BGM + key = "nobgm" + self.adjustWidgets[key] = widgets.make_widget( + self, + "checkbox", + self, + "Disable Music & MSU-1", + None + ) + self.adjustWidgets[key].pack(anchor=W) + + ## L/R Quickswap + key = "quickswap" + self.adjustWidgets[key] = widgets.make_widget( + self, + "checkbox", + self, + "L/R Quickswapping", + None + ) + self.adjustWidgets[key].pack(anchor=W) selectOptionsFrame = Frame(self) leftAdjustFrame = Frame(selectOptionsFrame) @@ -26,25 +43,43 @@ def adjust_page(top,parent,working_dirs): rightAdjustFrame.pack(side=RIGHT) bottomAdjustFrame.pack(fill=X, expand=True) - # Heart Color - heartcolorFrame2 = Frame(leftAdjustFrame) - heartcolorLabel2 = Label(heartcolorFrame2, text='Heart color') - heartcolorLabel2.pack(side=LEFT) - self.heartcolorVar2 = StringVar() - self.heartcolorVar2.set('red') - heartcolorOptionMenu2 = OptionMenu(heartcolorFrame2, self.heartcolorVar2, 'red', 'blue', 'green', 'yellow', 'random') - heartcolorOptionMenu2.pack(side=RIGHT) - heartcolorFrame2.pack(anchor=E) + ## Heart Color + key = "heartcolor" + self.adjustWidgets[key] = widgets.make_widget( + self, + "selectbox", + leftAdjustFrame, + "Heart Color", + None, + {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, + { + "Red": "red", + "Blue": "blue", + "Green": "green", + "Yellow": "yellow", + "Random": "random" + } + ) + self.adjustWidgets[key].pack(anchor=E) - # Heart Beep Speed - heartbeepFrame2 = Frame(leftAdjustFrame) - heartbeepLabel2 = Label(heartbeepFrame2, text='Heart Beep sound rate') - heartbeepLabel2.pack(side=LEFT) - self.heartbeepVar2 = StringVar() - self.heartbeepVar2.set('normal') - heartbeepOptionMenu2 = OptionMenu(heartbeepFrame2, self.heartbeepVar2, 'double', 'normal', 'half', 'quarter', 'off') - heartbeepOptionMenu2.pack(side=RIGHT) - heartbeepFrame2.pack(anchor=E) + ## Heart Beep Speed + key = "heartbeep" + self.adjustWidgets[key] = widgets.make_widget( + self, + "selectbox", + leftAdjustFrame, + "Heart Beep sound rate", + None, + {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}, "default": "Normal"}, + { + "Double": "double", + "Normal": "normal", + "Half": "half", + "Quarter": "quarter", + "Off": "off" + } + ) + self.adjustWidgets[key].pack(anchor=W) # Sprite Selection self.spriteNameVar2 = StringVar() @@ -71,33 +106,59 @@ def adjust_page(top,parent,working_dirs): spriteSelectButton2.pack(side=LEFT) spriteDialogFrame2.pack(anchor=E) - # Menu Speed - fastMenuFrame2 = Frame(rightAdjustFrame) - fastMenuLabel2 = Label(fastMenuFrame2, text='Menu speed') - fastMenuLabel2.pack(side=LEFT) - self.fastMenuVar2 = StringVar() - self.fastMenuVar2.set("normal") - fastMenuOptionMenu2 = OptionMenu(fastMenuFrame2, self.fastMenuVar2, 'normal', 'instant', 'double', 'triple', 'quadruple', 'half') - fastMenuOptionMenu2.pack(side=RIGHT) - fastMenuFrame2.pack(anchor=E) + ## Menu Speed + key = "menuspeed" + self.adjustWidgets[key] = widgets.make_widget( + self, + "selectbox", + rightAdjustFrame, + "Menu Speed", + None, + {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}, "default": "Normal"}, + { + "Instant": "instant", + "Quadruple": "quadruple", + "Triple": "triple", + "Double": "double", + "Normal": "normal", + "Half": "half" + } + ) + self.adjustWidgets[key].pack(anchor=E) - owPalettesFrame2 = Frame(rightAdjustFrame) - owPalettesLabel2 = Label(owPalettesFrame2, text='Overworld palettes') - owPalettesLabel2.pack(side=LEFT) - self.owPalettesVar2 = StringVar() - self.owPalettesVar2.set("default") - owPalettesOptionMenu2 = OptionMenu(owPalettesFrame2, self.owPalettesVar2, 'default', 'random', 'blackout') - owPalettesOptionMenu2.pack(side=RIGHT) - owPalettesFrame2.pack(anchor=E) + ## Overworld Palettes (not Enemizer) + key = "owpalettes" + self.adjustWidgets[key] = widgets.make_widget( + self, + "selectbox", + rightAdjustFrame, + "Overworld Palettes", + None, + {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, + { + "Default": "default", + "Random": "random", + "Blackout": "blackout" + } + ) + self.adjustWidgets[key].pack(anchor=E) - uwPalettesFrame2 = Frame(rightAdjustFrame) - uwPalettesLabel2 = Label(uwPalettesFrame2, text='Dungeon palettes') - uwPalettesLabel2.pack(side=LEFT) - self.uwPalettesVar2 = StringVar() - self.uwPalettesVar2.set("default") - uwPalettesOptionMenu2 = OptionMenu(uwPalettesFrame2, self.uwPalettesVar2, 'default', 'random', 'blackout') - uwPalettesOptionMenu2.pack(side=RIGHT) - uwPalettesFrame2.pack(anchor=E) + ## Underworld Palettes (not Enemizer) + key = "uwpalettes" + self.adjustWidgets[key] = widgets.make_widget( + self, + "selectbox", + rightAdjustFrame, + "Underworld Palettes", + None, + {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, + { + "Default": "default", + "Random": "random", + "Blackout": "blackout" + } + ) + self.adjustWidgets[key].pack(anchor=E) adjustRomFrame = Frame(bottomAdjustFrame) adjustRomLabel = Label(adjustRomFrame, text='Rom to adjust: ') @@ -118,13 +179,13 @@ def adjust_page(top,parent,working_dirs): def adjustRom(): guiargs = Namespace() - guiargs.heartbeep = self.heartbeepVar2.get() - guiargs.heartcolor = self.heartcolorVar2.get() - guiargs.fastmenu = self.fastMenuVar2.get() - guiargs.ow_palettes = self.owPalettesVar2.get() - guiargs.uw_palettes = self.uwPalettesVar2.get() - guiargs.quickswap = bool(self.quickSwapVar2.get()) - guiargs.disablemusic = bool(self.disableMusicVar2.get()) + guiargs.heartbeep = self.adjustWidgets["heartbeep"].get() + guiargs.heartcolor = self.adjustWidgets["heartcolor"].get() + guiargs.fastmenu = self.adjustWidgets["menuspeed"].get() + guiargs.ow_palettes = self.adjustWidgets["owpalettes"].get() + guiargs.uw_palettes = self.adjustWidgets["uwpalettes"].get() + guiargs.quickswap = bool(self.adjustWidgets["quickswap"].get()) + guiargs.disablemusic = bool(self.adjustWidgets["nobgm"].get()) guiargs.rom = self.romVar2.get() guiargs.baserom = top.generationSetupWindow.romVar.get() # guiargs.sprite = sprite From 8ac47db507771b4297d21d38605ec71b0ee76392 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Tue, 11 Feb 2020 05:04:00 -0800 Subject: [PATCH 027/117] Pretty Custom options List index out of range when trying to generate game file using Custom Item Pool --- gui/bottom.py | 21 +- gui/custom/overview.py | 1215 +++++++++++++++++++++------------------- gui/widgets.py | 8 +- 3 files changed, 662 insertions(+), 582 deletions(-) diff --git a/gui/bottom.py b/gui/bottom.py index c7e74c72..7aa4d527 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -74,16 +74,17 @@ def bottom_frame(self,parent,args=None): guiargs.enemy_health = parent.enemizerWindow.enemizerWidgets["enemyhealth"].storageVar.get() guiargs.enemy_damage = parent.enemizerWindow.enemizerWidgets["enemydamage"].storageVar.get() guiargs.shufflepots = bool(parent.enemizerWindow.enemizerWidgets["potshuffle"].storageVar.get()) - guiargs.custom = bool(parent.generationSetupWindow.customVar.get()) - guiargs.customitemarray = [int(parent.customContent.bowVar.get()), int(parent.customContent.silverarrowVar.get()), int(parent.customContent.boomerangVar.get()), int(parent.customContent.magicboomerangVar.get()), int(parent.customContent.hookshotVar.get()), int(parent.customContent.mushroomVar.get()), int(parent.customContent.magicpowderVar.get()), int(parent.customContent.firerodVar.get()), - int(parent.customContent.icerodVar.get()), int(parent.customContent.bombosVar.get()), int(parent.customContent.etherVar.get()), int(parent.customContent.quakeVar.get()), int(parent.customContent.lampVar.get()), int(parent.customContent.hammerVar.get()), int(parent.customContent.shovelVar.get()), int(parent.customContent.fluteVar.get()), int(parent.customContent.bugnetVar.get()), - int(parent.customContent.bookVar.get()), int(parent.customContent.bottleVar.get()), int(parent.customContent.somariaVar.get()), int(parent.customContent.byrnaVar.get()), int(parent.customContent.capeVar.get()), int(parent.customContent.mirrorVar.get()), int(parent.customContent.bootsVar.get()), int(parent.customContent.powergloveVar.get()), int(parent.customContent.titansmittVar.get()), - int(parent.customContent.proggloveVar.get()), int(parent.customContent.flippersVar.get()), int(parent.customContent.pearlVar.get()), int(parent.customContent.heartpieceVar.get()), int(parent.customContent.fullheartVar.get()), int(parent.customContent.sancheartVar.get()), int(parent.customContent.sword1Var.get()), int(parent.customContent.sword2Var.get()), - int(parent.customContent.sword3Var.get()), int(parent.customContent.sword4Var.get()), int(parent.customContent.progswordVar.get()), int(parent.customContent.shield1Var.get()), int(parent.customContent.shield2Var.get()), int(parent.customContent.shield3Var.get()), int(parent.customContent.progshieldVar.get()), int(parent.customContent.bluemailVar.get()), - int(parent.customContent.redmailVar.get()), int(parent.customContent.progmailVar.get()), int(parent.customContent.halfmagicVar.get()), int(parent.customContent.quartermagicVar.get()), int(parent.customContent.bcap5Var.get()), int(parent.customContent.bcap10Var.get()), int(parent.customContent.acap5Var.get()), int(parent.customContent.acap10Var.get()), - int(parent.customContent.arrow1Var.get()), int(parent.customContent.arrow10Var.get()), int(parent.customContent.bomb1Var.get()), int(parent.customContent.bomb3Var.get()), int(parent.customContent.rupee1Var.get()), int(parent.customContent.rupee5Var.get()), int(parent.customContent.rupee20Var.get()), int(parent.customContent.rupee50Var.get()), int(parent.customContent.rupee100Var.get()), - int(parent.customContent.rupee300Var.get()), int(parent.customContent.rupoorVar.get()), int(parent.customContent.blueclockVar.get()), int(parent.customContent.greenclockVar.get()), int(parent.customContent.redclockVar.get()), int(parent.customContent.progbowVar.get()), int(parent.customContent.bomb10Var.get()), int(parent.customContent.triforcepieceVar.get()), - int(parent.customContent.triforcecountVar.get()), int(parent.customContent.triforceVar.get()), int(parent.customContent.rupoorcostVar.get()), int(parent.customContent.universalkeyVar.get())] + guiargs.custom = bool(parent.generationSetupWindow.generationWidgets["usecustompool"].storageVar.get()) + guiargs.customitemarray = [int(parent.customContent.customWidgets["bow"].storageVar.get()), int(parent.customContent.customWidgets["silversupgrade"].storageVar.get()), int(parent.customContent.customWidgets["boomerang"].storageVar.get()), int(parent.customContent.customWidgets["redmerang"].storageVar.get()), int(parent.customContent.customWidgets["hookshot"].storageVar.get()), int(parent.customContent.customWidgets["mushroom"].storageVar.get()), int(parent.customContent.customWidgets["powder"].storageVar.get()), int(parent.customContent.customWidgets["firerod"].storageVar.get()), + int(parent.customContent.customWidgets["icerod"].storageVar.get()), int(parent.customContent.customWidgets["bombos"].storageVar.get()), int(parent.customContent.customWidgets["ether"].storageVar.get()), int(parent.customContent.customWidgets["quake"].storageVar.get()), int(parent.customContent.customWidgets["lamp"].storageVar.get()), int(parent.customContent.customWidgets["hammer"].storageVar.get()), int(parent.customContent.customWidgets["shovel"].storageVar.get()), int(parent.customContent.customWidgets["flute"].storageVar.get()), int(parent.customContent.customWidgets["bugnet"].storageVar.get()), + int(parent.customContent.customWidgets["book"].storageVar.get()), int(parent.customContent.customWidgets["bottle"].storageVar.get()), int(parent.customContent.customWidgets["somaria"].storageVar.get()), int(parent.customContent.customWidgets["byrna"].storageVar.get()), int(parent.customContent.customWidgets["cape"].storageVar.get()), int(parent.customContent.customWidgets["mirror"].storageVar.get()), int(parent.customContent.customWidgets["boots"].storageVar.get()), int(parent.customContent.customWidgets["powerglove"].storageVar.get()), int(parent.customContent.customWidgets["titansmitt"].storageVar.get()), + int(parent.customContent.customWidgets["progressiveglove"].storageVar.get()), int(parent.customContent.customWidgets["flippers"].storageVar.get()), int(parent.customContent.customWidgets["pearl"].storageVar.get()), int(parent.customContent.customWidgets["heartpiece"].storageVar.get()), int(parent.customContent.customWidgets["heartcontainer"].storageVar.get()), int(parent.customContent.customWidgets["sancheart"].storageVar.get()), int(parent.customContent.customWidgets["sword1"].storageVar.get()), int(parent.customContent.customWidgets["sword2"].storageVar.get()), + int(parent.customContent.customWidgets["sword3"].storageVar.get()), int(parent.customContent.customWidgets["sword4"].storageVar.get()), int(parent.customContent.customWidgets["progressivesword"].storageVar.get()), int(parent.customContent.customWidgets["shield1"].storageVar.get()), int(parent.customContent.customWidgets["shield2"].storageVar.get()), int(parent.customContent.customWidgets["shield3"].storageVar.get()), int(parent.customContent.customWidgets["progressiveshield"].storageVar.get()), int(parent.customContent.customWidgets["mail2"].storageVar.get()), + int(parent.customContent.customWidgets["mail3"].storageVar.get()), int(parent.customContent.customWidgets["progressivemail"].storageVar.get()), int(parent.customContent.customWidgets["halfmagic"].storageVar.get()), int(parent.customContent.customWidgets["quartermagic"].storageVar.get()), int(parent.customContent.customWidgets["bombsplus5"].storageVar.get()), int(parent.customContent.customWidgets["bombsplus10"].storageVar.get()), int(parent.customContent.customWidgets["arrowsplus5"].storageVar.get()), int(parent.customContent.customWidgets["arrowsplus10"].storageVar.get()), + int(parent.customContent.customWidgets["arrow1"].storageVar.get()), int(parent.customContent.customWidgets["arrow10"].storageVar.get()), int(parent.customContent.customWidgets["bomb1"].storageVar.get()), int(parent.customContent.customWidgets["bomb3"].storageVar.get()), int(parent.customContent.customWidgets["rupee1"].storageVar.get()), int(parent.customContent.customWidgets["rupee5"].storageVar.get()), int(parent.customContent.customWidgets["rupee20"].storageVar.get()), int(parent.customContent.customWidgets["rupee50"].storageVar.get()), int(parent.customContent.customWidgets["rupee100"].storageVar.get()), + int(parent.customContent.customWidgets["rupee300"].storageVar.get()), int(parent.customContent.customWidgets["rupoor"].storageVar.get()), int(parent.customContent.customWidgets["blueclock"].storageVar.get()), int(parent.customContent.customWidgets["greenclock"].storageVar.get()), int(parent.customContent.customWidgets["redclock"].storageVar.get()), int(parent.customContent.customWidgets["progressivebow"].storageVar.get()), int(parent.customContent.customWidgets["bomb10"].storageVar.get()), int(parent.customContent.customWidgets["triforcepieces"].storageVar.get()), + #int(parent.customContent.triforcecountVar.get()), + int(parent.customContent.customWidgets["triforce"].storageVar.get()), int(parent.customContent.customWidgets["rupoorcost"].storageVar.get()), int(parent.customContent.customWidgets["generickeys"].storageVar.get())] guiargs.rom = parent.generationSetupWindow.romVar.get() # guiargs.sprite = parent.gameOptionsWindow.sprite guiargs.outputpath = args.outputpath if args else None diff --git a/gui/custom/overview.py b/gui/custom/overview.py index ead1572b..c9aeed8b 100644 --- a/gui/custom/overview.py +++ b/gui/custom/overview.py @@ -1,6 +1,8 @@ -from tkinter import ttk, StringVar, Entry, Frame, Label, E, W, LEFT, RIGHT, X +from tkinter import ttk, StringVar, Entry, Frame, Label, N, E, W, LEFT, RIGHT, X +import gui.widgets as widgets def custom_page(top,parent): + # Custom Item Pool self = ttk.Frame(parent) def validation(P): @@ -10,584 +12,659 @@ def custom_page(top,parent): return False vcmd=(self.register(validation), '%P') + # Custom Item Pool options + self.customWidgets = {} + itemList1 = Frame(self) itemList2 = Frame(self) itemList3 = Frame(self) itemList4 = Frame(self) itemList5 = Frame(self) - bowFrame = Frame(itemList1) - bowLabel = Label(bowFrame, text='Bow') - self.bowVar = StringVar(value='0') - bowEntry = Entry(bowFrame, textvariable=self.bowVar, width=3, validate='all', vcmd=vcmd) - bowFrame.pack() - bowLabel.pack(anchor=W, side=LEFT, padx=(0,53)) - bowEntry.pack(anchor=E) - - progbowFrame = Frame(itemList1) - progbowLabel = Label(progbowFrame, text='Prog.Bow') - self.progbowVar = StringVar(value='2') - progbowEntry = Entry(progbowFrame, textvariable=self.progbowVar, width=3, validate='all', vcmd=vcmd) - progbowFrame.pack() - progbowLabel.pack(anchor=W, side=LEFT, padx=(0,25)) - progbowEntry.pack(anchor=E) - - boomerangFrame = Frame(itemList1) - boomerangLabel = Label(boomerangFrame, text='Boomerang') - self.boomerangVar = StringVar(value='1') - boomerangEntry = Entry(boomerangFrame, textvariable=self.boomerangVar, width=3, validate='all', vcmd=vcmd) - boomerangFrame.pack() - boomerangLabel.pack(anchor=W, side=LEFT, padx=(0,14)) - boomerangEntry.pack(anchor=E) - - magicboomerangFrame = Frame(itemList1) - magicboomerangLabel = Label(magicboomerangFrame, text='M.Boomerang') - self.magicboomerangVar = StringVar(value='1') - magicboomerangEntry = Entry(magicboomerangFrame, textvariable=self.magicboomerangVar, width=3, validate='all', vcmd=vcmd) - magicboomerangFrame.pack() - magicboomerangLabel.pack(anchor=W, side=LEFT) - magicboomerangEntry.pack(anchor=E) - - hookshotFrame = Frame(itemList1) - hookshotLabel = Label(hookshotFrame, text='Hookshot') - self.hookshotVar = StringVar(value='1') - hookshotEntry = Entry(hookshotFrame, textvariable=self.hookshotVar, width=3, validate='all', vcmd=vcmd) - hookshotFrame.pack() - hookshotLabel.pack(anchor=W, side=LEFT, padx=(0,24)) - hookshotEntry.pack(anchor=E) - - mushroomFrame = Frame(itemList1) - mushroomLabel = Label(mushroomFrame, text='Mushroom') - self.mushroomVar = StringVar(value='1') - mushroomEntry = Entry(mushroomFrame, textvariable=self.mushroomVar, width=3, validate='all', vcmd=vcmd) - mushroomFrame.pack() - mushroomLabel.pack(anchor=W, side=LEFT, padx=(0,17)) - mushroomEntry.pack(anchor=E) - - magicpowderFrame = Frame(itemList1) - magicpowderLabel = Label(magicpowderFrame, text='Magic Powder') - self.magicpowderVar = StringVar(value='1') - magicpowderEntry = Entry(magicpowderFrame, textvariable=self.magicpowderVar, width=3, validate='all', vcmd=vcmd) - magicpowderFrame.pack() - magicpowderLabel.pack(anchor=W, side=LEFT) - magicpowderEntry.pack(anchor=E) - - firerodFrame = Frame(itemList1) - firerodLabel = Label(firerodFrame, text='Fire Rod') - self.firerodVar = StringVar(value='1') - firerodEntry = Entry(firerodFrame, textvariable=self.firerodVar, width=3, validate='all', vcmd=vcmd) - firerodFrame.pack() - firerodLabel.pack(anchor=W, side=LEFT, padx=(0,33)) - firerodEntry.pack(anchor=E) - - icerodFrame = Frame(itemList1) - icerodLabel = Label(icerodFrame, text='Ice Rod') - self.icerodVar = StringVar(value='1') - icerodEntry = Entry(icerodFrame, textvariable=self.icerodVar, width=3, validate='all', vcmd=vcmd) - icerodFrame.pack() - icerodLabel.pack(anchor=W, side=LEFT, padx=(0,37)) - icerodEntry.pack(anchor=E) - - bombosFrame = Frame(itemList1) - bombosLabel = Label(bombosFrame, text='Bombos') - self.bombosVar = StringVar(value='1') - bombosEntry = Entry(bombosFrame, textvariable=self.bombosVar, width=3, validate='all', vcmd=vcmd) - bombosFrame.pack() - bombosLabel.pack(anchor=W, side=LEFT, padx=(0,32)) - bombosEntry.pack(anchor=E) - - etherFrame = Frame(itemList1) - etherLabel = Label(etherFrame, text='Ether') - self.etherVar = StringVar(value='1') - etherEntry = Entry(etherFrame, textvariable=self.etherVar, width=3, validate='all', vcmd=vcmd) - etherFrame.pack() - etherLabel.pack(anchor=W, side=LEFT, padx=(0,49)) - etherEntry.pack(anchor=E) - - quakeFrame = Frame(itemList1) - quakeLabel = Label(quakeFrame, text='Quake') - self.quakeVar = StringVar(value='1') - quakeEntry = Entry(quakeFrame, textvariable=self.quakeVar, width=3, validate='all', vcmd=vcmd) - quakeFrame.pack() - quakeLabel.pack(anchor=W, side=LEFT, padx=(0,42)) - quakeEntry.pack(anchor=E) - - lampFrame = Frame(itemList1) - lampLabel = Label(lampFrame, text='Lamp') - self.lampVar = StringVar(value='1') - lampEntry = Entry(lampFrame, textvariable=self.lampVar, width=3, validate='all', vcmd=vcmd) - lampFrame.pack() - lampLabel.pack(anchor=W, side=LEFT, padx=(0,46)) - lampEntry.pack(anchor=E) - - hammerFrame = Frame(itemList1) - hammerLabel = Label(hammerFrame, text='Hammer') - self.hammerVar = StringVar(value='1') - hammerEntry = Entry(hammerFrame, textvariable=self.hammerVar, width=3, validate='all', vcmd=vcmd) - hammerFrame.pack() - hammerLabel.pack(anchor=W, side=LEFT, padx=(0,29)) - hammerEntry.pack(anchor=E) - - shovelFrame = Frame(itemList1) - shovelLabel = Label(shovelFrame, text='Shovel') - self.shovelVar = StringVar(value='1') - shovelEntry = Entry(shovelFrame, textvariable=self.shovelVar, width=3, validate='all', vcmd=vcmd) - shovelFrame.pack() - shovelLabel.pack(anchor=W, side=LEFT, padx=(0,41)) - shovelEntry.pack(anchor=E) - - fluteFrame = Frame(itemList1) - fluteLabel = Label(fluteFrame, text='Flute') - self.fluteVar = StringVar(value='1') - fluteEntry = Entry(fluteFrame, textvariable=self.fluteVar, width=3, validate='all', vcmd=vcmd) - fluteFrame.pack() - fluteLabel.pack(anchor=W, side=LEFT, padx=(0,50)) - fluteEntry.pack(anchor=E) - - bugnetFrame = Frame(itemList2) - bugnetLabel = Label(bugnetFrame, text='Bug Net') - self.bugnetVar = StringVar(value='1') - bugnetEntry = Entry(bugnetFrame, textvariable=self.bugnetVar, width=3, validate='all', vcmd=vcmd) - bugnetFrame.pack() - bugnetLabel.pack(anchor=W, side=LEFT, padx=(0,41)) - bugnetEntry.pack(anchor=E) - - bookFrame = Frame(itemList2) - bookLabel = Label(bookFrame, text='Book') - self.bookVar = StringVar(value='1') - bookEntry = Entry(bookFrame, textvariable=self.bookVar, width=3, validate='all', vcmd=vcmd) - bookFrame.pack() - bookLabel.pack(anchor=W, side=LEFT, padx=(0,57)) - bookEntry.pack(anchor=E) - - bottleFrame = Frame(itemList2) - bottleLabel = Label(bottleFrame, text='Bottle') - self.bottleVar = StringVar(value='4') - bottleEntry = Entry(bottleFrame, textvariable=self.bottleVar, width=3, validate='all', vcmd=vcmd) - bottleFrame.pack() - bottleLabel.pack(anchor=W, side=LEFT, padx=(0,53)) - bottleEntry.pack(anchor=E) - - somariaFrame = Frame(itemList2) - somariaLabel = Label(somariaFrame, text='C.Somaria') - self.somariaVar = StringVar(value='1') - somariaEntry = Entry(somariaFrame, textvariable=self.somariaVar, width=3, validate='all', vcmd=vcmd) - somariaFrame.pack() - somariaLabel.pack(anchor=W, side=LEFT, padx=(0,30)) - somariaEntry.pack(anchor=E) - - byrnaFrame = Frame(itemList2) - byrnaLabel = Label(byrnaFrame, text='C.Byrna') - self.byrnaVar = StringVar(value='1') - byrnaEntry = Entry(byrnaFrame, textvariable=self.byrnaVar, width=3, validate='all', vcmd=vcmd) - byrnaFrame.pack() - byrnaLabel.pack(anchor=W, side=LEFT, padx=(0,43)) - byrnaEntry.pack(anchor=E) - - capeFrame = Frame(itemList2) - capeLabel = Label(capeFrame, text='Magic Cape') - self.capeVar = StringVar(value='1') - capeEntry = Entry(capeFrame, textvariable=self.capeVar, width=3, validate='all', vcmd=vcmd) - capeFrame.pack() - capeLabel.pack(anchor=W, side=LEFT, padx=(0,21)) - capeEntry.pack(anchor=E) - - mirrorFrame = Frame(itemList2) - mirrorLabel = Label(mirrorFrame, text='Magic Mirror') - self.mirrorVar = StringVar(value='1') - mirrorEntry = Entry(mirrorFrame, textvariable=self.mirrorVar, width=3, validate='all', vcmd=vcmd) - mirrorFrame.pack() - mirrorLabel.pack(anchor=W, side=LEFT, padx=(0,15)) - mirrorEntry.pack(anchor=E) - - bootsFrame = Frame(itemList2) - bootsLabel = Label(bootsFrame, text='Pegasus Boots') - self.bootsVar = StringVar(value='1') - bootsEntry = Entry(bootsFrame, textvariable=self.bootsVar, width=3, validate='all', vcmd=vcmd) - bootsFrame.pack() - bootsLabel.pack(anchor=W, side=LEFT, padx=(0,8)) - bootsEntry.pack(anchor=E) - - powergloveFrame = Frame(itemList2) - powergloveLabel = Label(powergloveFrame, text='Power Glove') - self.powergloveVar = StringVar(value='0') - powergloveEntry = Entry(powergloveFrame, textvariable=self.powergloveVar, width=3, validate='all', vcmd=vcmd) - powergloveFrame.pack() - powergloveLabel.pack(anchor=W, side=LEFT, padx=(0,18)) - powergloveEntry.pack(anchor=E) - - titansmittFrame = Frame(itemList2) - titansmittLabel = Label(titansmittFrame, text='Titan\'s Mitt') - self.titansmittVar = StringVar(value='0') - titansmittEntry = Entry(titansmittFrame, textvariable=self.titansmittVar, width=3, validate='all', vcmd=vcmd) - titansmittFrame.pack() - titansmittLabel.pack(anchor=W, side=LEFT, padx=(0,24)) - titansmittEntry.pack(anchor=E) - - proggloveFrame = Frame(itemList2) - proggloveLabel = Label(proggloveFrame, text='Prog.Glove') - self.proggloveVar = StringVar(value='2') - proggloveEntry = Entry(proggloveFrame, textvariable=self.proggloveVar, width=3, validate='all', vcmd=vcmd) - proggloveFrame.pack() - proggloveLabel.pack(anchor=W, side=LEFT, padx=(0,26)) - proggloveEntry.pack(anchor=E) - - flippersFrame = Frame(itemList2) - flippersLabel = Label(flippersFrame, text='Flippers') - self.flippersVar = StringVar(value='1') - flippersEntry = Entry(flippersFrame, textvariable=self.flippersVar, width=3, validate='all', vcmd=vcmd) - flippersFrame.pack() - flippersLabel.pack(anchor=W, side=LEFT, padx=(0,43)) - flippersEntry.pack(anchor=E) - - pearlFrame = Frame(itemList2) - pearlLabel = Label(pearlFrame, text='Moon Pearl') - self.pearlVar = StringVar(value='1') - pearlEntry = Entry(pearlFrame, textvariable=self.pearlVar, width=3, validate='all', vcmd=vcmd) - pearlFrame.pack() - pearlLabel.pack(anchor=W, side=LEFT, padx=(0,23)) - pearlEntry.pack(anchor=E) - - heartpieceFrame = Frame(itemList2) - heartpieceLabel = Label(heartpieceFrame, text='Piece of Heart') - self.heartpieceVar = StringVar(value='24') - heartpieceEntry = Entry(heartpieceFrame, textvariable=self.heartpieceVar, width=3, validate='all', vcmd=vcmd) - heartpieceFrame.pack() - heartpieceLabel.pack(anchor=W, side=LEFT, padx=(0,10)) - heartpieceEntry.pack(anchor=E) - - fullheartFrame = Frame(itemList2) - fullheartLabel = Label(fullheartFrame, text='Heart Container') - self.fullheartVar = StringVar(value='10') - fullheartEntry = Entry(fullheartFrame, textvariable=self.fullheartVar, width=3, validate='all', vcmd=vcmd) - fullheartFrame.pack() - fullheartLabel.pack(anchor=W, side=LEFT) - fullheartEntry.pack(anchor=E) - - sancheartFrame = Frame(itemList2) - sancheartLabel = Label(sancheartFrame, text='Sanctuary Heart') - self.sancheartVar = StringVar(value='1') - sancheartEntry = Entry(sancheartFrame, textvariable=self.sancheartVar, width=3, validate='all', vcmd=vcmd) - sancheartFrame.pack() - sancheartLabel.pack(anchor=W, side=LEFT) - sancheartEntry.pack(anchor=E) - - sword1Frame = Frame(itemList3) - sword1Label = Label(sword1Frame, text='Sword 1') - self.sword1Var = StringVar(value='0') - sword1Entry = Entry(sword1Frame, textvariable=self.sword1Var, width=3, validate='all', vcmd=vcmd) - sword1Frame.pack() - sword1Label.pack(anchor=W, side=LEFT, padx=(0,34)) - sword1Entry.pack(anchor=E) - - sword2Frame = Frame(itemList3) - sword2Label = Label(sword2Frame, text='Sword 2') - self.sword2Var = StringVar(value='0') - sword2Entry = Entry(sword2Frame, textvariable=self.sword2Var, width=3, validate='all', vcmd=vcmd) - sword2Frame.pack() - sword2Label.pack(anchor=W, side=LEFT, padx=(0,34)) - sword2Entry.pack(anchor=E) - - sword3Frame = Frame(itemList3) - sword3Label = Label(sword3Frame, text='Sword 3') - self.sword3Var = StringVar(value='0') - sword3Entry = Entry(sword3Frame, textvariable=self.sword3Var, width=3, validate='all', vcmd=vcmd) - sword3Frame.pack() - sword3Label.pack(anchor=W, side=LEFT, padx=(0,34)) - sword3Entry.pack(anchor=E) - - sword4Frame = Frame(itemList3) - sword4Label = Label(sword4Frame, text='Sword 4') - self.sword4Var = StringVar(value='0') - sword4Entry = Entry(sword4Frame, textvariable=self.sword4Var, width=3, validate='all', vcmd=vcmd) - sword4Frame.pack() - sword4Label.pack(anchor=W, side=LEFT, padx=(0,34)) - sword4Entry.pack(anchor=E) - - progswordFrame = Frame(itemList3) - progswordLabel = Label(progswordFrame, text='Prog.Sword') - self.progswordVar = StringVar(value='4') - progswordEntry = Entry(progswordFrame, textvariable=self.progswordVar, width=3, validate='all', vcmd=vcmd) - progswordFrame.pack() - progswordLabel.pack(anchor=W, side=LEFT, padx=(0,15)) - progswordEntry.pack(anchor=E) - - shield1Frame = Frame(itemList3) - shield1Label = Label(shield1Frame, text='Shield 1') - self.shield1Var = StringVar(value='0') - shield1Entry = Entry(shield1Frame, textvariable=self.shield1Var, width=3, validate='all', vcmd=vcmd) - shield1Frame.pack() - shield1Label.pack(anchor=W, side=LEFT, padx=(0,35)) - shield1Entry.pack(anchor=E) - - shield2Frame = Frame(itemList3) - shield2Label = Label(shield2Frame, text='Shield 2') - self.shield2Var = StringVar(value='0') - shield2Entry = Entry(shield2Frame, textvariable=self.shield2Var, width=3, validate='all', vcmd=vcmd) - shield2Frame.pack() - shield2Label.pack(anchor=W, side=LEFT, padx=(0,35)) - shield2Entry.pack(anchor=E) - - shield3Frame = Frame(itemList3) - shield3Label = Label(shield3Frame, text='Shield 3') - self.shield3Var = StringVar(value='0') - shield3Entry = Entry(shield3Frame, textvariable=self.shield3Var, width=3, validate='all', vcmd=vcmd) - shield3Frame.pack() - shield3Label.pack(anchor=W, side=LEFT, padx=(0,35)) - shield3Entry.pack(anchor=E) - - progshieldFrame = Frame(itemList3) - progshieldLabel = Label(progshieldFrame, text='Prog.Shield') - self.progshieldVar = StringVar(value='3') - progshieldEntry = Entry(progshieldFrame, textvariable=self.progshieldVar, width=3, validate='all', vcmd=vcmd) - progshieldFrame.pack() - progshieldLabel.pack(anchor=W, side=LEFT, padx=(0,16)) - progshieldEntry.pack(anchor=E) - - bluemailFrame = Frame(itemList3) - bluemailLabel = Label(bluemailFrame, text='Blue Mail') - self.bluemailVar = StringVar(value='0') - bluemailEntry = Entry(bluemailFrame, textvariable=self.bluemailVar, width=3, validate='all', vcmd=vcmd) - bluemailFrame.pack() - bluemailLabel.pack(anchor=W, side=LEFT, padx=(0,27)) - bluemailEntry.pack(anchor=E) - - redmailFrame = Frame(itemList3) - redmailLabel = Label(redmailFrame, text='Red Mail') - self.redmailVar = StringVar(value='0') - redmailEntry = Entry(redmailFrame, textvariable=self.redmailVar, width=3, validate='all', vcmd=vcmd) - redmailFrame.pack() - redmailLabel.pack(anchor=W, side=LEFT, padx=(0,30)) - redmailEntry.pack(anchor=E) - - progmailFrame = Frame(itemList3) - progmailLabel = Label(progmailFrame, text='Prog.Mail') - self.progmailVar = StringVar(value='2') - progmailEntry = Entry(progmailFrame, textvariable=self.progmailVar, width=3, validate='all', vcmd=vcmd) - progmailFrame.pack() - progmailLabel.pack(anchor=W, side=LEFT, padx=(0,25)) - progmailEntry.pack(anchor=E) - - halfmagicFrame = Frame(itemList3) - halfmagicLabel = Label(halfmagicFrame, text='Half Magic') - self.halfmagicVar = StringVar(value='1') - halfmagicEntry = Entry(halfmagicFrame, textvariable=self.halfmagicVar, width=3, validate='all', vcmd=vcmd) - halfmagicFrame.pack() - halfmagicLabel.pack(anchor=W, side=LEFT, padx=(0,18)) - halfmagicEntry.pack(anchor=E) - - quartermagicFrame = Frame(itemList3) - quartermagicLabel = Label(quartermagicFrame, text='Quarter Magic') - self.quartermagicVar = StringVar(value='0') - quartermagicEntry = Entry(quartermagicFrame, textvariable=self.quartermagicVar, width=3, validate='all', vcmd=vcmd) - quartermagicFrame.pack() - quartermagicLabel.pack(anchor=W, side=LEFT) - quartermagicEntry.pack(anchor=E) - - bcap5Frame = Frame(itemList3) - bcap5Label = Label(bcap5Frame, text='Bomb C.+5') - self.bcap5Var = StringVar(value='0') - bcap5Entry = Entry(bcap5Frame, textvariable=self.bcap5Var, width=3, validate='all', vcmd=vcmd) - bcap5Frame.pack() - bcap5Label.pack(anchor=W, side=LEFT, padx=(0,16)) - bcap5Entry.pack(anchor=E) - - bcap10Frame = Frame(itemList3) - bcap10Label = Label(bcap10Frame, text='Bomb C.+10') - self.bcap10Var = StringVar(value='0') - bcap10Entry = Entry(bcap10Frame, textvariable=self.bcap10Var, width=3, validate='all', vcmd=vcmd) - bcap10Frame.pack() - bcap10Label.pack(anchor=W, side=LEFT, padx=(0,10)) - bcap10Entry.pack(anchor=E) - - acap5Frame = Frame(itemList4) - acap5Label = Label(acap5Frame, text='Arrow C.+5') - self.acap5Var = StringVar(value='0') - acap5Entry = Entry(acap5Frame, textvariable=self.acap5Var, width=3, validate='all', vcmd=vcmd) - acap5Frame.pack() - acap5Label.pack(anchor=W, side=LEFT, padx=(0,7)) - acap5Entry.pack(anchor=E) - - acap10Frame = Frame(itemList4) - acap10Label = Label(acap10Frame, text='Arrow C.+10') - self.acap10Var = StringVar(value='0') - acap10Entry = Entry(acap10Frame, textvariable=self.acap10Var, width=3, validate='all', vcmd=vcmd) - acap10Frame.pack() - acap10Label.pack(anchor=W, side=LEFT, padx=(0,1)) - acap10Entry.pack(anchor=E) - - arrow1Frame = Frame(itemList4) - arrow1Label = Label(arrow1Frame, text='Arrow (1)') - self.arrow1Var = StringVar(value='1') - arrow1Entry = Entry(arrow1Frame, textvariable=self.arrow1Var, width=3, validate='all', vcmd=vcmd) - arrow1Frame.pack() - arrow1Label.pack(anchor=W, side=LEFT, padx=(0,18)) - arrow1Entry.pack(anchor=E) - - arrow10Frame = Frame(itemList4) - arrow10Label = Label(arrow10Frame, text='Arrows (10)') - self.arrow10Var = StringVar(value='12') - arrow10Entry = Entry(arrow10Frame, textvariable=self.arrow10Var, width=3, validate='all', vcmd=vcmd) - arrow10Frame.pack() - arrow10Label.pack(anchor=W, side=LEFT, padx=(0,7)) - arrow10Entry.pack(anchor=E) - - bomb1Frame = Frame(itemList4) - bomb1Label = Label(bomb1Frame, text='Bomb (1)') - self.bomb1Var = StringVar(value='0') - bomb1Entry = Entry(bomb1Frame, textvariable=self.bomb1Var, width=3, validate='all', vcmd=vcmd) - bomb1Frame.pack() - bomb1Label.pack(anchor=W, side=LEFT, padx=(0,18)) - bomb1Entry.pack(anchor=E) - - bomb3Frame = Frame(itemList4) - bomb3Label = Label(bomb3Frame, text='Bombs (3)') - self.bomb3Var = StringVar(value='16') - bomb3Entry = Entry(bomb3Frame, textvariable=self.bomb3Var, width=3, validate='all', vcmd=vcmd) - bomb3Frame.pack() - bomb3Label.pack(anchor=W, side=LEFT, padx=(0,13)) - bomb3Entry.pack(anchor=E) - - bomb10Frame = Frame(itemList4) - bomb10Label = Label(bomb10Frame, text='Bombs (10)') - self.bomb10Var = StringVar(value='1') - bomb10Entry = Entry(bomb10Frame, textvariable=self.bomb10Var, width=3, validate='all', vcmd=vcmd) - bomb10Frame.pack() - bomb10Label.pack(anchor=W, side=LEFT, padx=(0,7)) - bomb10Entry.pack(anchor=E) - - rupee1Frame = Frame(itemList4) - rupee1Label = Label(rupee1Frame, text='Rupee (1)') - self.rupee1Var = StringVar(value='2') - rupee1Entry = Entry(rupee1Frame, textvariable=self.rupee1Var, width=3, validate='all', vcmd=vcmd) - rupee1Frame.pack() - rupee1Label.pack(anchor=W, side=LEFT, padx=(0,17)) - rupee1Entry.pack(anchor=E) - - rupee5Frame = Frame(itemList4) - rupee5Label = Label(rupee5Frame, text='Rupees (5)') - self.rupee5Var = StringVar(value='4') - rupee5Entry = Entry(rupee5Frame, textvariable=self.rupee5Var, width=3, validate='all', vcmd=vcmd) - rupee5Frame.pack() - rupee5Label.pack(anchor=W, side=LEFT, padx=(0,12)) - rupee5Entry.pack(anchor=E) - - rupee20Frame = Frame(itemList4) - rupee20Label = Label(rupee20Frame, text='Rupees (20)') - self.rupee20Var = StringVar(value='28') - rupee20Entry = Entry(rupee20Frame, textvariable=self.rupee20Var, width=3, validate='all', vcmd=vcmd) - rupee20Frame.pack() - rupee20Label.pack(anchor=W, side=LEFT, padx=(0,6)) - rupee20Entry.pack(anchor=E) - - rupee50Frame = Frame(itemList4) - rupee50Label = Label(rupee50Frame, text='Rupees (50)') - self.rupee50Var = StringVar(value='7') - rupee50Entry = Entry(rupee50Frame, textvariable=self.rupee50Var, width=3, validate='all', vcmd=vcmd) - rupee50Frame.pack() - rupee50Label.pack(anchor=W, side=LEFT, padx=(0,6)) - rupee50Entry.pack(anchor=E) - - rupee100Frame = Frame(itemList4) - rupee100Label = Label(rupee100Frame, text='Rupees (100)') - self.rupee100Var = StringVar(value='1') - rupee100Entry = Entry(rupee100Frame, textvariable=self.rupee100Var, width=3, validate='all', vcmd=vcmd) - rupee100Frame.pack() - rupee100Label.pack(anchor=W, side=LEFT, padx=(0,0)) - rupee100Entry.pack(anchor=E) - - rupee300Frame = Frame(itemList4) - rupee300Label = Label(rupee300Frame, text='Rupees (300)') - self.rupee300Var = StringVar(value='5') - rupee300Entry = Entry(rupee300Frame, textvariable=self.rupee300Var, width=3, validate='all', vcmd=vcmd) - rupee300Frame.pack() - rupee300Label.pack(anchor=W, side=LEFT, padx=(0,0)) - rupee300Entry.pack(anchor=E) - - blueclockFrame = Frame(itemList4) - blueclockLabel = Label(blueclockFrame, text='Blue Clock') - self.blueclockVar = StringVar(value='0') - blueclockEntry = Entry(blueclockFrame, textvariable=self.blueclockVar, width=3, validate='all', vcmd=vcmd) - blueclockFrame.pack() - blueclockLabel.pack(anchor=W, side=LEFT, padx=(0,11)) - blueclockEntry.pack(anchor=E) - - greenclockFrame = Frame(itemList4) - greenclockLabel = Label(greenclockFrame, text='Green Clock') - self.greenclockVar = StringVar(value='0') - greenclockEntry = Entry(greenclockFrame, textvariable=self.greenclockVar, width=3, validate='all', vcmd=vcmd) - greenclockFrame.pack() - greenclockLabel.pack(anchor=W, side=LEFT, padx=(0,3)) - greenclockEntry.pack(anchor=E) - - redclockFrame = Frame(itemList4) - redclockLabel = Label(redclockFrame, text='Red Clock') - self.redclockVar = StringVar(value='0') - redclockEntry = Entry(redclockFrame, textvariable=self.redclockVar, width=3, validate='all', vcmd=vcmd) - redclockFrame.pack() - redclockLabel.pack(anchor=W, side=LEFT, padx=(0,14)) - redclockEntry.pack(anchor=E) - - silverarrowFrame = Frame(itemList5) - silverarrowLabel = Label(silverarrowFrame, text='Silver Arrow') - self.silverarrowVar = StringVar(value='0') - silverarrowEntry = Entry(silverarrowFrame, textvariable=self.silverarrowVar, width=3, validate='all', vcmd=vcmd) - silverarrowFrame.pack() - silverarrowLabel.pack(anchor=W, side=LEFT, padx=(0,64)) - silverarrowEntry.pack(anchor=E) - - universalkeyFrame = Frame(itemList5) - universalkeyLabel = Label(universalkeyFrame, text='Universal Key') - self.universalkeyVar = StringVar(value='0') - universalkeyEntry = Entry(universalkeyFrame, textvariable=self.universalkeyVar, width=3, validate='all', vcmd=vcmd) - universalkeyFrame.pack() - universalkeyLabel.pack(anchor=W, side=LEFT, padx=(0,57)) - universalkeyEntry.pack(anchor=E) - - triforcepieceFrame = Frame(itemList5) - triforcepieceLabel = Label(triforcepieceFrame, text='Triforce Piece') - self.triforcepieceVar = StringVar(value='0') - triforcepieceEntry = Entry(triforcepieceFrame, textvariable=self.triforcepieceVar, width=3, validate='all', vcmd=vcmd) - triforcepieceFrame.pack() - triforcepieceLabel.pack(anchor=W, side=LEFT, padx=(0,55)) - triforcepieceEntry.pack(anchor=E) - - triforcecountFrame = Frame(itemList5) - triforcecountLabel = Label(triforcecountFrame, text='Triforce Pieces Required') - self.triforcecountVar = StringVar(value='0') - triforcecountEntry = Entry(triforcecountFrame, textvariable=self.triforcecountVar, width=3, validate='all', vcmd=vcmd) - triforcecountFrame.pack() - triforcecountLabel.pack(anchor=W, side=LEFT, padx=(0,0)) - triforcecountEntry.pack(anchor=E) - - triforceFrame = Frame(itemList5) - triforceLabel = Label(triforceFrame, text='Triforce (win game)') - self.triforceVar = StringVar(value='0') - triforceEntry = Entry(triforceFrame, textvariable=self.triforceVar, width=3, validate='all', vcmd=vcmd) - triforceFrame.pack() - triforceLabel.pack(anchor=W, side=LEFT, padx=(0,23)) - triforceEntry.pack(anchor=E) - - rupoorFrame = Frame(itemList5) - rupoorLabel = Label(rupoorFrame, text='Rupoor') - self.rupoorVar = StringVar(value='0') - rupoorEntry = Entry(rupoorFrame, textvariable=self.rupoorVar, width=3, validate='all', vcmd=vcmd) - rupoorFrame.pack() - rupoorLabel.pack(anchor=W, side=LEFT, padx=(0,87)) - rupoorEntry.pack(anchor=E) - - rupoorcostFrame = Frame(itemList5) - rupoorcostLabel = Label(rupoorcostFrame, text='Rupoor Cost') - self.rupoorcostVar = StringVar(value='10') - rupoorcostEntry = Entry(rupoorcostFrame, textvariable=self.rupoorcostVar, width=6, validate='all', vcmd=vcmd) - rupoorcostFrame.pack() - rupoorcostLabel.pack(anchor=W, side=LEFT, padx=(0,43)) - rupoorcostEntry.pack(anchor=E) + currentList = itemList1 + + # Bow + key = "bow" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Bow", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,53)}, "textbox": {"side": RIGHT}, "default": 0} + ) + self.customWidgets[key].pack() + + # Progressive Bow + key = "progressivebow" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Prog.Bow", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,25)}, "textbox": {"side": RIGHT}, "default": 2} + ) + self.customWidgets[key].pack() + + # Boomerang + key = "boomerang" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "B.Boomerang", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,4)}, "textbox": {"side": RIGHT}, "default": 1} + ) + self.customWidgets[key].pack() + + # Redmerang + key = "redmerang" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "M.Boomerang", + None, + {"label": {"anchor": W, "side": LEFT}, "textbox": {"side": RIGHT}, "default": 1} + ) + self.customWidgets[key].pack() + + # Hookshot + key = "hookshot" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Hookshot", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,24)}, "textbox": {"side": RIGHT}, "default": 1} + ) + self.customWidgets[key].pack() + + # Mushroom + key = "mushroom" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Mushroom", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,17)}, "textbox": {"side": RIGHT}, "default": 1} + ) + self.customWidgets[key].pack() + + # Powder + key = "powder" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Magic Powder", + None, + {"label": {"anchor": W, "side": LEFT}, "textbox": {"side": RIGHT}, "default": 1} + ) + self.customWidgets[key].pack() + + # Fire Rod + key = "firerod" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Fire Rod", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,33)}, "textbox": {"side": RIGHT}, "default": 1} + ) + self.customWidgets[key].pack() + + # Ice Rod + key = "icerod" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Ice Rod", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,37)}, "textbox": {"side": RIGHT}, "default": 1} + ) + self.customWidgets[key].pack() + + # Bombos + key = "bombos" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Bombos", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,32)}, "textbox": {"side": RIGHT}, "default": 1} + ) + self.customWidgets[key].pack() + + # Ether + key = "ether" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Ether", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,49)}, "textbox": {"side": RIGHT}, "default": 1} + ) + self.customWidgets[key].pack() + + # Quake + key = "quake" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Quake", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,42)}, "textbox": {"side": RIGHT}, "default": 1} + ) + self.customWidgets[key].pack() + + # Lamp + key = "lamp" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Lamp", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,46)}, "textbox": {"side": RIGHT}, "default": 1} + ) + self.customWidgets[key].pack() + + # Hammer + key = "hammer" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Hammer", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,29)}, "textbox": {"side": RIGHT}, "default": 1} + ) + self.customWidgets[key].pack() + + # Shovel + key = "shovel" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Shovel", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,41)}, "textbox": {"side": RIGHT}, "default": 1} + ) + self.customWidgets[key].pack() + + currentList = itemList2 + + # Flute + key = "flute" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Flute", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,58)}, "textbox": {"side": RIGHT}, "default": 1} + ) + self.customWidgets[key].pack() + + # Bug Net + key = "bugnet" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Bug Net", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,41)}, "textbox": {"side": RIGHT}, "default": 1} + ) + self.customWidgets[key].pack() + + # Book of Mudora + key = "book" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Book", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,57)}, "textbox": {"side": RIGHT}, "default": 1} + ) + self.customWidgets[key].pack() + + # Bottle + key = "bottle" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Bottle", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,53)}, "textbox": {"side": RIGHT}, "default": 4} + ) + self.customWidgets[key].pack() + + # Cane of Somaria + key = "somaria" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "C.Somaria", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,30)}, "textbox": {"side": RIGHT}, "default": 1} + ) + self.customWidgets[key].pack() + + # Cane of Byrna + key = "byrna" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "C.Byrna", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,43)}, "textbox": {"side": RIGHT}, "default": 1} + ) + self.customWidgets[key].pack() + + # Magic Cape + key = "cape" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Magic Cape", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,21)}, "textbox": {"side": RIGHT}, "default": 1} + ) + self.customWidgets[key].pack() + + # Magic Mirror + key = "mirror" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Magic Mirror", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,15)}, "textbox": {"side": RIGHT}, "default": 1} + ) + self.customWidgets[key].pack() + + # Pegasus Boots + key = "boots" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Pegasus Boots", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,8)}, "textbox": {"side": RIGHT}, "default": 1} + ) + self.customWidgets[key].pack() + + # Power Glove + key = "powerglove" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Power Glove", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,18)}, "textbox": {"side": RIGHT}, "default": 0} + ) + self.customWidgets[key].pack() + + # Titan's Mitt + key = "titansmitt" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Titan\'s Mitt", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,24)}, "textbox": {"side": RIGHT}, "default": 1} + ) + self.customWidgets[key].pack() + + # Progressive Glove + key = "progressiveglove" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Prog.Glove", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,26)}, "textbox": {"side": RIGHT}, "default": 2} + ) + self.customWidgets[key].pack() + + # Flippers + key = "flippers" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Flippers", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,43)}, "textbox": {"side": RIGHT}, "default": 1} + ) + self.customWidgets[key].pack() + + # Moon Pearl + key = "pearl" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Moon Pearl", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,23)}, "textbox": {"side": RIGHT}, "default": 1} + ) + self.customWidgets[key].pack() + + # Piece of Heart + key = "heartpiece" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Piece of Heart", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,10)}, "textbox": {"side": RIGHT}, "default": 24} + ) + self.customWidgets[key].pack() + + currentList = itemList3 + + # Heart Container + key = "heartcontainer" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Heart Container", + None, + {"label": {"anchor": W, "side": LEFT}, "textbox": {"side": RIGHT}, "default": 10} + ) + self.customWidgets[key].pack() + + # Sanctuary Heart + key = "sancheart" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Sanctuary Heart", + None, + {"label": {"anchor": W, "side": LEFT}, "textbox": {"side": RIGHT}, "default": 1} + ) + self.customWidgets[key].pack() + + # Fighters' Sword + key = "sword1" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Sword 1", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,42)}, "textbox": {"side": RIGHT}, "default": 0} + ) + self.customWidgets[key].pack() + + # Master Sword + key = "sword2" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Sword 2", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,42)}, "textbox": {"side": RIGHT}, "default": 0} + ) + self.customWidgets[key].pack() + + # Tempered Sword + key = "sword3" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Sword 3", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,42)}, "textbox": {"side": RIGHT}, "default": 0} + ) + self.customWidgets[key].pack() + + # Gold Sword + key = "sword4" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Sword 4", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,42)}, "textbox": {"side": RIGHT}, "default": 0} + ) + self.customWidgets[key].pack() + + # Progressive Sword + key = "progressivesword" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Prog.Sword", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,23)}, "textbox": {"side": RIGHT}, "default": 4} + ) + self.customWidgets[key].pack() + + # Fighters' Shield + key = "shield1" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Shield 1", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,43)}, "textbox": {"side": RIGHT}, "default": 0} + ) + self.customWidgets[key].pack() + + # Fire Shield + key = "shield2" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Shield 2", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,43)}, "textbox": {"side": RIGHT}, "default": 0} + ) + self.customWidgets[key].pack() + + # Mirror Shield + key = "shield3" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Shield 3", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,43)}, "textbox": {"side": RIGHT}, "default": 0} + ) + self.customWidgets[key].pack() + + # Progressive Shield + key = "progressiveshield" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Prog.Shield", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,24)}, "textbox": {"side": RIGHT}, "default": 3} + ) + self.customWidgets[key].pack() + + # Blue Mail + key = "mail2" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Blue Mail", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,35)}, "textbox": {"side": RIGHT}, "default": 0} + ) + self.customWidgets[key].pack() + + # Red Mail + key = "mail3" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Red Mail", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,38)}, "textbox": {"side": RIGHT}, "default": 0} + ) + self.customWidgets[key].pack() + + # Progressive Mail + key = "progressivemail" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Prog.Mail", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,33)}, "textbox": {"side": RIGHT}, "default": 2} + ) + self.customWidgets[key].pack() + + # Half Magic + key = "halfmagic" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Half Magic", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,26)}, "textbox": {"side": RIGHT}, "default": 1} + ) + self.customWidgets[key].pack() + + currentList = itemList4 + + # Quarter Magic + key = "quartermagic" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Quarter Magic", + None, + {"label": {"anchor": W, "side": LEFT}, "textbox": {"side": RIGHT}, "default": 0} + ) + self.customWidgets[key].pack() + + # Bomb Capacity +5 + key = "bombsplus5" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Bomb C.+5", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,16)}, "textbox": {"side": RIGHT}, "default": 0} + ) + self.customWidgets[key].pack() + + # Bomb Capacity +10 + key = "bombsplus10" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Bomb C.+10", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,10)}, "textbox": {"side": RIGHT}, "default": 0} + ) + self.customWidgets[key].pack() + + # Arrow Capacity +5 + key = "arrowsplus5" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Arrow C.+5", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,16)}, "textbox": {"side": RIGHT}, "default": 0} + ) + self.customWidgets[key].pack() + + # Arrow Capacity +10 + key = "arrowsplus10" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Arrow C.+10", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,10)}, "textbox": {"side": RIGHT}, "default": 0} + ) + self.customWidgets[key].pack() + + # Arrow (1) + key = "arrow1" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Arrow (1)", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,27)}, "textbox": {"side": RIGHT}, "default": 1} + ) + self.customWidgets[key].pack() + + # Arrow (10) + key = "arrow10" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Arrow (10)", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,21)}, "textbox": {"side": RIGHT}, "default": 12} + ) + self.customWidgets[key].pack() + + # Bomb (1) + key = "bomb1" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Bomb (1)", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,26)}, "textbox": {"side": RIGHT}, "default": 0} + ) + self.customWidgets[key].pack() + + # Bomb (3) + key = "bomb3" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Bomb (3)", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,25)}, "textbox": {"side": RIGHT}, "default": 13} + ) + self.customWidgets[key].pack() + + # Bomb (10) + key = "bomb10" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Bomb (10)", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,20)}, "textbox": {"side": RIGHT}, "default": 1} + ) + self.customWidgets[key].pack() + + # Rupee (1) + key = "rupee1" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Rupee (1)", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,24)}, "textbox": {"side": RIGHT}, "default": 2} + ) + self.customWidgets[key].pack() + + # Rupee (5) + key = "rupee5" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Rupee (5)", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,24)}, "textbox": {"side": RIGHT}, "default": 4} + ) + self.customWidgets[key].pack() + + # Rupee (20) + key = "rupee20" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Rupee (20)", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,18)}, "textbox": {"side": RIGHT}, "default": 28} + ) + self.customWidgets[key].pack() + + # Rupee (50) + key = "rupee50" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Rupee (50)", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,18)}, "textbox": {"side": RIGHT}, "default": 7} + ) + self.customWidgets[key].pack() + + # Rupee (100) + key = "rupee100" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Rupee (100)", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,12)}, "textbox": {"side": RIGHT}, "default": 1} + ) + self.customWidgets[key].pack() + + currentList = itemList5 + + # Rupee (300) + key = "rupee300" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Rupee (300)", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,54)}, "textbox": {"side": RIGHT}, "default": 5} + ) + self.customWidgets[key].pack() + + # Blue Clock + key = "blueclock" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Blue Clock", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,60)}, "textbox": {"side": RIGHT}, "default": 0} + ) + self.customWidgets[key].pack() + + # Green Clock + key = "greenclock" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Green Clock", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,52)}, "textbox": {"side": RIGHT}, "default": 0} + ) + self.customWidgets[key].pack() + + # Red Clock + key = "redclock" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Red Clock", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,63)}, "textbox": {"side": RIGHT}, "default": 0} + ) + self.customWidgets[key].pack() + + # Silver Arrows Upgrade + key = "silversupgrade" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Silver Arrows Upgrade", + None, + {"label": {"anchor": W, "side": LEFT}, "textbox": {"side": RIGHT}, "default": 0} + ) + self.customWidgets[key].pack() + + # Generic Keys + key = "generickeys" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Generic Keys", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,49)}, "textbox": {"side": RIGHT}, "default": 0} + ) + self.customWidgets[key].pack() + + # Triforce Pieces + key = "triforcepieces" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Triforce Pieces", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,40)}, "textbox": {"side": RIGHT}, "default": 0} + ) + self.customWidgets[key].pack() + + # Triforce (win game) + key = "triforce" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Triforce (win game)", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,13)}, "textbox": {"side": RIGHT}, "default": 0} + ) + self.customWidgets[key].pack() + + # Rupoor + key = "rupoor" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Rupoor", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,77)}, "textbox": {"side": RIGHT}, "default": 0} + ) + self.customWidgets[key].pack() + + # Rupoor Cost + key = "rupoorcost" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Rupoor Cost", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,50)}, "textbox": {"side": RIGHT}, "default": 10} + ) + self.customWidgets[key].pack() itemList1.pack(side=LEFT, padx=(0,0)) itemList2.pack(side=LEFT, padx=(0,0)) itemList3.pack(side=LEFT, padx=(0,0)) itemList4.pack(side=LEFT, padx=(0,0)) - itemList5.pack(side=LEFT, padx=(0,0)) + itemList5.pack(side=LEFT, padx=(0,0), anchor=N) return self diff --git a/gui/widgets.py b/gui/widgets.py index 2b91584e..898e6d7d 100644 --- a/gui/widgets.py +++ b/gui/widgets.py @@ -1,4 +1,4 @@ -from tkinter import Checkbutton, Entry, Frame, IntVar, Label, OptionMenu, Spinbox, StringVar +from tkinter import Checkbutton, Entry, Frame, IntVar, Label, OptionMenu, Spinbox, StringVar, RIGHT def make_checkbox(self, parent, label, storageVar, packAttrs): self = Frame(parent) @@ -24,7 +24,7 @@ def make_selectbox(self, parent, label, options, storageVar, packAttrs): self.label = Label(self, text=label) self.label.pack(packAttrs["label"]) self.selectbox = OptionMenu(self, self.labelVar, *options.keys()) - self.selectbox.config(width=15) + self.selectbox.config(width=20) self.labelVar.set(packAttrs["default"] if "default" in packAttrs else list(options.keys())[0]) self.selectbox.pack(packAttrs["selectbox"]) return self @@ -50,7 +50,9 @@ def make_textbox(self, parent, label, storageVar, packAttrs): self.storageVar = storageVar self.label = Label(self, text=label) self.label.pack(packAttrs["label"]) - self.textbox = Entry(self) + self.textbox = Entry(self, justify=RIGHT, textvariable=self.storageVar, width=3) + if "default" in packAttrs: + self.storageVar.set(packAttrs["default"]) self.textbox.pack(packAttrs["textbox"]) return self From a3f3d6debe252744d524fb4ccb96449324f493e7 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Tue, 11 Feb 2020 05:21:24 -0800 Subject: [PATCH 028/117] Bind mouse wheel to Spinboxes --- gui/bottom.py | 24 ++++++++++++++++++------ gui/loadcliargs.py | 2 +- gui/widgets.py | 15 ++++++++++++++- 3 files changed, 33 insertions(+), 8 deletions(-) diff --git a/gui/bottom.py b/gui/bottom.py index 7aa4d527..5704a312 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -6,9 +6,15 @@ import random from CLI import parse_arguments, get_working_dirs from Main import main from Utils import local_path, output_path, open_file +import gui.widgets as widgets def bottom_frame(self,parent,args=None): + # Bottom Frame self = ttk.Frame(parent) + + # Bottom Frame options + self.bottomWidgets = {} + seedCountFrame = Frame(self) seedCountFrame.pack() ## Seed # @@ -22,19 +28,25 @@ def bottom_frame(self,parent,args=None): seedEntry = Entry(self, width=15, textvariable=self.seedVar) seedLabel.pack(side=LEFT) seedEntry.pack(side=LEFT) + ## Number of Generation attempts - countLabel = Label(self, text='Count') - self.countVar = StringVar(value=parent.working_dirs["gen.count"]) - countSpinbox = Spinbox(self, from_=1, to=100, width=5, textvariable=self.countVar) - countLabel.pack(side=LEFT) - countSpinbox.pack(side=LEFT) + key = "generationcount" + self.bottomWidgets[key] = widgets.make_widget( + self, + "spinbox", + self, + "Count", + None, + {"label": {"side": LEFT}, "spinbox": {"side": RIGHT}} + ) + self.bottomWidgets[key].pack(side=LEFT) def generateRom(): guiargs = Namespace() guiargs.multi = int(parent.multiworldWindow.multiworldWidgets["worlds"].storageVar.get()) guiargs.names = parent.multiworldWindow.namesVar.get() guiargs.seed = int(parent.farBottomFrame.seedVar.get()) if parent.farBottomFrame.seedVar.get() else None - guiargs.count = int(parent.farBottomFrame.countVar.get()) if parent.farBottomFrame.countVar.get() != '1' else None + guiargs.count = int(parent.farBottomFrame.bottomWidgets["generationcount"].storageVar.get()) if parent.farBottomFrame.bottomWidgets["generationcount"].storageVar.get() != '1' else None guiargs.mode = parent.itemWindow.itemWidgets["worldstate"].storageVar.get() guiargs.logic = parent.itemWindow.itemWidgets["logiclevel"].storageVar.get() diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index c2fbfe69..2832b8a3 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -17,7 +17,7 @@ def loadcliargs(gui,args): if args.multi: gui.multiworldWindow.multiworldWidgets["worlds"].storageVar.set(str(args.multi)) if args.count: - gui.farBottomFrame.countVar.set(str(args.count)) + gui.farBottomFrame.bottomWidgets["generationcount"].storageVar.set(str(args.count)) if args.seed: gui.farBottomFrame.seedVar.set(str(args.seed)) gui.itemWindow.itemWidgets["worldstate"].storageVar.set(args.mode) diff --git a/gui/widgets.py b/gui/widgets.py index 898e6d7d..3bf14ba2 100644 --- a/gui/widgets.py +++ b/gui/widgets.py @@ -1,5 +1,18 @@ from tkinter import Checkbutton, Entry, Frame, IntVar, Label, OptionMenu, Spinbox, StringVar, RIGHT +class mySpinbox(Spinbox): + def __init__(self, *args, **kwargs): + Spinbox.__init__(self, *args, **kwargs) + self.bind('', self.mouseWheel) + self.bind('', self.mouseWheel) + self.bind('', self.mouseWheel) + + def mouseWheel(self, event): + if event.num == 5 or event.delta == -120: + self.invoke('buttondown') + elif event.num == 4 or event.delta == 120: + self.invoke('buttonup') + def make_checkbox(self, parent, label, storageVar, packAttrs): self = Frame(parent) self.storageVar = storageVar @@ -41,7 +54,7 @@ def make_spinbox(self, parent, label, storageVar, packAttrs): fromNum = packAttrs["spinbox"]["from"] if "to" in packAttrs: toNum = packAttrs["spinbox"]["to"] - self.spinbox = Spinbox(self, from_=fromNum, to=toNum, width=5, textvariable=self.storageVar) + self.spinbox = mySpinbox(self, from_=fromNum, to=toNum, width=5, textvariable=self.storageVar) self.spinbox.pack(packAttrs["spinbox"]) return self From 6dd67c0e0b445ad7a49db5c7eed634ab277bcc66 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Wed, 12 Feb 2020 02:53:01 -0800 Subject: [PATCH 029/117] Fix Custom Item Pool --- gui/bottom.py | 5 ++--- gui/custom/overview.py | 9 +++++++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/gui/bottom.py b/gui/bottom.py index 5704a312..09f1fc7d 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -94,9 +94,8 @@ def bottom_frame(self,parent,args=None): int(parent.customContent.customWidgets["sword3"].storageVar.get()), int(parent.customContent.customWidgets["sword4"].storageVar.get()), int(parent.customContent.customWidgets["progressivesword"].storageVar.get()), int(parent.customContent.customWidgets["shield1"].storageVar.get()), int(parent.customContent.customWidgets["shield2"].storageVar.get()), int(parent.customContent.customWidgets["shield3"].storageVar.get()), int(parent.customContent.customWidgets["progressiveshield"].storageVar.get()), int(parent.customContent.customWidgets["mail2"].storageVar.get()), int(parent.customContent.customWidgets["mail3"].storageVar.get()), int(parent.customContent.customWidgets["progressivemail"].storageVar.get()), int(parent.customContent.customWidgets["halfmagic"].storageVar.get()), int(parent.customContent.customWidgets["quartermagic"].storageVar.get()), int(parent.customContent.customWidgets["bombsplus5"].storageVar.get()), int(parent.customContent.customWidgets["bombsplus10"].storageVar.get()), int(parent.customContent.customWidgets["arrowsplus5"].storageVar.get()), int(parent.customContent.customWidgets["arrowsplus10"].storageVar.get()), int(parent.customContent.customWidgets["arrow1"].storageVar.get()), int(parent.customContent.customWidgets["arrow10"].storageVar.get()), int(parent.customContent.customWidgets["bomb1"].storageVar.get()), int(parent.customContent.customWidgets["bomb3"].storageVar.get()), int(parent.customContent.customWidgets["rupee1"].storageVar.get()), int(parent.customContent.customWidgets["rupee5"].storageVar.get()), int(parent.customContent.customWidgets["rupee20"].storageVar.get()), int(parent.customContent.customWidgets["rupee50"].storageVar.get()), int(parent.customContent.customWidgets["rupee100"].storageVar.get()), - int(parent.customContent.customWidgets["rupee300"].storageVar.get()), int(parent.customContent.customWidgets["rupoor"].storageVar.get()), int(parent.customContent.customWidgets["blueclock"].storageVar.get()), int(parent.customContent.customWidgets["greenclock"].storageVar.get()), int(parent.customContent.customWidgets["redclock"].storageVar.get()), int(parent.customContent.customWidgets["progressivebow"].storageVar.get()), int(parent.customContent.customWidgets["bomb10"].storageVar.get()), int(parent.customContent.customWidgets["triforcepieces"].storageVar.get()), - #int(parent.customContent.triforcecountVar.get()), - int(parent.customContent.customWidgets["triforce"].storageVar.get()), int(parent.customContent.customWidgets["rupoorcost"].storageVar.get()), int(parent.customContent.customWidgets["generickeys"].storageVar.get())] + int(parent.customContent.customWidgets["rupee300"].storageVar.get()), int(parent.customContent.customWidgets["rupoor"].storageVar.get()), int(parent.customContent.customWidgets["blueclock"].storageVar.get()), int(parent.customContent.customWidgets["greenclock"].storageVar.get()), int(parent.customContent.customWidgets["redclock"].storageVar.get()), int(parent.customContent.customWidgets["progressivebow"].storageVar.get()), int(parent.customContent.customWidgets["bomb10"].storageVar.get()), int(parent.customContent.customWidgets["triforcepieces"].storageVar.get()),int(parent.customContent.customWidgets["triforcepiecesgoal"].storageVar.get()), + int(parent.customContent.customWidgets["triforce"].storageVar.get()),int(parent.customContent.customWidgets["rupoorcost"].storageVar.get()),int(parent.customContent.customWidgets["generickeys"].storageVar.get())] guiargs.rom = parent.generationSetupWindow.romVar.get() # guiargs.sprite = parent.gameOptionsWindow.sprite guiargs.outputpath = args.outputpath if args else None diff --git a/gui/custom/overview.py b/gui/custom/overview.py index c9aeed8b..432813d9 100644 --- a/gui/custom/overview.py +++ b/gui/custom/overview.py @@ -634,6 +634,15 @@ def custom_page(top,parent): ) self.customWidgets[key].pack() + # Triforce Pieces Required + key = "triforcepiecesgoal" + self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, + "Triforce Pieces Required", + None, + {"label": {"anchor": W, "side": LEFT, "padx": (0,40)}, "textbox": {"side": RIGHT}, "default": 0} + ) + self.customWidgets[key].pack() + # Triforce (win game) key = "triforce" self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, From 7189d6a5ed888ba204a8996b7146b2e8cee0d5a3 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Wed, 12 Feb 2020 04:18:16 -0800 Subject: [PATCH 030/117] Sprite Selection still not quite working Closer, no compile errors, doesn't actually perform injection --- gui/bottom.py | 2 +- gui/loadcliargs.py | 8 ++++++-- gui/randomize/gameoptions.py | 35 ++++++++++++++++++++--------------- 3 files changed, 27 insertions(+), 18 deletions(-) diff --git a/gui/bottom.py b/gui/bottom.py index 09f1fc7d..f888b4b8 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -97,7 +97,7 @@ def bottom_frame(self,parent,args=None): int(parent.customContent.customWidgets["rupee300"].storageVar.get()), int(parent.customContent.customWidgets["rupoor"].storageVar.get()), int(parent.customContent.customWidgets["blueclock"].storageVar.get()), int(parent.customContent.customWidgets["greenclock"].storageVar.get()), int(parent.customContent.customWidgets["redclock"].storageVar.get()), int(parent.customContent.customWidgets["progressivebow"].storageVar.get()), int(parent.customContent.customWidgets["bomb10"].storageVar.get()), int(parent.customContent.customWidgets["triforcepieces"].storageVar.get()),int(parent.customContent.customWidgets["triforcepiecesgoal"].storageVar.get()), int(parent.customContent.customWidgets["triforce"].storageVar.get()),int(parent.customContent.customWidgets["rupoorcost"].storageVar.get()),int(parent.customContent.customWidgets["generickeys"].storageVar.get())] guiargs.rom = parent.generationSetupWindow.romVar.get() -# guiargs.sprite = parent.gameOptionsWindow.sprite + guiargs.sprite = parent.gameOptionsWindow.gameOptionsWidgets["sprite"]["spriteObject"] guiargs.outputpath = args.outputpath if args else None # get default values for missing parameters for k,v in vars(parse_arguments(['--multi', str(guiargs.multi)])).items(): diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index 2832b8a3..abad4ffd 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -1,3 +1,7 @@ +from classes.SpriteSelector import SpriteSelector as spriteSelector +from gui.randomize.gameoptions import set_sprite +from Rom import Sprite + def loadcliargs(gui,args): if args is not None: for k,v in vars(args).items(): @@ -48,5 +52,5 @@ def loadcliargs(gui,args): gui.enemizerWindow.enemizerWidgets["enemyhealth"].storageVar.set(args.enemy_health) gui.gameOptionsWindow.gameOptionsWidgets["owpalettes"].storageVar.set(args.ow_palettes) gui.gameOptionsWindow.gameOptionsWidgets["uwpalettes"].storageVar.set(args.uw_palettes) -# if args.sprite is not None: -# gui.gameOptionsWindow.set_sprite(Sprite(args.sprite)) \ No newline at end of file + if args.sprite is not None: + set_sprite(Sprite(args.sprite),spriteObject=gui.gameOptionsWindow.gameOptionsWidgets["sprite"]["spriteObject"],spriteNameVar=gui.gameOptionsWindow.gameOptionsWidgets["sprite"]["spriteNameVar"]) diff --git a/gui/randomize/gameoptions.py b/gui/randomize/gameoptions.py index 2cd1d863..d675ef0a 100644 --- a/gui/randomize/gameoptions.py +++ b/gui/randomize/gameoptions.py @@ -1,5 +1,6 @@ from tkinter import ttk, IntVar, StringVar, Button, Checkbutton, Entry, Frame, Label, OptionMenu, E, W, LEFT, RIGHT -from classes.SpriteSelector import SpriteSelector +from functools import partial +import classes.SpriteSelector as spriteSelector import gui.widgets as widgets def gameoptions_page(parent): @@ -89,23 +90,16 @@ def gameoptions_page(parent): spriteDialogFrame = Frame(leftRomOptionsFrame) baseSpriteLabel = Label(spriteDialogFrame, text='Sprite:') - self.spriteNameVar = StringVar() - sprite = None - def set_sprite(sprite_param): - nonlocal sprite - if sprite_param is None or not sprite_param.valid: - sprite = None - self.spriteNameVar.set('(unchanged)') - else: - sprite = sprite_param - self.spriteNameVar.set(sprite.name) + self.gameOptionsWidgets["sprite"] = {} + self.gameOptionsWidgets["sprite"]["spriteObject"] = None + self.gameOptionsWidgets["sprite"]["spriteNameVar"] = StringVar() - set_sprite(None) - self.spriteNameVar.set('(unchanged)') - spriteEntry = Label(spriteDialogFrame, textvariable=self.spriteNameVar) + set_sprite(None,self.gameOptionsWidgets["sprite"]["spriteObject"],self.gameOptionsWidgets["sprite"]["spriteNameVar"]) + self.gameOptionsWidgets["sprite"]["spriteNameVar"].set('(unchanged)') + spriteEntry = Label(spriteDialogFrame, textvariable=self.gameOptionsWidgets["sprite"]["spriteNameVar"]) def SpriteSelect(): - SpriteSelector(parent, set_sprite) + spriteSelector.SpriteSelector(parent, partial(set_sprite,spriteObject=self.gameOptionsWidgets["sprite"]["spriteObject"],spriteNameVar=self.gameOptionsWidgets["sprite"]["spriteNameVar"])) spriteSelectButton = Button(spriteDialogFrame, text='...', command=SpriteSelect) @@ -169,3 +163,14 @@ def gameoptions_page(parent): self.gameOptionsWidgets[key].pack(anchor=E) return self + +def set_sprite(sprite_param,spriteObject=None,spriteNameVar=None): + print(sprite_param,spriteObject,spriteNameVar) + if sprite_param is None or not sprite_param.valid: + spriteObject = None + if spriteNameVar is not None: + spriteNameVar.set('(unchanged)') + else: + spriteObject = sprite_param + if spriteNameVar is not None: + spriteNameVar.set(spriteObject.name) From 7a38d3afc4b3e3488be9dc07519b8c2554f21641 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Wed, 12 Feb 2020 04:23:57 -0800 Subject: [PATCH 031/117] Remove Experimental --- CLI.py | 8 ++++---- Gui.py | 1 - gui/randomize/dungeon.py | 3 +-- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/CLI.py b/CLI.py index d29a3b41..32895166 100644 --- a/CLI.py +++ b/CLI.py @@ -176,7 +176,7 @@ def parse_arguments(argv, no_defaults=False): The dungeon variants only mix up dungeons and keep the rest of the overworld vanilla. ''') - parser.add_argument('--door_shuffle', default=defval('basic'), const='vanilla', nargs='?', choices=['vanilla', 'basic', 'crossed', 'experimental'], + parser.add_argument('--door_shuffle', default=defval('basic'), const='vanilla', nargs='?', choices=['vanilla', 'basic', 'crossed'], help='''\ Select Door Shuffling Algorithm. (default: %(default)s) Basic: Doors are mixed within a single dungeon. @@ -184,9 +184,9 @@ def parse_arguments(argv, no_defaults=False): Crossed: Doors are mixed between all dungeons. (Not yet implemented) Vanilla: All doors are connected the same way they were in the - base game. - Experimental: Experimental mixes live here. Use at your own risk. + base game. ''') + parser.add_argument('--experimental', default=defval(False), help='Enable experimental features', action='store_true') parser.add_argument('--crystals_ganon', default=defval('7'), const='7', nargs='?', choices=['random', '0', '1', '2', '3', '4', '5', '6', '7'], help='''\ How many crystals are needed to defeat ganon. Any other @@ -305,7 +305,7 @@ def parse_arguments(argv, no_defaults=False): for name in ['logic', 'mode', 'swords', 'goal', 'difficulty', 'item_functionality', 'shuffle', 'door_shuffle', 'crystals_ganon', 'crystals_gt', 'openpyramid', 'mapshuffle', 'compassshuffle', 'keyshuffle', 'bigkeyshuffle', 'startinventory', - 'retro', 'accessibility', 'hints', 'beemizer', + 'retro', 'accessibility', 'hints', 'beemizer', 'experimental', 'shufflebosses', 'shuffleenemies', 'enemy_health', 'enemy_damage', 'shufflepots', 'ow_palettes', 'uw_palettes', 'sprite', 'disablemusic', 'quickswap', 'fastmenu', 'heartcolor', 'heartbeep', 'remote_items']: diff --git a/Gui.py b/Gui.py index cd7ae882..95dc5493 100755 --- a/Gui.py +++ b/Gui.py @@ -120,7 +120,6 @@ def guiMain(args=None): # Adjuster Controls self.adjustContent,self.working_dirs = adjust_page(self,self.adjustWindow,self.working_dirs) -# self.adjustContent,self.working_dirs = adjust_page(self,self.adjustWindow,self.working_dirs) self.adjustContent.pack(side=TOP, fill=BOTH, expand=True) # Custom Controls diff --git a/gui/randomize/dungeon.py b/gui/randomize/dungeon.py index b036389f..88291d73 100644 --- a/gui/randomize/dungeon.py +++ b/gui/randomize/dungeon.py @@ -70,8 +70,7 @@ def dungeon_page(parent): { "Vanilla": "vanilla", "Basic": "basic", - "Crossed": "crossed", - "Experimental": "experimental" + "Crossed": "crossed" } ) self.dungeonWidgets[key].pack(anchor=W) From d037bfc70e23e64afb9477e9fcfebe6ae3c01405 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Wed, 12 Feb 2020 04:31:15 -0800 Subject: [PATCH 032/117] Custom Item Pool page needs some adjustments Width of last column wider now that "Triforce Pieces Required" was added. --- gui/custom/overview.py | 2 +- gui/randomize/gameoptions.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/gui/custom/overview.py b/gui/custom/overview.py index 432813d9..59a87e6a 100644 --- a/gui/custom/overview.py +++ b/gui/custom/overview.py @@ -639,7 +639,7 @@ def custom_page(top,parent): self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, "Triforce Pieces Required", None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,40)}, "textbox": {"side": RIGHT}, "default": 0} + {"label": {"anchor": W, "side": LEFT}, "textbox": {"side": RIGHT}, "default": 0} ) self.customWidgets[key].pack() diff --git a/gui/randomize/gameoptions.py b/gui/randomize/gameoptions.py index d675ef0a..4a818862 100644 --- a/gui/randomize/gameoptions.py +++ b/gui/randomize/gameoptions.py @@ -165,7 +165,6 @@ def gameoptions_page(parent): return self def set_sprite(sprite_param,spriteObject=None,spriteNameVar=None): - print(sprite_param,spriteObject,spriteNameVar) if sprite_param is None or not sprite_param.valid: spriteObject = None if spriteNameVar is not None: From 8d97eede65e40afd111863af80ea29c512bda02a Mon Sep 17 00:00:00 2001 From: aerinon Date: Thu, 13 Feb 2020 13:53:04 -0700 Subject: [PATCH 033/117] -Sprite selection fix -Scrollbar added -Experimental checkbox added -Settings file created -Random sprite work for settings file --- Gui.py | 64 +++++++++++------ classes/SpriteSelector.py | 51 ++++++-------- gui/adjust/overview.py | 54 ++++++++------- gui/bottom.py | 124 +++++++++++++++++---------------- gui/loadcliargs.py | 131 +++++++++++++++++++++-------------- gui/randomize/dungeon.py | 11 +++ gui/randomize/entrando.py | 2 +- gui/randomize/gameoptions.py | 29 +++++--- gui/widgets.py | 3 +- 9 files changed, 270 insertions(+), 199 deletions(-) diff --git a/Gui.py b/Gui.py index 95dc5493..f23ac200 100755 --- a/Gui.py +++ b/Gui.py @@ -1,17 +1,10 @@ #!/usr/bin/env python3 -from argparse import Namespace -from glob import glob import json -import logging -import random import os -import shutil import sys -from tkinter import Checkbutton, OptionMenu, Toplevel, LabelFrame, PhotoImage, Tk, LEFT, RIGHT, BOTTOM, TOP, StringVar, IntVar, Frame, Label, W, E, X, BOTH, Entry, Spinbox, Button, filedialog, messagebox, ttk -from urllib.parse import urlparse -from urllib.request import urlopen +from tkinter import Tk, BOTTOM, TOP, StringVar, BooleanVar, X, BOTH, ttk -from AdjusterMain import adjust +from argparse import Namespace from CLI import get_working_dirs from DungeonRandomizer import parse_arguments from gui.adjust.overview import adjust_page @@ -24,11 +17,10 @@ from gui.randomize.dungeon import dungeon_page from gui.randomize.multiworld import multiworld_page from gui.randomize.gameoptions import gameoptions_page from gui.randomize.generation import generation_page -from gui.bottom import bottom_frame -from GuiUtils import ToolTips, set_icon, BackgroundTaskProgress -from Main import main, __version__ as ESVersion -from Rom import Sprite -from Utils import is_bundled, local_path, output_path, open_file +from gui.bottom import bottom_frame, create_guiargs +from GuiUtils import set_icon +from Main import __version__ as ESVersion +from Rom import get_sprite_from_name def guiMain(args=None): @@ -38,13 +30,27 @@ def guiMain(args=None): working_dirs_path = os.path.join(user_resources_path) if not os.path.exists(working_dirs_path): os.makedirs(working_dirs_path) - with open(os.path.join(working_dirs_path,"working_dirs.json"),"w+") as f: - f.write(json.dumps(self.working_dirs,indent=2)) - os.chmod(os.path.join(working_dirs_path,"working_dirs.json"),0o755) + with open(os.path.join(working_dirs_path, "working_dirs.json"),"w+") as f: + f.write(json.dumps(self.working_dirs, indent=2)) + os.chmod(os.path.join(working_dirs_path, "working_dirs.json"),0o755) + + def save_settings(args): + user_resources_path = os.path.join(".", "resources", "user") + settings_path = os.path.join(user_resources_path) + if not os.path.exists(settings_path): + os.makedirs(settings_path) + with open(os.path.join(settings_path, "settings.json"), "w+") as f: + f.write(json.dumps(args, indent=2)) # routine for exiting the app def guiExit(): save_working_dirs() + gui_args = vars(create_guiargs(self)) + if self.randomSprite.get(): + gui_args['sprite'] = 'random' + elif gui_args['sprite']: + gui_args['sprite'] = gui_args['sprite'].name + save_settings(gui_args) sys.exit(0) # make main window @@ -52,7 +58,7 @@ def guiMain(args=None): mainWindow = Tk() self = mainWindow mainWindow.wm_title("Door Shuffle %s" % ESVersion) - mainWindow.protocol("WM_DELETE_WINDOW",guiExit) # intercept when user clicks the X + mainWindow.protocol("WM_DELETE_WINDOW", guiExit) # intercept when user clicks the X # set program icon set_icon(mainWindow) @@ -103,7 +109,7 @@ def guiMain(args=None): self.randomizerNotebook.add(self.multiworldWindow, text="Multiworld") # Game Options - self.gameOptionsWindow = gameoptions_page(self.randomizerNotebook) + self.gameOptionsWindow = gameoptions_page(self, self.randomizerNotebook) self.randomizerNotebook.add(self.gameOptionsWindow, text="Game Options") # Generation Setup @@ -114,12 +120,15 @@ def guiMain(args=None): self.randomizerNotebook.pack() # bottom of window: Open Output Directory, Open Documentation (if exists) - self.farBottomFrame = bottom_frame(self,self,None) + self.farBottomFrame = bottom_frame(self, self, None) # set bottom frame to main window self.farBottomFrame.pack(side=BOTTOM, fill=X, padx=5, pady=5) + self.outputPath = StringVar() + self.randomSprite = BooleanVar() + # Adjuster Controls - self.adjustContent,self.working_dirs = adjust_page(self,self.adjustWindow,self.working_dirs) + self.adjustContent,self.working_dirs = adjust_page(self, self.adjustWindow, self.working_dirs) self.adjustContent.pack(side=TOP, fill=BOTH, expand=True) # Custom Controls @@ -134,10 +143,21 @@ def guiMain(args=None): vcmd=(self.customContent.register(validation), '%P') # load args from CLI into options - loadcliargs(self,args) + loadcliargs(self, args) + + # load settings second + settings_path = os.path.join(".", "resources", "user", "settings.json") + if os.path.exists(settings_path): + with(open(settings_path)) as json_file: + data = json.load(json_file) + if 'sprite' in data.keys() and data['sprite']: + data['sprite'] = get_sprite_from_name(data['sprite']) + settings_args = Namespace(**data) + loadcliargs(self, settings_args) mainWindow.mainloop() + if __name__ == '__main__': args = parse_arguments(None) guiMain(args) diff --git a/classes/SpriteSelector.py b/classes/SpriteSelector.py index 3208b3e7..b192532d 100644 --- a/classes/SpriteSelector.py +++ b/classes/SpriteSelector.py @@ -10,13 +10,14 @@ from GuiUtils import ToolTips, set_icon, BackgroundTaskProgress from Rom import Sprite from Utils import is_bundled, local_path, output_path, open_file + class SpriteSelector(object): def __init__(self, parent, callback, adjuster=False): if is_bundled(): self.deploy_icons() self.parent = parent self.window = Toplevel(parent) - self.window.geometry("900x768") + self.window.geometry("800x650") self.sections = [] self.callback = callback self.adjuster = adjuster @@ -64,27 +65,21 @@ class SpriteSelector(object): self.window.focus() def icon_section(self, frame_label, path, no_results_label): - self.frame = LabelFrame(self.window, labelwidget=frame_label, padx=5, pady=5) -# self.canvas = Canvas(self.frame) + frame = LabelFrame(self.window, labelwidget=frame_label, padx=5, pady=5) + canvas = Canvas(frame, borderwidth=0) + y_scrollbar = Scrollbar(frame, orient="vertical", command=canvas.yview) + y_scrollbar.pack(side="right", fill="y") + content_frame = Frame(canvas) + canvas.pack(side="left", fill="both", expand=True) + canvas.create_window((4, 4), window=content_frame, anchor="nw") + canvas.configure(yscrollcommand=y_scrollbar.set) - """ - self.frame.grid_rowconfigure(0, weight=1) - self.frame.grid_columnconfigure(0, weight=1) + def onFrameConfigure(canvas): + """Reset the scroll region to encompass the inner frame""" + canvas.configure(scrollregion=canvas.bbox("all")) - xscrollbar = Scrollbar(self.frame, orient=HORIZONTAL) - xscrollbar.grid(row=1, column=0, sticky=EW) - - yscrollbar = Scrollbar(self.frame) - yscrollbar.grid(row=0, column=1, sticky=NS) - - self.canvas.configure(scrollregion=self.canvas.bbox(ALL),xscrollcommand=xscrollbar.set, yscrollcommand=yscrollbar.set) - self.canvas.grid(row=0, column=0, sticky=NSEW) - - xscrollbar.config(command=self.canvas.xview) - yscrollbar.config(command=self.canvas.yview) - """ - - self.frame.pack(side=TOP, fill=X) + content_frame.bind("", lambda event, canvas=canvas: onFrameConfigure(canvas)) + frame.pack(side=TOP, fill=X) sprites = [] @@ -99,17 +94,16 @@ class SpriteSelector(object): if image is None: continue self.all_sprites.append(sprite) - button = Button(self.frame, image=image, command=lambda spr=sprite: self.select_sprite(spr)) + button = Button(content_frame, image=image, command=lambda spr=sprite: self.select_sprite(spr)) ToolTips.register(button, sprite.name + ("\nBy: %s" % sprite.author_name if sprite.author_name else "")) button.image = image button.grid(row=i // 16, column=i % 16) i += 1 if i == 0: - label = Label(self.frame, text=no_results_label) + label = Label(content_frame, text=no_results_label) label.pack() - def update_official_sprites(self): # need to wrap in try catch. We don't want errors getting the json or downloading the files to break us. self.window.destroy() @@ -181,7 +175,6 @@ class SpriteSelector(object): BackgroundTaskProgress(self.parent, work, "Updating Sprites") - def browse_for_sprite(self): sprite = filedialog.askopenfilename( filetypes=[("All Sprite Sources", (".zspr", ".spr", ".sfc", ".smc")), @@ -195,24 +188,22 @@ class SpriteSelector(object): self.callback(None) self.window.destroy() - def use_default_sprite(self): - self.callback(None) + self.callback(None, False) self.window.destroy() def use_default_link_sprite(self): - self.callback(Sprite.default_link_sprite()) + self.callback(Sprite.default_link_sprite(), False) self.window.destroy() def use_random_sprite(self): - self.callback(random.choice(self.all_sprites) if self.all_sprites else None) + self.callback(random.choice(self.all_sprites) if self.all_sprites else None, True) self.window.destroy() def select_sprite(self, spritename): - self.callback(spritename) + self.callback(spritename, False) self.window.destroy() - def deploy_icons(self): if not os.path.exists(self.unofficial_sprite_dir): os.makedirs(self.unofficial_sprite_dir) diff --git a/gui/adjust/overview.py b/gui/adjust/overview.py index 1db8dd51..7d28cadd 100644 --- a/gui/adjust/overview.py +++ b/gui/adjust/overview.py @@ -5,32 +5,33 @@ from classes.SpriteSelector import SpriteSelector import gui.widgets as widgets import logging -def adjust_page(top,parent,working_dirs): + +def adjust_page(top, parent, working_dirs): # Adjust page self = ttk.Frame(parent) # Adjust options self.adjustWidgets = {} - ## Disable BGM + # Disable BGM key = "nobgm" self.adjustWidgets[key] = widgets.make_widget( self, "checkbox", self, "Disable Music & MSU-1", - None + top.gameOptionsWindow.gameOptionsWidgets["nobgm"].storageVar ) self.adjustWidgets[key].pack(anchor=W) - ## L/R Quickswap + # L/R Quickswap key = "quickswap" self.adjustWidgets[key] = widgets.make_widget( self, "checkbox", self, "L/R Quickswapping", - None + top.gameOptionsWindow.gameOptionsWidgets["quickswap"].storageVar ) self.adjustWidgets[key].pack(anchor=W) @@ -50,7 +51,7 @@ def adjust_page(top,parent,working_dirs): "selectbox", leftAdjustFrame, "Heart Color", - None, + top.gameOptionsWindow.gameOptionsWidgets["heartcolor"].storageVar, {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, { "Red": "red", @@ -69,7 +70,7 @@ def adjust_page(top,parent,working_dirs): "selectbox", leftAdjustFrame, "Heart Beep sound rate", - None, + top.gameOptionsWindow.gameOptionsWidgets["heartbeep"].storageVar, {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}, "default": "Normal"}, { "Double": "double", @@ -85,16 +86,17 @@ def adjust_page(top,parent,working_dirs): self.spriteNameVar2 = StringVar() spriteDialogFrame2 = Frame(leftAdjustFrame) baseSpriteLabel2 = Label(spriteDialogFrame2, text='Sprite:') - self.spriteNameVar2.set('(unchanged)') spriteEntry2 = Label(spriteDialogFrame2, textvariable=self.spriteNameVar2) + self.sprite = None - def set_sprite(sprite_param): + def set_sprite(sprite_param, random_sprite): if sprite_param is None or not sprite_param.valid: - sprite = None + self.sprite = None self.spriteNameVar2.set('(unchanged)') else: - sprite = sprite_param - self.spriteNameVar2.set(sprite.name) + self.sprite = sprite_param + self.spriteNameVar2.set(self.sprite.name) + top.randomSprite.set(random_sprite) def SpriteSelectAdjuster(): SpriteSelector(parent, set_sprite, adjuster=True) @@ -106,14 +108,14 @@ def adjust_page(top,parent,working_dirs): spriteSelectButton2.pack(side=LEFT) spriteDialogFrame2.pack(anchor=E) - ## Menu Speed + # Menu Speed key = "menuspeed" self.adjustWidgets[key] = widgets.make_widget( self, "selectbox", rightAdjustFrame, "Menu Speed", - None, + top.gameOptionsWindow.gameOptionsWidgets["menuspeed"].storageVar, {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}, "default": "Normal"}, { "Instant": "instant", @@ -126,14 +128,14 @@ def adjust_page(top,parent,working_dirs): ) self.adjustWidgets[key].pack(anchor=E) - ## Overworld Palettes (not Enemizer) + # Overworld Palettes (not Enemizer) key = "owpalettes" self.adjustWidgets[key] = widgets.make_widget( self, "selectbox", rightAdjustFrame, "Overworld Palettes", - None, + top.gameOptionsWindow.gameOptionsWidgets["owpalettes"].storageVar, {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, { "Default": "default", @@ -143,14 +145,14 @@ def adjust_page(top,parent,working_dirs): ) self.adjustWidgets[key].pack(anchor=E) - ## Underworld Palettes (not Enemizer) + # Underworld Palettes (not Enemizer) key = "uwpalettes" self.adjustWidgets[key] = widgets.make_widget( self, "selectbox", rightAdjustFrame, "Underworld Palettes", - None, + top.gameOptionsWindow.gameOptionsWidgets["uwpalettes"].storageVar, {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, { "Default": "default", @@ -179,16 +181,16 @@ def adjust_page(top,parent,working_dirs): def adjustRom(): guiargs = Namespace() - guiargs.heartbeep = self.adjustWidgets["heartbeep"].get() - guiargs.heartcolor = self.adjustWidgets["heartcolor"].get() - guiargs.fastmenu = self.adjustWidgets["menuspeed"].get() - guiargs.ow_palettes = self.adjustWidgets["owpalettes"].get() - guiargs.uw_palettes = self.adjustWidgets["uwpalettes"].get() - guiargs.quickswap = bool(self.adjustWidgets["quickswap"].get()) - guiargs.disablemusic = bool(self.adjustWidgets["nobgm"].get()) + guiargs.heartbeep = self.adjustWidgets["heartbeep"].storageVar.get() + guiargs.heartcolor = self.adjustWidgets["heartcolor"].storageVar.get() + guiargs.fastmenu = self.adjustWidgets["menuspeed"].storageVar.get() + guiargs.ow_palettes = self.adjustWidgets["owpalettes"].storageVar.get() + guiargs.uw_palettes = self.adjustWidgets["uwpalettes"].storageVar.get() + guiargs.quickswap = bool(self.adjustWidgets["quickswap"].storageVar.get()) + guiargs.disablemusic = bool(self.adjustWidgets["nobgm"].storageVar.get()) guiargs.rom = self.romVar2.get() guiargs.baserom = top.generationSetupWindow.romVar.get() -# guiargs.sprite = sprite + guiargs.sprite = self.sprite try: adjust(args=guiargs) except Exception as e: diff --git a/gui/bottom.py b/gui/bottom.py index f888b4b8..de80b8b5 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -8,7 +8,8 @@ from Main import main from Utils import local_path, output_path, open_file import gui.widgets as widgets -def bottom_frame(self,parent,args=None): + +def bottom_frame(self, parent, args=None): # Bottom Frame self = ttk.Frame(parent) @@ -42,63 +43,7 @@ def bottom_frame(self,parent,args=None): self.bottomWidgets[key].pack(side=LEFT) def generateRom(): - guiargs = Namespace() - guiargs.multi = int(parent.multiworldWindow.multiworldWidgets["worlds"].storageVar.get()) - guiargs.names = parent.multiworldWindow.namesVar.get() - guiargs.seed = int(parent.farBottomFrame.seedVar.get()) if parent.farBottomFrame.seedVar.get() else None - guiargs.count = int(parent.farBottomFrame.bottomWidgets["generationcount"].storageVar.get()) if parent.farBottomFrame.bottomWidgets["generationcount"].storageVar.get() != '1' else None - guiargs.mode = parent.itemWindow.itemWidgets["worldstate"].storageVar.get() - guiargs.logic = parent.itemWindow.itemWidgets["logiclevel"].storageVar.get() - - guiargs.goal = parent.itemWindow.itemWidgets["goal"].storageVar.get() - guiargs.crystals_gt = parent.itemWindow.itemWidgets["crystals_gt"].storageVar.get() - guiargs.crystals_ganon = parent.itemWindow.itemWidgets["crystals_ganon"].storageVar.get() - guiargs.swords = parent.itemWindow.itemWidgets["weapons"].storageVar.get() - guiargs.difficulty = parent.itemWindow.itemWidgets["itempool"].storageVar.get() - guiargs.item_functionality = parent.itemWindow.itemWidgets["itemfunction"].storageVar.get() - guiargs.timer = parent.itemWindow.itemWidgets["timer"].storageVar.get() - guiargs.progressive = parent.itemWindow.itemWidgets["progressives"].storageVar.get() - guiargs.accessibility = parent.itemWindow.itemWidgets["accessibility"].storageVar.get() - guiargs.algorithm = parent.itemWindow.itemWidgets["sortingalgo"].storageVar.get() - guiargs.shuffle = parent.entrandoWindow.entrandoWidgets["entranceshuffle"].storageVar.get() - guiargs.door_shuffle = parent.dungeonRandoWindow.dungeonWidgets["dungeondoorshuffle"].storageVar.get() - guiargs.heartbeep = parent.gameOptionsWindow.gameOptionsWidgets["heartbeep"].storageVar.get() - guiargs.heartcolor = parent.gameOptionsWindow.gameOptionsWidgets["heartcolor"].storageVar.get() - guiargs.fastmenu = parent.gameOptionsWindow.gameOptionsWidgets["menuspeed"].storageVar.get() - guiargs.create_spoiler = bool(parent.generationSetupWindow.generationWidgets["spoiler"].storageVar.get()) - guiargs.skip_playthrough = not bool(parent.generationSetupWindow.generationWidgets["spoiler"].storageVar.get()) - guiargs.suppress_rom = bool(parent.generationSetupWindow.generationWidgets["suppressrom"].storageVar.get()) - guiargs.openpyramid = bool(parent.entrandoWindow.entrandoWidgets["openpyramid"].storageVar.get()) - guiargs.mapshuffle = bool(parent.dungeonRandoWindow.dungeonWidgets["mapshuffle"].storageVar.get()) - guiargs.compassshuffle = bool(parent.dungeonRandoWindow.dungeonWidgets["compassshuffle"].storageVar.get()) - guiargs.keyshuffle = bool(parent.dungeonRandoWindow.dungeonWidgets["smallkeyshuffle"].storageVar.get()) - guiargs.bigkeyshuffle = bool(parent.dungeonRandoWindow.dungeonWidgets["bigkeyshuffle"].storageVar.get()) - guiargs.retro = bool(parent.itemWindow.itemWidgets["retro"].storageVar.get()) - guiargs.quickswap = bool(parent.gameOptionsWindow.gameOptionsWidgets["quickswap"].storageVar.get()) - guiargs.disablemusic = bool(parent.gameOptionsWindow.gameOptionsWidgets["nobgm"].storageVar.get()) - guiargs.ow_palettes = parent.gameOptionsWindow.gameOptionsWidgets["owpalettes"].storageVar.get() - guiargs.uw_palettes = parent.gameOptionsWindow.gameOptionsWidgets["uwpalettes"].storageVar.get() - guiargs.shuffleganon = bool(parent.entrandoWindow.entrandoWidgets["shuffleganon"].storageVar.get()) - guiargs.hints = bool(parent.gameOptionsWindow.gameOptionsWidgets["hints"].storageVar.get()) - guiargs.enemizercli = parent.enemizerWindow.enemizerCLIpathVar.get() - guiargs.shufflebosses = parent.enemizerWindow.enemizerWidgets["bossshuffle"].storageVar.get() - guiargs.shuffleenemies = parent.enemizerWindow.enemizerWidgets["enemyshuffle"].storageVar.get() - guiargs.enemy_health = parent.enemizerWindow.enemizerWidgets["enemyhealth"].storageVar.get() - guiargs.enemy_damage = parent.enemizerWindow.enemizerWidgets["enemydamage"].storageVar.get() - guiargs.shufflepots = bool(parent.enemizerWindow.enemizerWidgets["potshuffle"].storageVar.get()) - guiargs.custom = bool(parent.generationSetupWindow.generationWidgets["usecustompool"].storageVar.get()) - guiargs.customitemarray = [int(parent.customContent.customWidgets["bow"].storageVar.get()), int(parent.customContent.customWidgets["silversupgrade"].storageVar.get()), int(parent.customContent.customWidgets["boomerang"].storageVar.get()), int(parent.customContent.customWidgets["redmerang"].storageVar.get()), int(parent.customContent.customWidgets["hookshot"].storageVar.get()), int(parent.customContent.customWidgets["mushroom"].storageVar.get()), int(parent.customContent.customWidgets["powder"].storageVar.get()), int(parent.customContent.customWidgets["firerod"].storageVar.get()), - int(parent.customContent.customWidgets["icerod"].storageVar.get()), int(parent.customContent.customWidgets["bombos"].storageVar.get()), int(parent.customContent.customWidgets["ether"].storageVar.get()), int(parent.customContent.customWidgets["quake"].storageVar.get()), int(parent.customContent.customWidgets["lamp"].storageVar.get()), int(parent.customContent.customWidgets["hammer"].storageVar.get()), int(parent.customContent.customWidgets["shovel"].storageVar.get()), int(parent.customContent.customWidgets["flute"].storageVar.get()), int(parent.customContent.customWidgets["bugnet"].storageVar.get()), - int(parent.customContent.customWidgets["book"].storageVar.get()), int(parent.customContent.customWidgets["bottle"].storageVar.get()), int(parent.customContent.customWidgets["somaria"].storageVar.get()), int(parent.customContent.customWidgets["byrna"].storageVar.get()), int(parent.customContent.customWidgets["cape"].storageVar.get()), int(parent.customContent.customWidgets["mirror"].storageVar.get()), int(parent.customContent.customWidgets["boots"].storageVar.get()), int(parent.customContent.customWidgets["powerglove"].storageVar.get()), int(parent.customContent.customWidgets["titansmitt"].storageVar.get()), - int(parent.customContent.customWidgets["progressiveglove"].storageVar.get()), int(parent.customContent.customWidgets["flippers"].storageVar.get()), int(parent.customContent.customWidgets["pearl"].storageVar.get()), int(parent.customContent.customWidgets["heartpiece"].storageVar.get()), int(parent.customContent.customWidgets["heartcontainer"].storageVar.get()), int(parent.customContent.customWidgets["sancheart"].storageVar.get()), int(parent.customContent.customWidgets["sword1"].storageVar.get()), int(parent.customContent.customWidgets["sword2"].storageVar.get()), - int(parent.customContent.customWidgets["sword3"].storageVar.get()), int(parent.customContent.customWidgets["sword4"].storageVar.get()), int(parent.customContent.customWidgets["progressivesword"].storageVar.get()), int(parent.customContent.customWidgets["shield1"].storageVar.get()), int(parent.customContent.customWidgets["shield2"].storageVar.get()), int(parent.customContent.customWidgets["shield3"].storageVar.get()), int(parent.customContent.customWidgets["progressiveshield"].storageVar.get()), int(parent.customContent.customWidgets["mail2"].storageVar.get()), - int(parent.customContent.customWidgets["mail3"].storageVar.get()), int(parent.customContent.customWidgets["progressivemail"].storageVar.get()), int(parent.customContent.customWidgets["halfmagic"].storageVar.get()), int(parent.customContent.customWidgets["quartermagic"].storageVar.get()), int(parent.customContent.customWidgets["bombsplus5"].storageVar.get()), int(parent.customContent.customWidgets["bombsplus10"].storageVar.get()), int(parent.customContent.customWidgets["arrowsplus5"].storageVar.get()), int(parent.customContent.customWidgets["arrowsplus10"].storageVar.get()), - int(parent.customContent.customWidgets["arrow1"].storageVar.get()), int(parent.customContent.customWidgets["arrow10"].storageVar.get()), int(parent.customContent.customWidgets["bomb1"].storageVar.get()), int(parent.customContent.customWidgets["bomb3"].storageVar.get()), int(parent.customContent.customWidgets["rupee1"].storageVar.get()), int(parent.customContent.customWidgets["rupee5"].storageVar.get()), int(parent.customContent.customWidgets["rupee20"].storageVar.get()), int(parent.customContent.customWidgets["rupee50"].storageVar.get()), int(parent.customContent.customWidgets["rupee100"].storageVar.get()), - int(parent.customContent.customWidgets["rupee300"].storageVar.get()), int(parent.customContent.customWidgets["rupoor"].storageVar.get()), int(parent.customContent.customWidgets["blueclock"].storageVar.get()), int(parent.customContent.customWidgets["greenclock"].storageVar.get()), int(parent.customContent.customWidgets["redclock"].storageVar.get()), int(parent.customContent.customWidgets["progressivebow"].storageVar.get()), int(parent.customContent.customWidgets["bomb10"].storageVar.get()), int(parent.customContent.customWidgets["triforcepieces"].storageVar.get()),int(parent.customContent.customWidgets["triforcepiecesgoal"].storageVar.get()), - int(parent.customContent.customWidgets["triforce"].storageVar.get()),int(parent.customContent.customWidgets["rupoorcost"].storageVar.get()),int(parent.customContent.customWidgets["generickeys"].storageVar.get())] - guiargs.rom = parent.generationSetupWindow.romVar.get() - guiargs.sprite = parent.gameOptionsWindow.gameOptionsWidgets["sprite"]["spriteObject"] - guiargs.outputpath = args.outputpath if args else None + guiargs = create_guiargs(parent) # get default values for missing parameters for k,v in vars(parse_arguments(['--multi', str(guiargs.multi)])).items(): if k not in vars(guiargs): @@ -139,3 +84,66 @@ def bottom_frame(self,parent,args=None): openReadmeButton.pack() return self + + +def create_guiargs(parent): + guiargs = Namespace() + guiargs.multi = int(parent.multiworldWindow.multiworldWidgets["worlds"].storageVar.get()) + guiargs.names = parent.multiworldWindow.namesVar.get() + guiargs.seed = int(parent.farBottomFrame.seedVar.get()) if parent.farBottomFrame.seedVar.get() else None + guiargs.count = int(parent.farBottomFrame.bottomWidgets["generationcount"].storageVar.get()) if parent.farBottomFrame.bottomWidgets["generationcount"].storageVar.get() != '1' else None + guiargs.mode = parent.itemWindow.itemWidgets["worldstate"].storageVar.get() + guiargs.logic = parent.itemWindow.itemWidgets["logiclevel"].storageVar.get() + + guiargs.goal = parent.itemWindow.itemWidgets["goal"].storageVar.get() + guiargs.crystals_gt = parent.itemWindow.itemWidgets["crystals_gt"].storageVar.get() + guiargs.crystals_ganon = parent.itemWindow.itemWidgets["crystals_ganon"].storageVar.get() + guiargs.swords = parent.itemWindow.itemWidgets["weapons"].storageVar.get() + guiargs.difficulty = parent.itemWindow.itemWidgets["itempool"].storageVar.get() + guiargs.item_functionality = parent.itemWindow.itemWidgets["itemfunction"].storageVar.get() + guiargs.timer = parent.itemWindow.itemWidgets["timer"].storageVar.get() + guiargs.progressive = parent.itemWindow.itemWidgets["progressives"].storageVar.get() + guiargs.accessibility = parent.itemWindow.itemWidgets["accessibility"].storageVar.get() + guiargs.algorithm = parent.itemWindow.itemWidgets["sortingalgo"].storageVar.get() + guiargs.shuffle = parent.entrandoWindow.entrandoWidgets["entranceshuffle"].storageVar.get() + guiargs.door_shuffle = parent.dungeonRandoWindow.dungeonWidgets["dungeondoorshuffle"].storageVar.get() + guiargs.experimental = parent.dungeonRandoWindow.dungeonWidgets["experimental"].storageVar.get() + guiargs.heartbeep = parent.gameOptionsWindow.gameOptionsWidgets["heartbeep"].storageVar.get() + guiargs.heartcolor = parent.gameOptionsWindow.gameOptionsWidgets["heartcolor"].storageVar.get() + guiargs.fastmenu = parent.gameOptionsWindow.gameOptionsWidgets["menuspeed"].storageVar.get() + guiargs.create_spoiler = bool(parent.generationSetupWindow.generationWidgets["spoiler"].storageVar.get()) + guiargs.skip_playthrough = not bool(parent.generationSetupWindow.generationWidgets["spoiler"].storageVar.get()) + guiargs.suppress_rom = bool(parent.generationSetupWindow.generationWidgets["suppressrom"].storageVar.get()) + guiargs.openpyramid = bool(parent.entrandoWindow.entrandoWidgets["openpyramid"].storageVar.get()) + guiargs.mapshuffle = bool(parent.dungeonRandoWindow.dungeonWidgets["mapshuffle"].storageVar.get()) + guiargs.compassshuffle = bool(parent.dungeonRandoWindow.dungeonWidgets["compassshuffle"].storageVar.get()) + guiargs.keyshuffle = bool(parent.dungeonRandoWindow.dungeonWidgets["smallkeyshuffle"].storageVar.get()) + guiargs.bigkeyshuffle = bool(parent.dungeonRandoWindow.dungeonWidgets["bigkeyshuffle"].storageVar.get()) + guiargs.retro = bool(parent.itemWindow.itemWidgets["retro"].storageVar.get()) + guiargs.quickswap = bool(parent.gameOptionsWindow.gameOptionsWidgets["quickswap"].storageVar.get()) + guiargs.disablemusic = bool(parent.gameOptionsWindow.gameOptionsWidgets["nobgm"].storageVar.get()) + guiargs.ow_palettes = parent.gameOptionsWindow.gameOptionsWidgets["owpalettes"].storageVar.get() + guiargs.uw_palettes = parent.gameOptionsWindow.gameOptionsWidgets["uwpalettes"].storageVar.get() + guiargs.shuffleganon = bool(parent.entrandoWindow.entrandoWidgets["shuffleganon"].storageVar.get()) + guiargs.hints = bool(parent.gameOptionsWindow.gameOptionsWidgets["hints"].storageVar.get()) + guiargs.enemizercli = parent.enemizerWindow.enemizerCLIpathVar.get() + guiargs.shufflebosses = parent.enemizerWindow.enemizerWidgets["bossshuffle"].storageVar.get() + guiargs.shuffleenemies = parent.enemizerWindow.enemizerWidgets["enemyshuffle"].storageVar.get() + guiargs.enemy_health = parent.enemizerWindow.enemizerWidgets["enemyhealth"].storageVar.get() + guiargs.enemy_damage = parent.enemizerWindow.enemizerWidgets["enemydamage"].storageVar.get() + guiargs.shufflepots = bool(parent.enemizerWindow.enemizerWidgets["potshuffle"].storageVar.get()) + guiargs.custom = bool(parent.generationSetupWindow.generationWidgets["usecustompool"].storageVar.get()) + guiargs.customitemarray = [int(parent.customContent.customWidgets["bow"].storageVar.get()), int(parent.customContent.customWidgets["silversupgrade"].storageVar.get()), int(parent.customContent.customWidgets["boomerang"].storageVar.get()), int(parent.customContent.customWidgets["redmerang"].storageVar.get()), int(parent.customContent.customWidgets["hookshot"].storageVar.get()), int(parent.customContent.customWidgets["mushroom"].storageVar.get()), int(parent.customContent.customWidgets["powder"].storageVar.get()), int(parent.customContent.customWidgets["firerod"].storageVar.get()), + int(parent.customContent.customWidgets["icerod"].storageVar.get()), int(parent.customContent.customWidgets["bombos"].storageVar.get()), int(parent.customContent.customWidgets["ether"].storageVar.get()), int(parent.customContent.customWidgets["quake"].storageVar.get()), int(parent.customContent.customWidgets["lamp"].storageVar.get()), int(parent.customContent.customWidgets["hammer"].storageVar.get()), int(parent.customContent.customWidgets["shovel"].storageVar.get()), int(parent.customContent.customWidgets["flute"].storageVar.get()), int(parent.customContent.customWidgets["bugnet"].storageVar.get()), + int(parent.customContent.customWidgets["book"].storageVar.get()), int(parent.customContent.customWidgets["bottle"].storageVar.get()), int(parent.customContent.customWidgets["somaria"].storageVar.get()), int(parent.customContent.customWidgets["byrna"].storageVar.get()), int(parent.customContent.customWidgets["cape"].storageVar.get()), int(parent.customContent.customWidgets["mirror"].storageVar.get()), int(parent.customContent.customWidgets["boots"].storageVar.get()), int(parent.customContent.customWidgets["powerglove"].storageVar.get()), int(parent.customContent.customWidgets["titansmitt"].storageVar.get()), + int(parent.customContent.customWidgets["progressiveglove"].storageVar.get()), int(parent.customContent.customWidgets["flippers"].storageVar.get()), int(parent.customContent.customWidgets["pearl"].storageVar.get()), int(parent.customContent.customWidgets["heartpiece"].storageVar.get()), int(parent.customContent.customWidgets["heartcontainer"].storageVar.get()), int(parent.customContent.customWidgets["sancheart"].storageVar.get()), int(parent.customContent.customWidgets["sword1"].storageVar.get()), int(parent.customContent.customWidgets["sword2"].storageVar.get()), + int(parent.customContent.customWidgets["sword3"].storageVar.get()), int(parent.customContent.customWidgets["sword4"].storageVar.get()), int(parent.customContent.customWidgets["progressivesword"].storageVar.get()), int(parent.customContent.customWidgets["shield1"].storageVar.get()), int(parent.customContent.customWidgets["shield2"].storageVar.get()), int(parent.customContent.customWidgets["shield3"].storageVar.get()), int(parent.customContent.customWidgets["progressiveshield"].storageVar.get()), int(parent.customContent.customWidgets["mail2"].storageVar.get()), + int(parent.customContent.customWidgets["mail3"].storageVar.get()), int(parent.customContent.customWidgets["progressivemail"].storageVar.get()), int(parent.customContent.customWidgets["halfmagic"].storageVar.get()), int(parent.customContent.customWidgets["quartermagic"].storageVar.get()), int(parent.customContent.customWidgets["bombsplus5"].storageVar.get()), int(parent.customContent.customWidgets["bombsplus10"].storageVar.get()), int(parent.customContent.customWidgets["arrowsplus5"].storageVar.get()), int(parent.customContent.customWidgets["arrowsplus10"].storageVar.get()), + int(parent.customContent.customWidgets["arrow1"].storageVar.get()), int(parent.customContent.customWidgets["arrow10"].storageVar.get()), int(parent.customContent.customWidgets["bomb1"].storageVar.get()), int(parent.customContent.customWidgets["bomb3"].storageVar.get()), int(parent.customContent.customWidgets["rupee1"].storageVar.get()), int(parent.customContent.customWidgets["rupee5"].storageVar.get()), int(parent.customContent.customWidgets["rupee20"].storageVar.get()), int(parent.customContent.customWidgets["rupee50"].storageVar.get()), int(parent.customContent.customWidgets["rupee100"].storageVar.get()), + int(parent.customContent.customWidgets["rupee300"].storageVar.get()), int(parent.customContent.customWidgets["rupoor"].storageVar.get()), int(parent.customContent.customWidgets["blueclock"].storageVar.get()), int(parent.customContent.customWidgets["greenclock"].storageVar.get()), int(parent.customContent.customWidgets["redclock"].storageVar.get()), int(parent.customContent.customWidgets["progressivebow"].storageVar.get()), int(parent.customContent.customWidgets["bomb10"].storageVar.get()), int(parent.customContent.customWidgets["triforcepieces"].storageVar.get()),int(parent.customContent.customWidgets["triforcepiecesgoal"].storageVar.get()), + int(parent.customContent.customWidgets["triforce"].storageVar.get()),int(parent.customContent.customWidgets["rupoorcost"].storageVar.get()),int(parent.customContent.customWidgets["generickeys"].storageVar.get())] + guiargs.rom = parent.generationSetupWindow.romVar.get() + guiargs.sprite = parent.gameOptionsWindow.gameOptionsWidgets["sprite"]["spriteObject"] + guiargs.randomSprite = parent.randomSprite.get() + guiargs.outputpath = parent.outputPath.get() + return guiargs diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index abad4ffd..113d3437 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -2,55 +2,82 @@ from classes.SpriteSelector import SpriteSelector as spriteSelector from gui.randomize.gameoptions import set_sprite from Rom import Sprite -def loadcliargs(gui,args): - if args is not None: - for k,v in vars(args).items(): - if type(v) is dict: - setattr(args, k, v[1]) # only get values for player 1 for now - # load values from commandline args - gui.generationSetupWindow.generationWidgets["spoiler"].storageVar.set(int(args.create_spoiler)) - gui.generationSetupWindow.generationWidgets["suppressrom"].storageVar.set(int(args.suppress_rom)) - gui.dungeonRandoWindow.dungeonWidgets["mapshuffle"].storageVar.set(args.mapshuffle) - gui.dungeonRandoWindow.dungeonWidgets["compassshuffle"].storageVar.set(args.compassshuffle) - gui.dungeonRandoWindow.dungeonWidgets["smallkeyshuffle"].storageVar.set(args.keyshuffle) - gui.dungeonRandoWindow.dungeonWidgets["bigkeyshuffle"].storageVar.set(args.bigkeyshuffle) - gui.itemWindow.itemWidgets["retro"].storageVar.set(args.retro) - gui.entrandoWindow.entrandoWidgets["openpyramid"].storageVar.set(args.openpyramid) - gui.gameOptionsWindow.gameOptionsWidgets["quickswap"].storageVar.set(int(args.quickswap)) - gui.gameOptionsWindow.gameOptionsWidgets["nobgm"].storageVar.set(int(args.disablemusic)) - if args.multi: - gui.multiworldWindow.multiworldWidgets["worlds"].storageVar.set(str(args.multi)) - if args.count: - gui.farBottomFrame.bottomWidgets["generationcount"].storageVar.set(str(args.count)) - if args.seed: - gui.farBottomFrame.seedVar.set(str(args.seed)) - gui.itemWindow.itemWidgets["worldstate"].storageVar.set(args.mode) - gui.itemWindow.itemWidgets["weapons"].storageVar.set(args.swords) - gui.itemWindow.itemWidgets["itempool"].storageVar.set(args.difficulty) - gui.itemWindow.itemWidgets["itemfunction"].storageVar.set(args.item_functionality) - gui.itemWindow.itemWidgets["timer"].storageVar.set(args.timer) - gui.itemWindow.itemWidgets["progressives"].storageVar.set(args.progressive) - gui.itemWindow.itemWidgets["accessibility"].storageVar.set(args.accessibility) - gui.itemWindow.itemWidgets["goal"].storageVar.set(args.goal) - gui.itemWindow.itemWidgets["crystals_gt"].storageVar.set(args.crystals_gt) - gui.itemWindow.itemWidgets["crystals_ganon"].storageVar.set(args.crystals_ganon) - gui.itemWindow.itemWidgets["sortingalgo"].storageVar.set(args.algorithm) - gui.entrandoWindow.entrandoWidgets["entranceshuffle"].storageVar.set(args.shuffle) - gui.dungeonRandoWindow.dungeonWidgets["dungeondoorshuffle"].storageVar.set(args.door_shuffle) - gui.gameOptionsWindow.gameOptionsWidgets["heartcolor"].storageVar.set(args.heartcolor) - gui.gameOptionsWindow.gameOptionsWidgets["heartbeep"].storageVar.set(args.heartbeep) - gui.gameOptionsWindow.gameOptionsWidgets["menuspeed"].storageVar.set(args.fastmenu) - gui.itemWindow.itemWidgets["logiclevel"].storageVar.set(args.logic) - gui.generationSetupWindow.romVar.set(args.rom) - gui.entrandoWindow.entrandoWidgets["shuffleganon"].storageVar.set(args.shuffleganon) - gui.gameOptionsWindow.gameOptionsWidgets["hints"].storageVar.set(args.hints) - gui.enemizerWindow.enemizerCLIpathVar.set(args.enemizercli) - gui.enemizerWindow.enemizerWidgets["potshuffle"].storageVar.set(args.shufflepots) - gui.enemizerWindow.enemizerWidgets["enemyshuffle"].storageVar.set(args.shuffleenemies) - gui.enemizerWindow.enemizerWidgets["bossshuffle"].storageVar.set(args.shufflebosses) - gui.enemizerWindow.enemizerWidgets["enemydamage"].storageVar.set(args.enemy_damage) - gui.enemizerWindow.enemizerWidgets["enemyhealth"].storageVar.set(args.enemy_health) - gui.gameOptionsWindow.gameOptionsWidgets["owpalettes"].storageVar.set(args.ow_palettes) - gui.gameOptionsWindow.gameOptionsWidgets["uwpalettes"].storageVar.set(args.uw_palettes) - if args.sprite is not None: - set_sprite(Sprite(args.sprite),spriteObject=gui.gameOptionsWindow.gameOptionsWidgets["sprite"]["spriteObject"],spriteNameVar=gui.gameOptionsWindow.gameOptionsWidgets["sprite"]["spriteNameVar"]) + +def loadcliargs(gui, args): + if args is not None: + for k, v in vars(args).items(): + if type(v) is dict: + setattr(args, k, v[1]) # only get values for player 1 for now + # load values from commandline args + gui.generationSetupWindow.generationWidgets["spoiler"].storageVar.set(int(args.create_spoiler)) + gui.generationSetupWindow.generationWidgets["suppressrom"].storageVar.set(int(args.suppress_rom)) + gui.dungeonRandoWindow.dungeonWidgets["mapshuffle"].storageVar.set(args.mapshuffle) + gui.dungeonRandoWindow.dungeonWidgets["compassshuffle"].storageVar.set(args.compassshuffle) + gui.dungeonRandoWindow.dungeonWidgets["smallkeyshuffle"].storageVar.set(args.keyshuffle) + gui.dungeonRandoWindow.dungeonWidgets["bigkeyshuffle"].storageVar.set(args.bigkeyshuffle) + gui.itemWindow.itemWidgets["retro"].storageVar.set(args.retro) + gui.entrandoWindow.entrandoWidgets["openpyramid"].storageVar.set(args.openpyramid) + gui.gameOptionsWindow.gameOptionsWidgets["quickswap"].storageVar.set(int(args.quickswap)) + gui.gameOptionsWindow.gameOptionsWidgets["nobgm"].storageVar.set(int(args.disablemusic)) + if args.multi: + gui.multiworldWindow.multiworldWidgets["worlds"].storageVar.set(str(args.multi)) + if args.count: + gui.farBottomFrame.bottomWidgets["generationcount"].storageVar.set(str(args.count)) + if args.seed: + gui.farBottomFrame.seedVar.set(str(args.seed)) + gui.itemWindow.itemWidgets["worldstate"].storageVar.set(args.mode) + gui.itemWindow.itemWidgets["weapons"].storageVar.set(args.swords) + gui.itemWindow.itemWidgets["itempool"].storageVar.set(args.difficulty) + gui.itemWindow.itemWidgets["itemfunction"].storageVar.set(args.item_functionality) + gui.itemWindow.itemWidgets["timer"].storageVar.set(args.timer) + gui.itemWindow.itemWidgets["progressives"].storageVar.set(args.progressive) + gui.itemWindow.itemWidgets["accessibility"].storageVar.set(args.accessibility) + gui.itemWindow.itemWidgets["goal"].storageVar.set(args.goal) + gui.itemWindow.itemWidgets["crystals_gt"].storageVar.set(args.crystals_gt) + gui.itemWindow.itemWidgets["crystals_ganon"].storageVar.set(args.crystals_ganon) + gui.itemWindow.itemWidgets["sortingalgo"].storageVar.set(args.algorithm) + gui.entrandoWindow.entrandoWidgets["entranceshuffle"].storageVar.set(args.shuffle) + gui.dungeonRandoWindow.dungeonWidgets["dungeondoorshuffle"].storageVar.set(args.door_shuffle) + gui.dungeonRandoWindow.dungeonWidgets["experimental"].storageVar.set(args.experimental) + gui.gameOptionsWindow.gameOptionsWidgets["heartcolor"].storageVar.set(args.heartcolor) + gui.gameOptionsWindow.gameOptionsWidgets["heartbeep"].storageVar.set(args.heartbeep) + gui.gameOptionsWindow.gameOptionsWidgets["menuspeed"].storageVar.set(args.fastmenu) + gui.itemWindow.itemWidgets["logiclevel"].storageVar.set(args.logic) + gui.generationSetupWindow.romVar.set(args.rom) + gui.entrandoWindow.entrandoWidgets["shuffleganon"].storageVar.set(args.shuffleganon) + gui.gameOptionsWindow.gameOptionsWidgets["hints"].storageVar.set(args.hints) + gui.enemizerWindow.enemizerCLIpathVar.set(args.enemizercli) + gui.enemizerWindow.enemizerWidgets["potshuffle"].storageVar.set(args.shufflepots) + gui.enemizerWindow.enemizerWidgets["enemyshuffle"].storageVar.set(args.shuffleenemies) + gui.enemizerWindow.enemizerWidgets["bossshuffle"].storageVar.set(args.shufflebosses) + gui.enemizerWindow.enemizerWidgets["enemydamage"].storageVar.set(args.enemy_damage) + gui.enemizerWindow.enemizerWidgets["enemyhealth"].storageVar.set(args.enemy_health) + gui.gameOptionsWindow.gameOptionsWidgets["owpalettes"].storageVar.set(args.ow_palettes) + gui.gameOptionsWindow.gameOptionsWidgets["uwpalettes"].storageVar.set(args.uw_palettes) + gui.outputPath.set(args.outputpath) + + def sprite_setter(spriteObject): + gui.gameOptionsWindow.gameOptionsWidgets["sprite"]["spriteObject"] = spriteObject + if args.sprite is not None: + sprite_obj = args.sprite if isinstance(args.sprite, Sprite) else Sprite(args.sprite) + r_sprite_flag = args.randomSprite if hasattr(args, 'randomSprite') else False + set_sprite(sprite_obj, r_sprite_flag, spriteSetter=sprite_setter, + spriteNameVar=gui.gameOptionsWindow.gameOptionsWidgets["sprite"]["spriteNameVar"], + randomSpriteVar=gui.randomSprite) + + gui.adjustContent.adjustWidgets["nobgm"].storageVar.set(int(args.disablemusic)) + gui.adjustContent.adjustWidgets['quickswap'].storageVar.set(args.quickswap) + gui.adjustContent.adjustWidgets["heartcolor"].storageVar.set(args.heartcolor) + gui.adjustContent.adjustWidgets["heartbeep"].storageVar.set(args.heartbeep) + gui.adjustContent.adjustWidgets["menuspeed"].storageVar.set(args.fastmenu) + gui.adjustContent.adjustWidgets["owpalettes"].storageVar.set(args.ow_palettes) + gui.adjustContent.adjustWidgets["uwpalettes"].storageVar.set(args.uw_palettes) + + def sprite_setter_adj(spriteObject): + gui.adjustContent.sprite = spriteObject + if args.sprite is not None: + sprite_obj = args.sprite if isinstance(args.sprite, Sprite) else Sprite(args.sprite) + r_sprite_flag = args.randomSprite if hasattr(args, 'randomSprite') else False + set_sprite(sprite_obj, r_sprite_flag, spriteSetter=sprite_setter_adj, + spriteNameVar=gui.adjustContent.spriteNameVar2, + randomSpriteVar=gui.randomSprite) diff --git a/gui/randomize/dungeon.py b/gui/randomize/dungeon.py index 88291d73..ad372ead 100644 --- a/gui/randomize/dungeon.py +++ b/gui/randomize/dungeon.py @@ -75,4 +75,15 @@ def dungeon_page(parent): ) self.dungeonWidgets[key].pack(anchor=W) + # Experimental features + key = "experimental" + self.dungeonWidgets[key] = widgets.make_widget( + self, + "checkbox", + self, + "Enable Experimental Features", + None + ) + self.dungeonWidgets[key].pack(anchor=W) + return self diff --git a/gui/randomize/entrando.py b/gui/randomize/entrando.py index ab218d23..1302d5a9 100644 --- a/gui/randomize/entrando.py +++ b/gui/randomize/entrando.py @@ -26,7 +26,7 @@ def entrando_page(parent): "checkbox", self, "Include Ganon's Tower and Pyramid Hole in shuffle pool", - {"default": 1} + None ) self.entrandoWidgets[key].pack(anchor=W) diff --git a/gui/randomize/gameoptions.py b/gui/randomize/gameoptions.py index 4a818862..ae543e18 100644 --- a/gui/randomize/gameoptions.py +++ b/gui/randomize/gameoptions.py @@ -3,7 +3,8 @@ from functools import partial import classes.SpriteSelector as spriteSelector import gui.widgets as widgets -def gameoptions_page(parent): + +def gameoptions_page(top, parent): # Game Options self = ttk.Frame(parent) @@ -94,14 +95,18 @@ def gameoptions_page(parent): self.gameOptionsWidgets["sprite"]["spriteObject"] = None self.gameOptionsWidgets["sprite"]["spriteNameVar"] = StringVar() - set_sprite(None,self.gameOptionsWidgets["sprite"]["spriteObject"],self.gameOptionsWidgets["sprite"]["spriteNameVar"]) self.gameOptionsWidgets["sprite"]["spriteNameVar"].set('(unchanged)') spriteEntry = Label(spriteDialogFrame, textvariable=self.gameOptionsWidgets["sprite"]["spriteNameVar"]) - def SpriteSelect(): - spriteSelector.SpriteSelector(parent, partial(set_sprite,spriteObject=self.gameOptionsWidgets["sprite"]["spriteObject"],spriteNameVar=self.gameOptionsWidgets["sprite"]["spriteNameVar"])) + def sprite_setter(spriteObject): + self.gameOptionsWidgets["sprite"]["spriteObject"] = spriteObject - spriteSelectButton = Button(spriteDialogFrame, text='...', command=SpriteSelect) + def sprite_select(): + spriteSelector.SpriteSelector(parent, partial(set_sprite, spriteSetter=sprite_setter, + spriteNameVar=self.gameOptionsWidgets["sprite"]["spriteNameVar"], + randomSpriteVar=top.randomSprite)) + + spriteSelectButton = Button(spriteDialogFrame, text='...', command=sprite_select) baseSpriteLabel.pack(side=LEFT) spriteEntry.pack(side=LEFT) @@ -164,12 +169,18 @@ def gameoptions_page(parent): return self -def set_sprite(sprite_param,spriteObject=None,spriteNameVar=None): + +def set_sprite(sprite_param, random_sprite, spriteSetter=None, spriteNameVar=None, randomSpriteVar=None): if sprite_param is None or not sprite_param.valid: - spriteObject = None + if spriteSetter: + spriteSetter(None) if spriteNameVar is not None: spriteNameVar.set('(unchanged)') else: - spriteObject = sprite_param + if spriteSetter: + spriteSetter(sprite_param) if spriteNameVar is not None: - spriteNameVar.set(spriteObject.name) + spriteNameVar.set(sprite_param.name) + if randomSpriteVar: + randomSpriteVar.set(random_sprite) + diff --git a/gui/widgets.py b/gui/widgets.py index 3bf14ba2..aec2f31c 100644 --- a/gui/widgets.py +++ b/gui/widgets.py @@ -69,9 +69,10 @@ def make_textbox(self, parent, label, storageVar, packAttrs): self.textbox.pack(packAttrs["textbox"]) return self + def make_widget(self, type, parent, label, storageVar=None, packAttrs=dict(), options=None): widget = None - thisStorageVar = None + thisStorageVar = storageVar if isinstance(storageVar,str): if storageVar == "int" or storageVar == "integer": thisStorageVar = IntVar() From 3fe2c0282451656599412bb553aaa95e0798522c Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 01:41:21 -0800 Subject: [PATCH 034/117] Arrayify more stuff Ignore settings file Rip out working_dirs in favor of settings Set main pages to array Set bottom frame to array --- .gitignore | 1 + CLI.py | 170 ++++++++++++++++++++++++++++++------ Gui.py | 56 ++++-------- gui/adjust/overview.py | 8 +- gui/bottom.py | 12 +-- gui/loadcliargs.py | 4 +- gui/randomize/enemizer.py | 10 +-- gui/randomize/generation.py | 8 +- gui/randomize/multiworld.py | 8 +- 9 files changed, 187 insertions(+), 90 deletions(-) diff --git a/.gitignore b/.gitignore index c242b833..9f9fc87a 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,7 @@ EnemizerCLI/ RaceRom.py weights/ +settings.json working_dirs.json venv diff --git a/CLI.py b/CLI.py index 32895166..1098b6ae 100644 --- a/CLI.py +++ b/CLI.py @@ -23,8 +23,8 @@ def parse_arguments(argv, no_defaults=False): def defval(value): return value if not no_defaults else None - # get working dirs - working_dirs = get_working_dirs() + # get settings + settings = get_settings() # we need to know how many players we have first parser = argparse.ArgumentParser(add_help=False) @@ -206,10 +206,10 @@ def parse_arguments(argv, no_defaults=False): parser.add_argument('--openpyramid', default=defval(False), help='''\ Pre-opens the pyramid hole, this removes the Agahnim 2 requirement for it ''', action='store_true') - parser.add_argument('--rom', default=defval(working_dirs["rom.base"]), help='Path to an ALttP JAP(1.0) rom to use as a base.') + parser.add_argument('--rom', default=defval(settings["rom"]), help='Path to an ALttP JAP(1.0) rom to use as a base.') parser.add_argument('--loglevel', default=defval('info'), const='info', nargs='?', choices=['error', 'info', 'warning', 'debug'], help='Select level of logging for output.') - parser.add_argument('--seed', default=defval(int(working_dirs["gen.seed"]) if working_dirs["gen.seed"] is not "" and working_dirs["gen.seed"] is not None else None), help='Define seed number to generate.', type=int) - parser.add_argument('--count', default=defval(int(working_dirs["gen.count"])), help='''\ + parser.add_argument('--seed', default=defval(int(settings["seed"]) if settings["seed"] is not "" and settings["seed"] is not None else None), help='Define seed number to generate.', type=int) + parser.add_argument('--count', default=defval(int(settings["count"])), help='''\ Use to batch generate multiple seeds with same settings. If --seed is provided, it will be used for the first seed, then used to derive the next seed (i.e. generating 10 seeds with @@ -274,7 +274,7 @@ def parse_arguments(argv, no_defaults=False): for VT site integration, do not use otherwise. ''') parser.add_argument('--skip_playthrough', action='store_true', default=defval(False)) - parser.add_argument('--enemizercli', default=defval(working_dirs["enemizer.cli"])) + parser.add_argument('--enemizercli', default=defval(settings["enemizercli"])) parser.add_argument('--shufflebosses', default=defval('none'), choices=['none', 'basic', 'normal', 'chaos']) parser.add_argument('--shuffleenemies', default=defval('none'), choices=['none', 'shuffled', 'chaos']) parser.add_argument('--enemy_health', default=defval('default'), choices=['default', 'easy', 'normal', 'hard', 'expert']) @@ -282,10 +282,10 @@ def parse_arguments(argv, no_defaults=False): parser.add_argument('--shufflepots', default=defval(False), action='store_true') parser.add_argument('--beemizer', default=defval(0), type=lambda value: min(max(int(value), 0), 4)) parser.add_argument('--remote_items', default=defval(False), action='store_true') - parser.add_argument('--multi', default=defval(working_dirs["multi.worlds"]), type=lambda value: min(max(int(value), 1), 255)) - parser.add_argument('--names', default=defval(working_dirs["multi.names"])) + parser.add_argument('--multi', default=defval(settings["multi"]), type=lambda value: min(max(int(value), 1), 255)) + parser.add_argument('--names', default=defval(settings["names"])) parser.add_argument('--teams', default=defval(1), type=lambda value: max(int(value), 1)) - parser.add_argument('--outputpath', default=defval(working_dirs["outputpath"])) + parser.add_argument('--outputpath', default=defval(settings["outputpath"])) parser.add_argument('--race', default=defval(False), action='store_true') parser.add_argument('--outputname') @@ -294,6 +294,7 @@ def parse_arguments(argv, no_defaults=False): parser.add_argument(f'--p{player}', default=defval(''), help=argparse.SUPPRESS) ret = parser.parse_args(argv) + print(ret) if ret.keysanity: ret.mapshuffle, ret.compassshuffle, ret.keyshuffle, ret.bigkeyshuffle = [True] * 4 @@ -317,26 +318,141 @@ def parse_arguments(argv, no_defaults=False): return ret -def get_working_dirs(): - # set default working dirs to same dir as script - working_dirs = { - "adjust.rom": os.path.join("."), - "enemizer.cli": os.path.join(".","EnemizerCLI","EnemizerCLI.Core"), - "multi.worlds": 1, - "multi.names": "", - "rom.base": os.path.join(".","Zelda no Densetsu - Kamigami no Triforce (Japan).sfc"), - "gen.seed": "", - "gen.count": 1, - "outputpath": os.path.join("."), +def get_settings(): + # set default settings + settings = { + "multi": 1, + "names": "", + "seed": null, + "count": null, + "mode": "open", + "logic": "noglitches", + "goal": "ganon", + "crystals_gt": "7", + "crystals_ganon": "7", + "swords": "random", + "difficulty": "normal", + "item_functionality": "normal", + "timer": "none", + "progressive": "on", + "accessibility": "items", + "algorithm": "balanced", + "shuffle": "vanilla", + "door_shuffle": "basic", + "experimental": 0, + "heartbeep": "normal", + "heartcolor": "red", + "fastmenu": "normal", + "create_spoiler": false, + "skip_playthrough": true, + "suppress_rom": false, + "openpyramid": false, + "mapshuffle": false, + "compassshuffle": false, + "keyshuffle": false, + "bigkeyshuffle": false, + "retro": false, + "quickswap": false, + "disablemusic": false, + "ow_palettes": "default", + "uw_palettes": "default", + "shuffleganon": true, + "hints": false, + "enemizercli": os.path.join(".","EnemizerCLI","EnemizerCLI.Core"), + "shufflebosses": "none", + "shuffleenemies": "none", + "enemy_health": "default", + "enemy_damage": "default", + "shufflepots": false, + "custom": false, + "customitemarray": [ + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 4, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 2, + 1, + 1, + 24, + 10, + 1, + 0, + 0, + 0, + 0, + 4, + 0, + 0, + 0, + 3, + 0, + 0, + 2, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 12, + 0, + 13, + 2, + 4, + 28, + 7, + 1, + 5, + 0, + 0, + 0, + 0, + 2, + 1, + 0, + 0, + 0, + 10, + 0 + ], + "rom": os.path.join(".","Zelda no Densetsu - Kamigami no Triforce (Japan).sfc"), + "sprite": null, + "randomSprite": false, + "outputpath": os.path.join(".") } if sys.platform.lower().find("windows"): - working_dirs["enemizer.cli"] += ".exe" + settings["enemizercli"] += ".exe" - # read saved working dirs file if it exists and set these - working_dirs_path = os.path.join(".","resources","user","working_dirs.json") - if os.path.exists(working_dirs_path): - with(open(working_dirs_path)) as json_file: + # read saved settings file if it exists and set these + settings_path = os.path.join(".", "resources", "user", "settings.json") + if os.path.exists(settings_path): + with(open(settings_path)) as json_file: data = json.load(json_file) + if 'sprite' in data.keys() and data['sprite']: + data['sprite'] = get_sprite_from_name(data['sprite']) for k,v in data.items(): - working_dirs[k] = v - return working_dirs + settings[k] = v + return settings_args diff --git a/Gui.py b/Gui.py index f23ac200..0e26c8bb 100755 --- a/Gui.py +++ b/Gui.py @@ -5,7 +5,7 @@ import sys from tkinter import Tk, BOTTOM, TOP, StringVar, BooleanVar, X, BOTH, ttk from argparse import Namespace -from CLI import get_working_dirs +from CLI import get_settings from DungeonRandomizer import parse_arguments from gui.adjust.overview import adjust_page from gui.custom.overview import custom_page @@ -24,16 +24,6 @@ from Rom import get_sprite_from_name def guiMain(args=None): - # save working dirs - def save_working_dirs(): - user_resources_path = os.path.join(".","resources","user") - working_dirs_path = os.path.join(user_resources_path) - if not os.path.exists(working_dirs_path): - os.makedirs(working_dirs_path) - with open(os.path.join(working_dirs_path, "working_dirs.json"),"w+") as f: - f.write(json.dumps(self.working_dirs, indent=2)) - os.chmod(os.path.join(working_dirs_path, "working_dirs.json"),0o755) - def save_settings(args): user_resources_path = os.path.join(".", "resources", "user") settings_path = os.path.join(user_resources_path) @@ -41,10 +31,10 @@ def guiMain(args=None): os.makedirs(settings_path) with open(os.path.join(settings_path, "settings.json"), "w+") as f: f.write(json.dumps(args, indent=2)) + os.chmod(os.path.join(settings_path, "settings.json"),0o755) # routine for exiting the app def guiExit(): - save_working_dirs() gui_args = vars(create_guiargs(self)) if self.randomSprite.get(): gui_args['sprite'] = 'random' @@ -63,16 +53,16 @@ def guiMain(args=None): # set program icon set_icon(mainWindow) - # get working dirs - self.working_dirs = get_working_dirs() + # get saved settings + self.settings = get_settings() notebook = ttk.Notebook(self) - self.randomizerWindow = ttk.Frame(notebook) - self.adjustWindow = ttk.Frame(notebook) - self.customWindow = ttk.Frame(notebook) - notebook.add(self.randomizerWindow, text='Randomize') - notebook.add(self.adjustWindow, text='Adjust') - notebook.add(self.customWindow, text='Custom') + self.pages["randomizer"] = ttk.Frame(notebook) + self.pages["adjust"] = ttk.Frame(notebook) + self.pages["custom"] = ttk.Frame(notebook) + notebook.add(self.pages["randomizer"], text='Randomize') + notebook.add(self.pages["adjust"], text='Adjust') + notebook.add(self.pages["custom"], text='Custom') notebook.pack() # randomizer controls @@ -86,7 +76,7 @@ def guiMain(args=None): # Multiworld: Multiworld settings # Game Options: Cosmetic settings that don't affect logic/placement # Generation Setup: Primarily one&done settings - self.randomizerNotebook = ttk.Notebook(self.randomizerWindow) + self.randomizerNotebook = ttk.Notebook(self.pages["randomizer"]) # Item Randomizer self.itemWindow = item_page(self.randomizerNotebook) @@ -97,7 +87,7 @@ def guiMain(args=None): self.randomizerNotebook.add(self.entrandoWindow, text="Entrances") # Enemizer - self.enemizerWindow,self.working_dirs = enemizer_page(self.randomizerNotebook,self.working_dirs) + self.enemizerWindow,self.settings = enemizer_page(self.randomizerNotebook,self.settings) self.randomizerNotebook.add(self.enemizerWindow, text="Enemizer") # Dungeon Shuffle @@ -105,7 +95,7 @@ def guiMain(args=None): self.randomizerNotebook.add(self.dungeonRandoWindow, text="Dungeon Shuffle") # Multiworld - self.multiworldWindow,self.working_dirs = multiworld_page(self.randomizerNotebook,self.working_dirs) + self.multiworldWindow,self.settings = multiworld_page(self.randomizerNotebook,self.settings) self.randomizerNotebook.add(self.multiworldWindow, text="Multiworld") # Game Options @@ -113,26 +103,26 @@ def guiMain(args=None): self.randomizerNotebook.add(self.gameOptionsWindow, text="Game Options") # Generation Setup - self.generationSetupWindow,self.working_dirs = generation_page(self.randomizerNotebook,self.working_dirs) + self.generationSetupWindow,self.settings = generation_page(self.randomizerNotebook,self.settings) self.randomizerNotebook.add(self.generationSetupWindow, text="Generation Setup") # add randomizer notebook to main window self.randomizerNotebook.pack() # bottom of window: Open Output Directory, Open Documentation (if exists) - self.farBottomFrame = bottom_frame(self, self, None) + self.frames["bottom"] = bottom_frame(self, self, None) # set bottom frame to main window - self.farBottomFrame.pack(side=BOTTOM, fill=X, padx=5, pady=5) + self.frames["bottom"].pack(side=BOTTOM, fill=X, padx=5, pady=5) self.outputPath = StringVar() self.randomSprite = BooleanVar() # Adjuster Controls - self.adjustContent,self.working_dirs = adjust_page(self, self.adjustWindow, self.working_dirs) + self.adjustContent,self.settings = adjust_page(self, self.pages["adjust"], self.settings) self.adjustContent.pack(side=TOP, fill=BOTH, expand=True) # Custom Controls - self.customContent = custom_page(self,self.customWindow) + self.customContent = custom_page(self,self.pages["custom"]) self.customContent.pack(side=TOP, pady=(17,0)) def validation(P): @@ -145,16 +135,6 @@ def guiMain(args=None): # load args from CLI into options loadcliargs(self, args) - # load settings second - settings_path = os.path.join(".", "resources", "user", "settings.json") - if os.path.exists(settings_path): - with(open(settings_path)) as json_file: - data = json.load(json_file) - if 'sprite' in data.keys() and data['sprite']: - data['sprite'] = get_sprite_from_name(data['sprite']) - settings_args = Namespace(**data) - loadcliargs(self, settings_args) - mainWindow.mainloop() diff --git a/gui/adjust/overview.py b/gui/adjust/overview.py index 7d28cadd..18669b7c 100644 --- a/gui/adjust/overview.py +++ b/gui/adjust/overview.py @@ -6,7 +6,7 @@ import gui.widgets as widgets import logging -def adjust_page(top, parent, working_dirs): +def adjust_page(top, parent, settings): # Adjust page self = ttk.Frame(parent) @@ -164,13 +164,13 @@ def adjust_page(top, parent, working_dirs): adjustRomFrame = Frame(bottomAdjustFrame) adjustRomLabel = Label(adjustRomFrame, text='Rom to adjust: ') - self.romVar2 = StringVar(value=working_dirs["adjust.rom"]) + self.romVar2 = StringVar(value=settings["rom"]) romEntry2 = Entry(adjustRomFrame, textvariable=self.romVar2) def RomSelect2(): rom = filedialog.askopenfilename(filetypes=[("Rom Files", (".sfc", ".smc")), ("All Files", "*")]) if rom: - working_dirs["adjust.rom"] = rom + settings["rom"] = rom self.romVar2.set(rom) romSelectButton2 = Button(adjustRomFrame, text='Select Rom', command=RomSelect2) @@ -202,4 +202,4 @@ def adjust_page(top, parent, working_dirs): adjustButton = Button(bottomAdjustFrame, text='Adjust Rom', command=adjustRom) adjustButton.pack(side=BOTTOM, padx=(5, 0)) - return self,working_dirs + return self,settings diff --git a/gui/bottom.py b/gui/bottom.py index de80b8b5..d3e097f6 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -3,7 +3,7 @@ from argparse import Namespace import logging import os import random -from CLI import parse_arguments, get_working_dirs +from CLI import parse_arguments, get_settings from Main import main from Utils import local_path, output_path, open_file import gui.widgets as widgets @@ -20,11 +20,11 @@ def bottom_frame(self, parent, args=None): seedCountFrame.pack() ## Seed # seedLabel = Label(self, text='Seed #') - savedSeed = parent.working_dirs["gen.seed"] + savedSeed = parent.settings["seed"] self.seedVar = StringVar(value=savedSeed) def saveSeed(caller,_,mode): savedSeed = self.seedVar.get() - parent.working_dirs["gen.seed"] = int(savedSeed) if savedSeed.isdigit() else None + parent.settings["seed"] = int(savedSeed) if savedSeed.isdigit() else None self.seedVar.trace_add("write",saveSeed) seedEntry = Entry(self, width=15, textvariable=self.seedVar) seedLabel.pack(side=LEFT) @@ -72,7 +72,7 @@ def bottom_frame(self, parent, args=None): if args and args.outputpath: open_file(output_path(args.outputpath)) else: - open_file(output_path(parent.working_dirs["outputpath"])) + open_file(output_path(parent.settings["outputpath"])) openOutputButton = Button(self, text='Open Output Directory', command=open_output) openOutputButton.pack(side=RIGHT) @@ -90,8 +90,8 @@ def create_guiargs(parent): guiargs = Namespace() guiargs.multi = int(parent.multiworldWindow.multiworldWidgets["worlds"].storageVar.get()) guiargs.names = parent.multiworldWindow.namesVar.get() - guiargs.seed = int(parent.farBottomFrame.seedVar.get()) if parent.farBottomFrame.seedVar.get() else None - guiargs.count = int(parent.farBottomFrame.bottomWidgets["generationcount"].storageVar.get()) if parent.farBottomFrame.bottomWidgets["generationcount"].storageVar.get() != '1' else None + guiargs.seed = int(parent.frames["bottom"].seedVar.get()) if parent.frames["bottom"].seedVar.get() else None + guiargs.count = int(parent.frames["bottom"].bottomWidgets["generationcount"].storageVar.get()) if parent.frames["bottom"].bottomWidgets["generationcount"].storageVar.get() != '1' else None guiargs.mode = parent.itemWindow.itemWidgets["worldstate"].storageVar.get() guiargs.logic = parent.itemWindow.itemWidgets["logiclevel"].storageVar.get() diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index 113d3437..b0974e86 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -22,9 +22,9 @@ def loadcliargs(gui, args): if args.multi: gui.multiworldWindow.multiworldWidgets["worlds"].storageVar.set(str(args.multi)) if args.count: - gui.farBottomFrame.bottomWidgets["generationcount"].storageVar.set(str(args.count)) + gui.frames["bottom"].bottomWidgets["generationcount"].storageVar.set(str(args.count)) if args.seed: - gui.farBottomFrame.seedVar.set(str(args.seed)) + gui.frames["bottom"].seedVar.set(str(args.seed)) gui.itemWindow.itemWidgets["worldstate"].storageVar.set(args.mode) gui.itemWindow.itemWidgets["weapons"].storageVar.set(args.swords) gui.itemWindow.itemWidgets["itempool"].storageVar.set(args.difficulty) diff --git a/gui/randomize/enemizer.py b/gui/randomize/enemizer.py index 74e570d7..d3c08ebd 100644 --- a/gui/randomize/enemizer.py +++ b/gui/randomize/enemizer.py @@ -2,7 +2,7 @@ import os from tkinter import ttk, filedialog, IntVar, StringVar, Button, Checkbutton, Entry, Frame, Label, LabelFrame, OptionMenu, N, E, W, LEFT, RIGHT, X import gui.widgets as widgets -def enemizer_page(parent,working_dirs): +def enemizer_page(parent,settings): # Enemizer self = ttk.Frame(parent) @@ -24,9 +24,9 @@ def enemizer_page(parent,working_dirs): enemizerPathFrame = Frame(self) enemizerCLIlabel = Label(enemizerPathFrame, text="EnemizerCLI path: ") enemizerCLIlabel.pack(side=LEFT) - self.enemizerCLIpathVar = StringVar(value=working_dirs["enemizer.cli"]) + self.enemizerCLIpathVar = StringVar(value=settings["enemizercli"]) def saveEnemizerPath(caller,_,mode): - working_dirs["enemizer.cli"] = self.enemizerCLIpathVar.get() + settings["enemizercli"] = self.enemizerCLIpathVar.get() self.enemizerCLIpathVar.trace_add("write",saveEnemizerPath) enemizerCLIpathEntry = Entry(enemizerPathFrame, textvariable=self.enemizerCLIpathVar) enemizerCLIpathEntry.pack(side=LEFT, fill=X, expand=True) @@ -34,7 +34,7 @@ def enemizer_page(parent,working_dirs): path = filedialog.askopenfilename(filetypes=[("EnemizerCLI executable", "*EnemizerCLI*")], initialdir=os.path.join(".")) if path: self.enemizerCLIpathVar.set(path) - working_dirs["enemizer.cli"] = path + settings["enemizercli"] = path enemizerCLIbrowseButton = Button(enemizerPathFrame, text='...', command=EnemizerSelectPath) enemizerCLIbrowseButton.pack(side=LEFT) enemizerPathFrame.pack(fill=X, expand=True) @@ -115,4 +115,4 @@ def enemizer_page(parent,working_dirs): ) self.enemizerWidgets[key].pack(anchor=E) - return self,working_dirs + return self,settings diff --git a/gui/randomize/generation.py b/gui/randomize/generation.py index ecccd3e3..aea9c5e9 100644 --- a/gui/randomize/generation.py +++ b/gui/randomize/generation.py @@ -2,7 +2,7 @@ import os from tkinter import ttk, filedialog, IntVar, StringVar, Button, Checkbutton, Entry, Frame, Label, E, W, LEFT, RIGHT, X import gui.widgets as widgets -def generation_page(parent,working_dirs): +def generation_page(parent,settings): # Generation Setup self = ttk.Frame(parent) @@ -47,10 +47,10 @@ def generation_page(parent,working_dirs): baseRomLabel = Label(baseRomFrame, text='Base Rom: ') self.romVar = StringVar() def saveBaseRom(caller,_,mode): - working_dirs["rom.base"] = self.romVar.get() + settings["rom"] = self.romVar.get() self.romVar.trace_add("write",saveBaseRom) romEntry = Entry(baseRomFrame, textvariable=self.romVar) - self.romVar.set(working_dirs["rom.base"]) + self.romVar.set(settings["rom"]) def RomSelect(): rom = filedialog.askopenfilename(filetypes=[("Rom Files", (".sfc", ".smc")), ("All Files", "*")], initialdir=os.path.join(".")) @@ -62,4 +62,4 @@ def generation_page(parent,working_dirs): romSelectButton.pack(side=LEFT) baseRomFrame.pack(fill=X, expand=True) - return self,working_dirs + return self,settings diff --git a/gui/randomize/multiworld.py b/gui/randomize/multiworld.py index 8e5e6f7c..ee8b9d47 100644 --- a/gui/randomize/multiworld.py +++ b/gui/randomize/multiworld.py @@ -1,7 +1,7 @@ from tkinter import ttk, StringVar, Entry, Frame, Label, Spinbox, N, E, W, X, LEFT, RIGHT import gui.widgets as widgets -def multiworld_page(parent,working_dirs): +def multiworld_page(parent,settings): # Multiworld self = ttk.Frame(parent) @@ -23,13 +23,13 @@ def multiworld_page(parent,working_dirs): ## List of Player Names namesFrame = Frame(self) namesLabel = Label(namesFrame, text='Player names') - self.namesVar = StringVar(value=working_dirs["multi.names"]) + self.namesVar = StringVar(value=settings["names"]) def saveMultiNames(caller,_,mode): - working_dirs["multi.names"] = self.namesVar.get() + settings["names"] = self.namesVar.get() self.namesVar.trace_add("write",saveMultiNames) namesEntry = Entry(namesFrame, textvariable=self.namesVar) namesLabel.pack(side=LEFT) namesEntry.pack(side=LEFT, fill=X, expand=True) namesFrame.pack(anchor=N, fill=X, expand=True) - return self,working_dirs + return self,settings From 03598c54a413a74ddc6f744385b8b0c23fe0afeb Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 01:53:06 -0800 Subject: [PATCH 035/117] Arrayify Item Rando --- Gui.py | 48 +++++++++++++++++++++++----------------------- gui/bottom.py | 26 ++++++++++++------------- gui/loadcliargs.py | 26 ++++++++++++------------- 3 files changed, 50 insertions(+), 50 deletions(-) diff --git a/Gui.py b/Gui.py index 0e26c8bb..470c41e5 100755 --- a/Gui.py +++ b/Gui.py @@ -56,14 +56,14 @@ def guiMain(args=None): # get saved settings self.settings = get_settings() - notebook = ttk.Notebook(self) - self.pages["randomizer"] = ttk.Frame(notebook) - self.pages["adjust"] = ttk.Frame(notebook) - self.pages["custom"] = ttk.Frame(notebook) - notebook.add(self.pages["randomizer"], text='Randomize') - notebook.add(self.pages["adjust"], text='Adjust') - notebook.add(self.pages["custom"], text='Custom') - notebook.pack() + self.notebook = ttk.Notebook(self) + self.pages["randomizer"] = ttk.Frame(self.notebook) + self.pages["adjust"] = ttk.Frame(self.notebook) + self.pages["custom"] = ttk.Frame(self.notebook) + self.notebook.add(self.pages["randomizer"], text='Randomize') + self.notebook.add(self.pages["adjust"], text='Adjust') + self.notebook.add(self.pages["custom"], text='Custom') + self.notebook.pack() # randomizer controls @@ -76,38 +76,38 @@ def guiMain(args=None): # Multiworld: Multiworld settings # Game Options: Cosmetic settings that don't affect logic/placement # Generation Setup: Primarily one&done settings - self.randomizerNotebook = ttk.Notebook(self.pages["randomizer"]) + self.pages["randomizer"].notebook = ttk.Notebook(self.pages["randomizer"]) # Item Randomizer - self.itemWindow = item_page(self.randomizerNotebook) - self.randomizerNotebook.add(self.itemWindow, text="Items") + self.pages["randomizer"].pages["item"] = item_page(self.pages["randomizer"].notebook) + self.pages["randomizer"].notebook.add(self.pages["randomizer"].pages["item"], text="Items") # Entrance Randomizer - self.entrandoWindow = entrando_page(self.randomizerNotebook) - self.randomizerNotebook.add(self.entrandoWindow, text="Entrances") + self.pages["randomizer"].pages["entrance"] = entrando_page(self.pages["randomizer"].notebook) + self.pages["randomizer"].notebook.add(self.pages["randomizer"].pages["entrance"], text="Entrances") # Enemizer - self.enemizerWindow,self.settings = enemizer_page(self.randomizerNotebook,self.settings) - self.randomizerNotebook.add(self.enemizerWindow, text="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.dungeonRandoWindow = dungeon_page(self.randomizerNotebook) - self.randomizerNotebook.add(self.dungeonRandoWindow, text="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.multiworldWindow,self.settings = multiworld_page(self.randomizerNotebook,self.settings) - self.randomizerNotebook.add(self.multiworldWindow, text="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") # Game Options - self.gameOptionsWindow = gameoptions_page(self, self.randomizerNotebook) - self.randomizerNotebook.add(self.gameOptionsWindow, text="Game Options") + self.pages["randomizer"].pages["gameoptions"] = gameoptions_page(self, self.pages["randomizer"].notebook) + self.pages["randomizer"].notebook.add(self.pages["randomizer"].pages["gameoptions"], text="Game Options") # Generation Setup - self.generationSetupWindow,self.settings = generation_page(self.randomizerNotebook,self.settings) - self.randomizerNotebook.add(self.generationSetupWindow, text="Generation Setup") + self.pages["randomizer"].pages["generation"],self.settings = generation_page(self.pages["randomizer"].notebook,self.settings) + self.pages["randomizer"].notebook.add(self.pages["randomizer"].pages["generation"], text="Generation Setup") # add randomizer notebook to main window - self.randomizerNotebook.pack() + self.pages["randomizer"].notebook.pack() # bottom of window: Open Output Directory, Open Documentation (if exists) self.frames["bottom"] = bottom_frame(self, self, None) diff --git a/gui/bottom.py b/gui/bottom.py index d3e097f6..49107c2d 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -92,19 +92,19 @@ def create_guiargs(parent): guiargs.names = parent.multiworldWindow.namesVar.get() guiargs.seed = int(parent.frames["bottom"].seedVar.get()) if parent.frames["bottom"].seedVar.get() else None guiargs.count = int(parent.frames["bottom"].bottomWidgets["generationcount"].storageVar.get()) if parent.frames["bottom"].bottomWidgets["generationcount"].storageVar.get() != '1' else None - guiargs.mode = parent.itemWindow.itemWidgets["worldstate"].storageVar.get() - guiargs.logic = parent.itemWindow.itemWidgets["logiclevel"].storageVar.get() + guiargs.mode = parent.pages["randomizer"]["item"].itemWidgets["worldstate"].storageVar.get() + guiargs.logic = parent.pages["randomizer"]["item"].itemWidgets["logiclevel"].storageVar.get() - guiargs.goal = parent.itemWindow.itemWidgets["goal"].storageVar.get() - guiargs.crystals_gt = parent.itemWindow.itemWidgets["crystals_gt"].storageVar.get() - guiargs.crystals_ganon = parent.itemWindow.itemWidgets["crystals_ganon"].storageVar.get() - guiargs.swords = parent.itemWindow.itemWidgets["weapons"].storageVar.get() - guiargs.difficulty = parent.itemWindow.itemWidgets["itempool"].storageVar.get() - guiargs.item_functionality = parent.itemWindow.itemWidgets["itemfunction"].storageVar.get() - guiargs.timer = parent.itemWindow.itemWidgets["timer"].storageVar.get() - guiargs.progressive = parent.itemWindow.itemWidgets["progressives"].storageVar.get() - guiargs.accessibility = parent.itemWindow.itemWidgets["accessibility"].storageVar.get() - guiargs.algorithm = parent.itemWindow.itemWidgets["sortingalgo"].storageVar.get() + guiargs.goal = parent.pages["randomizer"]["item"].itemWidgets["goal"].storageVar.get() + guiargs.crystals_gt = parent.pages["randomizer"]["item"].itemWidgets["crystals_gt"].storageVar.get() + guiargs.crystals_ganon = parent.pages["randomizer"]["item"].itemWidgets["crystals_ganon"].storageVar.get() + guiargs.swords = parent.pages["randomizer"]["item"].itemWidgets["weapons"].storageVar.get() + guiargs.difficulty = parent.pages["randomizer"]["item"].itemWidgets["itempool"].storageVar.get() + guiargs.item_functionality = parent.pages["randomizer"]["item"].itemWidgets["itemfunction"].storageVar.get() + guiargs.timer = parent.pages["randomizer"]["item"].itemWidgets["timer"].storageVar.get() + guiargs.progressive = parent.pages["randomizer"]["item"].itemWidgets["progressives"].storageVar.get() + guiargs.accessibility = parent.pages["randomizer"]["item"].itemWidgets["accessibility"].storageVar.get() + guiargs.algorithm = parent.pages["randomizer"]["item"].itemWidgets["sortingalgo"].storageVar.get() guiargs.shuffle = parent.entrandoWindow.entrandoWidgets["entranceshuffle"].storageVar.get() guiargs.door_shuffle = parent.dungeonRandoWindow.dungeonWidgets["dungeondoorshuffle"].storageVar.get() guiargs.experimental = parent.dungeonRandoWindow.dungeonWidgets["experimental"].storageVar.get() @@ -119,7 +119,7 @@ def create_guiargs(parent): guiargs.compassshuffle = bool(parent.dungeonRandoWindow.dungeonWidgets["compassshuffle"].storageVar.get()) guiargs.keyshuffle = bool(parent.dungeonRandoWindow.dungeonWidgets["smallkeyshuffle"].storageVar.get()) guiargs.bigkeyshuffle = bool(parent.dungeonRandoWindow.dungeonWidgets["bigkeyshuffle"].storageVar.get()) - guiargs.retro = bool(parent.itemWindow.itemWidgets["retro"].storageVar.get()) + guiargs.retro = bool(parent.pages["randomizer"]["item"].itemWidgets["retro"].storageVar.get()) guiargs.quickswap = bool(parent.gameOptionsWindow.gameOptionsWidgets["quickswap"].storageVar.get()) guiargs.disablemusic = bool(parent.gameOptionsWindow.gameOptionsWidgets["nobgm"].storageVar.get()) guiargs.ow_palettes = parent.gameOptionsWindow.gameOptionsWidgets["owpalettes"].storageVar.get() diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index b0974e86..1abe8361 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -15,7 +15,7 @@ def loadcliargs(gui, args): gui.dungeonRandoWindow.dungeonWidgets["compassshuffle"].storageVar.set(args.compassshuffle) gui.dungeonRandoWindow.dungeonWidgets["smallkeyshuffle"].storageVar.set(args.keyshuffle) gui.dungeonRandoWindow.dungeonWidgets["bigkeyshuffle"].storageVar.set(args.bigkeyshuffle) - gui.itemWindow.itemWidgets["retro"].storageVar.set(args.retro) + gui.pages["randomizer"]["item"].itemWidgets["retro"].storageVar.set(args.retro) gui.entrandoWindow.entrandoWidgets["openpyramid"].storageVar.set(args.openpyramid) gui.gameOptionsWindow.gameOptionsWidgets["quickswap"].storageVar.set(int(args.quickswap)) gui.gameOptionsWindow.gameOptionsWidgets["nobgm"].storageVar.set(int(args.disablemusic)) @@ -25,24 +25,24 @@ def loadcliargs(gui, args): gui.frames["bottom"].bottomWidgets["generationcount"].storageVar.set(str(args.count)) if args.seed: gui.frames["bottom"].seedVar.set(str(args.seed)) - gui.itemWindow.itemWidgets["worldstate"].storageVar.set(args.mode) - gui.itemWindow.itemWidgets["weapons"].storageVar.set(args.swords) - gui.itemWindow.itemWidgets["itempool"].storageVar.set(args.difficulty) - gui.itemWindow.itemWidgets["itemfunction"].storageVar.set(args.item_functionality) - gui.itemWindow.itemWidgets["timer"].storageVar.set(args.timer) - gui.itemWindow.itemWidgets["progressives"].storageVar.set(args.progressive) - gui.itemWindow.itemWidgets["accessibility"].storageVar.set(args.accessibility) - gui.itemWindow.itemWidgets["goal"].storageVar.set(args.goal) - gui.itemWindow.itemWidgets["crystals_gt"].storageVar.set(args.crystals_gt) - gui.itemWindow.itemWidgets["crystals_ganon"].storageVar.set(args.crystals_ganon) - gui.itemWindow.itemWidgets["sortingalgo"].storageVar.set(args.algorithm) + gui.pages["randomizer"]["item"].itemWidgets["worldstate"].storageVar.set(args.mode) + gui.pages["randomizer"]["item"].itemWidgets["weapons"].storageVar.set(args.swords) + gui.pages["randomizer"]["item"].itemWidgets["itempool"].storageVar.set(args.difficulty) + gui.pages["randomizer"]["item"].itemWidgets["itemfunction"].storageVar.set(args.item_functionality) + gui.pages["randomizer"]["item"].itemWidgets["timer"].storageVar.set(args.timer) + gui.pages["randomizer"]["item"].itemWidgets["progressives"].storageVar.set(args.progressive) + gui.pages["randomizer"]["item"].itemWidgets["accessibility"].storageVar.set(args.accessibility) + gui.pages["randomizer"]["item"].itemWidgets["goal"].storageVar.set(args.goal) + gui.pages["randomizer"]["item"].itemWidgets["crystals_gt"].storageVar.set(args.crystals_gt) + gui.pages["randomizer"]["item"].itemWidgets["crystals_ganon"].storageVar.set(args.crystals_ganon) + gui.pages["randomizer"]["item"].itemWidgets["sortingalgo"].storageVar.set(args.algorithm) gui.entrandoWindow.entrandoWidgets["entranceshuffle"].storageVar.set(args.shuffle) gui.dungeonRandoWindow.dungeonWidgets["dungeondoorshuffle"].storageVar.set(args.door_shuffle) gui.dungeonRandoWindow.dungeonWidgets["experimental"].storageVar.set(args.experimental) gui.gameOptionsWindow.gameOptionsWidgets["heartcolor"].storageVar.set(args.heartcolor) gui.gameOptionsWindow.gameOptionsWidgets["heartbeep"].storageVar.set(args.heartbeep) gui.gameOptionsWindow.gameOptionsWidgets["menuspeed"].storageVar.set(args.fastmenu) - gui.itemWindow.itemWidgets["logiclevel"].storageVar.set(args.logic) + gui.pages["randomizer"]["item"].itemWidgets["logiclevel"].storageVar.set(args.logic) gui.generationSetupWindow.romVar.set(args.rom) gui.entrandoWindow.entrandoWidgets["shuffleganon"].storageVar.set(args.shuffleganon) gui.gameOptionsWindow.gameOptionsWidgets["hints"].storageVar.set(args.hints) From 8a6d53a8ae4a0cd30486df17c6337ec57f8da15d Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 01:54:20 -0800 Subject: [PATCH 036/117] Arrayify Entrance Rando --- gui/bottom.py | 6 +++--- gui/loadcliargs.py | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/gui/bottom.py b/gui/bottom.py index 49107c2d..66b430b0 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -105,7 +105,7 @@ def create_guiargs(parent): guiargs.progressive = parent.pages["randomizer"]["item"].itemWidgets["progressives"].storageVar.get() guiargs.accessibility = parent.pages["randomizer"]["item"].itemWidgets["accessibility"].storageVar.get() guiargs.algorithm = parent.pages["randomizer"]["item"].itemWidgets["sortingalgo"].storageVar.get() - guiargs.shuffle = parent.entrandoWindow.entrandoWidgets["entranceshuffle"].storageVar.get() + guiargs.shuffle = parent.pages["randomizer"].pages["entrance"].entrandoWidgets["entranceshuffle"].storageVar.get() guiargs.door_shuffle = parent.dungeonRandoWindow.dungeonWidgets["dungeondoorshuffle"].storageVar.get() guiargs.experimental = parent.dungeonRandoWindow.dungeonWidgets["experimental"].storageVar.get() guiargs.heartbeep = parent.gameOptionsWindow.gameOptionsWidgets["heartbeep"].storageVar.get() @@ -114,7 +114,7 @@ def create_guiargs(parent): guiargs.create_spoiler = bool(parent.generationSetupWindow.generationWidgets["spoiler"].storageVar.get()) guiargs.skip_playthrough = not bool(parent.generationSetupWindow.generationWidgets["spoiler"].storageVar.get()) guiargs.suppress_rom = bool(parent.generationSetupWindow.generationWidgets["suppressrom"].storageVar.get()) - guiargs.openpyramid = bool(parent.entrandoWindow.entrandoWidgets["openpyramid"].storageVar.get()) + guiargs.openpyramid = bool(parent.pages["randomizer"].pages["entrance"].entrandoWidgets["openpyramid"].storageVar.get()) guiargs.mapshuffle = bool(parent.dungeonRandoWindow.dungeonWidgets["mapshuffle"].storageVar.get()) guiargs.compassshuffle = bool(parent.dungeonRandoWindow.dungeonWidgets["compassshuffle"].storageVar.get()) guiargs.keyshuffle = bool(parent.dungeonRandoWindow.dungeonWidgets["smallkeyshuffle"].storageVar.get()) @@ -124,7 +124,7 @@ def create_guiargs(parent): guiargs.disablemusic = bool(parent.gameOptionsWindow.gameOptionsWidgets["nobgm"].storageVar.get()) guiargs.ow_palettes = parent.gameOptionsWindow.gameOptionsWidgets["owpalettes"].storageVar.get() guiargs.uw_palettes = parent.gameOptionsWindow.gameOptionsWidgets["uwpalettes"].storageVar.get() - guiargs.shuffleganon = bool(parent.entrandoWindow.entrandoWidgets["shuffleganon"].storageVar.get()) + guiargs.shuffleganon = bool(parent.pages["randomizer"].pages["entrance"].entrandoWidgets["shuffleganon"].storageVar.get()) guiargs.hints = bool(parent.gameOptionsWindow.gameOptionsWidgets["hints"].storageVar.get()) guiargs.enemizercli = parent.enemizerWindow.enemizerCLIpathVar.get() guiargs.shufflebosses = parent.enemizerWindow.enemizerWidgets["bossshuffle"].storageVar.get() diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index 1abe8361..44444379 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -16,7 +16,7 @@ def loadcliargs(gui, args): gui.dungeonRandoWindow.dungeonWidgets["smallkeyshuffle"].storageVar.set(args.keyshuffle) gui.dungeonRandoWindow.dungeonWidgets["bigkeyshuffle"].storageVar.set(args.bigkeyshuffle) gui.pages["randomizer"]["item"].itemWidgets["retro"].storageVar.set(args.retro) - gui.entrandoWindow.entrandoWidgets["openpyramid"].storageVar.set(args.openpyramid) + gui.pages["randomizer"].pages["entrance"].entrandoWidgets["openpyramid"].storageVar.set(args.openpyramid) gui.gameOptionsWindow.gameOptionsWidgets["quickswap"].storageVar.set(int(args.quickswap)) gui.gameOptionsWindow.gameOptionsWidgets["nobgm"].storageVar.set(int(args.disablemusic)) if args.multi: @@ -36,7 +36,7 @@ def loadcliargs(gui, args): gui.pages["randomizer"]["item"].itemWidgets["crystals_gt"].storageVar.set(args.crystals_gt) gui.pages["randomizer"]["item"].itemWidgets["crystals_ganon"].storageVar.set(args.crystals_ganon) gui.pages["randomizer"]["item"].itemWidgets["sortingalgo"].storageVar.set(args.algorithm) - gui.entrandoWindow.entrandoWidgets["entranceshuffle"].storageVar.set(args.shuffle) + gui.pages["randomizer"].pages["entrance"].entrandoWidgets["entranceshuffle"].storageVar.set(args.shuffle) gui.dungeonRandoWindow.dungeonWidgets["dungeondoorshuffle"].storageVar.set(args.door_shuffle) gui.dungeonRandoWindow.dungeonWidgets["experimental"].storageVar.set(args.experimental) gui.gameOptionsWindow.gameOptionsWidgets["heartcolor"].storageVar.set(args.heartcolor) @@ -44,7 +44,7 @@ def loadcliargs(gui, args): gui.gameOptionsWindow.gameOptionsWidgets["menuspeed"].storageVar.set(args.fastmenu) gui.pages["randomizer"]["item"].itemWidgets["logiclevel"].storageVar.set(args.logic) gui.generationSetupWindow.romVar.set(args.rom) - gui.entrandoWindow.entrandoWidgets["shuffleganon"].storageVar.set(args.shuffleganon) + gui.pages["randomizer"].pages["entrance"].entrandoWidgets["shuffleganon"].storageVar.set(args.shuffleganon) gui.gameOptionsWindow.gameOptionsWidgets["hints"].storageVar.set(args.hints) gui.enemizerWindow.enemizerCLIpathVar.set(args.enemizercli) gui.enemizerWindow.enemizerWidgets["potshuffle"].storageVar.set(args.shufflepots) From a3e80b94818a86c16397bc74d77628c142ae6c1e Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 01:55:00 -0800 Subject: [PATCH 037/117] Arrayify Enemizer --- gui/bottom.py | 12 ++++++------ gui/loadcliargs.py | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/gui/bottom.py b/gui/bottom.py index 66b430b0..49f7622e 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -126,12 +126,12 @@ def create_guiargs(parent): guiargs.uw_palettes = parent.gameOptionsWindow.gameOptionsWidgets["uwpalettes"].storageVar.get() guiargs.shuffleganon = bool(parent.pages["randomizer"].pages["entrance"].entrandoWidgets["shuffleganon"].storageVar.get()) guiargs.hints = bool(parent.gameOptionsWindow.gameOptionsWidgets["hints"].storageVar.get()) - guiargs.enemizercli = parent.enemizerWindow.enemizerCLIpathVar.get() - guiargs.shufflebosses = parent.enemizerWindow.enemizerWidgets["bossshuffle"].storageVar.get() - guiargs.shuffleenemies = parent.enemizerWindow.enemizerWidgets["enemyshuffle"].storageVar.get() - guiargs.enemy_health = parent.enemizerWindow.enemizerWidgets["enemyhealth"].storageVar.get() - guiargs.enemy_damage = parent.enemizerWindow.enemizerWidgets["enemydamage"].storageVar.get() - guiargs.shufflepots = bool(parent.enemizerWindow.enemizerWidgets["potshuffle"].storageVar.get()) + guiargs.enemizercli = parent.pages["randomizer"].pages["enemizer"].enemizerCLIpathVar.get() + guiargs.shufflebosses = parent.pages["randomizer"].pages["enemizer"].enemizerWidgets["bossshuffle"].storageVar.get() + guiargs.shuffleenemies = parent.pages["randomizer"].pages["enemizer"].enemizerWidgets["enemyshuffle"].storageVar.get() + guiargs.enemy_health = parent.pages["randomizer"].pages["enemizer"].enemizerWidgets["enemyhealth"].storageVar.get() + guiargs.enemy_damage = parent.pages["randomizer"].pages["enemizer"].enemizerWidgets["enemydamage"].storageVar.get() + guiargs.shufflepots = bool(parent.pages["randomizer"].pages["enemizer"].enemizerWidgets["potshuffle"].storageVar.get()) guiargs.custom = bool(parent.generationSetupWindow.generationWidgets["usecustompool"].storageVar.get()) guiargs.customitemarray = [int(parent.customContent.customWidgets["bow"].storageVar.get()), int(parent.customContent.customWidgets["silversupgrade"].storageVar.get()), int(parent.customContent.customWidgets["boomerang"].storageVar.get()), int(parent.customContent.customWidgets["redmerang"].storageVar.get()), int(parent.customContent.customWidgets["hookshot"].storageVar.get()), int(parent.customContent.customWidgets["mushroom"].storageVar.get()), int(parent.customContent.customWidgets["powder"].storageVar.get()), int(parent.customContent.customWidgets["firerod"].storageVar.get()), int(parent.customContent.customWidgets["icerod"].storageVar.get()), int(parent.customContent.customWidgets["bombos"].storageVar.get()), int(parent.customContent.customWidgets["ether"].storageVar.get()), int(parent.customContent.customWidgets["quake"].storageVar.get()), int(parent.customContent.customWidgets["lamp"].storageVar.get()), int(parent.customContent.customWidgets["hammer"].storageVar.get()), int(parent.customContent.customWidgets["shovel"].storageVar.get()), int(parent.customContent.customWidgets["flute"].storageVar.get()), int(parent.customContent.customWidgets["bugnet"].storageVar.get()), diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index 44444379..02fed07e 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -46,12 +46,12 @@ def loadcliargs(gui, args): gui.generationSetupWindow.romVar.set(args.rom) gui.pages["randomizer"].pages["entrance"].entrandoWidgets["shuffleganon"].storageVar.set(args.shuffleganon) gui.gameOptionsWindow.gameOptionsWidgets["hints"].storageVar.set(args.hints) - gui.enemizerWindow.enemizerCLIpathVar.set(args.enemizercli) - gui.enemizerWindow.enemizerWidgets["potshuffle"].storageVar.set(args.shufflepots) - gui.enemizerWindow.enemizerWidgets["enemyshuffle"].storageVar.set(args.shuffleenemies) - gui.enemizerWindow.enemizerWidgets["bossshuffle"].storageVar.set(args.shufflebosses) - gui.enemizerWindow.enemizerWidgets["enemydamage"].storageVar.set(args.enemy_damage) - gui.enemizerWindow.enemizerWidgets["enemyhealth"].storageVar.set(args.enemy_health) + gui.pages["randomizer"].pages["enemizer"].enemizerCLIpathVar.set(args.enemizercli) + gui.pages["randomizer"].pages["enemizer"].enemizerWidgets["potshuffle"].storageVar.set(args.shufflepots) + gui.pages["randomizer"].pages["enemizer"].enemizerWidgets["enemyshuffle"].storageVar.set(args.shuffleenemies) + gui.pages["randomizer"].pages["enemizer"].enemizerWidgets["bossshuffle"].storageVar.set(args.shufflebosses) + gui.pages["randomizer"].pages["enemizer"].enemizerWidgets["enemydamage"].storageVar.set(args.enemy_damage) + gui.pages["randomizer"].pages["enemizer"].enemizerWidgets["enemyhealth"].storageVar.set(args.enemy_health) gui.gameOptionsWindow.gameOptionsWidgets["owpalettes"].storageVar.set(args.ow_palettes) gui.gameOptionsWindow.gameOptionsWidgets["uwpalettes"].storageVar.set(args.uw_palettes) gui.outputPath.set(args.outputpath) From 19534a6e2a97907f8c8bda411c33493c29011dcd Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 01:56:43 -0800 Subject: [PATCH 038/117] Arrayify Dungeon Rando Fix item rando references --- gui/bottom.py | 38 +++++++++++++++++++------------------- gui/loadcliargs.py | 38 +++++++++++++++++++------------------- 2 files changed, 38 insertions(+), 38 deletions(-) diff --git a/gui/bottom.py b/gui/bottom.py index 49f7622e..54681adf 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -92,22 +92,22 @@ def create_guiargs(parent): guiargs.names = parent.multiworldWindow.namesVar.get() guiargs.seed = int(parent.frames["bottom"].seedVar.get()) if parent.frames["bottom"].seedVar.get() else None guiargs.count = int(parent.frames["bottom"].bottomWidgets["generationcount"].storageVar.get()) if parent.frames["bottom"].bottomWidgets["generationcount"].storageVar.get() != '1' else None - guiargs.mode = parent.pages["randomizer"]["item"].itemWidgets["worldstate"].storageVar.get() - guiargs.logic = parent.pages["randomizer"]["item"].itemWidgets["logiclevel"].storageVar.get() + guiargs.mode = parent.pages["randomizer"].pages["item"].itemWidgets["worldstate"].storageVar.get() + guiargs.logic = parent.pages["randomizer"].pages["item"].itemWidgets["logiclevel"].storageVar.get() - guiargs.goal = parent.pages["randomizer"]["item"].itemWidgets["goal"].storageVar.get() - guiargs.crystals_gt = parent.pages["randomizer"]["item"].itemWidgets["crystals_gt"].storageVar.get() - guiargs.crystals_ganon = parent.pages["randomizer"]["item"].itemWidgets["crystals_ganon"].storageVar.get() - guiargs.swords = parent.pages["randomizer"]["item"].itemWidgets["weapons"].storageVar.get() - guiargs.difficulty = parent.pages["randomizer"]["item"].itemWidgets["itempool"].storageVar.get() - guiargs.item_functionality = parent.pages["randomizer"]["item"].itemWidgets["itemfunction"].storageVar.get() - guiargs.timer = parent.pages["randomizer"]["item"].itemWidgets["timer"].storageVar.get() - guiargs.progressive = parent.pages["randomizer"]["item"].itemWidgets["progressives"].storageVar.get() - guiargs.accessibility = parent.pages["randomizer"]["item"].itemWidgets["accessibility"].storageVar.get() - guiargs.algorithm = parent.pages["randomizer"]["item"].itemWidgets["sortingalgo"].storageVar.get() + guiargs.goal = parent.pages["randomizer"].pages["item"].itemWidgets["goal"].storageVar.get() + guiargs.crystals_gt = parent.pages["randomizer"].pages["item"].itemWidgets["crystals_gt"].storageVar.get() + guiargs.crystals_ganon = parent.pages["randomizer"].pages["item"].itemWidgets["crystals_ganon"].storageVar.get() + guiargs.swords = parent.pages["randomizer"].pages["item"].itemWidgets["weapons"].storageVar.get() + guiargs.difficulty = parent.pages["randomizer"].pages["item"].itemWidgets["itempool"].storageVar.get() + guiargs.item_functionality = parent.pages["randomizer"].pages["item"].itemWidgets["itemfunction"].storageVar.get() + guiargs.timer = parent.pages["randomizer"].pages["item"].itemWidgets["timer"].storageVar.get() + guiargs.progressive = parent.pages["randomizer"].pages["item"].itemWidgets["progressives"].storageVar.get() + guiargs.accessibility = parent.pages["randomizer"].pages["item"].itemWidgets["accessibility"].storageVar.get() + guiargs.algorithm = parent.pages["randomizer"].pages["item"].itemWidgets["sortingalgo"].storageVar.get() guiargs.shuffle = parent.pages["randomizer"].pages["entrance"].entrandoWidgets["entranceshuffle"].storageVar.get() - guiargs.door_shuffle = parent.dungeonRandoWindow.dungeonWidgets["dungeondoorshuffle"].storageVar.get() - guiargs.experimental = parent.dungeonRandoWindow.dungeonWidgets["experimental"].storageVar.get() + guiargs.door_shuffle = parent.pages["randomizer"].pages["dungeon"].dungeonWidgets["dungeondoorshuffle"].storageVar.get() + guiargs.experimental = parent.pages["randomizer"].pages["dungeon"].dungeonWidgets["experimental"].storageVar.get() guiargs.heartbeep = parent.gameOptionsWindow.gameOptionsWidgets["heartbeep"].storageVar.get() guiargs.heartcolor = parent.gameOptionsWindow.gameOptionsWidgets["heartcolor"].storageVar.get() guiargs.fastmenu = parent.gameOptionsWindow.gameOptionsWidgets["menuspeed"].storageVar.get() @@ -115,11 +115,11 @@ def create_guiargs(parent): guiargs.skip_playthrough = not bool(parent.generationSetupWindow.generationWidgets["spoiler"].storageVar.get()) guiargs.suppress_rom = bool(parent.generationSetupWindow.generationWidgets["suppressrom"].storageVar.get()) guiargs.openpyramid = bool(parent.pages["randomizer"].pages["entrance"].entrandoWidgets["openpyramid"].storageVar.get()) - guiargs.mapshuffle = bool(parent.dungeonRandoWindow.dungeonWidgets["mapshuffle"].storageVar.get()) - guiargs.compassshuffle = bool(parent.dungeonRandoWindow.dungeonWidgets["compassshuffle"].storageVar.get()) - guiargs.keyshuffle = bool(parent.dungeonRandoWindow.dungeonWidgets["smallkeyshuffle"].storageVar.get()) - guiargs.bigkeyshuffle = bool(parent.dungeonRandoWindow.dungeonWidgets["bigkeyshuffle"].storageVar.get()) - guiargs.retro = bool(parent.pages["randomizer"]["item"].itemWidgets["retro"].storageVar.get()) + guiargs.mapshuffle = bool(parent.pages["randomizer"].pages["dungeon"].dungeonWidgets["mapshuffle"].storageVar.get()) + guiargs.compassshuffle = bool(parent.pages["randomizer"].pages["dungeon"].dungeonWidgets["compassshuffle"].storageVar.get()) + guiargs.keyshuffle = bool(parent.pages["randomizer"].pages["dungeon"].dungeonWidgets["smallkeyshuffle"].storageVar.get()) + guiargs.bigkeyshuffle = bool(parent.pages["randomizer"].pages["dungeon"].dungeonWidgets["bigkeyshuffle"].storageVar.get()) + guiargs.retro = bool(parent.pages["randomizer"].pages["item"].itemWidgets["retro"].storageVar.get()) guiargs.quickswap = bool(parent.gameOptionsWindow.gameOptionsWidgets["quickswap"].storageVar.get()) guiargs.disablemusic = bool(parent.gameOptionsWindow.gameOptionsWidgets["nobgm"].storageVar.get()) guiargs.ow_palettes = parent.gameOptionsWindow.gameOptionsWidgets["owpalettes"].storageVar.get() diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index 02fed07e..fa65149c 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -11,11 +11,11 @@ def loadcliargs(gui, args): # load values from commandline args gui.generationSetupWindow.generationWidgets["spoiler"].storageVar.set(int(args.create_spoiler)) gui.generationSetupWindow.generationWidgets["suppressrom"].storageVar.set(int(args.suppress_rom)) - gui.dungeonRandoWindow.dungeonWidgets["mapshuffle"].storageVar.set(args.mapshuffle) - gui.dungeonRandoWindow.dungeonWidgets["compassshuffle"].storageVar.set(args.compassshuffle) - gui.dungeonRandoWindow.dungeonWidgets["smallkeyshuffle"].storageVar.set(args.keyshuffle) - gui.dungeonRandoWindow.dungeonWidgets["bigkeyshuffle"].storageVar.set(args.bigkeyshuffle) - gui.pages["randomizer"]["item"].itemWidgets["retro"].storageVar.set(args.retro) + gui.pages["randomizer"].pages["dungeon"].dungeonWidgets["mapshuffle"].storageVar.set(args.mapshuffle) + gui.pages["randomizer"].pages["dungeon"].dungeonWidgets["compassshuffle"].storageVar.set(args.compassshuffle) + gui.pages["randomizer"].pages["dungeon"].dungeonWidgets["smallkeyshuffle"].storageVar.set(args.keyshuffle) + gui.pages["randomizer"].pages["dungeon"].dungeonWidgets["bigkeyshuffle"].storageVar.set(args.bigkeyshuffle) + gui.pages["randomizer"].pages["item"].itemWidgets["retro"].storageVar.set(args.retro) gui.pages["randomizer"].pages["entrance"].entrandoWidgets["openpyramid"].storageVar.set(args.openpyramid) gui.gameOptionsWindow.gameOptionsWidgets["quickswap"].storageVar.set(int(args.quickswap)) gui.gameOptionsWindow.gameOptionsWidgets["nobgm"].storageVar.set(int(args.disablemusic)) @@ -25,24 +25,24 @@ def loadcliargs(gui, args): gui.frames["bottom"].bottomWidgets["generationcount"].storageVar.set(str(args.count)) if args.seed: gui.frames["bottom"].seedVar.set(str(args.seed)) - gui.pages["randomizer"]["item"].itemWidgets["worldstate"].storageVar.set(args.mode) - gui.pages["randomizer"]["item"].itemWidgets["weapons"].storageVar.set(args.swords) - gui.pages["randomizer"]["item"].itemWidgets["itempool"].storageVar.set(args.difficulty) - gui.pages["randomizer"]["item"].itemWidgets["itemfunction"].storageVar.set(args.item_functionality) - gui.pages["randomizer"]["item"].itemWidgets["timer"].storageVar.set(args.timer) - gui.pages["randomizer"]["item"].itemWidgets["progressives"].storageVar.set(args.progressive) - gui.pages["randomizer"]["item"].itemWidgets["accessibility"].storageVar.set(args.accessibility) - gui.pages["randomizer"]["item"].itemWidgets["goal"].storageVar.set(args.goal) - gui.pages["randomizer"]["item"].itemWidgets["crystals_gt"].storageVar.set(args.crystals_gt) - gui.pages["randomizer"]["item"].itemWidgets["crystals_ganon"].storageVar.set(args.crystals_ganon) - gui.pages["randomizer"]["item"].itemWidgets["sortingalgo"].storageVar.set(args.algorithm) + gui.pages["randomizer"].pages["item"].itemWidgets["worldstate"].storageVar.set(args.mode) + gui.pages["randomizer"].pages["item"].itemWidgets["weapons"].storageVar.set(args.swords) + gui.pages["randomizer"].pages["item"].itemWidgets["itempool"].storageVar.set(args.difficulty) + gui.pages["randomizer"].pages["item"].itemWidgets["itemfunction"].storageVar.set(args.item_functionality) + gui.pages["randomizer"].pages["item"].itemWidgets["timer"].storageVar.set(args.timer) + gui.pages["randomizer"].pages["item"].itemWidgets["progressives"].storageVar.set(args.progressive) + gui.pages["randomizer"].pages["item"].itemWidgets["accessibility"].storageVar.set(args.accessibility) + gui.pages["randomizer"].pages["item"].itemWidgets["goal"].storageVar.set(args.goal) + gui.pages["randomizer"].pages["item"].itemWidgets["crystals_gt"].storageVar.set(args.crystals_gt) + gui.pages["randomizer"].pages["item"].itemWidgets["crystals_ganon"].storageVar.set(args.crystals_ganon) + gui.pages["randomizer"].pages["item"].itemWidgets["sortingalgo"].storageVar.set(args.algorithm) gui.pages["randomizer"].pages["entrance"].entrandoWidgets["entranceshuffle"].storageVar.set(args.shuffle) - gui.dungeonRandoWindow.dungeonWidgets["dungeondoorshuffle"].storageVar.set(args.door_shuffle) - gui.dungeonRandoWindow.dungeonWidgets["experimental"].storageVar.set(args.experimental) + gui.pages["randomizer"].pages["dungeon"].dungeonWidgets["dungeondoorshuffle"].storageVar.set(args.door_shuffle) + gui.pages["randomizer"].pages["dungeon"].dungeonWidgets["experimental"].storageVar.set(args.experimental) gui.gameOptionsWindow.gameOptionsWidgets["heartcolor"].storageVar.set(args.heartcolor) gui.gameOptionsWindow.gameOptionsWidgets["heartbeep"].storageVar.set(args.heartbeep) gui.gameOptionsWindow.gameOptionsWidgets["menuspeed"].storageVar.set(args.fastmenu) - gui.pages["randomizer"]["item"].itemWidgets["logiclevel"].storageVar.set(args.logic) + gui.pages["randomizer"].pages["item"].itemWidgets["logiclevel"].storageVar.set(args.logic) gui.generationSetupWindow.romVar.set(args.rom) gui.pages["randomizer"].pages["entrance"].entrandoWidgets["shuffleganon"].storageVar.set(args.shuffleganon) gui.gameOptionsWindow.gameOptionsWidgets["hints"].storageVar.set(args.hints) From 50526c1f5b85142938ff12f631b746a848fcbc4b Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 01:57:19 -0800 Subject: [PATCH 039/117] Arrayify Multiworld --- gui/bottom.py | 4 ++-- gui/loadcliargs.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/gui/bottom.py b/gui/bottom.py index 54681adf..c3884dd9 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -88,8 +88,8 @@ def bottom_frame(self, parent, args=None): def create_guiargs(parent): guiargs = Namespace() - guiargs.multi = int(parent.multiworldWindow.multiworldWidgets["worlds"].storageVar.get()) - guiargs.names = parent.multiworldWindow.namesVar.get() + guiargs.multi = int(parent.pages["randomizer"].pages["multiworld"].multiworldWidgets["worlds"].storageVar.get()) + guiargs.names = parent.pages["randomizer"].pages["multiworld"].namesVar.get() guiargs.seed = int(parent.frames["bottom"].seedVar.get()) if parent.frames["bottom"].seedVar.get() else None guiargs.count = int(parent.frames["bottom"].bottomWidgets["generationcount"].storageVar.get()) if parent.frames["bottom"].bottomWidgets["generationcount"].storageVar.get() != '1' else None guiargs.mode = parent.pages["randomizer"].pages["item"].itemWidgets["worldstate"].storageVar.get() diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index fa65149c..5d4dd508 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -20,7 +20,7 @@ def loadcliargs(gui, args): gui.gameOptionsWindow.gameOptionsWidgets["quickswap"].storageVar.set(int(args.quickswap)) gui.gameOptionsWindow.gameOptionsWidgets["nobgm"].storageVar.set(int(args.disablemusic)) if args.multi: - gui.multiworldWindow.multiworldWidgets["worlds"].storageVar.set(str(args.multi)) + gui.pages["randomizer"].pages["multiworld"].multiworldWidgets["worlds"].storageVar.set(str(args.multi)) if args.count: gui.frames["bottom"].bottomWidgets["generationcount"].storageVar.set(str(args.count)) if args.seed: From 2aef6b438c3dc8de61d3316d531aa9c2426a98b9 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 01:58:58 -0800 Subject: [PATCH 040/117] Arrayify Game Options Eventually split from Adjust --- gui/adjust/overview.py | 14 +++++++------- gui/bottom.py | 18 +++++++++--------- gui/loadcliargs.py | 20 ++++++++++---------- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/gui/adjust/overview.py b/gui/adjust/overview.py index 18669b7c..230ffbcd 100644 --- a/gui/adjust/overview.py +++ b/gui/adjust/overview.py @@ -20,7 +20,7 @@ def adjust_page(top, parent, settings): "checkbox", self, "Disable Music & MSU-1", - top.gameOptionsWindow.gameOptionsWidgets["nobgm"].storageVar + top.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["nobgm"].storageVar ) self.adjustWidgets[key].pack(anchor=W) @@ -31,7 +31,7 @@ def adjust_page(top, parent, settings): "checkbox", self, "L/R Quickswapping", - top.gameOptionsWindow.gameOptionsWidgets["quickswap"].storageVar + top.gameOptipages["randomizer"].pages["gameoptions"]onsWindow.gameOptionsWidgets["quickswap"].storageVar ) self.adjustWidgets[key].pack(anchor=W) @@ -51,7 +51,7 @@ def adjust_page(top, parent, settings): "selectbox", leftAdjustFrame, "Heart Color", - top.gameOptionsWindow.gameOptionsWidgets["heartcolor"].storageVar, + top.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["heartcolor"].storageVar, {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, { "Red": "red", @@ -70,7 +70,7 @@ def adjust_page(top, parent, settings): "selectbox", leftAdjustFrame, "Heart Beep sound rate", - top.gameOptionsWindow.gameOptionsWidgets["heartbeep"].storageVar, + top.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["heartbeep"].storageVar, {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}, "default": "Normal"}, { "Double": "double", @@ -115,7 +115,7 @@ def adjust_page(top, parent, settings): "selectbox", rightAdjustFrame, "Menu Speed", - top.gameOptionsWindow.gameOptionsWidgets["menuspeed"].storageVar, + top.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["menuspeed"].storageVar, {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}, "default": "Normal"}, { "Instant": "instant", @@ -135,7 +135,7 @@ def adjust_page(top, parent, settings): "selectbox", rightAdjustFrame, "Overworld Palettes", - top.gameOptionsWindow.gameOptionsWidgets["owpalettes"].storageVar, + top.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["owpalettes"].storageVar, {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, { "Default": "default", @@ -152,7 +152,7 @@ def adjust_page(top, parent, settings): "selectbox", rightAdjustFrame, "Underworld Palettes", - top.gameOptionsWindow.gameOptionsWidgets["uwpalettes"].storageVar, + top.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["uwpalettes"].storageVar, {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, { "Default": "default", diff --git a/gui/bottom.py b/gui/bottom.py index c3884dd9..eebb9d17 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -108,9 +108,9 @@ def create_guiargs(parent): guiargs.shuffle = parent.pages["randomizer"].pages["entrance"].entrandoWidgets["entranceshuffle"].storageVar.get() guiargs.door_shuffle = parent.pages["randomizer"].pages["dungeon"].dungeonWidgets["dungeondoorshuffle"].storageVar.get() guiargs.experimental = parent.pages["randomizer"].pages["dungeon"].dungeonWidgets["experimental"].storageVar.get() - guiargs.heartbeep = parent.gameOptionsWindow.gameOptionsWidgets["heartbeep"].storageVar.get() - guiargs.heartcolor = parent.gameOptionsWindow.gameOptionsWidgets["heartcolor"].storageVar.get() - guiargs.fastmenu = parent.gameOptionsWindow.gameOptionsWidgets["menuspeed"].storageVar.get() + guiargs.heartbeep = parent.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["heartbeep"].storageVar.get() + guiargs.heartcolor = parent.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["heartcolor"].storageVar.get() + guiargs.fastmenu = parent.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["menuspeed"].storageVar.get() guiargs.create_spoiler = bool(parent.generationSetupWindow.generationWidgets["spoiler"].storageVar.get()) guiargs.skip_playthrough = not bool(parent.generationSetupWindow.generationWidgets["spoiler"].storageVar.get()) guiargs.suppress_rom = bool(parent.generationSetupWindow.generationWidgets["suppressrom"].storageVar.get()) @@ -120,12 +120,12 @@ def create_guiargs(parent): guiargs.keyshuffle = bool(parent.pages["randomizer"].pages["dungeon"].dungeonWidgets["smallkeyshuffle"].storageVar.get()) guiargs.bigkeyshuffle = bool(parent.pages["randomizer"].pages["dungeon"].dungeonWidgets["bigkeyshuffle"].storageVar.get()) guiargs.retro = bool(parent.pages["randomizer"].pages["item"].itemWidgets["retro"].storageVar.get()) - guiargs.quickswap = bool(parent.gameOptionsWindow.gameOptionsWidgets["quickswap"].storageVar.get()) - guiargs.disablemusic = bool(parent.gameOptionsWindow.gameOptionsWidgets["nobgm"].storageVar.get()) - guiargs.ow_palettes = parent.gameOptionsWindow.gameOptionsWidgets["owpalettes"].storageVar.get() - guiargs.uw_palettes = parent.gameOptionsWindow.gameOptionsWidgets["uwpalettes"].storageVar.get() + guiargs.quickswap = bool(parent.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["quickswap"].storageVar.get()) + guiargs.disablemusic = bool(parent.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["nobgm"].storageVar.get()) + guiargs.ow_palettes = parent.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["owpalettes"].storageVar.get() + guiargs.uw_palettes = parent.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["uwpalettes"].storageVar.get() guiargs.shuffleganon = bool(parent.pages["randomizer"].pages["entrance"].entrandoWidgets["shuffleganon"].storageVar.get()) - guiargs.hints = bool(parent.gameOptionsWindow.gameOptionsWidgets["hints"].storageVar.get()) + guiargs.hints = bool(parent.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["hints"].storageVar.get()) guiargs.enemizercli = parent.pages["randomizer"].pages["enemizer"].enemizerCLIpathVar.get() guiargs.shufflebosses = parent.pages["randomizer"].pages["enemizer"].enemizerWidgets["bossshuffle"].storageVar.get() guiargs.shuffleenemies = parent.pages["randomizer"].pages["enemizer"].enemizerWidgets["enemyshuffle"].storageVar.get() @@ -143,7 +143,7 @@ def create_guiargs(parent): int(parent.customContent.customWidgets["rupee300"].storageVar.get()), int(parent.customContent.customWidgets["rupoor"].storageVar.get()), int(parent.customContent.customWidgets["blueclock"].storageVar.get()), int(parent.customContent.customWidgets["greenclock"].storageVar.get()), int(parent.customContent.customWidgets["redclock"].storageVar.get()), int(parent.customContent.customWidgets["progressivebow"].storageVar.get()), int(parent.customContent.customWidgets["bomb10"].storageVar.get()), int(parent.customContent.customWidgets["triforcepieces"].storageVar.get()),int(parent.customContent.customWidgets["triforcepiecesgoal"].storageVar.get()), int(parent.customContent.customWidgets["triforce"].storageVar.get()),int(parent.customContent.customWidgets["rupoorcost"].storageVar.get()),int(parent.customContent.customWidgets["generickeys"].storageVar.get())] guiargs.rom = parent.generationSetupWindow.romVar.get() - guiargs.sprite = parent.gameOptionsWindow.gameOptionsWidgets["sprite"]["spriteObject"] + guiargs.sprite = parent.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["sprite"]["spriteObject"] guiargs.randomSprite = parent.randomSprite.get() guiargs.outputpath = parent.outputPath.get() return guiargs diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index 5d4dd508..c2f71702 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -17,8 +17,8 @@ def loadcliargs(gui, args): gui.pages["randomizer"].pages["dungeon"].dungeonWidgets["bigkeyshuffle"].storageVar.set(args.bigkeyshuffle) gui.pages["randomizer"].pages["item"].itemWidgets["retro"].storageVar.set(args.retro) gui.pages["randomizer"].pages["entrance"].entrandoWidgets["openpyramid"].storageVar.set(args.openpyramid) - gui.gameOptionsWindow.gameOptionsWidgets["quickswap"].storageVar.set(int(args.quickswap)) - gui.gameOptionsWindow.gameOptionsWidgets["nobgm"].storageVar.set(int(args.disablemusic)) + gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["quickswap"].storageVar.set(int(args.quickswap)) + gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["nobgm"].storageVar.set(int(args.disablemusic)) if args.multi: gui.pages["randomizer"].pages["multiworld"].multiworldWidgets["worlds"].storageVar.set(str(args.multi)) if args.count: @@ -39,30 +39,30 @@ def loadcliargs(gui, args): gui.pages["randomizer"].pages["entrance"].entrandoWidgets["entranceshuffle"].storageVar.set(args.shuffle) gui.pages["randomizer"].pages["dungeon"].dungeonWidgets["dungeondoorshuffle"].storageVar.set(args.door_shuffle) gui.pages["randomizer"].pages["dungeon"].dungeonWidgets["experimental"].storageVar.set(args.experimental) - gui.gameOptionsWindow.gameOptionsWidgets["heartcolor"].storageVar.set(args.heartcolor) - gui.gameOptionsWindow.gameOptionsWidgets["heartbeep"].storageVar.set(args.heartbeep) - gui.gameOptionsWindow.gameOptionsWidgets["menuspeed"].storageVar.set(args.fastmenu) + gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["heartcolor"].storageVar.set(args.heartcolor) + gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["heartbeep"].storageVar.set(args.heartbeep) + gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["menuspeed"].storageVar.set(args.fastmenu) gui.pages["randomizer"].pages["item"].itemWidgets["logiclevel"].storageVar.set(args.logic) gui.generationSetupWindow.romVar.set(args.rom) gui.pages["randomizer"].pages["entrance"].entrandoWidgets["shuffleganon"].storageVar.set(args.shuffleganon) - gui.gameOptionsWindow.gameOptionsWidgets["hints"].storageVar.set(args.hints) + gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["hints"].storageVar.set(args.hints) gui.pages["randomizer"].pages["enemizer"].enemizerCLIpathVar.set(args.enemizercli) gui.pages["randomizer"].pages["enemizer"].enemizerWidgets["potshuffle"].storageVar.set(args.shufflepots) gui.pages["randomizer"].pages["enemizer"].enemizerWidgets["enemyshuffle"].storageVar.set(args.shuffleenemies) gui.pages["randomizer"].pages["enemizer"].enemizerWidgets["bossshuffle"].storageVar.set(args.shufflebosses) gui.pages["randomizer"].pages["enemizer"].enemizerWidgets["enemydamage"].storageVar.set(args.enemy_damage) gui.pages["randomizer"].pages["enemizer"].enemizerWidgets["enemyhealth"].storageVar.set(args.enemy_health) - gui.gameOptionsWindow.gameOptionsWidgets["owpalettes"].storageVar.set(args.ow_palettes) - gui.gameOptionsWindow.gameOptionsWidgets["uwpalettes"].storageVar.set(args.uw_palettes) + gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["owpalettes"].storageVar.set(args.ow_palettes) + gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["uwpalettes"].storageVar.set(args.uw_palettes) gui.outputPath.set(args.outputpath) def sprite_setter(spriteObject): - gui.gameOptionsWindow.gameOptionsWidgets["sprite"]["spriteObject"] = spriteObject + gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["sprite"]["spriteObject"] = spriteObject if args.sprite is not None: sprite_obj = args.sprite if isinstance(args.sprite, Sprite) else Sprite(args.sprite) r_sprite_flag = args.randomSprite if hasattr(args, 'randomSprite') else False set_sprite(sprite_obj, r_sprite_flag, spriteSetter=sprite_setter, - spriteNameVar=gui.gameOptionsWindow.gameOptionsWidgets["sprite"]["spriteNameVar"], + spriteNameVar=gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["sprite"]["spriteNameVar"], randomSpriteVar=gui.randomSprite) gui.adjustContent.adjustWidgets["nobgm"].storageVar.set(int(args.disablemusic)) From 62f6642edb4f074e6585c77eeecb3d9e653be187 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 01:59:48 -0800 Subject: [PATCH 041/117] Arrayify Generation Setup Eventually split from Adjust --- gui/adjust/overview.py | 2 +- gui/bottom.py | 10 +++++----- gui/loadcliargs.py | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/gui/adjust/overview.py b/gui/adjust/overview.py index 230ffbcd..1fd5739a 100644 --- a/gui/adjust/overview.py +++ b/gui/adjust/overview.py @@ -189,7 +189,7 @@ def adjust_page(top, parent, settings): guiargs.quickswap = bool(self.adjustWidgets["quickswap"].storageVar.get()) guiargs.disablemusic = bool(self.adjustWidgets["nobgm"].storageVar.get()) guiargs.rom = self.romVar2.get() - guiargs.baserom = top.generationSetupWindow.romVar.get() + guiargs.baserom = top.pages["randomizer"].pages["generation"].romVar.get() guiargs.sprite = self.sprite try: adjust(args=guiargs) diff --git a/gui/bottom.py b/gui/bottom.py index eebb9d17..0190c533 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -111,9 +111,9 @@ def create_guiargs(parent): guiargs.heartbeep = parent.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["heartbeep"].storageVar.get() guiargs.heartcolor = parent.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["heartcolor"].storageVar.get() guiargs.fastmenu = parent.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["menuspeed"].storageVar.get() - guiargs.create_spoiler = bool(parent.generationSetupWindow.generationWidgets["spoiler"].storageVar.get()) - guiargs.skip_playthrough = not bool(parent.generationSetupWindow.generationWidgets["spoiler"].storageVar.get()) - guiargs.suppress_rom = bool(parent.generationSetupWindow.generationWidgets["suppressrom"].storageVar.get()) + guiargs.create_spoiler = bool(parent.pages["randomizer"].pages["generation"].generationWidgets["spoiler"].storageVar.get()) + guiargs.skip_playthrough = not bool(parent.pages["randomizer"].pages["generation"].generationWidgets["spoiler"].storageVar.get()) + guiargs.suppress_rom = bool(parent.pages["randomizer"].pages["generation"].generationWidgets["suppressrom"].storageVar.get()) guiargs.openpyramid = bool(parent.pages["randomizer"].pages["entrance"].entrandoWidgets["openpyramid"].storageVar.get()) guiargs.mapshuffle = bool(parent.pages["randomizer"].pages["dungeon"].dungeonWidgets["mapshuffle"].storageVar.get()) guiargs.compassshuffle = bool(parent.pages["randomizer"].pages["dungeon"].dungeonWidgets["compassshuffle"].storageVar.get()) @@ -132,7 +132,7 @@ def create_guiargs(parent): guiargs.enemy_health = parent.pages["randomizer"].pages["enemizer"].enemizerWidgets["enemyhealth"].storageVar.get() guiargs.enemy_damage = parent.pages["randomizer"].pages["enemizer"].enemizerWidgets["enemydamage"].storageVar.get() guiargs.shufflepots = bool(parent.pages["randomizer"].pages["enemizer"].enemizerWidgets["potshuffle"].storageVar.get()) - guiargs.custom = bool(parent.generationSetupWindow.generationWidgets["usecustompool"].storageVar.get()) + guiargs.custom = bool(parent.pages["randomizer"].pages["generation"].generationWidgets["usecustompool"].storageVar.get()) guiargs.customitemarray = [int(parent.customContent.customWidgets["bow"].storageVar.get()), int(parent.customContent.customWidgets["silversupgrade"].storageVar.get()), int(parent.customContent.customWidgets["boomerang"].storageVar.get()), int(parent.customContent.customWidgets["redmerang"].storageVar.get()), int(parent.customContent.customWidgets["hookshot"].storageVar.get()), int(parent.customContent.customWidgets["mushroom"].storageVar.get()), int(parent.customContent.customWidgets["powder"].storageVar.get()), int(parent.customContent.customWidgets["firerod"].storageVar.get()), int(parent.customContent.customWidgets["icerod"].storageVar.get()), int(parent.customContent.customWidgets["bombos"].storageVar.get()), int(parent.customContent.customWidgets["ether"].storageVar.get()), int(parent.customContent.customWidgets["quake"].storageVar.get()), int(parent.customContent.customWidgets["lamp"].storageVar.get()), int(parent.customContent.customWidgets["hammer"].storageVar.get()), int(parent.customContent.customWidgets["shovel"].storageVar.get()), int(parent.customContent.customWidgets["flute"].storageVar.get()), int(parent.customContent.customWidgets["bugnet"].storageVar.get()), int(parent.customContent.customWidgets["book"].storageVar.get()), int(parent.customContent.customWidgets["bottle"].storageVar.get()), int(parent.customContent.customWidgets["somaria"].storageVar.get()), int(parent.customContent.customWidgets["byrna"].storageVar.get()), int(parent.customContent.customWidgets["cape"].storageVar.get()), int(parent.customContent.customWidgets["mirror"].storageVar.get()), int(parent.customContent.customWidgets["boots"].storageVar.get()), int(parent.customContent.customWidgets["powerglove"].storageVar.get()), int(parent.customContent.customWidgets["titansmitt"].storageVar.get()), @@ -142,7 +142,7 @@ def create_guiargs(parent): int(parent.customContent.customWidgets["arrow1"].storageVar.get()), int(parent.customContent.customWidgets["arrow10"].storageVar.get()), int(parent.customContent.customWidgets["bomb1"].storageVar.get()), int(parent.customContent.customWidgets["bomb3"].storageVar.get()), int(parent.customContent.customWidgets["rupee1"].storageVar.get()), int(parent.customContent.customWidgets["rupee5"].storageVar.get()), int(parent.customContent.customWidgets["rupee20"].storageVar.get()), int(parent.customContent.customWidgets["rupee50"].storageVar.get()), int(parent.customContent.customWidgets["rupee100"].storageVar.get()), int(parent.customContent.customWidgets["rupee300"].storageVar.get()), int(parent.customContent.customWidgets["rupoor"].storageVar.get()), int(parent.customContent.customWidgets["blueclock"].storageVar.get()), int(parent.customContent.customWidgets["greenclock"].storageVar.get()), int(parent.customContent.customWidgets["redclock"].storageVar.get()), int(parent.customContent.customWidgets["progressivebow"].storageVar.get()), int(parent.customContent.customWidgets["bomb10"].storageVar.get()), int(parent.customContent.customWidgets["triforcepieces"].storageVar.get()),int(parent.customContent.customWidgets["triforcepiecesgoal"].storageVar.get()), int(parent.customContent.customWidgets["triforce"].storageVar.get()),int(parent.customContent.customWidgets["rupoorcost"].storageVar.get()),int(parent.customContent.customWidgets["generickeys"].storageVar.get())] - guiargs.rom = parent.generationSetupWindow.romVar.get() + guiargs.rom = parent.pages["randomizer"].pages["generation"].romVar.get() guiargs.sprite = parent.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["sprite"]["spriteObject"] guiargs.randomSprite = parent.randomSprite.get() guiargs.outputpath = parent.outputPath.get() diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index c2f71702..81d2bd74 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -9,8 +9,8 @@ def loadcliargs(gui, args): if type(v) is dict: setattr(args, k, v[1]) # only get values for player 1 for now # load values from commandline args - gui.generationSetupWindow.generationWidgets["spoiler"].storageVar.set(int(args.create_spoiler)) - gui.generationSetupWindow.generationWidgets["suppressrom"].storageVar.set(int(args.suppress_rom)) + gui.pages["randomizer"].pages["generation"].generationWidgets["spoiler"].storageVar.set(int(args.create_spoiler)) + gui.pages["randomizer"].pages["generation"].generationWidgets["suppressrom"].storageVar.set(int(args.suppress_rom)) gui.pages["randomizer"].pages["dungeon"].dungeonWidgets["mapshuffle"].storageVar.set(args.mapshuffle) gui.pages["randomizer"].pages["dungeon"].dungeonWidgets["compassshuffle"].storageVar.set(args.compassshuffle) gui.pages["randomizer"].pages["dungeon"].dungeonWidgets["smallkeyshuffle"].storageVar.set(args.keyshuffle) @@ -43,7 +43,7 @@ def loadcliargs(gui, args): gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["heartbeep"].storageVar.set(args.heartbeep) gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["menuspeed"].storageVar.set(args.fastmenu) gui.pages["randomizer"].pages["item"].itemWidgets["logiclevel"].storageVar.set(args.logic) - gui.generationSetupWindow.romVar.set(args.rom) + gui.pages["randomizer"].pages["generation"].romVar.set(args.rom) gui.pages["randomizer"].pages["entrance"].entrandoWidgets["shuffleganon"].storageVar.set(args.shuffleganon) gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["hints"].storageVar.set(args.hints) gui.pages["randomizer"].pages["enemizer"].enemizerCLIpathVar.set(args.enemizercli) From afa96412d1c4f48df4d4e3f49ee1c2aefcadc9e2 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 02:02:04 -0800 Subject: [PATCH 042/117] Arrayify Adjust --- Gui.py | 4 ++-- gui/loadcliargs.py | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Gui.py b/Gui.py index 470c41e5..4bbfa336 100755 --- a/Gui.py +++ b/Gui.py @@ -118,8 +118,8 @@ def guiMain(args=None): self.randomSprite = BooleanVar() # Adjuster Controls - self.adjustContent,self.settings = adjust_page(self, self.pages["adjust"], self.settings) - self.adjustContent.pack(side=TOP, fill=BOTH, expand=True) + self.pages["adjust"].content,self.settings = adjust_page(self, self.pages["adjust"], self.settings) + self.pages["adjust"].content.pack(side=TOP, fill=BOTH, expand=True) # Custom Controls self.customContent = custom_page(self,self.pages["custom"]) diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index 81d2bd74..eb6d3ebf 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -65,19 +65,19 @@ def loadcliargs(gui, args): spriteNameVar=gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["sprite"]["spriteNameVar"], randomSpriteVar=gui.randomSprite) - gui.adjustContent.adjustWidgets["nobgm"].storageVar.set(int(args.disablemusic)) - gui.adjustContent.adjustWidgets['quickswap'].storageVar.set(args.quickswap) - gui.adjustContent.adjustWidgets["heartcolor"].storageVar.set(args.heartcolor) - gui.adjustContent.adjustWidgets["heartbeep"].storageVar.set(args.heartbeep) - gui.adjustContent.adjustWidgets["menuspeed"].storageVar.set(args.fastmenu) - gui.adjustContent.adjustWidgets["owpalettes"].storageVar.set(args.ow_palettes) - gui.adjustContent.adjustWidgets["uwpalettes"].storageVar.set(args.uw_palettes) + gui.pages["adjust"].content.adjustWidgets["nobgm"].storageVar.set(int(args.disablemusic)) + gui.pages["adjust"].content.adjustWidgets['quickswap'].storageVar.set(args.quickswap) + gui.pages["adjust"].content.adjustWidgets["heartcolor"].storageVar.set(args.heartcolor) + gui.pages["adjust"].content.adjustWidgets["heartbeep"].storageVar.set(args.heartbeep) + gui.pages["adjust"].content.adjustWidgets["menuspeed"].storageVar.set(args.fastmenu) + gui.pages["adjust"].content.adjustWidgets["owpalettes"].storageVar.set(args.ow_palettes) + gui.pages["adjust"].content.adjustWidgets["uwpalettes"].storageVar.set(args.uw_palettes) def sprite_setter_adj(spriteObject): - gui.adjustContent.sprite = spriteObject + gui.pages["adjust"].content.sprite = spriteObject if args.sprite is not None: sprite_obj = args.sprite if isinstance(args.sprite, Sprite) else Sprite(args.sprite) r_sprite_flag = args.randomSprite if hasattr(args, 'randomSprite') else False set_sprite(sprite_obj, r_sprite_flag, spriteSetter=sprite_setter_adj, - spriteNameVar=gui.adjustContent.spriteNameVar2, + spriteNameVar=gui.pages["adjust"].content.spriteNameVar2, randomSpriteVar=gui.randomSprite) From 87345becc04d858283dec8e7fd041a398e645e8c Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 02:03:11 -0800 Subject: [PATCH 043/117] Arrayify Custom --- Gui.py | 6 +++--- gui/bottom.py | 18 +++++++++--------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Gui.py b/Gui.py index 4bbfa336..988c18c6 100755 --- a/Gui.py +++ b/Gui.py @@ -122,15 +122,15 @@ def guiMain(args=None): self.pages["adjust"].content.pack(side=TOP, fill=BOTH, expand=True) # Custom Controls - self.customContent = custom_page(self,self.pages["custom"]) - self.customContent.pack(side=TOP, pady=(17,0)) + self.pages["custom"].content = custom_page(self,self.pages["custom"]) + self.pages["custom"].content.pack(side=TOP, pady=(17,0)) def validation(P): if str.isdigit(P) or P == "": return True else: return False - vcmd=(self.customContent.register(validation), '%P') + vcmd=(self.pages["custom"].content.register(validation), '%P') # load args from CLI into options loadcliargs(self, args) diff --git a/gui/bottom.py b/gui/bottom.py index 0190c533..f8a1eccf 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -133,15 +133,15 @@ def create_guiargs(parent): guiargs.enemy_damage = parent.pages["randomizer"].pages["enemizer"].enemizerWidgets["enemydamage"].storageVar.get() guiargs.shufflepots = bool(parent.pages["randomizer"].pages["enemizer"].enemizerWidgets["potshuffle"].storageVar.get()) guiargs.custom = bool(parent.pages["randomizer"].pages["generation"].generationWidgets["usecustompool"].storageVar.get()) - guiargs.customitemarray = [int(parent.customContent.customWidgets["bow"].storageVar.get()), int(parent.customContent.customWidgets["silversupgrade"].storageVar.get()), int(parent.customContent.customWidgets["boomerang"].storageVar.get()), int(parent.customContent.customWidgets["redmerang"].storageVar.get()), int(parent.customContent.customWidgets["hookshot"].storageVar.get()), int(parent.customContent.customWidgets["mushroom"].storageVar.get()), int(parent.customContent.customWidgets["powder"].storageVar.get()), int(parent.customContent.customWidgets["firerod"].storageVar.get()), - int(parent.customContent.customWidgets["icerod"].storageVar.get()), int(parent.customContent.customWidgets["bombos"].storageVar.get()), int(parent.customContent.customWidgets["ether"].storageVar.get()), int(parent.customContent.customWidgets["quake"].storageVar.get()), int(parent.customContent.customWidgets["lamp"].storageVar.get()), int(parent.customContent.customWidgets["hammer"].storageVar.get()), int(parent.customContent.customWidgets["shovel"].storageVar.get()), int(parent.customContent.customWidgets["flute"].storageVar.get()), int(parent.customContent.customWidgets["bugnet"].storageVar.get()), - int(parent.customContent.customWidgets["book"].storageVar.get()), int(parent.customContent.customWidgets["bottle"].storageVar.get()), int(parent.customContent.customWidgets["somaria"].storageVar.get()), int(parent.customContent.customWidgets["byrna"].storageVar.get()), int(parent.customContent.customWidgets["cape"].storageVar.get()), int(parent.customContent.customWidgets["mirror"].storageVar.get()), int(parent.customContent.customWidgets["boots"].storageVar.get()), int(parent.customContent.customWidgets["powerglove"].storageVar.get()), int(parent.customContent.customWidgets["titansmitt"].storageVar.get()), - int(parent.customContent.customWidgets["progressiveglove"].storageVar.get()), int(parent.customContent.customWidgets["flippers"].storageVar.get()), int(parent.customContent.customWidgets["pearl"].storageVar.get()), int(parent.customContent.customWidgets["heartpiece"].storageVar.get()), int(parent.customContent.customWidgets["heartcontainer"].storageVar.get()), int(parent.customContent.customWidgets["sancheart"].storageVar.get()), int(parent.customContent.customWidgets["sword1"].storageVar.get()), int(parent.customContent.customWidgets["sword2"].storageVar.get()), - int(parent.customContent.customWidgets["sword3"].storageVar.get()), int(parent.customContent.customWidgets["sword4"].storageVar.get()), int(parent.customContent.customWidgets["progressivesword"].storageVar.get()), int(parent.customContent.customWidgets["shield1"].storageVar.get()), int(parent.customContent.customWidgets["shield2"].storageVar.get()), int(parent.customContent.customWidgets["shield3"].storageVar.get()), int(parent.customContent.customWidgets["progressiveshield"].storageVar.get()), int(parent.customContent.customWidgets["mail2"].storageVar.get()), - int(parent.customContent.customWidgets["mail3"].storageVar.get()), int(parent.customContent.customWidgets["progressivemail"].storageVar.get()), int(parent.customContent.customWidgets["halfmagic"].storageVar.get()), int(parent.customContent.customWidgets["quartermagic"].storageVar.get()), int(parent.customContent.customWidgets["bombsplus5"].storageVar.get()), int(parent.customContent.customWidgets["bombsplus10"].storageVar.get()), int(parent.customContent.customWidgets["arrowsplus5"].storageVar.get()), int(parent.customContent.customWidgets["arrowsplus10"].storageVar.get()), - int(parent.customContent.customWidgets["arrow1"].storageVar.get()), int(parent.customContent.customWidgets["arrow10"].storageVar.get()), int(parent.customContent.customWidgets["bomb1"].storageVar.get()), int(parent.customContent.customWidgets["bomb3"].storageVar.get()), int(parent.customContent.customWidgets["rupee1"].storageVar.get()), int(parent.customContent.customWidgets["rupee5"].storageVar.get()), int(parent.customContent.customWidgets["rupee20"].storageVar.get()), int(parent.customContent.customWidgets["rupee50"].storageVar.get()), int(parent.customContent.customWidgets["rupee100"].storageVar.get()), - int(parent.customContent.customWidgets["rupee300"].storageVar.get()), int(parent.customContent.customWidgets["rupoor"].storageVar.get()), int(parent.customContent.customWidgets["blueclock"].storageVar.get()), int(parent.customContent.customWidgets["greenclock"].storageVar.get()), int(parent.customContent.customWidgets["redclock"].storageVar.get()), int(parent.customContent.customWidgets["progressivebow"].storageVar.get()), int(parent.customContent.customWidgets["bomb10"].storageVar.get()), int(parent.customContent.customWidgets["triforcepieces"].storageVar.get()),int(parent.customContent.customWidgets["triforcepiecesgoal"].storageVar.get()), - int(parent.customContent.customWidgets["triforce"].storageVar.get()),int(parent.customContent.customWidgets["rupoorcost"].storageVar.get()),int(parent.customContent.customWidgets["generickeys"].storageVar.get())] + guiargs.customitemarray = [int(parent.pages["custom"].content.customWidgets["bow"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["silversupgrade"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["boomerang"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["redmerang"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["hookshot"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["mushroom"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["powder"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["firerod"].storageVar.get()), + int(parent.pages["custom"].content.customWidgets["icerod"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["bombos"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["ether"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["quake"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["lamp"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["hammer"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["shovel"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["flute"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["bugnet"].storageVar.get()), + int(parent.pages["custom"].content.customWidgets["book"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["bottle"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["somaria"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["byrna"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["cape"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["mirror"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["boots"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["powerglove"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["titansmitt"].storageVar.get()), + int(parent.pages["custom"].content.customWidgets["progressiveglove"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["flippers"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["pearl"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["heartpiece"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["heartcontainer"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["sancheart"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["sword1"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["sword2"].storageVar.get()), + int(parent.pages["custom"].content.customWidgets["sword3"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["sword4"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["progressivesword"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["shield1"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["shield2"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["shield3"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["progressiveshield"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["mail2"].storageVar.get()), + int(parent.pages["custom"].content.customWidgets["mail3"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["progressivemail"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["halfmagic"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["quartermagic"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["bombsplus5"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["bombsplus10"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["arrowsplus5"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["arrowsplus10"].storageVar.get()), + int(parent.pages["custom"].content.customWidgets["arrow1"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["arrow10"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["bomb1"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["bomb3"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["rupee1"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["rupee5"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["rupee20"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["rupee50"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["rupee100"].storageVar.get()), + int(parent.pages["custom"].content.customWidgets["rupee300"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["rupoor"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["blueclock"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["greenclock"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["redclock"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["progressivebow"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["bomb10"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["triforcepieces"].storageVar.get()),int(parent.pages["custom"].content.customWidgets["triforcepiecesgoal"].storageVar.get()), + int(parent.pages["custom"].content.customWidgets["triforce"].storageVar.get()),int(parent.pages["custom"].content.customWidgets["rupoorcost"].storageVar.get()),int(parent.pages["custom"].content.customWidgets["generickeys"].storageVar.get())] guiargs.rom = parent.pages["randomizer"].pages["generation"].romVar.get() guiargs.sprite = parent.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["sprite"]["spriteObject"] guiargs.randomSprite = parent.randomSprite.get() From 047c344bb0518ad644ba2e22315c1ade4fabd0ca Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 02:03:56 -0800 Subject: [PATCH 044/117] Copy/paste error --- gui/adjust/overview.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/adjust/overview.py b/gui/adjust/overview.py index 1fd5739a..599d01ac 100644 --- a/gui/adjust/overview.py +++ b/gui/adjust/overview.py @@ -31,7 +31,7 @@ def adjust_page(top, parent, settings): "checkbox", self, "L/R Quickswapping", - top.gameOptipages["randomizer"].pages["gameoptions"]onsWindow.gameOptionsWidgets["quickswap"].storageVar + top.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["quickswap"].storageVar ) self.adjustWidgets[key].pack(anchor=W) From 8f32c3017756d91c374fcbe5c5df62ebba212b2e Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 02:06:14 -0800 Subject: [PATCH 045/117] Pythonify values --- CLI.py | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/CLI.py b/CLI.py index 1098b6ae..75250404 100644 --- a/CLI.py +++ b/CLI.py @@ -323,8 +323,8 @@ def get_settings(): settings = { "multi": 1, "names": "", - "seed": null, - "count": null, + "seed": None, + "count": None, "mode": "open", "logic": "noglitches", "goal": "ganon", @@ -343,28 +343,28 @@ def get_settings(): "heartbeep": "normal", "heartcolor": "red", "fastmenu": "normal", - "create_spoiler": false, - "skip_playthrough": true, - "suppress_rom": false, - "openpyramid": false, - "mapshuffle": false, - "compassshuffle": false, - "keyshuffle": false, - "bigkeyshuffle": false, - "retro": false, - "quickswap": false, - "disablemusic": false, + "create_spoiler": False, + "skip_playthrough": True, + "suppress_rom": False, + "openpyramid": False, + "mapshuffle": False, + "compassshuffle": False, + "keyshuffle": False, + "bigkeyshuffle": False, + "retro": False, + "quickswap": False, + "disablemusic": False, "ow_palettes": "default", "uw_palettes": "default", - "shuffleganon": true, - "hints": false, + "shuffleganon": True, + "hints": False, "enemizercli": os.path.join(".","EnemizerCLI","EnemizerCLI.Core"), "shufflebosses": "none", "shuffleenemies": "none", "enemy_health": "default", "enemy_damage": "default", - "shufflepots": false, - "custom": false, + "shufflepots": False, + "custom": False, "customitemarray": [ 0, 0, @@ -439,8 +439,8 @@ def get_settings(): 0 ], "rom": os.path.join(".","Zelda no Densetsu - Kamigami no Triforce (Japan).sfc"), - "sprite": null, - "randomSprite": false, + "sprite": None, + "randomSprite": False, "outputpath": os.path.join(".") } if sys.platform.lower().find("windows"): From ab4b164a6253028e39e7c27b554595b46694774a Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 02:06:52 -0800 Subject: [PATCH 046/117] Return proper var --- CLI.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CLI.py b/CLI.py index 75250404..3a33d193 100644 --- a/CLI.py +++ b/CLI.py @@ -455,4 +455,4 @@ def get_settings(): data['sprite'] = get_sprite_from_name(data['sprite']) for k,v in data.items(): settings[k] = v - return settings_args + return settings From 9384c504dd79bbdcac682b417847d1225b8b953a Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 02:08:49 -0800 Subject: [PATCH 047/117] Ints like being numbers --- CLI.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CLI.py b/CLI.py index 3a33d193..3a8923ee 100644 --- a/CLI.py +++ b/CLI.py @@ -324,7 +324,7 @@ def get_settings(): "multi": 1, "names": "", "seed": None, - "count": None, + "count": 1, "mode": "open", "logic": "noglitches", "goal": "ganon", From 08ec529c759b14dc784321c191307c5e20f6cc22 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 02:14:16 -0800 Subject: [PATCH 048/117] Initialize variables --- Gui.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Gui.py b/Gui.py index 988c18c6..7a8fe0dc 100755 --- a/Gui.py +++ b/Gui.py @@ -56,6 +56,12 @@ def guiMain(args=None): # get saved settings self.settings = get_settings() + # make array for pages + self.pages = {} + + # make array for frames + self.frames = {} + self.notebook = ttk.Notebook(self) self.pages["randomizer"] = ttk.Frame(self.notebook) self.pages["adjust"] = ttk.Frame(self.notebook) @@ -78,6 +84,9 @@ def guiMain(args=None): # Generation Setup: Primarily one&done settings self.pages["randomizer"].notebook = ttk.Notebook(self.pages["randomizer"]) + # make array for pages + self.pages["randomizer"].pages = {} + # Item Randomizer self.pages["randomizer"].pages["item"] = item_page(self.pages["randomizer"].notebook) self.pages["randomizer"].notebook.add(self.pages["randomizer"].pages["item"], text="Items") From 0df66f37d9506a28a9020f21e7a87bb4812b5631 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 02:15:22 -0800 Subject: [PATCH 049/117] Bottom Widgets --- gui/bottom.py | 8 ++++---- gui/loadcliargs.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/gui/bottom.py b/gui/bottom.py index f8a1eccf..4120242a 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -14,7 +14,7 @@ def bottom_frame(self, parent, args=None): self = ttk.Frame(parent) # Bottom Frame options - self.bottomWidgets = {} + self.widgets = {} seedCountFrame = Frame(self) seedCountFrame.pack() @@ -32,7 +32,7 @@ def bottom_frame(self, parent, args=None): ## Number of Generation attempts key = "generationcount" - self.bottomWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "spinbox", self, @@ -40,7 +40,7 @@ def bottom_frame(self, parent, args=None): None, {"label": {"side": LEFT}, "spinbox": {"side": RIGHT}} ) - self.bottomWidgets[key].pack(side=LEFT) + self.widgets[key].pack(side=LEFT) def generateRom(): guiargs = create_guiargs(parent) @@ -91,7 +91,7 @@ def create_guiargs(parent): guiargs.multi = int(parent.pages["randomizer"].pages["multiworld"].multiworldWidgets["worlds"].storageVar.get()) guiargs.names = parent.pages["randomizer"].pages["multiworld"].namesVar.get() guiargs.seed = int(parent.frames["bottom"].seedVar.get()) if parent.frames["bottom"].seedVar.get() else None - guiargs.count = int(parent.frames["bottom"].bottomWidgets["generationcount"].storageVar.get()) if parent.frames["bottom"].bottomWidgets["generationcount"].storageVar.get() != '1' else None + guiargs.count = int(parent.frames["bottom"].widgets["generationcount"].storageVar.get()) if parent.frames["bottom"].widgets["generationcount"].storageVar.get() != '1' else None guiargs.mode = parent.pages["randomizer"].pages["item"].itemWidgets["worldstate"].storageVar.get() guiargs.logic = parent.pages["randomizer"].pages["item"].itemWidgets["logiclevel"].storageVar.get() diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index eb6d3ebf..04027c72 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -22,7 +22,7 @@ def loadcliargs(gui, args): if args.multi: gui.pages["randomizer"].pages["multiworld"].multiworldWidgets["worlds"].storageVar.set(str(args.multi)) if args.count: - gui.frames["bottom"].bottomWidgets["generationcount"].storageVar.set(str(args.count)) + gui.frames["bottom"].widgets["generationcount"].storageVar.set(str(args.count)) if args.seed: gui.frames["bottom"].seedVar.set(str(args.seed)) gui.pages["randomizer"].pages["item"].itemWidgets["worldstate"].storageVar.set(args.mode) From 35570ecb38527316d0b144babdc8c7c9aae79dde Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 02:18:03 -0800 Subject: [PATCH 050/117] Item Widgets --- gui/bottom.py | 26 ++++++++++----------- gui/loadcliargs.py | 26 ++++++++++----------- gui/randomize/item.py | 54 +++++++++++++++++++++---------------------- 3 files changed, 53 insertions(+), 53 deletions(-) diff --git a/gui/bottom.py b/gui/bottom.py index 4120242a..ddc77ce1 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -92,19 +92,19 @@ def create_guiargs(parent): guiargs.names = parent.pages["randomizer"].pages["multiworld"].namesVar.get() guiargs.seed = int(parent.frames["bottom"].seedVar.get()) if parent.frames["bottom"].seedVar.get() else None guiargs.count = int(parent.frames["bottom"].widgets["generationcount"].storageVar.get()) if parent.frames["bottom"].widgets["generationcount"].storageVar.get() != '1' else None - guiargs.mode = parent.pages["randomizer"].pages["item"].itemWidgets["worldstate"].storageVar.get() - guiargs.logic = parent.pages["randomizer"].pages["item"].itemWidgets["logiclevel"].storageVar.get() + guiargs.mode = parent.pages["randomizer"].pages["item"].widgets["worldstate"].storageVar.get() + guiargs.logic = parent.pages["randomizer"].pages["item"].widgets["logiclevel"].storageVar.get() - guiargs.goal = parent.pages["randomizer"].pages["item"].itemWidgets["goal"].storageVar.get() - guiargs.crystals_gt = parent.pages["randomizer"].pages["item"].itemWidgets["crystals_gt"].storageVar.get() - guiargs.crystals_ganon = parent.pages["randomizer"].pages["item"].itemWidgets["crystals_ganon"].storageVar.get() - guiargs.swords = parent.pages["randomizer"].pages["item"].itemWidgets["weapons"].storageVar.get() - guiargs.difficulty = parent.pages["randomizer"].pages["item"].itemWidgets["itempool"].storageVar.get() - guiargs.item_functionality = parent.pages["randomizer"].pages["item"].itemWidgets["itemfunction"].storageVar.get() - guiargs.timer = parent.pages["randomizer"].pages["item"].itemWidgets["timer"].storageVar.get() - guiargs.progressive = parent.pages["randomizer"].pages["item"].itemWidgets["progressives"].storageVar.get() - guiargs.accessibility = parent.pages["randomizer"].pages["item"].itemWidgets["accessibility"].storageVar.get() - guiargs.algorithm = parent.pages["randomizer"].pages["item"].itemWidgets["sortingalgo"].storageVar.get() + guiargs.goal = parent.pages["randomizer"].pages["item"].widgets["goal"].storageVar.get() + guiargs.crystals_gt = parent.pages["randomizer"].pages["item"].widgets["crystals_gt"].storageVar.get() + guiargs.crystals_ganon = parent.pages["randomizer"].pages["item"].widgets["crystals_ganon"].storageVar.get() + guiargs.swords = parent.pages["randomizer"].pages["item"].widgets["weapons"].storageVar.get() + guiargs.difficulty = parent.pages["randomizer"].pages["item"].widgets["itempool"].storageVar.get() + guiargs.item_functionality = parent.pages["randomizer"].pages["item"].widgets["itemfunction"].storageVar.get() + guiargs.timer = parent.pages["randomizer"].pages["item"].widgets["timer"].storageVar.get() + guiargs.progressive = parent.pages["randomizer"].pages["item"].widgets["progressives"].storageVar.get() + guiargs.accessibility = parent.pages["randomizer"].pages["item"].widgets["accessibility"].storageVar.get() + guiargs.algorithm = parent.pages["randomizer"].pages["item"].widgets["sortingalgo"].storageVar.get() guiargs.shuffle = parent.pages["randomizer"].pages["entrance"].entrandoWidgets["entranceshuffle"].storageVar.get() guiargs.door_shuffle = parent.pages["randomizer"].pages["dungeon"].dungeonWidgets["dungeondoorshuffle"].storageVar.get() guiargs.experimental = parent.pages["randomizer"].pages["dungeon"].dungeonWidgets["experimental"].storageVar.get() @@ -119,7 +119,7 @@ def create_guiargs(parent): guiargs.compassshuffle = bool(parent.pages["randomizer"].pages["dungeon"].dungeonWidgets["compassshuffle"].storageVar.get()) guiargs.keyshuffle = bool(parent.pages["randomizer"].pages["dungeon"].dungeonWidgets["smallkeyshuffle"].storageVar.get()) guiargs.bigkeyshuffle = bool(parent.pages["randomizer"].pages["dungeon"].dungeonWidgets["bigkeyshuffle"].storageVar.get()) - guiargs.retro = bool(parent.pages["randomizer"].pages["item"].itemWidgets["retro"].storageVar.get()) + guiargs.retro = bool(parent.pages["randomizer"].pages["item"].widgets["retro"].storageVar.get()) guiargs.quickswap = bool(parent.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["quickswap"].storageVar.get()) guiargs.disablemusic = bool(parent.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["nobgm"].storageVar.get()) guiargs.ow_palettes = parent.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["owpalettes"].storageVar.get() diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index 04027c72..3abaf5c9 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -15,7 +15,7 @@ def loadcliargs(gui, args): gui.pages["randomizer"].pages["dungeon"].dungeonWidgets["compassshuffle"].storageVar.set(args.compassshuffle) gui.pages["randomizer"].pages["dungeon"].dungeonWidgets["smallkeyshuffle"].storageVar.set(args.keyshuffle) gui.pages["randomizer"].pages["dungeon"].dungeonWidgets["bigkeyshuffle"].storageVar.set(args.bigkeyshuffle) - gui.pages["randomizer"].pages["item"].itemWidgets["retro"].storageVar.set(args.retro) + gui.pages["randomizer"].pages["item"].widgets["retro"].storageVar.set(args.retro) gui.pages["randomizer"].pages["entrance"].entrandoWidgets["openpyramid"].storageVar.set(args.openpyramid) gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["quickswap"].storageVar.set(int(args.quickswap)) gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["nobgm"].storageVar.set(int(args.disablemusic)) @@ -25,24 +25,24 @@ def loadcliargs(gui, args): gui.frames["bottom"].widgets["generationcount"].storageVar.set(str(args.count)) if args.seed: gui.frames["bottom"].seedVar.set(str(args.seed)) - gui.pages["randomizer"].pages["item"].itemWidgets["worldstate"].storageVar.set(args.mode) - gui.pages["randomizer"].pages["item"].itemWidgets["weapons"].storageVar.set(args.swords) - gui.pages["randomizer"].pages["item"].itemWidgets["itempool"].storageVar.set(args.difficulty) - gui.pages["randomizer"].pages["item"].itemWidgets["itemfunction"].storageVar.set(args.item_functionality) - gui.pages["randomizer"].pages["item"].itemWidgets["timer"].storageVar.set(args.timer) - gui.pages["randomizer"].pages["item"].itemWidgets["progressives"].storageVar.set(args.progressive) - gui.pages["randomizer"].pages["item"].itemWidgets["accessibility"].storageVar.set(args.accessibility) - gui.pages["randomizer"].pages["item"].itemWidgets["goal"].storageVar.set(args.goal) - gui.pages["randomizer"].pages["item"].itemWidgets["crystals_gt"].storageVar.set(args.crystals_gt) - gui.pages["randomizer"].pages["item"].itemWidgets["crystals_ganon"].storageVar.set(args.crystals_ganon) - gui.pages["randomizer"].pages["item"].itemWidgets["sortingalgo"].storageVar.set(args.algorithm) + gui.pages["randomizer"].pages["item"].widgets["worldstate"].storageVar.set(args.mode) + gui.pages["randomizer"].pages["item"].widgets["weapons"].storageVar.set(args.swords) + gui.pages["randomizer"].pages["item"].widgets["itempool"].storageVar.set(args.difficulty) + gui.pages["randomizer"].pages["item"].widgets["itemfunction"].storageVar.set(args.item_functionality) + gui.pages["randomizer"].pages["item"].widgets["timer"].storageVar.set(args.timer) + gui.pages["randomizer"].pages["item"].widgets["progressives"].storageVar.set(args.progressive) + gui.pages["randomizer"].pages["item"].widgets["accessibility"].storageVar.set(args.accessibility) + gui.pages["randomizer"].pages["item"].widgets["goal"].storageVar.set(args.goal) + gui.pages["randomizer"].pages["item"].widgets["crystals_gt"].storageVar.set(args.crystals_gt) + gui.pages["randomizer"].pages["item"].widgets["crystals_ganon"].storageVar.set(args.crystals_ganon) + gui.pages["randomizer"].pages["item"].widgets["sortingalgo"].storageVar.set(args.algorithm) gui.pages["randomizer"].pages["entrance"].entrandoWidgets["entranceshuffle"].storageVar.set(args.shuffle) gui.pages["randomizer"].pages["dungeon"].dungeonWidgets["dungeondoorshuffle"].storageVar.set(args.door_shuffle) gui.pages["randomizer"].pages["dungeon"].dungeonWidgets["experimental"].storageVar.set(args.experimental) gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["heartcolor"].storageVar.set(args.heartcolor) gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["heartbeep"].storageVar.set(args.heartbeep) gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["menuspeed"].storageVar.set(args.fastmenu) - gui.pages["randomizer"].pages["item"].itemWidgets["logiclevel"].storageVar.set(args.logic) + gui.pages["randomizer"].pages["item"].widgets["logiclevel"].storageVar.set(args.logic) gui.pages["randomizer"].pages["generation"].romVar.set(args.rom) gui.pages["randomizer"].pages["entrance"].entrandoWidgets["shuffleganon"].storageVar.set(args.shuffleganon) gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["hints"].storageVar.set(args.hints) diff --git a/gui/randomize/item.py b/gui/randomize/item.py index b1803f44..671e6749 100644 --- a/gui/randomize/item.py +++ b/gui/randomize/item.py @@ -6,18 +6,18 @@ def item_page(parent): self = ttk.Frame(parent) # Item Randomizer options - self.itemWidgets = {} + self.widgets = {} ## Retro (eventually needs to become a World State) key = "retro" - self.itemWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "checkbox", self, "Retro mode (universal keys)", None ) - self.itemWidgets[key].pack(anchor=W) + self.widgets[key].pack(anchor=W) leftItemFrame = Frame(self) rightItemFrame = Frame(self) @@ -26,7 +26,7 @@ def item_page(parent): ## World State key = "worldstate" - self.itemWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "selectbox", leftItemFrame, @@ -39,11 +39,11 @@ def item_page(parent): "Inverted": "inverted" } ) - self.itemWidgets[key].pack(anchor=E) + self.widgets[key].pack(anchor=E) ## Logic Level key = "logiclevel" - self.itemWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "selectbox", leftItemFrame, @@ -56,11 +56,11 @@ def item_page(parent): "No Logic": "nologic" } ) - self.itemWidgets[key].pack(anchor=E) + self.widgets[key].pack(anchor=E) ## Goal key = "goal" - self.itemWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "selectbox", leftItemFrame, @@ -75,14 +75,14 @@ def item_page(parent): "Crystals": "crystals" } ) - self.itemWidgets[key].pack(anchor=E) + self.widgets[key].pack(anchor=E) ## Number of crystals to open GT key = "crystals_gt" keys = [*map(str,range(0,7+1)),"Random"] vals = [*map(str,range(0,7+1)),"random"] options = {keys[i]: vals[i] for i in range(len(keys))} - self.itemWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "selectbox", leftItemFrame, @@ -91,14 +91,14 @@ def item_page(parent): {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, options ) - self.itemWidgets[key].pack(anchor=E) + self.widgets[key].pack(anchor=E) ## Number of crystals to damage Ganon key = "crystals_ganon" keys = [*map(str,range(0,7+1)),"Random"] vals = [*map(str,range(0,7+1)),"random"] options = {keys[i]: vals[i] for i in range(len(keys))} - self.itemWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "selectbox", leftItemFrame, @@ -107,11 +107,11 @@ def item_page(parent): {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, options ) - self.itemWidgets[key].pack(anchor=E) + self.widgets[key].pack(anchor=E) ## Weapons key = "weapons" - self.itemWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "selectbox", leftItemFrame, @@ -125,11 +125,11 @@ def item_page(parent): "Vanilla": "vanilla" } ) - self.itemWidgets[key].pack(anchor=E) + self.widgets[key].pack(anchor=E) ## Item Pool key = "itempool" - self.itemWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "selectbox", rightItemFrame, @@ -142,11 +142,11 @@ def item_page(parent): "Expert": "expert" } ) - self.itemWidgets[key].pack(anchor=E) + self.widgets[key].pack(anchor=E) ## Item Functionality key = "itemfunction" - self.itemWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "selectbox", rightItemFrame, @@ -159,11 +159,11 @@ def item_page(parent): "Expert": "expert" } ) - self.itemWidgets[key].pack(anchor=E) + self.widgets[key].pack(anchor=E) ## Timer setting key = "timer" - self.itemWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "selectbox", rightItemFrame, @@ -179,11 +179,11 @@ def item_page(parent): "Timed Countdown": "timed-countdown" } ) - self.itemWidgets[key].pack(anchor=E) + self.widgets[key].pack(anchor=E) ## Progressives: On/Off key = "progressives" - self.itemWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "selectbox", rightItemFrame, @@ -196,11 +196,11 @@ def item_page(parent): "Random": "random" } ) - self.itemWidgets[key].pack(anchor=E) + self.widgets[key].pack(anchor=E) ## Accessibilty key = "accessibility" - self.itemWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "selectbox", rightItemFrame, @@ -213,11 +213,11 @@ def item_page(parent): "Beatable": "none" } ) - self.itemWidgets[key].pack(anchor=E) + self.widgets[key].pack(anchor=E) ## Item Sorting Algorithm key = "sortingalgo" - self.itemWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "selectbox", rightItemFrame, @@ -234,6 +234,6 @@ def item_page(parent): "Balanced": "balanced" } ) - self.itemWidgets[key].pack(anchor=E) + self.widgets[key].pack(anchor=E) return self From 5488c288af17c7d302f2980da174d3695385914c Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 02:19:14 -0800 Subject: [PATCH 051/117] Entrance Widgets --- gui/bottom.py | 6 +++--- gui/loadcliargs.py | 6 +++--- gui/randomize/entrando.py | 14 +++++++------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/gui/bottom.py b/gui/bottom.py index ddc77ce1..6ee29761 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -105,7 +105,7 @@ def create_guiargs(parent): guiargs.progressive = parent.pages["randomizer"].pages["item"].widgets["progressives"].storageVar.get() guiargs.accessibility = parent.pages["randomizer"].pages["item"].widgets["accessibility"].storageVar.get() guiargs.algorithm = parent.pages["randomizer"].pages["item"].widgets["sortingalgo"].storageVar.get() - guiargs.shuffle = parent.pages["randomizer"].pages["entrance"].entrandoWidgets["entranceshuffle"].storageVar.get() + guiargs.shuffle = parent.pages["randomizer"].pages["entrance"].widgets["entranceshuffle"].storageVar.get() guiargs.door_shuffle = parent.pages["randomizer"].pages["dungeon"].dungeonWidgets["dungeondoorshuffle"].storageVar.get() guiargs.experimental = parent.pages["randomizer"].pages["dungeon"].dungeonWidgets["experimental"].storageVar.get() guiargs.heartbeep = parent.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["heartbeep"].storageVar.get() @@ -114,7 +114,7 @@ def create_guiargs(parent): guiargs.create_spoiler = bool(parent.pages["randomizer"].pages["generation"].generationWidgets["spoiler"].storageVar.get()) guiargs.skip_playthrough = not bool(parent.pages["randomizer"].pages["generation"].generationWidgets["spoiler"].storageVar.get()) guiargs.suppress_rom = bool(parent.pages["randomizer"].pages["generation"].generationWidgets["suppressrom"].storageVar.get()) - guiargs.openpyramid = bool(parent.pages["randomizer"].pages["entrance"].entrandoWidgets["openpyramid"].storageVar.get()) + guiargs.openpyramid = bool(parent.pages["randomizer"].pages["entrance"].widgets["openpyramid"].storageVar.get()) guiargs.mapshuffle = bool(parent.pages["randomizer"].pages["dungeon"].dungeonWidgets["mapshuffle"].storageVar.get()) guiargs.compassshuffle = bool(parent.pages["randomizer"].pages["dungeon"].dungeonWidgets["compassshuffle"].storageVar.get()) guiargs.keyshuffle = bool(parent.pages["randomizer"].pages["dungeon"].dungeonWidgets["smallkeyshuffle"].storageVar.get()) @@ -124,7 +124,7 @@ def create_guiargs(parent): guiargs.disablemusic = bool(parent.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["nobgm"].storageVar.get()) guiargs.ow_palettes = parent.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["owpalettes"].storageVar.get() guiargs.uw_palettes = parent.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["uwpalettes"].storageVar.get() - guiargs.shuffleganon = bool(parent.pages["randomizer"].pages["entrance"].entrandoWidgets["shuffleganon"].storageVar.get()) + guiargs.shuffleganon = bool(parent.pages["randomizer"].pages["entrance"].widgets["shuffleganon"].storageVar.get()) guiargs.hints = bool(parent.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["hints"].storageVar.get()) guiargs.enemizercli = parent.pages["randomizer"].pages["enemizer"].enemizerCLIpathVar.get() guiargs.shufflebosses = parent.pages["randomizer"].pages["enemizer"].enemizerWidgets["bossshuffle"].storageVar.get() diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index 3abaf5c9..260de0c6 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -16,7 +16,7 @@ def loadcliargs(gui, args): gui.pages["randomizer"].pages["dungeon"].dungeonWidgets["smallkeyshuffle"].storageVar.set(args.keyshuffle) gui.pages["randomizer"].pages["dungeon"].dungeonWidgets["bigkeyshuffle"].storageVar.set(args.bigkeyshuffle) gui.pages["randomizer"].pages["item"].widgets["retro"].storageVar.set(args.retro) - gui.pages["randomizer"].pages["entrance"].entrandoWidgets["openpyramid"].storageVar.set(args.openpyramid) + gui.pages["randomizer"].pages["entrance"].widgets["openpyramid"].storageVar.set(args.openpyramid) gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["quickswap"].storageVar.set(int(args.quickswap)) gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["nobgm"].storageVar.set(int(args.disablemusic)) if args.multi: @@ -36,7 +36,7 @@ def loadcliargs(gui, args): gui.pages["randomizer"].pages["item"].widgets["crystals_gt"].storageVar.set(args.crystals_gt) gui.pages["randomizer"].pages["item"].widgets["crystals_ganon"].storageVar.set(args.crystals_ganon) gui.pages["randomizer"].pages["item"].widgets["sortingalgo"].storageVar.set(args.algorithm) - gui.pages["randomizer"].pages["entrance"].entrandoWidgets["entranceshuffle"].storageVar.set(args.shuffle) + gui.pages["randomizer"].pages["entrance"].widgets["entranceshuffle"].storageVar.set(args.shuffle) gui.pages["randomizer"].pages["dungeon"].dungeonWidgets["dungeondoorshuffle"].storageVar.set(args.door_shuffle) gui.pages["randomizer"].pages["dungeon"].dungeonWidgets["experimental"].storageVar.set(args.experimental) gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["heartcolor"].storageVar.set(args.heartcolor) @@ -44,7 +44,7 @@ def loadcliargs(gui, args): gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["menuspeed"].storageVar.set(args.fastmenu) gui.pages["randomizer"].pages["item"].widgets["logiclevel"].storageVar.set(args.logic) gui.pages["randomizer"].pages["generation"].romVar.set(args.rom) - gui.pages["randomizer"].pages["entrance"].entrandoWidgets["shuffleganon"].storageVar.set(args.shuffleganon) + gui.pages["randomizer"].pages["entrance"].widgets["shuffleganon"].storageVar.set(args.shuffleganon) gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["hints"].storageVar.set(args.hints) gui.pages["randomizer"].pages["enemizer"].enemizerCLIpathVar.set(args.enemizercli) gui.pages["randomizer"].pages["enemizer"].enemizerWidgets["potshuffle"].storageVar.set(args.shufflepots) diff --git a/gui/randomize/entrando.py b/gui/randomize/entrando.py index 1302d5a9..ab081bb9 100644 --- a/gui/randomize/entrando.py +++ b/gui/randomize/entrando.py @@ -6,33 +6,33 @@ def entrando_page(parent): self = ttk.Frame(parent) # Entrance Randomizer options - self.entrandoWidgets = {} + self.widgets = {} ## Pyramid pre-opened key = "openpyramid" - self.entrandoWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "checkbox", self, "Pre-open Pyramid Hole", None ) - self.entrandoWidgets[key].pack(anchor=W) + self.widgets[key].pack(anchor=W) ## Shuffle Ganon key = "shuffleganon" - self.entrandoWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "checkbox", self, "Include Ganon's Tower and Pyramid Hole in shuffle pool", None ) - self.entrandoWidgets[key].pack(anchor=W) + self.widgets[key].pack(anchor=W) ## Entrance Shuffle key = "entranceshuffle" - self.entrandoWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "selectbox", self, @@ -54,6 +54,6 @@ def entrando_page(parent): "Dungeons + Simple": "dungeonssimple" } ) - self.entrandoWidgets[key].pack(anchor=W) + self.widgets[key].pack(anchor=W) return self From 947778bc557bd16e91cb284d14a569f72dbf7d89 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 02:20:05 -0800 Subject: [PATCH 052/117] Enemizer Widgets --- gui/bottom.py | 10 +++++----- gui/loadcliargs.py | 10 +++++----- gui/randomize/enemizer.py | 22 +++++++++++----------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/gui/bottom.py b/gui/bottom.py index 6ee29761..6dbf3d13 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -127,11 +127,11 @@ def create_guiargs(parent): guiargs.shuffleganon = bool(parent.pages["randomizer"].pages["entrance"].widgets["shuffleganon"].storageVar.get()) guiargs.hints = bool(parent.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["hints"].storageVar.get()) guiargs.enemizercli = parent.pages["randomizer"].pages["enemizer"].enemizerCLIpathVar.get() - guiargs.shufflebosses = parent.pages["randomizer"].pages["enemizer"].enemizerWidgets["bossshuffle"].storageVar.get() - guiargs.shuffleenemies = parent.pages["randomizer"].pages["enemizer"].enemizerWidgets["enemyshuffle"].storageVar.get() - guiargs.enemy_health = parent.pages["randomizer"].pages["enemizer"].enemizerWidgets["enemyhealth"].storageVar.get() - guiargs.enemy_damage = parent.pages["randomizer"].pages["enemizer"].enemizerWidgets["enemydamage"].storageVar.get() - guiargs.shufflepots = bool(parent.pages["randomizer"].pages["enemizer"].enemizerWidgets["potshuffle"].storageVar.get()) + guiargs.shufflebosses = parent.pages["randomizer"].pages["enemizer"].widgets["bossshuffle"].storageVar.get() + guiargs.shuffleenemies = parent.pages["randomizer"].pages["enemizer"].widgets["enemyshuffle"].storageVar.get() + guiargs.enemy_health = parent.pages["randomizer"].pages["enemizer"].widgets["enemyhealth"].storageVar.get() + guiargs.enemy_damage = parent.pages["randomizer"].pages["enemizer"].widgets["enemydamage"].storageVar.get() + guiargs.shufflepots = bool(parent.pages["randomizer"].pages["enemizer"].widgets["potshuffle"].storageVar.get()) guiargs.custom = bool(parent.pages["randomizer"].pages["generation"].generationWidgets["usecustompool"].storageVar.get()) guiargs.customitemarray = [int(parent.pages["custom"].content.customWidgets["bow"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["silversupgrade"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["boomerang"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["redmerang"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["hookshot"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["mushroom"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["powder"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["firerod"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["icerod"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["bombos"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["ether"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["quake"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["lamp"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["hammer"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["shovel"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["flute"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["bugnet"].storageVar.get()), diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index 260de0c6..1f545dc9 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -47,11 +47,11 @@ def loadcliargs(gui, args): gui.pages["randomizer"].pages["entrance"].widgets["shuffleganon"].storageVar.set(args.shuffleganon) gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["hints"].storageVar.set(args.hints) gui.pages["randomizer"].pages["enemizer"].enemizerCLIpathVar.set(args.enemizercli) - gui.pages["randomizer"].pages["enemizer"].enemizerWidgets["potshuffle"].storageVar.set(args.shufflepots) - gui.pages["randomizer"].pages["enemizer"].enemizerWidgets["enemyshuffle"].storageVar.set(args.shuffleenemies) - gui.pages["randomizer"].pages["enemizer"].enemizerWidgets["bossshuffle"].storageVar.set(args.shufflebosses) - gui.pages["randomizer"].pages["enemizer"].enemizerWidgets["enemydamage"].storageVar.set(args.enemy_damage) - gui.pages["randomizer"].pages["enemizer"].enemizerWidgets["enemyhealth"].storageVar.set(args.enemy_health) + gui.pages["randomizer"].pages["enemizer"].widgets["potshuffle"].storageVar.set(args.shufflepots) + gui.pages["randomizer"].pages["enemizer"].widgets["enemyshuffle"].storageVar.set(args.shuffleenemies) + gui.pages["randomizer"].pages["enemizer"].widgets["bossshuffle"].storageVar.set(args.shufflebosses) + gui.pages["randomizer"].pages["enemizer"].widgets["enemydamage"].storageVar.set(args.enemy_damage) + gui.pages["randomizer"].pages["enemizer"].widgets["enemyhealth"].storageVar.set(args.enemy_health) gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["owpalettes"].storageVar.set(args.ow_palettes) gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["uwpalettes"].storageVar.set(args.uw_palettes) gui.outputPath.set(args.outputpath) diff --git a/gui/randomize/enemizer.py b/gui/randomize/enemizer.py index d3c08ebd..491e9b23 100644 --- a/gui/randomize/enemizer.py +++ b/gui/randomize/enemizer.py @@ -7,18 +7,18 @@ def enemizer_page(parent,settings): self = ttk.Frame(parent) # Enemizer options - self.enemizerWidgets = {} + self.widgets = {} # Pot Shuffle key = "potshuffle" - self.enemizerWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "checkbox", self, "Pot Shuffle", None ) - self.enemizerWidgets[key].pack(anchor=W) + self.widgets[key].pack(anchor=W) ## Enemizer CLI Path enemizerPathFrame = Frame(self) @@ -46,7 +46,7 @@ def enemizer_page(parent,settings): ## Randomize Enemies key = "enemyshuffle" - self.enemizerWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "selectbox", leftEnemizerFrame, @@ -59,11 +59,11 @@ def enemizer_page(parent,settings): "Chaos": "chaos" } ) - self.enemizerWidgets[key].pack(anchor=E) + self.widgets[key].pack(anchor=E) ## Randomize Bosses key = "bossshuffle" - self.enemizerWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "selectbox", leftEnemizerFrame, @@ -77,11 +77,11 @@ def enemizer_page(parent,settings): "Chaos": "chaos" } ) - self.enemizerWidgets[key].pack(anchor=E) + self.widgets[key].pack(anchor=E) ## Enemy Damage key = "enemydamage" - self.enemizerWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "selectbox", rightEnemizerFrame, @@ -94,11 +94,11 @@ def enemizer_page(parent,settings): "Chaos": "chaos" } ) - self.enemizerWidgets[key].pack(anchor=E) + self.widgets[key].pack(anchor=E) ## Enemy Health key = "enemyhealth" - self.enemizerWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "selectbox", rightEnemizerFrame, @@ -113,6 +113,6 @@ def enemizer_page(parent,settings): "Expert": "expert" } ) - self.enemizerWidgets[key].pack(anchor=E) + self.widgets[key].pack(anchor=E) return self,settings From 4dd8bfa67f8b153ba70587ada06e2671fa3317e3 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 02:21:01 -0800 Subject: [PATCH 053/117] Dungeon Rando Widgets --- gui/bottom.py | 12 ++++++------ gui/loadcliargs.py | 12 ++++++------ gui/randomize/dungeon.py | 26 +++++++++++++------------- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/gui/bottom.py b/gui/bottom.py index 6dbf3d13..68f9f739 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -106,8 +106,8 @@ def create_guiargs(parent): guiargs.accessibility = parent.pages["randomizer"].pages["item"].widgets["accessibility"].storageVar.get() guiargs.algorithm = parent.pages["randomizer"].pages["item"].widgets["sortingalgo"].storageVar.get() guiargs.shuffle = parent.pages["randomizer"].pages["entrance"].widgets["entranceshuffle"].storageVar.get() - guiargs.door_shuffle = parent.pages["randomizer"].pages["dungeon"].dungeonWidgets["dungeondoorshuffle"].storageVar.get() - guiargs.experimental = parent.pages["randomizer"].pages["dungeon"].dungeonWidgets["experimental"].storageVar.get() + guiargs.door_shuffle = parent.pages["randomizer"].pages["dungeon"].widgets["dungeondoorshuffle"].storageVar.get() + guiargs.experimental = parent.pages["randomizer"].pages["dungeon"].widgets["experimental"].storageVar.get() guiargs.heartbeep = parent.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["heartbeep"].storageVar.get() guiargs.heartcolor = parent.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["heartcolor"].storageVar.get() guiargs.fastmenu = parent.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["menuspeed"].storageVar.get() @@ -115,10 +115,10 @@ def create_guiargs(parent): guiargs.skip_playthrough = not bool(parent.pages["randomizer"].pages["generation"].generationWidgets["spoiler"].storageVar.get()) guiargs.suppress_rom = bool(parent.pages["randomizer"].pages["generation"].generationWidgets["suppressrom"].storageVar.get()) guiargs.openpyramid = bool(parent.pages["randomizer"].pages["entrance"].widgets["openpyramid"].storageVar.get()) - guiargs.mapshuffle = bool(parent.pages["randomizer"].pages["dungeon"].dungeonWidgets["mapshuffle"].storageVar.get()) - guiargs.compassshuffle = bool(parent.pages["randomizer"].pages["dungeon"].dungeonWidgets["compassshuffle"].storageVar.get()) - guiargs.keyshuffle = bool(parent.pages["randomizer"].pages["dungeon"].dungeonWidgets["smallkeyshuffle"].storageVar.get()) - guiargs.bigkeyshuffle = bool(parent.pages["randomizer"].pages["dungeon"].dungeonWidgets["bigkeyshuffle"].storageVar.get()) + guiargs.mapshuffle = bool(parent.pages["randomizer"].pages["dungeon"].widgets["mapshuffle"].storageVar.get()) + guiargs.compassshuffle = bool(parent.pages["randomizer"].pages["dungeon"].widgets["compassshuffle"].storageVar.get()) + guiargs.keyshuffle = bool(parent.pages["randomizer"].pages["dungeon"].widgets["smallkeyshuffle"].storageVar.get()) + guiargs.bigkeyshuffle = bool(parent.pages["randomizer"].pages["dungeon"].widgets["bigkeyshuffle"].storageVar.get()) guiargs.retro = bool(parent.pages["randomizer"].pages["item"].widgets["retro"].storageVar.get()) guiargs.quickswap = bool(parent.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["quickswap"].storageVar.get()) guiargs.disablemusic = bool(parent.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["nobgm"].storageVar.get()) diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index 1f545dc9..7b4376de 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -11,10 +11,10 @@ def loadcliargs(gui, args): # load values from commandline args gui.pages["randomizer"].pages["generation"].generationWidgets["spoiler"].storageVar.set(int(args.create_spoiler)) gui.pages["randomizer"].pages["generation"].generationWidgets["suppressrom"].storageVar.set(int(args.suppress_rom)) - gui.pages["randomizer"].pages["dungeon"].dungeonWidgets["mapshuffle"].storageVar.set(args.mapshuffle) - gui.pages["randomizer"].pages["dungeon"].dungeonWidgets["compassshuffle"].storageVar.set(args.compassshuffle) - gui.pages["randomizer"].pages["dungeon"].dungeonWidgets["smallkeyshuffle"].storageVar.set(args.keyshuffle) - gui.pages["randomizer"].pages["dungeon"].dungeonWidgets["bigkeyshuffle"].storageVar.set(args.bigkeyshuffle) + gui.pages["randomizer"].pages["dungeon"].widgets["mapshuffle"].storageVar.set(args.mapshuffle) + gui.pages["randomizer"].pages["dungeon"].widgets["compassshuffle"].storageVar.set(args.compassshuffle) + gui.pages["randomizer"].pages["dungeon"].widgets["smallkeyshuffle"].storageVar.set(args.keyshuffle) + gui.pages["randomizer"].pages["dungeon"].widgets["bigkeyshuffle"].storageVar.set(args.bigkeyshuffle) gui.pages["randomizer"].pages["item"].widgets["retro"].storageVar.set(args.retro) gui.pages["randomizer"].pages["entrance"].widgets["openpyramid"].storageVar.set(args.openpyramid) gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["quickswap"].storageVar.set(int(args.quickswap)) @@ -37,8 +37,8 @@ def loadcliargs(gui, args): gui.pages["randomizer"].pages["item"].widgets["crystals_ganon"].storageVar.set(args.crystals_ganon) gui.pages["randomizer"].pages["item"].widgets["sortingalgo"].storageVar.set(args.algorithm) gui.pages["randomizer"].pages["entrance"].widgets["entranceshuffle"].storageVar.set(args.shuffle) - gui.pages["randomizer"].pages["dungeon"].dungeonWidgets["dungeondoorshuffle"].storageVar.set(args.door_shuffle) - gui.pages["randomizer"].pages["dungeon"].dungeonWidgets["experimental"].storageVar.set(args.experimental) + gui.pages["randomizer"].pages["dungeon"].widgets["dungeondoorshuffle"].storageVar.set(args.door_shuffle) + gui.pages["randomizer"].pages["dungeon"].widgets["experimental"].storageVar.set(args.experimental) gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["heartcolor"].storageVar.set(args.heartcolor) gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["heartbeep"].storageVar.set(args.heartbeep) gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["menuspeed"].storageVar.set(args.fastmenu) diff --git a/gui/randomize/dungeon.py b/gui/randomize/dungeon.py index ad372ead..973e4830 100644 --- a/gui/randomize/dungeon.py +++ b/gui/randomize/dungeon.py @@ -6,7 +6,7 @@ def dungeon_page(parent): self = ttk.Frame(parent) # Dungeon Shuffle options - self.dungeonWidgets = {} + self.widgets = {} ## Dungeon Item Shuffle mcsbshuffleFrame = Frame(self) @@ -16,51 +16,51 @@ def dungeon_page(parent): ## Map Shuffle key = "mapshuffle" - self.dungeonWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "checkbox", mcsbshuffleFrame, "Maps", None ) - self.dungeonWidgets[key].pack(side=LEFT) + self.widgets[key].pack(side=LEFT) ## Compass Shuffle key = "compassshuffle" - self.dungeonWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "checkbox", mcsbshuffleFrame, "Compasses", None ) - self.dungeonWidgets[key].pack(side=LEFT) + self.widgets[key].pack(side=LEFT) ## Small Key Shuffle key = "smallkeyshuffle" - self.dungeonWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "checkbox", mcsbshuffleFrame, "Small Keys", None ) - self.dungeonWidgets[key].pack(side=LEFT) + self.widgets[key].pack(side=LEFT) ## Big Key Shuffle key = "bigkeyshuffle" - self.dungeonWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "checkbox", mcsbshuffleFrame, "Big Keys", None ) - self.dungeonWidgets[key].pack(side=LEFT) + self.widgets[key].pack(side=LEFT) ## Dungeon Door Shuffle key = "dungeondoorshuffle" - self.dungeonWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "selectbox", self, @@ -73,17 +73,17 @@ def dungeon_page(parent): "Crossed": "crossed" } ) - self.dungeonWidgets[key].pack(anchor=W) + self.widgets[key].pack(anchor=W) # Experimental features key = "experimental" - self.dungeonWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "checkbox", self, "Enable Experimental Features", None ) - self.dungeonWidgets[key].pack(anchor=W) + self.widgets[key].pack(anchor=W) return self From cbb7a3e932f8e951c4196d7819f530e447732239 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 02:21:47 -0800 Subject: [PATCH 054/117] Multiworld Widgets --- gui/bottom.py | 2 +- gui/loadcliargs.py | 2 +- gui/randomize/multiworld.py | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/gui/bottom.py b/gui/bottom.py index 68f9f739..40326910 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -88,7 +88,7 @@ def bottom_frame(self, parent, args=None): def create_guiargs(parent): guiargs = Namespace() - guiargs.multi = int(parent.pages["randomizer"].pages["multiworld"].multiworldWidgets["worlds"].storageVar.get()) + guiargs.multi = int(parent.pages["randomizer"].pages["multiworld"].widgets["worlds"].storageVar.get()) guiargs.names = parent.pages["randomizer"].pages["multiworld"].namesVar.get() guiargs.seed = int(parent.frames["bottom"].seedVar.get()) if parent.frames["bottom"].seedVar.get() else None guiargs.count = int(parent.frames["bottom"].widgets["generationcount"].storageVar.get()) if parent.frames["bottom"].widgets["generationcount"].storageVar.get() != '1' else None diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index 7b4376de..b4bf37be 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -20,7 +20,7 @@ def loadcliargs(gui, args): gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["quickswap"].storageVar.set(int(args.quickswap)) gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["nobgm"].storageVar.set(int(args.disablemusic)) if args.multi: - gui.pages["randomizer"].pages["multiworld"].multiworldWidgets["worlds"].storageVar.set(str(args.multi)) + gui.pages["randomizer"].pages["multiworld"].widgets["worlds"].storageVar.set(str(args.multi)) if args.count: gui.frames["bottom"].widgets["generationcount"].storageVar.set(str(args.count)) if args.seed: diff --git a/gui/randomize/multiworld.py b/gui/randomize/multiworld.py index ee8b9d47..2bfbe06a 100644 --- a/gui/randomize/multiworld.py +++ b/gui/randomize/multiworld.py @@ -6,11 +6,11 @@ def multiworld_page(parent,settings): self = ttk.Frame(parent) # Multiworld options - self.multiworldWidgets = {} + self.widgets = {} ## Number of Worlds key = "worlds" - self.multiworldWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "spinbox", self, @@ -18,7 +18,7 @@ def multiworld_page(parent,settings): None, {"label": {"side": LEFT}, "spinbox": {"side": RIGHT}} ) - self.multiworldWidgets[key].pack(side=LEFT, anchor=N) + self.widgets[key].pack(side=LEFT, anchor=N) ## List of Player Names namesFrame = Frame(self) From 88f7e34670813ac1495b13e489523bb93efe538d Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 02:23:20 -0800 Subject: [PATCH 055/117] Game Options Widgets Eventually split from Adjust --- gui/adjust/overview.py | 14 +++++------ gui/bottom.py | 18 +++++++------- gui/loadcliargs.py | 20 +++++++-------- gui/randomize/gameoptions.py | 48 ++++++++++++++++++------------------ 4 files changed, 50 insertions(+), 50 deletions(-) diff --git a/gui/adjust/overview.py b/gui/adjust/overview.py index 599d01ac..9e4e993b 100644 --- a/gui/adjust/overview.py +++ b/gui/adjust/overview.py @@ -20,7 +20,7 @@ def adjust_page(top, parent, settings): "checkbox", self, "Disable Music & MSU-1", - top.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["nobgm"].storageVar + top.pages["randomizer"].pages["gameoptions"].widgets["nobgm"].storageVar ) self.adjustWidgets[key].pack(anchor=W) @@ -31,7 +31,7 @@ def adjust_page(top, parent, settings): "checkbox", self, "L/R Quickswapping", - top.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["quickswap"].storageVar + top.pages["randomizer"].pages["gameoptions"].widgets["quickswap"].storageVar ) self.adjustWidgets[key].pack(anchor=W) @@ -51,7 +51,7 @@ def adjust_page(top, parent, settings): "selectbox", leftAdjustFrame, "Heart Color", - top.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["heartcolor"].storageVar, + top.pages["randomizer"].pages["gameoptions"].widgets["heartcolor"].storageVar, {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, { "Red": "red", @@ -70,7 +70,7 @@ def adjust_page(top, parent, settings): "selectbox", leftAdjustFrame, "Heart Beep sound rate", - top.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["heartbeep"].storageVar, + top.pages["randomizer"].pages["gameoptions"].widgets["heartbeep"].storageVar, {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}, "default": "Normal"}, { "Double": "double", @@ -115,7 +115,7 @@ def adjust_page(top, parent, settings): "selectbox", rightAdjustFrame, "Menu Speed", - top.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["menuspeed"].storageVar, + top.pages["randomizer"].pages["gameoptions"].widgets["menuspeed"].storageVar, {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}, "default": "Normal"}, { "Instant": "instant", @@ -135,7 +135,7 @@ def adjust_page(top, parent, settings): "selectbox", rightAdjustFrame, "Overworld Palettes", - top.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["owpalettes"].storageVar, + top.pages["randomizer"].pages["gameoptions"].widgets["owpalettes"].storageVar, {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, { "Default": "default", @@ -152,7 +152,7 @@ def adjust_page(top, parent, settings): "selectbox", rightAdjustFrame, "Underworld Palettes", - top.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["uwpalettes"].storageVar, + top.pages["randomizer"].pages["gameoptions"].widgets["uwpalettes"].storageVar, {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, { "Default": "default", diff --git a/gui/bottom.py b/gui/bottom.py index 40326910..28e077e9 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -108,9 +108,9 @@ def create_guiargs(parent): guiargs.shuffle = parent.pages["randomizer"].pages["entrance"].widgets["entranceshuffle"].storageVar.get() guiargs.door_shuffle = parent.pages["randomizer"].pages["dungeon"].widgets["dungeondoorshuffle"].storageVar.get() guiargs.experimental = parent.pages["randomizer"].pages["dungeon"].widgets["experimental"].storageVar.get() - guiargs.heartbeep = parent.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["heartbeep"].storageVar.get() - guiargs.heartcolor = parent.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["heartcolor"].storageVar.get() - guiargs.fastmenu = parent.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["menuspeed"].storageVar.get() + guiargs.heartbeep = parent.pages["randomizer"].pages["gameoptions"].widgets["heartbeep"].storageVar.get() + guiargs.heartcolor = parent.pages["randomizer"].pages["gameoptions"].widgets["heartcolor"].storageVar.get() + guiargs.fastmenu = parent.pages["randomizer"].pages["gameoptions"].widgets["menuspeed"].storageVar.get() guiargs.create_spoiler = bool(parent.pages["randomizer"].pages["generation"].generationWidgets["spoiler"].storageVar.get()) guiargs.skip_playthrough = not bool(parent.pages["randomizer"].pages["generation"].generationWidgets["spoiler"].storageVar.get()) guiargs.suppress_rom = bool(parent.pages["randomizer"].pages["generation"].generationWidgets["suppressrom"].storageVar.get()) @@ -120,12 +120,12 @@ def create_guiargs(parent): guiargs.keyshuffle = bool(parent.pages["randomizer"].pages["dungeon"].widgets["smallkeyshuffle"].storageVar.get()) guiargs.bigkeyshuffle = bool(parent.pages["randomizer"].pages["dungeon"].widgets["bigkeyshuffle"].storageVar.get()) guiargs.retro = bool(parent.pages["randomizer"].pages["item"].widgets["retro"].storageVar.get()) - guiargs.quickswap = bool(parent.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["quickswap"].storageVar.get()) - guiargs.disablemusic = bool(parent.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["nobgm"].storageVar.get()) - guiargs.ow_palettes = parent.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["owpalettes"].storageVar.get() - guiargs.uw_palettes = parent.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["uwpalettes"].storageVar.get() + guiargs.quickswap = bool(parent.pages["randomizer"].pages["gameoptions"].widgets["quickswap"].storageVar.get()) + guiargs.disablemusic = bool(parent.pages["randomizer"].pages["gameoptions"].widgets["nobgm"].storageVar.get()) + guiargs.ow_palettes = parent.pages["randomizer"].pages["gameoptions"].widgets["owpalettes"].storageVar.get() + guiargs.uw_palettes = parent.pages["randomizer"].pages["gameoptions"].widgets["uwpalettes"].storageVar.get() guiargs.shuffleganon = bool(parent.pages["randomizer"].pages["entrance"].widgets["shuffleganon"].storageVar.get()) - guiargs.hints = bool(parent.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["hints"].storageVar.get()) + guiargs.hints = bool(parent.pages["randomizer"].pages["gameoptions"].widgets["hints"].storageVar.get()) guiargs.enemizercli = parent.pages["randomizer"].pages["enemizer"].enemizerCLIpathVar.get() guiargs.shufflebosses = parent.pages["randomizer"].pages["enemizer"].widgets["bossshuffle"].storageVar.get() guiargs.shuffleenemies = parent.pages["randomizer"].pages["enemizer"].widgets["enemyshuffle"].storageVar.get() @@ -143,7 +143,7 @@ def create_guiargs(parent): int(parent.pages["custom"].content.customWidgets["rupee300"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["rupoor"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["blueclock"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["greenclock"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["redclock"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["progressivebow"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["bomb10"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["triforcepieces"].storageVar.get()),int(parent.pages["custom"].content.customWidgets["triforcepiecesgoal"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["triforce"].storageVar.get()),int(parent.pages["custom"].content.customWidgets["rupoorcost"].storageVar.get()),int(parent.pages["custom"].content.customWidgets["generickeys"].storageVar.get())] guiargs.rom = parent.pages["randomizer"].pages["generation"].romVar.get() - guiargs.sprite = parent.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["sprite"]["spriteObject"] + guiargs.sprite = parent.pages["randomizer"].pages["gameoptions"].widgets["sprite"]["spriteObject"] guiargs.randomSprite = parent.randomSprite.get() guiargs.outputpath = parent.outputPath.get() return guiargs diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index b4bf37be..15b6607a 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -17,8 +17,8 @@ def loadcliargs(gui, args): gui.pages["randomizer"].pages["dungeon"].widgets["bigkeyshuffle"].storageVar.set(args.bigkeyshuffle) gui.pages["randomizer"].pages["item"].widgets["retro"].storageVar.set(args.retro) gui.pages["randomizer"].pages["entrance"].widgets["openpyramid"].storageVar.set(args.openpyramid) - gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["quickswap"].storageVar.set(int(args.quickswap)) - gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["nobgm"].storageVar.set(int(args.disablemusic)) + gui.pages["randomizer"].pages["gameoptions"].widgets["quickswap"].storageVar.set(int(args.quickswap)) + gui.pages["randomizer"].pages["gameoptions"].widgets["nobgm"].storageVar.set(int(args.disablemusic)) if args.multi: gui.pages["randomizer"].pages["multiworld"].widgets["worlds"].storageVar.set(str(args.multi)) if args.count: @@ -39,30 +39,30 @@ def loadcliargs(gui, args): gui.pages["randomizer"].pages["entrance"].widgets["entranceshuffle"].storageVar.set(args.shuffle) gui.pages["randomizer"].pages["dungeon"].widgets["dungeondoorshuffle"].storageVar.set(args.door_shuffle) gui.pages["randomizer"].pages["dungeon"].widgets["experimental"].storageVar.set(args.experimental) - gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["heartcolor"].storageVar.set(args.heartcolor) - gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["heartbeep"].storageVar.set(args.heartbeep) - gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["menuspeed"].storageVar.set(args.fastmenu) + gui.pages["randomizer"].pages["gameoptions"].widgets["heartcolor"].storageVar.set(args.heartcolor) + gui.pages["randomizer"].pages["gameoptions"].widgets["heartbeep"].storageVar.set(args.heartbeep) + gui.pages["randomizer"].pages["gameoptions"].widgets["menuspeed"].storageVar.set(args.fastmenu) gui.pages["randomizer"].pages["item"].widgets["logiclevel"].storageVar.set(args.logic) gui.pages["randomizer"].pages["generation"].romVar.set(args.rom) gui.pages["randomizer"].pages["entrance"].widgets["shuffleganon"].storageVar.set(args.shuffleganon) - gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["hints"].storageVar.set(args.hints) + gui.pages["randomizer"].pages["gameoptions"].widgets["hints"].storageVar.set(args.hints) gui.pages["randomizer"].pages["enemizer"].enemizerCLIpathVar.set(args.enemizercli) gui.pages["randomizer"].pages["enemizer"].widgets["potshuffle"].storageVar.set(args.shufflepots) gui.pages["randomizer"].pages["enemizer"].widgets["enemyshuffle"].storageVar.set(args.shuffleenemies) gui.pages["randomizer"].pages["enemizer"].widgets["bossshuffle"].storageVar.set(args.shufflebosses) gui.pages["randomizer"].pages["enemizer"].widgets["enemydamage"].storageVar.set(args.enemy_damage) gui.pages["randomizer"].pages["enemizer"].widgets["enemyhealth"].storageVar.set(args.enemy_health) - gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["owpalettes"].storageVar.set(args.ow_palettes) - gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["uwpalettes"].storageVar.set(args.uw_palettes) + gui.pages["randomizer"].pages["gameoptions"].widgets["owpalettes"].storageVar.set(args.ow_palettes) + gui.pages["randomizer"].pages["gameoptions"].widgets["uwpalettes"].storageVar.set(args.uw_palettes) gui.outputPath.set(args.outputpath) def sprite_setter(spriteObject): - gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["sprite"]["spriteObject"] = spriteObject + gui.pages["randomizer"].pages["gameoptions"].widgets["sprite"]["spriteObject"] = spriteObject if args.sprite is not None: sprite_obj = args.sprite if isinstance(args.sprite, Sprite) else Sprite(args.sprite) r_sprite_flag = args.randomSprite if hasattr(args, 'randomSprite') else False set_sprite(sprite_obj, r_sprite_flag, spriteSetter=sprite_setter, - spriteNameVar=gui.pages["randomizer"].pages["gameoptions"].gameOptionsWidgets["sprite"]["spriteNameVar"], + spriteNameVar=gui.pages["randomizer"].pages["gameoptions"].widgets["sprite"]["spriteNameVar"], randomSpriteVar=gui.randomSprite) gui.pages["adjust"].content.adjustWidgets["nobgm"].storageVar.set(int(args.disablemusic)) diff --git a/gui/randomize/gameoptions.py b/gui/randomize/gameoptions.py index ae543e18..ecd3705d 100644 --- a/gui/randomize/gameoptions.py +++ b/gui/randomize/gameoptions.py @@ -9,40 +9,40 @@ def gameoptions_page(top, parent): self = ttk.Frame(parent) # Game Options options - self.gameOptionsWidgets = {} + self.widgets = {} ## Hints: Useful/Not useful key = "hints" - self.gameOptionsWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "checkbox", self, "Include Helpful Hints", None ) - self.gameOptionsWidgets[key].pack(anchor=W) + self.widgets[key].pack(anchor=W) ## Disable BGM key = "nobgm" - self.gameOptionsWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "checkbox", self, "Disable Music & MSU-1", None ) - self.gameOptionsWidgets[key].pack(anchor=W) + self.widgets[key].pack(anchor=W) ## L/R Quickswap key = "quickswap" - self.gameOptionsWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "checkbox", self, "L/R Quickswapping", None ) - self.gameOptionsWidgets[key].pack(anchor=W) + self.widgets[key].pack(anchor=W) leftRomOptionsFrame = Frame(self) rightRomOptionsFrame = Frame(self) @@ -51,7 +51,7 @@ def gameoptions_page(top, parent): ## Heart Color key = "heartcolor" - self.gameOptionsWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "selectbox", leftRomOptionsFrame, @@ -66,11 +66,11 @@ def gameoptions_page(top, parent): "Random": "random" } ) - self.gameOptionsWidgets[key].pack(anchor=E) + self.widgets[key].pack(anchor=E) ## Heart Beep Speed key = "heartbeep" - self.gameOptionsWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "selectbox", leftRomOptionsFrame, @@ -85,25 +85,25 @@ def gameoptions_page(top, parent): "Off": "off" } ) - self.gameOptionsWidgets[key].pack(anchor=W) + self.widgets[key].pack(anchor=W) ## Sprite selection spriteDialogFrame = Frame(leftRomOptionsFrame) baseSpriteLabel = Label(spriteDialogFrame, text='Sprite:') - self.gameOptionsWidgets["sprite"] = {} - self.gameOptionsWidgets["sprite"]["spriteObject"] = None - self.gameOptionsWidgets["sprite"]["spriteNameVar"] = StringVar() + self.widgets["sprite"] = {} + self.widgets["sprite"]["spriteObject"] = None + self.widgets["sprite"]["spriteNameVar"] = StringVar() - self.gameOptionsWidgets["sprite"]["spriteNameVar"].set('(unchanged)') - spriteEntry = Label(spriteDialogFrame, textvariable=self.gameOptionsWidgets["sprite"]["spriteNameVar"]) + self.widgets["sprite"]["spriteNameVar"].set('(unchanged)') + spriteEntry = Label(spriteDialogFrame, textvariable=self.widgets["sprite"]["spriteNameVar"]) def sprite_setter(spriteObject): - self.gameOptionsWidgets["sprite"]["spriteObject"] = spriteObject + self.widgets["sprite"]["spriteObject"] = spriteObject def sprite_select(): spriteSelector.SpriteSelector(parent, partial(set_sprite, spriteSetter=sprite_setter, - spriteNameVar=self.gameOptionsWidgets["sprite"]["spriteNameVar"], + spriteNameVar=self.widgets["sprite"]["spriteNameVar"], randomSpriteVar=top.randomSprite)) spriteSelectButton = Button(spriteDialogFrame, text='...', command=sprite_select) @@ -115,7 +115,7 @@ def gameoptions_page(top, parent): ## Menu Speed key = "menuspeed" - self.gameOptionsWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "selectbox", rightRomOptionsFrame, @@ -131,11 +131,11 @@ def gameoptions_page(top, parent): "Half": "half" } ) - self.gameOptionsWidgets[key].pack(anchor=E) + self.widgets[key].pack(anchor=E) ## Overworld Palettes (not Enemizer) key = "owpalettes" - self.gameOptionsWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "selectbox", rightRomOptionsFrame, @@ -148,11 +148,11 @@ def gameoptions_page(top, parent): "Blackout": "blackout" } ) - self.gameOptionsWidgets[key].pack(anchor=E) + self.widgets[key].pack(anchor=E) ## Underworld Palettes (not Enemizer) key = "uwpalettes" - self.gameOptionsWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "selectbox", rightRomOptionsFrame, @@ -165,7 +165,7 @@ def gameoptions_page(top, parent): "Blackout": "blackout" } ) - self.gameOptionsWidgets[key].pack(anchor=E) + self.widgets[key].pack(anchor=E) return self From 7a12d0281616766548d6a2e5d2f0cdb86c2d714c Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 02:24:04 -0800 Subject: [PATCH 056/117] Generation Widgets --- gui/bottom.py | 8 ++++---- gui/loadcliargs.py | 4 ++-- gui/randomize/generation.py | 14 +++++++------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/gui/bottom.py b/gui/bottom.py index 28e077e9..86b8b83c 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -111,9 +111,9 @@ def create_guiargs(parent): guiargs.heartbeep = parent.pages["randomizer"].pages["gameoptions"].widgets["heartbeep"].storageVar.get() guiargs.heartcolor = parent.pages["randomizer"].pages["gameoptions"].widgets["heartcolor"].storageVar.get() guiargs.fastmenu = parent.pages["randomizer"].pages["gameoptions"].widgets["menuspeed"].storageVar.get() - guiargs.create_spoiler = bool(parent.pages["randomizer"].pages["generation"].generationWidgets["spoiler"].storageVar.get()) - guiargs.skip_playthrough = not bool(parent.pages["randomizer"].pages["generation"].generationWidgets["spoiler"].storageVar.get()) - guiargs.suppress_rom = bool(parent.pages["randomizer"].pages["generation"].generationWidgets["suppressrom"].storageVar.get()) + guiargs.create_spoiler = bool(parent.pages["randomizer"].pages["generation"].widgets["spoiler"].storageVar.get()) + guiargs.skip_playthrough = not bool(parent.pages["randomizer"].pages["generation"].widgets["spoiler"].storageVar.get()) + guiargs.suppress_rom = bool(parent.pages["randomizer"].pages["generation"].widgets["suppressrom"].storageVar.get()) guiargs.openpyramid = bool(parent.pages["randomizer"].pages["entrance"].widgets["openpyramid"].storageVar.get()) guiargs.mapshuffle = bool(parent.pages["randomizer"].pages["dungeon"].widgets["mapshuffle"].storageVar.get()) guiargs.compassshuffle = bool(parent.pages["randomizer"].pages["dungeon"].widgets["compassshuffle"].storageVar.get()) @@ -132,7 +132,7 @@ def create_guiargs(parent): guiargs.enemy_health = parent.pages["randomizer"].pages["enemizer"].widgets["enemyhealth"].storageVar.get() guiargs.enemy_damage = parent.pages["randomizer"].pages["enemizer"].widgets["enemydamage"].storageVar.get() guiargs.shufflepots = bool(parent.pages["randomizer"].pages["enemizer"].widgets["potshuffle"].storageVar.get()) - guiargs.custom = bool(parent.pages["randomizer"].pages["generation"].generationWidgets["usecustompool"].storageVar.get()) + guiargs.custom = bool(parent.pages["randomizer"].pages["generation"].widgets["usecustompool"].storageVar.get()) guiargs.customitemarray = [int(parent.pages["custom"].content.customWidgets["bow"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["silversupgrade"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["boomerang"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["redmerang"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["hookshot"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["mushroom"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["powder"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["firerod"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["icerod"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["bombos"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["ether"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["quake"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["lamp"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["hammer"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["shovel"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["flute"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["bugnet"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["book"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["bottle"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["somaria"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["byrna"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["cape"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["mirror"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["boots"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["powerglove"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["titansmitt"].storageVar.get()), diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index 15b6607a..3379fb28 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -9,8 +9,8 @@ def loadcliargs(gui, args): if type(v) is dict: setattr(args, k, v[1]) # only get values for player 1 for now # load values from commandline args - gui.pages["randomizer"].pages["generation"].generationWidgets["spoiler"].storageVar.set(int(args.create_spoiler)) - gui.pages["randomizer"].pages["generation"].generationWidgets["suppressrom"].storageVar.set(int(args.suppress_rom)) + gui.pages["randomizer"].pages["generation"].widgets["spoiler"].storageVar.set(int(args.create_spoiler)) + gui.pages["randomizer"].pages["generation"].widgets["suppressrom"].storageVar.set(int(args.suppress_rom)) gui.pages["randomizer"].pages["dungeon"].widgets["mapshuffle"].storageVar.set(args.mapshuffle) gui.pages["randomizer"].pages["dungeon"].widgets["compassshuffle"].storageVar.set(args.compassshuffle) gui.pages["randomizer"].pages["dungeon"].widgets["smallkeyshuffle"].storageVar.set(args.keyshuffle) diff --git a/gui/randomize/generation.py b/gui/randomize/generation.py index aea9c5e9..2095a4bc 100644 --- a/gui/randomize/generation.py +++ b/gui/randomize/generation.py @@ -7,40 +7,40 @@ def generation_page(parent,settings): self = ttk.Frame(parent) # Generation Setup options - self.generationWidgets = {} + self.widgets = {} ## Generate Spoiler key = "spoiler" - self.generationWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "checkbox", self, "Create Spoiler Log", None ) - self.generationWidgets[key].pack(anchor=W) + self.widgets[key].pack(anchor=W) ## Don't make ROM key = "suppressrom" - self.generationWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "checkbox", self, "Do not create patched ROM", None ) - self.generationWidgets[key].pack(anchor=W) + self.widgets[key].pack(anchor=W) ## Use Custom Item Pool as defined in Custom tab key = "usecustompool" - self.generationWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "checkbox", self, "Use custom item pool", None ) - self.generationWidgets[key].pack(anchor=W) + self.widgets[key].pack(anchor=W) ## Locate base ROM baseRomFrame = Frame(self) From f32134454151ef291eafd30f957512f931afa9a7 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 02:27:24 -0800 Subject: [PATCH 057/117] Fix count complaints --- CLI.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CLI.py b/CLI.py index 3a8923ee..1b836b8b 100644 --- a/CLI.py +++ b/CLI.py @@ -209,7 +209,7 @@ def parse_arguments(argv, no_defaults=False): parser.add_argument('--rom', default=defval(settings["rom"]), help='Path to an ALttP JAP(1.0) rom to use as a base.') parser.add_argument('--loglevel', default=defval('info'), const='info', nargs='?', choices=['error', 'info', 'warning', 'debug'], help='Select level of logging for output.') parser.add_argument('--seed', default=defval(int(settings["seed"]) if settings["seed"] is not "" and settings["seed"] is not None else None), help='Define seed number to generate.', type=int) - parser.add_argument('--count', default=defval(int(settings["count"])), help='''\ + parser.add_argument('--count', default=defval(int(settings["count"]) if settings["count"] is not "" and settings["count"] is not None else 1), help='''\ Use to batch generate multiple seeds with same settings. If --seed is provided, it will be used for the first seed, then used to derive the next seed (i.e. generating 10 seeds with @@ -294,7 +294,7 @@ def parse_arguments(argv, no_defaults=False): parser.add_argument(f'--p{player}', default=defval(''), help=argparse.SUPPRESS) ret = parser.parse_args(argv) - print(ret) + if ret.keysanity: ret.mapshuffle, ret.compassshuffle, ret.keyshuffle, ret.bigkeyshuffle = [True] * 4 From 31f7b839902f1b0202d89ae2dbf4d7c1bacfa66d Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 02:31:20 -0800 Subject: [PATCH 058/117] Sort Items args --- gui/bottom.py | 13 +++++++------ gui/loadcliargs.py | 27 ++++++++++++++------------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/gui/bottom.py b/gui/bottom.py index 86b8b83c..766efa64 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -88,13 +88,9 @@ def bottom_frame(self, parent, args=None): def create_guiargs(parent): guiargs = Namespace() - guiargs.multi = int(parent.pages["randomizer"].pages["multiworld"].widgets["worlds"].storageVar.get()) - guiargs.names = parent.pages["randomizer"].pages["multiworld"].namesVar.get() - guiargs.seed = int(parent.frames["bottom"].seedVar.get()) if parent.frames["bottom"].seedVar.get() else None - guiargs.count = int(parent.frames["bottom"].widgets["generationcount"].storageVar.get()) if parent.frames["bottom"].widgets["generationcount"].storageVar.get() != '1' else None + guiargs.retro = bool(parent.pages["randomizer"].pages["item"].widgets["retro"].storageVar.get()) guiargs.mode = parent.pages["randomizer"].pages["item"].widgets["worldstate"].storageVar.get() guiargs.logic = parent.pages["randomizer"].pages["item"].widgets["logiclevel"].storageVar.get() - guiargs.goal = parent.pages["randomizer"].pages["item"].widgets["goal"].storageVar.get() guiargs.crystals_gt = parent.pages["randomizer"].pages["item"].widgets["crystals_gt"].storageVar.get() guiargs.crystals_ganon = parent.pages["randomizer"].pages["item"].widgets["crystals_ganon"].storageVar.get() @@ -105,6 +101,12 @@ def create_guiargs(parent): guiargs.progressive = parent.pages["randomizer"].pages["item"].widgets["progressives"].storageVar.get() guiargs.accessibility = parent.pages["randomizer"].pages["item"].widgets["accessibility"].storageVar.get() guiargs.algorithm = parent.pages["randomizer"].pages["item"].widgets["sortingalgo"].storageVar.get() + + guiargs.multi = int(parent.pages["randomizer"].pages["multiworld"].widgets["worlds"].storageVar.get()) + guiargs.names = parent.pages["randomizer"].pages["multiworld"].namesVar.get() + guiargs.seed = int(parent.frames["bottom"].seedVar.get()) if parent.frames["bottom"].seedVar.get() else None + guiargs.count = int(parent.frames["bottom"].widgets["generationcount"].storageVar.get()) if parent.frames["bottom"].widgets["generationcount"].storageVar.get() != '1' else None + guiargs.shuffle = parent.pages["randomizer"].pages["entrance"].widgets["entranceshuffle"].storageVar.get() guiargs.door_shuffle = parent.pages["randomizer"].pages["dungeon"].widgets["dungeondoorshuffle"].storageVar.get() guiargs.experimental = parent.pages["randomizer"].pages["dungeon"].widgets["experimental"].storageVar.get() @@ -119,7 +121,6 @@ def create_guiargs(parent): guiargs.compassshuffle = bool(parent.pages["randomizer"].pages["dungeon"].widgets["compassshuffle"].storageVar.get()) guiargs.keyshuffle = bool(parent.pages["randomizer"].pages["dungeon"].widgets["smallkeyshuffle"].storageVar.get()) guiargs.bigkeyshuffle = bool(parent.pages["randomizer"].pages["dungeon"].widgets["bigkeyshuffle"].storageVar.get()) - guiargs.retro = bool(parent.pages["randomizer"].pages["item"].widgets["retro"].storageVar.get()) guiargs.quickswap = bool(parent.pages["randomizer"].pages["gameoptions"].widgets["quickswap"].storageVar.get()) guiargs.disablemusic = bool(parent.pages["randomizer"].pages["gameoptions"].widgets["nobgm"].storageVar.get()) guiargs.ow_palettes = parent.pages["randomizer"].pages["gameoptions"].widgets["owpalettes"].storageVar.get() diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index 3379fb28..01d53079 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -9,13 +9,26 @@ def loadcliargs(gui, args): if type(v) is dict: setattr(args, k, v[1]) # only get values for player 1 for now # load values from commandline args + gui.pages["randomizer"].pages["item"].widgets["retro"].storageVar.set(args.retro) + gui.pages["randomizer"].pages["item"].widgets["worldstate"].storageVar.set(args.mode) + gui.pages["randomizer"].pages["item"].widgets["logiclevel"].storageVar.set(args.logic) + gui.pages["randomizer"].pages["item"].widgets["goal"].storageVar.set(args.goal) + gui.pages["randomizer"].pages["item"].widgets["crystals_gt"].storageVar.set(args.crystals_gt) + gui.pages["randomizer"].pages["item"].widgets["crystals_ganon"].storageVar.set(args.crystals_ganon) + gui.pages["randomizer"].pages["item"].widgets["weapons"].storageVar.set(args.swords) + gui.pages["randomizer"].pages["item"].widgets["itempool"].storageVar.set(args.difficulty) + gui.pages["randomizer"].pages["item"].widgets["itemfunction"].storageVar.set(args.item_functionality) + gui.pages["randomizer"].pages["item"].widgets["timer"].storageVar.set(args.timer) + gui.pages["randomizer"].pages["item"].widgets["progressives"].storageVar.set(args.progressive) + gui.pages["randomizer"].pages["item"].widgets["accessibility"].storageVar.set(args.accessibility) + gui.pages["randomizer"].pages["item"].widgets["sortingalgo"].storageVar.set(args.algorithm) + gui.pages["randomizer"].pages["generation"].widgets["spoiler"].storageVar.set(int(args.create_spoiler)) gui.pages["randomizer"].pages["generation"].widgets["suppressrom"].storageVar.set(int(args.suppress_rom)) gui.pages["randomizer"].pages["dungeon"].widgets["mapshuffle"].storageVar.set(args.mapshuffle) gui.pages["randomizer"].pages["dungeon"].widgets["compassshuffle"].storageVar.set(args.compassshuffle) gui.pages["randomizer"].pages["dungeon"].widgets["smallkeyshuffle"].storageVar.set(args.keyshuffle) gui.pages["randomizer"].pages["dungeon"].widgets["bigkeyshuffle"].storageVar.set(args.bigkeyshuffle) - gui.pages["randomizer"].pages["item"].widgets["retro"].storageVar.set(args.retro) gui.pages["randomizer"].pages["entrance"].widgets["openpyramid"].storageVar.set(args.openpyramid) gui.pages["randomizer"].pages["gameoptions"].widgets["quickswap"].storageVar.set(int(args.quickswap)) gui.pages["randomizer"].pages["gameoptions"].widgets["nobgm"].storageVar.set(int(args.disablemusic)) @@ -25,24 +38,12 @@ def loadcliargs(gui, args): gui.frames["bottom"].widgets["generationcount"].storageVar.set(str(args.count)) if args.seed: gui.frames["bottom"].seedVar.set(str(args.seed)) - gui.pages["randomizer"].pages["item"].widgets["worldstate"].storageVar.set(args.mode) - gui.pages["randomizer"].pages["item"].widgets["weapons"].storageVar.set(args.swords) - gui.pages["randomizer"].pages["item"].widgets["itempool"].storageVar.set(args.difficulty) - gui.pages["randomizer"].pages["item"].widgets["itemfunction"].storageVar.set(args.item_functionality) - gui.pages["randomizer"].pages["item"].widgets["timer"].storageVar.set(args.timer) - gui.pages["randomizer"].pages["item"].widgets["progressives"].storageVar.set(args.progressive) - gui.pages["randomizer"].pages["item"].widgets["accessibility"].storageVar.set(args.accessibility) - gui.pages["randomizer"].pages["item"].widgets["goal"].storageVar.set(args.goal) - gui.pages["randomizer"].pages["item"].widgets["crystals_gt"].storageVar.set(args.crystals_gt) - gui.pages["randomizer"].pages["item"].widgets["crystals_ganon"].storageVar.set(args.crystals_ganon) - gui.pages["randomizer"].pages["item"].widgets["sortingalgo"].storageVar.set(args.algorithm) gui.pages["randomizer"].pages["entrance"].widgets["entranceshuffle"].storageVar.set(args.shuffle) gui.pages["randomizer"].pages["dungeon"].widgets["dungeondoorshuffle"].storageVar.set(args.door_shuffle) gui.pages["randomizer"].pages["dungeon"].widgets["experimental"].storageVar.set(args.experimental) gui.pages["randomizer"].pages["gameoptions"].widgets["heartcolor"].storageVar.set(args.heartcolor) gui.pages["randomizer"].pages["gameoptions"].widgets["heartbeep"].storageVar.set(args.heartbeep) gui.pages["randomizer"].pages["gameoptions"].widgets["menuspeed"].storageVar.set(args.fastmenu) - gui.pages["randomizer"].pages["item"].widgets["logiclevel"].storageVar.set(args.logic) gui.pages["randomizer"].pages["generation"].romVar.set(args.rom) gui.pages["randomizer"].pages["entrance"].widgets["shuffleganon"].storageVar.set(args.shuffleganon) gui.pages["randomizer"].pages["gameoptions"].widgets["hints"].storageVar.set(args.hints) From 5defbf727aea9bd53f0a3871ea75f06c68896fd5 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 02:32:49 -0800 Subject: [PATCH 059/117] Sort Entrance args --- gui/bottom.py | 7 ++++--- gui/loadcliargs.py | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/gui/bottom.py b/gui/bottom.py index 766efa64..93c770a3 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -102,12 +102,15 @@ def create_guiargs(parent): guiargs.accessibility = parent.pages["randomizer"].pages["item"].widgets["accessibility"].storageVar.get() guiargs.algorithm = parent.pages["randomizer"].pages["item"].widgets["sortingalgo"].storageVar.get() + guiargs.openpyramid = bool(parent.pages["randomizer"].pages["entrance"].widgets["openpyramid"].storageVar.get()) + guiargs.shuffleganon = bool(parent.pages["randomizer"].pages["entrance"].widgets["shuffleganon"].storageVar.get()) + guiargs.shuffle = parent.pages["randomizer"].pages["entrance"].widgets["entranceshuffle"].storageVar.get() + guiargs.multi = int(parent.pages["randomizer"].pages["multiworld"].widgets["worlds"].storageVar.get()) guiargs.names = parent.pages["randomizer"].pages["multiworld"].namesVar.get() guiargs.seed = int(parent.frames["bottom"].seedVar.get()) if parent.frames["bottom"].seedVar.get() else None guiargs.count = int(parent.frames["bottom"].widgets["generationcount"].storageVar.get()) if parent.frames["bottom"].widgets["generationcount"].storageVar.get() != '1' else None - guiargs.shuffle = parent.pages["randomizer"].pages["entrance"].widgets["entranceshuffle"].storageVar.get() guiargs.door_shuffle = parent.pages["randomizer"].pages["dungeon"].widgets["dungeondoorshuffle"].storageVar.get() guiargs.experimental = parent.pages["randomizer"].pages["dungeon"].widgets["experimental"].storageVar.get() guiargs.heartbeep = parent.pages["randomizer"].pages["gameoptions"].widgets["heartbeep"].storageVar.get() @@ -116,7 +119,6 @@ def create_guiargs(parent): guiargs.create_spoiler = bool(parent.pages["randomizer"].pages["generation"].widgets["spoiler"].storageVar.get()) guiargs.skip_playthrough = not bool(parent.pages["randomizer"].pages["generation"].widgets["spoiler"].storageVar.get()) guiargs.suppress_rom = bool(parent.pages["randomizer"].pages["generation"].widgets["suppressrom"].storageVar.get()) - guiargs.openpyramid = bool(parent.pages["randomizer"].pages["entrance"].widgets["openpyramid"].storageVar.get()) guiargs.mapshuffle = bool(parent.pages["randomizer"].pages["dungeon"].widgets["mapshuffle"].storageVar.get()) guiargs.compassshuffle = bool(parent.pages["randomizer"].pages["dungeon"].widgets["compassshuffle"].storageVar.get()) guiargs.keyshuffle = bool(parent.pages["randomizer"].pages["dungeon"].widgets["smallkeyshuffle"].storageVar.get()) @@ -125,7 +127,6 @@ def create_guiargs(parent): guiargs.disablemusic = bool(parent.pages["randomizer"].pages["gameoptions"].widgets["nobgm"].storageVar.get()) guiargs.ow_palettes = parent.pages["randomizer"].pages["gameoptions"].widgets["owpalettes"].storageVar.get() guiargs.uw_palettes = parent.pages["randomizer"].pages["gameoptions"].widgets["uwpalettes"].storageVar.get() - guiargs.shuffleganon = bool(parent.pages["randomizer"].pages["entrance"].widgets["shuffleganon"].storageVar.get()) guiargs.hints = bool(parent.pages["randomizer"].pages["gameoptions"].widgets["hints"].storageVar.get()) guiargs.enemizercli = parent.pages["randomizer"].pages["enemizer"].enemizerCLIpathVar.get() guiargs.shufflebosses = parent.pages["randomizer"].pages["enemizer"].widgets["bossshuffle"].storageVar.get() diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index 01d53079..ed6907ec 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -23,13 +23,16 @@ def loadcliargs(gui, args): gui.pages["randomizer"].pages["item"].widgets["accessibility"].storageVar.set(args.accessibility) gui.pages["randomizer"].pages["item"].widgets["sortingalgo"].storageVar.set(args.algorithm) + gui.pages["randomizer"].pages["entrance"].widgets["openpyramid"].storageVar.set(args.openpyramid) + gui.pages["randomizer"].pages["entrance"].widgets["shuffleganon"].storageVar.set(args.shuffleganon) + gui.pages["randomizer"].pages["entrance"].widgets["entranceshuffle"].storageVar.set(args.shuffle) + gui.pages["randomizer"].pages["generation"].widgets["spoiler"].storageVar.set(int(args.create_spoiler)) gui.pages["randomizer"].pages["generation"].widgets["suppressrom"].storageVar.set(int(args.suppress_rom)) gui.pages["randomizer"].pages["dungeon"].widgets["mapshuffle"].storageVar.set(args.mapshuffle) gui.pages["randomizer"].pages["dungeon"].widgets["compassshuffle"].storageVar.set(args.compassshuffle) gui.pages["randomizer"].pages["dungeon"].widgets["smallkeyshuffle"].storageVar.set(args.keyshuffle) gui.pages["randomizer"].pages["dungeon"].widgets["bigkeyshuffle"].storageVar.set(args.bigkeyshuffle) - gui.pages["randomizer"].pages["entrance"].widgets["openpyramid"].storageVar.set(args.openpyramid) gui.pages["randomizer"].pages["gameoptions"].widgets["quickswap"].storageVar.set(int(args.quickswap)) gui.pages["randomizer"].pages["gameoptions"].widgets["nobgm"].storageVar.set(int(args.disablemusic)) if args.multi: @@ -38,14 +41,12 @@ def loadcliargs(gui, args): gui.frames["bottom"].widgets["generationcount"].storageVar.set(str(args.count)) if args.seed: gui.frames["bottom"].seedVar.set(str(args.seed)) - gui.pages["randomizer"].pages["entrance"].widgets["entranceshuffle"].storageVar.set(args.shuffle) gui.pages["randomizer"].pages["dungeon"].widgets["dungeondoorshuffle"].storageVar.set(args.door_shuffle) gui.pages["randomizer"].pages["dungeon"].widgets["experimental"].storageVar.set(args.experimental) gui.pages["randomizer"].pages["gameoptions"].widgets["heartcolor"].storageVar.set(args.heartcolor) gui.pages["randomizer"].pages["gameoptions"].widgets["heartbeep"].storageVar.set(args.heartbeep) gui.pages["randomizer"].pages["gameoptions"].widgets["menuspeed"].storageVar.set(args.fastmenu) gui.pages["randomizer"].pages["generation"].romVar.set(args.rom) - gui.pages["randomizer"].pages["entrance"].widgets["shuffleganon"].storageVar.set(args.shuffleganon) gui.pages["randomizer"].pages["gameoptions"].widgets["hints"].storageVar.set(args.hints) gui.pages["randomizer"].pages["enemizer"].enemizerCLIpathVar.set(args.enemizercli) gui.pages["randomizer"].pages["enemizer"].widgets["potshuffle"].storageVar.set(args.shufflepots) From 62ba989b920beb0f8d37b8b50a2e77128ffdcf47 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 02:34:10 -0800 Subject: [PATCH 060/117] Sort Enemizer args --- gui/bottom.py | 13 +++++++------ gui/loadcliargs.py | 13 +++++++------ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/gui/bottom.py b/gui/bottom.py index 93c770a3..380fe19f 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -106,6 +106,13 @@ def create_guiargs(parent): guiargs.shuffleganon = bool(parent.pages["randomizer"].pages["entrance"].widgets["shuffleganon"].storageVar.get()) guiargs.shuffle = parent.pages["randomizer"].pages["entrance"].widgets["entranceshuffle"].storageVar.get() + guiargs.shufflepots = bool(parent.pages["randomizer"].pages["enemizer"].widgets["potshuffle"].storageVar.get()) + guiargs.enemizercli = parent.pages["randomizer"].pages["enemizer"].enemizerCLIpathVar.get() + guiargs.shuffleenemies = parent.pages["randomizer"].pages["enemizer"].widgets["enemyshuffle"].storageVar.get() + guiargs.shufflebosses = parent.pages["randomizer"].pages["enemizer"].widgets["bossshuffle"].storageVar.get() + guiargs.enemy_damage = parent.pages["randomizer"].pages["enemizer"].widgets["enemydamage"].storageVar.get() + guiargs.enemy_health = parent.pages["randomizer"].pages["enemizer"].widgets["enemyhealth"].storageVar.get() + guiargs.multi = int(parent.pages["randomizer"].pages["multiworld"].widgets["worlds"].storageVar.get()) guiargs.names = parent.pages["randomizer"].pages["multiworld"].namesVar.get() guiargs.seed = int(parent.frames["bottom"].seedVar.get()) if parent.frames["bottom"].seedVar.get() else None @@ -128,12 +135,6 @@ def create_guiargs(parent): guiargs.ow_palettes = parent.pages["randomizer"].pages["gameoptions"].widgets["owpalettes"].storageVar.get() guiargs.uw_palettes = parent.pages["randomizer"].pages["gameoptions"].widgets["uwpalettes"].storageVar.get() guiargs.hints = bool(parent.pages["randomizer"].pages["gameoptions"].widgets["hints"].storageVar.get()) - guiargs.enemizercli = parent.pages["randomizer"].pages["enemizer"].enemizerCLIpathVar.get() - guiargs.shufflebosses = parent.pages["randomizer"].pages["enemizer"].widgets["bossshuffle"].storageVar.get() - guiargs.shuffleenemies = parent.pages["randomizer"].pages["enemizer"].widgets["enemyshuffle"].storageVar.get() - guiargs.enemy_health = parent.pages["randomizer"].pages["enemizer"].widgets["enemyhealth"].storageVar.get() - guiargs.enemy_damage = parent.pages["randomizer"].pages["enemizer"].widgets["enemydamage"].storageVar.get() - guiargs.shufflepots = bool(parent.pages["randomizer"].pages["enemizer"].widgets["potshuffle"].storageVar.get()) guiargs.custom = bool(parent.pages["randomizer"].pages["generation"].widgets["usecustompool"].storageVar.get()) guiargs.customitemarray = [int(parent.pages["custom"].content.customWidgets["bow"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["silversupgrade"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["boomerang"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["redmerang"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["hookshot"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["mushroom"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["powder"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["firerod"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["icerod"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["bombos"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["ether"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["quake"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["lamp"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["hammer"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["shovel"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["flute"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["bugnet"].storageVar.get()), diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index ed6907ec..16f2961d 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -27,6 +27,13 @@ def loadcliargs(gui, args): gui.pages["randomizer"].pages["entrance"].widgets["shuffleganon"].storageVar.set(args.shuffleganon) gui.pages["randomizer"].pages["entrance"].widgets["entranceshuffle"].storageVar.set(args.shuffle) + gui.pages["randomizer"].pages["enemizer"].widgets["potshuffle"].storageVar.set(args.shufflepots) + gui.pages["randomizer"].pages["enemizer"].enemizerCLIpathVar.set(args.enemizercli) + gui.pages["randomizer"].pages["enemizer"].widgets["enemyshuffle"].storageVar.set(args.shuffleenemies) + gui.pages["randomizer"].pages["enemizer"].widgets["bossshuffle"].storageVar.set(args.shufflebosses) + gui.pages["randomizer"].pages["enemizer"].widgets["enemydamage"].storageVar.set(args.enemy_damage) + gui.pages["randomizer"].pages["enemizer"].widgets["enemyhealth"].storageVar.set(args.enemy_health) + gui.pages["randomizer"].pages["generation"].widgets["spoiler"].storageVar.set(int(args.create_spoiler)) gui.pages["randomizer"].pages["generation"].widgets["suppressrom"].storageVar.set(int(args.suppress_rom)) gui.pages["randomizer"].pages["dungeon"].widgets["mapshuffle"].storageVar.set(args.mapshuffle) @@ -48,12 +55,6 @@ def loadcliargs(gui, args): gui.pages["randomizer"].pages["gameoptions"].widgets["menuspeed"].storageVar.set(args.fastmenu) gui.pages["randomizer"].pages["generation"].romVar.set(args.rom) gui.pages["randomizer"].pages["gameoptions"].widgets["hints"].storageVar.set(args.hints) - gui.pages["randomizer"].pages["enemizer"].enemizerCLIpathVar.set(args.enemizercli) - gui.pages["randomizer"].pages["enemizer"].widgets["potshuffle"].storageVar.set(args.shufflepots) - gui.pages["randomizer"].pages["enemizer"].widgets["enemyshuffle"].storageVar.set(args.shuffleenemies) - gui.pages["randomizer"].pages["enemizer"].widgets["bossshuffle"].storageVar.set(args.shufflebosses) - gui.pages["randomizer"].pages["enemizer"].widgets["enemydamage"].storageVar.set(args.enemy_damage) - gui.pages["randomizer"].pages["enemizer"].widgets["enemyhealth"].storageVar.set(args.enemy_health) gui.pages["randomizer"].pages["gameoptions"].widgets["owpalettes"].storageVar.set(args.ow_palettes) gui.pages["randomizer"].pages["gameoptions"].widgets["uwpalettes"].storageVar.set(args.uw_palettes) gui.outputPath.set(args.outputpath) From 45b64b5587b9ee773249128af38502cb2a4b706c Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 02:35:19 -0800 Subject: [PATCH 061/117] Sort Dungeon Rando args --- gui/bottom.py | 13 +++++++------ gui/loadcliargs.py | 9 +++++---- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/gui/bottom.py b/gui/bottom.py index 380fe19f..672c3b26 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -113,23 +113,24 @@ def create_guiargs(parent): guiargs.enemy_damage = parent.pages["randomizer"].pages["enemizer"].widgets["enemydamage"].storageVar.get() guiargs.enemy_health = parent.pages["randomizer"].pages["enemizer"].widgets["enemyhealth"].storageVar.get() + guiargs.mapshuffle = bool(parent.pages["randomizer"].pages["dungeon"].widgets["mapshuffle"].storageVar.get()) + guiargs.compassshuffle = bool(parent.pages["randomizer"].pages["dungeon"].widgets["compassshuffle"].storageVar.get()) + guiargs.keyshuffle = bool(parent.pages["randomizer"].pages["dungeon"].widgets["smallkeyshuffle"].storageVar.get()) + guiargs.bigkeyshuffle = bool(parent.pages["randomizer"].pages["dungeon"].widgets["bigkeyshuffle"].storageVar.get()) + guiargs.door_shuffle = parent.pages["randomizer"].pages["dungeon"].widgets["dungeondoorshuffle"].storageVar.get() + guiargs.experimental = parent.pages["randomizer"].pages["dungeon"].widgets["experimental"].storageVar.get() + guiargs.multi = int(parent.pages["randomizer"].pages["multiworld"].widgets["worlds"].storageVar.get()) guiargs.names = parent.pages["randomizer"].pages["multiworld"].namesVar.get() guiargs.seed = int(parent.frames["bottom"].seedVar.get()) if parent.frames["bottom"].seedVar.get() else None guiargs.count = int(parent.frames["bottom"].widgets["generationcount"].storageVar.get()) if parent.frames["bottom"].widgets["generationcount"].storageVar.get() != '1' else None - guiargs.door_shuffle = parent.pages["randomizer"].pages["dungeon"].widgets["dungeondoorshuffle"].storageVar.get() - guiargs.experimental = parent.pages["randomizer"].pages["dungeon"].widgets["experimental"].storageVar.get() guiargs.heartbeep = parent.pages["randomizer"].pages["gameoptions"].widgets["heartbeep"].storageVar.get() guiargs.heartcolor = parent.pages["randomizer"].pages["gameoptions"].widgets["heartcolor"].storageVar.get() guiargs.fastmenu = parent.pages["randomizer"].pages["gameoptions"].widgets["menuspeed"].storageVar.get() guiargs.create_spoiler = bool(parent.pages["randomizer"].pages["generation"].widgets["spoiler"].storageVar.get()) guiargs.skip_playthrough = not bool(parent.pages["randomizer"].pages["generation"].widgets["spoiler"].storageVar.get()) guiargs.suppress_rom = bool(parent.pages["randomizer"].pages["generation"].widgets["suppressrom"].storageVar.get()) - guiargs.mapshuffle = bool(parent.pages["randomizer"].pages["dungeon"].widgets["mapshuffle"].storageVar.get()) - guiargs.compassshuffle = bool(parent.pages["randomizer"].pages["dungeon"].widgets["compassshuffle"].storageVar.get()) - guiargs.keyshuffle = bool(parent.pages["randomizer"].pages["dungeon"].widgets["smallkeyshuffle"].storageVar.get()) - guiargs.bigkeyshuffle = bool(parent.pages["randomizer"].pages["dungeon"].widgets["bigkeyshuffle"].storageVar.get()) guiargs.quickswap = bool(parent.pages["randomizer"].pages["gameoptions"].widgets["quickswap"].storageVar.get()) guiargs.disablemusic = bool(parent.pages["randomizer"].pages["gameoptions"].widgets["nobgm"].storageVar.get()) guiargs.ow_palettes = parent.pages["randomizer"].pages["gameoptions"].widgets["owpalettes"].storageVar.get() diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index 16f2961d..2fa85c47 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -34,12 +34,15 @@ def loadcliargs(gui, args): gui.pages["randomizer"].pages["enemizer"].widgets["enemydamage"].storageVar.set(args.enemy_damage) gui.pages["randomizer"].pages["enemizer"].widgets["enemyhealth"].storageVar.set(args.enemy_health) - gui.pages["randomizer"].pages["generation"].widgets["spoiler"].storageVar.set(int(args.create_spoiler)) - gui.pages["randomizer"].pages["generation"].widgets["suppressrom"].storageVar.set(int(args.suppress_rom)) gui.pages["randomizer"].pages["dungeon"].widgets["mapshuffle"].storageVar.set(args.mapshuffle) gui.pages["randomizer"].pages["dungeon"].widgets["compassshuffle"].storageVar.set(args.compassshuffle) gui.pages["randomizer"].pages["dungeon"].widgets["smallkeyshuffle"].storageVar.set(args.keyshuffle) gui.pages["randomizer"].pages["dungeon"].widgets["bigkeyshuffle"].storageVar.set(args.bigkeyshuffle) + gui.pages["randomizer"].pages["dungeon"].widgets["dungeondoorshuffle"].storageVar.set(args.door_shuffle) + gui.pages["randomizer"].pages["dungeon"].widgets["experimental"].storageVar.set(args.experimental) + + gui.pages["randomizer"].pages["generation"].widgets["spoiler"].storageVar.set(int(args.create_spoiler)) + gui.pages["randomizer"].pages["generation"].widgets["suppressrom"].storageVar.set(int(args.suppress_rom)) gui.pages["randomizer"].pages["gameoptions"].widgets["quickswap"].storageVar.set(int(args.quickswap)) gui.pages["randomizer"].pages["gameoptions"].widgets["nobgm"].storageVar.set(int(args.disablemusic)) if args.multi: @@ -48,8 +51,6 @@ def loadcliargs(gui, args): gui.frames["bottom"].widgets["generationcount"].storageVar.set(str(args.count)) if args.seed: gui.frames["bottom"].seedVar.set(str(args.seed)) - gui.pages["randomizer"].pages["dungeon"].widgets["dungeondoorshuffle"].storageVar.set(args.door_shuffle) - gui.pages["randomizer"].pages["dungeon"].widgets["experimental"].storageVar.set(args.experimental) gui.pages["randomizer"].pages["gameoptions"].widgets["heartcolor"].storageVar.set(args.heartcolor) gui.pages["randomizer"].pages["gameoptions"].widgets["heartbeep"].storageVar.set(args.heartbeep) gui.pages["randomizer"].pages["gameoptions"].widgets["menuspeed"].storageVar.set(args.fastmenu) From f27bacd90165df41c86a4e8ab055ffbf2dec86c8 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 02:45:17 -0800 Subject: [PATCH 062/117] Sort Multiworld args --- gui/bottom.py | 1 + 1 file changed, 1 insertion(+) diff --git a/gui/bottom.py b/gui/bottom.py index 672c3b26..60ce45be 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -122,6 +122,7 @@ def create_guiargs(parent): guiargs.multi = int(parent.pages["randomizer"].pages["multiworld"].widgets["worlds"].storageVar.get()) guiargs.names = parent.pages["randomizer"].pages["multiworld"].namesVar.get() + guiargs.seed = int(parent.frames["bottom"].seedVar.get()) if parent.frames["bottom"].seedVar.get() else None guiargs.count = int(parent.frames["bottom"].widgets["generationcount"].storageVar.get()) if parent.frames["bottom"].widgets["generationcount"].storageVar.get() != '1' else None From c6e6b31f9c4fe0dfa4bb5bb59f53d0dd86598d4a Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 02:46:46 -0800 Subject: [PATCH 063/117] Sort Game Options args --- gui/bottom.py | 17 +++++++++-------- gui/loadcliargs.py | 17 +++++++++-------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/gui/bottom.py b/gui/bottom.py index 60ce45be..5d2b3e60 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -123,20 +123,21 @@ def create_guiargs(parent): guiargs.multi = int(parent.pages["randomizer"].pages["multiworld"].widgets["worlds"].storageVar.get()) guiargs.names = parent.pages["randomizer"].pages["multiworld"].namesVar.get() + guiargs.hints = bool(parent.pages["randomizer"].pages["gameoptions"].widgets["hints"].storageVar.get()) + guiargs.disablemusic = bool(parent.pages["randomizer"].pages["gameoptions"].widgets["nobgm"].storageVar.get()) + guiargs.quickswap = bool(parent.pages["randomizer"].pages["gameoptions"].widgets["quickswap"].storageVar.get()) + guiargs.heartcolor = parent.pages["randomizer"].pages["gameoptions"].widgets["heartcolor"].storageVar.get() + guiargs.heartbeep = parent.pages["randomizer"].pages["gameoptions"].widgets["heartbeep"].storageVar.get() + guiargs.fastmenu = parent.pages["randomizer"].pages["gameoptions"].widgets["menuspeed"].storageVar.get() + guiargs.ow_palettes = parent.pages["randomizer"].pages["gameoptions"].widgets["owpalettes"].storageVar.get() + guiargs.uw_palettes = parent.pages["randomizer"].pages["gameoptions"].widgets["uwpalettes"].storageVar.get() + guiargs.seed = int(parent.frames["bottom"].seedVar.get()) if parent.frames["bottom"].seedVar.get() else None guiargs.count = int(parent.frames["bottom"].widgets["generationcount"].storageVar.get()) if parent.frames["bottom"].widgets["generationcount"].storageVar.get() != '1' else None - guiargs.heartbeep = parent.pages["randomizer"].pages["gameoptions"].widgets["heartbeep"].storageVar.get() - guiargs.heartcolor = parent.pages["randomizer"].pages["gameoptions"].widgets["heartcolor"].storageVar.get() - guiargs.fastmenu = parent.pages["randomizer"].pages["gameoptions"].widgets["menuspeed"].storageVar.get() guiargs.create_spoiler = bool(parent.pages["randomizer"].pages["generation"].widgets["spoiler"].storageVar.get()) guiargs.skip_playthrough = not bool(parent.pages["randomizer"].pages["generation"].widgets["spoiler"].storageVar.get()) guiargs.suppress_rom = bool(parent.pages["randomizer"].pages["generation"].widgets["suppressrom"].storageVar.get()) - guiargs.quickswap = bool(parent.pages["randomizer"].pages["gameoptions"].widgets["quickswap"].storageVar.get()) - guiargs.disablemusic = bool(parent.pages["randomizer"].pages["gameoptions"].widgets["nobgm"].storageVar.get()) - guiargs.ow_palettes = parent.pages["randomizer"].pages["gameoptions"].widgets["owpalettes"].storageVar.get() - guiargs.uw_palettes = parent.pages["randomizer"].pages["gameoptions"].widgets["uwpalettes"].storageVar.get() - guiargs.hints = bool(parent.pages["randomizer"].pages["gameoptions"].widgets["hints"].storageVar.get()) guiargs.custom = bool(parent.pages["randomizer"].pages["generation"].widgets["usecustompool"].storageVar.get()) guiargs.customitemarray = [int(parent.pages["custom"].content.customWidgets["bow"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["silversupgrade"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["boomerang"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["redmerang"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["hookshot"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["mushroom"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["powder"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["firerod"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["icerod"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["bombos"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["ether"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["quake"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["lamp"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["hammer"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["shovel"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["flute"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["bugnet"].storageVar.get()), diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index 2fa85c47..a8423774 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -41,23 +41,24 @@ def loadcliargs(gui, args): gui.pages["randomizer"].pages["dungeon"].widgets["dungeondoorshuffle"].storageVar.set(args.door_shuffle) gui.pages["randomizer"].pages["dungeon"].widgets["experimental"].storageVar.set(args.experimental) + gui.pages["randomizer"].pages["gameoptions"].widgets["hints"].storageVar.set(args.hints) + gui.pages["randomizer"].pages["gameoptions"].widgets["nobgm"].storageVar.set(int(args.disablemusic)) + gui.pages["randomizer"].pages["gameoptions"].widgets["quickswap"].storageVar.set(int(args.quickswap)) + gui.pages["randomizer"].pages["gameoptions"].widgets["heartcolor"].storageVar.set(args.heartcolor) + gui.pages["randomizer"].pages["gameoptions"].widgets["heartbeep"].storageVar.set(args.heartbeep) + gui.pages["randomizer"].pages["gameoptions"].widgets["menuspeed"].storageVar.set(args.fastmenu) + gui.pages["randomizer"].pages["gameoptions"].widgets["owpalettes"].storageVar.set(args.ow_palettes) + gui.pages["randomizer"].pages["gameoptions"].widgets["uwpalettes"].storageVar.set(args.uw_palettes) + gui.pages["randomizer"].pages["generation"].widgets["spoiler"].storageVar.set(int(args.create_spoiler)) gui.pages["randomizer"].pages["generation"].widgets["suppressrom"].storageVar.set(int(args.suppress_rom)) - gui.pages["randomizer"].pages["gameoptions"].widgets["quickswap"].storageVar.set(int(args.quickswap)) - gui.pages["randomizer"].pages["gameoptions"].widgets["nobgm"].storageVar.set(int(args.disablemusic)) if args.multi: gui.pages["randomizer"].pages["multiworld"].widgets["worlds"].storageVar.set(str(args.multi)) if args.count: gui.frames["bottom"].widgets["generationcount"].storageVar.set(str(args.count)) if args.seed: gui.frames["bottom"].seedVar.set(str(args.seed)) - gui.pages["randomizer"].pages["gameoptions"].widgets["heartcolor"].storageVar.set(args.heartcolor) - gui.pages["randomizer"].pages["gameoptions"].widgets["heartbeep"].storageVar.set(args.heartbeep) - gui.pages["randomizer"].pages["gameoptions"].widgets["menuspeed"].storageVar.set(args.fastmenu) gui.pages["randomizer"].pages["generation"].romVar.set(args.rom) - gui.pages["randomizer"].pages["gameoptions"].widgets["hints"].storageVar.set(args.hints) - gui.pages["randomizer"].pages["gameoptions"].widgets["owpalettes"].storageVar.set(args.ow_palettes) - gui.pages["randomizer"].pages["gameoptions"].widgets["uwpalettes"].storageVar.set(args.uw_palettes) gui.outputPath.set(args.outputpath) def sprite_setter(spriteObject): From b80dedb9381bd9a40ac5b034a7446e04321bdf12 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 02:48:43 -0800 Subject: [PATCH 064/117] Sort Generation args --- gui/bottom.py | 3 ++- gui/loadcliargs.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/gui/bottom.py b/gui/bottom.py index 5d2b3e60..76240fa7 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -138,7 +138,9 @@ def create_guiargs(parent): guiargs.create_spoiler = bool(parent.pages["randomizer"].pages["generation"].widgets["spoiler"].storageVar.get()) guiargs.skip_playthrough = not bool(parent.pages["randomizer"].pages["generation"].widgets["spoiler"].storageVar.get()) guiargs.suppress_rom = bool(parent.pages["randomizer"].pages["generation"].widgets["suppressrom"].storageVar.get()) + guiargs.rom = parent.pages["randomizer"].pages["generation"].romVar.get() guiargs.custom = bool(parent.pages["randomizer"].pages["generation"].widgets["usecustompool"].storageVar.get()) + guiargs.customitemarray = [int(parent.pages["custom"].content.customWidgets["bow"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["silversupgrade"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["boomerang"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["redmerang"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["hookshot"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["mushroom"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["powder"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["firerod"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["icerod"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["bombos"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["ether"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["quake"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["lamp"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["hammer"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["shovel"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["flute"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["bugnet"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["book"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["bottle"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["somaria"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["byrna"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["cape"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["mirror"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["boots"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["powerglove"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["titansmitt"].storageVar.get()), @@ -148,7 +150,6 @@ def create_guiargs(parent): int(parent.pages["custom"].content.customWidgets["arrow1"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["arrow10"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["bomb1"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["bomb3"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["rupee1"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["rupee5"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["rupee20"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["rupee50"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["rupee100"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["rupee300"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["rupoor"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["blueclock"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["greenclock"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["redclock"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["progressivebow"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["bomb10"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["triforcepieces"].storageVar.get()),int(parent.pages["custom"].content.customWidgets["triforcepiecesgoal"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["triforce"].storageVar.get()),int(parent.pages["custom"].content.customWidgets["rupoorcost"].storageVar.get()),int(parent.pages["custom"].content.customWidgets["generickeys"].storageVar.get())] - guiargs.rom = parent.pages["randomizer"].pages["generation"].romVar.get() guiargs.sprite = parent.pages["randomizer"].pages["gameoptions"].widgets["sprite"]["spriteObject"] guiargs.randomSprite = parent.randomSprite.get() guiargs.outputpath = parent.outputPath.get() diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index a8423774..1daef9bd 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -52,13 +52,14 @@ def loadcliargs(gui, args): gui.pages["randomizer"].pages["generation"].widgets["spoiler"].storageVar.set(int(args.create_spoiler)) gui.pages["randomizer"].pages["generation"].widgets["suppressrom"].storageVar.set(int(args.suppress_rom)) + gui.pages["randomizer"].pages["generation"].romVar.set(args.rom) + if args.multi: gui.pages["randomizer"].pages["multiworld"].widgets["worlds"].storageVar.set(str(args.multi)) if args.count: gui.frames["bottom"].widgets["generationcount"].storageVar.set(str(args.count)) if args.seed: gui.frames["bottom"].seedVar.set(str(args.seed)) - gui.pages["randomizer"].pages["generation"].romVar.set(args.rom) gui.outputPath.set(args.outputpath) def sprite_setter(spriteObject): From cd0bc5b1e064aaf13721f5d8e600e464f0f7a4c2 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 02:49:47 -0800 Subject: [PATCH 065/117] Sort Bottom args --- gui/bottom.py | 6 +++--- gui/loadcliargs.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/gui/bottom.py b/gui/bottom.py index 76240fa7..8ca29586 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -132,15 +132,15 @@ def create_guiargs(parent): guiargs.ow_palettes = parent.pages["randomizer"].pages["gameoptions"].widgets["owpalettes"].storageVar.get() guiargs.uw_palettes = parent.pages["randomizer"].pages["gameoptions"].widgets["uwpalettes"].storageVar.get() - guiargs.seed = int(parent.frames["bottom"].seedVar.get()) if parent.frames["bottom"].seedVar.get() else None - guiargs.count = int(parent.frames["bottom"].widgets["generationcount"].storageVar.get()) if parent.frames["bottom"].widgets["generationcount"].storageVar.get() != '1' else None - guiargs.create_spoiler = bool(parent.pages["randomizer"].pages["generation"].widgets["spoiler"].storageVar.get()) guiargs.skip_playthrough = not bool(parent.pages["randomizer"].pages["generation"].widgets["spoiler"].storageVar.get()) guiargs.suppress_rom = bool(parent.pages["randomizer"].pages["generation"].widgets["suppressrom"].storageVar.get()) guiargs.rom = parent.pages["randomizer"].pages["generation"].romVar.get() guiargs.custom = bool(parent.pages["randomizer"].pages["generation"].widgets["usecustompool"].storageVar.get()) + guiargs.seed = int(parent.frames["bottom"].seedVar.get()) if parent.frames["bottom"].seedVar.get() else None + guiargs.count = int(parent.frames["bottom"].widgets["generationcount"].storageVar.get()) if parent.frames["bottom"].widgets["generationcount"].storageVar.get() != '1' else None + guiargs.customitemarray = [int(parent.pages["custom"].content.customWidgets["bow"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["silversupgrade"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["boomerang"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["redmerang"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["hookshot"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["mushroom"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["powder"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["firerod"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["icerod"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["bombos"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["ether"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["quake"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["lamp"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["hammer"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["shovel"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["flute"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["bugnet"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["book"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["bottle"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["somaria"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["byrna"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["cape"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["mirror"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["boots"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["powerglove"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["titansmitt"].storageVar.get()), diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index 1daef9bd..eb7d775d 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -56,10 +56,10 @@ def loadcliargs(gui, args): if args.multi: gui.pages["randomizer"].pages["multiworld"].widgets["worlds"].storageVar.set(str(args.multi)) - if args.count: - gui.frames["bottom"].widgets["generationcount"].storageVar.set(str(args.count)) if args.seed: gui.frames["bottom"].seedVar.set(str(args.seed)) + if args.count: + gui.frames["bottom"].widgets["generationcount"].storageVar.set(str(args.count)) gui.outputPath.set(args.outputpath) def sprite_setter(spriteObject): From 8c07302e3bb723e78bdb78a019a3d8dcbc12cbab Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 03:14:01 -0800 Subject: [PATCH 066/117] Arrayify Load args --- gui/loadcliargs.py | 100 +++++++++++++++++++++++++++------------------ 1 file changed, 60 insertions(+), 40 deletions(-) diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index eb7d775d..cce5b886 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -9,49 +9,69 @@ def loadcliargs(gui, args): if type(v) is dict: setattr(args, k, v[1]) # only get values for player 1 for now # load values from commandline args - gui.pages["randomizer"].pages["item"].widgets["retro"].storageVar.set(args.retro) - gui.pages["randomizer"].pages["item"].widgets["worldstate"].storageVar.set(args.mode) - gui.pages["randomizer"].pages["item"].widgets["logiclevel"].storageVar.set(args.logic) - gui.pages["randomizer"].pages["item"].widgets["goal"].storageVar.set(args.goal) - gui.pages["randomizer"].pages["item"].widgets["crystals_gt"].storageVar.set(args.crystals_gt) - gui.pages["randomizer"].pages["item"].widgets["crystals_ganon"].storageVar.set(args.crystals_ganon) - gui.pages["randomizer"].pages["item"].widgets["weapons"].storageVar.set(args.swords) - gui.pages["randomizer"].pages["item"].widgets["itempool"].storageVar.set(args.difficulty) - gui.pages["randomizer"].pages["item"].widgets["itemfunction"].storageVar.set(args.item_functionality) - gui.pages["randomizer"].pages["item"].widgets["timer"].storageVar.set(args.timer) - gui.pages["randomizer"].pages["item"].widgets["progressives"].storageVar.set(args.progressive) - gui.pages["randomizer"].pages["item"].widgets["accessibility"].storageVar.set(args.accessibility) - gui.pages["randomizer"].pages["item"].widgets["sortingalgo"].storageVar.set(args.algorithm) - gui.pages["randomizer"].pages["entrance"].widgets["openpyramid"].storageVar.set(args.openpyramid) - gui.pages["randomizer"].pages["entrance"].widgets["shuffleganon"].storageVar.set(args.shuffleganon) - gui.pages["randomizer"].pages["entrance"].widgets["entranceshuffle"].storageVar.set(args.shuffle) + # set up options to get + # Page::Subpage::GUI-id::param-id + options = { + "randomizer": { + "item": { + "retro": "retro", + "worldstate": "mode", + "logiclevel": "logic", + "goal": "goal", + "crystals_gt": "crystals_gt", + "crystals_ganon": "crystals_ganon", + "weapons": "swords", + "itempool": "difficulty", + "itemfunction": "item_functionality", + "timer": "timer", + "progressives": "progressive", + "accessibility": "accessibility", + "sortingalgo": "algorithm" + }, + "entrance": { + "openpyramid": "openpyramid", + "shuffleganon": "shuffleganon", + "entranceshuffle": "shuffle" + }, + "enemizer": { + "potshuffle": "shufflepots", + "enemyshuffle": "shuffleenemies", + "bossshuffle": "shufflebosses", + "enemydamage": "enemy_damage", + "enemyhealth": "enemy_health" + }, + "dungeon": { + "mapshuffle": "mapshuffle", + "compassshuffle": "compassshuffle", + "smallkeyshuffle": "keyshuffle", + "bigkeyshuffle": "bigkeyshuffle", + "dungeondoorshuffle": "door_shuffle", + "experimental": "experimental" + }, + "gameoptions": { + "hints": "hints", + "nobgm": "disablemusic", + "quickswap": "quickswap", + "heartcolor": "heartcolor", + "heartbeep": "heartbeep", + "menuspeed": "fastmenu", + "owpalettes": "ow_palettes", + "uwpalettes": "uw_palettes" + }, + "generation": { + "spoiler": "create_spoiler", + "suppressrom": "suppress_rom" + } + } + } + for mainpage in options: + for subpage in options[mainpage]: + for widget in options[mainpage][subpage]: + arg = options[mainpage][subpage][widget] + gui.pages[mainpage].pages[subpage].widgets[widget].storageVar.set(getattr(args, arg)) - gui.pages["randomizer"].pages["enemizer"].widgets["potshuffle"].storageVar.set(args.shufflepots) gui.pages["randomizer"].pages["enemizer"].enemizerCLIpathVar.set(args.enemizercli) - gui.pages["randomizer"].pages["enemizer"].widgets["enemyshuffle"].storageVar.set(args.shuffleenemies) - gui.pages["randomizer"].pages["enemizer"].widgets["bossshuffle"].storageVar.set(args.shufflebosses) - gui.pages["randomizer"].pages["enemizer"].widgets["enemydamage"].storageVar.set(args.enemy_damage) - gui.pages["randomizer"].pages["enemizer"].widgets["enemyhealth"].storageVar.set(args.enemy_health) - - gui.pages["randomizer"].pages["dungeon"].widgets["mapshuffle"].storageVar.set(args.mapshuffle) - gui.pages["randomizer"].pages["dungeon"].widgets["compassshuffle"].storageVar.set(args.compassshuffle) - gui.pages["randomizer"].pages["dungeon"].widgets["smallkeyshuffle"].storageVar.set(args.keyshuffle) - gui.pages["randomizer"].pages["dungeon"].widgets["bigkeyshuffle"].storageVar.set(args.bigkeyshuffle) - gui.pages["randomizer"].pages["dungeon"].widgets["dungeondoorshuffle"].storageVar.set(args.door_shuffle) - gui.pages["randomizer"].pages["dungeon"].widgets["experimental"].storageVar.set(args.experimental) - - gui.pages["randomizer"].pages["gameoptions"].widgets["hints"].storageVar.set(args.hints) - gui.pages["randomizer"].pages["gameoptions"].widgets["nobgm"].storageVar.set(int(args.disablemusic)) - gui.pages["randomizer"].pages["gameoptions"].widgets["quickswap"].storageVar.set(int(args.quickswap)) - gui.pages["randomizer"].pages["gameoptions"].widgets["heartcolor"].storageVar.set(args.heartcolor) - gui.pages["randomizer"].pages["gameoptions"].widgets["heartbeep"].storageVar.set(args.heartbeep) - gui.pages["randomizer"].pages["gameoptions"].widgets["menuspeed"].storageVar.set(args.fastmenu) - gui.pages["randomizer"].pages["gameoptions"].widgets["owpalettes"].storageVar.set(args.ow_palettes) - gui.pages["randomizer"].pages["gameoptions"].widgets["uwpalettes"].storageVar.set(args.uw_palettes) - - gui.pages["randomizer"].pages["generation"].widgets["spoiler"].storageVar.set(int(args.create_spoiler)) - gui.pages["randomizer"].pages["generation"].widgets["suppressrom"].storageVar.set(int(args.suppress_rom)) gui.pages["randomizer"].pages["generation"].romVar.set(args.rom) if args.multi: From 01fd3d418f640a34b3cd1ba0a41e6989d329e475 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 03:17:46 -0800 Subject: [PATCH 067/117] Split Adjust vars Still populate with Game Options page --- gui/adjust/overview.py | 58 +++++++++++++++++++++--------------------- gui/loadcliargs.py | 10 ++------ 2 files changed, 31 insertions(+), 37 deletions(-) diff --git a/gui/adjust/overview.py b/gui/adjust/overview.py index 9e4e993b..74d84452 100644 --- a/gui/adjust/overview.py +++ b/gui/adjust/overview.py @@ -11,29 +11,29 @@ def adjust_page(top, parent, settings): self = ttk.Frame(parent) # Adjust options - self.adjustWidgets = {} + self.widgets = {} # Disable BGM key = "nobgm" - self.adjustWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "checkbox", self, "Disable Music & MSU-1", - top.pages["randomizer"].pages["gameoptions"].widgets["nobgm"].storageVar + None ) - self.adjustWidgets[key].pack(anchor=W) + self.widgets[key].pack(anchor=W) # L/R Quickswap key = "quickswap" - self.adjustWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "checkbox", self, "L/R Quickswapping", - top.pages["randomizer"].pages["gameoptions"].widgets["quickswap"].storageVar + None ) - self.adjustWidgets[key].pack(anchor=W) + self.widgets[key].pack(anchor=W) selectOptionsFrame = Frame(self) leftAdjustFrame = Frame(selectOptionsFrame) @@ -46,12 +46,12 @@ def adjust_page(top, parent, settings): ## Heart Color key = "heartcolor" - self.adjustWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "selectbox", leftAdjustFrame, "Heart Color", - top.pages["randomizer"].pages["gameoptions"].widgets["heartcolor"].storageVar, + None, {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, { "Red": "red", @@ -61,16 +61,16 @@ def adjust_page(top, parent, settings): "Random": "random" } ) - self.adjustWidgets[key].pack(anchor=E) + self.widgets[key].pack(anchor=E) ## Heart Beep Speed key = "heartbeep" - self.adjustWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "selectbox", leftAdjustFrame, "Heart Beep sound rate", - top.pages["randomizer"].pages["gameoptions"].widgets["heartbeep"].storageVar, + None, {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}, "default": "Normal"}, { "Double": "double", @@ -80,7 +80,7 @@ def adjust_page(top, parent, settings): "Off": "off" } ) - self.adjustWidgets[key].pack(anchor=W) + self.widgets[key].pack(anchor=W) # Sprite Selection self.spriteNameVar2 = StringVar() @@ -110,12 +110,12 @@ def adjust_page(top, parent, settings): # Menu Speed key = "menuspeed" - self.adjustWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "selectbox", rightAdjustFrame, "Menu Speed", - top.pages["randomizer"].pages["gameoptions"].widgets["menuspeed"].storageVar, + None, {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}, "default": "Normal"}, { "Instant": "instant", @@ -126,16 +126,16 @@ def adjust_page(top, parent, settings): "Half": "half" } ) - self.adjustWidgets[key].pack(anchor=E) + self.widgets[key].pack(anchor=E) # Overworld Palettes (not Enemizer) key = "owpalettes" - self.adjustWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "selectbox", rightAdjustFrame, "Overworld Palettes", - top.pages["randomizer"].pages["gameoptions"].widgets["owpalettes"].storageVar, + None, {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, { "Default": "default", @@ -143,16 +143,16 @@ def adjust_page(top, parent, settings): "Blackout": "blackout" } ) - self.adjustWidgets[key].pack(anchor=E) + self.widgets[key].pack(anchor=E) # Underworld Palettes (not Enemizer) key = "uwpalettes" - self.adjustWidgets[key] = widgets.make_widget( + self.widgets[key] = widgets.make_widget( self, "selectbox", rightAdjustFrame, "Underworld Palettes", - top.pages["randomizer"].pages["gameoptions"].widgets["uwpalettes"].storageVar, + None, {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, { "Default": "default", @@ -160,7 +160,7 @@ def adjust_page(top, parent, settings): "Blackout": "blackout" } ) - self.adjustWidgets[key].pack(anchor=E) + self.widgets[key].pack(anchor=E) adjustRomFrame = Frame(bottomAdjustFrame) adjustRomLabel = Label(adjustRomFrame, text='Rom to adjust: ') @@ -181,13 +181,13 @@ def adjust_page(top, parent, settings): def adjustRom(): guiargs = Namespace() - guiargs.heartbeep = self.adjustWidgets["heartbeep"].storageVar.get() - guiargs.heartcolor = self.adjustWidgets["heartcolor"].storageVar.get() - guiargs.fastmenu = self.adjustWidgets["menuspeed"].storageVar.get() - guiargs.ow_palettes = self.adjustWidgets["owpalettes"].storageVar.get() - guiargs.uw_palettes = self.adjustWidgets["uwpalettes"].storageVar.get() - guiargs.quickswap = bool(self.adjustWidgets["quickswap"].storageVar.get()) - guiargs.disablemusic = bool(self.adjustWidgets["nobgm"].storageVar.get()) + guiargs.heartbeep = self.widgets["heartbeep"].storageVar.get() + guiargs.heartcolor = self.widgets["heartcolor"].storageVar.get() + guiargs.fastmenu = self.widgets["menuspeed"].storageVar.get() + guiargs.ow_palettes = self.widgets["owpalettes"].storageVar.get() + guiargs.uw_palettes = self.widgets["uwpalettes"].storageVar.get() + guiargs.quickswap = bool(self.widgets["quickswap"].storageVar.get()) + guiargs.disablemusic = bool(self.widgets["nobgm"].storageVar.get()) guiargs.rom = self.romVar2.get() guiargs.baserom = top.pages["randomizer"].pages["generation"].romVar.get() guiargs.sprite = self.sprite diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index cce5b886..0db97113 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -70,6 +70,8 @@ def loadcliargs(gui, args): for widget in options[mainpage][subpage]: arg = options[mainpage][subpage][widget] gui.pages[mainpage].pages[subpage].widgets[widget].storageVar.set(getattr(args, arg)) + if subpage == "gameoptions" and not widget == "hints": + gui.pages["adjust"].content.widgets[widget].storageVar.set(getattr(args, arg)) gui.pages["randomizer"].pages["enemizer"].enemizerCLIpathVar.set(args.enemizercli) gui.pages["randomizer"].pages["generation"].romVar.set(args.rom) @@ -91,14 +93,6 @@ def loadcliargs(gui, args): spriteNameVar=gui.pages["randomizer"].pages["gameoptions"].widgets["sprite"]["spriteNameVar"], randomSpriteVar=gui.randomSprite) - gui.pages["adjust"].content.adjustWidgets["nobgm"].storageVar.set(int(args.disablemusic)) - gui.pages["adjust"].content.adjustWidgets['quickswap'].storageVar.set(args.quickswap) - gui.pages["adjust"].content.adjustWidgets["heartcolor"].storageVar.set(args.heartcolor) - gui.pages["adjust"].content.adjustWidgets["heartbeep"].storageVar.set(args.heartbeep) - gui.pages["adjust"].content.adjustWidgets["menuspeed"].storageVar.set(args.fastmenu) - gui.pages["adjust"].content.adjustWidgets["owpalettes"].storageVar.set(args.ow_palettes) - gui.pages["adjust"].content.adjustWidgets["uwpalettes"].storageVar.set(args.uw_palettes) - def sprite_setter_adj(spriteObject): gui.pages["adjust"].content.sprite = spriteObject if args.sprite is not None: From 901e5fc0c6304eaedbf692afe7cf930feb0d1890 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 03:52:33 -0800 Subject: [PATCH 068/117] Fix precedence of vars --- Gui.py | 9 ++- gui/adjust/overview.py | 19 +++--- gui/loadcliargs.py | 129 ++++++++++++++++++++++++----------------- 3 files changed, 95 insertions(+), 62 deletions(-) diff --git a/Gui.py b/Gui.py index 7a8fe0dc..fa51c557 100755 --- a/Gui.py +++ b/Gui.py @@ -9,7 +9,7 @@ from CLI import get_settings from DungeonRandomizer import parse_arguments from gui.adjust.overview import adjust_page from gui.custom.overview import custom_page -from gui.loadcliargs import loadcliargs +from gui.loadcliargs import loadcliargs, loadadjustargs from gui.randomize.item import item_page from gui.randomize.entrando import entrando_page from gui.randomize.enemizer import enemizer_page @@ -29,6 +29,8 @@ def guiMain(args=None): settings_path = os.path.join(user_resources_path) if not os.path.exists(settings_path): os.makedirs(settings_path) + for widget in self.pages["adjust"].content.widgets: + args["adjust." + widget] = self.pages["adjust"].content.widgets[widget].storageVar.get() with open(os.path.join(settings_path, "settings.json"), "w+") as f: f.write(json.dumps(args, indent=2)) os.chmod(os.path.join(settings_path, "settings.json"),0o755) @@ -141,8 +143,11 @@ def guiMain(args=None): return False vcmd=(self.pages["custom"].content.register(validation), '%P') + # load adjust settings into options + loadadjustargs(self, self.settings) + # load args from CLI into options - loadcliargs(self, args) + loadcliargs(self, args, self.settings) mainWindow.mainloop() diff --git a/gui/adjust/overview.py b/gui/adjust/overview.py index 74d84452..14999eee 100644 --- a/gui/adjust/overview.py +++ b/gui/adjust/overview.py @@ -180,14 +180,19 @@ def adjust_page(top, parent, settings): adjustRomFrame.pack(fill=X, expand=True) def adjustRom(): + options = { + "heartbeep": "heartbeep", + "heartcolor": "heartcolor", + "menuspeed": "fastmenu", + "owpalettes": "ow_palettes", + "uwpalettes": "uw_palettes", + "quickswap": "quickswap", + "nobgm": "disablemusic" + } guiargs = Namespace() - guiargs.heartbeep = self.widgets["heartbeep"].storageVar.get() - guiargs.heartcolor = self.widgets["heartcolor"].storageVar.get() - guiargs.fastmenu = self.widgets["menuspeed"].storageVar.get() - guiargs.ow_palettes = self.widgets["owpalettes"].storageVar.get() - guiargs.uw_palettes = self.widgets["uwpalettes"].storageVar.get() - guiargs.quickswap = bool(self.widgets["quickswap"].storageVar.get()) - guiargs.disablemusic = bool(self.widgets["nobgm"].storageVar.get()) + for option in options: + arg = options[option] + setattr(guiargs, arg, self.widgets[option].storageVar.get()) guiargs.rom = self.romVar2.get() guiargs.baserom = top.pages["randomizer"].pages["generation"].romVar.get() guiargs.sprite = self.sprite diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index 0db97113..5ae18c22 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -3,7 +3,7 @@ from gui.randomize.gameoptions import set_sprite from Rom import Sprite -def loadcliargs(gui, args): +def loadcliargs(gui, args, settings=None): if args is not None: for k, v in vars(args).items(): if type(v) is dict: @@ -13,57 +13,57 @@ def loadcliargs(gui, args): # set up options to get # Page::Subpage::GUI-id::param-id options = { - "randomizer": { - "item": { - "retro": "retro", - "worldstate": "mode", - "logiclevel": "logic", - "goal": "goal", - "crystals_gt": "crystals_gt", - "crystals_ganon": "crystals_ganon", - "weapons": "swords", - "itempool": "difficulty", - "itemfunction": "item_functionality", - "timer": "timer", - "progressives": "progressive", - "accessibility": "accessibility", - "sortingalgo": "algorithm" - }, - "entrance": { - "openpyramid": "openpyramid", - "shuffleganon": "shuffleganon", - "entranceshuffle": "shuffle" - }, - "enemizer": { - "potshuffle": "shufflepots", - "enemyshuffle": "shuffleenemies", - "bossshuffle": "shufflebosses", - "enemydamage": "enemy_damage", - "enemyhealth": "enemy_health" - }, - "dungeon": { - "mapshuffle": "mapshuffle", - "compassshuffle": "compassshuffle", - "smallkeyshuffle": "keyshuffle", - "bigkeyshuffle": "bigkeyshuffle", - "dungeondoorshuffle": "door_shuffle", - "experimental": "experimental" - }, - "gameoptions": { - "hints": "hints", - "nobgm": "disablemusic", - "quickswap": "quickswap", - "heartcolor": "heartcolor", - "heartbeep": "heartbeep", - "menuspeed": "fastmenu", - "owpalettes": "ow_palettes", - "uwpalettes": "uw_palettes" - }, - "generation": { - "spoiler": "create_spoiler", - "suppressrom": "suppress_rom" - } - } + "randomizer": { + "item": { + "retro": "retro", + "worldstate": "mode", + "logiclevel": "logic", + "goal": "goal", + "crystals_gt": "crystals_gt", + "crystals_ganon": "crystals_ganon", + "weapons": "swords", + "itempool": "difficulty", + "itemfunction": "item_functionality", + "timer": "timer", + "progressives": "progressive", + "accessibility": "accessibility", + "sortingalgo": "algorithm" + }, + "entrance": { + "openpyramid": "openpyramid", + "shuffleganon": "shuffleganon", + "entranceshuffle": "shuffle" + }, + "enemizer": { + "potshuffle": "shufflepots", + "enemyshuffle": "shuffleenemies", + "bossshuffle": "shufflebosses", + "enemydamage": "enemy_damage", + "enemyhealth": "enemy_health" + }, + "dungeon": { + "mapshuffle": "mapshuffle", + "compassshuffle": "compassshuffle", + "smallkeyshuffle": "keyshuffle", + "bigkeyshuffle": "bigkeyshuffle", + "dungeondoorshuffle": "door_shuffle", + "experimental": "experimental" + }, + "gameoptions": { + "hints": "hints", + "nobgm": "disablemusic", + "quickswap": "quickswap", + "heartcolor": "heartcolor", + "heartbeep": "heartbeep", + "menuspeed": "fastmenu", + "owpalettes": "ow_palettes", + "uwpalettes": "uw_palettes" + }, + "generation": { + "spoiler": "create_spoiler", + "suppressrom": "suppress_rom" + } + } } for mainpage in options: for subpage in options[mainpage]: @@ -71,7 +71,10 @@ def loadcliargs(gui, args): arg = options[mainpage][subpage][widget] gui.pages[mainpage].pages[subpage].widgets[widget].storageVar.set(getattr(args, arg)) if subpage == "gameoptions" and not widget == "hints": - gui.pages["adjust"].content.widgets[widget].storageVar.set(getattr(args, arg)) + hasSettings = settings is not None + hasWidget = ("adjust." + widget) in settings if hasSettings else None + if hasWidget is None: + gui.pages["adjust"].content.widgets[widget].storageVar.set(getattr(args, arg)) gui.pages["randomizer"].pages["enemizer"].enemizerCLIpathVar.set(args.enemizercli) gui.pages["randomizer"].pages["generation"].romVar.set(args.rom) @@ -101,3 +104,23 @@ def loadcliargs(gui, args): set_sprite(sprite_obj, r_sprite_flag, spriteSetter=sprite_setter_adj, spriteNameVar=gui.pages["adjust"].content.spriteNameVar2, randomSpriteVar=gui.randomSprite) + +def loadadjustargs(gui, settings): + options = { + "adjust": { + "content": { + "nobgm": "adjust.nobgm", + "quickswap": "adjust.quickswap", + "heartcolor": "adjust.heartcolor", + "heartbeep": "adjust.heartbeep", + "menuspeed": "adjust.menuspeed", + "owpalettes": "adjust.owpalettes", + "uwpalettes": "adjust.uwpalettes" + } + } + } + for mainpage in options: + for subpage in options[mainpage]: + for widget in options[mainpage][subpage]: + key = options[mainpage][subpage][widget] + gui.pages[mainpage].content.widgets[widget].storageVar.set(settings[key]) From e6b5bb7e04bca0faa2104b55baa899600a78d38b Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 06:15:13 -0800 Subject: [PATCH 069/117] Streamline guiargs --- gui/bottom.py | 130 +++++++++++++++++++++--------------- gui/loadcliargs.py | 102 ++++++++++++++-------------- gui/randomize/multiworld.py | 19 +++--- gui/widgets.py | 31 +++++---- 4 files changed, 158 insertions(+), 124 deletions(-) diff --git a/gui/bottom.py b/gui/bottom.py index 8ca29586..503cb193 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -88,68 +88,94 @@ def bottom_frame(self, parent, args=None): def create_guiargs(parent): guiargs = Namespace() - guiargs.retro = bool(parent.pages["randomizer"].pages["item"].widgets["retro"].storageVar.get()) - guiargs.mode = parent.pages["randomizer"].pages["item"].widgets["worldstate"].storageVar.get() - guiargs.logic = parent.pages["randomizer"].pages["item"].widgets["logiclevel"].storageVar.get() - guiargs.goal = parent.pages["randomizer"].pages["item"].widgets["goal"].storageVar.get() - guiargs.crystals_gt = parent.pages["randomizer"].pages["item"].widgets["crystals_gt"].storageVar.get() - guiargs.crystals_ganon = parent.pages["randomizer"].pages["item"].widgets["crystals_ganon"].storageVar.get() - guiargs.swords = parent.pages["randomizer"].pages["item"].widgets["weapons"].storageVar.get() - guiargs.difficulty = parent.pages["randomizer"].pages["item"].widgets["itempool"].storageVar.get() - guiargs.item_functionality = parent.pages["randomizer"].pages["item"].widgets["itemfunction"].storageVar.get() - guiargs.timer = parent.pages["randomizer"].pages["item"].widgets["timer"].storageVar.get() - guiargs.progressive = parent.pages["randomizer"].pages["item"].widgets["progressives"].storageVar.get() - guiargs.accessibility = parent.pages["randomizer"].pages["item"].widgets["accessibility"].storageVar.get() - guiargs.algorithm = parent.pages["randomizer"].pages["item"].widgets["sortingalgo"].storageVar.get() - guiargs.openpyramid = bool(parent.pages["randomizer"].pages["entrance"].widgets["openpyramid"].storageVar.get()) - guiargs.shuffleganon = bool(parent.pages["randomizer"].pages["entrance"].widgets["shuffleganon"].storageVar.get()) - guiargs.shuffle = parent.pages["randomizer"].pages["entrance"].widgets["entranceshuffle"].storageVar.get() - - guiargs.shufflepots = bool(parent.pages["randomizer"].pages["enemizer"].widgets["potshuffle"].storageVar.get()) - guiargs.enemizercli = parent.pages["randomizer"].pages["enemizer"].enemizerCLIpathVar.get() - guiargs.shuffleenemies = parent.pages["randomizer"].pages["enemizer"].widgets["enemyshuffle"].storageVar.get() - guiargs.shufflebosses = parent.pages["randomizer"].pages["enemizer"].widgets["bossshuffle"].storageVar.get() - guiargs.enemy_damage = parent.pages["randomizer"].pages["enemizer"].widgets["enemydamage"].storageVar.get() - guiargs.enemy_health = parent.pages["randomizer"].pages["enemizer"].widgets["enemyhealth"].storageVar.get() - - guiargs.mapshuffle = bool(parent.pages["randomizer"].pages["dungeon"].widgets["mapshuffle"].storageVar.get()) - guiargs.compassshuffle = bool(parent.pages["randomizer"].pages["dungeon"].widgets["compassshuffle"].storageVar.get()) - guiargs.keyshuffle = bool(parent.pages["randomizer"].pages["dungeon"].widgets["smallkeyshuffle"].storageVar.get()) - guiargs.bigkeyshuffle = bool(parent.pages["randomizer"].pages["dungeon"].widgets["bigkeyshuffle"].storageVar.get()) - guiargs.door_shuffle = parent.pages["randomizer"].pages["dungeon"].widgets["dungeondoorshuffle"].storageVar.get() - guiargs.experimental = parent.pages["randomizer"].pages["dungeon"].widgets["experimental"].storageVar.get() + # set up settings to gather + # Page::Subpage::GUI-id::param-id + options = { + "randomizer": { + "item": { + "retro": "retro", + "worldstate": "mode", + "logiclevel": "logic", + "goal": "goal", + "crystals_gt": "crystals_gt", + "crystals_ganon": "crystals_ganon", + "weapons": "swords", + "itempool": "difficulty", + "itemfunction": "item_functionality", + "timer": "timer", + "progressives": "progressive", + "accessibility": "accessibility", + "sortingalgo": "algorithm" + }, + "entrance": { + "openpyramid": "openpyramid", + "shuffleganon": "shuffleganon", + "entranceshuffle": "shuffle" + }, + "enemizer": { + "potshuffle": "shufflepots", + "enemyshuffle": "shuffleenemies", + "bossshuffle": "shufflebosses", + "enemydamage": "enemy_damage", + "enemyhealth": "enemy_health" + }, + "dungeon": { + "mapshuffle": "mapshuffle", + "compassshuffle": "compassshuffle", + "smallkeyshuffle": "keyshuffle", + "bigkeyshuffle": "bigkeyshuffle", + "dungeondoorshuffle": "door_shuffle", + "experimental": "experimental" + }, + "multiworld": { + "names": "names" + }, + "gameoptions": { + "hints": "hints", + "nobgm": "disablemusic", + "quickswap": "quickswap", + "heartcolor": "heartcolor", + "heartbeep": "heartbeep", + "menuspeed": "fastmenu", + "owpalettes": "ow_palettes", + "uwpalettes": "uw_palettes" + }, + "generation": { + "spoiler": "create_spoiler", + "suppressrom": "suppress_rom" + } + } + } + for mainpage in options: + for subpage in options[mainpage]: + for widget in options[mainpage][subpage]: + arg = options[mainpage][subpage][widget] + setattr(guiargs, arg, parent.pages[mainpage].pages[subpage].widgets[widget].storageVar.get()) guiargs.multi = int(parent.pages["randomizer"].pages["multiworld"].widgets["worlds"].storageVar.get()) - guiargs.names = parent.pages["randomizer"].pages["multiworld"].namesVar.get() - guiargs.hints = bool(parent.pages["randomizer"].pages["gameoptions"].widgets["hints"].storageVar.get()) - guiargs.disablemusic = bool(parent.pages["randomizer"].pages["gameoptions"].widgets["nobgm"].storageVar.get()) - guiargs.quickswap = bool(parent.pages["randomizer"].pages["gameoptions"].widgets["quickswap"].storageVar.get()) - guiargs.heartcolor = parent.pages["randomizer"].pages["gameoptions"].widgets["heartcolor"].storageVar.get() - guiargs.heartbeep = parent.pages["randomizer"].pages["gameoptions"].widgets["heartbeep"].storageVar.get() - guiargs.fastmenu = parent.pages["randomizer"].pages["gameoptions"].widgets["menuspeed"].storageVar.get() - guiargs.ow_palettes = parent.pages["randomizer"].pages["gameoptions"].widgets["owpalettes"].storageVar.get() - guiargs.uw_palettes = parent.pages["randomizer"].pages["gameoptions"].widgets["uwpalettes"].storageVar.get() - - guiargs.create_spoiler = bool(parent.pages["randomizer"].pages["generation"].widgets["spoiler"].storageVar.get()) - guiargs.skip_playthrough = not bool(parent.pages["randomizer"].pages["generation"].widgets["spoiler"].storageVar.get()) - guiargs.suppress_rom = bool(parent.pages["randomizer"].pages["generation"].widgets["suppressrom"].storageVar.get()) guiargs.rom = parent.pages["randomizer"].pages["generation"].romVar.get() guiargs.custom = bool(parent.pages["randomizer"].pages["generation"].widgets["usecustompool"].storageVar.get()) guiargs.seed = int(parent.frames["bottom"].seedVar.get()) if parent.frames["bottom"].seedVar.get() else None guiargs.count = int(parent.frames["bottom"].widgets["generationcount"].storageVar.get()) if parent.frames["bottom"].widgets["generationcount"].storageVar.get() != '1' else None - guiargs.customitemarray = [int(parent.pages["custom"].content.customWidgets["bow"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["silversupgrade"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["boomerang"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["redmerang"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["hookshot"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["mushroom"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["powder"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["firerod"].storageVar.get()), - int(parent.pages["custom"].content.customWidgets["icerod"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["bombos"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["ether"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["quake"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["lamp"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["hammer"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["shovel"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["flute"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["bugnet"].storageVar.get()), - int(parent.pages["custom"].content.customWidgets["book"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["bottle"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["somaria"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["byrna"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["cape"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["mirror"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["boots"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["powerglove"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["titansmitt"].storageVar.get()), - int(parent.pages["custom"].content.customWidgets["progressiveglove"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["flippers"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["pearl"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["heartpiece"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["heartcontainer"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["sancheart"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["sword1"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["sword2"].storageVar.get()), - int(parent.pages["custom"].content.customWidgets["sword3"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["sword4"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["progressivesword"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["shield1"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["shield2"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["shield3"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["progressiveshield"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["mail2"].storageVar.get()), - int(parent.pages["custom"].content.customWidgets["mail3"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["progressivemail"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["halfmagic"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["quartermagic"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["bombsplus5"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["bombsplus10"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["arrowsplus5"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["arrowsplus10"].storageVar.get()), - int(parent.pages["custom"].content.customWidgets["arrow1"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["arrow10"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["bomb1"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["bomb3"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["rupee1"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["rupee5"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["rupee20"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["rupee50"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["rupee100"].storageVar.get()), - int(parent.pages["custom"].content.customWidgets["rupee300"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["rupoor"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["blueclock"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["greenclock"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["redclock"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["progressivebow"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["bomb10"].storageVar.get()), int(parent.pages["custom"].content.customWidgets["triforcepieces"].storageVar.get()),int(parent.pages["custom"].content.customWidgets["triforcepiecesgoal"].storageVar.get()), - int(parent.pages["custom"].content.customWidgets["triforce"].storageVar.get()),int(parent.pages["custom"].content.customWidgets["rupoorcost"].storageVar.get()),int(parent.pages["custom"].content.customWidgets["generickeys"].storageVar.get())] + customitems = [ + "bow", "silversupgrade", "boomerang", "redmerang", "hookshot", "mushroom", "powder", "firerod", + "icerod", "bombos", "ether", "quake", "lamp", "hammer", "shovel", "flute", "bugnet", + "book", "bottle", "somaria", "byrna", "cape", "mirror", "boots", "powerglove", "titansmitt", + "progressiveglove", "flippers", "pearl", "heartpiece", "heartcontainer", "sancheart", "sword1", "sword2", + "sword3", "sword4", "progressivesword", "shield1", "shield2", "shield3", "progressiveshield", "mail2", + "mail3", "progressivemail", "halfmagic", "quartermagic", "bombsplus5", "bombsplus10", "arrowsplus5", "arrowsplus10", + "arrow1", "arrow10", "bomb1", "bomb3", "rupee1", "rupee5", "rupee20", "rupee50", "rupee100", + "rupee300", "rupoor", "blueclock", "greenclock", "redclock", "progressivebow", "bomb10", "triforcepieces", "triforcepiecesgoal", + "triforce", "rupoorcost", "generickeys" + ] + guiargs.customitemarray = [] + for customitem in customitems: + guiargs.customitemarray.append(int(parent.pages["custom"].content.customWidgets[customitem].storageVar.get())) + guiargs.sprite = parent.pages["randomizer"].pages["gameoptions"].widgets["sprite"]["spriteObject"] guiargs.randomSprite = parent.randomSprite.get() guiargs.outputpath = parent.outputPath.get() diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index 5ae18c22..26adbde7 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -13,57 +13,57 @@ def loadcliargs(gui, args, settings=None): # set up options to get # Page::Subpage::GUI-id::param-id options = { - "randomizer": { - "item": { - "retro": "retro", - "worldstate": "mode", - "logiclevel": "logic", - "goal": "goal", - "crystals_gt": "crystals_gt", - "crystals_ganon": "crystals_ganon", - "weapons": "swords", - "itempool": "difficulty", - "itemfunction": "item_functionality", - "timer": "timer", - "progressives": "progressive", - "accessibility": "accessibility", - "sortingalgo": "algorithm" - }, - "entrance": { - "openpyramid": "openpyramid", - "shuffleganon": "shuffleganon", - "entranceshuffle": "shuffle" - }, - "enemizer": { - "potshuffle": "shufflepots", - "enemyshuffle": "shuffleenemies", - "bossshuffle": "shufflebosses", - "enemydamage": "enemy_damage", - "enemyhealth": "enemy_health" - }, - "dungeon": { - "mapshuffle": "mapshuffle", - "compassshuffle": "compassshuffle", - "smallkeyshuffle": "keyshuffle", - "bigkeyshuffle": "bigkeyshuffle", - "dungeondoorshuffle": "door_shuffle", - "experimental": "experimental" - }, - "gameoptions": { - "hints": "hints", - "nobgm": "disablemusic", - "quickswap": "quickswap", - "heartcolor": "heartcolor", - "heartbeep": "heartbeep", - "menuspeed": "fastmenu", - "owpalettes": "ow_palettes", - "uwpalettes": "uw_palettes" - }, - "generation": { - "spoiler": "create_spoiler", - "suppressrom": "suppress_rom" - } - } + "randomizer": { + "item": { + "retro": "retro", + "worldstate": "mode", + "logiclevel": "logic", + "goal": "goal", + "crystals_gt": "crystals_gt", + "crystals_ganon": "crystals_ganon", + "weapons": "swords", + "itempool": "difficulty", + "itemfunction": "item_functionality", + "timer": "timer", + "progressives": "progressive", + "accessibility": "accessibility", + "sortingalgo": "algorithm" + }, + "entrance": { + "openpyramid": "openpyramid", + "shuffleganon": "shuffleganon", + "entranceshuffle": "shuffle" + }, + "enemizer": { + "potshuffle": "shufflepots", + "enemyshuffle": "shuffleenemies", + "bossshuffle": "shufflebosses", + "enemydamage": "enemy_damage", + "enemyhealth": "enemy_health" + }, + "dungeon": { + "mapshuffle": "mapshuffle", + "compassshuffle": "compassshuffle", + "smallkeyshuffle": "keyshuffle", + "bigkeyshuffle": "bigkeyshuffle", + "dungeondoorshuffle": "door_shuffle", + "experimental": "experimental" + }, + "gameoptions": { + "hints": "hints", + "nobgm": "disablemusic", + "quickswap": "quickswap", + "heartcolor": "heartcolor", + "heartbeep": "heartbeep", + "menuspeed": "fastmenu", + "owpalettes": "ow_palettes", + "uwpalettes": "uw_palettes" + }, + "generation": { + "spoiler": "create_spoiler", + "suppressrom": "suppress_rom" + } + } } for mainpage in options: for subpage in options[mainpage]: diff --git a/gui/randomize/multiworld.py b/gui/randomize/multiworld.py index 2bfbe06a..22b4a161 100644 --- a/gui/randomize/multiworld.py +++ b/gui/randomize/multiworld.py @@ -21,15 +21,16 @@ def multiworld_page(parent,settings): self.widgets[key].pack(side=LEFT, anchor=N) ## List of Player Names - namesFrame = Frame(self) - namesLabel = Label(namesFrame, text='Player names') - self.namesVar = StringVar(value=settings["names"]) + key = "names" + self.widgets[key] = Frame(self) + self.widgets[key].label = Label(self.widgets[key], text='Player names') + self.widgets[key].storageVar = StringVar(value=settings["names"]) def saveMultiNames(caller,_,mode): - settings["names"] = self.namesVar.get() - self.namesVar.trace_add("write",saveMultiNames) - namesEntry = Entry(namesFrame, textvariable=self.namesVar) - namesLabel.pack(side=LEFT) - namesEntry.pack(side=LEFT, fill=X, expand=True) - namesFrame.pack(anchor=N, fill=X, expand=True) + settings["names"] = self.widgets[key].storageVar.get() + self.widgets[key].storageVar.trace_add("write",saveMultiNames) + self.widgets[key].textbox = Entry(self.widgets[key], textvariable=self.widgets[key].storageVar) + self.widgets[key].label.pack(side=LEFT) + self.widgets[key].textbox.pack(side=LEFT, fill=X, expand=True) + self.widgets[key].pack(anchor=N, fill=X, expand=True) return self,settings diff --git a/gui/widgets.py b/gui/widgets.py index aec2f31c..20f7d1f8 100644 --- a/gui/widgets.py +++ b/gui/widgets.py @@ -14,10 +14,11 @@ class mySpinbox(Spinbox): self.invoke('buttonup') def make_checkbox(self, parent, label, storageVar, packAttrs): - self = Frame(parent) + self = Frame(parent, name="checkframe-" + label.lower()) self.storageVar = storageVar - self.checkbox = Checkbutton(self, text=label, variable=self.storageVar) - self.checkbox.pack(packAttrs) + self.checkbox = Checkbutton(self, text=label, variable=self.storageVar, name="checkbox-" + label.lower()) + if packAttrs is not None: + self.checkbox.pack(packAttrs) return self def make_selectbox(self, parent, label, options, storageVar, packAttrs): @@ -29,24 +30,27 @@ def make_selectbox(self, parent, label, options, storageVar, packAttrs): keysList = list(keys) valsList = list(vals) self.labelVar.set(keysList[valsList.index(str(self.storageVar.get()))]) - self = Frame(parent) + self = Frame(parent, name="selectframe-" + label.lower()) self.storageVar = storageVar self.storageVar.trace_add("write",change_selected) self.labelVar = StringVar() self.labelVar.trace_add("write",change_storage) self.label = Label(self, text=label) - self.label.pack(packAttrs["label"]) + if packAttrs is not None and "label" in packAttrs: + self.label.pack(packAttrs["label"]) self.selectbox = OptionMenu(self, self.labelVar, *options.keys()) self.selectbox.config(width=20) self.labelVar.set(packAttrs["default"] if "default" in packAttrs else list(options.keys())[0]) - self.selectbox.pack(packAttrs["selectbox"]) + if packAttrs is not None and "selectbox" in packAttrs: + self.selectbox.pack(packAttrs["selectbox"]) return self def make_spinbox(self, parent, label, storageVar, packAttrs): - self = Frame(parent) + self = Frame(parent, name="spinframe-" + label.lower()) self.storageVar = storageVar self.label = Label(self, text=label) - self.label.pack(packAttrs["label"]) + if packAttrs is not None and "label" in packAttrs: + self.label.pack(packAttrs["label"]) fromNum = 1 toNum = 100 if "spinbox" in packAttrs: @@ -54,19 +58,22 @@ def make_spinbox(self, parent, label, storageVar, packAttrs): fromNum = packAttrs["spinbox"]["from"] if "to" in packAttrs: toNum = packAttrs["spinbox"]["to"] - self.spinbox = mySpinbox(self, from_=fromNum, to=toNum, width=5, textvariable=self.storageVar) - self.spinbox.pack(packAttrs["spinbox"]) + self.spinbox = mySpinbox(self, from_=fromNum, to=toNum, width=5, textvariable=self.storageVar, name="spinbox-" + label.lower()) + if packAttrs is not None and "spinbox" in packAttrs: + self.spinbox.pack(packAttrs["spinbox"]) return self def make_textbox(self, parent, label, storageVar, packAttrs): self = Frame(parent) self.storageVar = storageVar self.label = Label(self, text=label) - self.label.pack(packAttrs["label"]) + if packAttrs is not None and "label" in packAttrs: + self.label.pack(packAttrs["label"]) self.textbox = Entry(self, justify=RIGHT, textvariable=self.storageVar, width=3) if "default" in packAttrs: self.storageVar.set(packAttrs["default"]) - self.textbox.pack(packAttrs["textbox"]) + if packAttrs is not None and "textbox" in packAttrs: + self.textbox.pack(packAttrs["textbox"]) return self From 20396e479882d4f99fd5f2b3a7b24ac1e402f310 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 06:31:04 -0800 Subject: [PATCH 070/117] Fix Widgets --- gui/widgets.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/gui/widgets.py b/gui/widgets.py index 20f7d1f8..5601482b 100644 --- a/gui/widgets.py +++ b/gui/widgets.py @@ -19,6 +19,8 @@ def make_checkbox(self, parent, label, storageVar, packAttrs): self.checkbox = Checkbutton(self, text=label, variable=self.storageVar, name="checkbox-" + label.lower()) if packAttrs is not None: self.checkbox.pack(packAttrs) + else: + self.checkbox.pack() return self def make_selectbox(self, parent, label, options, storageVar, packAttrs): @@ -38,11 +40,15 @@ def make_selectbox(self, parent, label, options, storageVar, packAttrs): self.label = Label(self, text=label) if packAttrs is not None and "label" in packAttrs: self.label.pack(packAttrs["label"]) + else: + self.label.pack() self.selectbox = OptionMenu(self, self.labelVar, *options.keys()) self.selectbox.config(width=20) self.labelVar.set(packAttrs["default"] if "default" in packAttrs else list(options.keys())[0]) if packAttrs is not None and "selectbox" in packAttrs: self.selectbox.pack(packAttrs["selectbox"]) + else: + self.selectbox.pack() return self def make_spinbox(self, parent, label, storageVar, packAttrs): @@ -51,6 +57,8 @@ def make_spinbox(self, parent, label, storageVar, packAttrs): self.label = Label(self, text=label) if packAttrs is not None and "label" in packAttrs: self.label.pack(packAttrs["label"]) + else: + self.label.pack() fromNum = 1 toNum = 100 if "spinbox" in packAttrs: @@ -61,6 +69,8 @@ def make_spinbox(self, parent, label, storageVar, packAttrs): self.spinbox = mySpinbox(self, from_=fromNum, to=toNum, width=5, textvariable=self.storageVar, name="spinbox-" + label.lower()) if packAttrs is not None and "spinbox" in packAttrs: self.spinbox.pack(packAttrs["spinbox"]) + else: + self.spinbox.pack() return self def make_textbox(self, parent, label, storageVar, packAttrs): @@ -69,11 +79,15 @@ def make_textbox(self, parent, label, storageVar, packAttrs): self.label = Label(self, text=label) if packAttrs is not None and "label" in packAttrs: self.label.pack(packAttrs["label"]) + else: + self.label.pack() self.textbox = Entry(self, justify=RIGHT, textvariable=self.storageVar, width=3) if "default" in packAttrs: self.storageVar.set(packAttrs["default"]) if packAttrs is not None and "textbox" in packAttrs: self.textbox.pack(packAttrs["textbox"]) + else: + self.textbox.pack() return self From bba2058a5b153a1cd5aadcc595eb7ac01fe4d728 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 06:55:10 -0800 Subject: [PATCH 071/117] Dictify Dungeon Rando options --- gui/randomize/dungeon.py | 135 +++++++++++++++++++-------------------- gui/widgets.py | 14 ++++ 2 files changed, 80 insertions(+), 69 deletions(-) diff --git a/gui/randomize/dungeon.py b/gui/randomize/dungeon.py index 973e4830..1b8ecf94 100644 --- a/gui/randomize/dungeon.py +++ b/gui/randomize/dungeon.py @@ -14,76 +14,73 @@ def dungeon_page(parent): mscbLabel = Label(mcsbshuffleFrame, text="Shuffle: ") mscbLabel.pack(side=LEFT) - ## Map Shuffle - key = "mapshuffle" - self.widgets[key] = widgets.make_widget( - self, - "checkbox", - mcsbshuffleFrame, - "Maps", - None - ) - self.widgets[key].pack(side=LEFT) - - ## Compass Shuffle - key = "compassshuffle" - self.widgets[key] = widgets.make_widget( - self, - "checkbox", - mcsbshuffleFrame, - "Compasses", - None - ) - self.widgets[key].pack(side=LEFT) - - ## Small Key Shuffle - key = "smallkeyshuffle" - self.widgets[key] = widgets.make_widget( - self, - "checkbox", - mcsbshuffleFrame, - "Small Keys", - None - ) - self.widgets[key].pack(side=LEFT) - - ## Big Key Shuffle - key = "bigkeyshuffle" - self.widgets[key] = widgets.make_widget( - self, - "checkbox", - mcsbshuffleFrame, - "Big Keys", - None - ) - self.widgets[key].pack(side=LEFT) - - ## Dungeon Door Shuffle - key = "dungeondoorshuffle" - self.widgets[key] = widgets.make_widget( - self, - "selectbox", - self, - "Dungeon Door Shuffle", - None, - {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}, "default": "Basic"}, - { - "Vanilla": "vanilla", - "Basic": "basic", - "Crossed": "crossed" + myDict = { + ## Map Shuffle + "mapshuffle": { + "type": "checkbox", + "label": { + "text": "Maps" + } + }, + ## Compass Shuffle + "compassshuffle": { + "type": "checkbox", + "label": { + "text": "Compasses" + } + }, + ## Small Key Shuffle + "smallkeyshuffle": { + "type": "checkbox", + "label": { + "text": "Small Keys" + } + }, + ## Big Key Shuffle + "bigkeyshuffle": { + "type": "checkbox", + "label": { + "text": "Small Keys" + } } - ) - self.widgets[key].pack(anchor=W) + } - # Experimental features - key = "experimental" - self.widgets[key] = widgets.make_widget( - self, - "checkbox", - self, - "Enable Experimental Features", - None - ) - self.widgets[key].pack(anchor=W) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, mcsbshuffleFrame) + + for key in dictWidgets: + self.widgets[key] = dictWidgets[key] + self.widgets[key].pack(side=LEFT) + + myDict = { + "dungeondoorshuffle": { + "type": "selectbox", + "label": { + "text": "Dungeon Door Shuffle" + }, + "packAttrs": { + "label": { "side": LEFT }, + "selectbox": {"side": RIGHT}, + "default": "Basic" + }, + "options": { + "Vanilla": "vanilla", + "Basic": "basic", + "Crossed": "crossed" + } + }, + ## Experiemental features + "experimental": { + "type": "checkbox", + "label": { + "text": "Enable Experimental Features" + } + } + } + + dictWidgets = widgets.make_widgets_from_dict(self, myDict, self) + + for key in dictWidgets: + self.widgets[key] = dictWidgets[key] + self.widgets[key].pack(anchor=W) return self diff --git a/gui/widgets.py b/gui/widgets.py index 5601482b..c943fa42 100644 --- a/gui/widgets.py +++ b/gui/widgets.py @@ -117,3 +117,17 @@ def make_widget(self, type, parent, label, storageVar=None, packAttrs=dict(), op thisStorageVar = StringVar() widget = make_textbox(self, parent, label, thisStorageVar, packAttrs) return widget + +def make_widget_from_dict(self, defn, parent): + type = defn["type"] if "type" in defn else None + label = defn["label"]["text"] if "label" in defn and "text" in defn["label"] else "" + packAttrs = defn["packAttrs"] if "packAttrs" in defn else None + options = defn["options"] if "options" in defn else None + widget = make_widget(self, type, parent, label, None, packAttrs, options) + return widget + +def make_widgets_from_dict(self, defns, parent): + widgets = {} + for key,defn in defns.items(): + widgets[key] = make_widget_from_dict(self, defn, parent) + return widgets From ec2224d0fcd9d4a9820a309d1e289e9217637bbc Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 07:13:40 -0800 Subject: [PATCH 072/117] Dictify Item Rando options --- gui/randomize/item.py | 435 +++++++++++++++++++++--------------------- 1 file changed, 220 insertions(+), 215 deletions(-) diff --git a/gui/randomize/item.py b/gui/randomize/item.py index 671e6749..29ca8e86 100644 --- a/gui/randomize/item.py +++ b/gui/randomize/item.py @@ -8,232 +8,237 @@ def item_page(parent): # Item Randomizer options self.widgets = {} - ## Retro (eventually needs to become a World State) - key = "retro" - self.widgets[key] = widgets.make_widget( - self, - "checkbox", - self, - "Retro mode (universal keys)", - None - ) - self.widgets[key].pack(anchor=W) + myDict = { + ## Retro (eventually needs to become a World State) + "retro": { + "type": "checkbox", + "label": { + "text": "Retro mode (universal keys)" + } + } + } + dictWidgets = widgets.make_widgets_from_dict(self, myDict, self) + for key in dictWidgets: + self.widgets[key] = dictWidgets[key] + self.widgets[key].pack(anchor=W) leftItemFrame = Frame(self) rightItemFrame = Frame(self) leftItemFrame.pack(side=LEFT) rightItemFrame.pack(side=RIGHT) - ## World State - key = "worldstate" - self.widgets[key] = widgets.make_widget( - self, - "selectbox", - leftItemFrame, - "World State", - None, - {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}, "default": "Open"}, - { - "Standard": "standard", - "Open": "open", - "Inverted": "inverted" - } - ) - self.widgets[key].pack(anchor=E) - - ## Logic Level - key = "logiclevel" - self.widgets[key] = widgets.make_widget( - self, - "selectbox", - leftItemFrame, - "Logic Level", - None, - {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, - { - "No Glitches": "noglitches", - "Minor Glitches": "minorglitches", - "No Logic": "nologic" - } - ) - self.widgets[key].pack(anchor=E) - - ## Goal - key = "goal" - self.widgets[key] = widgets.make_widget( - self, - "selectbox", - leftItemFrame, - "Goal", - None, - {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, - { - "Defeat Ganon": "ganon", - "Master Sword Pedestal": "pedestal", - "All Dungeons": "dungeons", - "Triforce Hunt": "triforcehunt", - "Crystals": "crystals" - } - ) - self.widgets[key].pack(anchor=E) - - ## Number of crystals to open GT - key = "crystals_gt" keys = [*map(str,range(0,7+1)),"Random"] vals = [*map(str,range(0,7+1)),"random"] - options = {keys[i]: vals[i] for i in range(len(keys))} - self.widgets[key] = widgets.make_widget( - self, - "selectbox", - leftItemFrame, - "Crystals to open GT", - None, - {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, - options - ) - self.widgets[key].pack(anchor=E) + crystalsOptions = {keys[i]: vals[i] for i in range(len(keys))} - ## Number of crystals to damage Ganon - key = "crystals_ganon" - keys = [*map(str,range(0,7+1)),"Random"] - vals = [*map(str,range(0,7+1)),"random"] - options = {keys[i]: vals[i] for i in range(len(keys))} - self.widgets[key] = widgets.make_widget( - self, - "selectbox", - leftItemFrame, - "Crystals to harm Ganon", - None, - {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, - options - ) - self.widgets[key].pack(anchor=E) - - ## Weapons - key = "weapons" - self.widgets[key] = widgets.make_widget( - self, - "selectbox", - leftItemFrame, - "Weapons", - None, - {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, - { - "Randomized": "random", - "Assured": "assured", - "Swordless": "swordless", - "Vanilla": "vanilla" + myDict = { + ## World State + "worldstate": { + "type": "selectbox", + "label": { + "text": "World State" + }, + "packAttrs": { + "label": { "side": LEFT }, + "selectbox": { "side": RIGHT }, + "default": "Open" + }, + "options": { + "Standard": "standard", + "Open": "open", + "Inverted": "inverted" + } + }, + ## Logic Level + "logiclevel": { + "type": "selectbox", + "label": { + "text": "Logic Level" + }, + "packAttrs": { + "label": { "side": LEFT }, + "selectbox": { "side": RIGHT } + }, + "options": { + "No Glitches": "noglitches", + "Minor Glitches": "minorglitches", + "No Logic": "nologic" + } + }, + ## Goal + "goal": { + "type": "selectbox", + "label": { + "text": "Goal" + }, + "packAttrs": { + "label": { "side": LEFT }, + "selectbox": { "side": RIGHT } + }, + "options": { + "Defeat Ganon": "ganon", + "Master Sword Pedestal": "pedestal", + "All Dungeons": "dungeons", + "Triforce Hunt": "triforcehunt", + "Crystals": "crystals" + } + }, + ## Number of crystals to open GT + "crystals_gt": { + "type": "selectbox", + "label": { + "text": "Crystals to open GT" + }, + "packAttrs": { + "label": { "side": LEFT }, + "selectbox": { "side": RIGHT } + }, + "options": crystalsOptions + }, + ## Number of crystals to damage Ganon + "crystals_ganon": { + "type": "selectbox", + "label": { + "text": "Crystals to harm Ganon" + }, + "packAttrs": { + "label": { "side": LEFT }, + "selectbox": { "side": RIGHT } + }, + "options": crystalsOptions + }, + ## Weapons + "weapons": { + "type": "selectbox", + "label": { + "text": "Weapons" + }, + "packAttrs": { + "label": { "side": LEFT }, + "selectbox": { "side": RIGHT } + }, + "options": { + "Randomized": "random", + "Assured": "assured", + "Swordless": "swordless", + "Vanilla": "vanilla" + } } - ) - self.widgets[key].pack(anchor=E) + } + dictWidgets = widgets.make_widgets_from_dict(self, myDict, leftItemFrame) + for key in dictWidgets: + self.widgets[key] = dictWidgets[key] + self.widgets[key].pack(anchor=E) - ## Item Pool - key = "itempool" - self.widgets[key] = widgets.make_widget( - self, - "selectbox", - rightItemFrame, - "Item Pool", - None, - {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, - { - "Normal": "normal", - "Hard": "hard", - "Expert": "expert" + myDict = { + ## Item Pool + "itempool": { + "type": "selectbox", + "label": { + "text": "Item Pool" + }, + "packAttrs": { + "label": { "side": LEFT }, + "selectbox": { "side": RIGHT } + }, + "options": { + "Normal": "normal", + "Hard": "hard", + "Expert": "expert" + } + }, + ## Item Functionality + "itemfunction": { + "type": "selectbox", + "label": { + "text": "Item Functionality" + }, + "packAttrs": { + "label": { "side": LEFT }, + "selectbox": { "side": RIGHT } + }, + "options": { + "Normal": "normal", + "Hard": "hard", + "Expert": "expert" + } + }, + ## Timer setting + "timer": { + "type": "selectbox", + "label": { + "text": "Timer Setting" + }, + "packAttrs": { + "label": { "side": LEFT }, + "selectbox": { "side": RIGHT } + }, + "options": { + "No Timer": "none", + "Stopwatch": "display", + "Timed": "timed", + "Timed OHKO": "timed-ohko", + "OHKO": "ohko", + "Timed Countdown": "timed-countdown" + } + }, + ## Progressives: On/Off + "progressives": { + "type": "selectbox", + "label": { + "text": "Progressive Items" + }, + "packAttrs": { + "label": { "side": LEFT }, + "selectbox": { "side": RIGHT } + }, + "options": { + "On": "on", + "Off": "off", + "Random": "random" + } + }, + ## Accessibility + "accessibility": { + "type": "selectbox", + "label": { + "text": "Accessibility" + }, + "packAttrs": { + "label": { "side": LEFT }, + "selectbox": { "side": RIGHT } + }, + "options": { + "100% Inventory": "items", + "100% Locations": "locations", + "Beatable": "none" + } + }, + ## Item Sorting Algorithm + "sortingalgo": { + "type": "selectbox", + "label": { + "text": "Item Sorting" + }, + "packAttrs": { + "label": { "side": LEFT }, + "selectbox": { "side": RIGHT }, + "default": "Balanced" + }, + "options": { + "Freshness": "freshness", + "Flood": "flood", + "VT8.21": "vt21", + "VT8.22": "vt22", + "VT8.25": "vt25", + "VT8.26": "vt26", + "Balanced": "balanced" + } } - ) - self.widgets[key].pack(anchor=E) - - ## Item Functionality - key = "itemfunction" - self.widgets[key] = widgets.make_widget( - self, - "selectbox", - rightItemFrame, - "Item Functionality", - None, - {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, - { - "Normal": "normal", - "Hard": "hard", - "Expert": "expert" - } - ) - self.widgets[key].pack(anchor=E) - - ## Timer setting - key = "timer" - self.widgets[key] = widgets.make_widget( - self, - "selectbox", - rightItemFrame, - "Timer Setting", - None, - {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, - { - "No Timer": "none", - "Stopwatch": "display", - "Timed": "timed", - "Timed OHKO": "timed-ohko", - "OHKO": "ohko", - "Timed Countdown": "timed-countdown" - } - ) - self.widgets[key].pack(anchor=E) - - ## Progressives: On/Off - key = "progressives" - self.widgets[key] = widgets.make_widget( - self, - "selectbox", - rightItemFrame, - "Progressive Items", - None, - {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, - { - "On": "on", - "Off": "off", - "Random": "random" - } - ) - self.widgets[key].pack(anchor=E) - - ## Accessibilty - key = "accessibility" - self.widgets[key] = widgets.make_widget( - self, - "selectbox", - rightItemFrame, - "Accessibility", - None, - {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, - { - "100% Inventory": "items", - "100% Locations": "locations", - "Beatable": "none" - } - ) - self.widgets[key].pack(anchor=E) - - ## Item Sorting Algorithm - key = "sortingalgo" - self.widgets[key] = widgets.make_widget( - self, - "selectbox", - rightItemFrame, - "Item Sorting", - None, - {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}, "default": "Balanced"}, - { - "Freshness": "freshness", - "Flood": "flood", - "VT8.21": "vt21", - "VT8.22": "vt22", - "VT8.25": "vt25", - "VT8.26": "vt26", - "Balanced": "balanced" - } - ) - self.widgets[key].pack(anchor=E) + } + dictWidgets = widgets.make_widgets_from_dict(self, myDict, rightItemFrame) + for key in dictWidgets: + self.widgets[key] = dictWidgets[key] + self.widgets[key].pack(anchor=E) return self From 783d2593073aea2031f124d27d8df61063013778 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 07:20:27 -0800 Subject: [PATCH 073/117] Dictify Entrando Options Fix null arg issue --- gui/loadcliargs.py | 3 +- gui/randomize/entrando.py | 90 +++++++++++++++++++-------------------- 2 files changed, 46 insertions(+), 47 deletions(-) diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index 26adbde7..5fa012bc 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -123,4 +123,5 @@ def loadadjustargs(gui, settings): for subpage in options[mainpage]: for widget in options[mainpage][subpage]: key = options[mainpage][subpage][widget] - gui.pages[mainpage].content.widgets[widget].storageVar.set(settings[key]) + if key in settings: + gui.pages[mainpage].content.widgets[widget].storageVar.set(settings[key]) diff --git a/gui/randomize/entrando.py b/gui/randomize/entrando.py index ab081bb9..9c2db78f 100644 --- a/gui/randomize/entrando.py +++ b/gui/randomize/entrando.py @@ -8,52 +8,50 @@ def entrando_page(parent): # Entrance Randomizer options self.widgets = {} - ## Pyramid pre-opened - key = "openpyramid" - self.widgets[key] = widgets.make_widget( - self, - "checkbox", - self, - "Pre-open Pyramid Hole", - None - ) - self.widgets[key].pack(anchor=W) - - ## Shuffle Ganon - key = "shuffleganon" - self.widgets[key] = widgets.make_widget( - self, - "checkbox", - self, - "Include Ganon's Tower and Pyramid Hole in shuffle pool", - None - ) - self.widgets[key].pack(anchor=W) - - ## Entrance Shuffle - key = "entranceshuffle" - self.widgets[key] = widgets.make_widget( - self, - "selectbox", - self, - "Entrance Shuffle", - None, - {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, - { - "Vanilla": "vanilla", - "Simple": "simple", - "Restricted": "restricted", - "Full": "full", - "Crossed": "crossed", - "Insanity": "insanity", - "Restricted (Legacy)": "restricted_legacy", - "Full (Legacy)": "full_legacy", - "Madness (Legacy)": "madness_legacy", - "Insanity (Legacy)": "insanity_legacy", - "Dungeons + Full": "dungeonsfull", - "Dungeons + Simple": "dungeonssimple" + myDict = { + ## Pyramid pre-opened + "openpyramid": { + "type": "checkbox", + "label": { + "text": "Pre-open Pyramid Hole" + } + }, + ## Shuffle Ganon + "shuffleganon": { + "type": "checkbox", + "label": { + "text": "Include Ganon's Tower and Pyramid Hole in shuffle pool" + } + }, + ## Entrance Shuffle + "entranceshuffle": { + "type": "selectbox", + "label": { + "text": "Entrance Shuffle" + }, + "packAttrs": { + "label": { "side": LEFT }, + "selectbox": { "side": RIGHT } + }, + "options": { + "Vanilla": "vanilla", + "Simple": "simple", + "Restricted": "restricted", + "Full": "full", + "Crossed": "crossed", + "Insanity": "insanity", + "Restricted (Legacy)": "restricted_legacy", + "Full (Legacy)": "full_legacy", + "Madness (Legacy)": "madness_legacy", + "Insanity (Legacy)": "insanity_legacy", + "Dungeons + Full": "dungeonsfull", + "Dungeons + Simple": "dungeonssimple" + } } - ) - self.widgets[key].pack(anchor=W) + } + dictWidgets = widgets.make_widgets_from_dict(self, myDict, self) + for key in dictWidgets: + self.widgets[key] = dictWidgets[key] + self.widgets[key].pack(anchor=W) return self From 7298cbfbc092333291a62140796be1c5d7778ecd Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 15 Feb 2020 07:28:13 -0800 Subject: [PATCH 074/117] Dictify Enemizer Options --- gui/randomize/enemizer.py | 167 ++++++++++++++++++++------------------ 1 file changed, 90 insertions(+), 77 deletions(-) diff --git a/gui/randomize/enemizer.py b/gui/randomize/enemizer.py index 491e9b23..e6e20d20 100644 --- a/gui/randomize/enemizer.py +++ b/gui/randomize/enemizer.py @@ -9,16 +9,19 @@ def enemizer_page(parent,settings): # Enemizer options self.widgets = {} - # Pot Shuffle - key = "potshuffle" - self.widgets[key] = widgets.make_widget( - self, - "checkbox", - self, - "Pot Shuffle", - None - ) - self.widgets[key].pack(anchor=W) + myDict = { + ## Pot Shuffle + "potshuffle": { + "type": "checkbox", + "label": { + "text": "Pot Shuffle" + } + } + } + dictWidgets = widgets.make_widgets_from_dict(self, myDict, self) + for key in dictWidgets: + self.widgets[key] = dictWidgets[key] + self.widgets[key].pack(anchor=W) ## Enemizer CLI Path enemizerPathFrame = Frame(self) @@ -44,75 +47,85 @@ def enemizer_page(parent,settings): leftEnemizerFrame.pack(side=LEFT, anchor=N) rightEnemizerFrame.pack(side=RIGHT, anchor=N) - ## Randomize Enemies - key = "enemyshuffle" - self.widgets[key] = widgets.make_widget( - self, - "selectbox", - leftEnemizerFrame, - "Enemy Shuffle", - None, - {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, - { - "Vanilla": "none", - "Shuffled": "shuffled", - "Chaos": "chaos" + myDict = { + ## Randomize Enemies + "enemyshuffle": { + "type": "selectbox", + "label": { + "text": "Enemy Shuffle" + }, + "packAttrs": { + "label": { "side": LEFT }, + "selectbox": { "side": RIGHT } + }, + "options": { + "Vanilla": "none", + "Shuffled": "shuffled", + "Chaos": "chaos" + } + }, + ## Randomize Bosses + "bossshuffle": { + "type": "selectbox", + "label": { + "text": "Boss Shuffle" + }, + "packAttrs": { + "label": { "side": LEFT }, + "selectbox": { "side": RIGHT } + }, + "options": { + "Vanilla": "none", + "Basic": "basic", + "Shuffled": "shuffled", + "Chaos": "chaos" + } } - ) - self.widgets[key].pack(anchor=E) + } + dictWidgets = widgets.make_widgets_from_dict(self, myDict, leftEnemizerFrame) + for key in dictWidgets: + self.widgets[key] = dictWidgets[key] + self.widgets[key].pack(anchor=E) - ## Randomize Bosses - key = "bossshuffle" - self.widgets[key] = widgets.make_widget( - self, - "selectbox", - leftEnemizerFrame, - "Boss Shuffle", - None, - {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, - { - "Vanilla": "none", - "Basic": "basic", - "Normal": "normal", - "Chaos": "chaos" + myDict = { + ## Enemy Damage + "enemydamage": { + "type": "selectbox", + "label": { + "text": "Enemy Damage" + }, + "packAttrs": { + "label": { "side": LEFT }, + "selectbox": { "side": RIGHT } + }, + "options": { + "Vanilla": "default", + "Shuffled": "shuffled", + "Chaos": "chaos" + } + }, + ## Enemy Health + "enemyhealth": { + "type": "selectbox", + "label": { + "text": "Enemy Health" + }, + "packAttrs": { + "label": { "side": LEFT }, + "selectbox": { "side": RIGHT } + }, + "options": { + "Vanilla": "default", + "Easy": "easy", + "Normal": "normal", + "Hard": "hard", + "Expert": "expert" + } } - ) - self.widgets[key].pack(anchor=E) - - ## Enemy Damage - key = "enemydamage" - self.widgets[key] = widgets.make_widget( - self, - "selectbox", - rightEnemizerFrame, - "Enemy Damage", - None, - {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, - { - "Vanilla": "default", - "Shuffled": "shuffled", - "Chaos": "chaos" - } - ) - self.widgets[key].pack(anchor=E) - - ## Enemy Health - key = "enemyhealth" - self.widgets[key] = widgets.make_widget( - self, - "selectbox", - rightEnemizerFrame, - "Enemy Health", - None, - {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, - { - "Vanilla": "default", - "Easy": "easy", - "Normal": "normal", - "Hard": "hard", - "Expert": "expert" - } - ) - self.widgets[key].pack(anchor=E) + } + dictWidgets = widgets.make_widgets_from_dict(self, myDict, rightEnemizerFrame) + for key in dictWidgets: + self.widgets[key] = dictWidgets[key] + self.widgets[key].pack(anchor=E) return self,settings From 650911c826d821051f64bd8c41f1f1eb3ac90020 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sun, 16 Feb 2020 02:39:26 -0800 Subject: [PATCH 075/117] Dictify Multiworld options --- gui/randomize/multiworld.py | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/gui/randomize/multiworld.py b/gui/randomize/multiworld.py index 22b4a161..4612b852 100644 --- a/gui/randomize/multiworld.py +++ b/gui/randomize/multiworld.py @@ -8,17 +8,23 @@ def multiworld_page(parent,settings): # Multiworld options self.widgets = {} - ## Number of Worlds - key = "worlds" - self.widgets[key] = widgets.make_widget( - self, - "spinbox", - self, - "Worlds", - None, - {"label": {"side": LEFT}, "spinbox": {"side": RIGHT}} - ) - self.widgets[key].pack(side=LEFT, anchor=N) + myDict = { + ## Number of worlds + "worlds": { + "type": "spinbox", + "label": { + "text": "Worlds" + }, + "packAttrs": { + "label": { "side": LEFT }, + "spinbox": { "side": RIGHT } + } + } + } + dictWidgets = widgets.make_widgets_from_dict(self, myDict, self) + for key in dictWidgets: + self.widgets[key] = dictWidgets[key] + self.widgets[key].pack(side=LEFT, anchor=N) ## List of Player Names key = "names" From 09611075fed13b33b7851d6171b8386b9b3c357b Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sun, 16 Feb 2020 02:52:25 -0800 Subject: [PATCH 076/117] Dictify Game Options --- gui/randomize/gameoptions.py | 246 ++++++++++++++++++----------------- 1 file changed, 126 insertions(+), 120 deletions(-) diff --git a/gui/randomize/gameoptions.py b/gui/randomize/gameoptions.py index ecd3705d..1785f38d 100644 --- a/gui/randomize/gameoptions.py +++ b/gui/randomize/gameoptions.py @@ -11,81 +11,82 @@ def gameoptions_page(top, parent): # Game Options options self.widgets = {} - ## Hints: Useful/Not useful - key = "hints" - self.widgets[key] = widgets.make_widget( - self, - "checkbox", - self, - "Include Helpful Hints", - None - ) - self.widgets[key].pack(anchor=W) - - ## Disable BGM - key = "nobgm" - self.widgets[key] = widgets.make_widget( - self, - "checkbox", - self, - "Disable Music & MSU-1", - None - ) - self.widgets[key].pack(anchor=W) - - ## L/R Quickswap - key = "quickswap" - self.widgets[key] = widgets.make_widget( - self, - "checkbox", - self, - "L/R Quickswapping", - None - ) - self.widgets[key].pack(anchor=W) + myDict = { + ## Hints: Useful/Not useful + "hints": { + "type": "checkbox", + "label": { + "text": "Include Helpful Hints" + } + }, + ## Disable BGM + "nobgm": { + "type": "checkbox", + "label": { + "text": "Disable Music & MSU-1" + } + }, + ## L/R Quickswap + "quickswap": { + "type": "checkbox", + "label": { + "text": "L/R Quickswapping" + } + } + } + dictWidgets = widgets.make_widgets_from_dict(self, myDict, self) + for key in dictWidgets: + self.widgets[key] = dictWidgets[key] + self.widgets[key].pack(anchor=W) leftRomOptionsFrame = Frame(self) rightRomOptionsFrame = Frame(self) leftRomOptionsFrame.pack(side=LEFT) rightRomOptionsFrame.pack(side=RIGHT) - ## Heart Color - key = "heartcolor" - self.widgets[key] = widgets.make_widget( - self, - "selectbox", - leftRomOptionsFrame, - "Heart Color", - None, - {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, - { - "Red": "red", - "Blue": "blue", - "Green": "green", - "Yellow": "yellow", - "Random": "random" + myDict = { + ## Heart Color + "heartcolor": { + "type": "selectbox", + "label": { + "text": "Heart Color" + }, + "packAttrs": { + "label": { "side": LEFT }, + "selectbox": { "side": RIGHT } + }, + "options": { + "Red": "red", + "Blue": "blue", + "Green": "green", + "Yellow": "yellow", + "Random": "random" + } + }, + ## Heart Beep speed + "heartbeep": { + "type": "selectbox", + "label": { + "text": "Heart Beep sound rate" + }, + "packAttrs": { + "label": { "side": LEFT }, + "selectbox": { "side": RIGHT}, + "default": "Normal" + }, + "options": { + "Double": "double", + "Normal": "normal", + "Half": "half", + "Quarter": "quarter", + "Off": "off" + } } - ) - self.widgets[key].pack(anchor=E) - - ## Heart Beep Speed - key = "heartbeep" - self.widgets[key] = widgets.make_widget( - self, - "selectbox", - leftRomOptionsFrame, - "Heart Beep sound rate", - None, - {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}, "default": "Normal"}, - { - "Double": "double", - "Normal": "normal", - "Half": "half", - "Quarter": "quarter", - "Off": "off" - } - ) - self.widgets[key].pack(anchor=W) + } + dictWidgets = widgets.make_widgets_from_dict(self, myDict, leftRomOptionsFrame) + for key in dictWidgets: + self.widgets[key] = dictWidgets[key] + self.widgets[key].pack(anchor=E) ## Sprite selection spriteDialogFrame = Frame(leftRomOptionsFrame) @@ -113,59 +114,64 @@ def gameoptions_page(top, parent): spriteSelectButton.pack(side=LEFT) spriteDialogFrame.pack(anchor=E) - ## Menu Speed - key = "menuspeed" - self.widgets[key] = widgets.make_widget( - self, - "selectbox", - rightRomOptionsFrame, - "Menu Speed", - None, - {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}, "default": "Normal"}, - { - "Instant": "instant", - "Quadruple": "quadruple", - "Triple": "triple", - "Double": "double", - "Normal": "normal", - "Half": "half" + myDict = { + ## Menu Speed + "menuspeed": { + "type": "selectbox", + "label": { + "text": "Menu Speed" + }, + "packAttrs": { + "label": { "side": LEFT }, + "selectbox": { "side": RIGHT }, + "default": "Normal" + }, + "options": { + "Instant": "instant", + "Quadruple": "quadruple", + "Triple": "triple", + "Double": "double", + "Normal": "normal", + "Half": "half" + } + }, + ## Overworld Palettes (not Enemizer) + "owpalettes": { + "type": "selectbox", + "label": { + "text": "Overworld Palettes" + }, + "packAttrs": { + "label": { "side": LEFT }, + "selectbox": { "side": RIGHT } + }, + "options": { + "Default": "default", + "Random": "random", + "Blackout": "blackout" + } + }, + ## Underworld Palettes (not Enemizer) + "uwpalettes": { + "type": "selectbox", + "label": { + "text": "Underworld Palettes" + }, + "packAttrs": { + "label": { "side": LEFT }, + "selectbox": { "side": RIGHT } + }, + "options": { + "Default": "default", + "Random": "random", + "Blackout": "blackout" + } } - ) - self.widgets[key].pack(anchor=E) - - ## Overworld Palettes (not Enemizer) - key = "owpalettes" - self.widgets[key] = widgets.make_widget( - self, - "selectbox", - rightRomOptionsFrame, - "Overworld Palettes", - None, - {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, - { - "Default": "default", - "Random": "random", - "Blackout": "blackout" - } - ) - self.widgets[key].pack(anchor=E) - - ## Underworld Palettes (not Enemizer) - key = "uwpalettes" - self.widgets[key] = widgets.make_widget( - self, - "selectbox", - rightRomOptionsFrame, - "Underworld Palettes", - None, - {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, - { - "Default": "default", - "Random": "random", - "Blackout": "blackout" - } - ) - self.widgets[key].pack(anchor=E) + } + dictWidgets = widgets.make_widgets_from_dict(self, myDict, rightRomOptionsFrame) + for key in dictWidgets: + self.widgets[key] = dictWidgets[key] + self.widgets[key].pack(anchor=E) return self From 4c35dea72213cf73056b3340a50a21db038e5f84 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sun, 16 Feb 2020 02:55:01 -0800 Subject: [PATCH 077/117] Dictify Generation Setup options --- gui/randomize/generation.py | 59 +++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 32 deletions(-) diff --git a/gui/randomize/generation.py b/gui/randomize/generation.py index 2095a4bc..9659d63d 100644 --- a/gui/randomize/generation.py +++ b/gui/randomize/generation.py @@ -9,38 +9,33 @@ def generation_page(parent,settings): # Generation Setup options self.widgets = {} - ## Generate Spoiler - key = "spoiler" - self.widgets[key] = widgets.make_widget( - self, - "checkbox", - self, - "Create Spoiler Log", - None - ) - self.widgets[key].pack(anchor=W) - - ## Don't make ROM - key = "suppressrom" - self.widgets[key] = widgets.make_widget( - self, - "checkbox", - self, - "Do not create patched ROM", - None - ) - self.widgets[key].pack(anchor=W) - - ## Use Custom Item Pool as defined in Custom tab - key = "usecustompool" - self.widgets[key] = widgets.make_widget( - self, - "checkbox", - self, - "Use custom item pool", - None - ) - self.widgets[key].pack(anchor=W) + myDict = { + ## Generate Spoiler + "spoiler": { + "type": "checkbox", + "label": { + "text": "Create Spoiler Log" + } + }, + ## Don't make ROM + "suppressrom": { + "type": "checkbox", + "label": { + "text": "Do not create patched ROM" + } + }, + ## Use Custom Item Pool as defined in Custom tab + "usecustompool": { + "type": "checkbox", + "label": { + "text": "Use custom item pool" + } + } + } + dictWidgets = widgets.make_widgets_from_dict(self, myDict, self) + for key in dictWidgets: + self.widgets[key] = dictWidgets[key] + self.widgets[key].pack(anchor=W) ## Locate base ROM baseRomFrame = Frame(self) From 2eb060931b186a2158064af870b4119f195d9d5e Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sun, 16 Feb 2020 02:58:21 -0800 Subject: [PATCH 078/117] Dictify Adjust options --- gui/adjust/overview.py | 228 +++++++++++++++++++++-------------------- 1 file changed, 119 insertions(+), 109 deletions(-) diff --git a/gui/adjust/overview.py b/gui/adjust/overview.py index 14999eee..2265f681 100644 --- a/gui/adjust/overview.py +++ b/gui/adjust/overview.py @@ -13,27 +13,26 @@ def adjust_page(top, parent, settings): # Adjust options self.widgets = {} - # Disable BGM - key = "nobgm" - self.widgets[key] = widgets.make_widget( - self, - "checkbox", - self, - "Disable Music & MSU-1", - None - ) - self.widgets[key].pack(anchor=W) - - # L/R Quickswap - key = "quickswap" - self.widgets[key] = widgets.make_widget( - self, - "checkbox", - self, - "L/R Quickswapping", - None - ) - self.widgets[key].pack(anchor=W) + myDict = { + ## Disable BGM + "nobgm": { + "type": "checkbox", + "label": { + "text": "Disable Music & MSU-1" + } + }, + ## L/R Quickswap + "quickswap": { + "type": "checkbox", + "label": { + "text": "L/R Quickswapping" + } + } + } + dictWidgets = widgets.make_widgets_from_dict(self, myDict, self) + for key in dictWidgets: + self.widgets[key] = dictWidgets[key] + self.widgets[key].pack(anchor=W) selectOptionsFrame = Frame(self) leftAdjustFrame = Frame(selectOptionsFrame) @@ -44,43 +43,49 @@ def adjust_page(top, parent, settings): rightAdjustFrame.pack(side=RIGHT) bottomAdjustFrame.pack(fill=X, expand=True) - ## Heart Color - key = "heartcolor" - self.widgets[key] = widgets.make_widget( - self, - "selectbox", - leftAdjustFrame, - "Heart Color", - None, - {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, - { - "Red": "red", - "Blue": "blue", - "Green": "green", - "Yellow": "yellow", - "Random": "random" + myDict = { + ## Heart Color + "heartcolor": { + "type": "selectbox", + "label": { + "text": "Heart Color" + }, + "packAttrs": { + "label": { "side": LEFT }, + "selectbox": { "side": RIGHT } + }, + "options": { + "Red": "red", + "Blue": "blue", + "Green": "green", + "Yellow": "yellow", + "Random": "random" + } + }, + ## Heart Beep speed + "heartbeep": { + "type": "selectbox", + "label": { + "text": "Heart Beep sound rate" + }, + "packAttrs": { + "label": { "side": LEFT }, + "selectbox": { "side": RIGHT}, + "default": "Normal" + }, + "options": { + "Double": "double", + "Normal": "normal", + "Half": "half", + "Quarter": "quarter", + "Off": "off" + } } - ) - self.widgets[key].pack(anchor=E) - - ## Heart Beep Speed - key = "heartbeep" - self.widgets[key] = widgets.make_widget( - self, - "selectbox", - leftAdjustFrame, - "Heart Beep sound rate", - None, - {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}, "default": "Normal"}, - { - "Double": "double", - "Normal": "normal", - "Half": "half", - "Quarter": "quarter", - "Off": "off" - } - ) - self.widgets[key].pack(anchor=W) + } + dictWidgets = widgets.make_widgets_from_dict(self, myDict, leftAdjustFrame) + for key in dictWidgets: + self.widgets[key] = dictWidgets[key] + self.widgets[key].pack(anchor=E) # Sprite Selection self.spriteNameVar2 = StringVar() @@ -108,59 +113,64 @@ def adjust_page(top, parent, settings): spriteSelectButton2.pack(side=LEFT) spriteDialogFrame2.pack(anchor=E) - # Menu Speed - key = "menuspeed" - self.widgets[key] = widgets.make_widget( - self, - "selectbox", - rightAdjustFrame, - "Menu Speed", - None, - {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}, "default": "Normal"}, - { - "Instant": "instant", - "Quadruple": "quadruple", - "Triple": "triple", - "Double": "double", - "Normal": "normal", - "Half": "half" + myDict = { + ## Menu Speed + "menuspeed": { + "type": "selectbox", + "label": { + "text": "Menu Speed" + }, + "packAttrs": { + "label": { "side": LEFT }, + "selectbox": { "side": RIGHT }, + "default": "Normal" + }, + "options": { + "Instant": "instant", + "Quadruple": "quadruple", + "Triple": "triple", + "Double": "double", + "Normal": "normal", + "Half": "half" + } + }, + ## Overworld Palettes (not Enemizer) + "owpalettes": { + "type": "selectbox", + "label": { + "text": "Overworld Palettes" + }, + "packAttrs": { + "label": { "side": LEFT }, + "selectbox": { "side": RIGHT } + }, + "options": { + "Default": "default", + "Random": "random", + "Blackout": "blackout" + } + }, + ## Underworld Palettes (not Enemizer) + "uwpalettes": { + "type": "selectbox", + "label": { + "text": "Underworld Palettes" + }, + "packAttrs": { + "label": { "side": LEFT }, + "selectbox": { "side": RIGHT } + }, + "options": { + "Default": "default", + "Random": "random", + "Blackout": "blackout" + } } - ) - self.widgets[key].pack(anchor=E) - - # Overworld Palettes (not Enemizer) - key = "owpalettes" - self.widgets[key] = widgets.make_widget( - self, - "selectbox", - rightAdjustFrame, - "Overworld Palettes", - None, - {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, - { - "Default": "default", - "Random": "random", - "Blackout": "blackout" - } - ) - self.widgets[key].pack(anchor=E) - - # Underworld Palettes (not Enemizer) - key = "uwpalettes" - self.widgets[key] = widgets.make_widget( - self, - "selectbox", - rightAdjustFrame, - "Underworld Palettes", - None, - {"label": {"side": LEFT}, "selectbox": {"side": RIGHT}}, - { - "Default": "default", - "Random": "random", - "Blackout": "blackout" - } - ) - self.widgets[key].pack(anchor=E) + } + dictWidgets = widgets.make_widgets_from_dict(self, myDict, rightAdjustFrame) + for key in dictWidgets: + self.widgets[key] = dictWidgets[key] + self.widgets[key].pack(anchor=E) adjustRomFrame = Frame(bottomAdjustFrame) adjustRomLabel = Label(adjustRomFrame, text='Rom to adjust: ') From 2f026daab18ce8bfbc7777cbd24767c57da34e71 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sun, 16 Feb 2020 03:11:23 -0800 Subject: [PATCH 079/117] Dictify first column of Custom --- gui/custom/overview.py | 320 ++++++++++++++++++++++++----------------- 1 file changed, 186 insertions(+), 134 deletions(-) diff --git a/gui/custom/overview.py b/gui/custom/overview.py index 59a87e6a..bcc638a5 100644 --- a/gui/custom/overview.py +++ b/gui/custom/overview.py @@ -23,140 +23,192 @@ def custom_page(top,parent): currentList = itemList1 - # Bow - key = "bow" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Bow", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,53)}, "textbox": {"side": RIGHT}, "default": 0} - ) - self.customWidgets[key].pack() - - # Progressive Bow - key = "progressivebow" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Prog.Bow", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,25)}, "textbox": {"side": RIGHT}, "default": 2} - ) - self.customWidgets[key].pack() - - # Boomerang - key = "boomerang" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "B.Boomerang", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,4)}, "textbox": {"side": RIGHT}, "default": 1} - ) - self.customWidgets[key].pack() - - # Redmerang - key = "redmerang" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "M.Boomerang", - None, - {"label": {"anchor": W, "side": LEFT}, "textbox": {"side": RIGHT}, "default": 1} - ) - self.customWidgets[key].pack() - - # Hookshot - key = "hookshot" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Hookshot", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,24)}, "textbox": {"side": RIGHT}, "default": 1} - ) - self.customWidgets[key].pack() - - # Mushroom - key = "mushroom" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Mushroom", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,17)}, "textbox": {"side": RIGHT}, "default": 1} - ) - self.customWidgets[key].pack() - - # Powder - key = "powder" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Magic Powder", - None, - {"label": {"anchor": W, "side": LEFT}, "textbox": {"side": RIGHT}, "default": 1} - ) - self.customWidgets[key].pack() - - # Fire Rod - key = "firerod" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Fire Rod", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,33)}, "textbox": {"side": RIGHT}, "default": 1} - ) - self.customWidgets[key].pack() - - # Ice Rod - key = "icerod" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Ice Rod", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,37)}, "textbox": {"side": RIGHT}, "default": 1} - ) - self.customWidgets[key].pack() - - # Bombos - key = "bombos" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Bombos", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,32)}, "textbox": {"side": RIGHT}, "default": 1} - ) - self.customWidgets[key].pack() - - # Ether - key = "ether" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Ether", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,49)}, "textbox": {"side": RIGHT}, "default": 1} - ) - self.customWidgets[key].pack() - - # Quake - key = "quake" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Quake", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,42)}, "textbox": {"side": RIGHT}, "default": 1} - ) - self.customWidgets[key].pack() - - # Lamp - key = "lamp" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Lamp", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,46)}, "textbox": {"side": RIGHT}, "default": 1} - ) - self.customWidgets[key].pack() - - # Hammer - key = "hammer" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Hammer", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,29)}, "textbox": {"side": RIGHT}, "default": 1} - ) - self.customWidgets[key].pack() - - # Shovel - key = "shovel" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Shovel", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,41)}, "textbox": {"side": RIGHT}, "default": 1} - ) - self.customWidgets[key].pack() + myDict = { + # Bow + "bow": { + "type": "textbox", + "label": { + "text": "Bow" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,53) }, + "textbox": { "side": RIGHT }, + "default": 0 + } + }, + # Progressive Bow + "progressivebow": { + "type": "textbox", + "label": { + "text": "Prog.Bow" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,25) }, + "textbox": { "side": RIGHT }, + "default": 2 + } + }, + # Boomerang + "boomerang": { + "type": "textbox", + "label": { + "text": "B.Boomerang" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,4) }, + "textbox": { "side": RIGHT }, + "default": 1 + } + }, + # Boomerang + "redmerang": { + "type": "textbox", + "label": { + "text": "M.Boomerang" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT }, + "textbox": { "side": RIGHT }, + "default": 1 + } + }, + # Hookshot + "hookshot": { + "type": "textbox", + "label": { + "text": "Hookshot" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,24) }, + "textbox": { "side": RIGHT }, + "default": 1 + } + }, + # Mushroom + "mushroom": { + "type": "textbox", + "label": { + "text": "Mushroom" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,17) }, + "textbox": { "side": RIGHT }, + "default": 1 + } + }, + # Powder + "powder": { + "type": "textbox", + "label": { + "text": "Magic Powder" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT }, + "textbox": { "side": RIGHT }, + "default": 1 + } + }, + # Fire Rod + "firerod": { + "type": "textbox", + "label": { + "text": "Fire Rod" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,33) }, + "textbox": { "side": RIGHT }, + "default": 1 + } + }, + # Ice Rod + "icerod": { + "type": "textbox", + "label": { + "text": "Ice Rod" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,37) }, + "textbox": { "side": RIGHT }, + "default": 1 + } + }, + # Bombos + "bombos": { + "type": "textbox", + "label": { + "text": "Bombos" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,32) }, + "textbox": { "side": RIGHT }, + "default": 1 + } + }, + # Ether + "ether": { + "type": "textbox", + "label": { + "text": "Ether" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,49) }, + "textbox": { "side": RIGHT }, + "default": 1 + } + }, + # Quake + "quake": { + "type": "textbox", + "label": { + "text": "Quake" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,42) }, + "textbox": { "side": RIGHT }, + "default": 1 + } + }, + # Lamp + "lamp": { + "type": "textbox", + "label": { + "text": "Lamp" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,46) }, + "textbox": { "side": RIGHT }, + "default": 1 + } + }, + # Hammer + "hammer": { + "type": "textbox", + "label": { + "text": "Hammer" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,29) }, + "textbox": { "side": RIGHT }, + "default": 1 + } + }, + # Shovel + "shovel": { + "type": "textbox", + "label": { + "text": "Shovel" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,41) }, + "textbox": { "side": RIGHT }, + "default": 1 + } + } + } + dictWidgets = widgets.make_widgets_from_dict(self, myDict, currentList) + for key in dictWidgets: + self.customWidgets[key] = dictWidgets[key] + self.customWidgets[key].pack() currentList = itemList2 From 88a3074e742e8f85b297e94c9041ee2bf5162ea8 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sun, 16 Feb 2020 23:43:59 -0800 Subject: [PATCH 080/117] Dictify remainder of Custom options --- gui/custom/overview.py | 1196 +++++++++++++++++++++++----------------- 1 file changed, 696 insertions(+), 500 deletions(-) diff --git a/gui/custom/overview.py b/gui/custom/overview.py index bcc638a5..259a7d50 100644 --- a/gui/custom/overview.py +++ b/gui/custom/overview.py @@ -212,515 +212,711 @@ def custom_page(top,parent): currentList = itemList2 - # Flute - key = "flute" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Flute", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,58)}, "textbox": {"side": RIGHT}, "default": 1} - ) - self.customWidgets[key].pack() - - # Bug Net - key = "bugnet" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Bug Net", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,41)}, "textbox": {"side": RIGHT}, "default": 1} - ) - self.customWidgets[key].pack() - - # Book of Mudora - key = "book" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Book", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,57)}, "textbox": {"side": RIGHT}, "default": 1} - ) - self.customWidgets[key].pack() - - # Bottle - key = "bottle" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Bottle", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,53)}, "textbox": {"side": RIGHT}, "default": 4} - ) - self.customWidgets[key].pack() - - # Cane of Somaria - key = "somaria" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "C.Somaria", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,30)}, "textbox": {"side": RIGHT}, "default": 1} - ) - self.customWidgets[key].pack() - - # Cane of Byrna - key = "byrna" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "C.Byrna", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,43)}, "textbox": {"side": RIGHT}, "default": 1} - ) - self.customWidgets[key].pack() - - # Magic Cape - key = "cape" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Magic Cape", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,21)}, "textbox": {"side": RIGHT}, "default": 1} - ) - self.customWidgets[key].pack() - - # Magic Mirror - key = "mirror" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Magic Mirror", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,15)}, "textbox": {"side": RIGHT}, "default": 1} - ) - self.customWidgets[key].pack() - - # Pegasus Boots - key = "boots" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Pegasus Boots", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,8)}, "textbox": {"side": RIGHT}, "default": 1} - ) - self.customWidgets[key].pack() - - # Power Glove - key = "powerglove" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Power Glove", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,18)}, "textbox": {"side": RIGHT}, "default": 0} - ) - self.customWidgets[key].pack() - - # Titan's Mitt - key = "titansmitt" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Titan\'s Mitt", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,24)}, "textbox": {"side": RIGHT}, "default": 1} - ) - self.customWidgets[key].pack() - - # Progressive Glove - key = "progressiveglove" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Prog.Glove", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,26)}, "textbox": {"side": RIGHT}, "default": 2} - ) - self.customWidgets[key].pack() - - # Flippers - key = "flippers" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Flippers", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,43)}, "textbox": {"side": RIGHT}, "default": 1} - ) - self.customWidgets[key].pack() - - # Moon Pearl - key = "pearl" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Moon Pearl", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,23)}, "textbox": {"side": RIGHT}, "default": 1} - ) - self.customWidgets[key].pack() - - # Piece of Heart - key = "heartpiece" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Piece of Heart", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,10)}, "textbox": {"side": RIGHT}, "default": 24} - ) - self.customWidgets[key].pack() + myDict = { + # Flute + "flute": { + "type": "textbox", + "label": { + "text": "Flute" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,58) }, + "textbox": { "side": RIGHT }, + "default": 1 + } + }, + # Bug Net + "bugnet": { + "type": "textbox", + "label": { + "text": "Bug Net" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,41) }, + "textbox": { "side": RIGHT }, + "default": 1 + } + }, + # Book of Mudora + "book": { + "type": "textbox", + "label": { + "text": "Book" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,57) }, + "textbox": { "side": RIGHT }, + "default": 1 + } + }, + # Bottle + "bottle": { + "type": "textbox", + "label": { + "text": "Bottle" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,53) }, + "textbox": { "side": RIGHT }, + "default": 4 + } + }, + # Cane of Somaria + "somaria": { + "type": "textbox", + "label": { + "text": "C.Somaria" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,30) }, + "textbox": { "side": RIGHT }, + "default": 1 + } + }, + # Cane of Byrna + "byrna": { + "type": "textbox", + "label": { + "text": "C.Byrna" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,43) }, + "textbox": { "side": RIGHT }, + "default": 1 + } + }, + # Magic Cape + "cape": { + "type": "textbox", + "label": { + "text": "Magic Cape" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,21) }, + "textbox": { "side": RIGHT }, + "default": 1 + } + }, + # Magic Mirror + "mirror": { + "type": "textbox", + "label": { + "text": "Magic Mirror" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,15) }, + "textbox": { "side": RIGHT }, + "default": 1 + } + }, + # Pegasus Boots + "boots": { + "type": "textbox", + "label": { + "text": "Pegasus Boots" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,8) }, + "textbox": { "side": RIGHT }, + "default": 1 + } + }, + # Power Glove + "powerglove": { + "type": "textbox", + "label": { + "text": "Power Glove" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,18) }, + "textbox": { "side": RIGHT }, + "default": 0 + } + }, + # Titan's Mitt + "titansmitt": { + "type": "textbox", + "label": { + "text": "Titan\'s Mitt" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,25) }, + "textbox": { "side": RIGHT }, + "default": 0 + } + }, + # Progressive Glove + "progressiveglove": { + "type": "textbox", + "label": { + "text": "Prog.Glove" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,26) }, + "textbox": { "side": RIGHT }, + "default": 2 + } + }, + # Flippers + "flippers": { + "type": "textbox", + "label": { + "text": "Flippers" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,43) }, + "textbox": { "side": RIGHT }, + "default": 1 + } + }, + # Moon Pearl + "pearl": { + "type": "textbox", + "label": { + "text": "Moon Pearl" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,23) }, + "textbox": { "side": RIGHT }, + "default": 1 + } + }, + # Piece of Heart + "heartpiece": { + "type": "textbox", + "label": { + "text": "Piece of Heart" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,10) }, + "textbox": { "side": RIGHT }, + "default": 24 + } + } + } + dictWidgets = widgets.make_widgets_from_dict(self, myDict, currentList) + for key in dictWidgets: + self.customWidgets[key] = dictWidgets[key] + self.customWidgets[key].pack() currentList = itemList3 - # Heart Container - key = "heartcontainer" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Heart Container", - None, - {"label": {"anchor": W, "side": LEFT}, "textbox": {"side": RIGHT}, "default": 10} - ) - self.customWidgets[key].pack() - - # Sanctuary Heart - key = "sancheart" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Sanctuary Heart", - None, - {"label": {"anchor": W, "side": LEFT}, "textbox": {"side": RIGHT}, "default": 1} - ) - self.customWidgets[key].pack() - - # Fighters' Sword - key = "sword1" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Sword 1", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,42)}, "textbox": {"side": RIGHT}, "default": 0} - ) - self.customWidgets[key].pack() - - # Master Sword - key = "sword2" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Sword 2", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,42)}, "textbox": {"side": RIGHT}, "default": 0} - ) - self.customWidgets[key].pack() - - # Tempered Sword - key = "sword3" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Sword 3", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,42)}, "textbox": {"side": RIGHT}, "default": 0} - ) - self.customWidgets[key].pack() - - # Gold Sword - key = "sword4" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Sword 4", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,42)}, "textbox": {"side": RIGHT}, "default": 0} - ) - self.customWidgets[key].pack() - - # Progressive Sword - key = "progressivesword" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Prog.Sword", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,23)}, "textbox": {"side": RIGHT}, "default": 4} - ) - self.customWidgets[key].pack() - - # Fighters' Shield - key = "shield1" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Shield 1", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,43)}, "textbox": {"side": RIGHT}, "default": 0} - ) - self.customWidgets[key].pack() - - # Fire Shield - key = "shield2" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Shield 2", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,43)}, "textbox": {"side": RIGHT}, "default": 0} - ) - self.customWidgets[key].pack() - - # Mirror Shield - key = "shield3" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Shield 3", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,43)}, "textbox": {"side": RIGHT}, "default": 0} - ) - self.customWidgets[key].pack() - - # Progressive Shield - key = "progressiveshield" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Prog.Shield", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,24)}, "textbox": {"side": RIGHT}, "default": 3} - ) - self.customWidgets[key].pack() - - # Blue Mail - key = "mail2" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Blue Mail", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,35)}, "textbox": {"side": RIGHT}, "default": 0} - ) - self.customWidgets[key].pack() - - # Red Mail - key = "mail3" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Red Mail", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,38)}, "textbox": {"side": RIGHT}, "default": 0} - ) - self.customWidgets[key].pack() - - # Progressive Mail - key = "progressivemail" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Prog.Mail", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,33)}, "textbox": {"side": RIGHT}, "default": 2} - ) - self.customWidgets[key].pack() - - # Half Magic - key = "halfmagic" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Half Magic", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,26)}, "textbox": {"side": RIGHT}, "default": 1} - ) - self.customWidgets[key].pack() + myDict = { + # Heart Container + "heartcontainer": { + "type": "textbox", + "label": { + "text": "Heart Container" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT }, + "textbox": { "side": RIGHT }, + "default": 10 + } + }, + # Sanctuary Heart + "sancheart": { + "type": "textbox", + "label": { + "text": "Sanctuary Heart" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT }, + "textbox": { "side": RIGHT }, + "default": 1 + } + }, + # Fighters' Sword + "sword1": { + "type": "textbox", + "label": { + "text": "Sword 1" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,42) }, + "textbox": { "side": RIGHT }, + "default": 0 + } + }, + # Master Sword + "sword2": { + "type": "textbox", + "label": { + "text": "Sword 2" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,42) }, + "textbox": { "side": RIGHT }, + "default": 0 + } + }, + # Tempered Sword + "sword3": { + "type": "textbox", + "label": { + "text": "Sword 3" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,42) }, + "textbox": { "side": RIGHT }, + "default": 0 + } + }, + # Gold Sword + "sword4": { + "type": "textbox", + "label": { + "text": "Sword 4" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,42) }, + "textbox": { "side": RIGHT }, + "default": 0 + } + }, + # Progressive Sword + "progressivesword": { + "type": "textbox", + "label": { + "text": "Prog.Sword" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,23) }, + "textbox": { "side": RIGHT }, + "default": 4 + } + }, + # Fighters' Shield + "shield1": { + "type": "textbox", + "label": { + "text": "Shield 1" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,43) }, + "textbox": { "side": RIGHT }, + "default": 0 + } + }, + # Fire Shield + "shield2": { + "type": "textbox", + "label": { + "text": "Shield 2" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,43) }, + "textbox": { "side": RIGHT }, + "default": 0 + } + }, + # Mirror Shield + "shield3": { + "type": "textbox", + "label": { + "text": "Shield 3" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,43) }, + "textbox": { "side": RIGHT }, + "default": 0 + } + }, + # Progressive Shield + "progressiveshield": { + "type": "textbox", + "label": { + "text": "Prog.Shield" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,24) }, + "textbox": { "side": RIGHT }, + "default": 3 + } + }, + # Blue Mail + "mail2": { + "type": "textbox", + "label": { + "text": "Blue Mail" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,35) }, + "textbox": { "side": RIGHT }, + "default": 0 + } + }, + # Red Mail + "mail3": { + "type": "textbox", + "label": { + "text": "Red Mail" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,38) }, + "textbox": { "side": RIGHT }, + "default": 0 + } + }, + # Progressive Mail + "progressivemail": { + "type": "textbox", + "label": { + "text": "Prog.Mail" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,33) }, + "textbox": { "side": RIGHT }, + "default": 2 + } + }, + # Half Magic + "halfmagic": { + "type": "textbox", + "label": { + "text": "Half Magic" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,26) }, + "textbox": { "side": RIGHT }, + "default": 1 + } + } + } + dictWidgets = widgets.make_widgets_from_dict(self, myDict, currentList) + for key in dictWidgets: + self.customWidgets[key] = dictWidgets[key] + self.customWidgets[key].pack() currentList = itemList4 - # Quarter Magic - key = "quartermagic" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Quarter Magic", - None, - {"label": {"anchor": W, "side": LEFT}, "textbox": {"side": RIGHT}, "default": 0} - ) - self.customWidgets[key].pack() - - # Bomb Capacity +5 - key = "bombsplus5" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Bomb C.+5", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,16)}, "textbox": {"side": RIGHT}, "default": 0} - ) - self.customWidgets[key].pack() - - # Bomb Capacity +10 - key = "bombsplus10" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Bomb C.+10", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,10)}, "textbox": {"side": RIGHT}, "default": 0} - ) - self.customWidgets[key].pack() - - # Arrow Capacity +5 - key = "arrowsplus5" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Arrow C.+5", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,16)}, "textbox": {"side": RIGHT}, "default": 0} - ) - self.customWidgets[key].pack() - - # Arrow Capacity +10 - key = "arrowsplus10" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Arrow C.+10", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,10)}, "textbox": {"side": RIGHT}, "default": 0} - ) - self.customWidgets[key].pack() - - # Arrow (1) - key = "arrow1" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Arrow (1)", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,27)}, "textbox": {"side": RIGHT}, "default": 1} - ) - self.customWidgets[key].pack() - - # Arrow (10) - key = "arrow10" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Arrow (10)", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,21)}, "textbox": {"side": RIGHT}, "default": 12} - ) - self.customWidgets[key].pack() - - # Bomb (1) - key = "bomb1" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Bomb (1)", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,26)}, "textbox": {"side": RIGHT}, "default": 0} - ) - self.customWidgets[key].pack() - - # Bomb (3) - key = "bomb3" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Bomb (3)", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,25)}, "textbox": {"side": RIGHT}, "default": 13} - ) - self.customWidgets[key].pack() - - # Bomb (10) - key = "bomb10" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Bomb (10)", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,20)}, "textbox": {"side": RIGHT}, "default": 1} - ) - self.customWidgets[key].pack() - - # Rupee (1) - key = "rupee1" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Rupee (1)", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,24)}, "textbox": {"side": RIGHT}, "default": 2} - ) - self.customWidgets[key].pack() - - # Rupee (5) - key = "rupee5" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Rupee (5)", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,24)}, "textbox": {"side": RIGHT}, "default": 4} - ) - self.customWidgets[key].pack() - - # Rupee (20) - key = "rupee20" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Rupee (20)", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,18)}, "textbox": {"side": RIGHT}, "default": 28} - ) - self.customWidgets[key].pack() - - # Rupee (50) - key = "rupee50" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Rupee (50)", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,18)}, "textbox": {"side": RIGHT}, "default": 7} - ) - self.customWidgets[key].pack() - - # Rupee (100) - key = "rupee100" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Rupee (100)", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,12)}, "textbox": {"side": RIGHT}, "default": 1} - ) - self.customWidgets[key].pack() + myDict = { + # Quarter Magic + "quartermagic": { + "type": "textbox", + "label": { + "text": "Quarter Magic" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT }, + "textbox": { "side": RIGHT }, + "default": 0 + } + }, + # Bomb Capacity +5 + "bombsplus5": { + "type": "textbox", + "label": { + "text": "Bomb C.+5" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (1,15) }, + "textbox": { "side": RIGHT }, + "default": 0 + } + }, + # Bomb Capacity +10 + "bombsplus10": { + "type": "textbox", + "label": { + "text": "Bomb C.+10" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,10) }, + "textbox": { "side": RIGHT }, + "default": 0 + } + }, + # Arrow Capacity + 5 + "arrowsplus5": { + "type": "textbox", + "label": { + "text": "Arrow C.+5" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,16) }, + "textbox": { "side": RIGHT }, + "default": 0 + } + }, + # Arrow Capacity +10 + "arrowsplus10": { + "type": "textbox", + "label": { + "text": "Arrow C.+10" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,10) }, + "textbox": { "side": RIGHT }, + "default": 0 + } + }, + # Arrow (1) + "arrow1": { + "type": "textbox", + "label": { + "text": "Arrow (1)" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,27) }, + "textbox": { "side": RIGHT }, + "default": 1 + } + }, + # Arrow (10) + "arrow10": { + "type": "textbox", + "label": { + "text": "Arrow (10)" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,21) }, + "textbox": { "side": RIGHT }, + "default": 12 + } + }, + # Bomb (1) + "bomb1": { + "type": "textbox", + "label": { + "text": "Bomb (1)" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,27) }, + "textbox": { "side": RIGHT }, + "default": 0 + } + }, + # Bomb (3) + "bomb3": { + "type": "textbox", + "label": { + "text": "Bomb (3)" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,27) }, + "textbox": { "side": RIGHT }, + "default": 13 + } + }, + # Bomb (10) + "bomb10": { + "type": "textbox", + "label": { + "text": "Bomb (10)" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,21) }, + "textbox": { "side": RIGHT }, + "default": 1 + } + }, + # Rupee (1) + "rupee1": { + "type": "textbox", + "label": { + "text": "Rupee (1)" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,25) }, + "textbox": { "side": RIGHT }, + "default": 2 + } + }, + # Rupee (5) + "rupee5": { + "type": "textbox", + "label": { + "text": "Rupee (5)" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,25) }, + "textbox": { "side": RIGHT }, + "default": 4 + } + }, + # Rupee (20) + "rupee20": { + "type": "textbox", + "label": { + "text": "Rupee (20)" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,19) }, + "textbox": { "side": RIGHT }, + "default": 28 + } + }, + # Rupee (50) + "rupee50": { + "type": "textbox", + "label": { + "text": "Rupee (50)" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,19) }, + "textbox": { "side": RIGHT }, + "default": 7 + } + }, + # Rupee (100) + "rupee100": { + "type": "textbox", + "label": { + "text": "Rupee (100)" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,13) }, + "textbox": { "side": RIGHT }, + "default": 1 + } + } + } + dictWidgets = widgets.make_widgets_from_dict(self, myDict, currentList) + for key in dictWidgets: + self.customWidgets[key] = dictWidgets[key] + self.customWidgets[key].pack() currentList = itemList5 - # Rupee (300) - key = "rupee300" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Rupee (300)", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,54)}, "textbox": {"side": RIGHT}, "default": 5} - ) - self.customWidgets[key].pack() - - # Blue Clock - key = "blueclock" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Blue Clock", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,60)}, "textbox": {"side": RIGHT}, "default": 0} - ) - self.customWidgets[key].pack() - - # Green Clock - key = "greenclock" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Green Clock", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,52)}, "textbox": {"side": RIGHT}, "default": 0} - ) - self.customWidgets[key].pack() - - # Red Clock - key = "redclock" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Red Clock", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,63)}, "textbox": {"side": RIGHT}, "default": 0} - ) - self.customWidgets[key].pack() - - # Silver Arrows Upgrade - key = "silversupgrade" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Silver Arrows Upgrade", - None, - {"label": {"anchor": W, "side": LEFT}, "textbox": {"side": RIGHT}, "default": 0} - ) - self.customWidgets[key].pack() - - # Generic Keys - key = "generickeys" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Generic Keys", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,49)}, "textbox": {"side": RIGHT}, "default": 0} - ) - self.customWidgets[key].pack() - - # Triforce Pieces - key = "triforcepieces" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Triforce Pieces", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,40)}, "textbox": {"side": RIGHT}, "default": 0} - ) - self.customWidgets[key].pack() - - # Triforce Pieces Required - key = "triforcepiecesgoal" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Triforce Pieces Required", - None, - {"label": {"anchor": W, "side": LEFT}, "textbox": {"side": RIGHT}, "default": 0} - ) - self.customWidgets[key].pack() - - # Triforce (win game) - key = "triforce" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Triforce (win game)", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,13)}, "textbox": {"side": RIGHT}, "default": 0} - ) - self.customWidgets[key].pack() - - # Rupoor - key = "rupoor" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Rupoor", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,77)}, "textbox": {"side": RIGHT}, "default": 0} - ) - self.customWidgets[key].pack() - - # Rupoor Cost - key = "rupoorcost" - self.customWidgets[key] = widgets.make_widget(self,"textbox",currentList, - "Rupoor Cost", - None, - {"label": {"anchor": W, "side": LEFT, "padx": (0,50)}, "textbox": {"side": RIGHT}, "default": 10} - ) - self.customWidgets[key].pack() + myDict = { + # Rupee (300) + "rupee300": { + "type": "textbox", + "label": { + "text": "Rupee (300)" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,54) }, + "textbox": { "side": RIGHT }, + "default": 5 + } + }, + # Blue Clock + "blueclock": { + "type": "textbox", + "label": { + "text": "Blue Clock" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,60) }, + "textbox": { "side": RIGHT }, + "default": 0 + } + }, + # Green Clock + "greenclock": { + "type": "textbox", + "label": { + "text": "Green Clock" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,52) }, + "textbox": { "side": RIGHT }, + "default": 0 + } + }, + # Red Clock + "redclock": { + "type": "textbox", + "label": { + "text": "Red Clock" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,63) }, + "textbox": { "side": RIGHT }, + "default": 0 + } + }, + # Silver Arrows Upgrade + "silversupgrade": { + "type": "textbox", + "label": { + "text": "Silver Arrows Upgrade" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT }, + "textbox": { "side": RIGHT }, + "default": 0 + } + }, + # Generic Keys + "generickeys": { + "type": "textbox", + "label": { + "text": "Generic Keys" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,49) }, + "textbox": { "side": RIGHT }, + "default": 0 + } + }, + # Triforce Pieces + "triforcepieces": { + "type": "textbox", + "label": { + "text": "Triforce Pieces" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,40) }, + "textbox": { "side": RIGHT }, + "default": 0 + } + }, + # Triforce Pieces Goal + "triforcepiecesgoal": { + "type": "textbox", + "label": { + "text": "Triforce Pieces Goal" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,13) }, + "textbox": { "side": RIGHT }, + "default": 0 + } + }, + # Triforce (win game) + "triforce": { + "type": "textbox", + "label": { + "text": "Triforce (win game)" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,13) }, + "textbox": { "side": RIGHT }, + "default": 0 + } + }, + # Rupoor + "rupoor": { + "type": "textbox", + "label": { + "text": "Rupoor" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,77) }, + "textbox": { "side": RIGHT }, + "default": 0 + } + }, + # Rupoor Cost + "rupoorcost": { + "type": "textbox", + "label": { + "text": "Rupoor Cost" + }, + "packAttrs": { + "label": { "anchor": W, "side": LEFT, "padx": (0,50) }, + "textbox": { "side": RIGHT }, + "default": 10 + } + } + } + dictWidgets = widgets.make_widgets_from_dict(self, myDict, currentList) + for key in dictWidgets: + self.customWidgets[key] = dictWidgets[key] + self.customWidgets[key].pack() itemList1.pack(side=LEFT, padx=(0,0)) itemList2.pack(side=LEFT, padx=(0,0)) From 2b68d7c74e4aa82fd2b4fb5ce9cd96ca75c1879a Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Mon, 17 Feb 2020 00:03:54 -0800 Subject: [PATCH 081/117] JSONify Item Randomizer options --- gui/randomize/item.py | 241 ++---------------- .../app/gui/randomize/item/checkboxes.json | 8 + .../app/gui/randomize/item/leftItemFrame.json | 132 ++++++++++ .../gui/randomize/item/rightItemFrame.json | 124 +++++++++ 4 files changed, 284 insertions(+), 221 deletions(-) create mode 100644 resources/app/gui/randomize/item/checkboxes.json create mode 100644 resources/app/gui/randomize/item/leftItemFrame.json create mode 100644 resources/app/gui/randomize/item/rightItemFrame.json diff --git a/gui/randomize/item.py b/gui/randomize/item.py index 29ca8e86..26a9c8aa 100644 --- a/gui/randomize/item.py +++ b/gui/randomize/item.py @@ -1,5 +1,7 @@ from tkinter import ttk, IntVar, StringVar, Checkbutton, Frame, Label, OptionMenu, E, W, LEFT, RIGHT import gui.widgets as widgets +import json +import os def item_page(parent): # Item Randomizer @@ -8,19 +10,12 @@ def item_page(parent): # Item Randomizer options self.widgets = {} - myDict = { - ## Retro (eventually needs to become a World State) - "retro": { - "type": "checkbox", - "label": { - "text": "Retro mode (universal keys)" - } - } - } - dictWidgets = widgets.make_widgets_from_dict(self, myDict, self) - for key in dictWidgets: - self.widgets[key] = dictWidgets[key] - self.widgets[key].pack(anchor=W) + with open(os.path.join("resources","app","gui","randomize","item","checkboxes.json")) as checkboxes: + myDict = json.load(checkboxes) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, self) + for key in dictWidgets: + self.widgets[key] = dictWidgets[key] + self.widgets[key].pack(anchor=W) leftItemFrame = Frame(self) rightItemFrame = Frame(self) @@ -31,214 +26,18 @@ def item_page(parent): vals = [*map(str,range(0,7+1)),"random"] crystalsOptions = {keys[i]: vals[i] for i in range(len(keys))} - myDict = { - ## World State - "worldstate": { - "type": "selectbox", - "label": { - "text": "World State" - }, - "packAttrs": { - "label": { "side": LEFT }, - "selectbox": { "side": RIGHT }, - "default": "Open" - }, - "options": { - "Standard": "standard", - "Open": "open", - "Inverted": "inverted" - } - }, - ## Logic Level - "logiclevel": { - "type": "selectbox", - "label": { - "text": "Logic Level" - }, - "packAttrs": { - "label": { "side": LEFT }, - "selectbox": { "side": RIGHT } - }, - "options": { - "No Glitches": "noglitches", - "Minor Glitches": "minorglitches", - "No Logic": "nologic" - } - }, - ## Goal - "goal": { - "type": "selectbox", - "label": { - "text": "Goal" - }, - "packAttrs": { - "label": { "side": LEFT }, - "selectbox": { "side": RIGHT } - }, - "options": { - "Defeat Ganon": "ganon", - "Master Sword Pedestal": "pedestal", - "All Dungeons": "dungeons", - "Triforce Hunt": "triforcehunt", - "Crystals": "crystals" - } - }, - ## Number of crystals to open GT - "crystals_gt": { - "type": "selectbox", - "label": { - "text": "Crystals to open GT" - }, - "packAttrs": { - "label": { "side": LEFT }, - "selectbox": { "side": RIGHT } - }, - "options": crystalsOptions - }, - ## Number of crystals to damage Ganon - "crystals_ganon": { - "type": "selectbox", - "label": { - "text": "Crystals to harm Ganon" - }, - "packAttrs": { - "label": { "side": LEFT }, - "selectbox": { "side": RIGHT } - }, - "options": crystalsOptions - }, - ## Weapons - "weapons": { - "type": "selectbox", - "label": { - "text": "Weapons" - }, - "packAttrs": { - "label": { "side": LEFT }, - "selectbox": { "side": RIGHT } - }, - "options": { - "Randomized": "random", - "Assured": "assured", - "Swordless": "swordless", - "Vanilla": "vanilla" - } - } - } - dictWidgets = widgets.make_widgets_from_dict(self, myDict, leftItemFrame) - for key in dictWidgets: - self.widgets[key] = dictWidgets[key] - self.widgets[key].pack(anchor=E) + with open(os.path.join("resources","app","gui","randomize","item","leftItemFrame.json")) as leftItemFrameItems: + myDict = json.load(leftItemFrameItems) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, leftItemFrame) + for key in dictWidgets: + self.widgets[key] = dictWidgets[key] + self.widgets[key].pack(anchor=E) - myDict = { - ## Item Pool - "itempool": { - "type": "selectbox", - "label": { - "text": "Item Pool" - }, - "packAttrs": { - "label": { "side": LEFT }, - "selectbox": { "side": RIGHT } - }, - "options": { - "Normal": "normal", - "Hard": "hard", - "Expert": "expert" - } - }, - ## Item Functionality - "itemfunction": { - "type": "selectbox", - "label": { - "text": "Item Functionality" - }, - "packAttrs": { - "label": { "side": LEFT }, - "selectbox": { "side": RIGHT } - }, - "options": { - "Normal": "normal", - "Hard": "hard", - "Expert": "expert" - } - }, - ## Timer setting - "timer": { - "type": "selectbox", - "label": { - "text": "Timer Setting" - }, - "packAttrs": { - "label": { "side": LEFT }, - "selectbox": { "side": RIGHT } - }, - "options": { - "No Timer": "none", - "Stopwatch": "display", - "Timed": "timed", - "Timed OHKO": "timed-ohko", - "OHKO": "ohko", - "Timed Countdown": "timed-countdown" - } - }, - ## Progressives: On/Off - "progressives": { - "type": "selectbox", - "label": { - "text": "Progressive Items" - }, - "packAttrs": { - "label": { "side": LEFT }, - "selectbox": { "side": RIGHT } - }, - "options": { - "On": "on", - "Off": "off", - "Random": "random" - } - }, - ## Accessibility - "accessibility": { - "type": "selectbox", - "label": { - "text": "Accessibility" - }, - "packAttrs": { - "label": { "side": LEFT }, - "selectbox": { "side": RIGHT } - }, - "options": { - "100% Inventory": "items", - "100% Locations": "locations", - "Beatable": "none" - } - }, - ## Item Sorting Algorithm - "sortingalgo": { - "type": "selectbox", - "label": { - "text": "Item Sorting" - }, - "packAttrs": { - "label": { "side": LEFT }, - "selectbox": { "side": RIGHT }, - "default": "Balanced" - }, - "options": { - "Freshness": "freshness", - "Flood": "flood", - "VT8.21": "vt21", - "VT8.22": "vt22", - "VT8.25": "vt25", - "VT8.26": "vt26", - "Balanced": "balanced" - } - } - } - dictWidgets = widgets.make_widgets_from_dict(self, myDict, rightItemFrame) - for key in dictWidgets: - self.widgets[key] = dictWidgets[key] - self.widgets[key].pack(anchor=E) + with open(os.path.join("resources","app","gui","randomize","item","rightItemFrame.json")) as rightItemFrameItems: + myDict = json.load(rightItemFrameItems) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, rightItemFrame) + for key in dictWidgets: + self.widgets[key] = dictWidgets[key] + self.widgets[key].pack(anchor=E) return self diff --git a/resources/app/gui/randomize/item/checkboxes.json b/resources/app/gui/randomize/item/checkboxes.json new file mode 100644 index 00000000..e75b2daf --- /dev/null +++ b/resources/app/gui/randomize/item/checkboxes.json @@ -0,0 +1,8 @@ +{ + "retro": { + "type": "checkbox", + "label": { + "text": "Retro mode (universal keys)" + } + } +} diff --git a/resources/app/gui/randomize/item/leftItemFrame.json b/resources/app/gui/randomize/item/leftItemFrame.json new file mode 100644 index 00000000..ec3d2a38 --- /dev/null +++ b/resources/app/gui/randomize/item/leftItemFrame.json @@ -0,0 +1,132 @@ +{ + "worldstate": { + "type": "selectbox", + "label": { + "text": "World State" + }, + "packAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + }, + "default": "Open" + }, + "options": { + "Standard": "standard", + "Open": "open", + "Inverted": "inverted" + } + }, + "logiclevel": { + "type": "selectbox", + "label": { + "text": "Logic Level" + }, + "packAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "No Glitches": "noglitches", + "Minor Glitches": "minorglitches", + "No Logic": "nologic" + } + }, + "goal": { + "type": "selectbox", + "label": { + "text": "Goal" + }, + "packAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "Defeat Ganon": "ganon", + "Master Sword Pedestal": "pedestal", + "All Dungeons": "dungeons", + "Triforce Hunt": "triforcehunt", + "Crystals": "crystals" + } + }, + "crystals_gt": { + "type": "selectbox", + "label": { + "text": "Crystals to open GT" + }, + "packAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "Random": "random" + } + }, + "crystals_ganon": { + "type": "selectbox", + "label": { + "text": "Crystals to harm Ganon" + }, + "packAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "Random": "random" + } + }, + "weapons": { + "type": "selectbox", + "label": { + "text": "Weapons" + }, + "packAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "Randomized": "random", + "Assured": "assured", + "Swordless": "swordless", + "Vanilla": "vanilla" + } + } +} diff --git a/resources/app/gui/randomize/item/rightItemFrame.json b/resources/app/gui/randomize/item/rightItemFrame.json new file mode 100644 index 00000000..8773f88b --- /dev/null +++ b/resources/app/gui/randomize/item/rightItemFrame.json @@ -0,0 +1,124 @@ +{ + "itempool": { + "type": "selectbox", + "label": { + "text": "Item Pool" + }, + "packAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "Normal": "normal", + "Hard": "hard", + "Expert": "expert" + } + }, + "itemfunction": { + "type": "selectbox", + "label": { + "text": "Item Functionality" + }, + "packAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "Normal": "normal", + "Hard": "hard", + "Expert": "expert" + } + }, + "timer": { + "type": "selectbox", + "label": { + "text": "Timer Setting" + }, + "packAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "No Timer": "none", + "Stopwatch": "display", + "Timed": "timed", + "Timed OHKO": "timed-ohko", + "OHKO": "ohko", + "Timed Countdown": "timed-countdown" + } + }, + "progressives": { + "type": "selectbox", + "label": { + "text": "Progressive Items" + }, + "packAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "On": "on", + "Off": "off", + "Random": "random" + } + }, + "accessibility": { + "type": "selectbox", + "label": { + "text": "Accessibility" + }, + "packAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "100% Inventory": "items", + "100% Locations": "locations", + "Beatable": "none" + } + }, + "sortingalgo": { + "type": "selectbox", + "label": { + "text": "Item Sorting" + }, + "packAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + }, + "default": "Balanced" + }, + "options": { + "Freshness": "freshness", + "Flood": "flood", + "VT8.21": "vt21", + "VT8.22": "vt22", + "VT8.25": "vt25", + "VT8.26": "vt26", + "Balanced": "balanced" + } + } +} From 9de01fbdb53d082edd5938d8b6cc4d48ea94c66a Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Mon, 17 Feb 2020 00:05:05 -0800 Subject: [PATCH 082/117] Don't need to gen Crystals options anymore It's been transliterated into the JSON instead --- gui/randomize/item.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/gui/randomize/item.py b/gui/randomize/item.py index 26a9c8aa..a7e06987 100644 --- a/gui/randomize/item.py +++ b/gui/randomize/item.py @@ -22,10 +22,6 @@ def item_page(parent): leftItemFrame.pack(side=LEFT) rightItemFrame.pack(side=RIGHT) - keys = [*map(str,range(0,7+1)),"Random"] - vals = [*map(str,range(0,7+1)),"random"] - crystalsOptions = {keys[i]: vals[i] for i in range(len(keys))} - with open(os.path.join("resources","app","gui","randomize","item","leftItemFrame.json")) as leftItemFrameItems: myDict = json.load(leftItemFrameItems) dictWidgets = widgets.make_widgets_from_dict(self, myDict, leftItemFrame) From 663ed3442a006b5310801c5acba952c8c303605b Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Mon, 17 Feb 2020 00:10:02 -0800 Subject: [PATCH 083/117] JSONify Entrando options --- gui/randomize/entrando.py | 53 +++---------------- .../app/gui/randomize/entrando/widgets.json | 38 +++++++++++++ 2 files changed, 46 insertions(+), 45 deletions(-) create mode 100644 resources/app/gui/randomize/entrando/widgets.json diff --git a/gui/randomize/entrando.py b/gui/randomize/entrando.py index 9c2db78f..59a7152e 100644 --- a/gui/randomize/entrando.py +++ b/gui/randomize/entrando.py @@ -1,5 +1,7 @@ from tkinter import ttk, IntVar, StringVar, Checkbutton, Frame, Label, OptionMenu, E, W, LEFT, RIGHT import gui.widgets as widgets +import json +import os def entrando_page(parent): # Entrance Randomizer @@ -8,50 +10,11 @@ def entrando_page(parent): # Entrance Randomizer options self.widgets = {} - myDict = { - ## Pyramid pre-opened - "openpyramid": { - "type": "checkbox", - "label": { - "text": "Pre-open Pyramid Hole" - } - }, - ## Shuffle Ganon - "shuffleganon": { - "type": "checkbox", - "label": { - "text": "Include Ganon's Tower and Pyramid Hole in shuffle pool" - } - }, - ## Entrance Shuffle - "entranceshuffle": { - "type": "selectbox", - "label": { - "text": "Entrance Shuffle" - }, - "packAttrs": { - "label": { "side": LEFT }, - "selectbox": { "side": RIGHT } - }, - "options": { - "Vanilla": "vanilla", - "Simple": "simple", - "Restricted": "restricted", - "Full": "full", - "Crossed": "crossed", - "Insanity": "insanity", - "Restricted (Legacy)": "restricted_legacy", - "Full (Legacy)": "full_legacy", - "Madness (Legacy)": "madness_legacy", - "Insanity (Legacy)": "insanity_legacy", - "Dungeons + Full": "dungeonsfull", - "Dungeons + Simple": "dungeonssimple" - } - } - } - dictWidgets = widgets.make_widgets_from_dict(self, myDict, self) - for key in dictWidgets: - self.widgets[key] = dictWidgets[key] - self.widgets[key].pack(anchor=W) + with open(os.path.join("resources","app","gui","randomize","entrando","widgets.json")) as myWidgets: + myDict = json.load(myWidgets) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, self) + for key in dictWidgets: + self.widgets[key] = dictWidgets[key] + self.widgets[key].pack(anchor=W) return self diff --git a/resources/app/gui/randomize/entrando/widgets.json b/resources/app/gui/randomize/entrando/widgets.json new file mode 100644 index 00000000..ceb04d45 --- /dev/null +++ b/resources/app/gui/randomize/entrando/widgets.json @@ -0,0 +1,38 @@ +{ + "openpyramid": { + "type": "checkbox", + "label": { + "text": "Pre-open Pyramid Hole" + } + }, + "shuffleganon": { + "type": "checkbox", + "label": { + "text": "Include Ganon's Tower and Pyramid Hole in shuffle pool" + } + }, + "entranceshuffle": { + "type": "selectbox", + "label": { + "text": "Entrance Shuffle" + }, + "packAttrs": { + "label": { "side": "left" }, + "selectbox": { "side": "right" } + }, + "options": { + "Vanilla": "vanilla", + "Simple": "simple", + "Restricted": "restricted", + "Full": "full", + "Crossed": "crossed", + "Insanity": "insanity", + "Restricted (Legacy)": "restricted_legacy", + "Full (Legacy)": "full_legacy", + "Madness (Legacy)": "madness_legacy", + "Insanity (Legacy)": "insanity_legacy", + "Dungeons + Full": "dungeonsfull", + "Dungeons + Simple": "dungeonssimple" + } + } +} From 20bc14ba1244efaee014c55acec628de61aa8a45 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Mon, 17 Feb 2020 00:45:37 -0800 Subject: [PATCH 084/117] JSONify Enemizer options Fix set_sprite when cancelling custom sprite file selector --- gui/adjust/overview.py | 2 +- gui/randomize/enemizer.py | 112 ++++-------------- gui/randomize/gameoptions.py | 2 +- .../gui/randomize/enemizer/checkboxes.json | 8 ++ .../randomize/enemizer/leftEnemizerFrame.json | 41 +++++++ .../enemizer/rightEnemizerFrame.json | 42 +++++++ 6 files changed, 113 insertions(+), 94 deletions(-) create mode 100644 resources/app/gui/randomize/enemizer/checkboxes.json create mode 100644 resources/app/gui/randomize/enemizer/leftEnemizerFrame.json create mode 100644 resources/app/gui/randomize/enemizer/rightEnemizerFrame.json diff --git a/gui/adjust/overview.py b/gui/adjust/overview.py index 2265f681..7f4918ed 100644 --- a/gui/adjust/overview.py +++ b/gui/adjust/overview.py @@ -94,7 +94,7 @@ def adjust_page(top, parent, settings): spriteEntry2 = Label(spriteDialogFrame2, textvariable=self.spriteNameVar2) self.sprite = None - def set_sprite(sprite_param, random_sprite): + def set_sprite(sprite_param, random_sprite=False): if sprite_param is None or not sprite_param.valid: self.sprite = None self.spriteNameVar2.set('(unchanged)') diff --git a/gui/randomize/enemizer.py b/gui/randomize/enemizer.py index e6e20d20..9292a773 100644 --- a/gui/randomize/enemizer.py +++ b/gui/randomize/enemizer.py @@ -1,6 +1,8 @@ import os from tkinter import ttk, filedialog, IntVar, StringVar, Button, Checkbutton, Entry, Frame, Label, LabelFrame, OptionMenu, N, E, W, LEFT, RIGHT, X import gui.widgets as widgets +import json +import os def enemizer_page(parent,settings): # Enemizer @@ -9,19 +11,12 @@ def enemizer_page(parent,settings): # Enemizer options self.widgets = {} - myDict = { - ## Pot Shuffle - "potshuffle": { - "type": "checkbox", - "label": { - "text": "Pot Shuffle" - } - } - } - dictWidgets = widgets.make_widgets_from_dict(self, myDict, self) - for key in dictWidgets: - self.widgets[key] = dictWidgets[key] - self.widgets[key].pack(anchor=W) + with open(os.path.join("resources","app","gui","randomize","enemizer","checkboxes.json")) as checkboxes: + myDict = json.load(checkboxes) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, self) + for key in dictWidgets: + self.widgets[key] = dictWidgets[key] + self.widgets[key].pack(anchor=W) ## Enemizer CLI Path enemizerPathFrame = Frame(self) @@ -47,85 +42,18 @@ def enemizer_page(parent,settings): leftEnemizerFrame.pack(side=LEFT, anchor=N) rightEnemizerFrame.pack(side=RIGHT, anchor=N) - myDict = { - ## Randomize Enemies - "enemyshuffle": { - "type": "selectbox", - "label": { - "text": "Enemy Shuffle" - }, - "packAttrs": { - "label": { "side": LEFT }, - "selectbox": { "side": RIGHT } - }, - "options": { - "Vanilla": "none", - "Shuffled": "shuffled", - "Chaos": "chaos" - } - }, - ## Randomize Bosses - "bossshuffle": { - "type": "selectbox", - "label": { - "text": "Boss Shuffle" - }, - "packAttrs": { - "label": { "side": LEFT }, - "selectbox": { "side": RIGHT } - }, - "options": { - "Vanilla": "none", - "Basic": "basic", - "Shuffled": "shuffled", - "Chaos": "chaos" - } - } - } - dictWidgets = widgets.make_widgets_from_dict(self, myDict, leftEnemizerFrame) - for key in dictWidgets: - self.widgets[key] = dictWidgets[key] - self.widgets[key].pack(anchor=E) + with open(os.path.join("resources","app","gui","randomize","enemizer","leftEnemizerFrame.json")) as leftEnemizerFrameItems: + myDict = json.load(leftEnemizerFrameItems) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, leftEnemizerFrame) + for key in dictWidgets: + self.widgets[key] = dictWidgets[key] + self.widgets[key].pack(anchor=E) - myDict = { - ## Enemy Damage - "enemydamage": { - "type": "selectbox", - "label": { - "text": "Enemy Damage" - }, - "packAttrs": { - "label": { "side": LEFT }, - "selectbox": { "side": RIGHT } - }, - "options": { - "Vanilla": "default", - "Shuffled": "shuffled", - "Chaos": "chaos" - } - }, - ## Enemy Health - "enemyhealth": { - "type": "selectbox", - "label": { - "text": "Enemy Health" - }, - "packAttrs": { - "label": { "side": LEFT }, - "selectbox": { "side": RIGHT } - }, - "options": { - "Vanilla": "default", - "Easy": "easy", - "Normal": "normal", - "Hard": "hard", - "Expert": "expert" - } - } - } - dictWidgets = widgets.make_widgets_from_dict(self, myDict, rightEnemizerFrame) - for key in dictWidgets: - self.widgets[key] = dictWidgets[key] - self.widgets[key].pack(anchor=E) + with open(os.path.join("resources","app","gui","randomize","enemizer","rightEnemizerFrame.json")) as rightEnemizerFrameItems: + myDict = json.load(rightEnemizerFrameItems) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, rightEnemizerFrame) + for key in dictWidgets: + self.widgets[key] = dictWidgets[key] + self.widgets[key].pack(anchor=E) return self,settings diff --git a/gui/randomize/gameoptions.py b/gui/randomize/gameoptions.py index 1785f38d..5f12f8be 100644 --- a/gui/randomize/gameoptions.py +++ b/gui/randomize/gameoptions.py @@ -176,7 +176,7 @@ def gameoptions_page(top, parent): return self -def set_sprite(sprite_param, random_sprite, spriteSetter=None, spriteNameVar=None, randomSpriteVar=None): +def set_sprite(sprite_param, random_sprite=False, spriteSetter=None, spriteNameVar=None, randomSpriteVar=None): if sprite_param is None or not sprite_param.valid: if spriteSetter: spriteSetter(None) diff --git a/resources/app/gui/randomize/enemizer/checkboxes.json b/resources/app/gui/randomize/enemizer/checkboxes.json new file mode 100644 index 00000000..6f01079b --- /dev/null +++ b/resources/app/gui/randomize/enemizer/checkboxes.json @@ -0,0 +1,8 @@ +{ + "potshuffle": { + "type": "checkbox", + "label": { + "text": "Pot Shuffle" + } + } +} diff --git a/resources/app/gui/randomize/enemizer/leftEnemizerFrame.json b/resources/app/gui/randomize/enemizer/leftEnemizerFrame.json new file mode 100644 index 00000000..bf5fab87 --- /dev/null +++ b/resources/app/gui/randomize/enemizer/leftEnemizerFrame.json @@ -0,0 +1,41 @@ +{ + "enemyshuffle": { + "type": "selectbox", + "label": { + "text": "Enemy Shuffle" + }, + "packAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "Vanilla": "none", + "Shuffled": "shuffled", + "Chaos": "chaos" + } + }, + "bossshuffle": { + "type": "selectbox", + "label": { + "text": "Boss Shuffle" + }, + "packAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "Vanilla": "none", + "Basic": "basic", + "Shuffled": "shuffled", + "Chaos": "chaos" + } + } +} diff --git a/resources/app/gui/randomize/enemizer/rightEnemizerFrame.json b/resources/app/gui/randomize/enemizer/rightEnemizerFrame.json new file mode 100644 index 00000000..5f559dc1 --- /dev/null +++ b/resources/app/gui/randomize/enemizer/rightEnemizerFrame.json @@ -0,0 +1,42 @@ +{ + "enemydamage": { + "type": "selectbox", + "label": { + "text": "Enemy Damage" + }, + "packAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "Vanilla": "default", + "Shuffled": "shuffled", + "Chaos": "chaos" + } + }, + "enemyhealth": { + "type": "selectbox", + "label": { + "text": "Enemy Health" + }, + "packAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "Vanilla": "default", + "Easy": "easy", + "Normal": "normal", + "Hard": "hard", + "Expert": "expert" + } + } +} From 2a1e9726b15a1cf9a382aa67ea27a713801de0a3 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Mon, 17 Feb 2020 01:26:21 -0800 Subject: [PATCH 085/117] JSONify Dungeon Rando options --- gui/randomize/dungeon.py | 81 ++++--------------- .../app/gui/randomize/dungeon/keysanity.json | 26 ++++++ .../app/gui/randomize/dungeon/widgets.json | 28 +++++++ 3 files changed, 68 insertions(+), 67 deletions(-) create mode 100644 resources/app/gui/randomize/dungeon/keysanity.json create mode 100644 resources/app/gui/randomize/dungeon/widgets.json diff --git a/gui/randomize/dungeon.py b/gui/randomize/dungeon.py index 1b8ecf94..9a9a0a5f 100644 --- a/gui/randomize/dungeon.py +++ b/gui/randomize/dungeon.py @@ -1,5 +1,7 @@ from tkinter import ttk, IntVar, StringVar, Checkbutton, Frame, Label, OptionMenu, E, W, LEFT, RIGHT import gui.widgets as widgets +import json +import os def dungeon_page(parent): # Dungeon Shuffle @@ -14,73 +16,18 @@ def dungeon_page(parent): mscbLabel = Label(mcsbshuffleFrame, text="Shuffle: ") mscbLabel.pack(side=LEFT) - myDict = { - ## Map Shuffle - "mapshuffle": { - "type": "checkbox", - "label": { - "text": "Maps" - } - }, - ## Compass Shuffle - "compassshuffle": { - "type": "checkbox", - "label": { - "text": "Compasses" - } - }, - ## Small Key Shuffle - "smallkeyshuffle": { - "type": "checkbox", - "label": { - "text": "Small Keys" - } - }, - ## Big Key Shuffle - "bigkeyshuffle": { - "type": "checkbox", - "label": { - "text": "Small Keys" - } - } - } + with open(os.path.join("resources","app","gui","randomize","dungeon","keysanity.json")) as keysanityItems: + myDict = json.load(keysanityItems) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, mcsbshuffleFrame) + for key in dictWidgets: + self.widgets[key] = dictWidgets[key] + self.widgets[key].pack(side=LEFT) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, mcsbshuffleFrame) - - for key in dictWidgets: - self.widgets[key] = dictWidgets[key] - self.widgets[key].pack(side=LEFT) - - myDict = { - "dungeondoorshuffle": { - "type": "selectbox", - "label": { - "text": "Dungeon Door Shuffle" - }, - "packAttrs": { - "label": { "side": LEFT }, - "selectbox": {"side": RIGHT}, - "default": "Basic" - }, - "options": { - "Vanilla": "vanilla", - "Basic": "basic", - "Crossed": "crossed" - } - }, - ## Experiemental features - "experimental": { - "type": "checkbox", - "label": { - "text": "Enable Experimental Features" - } - } - } - - dictWidgets = widgets.make_widgets_from_dict(self, myDict, self) - - for key in dictWidgets: - self.widgets[key] = dictWidgets[key] - self.widgets[key].pack(anchor=W) + with open(os.path.join("resources","app","gui","randomize","dungeon","widgets.json")) as dungeonWidgets: + myDict = json.load(dungeonWidgets) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, self) + for key in dictWidgets: + self.widgets[key] = dictWidgets[key] + self.widgets[key].pack(anchor=W) return self diff --git a/resources/app/gui/randomize/dungeon/keysanity.json b/resources/app/gui/randomize/dungeon/keysanity.json new file mode 100644 index 00000000..cb680c60 --- /dev/null +++ b/resources/app/gui/randomize/dungeon/keysanity.json @@ -0,0 +1,26 @@ +{ + "mapshuffle": { + "type": "checkbox", + "label": { + "text": "Maps" + } + }, + "compassshuffle": { + "type": "checkbox", + "label": { + "text": "Compasses" + } + }, + "smallkeyshuffle": { + "type": "checkbox", + "label": { + "text": "Small Keys" + } + }, + "bigkeyshuffle": { + "type": "checkbox", + "label": { + "text": "Small Keys" + } + } +} diff --git a/resources/app/gui/randomize/dungeon/widgets.json b/resources/app/gui/randomize/dungeon/widgets.json new file mode 100644 index 00000000..023eadda --- /dev/null +++ b/resources/app/gui/randomize/dungeon/widgets.json @@ -0,0 +1,28 @@ +{ + "dungeondoorshuffle": { + "type": "selectbox", + "label": { + "text": "Dungeon Door Shuffle" + }, + "packAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + }, + "default": "Basic" + }, + "options": { + "Vanilla": "vanilla", + "Basic": "basic", + "Crossed": "crossed" + } + }, + "experimental": { + "type": "checkbox", + "label": { + "text": "Enable Experimental Features" + } + } +} From c848792c69a3fb1d223e3942504a7543d47bd733 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Wed, 19 Feb 2020 01:29:48 -0800 Subject: [PATCH 086/117] JSONify Multiworld options --- gui/randomize/multiworld.py | 25 ++++++------------- .../app/gui/randomize/multiworld/widgets.json | 16 ++++++++++++ 2 files changed, 24 insertions(+), 17 deletions(-) create mode 100644 resources/app/gui/randomize/multiworld/widgets.json diff --git a/gui/randomize/multiworld.py b/gui/randomize/multiworld.py index 4612b852..e7808e48 100644 --- a/gui/randomize/multiworld.py +++ b/gui/randomize/multiworld.py @@ -1,5 +1,7 @@ from tkinter import ttk, StringVar, Entry, Frame, Label, Spinbox, N, E, W, X, LEFT, RIGHT import gui.widgets as widgets +import json +import os def multiworld_page(parent,settings): # Multiworld @@ -8,23 +10,12 @@ def multiworld_page(parent,settings): # Multiworld options self.widgets = {} - myDict = { - ## Number of worlds - "worlds": { - "type": "spinbox", - "label": { - "text": "Worlds" - }, - "packAttrs": { - "label": { "side": LEFT }, - "spinbox": { "side": RIGHT } - } - } - } - dictWidgets = widgets.make_widgets_from_dict(self, myDict, self) - for key in dictWidgets: - self.widgets[key] = dictWidgets[key] - self.widgets[key].pack(side=LEFT, anchor=N) + with open(os.path.join("resources","app","gui","randomize","multiworld","widgets.json")) as multiworldItems: + myDict = json.load(multiworldItems) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, self) + for key in dictWidgets: + self.widgets[key] = dictWidgets[key] + self.widgets[key].pack(side=LEFT, anchor=N) ## List of Player Names key = "names" diff --git a/resources/app/gui/randomize/multiworld/widgets.json b/resources/app/gui/randomize/multiworld/widgets.json new file mode 100644 index 00000000..958e7000 --- /dev/null +++ b/resources/app/gui/randomize/multiworld/widgets.json @@ -0,0 +1,16 @@ +{ + "worlds": { + "type": "spinbox", + "label": { + "text": "Worlds" + }, + "packAttrs": { + "label": { + "side": "left" + }, + "spinbox": { + "side": "right" + } + } + } +} From f2de2822493bb31adb69b099351d7197a4aba8e9 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Wed, 19 Feb 2020 01:35:41 -0800 Subject: [PATCH 087/117] JSONify Game Options --- gui/randomize/gameoptions.py | 149 +++--------------- .../gui/randomize/gameoptions/checkboxes.json | 20 +++ .../gameoptions/leftRomOptionsFrame.json | 45 ++++++ .../gameoptions/rightRomOptionsFrame.json | 63 ++++++++ 4 files changed, 148 insertions(+), 129 deletions(-) create mode 100644 resources/app/gui/randomize/gameoptions/checkboxes.json create mode 100644 resources/app/gui/randomize/gameoptions/leftRomOptionsFrame.json create mode 100644 resources/app/gui/randomize/gameoptions/rightRomOptionsFrame.json diff --git a/gui/randomize/gameoptions.py b/gui/randomize/gameoptions.py index 5f12f8be..966bc3d4 100644 --- a/gui/randomize/gameoptions.py +++ b/gui/randomize/gameoptions.py @@ -2,7 +2,8 @@ from tkinter import ttk, IntVar, StringVar, Button, Checkbutton, Entry, Frame, L from functools import partial import classes.SpriteSelector as spriteSelector import gui.widgets as widgets - +import json +import os def gameoptions_page(top, parent): # Game Options @@ -11,82 +12,24 @@ def gameoptions_page(top, parent): # Game Options options self.widgets = {} - myDict = { - ## Hints: Useful/Not useful - "hints": { - "type": "checkbox", - "label": { - "text": "Include Helpful Hints" - } - }, - ## Disable BGM - "nobgm": { - "type": "checkbox", - "label": { - "text": "Disable Music & MSU-1" - } - }, - ## L/R Quickswap - "quickswap": { - "type": "checkbox", - "label": { - "text": "L/R Quickswapping" - } - } - } - dictWidgets = widgets.make_widgets_from_dict(self, myDict, self) - for key in dictWidgets: - self.widgets[key] = dictWidgets[key] - self.widgets[key].pack(anchor=W) + with open(os.path.join("resources","app","gui","randomize","gameoptions","checkboxes.json")) as checkboxes: + myDict = json.load(checkboxes) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, self) + for key in dictWidgets: + self.widgets[key] = dictWidgets[key] + self.widgets[key].pack(anchor=W) leftRomOptionsFrame = Frame(self) rightRomOptionsFrame = Frame(self) leftRomOptionsFrame.pack(side=LEFT) rightRomOptionsFrame.pack(side=RIGHT) - myDict = { - ## Heart Color - "heartcolor": { - "type": "selectbox", - "label": { - "text": "Heart Color" - }, - "packAttrs": { - "label": { "side": LEFT }, - "selectbox": { "side": RIGHT } - }, - "options": { - "Red": "red", - "Blue": "blue", - "Green": "green", - "Yellow": "yellow", - "Random": "random" - } - }, - ## Heart Beep speed - "heartbeep": { - "type": "selectbox", - "label": { - "text": "Heart Beep sound rate" - }, - "packAttrs": { - "label": { "side": LEFT }, - "selectbox": { "side": RIGHT}, - "default": "Normal" - }, - "options": { - "Double": "double", - "Normal": "normal", - "Half": "half", - "Quarter": "quarter", - "Off": "off" - } - } - } - dictWidgets = widgets.make_widgets_from_dict(self, myDict, leftRomOptionsFrame) - for key in dictWidgets: - self.widgets[key] = dictWidgets[key] - self.widgets[key].pack(anchor=E) + with open(os.path.join("resources","app","gui","randomize","gameoptions","leftRomOptionsFrame.json")) as leftRomOptionsFrameItems: + myDict = json.load(leftRomOptionsFrameItems) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, leftRomOptionsFrame) + for key in dictWidgets: + self.widgets[key] = dictWidgets[key] + self.widgets[key].pack(anchor=E) ## Sprite selection spriteDialogFrame = Frame(leftRomOptionsFrame) @@ -114,64 +57,12 @@ def gameoptions_page(top, parent): spriteSelectButton.pack(side=LEFT) spriteDialogFrame.pack(anchor=E) - myDict = { - ## Menu Speed - "menuspeed": { - "type": "selectbox", - "label": { - "text": "Menu Speed" - }, - "packAttrs": { - "label": { "side": LEFT }, - "selectbox": { "side": RIGHT }, - "default": "Normal" - }, - "options": { - "Instant": "instant", - "Quadruple": "quadruple", - "Triple": "triple", - "Double": "double", - "Normal": "normal", - "Half": "half" - } - }, - ## Overworld Palettes (not Enemizer) - "owpalettes": { - "type": "selectbox", - "label": { - "text": "Overworld Palettes" - }, - "packAttrs": { - "label": { "side": LEFT }, - "selectbox": { "side": RIGHT } - }, - "options": { - "Default": "default", - "Random": "random", - "Blackout": "blackout" - } - }, - ## Underworld Palettes (not Enemizer) - "uwpalettes": { - "type": "selectbox", - "label": { - "text": "Underworld Palettes" - }, - "packAttrs": { - "label": { "side": LEFT }, - "selectbox": { "side": RIGHT } - }, - "options": { - "Default": "default", - "Random": "random", - "Blackout": "blackout" - } - } - } - dictWidgets = widgets.make_widgets_from_dict(self, myDict, rightRomOptionsFrame) - for key in dictWidgets: - self.widgets[key] = dictWidgets[key] - self.widgets[key].pack(anchor=E) + with open(os.path.join("resources","app","gui","randomize","gameoptions","rightRomOptionsFrame.json")) as rightRomOptionsFrameItems: + myDict = json.load(rightRomOptionsFrameItems) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, rightRomOptionsFrame) + for key in dictWidgets: + self.widgets[key] = dictWidgets[key] + self.widgets[key].pack(anchor=E) return self diff --git a/resources/app/gui/randomize/gameoptions/checkboxes.json b/resources/app/gui/randomize/gameoptions/checkboxes.json new file mode 100644 index 00000000..e531d2e9 --- /dev/null +++ b/resources/app/gui/randomize/gameoptions/checkboxes.json @@ -0,0 +1,20 @@ +{ + "hints": { + "type": "checkbox", + "label": { + "text": "Include Helpful Hints" + } + }, + "nobgm": { + "type": "checkbox", + "label": { + "text": "Disable Music & MSU-1" + } + }, + "quickswap": { + "type": "checkbox", + "label": { + "text": "L/R Quickswapping" + } + } +} diff --git a/resources/app/gui/randomize/gameoptions/leftRomOptionsFrame.json b/resources/app/gui/randomize/gameoptions/leftRomOptionsFrame.json new file mode 100644 index 00000000..ce8a5b32 --- /dev/null +++ b/resources/app/gui/randomize/gameoptions/leftRomOptionsFrame.json @@ -0,0 +1,45 @@ +{ + "heartcolor": { + "type": "selectbox", + "label": { + "text": "Heart Color" + }, + "packAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "Red": "red", + "Blue": "blue", + "Green": "green", + "Yellow": "yellow", + "Random": "random" + } + }, + "heartbeep": { + "type": "selectbox", + "label": { + "text": "Heart Beep sound rate" + }, + "packAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + }, + "default": "Normal" + }, + "options": { + "Double": "double", + "Normal": "normal", + "Half": "half", + "Quarter": "quarter", + "Off": "off" + } + } +} diff --git a/resources/app/gui/randomize/gameoptions/rightRomOptionsFrame.json b/resources/app/gui/randomize/gameoptions/rightRomOptionsFrame.json new file mode 100644 index 00000000..0e3b510b --- /dev/null +++ b/resources/app/gui/randomize/gameoptions/rightRomOptionsFrame.json @@ -0,0 +1,63 @@ +{ + "menuspeed": { + "type": "selectbox", + "label": { + "text": "Menu Speed" + }, + "packAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + }, + "default": "Normal" + }, + "options": { + "Instant": "instant", + "Quadruple": "quadruple", + "Triple": "triple", + "Double": "double", + "Normal": "normal", + "Half": "half" + } + }, + "owpalettes": { + "type": "selectbox", + "label": { + "text": "Overworld Palettes" + }, + "packAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "Default": "default", + "Random": "random", + "Blackout": "blackout" + } + }, + "uwpalettes": { + "type": "selectbox", + "label": { + "text": "Underworld Palettes" + }, + "packAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "Default": "default", + "Random": "random", + "Blackout": "blackout" + } + } +} From 7c3c67ec138fd97af2e53fe2465cbac28d7fd667 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Wed, 19 Feb 2020 01:37:40 -0800 Subject: [PATCH 088/117] JSONify Generation options --- gui/randomize/generation.py | 35 +++++-------------- .../gui/randomize/generation/checkboxes.json | 20 +++++++++++ 2 files changed, 28 insertions(+), 27 deletions(-) create mode 100644 resources/app/gui/randomize/generation/checkboxes.json diff --git a/gui/randomize/generation.py b/gui/randomize/generation.py index 9659d63d..1f90b31e 100644 --- a/gui/randomize/generation.py +++ b/gui/randomize/generation.py @@ -1,6 +1,8 @@ import os from tkinter import ttk, filedialog, IntVar, StringVar, Button, Checkbutton, Entry, Frame, Label, E, W, LEFT, RIGHT, X import gui.widgets as widgets +import json +import os def generation_page(parent,settings): # Generation Setup @@ -9,33 +11,12 @@ def generation_page(parent,settings): # Generation Setup options self.widgets = {} - myDict = { - ## Generate Spoiler - "spoiler": { - "type": "checkbox", - "label": { - "text": "Create Spoiler Log" - } - }, - ## Don't make ROM - "suppressrom": { - "type": "checkbox", - "label": { - "text": "Do not create patched ROM" - } - }, - ## Use Custom Item Pool as defined in Custom tab - "usecustompool": { - "type": "checkbox", - "label": { - "text": "Use custom item pool" - } - } - } - dictWidgets = widgets.make_widgets_from_dict(self, myDict, self) - for key in dictWidgets: - self.widgets[key] = dictWidgets[key] - self.widgets[key].pack(anchor=W) + with open(os.path.join("resources","app","gui","randomize","generation","checkboxes.json")) as checkboxes: + myDict = json.load(checkboxes) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, self) + for key in dictWidgets: + self.widgets[key] = dictWidgets[key] + self.widgets[key].pack(anchor=W) ## Locate base ROM baseRomFrame = Frame(self) diff --git a/resources/app/gui/randomize/generation/checkboxes.json b/resources/app/gui/randomize/generation/checkboxes.json new file mode 100644 index 00000000..ed208ec3 --- /dev/null +++ b/resources/app/gui/randomize/generation/checkboxes.json @@ -0,0 +1,20 @@ +{ + "spoiler": { + "type": "checkbox", + "label": { + "text": "Create Spoiler Log" + } + }, + "suppressrom": { + "type": "checkbox", + "label": { + "text": "Do not create patched ROM" + } + }, + "usecustompool": { + "type": "checkbox", + "label": { + "text": "Use custom item pool" + } + } +} From e78bb54eab2e681b4f587fe9f07a617e4ff49ca6 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Wed, 19 Feb 2020 01:53:56 -0800 Subject: [PATCH 089/117] JSONify Adjust options --- gui/adjust/overview.py | 142 +++--------------- .../app/gui/adjust/overview/checkboxes.json | 14 ++ .../gui/adjust/overview/leftAdjustFrame.json | 45 ++++++ .../gui/adjust/overview/rightAdjustFrame.json | 63 ++++++++ 4 files changed, 142 insertions(+), 122 deletions(-) create mode 100644 resources/app/gui/adjust/overview/checkboxes.json create mode 100644 resources/app/gui/adjust/overview/leftAdjustFrame.json create mode 100644 resources/app/gui/adjust/overview/rightAdjustFrame.json diff --git a/gui/adjust/overview.py b/gui/adjust/overview.py index 7f4918ed..3965d1e7 100644 --- a/gui/adjust/overview.py +++ b/gui/adjust/overview.py @@ -3,8 +3,9 @@ from AdjusterMain import adjust from argparse import Namespace from classes.SpriteSelector import SpriteSelector import gui.widgets as widgets +import json import logging - +import os def adjust_page(top, parent, settings): # Adjust page @@ -13,26 +14,12 @@ def adjust_page(top, parent, settings): # Adjust options self.widgets = {} - myDict = { - ## Disable BGM - "nobgm": { - "type": "checkbox", - "label": { - "text": "Disable Music & MSU-1" - } - }, - ## L/R Quickswap - "quickswap": { - "type": "checkbox", - "label": { - "text": "L/R Quickswapping" - } - } - } - dictWidgets = widgets.make_widgets_from_dict(self, myDict, self) - for key in dictWidgets: - self.widgets[key] = dictWidgets[key] - self.widgets[key].pack(anchor=W) + with open(os.path.join("resources","app","gui","adjust","overview","checkboxes.json")) as checkboxes: + myDict = json.load(checkboxes) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, self) + for key in dictWidgets: + self.widgets[key] = dictWidgets[key] + self.widgets[key].pack(anchor=W) selectOptionsFrame = Frame(self) leftAdjustFrame = Frame(selectOptionsFrame) @@ -43,49 +30,12 @@ def adjust_page(top, parent, settings): rightAdjustFrame.pack(side=RIGHT) bottomAdjustFrame.pack(fill=X, expand=True) - myDict = { - ## Heart Color - "heartcolor": { - "type": "selectbox", - "label": { - "text": "Heart Color" - }, - "packAttrs": { - "label": { "side": LEFT }, - "selectbox": { "side": RIGHT } - }, - "options": { - "Red": "red", - "Blue": "blue", - "Green": "green", - "Yellow": "yellow", - "Random": "random" - } - }, - ## Heart Beep speed - "heartbeep": { - "type": "selectbox", - "label": { - "text": "Heart Beep sound rate" - }, - "packAttrs": { - "label": { "side": LEFT }, - "selectbox": { "side": RIGHT}, - "default": "Normal" - }, - "options": { - "Double": "double", - "Normal": "normal", - "Half": "half", - "Quarter": "quarter", - "Off": "off" - } - } - } - dictWidgets = widgets.make_widgets_from_dict(self, myDict, leftAdjustFrame) - for key in dictWidgets: - self.widgets[key] = dictWidgets[key] - self.widgets[key].pack(anchor=E) + with open(os.path.join("resources","app","gui","adjust","overview","leftAdjustFrame.json")) as leftAdjustFrameItems: + myDict = json.load(leftAdjustFrameItems) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, leftAdjustFrame) + for key in dictWidgets: + self.widgets[key] = dictWidgets[key] + self.widgets[key].pack(anchor=E) # Sprite Selection self.spriteNameVar2 = StringVar() @@ -113,64 +63,12 @@ def adjust_page(top, parent, settings): spriteSelectButton2.pack(side=LEFT) spriteDialogFrame2.pack(anchor=E) - myDict = { - ## Menu Speed - "menuspeed": { - "type": "selectbox", - "label": { - "text": "Menu Speed" - }, - "packAttrs": { - "label": { "side": LEFT }, - "selectbox": { "side": RIGHT }, - "default": "Normal" - }, - "options": { - "Instant": "instant", - "Quadruple": "quadruple", - "Triple": "triple", - "Double": "double", - "Normal": "normal", - "Half": "half" - } - }, - ## Overworld Palettes (not Enemizer) - "owpalettes": { - "type": "selectbox", - "label": { - "text": "Overworld Palettes" - }, - "packAttrs": { - "label": { "side": LEFT }, - "selectbox": { "side": RIGHT } - }, - "options": { - "Default": "default", - "Random": "random", - "Blackout": "blackout" - } - }, - ## Underworld Palettes (not Enemizer) - "uwpalettes": { - "type": "selectbox", - "label": { - "text": "Underworld Palettes" - }, - "packAttrs": { - "label": { "side": LEFT }, - "selectbox": { "side": RIGHT } - }, - "options": { - "Default": "default", - "Random": "random", - "Blackout": "blackout" - } - } - } - dictWidgets = widgets.make_widgets_from_dict(self, myDict, rightAdjustFrame) - for key in dictWidgets: - self.widgets[key] = dictWidgets[key] - self.widgets[key].pack(anchor=E) + with open(os.path.join("resources","app","gui","adjust","overview","rightAdjustFrame.json")) as rightAdjustFrameItems: + myDict = json.load(rightAdjustFrameItems) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, rightAdjustFrame) + for key in dictWidgets: + self.widgets[key] = dictWidgets[key] + self.widgets[key].pack(anchor=E) adjustRomFrame = Frame(bottomAdjustFrame) adjustRomLabel = Label(adjustRomFrame, text='Rom to adjust: ') diff --git a/resources/app/gui/adjust/overview/checkboxes.json b/resources/app/gui/adjust/overview/checkboxes.json new file mode 100644 index 00000000..9a4e94f2 --- /dev/null +++ b/resources/app/gui/adjust/overview/checkboxes.json @@ -0,0 +1,14 @@ +{ + "nobgm": { + "type": "checkbox", + "label": { + "text": "Disable Music & MSU-1" + } + }, + "quickswap": { + "type": "checkbox", + "label": { + "text": "L/R Quickswapping" + } + } +} diff --git a/resources/app/gui/adjust/overview/leftAdjustFrame.json b/resources/app/gui/adjust/overview/leftAdjustFrame.json new file mode 100644 index 00000000..ce8a5b32 --- /dev/null +++ b/resources/app/gui/adjust/overview/leftAdjustFrame.json @@ -0,0 +1,45 @@ +{ + "heartcolor": { + "type": "selectbox", + "label": { + "text": "Heart Color" + }, + "packAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "Red": "red", + "Blue": "blue", + "Green": "green", + "Yellow": "yellow", + "Random": "random" + } + }, + "heartbeep": { + "type": "selectbox", + "label": { + "text": "Heart Beep sound rate" + }, + "packAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + }, + "default": "Normal" + }, + "options": { + "Double": "double", + "Normal": "normal", + "Half": "half", + "Quarter": "quarter", + "Off": "off" + } + } +} diff --git a/resources/app/gui/adjust/overview/rightAdjustFrame.json b/resources/app/gui/adjust/overview/rightAdjustFrame.json new file mode 100644 index 00000000..0e3b510b --- /dev/null +++ b/resources/app/gui/adjust/overview/rightAdjustFrame.json @@ -0,0 +1,63 @@ +{ + "menuspeed": { + "type": "selectbox", + "label": { + "text": "Menu Speed" + }, + "packAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + }, + "default": "Normal" + }, + "options": { + "Instant": "instant", + "Quadruple": "quadruple", + "Triple": "triple", + "Double": "double", + "Normal": "normal", + "Half": "half" + } + }, + "owpalettes": { + "type": "selectbox", + "label": { + "text": "Overworld Palettes" + }, + "packAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "Default": "default", + "Random": "random", + "Blackout": "blackout" + } + }, + "uwpalettes": { + "type": "selectbox", + "label": { + "text": "Underworld Palettes" + }, + "packAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "Default": "default", + "Random": "random", + "Blackout": "blackout" + } + } +} From 1f90e90372bd4542f7d1687e637c72eb71537c0f Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Wed, 19 Feb 2020 02:51:59 -0800 Subject: [PATCH 090/117] JSONify Custom Item Pool --- gui/custom/overview.py | 919 +----------------- .../app/gui/custom/overview/itemList1.json | 255 +++++ .../app/gui/custom/overview/itemList2.json | 257 +++++ .../app/gui/custom/overview/itemList3.json | 255 +++++ .../app/gui/custom/overview/itemList4.json | 256 +++++ .../app/gui/custom/overview/itemList5.json | 188 ++++ 6 files changed, 1243 insertions(+), 887 deletions(-) create mode 100644 resources/app/gui/custom/overview/itemList1.json create mode 100644 resources/app/gui/custom/overview/itemList2.json create mode 100644 resources/app/gui/custom/overview/itemList3.json create mode 100644 resources/app/gui/custom/overview/itemList4.json create mode 100644 resources/app/gui/custom/overview/itemList5.json diff --git a/gui/custom/overview.py b/gui/custom/overview.py index 259a7d50..754f2e1a 100644 --- a/gui/custom/overview.py +++ b/gui/custom/overview.py @@ -1,5 +1,7 @@ from tkinter import ttk, StringVar, Entry, Frame, Label, N, E, W, LEFT, RIGHT, X import gui.widgets as widgets +import json +import os def custom_page(top,parent): # Custom Item Pool @@ -22,901 +24,44 @@ def custom_page(top,parent): itemList5 = Frame(self) currentList = itemList1 - - myDict = { - # Bow - "bow": { - "type": "textbox", - "label": { - "text": "Bow" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,53) }, - "textbox": { "side": RIGHT }, - "default": 0 - } - }, - # Progressive Bow - "progressivebow": { - "type": "textbox", - "label": { - "text": "Prog.Bow" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,25) }, - "textbox": { "side": RIGHT }, - "default": 2 - } - }, - # Boomerang - "boomerang": { - "type": "textbox", - "label": { - "text": "B.Boomerang" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,4) }, - "textbox": { "side": RIGHT }, - "default": 1 - } - }, - # Boomerang - "redmerang": { - "type": "textbox", - "label": { - "text": "M.Boomerang" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT }, - "textbox": { "side": RIGHT }, - "default": 1 - } - }, - # Hookshot - "hookshot": { - "type": "textbox", - "label": { - "text": "Hookshot" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,24) }, - "textbox": { "side": RIGHT }, - "default": 1 - } - }, - # Mushroom - "mushroom": { - "type": "textbox", - "label": { - "text": "Mushroom" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,17) }, - "textbox": { "side": RIGHT }, - "default": 1 - } - }, - # Powder - "powder": { - "type": "textbox", - "label": { - "text": "Magic Powder" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT }, - "textbox": { "side": RIGHT }, - "default": 1 - } - }, - # Fire Rod - "firerod": { - "type": "textbox", - "label": { - "text": "Fire Rod" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,33) }, - "textbox": { "side": RIGHT }, - "default": 1 - } - }, - # Ice Rod - "icerod": { - "type": "textbox", - "label": { - "text": "Ice Rod" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,37) }, - "textbox": { "side": RIGHT }, - "default": 1 - } - }, - # Bombos - "bombos": { - "type": "textbox", - "label": { - "text": "Bombos" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,32) }, - "textbox": { "side": RIGHT }, - "default": 1 - } - }, - # Ether - "ether": { - "type": "textbox", - "label": { - "text": "Ether" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,49) }, - "textbox": { "side": RIGHT }, - "default": 1 - } - }, - # Quake - "quake": { - "type": "textbox", - "label": { - "text": "Quake" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,42) }, - "textbox": { "side": RIGHT }, - "default": 1 - } - }, - # Lamp - "lamp": { - "type": "textbox", - "label": { - "text": "Lamp" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,46) }, - "textbox": { "side": RIGHT }, - "default": 1 - } - }, - # Hammer - "hammer": { - "type": "textbox", - "label": { - "text": "Hammer" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,29) }, - "textbox": { "side": RIGHT }, - "default": 1 - } - }, - # Shovel - "shovel": { - "type": "textbox", - "label": { - "text": "Shovel" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,41) }, - "textbox": { "side": RIGHT }, - "default": 1 - } - } - } - dictWidgets = widgets.make_widgets_from_dict(self, myDict, currentList) - for key in dictWidgets: - self.customWidgets[key] = dictWidgets[key] - self.customWidgets[key].pack() + with open(os.path.join("resources","app","gui","custom","overview","itemList1.json")) as items: + myDict = json.load(items) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, currentList) + for key in dictWidgets: + self.customWidgets[key] = dictWidgets[key] + self.customWidgets[key].pack() currentList = itemList2 - - myDict = { - # Flute - "flute": { - "type": "textbox", - "label": { - "text": "Flute" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,58) }, - "textbox": { "side": RIGHT }, - "default": 1 - } - }, - # Bug Net - "bugnet": { - "type": "textbox", - "label": { - "text": "Bug Net" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,41) }, - "textbox": { "side": RIGHT }, - "default": 1 - } - }, - # Book of Mudora - "book": { - "type": "textbox", - "label": { - "text": "Book" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,57) }, - "textbox": { "side": RIGHT }, - "default": 1 - } - }, - # Bottle - "bottle": { - "type": "textbox", - "label": { - "text": "Bottle" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,53) }, - "textbox": { "side": RIGHT }, - "default": 4 - } - }, - # Cane of Somaria - "somaria": { - "type": "textbox", - "label": { - "text": "C.Somaria" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,30) }, - "textbox": { "side": RIGHT }, - "default": 1 - } - }, - # Cane of Byrna - "byrna": { - "type": "textbox", - "label": { - "text": "C.Byrna" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,43) }, - "textbox": { "side": RIGHT }, - "default": 1 - } - }, - # Magic Cape - "cape": { - "type": "textbox", - "label": { - "text": "Magic Cape" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,21) }, - "textbox": { "side": RIGHT }, - "default": 1 - } - }, - # Magic Mirror - "mirror": { - "type": "textbox", - "label": { - "text": "Magic Mirror" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,15) }, - "textbox": { "side": RIGHT }, - "default": 1 - } - }, - # Pegasus Boots - "boots": { - "type": "textbox", - "label": { - "text": "Pegasus Boots" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,8) }, - "textbox": { "side": RIGHT }, - "default": 1 - } - }, - # Power Glove - "powerglove": { - "type": "textbox", - "label": { - "text": "Power Glove" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,18) }, - "textbox": { "side": RIGHT }, - "default": 0 - } - }, - # Titan's Mitt - "titansmitt": { - "type": "textbox", - "label": { - "text": "Titan\'s Mitt" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,25) }, - "textbox": { "side": RIGHT }, - "default": 0 - } - }, - # Progressive Glove - "progressiveglove": { - "type": "textbox", - "label": { - "text": "Prog.Glove" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,26) }, - "textbox": { "side": RIGHT }, - "default": 2 - } - }, - # Flippers - "flippers": { - "type": "textbox", - "label": { - "text": "Flippers" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,43) }, - "textbox": { "side": RIGHT }, - "default": 1 - } - }, - # Moon Pearl - "pearl": { - "type": "textbox", - "label": { - "text": "Moon Pearl" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,23) }, - "textbox": { "side": RIGHT }, - "default": 1 - } - }, - # Piece of Heart - "heartpiece": { - "type": "textbox", - "label": { - "text": "Piece of Heart" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,10) }, - "textbox": { "side": RIGHT }, - "default": 24 - } - } - } - dictWidgets = widgets.make_widgets_from_dict(self, myDict, currentList) - for key in dictWidgets: - self.customWidgets[key] = dictWidgets[key] - self.customWidgets[key].pack() + with open(os.path.join("resources","app","gui","custom","overview","itemList2.json")) as items: + myDict = json.load(items) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, currentList) + for key in dictWidgets: + self.customWidgets[key] = dictWidgets[key] + self.customWidgets[key].pack() currentList = itemList3 - - myDict = { - # Heart Container - "heartcontainer": { - "type": "textbox", - "label": { - "text": "Heart Container" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT }, - "textbox": { "side": RIGHT }, - "default": 10 - } - }, - # Sanctuary Heart - "sancheart": { - "type": "textbox", - "label": { - "text": "Sanctuary Heart" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT }, - "textbox": { "side": RIGHT }, - "default": 1 - } - }, - # Fighters' Sword - "sword1": { - "type": "textbox", - "label": { - "text": "Sword 1" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,42) }, - "textbox": { "side": RIGHT }, - "default": 0 - } - }, - # Master Sword - "sword2": { - "type": "textbox", - "label": { - "text": "Sword 2" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,42) }, - "textbox": { "side": RIGHT }, - "default": 0 - } - }, - # Tempered Sword - "sword3": { - "type": "textbox", - "label": { - "text": "Sword 3" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,42) }, - "textbox": { "side": RIGHT }, - "default": 0 - } - }, - # Gold Sword - "sword4": { - "type": "textbox", - "label": { - "text": "Sword 4" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,42) }, - "textbox": { "side": RIGHT }, - "default": 0 - } - }, - # Progressive Sword - "progressivesword": { - "type": "textbox", - "label": { - "text": "Prog.Sword" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,23) }, - "textbox": { "side": RIGHT }, - "default": 4 - } - }, - # Fighters' Shield - "shield1": { - "type": "textbox", - "label": { - "text": "Shield 1" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,43) }, - "textbox": { "side": RIGHT }, - "default": 0 - } - }, - # Fire Shield - "shield2": { - "type": "textbox", - "label": { - "text": "Shield 2" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,43) }, - "textbox": { "side": RIGHT }, - "default": 0 - } - }, - # Mirror Shield - "shield3": { - "type": "textbox", - "label": { - "text": "Shield 3" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,43) }, - "textbox": { "side": RIGHT }, - "default": 0 - } - }, - # Progressive Shield - "progressiveshield": { - "type": "textbox", - "label": { - "text": "Prog.Shield" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,24) }, - "textbox": { "side": RIGHT }, - "default": 3 - } - }, - # Blue Mail - "mail2": { - "type": "textbox", - "label": { - "text": "Blue Mail" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,35) }, - "textbox": { "side": RIGHT }, - "default": 0 - } - }, - # Red Mail - "mail3": { - "type": "textbox", - "label": { - "text": "Red Mail" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,38) }, - "textbox": { "side": RIGHT }, - "default": 0 - } - }, - # Progressive Mail - "progressivemail": { - "type": "textbox", - "label": { - "text": "Prog.Mail" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,33) }, - "textbox": { "side": RIGHT }, - "default": 2 - } - }, - # Half Magic - "halfmagic": { - "type": "textbox", - "label": { - "text": "Half Magic" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,26) }, - "textbox": { "side": RIGHT }, - "default": 1 - } - } - } - dictWidgets = widgets.make_widgets_from_dict(self, myDict, currentList) - for key in dictWidgets: - self.customWidgets[key] = dictWidgets[key] - self.customWidgets[key].pack() + with open(os.path.join("resources","app","gui","custom","overview","itemList3.json")) as items: + myDict = json.load(items) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, currentList) + for key in dictWidgets: + self.customWidgets[key] = dictWidgets[key] + self.customWidgets[key].pack() currentList = itemList4 - - myDict = { - # Quarter Magic - "quartermagic": { - "type": "textbox", - "label": { - "text": "Quarter Magic" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT }, - "textbox": { "side": RIGHT }, - "default": 0 - } - }, - # Bomb Capacity +5 - "bombsplus5": { - "type": "textbox", - "label": { - "text": "Bomb C.+5" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (1,15) }, - "textbox": { "side": RIGHT }, - "default": 0 - } - }, - # Bomb Capacity +10 - "bombsplus10": { - "type": "textbox", - "label": { - "text": "Bomb C.+10" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,10) }, - "textbox": { "side": RIGHT }, - "default": 0 - } - }, - # Arrow Capacity + 5 - "arrowsplus5": { - "type": "textbox", - "label": { - "text": "Arrow C.+5" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,16) }, - "textbox": { "side": RIGHT }, - "default": 0 - } - }, - # Arrow Capacity +10 - "arrowsplus10": { - "type": "textbox", - "label": { - "text": "Arrow C.+10" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,10) }, - "textbox": { "side": RIGHT }, - "default": 0 - } - }, - # Arrow (1) - "arrow1": { - "type": "textbox", - "label": { - "text": "Arrow (1)" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,27) }, - "textbox": { "side": RIGHT }, - "default": 1 - } - }, - # Arrow (10) - "arrow10": { - "type": "textbox", - "label": { - "text": "Arrow (10)" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,21) }, - "textbox": { "side": RIGHT }, - "default": 12 - } - }, - # Bomb (1) - "bomb1": { - "type": "textbox", - "label": { - "text": "Bomb (1)" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,27) }, - "textbox": { "side": RIGHT }, - "default": 0 - } - }, - # Bomb (3) - "bomb3": { - "type": "textbox", - "label": { - "text": "Bomb (3)" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,27) }, - "textbox": { "side": RIGHT }, - "default": 13 - } - }, - # Bomb (10) - "bomb10": { - "type": "textbox", - "label": { - "text": "Bomb (10)" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,21) }, - "textbox": { "side": RIGHT }, - "default": 1 - } - }, - # Rupee (1) - "rupee1": { - "type": "textbox", - "label": { - "text": "Rupee (1)" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,25) }, - "textbox": { "side": RIGHT }, - "default": 2 - } - }, - # Rupee (5) - "rupee5": { - "type": "textbox", - "label": { - "text": "Rupee (5)" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,25) }, - "textbox": { "side": RIGHT }, - "default": 4 - } - }, - # Rupee (20) - "rupee20": { - "type": "textbox", - "label": { - "text": "Rupee (20)" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,19) }, - "textbox": { "side": RIGHT }, - "default": 28 - } - }, - # Rupee (50) - "rupee50": { - "type": "textbox", - "label": { - "text": "Rupee (50)" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,19) }, - "textbox": { "side": RIGHT }, - "default": 7 - } - }, - # Rupee (100) - "rupee100": { - "type": "textbox", - "label": { - "text": "Rupee (100)" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,13) }, - "textbox": { "side": RIGHT }, - "default": 1 - } - } - } - dictWidgets = widgets.make_widgets_from_dict(self, myDict, currentList) - for key in dictWidgets: - self.customWidgets[key] = dictWidgets[key] - self.customWidgets[key].pack() + with open(os.path.join("resources","app","gui","custom","overview","itemList4.json")) as items: + myDict = json.load(items) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, currentList) + for key in dictWidgets: + self.customWidgets[key] = dictWidgets[key] + self.customWidgets[key].pack() currentList = itemList5 - - myDict = { - # Rupee (300) - "rupee300": { - "type": "textbox", - "label": { - "text": "Rupee (300)" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,54) }, - "textbox": { "side": RIGHT }, - "default": 5 - } - }, - # Blue Clock - "blueclock": { - "type": "textbox", - "label": { - "text": "Blue Clock" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,60) }, - "textbox": { "side": RIGHT }, - "default": 0 - } - }, - # Green Clock - "greenclock": { - "type": "textbox", - "label": { - "text": "Green Clock" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,52) }, - "textbox": { "side": RIGHT }, - "default": 0 - } - }, - # Red Clock - "redclock": { - "type": "textbox", - "label": { - "text": "Red Clock" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,63) }, - "textbox": { "side": RIGHT }, - "default": 0 - } - }, - # Silver Arrows Upgrade - "silversupgrade": { - "type": "textbox", - "label": { - "text": "Silver Arrows Upgrade" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT }, - "textbox": { "side": RIGHT }, - "default": 0 - } - }, - # Generic Keys - "generickeys": { - "type": "textbox", - "label": { - "text": "Generic Keys" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,49) }, - "textbox": { "side": RIGHT }, - "default": 0 - } - }, - # Triforce Pieces - "triforcepieces": { - "type": "textbox", - "label": { - "text": "Triforce Pieces" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,40) }, - "textbox": { "side": RIGHT }, - "default": 0 - } - }, - # Triforce Pieces Goal - "triforcepiecesgoal": { - "type": "textbox", - "label": { - "text": "Triforce Pieces Goal" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,13) }, - "textbox": { "side": RIGHT }, - "default": 0 - } - }, - # Triforce (win game) - "triforce": { - "type": "textbox", - "label": { - "text": "Triforce (win game)" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,13) }, - "textbox": { "side": RIGHT }, - "default": 0 - } - }, - # Rupoor - "rupoor": { - "type": "textbox", - "label": { - "text": "Rupoor" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,77) }, - "textbox": { "side": RIGHT }, - "default": 0 - } - }, - # Rupoor Cost - "rupoorcost": { - "type": "textbox", - "label": { - "text": "Rupoor Cost" - }, - "packAttrs": { - "label": { "anchor": W, "side": LEFT, "padx": (0,50) }, - "textbox": { "side": RIGHT }, - "default": 10 - } - } - } - dictWidgets = widgets.make_widgets_from_dict(self, myDict, currentList) - for key in dictWidgets: - self.customWidgets[key] = dictWidgets[key] - self.customWidgets[key].pack() + with open(os.path.join("resources","app","gui","custom","overview","itemList5.json")) as items: + myDict = json.load(items) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, currentList) + for key in dictWidgets: + self.customWidgets[key] = dictWidgets[key] + self.customWidgets[key].pack() itemList1.pack(side=LEFT, padx=(0,0)) itemList2.pack(side=LEFT, padx=(0,0)) diff --git a/resources/app/gui/custom/overview/itemList1.json b/resources/app/gui/custom/overview/itemList1.json new file mode 100644 index 00000000..9e16f26b --- /dev/null +++ b/resources/app/gui/custom/overview/itemList1.json @@ -0,0 +1,255 @@ +{ + "bow": { + "type": "textbox", + "label": { + "text": "Bow" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,53] + }, + "textbox": { + "side": "right" + }, + "default": 0 + } + }, + "progressivebow": { + "type": "textbox", + "label": { + "text": "Prog.Bow" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,25] + }, + "textbox": { + "side": "right" + }, + "default": 2 + } + }, + "boomerang": { + "type": "textbox", + "label": { + "text": "B.Boomerang" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,4] + }, + "textbox": { + "side": "right" + }, + "default": 1 + } + }, + "redmerang": { + "type": "textbox", + "label": { + "text": "M.Boomerang" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left" + }, + "textbox": { + "side": "right" + }, + "default": 1 + } + }, + "hookshot": { + "type": "textbox", + "label": { + "text": "Hookshot" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,24] + }, + "textbox": { + "side": "right" + }, + "default": 1 + } + }, + "mushroom": { + "type": "textbox", + "label": { + "text": "Mushroom" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,17] + }, + "textbox": { + "side": "right" + }, + "default": 1 + } + }, + "powder": { + "type": "textbox", + "label": { + "text": "Magic Powder" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left" + }, + "textbox": { + "side": "right" + }, + "default": 1 + } + }, + "firerod": { + "type": "textbox", + "label": { + "text": "Fire Rod" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,33] + }, + "textbox": { + "side": "right" + }, + "default": 1 + } + }, + "icerod": { + "type": "textbox", + "label": { + "text": "Ice Rod" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,37] + }, + "textbox": { + "side": "right" + }, + "default": 1 + } + }, + "bombos": { + "type": "textbox", + "label": { + "text": "Bombos" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,32] + }, + "textbox": { + "side": "right" + }, + "default": 1 + } + }, + "ether": { + "type": "textbox", + "label": { + "text": "Ether" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,49] + }, + "textbox": { + "side": "right" + }, + "default": 1 + } + }, + "quake": { + "type": "textbox", + "label": { + "text": "Quake" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,42] + }, + "textbox": { + "side": "right" + }, + "default": 1 + } + }, + "lamp": { + "type": "textbox", + "label": { + "text": "Lamp" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,46] + }, + "textbox": { + "side": "right" + }, + "default": 1 + } + }, + "hammer": { + "type": "textbox", + "label": { + "text": "Hammer" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,29] + }, + "textbox": { + "side": "right" + }, + "default": 1 + } + }, + "shovel": { + "type": "textbox", + "label": { + "text": "Shovel" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,41] + }, + "textbox": { + "side": "right" + }, + "default": 1 + } + } +} diff --git a/resources/app/gui/custom/overview/itemList2.json b/resources/app/gui/custom/overview/itemList2.json new file mode 100644 index 00000000..fac1e620 --- /dev/null +++ b/resources/app/gui/custom/overview/itemList2.json @@ -0,0 +1,257 @@ +{ + "flute": { + "type": "textbox", + "label": { + "text": "Flute" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,58] + }, + "textbox": { + "side": "right" + }, + "default": 1 + } + }, + "bugnet": { + "type": "textbox", + "label": { + "text": "Bug Net" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,41] + }, + "textbox": { + "side": "right" + }, + "default": 1 + } + }, + "book": { + "type": "textbox", + "label": { + "text": "Book" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,57] + }, + "textbox": { + "side": "right" + }, + "default": 1 + } + }, + "bottle": { + "type": "textbox", + "label": { + "text": "Bottle" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,53] + }, + "textbox": { + "side": "right" + }, + "default": 4 + } + }, + "somaria": { + "type": "textbox", + "label": { + "text": "C.Somaria" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,30] + }, + "textbox": { + "side": "right" + }, + "default": 1 + } + }, + "byrna": { + "type": "textbox", + "label": { + "text": "C.Byrna" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,43] + }, + "textbox": { + "side": "right" + }, + "default": 1 + } + }, + "cape": { + "type": "textbox", + "label": { + "text": "Magic Cape" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,21] + }, + "textbox": { + "side": "right" + }, + "default": 1 + } + }, + "mirror": { + "type": "textbox", + "label": { + "text": "Magic Mirror" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,15] + }, + "textbox": { + "side": "right" + }, + "default": 1 + } + }, + "boots": { + "type": "textbox", + "label": { + "text": "Pegasus Boots" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,8] + }, + "textbox": { + "side": "right" + }, + "default": 1 + } + }, + "powerglove": { + "type": "textbox", + "label": { + "text": "Power Glove" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,18] + }, + "textbox": { + "side": "right" + }, + "default": 0 + } + }, + "titansmitt": { + "type": "textbox", + "label": { + "text": "Titan's Mitt" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,25] + }, + "textbox": { + "side": "right" + }, + "default": 0 + } + }, + "progressiveglove": { + "type": "textbox", + "label": { + "text": "Prog.Glove" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,26] + }, + "textbox": { + "side": "right" + }, + "default": 2 + } + }, + "flippers": { + "type": "textbox", + "label": { + "text": "Flippers" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,43] + }, + "textbox": { + "side": "right" + }, + "default": 1 + } + }, + "pearl": { + "type": "textbox", + "label": { + "text": "Moon Pearl" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,23] + }, + "textbox": { + "side": "right" + }, + "default": 1 + } + }, + "heartpiece": { + "type": "textbox", + "label": { + "text": "Piece of Heart" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,10] + }, + "textbox": { + "side": "right" + }, + "default": 24 + } + } +} diff --git a/resources/app/gui/custom/overview/itemList3.json b/resources/app/gui/custom/overview/itemList3.json new file mode 100644 index 00000000..cb7b40ec --- /dev/null +++ b/resources/app/gui/custom/overview/itemList3.json @@ -0,0 +1,255 @@ +{ + "heartcontainer": { + "type": "textbox", + "label": { + "text": "Heart Container" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left" + }, + "textbox": { + "side": "right" + }, + "default": 10 + } + }, + "sancheart": { + "type": "textbox", + "label": { + "text": "Sanctuary Heart" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left" + }, + "textbox": { + "side": "right" + }, + "default": 1 + } + }, + "sword1": { + "type": "textbox", + "label": { + "text": "Sword 1" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,42] + }, + "textbox": { + "side": "right" + }, + "default": 0 + } + }, + "sword2": { + "type": "textbox", + "label": { + "text": "Sword 2" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,42] + }, + "textbox": { + "side": "right" + }, + "default": 0 + } + }, + "sword3": { + "type": "textbox", + "label": { + "text": "Sword 3" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,42] + }, + "textbox": { + "side": "right" + }, + "default": 0 + } + }, + "sword4": { + "type": "textbox", + "label": { + "text": "Sword 4" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,42] + }, + "textbox": { + "side": "right" + }, + "default": 0 + } + }, + "progressivesword": { + "type": "textbox", + "label": { + "text": "Prog.Sword" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,23] + }, + "textbox": { + "side": "right" + }, + "default": 4 + } + }, + "shield1": { + "type": "textbox", + "label": { + "text": "Shield 1" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,43] + }, + "textbox": { + "side": "right" + }, + "default": 0 + } + }, + "shield2": { + "type": "textbox", + "label": { + "text": "Shield 2" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,43] + }, + "textbox": { + "side": "right" + }, + "default": 0 + } + }, + "shield3": { + "type": "textbox", + "label": { + "text": "Shield 3" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,43] + }, + "textbox": { + "side": "right" + }, + "default": 0 + } + }, + "progressiveshield": { + "type": "textbox", + "label": { + "text": "Prog.Shield" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,24] + }, + "textbox": { + "side": "right" + }, + "default": 3 + } + }, + "mail2": { + "type": "textbox", + "label": { + "text": "Blue Mail" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,35] + }, + "textbox": { + "side": "right" + }, + "default": 0 + } + }, + "mail3": { + "type": "textbox", + "label": { + "text": "Red Mail" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,38] + }, + "textbox": { + "side": "right" + }, + "default": 0 + } + }, + "progressivemail": { + "type": "textbox", + "label": { + "text": "Prog.Mail" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,33] + }, + "textbox": { + "side": "right" + }, + "default": 2 + } + }, + "halfmagic": { + "type": "textbox", + "label": { + "text": "Half Magic" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,26] + }, + "textbox": { + "side": "right" + }, + "default": 1 + } + } +} diff --git a/resources/app/gui/custom/overview/itemList4.json b/resources/app/gui/custom/overview/itemList4.json new file mode 100644 index 00000000..6a6b43f6 --- /dev/null +++ b/resources/app/gui/custom/overview/itemList4.json @@ -0,0 +1,256 @@ +{ + "quartermagic": { + "type": "textbox", + "label": { + "text": "Quarter Magic" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left" + }, + "textbox": { + "side": "right" + }, + "default": 0 + } + }, + "bombsplus5": { + "type": "textbox", + "label": { + "text": "Bomb C.+5" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [1,15] + }, + "textbox": { + "side": "right" + }, + "default": 0 + } + }, + "bombsplus10": { + "type": "textbox", + "label": { + "text": "Bomb C.+10" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,10] + }, + "textbox": { + "side": "right" + }, + "default": 0 + } + }, + "arrowsplus5": { + "type": "textbox", + "label": { + "text": "Arrow C.+5" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,16] + }, + "textbox": { + "side": "right" + }, + "default": 0 + } + }, + "arrowsplus10": { + "type": "textbox", + "label": { + "text": "Arrow C.+10" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,10] + }, + "textbox": { + "side": "right" + }, + "default": 0 + } + }, + "arrow1": { + "type": "textbox", + "label": { + "text": "Arrow (1)" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,27] + }, + "textbox": { + "side": "right" + }, + "default": 1 + } + }, + "arrow10": { + "type": "textbox", + "label": { + "text": "Arrow (10)" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,21] + }, + "textbox": { + "side": "right" + }, + "default": 12 + } + }, + "bomb1": { + "type": "textbox", + "label": { + "text": "Bomb (1)" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,27] + }, + "textbox": { + "side": "right" + }, + "default": 0 + } + }, + "bomb3": { + "type": "textbox", + "label": { + "text": "Bomb (3)" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,27] + }, + "textbox": { + "side": "right" + }, + "default": 13 + } + }, + "bomb10": { + "type": "textbox", + "label": { + "text": "Bomb (10)" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,21] + }, + "textbox": { + "side": "right" + }, + "default": 1 + } + }, + "rupee1": { + "type": "textbox", + "label": { + "text": "Rupee (1)" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,25] + }, + "textbox": { + "side": "right" + }, + "default": 2 + } + }, + "rupee5": { + "type": "textbox", + "label": { + "text": "Rupee (5)" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,25] + }, + "textbox": { + "side": "right" + }, + "default": 4 + } + }, + "rupee20": { + "type": "textbox", + "label": { + "text": "Rupee (20)" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,19] + }, + "textbox": { + "side": "right" + }, + "default": 28 + } + }, + "rupee50": { + "type": "textbox", + "label": { + "text": "Rupee (50)" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,19] + }, + "textbox": { + "side": "right" + }, + "default": 7 + } + }, + "rupee100": { + "type": "textbox", + "label": { + "text": "Rupee (100)" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,13] + }, + "textbox": { + "side": "right" + }, + "default": 1 + } + } +} diff --git a/resources/app/gui/custom/overview/itemList5.json b/resources/app/gui/custom/overview/itemList5.json new file mode 100644 index 00000000..de75b805 --- /dev/null +++ b/resources/app/gui/custom/overview/itemList5.json @@ -0,0 +1,188 @@ +{ + "rupee300": { + "type": "textbox", + "label": { + "text": "Rupee (300)" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,54] + }, + "textbox": { + "side": "right" + }, + "default": 5 + } + }, + "blueclock": { + "type": "textbox", + "label": { + "text": "Blue Clock" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,60] + }, + "textbox": { + "side": "right" + }, + "default": 0 + } + }, + "greenclock": { + "type": "textbox", + "label": { + "text": "Green Clock" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,52] + }, + "textbox": { + "side": "right" + }, + "default": 0 + } + }, + "redclock": { + "type": "textbox", + "label": { + "text": "Red Clock" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,63] + }, + "textbox": { + "side": "right" + }, + "default": 0 + } + }, + "silversupgrade": { + "type": "textbox", + "label": { + "text": "Silver Arrows Upgrade" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left" + }, + "textbox": { + "side": "right" + }, + "default": 0 + } + }, + "generickeys": { + "type": "textbox", + "label": { + "text": "Generic Keys" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,49] + }, + "textbox": { + "side": "right" + }, + "default": 0 + } + }, + "triforcepieces": { + "type": "textbox", + "label": { + "text": "Triforce Pieces" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,40] + }, + "textbox": { + "side": "right" + }, + "default": 0 + } + }, + "triforcepiecesgoal": { + "type": "textbox", + "label": { + "text": "Triforce Pieces Goal" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,13] + }, + "textbox": { + "side": "right" + }, + "default": 0 + } + }, + "triforce": { + "type": "textbox", + "label": { + "text": "Triforce (win game)" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,13] + }, + "textbox": { + "side": "right" + }, + "default": 0 + } + }, + "rupoor": { + "type": "textbox", + "label": { + "text": "Rupoor" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,77] + }, + "textbox": { + "side": "right" + }, + "default": 0 + } + }, + "rupoorcost": { + "type": "textbox", + "label": { + "text": "Rupoor Cost" + }, + "packAttrs": { + "label": { + "anchor": "w", + "side": "left", + "padx": [0,50] + }, + "textbox": { + "side": "right" + }, + "default": 10 + } + } +} From 8c4bc60312f4b61e68ee020e88e08e9cd099e860 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Wed, 19 Feb 2020 03:14:08 -0800 Subject: [PATCH 091/117] Arrayify Frames for each page --- gui/adjust/overview.py | 35 +++++++++++++++++++-------------- gui/custom/overview.py | 38 ++++++++++++++++-------------------- gui/randomize/dungeon.py | 15 +++++++++----- gui/randomize/enemizer.py | 22 +++++++++++++-------- gui/randomize/entrando.py | 7 ++++++- gui/randomize/gameoptions.py | 21 ++++++++++++-------- gui/randomize/generation.py | 13 +++++++++--- gui/randomize/item.py | 21 ++++++++++++-------- gui/randomize/multiworld.py | 9 +++++++-- 9 files changed, 110 insertions(+), 71 deletions(-) diff --git a/gui/adjust/overview.py b/gui/adjust/overview.py index 3965d1e7..5d808e32 100644 --- a/gui/adjust/overview.py +++ b/gui/adjust/overview.py @@ -14,32 +14,37 @@ def adjust_page(top, parent, settings): # Adjust options self.widgets = {} + # Adjust option sections + self.frames = {} + self.frames["checkboxes"] = Frame(self) + self.frames["checkboxes"].pack(anchor=W) + with open(os.path.join("resources","app","gui","adjust","overview","checkboxes.json")) as checkboxes: myDict = json.load(checkboxes) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, self) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["checkboxes"]) for key in dictWidgets: self.widgets[key] = dictWidgets[key] self.widgets[key].pack(anchor=W) - selectOptionsFrame = Frame(self) - leftAdjustFrame = Frame(selectOptionsFrame) - rightAdjustFrame = Frame(selectOptionsFrame) - bottomAdjustFrame = Frame(self) - selectOptionsFrame.pack(fill=X, expand=True) - leftAdjustFrame.pack(side=LEFT) - rightAdjustFrame.pack(side=RIGHT) - bottomAdjustFrame.pack(fill=X, expand=True) + self.frames["selectOptionsFrame"] = Frame(self) + self.frames["leftAdjustFrame"] = Frame(self.frames["selectOptionsFrame"]) + self.frames["rightAdjustFrame"] = Frame(self.frames["selectOptionsFrame"]) + self.frames["bottomAdjustFrame"] = Frame(self) + self.frames["selectOptionsFrame"].pack(fill=X) + self.frames["leftAdjustFrame"].pack(side=LEFT) + self.frames["rightAdjustFrame"].pack(side=RIGHT) + self.frames["bottomAdjustFrame"].pack(fill=X) with open(os.path.join("resources","app","gui","adjust","overview","leftAdjustFrame.json")) as leftAdjustFrameItems: myDict = json.load(leftAdjustFrameItems) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, leftAdjustFrame) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["leftAdjustFrame"]) for key in dictWidgets: self.widgets[key] = dictWidgets[key] self.widgets[key].pack(anchor=E) # Sprite Selection self.spriteNameVar2 = StringVar() - spriteDialogFrame2 = Frame(leftAdjustFrame) + spriteDialogFrame2 = Frame(self.frames["leftAdjustFrame"]) baseSpriteLabel2 = Label(spriteDialogFrame2, text='Sprite:') spriteEntry2 = Label(spriteDialogFrame2, textvariable=self.spriteNameVar2) self.sprite = None @@ -65,12 +70,12 @@ def adjust_page(top, parent, settings): with open(os.path.join("resources","app","gui","adjust","overview","rightAdjustFrame.json")) as rightAdjustFrameItems: myDict = json.load(rightAdjustFrameItems) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, rightAdjustFrame) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["rightAdjustFrame"]) for key in dictWidgets: self.widgets[key] = dictWidgets[key] self.widgets[key].pack(anchor=E) - adjustRomFrame = Frame(bottomAdjustFrame) + adjustRomFrame = Frame(self.frames["bottomAdjustFrame"]) adjustRomLabel = Label(adjustRomFrame, text='Rom to adjust: ') self.romVar2 = StringVar(value=settings["rom"]) romEntry2 = Entry(adjustRomFrame, textvariable=self.romVar2) @@ -85,7 +90,7 @@ def adjust_page(top, parent, settings): adjustRomLabel.pack(side=LEFT) romEntry2.pack(side=LEFT, fill=X, expand=True) romSelectButton2.pack(side=LEFT) - adjustRomFrame.pack(fill=X, expand=True) + adjustRomFrame.pack(fill=X) def adjustRom(): options = { @@ -112,7 +117,7 @@ def adjust_page(top, parent, settings): else: messagebox.showinfo(title="Success", message="Rom patched successfully") - adjustButton = Button(bottomAdjustFrame, text='Adjust Rom', command=adjustRom) + adjustButton = Button(self.frames["bottomAdjustFrame"], text='Adjust Rom', command=adjustRom) adjustButton.pack(side=BOTTOM, padx=(5, 0)) return self,settings diff --git a/gui/custom/overview.py b/gui/custom/overview.py index 754f2e1a..2ce95459 100644 --- a/gui/custom/overview.py +++ b/gui/custom/overview.py @@ -17,56 +17,52 @@ def custom_page(top,parent): # Custom Item Pool options self.customWidgets = {} - itemList1 = Frame(self) - itemList2 = Frame(self) - itemList3 = Frame(self) - itemList4 = Frame(self) - itemList5 = Frame(self) + # Custom Item Pool option sections + self.frames = {} + self.frames["itemList1"] = Frame(self) + self.frames["itemList1"].pack(side=LEFT, padx=(0,0), anchor=N) + self.frames["itemList2"] = Frame(self) + self.frames["itemList2"].pack(side=LEFT, padx=(0,0), anchor=N) + self.frames["itemList3"] = Frame(self) + self.frames["itemList3"].pack(side=LEFT, padx=(0,0), anchor=N) + self.frames["itemList4"] = Frame(self) + self.frames["itemList4"].pack(side=LEFT, padx=(0,0), anchor=N) + self.frames["itemList5"] = Frame(self) + self.frames["itemList5"].pack(side=LEFT, padx=(0,0), anchor=N) - currentList = itemList1 with open(os.path.join("resources","app","gui","custom","overview","itemList1.json")) as items: myDict = json.load(items) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, currentList) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["itemList1"]) for key in dictWidgets: self.customWidgets[key] = dictWidgets[key] self.customWidgets[key].pack() - currentList = itemList2 with open(os.path.join("resources","app","gui","custom","overview","itemList2.json")) as items: myDict = json.load(items) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, currentList) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["itemList2"]) for key in dictWidgets: self.customWidgets[key] = dictWidgets[key] self.customWidgets[key].pack() - currentList = itemList3 with open(os.path.join("resources","app","gui","custom","overview","itemList3.json")) as items: myDict = json.load(items) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, currentList) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["itemList3"]) for key in dictWidgets: self.customWidgets[key] = dictWidgets[key] self.customWidgets[key].pack() - currentList = itemList4 with open(os.path.join("resources","app","gui","custom","overview","itemList4.json")) as items: myDict = json.load(items) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, currentList) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["itemList4"]) for key in dictWidgets: self.customWidgets[key] = dictWidgets[key] self.customWidgets[key].pack() - currentList = itemList5 with open(os.path.join("resources","app","gui","custom","overview","itemList5.json")) as items: myDict = json.load(items) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, currentList) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["itemList5"]) for key in dictWidgets: self.customWidgets[key] = dictWidgets[key] self.customWidgets[key].pack() - itemList1.pack(side=LEFT, padx=(0,0)) - itemList2.pack(side=LEFT, padx=(0,0)) - itemList3.pack(side=LEFT, padx=(0,0)) - itemList4.pack(side=LEFT, padx=(0,0)) - itemList5.pack(side=LEFT, padx=(0,0), anchor=N) - return self diff --git a/gui/randomize/dungeon.py b/gui/randomize/dungeon.py index 9a9a0a5f..1d575521 100644 --- a/gui/randomize/dungeon.py +++ b/gui/randomize/dungeon.py @@ -10,22 +10,27 @@ def dungeon_page(parent): # Dungeon Shuffle options self.widgets = {} + # Dungeon Shuffle option sections + self.frames = {} + self.frames["keysanity"] = Frame(self) + self.frames["keysanity"].pack(anchor=W) + ## Dungeon Item Shuffle - mcsbshuffleFrame = Frame(self) - mcsbshuffleFrame.pack(anchor=W) - mscbLabel = Label(mcsbshuffleFrame, text="Shuffle: ") + mscbLabel = Label(self.frames["keysanity"], text="Shuffle: ") mscbLabel.pack(side=LEFT) with open(os.path.join("resources","app","gui","randomize","dungeon","keysanity.json")) as keysanityItems: myDict = json.load(keysanityItems) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, mcsbshuffleFrame) + 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) + self.frames["widgets"] = Frame(self) + self.frames["widgets"].pack(anchor=W) with open(os.path.join("resources","app","gui","randomize","dungeon","widgets.json")) as dungeonWidgets: myDict = json.load(dungeonWidgets) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, self) + 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) diff --git a/gui/randomize/enemizer.py b/gui/randomize/enemizer.py index 9292a773..08179078 100644 --- a/gui/randomize/enemizer.py +++ b/gui/randomize/enemizer.py @@ -11,9 +11,15 @@ def enemizer_page(parent,settings): # Enemizer options self.widgets = {} + # Enemizer option sections + self.frames = {} + + self.frames["checkboxes"] = Frame(self) + self.frames["checkboxes"].pack(anchor=W) + with open(os.path.join("resources","app","gui","randomize","enemizer","checkboxes.json")) as checkboxes: myDict = json.load(checkboxes) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, self) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["checkboxes"]) for key in dictWidgets: self.widgets[key] = dictWidgets[key] self.widgets[key].pack(anchor=W) @@ -35,23 +41,23 @@ def enemizer_page(parent,settings): settings["enemizercli"] = path enemizerCLIbrowseButton = Button(enemizerPathFrame, text='...', command=EnemizerSelectPath) enemizerCLIbrowseButton.pack(side=LEFT) - enemizerPathFrame.pack(fill=X, expand=True) + enemizerPathFrame.pack(fill=X) - leftEnemizerFrame = Frame(self) - rightEnemizerFrame = Frame(self) - leftEnemizerFrame.pack(side=LEFT, anchor=N) - rightEnemizerFrame.pack(side=RIGHT, anchor=N) + self.frames["leftEnemizerFrame"] = Frame(self) + self.frames["rightEnemizerFrame"] = Frame(self) + self.frames["leftEnemizerFrame"].pack(side=LEFT, anchor=N) + self.frames["rightEnemizerFrame"].pack(side=RIGHT, anchor=N) with open(os.path.join("resources","app","gui","randomize","enemizer","leftEnemizerFrame.json")) as leftEnemizerFrameItems: myDict = json.load(leftEnemizerFrameItems) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, leftEnemizerFrame) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["leftEnemizerFrame"]) for key in dictWidgets: self.widgets[key] = dictWidgets[key] self.widgets[key].pack(anchor=E) with open(os.path.join("resources","app","gui","randomize","enemizer","rightEnemizerFrame.json")) as rightEnemizerFrameItems: myDict = json.load(rightEnemizerFrameItems) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, rightEnemizerFrame) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["rightEnemizerFrame"]) for key in dictWidgets: self.widgets[key] = dictWidgets[key] self.widgets[key].pack(anchor=E) diff --git a/gui/randomize/entrando.py b/gui/randomize/entrando.py index 59a7152e..4f42a383 100644 --- a/gui/randomize/entrando.py +++ b/gui/randomize/entrando.py @@ -10,9 +10,14 @@ def entrando_page(parent): # Entrance Randomizer options self.widgets = {} + # Entrance Randomizer option sections + self.frames = {} + self.frames["widgets"] = Frame(self) + self.frames["widgets"].pack(anchor=W) + with open(os.path.join("resources","app","gui","randomize","entrando","widgets.json")) as myWidgets: myDict = json.load(myWidgets) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, self) + 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) diff --git a/gui/randomize/gameoptions.py b/gui/randomize/gameoptions.py index 966bc3d4..dba9751a 100644 --- a/gui/randomize/gameoptions.py +++ b/gui/randomize/gameoptions.py @@ -12,27 +12,32 @@ def gameoptions_page(top, parent): # Game Options options self.widgets = {} + # Game Options option sections + self.frames = {} + self.frames["checkboxes"] = Frame(self) + self.frames["checkboxes"].pack(anchor=W) + with open(os.path.join("resources","app","gui","randomize","gameoptions","checkboxes.json")) as checkboxes: myDict = json.load(checkboxes) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, self) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["checkboxes"]) for key in dictWidgets: self.widgets[key] = dictWidgets[key] self.widgets[key].pack(anchor=W) - leftRomOptionsFrame = Frame(self) - rightRomOptionsFrame = Frame(self) - leftRomOptionsFrame.pack(side=LEFT) - rightRomOptionsFrame.pack(side=RIGHT) + self.frames["leftRomOptionsFrame"] = Frame(self) + self.frames["rightRomOptionsFrame"] = Frame(self) + self.frames["leftRomOptionsFrame"].pack(side=LEFT) + self.frames["rightRomOptionsFrame"].pack(side=RIGHT) with open(os.path.join("resources","app","gui","randomize","gameoptions","leftRomOptionsFrame.json")) as leftRomOptionsFrameItems: myDict = json.load(leftRomOptionsFrameItems) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, leftRomOptionsFrame) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["leftRomOptionsFrame"]) for key in dictWidgets: self.widgets[key] = dictWidgets[key] self.widgets[key].pack(anchor=E) ## Sprite selection - spriteDialogFrame = Frame(leftRomOptionsFrame) + spriteDialogFrame = Frame(self.frames["leftRomOptionsFrame"]) baseSpriteLabel = Label(spriteDialogFrame, text='Sprite:') self.widgets["sprite"] = {} @@ -59,7 +64,7 @@ def gameoptions_page(top, parent): with open(os.path.join("resources","app","gui","randomize","gameoptions","rightRomOptionsFrame.json")) as rightRomOptionsFrameItems: myDict = json.load(rightRomOptionsFrameItems) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, rightRomOptionsFrame) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["rightRomOptionsFrame"]) for key in dictWidgets: self.widgets[key] = dictWidgets[key] self.widgets[key].pack(anchor=E) diff --git a/gui/randomize/generation.py b/gui/randomize/generation.py index 1f90b31e..6b81796f 100644 --- a/gui/randomize/generation.py +++ b/gui/randomize/generation.py @@ -11,15 +11,22 @@ def generation_page(parent,settings): # Generation Setup options self.widgets = {} + # Generation Setup option sections + self.frames = {} + self.frames["checkboxes"] = Frame(self) + self.frames["checkboxes"].pack(anchor=W) + with open(os.path.join("resources","app","gui","randomize","generation","checkboxes.json")) as checkboxes: myDict = json.load(checkboxes) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, self) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["checkboxes"]) for key in dictWidgets: self.widgets[key] = dictWidgets[key] self.widgets[key].pack(anchor=W) + self.frames["baserom"] = Frame(self) + self.frames["baserom"].pack(anchor=W, fill=X) ## Locate base ROM - baseRomFrame = Frame(self) + baseRomFrame = Frame(self.frames["baserom"]) baseRomLabel = Label(baseRomFrame, text='Base Rom: ') self.romVar = StringVar() def saveBaseRom(caller,_,mode): @@ -36,6 +43,6 @@ def generation_page(parent,settings): baseRomLabel.pack(side=LEFT) romEntry.pack(side=LEFT, fill=X, expand=True) romSelectButton.pack(side=LEFT) - baseRomFrame.pack(fill=X, expand=True) + baseRomFrame.pack(fill=X) return self,settings diff --git a/gui/randomize/item.py b/gui/randomize/item.py index a7e06987..57609b1d 100644 --- a/gui/randomize/item.py +++ b/gui/randomize/item.py @@ -2,7 +2,7 @@ from tkinter import ttk, IntVar, StringVar, Checkbutton, Frame, Label, OptionMen import gui.widgets as widgets import json import os - + def item_page(parent): # Item Randomizer self = ttk.Frame(parent) @@ -10,28 +10,33 @@ def item_page(parent): # Item Randomizer options self.widgets = {} + # Item Randomizer option sections + self.frames = {} + + self.frames["checkboxes"] = Frame(self) + self.frames["checkboxes"].pack(anchor=W) with open(os.path.join("resources","app","gui","randomize","item","checkboxes.json")) as checkboxes: myDict = json.load(checkboxes) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, self) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["checkboxes"]) for key in dictWidgets: self.widgets[key] = dictWidgets[key] self.widgets[key].pack(anchor=W) - leftItemFrame = Frame(self) - rightItemFrame = Frame(self) - leftItemFrame.pack(side=LEFT) - rightItemFrame.pack(side=RIGHT) + self.frames["leftItemFrame"] = Frame(self) + self.frames["rightItemFrame"] = Frame(self) + self.frames["leftItemFrame"].pack(side=LEFT) + self.frames["rightItemFrame"].pack(side=RIGHT) with open(os.path.join("resources","app","gui","randomize","item","leftItemFrame.json")) as leftItemFrameItems: myDict = json.load(leftItemFrameItems) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, leftItemFrame) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["leftItemFrame"]) for key in dictWidgets: self.widgets[key] = dictWidgets[key] self.widgets[key].pack(anchor=E) with open(os.path.join("resources","app","gui","randomize","item","rightItemFrame.json")) as rightItemFrameItems: myDict = json.load(rightItemFrameItems) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, rightItemFrame) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["rightItemFrame"]) for key in dictWidgets: self.widgets[key] = dictWidgets[key] self.widgets[key].pack(anchor=E) diff --git a/gui/randomize/multiworld.py b/gui/randomize/multiworld.py index e7808e48..646b02d1 100644 --- a/gui/randomize/multiworld.py +++ b/gui/randomize/multiworld.py @@ -10,16 +10,21 @@ def multiworld_page(parent,settings): # Multiworld options self.widgets = {} + # Multiworld option sections + self.frames = {} + self.frames["widgets"] = Frame(self) + self.frames["widgets"].pack(anchor=W, fill=X) + with open(os.path.join("resources","app","gui","randomize","multiworld","widgets.json")) as multiworldItems: myDict = json.load(multiworldItems) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, self) + dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["widgets"]) for key in dictWidgets: self.widgets[key] = dictWidgets[key] self.widgets[key].pack(side=LEFT, anchor=N) ## List of Player Names key = "names" - self.widgets[key] = Frame(self) + self.widgets[key] = Frame(self.frames["widgets"]) self.widgets[key].label = Label(self.widgets[key], text='Player names') self.widgets[key].storageVar = StringVar(value=settings["names"]) def saveMultiNames(caller,_,mode): From 6e47cd78e09ab21b96b26c37f96608eaa3b854f9 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Wed, 19 Feb 2020 03:32:01 -0800 Subject: [PATCH 092/117] Dungeon Counters option --- CLI.py | 4 +++- Main.py | 1 + Rom.py | 6 ++++-- gui/bottom.py | 3 ++- .../app/gui/randomize/dungeon/widgets.json | 20 +++++++++++++++++++ 5 files changed, 30 insertions(+), 4 deletions(-) diff --git a/CLI.py b/CLI.py index 1b836b8b..7cc7790f 100644 --- a/CLI.py +++ b/CLI.py @@ -187,6 +187,7 @@ def parse_arguments(argv, no_defaults=False): base game. ''') parser.add_argument('--experimental', default=defval(False), help='Enable experimental features', action='store_true') + parser.add_argument('--dungeon_counters', default=defval('off'), help='Enable dungeon chest counters', action='store_true') parser.add_argument('--crystals_ganon', default=defval('7'), const='7', nargs='?', choices=['random', '0', '1', '2', '3', '4', '5', '6', '7'], help='''\ How many crystals are needed to defeat ganon. Any other @@ -306,7 +307,7 @@ def parse_arguments(argv, no_defaults=False): for name in ['logic', 'mode', 'swords', 'goal', 'difficulty', 'item_functionality', 'shuffle', 'door_shuffle', 'crystals_ganon', 'crystals_gt', 'openpyramid', 'mapshuffle', 'compassshuffle', 'keyshuffle', 'bigkeyshuffle', 'startinventory', - 'retro', 'accessibility', 'hints', 'beemizer', 'experimental', + 'retro', 'accessibility', 'hints', 'beemizer', 'experimental', 'dungeon_counters', 'shufflebosses', 'shuffleenemies', 'enemy_health', 'enemy_damage', 'shufflepots', 'ow_palettes', 'uw_palettes', 'sprite', 'disablemusic', 'quickswap', 'fastmenu', 'heartcolor', 'heartbeep', 'remote_items']: @@ -340,6 +341,7 @@ def get_settings(): "shuffle": "vanilla", "door_shuffle": "basic", "experimental": 0, + "dungeon_counters": "off", "heartbeep": "normal", "heartcolor": "red", "fastmenu": "normal", diff --git a/Main.py b/Main.py index 2d96507d..598a52eb 100644 --- a/Main.py +++ b/Main.py @@ -57,6 +57,7 @@ def main(args, seed=None): world.enemy_damage = args.enemy_damage.copy() world.beemizer = args.beemizer.copy() world.experimental = args.experimental.copy() + world.dungeon_counters = args.dungeon_counters.copy() world.rom_seeds = {player: random.randint(0, 999999999) for player in range(1, world.players + 1)} diff --git a/Rom.py b/Rom.py index 2968d9d7..af008223 100644 --- a/Rom.py +++ b/Rom.py @@ -1155,9 +1155,11 @@ def patch_rom(world, rom, player, team, enemized): rom.write_byte(0x18003B, 0x01 if world.mapshuffle[player] else 0x00) # maps showing crystals on overworld # compasses showing dungeon count - if world.clock_mode != 'off': + if world.clock_mode != 'off' or world.dungeon_counters[player] == 'off': rom.write_byte(0x18003C, 0x00) # Currently must be off if timer is on, because they use same HUD location - elif world.compassshuffle[player] or world.doorShuffle[player] != 'vanilla': + elif world.dungeon_counters[player] == 'on': + rom.write_byte(0x18003C, 0x02) # always on + elif world.compassshuffle[player] or world.doorShuffle[player] != 'vanilla' or world.dungeon_counters[player] == 'pickup': rom.write_byte(0x18003C, 0x01) # show on pickup else: rom.write_byte(0x18003C, 0x00) diff --git a/gui/bottom.py b/gui/bottom.py index 503cb193..7385b559 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -126,7 +126,8 @@ def create_guiargs(parent): "smallkeyshuffle": "keyshuffle", "bigkeyshuffle": "bigkeyshuffle", "dungeondoorshuffle": "door_shuffle", - "experimental": "experimental" + "experimental": "experimental", + "dungeon_counters": "dungeon_counters" }, "multiworld": { "names": "names" diff --git a/resources/app/gui/randomize/dungeon/widgets.json b/resources/app/gui/randomize/dungeon/widgets.json index 023eadda..e58aa1ea 100644 --- a/resources/app/gui/randomize/dungeon/widgets.json +++ b/resources/app/gui/randomize/dungeon/widgets.json @@ -24,5 +24,25 @@ "label": { "text": "Enable Experimental Features" } + }, + "dungeon_counters": { + "type": "selectbox", + "label": { + "text": "Dungeon Chest Counters" + }, + "packAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + }, + "default": "Off" + }, + "options": { + "Off": "off", + "On": "on", + "On Compass Pickup": "pickup" + } } } From d82c4c9d701a21cb21711af9fabc7be699eb64c3 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Wed, 19 Feb 2020 03:53:45 -0800 Subject: [PATCH 093/117] Fix some stuff --- CLI.py | 4 ++-- resources/app/gui/randomize/dungeon/keysanity.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CLI.py b/CLI.py index 7cc7790f..92aad739 100644 --- a/CLI.py +++ b/CLI.py @@ -209,8 +209,8 @@ def parse_arguments(argv, no_defaults=False): ''', action='store_true') parser.add_argument('--rom', default=defval(settings["rom"]), help='Path to an ALttP JAP(1.0) rom to use as a base.') parser.add_argument('--loglevel', default=defval('info'), const='info', nargs='?', choices=['error', 'info', 'warning', 'debug'], help='Select level of logging for output.') - parser.add_argument('--seed', default=defval(int(settings["seed"]) if settings["seed"] is not "" and settings["seed"] is not None else None), help='Define seed number to generate.', type=int) - parser.add_argument('--count', default=defval(int(settings["count"]) if settings["count"] is not "" and settings["count"] is not None else 1), help='''\ + parser.add_argument('--seed', default=defval(int(settings["seed"]) if settings["seed"] != "" and settings["seed"] is not None else None), help='Define seed number to generate.', type=int) + parser.add_argument('--count', default=defval(int(settings["count"]) if settings["count"] != "" and settings["count"] is not None else 1), help='''\ Use to batch generate multiple seeds with same settings. If --seed is provided, it will be used for the first seed, then used to derive the next seed (i.e. generating 10 seeds with diff --git a/resources/app/gui/randomize/dungeon/keysanity.json b/resources/app/gui/randomize/dungeon/keysanity.json index cb680c60..1be4c3fd 100644 --- a/resources/app/gui/randomize/dungeon/keysanity.json +++ b/resources/app/gui/randomize/dungeon/keysanity.json @@ -20,7 +20,7 @@ "bigkeyshuffle": { "type": "checkbox", "label": { - "text": "Small Keys" + "text": "Big Keys" } } } From dbaaef662a1b8646c272558afe8fc80761911400 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Thu, 20 Feb 2020 01:04:53 -0800 Subject: [PATCH 094/117] Fix a bunch of stuff Defaults from settings file, then CLI, then canned defaults Fix Adjust settings Fix Custom Item Array settings Create error message for Enemizer Not Found --- CLI.py | 93 +++++++++++++++++++------------------ Main.py | 10 ++-- gui/bottom.py | 15 ++++++ gui/custom/overview.py | 4 ++ gui/randomize/enemizer.py | 3 -- gui/randomize/generation.py | 3 -- 6 files changed, 75 insertions(+), 53 deletions(-) diff --git a/CLI.py b/CLI.py index 92aad739..517e0949 100644 --- a/CLI.py +++ b/CLI.py @@ -28,12 +28,12 @@ def parse_arguments(argv, no_defaults=False): # we need to know how many players we have first parser = argparse.ArgumentParser(add_help=False) - parser.add_argument('--multi', default=defval(1), type=lambda value: min(max(int(value), 1), 255)) + parser.add_argument('--multi', default=defval(settings["multi"]), type=lambda value: min(max(int(value), 1), 255)) multiargs, _ = parser.parse_known_args(argv) parser = argparse.ArgumentParser(formatter_class=ArgumentDefaultsHelpFormatter) parser.add_argument('--create_spoiler', help='Output a Spoiler File', action='store_true') - parser.add_argument('--logic', default=defval('noglitches'), const='noglitches', nargs='?', choices=['noglitches', 'minorglitches', 'nologic'], + parser.add_argument('--logic', default=defval(settings["logic"]), const='noglitches', nargs='?', choices=['noglitches', 'minorglitches', 'nologic'], help='''\ Select Enforcement of Item Requirements. (default: %(default)s) No Glitches: @@ -42,7 +42,7 @@ def parse_arguments(argv, no_defaults=False): No Logic: Distribute items without regard for item requirements. ''') - parser.add_argument('--mode', default=defval('open'), const='open', nargs='?', choices=['standard', 'open', 'inverted'], + parser.add_argument('--mode', default=defval(settings["mode"]), const='open', nargs='?', choices=['standard', 'open', 'inverted'], help='''\ Select game mode. (default: %(default)s) Open: World starts with Zelda rescued. @@ -55,7 +55,7 @@ def parse_arguments(argv, no_defaults=False): Requires the moon pearl to be Link in the Light World instead of a bunny. ''') - parser.add_argument('--swords', default=defval('random'), const='random', nargs='?', choices= ['random', 'assured', 'swordless', 'vanilla'], + parser.add_argument('--swords', default=defval(settings["swords"]), const='random', nargs='?', choices= ['random', 'assured', 'swordless', 'vanilla'], help='''\ Select sword placement. (default: %(default)s) Random: All swords placed randomly. @@ -69,7 +69,7 @@ def parse_arguments(argv, no_defaults=False): Palace, to allow for an alternative to firerod. Vanilla: Swords are in vanilla locations. ''') - parser.add_argument('--goal', default=defval('ganon'), const='ganon', nargs='?', choices=['ganon', 'pedestal', 'dungeons', 'triforcehunt', 'crystals'], + parser.add_argument('--goal', default=defval(settings["goal"]), const='ganon', nargs='?', choices=['ganon', 'pedestal', 'dungeons', 'triforcehunt', 'crystals'], help='''\ Select completion goal. (default: %(default)s) Ganon: Collect all crystals, beat Agahnim 2 then @@ -81,21 +81,21 @@ def parse_arguments(argv, no_defaults=False): Triforce Hunt: Places 30 Triforce Pieces in the world, collect 20 of them to beat the game. ''') - parser.add_argument('--difficulty', default=defval('normal'), const='normal', nargs='?', choices=['normal', 'hard', 'expert'], + parser.add_argument('--difficulty', default=defval(settings["difficulty"]), const='normal', nargs='?', choices=['normal', 'hard', 'expert'], help='''\ Select game difficulty. Affects available itempool. (default: %(default)s) Normal: Normal difficulty. Hard: A harder setting with less equipment and reduced health. Expert: A harder yet setting with minimum equipment and health. ''') - parser.add_argument('--item_functionality', default=defval('normal'), const='normal', nargs='?', choices=['normal', 'hard', 'expert'], + parser.add_argument('--item_functionality', default=defval(settings["item_functionality"]), const='normal', nargs='?', choices=['normal', 'hard', 'expert'], help='''\ Select limits on item functionality to increase difficulty. (default: %(default)s) Normal: Normal functionality. Hard: Reduced functionality. Expert: Greatly reduced functionality. ''') - parser.add_argument('--timer', default=defval('none'), const='normal', nargs='?', choices=['none', 'display', 'timed', 'timed-ohko', 'ohko', 'timed-countdown'], + parser.add_argument('--timer', default=defval(settings["timer"]), const='normal', nargs='?', choices=['none', 'display', 'timed', 'timed-ohko', 'ohko', 'timed-countdown'], help='''\ Select game timer setting. Affects available itempool. (default: %(default)s) None: No timer. @@ -115,7 +115,7 @@ def parse_arguments(argv, no_defaults=False): Timed mode. If time runs out, you lose (but can still keep playing). ''') - parser.add_argument('--progressive', default=defval('on'), const='normal', nargs='?', choices=['on', 'off', 'random'], + parser.add_argument('--progressive', default=defval(settings["progressive"]), const='normal', nargs='?', choices=['on', 'off', 'random'], help='''\ Select progressive equipment setting. Affects available itempool. (default: %(default)s) On: Swords, Shields, Armor, and Gloves will @@ -129,7 +129,7 @@ def parse_arguments(argv, no_defaults=False): category, be randomly progressive or not. Link will die in one hit. ''') - parser.add_argument('--algorithm', default=defval('balanced'), const='balanced', nargs='?', choices=['freshness', 'flood', 'vt21', 'vt22', 'vt25', 'vt26', 'balanced'], + parser.add_argument('--algorithm', default=defval(settings["algorithm"]), const='balanced', nargs='?', choices=['freshness', 'flood', 'vt21', 'vt22', 'vt25', 'vt26', 'balanced'], help='''\ Select item filling algorithm. (default: %(default)s balanced: vt26 derivative that aims to strike a balance between @@ -152,7 +152,7 @@ def parse_arguments(argv, no_defaults=False): slightly biased to placing progression items with less restrictions. ''') - parser.add_argument('--shuffle', default=defval('vanilla'), const='full', nargs='?', choices=['vanilla', 'simple', 'restricted', 'full', 'crossed', 'insanity', 'restricted_legacy', 'full_legacy', 'madness_legacy', 'insanity_legacy', 'dungeonsfull', 'dungeonssimple'], + parser.add_argument('--shuffle', default=defval(settings["shuffle"]), const='full', nargs='?', choices=['vanilla', 'simple', 'restricted', 'full', 'crossed', 'insanity', 'restricted_legacy', 'full_legacy', 'madness_legacy', 'insanity_legacy', 'dungeonsfull', 'dungeonssimple'], help='''\ Select Entrance Shuffling Algorithm. (default: %(default)s) Full: Mix cave and dungeon entrances freely while limiting @@ -176,7 +176,7 @@ def parse_arguments(argv, no_defaults=False): The dungeon variants only mix up dungeons and keep the rest of the overworld vanilla. ''') - parser.add_argument('--door_shuffle', default=defval('basic'), const='vanilla', nargs='?', choices=['vanilla', 'basic', 'crossed'], + parser.add_argument('--door_shuffle', default=defval(settings["door_shuffle"]), const='vanilla', nargs='?', choices=['vanilla', 'basic', 'crossed'], help='''\ Select Door Shuffling Algorithm. (default: %(default)s) Basic: Doors are mixed within a single dungeon. @@ -186,9 +186,9 @@ def parse_arguments(argv, no_defaults=False): Vanilla: All doors are connected the same way they were in the base game. ''') - parser.add_argument('--experimental', default=defval(False), help='Enable experimental features', action='store_true') - parser.add_argument('--dungeon_counters', default=defval('off'), help='Enable dungeon chest counters', action='store_true') - parser.add_argument('--crystals_ganon', default=defval('7'), const='7', nargs='?', choices=['random', '0', '1', '2', '3', '4', '5', '6', '7'], + parser.add_argument('--experimental', default=defval(settings["experimental"] != 0), help='Enable experimental features', action='store_true') + parser.add_argument('--dungeon_counters', default=defval(settings["dungeon_counters"]), help='Enable dungeon chest counters', action='store_true') + parser.add_argument('--crystals_ganon', default=defval(settings["crystals_ganon"]), const='7', nargs='?', choices=['random', '0', '1', '2', '3', '4', '5', '6', '7'], help='''\ How many crystals are needed to defeat ganon. Any other requirements for ganon for the selected goal still apply. @@ -197,14 +197,14 @@ def parse_arguments(argv, no_defaults=False): Random: Picks a random value between 0 and 7 (inclusive). 0-7: Number of crystals needed ''') - parser.add_argument('--crystals_gt', default=defval('7'), const='7', nargs='?', choices=['random', '0', '1', '2', '3', '4', '5', '6', '7'], + parser.add_argument('--crystals_gt', default=defval(settings["crystals_gt"]), const='7', nargs='?', choices=['random', '0', '1', '2', '3', '4', '5', '6', '7'], help='''\ How many crystals are needed to open GT. For inverted mode this applies to the castle tower door instead. (default: %(default)s) Random: Picks a random value between 0 and 7 (inclusive). 0-7: Number of crystals needed ''') - parser.add_argument('--openpyramid', default=defval(False), help='''\ + parser.add_argument('--openpyramid', default=defval(settings["openpyramid"] != 0), help='''\ Pre-opens the pyramid hole, this removes the Agahnim 2 requirement for it ''', action='store_true') parser.add_argument('--rom', default=defval(settings["rom"]), help='Path to an ALttP JAP(1.0) rom to use as a base.') @@ -217,33 +217,33 @@ def parse_arguments(argv, no_defaults=False): --seed given will produce the same 10 (different) roms each time). ''', type=int) - parser.add_argument('--fastmenu', default=defval('normal'), const='normal', nargs='?', choices=['normal', 'instant', 'double', 'triple', 'quadruple', 'half'], + parser.add_argument('--fastmenu', default=defval(settings["fastmenu"]), const='normal', nargs='?', choices=['normal', 'instant', 'double', 'triple', 'quadruple', 'half'], help='''\ Select the rate at which the menu opens and closes. (default: %(default)s) ''') - parser.add_argument('--quickswap', default=defval(False), help='Enable quick item swapping with L and R.', action='store_true') - parser.add_argument('--disablemusic', default=defval(False), help='Disables game music.', action='store_true') - parser.add_argument('--mapshuffle', default=defval(False), help='Maps are no longer restricted to their dungeons, but can be anywhere', action='store_true') - parser.add_argument('--compassshuffle', default=defval(False), help='Compasses are no longer restricted to their dungeons, but can be anywhere', action='store_true') - parser.add_argument('--keyshuffle', default=defval(False), help='Small Keys are no longer restricted to their dungeons, but can be anywhere', action='store_true') - parser.add_argument('--bigkeyshuffle', default=defval(False), help='Big Keys are no longer restricted to their dungeons, but can be anywhere', action='store_true') - parser.add_argument('--keysanity', default=defval(False), help=argparse.SUPPRESS, action='store_true') - parser.add_argument('--retro', default=defval(False), help='''\ + parser.add_argument('--quickswap', default=defval(settings["quickswap"] != 0), help='Enable quick item swapping with L and R.', action='store_true') + parser.add_argument('--disablemusic', default=defval(settings["disablemusic"] != 0), help='Disables game music.', action='store_true') + parser.add_argument('--mapshuffle', default=defval(settings["mapshuffle"] != 0), help='Maps are no longer restricted to their dungeons, but can be anywhere', action='store_true') + parser.add_argument('--compassshuffle', default=defval(settings["compassshuffle"] != 0), help='Compasses are no longer restricted to their dungeons, but can be anywhere', action='store_true') + parser.add_argument('--keyshuffle', default=defval(settings["keyshuffle"] != 0), help='Small Keys are no longer restricted to their dungeons, but can be anywhere', action='store_true') + parser.add_argument('--bigkeyshuffle', default=defval(settings["bigkeyshuffle"] != 0), help='Big Keys are no longer restricted to their dungeons, but can be anywhere', action='store_true') + parser.add_argument('--keysanity', default=defval(settings["keysanity"] != 0), help=argparse.SUPPRESS, action='store_true') + parser.add_argument('--retro', default=defval(settings["retro"] != 0), help='''\ Keys are universal, shooting arrows costs rupees, and a few other little things make this more like Zelda-1. ''', action='store_true') - parser.add_argument('--startinventory', default=defval(''), help='Specifies a list of items that will be in your starting inventory (separated by commas)') - parser.add_argument('--custom', default=defval(False), help='Not supported.') - parser.add_argument('--customitemarray', default=defval(False), help='Not supported.') - parser.add_argument('--accessibility', default=defval('items'), const='items', nargs='?', choices=['items', 'locations', 'none'], help='''\ + parser.add_argument('--startinventory', default=defval(settings["startinventory"]), help='Specifies a list of items that will be in your starting inventory (separated by commas)') + parser.add_argument('--custom', default=defval(settings["custom"] != 0), help='Not supported.') + parser.add_argument('--customitemarray', default=defval(settings["customitemarray"] != 0), help='Not supported.') + parser.add_argument('--accessibility', default=defval(settings["accessibility"]), const='items', nargs='?', choices=['items', 'locations', 'none'], help='''\ Select Item/Location Accessibility. (default: %(default)s) Items: You can reach all unique inventory items. No guarantees about reaching all locations or all keys. Locations: You will be able to reach every location in the game. None: You will be able to reach enough locations to beat the game. ''') - parser.add_argument('--hints', default=defval(False), help='''\ + parser.add_argument('--hints', default=defval(settings["hints"] != 0), help='''\ Make telepathic tiles and storytellers give helpful hints. ''', action='store_true') # included for backwards compatibility @@ -252,15 +252,15 @@ def parse_arguments(argv, no_defaults=False): If set, the Pyramid Hole and Ganon's Tower are not included entrance shuffle pool. ''', action='store_false', dest='shuffleganon') - parser.add_argument('--heartbeep', default=defval('normal'), const='normal', nargs='?', choices=['double', 'normal', 'half', 'quarter', 'off'], + parser.add_argument('--heartbeep', default=defval(settings["heartbeep"]), const='normal', nargs='?', choices=['double', 'normal', 'half', 'quarter', 'off'], help='''\ Select the rate at which the heart beep sound is played at low health. (default: %(default)s) ''') - parser.add_argument('--heartcolor', default=defval('red'), const='red', nargs='?', choices=['red', 'blue', 'green', 'yellow', 'random'], + parser.add_argument('--heartcolor', default=defval(settings["heartcolor"]), const='red', nargs='?', choices=['red', 'blue', 'green', 'yellow', 'random'], help='Select the color of Link\'s heart meter. (default: %(default)s)') - parser.add_argument('--ow_palettes', default=defval('default'), choices=['default', 'random', 'blackout']) - parser.add_argument('--uw_palettes', default=defval('default'), choices=['default', 'random', 'blackout']) + parser.add_argument('--ow_palettes', default=defval(settings["ow_palettes"]), choices=['default', 'random', 'blackout']) + parser.add_argument('--uw_palettes', default=defval(settings["uw_palettes"]), choices=['default', 'random', 'blackout']) parser.add_argument('--sprite', help='''\ Path to a sprite sheet to use for Link. Needs to be in binary format and have a length of 0x7000 (28672) bytes, @@ -274,20 +274,20 @@ def parse_arguments(argv, no_defaults=False): Output .json patch to stdout instead of a patched rom. Used for VT site integration, do not use otherwise. ''') - parser.add_argument('--skip_playthrough', action='store_true', default=defval(False)) + parser.add_argument('--skip_playthrough', action='store_true', default=defval(settings["skip_playthrough"] != 0)) parser.add_argument('--enemizercli', default=defval(settings["enemizercli"])) - parser.add_argument('--shufflebosses', default=defval('none'), choices=['none', 'basic', 'normal', 'chaos']) - parser.add_argument('--shuffleenemies', default=defval('none'), choices=['none', 'shuffled', 'chaos']) - parser.add_argument('--enemy_health', default=defval('default'), choices=['default', 'easy', 'normal', 'hard', 'expert']) - parser.add_argument('--enemy_damage', default=defval('default'), choices=['default', 'shuffled', 'chaos']) - parser.add_argument('--shufflepots', default=defval(False), action='store_true') - parser.add_argument('--beemizer', default=defval(0), type=lambda value: min(max(int(value), 0), 4)) - parser.add_argument('--remote_items', default=defval(False), action='store_true') + parser.add_argument('--shufflebosses', default=defval(settings["shufflebosses"]), choices=['none', 'basic', 'normal', 'chaos']) + parser.add_argument('--shuffleenemies', default=defval(settings["shuffleenemies"]), choices=['none', 'shuffled', 'chaos']) + parser.add_argument('--enemy_health', default=defval(settings["enemy_health"]), choices=['default', 'easy', 'normal', 'hard', 'expert']) + parser.add_argument('--enemy_damage', default=defval(settings["enemy_damage"]), choices=['default', 'shuffled', 'chaos']) + parser.add_argument('--shufflepots', default=defval(settings["shufflepots"] != 0), action='store_true') + parser.add_argument('--beemizer', default=defval(settings["beemizer"]), type=lambda value: min(max(int(value), 0), 4)) + parser.add_argument('--remote_items', default=defval(settings["remote_items"] != 0), action='store_true') parser.add_argument('--multi', default=defval(settings["multi"]), type=lambda value: min(max(int(value), 1), 255)) parser.add_argument('--names', default=defval(settings["names"])) parser.add_argument('--teams', default=defval(1), type=lambda value: max(int(value), 1)) parser.add_argument('--outputpath', default=defval(settings["outputpath"])) - parser.add_argument('--race', default=defval(False), action='store_true') + parser.add_argument('--race', default=defval(settings["race"] != 0), action='store_true') parser.add_argument('--outputname') if multiargs.multi: @@ -353,7 +353,9 @@ def get_settings(): "compassshuffle": False, "keyshuffle": False, "bigkeyshuffle": False, + "keysanity": False, "retro": False, + "startinventory": "", "quickswap": False, "disablemusic": False, "ow_palettes": "default", @@ -366,6 +368,9 @@ def get_settings(): "enemy_health": "default", "enemy_damage": "default", "shufflepots": False, + "beemizer": 0, + "remote_items": False, + "race": False, "custom": False, "customitemarray": [ 0, diff --git a/Main.py b/Main.py index b69cd7d8..edb3223d 100644 --- a/Main.py +++ b/Main.py @@ -180,9 +180,13 @@ def main(args, seed=None): patch_rom(world, rom, player, team, use_enemizer) if use_enemizer and (args.enemizercli or not args.jsonout): - patch_enemizer(world, player, rom, args.rom, args.enemizercli, args.shufflepots[player], sprite_random_on_hit) - if not args.jsonout: - rom = LocalRom.fromJsonRom(rom, args.rom, 0x400000) + if os.path.exists(args.enemizercli): + patch_enemizer(world, player, rom, args.rom, args.enemizercli, args.shufflepots[player], sprite_random_on_hit) + if not args.jsonout: + rom = LocalRom.fromJsonRom(rom, args.rom, 0x400000) + else: + logging.warning("EnemizerCLI not found at:" + args.enemizercli) + logging.warning("No Enemizer options will be applied until this is resolved.") if args.race: patch_race_rom(rom) diff --git a/gui/bottom.py b/gui/bottom.py index 7385b559..fdd0c1d6 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -154,6 +154,8 @@ def create_guiargs(parent): arg = options[mainpage][subpage][widget] setattr(guiargs, arg, parent.pages[mainpage].pages[subpage].widgets[widget].storageVar.get()) + guiargs.enemizercli = parent.pages["randomizer"].pages["enemizer"].enemizerCLIpathVar.get() + guiargs.multi = int(parent.pages["randomizer"].pages["multiworld"].widgets["worlds"].storageVar.get()) guiargs.rom = parent.pages["randomizer"].pages["generation"].romVar.get() @@ -162,6 +164,19 @@ def create_guiargs(parent): guiargs.seed = int(parent.frames["bottom"].seedVar.get()) if parent.frames["bottom"].seedVar.get() else None guiargs.count = int(parent.frames["bottom"].widgets["generationcount"].storageVar.get()) if parent.frames["bottom"].widgets["generationcount"].storageVar.get() != '1' else None + adjustargs = { + "nobgm": "disablemusic", + "quickswap": "quickswap", + "heartcolor": "heartcolor", + "heartbeep": "heartbeep", + "menuspeed": "fastmenu", + "owpalettes": "ow_palettes", + "uwpalettes": "uw_palettes" + } + for adjustarg in adjustargs: + internal = adjustargs[adjustarg] + setattr(guiargs,"adjust." + internal, parent.pages["adjust"].content.widgets[adjustarg].storageVar.get()) + customitems = [ "bow", "silversupgrade", "boomerang", "redmerang", "hookshot", "mushroom", "powder", "firerod", "icerod", "bombos", "ether", "quake", "lamp", "hammer", "shovel", "flute", "bugnet", diff --git a/gui/custom/overview.py b/gui/custom/overview.py index 2ce95459..ac4d3e44 100644 --- a/gui/custom/overview.py +++ b/gui/custom/overview.py @@ -65,4 +65,8 @@ def custom_page(top,parent): self.customWidgets[key] = dictWidgets[key] self.customWidgets[key].pack() + keys = list(self.customWidgets.keys()) + for i in range(0, len(keys)): + self.customWidgets[keys[i]].storageVar.set(top.settings["customitemarray"][i]) + return self diff --git a/gui/randomize/enemizer.py b/gui/randomize/enemizer.py index 08179078..73990baa 100644 --- a/gui/randomize/enemizer.py +++ b/gui/randomize/enemizer.py @@ -29,9 +29,6 @@ def enemizer_page(parent,settings): enemizerCLIlabel = Label(enemizerPathFrame, text="EnemizerCLI path: ") enemizerCLIlabel.pack(side=LEFT) self.enemizerCLIpathVar = StringVar(value=settings["enemizercli"]) - def saveEnemizerPath(caller,_,mode): - settings["enemizercli"] = self.enemizerCLIpathVar.get() - self.enemizerCLIpathVar.trace_add("write",saveEnemizerPath) enemizerCLIpathEntry = Entry(enemizerPathFrame, textvariable=self.enemizerCLIpathVar) enemizerCLIpathEntry.pack(side=LEFT, fill=X, expand=True) def EnemizerSelectPath(): diff --git a/gui/randomize/generation.py b/gui/randomize/generation.py index 6b81796f..d5f5ce1c 100644 --- a/gui/randomize/generation.py +++ b/gui/randomize/generation.py @@ -29,9 +29,6 @@ def generation_page(parent,settings): baseRomFrame = Frame(self.frames["baserom"]) baseRomLabel = Label(baseRomFrame, text='Base Rom: ') self.romVar = StringVar() - def saveBaseRom(caller,_,mode): - settings["rom"] = self.romVar.get() - self.romVar.trace_add("write",saveBaseRom) romEntry = Entry(baseRomFrame, textvariable=self.romVar) self.romVar.set(settings["rom"]) From 6c9fdcd203a98d8c1c12a13116761a969357fce0 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Fri, 21 Feb 2020 23:47:29 -0800 Subject: [PATCH 095/117] Update Widgets to be able to use grid --- CLI.py | 2 +- gui/bottom.py | 1 + gui/custom/overview.py | 36 ++-- gui/widgets.py | 97 +++++----- .../gui/adjust/overview/leftAdjustFrame.json | 4 +- .../gui/adjust/overview/rightAdjustFrame.json | 6 +- .../app/gui/custom/overview/itemList1.json | 154 +++++----------- .../app/gui/custom/overview/itemList2.json | 156 +++++----------- .../app/gui/custom/overview/itemList3.json | 168 ++++++------------ .../app/gui/custom/overview/itemList4.json | 157 +++++----------- .../app/gui/custom/overview/itemList5.json | 109 ++++-------- .../app/gui/randomize/dungeon/widgets.json | 4 +- .../randomize/enemizer/leftEnemizerFrame.json | 4 +- .../enemizer/rightEnemizerFrame.json | 4 +- .../app/gui/randomize/entrando/widgets.json | 2 +- .../gui/randomize/gameoptions/checkboxes.json | 3 +- .../gameoptions/leftRomOptionsFrame.json | 4 +- .../gameoptions/rightRomOptionsFrame.json | 6 +- .../app/gui/randomize/item/leftItemFrame.json | 12 +- .../gui/randomize/item/rightItemFrame.json | 12 +- .../app/gui/randomize/multiworld/widgets.json | 2 +- 21 files changed, 341 insertions(+), 602 deletions(-) diff --git a/CLI.py b/CLI.py index 517e0949..980a7bb7 100644 --- a/CLI.py +++ b/CLI.py @@ -361,7 +361,7 @@ def get_settings(): "ow_palettes": "default", "uw_palettes": "default", "shuffleganon": True, - "hints": False, + "hints": True, "enemizercli": os.path.join(".","EnemizerCLI","EnemizerCLI.Core"), "shufflebosses": "none", "shuffleenemies": "none", diff --git a/gui/bottom.py b/gui/bottom.py index fdd0c1d6..eafa9ebb 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -38,6 +38,7 @@ def bottom_frame(self, parent, args=None): self, "Count", None, + None, {"label": {"side": LEFT}, "spinbox": {"side": RIGHT}} ) self.widgets[key].pack(side=LEFT) diff --git a/gui/custom/overview.py b/gui/custom/overview.py index ac4d3e44..9d366405 100644 --- a/gui/custom/overview.py +++ b/gui/custom/overview.py @@ -1,4 +1,4 @@ -from tkinter import ttk, StringVar, Entry, Frame, Label, N, E, W, LEFT, RIGHT, X +from tkinter import ttk, StringVar, Entry, Frame, Label, N, E, W, LEFT, RIGHT, X, VERTICAL, Y import gui.widgets as widgets import json import os @@ -7,6 +7,16 @@ def custom_page(top,parent): # Custom Item Pool self = ttk.Frame(parent) + 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 + + def create_vertical_rule(num=1): + for i in range(0,num): + ttk.Separator(self, orient=VERTICAL).pack(side=LEFT, anchor=N, fill=Y) + def validation(P): if str.isdigit(P) or P == "": return True @@ -19,51 +29,45 @@ def custom_page(top,parent): # Custom Item Pool option sections self.frames = {} - self.frames["itemList1"] = Frame(self) - self.frames["itemList1"].pack(side=LEFT, padx=(0,0), anchor=N) - self.frames["itemList2"] = Frame(self) - self.frames["itemList2"].pack(side=LEFT, padx=(0,0), anchor=N) - self.frames["itemList3"] = Frame(self) - self.frames["itemList3"].pack(side=LEFT, padx=(0,0), anchor=N) - self.frames["itemList4"] = Frame(self) - self.frames["itemList4"].pack(side=LEFT, padx=(0,0), anchor=N) - self.frames["itemList5"] = Frame(self) - self.frames["itemList5"].pack(side=LEFT, padx=(0,0), anchor=N) + create_list_frame(self,"itemList1") + create_vertical_rule(2) + create_list_frame(self,"itemList2") + create_vertical_rule(2) + create_list_frame(self,"itemList3") + create_vertical_rule(2) + create_list_frame(self,"itemList4") + create_vertical_rule(2) + create_list_frame(self,"itemList5") with open(os.path.join("resources","app","gui","custom","overview","itemList1.json")) as items: myDict = json.load(items) dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["itemList1"]) for key in dictWidgets: self.customWidgets[key] = dictWidgets[key] - self.customWidgets[key].pack() with open(os.path.join("resources","app","gui","custom","overview","itemList2.json")) as items: myDict = json.load(items) dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["itemList2"]) for key in dictWidgets: self.customWidgets[key] = dictWidgets[key] - self.customWidgets[key].pack() with open(os.path.join("resources","app","gui","custom","overview","itemList3.json")) as items: myDict = json.load(items) dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["itemList3"]) for key in dictWidgets: self.customWidgets[key] = dictWidgets[key] - self.customWidgets[key].pack() with open(os.path.join("resources","app","gui","custom","overview","itemList4.json")) as items: myDict = json.load(items) dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["itemList4"]) for key in dictWidgets: self.customWidgets[key] = dictWidgets[key] - self.customWidgets[key].pack() with open(os.path.join("resources","app","gui","custom","overview","itemList5.json")) as items: myDict = json.load(items) dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["itemList5"]) for key in dictWidgets: self.customWidgets[key] = dictWidgets[key] - self.customWidgets[key].pack() keys = list(self.customWidgets.keys()) for i in range(0, len(keys)): diff --git a/gui/widgets.py b/gui/widgets.py index c943fa42..3b6925d3 100644 --- a/gui/widgets.py +++ b/gui/widgets.py @@ -1,4 +1,7 @@ -from tkinter import Checkbutton, Entry, Frame, IntVar, Label, OptionMenu, Spinbox, StringVar, RIGHT +from tkinter import Checkbutton, Entry, Frame, IntVar, Label, OptionMenu, Spinbox, StringVar, RIGHT, X + +class Empty(): + pass class mySpinbox(Spinbox): def __init__(self, *args, **kwargs): @@ -13,17 +16,17 @@ class mySpinbox(Spinbox): elif event.num == 4 or event.delta == 120: self.invoke('buttonup') -def make_checkbox(self, parent, label, storageVar, packAttrs): +def make_checkbox(self, parent, label, storageVar, manager, managerAttrs): self = Frame(parent, name="checkframe-" + label.lower()) self.storageVar = storageVar self.checkbox = Checkbutton(self, text=label, variable=self.storageVar, name="checkbox-" + label.lower()) - if packAttrs is not None: - self.checkbox.pack(packAttrs) + if managerAttrs is not None: + self.checkbox.pack(managerAttrs) else: self.checkbox.pack() return self -def make_selectbox(self, parent, label, options, storageVar, packAttrs): +def make_selectbox(self, parent, label, options, storageVar, manager, managerAttrs): def change_storage(*args): self.storageVar.set(options[self.labelVar.get()]) def change_selected(*args): @@ -38,61 +41,68 @@ def make_selectbox(self, parent, label, options, storageVar, packAttrs): self.labelVar = StringVar() self.labelVar.trace_add("write",change_storage) self.label = Label(self, text=label) - if packAttrs is not None and "label" in packAttrs: - self.label.pack(packAttrs["label"]) + if managerAttrs is not None and "label" in managerAttrs: + self.label.pack(managerAttrs["label"]) else: self.label.pack() self.selectbox = OptionMenu(self, self.labelVar, *options.keys()) self.selectbox.config(width=20) - self.labelVar.set(packAttrs["default"] if "default" in packAttrs else list(options.keys())[0]) - if packAttrs is not None and "selectbox" in packAttrs: - self.selectbox.pack(packAttrs["selectbox"]) + self.labelVar.set(managerAttrs["default"] if "default" in managerAttrs else list(options.keys())[0]) + if managerAttrs is not None and "selectbox" in managerAttrs: + self.selectbox.pack(managerAttrs["selectbox"]) else: self.selectbox.pack() return self -def make_spinbox(self, parent, label, storageVar, packAttrs): +def make_spinbox(self, parent, label, storageVar, manager, managerAttrs): self = Frame(parent, name="spinframe-" + label.lower()) self.storageVar = storageVar self.label = Label(self, text=label) - if packAttrs is not None and "label" in packAttrs: - self.label.pack(packAttrs["label"]) + if managerAttrs is not None and "label" in managerAttrs: + self.label.pack(managerAttrs["label"]) else: self.label.pack() fromNum = 1 toNum = 100 - if "spinbox" in packAttrs: - if "from" in packAttrs: - fromNum = packAttrs["spinbox"]["from"] - if "to" in packAttrs: - toNum = packAttrs["spinbox"]["to"] + if "spinbox" in managerAttrs: + if "from" in managerAttrs: + fromNum = managerAttrs["spinbox"]["from"] + if "to" in managerAttrs: + toNum = managerAttrs["spinbox"]["to"] self.spinbox = mySpinbox(self, from_=fromNum, to=toNum, width=5, textvariable=self.storageVar, name="spinbox-" + label.lower()) - if packAttrs is not None and "spinbox" in packAttrs: - self.spinbox.pack(packAttrs["spinbox"]) + if managerAttrs is not None and "spinbox" in managerAttrs: + self.spinbox.pack(managerAttrs["spinbox"]) else: self.spinbox.pack() return self -def make_textbox(self, parent, label, storageVar, packAttrs): - self = Frame(parent) - self.storageVar = storageVar - self.label = Label(self, text=label) - if packAttrs is not None and "label" in packAttrs: - self.label.pack(packAttrs["label"]) - else: - self.label.pack() - self.textbox = Entry(self, justify=RIGHT, textvariable=self.storageVar, width=3) - if "default" in packAttrs: - self.storageVar.set(packAttrs["default"]) - if packAttrs is not None and "textbox" in packAttrs: - self.textbox.pack(packAttrs["textbox"]) - else: - self.textbox.pack() - return self +def make_textbox(self, parent, label, storageVar, manager, managerAttrs): + widget = Empty() + widget.storageVar = storageVar + widget.label = Label(parent, text=label) + widget.textbox = Entry(parent, justify=RIGHT, textvariable=widget.storageVar, width=3) + if "default" in managerAttrs: + widget.storageVar.set(managerAttrs["default"]) + + # grid + if manager == "grid": + widget.label.grid(managerAttrs["label"] if managerAttrs is not None and "label" in managerAttrs else None, row=parent.thisRow, column=parent.thisCol) + parent.thisCol += 1 + widget.textbox.grid(managerAttrs["textbox"] if managerAttrs is not None and "textbox" in managerAttrs else None, row=parent.thisRow, column=parent.thisCol) + parent.thisRow += 1 + parent.thisCol = 0 + + # pack + elif manager == "pack": + widget.label.pack(managerAttrs["label"] if managerAttrs is not None and "label" in managerAttrs else None) + widget.textbox.pack(managerAttrs["textbox"] if managerAttrs is not None and "textbox" in managerAttrs else None) + return widget -def make_widget(self, type, parent, label, storageVar=None, packAttrs=dict(), options=None): +def make_widget(self, type, parent, label, storageVar=None, manager=None, managerAttrs=dict(), options=None): widget = None + if manager is None: + manager = "pack" thisStorageVar = storageVar if isinstance(storageVar,str): if storageVar == "int" or storageVar == "integer": @@ -103,27 +113,28 @@ def make_widget(self, type, parent, label, storageVar=None, packAttrs=dict(), op if type == "checkbox": if thisStorageVar is None: thisStorageVar = IntVar() - widget = make_checkbox(self, parent, label, thisStorageVar, packAttrs) + widget = make_checkbox(self, parent, label, thisStorageVar, manager, managerAttrs) elif type == "selectbox": if thisStorageVar is None: thisStorageVar = StringVar() - widget = make_selectbox(self, parent, label, options, thisStorageVar, packAttrs) + widget = make_selectbox(self, parent, label, options, thisStorageVar, manager, managerAttrs) elif type == "spinbox": if thisStorageVar is None: thisStorageVar = StringVar() - widget = make_spinbox(self, parent, label, thisStorageVar, packAttrs) + widget = make_spinbox(self, parent, label, thisStorageVar, manager, managerAttrs) elif type == "textbox": if thisStorageVar is None: thisStorageVar = StringVar() - widget = make_textbox(self, parent, label, thisStorageVar, packAttrs) + widget = make_textbox(self, parent, label, thisStorageVar, manager, managerAttrs) return widget def make_widget_from_dict(self, defn, parent): type = defn["type"] if "type" in defn else None label = defn["label"]["text"] if "label" in defn and "text" in defn["label"] else "" - packAttrs = defn["packAttrs"] if "packAttrs" in defn else None + manager = defn["manager"] if "manager" in defn else None + managerAttrs = defn["managerAttrs"] if "managerAttrs" in defn else None options = defn["options"] if "options" in defn else None - widget = make_widget(self, type, parent, label, None, packAttrs, options) + widget = make_widget(self, type, parent, label, None, manager, managerAttrs, options) return widget def make_widgets_from_dict(self, defns, parent): diff --git a/resources/app/gui/adjust/overview/leftAdjustFrame.json b/resources/app/gui/adjust/overview/leftAdjustFrame.json index ce8a5b32..ffa04198 100644 --- a/resources/app/gui/adjust/overview/leftAdjustFrame.json +++ b/resources/app/gui/adjust/overview/leftAdjustFrame.json @@ -4,7 +4,7 @@ "label": { "text": "Heart Color" }, - "packAttrs": { + "managerAttrs": { "label": { "side": "left" }, @@ -25,7 +25,7 @@ "label": { "text": "Heart Beep sound rate" }, - "packAttrs": { + "managerAttrs": { "label": { "side": "left" }, diff --git a/resources/app/gui/adjust/overview/rightAdjustFrame.json b/resources/app/gui/adjust/overview/rightAdjustFrame.json index 0e3b510b..ba46ab97 100644 --- a/resources/app/gui/adjust/overview/rightAdjustFrame.json +++ b/resources/app/gui/adjust/overview/rightAdjustFrame.json @@ -4,7 +4,7 @@ "label": { "text": "Menu Speed" }, - "packAttrs": { + "managerAttrs": { "label": { "side": "left" }, @@ -27,7 +27,7 @@ "label": { "text": "Overworld Palettes" }, - "packAttrs": { + "managerAttrs": { "label": { "side": "left" }, @@ -46,7 +46,7 @@ "label": { "text": "Underworld Palettes" }, - "packAttrs": { + "managerAttrs": { "label": { "side": "left" }, diff --git a/resources/app/gui/custom/overview/itemList1.json b/resources/app/gui/custom/overview/itemList1.json index 9e16f26b..f1757e1d 100644 --- a/resources/app/gui/custom/overview/itemList1.json +++ b/resources/app/gui/custom/overview/itemList1.json @@ -4,14 +4,10 @@ "label": { "text": "Bow" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,53] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 0 } @@ -19,16 +15,12 @@ "progressivebow": { "type": "textbox", "label": { - "text": "Prog.Bow" + "text": "Progressive Bow" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,25] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 2 } @@ -36,16 +28,12 @@ "boomerang": { "type": "textbox", "label": { - "text": "B.Boomerang" + "text": "Blue Boomerang" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,4] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 1 } @@ -53,15 +41,12 @@ "redmerang": { "type": "textbox", "label": { - "text": "M.Boomerang" + "text": "Red Boomerang" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left" - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 1 } @@ -71,14 +56,10 @@ "label": { "text": "Hookshot" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,24] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 1 } @@ -88,14 +69,10 @@ "label": { "text": "Mushroom" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,17] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 1 } @@ -105,13 +82,10 @@ "label": { "text": "Magic Powder" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left" - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 1 } @@ -121,14 +95,10 @@ "label": { "text": "Fire Rod" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,33] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 1 } @@ -138,14 +108,10 @@ "label": { "text": "Ice Rod" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,37] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 1 } @@ -155,14 +121,10 @@ "label": { "text": "Bombos" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,32] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 1 } @@ -172,14 +134,10 @@ "label": { "text": "Ether" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,49] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 1 } @@ -189,14 +147,10 @@ "label": { "text": "Quake" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,42] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 1 } @@ -206,14 +160,10 @@ "label": { "text": "Lamp" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,46] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 1 } @@ -223,14 +173,10 @@ "label": { "text": "Hammer" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,29] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 1 } @@ -240,14 +186,10 @@ "label": { "text": "Shovel" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,41] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 1 } diff --git a/resources/app/gui/custom/overview/itemList2.json b/resources/app/gui/custom/overview/itemList2.json index fac1e620..f55a8c5c 100644 --- a/resources/app/gui/custom/overview/itemList2.json +++ b/resources/app/gui/custom/overview/itemList2.json @@ -4,14 +4,10 @@ "label": { "text": "Flute" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,58] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 1 } @@ -21,14 +17,10 @@ "label": { "text": "Bug Net" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,41] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 1 } @@ -38,14 +30,10 @@ "label": { "text": "Book" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,57] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 1 } @@ -55,14 +43,10 @@ "label": { "text": "Bottle" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,53] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 4 } @@ -70,16 +54,12 @@ "somaria": { "type": "textbox", "label": { - "text": "C.Somaria" + "text": "Cane of Somaria" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,30] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 1 } @@ -87,16 +67,12 @@ "byrna": { "type": "textbox", "label": { - "text": "C.Byrna" + "text": "Cane of Byrna" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,43] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 1 } @@ -106,14 +82,10 @@ "label": { "text": "Magic Cape" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,21] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 1 } @@ -123,14 +95,10 @@ "label": { "text": "Magic Mirror" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,15] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 1 } @@ -140,14 +108,10 @@ "label": { "text": "Pegasus Boots" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,8] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 1 } @@ -157,14 +121,10 @@ "label": { "text": "Power Glove" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,18] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 0 } @@ -174,14 +134,10 @@ "label": { "text": "Titan's Mitt" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,25] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 0 } @@ -189,16 +145,12 @@ "progressiveglove": { "type": "textbox", "label": { - "text": "Prog.Glove" + "text": "Progressive Glove" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,26] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 2 } @@ -208,14 +160,10 @@ "label": { "text": "Flippers" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,43] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 1 } @@ -225,14 +173,10 @@ "label": { "text": "Moon Pearl" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,23] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 1 } @@ -242,14 +186,10 @@ "label": { "text": "Piece of Heart" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,10] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 24 } diff --git a/resources/app/gui/custom/overview/itemList3.json b/resources/app/gui/custom/overview/itemList3.json index cb7b40ec..48e2e674 100644 --- a/resources/app/gui/custom/overview/itemList3.json +++ b/resources/app/gui/custom/overview/itemList3.json @@ -4,13 +4,10 @@ "label": { "text": "Heart Container" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left" - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 10 } @@ -20,13 +17,10 @@ "label": { "text": "Sanctuary Heart" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left" - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 1 } @@ -34,16 +28,12 @@ "sword1": { "type": "textbox", "label": { - "text": "Sword 1" + "text": "Fighters' Sword" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,42] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 0 } @@ -51,16 +41,12 @@ "sword2": { "type": "textbox", "label": { - "text": "Sword 2" + "text": "Master Sword" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,42] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 0 } @@ -68,16 +54,12 @@ "sword3": { "type": "textbox", "label": { - "text": "Sword 3" + "text": "Tempered Sword" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,42] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 0 } @@ -85,16 +67,12 @@ "sword4": { "type": "textbox", "label": { - "text": "Sword 4" + "text": "Golden Sword" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,42] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 0 } @@ -102,16 +80,12 @@ "progressivesword": { "type": "textbox", "label": { - "text": "Prog.Sword" + "text": "Progressive Sword" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,23] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 4 } @@ -119,16 +93,12 @@ "shield1": { "type": "textbox", "label": { - "text": "Shield 1" + "text": "Fighters' Shield" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,43] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 0 } @@ -136,16 +106,12 @@ "shield2": { "type": "textbox", "label": { - "text": "Shield 2" + "text": "Fire Shield" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,43] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 0 } @@ -153,16 +119,12 @@ "shield3": { "type": "textbox", "label": { - "text": "Shield 3" + "text": "Mirror Shield" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,43] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 0 } @@ -170,16 +132,12 @@ "progressiveshield": { "type": "textbox", "label": { - "text": "Prog.Shield" + "text": "Progressive Shield" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,24] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 3 } @@ -189,14 +147,10 @@ "label": { "text": "Blue Mail" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,35] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 0 } @@ -206,14 +160,10 @@ "label": { "text": "Red Mail" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,38] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 0 } @@ -221,16 +171,12 @@ "progressivemail": { "type": "textbox", "label": { - "text": "Prog.Mail" + "text": "Progressive Mail" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,33] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 2 } @@ -240,14 +186,10 @@ "label": { "text": "Half Magic" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,26] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 1 } diff --git a/resources/app/gui/custom/overview/itemList4.json b/resources/app/gui/custom/overview/itemList4.json index 6a6b43f6..83ae2dd0 100644 --- a/resources/app/gui/custom/overview/itemList4.json +++ b/resources/app/gui/custom/overview/itemList4.json @@ -4,13 +4,10 @@ "label": { "text": "Quarter Magic" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left" - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 0 } @@ -18,16 +15,12 @@ "bombsplus5": { "type": "textbox", "label": { - "text": "Bomb C.+5" + "text": "Bomb Cap +5" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [1,15] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 0 } @@ -35,16 +28,12 @@ "bombsplus10": { "type": "textbox", "label": { - "text": "Bomb C.+10" + "text": "Bomb Cap +10" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,10] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 0 } @@ -52,16 +41,12 @@ "arrowsplus5": { "type": "textbox", "label": { - "text": "Arrow C.+5" + "text": "Arrow Cap +5" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,16] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 0 } @@ -69,16 +54,12 @@ "arrowsplus10": { "type": "textbox", "label": { - "text": "Arrow C.+10" + "text": "Arrow Cap +10" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,10] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 0 } @@ -88,14 +69,10 @@ "label": { "text": "Arrow (1)" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,27] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 1 } @@ -105,14 +82,10 @@ "label": { "text": "Arrow (10)" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,21] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 12 } @@ -122,14 +95,10 @@ "label": { "text": "Bomb (1)" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,27] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 0 } @@ -139,14 +108,10 @@ "label": { "text": "Bomb (3)" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,27] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 13 } @@ -156,14 +121,10 @@ "label": { "text": "Bomb (10)" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,21] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 1 } @@ -173,14 +134,10 @@ "label": { "text": "Rupee (1)" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,25] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 2 } @@ -190,14 +147,10 @@ "label": { "text": "Rupee (5)" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,25] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 4 } @@ -207,14 +160,10 @@ "label": { "text": "Rupee (20)" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,19] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 28 } @@ -224,14 +173,10 @@ "label": { "text": "Rupee (50)" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,19] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 7 } @@ -241,14 +186,10 @@ "label": { "text": "Rupee (100)" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,13] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 1 } diff --git a/resources/app/gui/custom/overview/itemList5.json b/resources/app/gui/custom/overview/itemList5.json index de75b805..0ffc876f 100644 --- a/resources/app/gui/custom/overview/itemList5.json +++ b/resources/app/gui/custom/overview/itemList5.json @@ -4,14 +4,10 @@ "label": { "text": "Rupee (300)" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,54] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 5 } @@ -21,14 +17,10 @@ "label": { "text": "Blue Clock" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,60] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 0 } @@ -38,14 +30,10 @@ "label": { "text": "Green Clock" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,52] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 0 } @@ -55,14 +43,10 @@ "label": { "text": "Red Clock" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,63] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 0 } @@ -72,13 +56,10 @@ "label": { "text": "Silver Arrows Upgrade" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left" - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 0 } @@ -88,14 +69,10 @@ "label": { "text": "Generic Keys" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,49] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 0 } @@ -105,14 +82,10 @@ "label": { "text": "Triforce Pieces" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,40] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 0 } @@ -122,14 +95,10 @@ "label": { "text": "Triforce Pieces Goal" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,13] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 0 } @@ -139,14 +108,10 @@ "label": { "text": "Triforce (win game)" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,13] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 0 } @@ -156,14 +121,10 @@ "label": { "text": "Rupoor" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,77] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 0 } @@ -173,14 +134,10 @@ "label": { "text": "Rupoor Cost" }, - "packAttrs": { + "manager": "grid", + "managerAttrs": { "label": { - "anchor": "w", - "side": "left", - "padx": [0,50] - }, - "textbox": { - "side": "right" + "sticky": "w" }, "default": 10 } diff --git a/resources/app/gui/randomize/dungeon/widgets.json b/resources/app/gui/randomize/dungeon/widgets.json index e58aa1ea..60255d8e 100644 --- a/resources/app/gui/randomize/dungeon/widgets.json +++ b/resources/app/gui/randomize/dungeon/widgets.json @@ -4,7 +4,7 @@ "label": { "text": "Dungeon Door Shuffle" }, - "packAttrs": { + "managerAttrs": { "label": { "side": "left" }, @@ -30,7 +30,7 @@ "label": { "text": "Dungeon Chest Counters" }, - "packAttrs": { + "managerAttrs": { "label": { "side": "left" }, diff --git a/resources/app/gui/randomize/enemizer/leftEnemizerFrame.json b/resources/app/gui/randomize/enemizer/leftEnemizerFrame.json index bf5fab87..0c54605d 100644 --- a/resources/app/gui/randomize/enemizer/leftEnemizerFrame.json +++ b/resources/app/gui/randomize/enemizer/leftEnemizerFrame.json @@ -4,7 +4,7 @@ "label": { "text": "Enemy Shuffle" }, - "packAttrs": { + "managerAttrs": { "label": { "side": "left" }, @@ -23,7 +23,7 @@ "label": { "text": "Boss Shuffle" }, - "packAttrs": { + "managerAttrs": { "label": { "side": "left" }, diff --git a/resources/app/gui/randomize/enemizer/rightEnemizerFrame.json b/resources/app/gui/randomize/enemizer/rightEnemizerFrame.json index 5f559dc1..4e3629b6 100644 --- a/resources/app/gui/randomize/enemizer/rightEnemizerFrame.json +++ b/resources/app/gui/randomize/enemizer/rightEnemizerFrame.json @@ -4,7 +4,7 @@ "label": { "text": "Enemy Damage" }, - "packAttrs": { + "managerAttrs": { "label": { "side": "left" }, @@ -23,7 +23,7 @@ "label": { "text": "Enemy Health" }, - "packAttrs": { + "managerAttrs": { "label": { "side": "left" }, diff --git a/resources/app/gui/randomize/entrando/widgets.json b/resources/app/gui/randomize/entrando/widgets.json index ceb04d45..ec1cc4c7 100644 --- a/resources/app/gui/randomize/entrando/widgets.json +++ b/resources/app/gui/randomize/entrando/widgets.json @@ -16,7 +16,7 @@ "label": { "text": "Entrance Shuffle" }, - "packAttrs": { + "managerAttrs": { "label": { "side": "left" }, "selectbox": { "side": "right" } }, diff --git a/resources/app/gui/randomize/gameoptions/checkboxes.json b/resources/app/gui/randomize/gameoptions/checkboxes.json index e531d2e9..ba7b0f9c 100644 --- a/resources/app/gui/randomize/gameoptions/checkboxes.json +++ b/resources/app/gui/randomize/gameoptions/checkboxes.json @@ -3,7 +3,8 @@ "type": "checkbox", "label": { "text": "Include Helpful Hints" - } + }, + "default": "true" }, "nobgm": { "type": "checkbox", diff --git a/resources/app/gui/randomize/gameoptions/leftRomOptionsFrame.json b/resources/app/gui/randomize/gameoptions/leftRomOptionsFrame.json index ce8a5b32..ffa04198 100644 --- a/resources/app/gui/randomize/gameoptions/leftRomOptionsFrame.json +++ b/resources/app/gui/randomize/gameoptions/leftRomOptionsFrame.json @@ -4,7 +4,7 @@ "label": { "text": "Heart Color" }, - "packAttrs": { + "managerAttrs": { "label": { "side": "left" }, @@ -25,7 +25,7 @@ "label": { "text": "Heart Beep sound rate" }, - "packAttrs": { + "managerAttrs": { "label": { "side": "left" }, diff --git a/resources/app/gui/randomize/gameoptions/rightRomOptionsFrame.json b/resources/app/gui/randomize/gameoptions/rightRomOptionsFrame.json index 0e3b510b..ba46ab97 100644 --- a/resources/app/gui/randomize/gameoptions/rightRomOptionsFrame.json +++ b/resources/app/gui/randomize/gameoptions/rightRomOptionsFrame.json @@ -4,7 +4,7 @@ "label": { "text": "Menu Speed" }, - "packAttrs": { + "managerAttrs": { "label": { "side": "left" }, @@ -27,7 +27,7 @@ "label": { "text": "Overworld Palettes" }, - "packAttrs": { + "managerAttrs": { "label": { "side": "left" }, @@ -46,7 +46,7 @@ "label": { "text": "Underworld Palettes" }, - "packAttrs": { + "managerAttrs": { "label": { "side": "left" }, diff --git a/resources/app/gui/randomize/item/leftItemFrame.json b/resources/app/gui/randomize/item/leftItemFrame.json index ec3d2a38..85e8eed0 100644 --- a/resources/app/gui/randomize/item/leftItemFrame.json +++ b/resources/app/gui/randomize/item/leftItemFrame.json @@ -4,7 +4,7 @@ "label": { "text": "World State" }, - "packAttrs": { + "managerAttrs": { "label": { "side": "left" }, @@ -24,7 +24,7 @@ "label": { "text": "Logic Level" }, - "packAttrs": { + "managerAttrs": { "label": { "side": "left" }, @@ -43,7 +43,7 @@ "label": { "text": "Goal" }, - "packAttrs": { + "managerAttrs": { "label": { "side": "left" }, @@ -64,7 +64,7 @@ "label": { "text": "Crystals to open GT" }, - "packAttrs": { + "managerAttrs": { "label": { "side": "left" }, @@ -89,7 +89,7 @@ "label": { "text": "Crystals to harm Ganon" }, - "packAttrs": { + "managerAttrs": { "label": { "side": "left" }, @@ -114,7 +114,7 @@ "label": { "text": "Weapons" }, - "packAttrs": { + "managerAttrs": { "label": { "side": "left" }, diff --git a/resources/app/gui/randomize/item/rightItemFrame.json b/resources/app/gui/randomize/item/rightItemFrame.json index 8773f88b..0a1b6fff 100644 --- a/resources/app/gui/randomize/item/rightItemFrame.json +++ b/resources/app/gui/randomize/item/rightItemFrame.json @@ -4,7 +4,7 @@ "label": { "text": "Item Pool" }, - "packAttrs": { + "managerAttrs": { "label": { "side": "left" }, @@ -23,7 +23,7 @@ "label": { "text": "Item Functionality" }, - "packAttrs": { + "managerAttrs": { "label": { "side": "left" }, @@ -42,7 +42,7 @@ "label": { "text": "Timer Setting" }, - "packAttrs": { + "managerAttrs": { "label": { "side": "left" }, @@ -64,7 +64,7 @@ "label": { "text": "Progressive Items" }, - "packAttrs": { + "managerAttrs": { "label": { "side": "left" }, @@ -83,7 +83,7 @@ "label": { "text": "Accessibility" }, - "packAttrs": { + "managerAttrs": { "label": { "side": "left" }, @@ -102,7 +102,7 @@ "label": { "text": "Item Sorting" }, - "packAttrs": { + "managerAttrs": { "label": { "side": "left" }, diff --git a/resources/app/gui/randomize/multiworld/widgets.json b/resources/app/gui/randomize/multiworld/widgets.json index 958e7000..b943c017 100644 --- a/resources/app/gui/randomize/multiworld/widgets.json +++ b/resources/app/gui/randomize/multiworld/widgets.json @@ -4,7 +4,7 @@ "label": { "text": "Worlds" }, - "packAttrs": { + "managerAttrs": { "label": { "side": "left" }, From 531d7799d605a1435ce9cee98c3be157072cf893 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 22 Feb 2020 00:18:56 -0800 Subject: [PATCH 096/117] Condense Adjust options --- gui/adjust/overview.py | 30 ++--- gui/widgets.py | 1 + .../app/gui/adjust/overview/checkboxes.json | 14 -- .../gui/adjust/overview/leftAdjustFrame.json | 45 ------- .../gui/adjust/overview/rightAdjustFrame.json | 63 --------- .../app/gui/adjust/overview/widgets.json | 124 ++++++++++++++++++ 6 files changed, 135 insertions(+), 142 deletions(-) delete mode 100644 resources/app/gui/adjust/overview/checkboxes.json delete mode 100644 resources/app/gui/adjust/overview/leftAdjustFrame.json delete mode 100644 resources/app/gui/adjust/overview/rightAdjustFrame.json create mode 100644 resources/app/gui/adjust/overview/widgets.json diff --git a/gui/adjust/overview.py b/gui/adjust/overview.py index 5d808e32..8e3a7851 100644 --- a/gui/adjust/overview.py +++ b/gui/adjust/overview.py @@ -19,13 +19,6 @@ def adjust_page(top, parent, settings): self.frames["checkboxes"] = Frame(self) self.frames["checkboxes"].pack(anchor=W) - with open(os.path.join("resources","app","gui","adjust","overview","checkboxes.json")) as checkboxes: - myDict = json.load(checkboxes) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["checkboxes"]) - for key in dictWidgets: - self.widgets[key] = dictWidgets[key] - self.widgets[key].pack(anchor=W) - self.frames["selectOptionsFrame"] = Frame(self) self.frames["leftAdjustFrame"] = Frame(self.frames["selectOptionsFrame"]) self.frames["rightAdjustFrame"] = Frame(self.frames["selectOptionsFrame"]) @@ -35,12 +28,16 @@ def adjust_page(top, parent, settings): self.frames["rightAdjustFrame"].pack(side=RIGHT) self.frames["bottomAdjustFrame"].pack(fill=X) - with open(os.path.join("resources","app","gui","adjust","overview","leftAdjustFrame.json")) as leftAdjustFrameItems: - myDict = json.load(leftAdjustFrameItems) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["leftAdjustFrame"]) - for key in dictWidgets: - self.widgets[key] = dictWidgets[key] - self.widgets[key].pack(anchor=E) + with open(os.path.join("resources","app","gui","adjust","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.widgets[key] = dictWidgets[key] + packAttrs = {"anchor":E} + if self.widgets[key].type == "checkbox": + packAttrs["anchor"] = W + self.widgets[key].pack(packAttrs) # Sprite Selection self.spriteNameVar2 = StringVar() @@ -68,13 +65,6 @@ def adjust_page(top, parent, settings): spriteSelectButton2.pack(side=LEFT) spriteDialogFrame2.pack(anchor=E) - with open(os.path.join("resources","app","gui","adjust","overview","rightAdjustFrame.json")) as rightAdjustFrameItems: - myDict = json.load(rightAdjustFrameItems) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["rightAdjustFrame"]) - for key in dictWidgets: - self.widgets[key] = dictWidgets[key] - self.widgets[key].pack(anchor=E) - adjustRomFrame = Frame(self.frames["bottomAdjustFrame"]) adjustRomLabel = Label(adjustRomFrame, text='Rom to adjust: ') self.romVar2 = StringVar(value=settings["rom"]) diff --git a/gui/widgets.py b/gui/widgets.py index 3b6925d3..b4d15557 100644 --- a/gui/widgets.py +++ b/gui/widgets.py @@ -126,6 +126,7 @@ 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) + widget.type = type return widget def make_widget_from_dict(self, defn, parent): diff --git a/resources/app/gui/adjust/overview/checkboxes.json b/resources/app/gui/adjust/overview/checkboxes.json deleted file mode 100644 index 9a4e94f2..00000000 --- a/resources/app/gui/adjust/overview/checkboxes.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "nobgm": { - "type": "checkbox", - "label": { - "text": "Disable Music & MSU-1" - } - }, - "quickswap": { - "type": "checkbox", - "label": { - "text": "L/R Quickswapping" - } - } -} diff --git a/resources/app/gui/adjust/overview/leftAdjustFrame.json b/resources/app/gui/adjust/overview/leftAdjustFrame.json deleted file mode 100644 index ffa04198..00000000 --- a/resources/app/gui/adjust/overview/leftAdjustFrame.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "heartcolor": { - "type": "selectbox", - "label": { - "text": "Heart Color" - }, - "managerAttrs": { - "label": { - "side": "left" - }, - "selectbox": { - "side": "right" - } - }, - "options": { - "Red": "red", - "Blue": "blue", - "Green": "green", - "Yellow": "yellow", - "Random": "random" - } - }, - "heartbeep": { - "type": "selectbox", - "label": { - "text": "Heart Beep sound rate" - }, - "managerAttrs": { - "label": { - "side": "left" - }, - "selectbox": { - "side": "right" - }, - "default": "Normal" - }, - "options": { - "Double": "double", - "Normal": "normal", - "Half": "half", - "Quarter": "quarter", - "Off": "off" - } - } -} diff --git a/resources/app/gui/adjust/overview/rightAdjustFrame.json b/resources/app/gui/adjust/overview/rightAdjustFrame.json deleted file mode 100644 index ba46ab97..00000000 --- a/resources/app/gui/adjust/overview/rightAdjustFrame.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "menuspeed": { - "type": "selectbox", - "label": { - "text": "Menu Speed" - }, - "managerAttrs": { - "label": { - "side": "left" - }, - "selectbox": { - "side": "right" - }, - "default": "Normal" - }, - "options": { - "Instant": "instant", - "Quadruple": "quadruple", - "Triple": "triple", - "Double": "double", - "Normal": "normal", - "Half": "half" - } - }, - "owpalettes": { - "type": "selectbox", - "label": { - "text": "Overworld Palettes" - }, - "managerAttrs": { - "label": { - "side": "left" - }, - "selectbox": { - "side": "right" - } - }, - "options": { - "Default": "default", - "Random": "random", - "Blackout": "blackout" - } - }, - "uwpalettes": { - "type": "selectbox", - "label": { - "text": "Underworld Palettes" - }, - "managerAttrs": { - "label": { - "side": "left" - }, - "selectbox": { - "side": "right" - } - }, - "options": { - "Default": "default", - "Random": "random", - "Blackout": "blackout" - } - } -} diff --git a/resources/app/gui/adjust/overview/widgets.json b/resources/app/gui/adjust/overview/widgets.json new file mode 100644 index 00000000..30fe2445 --- /dev/null +++ b/resources/app/gui/adjust/overview/widgets.json @@ -0,0 +1,124 @@ +{ + "checkboxes": { + "nobgm": { + "type": "checkbox", + "label": { + "text": "Disable Music & MSU-1" + } + }, + "quickswap": { + "type": "checkbox", + "label": { + "text": "L/R Quickswapping" + } + } + }, + "leftAdjustFrame": { + "heartcolor": { + "type": "selectbox", + "label": { + "text": "Heart Color" + }, + "managerAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "Red": "red", + "Blue": "blue", + "Green": "green", + "Yellow": "yellow", + "Random": "random" + } + }, + "heartbeep": { + "type": "selectbox", + "label": { + "text": "Heart Beep sound rate" + }, + "managerAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + }, + "default": "Normal" + }, + "options": { + "Double": "double", + "Normal": "normal", + "Half": "half", + "Quarter": "quarter", + "Off": "off" + } + } + }, + "rightAdjustFrame": { + "menuspeed": { + "type": "selectbox", + "label": { + "text": "Menu Speed" + }, + "managerAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + }, + "default": "Normal" + }, + "options": { + "Instant": "instant", + "Quadruple": "quadruple", + "Triple": "triple", + "Double": "double", + "Normal": "normal", + "Half": "half" + } + }, + "owpalettes": { + "type": "selectbox", + "label": { + "text": "Overworld Palettes" + }, + "managerAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "Default": "default", + "Random": "random", + "Blackout": "blackout" + } + }, + "uwpalettes": { + "type": "selectbox", + "label": { + "text": "Underworld Palettes" + }, + "managerAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "Default": "default", + "Random": "random", + "Blackout": "blackout" + } + } + } +} From 8adc2e92d5337aa45c2d8ca3b715747e5fe95294 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 22 Feb 2020 00:24:53 -0800 Subject: [PATCH 097/117] Condense Custom Item Pool options --- gui/custom/overview.py | 35 +- .../app/gui/custom/overview/itemList1.json | 197 ---- .../app/gui/custom/overview/itemList2.json | 197 ---- .../app/gui/custom/overview/itemList3.json | 197 ---- .../app/gui/custom/overview/itemList4.json | 197 ---- .../app/gui/custom/overview/itemList5.json | 145 --- .../app/gui/custom/overview/widgets.json | 935 ++++++++++++++++++ 7 files changed, 941 insertions(+), 962 deletions(-) delete mode 100644 resources/app/gui/custom/overview/itemList1.json delete mode 100644 resources/app/gui/custom/overview/itemList2.json delete mode 100644 resources/app/gui/custom/overview/itemList3.json delete mode 100644 resources/app/gui/custom/overview/itemList4.json delete mode 100644 resources/app/gui/custom/overview/itemList5.json create mode 100644 resources/app/gui/custom/overview/widgets.json diff --git a/gui/custom/overview.py b/gui/custom/overview.py index 9d366405..e08dab9f 100644 --- a/gui/custom/overview.py +++ b/gui/custom/overview.py @@ -39,35 +39,12 @@ def custom_page(top,parent): create_vertical_rule(2) create_list_frame(self,"itemList5") - with open(os.path.join("resources","app","gui","custom","overview","itemList1.json")) as items: - myDict = json.load(items) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["itemList1"]) - for key in dictWidgets: - self.customWidgets[key] = dictWidgets[key] - - with open(os.path.join("resources","app","gui","custom","overview","itemList2.json")) as items: - myDict = json.load(items) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["itemList2"]) - for key in dictWidgets: - self.customWidgets[key] = dictWidgets[key] - - with open(os.path.join("resources","app","gui","custom","overview","itemList3.json")) as items: - myDict = json.load(items) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["itemList3"]) - for key in dictWidgets: - self.customWidgets[key] = dictWidgets[key] - - with open(os.path.join("resources","app","gui","custom","overview","itemList4.json")) as items: - myDict = json.load(items) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["itemList4"]) - for key in dictWidgets: - self.customWidgets[key] = dictWidgets[key] - - with open(os.path.join("resources","app","gui","custom","overview","itemList5.json")) as items: - myDict = json.load(items) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["itemList5"]) - for key in dictWidgets: - self.customWidgets[key] = dictWidgets[key] + 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] keys = list(self.customWidgets.keys()) for i in range(0, len(keys)): diff --git a/resources/app/gui/custom/overview/itemList1.json b/resources/app/gui/custom/overview/itemList1.json deleted file mode 100644 index f1757e1d..00000000 --- a/resources/app/gui/custom/overview/itemList1.json +++ /dev/null @@ -1,197 +0,0 @@ -{ - "bow": { - "type": "textbox", - "label": { - "text": "Bow" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 0 - } - }, - "progressivebow": { - "type": "textbox", - "label": { - "text": "Progressive Bow" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 2 - } - }, - "boomerang": { - "type": "textbox", - "label": { - "text": "Blue Boomerang" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 1 - } - }, - "redmerang": { - "type": "textbox", - "label": { - "text": "Red Boomerang" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 1 - } - }, - "hookshot": { - "type": "textbox", - "label": { - "text": "Hookshot" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 1 - } - }, - "mushroom": { - "type": "textbox", - "label": { - "text": "Mushroom" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 1 - } - }, - "powder": { - "type": "textbox", - "label": { - "text": "Magic Powder" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 1 - } - }, - "firerod": { - "type": "textbox", - "label": { - "text": "Fire Rod" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 1 - } - }, - "icerod": { - "type": "textbox", - "label": { - "text": "Ice Rod" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 1 - } - }, - "bombos": { - "type": "textbox", - "label": { - "text": "Bombos" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 1 - } - }, - "ether": { - "type": "textbox", - "label": { - "text": "Ether" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 1 - } - }, - "quake": { - "type": "textbox", - "label": { - "text": "Quake" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 1 - } - }, - "lamp": { - "type": "textbox", - "label": { - "text": "Lamp" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 1 - } - }, - "hammer": { - "type": "textbox", - "label": { - "text": "Hammer" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 1 - } - }, - "shovel": { - "type": "textbox", - "label": { - "text": "Shovel" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 1 - } - } -} diff --git a/resources/app/gui/custom/overview/itemList2.json b/resources/app/gui/custom/overview/itemList2.json deleted file mode 100644 index f55a8c5c..00000000 --- a/resources/app/gui/custom/overview/itemList2.json +++ /dev/null @@ -1,197 +0,0 @@ -{ - "flute": { - "type": "textbox", - "label": { - "text": "Flute" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 1 - } - }, - "bugnet": { - "type": "textbox", - "label": { - "text": "Bug Net" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 1 - } - }, - "book": { - "type": "textbox", - "label": { - "text": "Book" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 1 - } - }, - "bottle": { - "type": "textbox", - "label": { - "text": "Bottle" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 4 - } - }, - "somaria": { - "type": "textbox", - "label": { - "text": "Cane of Somaria" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 1 - } - }, - "byrna": { - "type": "textbox", - "label": { - "text": "Cane of Byrna" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 1 - } - }, - "cape": { - "type": "textbox", - "label": { - "text": "Magic Cape" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 1 - } - }, - "mirror": { - "type": "textbox", - "label": { - "text": "Magic Mirror" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 1 - } - }, - "boots": { - "type": "textbox", - "label": { - "text": "Pegasus Boots" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 1 - } - }, - "powerglove": { - "type": "textbox", - "label": { - "text": "Power Glove" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 0 - } - }, - "titansmitt": { - "type": "textbox", - "label": { - "text": "Titan's Mitt" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 0 - } - }, - "progressiveglove": { - "type": "textbox", - "label": { - "text": "Progressive Glove" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 2 - } - }, - "flippers": { - "type": "textbox", - "label": { - "text": "Flippers" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 1 - } - }, - "pearl": { - "type": "textbox", - "label": { - "text": "Moon Pearl" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 1 - } - }, - "heartpiece": { - "type": "textbox", - "label": { - "text": "Piece of Heart" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 24 - } - } -} diff --git a/resources/app/gui/custom/overview/itemList3.json b/resources/app/gui/custom/overview/itemList3.json deleted file mode 100644 index 48e2e674..00000000 --- a/resources/app/gui/custom/overview/itemList3.json +++ /dev/null @@ -1,197 +0,0 @@ -{ - "heartcontainer": { - "type": "textbox", - "label": { - "text": "Heart Container" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 10 - } - }, - "sancheart": { - "type": "textbox", - "label": { - "text": "Sanctuary Heart" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 1 - } - }, - "sword1": { - "type": "textbox", - "label": { - "text": "Fighters' Sword" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 0 - } - }, - "sword2": { - "type": "textbox", - "label": { - "text": "Master Sword" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 0 - } - }, - "sword3": { - "type": "textbox", - "label": { - "text": "Tempered Sword" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 0 - } - }, - "sword4": { - "type": "textbox", - "label": { - "text": "Golden Sword" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 0 - } - }, - "progressivesword": { - "type": "textbox", - "label": { - "text": "Progressive Sword" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 4 - } - }, - "shield1": { - "type": "textbox", - "label": { - "text": "Fighters' Shield" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 0 - } - }, - "shield2": { - "type": "textbox", - "label": { - "text": "Fire Shield" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 0 - } - }, - "shield3": { - "type": "textbox", - "label": { - "text": "Mirror Shield" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 0 - } - }, - "progressiveshield": { - "type": "textbox", - "label": { - "text": "Progressive Shield" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 3 - } - }, - "mail2": { - "type": "textbox", - "label": { - "text": "Blue Mail" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 0 - } - }, - "mail3": { - "type": "textbox", - "label": { - "text": "Red Mail" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 0 - } - }, - "progressivemail": { - "type": "textbox", - "label": { - "text": "Progressive Mail" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 2 - } - }, - "halfmagic": { - "type": "textbox", - "label": { - "text": "Half Magic" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 1 - } - } -} diff --git a/resources/app/gui/custom/overview/itemList4.json b/resources/app/gui/custom/overview/itemList4.json deleted file mode 100644 index 83ae2dd0..00000000 --- a/resources/app/gui/custom/overview/itemList4.json +++ /dev/null @@ -1,197 +0,0 @@ -{ - "quartermagic": { - "type": "textbox", - "label": { - "text": "Quarter Magic" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 0 - } - }, - "bombsplus5": { - "type": "textbox", - "label": { - "text": "Bomb Cap +5" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 0 - } - }, - "bombsplus10": { - "type": "textbox", - "label": { - "text": "Bomb Cap +10" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 0 - } - }, - "arrowsplus5": { - "type": "textbox", - "label": { - "text": "Arrow Cap +5" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 0 - } - }, - "arrowsplus10": { - "type": "textbox", - "label": { - "text": "Arrow Cap +10" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 0 - } - }, - "arrow1": { - "type": "textbox", - "label": { - "text": "Arrow (1)" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 1 - } - }, - "arrow10": { - "type": "textbox", - "label": { - "text": "Arrow (10)" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 12 - } - }, - "bomb1": { - "type": "textbox", - "label": { - "text": "Bomb (1)" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 0 - } - }, - "bomb3": { - "type": "textbox", - "label": { - "text": "Bomb (3)" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 13 - } - }, - "bomb10": { - "type": "textbox", - "label": { - "text": "Bomb (10)" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 1 - } - }, - "rupee1": { - "type": "textbox", - "label": { - "text": "Rupee (1)" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 2 - } - }, - "rupee5": { - "type": "textbox", - "label": { - "text": "Rupee (5)" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 4 - } - }, - "rupee20": { - "type": "textbox", - "label": { - "text": "Rupee (20)" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 28 - } - }, - "rupee50": { - "type": "textbox", - "label": { - "text": "Rupee (50)" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 7 - } - }, - "rupee100": { - "type": "textbox", - "label": { - "text": "Rupee (100)" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 1 - } - } -} diff --git a/resources/app/gui/custom/overview/itemList5.json b/resources/app/gui/custom/overview/itemList5.json deleted file mode 100644 index 0ffc876f..00000000 --- a/resources/app/gui/custom/overview/itemList5.json +++ /dev/null @@ -1,145 +0,0 @@ -{ - "rupee300": { - "type": "textbox", - "label": { - "text": "Rupee (300)" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 5 - } - }, - "blueclock": { - "type": "textbox", - "label": { - "text": "Blue Clock" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 0 - } - }, - "greenclock": { - "type": "textbox", - "label": { - "text": "Green Clock" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 0 - } - }, - "redclock": { - "type": "textbox", - "label": { - "text": "Red Clock" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 0 - } - }, - "silversupgrade": { - "type": "textbox", - "label": { - "text": "Silver Arrows Upgrade" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 0 - } - }, - "generickeys": { - "type": "textbox", - "label": { - "text": "Generic Keys" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 0 - } - }, - "triforcepieces": { - "type": "textbox", - "label": { - "text": "Triforce Pieces" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 0 - } - }, - "triforcepiecesgoal": { - "type": "textbox", - "label": { - "text": "Triforce Pieces Goal" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 0 - } - }, - "triforce": { - "type": "textbox", - "label": { - "text": "Triforce (win game)" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 0 - } - }, - "rupoor": { - "type": "textbox", - "label": { - "text": "Rupoor" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 0 - } - }, - "rupoorcost": { - "type": "textbox", - "label": { - "text": "Rupoor Cost" - }, - "manager": "grid", - "managerAttrs": { - "label": { - "sticky": "w" - }, - "default": 10 - } - } -} diff --git a/resources/app/gui/custom/overview/widgets.json b/resources/app/gui/custom/overview/widgets.json new file mode 100644 index 00000000..c57eead1 --- /dev/null +++ b/resources/app/gui/custom/overview/widgets.json @@ -0,0 +1,935 @@ +{ + "itemList1": { + "bow": { + "type": "textbox", + "label": { + "text": "Bow" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 0 + } + }, + "progressivebow": { + "type": "textbox", + "label": { + "text": "Progressive Bow" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 2 + } + }, + "boomerang": { + "type": "textbox", + "label": { + "text": "Blue Boomerang" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 1 + } + }, + "redmerang": { + "type": "textbox", + "label": { + "text": "Red Boomerang" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 1 + } + }, + "hookshot": { + "type": "textbox", + "label": { + "text": "Hookshot" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 1 + } + }, + "mushroom": { + "type": "textbox", + "label": { + "text": "Mushroom" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 1 + } + }, + "powder": { + "type": "textbox", + "label": { + "text": "Magic Powder" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 1 + } + }, + "firerod": { + "type": "textbox", + "label": { + "text": "Fire Rod" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 1 + } + }, + "icerod": { + "type": "textbox", + "label": { + "text": "Ice Rod" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 1 + } + }, + "bombos": { + "type": "textbox", + "label": { + "text": "Bombos" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 1 + } + }, + "ether": { + "type": "textbox", + "label": { + "text": "Ether" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 1 + } + }, + "quake": { + "type": "textbox", + "label": { + "text": "Quake" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 1 + } + }, + "lamp": { + "type": "textbox", + "label": { + "text": "Lamp" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 1 + } + }, + "hammer": { + "type": "textbox", + "label": { + "text": "Hammer" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 1 + } + }, + "shovel": { + "type": "textbox", + "label": { + "text": "Shovel" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 1 + } + } + }, + "itemList2": { + "flute": { + "type": "textbox", + "label": { + "text": "Flute" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 1 + } + }, + "bugnet": { + "type": "textbox", + "label": { + "text": "Bug Net" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 1 + } + }, + "book": { + "type": "textbox", + "label": { + "text": "Book" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 1 + } + }, + "bottle": { + "type": "textbox", + "label": { + "text": "Bottle" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 4 + } + }, + "somaria": { + "type": "textbox", + "label": { + "text": "Cane of Somaria" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 1 + } + }, + "byrna": { + "type": "textbox", + "label": { + "text": "Cane of Byrna" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 1 + } + }, + "cape": { + "type": "textbox", + "label": { + "text": "Magic Cape" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 1 + } + }, + "mirror": { + "type": "textbox", + "label": { + "text": "Magic Mirror" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 1 + } + }, + "boots": { + "type": "textbox", + "label": { + "text": "Pegasus Boots" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 1 + } + }, + "powerglove": { + "type": "textbox", + "label": { + "text": "Power Glove" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 0 + } + }, + "titansmitt": { + "type": "textbox", + "label": { + "text": "Titan's Mitt" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 0 + } + }, + "progressiveglove": { + "type": "textbox", + "label": { + "text": "Progressive Glove" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 2 + } + }, + "flippers": { + "type": "textbox", + "label": { + "text": "Flippers" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 1 + } + }, + "pearl": { + "type": "textbox", + "label": { + "text": "Moon Pearl" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 1 + } + }, + "heartpiece": { + "type": "textbox", + "label": { + "text": "Piece of Heart" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 24 + } + } + }, + "itemList3": { + "heartcontainer": { + "type": "textbox", + "label": { + "text": "Heart Container" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 10 + } + }, + "sancheart": { + "type": "textbox", + "label": { + "text": "Sanctuary Heart" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 1 + } + }, + "sword1": { + "type": "textbox", + "label": { + "text": "Fighters' Sword" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 0 + } + }, + "sword2": { + "type": "textbox", + "label": { + "text": "Master Sword" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 0 + } + }, + "sword3": { + "type": "textbox", + "label": { + "text": "Tempered Sword" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 0 + } + }, + "sword4": { + "type": "textbox", + "label": { + "text": "Golden Sword" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 0 + } + }, + "progressivesword": { + "type": "textbox", + "label": { + "text": "Progressive Sword" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 4 + } + }, + "shield1": { + "type": "textbox", + "label": { + "text": "Fighters' Shield" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 0 + } + }, + "shield2": { + "type": "textbox", + "label": { + "text": "Fire Shield" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 0 + } + }, + "shield3": { + "type": "textbox", + "label": { + "text": "Mirror Shield" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 0 + } + }, + "progressiveshield": { + "type": "textbox", + "label": { + "text": "Progressive Shield" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 3 + } + }, + "mail2": { + "type": "textbox", + "label": { + "text": "Blue Mail" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 0 + } + }, + "mail3": { + "type": "textbox", + "label": { + "text": "Red Mail" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 0 + } + }, + "progressivemail": { + "type": "textbox", + "label": { + "text": "Progressive Mail" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 2 + } + }, + "halfmagic": { + "type": "textbox", + "label": { + "text": "Half Magic" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 1 + } + } + }, + "itemList4": { + "quartermagic": { + "type": "textbox", + "label": { + "text": "Quarter Magic" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 0 + } + }, + "bombsplus5": { + "type": "textbox", + "label": { + "text": "Bomb Cap +5" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 0 + } + }, + "bombsplus10": { + "type": "textbox", + "label": { + "text": "Bomb Cap +10" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 0 + } + }, + "arrowsplus5": { + "type": "textbox", + "label": { + "text": "Arrow Cap +5" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 0 + } + }, + "arrowsplus10": { + "type": "textbox", + "label": { + "text": "Arrow Cap +10" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 0 + } + }, + "arrow1": { + "type": "textbox", + "label": { + "text": "Arrow (1)" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 1 + } + }, + "arrow10": { + "type": "textbox", + "label": { + "text": "Arrow (10)" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 12 + } + }, + "bomb1": { + "type": "textbox", + "label": { + "text": "Bomb (1)" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 0 + } + }, + "bomb3": { + "type": "textbox", + "label": { + "text": "Bomb (3)" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 13 + } + }, + "bomb10": { + "type": "textbox", + "label": { + "text": "Bomb (10)" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 1 + } + }, + "rupee1": { + "type": "textbox", + "label": { + "text": "Rupee (1)" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 2 + } + }, + "rupee5": { + "type": "textbox", + "label": { + "text": "Rupee (5)" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 4 + } + }, + "rupee20": { + "type": "textbox", + "label": { + "text": "Rupee (20)" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 28 + } + }, + "rupee50": { + "type": "textbox", + "label": { + "text": "Rupee (50)" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 7 + } + }, + "rupee100": { + "type": "textbox", + "label": { + "text": "Rupee (100)" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 1 + } + } + }, + "itemList5": { + "rupee300": { + "type": "textbox", + "label": { + "text": "Rupee (300)" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 5 + } + }, + "blueclock": { + "type": "textbox", + "label": { + "text": "Blue Clock" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 0 + } + }, + "greenclock": { + "type": "textbox", + "label": { + "text": "Green Clock" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 0 + } + }, + "redclock": { + "type": "textbox", + "label": { + "text": "Red Clock" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 0 + } + }, + "silversupgrade": { + "type": "textbox", + "label": { + "text": "Silver Arrows Upgrade" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 0 + } + }, + "generickeys": { + "type": "textbox", + "label": { + "text": "Generic Keys" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 0 + } + }, + "triforcepieces": { + "type": "textbox", + "label": { + "text": "Triforce Pieces" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 0 + } + }, + "triforcepiecesgoal": { + "type": "textbox", + "label": { + "text": "Triforce Pieces Goal" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 0 + } + }, + "triforce": { + "type": "textbox", + "label": { + "text": "Triforce (win game)" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 0 + } + }, + "rupoor": { + "type": "textbox", + "label": { + "text": "Rupoor" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 0 + } + }, + "rupoorcost": { + "type": "textbox", + "label": { + "text": "Rupoor Cost" + }, + "manager": "grid", + "managerAttrs": { + "label": { + "sticky": "w" + }, + "default": 10 + } + } + } +} \ No newline at end of file From 2f93bcca9c66ce5d21850b2d2f0660e673d40f31 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 22 Feb 2020 00:42:52 -0800 Subject: [PATCH 098/117] Condense Enemizer options --- gui/randomize/enemizer.py | 48 +++++----- .../gui/randomize/enemizer/checkboxes.json | 8 -- .../randomize/enemizer/leftEnemizerFrame.json | 41 -------- .../enemizer/rightEnemizerFrame.json | 42 --------- .../app/gui/randomize/enemizer/widgets.json | 93 +++++++++++++++++++ 5 files changed, 114 insertions(+), 118 deletions(-) delete mode 100644 resources/app/gui/randomize/enemizer/checkboxes.json delete mode 100644 resources/app/gui/randomize/enemizer/leftEnemizerFrame.json delete mode 100644 resources/app/gui/randomize/enemizer/rightEnemizerFrame.json create mode 100644 resources/app/gui/randomize/enemizer/widgets.json diff --git a/gui/randomize/enemizer.py b/gui/randomize/enemizer.py index 73990baa..3a8dbd80 100644 --- a/gui/randomize/enemizer.py +++ b/gui/randomize/enemizer.py @@ -1,5 +1,5 @@ import os -from tkinter import ttk, filedialog, IntVar, StringVar, Button, Checkbutton, Entry, Frame, Label, LabelFrame, OptionMenu, N, E, W, LEFT, RIGHT, X +from tkinter import ttk, filedialog, IntVar, StringVar, Button, Checkbutton, Entry, Frame, Label, LabelFrame, OptionMenu, N, E, W, LEFT, RIGHT, BOTTOM, X import gui.widgets as widgets import json import os @@ -17,15 +17,28 @@ def enemizer_page(parent,settings): self.frames["checkboxes"] = Frame(self) self.frames["checkboxes"].pack(anchor=W) - with open(os.path.join("resources","app","gui","randomize","enemizer","checkboxes.json")) as checkboxes: - myDict = json.load(checkboxes) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["checkboxes"]) - for key in dictWidgets: - self.widgets[key] = dictWidgets[key] - self.widgets[key].pack(anchor=W) + self.frames["selectOptionsFrame"] = Frame(self) + self.frames["leftEnemizerFrame"] = Frame(self.frames["selectOptionsFrame"]) + self.frames["rightEnemizerFrame"] = Frame(self.frames["selectOptionsFrame"]) + self.frames["bottomEnemizerFrame"] = Frame(self) + self.frames["selectOptionsFrame"].pack(fill=X) + self.frames["leftEnemizerFrame"].pack(side=LEFT) + self.frames["rightEnemizerFrame"].pack(side=RIGHT) + self.frames["bottomEnemizerFrame"].pack(fill=X) + + with open(os.path.join("resources","app","gui","randomize","enemizer","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.widgets[key] = dictWidgets[key] + packAttrs = {"anchor":E} + if self.widgets[key].type == "checkbox": + packAttrs["anchor"] = W + self.widgets[key].pack(packAttrs) ## Enemizer CLI Path - enemizerPathFrame = Frame(self) + enemizerPathFrame = Frame(self.frames["bottomEnemizerFrame"]) enemizerCLIlabel = Label(enemizerPathFrame, text="EnemizerCLI path: ") enemizerCLIlabel.pack(side=LEFT) self.enemizerCLIpathVar = StringVar(value=settings["enemizercli"]) @@ -40,23 +53,4 @@ def enemizer_page(parent,settings): enemizerCLIbrowseButton.pack(side=LEFT) enemizerPathFrame.pack(fill=X) - self.frames["leftEnemizerFrame"] = Frame(self) - self.frames["rightEnemizerFrame"] = Frame(self) - self.frames["leftEnemizerFrame"].pack(side=LEFT, anchor=N) - self.frames["rightEnemizerFrame"].pack(side=RIGHT, anchor=N) - - with open(os.path.join("resources","app","gui","randomize","enemizer","leftEnemizerFrame.json")) as leftEnemizerFrameItems: - myDict = json.load(leftEnemizerFrameItems) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["leftEnemizerFrame"]) - for key in dictWidgets: - self.widgets[key] = dictWidgets[key] - self.widgets[key].pack(anchor=E) - - with open(os.path.join("resources","app","gui","randomize","enemizer","rightEnemizerFrame.json")) as rightEnemizerFrameItems: - myDict = json.load(rightEnemizerFrameItems) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["rightEnemizerFrame"]) - for key in dictWidgets: - self.widgets[key] = dictWidgets[key] - self.widgets[key].pack(anchor=E) - return self,settings diff --git a/resources/app/gui/randomize/enemizer/checkboxes.json b/resources/app/gui/randomize/enemizer/checkboxes.json deleted file mode 100644 index 6f01079b..00000000 --- a/resources/app/gui/randomize/enemizer/checkboxes.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "potshuffle": { - "type": "checkbox", - "label": { - "text": "Pot Shuffle" - } - } -} diff --git a/resources/app/gui/randomize/enemizer/leftEnemizerFrame.json b/resources/app/gui/randomize/enemizer/leftEnemizerFrame.json deleted file mode 100644 index 0c54605d..00000000 --- a/resources/app/gui/randomize/enemizer/leftEnemizerFrame.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "enemyshuffle": { - "type": "selectbox", - "label": { - "text": "Enemy Shuffle" - }, - "managerAttrs": { - "label": { - "side": "left" - }, - "selectbox": { - "side": "right" - } - }, - "options": { - "Vanilla": "none", - "Shuffled": "shuffled", - "Chaos": "chaos" - } - }, - "bossshuffle": { - "type": "selectbox", - "label": { - "text": "Boss Shuffle" - }, - "managerAttrs": { - "label": { - "side": "left" - }, - "selectbox": { - "side": "right" - } - }, - "options": { - "Vanilla": "none", - "Basic": "basic", - "Shuffled": "shuffled", - "Chaos": "chaos" - } - } -} diff --git a/resources/app/gui/randomize/enemizer/rightEnemizerFrame.json b/resources/app/gui/randomize/enemizer/rightEnemizerFrame.json deleted file mode 100644 index 4e3629b6..00000000 --- a/resources/app/gui/randomize/enemizer/rightEnemizerFrame.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "enemydamage": { - "type": "selectbox", - "label": { - "text": "Enemy Damage" - }, - "managerAttrs": { - "label": { - "side": "left" - }, - "selectbox": { - "side": "right" - } - }, - "options": { - "Vanilla": "default", - "Shuffled": "shuffled", - "Chaos": "chaos" - } - }, - "enemyhealth": { - "type": "selectbox", - "label": { - "text": "Enemy Health" - }, - "managerAttrs": { - "label": { - "side": "left" - }, - "selectbox": { - "side": "right" - } - }, - "options": { - "Vanilla": "default", - "Easy": "easy", - "Normal": "normal", - "Hard": "hard", - "Expert": "expert" - } - } -} diff --git a/resources/app/gui/randomize/enemizer/widgets.json b/resources/app/gui/randomize/enemizer/widgets.json new file mode 100644 index 00000000..4095ab5b --- /dev/null +++ b/resources/app/gui/randomize/enemizer/widgets.json @@ -0,0 +1,93 @@ +{ + "checkboxes": { + "potshuffle": { + "type": "checkbox", + "label": { + "text": "Pot Shuffle" + } + } + }, + "leftEnemizerFrame": { + "enemyshuffle": { + "type": "selectbox", + "label": { + "text": "Enemy Shuffle" + }, + "managerAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "Vanilla": "none", + "Shuffled": "shuffled", + "Chaos": "chaos" + } + }, + "bossshuffle": { + "type": "selectbox", + "label": { + "text": "Boss Shuffle" + }, + "managerAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "Vanilla": "none", + "Basic": "basic", + "Shuffled": "shuffled", + "Chaos": "chaos" + } + } + }, + "rightEnemizerFrame": { + "enemydamage": { + "type": "selectbox", + "label": { + "text": "Enemy Damage" + }, + "managerAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "Vanilla": "default", + "Shuffled": "shuffled", + "Chaos": "chaos" + } + }, + "enemyhealth": { + "type": "selectbox", + "label": { + "text": "Enemy Health" + }, + "managerAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "Vanilla": "default", + "Easy": "easy", + "Normal": "normal", + "Hard": "hard", + "Expert": "expert" + } + } + } +} \ No newline at end of file From ad49e2cff788cc7357ff32e5ed81c397de1ac9b6 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 22 Feb 2020 00:47:34 -0800 Subject: [PATCH 099/117] Standardize Entrando options Was basically already condensed --- gui/randomize/entrando.py | 16 +++-- .../app/gui/randomize/entrando/widgets.json | 66 ++++++++++--------- 2 files changed, 44 insertions(+), 38 deletions(-) diff --git a/gui/randomize/entrando.py b/gui/randomize/entrando.py index 4f42a383..3ad6bac4 100644 --- a/gui/randomize/entrando.py +++ b/gui/randomize/entrando.py @@ -15,11 +15,15 @@ def entrando_page(parent): self.frames["widgets"] = Frame(self) self.frames["widgets"].pack(anchor=W) - with open(os.path.join("resources","app","gui","randomize","entrando","widgets.json")) as myWidgets: - myDict = json.load(myWidgets) - 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) + with open(os.path.join("resources","app","gui","randomize","entrando","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.widgets[key] = dictWidgets[key] + packAttrs = {"anchor":E} + if self.widgets[key].type == "checkbox": + packAttrs["anchor"] = W + self.widgets[key].pack(packAttrs) return self diff --git a/resources/app/gui/randomize/entrando/widgets.json b/resources/app/gui/randomize/entrando/widgets.json index ec1cc4c7..1a3ae127 100644 --- a/resources/app/gui/randomize/entrando/widgets.json +++ b/resources/app/gui/randomize/entrando/widgets.json @@ -1,38 +1,40 @@ { - "openpyramid": { - "type": "checkbox", - "label": { - "text": "Pre-open Pyramid Hole" - } - }, - "shuffleganon": { - "type": "checkbox", - "label": { - "text": "Include Ganon's Tower and Pyramid Hole in shuffle pool" - } - }, - "entranceshuffle": { - "type": "selectbox", - "label": { - "text": "Entrance Shuffle" + "widgets": { + "openpyramid": { + "type": "checkbox", + "label": { + "text": "Pre-open Pyramid Hole" + } }, - "managerAttrs": { - "label": { "side": "left" }, - "selectbox": { "side": "right" } + "shuffleganon": { + "type": "checkbox", + "label": { + "text": "Include Ganon's Tower and Pyramid Hole in shuffle pool" + } }, - "options": { - "Vanilla": "vanilla", - "Simple": "simple", - "Restricted": "restricted", - "Full": "full", - "Crossed": "crossed", - "Insanity": "insanity", - "Restricted (Legacy)": "restricted_legacy", - "Full (Legacy)": "full_legacy", - "Madness (Legacy)": "madness_legacy", - "Insanity (Legacy)": "insanity_legacy", - "Dungeons + Full": "dungeonsfull", - "Dungeons + Simple": "dungeonssimple" + "entranceshuffle": { + "type": "selectbox", + "label": { + "text": "Entrance Shuffle" + }, + "managerAttrs": { + "label": { "side": "left" }, + "selectbox": { "side": "right" } + }, + "options": { + "Vanilla": "vanilla", + "Simple": "simple", + "Restricted": "restricted", + "Full": "full", + "Crossed": "crossed", + "Insanity": "insanity", + "Restricted (Legacy)": "restricted_legacy", + "Full (Legacy)": "full_legacy", + "Madness (Legacy)": "madness_legacy", + "Insanity (Legacy)": "insanity_legacy", + "Dungeons + Full": "dungeonsfull", + "Dungeons + Simple": "dungeonssimple" + } } } } From 0aa7750b978054b482be1914b57ca33a222fca09 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 22 Feb 2020 00:52:02 -0800 Subject: [PATCH 100/117] Condense Game Options --- gui/randomize/gameoptions.py | 30 ++-- .../gui/randomize/gameoptions/checkboxes.json | 21 --- .../gameoptions/leftRomOptionsFrame.json | 45 ------ .../gameoptions/rightRomOptionsFrame.json | 63 --------- .../gui/randomize/gameoptions/widgets.json | 131 ++++++++++++++++++ 5 files changed, 141 insertions(+), 149 deletions(-) delete mode 100644 resources/app/gui/randomize/gameoptions/checkboxes.json delete mode 100644 resources/app/gui/randomize/gameoptions/leftRomOptionsFrame.json delete mode 100644 resources/app/gui/randomize/gameoptions/rightRomOptionsFrame.json create mode 100644 resources/app/gui/randomize/gameoptions/widgets.json diff --git a/gui/randomize/gameoptions.py b/gui/randomize/gameoptions.py index dba9751a..eb107df4 100644 --- a/gui/randomize/gameoptions.py +++ b/gui/randomize/gameoptions.py @@ -17,24 +17,21 @@ def gameoptions_page(top, parent): self.frames["checkboxes"] = Frame(self) self.frames["checkboxes"].pack(anchor=W) - with open(os.path.join("resources","app","gui","randomize","gameoptions","checkboxes.json")) as checkboxes: - myDict = json.load(checkboxes) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["checkboxes"]) - for key in dictWidgets: - self.widgets[key] = dictWidgets[key] - self.widgets[key].pack(anchor=W) - self.frames["leftRomOptionsFrame"] = Frame(self) self.frames["rightRomOptionsFrame"] = Frame(self) self.frames["leftRomOptionsFrame"].pack(side=LEFT) self.frames["rightRomOptionsFrame"].pack(side=RIGHT) - with open(os.path.join("resources","app","gui","randomize","gameoptions","leftRomOptionsFrame.json")) as leftRomOptionsFrameItems: - myDict = json.load(leftRomOptionsFrameItems) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["leftRomOptionsFrame"]) - for key in dictWidgets: - self.widgets[key] = dictWidgets[key] - self.widgets[key].pack(anchor=E) + with open(os.path.join("resources","app","gui","randomize","gameoptions","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.widgets[key] = dictWidgets[key] + packAttrs = {"anchor":E} + if self.widgets[key].type == "checkbox": + packAttrs["anchor"] = W + self.widgets[key].pack(packAttrs) ## Sprite selection spriteDialogFrame = Frame(self.frames["leftRomOptionsFrame"]) @@ -62,13 +59,6 @@ def gameoptions_page(top, parent): spriteSelectButton.pack(side=LEFT) spriteDialogFrame.pack(anchor=E) - with open(os.path.join("resources","app","gui","randomize","gameoptions","rightRomOptionsFrame.json")) as rightRomOptionsFrameItems: - myDict = json.load(rightRomOptionsFrameItems) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["rightRomOptionsFrame"]) - for key in dictWidgets: - self.widgets[key] = dictWidgets[key] - self.widgets[key].pack(anchor=E) - return self diff --git a/resources/app/gui/randomize/gameoptions/checkboxes.json b/resources/app/gui/randomize/gameoptions/checkboxes.json deleted file mode 100644 index ba7b0f9c..00000000 --- a/resources/app/gui/randomize/gameoptions/checkboxes.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "hints": { - "type": "checkbox", - "label": { - "text": "Include Helpful Hints" - }, - "default": "true" - }, - "nobgm": { - "type": "checkbox", - "label": { - "text": "Disable Music & MSU-1" - } - }, - "quickswap": { - "type": "checkbox", - "label": { - "text": "L/R Quickswapping" - } - } -} diff --git a/resources/app/gui/randomize/gameoptions/leftRomOptionsFrame.json b/resources/app/gui/randomize/gameoptions/leftRomOptionsFrame.json deleted file mode 100644 index ffa04198..00000000 --- a/resources/app/gui/randomize/gameoptions/leftRomOptionsFrame.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "heartcolor": { - "type": "selectbox", - "label": { - "text": "Heart Color" - }, - "managerAttrs": { - "label": { - "side": "left" - }, - "selectbox": { - "side": "right" - } - }, - "options": { - "Red": "red", - "Blue": "blue", - "Green": "green", - "Yellow": "yellow", - "Random": "random" - } - }, - "heartbeep": { - "type": "selectbox", - "label": { - "text": "Heart Beep sound rate" - }, - "managerAttrs": { - "label": { - "side": "left" - }, - "selectbox": { - "side": "right" - }, - "default": "Normal" - }, - "options": { - "Double": "double", - "Normal": "normal", - "Half": "half", - "Quarter": "quarter", - "Off": "off" - } - } -} diff --git a/resources/app/gui/randomize/gameoptions/rightRomOptionsFrame.json b/resources/app/gui/randomize/gameoptions/rightRomOptionsFrame.json deleted file mode 100644 index ba46ab97..00000000 --- a/resources/app/gui/randomize/gameoptions/rightRomOptionsFrame.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "menuspeed": { - "type": "selectbox", - "label": { - "text": "Menu Speed" - }, - "managerAttrs": { - "label": { - "side": "left" - }, - "selectbox": { - "side": "right" - }, - "default": "Normal" - }, - "options": { - "Instant": "instant", - "Quadruple": "quadruple", - "Triple": "triple", - "Double": "double", - "Normal": "normal", - "Half": "half" - } - }, - "owpalettes": { - "type": "selectbox", - "label": { - "text": "Overworld Palettes" - }, - "managerAttrs": { - "label": { - "side": "left" - }, - "selectbox": { - "side": "right" - } - }, - "options": { - "Default": "default", - "Random": "random", - "Blackout": "blackout" - } - }, - "uwpalettes": { - "type": "selectbox", - "label": { - "text": "Underworld Palettes" - }, - "managerAttrs": { - "label": { - "side": "left" - }, - "selectbox": { - "side": "right" - } - }, - "options": { - "Default": "default", - "Random": "random", - "Blackout": "blackout" - } - } -} diff --git a/resources/app/gui/randomize/gameoptions/widgets.json b/resources/app/gui/randomize/gameoptions/widgets.json new file mode 100644 index 00000000..0a0a11ce --- /dev/null +++ b/resources/app/gui/randomize/gameoptions/widgets.json @@ -0,0 +1,131 @@ +{ + "checkboxes": { + "hints": { + "type": "checkbox", + "label": { + "text": "Include Helpful Hints" + }, + "default": "true" + }, + "nobgm": { + "type": "checkbox", + "label": { + "text": "Disable Music & MSU-1" + } + }, + "quickswap": { + "type": "checkbox", + "label": { + "text": "L/R Quickswapping" + } + } + }, + "leftRomOptionsFrame": { + "heartcolor": { + "type": "selectbox", + "label": { + "text": "Heart Color" + }, + "managerAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "Red": "red", + "Blue": "blue", + "Green": "green", + "Yellow": "yellow", + "Random": "random" + } + }, + "heartbeep": { + "type": "selectbox", + "label": { + "text": "Heart Beep sound rate" + }, + "managerAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + }, + "default": "Normal" + }, + "options": { + "Double": "double", + "Normal": "normal", + "Half": "half", + "Quarter": "quarter", + "Off": "off" + } + } + }, + "rightRomOptionsFrame": { + "menuspeed": { + "type": "selectbox", + "label": { + "text": "Menu Speed" + }, + "managerAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + }, + "default": "Normal" + }, + "options": { + "Instant": "instant", + "Quadruple": "quadruple", + "Triple": "triple", + "Double": "double", + "Normal": "normal", + "Half": "half" + } + }, + "owpalettes": { + "type": "selectbox", + "label": { + "text": "Overworld Palettes" + }, + "managerAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "Default": "default", + "Random": "random", + "Blackout": "blackout" + } + }, + "uwpalettes": { + "type": "selectbox", + "label": { + "text": "Underworld Palettes" + }, + "managerAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "Default": "default", + "Random": "random", + "Blackout": "blackout" + } + } + } +} From 6134cf70582762b8ac3d8b2b3af673895fe1a442 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 22 Feb 2020 00:54:35 -0800 Subject: [PATCH 101/117] Condense Item Rando options --- gui/randomize/item.py | 29 +- .../app/gui/randomize/item/checkboxes.json | 8 - .../app/gui/randomize/item/leftItemFrame.json | 132 --------- .../gui/randomize/item/rightItemFrame.json | 124 -------- resources/app/gui/randomize/item/widgets.json | 266 ++++++++++++++++++ 5 files changed, 276 insertions(+), 283 deletions(-) delete mode 100644 resources/app/gui/randomize/item/checkboxes.json delete mode 100644 resources/app/gui/randomize/item/leftItemFrame.json delete mode 100644 resources/app/gui/randomize/item/rightItemFrame.json create mode 100644 resources/app/gui/randomize/item/widgets.json diff --git a/gui/randomize/item.py b/gui/randomize/item.py index 57609b1d..f962d574 100644 --- a/gui/randomize/item.py +++ b/gui/randomize/item.py @@ -15,30 +15,21 @@ def item_page(parent): self.frames["checkboxes"] = Frame(self) self.frames["checkboxes"].pack(anchor=W) - with open(os.path.join("resources","app","gui","randomize","item","checkboxes.json")) as checkboxes: - myDict = json.load(checkboxes) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["checkboxes"]) - for key in dictWidgets: - self.widgets[key] = dictWidgets[key] - self.widgets[key].pack(anchor=W) self.frames["leftItemFrame"] = Frame(self) self.frames["rightItemFrame"] = Frame(self) self.frames["leftItemFrame"].pack(side=LEFT) self.frames["rightItemFrame"].pack(side=RIGHT) - with open(os.path.join("resources","app","gui","randomize","item","leftItemFrame.json")) as leftItemFrameItems: - myDict = json.load(leftItemFrameItems) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["leftItemFrame"]) - for key in dictWidgets: - self.widgets[key] = dictWidgets[key] - self.widgets[key].pack(anchor=E) - - with open(os.path.join("resources","app","gui","randomize","item","rightItemFrame.json")) as rightItemFrameItems: - myDict = json.load(rightItemFrameItems) - dictWidgets = widgets.make_widgets_from_dict(self, myDict, self.frames["rightItemFrame"]) - for key in dictWidgets: - self.widgets[key] = dictWidgets[key] - self.widgets[key].pack(anchor=E) + with open(os.path.join("resources","app","gui","randomize","item","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.widgets[key] = dictWidgets[key] + packAttrs = {"anchor":E} + if self.widgets[key].type == "checkbox": + packAttrs["anchor"] = W + self.widgets[key].pack(packAttrs) return self diff --git a/resources/app/gui/randomize/item/checkboxes.json b/resources/app/gui/randomize/item/checkboxes.json deleted file mode 100644 index e75b2daf..00000000 --- a/resources/app/gui/randomize/item/checkboxes.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "retro": { - "type": "checkbox", - "label": { - "text": "Retro mode (universal keys)" - } - } -} diff --git a/resources/app/gui/randomize/item/leftItemFrame.json b/resources/app/gui/randomize/item/leftItemFrame.json deleted file mode 100644 index 85e8eed0..00000000 --- a/resources/app/gui/randomize/item/leftItemFrame.json +++ /dev/null @@ -1,132 +0,0 @@ -{ - "worldstate": { - "type": "selectbox", - "label": { - "text": "World State" - }, - "managerAttrs": { - "label": { - "side": "left" - }, - "selectbox": { - "side": "right" - }, - "default": "Open" - }, - "options": { - "Standard": "standard", - "Open": "open", - "Inverted": "inverted" - } - }, - "logiclevel": { - "type": "selectbox", - "label": { - "text": "Logic Level" - }, - "managerAttrs": { - "label": { - "side": "left" - }, - "selectbox": { - "side": "right" - } - }, - "options": { - "No Glitches": "noglitches", - "Minor Glitches": "minorglitches", - "No Logic": "nologic" - } - }, - "goal": { - "type": "selectbox", - "label": { - "text": "Goal" - }, - "managerAttrs": { - "label": { - "side": "left" - }, - "selectbox": { - "side": "right" - } - }, - "options": { - "Defeat Ganon": "ganon", - "Master Sword Pedestal": "pedestal", - "All Dungeons": "dungeons", - "Triforce Hunt": "triforcehunt", - "Crystals": "crystals" - } - }, - "crystals_gt": { - "type": "selectbox", - "label": { - "text": "Crystals to open GT" - }, - "managerAttrs": { - "label": { - "side": "left" - }, - "selectbox": { - "side": "right" - } - }, - "options": { - "0": "0", - "1": "1", - "2": "2", - "3": "3", - "4": "4", - "5": "5", - "6": "6", - "7": "7", - "Random": "random" - } - }, - "crystals_ganon": { - "type": "selectbox", - "label": { - "text": "Crystals to harm Ganon" - }, - "managerAttrs": { - "label": { - "side": "left" - }, - "selectbox": { - "side": "right" - } - }, - "options": { - "0": "0", - "1": "1", - "2": "2", - "3": "3", - "4": "4", - "5": "5", - "6": "6", - "7": "7", - "Random": "random" - } - }, - "weapons": { - "type": "selectbox", - "label": { - "text": "Weapons" - }, - "managerAttrs": { - "label": { - "side": "left" - }, - "selectbox": { - "side": "right" - } - }, - "options": { - "Randomized": "random", - "Assured": "assured", - "Swordless": "swordless", - "Vanilla": "vanilla" - } - } -} diff --git a/resources/app/gui/randomize/item/rightItemFrame.json b/resources/app/gui/randomize/item/rightItemFrame.json deleted file mode 100644 index 0a1b6fff..00000000 --- a/resources/app/gui/randomize/item/rightItemFrame.json +++ /dev/null @@ -1,124 +0,0 @@ -{ - "itempool": { - "type": "selectbox", - "label": { - "text": "Item Pool" - }, - "managerAttrs": { - "label": { - "side": "left" - }, - "selectbox": { - "side": "right" - } - }, - "options": { - "Normal": "normal", - "Hard": "hard", - "Expert": "expert" - } - }, - "itemfunction": { - "type": "selectbox", - "label": { - "text": "Item Functionality" - }, - "managerAttrs": { - "label": { - "side": "left" - }, - "selectbox": { - "side": "right" - } - }, - "options": { - "Normal": "normal", - "Hard": "hard", - "Expert": "expert" - } - }, - "timer": { - "type": "selectbox", - "label": { - "text": "Timer Setting" - }, - "managerAttrs": { - "label": { - "side": "left" - }, - "selectbox": { - "side": "right" - } - }, - "options": { - "No Timer": "none", - "Stopwatch": "display", - "Timed": "timed", - "Timed OHKO": "timed-ohko", - "OHKO": "ohko", - "Timed Countdown": "timed-countdown" - } - }, - "progressives": { - "type": "selectbox", - "label": { - "text": "Progressive Items" - }, - "managerAttrs": { - "label": { - "side": "left" - }, - "selectbox": { - "side": "right" - } - }, - "options": { - "On": "on", - "Off": "off", - "Random": "random" - } - }, - "accessibility": { - "type": "selectbox", - "label": { - "text": "Accessibility" - }, - "managerAttrs": { - "label": { - "side": "left" - }, - "selectbox": { - "side": "right" - } - }, - "options": { - "100% Inventory": "items", - "100% Locations": "locations", - "Beatable": "none" - } - }, - "sortingalgo": { - "type": "selectbox", - "label": { - "text": "Item Sorting" - }, - "managerAttrs": { - "label": { - "side": "left" - }, - "selectbox": { - "side": "right" - }, - "default": "Balanced" - }, - "options": { - "Freshness": "freshness", - "Flood": "flood", - "VT8.21": "vt21", - "VT8.22": "vt22", - "VT8.25": "vt25", - "VT8.26": "vt26", - "Balanced": "balanced" - } - } -} diff --git a/resources/app/gui/randomize/item/widgets.json b/resources/app/gui/randomize/item/widgets.json new file mode 100644 index 00000000..0c427418 --- /dev/null +++ b/resources/app/gui/randomize/item/widgets.json @@ -0,0 +1,266 @@ +{ + "checkboxes": { + "retro": { + "type": "checkbox", + "label": { + "text": "Retro mode (universal keys)" + } + } + }, + "leftItemFrame": { + "worldstate": { + "type": "selectbox", + "label": { + "text": "World State" + }, + "managerAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + }, + "default": "Open" + }, + "options": { + "Standard": "standard", + "Open": "open", + "Inverted": "inverted" + } + }, + "logiclevel": { + "type": "selectbox", + "label": { + "text": "Logic Level" + }, + "managerAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "No Glitches": "noglitches", + "Minor Glitches": "minorglitches", + "No Logic": "nologic" + } + }, + "goal": { + "type": "selectbox", + "label": { + "text": "Goal" + }, + "managerAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "Defeat Ganon": "ganon", + "Master Sword Pedestal": "pedestal", + "All Dungeons": "dungeons", + "Triforce Hunt": "triforcehunt", + "Crystals": "crystals" + } + }, + "crystals_gt": { + "type": "selectbox", + "label": { + "text": "Crystals to open GT" + }, + "managerAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "Random": "random" + } + }, + "crystals_ganon": { + "type": "selectbox", + "label": { + "text": "Crystals to harm Ganon" + }, + "managerAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "Random": "random" + } + }, + "weapons": { + "type": "selectbox", + "label": { + "text": "Weapons" + }, + "managerAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "Randomized": "random", + "Assured": "assured", + "Swordless": "swordless", + "Vanilla": "vanilla" + } + } + }, + "rightItemFrame": { + "itempool": { + "type": "selectbox", + "label": { + "text": "Item Pool" + }, + "managerAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "Normal": "normal", + "Hard": "hard", + "Expert": "expert" + } + }, + "itemfunction": { + "type": "selectbox", + "label": { + "text": "Item Functionality" + }, + "managerAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "Normal": "normal", + "Hard": "hard", + "Expert": "expert" + } + }, + "timer": { + "type": "selectbox", + "label": { + "text": "Timer Setting" + }, + "managerAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "No Timer": "none", + "Stopwatch": "display", + "Timed": "timed", + "Timed OHKO": "timed-ohko", + "OHKO": "ohko", + "Timed Countdown": "timed-countdown" + } + }, + "progressives": { + "type": "selectbox", + "label": { + "text": "Progressive Items" + }, + "managerAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "On": "on", + "Off": "off", + "Random": "random" + } + }, + "accessibility": { + "type": "selectbox", + "label": { + "text": "Accessibility" + }, + "managerAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "100% Inventory": "items", + "100% Locations": "locations", + "Beatable": "none" + } + }, + "sortingalgo": { + "type": "selectbox", + "label": { + "text": "Item Sorting" + }, + "managerAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + }, + "default": "Balanced" + }, + "options": { + "Freshness": "freshness", + "Flood": "flood", + "VT8.21": "vt21", + "VT8.22": "vt22", + "VT8.25": "vt25", + "VT8.26": "vt26", + "Balanced": "balanced" + } + } + } +} From bd6685d7194d494d873e8a8276fcef90d4007c76 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 22 Feb 2020 01:20:08 -0800 Subject: [PATCH 102/117] Fix erroneous counts --- CLI.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/CLI.py b/CLI.py index 980a7bb7..c354da1b 100644 --- a/CLI.py +++ b/CLI.py @@ -398,7 +398,7 @@ def get_settings(): 1, 1, 0, - 1, + 0, 2, 1, 1, @@ -426,7 +426,8 @@ def get_settings(): 1, 12, 0, - 13, + 16, + 1, 2, 4, 28, @@ -437,13 +438,12 @@ def get_settings(): 0, 0, 0, - 2, - 1, 0, 0, 0, - 10, - 0 + 0, + 0, + 10 ], "rom": os.path.join(".","Zelda no Densetsu - Kamigami no Triforce (Japan).sfc"), "sprite": None, From e898ae078b6efc472cdb468c45123c89877f9797 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 22 Feb 2020 01:43:39 -0800 Subject: [PATCH 103/117] Try to fix some options --- CLI.py | 4 ++-- Main.py | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/CLI.py b/CLI.py index c354da1b..c8bdab49 100644 --- a/CLI.py +++ b/CLI.py @@ -187,7 +187,7 @@ def parse_arguments(argv, no_defaults=False): base game. ''') parser.add_argument('--experimental', default=defval(settings["experimental"] != 0), help='Enable experimental features', action='store_true') - parser.add_argument('--dungeon_counters', default=defval(settings["dungeon_counters"]), help='Enable dungeon chest counters', action='store_true') + parser.add_argument('--dungeon_counters', default=defval(settings["dungeon_counters"]), help='Enable dungeon chest counters', const='off', nargs='?', choices=['off', 'on', 'pickup']) parser.add_argument('--crystals_ganon', default=defval(settings["crystals_ganon"]), const='7', nargs='?', choices=['random', '0', '1', '2', '3', '4', '5', '6', '7'], help='''\ How many crystals are needed to defeat ganon. Any other @@ -247,7 +247,7 @@ def parse_arguments(argv, no_defaults=False): Make telepathic tiles and storytellers give helpful hints. ''', action='store_true') # included for backwards compatibility - parser.add_argument('--shuffleganon', help=argparse.SUPPRESS, action='store_true', default=defval(True)) + parser.add_argument('--shuffleganon', help=argparse.SUPPRESS, action='store_true', default=defval(settings["shuffleganon"] != 0)) parser.add_argument('--no-shuffleganon', help='''\ If set, the Pyramid Hole and Ganon's Tower are not included entrance shuffle pool. diff --git a/Main.py b/Main.py index 859baaeb..2c7670f8 100644 --- a/Main.py +++ b/Main.py @@ -57,7 +57,6 @@ def main(args, seed=None): world.enemy_health = args.enemy_health.copy() world.enemy_damage = args.enemy_damage.copy() world.beemizer = args.beemizer.copy() - world.dungeon_counters = args.dungeon_counters.copy() world.experimental = args.experimental.copy() world.dungeon_counters = args.dungeon_counters.copy() From 16f997a03b352b41c2edaa0033acf658f8494e7d Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 22 Feb 2020 01:56:50 -0800 Subject: [PATCH 104/117] Add some additional sprite data Plug ALttPR Sprite Previews page Shameless plug for SpriteSomething --- classes/SpriteSelector.py | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/classes/SpriteSelector.py b/classes/SpriteSelector.py index b192532d..7e527d05 100644 --- a/classes/SpriteSelector.py +++ b/classes/SpriteSelector.py @@ -6,6 +6,7 @@ import random import shutil from urllib.parse import urlparse from urllib.request import urlopen +import webbrowser from GuiUtils import ToolTips, set_icon, BackgroundTaskProgress from Rom import Sprite from Utils import is_bundled, local_path, output_path, open_file @@ -27,17 +28,31 @@ class SpriteSelector(object): self.window['pady'] = 5 self.all_sprites = [] + def open_official_sprite_listing(_evt): + webbrowser.open("http://alttpr.com/sprite_preview") + def open_unofficial_sprite_dir(_evt): open_file(self.unofficial_sprite_dir) - official_frametitle = Label(self.window, text='Official Sprites') + def open_spritesomething_listing(_evt): + webbrowser.open("https://artheau.github.io/SpriteSomething/?mode=zelda3/link") + + official_frametitle = Frame(self.window) + official_title_text = Label(official_frametitle, text="Official Sprites") + official_title_link = Label(official_frametitle, text="(open)", fg="blue", cursor="hand2") + official_title_text.pack(side=LEFT) + official_title_link.pack(side=LEFT) + official_title_link.bind("", open_official_sprite_listing) unofficial_frametitle = Frame(self.window) - title_text = Label(unofficial_frametitle, text="Unofficial Sprites") - title_link = Label(unofficial_frametitle, text="(open)", fg="blue", cursor="hand2") - title_text.pack(side=LEFT) - title_link.pack(side=LEFT) - title_link.bind("", open_unofficial_sprite_dir) + unofficial_title_text = Label(unofficial_frametitle, text="Unofficial Sprites") + unofficial_title_link = Label(unofficial_frametitle, text="(open)", fg="blue", cursor="hand2") + unofficial_title_text.pack(side=LEFT) + unofficial_title_link.pack(side=LEFT) + unofficial_title_link.bind("", open_unofficial_sprite_dir) + spritesomething_title_link = Label(unofficial_frametitle, text="(SpriteSomething)", fg="blue", cursor="hand2") + spritesomething_title_link.pack(side=LEFT) + spritesomething_title_link.bind("", open_spritesomething_listing) self.icon_section(official_frametitle, self.official_sprite_dir+'/*', 'Official sprites not found. Click "Update official sprites" to download them.') self.icon_section(unofficial_frametitle, self.unofficial_sprite_dir+'/*', 'Put sprites in the unofficial sprites folder (see open link above) to have them appear here.') From 7a3855a17aef9de6b092cb5c5e974db46d53331d Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 22 Feb 2020 02:43:56 -0800 Subject: [PATCH 105/117] Fix Custom Item Pool (again) --- CLI.py | 142 +++++++++--------- gui/bottom.py | 19 +-- .../app/gui/custom/overview/widgets.json | 2 +- 3 files changed, 82 insertions(+), 81 deletions(-) diff --git a/CLI.py b/CLI.py index c8bdab49..c01e44ca 100644 --- a/CLI.py +++ b/CLI.py @@ -373,77 +373,77 @@ def get_settings(): "race": False, "custom": False, "customitemarray": [ - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 4, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 2, - 1, - 1, - 24, - 10, - 1, - 0, - 0, - 0, - 0, - 4, - 0, - 0, - 0, - 3, - 0, - 0, - 2, - 1, - 0, - 0, - 0, - 0, - 0, - 1, - 12, - 0, - 16, - 1, - 2, - 4, - 28, - 7, - 1, - 5, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 10 + 0, # Bow + 2, # Progessive Bow + 1, # Blue Boomerang + 1, # Red Boomerang + 1, # Hookshot + 1, # Mushroom + 1, # Magic Powder + 1, # Fire Rod + 1, # Ice Rod + 1, # Bombos + 1, # Ether + 1, # Quake + 1, # Lamp + 1, # Hammer + 1, # Shovel + 1, # Flute + 1, # Bug Net + 1, # Book + 4, # Bottle + 1, # Cane of Somaria + 1, # Cane of Byrna + 1, # Magic Cape + 1, # Magic Mirror + 1, # Pegasus Boots + 0, # Power Glove + 0, # Titan's Mitt + 2, # Progressive Glove + 1, # Flippers + 1, # Moon Pearl + 24, # Piece of Heart + 10, # Heart Container + 1, # Sanctuary Heart + 0, # FS + 0, # MS + 0, # TS + 0, # GS + 4, # Progressive Sword + 0, # Fighters' Shield + 0, # Fire Shield + 0, # Mirror Shield + 3, # Progressive Shield + 0, # Blue Mail + 0, # Red Mail + 2, # Progressive Mail + 1, # Half Magic + 0, # Quarter Magic + 0, # Bombs + 5 + 0, # Bombs +10 + 0, # Arrows + 5 + 0, # Arrows +10 + 1, # Single Arrow + 12, # 10 Arrows + 0, # Single Bomb + 16, # 3 Bombs + 1, # 10 Bombs + 2, # 1 Rupee + 4, # 5 Rupees + 28, # 20 Rupees + 7, # 50 Rupees + 1, # 100 Rupees + 5, # 300 Rupees + 0, # Blue Clock + 0, # Green Clock + 0, # Red Clock + 0, # Silver Arrows Upgrade + 0, # Generic Keys + 0, # Triforce Pieces + 0, # Triforce Pieces Goal + 0, # Triforce (win game) + 0, # Rupoors + 10 # Rupoor Cost ], "rom": os.path.join(".","Zelda no Densetsu - Kamigami no Triforce (Japan).sfc"), "sprite": None, diff --git a/gui/bottom.py b/gui/bottom.py index eafa9ebb..12a1dc51 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -179,15 +179,16 @@ def create_guiargs(parent): setattr(guiargs,"adjust." + internal, parent.pages["adjust"].content.widgets[adjustarg].storageVar.get()) customitems = [ - "bow", "silversupgrade", "boomerang", "redmerang", "hookshot", "mushroom", "powder", "firerod", - "icerod", "bombos", "ether", "quake", "lamp", "hammer", "shovel", "flute", "bugnet", - "book", "bottle", "somaria", "byrna", "cape", "mirror", "boots", "powerglove", "titansmitt", - "progressiveglove", "flippers", "pearl", "heartpiece", "heartcontainer", "sancheart", "sword1", "sword2", - "sword3", "sword4", "progressivesword", "shield1", "shield2", "shield3", "progressiveshield", "mail2", - "mail3", "progressivemail", "halfmagic", "quartermagic", "bombsplus5", "bombsplus10", "arrowsplus5", "arrowsplus10", - "arrow1", "arrow10", "bomb1", "bomb3", "rupee1", "rupee5", "rupee20", "rupee50", "rupee100", - "rupee300", "rupoor", "blueclock", "greenclock", "redclock", "progressivebow", "bomb10", "triforcepieces", "triforcepiecesgoal", - "triforce", "rupoorcost", "generickeys" + "bow", "progressivebow", "boomerang", "redmerang", "hookshot", "mushroom", "powder", "firerod", + "icerod", "bombos", "ether", "quake", "lamp", "hammer", "shovel", + "flute", "bugnet", "book", "bottle", "somaria", "byrna", "cape", "mirror", + "boots", "powerglove", "titansmitt", "progressiveglove", "flippers", "pearl", "heartpiece", + "heartcontainer", "sancheart", "sword1", "sword2", "sword3", "sword4", "progressivesword", + "shield1", "shield2", "shield3", "progressiveshield", "mail2", + "mail3", "progressivemail", "halfmagic", "quartermagic", "bombsplus5", "bombsplus10", "arrowsplus5", "arrowsplus10", + "arrow1", "arrow10", "bomb1", "bomb3", "bomb10", "rupee1", "rupee5", "rupee20", + "rupee50", "rupee100", "rupee300", "blueclock", "greenclock", "redclock", "silversupgrade", "generickeys", + "triforcepieces", "triforcepiecesgoal", "triforce", "rupoor", "rupoorcost" ] guiargs.customitemarray = [] for customitem in customitems: diff --git a/resources/app/gui/custom/overview/widgets.json b/resources/app/gui/custom/overview/widgets.json index c57eead1..faaa9637 100644 --- a/resources/app/gui/custom/overview/widgets.json +++ b/resources/app/gui/custom/overview/widgets.json @@ -705,7 +705,7 @@ "label": { "sticky": "w" }, - "default": 13 + "default": 16 } }, "bomb10": { From 55fee9317d9880218b02cddf3c53246b4cf5e913 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sat, 22 Feb 2020 02:49:11 -0800 Subject: [PATCH 106/117] Add Enemizer CLI download --- gui/randomize/enemizer.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/gui/randomize/enemizer.py b/gui/randomize/enemizer.py index 3a8dbd80..cb78281c 100644 --- a/gui/randomize/enemizer.py +++ b/gui/randomize/enemizer.py @@ -3,8 +3,12 @@ from tkinter import ttk, filedialog, IntVar, StringVar, Button, Checkbutton, Ent import gui.widgets as widgets import json import os +import webbrowser def enemizer_page(parent,settings): + def open_enemizer_download(_evt): + webbrowser.open("https://github.com/Bonta0/Enemizer/releases") + # Enemizer self = ttk.Frame(parent) @@ -41,6 +45,9 @@ def enemizer_page(parent,settings): enemizerPathFrame = Frame(self.frames["bottomEnemizerFrame"]) enemizerCLIlabel = Label(enemizerPathFrame, text="EnemizerCLI path: ") enemizerCLIlabel.pack(side=LEFT) + enemizerURL = Label(enemizerPathFrame, text="(get online)", fg="blue", cursor="hand2") + enemizerURL.pack(side=LEFT) + enemizerURL.bind("", open_enemizer_download) self.enemizerCLIpathVar = StringVar(value=settings["enemizercli"]) enemizerCLIpathEntry = Entry(enemizerPathFrame, textvariable=self.enemizerCLIpathVar) enemizerCLIpathEntry.pack(side=LEFT, fill=X, expand=True) From baec0e454819ffc38c4835274e06108a827ebf67 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sun, 23 Feb 2020 16:21:39 -0800 Subject: [PATCH 107/117] Fix Custom Item Pool (again again) --- CLI.py | 148 +++++++++++++++---------------- ItemList.py | 194 +++++++++++++++++++++-------------------- classes/constants.py | 21 +++++ gui/bottom.py | 18 +--- gui/custom/overview.py | 7 +- 5 files changed, 204 insertions(+), 184 deletions(-) create mode 100644 classes/constants.py diff --git a/CLI.py b/CLI.py index c01e44ca..0cdfb102 100644 --- a/CLI.py +++ b/CLI.py @@ -13,6 +13,8 @@ from Rom import get_sprite_from_name from Utils import is_bundled, close_console from Fill import FillError +import classes.constants as CONST + class ArgumentDefaultsHelpFormatter(argparse.RawTextHelpFormatter): @@ -372,79 +374,79 @@ def get_settings(): "remote_items": False, "race": False, "custom": False, - "customitemarray": [ - 0, # Bow - 2, # Progessive Bow - 1, # Blue Boomerang - 1, # Red Boomerang - 1, # Hookshot - 1, # Mushroom - 1, # Magic Powder - 1, # Fire Rod - 1, # Ice Rod - 1, # Bombos - 1, # Ether - 1, # Quake - 1, # Lamp - 1, # Hammer - 1, # Shovel - 1, # Flute - 1, # Bug Net - 1, # Book - 4, # Bottle - 1, # Cane of Somaria - 1, # Cane of Byrna - 1, # Magic Cape - 1, # Magic Mirror - 1, # Pegasus Boots - 0, # Power Glove - 0, # Titan's Mitt - 2, # Progressive Glove - 1, # Flippers - 1, # Moon Pearl - 24, # Piece of Heart - 10, # Heart Container - 1, # Sanctuary Heart - 0, # FS - 0, # MS - 0, # TS - 0, # GS - 4, # Progressive Sword - 0, # Fighters' Shield - 0, # Fire Shield - 0, # Mirror Shield - 3, # Progressive Shield - 0, # Blue Mail - 0, # Red Mail - 2, # Progressive Mail - 1, # Half Magic - 0, # Quarter Magic - 0, # Bombs + 5 - 0, # Bombs +10 - 0, # Arrows + 5 - 0, # Arrows +10 - 1, # Single Arrow - 12, # 10 Arrows - 0, # Single Bomb - 16, # 3 Bombs - 1, # 10 Bombs - 2, # 1 Rupee - 4, # 5 Rupees - 28, # 20 Rupees - 7, # 50 Rupees - 1, # 100 Rupees - 5, # 300 Rupees - 0, # Blue Clock - 0, # Green Clock - 0, # Red Clock - 0, # Silver Arrows Upgrade - 0, # Generic Keys - 0, # Triforce Pieces - 0, # Triforce Pieces Goal - 0, # Triforce (win game) - 0, # Rupoors - 10 # Rupoor Cost - ], + "customitemarray": { + "bow": 0, + "progressivebow": 2, + "boomerang": 1, + "redmerang": 1, + "hookshot": 1, + "mushroom": 1, + "powder": 1, + "firerod": 1, + "icerod": 1, + "bombos": 1, + "ether": 1, + "quake": 1, + "lamp": 1, + "hammer": 1, + "shovel": 1, + "flute": 1, + "bugnet": 1, + "book": 1, + "bottle": 4, + "somaria": 1, + "byrna": 1, + "cape": 1, + "mirror": 1, + "boots": 1, + "powerglove": 0, + "titansmitt": 0, + "progressiveglove": 2, + "flippers": 1, + "pearl": 1, + "heartpiece": 24, + "heartcontainer": 10, + "sancheart": 1, + "sword1": 0, + "sword2": 0, + "sword3": 0, + "sword4": 0, + "progressivesword": 4, + "shield1": 0, + "shield2": 0, + "shield3": 0, + "progressiveshield": 3, + "mail2": 0, + "mail3": 0, + "progressivemail": 2, + "halfmagic": 1, + "quartermagic": 0, + "bombsplus5": 0, + "bombsplus10": 0, + "arrowsplus5": 0, + "arrowsplus10": 0, + "arrow1": 1, + "arrow10": 12, + "bomb1": 0, + "bomb3": 16, + "bomb10": 1, + "rupee1": 2, + "rupee5": 4, + "rupee20": 28, + "rupee50": 7, + "rupee100": 1, + "rupee300": 5, + "blueclock": 0, + "greenclock": 0, + "redclock": 0, + "silversupgrade": 0, + "generickeys": 0, + "triforcepieces": 0, + "triforcepiecesgoal": 0, + "triforce": 0, + "rupoor": 0, + "rupoorcost": 10 + }, "rom": os.path.join(".","Zelda no Densetsu - Kamigami no Triforce (Japan).sfc"), "sprite": None, "randomSprite": False, diff --git a/ItemList.py b/ItemList.py index fa10baeb..971424fc 100644 --- a/ItemList.py +++ b/ItemList.py @@ -9,6 +9,8 @@ from EntranceShuffle import connect_entrance from Fill import FillError, fill_restrictive from Items import ItemFactory +import classes.constants as CONST + #This file sets the item pools for various modes. Timed modes and triforce hunt are enforced first, and then extra items are specified per mode to fill in the remaining space. #Some basic items that various modes require are placed here, including pendants and crystals. Medallion requirements for the two relevant entrances are also decided. @@ -124,6 +126,57 @@ difficulties = { ), } +def get_custom_array_key(item): + label_switcher = { + "silverarrow": "silversupgrade", + "blueboomerang": "boomerang", + "redboomerang": "redmerang", + "ocarina": "flute", + "bugcatchingnet": "bugnet", + "bookofmudora": "book", + "pegasusboots": "boots", + "titansmitts": "titansmitt", + "pieceofheart": "heartpiece", + "bossheartcontainer": "heartcontainer", + "sanctuaryheartcontainer": "sancheart", + "mastersword": "sword2", + "temperedsword": "sword3", + "goldensword": "sword4", + "blueshield": "shield1", + "redshield": "shield2", + "mirrorshield": "shield3", + "bluemail": "mail2", + "redmail": "mail3", + "progressivearmor": "progressivemail", + "splus12": "halfmagic", + "splus14": "quartermagic", + "singlearrow": "arrow1", + "singlebomb": "bomb1", + "triforcepiece": "triforcepieces" + } + key = item.lower() + trans = { + " ": "", + '(': "", + '/': "", + ')': "", + '+': "", + "magic": "", + "caneof": "", + "upgrade": "splus", + "arrows": "arrow", + "arrowplus": "arrowsplus", + "bombs": "bomb", + "bombplus": "bombsplus", + "rupees": "rupee" + } + for check in trans: + repl = trans[check] + key = key.replace(check,repl) + if key in label_switcher: + key = label_switcher.get(key) + return key + def generate_itempool(world, player): if (world.difficulty[player] not in ['normal', 'hard', 'expert'] or world.goal[player] not in ['ganon', 'pedestal', 'dungeons', 'triforcehunt', 'crystals'] or world.mode[player] not in ['open', 'standard', 'inverted'] or world.timer not in ['none', 'display', 'timed', 'timed-ohko', 'ohko', 'timed-countdown'] or world.progressive not in ['on', 'off', 'random']): @@ -141,7 +194,7 @@ def generate_itempool(world, player): region = world.get_region('Light World',player) loc = Location(player, "Murahdahla", parent=region) - loc.access_rule = lambda state: state.item_count('Triforce Piece', player) + state.item_count('Power Star', player) > state.world.treasure_hunt_count[player] + loc.access_rule = lambda state: state.item_count(get_custom_array_key('Triforce Piece'), player) + state.item_count(get_custom_array_key('Power Star'), player) > state.world.treasure_hunt_count[player] region.locations.append(loc) world.dynamic_locations.append(loc) @@ -204,7 +257,7 @@ def generate_itempool(world, player): # set up item pool if world.custom: (pool, placed_items, precollected_items, clock_mode, treasure_hunt_count, treasure_hunt_icon, lamps_needed_for_dark_rooms) = make_custom_item_pool(world.progressive, world.shuffle[player], world.difficulty[player], world.timer, world.goal[player], world.mode[player], world.swords[player], world.retro[player], world.customitemarray) - world.rupoor_cost = min(world.customitemarray[69], 9999) + world.rupoor_cost = min(world.customitemarray["rupoorcost"], 9999) else: (pool, placed_items, precollected_items, clock_mode, treasure_hunt_count, treasure_hunt_icon, lamps_needed_for_dark_rooms) = get_pool_core(world.progressive, world.shuffle[player], world.difficulty[player], world.timer, world.goal[player], world.mode[player], world.swords[player], world.retro[player], world.doorShuffle[player]) @@ -212,10 +265,10 @@ def generate_itempool(world, player): amt = world.pool_adjustment[player] if amt < 0: for i in range(0, amt): - pool.remove('Rupees (20)') + pool.remove(get_custom_array_key('Rupees (20)')) elif amt > 0: for i in range(0, amt): - pool.append('Rupees (20)') + pool.append(get_custom_array_key('Rupees (20)')) for item in precollected_items: world.push_precollected(ItemFactory(item, player)) @@ -268,9 +321,9 @@ def generate_itempool(world, player): # 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) # We mark one random heart container as an advancement item (or 4 heart pieces in expert mode) - if world.difficulty[player] in ['normal', 'hard'] and not (world.custom and world.customitemarray[30] == 0): + if world.difficulty[player] in ['normal', 'hard'] and not (world.custom and world.customitemarray["heartcontainer"] == 0): [item for item in items if item.name == 'Boss Heart Container'][0].advancement = True - elif world.difficulty[player] in ['expert'] and not (world.custom and world.customitemarray[29] < 4): + elif world.difficulty[player] in ['expert'] and not (world.custom and world.customitemarray["heartpiece"] < 4): adv_heart_pieces = [item for item in items if item.name == 'Piece of Heart'][0:4] for hp in adv_heart_pieces: hp.advancement = True @@ -558,80 +611,31 @@ def make_custom_item_pool(progressive, shuffle, difficulty, timer, goal, mode, s placed_items[loc] = item # Correct for insanely oversized item counts and take initial steps to handle undersized pools. - for x in range(0, 66): - if customitemarray[x] > total_items_to_place: - customitemarray[x] = total_items_to_place - if customitemarray[68] > total_items_to_place: - customitemarray[68] = total_items_to_place - itemtotal = 0 - for x in range(0, 66): - itemtotal = itemtotal + customitemarray[x] - itemtotal = itemtotal + customitemarray[68] - itemtotal = itemtotal + customitemarray[70] + # Bow to Silver Arrows Upgrade, including Generic Keys & Rupoors + for x in [*range(0, 66 + 1), 68, 69]: + key = CONST.CUSTOMITEMS[x] + if customitemarray[key] > total_items_to_place: + customitemarray[key] = total_items_to_place - pool.extend(['Bow'] * customitemarray[0]) - pool.extend(['Silver Arrows']* customitemarray[1]) - pool.extend(['Blue Boomerang'] * customitemarray[2]) - pool.extend(['Red Boomerang'] * customitemarray[3]) - pool.extend(['Hookshot'] * customitemarray[4]) - pool.extend(['Mushroom'] * customitemarray[5]) - pool.extend(['Magic Powder'] * customitemarray[6]) - pool.extend(['Fire Rod'] * customitemarray[7]) - pool.extend(['Ice Rod'] * customitemarray[8]) - pool.extend(['Bombos'] * customitemarray[9]) - pool.extend(['Ether'] * customitemarray[10]) - pool.extend(['Quake'] * customitemarray[11]) - pool.extend(['Lamp'] * customitemarray[12]) - pool.extend(['Hammer'] * customitemarray[13]) - pool.extend(['Shovel'] * customitemarray[14]) - pool.extend(['Ocarina'] * customitemarray[15]) - pool.extend(['Bug Catching Net'] * customitemarray[16]) - pool.extend(['Book of Mudora'] * customitemarray[17]) - pool.extend(['Cane of Somaria'] * customitemarray[19]) - pool.extend(['Cane of Byrna'] * customitemarray[20]) - pool.extend(['Cape'] * customitemarray[21]) - pool.extend(['Pegasus Boots'] * customitemarray[23]) - pool.extend(['Power Glove'] * customitemarray[24]) - pool.extend(['Titans Mitts'] * customitemarray[25]) - pool.extend(['Progressive Glove'] * customitemarray[26]) - pool.extend(['Flippers'] * customitemarray[27]) - pool.extend(['Piece of Heart'] * customitemarray[29]) - pool.extend(['Boss Heart Container'] * customitemarray[30]) - pool.extend(['Sanctuary Heart Container'] * customitemarray[31]) - pool.extend(['Master Sword'] * customitemarray[33]) - pool.extend(['Tempered Sword'] * customitemarray[34]) - pool.extend(['Golden Sword'] * customitemarray[35]) - pool.extend(['Blue Shield'] * customitemarray[37]) - pool.extend(['Red Shield'] * customitemarray[38]) - pool.extend(['Mirror Shield'] * customitemarray[39]) - pool.extend(['Progressive Shield'] * customitemarray[40]) - pool.extend(['Blue Mail'] * customitemarray[41]) - pool.extend(['Red Mail'] * customitemarray[42]) - pool.extend(['Progressive Armor'] * customitemarray[43]) - pool.extend(['Magic Upgrade (1/2)'] * customitemarray[44]) - pool.extend(['Magic Upgrade (1/4)'] * customitemarray[45]) - pool.extend(['Bomb Upgrade (+5)'] * customitemarray[46]) - pool.extend(['Bomb Upgrade (+10)'] * customitemarray[47]) - pool.extend(['Arrow Upgrade (+5)'] * customitemarray[48]) - pool.extend(['Arrow Upgrade (+10)'] * customitemarray[49]) - pool.extend(['Single Arrow'] * customitemarray[50]) - pool.extend(['Arrows (10)'] * customitemarray[51]) - pool.extend(['Single Bomb'] * customitemarray[52]) - pool.extend(['Bombs (3)'] * customitemarray[53]) - pool.extend(['Rupee (1)'] * customitemarray[54]) - pool.extend(['Rupees (5)'] * customitemarray[55]) - pool.extend(['Rupees (20)'] * customitemarray[56]) - pool.extend(['Rupees (50)'] * customitemarray[57]) - pool.extend(['Rupees (100)'] * customitemarray[58]) - pool.extend(['Rupees (300)'] * customitemarray[59]) - pool.extend(['Rupoor'] * customitemarray[60]) - pool.extend(['Blue Clock'] * customitemarray[61]) - pool.extend(['Green Clock'] * customitemarray[62]) - pool.extend(['Red Clock'] * customitemarray[63]) - pool.extend(['Progressive Bow'] * customitemarray[64]) - pool.extend(['Bombs (10)'] * customitemarray[65]) - pool.extend(['Triforce Piece'] * customitemarray[66]) - pool.extend(['Triforce'] * customitemarray[68]) + # Triforce + if customitemarray["triforce"] > total_items_to_place: + customitemarray["triforce"] = total_items_to_place + + itemtotal = 0 + # Bow to Silver Arrows Upgrade, including Generic Keys & Rupoors + for x in [*range(0, 66 + 1), 68, 69]: + key = CONST.CUSTOMITEMS[x] + itemtotal = itemtotal + customitemarray[key] + # Triforce + itemtotal = itemtotal + customitemarray["triforce"] + # Generic Keys + itemtotal = itemtotal + customitemarray["generickeys"] + + customitems = [ + "Bow", "Silver Arrows", "Blue Boomerang", "Red Boomerang", "Hookshot", "Mushroom", "Magic Powder", "Fire Rod", "Ice Rod", "Bombos", "Ether", "Quake", "Lamp", "Hammer", "Shovel", "Ocarina", "Bug Catching Net", "Book of Mudora", "Cane of Somaria", "Cane of Byrna", "Cape", "Pegasus Boots", "Power Glove", "Titans Mitts", "Progressive Glove", "Flippers", "Piece of Heart", "Boss Heart Container", "Sanctuary Heart Container", "Master Sword", "Tempered Sword", "Golden Sword", "Blue Shield", "Red Shield", "Mirror Shield", "Progressive Shield", "Blue Mail", "Red Mail", "Progressive Armor", "Magic Upgrade (1/2)", "Magic Upgrade (1/4)", "Bomb Upgrade (+5)", "Bomb Upgrade (+10)", "Arrow Upgrade (+5)", "Arrow Upgrade (+10)", "Single Arrow", "Arrows (10)", "Single Bomb", "Bombs (3)", "Rupee (1)", "Rupees (5)", "Rupees (20)", "Rupees (50)", "Rupees (100)", "Rupees (300)", "Rupoor", "Blue Clock", "Green Clock", "Red Clock", "Progressive Bow", "Bombs (10)", "Triforce Piece", "Triforce" + ] + for customitem in customitems: + pool.extend([customitem] * customitemarray[get_custom_array_key(customitem)]) diff = difficulties[difficulty] @@ -641,17 +645,17 @@ def make_custom_item_pool(progressive, shuffle, difficulty, timer, goal, mode, s # all bottles, since only one bottle is available if diff.same_bottle: thisbottle = random.choice(diff.bottles) - for _ in range(customitemarray[18]): + for _ in range(customitemarray["bottle"]): if not diff.same_bottle: thisbottle = random.choice(diff.bottles) pool.append(thisbottle) - if customitemarray[66] > 0 or customitemarray[67] > 0: - treasure_hunt_count = max(min(customitemarray[67], 99), 1) #To display, count must be between 1 and 99. + if customitemarray["triforcepieces"] > 0 or customitemarray["triforcepiecesgoal"] > 0: + treasure_hunt_count = max(min(customitemarray["triforcepiecesgoal"], 99), 1) #To display, count must be between 1 and 99. treasure_hunt_icon = 'Triforce Piece' # Ensure game is always possible to complete here, force sufficient pieces if the player is unwilling. - if (customitemarray[66] < treasure_hunt_count) and (goal == 'triforcehunt') and (customitemarray[68] == 0): - extrapieces = treasure_hunt_count - customitemarray[66] + if (customitemarray["triforcepieces"] < treasure_hunt_count) and (goal == 'triforcehunt') and (customitemarray["triforce"] == 0): + extrapieces = treasure_hunt_count - customitemarray["triforcepieces"] pool.extend(['Triforce Piece'] * extrapieces) itemtotal = itemtotal + extrapieces @@ -670,28 +674,30 @@ def make_custom_item_pool(progressive, shuffle, difficulty, timer, goal, mode, s if retro: key_location = random.choice(['Secret Passage', 'Hyrule Castle - Boomerang Chest', 'Hyrule Castle - Map Chest', 'Hyrule Castle - Zelda\'s Chest', 'Sewers - Dark Cross']) place_item(key_location, 'Small Key (Universal)') - pool.extend(['Small Key (Universal)'] * max((customitemarray[70] - 1), 0)) + pool.extend(['Small Key (Universal)'] * max((customitemarray["generickeys"] - 1), 0)) else: - pool.extend(['Small Key (Universal)'] * customitemarray[70]) + pool.extend(['Small Key (Universal)'] * customitemarray["generickeys"]) else: - pool.extend(['Small Key (Universal)'] * customitemarray[70]) + pool.extend(['Small Key (Universal)'] * customitemarray["generickeys"]) - pool.extend(['Fighter Sword'] * customitemarray[32]) - pool.extend(['Progressive Sword'] * customitemarray[36]) + pool.extend(['Fighter Sword'] * customitemarray["sword1"]) + pool.extend(['Progressive Sword'] * customitemarray["progressivesword"]) if shuffle == 'insanity_legacy': place_item('Link\'s House', 'Magic Mirror') place_item('Sanctuary', 'Moon Pearl') - pool.extend(['Magic Mirror'] * max((customitemarray[22] -1 ), 0)) - pool.extend(['Moon Pearl'] * max((customitemarray[28] - 1), 0)) + pool.extend(['Magic Mirror'] * max((customitemarray["mirror"] -1 ), 0)) + pool.extend(['Moon Pearl'] * max((customitemarray["pearl"] - 1), 0)) else: - pool.extend(['Magic Mirror'] * customitemarray[22]) - pool.extend(['Moon Pearl'] * customitemarray[28]) + pool.extend(['Magic Mirror'] * customitemarray["mirror"]) + pool.extend(['Moon Pearl'] * customitemarray["pearl"]) if retro: itemtotal = itemtotal - 28 # Corrects for small keys not being in item pool in Retro Mode if itemtotal < total_items_to_place: - pool.extend(['Nothing'] * (total_items_to_place - itemtotal)) + nothings = total_items_to_place - itemtotal + print("Placing " + str(nothings) + " Nothings") + pool.extend(['Nothing'] * nothings) return (pool, placed_items, precollected_items, clock_mode, treasure_hunt_count, treasure_hunt_icon, lamps_needed_for_dark_rooms) diff --git a/classes/constants.py b/classes/constants.py new file mode 100644 index 00000000..a97d6b2b --- /dev/null +++ b/classes/constants.py @@ -0,0 +1,21 @@ +CUSTOMITEMS = [ + "bow", "progressivebow", "boomerang", "redmerang", "hookshot", + "mushroom", "powder", "firerod", "icerod", "bombos", + "ether", "quake", "lamp", "hammer", "shovel", + + "flute", "bugnet", "book", "bottle", "somaria", + "byrna", "cape", "mirror", "boots", "powerglove", + "titansmitt", "progressiveglove", "flippers", "pearl", "heartpiece", + + "heartcontainer", "sancheart", "sword1", "sword2", "sword3", + "sword4", "progressivesword", "shield1", "shield2", "shield3", + "progressiveshield", "mail2", "mail3", "progressivemail", "halfmagic", + + "quartermagic", "bombsplus5", "bombsplus10", "arrowsplus5", "arrowsplus10", + "arrow1", "arrow10", "bomb1", "bomb3", "bomb10", + "rupee1", "rupee5", "rupee20", "rupee50", "rupee100", + + "rupee300", "blueclock", "greenclock", "redclock", "silversupgrade", + "generickeys", "triforcepieces", "triforcepiecesgoal", "triforce", "rupoor", + "rupoorcost" +] diff --git a/gui/bottom.py b/gui/bottom.py index 12a1dc51..ee4b271c 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -6,6 +6,7 @@ import random from CLI import parse_arguments, get_settings from Main import main from Utils import local_path, output_path, open_file +import classes.constants as CONST import gui.widgets as widgets @@ -178,21 +179,10 @@ def create_guiargs(parent): internal = adjustargs[adjustarg] setattr(guiargs,"adjust." + internal, parent.pages["adjust"].content.widgets[adjustarg].storageVar.get()) - customitems = [ - "bow", "progressivebow", "boomerang", "redmerang", "hookshot", "mushroom", "powder", "firerod", - "icerod", "bombos", "ether", "quake", "lamp", "hammer", "shovel", - "flute", "bugnet", "book", "bottle", "somaria", "byrna", "cape", "mirror", - "boots", "powerglove", "titansmitt", "progressiveglove", "flippers", "pearl", "heartpiece", - "heartcontainer", "sancheart", "sword1", "sword2", "sword3", "sword4", "progressivesword", - "shield1", "shield2", "shield3", "progressiveshield", "mail2", - "mail3", "progressivemail", "halfmagic", "quartermagic", "bombsplus5", "bombsplus10", "arrowsplus5", "arrowsplus10", - "arrow1", "arrow10", "bomb1", "bomb3", "bomb10", "rupee1", "rupee5", "rupee20", - "rupee50", "rupee100", "rupee300", "blueclock", "greenclock", "redclock", "silversupgrade", "generickeys", - "triforcepieces", "triforcepiecesgoal", "triforce", "rupoor", "rupoorcost" - ] - guiargs.customitemarray = [] + customitems = CONST.CUSTOMITEMS + guiargs.customitemarray = {} for customitem in customitems: - guiargs.customitemarray.append(int(parent.pages["custom"].content.customWidgets[customitem].storageVar.get())) + guiargs.customitemarray[customitem] = int(parent.pages["custom"].content.customWidgets[customitem].storageVar.get()) guiargs.sprite = parent.pages["randomizer"].pages["gameoptions"].widgets["sprite"]["spriteObject"] guiargs.randomSprite = parent.randomSprite.get() diff --git a/gui/custom/overview.py b/gui/custom/overview.py index e08dab9f..e7c7fa63 100644 --- a/gui/custom/overview.py +++ b/gui/custom/overview.py @@ -3,6 +3,8 @@ import gui.widgets as widgets import json import os +import classes.constants as CONST + def custom_page(top,parent): # Custom Item Pool self = ttk.Frame(parent) @@ -46,8 +48,7 @@ def custom_page(top,parent): for key in dictWidgets: self.customWidgets[key] = dictWidgets[key] - keys = list(self.customWidgets.keys()) - for i in range(0, len(keys)): - self.customWidgets[keys[i]].storageVar.set(top.settings["customitemarray"][i]) + for key in CONST.CUSTOMITEMS: + self.customWidgets[key].storageVar.set(top.settings["customitemarray"][key]) return self From 01e1e719dba405c45e0b608248c6c1a4cc9b7f42 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sun, 23 Feb 2020 17:53:51 -0800 Subject: [PATCH 108/117] Implement Starting Inventory --- CLI.py | 2 + Gui.py | 7 +++ classes/constants.py | 22 +++++++ gui/bottom.py | 10 ++++ gui/startinventory/__init__.py | 1 + gui/startinventory/overview.py | 60 +++++++++++++++++++ .../gui/randomize/generation/checkboxes.json | 6 ++ 7 files changed, 108 insertions(+) create mode 100644 gui/startinventory/__init__.py create mode 100644 gui/startinventory/overview.py diff --git a/CLI.py b/CLI.py index 0cdfb102..d98e95a1 100644 --- a/CLI.py +++ b/CLI.py @@ -374,6 +374,7 @@ def get_settings(): "remote_items": False, "race": False, "custom": False, + "usestartinventory": False, "customitemarray": { "bow": 0, "progressivebow": 2, @@ -452,6 +453,7 @@ def get_settings(): "randomSprite": False, "outputpath": os.path.join(".") } + settings["startinventoryarray"] = {} if sys.platform.lower().find("windows"): settings["enemizercli"] += ".exe" diff --git a/Gui.py b/Gui.py index fa51c557..b824606f 100755 --- a/Gui.py +++ b/Gui.py @@ -8,6 +8,7 @@ from argparse import Namespace from CLI import get_settings from DungeonRandomizer import parse_arguments from gui.adjust.overview import adjust_page +from gui.startinventory.overview import startinventory_page from gui.custom.overview import custom_page from gui.loadcliargs import loadcliargs, loadadjustargs from gui.randomize.item import item_page @@ -67,9 +68,11 @@ def guiMain(args=None): self.notebook = ttk.Notebook(self) self.pages["randomizer"] = ttk.Frame(self.notebook) self.pages["adjust"] = ttk.Frame(self.notebook) + self.pages["startinventory"] = ttk.Frame(self.notebook) self.pages["custom"] = ttk.Frame(self.notebook) self.notebook.add(self.pages["randomizer"], text='Randomize') self.notebook.add(self.pages["adjust"], text='Adjust') + self.notebook.add(self.pages["startinventory"], text='Starting Inventory') self.notebook.add(self.pages["custom"], text='Custom') self.notebook.pack() @@ -132,6 +135,10 @@ def guiMain(args=None): self.pages["adjust"].content,self.settings = adjust_page(self, self.pages["adjust"], self.settings) self.pages["adjust"].content.pack(side=TOP, fill=BOTH, expand=True) + # Starting Inventory Controls + self.pages["startinventory"].content = startinventory_page(self, self.pages["startinventory"]) + self.pages["startinventory"].content.pack(side=TOP, fill=BOTH, expand=True) + # Custom Controls self.pages["custom"].content = custom_page(self,self.pages["custom"]) self.pages["custom"].content.pack(side=TOP, pady=(17,0)) diff --git a/classes/constants.py b/classes/constants.py index a97d6b2b..0069c1e5 100644 --- a/classes/constants.py +++ b/classes/constants.py @@ -19,3 +19,25 @@ CUSTOMITEMS = [ "generickeys", "triforcepieces", "triforcepiecesgoal", "triforce", "rupoor", "rupoorcost" ] + +CUSTOMITEMLABELS = [ + "Bow", "Progressive Bow", "Blue Boomerang", "Red Boomerang", "Hookshot", + "Mushroom", "Magic Powder", "Fire Rod", "Ice Rod", "Bombos", + "Ether", "Quake", "Lamp", "Hammer", "Shovel", + + "Ocarina", "Bug Catching Net", "Book of Mudora", "Bottle", "Cane of Somaria", + "Cane of Byrna", "Magic Cape", "Magic Mirror", "Pegasus Boots", "Power Glove", + "Titans Mitts", "Progressive Glove", "Flippers", "Moon Pearl", "Piece of Heart", + + "Boss Heart Container", "Sanctuary Heart Container", "Fighter Sword", "Master Sword", "Tempered Sword", + "Golden Sword", "Progressive Sword", "Blue Shield", "Red Shield", "Mirror Shield", + "Progressive Shield", "Blue Mail", "Red Mail", "Progressive Armor", "Magic Upgrade (1/2)", + + "Magic Upgrade (1/4)", "Bomb Upgrade (+5)", "Bomb Upgrade (+10)", "Arrow Upgrade (+5)", "Arrow Upgrade (+10)", + "Single Arrow", "Arrows (10)", "Single Bomb", "Bombs (3)", "Bombs (10)", + "Rupee (1)", "Rupees (5)", "Rupees (20)", "Rupees (50)", "Rupees (100)", + + "Rupees (300)", "Blue Clock", "Green Clock", "Red Clock", "Silver Arrows", + "Small Key (Universal)", "Triforce Piece", "Triforce Piece Goal", "Triforce", "Rupoor", + "Rupoor Cost" +] diff --git a/gui/bottom.py b/gui/bottom.py index ee4b271c..cea47a56 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -180,10 +180,20 @@ def create_guiargs(parent): setattr(guiargs,"adjust." + internal, parent.pages["adjust"].content.widgets[adjustarg].storageVar.get()) customitems = CONST.CUSTOMITEMS + guiargs.startinventory = [] guiargs.customitemarray = {} + guiargs.startinventoryarray = {} for customitem in customitems: + if customitem not in ["triforcepiecesgoal", "rupoorcost"]: + amount = int(parent.pages["startinventory"].content.startingWidgets[customitem].storageVar.get()) + guiargs.startinventoryarray[customitem] = amount + for i in range(0, amount): + label = CONST.CUSTOMITEMLABELS[customitems.index(customitem)] + guiargs.startinventory.append(label) guiargs.customitemarray[customitem] = int(parent.pages["custom"].content.customWidgets[customitem].storageVar.get()) + guiargs.startinventory = ','.join(guiargs.startinventory) + guiargs.sprite = parent.pages["randomizer"].pages["gameoptions"].widgets["sprite"]["spriteObject"] guiargs.randomSprite = parent.randomSprite.get() guiargs.outputpath = parent.outputPath.get() diff --git a/gui/startinventory/__init__.py b/gui/startinventory/__init__.py new file mode 100644 index 00000000..fa319bae --- /dev/null +++ b/gui/startinventory/__init__.py @@ -0,0 +1 @@ +# do nothing, just exist to make "gui.startinventory" package diff --git a/gui/startinventory/overview.py b/gui/startinventory/overview.py new file mode 100644 index 00000000..4d177865 --- /dev/null +++ b/gui/startinventory/overview.py @@ -0,0 +1,60 @@ +from tkinter import ttk, StringVar, Entry, Frame, Label, N, E, W, LEFT, RIGHT, X, VERTICAL, Y +import gui.widgets as widgets +import json +import os + +import classes.constants as CONST + +def startinventory_page(top,parent): + # Starting Inventory + self = ttk.Frame(parent) + + 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 + + def create_vertical_rule(num=1): + for i in range(0,num): + ttk.Separator(self, orient=VERTICAL).pack(side=LEFT, anchor=N, fill=Y) + + def validation(P): + if str.isdigit(P) or P == "": + return True + else: + return False + vcmd=(self.register(validation), '%P') + + # Starting Inventory options + self.startingWidgets = {} + + # Starting Inventory option sections + self.frames = {} + create_list_frame(self,"itemList1") + create_vertical_rule(2) + create_list_frame(self,"itemList2") + create_vertical_rule(2) + create_list_frame(self,"itemList3") + create_vertical_rule(2) + create_list_frame(self,"itemList4") + create_vertical_rule(2) + create_list_frame(self,"itemList5") + + with open(os.path.join("resources","app","gui","custom","overview","widgets.json")) as widgetDefns: + myDict = json.load(widgetDefns) + del myDict["itemList5"]["triforcepiecesgoal"] + del myDict["itemList5"]["rupoorcost"] + 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] + + for key in CONST.CUSTOMITEMS: + if key not in ["triforcepiecesgoal", "rupoorcost"]: + val = 0 + if key in top.settings["startinventoryarray"]: + val = top.settings["startinventoryarray"][key] + self.startingWidgets[key].storageVar.set(val) + + return self diff --git a/resources/app/gui/randomize/generation/checkboxes.json b/resources/app/gui/randomize/generation/checkboxes.json index ed208ec3..7d0fedbf 100644 --- a/resources/app/gui/randomize/generation/checkboxes.json +++ b/resources/app/gui/randomize/generation/checkboxes.json @@ -11,6 +11,12 @@ "text": "Do not create patched ROM" } }, + "usestartinventory": { + "type": "checkbox", + "label": { + "text": "Use starting inventory" + } + }, "usecustompool": { "type": "checkbox", "label": { From 66c57e38b04093ce46619d718e33e8d62c76b8d9 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sun, 23 Feb 2020 21:38:22 -0800 Subject: [PATCH 109/117] Fix CLI precedence --- CLI.py | 96 ++++++++++++++++++++++------------ DungeonRandomizer.py | 3 +- Gui.py | 35 +++++++++---- classes/constants.py | 65 +++++++++++++++++++++++ gui/bottom.py | 65 +++-------------------- gui/loadcliargs.py | 93 ++++++++------------------------ gui/startinventory/overview.py | 9 ++-- 7 files changed, 189 insertions(+), 177 deletions(-) diff --git a/CLI.py b/CLI.py index d98e95a1..38fa91e8 100644 --- a/CLI.py +++ b/CLI.py @@ -34,7 +34,7 @@ def parse_arguments(argv, no_defaults=False): multiargs, _ = parser.parse_known_args(argv) parser = argparse.ArgumentParser(formatter_class=ArgumentDefaultsHelpFormatter) - parser.add_argument('--create_spoiler', help='Output a Spoiler File', action='store_true') + parser.add_argument('--create_spoiler', default=defval(settings["create_spoiler"] != 0), help='Output a Spoiler File', action='store_true') parser.add_argument('--logic', default=defval(settings["logic"]), const='noglitches', nargs='?', choices=['noglitches', 'minorglitches', 'nologic'], help='''\ Select Enforcement of Item Requirements. (default: %(default)s) @@ -236,8 +236,8 @@ def parse_arguments(argv, no_defaults=False): and a few other little things make this more like Zelda-1. ''', action='store_true') parser.add_argument('--startinventory', default=defval(settings["startinventory"]), help='Specifies a list of items that will be in your starting inventory (separated by commas)') + parser.add_argument('--usestartinventory', default=defval(settings["usestartinventory"] != 0), help='Not supported.') parser.add_argument('--custom', default=defval(settings["custom"] != 0), help='Not supported.') - parser.add_argument('--customitemarray', default=defval(settings["customitemarray"] != 0), help='Not supported.') parser.add_argument('--accessibility', default=defval(settings["accessibility"]), const='items', nargs='?', choices=['items', 'locations', 'none'], help='''\ Select Item/Location Accessibility. (default: %(default)s) Items: You can reach all unique inventory items. No guarantees about @@ -270,7 +270,7 @@ def parse_arguments(argv, no_defaults=False): Alternatively, can be a ALttP Rom patched with a Link sprite that will be extracted. ''') - parser.add_argument('--suppress_rom', help='Do not create an output rom file.', action='store_true') + parser.add_argument('--suppress_rom', default=defval(settings["suppress_rom"] != 0), help='Do not create an output rom file.', action='store_true') parser.add_argument('--gui', help='Launch the GUI', action='store_true') parser.add_argument('--jsonout', action='store_true', help='''\ Output .json patch to stdout instead of a patched rom. Used @@ -324,10 +324,7 @@ def parse_arguments(argv, no_defaults=False): def get_settings(): # set default settings settings = { - "multi": 1, - "names": "", - "seed": None, - "count": 1, + "retro": False, "mode": "open", "logic": "noglitches", "goal": "ganon", @@ -340,41 +337,53 @@ def get_settings(): "progressive": "on", "accessibility": "items", "algorithm": "balanced", - "shuffle": "vanilla", - "door_shuffle": "basic", - "experimental": 0, - "dungeon_counters": "off", - "heartbeep": "normal", - "heartcolor": "red", - "fastmenu": "normal", - "create_spoiler": False, - "skip_playthrough": True, - "suppress_rom": False, + "openpyramid": False, + "shuffleganon": False, + "shuffle": "vanilla", + + "shufflepots": False, + "shuffleenemies": "none", + "shufflebosses": "none", + "enemy_damage": "default", + "enemy_health": "default", + "enemizercli": os.path.join(".","EnemizerCLI","EnemizerCLI.Core"), + "mapshuffle": False, "compassshuffle": False, "keyshuffle": False, "bigkeyshuffle": False, "keysanity": False, - "retro": False, - "startinventory": "", - "quickswap": False, + "door_shuffle": "basic", + "experimental": 0, + "dungeon_counters": "off", + + "multi": 1, + "names": "", + + "hints": True, "disablemusic": False, + "quickswap": False, + "heartcolor": "red", + "heartbeep": "normal", + "sprite": None, + "fastmenu": "normal", "ow_palettes": "default", "uw_palettes": "default", - "shuffleganon": True, - "hints": True, - "enemizercli": os.path.join(".","EnemizerCLI","EnemizerCLI.Core"), - "shufflebosses": "none", - "shuffleenemies": "none", - "enemy_health": "default", - "enemy_damage": "default", - "shufflepots": False, + + "create_spoiler": False, + "skip_playthrough": True, + "suppress_rom": False, + "usestartinventory": False, + "custom": False, + "rom": os.path.join(".","Zelda no Densetsu - Kamigami no Triforce (Japan).sfc"), + + "seed": None, + "count": 1, + "startinventory": "", "beemizer": 0, "remote_items": False, "race": False, - "custom": False, - "usestartinventory": False, "customitemarray": { "bow": 0, "progressivebow": 2, @@ -448,8 +457,6 @@ def get_settings(): "rupoor": 0, "rupoorcost": 10 }, - "rom": os.path.join(".","Zelda no Densetsu - Kamigami no Triforce (Japan).sfc"), - "sprite": None, "randomSprite": False, "outputpath": os.path.join(".") } @@ -467,3 +474,28 @@ def get_settings(): for k,v in data.items(): settings[k] = v return settings + +def get_args_priority(settings_args, gui_args, cli_args): + args = {} + args["settings"] = get_settings() if settings_args is None else settings_args + args["gui"] = {} if gui_args is None else gui_args + args["cli"] = cli_args + + args["load"] = args["settings"] + if args["gui"] is not None: + for k in args["gui"]: + if k not in args["load"] or args["load"][k] != args["gui"]: + args["load"][k] = args["gui"][k] + + if args["cli"] is None: + args["cli"] = {} + cli = vars(parse_arguments(None)) + for k,v in cli.items(): + if isinstance(v,dict): + args["cli"][k] = v[1] + else: + args["cli"][k] = v + if k not in args["load"] or args["load"][k] != args["cli"]: + args["load"][k] = args["cli"][k] + + return args diff --git a/DungeonRandomizer.py b/DungeonRandomizer.py index f7b481c3..d872ed01 100755 --- a/DungeonRandomizer.py +++ b/DungeonRandomizer.py @@ -59,7 +59,8 @@ def start(): seed = random.randint(0, 999999999) for fail in failures: logger.info('%s seed failed with: %s', fail[1], fail[0]) - logger.info('Generation fail rate: %f%%', 100*len(failures)/args.count) + logger.info('Generation fail rate: %f%%', 100 * len(failures) / args.count) + logger.info('Generation success rate: %f%%', 100 * (args.count - len(failures)) / args.count) else: main(seed=args.seed, args=args) diff --git a/Gui.py b/Gui.py index b824606f..40605db6 100755 --- a/Gui.py +++ b/Gui.py @@ -2,10 +2,10 @@ import json import os import sys -from tkinter import Tk, BOTTOM, TOP, StringVar, BooleanVar, X, BOTH, ttk +from tkinter import Tk, Button, BOTTOM, TOP, StringVar, BooleanVar, X, BOTH, RIGHT, ttk, messagebox from argparse import Namespace -from CLI import get_settings +from CLI import get_settings, get_args_priority from DungeonRandomizer import parse_arguments from gui.adjust.overview import adjust_page from gui.startinventory.overview import startinventory_page @@ -36,28 +36,39 @@ def guiMain(args=None): f.write(json.dumps(args, indent=2)) os.chmod(os.path.join(settings_path, "settings.json"),0o755) - # routine for exiting the app - def guiExit(): + def save_settings_from_gui(): gui_args = vars(create_guiargs(self)) if self.randomSprite.get(): gui_args['sprite'] = 'random' elif gui_args['sprite']: gui_args['sprite'] = gui_args['sprite'].name save_settings(gui_args) + messagebox.showinfo("Door Shuffle " + ESVersion,"Settings saved from GUI.") + + # routine for exiting the app + def guiExit(): + dosave = messagebox.askyesno("Door Shuffle " + ESVersion, "Save settings before exit?") + if dosave: + save_settings_from_gui() sys.exit(0) # make main window # add program title & version number mainWindow = Tk() self = mainWindow + mainWindow.wm_title("Door Shuffle %s" % ESVersion) mainWindow.protocol("WM_DELETE_WINDOW", guiExit) # intercept when user clicks the X # set program icon set_icon(mainWindow) + # get args + # getting Settings & CLI (no GUI built yet) + self.args = get_args_priority(None, None, None) + # get saved settings - self.settings = get_settings() + self.settings = self.args["settings"] # make array for pages self.pages = {} @@ -73,7 +84,7 @@ def guiMain(args=None): self.notebook.add(self.pages["randomizer"], text='Randomize') self.notebook.add(self.pages["adjust"], text='Adjust') self.notebook.add(self.pages["startinventory"], text='Starting Inventory') - self.notebook.add(self.pages["custom"], text='Custom') + self.notebook.add(self.pages["custom"], text='Custom Item Pool') self.notebook.pack() # randomizer controls @@ -125,6 +136,10 @@ def guiMain(args=None): # bottom of window: Open Output Directory, Open Documentation (if exists) self.frames["bottom"] = bottom_frame(self, self, None) + ## Save Settings Button + savesettingsButton = Button(self.frames["bottom"], text='Save Settings to File', command=save_settings_from_gui) + savesettingsButton.pack(side=RIGHT) + # set bottom frame to main window self.frames["bottom"].pack(side=BOTTOM, fill=X, padx=5, pady=5) @@ -141,7 +156,7 @@ def guiMain(args=None): # Custom Controls self.pages["custom"].content = custom_page(self,self.pages["custom"]) - self.pages["custom"].content.pack(side=TOP, pady=(17,0)) + self.pages["custom"].content.pack(side=TOP, fill=BOTH, expand=True) def validation(P): if str.isdigit(P) or P == "": @@ -150,12 +165,12 @@ def guiMain(args=None): return False vcmd=(self.pages["custom"].content.register(validation), '%P') + # load args + loadcliargs(self, self.args["load"]) + # load adjust settings into options loadadjustargs(self, self.settings) - # load args from CLI into options - loadcliargs(self, args, self.settings) - mainWindow.mainloop() diff --git a/classes/constants.py b/classes/constants.py index 0069c1e5..90434970 100644 --- a/classes/constants.py +++ b/classes/constants.py @@ -20,6 +20,11 @@ CUSTOMITEMS = [ "rupoorcost" ] +CANTSTARTWITH = [ + "triforcepiecesgoal", "triforce", "rupoor", + "rupoorcost" +] + CUSTOMITEMLABELS = [ "Bow", "Progressive Bow", "Blue Boomerang", "Red Boomerang", "Hookshot", "Mushroom", "Magic Powder", "Fire Rod", "Ice Rod", "Bombos", @@ -41,3 +46,63 @@ CUSTOMITEMLABELS = [ "Small Key (Universal)", "Triforce Piece", "Triforce Piece Goal", "Triforce", "Rupoor", "Rupoor Cost" ] + +SETTINGSTOPROCESS = { + "randomizer": { + "item": { + "retro": "retro", + "worldstate": "mode", + "logiclevel": "logic", + "goal": "goal", + "crystals_gt": "crystals_gt", + "crystals_ganon": "crystals_ganon", + "weapons": "swords", + "itempool": "difficulty", + "itemfunction": "item_functionality", + "timer": "timer", + "progressives": "progressive", + "accessibility": "accessibility", + "sortingalgo": "algorithm" + }, + "entrance": { + "openpyramid": "openpyramid", + "shuffleganon": "shuffleganon", + "entranceshuffle": "shuffle" + }, + "enemizer": { + "potshuffle": "shufflepots", + "enemyshuffle": "shuffleenemies", + "bossshuffle": "shufflebosses", + "enemydamage": "enemy_damage", + "enemyhealth": "enemy_health" + }, + "dungeon": { + "mapshuffle": "mapshuffle", + "compassshuffle": "compassshuffle", + "smallkeyshuffle": "keyshuffle", + "bigkeyshuffle": "bigkeyshuffle", + "dungeondoorshuffle": "door_shuffle", + "experimental": "experimental", + "dungeon_counters": "dungeon_counters" + }, + "multiworld": { + "names": "names" + }, + "gameoptions": { + "hints": "hints", + "nobgm": "disablemusic", + "quickswap": "quickswap", + "heartcolor": "heartcolor", + "heartbeep": "heartbeep", + "menuspeed": "fastmenu", + "owpalettes": "ow_palettes", + "uwpalettes": "uw_palettes" + }, + "generation": { + "spoiler": "create_spoiler", + "suppressrom": "suppress_rom", + "usestartinventory": "usestartinventory", + "usecustompool": "custom" + } + } +} diff --git a/gui/bottom.py b/gui/bottom.py index cea47a56..22d94d35 100644 --- a/gui/bottom.py +++ b/gui/bottom.py @@ -1,5 +1,6 @@ from tkinter import ttk, messagebox, StringVar, Button, Entry, Frame, Label, Spinbox, E, W, LEFT, RIGHT, X from argparse import Namespace +from functools import partial import logging import os import random @@ -79,11 +80,12 @@ def bottom_frame(self, parent, args=None): openOutputButton = Button(self, text='Open Output Directory', command=open_output) openOutputButton.pack(side=RIGHT) + ## Documentation Button if os.path.exists(local_path('README.html')): def open_readme(): open_file(local_path('README.html')) openReadmeButton = Button(self, text='Open Documentation', command=open_readme) - openReadmeButton.pack() + openReadmeButton.pack(side=RIGHT) return self @@ -93,63 +95,8 @@ def create_guiargs(parent): # set up settings to gather # Page::Subpage::GUI-id::param-id - options = { - "randomizer": { - "item": { - "retro": "retro", - "worldstate": "mode", - "logiclevel": "logic", - "goal": "goal", - "crystals_gt": "crystals_gt", - "crystals_ganon": "crystals_ganon", - "weapons": "swords", - "itempool": "difficulty", - "itemfunction": "item_functionality", - "timer": "timer", - "progressives": "progressive", - "accessibility": "accessibility", - "sortingalgo": "algorithm" - }, - "entrance": { - "openpyramid": "openpyramid", - "shuffleganon": "shuffleganon", - "entranceshuffle": "shuffle" - }, - "enemizer": { - "potshuffle": "shufflepots", - "enemyshuffle": "shuffleenemies", - "bossshuffle": "shufflebosses", - "enemydamage": "enemy_damage", - "enemyhealth": "enemy_health" - }, - "dungeon": { - "mapshuffle": "mapshuffle", - "compassshuffle": "compassshuffle", - "smallkeyshuffle": "keyshuffle", - "bigkeyshuffle": "bigkeyshuffle", - "dungeondoorshuffle": "door_shuffle", - "experimental": "experimental", - "dungeon_counters": "dungeon_counters" - }, - "multiworld": { - "names": "names" - }, - "gameoptions": { - "hints": "hints", - "nobgm": "disablemusic", - "quickswap": "quickswap", - "heartcolor": "heartcolor", - "heartbeep": "heartbeep", - "menuspeed": "fastmenu", - "owpalettes": "ow_palettes", - "uwpalettes": "uw_palettes" - }, - "generation": { - "spoiler": "create_spoiler", - "suppressrom": "suppress_rom" - } - } - } + options = CONST.SETTINGSTOPROCESS + for mainpage in options: for subpage in options[mainpage]: for widget in options[mainpage][subpage]: @@ -184,7 +131,7 @@ def create_guiargs(parent): guiargs.customitemarray = {} guiargs.startinventoryarray = {} for customitem in customitems: - if customitem not in ["triforcepiecesgoal", "rupoorcost"]: + if customitem not in ["triforcepiecesgoal", "triforce", "rupoor", "rupoorcost"]: amount = int(parent.pages["startinventory"].content.startingWidgets[customitem].storageVar.get()) guiargs.startinventoryarray[customitem] = amount for i in range(0, amount): diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index 5fa012bc..14a8b007 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -1,96 +1,45 @@ from classes.SpriteSelector import SpriteSelector as spriteSelector from gui.randomize.gameoptions import set_sprite from Rom import Sprite - +import classes.constants as CONST def loadcliargs(gui, args, settings=None): if args is not None: - for k, v in vars(args).items(): - if type(v) is dict: - setattr(args, k, v[1]) # only get values for player 1 for now +# for k, v in vars(args).items(): +# if type(v) is dict: +# setattr(args, k, v[1]) # only get values for player 1 for now # load values from commandline args # set up options to get # Page::Subpage::GUI-id::param-id - options = { - "randomizer": { - "item": { - "retro": "retro", - "worldstate": "mode", - "logiclevel": "logic", - "goal": "goal", - "crystals_gt": "crystals_gt", - "crystals_ganon": "crystals_ganon", - "weapons": "swords", - "itempool": "difficulty", - "itemfunction": "item_functionality", - "timer": "timer", - "progressives": "progressive", - "accessibility": "accessibility", - "sortingalgo": "algorithm" - }, - "entrance": { - "openpyramid": "openpyramid", - "shuffleganon": "shuffleganon", - "entranceshuffle": "shuffle" - }, - "enemizer": { - "potshuffle": "shufflepots", - "enemyshuffle": "shuffleenemies", - "bossshuffle": "shufflebosses", - "enemydamage": "enemy_damage", - "enemyhealth": "enemy_health" - }, - "dungeon": { - "mapshuffle": "mapshuffle", - "compassshuffle": "compassshuffle", - "smallkeyshuffle": "keyshuffle", - "bigkeyshuffle": "bigkeyshuffle", - "dungeondoorshuffle": "door_shuffle", - "experimental": "experimental" - }, - "gameoptions": { - "hints": "hints", - "nobgm": "disablemusic", - "quickswap": "quickswap", - "heartcolor": "heartcolor", - "heartbeep": "heartbeep", - "menuspeed": "fastmenu", - "owpalettes": "ow_palettes", - "uwpalettes": "uw_palettes" - }, - "generation": { - "spoiler": "create_spoiler", - "suppressrom": "suppress_rom" - } - } - } + options = CONST.SETTINGSTOPROCESS + for mainpage in options: for subpage in options[mainpage]: for widget in options[mainpage][subpage]: arg = options[mainpage][subpage][widget] - gui.pages[mainpage].pages[subpage].widgets[widget].storageVar.set(getattr(args, arg)) + gui.pages[mainpage].pages[subpage].widgets[widget].storageVar.set(args[arg]) if subpage == "gameoptions" and not widget == "hints": hasSettings = settings is not None hasWidget = ("adjust." + widget) in settings if hasSettings else None if hasWidget is None: - gui.pages["adjust"].content.widgets[widget].storageVar.set(getattr(args, arg)) + gui.pages["adjust"].content.widgets[widget].storageVar.set(args[arg]) - gui.pages["randomizer"].pages["enemizer"].enemizerCLIpathVar.set(args.enemizercli) - gui.pages["randomizer"].pages["generation"].romVar.set(args.rom) + gui.pages["randomizer"].pages["enemizer"].enemizerCLIpathVar.set(args["enemizercli"]) + gui.pages["randomizer"].pages["generation"].romVar.set(args["rom"]) - if args.multi: - gui.pages["randomizer"].pages["multiworld"].widgets["worlds"].storageVar.set(str(args.multi)) - if args.seed: - gui.frames["bottom"].seedVar.set(str(args.seed)) - if args.count: - gui.frames["bottom"].widgets["generationcount"].storageVar.set(str(args.count)) - gui.outputPath.set(args.outputpath) + if args["multi"]: + gui.pages["randomizer"].pages["multiworld"].widgets["worlds"].storageVar.set(str(args["multi"])) + if args["seed"]: + gui.frames["bottom"].seedVar.set(str(args["seed"])) + if args["count"]: + gui.frames["bottom"].widgets["generationcount"].storageVar.set(str(args["count"])) + gui.outputPath.set(args["outputpath"]) def sprite_setter(spriteObject): gui.pages["randomizer"].pages["gameoptions"].widgets["sprite"]["spriteObject"] = spriteObject - if args.sprite is not None: - sprite_obj = args.sprite if isinstance(args.sprite, Sprite) else Sprite(args.sprite) + if args["sprite"] is not None: + sprite_obj = args.sprite if isinstance(args["sprite"], Sprite) else Sprite(args["sprite"]) r_sprite_flag = args.randomSprite if hasattr(args, 'randomSprite') else False set_sprite(sprite_obj, r_sprite_flag, spriteSetter=sprite_setter, spriteNameVar=gui.pages["randomizer"].pages["gameoptions"].widgets["sprite"]["spriteNameVar"], @@ -98,9 +47,9 @@ def loadcliargs(gui, args, settings=None): def sprite_setter_adj(spriteObject): gui.pages["adjust"].content.sprite = spriteObject - if args.sprite is not None: + if args["sprite"] is not None: sprite_obj = args.sprite if isinstance(args.sprite, Sprite) else Sprite(args.sprite) - r_sprite_flag = args.randomSprite if hasattr(args, 'randomSprite') else False + r_sprite_flag = args["randomSprite"] if hasattr(args, 'randomSprite') else False set_sprite(sprite_obj, r_sprite_flag, spriteSetter=sprite_setter_adj, spriteNameVar=gui.pages["adjust"].content.spriteNameVar2, randomSpriteVar=gui.randomSprite) diff --git a/gui/startinventory/overview.py b/gui/startinventory/overview.py index 4d177865..aaa601b3 100644 --- a/gui/startinventory/overview.py +++ b/gui/startinventory/overview.py @@ -43,15 +43,18 @@ def startinventory_page(top,parent): with open(os.path.join("resources","app","gui","custom","overview","widgets.json")) as widgetDefns: myDict = json.load(widgetDefns) - del myDict["itemList5"]["triforcepiecesgoal"] - del myDict["itemList5"]["rupoorcost"] + for key in CONST.CANTSTARTWITH: + for num in range(1, 5 + 1): + thisList = "itemList" + str(num) + 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] for key in CONST.CUSTOMITEMS: - if key not in ["triforcepiecesgoal", "rupoorcost"]: + if key not in CONST.CANTSTARTWITH: val = 0 if key in top.settings["startinventoryarray"]: val = top.settings["startinventoryarray"][key] From 97f771fe428ba62b90e04028e504cdff0cc4d9e5 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sun, 23 Feb 2020 22:01:44 -0800 Subject: [PATCH 110/117] Fix stuff --- CLI.py | 1 + DungeonRandomizer.py | 8 ++++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CLI.py b/CLI.py index 38fa91e8..9d1b8045 100644 --- a/CLI.py +++ b/CLI.py @@ -238,6 +238,7 @@ def parse_arguments(argv, no_defaults=False): parser.add_argument('--startinventory', default=defval(settings["startinventory"]), help='Specifies a list of items that will be in your starting inventory (separated by commas)') parser.add_argument('--usestartinventory', default=defval(settings["usestartinventory"] != 0), help='Not supported.') parser.add_argument('--custom', default=defval(settings["custom"] != 0), help='Not supported.') + parser.add_argument('--customitemarray', default=defval(settings["custom"] != 0), help='Not supported.') parser.add_argument('--accessibility', default=defval(settings["accessibility"]), const='items', nargs='?', choices=['items', 'locations', 'none'], help='''\ Select Item/Location Accessibility. (default: %(default)s) Items: You can reach all unique inventory items. No guarantees about diff --git a/DungeonRandomizer.py b/DungeonRandomizer.py index d872ed01..64a0e2d7 100755 --- a/DungeonRandomizer.py +++ b/DungeonRandomizer.py @@ -59,8 +59,12 @@ def start(): seed = random.randint(0, 999999999) for fail in failures: logger.info('%s seed failed with: %s', fail[1], fail[0]) - logger.info('Generation fail rate: %f%%', 100 * len(failures) / args.count) - logger.info('Generation success rate: %f%%', 100 * (args.count - len(failures)) / args.count) + fail_rate = 100 * len(failures) / args.count + success_rate = 100 * (args.count - len(failures)) / args.count + fail_rate = str(fail_rate).split('.') + success_rate = str(success_rate).split('.') + logger.info('Generation fail rate: ' + str(fail_rate[0] ).rjust(3, " ") + '.' + str(fail_rate[1] ).ljust(6, '0') + '%') + logger.info('Generation success rate: ' + str(success_rate[0]).rjust(3, " ") + '.' + str(success_rate[1]).ljust(6, '0') + '%') else: main(seed=args.seed, args=args) From c3a7f69c4bb04843305c54b00637e446a868bdc3 Mon Sep 17 00:00:00 2001 From: "Mike A. Trethewey" Date: Sun, 23 Feb 2020 22:46:50 -0800 Subject: [PATCH 111/117] Prelim build scripts --- .gitignore | 3 +++ CLI.py | 12 ++++++--- DungeonRandomizer.spec | 59 ++++++++++++++++++++++++++++++++++++++++++ Gui.spec | 59 ++++++++++++++++++++++++++++++++++++++++++ Utils.py | 2 ++ build-dr.py | 21 +++++++++++++++ build-gui.py | 21 +++++++++++++++ 7 files changed, 173 insertions(+), 4 deletions(-) create mode 100644 DungeonRandomizer.spec create mode 100644 Gui.spec create mode 100644 build-dr.py create mode 100644 build-gui.py diff --git a/.gitignore b/.gitignore index 9f9fc87a..91b22ab9 100644 --- a/.gitignore +++ b/.gitignore @@ -16,10 +16,13 @@ README.html EnemizerCLI/ .mypy_cache/ RaceRom.py +upx/ weights/ settings.json working_dirs.json +*.exe + venv test diff --git a/CLI.py b/CLI.py index 9d1b8045..69a00b09 100644 --- a/CLI.py +++ b/CLI.py @@ -238,7 +238,7 @@ def parse_arguments(argv, no_defaults=False): parser.add_argument('--startinventory', default=defval(settings["startinventory"]), help='Specifies a list of items that will be in your starting inventory (separated by commas)') parser.add_argument('--usestartinventory', default=defval(settings["usestartinventory"] != 0), help='Not supported.') parser.add_argument('--custom', default=defval(settings["custom"] != 0), help='Not supported.') - parser.add_argument('--customitemarray', default=defval(settings["custom"] != 0), help='Not supported.') + parser.add_argument('--customitemarray', default={}, help='Not supported.') parser.add_argument('--accessibility', default=defval(settings["accessibility"]), const='items', nargs='?', choices=['items', 'locations', 'none'], help='''\ Select Item/Location Accessibility. (default: %(default)s) Items: You can reach all unique inventory items. No guarantees about @@ -492,11 +492,15 @@ def get_args_priority(settings_args, gui_args, cli_args): args["cli"] = {} cli = vars(parse_arguments(None)) for k,v in cli.items(): - if isinstance(v,dict): + if isinstance(v,dict) and 1 in v: args["cli"][k] = v[1] else: args["cli"][k] = v - if k not in args["load"] or args["load"][k] != args["cli"]: - args["load"][k] = args["cli"][k] + load_doesnt_have_key = k not in args["load"] + different_val = (k in args["load"] and k in args["cli"]) and (args["load"][k] != args["cli"][k]) + cli_has_empty_dict = k in args["cli"] and isinstance(args["cli"][k],dict) and len(args["cli"][k]) == 0 + if load_doesnt_have_key or different_val: + if not cli_has_empty_dict: + args["load"][k] = args["cli"][k] return args diff --git a/DungeonRandomizer.spec b/DungeonRandomizer.spec new file mode 100644 index 00000000..7b8de387 --- /dev/null +++ b/DungeonRandomizer.spec @@ -0,0 +1,59 @@ +# -*- mode: python -*- + +block_cipher = None +console = True + +def recurse_for_py_files(names_so_far): + returnvalue = [] + for name in os.listdir(os.path.join(*names_so_far)): + if name != "__pycache__": + subdir_name = os.path.join(*names_so_far, name) + if os.path.isdir(subdir_name): + new_name_list = names_so_far + [name] + for filename in os.listdir(os.path.join(*new_name_list)): + base_file,file_extension = os.path.splitext(filename) + if file_extension == ".py": + new_name = ".".join(new_name_list+[base_file]) + if not new_name in returnvalue: + returnvalue.append(new_name) + returnvalue.extend(recurse_for_py_files(new_name_list)) + returnvalue.append("PIL._tkinter_finder") #Linux needs this + return returnvalue + +hiddenimports = [] + +a = Analysis(['DungeonRandomizer.py'], + pathex=[], + binaries=[], + datas=[], + hiddenimports=hiddenimports, + hookspath=[], + runtime_hooks=[], + excludes=[], + win_no_prefer_redirects=False, + win_private_assemblies=False, + cipher=block_cipher, + noarchive=False) + +# https://stackoverflow.com/questions/17034434/how-to-remove-exclude-modules-and-files-from-pyinstaller +excluded_binaries = [ + 'VCRUNTIME140.dll', + 'msvcp140.dll', + 'mfc140u.dll'] +a.binaries = TOC([x for x in a.binaries if x[0] not in excluded_binaries]) + +pyz = PYZ(a.pure, a.zipped_data, + cipher=block_cipher) +exe = EXE(pyz, + a.scripts, + a.binaries, + a.zipfiles, + a.datas, + [], + name='DungeonRandomizer', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + runtime_tmpdir=None, + console=console ) # <--- change this to True to enable command prompt when the app runs diff --git a/Gui.spec b/Gui.spec new file mode 100644 index 00000000..cd6de67d --- /dev/null +++ b/Gui.spec @@ -0,0 +1,59 @@ +# -*- mode: python -*- + +block_cipher = None +console = True + +def recurse_for_py_files(names_so_far): + returnvalue = [] + for name in os.listdir(os.path.join(*names_so_far)): + if name != "__pycache__": + subdir_name = os.path.join(*names_so_far, name) + if os.path.isdir(subdir_name): + new_name_list = names_so_far + [name] + for filename in os.listdir(os.path.join(*new_name_list)): + base_file,file_extension = os.path.splitext(filename) + if file_extension == ".py": + new_name = ".".join(new_name_list+[base_file]) + if not new_name in returnvalue: + returnvalue.append(new_name) + returnvalue.extend(recurse_for_py_files(new_name_list)) + returnvalue.append("PIL._tkinter_finder") #Linux needs this + return returnvalue + +hiddenimports = [] + +a = Analysis(['Gui.py'], + pathex=[], + binaries=[], + datas=[], + hiddenimports=hiddenimports, + hookspath=[], + runtime_hooks=[], + excludes=[], + win_no_prefer_redirects=False, + win_private_assemblies=False, + cipher=block_cipher, + noarchive=False) + +# https://stackoverflow.com/questions/17034434/how-to-remove-exclude-modules-and-files-from-pyinstaller +excluded_binaries = [ + 'VCRUNTIME140.dll', + 'msvcp140.dll', + 'mfc140u.dll'] +a.binaries = TOC([x for x in a.binaries if x[0] not in excluded_binaries]) + +pyz = PYZ(a.pure, a.zipped_data, + cipher=block_cipher) +exe = EXE(pyz, + a.scripts, + a.binaries, + a.zipfiles, + a.datas, + [], + name='Gui', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + runtime_tmpdir=None, + console=console ) # <--- change this to True to enable command prompt when the app runs diff --git a/Utils.py b/Utils.py index a52e8616..d616ef22 100644 --- a/Utils.py +++ b/Utils.py @@ -34,6 +34,8 @@ def is_bundled(): return getattr(sys, 'frozen', False) def local_path(path): + return path + if local_path.cached_path is not None: return os.path.join(local_path.cached_path, path) diff --git a/build-dr.py b/build-dr.py new file mode 100644 index 00000000..120028d9 --- /dev/null +++ b/build-dr.py @@ -0,0 +1,21 @@ +import subprocess +import os +import shutil + +DEST_DIRECTORY = '.' + +if os.path.isdir("upx"): + upx_string = "--upx-dir=upx" +else: + upx_string = "" + +if os.path.isdir("build"): + shutil.rmtree("build") + +subprocess.run(" ".join(["pyinstaller DungeonRandomizer.spec ", + upx_string, + "-y ", + "--onefile ", + f"--distpath {DEST_DIRECTORY} ", + ]), + shell=True) diff --git a/build-gui.py b/build-gui.py new file mode 100644 index 00000000..3f63548d --- /dev/null +++ b/build-gui.py @@ -0,0 +1,21 @@ +import subprocess +import os +import shutil + +DEST_DIRECTORY = '.' + +if os.path.isdir("upx"): + upx_string = "--upx-dir=upx" +else: + upx_string = "" + +if os.path.isdir("build"): + shutil.rmtree("build") + +subprocess.run(" ".join(["pyinstaller Gui.spec ", + upx_string, + "-y ", + "--onefile ", + f"--distpath {DEST_DIRECTORY} ", + ]), + shell=True) From 531a1d642309dfb2d11e831dcfb08d68585eb60e Mon Sep 17 00:00:00 2001 From: compiling <8335770+compiling@users.noreply.github.com> Date: Sat, 22 Feb 2020 22:21:04 +1100 Subject: [PATCH 112/117] Inverted Bomb Shop can't go on Spectacle Rock Cave bottom entrances Fix inverted bomb rules for Inverted Big Bomb Shop, Inverted Dark Sanctuary, Inverted Links House. --- EntranceShuffle.py | 2 -- Rules.py | 9 ++++----- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/EntranceShuffle.py b/EntranceShuffle.py index e1813011..c4747374 100644 --- a/EntranceShuffle.py +++ b/EntranceShuffle.py @@ -2298,8 +2298,6 @@ Bomb_Shop_Multi_Cave_Doors = ['Hyrule Castle Entrance (South)', 'Death Mountain Return Cave (East)', 'Death Mountain Return Cave (West)', 'Spectacle Rock Cave Peak', - 'Spectacle Rock Cave', - 'Spectacle Rock Cave (Bottom)', 'Paradox Cave (Bottom)', 'Paradox Cave (Middle)', 'Paradox Cave (Top)', diff --git a/Rules.py b/Rules.py index c243ce2d..291eb11e 100644 --- a/Rules.py +++ b/Rules.py @@ -1185,14 +1185,13 @@ def set_inverted_big_bomb_rules(world, player): 'Hyrule Castle Entrance (East)', 'Inverted Ganons Tower', 'Cave 45', - 'Checkerboard Cave'] + 'Checkerboard Cave', + 'Inverted Big Bomb Shop'] LW_DM_entrances = ['Old Man Cave (East)', 'Old Man House (Bottom)', 'Old Man House (Top)', 'Death Mountain Return Cave (East)', 'Spectacle Rock Cave Peak', - 'Spectacle Rock Cave', - 'Spectacle Rock Cave (Bottom)', 'Tower of Hera', 'Death Mountain Return Cave (West)', 'Paradox Cave (Top)', @@ -1212,7 +1211,7 @@ def set_inverted_big_bomb_rules(world, player): 'Chest Game', 'Dark World Hammer Peg Cave', 'Red Shield Shop', - 'Dark Sanctuary Hint', + 'Inverted Dark Sanctuary', 'Fortune Teller (Dark)', 'Dark World Shop', 'Dark World Lumberjack Shop', @@ -1222,7 +1221,7 @@ def set_inverted_big_bomb_rules(world, player): Southern_DW_entrances = ['Hype Cave', 'Bonk Fairy (Dark)', 'Archery Game', - 'Inverted Big Bomb Shop', + 'Inverted Links House', 'Dark Lake Hylia Shop', 'Swamp Palace'] Isolated_DW_entrances = ['Spike Cave', From d7939e0296986485665e9c57886953bc5aa90de7 Mon Sep 17 00:00:00 2001 From: compiling <8335770+compiling@users.noreply.github.com> Date: Fri, 28 Feb 2020 23:30:55 +1100 Subject: [PATCH 113/117] Fix GT boss shuffle for crossed dungeons. --- Bosses.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Bosses.py b/Bosses.py index 4c748391..ea02b8ba 100644 --- a/Bosses.py +++ b/Bosses.py @@ -183,6 +183,10 @@ def place_bosses(world, player): raise FillError('Could not place boss for location %s' % loc_text) bosses.remove(boss) + # GT Bosses can move dungeon - find the real dungeon to place them in + if level: + loc = [x.name for x in world.dungeons if x.player == player and level in x.bosses.keys()][0] + loc_text = loc + ' (' + level + ')' logging.getLogger('').debug('Placing boss %s at %s', boss, loc_text) world.get_dungeon(loc, player).bosses[level] = BossFactory(boss, player) elif world.boss_shuffle[player] == "chaos": #all bosses chosen at random @@ -193,5 +197,9 @@ def place_bosses(world, player): except IndexError: raise FillError('Could not place boss for location %s' % loc_text) + # GT Bosses can move dungeon - find the real dungeon to place them in + if level: + loc = [x.name for x in world.dungeons if x.player == player and level in x.bosses.keys()][0] + loc_text = loc + ' (' + level + ')' logging.getLogger('').debug('Placing boss %s at %s', boss, loc_text) world.get_dungeon(loc, player).bosses[level] = BossFactory(boss, player) From a20f5423fd426e41de298d1637c0e4cd983325f3 Mon Sep 17 00:00:00 2001 From: aerinon Date: Fri, 28 Feb 2020 16:35:45 -0700 Subject: [PATCH 114/117] Minor gui fixes --- BaseClasses.py | 10 ++++++++++ CLI.py | 2 +- Rom.py | 4 ++-- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index 03c40c21..ff001247 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -769,6 +769,16 @@ class CollectionState(object): else: self.prog_items.add(('Bow', item.player)) changed = True + elif 'Armor' in item.name: + if self.has('Red Mail', item.player): + pass + elif self.has('Blue Mail', item.player): + self.prog_items.add(('Red Mail', item.player)) + changed = True + else: + self.prog_items.add(('Blue Mail', item.player)) + changed = True + elif item.name.startswith('Bottle'): if self.bottle_count(item.player) < self.world.difficulty_requirements[item.player].progressive_bottle_limit: self.prog_items.add((item.name, item.player)) diff --git a/CLI.py b/CLI.py index 69a00b09..45e2edb7 100644 --- a/CLI.py +++ b/CLI.py @@ -373,7 +373,7 @@ def get_settings(): "uw_palettes": "default", "create_spoiler": False, - "skip_playthrough": True, + "skip_playthrough": False, "suppress_rom": False, "usestartinventory": False, "custom": False, diff --git a/Rom.py b/Rom.py index ba09a30d..84bfa05e 100644 --- a/Rom.py +++ b/Rom.py @@ -981,8 +981,8 @@ def patch_rom(world, rom, player, team, enemized): startingstate = CollectionState(world) if startingstate.has('Bow', player): - equip[0x340] = 1 - equip[0x38E] |= 0x20 # progressive flag to get the correct hint in all cases + equip[0x340] = 3 if startingstate.has('Silver Arrows', player) else 1 + equip[0x38E] |= 0x20 # progressive flag to get the correct hint in all cases if not world.retro[player]: equip[0x38E] |= 0x80 if startingstate.has('Silver Arrows', player): From 8bdbf5d6b2067368da88ff8dae6be8858a605f88 Mon Sep 17 00:00:00 2001 From: aerinon Date: Mon, 2 Mar 2020 15:04:46 -0700 Subject: [PATCH 115/117] Saves sprite settings Save on exit feature Some formatting changes --- CLI.py | 342 +++++++++--------- Gui.py | 23 +- classes/constants.py | 3 +- gui/loadcliargs.py | 12 +- .../gui/randomize/generation/checkboxes.json | 19 + 5 files changed, 213 insertions(+), 186 deletions(-) diff --git a/CLI.py b/CLI.py index 45e2edb7..ecb24e80 100644 --- a/CLI.py +++ b/CLI.py @@ -9,7 +9,6 @@ import shlex import sys from Main import main -from Rom import get_sprite_from_name from Utils import is_bundled, close_console from Fill import FillError @@ -264,7 +263,7 @@ def parse_arguments(argv, no_defaults=False): help='Select the color of Link\'s heart meter. (default: %(default)s)') parser.add_argument('--ow_palettes', default=defval(settings["ow_palettes"]), choices=['default', 'random', 'blackout']) parser.add_argument('--uw_palettes', default=defval(settings["uw_palettes"]), choices=['default', 'random', 'blackout']) - parser.add_argument('--sprite', help='''\ + parser.add_argument('--sprite', default=defval(settings["sprite"]), help='''\ Path to a sprite sheet to use for Link. Needs to be in binary format and have a length of 0x7000 (28672) bytes, or 0x7078 (28792) bytes including palette data. @@ -291,6 +290,7 @@ def parse_arguments(argv, no_defaults=False): parser.add_argument('--teams', default=defval(1), type=lambda value: max(int(value), 1)) parser.add_argument('--outputpath', default=defval(settings["outputpath"])) parser.add_argument('--race', default=defval(settings["race"] != 0), action='store_true') + parser.add_argument('--saveonexit', default=defval(settings["saveonexit"]), choices=['never', 'ask', 'always']) parser.add_argument('--outputname') if multiargs.multi: @@ -322,185 +322,187 @@ def parse_arguments(argv, no_defaults=False): return ret + def get_settings(): - # set default settings - settings = { - "retro": False, - "mode": "open", - "logic": "noglitches", - "goal": "ganon", - "crystals_gt": "7", - "crystals_ganon": "7", - "swords": "random", - "difficulty": "normal", - "item_functionality": "normal", - "timer": "none", - "progressive": "on", - "accessibility": "items", - "algorithm": "balanced", + # set default settings + settings = { + "retro": False, + "mode": "open", + "logic": "noglitches", + "goal": "ganon", + "crystals_gt": "7", + "crystals_ganon": "7", + "swords": "random", + "difficulty": "normal", + "item_functionality": "normal", + "timer": "none", + "progressive": "on", + "accessibility": "items", + "algorithm": "balanced", - "openpyramid": False, - "shuffleganon": False, - "shuffle": "vanilla", + "openpyramid": False, + "shuffleganon": False, + "shuffle": "vanilla", - "shufflepots": False, - "shuffleenemies": "none", - "shufflebosses": "none", - "enemy_damage": "default", - "enemy_health": "default", - "enemizercli": os.path.join(".","EnemizerCLI","EnemizerCLI.Core"), + "shufflepots": False, + "shuffleenemies": "none", + "shufflebosses": "none", + "enemy_damage": "default", + "enemy_health": "default", + "enemizercli": os.path.join(".", "EnemizerCLI", "EnemizerCLI.Core"), - "mapshuffle": False, - "compassshuffle": False, - "keyshuffle": False, - "bigkeyshuffle": False, - "keysanity": False, - "door_shuffle": "basic", - "experimental": 0, - "dungeon_counters": "off", + "mapshuffle": False, + "compassshuffle": False, + "keyshuffle": False, + "bigkeyshuffle": False, + "keysanity": False, + "door_shuffle": "basic", + "experimental": 0, + "dungeon_counters": "off", - "multi": 1, - "names": "", + "multi": 1, + "names": "", - "hints": True, - "disablemusic": False, - "quickswap": False, - "heartcolor": "red", - "heartbeep": "normal", - "sprite": None, - "fastmenu": "normal", - "ow_palettes": "default", - "uw_palettes": "default", + "hints": True, + "disablemusic": False, + "quickswap": False, + "heartcolor": "red", + "heartbeep": "normal", + "sprite": None, + "fastmenu": "normal", + "ow_palettes": "default", + "uw_palettes": "default", - "create_spoiler": False, - "skip_playthrough": False, - "suppress_rom": False, - "usestartinventory": False, - "custom": False, - "rom": os.path.join(".","Zelda no Densetsu - Kamigami no Triforce (Japan).sfc"), + "create_spoiler": False, + "skip_playthrough": False, + "suppress_rom": False, + "usestartinventory": False, + "custom": False, + "rom": os.path.join(".", "Zelda no Densetsu - Kamigami no Triforce (Japan).sfc"), - "seed": None, - "count": 1, - "startinventory": "", - "beemizer": 0, - "remote_items": False, - "race": False, - "customitemarray": { - "bow": 0, - "progressivebow": 2, - "boomerang": 1, - "redmerang": 1, - "hookshot": 1, - "mushroom": 1, - "powder": 1, - "firerod": 1, - "icerod": 1, - "bombos": 1, - "ether": 1, - "quake": 1, - "lamp": 1, - "hammer": 1, - "shovel": 1, - "flute": 1, - "bugnet": 1, - "book": 1, - "bottle": 4, - "somaria": 1, - "byrna": 1, - "cape": 1, - "mirror": 1, - "boots": 1, - "powerglove": 0, - "titansmitt": 0, - "progressiveglove": 2, - "flippers": 1, - "pearl": 1, - "heartpiece": 24, - "heartcontainer": 10, - "sancheart": 1, - "sword1": 0, - "sword2": 0, - "sword3": 0, - "sword4": 0, - "progressivesword": 4, - "shield1": 0, - "shield2": 0, - "shield3": 0, - "progressiveshield": 3, - "mail2": 0, - "mail3": 0, - "progressivemail": 2, - "halfmagic": 1, - "quartermagic": 0, - "bombsplus5": 0, - "bombsplus10": 0, - "arrowsplus5": 0, - "arrowsplus10": 0, - "arrow1": 1, - "arrow10": 12, - "bomb1": 0, - "bomb3": 16, - "bomb10": 1, - "rupee1": 2, - "rupee5": 4, - "rupee20": 28, - "rupee50": 7, - "rupee100": 1, - "rupee300": 5, - "blueclock": 0, - "greenclock": 0, - "redclock": 0, - "silversupgrade": 0, - "generickeys": 0, - "triforcepieces": 0, - "triforcepiecesgoal": 0, - "triforce": 0, - "rupoor": 0, - "rupoorcost": 10 - }, - "randomSprite": False, - "outputpath": os.path.join(".") - } - settings["startinventoryarray"] = {} - if sys.platform.lower().find("windows"): - settings["enemizercli"] += ".exe" + "seed": None, + "count": 1, + "startinventory": "", + "beemizer": 0, + "remote_items": False, + "race": False, + "customitemarray": { + "bow": 0, + "progressivebow": 2, + "boomerang": 1, + "redmerang": 1, + "hookshot": 1, + "mushroom": 1, + "powder": 1, + "firerod": 1, + "icerod": 1, + "bombos": 1, + "ether": 1, + "quake": 1, + "lamp": 1, + "hammer": 1, + "shovel": 1, + "flute": 1, + "bugnet": 1, + "book": 1, + "bottle": 4, + "somaria": 1, + "byrna": 1, + "cape": 1, + "mirror": 1, + "boots": 1, + "powerglove": 0, + "titansmitt": 0, + "progressiveglove": 2, + "flippers": 1, + "pearl": 1, + "heartpiece": 24, + "heartcontainer": 10, + "sancheart": 1, + "sword1": 0, + "sword2": 0, + "sword3": 0, + "sword4": 0, + "progressivesword": 4, + "shield1": 0, + "shield2": 0, + "shield3": 0, + "progressiveshield": 3, + "mail2": 0, + "mail3": 0, + "progressivemail": 2, + "halfmagic": 1, + "quartermagic": 0, + "bombsplus5": 0, + "bombsplus10": 0, + "arrowsplus5": 0, + "arrowsplus10": 0, + "arrow1": 1, + "arrow10": 12, + "bomb1": 0, + "bomb3": 16, + "bomb10": 1, + "rupee1": 2, + "rupee5": 4, + "rupee20": 28, + "rupee50": 7, + "rupee100": 1, + "rupee300": 5, + "blueclock": 0, + "greenclock": 0, + "redclock": 0, + "silversupgrade": 0, + "generickeys": 0, + "triforcepieces": 0, + "triforcepiecesgoal": 0, + "triforce": 0, + "rupoor": 0, + "rupoorcost": 10 + }, + "randomSprite": False, + "outputpath": os.path.join("."), + "saveonexit": "ask", + "startinventoryarray": {} + } + + if sys.platform.lower().find("windows"): + settings["enemizercli"] += ".exe" + + # read saved settings file if it exists and set these + settings_path = os.path.join(".", "resources", "user", "settings.json") + if os.path.exists(settings_path): + with(open(settings_path)) as json_file: + data = json.load(json_file) + for k, v in data.items(): + settings[k] = v + return settings - # read saved settings file if it exists and set these - settings_path = os.path.join(".", "resources", "user", "settings.json") - if os.path.exists(settings_path): - with(open(settings_path)) as json_file: - data = json.load(json_file) - if 'sprite' in data.keys() and data['sprite']: - data['sprite'] = get_sprite_from_name(data['sprite']) - for k,v in data.items(): - settings[k] = v - return settings def get_args_priority(settings_args, gui_args, cli_args): - args = {} - args["settings"] = get_settings() if settings_args is None else settings_args - args["gui"] = {} if gui_args is None else gui_args - args["cli"] = cli_args + args = {} + args["settings"] = get_settings() if settings_args is None else settings_args + args["gui"] = {} if gui_args is None else gui_args + args["cli"] = cli_args - args["load"] = args["settings"] - if args["gui"] is not None: - for k in args["gui"]: - if k not in args["load"] or args["load"][k] != args["gui"]: - args["load"][k] = args["gui"][k] + args["load"] = args["settings"] + if args["gui"] is not None: + for k in args["gui"]: + if k not in args["load"] or args["load"][k] != args["gui"]: + args["load"][k] = args["gui"][k] - if args["cli"] is None: - args["cli"] = {} - cli = vars(parse_arguments(None)) - for k,v in cli.items(): - if isinstance(v,dict) and 1 in v: - args["cli"][k] = v[1] - else: - args["cli"][k] = v - load_doesnt_have_key = k not in args["load"] - different_val = (k in args["load"] and k in args["cli"]) and (args["load"][k] != args["cli"][k]) - cli_has_empty_dict = k in args["cli"] and isinstance(args["cli"][k],dict) and len(args["cli"][k]) == 0 - if load_doesnt_have_key or different_val: - if not cli_has_empty_dict: - args["load"][k] = args["cli"][k] + if args["cli"] is None: + args["cli"] = {} + cli = vars(parse_arguments(None)) + for k, v in cli.items(): + if isinstance(v, dict) and 1 in v: + args["cli"][k] = v[1] + else: + args["cli"][k] = v + load_doesnt_have_key = k not in args["load"] + different_val = (k in args["load"] and k in args["cli"]) and (args["load"][k] != args["cli"][k]) + cli_has_empty_dict = k in args["cli"] and isinstance(args["cli"][k], dict) and len(args["cli"][k]) == 0 + if load_doesnt_have_key or different_val: + if not cli_has_empty_dict: + args["load"][k] = args["cli"][k] - return args + return args diff --git a/Gui.py b/Gui.py index 40605db6..632b9a43 100755 --- a/Gui.py +++ b/Gui.py @@ -21,7 +21,6 @@ from gui.randomize.generation import generation_page from gui.bottom import bottom_frame, create_guiargs from GuiUtils import set_icon from Main import __version__ as ESVersion -from Rom import get_sprite_from_name def guiMain(args=None): @@ -36,21 +35,29 @@ def guiMain(args=None): f.write(json.dumps(args, indent=2)) os.chmod(os.path.join(settings_path, "settings.json"),0o755) - def save_settings_from_gui(): + def save_settings_from_gui(confirm): gui_args = vars(create_guiargs(self)) if self.randomSprite.get(): gui_args['sprite'] = 'random' elif gui_args['sprite']: gui_args['sprite'] = gui_args['sprite'].name save_settings(gui_args) - messagebox.showinfo("Door Shuffle " + ESVersion,"Settings saved from GUI.") + if confirm: + messagebox.showinfo("Door Shuffle " + ESVersion, "Settings saved from GUI.") # routine for exiting the app def guiExit(): - dosave = messagebox.askyesno("Door Shuffle " + ESVersion, "Save settings before exit?") - if dosave: - save_settings_from_gui() - sys.exit(0) + skip_exit = False + if self.settings['saveonexit'] == 'ask': + dosave = messagebox.askyesnocancel("Door Shuffle " + ESVersion, "Save settings before exit?") + if dosave: + save_settings_from_gui(True) + if dosave is None: + skip_exit = True + elif self.settings['saveonexit'] == 'always': + save_settings_from_gui(False) + if not skip_exit: + sys.exit(0) # make main window # add program title & version number @@ -137,7 +144,7 @@ def guiMain(args=None): # bottom of window: Open Output Directory, Open Documentation (if exists) self.frames["bottom"] = bottom_frame(self, self, None) ## Save Settings Button - savesettingsButton = Button(self.frames["bottom"], text='Save Settings to File', command=save_settings_from_gui) + savesettingsButton = Button(self.frames["bottom"], text='Save Settings to File', command=lambda: save_settings_from_gui(True)) savesettingsButton.pack(side=RIGHT) # set bottom frame to main window diff --git a/classes/constants.py b/classes/constants.py index 90434970..b822628f 100644 --- a/classes/constants.py +++ b/classes/constants.py @@ -102,7 +102,8 @@ SETTINGSTOPROCESS = { "spoiler": "create_spoiler", "suppressrom": "suppress_rom", "usestartinventory": "usestartinventory", - "usecustompool": "custom" + "usecustompool": "custom", + "saveonexit": "saveonexit" } } } diff --git a/gui/loadcliargs.py b/gui/loadcliargs.py index 14a8b007..846daaa8 100644 --- a/gui/loadcliargs.py +++ b/gui/loadcliargs.py @@ -1,6 +1,6 @@ from classes.SpriteSelector import SpriteSelector as spriteSelector from gui.randomize.gameoptions import set_sprite -from Rom import Sprite +from Rom import Sprite, get_sprite_from_name import classes.constants as CONST def loadcliargs(gui, args, settings=None): @@ -39,18 +39,16 @@ def loadcliargs(gui, args, settings=None): def sprite_setter(spriteObject): gui.pages["randomizer"].pages["gameoptions"].widgets["sprite"]["spriteObject"] = spriteObject if args["sprite"] is not None: - sprite_obj = args.sprite if isinstance(args["sprite"], Sprite) else Sprite(args["sprite"]) - r_sprite_flag = args.randomSprite if hasattr(args, 'randomSprite') else False - set_sprite(sprite_obj, r_sprite_flag, spriteSetter=sprite_setter, + sprite_obj = args.sprite if isinstance(args["sprite"], Sprite) else get_sprite_from_name(args["sprite"]) + set_sprite(sprite_obj, False, spriteSetter=sprite_setter, spriteNameVar=gui.pages["randomizer"].pages["gameoptions"].widgets["sprite"]["spriteNameVar"], randomSpriteVar=gui.randomSprite) def sprite_setter_adj(spriteObject): gui.pages["adjust"].content.sprite = spriteObject if args["sprite"] is not None: - sprite_obj = args.sprite if isinstance(args.sprite, Sprite) else Sprite(args.sprite) - r_sprite_flag = args["randomSprite"] if hasattr(args, 'randomSprite') else False - set_sprite(sprite_obj, r_sprite_flag, spriteSetter=sprite_setter_adj, + sprite_obj = args.sprite if isinstance(args["sprite"], Sprite) else get_sprite_from_name(args["sprite"]) + set_sprite(sprite_obj, False, spriteSetter=sprite_setter_adj, spriteNameVar=gui.pages["adjust"].content.spriteNameVar2, randomSpriteVar=gui.randomSprite) diff --git a/resources/app/gui/randomize/generation/checkboxes.json b/resources/app/gui/randomize/generation/checkboxes.json index 7d0fedbf..b7228c78 100644 --- a/resources/app/gui/randomize/generation/checkboxes.json +++ b/resources/app/gui/randomize/generation/checkboxes.json @@ -22,5 +22,24 @@ "label": { "text": "Use custom item pool" } + }, + "saveonexit": { + "type": "selectbox", + "label": { + "text": "Save Settings on Exit" + }, + "managerAttrs": { + "label": { + "side": "left" + }, + "selectbox": { + "side": "right" + } + }, + "options": { + "Ask Me": "ask", + "Always": "always", + "Never": "never" + } } } From 7ecb416c070c8d5d724bf01f632c4e3aa1b4375b Mon Sep 17 00:00:00 2001 From: aerinon Date: Mon, 2 Mar 2020 15:13:04 -0700 Subject: [PATCH 116/117] Increment version --- Main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Main.py b/Main.py index 57fcc29c..978d3e7e 100644 --- a/Main.py +++ b/Main.py @@ -24,7 +24,7 @@ from Fill import distribute_items_cutoff, distribute_items_staleness, distribute from ItemList import generate_itempool, difficulties, fill_prizes from Utils import output_path, parse_player_names -__version__ = '0.0.17.2p' +__version__ = '0.0.18dev' def main(args, seed=None): From c9656d1ac9bdbf2b35a869c3cdd1924ca4011911 Mon Sep 17 00:00:00 2001 From: aerinon Date: Mon, 2 Mar 2020 15:25:26 -0700 Subject: [PATCH 117/117] Made count default "none" --- CLI.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CLI.py b/CLI.py index ecb24e80..b3bbe78b 100644 --- a/CLI.py +++ b/CLI.py @@ -211,7 +211,7 @@ def parse_arguments(argv, no_defaults=False): parser.add_argument('--rom', default=defval(settings["rom"]), help='Path to an ALttP JAP(1.0) rom to use as a base.') parser.add_argument('--loglevel', default=defval('info'), const='info', nargs='?', choices=['error', 'info', 'warning', 'debug'], help='Select level of logging for output.') parser.add_argument('--seed', default=defval(int(settings["seed"]) if settings["seed"] != "" and settings["seed"] is not None else None), help='Define seed number to generate.', type=int) - parser.add_argument('--count', default=defval(int(settings["count"]) if settings["count"] != "" and settings["count"] is not None else 1), help='''\ + parser.add_argument('--count', default=defval(int(settings["count"]) if settings["count"] != "" and settings["count"] is not None else None), help='''\ Use to batch generate multiple seeds with same settings. If --seed is provided, it will be used for the first seed, then used to derive the next seed (i.e. generating 10 seeds with @@ -381,7 +381,7 @@ def get_settings(): "rom": os.path.join(".", "Zelda no Densetsu - Kamigami no Triforce (Japan).sfc"), "seed": None, - "count": 1, + "count": None, "startinventory": "", "beemizer": 0, "remote_items": False,