dMenu_Ring_c hooks

This commit is contained in:
gymnast86
2026-08-17 01:54:00 -07:00
parent 9090ee80ab
commit 4c673eb04b
2 changed files with 131 additions and 1 deletions
+1 -1
View File
@@ -84,7 +84,7 @@ public:
void drawFlag0() { mDrawFlag = 0; }
void setStatus(u8 i_status) { mStatus = i_status; }
private:
// private:
/* 0x004 */ JKRExpHeap* mpHeap;
/* 0x008 */ STControl* mpStick;
/* 0x00C */ CSTControl* mpCStick;
+130
View File
@@ -7,6 +7,7 @@
#include "tools.h"
#include "item.hpp"
#include "item_ids.h"
#include "verify_item_functions.h"
#include <mods/svc/hook.hpp>
#include <mods/svc/log.hpp>
@@ -39,6 +40,8 @@
#include "d/d_file_sel_info.h"
#include "d/d_file_select.h"
#include "d/d_gameover.h"
#include "d/d_menu_item_explain.h"
#include "d/d_menu_ring.h"
#include "d/d_meter2_info.h"
#include "d/d_msg_object.h"
#include "d/d_s_name.h"
@@ -173,6 +176,12 @@ DEFINE_HOOK(&daObjZraRock_c::create, daObjZraRock_c__create);
#endif
// DEFINE_HOOK_SYMBOL(phase_1_dScnPly_sig, int(dScnPly_c*), phase_1__dScnPly_c);
DEFINE_HOOK(&dMenu_Ring_c::textScaleHIO, dMenu_Ring_c__textScaleHIO);
DEFINE_HOOK_SYMBOL("dMenu_Ring_c::~dMenu_Ring_c", void(dMenu_Ring_c*), dMenu_Ring_c__destructor);
DEFINE_HOOK(&dMenu_Ring_c::setActiveCursor, dMenu_Ring_c__setActiveCursor);
DEFINE_HOOK(&dMenu_Ring_c::getItemMaxNum, dMenu_Ring_c__getItemMaxNum);
DEFINE_HOOK(&dMenu_Ring_c::getItemNum, dMenu_Ring_c__getItemNum);
namespace randomizer::ui {
dialogSelectModeState g_dialogSelectModeState = SelectReady;
}
@@ -2469,6 +2478,115 @@ void hookPostScnPlyPhase1(ModContext*, void*, void*, void*) {
}
}
J2DPicture* dpadIcon{};
void hookPostMenuRingTextScaleHIO(ModContext*, void* args, void*, void*) {
auto menuRing = mods::arg<dMenu_Ring_c*>(args, 0);
if (menuRing->mItemSlots[menuRing->mCurrentSlot] == 0x15) {
// Draw d-pad icon to indicate switching between Ilia quest items
if (getWarashibeItemCount() >= 2) {
if (dpadIcon == nullptr) {
dpadIcon = JKR_NEW J2DPicture((ResTIMG*)dComIfGp_getMain2DArchive()->getResource('TIMG', "font_51.bti"));
}
dpadIcon->setAlpha(menuRing->mAlphaRate * 255.0);
dpadIcon->draw(menuRing->mCenterPosX + 330.f, menuRing->mCenterPosY + 194.f, 30.f, 30.f, false, false, false);
}
}
}
void hookPostMenuRingDestructor(ModContext*, void*, void*, void*) {
if (dpadIcon != nullptr) {
JKR_DELETE(dpadIcon);
dpadIcon = nullptr;
}
}
void hookPostMenuRingSetActiveCursor(ModContext*, void* args, void*, void*) {
auto menuRing = mods::arg<dMenu_Ring_c*>(args, 0);
// Copy if else chain from inside the function but without any of the effects
u8 item = dComIfGs_getItem(menuRing->mItemSlots[menuRing->mCurrentSlot], false);
if (menuRing->mStatus == dMenu_Ring_c::STATUS_WAIT &&
menuRing->mOldStatus != dMenu_Ring_c::STATUS_EXPLAIN_FORCE &&
menuRing->mOldStatus != dMenu_Ring_c::STATUS_EXPLAIN &&
menuRing->mpItemExplain->getStatus() == 0)
{
if (mDoCPd_c::getTrigR(PAD_1) && !menuRing->mPlayerIsWolf && item != dItemNo_NONE_e) {
} else if (mDoCPd_c::getTrigX(PAD_1) && !menuRing->mPlayerIsWolf && item != dItemNo_NONE_e) {
} else if (mDoCPd_c::getTrigY(PAD_1) && !menuRing->mPlayerIsWolf && item != dItemNo_NONE_e) {
} else if (mDoCPd_c::getTrigX(PAD_1) || mDoCPd_c::getTrigY(PAD_1)) {
}
// And add our conditional onto the end
else if (menuRing->mItemSlots[menuRing->mCurrentSlot] == 0x15) {
// Allow switching quest items if dpad right is pressed
if (mDoCPd_c::getTrigRight(PAD_1)) {
setNextWarashibeItem();
// Update slot image
for (int i = 0; i < menuRing->mTotalItemTexToAlloc; i++) {
if (menuRing->mItemSlots[i] == 0x15) {
u8 questItem = dComIfGs_getItem(menuRing->mItemSlots[i], false);
s32 i_textureNum =
dMeter2Info_readItemTexture(questItem, menuRing->mpItemBuf[i][0], NULL, menuRing->mpItemBuf[i][1], NULL,
menuRing->mpItemBuf[i][2], NULL, NULL, NULL, -1);
for (int k = 0; k < i_textureNum; k++) {
// Delete old texture so we aren't leaking memory
if (menuRing->mpItemTex[i][k] != NULL) {
JKR_DELETE(menuRing->mpItemTex[i][k]);
}
menuRing->mpItemTex[i][k] = JKR_NEW J2DPicture(menuRing->mpItemBuf[i][k]);
menuRing->mpItemTex[i][k]->setBasePosition(J2DBasePosition_4);
}
dMeter2Info_setItemColor(questItem, menuRing->mpItemTex[i][0], menuRing->mpItemTex[i][1], menuRing->mpItemTex[i][2], NULL);
u8 texScale = dItem_data::getTexScale(questItem);
f32 fVar1 = (texScale / 100.0f);
f32 fVar2 = (menuRing->mpItemBuf[i][0]->width / 48.0f);
fVar1 = fVar2 * fVar1;
menuRing->mItemSlotParam1[i] = fVar1;
menuRing->mItemSlotParam2[i] = (menuRing->mpItemBuf[i][0]->height / 48.0f * (texScale / 100.0f));
}
}
}
}
}
}
void hookPostMenuRingGetItemMaxNum(ModContext*, void* args, void* retval, void*) {
auto i_slotNo = mods::arg<u8>(args, 1);
auto ret = static_cast<u8*>(retval);
u8 item = dComIfGs_getItem(i_slotNo, false);
switch (item) {
case dItemNo_Randomizer_ANCIENT_DOCUMENT_e:
case dItemNo_Randomizer_AIR_LETTER_e:
case dItemNo_Randomizer_ANCIENT_DOCUMENT2_e:
*ret = 6;
break;
default:
break;
}
}
void hookPostMenuRingGetItemNum(ModContext*, void* args, void* retval, void*) {
auto i_slotNo = mods::arg<u8>(args, 1);
auto ret = static_cast<u8*>(retval);
u8 item = dComIfGs_getItem(i_slotNo, false);
switch (item) {
case dItemNo_Randomizer_ANCIENT_DOCUMENT_e:
case dItemNo_Randomizer_AIR_LETTER_e:
case dItemNo_Randomizer_ANCIENT_DOCUMENT2_e:
*ret = getAncientDocumentNum();
break;
default:
break;
}
}
}
ModResult initialize() {
@@ -2606,6 +2724,12 @@ ModResult initialize() {
//ADD_HOOK_POST(phase_1__dScnPly_c, hookPostScnPlyPhase1);
ADD_HOOK_POST(dMenu_Ring_c__textScaleHIO, hookPostMenuRingTextScaleHIO);
ADD_HOOK_POST(dMenu_Ring_c__destructor, hookPostMenuRingDestructor);
ADD_HOOK_POST(dMenu_Ring_c__setActiveCursor, hookPostMenuRingSetActiveCursor);
ADD_HOOK_POST(dMenu_Ring_c__getItemMaxNum, hookPostMenuRingGetItemMaxNum);
ADD_HOOK_POST(dMenu_Ring_c__getItemNum, hookPostMenuRingGetItemNum);
return MOD_OK;
}
@@ -2718,6 +2842,12 @@ ModResult uninstall() {
//mods::hook::uninstall<phase_1__dScnPly_c>();
mods::hook::uninstall<dMenu_Ring_c__textScaleHIO>(svc_hook);
mods::hook::uninstall<dMenu_Ring_c__destructor>(svc_hook);
mods::hook::uninstall<dMenu_Ring_c__setActiveCursor>(svc_hook);
mods::hook::uninstall<dMenu_Ring_c__getItemMaxNum>(svc_hook);
mods::hook::uninstall<dMenu_Ring_c__getItemNum>(svc_hook);
return MOD_OK;
}
}