Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HK: Removes Vanilla Items from ItemPool and Uses Grimmchild1 when relevant #2898

Merged
merged 7 commits into from
Mar 13, 2024
1 change: 1 addition & 0 deletions worlds/hk/Items.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ class HKItemData(NamedTuple):
"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"],
Expand Down
6 changes: 5 additions & 1 deletion worlds/hk/Options.py
Original file line number Diff line number Diff line change
Expand Up @@ -406,6 +406,10 @@ class ExtraPlatforms(DefaultOnToggle):
"""Places additional platforms to make traveling throughout Hallownest more convenient."""


class SharedItems(Toggle):
"""Places all Vanilla items as AP Items so they can be shared within one slot. This will inflate hint prices."""
qwint marked this conversation as resolved.
Show resolved Hide resolved


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.

Expand Down Expand Up @@ -488,7 +492,7 @@ class CostSanityHybridChance(Range):
**{
option.__name__: option
for option in (
StartLocation, Goal, WhitePalace, ExtraPlatforms, StartingGeo,
StartLocation, Goal, WhitePalace, ExtraPlatforms, SharedItems, StartingGeo,
DeathLink, DeathLinkShade, DeathLinkBreaksFragileCharms,
MinimumGeoPrice, MaximumGeoPrice,
MinimumGrubPrice, MaximumGrubPrice,
Expand Down
37 changes: 26 additions & 11 deletions worlds/hk/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,7 @@ def create_items(self):
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.
"""
Expand All @@ -252,7 +252,7 @@ def _add(item_name: str, location_name: str):
if item_name in junk_replace:
item_name = self.get_filler_item_name()

item = self.create_item(item_name)
qwint marked this conversation as resolved.
Show resolved Hide resolved
item = self.create_item(item_name) if not vanilla or location_name == "Start" or self.multiworld.SharedItems[self.player] else self.create_event(item_name)

if location_name == "Start":
if item_name in randomized_starting_items:
Expand All @@ -277,30 +277,35 @@ def _add(item_name: str, location_name: str):

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.SharedItems[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):
Expand Down Expand Up @@ -475,6 +480,10 @@ def create_item(self, name: str) -> HKItem:
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
Expand All @@ -493,9 +502,15 @@ def create_location(self, name: str, vanilla=False) -> HKLocation:
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.SharedItems[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)
Expand Down
Loading