tp/src/d/d_menu_ring.cpp

2102 lines
76 KiB
C++

/**
* @file d_menu_ring.cpp
* @brief dolzel2 Menu - Item Wheel
*
*/
#include "d/d_menu_ring.h"
#include "JSystem/J2DGraph/J2DOrthoGraph.h"
#include "JSystem/J2DGraph/J2DTextBox.h"
#include "JSystem/JKernel/JKRExpHeap.h"
#include "SSystem/SComponent/c_math.h"
#include "d/actor/d_a_alink.h"
#include "d/d_item_data.h"
#include "d/d_kantera_icon_meter.h"
#include "d/d_lib.h"
#include "d/d_select_cursor.h"
#include "d/d_menu_item_explain.h"
#include "d/d_menu_window.h"
#include "d/d_meter2.h"
#include "d/d_meter2_draw.h"
#include "d/d_meter_HIO.h"
#include "d/d_meter2_info.h"
#include "d/d_msg_string.h"
#include "m_Do/m_Do_controller_pad.h"
#include "m_Do/m_Do_graphic.h"
#include "string.h"
#include "stdio.h"
/* 803BDE70-803BDE7C 01AF90 000C+00 1/1 0/0 0/0 .data cNullVec__6Z2Calc */
static u8 cNullVec__6Z2Calc[12] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
/* 803BDEAC-803BDEDC 01AFCC 0030+00 3/4 0/0 0/0 .data stick_init */
typedef void (dMenu_Ring_c::*initFunc)();
static initFunc stick_init[] = {
/* STATUS_WAIT */ &dMenu_Ring_c::stick_wait_init,
/* STATUS_MOVE */ &dMenu_Ring_c::stick_move_init,
/* STATUS_EXPLAIN */ &dMenu_Ring_c::stick_explain_init,
/* STATUS_EXPLAIN_FORCE */ &dMenu_Ring_c::stick_explain_force_init,
};
/* 803BDF0C-803BDF3C 01B02C 0030+00 1/2 0/0 0/0 .data stick_proc */
typedef void (dMenu_Ring_c::*procFunc)();
static procFunc stick_proc[] = {
/* STATUS_WAIT */ &dMenu_Ring_c::stick_wait_proc,
/* STATUS_MOVE */ &dMenu_Ring_c::stick_move_proc,
/* STATUS_EXPLAIN */ &dMenu_Ring_c::stick_explain_proc,
/* STATUS_EXPLAIN_FORCE */ &dMenu_Ring_c::stick_explain_force_proc,
};
/* 801E9118-801EA708 1E3A58 15F0+00 0/0 1/1 0/0 .text
* __ct__12dMenu_Ring_cFP10JKRExpHeapP9STControlP10CSTControlUc */
dMenu_Ring_c::dMenu_Ring_c(JKRExpHeap* i_heap, STControl* i_stick, CSTControl* i_cStick,
u8 i_ringOrigin) {
static const u64 xy_text[5] = {
'yx_text', 'yx_te_s1', 'yx_te_s2', 'yx_te_s3', 'yx_te_s4',
};
static const u64 fxy_text[5] = {
'fyx_tex', 'fyx_te_1', 'fyx_te_2', 'fyx_te_3', 'fyx_te_4',
};
static const u64 c_text[5] = {
'c_text', 'c_te_s1', 'c_te_s2', 'c_te_s3', 'c_te_s4',
};
static const u64 fc_text[5] = {
'fc_text', 'fc_te_s1', 'fc_te_s2', 'fc_te_s3', 'fc_te_s4',
};
static const u64 c_text1[5] = {
'c_text1', 'c_texs1', 'c_texs2', 'c_texs3', 'c_texs4',
};
static const u64 fc_text1[5] = {
'fc_text1', 'fc_texs1', 'fc_texs2', 'fc_texs3', 'fc_texs4',
};
static const u64 t_on[5] = {
'gr_t_on', 'g_tof_s5', 'g_tof_s6', 'g_tof_s7', 'g_tof_s8',
};
static const u64 ft_on[5] = {
'fr_t_on', 'f_tof_s5', 'f_tof_s6', 'f_tof_s7', 'f_tof_s8',
};
static const u64 t_off[5] = {
'gr_t_of', 'g_tof_s1', 'g_tof_s2', 'g_tof_s3', 'g_tof_s4',
};
static const u64 ft_off[5] = {
'fr_t_of', 'f_tof_s1', 'f_tof_s2', 'f_tof_s3', 'f_tof_s4',
};
mpHeap = i_heap;
mpStick = i_stick;
mpCStick = i_cStick;
mRingOrigin = i_ringOrigin;
dMeter2Info_setItemExplainWindowStatus(0);
mpHeap->getTotalFreeSize(); // in debug, this is used for a size check
mPikariFlashingSpeed = 0.0f;
if (mRingOrigin == 0) {
mCenterPosX = 0.0f;
mCenterPosY = 448.0f;
} else if (mRingOrigin == 2) {
mCenterPosX = 0.0f;
mCenterPosY = -448.0f;
}
if (mRingOrigin == 3) {
mCenterPosX = 608.0f;
mCenterPosY = 0.0f;
} else if (mRingOrigin == 1) {
mCenterPosX = -608.0f;
mCenterPosY = 0.0f;
} else {
mCenterPosX = 0.0f;
mCenterPosY = 0.0f;
}
mRingItemNamePosX = 0.0f;
mRingItemNamePosY = 0.0f;
mRingItemNameScale = 1.0f;
for (int i = 0; i < 10; i++) {
mRingGuidePosX[i] = 0.0f;
mRingGuidePosY[i] = 0.0f;
mRingGuideScale[i] = 1.0f;
}
mRingCursorScale = 1.0f;
mRingPosX = 0.0f;
mRingPosY = 0.0f;
mRingScaleH = 1.0f;
mRingScaleV = 1.0f;
mRingAlpha = 1.0f;
mPlayerIsWolf = daPy_py_c::i_checkNowWolf();
mNameStringID = 0;
field_0x63a = 0;
field_0x63c = 0;
mOpenCloseFrames = 0;
mStatus = STATUS_WAIT;
mOldStatus = STATUS_WAIT;
field_0x6b2 = 0;
mWaitFrames = 0;
mDirectSelectCursorPos.set(0.0f, 0.0f, 0.0f);
mCurrentSlot = SLOT_0;
field_0x6a9 = 0;
mXButtonSlot = 0xff;
mYButtonSlot = 0xff;
field_0x6ac = 0xff;
field_0x6ad = 0xff;
field_0x670 = 0;
field_0x67e = 0;
field_0x6b3 = 0;
mAlphaRate = 0.0f;
mDrawFlag = 0;
mTotalItemTexToAlloc = 0;
field_0x67c = 4;
field_0x6c5 = 0;
mCursorSpeed = 0;
field_0x684 = 0;
field_0x6c6 = 0;
field_0x6c4 = 0xff;
mDoStatus = 0;
field_0x6cb = 0xff;
field_0x6cd = 0xff;
mDirectSelectActive = false;
field_0x68e = 0;
field_0x6cf = 0xff;
field_0x6d0 = 0xff;
field_0x6d1 = 0xff;
field_0x6d2 = 0xff;
field_0x6d3 = 0xff;
int i;
for (int i = 0; i < 3; i++) {
field_0x580[i] = 0.0f;
field_0x574[i] = 0.0f;
}
field_0x6c3 = 0xff;
field_0x6c2 = 0;
for (int i = 0; i < 3; i++) {
mpResData[i] = NULL;
}
for (int i = 0; i < 4; i++) {
field_0x6c7[i] = 0xff;
}
switch (mRingOrigin) {
case 0:
field_0x682 = 0x8000;
break;
case 1:
field_0x682 = 0x4000;
break;
case 2:
field_0x682 = 0;
break;
default:
field_0x682 = 0xc000;
break;
}
for (int i = 0; i < 4; i++) {
field_0x674[i] = 0;
field_0x518[i] = 0.0f;
field_0x528[i] = 0.0f;
field_0x538[i] = 0.0f;
field_0x6b4[i] = 0;
field_0x6b8[i] = 0xff;
mpSelectItemTex[i][0] = NULL;
mpSelectItemTex[i][1] = NULL;
mpSelectItemTex[i][2] = NULL;
field_0x686[i] = 0;
}
for (int i = 0; i < MAX_ITEM_SLOTS; i++) {
mItemSlotPosY[i] = 0.0f;
mItemSlotPosX[i] = 0.0f;
for (int j = 0; j < 3; j++) {
mpItemTex[i][j] = NULL;
mpItemBuf[i][j] = NULL;
}
mItemSlots[i] = 0;
field_0x63e[i] = 0;
mItemSlotParam2[i] = 0.0f;
mItemSlotParam1[i] = 0.0f;
}
for (int i = 0; i < MAX_ITEM_SLOTS; i++) {
if (dComIfGs_getLineUpItem(i) != NO_ITEM) {
mTotalItemTexToAlloc++;
}
}
if (mTotalItemTexToAlloc < 1) {
mItemsTotal = 1;
} else {
mItemsTotal = mTotalItemTexToAlloc;
}
for (int i = 0; i < MAX_ITEM_SLOTS; i++) {
mItemSlots[i] = dComIfGs_getLineUpItem(i);
}
for (int i = 0; i < mItemsTotal; i++) {
mItemSlots[i] = dComIfGs_getLineUpItem(i);
if (dComIfGs_getSelectItemIndex(0) == dComIfGs_getLineUpItem(i)) {
mXButtonSlot = i;
}
if (dComIfGs_getSelectItemIndex(1) == dComIfGs_getLineUpItem(i)) {
mYButtonSlot = i;
}
if (dComIfGs_getSelectItemIndex(2) == dComIfGs_getWolfAbility(i)) {
field_0x6ac = i;
}
}
mRingRadiusH = g_ringHIO.mRingRadiusH;
mRingRadiusV = g_ringHIO.mRingRadiusV;
field_0x66e = 0x8000;
field_0x634 = 0x10000 / mItemsTotal;
for (int i = 0; i < MAX_SELECT_ITEM; i++) {
for (int j = 0; j < 3; j++) {
for (int k = 0; k < SELECT_ITEM_NUM; k++) {
mpSelectItemTexBuf[i][j][k] = (ResTIMG*)mpHeap->alloc(0xC00, 0x20);
}
}
field_0x6be[i] = 0;
if (i == 2) {
setSelectItem(i, 0);
} else {
setSelectItem(i, 0x43);
}
for (int j = 0; j < 3; j++) {
mpSelectItemTex[i][j] = new J2DPicture(mpSelectItemTexBuf[i][field_0x6be[i]][0]);
mpSelectItemTex[i][j]->setBasePosition(J2DBasePosition_4);
}
field_0x548[i] = 0.0f;
field_0x558[i] = 0.0f;
}
ResTIMG* timg = (ResTIMG*)dComIfGp_getMain2DArchive()->getResource(
'TIMG', dMeter2Info_getNumberTextureName(0));
for (int i = 0; i < 3; i++) {
mpItemNumTex[i] = new J2DPicture(timg);
}
mpKanteraMeter = new dKantera_icon_c();
mpScreen = new J2DScreen();
dPaneClass_setPriority(&mpResData[0], mpHeap, mpScreen,
"SCRN/zelda_item_select_icon_message_ver2.blo", 0x20000,
dComIfGp_getRingResArchive());
dPaneClass_showNullPane(mpScreen);
mpMessageParent = new CPaneMgrAlpha(mpScreen, 'n_all', 2, NULL);
mpTextParent[0] = new CPaneMgr(mpScreen, 'r_n', 0, NULL);
mpTextParent[1] = new CPaneMgr(mpScreen, 'c_n', 2, NULL);
mpTextParent[1]->setAlphaRate(1.0f);
mpTextParent[2] = NULL;
mpTextParent[3] = new CPaneMgr(mpScreen, 'c_sen_n', 2, NULL);
mpTextParent[4] = new CPaneMgr(mpScreen, 'gr_n', 2, NULL);
mpTextParent[4]->hide();
for (int i = 5; i < 10; i++) {
mpTextParent[i] = NULL;
}
for (int i = 0; i < mTotalItemTexToAlloc; i++) {
for (int j = 0; j < 3; j++) {
mpItemBuf[i][j] = (ResTIMG*)mpHeap->alloc(0xC00, 0x20);
}
u8 item = dComIfGs_getItem(mItemSlots[i], false);
if (item != NO_ITEM) {
if (item == LIGHT_ARROW) {
// safety check to prevent attempts setting up a light arrow texture
item = BOW;
}
s32 i_textureNum =
dMeter2Info_readItemTexture(item, mpItemBuf[i][0], NULL, mpItemBuf[i][1], NULL,
mpItemBuf[i][2], NULL, NULL, NULL, -1);
for (int k = 0; k < i_textureNum; k++) {
mpItemTex[i][k] = new J2DPicture(mpItemBuf[i][k]);
mpItemTex[i][k]->setBasePosition(J2DBasePosition_4);
}
dMeter2Info_setItemColor(item, mpItemTex[i][0], mpItemTex[i][1], mpItemTex[i][2], NULL);
u8 texScale = dItem_data::getTexScale(item);
f32 fVar1 = (texScale / 100.0f);
f32 fVar2 = (mpItemBuf[i][0]->width / 48.0f);
fVar1 = fVar2 * fVar1;
mItemSlotParam1[i] = fVar1;
mItemSlotParam2[i] = (mpItemBuf[i][0]->height / 48.0f * (texScale / 100.0f));
}
}
mpScreen->search('r_btn_n')->hide();
if (mPlayerIsWolf) {
mpScreen->search('yx_te_s1')->hide();
mpScreen->search('yx_te_s2')->hide();
mpScreen->search('yx_te_s3')->hide();
mpScreen->search('yx_te_s4')->hide();
mpScreen->search('yx_text')->hide();
mpScreen->search('fyx_te_1')->hide();
mpScreen->search('fyx_te_2')->hide();
mpScreen->search('fyx_te_3')->hide();
mpScreen->search('fyx_te_4')->hide();
mpScreen->search('fyx_tex')->hide();
mpScreen->search('x_btn_n')->hide();
mpScreen->search('y_btn_n')->hide();
}
mpString = new dMsgString_c();
for (i = 0; i < 5; i++) {
J2DTextBox* fxy_TextBox = (J2DTextBox*)mpScreen->search(fxy_text[i]);
mpScreen->search(xy_text[i])->hide();
fxy_TextBox->setFont(mDoExt_getMesgFont());
fxy_TextBox->setString(0x40, "");
field_0x580[0] = mpString->getString(0x380, fxy_TextBox, NULL, NULL, NULL, 0);
}
for (i = 0; i < 5; i++) {
J2DTextBox* fc_TextBox = (J2DTextBox*)mpScreen->search(fc_text[i]);
mpScreen->search(c_text[i])->hide();
fc_TextBox->setFont(mDoExt_getMesgFont());
fc_TextBox->setString(0x40, "");
field_0x580[1] = mpString->getString(0x37F, fc_TextBox, NULL, NULL, NULL, 0);
}
for (i = 0; i < 5; i++) {
J2DTextBox* fc1_TextBox = (J2DTextBox*)mpScreen->search(fc_text1[i]);
mpScreen->search(c_text1[i])->hide();
fc1_TextBox->setFont(mDoExt_getMesgFont());
fc1_TextBox->setString(0x40, "");
field_0x580[2] = mpString->getString(0x4CD, fc1_TextBox, NULL, NULL, NULL, 0);
}
for (int i = 0; i < 5; i++) {
mpComboOffString[i] = (J2DTextBox*)mpScreen->search(ft_on[i]);
mpScreen->search(t_on[i])->hide();
mpComboOffString[i]->setString(0x40, "");
mpComboOffString[i]->setFont(mDoExt_getMesgFont());
mpString->getString(0x4D2, mpComboOffString[i], NULL, NULL, NULL, 0);
}
for (int i = 0; i < 5; i++) {
mpBowArrowComboString[i] = (J2DTextBox*)mpScreen->search(ft_off[i]);
mpScreen->search(t_off[i])->hide();
mpBowArrowComboString[i]->setString(0x40, "");
mpBowArrowComboString[i]->setFont(mDoExt_getMesgFont());
mpString->getString(0x4D3, mpBowArrowComboString[i], NULL, NULL, NULL, 0);
}
mpHeap->getTotalFreeSize();
timg = (ResTIMG*)dComIfGp_getMain2DArchive()->getResource('TIMG', "tt_block8x8.bti");
mpBlackTex = new J2DPicture(timg);
mpBlackTex->setBlackWhite(JUtility::TColor(0, 0, 0, 0), JUtility::TColor(0, 0, 0, 0xff));
mpBlackTex->setAlpha(0);
mpSpotScreen = new J2DScreen();
dPaneClass_setPriority(&mpResData[1], mpHeap, mpSpotScreen,
"SCRN/zelda_item_select_icon3_spot.blo", 0x20000,
dComIfGp_getRingResArchive());
dPaneClass_showNullPane(mpSpotScreen);
mpSpotParent = new CPaneMgrAlpha(mpSpotScreen, 'n_all', 2, NULL);
mpCenterScreen = new J2DScreen();
dPaneClass_setPriority(&mpResData[2], mpHeap, mpCenterScreen,
"SCRN/zelda_item_select_icon3_center_parts.blo", 0x20000,
dComIfGp_getRingResArchive());
dPaneClass_showNullPane(mpCenterScreen);
mpCenterParent = new CPaneMgrAlpha(mpCenterScreen, 'center_n', 2, NULL);
mpNameParent = new CPaneMgr(mpCenterScreen, 'label_n', 1, NULL);
mpCircle = new CPaneMgr(mpCenterScreen, 'circle_n', 2, NULL);
J2DTextBox* textBox[4];
textBox[0] = (J2DTextBox*)mpCenterScreen->search('fitem_n1');
textBox[1] = (J2DTextBox*)mpCenterScreen->search('fitem_n2');
textBox[2] = (J2DTextBox*)mpCenterScreen->search('fitem_n3');
textBox[3] = (J2DTextBox*)mpCenterScreen->search('fitem_n4');
mpCenterScreen->search('item_n04');
mpCenterScreen->search('item_n05');
mpCenterScreen->search('item_n06');
mpCenterScreen->search('item_n07');
for (int i = 0; i < 4; i++) {
textBox[i]->setFont(mDoExt_getMesgFont());
textBox[i]->setString(0x40, "");
}
textCentering();
mpDrawCursor = new dSelect_cursor_c(2, g_ringHIO.mCursorScale, dComIfGp_getMain2DArchive());
mpDrawCursor->setAlphaRate(1.0f);
mpItemExplain = new dMenu_ItemExplain_c(mpHeap, dComIfGp_getRingResArchive(), i_stick, true);
setRotate();
mpDrawCursor->setPos(mItemSlotPosX[0] + mCenterPosX, mItemSlotPosY[0] + mCenterPosY);
if (dComIfGs_getItem(mItemSlots[0], false) != NO_ITEM) {
mpDrawCursor->setParam(mItemSlotParam1[0], mItemSlotParam2[0], 0.1f, 0.6f, 0.5f);
} else {
mpDrawCursor->setParam(1.0f, 1.0f, 0.1f, 0.6f, 0.5f);
}
}
/* 801EA708-801EAB7C 1E5048 0474+00 1/0 0/0 0/0 .text __dt__12dMenu_Ring_cFv */
dMenu_Ring_c::~dMenu_Ring_c() {
mpHeap->getTotalFreeSize();
dMeter2Info_setItemExplainWindowStatus(0);
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 3; j++) {
for (int k = 0; k < 2; k++) {
mpHeap->free(mpSelectItemTexBuf[i][j][k]);
mpSelectItemTexBuf[i][j][k] = NULL;
}
if (mpSelectItemTex[i][j] != NULL) {
delete mpSelectItemTex[i][j];
mpSelectItemTex[i][j] = NULL;
}
}
}
for (int i = 0; i < 3; i++) {
if (mpItemNumTex[i] != NULL) {
delete mpItemNumTex[i];
mpItemNumTex[i] = NULL;
}
}
delete mpKanteraMeter;
mpKanteraMeter = NULL;
delete mpScreen;
mpScreen = NULL;
delete mpMessageParent;
mpMessageParent = NULL;
for (int i = 0; i < 10; i++) {
if (mpTextParent[i] != NULL) {
delete mpTextParent[i];
mpTextParent[i] = NULL;
}
}
for (int i = 0; i < MAX_ITEM_SLOTS; i++) {
for (int j = 0; j < 3; j++) {
if (mpItemTex[i][j] != NULL) {
delete mpItemTex[i][j];
mpItemTex[i][j] = NULL;
}
if (mpItemBuf[i][j] != NULL) {
mpHeap->free(mpItemBuf[i][j]);
mpItemBuf[i][j] = NULL;
}
}
}
delete mpString;
mpString = NULL;
mpHeap->getTotalFreeSize();
delete mpBlackTex;
mpBlackTex = NULL;
delete mpSpotScreen;
mpSpotScreen = NULL;
delete mpSpotParent;
mpSpotParent = NULL;
delete mpCenterScreen;
mpCenterScreen = NULL;
for (int i = 0; i < 3; i++) {
if (mpResData[i] != NULL) {
mpHeap->free(mpResData[i]);
mpResData[i] = NULL;
}
}
delete mpCenterParent;
mpCenterParent = NULL;
delete mpNameParent;
mpNameParent = NULL;
delete mpCircle;
mpCircle = NULL;
delete mpDrawCursor;
mpDrawCursor = NULL;
delete mpItemExplain;
mpItemExplain = NULL;
dComIfGp_getRingResArchive()->removeResourceAll();
}
/* 801EAB7C-801EABE8 1E54BC 006C+00 0/0 1/1 0/0 .text _create__12dMenu_Ring_cFv */
/** @details
* Initializes the very first status (which is STATUS_WAIT) after the ctor
* and plays the item wheel opening sound
*/
void dMenu_Ring_c::_create() {
(this->*stick_init[mStatus])();
Z2GetAudioMgr()->seStart(Z2SE_ITEM_RING_IN, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0);
}
/* 801EABE8-801EABEC 1E5528 0004+00 0/0 1/1 0/0 .text _delete__12dMenu_Ring_cFv */
void dMenu_Ring_c::_delete() {
/* empty function */
}
/* 801EABEC-801EACC8 1E552C 00DC+00 0/0 1/1 0/0 .text _move__12dMenu_Ring_cFv */
/** @details
* This is the update function which runs every frame.
* It runs a process based on mStatus every frame or
* initializes a new process if mStatus changes
*/
void dMenu_Ring_c::_move() {
mRingRadiusH = g_ringHIO.mRingRadiusH;
mRingRadiusV = g_ringHIO.mRingRadiusV;
mOldStatus = mStatus; // Save current status for check
mpItemExplain->move();
(this->*stick_proc[mStatus])(); // run process based on status
// If a new status has been set in mStatus, initialize the new process
if (mStatus != mOldStatus) {
(this->*stick_init[mStatus])();
}
setScale();
setActiveCursor();
setMixMessage();
if (mRingCursorScale != g_ringHIO.mCursorScale) {
mRingCursorScale = g_ringHIO.mCursorScale;
mpDrawCursor->setScale(g_ringHIO.mCursorScale);
}
}
/* 801EACC8-801EB080 1E5608 03B8+00 1/1 0/0 0/0 .text _draw__12dMenu_Ring_cFv */
void dMenu_Ring_c::_draw() {
J2DGrafContext* grafPort = dComIfGp_getCurrentGrafPort();
grafPort->setup2D();
if (mDrawFlag == 0) {
mpSpotParent->setAlphaRate(mAlphaRate * g_ringHIO.mOverlayAlpha);
mpSpotScreen->draw(0.0f, 0.0f, grafPort);
if (mRingItemNameScale != g_ringHIO.mItemNameScale) {
mRingItemNameScale = g_ringHIO.mItemNameScale;
mpNameParent->scale(mRingItemNameScale, mRingItemNameScale);
}
if (mRingItemNamePosX != g_ringHIO.mItemNamePosX || mRingItemNamePosY != g_ringHIO.mItemNamePosY) {
mRingItemNamePosX = g_ringHIO.mItemNamePosX;
mRingItemNamePosY = g_ringHIO.mItemNamePosY;
mpNameParent->paneTrans(mRingItemNamePosX, mRingItemNamePosY);
}
if (mRingPosX != g_ringHIO.mRingPosX || mRingPosY != g_ringHIO.mRingPosY) {
mRingPosX = g_ringHIO.mRingPosX;
mRingPosY = g_ringHIO.mRingPosY;
mpCircle->paneTrans(mRingPosX, mRingPosY);
}
if (mRingScaleH != g_ringHIO.mRingScaleH || mRingScaleV != g_ringHIO.mRingScaleV) {
mRingScaleH = g_ringHIO.mRingScaleH;
mRingScaleV = g_ringHIO.mRingScaleV;
mpCircle->scale(mRingScaleH, mRingScaleV);
}
f32 ringAlpha = mPlayerIsWolf != 0 ? g_ringHIO.mRingAlpha_Wolf : g_ringHIO.mRingAlpha;
if (mRingAlpha != ringAlpha) {
mRingAlpha = ringAlpha;
mpCircle->setAlphaRate(mRingAlpha);
}
mpCenterParent->setAlphaRate(mAlphaRate);
mpCenterScreen->draw(mCenterPosX, mCenterPosY, grafPort);
drawItem();
textScaleHIO();
f32 alphaRate = mpTextParent[1]->getAlphaRate();
mpMessageParent->setAlphaRate(mAlphaRate);
if (mStatus == STATUS_EXPLAIN) {
mpTextParent[1]->setAlphaRate(alphaRate * mAlphaRate);
}
mpScreen->draw(mCenterPosX, mCenterPosY, grafPort);
if (mStatus != STATUS_EXPLAIN && mPikariFlashingSpeed > 0.0f) {
Vec pos;
CPaneMgr paneMgr;
pos = paneMgr.getGlobalVtxCenter(mpScreen->search('gr_btn'), true, 0);
dMeter2Info_getMeterClass()->getMeterDrawPtr()->drawPikari(
pos.x, pos.y, &mPikariFlashingSpeed, g_ringHIO.mPikariScale, g_ringHIO.mPikariFrontOuter,
g_ringHIO.mPikariFrontInner, g_ringHIO.mPikariBackOuter, g_ringHIO.mPikariBackInner,
g_ringHIO.mPikariAnimSpeed, 2);
}
mDrawFlag = 1;
} else {
drawSelectItem();
drawItem2();
mpDrawCursor->draw();
mpItemExplain->trans(mCenterPosX, mCenterPosY);
mpItemExplain->draw((J2DOrthoGraph*)grafPort);
drawFlag0();
}
}
/* 801EB080-801EB0A4 1E59C0 0024+00 2/2 0/0 0/0 .text setKanteraPos__12dMenu_Ring_cFff */
void dMenu_Ring_c::setKanteraPos(f32 i_posX, f32 i_posY) {
mpKanteraMeter->setPos(i_posX, i_posY);
}
/* 801EB0A4-801EB2B4 1E59E4 0210+00 0/0 1/1 0/0 .text isOpen__12dMenu_Ring_cFv */
bool dMenu_Ring_c::isOpen() {
bool opened = false;
if (mOpenCloseFrames == 0) {
dMeter2Info_set2DVibrationM();
}
mOpenCloseFrames++;
mAlphaRate = (f32)mOpenCloseFrames / (f32)g_ringHIO.mOpenFrames;
if (mRingOrigin == 0) {
mCenterPosX = 0.0f;
mCenterPosY = (1.0f - mAlphaRate) * 448.0f;
} else if (mRingOrigin == 2) {
mCenterPosX = 0.0f;
mCenterPosY = (1.0f - mAlphaRate) * -448.0f;
} else if (mRingOrigin == 3) {
mCenterPosX = (1.0f - mAlphaRate) * 608.0f;
mCenterPosY = 0.0f;
} else if (mRingOrigin == 1) {
mCenterPosX = (1.0f - mAlphaRate) * -608.0f;
mCenterPosY = 0.0f;
}
if (mOpenCloseFrames >= g_ringHIO.mOpenFrames) {
// Opening is finished, set to g_ringHIO.mCloseFrames as a
// preparation for when the player closes the item wheel
mOpenCloseFrames = g_ringHIO.mCloseFrames;
mAlphaRate = 1.0f;
mCenterPosX = 0.0f;
mCenterPosY = 0.0f;
opened = true;
}
setScale();
mpDrawCursor->setPos(mItemSlotPosX[SLOT_0] + mCenterPosX, mItemSlotPosY[SLOT_0] + mCenterPosY);
if (dComIfGs_getItem(mItemSlots[SLOT_0], false) != NO_ITEM) {
mpDrawCursor->setParam(mItemSlotParam1[0], mItemSlotParam2[0], 0.1f, 0.6f, 0.5f);
} else {
mpDrawCursor->setParam(1.0f, 1.0f, 0.1f, 0.6f, 0.5f);
}
return opened;
}
/* 801EB2B4-801EB3CC 1E5BF4 0118+00 0/0 1/1 0/0 .text isMoveEnd__12dMenu_Ring_cFv */
bool dMenu_Ring_c::isMoveEnd() {
bool ret = 0;
if (mStatus == STATUS_WAIT && mOldStatus != STATUS_EXPLAIN_FORCE && mOldStatus != STATUS_EXPLAIN) {
if (dMw_UP_TRIGGER() || dMw_DOWN_TRIGGER() || dMw_B_TRIGGER() ||
dMeter2Info_getWarpStatus() == 2 || dMeter2Info_getWarpStatus() == 1 ||
dMeter2Info_isTouchKeyCheck(0xe))
{
if (dMw_UP_TRIGGER()) {
mRingOrigin = 0;
} else if (dMw_DOWN_TRIGGER()) {
mRingOrigin = 2;
} else {
mRingOrigin = 0xff;
}
Z2GetAudioMgr()->seStart(Z2SE_ITEM_RING_OUT, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0);
dMeter2Info_set2DVibrationM();
ret = 1;
}
}
return ret;
}
/* 801EB3CC-801EB624 1E5D0C 0258+00 0/0 1/1 0/0 .text isClose__12dMenu_Ring_cFv */
bool dMenu_Ring_c::isClose() {
bool closed = true;
if (field_0x674[0] != 0 || field_0x674[1] != 0 || field_0x674[2] != 0 || field_0x674[3] != 0) {
return 0;
}
mOpenCloseFrames--;
mAlphaRate = (f32)mOpenCloseFrames / (f32)g_ringHIO.mCloseFrames;
if (mOpenCloseFrames <= 0) {
for (int i = 0; i < 4; i++) {
setSelectItemForce(i);
}
mOpenCloseFrames = 0;
mAlphaRate = 0.0f;
} else {
closed = false;
}
if (mRingOrigin == 0) {
mCenterPosX = 0.0f;
mCenterPosY = (1.0f - mAlphaRate) * -448.0f;
} else if (mRingOrigin == 2) {
mCenterPosX = 0.0f;
mCenterPosY = (1.0f - mAlphaRate) * 448.0f;
} else if (mRingOrigin == 3) {
mCenterPosX = (1.0f - mAlphaRate) * -608.0f;
mCenterPosY = 0.0f;
} else if (mRingOrigin == 1) {
mCenterPosX = (1.0f - mAlphaRate) * 608.0f;
mCenterPosY = 0.0f;
}
mpDrawCursor->setPos(mItemSlotPosX[mCurrentSlot] + mCenterPosX,
mItemSlotPosY[mCurrentSlot] + mCenterPosY);
if (dComIfGs_getItem(mItemSlots[mCurrentSlot], false) != NO_ITEM) {
mpDrawCursor->setParam(mItemSlotParam1[mCurrentSlot], mItemSlotParam2[mCurrentSlot], 0.1f, 0.6f,
0.5f);
} else {
mpDrawCursor->setParam(1.0f, 1.0f, 0.1f, 0.6f, 0.5f);
}
return closed;
}
/* 801EB624-801EB8C0 1E5F64 029C+00 1/1 0/0 0/0 .text getStickInfo__12dMenu_Ring_cFP9STControl */
u8 dMenu_Ring_c::getStickInfo(STControl* i_stick) {
field_0x6c2 = 0xff;
if (i_stick->getValueStick() >= 0.75f) {
s16 stick_angle = i_stick->getAngleStick();
s16 abs_stick_angle = stick_angle + 0x8000;
int something_stick = abs_stick_angle + 0x8000;
s32 temp;
u32 uVar3 = mItemsTotal / 2;
u8 val2 = uVar3;
int val = mItemsTotal;
if ((val % 2) != 0) {
temp = field_0x634;
} else {
temp = (s16)(field_0x634 / 2);
}
for (s32 i = 0; i < val; i++) {
if (something_stick < temp) {
break;
}
temp += field_0x634;
if (val2 <= 0) {
val2 = val - 1;
} else {
val2--;
}
}
if (mCurrentSlot != val2) {
if (mDoCPd_c::getHoldL(PAD_1)) {
mDirectSelectCursorPos.x = mItemSlotPosX[mCurrentSlot];
mDirectSelectCursorPos.z = mItemSlotPosY[mCurrentSlot];
mCurrentSlot = val2;
mDirectSelectActive = true;
} else if (mCurrentSlot >= uVar3) {
if (val2 >= (u8)(mCurrentSlot - uVar3) && val2 < mCurrentSlot) {
if (mCurrentSlot == 0) {
mCurrentSlot = mItemsTotal - 1;
} else {
mCurrentSlot--;
}
} else if (mCurrentSlot == (u8)(mItemsTotal - 1)) {
mCurrentSlot = 0;
} else {
mCurrentSlot++;
}
} else {
u8 max = mCurrentSlot + uVar3;
if (val2 > mCurrentSlot && val2 <= max) {
if (mCurrentSlot == (u8)(mItemsTotal - 1)) {
mCurrentSlot = 0;
} else {
mCurrentSlot++;
}
} else if (mCurrentSlot == 0) {
mCurrentSlot = mItemsTotal - 1;
} else {
mCurrentSlot--;
}
}
field_0x670 = field_0x63e[mCurrentSlot];
if (mItemsTotal == 2 && stick_angle < 0) {
if (mCurrentSlot == 0) {
field_0x6d3 = 0;
} else {
field_0x6d3 = 1;
}
}
return 1;
}
} else {
mCursorSpeed = 0;
dpdMove();
if (field_0x6c2 != 0xff) {
return 0;
}
}
return 0;
}
/* 801EB8C0-801EB960 1E6200 00A0+00 1/0 0/0 0/0 .text calcStickAngle__12dMenu_Ring_cFP9STControlUc
*/
s16 dMenu_Ring_c::calcStickAngle(STControl* i_stick, u8 param_1) {
s16 directionTrig = i_stick->getAngleStick();
switch (param_1) {
case 0:
directionTrig += 0x8000;
break;
case 4:
directionTrig -= 0x6000;
break;
case 2:
break;
case 1:
directionTrig -= 0x4000;
break;
case 5:
directionTrig -= 0x2000;
break;
case 6:
directionTrig += 0x2000;
break;
case 3:
directionTrig += 0x4000;
break;
case 7:
directionTrig += 0x6000;
break;
default:
directionTrig += 0x4000;
break;
}
return directionTrig;
}
/* 801EB960-801EBA38 1E62A0 00D8+00 1/1 0/0 0/0 .text setRotate__12dMenu_Ring_cFv */
void dMenu_Ring_c::setRotate() {
clacEllipsePlotAverage(mItemsTotal, g_ringHIO.mItemRingPosX + 304.0f,
g_ringHIO.mItemRingPosY + 224.0f);
for (int i = 0; i < mItemsTotal; i++) {
field_0x63e[i] = cM_atan2s(mItemSlotPosX[i] - (304.0f + g_ringHIO.mItemRingPosX),
mItemSlotPosY[i] - (224.0f + g_ringHIO.mItemRingPosY));
}
}
/* 801EBA38-801EBAB8 1E6378 0080+00 1/1 0/0 0/0 .text setItemScale__12dMenu_Ring_cFif */
void dMenu_Ring_c::setItemScale(int i_idx, f32 i_scale) {
for (int i = 0; i < 3; i++) {
if (mpItemTex[i_idx][i] != NULL) {
mpItemTex[i_idx][i]->scale(i_scale, i_scale);
}
}
}
/* 801EBAB8-801EBB10 1E63F8 0058+00 2/2 0/0 0/0 .text setButtonScale__12dMenu_Ring_cFif
*/
void dMenu_Ring_c::setButtonScale(int i_idx, f32 i_scale) {
i_idx += 8; // reach the offset in mpTextParent for the buttons
if (mpTextParent[i_idx] != NULL) {
f32 buttonScale = i_scale * mRingGuideScale[i_idx];
mpTextParent[i_idx]->scale(buttonScale, buttonScale);
}
}
/* 801EBB10-801EBE58 1E6450 0348+00 1/1 0/0 0/0 .text setItem__12dMenu_Ring_cFv */
void dMenu_Ring_c::setItem() {
u8 uVar1;
u8 uVar2;
u8 uVar3;
u8 uVar4;
if (mXButtonSlot != NO_ITEM) {
uVar1 = mItemSlots[mXButtonSlot];
} else {
uVar1 = NO_ITEM;
}
if (mYButtonSlot != NO_ITEM) {
uVar2 = mItemSlots[mYButtonSlot];
} else {
uVar2 = NO_ITEM;
}
if (field_0x6ac != NO_ITEM) {
uVar3 = mItemSlots[field_0x6ac];
} else {
uVar3 = NO_ITEM;
}
if (field_0x6ad != NO_ITEM) {
uVar4 = mItemSlots[field_0x6ad];
} else {
uVar4 = NO_ITEM;
}
u8 mixItemIndex0 = dComIfGs_getMixItemIndex(0);
u8 mixItemIndex1 = dComIfGs_getMixItemIndex(1);
for (int i = 0; i < 4; i++) {
setSelectItemForce(i);
}
checkExplainForce();
if (field_0x6b3 == 0) {
uVar1 = dComIfGs_getSelectItemIndex(1);
if (mItemSlots[mCurrentSlot] == uVar1) {
uVar2 = dComIfGs_getSelectItemIndex(0);
mixItemIndex1 = dComIfGs_getMixItemIndex(0);
if (uVar2 == NO_ITEM) {
mYButtonSlot = NO_ITEM;
} else {
mYButtonSlot = mXButtonSlot;
}
mXButtonSlot = mCurrentSlot;
uVar1 = mItemSlots[mXButtonSlot];
mixItemIndex0 = NO_ITEM;
} else {
if (dComIfGs_getMixItemIndex(1) == mItemSlots[mCurrentSlot]) {
uVar2 = dComIfGs_getSelectItemIndex(0);
mixItemIndex1 = NO_ITEM;
if (uVar2 == NO_ITEM) {
mYButtonSlot = NO_ITEM;
} else {
mYButtonSlot = mXButtonSlot;
}
mXButtonSlot = mCurrentSlot;
uVar1 = mItemSlots[mXButtonSlot];
mixItemIndex0 = NO_ITEM;
} else {
mXButtonSlot = mCurrentSlot;
uVar1 = mItemSlots[mXButtonSlot];
mixItemIndex0 = NO_ITEM;
}
}
} else if (field_0x6b3 == 1) {
if (mItemSlots[mCurrentSlot] == dComIfGs_getSelectItemIndex(0)) {
u8 temp = dComIfGs_getSelectItemIndex(1);
uVar1 = temp;
mixItemIndex0 = dComIfGs_getMixItemIndex(1);
if (temp == NO_ITEM) {
mXButtonSlot = NO_ITEM;
} else {
mXButtonSlot = mYButtonSlot;
}
mYButtonSlot = mCurrentSlot;
uVar2 = mItemSlots[mYButtonSlot];
mixItemIndex1 = NO_ITEM;
} else {
if (dComIfGs_getMixItemIndex(0) == mItemSlots[mCurrentSlot]) {
uVar1 = dComIfGs_getSelectItemIndex(1);
mixItemIndex0 = NO_ITEM;
if (uVar1 == NO_ITEM) {
mXButtonSlot = NO_ITEM;
} else {
mXButtonSlot = mYButtonSlot;
}
mYButtonSlot = mCurrentSlot;
uVar2 = mItemSlots[mYButtonSlot];
mixItemIndex1 = NO_ITEM;
} else {
mYButtonSlot = mCurrentSlot;
uVar2 = mItemSlots[mYButtonSlot];
mixItemIndex1 = NO_ITEM;
}
}
}
field_0x6b4[0] = uVar1;
field_0x6b4[1] = uVar2;
field_0x6b4[2] = uVar3;
field_0x6b4[3] = uVar4;
field_0x6b8[0] = mixItemIndex0;
field_0x6b8[1] = mixItemIndex1;
field_0x6b8[2] = NO_ITEM;
field_0x6b8[3] = NO_ITEM;
field_0x6cd = NO_ITEM;
setJumpItem(true);
}
/* 801EBE58-801EC20C 1E6798 03B4+00 2/2 0/0 0/0 .text setJumpItem__12dMenu_Ring_cFb */
void dMenu_Ring_c::setJumpItem(bool i_useVibrationM) {
for (int i = 0; i < 4; i++) {
if (i == 2) {
setSelectItem(i, field_0x6b4[i]);
} else if (i == field_0x6cd) {
setSelectItem(i, getItem(field_0x6cb, 0));
} else {
setSelectItem(i, getItem(field_0x6b4[i], field_0x6b8[i]));
}
}
if (mXButtonSlot != NO_ITEM) {
field_0x518[0] = mItemSlotPosX[mXButtonSlot];
field_0x528[0] = mItemSlotPosY[mXButtonSlot];
}
if (mYButtonSlot != NO_ITEM) {
field_0x518[1] = mItemSlotPosX[mYButtonSlot];
field_0x528[1] = mItemSlotPosY[mYButtonSlot];
}
if (field_0x6ac != NO_ITEM) {
field_0x518[2] = mItemSlotPosX[field_0x6ac];
field_0x528[2] = mItemSlotPosY[field_0x6ac];
}
if (field_0x6ad != NO_ITEM) {
field_0x518[3] = mItemSlotPosX[field_0x6ad];
field_0x528[3] = mItemSlotPosY[field_0x6ad];
}
if (field_0x6b3 == 0) {
field_0x538[0] = g_ringHIO.mSelectItemScale;
field_0x538[1] = g_ringHIO.mUnselectItemScale;
if (field_0x6b4[0] != dComIfGs_getSelectItemIndex(0) ||
field_0x6b8[0] != dComIfGs_getMixItemIndex(0))
{
field_0x674[0] = 1;
}
} else if (field_0x6b3 == 1) {
field_0x538[0] = g_ringHIO.mUnselectItemScale;
field_0x538[1] = g_ringHIO.mSelectItemScale;
if (field_0x6b4[1] != dComIfGs_getSelectItemIndex(1) ||
field_0x6b8[1] != dComIfGs_getMixItemIndex(1))
{
field_0x674[1] = 1;
}
}
if (field_0x674[0] == 1) {
if (i_useVibrationM) {
dMeter2Info_set2DVibrationM();
}
Z2GetAudioMgr()->seStart(Z2SE_SY_ITEM_SET_X, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0);
} else if (field_0x674[1] == 1) {
if (i_useVibrationM) {
dMeter2Info_set2DVibrationM();
}
Z2GetAudioMgr()->seStart(Z2SE_SY_ITEM_SET_X, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0);
} else if (field_0x674[2] == 1) {
if (i_useVibrationM) {
dMeter2Info_set2DVibrationM();
}
Z2GetAudioMgr()->seStart(Z2SE_SY_ITEM_SET_X, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0);
} else if (field_0x674[3] == 1) {
if (i_useVibrationM) {
dMeter2Info_set2DVibrationM();
}
Z2GetAudioMgr()->seStart(Z2SE_SY_ITEM_SET_B, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0);
} else {
Z2GetAudioMgr()->seStart(Z2SE_SYS_ERROR, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0);
}
}
/* 801EC20C-801EC3B0 1E6B4C 01A4+00 2/2 0/0 0/0 .text setScale__12dMenu_Ring_cFv */
void dMenu_Ring_c::setScale() {
u32 itemId;
for (int i = 0; i < mItemsTotal; i++) {
if (field_0x6cf != 0xff) {
itemId = 0;
switch (field_0x6cf) {
case 0:
itemId = 0x4DE;
break;
case 1:
itemId = 0x4E0;
break;
}
setNameString(itemId);
setItemScale(i, g_ringHIO.mUnselectItemScale);
for (int j = 0; j < 2; j++) {
if (j == field_0x6cf) {
setButtonScale(j, g_ringHIO.mSelectButtonScale);
} else {
setButtonScale(j, g_ringHIO.mUnselectButtonScale);
}
}
} else {
if (i == mCurrentSlot && (mStatus == STATUS_WAIT || mStatus == STATUS_EXPLAIN || mStatus == STATUS_EXPLAIN_FORCE)) {
itemId = dComIfGs_getItem(mItemSlots[i], false) + 0x165;
if (dMeter2Info_getRentalBombBag() != 0xff &&
mItemSlots[i] == dMeter2Info_getRentalBombBag() + 0xf)
{
itemId = 0x16D;
}
setNameString(itemId);
setItemScale(i, g_ringHIO.mSelectItemScale);
} else {
setItemScale(i, g_ringHIO.mUnselectItemScale);
}
for (int j = 0; j < 2; j++) {
setButtonScale(j, g_ringHIO.mUnselectButtonScale);
}
}
}
}
/* 801EC3B0-801EC504 1E6CF0 0154+00 1/1 0/0 0/0 .text setNameString__12dMenu_Ring_cFUl */
void dMenu_Ring_c::setNameString(u32 i_stringID) {
J2DTextBox* textBox[4];
textBox[0] = (J2DTextBox*)mpCenterScreen->search('fitem_n1');
textBox[1] = (J2DTextBox*)mpCenterScreen->search('fitem_n2');
textBox[2] = (J2DTextBox*)mpCenterScreen->search('fitem_n3');
textBox[3] = (J2DTextBox*)mpCenterScreen->search('fitem_n4');
if (mNameStringID != i_stringID) {
for (int i = 0; i < 4; i++) {
if (i_stringID == 0) {
strcpy(textBox[i]->getStringPtr(), "");
} else {
mpString->getString(i_stringID, textBox[i], NULL, NULL, NULL, 0);
}
}
mNameStringID = i_stringID;
}
}
/* 801EC504-801EC754 1E6E44 0250+00 1/1 0/0 0/0 .text setActiveCursor__12dMenu_Ring_cFv
*/
void dMenu_Ring_c::setActiveCursor() {
u8 item = dComIfGs_getItem(mItemSlots[mCurrentSlot], false);
if (mStatus == STATUS_WAIT && mOldStatus != STATUS_EXPLAIN_FORCE && mOldStatus != STATUS_EXPLAIN && mpItemExplain->getStatus() == 0) {
if (mDoCPd_c::getTrigR(PAD_1) && !mPlayerIsWolf && item != NO_ITEM) {
for (int i = 0; i < MAX_SELECT_ITEM; i++) {
setSelectItemForce(i);
}
setMixItem();
} else if (mDoCPd_c::getTrigX(PAD_1) && !mPlayerIsWolf && item != NO_ITEM) {
for (int i = 0; i < MAX_SELECT_ITEM; i++) {
setSelectItemForce(i);
}
field_0x6b3 = 0;
if (!checkCombineBomb(field_0x6b3)) {
setItem();
if (mpItemExplain->getStatus() == 0) {
setStatus(STATUS_WAIT);
(this->*stick_init[mStatus])();
}
}
} else if (mDoCPd_c::getTrigY(PAD_1) && !mPlayerIsWolf && item != NO_ITEM) {
for (int i = 0; i < MAX_SELECT_ITEM; i++) {
setSelectItemForce(i);
}
field_0x6b3 = 1;
if (!checkCombineBomb(field_0x6b3)) {
setItem();
if (mpItemExplain->getStatus() == 0) {
setStatus(STATUS_WAIT);
(this->*stick_init[mStatus])();
}
}
} else if (mDoCPd_c::getTrigX(PAD_1) || mDoCPd_c::getTrigY(PAD_1)) {
// If the player is a wolf or somehow manages to access an item slot with no item, error
Z2GetAudioMgr()->seStart(Z2SE_SYS_ERROR, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0);
}
}
}
/* 801EC754-801ECB14 1E7094 03C0+00 1/1 0/0 0/0 .text setMixItem__12dMenu_Ring_cFv */
void dMenu_Ring_c::setMixItem() {
u8 item = dComIfGs_getItem(mItemSlots[mCurrentSlot], false);
bool bVar1 = false;
u8 selectItemIndex0 = dComIfGs_getSelectItemIndex(0);
u8 selectItemIndex1 = dComIfGs_getSelectItemIndex(1);
u8 local_28[4] = {NO_ITEM, NO_ITEM, NO_ITEM, NO_ITEM};
if (dComIfGs_getMixItemIndex(0) == SLOT_4 &&
mItemSlots[mCurrentSlot] == dComIfGs_getSelectItemIndex(0))
{
Z2GetAudioMgr()->seStart(Z2SE_SY_ITEM_COMBINE_OFF, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0);
field_0x6cb = selectItemIndex0;
selectItemIndex0 = 4;
local_28[0] = getCursorPos(4);
field_0x6b8[0] = 0xff;
field_0x6b3 = 0;
field_0x6cd = 0;
bVar1 = true;
} else if (dComIfGs_getMixItemIndex(1) == 4 &&
mItemSlots[mCurrentSlot] == dComIfGs_getSelectItemIndex(1))
{
Z2GetAudioMgr()->seStart(Z2SE_SY_ITEM_COMBINE_OFF, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0);
field_0x6cb = selectItemIndex1;
selectItemIndex1 = 4;
local_28[1] = getCursorPos(4);
field_0x6b8[1] = 0xff;
field_0x6b3 = 1;
field_0x6cd = 1;
bVar1 = true;
} else {
switch (item) {
case NORMAL_BOMB:
case WATER_BOMB:
case POKE_BOMB:
case HAWK_EYE:
if ((dComIfGs_getSelectItemIndex(0) == 4 && dComIfGs_getMixItemIndex(0) == NO_ITEM) ||
(dComIfGs_getMixItemIndex(0) == 4))
{
Z2GetAudioMgr()->seStart(Z2SE_SY_ITEM_COMBINE_ON, NULL, 0, 0, 1.0f, 1.0f, -1.0f,
-1.0f, 0);
selectItemIndex0 = mItemSlots[mCurrentSlot];
field_0x6b8[0] = 4;
field_0x6b3 = 0;
mXButtonSlot = mCurrentSlot;
field_0x6cd = 0xff;
bVar1 = true;
if (selectItemIndex1 == mItemSlots[mCurrentSlot]) {
selectItemIndex1 = 0xff;
mYButtonSlot = 0xff;
}
} else if ((dComIfGs_getSelectItemIndex(1) == 4 &&
dComIfGs_getMixItemIndex(1) == NO_ITEM) ||
(dComIfGs_getMixItemIndex(1) == 4))
{
Z2GetAudioMgr()->seStart(Z2SE_SY_ITEM_COMBINE_ON, NULL, 0, 0, 1.0f, 1.0f, -1.0f,
-1.0f, 0);
selectItemIndex1 = mItemSlots[mCurrentSlot];
field_0x6b8[1] = 4;
field_0x6b3 = 1;
mYButtonSlot = mCurrentSlot;
field_0x6cd = 0xff;
bVar1 = true;
if (selectItemIndex0 == mItemSlots[mCurrentSlot]) {
selectItemIndex0 = 0xff;
mXButtonSlot = 0xff;
}
}
break;
}
}
if (bVar1) {
field_0x6b4[0] = selectItemIndex0;
field_0x6b4[1] = selectItemIndex1;
setJumpItem(false);
if (local_28[0] != NO_ITEM) {
mXButtonSlot = local_28[0];
}
if (local_28[1] != NO_ITEM) {
mYButtonSlot = local_28[1];
}
}
}
/* 801ECB14-801ECF9C 1E7454 0488+00 1/1 0/0 0/0 .text drawItem__12dMenu_Ring_cFv */
void dMenu_Ring_c::drawItem() {
field_0x684++;
if (field_0x684 >= g_ringHIO.mItemAlphaFlashDuration) {
field_0x684 = 0;
}
s32 halfFlashDuration = g_ringHIO.mItemAlphaFlashDuration / 2;
f32 fVar16;
if (field_0x684 < halfFlashDuration) {
fVar16 = field_0x684 / (f32)halfFlashDuration;
} else {
fVar16 = (g_ringHIO.mItemAlphaFlashDuration - field_0x684) / (f32)halfFlashDuration;
}
f32 ringAlpha =
(g_ringHIO.mItemAlphaMin + fVar16 * (g_ringHIO.mItemAlphaMax - g_ringHIO.mItemAlphaMin));
for (int i = 0; i < mItemsTotal; i++) {
if (i != mCurrentSlot || (mStatus != STATUS_WAIT && mStatus != STATUS_EXPLAIN && mStatus != STATUS_EXPLAIN_FORCE)) {
J2DDrawFrame(mItemSlotPosX[i] - 24.0f + mCenterPosX, mItemSlotPosY[i] - 24.0f + mCenterPosY,
48.0f, 48.0f, g_ringHIO.mItemFrame[g_ringHIO.UNSELECT_FRAME], 6);
f32 fVar17 = 1.0f;
if (i != mCurrentSlot) {
fVar17 = ringAlpha / 255.0f;
}
for (int j = 0; j < 3; j++) {
if (mpItemTex[i][j] != NULL) {
if (mPlayerIsWolf) {
mpItemTex[i][j]->setAlpha(g_ringHIO.mItemIconAlpha_Wolf * mAlphaRate);
} else {
mpItemTex[i][j]->setAlpha(g_ringHIO.mItemIconAlpha * mAlphaRate * fVar17);
}
f32 f0 = mItemSlotParam1[i] * 48.0f;
f32 f1 = mItemSlotParam2[i] * 48.0f;
f32 x = (48.0f - f0) * 0.5f + (mItemSlotPosX[i] - 24.0f + mCenterPosX);
f32 y = (48.0f - f1) * 0.5f + (mItemSlotPosY[i] - 24.0f + mCenterPosY);
mpItemTex[i][j]->draw(x, y, f0, f1, 0, 0, 0);
u8 item = dComIfGs_getItem(mItemSlots[i], false);
if ((j == 0 && item != BEE_CHILD) || (j == 2 && item == BEE_CHILD)) {
u8 itemNum = getItemNum(mItemSlots[i]);
u8 itemMaxNum = getItemMaxNum(mItemSlots[i]);
if (itemMaxNum != 0) {
// If it's an ammo-based item, display ammo digits
drawNumber(itemNum, itemMaxNum, x + 24.0f, y + 48.0f);
}
}
if (j == 0 && item == KANTERA /* Lantern */) {
setKanteraPos(x + 24.0f + 15.0f, y + 48.0f + 10.0f);
mpKanteraMeter->setScale(0.64f, 0.64f);
mpKanteraMeter->setNowGauge(dComIfGs_getMaxOil(), dComIfGs_getOil());
u8 alpha = mpItemTex[i][j]->getAlpha();
mpKanteraMeter->setAlphaRate(alpha / 255.0f);
mpKanteraMeter->drawSelf();
}
}
}
}
}
}
/* 801ECF9C-801ED2BC 1E78DC 0320+00 1/1 0/0 0/0 .text drawItem2__12dMenu_Ring_cFv */
void dMenu_Ring_c::drawItem2() {
s32 idx = mCurrentSlot;
if (mStatus == STATUS_WAIT || mStatus == STATUS_EXPLAIN || mStatus == STATUS_EXPLAIN_FORCE) {
J2DDrawFrame(mItemSlotPosX[idx] - 24.0f + mCenterPosX, mItemSlotPosY[idx] - 24.0f + mCenterPosY,
48.0f, 48.0f, g_ringHIO.mItemFrame[g_ringHIO.SELECT_FRAME], 6);
for (int i = 0; i < 3; i++) {
if (mpItemTex[idx][i] != NULL) {
if (mPlayerIsWolf != 0) {
mpItemTex[idx][i]->setAlpha(g_ringHIO.mItemIconAlpha_Wolf * mAlphaRate);
} else {
mpItemTex[idx][i]->setAlpha(mAlphaRate * 255.0f);
}
f32 f0 = mItemSlotParam1[idx] * 48.0f;
f32 f1 = mItemSlotParam2[idx] * 48.0f;
f32 x = (48.0f - f0) * 0.5f + (mItemSlotPosX[idx] - 24.0f + mCenterPosX);
f32 y = (48.0f - f1) * 0.5f + (mItemSlotPosY[idx] - 24.0f + mCenterPosY);
mpItemTex[idx][i]->draw(x, y, f0, f1, 0, 0, 0);
u8 item = dComIfGs_getItem(mItemSlots[idx], false);
if ((i == 0 && item != BEE_CHILD) || (i == 2 && item == BEE_CHILD)) {
u8 itemNum = getItemNum(mItemSlots[idx]);
u8 itemMaxNum = getItemMaxNum(mItemSlots[idx]);
if (itemMaxNum != 0) {
// If it's an ammo-based item, display ammo digits
drawNumber(itemNum, itemMaxNum, x + 24.0f, y + 48.0f);
}
}
if (i == 0 && item == KANTERA) {
setKanteraPos(x + 24.0f + 15.0f, y + 48.0f + 10.0f);
mpKanteraMeter->setScale(0.64f, 0.64f);
mpKanteraMeter->setNowGauge(dComIfGs_getMaxOil(), dComIfGs_getOil());
u8 alpha = mpItemTex[idx][i]->getAlpha();
mpKanteraMeter->setAlphaRate(alpha / 255.0f);
mpKanteraMeter->drawSelf();
}
}
}
}
}
/* 801ED2BC-801ED31C 1E7BFC 0060+00 1/0 0/0 0/0 .text stick_wait_init__12dMenu_Ring_cFv
*/
void dMenu_Ring_c::stick_wait_init() {
if (mDoCPd_c::getHoldL(PAD_1) != 0) {
if (mDirectSelectActive) {
mWaitFrames = g_ringHIO.mDirectSelectWaitFrames;
} else {
mWaitFrames = 0;
}
} else {
mWaitFrames = g_ringHIO.mCursorChangeWaitFrames;
}
field_0x63a = 0;
mDirectSelectActive = false;
}
/* 801ED31C-801ED490 1E7C5C 0174+00 1/0 0/0 0/0 .text stick_wait_proc__12dMenu_Ring_cFv
*/
void dMenu_Ring_c::stick_wait_proc() {
u8 item = dComIfGs_getItem(mItemSlots[mCurrentSlot], false);
if (item != NO_ITEM) {
setDoStatus(0x24);
} else {
setDoStatus(0);
}
if (dMw_A_TRIGGER() && !dMeter2Info_isTouchKeyCheck(0xe) && openExplain(item)) {
dMeter2Info_setItemExplainWindowStatus(1);
field_0x6c4 = mCurrentSlot;
setStatus(STATUS_EXPLAIN);
dMeter2Info_set2DVibration();
setDoStatus(0);
return;
}
if (dMw_A_TRIGGER() && !dMeter2Info_isTouchKeyCheck(0xe)) {
Z2GetAudioMgr()->seStart(Z2SE_SYS_ERROR, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0);
}
if (mWaitFrames > 0) {
mWaitFrames--;
} else if (getStickInfo(mpStick) != 0) {
setStatus(STATUS_MOVE);
field_0x6b2 = 0;
}
}
/* 801ED490-801ED53C 1E7DD0 00AC+00 1/0 0/0 0/0 .text stick_move_init__12dMenu_Ring_cFv
*/
void dMenu_Ring_c::stick_move_init() {
if (mCursorSpeed == 0) {
mCursorSpeed = g_ringHIO.mCursorInitSpeed;
} else if (mCursorSpeed < g_ringHIO.mCursorMax) {
mCursorSpeed += g_ringHIO.mCursorAccel;
if (mCursorSpeed > g_ringHIO.mCursorMax) {
mCursorSpeed = g_ringHIO.mCursorMax;
}
}
field_0x63a = 0;
Z2GetAudioMgr()->seStart(Z2SE_ITEM_RING_ROLL, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0);
}
/* 801ED53C-801ED934 1E7E7C 03F8+00 1/0 0/0 0/0 .text stick_move_proc__12dMenu_Ring_cFv
*/
void dMenu_Ring_c::stick_move_proc() {
setDoStatus(0x24);
if (mDirectSelectActive) {
cXyz target;
target.set(mItemSlotPosX[mCurrentSlot], 0.0f, mItemSlotPosY[mCurrentSlot]);
cLib_addCalcPosXZ(&mDirectSelectCursorPos, target, 1.0f, 70.0f, 1.0f);
cXyz sub = mDirectSelectCursorPos - target;
if (sub.abs() < 0.5f) {
mDirectSelectCursorPos.set(target);
field_0x66e = field_0x670;
mpDrawCursor->setPos(mItemSlotPosX[mCurrentSlot], mItemSlotPosY[mCurrentSlot]);
u8 item = dComIfGs_getItem(mItemSlots[mCurrentSlot], false);
if (item != NO_ITEM) {
mpDrawCursor->setParam(mItemSlotParam1[mCurrentSlot], mItemSlotParam2[mCurrentSlot], 0.1f,
0.6f, 0.5f);
} else {
mpDrawCursor->setParam(1.0f, 1.0f, 0.1f, 0.6f, 0.5f);
}
setStatus(field_0x6b2);
} else {
mpDrawCursor->setParam(1.0f, 1.0f, 0.1f, 0.6f, 0.5f);
mpDrawCursor->setPos(mDirectSelectCursorPos.x, mDirectSelectCursorPos.z);
}
} else {
if (field_0x6d3 == 0xff) {
cLib_addCalcAngleS(&field_0x66e, field_0x670, 4, 0x7FFF, mCursorSpeed);
} else {
if (field_0x6d3 == 0) {
field_0x66e = -0x2007;
} else {
field_0x66e = -0x6003;
}
field_0x6d3 = 0xff;
}
s16 subtract = field_0x670 - field_0x66e;
if (abs(subtract) < 0x80) {
field_0x66e = field_0x670;
mpDrawCursor->setPos(mItemSlotPosX[mCurrentSlot], mItemSlotPosY[mCurrentSlot]);
u8 item = dComIfGs_getItem(mItemSlots[mCurrentSlot], false);
if (item != NO_ITEM) {
mpDrawCursor->setParam(mItemSlotParam1[mCurrentSlot], mItemSlotParam2[mCurrentSlot], 0.1f,
0.6f, 0.5f);
} else {
mpDrawCursor->setParam(1.0f, 1.0f, 0.1f, 0.6f, 0.5f);
}
setStatus(field_0x6b2);
} else {
f32 itemRingPosX =
g_ringHIO.mItemRingPosX + 304.0f + mRingRadiusH * cM_ssin(field_0x66e);
f32 itemRingPosY =
g_ringHIO.mItemRingPosY + 224.0f + mRingRadiusV * cM_scos(field_0x66e);
mpDrawCursor->setPos(itemRingPosX, itemRingPosY);
}
}
}
/* 801ED934-801ED938 1E8274 0004+00 1/0 0/0 0/0 .text stick_explain_init__12dMenu_Ring_cFv */
void dMenu_Ring_c::stick_explain_init() {
/* empty function */
}
/* 801ED938-801ED93C 1E8278 0004+00 1/0 0/0 0/0 .text stick_explain_force_init__12dMenu_Ring_cFv
*/
void dMenu_Ring_c::stick_explain_force_init() {
/* empty function */
}
/* 801ED93C-801EDA0C 1E827C 00D0+00 1/0 0/0 0/0 .text stick_explain_proc__12dMenu_Ring_cFv */
void dMenu_Ring_c::stick_explain_proc() {
mpItemExplain->move();
if (mpItemExplain->getStatus() == 0) {
if (dMeter2Info_getWarpStatus() == 1) {
dMeter2Info_warpInProc();
} else if (dMeter2Info_getWarpStatus() == 2) {
dMeter2Info_warpInProc();
}
dMeter2Info_setItemExplainWindowStatus(0);
setStatus(STATUS_WAIT);
}
f32 alphaRatio = mpItemExplain->getAlphaRatio();
mpTextParent[1]->setAlphaRate(alphaRatio);
mpBlackTex->setAlpha((1.0f - alphaRatio) * 150.0f);
}
/* 801EDA0C-801EDB14 1E834C 0108+00 1/0 0/0 0/0 .text stick_explain_force_proc__12dMenu_Ring_cFv
*/
void dMenu_Ring_c::stick_explain_force_proc() {
mpItemExplain->move();
u8 endButton = mpItemExplain->checkEndButton();
if (endButton == 1) {
setCombineBomb(field_0x6b3);
} else if (endButton == 2) {
u8 itemMaxNum = getItemMaxNum(mItemSlots[mCurrentSlot]);
u8 itemNum = getItemNum(mItemSlots[mCurrentSlot]);
mpItemExplain->openExplain(mItemSlots[mCurrentSlot], itemNum, itemMaxNum, true);
setStatus(STATUS_WAIT);
}
f32 alphaRatio = mpItemExplain->getAlphaRatio();
mpTextParent[1]->setAlphaRate(alphaRatio);
mpBlackTex->setAlpha((1.0f - alphaRatio) * 150.0f);
}
/* 801EDB14-801EDC98 1E8454 0184+00 2/2 0/0 0/0 .text setSelectItem__12dMenu_Ring_cFiUc
*/
void dMenu_Ring_c::setSelectItem(int i_idx, u8 i_itemNo) {
f32 texScale = 1.0f;
if (i_itemNo != NO_ITEM) {
if (field_0x6be[i_idx] == 0) {
field_0x6be[i_idx] = 1;
} else {
field_0x6be[i_idx] = 0;
}
field_0x686[i_idx] = dMeter2Info_readItemTexture(
i_itemNo, mpSelectItemTexBuf[i_idx][field_0x6be[i_idx]][0], mpSelectItemTex[i_idx][0],
mpSelectItemTexBuf[i_idx][field_0x6be[i_idx]][1], mpSelectItemTex[i_idx][1],
mpSelectItemTexBuf[i_idx][field_0x6be[i_idx]][2], mpSelectItemTex[i_idx][2], NULL, NULL,
-1);
texScale = dItem_data::getTexScale(i_itemNo) / 100.0f;
}
field_0x548[i_idx] = mpSelectItemTexBuf[i_idx][field_0x6be[i_idx]][0]->width / 48.0f * texScale;
field_0x558[i_idx] =
mpSelectItemTexBuf[i_idx][field_0x6be[i_idx]][0]->height / 48.0f * texScale;
}
/* 801EDC98-801EDF2C 1E85D8 0294+00 1/1 0/0 0/0 .text drawSelectItem__12dMenu_Ring_cFv */
void dMenu_Ring_c::drawSelectItem() {
for (int i = 0; i < 4; i++) {
if (field_0x674[i] != 0) {
if (field_0x674[i] < 10) {
f32 initSizeX = dMeter2Info_getMeterItemPanePtr(i)->getInitSizeX() * 1.7f;
f32 initSizeY = dMeter2Info_getMeterItemPanePtr(i)->getInitSizeY() * 1.7f;
f32 initScaleX = dMeter2Info_getMeterItemPanePtr(i)->getInitScaleX();
f32 initScaleY = dMeter2Info_getMeterItemPanePtr(i)->getInitScaleY();
Vec pos = dMeter2Info_getMeterItemPanePtr(i)->getGlobalVtxCenter(
dMeter2Info_getMeterItemPanePtr(i)->mPane, true, 0);
f32 fVar14 = field_0x674[i] / 10.0f;
if (field_0x6cd != 0xff) {
fVar14 = 1.0f - fVar14;
}
initSizeX = (initSizeX - 48.0f) * fVar14 + 48.0f;
initSizeY = (initSizeY - 48.0f) * fVar14 + 48.0f;
f32 fVar3 = field_0x538[i] + fVar14 * (initScaleX - field_0x538[i]);
f32 fVar4 = field_0x538[i] + fVar14 * (initScaleY - field_0x538[i]);
f32 fVar5 = field_0x518[i] + fVar14 * (pos.x - field_0x518[i]);
f32 fVar6 = field_0x528[i] + fVar14 * (pos.y - field_0x528[i]);
for (int j = 0; j < field_0x686[i]; j++) {
if (mpSelectItemTex[i][j] != NULL) {
mpSelectItemTex[i][j]->setAlpha(mAlphaRate * 255.0f);
f32 f3 = field_0x548[i] * initSizeX * fVar3;
f32 f4 = field_0x558[i] * initSizeY * fVar4;
mpSelectItemTex[i][j]->draw(fVar5 + (initSizeX - f3) * 0.5f,
fVar6 + (initSizeY - f4) * 0.5f, f3, f4, 0, 0,
0);
}
}
field_0x674[i]++;
} else {
setSelectItemForce(i);
}
}
}
}
/* 801EDF2C-801EDFDC 1E886C 00B0+00 4/4 0/0 0/0 .text setSelectItemForce__12dMenu_Ring_cFi */
void dMenu_Ring_c::setSelectItemForce(int i_idx) {
if (i_idx == 2) {
if (field_0x674[i_idx] != 0) {
dComIfGs_setSelectItemIndex(i_idx, field_0x6b4[i_idx]);
field_0x674[i_idx] = 0;
}
} else if (field_0x674[i_idx] != 0) {
for (int i = 0; i < 2; i++) {
dComIfGs_setMixItemIndex(i, field_0x6b8[i]);
dComIfGs_setSelectItemIndex(i, field_0x6b4[i]);
}
field_0x674[i_idx] = 0;
}
}
/* 801EDFDC-801EE058 1E891C 007C+00 1/1 0/0 0/0 .text getCursorPos__12dMenu_Ring_cFUc */
u8 dMenu_Ring_c::getCursorPos(u8 i_slotNo) {
for (s32 i = 0; i < mItemsTotal; i++) {
if (i_slotNo == dComIfGs_getLineUpItem(i)) {
return i;
}
}
return 0xff;
}
/* 801EE058-801EE15C 1E8998 0104+00 4/4 0/0 0/0 .text getItemNum__12dMenu_Ring_cFUc */
/** @details
* Returns current ammo depending on the current item slot the cursor is on
* This can be:
* - Ammo of any bomb type
* - Number of bee larvae in a bottle
* - Bow ammo
* - Slingshot ammo
*/
u8 dMenu_Ring_c::getItemNum(u8 i_slotNo) {
u8 item = dComIfGs_getItem(i_slotNo, false);
u8 ret = 0;
switch (item) {
case BOMB_BAG_LV1:
ret = 0;
break;
case NORMAL_BOMB:
case WATER_BOMB:
case POKE_BOMB:
ret = dComIfGs_getBombNum(i_slotNo - 0xF);
break;
case BEE_CHILD:
ret = dComIfGs_getBottleNum(i_slotNo - 0xB);
break;
case BOW:
case LIGHT_ARROW:
case ARROW_LV1:
case ARROW_LV2:
case ARROW_LV3:
ret = dComIfGs_getArrowNum();
break;
case PACHINKO:
ret = dComIfGs_getPachinkoNum();
break;
}
return ret;
}
/* 801EE15C-801EE228 1E8A9C 00CC+00 4/4 0/0 0/0 .text getItemMaxNum__12dMenu_Ring_cFUc */
/** @details
* Returns maximum capacity obtained depending on the currently selected item slot
* This can be:
* - Capacity of any bomb type
* - Capacity of bee larvae in a bottle
* - Bow capacity
* - Slingshot capacity
*/
u8 dMenu_Ring_c::getItemMaxNum(u8 i_slotNo) {
u8 item = dComIfGs_getItem(i_slotNo, false);
u8 ret = 0;
switch (item) {
case BOMB_BAG_LV1:
ret = 1;
break;
case NORMAL_BOMB:
case WATER_BOMB:
case POKE_BOMB:
ret = dComIfGs_getBombMax(item);
break;
case BEE_CHILD:
ret = dComIfGs_getBottleMax();
break;
case BOW:
case LIGHT_ARROW:
case ARROW_LV1:
case ARROW_LV2:
case ARROW_LV3:
ret = dComIfGs_getArrowMax();
break;
case PACHINKO:
ret = dComIfGs_getPachinkoMax();
break;
}
return ret;
}
/* 801EE228-801EE63C 1E8B68 0414+00 1/1 0/0 0/0 .text checkExplainForce__12dMenu_Ring_cFv
*/
bool dMenu_Ring_c::checkExplainForce() {
u8 local_18[4];
u8 item0 = dComIfGs_getItem(dComIfGs_getSelectItemIndex(0), false);
u8 item1 = dComIfGs_getItem(dComIfGs_getSelectItemIndex(1), false);
u8 item2 = dComIfGs_getItem(dComIfGs_getSelectItemIndex(2), false);
u8 item3 = dComIfGs_getItem(dComIfGs_getSelectItemIndex(3), false);
u8 item = dComIfGs_getItem(mItemSlots[mCurrentSlot], true);
for (int i = 0; i < 4; i++) {
local_18[i] = NO_ITEM;
}
switch (item) {
case BOW:
switch (item0) {
case NORMAL_BOMB:
case WATER_BOMB:
case POKE_BOMB:
local_18[0] = BOMB_ARROW;
break;
case HAWK_EYE:
local_18[0] = HAWK_ARROW;
break;
}
switch (item1) {
case NORMAL_BOMB:
case WATER_BOMB:
case POKE_BOMB:
local_18[1] = BOMB_ARROW;
break;
case HAWK_EYE:
local_18[1] = HAWK_ARROW;
break;
}
break;
case NORMAL_BOMB:
case WATER_BOMB:
case POKE_BOMB:
if (item0 == BOW) {
local_18[0] = BOMB_ARROW;
} else if (item1 == BOW) {
local_18[1] = BOMB_ARROW;
}
break;
case HAWK_EYE:
if (item0 == BOW) {
local_18[0] = HAWK_ARROW;
} else if (item1 == BOW) {
local_18[1] = HAWK_ARROW;
}
break;
case BEE_CHILD:
if (item0 == FISHING_ROD_1) {
local_18[0] = BEE_ROD;
} else if (item1 == FISHING_ROD_1) {
local_18[1] = BEE_ROD;
}
break;
case WORM:
if (item0 == FISHING_ROD_1) {
local_18[0] = WORM_ROD;
} else if (item1 == FISHING_ROD_1) {
local_18[1] = WORM_ROD;
}
break;
case ZORAS_JEWEL:
if (item0 == FISHING_ROD_1) {
local_18[0] = JEWEL_ROD;
} else if (item1 == FISHING_ROD_1) {
local_18[1] = JEWEL_ROD;
}
break;
case FISHING_ROD_1:
if (item0 == BEE_CHILD) {
local_18[0] = BEE_ROD;
} else if (item1 == BEE_CHILD) {
local_18[1] = BEE_ROD;
} else if (item0 == ZORAS_JEWEL) {
local_18[0] = JEWEL_ROD;
} else if (item1 == ZORAS_JEWEL) {
local_18[1] = JEWEL_ROD;
} else if (item0 == WORM) {
local_18[0] = WORM_ROD;
} else if (item1 == WORM) {
local_18[1] = WORM_ROD;
}
break;
}
if (local_18[0] != NO_ITEM && local_18[1] == NO_ITEM && local_18[2] == NO_ITEM && local_18[3] == NO_ITEM &&
dComIfGs_getMixItemIndex(0) == NO_ITEM)
{
field_0x6c7[0] = local_18[0];
field_0x6c7[1] = NO_ITEM;
field_0x6c7[2] = NO_ITEM;
field_0x6c7[3] = NO_ITEM;
} else if (local_18[0] == NO_ITEM && local_18[1] != NO_ITEM && local_18[2] == NO_ITEM &&
local_18[3] == NO_ITEM && dComIfGs_getMixItemIndex(1) == NO_ITEM)
{
field_0x6c7[0] = NO_ITEM;
field_0x6c7[1] = local_18[1];
field_0x6c7[2] = NO_ITEM;
field_0x6c7[3] = NO_ITEM;
} else {
field_0x6c7[0] = NO_ITEM;
field_0x6c7[1] = NO_ITEM;
field_0x6c7[2] = NO_ITEM;
field_0x6c7[3] = NO_ITEM;
}
return 0;
}
/* 801EE63C-801EE644 1E8F7C 0008+00 1/1 0/0 0/0 .text checkCombineBomb__12dMenu_Ring_cFi
*/
bool dMenu_Ring_c::checkCombineBomb(int param_0) {
return false;
}
/* 801EE644-801EE648 1E8F84 0004+00 1/1 0/0 0/0 .text setCombineBomb__12dMenu_Ring_cFi */
void dMenu_Ring_c::setCombineBomb(int param_0) {
/* empty function */
}
/* 801EE648-801EEA84 1E8F88 043C+00 2/2 0/0 0/0 .text drawNumber__12dMenu_Ring_cFiiff */
void dMenu_Ring_c::drawNumber(int i_itemNum, int i_itemMaxNum, f32 i_posX, f32 i_posY) {
if (i_itemNum > 100) {
i_itemNum = 100;
}
JUtility::TColor colorBlack;
JUtility::TColor colorWhite;
if (i_itemNum == i_itemMaxNum) {
// Full ammo: Golden digits
colorBlack.set(30, 30, 30, 0);
colorWhite.set(255, 200, 50, 255);
} else if (i_itemNum == 0) {
// Empty ammo: Gray digits
colorBlack.set(30, 30, 30, 0);
colorWhite.set(180, 180, 180, 255);
} else {
// White digits
colorBlack.set(0, 0, 0, 0);
colorWhite.set(255, 255, 255, 255);
}
for (int i = 0; i < 3; i++) {
mpItemNumTex[i]->setBlackWhite(colorBlack, colorWhite);
}
if (i_itemNum < 100) {
// If player has less than 100 arrows, only display
// the first two digits and hide the last one
ResTIMG* texture = (ResTIMG*)dComIfGp_getMain2DArchive()->getResource(
'TIMG', dMeter2Info_getNumberTextureName(i_itemNum / 10));
mpItemNumTex[0]->changeTexture(texture, 0);
texture = (ResTIMG*)dComIfGp_getMain2DArchive()->getResource(
'TIMG', dMeter2Info_getNumberTextureName(i_itemNum % 10));
mpItemNumTex[1]->changeTexture(texture, 0);
mpItemNumTex[2]->hide(); // This function hides the last digit
} else {
// Player has 100 arrows, display all three digits
ResTIMG* texture = (ResTIMG*)dComIfGp_getMain2DArchive()->getResource(
'TIMG', dMeter2Info_getNumberTextureName(i_itemNum / 100));
mpItemNumTex[0]->changeTexture(texture, 0);
i_itemNum = (u8)(i_itemNum % 100);
texture = (ResTIMG*)dComIfGp_getMain2DArchive()->getResource(
'TIMG', dMeter2Info_getNumberTextureName(i_itemNum / 10));
mpItemNumTex[1]->changeTexture(texture, 0);
texture = (ResTIMG*)dComIfGp_getMain2DArchive()->getResource(
'TIMG', dMeter2Info_getNumberTextureName(i_itemNum % 10));
mpItemNumTex[2]->changeTexture(texture, 0);
mpItemNumTex[2]->show(); // This function shows the last digit
}
// Gray out the item digits in the item wheel if player is wolf
u8 itemIconAlpha =
mPlayerIsWolf != 0 ? g_ringHIO.mItemIconAlpha_Wolf : g_ringHIO.mItemIconAlpha;
for (int i = 0; i < 3; i++) {
mpItemNumTex[i]->setAlpha(itemIconAlpha * mAlphaRate);
// Even though the statement iterates through all digits,
// the last digit wouldn't be visible to the player with
// less than 100 arrows because the hide() function was used
mpItemNumTex[i]->draw(i_posX + i * 16.0f, i_posY - 16.0f, 16.0f, 16.0f, 0, 0, 0);
}
}
/* 801EEA84-801EEAE4 1E93C4 0060+00 1/1 0/0 0/0 .text getItem__12dMenu_Ring_cFiUc */
u8 dMenu_Ring_c::getItem(int i_slot_no, u8 i_slot_no2) {
u8 item = dComIfGs_getItem(i_slot_no, 0);
dComIfGs_getItem(i_slot_no2, 0);
return item;
}
/* 801EEAE4-801EEB58 1E9424 0074+00 2/2 0/0 0/0 .text setDoStatus__12dMenu_Ring_cFUc */
void dMenu_Ring_c::setDoStatus(u8 i_doStatus) {
if (i_doStatus == 0 && mDoStatus == 0x24) {
if (field_0x68e > 0) {
field_0x68e--;
if (field_0x68e == 0) {
mDoStatus = 0;
}
} else {
field_0x68e = 10;
}
} else {
mDoStatus = i_doStatus;
field_0x68e = 0;
}
dComIfGp_setDoStatusForce(mDoStatus, 0);
}
/* 801EEB58-801EEC98 1E9498 0140+00 1/1 0/0 0/0 .text isMixItemOn__12dMenu_Ring_cFv */
bool dMenu_Ring_c::isMixItemOn() {
if (!mPlayerIsWolf && dComIfGs_getItem(mItemSlots[mCurrentSlot], false) != NO_ITEM) {
u8 item = dComIfGs_getItem(mItemSlots[mCurrentSlot], false);
switch (item) {
case HAWK_EYE:
case NORMAL_BOMB:
case WATER_BOMB:
case POKE_BOMB:
if ((dComIfGs_getSelectItemIndex(0) == SLOT_4) && (dComIfGs_getMixItemIndex(0) == NO_ITEM) ||
(dComIfGs_getMixItemIndex(0) == SLOT_4))
{
return true;
}
if ((dComIfGs_getSelectItemIndex(1) == SLOT_4) && (dComIfGs_getMixItemIndex(1) == NO_ITEM) ||
(dComIfGs_getMixItemIndex(1) == SLOT_4))
{
return true;
}
break;
}
}
return false;
}
/* 801EEC98-801EED84 1E95D8 00EC+00 1/1 0/0 0/0 .text isMixItemOff__12dMenu_Ring_cFv */
bool dMenu_Ring_c::isMixItemOff() {
if ((!mPlayerIsWolf) && (dComIfGs_getItem(mItemSlots[mCurrentSlot], 0) != NO_ITEM)) {
if ((dComIfGs_getMixItemIndex(0) == SLOT_4) &&
(mItemSlots[mCurrentSlot] == dComIfGs_getSelectItemIndex(0)))
{
return 1;
}
if ((dComIfGs_getMixItemIndex(1) == SLOT_4) &&
(mItemSlots[mCurrentSlot] == dComIfGs_getSelectItemIndex(1)))
{
return 1;
}
}
return 0;
}
/* 801EED84-801EEF14 1E96C4 0190+00 1/1 0/0 0/0 .text setMixMessage__12dMenu_Ring_cFv */
void dMenu_Ring_c::setMixMessage() {
if (mpTextParent[4] != NULL) {
if (isMixItemOff()) {
for (int i = 0; i < 5; i++) {
mpComboOffString[i]->hide();
mpBowArrowComboString[i]->show();
}
if (!mpTextParent[4]->isVisible()) {
mPikariFlashingSpeed = 18.0f - g_ringHIO.mPikariAnimSpeed;
Z2GetAudioMgr()->seStart(Z2SE_SY_ITEM_COMBINE_ICON, NULL, 0, 0, 1.0f, 1.0f, -1.0f,
-1.0f, 0);
}
mpTextParent[4]->show();
} else if (isMixItemOn()) {
for (int i = 0; i < 5; i++) {
mpComboOffString[i]->show();
mpBowArrowComboString[i]->hide();
}
if (!mpTextParent[4]->isVisible()) {
mPikariFlashingSpeed = 18.0f - g_ringHIO.mPikariAnimSpeed;
Z2GetAudioMgr()->seStart(Z2SE_SY_ITEM_COMBINE_ICON, NULL, 0, 0, 1.0f, 1.0f, -1.0f,
-1.0f, 0);
}
mpTextParent[4]->show();
} else {
mpTextParent[4]->hide();
mPikariFlashingSpeed = 0.0f;
}
}
}
/* 801EEF14-801EF11C 1E9854 0208+00 2/2 0/0 0/0 .text textScaleHIO__12dMenu_Ring_cFv */
void dMenu_Ring_c::textScaleHIO() {
for (int i = 0; i < 10; i++) {
if (mpTextParent[i] != NULL && i != 2) {
if (mRingGuidePosX[i] != g_ringHIO.mGuidePosX[i] ||
mRingGuidePosY[i] != g_ringHIO.mGuidePosY[i])
{
mRingGuidePosX[i] = g_ringHIO.mGuidePosX[i];
mRingGuidePosY[i] = g_ringHIO.mGuidePosY[i];
if (i == 8) {
mpTextParent[i]->paneTrans(mRingGuidePosX[i] + field_0x574[0], mRingGuidePosY[i]);
} else if (i == 9) {
mpTextParent[i]->paneTrans(mRingGuidePosX[i] + field_0x574[1], mRingGuidePosY[i]);
} else {
mpTextParent[i]->paneTrans(mRingGuidePosX[i], mRingGuidePosY[i]);
}
if (mpTextParent[2] != NULL && i == 1) {
mpTextParent[2]->paneTrans(mRingGuidePosX[i], mRingGuidePosY[i]);
}
}
if (mRingGuideScale[i] != g_ringHIO.mGuideScale[i]) {
mRingGuideScale[i] = g_ringHIO.mGuideScale[i];
if (i == 8 || i == 9) {
if (field_0x6cf == i - 8) {
setButtonScale(i - 8, g_ringHIO.mSelectButtonScale);
} else {
setButtonScale(i - 8, g_ringHIO.mUnselectButtonScale);
}
} else if (i == 5 || i == 7) {
mpTextParent[i]->scale(mRingGuideScale[i], mRingGuideScale[i]);
}
if (mpTextParent[2] != NULL && i == 1) {
mpTextParent[2]->scale(mRingGuideScale[i], mRingGuideScale[i]);
}
if (i < 5 && mpTextParent[i] != NULL) {
mpTextParent[i]->scale(mRingGuideScale[i], mRingGuideScale[i]);
}
}
}
}
}
/* 801EF11C-801EF13C 1E9A5C 0020+00 1/1 0/0 0/0 .text textCentering__12dMenu_Ring_cFv */
void dMenu_Ring_c::textCentering() {
textScaleHIO();
}
/* 801EF13C-801EF174 1E9A7C 0038+00 1/1 0/0 0/0 .text clacEllipseFunction__12dMenu_Ring_cFfff */
f32 dMenu_Ring_c::clacEllipseFunction(f32 param_0, f32 param_1, f32 param_2) {
return -JMAFastSqrt(param_2 * param_2 * (1.0f - (param_0 * param_0) / (param_1 * param_1)));
}
/* 801EF174-801EF1A0 1E9AB4 002C+00 1/1 0/0 0/0 .text calcDistance__12dMenu_Ring_cFffff
*/
f32 dMenu_Ring_c::calcDistance(f32 param_0, f32 param_1, f32 param_2, f32 param_3) {
return JMAFastSqrt((param_2 - param_0) * (param_2 - param_0) +
(param_3 - param_1) * (param_3 - param_1));
}
/* 801EF1A0-801EF484 1E9AE0 02E4+00 1/1 0/0 0/0 .text clacEllipsePlotAverage__12dMenu_Ring_cFiff
*/
void dMenu_Ring_c::clacEllipsePlotAverage(int param_0, f32 param_1, f32 param_2) {
f32 ring_radius_h = mRingRadiusH;
f32 ring_radius_v = mRingRadiusV;
f32 fVar8 = 0.0f;
f32 temp2;
f32 fVar3;
f32* ptr = (f32*)operator new[](16000);
f32* ptr_00 = (f32*)operator new[](16000);
f32* ptr_01 = (f32*)operator new[](16000);
f32 fVar9 = 0.0f;
for (int i = 0; i <= 1000; i++) {
ptr[i] = fVar8;
ptr_00[i] = clacEllipseFunction(fVar8, ring_radius_h, ring_radius_v);
fVar8 += ring_radius_h / 1000.0f;
ptr[i + 2000] = -ptr[i];
ptr_00[i + 2000] = -ptr_00[i];
if (i > 0) {
ptr_01[i - 1] = calcDistance(ptr[i - 1], ptr_00[i - 1], ptr[i], ptr_00[i]);
ptr_01[2000 - i] = ptr_01[i - 1];
ptr_01[i + 1999] = ptr_01[i - 1];
ptr_01[4000 - i] = ptr_01[i - 1];
fVar9 = fVar9 + ptr_01[2000 - i] + ptr_01[i + 1999] + ptr_01[4000 - i] + ptr_01[i - 1];
if (i < 1000) {
ptr[2000 - i] = ptr[i];
ptr_00[2000 - i] = -ptr_00[i];
ptr[4000 - i] = -ptr[i];
ptr_00[4000 - i] = ptr_00[i];
}
}
}
fVar8 = fVar9 / param_0;
fVar3 = 0.0f;
temp2 = 0.0f;
s32 j = 0;
mItemSlotPosX[0] = ptr[0] + param_1;
mItemSlotPosY[0] = ptr_00[0] + param_2;
for (int i = 0; i < 4000; i++) {
ring_radius_v = ptr_01[i];
fVar3 += ring_radius_v;
if (fVar8 >= temp2 && fVar8 < fVar3) {
j++;
if (fVar8 - temp2 <= fVar3 - fVar8) {
fVar3 = ptr_01[i];
mItemSlotPosX[j] = param_1 + ptr[i - 1];
mItemSlotPosY[j] = param_2 + ptr_00[i - 1];
} else {
fVar3 = 0.0f;
mItemSlotPosX[j] = param_1 + ptr[i];
mItemSlotPosY[j] = param_2 + ptr_00[i];
}
}
ring_radius_h = fVar8;
temp2 = fVar3;
if (j >= param_0 - 1)
break;
}
operator delete[](ptr);
operator delete[](ptr_00);
operator delete[](ptr_01);
}
/* 801EF484-801EF48C 1E9DC4 0008+00 1/1 0/0 0/0 .text dpdMove__12dMenu_Ring_cFv */
bool dMenu_Ring_c::dpdMove() {
return false;
}
/* 801EF48C-801EF560 1E9DCC 00D4+00 1/1 0/0 0/0 .text openExplain__12dMenu_Ring_cFUc */
u8 dMenu_Ring_c::openExplain(u8 param_0) {
if (field_0x6cf == 0xff && field_0x6d0 == 0xff) {
if (param_0 != 0xff) {
return mpItemExplain->openExplain(mItemSlots[mCurrentSlot],
getItemNum(mItemSlots[mCurrentSlot]),
getItemMaxNum(mItemSlots[mCurrentSlot]), false);
}
return 0;
}
u8 idx = field_0x6d0 != 0xff ? field_0x6d0 : field_0x6cf;
static const u32 i_nameID[2] = {0x4DE, 0x4E0};
static const u32 i_expID[2] = {0x4DF, 0x4E1};
return mpItemExplain->openExplainTx(i_nameID[idx], i_expID[idx]);
}