(for now) only collect ER hint info for LttP
Optimize Entrance
This commit is contained in:
parent
3460c9f714
commit
20b173453d
|
@ -934,7 +934,6 @@ class Region(object):
|
||||||
self.is_dark_world = False
|
self.is_dark_world = False
|
||||||
self.spot_type = 'Region'
|
self.spot_type = 'Region'
|
||||||
self.hint_text = hint
|
self.hint_text = hint
|
||||||
self.recursion_count = 0
|
|
||||||
self.player = player
|
self.player = player
|
||||||
|
|
||||||
def can_reach(self, state: CollectionState):
|
def can_reach(self, state: CollectionState):
|
||||||
|
@ -966,6 +965,7 @@ class Region(object):
|
||||||
|
|
||||||
|
|
||||||
class Entrance(object):
|
class Entrance(object):
|
||||||
|
spot_type = 'Entrance'
|
||||||
|
|
||||||
def __init__(self, player: int, name: str = '', parent=None):
|
def __init__(self, player: int, name: str = '', parent=None):
|
||||||
self.name = name
|
self.name = name
|
||||||
|
@ -973,9 +973,6 @@ class Entrance(object):
|
||||||
self.connected_region = None
|
self.connected_region = None
|
||||||
self.target = None
|
self.target = None
|
||||||
self.addresses = None
|
self.addresses = None
|
||||||
self.spot_type = 'Entrance'
|
|
||||||
self.recursion_count = 0
|
|
||||||
self.vanilla = None
|
|
||||||
self.access_rule = lambda state: True
|
self.access_rule = lambda state: True
|
||||||
self.player = player
|
self.player = player
|
||||||
self.hide_path = False
|
self.hide_path = False
|
||||||
|
@ -988,11 +985,10 @@ class Entrance(object):
|
||||||
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def connect(self, region, addresses=None, target=None, vanilla=None):
|
def connect(self, region, addresses=None, target=None):
|
||||||
self.connected_region = region
|
self.connected_region = region
|
||||||
self.target = target
|
self.target = target
|
||||||
self.addresses = addresses
|
self.addresses = addresses
|
||||||
self.vanilla = vanilla
|
|
||||||
region.entrances.append(self)
|
region.entrances.append(self)
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
|
|
4
Main.py
4
Main.py
|
@ -410,13 +410,13 @@ def main(args, seed=None):
|
||||||
|
|
||||||
def get_entrance_to_region(region: Region):
|
def get_entrance_to_region(region: Region):
|
||||||
for entrance in region.entrances:
|
for entrance in region.entrances:
|
||||||
if entrance.parent_region.type in (RegionType.DarkWorld, RegionType.LightWorld):
|
if entrance.parent_region.type in (RegionType.DarkWorld, RegionType.LightWorld, RegionType.Generic):
|
||||||
return entrance
|
return entrance
|
||||||
for entrance in region.entrances: # BFS might be better here, trying DFS for now.
|
for entrance in region.entrances: # BFS might be better here, trying DFS for now.
|
||||||
return get_entrance_to_region(entrance.parent_region)
|
return get_entrance_to_region(entrance.parent_region)
|
||||||
|
|
||||||
# collect ER hint info
|
# collect ER hint info
|
||||||
er_hint_data = {player: {} for player in range(1, world.players + 1) if
|
er_hint_data = {player: {} for player in world.alttp_player_ids if
|
||||||
world.shuffle[player] != "vanilla" or world.retro[player]}
|
world.shuffle[player] != "vanilla" or world.retro[player]}
|
||||||
from worlds.alttp.Regions import RegionType
|
from worlds.alttp.Regions import RegionType
|
||||||
for region in world.regions:
|
for region in world.regions:
|
||||||
|
|
|
@ -24,11 +24,11 @@ class AutoWorldRegister(type):
|
||||||
class AutoLogicRegister(type):
|
class AutoLogicRegister(type):
|
||||||
def __new__(cls, name, bases, dct):
|
def __new__(cls, name, bases, dct):
|
||||||
new_class = super().__new__(cls, name, bases, dct)
|
new_class = super().__new__(cls, name, bases, dct)
|
||||||
for function_name, function in dct.items():
|
for item_name, function in dct.items():
|
||||||
if hasattr(function, "__call__"): # callable
|
if not item_name.startswith("__"):
|
||||||
if hasattr(CollectionState, function_name):
|
if hasattr(CollectionState, item_name):
|
||||||
raise Exception(f"Name conflict on Logic Mixin {name} trying to overwrite {function_name}")
|
raise Exception(f"Name conflict on Logic Mixin {name} trying to overwrite {item_name}")
|
||||||
setattr(CollectionState, function_name, function)
|
setattr(CollectionState, item_name, function)
|
||||||
return new_class
|
return new_class
|
||||||
|
|
||||||
def call_single(world: MultiWorld, method_name: str, player: int):
|
def call_single(world: MultiWorld, method_name: str, player: int):
|
||||||
|
@ -115,7 +115,8 @@ class World(metaclass=AutoWorldRegister):
|
||||||
Warning: this may be called with self.world = None, for example by MultiServer"""
|
Warning: this may be called with self.world = None, for example by MultiServer"""
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
|
||||||
|
|
||||||
# any methods attached to this can be used as part of CollectionState,
|
# any methods attached to this can be used as part of CollectionState,
|
||||||
# please use a prefix as all of them get clobbered together
|
# please use a prefix as all of them get clobbered together
|
||||||
class LogicMixin(metaclass=AutoLogicRegister):
|
class LogicMixin(metaclass=AutoLogicRegister):
|
||||||
pass
|
pass
|
||||||
|
|
|
@ -23,7 +23,6 @@ class MinecraftWorld(World):
|
||||||
item_name_to_id = {name: data.code for name, data in item_table.items()}
|
item_name_to_id = {name: data.code for name, data in item_table.items()}
|
||||||
location_name_to_id = {name: data.id for name, data in advancement_table.items()}
|
location_name_to_id = {name: data.id for name, data in advancement_table.items()}
|
||||||
|
|
||||||
|
|
||||||
def _get_mc_data(self):
|
def _get_mc_data(self):
|
||||||
exits = ["Overworld Structure 1", "Overworld Structure 2", "Nether Structure 1", "Nether Structure 2",
|
exits = ["Overworld Structure 1", "Overworld Structure 2", "Nether Structure 1", "Nether Structure 2",
|
||||||
"The End Structure"]
|
"The End Structure"]
|
||||||
|
@ -37,7 +36,6 @@ class MinecraftWorld(World):
|
||||||
'structures': {exit: self.world.get_entrance(exit, self.player).connected_region.name for exit in exits}
|
'structures': {exit: self.world.get_entrance(exit, self.player).connected_region.name for exit in exits}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def generate_basic(self):
|
def generate_basic(self):
|
||||||
|
|
||||||
# Generate item pool
|
# Generate item pool
|
||||||
|
@ -61,21 +59,17 @@ class MinecraftWorld(World):
|
||||||
completion = self.create_item("Victory")
|
completion = self.create_item("Victory")
|
||||||
self.world.get_location("Ender Dragon", self.player).place_locked_item(completion)
|
self.world.get_location("Ender Dragon", self.player).place_locked_item(completion)
|
||||||
itempool.remove(completion)
|
itempool.remove(completion)
|
||||||
|
|
||||||
self.world.itempool += itempool
|
self.world.itempool += itempool
|
||||||
|
|
||||||
|
|
||||||
def set_rules(self):
|
def set_rules(self):
|
||||||
set_rules(self.world, self.player)
|
set_rules(self.world, self.player)
|
||||||
|
|
||||||
|
|
||||||
def create_regions(self):
|
def create_regions(self):
|
||||||
def MCRegion(region_name: str, exits=[]):
|
def MCRegion(region_name: str, exits=[]):
|
||||||
ret = Region(region_name, None, region_name, self.player)
|
ret = Region(region_name, None, region_name, self.player, self.world)
|
||||||
ret.world = self.world
|
ret.locations = [MinecraftAdvancement(self.player, loc_name, loc_data.id, ret)
|
||||||
ret.locations = [ MinecraftAdvancement(self.player, loc_name, loc_data.id, ret)
|
|
||||||
for loc_name, loc_data in advancement_table.items()
|
for loc_name, loc_data in advancement_table.items()
|
||||||
if loc_data.region == region_name ]
|
if loc_data.region == region_name]
|
||||||
for exit in exits:
|
for exit in exits:
|
||||||
ret.exits.append(Entrance(self.player, exit, ret))
|
ret.exits.append(Entrance(self.player, exit, ret))
|
||||||
return ret
|
return ret
|
||||||
|
@ -83,7 +77,6 @@ class MinecraftWorld(World):
|
||||||
self.world.regions += [MCRegion(*r) for r in mc_regions]
|
self.world.regions += [MCRegion(*r) for r in mc_regions]
|
||||||
link_minecraft_structures(self.world, self.player)
|
link_minecraft_structures(self.world, self.player)
|
||||||
|
|
||||||
|
|
||||||
def generate_output(self):
|
def generate_output(self):
|
||||||
import json
|
import json
|
||||||
from base64 import b64encode
|
from base64 import b64encode
|
||||||
|
@ -94,7 +87,6 @@ class MinecraftWorld(World):
|
||||||
with open(output_path(filename), 'wb') as f:
|
with open(output_path(filename), 'wb') as f:
|
||||||
f.write(b64encode(bytes(json.dumps(data), 'utf-8')))
|
f.write(b64encode(bytes(json.dumps(data), 'utf-8')))
|
||||||
|
|
||||||
|
|
||||||
def fill_slot_data(self):
|
def fill_slot_data(self):
|
||||||
slot_data = self._get_mc_data()
|
slot_data = self._get_mc_data()
|
||||||
for option_name in minecraft_options:
|
for option_name in minecraft_options:
|
||||||
|
@ -102,7 +94,6 @@ class MinecraftWorld(World):
|
||||||
slot_data[option_name] = int(option.value)
|
slot_data[option_name] = int(option.value)
|
||||||
return slot_data
|
return slot_data
|
||||||
|
|
||||||
|
|
||||||
def create_item(self, name: str) -> Item:
|
def create_item(self, name: str) -> Item:
|
||||||
item_data = item_table[name]
|
item_data = item_table[name]
|
||||||
return MinecraftItem(name, item_data.progression, item_data.code, self.player)
|
return MinecraftItem(name, item_data.progression, item_data.code, self.player)
|
||||||
|
|
Loading…
Reference in New Issue