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: