add AutoWorld.generate_early, optimize Location
This commit is contained in:
parent
3d67e1dbdb
commit
01f0f309d1
|
@ -139,7 +139,6 @@ class MultiWorld():
|
||||||
self.custom_data = {}
|
self.custom_data = {}
|
||||||
self.worlds = {}
|
self.worlds = {}
|
||||||
|
|
||||||
|
|
||||||
def set_options(self, args):
|
def set_options(self, args):
|
||||||
from worlds import AutoWorld
|
from worlds import AutoWorld
|
||||||
for player in self.player_ids:
|
for player in self.player_ids:
|
||||||
|
@ -564,6 +563,12 @@ class CollectionState(object):
|
||||||
def has(self, item, player: int, count: int = 1):
|
def has(self, item, player: int, count: int = 1):
|
||||||
return self.prog_items[item, player] >= count
|
return self.prog_items[item, player] >= count
|
||||||
|
|
||||||
|
def has_all(self, items: Set[str], player:int):
|
||||||
|
return all(self.prog_items[item, player] for item in items)
|
||||||
|
|
||||||
|
def has_any(self, items: Set[str], player:int):
|
||||||
|
return any(self.prog_items[item, player] for item in items)
|
||||||
|
|
||||||
def has_essence(self, player: int, count: int):
|
def has_essence(self, player: int, count: int):
|
||||||
return self.prog_items["Dream_Nail", player]
|
return self.prog_items["Dream_Nail", player]
|
||||||
# return self.prog_items["Essence", player] >= count
|
# return self.prog_items["Essence", player] >= count
|
||||||
|
@ -927,7 +932,8 @@ class CollectionState(object):
|
||||||
self.stale[item.player] = True
|
self.stale[item.player] = True
|
||||||
|
|
||||||
@unique
|
@unique
|
||||||
class RegionType(Enum):
|
class RegionType(int, Enum):
|
||||||
|
Generic = 0
|
||||||
LightWorld = 1
|
LightWorld = 1
|
||||||
DarkWorld = 2
|
DarkWorld = 2
|
||||||
Cave = 3 # Also includes Houses
|
Cave = 3 # Also includes Houses
|
||||||
|
@ -941,7 +947,7 @@ class RegionType(Enum):
|
||||||
|
|
||||||
class Region(object):
|
class Region(object):
|
||||||
|
|
||||||
def __init__(self, name: str, type, hint, player: int):
|
def __init__(self, name: str, type, hint, player: int, world: Optional[MultiWorld] = None):
|
||||||
self.name = name
|
self.name = name
|
||||||
self.type = type
|
self.type = type
|
||||||
self.entrances = []
|
self.entrances = []
|
||||||
|
@ -949,7 +955,7 @@ class Region(object):
|
||||||
self.locations = []
|
self.locations = []
|
||||||
self.dungeon = None
|
self.dungeon = None
|
||||||
self.shop = None
|
self.shop = None
|
||||||
self.world = None
|
self.world = world
|
||||||
self.is_light_world = False # will be set after making connections.
|
self.is_light_world = False # will be set after making connections.
|
||||||
self.is_dark_world = False
|
self.is_dark_world = False
|
||||||
self.spot_type = 'Region'
|
self.spot_type = 'Region'
|
||||||
|
@ -957,7 +963,7 @@ class Region(object):
|
||||||
self.recursion_count = 0
|
self.recursion_count = 0
|
||||||
self.player = player
|
self.player = player
|
||||||
|
|
||||||
def can_reach(self, state):
|
def can_reach(self, state: CollectionState):
|
||||||
if state.stale[self.player]:
|
if state.stale[self.player]:
|
||||||
state.update_reachable_regions(self.player)
|
state.update_reachable_regions(self.player)
|
||||||
return self in state.reachable_regions[self.player]
|
return self in state.reachable_regions[self.player]
|
||||||
|
@ -1085,17 +1091,16 @@ class Location():
|
||||||
spot_type = 'Location'
|
spot_type = 'Location'
|
||||||
game: str = "Generic"
|
game: str = "Generic"
|
||||||
crystal: bool = False
|
crystal: bool = False
|
||||||
|
always_allow = staticmethod(lambda item, state: False)
|
||||||
|
access_rule = staticmethod(lambda state: True)
|
||||||
|
item_rule = staticmethod(lambda item: True)
|
||||||
|
|
||||||
def __init__(self, player: int, name: str = '', address:int = None, parent=None):
|
def __init__(self, player: int, name: str = '', address:int = None, parent=None):
|
||||||
self.name = name
|
self.name: str = name
|
||||||
self.address = address
|
self.address: Optional[int] = address
|
||||||
self.parent_region: Region = parent
|
self.parent_region: Region = parent
|
||||||
self.recursion_count = 0
|
self.player: int = player
|
||||||
self.player = player
|
self.item: Optional[Item] = None
|
||||||
self.item = None
|
|
||||||
self.always_allow = lambda item, state: False
|
|
||||||
self.access_rule = lambda state: True
|
|
||||||
self.item_rule = lambda item: True
|
|
||||||
|
|
||||||
def can_fill(self, state: CollectionState, item: Item, check_access=True) -> bool:
|
def can_fill(self, state: CollectionState, item: Item, check_access=True) -> bool:
|
||||||
return self.always_allow(state, item) or (self.parent_region.can_fill(item) and self.item_rule(item) and (not check_access or self.can_reach(state)))
|
return self.always_allow(state, item) or (self.parent_region.can_fill(item) and self.item_rule(item) and (not check_access or self.can_reach(state)))
|
||||||
|
|
4
Main.py
4
Main.py
|
@ -122,9 +122,11 @@ def main(args, seed=None):
|
||||||
world.set_options(args)
|
world.set_options(args)
|
||||||
world.glitch_triforce = args.glitch_triforce # This is enabled/disabled globally, no per player option.
|
world.glitch_triforce = args.glitch_triforce # This is enabled/disabled globally, no per player option.
|
||||||
|
|
||||||
world.slot_seeds = {player: random.Random(world.random.randint(0, 999999999)) 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
|
# system for sharing ER layouts
|
||||||
for player in world.alttp_player_ids:
|
for player in world.alttp_player_ids:
|
||||||
world.er_seeds[player] = str(world.random.randint(0, 2 ** 64))
|
world.er_seeds[player] = str(world.random.randint(0, 2 ** 64))
|
||||||
|
|
|
@ -69,6 +69,9 @@ class World(metaclass=AutoWorldRegister):
|
||||||
self.player = player
|
self.player = player
|
||||||
|
|
||||||
# overwritable methods that get called by Main.py, sorted by execution order
|
# overwritable methods that get called by Main.py, sorted by execution order
|
||||||
|
def generate_early(self):
|
||||||
|
pass
|
||||||
|
|
||||||
def create_regions(self):
|
def create_regions(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
|
@ -44,11 +44,10 @@ class Factorio(World):
|
||||||
|
|
||||||
def create_regions(self):
|
def create_regions(self):
|
||||||
player = self.player
|
player = self.player
|
||||||
menu = Region("Menu", None, "Menu", player)
|
menu = Region("Menu", None, "Menu", player, self.world)
|
||||||
crash = Entrance(player, "Crash Land", menu)
|
crash = Entrance(player, "Crash Land", menu)
|
||||||
menu.exits.append(crash)
|
menu.exits.append(crash)
|
||||||
nauvis = Region("Nauvis", None, "Nauvis", player)
|
nauvis = Region("Nauvis", None, "Nauvis", player, self.world)
|
||||||
nauvis.world = menu.world = self.world
|
|
||||||
|
|
||||||
for tech_name, tech_id in base_tech_table.items():
|
for tech_name, tech_id in base_tech_table.items():
|
||||||
tech = Location(player, tech_name, tech_id, nauvis)
|
tech = Location(player, tech_name, tech_id, nauvis)
|
||||||
|
|
|
@ -14,7 +14,7 @@ def link_minecraft_structures(world, player):
|
||||||
assert len(exits) == len(structs)
|
assert len(exits) == len(structs)
|
||||||
except AssertionError as e: # this should never happen
|
except AssertionError as e: # this should never happen
|
||||||
raise Exception(f"Could not obtain equal numbers of Minecraft exits and structures for player {player} ({world.player_names[player]})")
|
raise Exception(f"Could not obtain equal numbers of Minecraft exits and structures for player {player} ({world.player_names[player]})")
|
||||||
num_regions = len(exits)
|
|
||||||
pairs = {}
|
pairs = {}
|
||||||
|
|
||||||
def set_pair(exit, struct):
|
def set_pair(exit, struct):
|
||||||
|
|
Loading…
Reference in New Issue