From c7417623e60b3672b464dd4a2cbfe1bea6995051 Mon Sep 17 00:00:00 2001 From: espeon65536 Date: Sat, 26 Jun 2021 11:18:12 -0500 Subject: [PATCH] Converted Hollow Knight to AutoWorld system --- Main.py | 13 +---- worlds/hk/__init__.py | 124 ++++++++++++++++++++++++------------------ 2 files changed, 72 insertions(+), 65 deletions(-) diff --git a/Main.py b/Main.py index acdabdc8..20a7b055 100644 --- a/Main.py +++ b/Main.py @@ -21,8 +21,6 @@ from Fill import distribute_items_restrictive, flood_items, balance_multiworld_p from worlds.alttp.Shops import create_shops, ShopSlotFill, SHOP_ID_START, total_shop_slots, FillDisabledShopSlots from worlds.alttp.ItemPool import generate_itempool, difficulties, fill_prizes from Utils import output_path, parse_player_names, get_options, __version__, version_tuple -from worlds.hk import gen_hollow -from worlds.hk import create_regions as hk_create_regions from worlds.minecraft import gen_minecraft, fill_minecraft_slot_data, generate_mc_data from worlds.minecraft.Regions import minecraft_create_regions from worlds.generic.Rules import locality_rules @@ -196,9 +194,6 @@ def main(args, seed=None): world.non_local_items[player] -= item_name_groups['Pendants'] world.non_local_items[player] -= item_name_groups['Crystals'] - for player in world.hk_player_ids: - hk_create_regions(world, player) - AutoWorld.call_all(world, "create_regions") for player in world.minecraft_player_ids: @@ -263,9 +258,6 @@ def main(args, seed=None): for player in world.alttp_player_ids: set_rules(world, player) - for player in world.hk_player_ids: - gen_hollow(world, player) - AutoWorld.call_all(world, "generate_basic") for player in world.minecraft_player_ids: @@ -517,10 +509,7 @@ def main(args, seed=None): connect_names[name] = (i, player) if world.hk_player_ids: for slot in world.hk_player_ids: - slots_data = slot_data[slot] = {} - for option_name in world.worlds[slot].options: - option = getattr(world, option_name)[slot] - slots_data[option_name] = int(option.value) + slot_data[slot] = AutoWorld.call_single(world, "fill_slot_data", slot) for slot in world.minecraft_player_ids: slot_data[slot] = fill_minecraft_slot_data(world, slot) diff --git a/worlds/hk/__init__.py b/worlds/hk/__init__.py index 12bc6448..db764a08 100644 --- a/worlds/hk/__init__.py +++ b/worlds/hk/__init__.py @@ -6,12 +6,83 @@ from .Locations import lookup_name_to_id from .Items import item_table from .Regions import create_regions from .Rules import set_rules +from .Options import hollow_knight_options from BaseClasses import Region, Entrance, Location, MultiWorld, Item from ..AutoWorld import World class HKWorld(World): game: str = "Hollow Knight" + options = hollow_knight_options + + def generate_basic(self): + # Link regions + self.world.get_entrance('Hollow Nest S&Q', self.player).connect(self.world.get_region('Hollow Nest', self.player)) + + # Generate item pool + pool = [] + for item_name, item_data in item_table.items(): + + item = HKItem(item_name, item_data.advancement, item_data.id, item_data.type, player=self.player) + + if item_data.type == "Event": + event_location = self.world.get_location(item_name, self.player) + self.world.push_item(event_location, item, collect=False) + event_location.event = True + event_location.locked = True + if item.name == "King's_Pass": + self.world.push_precollected(item) + elif item_data.type == "Cursed": + if self.world.CURSED[self.player]: + pool.append(item) + else: + # fill Focus Location with Focus and add it to start inventory as well. + event_location = self.world.get_location(item_name, self.player) + self.world.push_item(event_location, item) + event_location.event = True + event_location.locked = True + + elif item_data.type == "Fake": + pass + elif item_data.type in not_shufflable_types: + location = self.world.get_location(item_name, self.player) + self.world.push_item(location, item, collect=False) + location.event = item.advancement + location.locked = True + else: + target = option_to_type_lookup[item.type] + shuffle_it = getattr(self.world, target) + if shuffle_it[self.player]: + pool.append(item) + else: + location = self.world.get_location(item_name, self.player) + self.world.push_item(location, item, collect=False) + location.event = item.advancement + location.locked = True + logger.debug(f"Placed {item_name} to vanilla for player {self.player}") + + self.world.itempool += pool + + + def set_rules(self): + set_rules(self.world, self.player) + + + def create_regions(self): + create_regions(self.world, self.player) + + + def generate_output(self): + pass # Hollow Knight needs no output files + + + def fill_slot_data(self): + slot_data = {} + for option_name in self.options: + option = getattr(self.world, option_name)[self.player] + slot_data[option_name] = int(option.value) + return slot_data + def create_region(world: MultiWorld, player: int, name: str, locations=None, exits=None): ret = Region(name, None, name, player) @@ -43,16 +114,6 @@ class HKItem(Item): self.type = type -def gen_hollow(world: MultiWorld, player: int): - link_regions(world, player) - gen_items(world, player) - set_rules(world, player) - - -def link_regions(world: MultiWorld, player: int): - world.get_entrance('Hollow Nest S&Q', player).connect(world.get_region('Hollow Nest', player)) - - not_shufflable_types = {"Essence_Boss"} option_to_type_lookup = { @@ -75,49 +136,6 @@ option_to_type_lookup = { "Vessel": "RandomizeVesselFragments", } -def gen_items(world: MultiWorld, player: int): - pool = [] - for item_name, item_data in item_table.items(): - - item = HKItem(item_name, item_data.advancement, item_data.id, item_data.type, player=player) - - if item_data.type == "Event": - event_location = world.get_location(item_name, player) - world.push_item(event_location, item, collect=False) - event_location.event = True - event_location.locked = True - if item.name == "King's_Pass": - world.push_precollected(item) - elif item_data.type == "Cursed": - if world.CURSED[player]: - pool.append(item) - else: - # fill Focus Location with Focus and add it to start inventory as well. - event_location = world.get_location(item_name, player) - world.push_item(event_location, item) - event_location.event = True - event_location.locked = True - - elif item_data.type == "Fake": - pass - elif item_data.type in not_shufflable_types: - location = world.get_location(item_name, player) - world.push_item(location, item, collect=False) - location.event = item.advancement - location.locked = True - else: - target = option_to_type_lookup[item.type] - shuffle_it = getattr(world, target) - if shuffle_it[player]: - pool.append(item) - else: - location = world.get_location(item_name, player) - world.push_item(location, item, collect=False) - location.event = item.advancement - location.locked = True - logger.debug(f"Placed {item_name} to vanilla for player {player}") - - world.itempool += pool