#pragma once #ifndef GameInteractor_h #define GameInteractor_h #include "GameInteractionEffect.h" typedef enum { /* 0x00 */ GI_LINK_SIZE_NORMAL, /* 0x01 */ GI_LINK_SIZE_GIANT, /* 0x02 */ GI_LINK_SIZE_MINISH, /* 0x03 */ GI_LINK_SIZE_PAPER, /* 0x04 */ GI_LINK_SIZE_RESET } GILinkSize; typedef enum { /* 0x00 */ GI_GRAVITY_LEVEL_LIGHT, /* 0x01 */ GI_GRAVITY_LEVEL_NORMAL, /* 0x02 */ GI_GRAVITY_LEVEL_HEAVY, } GIGravityLevel; #ifdef __cplusplus extern "C" { #endif uint8_t GameInteractor_NoUIActive(); GILinkSize GameInteractor_GetLinkSize(); void GameInteractor_SetLinkSize(GILinkSize size); uint8_t GameInteractor_InvisibleLinkActive(); uint8_t GameInteractor_OneHitKOActive(); uint8_t GameInteractor_PacifistModeActive(); uint8_t GameInteractor_DisableZTargetingActive(); uint8_t GameInteractor_ReverseControlsActive(); int32_t GameInteractor_DefenseModifier(); int32_t GameInteractor_RunSpeedModifier(); GIGravityLevel GameInteractor_GravityLevel(); #ifdef __cplusplus } #endif #ifdef __cplusplus #include #include #define DEFINE_HOOK(name, type) \ struct name { \ typedef std::function fn; \ } class GameInteractor { public: static GameInteractor* Instance; // Gsme State class State { public: static bool NoUIActive; static GILinkSize LinkSize; static bool InvisibleLinkActive; static bool OneHitKOActive; static bool PacifistModeActive; static bool DisableZTargetingActive; static bool ReverseControlsActive; static int32_t DefenseModifier; static int32_t RunSpeedModifier; static GIGravityLevel GravityLevel; static void SetPacifistMode(bool active); }; // Effects static GameInteractionEffectQueryResult CanApplyEffect(GameInteractionEffectBase* effect); static GameInteractionEffectQueryResult ApplyEffect(GameInteractionEffectBase* effect); static GameInteractionEffectQueryResult RemoveEffect(GameInteractionEffectBase* effect); // Game Hooks template struct RegisteredGameHooks { inline static std::vector functions; }; template void RegisterGameHook(typename H::fn h) { RegisteredGameHooks::functions.push_back(h); } template void ExecuteHooks(Args&&... args) { for (auto& fn : RegisteredGameHooks::functions) { fn(std::forward(args)...); } } DEFINE_HOOK(OnLoadGame, void(int32_t fileNum)); DEFINE_HOOK(OnExitGame, void(int32_t fileNum)); DEFINE_HOOK(OnGameFrameUpdate, void()); DEFINE_HOOK(OnReceiveItem, void(uint8_t item)); DEFINE_HOOK(OnSceneInit, void(int16_t sceneNum)); DEFINE_HOOK(OnPlayerUpdate, void()); DEFINE_HOOK(OnSaveFile, void(int32_t fileNum)); DEFINE_HOOK(OnLoadFile, void(int32_t fileNum)); DEFINE_HOOK(OnDeleteFile, void(int32_t fileNum)); DEFINE_HOOK(OnDialogMessage, void()); DEFINE_HOOK(OnPresentTitleCard, void()); DEFINE_HOOK(OnInterfaceUpdate, void()); DEFINE_HOOK(OnKaleidoscopeUpdate, void(int16_t inDungeonScene)); DEFINE_HOOK(OnPresentFileSelect, void()); DEFINE_HOOK(OnUpdateFileSelectSelection, void(uint16_t optionIndex)); DEFINE_HOOK(OnUpdateFileCopySelection, void(uint16_t optionIndex)); DEFINE_HOOK(OnUpdateFileCopyConfirmationSelection, void(uint16_t optionIndex)); DEFINE_HOOK(OnUpdateFileEraseSelection, void(uint16_t optionIndex)); DEFINE_HOOK(OnUpdateFileEraseConfirmationSelection, void(uint16_t optionIndex)); DEFINE_HOOK(OnUpdateFileAudioSelection, void(uint8_t optionIndex)); DEFINE_HOOK(OnUpdateFileTargetSelection, void(uint8_t optionIndex)); DEFINE_HOOK(OnSetGameLanguage, void()); // Helpers static bool IsSaveLoaded(); static bool IsGameplayPaused(); static bool CanSpawnEnemy(); class RawAction { public: static void AddOrRemoveHealthContainers(int16_t amount); static void AddOrRemoveMagic(int8_t amount); static void HealOrDamagePlayer(int16_t hearts); static void SetPlayerHealth(int16_t hearts); static void SetLinkInvisibility(bool active); static void SetWeatherStorm(bool active); static void ForceEquipBoots(int8_t boots); static void FreezePlayer(); static void BurnPlayer(); static void ElectrocutePlayer(); static void KnockbackPlayer(float strength); static void GiveDekuShield(); static void SpawnCuccoStorm(); static void ForceInterfaceUpdate(); static GameInteractionEffectQueryResult SpawnEnemyWithOffset(uint32_t enemyId, int32_t enemyParams); }; }; #endif /* __cplusplus */ #endif /* GameInteractor_h */