diff --git a/include/d/menu/d_menu_ring.h b/include/d/menu/d_menu_ring.h index 3e1d6a8026f..e3c97c7aa47 100644 --- a/include/d/menu/d_menu_ring.h +++ b/include/d/menu/d_menu_ring.h @@ -15,6 +15,13 @@ class dSelect_cursor_c; class dMenu_Ring_c : public dDlst_base_c { public: + enum dMenu_Ring_Status { + /* 0 */ STATUS_WAIT, + /* 1 */ STATUS_MOVE, + /* 2 */ STATUS_EXPLAIN, + /* 3 */ STATUS_EXPLAIN_FORCE, + }; + /* 801E9118 */ dMenu_Ring_c(JKRExpHeap*, STControl*, CSTControl*, u8); /* 801EAB7C */ void _create(); /* 801EABE8 */ void _delete(); @@ -48,7 +55,7 @@ public: /* 801EDB14 */ void setSelectItem(int, u8); /* 801EDC98 */ void drawSelectItem(); /* 801EDF2C */ void setSelectItemForce(int); - /* 801EDFDC */ s32 getCursorPos(u8); + /* 801EDFDC */ u8 getCursorPos(u8); /* 801EE058 */ u8 getItemNum(u8); /* 801EE15C */ u8 getItemMaxNum(u8); /* 801EE228 */ bool checkExplainForce(); @@ -94,90 +101,104 @@ private: /* 0x068 */ J2DPicture* mpSelectItemTex[4][3]; /* 0x098 */ J2DPicture* mpItemTex[MAX_ITEM_SLOTS][3]; /* 0x1B8 */ J2DPicture* mpBlackTex; - /* 0x1BC */ J2DPicture* mpItemNumTex[3]; - /* 0x1C8 */ J2DTextBox* field_0x1c8[5]; - /* 0x1DC */ J2DTextBox* field_0x1dc[5]; + /* 0x1BC */ J2DPicture* mpItemNumTex[3]; // Displays digits on ammo-based items. Each index + // represents one drawn digit + /* 0x1C8 */ J2DTextBox* mpComboOffString[5]; // Displays "Combo Off" combined bow is equipped + // and cursor is on combinable item + /* 0x1DC */ J2DTextBox* mpBowArrowComboString[5]; // Displays "Bow & Arrow Combo" if bow is + // equipped and cursor is on combinable item /* 0x1F0 */ ResTIMG* mpSelectItemTexBuf[4][3][2]; /* 0x250 */ ResTIMG* mpItemBuf[MAX_ITEM_SLOTS][3]; /* 0x370 */ dMenu_ItemExplain_c* mpItemExplain; - /* 0x374 */ void* field_0x374[3]; - /* 0x380 */ cXyz field_0x380; - /* 0x38C */ f32 field_0x38c[MAX_ITEM_SLOTS]; - /* 0x3EC */ f32 field_0x3ec[MAX_ITEM_SLOTS]; - /* 0x44C */ f32 field_0x44c[MAX_ITEM_SLOTS]; - /* 0x4AC */ f32 field_0x4ac[MAX_ITEM_SLOTS]; - /* 0x50C */ f32 field_0x50c; - /* 0x510 */ f32 field_0x510; - /* 0x514 */ f32 field_0x514; + /* 0x374 */ void* + mpResData[3]; // Contains screen data from .blo files which control e.g. the + // appearance of specific sprites and where they are on the screen + /* 0x380 */ cXyz mDirectSelectCursorPos; // Positions the cursor with it's X and Z coordinates + // when Direct Select is active + /* 0x38C */ f32 mItemSlotPosX[MAX_ITEM_SLOTS]; + /* 0x3EC */ f32 mItemSlotPosY[MAX_ITEM_SLOTS]; + /* 0x44C */ f32 mItemSlotParam1[MAX_ITEM_SLOTS]; + /* 0x4AC */ f32 mItemSlotParam2[MAX_ITEM_SLOTS]; + /* 0x50C */ f32 mRingRadiusH; + /* 0x510 */ f32 mRingRadiusV; + /* 0x514 */ f32 mAlphaRate; // Responsible for multiple things but especially for the + // background becoming darker in a specific velocity when opening /* 0x518 */ f32 field_0x518[4]; /* 0x528 */ f32 field_0x528[4]; /* 0x538 */ f32 field_0x538[4]; /* 0x548 */ f32 field_0x548[4]; /* 0x558 */ f32 field_0x558[4]; - /* 0x568 */ f32 field_0x568; - /* 0x56C */ f32 field_0x56c; - /* 0x570 */ f32 field_0x570; + /* 0x568 */ f32 mCenterPosX; // Controls the position in the x-axis of the whole item wheel + // and moves it when opening or closing. + /* 0x56C */ f32 mCenterPosY; // Controls the position in the y-axis of the whole item wheel + // and moves it when opening or closing. + /* 0x570 */ f32 mPikariFlashingSpeed; // Controls the flashing speed of the combine icon (Bow & + // Arrow Combo) /* 0x574 */ f32 field_0x574[3]; /* 0x580 */ f32 field_0x580[3]; - /* 0x58C */ f32 field_0x58c; - /* 0x590 */ f32 field_0x590; - /* 0x594 */ f32 field_0x594; - /* 0x598 */ f32 field_0x598[10]; - /* 0x5C0 */ f32 field_0x5c0[10]; - /* 0x5E8 */ f32 field_0x5e8[10]; - /* 0x610 */ f32 field_0x610; - /* 0x614 */ f32 field_0x614; - /* 0x618 */ f32 field_0x618; - /* 0x61C */ f32 field_0x61c; - /* 0x620 */ f32 field_0x620; - /* 0x624 */ f32 field_0x624; - /* 0x628 */ u32 field_0x628; + /* 0x58C */ f32 mRingItemNamePosX; + /* 0x590 */ f32 mRingItemNamePosY; + /* 0x594 */ f32 mRingItemNameScale; + /* 0x598 */ f32 mRingGuidePosX[10]; + /* 0x5C0 */ f32 mRingGuidePosY[10]; + /* 0x5E8 */ f32 mRingGuideScale[10]; + /* 0x610 */ f32 mRingCursorScale; + /* 0x614 */ f32 mRingPosX; + /* 0x618 */ f32 mRingPosY; + /* 0x61C */ f32 mRingScaleH; + /* 0x620 */ f32 mRingScaleV; + /* 0x624 */ f32 mRingAlpha; // the alpha depends on if the player is a wolf or a human + /* 0x628 */ u32 field_0x628; // unused, not even initialized /* 0x62C */ u32 mPlayerIsWolf; /* 0x630 */ u32 mNameStringID; /* 0x634 */ s32 field_0x634; - /* 0x638 */ s16 field_0x638; - /* 0x63A */ s16 field_0x63a; - /* 0x63C */ s16 field_0x63c; + /* 0x638 */ s16 mOpenCloseFrames; + /* 0x63A */ s16 field_0x63a; // just gets set to zero in some functions. Unused + /* 0x63C */ s16 field_0x63c; // unused /* 0x63E */ s16 field_0x63e[MAX_ITEM_SLOTS]; /* 0x66E */ s16 field_0x66e; /* 0x670 */ s16 field_0x670; - /* 0x672 */ s16 field_0x672; + /* 0x672 */ s16 mWaitFrames; /* 0x674 */ s16 field_0x674[4]; /* 0x67C */ u16 field_0x67c; /* 0x67E */ s16 field_0x67e; - /* 0x680 */ s16 field_0x680; + /* 0x680 */ s16 mCursorSpeed; /* 0x682 */ s16 field_0x682; /* 0x684 */ s16 field_0x684; /* 0x686 */ s16 field_0x686[4]; /* 0x68E */ s16 field_0x68e; - /* 0x690 */ u8 field_0x690[MAX_ITEM_SLOTS]; - /* 0x6A8 */ u8 field_0x6a8; - /* 0x6A9 */ u8 field_0x6a9; - /* 0x6AA */ u8 field_0x6aa; - /* 0x6AB */ u8 field_0x6ab; + /* 0x690 */ u8 mItemSlots[MAX_ITEM_SLOTS]; + /* 0x6A8 */ u8 mCurrentSlot; + /* 0x6A9 */ u8 field_0x6a9; // unused + /* 0x6AA */ u8 mXButtonSlot; + /* 0x6AB */ u8 mYButtonSlot; /* 0x6AC */ u8 field_0x6ac; /* 0x6AD */ u8 field_0x6ad; - /* 0x6AE */ u8 field_0x6ae; - /* 0x6AF */ u8 field_0x6af; + /* 0x6AE */ u8 mItemsTotal; // Contains the amount of items which are actually obtained and in + // the item wheel + /* 0x6AF */ u8 mTotalItemTexToAlloc; // Similiar to mItemsTotal but used to allocate and setup + // the item textures based on obtained items /* 0x6B0 */ u8 mStatus; - /* 0x6B1 */ u8 field_0x6b1; - /* 0x6B2 */ u8 field_0x6b2; - /* 0x6B3 */ u8 field_0x6b3; + /* 0x6B1 */ u8 mOldStatus; + /* 0x6B2 */ u8 field_0x6b2; // used to set status but always zero + /* 0x6B3 */ u8 field_0x6b3; // ends up being useless since checkCombineComb and setCombineBomb + // are empty functions at least in GCN /* 0x6B4 */ u8 field_0x6b4[4]; /* 0x6B8 */ u8 field_0x6b8[4]; - /* 0x6BC */ u8 field_0x6bc; + /* 0x6BC */ u8 mRingOrigin; // The value decides the origin the item wheel comes from before + // it's in the center of the screen /* 0x6BD */ u8 mDrawFlag; /* 0x6BE */ u8 field_0x6be[4]; /* 0x6C2 */ u8 field_0x6c2; - /* 0x6C3 */ u8 field_0x6c3; - /* 0x6C4 */ u8 field_0x6c4; - /* 0x6C5 */ u8 field_0x6c5; - /* 0x6C6 */ u8 field_0x6c6; + /* 0x6C3 */ u8 field_0x6c3; // unused + /* 0x6C4 */ u8 field_0x6c4; // only gets set to current slot when item explain gets opened + /* 0x6C5 */ u8 field_0x6c5; // unused + /* 0x6C6 */ u8 field_0x6c6; // unused /* 0x6C7 */ u8 field_0x6c7[4]; /* 0x6CB */ u8 field_0x6cb; - /* 0x6CC */ u8 field_0x6cc; + /* 0x6CC */ u8 mDoStatus; /* 0x6CD */ u8 field_0x6cd; - /* 0x6CE */ u8 field_0x6ce; + /* 0x6CE */ bool mDirectSelectActive; /* 0x6CF */ u8 field_0x6cf; /* 0x6D0 */ u8 field_0x6d0; /* 0x6D1 */ u8 field_0x6d1; diff --git a/include/d/save/d_save.h b/include/d/save/d_save.h index e5a2eed3310..70740c8fd6a 100644 --- a/include/d/save/d_save.h +++ b/include/d/save/d_save.h @@ -51,7 +51,7 @@ enum ItemSlots { /* 0x01 */ SLOT_1, /* 0x02 */ SLOT_2, /* 0x03 */ SLOT_3, - /* 0x04 */ SLOT_4, + /* 0x04 */ SLOT_4, // Bow Slot /* 0x05 */ SLOT_5, /* 0x06 */ SLOT_6, /* 0x07 */ SLOT_7, diff --git a/src/d/menu/d_menu_ring.cpp b/src/d/menu/d_menu_ring.cpp index 90b2cb60a80..09891e4697c 100644 --- a/src/d/menu/d_menu_ring.cpp +++ b/src/d/menu/d_menu_ring.cpp @@ -1,6 +1,7 @@ /** - * d_menu_ring.cpp - * Menu - Item Wheel + * @file d_menu_ring.cpp + * @brief dolzel2 Menu - Item Wheel + * */ #include "d/menu/d_menu_ring.h" @@ -23,6 +24,8 @@ #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, @@ -31,25 +34,25 @@ static u8 cNullVec__6Z2Calc[12] = { /* 803BDEAC-803BDEDC 01AFCC 0030+00 3/4 0/0 0/0 .data stick_init */ typedef void (dMenu_Ring_c::*initFunc)(); static initFunc stick_init[] = { - &dMenu_Ring_c::stick_wait_init, - &dMenu_Ring_c::stick_move_init, - &dMenu_Ring_c::stick_explain_init, - &dMenu_Ring_c::stick_explain_force_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[] = { - &dMenu_Ring_c::stick_wait_proc, - &dMenu_Ring_c::stick_move_proc, - &dMenu_Ring_c::stick_explain_proc, - &dMenu_Ring_c::stick_explain_force_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 param_3) { + u8 i_ringOrigin) { static const u64 xy_text[5] = { 'yx_text', 'yx_te_s1', 'yx_te_s2', 'yx_te_s3', 'yx_te_s4', }; @@ -84,73 +87,73 @@ dMenu_Ring_c::dMenu_Ring_c(JKRExpHeap* i_heap, STControl* i_stick, CSTControl* i mpHeap = i_heap; mpStick = i_stick; mpCStick = i_cStick; - field_0x6bc = param_3; + mRingOrigin = i_ringOrigin; dMeter2Info_setItemExplainWindowStatus(0); - mpHeap->getTotalFreeSize(); - field_0x570 = 0.0f; - if (field_0x6bc == 0) { - field_0x568 = 0.0f; - field_0x56c = 448.0f; - } else if (field_0x6bc == 2) { - field_0x568 = 0.0f; - field_0x56c = -448.0f; + 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 (field_0x6bc == 3) { - field_0x568 = 608.0f; - field_0x56c = 0.0f; - } else if (field_0x6bc == 1) { - field_0x568 = -608.0f; - field_0x56c = 0.0f; + if (mRingOrigin == 3) { + mCenterPosX = 608.0f; + mCenterPosY = 0.0f; + } else if (mRingOrigin == 1) { + mCenterPosX = -608.0f; + mCenterPosY = 0.0f; } else { - field_0x568 = 0.0f; - field_0x56c = 0.0f; + mCenterPosX = 0.0f; + mCenterPosY = 0.0f; } - field_0x58c = 0.0f; - field_0x590 = 0.0f; - field_0x594 = 1.0f; + mRingItemNamePosX = 0.0f; + mRingItemNamePosY = 0.0f; + mRingItemNameScale = 1.0f; for (int i = 0; i < 10; i++) { - field_0x598[i] = 0.0f; - field_0x5c0[i] = 0.0f; - field_0x5e8[i] = 1.0f; + mRingGuidePosX[i] = 0.0f; + mRingGuidePosY[i] = 0.0f; + mRingGuideScale[i] = 1.0f; } - field_0x610 = 1.0f; - field_0x614 = 0.0f; - field_0x618 = 0.0f; - field_0x61c = 1.0f; - field_0x620 = 1.0f; - field_0x624 = 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; - field_0x638 = 0; - mStatus = 0; - field_0x6b1 = 0; + mOpenCloseFrames = 0; + mStatus = STATUS_WAIT; + mOldStatus = STATUS_WAIT; field_0x6b2 = 0; - field_0x672 = 0; - field_0x380.set(0.0f, 0.0f, 0.0f); - field_0x6a8 = 0; + mWaitFrames = 0; + mDirectSelectCursorPos.set(0.0f, 0.0f, 0.0f); + mCurrentSlot = SLOT_0; field_0x6a9 = 0; - field_0x6aa = 0xff; - field_0x6ab = 0xff; + mXButtonSlot = 0xff; + mYButtonSlot = 0xff; field_0x6ac = 0xff; field_0x6ad = 0xff; field_0x670 = 0; field_0x67e = 0; field_0x6b3 = 0; - field_0x514 = 0.0f; + mAlphaRate = 0.0f; mDrawFlag = 0; - field_0x6af = 0; + mTotalItemTexToAlloc = 0; field_0x67c = 4; field_0x6c5 = 0; - field_0x680 = 0; + mCursorSpeed = 0; field_0x684 = 0; field_0x6c6 = 0; field_0x6c4 = 0xff; - field_0x6cc = 0; + mDoStatus = 0; field_0x6cb = 0xff; field_0x6cd = 0xff; - field_0x6ce = 0; + mDirectSelectActive = false; field_0x68e = 0; field_0x6cf = 0xff; field_0x6d0 = 0xff; @@ -165,12 +168,12 @@ dMenu_Ring_c::dMenu_Ring_c(JKRExpHeap* i_heap, STControl* i_stick, CSTControl* i field_0x6c3 = 0xff; field_0x6c2 = 0; for (int i = 0; i < 3; i++) { - field_0x374[i] = NULL; + mpResData[i] = NULL; } for (int i = 0; i < 4; i++) { field_0x6c7[i] = 0xff; } - switch (field_0x6bc) { + switch (mRingOrigin) { case 0: field_0x682 = 0x8000; break; @@ -197,46 +200,46 @@ dMenu_Ring_c::dMenu_Ring_c(JKRExpHeap* i_heap, STControl* i_stick, CSTControl* i field_0x686[i] = 0; } for (int i = 0; i < MAX_ITEM_SLOTS; i++) { - field_0x3ec[i] = 0.0f; - field_0x38c[i] = 0.0f; + mItemSlotPosY[i] = 0.0f; + mItemSlotPosX[i] = 0.0f; for (int j = 0; j < 3; j++) { mpItemTex[i][j] = NULL; mpItemBuf[i][j] = NULL; } - field_0x690[i] = 0; + mItemSlots[i] = 0; field_0x63e[i] = 0; - field_0x4ac[i] = 0.0f; - field_0x44c[i] = 0.0f; + mItemSlotParam2[i] = 0.0f; + mItemSlotParam1[i] = 0.0f; } for (int i = 0; i < MAX_ITEM_SLOTS; i++) { - if (dComIfGs_getLineUpItem(i) != 0xff) { - field_0x6af++; + if (dComIfGs_getLineUpItem(i) != NO_ITEM) { + mTotalItemTexToAlloc++; } } - if (field_0x6af < 1) { - field_0x6ae = 1; + if (mTotalItemTexToAlloc < 1) { + mItemsTotal = 1; } else { - field_0x6ae = field_0x6af; + mItemsTotal = mTotalItemTexToAlloc; } for (int i = 0; i < MAX_ITEM_SLOTS; i++) { - field_0x690[i] = dComIfGs_getLineUpItem(i); + mItemSlots[i] = dComIfGs_getLineUpItem(i); } - for (int i = 0; i < field_0x6ae; i++) { - field_0x690[i] = dComIfGs_getLineUpItem(i); + for (int i = 0; i < mItemsTotal; i++) { + mItemSlots[i] = dComIfGs_getLineUpItem(i); if (dComIfGs_getSelectItemIndex(0) == dComIfGs_getLineUpItem(i)) { - field_0x6aa = i; + mXButtonSlot = i; } if (dComIfGs_getSelectItemIndex(1) == dComIfGs_getLineUpItem(i)) { - field_0x6ab = i; + mYButtonSlot = i; } if (dComIfGs_getSelectItemIndex(2) == dComIfGs_getWolfAbility(i)) { field_0x6ac = i; } } - field_0x50c = g_ringHIO.mRingRadiusH; - field_0x510 = g_ringHIO.mRingRadiusV; + mRingRadiusH = g_ringHIO.mRingRadiusH; + mRingRadiusV = g_ringHIO.mRingRadiusV; field_0x66e = 0x8000; - field_0x634 = 0x10000 / field_0x6ae; + 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++) { @@ -263,7 +266,7 @@ dMenu_Ring_c::dMenu_Ring_c(JKRExpHeap* i_heap, STControl* i_stick, CSTControl* i } mpKanteraMeter = new dKantera_icon_c(); mpScreen = new J2DScreen(); - dPaneClass_setPriority(&field_0x374[0], mpHeap, mpScreen, + dPaneClass_setPriority(&mpResData[0], mpHeap, mpScreen, "SCRN/zelda_item_select_icon_message_ver2.blo", 0x20000, dComIfGp_getRingResArchive()); dPaneClass_showNullPane(mpScreen); @@ -278,14 +281,15 @@ dMenu_Ring_c::dMenu_Ring_c(JKRExpHeap* i_heap, STControl* i_stick, CSTControl* i for (int i = 5; i < 10; i++) { mpTextParent[i] = NULL; } - for (int i = 0; i < field_0x6af; i++) { + 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(field_0x690[i], false); + u8 item = dComIfGs_getItem(mItemSlots[i], false); if (item != NO_ITEM) { - if (item == 0x53) { - item = 0x43; + 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, @@ -299,12 +303,12 @@ dMenu_Ring_c::dMenu_Ring_c(JKRExpHeap* i_heap, STControl* i_stick, CSTControl* i f32 fVar1 = (texScale / 100.0f); f32 fVar2 = (mpItemBuf[i][0]->width / 48.0f); fVar1 = fVar2 * fVar1; - field_0x44c[i] = fVar1; - field_0x4ac[i] = (mpItemBuf[i][0]->height / 48.0f * (texScale / 100.0f)); + mItemSlotParam1[i] = fVar1; + mItemSlotParam2[i] = (mpItemBuf[i][0]->height / 48.0f * (texScale / 100.0f)); } } mpScreen->search('r_btn_n')->hide(); - if (mPlayerIsWolf != 0) { + if (mPlayerIsWolf) { mpScreen->search('yx_te_s1')->hide(); mpScreen->search('yx_te_s2')->hide(); mpScreen->search('yx_te_s3')->hide(); @@ -341,18 +345,18 @@ dMenu_Ring_c::dMenu_Ring_c(JKRExpHeap* i_heap, STControl* i_stick, CSTControl* i field_0x580[2] = mpString->getString(0x4CD, fc1_TextBox, NULL, NULL, NULL, 0); } for (int i = 0; i < 5; i++) { - field_0x1c8[i] = (J2DTextBox*)mpScreen->search(ft_on[i]); + mpComboOffString[i] = (J2DTextBox*)mpScreen->search(ft_on[i]); mpScreen->search(t_on[i])->hide(); - field_0x1c8[i]->setString(0x40, ""); - field_0x1c8[i]->setFont(mDoExt_getMesgFont()); - mpString->getString(0x4D2, field_0x1c8[i], NULL, NULL, NULL, 0); + 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++) { - field_0x1dc[i] = (J2DTextBox*)mpScreen->search(ft_off[i]); + mpBowArrowComboString[i] = (J2DTextBox*)mpScreen->search(ft_off[i]); mpScreen->search(t_off[i])->hide(); - field_0x1dc[i]->setString(0x40, ""); - field_0x1dc[i]->setFont(mDoExt_getMesgFont()); - mpString->getString(0x4D3, field_0x1dc[i], NULL, NULL, NULL, 0); + 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"); @@ -360,13 +364,13 @@ dMenu_Ring_c::dMenu_Ring_c(JKRExpHeap* i_heap, STControl* i_stick, CSTControl* i mpBlackTex->setBlackWhite(JUtility::TColor(0, 0, 0, 0), JUtility::TColor(0, 0, 0, 0xff)); mpBlackTex->setAlpha(0); mpSpotScreen = new J2DScreen(); - dPaneClass_setPriority(&field_0x374[1], mpHeap, mpSpotScreen, + 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(&field_0x374[2], mpHeap, mpCenterScreen, + dPaneClass_setPriority(&mpResData[2], mpHeap, mpCenterScreen, "SCRN/zelda_item_select_icon3_center_parts.blo", 0x20000, dComIfGp_getRingResArchive()); dPaneClass_showNullPane(mpCenterScreen); @@ -391,9 +395,9 @@ dMenu_Ring_c::dMenu_Ring_c(JKRExpHeap* i_heap, STControl* i_stick, CSTControl* i mpDrawCursor->setAlphaRate(1.0f); mpItemExplain = new dMenu_ItemExplain_c(mpHeap, dComIfGp_getRingResArchive(), i_stick, true); setRotate(); - mpDrawCursor->setPos(field_0x38c[0] + field_0x568, field_0x3ec[0] + field_0x56c); - if (dComIfGs_getItem(field_0x690[0], false) != NO_ITEM) { - mpDrawCursor->setParam(field_0x44c[0], field_0x4ac[0], 0.1f, 0.6f, 0.5f); + 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); } @@ -471,9 +475,9 @@ dMenu_Ring_c::~dMenu_Ring_c() { mpCenterScreen = NULL; for (int i = 0; i < 3; i++) { - if (field_0x374[i] != NULL) { - mpHeap->free(field_0x374[i]); - field_0x374[i] = NULL; + if (mpResData[i] != NULL) { + mpHeap->free(mpResData[i]); + mpResData[i] = NULL; } } @@ -496,6 +500,10 @@ dMenu_Ring_c::~dMenu_Ring_c() { } /* 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); @@ -507,20 +515,28 @@ void dMenu_Ring_c::_delete() { } /* 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() { - field_0x50c = g_ringHIO.mRingRadiusH; - field_0x510 = g_ringHIO.mRingRadiusV; - field_0x6b1 = mStatus; + mRingRadiusH = g_ringHIO.mRingRadiusH; + mRingRadiusV = g_ringHIO.mRingRadiusV; + mOldStatus = mStatus; // Save current status for check mpItemExplain->move(); - (this->*stick_proc[mStatus])(); - if (mStatus != field_0x6b1) { + (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 (field_0x610 != g_ringHIO.mCursorScale) { - field_0x610 = g_ringHIO.mCursorScale; + if (mRingCursorScale != g_ringHIO.mCursorScale) { + mRingCursorScale = g_ringHIO.mCursorScale; mpDrawCursor->setScale(g_ringHIO.mCursorScale); } } @@ -530,48 +546,48 @@ void dMenu_Ring_c::_draw() { J2DGrafContext* grafPort = dComIfGp_getCurrentGrafPort(); grafPort->setup2D(); if (mDrawFlag == 0) { - mpSpotParent->setAlphaRate(field_0x514 * g_ringHIO.mOverlayAlpha); + mpSpotParent->setAlphaRate(mAlphaRate * g_ringHIO.mOverlayAlpha); mpSpotScreen->draw(0.0f, 0.0f, grafPort); - if (field_0x594 != g_ringHIO.mItemNameScale) { - field_0x594 = g_ringHIO.mItemNameScale; - mpNameParent->scale(field_0x594, field_0x594); + if (mRingItemNameScale != g_ringHIO.mItemNameScale) { + mRingItemNameScale = g_ringHIO.mItemNameScale; + mpNameParent->scale(mRingItemNameScale, mRingItemNameScale); } - if (field_0x58c != g_ringHIO.mItemNamePosX || field_0x590 != g_ringHIO.mItemNamePosY) { - field_0x58c = g_ringHIO.mItemNamePosX; - field_0x590 = g_ringHIO.mItemNamePosY; - mpNameParent->paneTrans(field_0x58c, field_0x590); + if (mRingItemNamePosX != g_ringHIO.mItemNamePosX || mRingItemNamePosY != g_ringHIO.mItemNamePosY) { + mRingItemNamePosX = g_ringHIO.mItemNamePosX; + mRingItemNamePosY = g_ringHIO.mItemNamePosY; + mpNameParent->paneTrans(mRingItemNamePosX, mRingItemNamePosY); } - if (field_0x614 != g_ringHIO.mRingPosX || field_0x618 != g_ringHIO.mRingPosY) { - field_0x614 = g_ringHIO.mRingPosX; - field_0x618 = g_ringHIO.mRingPosY; - mpCircle->paneTrans(field_0x614, field_0x618); + if (mRingPosX != g_ringHIO.mRingPosX || mRingPosY != g_ringHIO.mRingPosY) { + mRingPosX = g_ringHIO.mRingPosX; + mRingPosY = g_ringHIO.mRingPosY; + mpCircle->paneTrans(mRingPosX, mRingPosY); } - if (field_0x61c != g_ringHIO.mRingScaleH || field_0x620 != g_ringHIO.mRingScaleV) { - field_0x61c = g_ringHIO.mRingScaleH; - field_0x620 = g_ringHIO.mRingScaleV; - mpCircle->scale(field_0x61c, field_0x620); + 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 (field_0x624 != ringAlpha) { - field_0x624 = ringAlpha; - mpCircle->setAlphaRate(field_0x624); + if (mRingAlpha != ringAlpha) { + mRingAlpha = ringAlpha; + mpCircle->setAlphaRate(mRingAlpha); } - mpCenterParent->setAlphaRate(field_0x514); - mpCenterScreen->draw(field_0x568, field_0x56c, grafPort); + mpCenterParent->setAlphaRate(mAlphaRate); + mpCenterScreen->draw(mCenterPosX, mCenterPosY, grafPort); drawItem(); textScaleHIO(); f32 alphaRate = mpTextParent[1]->getAlphaRate(); - mpMessageParent->setAlphaRate(field_0x514); - if (mStatus == 2) { - mpTextParent[1]->setAlphaRate(alphaRate * field_0x514); + mpMessageParent->setAlphaRate(mAlphaRate); + if (mStatus == STATUS_EXPLAIN) { + mpTextParent[1]->setAlphaRate(alphaRate * mAlphaRate); } - mpScreen->draw(field_0x568, field_0x56c, grafPort); - if (mStatus != 2 && field_0x570 > 0.0f) { + 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, &field_0x570, g_ringHIO.mPikariScale, g_ringHIO.mPikariFrontOuter, + pos.x, pos.y, &mPikariFlashingSpeed, g_ringHIO.mPikariScale, g_ringHIO.mPikariFrontOuter, g_ringHIO.mPikariFrontInner, g_ringHIO.mPikariBackOuter, g_ringHIO.mPikariBackInner, g_ringHIO.mPikariAnimSpeed, 2); } @@ -580,7 +596,7 @@ void dMenu_Ring_c::_draw() { drawSelectItem(); drawItem2(); mpDrawCursor->draw(); - mpItemExplain->trans(field_0x568, field_0x56c); + mpItemExplain->trans(mCenterPosX, mCenterPosY); mpItemExplain->draw((J2DOrthoGraph*)grafPort); drawFlag0(); } @@ -593,56 +609,59 @@ void dMenu_Ring_c::setKanteraPos(f32 i_posX, f32 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 = 0; - if (field_0x638 == 0) { + bool opened = false; + if (mOpenCloseFrames == 0) { dMeter2Info_set2DVibrationM(); } - field_0x638++; - field_0x514 = (f32)field_0x638 / (f32)g_ringHIO.mOpenFrames; - if (field_0x6bc == 0) { - field_0x568 = 0.0f; - field_0x56c = (1.0f - field_0x514) * 448.0f; - } else if (field_0x6bc == 2) { - field_0x568 = 0.0f; - field_0x56c = (1.0f - field_0x514) * -448.0f; - } else if (field_0x6bc == 3) { - field_0x568 = (1.0f - field_0x514) * 608.0f; - field_0x56c = 0.0f; - } else if (field_0x6bc == 1) { - field_0x568 = (1.0f - field_0x514) * -608.0f; - field_0x56c = 0.0f; + 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 (field_0x638 >= g_ringHIO.mOpenFrames) { - field_0x638 = g_ringHIO.mCloseFrames; - field_0x514 = 1.0f; - field_0x568 = 0.0f; - field_0x56c = 0.0f; - opened = 1; + 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(field_0x38c[0] + field_0x568, field_0x3ec[0] + field_0x56c); - if (dComIfGs_getItem(field_0x690[0], false) != NO_ITEM) { - mpDrawCursor->setParam(field_0x44c[0], field_0x4ac[0], 0.1f, 0.6f, 0.5f); + 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 == 0 && field_0x6b1 != 3 && field_0x6b1 != 2) { + 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(0x4000) != 0) { if (dMw_UP_TRIGGER()) { - field_0x6bc = 0; + mRingOrigin = 0; } else if (dMw_DOWN_TRIGGER()) { - field_0x6bc = 2; + mRingOrigin = 2; } else { - field_0x6bc = 0xff; + mRingOrigin = 0xff; } Z2GetAudioMgr()->seStart(Z2SE_ITEM_RING_OUT, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); dMeter2Info_set2DVibrationM(); @@ -654,38 +673,38 @@ bool dMenu_Ring_c::isMoveEnd() { /* 801EB3CC-801EB624 1E5D0C 0258+00 0/0 1/1 0/0 .text isClose__12dMenu_Ring_cFv */ bool dMenu_Ring_c::isClose() { - bool closed = 1; + bool closed = true; if (field_0x674[0] != 0 || field_0x674[1] != 0 || field_0x674[2] != 0 || field_0x674[3] != 0) { return 0; } - field_0x638--; - field_0x514 = (f32)field_0x638 / (f32)g_ringHIO.mCloseFrames; - if (field_0x638 <= 0) { + mOpenCloseFrames--; + mAlphaRate = (f32)mOpenCloseFrames / (f32)g_ringHIO.mCloseFrames; + if (mOpenCloseFrames <= 0) { for (int i = 0; i < 4; i++) { setSelectItemForce(i); } - field_0x638 = 0; - field_0x514 = 0.0f; + mOpenCloseFrames = 0; + mAlphaRate = 0.0f; } else { - closed = 0; + closed = false; } - if (field_0x6bc == 0) { - field_0x568 = 0.0f; - field_0x56c = (1.0f - field_0x514) * -448.0f; - } else if (field_0x6bc == 2) { - field_0x568 = 0.0f; - field_0x56c = (1.0f - field_0x514) * 448.0f; - } else if (field_0x6bc == 3) { - field_0x568 = (1.0f - field_0x514) * -608.0f; - field_0x56c = 0.0f; - } else if (field_0x6bc == 1) { - field_0x568 = (1.0f - field_0x514) * 608.0f; - field_0x56c = 0.0f; + 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(field_0x38c[field_0x6a8] + field_0x568, - field_0x3ec[field_0x6a8] + field_0x56c); - if (dComIfGs_getItem(field_0x690[field_0x6a8], false) != NO_ITEM) { - mpDrawCursor->setParam(field_0x44c[field_0x6a8], field_0x4ac[field_0x6a8], 0.1f, 0.6f, + 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); @@ -703,9 +722,9 @@ u8 dMenu_Ring_c::getStickInfo(STControl* i_stick) { int something_stick = abs_stick_angle + 0x8000; s32 temp; - u32 uVar3 = field_0x6ae / 2; + u32 uVar3 = mItemsTotal / 2; u8 val2 = uVar3; - int val = field_0x6ae; + int val = mItemsTotal; if ((val % 2) != 0) { temp = field_0x634; @@ -726,41 +745,41 @@ u8 dMenu_Ring_c::getStickInfo(STControl* i_stick) { } } - if (field_0x6a8 != val2) { + if (mCurrentSlot != val2) { if (mDoCPd_c::getHoldL(PAD_1)) { - field_0x380.x = field_0x38c[field_0x6a8]; - field_0x380.z = field_0x3ec[field_0x6a8]; - field_0x6a8 = val2; - field_0x6ce = 1; - } else if (field_0x6a8 >= uVar3) { - if (val2 >= (u8)(field_0x6a8 - uVar3) && val2 < field_0x6a8) { - if (field_0x6a8 == 0) { - field_0x6a8 = field_0x6ae - 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 { - field_0x6a8--; + mCurrentSlot--; } - } else if (field_0x6a8 == (u8)(field_0x6ae - 1)) { - field_0x6a8 = 0; + } else if (mCurrentSlot == (u8)(mItemsTotal - 1)) { + mCurrentSlot = 0; } else { - field_0x6a8++; + mCurrentSlot++; } } else { - u8 max = field_0x6a8 + uVar3; - if (val2 > field_0x6a8 && val2 <= max) { - if (field_0x6a8 == (u8)(field_0x6ae - 1)) { - field_0x6a8 = 0; + u8 max = mCurrentSlot + uVar3; + if (val2 > mCurrentSlot && val2 <= max) { + if (mCurrentSlot == (u8)(mItemsTotal - 1)) { + mCurrentSlot = 0; } else { - field_0x6a8++; + mCurrentSlot++; } - } else if (field_0x6a8 == 0) { - field_0x6a8 = field_0x6ae - 1; + } else if (mCurrentSlot == 0) { + mCurrentSlot = mItemsTotal - 1; } else { - field_0x6a8--; + mCurrentSlot--; } } - field_0x670 = field_0x63e[field_0x6a8]; - if (field_0x6ae == 2 && stick_angle < 0) { - if (field_0x6a8 == 0) { + field_0x670 = field_0x63e[mCurrentSlot]; + if (mItemsTotal == 2 && stick_angle < 0) { + if (mCurrentSlot == 0) { field_0x6d3 = 0; } else { field_0x6d3 = 1; @@ -769,7 +788,7 @@ u8 dMenu_Ring_c::getStickInfo(STControl* i_stick) { return 1; } } else { - field_0x680 = 0; + mCursorSpeed = 0; dpdMove(); if (field_0x6c2 != 0xff) { return 0; @@ -815,11 +834,11 @@ s16 dMenu_Ring_c::calcStickAngle(STControl* i_stick, u8 param_1) { /* 801EB960-801EBA38 1E62A0 00D8+00 1/1 0/0 0/0 .text setRotate__12dMenu_Ring_cFv */ void dMenu_Ring_c::setRotate() { - clacEllipsePlotAverage(field_0x6ae, g_ringHIO.mItemRingPosX + 304.0f, + clacEllipsePlotAverage(mItemsTotal, g_ringHIO.mItemRingPosX + 304.0f, g_ringHIO.mItemRingPosY + 224.0f); - for (int i = 0; i < field_0x6ae; i++) { - field_0x63e[i] = cM_atan2s(field_0x38c[i] - (304.0f + g_ringHIO.mItemRingPosX), - field_0x3ec[i] - (224.0f + g_ringHIO.mItemRingPosY)); + 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)); } } @@ -835,9 +854,9 @@ void dMenu_Ring_c::setItemScale(int i_idx, f32 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; + i_idx += 8; // reach the offset in mpTextParent for the buttons if (mpTextParent[i_idx] != NULL) { - f32 buttonScale = i_scale * field_0x5e8[i_idx]; + f32 buttonScale = i_scale * mRingGuideScale[i_idx]; mpTextParent[i_idx]->scale(buttonScale, buttonScale); } } @@ -849,23 +868,23 @@ void dMenu_Ring_c::setItem() { u8 uVar3; u8 uVar4; - if (field_0x6aa != NO_ITEM) { - uVar1 = field_0x690[field_0x6aa]; + if (mXButtonSlot != NO_ITEM) { + uVar1 = mItemSlots[mXButtonSlot]; } else { uVar1 = NO_ITEM; } - if (field_0x6ab != NO_ITEM) { - uVar2 = field_0x690[field_0x6ab]; + if (mYButtonSlot != NO_ITEM) { + uVar2 = mItemSlots[mYButtonSlot]; } else { uVar2 = NO_ITEM; } if (field_0x6ac != NO_ITEM) { - uVar3 = field_0x690[field_0x6ac]; + uVar3 = mItemSlots[field_0x6ac]; } else { uVar3 = NO_ITEM; } if (field_0x6ad != NO_ITEM) { - uVar4 = field_0x690[field_0x6ad]; + uVar4 = mItemSlots[field_0x6ad]; } else { uVar4 = NO_ITEM; } @@ -880,63 +899,63 @@ void dMenu_Ring_c::setItem() { checkExplainForce(); if (field_0x6b3 == 0) { uVar1 = dComIfGs_getSelectItemIndex(1); - if (field_0x690[field_0x6a8] == uVar1) { + if (mItemSlots[mCurrentSlot] == uVar1) { uVar2 = dComIfGs_getSelectItemIndex(0); mixItemIndex1 = dComIfGs_getMixItemIndex(0); if (uVar2 == NO_ITEM) { - field_0x6ab = NO_ITEM; + mYButtonSlot = NO_ITEM; } else { - field_0x6ab = field_0x6aa; + mYButtonSlot = mXButtonSlot; } - field_0x6aa = field_0x6a8; - uVar1 = field_0x690[field_0x6aa]; + mXButtonSlot = mCurrentSlot; + uVar1 = mItemSlots[mXButtonSlot]; mixItemIndex0 = NO_ITEM; } else { - if (dComIfGs_getMixItemIndex(1) == field_0x690[field_0x6a8]) { + if (dComIfGs_getMixItemIndex(1) == mItemSlots[mCurrentSlot]) { uVar2 = dComIfGs_getSelectItemIndex(0); mixItemIndex1 = NO_ITEM; if (uVar2 == NO_ITEM) { - field_0x6ab = NO_ITEM; + mYButtonSlot = NO_ITEM; } else { - field_0x6ab = field_0x6aa; + mYButtonSlot = mXButtonSlot; } - field_0x6aa = field_0x6a8; - uVar1 = field_0x690[field_0x6aa]; + mXButtonSlot = mCurrentSlot; + uVar1 = mItemSlots[mXButtonSlot]; mixItemIndex0 = NO_ITEM; } else { - field_0x6aa = field_0x6a8; - uVar1 = field_0x690[field_0x6aa]; + mXButtonSlot = mCurrentSlot; + uVar1 = mItemSlots[mXButtonSlot]; mixItemIndex0 = NO_ITEM; } } } else if (field_0x6b3 == 1) { - if (field_0x690[field_0x6a8] == dComIfGs_getSelectItemIndex(0)) { + if (mItemSlots[mCurrentSlot] == dComIfGs_getSelectItemIndex(0)) { u8 temp = dComIfGs_getSelectItemIndex(1); uVar1 = temp; mixItemIndex0 = dComIfGs_getMixItemIndex(1); if (temp == NO_ITEM) { - field_0x6aa = NO_ITEM; + mXButtonSlot = NO_ITEM; } else { - field_0x6aa = field_0x6ab; + mXButtonSlot = mYButtonSlot; } - field_0x6ab = field_0x6a8; - uVar2 = field_0x690[field_0x6ab]; + mYButtonSlot = mCurrentSlot; + uVar2 = mItemSlots[mYButtonSlot]; mixItemIndex1 = NO_ITEM; } else { - if (dComIfGs_getMixItemIndex(0) == field_0x690[field_0x6a8]) { + if (dComIfGs_getMixItemIndex(0) == mItemSlots[mCurrentSlot]) { uVar1 = dComIfGs_getSelectItemIndex(1); mixItemIndex0 = NO_ITEM; if (uVar1 == NO_ITEM) { - field_0x6aa = NO_ITEM; + mXButtonSlot = NO_ITEM; } else { - field_0x6aa = field_0x6ab; + mXButtonSlot = mYButtonSlot; } - field_0x6ab = field_0x6a8; - uVar2 = field_0x690[field_0x6ab]; + mYButtonSlot = mCurrentSlot; + uVar2 = mItemSlots[mYButtonSlot]; mixItemIndex1 = NO_ITEM; } else { - field_0x6ab = field_0x6a8; - uVar2 = field_0x690[field_0x6ab]; + mYButtonSlot = mCurrentSlot; + uVar2 = mItemSlots[mYButtonSlot]; mixItemIndex1 = NO_ITEM; } } @@ -964,21 +983,21 @@ void dMenu_Ring_c::setJumpItem(bool i_useVibrationM) { setSelectItem(i, getItem(field_0x6b4[i], field_0x6b8[i])); } } - if (field_0x6aa != NO_ITEM) { - field_0x518[0] = field_0x38c[field_0x6aa]; - field_0x528[0] = field_0x3ec[field_0x6aa]; + if (mXButtonSlot != NO_ITEM) { + field_0x518[0] = mItemSlotPosX[mXButtonSlot]; + field_0x528[0] = mItemSlotPosY[mXButtonSlot]; } - if (field_0x6ab != NO_ITEM) { - field_0x518[1] = field_0x38c[field_0x6ab]; - field_0x528[1] = field_0x3ec[field_0x6ab]; + if (mYButtonSlot != NO_ITEM) { + field_0x518[1] = mItemSlotPosX[mYButtonSlot]; + field_0x528[1] = mItemSlotPosY[mYButtonSlot]; } if (field_0x6ac != NO_ITEM) { - field_0x518[2] = field_0x38c[field_0x6ac]; - field_0x528[2] = field_0x3ec[field_0x6ac]; + field_0x518[2] = mItemSlotPosX[field_0x6ac]; + field_0x528[2] = mItemSlotPosY[field_0x6ac]; } if (field_0x6ad != NO_ITEM) { - field_0x518[3] = field_0x38c[field_0x6ad]; - field_0x528[3] = field_0x3ec[field_0x6ad]; + field_0x518[3] = mItemSlotPosX[field_0x6ad]; + field_0x528[3] = mItemSlotPosY[field_0x6ad]; } if (field_0x6b3 == 0) { field_0x538[0] = g_ringHIO.mSelectItemScale; @@ -1025,7 +1044,7 @@ void dMenu_Ring_c::setJumpItem(bool i_useVibrationM) { /* 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 < field_0x6ae; i++) { + for (int i = 0; i < mItemsTotal; i++) { if (field_0x6cf != 0xff) { itemId = 0; switch (field_0x6cf) { @@ -1046,10 +1065,10 @@ void dMenu_Ring_c::setScale() { } } } else { - if (i == field_0x6a8 && (mStatus == 0 || mStatus == 2 || mStatus == 3)) { - itemId = dComIfGs_getItem(field_0x690[i], false) + 0x165; + if (i == mCurrentSlot && (mStatus == STATUS_WAIT || mStatus == STATUS_EXPLAIN || mStatus == STATUS_EXPLAIN_FORCE)) { + itemId = dComIfGs_getItem(mItemSlots[i], false) + 0x165; if (dMeter2Info_getRentalBombBag() != 0xff && - field_0x690[i] == dMeter2Info_getRentalBombBag() + 0xf) + mItemSlots[i] == dMeter2Info_getRentalBombBag() + 0xf) { itemId = 0x16D; } @@ -1087,14 +1106,14 @@ void dMenu_Ring_c::setNameString(u32 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(field_0x690[field_0x6a8], false); - if (mStatus == 0 && field_0x6b1 != 3 && field_0x6b1 != 2 && mpItemExplain->getStatus() == 0) { - if (mDoCPd_c::getTrigR(PAD_1) && mPlayerIsWolf == 0 && item != NO_ITEM) { + 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 == 0 && item != NO_ITEM) { + } else if (mDoCPd_c::getTrigX(PAD_1) && !mPlayerIsWolf && item != NO_ITEM) { for (int i = 0; i < MAX_SELECT_ITEM; i++) { setSelectItemForce(i); } @@ -1102,11 +1121,11 @@ void dMenu_Ring_c::setActiveCursor() { if (!checkCombineBomb(field_0x6b3)) { setItem(); if (mpItemExplain->getStatus() == 0) { - setStatus(0); + setStatus(STATUS_WAIT); (this->*stick_init[mStatus])(); } } - } else if (mDoCPd_c::getTrigY(PAD_1) && mPlayerIsWolf == 0 && item != NO_ITEM) { + } else if (mDoCPd_c::getTrigY(PAD_1) && !mPlayerIsWolf && item != NO_ITEM) { for (int i = 0; i < MAX_SELECT_ITEM; i++) { setSelectItemForce(i); } @@ -1114,11 +1133,12 @@ void dMenu_Ring_c::setActiveCursor() { if (!checkCombineBomb(field_0x6b3)) { setItem(); if (mpItemExplain->getStatus() == 0) { - setStatus(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); } } @@ -1126,14 +1146,14 @@ void dMenu_Ring_c::setActiveCursor() { /* 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(field_0x690[field_0x6a8], false); + 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) == 4 && - field_0x690[field_0x6a8] == dComIfGs_getSelectItemIndex(0)) + 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; @@ -1144,7 +1164,7 @@ void dMenu_Ring_c::setMixItem() { field_0x6cd = 0; bVar1 = true; } else if (dComIfGs_getMixItemIndex(1) == 4 && - field_0x690[field_0x6a8] == dComIfGs_getSelectItemIndex(1)) + 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; @@ -1165,15 +1185,15 @@ void dMenu_Ring_c::setMixItem() { { Z2GetAudioMgr()->seStart(Z2SE_SY_ITEM_COMBINE_ON, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); - selectItemIndex0 = field_0x690[field_0x6a8]; + selectItemIndex0 = mItemSlots[mCurrentSlot]; field_0x6b8[0] = 4; field_0x6b3 = 0; - field_0x6aa = field_0x6a8; + mXButtonSlot = mCurrentSlot; field_0x6cd = 0xff; bVar1 = true; - if (selectItemIndex1 == field_0x690[field_0x6a8]) { + if (selectItemIndex1 == mItemSlots[mCurrentSlot]) { selectItemIndex1 = 0xff; - field_0x6ab = 0xff; + mYButtonSlot = 0xff; } } else if ((dComIfGs_getSelectItemIndex(1) == 4 && dComIfGs_getMixItemIndex(1) == NO_ITEM) || @@ -1181,15 +1201,15 @@ void dMenu_Ring_c::setMixItem() { { Z2GetAudioMgr()->seStart(Z2SE_SY_ITEM_COMBINE_ON, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); - selectItemIndex1 = field_0x690[field_0x6a8]; + selectItemIndex1 = mItemSlots[mCurrentSlot]; field_0x6b8[1] = 4; field_0x6b3 = 1; - field_0x6ab = field_0x6a8; + mYButtonSlot = mCurrentSlot; field_0x6cd = 0xff; bVar1 = true; - if (selectItemIndex0 == field_0x690[field_0x6a8]) { + if (selectItemIndex0 == mItemSlots[mCurrentSlot]) { selectItemIndex0 = 0xff; - field_0x6aa = 0xff; + mXButtonSlot = 0xff; } } break; @@ -1200,10 +1220,10 @@ void dMenu_Ring_c::setMixItem() { field_0x6b4[1] = selectItemIndex1; setJumpItem(false); if (local_28[0] != NO_ITEM) { - field_0x6aa = local_28[0]; + mXButtonSlot = local_28[0]; } if (local_28[1] != NO_ITEM) { - field_0x6ab = local_28[1]; + mYButtonSlot = local_28[1]; } } } @@ -1223,35 +1243,36 @@ void dMenu_Ring_c::drawItem() { } f32 ringAlpha = (g_ringHIO.mItemAlphaMin + fVar16 * (g_ringHIO.mItemAlphaMax - g_ringHIO.mItemAlphaMin)); - for (int i = 0; i < field_0x6ae; i++) { - if (i != field_0x6a8 || (mStatus != 0 && mStatus != 2 && mStatus != 3)) { - J2DDrawFrame(field_0x38c[i] - 24.0f + field_0x568, field_0x3ec[i] - 24.0f + field_0x56c, + 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 != field_0x6a8) { + 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 * field_0x514); + mpItemTex[i][j]->setAlpha(g_ringHIO.mItemIconAlpha_Wolf * mAlphaRate); } else { - mpItemTex[i][j]->setAlpha(g_ringHIO.mItemIconAlpha * field_0x514 * fVar17); + mpItemTex[i][j]->setAlpha(g_ringHIO.mItemIconAlpha * mAlphaRate * fVar17); } - f32 f0 = field_0x44c[i] * 48.0f; - f32 f1 = field_0x4ac[i] * 48.0f; - f32 x = (48.0f - f0) * 0.5f + (field_0x38c[i] - 24.0f + field_0x568); - f32 y = (48.0f - f1) * 0.5f + (field_0x3ec[i] - 24.0f + field_0x56c); + 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(field_0x690[i], false); + u8 item = dComIfGs_getItem(mItemSlots[i], false); if ((j == 0 && item != BEE_CHILD) || (j == 2 && item == BEE_CHILD)) { - u8 itemNum = getItemNum(field_0x690[i]); - u8 itemMaxNum = getItemMaxNum(field_0x690[i]); + 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) { + 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()); @@ -1267,29 +1288,30 @@ void dMenu_Ring_c::drawItem() { /* 801ECF9C-801ED2BC 1E78DC 0320+00 1/1 0/0 0/0 .text drawItem2__12dMenu_Ring_cFv */ void dMenu_Ring_c::drawItem2() { - s32 idx = field_0x6a8; - if (mStatus == 0 || mStatus == 2 || mStatus == 3) { - J2DDrawFrame(field_0x38c[idx] - 24.0f + field_0x568, field_0x3ec[idx] - 24.0f + field_0x56c, + 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 * field_0x514); + mpItemTex[idx][i]->setAlpha(g_ringHIO.mItemIconAlpha_Wolf * mAlphaRate); } else { - mpItemTex[idx][i]->setAlpha(field_0x514 * 255.0f); + mpItemTex[idx][i]->setAlpha(mAlphaRate * 255.0f); } - f32 f0 = field_0x44c[idx] * 48.0f; - f32 f1 = field_0x4ac[idx] * 48.0f; - f32 x = (48.0f - f0) * 0.5f + (field_0x38c[idx] - 24.0f + field_0x568); - f32 y = (48.0f - f1) * 0.5f + (field_0x3ec[idx] - 24.0f + field_0x56c); + 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(field_0x690[idx], false); + u8 item = dComIfGs_getItem(mItemSlots[idx], false); if ((i == 0 && item != BEE_CHILD) || (i == 2 && item == BEE_CHILD)) { - u8 itemNum = getItemNum(field_0x690[idx]); - u8 itemMaxNum = getItemMaxNum(field_0x690[idx]); + 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); } } @@ -1310,22 +1332,22 @@ void dMenu_Ring_c::drawItem2() { */ void dMenu_Ring_c::stick_wait_init() { if (mDoCPd_c::getHoldL(PAD_1) != 0) { - if (field_0x6ce != 0) { - field_0x672 = g_ringHIO.mDirectSelectWaitFrames; + if (mDirectSelectActive) { + mWaitFrames = g_ringHIO.mDirectSelectWaitFrames; } else { - field_0x672 = 0; + mWaitFrames = 0; } } else { - field_0x672 = g_ringHIO.mCursorChangeWaitFrames; + mWaitFrames = g_ringHIO.mCursorChangeWaitFrames; } field_0x63a = 0; - field_0x6ce = 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(field_0x690[field_0x6a8], false); + u8 item = dComIfGs_getItem(mItemSlots[mCurrentSlot], false); if (item != NO_ITEM) { setDoStatus(0x24); @@ -1334,8 +1356,8 @@ void dMenu_Ring_c::stick_wait_proc() { } if (dMw_A_TRIGGER() && !dMeter2Info_isTouchKeyCheck(0x4000) && openExplain(item)) { dMeter2Info_setItemExplainWindowStatus(1); - field_0x6c4 = field_0x6a8; - setStatus(2); + field_0x6c4 = mCurrentSlot; + setStatus(STATUS_EXPLAIN); dMeter2Info_set2DVibration(); setDoStatus(0); return; @@ -1343,10 +1365,10 @@ void dMenu_Ring_c::stick_wait_proc() { if (dMw_A_TRIGGER() && !dMeter2Info_isTouchKeyCheck(0x4000)) { Z2GetAudioMgr()->seStart(Z2SE_SYS_ERROR, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); } - if (field_0x672 > 0) { - field_0x672--; + if (mWaitFrames > 0) { + mWaitFrames--; } else if (getStickInfo(mpStick) != 0) { - setStatus(1); + setStatus(STATUS_MOVE); field_0x6b2 = 0; } } @@ -1354,12 +1376,12 @@ void dMenu_Ring_c::stick_wait_proc() { /* 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 (field_0x680 == 0) { - field_0x680 = g_ringHIO.mCursorInitSpeed; - } else if (field_0x680 < g_ringHIO.mCursorMax) { - field_0x680 += g_ringHIO.mCursorAccel; - if (field_0x680 > g_ringHIO.mCursorMax) { - field_0x680 = g_ringHIO.mCursorMax; + 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; @@ -1370,18 +1392,18 @@ void dMenu_Ring_c::stick_move_init() { */ void dMenu_Ring_c::stick_move_proc() { setDoStatus(0x24); - if (field_0x6ce != 0) { + if (mDirectSelectActive) { cXyz target; - target.set(field_0x38c[field_0x6a8], 0.0f, field_0x3ec[field_0x6a8]); - cLib_addCalcPosXZ(&field_0x380, target, 1.0f, 70.0f, 1.0f); - cXyz sub = field_0x380 - 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) { - field_0x380.set(target); + mDirectSelectCursorPos.set(target); field_0x66e = field_0x670; - mpDrawCursor->setPos(field_0x38c[field_0x6a8], field_0x3ec[field_0x6a8]); - u8 item = dComIfGs_getItem(field_0x690[field_0x6a8], false); + mpDrawCursor->setPos(mItemSlotPosX[mCurrentSlot], mItemSlotPosY[mCurrentSlot]); + u8 item = dComIfGs_getItem(mItemSlots[mCurrentSlot], false); if (item != NO_ITEM) { - mpDrawCursor->setParam(field_0x44c[field_0x6a8], field_0x4ac[field_0x6a8], 0.1f, + 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); @@ -1389,11 +1411,11 @@ void dMenu_Ring_c::stick_move_proc() { setStatus(field_0x6b2); } else { mpDrawCursor->setParam(1.0f, 1.0f, 0.1f, 0.6f, 0.5f); - mpDrawCursor->setPos(field_0x380.x, field_0x380.z); + mpDrawCursor->setPos(mDirectSelectCursorPos.x, mDirectSelectCursorPos.z); } } else { if (field_0x6d3 == 0xff) { - cLib_addCalcAngleS(&field_0x66e, field_0x670, 4, 0x7FFF, field_0x680); + cLib_addCalcAngleS(&field_0x66e, field_0x670, 4, 0x7FFF, mCursorSpeed); } else { if (field_0x6d3 == 0) { field_0x66e = -0x2007; @@ -1405,10 +1427,10 @@ void dMenu_Ring_c::stick_move_proc() { s16 subtract = field_0x670 - field_0x66e; if (abs(subtract) < 0x80) { field_0x66e = field_0x670; - mpDrawCursor->setPos(field_0x38c[field_0x6a8], field_0x3ec[field_0x6a8]); - u8 item = dComIfGs_getItem(field_0x690[field_0x6a8], false); + mpDrawCursor->setPos(mItemSlotPosX[mCurrentSlot], mItemSlotPosY[mCurrentSlot]); + u8 item = dComIfGs_getItem(mItemSlots[mCurrentSlot], false); if (item != NO_ITEM) { - mpDrawCursor->setParam(field_0x44c[field_0x6a8], field_0x4ac[field_0x6a8], 0.1f, + 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); @@ -1416,9 +1438,9 @@ void dMenu_Ring_c::stick_move_proc() { setStatus(field_0x6b2); } else { f32 itemRingPosX = - g_ringHIO.mItemRingPosX + 304.0f + field_0x50c * cM_ssin(field_0x66e); + g_ringHIO.mItemRingPosX + 304.0f + mRingRadiusH * cM_ssin(field_0x66e); f32 itemRingPosY = - g_ringHIO.mItemRingPosY + 224.0f + field_0x510 * cM_scos(field_0x66e); + g_ringHIO.mItemRingPosY + 224.0f + mRingRadiusV * cM_scos(field_0x66e); mpDrawCursor->setPos(itemRingPosX, itemRingPosY); } } @@ -1445,7 +1467,7 @@ void dMenu_Ring_c::stick_explain_proc() { dMeter2Info_warpInProc(); } dMeter2Info_setItemExplainWindowStatus(0); - setStatus(0); + setStatus(STATUS_WAIT); } f32 alphaRatio = mpItemExplain->getAlphaRatio(); mpTextParent[1]->setAlphaRate(alphaRatio); @@ -1460,10 +1482,10 @@ void dMenu_Ring_c::stick_explain_force_proc() { if (endButton == 1) { setCombineBomb(field_0x6b3); } else if (endButton == 2) { - u8 itemMaxNum = getItemMaxNum(field_0x690[field_0x6a8]); - u8 itemNum = getItemNum(field_0x690[field_0x6a8]); - mpItemExplain->openExplain(field_0x690[field_0x6a8], itemNum, itemMaxNum, true); - setStatus(0); + 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); @@ -1518,7 +1540,7 @@ void dMenu_Ring_c::drawSelectItem() { for (int j = 0; j < field_0x686[i]; j++) { if (mpSelectItemTex[i][j] != NULL) { - mpSelectItemTex[i][j]->setAlpha(field_0x514 * 255.0f); + 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, @@ -1551,16 +1573,24 @@ void dMenu_Ring_c::setSelectItemForce(int i_idx) { } /* 801EDFDC-801EE058 1E891C 007C+00 1/1 0/0 0/0 .text getCursorPos__12dMenu_Ring_cFUc */ -s32 dMenu_Ring_c::getCursorPos(u8 param_0) { - for (s32 i = 0; i < field_0x6ae; i++) { - if (param_0 == dComIfGs_getLineUpItem(i)) { - return i & 0xff; +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; @@ -1593,6 +1623,14 @@ u8 dMenu_Ring_c::getItemNum(u8 i_slotNo) { } /* 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; @@ -1633,7 +1671,7 @@ bool dMenu_Ring_c::checkExplainForce() { 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(field_0x690[field_0x6a8], true); + u8 item = dComIfGs_getItem(mItemSlots[mCurrentSlot], true); for (int i = 0; i < 4; i++) { local_18[i] = NO_ITEM; @@ -1751,52 +1789,66 @@ void dMenu_Ring_c::setCombineBomb(int param_0) { } /* 801EE648-801EEA84 1E8F88 043C+00 2/2 0/0 0/0 .text drawNumber__12dMenu_Ring_cFiiff */ -void dMenu_Ring_c::drawNumber(int param_0, int param_1, f32 param_2, f32 param_3) { - if (param_0 > 100) { - param_0 = 100; +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 (param_0 == param_1) { + + if (i_itemNum == i_itemMaxNum) { + // Full ammo: Golden digits colorBlack.set(30, 30, 30, 0); - colorWhite.set(0xff, 200, 50, 0xff); - } else if (param_0 == 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, 0xff); + colorWhite.set(180, 180, 180, 255); } else { + // White digits colorBlack.set(0, 0, 0, 0); - colorWhite.set(0xff, 0xff, 0xff, 0xff); + colorWhite.set(255, 255, 255, 255); } for (int i = 0; i < 3; i++) { mpItemNumTex[i]->setBlackWhite(colorBlack, colorWhite); } - if (param_0 < 100) { + 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(param_0 / 10)); + 'TIMG', dMeter2Info_getNumberTextureName(i_itemNum / 10)); mpItemNumTex[0]->changeTexture(texture, 0); texture = (ResTIMG*)dComIfGp_getMain2DArchive()->getResource( - 'TIMG', dMeter2Info_getNumberTextureName(param_0 % 10)); + 'TIMG', dMeter2Info_getNumberTextureName(i_itemNum % 10)); mpItemNumTex[1]->changeTexture(texture, 0); - mpItemNumTex[2]->hide(); + 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(param_0 / 100)); + 'TIMG', dMeter2Info_getNumberTextureName(i_itemNum / 100)); mpItemNumTex[0]->changeTexture(texture, 0); - param_0 = (u8)(param_0 % 100); + i_itemNum = (u8)(i_itemNum % 100); texture = (ResTIMG*)dComIfGp_getMain2DArchive()->getResource( - 'TIMG', dMeter2Info_getNumberTextureName(param_0 / 10)); + 'TIMG', dMeter2Info_getNumberTextureName(i_itemNum / 10)); mpItemNumTex[1]->changeTexture(texture, 0); texture = (ResTIMG*)dComIfGp_getMain2DArchive()->getResource( - 'TIMG', dMeter2Info_getNumberTextureName(param_0 % 10)); + 'TIMG', dMeter2Info_getNumberTextureName(i_itemNum % 10)); mpItemNumTex[2]->changeTexture(texture, 0); - mpItemNumTex[2]->show(); + 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 * field_0x514); - mpItemNumTex[i]->draw(param_2 + i * 16.0f, param_3 - 16.0f, 16.0f, 16.0f, 0, 0, 0); + 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); } } @@ -1808,58 +1860,58 @@ u8 dMenu_Ring_c::getItem(int i_slot_no, u8 i_slot_no2) { } /* 801EEAE4-801EEB58 1E9424 0074+00 2/2 0/0 0/0 .text setDoStatus__12dMenu_Ring_cFUc */ -void dMenu_Ring_c::setDoStatus(u8 param_0) { - if (param_0 == 0 && field_0x6cc == 0x24) { +void dMenu_Ring_c::setDoStatus(u8 i_doStatus) { + if (i_doStatus == 0 && mDoStatus == 0x24) { if (field_0x68e > 0) { field_0x68e--; if (field_0x68e == 0) { - field_0x6cc = 0; + mDoStatus = 0; } } else { field_0x68e = 10; } } else { - field_0x6cc = param_0; + mDoStatus = i_doStatus; field_0x68e = 0; } - dComIfGp_setDoStatusForce(field_0x6cc, 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 == 0 && dComIfGs_getItem(field_0x690[field_0x6a8], 0) != NO_ITEM) { - u8 item = dComIfGs_getItem(field_0x690[field_0x6a8], 0); + 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) == 4) && (dComIfGs_getMixItemIndex(0) == NO_ITEM) || - (dComIfGs_getMixItemIndex(0) == 4)) + if ((dComIfGs_getSelectItemIndex(0) == SLOT_4) && (dComIfGs_getMixItemIndex(0) == NO_ITEM) || + (dComIfGs_getMixItemIndex(0) == SLOT_4)) { - return 1; + return true; } - if ((dComIfGs_getSelectItemIndex(1) == 4) && (dComIfGs_getMixItemIndex(1) == NO_ITEM) || - (dComIfGs_getMixItemIndex(1) == 4)) + if ((dComIfGs_getSelectItemIndex(1) == SLOT_4) && (dComIfGs_getMixItemIndex(1) == NO_ITEM) || + (dComIfGs_getMixItemIndex(1) == SLOT_4)) { - return 1; + return true; } break; } } - return 0; + 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(field_0x690[field_0x6a8], 0) != NO_ITEM)) { - if ((dComIfGs_getMixItemIndex(0) == 4) && - (field_0x690[field_0x6a8] == dComIfGs_getSelectItemIndex(0))) + 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) == 4) && - (field_0x690[field_0x6a8] == dComIfGs_getSelectItemIndex(1))) + if ((dComIfGs_getMixItemIndex(1) == SLOT_4) && + (mItemSlots[mCurrentSlot] == dComIfGs_getSelectItemIndex(1))) { return 1; } @@ -1872,29 +1924,29 @@ void dMenu_Ring_c::setMixMessage() { if (mpTextParent[4] != NULL) { if (isMixItemOff()) { for (int i = 0; i < 5; i++) { - field_0x1c8[i]->hide(); - field_0x1dc[i]->show(); + mpComboOffString[i]->hide(); + mpBowArrowComboString[i]->show(); } if (!mpTextParent[4]->isVisible()) { - field_0x570 = 18.0f - g_ringHIO.mPikariAnimSpeed; + 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++) { - field_0x1c8[i]->show(); - field_0x1dc[i]->hide(); + mpComboOffString[i]->show(); + mpBowArrowComboString[i]->hide(); } if (!mpTextParent[4]->isVisible()) { - field_0x570 = 18.0f - g_ringHIO.mPikariAnimSpeed; + 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(); - field_0x570 = 0.0f; + mPikariFlashingSpeed = 0.0f; } } } @@ -1903,24 +1955,24 @@ void dMenu_Ring_c::setMixMessage() { void dMenu_Ring_c::textScaleHIO() { for (int i = 0; i < 10; i++) { if (mpTextParent[i] != NULL && i != 2) { - if (field_0x598[i] != g_ringHIO.mGuidePosX[i] || - field_0x5c0[i] != g_ringHIO.mGuidePosY[i]) + if (mRingGuidePosX[i] != g_ringHIO.mGuidePosX[i] || + mRingGuidePosY[i] != g_ringHIO.mGuidePosY[i]) { - field_0x598[i] = g_ringHIO.mGuidePosX[i]; - field_0x5c0[i] = g_ringHIO.mGuidePosY[i]; + mRingGuidePosX[i] = g_ringHIO.mGuidePosX[i]; + mRingGuidePosY[i] = g_ringHIO.mGuidePosY[i]; if (i == 8) { - mpTextParent[i]->paneTrans(field_0x598[i] + field_0x574[0], field_0x5c0[i]); + mpTextParent[i]->paneTrans(mRingGuidePosX[i] + field_0x574[0], mRingGuidePosY[i]); } else if (i == 9) { - mpTextParent[i]->paneTrans(field_0x598[i] + field_0x574[1], field_0x5c0[i]); + mpTextParent[i]->paneTrans(mRingGuidePosX[i] + field_0x574[1], mRingGuidePosY[i]); } else { - mpTextParent[i]->paneTrans(field_0x598[i], field_0x5c0[i]); + mpTextParent[i]->paneTrans(mRingGuidePosX[i], mRingGuidePosY[i]); } if (mpTextParent[2] != NULL && i == 1) { - mpTextParent[2]->paneTrans(field_0x598[i], field_0x5c0[i]); + mpTextParent[2]->paneTrans(mRingGuidePosX[i], mRingGuidePosY[i]); } } - if (field_0x5e8[i] != g_ringHIO.mGuideScale[i]) { - field_0x5e8[i] = g_ringHIO.mGuideScale[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); @@ -1928,13 +1980,13 @@ void dMenu_Ring_c::textScaleHIO() { setButtonScale(i - 8, g_ringHIO.mUnselectButtonScale); } } else if (i == 5 || i == 7) { - mpTextParent[i]->scale(field_0x5e8[i], field_0x5e8[i]); + mpTextParent[i]->scale(mRingGuideScale[i], mRingGuideScale[i]); } if (mpTextParent[2] != NULL && i == 1) { - mpTextParent[2]->scale(field_0x5e8[i], field_0x5e8[i]); + mpTextParent[2]->scale(mRingGuideScale[i], mRingGuideScale[i]); } if (i < 5 && mpTextParent[i] != NULL) { - mpTextParent[i]->scale(field_0x5e8[i], field_0x5e8[i]); + mpTextParent[i]->scale(mRingGuideScale[i], mRingGuideScale[i]); } } } @@ -1961,8 +2013,8 @@ f32 dMenu_Ring_c::calcDistance(f32 param_0, f32 param_1, f32 param_2, f32 param_ /* 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 f50c = field_0x50c; - f32 f510 = field_0x510; + f32 ring_radius_h = mRingRadiusH; + f32 ring_radius_v = mRingRadiusV; f32 fVar8 = 0.0f; f32 temp2; f32 fVar3; @@ -1972,10 +2024,10 @@ void dMenu_Ring_c::clacEllipsePlotAverage(int param_0, f32 param_1, f32 param_2) f32* ptr_01 = (f32*)operator new[](16000); f32 fVar9 = 0.0f; - for (int i = 0; i <= 0x3E8; i++) { + for (int i = 0; i <= 1000; i++) { ptr[i] = fVar8; - ptr_00[i] = clacEllipseFunction(fVar8, f50c, f510); - fVar8 += f50c / 1000.0f; + 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) { @@ -1998,25 +2050,25 @@ void dMenu_Ring_c::clacEllipsePlotAverage(int param_0, f32 param_1, f32 param_2) fVar3 = 0.0f; temp2 = 0.0f; s32 j = 0; - field_0x38c[0] = ptr[0] + param_1; - field_0x3ec[0] = ptr_00[0] + param_2; + mItemSlotPosX[0] = ptr[0] + param_1; + mItemSlotPosY[0] = ptr_00[0] + param_2; for (int i = 0; i < 4000; i++) { - f510 = ptr_01[i]; - fVar3 += f510; + 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]; - field_0x38c[j] = param_1 + ptr[i - 1]; - field_0x3ec[j] = param_2 + ptr_00[i - 1]; + mItemSlotPosX[j] = param_1 + ptr[i - 1]; + mItemSlotPosY[j] = param_2 + ptr_00[i - 1]; } else { fVar3 = 0.0f; - field_0x38c[j] = param_1 + ptr[i]; - field_0x3ec[j] = param_2 + ptr_00[i]; + mItemSlotPosX[j] = param_1 + ptr[i]; + mItemSlotPosY[j] = param_2 + ptr_00[i]; } } - f50c = fVar8; + ring_radius_h = fVar8; temp2 = fVar3; if (j >= param_0 - 1) break; @@ -2035,9 +2087,9 @@ bool dMenu_Ring_c::dpdMove() { u8 dMenu_Ring_c::openExplain(u8 param_0) { if (field_0x6cf == 0xff && field_0x6d0 == 0xff) { if (param_0 != 0xff) { - return mpItemExplain->openExplain(field_0x690[field_0x6a8], - getItemNum(field_0x690[field_0x6a8]), - getItemMaxNum(field_0x690[field_0x6a8]), false); + return mpItemExplain->openExplain(mItemSlots[mCurrentSlot], + getItemNum(mItemSlots[mCurrentSlot]), + getItemMaxNum(mItemSlots[mCurrentSlot]), false); } return 0; }