LttP: move some simple Toggle options over to new system

This commit is contained in:
Fabian Dill 2021-09-13 01:32:32 +02:00
parent e57e92bfee
commit 033adceb6f
8 changed files with 74 additions and 80 deletions

View File

@ -77,7 +77,6 @@ class MultiWorld():
set_player_attr('shuffle', "vanilla") set_player_attr('shuffle', "vanilla")
set_player_attr('logic', "noglitches") set_player_attr('logic', "noglitches")
set_player_attr('mode', 'open') set_player_attr('mode', 'open')
set_player_attr('swordless', False)
set_player_attr('difficulty', 'normal') set_player_attr('difficulty', 'normal')
set_player_attr('item_functionality', 'normal') set_player_attr('item_functionality', 'normal')
set_player_attr('timer', False) set_player_attr('timer', False)
@ -1127,7 +1126,7 @@ class Spoiler():
'tile_shuffle': self.world.tile_shuffle, 'tile_shuffle': self.world.tile_shuffle,
'bush_shuffle': self.world.bush_shuffle, 'bush_shuffle': self.world.bush_shuffle,
'beemizer': self.world.beemizer, 'beemizer': self.world.beemizer,
'shufflepots': self.world.shufflepots, 'pot_shuffle': self.world.pot_shuffle,
'players': self.world.players, 'players': self.world.players,
'progression_balancing': self.world.progression_balancing, 'progression_balancing': self.world.progression_balancing,
'triforce_pieces_available': self.world.triforce_pieces_available, 'triforce_pieces_available': self.world.triforce_pieces_available,
@ -1193,13 +1192,7 @@ class Spoiler():
outfile.write('Logic: %s\n' % self.metadata['logic'][player]) outfile.write('Logic: %s\n' % self.metadata['logic'][player])
outfile.write('Dark Room Logic: %s\n' % self.metadata['dark_room_logic'][player]) outfile.write('Dark Room Logic: %s\n' % self.metadata['dark_room_logic'][player])
outfile.write('Restricted Boss Drops: %s\n' %
bool_to_text(self.metadata['restrict_dungeon_item_on_boss'][player]))
outfile.write('Mode: %s\n' % self.metadata['mode'][player]) outfile.write('Mode: %s\n' % self.metadata['mode'][player])
outfile.write('Retro: %s\n' %
('Yes' if self.metadata['retro'][player] else 'No'))
outfile.write('Swordless: %s\n' % ('Yes' if self.metadata['swordless'][player] else 'No'))
outfile.write('Goal: %s\n' % self.metadata['goal'][player]) outfile.write('Goal: %s\n' % self.metadata['goal'][player])
if "triforce" in self.metadata["goal"][player]: # triforce hunt if "triforce" in self.metadata["goal"][player]: # triforce hunt
outfile.write("Pieces available for Triforce: %s\n" % outfile.write("Pieces available for Triforce: %s\n" %
@ -1225,18 +1218,9 @@ class Spoiler():
outfile.write('Custom Potion Shop: %s\n' % outfile.write('Custom Potion Shop: %s\n' %
bool_to_text("w" in self.metadata["shop_shuffle"][player])) bool_to_text("w" in self.metadata["shop_shuffle"][player]))
outfile.write('Boss shuffle: %s\n' % self.metadata['boss_shuffle'][player]) outfile.write('Boss shuffle: %s\n' % self.metadata['boss_shuffle'][player])
outfile.write(
'Enemy shuffle: %s\n' % bool_to_text(self.metadata['enemy_shuffle'][player]))
outfile.write('Enemy health: %s\n' % self.metadata['enemy_health'][player]) outfile.write('Enemy health: %s\n' % self.metadata['enemy_health'][player])
outfile.write('Enemy damage: %s\n' % self.metadata['enemy_damage'][player]) outfile.write('Enemy damage: %s\n' % self.metadata['enemy_damage'][player])
outfile.write(f'Killable thieves: {bool_to_text(self.metadata["killable_thieves"][player])}\n')
outfile.write(f'Shuffled tiles: {bool_to_text(self.metadata["tile_shuffle"][player])}\n')
outfile.write(f'Shuffled bushes: {bool_to_text(self.metadata["bush_shuffle"][player])}\n')
outfile.write(
'Hints: %s\n' % ('Yes' if self.metadata['hints'][player] else 'No'))
outfile.write('Beemizer: %s\n' % self.metadata['beemizer'][player]) outfile.write('Beemizer: %s\n' % self.metadata['beemizer'][player])
outfile.write('Pot shuffle %s\n'
% ('Yes' if self.metadata['shufflepots'][player] else 'No'))
outfile.write('Prize shuffle %s\n' % outfile.write('Prize shuffle %s\n' %
self.metadata['shuffle_prizes'][player]) self.metadata['shuffle_prizes'][player])
if self.entrances: if self.entrances:

View File

@ -121,10 +121,9 @@ def main(args=None, callback=ERmain):
f"A mix is also permitted.") f"A mix is also permitted.")
erargs = parse_arguments(['--multi', str(args.multi)]) erargs = parse_arguments(['--multi', str(args.multi)])
erargs.seed = seed erargs.seed = seed
erargs.create_spoiler = args.spoiler > 0
erargs.glitch_triforce = options["generator"]["glitch_triforce_room"] erargs.glitch_triforce = options["generator"]["glitch_triforce_room"]
erargs.spoiler = args.spoiler
erargs.race = args.race erargs.race = args.race
erargs.skip_playthrough = args.spoiler < 2
erargs.outputname = seed_name erargs.outputname = seed_name
erargs.outputpath = args.outputpath erargs.outputpath = args.outputpath
@ -587,8 +586,6 @@ def roll_alttp_settings(ret: argparse.Namespace, weights, plando_options):
if ret.dark_room_logic not in {"lamp", "torches", "none"}: if ret.dark_room_logic not in {"lamp", "torches", "none"}:
raise ValueError(f"Unknown Dark Room Logic: \"{ret.dark_room_logic}\"") raise ValueError(f"Unknown Dark Room Logic: \"{ret.dark_room_logic}\"")
ret.restrict_dungeon_item_on_boss = get_choice_legacy('restrict_dungeon_item_on_boss', weights, False)
entrance_shuffle = get_choice_legacy('entrance_shuffle', weights, 'vanilla') entrance_shuffle = get_choice_legacy('entrance_shuffle', weights, 'vanilla')
if entrance_shuffle.startswith('none-'): if entrance_shuffle.startswith('none-'):
ret.shuffle = 'vanilla' ret.shuffle = 'vanilla'
@ -628,11 +625,6 @@ def roll_alttp_settings(ret: argparse.Namespace, weights, plando_options):
ret.shop_shuffle = '' ret.shop_shuffle = ''
ret.mode = get_choice_legacy("mode", weights) ret.mode = get_choice_legacy("mode", weights)
ret.retro = get_choice_legacy("retro", weights)
ret.hints = get_choice_legacy('hints', weights)
ret.swordless = get_choice_legacy('swordless', weights, False)
ret.difficulty = get_choice_legacy('item_pool', weights) ret.difficulty = get_choice_legacy('item_pool', weights)
@ -641,12 +633,6 @@ def roll_alttp_settings(ret: argparse.Namespace, weights, plando_options):
boss_shuffle = get_choice_legacy('boss_shuffle', weights) boss_shuffle = get_choice_legacy('boss_shuffle', weights)
ret.shufflebosses = get_plando_bosses(boss_shuffle, plando_options) ret.shufflebosses = get_plando_bosses(boss_shuffle, plando_options)
ret.enemy_shuffle = bool(get_choice_legacy('enemy_shuffle', weights, False))
ret.killable_thieves = get_choice_legacy('killable_thieves', weights, False)
ret.tile_shuffle = get_choice_legacy('tile_shuffle', weights, False)
ret.bush_shuffle = get_choice_legacy('bush_shuffle', weights, False)
ret.enemy_damage = {None: 'default', ret.enemy_damage = {None: 'default',
'default': 'default', 'default': 'default',
'shuffled': 'shuffled', 'shuffled': 'shuffled',
@ -656,8 +642,6 @@ def roll_alttp_settings(ret: argparse.Namespace, weights, plando_options):
ret.enemy_health = get_choice_legacy('enemy_health', weights) ret.enemy_health = get_choice_legacy('enemy_health', weights)
ret.shufflepots = get_choice_legacy('pot_shuffle', weights)
ret.beemizer = int(get_choice_legacy('beemizer', weights, 0)) ret.beemizer = int(get_choice_legacy('beemizer', weights, 0))
ret.timer = {'none': False, ret.timer = {'none': False,

12
Main.py
View File

@ -63,24 +63,17 @@ def main(args, seed=None):
world.customitemarray = args.customitemarray world.customitemarray = args.customitemarray
world.accessibility = args.accessibility.copy() world.accessibility = args.accessibility.copy()
world.retro = args.retro.copy()
world.hints = args.hints.copy()
world.open_pyramid = args.open_pyramid.copy() world.open_pyramid = args.open_pyramid.copy()
world.boss_shuffle = args.shufflebosses.copy() world.boss_shuffle = args.shufflebosses.copy()
world.enemy_shuffle = args.enemy_shuffle.copy() world.enemy_shuffle = args.enemy_shuffle.copy()
world.enemy_health = args.enemy_health.copy() world.enemy_health = args.enemy_health.copy()
world.enemy_damage = args.enemy_damage.copy() world.enemy_damage = args.enemy_damage.copy()
world.killable_thieves = args.killable_thieves.copy()
world.bush_shuffle = args.bush_shuffle.copy()
world.tile_shuffle = args.tile_shuffle.copy()
world.beemizer = args.beemizer.copy() world.beemizer = args.beemizer.copy()
world.timer = args.timer.copy() world.timer = args.timer.copy()
world.countdown_start_time = args.countdown_start_time.copy() world.countdown_start_time = args.countdown_start_time.copy()
world.red_clock_time = args.red_clock_time.copy() world.red_clock_time = args.red_clock_time.copy()
world.blue_clock_time = args.blue_clock_time.copy() world.blue_clock_time = args.blue_clock_time.copy()
world.green_clock_time = args.green_clock_time.copy() world.green_clock_time = args.green_clock_time.copy()
world.shufflepots = args.shufflepots.copy()
world.dungeon_counters = args.dungeon_counters.copy() world.dungeon_counters = args.dungeon_counters.copy()
world.triforce_pieces_available = args.triforce_pieces_available.copy() world.triforce_pieces_available = args.triforce_pieces_available.copy()
world.triforce_pieces_required = args.triforce_pieces_required.copy() world.triforce_pieces_required = args.triforce_pieces_required.copy()
@ -93,7 +86,6 @@ def main(args, seed=None):
world.plando_texts = args.plando_texts.copy() world.plando_texts = args.plando_texts.copy()
world.plando_connections = args.plando_connections.copy() world.plando_connections = args.plando_connections.copy()
world.er_seeds = getattr(args, "er_seeds", {}) world.er_seeds = getattr(args, "er_seeds", {})
world.restrict_dungeon_item_on_boss = args.restrict_dungeon_item_on_boss.copy()
world.required_medallions = args.required_medallions.copy() world.required_medallions = args.required_medallions.copy()
world.game = args.game.copy() world.game = args.game.copy()
world.set_options(args) world.set_options(args)
@ -346,11 +338,11 @@ def main(args, seed=None):
logger.info(f'Generating output files ({i}/{len(output_file_futures)}).') logger.info(f'Generating output files ({i}/{len(output_file_futures)}).')
future.result() future.result()
if not args.skip_playthrough: if args.spoiler > 1:
logger.info('Calculating playthrough.') logger.info('Calculating playthrough.')
create_playthrough(world) create_playthrough(world)
if args.create_spoiler: if args.spoiler:
world.spoiler.to_file(os.path.join(temp_dir, '%s_Spoiler.txt' % outfilebase)) world.spoiler.to_file(os.path.join(temp_dir, '%s_Spoiler.txt' % outfilebase))
zipfilename = output_path(f"AP_{world.seed_name}.zip") zipfilename = output_path(f"AP_{world.seed_name}.zip")

View File

@ -74,9 +74,8 @@ def gen_game(gen_options, race=False, owner=None, sid=None):
erargs = parse_arguments(['--multi', str(playercount)]) erargs = parse_arguments(['--multi', str(playercount)])
erargs.seed = seed erargs.seed = seed
erargs.name = {x: "" for x in range(1, playercount + 1)} # only so it can be overwrittin in mystery erargs.name = {x: "" for x in range(1, playercount + 1)} # only so it can be overwrittin in mystery
erargs.create_spoiler = not race erargs.spoiler = 0 if race else 2
erargs.race = race erargs.race = race
erargs.skip_playthrough = race
erargs.outputname = seedname erargs.outputname = seedname
erargs.outputpath = target.name erargs.outputpath = target.name
erargs.teams = 1 erargs.teams = 1

View File

@ -20,7 +20,6 @@ def parse_arguments(argv, no_defaults=False):
multiargs, _ = parser.parse_known_args(argv) multiargs, _ = parser.parse_known_args(argv)
parser = argparse.ArgumentParser(formatter_class=ArgumentDefaultsHelpFormatter) parser = argparse.ArgumentParser(formatter_class=ArgumentDefaultsHelpFormatter)
parser.add_argument('--create_spoiler', help='Output a Spoiler File', action='store_true')
parser.add_argument('--logic', default=defval('noglitches'), const='noglitches', nargs='?', choices=['noglitches', 'minorglitches', 'owglitches', 'hybridglitches', 'nologic'], parser.add_argument('--logic', default=defval('noglitches'), const='noglitches', nargs='?', choices=['noglitches', 'minorglitches', 'owglitches', 'hybridglitches', 'nologic'],
help='''\ help='''\
Select Enforcement of Item Requirements. (default: %(default)s) Select Enforcement of Item Requirements. (default: %(default)s)
@ -46,17 +45,6 @@ def parse_arguments(argv, no_defaults=False):
Requires the moon pearl to be Link in the Light World Requires the moon pearl to be Link in the Light World
instead of a bunny. instead of a bunny.
''') ''')
parser.add_argument('--swordless', action='store_true',
help='''\
Toggles Swordless Mode
Swordless: No swords. Curtains in Skull Woods and Agahnim\'s
Tower are removed, Agahnim\'s Tower barrier can be
destroyed with hammer. Misery Mire and Turtle Rock
can be opened without a sword. Hammer damages Ganon.
Ether and Bombos Tablet can be activated with Hammer
(and Book). Bombos pads have been added in Ice
Palace, to allow for an alternative to firerod.
''')
parser.add_argument('--goal', default=defval('ganon'), const='ganon', nargs='?', parser.add_argument('--goal', default=defval('ganon'), const='ganon', nargs='?',
choices=['ganon', 'pedestal', 'bosses', 'triforcehunt', 'localtriforcehunt', 'ganontriforcehunt', 'localganontriforcehunt', 'crystals', 'ganonpedestal'], choices=['ganon', 'pedestal', 'bosses', 'triforcehunt', 'localtriforcehunt', 'ganontriforcehunt', 'localganontriforcehunt', 'crystals', 'ganonpedestal'],
help='''\ help='''\
@ -206,10 +194,6 @@ def parse_arguments(argv, no_defaults=False):
time). time).
''', type=int) ''', type=int)
parser.add_argument('--retro', default=defval(False), help='''\
Keys are universal, shooting arrows costs rupees,
and a few other little things make this more like Zelda-1.
''', action='store_true')
parser.add_argument('--local_items', default=defval(''), parser.add_argument('--local_items', default=defval(''),
help='Specifies a list of items that will not spread across the multiworld (separated by commas)') help='Specifies a list of items that will not spread across the multiworld (separated by commas)')
parser.add_argument('--non_local_items', default=defval(''), parser.add_argument('--non_local_items', default=defval(''),
@ -223,9 +207,6 @@ def parse_arguments(argv, no_defaults=False):
Locations: You will be able to reach every location in the game. Locations: You will be able to reach every location in the game.
None: You will be able to reach enough locations to beat the game. None: You will be able to reach enough locations to beat the game.
''') ''')
parser.add_argument('--hints', default=defval(False), help='''\
Make telepathic tiles and storytellers give helpful hints.
''', action='store_true')
# included for backwards compatibility # included for backwards compatibility
parser.add_argument('--shuffleganon', help=argparse.SUPPRESS, action='store_true', default=defval(True)) parser.add_argument('--shuffleganon', help=argparse.SUPPRESS, action='store_true', default=defval(True))
parser.add_argument('--no-shuffleganon', help='''\ parser.add_argument('--no-shuffleganon', help='''\
@ -243,18 +224,13 @@ def parse_arguments(argv, no_defaults=False):
parser.add_argument('--gui', help='Launch the GUI', action='store_true') parser.add_argument('--gui', help='Launch the GUI', action='store_true')
parser.add_argument('--progression_balancing', action='store_true', default=defval(False), parser.add_argument('--progression_balancing', action='store_true', default=defval(False),
help="Enable Multiworld Progression balancing.") help="Enable Multiworld Progression balancing.")
parser.add_argument('--skip_playthrough', action='store_true', default=defval(False))
parser.add_argument('--enemizercli', default=defval('EnemizerCLI/EnemizerCLI.Core')) parser.add_argument('--enemizercli', default=defval('EnemizerCLI/EnemizerCLI.Core'))
parser.add_argument('--shufflebosses', default=defval('none'), choices=['none', 'basic', 'normal', 'chaos', parser.add_argument('--shufflebosses', default=defval('none'), choices=['none', 'basic', 'normal', 'chaos',
"singularity"]) "singularity"])
parser.add_argument('--enemy_shuffle', action='store_true')
parser.add_argument('--killable_thieves', action='store_true')
parser.add_argument('--tile_shuffle', action='store_true')
parser.add_argument('--bush_shuffle', action='store_true')
parser.add_argument('--enemy_health', default=defval('default'), parser.add_argument('--enemy_health', default=defval('default'),
choices=['default', 'easy', 'normal', 'hard', 'expert']) choices=['default', 'easy', 'normal', 'hard', 'expert'])
parser.add_argument('--enemy_damage', default=defval('default'), choices=['default', 'shuffled', 'chaos']) parser.add_argument('--enemy_damage', default=defval('default'), choices=['default', 'shuffled', 'chaos'])
parser.add_argument('--shufflepots', default=defval(False), action='store_true')
parser.add_argument('--beemizer', default=defval(0), type=lambda value: min(max(int(value), 0), 4)) parser.add_argument('--beemizer', default=defval(0), type=lambda value: min(max(int(value), 0), 4))
parser.add_argument('--shop_shuffle', default='', help='''\ parser.add_argument('--shop_shuffle', default='', help='''\
combine letters for options: combine letters for options:
@ -272,7 +248,6 @@ def parse_arguments(argv, no_defaults=False):
For unlit dark rooms, require the Lamp to be considered in logic by default. For unlit dark rooms, require the Lamp to be considered in logic by default.
Torches means additionally easily accessible Torches that can be lit with Fire Rod are considered doable. Torches means additionally easily accessible Torches that can be lit with Fire Rod are considered doable.
None means full traversal through dark rooms without tools is considered doable.''') None means full traversal through dark rooms without tools is considered doable.''')
parser.add_argument('--restrict_dungeon_item_on_boss', default=defval(False), action="store_true")
parser.add_argument('--multi', default=defval(1), type=lambda value: min(max(int(value), 1), 255)) parser.add_argument('--multi', default=defval(1), type=lambda value: min(max(int(value), 1), 255))
parser.add_argument('--names', default=defval('')) parser.add_argument('--names', default=defval(''))
parser.add_argument('--outputpath') parser.add_argument('--outputpath')
@ -307,19 +282,19 @@ def parse_arguments(argv, no_defaults=False):
for player in range(1, multiargs.multi + 1): for player in range(1, multiargs.multi + 1):
playerargs = parse_arguments(shlex.split(getattr(ret, f"p{player}")), True) playerargs = parse_arguments(shlex.split(getattr(ret, f"p{player}")), True)
for name in ['logic', 'mode', 'swordless', 'goal', 'difficulty', 'item_functionality', for name in ['logic', 'mode', 'goal', 'difficulty', 'item_functionality',
'shuffle', 'open_pyramid', 'timer', 'shuffle', 'open_pyramid', 'timer',
'countdown_start_time', 'red_clock_time', 'blue_clock_time', 'green_clock_time', 'countdown_start_time', 'red_clock_time', 'blue_clock_time', 'green_clock_time',
'local_items', 'non_local_items', 'retro', 'accessibility', 'hints', 'beemizer', 'local_items', 'non_local_items', 'accessibility', 'beemizer',
'shufflebosses', 'enemy_shuffle', 'enemy_health', 'enemy_damage', 'shufflepots', 'shufflebosses', 'enemy_health', 'enemy_damage',
'sprite', 'sprite',
"progression_balancing", "triforce_pieces_available", "progression_balancing", "triforce_pieces_available",
"triforce_pieces_required", "shop_shuffle", "triforce_pieces_required", "shop_shuffle",
"required_medallions", "start_hints", "required_medallions", "start_hints",
"plando_items", "plando_texts", "plando_connections", "er_seeds", "plando_items", "plando_texts", "plando_connections", "er_seeds",
'dungeon_counters', 'killable_thieves', 'dungeon_counters',
'tile_shuffle', 'bush_shuffle', 'shuffle_prizes', 'sprite_pool', 'dark_room_logic', 'shuffle_prizes', 'sprite_pool', 'dark_room_logic',
'restrict_dungeon_item_on_boss', 'game']: 'game']:
value = getattr(defaults, name) if getattr(playerargs, name) is None else getattr(playerargs, name) value = getattr(defaults, name) if getattr(playerargs, name) is None else getattr(playerargs, name)
if player == 1: if player == 1:
setattr(ret, name, {1: value}) setattr(ret, name, {1: value})

View File

@ -126,6 +126,59 @@ class Progressive(Choice):
return random.choice([True, False]) if self.value == self.option_grouped_random else bool(self.value) return random.choice([True, False]) if self.value == self.option_grouped_random else bool(self.value)
class Swordless(Toggle):
"""No swords. Curtains in Skull Woods and Agahnim\'s
Tower are removed, Agahnim\'s Tower barrier can be
destroyed with hammer. Misery Mire and Turtle Rock
can be opened without a sword. Hammer damages Ganon.
Ether and Bombos Tablet can be activated with Hammer
(and Book)."""
displayname = "Swordless"
class Retro(Toggle):
"""Zelda-1 like mode. You have to purchase a quiver to shoot arrows using rupees
and there are randomly placed take-any caves that contain one Sword and choices of Heart Container/Blue Potion."""
displayname = "Retro"
class RestrictBossItem(Toggle):
"""Don't place dungeon-native items on the dungeon's boss."""
displayname = "Prevent Dungeon Item on Boss"
class Hints(DefaultOnToggle):
"""Put item and entrance placement hints on telepathic tiles and some NPCs.
Additionally King Zora and Bottle Merchant say what they're selling."""
displayname = "Hints"
class EnemyShuffle(Toggle):
"""Randomize every enemy spawn.
If mode is Standard, Hyrule Castle is left out (may result in visually wrong enemy sprites in that area.)"""
displayname = "Enemy Shuffle"
class KillableThieves(Toggle):
"""Makes Thieves killable."""
displayname = "Killable Thieves"
class BushShuffle(Toggle):
"""Randomize chance that a bush contains an enemy as well as which enemy may spawn."""
displayname = "Bush Shuffle"
class TileShuffle(Toggle):
"""Randomize flying tiles floor patterns."""
displayname = "Tile Shuffle"
class PotShuffle(Toggle):
"""Shuffle contents of pots within "supertiles" (item will still be nearby original placement)."""
displayname = "Pot Shuffle"
class Palette(Choice): class Palette(Choice):
option_default = 0 option_default = 0
option_good = 1 option_good = 1
@ -226,6 +279,13 @@ alttp_options: typing.Dict[str, type(Option)] = {
"compass_shuffle": compass_shuffle, "compass_shuffle": compass_shuffle,
"map_shuffle": map_shuffle, "map_shuffle": map_shuffle,
"progressive": Progressive, "progressive": Progressive,
"swordless": Swordless,
"hints": Hints,
"restrict_dungeon_item_on_boss": RestrictBossItem,
"pot_shuffle": PotShuffle,
"enemy_shuffle": EnemyShuffle,
"killable_thieves": KillableThieves,
"bush_shuffle": BushShuffle,
"shop_item_slots": ShopItemSlots, "shop_item_slots": ShopItemSlots,
"ow_palettes": OWPalette, "ow_palettes": OWPalette,
"uw_palettes": UWPalette, "uw_palettes": UWPalette,

View File

@ -323,7 +323,7 @@ def patch_enemizer(world, player: int, rom: LocalRom, enemizercli, output_direct
'GrayscaleMode': False, 'GrayscaleMode': False,
'GenerateSpoilers': False, 'GenerateSpoilers': False,
'RandomizeLinkSpritePalette': False, 'RandomizeLinkSpritePalette': False,
'RandomizePots': world.shufflepots[player], 'RandomizePots': world.pot_shuffle[player],
'ShuffleMusic': False, 'ShuffleMusic': False,
'BootlegMagic': True, 'BootlegMagic': True,
'CustomBosses': False, 'CustomBosses': False,

View File

@ -258,7 +258,7 @@ class ALTTPWorld(World):
try: try:
use_enemizer = (world.boss_shuffle[player] != 'none' or world.enemy_shuffle[player] use_enemizer = (world.boss_shuffle[player] != 'none' or world.enemy_shuffle[player]
or world.enemy_health[player] != 'default' or world.enemy_damage[player] != 'default' or world.enemy_health[player] != 'default' or world.enemy_damage[player] != 'default'
or world.shufflepots[player] or world.bush_shuffle[player] or world.pot_shuffle[player] or world.bush_shuffle[player]
or world.killable_thieves[player]) or world.killable_thieves[player])
rom = LocalRom(world.alttp_rom) rom = LocalRom(world.alttp_rom)