diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 0d7c709b..bacc82ba 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -14891,7 +14891,7 @@ fn_80280E80 = .text:0x80280E80; // type:function size:0xB0 fn_80280F30 = .text:0x80280F30; // type:function size:0x9C getArrowBounding__14dLytPauseMgr_cCFi = .text:0x80280FD0; // type:function size:0x14 setSelectedArrowBounding__14dLytPauseMgr_cCFi = .text:0x80280FF0; // type:function size:0xC -setSelection__14dLytPauseMgr_cFQ214dLytPauseMgr_c15SelectionType_elb = .text:0x80281000; // type:function size:0x3C +setSelection__14dLytPauseMgr_cFQ214dLytPauseMgr_c15SelectionType_eUsb = .text:0x80281000; // type:function size:0x3C shouldShowGearWheel = .text:0x80281040; // type:function size:0x15C fn_802811A0 = .text:0x802811A0; // type:function size:0x74 fn_80281220 = .text:0x80281220; // type:function size:0x134 diff --git a/include/d/lyt/d_lyt_pause.h b/include/d/lyt/d_lyt_pause.h index 90094664..88978cd7 100644 --- a/include/d/lyt/d_lyt_pause.h +++ b/include/d/lyt/d_lyt_pause.h @@ -31,6 +31,10 @@ public: return field_0x0832; } + void setField_0x0837(bool b) { + field_0x0837 = b; + } + bool getField_0x0838() const { return field_0x0838; } @@ -39,6 +43,14 @@ public: return field_0x083B; } + void setField_0x083C(bool b) { + field_0x083C = b; + } + + void setField_0x083D(bool b) { + field_0x083D = b; + } + bool getField_0x083E() const { return field_0x083E; } @@ -66,7 +78,7 @@ public: SELECT_NONE = 10, }; - void setSelection(SelectionType_e type, s32 id, bool restricted); + void setSelection(SelectionType_e type, u16 id, bool restricted); bool isCurrentSelectionRestricted() const { return mCurrentSelectionIsRestricted; @@ -118,16 +130,17 @@ private: /* 0x0832 */ bool field_0x0832; /* 0x0833 */ u8 mCurrentSelectionTab; - /* 0x0834 */ u8 _0x0834[0x0838 - 0x0834]; + /* 0x0834 */ u8 _0x0834[0x0837 - 0x0834]; + /* 0x0837 */ bool field_0x0837; /* 0x0838 */ bool field_0x0838; /* 0x0839 */ u8 _0x0839[0x083B - 0x0839]; /* 0x083B */ bool field_0x083B; - /* 0x083C */ u8 _0x083C[0x083E - 0x083C]; - + /* 0x083C */ bool field_0x083C; + /* 0x083D */ bool field_0x083D; /* 0x083E */ bool field_0x083E; /* 0x083F */ bool field_0x083F; /* 0x0840 */ bool field_0x0840; diff --git a/include/d/lyt/d_lyt_pause_disp_00.h b/include/d/lyt/d_lyt_pause_disp_00.h index 81e20caa..3805c434 100644 --- a/include/d/lyt/d_lyt_pause_disp_00.h +++ b/include/d/lyt/d_lyt_pause_disp_00.h @@ -26,6 +26,14 @@ public: STATE_FUNC_DECLARE(dLytPauseDisp00_c, Out); private: + static s32 navTargetToBounding(s32 target) { + return target - 1; + } + + static s32 boundingToNavTarget(s32 target) { + return target + 1; + } + void setAnm(int idx, f32 value); void stopAnm(int idx); void playBackwards(d2d::AnmGroup_c &anm); @@ -49,8 +57,10 @@ private: s32 updateSelection(); s32 getPointerPane() const; + bool isPointingAtRingIcon(); void hideItemIcons(); + u16 getPointedItemSpecial(s32 paneIdx, bool *pLocked); enum LoadRingTextCmd_e { RING_TEXT_RELEASE_TO_CONFIRM = 0, diff --git a/src/d/lyt/d_lyt_pause_disp_00.cpp b/src/d/lyt/d_lyt_pause_disp_00.cpp index cb0f0e25..6ea81fb1 100644 --- a/src/d/lyt/d_lyt_pause_disp_00.cpp +++ b/src/d/lyt/d_lyt_pause_disp_00.cpp @@ -1,5 +1,6 @@ #include "d/lyt/d_lyt_pause_disp_00.h" +#include "c/c_math.h" #include "d/a/d_a_item.h" #include "d/a/d_a_itembase.h" #include "d/a/d_a_player.h" @@ -1485,24 +1486,26 @@ s32 dLytPauseDisp00_c::updateSelection() { } } else { if (mCurrentNavTarget != 0) { - if (!dPadNav::isPrevPointerVisible() && dPadNav::getFSStickNavDirection() != dPadNav::FS_STICK_NONE) { - const u8 *directions = sNavTable1[mCurrentNavTarget - 1]; + if (!dPadNav::isPrevPointerVisible()) { s32 nav = dPadNav::getFSStickNavDirection(); - s32 newTarget = directions[nav - 1]; - if (getSongLifeTreeStatus() == SONG_LIFETREE_HAS_SOTH_PARTS_OR_SEED) { - const u8 *directions = sNavTable2[mCurrentNavTarget - 1]; - newTarget = directions[nav - 1]; - } - if (newTarget != 0) { - mCurrentNavTarget = newTarget; + if (nav != dPadNav::FS_STICK_NONE) { + const u8 *directions = sNavTable1[navTargetToBounding(mCurrentNavTarget)]; + s32 newTarget = directions[nav - 1]; + if (getSongLifeTreeStatus() == SONG_LIFETREE_HAS_SOTH_PARTS_OR_SEED) { + const u8 *directions = sNavTable2[navTargetToBounding(mCurrentNavTarget)]; + newTarget = directions[nav - 1]; + } + if (newTarget != 0) { + mCurrentNavTarget = newTarget; + } } } } else { - mCurrentNavTarget = PAUSE_DISP_00_BOUNDING_UI_TYPE + 1; + mCurrentNavTarget = boundingToNavTarget(PAUSE_DISP_00_BOUNDING_UI_TYPE); } if (mCurrentNavTarget != 0) { - s32 paneIdx = mCurrentNavTarget - 1; + s32 paneIdx = navTargetToBounding(mCurrentNavTarget); dCsBase_c::GetInstance()->setCursorStickTargetPane(mpBoundings[paneIdx]); } @@ -1514,7 +1517,13 @@ s32 dLytPauseDisp00_c::updateSelection() { } else { u8 tab; // TODO mode IDs - switch (target - 1) { + switch (navTargetToBounding(target)) { + case PAUSE_DISP_00_BOUNDING_CALIB_BTN_3: + pause->setSelection(dLytPauseMgr_c::SELECT_CATEGORY, 5, false); + break; + case PAUSE_DISP_00_BOUNDING_CALIB_BTN_0: + pause->setSelection(dLytPauseMgr_c::SELECT_CATEGORY, 5, false); + break; case PAUSE_DISP_00_BOUNDING_UI_TYPE: if (mpBoundings[PAUSE_DISP_00_BOUNDING_UI_TYPE]->IsVisible()) { pause->setSelection(dLytPauseMgr_c::SELECT_CATEGORY, 4, false); @@ -1522,13 +1531,10 @@ s32 dLytPauseDisp00_c::updateSelection() { pause->setSelection(dLytPauseMgr_c::SELECT_NONE, 0, false); } break; - case PAUSE_DISP_00_BOUNDING_CALIB_BTN_0: - pause->setSelection(dLytPauseMgr_c::SELECT_CATEGORY, 5, false); - break; case PAUSE_DISP_00_BOUNDING_ARROW_LEFT: case PAUSE_DISP_00_BOUNDING_ARROW_RIGHT: pause->setSelection(dLytPauseMgr_c::SELECT_NONE, 0, false); - pause->setSelectedArrowBounding(target - PAUSE_DISP_00_BOUNDING_ARROW_OFFSET - 1); + pause->setSelectedArrowBounding(navTargetToBounding(target - PAUSE_DISP_00_BOUNDING_ARROW_OFFSET)); break; case PAUSE_DISP_00_BOUNDING_LEFT_TAB: { tab = 3; @@ -1542,24 +1548,72 @@ s32 dLytPauseDisp00_c::updateSelection() { tab = 1; goto anyTab; } - anyTab: + anyTab: { pause->setCurrentSelectionTab(tab); - if (mpBoundings[PAUSE_DISP_00_BOUNDING_LEFT_TAB + tab]->IsVisible()) { + s32 bounding = navTargetToBounding(target); + if (mpBoundings[bounding]->IsVisible()) { pause->setSelection(dLytPauseMgr_c::SELECT_CATEGORY, tab, false); } else { pause->setSelection(dLytPauseMgr_c::SELECT_NONE, 0, false); } - // TODO - break; - case PAUSE_DISP_00_BOUNDING_CALIB_BTN_3: - pause->setSelection(dLytPauseMgr_c::SELECT_CATEGORY, 3, false); + static const u8 sTabLookup[] = { + PAUSE_DISP_00_BOUNDING_RIGHT_TAB, + PAUSE_DISP_00_BOUNDING_CENTER_TAB, + PAUSE_DISP_00_BOUNDING_LEFT_TAB, + }; + u8 pauseTab = pause->getCurrentSelectionTab() - 1; + if (pauseTab != lytControl->getPauseDisp00Tab() && mpBoundings[sTabLookup[pauseTab]]->IsVisible()) { + pause->setField_0x0837(true); + field_0xE371 = true; + } break; + } + default: { - s32 id; - switch (target - 1) { - case PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET + 0: id = 2; break; - case PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET + 1: id = 1; break; - case PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET + 2: id = 3; break; + u16 id; + dLytPauseMgr_c::SelectionType_e selectionType; + bool locked = false; + s32 paneIdx = navTargetToBounding(target); + switch (paneIdx) { + default: { + s32 idx = navTargetToBounding(target) - PAUSE_DISP_00_BOUNDING_RING_OFFSET; + if (lytControl->getPauseDisp00Tab() == 1) { + id = getPouchItemForSlot(idx, true); + if (id == ITEM_NONE) { + id = ITEM_POUCH_EXPANSION; + } + selectionType = dLytPauseMgr_c::SELECT_POUCH; + if (isPouchBocoburinLocked()) { + locked = true; + } + } else if (lytControl->getPauseDisp00Tab() == 2) { + id = getDowsingItemIdForIndex(idx); + selectionType = dLytPauseMgr_c::SELECT_DOWSING; + } else { + id = getBWheelItemIdForIndex(idx); + selectionType = dLytPauseMgr_c::SELECT_BWHEEL; + if (isBWheelIndexBocoburinLocked(idx, true)) { + locked = true; + } + } + break; + } + case PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET + 0: { + id = 2; + goto anyFire; + } + case PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET + 1: { + id = 1; + goto anyFire; + } + case PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET + 2: { + id = 3; + goto anyFire; + } + anyFire: { + selectionType = dLytPauseMgr_c::SELECT_FIRE; + break; + } case PAUSE_DISP_00_BOUNDING_TABLETS: case PAUSE_DISP_00_BOUNDING_HEART: case PAUSE_DISP_00_BOUNDING_POUCH: @@ -1577,12 +1631,262 @@ s32 dLytPauseDisp00_c::updateSelection() { case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 7: case PAUSE_DISP_00_BOUNDING_HARP: case PAUSE_DISP_00_BOUNDING_SWORD: - // help + case PAUSE_DISP_00_BOUNDING_SHIREN: { + id = getPointedItemSpecial(paneIdx, &locked); + selectionType = dLytPauseMgr_c::SELECT_ITEM; break; + } } + if (!dPadNav::isPrevPointerVisible()) { + s32 bounding = navTargetToBounding(target); + if (!mpBoundings[bounding]->IsVisible()) { + selectionType = dLytPauseMgr_c::SELECT_NONE; + id = 0; + } + } + pause->setSelection(selectionType, id, locked); } } } + + // TODO derive numbers from defines + { + d2d::AnmGroup_c *pAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_TABLET]; + for (int i = 0; i < 15; i++) { + s32 anim = PAUSE_DISP_00_ANIM_ONOFF_TABLET + i; + if (target != 0 && navTargetToBounding(target) == i && + mpBoundings[navTargetToBounding(target)]->IsVisible()) { + pAnm->play(); + } else { + playBackwards(*pAnm); + } + + if (anim == 62) { + d2d::AnmGroup_c *museAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_MI_TO_TANE]; + if (target != 0 && navTargetToBounding(target) == i) { + museAnm->play(); + } else { + playBackwards(*museAnm); + } + } + pAnm++; + } + } + + { + d2d::AnmGroup_c *pAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_HARP]; + for (int i = 15; i < 21; i++) { + if (target != 0 && navTargetToBounding(target) == i) { + pAnm->play(); + } else { + playBackwards(*pAnm); + } + pAnm++; + } + } + + { + d2d::AnmGroup_c *pAnm; + + pAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_SWORD]; + if (target != 0 && navTargetToBounding(target) == PAUSE_DISP_00_BOUNDING_SWORD) { + pAnm->play(); + } else { + playBackwards(*pAnm); + } + + pAnm = &mAnm[PAUSE_DISP_00_ANIM_UI_TYPE_BTN]; + if (target != 0 && navTargetToBounding(target) == PAUSE_DISP_00_BOUNDING_UI_TYPE) { + pause->setField_0x083C(true); + pAnm->play(); + } else { + playBackwards(*pAnm); + } + + pAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_CALIB_BTN]; + if (target != 0 && navTargetToBounding(target) == PAUSE_DISP_00_BOUNDING_CALIB_BTN_0) { + pause->setField_0x083D(true); + pAnm->play(); + } else { + playBackwards(*pAnm); + } + + pAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_TRIFORCE]; + if (target != 0 && navTargetToBounding(target) == PAUSE_DISP_00_BOUNDING_TABLETS && + mpBoundings[PAUSE_DISP_00_BOUNDING_TABLETS]->IsVisible()) { + pAnm->play(); + } else { + playBackwards(*pAnm); + } + + pAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_SHIREN]; + if (target != 0 && navTargetToBounding(target) == PAUSE_DISP_00_BOUNDING_SHIREN) { + pAnm->play(); + } else { + playBackwards(*pAnm); + } + } + + s32 tab = lytControl->getPauseDisp00Tab(); + s32 anmIdx = tab == 1 ? PAUSE_DISP_00_ANIM_ONOFF_POUCH_OFFSET : + tab == 2 ? PAUSE_DISP_00_ANIM_ONOFF_DOWSING_OFFSET : + PAUSE_DISP_00_ANIM_ONOFF_ITEM_OFFSET; + + d2d::AnmGroup_c *anm = &mAnm[anmIdx]; + for (int i = PAUSE_DISP_00_BOUNDING_RING_OFFSET; + i < PAUSE_DISP_00_BOUNDING_RING_OFFSET + PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL; i++) { + if (target != 0 && navTargetToBounding(target) == i) { + f32 frame = anm->getFrame(); + if (anm->getAnimDuration() - 1.0f > frame) { + anm->setFrame(frame + 1.0f); + } + } else { + f32 frame = anm->getFrame(); + if (frame) { + frame -= 1.0f; + if (frame <= 0.0f) { + frame = 0.0f; + } + anm->setFrame(frame); + } + } + anm++; + } + + s32 tab1 = lytControl->getPauseDisp00Tab(); + playOnOffTabAnim(); + switch (navTargetToBounding(target)) { + case PAUSE_DISP_00_BOUNDING_LEFT_TAB: { + if (tab1 != 2) { + mAnm[PAUSE_DISP_00_ANIM_OFF_LEFT_TAB].setFrame(0.0f); + } + break; + } + case PAUSE_DISP_00_BOUNDING_CENTER_TAB: { + if (tab1 != 1) { + mAnm[PAUSE_DISP_00_ANIM_OFF_CENTER_TAB].setFrame(0.0f); + } + break; + } + case PAUSE_DISP_00_BOUNDING_RIGHT_TAB: { + if (tab1 != 0) { + mAnm[PAUSE_DISP_00_ANIM_OFF_RIGHT_TAB].setFrame(0.0f); + } + break; + } + } + + if (target == 0 && isPointingAtRingIcon() == true) { + u16 tab = 1; + if (lytControl->getPauseDisp00Tab() == 1) { + tab = 2; + } else if (lytControl->getPauseDisp00Tab() == 2) { + tab = 3; + } + pause->setSelection(dLytPauseMgr_c::SELECT_RING, tab, false); + } + + dSndSmallEffectMgr_c *soundMgr = dSndSmallEffectMgr_c::GetInstance(); + if (target != 0 && mPrevNavTarget != target) { + s32 tab2 = lytControl->getPauseDisp00Tab(); + bool rumble = true; + switch (navTargetToBounding(target)) { + case PAUSE_DISP_00_BOUNDING_UI_TYPE: { + soundMgr->playSound(SE_S_MENU_P1_POINT_GUIDE); + break; + } + case PAUSE_DISP_00_BOUNDING_CALIB_BTN_0: { + soundMgr->playSound(SE_S_MENU_P1_POINT_MPLUS); + break; + } + case PAUSE_DISP_00_BOUNDING_LEFT_TAB: { + if (mpBoundings[PAUSE_DISP_00_BOUNDING_LEFT_TAB]->IsVisible()) { + if (cM::isZero(mAnm[PAUSE_DISP_00_ANIM_OFF_LEFT_TAB].getFrame())) { + soundMgr->playSound(SE_S_MENU_P1_POINT_C); + } + if (tab2 == 2) { + rumble = false; + } + } + break; + } + case PAUSE_DISP_00_BOUNDING_CENTER_TAB: { + if (mpBoundings[PAUSE_DISP_00_BOUNDING_CENTER_TAB]->IsVisible()) { + if (cM::isZero(mAnm[PAUSE_DISP_00_ANIM_OFF_CENTER_TAB].getFrame())) { + soundMgr->playSound(SE_S_MENU_P1_POINT_MINUS); + } + if (tab2 == 1) { + rumble = false; + } + } + break; + } + case PAUSE_DISP_00_BOUNDING_RIGHT_TAB: { + if (mpBoundings[PAUSE_DISP_00_BOUNDING_RIGHT_TAB]->IsVisible()) { + if (cM::isZero(mAnm[PAUSE_DISP_00_ANIM_OFF_RIGHT_TAB].getFrame())) { + soundMgr->playSound(SE_S_MENU_P1_POINT_B); + } + if (tab2 == 0) { + rumble = false; + } + } + break; + } + case PAUSE_DISP_00_BOUNDING_CALIB_BTN_3: { + soundMgr->playSound(SE_S_MENU_P1_POINT_TOGGLE); + break; + } + case PAUSE_DISP_00_BOUNDING_TABLETS: + case PAUSE_DISP_00_BOUNDING_HEART: + case PAUSE_DISP_00_BOUNDING_POUCH: + case PAUSE_DISP_00_BOUNDING_PARACHUTE: + case PAUSE_DISP_00_BOUNDING_MITTS: + case PAUSE_DISP_00_BOUNDING_SCALE: + case PAUSE_DISP_00_BOUNDING_RING: + case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 0: + case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 1: + case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 2: + case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 3: + case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 4: + case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 5: + case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 6: + case PAUSE_DISP_00_BOUNDING_MUSE_07: + case PAUSE_DISP_00_BOUNDING_HARP: + case PAUSE_DISP_00_BOUNDING_SWORD: + case PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET + 0: + case PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET + 1: + case PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET + 2: + case PAUSE_DISP_00_BOUNDING_SHIREN: + case PAUSE_DISP_00_BOUNDING_RING_OFFSET + 0: + case PAUSE_DISP_00_BOUNDING_RING_OFFSET + 1: + case PAUSE_DISP_00_BOUNDING_RING_OFFSET + 2: + case PAUSE_DISP_00_BOUNDING_RING_OFFSET + 3: + case PAUSE_DISP_00_BOUNDING_RING_OFFSET + 4: + case PAUSE_DISP_00_BOUNDING_RING_OFFSET + 5: + case PAUSE_DISP_00_BOUNDING_RING_OFFSET + 6: + case PAUSE_DISP_00_BOUNDING_RING_OFFSET + 7: { + soundMgr->playSound(SE_S_MENU_P1_POINT_ITEM); + break; + } + } + + if (rumble == true) { + dRumble_c::start(dRumble_c::sRumblePreset0, 1); + } + } + + mPrevNavTarget = target; + if (target != 0 && navTargetToBounding(target) != PAUSE_DISP_00_BOUNDING_CALIB_BTN_3 && + !dPadNav::isPrevPointerVisible() && !mpBoundings[navTargetToBounding(target)]->IsVisible()) { + target = 0; + } + + if (navTargetToBounding(target) >= PAUSE_DISP_00_BOUNDING_ARROW_LEFT && + navTargetToBounding(target) <= PAUSE_DISP_00_BOUNDING_RIGHT_TAB) { + target = 0; + } + + return target; } s32 dLytPauseDisp00_c::getPointerPane() const {