This commit is contained in:
robojumper
2025-08-09 12:10:31 +02:00
parent e7495a950e
commit dda24ef01a
4 changed files with 360 additions and 33 deletions
+1 -1
View File
@@ -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
+17 -4
View File
@@ -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;
+10
View File
@@ -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,
+332 -28
View File
@@ -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 {