From 63afaa3cc993254cc35c4acc92ce1f31759f09cd Mon Sep 17 00:00:00 2001 From: briaguya <70942617+briaguya-ai@users.noreply.github.com> Date: Tue, 16 Apr 2024 20:18:26 -0400 Subject: [PATCH] vb ocarina memory (#107) * Ocarina Memory Game * vb memory game --------- Co-authored-by: Taw --- .../game-interactor/GameInteractor.h | 2 ++ .../Enhancements/randomizer/hook_handlers.cpp | 8 ++++++ soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c | 27 ++++++------------- soh/src/overlays/actors/ovl_En_Skj/z_en_skj.h | 2 ++ 4 files changed, 20 insertions(+), 19 deletions(-) diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.h b/soh/soh/Enhancements/game-interactor/GameInteractor.h index 3790545fd..440a241ef 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor.h @@ -287,6 +287,8 @@ typedef enum { // Opt: *EnFr GI_VB_GIVE_ITEM_FROM_FROGS, // Opt: *EnSkj + GI_VB_GIVE_ITEM_FROM_OCARINA_MEMORY_GAME, + // Opt: *EnSkj GI_VB_GIVE_ITEM_FROM_SKULL_KID_SARIAS_SONG, GI_VB_GIVE_ITEM_FROM_MAN_ON_ROOF, // Opt: *EnSyatekiMan diff --git a/soh/soh/Enhancements/randomizer/hook_handlers.cpp b/soh/soh/Enhancements/randomizer/hook_handlers.cpp index ae6beb869..47441fb31 100644 --- a/soh/soh/Enhancements/randomizer/hook_handlers.cpp +++ b/soh/soh/Enhancements/randomizer/hook_handlers.cpp @@ -27,6 +27,7 @@ extern "C" { #include "src/overlays/actors/ovl_En_Sth/z_en_sth.h" #include "src/overlays/actors/ovl_Item_Etcetera/z_item_etcetera.h" #include "src/overlays/actors/ovl_En_Box/z_en_box.h" +#include "src/overlays/actors/ovl_En_Skj/z_en_skj.h" #include "adult_trade_shuffle.h" extern SaveContext gSaveContext; extern PlayState* gPlayState; @@ -909,6 +910,13 @@ void RandomizerOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, void *should = false; break; } + case GI_VB_GIVE_ITEM_FROM_OCARINA_MEMORY_GAME: { + EnSkj* enSkj = static_cast(optionalArg); + Flags_SetItemGetInf(ITEMGETINF_17); + enSkj->actionFunc = (EnSkjActionFunc)EnSkj_CleanupOcarinaGame; + *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_Skj/z_en_skj.c b/soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c index 344a09f19..94df7a49f 100644 --- a/soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c +++ b/soh/src/overlays/actors/ovl_En_Skj/z_en_skj.c @@ -1541,7 +1541,9 @@ void EnSkj_WaitForOfferResponse(EnSkj* this, PlayState* play) { void EnSkj_WonOcarinaMiniGame(EnSkj* this, PlayState* play) { if (D_80B01EA0) { - this->actionFunc = EnSkj_WaitToGiveReward; + if (GameInteractor_Should(GI_VB_GIVE_ITEM_FROM_OCARINA_MEMORY_GAME, true, this)) { + this->actionFunc = EnSkj_WaitToGiveReward; + } } else { func_8002F2CC(&this->actor, play, 26.0f); } @@ -1549,13 +1551,8 @@ void EnSkj_WonOcarinaMiniGame(EnSkj* this, PlayState* play) { void EnSkj_WaitToGiveReward(EnSkj* this, PlayState* play) { if ((Message_GetState(&play->msgCtx) == TEXT_STATE_DONE) && Message_ShouldAdvance(play)) { - if (IS_RANDO && gSaveContext.ocarinaGameRoundNum != 3) { - GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LW_OCARINA_MEMORY_GAME, GI_HEART_PIECE); - GiveItemEntryFromActor(&this->actor, play, getItemEntry, 26.0f, 26.0f); - } else { - Actor_OfferGetItem(&this->actor, play, sOcarinaGameRewards[gSaveContext.ocarinaGameRoundNum], 26.0f, 26.0f); - } - + Actor_OfferGetItem(&this->actor, play, + sOcarinaGameRewards[gSaveContext.ocarinaGameRoundNum], 26.0f, 26.0f); this->actionFunc = EnSkj_GiveOcarinaGameReward; } } @@ -1565,12 +1562,8 @@ void EnSkj_GiveOcarinaGameReward(EnSkj* this, PlayState* play) { this->actor.parent = NULL; this->actionFunc = EnSkj_FinishOcarinaGameRound; } else { - if (IS_RANDO && gSaveContext.ocarinaGameRoundNum != 3) { - GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LW_OCARINA_MEMORY_GAME, GI_HEART_PIECE); - GiveItemEntryFromActor(&this->actor, play, getItemEntry, 26.0f, 26.0f); - } else { - Actor_OfferGetItem(&this->actor, play, sOcarinaGameRewards[gSaveContext.ocarinaGameRoundNum], 26.0f, 26.0f); - } + Actor_OfferGetItem(&this->actor, play, + sOcarinaGameRewards[gSaveContext.ocarinaGameRoundNum], 26.0f, 26.0f); } } @@ -1582,11 +1575,7 @@ void EnSkj_FinishOcarinaGameRound(EnSkj* this, PlayState* play) { gSaveContext.ocarinaGameRoundNum++; } - if (IS_RANDO) { - gSaveContext.ocarinaGameRoundNum = 3; - } - - if (ocarinaGameRoundNum == 2 || IS_RANDO) { + if (ocarinaGameRoundNum == 2) { Flags_SetItemGetInf(ITEMGETINF_17); this->actionFunc = EnSkj_CleanupOcarinaGame; } else { diff --git a/soh/src/overlays/actors/ovl_En_Skj/z_en_skj.h b/soh/src/overlays/actors/ovl_En_Skj/z_en_skj.h index bc8febcd4..3f8b75ba2 100644 --- a/soh/src/overlays/actors/ovl_En_Skj/z_en_skj.h +++ b/soh/src/overlays/actors/ovl_En_Skj/z_en_skj.h @@ -37,4 +37,6 @@ typedef struct EnSkj { /* 0x02F4 */ Vec3f posCopy; } EnSkj; // size = 0x0300 +void EnSkj_CleanupOcarinaGame(EnSkj* enSkj, PlayState* play); + #endif