Restore previous state of z_door_warp1.c, and reimplement boss rush blue warp bypass. This also fixes the issue with shadow and spirit medallions not being given in vanilla without cutscene skips on. (#5763)

Ensure shadow and spirit medallions get queued when skipping story cutscenes in vanilla.
This commit is contained in:
Malkierian
2025-08-25 11:59:38 -07:00
committed by GitHub
parent 9ff9bebaa2
commit b6166f41c8
5 changed files with 22 additions and 5 deletions

View File

@@ -1,6 +1,7 @@
#include "soh/Enhancements/game-interactor/GameInteractor.h"
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
#include "soh/OTRGlobals.h"
#include "soh/Enhancements/timesaver_hook_handlers.h"
extern "C" {
#include "macros.h"
@@ -12,6 +13,7 @@ extern "C" {
#define RAND_GET_OPTION(option) Rando::Context::GetInstance()->GetOption(option).Get()
extern "C" PlayState* gPlayState;
static bool sEnteredBlueWarp = false;
/**
@@ -124,6 +126,13 @@ void SkipBlueWarp_ShouldPlayBlueWarpCS(GIVanillaBehavior _, bool* should, va_lis
*/
void SkipBlueWarp_ShouldGiveItem(GIVanillaBehavior _, bool* should, va_list originalArgs) {
if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO)) {
if (IS_VANILLA) {
if (gPlayState->sceneNum == SCENE_SHADOW_TEMPLE_BOSS) {
TimeSaverQueueItem(RG_SHADOW_MEDALLION);
} else if (gPlayState->sceneNum == SCENE_SPIRIT_TEMPLE_BOSS) {
TimeSaverQueueItem(RG_SPIRIT_MEDALLION);
}
}
*should = false;
}
}

View File

@@ -501,6 +501,10 @@ void BossRush_OnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_li
}
break;
}
case VB_PLAY_BLUE_WARP_CS: {
*should = false;
break;
}
// Spawn clean blue warps (no ruto, adult animation, etc)
case VB_SPAWN_BLUE_WARP: {
switch (gPlayState->sceneNum) {

View File

@@ -1,6 +1,5 @@
#include <libultraship/bridge.h>
#include "soh/OTRGlobals.h"
#include "soh/Enhancements/randomizer/randomizerTypes.h"
#include "soh/Enhancements/game-interactor/GameInteractor.h"
#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h"
#include "soh/Enhancements/enhancementTypes.h"
@@ -1199,6 +1198,10 @@ void TimeSaverOnSceneInitHandler(int16_t sceneNum) {
static GetItemEntry vanillaQueuedItemEntry = GET_ITEM_NONE;
void TimeSaverQueueItem(RandomizerGet randoGet) {
vanillaQueuedItemEntry = Rando::StaticData::RetrieveItem(randoGet).GetGIEntry_Copy();
}
void TimeSaverOnFlagSetHandler(int16_t flagType, int16_t flag) {
// Do nothing when in a boss rush
if (IS_BOSS_RUSH) {

View File

@@ -1,6 +1,9 @@
#ifndef TIMESAVER_HOOK_HANDLERS_H
#define TIMESAVER_HOOK_HANDLERS_H
#include "soh/Enhancements/randomizer/randomizerTypes.h"
void TimeSaverRegisterHooks();
void TimeSaverQueueItem(RandomizerGet randoGet);
#endif // TIMESAVER_HOOK_HANDLERS_H

View File

@@ -813,8 +813,7 @@ void DoorWarp1_AdultWarpOut(DoorWarp1* this, PlayState* play) {
gSaveContext.nextCutsceneIndex = 0;
}
} else if (play->sceneNum == SCENE_SPIRIT_TEMPLE_BOSS) {
if (GameInteractor_Should(VB_PLAY_BLUE_WARP_CS,
!Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE),
if (GameInteractor_Should(VB_PLAY_BLUE_WARP_CS, !CHECK_QUEST_ITEM(QUEST_MEDALLION_SPIRIT),
RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE)) {
Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE);
if (GameInteractor_Should(VB_GIVE_ITEM_FROM_BLUE_WARP, true, ITEM_MEDALLION_SPIRIT)) {
@@ -832,8 +831,7 @@ void DoorWarp1_AdultWarpOut(DoorWarp1* this, PlayState* play) {
gSaveContext.nextCutsceneIndex = 0;
}
} else if (play->sceneNum == SCENE_SHADOW_TEMPLE_BOSS) {
if (GameInteractor_Should(VB_PLAY_BLUE_WARP_CS,
!Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE),
if (GameInteractor_Should(VB_PLAY_BLUE_WARP_CS, !CHECK_QUEST_ITEM(QUEST_MEDALLION_SHADOW),
RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE)) {
Flags_SetRandomizerInf(RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE);
if (GameInteractor_Should(VB_GIVE_ITEM_FROM_BLUE_WARP, true, ITEM_MEDALLION_SHADOW)) {