From 0847c40aa0ba0482e25e1e10a4718cf062432e63 Mon Sep 17 00:00:00 2001 From: robojumper Date: Sat, 9 Aug 2025 15:48:22 +0200 Subject: [PATCH] d_lyt_pause_disp_00 with a few nonmatching functions --- config/SOUE01/symbols.txt | 76 ++-- include/d/d_cs_base.h | 4 + include/d/lyt/d_lyt_pause_disp_00.h | 10 + include/d/lyt/d_lyt_util_items.h | 16 + include/m/m_vec.h | 4 + src/d/lyt/d_lyt_pause_disp_00.cpp | 590 ++++++++++++++++++---------- 6 files changed, 459 insertions(+), 241 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index bacc82ba..3dd520da 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -8792,14 +8792,14 @@ execute__17dLytPauseDisp00_cFv = .text:0x8015A640; // type:function size:0x10C executeState__86sStateMgr_c<17dLytPauseDisp00_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8015A750; // type:function size:0x10 getStateID__86sStateMgr_c<17dLytPauseDisp00_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x8015A760; // type:function size:0x10 draw__17dLytPauseDisp00_cFv = .text:0x8015A770; // type:function size:0x38 -fn_8015A7B0 = .text:0x8015A7B0; // type:function size:0x14 -fn_8015A7D0 = .text:0x8015A7D0; // type:function size:0x14 -fn_8015A7F0 = .text:0x8015A7F0; // type:function size:0x14 -fn_8015A810 = .text:0x8015A810; // type:function size:0x10 -fn_8015A820 = .text:0x8015A820; // type:function size:0x10 -fn_8015A830 = .text:0x8015A830; // type:function size:0x10 -fn_8015A840 = .text:0x8015A840; // type:function size:0x68 -fn_8015A8B0 = .text:0x8015A8B0; // type:function size:0x28 +drawDirectly__17dLytPauseDisp00_cFv = .text:0x8015A7B0; // type:function size:0x14 +requestIn__17dLytPauseDisp00_cFb = .text:0x8015A7D0; // type:function size:0x14 +requestOut__17dLytPauseDisp00_cFb = .text:0x8015A7F0; // type:function size:0x14 +requestSelect__17dLytPauseDisp00_cFv = .text:0x8015A810; // type:function size:0x10 +requestRing__17dLytPauseDisp00_cFv = .text:0x8015A820; // type:function size:0x10 +requestUnselect__17dLytPauseDisp00_cFv = .text:0x8015A830; // type:function size:0x10 +requestSelectGuide__17dLytPauseDisp00_cFv = .text:0x8015A840; // type:function size:0x68 +requestSelectMpls__17dLytPauseDisp00_cFv = .text:0x8015A8B0; // type:function size:0x28 initializeState_None__17dLytPauseDisp00_cFv = .text:0x8015A8E0; // type:function size:0x2B8 executeState_None__17dLytPauseDisp00_cFv = .text:0x8015ABA0; // type:function size:0x34 finalizeState_None__17dLytPauseDisp00_cFv = .text:0x8015ABE0; // type:function size:0x8 @@ -8839,9 +8839,9 @@ setupStoneOfTrials__17dLytPauseDisp00_cFv = .text:0x8015D110; // type:function s setupRingIcons__17dLytPauseDisp00_cFl = .text:0x8015D1D0; // type:function size:0x130 updateSelection__17dLytPauseDisp00_cFv = .text:0x8015D300; // type:function size:0xA04 getPointerPane__17dLytPauseDisp00_cCFv = .text:0x8015DD10; // type:function size:0x160 -fn_8015DE70 = .text:0x8015DE70; // type:function size:0x194 +isPointingAtRingIcon__17dLytPauseDisp00_cFv = .text:0x8015DE70; // type:function size:0x194 hideItemIcons__17dLytPauseDisp00_cFv = .text:0x8015E010; // type:function size:0x58 -fn_8015E070 = .text:0x8015E070; // type:function size:0x220 +getPointedItemSpecial__17dLytPauseDisp00_cFlPb = .text:0x8015E070; // type:function size:0x220 executeCall__17dLytPauseDisp00_cFv = .text:0x8015E290; // type:function size:0xA4 playOnOffTabAnim__17dLytPauseDisp00_cFv = .text:0x8015E340; // type:function size:0x54 loadRingText__17dLytPauseDisp00_cFUl = .text:0x8015E3A0; // type:function size:0xF4 @@ -9174,28 +9174,28 @@ getCaptionItemText__Fl = .text:0x801679E0; // type:function size:0x54 getDowsingText__Fl = .text:0x80167A40; // type:function size:0x40 getPauseCategoryText__Fl = .text:0x80167A80; // type:function size:0x5C getCurrentWalletType = .text:0x80167AE0; // type:function size:0x88 -getCurrentWalletItemId = .text:0x80167B70; // type:function size:0x30 -fn_80167BA0 = .text:0x80167BA0; // type:function size:0x8 -hasSailcloth = .text:0x80167BB0; // type:function size:0x34 -getSailclothItemId = .text:0x80167BF0; // type:function size:0x8 +getCurrentWalletItemId__Fv = .text:0x80167B70; // type:function size:0x30 +getCurrentHeartPieceItemId__Fv = .text:0x80167BA0; // type:function size:0x8 +hasSailcloth__Fv = .text:0x80167BB0; // type:function size:0x34 +getCurrentSailclothItemId__Fv = .text:0x80167BF0; // type:function size:0x8 getCurrentMittsLevel__Fv = .text:0x80167C00; // type:function size:0x4 -fn_80167C10 = .text:0x80167C10; // type:function size:0x44 +getCurrentMittsItemId__Fv = .text:0x80167C10; // type:function size:0x44 isMittsRestricted__Fv = .text:0x80167C60; // type:function size:0x8 -fn_80167C70 = .text:0x80167C70; // type:function size:0x8 +getCurrentEarringsItemId__Fv = .text:0x80167C70; // type:function size:0x8 hasWaterDragonScale__Fv = .text:0x80167C80; // type:function size:0x40 -fn_80167CC0 = .text:0x80167CC0; // type:function size:0x30 +getCurrentWaterDragonScaleItemId__Fv = .text:0x80167CC0; // type:function size:0x30 isWaterDragonScaleRestricted__Fv = .text:0x80167CF0; // type:function size:0x8 hasGoddessHarp__Fv = .text:0x80167D00; // type:function size:0x34 -getGoddessHarpId = .text:0x80167D40; // type:function size:0x8 -harpRestricted = .text:0x80167D50; // type:function size:0x28 +getCurrentGoddessHarpItemId__Fv = .text:0x80167D40; // type:function size:0x8 +isHarpRestrictedBokoBase__Fv = .text:0x80167D50; // type:function size:0x28 hasSong__Fl = .text:0x80167D80; // type:function size:0x34 -fn_80167DC0 = .text:0x80167DC0; // type:function size:0x14 -getItemIdForTabletNum = .text:0x80167DE0; // type:function size:0x10 +getSongItemIdForIndex__Fl = .text:0x80167DC0; // type:function size:0x14 +getTabletItemIdForIndex__Fl = .text:0x80167DE0; // type:function size:0x10 getCurrentSwordLevel__Fv = .text:0x80167DF0; // type:function size:0x24 -fn_80167E20 = .text:0x80167E20; // type:function size:0x30 +getCurrentSwordItemId__Fv = .text:0x80167E20; // type:function size:0x30 fn_80167E50 = .text:0x80167E50; // type:function size:0x14 isSwordRestrictedBokoBase__Fv = .text:0x80167E70; // type:function size:0x44 -getItemIdForTriforcePieceNum = .text:0x80167EC0; // type:function size:0x10 +getTriforceItemIdForIndex__Fl = .text:0x80167EC0; // type:function size:0x10 getSongLifeTreeStatus__Fv = .text:0x80167ED0; // type:function size:0x88 shouldUseSingular__Fl = .text:0x80167F60; // type:function size:0x74 __ct__17dLytCommonArrow_cFv = .text:0x80167FE0; // type:function size:0x148 @@ -28336,13 +28336,16 @@ lbl_804E8150 = .rodata:0x804E8150; // type:object size:0xC8 data:4byte lbl_804E8218 = .rodata:0x804E8218; // type:object size:0x10 data:4byte lbl_804E8228 = .rodata:0x804E8228; // type:object size:0x20 data:4byte brlanMap = .rodata:0x804E8248; // type:object size:0x10 scope:local data:4byte -lbl_804E8258 = .rodata:0x804E8258; // type:object size:0x128 -lbl_804E8380 = .rodata:0x804E8380; // type:object size:0x128 -brlanMap = .rodata:0x804E84A8; // type:object size:0x3F0 data:4byte -lbl_804E8898 = .rodata:0x804E8898; // type:object size:0x3C data:byte -lbl_804E88D4 = .rodata:0x804E88D4; // type:object size:0xC -lbl_804E88E0 = .rodata:0x804E88E0; // type:object size:0xC -TRIFORCE_PAUSE_MENU_INDEX = .rodata:0x804E88EC; // type:object size:0xC data:4byte +sNavTable1 = .rodata:0x804E8258; // type:object size:0x128 scope:local +sNavTable2 = .rodata:0x804E8380; // type:object size:0x128 scope:local +brlanMap = .rodata:0x804E84A8; // type:object size:0x3F0 scope:local data:4byte +iconVariants = .rodata:0x804E8898; // type:object size:0x18 scope:local data:byte +lbl_804E88B0 = .rodata:0x804E88B0; // type:object size:0xC +lbl_804E88BC = .rodata:0x804E88BC; // type:object size:0xC +lbl_804E88C8 = .rodata:0x804E88C8; // type:object size:0xC +@LOCAL@executeState_Select__17dLytPauseDisp00_cFv@sTabAnim2 = .rodata:0x804E88D4; // type:object size:0xC +@LOCAL@executeState_Select__17dLytPauseDisp00_cFv@sTabAnim3@0 = .rodata:0x804E88E0; // type:object size:0xC +@LOCAL@setupTabletTriforce__17dLytPauseDisp00_cFv@sTriforceHaveBoundings = .rodata:0x804E88EC; // type:object size:0xC data:4byte @LOCAL@setupSword__17dLytPauseDisp00_cFv@sSwordFrames@0 = .rodata:0x804E88F8; // type:object size:0x20 brlanMap = .rodata:0x804E8918; // type:object size:0x78 scope:local data:4byte sNavTable = .rodata:0x804E8990; // type:object size:0x110 scope:local @@ -34469,7 +34472,8 @@ sBoundingNames = .data:0x80525924; // type:object size:0x94 data:4byte lbl_805259B8 = .data:0x805259B8; // type:object size:0x10 lbl_805259C8 = .data:0x805259C8; // type:object size:0x10 lbl_805259D8 = .data:0x805259D8; // type:object size:0xC -lbl_805259E4 = .data:0x805259E4; // type:object size:0x20 +lbl_805259E4 = .data:0x805259E4; // type:object size:0x10 +lbl_805259F4 = .data:0x805259F4; // type:object size:0x10 lbl_80525A04 = .data:0x80525A04; // type:object size:0x14 lbl_80525A18 = .data:0x80525A18; // type:object size:0x10 data:string jumptable_80525A28 = .data:0x80525A28; // type:object size:0x20 scope:local @@ -42028,8 +42032,8 @@ sCurrentObtainingItemOarcName = .sbss:0x80575918; // type:object size:0x4 data:4 lbl_80575928 = .sbss:0x80575928; // type:object size:0x8 data:byte sInstance__12dTgMassObj_c = .sbss:0x80575930; // type:object size:0x4 data:4byte lbl_80575934 = .sbss:0x80575934; // type:object size:0x4 data:4byte -lbl_80575938 = .sbss:0x80575938; // type:object size:0x4 align:4 data:float -lbl_8057593C = .sbss:0x8057593C; // type:object size:0x4 align:4 data:float +sDisp00ArrowRotation__14dLytPauseMgr_c = .sbss:0x80575938; // type:object size:0x4 align:4 data:float +sDisp00ArrowLength__14dLytPauseMgr_c = .sbss:0x8057593C; // type:object size:0x4 align:4 data:float sInstance__14dLytPauseMgr_c = .sbss:0x80575940; // type:object size:0x8 data:4byte sInstance__17dLytGameOverMgr_c = .sbss:0x80575948; // type:object size:0x8 data:4byte sInstance__13dLytSaveMgr_c = .sbss:0x80575950; // type:object size:0x8 data:4byte @@ -51517,8 +51521,10 @@ lbl_805B1670 = .bss:0x805B1670; // type:object size:0x10 LytPauseDisp00__STATE_NONE = .bss:0x805B1680; // type:object size:0x40 data:4byte LytPauseDisp00__STATE_IN = .bss:0x805B16C0; // type:object size:0x40 data:4byte LytPauseDisp00__STATE_WAIT = .bss:0x805B1700; // type:object size:0x40 data:4byte -LytPauseDisp00__STATE_SELECT = .bss:0x805B1740; // type:object size:0x80 data:4byte -LytPauseDisp00__STATE_GET_DEMO = .bss:0x805B17C0; // type:object size:0x70 data:4byte +LytPauseDisp00__STATE_SELECT = .bss:0x805B1740; // type:object size:0x40 data:4byte +LytPauseDisp00__STATE_RING = .bss:0x805B1780; // type:object size:0x40 data:4byte +LytPauseDisp00__STATE_GET_DEMO = .bss:0x805B17C0; // type:object size:0x40 data:4byte +LytPauseDisp00__STATE_OUT = .bss:0x805B1800; // type:object size:0x30 data:4byte @22656 = .bss:0x805B1830; // type:object size:0xC scope:local ...bss.0 = .bss:0x805B1830; // type:label scope:local StateID_None__17dLytPauseDisp01_c = .bss:0x805B1840; // type:object size:0x30 data:4byte diff --git a/include/d/d_cs_base.h b/include/d/d_cs_base.h index 7bce9e41..8c7972c8 100644 --- a/include/d/d_cs_base.h +++ b/include/d/d_cs_base.h @@ -40,6 +40,10 @@ public: return mCursorIf.getHit(); } + dCursorInterface_c *getCursorIf() { + return &mCursorIf; + } + static dCsBase_c *GetInstance() { return sInstance; } diff --git a/include/d/lyt/d_lyt_pause_disp_00.h b/include/d/lyt/d_lyt_pause_disp_00.h index 3805c434..38a07923 100644 --- a/include/d/lyt/d_lyt_pause_disp_00.h +++ b/include/d/lyt/d_lyt_pause_disp_00.h @@ -17,6 +17,16 @@ public: bool execute(); bool draw(); + void drawDirectly(); + void requestIn(bool scroll); + void requestOut(bool scroll); + void requestSelect(); + void requestRing(); + void requestUnselect(); + + bool requestSelectGuide(); + bool requestSelectMpls(); + STATE_FUNC_DECLARE(dLytPauseDisp00_c, None); STATE_FUNC_DECLARE(dLytPauseDisp00_c, In); STATE_FUNC_DECLARE(dLytPauseDisp00_c, Wait); diff --git a/include/d/lyt/d_lyt_util_items.h b/include/d/lyt/d_lyt_util_items.h index f8e0a634..12f029a5 100644 --- a/include/d/lyt/d_lyt_util_items.h +++ b/include/d/lyt/d_lyt_util_items.h @@ -22,24 +22,40 @@ u8 getSongLifeTreeStatus(); /** 0: no sword, 6: TMS */ s32 getCurrentSwordLevel(); +u16 getCurrentSwordItemId(); bool isSwordRestrictedBokoBase(); +u16 getCurrentGoddessHarpItemId(); +bool isHarpRestrictedBokoBase(); + +u16 getCurrentEarringsItemId(); + u16 getTabletItemIdForIndex(s32 index); u16 getTriforceItemIdForIndex(s32 index); +u16 getSongItemIdForIndex(s32 index); + bool hasGoddessHarp(); bool hasSong(s32 index); bool hasWaterDragonScale(); +u16 getCurrentWaterDragonScaleItemId(); bool isWaterDragonScaleRestricted(); bool hasSailcloth(); s32 getCurrentMittsLevel(); +u16 getCurrentMittsItemId(); bool isMittsRestricted(); +u16 getCurrentSailclothItemId(); + +u16 getCurrentWalletItemId(); + +u16 getCurrentHeartPieceItemId(); + void getItemLabel(s32 itemId, SizedString<32> &buf); void getCaptionItemLabel(s32 itemId, SizedString<32> &buf); void getDowsingLabel(s32 itemId, SizedString<32> &buf); diff --git a/include/m/m_vec.h b/include/m/m_vec.h index f5dd02ef..401c04c3 100644 --- a/include/m/m_vec.h +++ b/include/m/m_vec.h @@ -315,6 +315,10 @@ public: mVec2_c operator-(const mVec2_c &v) const { return mVec2_c(x - v.x, y - v.y); } + + f32 squareDistanceTo(const mVec2_c &other) const { + return (*this - other).squaredLength(); + } }; #endif diff --git a/src/d/lyt/d_lyt_pause_disp_00.cpp b/src/d/lyt/d_lyt_pause_disp_00.cpp index 6ea81fb1..c2ab10bf 100644 --- a/src/d/lyt/d_lyt_pause_disp_00.cpp +++ b/src/d/lyt/d_lyt_pause_disp_00.cpp @@ -18,11 +18,16 @@ #include "d/lyt/meter/d_lyt_meter.h" #include "d/snd/d_snd_small_effect_mgr.h" #include "d/snd/d_snd_wzsound.h" +#include "m/m_vec.h" #include "nw4r/lyt/lyt_group.h" +#include "nw4r/lyt/lyt_pane.h" +#include "nw4r/lyt/lyt_types.h" #include "nw4r/math/math_types.h" #include "sized_string.h" #include "toBeSorted/counters/counter.h" +#include + STATE_DEFINE(dLytPauseDisp00_c, None); STATE_DEFINE(dLytPauseDisp00_c, In); STATE_DEFINE(dLytPauseDisp00_c, Wait); @@ -31,6 +36,92 @@ STATE_DEFINE(dLytPauseDisp00_c, Ring); STATE_DEFINE(dLytPauseDisp00_c, GetDemo); STATE_DEFINE(dLytPauseDisp00_c, Out); +// A matrix controlling navigation with the Nunchuk stick. +// The row index is the currently selected target, and the row contains +// the list of targets, one entry per stick direction (starting up and going clockwise) +// +// If someone was really bored they could probably replace all of these +// with constants... +static const u8 sNavTable1[][8] = { + {0x00, 0x15, 0x15, 0x0F, 0x08, 0x18, 0x24, 0x24}, + {0x12, 0x11, 0x03, 0x1E, 0x1E, 0x1E, 0x20, 0x20}, + {0x13, 0x1C, 0x1B, 0x1F, 0x1F, 0x1E, 0x02, 0x11}, + {0x08, 0x0A, 0x0A, 0x06, 0x06, 0x00, 0x19, 0x18}, + {0x09, 0x21, 0x21, 0x00, 0x07, 0x07, 0x0B, 0x0B}, + {0x0A, 0x0B, 0x07, 0x07, 0x00, 0x00, 0x1F, 0x04}, + {0x0B, 0x05, 0x05, 0x00, 0x00, 0x06, 0x06, 0x0A}, + {0x01, 0x0F, 0x10, 0x0A, 0x0A, 0x04, 0x18, 0x24}, + {0x15, 0x21, 0x21, 0x05, 0x0B, 0x0B, 0x10, 0x0F}, + {0x08, 0x10, 0x0B, 0x07, 0x06, 0x04, 0x04, 0x08}, + {0x09, 0x09, 0x05, 0x05, 0x07, 0x06, 0x0A, 0x10}, + {0x01, 0x0E, 0x0D, 0x10, 0x08, 0x08, 0x18, 0x01}, + {0x15, 0x15, 0x00, 0x09, 0x09, 0x10, 0x0C, 0x0E}, + {0x00, 0x15, 0x0D, 0x0D, 0x10, 0x0C, 0x0C, 0x01}, + {0x01, 0x15, 0x09, 0x09, 0x10, 0x08, 0x08, 0x01}, + {0x0F, 0x09, 0x09, 0x0B, 0x0A, 0x0A, 0x08, 0x08}, + {0x14, 0x14, 0x13, 0x03, 0x02, 0x02, 0x12, 0x14}, + {0x14, 0x14, 0x11, 0x11, 0x02, 0x20, 0x20, 0x20}, + {0x14, 0x22, 0x1D, 0x1C, 0x03, 0x11, 0x11, 0x14}, + {0x00, 0x22, 0x22, 0x13, 0x11, 0x12, 0x12, 0x00}, + {0x00, 0x00, 0x21, 0x21, 0x09, 0x0F, 0x01, 0x01}, + {0x23, 0x24, 0x17, 0x17, 0x1A, 0x1D, 0x1D, 0x22}, + {0x24, 0x01, 0x01, 0x18, 0x18, 0x1B, 0x16, 0x16}, + {0x17, 0x01, 0x08, 0x04, 0x19, 0x19, 0x1C, 0x17}, + {0x18, 0x18, 0x04, 0x06, 0x1A, 0x1A, 0x1A, 0x1D}, + {0x16, 0x19, 0x19, 0x06, 0x00, 0x1F, 0x1B, 0x00}, + {0x1C, 0x17, 0x1A, 0x1A, 0x1A, 0x1F, 0x03, 0x1C}, + {0x1D, 0x1D, 0x18, 0x1B, 0x1B, 0x03, 0x13, 0x13}, + {0x22, 0x16, 0x16, 0x19, 0x1C, 0x1C, 0x13, 0x14}, + {0x02, 0x03, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x02}, + {0x03, 0x1B, 0x06, 0x00, 0x00, 0x1E, 0x1E, 0x03}, + {0x14, 0x12, 0x12, 0x02, 0x02, 0x00, 0x00, 0x00}, + {0x15, 0x00, 0x00, 0x00, 0x05, 0x05, 0x09, 0x15}, + {0x00, 0x23, 0x23, 0x16, 0x1D, 0x13, 0x14, 0x14}, + {0x00, 0x24, 0x24, 0x17, 0x16, 0x1D, 0x22, 0x22}, + {0x00, 0x01, 0x01, 0x08, 0x17, 0x16, 0x23, 0x23}, + {0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D}, +}; + +static const u8 sNavTable2[][8] = { + {0x00, 0x15, 0x15, 0x0E, 0x0C, 0x18, 0x24, 0x24}, + {0x12, 0x11, 0x03, 0x1E, 0x1E, 0x1E, 0x20, 0x20}, + {0x13, 0x1C, 0x1B, 0x1F, 0x1F, 0x1E, 0x02, 0x11}, + {0x08, 0x0A, 0x0A, 0x06, 0x06, 0x00, 0x19, 0x18}, + {0x09, 0x21, 0x21, 0x00, 0x07, 0x07, 0x0B, 0x0B}, + {0x0A, 0x0B, 0x07, 0x07, 0x00, 0x00, 0x1F, 0x04}, + {0x0B, 0x05, 0x05, 0x00, 0x00, 0x06, 0x06, 0x0A}, + {0x0C, 0x0C, 0x10, 0x0A, 0x0A, 0x04, 0x18, 0x24}, + {0x0D, 0x21, 0x21, 0x05, 0x0B, 0x0B, 0x10, 0x0D}, + {0x08, 0x10, 0x0B, 0x07, 0x06, 0x04, 0x04, 0x08}, + {0x09, 0x09, 0x05, 0x05, 0x07, 0x06, 0x0A, 0x10}, + {0x01, 0x0E, 0x0D, 0x10, 0x08, 0x08, 0x18, 0x01}, + {0x15, 0x15, 0x21, 0x09, 0x09, 0x10, 0x0C, 0x0E}, + {0x01, 0x15, 0x0D, 0x0D, 0x10, 0x0C, 0x0C, 0x01}, + {0x00, 0x15, 0x00, 0x09, 0x10, 0x08, 0x08, 0x01}, + {0x0E, 0x0D, 0x09, 0x0B, 0x0A, 0x0A, 0x08, 0x0C}, + {0x14, 0x14, 0x13, 0x03, 0x02, 0x02, 0x12, 0x14}, + {0x14, 0x14, 0x11, 0x11, 0x02, 0x20, 0x20, 0x20}, + {0x14, 0x22, 0x1D, 0x1C, 0x03, 0x11, 0x11, 0x14}, + {0x00, 0x22, 0x1D, 0x13, 0x11, 0x12, 0x12, 0x00}, + {0x00, 0x00, 0x21, 0x21, 0x0D, 0x0E, 0x01, 0x01}, + {0x23, 0x24, 0x17, 0x17, 0x1A, 0x1D, 0x1D, 0x22}, + {0x24, 0x01, 0x01, 0x18, 0x18, 0x1B, 0x16, 0x16}, + {0x17, 0x01, 0x08, 0x04, 0x19, 0x19, 0x1C, 0x17}, + {0x18, 0x18, 0x04, 0x06, 0x1A, 0x1A, 0x1A, 0x1D}, + {0x16, 0x19, 0x19, 0x06, 0x00, 0x1F, 0x1B, 0x00}, + {0x1C, 0x17, 0x1A, 0x1A, 0x1A, 0x1F, 0x03, 0x1C}, + {0x1D, 0x1D, 0x18, 0x1B, 0x1B, 0x03, 0x13, 0x13}, + {0x22, 0x16, 0x16, 0x19, 0x1C, 0x1C, 0x13, 0x14}, + {0x02, 0x03, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x02}, + {0x03, 0x1B, 0x06, 0x00, 0x00, 0x1E, 0x1E, 0x03}, + {0x14, 0x12, 0x12, 0x02, 0x02, 0x00, 0x00, 0x00}, + {0x15, 0x00, 0x00, 0x00, 0x05, 0x05, 0x09, 0x15}, + {0x00, 0x23, 0x23, 0x16, 0x1D, 0x13, 0x14, 0x14}, + {0x00, 0x24, 0x24, 0x17, 0x16, 0x1D, 0x22, 0x22}, + {0x00, 0x01, 0x01, 0x08, 0x17, 0x16, 0x23, 0x23}, + {0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D}, +}; + static const d2d::LytBrlanMapping brlanMap[] = { { "pause_00_in.brlan", "G_inOut_00"}, { "pause_00_have.brlan", "G_sekiban_00"}, @@ -238,7 +329,16 @@ static const d2d::LytBrlanMapping brlanMap[] = { #define PAUSE_DISP_00_NUM_SUBPANES 24 -extern "C" u8 lbl_804E8898[]; +// clang-format off +static const u8 iconVariants[] = { + // Wheel + 0, 0, 0, 0, 0, 0, 0, 0, + // Dowsing + 2, 2, 2, 2, 2, 2, 2, 2, + // Pouch + 1, 1, 1, 1, 1, 1, 1, 1, +}; +// clang-format on static const char *sGroupName = "G_ref_00"; @@ -303,7 +403,7 @@ bool dLytPauseDisp00_c::build() { resAcc = pauseMgr->getResAcc2(); for (int i = 0; i < PAUSE_DISP_00_NUM_SUBPANES; i++) { - mIcons[i].build(resAcc, lbl_804E8898[i]); + mIcons[i].build(resAcc, iconVariants[i]); mSubpanes[i].mpLytPane = &mIcons[i]; mSubpaneList.PushBack(&mSubpanes[i]); } @@ -384,7 +484,11 @@ bool dLytPauseDisp00_c::remove() { } bool dLytPauseDisp00_c::execute() { + dLytPauseMgr_c *pause = dLytPauseMgr_c::GetInstance(); field_0xE371 = false; + pause->setField_0x083C(false); + pause->setField_0x083D(false); + pause->setField_0x0837(false); mStateMgr.executeState(); executeCall(); for (int i = 0; i < PAUSE_DISP_00_NUM_SUBPANES; i++) { @@ -407,6 +511,54 @@ bool dLytPauseDisp00_c::draw() { return true; } +void dLytPauseDisp00_c::drawDirectly() { + mLyt.draw(); +} + +void dLytPauseDisp00_c::requestIn(bool scroll) { + mInRequest = true; + mDoScrollAnim = scroll; +} + +void dLytPauseDisp00_c::requestOut(bool scroll) { + mOutRequest = true; + mDoScrollAnim = scroll; +} + +void dLytPauseDisp00_c::requestSelect() { + mSelectToggleRequest = true; +} + +void dLytPauseDisp00_c::requestRing() { + mRingToggleRequest = true; +} + +void dLytPauseDisp00_c::requestUnselect() { + mSelectToggleRequest = true; +} + +bool dLytPauseDisp00_c::requestSelectGuide() { + if (mSelectGuideRequest == true) { + return 0; + } + + mSelectGuideRequest = true; + if (mCallTimerMaybe != 0) { + mStopCallRequest = true; + StoryflagManager::sInstance->unsetFlag(570); + } + return true; +} + +bool dLytPauseDisp00_c::requestSelectMpls() { + if (mSelectMplsRequest == true) { + return 0; + } + + mSelectMplsRequest = true; + return true; +} + void dLytPauseDisp00_c::initializeState_None() { for (int i = 0; i < PAUSE_DISP_00_NUM_ANIMS; i++) { mAnm[i].unbind(); @@ -1240,7 +1392,7 @@ void dLytPauseDisp00_c::setupFireshieldEarrings() { void dLytPauseDisp00_c::setupSongsAndLifeTree() { if (hasGoddessHarp()) { setAnm(PAUSE_DISP_00_ANIM_HAVE_HARP, 1.0f); - setAnm(PAUSE_DISP_00_ANIM_BOCO_HARP, 1.0f); + setAnm(PAUSE_DISP_00_ANIM_BOCO_HARP, 0.0f); mpBoundings[PAUSE_DISP_00_BOUNDING_HARP]->SetVisible(true); } else { setAnm(PAUSE_DISP_00_ANIM_HAVE_HARP, 0.0f); @@ -1305,32 +1457,32 @@ void dLytPauseDisp00_c::setupTabletTriforce() { PAUSE_DISP_00_ANIM_HAVE_FORCE_OFFSET + 2, }; - s32 tabletCount = 0; + s32 count = 0; for (int i = 0; i < 3; i++) { if (dAcItem_c::checkFlag(getTabletItemIdForIndex(i))) { - tabletCount++; + count++; } } - if (tabletCount != 0) { + if (count != 0) { setAnm(PAUSE_DISP_00_ANIM_HAVE_TABLET, 1.0f); - setAnm(PAUSE_DISP_00_ANIM_TABLETS, tabletCount - 1.0f); + setAnm(PAUSE_DISP_00_ANIM_TABLETS, count - 1.0f); mpBoundings[PAUSE_DISP_00_BOUNDING_TABLETS]->SetVisible(true); } else { setAnm(PAUSE_DISP_00_ANIM_HAVE_TABLET, 0.0f); } - s32 triforceCount = 0; + count = 0; for (int i = 0; i < 3; i++) { if (dAcItem_c::checkFlag(getTriforceItemIdForIndex(i))) { - triforceCount++; + count++; setAnm(sTriforceHaveBoundings[i], 1.0f); } else { setAnm(sTriforceHaveBoundings[i], 0.0f); } } - if (triforceCount != 0) { + if (count != 0) { mpBoundings[PAUSE_DISP_00_BOUNDING_TABLETS]->SetVisible(true); mAnm[PAUSE_DISP_00_ANIM_TABLETS].setFrame(3.0f); setAnm(PAUSE_DISP_00_ANIM_HAVE_FORCE_BG, 1.0f); @@ -1390,89 +1542,53 @@ void dLytPauseDisp00_c::setupStoneOfTrials() { } } -// A matrix controlling navigation with the Nunchuk stick. -// The row index is the currently selected target, and the row contains -// the list of targets, one entry per stick direction (starting up and going clockwise) -// -// If someone was really bored they could probably replace all of these -// with constants... -static const u8 sNavTable1[][8] = { - { 0, 2, 2, 6, 5, 5, 33, 0}, - { 0, 3, 3, 7, 6, 5, 1, 1}, - { 0, 4, 4, 8, 7, 6, 2, 2}, - { 0, 13, 13, 17, 8, 7, 3, 3}, - { 1, 2, 6, 10, 9, 33, 33, 1}, - { 2, 3, 7, 11, 10, 9, 5, 1}, - { 3, 4, 8, 12, 11, 10, 6, 2}, - { 4, 13, 17, 21, 12, 11, 7, 3}, - { 5, 6, 10, 30, 29, 29, 33, 33}, - { 6, 7, 11, 31, 30, 29, 9, 5}, - { 7, 8, 12, 32, 31, 30, 10, 6}, - { 8, 17, 21, 25, 32, 31, 11, 7}, - { 0, 14, 14, 18, 17, 8, 4, 4}, - { 0, 15, 15, 19, 18, 17, 13, 13}, - { 0, 16, 16, 20, 19, 18, 14, 14}, - { 0, 0, 34, 20, 20, 19, 15, 15}, - {13, 14, 18, 22, 21, 12, 8, 4}, - {14, 15, 19, 23, 22, 21, 17, 13}, - {15, 16, 20, 24, 23, 22, 18, 14}, - {16, 16, 34, 34, 24, 23, 19, 15}, - {17, 18, 22, 26, 25, 32, 12, 8}, - {18, 19, 23, 27, 26, 25, 21, 17}, - {19, 20, 24, 28, 27, 26, 22, 18}, - {20, 34, 34, 28, 28, 27, 23, 19}, - {21, 22, 26, 26, 0, 32, 32, 12}, - {22, 23, 27, 27, 0, 25, 25, 21}, - {23, 24, 28, 28, 0, 26, 26, 22}, - {24, 24, 34, 0, 0, 27, 27, 23}, - { 9, 10, 30, 30, 0, 0, 33, 9}, - {10, 11, 31, 31, 0, 29, 29, 9}, - {11, 12, 32, 32, 0, 30, 30, 10}, - {12, 21, 25, 25, 0, 31, 31, 11}, - { 1, 1, 5, 9, 9, 0, 0, 0}, - {16, 0, 0, 0, 24, 24, 20, 16}, -}; - -static const u8 sNavTable2[][8] = { - { 0, 2, 2, 6, 5, 5, 33, 0}, - { 0, 3, 3, 7, 6, 5, 1, 1}, - { 0, 4, 4, 8, 7, 6, 2, 2}, - { 0, 13, 13, 17, 8, 7, 3, 3}, - { 1, 2, 6, 10, 9, 33, 33, 1}, - { 2, 3, 7, 11, 10, 9, 5, 1}, - { 3, 4, 8, 12, 11, 10, 6, 2}, - { 4, 13, 17, 21, 12, 11, 7, 3}, - { 5, 6, 10, 30, 29, 29, 33, 33}, - { 6, 7, 11, 31, 30, 29, 9, 5}, - { 7, 8, 12, 32, 31, 30, 10, 6}, - { 8, 17, 21, 25, 32, 31, 11, 7}, - { 0, 14, 14, 18, 17, 8, 4, 4}, - { 0, 15, 15, 19, 18, 17, 13, 13}, - { 0, 16, 16, 20, 19, 18, 14, 14}, - { 0, 0, 34, 20, 20, 19, 15, 15}, - {13, 14, 18, 22, 21, 12, 8, 4}, - {14, 15, 19, 23, 22, 21, 17, 13}, - {15, 16, 20, 24, 23, 22, 18, 14}, - {16, 16, 34, 34, 24, 23, 19, 15}, - {17, 18, 22, 26, 25, 32, 12, 8}, - {18, 19, 23, 27, 26, 25, 21, 17}, - {19, 20, 24, 28, 27, 26, 22, 18}, - {20, 34, 34, 28, 28, 27, 23, 19}, - {21, 22, 26, 26, 0, 32, 32, 12}, - {22, 23, 27, 27, 0, 25, 25, 21}, - {23, 24, 28, 28, 0, 26, 26, 22}, - {24, 24, 34, 0, 0, 27, 27, 23}, - { 9, 10, 30, 30, 0, 0, 33, 9}, - {10, 11, 31, 31, 0, 29, 29, 9}, - {11, 12, 32, 32, 0, 30, 30, 10}, - {12, 21, 25, 25, 0, 31, 31, 11}, - { 1, 1, 5, 9, 9, 0, 0, 0}, - {16, 0, 0, 0, 24, 24, 20, 16}, -}; +void dLytPauseDisp00_c::setupRingIcons(s32 tab) { + switch (tab) { + case 1: { + s32 offset = PAUSE_DISP_00_BOUNDING_RING_OFFSET; + for (int i = 0; i < PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL; i++) { + bool visible = false; + if (getPouchItemForSlot(i, true) != LYT_CMN_PouchPotionHealthPlusPlusHalf) { + visible = true; + } + mpBoundings[offset]->SetVisible(visible); + offset++; + } + break; + } + case 2: { + s32 offset = PAUSE_DISP_00_BOUNDING_RING_OFFSET; + for (int i = 0; i < PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL; i++) { + bool visible = false; + if (hasDowsingInIndex(i)) { + visible = true; + } + mpBoundings[offset]->SetVisible(visible); + offset++; + } + break; + } + case 0: + default: { + s32 offset = PAUSE_DISP_00_BOUNDING_RING_OFFSET; + for (int i = 0; i < PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL; i++) { + bool visible = false; + if (getItemLevelForBWheelIndex(i) != 0) { + visible = true; + } + mpBoundings[offset]->SetVisible(visible); + offset++; + } + break; + } + } +} s32 dLytPauseDisp00_c::updateSelection() { dLytControlGame_c *lytControl = dLytControlGame_c::getInstance(); dLytPauseMgr_c *pause = dLytPauseMgr_c::GetInstance(); + d2d::AnmGroup_c *pAnm; + if (!pause->isStateWait()) { pause->setSelection(dLytPauseMgr_c::SELECT_NONE, 0, false); return 0; @@ -1578,7 +1694,7 @@ s32 dLytPauseDisp00_c::updateSelection() { default: { s32 idx = navTargetToBounding(target) - PAUSE_DISP_00_BOUNDING_RING_OFFSET; if (lytControl->getPauseDisp00Tab() == 1) { - id = getPouchItemForSlot(idx, true); + id = getPouchItemIdForIndex(idx, true); if (id == ITEM_NONE) { id = ITEM_POUCH_EXPANSION; } @@ -1614,24 +1730,9 @@ s32 dLytPauseDisp00_c::updateSelection() { selectionType = dLytPauseMgr_c::SELECT_FIRE; 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_OFFSET + 7: - case PAUSE_DISP_00_BOUNDING_HARP: - case PAUSE_DISP_00_BOUNDING_SWORD: - case PAUSE_DISP_00_BOUNDING_SHIREN: { + // yes + case INT_MIN ... PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET - 1: + case PAUSE_DISP_00_BOUNDING_SHIREN: { id = getPointedItemSpecial(paneIdx, &locked); selectionType = dLytPauseMgr_c::SELECT_ITEM; break; @@ -1648,83 +1749,73 @@ s32 dLytPauseDisp00_c::updateSelection() { } } } - - // 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++; + pAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_TABLET]; + for (int i = PAUSE_DISP_00_BOUNDING_TABLETS; i < PAUSE_DISP_00_BOUNDING_HARP; 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); } - } - { - d2d::AnmGroup_c *pAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_HARP]; - for (int i = 15; i < 21; i++) { + if (anim == PAUSE_DISP_00_ANIM_ONOFF_MUSE_OFFSET + 6) { + d2d::AnmGroup_c *museAnm = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_MI_TO_TANE]; if (target != 0 && navTargetToBounding(target) == i) { - pAnm->play(); + museAnm->play(); } else { - playBackwards(*pAnm); + playBackwards(*museAnm); } - 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 = &mAnm[PAUSE_DISP_00_ANIM_ONOFF_HARP]; + for (int i = PAUSE_DISP_00_BOUNDING_HARP; i < PAUSE_DISP_00_BOUNDING_SHIREN + 1; i++) { + if (target != 0 && navTargetToBounding(target) == i) { pAnm->play(); } else { playBackwards(*pAnm); } + 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_SWORD]; + if (target != 0 && navTargetToBounding(target) == PAUSE_DISP_00_BOUNDING_SWORD) { + 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_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_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_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_SHIREN]; - if (target != 0 && navTargetToBounding(target) == PAUSE_DISP_00_BOUNDING_SHIREN) { - 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(); @@ -1732,25 +1823,25 @@ s32 dLytPauseDisp00_c::updateSelection() { tab == 2 ? PAUSE_DISP_00_ANIM_ONOFF_DOWSING_OFFSET : PAUSE_DISP_00_ANIM_ONOFF_ITEM_OFFSET; - d2d::AnmGroup_c *anm = &mAnm[anmIdx]; + pAnm = &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); + f32 frame = pAnm->getFrame(); + if (pAnm->getAnimDuration() - 1.0f > frame) { + pAnm->setFrame(frame + 1.0f); } } else { - f32 frame = anm->getFrame(); + f32 frame = pAnm->getFrame(); if (frame) { frame -= 1.0f; if (frame <= 0.0f) { frame = 0.0f; } - anm->setFrame(frame); + pAnm->setFrame(frame); } } - anm++; + pAnm++; } s32 tab1 = lytControl->getPauseDisp00Tab(); @@ -1836,48 +1927,21 @@ s32 dLytPauseDisp00_c::updateSelection() { 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: { + // yes + case INT_MIN ... PAUSE_DISP_00_BOUNDING_UI_TYPE - 1: { soundMgr->playSound(SE_S_MENU_P1_POINT_ITEM); break; } } if (rumble == true) { - dRumble_c::start(dRumble_c::sRumblePreset0, 1); + dRumble_c::start(dRumble_c::sRumblePreset1, 1); } } mPrevNavTarget = target; if (target != 0 && navTargetToBounding(target) != PAUSE_DISP_00_BOUNDING_CALIB_BTN_3 && - !dPadNav::isPrevPointerVisible() && !mpBoundings[navTargetToBounding(target)]->IsVisible()) { + !dPadNav::isPointerVisible() && !mpBoundings[navTargetToBounding(target)]->IsVisible()) { target = 0; } @@ -1904,6 +1968,28 @@ s32 dLytPauseDisp00_c::getPointerPane() const { return idx; } +bool dLytPauseDisp00_c::isPointingAtRingIcon() { + if (!mLyt.findPane("N_text_00")->IsVisible()) { + return false; + } + + bool ret = false; + nw4r::lyt::Size sz = mLyt.findPane("N_ringIcon_00")->GetSize(); + f32 radiusSq = sz.width * 0.5f; + radiusSq *= radiusSq; + mVec2_c csPos = dCsBase_c::GetInstance()->getCursorIf()->getCursorPos(); + nw4r::math::MTX34 mtx = mLyt.findPane("N_ringIcon_00")->GetGlobalMtx(); + nw4r::math::VEC3 v(0.0f, 0.0f, 0.0f); + MTXMultVec(mtx, v, v); + // TODO I hate vectors + mVec2_c pos(v.x, v.y); + if (pos.squareDistanceTo(csPos) < radiusSq) { + ret = true; + } + + return ret; +} + void dLytPauseDisp00_c::hideItemIcons() { for (int i = 0; i < PAUSE_DISP_00_NUM_SUBPANES; i++) { mIcons[i].setOff(); @@ -1911,6 +1997,98 @@ void dLytPauseDisp00_c::hideItemIcons() { } } +u16 dLytPauseDisp00_c::getPointedItemSpecial(s32 paneIdx, bool *pLocked) { + u16 id = 0; + switch (paneIdx) { + case PAUSE_DISP_00_BOUNDING_TABLETS: { + s32 count = 0; + for (int i = 0; i < 3; i++) { + if (dAcItem_c::checkFlag(getTabletItemIdForIndex(i))) { + count++; + } + } + if (count != 0) { + count--; + } + id = getTabletItemIdForIndex(count); + count = 0; + for (int i = 0; i < 3; i++) { + if (dAcItem_c::checkFlag(getTriforceItemIdForIndex(i))) { + count++; + } + } + if (count != 0) { + id = getTriforceItemIdForIndex(count - 1); + } + break; + } + case PAUSE_DISP_00_BOUNDING_HEART: { + id = getCurrentHeartPieceItemId(); + break; + } + case PAUSE_DISP_00_BOUNDING_POUCH: { + id = getCurrentWalletItemId(); + break; + } + case PAUSE_DISP_00_BOUNDING_PARACHUTE: { + id = getCurrentSailclothItemId(); + break; + } + case PAUSE_DISP_00_BOUNDING_MITTS: { + id = getCurrentMittsItemId(); + if (isMittsRestricted() == true) { + *pLocked = true; + } + break; + } + case PAUSE_DISP_00_BOUNDING_SCALE: { + id = getCurrentWaterDragonScaleItemId(); + if (isWaterDragonScaleRestricted()) { + *pLocked = true; + } + break; + } + case PAUSE_DISP_00_BOUNDING_RING: { + id = getCurrentEarringsItemId(); + break; + } + case PAUSE_DISP_00_BOUNDING_MUSE_OFFSET ... PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 7: { + s32 song = paneIdx - PAUSE_DISP_00_BOUNDING_MUSE_OFFSET; + if (paneIdx == PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + 6) { + if (StoryflagManager::sInstance->getFlag(462)) { + id = getSongItemIdForIndex(song); + } else if (dAcItem_c::checkFlag(ITEM_LIFE_TREE_FRUIT)) { + id = ITEM_LIFE_TREE_FRUIT; + } else if (dAcItem_c::checkFlag(ITEM_LIFE_TREE_SEED)) { + id = ITEM_LIFE_TREE_SEED; + } + } else { + id = getSongItemIdForIndex(song); + } + } break; + case PAUSE_DISP_00_BOUNDING_HARP: { + id = getCurrentGoddessHarpItemId(); + if (isHarpRestrictedBokoBase()) { + *pLocked = true; + } + break; + } + case PAUSE_DISP_00_BOUNDING_SWORD: { + id = getCurrentSwordItemId(); + if (isSwordRestrictedBokoBase()) { + *pLocked = true; + } + break; + } + case PAUSE_DISP_00_BOUNDING_SHIREN: { + id = ITEM_STONE_OF_TRIALS; + break; + } + } + + return id; +} + void dLytPauseDisp00_c::executeCall() { if (mCallTimerMaybe == 1) { d2d::AnmGroup_c &anm = mAnm[PAUSE_DISP_00_ANIM_CALL];