diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 029135b6..53a51fc3 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -1666,7 +1666,9 @@ d/lyt/d_lyt_shop.cpp: .ctors start:0x804DB884 end:0x804DB888 .rodata start:0x804EF130 end:0x804EF8B0 .data start:0x8053BF50 end:0x8053CFC8 + .sdata start:0x80573BE8 end:0x80573C10 .sbss start:0x805759B0 end:0x805759B8 + .sdata2 start:0x8057C7B0 end:0x8057C7C0 .bss start:0x805B67C0 end:0x805B6C18 d/lyt/d_lyt_deposit.cpp: diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 34c5cbef..7ee98d71 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -9126,9 +9126,9 @@ hasPouchSlot__Flb = .text:0x801669E0; // type:function size:0x50 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 +getPouchShieldDurability2__Flb = .text:0x80166B90; // type:function size:0xBC fn_80166C50 = .text:0x80166C50; // type:function size:0x48 -fn_80166CA0 = .text:0x80166CA0; // type:function size:0x48 +getEvenMoreShieldStuff__Flb = .text:0x80166CA0; // type:function size:0x48 getPouchItemNumberColor__Flb = .text:0x80166CF0; // type:function size:0x84 isPouchBocoburinLocked__Fv = .text:0x80166D80; // type:function size:0x34 getPouchShieldDurability__Flb = .text:0x80166DC0; // type:function size:0xC8 @@ -15826,59 +15826,59 @@ initializeState__32sFStateID_c<17dLytDemoDowsing_c>CFR17dLytDemoDowsing_c = .tex __sinit_\d_lyt_demo_dowsing_cpp = .text:0x802A1520; // type:function size:0x1C0 __dt__32sFStateID_c<17dLytDemoDowsing_c>Fv = .text:0x802A16E0; // type:function size:0x58 isSameName__32sFStateID_c<17dLytDemoDowsing_c>CFPCc = .text:0x802A1740; // type:function size:0x88 -fn_802A17D0 = .text:0x802A17D0; // type:function size:0x4 -dLytShopMain__stateModeNoneUpdate = .text:0x802A17E0; // type:function size:0x10 -fn_802A17F0 = .text:0x802A17F0; // type:function size:0x4 -fn_802A1800 = .text:0x802A1800; // type:function size:0x4 -dLytShopMain__stateModeSelectInUpdate = .text:0x802A1810; // type:function size:0x168 -fn_802A1980 = .text:0x802A1980; // type:function size:0x4 -dLytShopMain__stateModeSelectCheckEnter = .text:0x802A1990; // type:function size:0x20 -dLytShopMain__stateModeSelectCheckUpdate = .text:0x802A19B0; // type:function size:0xD8 -fn_802A1A90 = .text:0x802A1A90; // type:function size:0x4 -fn_802A1AA0 = .text:0x802A1AA0; // type:function size:0x4 -dLytShopMain__stateModeSelectOutUpdate = .text:0x802A1AB0; // type:function size:0xDC -fn_802A1B90 = .text:0x802A1B90; // type:function size:0x4 -fn_802A1BA0 = .text:0x802A1BA0; // type:function size:0x4 -dLytShopMain__stateModeOutInUpdate = .text:0x802A1BB0; // type:function size:0x324 -fn_802A1EE0 = .text:0x802A1EE0; // type:function size:0x4 -dLytShopMain__stateModeMaterialCheck = .text:0x802A1EF0; // type:function size:0x1C -dLytShopMain__stateModeMaterialCheckUpdate = .text:0x802A1F10; // type:function size:0xDC -fn_802A1FF0 = .text:0x802A1FF0; // type:function size:0x4 -fn_802A2000 = .text:0x802A2000; // type:function size:0x4 -dLytShopMain__stateModeOutUpdate = .text:0x802A2010; // type:function size:0x170 -fn_802A2180 = .text:0x802A2180; // type:function size:0x4 -fn_802A2190 = .text:0x802A2190; // type:function size:0x4 -dLytShopMain__stateModeInOutUpdate = .text:0x802A21A0; // type:function size:0x264 -fn_802A2410 = .text:0x802A2410; // type:function size:0x4 -fn_802A2420 = .text:0x802A2420; // type:function size:0x200 -fn_802A2620 = .text:0x802A2620; // type:function size:0xA4 -fn_802A26D0 = .text:0x802A26D0; // type:function size:0xA0 -fn_802A2770 = .text:0x802A2770; // type:function size:0x6C -fn_802A27E0 = .text:0x802A27E0; // type:function size:0x58 -fn_802A2840 = .text:0x802A2840; // type:function size:0x438 -fn_802A2C80 = .text:0x802A2C80; // type:function size:0x3C8 -fn_802A3050 = .text:0x802A3050; // type:function size:0x10 -fn_802A3060 = .text:0x802A3060; // type:function size:0x50 -fn_802A30B0 = .text:0x802A30B0; // type:function size:0x1F8 -dLytShopMain__setStateModeNone = .text:0x802A32B0; // type:function size:0x50 -fn_802A3300 = .text:0x802A3300; // type:function size:0x10 -fn_802A3310 = .text:0x802A3310; // type:function size:0x154 -dLytShopMain__setStateModeSelectCheck = .text:0x802A3470; // type:function size:0x50 -fn_802A34C0 = .text:0x802A34C0; // type:function size:0xE0 -fn_802A35A0 = .text:0x802A35A0; // type:function size:0xFC -dLytShopMain__setStateModeMaterialCheck = .text:0x802A36A0; // type:function size:0x58 -fn_802A3700 = .text:0x802A3700; // type:function size:0x94 -fn_802A37A0 = .text:0x802A37A0; // type:function size:0xB4 -fn_802A3860 = .text:0x802A3860; // type:function size:0x30C -dLytShop__prepareRemodelStoreStuff = .text:0x802A3B70; // type:function size:0x47C -dLytShop__addItemToDisplayed = .text:0x802A3FF0; // type:function size:0x2C8 -fn_802A42C0 = .text:0x802A42C0; // type:function size:0x168 -fn_802A4430 = .text:0x802A4430; // type:function size:0x5C +initializeState_ModeNone__14dLytShopMain_cFv = .text:0x802A17D0; // type:function size:0x4 +executeState_ModeNone__14dLytShopMain_cFv = .text:0x802A17E0; // type:function size:0x10 +finalizeState_ModeNone__14dLytShopMain_cFv = .text:0x802A17F0; // type:function size:0x4 +initializeState_ModeSelectIn__14dLytShopMain_cFv = .text:0x802A1800; // type:function size:0x4 +executeState_ModeSelectIn__14dLytShopMain_cFv = .text:0x802A1810; // type:function size:0x168 +finalizeState_ModeSelectIn__14dLytShopMain_cFv = .text:0x802A1980; // type:function size:0x4 +initializeState_ModeSelectCheck__14dLytShopMain_cFv = .text:0x802A1990; // type:function size:0x20 +executeState_ModeSelectCheck__14dLytShopMain_cFv = .text:0x802A19B0; // type:function size:0xD8 +finalizeState_ModeSelectCheck__14dLytShopMain_cFv = .text:0x802A1A90; // type:function size:0x4 +initializeState_ModeSelectOut__14dLytShopMain_cFv = .text:0x802A1AA0; // type:function size:0x4 +executeState_ModeSelectOut__14dLytShopMain_cFv = .text:0x802A1AB0; // type:function size:0xDC +finalizeState_ModeSelectOut__14dLytShopMain_cFv = .text:0x802A1B90; // type:function size:0x4 +initializeState_ModeOutIn__14dLytShopMain_cFv = .text:0x802A1BA0; // type:function size:0x4 +executeState_ModeOutIn__14dLytShopMain_cFv = .text:0x802A1BB0; // type:function size:0x324 +finalizeState_ModeOutIn__14dLytShopMain_cFv = .text:0x802A1EE0; // type:function size:0x4 +initializeState_ModeMaterialCheck__14dLytShopMain_cFv = .text:0x802A1EF0; // type:function size:0x1C +executeState_ModeMaterialCheck__14dLytShopMain_cFv = .text:0x802A1F10; // type:function size:0xDC +finalizeState_ModeMaterialCheck__14dLytShopMain_cFv = .text:0x802A1FF0; // type:function size:0x4 +initializeState_ModeOut__14dLytShopMain_cFv = .text:0x802A2000; // type:function size:0x4 +executeState_ModeOut__14dLytShopMain_cFv = .text:0x802A2010; // type:function size:0x170 +finalizeState_ModeOut__14dLytShopMain_cFv = .text:0x802A2180; // type:function size:0x4 +initializeState_ModeInOut__14dLytShopMain_cFv = .text:0x802A2190; // type:function size:0x4 +executeState_ModeInOut__14dLytShopMain_cFv = .text:0x802A21A0; // type:function size:0x264 +finalizeState_ModeInOut__14dLytShopMain_cFv = .text:0x802A2410; // type:function size:0x4 +__ct__14dLytShopMain_cFv = .text:0x802A2420; // type:function size:0x200 +__dt__53sFStateMgr_c<14dLytShopMain_c,20sStateMethodUsr_FI_c>Fv = .text:0x802A2620; // type:function size:0xA4 +__dt__83sStateMgr_c<14dLytShopMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x802A26D0; // type:function size:0xA0 +__dt__30sFStateFct_c<14dLytShopMain_c>Fv = .text:0x802A2770; // type:function size:0x6C +__dt__27sFState_c<14dLytShopMain_c>Fv = .text:0x802A27E0; // type:function size:0x58 +build__14dLytShopMain_cFPQ23d2d10ResAccIf_c = .text:0x802A2840; // type:function size:0x438 +execute__14dLytShopMain_cFv = .text:0x802A2C80; // type:function size:0x3C8 +executeState__83sStateMgr_c<14dLytShopMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x802A3050; // type:function size:0x10 +draw__14dLytShopMain_cFv = .text:0x802A3060; // type:function size:0x50 +remove__14dLytShopMain_cFv = .text:0x802A30B0; // type:function size:0x1F8 +setModeNone__14dLytShopMain_cFv = .text:0x802A32B0; // type:function size:0x50 +changeState__83sStateMgr_c<14dLytShopMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x802A3300; // type:function size:0x10 +setModeSelectIn__14dLytShopMain_cFv = .text:0x802A3310; // type:function size:0x154 +setModeSelectCheck__14dLytShopMain_cFv = .text:0x802A3470; // type:function size:0x50 +setModeSelectOut__14dLytShopMain_cFv = .text:0x802A34C0; // type:function size:0xE0 +setModeOutIn__14dLytShopMain_cFv = .text:0x802A35A0; // type:function size:0xFC +setModeMaterialCheck__14dLytShopMain_cFv = .text:0x802A36A0; // type:function size:0x58 +setModeOut__14dLytShopMain_cFv = .text:0x802A3700; // type:function size:0x94 +setModeInOut__14dLytShopMain_cFv = .text:0x802A37A0; // type:function size:0xB4 +buildSubpanes__14dLytShopMain_cFv = .text:0x802A3860; // type:function size:0x30C +prepareRemodelStoreStuff__14dLytShopMain_cFl = .text:0x802A3B70; // type:function size:0x47C +addItemToDisplayed__14dLytShopMain_cFlll = .text:0x802A3FF0; // type:function size:0x2C8 +buildMaterialCheckIcons__14dLytShopMain_cFPQ23d2d10ResAccIf_cUc = .text:0x802A42C0; // type:function size:0x168 +fn_802A4430__14dLytShopMain_cFl = .text:0x802A4430; // type:function size:0x5C fn_802A4490 = .text:0x802A4490; // type:function size:0x68 fn_802A4500 = .text:0x802A4500; // type:function size:0x44 -fn_802A4550 = .text:0x802A4550; // type:function size:0x8E4 -fn_802A4E40 = .text:0x802A4E40; // type:function size:0x1C4 -dLytShopMain__updateShopStuffMaybe = .text:0x802A5010; // type:function size:0x74C +fn_802A4550__14dLytShopMain_cFv = .text:0x802A4550; // type:function size:0x8E4 +checkNav__14dLytShopMain_cFv = .text:0x802A4E40; // type:function size:0x1C4 +updateShopStuffMaybe__14dLytShopMain_cFv = .text:0x802A5010; // type:function size:0x74C fn_802A5760 = .text:0x802A5760; // type:function size:0x18 fn_802A5780 = .text:0x802A5780; // type:function size:0x14 dLytShopMain__getDigitsInPrice = .text:0x802A57A0; // type:function size:0x58 @@ -15887,85 +15887,85 @@ dLytShopMain__showPriceMaybe = .text:0x802A59D0; // type:function size:0x118 fn_802A5AF0 = .text:0x802A5AF0; // type:function size:0xA0 fn_802A5B90 = .text:0x802A5B90; // type:function size:0x1C fn_802A5BB0 = .text:0x802A5BB0; // type:function size:0x18 -fn_802A5BD0 = .text:0x802A5BD0; // type:function size:0xD0 -fn_802A5CA0 = .text:0x802A5CA0; // type:function size:0xD4 -fn_802A5D80 = .text:0x802A5D80; // type:function size:0x4 -dLytShop__stateNoneUpdate = .text:0x802A5D90; // type:function size:0x68 -fn_802A5E00 = .text:0x802A5E00; // type:function size:0x10 -fn_802A5E10 = .text:0x802A5E10; // type:function size:0x4 -fn_802A5E20 = .text:0x802A5E20; // type:function size:0x4 -dLytShop__stateSelectInUpdate = .text:0x802A5E30; // type:function size:0x68 -fn_802A5EA0 = .text:0x802A5EA0; // type:function size:0x4 -fn_802A5EB0 = .text:0x802A5EB0; // type:function size:0x4 -dLytShop__stateSelectCheckUpdate = .text:0x802A5EC0; // type:function size:0x140 -fn_802A6000 = .text:0x802A6000; // type:function size:0x4 -fn_802A6010 = .text:0x802A6010; // type:function size:0x4 -dLytShop__stateSelectOutUpdate = .text:0x802A6020; // type:function size:0x64 -fn_802A6090 = .text:0x802A6090; // type:function size:0x4 -fn_802A60A0 = .text:0x802A60A0; // type:function size:0x4 -dLytShop__stateOutInUpdate = .text:0x802A60B0; // type:function size:0x5C -fn_802A6110 = .text:0x802A6110; // type:function size:0x4 -fn_802A6120 = .text:0x802A6120; // type:function size:0x4 -dLytShop__stateMaterialCheckUpdate = .text:0x802A6130; // type:function size:0x10C -fn_802A6240 = .text:0x802A6240; // type:function size:0x4 -fn_802A6250 = .text:0x802A6250; // type:function size:0x4 -dLytShop__stateOutUpdate = .text:0x802A6260; // type:function size:0x5C -fn_802A62C0 = .text:0x802A62C0; // type:function size:0x4 -fn_802A62D0 = .text:0x802A62D0; // type:function size:0x4 -dLytShop__stateInOutUpdate = .text:0x802A62E0; // type:function size:0x5C -fn_802A6340 = .text:0x802A6340; // type:function size:0x4 -fn_802A6350 = .text:0x802A6350; // type:function size:0x4 -fn_802A6360 = .text:0x802A6360; // type:function size:0x4 -fn_802A6370 = .text:0x802A6370; // type:function size:0x4 -dLytShop__ctor = .text:0x802A6380; // type:function size:0xF8 -fn_802A6480 = .text:0x802A6480; // type:function size:0x58 -fn_802A64E0 = .text:0x802A64E0; // type:function size:0x6C -fn_802A6550 = .text:0x802A6550; // type:function size:0xA0 -fn_802A65F0 = .text:0x802A65F0; // type:function size:0xA4 -dLytShopMain__dtor = .text:0x802A66A0; // type:function size:0x1E8 -fn_802A6890 = .text:0x802A6890; // type:function size:0x54 -dLytShop__init = .text:0x802A68F0; // type:function size:0x6C -dLytShop__update = .text:0x802A6960; // type:function size:0xB0 -fn_802A6A10 = .text:0x802A6A10; // type:function size:0x10 -fn_802A6A20 = .text:0x802A6A20; // type:function size:0x10 -dLytShop__draw = .text:0x802A6A30; // type:function size:0x78 -dLytShop__delete = .text:0x802A6AB0; // type:function size:0x44 +fn_802A5BD0__14dLytShopMain_cFv = .text:0x802A5BD0; // type:function size:0xD0 +fn_802A5CA0__14dLytShopMain_cFb = .text:0x802A5CA0; // type:function size:0xD4 +initializeState_None__10dLytShop_cFv = .text:0x802A5D80; // type:function size:0x4 +executeState_None__10dLytShop_cFv = .text:0x802A5D90; // type:function size:0x68 +changeState__79sStateMgr_c<10dLytShop_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x802A5E00; // type:function size:0x10 +finalizeState_None__10dLytShop_cFv = .text:0x802A5E10; // type:function size:0x4 +initializeState_SelectIn__10dLytShop_cFv = .text:0x802A5E20; // type:function size:0x4 +executeState_SelectIn__10dLytShop_cFv = .text:0x802A5E30; // type:function size:0x68 +finalizeState_SelectIn__10dLytShop_cFv = .text:0x802A5EA0; // type:function size:0x4 +initializeState_SelectCheck__10dLytShop_cFv = .text:0x802A5EB0; // type:function size:0x4 +executeState_SelectCheck__10dLytShop_cFv = .text:0x802A5EC0; // type:function size:0x140 +finalizeState_SelectCheck__10dLytShop_cFv = .text:0x802A6000; // type:function size:0x4 +initializeState_SelectOut__10dLytShop_cFv = .text:0x802A6010; // type:function size:0x4 +executeState_SelectOut__10dLytShop_cFv = .text:0x802A6020; // type:function size:0x64 +finalizeState_SelectOut__10dLytShop_cFv = .text:0x802A6090; // type:function size:0x4 +initializeState_OutIn__10dLytShop_cFv = .text:0x802A60A0; // type:function size:0x4 +executeState_OutIn__10dLytShop_cFv = .text:0x802A60B0; // type:function size:0x5C +finalizeState_OutIn__10dLytShop_cFv = .text:0x802A6110; // type:function size:0x4 +initializeState_MaterialCheck__10dLytShop_cFv = .text:0x802A6120; // type:function size:0x4 +executeState_MaterialCheck__10dLytShop_cFv = .text:0x802A6130; // type:function size:0x10C +finalizeState_MaterialCheck__10dLytShop_cFv = .text:0x802A6240; // type:function size:0x4 +initializeState_Out__10dLytShop_cFv = .text:0x802A6250; // type:function size:0x4 +executeState_Out__10dLytShop_cFv = .text:0x802A6260; // type:function size:0x5C +finalizeState_Out__10dLytShop_cFv = .text:0x802A62C0; // type:function size:0x4 +initializeState_InOut__10dLytShop_cFv = .text:0x802A62D0; // type:function size:0x4 +executeState_InOut__10dLytShop_cFv = .text:0x802A62E0; // type:function size:0x5C +finalizeState_InOut__10dLytShop_cFv = .text:0x802A6340; // type:function size:0x4 +initializeState_End__10dLytShop_cFv = .text:0x802A6350; // type:function size:0x4 +executeState_End__10dLytShop_cFv = .text:0x802A6360; // type:function size:0x4 +finalizeState_End__10dLytShop_cFv = .text:0x802A6370; // type:function size:0x4 +dLytShop_c_classInit__Fv = .text:0x802A6380; // type:function size:0xF8 +__dt__23sFState_c<10dLytShop_c>Fv = .text:0x802A6480; // type:function size:0x58 +__dt__26sFStateFct_c<10dLytShop_c>Fv = .text:0x802A64E0; // type:function size:0x6C +__dt__79sStateMgr_c<10dLytShop_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x802A6550; // type:function size:0xA0 +__dt__49sFStateMgr_c<10dLytShop_c,20sStateMethodUsr_FI_c>Fv = .text:0x802A65F0; // type:function size:0xA4 +__dt__14dLytShopMain_cFv = .text:0x802A66A0; // type:function size:0x1E8 +build__10dLytShop_cFv = .text:0x802A6890; // type:function size:0x54 +create__10dLytShop_cFv = .text:0x802A68F0; // type:function size:0x6C +execute__10dLytShop_cFv = .text:0x802A6960; // type:function size:0xB0 +getStateID__79sStateMgr_c<10dLytShop_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x802A6A10; // type:function size:0x10 +executeState__79sStateMgr_c<10dLytShop_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x802A6A20; // type:function size:0x10 +draw__10dLytShop_cFv = .text:0x802A6A30; // type:function size:0x78 +doDelete__10dLytShop_cFv = .text:0x802A6AB0; // type:function size:0x44 fn_802A6B00 = .text:0x802A6B00; // type:function size:0x8 -fn_802A6B10 = .text:0x802A6B10; // type:function size:0x28C -fn_802A6DA0 = .text:0x802A6DA0; // type:function size:0x60 -fn_802A6E00 = .text:0x802A6E00; // type:function size:0xC -fn_802A6E10 = .text:0x802A6E10; // type:function size:0x60 -fn_802A6E70 = .text:0x802A6E70; // type:function size:0xC -fn_802A6E80 = .text:0x802A6E80; // type:function size:0x1C -fn_802A6EA0 = .text:0x802A6EA0; // type:function size:0x1C -fn_802A6EC0 = .text:0x802A6EC0; // type:function size:0x1C -fn_802A6EE0 = .text:0x802A6EE0; // type:function size:0x1C -fn_802A6F00 = .text:0x802A6F00; // type:function size:0x1C -fn_802A6F20 = .text:0x802A6F20; // type:function size:0x1C -fn_802A6F40 = .text:0x802A6F40; // type:function size:0x10 -fn_802A6F50 = .text:0x802A6F50; // type:function size:0x10 -fn_802A6F60 = .text:0x802A6F60; // type:function size:0x10 -fn_802A6F70 = .text:0x802A6F70; // type:function size:0x10 -fn_802A6F80 = .text:0x802A6F80; // type:function size:0x10 -fn_802A6F90 = .text:0x802A6F90; // type:function size:0x10 -fn_802A6FA0 = .text:0x802A6FA0; // type:function size:0x10 -fn_802A6FB0 = .text:0x802A6FB0; // type:function size:0x10 -fn_802A6FC0 = .text:0x802A6FC0; // type:function size:0x10 -fn_802A6FD0 = .text:0x802A6FD0; // type:function size:0x10 -fn_802A6FE0 = .text:0x802A6FE0; // type:function size:0x10 -fn_802A6FF0 = .text:0x802A6FF0; // type:function size:0x10 -fn_802A7000 = .text:0x802A7000; // type:function size:0x10 -fn_802A7010 = .text:0x802A7010; // type:function size:0x30 -fn_802A7040 = .text:0x802A7040; // type:function size:0x30 -fn_802A7070 = .text:0x802A7070; // type:function size:0x30 -fn_802A70A0 = .text:0x802A70A0; // type:function size:0x30 -fn_802A70D0 = .text:0x802A70D0; // type:function size:0x30 -fn_802A7100 = .text:0x802A7100; // type:function size:0x30 -dLytShop__initStates = .text:0x802A7130; // type:function size:0xCD0 -dLytShopMain__stateDtor = .text:0x802A7E00; // type:function size:0x58 -dLytShop__dtor = .text:0x802A7E60; // type:function size:0x58 -fn_802A7EC0 = .text:0x802A7EC0; // type:function size:0x88 -fn_802A7F50 = .text:0x802A7F50; // type:function size:0x88 +__dt__10dLytShop_cFv = .text:0x802A6B10; // type:function size:0x28C +build__26sFStateFct_c<10dLytShop_c>FRC12sStateIDIf_c = .text:0x802A6DA0; // type:function size:0x60 +dispose__26sFStateFct_c<10dLytShop_c>FRP10sStateIf_c = .text:0x802A6E00; // type:function size:0xC +build__30sFStateFct_c<14dLytShopMain_c>FRC12sStateIDIf_c = .text:0x802A6E10; // type:function size:0x60 +dispose__30sFStateFct_c<14dLytShopMain_c>FRP10sStateIf_c = .text:0x802A6E70; // type:function size:0xC +initialize__23sFState_c<10dLytShop_c>Fv = .text:0x802A6E80; // type:function size:0x1C +execute__23sFState_c<10dLytShop_c>Fv = .text:0x802A6EA0; // type:function size:0x1C +finalize__23sFState_c<10dLytShop_c>Fv = .text:0x802A6EC0; // type:function size:0x1C +initialize__27sFState_c<14dLytShopMain_c>Fv = .text:0x802A6EE0; // type:function size:0x1C +execute__27sFState_c<14dLytShopMain_c>Fv = .text:0x802A6F00; // type:function size:0x1C +finalize__27sFState_c<14dLytShopMain_c>Fv = .text:0x802A6F20; // type:function size:0x1C +initializeState__79sStateMgr_c<10dLytShop_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x802A6F40; // type:function size:0x10 +finalizeState__79sStateMgr_c<10dLytShop_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x802A6F50; // type:function size:0x10 +refreshState__79sStateMgr_c<10dLytShop_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x802A6F60; // type:function size:0x10 +getState__79sStateMgr_c<10dLytShop_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x802A6F70; // type:function size:0x10 +getNewStateID__79sStateMgr_c<10dLytShop_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x802A6F80; // type:function size:0x10 +getOldStateID__79sStateMgr_c<10dLytShop_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x802A6F90; // type:function size:0x10 +initializeState__83sStateMgr_c<14dLytShopMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x802A6FA0; // type:function size:0x10 +finalizeState__83sStateMgr_c<14dLytShopMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x802A6FB0; // type:function size:0x10 +refreshState__83sStateMgr_c<14dLytShopMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x802A6FC0; // type:function size:0x10 +getState__83sStateMgr_c<14dLytShopMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x802A6FD0; // type:function size:0x10 +getNewStateID__83sStateMgr_c<14dLytShopMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x802A6FE0; // type:function size:0x10 +getStateID__83sStateMgr_c<14dLytShopMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x802A6FF0; // type:function size:0x10 +getOldStateID__83sStateMgr_c<14dLytShopMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x802A7000; // type:function size:0x10 +finalizeState__29sFStateID_c<14dLytShopMain_c>CFR14dLytShopMain_c = .text:0x802A7010; // type:function size:0x30 +executeState__29sFStateID_c<14dLytShopMain_c>CFR14dLytShopMain_c = .text:0x802A7040; // type:function size:0x30 +initializeState__29sFStateID_c<14dLytShopMain_c>CFR14dLytShopMain_c = .text:0x802A7070; // type:function size:0x30 +finalizeState__25sFStateID_c<10dLytShop_c>CFR10dLytShop_c = .text:0x802A70A0; // type:function size:0x30 +executeState__25sFStateID_c<10dLytShop_c>CFR10dLytShop_c = .text:0x802A70D0; // type:function size:0x30 +initializeState__25sFStateID_c<10dLytShop_c>CFR10dLytShop_c = .text:0x802A7100; // type:function size:0x30 +__sinit_\d_lyt_shop_cpp = .text:0x802A7130; // type:function size:0xCD0 +__dt__29sFStateID_c<14dLytShopMain_c>Fv = .text:0x802A7E00; // type:function size:0x58 +__dt__25sFStateID_c<10dLytShop_c>Fv = .text:0x802A7E60; // type:function size:0x58 +isSameName__25sFStateID_c<10dLytShop_c>CFPCc = .text:0x802A7EC0; // type:function size:0x88 +isSameName__29sFStateID_c<14dLytShopMain_c>CFPCc = .text:0x802A7F50; // type:function size:0x88 initializeState_ModeNone__17dLytDepositMain_cFv = .text:0x802A7FE0; // type:function size:0x4 executeState_ModeNone__17dLytDepositMain_cFv = .text:0x802A7FF0; // type:function size:0x10 finalizeState_ModeNone__17dLytDepositMain_cFv = .text:0x802A8000; // type:function size:0x4 @@ -37336,7 +37336,10 @@ lbl_8053C3F4 = .data:0x8053C3F4; // type:object size:0xA data:string lbl_8053C400 = .data:0x8053C400; // type:object size:0xB data:string jumptable_8053C40C = .data:0x8053C40C; // type:object size:0x24 scope:local jumptable_8053C430 = .data:0x8053C430; // type:object size:0x24 scope:local -lbl_8053C454 = .data:0x8053C454; // type:object size:0x44 +lbl_8053C454 = .data:0x8053C454; // type:object size:0xF data:string +lbl_8053C464 = .data:0x8053C464; // type:object size:0x13 data:string +lbl_8053C478 = .data:0x8053C478; // type:object size:0x10 data:string +lbl_8053C488 = .data:0x8053C488; // type:object size:0xF data:string lbl_8053C498 = .data:0x8053C498; // type:object size:0xD data:string lbl_8053C4A8 = .data:0x8053C4A8; // type:object size:0xD data:string lbl_8053C4B8 = .data:0x8053C4B8; // type:object size:0xD data:string @@ -37364,18 +37367,18 @@ lbl_8053C6D0 = .data:0x8053C6D0; // type:object size:0xD data:string lbl_8053C6E0 = .data:0x8053C6E0; // type:object size:0x10 data:4byte g_profile_LYT_SHOP = .data:0x8053C6F0; // type:object size:0x10 lbl_8053C700 = .data:0x8053C700; // type:object size:0x18 data:string -dLytShop__vtable = .data:0x8053C718; // type:object size:0x50 -lbl_8053C768 = .data:0x8053C768; // type:object size:0x30 -lbl_8053C798 = .data:0x8053C798; // type:object size:0x30 -lbl_8053C7C8 = .data:0x8053C7C8; // type:object size:0x18 -lbl_8053C7E0 = .data:0x8053C7E0; // type:object size:0x18 -lbl_8053C7F8 = .data:0x8053C7F8; // type:object size:0x10 -lbl_8053C808 = .data:0x8053C808; // type:object size:0x30 -lbl_8053C838 = .data:0x8053C838; // type:object size:0x30 -lbl_8053C868 = .data:0x8053C868; // type:object size:0x18 -lbl_8053C880 = .data:0x8053C880; // type:object size:0x6E0 -lbl_8053CF60 = .data:0x8053CF60; // type:object size:0x34 -lbl_8053CF94 = .data:0x8053CF94; // type:object size:0x34 +__vt__10dLytShop_c = .data:0x8053C718; // type:object size:0x50 +__vt__49sFStateMgr_c<10dLytShop_c,20sStateMethodUsr_FI_c> = .data:0x8053C768; // type:object size:0x30 +__vt__79sStateMgr_c<10dLytShop_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x8053C798; // type:object size:0x30 +__vt__26sFStateFct_c<10dLytShop_c> = .data:0x8053C7C8; // type:object size:0x18 +__vt__23sFState_c<10dLytShop_c> = .data:0x8053C7E0; // type:object size:0x18 +__vt__14dLytShopMain_c = .data:0x8053C7F8; // type:object size:0x10 +__vt__53sFStateMgr_c<14dLytShopMain_c,20sStateMethodUsr_FI_c> = .data:0x8053C808; // type:object size:0x30 +__vt__83sStateMgr_c<14dLytShopMain_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x8053C838; // type:object size:0x30 +__vt__30sFStateFct_c<14dLytShopMain_c> = .data:0x8053C868; // type:object size:0x18 +__vt__27sFState_c<14dLytShopMain_c> = .data:0x8053C880; // type:object size:0x6E0 +__vt__29sFStateID_c<14dLytShopMain_c> = .data:0x8053CF60; // type:object size:0x34 +__vt__25sFStateID_c<10dLytShop_c> = .data:0x8053CF94; // type:object size:0x34 @24934 = .data:0x8053CFC8; // type:object size:0x17 scope:local data:string ...data.0 = .data:0x8053CFC8; // type:label scope:local @24935 = .data:0x8053CFE0; // 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 b08a0fa7..24fcd785 100644 --- a/include/d/a/d_a_item.h +++ b/include/d/a/d_a_item.h @@ -48,6 +48,7 @@ public: static void spawnDrop(u16 item, u32 room, const mVec3_c &pos, const mAng3_c &rot); static void giveItem22(ITEM_ID, s32, s32); static void giveItem(ITEM_ID, s32, s32); + // TODO should these be u16? static u32 checkFlag(u32 flag); static bool hasItem(u32 flag) { return checkFlag(flag); diff --git a/include/d/lyt/d_lyt_common_icon_item_maps.h b/include/d/lyt/d_lyt_common_icon_item_maps.h index 248ada9c..53f3f73d 100644 --- a/include/d/lyt/d_lyt_common_icon_item_maps.h +++ b/include/d/lyt/d_lyt_common_icon_item_maps.h @@ -55,7 +55,7 @@ #define LYT_CMN_ItemInvalid (18) // ------------------------- // Pouch Items -#define LYT_CMN_PouchPotionHealyh (0) // [12] uc_bottleKusuriA_00.tpl +#define LYT_CMN_PouchPotionHealth (0) // [12] uc_bottleKusuriA_00.tpl #define LYT_CMN_PouchBottle (1) // [ 5] uc_bottleEmpty_00.tpl #define LYT_CMN_PouchShieldWoodA (2) // [39] uc_shieldWoodA_00.tpl #define LYT_CMN_PouchShieldIronA (3) // [36] uc_shieldIronA_00.tpl @@ -68,8 +68,8 @@ #define LYT_CMN_PouchPotionAirPlus (10) // [ 4] uc_bottleAirB_00.tpl #define LYT_CMN_PouchPotionStaminaPlus (11) // [ 8] uc_bottleGutsB_00.tpl #define LYT_CMN_PouchBlank4 (12) // [ 0] tr_black4_00.tpl -#define LYT_CMN_PouchPotionGaurdian (13) // [16] uc_bottleMutekiA_00.tpl -#define LYT_CMN_PouchPotionGaurdianPlus (14) // [17] uc_bottleMutekiB_00.tpl +#define LYT_CMN_PouchPotionGuardian (13) // [16] uc_bottleMutekiA_00.tpl +#define LYT_CMN_PouchPotionGuardianPlus (14) // [17] uc_bottleMutekiB_00.tpl #define LYT_CMN_PouchShieldWoodB (15) // [40] uc_shieldWoodB_00.tpl #define LYT_CMN_PouchShieldWoodC (16) // [41] uc_shieldWoodC_00.tpl #define LYT_CMN_PouchShieldIronB (17) // [37] uc_shieldIronB_00.tpl diff --git a/include/d/lyt/d_lyt_common_icon_material.h b/include/d/lyt/d_lyt_common_icon_material.h index 8febea8a..4b87781c 100644 --- a/include/d/lyt/d_lyt_common_icon_material.h +++ b/include/d/lyt/d_lyt_common_icon_material.h @@ -132,6 +132,11 @@ private: class dLytCommonIconMaterial_c : public d2d::dSubPane { public: + enum Variant_e { + BUG, + TREASURE, + }; + dLytCommonIconMaterial_c() : mStateMgr(*this, sStateID::null), mPart(2) {} ~dLytCommonIconMaterial_c() {} diff --git a/include/d/lyt/d_lyt_deposit.h b/include/d/lyt/d_lyt_deposit.h index 22689646..082750b9 100644 --- a/include/d/lyt/d_lyt_deposit.h +++ b/include/d/lyt/d_lyt_deposit.h @@ -139,8 +139,6 @@ private: STATE_FUNC_DECLARE(dLytDepositMain_c, ModeArrangementOut); STATE_FUNC_DECLARE(dLytDepositMain_c, ModeOut); - STATE_MGR_DEFINE_UTIL_CHANGESTATE(dLytDepositMain_c); - /* 0x00004 */ UI_STATE_MGR_DECLARE(dLytDepositMain_c); /* 0x00040 */ d2d::LytBase_c mLyt; /* 0x000D0 */ d2d::AnmGroup_c mAnm[36]; @@ -227,7 +225,6 @@ private: STATE_FUNC_DECLARE(dLytDeposit_c, Out); STATE_MGR_DEFINE_UTIL_ISSTATE(dLytDeposit_c); - STATE_MGR_DEFINE_UTIL_CHANGESTATE(dLytDeposit_c); /* 0x0008C */ UI_STATE_MGR_DECLARE(dLytDeposit_c); /* 0x000C8 */ d2d::ResAccIf_c mResAcc; diff --git a/include/d/lyt/d_lyt_shop.h b/include/d/lyt/d_lyt_shop.h index 74b38903..e84b96ab 100644 --- a/include/d/lyt/d_lyt_shop.h +++ b/include/d/lyt/d_lyt_shop.h @@ -1,14 +1,174 @@ #ifndef D_LYT_SHOP_H #define D_LYT_SHOP_H -class dLytShop_c { +#include "d/d_cursor_hit_check.h" +#include "d/d_pad_nav.h" +#include "d/lyt/d2d.h" +#include "d/lyt/d_lyt_base.h" +#include "d/lyt/d_lyt_common_icon_item.h" +#include "d/lyt/d_lyt_common_icon_material.h" +#include "nw4r/lyt/lyt_bounding.h" +#include "s/s_State.hpp" + +class dLytShopMain_c { public: + enum Service_e { + SERVICE_POTION_INFUSE, + SERVICE_GEAR_UPGRADE, + SERVICE_SHIELD_REPAIR, + }; + +private: + enum Phase_e { + PHASE_SELECT_ITEM, + PHASE_MATERIAL_CHECK, + }; + +public: + dLytShopMain_c(); + virtual ~dLytShopMain_c() { + dPadNav::setNavEnabled(false, false); + } + + bool build(d2d::ResAccIf_c *resAcc); + bool execute(); + bool draw(); + bool remove(); + + bool isIdle() const { + return mIsIdle; + } + + s32 getService() const { + return mService; + } + + bool getField_0x116DD() const { + return field_0x116DD; + } + + bool getField_0x116DE() const { + return field_0x116DE; + } + + void retry() { + mIsIdle = false; + } + + void setModeNone(); + void setModeSelectIn(); + void setModeSelectCheck(); + void setModeSelectOut(); + void setModeOutIn(); + void setModeMaterialCheck(); + void setModeOut(); + void setModeInOut(); + +private: + static const s32 NUM_ITEMS = 12; + + void buildSubpanes(); + void handleNavigation(); + s32 checkNav(); + void buildMaterialCheckIcons(d2d::ResAccIf_c *resAcc, u8 variant); + + void addItemToDisplayed(s32 itemIdx, s32 itemKind, s32 pouchSlot); + void updateShopStuffMaybe(); + void prepareRemodelStoreStuff(s32 service); + void showShopLytMaybe(); + void showPriceMaybe(s32 value); + + s32 getItemTier(s32 item); + s32 calcNumDigits(s32 value); + + void fn_802A5CA0(bool); + void fn_802A5BD0(); + s32 fn_802A4490(s32); + s32 fn_802A4500(s32); + s32 fn_802A5760(u8); + s32 fn_802A5780(u8); + + STATE_FUNC_DECLARE(dLytShopMain_c, ModeNone); + STATE_FUNC_DECLARE(dLytShopMain_c, ModeSelectIn); + STATE_FUNC_DECLARE(dLytShopMain_c, ModeSelectCheck); + STATE_FUNC_DECLARE(dLytShopMain_c, ModeSelectOut); + STATE_FUNC_DECLARE(dLytShopMain_c, ModeOutIn); + STATE_FUNC_DECLARE(dLytShopMain_c, ModeMaterialCheck); + STATE_FUNC_DECLARE(dLytShopMain_c, ModeOut); + STATE_FUNC_DECLARE(dLytShopMain_c, ModeInOut); + + /* 0x00004 */ UI_STATE_MGR_DECLARE(dLytShopMain_c); + /* 0x00040 */ d2d::LytBase_c mLyts[3]; + /* 0x001F0 */ d2d::AnmGroup_c mAnmItemSelect[9]; + /* 0x00430 */ d2d::AnmGroup_c mAnmMaterialCheck[18]; + /* 0x008B0 */ d2d::AnmGroup_c mAnmShopInfo[2]; + /* 0x00930 */ nw4r::lyt::Bounding *mpItemBoundings[13]; + /* 0x00964 */ nw4r::lyt::Bounding *mpMaterialCheckChoiceBoundings[2]; + /* 0x0096C */ dCursorHitCheckLyt_c mCsHitChecks[3]; + /* 0x009E4 */ dLytCommonIconItem_c mBWheelOrPouchItemIcons[24]; + /* 0x0CAA4 */ dLytCommonIconItem_c mUpgradePreviewIcons[4]; + /* 0x0EAC4 */ dLytCommonIconMaterial_c mUpgradeCostIcons[8]; + /* 0x11484 */ d2d::SubPaneList mItemList; + /* 0x11490 */ d2d::SubPaneListNode mBWheelOrPouchNodes[24]; + /* 0x11610 */ d2d::SubPaneList mUpgradeList; + /* 0x1161C */ d2d::SubPaneListNode mUpgradeNodes[12]; + /* 0x116DC */ bool mIsIdle; + /* 0x116DD */ bool field_0x116DD; + /* 0x116DE */ bool field_0x116DE; + /* 0x116DF */ bool mUpgradeLoaded; + /* 0x116E0 */ bool mPrevPointerVisible; + /* 0x116E1 */ bool field_0x116E1; + /* 0x116E4 */ s32 mPhase; + /* 0x116E8 */ s32 mCurrentNavTarget; + /* 0x116EC */ s32 mStateStep; + /* 0x116F0 */ s32 mUpgradeIdx; + /* 0x116F4 */ s32 mService; + /* 0x116F8 */ s32 mItemCount; + /* 0x116FC */ s32 mUpgradeCostCount; + /* 0x11700 */ UNKWORD field_0x11700; + /* 0x11704 */ s32 mItemUpgradeIdxes[NUM_ITEMS]; + /* 0x11734 */ s32 mItemPouchSlots[NUM_ITEMS]; + /* 0x11764 */ u8 mItemKinds[NUM_ITEMS]; + /* 0x11770 */ u8 field_0x11770[8]; +}; + +class dLytShop_c : public dLytBase_c { +public: + dLytShop_c() : mStateMgr(*this) {} + virtual ~dLytShop_c() { + removeLyt(); + } + static dLytShop_c *GetInstance() { return sInstance; } + virtual bool build() override; + virtual int create() override; + virtual int execute() override; + virtual int draw() override; + virtual int doDelete() override; + private: static dLytShop_c *sInstance; + + STATE_FUNC_DECLARE(dLytShop_c, None); + STATE_FUNC_DECLARE(dLytShop_c, SelectIn); + STATE_FUNC_DECLARE(dLytShop_c, SelectCheck); + STATE_FUNC_DECLARE(dLytShop_c, SelectOut); + STATE_FUNC_DECLARE(dLytShop_c, OutIn); + STATE_FUNC_DECLARE(dLytShop_c, MaterialCheck); + STATE_FUNC_DECLARE(dLytShop_c, Out); + STATE_FUNC_DECLARE(dLytShop_c, InOut); + STATE_FUNC_DECLARE(dLytShop_c, End); + + STATE_MGR_DEFINE_UTIL_ISSTATE(dLytShop_c); + + /* 0x0008C */ UI_STATE_MGR_DECLARE(dLytShop_c); + /* 0x000C8 */ d2d::ResAccIf_c mResAcc; + /* 0x00438 */ dLytShopMain_c mMain; + /* 0x11BB0 */ bool mInRequest; + /* 0x11BB1 */ bool mIsMovingOut; }; #endif diff --git a/include/d/lyt/d_lyt_util_items.h b/include/d/lyt/d_lyt_util_items.h index d6bf4819..00ea2d3e 100644 --- a/include/d/lyt/d_lyt_util_items.h +++ b/include/d/lyt/d_lyt_util_items.h @@ -63,6 +63,7 @@ void getCaptionItemLabel(s32 itemId, SizedString<32> &buf); void getDowsingLabel(s32 itemId, SizedString<32> &buf); void getPauseCategoryLabel(s32 itemId, SizedString<32> &buf); +// TODO these could be u16 const wchar_t *getItemText(s32 itemId); const wchar_t *getCaptionItemText(s32 itemId); const wchar_t *getDowsingText(s32 itemId); @@ -76,8 +77,13 @@ u8 getPouchItemForSlot(s32 slot, bool unk); bool hasPouchSlot(s32 slot, bool unk); s32 getPouchItemAmount(s32 slot, bool unk); u8 getPouchItemNumberColor(s32 slot, bool unk); +// not sure about this one f32 getPouchShieldDurability(s32 slot, bool unk); u32 getPouchItemIdForIndex(s32 slot, bool unk); +// not sure about this one +f32 getPouchShieldDurability2(s32 slot, bool unk); +// not sure about this one +s32 getEvenMoreShieldStuff(s32 slot, bool unk); u8 getDepositItemForSlot(s32 slot); s32 getDepositItemAmount(s32 slot); diff --git a/src/d/d_room.cpp b/src/d/d_room.cpp index 9d6c48e7..85a0d3ef 100644 --- a/src/d/d_room.cpp +++ b/src/d/d_room.cpp @@ -3,6 +3,7 @@ #include "common.h" #include "d/a/d_a_base.h" #include "d/a/d_a_item.h" +#include "d/a/d_a_itembase.h" #include "d/a/obj/d_a_obj_base.h" #include "d/col/bg/d_bg_s.h" #include "d/col/bg/d_bg_w_base.h" @@ -287,7 +288,7 @@ void dRoom_c::drawOnMapIfVisible(mMtx_c *mtx, int param) { bool drawFully = true; if (dStageMgr_c::GetInstance()->isAreaTypeDungeonOrBoss()) { drawFully = dStage_c::GetInstance()->hasVisitedRoom(roomid); - if (!drawFully && !dAcItem_c::checkFlag(/* DUNGEON_MAP_FI */ 0x32)) { + if (!drawFully && !dAcItem_c::checkFlag(ITEM_DUNGEON_MAP_FI)) { return; } } else { diff --git a/src/d/lyt/d_lyt_shop.cpp b/src/d/lyt/d_lyt_shop.cpp new file mode 100644 index 00000000..6fa15ee0 --- /dev/null +++ b/src/d/lyt/d_lyt_shop.cpp @@ -0,0 +1,1909 @@ +#include "d/lyt/d_lyt_shop.h" + +#include "common.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_cs_game.h" +#include "d/d_cursor_hit_check.h" +#include "d/d_message.h" +#include "d/d_pad.h" +#include "d/d_pad_nav.h" +#include "d/d_rumble.h" +#include "d/lyt/d2d.h" +#include "d/lyt/d_lyt_common_icon_item.h" +#include "d/lyt/d_lyt_common_icon_item_maps.h" +#include "d/lyt/d_lyt_common_icon_material.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 "f/f_profile.h" +#include "m/m_pad.h" +#include "nw4r/lyt/lyt_group.h" +#include "nw4r/types_nw4r.h" +#include "sized_string.h" +#include "toBeSorted/arc_managers/layout_arc_manager.h" +#include "toBeSorted/counters/counter.h" + +#include + +struct ShopUpgradeMaterialCost { + /* 0x0 */ s16 itemId; + /* 0x2 */ s16 amount; +}; + +struct ShopUpgradeCosts { + /* 0x0 */ s16 newItemId; + /* 0x2 */ s16 oldItemId; + /* 0x4 */ s16 price; + /* 0x6 */ ShopUpgradeMaterialCost matCosts[4]; +}; + +struct ShopUpgradeItemData { + /* 0x0 */ s32 itemId; + /* 0x4 */ bool canBeUpgraded; +}; + +static const ShopUpgradeCosts sGearUpgrades[] = { + { ITEM_BANDED_SHIELD, + ITEM_WOODEN_SHIELD, 30, + { + {ITEM_AMBER_RELIC, 2}, + {ITEM_MONSTER_CLAW, 1}, + {ITEM_JELLY_BLOB, 1}, + {-1, -1}, + }}, + { ITEM_BRACED_SHIELD, + ITEM_BANDED_SHIELD, 50, + { + {ITEM_AMBER_RELIC, 3}, + {ITEM_MONSTER_CLAW, 2}, + {ITEM_TUMBLE_WEED, 2}, + {ITEM_ORNAMENTAL_SKULL, 1}, + }}, + { ITEM_REINFORCED_SHIELD, + ITEM_IRON_SHIELD, 50, + { + {ITEM_ELDIN_ORE, 2}, + {ITEM_MONSTER_CLAW, 2}, + {ITEM_ORNAMENTAL_SKULL, 2}, + {-1, -1}, + }}, + { ITEM_FORTIFIED_SHIELD, + ITEM_REINFORCED_SHIELD, 100, + { + {ITEM_ELDIN_ORE, 3}, + {ITEM_MONSTER_CLAW, 3}, + {ITEM_TUMBLE_WEED, 3}, + {ITEM_BLUE_BIRD_FEATHER, 1}, + }}, + { ITEM_DIVINE_SHIELD, + ITEM_SACRED_SHIELD, 100, + { + {ITEM_DUSK_RELIC, 1}, + {ITEM_BIRD_FEATHER, 2}, + {ITEM_ORNAMENTAL_SKULL, 3}, + {-1, -1}, + }}, + { ITEM_GODDESS_SHIELD, + ITEM_DIVINE_SHIELD, 150, + { + {ITEM_DUSK_RELIC, 4}, + {ITEM_BIRD_FEATHER, 3}, + {ITEM_MONSTER_HORN, 3}, + {ITEM_BLUE_BIRD_FEATHER, 1}, + }}, + { ITEM_MIGHTY_SCATTERSHOT, + ITEM_SLINGSHOT, 50, + { + {ITEM_DUSK_RELIC, 2}, + {ITEM_AMBER_RELIC, 2}, + {ITEM_JELLY_BLOB, 3}, + {-1, -1}, + }}, + { ITEM_QUICK_BEETLE, + ITEM_HOOK_BEETLE, 50, + { + {ITEM_ANCIENT_FLOWER, 2}, + {ITEM_HORNET_LARVAE, 2}, + {ITEM_GOLDEN_SKULL, 1}, + {-1, -1}, + }}, + { ITEM_TOUGH_BEETLE, + ITEM_QUICK_BEETLE, 50, + { + {ITEM_ANCIENT_FLOWER, 3}, + {ITEM_AMBER_RELIC, 4}, + {ITEM_BLUE_BIRD_FEATHER, 1}, + {ITEM_GODDESS_PLUME, 1}, + }}, + { ITEM_IRON_BOW, + ITEM_BOW, 50, + { + {ITEM_TUMBLE_WEED, 3}, + {ITEM_EVIL_CRYSTAL, 1}, + {ITEM_MONSTER_CLAW, 3}, + {ITEM_ELDIN_ORE, 2}, + }}, + { ITEM_SACRED_BOW, + ITEM_IRON_BOW, 100, + { + {ITEM_TUMBLE_WEED, 5}, + {ITEM_EVIL_CRYSTAL, 2}, + {ITEM_LIZARD_TAIL, 3}, + {ITEM_GODDESS_PLUME, 1}, + }}, + {ITEM_MEDIUM_SEED_SATCHEL, + ITEM_SMALL_SEED_SATCHEL, 50, + { + {ITEM_AMBER_RELIC, 4}, + {ITEM_MONSTER_CLAW, 3}, + {ITEM_ORNAMENTAL_SKULL, 3}, + {-1, -1}, + }}, + { ITEM_LARGE_SEED_SATCHEL, + ITEM_MEDIUM_SEED_SATCHEL, 100, + { + {ITEM_AMBER_RELIC, 5}, + {ITEM_MONSTER_CLAW, 3}, + {ITEM_GOLDEN_SKULL, 1}, + {ITEM_BLUE_BIRD_FEATHER, 1}, + }}, + { ITEM_MEDIUM_QUIVER, + ITEM_SMALL_QUIVER, 50, + { + {ITEM_MONSTER_HORN, 3}, + {ITEM_DUSK_RELIC, 3}, + {ITEM_AMBER_RELIC, 5}, + {-1, -1}, + }}, + { ITEM_LARGE_QUIVER, + ITEM_MEDIUM_QUIVER, 100, + { + {ITEM_MONSTER_HORN, 2}, + {ITEM_DUSK_RELIC, 3}, + {ITEM_GOLDEN_SKULL, 1}, + {ITEM_GODDESS_PLUME, 1}, + }}, + { ITEM_MEDIUM_BOMB_BAG, + ITEM_SMALL_BOMB_BAG, 50, + { + {ITEM_LIZARD_TAIL, 1}, + {ITEM_ORNAMENTAL_SKULL, 3}, + {ITEM_BLUE_BIRD_FEATHER, 1}, + {-1, -1}, + }}, + { ITEM_LARGE_BOMB_BAG, + ITEM_MEDIUM_BOMB_BAG, 100, + { + {ITEM_LIZARD_TAIL, 3}, + {ITEM_JELLY_BLOB, 4}, + {ITEM_HORNET_LARVAE, 2}, + {ITEM_GOLDEN_SKULL, 1}, + }}, + { ITEM_BIG_BUG_NET, + ITEM_BUG_NET, 100, + { + {ITEM_TUMBLE_WEED, 3}, + {ITEM_ANCIENT_FLOWER, 2}, + {ITEM_EVIL_CRYSTAL, 1}, + {-1, -1}, + }}, +}; + +static const ShopUpgradeCosts sPotionUpgrades[] = { + { ITEM_HEART_POTION_PLUS, + ITEM_HEART_POTION, 20, + { + {ITEM_BLESSED_BUTTERFLY, 3}, + {ITEM_WOODLAND_RHINO_BEETLE, 1}, + {ITEM_VOLCANIC_LADYBUG, 1}, + {-1, -1}, + }}, + { ITEM_HEART_POTION_PLUS_PLUS, + ITEM_HEART_POTION_PLUS, 30, + { + {ITEM_BLESSED_BUTTERFLY, 3}, + {ITEM_DEKU_HORNET, 3}, + {ITEM_SAND_CICADA, 1}, + {ITEM_ELDIN_ROLLER, 1}, + }}, + { ITEM_AIR_POTION_PLUS, + ITEM_AIR_POTION, 20, + { + {ITEM_SKY_STAG_BEETLE, 2}, + {ITEM_SKYLOFT_MANTIS, 2}, + {ITEM_LANAYRU_ANT, 2}, + {-1, -1}, + }}, + { ITEM_STAMINA_POTION_PLUS, + ITEM_STAMINA_POTION, 20, + { + {ITEM_VOLCANIC_LADYBUG, 3}, + {ITEM_SKY_STAG_BEETLE, 2}, + {ITEM_GERUDO_DRAGONFLY, 2}, + {ITEM_FARON_GRASSHOPPER, 1}, + }}, + { ITEM_REVITALIZING_POTION_PLUS, + ITEM_REVITALIZING_POTION, 20, + { + {ITEM_WOODLAND_RHINO_BEETLE, 2}, + {ITEM_SKYLOFT_MANTIS, 2}, + {ITEM_DEKU_HORNET, 3}, + {-1, -1}, + }}, + {ITEM_REVITALIZING_POTION_PLUS_PLUS, + ITEM_REVITALIZING_POTION_PLUS, 30, + { + {ITEM_WOODLAND_RHINO_BEETLE, 2}, + {ITEM_LANAYRU_ANT, 3}, + {ITEM_GERUDO_DRAGONFLY, 1}, + {ITEM_SAND_CICADA, 1}, + }}, + { ITEM_GUARDIAN_POTION_PLUS, + ITEM_GUARDIAN_POTION, 40, + { + {ITEM_FARON_GRASSHOPPER, 1}, + {ITEM_ELDIN_ROLLER, 2}, + {ITEM_BLESSED_BUTTERFLY, 3}, + {ITEM_STARRY_FIREFLY, 3}, + }}, +}; + +static const ShopUpgradeItemData sItemData[] = { + { ITEM_BUG_NET, true}, + { ITEM_BIG_BUG_NET, false}, + { ITEM_SLINGSHOT, true}, + { ITEM_MIGHTY_SCATTERSHOT, false}, + { ITEM_HOOK_BEETLE, true}, + { ITEM_QUICK_BEETLE, true}, + { ITEM_TOUGH_BEETLE, false}, + { ITEM_BOW, true}, + { ITEM_IRON_BOW, true}, + { ITEM_SACRED_BOW, false}, + { ITEM_WOODEN_SHIELD, true}, + { ITEM_BANDED_SHIELD, true}, + { ITEM_BRACED_SHIELD, false}, + { ITEM_IRON_SHIELD, true}, + { ITEM_REINFORCED_SHIELD, true}, + { ITEM_FORTIFIED_SHIELD, false}, + { ITEM_SACRED_SHIELD, true}, + { ITEM_DIVINE_SHIELD, true}, + { ITEM_GODDESS_SHIELD, false}, + { ITEM_SMALL_SEED_SATCHEL, true}, + { ITEM_MEDIUM_SEED_SATCHEL, true}, + { ITEM_LARGE_SEED_SATCHEL, false}, + { ITEM_SMALL_BOMB_BAG, true}, + { ITEM_MEDIUM_BOMB_BAG, true}, + { ITEM_LARGE_BOMB_BAG, false}, + { ITEM_SMALL_QUIVER, true}, + { ITEM_MEDIUM_QUIVER, true}, + { ITEM_LARGE_QUIVER, false}, + { ITEM_HEART_POTION, true}, + { ITEM_HEART_POTION_PLUS, true}, + { ITEM_HEART_POTION_PLUS_PLUS, false}, + { ITEM_AIR_POTION, true}, + { ITEM_AIR_POTION_PLUS, false}, + { ITEM_STAMINA_POTION, true}, + { ITEM_STAMINA_POTION_PLUS, false}, + { ITEM_REVITALIZING_POTION, true}, + { ITEM_REVITALIZING_POTION_PLUS, true}, + {ITEM_REVITALIZING_POTION_PLUS_PLUS, false}, + { ITEM_GUARDIAN_POTION, true}, + { ITEM_GUARDIAN_POTION_PLUS, false}, + { ITEM_FARON_GRASSHOPPER, false}, + { ITEM_WOODLAND_RHINO_BEETLE, false}, + { ITEM_DEKU_HORNET, false}, + { ITEM_SKYLOFT_MANTIS, false}, + { ITEM_VOLCANIC_LADYBUG, false}, + { ITEM_BLESSED_BUTTERFLY, false}, + { ITEM_LANAYRU_ANT, false}, + { ITEM_SAND_CICADA, false}, + { ITEM_GERUDO_DRAGONFLY, false}, + { ITEM_ELDIN_ROLLER, false}, + { ITEM_SKY_STAG_BEETLE, false}, + { ITEM_STARRY_FIREFLY, false}, + { ITEM_HORNET_LARVAE, false}, + { ITEM_BIRD_FEATHER, false}, + { ITEM_TUMBLE_WEED, false}, + { ITEM_LIZARD_TAIL, false}, + { ITEM_ELDIN_ORE, false}, + { ITEM_ANCIENT_FLOWER, false}, + { ITEM_AMBER_RELIC, false}, + { ITEM_DUSK_RELIC, false}, + { ITEM_JELLY_BLOB, false}, + { ITEM_MONSTER_CLAW, false}, + { ITEM_MONSTER_HORN, false}, + { ITEM_ORNAMENTAL_SKULL, false}, + { ITEM_EVIL_CRYSTAL, false}, + { ITEM_BLUE_BIRD_FEATHER, false}, + { ITEM_GOLDEN_SKULL, false}, + { ITEM_GODDESS_PLUME, false}, +}; + +// clang-format off +static const s32 sLytIconMapping[68] = { + LYT_CMN_ItemBugnet, + LYT_CMN_ItemBigBugnet, + LYT_CMN_ItemSlingshot, + LYT_CMN_ItemScattershot, + LYT_CMN_ItemHookBeetle, + LYT_CMN_ItemQuickBeetle, + LYT_CMN_ItemToughBeetle, + LYT_CMN_ItemBow, + LYT_CMN_ItemIronBow, + LYT_CMN_ItemSacredBow, + LYT_CMN_PouchShieldWoodA, + LYT_CMN_PouchShieldWoodB, + LYT_CMN_PouchShieldWoodC, + LYT_CMN_PouchShieldIronA, + LYT_CMN_PouchShieldIronB, + LYT_CMN_PouchShieldIronC, + LYT_CMN_PouchShieldHolyA, + LYT_CMN_PouchShieldHolyB, + LYT_CMN_PouchShieldHolyC, + LYT_CMN_PouchSeedSatchelSmall, + LYT_CMN_PouchSeedSatchelMed, + LYT_CMN_PouchSeedSatchelBig, + LYT_CMN_PouchBombBagSmall, + LYT_CMN_PouchBombBagMed, + LYT_CMN_PouchBombBagBig, + LYT_CMN_PouchQuiverSmall, + LYT_CMN_PouchQuiverMed, + LYT_CMN_PouchQuiverBig, + LYT_CMN_PouchPotionHealth, + LYT_CMN_PouchPotionHealthPlus, + LYT_CMN_PouchPotionHealthPlusPlusFull, + LYT_CMN_PouchPotionAir, + LYT_CMN_PouchPotionAirPlus, + LYT_CMN_PouchPotionStamina, + LYT_CMN_PouchPotionStaminaPlus, + LYT_CMN_PouchPotionRepair, + LYT_CMN_PouchPotionRepairPlus, + LYT_CMN_PouchPotionRepairPlusPlusFull, + LYT_CMN_PouchPotionGuardian, + LYT_CMN_PouchPotionGuardianPlus, + LYT_CMN_BugFaronGrasshopper, + LYT_CMN_BugWoodlandRhinoBetle, + LYT_CMN_BugDekuHornet, + LYT_CMN_BugSkyloftMantis, + LYT_CMN_BugVolcanicLadyBug, + LYT_CMN_BugBlessedButterfly, + LYT_CMN_BugLanayruAnt, + LYT_CMN_BugSandCicada, + LYT_CMN_BugGerudoDragonfly, + LYT_CMN_BugEldinRoller, + LYT_CMN_BugSkyStagBeetle, + LYT_CMN_BugStarryFirefly, + LYT_CMN_HORNET_LARVAE, + LYT_CMN_BIRD_FEATHER, + LYT_CMN_TUMBLEWEED, + LYT_CMN_LIZALFOS_TAIL, + LYT_CMN_ELDIN_ORE, + LYT_CMN_ANCIENT_FLOWER, + LYT_CMN_AMBER_RELIC, + LYT_CMN_DUSK_RELOC, + LYT_CMN_JELLY_BLOB, + LYT_CMN_MONSTER_CLAW, + LYT_CMN_MONSTER_HORN, + LYT_CMN_ORNAMENTAL_SKULL, + LYT_CMN_EVIL_CRYSTAL, + LYT_CMN_BLUE_BIRD_FEATHER, + LYT_CMN_GOLDEN_SKULL, + LYT_CMN_GODDESS_PLUME, +}; +// clang-format on + +STATE_DEFINE(dLytShopMain_c, ModeNone); +STATE_DEFINE(dLytShopMain_c, ModeSelectIn); +STATE_DEFINE(dLytShopMain_c, ModeSelectCheck); +STATE_DEFINE(dLytShopMain_c, ModeSelectOut); +STATE_DEFINE(dLytShopMain_c, ModeOutIn); +STATE_DEFINE(dLytShopMain_c, ModeMaterialCheck); +STATE_DEFINE(dLytShopMain_c, ModeOut); +STATE_DEFINE(dLytShopMain_c, ModeInOut); + +static const char *sLytNames[] = { + "itemSelect_00.brlyt", + "materialCheck_00.brlyt", + "shopInfo_00.brlyt", +}; + +static const d2d::LytBrlanMapping brlanMapItemSelect[] = { + { "itemSelect_00_in.brlan", "G_inOut_00"}, + { "itemSelect_00_btnOnOff.brlan", "G_btn_00"}, + { "itemSelect_00_btnOnOff.brlan", "G_onOffB_00"}, + { "itemSelect_00_btnLoop.brlan", "G_btnLoop_00"}, + { "itemSelect_00_btnDecide.brlan", "G_btn_00"}, + { "itemSelect_00_out.brlan", "G_inOut_00"}, + { "itemSelect_00_loop.brlan", "G_loop_00"}, + { "itemSelect_00_btnCancel.brlan", "G_btnCancel_00"}, + {"itemSelect_00_shopChange.brlan", "G_change_00"}, +}; + +static const d2d::LytBrlanMapping brlanMapMaterialCheck[] = { + { "materialCheck_00_in.brlan", "G_inOut_00"}, + { "materialCheck_00_out.brlan", "G_inOut_00"}, + { "materialCheck_00_btnOnOff.brlan", "G_btn_00"}, + { "materialCheck_00_btnOnOff.brlan", "G_btn_01"}, + { "materialCheck_00_btnOnOff.brlan", "G_onOffB_00"}, + { "materialCheck_00_btnDecide.brlan", "G_btn_00"}, + { "materialCheck_00_btnDecide.brlan", "G_btn_01"}, + { "materialCheck_00_btnLoop.brlan", "G_btnLoop_00"}, + { "materialCheck_00_btnLoop.brlan", "G_btnLoop_01"}, + { "materialCheck_00_loop.brlan", "G_loop_00"}, + { "materialCheck_00_keta.brlan", "G_keta_00"}, + { "materialCheck_00_itemFlag.brlan", "G_itemFlag_00"}, + { "materialCheck_00_itemFlag.brlan", "G_itemFlag_01"}, + { "materialCheck_00_itemFlag.brlan", "G_itemFlag_02"}, + { "materialCheck_00_itemFlag.brlan", "G_itemFlag_03"}, + {"materialCheck_00_itemNumber.brlan", "G_itemNumber_00"}, + { "materialCheck_00_btnCancel.brlan", "G_btnCancel_00"}, + {"materialCheck_00_shopChange.brlan", "G_change_00"}, +}; + +static const d2d::LytBrlanMapping brlanMapShopInfo[] = { + { "shopInfo_00_in.brlan", "G_inOut_00"}, + {"shopInfo_00_out.brlan", "G_inOut_00"}, +}; + +static const char *sItemSelectBoundings[] = { + "B_item_00", "B_item_01", "B_item_02", "B_item_03", "B_item_04", "B_item_05", "B_item_06", + "B_item_07", "B_item_08", "B_item_09", "B_item_10", "B_item_11", "B_choices_00", +}; + +static const char *sMaterialCheckChoiceBoundings[] = { + "B_choices_00", + "B_choices_01", +}; + +#define SHOP_MATERIAL_CHECK_CHOICE_NUM_BOUNDINGS 2 + +#define SHOP_LYT_ITEM_SELECT 0 +#define SHOP_LYT_MATERIAL_CHECK 1 +#define SHOP_LYT_SHOP_INFO 2 + +#define SHOP_NUM_LYTS 3 + +#define SHOP_ITEM_SELECT_NUM_ANIMS 9 +#define SHOP_MATERIAL_NUM_ANIMS 18 +#define SHOP_SHOP_INFO_NUM_ANIMS 2 + +#define SHOP_ITEM_SELECT_BOUNDING_ITEM_OFFSET 0 +#define SHOP_ITEM_SELECT_BOUNDING_CHOICES 12 + +#define SHOP_ITEM_SELECT_NUM_BOUNDINGS 13 + +void dLytShopMain_c::initializeState_ModeNone() {} +void dLytShopMain_c::executeState_ModeNone() { + mIsIdle = true; +} +void dLytShopMain_c::finalizeState_ModeNone() {} + +void dLytShopMain_c::initializeState_ModeSelectIn() {} +void dLytShopMain_c::executeState_ModeSelectIn() { + if (mAnmItemSelect[0].isEndReached() && mAnmShopInfo[0].isEndReached()) { + mAnmItemSelect[0].setAnimEnable(false); + mAnmShopInfo[0].setAnimEnable(false); + + for (int i = 0; i < NUM_ITEMS; i++) { + mpItemBoundings[i + SHOP_ITEM_SELECT_BOUNDING_ITEM_OFFSET]->SetVisible(false); + } + dCsBase_c::GetInstance()->setVisible(true); + mPhase = PHASE_SELECT_ITEM; + mIsIdle = true; + } +} +void dLytShopMain_c::finalizeState_ModeSelectIn() {} + +void dLytShopMain_c::initializeState_ModeSelectCheck() { + mCurrentNavTarget = -12; + field_0x116DD = false; + field_0x116DE = false; + field_0x11700 = false; +} +void dLytShopMain_c::executeState_ModeSelectCheck() { + if (dPad::getDownTrigB()) { + field_0x116DD = true; + fn_802A5CA0(false); + mIsIdle = true; + } else if (dPad::getDownTrigA() && mCurrentNavTarget >= 0 && + (mCurrentNavTarget < mItemCount || mCurrentNavTarget == 12)) { + if (mCurrentNavTarget == 12) { + field_0x116DD = true; + } + mIsIdle = true; + } else { + handleNavigation(); + } + + if (mIsIdle) { + dPadNav::setNavEnabled(false, false); + } +} +void dLytShopMain_c::finalizeState_ModeSelectCheck() {} + +void dLytShopMain_c::initializeState_ModeSelectOut() {} +void dLytShopMain_c::executeState_ModeSelectOut() { + if (field_0x116DD) { + if (mAnmItemSelect[4].isEndReached()) { + mUpgradeIdx = 0; + mItemCount = 0; + if (mCurrentNavTarget == 12) { + mAnmItemSelect[1].setAnimEnable(false); + } + mCurrentNavTarget = -13; + mIsIdle = true; + } + } else { + if (mBWheelOrPouchItemIcons[mCurrentNavTarget + 12].isDoneDeciding()) { + mUpgradeIdx = mItemUpgradeIdxes[mCurrentNavTarget]; + mIsIdle = true; + } + } +} +void dLytShopMain_c::finalizeState_ModeSelectOut() {} + +void dLytShopMain_c::initializeState_ModeOutIn() {} +void dLytShopMain_c::executeState_ModeOutIn() { + if (mStateStep == 0) { + bool b = false; + if (field_0x116DD) { + if (mAnmItemSelect[4].isEndReached()) { + mAnmItemSelect[4].setAnimEnable(false); + b = true; + } + } else { + s32 offset = mItemKinds[mCurrentNavTarget] == dLytCommonIconItem_c::B_WHEEL ? 0 : 12; + if (mBWheelOrPouchItemIcons[mCurrentNavTarget + offset].isDoneDeciding()) { + b = true; + mUpgradeIdx = mItemUpgradeIdxes[mCurrentNavTarget]; + } + } + + if (b) { + mAnmItemSelect[5].setAnimEnable(true); + mAnmItemSelect[5].setFrame(0.0f); + mAnmItemSelect[1].setAnimEnable(true); + mAnmItemSelect[1].setFrame(0.0f); + mAnmItemSelect[3].setAnimEnable(true); + mAnmItemSelect[3].setFrame(0.0f); + mLyts[SHOP_LYT_ITEM_SELECT].calc(); + mAnmItemSelect[1].setAnimEnable(false); + mAnmItemSelect[3].setAnimEnable(false); + + mAnmMaterialCheck[0].setAnimEnable(true); + mAnmMaterialCheck[0].setFrame(0.0f); + mAnmMaterialCheck[16].setAnimEnable(true); + mAnmMaterialCheck[16].setFrame(1.0f); + + updateShopStuffMaybe(); + + f32 f; + if (mService != SERVICE_POTION_INFUSE) { + f = 0.0f; + if (mService == SERVICE_GEAR_UPGRADE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_JNK_RC_P2_APPEAR); + } + } else { + f = 1.0f; + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_MDS_P2_APPEAR); + } + + mAnmMaterialCheck[17].setAnimEnable(true); + mAnmMaterialCheck[17].setFrame(f); + mLyts[SHOP_LYT_MATERIAL_CHECK].calc(); + mAnmMaterialCheck[17].setAnimEnable(false); + mStateStep = 1; + } + } else { + if (mAnmItemSelect[5].isEndReached() && mAnmMaterialCheck[0].isEndReached()) { + mAnmItemSelect[5].setAnimEnable(false); + mAnmMaterialCheck[0].setAnimEnable(false); + + s32 offset = mItemKinds[mCurrentNavTarget] == dLytCommonIconItem_c::B_WHEEL ? 0 : 12; + mBWheelOrPouchItemIcons[mCurrentNavTarget + offset].setOff(); + + mPhase = PHASE_MATERIAL_CHECK; + mCurrentNavTarget = mCurrentNavTarget - 12; + dPadNav::setNavEnabled(true, false); + mIsIdle = true; + } + } +} +void dLytShopMain_c::finalizeState_ModeOutIn() {} + +void dLytShopMain_c::initializeState_ModeMaterialCheck() { + mCurrentNavTarget = -2; + field_0x116DD = false; + field_0x116DE = false; +} +void dLytShopMain_c::executeState_ModeMaterialCheck() { + if (dPad::getDownTrigB()) { + if (field_0x116DE) { + mAnmMaterialCheck[3].setBackwardsOnce(); + } + field_0x116DD = true; + fn_802A5CA0(false); + mIsIdle = true; + } else if (dPad::getDownTrigA() && mCurrentNavTarget >= 0) { + if (mCurrentNavTarget != 0) { + dCsBase_c::GetInstance()->setVisible(false); + } + mIsIdle = true; + } else { + handleNavigation(); + } + + if (mIsIdle) { + dPadNav::setNavEnabled(false, false); + } +} +void dLytShopMain_c::finalizeState_ModeMaterialCheck() {} + +void dLytShopMain_c::initializeState_ModeOut() {} +void dLytShopMain_c::executeState_ModeOut() { + if (mStateStep == 0) { + if (mAnmMaterialCheck[6].isEndReached()) { + mAnmMaterialCheck[6].setAnimEnable(false); + mAnmMaterialCheck[1].setAnimEnable(true); + mAnmMaterialCheck[1].setFrame(0.0f); + mAnmMaterialCheck[3].setAnimEnable(true); + mAnmMaterialCheck[3].setFrame(0.0f); + mLyts[SHOP_LYT_MATERIAL_CHECK].calc(); + mAnmMaterialCheck[3].setAnimEnable(false); + + mAnmShopInfo[1].setAnimEnable(true); + mAnmShopInfo[1].setFrame(0.0f); + mLyts[SHOP_LYT_SHOP_INFO].calc(); + dCsBase_c::GetInstance()->setVisible(false); + mStateStep = 1; + } + } else { + if (mAnmMaterialCheck[1].isEndReached()) { + mAnmMaterialCheck[1].setAnimEnable(false); + mAnmShopInfo[1].setAnimEnable(false); + fn_802A5BD0(); + mIsIdle = true; + } + } +} +void dLytShopMain_c::finalizeState_ModeOut() {} + +void dLytShopMain_c::initializeState_ModeInOut() {} +void dLytShopMain_c::executeState_ModeInOut() { + if (mStateStep == 0) { + if (mAnmMaterialCheck[5].isEndReached()) { + mAnmMaterialCheck[5].setAnimEnable(false); + + mAnmItemSelect[0].setAnimEnable(true); + mAnmItemSelect[0].setFrame(0.0f); + mLyts[SHOP_LYT_ITEM_SELECT].calc(); + + mAnmMaterialCheck[1].setAnimEnable(true); + mAnmMaterialCheck[1].setFrame(0.0f); + mAnmMaterialCheck[2].setAnimEnable(true); + mAnmMaterialCheck[2].setFrame(0.0f); + mAnmMaterialCheck[3].setAnimEnable(true); + mAnmMaterialCheck[3].setFrame(0.0f); + mAnmMaterialCheck[7].setAnimEnable(true); + mAnmMaterialCheck[7].setFrame(0.0f); + mAnmMaterialCheck[8].setAnimEnable(true); + mAnmMaterialCheck[8].setFrame(0.0f); + mLyts[SHOP_LYT_MATERIAL_CHECK].calc(); + mAnmMaterialCheck[2].setAnimEnable(false); + mAnmMaterialCheck[3].setAnimEnable(false); + mAnmMaterialCheck[7].setAnimEnable(false); + mAnmMaterialCheck[8].setAnimEnable(false); + + if (mService == SERVICE_POTION_INFUSE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_MDS_P1_APPEAR); + } else if (mService == SERVICE_GEAR_UPGRADE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_JNK_RC_P1_APPEAR); + } + + fn_802A5CA0(true); + mStateStep = 1; + } + } else { + if (mAnmItemSelect[0].isEndReached() && mAnmMaterialCheck[1].isEndReached()) { + mAnmItemSelect[0].setAnimEnable(false); + mAnmMaterialCheck[1].setAnimEnable(false); + fn_802A5BD0(); + mPhase = PHASE_SELECT_ITEM; + dPadNav::setNavEnabled(true, false); + mIsIdle = true; + } + } +} +void dLytShopMain_c::finalizeState_ModeInOut() {} + +dLytShopMain_c::dLytShopMain_c() : mStateMgr(*this) {} + +bool dLytShopMain_c::build(d2d::ResAccIf_c *resAcc) { + for (int i = 0; i < SHOP_NUM_LYTS; i++) { + // TODO instruction swap, maybe will resolve itself? + mLyts[i].setResAcc(resAcc); + mLyts[i].build(sLytNames[i], nullptr); + } + + for (int i = 0; i < SHOP_ITEM_SELECT_NUM_ANIMS; i++) { + mAnmItemSelect[i].init( + brlanMapItemSelect[i].mFile, resAcc, mLyts[SHOP_LYT_ITEM_SELECT].getLayout(), brlanMapItemSelect[i].mName + ); + mAnmItemSelect[i].bind(false); + mAnmItemSelect[i].setAnimEnable(false); + } + + for (int i = 0; i < SHOP_MATERIAL_NUM_ANIMS; i++) { + mAnmMaterialCheck[i].init( + brlanMapMaterialCheck[i].mFile, resAcc, mLyts[SHOP_LYT_MATERIAL_CHECK].getLayout(), + brlanMapMaterialCheck[i].mName + ); + mAnmMaterialCheck[i].bind(false); + mAnmMaterialCheck[i].setAnimEnable(false); + } + + for (int i = 0; i < SHOP_SHOP_INFO_NUM_ANIMS; i++) { + mAnmShopInfo[i].init( + brlanMapShopInfo[i].mFile, resAcc, mLyts[SHOP_LYT_SHOP_INFO].getLayout(), brlanMapShopInfo[i].mName + ); + mAnmShopInfo[i].bind(false); + mAnmShopInfo[i].setAnimEnable(false); + } + + for (int i = 0; i < SHOP_ITEM_SELECT_NUM_BOUNDINGS; i++) { + mpItemBoundings[i] = mLyts[SHOP_LYT_ITEM_SELECT].findBounding(sItemSelectBoundings[i]); + } + + for (int i = 0; i < SHOP_MATERIAL_CHECK_CHOICE_NUM_BOUNDINGS; i++) { + mpMaterialCheckChoiceBoundings[i] = + mLyts[SHOP_LYT_MATERIAL_CHECK].findBounding(sMaterialCheckChoiceBoundings[i]); + } + + for (int i = 0; i < NUM_ITEMS; i++) { + mItemPouchSlots[i] = -1; + } + + buildSubpanes(); + + mAnmItemSelect[0].setAnimEnable(true); + mAnmItemSelect[0].setFrame(mAnmItemSelect[0].getLastFrame()); + mAnmItemSelect[6].setAnimEnable(true); + mAnmItemSelect[6].setFrame(0.0f); + mLyts[SHOP_LYT_ITEM_SELECT].calc(); + mAnmItemSelect[0].setAnimEnable(false); + + mAnmItemSelect[3].setForwardLoop(); + mAnmMaterialCheck[7].setForwardLoop(); + mAnmMaterialCheck[8].setForwardLoop(); + + mAnmMaterialCheck[0].setAnimEnable(true); + mAnmMaterialCheck[0].setFrame(0.0f); + mAnmMaterialCheck[7].setAnimEnable(true); + mAnmMaterialCheck[7].setFrame(0.0f); + mAnmMaterialCheck[8].setAnimEnable(true); + mAnmMaterialCheck[8].setFrame(0.0f); + mAnmMaterialCheck[9].setAnimEnable(true); + mAnmMaterialCheck[9].setFrame(0.0f); + mLyts[SHOP_LYT_MATERIAL_CHECK].calc(); + mAnmMaterialCheck[0].setAnimEnable(false); + + mAnmShopInfo[0].setAnimEnable(true); + mAnmShopInfo[0].setFrame(0.0f); + mLyts[SHOP_LYT_SHOP_INFO].calc(); + mAnmShopInfo[0].setAnimEnable(false); + + mCsHitChecks[0].init(mLyts[SHOP_LYT_ITEM_SELECT].getLayout()->GetRootPane(), 1, 0, 0); + mCsHitChecks[1].init(mLyts[SHOP_LYT_MATERIAL_CHECK].getLayout()->GetRootPane(), 1, 0, 0); + + dCsMgr_c::GetInstance()->registCursorTarget(&mCsHitChecks[0]); + dCsMgr_c::GetInstance()->registCursorTarget(&mCsHitChecks[1]); + + dCsBase_c::GetInstance()->setCursorStickTargetPane(mpItemBoundings[0]); + + setModeNone(); + field_0x116DD = false; + field_0x116DE = false; + mUpgradeLoaded = false; + mPrevPointerVisible = true; + + fn_802A5CA0(true); + + mPhase = PHASE_SELECT_ITEM; + mCurrentNavTarget = -12; + mStateStep = 0; + mUpgradeIdx = 0; + mItemCount = 0; + mUpgradeCostCount = 0; + field_0x11700 = 0; + + return true; +} + +bool dLytShopMain_c::execute() { + mCsHitChecks[mPhase].resetCachedHitboxes(); + mCsHitChecks[mPhase].execute(); + mStateMgr.executeState(); + + for (int i = 0; i < mItemCount; i++) { + if (mItemKinds[i] == dLytCommonIconItem_c::B_WHEEL) { + mBWheelOrPouchNodes[i].mpLytPane->execute(); + } else { + mBWheelOrPouchNodes[i + 12].mpLytPane->execute(); + } + } + + if (mUpgradeLoaded) { + for (int i = 0; i < mUpgradeCostCount; i++) { + if (i < 2) { + if (field_0x11770[i] == 0) { + mUpgradeNodes[i].mpLytPane->execute(); + } else { + mUpgradeNodes[i + 6].mpLytPane->execute(); + } + } else if (field_0x11770[i] == 0) { + mUpgradeNodes[i + 6].mpLytPane->execute(); + } else { + mUpgradeNodes[i].mpLytPane->execute(); + } + } + } + + for (int i = 0; i < 7; i++) { + if (mAnmItemSelect[i].isEnabled()) { + mAnmItemSelect[i].play(); + if (i == 1) { + f32 frame; + if (!field_0x116E1 || mAnmItemSelect[i].getFrame() == mAnmItemSelect[i].getLastFrame()) { + frame = 0.0f; + } else { + frame = 1.0f; + } + mAnmItemSelect[7].setAnimEnable(true); + mAnmItemSelect[7].setFrame(frame); + mLyts[SHOP_LYT_ITEM_SELECT].calc(); + mAnmItemSelect[7].setAnimEnable(false); + } + } + } + + for (int i = 0; i < 10; i++) { + if (mAnmMaterialCheck[i].isEnabled()) { + mAnmMaterialCheck[i].play(); + if (i == 2) { + f32 frame; + if (!field_0x116E1 || mAnmMaterialCheck[i].getFrame() == mAnmMaterialCheck[i].getLastFrame()) { + frame = 0.0f; + } else { + frame = 1.0f; + } + mAnmMaterialCheck[16].setAnimEnable(true); + mAnmMaterialCheck[16].setFrame(frame); + mLyts[SHOP_LYT_MATERIAL_CHECK].calc(); + mAnmMaterialCheck[16].setAnimEnable(false); + } + } + } + + for (int i = 0; i < 2; i++) { + if (mAnmShopInfo[i].isEnabled()) { + mAnmShopInfo[i].play(); + } + } + + for (int i = 0; i < SHOP_NUM_LYTS; i++) { + mLyts[i].calc(); + } + + mPrevPointerVisible = dPadNav::isPointerVisible(); + + return true; +} + +bool dLytShopMain_c::draw() { + for (int i = 0; i < SHOP_NUM_LYTS; i++) { + mLyts[i].addToDrawList(); + } + return true; +} + +bool dLytShopMain_c::remove() { + dCsMgr_c::GetInstance()->unregistCursorTarget(&mCsHitChecks[0]); + dCsMgr_c::GetInstance()->unregistCursorTarget(&mCsHitChecks[1]); + + // Okay this one does need temps to avoid regswaps, the others probably should use temps too for consistency + d2d::SubPaneList::Iterator it = mItemList.GetBeginIter(); + d2d::SubPaneList::Iterator end = mItemList.GetEndIter(); + for (; it != end; ++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 < 24; i++) { + mBWheelOrPouchNodes[i].mpLytPane->remove(); + } + + it = mUpgradeList.GetBeginIter(); + end = mUpgradeList.GetEndIter(); + for (; it != end; ++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 < 12; i++) { + mUpgradeNodes[i].mpLytPane->remove(); + } + + mUpgradeLoaded = false; + + for (int i = 0; i < SHOP_NUM_LYTS; i++) { + mLyts[i].unbindAnims(); + } + + for (int i = 0; i < SHOP_ITEM_SELECT_NUM_ANIMS; i++) { + mAnmItemSelect[i].remove(); + } + + for (int i = 0; i < SHOP_MATERIAL_NUM_ANIMS; i++) { + mAnmMaterialCheck[i].remove(); + } + + for (int i = 0; i < SHOP_SHOP_INFO_NUM_ANIMS; i++) { + mAnmShopInfo[i].remove(); + } + + return true; +} + +void dLytShopMain_c::setModeNone() { + mStateMgr.changeState(StateID_ModeNone); + mIsIdle = false; +} + +void dLytShopMain_c::setModeSelectIn() { + // TODO: wat + if (dCsBase_c::GetInstance()->isVisible()) { + dCsBase_c::GetInstance()->setVisible(true); + } + + f32 frame = mService != SERVICE_POTION_INFUSE ? 0.0f : 1.0f; + + mAnmItemSelect[8].setAnimEnable(true); + mAnmItemSelect[8].setFrame(frame); + mAnmItemSelect[0].setAnimEnable(true); + mAnmItemSelect[7].setAnimEnable(true); + mAnmItemSelect[7].setFrame(1.0f); + mAnmItemSelect[3].setAnimEnable(true); + mAnmItemSelect[3].setFrame(0.0f); + mLyts[SHOP_LYT_ITEM_SELECT].calc(); + mAnmItemSelect[8].setAnimEnable(false); + + mAnmShopInfo[0].setAnimEnable(true); + mAnmShopInfo[0].setFrame(0.0f); + mLyts[SHOP_LYT_SHOP_INFO].calc(); + + mStateMgr.changeState(StateID_ModeSelectIn); + mIsIdle = false; +} + +void dLytShopMain_c::setModeSelectCheck() { + mStateMgr.changeState(StateID_ModeSelectCheck); + mIsIdle = false; +} + +void dLytShopMain_c::setModeSelectOut() { + mStateStep = 0; + if (field_0x116DD) { + mAnmItemSelect[4].setAnimEnable(true); + mAnmItemSelect[4].setFrame(0.0f); + mLyts[SHOP_LYT_ITEM_SELECT].calc(); + } else { + mBWheelOrPouchItemIcons[mCurrentNavTarget + 12].startConfirm(); + field_0x11700 = mCurrentNavTarget; + } + dCsBase_c::GetInstance()->setVisible(false); + dPadNav::setNavEnabled(false, false); + mStateMgr.changeState(StateID_ModeSelectOut); + mIsIdle = false; +} + +void dLytShopMain_c::setModeOutIn() { + if (field_0x116DD) { + mStateStep = 0; + mAnmItemSelect[4].setAnimEnable(true); + mAnmItemSelect[4].setFrame(0.0f); + mLyts[SHOP_LYT_ITEM_SELECT].calc(); + } else { + s32 offset = mItemKinds[mCurrentNavTarget] == dLytCommonIconItem_c::B_WHEEL ? 0 : 12; + mStateStep = 0; + mBWheelOrPouchItemIcons[mCurrentNavTarget + offset].startConfirm(); + if (mCurrentNavTarget < 12) { + field_0x11700 = mCurrentNavTarget; + } else { + field_0x11700 = mCurrentNavTarget - 12; + } + } + mStateMgr.changeState(StateID_ModeSelectOut); + mIsIdle = false; +} + +void dLytShopMain_c::setModeMaterialCheck() { + dMessage_c::getInstance()->setField_0x2FC(-1); + mStateMgr.changeState(StateID_ModeMaterialCheck); + mIsIdle = false; +} + +void dLytShopMain_c::setModeOut() { + mStateStep = 0; + mAnmMaterialCheck[6].setAnimEnable(true); + mAnmMaterialCheck[6].setFrame(0.0f); + mLyts[SHOP_LYT_MATERIAL_CHECK].calc(); + mStateMgr.changeState(StateID_ModeMaterialCheck); + mIsIdle = false; +} + +void dLytShopMain_c::setModeInOut() { + mStateStep = 0; + mAnmMaterialCheck[5].setAnimEnable(true); + mAnmMaterialCheck[5].setFrame(0.0f); + mLyts[SHOP_LYT_MATERIAL_CHECK].calc(); + dMessage_c::getInstance()->setField_0x2FC(-2); + dLytMeter_c::setRupyField_0x8AC(0); + mStateMgr.changeState(StateID_ModeInOut); + mIsIdle = false; +} + +static const char *sGroupName = "G_ref_00"; + +void dLytShopMain_c::buildSubpanes() { + void *data = LayoutArcManager::GetInstance()->getLoadedData("DoButton"); + d2d::ResAccIf_c resAcc; + resAcc.attach(data, ""); + + for (int i = 0; i < (int)ARRAY_LENGTH(mBWheelOrPouchItemIcons); i++) { + mBWheelOrPouchNodes[i].mpLytPane = &mBWheelOrPouchItemIcons[i]; + if (i < 12) { + mBWheelOrPouchItemIcons[i].build(&resAcc, dLytCommonIconItem_c::B_WHEEL); + } else { + mBWheelOrPouchItemIcons[i].build(&resAcc, dLytCommonIconItem_c::POUCH); + } + mItemList.PushBack(&mBWheelOrPouchNodes[i]); + } + + nw4r::lyt::GroupContainer *container = mLyts[SHOP_LYT_ITEM_SELECT].getLayout()->GetGroupContainer(); + if (container != nullptr) { + nw4r::lyt::Group *g = container->FindGroupByName(sGroupName); + if (g != nullptr) { + d2d::dSubPane::linkMeters(g, &mItemList); + } + } + + for (int i = 0; i < (int)ARRAY_LENGTH(mBWheelOrPouchNodes); i++) { + mBWheelOrPouchNodes[i].mpPane->SetVisible(false); + } + + buildMaterialCheckIcons(&resAcc, dLytCommonIconItem_c::B_WHEEL); + buildMaterialCheckIcons(&resAcc, dLytCommonIconItem_c::POUCH); + + container = mLyts[SHOP_LYT_MATERIAL_CHECK].getLayout()->GetGroupContainer(); + if (container != nullptr) { + nw4r::lyt::Group *g = container->FindGroupByName(sGroupName); + if (g != nullptr) { + d2d::dSubPane::linkMeters(g, &mUpgradeList); + } + } + + for (int i = 0; i < (int)ARRAY_LENGTH(mUpgradeNodes); i++) { + mUpgradeNodes[i].mpPane->SetVisible(false); + } +} + +void dLytShopMain_c::prepareRemodelStoreStuff(s32 service) { + mService = service; + mItemCount = 0; + + s32 textVariant; + dTextBox_c *box1, *box2; + box1 = mLyts[SHOP_LYT_MATERIAL_CHECK].getTextBox("T_text_03"); + box2 = mLyts[SHOP_LYT_MATERIAL_CHECK].getTextBox("T_textS_03"); + + s32 offset1; + s32 offset2; + if (mService != SERVICE_POTION_INFUSE) { + // "Upgrade" + offset1 = 0; + offset2 = 28; + textVariant = 0; + } else { + // "Infuse" + offset1 = 28; + offset2 = 68; + textVariant = 1; + } + mLyts[SHOP_LYT_MATERIAL_CHECK].loadTextVariant(box1, textVariant); + mLyts[SHOP_LYT_MATERIAL_CHECK].loadTextVariant(box2, textVariant); + + for (int i = 0; i < (int)ARRAY_LENGTH(mItemUpgradeIdxes); i++) { + mItemUpgradeIdxes[i] = -1; + } + + s32 idx = 0; + if (mService == SERVICE_GEAR_UPGRADE && offset1 < 10) { + // Upgrade-able B-Wheel items (4) + static const s32 skips[] = {2, 2, 3, 3}; + for (int i = 0; i < 4; i++) { + bool show; + s32 itemTier = getItemTier(i); + if (itemTier == 0) { + show = false; + } else { + idx = offset1 + itemTier - 1; + show = sItemData[idx].canBeUpgraded; + if (show) { + // TODO change arg type to u16 + show = dAcItem_c::checkFlag((u16)sItemData[idx].itemId); + } + } + if (show) { + addItemToDisplayed(idx, dLytCommonIconItem_c::B_WHEEL, -1); + } + offset1 += skips[i]; + } + } + + if (mService == SERVICE_SHIELD_REPAIR) { + for (int i = 0; i < 8; i++) { + s32 pouchItemId = getPouchItemIdForIndex(i, false); + s32 val = getPouchShieldDurability2(i, false); + if (val >= 0 && getEvenMoreShieldStuff(i, false) > val) { + for (int i = 10; i < 19; i++) { + if (sItemData[i].itemId == pouchItemId) { + idx = i; + break; + } + } + addItemToDisplayed(idx, dLytCommonIconItem_c::POUCH, i); + } + } + } else { + // infusable or upgradeable pouch items + for (int i = 0; i < 8; i++) { + s32 pouchItemId = getPouchItemIdForIndex(i, false); + bool show = false; + for (int j = offset1; j < offset2; j++) { + if (sItemData[j].itemId == pouchItemId) { + show = sItemData[j].canBeUpgraded; + idx = j; + break; + } + } + + if (show) { + addItemToDisplayed(idx, dLytCommonIconItem_c::POUCH, i); + } + } + } + + for (int i = 0; i < 12; i++) { + if (i < mItemCount) { + if (mItemKinds[i] == dLytCommonIconItem_c::B_WHEEL) { + mBWheelOrPouchNodes[i].mpPane->SetVisible(true); + mBWheelOrPouchNodes[i + 12].mpPane->SetVisible(false); + mBWheelOrPouchItemIcons[i + 12].setVisible(false); + } else { + mBWheelOrPouchNodes[i].mpPane->SetVisible(false); + mBWheelOrPouchItemIcons[i].setVisible(false); + mBWheelOrPouchNodes[i + 12].mpPane->SetVisible(true); + } + } else { + mBWheelOrPouchNodes[i].mpPane->SetVisible(false); + mBWheelOrPouchItemIcons[i].setVisible(false); + mBWheelOrPouchNodes[i + 12].mpPane->SetVisible(false); + mBWheelOrPouchItemIcons[i + 12].setVisible(false); + } + } +} + +void dLytShopMain_c::addItemToDisplayed(s32 itemIdx, s32 itemKind, s32 pouchSlot) { + mItemKinds[mItemCount] = itemKind; + s32 iconIdx; + if (itemKind == dLytCommonIconItem_c::B_WHEEL) { + iconIdx = mItemCount; + } else { + iconIdx = mItemCount + 12; + } + + mBWheelOrPouchItemIcons[iconIdx].setUnk(true); + mBWheelOrPouchItemIcons[iconIdx].setHasNumber(false); + mBWheelOrPouchItemIcons[iconIdx].setItem(sLytIconMapping[itemIdx]); + + s32 id = sItemData[itemIdx].itemId; + bool found = false; + int i = 0; + if (mService != SERVICE_POTION_INFUSE) { + for (; i < (int)ARRAY_LENGTH(sGearUpgrades); i++) { + if (sGearUpgrades[i].oldItemId == id) { + found = true; + break; + } + } + } else { + for (; i < (int)ARRAY_LENGTH(sPotionUpgrades); i++) { + if (sPotionUpgrades[i].oldItemId == id) { + found = true; + break; + } + } + } + + if (found) { + mItemUpgradeIdxes[mItemCount] = i; + } + + f32 durability = getPouchShieldDurability(pouchSlot, false); + if (durability >= 0.0f) { + mBWheelOrPouchItemIcons[iconIdx].setShieldDurability(durability); + } + mItemPouchSlots[mItemCount] = pouchSlot; + mItemCount++; +} + +void dLytShopMain_c::buildMaterialCheckIcons(d2d::ResAccIf_c *resAcc, u8 variant) { + u8 costVariant; + s32 upgradeItemIconOffset, upgradeMatIconOffset, nodeOffset; + if (variant == dLytCommonIconItem_c::B_WHEEL) { + costVariant = dLytCommonIconMaterial_c::TREASURE; + upgradeItemIconOffset = 0; + upgradeMatIconOffset = 0; + nodeOffset = 0; + } else { + costVariant = dLytCommonIconMaterial_c::BUG; + upgradeItemIconOffset = 2; + upgradeMatIconOffset = 4; + nodeOffset = 6; + } + + s32 run = nodeOffset; + + // base item + mUpgradeNodes[run].mpLytPane = &mUpgradePreviewIcons[upgradeItemIconOffset]; + mUpgradePreviewIcons[upgradeItemIconOffset].build(resAcc, variant); + mUpgradeList.PushBack(&mUpgradeNodes[run]); + + upgradeItemIconOffset++; + run++; + // new item + mUpgradeNodes[run].mpLytPane = &mUpgradePreviewIcons[upgradeItemIconOffset]; + mUpgradePreviewIcons[upgradeItemIconOffset].build(resAcc, variant); + mUpgradeList.PushBack(&mUpgradeNodes[run]); + + // upgrade costs + for (int i = 0; i < 4; i++) { + mUpgradeNodes[nodeOffset + i + 2].mpLytPane = &mUpgradeCostIcons[upgradeMatIconOffset + i]; + mUpgradeCostIcons[upgradeMatIconOffset + i].build(resAcc, costVariant); + mUpgradeList.PushBack(&mUpgradeNodes[nodeOffset + i + 2]); + } +} + +s32 dLytShopMain_c::getItemTier(s32 i) { + if (i == 0) { + return dAcPy_c::GetLink()->getCurrentBugNetType(); + } else if (i == 1) { + return dAcPy_c::GetLink()->getCurrentSlingshotType(); + } else if (i == 2) { + s32 ty = dAcPy_c::GetLink()->getCurrentBeetleType() - 1; + if (ty < 0) { + ty = 0; + } + return ty; + } else { + return dAcPy_c::GetLink()->getCurrentBowType(); + } +} + +void dLytShopMain_c::handleNavigation() { + dCursorHitCheck_c *d = dCsBase_c::GetInstance()->getHitCheck(); + s32 nextTarget; + bool selectIcon = false; + s32 i1, i2; + if (mPhase == PHASE_SELECT_ITEM) { + i1 = 13; + i2 = 1; + for (int i = 0; i < NUM_ITEMS; i++) { + mpItemBoundings[i + SHOP_ITEM_SELECT_BOUNDING_ITEM_OFFSET]->SetVisible(false); + } + } else { + i1 = 2; + i2 = 2; + } + + bool pointerVisible = dPadNav::isPointerVisible(); + if (mPhase == PHASE_SELECT_ITEM) { + if (pointerVisible) { + for (nextTarget = 0; nextTarget < mItemCount; nextTarget++) { + s32 iconIdx; + if (mItemKinds[nextTarget] == dLytCommonIconItem_c::B_WHEEL) { + iconIdx = nextTarget; + } else { + iconIdx = nextTarget + 12; + } + if (mBWheelOrPouchItemIcons[iconIdx].isCursorOver()) { + selectIcon = true; + mUpgradeIdx = mItemUpgradeIdxes[nextTarget]; + break; + } + } + } else { + if (dPadNav::getFSStickNavDirection() != dPadNav::FS_STICK_NONE) { + nextTarget = mCurrentNavTarget; + if (nextTarget < 0 || mPrevPointerVisible) { + if (nextTarget == -13) { + nextTarget = 12; + } else if (nextTarget < 0) { + nextTarget += 12; + } + dCsBase_c::GetInstance()->setCursorStickTargetPane(mpItemBoundings[nextTarget]); + selectIcon = true; + } else { + switch (checkNav()) { + case dPadNav::FS_STICK_UP: + selectIcon = true; + nextTarget = mCurrentNavTarget - 6; + break; + case dPadNav::FS_STICK_UP_RIGHT: + selectIcon = true; + nextTarget = mCurrentNavTarget - 5; + break; + case dPadNav::FS_STICK_RIGHT: + selectIcon = true; + nextTarget = mCurrentNavTarget + 1; + break; + case dPadNav::FS_STICK_DOWN_RIGHT: + selectIcon = true; + nextTarget = mCurrentNavTarget + 7; + break; + case dPadNav::FS_STICK_DOWN: + selectIcon = true; + nextTarget = mCurrentNavTarget + 6; + break; + case dPadNav::FS_STICK_DOWN_LEFT: + selectIcon = true; + nextTarget = mCurrentNavTarget + 5; + break; + case dPadNav::FS_STICK_LEFT: + selectIcon = true; + nextTarget = mCurrentNavTarget - 1; + break; + case dPadNav::FS_STICK_UP_LEFT: + selectIcon = true; + nextTarget = mCurrentNavTarget - 7; + break; + default: + selectIcon = true; + nextTarget = mCurrentNavTarget; + break; + } + if (nextTarget >= 12) { + nextTarget = 12; + } + dCsBase_c::GetInstance()->setCursorStickTargetPane(mpItemBoundings[nextTarget]); + } + } else if (mCurrentNavTarget >= 0) { + selectIcon = true; + nextTarget = mCurrentNavTarget; + } + } + } else { + if (!pointerVisible) { + if (mPrevPointerVisible) { + // Sorry what? Why is dPadNav not good enough here? + if (dPad::ex_c::getInstance()->getFSStickTrig(0x1) || dPad::ex_c::getInstance()->getFSStickTrig(0x10)) { + // up/down + dPadNav::setNavEnabled(true, false); + if (mCurrentNavTarget >= 0) { + nextTarget = mCurrentNavTarget; + selectIcon = true; + } + } else { + if (dPad::ex_c::getInstance()->getFSStickTrig(0x80) || + dPad::ex_c::getInstance()->getFSStickTrig(0x40) || + dPad::ex_c::getInstance()->getFSStickTrig(0x20)) { + // right + nextTarget = 1; + } else { + // left + nextTarget = 0; + } + dCsBase_c::GetInstance()->setCursorStickTargetPane(mpMaterialCheckChoiceBoundings[nextTarget]); + selectIcon = true; + } + } else { + switch (dPadNav::getFSStickNavDirection()) { + case 2: + case 3: + case 4: + nextTarget = 1; + dCsBase_c::GetInstance()->setCursorStickTargetPane(mpMaterialCheckChoiceBoundings[1]); + selectIcon = true; + break; + case 6: + case 7: + case 8: + nextTarget = 0; + dCsBase_c::GetInstance()->setCursorStickTargetPane(mpMaterialCheckChoiceBoundings[0]); + selectIcon = true; + break; + default: nextTarget = mCurrentNavTarget; selectIcon = true; + } + } + } + } + + if (!selectIcon && pointerVisible) { + if (d != nullptr && d->getType() == 'lyt ') { + for (nextTarget = 0; nextTarget < i1; nextTarget++) { + nw4r::lyt::Bounding *b; + if (mPhase == 0) { + b = mpItemBoundings[12]; + nextTarget = 12; + } else { + b = mpMaterialCheckChoiceBoundings[nextTarget]; + } + if (static_cast(d)->getHitPane() == b) { + selectIcon = true; + break; + } + } + } + } + + if (selectIcon) { + if (mCurrentNavTarget != nextTarget) { + if (mCurrentNavTarget >= 0) { + if (mPhase == PHASE_SELECT_ITEM) { + if (mCurrentNavTarget == 12) { + mAnmItemSelect[i2].setBackwardsOnce(); + mAnmItemSelect[2].setBackwardsOnce(); + field_0x116DD = false; + } else if (mItemKinds[mCurrentNavTarget] == dLytCommonIconItem_c::B_WHEEL) { + mBWheelOrPouchItemIcons[mCurrentNavTarget].setOff(); + } else { + mBWheelOrPouchItemIcons[mCurrentNavTarget + 12].setOff(); + } + } else { + mAnmMaterialCheck[i2 + mCurrentNavTarget].setBackwardsOnce(); + if (mCurrentNavTarget == 0) { + mAnmMaterialCheck[4].setBackwardsOnce(); + } + } + } + + if (mPhase == PHASE_SELECT_ITEM) { + if (nextTarget == 12) { + mAnmItemSelect[i2].setAnimEnable(true); + mAnmItemSelect[i2].setFrame(0.0f); + mAnmItemSelect[i2].setForwardOnce(); + mAnmItemSelect[2].setForwardOnce(); + field_0x116DD = true; + if (mService == SERVICE_POTION_INFUSE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_MDS_P1_POINT_BACK); + } else if (mService == SERVICE_GEAR_UPGRADE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_JNK_RC_P1_POINT_BACK); + } else { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_JNK_RP_POINT_BACK); + } + } else { + if (mItemKinds[nextTarget] == dLytCommonIconItem_c::B_WHEEL) { + mBWheelOrPouchItemIcons[nextTarget].setOn(); + } else { + mBWheelOrPouchItemIcons[nextTarget + 12].setOn(); + } + if (mService == SERVICE_POTION_INFUSE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_MDS_P1_POINT_ITEM); + } else if (mService == SERVICE_GEAR_UPGRADE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_JNK_RC_P1_POINT_ITEM); + } else { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_JNK_RP_POINT_ITEM); + } + } + } else { + mAnmMaterialCheck[i2 + nextTarget].setAnimEnable(true); + mAnmMaterialCheck[i2 + nextTarget].setFrame(0.0f); + mAnmMaterialCheck[i2 + nextTarget].setForwardOnce(); + if (nextTarget == 0) { + mAnmMaterialCheck[4].setForwardOnce(); + } + + if (nextTarget == 0) { + field_0x116DD = true; + field_0x116DE = false; + if (mService == SERVICE_POTION_INFUSE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_MDS_P2_POINT_BACK); + } else if (mService == SERVICE_GEAR_UPGRADE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_JNK_RC_P2_POINT_BACK); + } + } else if (nextTarget == 1) { + field_0x116DE = true; + field_0x116DD = false; + if (mService == SERVICE_POTION_INFUSE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_MDS_P2_POINT_BLEND); + } else if (mService == SERVICE_GEAR_UPGRADE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_JNK_RC_P2_POINT_RECONST); + } + } + } + mCurrentNavTarget = nextTarget; + dRumble_c::start(dRumble_c::sRumblePreset1, dRumble_c::FLAG_SLOT0); + } + } else { + if (mCurrentNavTarget >= 0) { + if (mPhase == PHASE_SELECT_ITEM) { + if (mCurrentNavTarget == 12) { + mAnmItemSelect[i2].setBackwardsOnce(); + mCurrentNavTarget = -13; + } else { + if (mItemKinds[mCurrentNavTarget] == dLytCommonIconItem_c::B_WHEEL) { + mBWheelOrPouchItemIcons[mCurrentNavTarget].setOff(); + } else { + mBWheelOrPouchItemIcons[mCurrentNavTarget + 12].setOff(); + } + mCurrentNavTarget -= 12; + } + } else { + mAnmMaterialCheck[i2 + mCurrentNavTarget].setBackwardsOnce(); + mCurrentNavTarget -= 2; + } + field_0x116DD = false; + field_0x116DE = false; + } + } +} + +void dLytShopMain_c::updateShopStuffMaybe() { + // TODO - Nonmatching. Probably equivalent. + + SizedString<64> buf; + ShopUpgradeCosts costs; + if (mService != SERVICE_POTION_INFUSE) { + costs = sGearUpgrades[mUpgradeIdx]; + } else { + costs = sPotionUpgrades[mUpgradeIdx]; + } + + showShopLytMaybe(); + showPriceMaybe(costs.price); + + s32 someFrame = 0; + + s32 a1 = fn_802A4490(costs.oldItemId); + s32 a2 = fn_802A4500(a1); + s32 a3 = fn_802A5760(a2); + field_0x11770[0] = a2; + mUpgradePreviewIcons[a3].setUnk(false); + mUpgradePreviewIcons[a3].setHasNumber(false); + mUpgradePreviewIcons[a3].setItem(sLytIconMapping[a1]); + mUpgradePreviewIcons[a3].setShieldOnOff(false); + + if (field_0x11770[0] == 0) { + mUpgradeNodes[0].mpPane->SetVisible(true); + } else { + mUpgradeNodes[6].mpPane->SetVisible(true); + } + + a1 = fn_802A4490(costs.newItemId); + a2 = fn_802A4500(a1); + a3 = fn_802A5760(a2); + field_0x11770[1] = a2; + mUpgradePreviewIcons[a3 + 1].setUnk(false); + mUpgradePreviewIcons[a3 + 1].setHasNumber(false); + mUpgradePreviewIcons[a3 + 1].setItem(sLytIconMapping[a1]); + mUpgradePreviewIcons[a3 + 1].setShieldOnOff(false); + + if (field_0x11770[1] == 0) { + mUpgradeNodes[1].mpPane->SetVisible(true); + } else { + mUpgradeNodes[7].mpPane->SetVisible(true); + } + + mUpgradeCostCount = 2; + + // REGSWAPS start here. + // Actual code: loop variables r18-r23, text boxes r14,r24-r28 + // Generated code: loop variables r23-r28, text boxes r14,r18-r22 + + dTextBox_c *b1, *b2, *b3, *b4, *b5, *b6; + + for (int i = 0; i < 4; i++) { + s32 i1 = i * 3 + 2; + s32 i2 = i * 2; + s32 i3 = i2 + 1; + + buf.sprintf("T_message_%02d", i1); + b1 = mLyts[SHOP_LYT_MATERIAL_CHECK].getTextBox(buf); + buf.sprintf("T_materialNum_%02d", i2); + b2 = mLyts[SHOP_LYT_MATERIAL_CHECK].getTextBox(buf); + buf.sprintf("T_materialNum_%02d", i3); + b3 = mLyts[SHOP_LYT_MATERIAL_CHECK].getTextBox(buf); + buf.sprintf("T_messageS_%02d", i1); + b4 = mLyts[SHOP_LYT_MATERIAL_CHECK].getTextBox(buf); + buf.sprintf("T_matNumS_%02d", i2); + b5 = mLyts[SHOP_LYT_MATERIAL_CHECK].getTextBox(buf); + buf.sprintf("T_matNumS_%02d", i3); + b6 = mLyts[SHOP_LYT_MATERIAL_CHECK].getTextBox(buf); + + mAnmMaterialCheck[i + 11].setAnimEnable(true); + + static wchar_t sBuf[5]; + for (int j = 0; j < (int)ARRAY_LENGTH(sBuf); j++) { + sBuf[j] = L'\0'; + } + if (costs.matCosts[i].itemId < 0) { + b1->setTextWithGlobalTextProcessor(sBuf, nullptr); + b2->setTextWithGlobalTextProcessor(sBuf, nullptr); + b3->setTextWithGlobalTextProcessor(sBuf, nullptr); + b4->setTextWithGlobalTextProcessor(sBuf, nullptr); + b5->setTextWithGlobalTextProcessor(sBuf, nullptr); + b6->setTextWithGlobalTextProcessor(sBuf, nullptr); + + someFrame = 1; + mUpgradeNodes[i + 2].mpPane->SetVisible(false); + mUpgradeNodes[i + 8].mpPane->SetVisible(false); + } else { + // TODO check if we can avoid this cast... + // getItemText has a bunch of other users as well + const wchar_t *text = getItemText((u16)costs.matCosts[i].itemId); + b1->setTextWithGlobalTextProcessor(text); + b4->setTextWithGlobalTextProcessor(text); + + s32 amt = costs.matCosts[i].amount; + (void)calcNumDigits(amt); + swprintf(sBuf, ARRAY_LENGTH(sBuf), L"%d", amt); + b2->setTextWithGlobalTextProcessor(sBuf, nullptr); + b5->setTextWithGlobalTextProcessor(sBuf, nullptr); + + for (int j = 0; j < (int)ARRAY_LENGTH(sBuf); j++) { + sBuf[j] = L'\0'; + } + + // TODO ?????????? + s32 counterIdx = costs.matCosts[i].itemId >= ITEM_HORNET_LARVAE ? + costs.matCosts[i].itemId - ITEM_UNK_139 : + costs.matCosts[i].itemId - ITEM_SMALL_QUIVER; + + // Probably some register weirdness around here + bool shadow = !dAcItem_c::checkFlag((u16)costs.matCosts[i].itemId); + s32 counter = getCounterByIndex(counterIdx); + (void)calcNumDigits(counter); + swprintf(sBuf, ARRAY_LENGTH(sBuf), L"%d", amt); + b3->setTextWithGlobalTextProcessor(sBuf, nullptr); + b6->setTextWithGlobalTextProcessor(sBuf, nullptr); + + if (counter != 0 && counter >= costs.matCosts[i].amount) { + mAnmMaterialCheck[i + 11].setFrame(0.0f); + } else { + mAnmMaterialCheck[i + 11].setFrame(1.0f); + } + + a1 = fn_802A4490(costs.matCosts[i].itemId); + a2 = fn_802A4500(a1); + a3 = fn_802A5780(a2); + field_0x11770[mUpgradeCostCount] = a2; + mUpgradeCostIcons[a3 + i].setBg(false); + mUpgradeCostIcons[a3 + i].setHasNumber(false); + mUpgradeCostIcons[a3 + i].setShadow(shadow); + mUpgradeCostIcons[a3 + i].setItem(sLytIconMapping[a1]); + + if (field_0x11770[mUpgradeCostCount] == 0) { + mUpgradeNodes[i + 2].mpPane->SetVisible(false); + mUpgradeNodes[i + 8].mpPane->SetVisible(true); + } else { + mUpgradeNodes[i + 2].mpPane->SetVisible(true); + mUpgradeNodes[i + 8].mpPane->SetVisible(false); + } + mUpgradeCostCount++; + } + } + + mAnmMaterialCheck[15].setAnimEnable(true); + mAnmMaterialCheck[15].setFrame(someFrame); + mUpgradeLoaded = true; +} + +s32 dLytShopMain_c::calcNumDigits(s32 value) { + int cmp = 1000; + int i = 4; + for (; i > 1; i--) { + if (value >= cmp) { + break; + } + cmp /= 10; + } + return i; +} + +STATE_DEFINE(dLytShop_c, None); +STATE_DEFINE(dLytShop_c, SelectIn); +STATE_DEFINE(dLytShop_c, SelectCheck); +STATE_DEFINE(dLytShop_c, SelectOut); +STATE_DEFINE(dLytShop_c, OutIn); +STATE_DEFINE(dLytShop_c, MaterialCheck); +STATE_DEFINE(dLytShop_c, Out); +STATE_DEFINE(dLytShop_c, InOut); +STATE_DEFINE(dLytShop_c, End); + +void dLytShop_c::initializeState_None() {} +void dLytShop_c::executeState_None() { + if (mInRequest) { + mMain.setModeSelectIn(); + mStateMgr.changeState(StateID_SelectIn); + mInRequest = false; + } +} +void dLytShop_c::finalizeState_None() {} + +void dLytShop_c::initializeState_SelectIn() {} +void dLytShop_c::executeState_SelectIn() { + if (mMain.isIdle()) { + dPadNav::setNavEnabled(true, false); + mMain.setModeSelectCheck(); + mStateMgr.changeState(StateID_SelectCheck); + } +} +void dLytShop_c::finalizeState_SelectIn() {} + +void dLytShop_c::initializeState_SelectCheck() {} +void dLytShop_c::executeState_SelectCheck() { + if (mMain.isIdle()) { + s32 service = mMain.getService(); + if (mMain.getField_0x116DD()) { + mMain.setModeSelectOut(); + mStateMgr.changeState(StateID_SelectOut); + + if (service == dLytShopMain_c::SERVICE_POTION_INFUSE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_MDS_P1_SELECT_BACK); + } else if (service == dLytShopMain_c::SERVICE_GEAR_UPGRADE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_JNK_RC_P1_SELECT_BACK); + } else { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_JNK_RP_SELECT_BACK); + } + } else if (service == dLytShopMain_c::SERVICE_SHIELD_REPAIR) { + mMain.setModeSelectOut(); + mStateMgr.changeState(StateID_SelectOut); + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_JNK_RP_SELECT_ITEM); + } else { + mMain.setModeOutIn(); + mStateMgr.changeState(StateID_OutIn); + if (service == dLytShopMain_c::SERVICE_POTION_INFUSE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_MDS_P1_SELECT_ITEM); + } else if (service == dLytShopMain_c::SERVICE_GEAR_UPGRADE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_JNK_RC_P1_SELECT_ITEM); + } + } + } +} +void dLytShop_c::finalizeState_SelectCheck() {} + +void dLytShop_c::initializeState_SelectOut() {} +void dLytShop_c::executeState_SelectOut() { + if (mMain.isIdle()) { + mIsMovingOut = true; + mMain.setModeNone(); + mStateMgr.changeState(StateID_End); + } +} +void dLytShop_c::finalizeState_SelectOut() {} + +void dLytShop_c::initializeState_OutIn() {} +void dLytShop_c::executeState_OutIn() { + if (mMain.isIdle()) { + mMain.setModeMaterialCheck(); + mStateMgr.changeState(StateID_MaterialCheck); + } +} +void dLytShop_c::finalizeState_OutIn() {} + +void dLytShop_c::initializeState_MaterialCheck() {} +void dLytShop_c::executeState_MaterialCheck() { + if (mMain.isIdle()) { + s32 service = mMain.getService(); + if (mMain.getField_0x116DD()) { + mMain.setModeInOut(); + mStateMgr.changeState(StateID_InOut); + + if (service == dLytShopMain_c::SERVICE_POTION_INFUSE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_MDS_P2_SELECT_BACK); + } else if (service == dLytShopMain_c::SERVICE_GEAR_UPGRADE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_JNK_RC_P2_SELECT_BACK); + } + } else if (mMain.getField_0x116DE()) { + mMain.setModeOut(); + mStateMgr.changeState(StateID_Out); + if (service == dLytShopMain_c::SERVICE_POTION_INFUSE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_MDS_P2_SELECT_BLEND); + } else if (service == dLytShopMain_c::SERVICE_GEAR_UPGRADE) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SHOP_JNK_RC_P2_SELECT_RECONST); + } + } else { + mMain.retry(); + } + } +} +void dLytShop_c::finalizeState_MaterialCheck() {} + +void dLytShop_c::initializeState_Out() {} +void dLytShop_c::executeState_Out() { + if (mMain.isIdle()) { + mMain.setModeNone(); + mStateMgr.changeState(StateID_End); + } +} +void dLytShop_c::finalizeState_Out() {} + +void dLytShop_c::initializeState_InOut() {} +void dLytShop_c::executeState_InOut() { + if (mMain.isIdle()) { + mMain.setModeSelectCheck(); + mStateMgr.changeState(StateID_SelectCheck); + } +} +void dLytShop_c::finalizeState_InOut() {} + +void dLytShop_c::initializeState_End() {} +void dLytShop_c::executeState_End() {} +void dLytShop_c::finalizeState_End() {} + +SPECIAL_BASE_PROFILE(LYT_SHOP, dLytShop_c, fProfile::LYT_SHOP, 0x2B8, 0); + +bool dLytShop_c::build() { + void *data = LayoutArcManager::GetInstance()->getLoadedData("Shop"); + mResAcc.attach(data, ""); + mMain.build(&mResAcc); + return true; +} + +int dLytShop_c::create() { + sInstance = this; + allocateLytWork1Heap("dLytShop_c::m_allocator", false); + mStateMgr.changeState(StateID_None); + mInRequest = false; + mIsMovingOut = false; + return SUCCEEDED; +} + +int dLytShop_c::execute() { + if (*mStateMgr.getStateID() != StateID_None) { + if (dPad::getDownTrigDown()) { + dPad::ex_c::getInstance()->centerCursor(mPad::getCurrentCoreID(), true); + } + if (dCsBase_c::GetInstance()->isVisible()) { + dCsGame_c::GetInstance()->pointerDefSet(); + } + mMain.execute(); + } + mStateMgr.executeState(); + return SUCCEEDED; +} + +int dLytShop_c::draw() { + if (*mStateMgr.getStateID() != StateID_None || mIsMovingOut) { + mMain.draw(); + } + return SUCCEEDED; +} + +int dLytShop_c::doDelete() { + mMain.remove(); + mResAcc.detach(); + sInstance = nullptr; + return SUCCEEDED; +}