/** * @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]); }