diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.h b/soh/soh/Enhancements/game-interactor/GameInteractor.h index ae711c093..b84af9ee9 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor.h @@ -65,6 +65,7 @@ typedef enum { extern "C" { #endif uint8_t GameInteractor_NoUIActive(); +void GameInteractor_SetNoUIActive(uint8_t state); GILinkSize GameInteractor_GetLinkSize(); void GameInteractor_SetLinkSize(GILinkSize size); uint8_t GameInteractor_InvisibleLinkActive(); diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor_State.cpp b/soh/soh/Enhancements/game-interactor/GameInteractor_State.cpp index 21642dded..38d125786 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor_State.cpp +++ b/soh/soh/Enhancements/game-interactor/GameInteractor_State.cpp @@ -36,6 +36,10 @@ uint8_t GameInteractor_NoUIActive() { return GameInteractor::State::NoUIActive; } +void GameInteractor_SetNoUIActive(uint8_t state) { + GameInteractor::State::NoUIActive = state; +} + // MARK: - GameInteractor::State::LinkSize GILinkSize GameInteractor_GetLinkSize() { return GameInteractor::State::LinkSize; diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index 9590c44e4..88d3c53df 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -670,52 +670,14 @@ void RegisterTriforceHunt() { } void RegisterGrantGanonsBossKey() { - static uint16_t eventTimer = -1; GameInteractor::Instance->RegisterGameHook([]() { Player* player = GET_PLAYER(gPlayState); - Actor* aplayer = &GET_PLAYER(gPlayState)->actor; // Triforce Hunt needs the check if the player isn't being teleported to the credits scene. if (!GameInteractor::IsGameplayPaused() && Flags_GetRandomizerInf(RAND_INF_GRANT_GANONS_BOSSKEY) && gPlayState->sceneLoadFlag != 0x14 && (1 << 0 & gSaveContext.inventory.dungeonItems[SCENE_GANONS_TOWER]) == 0) { GetItemEntry getItemEntry = ItemTableManager::Instance->RetrieveItemEntry(MOD_RANDOMIZER, RG_GANONS_CASTLE_BOSS_KEY); GiveItemEntryWithoutActor(gPlayState, getItemEntry); - if (gPlayState->sceneNum == SCENE_KAKARIKO_VILLAGE) { - eventTimer = 0; - } else { - eventTimer = 1; - } - } - - if (!GameInteractor::IsGameplayPaused() && gSaveContext.inventory.dungeonItems[SCENE_GANONS_TOWER] > 0 - && eventTimer == 0) { - eventTimer = 1; - } - if (eventTimer >= 1 && eventTimer <= 3) { - eventTimer++; - } - if (eventTimer == 4) { - if (gPlayState->sceneNum == SCENE_KAKARIKO_VILLAGE) { - player->actor.world.pos.x = -929.336; - player->actor.world.pos.y = 0; - player->actor.world.pos.z = 446.178; - player->actor.shape.rot.x = 0; - player->actor.shape.rot.y = 17537; - player->actor.shape.rot.z = 0; - GameInteractor::State::NoUIActive = 1; - - if (!Actor_FindNearby(gPlayState, aplayer, ACTOR_END_TITLE, ACTORCAT_ITEMACTION, 1000)) { - //Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_END_TITLE, 0, 0, 0, 0, 0, 0, 2, false); - } - - player->stateFlags1 = PLAYER_STATE1_INPUT_DISABLED; - } else { - eventTimer = 5; - } - } - if (eventTimer == 5) { - eventTimer = -1; - GameInteractor::State::NoUIActive = 0; } }); } diff --git a/soh/src/overlays/actors/ovl_En_ChristmasTree/z_en_christmastree.c b/soh/src/overlays/actors/ovl_En_ChristmasTree/z_en_christmastree.c index 3e2bb53c6..b20381d60 100644 --- a/soh/src/overlays/actors/ovl_En_ChristmasTree/z_en_christmastree.c +++ b/soh/src/overlays/actors/ovl_En_ChristmasTree/z_en_christmastree.c @@ -15,6 +15,7 @@ void EnChristmasTree_Draw(Actor* thisx, PlayState* play); void EnChristmasTree_Wait(EnChristmasTree* this, PlayState* play); void EnChristmasTree_Talk(EnChristmasTree* this, PlayState* play); +void EnChristmasTree_SetupEndTitle(EnChristmasTree* this, PlayState* play); static ColliderCylinderInit sCylinderInit = { { @@ -73,20 +74,39 @@ void EnChristmasTree_Talk(EnChristmasTree* this, PlayState* play) { u8 dialogState = Message_GetState(&play->msgCtx); if (dialogState != TEXT_STATE_CHOICE) { if ((dialogState == TEXT_STATE_DONE) && Message_ShouldAdvance(play)) { // advanced final textbox - this->actionFunc = EnChristmasTree_Wait; - // Teleport to credits when goal is reached. if (gSaveContext.triforcePiecesCollected >= Randomizer_GetSettingValue(RSK_TRIFORCE_HUNT_PIECES_REQUIRED)) { gSaveContext.sohStats.itemTimestamp[TIMESTAMP_TRIFORCE_COMPLETED] = GAMEPLAYSTAT_TOTAL_TIME; gSaveContext.sohStats.gameComplete = 1; - Flags_SetRandomizerInf(RAND_INF_GRANT_GANONS_BOSSKEY); Play_PerformSave(play); GameInteractor_SetTriforceHuntCreditsWarpActive(true); + this->actionFunc = EnChristmasTree_SetupEndTitle; + } else { + this->actionFunc = EnChristmasTree_Wait; } } } +} - +void EnChristmasTree_SetupEndTitle(EnChristmasTree* this, PlayState* play) { + Player* player = GET_PLAYER(play); + + player->actor.world.pos.x = -929.336; + player->actor.world.pos.y = 0; + player->actor.world.pos.z = 446.178; + player->actor.shape.rot.x = 0; + player->actor.shape.rot.y = 17537; + player->actor.shape.rot.z = 0; + + GameInteractor_SetNoUIActive(1); + + Actor_Spawn(&gPlayState->actorCtx, gPlayState, ACTOR_END_TITLE, 0, 0, 0, 0, 0, 0, 2, false); + + player->stateFlags1 = PLAYER_STATE1_INPUT_DISABLED; + + Flags_SetRandomizerInf(RAND_INF_GRANT_GANONS_BOSSKEY); + + this->actionFunc = EnChristmasTree_Wait; } void EnChristmasTree_Update(Actor* thisx, PlayState* play) {