From e7495a950ef8c2ae134692587fb1568d2487b5b3 Mon Sep 17 00:00:00 2001 From: robojumper Date: Sat, 9 Aug 2025 01:18:43 +0200 Subject: [PATCH] wip --- config/SOUE01/symbols.txt | 156 +- include/d/a/d_a_item.h | 1 + include/d/a/d_a_player.h | 3 + include/d/lyt/d2d.h | 28 +- include/d/lyt/d_lyt_control_game.h | 7 +- include/d/lyt/d_lyt_pause.h | 38 +- include/d/lyt/d_lyt_pause_disp_00.h | 75 +- include/d/lyt/d_lyt_pause_disp_01.h | 2 +- include/d/lyt/d_lyt_util_items.h | 52 +- include/d/lyt/meter/d_lyt_meter_item_select.h | 4 +- include/sized_string.h | 6 +- src/d/lyt/d2d.cpp | 46 +- src/d/lyt/d_lyt_pause_disp_00.cpp | 1656 ++++++++++++++++- src/d/lyt/d_lyt_pause_disp_01.cpp | 28 +- src/d/lyt/meter/d_lyt_meter.cpp | 5 +- src/d/lyt/meter/d_lyt_meter_event_skip.cpp | 6 +- src/d/lyt/meter/d_lyt_meter_item_select.cpp | 25 +- .../d_lyt_msg_window_select_btn.cpp | 6 +- 18 files changed, 1954 insertions(+), 190 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index bea8aede..0d7c709b 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -3758,11 +3758,11 @@ getSizeBoxInWindow__Q23d2d9LytBase_cFPCc = .text:0x800AB190; // type:function si getTextBoxViaUserData__Q23d2d9LytBase_cFPQ34nw4r3lyt4PanePCc = .text:0x800AB240; // type:function size:0x94 setPropertiesRecursive__Q23d2d9LytBase_cFPQ34nw4r3lyt4Panefffff = .text:0x800AB2E0; // type:function size:0x294 setProperties__Q23d2d9LytBase_cFPQ34nw4r3lyt4Panefffff = .text:0x800AB580; // type:function size:0x3A4 -fn_800AB930__Q23d2d9LytBase_cFP10dTextBox_c = .text:0x800AB930; // type:function size:0x8 -fn_800AB940__Q23d2d9LytBase_cFPCci = .text:0x800AB940; // type:function size:0x58 -fn_800AB9A0__Q23d2d9LytBase_cFP10dTextBox_ci = .text:0x800AB9A0; // type:function size:0x1DC -fn_800ABB80__Q23d2d9LytBase_cFP10dTextBox_cP10dTextBox_ci = .text:0x800ABB80; // type:function size:0x158 -fn_800ABCE0__Q23d2d9LytBase_cFPCQ44nw4r3lyt3res11ExtUserDataP10dTextBox_cP10dTextBox_ci = .text:0x800ABCE0; // type:function size:0x170 +loadText__Q23d2d9LytBase_cFP10dTextBox_c = .text:0x800AB930; // type:function size:0x8 +loadTextVariant__Q23d2d9LytBase_cFPCci = .text:0x800AB940; // type:function size:0x58 +loadTextVariant__Q23d2d9LytBase_cFP10dTextBox_ci = .text:0x800AB9A0; // type:function size:0x1DC +loadTextVariantCopy__Q23d2d9LytBase_cFP10dTextBox_cP10dTextBox_ci = .text:0x800ABB80; // type:function size:0x158 +setText__Q23d2d9LytBase_cFPCQ44nw4r3lyt3res11ExtUserDataP10dTextBox_cP10dTextBox_ci = .text:0x800ABCE0; // type:function size:0x170 fn_800ABE50__Q23d2d9LytBase_cFP10dTextBox_cPwUl = .text:0x800ABE50; // type:function size:0x1E8 fn_800AC040__Q23d2d9LytBase_cFP10dTextBox_cP10dTextBox_cPwUl = .text:0x800AC040; // type:function size:0x160 fn_800AC1AC__Q23d2d9LytBase_cFPCQ44nw4r3lyt3res11ExtUserDataP10dTextBox_cP10dTextBox_cPwUl = .text:0x800AC1A0; // type:function size:0x158 @@ -5828,8 +5828,8 @@ fn_800F0030__21dLytMeterItemSelect_cCFv = .text:0x800F0030; // type:function siz getBaseItemForBWheelSlot__21dLytMeterItemSelect_cFl = .text:0x800F0150; // type:function size:0x14 fn_800F0170__21dLytMeterItemSelect_cCFl = .text:0x800F0170; // type:function size:0x14 getInternalBaseItemForSlot__21dLytMeterItemSelect_cCFl = .text:0x800F0190; // type:function size:0x18 -fn_800F01B0__21dLytMeterItemSelect_cCFl = .text:0x800F01B0; // type:function size:0x30 -fn_800F01E0__21dLytMeterItemSelect_cCFl = .text:0x800F01E0; // type:function size:0xC +hasBWheelItem__21dLytMeterItemSelect_cCFl = .text:0x800F01B0; // type:function size:0x30 +isBocoburinLocked__21dLytMeterItemSelect_cCFl = .text:0x800F01E0; // type:function size:0xC isSlotBocoburinLocked__21dLytMeterItemSelect_cFl = .text:0x800F01F0; // type:function size:0x28 fn_800F0220__21dLytMeterItemSelect_cFl = .text:0x800F0220; // type:function size:0xC8 fn_800F02F0__21dLytMeterItemSelect_cCFv = .text:0x800F02F0; // type:function size:0x14 @@ -8785,13 +8785,13 @@ __dt__56sFStateMgr_c<17dLytPauseDisp00_c,20sStateMethodUsr_FI_c>Fv = .text:0x801 __dt__86sStateMgr_c<17dLytPauseDisp00_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8015A090; // type:function size:0xA0 __dt__33sFStateFct_c<17dLytPauseDisp00_c>Fv = .text:0x8015A130; // type:function size:0x6C __dt__30sFState_c<17dLytPauseDisp00_c>Fv = .text:0x8015A1A0; // type:function size:0x58 -init__17dLytPauseDisp00_cFv = .text:0x8015A200; // type:function size:0x310 +build__17dLytPauseDisp00_cFv = .text:0x8015A200; // type:function size:0x310 changeState__86sStateMgr_c<17dLytPauseDisp00_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x8015A510; // type:function size:0x10 -fn_8015A520 = .text:0x8015A520; // type:function size:0x118 -fn_8015A640 = .text:0x8015A640; // type:function size:0x10C +remove__17dLytPauseDisp00_cFv = .text:0x8015A520; // type:function size:0x118 +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 -fn_8015A770 = .text:0x8015A770; // type:function size:0x38 +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 @@ -8800,51 +8800,51 @@ 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 -LytPauseDisp00__stateNoneEnter = .text:0x8015A8E0; // type:function size:0x2B8 -LytPauseDisp00__stateNoneUpdate = .text:0x8015ABA0; // type:function size:0x34 -LytPauseDisp00__stateNoneLeave = .text:0x8015ABE0; // type:function size:0x8 -LytPauseDisp00__stateInEnter = .text:0x8015ABF0; // type:function size:0x2A8 -LytPauseDisp00__stateInUpdate = .text:0x8015AEA0; // type:function size:0xE4 -LytPauseDisp00__stateInLeave = .text:0x8015AF90; // type:function size:0x98 -LytPauseDisp00__stateWaitEnter = .text:0x8015B030; // type:function size:0x18 -LytPauseDisp00__stateWaitUpdate = .text:0x8015B050; // type:function size:0x2D4 -LytPauseDisp00__stateWaitLeave = .text:0x8015B330; // type:function size:0x4 -LytPauseDisp00__stateSelectEnter = .text:0x8015B340; // type:function size:0x160 -LytPauseDisp00__stateSelectUpdate = .text:0x8015B4A0; // type:function size:0x1C0 -LytPauseDisp00__stateSelectLeave = .text:0x8015B660; // type:function size:0x24 -LytPauseDisp00__stateRingEnter = .text:0x8015B690; // type:function size:0x88 -LytPauseDisp00__stateRingUpdate = .text:0x8015B720; // type:function size:0x34C -LytPauseDisp00__stateRingLeave = .text:0x8015BA70; // type:function size:0x50 -LytPauseDisp00__stateGetDemoEnter = .text:0x8015BAC0; // type:function size:0x1C -LytPauseDisp00__stateGetDemoUpdate = .text:0x8015BAE0; // type:function size:0x25C -LytPauseDisp00__stateGetDemoLeave = .text:0x8015BD40; // type:function size:0x4 -LytPauseDisp00__stateOutEnter = .text:0x8015BD50; // type:function size:0x94 -LytPauseDisp00__stateOutUpdate = .text:0x8015BDF0; // type:function size:0xE0 -LytPauseDisp00__stateOutLeave = .text:0x8015BED0; // type:function size:0x4 -displayElement__17dLytPauseDisp00_cFif = .text:0x8015BEE0; // type:function size:0x68 -fn_8015BF50 = .text:0x8015BF50; // type:function size:0x10 -fn_8015BF60 = .text:0x8015BF60; // type:function size:0x64 -pauseDisplayMainInventory = .text:0x8015BFD0; // type:function size:0x160 -pauseDisplayInventoryWheel = .text:0x8015C130; // type:function size:0x368 -pauseDisplayHeartPieces = .text:0x8015C4A0; // type:function size:0x104 -pauseDisplayWallets = .text:0x8015C5B0; // type:function size:0x1C8 -pauseDisplayMitts = .text:0x8015C780; // type:function size:0xD0 -pauseDisplaySailcloth = .text:0x8015C850; // type:function size:0x80 -pauseDisplayWaterDragonScale = .text:0x8015C8D0; // type:function size:0xA0 -pauseDisplayFireshieldEarrings = .text:0x8015C970; // type:function size:0x74 -pauseDisplaySongsAndLifeTree = .text:0x8015C9F0; // type:function size:0x2DC -pauseDisplayTabletTriforce = .text:0x8015CCD0; // type:function size:0x1B0 -pauseDisplaySword = .text:0x8015CE80; // type:function size:0x284 -pauseDsiplayStoneOfTrials = .text:0x8015D110; // type:function size:0xC0 -fn_8015D1D0 = .text:0x8015D1D0; // type:function size:0x130 -fn_8015D300 = .text:0x8015D300; // type:function size:0xA04 -fn_8015DD10 = .text:0x8015DD10; // type:function size:0x160 +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 +initializeState_In__17dLytPauseDisp00_cFv = .text:0x8015ABF0; // type:function size:0x2A8 +executeState_In__17dLytPauseDisp00_cFv = .text:0x8015AEA0; // type:function size:0xE4 +finalizeState_In__17dLytPauseDisp00_cFv = .text:0x8015AF90; // type:function size:0x98 +initializeState_Wait__17dLytPauseDisp00_cFv = .text:0x8015B030; // type:function size:0x18 +executeState_Wait__17dLytPauseDisp00_cFv = .text:0x8015B050; // type:function size:0x2D4 +finalizeState_Wait__17dLytPauseDisp00_cFv = .text:0x8015B330; // type:function size:0x4 +initializeState_Select__17dLytPauseDisp00_cFv = .text:0x8015B340; // type:function size:0x160 +executeState_Select__17dLytPauseDisp00_cFv = .text:0x8015B4A0; // type:function size:0x1C0 +finalizeState_Select__17dLytPauseDisp00_cFv = .text:0x8015B660; // type:function size:0x24 +initializeState_Ring__17dLytPauseDisp00_cFv = .text:0x8015B690; // type:function size:0x88 +executeState_Ring__17dLytPauseDisp00_cFv = .text:0x8015B720; // type:function size:0x34C +finalizeState_Ring__17dLytPauseDisp00_cFv = .text:0x8015BA70; // type:function size:0x50 +initializeState_GetDemo__17dLytPauseDisp00_cFv = .text:0x8015BAC0; // type:function size:0x1C +executeState_GetDemo__17dLytPauseDisp00_cFv = .text:0x8015BAE0; // type:function size:0x25C +finalizeState_GetDemo__17dLytPauseDisp00_cFv = .text:0x8015BD40; // type:function size:0x4 +initializeState_Out__17dLytPauseDisp00_cFv = .text:0x8015BD50; // type:function size:0x94 +executeState_Out__17dLytPauseDisp00_cFv = .text:0x8015BDF0; // type:function size:0xE0 +finalizeState_Out__17dLytPauseDisp00_cFv = .text:0x8015BED0; // type:function size:0x4 +setAnm__17dLytPauseDisp00_cFif = .text:0x8015BEE0; // type:function size:0x68 +stopAnm__17dLytPauseDisp00_cFi = .text:0x8015BF50; // type:function size:0x10 +playBackwards__17dLytPauseDisp00_cFRQ23d2d10AnmGroup_c = .text:0x8015BF60; // type:function size:0x64 +setupDisp__17dLytPauseDisp00_cFv = .text:0x8015BFD0; // type:function size:0x160 +setupInventoryWheel__17dLytPauseDisp00_cFv = .text:0x8015C130; // type:function size:0x368 +setupHeartPieces__17dLytPauseDisp00_cFv = .text:0x8015C4A0; // type:function size:0x104 +setupWallets__17dLytPauseDisp00_cFv = .text:0x8015C5B0; // type:function size:0x1C8 +setupMitts__17dLytPauseDisp00_cFv = .text:0x8015C780; // type:function size:0xD0 +setupSailcloth__17dLytPauseDisp00_cFv = .text:0x8015C850; // type:function size:0x80 +setupWaterDragonScale__17dLytPauseDisp00_cFv = .text:0x8015C8D0; // type:function size:0xA0 +setupFireshieldEarrings__17dLytPauseDisp00_cFv = .text:0x8015C970; // type:function size:0x74 +setupSongsAndLifeTree__17dLytPauseDisp00_cFv = .text:0x8015C9F0; // type:function size:0x2DC +setupTabletTriforce__17dLytPauseDisp00_cFv = .text:0x8015CCD0; // type:function size:0x1B0 +setupSword__17dLytPauseDisp00_cFv = .text:0x8015CE80; // type:function size:0x284 +setupStoneOfTrials__17dLytPauseDisp00_cFv = .text:0x8015D110; // type:function size:0xC0 +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 -fn_8015E010 = .text:0x8015E010; // type:function size:0x58 +hideItemIcons__17dLytPauseDisp00_cFv = .text:0x8015E010; // type:function size:0x58 fn_8015E070 = .text:0x8015E070; // type:function size:0x220 -fn_8015E290 = .text:0x8015E290; // type:function size:0xA4 -fn_8015E340 = .text:0x8015E340; // type:function size:0x54 -fn_8015E3A0 = .text:0x8015E3A0; // type:function size:0xF4 +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 __dt__17dLytPauseDisp00_cFv = .text:0x8015E4A0; // type:function size:0x130 build__33sFStateFct_c<17dLytPauseDisp00_c>FRC12sStateIDIf_c = .text:0x8015E5D0; // type:function size:0x60 dispose__33sFStateFct_c<17dLytPauseDisp00_c>FRP10sStateIf_c = .text:0x8015E630; // type:function size:0xC @@ -9130,7 +9130,7 @@ isSameName__34sFStateID_c<19dLytSaveMsgWindow_c>CFPCc = .text:0x801668E0; // typ fn_80166970 = .text:0x80166970; // type:function size:0x58 fn_801669D0 = .text:0x801669D0; // type:function size:0x4 hasPouchSlot__Flb = .text:0x801669E0; // type:function size:0x50 -fn_80166A30 = .text:0x80166A30; // type:function size:0x5C +getPouchItemIdForIndex__Flb = .text:0x80166A30; // type:function size:0x5C getPouchItemForSlot__Flb = .text:0x80166A90; // type:function size:0x70 getPouchItemAmount__Flb = .text:0x80166B00; // type:function size:0x8C fn_80166B90 = .text:0x80166B90; // type:function size:0xBC @@ -9146,24 +9146,24 @@ fn_80166FC0 = .text:0x80166FC0; // type:function size:0x50 fn_80167010 = .text:0x80167010; // type:function size:0x54 fn_80167070 = .text:0x80167070; // type:function size:0xD4 fn_80167150 = .text:0x80167150; // type:function size:0xF0 -fn_80167240 = .text:0x80167240; // type:function size:0x24 +getBWheelItemIdForIndex__Fl = .text:0x80167240; // type:function size:0x24 fn_80167270 = .text:0x80167270; // type:function size:0x24 getSubtypeToDisplayInItemWheel = .text:0x801672A0; // type:function size:0x108 -fn_801673B0 = .text:0x801673B0; // type:function size:0x24 +getItemLevelForBWheelIndex__Fl = .text:0x801673B0; // type:function size:0x24 fn_801673E0 = .text:0x801673E0; // type:function size:0x88 -fn_80167470 = .text:0x80167470; // type:function size:0x24 +getNumberForBWheelIndex__Fl = .text:0x80167470; // type:function size:0x24 fn_801674A0 = .text:0x801674A0; // type:function size:0x88 fn_80167530 = .text:0x80167530; // type:function size:0x94 -fn_801675D0 = .text:0x801675D0; // type:function size:0x24 +getNumberColorForBWheelIndex__Fl = .text:0x801675D0; // type:function size:0x24 fn_80167600 = .text:0x80167600; // type:function size:0xA0 -fn_801676A0 = .text:0x801676A0; // type:function size:0x24 +getLytItemIdForBWheelIndex__Fl = .text:0x801676A0; // type:function size:0x24 fn_801676D0 = .text:0x801676D0; // type:function size:0x1C -fn_801676F0 = .text:0x801676F0; // type:function size:0x24 +isBWheelIndexWithNumber__Fl = .text:0x801676F0; // type:function size:0x24 fn_80167720 = .text:0x80167720; // type:function size:0x58 -fn_80167780 = .text:0x80167780; // type:function size:0x34 +isBWheelIndexBocoburinLocked__Flb = .text:0x80167780; // type:function size:0x34 getDowsingItemIdForIndex__Fl = .text:0x801677C0; // type:function size:0x30 dowsingSlotForIndex__Fl = .text:0x801677F0; // type:function size:0x24 -fn_80167820 = .text:0x80167820; // type:function size:0x34 +hasDowsingInIndex__Fl = .text:0x80167820; // type:function size:0x34 getLytIndexForDowsingIndex__Fl = .text:0x80167860; // type:function size:0x5C getItemLabel__FlR15SizedString<32> = .text:0x801678C0; // type:function size:0x2C fn_801678F0 = .text:0x801678F0; // type:function size:0x2C @@ -9178,25 +9178,25 @@ 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 -getCurrentMittsType2 = .text:0x80167C00; // type:function size:0x4 +getCurrentMittsLevel__Fv = .text:0x80167C00; // type:function size:0x4 fn_80167C10 = .text:0x80167C10; // type:function size:0x44 -isDiggingMittsRestricted = .text:0x80167C60; // type:function size:0x8 +isMittsRestricted__Fv = .text:0x80167C60; // type:function size:0x8 fn_80167C70 = .text:0x80167C70; // type:function size:0x8 -checkWaterDragonScale = .text:0x80167C80; // type:function size:0x40 +hasWaterDragonScale__Fv = .text:0x80167C80; // type:function size:0x40 fn_80167CC0 = .text:0x80167CC0; // type:function size:0x30 -isWaterDragonScaleRestricted = .text:0x80167CF0; // type:function size:0x8 -hasGoddessHarp = .text:0x80167D00; // type:function size:0x34 +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 -fn_80167D80 = .text:0x80167D80; // type:function size:0x34 +hasSong__Fl = .text:0x80167D80; // type:function size:0x34 fn_80167DC0 = .text:0x80167DC0; // type:function size:0x14 getItemIdForTabletNum = .text:0x80167DE0; // type:function size:0x10 -currentSwordMaybe = .text:0x80167DF0; // type:function size:0x24 +getCurrentSwordLevel__Fv = .text:0x80167DF0; // type:function size:0x24 fn_80167E20 = .text:0x80167E20; // type:function size:0x30 fn_80167E50 = .text:0x80167E50; // type:function size:0x14 -swordRestrictedBokoBase = .text:0x80167E70; // type:function size:0x44 +isSwordRestrictedBokoBase__Fv = .text:0x80167E70; // type:function size:0x44 getItemIdForTriforcePieceNum = .text:0x80167EC0; // type:function size:0x10 -fn_80167ED0 = .text:0x80167ED0; // type:function size:0x88 +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 __dt__56sFStateMgr_c<17dLytCommonArrow_c,20sStateMethodUsr_FI_c>Fv = .text:0x80168130; // type:function size:0xA4 scope:weak @@ -11994,7 +11994,7 @@ ActorLink__isPressingButtonMinus = .text:0x801E3C50; // type:function size:0xC ActorLink__isPressingButtonB = .text:0x801E3C60; // type:function size:0xC ActorLink__isPressingButtonB2 = .text:0x801E3C70; // type:function size:0x4 fn_801E3C80 = .text:0x801E3C80; // type:function size:0x1EC -fn_801E3E70 = .text:0x801E3E70; // type:function size:0x5C +calcItemWheelSelection__7dAcPy_cFbl = .text:0x801E3E70; // type:function size:0x5C fn_801E3ED0 = .text:0x801E3ED0; // type:function size:0x1C4 getSelectedPouchItem = .text:0x801E40A0; // type:function size:0x8C ActorLink__handlePouchWheel = .text:0x801E4130; // type:function size:0x354 @@ -13650,7 +13650,7 @@ getGratitudeCrystalCount__9dAcItem_cFv = .text:0x80252710; // type:function size increaseGratitudeCrystalCounter = .text:0x80252720; // type:function size:0xC ActorLink__hasLifeTreeSeeding = .text:0x80252730; // type:function size:0x38 AcItem__giveLifeTreeSeedling = .text:0x80252770; // type:function size:0x94 -getExtraWalletCounter = .text:0x80252810; // type:function size:0x8 +getExtraWalletCount__9dAcItem_cFv = .text:0x80252810; // type:function size:0x8 increaseExtraWalletCounter = .text:0x80252820; // type:function size:0xC getTotalRequiredKeyPieceCount = .text:0x80252830; // type:function size:0x8 hasAllKeyPieces = .text:0x80252840; // type:function size:0x44 @@ -28338,12 +28338,12 @@ 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 -lbl_804E84A8 = .rodata:0x804E84A8; // type:object size:0x3F0 data:4byte +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 -lbl_804E88F8 = .rodata:0x804E88F8; // type:object size:0x20 +@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 @LOCAL@getInsectItemId__17dLytPauseDisp01_cCFl@sInsectItemTable = .rodata:0x804E8AA0; // type:object size:0x18 scope:local @@ -34465,7 +34465,7 @@ lbl_805258E4 = .data:0x805258E4; // type:object size:0x10 lbl_805258F4 = .data:0x805258F4; // type:object size:0x10 lbl_80525904 = .data:0x80525904; // type:object size:0x10 lbl_80525914 = .data:0x80525914; // type:object size:0x10 -lbl_80525924 = .data:0x80525924; // type:object size:0x94 data:4byte +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 @@ -34481,7 +34481,7 @@ __vt__56sFStateMgr_c<17dLytPauseDisp00_c,20sStateMethodUsr_FI_c> = .data:0x80525 __vt__86sStateMgr_c<17dLytPauseDisp00_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x80525B10; // type:object size:0x30 __vt__33sFStateFct_c<17dLytPauseDisp00_c> = .data:0x80525B40; // type:object size:0x18 __vt__30sFState_c<17dLytPauseDisp00_c> = .data:0x80525B58; // type:object size:0x354 -lbl_80525EAC = .data:0x80525EAC; // type:object size:0x34 +__vt__32sFStateID_c<17dLytPauseDisp00_c> = .data:0x80525EAC; // type:object size:0x34 @22677 = .data:0x80525EE0; // type:object size:0x12 scope:local data:string ...data.0 = .data:0x80525EE0; // type:label scope:local @22678 = .data:0x80525EF4; // type:object size:0xB scope:local data:string diff --git a/include/d/a/d_a_item.h b/include/d/a/d_a_item.h index 669673f5..1a437a67 100644 --- a/include/d/a/d_a_item.h +++ b/include/d/a/d_a_item.h @@ -68,6 +68,7 @@ public: static s32 getRupeeCounter(); static u32 getCurrentWalletCapacity(); + static u32 getExtraWalletCount(); static u32 getHeartContainerHealthCount(); static u32 getGratitudeCrystalCount(); diff --git a/include/d/a/d_a_player.h b/include/d/a/d_a_player.h index 9050140b..4eb58674 100644 --- a/include/d/a/d_a_player.h +++ b/include/d/a/d_a_player.h @@ -58,6 +58,9 @@ public: void setBeetleBackAnim(); s32 getBeetleWarningTimeLeft(); + // Item Selection functions + static s32 calcItemWheelSelection(bool reset, s32 numOptions); + public: f32 getField_0x4564() const { return field_0x4564; diff --git a/include/d/lyt/d2d.h b/include/d/lyt/d2d.h index fc19bfb9..ed6994c7 100644 --- a/include/d/lyt/d2d.h +++ b/include/d/lyt/d2d.h @@ -79,6 +79,20 @@ protected: u32 mFlags; }; +/** + * A layout with some utility functions, and a system + * for integrating LibMS text into NW4R's LYT. + * + * * If a TextBox has an integer userdatum "embed", this sets the text identified by the + * LibMS label of the same name as the text box (e.g. `T_back_00`) + * * If the integer is non-zero (it always seems to be for Skyward Sword!), + * `:00` is appended to the label name (e.g. `T_back_00:00`). + * * Game code can call a function to reload this text with a custom integer to select + * a specific variant. E.g. `T_newFile_00:00` -> "New Adventure", `T_newFile_00:01` -> "Hero Mode" + * * If a TextBox has a string userdatum "copy", the value identifies another textbox + * whose name is used instead. This is often used for text shadow, where a separate + * textbox is used for the shadow. + */ class LytBase_c : public Multi_c { public: LytBase_c(); @@ -93,8 +107,8 @@ public: dWindow_c *getWindow(const char *name); nw4r::lyt::Group *findGroupByName(const char *name); - bool fn_800AB940(const char *name, int arg); - bool fn_800AB9A0(dTextBox_c *textbox, int arg); + bool loadTextVariant(const char *name, int arg); + bool loadTextVariant(dTextBox_c *textbox, int arg); bool fn_800ABE50(dTextBox_c *textbox, wchar_t *destBuf, u32 maxLen); @@ -102,16 +116,16 @@ private: void setPropertiesRecursive(nw4r::lyt::Pane *pane, f32, f32, f32, f32, f32); void setProperties(nw4r::lyt::Pane *pane, f32, f32, f32, f32, f32); dTextBox_c *getTextBoxViaUserData(nw4r::lyt::Pane *pane, const char *name); - bool fn_800ABB80(dTextBox_c *textbox1, dTextBox_c *textbox2, int arg); - bool fn_800ABCE0(const nw4r::lyt::res::ExtUserData *userDatum, dTextBox_c *textbox1, dTextBox_c *textbox2, int arg); + bool loadTextVariantCopy(dTextBox_c *targetTextBox, dTextBox_c *sourceTextBox, int arg); + bool setText(const nw4r::lyt::res::ExtUserData *userDatum, dTextBox_c *targetTextBox, dTextBox_c *sourceTextBox, int arg); - bool fn_800AC040(dTextBox_c *textbox1, dTextBox_c *textbox2, wchar_t *destBuf, u32 maxLen); + bool fn_800AC040(dTextBox_c *targetTextBox, dTextBox_c *sourceTextBox, wchar_t *destBuf, u32 maxLen); bool fn_800AC1AC( - const nw4r::lyt::res::ExtUserData *userDatum, dTextBox_c *textbox1, dTextBox_c *textbox2, wchar_t *destBuf, + const nw4r::lyt::res::ExtUserData *userDatum, dTextBox_c *targetTextBox, dTextBox_c *sourceTextBox, wchar_t *destBuf, u32 maxLen ); MsbtInfo *getMsbtInfo() const; - bool fn_800AB930(dTextBox_c *box); + bool loadText(dTextBox_c *box); /* 0x8C */ MsbtInfo *mpMsbtInfo; }; diff --git a/include/d/lyt/d_lyt_control_game.h b/include/d/lyt/d_lyt_control_game.h index 0278133a..fb7a60c3 100644 --- a/include/d/lyt/d_lyt_control_game.h +++ b/include/d/lyt/d_lyt_control_game.h @@ -25,6 +25,10 @@ public: return field_0x15C2C; } + s32 getPauseDisp00Tab() const { + return mPauseDisp00Tab; + } + u16 getItemForPauseDemo() const { return mItemForPauseDemo; } @@ -56,8 +60,9 @@ private: /* 0x000A4 */ u8 _0x000A4[0x15C2C - 0x000A4]; /* 0x15C2C */ s32 field_0x15C2C; + /* 0x15C30 */ s32 mPauseDisp00Tab; - /* 0x15C30 */ u8 _0x15C23[0x15C60 - 0x15C30]; + /* 0x15C34 */ u8 _0x15C34[0x15C60 - 0x15C34]; /* 0x15C60 */ u16 mItemForPauseDemo; diff --git a/include/d/lyt/d_lyt_pause.h b/include/d/lyt/d_lyt_pause.h index 6614007d..90094664 100644 --- a/include/d/lyt/d_lyt_pause.h +++ b/include/d/lyt/d_lyt_pause.h @@ -3,7 +3,7 @@ #include "d/lyt/d2d.h" #include "egg/gfx/eggCpuTexture.h" -#include "nw4r/lyt/lyt_pane.h" +#include "nw4r/lyt/lyt_bounding.h" class dLytPauseMgr_c { public: @@ -31,6 +31,10 @@ public: return field_0x0832; } + bool getField_0x0838() const { + return field_0x0838; + } + bool getField_0x083B() const { return field_0x083B; } @@ -45,7 +49,13 @@ public: bool isStateWait() const; + s32 getCurrentDisp00Tab() const { + return mCurrentDisp00Tab; + } + enum SelectionType_e { + SELECT_BWHEEL = 0, + SELECT_POUCH = 1, SELECT_DOWSING = 2, SELECT_INSECT = 4, SELECT_QUEST_MATERIAL = 5, @@ -69,8 +79,19 @@ public: return mCurrentSelectionId; } - nw4r::lyt::Pane *getArrowBounding(int idx) const; - nw4r::lyt::Pane *setSelectedArrowBounding(int idx) const; + u8 getCurrentSelectionTab() const { + return mCurrentSelectionTab; + } + + void setCurrentSelectionTab(u8 tab) { + mCurrentSelectionTab = tab; + } + + nw4r::lyt::Bounding *getArrowBounding(int idx) const; + void setSelectedArrowBounding(int idx) const; + + static f32 sDisp00ArrowRotation; + static f32 sDisp00ArrowLength; private: static dLytPauseMgr_c *sInstance; @@ -85,7 +106,9 @@ private: /* 0x0814 */ EGG::CpuTexture *mpBgTexture; /* 0x0818 */ SelectionType_e mCurrentSelectionType; - /* 0x081C */ u8 _0x081C[0x082C - 0x081C]; + /* 0x081C */ u8 _0x081C[0x0820 - 0x081C]; + /* 0x0820 */ s32 mCurrentDisp00Tab; + /* 0x0824 */ u8 _0x0824[0x082C - 0x0824]; /* 0x082C */ u16 mCurrentSelectionId; @@ -93,9 +116,14 @@ private: /* 0x0831 */ bool field_0x0831; /* 0x0832 */ bool field_0x0832; + /* 0x0833 */ u8 mCurrentSelectionTab; - /* 0x0832 */ u8 _0x0832[0x083B - 0x0833]; + /* 0x0834 */ u8 _0x0834[0x0838 - 0x0834]; + /* 0x0838 */ bool field_0x0838; + + /* 0x0839 */ u8 _0x0839[0x083B - 0x0839]; + /* 0x083B */ bool field_0x083B; /* 0x083C */ u8 _0x083C[0x083E - 0x083C]; diff --git a/include/d/lyt/d_lyt_pause_disp_00.h b/include/d/lyt/d_lyt_pause_disp_00.h index aaacf9dc..81e20caa 100644 --- a/include/d/lyt/d_lyt_pause_disp_00.h +++ b/include/d/lyt/d_lyt_pause_disp_00.h @@ -4,6 +4,7 @@ #include "d/d_cursor_hit_check.h" #include "d/lyt/d2d.h" #include "d/lyt/d_lyt_common_icon_item.h" +#include "nw4r/lyt/lyt_bounding.h" #include "s/s_State.hpp" class dLytPauseDisp00_c { @@ -11,7 +12,10 @@ public: dLytPauseDisp00_c(); virtual ~dLytPauseDisp00_c() {} - void init(); + bool build(); + bool remove(); + bool execute(); + bool draw(); STATE_FUNC_DECLARE(dLytPauseDisp00_c, None); STATE_FUNC_DECLARE(dLytPauseDisp00_c, In); @@ -22,15 +26,68 @@ public: STATE_FUNC_DECLARE(dLytPauseDisp00_c, Out); private: - void displayElement(int idx, float value); + void setAnm(int idx, f32 value); + void stopAnm(int idx); + void playBackwards(d2d::AnmGroup_c &anm); - STATE_MGR_DECLARE(dLytPauseDisp00_c); - d2d::LytBase_c mLytBase; - d2d::AnmGroup_c field_0x00D0[0x7E]; - dLytCommonIconItem_c field_0x2050[0x18]; - /* 0xE110 */ d2d::SubPaneList mSubpanes; - d2d::SubPaneListNode field_0xE11C[0x18]; - dCursorHitCheckLyt_c field_0xE29C; + // Initial setup + void setupDisp(); + void setupInventoryWheel(); + void setupHeartPieces(); + void setupWallets(); + void setupMitts(); + void setupSailcloth(); + void setupWaterDragonScale(); + void setupFireshieldEarrings(); + void setupSongsAndLifeTree(); + void setupTabletTriforce(); + void setupSword(); + void setupStoneOfTrials(); + + // Dynamic setup + void setupRingIcons(s32 tab); + + s32 updateSelection(); + s32 getPointerPane() const; + + void hideItemIcons(); + + enum LoadRingTextCmd_e { + RING_TEXT_RELEASE_TO_CONFIRM = 0, + RING_TEXT_INITIAL_TAB = 1, + RING_TEXT_CURRENT_TAB = 2, + }; + + void executeCall(); + void playOnOffTabAnim(); + void loadRingText(u32 cmd); + + /* 0x0004 */ STATE_MGR_DECLARE(dLytPauseDisp00_c); + /* 0x0040 */ d2d::LytBase_c mLyt; + /* 0x00D0 */ d2d::AnmGroup_c mAnm[126]; + /* 0x2050 */ dLytCommonIconItem_c mIcons[24]; + /* 0xE110 */ d2d::SubPaneList mSubpaneList; + /* 0xE11C */ d2d::SubPaneListNode mSubpanes[24]; + /* 0xE29C */ dCursorHitCheckLyt_c mCsHitCheck; + /* 0xE2C4 */ nw4r::lyt::Bounding *mpBoundings[37]; + + /* 0xE358 */ s32 mStep; + /* 0xE35C */ s32 mPrevNavTarget; + /* 0xE360 */ s32 mCurrentNavTarget; + /* 0xE364 */ s32 mCallTimerMaybe; + /* 0xE368 */ s32 mGetDemoTimer; + /* 0xE36C */ bool mInRequest; + /* 0xE36D */ bool mOutRequest; + /* 0xE36E */ bool field_0xE36E; + /* 0xE36F */ bool mIsVisible; + /* 0xE370 */ bool mDoScrollAnim; + /* 0xE371 */ bool field_0xE371; + /* 0xE372 */ bool mSelectToggleRequest; + /* 0xE373 */ bool mSelectGuideRequest; + /* 0xE374 */ bool mStopCallRequest; + /* 0xE375 */ bool mSelectMplsRequest; + /* 0xE376 */ bool field_0xE376; + /* 0xE377 */ bool mRingToggleRequest; }; #endif diff --git a/include/d/lyt/d_lyt_pause_disp_01.h b/include/d/lyt/d_lyt_pause_disp_01.h index 41d2e769..900f376d 100644 --- a/include/d/lyt/d_lyt_pause_disp_01.h +++ b/include/d/lyt/d_lyt_pause_disp_01.h @@ -67,7 +67,7 @@ private: /* 0x98BC */ s32 mStep; /* 0x98C0 */ s32 mPrevNavTarget; /* 0x98C4 */ s32 mCurrentNavTarget; - /* 0x98C8 */ s32 mTimer; + /* 0x98C8 */ s32 mGetDemoTimer; /* 0x98CC */ bool mInRequest; /* 0x98CD */ bool mOutRequest; /* 0x98CE */ bool field_0x98CE; diff --git a/include/d/lyt/d_lyt_util_items.h b/include/d/lyt/d_lyt_util_items.h index 657ff83d..f8e0a634 100644 --- a/include/d/lyt/d_lyt_util_items.h +++ b/include/d/lyt/d_lyt_util_items.h @@ -5,6 +5,41 @@ #include "sized_string.h" #include "toBeSorted/dowsing_target.h" +enum LytItemNumberColor_e { + LYT_ITEM_COLOR_GOLD = 0, + LYT_ITEM_COLOR_RED = 1, + LYT_ITEM_COLOR_GREEN = 2, + LYT_ITEM_COLOR_NONE = 3, +}; + +enum SongLifeTreeSeedStatus_e { + SONG_LIFETREE_NONE = 0, + SONG_LIFETREE_HAS_SOTH_PARTS_OR_SEED = 1, + SONG_LIFETREE_HAS_SOTH = 2, +}; + +u8 getSongLifeTreeStatus(); + +/** 0: no sword, 6: TMS */ +s32 getCurrentSwordLevel(); +bool isSwordRestrictedBokoBase(); + +u16 getTabletItemIdForIndex(s32 index); + +u16 getTriforceItemIdForIndex(s32 index); + +bool hasGoddessHarp(); + +bool hasSong(s32 index); + +bool hasWaterDragonScale(); +bool isWaterDragonScaleRestricted(); + +bool hasSailcloth(); + +s32 getCurrentMittsLevel(); +bool isMittsRestricted(); + void getItemLabel(s32 itemId, SizedString<32> &buf); void getCaptionItemLabel(s32 itemId, SizedString<32> &buf); void getDowsingLabel(s32 itemId, SizedString<32> &buf); @@ -17,15 +52,30 @@ const wchar_t *getPauseCategoryText(s32 itemId); bool isPouchBocoburinLocked(); +// TODO - these return types may require some work + u8 getPouchItemForSlot(s32 slot, bool unk); bool hasPouchSlot(s32 slot, bool unk); s32 getPouchItemAmount(s32 slot, bool unk); u8 getPouchItemNumberColor(s32 slot, bool unk); f32 getShieldDurability(s32 slot, bool unk); +u32 getPouchItemIdForIndex(s32 slot, bool unk); +// TODO - rename and make sense of these DowsingTarget::DowsingSlot dowsingSlotForIndex(s32 index); -s32 getLytIndexForDowsingIndex(s32 index); +u8 getLytIndexForDowsingIndex(s32 index); u16 getDowsingItemIdForIndex(s32 index); +bool hasDowsingInIndex(s32 index); + +// B-Wheel +s32 getBWheelSlotForIndex(s32 index); +bool isBWheelIndexWithNumber(s32 index); +s32 getNumberForBWheelIndex(s32 index); +s32 getItemLevelForBWheelIndex(s32 index); +u8 getLytItemIdForBWheelIndex(s32 index); +bool isBWheelIndexBocoburinLocked(s32 index, bool unk); +u8 getNumberColorForBWheelIndex(s32 index); +u16 getBWheelItemIdForIndex(s32 index); /** * FR: -1, 0, 1 singular, else plural diff --git a/include/d/lyt/meter/d_lyt_meter_item_select.h b/include/d/lyt/meter/d_lyt_meter_item_select.h index d64e7eae..18390b1d 100644 --- a/include/d/lyt/meter/d_lyt_meter_item_select.h +++ b/include/d/lyt/meter/d_lyt_meter_item_select.h @@ -213,8 +213,8 @@ private: void fn_800EF8C0(bool); bool isWheelBlockedByCurrentAction(); void setBtnText(s32); - bool fn_800F01B0(s32) const; - bool fn_800F01E0(s32) const; + bool hasBWheelItem(s32) const; + bool isBocoburinLocked(s32) const; bool isSlotBocoburinLocked(s32); void fn_800F0310(); bool fn_800F0030() const; diff --git a/include/sized_string.h b/include/sized_string.h index 3d67e74a..2bcec9b9 100644 --- a/include/sized_string.h +++ b/include/sized_string.h @@ -104,7 +104,7 @@ struct SizedString { template struct SizedWString { SizedWString() { - mChars[0] = '\0'; + mChars[0] = L'\0'; } wchar_t mChars[Size]; @@ -117,6 +117,10 @@ struct SizedWString { return mChars; } + void empty() { + mChars[0] = L'\0'; + } + int sprintf(const wchar_t *fmt, ...) { va_list args; va_start(args, fmt); diff --git a/src/d/lyt/d2d.cpp b/src/d/lyt/d2d.cpp index 8712443f..062f6234 100644 --- a/src/d/lyt/d2d.cpp +++ b/src/d/lyt/d2d.cpp @@ -500,23 +500,23 @@ void LytBase_c::setProperties(nw4r::lyt::Pane *pane, f32 posX, f32 posY, f32 sca textBox->SetCharSpace(textBox->GetCharSpace() + dLyt_HIO_c::getFn800B2020() + f6); textBox->SetLineSpace(textBox->GetLineSpace() + dLyt_HIO_c::getFn800B2000() + f4); - fn_800AB930(textBox); + loadText(textBox); } -bool LytBase_c::fn_800AB930(dTextBox_c *box) { - return fn_800AB9A0(box, -1); +bool LytBase_c::loadText(dTextBox_c *box) { + return loadTextVariant(box, -1); } -bool LytBase_c::fn_800AB940(const char *name, int arg) { +bool LytBase_c::loadTextVariant(const char *name, int arg) { dTextBox_c *box = getTextBox(name); if (box == nullptr) { return false; } - return fn_800AB9A0(box, arg); + return loadTextVariant(box, arg); } -bool LytBase_c::fn_800AB9A0(dTextBox_c *textbox, int arg) { +bool LytBase_c::loadTextVariant(dTextBox_c *textbox, int arg) { if (getMsbtInfo() == nullptr) { return false; } @@ -551,21 +551,21 @@ bool LytBase_c::fn_800AB9A0(dTextBox_c *textbox, int arg) { if (ty == 1) { dTextBox_c *otherBox = getTextBox(list->GetString()); if (otherBox != nullptr) { - return fn_800ABB80(textbox, otherBox, arg); + return loadTextVariantCopy(textbox, otherBox, arg); } } else { - return fn_800ABCE0(list, textbox, textbox, arg); + return setText(list, textbox, textbox, arg); } return false; } -bool LytBase_c::fn_800ABB80(dTextBox_c *textbox1, dTextBox_c *textbox2, int arg) { - u16 num = textbox2->GetExtUserDataNum(); +bool LytBase_c::loadTextVariantCopy(dTextBox_c *targetTextBox, dTextBox_c *sourceTextBox, int arg) { + u16 num = sourceTextBox->GetExtUserDataNum(); if (num == 0) { return false; } u32 found = 0; - const nw4r::lyt::res::ExtUserData *list = textbox2->GetExtUserData(); + const nw4r::lyt::res::ExtUserData *list = sourceTextBox->GetExtUserData(); for (int i = 0; i < num; i++) { SizedString<0x40> userDatName; userDatName = list->GetName(); @@ -579,17 +579,17 @@ bool LytBase_c::fn_800ABB80(dTextBox_c *textbox1, dTextBox_c *textbox2, int arg) if (found != 1) { return false; } - return fn_800ABCE0(list, textbox1, textbox2, arg); + return setText(list, targetTextBox, sourceTextBox, arg); } -bool LytBase_c::fn_800ABCE0( - const nw4r::lyt::res::ExtUserData *userDatum, dTextBox_c *textbox1, dTextBox_c *textbox2, int arg +bool LytBase_c::setText( + const nw4r::lyt::res::ExtUserData *userDatum, dTextBox_c *targetTextBox, dTextBox_c *sourceTextBox, int arg ) { s32 userDatInt = userDatum->GetInt(); SizedString<0x40> str1; SizedString<0x40> str2; - str1 = textbox2->GetName(); + str1 = sourceTextBox->GetName(); if (userDatInt != 0) { userDatInt = 0; if (arg != -1) { @@ -605,7 +605,7 @@ bool LytBase_c::fn_800ABCE0( return false; } - textbox1->setTextWithGlobalTextProcessor(dMessage_c::formatText(text)); + targetTextBox->setTextWithGlobalTextProcessor(dMessage_c::formatText(text)); return true; } @@ -652,13 +652,13 @@ bool LytBase_c::fn_800ABE50(dTextBox_c *textbox, wchar_t *destBuf, u32 maxLen) { return false; } -bool LytBase_c::fn_800AC040(dTextBox_c *textbox1, dTextBox_c *textbox2, wchar_t *destBuf, u32 maxLen) { - u16 num = textbox2->GetExtUserDataNum(); +bool LytBase_c::fn_800AC040(dTextBox_c *targetTextBox, dTextBox_c *sourceTextBox, wchar_t *destBuf, u32 maxLen) { + u16 num = sourceTextBox->GetExtUserDataNum(); if (num == 0) { return false; } u32 found = 0; - const nw4r::lyt::res::ExtUserData *list = textbox2->GetExtUserData(); + const nw4r::lyt::res::ExtUserData *list = sourceTextBox->GetExtUserData(); for (int i = 0; i < num; i++) { SizedString<0x40> userDatName; userDatName = list->GetName(); @@ -672,24 +672,24 @@ bool LytBase_c::fn_800AC040(dTextBox_c *textbox1, dTextBox_c *textbox2, wchar_t if (found != 1) { return false; } - return fn_800AC1AC(list, textbox1, textbox2, destBuf, maxLen); + return fn_800AC1AC(list, targetTextBox, sourceTextBox, destBuf, maxLen); } bool LytBase_c::fn_800AC1AC( - const nw4r::lyt::res::ExtUserData *userDatum, dTextBox_c *textbox1, dTextBox_c *textbox2, wchar_t *destBuf, u32 maxLen + const nw4r::lyt::res::ExtUserData *userDatum, dTextBox_c *targetTextBox, dTextBox_c *sourceTextBox, wchar_t *destBuf, u32 maxLen ) { s32 userDatInt = userDatum->GetInt(); SizedString<0x40> str1; SizedString<0x40> str2; - str1 = textbox2->GetName(); + str1 = sourceTextBox->GetName(); if (userDatInt != 0) { SizedString<0x40> &fmt = str2; fmt.sprintf(":%02d", 0); str1.append(fmt); } - textbox1->setMessageWithGlobalTextProcessorAndMsbtInfo(getMsbtInfo(), str1, destBuf, maxLen); + targetTextBox->setMessageWithGlobalTextProcessorAndMsbtInfo(getMsbtInfo(), str1, destBuf, maxLen); return true; } diff --git a/src/d/lyt/d_lyt_pause_disp_00.cpp b/src/d/lyt/d_lyt_pause_disp_00.cpp index 43c176cd..cb0f0e25 100644 --- a/src/d/lyt/d_lyt_pause_disp_00.cpp +++ b/src/d/lyt/d_lyt_pause_disp_00.cpp @@ -1,7 +1,26 @@ #include "d/lyt/d_lyt_pause_disp_00.h" +#include "d/a/d_a_item.h" +#include "d/a/d_a_itembase.h" +#include "d/a/d_a_player.h" +#include "d/d_cs_base.h" +#include "d/d_pad_nav.h" +#include "d/d_rumble.h" +#include "d/flag/itemflag_manager.h" +#include "d/flag/storyflag_manager.h" +#include "d/lyt/d2d.h" +#include "d/lyt/d_lyt_common_icon_item_maps.h" +#include "d/lyt/d_lyt_control_game.h" +#include "d/lyt/d_lyt_pause.h" +#include "d/lyt/d_lyt_util_items.h" +#include "d/lyt/d_textbox.h" +#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 "nw4r/lyt/lyt_group.h" - +#include "nw4r/math/math_types.h" +#include "sized_string.h" +#include "toBeSorted/counters/counter.h" STATE_DEFINE(dLytPauseDisp00_c, None); STATE_DEFINE(dLytPauseDisp00_c, In); @@ -11,46 +30,1629 @@ STATE_DEFINE(dLytPauseDisp00_c, Ring); STATE_DEFINE(dLytPauseDisp00_c, GetDemo); STATE_DEFINE(dLytPauseDisp00_c, Out); -extern d2d::LytBrlanMapping S_MAPPINGS[]; -extern "C" char lbl_804E8898[]; +static const d2d::LytBrlanMapping brlanMap[] = { + { "pause_00_in.brlan", "G_inOut_00"}, + { "pause_00_have.brlan", "G_sekiban_00"}, + { "pause_00_have.brlan", "G_dauzingA_00"}, + { "pause_00_have.brlan", "G_dauzingB_00"}, + { "pause_00_have.brlan", "G_dauzingC_00"}, + { "pause_00_have.brlan", "G_dauzingD_00"}, + { "pause_00_have.brlan", "G_dauzingE_00"}, + { "pause_00_have.brlan", "G_dauzingF_00"}, + { "pause_00_have.brlan", "G_dauzingG_00"}, + { "pause_00_have.brlan", "G_dauzingH_00"}, + { "pause_00_have.brlan", "G_itemA_00"}, + { "pause_00_have.brlan", "G_itemB_00"}, + { "pause_00_have.brlan", "G_itemC_00"}, + { "pause_00_have.brlan", "G_itemD_00"}, + { "pause_00_have.brlan", "G_itemE_00"}, + { "pause_00_have.brlan", "G_itemF_00"}, + { "pause_00_have.brlan", "G_itemG_00"}, + { "pause_00_have.brlan", "G_itemH_00"}, + { "pause_00_have.brlan", "G_poachA_00"}, + { "pause_00_have.brlan", "G_poachB_00"}, + { "pause_00_have.brlan", "G_poachC_00"}, + { "pause_00_have.brlan", "G_poachD_00"}, + { "pause_00_have.brlan", "G_poachE_00"}, + { "pause_00_have.brlan", "G_poachF_00"}, + { "pause_00_have.brlan", "G_poachG_00"}, + { "pause_00_have.brlan", "G_poachH_00"}, + { "pause_00_have.brlan", "G_heart_00"}, + { "pause_00_have.brlan", "G_saifu_00"}, + { "pause_00_have.brlan", "G_parashoru_00"}, + { "pause_00_have.brlan", "G_mogura_00"}, + { "pause_00_have.brlan", "G_uroko_00"}, + { "pause_00_have.brlan", "G_ring_00"}, + { "pause_00_have.brlan", "G_muse_00"}, + { "pause_00_have.brlan", "G_muse_01"}, + { "pause_00_have.brlan", "G_muse_02"}, + { "pause_00_have.brlan", "G_muse_03"}, + { "pause_00_have.brlan", "G_muse_04"}, + { "pause_00_have.brlan", "G_muse_05"}, + { "pause_00_have.brlan", "G_muse_06"}, + { "pause_00_have.brlan", "G_muse_07"}, + { "pause_00_have.brlan", "G_musicSet_00"}, + { "pause_00_have.brlan", "G_harp_00"}, + { "pause_00_have.brlan", "G_UITypeBtn_00"}, + { "pause_00_have.brlan", "G_miToTane_00"}, + { "pause_00_have.brlan", "G_shiren_00"}, + { "pause_00_have.brlan", "G_force_00"}, + { "pause_00_have.brlan", "G_force_01"}, + { "pause_00_have.brlan", "G_force_02"}, + { "pause_00_have.brlan", "G_forceBg_00"}, + { "pause_00_onOff.brlan", "G_sekiban_00"}, + { "pause_00_onOff.brlan", "G_heart_00"}, + { "pause_00_onOff.brlan", "G_saifu_00"}, + { "pause_00_onOff.brlan", "G_parashoru_00"}, + { "pause_00_onOff.brlan", "G_mogura_00"}, + { "pause_00_onOff.brlan", "G_uroko_00"}, + { "pause_00_onOff.brlan", "G_ring_00"}, + { "pause_00_onOff.brlan", "G_muse_00"}, + { "pause_00_onOff.brlan", "G_muse_01"}, + { "pause_00_onOff.brlan", "G_muse_02"}, + { "pause_00_onOff.brlan", "G_muse_03"}, + { "pause_00_onOff.brlan", "G_muse_04"}, + { "pause_00_onOff.brlan", "G_muse_05"}, + { "pause_00_onOff.brlan", "G_muse_06"}, + { "pause_00_onOff.brlan", "G_muse_07"}, + { "pause_00_onOff.brlan", "G_harp_00"}, + { "pause_00_onOff.brlan", "G_sword_00"}, + { "pause_00_onOff.brlan", "G_dauzingA_00"}, + { "pause_00_onOff.brlan", "G_dauzingB_00"}, + { "pause_00_onOff.brlan", "G_dauzingC_00"}, + { "pause_00_onOff.brlan", "G_dauzingD_00"}, + { "pause_00_onOff.brlan", "G_dauzingE_00"}, + { "pause_00_onOff.brlan", "G_dauzingF_00"}, + { "pause_00_onOff.brlan", "G_dauzingG_00"}, + { "pause_00_onOff.brlan", "G_dauzingH_00"}, + { "pause_00_onOff.brlan", "G_itemA_00"}, + { "pause_00_onOff.brlan", "G_itemB_00"}, + { "pause_00_onOff.brlan", "G_itemC_00"}, + { "pause_00_onOff.brlan", "G_itemD_00"}, + { "pause_00_onOff.brlan", "G_itemE_00"}, + { "pause_00_onOff.brlan", "G_itemF_00"}, + { "pause_00_onOff.brlan", "G_itemG_00"}, + { "pause_00_onOff.brlan", "G_itemH_00"}, + { "pause_00_onOff.brlan", "G_poachA_00"}, + { "pause_00_onOff.brlan", "G_poachB_00"}, + { "pause_00_onOff.brlan", "G_poachC_00"}, + { "pause_00_onOff.brlan", "G_poachD_00"}, + { "pause_00_onOff.brlan", "G_poachE_00"}, + { "pause_00_onOff.brlan", "G_poachF_00"}, + { "pause_00_onOff.brlan", "G_poachG_00"}, + { "pause_00_onOff.brlan", "G_poachH_00"}, + { "pause_00_onOff.brlan", "G_tryForce_00"}, + { "pause_00_onOff.brlan", "G_shiren_00"}, + { "pause_00_onOff.brlan", "G_miToTane_00"}, + { "pause_00_onOff.brlan", "G_text_00"}, + { "pause_00_onOff.brlan", "G_calibBtn_00"}, + { "pause_00_bocoburin.brlan", "G_paraBoco_00"}, + { "pause_00_bocoburin.brlan", "G_moguraBoco_00"}, + { "pause_00_bocoburin.brlan", "G_urokoBoco_00"}, + { "pause_00_bocoburin.brlan", "G_harpBoco_00"}, + { "pause_00_bocoburin.brlan", "G_swordBoco_00"}, + { "pause_00_itemArrow.brlan", "G_itemArrow_00"}, + { "pause_00_toPoach.brlan", "G_ringChange_00"}, + { "pause_00_toSword.brlan", "G_ringChange_00"}, + { "pause_00_toItem.brlan", "G_ringChange_00"}, + { "pause_00_sword.brlan", "G_sword_00"}, + { "pause_00_sekiban.brlan", "G_sekiban_00"}, + { "pause_00_heart.brlan", "G_heart_00"}, + { "pause_00_saifu.brlan", "G_saifu_00"}, + { "pause_00_mogura.brlan", "G_mogura_00"}, + { "pause_00_out.brlan", "G_inOut_00"}, + { "pause_00_onOff.brlan", "G_UITypeBtn_00"}, + { "pause_00_btnDecide.brlan", "G_UITypeBtn_00"}, + { "pause_00_btnDecide.brlan", "G_calibBtn_00"}, + { "pause_00_UIType.brlan", "G_UIType_00"}, + { "pause_00_call.brlan", "G_UITypeCall_00"}, + { "pause_00_miToTane.brlan", "G_miToTane_00"}, + { "pause_00_loop.brlan", "G_loop_00"}, + { "pause_00_scrollRIn.brlan", "G_scroll_00"}, + {"pause_00_scrollROut.brlan", "G_scroll_00"}, + { "pause_00_scrollLIn.brlan", "G_scroll_00"}, + {"pause_00_scrollLOut.brlan", "G_scroll_00"}, + { "pause_00_dauzType.brlan", "G_dauzType_00"}, + { "pause_00_off.brlan", "G_leftTab_00"}, + { "pause_00_off.brlan", "G_centerTab_00"}, + { "pause_00_off.brlan", "G_rightTab_00"}, + { "pause_00_tabV.brlan", "G_tabV_00"}, +}; -extern const char *B_LIST[]; +#define PAUSE_DISP_00_ANIM_IN 0 +#define PAUSE_DISP_00_ANIM_HAVE_TABLET 1 +#define PAUSE_DISP_00_ANIM_HAVE_DOWSING_OFFSET 2 +#define PAUSE_DISP_00_ANIM_HAVE_ITEM_OFFSET 10 +#define PAUSE_DISP_00_ANIM_HAVE_POUCH_OFFSET 18 +#define PAUSE_DISP_00_ANIM_HAVE_HEART 26 +#define PAUSE_DISP_00_ANIM_HAVE_POUCH 27 +#define PAUSE_DISP_00_ANIM_HAVE_PARACHUTE 28 +#define PAUSE_DISP_00_ANIM_HAVE_MITTS 29 +#define PAUSE_DISP_00_ANIM_HAVE_SCALE 30 +#define PAUSE_DISP_00_ANIM_HAVE_RING 31 +#define PAUSE_DISP_00_ANIM_HAVE_MUSE_OFFSET 32 +#define PAUSE_DISP_00_ANIM_HAVE_MUSE_PART_OFFSET 36 +#define PAUSE_DISP_00_ANIM_HAVE_MUSE_07 39 +#define PAUSE_DISP_00_ANIM_HAVE_MUSIC_SET 40 +#define PAUSE_DISP_00_ANIM_HAVE_HARP 41 +#define PAUSE_DISP_00_ANIM_HAVE_UITYPE_BTN 42 +#define PAUSE_DISP_00_ANIM_HAVE_MI_TO_TANE 43 +#define PAUSE_DISP_00_ANIM_HAVE_SHIREN 44 +#define PAUSE_DISP_00_ANIM_HAVE_FORCE_OFFSET 45 +#define PAUSE_DISP_00_ANIM_HAVE_FORCE_BG 48 +#define PAUSE_DISP_00_ANIM_ONOFF_TABLET 49 +#define PAUSE_DISP_00_ANIM_ONOFF_HEART 50 +#define PAUSE_DISP_00_ANIM_ONOFF_POUCH 51 +#define PAUSE_DISP_00_ANIM_ONOFF_PARACHUTE 52 +#define PAUSE_DISP_00_ANIM_ONOFF_MITTS 53 +#define PAUSE_DISP_00_ANIM_ONOFF_SCALE 54 +#define PAUSE_DISP_00_ANIM_ONOFF_RING 55 +#define PAUSE_DISP_00_ANIM_ONOFF_MUSE_OFFSET 56 +#define PAUSE_DISP_00_ANIM_ONOFF_HARP 64 +#define PAUSE_DISP_00_ANIM_ONOFF_SWORD 65 +#define PAUSE_DISP_00_ANIM_ONOFF_DOWSING_OFFSET 66 +#define PAUSE_DISP_00_ANIM_ONOFF_ITEM_OFFSET 74 +#define PAUSE_DISP_00_ANIM_ONOFF_POUCH_OFFSET 82 +#define PAUSE_DISP_00_ANIM_ONOFF_TRIFORCE 90 +#define PAUSE_DISP_00_ANIM_ONOFF_SHIREN 91 +#define PAUSE_DISP_00_ANIM_ONOFF_MI_TO_TANE 92 +#define PAUSE_DISP_00_ANIM_ONOFF_TEXT 93 +#define PAUSE_DISP_00_ANIM_ONOFF_CALIB_BTN 94 +#define PAUSE_DISP_00_ANIM_BOCO_PARACHUTE 95 +#define PAUSE_DISP_00_ANIM_BOCO_MITTS 96 +#define PAUSE_DISP_00_ANIM_BOCO_SCALE 97 +#define PAUSE_DISP_00_ANIM_BOCO_HARP 98 +#define PAUSE_DISP_00_ANIM_BOCO_SWORD 99 +#define PAUSE_DISP_00_ANIM_ITEM_ARROW 100 +#define PAUSE_DISP_00_ANIM_RING_TO_POUCH 101 +#define PAUSE_DISP_00_ANIM_RING_TO_SWORD 102 +#define PAUSE_DISP_00_ANIM_RING_TO_ITEM 103 +#define PAUSE_DISP_00_ANIM_SWORD 104 +#define PAUSE_DISP_00_ANIM_TABLETS 105 +#define PAUSE_DISP_00_ANIM_HEART 106 +#define PAUSE_DISP_00_ANIM_POUCH 107 +#define PAUSE_DISP_00_ANIM_MITTS 108 +#define PAUSE_DISP_00_ANIM_OUT 109 +#define PAUSE_DISP_00_ANIM_UI_TYPE_BTN 110 +#define PAUSE_DISP_00_ANIM_DECIDE_UI_TYPE_BTN 111 +#define PAUSE_DISP_00_ANIM_DECIDE_CALIB_BTN 112 +#define PAUSE_DISP_00_ANIM_UI_TYPE 113 +#define PAUSE_DISP_00_ANIM_CALL 114 +#define PAUSE_DISP_00_ANIM_MI_TO_TANE 115 +#define PAUSE_DISP_00_ANIM_LOOP 116 +#define PAUSE_DISP_00_ANIM_SCROLL_R_IN 117 +#define PAUSE_DISP_00_ANIM_SCROLL_R_OUT 118 +#define PAUSE_DISP_00_ANIM_SCROLL_L_IN 119 +#define PAUSE_DISP_00_ANIM_SCROLL_L_OUT 120 +#define PAUSE_DISP_00_ANIM_DOWSING_TYPE 121 +#define PAUSE_DISP_00_ANIM_OFF_LEFT_TAB 122 +#define PAUSE_DISP_00_ANIM_OFF_CENTER_TAB 123 +#define PAUSE_DISP_00_ANIM_OFF_RIGHT_TAB 124 +#define PAUSE_DISP_00_ANIM_TAB_V 125 -dLytPauseDisp00_c::dLytPauseDisp00_c() : mStateMgr(*this, sStateID::null) {} +#define PAUSE_DISP_00_NUM_ANIMS 126 -void dLytPauseDisp00_c::init() { - mLytBase.build("pause_00.brlyt", nullptr); - mLytBase.setPriority(0x86); +#define PAUSE_DISP_00_ANIM_RING_BASE PAUSE_DISP_00_ANIM_RING_TO_POUCH +#define PAUSE_DISP_00_ANIM_ITEM_OFFSET PAUSE_DISP_00_ANIM_ONOFF_DOWSING_OFFSET - for (int i = 0; i < 0x7E; i++) { - field_0x00D0[i].init(S_MAPPINGS[i].mFile, nullptr, mLytBase.getLayout(), S_MAPPINGS[i].mName); +#define PAUSE_DISP_00_NUM_SUBPANES 24 + +extern "C" u8 lbl_804E8898[]; + +static const char *sGroupName = "G_ref_00"; + +static const char *sBoundingNames[] = { + "B_sekiban_00", "B_heart_00", "B_saifu_00", "B_parashoru_00", "B_mogura_00", "B_uroko_00", + "B_ring_00", "B_muse_00", "B_muse_01", "B_muse_02", "B_muse_03", "B_muse_04", + "B_muse_05", "B_muse_06", "B_muse_07", "B_harp_00", "B_sword_00", "B_swordFire_00", + "B_swordFire_01", "B_swordFire_02", "B_shiren_00", "B_ringA_00", "B_ringB_00", "B_ringC_00", + "B_ringD_00", "B_ringE_00", "B_ringF_00", "B_ringG_00", "B_ringH_00", "B_UIType_00", + "B_calibBtn_00", "B_calibBtn_00", "B_calibBtn_00", "B_leftTab_00", "B_centerTab_00", "B_rightTab_00", + "B_calibBtn_00", +}; + +#define PAUSE_DISP_00_BOUNDING_TABLETS 0 +#define PAUSE_DISP_00_BOUNDING_HEART 1 +#define PAUSE_DISP_00_BOUNDING_POUCH 2 +#define PAUSE_DISP_00_BOUNDING_PARACHUTE 3 +#define PAUSE_DISP_00_BOUNDING_MITTS 4 +#define PAUSE_DISP_00_BOUNDING_SCALE 5 +#define PAUSE_DISP_00_BOUNDING_RING 6 +#define PAUSE_DISP_00_BOUNDING_MUSE_OFFSET 7 +#define PAUSE_DISP_00_BOUNDING_MUSE_07 14 +#define PAUSE_DISP_00_BOUNDING_HARP 15 +#define PAUSE_DISP_00_BOUNDING_SWORD 16 +#define PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET 17 +#define PAUSE_DISP_00_BOUNDING_SHIREN 20 +#define PAUSE_DISP_00_BOUNDING_RING_OFFSET 21 +#define PAUSE_DISP_00_BOUNDING_UI_TYPE 29 +#define PAUSE_DISP_00_BOUNDING_CALIB_BTN_0 30 +#define PAUSE_DISP_00_BOUNDING_ARROW_LEFT 31 +#define PAUSE_DISP_00_BOUNDING_ARROW_RIGHT 32 +#define PAUSE_DISP_00_BOUNDING_LEFT_TAB 33 +#define PAUSE_DISP_00_BOUNDING_CENTER_TAB 34 +#define PAUSE_DISP_00_BOUNDING_RIGHT_TAB 35 +#define PAUSE_DISP_00_BOUNDING_CALIB_BTN_3 36 + +#define PAUSE_DISP_00_BOUNDING_ARROW_OFFSET PAUSE_DISP_00_BOUNDING_ARROW_LEFT + +#define PAUSE_DISP_00_NUM_BOUNDINGS 37 + +// TODO - constants to maybe move elsewhere +#define PAUSE_DISP_00_NUM_SONG_PARTS 3 + +#define PAUSE_DISP_00_ICONS_B_WHEEL_OFFSET 0 +#define PAUSE_DISP_00_ICONS_DOWSING_OFFSET 8 +#define PAUSE_DISP_00_ICONS_POUCH_OFFSET 16 +#define PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL 8 + +dLytPauseDisp00_c::dLytPauseDisp00_c() : mStateMgr(*this) {} + +bool dLytPauseDisp00_c::build() { + dLytPauseMgr_c *pauseMgr = dLytPauseMgr_c::GetInstance(); + d2d::ResAccIf_c *resAcc = pauseMgr->getResAcc1(); + mLyt.setResAcc(resAcc); + mLyt.build("pause_00.brlyt", nullptr); + mLyt.setPriority(0x86); + + for (int i = 0; i < PAUSE_DISP_00_NUM_ANIMS; i++) { + mAnm[i].init(brlanMap[i].mFile, resAcc, mLyt.getLayout(), brlanMap[i].mName); } - for (int i = 0; i < 0x18; i++) { - field_0x2050[i].build(nullptr, lbl_804E8898[i]); - mSubpanes.PushBack(&field_0xE11C[i]); + resAcc = pauseMgr->getResAcc2(); + + for (int i = 0; i < PAUSE_DISP_00_NUM_SUBPANES; i++) { + mIcons[i].build(resAcc, lbl_804E8898[i]); + mSubpanes[i].mpLytPane = &mIcons[i]; + mSubpaneList.PushBack(&mSubpanes[i]); } - if (mLytBase.getLayout()->GetGroupContainer() != nullptr) { - nw4r::lyt::Group *group = mLytBase.getLayout()->GetGroupContainer()->FindGroupByName("G_ref_00"); + if (mLyt.getLayout()->GetGroupContainer() != nullptr) { + nw4r::lyt::Group *group = mLyt.getLayout()->GetGroupContainer()->FindGroupByName(sGroupName); if (group != nullptr) { - d2d::dSubPane::linkMeters(group, &mSubpanes); + d2d::dSubPane::linkMeters(group, &mSubpaneList); } } - field_0xE29C.init(mLytBase.getLayout()->GetRootPane(), 1, 0, 0); - dCsMgr_c::GetInstance()->registCursorTarget(&field_0xE29C); - for (int i = 0; i < 0x25; i++) { - if (i != 0x1F && i != 0x20) { - nw4r::lyt::Bounding *b = mLytBase.findBounding(B_LIST[i]); - // TODO + mCsHitCheck.init(mLyt.getLayout()->GetRootPane(), 1, 0, 0); + dCsMgr_c::GetInstance()->registCursorTarget(&mCsHitCheck); + for (int i = 0; i < PAUSE_DISP_00_NUM_BOUNDINGS; i++) { + if (i != PAUSE_DISP_00_BOUNDING_ARROW_LEFT && i != PAUSE_DISP_00_BOUNDING_ARROW_RIGHT) { + mpBoundings[i] = mLyt.findBounding(sBoundingNames[i]); + mpBoundings[i]->SetVisible(true); + } + } + + mpBoundings[PAUSE_DISP_00_BOUNDING_ARROW_LEFT] = pauseMgr->getArrowBounding(0); + mpBoundings[PAUSE_DISP_00_BOUNDING_ARROW_RIGHT] = pauseMgr->getArrowBounding(1); + + u8 songLifetreeStatus = getSongLifeTreeStatus(); + if (songLifetreeStatus == SONG_LIFETREE_HAS_SOTH) { + setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSE_07, 1.0f); + setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSIC_SET, 0.0f); + } else if (songLifetreeStatus != SONG_LIFETREE_NONE) { + setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSIC_SET, 1.0f); + for (int i = 0; i < PAUSE_DISP_00_NUM_SONG_PARTS; i++) { + setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSE_PART_OFFSET + i, 1.0f); + } + } else { + setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSE_07, 0.0f); + setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSIC_SET, 0.0f); + } + setAnm(PAUSE_DISP_00_ANIM_IN, 0.0f); + mAnm[PAUSE_DISP_00_ANIM_IN].setFrame(mAnm[PAUSE_DISP_00_ANIM_IN].getAnimDuration()); + + mLyt.calc(); + + stopAnm(PAUSE_DISP_00_ANIM_HAVE_MUSE_07); + stopAnm(PAUSE_DISP_00_ANIM_HAVE_MUSIC_SET); + stopAnm(PAUSE_DISP_00_ANIM_IN); + for (int i = 0; i < PAUSE_DISP_00_NUM_SONG_PARTS; i++) { + stopAnm(PAUSE_DISP_00_ANIM_HAVE_MUSE_PART_OFFSET + i); + } + + mStateMgr.changeState(StateID_None); + + return true; +} + +bool dLytPauseDisp00_c::remove() { + dCsMgr_c::GetInstance()->unregistCursorTarget(&mCsHitCheck); + for (d2d::SubPaneList::Iterator it = mSubpaneList.GetBeginIter(); it != mSubpaneList.GetEndIter(); ++it) { + if (!it->mpLytPane->LytMeter0x24()) { + continue; + } + // @bug checking nullptr after invoking virtual function on it + d2d::dSubPane *subPane = it->mpLytPane; + if (subPane != nullptr) { + nw4r::lyt::Pane *parent = subPane->getPane()->GetParent(); + parent->RemoveChild(subPane->getPane()); + } + } + for (int i = 0; i < PAUSE_DISP_00_NUM_SUBPANES; i++) { + mSubpanes[i].mpLytPane->remove(); + } + + mLyt.unbindAnims(); + + for (int i = 0; i < PAUSE_DISP_00_NUM_ANIMS; i++) { + mAnm[i].remove(); + } + + return true; +} + +bool dLytPauseDisp00_c::execute() { + field_0xE371 = false; + mStateMgr.executeState(); + executeCall(); + for (int i = 0; i < PAUSE_DISP_00_NUM_SUBPANES; i++) { + mSubpanes[i].mpLytPane->execute(); + } + mLyt.calc(); + mCsHitCheck.resetCachedHitboxes(); + mCsHitCheck.execute(); + if (!mStateMgr.getStateID()->isEqual(StateID_None)) { + mAnm[PAUSE_DISP_00_ANIM_LOOP].play(); + } + + return true; +} + +bool dLytPauseDisp00_c::draw() { + if (mIsVisible == true) { + mLyt.addToDrawList(); + } + return true; +} + +void dLytPauseDisp00_c::initializeState_None() { + for (int i = 0; i < PAUSE_DISP_00_NUM_ANIMS; i++) { + mAnm[i].unbind(); + } + + field_0xE36E = false; + mInRequest = false; + mOutRequest = false; + mIsVisible = false; + field_0xE371 = false; + mStopCallRequest = false; + + mCallTimerMaybe = 0; + mStep = 0; + mPrevNavTarget = 0; + mCurrentNavTarget = 0; + mGetDemoTimer = 0; + + for (int i = 0; i < PAUSE_DISP_00_NUM_SUBPANES; i++) { + mIcons[i].reset(); + mIcons[i].setVisible(false); + } + + for (int i = 0; i < PAUSE_DISP_00_NUM_BOUNDINGS; i++) { + mpBoundings[i]->SetVisible(false); + } + + mpBoundings[PAUSE_DISP_00_BOUNDING_ARROW_LEFT]->SetVisible(true); + mpBoundings[PAUSE_DISP_00_BOUNDING_ARROW_RIGHT]->SetVisible(true); + + mLyt.findPane("N_itemArrow_00")->SetVisible(false); + setAnm(PAUSE_DISP_00_ANIM_ITEM_ARROW, 0.0f); + setAnm(PAUSE_DISP_00_ANIM_RING_BASE + dLytControlGame_c::getInstance()->getPauseDisp00Tab(), 0.0f); + + StoryflagManager *storyFlagmanager = StoryflagManager::sInstance; + + // Check which tabs are unlocked + if (storyFlagmanager->getFlag(789)) { + mpBoundings[PAUSE_DISP_00_BOUNDING_LEFT_TAB]->SetVisible(true); + } + + if (storyFlagmanager->getFlag(30)) { + mpBoundings[PAUSE_DISP_00_BOUNDING_CENTER_TAB]->SetVisible(true); + } + + if (storyFlagmanager->getFlag(58)) { + mpBoundings[PAUSE_DISP_00_BOUNDING_RIGHT_TAB]->SetVisible(true); + } + + setAnm(PAUSE_DISP_00_ANIM_LOOP, 0.0f); + mSelectGuideRequest = false; + mSelectToggleRequest = false; + field_0xE376 = false; + mRingToggleRequest = false; +} +void dLytPauseDisp00_c::executeState_None() { + if (mInRequest == true) { + mInRequest = false; + mStateMgr.changeState(StateID_In); + } +} +void dLytPauseDisp00_c::finalizeState_None() { + loadRingText(RING_TEXT_INITIAL_TAB); +} + +void dLytPauseDisp00_c::initializeState_In() { + if (mDoScrollAnim == true) { + dLytPauseMgr_c *pause = dLytPauseMgr_c::GetInstance(); + setAnm(PAUSE_DISP_00_ANIM_IN, 0.0f); + mAnm[PAUSE_DISP_00_ANIM_IN].setFrame(mAnm[PAUSE_DISP_00_ANIM_IN].getAnimDuration()); + if (pause->getField_0x0831()) { + setAnm(PAUSE_DISP_00_ANIM_SCROLL_L_IN, 0.0f); + } else { + setAnm(PAUSE_DISP_00_ANIM_SCROLL_R_IN, 0.0f); + } + + if (pause->getField_0x0840()) { + if (pause->getField_0x0831()) { + mPrevNavTarget = PAUSE_DISP_00_BOUNDING_ARROW_LEFT + 1; + } else { + mPrevNavTarget = PAUSE_DISP_00_BOUNDING_ARROW_RIGHT + 1; + } + } + } else { + setAnm(PAUSE_DISP_00_ANIM_IN, 0.0f); + } + + for (int i = PAUSE_DISP_00_ANIM_ONOFF_TABLET; i < PAUSE_DISP_00_ANIM_ONOFF_CALIB_BTN + 1; i++) { + setAnm(i, 0.0f); + } + mAnm[PAUSE_DISP_00_ANIM_ONOFF_TEXT].setToEnd(); + + setupDisp(); + setupRingIcons(dLytControlGame_c::getInstance()->getPauseDisp00Tab()); + setAnm(PAUSE_DISP_00_ANIM_UI_TYPE_BTN, 0.0f); + + u8 mode = dLytMeter_c::GetMain()->getUiMode(); + setAnm(PAUSE_DISP_00_ANIM_UI_TYPE, mode); + StoryflagManager *storyflagManager = StoryflagManager::sInstance; + if (storyflagManager->getFlag(583)) { + setAnm(PAUSE_DISP_00_ANIM_DOWSING_TYPE, 1.0f); + } else { + setAnm(PAUSE_DISP_00_ANIM_DOWSING_TYPE, 0.0f); + } + + // Control tab visibility + f32 tabVFrame = 0.0f; + if (storyflagManager->getFlag(30)) { + tabVFrame = 1.0f; + } + if (storyflagManager->getFlag(789)) { + tabVFrame = 2.0f; + } + if (storyflagManager->getFlag(58)) { + tabVFrame = 3.0f; + } + + setAnm(PAUSE_DISP_00_ANIM_TAB_V, tabVFrame); + if (tabVFrame) { + mLyt.findPane("N_text_00")->SetVisible(true); + } else { + mLyt.findPane("N_text_00")->SetVisible(false); + } + + mIsVisible = true; +} +void dLytPauseDisp00_c::executeState_In() { + s32 anim = PAUSE_DISP_00_ANIM_IN; + if (mDoScrollAnim == true) { + dLytPauseMgr_c *pause = dLytPauseMgr_c::GetInstance(); + anim = pause->getField_0x0831() ? PAUSE_DISP_00_ANIM_SCROLL_L_IN : PAUSE_DISP_00_ANIM_SCROLL_R_IN; + } + + d2d::AnmGroup_c &anm = mAnm[anim]; + + if (anm.isEndReached() == true) { + if (dLytControlGame_c::getInstance()->getField_0x15C67()) { + mStateMgr.changeState(StateID_GetDemo); + } else { + mStateMgr.changeState(StateID_Wait); + } + } else { + anm.play(); + } +} +void dLytPauseDisp00_c::finalizeState_In() { + dLytPauseMgr_c *pause = dLytPauseMgr_c::GetInstance(); + if (pause->getField_0x0831()) { + stopAnm(PAUSE_DISP_00_ANIM_SCROLL_L_IN); + } else { + stopAnm(PAUSE_DISP_00_ANIM_SCROLL_R_IN); + } + + mDoScrollAnim = false; + if (pause->getField_0x083E()) { + if (!pause->getField_0x0832()) { + mCurrentNavTarget = PAUSE_DISP_00_BOUNDING_ARROW_RIGHT + 1; + } else { + mCurrentNavTarget = PAUSE_DISP_00_BOUNDING_ARROW_LEFT + 1; + } + mPrevNavTarget = mCurrentNavTarget; + } +} + +void dLytPauseDisp00_c::initializeState_Wait() { + mStep = 0; + field_0xE36E = true; +} +void dLytPauseDisp00_c::executeState_Wait() { + d2d::AnmGroup_c *anm; + if (field_0xE36E == true) { + field_0xE36E = false; + } + switch (mStep) { + case 0: { + if (mOutRequest == true) { + mOutRequest = false; + hideItemIcons(); + mStateMgr.changeState(StateID_Out); + return; + } + if (mSelectToggleRequest == true) { + mStateMgr.changeState(StateID_Select); + return; + } + if (mRingToggleRequest == true) { + mRingToggleRequest = false; + mAnm[PAUSE_DISP_00_ANIM_ONOFF_TEXT].setFrame(0.0f); + mStateMgr.changeState(StateID_Ring); + return; + } + + if (mSelectGuideRequest == true) { + mStep = 1; + setAnm(PAUSE_DISP_00_ANIM_DECIDE_UI_TYPE_BTN, 0.0f); + u8 uiMode = dLytMeter_c::GetMain()->getUiMode(); + f32 frame = uiMode + 1; + if (frame >= 3.0f) { + frame = 0.0f; + } + mAnm[PAUSE_DISP_00_ANIM_UI_TYPE].setFrame(frame); + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MENU_P1_SELECT_GUIDE); + } else if (mSelectMplsRequest == true) { + mStep = 2; + setAnm(PAUSE_DISP_00_ANIM_DECIDE_CALIB_BTN, 0.0f); + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MENU_P1_SELECT_MPLUS); + } else if (updateSelection() != 0) { + field_0xE371 = true; + } + break; + } + case 1: { + anm = &mAnm[PAUSE_DISP_00_ANIM_DECIDE_UI_TYPE_BTN]; + if (anm->isEndReached() == true) { + mStep = 0; + mSelectGuideRequest = false; + stopAnm(PAUSE_DISP_00_ANIM_DECIDE_UI_TYPE_BTN); + field_0xE36E = true; + } else { + anm->play(); + } + break; + } + case 2: { + anm = &mAnm[PAUSE_DISP_00_ANIM_DECIDE_CALIB_BTN]; + if (anm->isEndReached() == true) { + mStep = 0; + mSelectMplsRequest = false; + stopAnm(PAUSE_DISP_00_ANIM_DECIDE_CALIB_BTN); + field_0xE36E = true; + } else { + anm->play(); + } + break; + } + } + mAnm[PAUSE_DISP_00_ANIM_ONOFF_TEXT].play(); +} +void dLytPauseDisp00_c::finalizeState_Wait() {} + +void dLytPauseDisp00_c::initializeState_Select() { + static const s32 sTabOrder[] = { + 1, + 2, + 0, + }; + + static const s32 sTabAnim[] = { + PAUSE_DISP_00_ANIM_RING_TO_POUCH, + PAUSE_DISP_00_ANIM_RING_TO_SWORD, + PAUSE_DISP_00_ANIM_RING_TO_ITEM, + }; + + static const s32 sTabAnim2[] = { + PAUSE_DISP_00_ANIM_RING_TO_ITEM, + PAUSE_DISP_00_ANIM_RING_TO_POUCH, + PAUSE_DISP_00_ANIM_RING_TO_SWORD, + }; + + dLytPauseMgr_c *pause = dLytPauseMgr_c::GetInstance(); + mSelectToggleRequest = false; + mStep = 0; + if (pause->getField_0x0838() == true) { + mStep = 1; + stopAnm(PAUSE_DISP_00_ANIM_RING_TO_POUCH); + stopAnm(PAUSE_DISP_00_ANIM_RING_TO_SWORD); + stopAnm(PAUSE_DISP_00_ANIM_RING_TO_ITEM); + + // Of course dLytControlGame_c and dLytPause_c would use different IDs... + // TODO check if this ID mapping is consistently done + s32 controlGameTab = dLytControlGame_c::getInstance()->getPauseDisp00Tab(); + if (sTabOrder[controlGameTab] == pause->getCurrentDisp00Tab()) { + setAnm(sTabAnim[controlGameTab], 0.0f); + field_0xE376 = false; + } else { + stopAnm(controlGameTab + PAUSE_DISP_00_ANIM_RING_BASE); + // TODO - nonmatching + setAnm(sTabAnim2[controlGameTab], 0.0f); + mAnm[sTabAnim2[controlGameTab]].setToEnd(); + field_0xE376 = true; + } + + for (int i = PAUSE_DISP_00_ANIM_ITEM_OFFSET; + i < PAUSE_DISP_00_ANIM_ITEM_OFFSET + 3 * PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL; i++) { + mAnm[i].setFrame(0.0f); + } + } + mAnm[PAUSE_DISP_00_ANIM_ONOFF_TEXT].setFrame(0.0f); +} +void dLytPauseDisp00_c::executeState_Select() { + static const s32 sTabAnim2[] = { + PAUSE_DISP_00_ANIM_RING_TO_ITEM, + PAUSE_DISP_00_ANIM_RING_TO_POUCH, + PAUSE_DISP_00_ANIM_RING_TO_SWORD, + }; + + static const s32 sTabAnim3[] = { + PAUSE_DISP_00_ANIM_RING_TO_SWORD, + PAUSE_DISP_00_ANIM_RING_TO_ITEM, + PAUSE_DISP_00_ANIM_RING_TO_POUCH, + }; + + switch (mStep) { + case 0: { + if (mSelectToggleRequest == true) { + mStateMgr.changeState(StateID_Wait); + } + break; + } + case 1: { + // TODO Regswaps - maybe enum types, maybe int, maybe the order of these lines... + s32 controlGameTab = dLytControlGame_c::getInstance()->getPauseDisp00Tab(); + s32 lytPauseTab = dLytPauseMgr_c::GetInstance()->getCurrentDisp00Tab(); + d2d::AnmGroup_c *anm; + if (field_0xE376) { + anm = &mAnm[sTabAnim2[controlGameTab]]; + if (cM::isZero(anm->getFrame()) == true) { + setupRingIcons(lytPauseTab); + mStateMgr.changeState(StateID_Wait); + } + playBackwards(*anm); + } else { + anm = &mAnm[controlGameTab + PAUSE_DISP_00_ANIM_RING_BASE]; + if (anm->isEndReached() == true) { + stopAnm(controlGameTab + PAUSE_DISP_00_ANIM_RING_BASE); + setAnm(sTabAnim3[controlGameTab], 0.0f); + setupRingIcons(lytPauseTab); + mStateMgr.changeState(StateID_Wait); + } else { + anm->play(); + } + } + break; + } + } + playOnOffTabAnim(); +} +void dLytPauseDisp00_c::finalizeState_Select() { + mSelectToggleRequest = false; + if (mStep == 0) { + return; + } + loadRingText(RING_TEXT_CURRENT_TAB); +} + +void dLytPauseDisp00_c::initializeState_Ring() { + mStep = 0; + mLyt.findPane("N_itemArrow_00")->SetVisible(true); + dAcPy_c::calcItemWheelSelection(true, PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL); + mPrevNavTarget = 0; + loadRingText(RING_TEXT_RELEASE_TO_CONFIRM); + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MENU_P1_HOLD_POINTER); +} +void dLytPauseDisp00_c::executeState_Ring() { + dLytPauseMgr_c *pause = dLytPauseMgr_c::GetInstance(); + f32 rot = dLytPauseMgr_c::sDisp00ArrowRotation; + f32 len = dLytPauseMgr_c::sDisp00ArrowLength; + if (len < 0.0f) { + len = 0.0f; + } + if (len > 1.0f) { + len = 1.0f; + } + // Length + len *= 99.0f; + mAnm[PAUSE_DISP_00_ANIM_ITEM_ARROW].setFrame(len); + // Rotate the arrow + mVec3_c t1(0.0f, 0.0f, 0.0f); + t1.z = rot; + mLyt.findPane("N_itemArrow_00")->SetRotate(t1); + // But rotate the button and the pointer back so that + // they point up + t1.z = -t1.z; + mLyt.findPane("N_arrowHand_00")->SetRotate(t1); + + if (mSelectToggleRequest == true) { + mStateMgr.changeState(StateID_Select); + } else if (mRingToggleRequest == true) { + mRingToggleRequest = false; + mStateMgr.changeState(StateID_Wait); + } else { + s32 idx = dAcPy_c::calcItemWheelSelection(false, PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL); + s32 navTarget = 0; + if (idx == -1) { + mAnm[PAUSE_DISP_00_ANIM_ONOFF_TEXT].setFrame(0.0f); + pause->setSelection(dLytPauseMgr_c::SELECT_NONE, 0, false); + } else { + mAnm[PAUSE_DISP_00_ANIM_ONOFF_TEXT].play(); + static const u8 sButtonOrder[] = { + 0, 7, 6, 5, 4, 3, 2, 1, + }; + idx = sButtonOrder[idx]; + + u16 item; + dLytPauseMgr_c::SelectionType_e selectionType; + s32 b = PAUSE_DISP_00_BOUNDING_RING_OFFSET + idx; + if (mpBoundings[b]->IsVisible()) { + s32 tab = dLytControlGame_c::getInstance()->getPauseDisp00Tab(); + if (tab == 1) { + item = getPouchItemIdForIndex(idx, true); + if (item == 0) { + item = ITEM_POUCH_EXPANSION; + } + selectionType = dLytPauseMgr_c::SELECT_POUCH; + } else if (tab == 2) { + item = getDowsingItemIdForIndex(idx); + selectionType = dLytPauseMgr_c::SELECT_DOWSING; + } else { + item = getBWheelItemIdForIndex(idx); + selectionType = dLytPauseMgr_c::SELECT_BWHEEL; + } + pause->setSelection(selectionType, item, false); + navTarget = idx + 1; + mCurrentNavTarget = navTarget; + field_0xE371 = true; + } else { + idx = -1; + pause->setSelection(dLytPauseMgr_c::SELECT_NONE, 0, false); + mAnm[PAUSE_DISP_00_ANIM_ONOFF_TEXT].setFrame(0.0f); + } + } + + if (mPrevNavTarget != navTarget && idx != -1) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MENU_P1_POINT_ITEM); + dRumble_c::start(dRumble_c::sRumblePreset1, 1); + } + mPrevNavTarget = navTarget; + + s32 tab = dLytControlGame_c::getInstance()->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; + + int i; + d2d::AnmGroup_c *anm = &mAnm[anmIdx]; + for (i = 0; i < PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL; i++) { + if (idx == i) { + anm->play(); + } else { + playBackwards(*anm); + } + anm++; + } + playOnOffTabAnim(); + } +} +void dLytPauseDisp00_c::finalizeState_Ring() { + mLyt.findPane("N_itemArrow_00")->SetVisible(false); + loadRingText(RING_TEXT_INITIAL_TAB); +} + +void dLytPauseDisp00_c::initializeState_GetDemo() { + field_0xE36E = true; + mStep = 0; + mGetDemoTimer = 0; +} +void dLytPauseDisp00_c::executeState_GetDemo() { + switch (mStep) { + case 0: { + field_0xE36E = false; + if (mGetDemoTimer < 2) { + mGetDemoTimer++; + } else { + mGetDemoTimer = 0; + mStep = 1; + } + break; + } + case 1: { + mStep = 2; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MENU_ITEM_SET_FX); + nw4r::math::MTX34 mtx = mLyt.findPane("N_saifuAll_00")->GetGlobalMtx(); + nw4r::math::VEC3 v(0.0f, 0.0f, 0.0f); + MTXMultVec(mtx, v, v); + mVec3_c v1; + v1.set(v.x, v.y, v.z); + dJEffManager_c::spawnUIEffect(PARTICLE_RESOURCE_ID_MAPPING_990_, v1, nullptr, nullptr, nullptr, nullptr); + break; + } + case 2: { + if (mGetDemoTimer < 35) { + mGetDemoTimer++; + } else { + mGetDemoTimer = 0; + mStep = 3; + dTextBox_c *box; + s32 count = dAcItem_c::getExtraWalletCount(); + box = mLyt.getTextBox("T_rupeeNum_00"); + box->SetVisible(true); + SizedWString<32> buf; + buf.sprintf(L"+%d", count * 300); + box->setTextWithGlobalTextProcessor(buf); + // Yes, the r is actually there in the Lyt files + box = mLyt.getTextBox("T_rupeeNumrS_00"); + box->SetVisible(true); + box->setTextWithGlobalTextProcessor(buf); + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MENU_ITEM_SET_COUNT_UP); + } + break; + } + case 3: { + if (mGetDemoTimer < 37) { + mGetDemoTimer++; + } else { + mGetDemoTimer = 0; + mStateMgr.changeState(StateID_Wait); + } + break; + } + } +} +void dLytPauseDisp00_c::finalizeState_GetDemo() {} + +void dLytPauseDisp00_c::initializeState_Out() { + stopAnm(PAUSE_DISP_00_ANIM_IN); + if (mDoScrollAnim == true) { + if (dLytPauseMgr_c::GetInstance()->getField_0x0831()) { + setAnm(PAUSE_DISP_00_ANIM_SCROLL_R_OUT, 0.0f); + } else { + setAnm(PAUSE_DISP_00_ANIM_SCROLL_L_OUT, 0.0f); + } + } else { + setAnm(PAUSE_DISP_00_ANIM_OUT, 0.0f); + } + mStep = 0; +} +void dLytPauseDisp00_c::executeState_Out() { + s32 anim = PAUSE_DISP_00_ANIM_OUT; + if (mDoScrollAnim == true) { + anim = dLytPauseMgr_c::GetInstance()->getField_0x0831() ? PAUSE_DISP_00_ANIM_SCROLL_R_OUT : + PAUSE_DISP_00_ANIM_SCROLL_L_OUT; + } + + d2d::AnmGroup_c &anm = mAnm[anim]; + + switch (mStep) { + case 0: { + if (anm.isEndReached() == true) { + mStep = 1; + field_0xE36E = true; + } + break; + } + case 1: { + mStateMgr.changeState(StateID_None); + return; + } + } + + anm.play(); +} +void dLytPauseDisp00_c::finalizeState_Out() {} + +void dLytPauseDisp00_c::setAnm(int idx, f32 value) { + d2d::AnmGroup_c &anm = mAnm[idx]; + anm.bind(false); + anm.setAnimEnable(true); + anm.setFrame(value); +} + +void dLytPauseDisp00_c::stopAnm(int idx) { + d2d::AnmGroup_c &anm = mAnm[idx]; + anm.unbind(); +} + +void dLytPauseDisp00_c::playBackwards(d2d::AnmGroup_c &anm) { + f32 frame = anm.getFrame(); + if (frame) { + frame -= 1.0f; + if (frame <= 0.0f) { + frame = 0.0f; + } + anm.setFrame(frame); + } +} + +void dLytPauseDisp00_c::setupDisp() { + setupInventoryWheel(); + setupHeartPieces(); + setupWallets(); + setupMitts(); + setupSailcloth(); + setupWaterDragonScale(); + setupFireshieldEarrings(); + setupSongsAndLifeTree(); + setupTabletTriforce(); + setupSword(); + setupStoneOfTrials(); + + mpBoundings[PAUSE_DISP_00_BOUNDING_CALIB_BTN_0]->SetVisible(true); + + dLytCommonIconItem_c *icon; + icon = &mIcons[PAUSE_DISP_00_ICONS_B_WHEEL_OFFSET]; + for (s32 i = 0; i < PAUSE_DISP_00_NUM_SUBPANES; i++) { + icon->setVisible(false); + icon++; + } + + if (StoryflagManager::sInstance->getFlag(358)) { + setAnm(PAUSE_DISP_00_ANIM_HAVE_UITYPE_BTN, 1.0f); + mpBoundings[PAUSE_DISP_00_BOUNDING_UI_TYPE]->SetVisible(true); + } else { + setAnm(PAUSE_DISP_00_ANIM_HAVE_UITYPE_BTN, 0.0f); + } + + if (StoryflagManager::sInstance->getFlag(570)) { + setAnm(PAUSE_DISP_00_ANIM_CALL, 0.0f); + mCallTimerMaybe = 1; + } +} + +void dLytPauseDisp00_c::setupInventoryWheel() { + dLytCommonIconItem_c *icon; + s32 animIndex; + f32 haveFrame; + + // B-wheel + icon = &mIcons[PAUSE_DISP_00_ICONS_B_WHEEL_OFFSET]; + for (s32 i = 0; i < PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL; i++) { + animIndex = i + PAUSE_DISP_00_ANIM_HAVE_ITEM_OFFSET; + haveFrame = 0.0f; + icon->setUnk(false); + if (isBWheelIndexWithNumber(i)) { + icon->setHasNumber(true); + icon->setNumber(getNumberForBWheelIndex(i)); + } else { + icon->setHasNumber(false); + } + + if (getItemLevelForBWheelIndex(i) != 0) { + u8 id = getLytItemIdForBWheelIndex(i); + if (id != LYT_CMN_ItemInvalid) { + if (isBWheelIndexBocoburinLocked(i, true)) { + icon->setBocoburinLocked(true); + icon->setHasNumber(false); + } + haveFrame = 1.0f; + icon->setItem(id); + } + } + if (isBWheelIndexWithNumber(i)) { + u8 color = getNumberColorForBWheelIndex(i); + if (color != LYT_ITEM_COLOR_NONE) { + icon->setNumberColor(color); + } + } + + setAnm(animIndex, haveFrame); + icon++; + } + + // Pouch + icon = &mIcons[PAUSE_DISP_00_ICONS_POUCH_OFFSET]; + for (s32 i = 0; i < PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL; i++) { + animIndex = i + PAUSE_DISP_00_ANIM_HAVE_POUCH_OFFSET; + haveFrame = 0.0f; + icon->setUnk(false); + s32 number = getPouchItemAmount(i, true); + if (number == -1) { + icon->setHasNumber(false); + } else { + icon->setHasNumber(true); + icon->setNumber(number); + } + + u32 item = getPouchItemForSlot(i, true); + if (item != LYT_CMN_PouchPotionHealthPlusPlusHalf) { + if (isPouchBocoburinLocked()) { + icon->setBocoburinLocked(true); + icon->setHasNumber(false); + } + haveFrame = 1.0f; + icon->setItem(item); + f32 durability = getShieldDurability(i, true); + if (durability >= 0.0f) { + icon->setShieldDurability(durability); + } + + u8 color = getPouchItemNumberColor(i, false); + if (color != LYT_ITEM_COLOR_NONE) { + icon->setNumberColor(color); + } + } + + setAnm(animIndex, haveFrame); + icon++; + } + + // Dowsing + icon = &mIcons[PAUSE_DISP_00_ICONS_DOWSING_OFFSET]; + for (s32 i = 0; i < PAUSE_DISP_00_ICONS_NUM_ITEMS_ON_WHEEL; i++) { + animIndex = i + PAUSE_DISP_00_ANIM_HAVE_DOWSING_OFFSET; + haveFrame = 0.0f; + icon->setUnk(false); + icon->setHasNumber(false); + + if (hasDowsingInIndex(i)) { + u32 item = getLytIndexForDowsingIndex(i); + if (item != LYT_CMN_DowsingInvalid) { + haveFrame = 1.0f; + icon->setItem(item); + } + } + + setAnm(animIndex, haveFrame); + icon++; + } + + setAnm(PAUSE_DISP_00_ANIM_OFF_LEFT_TAB, 0.0f); + mAnm[PAUSE_DISP_00_ANIM_OFF_LEFT_TAB].setToEnd(); + setAnm(PAUSE_DISP_00_ANIM_OFF_CENTER_TAB, 0.0f); + mAnm[PAUSE_DISP_00_ANIM_OFF_CENTER_TAB].setToEnd(); + setAnm(PAUSE_DISP_00_ANIM_OFF_RIGHT_TAB, 0.0f); + mAnm[PAUSE_DISP_00_ANIM_OFF_RIGHT_TAB].setToEnd(); +} + +void dLytPauseDisp00_c::setupHeartPieces() { + u32 heartPieceCount = getCounterByIndex(8); + u32 containerCount = dAcItem_c::getHeartContainerHealthCount(); + if (containerCount == 24) { + setAnm(PAUSE_DISP_00_ANIM_HAVE_HEART, 1.0f); + setAnm(PAUSE_DISP_00_ANIM_HEART, 3.0f); + mpBoundings[PAUSE_DISP_00_BOUNDING_HEART]->SetVisible(true); + } else if (heartPieceCount != 0) { + f32 frame = heartPieceCount; + frame -= 1.0f; + setAnm(PAUSE_DISP_00_ANIM_HAVE_HEART, 1.0f); + setAnm(PAUSE_DISP_00_ANIM_HEART, frame); + mpBoundings[PAUSE_DISP_00_BOUNDING_HEART]->SetVisible(true); + } else { + setAnm(PAUSE_DISP_00_ANIM_HAVE_HEART, 0.0f); + } +} + +void dLytPauseDisp00_c::setupWallets() { + setAnm(PAUSE_DISP_00_ANIM_HAVE_POUCH, 1.0f); + f32 frame = 0.0f; + if (dAcItem_c::checkFlag(ITEM_TYCOON_WALLET)) { + frame = 4.0f; + } else if (dAcItem_c::checkFlag(ITEM_GIANT_WALLET)) { + frame = 3.0f; + } else if (dAcItem_c::checkFlag(ITEM_BIG_WALLET)) { + frame = 2.0f; + } else if (dAcItem_c::checkFlag(ITEM_MEDIUM_WALLET)) { + frame = 1.0f; + } + setAnm(PAUSE_DISP_00_ANIM_POUCH, frame); + mpBoundings[PAUSE_DISP_00_BOUNDING_POUCH]->SetVisible(true); + s32 walletCount = dAcItem_c::getExtraWalletCount(); + SizedWString<32> buf; + if (walletCount != 0) { + bool bVisible = true; + // Apparently extra wallets are the ONLY thing that can cause + // the Gear screen to show the demo (dLytControlGame_c::openCollectionScreenDemo), + // so we don't have to check that an extra wallets are actually what cause the + // demo. + if (dLytControlGame_c::getInstance()->getField_0x15C67()) { + walletCount--; + if (walletCount == 0) { + bVisible = false; + } + } + dTextBox_c *box; + box = mLyt.getTextBox("T_rupeeNum_00"); + box->SetVisible(bVisible); + buf.empty(); + buf.sprintf(L"+%d", walletCount * 300); + box->setTextWithGlobalTextProcessor(buf); + box = mLyt.getTextBox("T_rupeeNumrS_00"); + box->SetVisible(bVisible); + box->setTextWithGlobalTextProcessor(buf); + } else { + mLyt.getTextBox("T_rupeeNum_00")->SetVisible(false); + mLyt.getTextBox("T_rupeeNumrS_00")->SetVisible(false); + } +} + +void dLytPauseDisp00_c::setupMitts() { + s32 mittsLevel = getCurrentMittsLevel(); + if (mittsLevel != 0) { + f32 mittsLevelF = 0.0f; + if (mittsLevel > 1) { + mittsLevelF = 1.0f; + } + setAnm(PAUSE_DISP_00_ANIM_HAVE_MITTS, 1.0f); + if (isMittsRestricted() == true) { + setAnm(PAUSE_DISP_00_ANIM_BOCO_MITTS, 1.0f); + } else { + setAnm(PAUSE_DISP_00_ANIM_BOCO_MITTS, 0.0f); + } + mpBoundings[PAUSE_DISP_00_BOUNDING_MITTS]->SetVisible(true); + setAnm(PAUSE_DISP_00_ANIM_MITTS, mittsLevelF); + } else { + setAnm(PAUSE_DISP_00_ANIM_HAVE_MITTS, 0.0f); + } +} + +void dLytPauseDisp00_c::setupSailcloth() { + if (hasSailcloth()) { + setAnm(PAUSE_DISP_00_ANIM_HAVE_PARACHUTE, 1.0f); + setAnm(PAUSE_DISP_00_ANIM_BOCO_PARACHUTE, 0.0f); + mpBoundings[PAUSE_DISP_00_BOUNDING_PARACHUTE]->SetVisible(true); + } else { + setAnm(PAUSE_DISP_00_ANIM_HAVE_PARACHUTE, 0.0f); + } +} + +void dLytPauseDisp00_c::setupWaterDragonScale() { + if (hasWaterDragonScale()) { + setAnm(PAUSE_DISP_00_ANIM_HAVE_SCALE, 1.0f); + if (isWaterDragonScaleRestricted()) { + setAnm(PAUSE_DISP_00_ANIM_BOCO_SCALE, 1.0f); + } else { + setAnm(PAUSE_DISP_00_ANIM_BOCO_SCALE, 0.0f); + } + mpBoundings[PAUSE_DISP_00_BOUNDING_SCALE]->SetVisible(true); + } else { + setAnm(PAUSE_DISP_00_ANIM_HAVE_SCALE, 0.0f); + } +} + +void dLytPauseDisp00_c::setupFireshieldEarrings() { + if (dAcItem_c::checkFlag(ITEM_FIRESHIELD_EARRINGS)) { + setAnm(PAUSE_DISP_00_ANIM_HAVE_RING, 1.0f); + mpBoundings[PAUSE_DISP_00_BOUNDING_RING]->SetVisible(true); + } else { + setAnm(PAUSE_DISP_00_ANIM_HAVE_RING, 0.0f); + } +} + +void dLytPauseDisp00_c::setupSongsAndLifeTree() { + if (hasGoddessHarp()) { + setAnm(PAUSE_DISP_00_ANIM_HAVE_HARP, 1.0f); + setAnm(PAUSE_DISP_00_ANIM_BOCO_HARP, 1.0f); + mpBoundings[PAUSE_DISP_00_BOUNDING_HARP]->SetVisible(true); + } else { + setAnm(PAUSE_DISP_00_ANIM_HAVE_HARP, 0.0f); + } + + s32 anm; + for (int i = 0; i < 4; i++) { + anm = PAUSE_DISP_00_ANIM_HAVE_MUSE_OFFSET + i; + if (hasSong(i)) { + setAnm(anm, 1.0f); + mpBoundings[PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + i]->SetVisible(true); + } else { + setAnm(anm, 0.0f); + } + } + + u8 songLifetreeStatus = getSongLifeTreeStatus(); + if (songLifetreeStatus == SONG_LIFETREE_HAS_SOTH) { + setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSE_07, 1.0f); + setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSIC_SET, 0.0f); + mpBoundings[PAUSE_DISP_00_BOUNDING_MUSE_07]->SetVisible(true); + } else if (songLifetreeStatus != SONG_LIFETREE_NONE) { + for (int i = 0; i < PAUSE_DISP_00_NUM_SONG_PARTS; i++) { + if (hasSong(i + 4)) { + setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSE_PART_OFFSET + i, 1.0f); + mpBoundings[PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + i + 4]->SetVisible(true); + if (i == 2) { + setAnm(PAUSE_DISP_00_ANIM_HAVE_MI_TO_TANE, 0.0f); + } + } else { + if (i == 2) { + if (dAcItem_c::checkFlag(ITEM_LIFE_TREE_FRUIT)) { + setAnm(PAUSE_DISP_00_ANIM_HAVE_MI_TO_TANE, 1.0f); + setAnm(PAUSE_DISP_00_ANIM_MI_TO_TANE, 1.0f); + mpBoundings[PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + i + 4]->SetVisible(true); + } else if (dAcItem_c::checkFlag(ITEM_LIFE_TREE_SEED) && + ItemflagManager::sInstance->getFlagDirect(497)) { + setAnm(PAUSE_DISP_00_ANIM_HAVE_MI_TO_TANE, 1.0f); + setAnm(PAUSE_DISP_00_ANIM_MI_TO_TANE, 0.0f); + mpBoundings[PAUSE_DISP_00_BOUNDING_MUSE_OFFSET + i + 4]->SetVisible(true); + } else { + setAnm(PAUSE_DISP_00_ANIM_HAVE_MI_TO_TANE, 0.0f); + } + + setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSE_PART_OFFSET + i, 0.0f); + } else { + setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSE_PART_OFFSET + i, 0.0f); + } + } + } + setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSIC_SET, 1.0f); + } else { + setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSE_07, 0.0f); + setAnm(PAUSE_DISP_00_ANIM_HAVE_MUSIC_SET, 0.0f); + } +} + +void dLytPauseDisp00_c::setupTabletTriforce() { + static const s32 sTriforceHaveBoundings[] = { + PAUSE_DISP_00_ANIM_HAVE_FORCE_OFFSET + 1, + PAUSE_DISP_00_ANIM_HAVE_FORCE_OFFSET + 0, + PAUSE_DISP_00_ANIM_HAVE_FORCE_OFFSET + 2, + }; + + s32 tabletCount = 0; + for (int i = 0; i < 3; i++) { + if (dAcItem_c::checkFlag(getTabletItemIdForIndex(i))) { + tabletCount++; + } + } + + if (tabletCount != 0) { + setAnm(PAUSE_DISP_00_ANIM_HAVE_TABLET, 1.0f); + setAnm(PAUSE_DISP_00_ANIM_TABLETS, tabletCount - 1.0f); + mpBoundings[PAUSE_DISP_00_BOUNDING_TABLETS]->SetVisible(true); + } else { + setAnm(PAUSE_DISP_00_ANIM_HAVE_TABLET, 0.0f); + } + + s32 triforceCount = 0; + for (int i = 0; i < 3; i++) { + if (dAcItem_c::checkFlag(getTriforceItemIdForIndex(i))) { + triforceCount++; + setAnm(sTriforceHaveBoundings[i], 1.0f); + } else { + setAnm(sTriforceHaveBoundings[i], 0.0f); + } + } + + if (triforceCount != 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); + // Hide tablets + mAnm[PAUSE_DISP_00_ANIM_HAVE_TABLET].setFrame(0.0f); + } else { + setAnm(PAUSE_DISP_00_ANIM_HAVE_FORCE_BG, 0.0f); + } +} + +void dLytPauseDisp00_c::setupSword() { + static const u8 sSwordFireBoundings[] = { + PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET + 1, + PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET + 0, + PAUSE_DISP_00_BOUNDING_SWORD_FIRE_OFFSET + 2, + }; + + static const f32 sSwordFrames[] = {0.0f, 1.0f, 2.0f, 3.0f, 6.0f, 4.0f, 5.0f}; + + s32 currentSwordLevel = getCurrentSwordLevel(); + if (currentSwordLevel != 0) { + if (isSwordRestrictedBokoBase()) { + setAnm(PAUSE_DISP_00_ANIM_BOCO_SWORD, 1.0f); + } else { + setAnm(PAUSE_DISP_00_ANIM_BOCO_SWORD, 0.0f); + } + mpBoundings[PAUSE_DISP_00_BOUNDING_SWORD]->SetVisible(true); + } + + setAnm(PAUSE_DISP_00_ANIM_SWORD, sSwordFrames[currentSwordLevel]); + + s32 currentFire = currentSwordLevel - 2; + if (currentFire < 0) { + currentFire = 0; + } else if (currentFire > 3) { + currentFire = 3; + } + + // Note: Funny unrolled loop here, for a loop that's known to never + // have more than three iterations + for (int i = 0; i < currentFire; i++) { + mpBoundings[sSwordFireBoundings[i]]->SetVisible(true); + } +} + +void dLytPauseDisp00_c::setupStoneOfTrials() { + if (StoryflagManager::sInstance->getFlag(22)) { + setAnm(PAUSE_DISP_00_ANIM_HAVE_SHIREN, 2.0f); + mpBoundings[PAUSE_DISP_00_BOUNDING_SHIREN]->SetVisible(true); + } else { + if (dAcItem_c::checkFlag(ITEM_STONE_OF_TRIALS)) { + setAnm(PAUSE_DISP_00_ANIM_HAVE_SHIREN, 1.0f); + mpBoundings[PAUSE_DISP_00_BOUNDING_SHIREN]->SetVisible(true); + } else { + setAnm(PAUSE_DISP_00_ANIM_HAVE_SHIREN, 0.0f); } } } -void dLytPauseDisp00_c::displayElement(int i, float frame) { - d2d::AnmGroup_c *s = &field_0x00D0[i]; - s->bind(false); - s->setAnimEnable(true); - s->setFrame(frame); +// 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}, +}; + +s32 dLytPauseDisp00_c::updateSelection() { + dLytControlGame_c *lytControl = dLytControlGame_c::getInstance(); + dLytPauseMgr_c *pause = dLytPauseMgr_c::GetInstance(); + if (!pause->isStateWait()) { + pause->setSelection(dLytPauseMgr_c::SELECT_NONE, 0, false); + return 0; + } + + s32 target = 0; + if (dPadNav::isPointerVisible()) { + target = getPointerPane(); + if (target != 0) { + mCurrentNavTarget = target; + } + } else { + if (mCurrentNavTarget != 0) { + if (!dPadNav::isPrevPointerVisible() && dPadNav::getFSStickNavDirection() != dPadNav::FS_STICK_NONE) { + const u8 *directions = sNavTable1[mCurrentNavTarget - 1]; + 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; + } + } + } else { + mCurrentNavTarget = PAUSE_DISP_00_BOUNDING_UI_TYPE + 1; + } + + if (mCurrentNavTarget != 0) { + s32 paneIdx = mCurrentNavTarget - 1; + dCsBase_c::GetInstance()->setCursorStickTargetPane(mpBoundings[paneIdx]); + } + + target = mCurrentNavTarget; + } + + if (target == 0) { + pause->setSelection(dLytPauseMgr_c::SELECT_NONE, 0, false); + } else { + u8 tab; + // TODO mode IDs + switch (target - 1) { + case PAUSE_DISP_00_BOUNDING_UI_TYPE: + if (mpBoundings[PAUSE_DISP_00_BOUNDING_UI_TYPE]->IsVisible()) { + pause->setSelection(dLytPauseMgr_c::SELECT_CATEGORY, 4, false); + } else { + 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); + break; + case PAUSE_DISP_00_BOUNDING_LEFT_TAB: { + tab = 3; + goto anyTab; + } + case PAUSE_DISP_00_BOUNDING_CENTER_TAB: { + tab = 2; + goto anyTab; + } + case PAUSE_DISP_00_BOUNDING_RIGHT_TAB: { + tab = 1; + goto anyTab; + } + anyTab: + pause->setCurrentSelectionTab(tab); + if (mpBoundings[PAUSE_DISP_00_BOUNDING_LEFT_TAB + tab]->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); + 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; + 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: + // help + break; + } + } + } + } +} + +s32 dLytPauseDisp00_c::getPointerPane() const { + int idx = 0; + dCursorHitCheck_c *d = dCsBase_c::GetInstance()->getHitCheck(); + if (d != nullptr && d->getType() == 'lyt ') { + for (int i = 0; i < PAUSE_DISP_00_NUM_BOUNDINGS - 1; i++) { + if (static_cast(d)->getHitPane() == mpBoundings[i]) { + idx = i + 1; + // missed optimization: + // break; + } + } + } + return idx; +} + +void dLytPauseDisp00_c::hideItemIcons() { + for (int i = 0; i < PAUSE_DISP_00_NUM_SUBPANES; i++) { + mIcons[i].setOff(); + mIcons[i].setVisible(false); + } +} + +void dLytPauseDisp00_c::executeCall() { + if (mCallTimerMaybe == 1) { + d2d::AnmGroup_c &anm = mAnm[PAUSE_DISP_00_ANIM_CALL]; + if (cM::isZero(anm.getFrame()) == true) { + if (mStopCallRequest == true) { + mStopCallRequest = false; + mCallTimerMaybe = 0; + stopAnm(PAUSE_DISP_00_ANIM_CALL); + } else { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_PLAY_GUIDE_BUTTON_BLINK); + } + } + anm.play(); + } +} + +void dLytPauseDisp00_c::playOnOffTabAnim() { + d2d::AnmGroup_c *anm = &mAnm[PAUSE_DISP_00_ANIM_OFF_LEFT_TAB]; + for (int i = 0; i < 3; i++) { + anm->play(); + anm++; + } +} + +void dLytPauseDisp00_c::loadRingText(u32 cmd) { + if (cmd == RING_TEXT_RELEASE_TO_CONFIRM) { + // "Release to confirm." + mLyt.loadTextVariant("T_decide_00", 0); + mLyt.loadTextVariant("T_decideS_00", 0); + } else { + s32 msgIdx = 1; + // TODO: Don't these use different IDs? + s32 tab = dLytControlGame_c::getInstance()->getPauseDisp00Tab(); + if (cmd == RING_TEXT_CURRENT_TAB) { + tab = dLytPauseMgr_c::GetInstance()->getCurrentDisp00Tab(); + } + if (tab == 1) { + msgIdx = 2; + } else if (tab == 2) { + msgIdx = 3; + } + // "Items"/"Pouch"/"Dowsing" + mLyt.loadTextVariant("T_decide_00", msgIdx); + mLyt.loadTextVariant("T_decideS_00", msgIdx); + } + + dWindow_c *window = mLyt.getWindow("W_bgP_01"); + window->UpdateSize(mLyt.getSizeBoxInWindow("W_bgP_01"), 32.0f); } diff --git a/src/d/lyt/d_lyt_pause_disp_01.cpp b/src/d/lyt/d_lyt_pause_disp_01.cpp index 5b315c2d..0b253a73 100644 --- a/src/d/lyt/d_lyt_pause_disp_01.cpp +++ b/src/d/lyt/d_lyt_pause_disp_01.cpp @@ -226,7 +226,7 @@ void dLytPauseDisp01_c::initializeState_None() { mStep = 0; mPrevNavTarget = 0; mCurrentNavTarget = 0; - mTimer = 0; + mGetDemoTimer = 0; for (int i = 0; i < PAUSE_DISP_01_NUM_SUBPANES; i++) { mIcons[i].reset(); @@ -309,11 +309,9 @@ void dLytPauseDisp01_c::finalizeState_In() { mDoScrollAnim = false; if (pause->getField_0x083E()) { if (!pause->getField_0x0832()) { - // TODO id - mCurrentNavTarget = 34; + mCurrentNavTarget = PAUSE_DISP_01_OFFSET_MY_PANES + PAUSE_DISP_01_PANE_RIGHT + 1; } else { - // TODO id - mCurrentNavTarget = 33; + mCurrentNavTarget = PAUSE_DISP_01_OFFSET_MY_PANES + PAUSE_DISP_01_PANE_LEFT + 1; } mPrevNavTarget = mCurrentNavTarget; } @@ -363,16 +361,16 @@ void dLytPauseDisp01_c::finalizeState_Select() { void dLytPauseDisp01_c::initializeState_GetDemo() { field_0x98CE = true; mStep = 0; - mTimer = 0; + mGetDemoTimer = 0; } void dLytPauseDisp01_c::executeState_GetDemo() { switch (mStep) { case 0: { field_0x98CE = false; - if (mTimer < 2) { - mTimer++; + if (mGetDemoTimer < 2) { + mGetDemoTimer++; } else { - mTimer = 0; + mGetDemoTimer = 0; mStep = 1; } break; @@ -448,10 +446,10 @@ void dLytPauseDisp01_c::executeState_GetDemo() { break; } case 2: { - if (mTimer < 35) { - mTimer++; + if (mGetDemoTimer < 35) { + mGetDemoTimer++; } else { - mTimer = 0; + mGetDemoTimer = 0; mStep = 3; dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_MENU_ITEM_SET_COUNT_UP); u16 item = dLytControlGame_c::getInstance()->getItemForPauseDemo(); @@ -502,10 +500,10 @@ void dLytPauseDisp01_c::executeState_GetDemo() { break; } case 3: { - if (mTimer < 37) { - mTimer++; + if (mGetDemoTimer < 37) { + mGetDemoTimer++; } else { - mTimer = 0; + mGetDemoTimer = 0; mStateMgr.changeState(StateID_Wait); } break; diff --git a/src/d/lyt/meter/d_lyt_meter.cpp b/src/d/lyt/meter/d_lyt_meter.cpp index 5df7025f..aa48e102 100644 --- a/src/d/lyt/meter/d_lyt_meter.cpp +++ b/src/d/lyt/meter/d_lyt_meter.cpp @@ -146,8 +146,9 @@ bool dLytMeter1Button_c::build(d2d::ResAccIf_c *resAcc) { mAnm[i].setAnimEnable(false); } - mLyt.fn_800AB9A0(mLyt.getTextBox("T_sabBtnS_00"), 0); - mLyt.fn_800AB9A0(mLyt.getTextBox("T_sabBtn_00"), 0); + // "Gear" + mLyt.loadTextVariant(mLyt.getTextBox("T_sabBtnS_00"), 0); + mLyt.loadTextVariant(mLyt.getTextBox("T_sabBtn_00"), 0); for (int i = 0; i < 1; i++) { mpWindow[i] = mLyt.getWindow(sWindowName1[i]); mpSizeBox[i] = mLyt.getSizeBoxInWindow(sWindowName1[i]); diff --git a/src/d/lyt/meter/d_lyt_meter_event_skip.cpp b/src/d/lyt/meter/d_lyt_meter_event_skip.cpp index 5289b97e..3e70d630 100644 --- a/src/d/lyt/meter/d_lyt_meter_event_skip.cpp +++ b/src/d/lyt/meter/d_lyt_meter_event_skip.cpp @@ -25,11 +25,13 @@ void dLytMeterEventSkip_c::executeState_Invisible() { if (shouldPromptForSkip() || dLytMeter_c::GetInstance()->isHelpOpen()) { if (dLytMeter_c::GetInstance()->isHelpOpen()) { for (int i = 0; i < 2; i++) { - mLyt.fn_800AB9A0(mpTextBoxes[i], 1); + // "Close" + mLyt.loadTextVariant(mpTextBoxes[i], 1); } } else { for (int i = 0; i < 2; i++) { - mLyt.fn_800AB9A0(mpTextBoxes[i], 0); + // "Skip" + mLyt.loadTextVariant(mpTextBoxes[i], 0); } } diff --git a/src/d/lyt/meter/d_lyt_meter_item_select.cpp b/src/d/lyt/meter/d_lyt_meter_item_select.cpp index 30e858cb..28209883 100644 --- a/src/d/lyt/meter/d_lyt_meter_item_select.cpp +++ b/src/d/lyt/meter/d_lyt_meter_item_select.cpp @@ -12,6 +12,7 @@ #include "d/lyt/d_lyt_control_game.h" #include "d/lyt/d_lyt_do_button.h" #include "d/lyt/d_lyt_unknowns.h" +#include "d/lyt/d_lyt_util_items.h" #include "d/lyt/meter/d_lyt_meter.h" #include "d/snd/d_snd_small_effect_mgr.h" #include "m/m_vec.h" @@ -719,9 +720,9 @@ void dLytMeterItemSelect_c::initializeState_SelectIn() { mAnm[ITEM_SELECT_ANIM_DECIDE].setFrame(0.0f); for (int i = 0; i < ITEM_SELECT_NUM_ITEMS; i++) { - if (fn_800F01B0(i)) { + if (hasBWheelItem(i)) { mAnm[i + ITEM_SELECT_ANIM_HAVE_OFFSET].setFrame(0.0f); - if (fn_800F01E0(i)) { + if (isBocoburinLocked(i)) { mIsBocoburinLocked[i] = true; } } else { @@ -1345,7 +1346,7 @@ void dLytMeterItemSelect_c::initializeState_DemoMove() { } else { field_0x57A3[i] = true; } - } else if ((i == 0 || i == 2 || i == 3) && fn_800F01B0(i)) { + } else if ((i == 0 || i == 2 || i == 3) && hasBWheelItem(i)) { field_0x57A3[i] = false; field_0x575C++; } else { @@ -1355,8 +1356,8 @@ void dLytMeterItemSelect_c::initializeState_DemoMove() { } for (int i = 0; i < ITEM_SELECT_NUM_ITEMS; i++) { - if (fn_800F01B0(i)) { - if (fn_800F01E0(i) || field_0x57A3[i] == 0) { + if (hasBWheelItem(i)) { + if (isBocoburinLocked(i) || field_0x57A3[i] == 0) { if (isSlotBocoburinLocked(i)) { mIsBocoburinLocked[i] = true; mAnm[i + ITEM_SELECT_ANIM_HAVE_OFFSET].setFrame(0.0f); @@ -1399,7 +1400,7 @@ void dLytMeterItemSelect_c::executeState_DemoMove() { mDemoMoveTimer++; if (mDemoMoveTimer == 15) { for (int i = 0; i < ITEM_SELECT_NUM_ITEMS; i++) { - if (fn_800F01B0(i) && !field_0x57A3[i]) { + if (hasBWheelItem(i) && !field_0x57A3[i]) { mAnm[i + ITEM_SELECT_ANIM_HAVE_OFFSET].setFrame(0.0f); field_0x57A3[i] = true; @@ -2514,16 +2515,12 @@ u8 dLytMeterItemSelect_c::getInternalBaseItemForSlot(s32 slot) const { return sSlotToInternalItem[slot]; } -extern "C" s32 fn_801673B0(s32); - -bool dLytMeterItemSelect_c::fn_800F01B0(s32 arg) const { - return fn_801673B0(arg) != 0; +bool dLytMeterItemSelect_c::hasBWheelItem(s32 arg) const { + return getItemLevelForBWheelIndex(arg) != 0; } -extern "C" bool fn_80167780(s32, bool); - -bool dLytMeterItemSelect_c::fn_800F01E0(s32 arg) const { - return fn_80167780(arg, true); +bool dLytMeterItemSelect_c::isBocoburinLocked(s32 arg) const { + return isBWheelIndexBocoburinLocked(arg, true); } bool dLytMeterItemSelect_c::isSlotBocoburinLocked(s32 slot) { diff --git a/src/d/lyt/msg_window/d_lyt_msg_window_select_btn.cpp b/src/d/lyt/msg_window/d_lyt_msg_window_select_btn.cpp index a837e3e8..e4973458 100644 --- a/src/d/lyt/msg_window/d_lyt_msg_window_select_btn.cpp +++ b/src/d/lyt/msg_window/d_lyt_msg_window_select_btn.cpp @@ -217,7 +217,8 @@ void dLytMsgWindowSelectBtn_c::initializeState_In() { field_0x9A4 = 1; field_0x9B4 = -1; for (int i = 0; i < 2; i++) { - mLyt.fn_800AB9A0(mpDecideTextBoxes[i], 1); + // "Select" + mLyt.loadTextVariant(mpDecideTextBoxes[i], 1); } mpWindow->UpdateSize(mpSizeBox, 32.0f); @@ -317,7 +318,8 @@ void dLytMsgWindowSelectBtn_c::executeState_WaitSelect() { f32 f = mBtnHelper.fn_8011D690(mBtnHelper.field_0x50); // TODO for (int i = 0; i < 2; i++) { - mLyt.fn_800AB9A0(mpDecideTextBoxes[i], 0); + // "Confirm" + mLyt.loadTextVariant(mpDecideTextBoxes[i], 0); } mpWindow->UpdateSize(mpSizeBox, 32.0f);