From fb66ca5607f18778f46a1ea356c864b49898cf58 Mon Sep 17 00:00:00 2001 From: Cody Bailey Date: Sat, 14 Jan 2023 18:27:43 -0500 Subject: [PATCH 1/7] Add Race Yes/No to spoiler output --- BaseClasses.py | 1 + 1 file changed, 1 insertion(+) diff --git a/BaseClasses.py b/BaseClasses.py index 91404ebb..82eb0f37 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -2646,6 +2646,7 @@ class Spoiler(object): outfile.write('Enemy health: %s\n' % self.metadata['enemy_health'][player]) outfile.write('Enemy damage: %s\n' % self.metadata['enemy_damage'][player]) outfile.write(f"Hints: {yn(self.metadata['hints'][player])}\n") + outfile.write('Race: %s\n' % ('Yes' if self.world.settings.world_rep['meta']['race'] else 'No')) if self.startinventory: outfile.write('Starting Inventory:'.ljust(line_width)) From 5cde789b434a4c0ab3ecb2b9b4f68fd9fda8b157 Mon Sep 17 00:00:00 2001 From: Cody Bailey Date: Thu, 19 Jan 2023 20:02:49 -0500 Subject: [PATCH 2/7] Potential fix for duped HC/AT Maps/Compasses --- DoorShuffle.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/DoorShuffle.py b/DoorShuffle.py index bb175461..4fa84b78 100644 --- a/DoorShuffle.py +++ b/DoorShuffle.py @@ -797,15 +797,18 @@ def main_dungeon_pool(dungeon_pool, world, player): hc = world.get_dungeon('Hyrule Castle', player) hc_compass = ItemFactory('Compass (Escape)', player) hc_compass.advancement = world.restrict_boss_items[player] != 'none' - hc.dungeon_items.append(hc_compass) + if hc.dungeon_items.count(hc_compass) < 1: + hc.dungeon_items.append(hc_compass) if 'Agahnims Tower' in pool: at = world.get_dungeon('Agahnims Tower', player) at_compass = ItemFactory('Compass (Agahnims Tower)', player) at_compass.advancement = world.restrict_boss_items[player] != 'none' - at.dungeon_items.append(at_compass) + if at.dungeon_items.count(at_compass) < 1: + at.dungeon_items.append(at_compass) at_map = ItemFactory('Map (Agahnims Tower)', player) at_map.advancement = world.restrict_boss_items[player] != 'none' - at.dungeon_items.append(at_map) + if at.dungeon_items.count(at_map) < 1: + at.dungeon_items.append(at_map) sector_pool = convert_to_sectors(region_list, world, player) merge_sectors(sector_pool, world, player) # todo: which dungeon to create @@ -1237,10 +1240,13 @@ def cross_dungeon(world, player): if world.restrict_boss_items[player] != 'none': hc_compass.advancement = at_compass.advancement = at_map.advancement = True hc = world.get_dungeon('Hyrule Castle', player) - hc.dungeon_items.append(hc_compass) + if hc.dungeon_items.count(hc_compass) < 1: + hc.dungeon_items.append(hc_compass) at = world.get_dungeon('Agahnims Tower', player) - at.dungeon_items.append(at_compass) - at.dungeon_items.append(at_map) + if at.dungeon_items.count(at_compass) < 1: + at.dungeon_items.append(at_compass) + if at.dungeon_items.count(at_map) < 1: + at.dungeon_items.append(at_map) setup_custom_door_types(world, player) assign_cross_keys(dungeon_builders, world, player) From f67cf929f75386e4fca2db6f9695723caca5660f Mon Sep 17 00:00:00 2001 From: Kris Davie Date: Sun, 22 Jan 2023 11:13:40 +0100 Subject: [PATCH 3/7] Enable `settingsfile` for multiworld generation --- CLI.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CLI.py b/CLI.py index cfb3f2eb..0bbf1181 100644 --- a/CLI.py +++ b/CLI.py @@ -122,6 +122,11 @@ def parse_cli(argv, no_defaults=False): defaults = copy.deepcopy(ret) for player in range(1, player_num + 1): playerargs = parse_cli(shlex.split(getattr(ret, f"p{player}")), True) + + if playerargs.filename: + playersettings = apply_settings_file({}, playerargs.filename) + for k, v in playersettings.items(): + setattr(playerargs, k, v) for name in ['logic', 'mode', 'swords', 'goal', 'difficulty', 'item_functionality', 'flute_mode', 'bow_mode', 'take_any', 'boots_hint', From 04a9bcc68b4ebba9764d35cf95828f09c548a1d9 Mon Sep 17 00:00:00 2001 From: aerinon Date: Fri, 27 Jan 2023 15:21:22 -0700 Subject: [PATCH 4/7] Fix for free light cone in escape. No longer missing when entering from DW. No longer disappears after using fire rod to light torch. --- Main.py | 2 +- RELEASENOTES.md | 3 +++ Rom.py | 2 +- data/base2current.bps | Bin 93506 -> 93487 bytes 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Main.py b/Main.py index 40e6c702..a412220e 100644 --- a/Main.py +++ b/Main.py @@ -34,7 +34,7 @@ from source.overworld.EntranceShuffle2 import link_entrances_new from source.tools.BPS import create_bps_from_data from source.classes.CustomSettings import CustomSettings -__version__ = '1.2.0.5-u' +__version__ = '1.2.0.6-u' from source.classes.BabelFish import BabelFish diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 095682e0..3ee20968 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -108,6 +108,9 @@ These are now independent of retro mode and have three options: None, Random, an * Bonk Fairy (Dark) # Bug Fixes and Notes +* 1.2.0.6-u + * Fix for light cone in Escape when entering from Dark World post-zelda + * Fix for light cone in Escape when lighting a torch with fire rod * 1.2.0.5.u * Logic fix for Sanctuary mirror (it wasn't resetting the crystal state) * Minor bugfixes for customizer diff --git a/Rom.py b/Rom.py index b0121eea..54d801bd 100644 --- a/Rom.py +++ b/Rom.py @@ -37,7 +37,7 @@ from source.dungeon.RoomList import Room0127 JAP10HASH = '03a63945398191337e896e5771f77173' -RANDOMIZERBASEHASH = '1e1094919d6a9dd151f8bc15c40b35f7' +RANDOMIZERBASEHASH = '4eeafc915838a7c9c5eff7a1b53d4709' class JsonRom(object): diff --git a/data/base2current.bps b/data/base2current.bps index 271b2c2e5bd56abf7e11615aee052723186d40f8..3afa29d0716c0797214cc3ce5204a82e3c8f5ff5 100644 GIT binary patch delta 9372 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 delta 9305 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 Date: Sat, 28 Jan 2023 11:51:42 -0700 Subject: [PATCH 5/7] Fix for starting with plain Ocarina (Inactived version) --- InitialSram.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/InitialSram.py b/InitialSram.py index 8d0ade11..67c7dc83 100644 --- a/InitialSram.py +++ b/InitialSram.py @@ -142,8 +142,8 @@ class InitialSram: 'Big Key (Misery Mire)': (0x367, 0x01), 'Compass (Misery Mire)': (0x365, 0x01), 'Map (Misery Mire)': (0x369, 0x01), 'Big Key (Turtle Rock)': (0x366, 0x08), 'Compass (Turtle Rock)': (0x364, 0x08), 'Map (Turtle Rock)': (0x368, 0x08), 'Big Key (Ganons Tower)': (0x366, 0x04), 'Compass (Ganons Tower)': (0x364, 0x04), 'Map (Ganons Tower)': (0x368, 0x04)} - set_or_table = {'Flippers': (0x356, 1, 0x379, 0x02),'Pegasus Boots': (0x355, 1, 0x379, 0x04), - 'Shovel': (0x34C, 1, 0x38C, 0x04), 'Ocarina': (0x34C, 3, 0x38C, 0x01), + set_or_table = {'Flippers': (0x356, 1, 0x379, 0x02), 'Pegasus Boots': (0x355, 1, 0x379, 0x04), + 'Shovel': (0x34C, 1, 0x38C, 0x04), 'Ocarina': (0x34C, 2, 0x38C, 0x02), 'Ocarina (Activated)': (0x34C, 3, 0x38C, 0x01), 'Mushroom': (0x344, 1, 0x38C, 0x20 | 0x08), 'Magic Powder': (0x344, 2, 0x38C, 0x10), 'Blue Boomerang': (0x341, 1, 0x38C, 0x80), 'Red Boomerang': (0x341, 2, 0x38C, 0x40)} From 7c75053cc1309a2fa6dafc5d754b6348bc212e4d Mon Sep 17 00:00:00 2001 From: aerinon Date: Mon, 30 Jan 2023 15:31:43 -0700 Subject: [PATCH 6/7] Fix for vanilla mire key logic --- BaseClasses.py | 9 +++++++++ Fill.py | 5 +++++ source/overworld/EntranceShuffle2.py | 15 +++++++++------ 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index 82eb0f37..ec04d679 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -743,6 +743,15 @@ class CollectionState(object): rrp[k] = missing_regions[k] possible_path = terminal_states[0].path[k] self.path[k] = paths[k] = possible_path + for conn in k.exits: + if self.is_small_door(conn): + door = conn.door if conn.door.smallKey else conn.door.controller + key_logic = self.world.key_logic[player][dungeon_name] + if door.name not in self.reached_doors[player]: + self.door_counter[player][0][dungeon_name] += 1 + self.reached_doors[player].add(door.name) + if key_logic.sm_doors[door]: + self.reached_doors[player].add(key_logic.sm_doors[door].name) missing_bc = {} for blocked, crystal in common_bc.items(): if (blocked not in bc and blocked.parent_region in rrp diff --git a/Fill.py b/Fill.py index 0cee1ab3..321e1a8e 100644 --- a/Fill.py +++ b/Fill.py @@ -380,6 +380,11 @@ def distribute_items_restrictive(world, gftower_trash=False, fill_locations=None random.shuffle(fill_locations) random.shuffle(world.itempool) + if world.item_pool_config.preferred: + pref = list(world.item_pool_config.preferred.keys()) + pref_len = len(pref) + world.itempool.sort(key=lambda i: pref_len - pref.index((i.name, i.player)) + if (i.name, i.player) in world.item_pool_config.preferred else 0) progitempool = [item for item in world.itempool if item.advancement] prioitempool = [item for item in world.itempool if not item.advancement and item.priority] restitempool = [item for item in world.itempool if not item.advancement and not item.priority] diff --git a/source/overworld/EntranceShuffle2.py b/source/overworld/EntranceShuffle2.py index d5df982a..e6c5a13a 100644 --- a/source/overworld/EntranceShuffle2.py +++ b/source/overworld/EntranceShuffle2.py @@ -1022,12 +1022,15 @@ def connect_custom(avail_pool, world, player): if world.customizer and world.customizer.get_entrances(): custom_entrances = world.customizer.get_entrances() player_key = player - for ent_name, exit_name in custom_entrances[player_key]['two-way'].items(): - connect_two_way(ent_name, exit_name, avail_pool) - for ent_name, exit_name in custom_entrances[player_key]['entrances'].items(): - connect_entrance(ent_name, exit_name, avail_pool) - for ent_name, exit_name in custom_entrances[player_key]['exits'].items(): - connect_exit(exit_name, ent_name, avail_pool) + if 'two-way' in custom_entrances[player_key]: + for ent_name, exit_name in custom_entrances[player_key]['two-way'].items(): + connect_two_way(ent_name, exit_name, avail_pool) + if 'entrances' in custom_entrances[player_key]: + for ent_name, exit_name in custom_entrances[player_key]['entrances'].items(): + connect_entrance(ent_name, exit_name, avail_pool) + if 'exits' in custom_entrances[player_key]: + for ent_name, exit_name in custom_entrances[player_key]['exits'].items(): + connect_exit(exit_name, ent_name, avail_pool) def connect_simple(world, exit_name, region_name, player): From fb13785abc87fc6cb9b1c209be6e37dfdfd5d927 Mon Sep 17 00:00:00 2001 From: aerinon Date: Mon, 6 Feb 2023 13:46:25 -0700 Subject: [PATCH 7/7] Minor standard generation fix Minor ER + Partitioned fix --- DoorShuffle.py | 4 ++-- Doors.py | 1 + Main.py | 2 +- RELEASENOTES.md | 6 ++++++ source/overworld/EntranceShuffle2.py | 2 +- 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/DoorShuffle.py b/DoorShuffle.py index 4fa84b78..e4d4a7be 100644 --- a/DoorShuffle.py +++ b/DoorShuffle.py @@ -476,14 +476,14 @@ def choose_portals(world, player): info.required_passage = {x: y for x, y in info.required_passage.items() if len(y) > 0} for target_region, possible_portals in info.required_passage.items(): candidates = find_portal_candidates(master_door_list, dungeon, custom, allowed, need_passage=True, - bk_shuffle=bk_shuffle, rupee_bow=rupee_bow_flag) + bk_shuffle=bk_shuffle, standard=std_flag, rupee_bow=rupee_bow_flag) choice, portal = assign_portal(candidates, possible_portals, custom, world, player) portal.destination = True clean_up_portal_assignment(portal_assignment, dungeon, portal, master_door_list, outstanding_portals) dead_end_choices = info.total - 1 - len(portal_assignment[dungeon]) for i in range(0, dead_end_choices): candidates = find_portal_candidates(master_door_list, dungeon, custom, allowed, dead_end_allowed=True, - bk_shuffle=bk_shuffle, rupee_bow=rupee_bow_flag) + bk_shuffle=bk_shuffle, standard=std_flag, rupee_bow=rupee_bow_flag) possible_portals = outstanding_portals if not info.sole_entrance else [x for x in outstanding_portals if x != info.sole_entrance] choice, portal = assign_portal(candidates, possible_portals, custom, world, player) if choice.deadEnd: diff --git a/Doors.py b/Doors.py index 110ca5c9..edc51ac0 100644 --- a/Doors.py +++ b/Doors.py @@ -1521,6 +1521,7 @@ def create_doors(world, player): world.get_door("GT Bob\'s Room SE", player).passage = False world.get_door('Desert Tiles 2 SE', player).bk_shuffle_req = True # key-drop note: allows this to be a portal world.get_door('Swamp Lobby S', player).standard_restricted = True + world.get_door('Sanctuary S', player).standard_restricted = True world.get_door('PoD Mimics 2 SW', player).rupee_bow_restricted = True # bow statue # enemizer logic could get rid of the following restriction world.get_door('PoD Pit Room S', player).rupee_bow_restricted = True # so mimics 1 shouldn't be required diff --git a/Main.py b/Main.py index a412220e..02b7d032 100644 --- a/Main.py +++ b/Main.py @@ -34,7 +34,7 @@ from source.overworld.EntranceShuffle2 import link_entrances_new from source.tools.BPS import create_bps_from_data from source.classes.CustomSettings import CustomSettings -__version__ = '1.2.0.6-u' +__version__ = '1.2.0.7-u' from source.classes.BabelFish import BabelFish diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 3ee20968..597cdc2f 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -108,6 +108,12 @@ These are now independent of retro mode and have three options: None, Random, an * Bonk Fairy (Dark) # Bug Fixes and Notes +* 1.2.0.7-u + * Fix for some misery mire key logic + * Minor standard generation fix + * Fix for inactive flute start + * Settingsfile for multiworld generation support + * Fix for duped HC/AT Maps/Compasses * 1.2.0.6-u * Fix for light cone in Escape when entering from Dark World post-zelda * Fix for light cone in Escape when lighting a torch with fire rod diff --git a/source/overworld/EntranceShuffle2.py b/source/overworld/EntranceShuffle2.py index e6c5a13a..a364530c 100644 --- a/source/overworld/EntranceShuffle2.py +++ b/source/overworld/EntranceShuffle2.py @@ -632,7 +632,7 @@ def do_fixed_shuffle(avail, entrance_list): rules = Restrictions() rules.size = size if ('Hyrule Castle Entrance (South)' in entrances and - avail.world.doorShuffle[avail.player] in ['basic', 'crossed']): + avail.world.doorShuffle[avail.player] != 'vanilla'): rules.must_exit_to_lw = True if 'Inverted Ganons Tower' in entrances and not avail.world.shuffle_ganon: rules.fixed = True