summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrobojumper <robojumper@gmail.com>2025-12-26 23:43:00 +0100
committerrobojumper <robojumper@gmail.com>2026-01-24 11:10:35 +0100
commitbaae144a6ec2f8e2bb9ca69f0dd6e75836c3c140 (patch)
treea0ab73c4029fc0cd2f249e38d2314ee1e3963e04
parentcffba79e3f0600d54dea3bdbb0506e2fc1c54199 (diff)
d_lyt_shop 91%
-rw-r--r--config/SOUE01/splits.txt2
-rw-r--r--config/SOUE01/symbols.txt291
-rw-r--r--include/d/a/d_a_item.h1
-rw-r--r--include/d/lyt/d_lyt_common_icon_item_maps.h6
-rw-r--r--include/d/lyt/d_lyt_common_icon_material.h5
-rw-r--r--include/d/lyt/d_lyt_deposit.h3
-rw-r--r--include/d/lyt/d_lyt_shop.h162
-rw-r--r--include/d/lyt/d_lyt_util_items.h6
-rw-r--r--src/d/d_room.cpp3
-rw-r--r--src/d/lyt/d_lyt_shop.cpp1909
10 files changed, 2236 insertions, 152 deletions
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 <cwchar>
+
+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<dCursorHitCheckLyt_c *>(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;
+}