Converted Hollow Knight to AutoWorld system

This commit is contained in:
espeon65536 2021-06-26 11:18:12 -05:00 committed by Fabian Dill
parent 50ed657b0e
commit c7417623e6
2 changed files with 72 additions and 65 deletions

13
Main.py
View File

@ -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.Shops import create_shops, ShopSlotFill, SHOP_ID_START, total_shop_slots, FillDisabledShopSlots
from worlds.alttp.ItemPool import generate_itempool, difficulties, fill_prizes from worlds.alttp.ItemPool import generate_itempool, difficulties, fill_prizes
from Utils import output_path, parse_player_names, get_options, __version__, version_tuple 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 import gen_minecraft, fill_minecraft_slot_data, generate_mc_data
from worlds.minecraft.Regions import minecraft_create_regions from worlds.minecraft.Regions import minecraft_create_regions
from worlds.generic.Rules import locality_rules 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['Pendants']
world.non_local_items[player] -= item_name_groups['Crystals'] 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") AutoWorld.call_all(world, "create_regions")
for player in world.minecraft_player_ids: for player in world.minecraft_player_ids:
@ -263,9 +258,6 @@ def main(args, seed=None):
for player in world.alttp_player_ids: for player in world.alttp_player_ids:
set_rules(world, player) set_rules(world, player)
for player in world.hk_player_ids:
gen_hollow(world, player)
AutoWorld.call_all(world, "generate_basic") AutoWorld.call_all(world, "generate_basic")
for player in world.minecraft_player_ids: for player in world.minecraft_player_ids:
@ -517,10 +509,7 @@ def main(args, seed=None):
connect_names[name] = (i, player) connect_names[name] = (i, player)
if world.hk_player_ids: if world.hk_player_ids:
for slot in world.hk_player_ids: for slot in world.hk_player_ids:
slots_data = slot_data[slot] = {} slot_data[slot] = AutoWorld.call_single(world, "fill_slot_data", slot)
for option_name in world.worlds[slot].options:
option = getattr(world, option_name)[slot]
slots_data[option_name] = int(option.value)
for slot in world.minecraft_player_ids: for slot in world.minecraft_player_ids:
slot_data[slot] = fill_minecraft_slot_data(world, slot) slot_data[slot] = fill_minecraft_slot_data(world, slot)

View File

@ -6,12 +6,83 @@ from .Locations import lookup_name_to_id
from .Items import item_table from .Items import item_table
from .Regions import create_regions from .Regions import create_regions
from .Rules import set_rules from .Rules import set_rules
from .Options import hollow_knight_options
from BaseClasses import Region, Entrance, Location, MultiWorld, Item from BaseClasses import Region, Entrance, Location, MultiWorld, Item
from ..AutoWorld import World from ..AutoWorld import World
class HKWorld(World): class HKWorld(World):
game: str = "Hollow Knight" 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): def create_region(world: MultiWorld, player: int, name: str, locations=None, exits=None):
ret = Region(name, None, name, player) ret = Region(name, None, name, player)
@ -43,16 +114,6 @@ class HKItem(Item):
self.type = type 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"} not_shufflable_types = {"Essence_Boss"}
option_to_type_lookup = { option_to_type_lookup = {
@ -75,49 +136,6 @@ option_to_type_lookup = {
"Vessel": "RandomizeVesselFragments", "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