timesaver_hook_handlers: use COND_HOOK (#6309)

This commit is contained in:
Philip Dubé 2026-03-02 20:25:03 +00:00 committed by GitHub
parent 2a335b1cd8
commit f19ad1e75b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 28 additions and 57 deletions

View file

@ -1,7 +1,6 @@
#include <soh/OTRGlobals.h>
extern "C" {
extern PlayState* gPlayState;
#include "variables.h"
#include "functions.h"
#include "overlays/actors/ovl_En_Ossan/z_en_ossan.h"
}

View file

@ -111,11 +111,11 @@ void EnDntDemo_JudgeSkipToReward(EnDntDemo* enDntDemo, PlayState* play) {
void BgSpot03Taki_KeepOpen(BgSpot03Taki* bgSpot03Taki, PlayState* play) {
}
static int successChimeCooldown = 0;
static u32 successChimeCooldown = 0;
void RateLimitedSuccessChime() {
if (successChimeCooldown == 0) {
if (gPlayState->gameplayFrames > successChimeCooldown) {
Sfx_PlaySfxCentered(NA_SE_SY_CORRECT_CHIME);
successChimeCooldown = 120;
successChimeCooldown = gPlayState->gameplayFrames + 120;
}
}
@ -125,12 +125,6 @@ bool ForcedDialogIsDisabled(ForcedDialogMode type) {
type) != 0;
}
void TimeSaverOnGameFrameUpdateHandler() {
if (successChimeCooldown > 0) {
successChimeCooldown--;
}
}
void TimeSaverOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_list originalArgs) {
va_list args;
va_copy(args, originalArgs);
@ -1223,7 +1217,7 @@ void TimeSaverOnFlagSetHandler(int16_t flagType, int16_t flag) {
return;
}
if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), IS_RANDO)) {
if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), 0)) {
switch (flagType) {
case FLAG_EVENT_CHECK_INF:
switch (flag) {
@ -1269,7 +1263,7 @@ void TimeSaverOnFlagSetHandler(int16_t flagType, int16_t flag) {
}
}
if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO)) {
if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), 0)) {
switch (flagType) {
case FLAG_RANDOMIZER_INF:
switch (flag) {
@ -1310,7 +1304,7 @@ void TimeSaverOnFlagSetHandler(int16_t flagType, int16_t flag) {
}
}
if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.LearnSong"), IS_RANDO)) {
if (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.LearnSong"), 0)) {
switch (flagType) {
case FLAG_EVENT_CHECK_INF:
switch (flag) {
@ -1395,52 +1389,30 @@ void TimeSaverOnItemReceiveHandler(GetItemEntry receivedItemEntry) {
}
}
static uint32_t onSceneInitHook = 0;
static uint32_t onVanillaBehaviorHook = 0;
static uint32_t onActorInitHook = 0;
static uint32_t onGameFrameUpdate = 0;
static uint32_t onFlagSetHook = 0;
static uint32_t onPlayerUpdateHook = 0;
static uint32_t onItemReceiveHook = 0;
static void TimeSaverRegisterHooks() {
GameInteractor::Instance->RegisterGameHook<GameInteractor::OnLoadGame>([](int32_t fileNum) mutable {
COND_HOOK(OnSceneInit,
CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), IS_RANDO) ||
CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.BossIntro"), IS_RANDO),
TimeSaverOnSceneInitHandler);
COND_HOOK(OnVanillaBehavior, true, TimeSaverOnVanillaBehaviorHandler);
COND_HOOK(OnActorInit, true, TimeSaverOnActorInitHandler);
// item queue for use outside rando, rando has its own queue
COND_HOOK(OnLoadGame, !IS_RANDO, [](int32_t fileNum) {
vanillaQueuedItemEntry = GET_ITEM_NONE;
GameInteractor::Instance->UnregisterGameHook<GameInteractor::OnSceneInit>(onSceneInitHook);
GameInteractor::Instance->UnregisterGameHook<GameInteractor::OnVanillaBehavior>(onVanillaBehaviorHook);
GameInteractor::Instance->UnregisterGameHook<GameInteractor::OnActorInit>(onActorInitHook);
GameInteractor::Instance->UnregisterGameHook<GameInteractor::OnGameFrameUpdate>(onGameFrameUpdate);
GameInteractor::Instance->UnregisterGameHook<GameInteractor::OnFlagSet>(onFlagSetHook);
GameInteractor::Instance->UnregisterGameHook<GameInteractor::OnPlayerUpdate>(onPlayerUpdateHook);
GameInteractor::Instance->UnregisterGameHook<GameInteractor::OnItemReceive>(onItemReceiveHook);
onSceneInitHook = 0;
onVanillaBehaviorHook = 0;
onActorInitHook = 0;
onGameFrameUpdate = 0;
onFlagSetHook = 0;
onPlayerUpdateHook = 0;
onItemReceiveHook = 0;
onSceneInitHook =
GameInteractor::Instance->RegisterGameHook<GameInteractor::OnSceneInit>(TimeSaverOnSceneInitHandler);
onVanillaBehaviorHook = GameInteractor::Instance->RegisterGameHook<GameInteractor::OnVanillaBehavior>(
TimeSaverOnVanillaBehaviorHandler);
onActorInitHook =
GameInteractor::Instance->RegisterGameHook<GameInteractor::OnActorInit>(TimeSaverOnActorInitHandler);
onGameFrameUpdate = GameInteractor::Instance->RegisterGameHook<GameInteractor::OnGameFrameUpdate>(
TimeSaverOnGameFrameUpdateHandler);
if (IS_RANDO)
return;
onFlagSetHook =
GameInteractor::Instance->RegisterGameHook<GameInteractor::OnFlagSet>(TimeSaverOnFlagSetHandler);
onPlayerUpdateHook =
GameInteractor::Instance->RegisterGameHook<GameInteractor::OnPlayerUpdate>(TimeSaverOnPlayerUpdateHandler);
onItemReceiveHook =
GameInteractor::Instance->RegisterGameHook<GameInteractor::OnItemReceive>(TimeSaverOnItemReceiveHandler);
successChimeCooldown = 0;
});
COND_HOOK(OnItemReceive, !IS_RANDO, TimeSaverOnItemReceiveHandler);
COND_HOOK(OnPlayerUpdate, !IS_RANDO, TimeSaverOnPlayerUpdateHandler);
COND_HOOK(OnFlagSet,
!IS_RANDO && (CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"), 0) ||
CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"), 0) ||
CVarGetInteger(CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.LearnSong"), 0)),
TimeSaverOnFlagSetHandler);
}
static RegisterShipInitFunc initFunc_RegisterHooks(TimeSaverRegisterHooks);
static RegisterShipInitFunc initFunc_RegisterHooks(TimeSaverRegisterHooks,
{ "IS_RANDO", CVAR_ENHANCEMENT("TimeSavers.SkipMiscInteractions"),
CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.BossIntro"),
CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.Story"),
CVAR_ENHANCEMENT("TimeSavers.SkipCutscene.LearnSong") });