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 57863f5a..83d3868b 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 f0b4e184..a3ad1902 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 2368d76e..818913c0 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 42dfbfd0..1663b114 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 fbdc0e8e..ae77542f 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 6170b2dc..7d741912 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 7c9f5a2f..e5455b9b 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 c682f06e..47f4abdc 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: