diff --git a/Adjuster.py b/Adjuster.py index f98f38fa..4f3465fb 100755 --- a/Adjuster.py +++ b/Adjuster.py @@ -4,9 +4,11 @@ import os import logging import textwrap import sys +import time + +from Rom import Sprite, LocalRom, apply_rom_settings +from Utils import output_path -from AdjusterMain import adjust -from Rom import Sprite class ArgumentDefaultsHelpFormatter(argparse.RawTextHelpFormatter): @@ -51,25 +53,127 @@ def main(): parser.add_argument('--names', default='', type=str) args = parser.parse_args() - # ToDo: Validate files further than mere existance - if not os.path.isfile(args.rom): - input( - 'Could not find valid rom for patching at expected path %s. Please run with -h to see help for further information. \nPress Enter to exit.' % args.rom) - sys.exit(1) - if args.sprite is not None and not os.path.isfile(args.sprite) and not Sprite.get_sprite_from_name(args.sprite): - input('Could not find link sprite sheet at given location. \nPress Enter to exit.') - sys.exit(1) - # set up logger loglevel = {'error': logging.ERROR, 'info': logging.INFO, 'warning': logging.WARNING, 'debug': logging.DEBUG}[ args.loglevel] logging.basicConfig(format='%(message)s', level=loglevel) - args, path = adjust(args=args) - from Utils import persistent_store - from Rom import Sprite - if isinstance(args.sprite, Sprite): - args.sprite = args.sprite.name - persistent_store("adjuster", "last_settings_3", args) + + if not os.path.isfile(args.rom): + adjustGUI() + else: + if args.sprite is not None and not os.path.isfile(args.sprite) and not Sprite.get_sprite_from_name(args.sprite): + input('Could not find link sprite sheet at given location. \nPress Enter to exit.') + sys.exit(1) + + args, path = adjust(args=args) + from Utils import persistent_store + if isinstance(args.sprite, Sprite): + args.sprite = args.sprite.name + persistent_store("adjuster", "last_settings_3", args) + + +def adjust(args): + start = time.perf_counter() + logger = logging.getLogger('Adjuster') + logger.info('Patching ROM.') + vanillaRom = args.baserom + if os.path.splitext(args.rom)[-1].lower() == '.bmbp': + import Patch + meta, args.rom = Patch.create_rom_file(args.rom) + + if os.stat(args.rom).st_size in (0x200000, 0x400000) and os.path.splitext(args.rom)[-1].lower() == '.sfc': + rom = LocalRom(args.rom, patch=False, vanillaRom=vanillaRom) + else: + raise RuntimeError( + 'Provided Rom is not a valid Link to the Past Randomizer Rom. Please provide one for adjusting.') + palettes_options={} + palettes_options['dungeon']=args.uw_palettes + + palettes_options['overworld']=args.ow_palettes + palettes_options['hud']=args.hud_palettes + palettes_options['sword']=args.sword_palettes + palettes_options['shield']=args.shield_palettes + # palettes_options['link']=args.link_palettesvera + racerom = rom.read_byte(0x180213) > 0 + + apply_rom_settings(rom, args.heartbeep, args.heartcolor, args.quickswap, args.fastmenu, args.disablemusic, + args.sprite, palettes_options, reduceflashing=args.reduceflashing or racerom) + path = output_path(f'{os.path.basename(args.rom)[:-4]}_adjusted.sfc') + rom.write_to_file(path) + + logger.info('Done. Enjoy.') + logger.debug('Total Time: %s', time.perf_counter() - start) + + return args, path + +def adjustGUI(): + 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 Gui import get_rom_options_frame, get_rom_frame + from GuiUtils import set_icon + from argparse import Namespace + from Main import __version__ as MWVersion + adjustWindow = Tk() + adjustWindow.wm_title("Berserker's Multiworld %s LttP Adjuster" % MWVersion) + set_icon(adjustWindow) + + rom_options_frame, rom_vars, set_sprite = get_rom_options_frame(adjustWindow) + + bottomFrame2 = Frame(adjustWindow) + + romFrame, romVar = get_rom_frame(adjustWindow) + + romDialogFrame = Frame(adjustWindow) + baseRomLabel2 = Label(romDialogFrame, text='Rom to adjust') + romVar2 = StringVar() + romEntry2 = Entry(romDialogFrame, textvariable=romVar2) + + def RomSelect2(): + rom = filedialog.askopenfilename(filetypes=[("Rom Files", (".sfc", ".smc", ".bmbp")), ("All Files", "*")]) + romVar2.set(rom) + romSelectButton2 = Button(romDialogFrame, text='Select Rom', command=RomSelect2) + romDialogFrame.pack(side=TOP, expand=True, fill=X) + baseRomLabel2.pack(side=LEFT) + romEntry2.pack(side=LEFT, expand=True, fill=X) + romSelectButton2.pack(side=LEFT) + + def adjustRom(): + guiargs = Namespace() + guiargs.heartbeep = rom_vars.heartbeepVar.get() + guiargs.heartcolor = rom_vars.heartcolorVar.get() + guiargs.fastmenu = rom_vars.fastMenuVar.get() + guiargs.ow_palettes = rom_vars.owPalettesVar.get() + guiargs.uw_palettes = rom_vars.uwPalettesVar.get() + guiargs.hud_palettes = rom_vars.hudPalettesVar.get() + guiargs.sword_palettes = rom_vars.swordPalettesVar.get() + guiargs.shield_palettes = rom_vars.shieldPalettesVar.get() + guiargs.quickswap = bool(rom_vars.quickSwapVar.get()) + guiargs.disablemusic = bool(rom_vars.disableMusicVar.get()) + guiargs.reduceflashing = bool(rom_vars.disableFlashingVar.get()) + guiargs.rom = romVar2.get() + guiargs.baserom = romVar.get() + guiargs.sprite = rom_vars.sprite + try: + guiargs, path = adjust(args=guiargs) + except Exception as e: + logging.exception(e) + messagebox.showerror(title="Error while adjusting Rom", message=str(e)) + else: + messagebox.showinfo(title="Success", message="Rom patched successfully") + from Utils import persistent_store + from Rom import Sprite + if isinstance(guiargs.sprite, Sprite): + guiargs.sprite = guiargs.sprite.name + persistent_store("adjuster", "last_settings_3", guiargs) + + adjustButton = Button(bottomFrame2, text='Adjust Rom', command=adjustRom) + rom_options_frame.pack(side=TOP) + adjustButton.pack(side=BOTTOM, padx=(5, 5)) + + bottomFrame2.pack(side=BOTTOM, pady=(5, 5)) + + adjustWindow.mainloop() + if __name__ == '__main__': - main() + main() \ No newline at end of file diff --git a/AdjusterMain.py b/AdjusterMain.py deleted file mode 100644 index fa770b51..00000000 --- a/AdjusterMain.py +++ /dev/null @@ -1,41 +0,0 @@ -import os -import time -import logging - -from Utils import output_path -from Rom import LocalRom, apply_rom_settings - - -def adjust(args): - start = time.perf_counter() - logger = logging.getLogger('Adjuster') - logger.info('Patching ROM.') - vanillaRom = args.baserom - if os.path.splitext(args.rom)[-1].lower() == '.bmbp': - import Patch - meta, args.rom = Patch.create_rom_file(args.rom) - - if os.stat(args.rom).st_size in (0x200000, 0x400000) and os.path.splitext(args.rom)[-1].lower() == '.sfc': - rom = LocalRom(args.rom, patch=False, vanillaRom=vanillaRom) - else: - raise RuntimeError( - 'Provided Rom is not a valid Link to the Past Randomizer Rom. Please provide one for adjusting.') - palettes_options={} - palettes_options['dungeon']=args.uw_palettes - - palettes_options['overworld']=args.ow_palettes - palettes_options['hud']=args.hud_palettes - palettes_options['sword']=args.sword_palettes - palettes_options['shield']=args.shield_palettes - # palettes_options['link']=args.link_palettesvera - racerom = rom.read_byte(0x180213) > 0 - - apply_rom_settings(rom, args.heartbeep, args.heartcolor, args.quickswap, args.fastmenu, args.disablemusic, - args.sprite, palettes_options, reduceflashing=args.reduceflashing if not racerom else True) - path = output_path(f'{os.path.basename(args.rom)[:-4]}_adjusted.sfc') - rom.write_to_file(path) - - logger.info('Done. Enjoy.') - logger.debug('Total Time: %s', time.perf_counter() - start) - - return args, path diff --git a/Gui.py b/Gui.py index 86a71db7..296d7bae 100755 --- a/Gui.py +++ b/Gui.py @@ -14,12 +14,11 @@ from concurrent.futures import ThreadPoolExecutor, as_completed import ModuleUpdate ModuleUpdate.update() -from AdjusterMain import adjust from EntranceRandomizer import parse_arguments from GuiUtils import ToolTips, set_icon, BackgroundTaskProgress from Main import main, get_seed, __version__ as MWVersion from Rom import Sprite -from Utils import is_bundled, local_path, output_path, open_file +from Utils import local_path, output_path, open_file def guiMain(args=None): @@ -30,10 +29,8 @@ def guiMain(args=None): 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 Items') notebook.pack() @@ -57,6 +54,8 @@ def guiMain(args=None): # randomizer controls topFrame = Frame(randomizerWindow) + romFrame, romVar = get_rom_frame(topFrame) + rightHalfFrame = Frame(topFrame) checkBoxFrame = Frame(rightHalfFrame) @@ -119,158 +118,9 @@ def guiMain(args=None): hintsCheckbutton.pack(expand=True, anchor=W) tileShuffleButton.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) - - disableMusicVar = IntVar() - disableMusicCheckbutton = Checkbutton(romOptionsFrame, text="Disable music", variable=disableMusicVar) - disableMusicCheckbutton.grid(row=0, column=0, sticky=E) - - disableFlashingVar = IntVar(value=1) - disableFlashingCheckbutton = Checkbutton(romOptionsFrame, text="Disable flashing (anti-epilepsy)", variable=disableFlashingVar) - disableFlashingCheckbutton.grid(row=6, 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 isinstance(sprite_param, str): - sprite = sprite_param - spriteNameVar.set(sprite_param) - elif 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(value=1) - 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', 'grayscale', 'negative', 'classic', 'dizzy', 'sick', 'puke') - 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', 'grayscale', 'negative', 'classic', 'dizzy', 'sick', 'puke') - uwPalettesOptionMenu.pack(side=LEFT) - - hudPalettesFrame = Frame(romOptionsFrame) - hudPalettesFrame.grid(row=4, column=0, sticky=E) - hudPalettesLabel = Label(hudPalettesFrame, text='HUD palettes') - hudPalettesLabel.pack(side=LEFT) - hudPalettesVar = StringVar() - hudPalettesVar.set('default') - hudPalettesOptionMenu = OptionMenu(hudPalettesFrame, hudPalettesVar, 'default', 'random', 'blackout', 'grayscale', 'negative', 'classic', 'dizzy', 'sick', 'puke') - hudPalettesOptionMenu.pack(side=LEFT) - - swordPalettesFrame = Frame(romOptionsFrame) - swordPalettesFrame.grid(row=4, column=1, sticky=E) - swordPalettesLabel = Label(swordPalettesFrame, text='Sword palettes') - swordPalettesLabel.pack(side=LEFT) - swordPalettesVar = StringVar() - swordPalettesVar.set('default') - swordPalettesOptionMenu = OptionMenu(swordPalettesFrame, swordPalettesVar, 'default', 'random', 'blackout', 'grayscale', 'negative', 'classic', 'dizzy', 'sick', 'puke') - swordPalettesOptionMenu.pack(side=LEFT) - - shieldPalettesFrame = Frame(romOptionsFrame) - shieldPalettesFrame.grid(row=5, column=0, sticky=E) - shieldPalettesLabel = Label(shieldPalettesFrame, text='Shield palettes') - shieldPalettesLabel.pack(side=LEFT) - shieldPalettesVar = StringVar() - shieldPalettesVar.set('default') - shieldPalettesOptionMenu = OptionMenu(shieldPalettesFrame, shieldPalettesVar, 'default', 'random', 'blackout', 'grayscale', 'negative', 'classic', 'dizzy', 'sick', 'puke') - shieldPalettesOptionMenu.pack(side=LEFT) - - - - - romDialogFrame = Frame(romOptionsFrame) - romDialogFrame.grid(row=7, 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", "*")]) - import Patch - try: - Patch.get_base_rom_bytes(rom) # throws error on checksum fail - except Exception as e: - logging.exception(e) - messagebox.showerror(title="Error while reading ROM", message=str(e)) - else: - romVar.set(rom) - romSelectButton['state'] = "disabled" - romSelectButton["text"] = "ROM verified" - 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, rom_vars, set_sprite = get_rom_options_frame(rightHalfFrame) romOptionsFrame.pack(expand=True, fill=BOTH, padx=3) drowDownFrame = Frame(topFrame) @@ -567,9 +417,9 @@ def guiMain(args=None): guiargs.accessibility = accessibilityVar.get() guiargs.algorithm = algorithmVar.get() guiargs.shuffle = shuffleVar.get() - guiargs.heartbeep = heartbeepVar.get() - guiargs.heartcolor = heartcolorVar.get() - guiargs.fastmenu = fastMenuVar.get() + guiargs.heartbeep = rom_vars.heartbeepVar.get() + guiargs.heartcolor = rom_vars.heartcolorVar.get() + guiargs.fastmenu = rom_vars.fastMenuVar.get() guiargs.create_spoiler = bool(createSpoilerVar.get()) guiargs.skip_playthrough = not bool(createSpoilerVar.get()) guiargs.suppress_rom = bool(suppressRomVar.get()) @@ -579,14 +429,14 @@ def guiMain(args=None): guiargs.keyshuffle = {"on": True, "universal": "universal", "off": False}[keyshuffleVar.get()] guiargs.bigkeyshuffle = bool(bigkeyshuffleVar.get()) guiargs.retro = bool(retroVar.get()) - guiargs.quickswap = bool(quickSwapVar.get()) - guiargs.disablemusic = bool(disableMusicVar.get()) - guiargs.reduceflashing = bool(disableFlashingVar.get()) - guiargs.ow_palettes = owPalettesVar.get() - guiargs.uw_palettes = uwPalettesVar.get() - guiargs.hud_palettes = hudPalettesVar.get() - guiargs.sword_palettes = swordPalettesVar.get() - guiargs.shield_palettes = shieldPalettesVar.get() + guiargs.quickswap = bool(rom_vars.quickSwapVar.get()) + guiargs.disablemusic = bool(rom_vars.disableMusicVar.get()) + guiargs.reduceflashing = bool(rom_vars.disableFlashingVar.get()) + guiargs.ow_palettes = rom_vars.owPalettesVar.get() + guiargs.uw_palettes = rom_vars.uwPalettesVar.get() + guiargs.hud_palettes = rom_vars.hudPalettesVar.get() + guiargs.sword_palettes = rom_vars.swordPalettesVar.get() + guiargs.shield_palettes = rom_vars.shieldPalettesVar.get() guiargs.shuffleganon = bool(shuffleGanonVar.get()) guiargs.hints = bool(hintsVar.get()) guiargs.enemizercli = enemizerCLIpathVar.get() @@ -646,7 +496,7 @@ def guiMain(args=None): int(rupoorcostVar.get()), int(triforceVar.get())] guiargs.rom = romVar.get() guiargs.create_diff = patchesVar.get() - guiargs.sprite = sprite + guiargs.sprite = rom_vars.sprite # get default values for missing parameters for k,v in vars(parse_arguments(['--multi', str(guiargs.multi)])).items(): if k not in vars(guiargs): @@ -694,153 +544,6 @@ def guiMain(args=None): enemizerFrame.pack(side=BOTTOM, fill=BOTH) shopframe.pack(side=BOTTOM, expand=True, fill=X) - # Adjuster Controls - - topFrame2 = Frame(adjustWindow) - rightHalfFrame2 = Frame(topFrame2) - checkBoxFrame2 = Frame(rightHalfFrame2) - - quickSwapCheckbutton2 = Checkbutton(checkBoxFrame2, text="L/R Item quickswapping", variable=quickSwapVar) - disableMusicCheckbutton2 = Checkbutton(checkBoxFrame2, text="Disable game music", variable=disableMusicVar) - disableFlashingCheckbutton2 = Checkbutton(checkBoxFrame2, text="Disable flashing (anti-epilepsy)", variable=disableFlashingVar) - - quickSwapCheckbutton2.pack(expand=True, anchor=W) - disableMusicCheckbutton2.pack(expand=True, anchor=W) - disableFlashingCheckbutton2.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", ".bmbp")), ("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=spriteNameVar) - - def SpriteSelectAdjuster(): - SpriteSelector(mainWindow, 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, 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.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.pack(side=RIGHT) - fastMenuLabel2 = Label(fastMenuFrame2, text='Menu speed') - fastMenuLabel2.pack(side=LEFT) - - owPalettesFrame2 = Frame(drowDownFrame2) - owPalettesOptionMenu2 = OptionMenu(owPalettesFrame2, owPalettesVar, 'default', 'random', 'blackout', 'grayscale', 'negative', 'classic', 'dizzy', 'sick', 'puke') - owPalettesOptionMenu2.pack(side=RIGHT) - owPalettesLabel2 = Label(owPalettesFrame2, text='Overworld palettes') - owPalettesLabel2.pack(side=LEFT) - - uwPalettesFrame2 = Frame(drowDownFrame2) - uwPalettesOptionMenu2 = OptionMenu(uwPalettesFrame2, uwPalettesVar, 'default', 'random', 'blackout', 'grayscale', 'negative', 'classic', 'dizzy', 'sick', 'puke') - uwPalettesOptionMenu2.pack(side=RIGHT) - uwPalettesLabel2 = Label(uwPalettesFrame2, text='Dungeon palettes') - uwPalettesLabel2.pack(side=LEFT) - - hudPalettesFrame2 = Frame(drowDownFrame2) - hudPalettesOptionMenu2 = OptionMenu(hudPalettesFrame2, hudPalettesVar, 'default', 'random', 'blackout', 'grayscale', 'negative', 'classic', 'dizzy', 'sick', 'puke') - hudPalettesOptionMenu2.pack(side=RIGHT) - hudPalettesLabel2 = Label(hudPalettesFrame2, text='HUD palettes') - hudPalettesLabel2.pack(side=LEFT) - - swordPalettesFrame2 = Frame(drowDownFrame2) - swordPalettesOptionMenu2 = OptionMenu(swordPalettesFrame2, swordPalettesVar, 'default', 'random', 'blackout', 'grayscale', 'negative', 'classic', 'dizzy', 'sick', 'puke') - swordPalettesOptionMenu2.pack(side=RIGHT) - swordPalettesLabel2 = Label(swordPalettesFrame2, text='Sword palettes') - swordPalettesLabel2.pack(side=LEFT) - - shieldPalettesFrame2 = Frame(drowDownFrame2) - shieldPalettesOptionMenu2 = OptionMenu(shieldPalettesFrame2, shieldPalettesVar, 'default', 'random', 'blackout', 'grayscale', 'negative', 'classic', 'dizzy', 'sick', 'puke') - shieldPalettesOptionMenu2.pack(side=RIGHT) - shieldPalettesLabel2 = Label(shieldPalettesFrame2, text='Shield palettes') - shieldPalettesLabel2.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) - hudPalettesFrame2.pack(expand=True, anchor=E) - swordPalettesFrame2.pack(expand=True, anchor=E) - shieldPalettesFrame2.pack(expand=True, anchor=E) - - bottomFrame2 = Frame(topFrame2) - - 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.hud_palettes = hudPalettesVar.get() - guiargs.sword_palettes = swordPalettesVar.get() - guiargs.shield_palettes = shieldPalettesVar.get() - guiargs.quickswap = bool(quickSwapVar.get()) - guiargs.disablemusic = bool(disableMusicVar.get()) - guiargs.reduceflashing = bool(disableFlashingVar.get()) - guiargs.rom = romVar2.get() - guiargs.baserom = romVar.get() - guiargs.sprite = sprite - try: - guiargs, path = adjust(args=guiargs) - except Exception as e: - logging.exception(e) - messagebox.showerror(title="Error while adjusting Rom", message=str(e)) - else: - messagebox.showinfo(title="Success", message="Rom patched successfully") - from Utils import persistent_store - from Rom import Sprite - if isinstance(guiargs.sprite, Sprite): - guiargs.sprite = guiargs.sprite.name - persistent_store("adjuster", "last_settings_3", guiargs) - - 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)) - # Custom Controls topFrame3 = Frame(customWindow) @@ -1498,9 +1201,9 @@ def guiMain(args=None): keyshuffleVar.set(args.keyshuffle) bigkeyshuffleVar.set(args.bigkeyshuffle) retroVar.set(args.retro) - quickSwapVar.set(int(args.quickswap)) - disableMusicVar.set(int(args.disablemusic)) - disableFlashingVar.set(int(args.reduceflashing)) + rom_vars.quickSwapVar.set(int(args.quickswap)) + rom_vars.disableMusicVar.set(int(args.disablemusic)) + rom_vars.disableFlashingVar.set(int(args.reduceflashing)) if args.count: countVar.set(str(args.count)) if args.seed: @@ -1521,10 +1224,10 @@ def guiMain(args=None): crystalsGanonVar.set(args.crystals_ganon) algorithmVar.set(args.algorithm) shuffleVar.set(args.shuffle) - heartbeepVar.set(args.heartbeep) - fastMenuVar.set(args.fastmenu) + rom_vars.heartbeepVar.set(args.heartbeep) + rom_vars.fastMenuVar.set(args.fastmenu) logicVar.set(args.logic) - romVar.set(args.rom) + rom_vars.romVar.set(args.rom) shuffleGanonVar.set(args.shuffleganon) hintsVar.set(args.hints) if args.sprite is not None: @@ -1532,11 +1235,165 @@ def guiMain(args=None): mainWindow.mainloop() +def get_rom_frame(parent=None): + romFrame = Frame(parent) + baseRomLabel = Label(romFrame, text='LttP Base Rom: ') + romVar = StringVar(value="Zelda no Densetsu - Kamigami no Triforce (Japan).sfc") + romEntry = Entry(romFrame, textvariable=romVar) + + def RomSelect(): + rom = filedialog.askopenfilename(filetypes=[("Rom Files", (".sfc", ".smc")), ("All Files", "*")]) + import Patch + try: + Patch.get_base_rom_bytes(rom) # throws error on checksum fail + except Exception as e: + logging.exception(e) + messagebox.showerror(title="Error while reading ROM", message=str(e)) + else: + romVar.set(rom) + romSelectButton['state'] = "disabled" + romSelectButton["text"] = "ROM verified" + romSelectButton = Button(romFrame, text='Select Rom', command=RomSelect) + + baseRomLabel.pack(side=LEFT) + romEntry.pack(side=LEFT, expand=True, fill=X) + romSelectButton.pack(side=LEFT) + romFrame.pack(side=TOP, expand=True, fill=X) + + return romFrame, romVar + + +def get_rom_options_frame(parent=None): + romOptionsFrame = LabelFrame(parent, text="Rom options") + romOptionsFrame.columnconfigure(0, weight=1) + romOptionsFrame.columnconfigure(1, weight=1) + for i in range(5): + romOptionsFrame.rowconfigure(i, weight=1) + vars = Namespace() + + vars.disableMusicVar = IntVar() + disableMusicCheckbutton = Checkbutton(romOptionsFrame, text="Disable music", variable=vars.disableMusicVar) + disableMusicCheckbutton.grid(row=0, column=0, sticky=E) + + vars.disableFlashingVar = IntVar(value=1) + disableFlashingCheckbutton = Checkbutton(romOptionsFrame, text="Disable flashing (anti-epilepsy)", variable=vars.disableFlashingVar) + disableFlashingCheckbutton.grid(row=6, column=0, sticky=E) + + spriteDialogFrame = Frame(romOptionsFrame) + spriteDialogFrame.grid(row=0, column=1) + baseSpriteLabel = Label(spriteDialogFrame, text='Sprite:') + + + + vars.spriteNameVar = StringVar() + vars.sprite = None + def set_sprite(sprite_param): + nonlocal vars + if isinstance(sprite_param, str): + vars.sprite = sprite_param + vars.spriteNameVar.set(sprite_param) + elif sprite_param is None or not sprite_param.valid: + vars.sprite = None + vars.spriteNameVar.set('(unchanged)') + else: + vars.sprite = sprite_param + vars.spriteNameVar.set(vars.sprite.name) + + set_sprite(None) + vars.spriteNameVar.set('(unchanged)') + spriteEntry = Label(spriteDialogFrame, textvariable=vars.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) + + vars.quickSwapVar = IntVar(value=1) + quickSwapCheckbutton = Checkbutton(romOptionsFrame, text="L/R Quickswapping", variable=vars.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) + vars.fastMenuVar = StringVar() + vars.fastMenuVar.set('normal') + fastMenuOptionMenu = OptionMenu(fastMenuFrame, vars.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) + vars.heartcolorVar = StringVar() + vars.heartcolorVar.set('red') + heartcolorOptionMenu = OptionMenu(heartcolorFrame, vars.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) + vars.heartbeepVar = StringVar() + vars.heartbeepVar.set('normal') + heartbeepOptionMenu = OptionMenu(heartbeepFrame, vars.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) + vars.owPalettesVar = StringVar() + vars.owPalettesVar.set('default') + owPalettesOptionMenu = OptionMenu(owPalettesFrame, vars.owPalettesVar, 'default', 'random', 'blackout', 'grayscale', 'negative', 'classic', 'dizzy', 'sick', 'puke') + 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) + vars.uwPalettesVar = StringVar() + vars.uwPalettesVar.set('default') + uwPalettesOptionMenu = OptionMenu(uwPalettesFrame, vars.uwPalettesVar, 'default', 'random', 'blackout', 'grayscale', 'negative', 'classic', 'dizzy', 'sick', 'puke') + uwPalettesOptionMenu.pack(side=LEFT) + + hudPalettesFrame = Frame(romOptionsFrame) + hudPalettesFrame.grid(row=4, column=0, sticky=E) + hudPalettesLabel = Label(hudPalettesFrame, text='HUD palettes') + hudPalettesLabel.pack(side=LEFT) + vars.hudPalettesVar = StringVar() + vars.hudPalettesVar.set('default') + hudPalettesOptionMenu = OptionMenu(hudPalettesFrame, vars.hudPalettesVar, 'default', 'random', 'blackout', 'grayscale', 'negative', 'classic', 'dizzy', 'sick', 'puke') + hudPalettesOptionMenu.pack(side=LEFT) + + swordPalettesFrame = Frame(romOptionsFrame) + swordPalettesFrame.grid(row=4, column=1, sticky=E) + swordPalettesLabel = Label(swordPalettesFrame, text='Sword palettes') + swordPalettesLabel.pack(side=LEFT) + vars.swordPalettesVar = StringVar() + vars.swordPalettesVar.set('default') + swordPalettesOptionMenu = OptionMenu(swordPalettesFrame, vars.swordPalettesVar, 'default', 'random', 'blackout', 'grayscale', 'negative', 'classic', 'dizzy', 'sick', 'puke') + swordPalettesOptionMenu.pack(side=LEFT) + + shieldPalettesFrame = Frame(romOptionsFrame) + shieldPalettesFrame.grid(row=5, column=0, sticky=E) + shieldPalettesLabel = Label(shieldPalettesFrame, text='Shield palettes') + shieldPalettesLabel.pack(side=LEFT) + vars.shieldPalettesVar = StringVar() + vars.shieldPalettesVar.set('default') + shieldPalettesOptionMenu = OptionMenu(shieldPalettesFrame, vars.shieldPalettesVar, 'default', 'random', 'blackout', 'grayscale', 'negative', 'classic', 'dizzy', 'sick', 'puke') + shieldPalettesOptionMenu.pack(side=LEFT) + + return romOptionsFrame, vars, set_sprite + class SpriteSelector(): def __init__(self, parent, callback, adjuster=False): - if is_bundled(): - self.deploy_icons() + self.deploy_icons() self.parent = parent self.window = Toplevel(parent) self.callback = callback diff --git a/GuiUtils.py b/GuiUtils.py index c0542076..9e9e33e9 100644 --- a/GuiUtils.py +++ b/GuiUtils.py @@ -25,7 +25,7 @@ class BackgroundTask(object): def stop(self): self.running = False - #safe to call from worker + # safe to call from worker def queue_event(self, event): self.queue.put(event) diff --git a/Utils.py b/Utils.py index 602b7751..758f0058 100644 --- a/Utils.py +++ b/Utils.py @@ -343,8 +343,8 @@ def get_adjuster_settings(romfile: str) -> typing.Tuple[str, bool]: f"Enter yes, no or never: ") if adjust_wanted and adjust_wanted.startswith("y"): adjusted = True - import AdjusterMain - _, romfile = AdjusterMain.adjust(adjuster_settings) + import Adjuster + _, romfile = Adjuster.adjust(adjuster_settings) elif adjust_wanted and "never" in adjust_wanted: persistent_store("adjuster", "never_adjust", True) return romfile, False diff --git a/setup.py b/setup.py index 48872d7b..73e2e9c0 100644 --- a/setup.py +++ b/setup.py @@ -48,8 +48,8 @@ def manifest_creation(): path = os.path.join(dirpath, filename) hashes[os.path.relpath(path, start=buildfolder)] = pool.submit(_threaded_hash, path) import json - manifest = {"buildtime": buildtime.isoformat(sep=" ", timespec="seconds")} - manifest["hashes"] = {path: hash.result() for path, hash in hashes.items()} + manifest = {"buildtime": buildtime.isoformat(sep=" ", timespec="seconds"), + "hashes": {path: hash.result() for path, hash in hashes.items()}} json.dump(manifest, open(manifestpath, "wt"), indent=4) print("Created Manifest") @@ -58,7 +58,8 @@ scripts = {"MultiClient.py": "BerserkerMultiClient", "MultiMystery.py": "BerserkerMultiMystery", "MultiServer.py": "BerserkerMultiServer", "gui.py": "BerserkerMultiCreator", - "Mystery.py": "BerserkerMystery"} + "Mystery.py": "BerserkerMystery", + "Adjuster.py": "BerserkerLttPAdjuster"} exes = []