From 398de826f8836a1c143f145f8d030d23ea910061 Mon Sep 17 00:00:00 2001 From: AmazingAmpharos Date: Fri, 5 Jan 2018 16:53:29 -0600 Subject: [PATCH] Fastmenu update Fastmenu is now a variable menu speed setting instead of an on/off toggle. This update reflects that and gives the player a lot of options for the particular setting (normal, instant, double, triple, quadruple, half). A smaller change in this update is removing quickswap and fastmenu from the output file name of the randomizer (reflective of how the adjuster allows them to be shifted freely anyway) and shortening the verbiage for when progressive settings are changed (quality of life change there). --- Adjuster.py | 6 +++++- BaseClasses.py | 2 +- EntranceRandomizer.py | 6 +++++- Gui.py | 26 +++++++++++++++++++------- Main.py | 2 +- Plando.py | 6 +++++- README.md | 12 ++++++------ Rom.py | 17 +++++++++++++---- 8 files changed, 55 insertions(+), 22 deletions(-) diff --git a/Adjuster.py b/Adjuster.py index 57863f5aa3..83d3868b78 100755 --- a/Adjuster.py +++ b/Adjuster.py @@ -17,7 +17,11 @@ def main(): parser.add_argument('--rom', default='ER_base.sfc', help='Path to an ALttP JAP(1.0) rom to use as a base.') parser.add_argument('--loglevel', default='info', const='info', nargs='?', choices=['error', 'info', 'warning', 'debug'], help='Select level of logging for output.') - parser.add_argument('--fastmenu', help='Enable instant menu', action='store_true') + parser.add_argument('--fastmenu', default='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', help='Enable quick item swapping with L and R.', action='store_true') parser.add_argument('--disablemusic', help='Disables game music.', action='store_true') parser.add_argument('--heartbeep', default='normal', const='normal', nargs='?', choices=['normal', 'half', 'quarter', 'off'], diff --git a/BaseClasses.py b/BaseClasses.py index f0b4e184bc..a3ad19020f 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -741,7 +741,7 @@ class Spoiler(object): outfile.write('All Locations Accessible: %s\n' % ('Yes' if self.metadata['completeable'] else 'No, some locations may be unreachable')) outfile.write('Maps and Compasses in Dungeons: %s\n' % ('Yes' if self.metadata['dungeonitems'] else 'No')) outfile.write('L\\R Quickswap enabled: %s\n' % ('Yes' if self.metadata['quickswap'] else 'No')) - outfile.write('Fastmenu enabled: %s\n' % ('Yes' if self.metadata['fastmenu'] else 'No')) + outfile.write('Menu speed: %s\n' % self.metadata['fastmenu']) outfile.write('Keysanity enabled: %s' % ('Yes' if self.metadata['keysanity'] else 'No')) if self.entrances: outfile.write('\n\nEntrances:\n\n') diff --git a/EntranceRandomizer.py b/EntranceRandomizer.py index 2368d76e99..818913c0f6 100755 --- a/EntranceRandomizer.py +++ b/EntranceRandomizer.py @@ -152,7 +152,11 @@ def start(): --seed given will produce the same 10 (different) roms each time). ''', type=int) - parser.add_argument('--fastmenu', help='Enable instant menu', action='store_true') + parser.add_argument('--fastmenu', default='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', help='Enable quick item swapping with L and R.', action='store_true') parser.add_argument('--disablemusic', help='Disables game music.', action='store_true') parser.add_argument('--keysanity', help='''\ diff --git a/Gui.py b/Gui.py index 42dfbfd0ac..1663b11453 100755 --- a/Gui.py +++ b/Gui.py @@ -58,8 +58,6 @@ def guiMain(args=None): suppressRomCheckbutton = Checkbutton(checkBoxFrame, text="Do not create patched Rom", variable=suppressRomVar) quickSwapVar = IntVar() quickSwapCheckbutton = Checkbutton(checkBoxFrame, text="Enabled L/R Item quickswapping", variable=quickSwapVar) - fastMenuVar = IntVar() - fastMenuCheckbutton = Checkbutton(checkBoxFrame, text="Enable instant menu", variable=fastMenuVar) keysanityVar = IntVar() keysanityCheckbutton = Checkbutton(checkBoxFrame, text="Keysanity (keys anywhere)", variable=keysanityVar) dungeonItemsVar = IntVar() @@ -74,7 +72,6 @@ def guiMain(args=None): createSpoilerCheckbutton.pack(expand=True, anchor=W) suppressRomCheckbutton.pack(expand=True, anchor=W) quickSwapCheckbutton.pack(expand=True, anchor=W) - fastMenuCheckbutton.pack(expand=True, anchor=W) keysanityCheckbutton.pack(expand=True, anchor=W) dungeonItemsCheckbutton.pack(expand=True, anchor=W) beatableOnlyCheckbutton.pack(expand=True, anchor=W) @@ -204,6 +201,15 @@ def guiMain(args=None): heartbeepLabel = Label(heartbeepFrame, text='Heartbeep sound rate') heartbeepLabel.pack(side=LEFT) + + fastMenuFrame = Frame(drowDownFrame) + fastMenuVar = StringVar() + fastMenuVar.set('normal') + fastMenuOptionMenu = OptionMenu(fastMenuFrame, fastMenuVar, 'normal', 'instant', 'double', 'triple', 'quadruple', 'half') + fastMenuOptionMenu.pack(side=RIGHT) + fastMenuLabel = Label(fastMenuFrame, text='Menu speed') + fastMenuLabel.pack(side=LEFT) + modeFrame.pack(expand=True, anchor=E) logicFrame.pack(expand=True, anchor=E) goalFrame.pack(expand=True, anchor=E) @@ -213,6 +219,7 @@ def guiMain(args=None): algorithmFrame.pack(expand=True, anchor=E) shuffleFrame.pack(expand=True, anchor=E) heartbeepFrame.pack(expand=True, anchor=E) + fastMenuFrame.pack(expand=True, anchor=E) bottomFrame = Frame(randomizerWindow) @@ -236,12 +243,12 @@ def guiMain(args=None): guiargs.algorithm = algorithmVar.get() guiargs.shuffle = shuffleVar.get() guiargs.heartbeep = heartbeepVar.get() + guiargs.fastmenu = fastMenuVar.get() guiargs.create_spoiler = bool(createSpoilerVar.get()) guiargs.suppress_rom = bool(suppressRomVar.get()) guiargs.keysanity = bool(keysanityVar.get()) guiargs.nodungeonitems = bool(dungeonItemsVar.get()) guiargs.beatableonly = bool(beatableOnlyVar.get()) - guiargs.fastmenu = bool(fastMenuVar.get()) guiargs.quickswap = bool(quickSwapVar.get()) guiargs.disablemusic = bool(disableMusicVar.get()) guiargs.shuffleganon = bool(shuffleGanonVar.get()) @@ -283,11 +290,9 @@ def guiMain(args=None): checkBoxFrame2 = Frame(rightHalfFrame2) quickSwapCheckbutton2 = Checkbutton(checkBoxFrame2, text="Enabled L/R Item quickswapping", variable=quickSwapVar) - fastMenuCheckbutton2 = Checkbutton(checkBoxFrame2, text="Enable instant menu", variable=fastMenuVar) disableMusicCheckbutton2 = Checkbutton(checkBoxFrame2, text="Disable game music", variable=disableMusicVar) quickSwapCheckbutton2.pack(expand=True, anchor=W) - fastMenuCheckbutton2.pack(expand=True, anchor=W) disableMusicCheckbutton2.pack(expand=True, anchor=W) fileDialogFrame2 = Frame(rightHalfFrame2) @@ -332,7 +337,14 @@ def guiMain(args=None): heartbeepLabel2 = Label(heartbeepFrame2, text='Heartbeep sound rate') heartbeepLabel2.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) + heartbeepFrame2.pack(expand=True, anchor=E) + fastMenuFrame2.pack(expand=True, anchor=E) bottomFrame2 = Frame(topFrame2) @@ -368,7 +380,6 @@ def guiMain(args=None): if args.nodungeonitems: dungeonItemsVar.set(int(not args.nodungeonitems)) beatableOnlyVar.set(int(args.beatableonly)) - fastMenuVar.set(int(args.fastmenu)) quickSwapVar.set(int(args.quickswap)) disableMusicVar.set(int(args.disablemusic)) if args.count: @@ -383,6 +394,7 @@ def guiMain(args=None): algorithmVar.set(args.algorithm) shuffleVar.set(args.shuffle) heartbeepVar.set(args.heartbeep) + fastMenuVar.set(args.fastmenu) logicVar.set(args.logic) romVar.set(args.rom) shuffleGanonVar.set(args.shuffleganon) diff --git a/Main.py b/Main.py index fbdc0e8e1a..ae77542fc7 100644 --- a/Main.py +++ b/Main.py @@ -101,7 +101,7 @@ def main(args, seed=None): else: sprite = None - outfilebase = 'ER_%s_%s-%s-%s%s_%s-%s%s%s%s%s%s_%s' % (world.logic, world.difficulty, world.mode, world.goal, "" if world.timer in ['none', 'display'] else "-" + world.timer, world.shuffle, world.algorithm, "-keysanity" if world.keysanity else "", "-progressives_" + world.progressive if world.progressive in ['off', 'random'] else "", "-fastmenu" if world.fastmenu else "", "-quickswap" if world.quickswap else "", "-shuffleganon" if world.shuffle_ganon else "", world.seed) + outfilebase = 'ER_%s_%s-%s-%s%s_%s-%s%s%s%s_%s' % (world.logic, world.difficulty, world.mode, world.goal, "" if world.timer in ['none', 'display'] else "-" + world.timer, world.shuffle, world.algorithm, "-keysanity" if world.keysanity else "", "-prog_" + world.progressive if world.progressive in ['off', 'random'] else "", "-shuffleganon" if world.shuffle_ganon else "", world.seed) if not args.suppress_rom: if args.jsonout: diff --git a/Plando.py b/Plando.py index 6170b2dce2..7d74191255 100755 --- a/Plando.py +++ b/Plando.py @@ -210,7 +210,11 @@ def start(): parser.add_argument('--rom', default='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='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('--fastmenu', help='Enable instant menu', action='store_true') + parser.add_argument('--fastmenu', default='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', help='Enable quick item swapping with L and R.', action='store_true') parser.add_argument('--disablemusic', help='Disables game music.', action='store_true') parser.add_argument('--heartbeep', default='normal', const='normal', nargs='?', choices=['normal', 'half', 'quarter', 'off'], diff --git a/README.md b/README.md index 7c9f5a2fe7..e5455b9b94 100644 --- a/README.md +++ b/README.md @@ -239,6 +239,10 @@ The dungeon variants only mix up dungeons and keep the rest of the overworld van Select frequency of beeps when on low health. Can completely disable them. +## Menu Speed + +A setting that lets the player set the rate at which the menu opens and closes. + ## Create Spoiler Log Output a Spoiler File. @@ -252,10 +256,6 @@ generate spoilers for statistical analysis. Use to enable quick item swap with L/R buttons -## Instant Menu - -As an alternative to quickswap, opens menu instantly. - ## Keysanity This setting allows dungeon specific items (Small Key, Big Key, Map, Compass) to be distributed anywhere in the world and not just @@ -378,10 +378,10 @@ Set the count option (default: None) Use to enable quick item swap with L/R buttons. (default: False) ``` ---fastmenu +--fastmenu [{normal,instant,double,triple,quadruple,half}] ``` -As an alternative to quickswap, opens menu instantly. (default: False) +Alters the rate at which the menu opens and closes. (default: normal) ``` diff --git a/Rom.py b/Rom.py index c682f06ebf..47f4abdc09 100644 --- a/Rom.py +++ b/Rom.py @@ -744,17 +744,26 @@ def patch_rom(world, rom, hashtable, beep='normal', sprite=None): def apply_rom_settings(rom, beep, quickswap, fastmenu, disable_music, sprite): # enable instant item menu - if fastmenu: - rom.write_byte(0x180048, 0x01) - # Sound tweaks for fastmenu: + if fastmenu == 'instant': rom.write_byte(0x6DD9A, 0x20) rom.write_byte(0x6DF2A, 0x20) rom.write_byte(0x6E0E9, 0x20) else: - rom.write_byte(0x180048, 0x00) rom.write_byte(0x6DD9A, 0x11) rom.write_byte(0x6DF2A, 0x12) rom.write_byte(0x6E0E9, 0x12) + if fastmenu == 'instant': + rom.write_byte(0x180048, 0xE8) + elif fastmenu == 'double': + rom.write_byte(0x180048, 0x10) + elif fastmenu == 'triple': + rom.write_byte(0x180048, 0x18) + elif fastmenu == 'quadruple': + rom.write_byte(0x180048, 0x20) + elif fastmenu == 'half': + rom.write_byte(0x180048, 0x04) + else: + rom.write_byte(0x180048, 0x08) # enable quick item swapping with L and R (ported by Amazing Ampharos) if quickswap: