summaryrefslogtreecommitdiff
path: root/soh/src/code
diff options
context:
space:
mode:
authorGarrett Cox <garrettjcox@gmail.com>2022-10-20 22:10:29 -0500
committerGitHub <noreply@github.com>2022-10-20 23:10:29 -0400
commitdbd5585e15087edb9c900b2de0cb4166b5a7a076 (patch)
tree7be23ba9aa67e53c7a4b059e4eef625c23c8d4a3 /soh/src/code
parente5cc09a96f6096c9b68e1466a90d096162284117 (diff)
Implement LACS settings for ganons boss key (#1802)
* Implement LACS settings for ganons boss key * Add description
Diffstat (limited to 'soh/src/code')
-rw-r--r--soh/src/code/z_play.c123
1 files changed, 122 insertions, 1 deletions
diff --git a/soh/src/code/z_play.c b/soh/src/code/z_play.c
index 47a6821da..6729e9f55 100644
--- a/soh/src/code/z_play.c
+++ b/soh/src/code/z_play.c
@@ -239,10 +239,131 @@ void GivePlayerRandoRewardRequiem(GlobalContext* globalCtx, RandomizerCheck chec
}
}
+u8 CheckStoneCount() {
+ u8 stoneCount = 0;
+
+ if (CHECK_QUEST_ITEM(QUEST_KOKIRI_EMERALD)) {
+ stoneCount++;
+ }
+
+ if (CHECK_QUEST_ITEM(QUEST_GORON_RUBY)) {
+ stoneCount++;
+ }
+
+ if (CHECK_QUEST_ITEM(QUEST_ZORA_SAPPHIRE)) {
+ stoneCount++;
+ }
+
+ return stoneCount;
+}
+
+u8 CheckMedallionCount() {
+ u8 medallionCount = 0;
+
+ if (CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST)) {
+ medallionCount++;
+ }
+
+ if (CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE)) {
+ medallionCount++;
+ }
+
+ if (CHECK_QUEST_ITEM(QUEST_MEDALLION_WATER)) {
+ medallionCount++;
+ }
+
+ if (CHECK_QUEST_ITEM(QUEST_MEDALLION_SHADOW)) {
+ medallionCount++;
+ }
+
+ if (CHECK_QUEST_ITEM(QUEST_MEDALLION_SPIRIT)) {
+ medallionCount++;
+ }
+
+ if (CHECK_QUEST_ITEM(QUEST_MEDALLION_LIGHT)) {
+ medallionCount++;
+ }
+
+ return medallionCount;
+}
+
+u8 CheckDungeonCount() {
+ u8 dungeonCount = 0;
+
+ if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_DEKU_TREE)) {
+ dungeonCount++;
+ }
+
+ if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_DODONGOS_CAVERN)) {
+ dungeonCount++;
+ }
+
+ if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_JABU_JABUS_BELLY)) {
+ dungeonCount++;
+ }
+
+ if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FOREST_TEMPLE)) {
+ dungeonCount++;
+ }
+
+ if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE)) {
+ dungeonCount++;
+ }
+
+ if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_WATER_TEMPLE)) {
+ dungeonCount++;
+ }
+
+ if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE)) {
+ dungeonCount++;
+ }
+
+ if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE)) {
+ dungeonCount++;
+ }
+
+ return dungeonCount;
+}
+
void GivePlayerRandoRewardZeldaLightArrowsGift(GlobalContext* globalCtx, RandomizerCheck check) {
Player* player = GET_PLAYER(globalCtx);
- if (CHECK_QUEST_ITEM(QUEST_MEDALLION_SPIRIT) && CHECK_QUEST_ITEM(QUEST_MEDALLION_SHADOW) && LINK_IS_ADULT &&
+ u8 meetsRequirements = 0;
+
+ switch (Randomizer_GetSettingValue(RSK_GANONS_BOSS_KEY)) {
+ case 7:
+ if (CheckMedallionCount() >= Randomizer_GetSettingValue(RSK_LACS_MEDALLION_COUNT)) {
+ meetsRequirements = true;
+ }
+ break;
+ case 8:
+ if (CheckStoneCount() >= Randomizer_GetSettingValue(RSK_LACS_STONE_COUNT)) {
+ meetsRequirements = true;
+ }
+ break;
+ case 9:
+ if ((CheckMedallionCount() + CheckStoneCount()) >= Randomizer_GetSettingValue(RSK_LACS_REWARD_COUNT)) {
+ meetsRequirements = true;
+ }
+ break;
+ case 10:
+ if (CheckDungeonCount() >= Randomizer_GetSettingValue(RSK_LACS_DUNGEON_COUNT)) {
+ meetsRequirements = true;
+ }
+ break;
+ case 11:
+ if (gSaveContext.inventory.gsTokens >= Randomizer_GetSettingValue(RSK_LACS_TOKEN_COUNT)) {
+ meetsRequirements = true;
+ }
+ break;
+ default:
+ if (CHECK_QUEST_ITEM(QUEST_MEDALLION_SPIRIT) && CHECK_QUEST_ITEM(QUEST_MEDALLION_SHADOW)) {
+ meetsRequirements = true;
+ }
+ break;
+ }
+
+ if (meetsRequirements && LINK_IS_ADULT &&
(gEntranceTable[((void)0, gSaveContext.entranceIndex)].scene == SCENE_TOKINOMA) &&
!Flags_GetTreasure(globalCtx, 0x1E) && player != NULL && !Player_InBlockingCsMode(globalCtx, player) &&
globalCtx->sceneLoadFlag == 0) {