#include "GameInteractor.h" #include "spdlog/spdlog.h" extern "C" { #include "z64actor.h" } #include void GameInteractor_ExecuteOnGameStateMainFinish() { GameInteractor::Instance->ExecuteHooks(); } void GameInteractor_ExecuteOnGameStateDrawFinish() { GameInteractor::Instance->ExecuteHooks(); } void GameInteractor_ExecuteOnGameStateUpdate() { GameInteractor::Instance->ExecuteHooks(); } void GameInteractor_ExecuteOnSaveInit(s16 fileNum) { GameInteractor::Instance->ExecuteHooks(fileNum); } void GameInteractor_ExecuteBeforeEndOfCycleSave() { GameInteractor::Instance->ExecuteHooks(); } void GameInteractor_ExecuteAfterEndOfCycleSave() { GameInteractor::Instance->ExecuteHooks(); } void GameInteractor_ExecuteBeforeMoonCrashSaveReset() { GameInteractor::Instance->ExecuteHooks(); } void GameInteractor_ExecuteOnSceneInit(s16 sceneId, s8 spawnNum) { SPDLOG_DEBUG("OnSceneInit: sceneId: {}, spawnNum: {}", sceneId, spawnNum); GameInteractor::Instance->ExecuteHooks(sceneId, spawnNum); GameInteractor::Instance->ExecuteHooksForID(sceneId, sceneId, spawnNum); GameInteractor::Instance->ExecuteHooksForFilter(sceneId, spawnNum); } void GameInteractor_ExecuteOnRoomInit(s16 sceneId, s8 roomNum) { SPDLOG_DEBUG("OnRoomInit: sceneId: {}, roomNum: {}", sceneId, roomNum); GameInteractor::Instance->ExecuteHooks(sceneId, roomNum); GameInteractor::Instance->ExecuteHooksForID(sceneId, sceneId, roomNum); GameInteractor::Instance->ExecuteHooksForFilter(sceneId, roomNum); } bool GameInteractor_ShouldActorInit(Actor* actor) { bool result = true; GameInteractor::Instance->ExecuteHooks(actor, &result); GameInteractor::Instance->ExecuteHooksForID(actor->id, actor, &result); GameInteractor::Instance->ExecuteHooksForPtr((uintptr_t)actor, actor, &result); GameInteractor::Instance->ExecuteHooksForFilter(actor, &result); return result; } void GameInteractor_ExecuteOnActorInit(Actor* actor) { GameInteractor::Instance->ExecuteHooks(actor); GameInteractor::Instance->ExecuteHooksForID(actor->id, actor); GameInteractor::Instance->ExecuteHooksForPtr((uintptr_t)actor, actor); GameInteractor::Instance->ExecuteHooksForFilter(actor); } bool GameInteractor_ShouldActorUpdate(Actor* actor) { bool result = true; GameInteractor::Instance->ExecuteHooks(actor, &result); GameInteractor::Instance->ExecuteHooksForID(actor->id, actor, &result); GameInteractor::Instance->ExecuteHooksForPtr((uintptr_t)actor, actor, &result); GameInteractor::Instance->ExecuteHooksForFilter(actor, &result); return result; } void GameInteractor_ExecuteOnActorUpdate(Actor* actor) { GameInteractor::Instance->ExecuteHooks(actor); GameInteractor::Instance->ExecuteHooksForID(actor->id, actor); GameInteractor::Instance->ExecuteHooksForPtr((uintptr_t)actor, actor); GameInteractor::Instance->ExecuteHooksForFilter(actor); } bool GameInteractor_ShouldActorDraw(Actor* actor) { bool result = true; GameInteractor::Instance->ExecuteHooks(actor, &result); GameInteractor::Instance->ExecuteHooksForID(actor->id, actor, &result); GameInteractor::Instance->ExecuteHooksForPtr((uintptr_t)actor, actor, &result); GameInteractor::Instance->ExecuteHooksForFilter(actor, &result); return result; } void GameInteractor_ExecuteOnActorDraw(Actor* actor) { GameInteractor::Instance->ExecuteHooks(actor); GameInteractor::Instance->ExecuteHooksForID(actor->id, actor); GameInteractor::Instance->ExecuteHooksForPtr((uintptr_t)actor, actor); GameInteractor::Instance->ExecuteHooksForFilter(actor); } void GameInteractor_ExecuteOnActorKill(Actor* actor) { GameInteractor::Instance->ExecuteHooks(actor); GameInteractor::Instance->ExecuteHooksForID(actor->id, actor); GameInteractor::Instance->ExecuteHooksForPtr((uintptr_t)actor, actor); GameInteractor::Instance->ExecuteHooksForFilter(actor); } void GameInteractor_ExecuteOnSceneFlagSet(s16 sceneId, FlagType flagType, u32 flag) { SPDLOG_DEBUG("OnSceneFlagSet: sceneId: {}, flagType: {}, flag: {}", sceneId, (u32)flagType, flag); GameInteractor::Instance->ExecuteHooks(sceneId, flagType, flag); GameInteractor::Instance->ExecuteHooksForFilter(sceneId, flagType, flag); } void GameInteractor_ExecuteOnSceneFlagUnset(s16 sceneId, FlagType flagType, u32 flag) { SPDLOG_DEBUG("OnSceneFlagUnset: sceneId: {}, flagType: {}, flag: {}", sceneId, (u32)flagType, flag); GameInteractor::Instance->ExecuteHooks(sceneId, flagType, flag); GameInteractor::Instance->ExecuteHooksForFilter(sceneId, flagType, flag); } void GameInteractor_ExecuteOnFlagSet(FlagType flagType, u32 flag) { // This flag in particular is very spammy, so we'll suppress it if (!(flagType == FLAG_WEEK_EVENT_REG && flag == WEEKEVENTREG_92_80)) { SPDLOG_DEBUG("OnFlagSet: flagType: {}, flag: {}", (u32)flagType, flag); } GameInteractor::Instance->ExecuteHooks(flagType, flag); GameInteractor::Instance->ExecuteHooksForFilter(flagType, flag); } void GameInteractor_ExecuteOnFlagUnset(FlagType flagType, u32 flag) { // This flag in particular is very spammy, so we'll suppress it if (!(flagType == FLAG_WEEK_EVENT_REG && flag == WEEKEVENTREG_92_80)) { SPDLOG_DEBUG("OnFlagUnset: flagType: {}, flag: {}", (u32)flagType, flag); } GameInteractor::Instance->ExecuteHooks(flagType, flag); GameInteractor::Instance->ExecuteHooksForFilter(flagType, flag); } void GameInteractor_ExecuteOnCameraChangeModeFlags(Camera* camera) { GameInteractor::Instance->ExecuteHooks(camera); GameInteractor::Instance->ExecuteHooksForID(camera->uid, camera); GameInteractor::Instance->ExecuteHooksForPtr((uintptr_t)camera, camera); GameInteractor::Instance->ExecuteHooksForFilter(camera); } void GameInteractor_ExecuteAfterCameraUpdate(Camera* camera) { GameInteractor::Instance->ExecuteHooks(camera); GameInteractor::Instance->ExecuteHooksForID(camera->uid, camera); GameInteractor::Instance->ExecuteHooksForPtr((uintptr_t)camera, camera); GameInteractor::Instance->ExecuteHooksForFilter(camera); } void GameInteractor_ExecuteOnCameraChangeSettingsFlags(Camera* camera) { GameInteractor::Instance->ExecuteHooks(camera); GameInteractor::Instance->ExecuteHooksForID(camera->uid, camera); GameInteractor::Instance->ExecuteHooksForPtr((uintptr_t)camera, camera); GameInteractor::Instance->ExecuteHooksForFilter(camera); } void GameInteractor_ExecuteOnPassPlayerInputs(Input* input) { GameInteractor::Instance->ExecuteHooks(input); GameInteractor::Instance->ExecuteHooksForFilter(input); } void GameInteractor_ExecuteOnOpenText(u16 textId) { SPDLOG_DEBUG("OnOpenText: textId: {}", textId); GameInteractor::Instance->ExecuteHooks(textId); GameInteractor::Instance->ExecuteHooksForID(textId, textId); GameInteractor::Instance->ExecuteHooksForFilter(textId); } bool GameInteractor_ShouldItemGive(u8 item) { bool result = true; GameInteractor::Instance->ExecuteHooks(item, &result); GameInteractor::Instance->ExecuteHooksForID(item, item, &result); GameInteractor::Instance->ExecuteHooksForFilter(item, &result); return result; } void GameInteractor_ExecuteOnItemGive(u8 item) { SPDLOG_DEBUG("OnItemGive: item: {}", item); GameInteractor::Instance->ExecuteHooks(item); GameInteractor::Instance->ExecuteHooksForID(item, item); GameInteractor::Instance->ExecuteHooksForFilter(item); } bool GameInteractor_Should(GIVanillaBehavior flag, bool result, void* opt) { GameInteractor::Instance->ExecuteHooks(flag, &result, opt); GameInteractor::Instance->ExecuteHooksForID(flag, flag, &result, opt); if (opt != nullptr) { GameInteractor::Instance->ExecuteHooksForPtr((uintptr_t)opt, flag, &result, opt); } GameInteractor::Instance->ExecuteHooksForFilter(flag, &result, opt); return result; } // Returns 1 or -1 based on a number of factors like CVars or other game states. int GameInteractor_InvertControl(GIInvertType type) { int result = 1; switch (type) { case GI_INVERT_CAMERA_RIGHT_STICK_X: if (CVarGetInteger("gEnhancements.Camera.RightStick.InvertXAxis", 0)) { result *= -1; } break; case GI_INVERT_CAMERA_RIGHT_STICK_Y: if (CVarGetInteger("gEnhancements.Camera.RightStick.InvertYAxis", 1)) { result *= -1; } break; } /* // Invert all X axis inputs if the Mirrored World mode is enabled if (CVarGetInteger("gModes.MirroredWorld.State", 0)) { switch (type) { case GI_INVERT_CAMERA_RIGHT_STICK_X: result *= -1; break; } } */ /* if (CrowdControl::State::InvertedInputs) { result *= -1; } */ return result; }