Skip to content

Commit c317dc1

Browse files
zig-forJouramie
authored andcommitted
LttP: Fixes patching on a fresh AP install (ArchipelagoMW#2118)
1 parent 67b492e commit c317dc1

File tree

3 files changed

+86
-59
lines changed

3 files changed

+86
-59
lines changed

LttPAdjuster.py

+50-33
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525

2626
from worlds.alttp.Rom import Sprite, LocalRom, apply_rom_settings, get_base_rom_bytes
2727
from Utils import output_path, local_path, user_path, open_file, get_cert_none_ssl_context, persistent_store, \
28-
get_adjuster_settings, tkinter_center_window, init_logging
28+
get_adjuster_settings, get_adjuster_settings_no_defaults, tkinter_center_window, init_logging
2929

3030

3131
GAME_ALTTP = "A Link to the Past"
@@ -43,6 +43,47 @@ class ArgumentDefaultsHelpFormatter(argparse.RawTextHelpFormatter):
4343
def _get_help_string(self, action):
4444
return textwrap.dedent(action.help)
4545

46+
# See argparse.BooleanOptionalAction
47+
class BooleanOptionalActionWithDisable(argparse.Action):
48+
def __init__(self,
49+
option_strings,
50+
dest,
51+
default=None,
52+
type=None,
53+
choices=None,
54+
required=False,
55+
help=None,
56+
metavar=None):
57+
58+
_option_strings = []
59+
for option_string in option_strings:
60+
_option_strings.append(option_string)
61+
62+
if option_string.startswith('--'):
63+
option_string = '--disable' + option_string[2:]
64+
_option_strings.append(option_string)
65+
66+
if help is not None and default is not None:
67+
help += " (default: %(default)s)"
68+
69+
super().__init__(
70+
option_strings=_option_strings,
71+
dest=dest,
72+
nargs=0,
73+
default=default,
74+
type=type,
75+
choices=choices,
76+
required=required,
77+
help=help,
78+
metavar=metavar)
79+
80+
def __call__(self, parser, namespace, values, option_string=None):
81+
if option_string in self.option_strings:
82+
setattr(namespace, self.dest, not option_string.startswith('--disable'))
83+
84+
def format_usage(self):
85+
return ' | '.join(self.option_strings)
86+
4687

4788
def get_argparser() -> argparse.ArgumentParser:
4889
parser = argparse.ArgumentParser(formatter_class=ArgumentDefaultsHelpFormatter)
@@ -52,6 +93,8 @@ def get_argparser() -> argparse.ArgumentParser:
5293
help='Path to an ALttP Japan(1.0) rom to use as a base.')
5394
parser.add_argument('--loglevel', default='info', const='info', nargs='?',
5495
choices=['error', 'info', 'warning', 'debug'], help='Select level of logging for output.')
96+
parser.add_argument('--auto_apply', default='ask',
97+
choices=['ask', 'always', 'never'], help='Whether or not to apply settings automatically in the future.')
5598
parser.add_argument('--menuspeed', default='normal', const='normal', nargs='?',
5699
choices=['normal', 'instant', 'double', 'triple', 'quadruple', 'half'],
57100
help='''\
@@ -61,7 +104,7 @@ def get_argparser() -> argparse.ArgumentParser:
61104
parser.add_argument('--quickswap', help='Enable quick item swapping with L and R.', action='store_true')
62105
parser.add_argument('--deathlink', help='Enable DeathLink system.', action='store_true')
63106
parser.add_argument('--allowcollect', help='Allow collection of other player items', action='store_true')
64-
parser.add_argument('--disablemusic', help='Disables game music.', action='store_true')
107+
parser.add_argument('--music', default=True, help='Enables/Disables game music.', action=BooleanOptionalActionWithDisable)
65108
parser.add_argument('--triforcehud', default='hide_goal', const='hide_goal', nargs='?',
66109
choices=['normal', 'hide_goal', 'hide_required', 'hide_both'],
67110
help='''\
@@ -104,21 +147,23 @@ def get_argparser() -> argparse.ArgumentParser:
104147
Alternatively, can be a ALttP Rom patched with a Link
105148
sprite that will be extracted.
106149
''')
150+
parser.add_argument('--sprite_pool', nargs='+', default=[], help='''
151+
A list of sprites to pull from.
152+
''')
107153
parser.add_argument('--oof', help='''\
108154
Path to a sound effect to replace Link's "oof" sound.
109155
Needs to be in a .brr format and have a length of no
110156
more than 2673 bytes, created from a 16-bit signed PCM
111157
.wav at 12khz. https://github.com/boldowa/snesbrr
112158
''')
113-
parser.add_argument('--names', default='', type=str)
114159
parser.add_argument('--update_sprites', action='store_true', help='Update Sprite Database, then exit.')
115160
return parser
116161

117162

118163
def main():
119164
parser = get_argparser()
120-
args = parser.parse_args()
121-
args.music = not args.disablemusic
165+
args = parser.parse_args(namespace=get_adjuster_settings_no_defaults(GAME_ALTTP))
166+
122167
# set up logger
123168
loglevel = {'error': logging.ERROR, 'info': logging.INFO, 'warning': logging.WARNING, 'debug': logging.DEBUG}[
124169
args.loglevel]
@@ -530,9 +575,6 @@ def hide(self):
530575

531576
def get_rom_frame(parent=None):
532577
adjuster_settings = get_adjuster_settings(GAME_ALTTP)
533-
if not adjuster_settings:
534-
adjuster_settings = Namespace()
535-
adjuster_settings.baserom = "Zelda no Densetsu - Kamigami no Triforce (Japan).sfc"
536578

537579
romFrame = Frame(parent)
538580
baseRomLabel = Label(romFrame, text='LttP Base Rom: ')
@@ -560,33 +602,8 @@ def RomSelect():
560602

561603
return romFrame, romVar
562604

563-
564605
def get_rom_options_frame(parent=None):
565606
adjuster_settings = get_adjuster_settings(GAME_ALTTP)
566-
defaults = {
567-
"auto_apply": 'ask',
568-
"music": True,
569-
"reduceflashing": True,
570-
"deathlink": False,
571-
"sprite": None,
572-
"oof": None,
573-
"quickswap": True,
574-
"menuspeed": 'normal',
575-
"heartcolor": 'red',
576-
"heartbeep": 'normal',
577-
"ow_palettes": 'default',
578-
"uw_palettes": 'default',
579-
"hud_palettes": 'default',
580-
"sword_palettes": 'default',
581-
"shield_palettes": 'default',
582-
"sprite_pool": [],
583-
"allowcollect": False,
584-
}
585-
if not adjuster_settings:
586-
adjuster_settings = Namespace()
587-
for key, defaultvalue in defaults.items():
588-
if not hasattr(adjuster_settings, key):
589-
setattr(adjuster_settings, key, defaultvalue)
590607

591608
romOptionsFrame = LabelFrame(parent, text="Rom options")
592609
romOptionsFrame.columnconfigure(0, weight=1)

Utils.py

+18-2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import importlib
1515
import logging
1616

17+
from argparse import Namespace
1718
from settings import Settings, get_settings
1819
from typing import BinaryIO, Coroutine, Optional, Set, Dict, Any, Union
1920
from yaml import load, load_all, dump, SafeLoader
@@ -318,12 +319,27 @@ def store_data_package_for_checksum(game: str, data: typing.Dict[str, Any]) -> N
318319
except Exception as e:
319320
logging.debug(f"Could not store data package: {e}")
320321

322+
def get_default_adjuster_settings(game_name: str) -> Namespace:
323+
import LttPAdjuster
324+
adjuster_settings = Namespace()
325+
if game_name == LttPAdjuster.GAME_ALTTP:
326+
return LttPAdjuster.get_argparser().parse_known_args(args=[])[0]
321327

322-
def get_adjuster_settings(game_name: str) -> typing.Dict[str, typing.Any]:
323-
adjuster_settings = persistent_load().get("adjuster", {}).get(game_name, {})
324328
return adjuster_settings
325329

326330

331+
def get_adjuster_settings_no_defaults(game_name: str) -> Namespace:
332+
return persistent_load().get("adjuster", {}).get(game_name, Namespace())
333+
334+
335+
def get_adjuster_settings(game_name: str) -> Namespace:
336+
adjuster_settings = get_adjuster_settings_no_defaults(game_name)
337+
default_settings = get_default_adjuster_settings(game_name)
338+
339+
# Fill in any arguments from the argparser that we haven't seen before
340+
return Namespace(**vars(adjuster_settings), **{k:v for k,v in vars(default_settings).items() if k not in vars(adjuster_settings)})
341+
342+
327343
@cache_argsless
328344
def get_unique_identifier():
329345
uuid = persistent_load().get("client", {}).get("uuid", None)

worlds/alttp/Client.py

+18-24
Original file line numberDiff line numberDiff line change
@@ -581,31 +581,25 @@ async def game_watcher(self, ctx):
581581
def get_alttp_settings(romfile: str):
582582
import LttPAdjuster
583583

584-
last_settings = Utils.get_adjuster_settings(GAME_ALTTP)
585-
base_settings = LttPAdjuster.get_argparser().parse_known_args(args=[])[0]
586-
allow_list = {"music", "menuspeed", "heartbeep", "heartcolor", "ow_palettes", "quickswap",
587-
"uw_palettes", "sprite", "sword_palettes", "shield_palettes", "hud_palettes",
588-
"reduceflashing", "deathlink", "allowcollect", "oof"}
589-
590-
for option_name in allow_list:
591-
# set new defaults since last_settings were created
592-
if not hasattr(last_settings, option_name):
593-
setattr(last_settings, option_name, getattr(base_settings, option_name))
594-
595584
adjustedromfile = ''
596-
if last_settings:
585+
if vars(Utils.get_adjuster_settings_no_defaults(GAME_ALTTP)):
586+
last_settings = Utils.get_adjuster_settings(GAME_ALTTP)
587+
588+
allow_list = {"music", "menuspeed", "heartbeep", "heartcolor", "ow_palettes", "quickswap",
589+
"uw_palettes", "sprite", "sword_palettes", "shield_palettes", "hud_palettes",
590+
"reduceflashing", "deathlink", "allowcollect", "oof"}
597591
choice = 'no'
598-
if not hasattr(last_settings, 'auto_apply') or 'ask' in last_settings.auto_apply:
592+
if 'ask' in last_settings.auto_apply:
599593
printed_options = {name: value for name, value in vars(last_settings).items() if name in allow_list}
600-
if hasattr(last_settings, "sprite_pool"):
601-
sprite_pool = {}
602-
for sprite in last_settings.sprite_pool:
603-
if sprite in sprite_pool:
604-
sprite_pool[sprite] += 1
605-
else:
606-
sprite_pool[sprite] = 1
607-
if sprite_pool:
608-
printed_options["sprite_pool"] = sprite_pool
594+
595+
sprite_pool = {}
596+
for sprite in last_settings.sprite_pool:
597+
if sprite in sprite_pool:
598+
sprite_pool[sprite] += 1
599+
else:
600+
sprite_pool[sprite] = 1
601+
if sprite_pool:
602+
printed_options["sprite_pool"] = sprite_pool
609603
import pprint
610604

611605
from CommonClient import gui_enabled
@@ -685,17 +679,17 @@ def onButtonClick(answer: str = 'no'):
685679
choice = 'yes'
686680

687681
if 'yes' in choice:
682+
import LttPAdjuster
688683
from worlds.alttp.Rom import get_base_rom_path
689684
last_settings.rom = romfile
690685
last_settings.baserom = get_base_rom_path()
691686
last_settings.world = None
692687

693-
if hasattr(last_settings, "sprite_pool"):
688+
if last_settings.sprite_pool:
694689
from LttPAdjuster import AdjusterWorld
695690
last_settings.world = AdjusterWorld(getattr(last_settings, "sprite_pool"))
696691

697692
adjusted = True
698-
import LttPAdjuster
699693
_, adjustedromfile = LttPAdjuster.adjust(last_settings)
700694

701695
if hasattr(last_settings, "world"):

0 commit comments

Comments
 (0)