(for now) only collect ER hint info for LttP

Optimize Entrance
This commit is contained in:
Fabian Dill 2021-07-16 12:23:05 +02:00
parent 3460c9f714
commit 20b173453d
4 changed files with 14 additions and 26 deletions

View File

@ -934,7 +934,6 @@ class Region(object):
self.is_dark_world = False
self.spot_type = 'Region'
self.hint_text = hint
self.recursion_count = 0
self.player = player
def can_reach(self, state: CollectionState):
@ -966,6 +965,7 @@ class Region(object):
class Entrance(object):
spot_type = 'Entrance'
def __init__(self, player: int, name: str = '', parent=None):
self.name = name
@ -973,9 +973,6 @@ class Entrance(object):
self.connected_region = None
self.target = None
self.addresses = None
self.spot_type = 'Entrance'
self.recursion_count = 0
self.vanilla = None
self.access_rule = lambda state: True
self.player = player
self.hide_path = False
@ -988,11 +985,10 @@ class Entrance(object):
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.target = target
self.addresses = addresses
self.vanilla = vanilla
region.entrances.append(self)
def __repr__(self):

View File

@ -410,13 +410,13 @@ def main(args, seed=None):
def get_entrance_to_region(region: Region):
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
for entrance in region.entrances: # BFS might be better here, trying DFS for now.
return get_entrance_to_region(entrance.parent_region)
# 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]}
from worlds.alttp.Regions import RegionType
for region in world.regions:

View File

@ -24,11 +24,11 @@ class AutoWorldRegister(type):
class AutoLogicRegister(type):
def __new__(cls, name, bases, dct):
new_class = super().__new__(cls, name, bases, dct)
for function_name, function in dct.items():
if hasattr(function, "__call__"): # callable
if hasattr(CollectionState, function_name):
raise Exception(f"Name conflict on Logic Mixin {name} trying to overwrite {function_name}")
setattr(CollectionState, function_name, function)
for item_name, function in dct.items():
if not item_name.startswith("__"):
if hasattr(CollectionState, item_name):
raise Exception(f"Name conflict on Logic Mixin {name} trying to overwrite {item_name}")
setattr(CollectionState, item_name, function)
return new_class
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"""
raise NotImplementedError
# any methods attached to this can be used as part of CollectionState,
# please use a prefix as all of them get clobbered together
class LogicMixin(metaclass=AutoLogicRegister):
pass
pass

View File

@ -23,7 +23,6 @@ class MinecraftWorld(World):
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()}
def _get_mc_data(self):
exits = ["Overworld Structure 1", "Overworld Structure 2", "Nether Structure 1", "Nether Structure 2",
"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}
}
def generate_basic(self):
# Generate item pool
@ -61,21 +59,17 @@ class MinecraftWorld(World):
completion = self.create_item("Victory")
self.world.get_location("Ender Dragon", self.player).place_locked_item(completion)
itempool.remove(completion)
self.world.itempool += itempool
def set_rules(self):
set_rules(self.world, self.player)
def create_regions(self):
def MCRegion(region_name: str, exits=[]):
ret = Region(region_name, None, region_name, self.player)
ret.world = self.world
ret.locations = [ MinecraftAdvancement(self.player, loc_name, loc_data.id, ret)
ret = Region(region_name, None, region_name, self.player, self.world)
ret.locations = [MinecraftAdvancement(self.player, loc_name, loc_data.id, ret)
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:
ret.exits.append(Entrance(self.player, exit, ret))
return ret
@ -83,7 +77,6 @@ class MinecraftWorld(World):
self.world.regions += [MCRegion(*r) for r in mc_regions]
link_minecraft_structures(self.world, self.player)
def generate_output(self):
import json
from base64 import b64encode
@ -94,7 +87,6 @@ class MinecraftWorld(World):
with open(output_path(filename), 'wb') as f:
f.write(b64encode(bytes(json.dumps(data), 'utf-8')))
def fill_slot_data(self):
slot_data = self._get_mc_data()
for option_name in minecraft_options:
@ -102,7 +94,6 @@ class MinecraftWorld(World):
slot_data[option_name] = int(option.value)
return slot_data
def create_item(self, name: str) -> Item:
item_data = item_table[name]
return MinecraftItem(name, item_data.progression, item_data.code, self.player)