From 6d77bbd4a975c56a89d9011e4fcb3f73c8d25b65 Mon Sep 17 00:00:00 2001 From: briaguya <70942617+briaguya-ai@users.noreply.github.com> Date: Mon, 8 Apr 2024 11:55:16 -0400 Subject: [PATCH] vb skull rewards (#101) --- .../game-interactor/GameInteractor.h | 2 + .../Enhancements/randomizer/hook_handlers.cpp | 28 ++++++++ soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c | 68 ++++++------------- soh/src/overlays/actors/ovl_En_Sth/z_en_sth.h | 2 + 4 files changed, 51 insertions(+), 49 deletions(-) diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.h b/soh/soh/Enhancements/game-interactor/GameInteractor.h index f5e70da16..1f0da656f 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor.h @@ -296,6 +296,8 @@ typedef enum { GI_VB_GIVE_ITEM_FROM_TALONS_CHICKENS, // Opt: *EnDivingGame GI_VB_GIVE_ITEM_FROM_DIVING_MINIGAME, + // Opt: *EnSth + GI_VB_GIVE_ITEM_FROM_SKULLTULA_REWARD, GI_VB_GIVE_ITEM_FAIRY_OCARINA, GI_VB_GIVE_ITEM_WEIRD_EGG, diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index 772ce16aa..933b27e5a 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -24,6 +24,7 @@ extern "C" { #include "src/overlays/actors/ovl_En_Ms/z_en_ms.h" #include "src/overlays/actors/ovl_En_Fr/z_en_fr.h" #include "src/overlays/actors/ovl_En_Syateki_Man/z_en_syateki_man.h" +#include "src/overlays/actors/ovl_En_Sth/z_en_sth.h" #include "adult_trade_shuffle.h" extern SaveContext gSaveContext; extern PlayState* gPlayState; @@ -763,6 +764,33 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void *should = eligible; break; } + case GI_VB_GIVE_ITEM_FROM_SKULLTULA_REWARD: { + // In z_en_sth.c the rewards are stored in sGetItemIds, the first entry + // in that array is GI_RUPEE_GOLD, and the reward is picked in EnSth_GivePlayerItem + // via sGetItemIds[this->actor.params]. This means if actor.params == 0 we're looking + // at the 100 GS reward + EnSth* enSth = static_cast(optionalArg); + if (enSth->actor.params == 0) { + // if nothing is shuffled onto 100 GS, + // or we already got the 100 GS reward, + // let the player farm + if (!RAND_GET_OPTION(RSK_SHUFFLE_100_GS_REWARD) || + Flags_GetRandomizerInf(RAND_INF_KAK_100_GOLD_SKULLTULA_REWARD)) { + *should = true; + break; + } + + // we're giving the 100 GS rando reward! set the rando inf + Flags_SetRandomizerInf(RAND_INF_KAK_100_GOLD_SKULLTULA_REWARD); + + // also set the actionfunc so this doesn't immediately get + // called again (and lead to a vanilla+rando item give + // because the flag check will pass next time) + enSth->actionFunc = (EnSthActionFunc)EnSth_RewardObtainedTalk; + } + *should = false; + break; + } case GI_VB_TRADE_TIMER_ODD_MUSHROOM: case GI_VB_TRADE_TIMER_EYEDROPS: case GI_VB_TRADE_TIMER_FROG: diff --git a/soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c b/soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c index 7a0332910..f8b50d823 100644 --- a/soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c +++ b/soh/src/overlays/actors/ovl_En_Sth/z_en_sth.c @@ -257,66 +257,34 @@ void EnSth_ParentRewardObtainedWait(EnSth* this, PlayState* play) { void EnSth_GivePlayerItem(EnSth* this, PlayState* play) { u16 getItemId = sGetItemIds[this->actor.params]; - GetItemEntry getItemEntry = (GetItemEntry)GET_ITEM_NONE; - - if (IS_RANDO) { - switch (getItemId) { - case GI_RUPEE_GOLD: - if (!Flags_GetRandomizerInf(RAND_INF_KAK_100_GOLD_SKULLTULA_REWARD)) { - getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_100_GOLD_SKULLTULA_REWARD, GI_RUPEE_GOLD); - Flags_SetRandomizerInf(RAND_INF_KAK_100_GOLD_SKULLTULA_REWARD); - } - break; - case GI_WALLET_ADULT: - getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_10_GOLD_SKULLTULA_REWARD, GI_WALLET_ADULT); - break; - case GI_STONE_OF_AGONY: - getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_20_GOLD_SKULLTULA_REWARD, GI_STONE_OF_AGONY); - break; - case GI_WALLET_GIANT: - getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_30_GOLD_SKULLTULA_REWARD, GI_WALLET_GIANT); - break; - case GI_BOMBCHUS_10: - getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_40_GOLD_SKULLTULA_REWARD, GI_BOMBCHUS_10); - break; - case GI_HEART_PIECE: - getItemEntry = Randomizer_GetItemFromKnownCheck(RC_KAK_50_GOLD_SKULLTULA_REWARD, GI_HEART_PIECE); - break; - } - getItemId = getItemEntry.getItemId; - } else { - switch (this->actor.params) { - case 1: - case 3: - switch (CUR_UPG_VALUE(UPG_WALLET)) { - case 0: - getItemId = GI_WALLET_ADULT; - break; - case 1: - getItemId = GI_WALLET_GIANT; - break; - } - break; - } + switch (this->actor.params) { + case 1: + case 3: + switch (CUR_UPG_VALUE(UPG_WALLET)) { + case 0: + getItemId = GI_WALLET_ADULT; + break; + + case 1: + getItemId = GI_WALLET_GIANT; + break; + } + break; } - if (!IS_RANDO || getItemEntry.getItemId == GI_NONE) { - Actor_OfferGetItem(&this->actor, play, getItemId, 10000.0f, 50.0f); - } else { - GiveItemEntryFromActor(&this->actor, play, getItemEntry, 10000.0f, 50.0f); - } + Actor_OfferGetItem(&this->actor, play, getItemId, 10000.0f, 50.0f); } void EnSth_GiveReward(EnSth* this, PlayState* play) { - if (Actor_HasParent(&this->actor, play)) { + if (Actor_HasParent(&this->actor, play) || !GameInteractor_Should(GI_VB_GIVE_ITEM_FROM_SKULLTULA_REWARD, true, this)) { this->actor.parent = NULL; EnSth_SetupAction(this, EnSth_RewardObtainedTalk); gSaveContext.eventChkInf[EVENTCHKINF_SKULLTULA_REWARD_INDEX] |= this->eventFlag; if (this->eventFlag != 0) { GameInteractor_ExecuteOnFlagSet(FLAG_EVENT_CHECK_INF, (EVENTCHKINF_SKULLTULA_REWARD_INDEX << 4) + sEventFlagsShift[this->actor.params]); } - } else { + } else if (GameInteractor_Should(GI_VB_GIVE_ITEM_FROM_SKULLTULA_REWARD, true, this)) { EnSth_GivePlayerItem(this, play); } EnSth_FacePlayer(this, play); @@ -326,7 +294,9 @@ void EnSth_RewardUnobtainedTalk(EnSth* this, PlayState* play) { if ((Message_GetState(&play->msgCtx) == TEXT_STATE_EVENT) && Message_ShouldAdvance(play)) { Message_CloseTextbox(play); EnSth_SetupAction(this, EnSth_GiveReward); - EnSth_GivePlayerItem(this, play); + if (GameInteractor_Should(GI_VB_GIVE_ITEM_FROM_SKULLTULA_REWARD, true, this)) { + EnSth_GivePlayerItem(this, play); + } } EnSth_FacePlayer(this, play); } diff --git a/soh/src/overlays/actors/ovl_En_Sth/z_en_sth.h b/soh/src/overlays/actors/ovl_En_Sth/z_en_sth.h index 9391496ae..c0001f955 100644 --- a/soh/src/overlays/actors/ovl_En_Sth/z_en_sth.h +++ b/soh/src/overlays/actors/ovl_En_Sth/z_en_sth.h @@ -25,4 +25,6 @@ typedef struct EnSth { /* 0x02B8 */ EnSthActionFunc actionFunc; } EnSth; // size = 0x02BC +void EnSth_RewardObtainedTalk(EnSth* enSth, PlayState* play); + #endif