diff --git a/BaseClasses.py b/BaseClasses.py index 64453fd8..7454b033 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -43,6 +43,7 @@ class World(object): # persistently running program with multiple worlds rolling concurrently self.players = players self.teams = 1 + self.glitch_triforce = False self.shuffle = shuffle.copy() self.logic = logic.copy() self.mode = mode.copy() diff --git a/EntranceRandomizer.py b/EntranceRandomizer.py index 36f55019..0890eba2 100755 --- a/EntranceRandomizer.py +++ b/EntranceRandomizer.py @@ -38,6 +38,7 @@ def parse_arguments(argv, no_defaults=False): No Logic: Distribute items without regard for item requirements. ''') + parser.add_argument('--glitch_triforce', help='Allow glitching to Triforce from Ganon\'s room', action='store_true') parser.add_argument('--mode', default=defval('open'), const='open', nargs='?', choices=['standard', 'open', 'inverted'], help='''\ Select game mode. (default: %(default)s) diff --git a/Main.py b/Main.py index ac048f17..49671d63 100644 --- a/Main.py +++ b/Main.py @@ -105,6 +105,7 @@ def main(args, seed=None): world.er_seeds = args.er_seeds.copy() world.restrict_dungeon_item_on_boss = args.restrict_dungeon_item_on_boss.copy() world.required_medallions = args.required_medallions.copy() + world.glitch_triforce = args.glitch_triforce # This is enabled/disabled globally, no per player option. world.rom_seeds = {player: random.Random(world.random.randint(0, 999999999)) for player in range(1, world.players + 1)} diff --git a/MultiMystery.py b/MultiMystery.py index d569d2a0..446b3f35 100644 --- a/MultiMystery.py +++ b/MultiMystery.py @@ -49,6 +49,7 @@ if __name__ == "__main__": enemizer_path = multi_mystery_options["enemizer_path"] player_files_path = multi_mystery_options["player_files_path"] target_player_count = multi_mystery_options["players"] + glitch_triforce = multi_mystery_options["glitch_triforce_room"] race = multi_mystery_options["race"] plando_options = multi_mystery_options["plando_options"] create_spoiler = multi_mystery_options["create_spoiler"] @@ -114,6 +115,8 @@ if __name__ == "__main__": command += " --skip_playthrough" if zip_diffs: command += " --create_diff" + if glitch_triforce: + command += " --glitch_triforce" if race: command += " --race" if os.path.exists(os.path.join(player_files_path, meta_file_path)): diff --git a/Mystery.py b/Mystery.py index ef11fb82..14bf5d0f 100644 --- a/Mystery.py +++ b/Mystery.py @@ -42,6 +42,7 @@ def mystery_argparse(): parser.add_argument('--rom') parser.add_argument('--enemizercli') parser.add_argument('--outputpath') + parser.add_argument('--glitch_triforce', action='store_true') parser.add_argument('--race', action='store_true') parser.add_argument('--meta', default=None) parser.add_argument('--log_output_path', help='Path to store output log') @@ -106,6 +107,7 @@ def main(args=None, callback=ERmain): erargs.name = {x: "" for x in range(1, args.multi + 1)} # only so it can be overwrittin in mystery erargs.create_spoiler = args.create_spoiler erargs.create_diff = args.create_diff + erargs.glitch_triforce = args.glitch_triforce erargs.race = args.race erargs.skip_playthrough = args.skip_playthrough erargs.outputname = seedname diff --git a/Rom.py b/Rom.py index 22412717..94a45d20 100644 --- a/Rom.py +++ b/Rom.py @@ -1495,7 +1495,7 @@ def patch_rom(world, rom, player, team, enemized): rom.write_byte(0xEFD95, digging_game_rng) rom.write_byte(0x1800A3, 0x01) # enable correct world setting behaviour after agahnim kills rom.write_byte(0x1800A4, 0x01 if world.logic[player] != 'nologic' else 0x00) # enable POD EG fix - rom.write_byte(0x186383, 0x00 if world.logic[player] != 'nologic' else 0x01) # disable glitching to Triforce from Ganons Room + rom.write_byte(0x186383, 0x01 if world.glitch_triforce or world.logic[player] == 'nologic' else 0x00) # disable glitching to Triforce from Ganons Room rom.write_byte(0x180042, 0x01 if world.save_and_quit_from_boss else 0x00) # Allow Save and Quit after boss kill # remove shield from uncle diff --git a/Utils.py b/Utils.py index 78903790..e7490b89 100644 --- a/Utils.py +++ b/Utils.py @@ -224,6 +224,7 @@ def get_default_options() -> dict: "zip_spoiler": 0, "zip_multidata": 1, "zip_format": 1, + "glitch_triforce_room": 1, "race": 0, "cpu_threads": 0, "max_attempts": 0, diff --git a/host.yaml b/host.yaml index eb1d3875..27411274 100644 --- a/host.yaml +++ b/host.yaml @@ -101,6 +101,12 @@ multi_mystery_options: # 2 -> 7z is recommended for roms. All of them get the job done. # 3 -> bz2 zip_format: 1 + # Glitch to Triforce room from Ganon + # When disabled, you have to have a weapon that can hurt ganon (master sword or swordless/easy item functionality + hammer) + # and have completed the goal required for killing ganon to be able to access the triforce room. + # 1 -> Enabled. + # 0 -> Disabled (except in no-logic) + glitch_triforce_room: 1 # Create encrypted race roms race: 0 # List of options that can be plando'd. Can be combined, for example "bosses, items"