diff --git a/BaseClasses.py b/BaseClasses.py index 4d054e17..e226c453 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -25,6 +25,7 @@ class World(object): plando_texts: List[Dict[str, str]] plando_items: List[PlandoItem] plando_connections: List[PlandoConnection] + er_seeds: Dict[int, str] def __init__(self, players: int, shuffle, logic, mode, swords, difficulty, item_functionality, timer, progressive, @@ -1338,7 +1339,8 @@ class Spoiler(object): 'shop_shuffle_slots': self.world.shop_shuffle_slots, 'shuffle_prizes': self.world.shuffle_prizes, 'sprite_pool': self.world.sprite_pool, - 'restrict_dungeon_item_on_boss': self.world.restrict_dungeon_item_on_boss + 'restrict_dungeon_item_on_boss': self.world.restrict_dungeon_item_on_boss, + 'er_seeds': self.world.er_seeds } def to_json(self): @@ -1402,6 +1404,8 @@ class Spoiler(object): outfile.write('Item Functionality: %s\n' % self.metadata['item_functionality'][player]) outfile.write('Item Progression: %s\n' % self.metadata['progressive'][player]) outfile.write('Entrance Shuffle: %s\n' % self.metadata['shuffle'][player]) + if self.metadata['shuffle'][player] != "vanilla": + outfile.write('Entrance Shuffle Seed %s\n' % self.metadata['er_seeds'][player]) outfile.write('Crystals required for GT: %s\n' % self.metadata['gt_crystals'][player]) outfile.write('Crystals required for Ganon: %s\n' % self.metadata['ganon_crystals'][player]) outfile.write('Pyramid hole pre-opened: %s\n' % ( diff --git a/EntranceRandomizer.py b/EntranceRandomizer.py index 022bd96d..c894d0a0 100755 --- a/EntranceRandomizer.py +++ b/EntranceRandomizer.py @@ -378,6 +378,7 @@ def parse_arguments(argv, no_defaults=False): ret.plando_items = [] ret.plando_texts = {} ret.plando_connections = [] + ret.er_seeds = {} ret.glitch_boots = not ret.disable_glitch_boots if ret.timer == "none": @@ -408,7 +409,7 @@ def parse_arguments(argv, no_defaults=False): 'heartbeep', "skip_progression_balancing", "triforce_pieces_available", "triforce_pieces_required", "shop_shuffle", "shop_shuffle_slots", "required_medallions", - "plando_items", "plando_texts", "plando_connections", + "plando_items", "plando_texts", "plando_connections", "er_seeds", 'remote_items', 'progressive', 'dungeon_counters', 'glitch_boots', 'killable_thieves', 'tile_shuffle', 'bush_shuffle', 'shuffle_prizes', 'sprite_pool', 'dark_room_logic', 'restrict_dungeon_item_on_boss', 'reduceflashing', diff --git a/Main.py b/Main.py index 1f1f0c2a..284367f9 100644 --- a/Main.py +++ b/Main.py @@ -92,11 +92,20 @@ def main(args, seed=None): world.plando_items = args.plando_items.copy() world.plando_texts = args.plando_texts.copy() world.plando_connections = args.plando_connections.copy() + 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.rom_seeds = {player: random.Random(world.random.randint(0, 999999999)) for player in range(1, world.players + 1)} + for player in range(1, world.players+1): + world.er_seeds[player] = str(world.random.randint(0, 2 ** 64)) + + if "-" in world.shuffle[player]: + shuffle, seed = world.shuffle[player].split("-") + world.shuffle[player] = shuffle + world.er_seeds[player] = seed + logger.info('ALttP Berserker\'s Multiworld Version %s - Seed: %s\n', __version__, world.seed) parsed_names = parse_player_names(args.names, world.players, args.teams) @@ -170,13 +179,9 @@ def main(args, seed=None): {"vanilla", "dungeonssimple", "dungeonsfull", "simple", "restricted", "full"}: world.fix_fake_world[player] = False - old_random = world.random - # seeded entrance shuffle - if "-" in world.shuffle[player]: - shuffle, seed = world.shuffle[player].split("-") - world.random = random.Random(int(seed)) - world.shuffle[player] = shuffle + old_random = world.random + world.random = random.Random(world.er_seeds[player]) if world.mode[player] != 'inverted': link_entrances(world, player)