diff --git a/soh/soh/Enhancements/Cheats/DekuStick.cpp b/soh/soh/Enhancements/Cheats/DekuStick.cpp new file mode 100644 index 000000000..8afa0e330 --- /dev/null +++ b/soh/soh/Enhancements/Cheats/DekuStick.cpp @@ -0,0 +1,27 @@ +#include +#include "soh/Enhancements/enhancementTypes.h" +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" + +extern "C" { +extern PlayState* gPlayState; +#include "macros.h" +} + +#define CVAR_DEKU_STICK_NAME CVAR_CHEAT("DekuStick") +#define CVAR_DEKU_STICK_DEFAULT DEKU_STICK_NORMAL +#define CVAR_DEKU_STICK_VALUE CVarGetInteger(CVAR_DEKU_STICK_NAME, CVAR_DEKU_STICK_DEFAULT) + +void RegisterDekuStickCheats() { + COND_VB_SHOULD(VB_DEKU_STICK_BREAK, CVAR_DEKU_STICK_VALUE != DEKU_STICK_NORMAL, { *should = false; }); + COND_VB_SHOULD(VB_DEKU_STICK_BURN_OUT, CVAR_DEKU_STICK_VALUE != DEKU_STICK_NORMAL, { *should = false; }); + COND_VB_SHOULD(VB_DEKU_STICK_BURN_DOWN, CVAR_DEKU_STICK_VALUE != DEKU_STICK_NORMAL, { *should = false; }); + COND_VB_SHOULD(VB_DEKU_STICK_BE_ON_FIRE, CVAR_DEKU_STICK_VALUE == DEKU_STICK_UNBREAKABLE_AND_ALWAYS_ON_FIRE, { + Player* player = GET_PLAYER(gPlayState); + player->unk_860 = 200; // Keeps the stick's flame lit + player->unk_85C = 1.0f; // Ensures the stick is the proper length + *should = true; + }); +} + +static RegisterShipInitFunc initFunc(RegisterDekuStickCheats, { CVAR_DEKU_STICK_NAME }); diff --git a/soh/soh/Enhancements/Cheats/EasyISG.cpp b/soh/soh/Enhancements/Cheats/EasyISG.cpp new file mode 100644 index 000000000..f48788a9d --- /dev/null +++ b/soh/soh/Enhancements/Cheats/EasyISG.cpp @@ -0,0 +1,27 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" + +extern "C" { +extern PlayState* gPlayState; +#include "macros.h" +} + +#define CVAR_EASY_ISG_NAME CVAR_CHEAT("EasyISG") +#define CVAR_EASY_ISG_DEFAULT 0 +#define CVAR_EASY_ISG_VALUE CVarGetInteger(CVAR_EASY_ISG_NAME, CVAR_EASY_ISG_DEFAULT) + +void OnGameFrameUpdateEasyISG() { + if (!GameInteractor::IsSaveLoaded(true)) { + return; + } + + Player* player = GET_PLAYER(gPlayState); + player->meleeWeaponState = 1; +} + +void RegisterEasyISG() { + COND_HOOK(OnGameFrameUpdate, CVAR_EASY_ISG_VALUE, OnGameFrameUpdateEasyISG); +} + +static RegisterShipInitFunc initFunc(RegisterEasyISG, { CVAR_EASY_ISG_NAME }); diff --git a/soh/soh/Enhancements/Cheats/EasyQPA.cpp b/soh/soh/Enhancements/Cheats/EasyQPA.cpp new file mode 100644 index 000000000..096123cdd --- /dev/null +++ b/soh/soh/Enhancements/Cheats/EasyQPA.cpp @@ -0,0 +1,28 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" + +extern "C" { +extern PlayState* gPlayState; +#include "macros.h" +} + +#define CVAR_EASY_QPA_NAME CVAR_CHEAT("EasyQPA") +#define CVAR_EASY_QPA_DEFAULT 0 +#define CVAR_EASY_QPA_VALUE CVarGetInteger(CVAR_EASY_QPA_NAME, CVAR_EASY_QPA_DEFAULT) + +void OnGameFrameUpdateEasyQPA() { + if (!GameInteractor::IsSaveLoaded(true)) { + return; + } + + Player* player = GET_PLAYER(gPlayState); + player->meleeWeaponQuads[0].info.toucher.dmgFlags = 0x16171617; + player->meleeWeaponQuads[1].info.toucher.dmgFlags = 0x16171617; +} + +void RegisterEasyQPA() { + COND_HOOK(OnGameFrameUpdate, CVAR_EASY_QPA_VALUE, OnGameFrameUpdateEasyQPA); +} + +static RegisterShipInitFunc initFunc(RegisterEasyQPA, { CVAR_EASY_QPA_NAME }); diff --git a/soh/soh/Enhancements/Cheats/FreezeTime.cpp b/soh/soh/Enhancements/Cheats/FreezeTime.cpp new file mode 100644 index 000000000..2296c4fc9 --- /dev/null +++ b/soh/soh/Enhancements/Cheats/FreezeTime.cpp @@ -0,0 +1,39 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" +#include "z64save.h" + +extern "C" SaveContext gSaveContext; + +#define CVAR_FREEZE_TIME_NAME CVAR_CHEAT("FreezeTime") +#define CVAR_FREEZE_TIME_DEFAULT 0 +#define CVAR_FREEZE_TIME_VALUE CVarGetInteger(CVAR_FREEZE_TIME_NAME, CVAR_FREEZE_TIME_DEFAULT) + +#define CVAR_PREV_TIME_NAME CVAR_GENERAL("PrevTime") +#define CVAR_PREV_TIME_DEFAULT -1 +#define CVAR_PREV_TIME_VALUE CVarGetInteger(CVAR_PREV_TIME_NAME, CVAR_PREV_TIME_DEFAULT) + +void OnGameFrameUpdateFreezeTime() { + if (!GameInteractor::IsSaveLoaded(true)) { + return; + } + + if (CVAR_PREV_TIME_VALUE == CVAR_PREV_TIME_DEFAULT) { + CVarSetInteger(CVAR_PREV_TIME_NAME, gSaveContext.dayTime); + } + + gSaveContext.dayTime = CVAR_PREV_TIME_VALUE; +} + +void RegisterFreezeTime() { + static HOOK_ID hookId = 0; + GameInteractor::Instance->UnregisterGameHook(hookId); + hookId = 0; + if (CVAR_FREEZE_TIME_VALUE) { + hookId = GameInteractor::Instance->RegisterGameHook(OnGameFrameUpdateFreezeTime); + } else { + CVarClear(CVAR_PREV_TIME_NAME); + } +} + +static RegisterShipInitFunc initFunc(RegisterFreezeTime, { CVAR_FREEZE_TIME_NAME }); diff --git a/soh/soh/Enhancements/Cheats/Infinite/Ammo.cpp b/soh/soh/Enhancements/Cheats/Infinite/Ammo.cpp new file mode 100644 index 000000000..b54b330bf --- /dev/null +++ b/soh/soh/Enhancements/Cheats/Infinite/Ammo.cpp @@ -0,0 +1,35 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" +#include "z64save.h" + +extern "C" { +extern SaveContext gSaveContext; +#include "variables.h" +#include "macros.h" +} + +#define CVAR_INFINITE_AMMO_NAME CVAR_CHEAT("InfiniteAmmo") +#define CVAR_INFINITE_AMMO_DEFAULT 0 +#define CVAR_INFINITE_AMMO_VALUE CVarGetInteger(CVAR_INFINITE_AMMO_NAME, CVAR_INFINITE_AMMO_DEFAULT) + +void OnGameFrameUpdateInfiniteAmmo() { + if (!GameInteractor::IsSaveLoaded(true)) { + return; + } + + AMMO(ITEM_STICK) = CUR_CAPACITY(UPG_STICKS); + AMMO(ITEM_NUT) = CUR_CAPACITY(UPG_NUTS); + AMMO(ITEM_BOMB) = CUR_CAPACITY(UPG_BOMB_BAG); + AMMO(ITEM_BOW) = CUR_CAPACITY(UPG_QUIVER); + AMMO(ITEM_SLINGSHOT) = CUR_CAPACITY(UPG_BULLET_BAG); + if (INV_CONTENT(ITEM_BOMBCHU) != ITEM_NONE) { + AMMO(ITEM_BOMBCHU) = 50; + } +} + +void RegisterInfiniteAmmo() { + COND_HOOK(OnGameFrameUpdate, CVAR_INFINITE_AMMO_VALUE, OnGameFrameUpdateInfiniteAmmo); +} + +static RegisterShipInitFunc initFunc(RegisterInfiniteAmmo, { CVAR_INFINITE_AMMO_NAME }); diff --git a/soh/soh/Enhancements/Cheats/Infinite/Health.cpp b/soh/soh/Enhancements/Cheats/Infinite/Health.cpp new file mode 100644 index 000000000..d731059e5 --- /dev/null +++ b/soh/soh/Enhancements/Cheats/Infinite/Health.cpp @@ -0,0 +1,24 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" +#include "z64save.h" + +extern "C" SaveContext gSaveContext; + +#define CVAR_INFINITE_HEALTH_NAME CVAR_CHEAT("InfiniteHealth") +#define CVAR_INFINITE_HEALTH_DEFAULT 0 +#define CVAR_INFINITE_HEALTH_VALUE CVarGetInteger(CVAR_INFINITE_HEALTH_NAME, CVAR_INFINITE_HEALTH_DEFAULT) + +void OnGameFrameUpdateInfiniteHealth() { + if (!GameInteractor::IsSaveLoaded(true)) { + return; + } + + gSaveContext.health = gSaveContext.healthCapacity; +} + +void RegisterInfiniteHealth() { + COND_HOOK(OnGameFrameUpdate, CVAR_INFINITE_HEALTH_VALUE, OnGameFrameUpdateInfiniteHealth); +} + +static RegisterShipInitFunc initFunc(RegisterInfiniteHealth, { CVAR_INFINITE_HEALTH_NAME }); diff --git a/soh/soh/Enhancements/Cheats/Infinite/Magic.cpp b/soh/soh/Enhancements/Cheats/Infinite/Magic.cpp new file mode 100644 index 000000000..d078316c9 --- /dev/null +++ b/soh/soh/Enhancements/Cheats/Infinite/Magic.cpp @@ -0,0 +1,24 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" +#include "z64save.h" + +extern "C" SaveContext gSaveContext; + +#define CVAR_INFINITE_MAGIC_NAME CVAR_CHEAT("InfiniteMagic") +#define CVAR_INFINITE_MAGIC_DEFAULT 0 +#define CVAR_INFINITE_MAGIC_VALUE CVarGetInteger(CVAR_INFINITE_MAGIC_NAME, CVAR_INFINITE_MAGIC_DEFAULT) + +void OnGameFrameUpdateInfiniteMagic() { + if (!GameInteractor::IsSaveLoaded(true)) { + return; + } + + gSaveContext.magic = gSaveContext.magicLevel * MAGIC_NORMAL_METER; +} + +void RegisterInfiniteMagic() { + COND_HOOK(OnGameFrameUpdate, CVAR_INFINITE_MAGIC_VALUE, OnGameFrameUpdateInfiniteMagic); +} + +static RegisterShipInitFunc initFunc(RegisterInfiniteMagic, { CVAR_INFINITE_MAGIC_NAME }); diff --git a/soh/soh/Enhancements/Cheats/Infinite/Money.cpp b/soh/soh/Enhancements/Cheats/Infinite/Money.cpp new file mode 100644 index 000000000..292f65065 --- /dev/null +++ b/soh/soh/Enhancements/Cheats/Infinite/Money.cpp @@ -0,0 +1,32 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" +#include "z64save.h" +#include "variables.h" + +extern "C" { +extern SaveContext gSaveContext; +extern s32 Flags_GetRandomizerInf(RandomizerInf flag); +#include "macros.h" +} + +#define CVAR_INFINITE_MONEY_NAME CVAR_CHEAT("InfiniteMoney") +#define CVAR_INFINITE_MONEY_DEFAULT 0 +#define CVAR_INFINITE_MONEY_VALUE CVarGetInteger(CVAR_INFINITE_MONEY_NAME, CVAR_INFINITE_MONEY_DEFAULT) + +void OnGameFrameUpdateInfiniteMoney() { + if ( + !GameInteractor::IsSaveLoaded(true) || + (IS_RANDO && !Flags_GetRandomizerInf(RAND_INF_HAS_WALLET)) + ) { + return; + } + + gSaveContext.rupees = CUR_CAPACITY(UPG_WALLET); +} + +void RegisterInfiniteMoney() { + COND_HOOK(OnGameFrameUpdate, CVAR_INFINITE_MONEY_VALUE, OnGameFrameUpdateInfiniteMoney); +} + +static RegisterShipInitFunc initFunc(RegisterInfiniteMoney, { CVAR_INFINITE_MONEY_NAME }); diff --git a/soh/soh/Enhancements/Cheats/Infinite/NayrusLove.cpp b/soh/soh/Enhancements/Cheats/Infinite/NayrusLove.cpp new file mode 100644 index 000000000..0bea9afc9 --- /dev/null +++ b/soh/soh/Enhancements/Cheats/Infinite/NayrusLove.cpp @@ -0,0 +1,24 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" +#include "z64save.h" + +extern "C" SaveContext gSaveContext; + +#define CVAR_INFINITE_NAYRUS_LOVE_NAME CVAR_CHEAT("InfiniteNayru") +#define CVAR_INFINITE_NAYRUS_LOVE_DEFAULT 0 +#define CVAR_INFINITE_NAYRUS_LOVE_VALUE CVarGetInteger(CVAR_INFINITE_NAYRUS_LOVE_NAME, CVAR_INFINITE_NAYRUS_LOVE_DEFAULT) + +void OnGameFrameUpdateInfiniteNayrusLove() { + if (!GameInteractor::IsSaveLoaded(true)) { + return; + } + + gSaveContext.nayrusLoveTimer = 0x44B; +} + +void RegisterInfiniteNayrusLove() { + COND_HOOK(OnGameFrameUpdate, CVAR_INFINITE_NAYRUS_LOVE_VALUE, OnGameFrameUpdateInfiniteNayrusLove); +} + +static RegisterShipInitFunc initFunc(RegisterInfiniteNayrusLove, { CVAR_INFINITE_NAYRUS_LOVE_NAME }); diff --git a/soh/soh/Enhancements/Cheats/MoonJump.cpp b/soh/soh/Enhancements/Cheats/MoonJump.cpp index e741fbb82..fb13c1c7b 100644 --- a/soh/soh/Enhancements/Cheats/MoonJump.cpp +++ b/soh/soh/Enhancements/Cheats/MoonJump.cpp @@ -3,11 +3,11 @@ #include "soh/ShipInit.hpp" extern "C" { -#include "macros.h" extern PlayState* gPlayState; +#include "macros.h" } -#define CVAR_MOON_JUMP_NAME "gCheats.MoonJumpOnL" +#define CVAR_MOON_JUMP_NAME CVAR_CHEAT("MoonJumpOnL") #define CVAR_MOON_JUMP_DEFAULT 0 #define CVAR_MOON_JUMP_VALUE CVarGetInteger(CVAR_MOON_JUMP_NAME, CVAR_MOON_JUMP_DEFAULT) diff --git a/soh/soh/Enhancements/Cheats/UnrestrictedItems.cpp b/soh/soh/Enhancements/Cheats/UnrestrictedItems.cpp new file mode 100644 index 000000000..0b5aaebbc --- /dev/null +++ b/soh/soh/Enhancements/Cheats/UnrestrictedItems.cpp @@ -0,0 +1,26 @@ +#include +#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" +#include "soh/ShipInit.hpp" + +extern "C" PlayState* gPlayState; + +#define CVAR_UNRESTRICTED_ITEMS_NAME CVAR_CHEAT("NoRestrictItems") +#define CVAR_UNRESTRICTED_ITEMS_DEFAULT 0 +#define CVAR_UNRESTRICTED_ITEMS_VALUE CVarGetInteger(CVAR_UNRESTRICTED_ITEMS_NAME, CVAR_UNRESTRICTED_ITEMS_DEFAULT) + +void OnGameFrameUpdateUnrestrictedItems() { + if (!GameInteractor::IsSaveLoaded(true)) { + return; + } + + // do not allow the use of sun's song even with the cheat + u8 sunsBackup = gPlayState->interfaceCtx.restrictions.sunsSong; + memset(&gPlayState->interfaceCtx.restrictions, 0, sizeof(gPlayState->interfaceCtx.restrictions)); + gPlayState->interfaceCtx.restrictions.sunsSong = sunsBackup; +} + +void RegisterUnrestrictedItems() { + COND_HOOK(OnGameFrameUpdate, CVAR_UNRESTRICTED_ITEMS_VALUE, OnGameFrameUpdateUnrestrictedItems); +} + +static RegisterShipInitFunc initFunc(RegisterUnrestrictedItems, { CVAR_UNRESTRICTED_ITEMS_NAME }); diff --git a/soh/soh/Enhancements/cheat_hook_handlers.cpp b/soh/soh/Enhancements/cheat_hook_handlers.cpp deleted file mode 100644 index 20c85d4d4..000000000 --- a/soh/soh/Enhancements/cheat_hook_handlers.cpp +++ /dev/null @@ -1,58 +0,0 @@ -#include -#include "soh/OTRGlobals.h" -#include "soh/Enhancements/game-interactor/GameInteractor.h" -#include "soh/Enhancements/game-interactor/GameInteractor_Hooks.h" -#include "soh/Enhancements/enhancementTypes.h" - -extern "C" { -#include "macros.h" -#include "variables.h" - -extern SaveContext gSaveContext; -extern PlayState* gPlayState; -} - -void CheatsOnVanillaBehaviorHandler(GIVanillaBehavior id, bool* should, va_list originalArgs) { - switch (id) { - case VB_DEKU_STICK_BREAK: { - if (CVarGetInteger(CVAR_CHEAT("DekuStick"), DEKU_STICK_NORMAL) != DEKU_STICK_NORMAL) { - *should = false; - } - break; - } - case VB_DEKU_STICK_BE_ON_FIRE: { - if (CVarGetInteger(CVAR_CHEAT("DekuStick"), DEKU_STICK_NORMAL) == DEKU_STICK_UNBREAKABLE_AND_ALWAYS_ON_FIRE) { - Player* player = GET_PLAYER(gPlayState); - player->unk_860 = 200; // Keeps the stick's flame lit - player->unk_85C = 1.0f; // Ensures the stick is the proper length - *should = true; - } - break; - } - case VB_DEKU_STICK_BURN_OUT: { - if (CVarGetInteger(CVAR_CHEAT("DekuStick"), DEKU_STICK_NORMAL) != DEKU_STICK_NORMAL) { - *should = false; - } - break; - } - case VB_DEKU_STICK_BURN_DOWN: { - if (CVarGetInteger(CVAR_CHEAT("DekuStick"), DEKU_STICK_NORMAL) != DEKU_STICK_NORMAL) { - *should = false; - } - break; - } - default: - break; - } -} - -static uint32_t onVanillaBehaviorHook = 0; -void CheatsRegisterHooks() { - GameInteractor::Instance->RegisterGameHook([](int32_t fileNum) mutable { - - GameInteractor::Instance->UnregisterGameHook(onVanillaBehaviorHook); - onVanillaBehaviorHook = 0; - onVanillaBehaviorHook = GameInteractor::Instance->RegisterGameHook(CheatsOnVanillaBehaviorHandler); - - }); -} diff --git a/soh/soh/Enhancements/cheat_hook_handlers.h b/soh/soh/Enhancements/cheat_hook_handlers.h deleted file mode 100644 index 88a79f285..000000000 --- a/soh/soh/Enhancements/cheat_hook_handlers.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef CHEAT_HOOK_HANDLERS_H -#define CHEAT_HOOK_HANDLERS_H - -void CheatsRegisterHooks(); - -#endif // CHEAT_HOOK_HANDLERS_H diff --git a/soh/soh/Enhancements/game-interactor/GameInteractor.h b/soh/soh/Enhancements/game-interactor/GameInteractor.h index a6aa85a61..459d50628 100644 --- a/soh/soh/Enhancements/game-interactor/GameInteractor.h +++ b/soh/soh/Enhancements/game-interactor/GameInteractor.h @@ -633,7 +633,7 @@ struct HookInfo { #define COND_VB_SHOULD(id, condition, body) \ { \ static HOOK_ID hookId = 0; \ - GameInteractor::Instance->UnregisterGameHookForID(hookId); \ + GameInteractor::Instance->UnregisterGameHookForID(hookId); \ hookId = 0; \ if (condition) { \ hookId = REGISTER_VB_SHOULD(id, body); \ diff --git a/soh/soh/Enhancements/mods.cpp b/soh/soh/Enhancements/mods.cpp index 19cd34b89..1753dc30c 100644 --- a/soh/soh/Enhancements/mods.cpp +++ b/soh/soh/Enhancements/mods.cpp @@ -15,7 +15,6 @@ #include "soh/Enhancements/nametag.h" #include "soh/Enhancements/timesaver_hook_handlers.h" #include "soh/Enhancements/TimeSavers/TimeSavers.h" -#include "soh/Enhancements/cheat_hook_handlers.h" #include "soh/Enhancements/randomizer/hook_handlers.h" #include "objects/object_gi_compass/object_gi_compass.h" @@ -68,136 +67,6 @@ static const ALIGN_ASSET(2) char tokinoma_room_0DL_007A70[] = dtokinoma_room_0DL #define dtokinoma_room_0DL_007FD0 "__OTR__scenes/shared/tokinoma_scene/tokinoma_room_0DL_007FD0" static const ALIGN_ASSET(2) char tokinoma_room_0DL_007FD0[] = dtokinoma_room_0DL_007FD0; -void RegisterInfiniteMoney() { - GameInteractor::Instance->RegisterGameHook([]() { - if (!GameInteractor::IsSaveLoaded(true)) return; - if (CVarGetInteger(CVAR_CHEAT("InfiniteMoney"), 0) != 0 && (!IS_RANDO || Flags_GetRandomizerInf(RAND_INF_HAS_WALLET))) { - if (gSaveContext.rupees < CUR_CAPACITY(UPG_WALLET)) { - gSaveContext.rupees = CUR_CAPACITY(UPG_WALLET); - } - } - }); -} - -void RegisterInfiniteHealth() { - GameInteractor::Instance->RegisterGameHook([]() { - if (!GameInteractor::IsSaveLoaded(true)) return; - if (CVarGetInteger(CVAR_CHEAT("InfiniteHealth"), 0) != 0) { - if (gSaveContext.health < gSaveContext.healthCapacity) { - gSaveContext.health = gSaveContext.healthCapacity; - } - } - }); -} - -void RegisterInfiniteAmmo() { - GameInteractor::Instance->RegisterGameHook([]() { - if (!GameInteractor::IsSaveLoaded(true)) return; - if (CVarGetInteger(CVAR_CHEAT("InfiniteAmmo"), 0) != 0) { - // Deku Sticks - if (AMMO(ITEM_STICK) < CUR_CAPACITY(UPG_STICKS)) { - AMMO(ITEM_STICK) = CUR_CAPACITY(UPG_STICKS); - } - - // Deku Nuts - if (AMMO(ITEM_NUT) < CUR_CAPACITY(UPG_NUTS)) { - AMMO(ITEM_NUT) = CUR_CAPACITY(UPG_NUTS); - } - - // Bombs - if (AMMO(ITEM_BOMB) < CUR_CAPACITY(UPG_BOMB_BAG)) { - AMMO(ITEM_BOMB) = CUR_CAPACITY(UPG_BOMB_BAG); - } - - // Fairy Bow (Ammo) - if (AMMO(ITEM_BOW) < CUR_CAPACITY(UPG_QUIVER)) { - AMMO(ITEM_BOW) = CUR_CAPACITY(UPG_QUIVER); - } - - // Fairy Slingshot (Ammo) - if (AMMO(ITEM_SLINGSHOT) < CUR_CAPACITY(UPG_BULLET_BAG)) { - AMMO(ITEM_SLINGSHOT) = CUR_CAPACITY(UPG_BULLET_BAG); - } - - // Bombchus (max: 50, no upgrades) - if (INV_CONTENT(ITEM_BOMBCHU) == ITEM_BOMBCHU && AMMO(ITEM_BOMBCHU) < 50) { - AMMO(ITEM_BOMBCHU) = 50; - } - } - }); -} - -void RegisterInfiniteMagic() { - GameInteractor::Instance->RegisterGameHook([]() { - if (!GameInteractor::IsSaveLoaded(true)) return; - if (CVarGetInteger(CVAR_CHEAT("InfiniteMagic"), 0) != 0) { - if (gSaveContext.isMagicAcquired && gSaveContext.magic != (gSaveContext.isDoubleMagicAcquired + 1) * 0x30) { - gSaveContext.magic = (gSaveContext.isDoubleMagicAcquired + 1) * 0x30; - } - } - }); -} - -void RegisterInfiniteNayrusLove() { - GameInteractor::Instance->RegisterGameHook([]() { - if (!GameInteractor::IsSaveLoaded(true)) return; - if (CVarGetInteger(CVAR_CHEAT("InfiniteNayru"), 0) != 0) { - gSaveContext.nayrusLoveTimer = 0x44B; - } - }); -} - -void RegisterInfiniteISG() { - GameInteractor::Instance->RegisterGameHook([]() { - if (!GameInteractor::IsSaveLoaded(true)) return; - - if (CVarGetInteger(CVAR_CHEAT("EasyISG"), 0) != 0) { - Player* player = GET_PLAYER(gPlayState); - player->meleeWeaponState = 1; - } - }); -} - -//Permanent quick put away (QPA) glitched damage value -void RegisterEzQPA() { - GameInteractor::Instance->RegisterGameHook([]() { - if (!GameInteractor::IsSaveLoaded(true)) return; - - if (CVarGetInteger(CVAR_CHEAT("EasyQPA"), 0) != 0) { - Player* player = GET_PLAYER(gPlayState); - player->meleeWeaponQuads[0].info.toucher.dmgFlags = 0x16171617; - player->meleeWeaponQuads[1].info.toucher.dmgFlags = 0x16171617; - } - }); -} - -void RegisterUnrestrictedItems() { - GameInteractor::Instance->RegisterGameHook([]() { - if (!GameInteractor::IsSaveLoaded(true)) return; - - if (CVarGetInteger(CVAR_CHEAT("NoRestrictItems"), 0) != 0) { - u8 sunsBackup = gPlayState->interfaceCtx.restrictions.sunsSong; - memset(&gPlayState->interfaceCtx.restrictions, 0, sizeof(gPlayState->interfaceCtx.restrictions)); - gPlayState->interfaceCtx.restrictions.sunsSong = sunsBackup; - } - }); -} - -void RegisterFreezeTime() { - GameInteractor::Instance->RegisterGameHook([]() { - if (CVarGetInteger(CVAR_CHEAT("FreezeTime"), 0) != 0) { - if (CVarGetInteger(CVAR_GENERAL("PrevTime"), -1) == -1) { - CVarSetInteger(CVAR_GENERAL("PrevTime"), gSaveContext.dayTime); - } - - int32_t prevTime = CVarGetInteger(CVAR_GENERAL("PrevTime"), gSaveContext.dayTime); - gSaveContext.dayTime = prevTime; - } else { - CVarClear(CVAR_GENERAL("PrevTime")); - } - }); -} - /// Switches Link's age and respawns him at the last entrance he entered. void SwitchAge() { if (gPlayState == NULL) return; @@ -1476,18 +1345,8 @@ void InitMods() { BossRush_RegisterHooks(); RandomizerRegisterHooks(); TimeSaverRegisterHooks(); - CheatsRegisterHooks(); TimeSavers_Register(); RegisterTTS(); - RegisterInfiniteMoney(); - RegisterInfiniteHealth(); - RegisterInfiniteAmmo(); - RegisterInfiniteMagic(); - RegisterInfiniteNayrusLove(); - RegisterInfiniteISG(); - RegisterEzQPA(); - RegisterUnrestrictedItems(); - RegisterFreezeTime(); RegisterOcarinaTimeTravel(); RegisterAutoSave(); RegisterDaytimeGoldSkultullas();