From 20b173453d58ebcc18edc0054876b8fcaa9db9df Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Fri, 16 Jul 2021 12:23:05 +0200 Subject: [PATCH] (for now) only collect ER hint info for LttP Optimize Entrance --- BaseClasses.py | 8 ++------ Main.py | 4 ++-- worlds/AutoWorld.py | 13 +++++++------ worlds/minecraft/__init__.py | 15 +++------------ 4 files changed, 14 insertions(+), 26 deletions(-) diff --git a/BaseClasses.py b/BaseClasses.py index fd19d850..b831cd9f 100644 --- a/BaseClasses.py +++ b/BaseClasses.py @@ -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): diff --git a/Main.py b/Main.py index 44f1a6d9..6abbdc37 100644 --- a/Main.py +++ b/Main.py @@ -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: diff --git a/worlds/AutoWorld.py b/worlds/AutoWorld.py index b6d7dad7..16603a29 100644 --- a/worlds/AutoWorld.py +++ b/worlds/AutoWorld.py @@ -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 \ No newline at end of file + pass diff --git a/worlds/minecraft/__init__.py b/worlds/minecraft/__init__.py index 61341bc9..de9f0552 100644 --- a/worlds/minecraft/__init__.py +++ b/worlds/minecraft/__init__.py @@ -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)