From 72e6383cc799affce623290d3764fe7e2e2f6bb8 Mon Sep 17 00:00:00 2001 From: qwint Date: Wed, 13 Mar 2024 06:45:43 -0500 Subject: [PATCH] HK: Removes Vanilla Items from ItemPool and Uses Grimmchild1 when relevant (#2898) --- worlds/hk/Items.py | 1 + worlds/hk/Options.py | 11 ++++++++++- worlds/hk/__init__.py | 37 ++++++++++++++++++++++++++----------- 3 files changed, 37 insertions(+), 12 deletions(-) diff --git a/worlds/hk/Items.py b/worlds/hk/Items.py index def5c329..72878dfc 100644 --- a/worlds/hk/Items.py +++ b/worlds/hk/Items.py @@ -35,6 +35,7 @@ item_name_groups = ({ "GeoChests": lookup_type_to_names["Geo"], "GeoRocks": lookup_type_to_names["Rock"], "GrimmkinFlames": lookup_type_to_names["Flame"], + "Grimmchild": {"Grimmchild1", "Grimmchild2"}, "Grubs": lookup_type_to_names["Grub"], "JournalEntries": lookup_type_to_names["Journal"], "JunkPitChests": lookup_type_to_names["JunkPitChest"], diff --git a/worlds/hk/Options.py b/worlds/hk/Options.py index ef7fbd0d..21e8c179 100644 --- a/worlds/hk/Options.py +++ b/worlds/hk/Options.py @@ -406,6 +406,15 @@ class ExtraPlatforms(DefaultOnToggle): """Places additional platforms to make traveling throughout Hallownest more convenient.""" +class AddUnshuffledLocations(Toggle): + """Adds non-randomized locations to the location pool, which allows syncing + of location state with co-op or automatic collection via collect. + + Note: This will increase the number of location checks required to purchase + hints to the total maximum. + """ + + class DeathLinkShade(Choice): """Sets whether to create a shade when you are killed by a DeathLink and how to handle your existing shade, if any. @@ -488,7 +497,7 @@ hollow_knight_options: typing.Dict[str, type(Option)] = { **{ option.__name__: option for option in ( - StartLocation, Goal, WhitePalace, ExtraPlatforms, StartingGeo, + StartLocation, Goal, WhitePalace, ExtraPlatforms, AddUnshuffledLocations, StartingGeo, DeathLink, DeathLinkShade, DeathLinkBreaksFragileCharms, MinimumGeoPrice, MaximumGeoPrice, MinimumGrubPrice, MaximumGrubPrice, diff --git a/worlds/hk/__init__.py b/worlds/hk/__init__.py index 8b07b34e..25337598 100644 --- a/worlds/hk/__init__.py +++ b/worlds/hk/__init__.py @@ -234,7 +234,7 @@ class HKWorld(World): randomized_starting_items.update(items) # noinspection PyShadowingNames - def _add(item_name: str, location_name: str): + def _add(item_name: str, location_name: str, randomized: bool): """ Adds a pairing of an item and location, doing appropriate checks to see if it should be vanilla or not. """ @@ -252,7 +252,7 @@ class HKWorld(World): if item_name in junk_replace: item_name = self.get_filler_item_name() - item = self.create_item(item_name) + item = self.create_item(item_name) if not vanilla or location_name == "Start" or self.multiworld.AddUnshuffledLocations[self.player] else self.create_event(item_name) if location_name == "Start": if item_name in randomized_starting_items: @@ -277,30 +277,35 @@ class HKWorld(World): for option_key, option in hollow_knight_randomize_options.items(): randomized = getattr(self.multiworld, option_key)[self.player] + if all([not randomized, option_key in logicless_options, not self.multiworld.AddUnshuffledLocations[self.player]]): + continue for item_name, location_name in zip(option.items, option.locations): if item_name in junk_replace: item_name = self.get_filler_item_name() if (item_name == "Crystal_Heart" and self.multiworld.SplitCrystalHeart[self.player]) or \ (item_name == "Mothwing_Cloak" and self.multiworld.SplitMothwingCloak[self.player]): - _add("Left_" + item_name, location_name) - _add("Right_" + item_name, "Split_" + location_name) + _add("Left_" + item_name, location_name, randomized) + _add("Right_" + item_name, "Split_" + location_name, randomized) continue if item_name == "Mantis_Claw" and self.multiworld.SplitMantisClaw[self.player]: - _add("Left_" + item_name, "Left_" + location_name) - _add("Right_" + item_name, "Right_" + location_name) + _add("Left_" + item_name, "Left_" + location_name, randomized) + _add("Right_" + item_name, "Right_" + location_name, randomized) continue if item_name == "Shade_Cloak" and self.multiworld.SplitMothwingCloak[self.player]: if self.multiworld.random.randint(0, 1): item_name = "Left_Mothwing_Cloak" else: item_name = "Right_Mothwing_Cloak" + if item_name == "Grimmchild2" and self.multiworld.RandomizeGrimmkinFlames[self.player] and self.multiworld.RandomizeCharms[self.player]: + _add("Grimmchild1", location_name, randomized) + continue - _add(item_name, location_name) + _add(item_name, location_name, randomized) if self.multiworld.RandomizeElevatorPass[self.player]: randomized = True - _add("Elevator_Pass", "Elevator_Pass") + _add("Elevator_Pass", "Elevator_Pass", randomized) for shop, locations in self.created_multi_locations.items(): for _ in range(len(locations), getattr(self.multiworld, shop_to_option[shop])[self.player].value): @@ -475,6 +480,10 @@ class HKWorld(World): item_data = item_table[name] return HKItem(name, item_data.advancement, item_data.id, item_data.type, self.player) + def create_event(self, name: str) -> HKItem: + item_data = item_table[name] + return HKItem(name, item_data.advancement, None, item_data.type, self.player) + def create_location(self, name: str, vanilla=False) -> HKLocation: costs = None basename = name @@ -493,9 +502,15 @@ class HKWorld(World): name = f"{name}_{i}" region = self.multiworld.get_region("Menu", self.player) - loc = HKLocation(self.player, name, - self.location_name_to_id[name], region, costs=costs, vanilla=vanilla, - basename=basename) + + if vanilla and not self.multiworld.AddUnshuffledLocations[self.player]: + loc = HKLocation(self.player, name, + None, region, costs=costs, vanilla=vanilla, + basename=basename) + else: + loc = HKLocation(self.player, name, + self.location_name_to_id[name], region, costs=costs, vanilla=vanilla, + basename=basename) if multi is not None: multi.append(loc)