From 5b606e53fcad7f69c7412a1dccf48e57d15ded2a Mon Sep 17 00:00:00 2001 From: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com> Date: Tue, 11 Jul 2023 04:49:40 -0500 Subject: [PATCH] HK: Fix bugs and update setup guide for Scarab+ and XBox Game Pass support (#1955) Fixing three bugs: 1. Made Salubra Charm Shop Slots use the actual options value and not the Iselda Shop Slots value. 2. Made Mask Shards no longer considered Filler but instead Progression so they can actually be used for access requirements that require damage boosts. 3. Fixed goal requirements to account for Focus being required for The Hollow Knight and Sealed Siblings endings and adjusted the Radiance and Any goal requirements accordingly. Updated Setup Guide: Changed to mention Scarab+ instead of Scarab (it is better maintained and has several quality of life improvements and fixes a bug for XBox Game Pass). Added info about how to use Scarab+ with XBox Game Pass. --- worlds/hk/Options.py | 2 +- worlds/hk/__init__.py | 22 ++++++++++++---------- worlds/hk/docs/setup_en.md | 28 +++++++++++++++++++++++----- 3 files changed, 36 insertions(+), 16 deletions(-) diff --git a/worlds/hk/Options.py b/worlds/hk/Options.py index d47ab2c3..2a19ffd3 100644 --- a/worlds/hk/Options.py +++ b/worlds/hk/Options.py @@ -111,7 +111,7 @@ shop_to_option = { "Iselda": "IseldaShopSlots", "Salubra": "SalubraShopSlots", "Leg_Eater": "LegEaterShopSlots", - "Salubra_(Requires_Charms)": "IseldaShopSlots", + "Salubra_(Requires_Charms)": "SalubraCharmShopSlots", "Egg_Shop": "EggShopSlots", } diff --git a/worlds/hk/__init__.py b/worlds/hk/__init__.py index 41602cee..061f71ed 100644 --- a/worlds/hk/__init__.py +++ b/worlds/hk/__init__.py @@ -422,13 +422,15 @@ class HKWorld(World): player = self.player if world.logic[player] != 'nologic': goal = world.Goal[player] - if goal == Goal.option_siblings: + if goal == Goal.option_hollowknight: + world.completion_condition[player] = lambda state: state._hk_can_beat_thk(player) + elif goal == Goal.option_siblings: world.completion_condition[player] = lambda state: state._hk_siblings_ending(player) elif goal == Goal.option_radiance: world.completion_condition[player] = lambda state: state._hk_can_beat_radiance(player) else: - # Hollow Knight or Any goal. - world.completion_condition[player] = lambda state: state._hk_can_beat_thk(player) + # Any goal + world.completion_condition[player] = lambda state: state._hk_can_beat_thk(player) or state._hk_can_beat_radiance(player) set_rules(self) @@ -640,7 +642,7 @@ class HKItem(Item): classification = ItemClassification.progression_skip_balancing elif type in ("Map", "Journal"): classification = ItemClassification.filler - elif type in ("Mask", "Ore", "Vessel"): + elif type in ("Ore", "Vessel"): classification = ItemClassification.useful elif advancement: classification = ItemClassification.progression @@ -674,6 +676,7 @@ class HKLogicMixin(LogicMixin): self.has_any({'LEFTDASH', 'RIGHTDASH'}, player) or self._hk_option(player, 'ProficientCombat') ) + and self.has('FOCUS', player) ) def _hk_siblings_ending(self, player: int) -> bool: @@ -681,16 +684,15 @@ class HKLogicMixin(LogicMixin): def _hk_can_beat_radiance(self, player: int) -> bool: return ( - self._hk_siblings_ending(player) - and self.has('DREAMNAIL', player, 1) + self.has('Opened_Black_Egg_Temple', player) + and self._hk_nail_combat(player) + and self.has('WHITEFRAGMENT', player, 3) + and self.has('DREAMNAIL', player) and ( (self.has('LEFTCLAW', player) and self.has('RIGHTCLAW', player)) or self.has('WINGS', player) ) - and ( - self.count('FIREBALL', player) + self.count('SCREAM', player) - + self.count('QUAKE', player) - ) > 1 + and (self.count('FIREBALL', player) + self.count('SCREAM', player) + self.count('QUAKE', player)) > 1 and ( (self.has('LEFTDASH', player, 2) and self.has('RIGHTDASH', player, 2)) # Both Shade Cloaks or (self._hk_option(player, 'ProficientCombat') and self.has('QUAKE', player)) # or Dive diff --git a/worlds/hk/docs/setup_en.md b/worlds/hk/docs/setup_en.md index 0584af0f..e25e6bc4 100644 --- a/worlds/hk/docs/setup_en.md +++ b/worlds/hk/docs/setup_en.md @@ -1,15 +1,33 @@ # Hollow Knight for Archipelago Setup Guide ## Required Software -* Download and unzip the Scarab Mod Manager from the [Scarab GitHub Releases page](https://github.com/fifty-six/Scarab/releases). -* A legal copy of Hollow Knight, not purchased or played through XBox Game Pass. - * Unfortunately, the Game Pass version is not currently compatible with mods. +* Download and unzip the Scarab+ Mod Manager from the [Scarab+ website](https://themulhima.github.io/Scarab/). +* A legal copy of Hollow Knight. + +## Optional Software +* Archipelago Map Mod from Scarab+ + * Ensure that both RandoMapMod and MapChanger are uninstalled or disabled as they are incompatible with Archipelago Map Mod. ## Installing the Archipelago Mod using Scarab -1. Launch Scarab and ensure it locates your Hollow Knight installation directory. -2. Click the "Install" checkbox near the "Archipelago" mod entry. +1. Launch Scarab+ and ensure it locates your Hollow Knight installation directory. +2. Click the "Install" button near the "Archipelago" mod entry. 3. Launch the game, you're all set! +### What to do if Scarab+ fails to find your XBox Game Pass installation directory +1. Enter the XBox app and move your mouse over "Hollow Knight" on the left sidebar. +2. Click the three points then click "Manage". +3. Go to the "Files" tab and select "Browse...". +4. Click "Hollow Knight", then "Content", then click the path bar and copy it. +5. Run Scarab+ as an administrator and, when it asks you for the path, paste what you copied in step 4. + +#### Alternative Method: +1. Click on your profile then "Settings". +2. Go to the "General" tab and select "CHANGE FOLDER". +3. Look for a folder where you want to install the game (preferably inside a folder on your desktop) and copy the path. +4. Run Scarab+ as an administrator and, when it asks you for the path, paste what you copied in step 3. + +Note: The path folder needs to have the "Hollow Knight_Data" folder inside. + ## Configuring your YAML File ### What is a YAML and why do I need one? You can see the [basic multiworld setup guide](/tutorial/Archipelago/setup/en) here on the Archipelago website to learn