LttP: Move difficulties and er seed sharing to generate_early

This commit is contained in:
Fabian Dill 2021-08-28 00:26:02 +02:00
parent 104cc0ea83
commit de4775b0c8
2 changed files with 35 additions and 32 deletions

33
Main.py
View File

@ -15,7 +15,6 @@ from worlds.alttp.Items import item_name_groups
from worlds.alttp.Regions import lookup_vanilla_location_to_entrance from worlds.alttp.Regions import lookup_vanilla_location_to_entrance
from Fill import distribute_items_restrictive, flood_items, balance_multiworld_progression, distribute_planned from Fill import distribute_items_restrictive, flood_items, balance_multiworld_progression, distribute_planned
from worlds.alttp.Shops import ShopSlotFill, SHOP_ID_START, total_shop_slots, FillDisabledShopSlots from worlds.alttp.Shops import ShopSlotFill, SHOP_ID_START, total_shop_slots, FillDisabledShopSlots
from worlds.alttp.ItemPool import difficulties
from Utils import output_path, get_options, __version__, version_tuple from Utils import output_path, get_options, __version__, version_tuple
from worlds.generic.Rules import locality_rules, exclusion_rules from worlds.generic.Rules import locality_rules, exclusion_rules
from worlds import AutoWorld from worlds import AutoWorld
@ -30,15 +29,6 @@ def get_seed(seed=None):
return seed return seed
def get_same_seed(world: MultiWorld, seed_def: tuple) -> str:
seeds: Dict[tuple, str] = getattr(world, "__named_seeds", {})
if seed_def in seeds:
return seeds[seed_def]
seeds[seed_def] = str(world.random.randint(0, 2 ** 64))
world.__named_seeds = seeds
return seeds[seed_def]
def main(args, seed=None): def main(args, seed=None):
if args.outputpath: if args.outputpath:
os.makedirs(args.outputpath, exist_ok=True) os.makedirs(args.outputpath, exist_ok=True)
@ -122,25 +112,6 @@ def main(args, seed=None):
world.slot_seeds = {player: random.Random(world.random.getrandbits(64)) for player in world.slot_seeds = {player: random.Random(world.random.getrandbits(64)) for player in
range(1, world.players + 1)} range(1, world.players + 1)}
AutoWorld.call_all(world, "generate_early")
# system for sharing ER layouts
for player in world.get_game_players("A Link to the Past"):
world.er_seeds[player] = str(world.random.randint(0, 2 ** 64))
if "-" in world.shuffle[player]:
shuffle, seed = world.shuffle[player].split("-", 1)
world.shuffle[player] = shuffle
if shuffle == "vanilla":
world.er_seeds[player] = "vanilla"
elif seed.startswith("group-") or args.race:
world.er_seeds[player] = get_same_seed(world, (
shuffle, seed, world.retro[player], world.mode[player], world.logic[player]))
else: # not a race or group seed, use set seed as is.
world.er_seeds[player] = seed
elif world.shuffle[player] == "vanilla":
world.er_seeds[player] = "vanilla"
logger.info('Archipelago Version %s - Seed: %s\n', __version__, world.seed) logger.info('Archipelago Version %s - Seed: %s\n', __version__, world.seed)
logger.info("Found World Types:") logger.info("Found World Types:")
@ -155,9 +126,9 @@ def main(args, seed=None):
f"Location IDs: {min(cls.location_id_to_name):{numlength}} - " f"Location IDs: {min(cls.location_id_to_name):{numlength}} - "
f"{max(cls.location_id_to_name):{numlength}}") f"{max(cls.location_id_to_name):{numlength}}")
AutoWorld.call_all(world, "generate_early")
logger.info('') logger.info('')
for player in world.get_game_players("A Link to the Past"):
world.difficulty_requirements[player] = difficulties[world.difficulty[player]]
for player in world.player_ids: for player in world.player_ids:
for item_name in args.startinventory[player]: for item_name in args.startinventory[player]:

View File

@ -2,6 +2,7 @@ import random
import logging import logging
import os import os
import threading import threading
import typing
from BaseClasses import Item, CollectionState from BaseClasses import Item, CollectionState
from .SubClasses import ALttPItem from .SubClasses import ALttPItem
@ -10,7 +11,7 @@ from .Options import alttp_options
from .Items import as_dict_item_table, item_name_groups, item_table from .Items import as_dict_item_table, item_name_groups, item_table
from .Regions import lookup_name_to_id, create_regions, mark_light_world_regions from .Regions import lookup_name_to_id, create_regions, mark_light_world_regions
from .Rules import set_rules from .Rules import set_rules
from .ItemPool import generate_itempool from .ItemPool import generate_itempool, difficulties
from .Shops import create_shops from .Shops import create_shops
from .Dungeons import create_dungeons from .Dungeons import create_dungeons
from .Rom import LocalRom, patch_rom, patch_race_rom, patch_enemizer, apply_rom_settings, get_hash_string from .Rom import LocalRom, patch_rom, patch_race_rom, patch_enemizer, apply_rom_settings, get_hash_string
@ -21,6 +22,7 @@ from .EntranceShuffle import link_entrances, link_inverted_entrances, plando_con
lttp_logger = logging.getLogger("A Link to the Past") lttp_logger = logging.getLogger("A Link to the Past")
class ALTTPWorld(World): class ALTTPWorld(World):
game: str = "A Link to the Past" game: str = "A Link to the Past"
options = alttp_options options = alttp_options
@ -38,6 +40,27 @@ class ALTTPWorld(World):
create_items = generate_itempool create_items = generate_itempool
def generate_early(self):
player = self.player
world = self.world
# system for sharing ER layouts
world.er_seeds[player] = str(world.random.randint(0, 2 ** 64))
if "-" in world.shuffle[player]:
shuffle, seed = world.shuffle[player].split("-", 1)
world.shuffle[player] = shuffle
if shuffle == "vanilla":
world.er_seeds[player] = "vanilla"
elif seed.startswith("group-") or world.is_race:
world.er_seeds[player] = get_same_seed(world, (
shuffle, seed, world.retro[player], world.mode[player], world.logic[player]))
else: # not a race or group seed, use set seed as is.
world.er_seeds[player] = seed
elif world.shuffle[player] == "vanilla":
world.er_seeds[player] = "vanilla"
world.difficulty_requirements[player] = difficulties[world.difficulty[player]]
def create_regions(self): def create_regions(self):
self.rom_name_available_event = threading.Event() self.rom_name_available_event = threading.Event()
@ -341,3 +364,12 @@ class ALTTPWorld(World):
world.push_item(spot_to_fill, item_to_place, False) world.push_item(spot_to_fill, item_to_place, False)
fill_locations.remove(spot_to_fill) # very slow, unfortunately fill_locations.remove(spot_to_fill) # very slow, unfortunately
trash_count -= 1 trash_count -= 1
def get_same_seed(world, seed_def: tuple) -> str:
seeds: typing.Dict[tuple, str] = getattr(world, "__named_seeds", {})
if seed_def in seeds:
return seeds[seed_def]
seeds[seed_def] = str(world.random.randint(0, 2 ** 64))
world.__named_seeds = seeds
return seeds[seed_def]