From b80ede8f48197b69ecfe3e3945f45e09a4342792 Mon Sep 17 00:00:00 2001 From: robojumper Date: Sun, 26 Apr 2026 20:55:47 +0200 Subject: [PATCH 01/14] item_mdl_misc OK --- config/SOUE01/splits.txt | 32 +- config/SOUE01/symbols.txt | 395 ++++----- configure.py | 11 +- include/d/a/d_a_item.h | 18 + include/toBeSorted/item_mdl.h | 43 + include/toBeSorted/item_mdl_misc.h | 228 +++++ include/toBeSorted/item_mdl_name.h | 183 ++++ include/toBeSorted/mdl_base.h | 12 + src/toBeSorted/item_mdl_misc.cpp | 1289 ++++++++++++++++++++++++++++ src/toBeSorted/item_mdl_name.cpp | 528 ++++++++++++ src/toBeSorted/mdl_base.cpp | 4 + 11 files changed, 2543 insertions(+), 200 deletions(-) create mode 100644 include/toBeSorted/item_mdl.h create mode 100644 include/toBeSorted/item_mdl_misc.h create mode 100644 include/toBeSorted/item_mdl_name.h create mode 100644 include/toBeSorted/mdl_base.h create mode 100644 src/toBeSorted/item_mdl_misc.cpp create mode 100644 src/toBeSorted/item_mdl_name.cpp create mode 100644 src/toBeSorted/mdl_base.cpp diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 74d5e914..cef69813 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -1220,10 +1220,34 @@ toBeSorted/counters/extra_wallet_counter.cpp: .data start:0x805280B0 end:0x805280D0 .sbss start:0x80575640 end:0x80575648 -toBeSorted/item_mdl.cpp: - .text start:0x8016E2A0 end:0x80171AA8 align:16 - .rodata start:0x804E91D0 end:0x804E9A80 - .data start:0x805280D0 end:0x80528B20 +toBeSorted/item_mdl_misc.cpp: + .text start:0x8016E2A0 end:0x8016F9DC align:16 + .rodata start:0x804E91D0 end:0x804E9650 + .data start:0x805280D0 end:0x80528490 + .sdata start:0x80572A10 end:0x80572A28 + .sdata2 start:0x8057A1D8 end:0x8057A1E0 + +toBeSorted/item_mdl_item.cpp: + .text start:0x8016F9E0 end:0x8016FE20 align:16 + .rodata start:0x804E9650 end:0x804E9A48 + .data start:0x80528490 end:0x80528A68 + .sdata start:0x80572A28 end:0x80572AA0 + +toBeSorted/item_mdl_rupee.cpp: + .text start:0x8016FE20 end:0x80170414 align:16 + .rodata start:0x804E9A48 end:0x804E9A80 + .data start:0x80528A68 end:0x80528AB0 + +toBeSorted/item_mdl_light_fruit.cpp: + .text start:0x80170420 end:0x801708E4 align:16 + .data start:0x80528AB0 end:0x80528AE0 + +toBeSorted/item_mdl_stamina_fruit.cpp: + .text start:0x801708F0 end:0x80170DA4 align:16 + .data start:0x80528AE0 end:0x80528B20 + +toBeSorted/item_spawn.cpp: + .text start:0x80170DB0 end:0x80171AA8 align:16 toBeSorted/unk_screen_effect.cpp: .text start:0x80171AB0 end:0x801749D8 align:16 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 816f8f26..f8f5e681 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -142,8 +142,8 @@ findSMA3 = .text:0x80006CD0; // type:function size:0x10 initialize__4MplsFiPPc = .text:0x80006CE0; // type:function size:0x80 tryLaunchMovie__4MplsFv = .text:0x80006D60; // type:function size:0x60 forceLaunchMovie__4MplsFv = .text:0x80006DC0; // type:function size:0x48 -fn_80006E10 = .text:0x80006E10; // type:function size:0x3C -fn_80006E50 = .text:0x80006E50; // type:function size:0x58 +__ct__6dMdl_cFv = .text:0x80006E10; // type:function size:0x3C +__dt__6dMdl_cFv = .text:0x80006E50; // type:function size:0x58 printGameInfo__Fv = .text:0x80006EB0; // type:function size:0xBC scope:local waitForButtonSequence__FPv = .text:0x80006F70; // type:function size:0x9C scope:local preExceptionCallback__Fv = .text:0x80007010; // type:function size:0x38 scope:local @@ -658,19 +658,19 @@ fn_8001BEF0 = .text:0x8001BEF0; // type:function size:0x58 fn_8001BF50 = .text:0x8001BF50; // type:function size:0x40 fn_8001BF90 = .text:0x8001BF90; // type:function size:0x4 remove__27dSwordSwingEffectProcBase_cFv = .text:0x8001BFA0; // type:function size:0x54 -__dt__Q227dSwordSwingEffectProcBase_c11swing_entryFv = .text:0x8001C000; // type:function size:0x40 +__dt__Q227dSwordSwingEffectProcBase_c11swing_entryFv = .text:0x8001C000; // type:function size:0x40 scope:weak drawXlu__27dSwordSwingEffectProcBase_cFv = .text:0x8001C040; // type:function size:0x30C hasSwings__27dSwordSwingEffectProcBase_cCFv = .text:0x8001C350; // type:function size:0x14 entry__27dSwordSwingEffectProcBase_cFv = .text:0x8001C370; // type:function size:0x44 create__27dSwordSwingEffectProcBase_cFlP12mAllocator_c = .text:0x8001C3C0; // type:function size:0xCC -__ct__Q227dSwordSwingEffectProcBase_c11swing_entryFv = .text:0x8001C490; // type:function size:0x18 +__ct__Q227dSwordSwingEffectProcBase_c11swing_entryFv = .text:0x8001C490; // type:function size:0x18 scope:weak addSwing__27dSwordSwingEffectProcBase_cFRC7mVec3_c6mColorRC7mVec3_c6mColor = .text:0x8001C4B0; // type:function size:0x78 calc__27dSwordSwingEffectProcBase_cFf = .text:0x8001C530; // type:function size:0x94 drawXlu__23dSwordSwingEffectProc_cFv = .text:0x8001C5D0; // type:function size:0x3E4 create__23dSwordSwingEffectProc_cFlP12mAllocator_cPQ23EGG7ResTIMGf = .text:0x8001C9C0; // type:function size:0x60 -set__Q227dSwordSwingEffectProcBase_c11swing_entryFRC7mVec3_c6mColorRC7mVec3_c6mColor = .text:0x8001CA20; // type:function size:0x7C -__dt__23dSwordSwingEffectProc_cFv = .text:0x8001CAA0; // type:function size:0x80 -__dt__27dSwordSwingEffectProcBase_cFv = .text:0x8001CB20; // type:function size:0x7C +set__Q227dSwordSwingEffectProcBase_c11swing_entryFRC7mVec3_cRC6mColorRC7mVec3_cRC6mColor = .text:0x8001CA20; // type:function size:0x7C +__dt__23dSwordSwingEffectProc_cFv = .text:0x8001CAA0; // type:function size:0x80 scope:weak +__dt__27dSwordSwingEffectProcBase_cFv = .text:0x8001CB20; // type:function size:0x7C scope:weak fn_8001CBA0 = .text:0x8001CBA0; // type:function size:0x20C fn_8001CDB0 = .text:0x8001CDB0; // type:function size:0x308 fn_8001D0C0 = .text:0x8001D0C0; // type:function size:0x35C @@ -2826,28 +2826,28 @@ initAudioMgr__6dSys_cFPQ23EGG4Heap = .text:0x80064250; // type:function size:0xB beginRender__6dSys_cFv = .text:0x80064300; // type:function size:0x38 endRender__6dSys_cFv = .text:0x80064340; // type:function size:0x18 beginFrame__6dSys_cFv = .text:0x80064360; // type:function size:0x68 -onBeginFrame__Q23EGG126TSystemFv = .text:0x800643D0; // type:function size:0x4 +onBeginFrame__Q23EGG126TSystemFv = .text:0x800643D0; // type:function size:0x4 scope:weak endFrame__6dSys_cFv = .text:0x800643E0; // type:function size:0x48 -onEndFrame__Q23EGG126TSystemFv = .text:0x80064430; // type:function size:0x4 +onEndFrame__Q23EGG126TSystemFv = .text:0x80064430; // type:function size:0x4 scope:weak setBlack__6dSys_cFb = .text:0x80064440; // type:function size:0x80 setFrameRate__6dSys_cFUc = .text:0x800644C0; // type:function size:0x10 getFrameRate__6dSys_cFv = .text:0x800644D0; // type:function size:0x10 setClearColor__6dSys_cFQ34nw4r2ut5Color = .text:0x800644E0; // type:function size:0x60 getClearColor__6dSys_cFv = .text:0x80064540; // type:function size:0x14 create__6dSys_cFv = .text:0x80064560; // type:function size:0x3BC -setPosParam__Q23EGG14CoreControllerFff = .text:0x80064920; // type:function size:0x8 -initialize__Q23EGG126TSystemFv = .text:0x80064930; // type:function size:0x1F4 +setPosParam__Q23EGG14CoreControllerFff = .text:0x80064920; // type:function size:0x8 scope:weak +initialize__Q23EGG126TSystemFv = .text:0x80064930; // type:function size:0x1F4 scope:weak execute__6dSys_cFv = .text:0x80064B30; // type:function size:0x268 fixHeaps__7dSystemFv = .text:0x80064DA0; // type:function size:0xB8 __sinit_\d_sys_cpp = .text:0x80064E60; // type:function size:0x34 scope:local -initRenderMode__Q23EGG126TSystemFv = .text:0x80064EA0; // type:function size:0x4 -getVideo__Q23EGG126TSystemFv = .text:0x80064EB0; // type:function size:0x8 -getSystemHeap__Q23EGG126TSystemFv = .text:0x80064EC0; // type:function size:0x8 -getDisplay__Q23EGG126TSystemFv = .text:0x80064ED0; // type:function size:0x8 -getXfbMgr__Q23EGG126TSystemFv = .text:0x80064EE0; // type:function size:0x8 -getPerfView__Q23EGG126TSystemFv = .text:0x80064EF0; // type:function size:0x14 -getSceneMgr__Q23EGG126TSystemFv = .text:0x80064F10; // type:function size:0x8 -getAudioMgr__Q23EGG126TSystemFv = .text:0x80064F20; // type:function size:0x8 +initRenderMode__Q23EGG126TSystemFv = .text:0x80064EA0; // type:function size:0x4 scope:weak +getVideo__Q23EGG126TSystemFv = .text:0x80064EB0; // type:function size:0x8 scope:weak +getSystemHeap__Q23EGG126TSystemFv = .text:0x80064EC0; // type:function size:0x8 scope:weak +getDisplay__Q23EGG126TSystemFv = .text:0x80064ED0; // type:function size:0x8 scope:weak +getXfbMgr__Q23EGG126TSystemFv = .text:0x80064EE0; // type:function size:0x8 scope:weak +getPerfView__Q23EGG126TSystemFv = .text:0x80064EF0; // type:function size:0x14 scope:weak +getSceneMgr__Q23EGG126TSystemFv = .text:0x80064F10; // type:function size:0x8 scope:weak +getAudioMgr__Q23EGG126TSystemFv = .text:0x80064F20; // type:function size:0x8 scope:weak fn_80064F30 = .text:0x80064F30; // type:function size:0x24 fn_80064F60 = .text:0x80064F60; // type:function size:0x2C fn_80064F90 = .text:0x80064F90; // type:function size:0x30 @@ -9347,8 +9347,8 @@ setAdviceOptions__9FiContextFl = .text:0x8016CB00; // type:function size:0x1C resetAdviceOptions__9FiContextFv = .text:0x8016CB20; // type:function size:0x1C fn_8016CB40__9FiContextFv = .text:0x8016CB40; // type:function size:0x1C isInLeviasFightMaybe__9FiContextFv = .text:0x8016CB60; // type:function size:0x78 -AcItem__isItemThatHasStruct = .text:0x8016CBE0; // type:function size:0x3C -AcItem__getIndex = .text:0x8016CC20; // type:function size:0x14 +hasItemMdl__FUs = .text:0x8016CBE0; // type:function size:0x3C +getItemMdlIdx__FUs = .text:0x8016CC20; // type:function size:0x14 checkedAdd__7CounterFl = .text:0x8016CC40; // type:function size:0xF0 getCommittedValue__7CounterCFv = .text:0x8016CD30; // type:function size:0x20 getUncommittedValue__7CounterCFv = .text:0x8016CD50; // type:function size:0x20 @@ -9457,70 +9457,71 @@ __dt__18ExtraWalletCounterFv = .text:0x8016E220; // type:function size:0x40 scop __ct__18ExtraWalletCounterFv = .text:0x8016E260; // type:function size:0x18 getMax__18ExtraWalletCounterCFv = .text:0x8016E280; // type:function size:0x8 scope:weak __sinit_\extra_wallet_counter_cpp = .text:0x8016E290; // type:function size:0x8 scope:local -itemHasPutItemModel = .text:0x8016E2A0; // type:function size:0x6C -fn_8016E310 = .text:0x8016E310; // type:function size:0x194 -fn_8016E4B0 = .text:0x8016E4B0; // type:function size:0x1C -fn_8016E4D0 = .text:0x8016E4D0; // type:function size:0x48 -fn_8016E520 = .text:0x8016E520; // type:function size:0x48 -fn_8016E570 = .text:0x8016E570; // type:function size:0x40 -fn_8016E5B0 = .text:0x8016E5B0; // type:function size:0x4 -fn_8016E5C0 = .text:0x8016E5C0; // type:function size:0x48 -fn_8016E610 = .text:0x8016E610; // type:function size:0x48 -itemHasShieldModel = .text:0x8016E660; // type:function size:0x6C -fn_8016E6D0 = .text:0x8016E6D0; // type:function size:0x15C -fn_8016E830 = .text:0x8016E830; // type:function size:0x8 -fn_8016E840 = .text:0x8016E840; // type:function size:0x8 -fn_8016E850 = .text:0x8016E850; // type:function size:0x8 -fn_8016E860 = .text:0x8016E860; // type:function size:0x34 -fn_8016E8A0 = .text:0x8016E8A0; // type:function size:0x10 -fn_8016E8B0 = .text:0x8016E8B0; // type:function size:0x10 -hasItemBottleModel = .text:0x8016E8C0; // type:function size:0x6C -fn_8016E930 = .text:0x8016E930; // type:function size:0x104 -fn_8016EA40 = .text:0x8016EA40; // type:function size:0x8 -fn_8016EA50 = .text:0x8016EA50; // type:function size:0x8 -fn_8016EA60 = .text:0x8016EA60; // type:function size:0x8 -fn_8016EA70 = .text:0x8016EA70; // type:function size:0x8C -fn_8016EB00 = .text:0x8016EB00; // type:function size:0x4 -fn_8016EB10 = .text:0x8016EB10; // type:function size:0x10 -fn_8016EB20 = .text:0x8016EB20; // type:function size:0x10 -AcItem__isTear = .text:0x8016EB30; // type:function size:0x4 -fn_8016EB40 = .text:0x8016EB40; // type:function size:0x360 -fn_8016EEA0 = .text:0x8016EEA0; // type:function size:0x1C -fn_8016EEC0 = .text:0x8016EEC0; // type:function size:0x48 -fn_8016EF10 = .text:0x8016EF10; // type:function size:0x48 -fn_8016EF60 = .text:0x8016EF60; // type:function size:0x84 -fn_8016EFF0 = .text:0x8016EFF0; // type:function size:0x4 -fn_8016F000 = .text:0x8016F000; // type:function size:0x48 -fn_8016F050 = .text:0x8016F050; // type:function size:0x48 -AcItem__isStarryFirefly = .text:0x8016F0A0; // type:function size:0x4 -fn_8016F0B0 = .text:0x8016F0B0; // type:function size:0x13C -fn_8016F1F0 = .text:0x8016F1F0; // type:function size:0x8 -fn_8016F200 = .text:0x8016F200; // type:function size:0x8 -fn_8016F210 = .text:0x8016F210; // type:function size:0x8 -fn_8016F220 = .text:0x8016F220; // type:function size:0x78 -fn_8016F2A0 = .text:0x8016F2A0; // type:function size:0x4 -fn_8016F2B0 = .text:0x8016F2B0; // type:function size:0x10 -fn_8016F2C0 = .text:0x8016F2C0; // type:function size:0x10 -fn_8016F2D0 = .text:0x8016F2D0; // type:function size:0x8 -hasItemPotionBottleModel = .text:0x8016F2E0; // type:function size:0x6C -fn_8016F350 = .text:0x8016F350; // type:function size:0x1D4 -fn_8016F530 = .text:0x8016F530; // type:function size:0x8 -fn_8016F540 = .text:0x8016F540; // type:function size:0x8 -fn_8016F550 = .text:0x8016F550; // type:function size:0x8 -fn_8016F560 = .text:0x8016F560; // type:function size:0x8C -fn_8016F5F0 = .text:0x8016F5F0; // type:function size:0x4 -fn_8016F600 = .text:0x8016F600; // type:function size:0x10 -fn_8016F610 = .text:0x8016F610; // type:function size:0x10 -fn_8016F620 = .text:0x8016F620; // type:function size:0x8 -fn_8016F630 = .text:0x8016F630; // type:function size:0x88 -fn_8016F6C0 = .text:0x8016F6C0; // type:function size:0x58 -fn_8016F720 = .text:0x8016F720; // type:function size:0x7C -fn_8016F7A0 = .text:0x8016F7A0; // type:function size:0x8 -fn_8016F7B0 = .text:0x8016F7B0; // type:function size:0xAC -fn_8016F860 = .text:0x8016F860; // type:function size:0x8 -fn_8016F870 = .text:0x8016F870; // type:function size:0x70 -fn_8016F8E0 = .text:0x8016F8E0; // type:function size:0x7C -fn_8016F960 = .text:0x8016F960; // type:function size:0x7C +isMdlForItemId__13dItemMdlPut_cFUs = .text:0x8016E2A0; // type:function size:0x6C +init__13dItemMdlPut_cFUsP9dAcItem_cP12mAllocator_c = .text:0x8016E310; // type:function size:0x194 +vt_0x10__13dItemMdlPut_cFUc = .text:0x8016E4B0; // type:function size:0x1C +setScale__13dItemMdlPut_cFRC7mVec3_c = .text:0x8016E4D0; // type:function size:0x48 +setLocalMtx__13dItemMdlPut_cFRC6mMtx_c = .text:0x8016E520; // type:function size:0x48 +draw__13dItemMdlPut_cFv = .text:0x8016E570; // type:function size:0x40 +vt_0x20__13dItemMdlPut_cFv = .text:0x8016E5B0; // type:function size:0x4 +setPriorityDraw__13dItemMdlPut_cFv = .text:0x8016E5C0; // type:function size:0x48 +unsetPriorityDraw__13dItemMdlPut_cFv = .text:0x8016E610; // type:function size:0x48 +isMdlForItemId__16dItemMdlShield_cFUs = .text:0x8016E660; // type:function size:0x6C +init__16dItemMdlShield_cFUsP9dAcItem_cP12mAllocator_c = .text:0x8016E6D0; // type:function size:0x15C +vt_0x10__16dItemMdlShield_cFUc = .text:0x8016E830; // type:function size:0x8 +setScale__16dItemMdlShield_cFRC7mVec3_c = .text:0x8016E840; // type:function size:0x8 +setLocalMtx__16dItemMdlShield_cFRC6mMtx_c = .text:0x8016E850; // type:function size:0x8 +draw__16dItemMdlShield_cFv = .text:0x8016E860; // type:function size:0x30 +vt_0x20__16dItemMdlShield_cFv = .text:0x8016E890; // type:function size:0x4 +setPriorityDraw__16dItemMdlShield_cFv = .text:0x8016E8A0; // type:function size:0x10 +unsetPriorityDraw__16dItemMdlShield_cFv = .text:0x8016E8B0; // type:function size:0x10 +isMdlForItemId__16dItemMdlBottle_cFUs = .text:0x8016E8C0; // type:function size:0x6C +init__16dItemMdlBottle_cFUsP9dAcItem_cP12mAllocator_c = .text:0x8016E930; // type:function size:0x104 +vt_0x10__16dItemMdlBottle_cFUc = .text:0x8016EA40; // type:function size:0x8 +setScale__16dItemMdlBottle_cFRC7mVec3_c = .text:0x8016EA50; // type:function size:0x8 +setLocalMtx__16dItemMdlBottle_cFRC6mMtx_c = .text:0x8016EA60; // type:function size:0x8 +draw__16dItemMdlBottle_cFv = .text:0x8016EA70; // type:function size:0x8C +vt_0x20__16dItemMdlBottle_cFv = .text:0x8016EB00; // type:function size:0x4 +setPriorityDraw__16dItemMdlBottle_cFv = .text:0x8016EB10; // type:function size:0x10 +unsetPriorityDraw__16dItemMdlBottle_cFv = .text:0x8016EB20; // type:function size:0x10 +isMdlForItemId__14dItemMdlTear_cFUs = .text:0x8016EB30; // type:function size:0x4 +init__14dItemMdlTear_cFUsP9dAcItem_cP12mAllocator_c = .text:0x8016EB40; // type:function size:0x360 +vt_0x10__14dItemMdlTear_cFUc = .text:0x8016EEA0; // type:function size:0x1C +setScale__14dItemMdlTear_cFRC7mVec3_c = .text:0x8016EEC0; // type:function size:0x48 +setLocalMtx__14dItemMdlTear_cFRC6mMtx_c = .text:0x8016EF10; // type:function size:0x48 +draw__14dItemMdlTear_cFv = .text:0x8016EF60; // type:function size:0x84 +vt_0x20__14dItemMdlTear_cFv = .text:0x8016EFF0; // type:function size:0x4 +setPriorityDraw__14dItemMdlTear_cFv = .text:0x8016F000; // type:function size:0x48 +unsetPriorityDraw__14dItemMdlTear_cFv = .text:0x8016F050; // type:function size:0x48 +isMdlForItemId__17dItemMdlFirefly_cFUs = .text:0x8016F0A0; // type:function size:0x4 +init__17dItemMdlFirefly_cFUsP9dAcItem_cP12mAllocator_c = .text:0x8016F0B0; // type:function size:0x13C +vt_0x10__17dItemMdlFirefly_cFUc = .text:0x8016F1F0; // type:function size:0x8 +setScale__17dItemMdlFirefly_cFRC7mVec3_c = .text:0x8016F200; // type:function size:0x8 +setLocalMtx__17dItemMdlFirefly_cFRC6mMtx_c = .text:0x8016F210; // type:function size:0x8 +draw__17dItemMdlFirefly_cFv = .text:0x8016F220; // type:function size:0x78 +vt_0x20__17dItemMdlFirefly_cFv = .text:0x8016F2A0; // type:function size:0x4 +setPriorityDraw__17dItemMdlFirefly_cFv = .text:0x8016F2B0; // type:function size:0x10 +unsetPriorityDraw__17dItemMdlFirefly_cFv = .text:0x8016F2C0; // type:function size:0x10 +getMdl__17dItemMdlFirefly_cFv = .text:0x8016F2D0; // type:function size:0x8 +isMdlForItemId__16dItemMdlPotion_cFUs = .text:0x8016F2E0; // type:function size:0x6C +init__16dItemMdlPotion_cFUsP9dAcItem_cP12mAllocator_c = .text:0x8016F350; // type:function size:0x1D4 +vt_0x10__16dItemMdlPotion_cFUc = .text:0x8016F530; // type:function size:0x8 +setScale__16dItemMdlPotion_cFRC7mVec3_c = .text:0x8016F540; // type:function size:0x8 +setLocalMtx__16dItemMdlPotion_cFRC6mMtx_c = .text:0x8016F550; // type:function size:0x8 +draw__16dItemMdlPotion_cFv = .text:0x8016F560; // type:function size:0x8C +vt_0x20__16dItemMdlPotion_cFv = .text:0x8016F5F0; // type:function size:0x4 +setPriorityDraw__16dItemMdlPotion_cFv = .text:0x8016F600; // type:function size:0x10 +unsetPriorityDraw__16dItemMdlPotion_cFv = .text:0x8016F610; // type:function size:0x10 +getMdl__16dItemMdlPotion_cFv = .text:0x8016F620; // type:function size:0x8 +__dt__16dItemMdlPotion_cFv = .text:0x8016F630; // type:function size:0x88 scope:weak +__dt__10dItemMdl_cFv = .text:0x8016F6C0; // type:function size:0x58 scope:weak +__dt__17dItemMdlFirefly_cFv = .text:0x8016F720; // type:function size:0x7C scope:weak +getMdl__10dItemMdl_cFv = .text:0x8016F7A0; // type:function size:0x8 scope:weak +__dt__14dItemMdlTear_cFv = .text:0x8016F7B0; // type:function size:0xAC scope:weak +getMdl__16dItemMdlBottle_cFv = .text:0x8016F860; // type:function size:0x8 scope:weak +__dt__16dItemMdlBottle_cFv = .text:0x8016F870; // type:function size:0x70 scope:weak +__dt__16dItemMdlShield_cFv = .text:0x8016F8E0; // type:function size:0x7C scope:weak +__dt__13dItemMdlPut_cFv = .text:0x8016F960; // type:function size:0x7C scope:weak hasItemModel = .text:0x8016F9E0; // type:function size:0x6C getItemModelForItem = .text:0x8016FA50; // type:function size:0x2C0 fn_8016FD10 = .text:0x8016FD10; // type:function size:0x8 @@ -13388,9 +13389,9 @@ fn_8024A2A0 = .text:0x8024A2A0; // type:function size:0x10 AcItem__getItemId = .text:0x8024A2B0; // type:function size:0x8 AcItem__getTearNumber = .text:0x8024A2C0; // type:function size:0xC getFirstBitParams2 = .text:0x8024A2D0; // type:function size:0x24 -getParams2Lower_shift1_0x7 = .text:0x8024A300; // type:function size:0x24 +getParams2Lower_shift1_0x7__9dAcItem_cCFv = .text:0x8024A300; // type:function size:0x24 getCurrentTrial__9dAcItem_cFv = .text:0x8024A330; // type:function size:0x68 -getTearSubtype = .text:0x8024A3A0; // type:function size:0x68 +getTearSubtype__9dAcItem_cF7ITEM_ID = .text:0x8024A3A0; // type:function size:0x68 AcItem__GetItemGetType = .text:0x8024A410; // type:function size:0x3C AcItem__getItemListElement = .text:0x8024A450; // type:function size:0x8 AcItem__getFinalDeterminedItemId = .text:0x8024A460; // type:function size:0x8 @@ -13472,8 +13473,8 @@ isItemSligshot = .text:0x80250A60; // type:function size:0x10 is10DekuSeeds = .text:0x80250A70; // type:function size:0x10 AcItem__isHeartPiece = .text:0x80250A80; // type:function size:0x10 AcItem__isDekuHornet = .text:0x80250A90; // type:function size:0x10 -AcItem__isStarryFirefly2 = .text:0x80250AA0; // type:function size:0x10 -AcItem__isJellyBlob = .text:0x80250AB0; // type:function size:0x10 +isStarryFirefly__9dAcItem_cF7ITEM_ID = .text:0x80250AA0; // type:function size:0x10 +isJellyBlob__9dAcItem_cF7ITEM_ID = .text:0x80250AB0; // type:function size:0x10 AcItem__isDarkTreasure = .text:0x80250AC0; // type:function size:0x10 AcItem__isCommonTreasure = .text:0x80250AD0; // type:function size:0x10 AcItem__isSemiRareTreasure = .text:0x80250AE0; // type:function size:0x10 @@ -13482,13 +13483,13 @@ fn_80250B00 = .text:0x80250B00; // type:function size:0x10 fn_80250B10 = .text:0x80250B10; // type:function size:0x10 isRupee__9dAcItem_cF7ITEM_ID = .text:0x80250B20; // type:function size:0x88 AcItem__isBombDrop = .text:0x80250BB0; // type:function size:0x58 -AcItem__isTear2 = .text:0x80250C10; // type:function size:0x78 +isTear__9dAcItem_cF7ITEM_ID = .text:0x80250C10; // type:function size:0x78 AcItem__is_Larvae_Ore_JellyBlob_Claw_Horn_EvilCryst_OrnSkull_GoldSkull = .text:0x80250C90; // type:function size:0xB8 AcItem__isBug = .text:0x80250D50; // type:function size:0x7C AcItem__isTreasure = .text:0x80250DD0; // type:function size:0x138 isTreasure__9dAcItem_cF7ITEM_ID = .text:0x80250F10; // type:function size:0x88 AcItem__isItemHeart = .text:0x80250FA0; // type:function size:0x34 -isSingleArrow = .text:0x80250FE0; // type:function size:0x8 +isSingleArrow__9dAcItem_cCFv = .text:0x80250FE0; // type:function size:0x8 isBundleOrArrows = .text:0x80250FF0; // type:function size:0x8 AcItem__isItemSilverRupee = .text:0x80251000; // type:function size:0x8 AcItem__isItemGoldRupee = .text:0x80251010; // type:function size:0x8 @@ -14621,7 +14622,7 @@ doDelete__10dTgEvent_cFv = .text:0x8027A450; // type:function size:0x8 actorExecute__10dTgEvent_cFv = .text:0x8027A460; // type:function size:0x150 actorExecuteInEvent__10dTgEvent_cFv = .text:0x8027A5B0; // type:function size:0x108 draw__10dTgEvent_cFv = .text:0x8027A6C0; // type:function size:0x8 -__dt__10dTgEvent_cFv = .text:0x8027A6D0; // type:function size:0x70 +__dt__10dTgEvent_cFv = .text:0x8027A6D0; // type:function size:0x70 scope:weak dTgEventF_c_classInit__Fv = .text:0x8027A740; // type:function size:0x5C create__11dTgEventF_cFv = .text:0x8027A7A0; // type:function size:0x9C doDelete__11dTgEventF_cFv = .text:0x8027A840; // type:function size:0x8 @@ -14632,7 +14633,7 @@ unsetStoryFlag__11dTgEventF_cF12StoryFlags_e = .text:0x8027A8E0; // type:functio actorExecute__11dTgEventF_cFv = .text:0x8027A900; // type:function size:0xFC actorExecuteInEvent__11dTgEventF_cFv = .text:0x8027AA00; // type:function size:0xB0 draw__11dTgEventF_cFv = .text:0x8027AAB0; // type:function size:0x8 -__dt__11dTgEventF_cFv = .text:0x8027AAC0; // type:function size:0x70 +__dt__11dTgEventF_cFv = .text:0x8027AAC0; // type:function size:0x70 scope:weak TgTkEvnt__ctor = .text:0x8027AB30; // type:function size:0xB8 fn_8027ABF0 = .text:0x8027ABF0; // type:function size:0x58 fn_8027AC50 = .text:0x8027AC50; // type:function size:0x6C @@ -26254,10 +26255,10 @@ switchThreadCallback__Q23EGG6ThreadFP8OSThreadP8OSThread = .text:0x80496C70; // setCommonMesgQueue__Q23EGG6ThreadFiPQ23EGG4Heap = .text:0x80496D60; // type:function size:0x5C start__Q23EGG6ThreadFPv = .text:0x80496DC0; // type:function size:0x10 run__Q23EGG6ThreadFv = .text:0x80496DD0; // type:function size:0x8 scope:weak -getThreadIndex__Q23EGG13ThreadMgrFP8OSThread = .text:0x80496DE0; // type:function size:0x44 -doRegisterThread__Q23EGG13ThreadMgrFP8OSThread = .text:0x80496E30; // type:function size:0xD8 -sortByPriority__Q23EGG13ThreadMgrFv = .text:0x80496F10; // type:function size:0x1CC -registerThread__Q23EGG13ThreadMgrFP8OSThreadQ23EGG13UnknownStruct = .text:0x804970E0; // type:function size:0x8C +getThreadIndex__Q23EGG9ThreadMgrFP8OSThread = .text:0x80496DE0; // type:function size:0x44 +doRegisterThread__Q23EGG9ThreadMgrFP8OSThread = .text:0x80496E30; // type:function size:0xD8 +sortByPriority__Q23EGG9ThreadMgrFv = .text:0x80496F10; // type:function size:0x1CC +registerThread__Q23EGG9ThreadMgrFP8OSThreadQ23EGG13UnknownStruct = .text:0x804970E0; // type:function size:0x8C initMemory__Q23EGG17ConfigurationDataFv = .text:0x80497170; // type:function size:0x174 run__Q23EGG17ConfigurationDataFv = .text:0x804972F0; // type:function size:0x23C PreRetraceCallback = .text:0x80497530; // type:function size:0x40 @@ -28185,17 +28186,17 @@ roomStageHandlers = .rodata:0x804E0C00; // type:object size:0x10 scope:local stageRoomHandlers = .rodata:0x804E0C10; // type:object size:0x10 scope:local roomHandlers = .rodata:0x804E0C20; // type:object size:0x60 scope:local roomReactivateHandlers = .rodata:0x804E0C80; // type:object size:0x18 scope:local -gRMO_Pal60_608x456Prog_16x9 = .rodata:0x804E0C98; // type:object size:0x3C -gRMO_Pal60_608x456IntDf_16x9 = .rodata:0x804E0CD4; // type:object size:0x3C -gRMO_Pal50_608x456IntDf_16x9 = .rodata:0x804E0D10; // type:object size:0x3C -gRMO_Ntsc_608x456Prog_16x9 = .rodata:0x804E0D4C; // type:object size:0x3C -gRMO_Ntsc_608x456IntDf_16x9 = .rodata:0x804E0D88; // type:object size:0x3C -gRMO_Pal60_608x456Prog_4x3 = .rodata:0x804E0DC4; // type:object size:0x3C -gRMO_Pal60_608x456IntDf_4x3 = .rodata:0x804E0E00; // type:object size:0x3C -gRMO_Pal50_608x456IntDf_4x3 = .rodata:0x804E0E3C; // type:object size:0x3C -gRMO_Ntsc_608x456Prog_4x3 = .rodata:0x804E0E78; // type:object size:0x3C -gRMO_Ntsc_608x456IntDf_4x3 = .rodata:0x804E0EB4; // type:object size:0x3C -gSysRenderModeObjSet = .rodata:0x804E0EF0; // type:object size:0x28 +gRMO_Pal60_608x456Prog_16x9 = .rodata:0x804E0C98; // type:object size:0x3C scope:local +gRMO_Pal60_608x456IntDf_16x9 = .rodata:0x804E0CD4; // type:object size:0x3C scope:local +gRMO_Pal50_608x456IntDf_16x9 = .rodata:0x804E0D10; // type:object size:0x3C scope:local +gRMO_Ntsc_608x456Prog_16x9 = .rodata:0x804E0D4C; // type:object size:0x3C scope:local +gRMO_Ntsc_608x456IntDf_16x9 = .rodata:0x804E0D88; // type:object size:0x3C scope:local +gRMO_Pal60_608x456Prog_4x3 = .rodata:0x804E0DC4; // type:object size:0x3C scope:local +gRMO_Pal60_608x456IntDf_4x3 = .rodata:0x804E0E00; // type:object size:0x3C scope:local +gRMO_Pal50_608x456IntDf_4x3 = .rodata:0x804E0E3C; // type:object size:0x3C scope:local +gRMO_Ntsc_608x456Prog_4x3 = .rodata:0x804E0E78; // type:object size:0x3C scope:local +gRMO_Ntsc_608x456IntDf_4x3 = .rodata:0x804E0EB4; // type:object size:0x3C scope:local +gSysRenderModeObjSet = .rodata:0x804E0EF0; // type:object size:0x28 scope:local @LOCAL@ModeProc__Q26dReset8Manage_cFv@procs = .rodata:0x804E0F18; // type:object size:0x48 scope:local @LOCAL@ModeRequest__Q26dReset8Manage_cFQ36dReset8Manage_c6Mode_e@procs = .rodata:0x804E0F60; // type:object size:0x48 scope:local sInfos = .rodata:0x804E0FA8; // type:object size:0x246C scope:local data:4byte @@ -28351,17 +28352,17 @@ lbl_804E8D08 = .rodata:0x804E8D08; // type:object size:0x10 lbl_804E8D18 = .rodata:0x804E8D18; // type:object size:0x10 brlanMap = .rodata:0x804E8D28; // type:object size:0x48 scope:local data:4byte brlanMap = .rodata:0x804E8D70; // type:object size:0x40 scope:local data:4byte -ITEM_TO_MODEL_INDEX = .rodata:0x804E8DB0; // type:object size:0x400 +ITEM_TO_MODEL_INDEX = .rodata:0x804E8DB0; // type:object size:0x400 scope:local data:2byte @8849 = .rodata:0x804E91B0; // type:object size:0x20 scope:local data:4byte -MODEL_ID_TO_PUT_ITEM_MODEL_IDX = .rodata:0x804E91D0; // type:object size:0xA8 -PUT_ITEM_MODEL_NAMES = .rodata:0x804E9278; // type:object size:0xA0 -GET_SHIELD_MODEL_INDEX = .rodata:0x804E9318; // type:object size:0xA8 -GET_SHIELD_MODEL_NAMES = .rodata:0x804E93C0; // type:object size:0x90 -GET_BOTTLE_MODEL_INDEX = .rodata:0x804E9450; // type:object size:0xA8 -GET_BOTTLE_MODEL_NAMES = .rodata:0x804E94F8; // type:object size:0x60 -TEAR_TYPE_COLOR_FRAMES = .rodata:0x804E9558; // type:object size:0x10 -GET_POTION_BOTTLE_MODEL_INDEX = .rodata:0x804E9568; // type:object size:0xA8 -GET_POTION_BOTTLE_DEFS = .rodata:0x804E9610; // type:object size:0x40 +sMdlIdx__13dItemMdlPut_c = .rodata:0x804E91D0; // type:object size:0xA7 +sMdlConfig__13dItemMdlPut_c = .rodata:0x804E9278; // type:object size:0xA0 +sMdlIdx__16dItemMdlShield_c = .rodata:0x804E9318; // type:object size:0xA7 +sMdlConfig__16dItemMdlShield_c = .rodata:0x804E93C0; // type:object size:0x90 +sMdlIdx__16dItemMdlBottle_c = .rodata:0x804E9450; // type:object size:0xA7 +sMdlConfig__16dItemMdlBottle_c = .rodata:0x804E94F8; // type:object size:0x60 +sMdlConfig__14dItemMdlTear_c = .rodata:0x804E9558; // type:object size:0x10 +sMdlIdx__16dItemMdlPotion_c = .rodata:0x804E9568; // type:object size:0xA7 +sMdlConfig__16dItemMdlPotion_c = .rodata:0x804E9610; // type:object size:0x40 ITEM_MODEL_INDEX = .rodata:0x804E9650; // type:object size:0xA8 ITEM_MODEL_DEFS = .rodata:0x804E96F8; // type:object size:0x350 RUPEE_ITEM_TO_TEX_FRAME = .rodata:0x804E9A48; // type:object size:0x38 data:2byte @@ -29272,12 +29273,13 @@ gTRKMemMap = .rodata:0x804FCFC0; // type:object size:0x10 data:4byte lbl_804FCFD0 = .rodata:0x804FCFD0; // type:object size:0x28 data:4byte lbl_804FCFF8 = .rodata:0x804FCFF8; // type:object size:0x28 data:4byte lbl_804FD020 = .rodata:0x804FD020; // type:object size:0x28 data:4byte -@805 = .data:0x804FD060; // type:object size:0xB data:string -@806 = .data:0x804FD06C; // type:object size:0xC data:string -@810 = .data:0x804FD078; // type:object size:0x1B data:string -@812 = .data:0x804FD094; // type:object size:0x12 data:string -@815 = .data:0x804FD0A8; // type:object size:0xB data:string -lbl_804FD0B8 = .data:0x804FD0B8; // type:object size:0x10 +@807 = .data:0x804FD060; // type:object size:0xB scope:local data:string +...data.0 = .data:0x804FD060; // type:label scope:local +@808 = .data:0x804FD06C; // type:object size:0xC scope:local data:string +@812 = .data:0x804FD078; // type:object size:0x1B scope:local data:string +@814 = .data:0x804FD094; // type:object size:0x12 scope:local data:string +@817 = .data:0x804FD0A8; // type:object size:0xB scope:local data:string +__vt__6dMdl_c = .data:0x804FD0B8; // type:object size:0xC @5819 = .data:0x804FD0C8; // type:object size:0x10 scope:local data:string ...data.0 = .data:0x804FD0C8; // type:label scope:local @5821 = .data:0x804FD0D8; // type:object size:0x10 scope:local data:string @@ -30887,12 +30889,13 @@ __vt__24daPlBaseScnObjCallback_c = .data:0x8050DDB8; // type:object size:0x20 __vt__8dScene_c = .data:0x8050DDF8; // type:object size:0x4C @23343 = .data:0x8050DE48; // type:object size:0xE scope:local data:string @25556 = .data:0x8050DE58; // type:object size:0x11 scope:local data:string +...data.0 = .data:0x8050DE58; // type:label scope:local @25619 = .data:0x8050DE6C; // type:object size:0x15 scope:local data:string @25620 = .data:0x8050DE84; // type:object size:0x15 scope:local data:string @25621 = .data:0x8050DE9C; // type:object size:0x15 scope:local data:string @25756 = .data:0x8050DEB4; // type:object size:0xD scope:local data:string @25757 = .data:0x8050DEC4; // type:object size:0xE scope:local data:string -__vt__Q23EGG126TSystem = .data:0x8050DED4; // type:object size:0x3C +__vt__Q23EGG126TSystem = .data:0x8050DED4; // type:object size:0x3C scope:weak lbl_8050DF10 = .data:0x8050DF10; // type:object size:0x18 @9033 = .data:0x8050DF28; // type:object size:0x11 scope:local data:string @9034 = .data:0x8050DF3C; // type:object size:0x11 scope:local data:string @@ -35088,52 +35091,57 @@ __vt__11TearCounter = .data:0x80528050; // type:object size:0x20 scope:weak __vt__20SlingshotSeedCounter = .data:0x80528070; // type:object size:0x20 scope:weak __vt__15KeyPieceCounter = .data:0x80528090; // type:object size:0x20 scope:weak __vt__18ExtraWalletCounter = .data:0x805280B0; // type:object size:0x20 scope:weak -lbl_805280D0 = .data:0x805280D0; // type:object size:0x9 data:string -lbl_805280DC = .data:0x805280DC; // type:object size:0x9 data:string -lbl_805280E8 = .data:0x805280E8; // type:object size:0xF data:string -lbl_805280F8 = .data:0x805280F8; // type:object size:0xF data:string -lbl_80528108 = .data:0x80528108; // type:object size:0x9 data:string -lbl_80528114 = .data:0x80528114; // type:object size:0x9 data:string -lbl_80528120 = .data:0x80528120; // type:object size:0xC data:string -lbl_8052812C = .data:0x8052812C; // type:object size:0x12 data:string -lbl_80528140 = .data:0x80528140; // type:object size:0xC data:string -lbl_8052814C = .data:0x8052814C; // type:object size:0x12 data:string -lbl_80528160 = .data:0x80528160; // type:object size:0xB data:string -lbl_8052816C = .data:0x8052816C; // type:object size:0xB data:string -lbl_80528178 = .data:0x80528178; // type:object size:0xE data:string -lbl_80528188 = .data:0x80528188; // type:object size:0xE data:string -lbl_80528198 = .data:0x80528198; // type:object size:0xF data:string -lbl_805281A8 = .data:0x805281A8; // type:object size:0xF data:string -lbl_805281B8 = .data:0x805281B8; // type:object size:0x12 data:string -lbl_805281CC = .data:0x805281CC; // type:object size:0x12 data:string -lbl_805281E0 = .data:0x805281E0; // type:object size:0xC data:string -lbl_805281EC = .data:0x805281EC; // type:object size:0xC data:string -lbl_805281F8 = .data:0x805281F8; // type:object size:0xE data:string -lbl_80528208 = .data:0x80528208; // type:object size:0xE data:string -lbl_80528218 = .data:0x80528218; // type:object size:0x10 data:string -lbl_80528228 = .data:0x80528228; // type:object size:0xE data:string -lbl_80528238 = .data:0x80528238; // type:object size:0x10 data:string -lbl_80528248 = .data:0x80528248; // type:object size:0xE data:string -lbl_80528258 = .data:0x80528258; // type:object size:0x10 data:string -lbl_80528268 = .data:0x80528268; // type:object size:0xF data:string -lbl_80528278 = .data:0x80528278; // type:object size:0x9 data:string -lbl_80528284 = .data:0x80528284; // type:object size:0xE data:string -lbl_80528298 = .data:0x80528298; // type:object size:0x10 data:string -lbl_805282A8 = .data:0x805282A8; // type:object size:0x11 data:string -lbl_805282BC = .data:0x805282BC; // type:object size:0xF data:string -lbl_805282CC = .data:0x805282CC; // type:object size:0xA data:string -lbl_805282D8 = .data:0x805282D8; // type:object size:0x44 -lbl_8052831C = .data:0x8052831C; // type:object size:0x11 data:string -lbl_80528330 = .data:0x80528330; // type:object size:0x10 data:string -lbl_80528340 = .data:0x80528340; // type:object size:0xE data:string -lbl_80528350 = .data:0x80528350; // type:object size:0xD data:string -lbl_80528360 = .data:0x80528360; // type:object size:0x9 data:string -PotionModel_vtable = .data:0x80528370; // type:object size:0x30 -FireflyModel_vtable = .data:0x805283A0; // type:object size:0x30 -TearModel_vtable = .data:0x805283D0; // type:object size:0x30 -BottleModel_vtable = .data:0x80528400; // type:object size:0x30 -ShieldModel_vtable = .data:0x80528430; // type:object size:0x30 -PutItemModel_vtable = .data:0x80528460; // type:object size:0x30 +@20954 = .data:0x805280D0; // type:object size:0x9 scope:local data:string +...data.0 = .data:0x805280D0; // type:label scope:local +@20955 = .data:0x805280DC; // type:object size:0x9 scope:local data:string +@20956 = .data:0x805280E8; // type:object size:0xF scope:local data:string +@20957 = .data:0x805280F8; // type:object size:0xF scope:local data:string +@20958 = .data:0x80528108; // type:object size:0x9 scope:local data:string +@20959 = .data:0x80528114; // type:object size:0x9 scope:local data:string +@20960 = .data:0x80528120; // type:object size:0xC scope:local data:string +@20961 = .data:0x8052812C; // type:object size:0x12 scope:local data:string +@20962 = .data:0x80528140; // type:object size:0xC scope:local data:string +@20963 = .data:0x8052814C; // type:object size:0x12 scope:local data:string +@20964 = .data:0x80528160; // type:object size:0xB scope:local data:string +@20965 = .data:0x8052816C; // type:object size:0xB scope:local data:string +@20968 = .data:0x80528178; // type:object size:0xE scope:local data:string +@20969 = .data:0x80528188; // type:object size:0xE scope:local data:string +@20970 = .data:0x80528198; // type:object size:0xF scope:local data:string +@20971 = .data:0x805281A8; // type:object size:0xF scope:local data:string +@20972 = .data:0x805281B8; // type:object size:0x12 scope:local data:string +@20973 = .data:0x805281CC; // type:object size:0x12 scope:local data:string +@20974 = .data:0x805281E0; // type:object size:0xC scope:local data:string +@20975 = .data:0x805281EC; // type:object size:0xC scope:local data:string +@21911 = .data:0x805281F8; // type:object size:0xE scope:local data:string +@21075 = .data:0x80528208; // type:object size:0xE scope:local data:string +@21076 = .data:0x80528218; // type:object size:0x10 scope:local data:string +@21077 = .data:0x80528228; // type:object size:0xE scope:local data:string +@21078 = .data:0x80528238; // type:object size:0x10 scope:local data:string +@21079 = .data:0x80528248; // type:object size:0xE scope:local data:string +@21080 = .data:0x80528258; // type:object size:0x10 scope:local data:string +@21169 = .data:0x80528268; // type:object size:0xF scope:local data:string +@21170 = .data:0x80528278; // type:object size:0x9 scope:local data:string +@21171 = .data:0x80528284; // type:object size:0xE scope:local data:string +@21172 = .data:0x80528298; // type:object size:0x10 scope:local data:string +@21173 = .data:0x805282A8; // type:object size:0x11 scope:local data:string +@21174 = .data:0x805282BC; // type:object size:0xF scope:local data:string +@21175 = .data:0x805282CC; // type:object size:0xA scope:local data:string +@21176 = .data:0x805282D8; // type:object size:0x11 scope:local data:string +@22131 = .data:0x805282EC; // type:object size:0xA scope:local data:string +@22132 = .data:0x805282F8; // type:object size:0xB scope:local data:string +@22134 = .data:0x80528304; // type:object size:0xA scope:local data:string +@22135 = .data:0x80528310; // type:object size:0xB scope:local data:string +@22198 = .data:0x8052831C; // type:object size:0x11 scope:local data:string +@21526 = .data:0x80528330; // type:object size:0x10 scope:local data:string +@21527 = .data:0x80528340; // type:object size:0xE scope:local data:string +@21528 = .data:0x80528350; // type:object size:0xD scope:local data:string +@21529 = .data:0x80528360; // type:object size:0x9 scope:local data:string +__vt__16dItemMdlPotion_c = .data:0x80528370; // type:object size:0x30 +__vt__17dItemMdlFirefly_c = .data:0x805283A0; // type:object size:0x30 +__vt__14dItemMdlTear_c = .data:0x805283D0; // type:object size:0x30 +__vt__16dItemMdlBottle_c = .data:0x80528400; // type:object size:0x30 +__vt__16dItemMdlShield_c = .data:0x80528430; // type:object size:0x30 +__vt__13dItemMdlPut_c = .data:0x80528460; // type:object size:0x30 lbl_80528490 = .data:0x80528490; // type:object size:0xC data:string lbl_8052849C = .data:0x8052849C; // type:object size:0x9 data:string lbl_805284A8 = .data:0x805284A8; // type:object size:0xA data:string @@ -36479,9 +36487,9 @@ lbl_80536628 = .data:0x80536628; // type:object size:0x68 g_profile_CAMERA2_TAG = .data:0x80536690; // type:object size:0x10 lbl_805366A0 = .data:0x805366A0; // type:object size:0x78 g_profile_EVENT_TAG = .data:0x80536718; // type:object size:0x10 -__vt__10dTgEvent_c = .data:0x80536728; // type:object size:0x78 +__vt__10dTgEvent_c = .data:0x80536728; // type:object size:0x74 g_profile_EVENTF_TAG = .data:0x805367A0; // type:object size:0x10 -__vt__11dTgEventF_c = .data:0x805367B0; // type:object size:0x78 +__vt__11dTgEventF_c = .data:0x805367B0; // type:object size:0x74 g_profile_TAG_TKEVNT = .data:0x80536828; // type:object size:0x10 TgTkEvnt__vtable = .data:0x80536838; // type:object size:0x78 lbl_805368B0 = .data:0x805368B0; // type:object size:0x30 @@ -39536,10 +39544,11 @@ __vt__Q23EGG7FrmHeap = .data:0x8056E9D0; // type:object size:0x30 __vt__Q23EGG10AssertHeap = .data:0x8056EA00; // type:object size:0x30 __vt__Q23EGG8Disposer = .data:0x8056EA30; // type:object size:0xC __vt__Q23EGG6Thread = .data:0x8056EA40; // type:object size:0x18 -@8336 = .data:0x8056EA58; // type:object size:0xC data:string -@8337 = .data:0x8056EA64; // type:object size:0xC data:string -@8338 = .data:0x8056EA70; // type:object size:0xD data:string -@8339 = .data:0x8056EA80; // type:object size:0xA data:string +@8332 = .data:0x8056EA58; // type:object size:0xC scope:local data:string +...data.0 = .data:0x8056EA58; // type:label scope:local +@8333 = .data:0x8056EA64; // type:object size:0xC scope:local data:string +@8334 = .data:0x8056EA70; // type:object size:0xD scope:local data:string +@8335 = .data:0x8056EA80; // type:object size:0xA scope:local data:string lbl_8056EA8C = .data:0x8056EA8C; // type:object size:0x3C __vt__Q23EGG7Display = .data:0x8056EAC8; // type:object size:0x20 __vt__Q23EGG10ColorFader = .data:0x8056EAE8; // type:object size:0x24 @@ -39720,8 +39729,8 @@ jumptable_805713B0 = .data:0x805713B0; // type:object size:0x1C scope:local jumptable_805713CC = .data:0x805713CC; // type:object size:0x1C scope:local @stringBase0 = .data:0x805713E8; // type:object size:0x30 scope:local data:string_table gTRKExceptionStatus = .data:0x80571418; // type:object size:0x10 scope:local data:4byte -@813 = .sdata:0x80571440; // type:object size:0x8 -@813 = .sdata:0x80571448; // type:object size:0x8 data:string +@813 = .sdata:0x80571440; // type:object size:0x1 scope:local +@815 = .sdata:0x80571448; // type:object size:0x8 scope:local data:string @5820 = .sdata:0x80571450; // type:object size:0x3 scope:local data:string @5822 = .sdata:0x80571454; // type:object size:0x4 scope:local data:string @5824 = .sdata:0x80571458; // type:object size:0x5 scope:local data:string @@ -40568,9 +40577,9 @@ sGroupName = .sdata:0x805729C8; // type:object size:0x4 scope:local data:4byte @11240 = .sdata:0x805729F8; // type:object size:0x8 scope:local data:string @11626 = .sdata:0x80572A00; // type:object size:0x1 scope:local @30454 = .sdata:0x80572A08; // type:object size:0x5 scope:local data:string -lbl_80572A10 = .sdata:0x80572A10; // type:object size:0x8 data:string -lbl_80572A18 = .sdata:0x80572A18; // type:object size:0x8 data:string -lbl_80572A20 = .sdata:0x80572A20; // type:object size:0x8 data:string +@20966 = .sdata:0x80572A10; // type:object size:0x8 scope:local data:string +@20967 = .sdata:0x80572A18; // type:object size:0x8 scope:local data:string +@22133 = .sdata:0x80572A20; // type:object size:0x8 scope:local data:string lbl_80572A28 = .sdata:0x80572A28; // type:object size:0x8 data:string lbl_80572A30 = .sdata:0x80572A30; // type:object size:0x8 data:string lbl_80572A38 = .sdata:0x80572A38; // type:object size:0x8 data:string @@ -41261,7 +41270,7 @@ lbl_80573AE0 = .sdata:0x80573AE0; // type:object size:0x7 data:string lbl_80573AE8 = .sdata:0x80573AE8; // type:object size:0x7 data:string lbl_80573AF0 = .sdata:0x80573AF0; // type:object size:0x4 data:4byte lbl_80573AF4 = .sdata:0x80573AF4; // type:object size:0x5 data:string -@23328 = .sdata:0x80573B00; // type:object size:0x8 data:4byte +@23808 = .sdata:0x80573B00; // type:object size:0x4 scope:local data:4byte lbl_80573B08 = .sdata:0x80573B08; // type:object size:0x4 data:4byte lbl_80573B0C = .sdata:0x80573B0C; // type:object size:0x4 data:4byte lbl_80573B10 = .sdata:0x80573B10; // type:object size:0x4 data:4byte @@ -43334,7 +43343,7 @@ sFreeCallbackArg__Q23EGG4Heap = .sbss:0x80576760; // type:object size:0x4 data:4 sCreateCallback__Q23EGG4Heap = .sbss:0x80576764; // type:object size:0x4 data:4byte sDestroyCallback__Q23EGG4Heap = .sbss:0x80576768; // type:object size:0x4 data:4byte sOldSwitchThreadCallback__Q23EGG6Thread = .sbss:0x80576770; // type:object size:0x4 data:4byte -sInstance__Q23EGG13ThreadMgr = .sbss:0x80576778; // type:object size:0x4 data:4byte +sInstance__Q23EGG9ThreadMgr = .sbss:0x80576778; // type:object size:0x4 data:4byte mConfigData__Q23EGG10BaseSystem = .sbss:0x80576780; // type:object size:0x4 data:4byte sTickPeriod__Q23EGG7Display = .sbss:0x80576788; // type:object size:0x4 data:4byte spSelector = .sbss:0x80576790; // type:object size:0x4 scope:local data:4byte @@ -43515,11 +43524,11 @@ lbl_80576AF8 = .sdata2:0x80576AF8; // type:object size:0x4 align:4 data:float lbl_80576AFC = .sdata2:0x80576AFC; // type:object size:0x4 align:4 data:float lbl_80576B00 = .sdata2:0x80576B00; // type:object size:0x4 align:4 data:float lbl_80576B04 = .sdata2:0x80576B04; // type:object size:0x4 align:4 data:float -lbl_80576B08 = .sdata2:0x80576B08; // type:object size:0x4 align:4 data:float -lbl_80576B10 = .sdata2:0x80576B10; // type:object size:0x8 align:8 data:double -lbl_80576B18 = .sdata2:0x80576B18; // type:object size:0x4 align:4 data:float -lbl_80576B1C = .sdata2:0x80576B1C; // type:object size:0x4 align:4 data:float -lbl_80576B20 = .sdata2:0x80576B20; // type:object size:0x8 align:8 data:double +@22305 = .sdata2:0x80576B08; // type:object size:0x4 scope:local align:4 data:float +@22308 = .sdata2:0x80576B10; // type:object size:0x8 scope:local align:8 data:double +@22397 = .sdata2:0x80576B18; // type:object size:0x4 scope:local align:4 data:float +@22398 = .sdata2:0x80576B1C; // type:object size:0x4 scope:local align:4 data:float +@22402 = .sdata2:0x80576B20; // type:object size:0x8 scope:local align:8 data:double lbl_80576B28 = .sdata2:0x80576B28; // type:object size:0x4 align:4 data:float lbl_80576B2C = .sdata2:0x80576B2C; // type:object size:0x4 align:4 data:float lbl_80576B30 = .sdata2:0x80576B30; // type:object size:0x4 align:4 data:float @@ -44194,8 +44203,8 @@ lbl_80577910 = .sdata2:0x80577910; // type:object size:0x4 align:4 data:float lbl_80577914 = .sdata2:0x80577914; // type:object size:0x4 align:4 data:float lbl_80577918 = .sdata2:0x80577918; // type:object size:0x4 align:4 data:float roomActivateHandlers = .sdata2:0x80577920; // type:object size:0x8 scope:local -@25622 = .sdata2:0x80577928; // type:object size:0x4 align:4 data:float -@25623 = .sdata2:0x8057792C; // type:object size:0x4 align:4 data:float +@25694 = .sdata2:0x80577928; // type:object size:0x4 scope:local align:4 data:float +@25695 = .sdata2:0x8057792C; // type:object size:0x4 scope:local align:4 data:float lbl_80577930 = .sdata2:0x80577930; // type:object size:0x8 align:8 data:double lbl_80577938 = .sdata2:0x80577938; // type:object size:0x8 align:8 data:double lbl_80577940 = .sdata2:0x80577940; // type:object size:0x4 align:4 data:float @@ -45853,7 +45862,7 @@ brlanMap = .sdata2:0x8057A198; // type:object size:0x8 scope:local data:4byte @30290 = .sdata2:0x8057A1C8; // type:object size:0x8 scope:local align:8 data:double @30375 = .sdata2:0x8057A1D0; // type:object size:0x4 scope:local align:4 data:float @30376 = .sdata2:0x8057A1D4; // type:object size:0x4 scope:local align:4 data:float -lbl_8057A1D8 = .sdata2:0x8057A1D8; // type:object size:0x4 align:4 data:float +@22199 = .sdata2:0x8057A1D8; // type:object size:0x4 scope:local align:4 data:float lbl_8057A1E0 = .sdata2:0x8057A1E0; // type:object size:0x4 align:4 data:float lbl_8057A1E4 = .sdata2:0x8057A1E4; // type:object size:0x4 align:4 data:float lbl_8057A1E8 = .sdata2:0x8057A1E8; // type:object size:0x4 align:4 data:float @@ -48525,7 +48534,7 @@ lbl_8057C634 = .sdata2:0x8057C634; // type:object size:0x4 align:4 data:float lbl_8057C638 = .sdata2:0x8057C638; // type:object size:0x4 align:4 data:float lbl_8057C640 = .sdata2:0x8057C640; // type:object size:0x4 align:4 data:float @23574 = .sdata2:0x8057C648; // type:object size:0x4 scope:local align:4 data:float -@23549 = .sdata2:0x8057C650; // type:object size:0x4 align:4 data:float +@24099 = .sdata2:0x8057C650; // type:object size:0x4 scope:local align:4 data:float lbl_8057C658 = .sdata2:0x8057C658; // type:object size:0x4 align:4 data:float lbl_8057C65C = .sdata2:0x8057C65C; // type:object size:0x4 align:4 data:float lbl_8057C660 = .sdata2:0x8057C660; // type:object size:0x4 align:4 data:float diff --git a/configure.py b/configure.py index 7588d026..69f9ef95 100644 --- a/configure.py +++ b/configure.py @@ -413,7 +413,7 @@ config.libs = [ Object(Matching, "toBeSorted/d_lib.cpp"), Object(NonMatching, "toBeSorted/unk_sorajima_list.cpp"), Object(Matching, "toBeSorted/mpls.cpp"), - Object(NonMatching, "toBeSorted/mdl_base.cpp"), + Object(Matching, "toBeSorted/mdl_base.cpp"), Object(Matching, "toBeSorted/d_exception.cpp"), Object(NonMatching, "toBeSorted/d_jstudio.cpp"), Object(Matching, "toBeSorted/save_file.cpp"), @@ -583,7 +583,7 @@ config.libs = [ Object(Matching, "d/lyt/d_lyt_common_title.cpp"), Object(Matching, "d/lyt/d_lyt_cursor_stick.cpp"), Object(Matching, "toBeSorted/fi_context.cpp"), - Object(NonMatching, "toBeSorted/item_mdl_name.cpp"), + Object(Matching, "toBeSorted/item_mdl_name.cpp"), Object(Matching, "toBeSorted/counters/counter.cpp"), Object(NonMatching, "toBeSorted/counters/counters.cpp"), Object(Matching, "toBeSorted/counters/rupee_counter.cpp"), @@ -593,7 +593,12 @@ config.libs = [ Object(Matching, "toBeSorted/counters/slingshot_seed_counter.cpp"), Object(Matching, "toBeSorted/counters/key_piece_counter.cpp"), Object(Matching, "toBeSorted/counters/extra_wallet_counter.cpp"), - Object(NonMatching, "toBeSorted/item_mdl.cpp"), + Object(Matching, "toBeSorted/item_mdl_misc.cpp"), + Object(NonMatching, "toBeSorted/item_mdl_item.cpp"), + Object(NonMatching, "toBeSorted/item_mdl_rupee.cpp"), + Object(NonMatching, "toBeSorted/item_mdl_light_fruit.cpp"), + Object(NonMatching, "toBeSorted/item_mdl_stamina_fruit.cpp"), + Object(NonMatching, "toBeSorted/item_spawn.cpp"), # probably multiple files, see sdata2 Object(NonMatching, "toBeSorted/unk_screen_effect.cpp"), Object(NonMatching, "toBeSorted/revision_info.cpp"), Object(NonMatching, "d/a/d_a_bullet_base.cpp"), diff --git a/include/d/a/d_a_item.h b/include/d/a/d_a_item.h index 24fcd785..fa07912b 100644 --- a/include/d/a/d_a_item.h +++ b/include/d/a/d_a_item.h @@ -78,11 +78,19 @@ public: static u32 getKeyPieceCount(); static u32 getSmallKeyCount(); + static bool isJellyBlob(ITEM_ID item); + static bool isStarryFirefly(ITEM_ID item); + static bool isRupee(ITEM_ID item); static bool isKeyPiece(ITEM_ID item); static bool isTreasure(ITEM_ID item); + static bool isTear(ITEM_ID item); + + bool isSingleArrow() const; bool isTriforce() const; + u32 getParams2Lower_shift1_0x7() const; + static bool getItemGetEventName(u16 item, const char **outName); static void itemGetEventStart(dAcBase_c *); static void itemGetEventEnd(dAcBase_c *); @@ -101,6 +109,16 @@ public: static Trial_e getCurrentTrial(); + enum Tear_e { + TEAR_0, + TEAR_1, + TEAR_2, + TEAR_3, + TEAR_MAX + }; + + static Tear_e getTearSubtype(ITEM_ID item); + static void healLink(u32 amount, bool); // move to dAcPy_c static bool isPerformingInitialCollection() { diff --git a/include/toBeSorted/item_mdl.h b/include/toBeSorted/item_mdl.h new file mode 100644 index 00000000..5ed940d0 --- /dev/null +++ b/include/toBeSorted/item_mdl.h @@ -0,0 +1,43 @@ +#ifndef TOBESORTED_ITEM_MDL_H +#define TOBESORTED_ITEM_MDL_H + +#include "m/m3d/m_mdl.h" +#include "m/m_allocator.h" +#include "m/m_mtx.h" +#include "m/m_vec.h" +#include "m/types_m.h" +#include "toBeSorted/mdl_base.h" + +// all names made up + +class dAcItem_c; + +// vtable at 80533eb0 +class dItemMdl_c : public dMdl_c { +public: + /* 0x08 */ virtual ~dItemMdl_c() {} + /* 0x0C */ virtual bool init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) = 0; + /* 0x10 */ virtual void vt_0x10(u8) = 0; + /* 0x14 */ virtual void setScale(const mVec3_c &scale) = 0; + /* 0x18 */ virtual void setLocalMtx(const mMtx_c &mtx) = 0; + /* 0x1C */ virtual void draw() = 0; + /* 0x20 */ virtual void vt_0x20() = 0; + /* 0x24 */ virtual void setPriorityDraw() = 0; + /* 0x28 */ virtual void unsetPriorityDraw() = 0; + /* 0x2C */ virtual m3d::smdl_c *getMdl() { + return nullptr; + } + + enum ItemMdl0x14_e { + ITEM_MDL_UNK0x14_0, + ITEM_MDL_UNK0x14_1, + ITEM_MDL_UNK0x14_2, + ITEM_MDL_UNK0x14_3, + }; + +protected: + /* 0x10 */ dAcItem_c *mpItem; + /* 0x14 */ u8 field_0x14; +}; + +#endif diff --git a/include/toBeSorted/item_mdl_misc.h b/include/toBeSorted/item_mdl_misc.h new file mode 100644 index 00000000..e5178dab --- /dev/null +++ b/include/toBeSorted/item_mdl_misc.h @@ -0,0 +1,228 @@ +#ifndef TOBESORTED_ITEM_MDL_MISC_H +#define TOBESORTED_ITEM_MDL_MISC_H + +#include "m/m3d/m_anmchr.h" +#include "m/m3d/m_anmmatclr.h" +#include "m/m3d/m_anmmdl.h" +#include "m/m3d/m_anmtexpat.h" +#include "m/m3d/m_anmtexsrt.h" +#include "m/m3d/m_mdl.h" +#include "m/m3d/m_smdl.h" +#include "m/types_m.h" +#include "toBeSorted/item_mdl.h" + +class dItemMdlPut_c : public dItemMdl_c { +public: + /* 0x08 */ virtual ~dItemMdlPut_c() {} + /* 0x0C */ virtual bool init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) override; + /* 0x10 */ virtual void vt_0x10(u8) override; + /* 0x14 */ virtual void setScale(const mVec3_c &scale) override; + /* 0x18 */ virtual void setLocalMtx(const mMtx_c &mtx) override; + /* 0x1C */ virtual void draw() override; + /* 0x20 */ virtual void vt_0x20() override; + /* 0x24 */ virtual void setPriorityDraw() override; + /* 0x28 */ virtual void unsetPriorityDraw() override; + + static bool isMdlForItemId(u16 itemId); + +private: + enum MdlIdx { + MDL_PUT_ARROW, + MDL_PUT_ARROW_BUNDLE, + MDL_PUT_HEART, + MDL_PUT_KEY_SMALL, + MDL_PUT_BOMB_SET, + MDL_PUT_SEED, + MDL_PUT_HEART_UTUWA, + MDL_PUT_HEART_KAKERA, + MDL_PUT_TRI_FORCE, + MDL_PUT_GARAGARA, + MDL_PUT_MAX, + }; + + struct MdlConfig { + const char *putResFile; + const char *putResMdl; + const char *getResFile; + const char *getResMdl; + }; + static const MdlConfig sMdlConfig[]; + static const u8 sMdlIdx[]; + + /* 0x18 */ m3d::smdl_c mGetMdl; + /* 0x34 */ m3d::smdl_c mPutMdl; +}; + +class dItemMdlShield_c : public dItemMdl_c { +public: + /* 0x08 */ virtual ~dItemMdlShield_c() {} + /* 0x0C */ virtual bool init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) override; + /* 0x10 */ virtual void vt_0x10(u8) override; + /* 0x14 */ virtual void setScale(const mVec3_c &scale) override; + /* 0x18 */ virtual void setLocalMtx(const mMtx_c &mtx) override; + /* 0x1C */ virtual void draw() override; + /* 0x20 */ virtual void vt_0x20() override; + /* 0x24 */ virtual void setPriorityDraw() override; + /* 0x28 */ virtual void unsetPriorityDraw() override; + + static bool isMdlForItemId(u16 itemId); + +private: + enum ShieldIdx { + MDL_SHIELD_WOOD_0, + MDL_SHIELD_WOOD_1, + MDL_SHIELD_WOOD_2, + MDL_SHIELD_IRON_0, + MDL_SHIELD_IRON_1, + MDL_SHIELD_IRON_2, + MDL_SHIELD_HOLY_0, + MDL_SHIELD_HOLY_1, + MDL_SHIELD_HOLY_2, + MDL_SHIELD_MAX + }; + + struct MdlConfig { + f32 frame; + const char *resFile; + const char *mdlName; + const char *anmName; + }; + static const MdlConfig sMdlConfig[]; + static const u8 sMdlIdx[]; + + /* 0x18 */ m3d::smdl_c mMdl; + /* 0x34 */ m3d::anmTexPat_c mAnmTexPat; +}; + +// Maybe a bad name because fairies etc. are also supported +class dItemMdlBottle_c : public dItemMdl_c { +public: + /* 0x08 */ virtual ~dItemMdlBottle_c() {} + /* 0x0C */ virtual bool init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) override; + /* 0x10 */ virtual void vt_0x10(u8) override; + /* 0x14 */ virtual void setScale(const mVec3_c &scale) override; + /* 0x18 */ virtual void setLocalMtx(const mMtx_c &mtx) override; + /* 0x1C */ virtual void draw() override; + /* 0x20 */ virtual void vt_0x20() override; + /* 0x24 */ virtual void setPriorityDraw() override; + /* 0x28 */ virtual void unsetPriorityDraw() override; + /* 0x2C */ virtual m3d::smdl_c *getMdl() override { + return &mMdl.getModel(); + } + + static bool isMdlForItemId(u16 itemId); + +private: + enum BottleIdx { + MDL_BOTTLE_WATER, + MDL_BOTTLE_FAIRY, + MDL_BOTTLE_HOLY, + MDL_BOTTLE_KUSURI, + MDL_BOTTLE_KUSURI_S, + MDL_BOTTLE_B_FAIRY, + MDL_BOTTLE_SOZAI_I, + MDL_BOTTLE_PUMPKIN, + MDL_BOTTLE_MAX + }; + + struct MdlConfig { + const char *resFile; + const char *mdlName; + const char *anmName; + }; + static const MdlConfig sMdlConfig[]; + static const u8 sMdlIdx[]; + + /* 0x18 */ m3d::mdlAnmChr mMdl; + /* 0x80 */ u32 mFlags; +}; + +class dItemMdlTear_c : public dItemMdl_c { +public: + /* 0x08 */ virtual ~dItemMdlTear_c() {} + /* 0x0C */ virtual bool init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) override; + /* 0x10 */ virtual void vt_0x10(u8) override; + /* 0x14 */ virtual void setScale(const mVec3_c &scale) override; + /* 0x18 */ virtual void setLocalMtx(const mMtx_c &mtx) override; + /* 0x1C */ virtual void draw() override; + /* 0x20 */ virtual void vt_0x20() override; + /* 0x24 */ virtual void setPriorityDraw() override; + /* 0x28 */ virtual void unsetPriorityDraw() override; + + static bool isMdlForItemId(u16 itemId); + +private: + struct MdlConfig { + f32 frame; + }; + static const MdlConfig sMdlConfig[]; + static const u8 sMdlIdx[]; + + /* 0x18 */ m3d::smdl_c mMdl1; + /* 0x34 */ m3d::smdl_c mMdl2; + /* 0x50 */ m3d::anmTexPat_c mAnmTexPat1; + /* 0x7C */ m3d::anmTexPat_c mAnmTexPat2; + /* 0xA8 */ m3d::anmTexSrt_c mAnmTexSrt1; + /* 0xD4 */ m3d::anmTexSrt_c mAnmTexSrt2; +}; + +class dItemMdlFirefly_c : public dItemMdl_c { +public: + /* 0x08 */ virtual ~dItemMdlFirefly_c() {} + /* 0x0C */ virtual bool init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) override; + /* 0x10 */ virtual void vt_0x10(u8) override; + /* 0x14 */ virtual void setScale(const mVec3_c &scale) override; + /* 0x18 */ virtual void setLocalMtx(const mMtx_c &mtx) override; + /* 0x1C */ virtual void draw() override; + /* 0x20 */ virtual void vt_0x20() override; + /* 0x24 */ virtual void setPriorityDraw() override; + /* 0x28 */ virtual void unsetPriorityDraw() override; + /* 0x2C */ virtual m3d::smdl_c *getMdl() override; + + static bool isMdlForItemId(u16 itemId); + +private: + /* 0x18 */ m3d::smdl_c mMdl; + /* 0x34 */ m3d::anmMatClr_c mAnmMatClr; +}; + +// Maybe a bad name because crystals are also supported +class dItemMdlPotion_c : public dItemMdl_c { +public: + /* 0x08 */ virtual ~dItemMdlPotion_c() {} + /* 0x0C */ virtual bool init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) override; + /* 0x10 */ virtual void vt_0x10(u8) override; + /* 0x14 */ virtual void setScale(const mVec3_c &scale) override; + /* 0x18 */ virtual void setLocalMtx(const mMtx_c &mtx) override; + /* 0x1C */ virtual void draw() override; + /* 0x20 */ virtual void vt_0x20() override; + /* 0x24 */ virtual void setPriorityDraw() override; + /* 0x28 */ virtual void unsetPriorityDraw() override; + /* 0x2C */ virtual m3d::smdl_c *getMdl() override; + + static bool isMdlForItemId(u16 itemId); + +private: + enum PotionIdx { + MDL_POTION_MUTEKI, + MDL_POTION_GUTS, + MDL_POTION_AIR, + MDL_POTION_GENKI, + MDL_POTION_MAX, + }; + + struct MdlConfig { + const char *resFile; + const char *mdlName; + const char *anmChrName; + const char *anmTexSrtName; + }; + static const MdlConfig sMdlConfig[]; + static const u8 sMdlIdx[]; + + /* 0x18 */ m3d::smdl_c mMdl; + /* 0x34 */ m3d::anmChr_c mAnmChr; + /* 0x6C */ m3d::anmTexSrt_c mAnmTexSrt; +}; + +#endif diff --git a/include/toBeSorted/item_mdl_name.h b/include/toBeSorted/item_mdl_name.h new file mode 100644 index 00000000..8d678dd0 --- /dev/null +++ b/include/toBeSorted/item_mdl_name.h @@ -0,0 +1,183 @@ +#ifndef TOBESORTED_ITEM_MDL_NAME_H +#define TOBESORTED_ITEM_MDL_NAME_H + +#include "common.h" + +// all names made up + + +enum ItemMdlIdx { + ITEMMDL_SMALL_KEY, + ITEMMDL_GREEN_RUPEE, + ITEMMDL_BLUE_RUPEE, + ITEMMDL_RED_RUPEE, + ITEMMDL_COMPLETE_TRIFORCE, + ITEMMDL_HEART, + ITEMMDL_SINGLE_ARROW, + ITEMMDL_BUNDLE_ARROWS, + ITEMMDL_GODDESS_WHITESWORD, + ITEMMDL_PRACTICE_SWORD, + ITEMMDL_GODDESS_SWORD, + ITEMMDL_GODDESS_LONGSWORD, + ITEMMDL_MASTER_SWORD, + ITEMMDL_TRUE_MASTER_SWORD, + ITEMMDL_SAILCLOTH, + ITEMMDL_GODDESS_HARP, + ITEMMDL_SPIRIT_VESSEL, + ITEMMDL_BOW, + ITEMMDL_CLAWSHOWS, + ITEMMDL_BIRD_STATUETTE, + ITEMMDL_AC_BK, + ITEMMDL_FS_BK, + ITEMMDL_SSH_BK, + ITEMMDL_KEY_PIECE, + ITEMMDL_SV_BK, + ITEMMDL_ET_BK, + ITEMMDL_LMF_BK, + ITEMMDL_SILVER_RUPEE, + ITEMMDL_GOLD_RUPEE, + ITEMMDL_RUPOOR, + ITEMMDL_5_CRYSTALS, + ITEMMDL_GLITTERING_SPORES, + ITEMMDL_5_BOMBS, + ITEMMDL_10_BOMBS, + ITEMMDL_STAMINA_FRUIT, + ITEMMDL_FARORE_TEAR, + ITEMMDL_DIN_TEAR, + ITEMMDL_NAYRU_TEAR, + ITEMMDL_SACRED_TEAR, + ITEMMDL_LIGHT_FRUIT, + ITEMMDL_1_CRYSTAL, + ITEMMDL_GUST_BELLOWS, + ITEMMDL_DUNGEON_MAP_FI, + ITEMMDL_DUNGEON_MAP, + ITEMMDL_SLINGSHOT, + ITEMMDL_BEETLE, + ITEMMDL_WATER, + ITEMMDL_MUSHROOM_SPORES, + ITEMMDL_DIGGING_MITTS, + ITEMMDL_5_DEKU_SEEDS, + ITEMMDL_10_DEKU_SEEDS, + ITEMMDL_GUARDIAN_POTION, + ITEMMDL_GUARDIAN_POTION_PLUS, + ITEMMDL_WATER_SCALE, + ITEMMDL_BUG_MEDAL, + ITEMMDL_BUG_NET, + ITEMMDL_FAIRY, + ITEMMDL_SACRED_WATER, + ITEMMDL_HOOK_BEETLE, + ITEMMDL_QUICK_BEETLE, + ITEMMDL_TOUGH_BEETLE, + ITEMMDL_HEART_POTION, + ITEMMDL_HEART_POTION_PLUS, + ITEMMDL_HEART_POTION_ALSO_PLUS, + ITEMMDL_STAMINA_POTION, + ITEMMDL_STAMINA_POTION_PLUS, + ITEMMDL_AIR_POTION, + ITEMMDL_AIR_POTION_PLUS, + ITEMMDL_BOTTLED_FAIRY, + ITEMMDL_IRON_BOW, + ITEMMDL_SACRED_BOW, + ITEMMDL_BOMB_BAG, + ITEMMDL_HEART_CONTAINER, + ITEMMDL_HEART_PIECE, + ITEMMDL_TRI_COURAGE, + ITEMMDL_TRI_POWER, + ITEMMDL_TRI_WISDOWM, + ITEMMDL_SEA_CHART, + ITEMMDL_MOGMA_MITTS, + ITEMMDL_HEART_MEDAL, + ITEMMDL_RUPEE_MEDAL, + ITEMMDL_TREASURE_MEDAL, + ITEMMDL_POTION_MEDAL, + ITEMMDL_CURSED_MEDAL, + ITEMMDL_MIGHTY_SCATTERSHOT, + ITEMMDL_85, + ITEMMDL_MEDIUM_WALLET, + ITEMMDL_BIG_WALLET, + ITEMMDL_GIANT_WALLET, + ITEMMDL_TYCOON_WALLET, + ITEMMDL_ADVENTURE_POUCH, + ITEMMDL_POUCH_EXPANSION, + ITEMMDL_LIFE_MEDAL, + ITEMMDL_WOODEN_SHIELD, + ITEMMDL_BANDED_SHIELD, + ITEMMDL_BRACED_SHIELD, + ITEMMDL_IRON_SHIELD, + ITEMMDL_REINFORCED_SHIELD, + ITEMMDL_FORTIFIED_SHIELD, + ITEMMDL_SACRED_SHIELD, + ITEMMDL_DIVINE_SHIELD, + ITEMMDL_GODDESS_SHIELD, + ITEMMDL_HYLIAN_SHIELD, + ITEMMDL_REVITALIZING_POTION, + ITEMMDL_REVITALIZING_POTION_PLUS, + ITEMMDL_SMALL_SEED_SATCHEL, + ITEMMDL_MEDIUM_SEED_SATCHEL, + ITEMMDL_LARGE_SEED_SATCHEL, + ITEMMDL_SMALL_QUIVER, + ITEMMDL_MEDIUM_QUIVER, + ITEMMDL_LARGE_QUIVER, + ITEMMDL_SMALL_BOMB_BAG, + ITEMMDL_MEDIUM_BOMB_BAG, + ITEMMDL_LARGE_BOMB_BAG, + ITEMMDL_WHIP, + ITEMMDL_FIRESHIELD_EARRINGS, + ITEMMDL_BIG_BUG_NET, + ITEMMDL_FARON_GRASSHOPPER, + ITEMMDL_WOODLAND_RHINO_BEETLE, + ITEMMDL_DEKU_HORNET, + ITEMMDL_SKYLOFT_MANTIS, + ITEMMDL_VOLCANIC_LADYBUG, + ITEMMDL_BLESSED_BUTTERFLY, + ITEMMDL_LANAYRU_ANT, + ITEMMDL_SAND_CICADA, + ITEMMDL_GERUDO_DRAGONFLY, + ITEMMDL_ELDIN_ROLLER, + ITEMMDL_SKY_STAG_BEETLE, + ITEMMDL_STARRY_FIREFLY, + ITEMMDL_BOTTLE, + ITEMMDL_CAWLIN_LETTER, + ITEMMDL_BEEDLE_INSECT_CAGE, + ITEMMDL_RATTLE, + ITEMMDL_HORNET_LARVAE, + ITEMMDL_BIRD_FEATHER, + ITEMMDL_TUMBLE_WEED, + ITEMMDL_LIZARD_TAIL, + ITEMMDL_ELDIN_ORE, + ITEMMDL_ANCIENT_FLOWER, + ITEMMDL_AMBER_RELIC, + ITEMMDL_DUSK_RELIC, + ITEMMDL_JELLY_BLOB, + ITEMMDL_MONSTER_CLAW, + ITEMMDL_MONSTER_HORN, + ITEMMDL_ORNAMENTAL_SKULL, + ITEMMDL_EVIL_CRYSTAL, + ITEMMDL_BLUE_BIRD_FEATHER, + ITEMMDL_GOLDEN_SKULL, + ITEMMDL_GODDESS_PLUME, + ITEMMDL_EMERALD_TABLET, + ITEMMDL_RUBY_TABLET, + ITEMMDL_AMBER_TABLET, + ITEMMDL_STONE_OF_TRIALS, + ITEMMDL_BALLAD_OF_THE_GODDESS, + ITEMMDL_FARORES_COURAGE, + ITEMMDL_NAYRUS_WISDOM, + ITEMMDL_DINS_POWER, + ITEMMDL_FARON_SOTH, + ITEMMDL_ELDIN_SOTH, + ITEMMDL_LANAYRU_SOTH, + ITEMMDL_ITEM_SOTH, + ITEMMDL_REVITALIZING_POTION_PLUS_PLUS, + ITEMMDL_HOT_SOUP, + ITEMMDL_COLD_SOUP, + ITEMMDL_LIFE_TREE_SEED, + ITEMMDL_LIFE_TREE_FRUIT, + ITEMMDL_EXTRA_WALLET, + ITEMMDL_MAX, +}; + +bool hasItemMdl(u16 itemId); +u16 getItemMdlIdx(u16 itemId); + +#endif diff --git a/include/toBeSorted/mdl_base.h b/include/toBeSorted/mdl_base.h new file mode 100644 index 00000000..5d74297f --- /dev/null +++ b/include/toBeSorted/mdl_base.h @@ -0,0 +1,12 @@ +#ifndef TOBESORTED_MDL_BASE_H +#define TOBESORTED_MDL_BASE_H + +#include "egg/core/eggDisposer.h" + +class dMdl_c : public EGG::Disposer { +protected: + dMdl_c(); + virtual ~dMdl_c(); +}; + +#endif diff --git a/src/toBeSorted/item_mdl_misc.cpp b/src/toBeSorted/item_mdl_misc.cpp new file mode 100644 index 00000000..d45bc536 --- /dev/null +++ b/src/toBeSorted/item_mdl_misc.cpp @@ -0,0 +1,1289 @@ +#include "toBeSorted/item_mdl_misc.h" + +#include "common.h" +#include "d/a/d_a_item.h" +#include "m/m3d/m_fanm.h" +#include "nw4r/g3d/res/g3d_resanmchr.h" +#include "nw4r/g3d/res/g3d_resanmclr.h" +#include "nw4r/g3d/res/g3d_resanmtexpat.h" +#include "nw4r/g3d/res/g3d_resanmtexsrt.h" +#include "nw4r/g3d/res/g3d_resfile.h" +#include "nw4r/g3d/res/g3d_resmdl.h" +#include "toBeSorted/arc_managers/oarc_manager.h" +#include "toBeSorted/item_mdl_name.h" + +const u8 dItemMdlPut_c::sMdlIdx[] = { + MDL_PUT_KEY_SMALL, /* ITEMMDL_SMALL_KEY */ + MDL_PUT_MAX, /* ITEMMDL_GREEN_RUPEE */ + MDL_PUT_MAX, /* ITEMMDL_BLUE_RUPEE */ + MDL_PUT_MAX, /* ITEMMDL_RED_RUPEE */ + MDL_PUT_MAX, /* ITEMMDL_COMPLETE_TRIFORCE */ + MDL_PUT_HEART, /* ITEMMDL_HEART */ + MDL_PUT_ARROW, /* ITEMMDL_SINGLE_ARROW */ + MDL_PUT_ARROW_BUNDLE, /* ITEMMDL_BUNDLE_ARROWS */ + MDL_PUT_MAX, /* ITEMMDL_GODDESS_WHITESWORD */ + MDL_PUT_MAX, /* ITEMMDL_PRACTICE_SWORD */ + MDL_PUT_MAX, /* ITEMMDL_GODDESS_SWORD */ + MDL_PUT_MAX, /* ITEMMDL_GODDESS_LONGSWORD */ + MDL_PUT_MAX, /* ITEMMDL_MASTER_SWORD */ + MDL_PUT_MAX, /* ITEMMDL_TRUE_MASTER_SWORD */ + MDL_PUT_MAX, /* ITEMMDL_SAILCLOTH */ + MDL_PUT_MAX, /* ITEMMDL_GODDESS_HARP */ + MDL_PUT_MAX, /* ITEMMDL_SPIRIT_VESSEL */ + MDL_PUT_MAX, /* ITEMMDL_BOW */ + MDL_PUT_MAX, /* ITEMMDL_CLAWSHOWS */ + MDL_PUT_MAX, /* ITEMMDL_BIRD_STATUETTE */ + MDL_PUT_MAX, /* ITEMMDL_AC_BK */ + MDL_PUT_MAX, /* ITEMMDL_FS_BK */ + MDL_PUT_MAX, /* ITEMMDL_SSH_BK */ + MDL_PUT_MAX, /* ITEMMDL_KEY_PIECE */ + MDL_PUT_MAX, /* ITEMMDL_SV_BK */ + MDL_PUT_MAX, /* ITEMMDL_ET_BK */ + MDL_PUT_MAX, /* ITEMMDL_LMF_BK */ + MDL_PUT_MAX, /* ITEMMDL_SILVER_RUPEE */ + MDL_PUT_MAX, /* ITEMMDL_GOLD_RUPEE */ + MDL_PUT_MAX, /* ITEMMDL_RUPOOR */ + MDL_PUT_MAX, /* ITEMMDL_5_CRYSTALS */ + MDL_PUT_MAX, /* ITEMMDL_GLITTERING_SPORES */ + MDL_PUT_MAX, /* ITEMMDL_5_BOMBS */ + MDL_PUT_BOMB_SET, /* ITEMMDL_10_BOMBS */ + MDL_PUT_MAX, /* ITEMMDL_STAMINA_FRUIT */ + MDL_PUT_MAX, /* ITEMMDL_FARORE_TEAR */ + MDL_PUT_MAX, /* ITEMMDL_DIN_TEAR */ + MDL_PUT_MAX, /* ITEMMDL_NAYRU_TEAR */ + MDL_PUT_MAX, /* ITEMMDL_SACRED_TEAR */ + MDL_PUT_MAX, /* ITEMMDL_LIGHT_FRUIT */ + MDL_PUT_MAX, /* ITEMMDL_1_CRYSTAL */ + MDL_PUT_MAX, /* ITEMMDL_GUST_BELLOWS */ + MDL_PUT_MAX, /* ITEMMDL_DUNGEON_MAP_FI */ + MDL_PUT_MAX, /* ITEMMDL_DUNGEON_MAP */ + MDL_PUT_MAX, /* ITEMMDL_SLINGSHOT */ + MDL_PUT_MAX, /* ITEMMDL_BEETLE */ + MDL_PUT_MAX, /* ITEMMDL_WATER */ + MDL_PUT_MAX, /* ITEMMDL_MUSHROOM_SPORES */ + MDL_PUT_MAX, /* ITEMMDL_DIGGING_MITTS */ + MDL_PUT_SEED, /* ITEMMDL_5_DEKU_SEEDS */ + MDL_PUT_MAX, /* ITEMMDL_10_DEKU_SEEDS */ + MDL_PUT_MAX, /* ITEMMDL_GUARDIAN_POTION */ + MDL_PUT_MAX, /* ITEMMDL_GUARDIAN_POTION_PLUS */ + MDL_PUT_MAX, /* ITEMMDL_WATER_SCALE */ + MDL_PUT_MAX, /* ITEMMDL_BUG_MEDAL */ + MDL_PUT_MAX, /* ITEMMDL_BUG_NET */ + MDL_PUT_MAX, /* ITEMMDL_FAIRY */ + MDL_PUT_MAX, /* ITEMMDL_SACRED_WATER */ + MDL_PUT_MAX, /* ITEMMDL_HOOK_BEETLE */ + MDL_PUT_MAX, /* ITEMMDL_QUICK_BEETLE */ + MDL_PUT_MAX, /* ITEMMDL_TOUGH_BEETLE */ + MDL_PUT_MAX, /* ITEMMDL_HEART_POTION */ + MDL_PUT_MAX, /* ITEMMDL_HEART_POTION_PLUS */ + MDL_PUT_MAX, /* ITEMMDL_HEART_POTION_ALSO_PLUS */ + MDL_PUT_MAX, /* ITEMMDL_STAMINA_POTION */ + MDL_PUT_MAX, /* ITEMMDL_STAMINA_POTION_PLUS */ + MDL_PUT_MAX, /* ITEMMDL_AIR_POTION */ + MDL_PUT_MAX, /* ITEMMDL_AIR_POTION_PLUS */ + MDL_PUT_MAX, /* ITEMMDL_BOTTLED_FAIRY */ + MDL_PUT_MAX, /* ITEMMDL_IRON_BOW */ + MDL_PUT_MAX, /* ITEMMDL_SACRED_BOW */ + MDL_PUT_MAX, /* ITEMMDL_BOMB_BAG */ + MDL_PUT_HEART_UTUWA, /* ITEMMDL_HEART_CONTAINER */ + MDL_PUT_HEART_KAKERA, /* ITEMMDL_HEART_PIECE */ + MDL_PUT_TRI_FORCE, /* ITEMMDL_TRI_COURAGE */ + MDL_PUT_TRI_FORCE, /* ITEMMDL_TRI_POWER */ + MDL_PUT_TRI_FORCE, /* ITEMMDL_TRI_WISDOWM */ + MDL_PUT_MAX, /* ITEMMDL_SEA_CHART */ + MDL_PUT_MAX, /* ITEMMDL_MOGMA_MITTS */ + MDL_PUT_MAX, /* ITEMMDL_HEART_MEDAL */ + MDL_PUT_MAX, /* ITEMMDL_RUPEE_MEDAL */ + MDL_PUT_MAX, /* ITEMMDL_TREASURE_MEDAL */ + MDL_PUT_MAX, /* ITEMMDL_POTION_MEDAL */ + MDL_PUT_MAX, /* ITEMMDL_CURSED_MEDAL */ + MDL_PUT_MAX, /* ITEMMDL_MIGHTY_SCATTERSHOT */ + MDL_PUT_MAX, /* ITEMMDL_85 */ + MDL_PUT_MAX, /* ITEMMDL_MEDIUM_WALLET */ + MDL_PUT_MAX, /* ITEMMDL_BIG_WALLET */ + MDL_PUT_MAX, /* ITEMMDL_GIANT_WALLET */ + MDL_PUT_MAX, /* ITEMMDL_TYCOON_WALLET */ + MDL_PUT_MAX, /* ITEMMDL_ADVENTURE_POUCH */ + MDL_PUT_MAX, /* ITEMMDL_POUCH_EXPANSION */ + MDL_PUT_MAX, /* ITEMMDL_LIFE_MEDAL */ + MDL_PUT_MAX, /* ITEMMDL_WOODEN_SHIELD */ + MDL_PUT_MAX, /* ITEMMDL_BANDED_SHIELD */ + MDL_PUT_MAX, /* ITEMMDL_BRACED_SHIELD */ + MDL_PUT_MAX, /* ITEMMDL_IRON_SHIELD */ + MDL_PUT_MAX, /* ITEMMDL_REINFORCED_SHIELD */ + MDL_PUT_MAX, /* ITEMMDL_FORTIFIED_SHIELD */ + MDL_PUT_MAX, /* ITEMMDL_SACRED_SHIELD */ + MDL_PUT_MAX, /* ITEMMDL_DIVINE_SHIELD */ + MDL_PUT_MAX, /* ITEMMDL_GODDESS_SHIELD */ + MDL_PUT_MAX, /* ITEMMDL_HYLIAN_SHIELD */ + MDL_PUT_MAX, /* ITEMMDL_REVITALIZING_POTION */ + MDL_PUT_MAX, /* ITEMMDL_REVITALIZING_POTION_PLUS */ + MDL_PUT_MAX, /* ITEMMDL_SMALL_SEED_SATCHEL */ + MDL_PUT_MAX, /* ITEMMDL_MEDIUM_SEED_SATCHEL */ + MDL_PUT_MAX, /* ITEMMDL_LARGE_SEED_SATCHEL */ + MDL_PUT_MAX, /* ITEMMDL_SMALL_QUIVER */ + MDL_PUT_MAX, /* ITEMMDL_MEDIUM_QUIVER */ + MDL_PUT_MAX, /* ITEMMDL_LARGE_QUIVER */ + MDL_PUT_MAX, /* ITEMMDL_SMALL_BOMB_BAG */ + MDL_PUT_MAX, /* ITEMMDL_MEDIUM_BOMB_BAG */ + MDL_PUT_MAX, /* ITEMMDL_LARGE_BOMB_BAG */ + MDL_PUT_MAX, /* ITEMMDL_WHIP */ + MDL_PUT_MAX, /* ITEMMDL_FIRESHIELD_EARRINGS */ + MDL_PUT_MAX, /* ITEMMDL_BIG_BUG_NET */ + MDL_PUT_MAX, /* ITEMMDL_FARON_GRASSHOPPER */ + MDL_PUT_MAX, /* ITEMMDL_WOODLAND_RHINO_BEETLE */ + MDL_PUT_MAX, /* ITEMMDL_DEKU_HORNET */ + MDL_PUT_MAX, /* ITEMMDL_SKYLOFT_MANTIS */ + MDL_PUT_MAX, /* ITEMMDL_VOLCANIC_LADYBUG */ + MDL_PUT_MAX, /* ITEMMDL_BLESSED_BUTTERFLY */ + MDL_PUT_MAX, /* ITEMMDL_LANAYRU_ANT */ + MDL_PUT_MAX, /* ITEMMDL_SAND_CICADA */ + MDL_PUT_MAX, /* ITEMMDL_GERUDO_DRAGONFLY */ + MDL_PUT_MAX, /* ITEMMDL_ELDIN_ROLLER */ + MDL_PUT_MAX, /* ITEMMDL_SKY_STAG_BEETLE */ + MDL_PUT_MAX, /* ITEMMDL_STARRY_FIREFLY */ + MDL_PUT_MAX, /* ITEMMDL_BOTTLE */ + MDL_PUT_MAX, /* ITEMMDL_CAWLIN_LETTER */ + MDL_PUT_MAX, /* ITEMMDL_BEEDLE_INSECT_CAGE */ + MDL_PUT_GARAGARA, /* ITEMMDL_RATTLE */ + MDL_PUT_MAX, /* ITEMMDL_HORNET_LARVAE */ + MDL_PUT_MAX, /* ITEMMDL_BIRD_FEATHER */ + MDL_PUT_MAX, /* ITEMMDL_TUMBLE_WEED */ + MDL_PUT_MAX, /* ITEMMDL_LIZARD_TAIL */ + MDL_PUT_MAX, /* ITEMMDL_ELDIN_ORE */ + MDL_PUT_MAX, /* ITEMMDL_ANCIENT_FLOWER */ + MDL_PUT_MAX, /* ITEMMDL_AMBER_RELIC */ + MDL_PUT_MAX, /* ITEMMDL_DUSK_RELIC */ + MDL_PUT_MAX, /* ITEMMDL_JELLY_BLOB */ + MDL_PUT_MAX, /* ITEMMDL_MONSTER_CLAW */ + MDL_PUT_MAX, /* ITEMMDL_MONSTER_HORN */ + MDL_PUT_MAX, /* ITEMMDL_ORNAMENTAL_SKULL */ + MDL_PUT_MAX, /* ITEMMDL_EVIL_CRYSTAL */ + MDL_PUT_MAX, /* ITEMMDL_BLUE_BIRD_FEATHER */ + MDL_PUT_MAX, /* ITEMMDL_GOLDEN_SKULL */ + MDL_PUT_MAX, /* ITEMMDL_GODDESS_PLUME */ + MDL_PUT_MAX, /* ITEMMDL_EMERALD_TABLET */ + MDL_PUT_MAX, /* ITEMMDL_RUBY_TABLET */ + MDL_PUT_MAX, /* ITEMMDL_AMBER_TABLET */ + MDL_PUT_MAX, /* ITEMMDL_STONE_OF_TRIALS */ + MDL_PUT_MAX, /* ITEMMDL_BALLAD_OF_THE_GODDESS */ + MDL_PUT_MAX, /* ITEMMDL_FARORES_COURAGE */ + MDL_PUT_MAX, /* ITEMMDL_NAYRUS_WISDOM */ + MDL_PUT_MAX, /* ITEMMDL_DINS_POWER */ + MDL_PUT_MAX, /* ITEMMDL_FARON_SOTH */ + MDL_PUT_MAX, /* ITEMMDL_ELDIN_SOTH */ + MDL_PUT_MAX, /* ITEMMDL_LANAYRU_SOTH */ + MDL_PUT_MAX, /* ITEMMDL_ITEM_SOTH */ + MDL_PUT_MAX, /* ITEMMDL_REVITALIZING_POTION_PLUS_PLUS */ + MDL_PUT_MAX, /* ITEMMDL_HOT_SOUP */ + MDL_PUT_MAX, /* ITEMMDL_COLD_SOUP */ + MDL_PUT_MAX, /* ITEMMDL_LIFE_TREE_SEED */ + MDL_PUT_MAX, /* ITEMMDL_LIFE_TREE_FRUIT */ + MDL_PUT_MAX, /* ITEMMDL_EXTRA_WALLET */ +}; + +const dItemMdlPut_c::MdlConfig dItemMdlPut_c::sMdlConfig[] = { + { "PutArrow", "PutArrow", "GetArrow", "GetArrow"}, + { "PutArrow", "PutArrowBundle", "GetArrow", "GetArrowBundle"}, + { "PutHeart", "PutHeart", "GetHeart", "GetHeart"}, + { "PutKeySmall", "PutKeySmallNormal", "GetKeySmall", "GetKeySmallNormal"}, + { "PutBombSet", "PutBombSet", "GetBombSet", "GetBombSet"}, + { "PutSeed", "PutSeed", "GetSeed", "GetSeed"}, + { "PutHeartUtuwa", "PutHeartUtuwa", "GetHeartUtuwa", "GetHeartUtuwa"}, + { "PutHeartKakera", "PutHeartKakera", "GetHeartKakera", "GetHeartKakera"}, + {"PutTriForceSingle", "PutTriForceSingle", "GetTriForceSingle", "GetTriForceSingle"}, + { "PutGaragara", "PutGaragara", "GetGaragara", "GetGaragara"}, +}; + +bool dItemMdlPut_c::isMdlForItemId(u16 itemId) { + if (hasItemMdl(itemId) == false) { + return false; + } else { + return sMdlIdx[getItemMdlIdx(itemId)] <= MDL_PUT_MAX - 1; + } +} + +bool dItemMdlPut_c::init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) { + s32 mdlIdx = getItemMdlIdx(itemId); + u8 mdlConfigIdx = sMdlIdx[mdlIdx]; + + const MdlConfig *fileAndMdl = &sMdlConfig[mdlConfigIdx]; + + void *resData0 = OarcManager::GetInstance()->getMdlFromArc2(fileAndMdl->putResFile); + if (resData0 == nullptr) { + return false; + } + nw4r::g3d::ResFile res0(resData0); + if (!res0.IsValid()) { + return false; + } + + nw4r::g3d::ResMdl mdl0(res0.GetResMdl(fileAndMdl->putResMdl)); + if (!mdl0.IsValid()) { + return false; + } + + if (!mGetMdl.create(mdl0, allocator, 0x120)) { + return false; + } + + bool isPickupArrow = item->isSingleArrow() && item->getParams2Lower_shift1_0x7() == 0; + void *resData1 = OarcManager::GetInstance()->getMdlFromArc2(fileAndMdl->getResFile); + if (resData1 == nullptr) { + return false; + } + nw4r::g3d::ResFile res1(resData1); + if (!res1.IsValid()) { + return false; + } + + nw4r::g3d::ResMdl mdl1(res1.GetResMdl(isPickupArrow ? "GetArrowEnemy" : fileAndMdl->getResMdl)); + if (!mdl1.IsValid()) { + return false; + } + + if (!mPutMdl.create(mdl1, allocator, 0x120)) { + return false; + } + + mpItem = item; + return true; +} + +void dItemMdlPut_c::vt_0x10(u8 arg) { + if (arg == ITEM_MDL_UNK0x14_3) { + field_0x14 = ITEM_MDL_UNK0x14_1; + } else { + field_0x14 = arg; + } +} + +void dItemMdlPut_c::setScale(const mVec3_c &scale) { + mGetMdl.setScale(scale); + mPutMdl.setScale(scale); +} + +void dItemMdlPut_c::setLocalMtx(const mMtx_c &mtx) { + mGetMdl.setLocalMtx(mtx); + mPutMdl.setLocalMtx(mtx); +} + +void dItemMdlPut_c::draw() { + switch (field_0x14) { + case ITEM_MDL_UNK0x14_1: mpItem->fn_8002ECD0(&mGetMdl, 7); break; + case ITEM_MDL_UNK0x14_2: mpItem->fn_8002ECD0(&mPutMdl, 6); break; + } +} + +void dItemMdlPut_c::vt_0x20() { + // no-op +} + +void dItemMdlPut_c::setPriorityDraw() { + mGetMdl.setPriorityDraw(0x82, 0x7F); + mPutMdl.setPriorityDraw(0x82, 0x7F); +} + +void dItemMdlPut_c::unsetPriorityDraw() { + mGetMdl.setPriorityDraw(0x7F, 0x7F); + mPutMdl.setPriorityDraw(0x7F, 0x7F); +} + +const u8 dItemMdlShield_c::sMdlIdx[] = { + MDL_SHIELD_MAX, /* ITEMMDL_SMALL_KEY */ + MDL_SHIELD_MAX, /* ITEMMDL_GREEN_RUPEE */ + MDL_SHIELD_MAX, /* ITEMMDL_BLUE_RUPEE */ + MDL_SHIELD_MAX, /* ITEMMDL_RED_RUPEE */ + MDL_SHIELD_MAX, /* ITEMMDL_COMPLETE_TRIFORCE */ + MDL_SHIELD_MAX, /* ITEMMDL_HEART */ + MDL_SHIELD_MAX, /* ITEMMDL_SINGLE_ARROW */ + MDL_SHIELD_MAX, /* ITEMMDL_BUNDLE_ARROWS */ + MDL_SHIELD_MAX, /* ITEMMDL_GODDESS_WHITESWORD */ + MDL_SHIELD_MAX, /* ITEMMDL_PRACTICE_SWORD */ + MDL_SHIELD_MAX, /* ITEMMDL_GODDESS_SWORD */ + MDL_SHIELD_MAX, /* ITEMMDL_GODDESS_LONGSWORD */ + MDL_SHIELD_MAX, /* ITEMMDL_MASTER_SWORD */ + MDL_SHIELD_MAX, /* ITEMMDL_TRUE_MASTER_SWORD */ + MDL_SHIELD_MAX, /* ITEMMDL_SAILCLOTH */ + MDL_SHIELD_MAX, /* ITEMMDL_GODDESS_HARP */ + MDL_SHIELD_MAX, /* ITEMMDL_SPIRIT_VESSEL */ + MDL_SHIELD_MAX, /* ITEMMDL_BOW */ + MDL_SHIELD_MAX, /* ITEMMDL_CLAWSHOWS */ + MDL_SHIELD_MAX, /* ITEMMDL_BIRD_STATUETTE */ + MDL_SHIELD_MAX, /* ITEMMDL_AC_BK */ + MDL_SHIELD_MAX, /* ITEMMDL_FS_BK */ + MDL_SHIELD_MAX, /* ITEMMDL_SSH_BK */ + MDL_SHIELD_MAX, /* ITEMMDL_KEY_PIECE */ + MDL_SHIELD_MAX, /* ITEMMDL_SV_BK */ + MDL_SHIELD_MAX, /* ITEMMDL_ET_BK */ + MDL_SHIELD_MAX, /* ITEMMDL_LMF_BK */ + MDL_SHIELD_MAX, /* ITEMMDL_SILVER_RUPEE */ + MDL_SHIELD_MAX, /* ITEMMDL_GOLD_RUPEE */ + MDL_SHIELD_MAX, /* ITEMMDL_RUPOOR */ + MDL_SHIELD_MAX, /* ITEMMDL_5_CRYSTALS */ + MDL_SHIELD_MAX, /* ITEMMDL_GLITTERING_SPORES */ + MDL_SHIELD_MAX, /* ITEMMDL_5_BOMBS */ + MDL_SHIELD_MAX, /* ITEMMDL_10_BOMBS */ + MDL_SHIELD_MAX, /* ITEMMDL_STAMINA_FRUIT */ + MDL_SHIELD_MAX, /* ITEMMDL_FARORE_TEAR */ + MDL_SHIELD_MAX, /* ITEMMDL_DIN_TEAR */ + MDL_SHIELD_MAX, /* ITEMMDL_NAYRU_TEAR */ + MDL_SHIELD_MAX, /* ITEMMDL_SACRED_TEAR */ + MDL_SHIELD_MAX, /* ITEMMDL_LIGHT_FRUIT */ + MDL_SHIELD_MAX, /* ITEMMDL_1_CRYSTAL */ + MDL_SHIELD_MAX, /* ITEMMDL_GUST_BELLOWS */ + MDL_SHIELD_MAX, /* ITEMMDL_DUNGEON_MAP_FI */ + MDL_SHIELD_MAX, /* ITEMMDL_DUNGEON_MAP */ + MDL_SHIELD_MAX, /* ITEMMDL_SLINGSHOT */ + MDL_SHIELD_MAX, /* ITEMMDL_BEETLE */ + MDL_SHIELD_MAX, /* ITEMMDL_WATER */ + MDL_SHIELD_MAX, /* ITEMMDL_MUSHROOM_SPORES */ + MDL_SHIELD_MAX, /* ITEMMDL_DIGGING_MITTS */ + MDL_SHIELD_MAX, /* ITEMMDL_5_DEKU_SEEDS */ + MDL_SHIELD_MAX, /* ITEMMDL_10_DEKU_SEEDS */ + MDL_SHIELD_MAX, /* ITEMMDL_GUARDIAN_POTION */ + MDL_SHIELD_MAX, /* ITEMMDL_GUARDIAN_POTION_PLUS */ + MDL_SHIELD_MAX, /* ITEMMDL_WATER_SCALE */ + MDL_SHIELD_MAX, /* ITEMMDL_BUG_MEDAL */ + MDL_SHIELD_MAX, /* ITEMMDL_BUG_NET */ + MDL_SHIELD_MAX, /* ITEMMDL_FAIRY */ + MDL_SHIELD_MAX, /* ITEMMDL_SACRED_WATER */ + MDL_SHIELD_MAX, /* ITEMMDL_HOOK_BEETLE */ + MDL_SHIELD_MAX, /* ITEMMDL_QUICK_BEETLE */ + MDL_SHIELD_MAX, /* ITEMMDL_TOUGH_BEETLE */ + MDL_SHIELD_MAX, /* ITEMMDL_HEART_POTION */ + MDL_SHIELD_MAX, /* ITEMMDL_HEART_POTION_PLUS */ + MDL_SHIELD_MAX, /* ITEMMDL_HEART_POTION_ALSO_PLUS */ + MDL_SHIELD_MAX, /* ITEMMDL_STAMINA_POTION */ + MDL_SHIELD_MAX, /* ITEMMDL_STAMINA_POTION_PLUS */ + MDL_SHIELD_MAX, /* ITEMMDL_AIR_POTION */ + MDL_SHIELD_MAX, /* ITEMMDL_AIR_POTION_PLUS */ + MDL_SHIELD_MAX, /* ITEMMDL_BOTTLED_FAIRY */ + MDL_SHIELD_MAX, /* ITEMMDL_IRON_BOW */ + MDL_SHIELD_MAX, /* ITEMMDL_SACRED_BOW */ + MDL_SHIELD_MAX, /* ITEMMDL_BOMB_BAG */ + MDL_SHIELD_MAX, /* ITEMMDL_HEART_CONTAINER */ + MDL_SHIELD_MAX, /* ITEMMDL_HEART_PIECE */ + MDL_SHIELD_MAX, /* ITEMMDL_TRI_COURAGE */ + MDL_SHIELD_MAX, /* ITEMMDL_TRI_POWER */ + MDL_SHIELD_MAX, /* ITEMMDL_TRI_WISDOWM */ + MDL_SHIELD_MAX, /* ITEMMDL_SEA_CHART */ + MDL_SHIELD_MAX, /* ITEMMDL_MOGMA_MITTS */ + MDL_SHIELD_MAX, /* ITEMMDL_HEART_MEDAL */ + MDL_SHIELD_MAX, /* ITEMMDL_RUPEE_MEDAL */ + MDL_SHIELD_MAX, /* ITEMMDL_TREASURE_MEDAL */ + MDL_SHIELD_MAX, /* ITEMMDL_POTION_MEDAL */ + MDL_SHIELD_MAX, /* ITEMMDL_CURSED_MEDAL */ + MDL_SHIELD_MAX, /* ITEMMDL_MIGHTY_SCATTERSHOT */ + MDL_SHIELD_MAX, /* ITEMMDL_85 */ + MDL_SHIELD_MAX, /* ITEMMDL_MEDIUM_WALLET */ + MDL_SHIELD_MAX, /* ITEMMDL_BIG_WALLET */ + MDL_SHIELD_MAX, /* ITEMMDL_GIANT_WALLET */ + MDL_SHIELD_MAX, /* ITEMMDL_TYCOON_WALLET */ + MDL_SHIELD_MAX, /* ITEMMDL_ADVENTURE_POUCH */ + MDL_SHIELD_MAX, /* ITEMMDL_POUCH_EXPANSION */ + MDL_SHIELD_MAX, /* ITEMMDL_LIFE_MEDAL */ + MDL_SHIELD_WOOD_0, /* ITEMMDL_WOODEN_SHIELD */ + MDL_SHIELD_WOOD_1, /* ITEMMDL_BANDED_SHIELD */ + MDL_SHIELD_WOOD_2, /* ITEMMDL_BRACED_SHIELD */ + MDL_SHIELD_IRON_0, /* ITEMMDL_IRON_SHIELD */ + MDL_SHIELD_IRON_1, /* ITEMMDL_REINFORCED_SHIELD */ + MDL_SHIELD_IRON_2, /* ITEMMDL_FORTIFIED_SHIELD */ + MDL_SHIELD_HOLY_0, /* ITEMMDL_SACRED_SHIELD */ + MDL_SHIELD_HOLY_1, /* ITEMMDL_DIVINE_SHIELD */ + MDL_SHIELD_HOLY_2, /* ITEMMDL_GODDESS_SHIELD */ + MDL_SHIELD_MAX, /* ITEMMDL_HYLIAN_SHIELD */ + MDL_SHIELD_MAX, /* ITEMMDL_REVITALIZING_POTION */ + MDL_SHIELD_MAX, /* ITEMMDL_REVITALIZING_POTION_PLUS */ + MDL_SHIELD_MAX, /* ITEMMDL_SMALL_SEED_SATCHEL */ + MDL_SHIELD_MAX, /* ITEMMDL_MEDIUM_SEED_SATCHEL */ + MDL_SHIELD_MAX, /* ITEMMDL_LARGE_SEED_SATCHEL */ + MDL_SHIELD_MAX, /* ITEMMDL_SMALL_QUIVER */ + MDL_SHIELD_MAX, /* ITEMMDL_MEDIUM_QUIVER */ + MDL_SHIELD_MAX, /* ITEMMDL_LARGE_QUIVER */ + MDL_SHIELD_MAX, /* ITEMMDL_SMALL_BOMB_BAG */ + MDL_SHIELD_MAX, /* ITEMMDL_MEDIUM_BOMB_BAG */ + MDL_SHIELD_MAX, /* ITEMMDL_LARGE_BOMB_BAG */ + MDL_SHIELD_MAX, /* ITEMMDL_WHIP */ + MDL_SHIELD_MAX, /* ITEMMDL_FIRESHIELD_EARRINGS */ + MDL_SHIELD_MAX, /* ITEMMDL_BIG_BUG_NET */ + MDL_SHIELD_MAX, /* ITEMMDL_FARON_GRASSHOPPER */ + MDL_SHIELD_MAX, /* ITEMMDL_WOODLAND_RHINO_BEETLE */ + MDL_SHIELD_MAX, /* ITEMMDL_DEKU_HORNET */ + MDL_SHIELD_MAX, /* ITEMMDL_SKYLOFT_MANTIS */ + MDL_SHIELD_MAX, /* ITEMMDL_VOLCANIC_LADYBUG */ + MDL_SHIELD_MAX, /* ITEMMDL_BLESSED_BUTTERFLY */ + MDL_SHIELD_MAX, /* ITEMMDL_LANAYRU_ANT */ + MDL_SHIELD_MAX, /* ITEMMDL_SAND_CICADA */ + MDL_SHIELD_MAX, /* ITEMMDL_GERUDO_DRAGONFLY */ + MDL_SHIELD_MAX, /* ITEMMDL_ELDIN_ROLLER */ + MDL_SHIELD_MAX, /* ITEMMDL_SKY_STAG_BEETLE */ + MDL_SHIELD_MAX, /* ITEMMDL_STARRY_FIREFLY */ + MDL_SHIELD_MAX, /* ITEMMDL_BOTTLE */ + MDL_SHIELD_MAX, /* ITEMMDL_CAWLIN_LETTER */ + MDL_SHIELD_MAX, /* ITEMMDL_BEEDLE_INSECT_CAGE */ + MDL_SHIELD_MAX, /* ITEMMDL_RATTLE */ + MDL_SHIELD_MAX, /* ITEMMDL_HORNET_LARVAE */ + MDL_SHIELD_MAX, /* ITEMMDL_BIRD_FEATHER */ + MDL_SHIELD_MAX, /* ITEMMDL_TUMBLE_WEED */ + MDL_SHIELD_MAX, /* ITEMMDL_LIZARD_TAIL */ + MDL_SHIELD_MAX, /* ITEMMDL_ELDIN_ORE */ + MDL_SHIELD_MAX, /* ITEMMDL_ANCIENT_FLOWER */ + MDL_SHIELD_MAX, /* ITEMMDL_AMBER_RELIC */ + MDL_SHIELD_MAX, /* ITEMMDL_DUSK_RELIC */ + MDL_SHIELD_MAX, /* ITEMMDL_JELLY_BLOB */ + MDL_SHIELD_MAX, /* ITEMMDL_MONSTER_CLAW */ + MDL_SHIELD_MAX, /* ITEMMDL_MONSTER_HORN */ + MDL_SHIELD_MAX, /* ITEMMDL_ORNAMENTAL_SKULL */ + MDL_SHIELD_MAX, /* ITEMMDL_EVIL_CRYSTAL */ + MDL_SHIELD_MAX, /* ITEMMDL_BLUE_BIRD_FEATHER */ + MDL_SHIELD_MAX, /* ITEMMDL_GOLDEN_SKULL */ + MDL_SHIELD_MAX, /* ITEMMDL_GODDESS_PLUME */ + MDL_SHIELD_MAX, /* ITEMMDL_EMERALD_TABLET */ + MDL_SHIELD_MAX, /* ITEMMDL_RUBY_TABLET */ + MDL_SHIELD_MAX, /* ITEMMDL_AMBER_TABLET */ + MDL_SHIELD_MAX, /* ITEMMDL_STONE_OF_TRIALS */ + MDL_SHIELD_MAX, /* ITEMMDL_BALLAD_OF_THE_GODDESS */ + MDL_SHIELD_MAX, /* ITEMMDL_FARORES_COURAGE */ + MDL_SHIELD_MAX, /* ITEMMDL_NAYRUS_WISDOM */ + MDL_SHIELD_MAX, /* ITEMMDL_DINS_POWER */ + MDL_SHIELD_MAX, /* ITEMMDL_FARON_SOTH */ + MDL_SHIELD_MAX, /* ITEMMDL_ELDIN_SOTH */ + MDL_SHIELD_MAX, /* ITEMMDL_LANAYRU_SOTH */ + MDL_SHIELD_MAX, /* ITEMMDL_ITEM_SOTH */ + MDL_SHIELD_MAX, /* ITEMMDL_REVITALIZING_POTION_PLUS_PLUS */ + MDL_SHIELD_MAX, /* ITEMMDL_HOT_SOUP */ + MDL_SHIELD_MAX, /* ITEMMDL_COLD_SOUP */ + MDL_SHIELD_MAX, /* ITEMMDL_LIFE_TREE_SEED */ + MDL_SHIELD_MAX, /* ITEMMDL_LIFE_TREE_FRUIT */ + MDL_SHIELD_MAX, /* ITEMMDL_EXTRA_WALLET */ +}; + +const dItemMdlShield_c::MdlConfig dItemMdlShield_c::sMdlConfig[] = { + {0.0f, "GetShieldWood", "GetShieldWood", "EquipShieldWood"}, + {1.0f, "GetShieldWood", "GetShieldWood", "EquipShieldWood"}, + {2.0f, "GetShieldWood", "GetShieldWood", "EquipShieldWood"}, + {0.0f, "GetShieldIron", "GetShieldIron", "EquipShieldIron"}, + {1.0f, "GetShieldIron", "GetShieldIron", "EquipShieldIron"}, + {2.0f, "GetShieldIron", "GetShieldIron", "EquipShieldIron"}, + {0.0f, "GetShieldHoly", "GetShieldHoly", "EquipShieldHoly"}, + {1.0f, "GetShieldHoly", "GetShieldHoly", "EquipShieldHoly"}, + {2.0f, "GetShieldHoly", "GetShieldHoly", "EquipShieldHoly"}, +}; + +bool dItemMdlShield_c::isMdlForItemId(u16 itemId) { + if (hasItemMdl(itemId) == false) { + return false; + } else { + return sMdlIdx[getItemMdlIdx(itemId)] <= MDL_SHIELD_MAX - 1; + } +} + +bool dItemMdlShield_c::init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) { + s32 mdlIdx = getItemMdlIdx(itemId); + u8 mdlConfigIdx = sMdlIdx[mdlIdx]; + + const MdlConfig *fileAndMdl = &sMdlConfig[mdlConfigIdx]; + + void *resData0 = OarcManager::GetInstance()->getMdlFromArc2(fileAndMdl->resFile); + if (resData0 == nullptr) { + return false; + } + nw4r::g3d::ResFile res0(resData0); + if (!res0.IsValid()) { + return false; + } + + nw4r::g3d::ResMdl mdl0(res0.GetResMdl(fileAndMdl->mdlName)); + if (!mdl0.IsValid()) { + return false; + } + + if (!mMdl.create(mdl0, allocator, 0x123)) { + return false; + } + + nw4r::g3d::ResAnmTexPat pat0(res0.GetResAnmTexPat(fileAndMdl->anmName)); + if (!pat0.IsValid()) { + return false; + } + + if (!mAnmTexPat.create(mdl0, pat0, allocator, NULL, 1)) { + return false; + } + + mMdl.setAnm(mAnmTexPat); + mAnmTexPat.setFrame(fileAndMdl->frame, 0); + + mpItem = item; + return true; +} + +void dItemMdlShield_c::vt_0x10(u8 arg) { + field_0x14 = arg; +} + +void dItemMdlShield_c::setScale(const mVec3_c &scale) { + mMdl.setScale(scale); +} + +void dItemMdlShield_c::setLocalMtx(const mMtx_c &mtx) { + mMdl.setLocalMtx(mtx); +} + +void dItemMdlShield_c::draw() { + if (field_0x14 == ITEM_MDL_UNK0x14_2) { + mpItem->fn_8002ECD0(&mMdl, 6); + } else { + mpItem->fn_8002ECD0(&mMdl, 7); + } +} + +void dItemMdlShield_c::vt_0x20() { + // no-op +} + +void dItemMdlShield_c::setPriorityDraw() { + mMdl.setPriorityDraw(0x82, 0x7F); +} + +void dItemMdlShield_c::unsetPriorityDraw() { + mMdl.setPriorityDraw(0x7F, 0x7F); +} + +const u8 dItemMdlBottle_c::sMdlIdx[] = { + MDL_BOTTLE_MAX, /* ITEMMDL_SMALL_KEY */ + MDL_BOTTLE_MAX, /* ITEMMDL_GREEN_RUPEE */ + MDL_BOTTLE_MAX, /* ITEMMDL_BLUE_RUPEE */ + MDL_BOTTLE_MAX, /* ITEMMDL_RED_RUPEE */ + MDL_BOTTLE_MAX, /* ITEMMDL_COMPLETE_TRIFORCE */ + MDL_BOTTLE_MAX, /* ITEMMDL_HEART */ + MDL_BOTTLE_MAX, /* ITEMMDL_SINGLE_ARROW */ + MDL_BOTTLE_MAX, /* ITEMMDL_BUNDLE_ARROWS */ + MDL_BOTTLE_MAX, /* ITEMMDL_GODDESS_WHITESWORD */ + MDL_BOTTLE_MAX, /* ITEMMDL_PRACTICE_SWORD */ + MDL_BOTTLE_MAX, /* ITEMMDL_GODDESS_SWORD */ + MDL_BOTTLE_MAX, /* ITEMMDL_GODDESS_LONGSWORD */ + MDL_BOTTLE_MAX, /* ITEMMDL_MASTER_SWORD */ + MDL_BOTTLE_MAX, /* ITEMMDL_TRUE_MASTER_SWORD */ + MDL_BOTTLE_MAX, /* ITEMMDL_SAILCLOTH */ + MDL_BOTTLE_MAX, /* ITEMMDL_GODDESS_HARP */ + MDL_BOTTLE_MAX, /* ITEMMDL_SPIRIT_VESSEL */ + MDL_BOTTLE_MAX, /* ITEMMDL_BOW */ + MDL_BOTTLE_MAX, /* ITEMMDL_CLAWSHOWS */ + MDL_BOTTLE_MAX, /* ITEMMDL_BIRD_STATUETTE */ + MDL_BOTTLE_MAX, /* ITEMMDL_AC_BK */ + MDL_BOTTLE_MAX, /* ITEMMDL_FS_BK */ + MDL_BOTTLE_MAX, /* ITEMMDL_SSH_BK */ + MDL_BOTTLE_MAX, /* ITEMMDL_KEY_PIECE */ + MDL_BOTTLE_MAX, /* ITEMMDL_SV_BK */ + MDL_BOTTLE_MAX, /* ITEMMDL_ET_BK */ + MDL_BOTTLE_MAX, /* ITEMMDL_LMF_BK */ + MDL_BOTTLE_MAX, /* ITEMMDL_SILVER_RUPEE */ + MDL_BOTTLE_MAX, /* ITEMMDL_GOLD_RUPEE */ + MDL_BOTTLE_MAX, /* ITEMMDL_RUPOOR */ + MDL_BOTTLE_MAX, /* ITEMMDL_5_CRYSTALS */ + MDL_BOTTLE_MAX, /* ITEMMDL_GLITTERING_SPORES */ + MDL_BOTTLE_MAX, /* ITEMMDL_5_BOMBS */ + MDL_BOTTLE_MAX, /* ITEMMDL_10_BOMBS */ + MDL_BOTTLE_MAX, /* ITEMMDL_STAMINA_FRUIT */ + MDL_BOTTLE_MAX, /* ITEMMDL_FARORE_TEAR */ + MDL_BOTTLE_MAX, /* ITEMMDL_DIN_TEAR */ + MDL_BOTTLE_MAX, /* ITEMMDL_NAYRU_TEAR */ + MDL_BOTTLE_MAX, /* ITEMMDL_SACRED_TEAR */ + MDL_BOTTLE_MAX, /* ITEMMDL_LIGHT_FRUIT */ + MDL_BOTTLE_MAX, /* ITEMMDL_1_CRYSTAL */ + MDL_BOTTLE_MAX, /* ITEMMDL_GUST_BELLOWS */ + MDL_BOTTLE_MAX, /* ITEMMDL_DUNGEON_MAP_FI */ + MDL_BOTTLE_MAX, /* ITEMMDL_DUNGEON_MAP */ + MDL_BOTTLE_MAX, /* ITEMMDL_SLINGSHOT */ + MDL_BOTTLE_MAX, /* ITEMMDL_BEETLE */ + MDL_BOTTLE_WATER, /* ITEMMDL_WATER */ + MDL_BOTTLE_MAX, /* ITEMMDL_MUSHROOM_SPORES */ + MDL_BOTTLE_MAX, /* ITEMMDL_DIGGING_MITTS */ + MDL_BOTTLE_MAX, /* ITEMMDL_5_DEKU_SEEDS */ + MDL_BOTTLE_MAX, /* ITEMMDL_10_DEKU_SEEDS */ + MDL_BOTTLE_MAX, /* ITEMMDL_GUARDIAN_POTION */ + MDL_BOTTLE_MAX, /* ITEMMDL_GUARDIAN_POTION_PLUS */ + MDL_BOTTLE_MAX, /* ITEMMDL_WATER_SCALE */ + MDL_BOTTLE_MAX, /* ITEMMDL_BUG_MEDAL */ + MDL_BOTTLE_MAX, /* ITEMMDL_BUG_NET */ + MDL_BOTTLE_FAIRY, /* ITEMMDL_FAIRY */ + MDL_BOTTLE_HOLY, /* ITEMMDL_SACRED_WATER */ + MDL_BOTTLE_MAX, /* ITEMMDL_HOOK_BEETLE */ + MDL_BOTTLE_MAX, /* ITEMMDL_QUICK_BEETLE */ + MDL_BOTTLE_MAX, /* ITEMMDL_TOUGH_BEETLE */ + MDL_BOTTLE_KUSURI, /* ITEMMDL_HEART_POTION */ + MDL_BOTTLE_KUSURI, /* ITEMMDL_HEART_POTION_PLUS */ + MDL_BOTTLE_KUSURI_S, /* ITEMMDL_HEART_POTION_ALSO_PLUS */ + MDL_BOTTLE_MAX, /* ITEMMDL_STAMINA_POTION */ + MDL_BOTTLE_MAX, /* ITEMMDL_STAMINA_POTION_PLUS */ + MDL_BOTTLE_MAX, /* ITEMMDL_AIR_POTION */ + MDL_BOTTLE_MAX, /* ITEMMDL_AIR_POTION_PLUS */ + MDL_BOTTLE_B_FAIRY, /* ITEMMDL_BOTTLED_FAIRY */ + MDL_BOTTLE_MAX, /* ITEMMDL_IRON_BOW */ + MDL_BOTTLE_MAX, /* ITEMMDL_SACRED_BOW */ + MDL_BOTTLE_MAX, /* ITEMMDL_BOMB_BAG */ + MDL_BOTTLE_MAX, /* ITEMMDL_HEART_CONTAINER */ + MDL_BOTTLE_MAX, /* ITEMMDL_HEART_PIECE */ + MDL_BOTTLE_MAX, /* ITEMMDL_TRI_COURAGE */ + MDL_BOTTLE_MAX, /* ITEMMDL_TRI_POWER */ + MDL_BOTTLE_MAX, /* ITEMMDL_TRI_WISDOWM */ + MDL_BOTTLE_MAX, /* ITEMMDL_SEA_CHART */ + MDL_BOTTLE_MAX, /* ITEMMDL_MOGMA_MITTS */ + MDL_BOTTLE_MAX, /* ITEMMDL_HEART_MEDAL */ + MDL_BOTTLE_MAX, /* ITEMMDL_RUPEE_MEDAL */ + MDL_BOTTLE_MAX, /* ITEMMDL_TREASURE_MEDAL */ + MDL_BOTTLE_MAX, /* ITEMMDL_POTION_MEDAL */ + MDL_BOTTLE_MAX, /* ITEMMDL_CURSED_MEDAL */ + MDL_BOTTLE_MAX, /* ITEMMDL_MIGHTY_SCATTERSHOT */ + MDL_BOTTLE_MAX, /* ITEMMDL_85 */ + MDL_BOTTLE_MAX, /* ITEMMDL_MEDIUM_WALLET */ + MDL_BOTTLE_MAX, /* ITEMMDL_BIG_WALLET */ + MDL_BOTTLE_MAX, /* ITEMMDL_GIANT_WALLET */ + MDL_BOTTLE_MAX, /* ITEMMDL_TYCOON_WALLET */ + MDL_BOTTLE_MAX, /* ITEMMDL_ADVENTURE_POUCH */ + MDL_BOTTLE_MAX, /* ITEMMDL_POUCH_EXPANSION */ + MDL_BOTTLE_MAX, /* ITEMMDL_LIFE_MEDAL */ + MDL_BOTTLE_MAX, /* ITEMMDL_WOODEN_SHIELD */ + MDL_BOTTLE_MAX, /* ITEMMDL_BANDED_SHIELD */ + MDL_BOTTLE_MAX, /* ITEMMDL_BRACED_SHIELD */ + MDL_BOTTLE_MAX, /* ITEMMDL_IRON_SHIELD */ + MDL_BOTTLE_MAX, /* ITEMMDL_REINFORCED_SHIELD */ + MDL_BOTTLE_MAX, /* ITEMMDL_FORTIFIED_SHIELD */ + MDL_BOTTLE_MAX, /* ITEMMDL_SACRED_SHIELD */ + MDL_BOTTLE_MAX, /* ITEMMDL_DIVINE_SHIELD */ + MDL_BOTTLE_MAX, /* ITEMMDL_GODDESS_SHIELD */ + MDL_BOTTLE_MAX, /* ITEMMDL_HYLIAN_SHIELD */ + MDL_BOTTLE_MAX, /* ITEMMDL_REVITALIZING_POTION */ + MDL_BOTTLE_MAX, /* ITEMMDL_REVITALIZING_POTION_PLUS */ + MDL_BOTTLE_MAX, /* ITEMMDL_SMALL_SEED_SATCHEL */ + MDL_BOTTLE_MAX, /* ITEMMDL_MEDIUM_SEED_SATCHEL */ + MDL_BOTTLE_MAX, /* ITEMMDL_LARGE_SEED_SATCHEL */ + MDL_BOTTLE_MAX, /* ITEMMDL_SMALL_QUIVER */ + MDL_BOTTLE_MAX, /* ITEMMDL_MEDIUM_QUIVER */ + MDL_BOTTLE_MAX, /* ITEMMDL_LARGE_QUIVER */ + MDL_BOTTLE_MAX, /* ITEMMDL_SMALL_BOMB_BAG */ + MDL_BOTTLE_MAX, /* ITEMMDL_MEDIUM_BOMB_BAG */ + MDL_BOTTLE_MAX, /* ITEMMDL_LARGE_BOMB_BAG */ + MDL_BOTTLE_MAX, /* ITEMMDL_WHIP */ + MDL_BOTTLE_MAX, /* ITEMMDL_FIRESHIELD_EARRINGS */ + MDL_BOTTLE_MAX, /* ITEMMDL_BIG_BUG_NET */ + MDL_BOTTLE_MAX, /* ITEMMDL_FARON_GRASSHOPPER */ + MDL_BOTTLE_MAX, /* ITEMMDL_WOODLAND_RHINO_BEETLE */ + MDL_BOTTLE_MAX, /* ITEMMDL_DEKU_HORNET */ + MDL_BOTTLE_MAX, /* ITEMMDL_SKYLOFT_MANTIS */ + MDL_BOTTLE_MAX, /* ITEMMDL_VOLCANIC_LADYBUG */ + MDL_BOTTLE_MAX, /* ITEMMDL_BLESSED_BUTTERFLY */ + MDL_BOTTLE_MAX, /* ITEMMDL_LANAYRU_ANT */ + MDL_BOTTLE_MAX, /* ITEMMDL_SAND_CICADA */ + MDL_BOTTLE_MAX, /* ITEMMDL_GERUDO_DRAGONFLY */ + MDL_BOTTLE_MAX, /* ITEMMDL_ELDIN_ROLLER */ + MDL_BOTTLE_MAX, /* ITEMMDL_SKY_STAG_BEETLE */ + MDL_BOTTLE_MAX, /* ITEMMDL_STARRY_FIREFLY */ + MDL_BOTTLE_MAX, /* ITEMMDL_BOTTLE */ + MDL_BOTTLE_MAX, /* ITEMMDL_CAWLIN_LETTER */ + MDL_BOTTLE_MAX, /* ITEMMDL_BEEDLE_INSECT_CAGE */ + MDL_BOTTLE_MAX, /* ITEMMDL_RATTLE */ + MDL_BOTTLE_MAX, /* ITEMMDL_HORNET_LARVAE */ + MDL_BOTTLE_MAX, /* ITEMMDL_BIRD_FEATHER */ + MDL_BOTTLE_MAX, /* ITEMMDL_TUMBLE_WEED */ + MDL_BOTTLE_MAX, /* ITEMMDL_LIZARD_TAIL */ + MDL_BOTTLE_MAX, /* ITEMMDL_ELDIN_ORE */ + MDL_BOTTLE_MAX, /* ITEMMDL_ANCIENT_FLOWER */ + MDL_BOTTLE_MAX, /* ITEMMDL_AMBER_RELIC */ + MDL_BOTTLE_MAX, /* ITEMMDL_DUSK_RELIC */ + MDL_BOTTLE_SOZAI_I, /* ITEMMDL_JELLY_BLOB */ + MDL_BOTTLE_MAX, /* ITEMMDL_MONSTER_CLAW */ + MDL_BOTTLE_MAX, /* ITEMMDL_MONSTER_HORN */ + MDL_BOTTLE_MAX, /* ITEMMDL_ORNAMENTAL_SKULL */ + MDL_BOTTLE_MAX, /* ITEMMDL_EVIL_CRYSTAL */ + MDL_BOTTLE_MAX, /* ITEMMDL_BLUE_BIRD_FEATHER */ + MDL_BOTTLE_MAX, /* ITEMMDL_GOLDEN_SKULL */ + MDL_BOTTLE_MAX, /* ITEMMDL_GODDESS_PLUME */ + MDL_BOTTLE_MAX, /* ITEMMDL_EMERALD_TABLET */ + MDL_BOTTLE_MAX, /* ITEMMDL_RUBY_TABLET */ + MDL_BOTTLE_MAX, /* ITEMMDL_AMBER_TABLET */ + MDL_BOTTLE_MAX, /* ITEMMDL_STONE_OF_TRIALS */ + MDL_BOTTLE_MAX, /* ITEMMDL_BALLAD_OF_THE_GODDESS */ + MDL_BOTTLE_MAX, /* ITEMMDL_FARORES_COURAGE */ + MDL_BOTTLE_MAX, /* ITEMMDL_NAYRUS_WISDOM */ + MDL_BOTTLE_MAX, /* ITEMMDL_DINS_POWER */ + MDL_BOTTLE_MAX, /* ITEMMDL_FARON_SOTH */ + MDL_BOTTLE_MAX, /* ITEMMDL_ELDIN_SOTH */ + MDL_BOTTLE_MAX, /* ITEMMDL_LANAYRU_SOTH */ + MDL_BOTTLE_MAX, /* ITEMMDL_ITEM_SOTH */ + MDL_BOTTLE_MAX, /* ITEMMDL_REVITALIZING_POTION_PLUS_PLUS */ + MDL_BOTTLE_PUMPKIN, /* ITEMMDL_HOT_SOUP */ + MDL_BOTTLE_PUMPKIN, /* ITEMMDL_COLD_SOUP */ + MDL_BOTTLE_MAX, /* ITEMMDL_LIFE_TREE_SEED */ + MDL_BOTTLE_MAX, /* ITEMMDL_LIFE_TREE_FRUIT */ + MDL_BOTTLE_MAX, /* ITEMMDL_EXTRA_WALLET */ +}; + +const dItemMdlBottle_c::MdlConfig dItemMdlBottle_c::sMdlConfig[] = { + { "GetBottleWater", "GetBottleWater", "GetBottleWater"}, + { "GetFairy", "GetFairy", "GetFairy"}, + { "GetBottleHoly", "GetBottleHoly", "GetBottleHoly"}, + { "GetBottleKusuri", "GetBottleKusuri", "GetBottleKusuri"}, + {"GetBottleKusuriS", "GetBottleKusuriS", "GetBottleKusuriS"}, + { "GetBottleFairy", "GetBottleFairy", "GetBottleFairy"}, + { "GetSozaiI", "GetSozaiI", "GetSozaiI"}, + {"GetBottlePumpkin", "GetBottlePumpkin", "GetBottlePumpkin"}, +}; + +bool dItemMdlBottle_c::isMdlForItemId(u16 itemId) { + if (hasItemMdl(itemId) == false) { + return false; + } else { + return sMdlIdx[getItemMdlIdx(itemId)] <= MDL_BOTTLE_MAX - 1; + } +} + +bool dItemMdlBottle_c::init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) { + s32 mdlIdx = getItemMdlIdx(itemId); + u8 mdlConfigIdx = sMdlIdx[mdlIdx]; + + const MdlConfig *fileAndMdl = &sMdlConfig[mdlConfigIdx]; + + void *resData0 = OarcManager::GetInstance()->getMdlFromArc2(fileAndMdl->resFile); + if (resData0 == nullptr) { + return false; + } + + if (!mMdl.create(resData0, fileAndMdl->mdlName, fileAndMdl->anmName, allocator, 0x120)) { + return false; + } + + if (!mMdl.setAnm(fileAndMdl->anmName, m3d::PLAY_MODE_4)) { + return false; + } + + mpItem = item; + if (dAcItem_c::isJellyBlob((ITEM_ID)itemId)) { + mFlags |= 0x1; + } + + return true; +} + +void dItemMdlBottle_c::vt_0x10(u8 arg) { + field_0x14 = arg; +} + +void dItemMdlBottle_c::setScale(const mVec3_c &scale) { + mMdl.getModel().setScale(scale); +} + +void dItemMdlBottle_c::setLocalMtx(const mMtx_c &mtx) { + mMdl.getModel().setLocalMtx(mtx); +} + +void dItemMdlBottle_c::draw() { + if (mpItem == nullptr) { + return; + } + + if (field_0x14 != ITEM_MDL_UNK0x14_1 || (mFlags & 0x1) == 0) { + mMdl.play(); + } + + if (field_0x14 == ITEM_MDL_UNK0x14_2) { + mpItem->fn_8002ECD0(&mMdl.getModel(), 6); + } else { + mpItem->fn_8002ECD0(&mMdl.getModel(), 7); + } +} + +void dItemMdlBottle_c::vt_0x20() { + // no-op +} + +void dItemMdlBottle_c::setPriorityDraw() { + mMdl.getModel().setPriorityDraw(0x82, 0x7F); +} + +void dItemMdlBottle_c::unsetPriorityDraw() { + mMdl.getModel().setPriorityDraw(0x7F, 0x7F); +} + +const dItemMdlTear_c::MdlConfig dItemMdlTear_c::sMdlConfig[] = { + {0.0f}, + {1.0f}, + {2.0f}, + {3.0f}, +}; + +bool dItemMdlTear_c::isMdlForItemId(u16 itemId) { + return dAcItem_c::isTear((ITEM_ID)itemId); +} + +bool dItemMdlTear_c::init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) { + // TODO - why is TRY_CREATE used so inconsistently here? + + dAcItem_c::Tear_e tear = dAcItem_c::getTearSubtype((ITEM_ID)itemId); + if (tear == dAcItem_c::TEAR_MAX) { + return false; + } + + const MdlConfig *fileAndMdl = &sMdlConfig[tear]; + f32 frame = fileAndMdl->frame; + + { + void *resData1 = OarcManager::GetInstance()->getMdlFromArc2("PutSizuku"); + if (resData1 == nullptr) { + return false; + } + nw4r::g3d::ResFile res1(resData1); + if (!res1.IsValid()) { + return false; + } + + nw4r::g3d::ResMdl mdl1 = res1.GetResMdl("PutShizuku"); + if (!mdl1.IsValid()) { + return false; + } + if (!mMdl1.create(mdl1, allocator, 0x327)) { + return false; + } + + nw4r::g3d::ResAnmTexSrt anmTexSrt1 = res1.GetResAnmTexSrt("Shizuku"); + if (!anmTexSrt1.IsValid()) { + return false; + } + TRY_CREATE(mAnmTexSrt1.create(mdl1, anmTexSrt1, allocator, nullptr, 1)); + TRY_CREATE(mMdl1.setAnm(mAnmTexSrt1)); + + nw4r::g3d::ResAnmTexPat anmTexPat1 = res1.GetResAnmTexPat("Shizuku"); + if (!anmTexPat1.IsValid()) { + return false; + } + if (!mAnmTexPat1.create(mdl1, anmTexPat1, allocator, nullptr, 1)) { + return false; + } + TRY_CREATE(mMdl1.setAnm(mAnmTexPat1)); + mAnmTexPat1.setFrame(frame, 0); + } + + { + void *resData2 = OarcManager::GetInstance()->getMdlFromArc2("GetSizuku"); + if (resData2 == nullptr) { + return false; + } + nw4r::g3d::ResFile res2(resData2); + if (!res2.IsValid()) { + return false; + } + + nw4r::g3d::ResMdl mdl2 = res2.GetResMdl("GetShizuku"); + if (!mdl2.IsValid()) { + return false; + } + if (!mMdl2.create(mdl2, allocator, 0x327)) { + return false; + } + + nw4r::g3d::ResAnmTexSrt anmTexSrt2 = res2.GetResAnmTexSrt("Shizuku"); + if (!anmTexSrt2.IsValid()) { + return false; + } + TRY_CREATE(mAnmTexSrt2.create(mdl2, anmTexSrt2, allocator, nullptr, 1)); + TRY_CREATE(mMdl2.setAnm(mAnmTexSrt2)); + + nw4r::g3d::ResAnmTexPat anmTexPat2 = res2.GetResAnmTexPat("Shizuku"); + if (!anmTexPat2.IsValid()) { + return false; + } + if (!mAnmTexPat2.create(mdl2, anmTexPat2, allocator, nullptr, 1)) { + return false; + } + TRY_CREATE(mMdl2.setAnm(mAnmTexPat2)); + mAnmTexPat2.setFrame(frame, 0); + } + + mpItem = item; + + return true; +} + +void dItemMdlTear_c::vt_0x10(u8 arg) { + if (arg == ITEM_MDL_UNK0x14_3) { + field_0x14 = ITEM_MDL_UNK0x14_1; + } else { + field_0x14 = arg; + } +} + +void dItemMdlTear_c::setScale(const mVec3_c &scale) { + mMdl1.setScale(scale); + mMdl2.setScale(scale); +} + +void dItemMdlTear_c::setLocalMtx(const mMtx_c &mtx) { + mMdl1.setLocalMtx(mtx); + mMdl2.setLocalMtx(mtx); +} + +void dItemMdlTear_c::draw() { + switch (field_0x14) { + case ITEM_MDL_UNK0x14_1: + mAnmTexSrt1.play(); + mpItem->fn_8002ECD0(&mMdl1, 7); + break; + case ITEM_MDL_UNK0x14_2: + mAnmTexSrt2.play(); + mpItem->fn_8002ECD0(&mMdl2, 6); + break; + } +} + +void dItemMdlTear_c::vt_0x20() { + // no-op +} + +void dItemMdlTear_c::setPriorityDraw() { + mMdl1.setPriorityDraw(0x82, 0x7F); + mMdl2.setPriorityDraw(0x82, 0x7F); +} + +void dItemMdlTear_c::unsetPriorityDraw() { + mMdl1.setPriorityDraw(0x7F, 0x7F); + mMdl2.setPriorityDraw(0x7F, 0x7F); +} + +bool dItemMdlFirefly_c::isMdlForItemId(u16 itemId) { + return dAcItem_c::isStarryFirefly((ITEM_ID)itemId); +} + +bool dItemMdlFirefly_c::init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) { + void *resData = OarcManager::GetInstance()->getMdlFromArc2("GetInsectFirefly"); + if (resData == nullptr) { + return false; + } + nw4r::g3d::ResFile res(resData); + if (!res.IsValid()) { + return false; + } + + nw4r::g3d::ResMdl mdl = res.GetResMdl("GetInsectFirefly"); + if (!mdl.IsValid()) { + return false; + } + if (!mMdl.create(mdl, allocator, 0x128)) { + return false; + } + + nw4r::g3d::ResAnmClr anmClr = res.GetResAnmClr("GetInsectFirefly"); + if (!anmClr.IsValid()) { + return false; + } + TRY_CREATE(mAnmMatClr.create(mdl, anmClr, allocator, nullptr, 1)); + mAnmMatClr.setFrameOnly(0.0f); + TRY_CREATE(mMdl.setAnm(mAnmMatClr)); + + mpItem = item; + return true; +} + +void dItemMdlFirefly_c::vt_0x10(u8 arg) { + field_0x14 = arg; +} + +void dItemMdlFirefly_c::setScale(const mVec3_c &scale) { + mMdl.setScale(scale); +} + +void dItemMdlFirefly_c::setLocalMtx(const mMtx_c &mtx) { + mMdl.setLocalMtx(mtx); +} + +void dItemMdlFirefly_c::draw() { + switch (field_0x14) { + case ITEM_MDL_UNK0x14_1: mpItem->fn_8002ECD0(&mMdl, 7); break; + case ITEM_MDL_UNK0x14_2: mpItem->fn_8002ECD0(&mMdl, 6); break; + } + mAnmMatClr.play(); +} + +void dItemMdlFirefly_c::vt_0x20() { + // no-op +} + +void dItemMdlFirefly_c::setPriorityDraw() { + mMdl.setPriorityDraw(0x82, 0x7F); +} + +void dItemMdlFirefly_c::unsetPriorityDraw() { + mMdl.setPriorityDraw(0x7F, 0x7F); +} + +m3d::smdl_c *dItemMdlFirefly_c::getMdl() { + return &mMdl; +} + +const u8 dItemMdlPotion_c::sMdlIdx[] = { + MDL_POTION_MAX, /* ITEMMDL_SMALL_KEY */ + MDL_POTION_MAX, /* ITEMMDL_GREEN_RUPEE */ + MDL_POTION_MAX, /* ITEMMDL_BLUE_RUPEE */ + MDL_POTION_MAX, /* ITEMMDL_RED_RUPEE */ + MDL_POTION_MAX, /* ITEMMDL_COMPLETE_TRIFORCE */ + MDL_POTION_MAX, /* ITEMMDL_HEART */ + MDL_POTION_MAX, /* ITEMMDL_SINGLE_ARROW */ + MDL_POTION_MAX, /* ITEMMDL_BUNDLE_ARROWS */ + MDL_POTION_MAX, /* ITEMMDL_GODDESS_WHITESWORD */ + MDL_POTION_MAX, /* ITEMMDL_PRACTICE_SWORD */ + MDL_POTION_MAX, /* ITEMMDL_GODDESS_SWORD */ + MDL_POTION_MAX, /* ITEMMDL_GODDESS_LONGSWORD */ + MDL_POTION_MAX, /* ITEMMDL_MASTER_SWORD */ + MDL_POTION_MAX, /* ITEMMDL_TRUE_MASTER_SWORD */ + MDL_POTION_MAX, /* ITEMMDL_SAILCLOTH */ + MDL_POTION_MAX, /* ITEMMDL_GODDESS_HARP */ + MDL_POTION_MAX, /* ITEMMDL_SPIRIT_VESSEL */ + MDL_POTION_MAX, /* ITEMMDL_BOW */ + MDL_POTION_MAX, /* ITEMMDL_CLAWSHOWS */ + MDL_POTION_MAX, /* ITEMMDL_BIRD_STATUETTE */ + MDL_POTION_MAX, /* ITEMMDL_AC_BK */ + MDL_POTION_MAX, /* ITEMMDL_FS_BK */ + MDL_POTION_MAX, /* ITEMMDL_SSH_BK */ + MDL_POTION_MAX, /* ITEMMDL_KEY_PIECE */ + MDL_POTION_MAX, /* ITEMMDL_SV_BK */ + MDL_POTION_MAX, /* ITEMMDL_ET_BK */ + MDL_POTION_MAX, /* ITEMMDL_LMF_BK */ + MDL_POTION_MAX, /* ITEMMDL_SILVER_RUPEE */ + MDL_POTION_MAX, /* ITEMMDL_GOLD_RUPEE */ + MDL_POTION_MAX, /* ITEMMDL_RUPOOR */ + MDL_POTION_GENKI, /* ITEMMDL_5_CRYSTALS */ + MDL_POTION_MAX, /* ITEMMDL_GLITTERING_SPORES */ + MDL_POTION_MAX, /* ITEMMDL_5_BOMBS */ + MDL_POTION_MAX, /* ITEMMDL_10_BOMBS */ + MDL_POTION_MAX, /* ITEMMDL_STAMINA_FRUIT */ + MDL_POTION_MAX, /* ITEMMDL_FARORE_TEAR */ + MDL_POTION_MAX, /* ITEMMDL_DIN_TEAR */ + MDL_POTION_MAX, /* ITEMMDL_NAYRU_TEAR */ + MDL_POTION_MAX, /* ITEMMDL_SACRED_TEAR */ + MDL_POTION_MAX, /* ITEMMDL_LIGHT_FRUIT */ + MDL_POTION_GENKI, /* ITEMMDL_1_CRYSTAL */ + MDL_POTION_MAX, /* ITEMMDL_GUST_BELLOWS */ + MDL_POTION_MAX, /* ITEMMDL_DUNGEON_MAP_FI */ + MDL_POTION_MAX, /* ITEMMDL_DUNGEON_MAP */ + MDL_POTION_MAX, /* ITEMMDL_SLINGSHOT */ + MDL_POTION_MAX, /* ITEMMDL_BEETLE */ + MDL_POTION_MAX, /* ITEMMDL_WATER */ + MDL_POTION_MAX, /* ITEMMDL_MUSHROOM_SPORES */ + MDL_POTION_MAX, /* ITEMMDL_DIGGING_MITTS */ + MDL_POTION_MAX, /* ITEMMDL_5_DEKU_SEEDS */ + MDL_POTION_MAX, /* ITEMMDL_10_DEKU_SEEDS */ + MDL_POTION_MUTEKI, /* ITEMMDL_GUARDIAN_POTION */ + MDL_POTION_MUTEKI, /* ITEMMDL_GUARDIAN_POTION_PLUS */ + MDL_POTION_MAX, /* ITEMMDL_WATER_SCALE */ + MDL_POTION_MAX, /* ITEMMDL_BUG_MEDAL */ + MDL_POTION_MAX, /* ITEMMDL_BUG_NET */ + MDL_POTION_MAX, /* ITEMMDL_FAIRY */ + MDL_POTION_MAX, /* ITEMMDL_SACRED_WATER */ + MDL_POTION_MAX, /* ITEMMDL_HOOK_BEETLE */ + MDL_POTION_MAX, /* ITEMMDL_QUICK_BEETLE */ + MDL_POTION_MAX, /* ITEMMDL_TOUGH_BEETLE */ + MDL_POTION_MAX, /* ITEMMDL_HEART_POTION */ + MDL_POTION_MAX, /* ITEMMDL_HEART_POTION_PLUS */ + MDL_POTION_MAX, /* ITEMMDL_HEART_POTION_ALSO_PLUS */ + MDL_POTION_GUTS, /* ITEMMDL_STAMINA_POTION */ + MDL_POTION_GUTS, /* ITEMMDL_STAMINA_POTION_PLUS */ + MDL_POTION_AIR, /* ITEMMDL_AIR_POTION */ + MDL_POTION_AIR, /* ITEMMDL_AIR_POTION_PLUS */ + MDL_POTION_MAX, /* ITEMMDL_BOTTLED_FAIRY */ + MDL_POTION_MAX, /* ITEMMDL_IRON_BOW */ + MDL_POTION_MAX, /* ITEMMDL_SACRED_BOW */ + MDL_POTION_MAX, /* ITEMMDL_BOMB_BAG */ + MDL_POTION_MAX, /* ITEMMDL_HEART_CONTAINER */ + MDL_POTION_MAX, /* ITEMMDL_HEART_PIECE */ + MDL_POTION_MAX, /* ITEMMDL_TRI_COURAGE */ + MDL_POTION_MAX, /* ITEMMDL_TRI_POWER */ + MDL_POTION_MAX, /* ITEMMDL_TRI_WISDOWM */ + MDL_POTION_MAX, /* ITEMMDL_SEA_CHART */ + MDL_POTION_MAX, /* ITEMMDL_MOGMA_MITTS */ + MDL_POTION_MAX, /* ITEMMDL_HEART_MEDAL */ + MDL_POTION_MAX, /* ITEMMDL_RUPEE_MEDAL */ + MDL_POTION_MAX, /* ITEMMDL_TREASURE_MEDAL */ + MDL_POTION_MAX, /* ITEMMDL_POTION_MEDAL */ + MDL_POTION_MAX, /* ITEMMDL_CURSED_MEDAL */ + MDL_POTION_MAX, /* ITEMMDL_MIGHTY_SCATTERSHOT */ + MDL_POTION_MAX, /* ITEMMDL_85 */ + MDL_POTION_MAX, /* ITEMMDL_MEDIUM_WALLET */ + MDL_POTION_MAX, /* ITEMMDL_BIG_WALLET */ + MDL_POTION_MAX, /* ITEMMDL_GIANT_WALLET */ + MDL_POTION_MAX, /* ITEMMDL_TYCOON_WALLET */ + MDL_POTION_MAX, /* ITEMMDL_ADVENTURE_POUCH */ + MDL_POTION_MAX, /* ITEMMDL_POUCH_EXPANSION */ + MDL_POTION_MAX, /* ITEMMDL_LIFE_MEDAL */ + MDL_POTION_MAX, /* ITEMMDL_WOODEN_SHIELD */ + MDL_POTION_MAX, /* ITEMMDL_BANDED_SHIELD */ + MDL_POTION_MAX, /* ITEMMDL_BRACED_SHIELD */ + MDL_POTION_MAX, /* ITEMMDL_IRON_SHIELD */ + MDL_POTION_MAX, /* ITEMMDL_REINFORCED_SHIELD */ + MDL_POTION_MAX, /* ITEMMDL_FORTIFIED_SHIELD */ + MDL_POTION_MAX, /* ITEMMDL_SACRED_SHIELD */ + MDL_POTION_MAX, /* ITEMMDL_DIVINE_SHIELD */ + MDL_POTION_MAX, /* ITEMMDL_GODDESS_SHIELD */ + MDL_POTION_MAX, /* ITEMMDL_HYLIAN_SHIELD */ + MDL_POTION_MAX, /* ITEMMDL_REVITALIZING_POTION */ + MDL_POTION_MAX, /* ITEMMDL_REVITALIZING_POTION_PLUS */ + MDL_POTION_MAX, /* ITEMMDL_SMALL_SEED_SATCHEL */ + MDL_POTION_MAX, /* ITEMMDL_MEDIUM_SEED_SATCHEL */ + MDL_POTION_MAX, /* ITEMMDL_LARGE_SEED_SATCHEL */ + MDL_POTION_MAX, /* ITEMMDL_SMALL_QUIVER */ + MDL_POTION_MAX, /* ITEMMDL_MEDIUM_QUIVER */ + MDL_POTION_MAX, /* ITEMMDL_LARGE_QUIVER */ + MDL_POTION_MAX, /* ITEMMDL_SMALL_BOMB_BAG */ + MDL_POTION_MAX, /* ITEMMDL_MEDIUM_BOMB_BAG */ + MDL_POTION_MAX, /* ITEMMDL_LARGE_BOMB_BAG */ + MDL_POTION_MAX, /* ITEMMDL_WHIP */ + MDL_POTION_MAX, /* ITEMMDL_FIRESHIELD_EARRINGS */ + MDL_POTION_MAX, /* ITEMMDL_BIG_BUG_NET */ + MDL_POTION_MAX, /* ITEMMDL_FARON_GRASSHOPPER */ + MDL_POTION_MAX, /* ITEMMDL_WOODLAND_RHINO_BEETLE */ + MDL_POTION_MAX, /* ITEMMDL_DEKU_HORNET */ + MDL_POTION_MAX, /* ITEMMDL_SKYLOFT_MANTIS */ + MDL_POTION_MAX, /* ITEMMDL_VOLCANIC_LADYBUG */ + MDL_POTION_MAX, /* ITEMMDL_BLESSED_BUTTERFLY */ + MDL_POTION_MAX, /* ITEMMDL_LANAYRU_ANT */ + MDL_POTION_MAX, /* ITEMMDL_SAND_CICADA */ + MDL_POTION_MAX, /* ITEMMDL_GERUDO_DRAGONFLY */ + MDL_POTION_MAX, /* ITEMMDL_ELDIN_ROLLER */ + MDL_POTION_MAX, /* ITEMMDL_SKY_STAG_BEETLE */ + MDL_POTION_MAX, /* ITEMMDL_STARRY_FIREFLY */ + MDL_POTION_MAX, /* ITEMMDL_BOTTLE */ + MDL_POTION_MAX, /* ITEMMDL_CAWLIN_LETTER */ + MDL_POTION_MAX, /* ITEMMDL_BEEDLE_INSECT_CAGE */ + MDL_POTION_MAX, /* ITEMMDL_RATTLE */ + MDL_POTION_MAX, /* ITEMMDL_HORNET_LARVAE */ + MDL_POTION_MAX, /* ITEMMDL_BIRD_FEATHER */ + MDL_POTION_MAX, /* ITEMMDL_TUMBLE_WEED */ + MDL_POTION_MAX, /* ITEMMDL_LIZARD_TAIL */ + MDL_POTION_MAX, /* ITEMMDL_ELDIN_ORE */ + MDL_POTION_MAX, /* ITEMMDL_ANCIENT_FLOWER */ + MDL_POTION_MAX, /* ITEMMDL_AMBER_RELIC */ + MDL_POTION_MAX, /* ITEMMDL_DUSK_RELIC */ + MDL_POTION_MAX, /* ITEMMDL_JELLY_BLOB */ + MDL_POTION_MAX, /* ITEMMDL_MONSTER_CLAW */ + MDL_POTION_MAX, /* ITEMMDL_MONSTER_HORN */ + MDL_POTION_MAX, /* ITEMMDL_ORNAMENTAL_SKULL */ + MDL_POTION_MAX, /* ITEMMDL_EVIL_CRYSTAL */ + MDL_POTION_MAX, /* ITEMMDL_BLUE_BIRD_FEATHER */ + MDL_POTION_MAX, /* ITEMMDL_GOLDEN_SKULL */ + MDL_POTION_MAX, /* ITEMMDL_GODDESS_PLUME */ + MDL_POTION_MAX, /* ITEMMDL_EMERALD_TABLET */ + MDL_POTION_MAX, /* ITEMMDL_RUBY_TABLET */ + MDL_POTION_MAX, /* ITEMMDL_AMBER_TABLET */ + MDL_POTION_MAX, /* ITEMMDL_STONE_OF_TRIALS */ + MDL_POTION_MAX, /* ITEMMDL_BALLAD_OF_THE_GODDESS */ + MDL_POTION_MAX, /* ITEMMDL_FARORES_COURAGE */ + MDL_POTION_MAX, /* ITEMMDL_NAYRUS_WISDOM */ + MDL_POTION_MAX, /* ITEMMDL_DINS_POWER */ + MDL_POTION_MAX, /* ITEMMDL_FARON_SOTH */ + MDL_POTION_MAX, /* ITEMMDL_ELDIN_SOTH */ + MDL_POTION_MAX, /* ITEMMDL_LANAYRU_SOTH */ + MDL_POTION_MAX, /* ITEMMDL_ITEM_SOTH */ + MDL_POTION_MAX, /* ITEMMDL_REVITALIZING_POTION_PLUS_PLUS */ + MDL_POTION_MAX, /* ITEMMDL_HOT_SOUP */ + MDL_POTION_MAX, /* ITEMMDL_COLD_SOUP */ + MDL_POTION_MAX, /* ITEMMDL_LIFE_TREE_SEED */ + MDL_POTION_MAX, /* ITEMMDL_LIFE_TREE_FRUIT */ + MDL_POTION_MAX, /* ITEMMDL_EXTRA_WALLET */ +}; + +const dItemMdlPotion_c::MdlConfig dItemMdlPotion_c::sMdlConfig[] = { + {"GetBottleMuteki", "GetBottleMuteki", "GetBottleMuteki", "GetBottleMuteki"}, + { "GetBottleGuts", "GetBottleGuts", "GetBottleGuts", "GetBottleGuts"}, + { "GetBottleAir", "GetBottleAir", "GetBottleAir", "GetBottleAir"}, + { "GetGenki", "GetGenki", "GetGenki", "GetGenki"}, +}; + +bool dItemMdlPotion_c::isMdlForItemId(u16 itemId) { + if (hasItemMdl(itemId) == false) { + return false; + } else { + return sMdlIdx[getItemMdlIdx(itemId)] <= MDL_POTION_MAX - 1; + } +} + +bool dItemMdlPotion_c::init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) { + s32 mdlIdx = getItemMdlIdx(itemId); + u8 mdlConfigIdx = sMdlIdx[mdlIdx]; + + const MdlConfig *fileAndMdl = &sMdlConfig[mdlConfigIdx]; + + void *resData = OarcManager::GetInstance()->getMdlFromArc2(fileAndMdl->resFile); + if (resData == nullptr) { + return false; + } + nw4r::g3d::ResFile resFile(resData); + if (!resFile.IsValid()) { + return false; + } + + nw4r::g3d::ResMdl mdl = resFile.GetResMdl(fileAndMdl->mdlName); + if (!mdl.IsValid()) { + return false; + } + // TODO - what? This makes the function return true if model creation + // succeeds but the anmChr is invalid. + bool result = mMdl.create(mdl, allocator, 0x324); + if (!result) { + return false; + } + + nw4r::g3d::ResAnmChr anmChr = resFile.GetResAnmChr(fileAndMdl->anmChrName); + if (!anmChr.IsValid()) { + return result; + } + TRY_CREATE(mAnmChr.create2(mdl, anmChr, allocator)); + mAnmChr.setAnm(mMdl, anmChr, m3d::PLAY_MODE_0); + mMdl.setAnm(mAnmChr); + + nw4r::g3d::ResAnmTexSrt anmTexSrt = resFile.GetResAnmTexSrt(fileAndMdl->anmTexSrtName); + if (!anmTexSrt.IsValid()) { + return false; + } + TRY_CREATE(mAnmTexSrt.create(mdl, anmTexSrt, allocator, nullptr, 1)); + TRY_CREATE(mMdl.setAnm(mAnmTexSrt)); + + mpItem = item; + return true; +} + +void dItemMdlPotion_c::vt_0x10(u8 arg) { + field_0x14 = arg; +} + +void dItemMdlPotion_c::setScale(const mVec3_c &scale) { + mMdl.setScale(scale); +} + +void dItemMdlPotion_c::setLocalMtx(const mMtx_c &mtx) { + mMdl.setLocalMtx(mtx); +} + +void dItemMdlPotion_c::draw() { + mAnmChr.play(); + mAnmTexSrt.play(); + switch (field_0x14) { + case ITEM_MDL_UNK0x14_1: mpItem->fn_8002ECD0(&mMdl, 7); break; + case ITEM_MDL_UNK0x14_2: mpItem->fn_8002ECD0(&mMdl, 6); break; + } +} + +void dItemMdlPotion_c::vt_0x20() { + // no-op +} + +void dItemMdlPotion_c::setPriorityDraw() { + mMdl.setPriorityDraw(0x82, 0x7F); +} + +void dItemMdlPotion_c::unsetPriorityDraw() { + mMdl.setPriorityDraw(0x7F, 0x7F); +} + +m3d::smdl_c *dItemMdlPotion_c::getMdl() { + return &mMdl; +} diff --git a/src/toBeSorted/item_mdl_name.cpp b/src/toBeSorted/item_mdl_name.cpp new file mode 100644 index 00000000..a0b95f77 --- /dev/null +++ b/src/toBeSorted/item_mdl_name.cpp @@ -0,0 +1,528 @@ +#include "common.h" +#include "toBeSorted/item_mdl_name.h" + +static const u16 ITEM_TO_MODEL_INDEX[512] = { + ITEMMDL_MAX, /* ITEM_NONE */ + ITEMMDL_SMALL_KEY, /* ITEM_SMALL_KEY */ + ITEMMDL_GREEN_RUPEE, /* ITEM_GREEN_RUPEE */ + ITEMMDL_BLUE_RUPEE, /* ITEM_BLUE_RUPEE */ + ITEMMDL_RED_RUPEE, /* ITEM_RED_RUPEE */ + ITEMMDL_COMPLETE_TRIFORCE, /* ITEM_COMPLETE_TRIFORCE */ + ITEMMDL_HEART, /* ITEM_HEART */ + ITEMMDL_SINGLE_ARROW, /* ITEM_SINGLE_ARROW */ + ITEMMDL_BUNDLE_ARROWS, /* ITEM_BUNDLE_ARROWS */ + ITEMMDL_GODDESS_WHITESWORD, /* ITEM_GODDESS_WHITESWORD */ + ITEMMDL_PRACTICE_SWORD, /* ITEM_PRACTICE_SWORD */ + ITEMMDL_GODDESS_SWORD, /* ITEM_GODDESS_SWORD */ + ITEMMDL_GODDESS_LONGSWORD, /* ITEM_GODDESS_LONGSWORD */ + ITEMMDL_MASTER_SWORD, /* ITEM_MASTER_SWORD */ + ITEMMDL_TRUE_MASTER_SWORD, /* ITEM_TRUE_MASTER_SWORD */ + ITEMMDL_SAILCLOTH, /* ITEM_SAILCLOTH */ + ITEMMDL_GODDESS_HARP, /* ITEM_GODDESS_HARP */ + ITEMMDL_SPIRIT_VESSEL, /* ITEM_SPIRIT_VESSEL */ + ITEMMDL_MAX, /* ITEM_UNK_18 */ + ITEMMDL_BOW, /* ITEM_BOW */ + ITEMMDL_CLAWSHOWS, /* ITEM_CLAWSHOTS */ + ITEMMDL_BIRD_STATUETTE, /* ITEM_BIRD_STATUETTE */ + ITEMMDL_MAX, /* ITEM_COMMON_BUG */ + ITEMMDL_MAX, /* ITEM_UNCOMMON_BUG */ + ITEMMDL_MAX, /* ITEM_RARE_BUG */ + ITEMMDL_AC_BK, /* ITEM_AC_BK */ + ITEMMDL_FS_BK, /* ITEM_FS_BK */ + ITEMMDL_SSH_BK, /* ITEM_SSH_BK */ + ITEMMDL_KEY_PIECE, /* ITEM_KEY_PIECE */ + ITEMMDL_SV_BK, /* ITEM_SV_BK */ + ITEMMDL_ET_BK, /* ITEM_ET_BK */ + ITEMMDL_LMF_BK, /* ITEM_LMF_BK */ + ITEMMDL_SILVER_RUPEE, /* ITEM_SILVER_RUPEE */ + ITEMMDL_GOLD_RUPEE, /* ITEM_GOLD_RUPEE */ + ITEMMDL_RUPOOR, /* ITEM_RUPOOR */ + ITEMMDL_5_CRYSTALS, /* ITEM_5_CRYSTALS */ + ITEMMDL_GLITTERING_SPORES, /* ITEM_GLITTERING_SPORES */ + ITEMMDL_MAX, /* ITEM_UNK_37 */ + ITEMMDL_MAX, /* ITEM_UNK_38 */ + ITEMMDL_MAX, /* ITEM_UNK_39 */ + ITEMMDL_5_BOMBS, /* ITEM_5_BOMBS */ + ITEMMDL_10_BOMBS, /* ITEM_10_BOMBS */ + ITEMMDL_STAMINA_FRUIT, /* ITEM_STAMINA_FRUIT */ + ITEMMDL_FARORE_TEAR, /* ITEM_FARORE_TEAR */ + ITEMMDL_DIN_TEAR, /* ITEM_DIN_TEAR */ + ITEMMDL_NAYRU_TEAR, /* ITEM_NAYRU_TEAR */ + ITEMMDL_SACRED_TEAR, /* ITEM_SACRED_TEAR */ + ITEMMDL_LIGHT_FRUIT, /* ITEM_LIGHT_FRUIT */ + ITEMMDL_1_CRYSTAL, /* ITEM_1_CRYSTAL */ + ITEMMDL_GUST_BELLOWS, /* ITEM_GUST_BELLOWS */ + ITEMMDL_DUNGEON_MAP_FI, /* ITEM_DUNGEON_MAP_FI */ + ITEMMDL_DUNGEON_MAP, /* ITEM_DUNGEON_MAP */ + ITEMMDL_SLINGSHOT, /* ITEM_SLINGSHOT */ + ITEMMDL_BEETLE, /* ITEM_BEETLE */ + ITEMMDL_WATER, /* ITEM_WATER */ + ITEMMDL_MUSHROOM_SPORES, /* ITEM_MUSHROOM_SPORES */ + ITEMMDL_DIGGING_MITTS, /* ITEM_DIGGING_MITTS */ + ITEMMDL_5_DEKU_SEEDS, /* ITEM_5_DEKU_SEEDS */ + ITEMMDL_MAX, /* ITEM_UNK_58 */ + ITEMMDL_MAX, /* ITEM_UNK_59 */ + ITEMMDL_10_DEKU_SEEDS, /* ITEM_10_DEKU_SEEDS */ + ITEMMDL_MAX, /* ITEM_COMMON_TREASURE */ + ITEMMDL_MAX, /* ITEM_COMMON_TREASURE2 */ + ITEMMDL_MAX, /* ITEM_UNCOMMON_TREASURE */ + ITEMMDL_MAX, /* ITEM_RARE_TREASURE */ + ITEMMDL_GUARDIAN_POTION, /* ITEM_GUARDIAN_POTION */ + ITEMMDL_GUARDIAN_POTION_PLUS, /* ITEM_GUARDIAN_POTION_PLUS */ + ITEMMDL_MAX, /* ITEM_UNK_67 */ + ITEMMDL_WATER_SCALE, /* ITEM_WATER_SCALE */ + ITEMMDL_MAX, /* ITEM_UNK_69 */ + ITEMMDL_BUG_MEDAL, /* ITEM_BUG_MEDAL */ + ITEMMDL_BUG_NET, /* ITEM_BUG_NET */ + ITEMMDL_FAIRY, /* ITEM_FAIRY */ + ITEMMDL_MAX, /* ITEM_UNK_73 */ + ITEMMDL_SACRED_WATER, /* ITEM_SACRED_WATER */ + ITEMMDL_HOOK_BEETLE, /* ITEM_HOOK_BEETLE */ + ITEMMDL_QUICK_BEETLE, /* ITEM_QUICK_BEETLE */ + ITEMMDL_TOUGH_BEETLE, /* ITEM_TOUGH_BEETLE */ + ITEMMDL_HEART_POTION, /* ITEM_HEART_POTION */ + ITEMMDL_HEART_POTION_PLUS, /* ITEM_HEART_POTION_PLUS */ + ITEMMDL_MAX, /* ITEM_HEART_POTION_ALSO */ + ITEMMDL_HEART_POTION_ALSO_PLUS, /* ITEM_HEART_POTION_PLUS_PLUS */ + ITEMMDL_MAX, /* ITEM_UNK_82 */ + ITEMMDL_MAX, /* ITEM_GUARDIAN_POTION_NO_TBOX */ + ITEMMDL_STAMINA_POTION, /* ITEM_STAMINA_POTION */ + ITEMMDL_STAMINA_POTION_PLUS, /* ITEM_STAMINA_POTION_PLUS */ + ITEMMDL_AIR_POTION, /* ITEM_AIR_POTION */ + ITEMMDL_AIR_POTION_PLUS, /* ITEM_AIR_POTION_PLUS */ + ITEMMDL_BOTTLED_FAIRY, /* ITEM_BOTTLED_FAIRY */ + ITEMMDL_MAX, /* ITEM_UNK_89 */ + ITEMMDL_IRON_BOW, /* ITEM_IRON_BOW */ + ITEMMDL_SACRED_BOW, /* ITEM_SACRED_BOW */ + ITEMMDL_BOMB_BAG, /* ITEM_BOMB_BAG */ + ITEMMDL_HEART_CONTAINER, /* ITEM_HEART_CONTAINER */ + ITEMMDL_HEART_PIECE, /* ITEM_HEART_PIECE */ + ITEMMDL_TRI_COURAGE, /* ITEM_TRI_COURAGE */ + ITEMMDL_TRI_POWER, /* ITEM_TRI_POWER */ + ITEMMDL_TRI_WISDOWM, /* ITEM_TRI_WISDOM */ + ITEMMDL_SEA_CHART, /* ITEM_SEA_CHART */ + ITEMMDL_MOGMA_MITTS, /* ITEM_MOGMA_MITTS */ + ITEMMDL_HEART_MEDAL, /* ITEM_HEART_MEDAL */ + ITEMMDL_RUPEE_MEDAL, /* ITEM_RUPEE_MEDAL */ + ITEMMDL_TREASURE_MEDAL, /* ITEM_TREASURE_MEDAL */ + ITEMMDL_POTION_MEDAL, /* ITEM_POTION_MEDAL */ + ITEMMDL_CURSED_MEDAL, /* ITEM_CURSED_MEDAL */ + ITEMMDL_MIGHTY_SCATTERSHOT, /* ITEM_MIGHTY_SCATTERSHOT */ + ITEMMDL_MAX, /* ITEM_UNK_106 */ + ITEMMDL_85, /* ITEM_UNK_107 */ + ITEMMDL_MEDIUM_WALLET, /* ITEM_MEDIUM_WALLET */ + ITEMMDL_BIG_WALLET, /* ITEM_BIG_WALLET */ + ITEMMDL_GIANT_WALLET, /* ITEM_GIANT_WALLET */ + ITEMMDL_TYCOON_WALLET, /* ITEM_TYCOON_WALLET */ + ITEMMDL_ADVENTURE_POUCH, /* ITEM_ADVENTURE_POUCH */ + ITEMMDL_POUCH_EXPANSION, /* ITEM_POUCH_EXPANSION */ + ITEMMDL_LIFE_MEDAL, /* ITEM_LIFE_MEDAL */ + ITEMMDL_MAX, /* ITEM_UNK_115 */ + ITEMMDL_WOODEN_SHIELD, /* ITEM_WOODEN_SHIELD */ + ITEMMDL_BANDED_SHIELD, /* ITEM_BANDED_SHIELD */ + ITEMMDL_BRACED_SHIELD, /* ITEM_BRACED_SHIELD */ + ITEMMDL_IRON_SHIELD, /* ITEM_IRON_SHIELD */ + ITEMMDL_REINFORCED_SHIELD, /* ITEM_REINFORCED_SHIELD */ + ITEMMDL_FORTIFIED_SHIELD, /* ITEM_FORTIFIED_SHIELD */ + ITEMMDL_SACRED_SHIELD, /* ITEM_SACRED_SHIELD */ + ITEMMDL_DIVINE_SHIELD, /* ITEM_DIVINE_SHIELD */ + ITEMMDL_GODDESS_SHIELD, /* ITEM_GODDESS_SHIELD */ + ITEMMDL_HYLIAN_SHIELD, /* ITEM_HYLIAN_SHIELD */ + ITEMMDL_REVITALIZING_POTION, /* ITEM_REVITALIZING_POTION */ + ITEMMDL_REVITALIZING_POTION_PLUS, /* ITEM_REVITALIZING_POTION_PLUS */ + ITEMMDL_SMALL_SEED_SATCHEL, /* ITEM_SMALL_SEED_SATCHEL */ + ITEMMDL_MEDIUM_SEED_SATCHEL, /* ITEM_MEDIUM_SEED_SATCHEL */ + ITEMMDL_LARGE_SEED_SATCHEL, /* ITEM_LARGE_SEED_SATCHEL */ + ITEMMDL_SMALL_QUIVER, /* ITEM_SMALL_QUIVER */ + ITEMMDL_MEDIUM_QUIVER, /* ITEM_MEDIUM_QUIVER */ + ITEMMDL_LARGE_QUIVER, /* ITEM_LARGE_QUIVER */ + ITEMMDL_SMALL_BOMB_BAG, /* ITEM_SMALL_BOMB_BAG */ + ITEMMDL_MEDIUM_BOMB_BAG, /* ITEM_MEDIUM_BOMB_BAG */ + ITEMMDL_LARGE_BOMB_BAG, /* ITEM_LARGE_BOMB_BAG */ + ITEMMDL_WHIP, /* ITEM_WHIP */ + ITEMMDL_FIRESHIELD_EARRINGS, /* ITEM_FIRESHIELD_EARRINGS */ + ITEMMDL_MAX, /* ITEM_UNK_139 */ + ITEMMDL_BIG_BUG_NET, /* ITEM_BIG_BUG_NET */ + ITEMMDL_FARON_GRASSHOPPER, /* ITEM_FARON_GRASSHOPPER */ + ITEMMDL_WOODLAND_RHINO_BEETLE, /* ITEM_WOODLAND_RHINO_BEETLE */ + ITEMMDL_DEKU_HORNET, /* ITEM_DEKU_HORNET */ + ITEMMDL_SKYLOFT_MANTIS, /* ITEM_SKYLOFT_MANTIS */ + ITEMMDL_VOLCANIC_LADYBUG, /* ITEM_VOLCANIC_LADYBUG */ + ITEMMDL_BLESSED_BUTTERFLY, /* ITEM_BLESSED_BUTTERFLY */ + ITEMMDL_LANAYRU_ANT, /* ITEM_LANAYRU_ANT */ + ITEMMDL_SAND_CICADA, /* ITEM_SAND_CICADA */ + ITEMMDL_GERUDO_DRAGONFLY, /* ITEM_GERUDO_DRAGONFLY */ + ITEMMDL_ELDIN_ROLLER, /* ITEM_ELDIN_ROLLER */ + ITEMMDL_SKY_STAG_BEETLE, /* ITEM_SKY_STAG_BEETLE */ + ITEMMDL_STARRY_FIREFLY, /* ITEM_STARRY_FIREFLY */ + ITEMMDL_BOTTLE, /* ITEM_BOTTLE */ + ITEMMDL_MAX, /* ITEM_RUPEE_MEDAL_ALSO */ + ITEMMDL_MAX, /* ITEM_HEART_MEDAL_ALSO */ + ITEMMDL_MAX, /* ITEM_UNK_156 */ + ITEMMDL_MAX, /* ITEM_UNK_157 */ + ITEMMDL_CAWLIN_LETTER, /* ITEM_CAWLIN_LETTER */ + ITEMMDL_BEEDLE_INSECT_CAGE, /* ITEM_BEEDLE_INSECT_CAGE */ + ITEMMDL_RATTLE, /* ITEM_RATTLE */ + ITEMMDL_HORNET_LARVAE, /* ITEM_HORNET_LARVAE */ + ITEMMDL_BIRD_FEATHER, /* ITEM_BIRD_FEATHER */ + ITEMMDL_TUMBLE_WEED, /* ITEM_TUMBLE_WEED */ + ITEMMDL_LIZARD_TAIL, /* ITEM_LIZARD_TAIL */ + ITEMMDL_ELDIN_ORE, /* ITEM_ELDIN_ORE */ + ITEMMDL_ANCIENT_FLOWER, /* ITEM_ANCIENT_FLOWER */ + ITEMMDL_AMBER_RELIC, /* ITEM_AMBER_RELIC */ + ITEMMDL_DUSK_RELIC, /* ITEM_DUSK_RELIC */ + ITEMMDL_JELLY_BLOB, /* ITEM_JELLY_BLOB */ + ITEMMDL_MONSTER_CLAW, /* ITEM_MONSTER_CLAW */ + ITEMMDL_MONSTER_HORN, /* ITEM_MONSTER_HORN */ + ITEMMDL_ORNAMENTAL_SKULL, /* ITEM_ORNAMENTAL_SKULL */ + ITEMMDL_EVIL_CRYSTAL, /* ITEM_EVIL_CRYSTAL */ + ITEMMDL_BLUE_BIRD_FEATHER, /* ITEM_BLUE_BIRD_FEATHER */ + ITEMMDL_GOLDEN_SKULL, /* ITEM_GOLDEN_SKULL */ + ITEMMDL_GODDESS_PLUME, /* ITEM_GODDESS_PLUME */ + ITEMMDL_EMERALD_TABLET, /* ITEM_EMERALD_TABLET */ + ITEMMDL_RUBY_TABLET, /* ITEM_RUBY_TABLET */ + ITEMMDL_AMBER_TABLET, /* ITEM_AMBER_TABLET */ + ITEMMDL_STONE_OF_TRIALS, /* ITEM_STONE_OF_TRIALS */ + ITEMMDL_MAX, /* ITEM_UNK_181 */ + ITEMMDL_MAX, /* ITEM_UNK_182 */ + ITEMMDL_MAX, /* ITEM_UNK_183 */ + ITEMMDL_MAX, /* ITEM_UNK_184 */ + ITEMMDL_MAX, /* ITEM_UNK_185 */ + ITEMMDL_BALLAD_OF_THE_GODDESS, /* ITEM_BALLAD_OF_THE_GODDESS */ + ITEMMDL_FARORES_COURAGE, /* ITEM_FARORES_COURAGE */ + ITEMMDL_NAYRUS_WISDOM, /* ITEM_NAYRUS_WISDOM */ + ITEMMDL_DINS_POWER, /* ITEM_DINS_POWER */ + ITEMMDL_FARON_SOTH, /* ITEM_FARON_SOTH */ + ITEMMDL_ELDIN_SOTH, /* ITEM_ELDIN_SOTH */ + ITEMMDL_LANAYRU_SOTH, /* ITEM_LANAYRU_SOTH */ + ITEMMDL_ITEM_SOTH, /* ITEM_SOTH */ + ITEMMDL_REVITALIZING_POTION_PLUS_PLUS, /* ITEM_REVITALIZING_POTION_PLUS_PLUS */ + ITEMMDL_HOT_SOUP, /* ITEM_HOT_SOUP */ + ITEMMDL_COLD_SOUP, /* ITEM_COLD_SOUP */ + ITEMMDL_LIFE_TREE_SEED, /* ITEM_LIFE_TREE_SEED */ + ITEMMDL_LIFE_TREE_FRUIT, /* ITEM_LIFE_TREE_FRUIT */ + ITEMMDL_EXTRA_WALLET, /* ITEM_EXTRA_WALLET */ + ITEMMDL_MAX, /* ITEM_UNK_200 */ + ITEMMDL_MAX, /* ITEM_LIFE_MEDAL_AGAIN */ + ITEMMDL_MAX, /* ITEM_POUCH_EXPANSION_GODDESS_CHEST */ + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, + ITEMMDL_MAX, +}; + +bool hasItemMdl(u16 itemId) { + if (itemId >= ARRAY_LENGTH(ITEM_TO_MODEL_INDEX)) { + return false; + } + return ITEM_TO_MODEL_INDEX[itemId] <= ITEMMDL_MAX - 1; +} + +u16 getItemMdlIdx(u16 itemId) { + return ITEM_TO_MODEL_INDEX[itemId]; +} diff --git a/src/toBeSorted/mdl_base.cpp b/src/toBeSorted/mdl_base.cpp new file mode 100644 index 00000000..2c5ba98b --- /dev/null +++ b/src/toBeSorted/mdl_base.cpp @@ -0,0 +1,4 @@ +#include "toBeSorted/mdl_base.h" + +dMdl_c::dMdl_c() {} +dMdl_c::~dMdl_c() {} From dfb2e9048b3e1a6eeeebda7252dab98664d58576 Mon Sep 17 00:00:00 2001 From: robojumper Date: Thu, 30 Apr 2026 20:44:33 +0200 Subject: [PATCH 02/14] item_mdl_rupee OK --- config/SOUE01/splits.txt | 5 +- config/SOUE01/symbols.txt | 22 ++-- configure.py | 2 +- include/toBeSorted/item_mdl.h | 3 +- include/toBeSorted/item_mdl_misc.h | 13 ++- include/toBeSorted/item_mdl_rupee.h | 36 +++++++ src/toBeSorted/item_mdl_misc.cpp | 12 +-- src/toBeSorted/item_mdl_rupee.cpp | 159 ++++++++++++++++++++++++++++ 8 files changed, 224 insertions(+), 28 deletions(-) create mode 100644 include/toBeSorted/item_mdl_rupee.h create mode 100644 src/toBeSorted/item_mdl_rupee.cpp diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index cef69813..c3b2827a 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -1231,20 +1231,23 @@ toBeSorted/item_mdl_item.cpp: .text start:0x8016F9E0 end:0x8016FE20 align:16 .rodata start:0x804E9650 end:0x804E9A48 .data start:0x80528490 end:0x80528A68 - .sdata start:0x80572A28 end:0x80572AA0 + .sdata start:0x80572A28 end:0x80572A70 toBeSorted/item_mdl_rupee.cpp: .text start:0x8016FE20 end:0x80170414 align:16 .rodata start:0x804E9A48 end:0x804E9A80 .data start:0x80528A68 end:0x80528AB0 + .sdata start:0x80572A70 end:0x80572A78 toBeSorted/item_mdl_light_fruit.cpp: .text start:0x80170420 end:0x801708E4 align:16 .data start:0x80528AB0 end:0x80528AE0 + .sdata start:0x80572A78 end:0x80572A90 toBeSorted/item_mdl_stamina_fruit.cpp: .text start:0x801708F0 end:0x80170DA4 align:16 .data start:0x80528AE0 end:0x80528B20 + .sdata start:0x80572A90 end:0x80572AA0 toBeSorted/item_spawn.cpp: .text start:0x80170DB0 end:0x80171AA8 align:16 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index f8f5e681..688320b7 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -9532,16 +9532,16 @@ fn_8016FD80 = .text:0x8016FD80; // type:function size:0x10 fn_8016FD90 = .text:0x8016FD90; // type:function size:0x10 fn_8016FDA0 = .text:0x8016FDA0; // type:function size:0x8 fn_8016FDB0 = .text:0x8016FDB0; // type:function size:0x70 -hasItemRupeeModel = .text:0x8016FE20; // type:function size:0x4C -AcItemRupeeModel__init = .text:0x8016FE70; // type:function size:0x2C0 -fn_80170130 = .text:0x80170130; // type:function size:0x1C -fn_80170150 = .text:0x80170150; // type:function size:0x48 -fn_801701A0 = .text:0x801701A0; // type:function size:0x48 -AcItemRupeeModel__draw = .text:0x801701F0; // type:function size:0x40 -fn_80170230 = .text:0x80170230; // type:function size:0xAC -fn_801702E0 = .text:0x801702E0; // type:function size:0x48 -fn_80170330 = .text:0x80170330; // type:function size:0x48 -fn_80170380 = .text:0x80170380; // type:function size:0x94 +isMdlForItemId__15dItemMdlRupee_cFUs = .text:0x8016FE20; // type:function size:0x4C +init__15dItemMdlRupee_cFUsP9dAcItem_cP12mAllocator_c = .text:0x8016FE70; // type:function size:0x2C0 +vt_0x10__15dItemMdlRupee_cFUc = .text:0x80170130; // type:function size:0x1C +setScale__15dItemMdlRupee_cFRC7mVec3_c = .text:0x80170150; // type:function size:0x48 +setLocalMtx__15dItemMdlRupee_cFRC6mMtx_c = .text:0x801701A0; // type:function size:0x48 +draw__15dItemMdlRupee_cFv = .text:0x801701F0; // type:function size:0x40 +vt_0x20__15dItemMdlRupee_cFUs = .text:0x80170230; // type:function size:0xAC +setPriorityDraw__15dItemMdlRupee_cFv = .text:0x801702E0; // type:function size:0x48 +unsetPriorityDraw__15dItemMdlRupee_cFv = .text:0x80170330; // type:function size:0x48 +__dt__15dItemMdlRupee_cFv = .text:0x80170380; // type:function size:0x94 IsItemLightFruit = .text:0x80170420; // type:function size:0x10 fn_80170430 = .text:0x80170430; // type:function size:0x214 fn_80170650 = .text:0x80170650; // type:function size:0x1C @@ -35243,7 +35243,7 @@ lbl_80528A28 = .data:0x80528A28; // type:object size:0xE data:string ItemModel_vtable = .data:0x80528A38; // type:object size:0x30 lbl_80528A68 = .data:0x80528A68; // type:object size:0x9 data:string lbl_80528A74 = .data:0x80528A74; // type:object size:0x9 data:string -AcItemRupeeModel__vtable = .data:0x80528A80; // type:object size:0x30 +__vt__15dItemMdlRupee_c = .data:0x80528A80; // type:object size:0x30 LightFruitModel_vtable = .data:0x80528AB0; // type:object size:0x30 lbl_80528AE0 = .data:0x80528AE0; // type:object size:0xA data:string StaminaFruitModel_vtable = .data:0x80528AF0; // type:object size:0x30 diff --git a/configure.py b/configure.py index 69f9ef95..8db3ba6f 100644 --- a/configure.py +++ b/configure.py @@ -595,7 +595,7 @@ config.libs = [ Object(Matching, "toBeSorted/counters/extra_wallet_counter.cpp"), Object(Matching, "toBeSorted/item_mdl_misc.cpp"), Object(NonMatching, "toBeSorted/item_mdl_item.cpp"), - Object(NonMatching, "toBeSorted/item_mdl_rupee.cpp"), + Object(Matching, "toBeSorted/item_mdl_rupee.cpp"), Object(NonMatching, "toBeSorted/item_mdl_light_fruit.cpp"), Object(NonMatching, "toBeSorted/item_mdl_stamina_fruit.cpp"), Object(NonMatching, "toBeSorted/item_spawn.cpp"), # probably multiple files, see sdata2 diff --git a/include/toBeSorted/item_mdl.h b/include/toBeSorted/item_mdl.h index 5ed940d0..107f9980 100644 --- a/include/toBeSorted/item_mdl.h +++ b/include/toBeSorted/item_mdl.h @@ -1,7 +1,6 @@ #ifndef TOBESORTED_ITEM_MDL_H #define TOBESORTED_ITEM_MDL_H -#include "m/m3d/m_mdl.h" #include "m/m_allocator.h" #include "m/m_mtx.h" #include "m/m_vec.h" @@ -21,7 +20,7 @@ public: /* 0x14 */ virtual void setScale(const mVec3_c &scale) = 0; /* 0x18 */ virtual void setLocalMtx(const mMtx_c &mtx) = 0; /* 0x1C */ virtual void draw() = 0; - /* 0x20 */ virtual void vt_0x20() = 0; + /* 0x20 */ virtual void vt_0x20(u16 itemId) = 0; /* 0x24 */ virtual void setPriorityDraw() = 0; /* 0x28 */ virtual void unsetPriorityDraw() = 0; /* 0x2C */ virtual m3d::smdl_c *getMdl() { diff --git a/include/toBeSorted/item_mdl_misc.h b/include/toBeSorted/item_mdl_misc.h index e5178dab..0e0bc9dd 100644 --- a/include/toBeSorted/item_mdl_misc.h +++ b/include/toBeSorted/item_mdl_misc.h @@ -6,7 +6,6 @@ #include "m/m3d/m_anmmdl.h" #include "m/m3d/m_anmtexpat.h" #include "m/m3d/m_anmtexsrt.h" -#include "m/m3d/m_mdl.h" #include "m/m3d/m_smdl.h" #include "m/types_m.h" #include "toBeSorted/item_mdl.h" @@ -19,7 +18,7 @@ public: /* 0x14 */ virtual void setScale(const mVec3_c &scale) override; /* 0x18 */ virtual void setLocalMtx(const mMtx_c &mtx) override; /* 0x1C */ virtual void draw() override; - /* 0x20 */ virtual void vt_0x20() override; + /* 0x20 */ virtual void vt_0x20(u16 itemId) override; /* 0x24 */ virtual void setPriorityDraw() override; /* 0x28 */ virtual void unsetPriorityDraw() override; @@ -61,7 +60,7 @@ public: /* 0x14 */ virtual void setScale(const mVec3_c &scale) override; /* 0x18 */ virtual void setLocalMtx(const mMtx_c &mtx) override; /* 0x1C */ virtual void draw() override; - /* 0x20 */ virtual void vt_0x20() override; + /* 0x20 */ virtual void vt_0x20(u16 itemId) override; /* 0x24 */ virtual void setPriorityDraw() override; /* 0x28 */ virtual void unsetPriorityDraw() override; @@ -103,7 +102,7 @@ public: /* 0x14 */ virtual void setScale(const mVec3_c &scale) override; /* 0x18 */ virtual void setLocalMtx(const mMtx_c &mtx) override; /* 0x1C */ virtual void draw() override; - /* 0x20 */ virtual void vt_0x20() override; + /* 0x20 */ virtual void vt_0x20(u16 itemId) override; /* 0x24 */ virtual void setPriorityDraw() override; /* 0x28 */ virtual void unsetPriorityDraw() override; /* 0x2C */ virtual m3d::smdl_c *getMdl() override { @@ -145,7 +144,7 @@ public: /* 0x14 */ virtual void setScale(const mVec3_c &scale) override; /* 0x18 */ virtual void setLocalMtx(const mMtx_c &mtx) override; /* 0x1C */ virtual void draw() override; - /* 0x20 */ virtual void vt_0x20() override; + /* 0x20 */ virtual void vt_0x20(u16 itemId) override; /* 0x24 */ virtual void setPriorityDraw() override; /* 0x28 */ virtual void unsetPriorityDraw() override; @@ -174,7 +173,7 @@ public: /* 0x14 */ virtual void setScale(const mVec3_c &scale) override; /* 0x18 */ virtual void setLocalMtx(const mMtx_c &mtx) override; /* 0x1C */ virtual void draw() override; - /* 0x20 */ virtual void vt_0x20() override; + /* 0x20 */ virtual void vt_0x20(u16 itemId) override; /* 0x24 */ virtual void setPriorityDraw() override; /* 0x28 */ virtual void unsetPriorityDraw() override; /* 0x2C */ virtual m3d::smdl_c *getMdl() override; @@ -195,7 +194,7 @@ public: /* 0x14 */ virtual void setScale(const mVec3_c &scale) override; /* 0x18 */ virtual void setLocalMtx(const mMtx_c &mtx) override; /* 0x1C */ virtual void draw() override; - /* 0x20 */ virtual void vt_0x20() override; + /* 0x20 */ virtual void vt_0x20(u16 itemId) override; /* 0x24 */ virtual void setPriorityDraw() override; /* 0x28 */ virtual void unsetPriorityDraw() override; /* 0x2C */ virtual m3d::smdl_c *getMdl() override; diff --git a/include/toBeSorted/item_mdl_rupee.h b/include/toBeSorted/item_mdl_rupee.h new file mode 100644 index 00000000..41757072 --- /dev/null +++ b/include/toBeSorted/item_mdl_rupee.h @@ -0,0 +1,36 @@ +#ifndef TOBESORTED_ITEM_MDL_RUPEE_H +#define TOBESORTED_ITEM_MDL_RUPEE_H + +#include "m/m3d/m_anmtexpat.h" +#include "m/m3d/m_smdl.h" +#include "toBeSorted/item_mdl.h" + + +class dItemMdlRupee_c : public dItemMdl_c { +public: + /* 0x08 */ virtual ~dItemMdlRupee_c() {} + /* 0x0C */ virtual bool init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) override; + /* 0x10 */ virtual void vt_0x10(u8) override; + /* 0x14 */ virtual void setScale(const mVec3_c &scale) override; + /* 0x18 */ virtual void setLocalMtx(const mMtx_c &mtx) override; + /* 0x1C */ virtual void draw() override; + /* 0x20 */ virtual void vt_0x20(u16 itemId) override; + /* 0x24 */ virtual void setPriorityDraw() override; + /* 0x28 */ virtual void unsetPriorityDraw() override; + + static bool isMdlForItemId(u16 itemId); + +private: + struct MdlConfig { + u16 itemId; + f32 texPatFrame; + }; + static const MdlConfig sMdlConfig[]; + + /* 0x18 */ m3d::smdl_c mMdl1; + /* 0x34 */ m3d::smdl_c mMdl2; + /* 0x50 */ m3d::anmTexPat_c mAnmTexPat1; + /* 0x7C */ m3d::anmTexPat_c mAnmTexPat2; +}; + +#endif diff --git a/src/toBeSorted/item_mdl_misc.cpp b/src/toBeSorted/item_mdl_misc.cpp index d45bc536..97194a1f 100644 --- a/src/toBeSorted/item_mdl_misc.cpp +++ b/src/toBeSorted/item_mdl_misc.cpp @@ -275,7 +275,7 @@ void dItemMdlPut_c::draw() { } } -void dItemMdlPut_c::vt_0x20() { +void dItemMdlPut_c::vt_0x20(u16 itemId) { // no-op } @@ -539,7 +539,7 @@ void dItemMdlShield_c::draw() { } } -void dItemMdlShield_c::vt_0x20() { +void dItemMdlShield_c::vt_0x20(u16 itemId) { // no-op } @@ -795,7 +795,7 @@ void dItemMdlBottle_c::draw() { } } -void dItemMdlBottle_c::vt_0x20() { +void dItemMdlBottle_c::vt_0x20(u16 itemId) { // no-op } @@ -937,7 +937,7 @@ void dItemMdlTear_c::draw() { } } -void dItemMdlTear_c::vt_0x20() { +void dItemMdlTear_c::vt_0x20(u16 itemId) { // no-op } @@ -1005,7 +1005,7 @@ void dItemMdlFirefly_c::draw() { mAnmMatClr.play(); } -void dItemMdlFirefly_c::vt_0x20() { +void dItemMdlFirefly_c::vt_0x20(u16 itemId) { // no-op } @@ -1272,7 +1272,7 @@ void dItemMdlPotion_c::draw() { } } -void dItemMdlPotion_c::vt_0x20() { +void dItemMdlPotion_c::vt_0x20(u16 itemId) { // no-op } diff --git a/src/toBeSorted/item_mdl_rupee.cpp b/src/toBeSorted/item_mdl_rupee.cpp new file mode 100644 index 00000000..70da8be9 --- /dev/null +++ b/src/toBeSorted/item_mdl_rupee.cpp @@ -0,0 +1,159 @@ +#include "toBeSorted/item_mdl_rupee.h" + +#include "common.h" +#include "d/a/d_a_item.h" +#include "d/a/d_a_itembase.h" +#include "toBeSorted/arc_managers/oarc_manager.h" + +const dItemMdlRupee_c::MdlConfig dItemMdlRupee_c::sMdlConfig[] = { + { ITEM_GREEN_RUPEE, 0.0f}, + { ITEM_BLUE_RUPEE, 1.0f}, + { ITEM_RED_RUPEE, 2.0f}, + {ITEM_SILVER_RUPEE, 3.0f}, + { ITEM_GOLD_RUPEE, 4.0f}, + { ITEM_RUPOOR, 5.0f}, + { 0, 0.0f}, +}; + +bool dItemMdlRupee_c::isMdlForItemId(u16 itemId) { + // NON-DETERMINISTIC CODEGEN AAAAAAAAAAAAAAAAAAAAAA + return itemId == ITEM_GREEN_RUPEE || itemId == ITEM_BLUE_RUPEE || itemId == ITEM_RED_RUPEE || + itemId == ITEM_SILVER_RUPEE || itemId == ITEM_GOLD_RUPEE || itemId == ITEM_RUPOOR; +} + +bool dItemMdlRupee_c::init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) { + if (item == nullptr) { + return false; + } + + // no-op + int i = 0; + bool found = false; + while (!found && i < ARRAY_LENGTH(sMdlConfig)) { + if (itemId == sMdlConfig[i].itemId) { + found = true; + } else { + i++; + } + } + + if (!found) { + return false; + } + + { + void *resData1 = OarcManager::GetInstance()->getMdlFromArc2("PutRupee"); + if (resData1 == nullptr) { + return false; + } + nw4r::g3d::ResFile res1(resData1); + if (!res1.IsValid()) { + return false; + } + + nw4r::g3d::ResMdl mdl1 = res1.GetResMdl("PutRupee"); + if (!mdl1.IsValid()) { + return false; + } + if (!mMdl1.create(mdl1, allocator, 0x123)) { + return false; + } + + nw4r::g3d::ResAnmTexPat anmTexPat1 = res1.GetResAnmTexPat("Rupee"); + if (!anmTexPat1.IsValid()) { + return false; + } + if (!mAnmTexPat1.create(mdl1, anmTexPat1, allocator, nullptr, 1)) { + return false; + } + mMdl1.setAnm(mAnmTexPat1); + mAnmTexPat1.setFrame(sMdlConfig[i].texPatFrame, 0); + } + + { + void *resData2 = OarcManager::GetInstance()->getMdlFromArc2("GetRupee"); + if (resData2 == nullptr) { + return false; + } + nw4r::g3d::ResFile res2(resData2); + if (!res2.IsValid()) { + return false; + } + + nw4r::g3d::ResMdl mdl2 = res2.GetResMdl("GetRupee"); + if (!mdl2.IsValid()) { + return false; + } + if (!mMdl2.create(mdl2, allocator, 0x123)) { + return false; + } + + nw4r::g3d::ResAnmTexPat anmTexPat2 = res2.GetResAnmTexPat("Rupee"); + if (!anmTexPat2.IsValid()) { + return false; + } + anmTexPat2.Bind(res2); + if (!mAnmTexPat2.create(mdl2, anmTexPat2, allocator, nullptr, 1)) { + return false; + } + mMdl2.setAnm(mAnmTexPat2); + mAnmTexPat2.setFrame(sMdlConfig[i].texPatFrame, 0); + } + + + mpItem = item; + return true; +} + +void dItemMdlRupee_c::vt_0x10(u8 arg) { + if (arg == ITEM_MDL_UNK0x14_3) { + field_0x14 = ITEM_MDL_UNK0x14_1; + } else { + field_0x14 = arg; + } +} + +void dItemMdlRupee_c::setScale(const mVec3_c &scale) { + mMdl1.setScale(scale); + mMdl2.setScale(scale); +} + +void dItemMdlRupee_c::setLocalMtx(const mMtx_c &mtx) { + mMdl1.setLocalMtx(mtx); + mMdl2.setLocalMtx(mtx); +} + +void dItemMdlRupee_c::draw() { + switch (field_0x14) { + case ITEM_MDL_UNK0x14_1: mpItem->fn_8002ECD0(&mMdl1, 7); break; + case ITEM_MDL_UNK0x14_2: mpItem->fn_8002ECD0(&mMdl2, 6); break; + } +} + +void dItemMdlRupee_c::vt_0x20(u16 itemId) { + // no-op + int i = 0; + bool found = false; + while (!found && i < ARRAY_LENGTH(sMdlConfig)) { + if (itemId == sMdlConfig[i].itemId) { + found = true; + } else { + i++; + } + } + + if (found) { + mAnmTexPat1.setFrame(sMdlConfig[i].texPatFrame, 0); + mAnmTexPat2.setFrame(sMdlConfig[i].texPatFrame, 0); + } +} + +void dItemMdlRupee_c::setPriorityDraw() { + mMdl1.setPriorityDraw(0x82, 0x7F); + mMdl2.setPriorityDraw(0x82, 0x7F); +} + +void dItemMdlRupee_c::unsetPriorityDraw() { + mMdl1.setPriorityDraw(0x7F, 0x7F); + mMdl2.setPriorityDraw(0x7F, 0x7F); +} From 0146842436b0a9217c013ad61ab206b9854bc0c8 Mon Sep 17 00:00:00 2001 From: robojumper Date: Thu, 30 Apr 2026 22:38:49 +0200 Subject: [PATCH 03/14] item_mdl_item OK --- config/SOUE01/symbols.txt | 31 +- configure.py | 2 +- include/d/a/d_a_item.h | 3 +- include/toBeSorted/item_mdl_item.h | 34 ++ include/toBeSorted/item_mdl_misc.h | 47 --- include/toBeSorted/item_mdl_name.h | 2 +- src/toBeSorted/item_mdl_item.cpp | 483 +++++++++++++++++++++++++++++ src/toBeSorted/item_mdl_misc.cpp | 55 +++- src/toBeSorted/item_mdl_name.cpp | 2 +- 9 files changed, 589 insertions(+), 70 deletions(-) create mode 100644 include/toBeSorted/item_mdl_item.h create mode 100644 src/toBeSorted/item_mdl_item.cpp diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 688320b7..8fb46bc8 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -9522,16 +9522,17 @@ getMdl__16dItemMdlBottle_cFv = .text:0x8016F860; // type:function size:0x8 scope __dt__16dItemMdlBottle_cFv = .text:0x8016F870; // type:function size:0x70 scope:weak __dt__16dItemMdlShield_cFv = .text:0x8016F8E0; // type:function size:0x7C scope:weak __dt__13dItemMdlPut_cFv = .text:0x8016F960; // type:function size:0x7C scope:weak -hasItemModel = .text:0x8016F9E0; // type:function size:0x6C -getItemModelForItem = .text:0x8016FA50; // type:function size:0x2C0 -fn_8016FD10 = .text:0x8016FD10; // type:function size:0x8 -fn_8016FD20 = .text:0x8016FD20; // type:function size:0x8 -fn_8016FD30 = .text:0x8016FD30; // type:function size:0x8 -fn_8016FD40 = .text:0x8016FD40; // type:function size:0x34 -fn_8016FD80 = .text:0x8016FD80; // type:function size:0x10 -fn_8016FD90 = .text:0x8016FD90; // type:function size:0x10 -fn_8016FDA0 = .text:0x8016FDA0; // type:function size:0x8 -fn_8016FDB0 = .text:0x8016FDB0; // type:function size:0x70 +isMdlForItemId__14dItemMdlItem_cFUs = .text:0x8016F9E0; // type:function size:0x6C +init__14dItemMdlItem_cFUsP9dAcItem_cP12mAllocator_c = .text:0x8016FA50; // type:function size:0x2C0 +vt_0x10__14dItemMdlItem_cFUc = .text:0x8016FD10; // type:function size:0x8 +setScale__14dItemMdlItem_cFRC7mVec3_c = .text:0x8016FD20; // type:function size:0x8 +setLocalMtx__14dItemMdlItem_cFRC6mMtx_c = .text:0x8016FD30; // type:function size:0x8 +draw__14dItemMdlItem_cFv = .text:0x8016FD40; // type:function size:0x30 +vt_0x20__14dItemMdlItem_cFUs = .text:0x8016FD70; // type:function size:0x4 +setPriorityDraw__14dItemMdlItem_cFv = .text:0x8016FD80; // type:function size:0x10 +unsetPriorityDraw__14dItemMdlItem_cFv = .text:0x8016FD90; // type:function size:0x10 +getMdl__14dItemMdlItem_cFv = .text:0x8016FDA0; // type:function size:0x8 +__dt__14dItemMdlItem_cFv = .text:0x8016FDB0; // type:function size:0x70 isMdlForItemId__15dItemMdlRupee_cFUs = .text:0x8016FE20; // type:function size:0x4C init__15dItemMdlRupee_cFUsP9dAcItem_cP12mAllocator_c = .text:0x8016FE70; // type:function size:0x2C0 vt_0x10__15dItemMdlRupee_cFUc = .text:0x80170130; // type:function size:0x1C @@ -13469,7 +13470,7 @@ AcItem__isNaryruTear = .text:0x80250A20; // type:function size:0x10 AcItem__isSacredTear = .text:0x80250A30; // type:function size:0x10 isItemLightFruit = .text:0x80250A40; // type:function size:0x10 isSingleGratitudeCrystal = .text:0x80250A50; // type:function size:0x10 -isItemSligshot = .text:0x80250A60; // type:function size:0x10 +isSlingshot__9dAcItem_cF7ITEM_ID = .text:0x80250A60; // type:function size:0x10 is10DekuSeeds = .text:0x80250A70; // type:function size:0x10 AcItem__isHeartPiece = .text:0x80250A80; // type:function size:0x10 AcItem__isDekuHornet = .text:0x80250A90; // type:function size:0x10 @@ -13646,7 +13647,7 @@ ActorLink__hasLifeTreeSeeding = .text:0x80252730; // type:function size:0x38 AcItem__giveLifeTreeSeedling = .text:0x80252770; // type:function size:0x94 getExtraWalletCount__9dAcItem_cFv = .text:0x80252810; // type:function size:0x8 increaseExtraWalletCounter = .text:0x80252820; // type:function size:0xC -getTotalRequiredKeyPieceCount = .text:0x80252830; // type:function size:0x8 +getTotalRequiredKeyPieceCount__9dAcItem_cFv = .text:0x80252830; // type:function size:0x8 hasAllKeyPieces = .text:0x80252840; // type:function size:0x44 AcItem__getDefaultOffset = .text:0x80252890; // type:function size:0xC is4 = .text:0x802528A0; // type:function size:0x8 @@ -28363,8 +28364,8 @@ sMdlConfig__16dItemMdlBottle_c = .rodata:0x804E94F8; // type:object size:0x60 sMdlConfig__14dItemMdlTear_c = .rodata:0x804E9558; // type:object size:0x10 sMdlIdx__16dItemMdlPotion_c = .rodata:0x804E9568; // type:object size:0xA7 sMdlConfig__16dItemMdlPotion_c = .rodata:0x804E9610; // type:object size:0x40 -ITEM_MODEL_INDEX = .rodata:0x804E9650; // type:object size:0xA8 -ITEM_MODEL_DEFS = .rodata:0x804E96F8; // type:object size:0x350 +sMdlIdx__14dItemMdlItem_c = .rodata:0x804E9650; // type:object size:0xA8 +sMdlConfig__14dItemMdlItem_c = .rodata:0x804E96F8; // type:object size:0x350 RUPEE_ITEM_TO_TEX_FRAME = .rodata:0x804E9A48; // type:object size:0x38 data:2byte sEffectResourceIds = .rodata:0x804E9A80; // type:object size:0x18 data:2byte lbl_804E9A98 = .rodata:0x804E9A98; // type:object size:0xF data:string @@ -35240,7 +35241,7 @@ lbl_805289FC = .data:0x805289FC; // type:object size:0xA data:string lbl_80528A08 = .data:0x80528A08; // type:object size:0xE data:string lbl_80528A18 = .data:0x80528A18; // type:object size:0xE data:string lbl_80528A28 = .data:0x80528A28; // type:object size:0xE data:string -ItemModel_vtable = .data:0x80528A38; // type:object size:0x30 +__vt__14dItemMdlItem_c = .data:0x80528A38; // type:object size:0x30 lbl_80528A68 = .data:0x80528A68; // type:object size:0x9 data:string lbl_80528A74 = .data:0x80528A74; // type:object size:0x9 data:string __vt__15dItemMdlRupee_c = .data:0x80528A80; // type:object size:0x30 diff --git a/configure.py b/configure.py index 8db3ba6f..47ababb1 100644 --- a/configure.py +++ b/configure.py @@ -594,7 +594,7 @@ config.libs = [ Object(Matching, "toBeSorted/counters/key_piece_counter.cpp"), Object(Matching, "toBeSorted/counters/extra_wallet_counter.cpp"), Object(Matching, "toBeSorted/item_mdl_misc.cpp"), - Object(NonMatching, "toBeSorted/item_mdl_item.cpp"), + Object(Matching, "toBeSorted/item_mdl_item.cpp"), Object(Matching, "toBeSorted/item_mdl_rupee.cpp"), Object(NonMatching, "toBeSorted/item_mdl_light_fruit.cpp"), Object(NonMatching, "toBeSorted/item_mdl_stamina_fruit.cpp"), diff --git a/include/d/a/d_a_item.h b/include/d/a/d_a_item.h index fa07912b..cdaa3115 100644 --- a/include/d/a/d_a_item.h +++ b/include/d/a/d_a_item.h @@ -75,12 +75,13 @@ public: static u32 getHeartContainerHealthCount(); static u32 getGratitudeCrystalCount(); + static u32 getTotalRequiredKeyPieceCount(); static u32 getKeyPieceCount(); static u32 getSmallKeyCount(); static bool isJellyBlob(ITEM_ID item); static bool isStarryFirefly(ITEM_ID item); - + static bool isSlingshot(ITEM_ID item); static bool isRupee(ITEM_ID item); static bool isKeyPiece(ITEM_ID item); static bool isTreasure(ITEM_ID item); diff --git a/include/toBeSorted/item_mdl_item.h b/include/toBeSorted/item_mdl_item.h new file mode 100644 index 00000000..d2dbbfd1 --- /dev/null +++ b/include/toBeSorted/item_mdl_item.h @@ -0,0 +1,34 @@ +#ifndef TOBESORTED_ITEM_MDL_ITEM_H +#define TOBESORTED_ITEM_MDL_ITEM_H + +#include "m/m3d/m_smdl.h" +#include "toBeSorted/item_mdl.h" + + +class dItemMdlItem_c : public dItemMdl_c { +public: + /* 0x08 */ virtual ~dItemMdlItem_c() {} + /* 0x0C */ virtual bool init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) override; + /* 0x10 */ virtual void vt_0x10(u8) override; + /* 0x14 */ virtual void setScale(const mVec3_c &scale) override; + /* 0x18 */ virtual void setLocalMtx(const mMtx_c &mtx) override; + /* 0x1C */ virtual void draw() override; + /* 0x20 */ virtual void vt_0x20(u16 itemId) override; + /* 0x24 */ virtual void setPriorityDraw() override; + /* 0x28 */ virtual void unsetPriorityDraw() override; + /* 0x2C */ virtual m3d::smdl_c *getMdl() override; + + static bool isMdlForItemId(u16 itemId); + +private: + struct MdlConfig { + const char *resFile; + const char *mdlName; + }; + static const MdlConfig sMdlConfig[]; + static const u8 sMdlIdx[]; + + /* 0x18 */ m3d::smdl_c mMdl; +}; + +#endif diff --git a/include/toBeSorted/item_mdl_misc.h b/include/toBeSorted/item_mdl_misc.h index 0e0bc9dd..a595fbcb 100644 --- a/include/toBeSorted/item_mdl_misc.h +++ b/include/toBeSorted/item_mdl_misc.h @@ -25,20 +25,6 @@ public: static bool isMdlForItemId(u16 itemId); private: - enum MdlIdx { - MDL_PUT_ARROW, - MDL_PUT_ARROW_BUNDLE, - MDL_PUT_HEART, - MDL_PUT_KEY_SMALL, - MDL_PUT_BOMB_SET, - MDL_PUT_SEED, - MDL_PUT_HEART_UTUWA, - MDL_PUT_HEART_KAKERA, - MDL_PUT_TRI_FORCE, - MDL_PUT_GARAGARA, - MDL_PUT_MAX, - }; - struct MdlConfig { const char *putResFile; const char *putResMdl; @@ -67,19 +53,6 @@ public: static bool isMdlForItemId(u16 itemId); private: - enum ShieldIdx { - MDL_SHIELD_WOOD_0, - MDL_SHIELD_WOOD_1, - MDL_SHIELD_WOOD_2, - MDL_SHIELD_IRON_0, - MDL_SHIELD_IRON_1, - MDL_SHIELD_IRON_2, - MDL_SHIELD_HOLY_0, - MDL_SHIELD_HOLY_1, - MDL_SHIELD_HOLY_2, - MDL_SHIELD_MAX - }; - struct MdlConfig { f32 frame; const char *resFile; @@ -112,18 +85,6 @@ public: static bool isMdlForItemId(u16 itemId); private: - enum BottleIdx { - MDL_BOTTLE_WATER, - MDL_BOTTLE_FAIRY, - MDL_BOTTLE_HOLY, - MDL_BOTTLE_KUSURI, - MDL_BOTTLE_KUSURI_S, - MDL_BOTTLE_B_FAIRY, - MDL_BOTTLE_SOZAI_I, - MDL_BOTTLE_PUMPKIN, - MDL_BOTTLE_MAX - }; - struct MdlConfig { const char *resFile; const char *mdlName; @@ -202,14 +163,6 @@ public: static bool isMdlForItemId(u16 itemId); private: - enum PotionIdx { - MDL_POTION_MUTEKI, - MDL_POTION_GUTS, - MDL_POTION_AIR, - MDL_POTION_GENKI, - MDL_POTION_MAX, - }; - struct MdlConfig { const char *resFile; const char *mdlName; diff --git a/include/toBeSorted/item_mdl_name.h b/include/toBeSorted/item_mdl_name.h index 8d678dd0..bf01f59d 100644 --- a/include/toBeSorted/item_mdl_name.h +++ b/include/toBeSorted/item_mdl_name.h @@ -25,7 +25,7 @@ enum ItemMdlIdx { ITEMMDL_GODDESS_HARP, ITEMMDL_SPIRIT_VESSEL, ITEMMDL_BOW, - ITEMMDL_CLAWSHOWS, + ITEMMDL_CLAWSHOTS, ITEMMDL_BIRD_STATUETTE, ITEMMDL_AC_BK, ITEMMDL_FS_BK, diff --git a/src/toBeSorted/item_mdl_item.cpp b/src/toBeSorted/item_mdl_item.cpp new file mode 100644 index 00000000..db8d7dd4 --- /dev/null +++ b/src/toBeSorted/item_mdl_item.cpp @@ -0,0 +1,483 @@ +#include "toBeSorted/item_mdl_item.h" + +#include "common.h" +#include "d/a/d_a_item.h" +#include "d/a/d_a_itembase.h" +#include "sized_string.h" +#include "toBeSorted/arc_managers/oarc_manager.h" +#include "toBeSorted/item_mdl_name.h" + +enum ItemIdx { + MDL_ITEM_COMPLETE_TRIFORCE, + MDL_ITEM_GODDESS_WHITESWORD, + MDL_ITEM_PRACTICE_SWORD, + MDL_ITEM_GODDESS_SWORD, + MDL_ITEM_GODDESS_LONGSWORD, + MDL_ITEM_MASTER_SWORD, + MDL_ITEM_TRUE_MASTER_SWORD, + MDL_ITEM_SAILCLOTH, + MDL_ITEM_GODDESS_HARP, + MDL_ITEM_SPIRIT_VESSEL, + MDL_ITEM_BOW, + MDL_ITEM_CLAWSHOTS, + MDL_ITEM_BIRD_STATUETTE, + MDL_ITEM_AC_BK, + MDL_ITEM_FS_BK, + MDL_ITEM_SSH_BK, + MDL_ITEM_KEY_PIECE, + MDL_ITEM_SV_BK, + MDL_ITEM_ET_BK, + MDL_ITEM_LMF_BK, + MDL_ITEM_GLITTERING_SPORES, + MDL_ITEM_5_BOMBS, + MDL_ITEM_GUST_BELLOWS, + MDL_ITEM_DUNGEON_MAP, + MDL_ITEM_SLINGSHOT, + MDL_ITEM_BEETLE, + MDL_ITEM_MUSHROOM_SPORES, + MDL_ITEM_DIGGING_MITTS, + MDL_ITEM_28, // unused + MDL_ITEM_10_DEKU_SEEDS, + MDL_ITEM_WATER_SCALE, + MDL_ITEM_BUG_MEDAL, + MDL_ITEM_BUG_NET, + MDL_ITEM_HOOK_BEETLE, + MDL_ITEM_QUICK_BEETLE, + MDL_ITEM_TOUGH_BEETLE, + MDL_ITEM_IRON_BOW, + MDL_ITEM_SACRED_BOW, + MDL_ITEM_BOMB_BAG, + MDL_ITEM_SEA_CHART, + MDL_ITEM_MOGMA_MITTS, + MDL_ITEM_HEART_MEDAL, + MDL_ITEM_RUPEE_MEDAL, + MDL_ITEM_TREASURE_MEDAL, + MDL_ITEM_POTION_MEDAL, + MDL_ITEM_CURSED_MEDAL, + MDL_ITEM_MIGHTY_SCATTERSHOT, + MDL_ITEM_47, + MDL_ITEM_MEDIUM_WALLET, + MDL_ITEM_BIG_WALLET, + MDL_ITEM_GIANT_WALLET, + MDL_ITEM_TYCOON_WALLET, + MDL_ITEM_ADVENTURE_POUCH, + MDL_ITEM_POUCH_EXPANSION, + MDL_ITEM_LIFE_MEDAL, + MDL_ITEM_HYLIAN_SHIELD, + MDL_ITEM_REVITALIZING_POTION, + MDL_ITEM_SMALL_SEED_SATCHEL, + MDL_ITEM_MEDIUM_SEED_SATCHEL, + MDL_ITEM_LARGE_SEED_SATCHEL, + MDL_ITEM_SMALL_QUIVER, + MDL_ITEM_MEDIUM_QUIVER, + MDL_ITEM_LARGE_QUIVER, + MDL_ITEM_SMALL_BOMB_BAG, + MDL_ITEM_MEDIUM_BOMB_BAG, + MDL_ITEM_LARGE_BOMB_BAG, + MDL_ITEM_WHIP, + MDL_ITEM_FIRESHIELD_EARRINGS, + MDL_ITEM_BIG_BUG_NET, + MDL_ITEM_FARON_GRASSHOPPER, + MDL_ITEM_WOODLAND_RHINO_BEETLE, + MDL_ITEM_DEKU_HORNET, + MDL_ITEM_SKYLOFT_MANTIS, + MDL_ITEM_VOLCANIC_LADYBUG, + MDL_ITEM_BLESSED_BUTTERFLY, + MDL_ITEM_LANAYRU_ANT, + MDL_ITEM_SAND_CICADA, + MDL_ITEM_GERUDO_DRAGONFLY, + MDL_ITEM_ELDIN_ROLLER, + MDL_ITEM_SKY_STAG_BEETLE, + MDL_ITEM_BOTTLE, + MDL_ITEM_CAWLIN_LETTER, + MDL_ITEM_BEEDLE_INSECT_CAGE, + MDL_ITEM_HORNET_LARVAE, + MDL_ITEM_BIRD_FEATHER, + MDL_ITEM_TUMBLE_WEED, + MDL_ITEM_LIZARD_TAIL, + MDL_ITEM_ELDIN_ORE, + MDL_ITEM_ANCIENT_FLOWER, + MDL_ITEM_AMBER_RELIC, + MDL_ITEM_DUSK_RELIC, + MDL_ITEM_MONSTER_CLAW, + MDL_ITEM_MONSTER_HORN, + MDL_ITEM_ORNAMENTAL_SKULL, + MDL_ITEM_EVIL_CRYSTAL, + MDL_ITEM_BLUE_BIRD_FEATHER, + MDL_ITEM_GOLDEN_SKULL, + MDL_ITEM_GODDESS_PLUME, + MDL_ITEM_EMERALD_TABLET, + MDL_ITEM_RUBY_TABLET, + MDL_ITEM_AMBER_TABLET, + MDL_ITEM_STONE_OF_TRIALS, + MDL_ITEM_REVITALIZING_POTION_PLUS_PLUS, + MDL_ITEM_LIFE_TREE_SEED, + MDL_ITEM_LIFE_TREE_FRUIT, + MDL_ITEM_EXTRA_WALLET, + MDL_ITEM_MAX = 106, +}; + +const u8 dItemMdlItem_c::sMdlIdx[] = { + MDL_ITEM_MAX, /* ITEMMDL_SMALL_KEY */ + MDL_ITEM_MAX, /* ITEMMDL_GREEN_RUPEE */ + MDL_ITEM_MAX, /* ITEMMDL_BLUE_RUPEE */ + MDL_ITEM_MAX, /* ITEMMDL_RED_RUPEE */ + MDL_ITEM_COMPLETE_TRIFORCE, /* ITEMMDL_COMPLETE_TRIFORCE */ + MDL_ITEM_MAX, /* ITEMMDL_HEART */ + MDL_ITEM_MAX, /* ITEMMDL_SINGLE_ARROW */ + MDL_ITEM_MAX, /* ITEMMDL_BUNDLE_ARROWS */ + MDL_ITEM_GODDESS_WHITESWORD, /* ITEMMDL_GODDESS_WHITESWORD */ + MDL_ITEM_PRACTICE_SWORD, /* ITEMMDL_PRACTICE_SWORD */ + MDL_ITEM_GODDESS_SWORD, /* ITEMMDL_GODDESS_SWORD */ + MDL_ITEM_GODDESS_LONGSWORD, /* ITEMMDL_GODDESS_LONGSWORD */ + MDL_ITEM_MASTER_SWORD, /* ITEMMDL_MASTER_SWORD */ + MDL_ITEM_TRUE_MASTER_SWORD, /* ITEMMDL_TRUE_MASTER_SWORD */ + MDL_ITEM_SAILCLOTH, /* ITEMMDL_SAILCLOTH */ + MDL_ITEM_GODDESS_HARP, /* ITEMMDL_GODDESS_HARP */ + MDL_ITEM_SPIRIT_VESSEL, /* ITEMMDL_SPIRIT_VESSEL */ + MDL_ITEM_BOW, /* ITEMMDL_BOW */ + MDL_ITEM_CLAWSHOTS, /* ITEMMDL_CLAWSHOTS */ + MDL_ITEM_BIRD_STATUETTE, /* ITEMMDL_BIRD_STATUETTE */ + MDL_ITEM_AC_BK, /* ITEMMDL_AC_BK */ + MDL_ITEM_FS_BK, /* ITEMMDL_FS_BK */ + MDL_ITEM_SSH_BK, /* ITEMMDL_SSH_BK */ + MDL_ITEM_KEY_PIECE, /* ITEMMDL_KEY_PIECE */ + MDL_ITEM_SV_BK, /* ITEMMDL_SV_BK */ + MDL_ITEM_ET_BK, /* ITEMMDL_ET_BK */ + MDL_ITEM_LMF_BK, /* ITEMMDL_LMF_BK */ + MDL_ITEM_MAX, /* ITEMMDL_SILVER_RUPEE */ + MDL_ITEM_MAX, /* ITEMMDL_GOLD_RUPEE */ + MDL_ITEM_MAX, /* ITEMMDL_RUPOOR */ + MDL_ITEM_MAX, /* ITEMMDL_5_CRYSTALS */ + MDL_ITEM_GLITTERING_SPORES, /* ITEMMDL_GLITTERING_SPORES */ + MDL_ITEM_5_BOMBS, /* ITEMMDL_5_BOMBS */ + MDL_ITEM_MAX, /* ITEMMDL_10_BOMBS */ + MDL_ITEM_MAX, /* ITEMMDL_STAMINA_FRUIT */ + MDL_ITEM_MAX, /* ITEMMDL_FARORE_TEAR */ + MDL_ITEM_MAX, /* ITEMMDL_DIN_TEAR */ + MDL_ITEM_MAX, /* ITEMMDL_NAYRU_TEAR */ + MDL_ITEM_MAX, /* ITEMMDL_SACRED_TEAR */ + MDL_ITEM_MAX, /* ITEMMDL_LIGHT_FRUIT */ + MDL_ITEM_MAX, /* ITEMMDL_1_CRYSTAL */ + MDL_ITEM_GUST_BELLOWS, /* ITEMMDL_GUST_BELLOWS */ + MDL_ITEM_DUNGEON_MAP, /* ITEMMDL_DUNGEON_MAP_FI */ + MDL_ITEM_DUNGEON_MAP, /* ITEMMDL_DUNGEON_MAP */ + MDL_ITEM_SLINGSHOT, /* ITEMMDL_SLINGSHOT */ + MDL_ITEM_BEETLE, /* ITEMMDL_BEETLE */ + MDL_ITEM_MAX, /* ITEMMDL_WATER */ + MDL_ITEM_MUSHROOM_SPORES, /* ITEMMDL_MUSHROOM_SPORES */ + MDL_ITEM_DIGGING_MITTS, /* ITEMMDL_DIGGING_MITTS */ + MDL_ITEM_MAX, /* ITEMMDL_5_DEKU_SEEDS */ + MDL_ITEM_10_DEKU_SEEDS, /* ITEMMDL_10_DEKU_SEEDS */ + MDL_ITEM_MAX, /* ITEMMDL_GUARDIAN_POTION */ + MDL_ITEM_MAX, /* ITEMMDL_GUARDIAN_POTION_PLUS */ + MDL_ITEM_WATER_SCALE, /* ITEMMDL_WATER_SCALE */ + MDL_ITEM_BUG_MEDAL, /* ITEMMDL_BUG_MEDAL */ + MDL_ITEM_BUG_NET, /* ITEMMDL_BUG_NET */ + MDL_ITEM_MAX, /* ITEMMDL_FAIRY */ + MDL_ITEM_MAX, /* ITEMMDL_SACRED_WATER */ + MDL_ITEM_HOOK_BEETLE, /* ITEMMDL_HOOK_BEETLE */ + MDL_ITEM_QUICK_BEETLE, /* ITEMMDL_QUICK_BEETLE */ + MDL_ITEM_TOUGH_BEETLE, /* ITEMMDL_TOUGH_BEETLE */ + MDL_ITEM_MAX, /* ITEMMDL_HEART_POTION */ + MDL_ITEM_MAX, /* ITEMMDL_HEART_POTION_PLUS */ + MDL_ITEM_MAX, /* ITEMMDL_HEART_POTION_ALSO_PLUS */ + MDL_ITEM_MAX, /* ITEMMDL_STAMINA_POTION */ + MDL_ITEM_MAX, /* ITEMMDL_STAMINA_POTION_PLUS */ + MDL_ITEM_MAX, /* ITEMMDL_AIR_POTION */ + MDL_ITEM_MAX, /* ITEMMDL_AIR_POTION_PLUS */ + MDL_ITEM_MAX, /* ITEMMDL_BOTTLED_FAIRY */ + MDL_ITEM_IRON_BOW, /* ITEMMDL_IRON_BOW */ + MDL_ITEM_SACRED_BOW, /* ITEMMDL_SACRED_BOW */ + MDL_ITEM_BOMB_BAG, /* ITEMMDL_BOMB_BAG */ + MDL_ITEM_MAX, /* ITEMMDL_HEART_CONTAINER */ + MDL_ITEM_MAX, /* ITEMMDL_HEART_PIECE */ + MDL_ITEM_MAX, /* ITEMMDL_TRI_COURAGE */ + MDL_ITEM_MAX, /* ITEMMDL_TRI_POWER */ + MDL_ITEM_MAX, /* ITEMMDL_TRI_WISDOWM */ + MDL_ITEM_SEA_CHART, /* ITEMMDL_SEA_CHART */ + MDL_ITEM_MOGMA_MITTS, /* ITEMMDL_MOGMA_MITTS */ + MDL_ITEM_HEART_MEDAL, /* ITEMMDL_HEART_MEDAL */ + MDL_ITEM_RUPEE_MEDAL, /* ITEMMDL_RUPEE_MEDAL */ + MDL_ITEM_TREASURE_MEDAL, /* ITEMMDL_TREASURE_MEDAL */ + MDL_ITEM_POTION_MEDAL, /* ITEMMDL_POTION_MEDAL */ + MDL_ITEM_CURSED_MEDAL, /* ITEMMDL_CURSED_MEDAL */ + MDL_ITEM_MIGHTY_SCATTERSHOT, /* ITEMMDL_MIGHTY_SCATTERSHOT */ + MDL_ITEM_47, /* ITEMMDL_85 */ + MDL_ITEM_MEDIUM_WALLET, /* ITEMMDL_MEDIUM_WALLET */ + MDL_ITEM_BIG_WALLET, /* ITEMMDL_BIG_WALLET */ + MDL_ITEM_GIANT_WALLET, /* ITEMMDL_GIANT_WALLET */ + MDL_ITEM_TYCOON_WALLET, /* ITEMMDL_TYCOON_WALLET */ + MDL_ITEM_ADVENTURE_POUCH, /* ITEMMDL_ADVENTURE_POUCH */ + MDL_ITEM_POUCH_EXPANSION, /* ITEMMDL_POUCH_EXPANSION */ + MDL_ITEM_LIFE_MEDAL, /* ITEMMDL_LIFE_MEDAL */ + MDL_ITEM_MAX, /* ITEMMDL_WOODEN_SHIELD */ + MDL_ITEM_MAX, /* ITEMMDL_BANDED_SHIELD */ + MDL_ITEM_MAX, /* ITEMMDL_BRACED_SHIELD */ + MDL_ITEM_MAX, /* ITEMMDL_IRON_SHIELD */ + MDL_ITEM_MAX, /* ITEMMDL_REINFORCED_SHIELD */ + MDL_ITEM_MAX, /* ITEMMDL_FORTIFIED_SHIELD */ + MDL_ITEM_MAX, /* ITEMMDL_SACRED_SHIELD */ + MDL_ITEM_MAX, /* ITEMMDL_DIVINE_SHIELD */ + MDL_ITEM_MAX, /* ITEMMDL_GODDESS_SHIELD */ + MDL_ITEM_HYLIAN_SHIELD, /* ITEMMDL_HYLIAN_SHIELD */ + MDL_ITEM_REVITALIZING_POTION, /* ITEMMDL_REVITALIZING_POTION */ + MDL_ITEM_REVITALIZING_POTION, /* ITEMMDL_REVITALIZING_POTION_PLUS */ + MDL_ITEM_SMALL_SEED_SATCHEL, /* ITEMMDL_SMALL_SEED_SATCHEL */ + MDL_ITEM_MEDIUM_SEED_SATCHEL, /* ITEMMDL_MEDIUM_SEED_SATCHEL */ + MDL_ITEM_LARGE_SEED_SATCHEL, /* ITEMMDL_LARGE_SEED_SATCHEL */ + MDL_ITEM_SMALL_QUIVER, /* ITEMMDL_SMALL_QUIVER */ + MDL_ITEM_MEDIUM_QUIVER, /* ITEMMDL_MEDIUM_QUIVER */ + MDL_ITEM_LARGE_QUIVER, /* ITEMMDL_LARGE_QUIVER */ + MDL_ITEM_SMALL_BOMB_BAG, /* ITEMMDL_SMALL_BOMB_BAG */ + MDL_ITEM_MEDIUM_BOMB_BAG, /* ITEMMDL_MEDIUM_BOMB_BAG */ + MDL_ITEM_LARGE_BOMB_BAG, /* ITEMMDL_LARGE_BOMB_BAG */ + MDL_ITEM_WHIP, /* ITEMMDL_WHIP */ + MDL_ITEM_FIRESHIELD_EARRINGS, /* ITEMMDL_FIRESHIELD_EARRINGS */ + MDL_ITEM_BIG_BUG_NET, /* ITEMMDL_BIG_BUG_NET */ + MDL_ITEM_FARON_GRASSHOPPER, /* ITEMMDL_FARON_GRASSHOPPER */ + MDL_ITEM_WOODLAND_RHINO_BEETLE, /* ITEMMDL_WOODLAND_RHINO_BEETLE */ + MDL_ITEM_DEKU_HORNET, /* ITEMMDL_DEKU_HORNET */ + MDL_ITEM_SKYLOFT_MANTIS, /* ITEMMDL_SKYLOFT_MANTIS */ + MDL_ITEM_VOLCANIC_LADYBUG, /* ITEMMDL_VOLCANIC_LADYBUG */ + MDL_ITEM_BLESSED_BUTTERFLY, /* ITEMMDL_BLESSED_BUTTERFLY */ + MDL_ITEM_LANAYRU_ANT, /* ITEMMDL_LANAYRU_ANT */ + MDL_ITEM_SAND_CICADA, /* ITEMMDL_SAND_CICADA */ + MDL_ITEM_GERUDO_DRAGONFLY, /* ITEMMDL_GERUDO_DRAGONFLY */ + MDL_ITEM_ELDIN_ROLLER, /* ITEMMDL_ELDIN_ROLLER */ + MDL_ITEM_SKY_STAG_BEETLE, /* ITEMMDL_SKY_STAG_BEETLE */ + MDL_ITEM_MAX, /* ITEMMDL_STARRY_FIREFLY */ + MDL_ITEM_BOTTLE, /* ITEMMDL_BOTTLE */ + MDL_ITEM_CAWLIN_LETTER, /* ITEMMDL_CAWLIN_LETTER */ + MDL_ITEM_BEEDLE_INSECT_CAGE, /* ITEMMDL_BEEDLE_INSECT_CAGE */ + MDL_ITEM_MAX, /* ITEMMDL_RATTLE */ + MDL_ITEM_HORNET_LARVAE, /* ITEMMDL_HORNET_LARVAE */ + MDL_ITEM_BIRD_FEATHER, /* ITEMMDL_BIRD_FEATHER */ + MDL_ITEM_TUMBLE_WEED, /* ITEMMDL_TUMBLE_WEED */ + MDL_ITEM_LIZARD_TAIL, /* ITEMMDL_LIZARD_TAIL */ + MDL_ITEM_ELDIN_ORE, /* ITEMMDL_ELDIN_ORE */ + MDL_ITEM_ANCIENT_FLOWER, /* ITEMMDL_ANCIENT_FLOWER */ + MDL_ITEM_AMBER_RELIC, /* ITEMMDL_AMBER_RELIC */ + MDL_ITEM_DUSK_RELIC, /* ITEMMDL_DUSK_RELIC */ + MDL_ITEM_MAX, /* ITEMMDL_JELLY_BLOB */ + MDL_ITEM_MONSTER_CLAW, /* ITEMMDL_MONSTER_CLAW */ + MDL_ITEM_MONSTER_HORN, /* ITEMMDL_MONSTER_HORN */ + MDL_ITEM_ORNAMENTAL_SKULL, /* ITEMMDL_ORNAMENTAL_SKULL */ + MDL_ITEM_EVIL_CRYSTAL, /* ITEMMDL_EVIL_CRYSTAL */ + MDL_ITEM_BLUE_BIRD_FEATHER, /* ITEMMDL_BLUE_BIRD_FEATHER */ + MDL_ITEM_GOLDEN_SKULL, /* ITEMMDL_GOLDEN_SKULL */ + MDL_ITEM_GODDESS_PLUME, /* ITEMMDL_GODDESS_PLUME */ + MDL_ITEM_EMERALD_TABLET, /* ITEMMDL_EMERALD_TABLET */ + MDL_ITEM_RUBY_TABLET, /* ITEMMDL_RUBY_TABLET */ + MDL_ITEM_AMBER_TABLET, /* ITEMMDL_AMBER_TABLET */ + MDL_ITEM_STONE_OF_TRIALS, /* ITEMMDL_STONE_OF_TRIALS */ + MDL_ITEM_GODDESS_HARP, /* ITEMMDL_BALLAD_OF_THE_GODDESS */ + MDL_ITEM_GODDESS_HARP, /* ITEMMDL_FARORES_COURAGE */ + MDL_ITEM_GODDESS_HARP, /* ITEMMDL_NAYRUS_WISDOM */ + MDL_ITEM_GODDESS_HARP, /* ITEMMDL_DINS_POWER */ + MDL_ITEM_GODDESS_HARP, /* ITEMMDL_FARON_SOTH */ + MDL_ITEM_GODDESS_HARP, /* ITEMMDL_ELDIN_SOTH */ + MDL_ITEM_GODDESS_HARP, /* ITEMMDL_LANAYRU_SOTH */ + MDL_ITEM_GODDESS_HARP, /* ITEMMDL_ITEM_SOTH */ + MDL_ITEM_REVITALIZING_POTION_PLUS_PLUS, /* ITEMMDL_REVITALIZING_POTION_PLUS_PLUS */ + MDL_ITEM_MAX, /* ITEMMDL_HOT_SOUP */ + MDL_ITEM_MAX, /* ITEMMDL_COLD_SOUP */ + MDL_ITEM_LIFE_TREE_SEED, /* ITEMMDL_LIFE_TREE_SEED */ + MDL_ITEM_LIFE_TREE_FRUIT, /* ITEMMDL_LIFE_TREE_FRUIT */ + MDL_ITEM_EXTRA_WALLET, /* ITEMMDL_EXTRA_WALLET */ +}; + +const dItemMdlItem_c::MdlConfig dItemMdlItem_c::sMdlConfig[] = { + { "GetTriForce", "GetTriForce"}, + { "GetRupee", "GetRupee"}, + { "GetSwordA", "GetSwordA"}, + { "GetRupee", "GetRupee"}, + { "GetRupee", "GetRupee"}, + { "GetRupee", "GetRupee"}, + { "GetRupee", "GetRupee"}, + { "GetRupee", "GetRupee"}, + { "GetHarp", "GetHarp"}, + { "GetSirenFlower", "GetSirenFlower"}, + { "GetBowA", "GetBowA"}, + { "GetHookShot", "GetHookShot"}, + { "GetBirdStatue", "GetBirdStatue"}, + { "GetKeyBoss2A", "GetKeyBoss2A"}, + { "GetKeyBoss2B", "GetKeyBoss2B"}, + { "GetKeyBoss2C", "GetKeyBoss2C"}, + { "GetKeyKakera", nullptr}, + { "GetKeyBossA", "GetKeyBossA"}, + { "GetKeyBossB", "GetKeyBossB"}, + { "GetKeyBossC", "GetKeyBossC"}, + { "GetBottleKinokoA", "GetBottleKinokoA"}, + { "GetBomb", "GetBomb"}, + { "GetVacuum", "GetVacuum"}, + { "GetMap", "GetMap"}, + { "GetPachinkoA", "GetPachinkoA"}, + { "GetBeetleA", "GetBeetleA"}, + { "GetBottleKinokoB", "GetBottleKinokoB"}, + { "GetMoleGloveA", "GetMoleGloveA"}, + { "GetRupee", "GetRupee"}, + { "GetSeedSet", "GetSeedSet"}, + { "GetUroko", "GetUroko"}, + { "GetMedal", "GetMedalReturn"}, + { "GetNetA", "GetNetA"}, + { "GetBeetleB", "GetBeetleB"}, + { "GetBeetleC", "GetBeetleC"}, + { "GetBeetleD", "GetBeetleD"}, + { "GetBowB", "GetBowB"}, + { "GetBowC", "GetBowC"}, + { "GetBombBag", "GetBombBag"}, + { "GetMapSea", "GetMapSea"}, + { "GetMoleGloveB", "GetMoleGloveB"}, + { "GetMedal", "GetMedalHeart"}, + { "GetMedal", "GetMedalLucky"}, + { "GetMedal", "GetMedalHunter"}, + { "GetMedal", "GetMedalDurable"}, + { "GetMedal", "GetMedalDemon"}, + { "GetPachinkoB", "GetPachinkoB"}, + { "GetRupee", "GetRupee"}, + { "GetPurseB", "GetPurseB"}, + { "GetPurseC", "GetPurseC"}, + { "GetPurseD", "GetPurseD"}, + { "GetPurseE", "GetPurseE"}, + { "GetPouchA", "GetPorchA"}, + { "GetPouchB", "GetPorchB"}, + { "GetMedal", "GetMedalLife"}, + { "GetShieldHylia", "GetShieldHylia"}, + { "GetBottleRepair", "GetBottleRepair"}, + { "GetSpareSeedA", "GetSpareSeedA"}, + { "GetSpareSeedB", "GetSpareSeedB"}, + { "GetSpareSeedC", "GetSpareSeedC"}, + { "GetSpareQuiverA", "GetSpareQuiverA"}, + { "GetSpareQuiverB", "GetSpareQuiverB"}, + { "GetSpareQuiverC", "GetSpareQuiverC"}, + { "GetSpareBombBagA", "GetSpareBombBagA"}, + { "GetSpareBombBagB", "GetSpareBombBagB"}, + { "GetSpareBombBagC", "GetSpareBombBagC"}, + { "GetWhip", "GetWhip"}, + { "GetEarring", "GetEarring"}, + { "GetNetB", "GetNetB"}, + {"GetInsectGrasshopper", "GetInsectGrasshopper"}, + { "GetInsectBeetle", "GetInsectBeetle"}, + { "GetInsectBee", "GetInsectBee"}, + { "GetInsectKamakiri", "GetInsectKamakiri"}, + { "GetInsectLadybug", "GetInsectLadybug"}, + { "GetInsectButterfly", "GetInsectButterfly"}, + { "GetInsectAnt", "GetInsectAnt"}, + { "GetInsectCicada", "GetInsectCicada"}, + { "GetInsectDragonfly", "GetInsectDragonfly"}, + { "GetInsectScarab", "GetInsectScarab"}, + { "GetInsectKuwagata", "GetInsectKuwagata"}, + { "GetBottleEmpty", "GetBottleEmpty"}, + { "GetKobunALetter", "GetKobunALetter"}, + { "GetTerryCage", "GetTerryCage"}, + { "GetSozaiA", "GetSozaiA"}, + { "GetSozaiB", "GetSozaiB"}, + { "GetSozaiC", "GetSozaiC"}, + { "GetSozaiD", "GetSozaiD"}, + { "GetSozaiE", "GetSozaiE"}, + { "GetSozaiF", "GetSozaiF"}, + { "GetSozaiG", "GetSozaiG"}, + { "GetSozaiH", "GetSozaiH"}, + { "GetSozaiJ", "GetSozaiJ"}, + { "GetSozaiL", "GetSozaiL"}, + { "GetSozaiK", "GetSozaiK"}, + { "GetSozaiM", "GetSozaiM"}, + { "GetSozaiN", "GetSozaiN"}, + { "GetSozaiO", "GetSozaiO"}, + { "GetSozaiP", "GetSozaiP"}, + { "GetSekibanMapA", "SekibanMapA"}, + { "GetSekibanMapB", "SekibanMapB"}, + { "GetSekibanMapC", "SekibanMapC"}, + { "GetSirenKey", "GetSirenKey"}, + { "GetBottleRepairS", "GetBottleRepairS"}, + { "GetSeedLife", "GetSeedLife"}, + { "GetFruitB", "GetFruitB"}, + { "GetSparePurse", "GetSparePurse"}, +}; + +bool dItemMdlItem_c::isMdlForItemId(u16 itemId) { + if (hasItemMdl(itemId) == false) { + return false; + } else { + return sMdlIdx[getItemMdlIdx(itemId)] <= MDL_ITEM_MAX - 1; + } +} + +bool dItemMdlItem_c::init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) { + const MdlConfig *mdlConfig; + bool scattershotOverride = dAcItem_c::isSlingshot((ITEM_ID)itemId) && dAcItem_c::checkFlag(ITEM_MIGHTY_SCATTERSHOT); + if (scattershotOverride) { + mdlConfig = &sMdlConfig[sMdlIdx[getItemMdlIdx(ITEM_MIGHTY_SCATTERSHOT)]]; + } else { + mdlConfig = &sMdlConfig[sMdlIdx[getItemMdlIdx(itemId)]]; + } + + void *resData = OarcManager::GetInstance()->getMdlFromArc2(mdlConfig->resFile); + if (resData == nullptr) { + return false; + } + nw4r::g3d::ResFile res(resData); + if (!res.IsValid()) { + return false; + } + + SizedString<0x20> str; + if (dAcItem_c::isKeyPiece((ITEM_ID)itemId)) { + if (dAcItem_c::getKeyPieceCount() < dAcItem_c::getTotalRequiredKeyPieceCount() - 1) { + str = "GetKeyKakeraA"; + } else { + str = "GetKeyKakeraB"; + } + } else { + str = mdlConfig->mdlName; + } + + nw4r::g3d::ResMdl mdl = res.GetResMdl(str); + if (!mdl.IsValid()) { + return false; + } + if (!mMdl.create(mdl, allocator, 0x120)) { + return false; + } + + mpItem = item; + return true; +} + +void dItemMdlItem_c::vt_0x10(u8 arg) { + field_0x14 = arg; +} + +void dItemMdlItem_c::setScale(const mVec3_c &scale) { + mMdl.setScale(scale); +} + +void dItemMdlItem_c::setLocalMtx(const mMtx_c &mtx) { + mMdl.setLocalMtx(mtx); +} + +void dItemMdlItem_c::draw() { + if (field_0x14 == ITEM_MDL_UNK0x14_2) { + mpItem->fn_8002ECD0(&mMdl, 6); + } else { + ITEM_MDL_UNK0x14_1: + mpItem->fn_8002ECD0(&mMdl, 7); + } +} + +void dItemMdlItem_c::vt_0x20(u16 itemId) { + // no-op +} + +void dItemMdlItem_c::setPriorityDraw() { + mMdl.setPriorityDraw(0x82, 0x7F); +} + +void dItemMdlItem_c::unsetPriorityDraw() { + mMdl.setPriorityDraw(0x7F, 0x7F); +} + +m3d::smdl_c *dItemMdlItem_c::getMdl() { + return &mMdl; +} diff --git a/src/toBeSorted/item_mdl_misc.cpp b/src/toBeSorted/item_mdl_misc.cpp index 97194a1f..f9b0fbf9 100644 --- a/src/toBeSorted/item_mdl_misc.cpp +++ b/src/toBeSorted/item_mdl_misc.cpp @@ -12,6 +12,20 @@ #include "toBeSorted/arc_managers/oarc_manager.h" #include "toBeSorted/item_mdl_name.h" +enum MdlIdx { + MDL_PUT_ARROW, + MDL_PUT_ARROW_BUNDLE, + MDL_PUT_HEART, + MDL_PUT_KEY_SMALL, + MDL_PUT_BOMB_SET, + MDL_PUT_SEED, + MDL_PUT_HEART_UTUWA, + MDL_PUT_HEART_KAKERA, + MDL_PUT_TRI_FORCE, + MDL_PUT_GARAGARA, + MDL_PUT_MAX, +}; + const u8 dItemMdlPut_c::sMdlIdx[] = { MDL_PUT_KEY_SMALL, /* ITEMMDL_SMALL_KEY */ MDL_PUT_MAX, /* ITEMMDL_GREEN_RUPEE */ @@ -31,7 +45,7 @@ const u8 dItemMdlPut_c::sMdlIdx[] = { MDL_PUT_MAX, /* ITEMMDL_GODDESS_HARP */ MDL_PUT_MAX, /* ITEMMDL_SPIRIT_VESSEL */ MDL_PUT_MAX, /* ITEMMDL_BOW */ - MDL_PUT_MAX, /* ITEMMDL_CLAWSHOWS */ + MDL_PUT_MAX, /* ITEMMDL_CLAWSHOTS */ MDL_PUT_MAX, /* ITEMMDL_BIRD_STATUETTE */ MDL_PUT_MAX, /* ITEMMDL_AC_BK */ MDL_PUT_MAX, /* ITEMMDL_FS_BK */ @@ -289,6 +303,19 @@ void dItemMdlPut_c::unsetPriorityDraw() { mPutMdl.setPriorityDraw(0x7F, 0x7F); } +enum ShieldIdx { + MDL_SHIELD_WOOD_0, + MDL_SHIELD_WOOD_1, + MDL_SHIELD_WOOD_2, + MDL_SHIELD_IRON_0, + MDL_SHIELD_IRON_1, + MDL_SHIELD_IRON_2, + MDL_SHIELD_HOLY_0, + MDL_SHIELD_HOLY_1, + MDL_SHIELD_HOLY_2, + MDL_SHIELD_MAX +}; + const u8 dItemMdlShield_c::sMdlIdx[] = { MDL_SHIELD_MAX, /* ITEMMDL_SMALL_KEY */ MDL_SHIELD_MAX, /* ITEMMDL_GREEN_RUPEE */ @@ -308,7 +335,7 @@ const u8 dItemMdlShield_c::sMdlIdx[] = { MDL_SHIELD_MAX, /* ITEMMDL_GODDESS_HARP */ MDL_SHIELD_MAX, /* ITEMMDL_SPIRIT_VESSEL */ MDL_SHIELD_MAX, /* ITEMMDL_BOW */ - MDL_SHIELD_MAX, /* ITEMMDL_CLAWSHOWS */ + MDL_SHIELD_MAX, /* ITEMMDL_CLAWSHOTS */ MDL_SHIELD_MAX, /* ITEMMDL_BIRD_STATUETTE */ MDL_SHIELD_MAX, /* ITEMMDL_AC_BK */ MDL_SHIELD_MAX, /* ITEMMDL_FS_BK */ @@ -551,6 +578,18 @@ void dItemMdlShield_c::unsetPriorityDraw() { mMdl.setPriorityDraw(0x7F, 0x7F); } +enum BottleIdx { + MDL_BOTTLE_WATER, + MDL_BOTTLE_FAIRY, + MDL_BOTTLE_HOLY, + MDL_BOTTLE_KUSURI, + MDL_BOTTLE_KUSURI_S, + MDL_BOTTLE_B_FAIRY, + MDL_BOTTLE_SOZAI_I, + MDL_BOTTLE_PUMPKIN, + MDL_BOTTLE_MAX +}; + const u8 dItemMdlBottle_c::sMdlIdx[] = { MDL_BOTTLE_MAX, /* ITEMMDL_SMALL_KEY */ MDL_BOTTLE_MAX, /* ITEMMDL_GREEN_RUPEE */ @@ -570,7 +609,7 @@ const u8 dItemMdlBottle_c::sMdlIdx[] = { MDL_BOTTLE_MAX, /* ITEMMDL_GODDESS_HARP */ MDL_BOTTLE_MAX, /* ITEMMDL_SPIRIT_VESSEL */ MDL_BOTTLE_MAX, /* ITEMMDL_BOW */ - MDL_BOTTLE_MAX, /* ITEMMDL_CLAWSHOWS */ + MDL_BOTTLE_MAX, /* ITEMMDL_CLAWSHOTS */ MDL_BOTTLE_MAX, /* ITEMMDL_BIRD_STATUETTE */ MDL_BOTTLE_MAX, /* ITEMMDL_AC_BK */ MDL_BOTTLE_MAX, /* ITEMMDL_FS_BK */ @@ -1021,6 +1060,14 @@ m3d::smdl_c *dItemMdlFirefly_c::getMdl() { return &mMdl; } +enum PotionIdx { + MDL_POTION_MUTEKI, + MDL_POTION_GUTS, + MDL_POTION_AIR, + MDL_POTION_GENKI, + MDL_POTION_MAX, +}; + const u8 dItemMdlPotion_c::sMdlIdx[] = { MDL_POTION_MAX, /* ITEMMDL_SMALL_KEY */ MDL_POTION_MAX, /* ITEMMDL_GREEN_RUPEE */ @@ -1040,7 +1087,7 @@ const u8 dItemMdlPotion_c::sMdlIdx[] = { MDL_POTION_MAX, /* ITEMMDL_GODDESS_HARP */ MDL_POTION_MAX, /* ITEMMDL_SPIRIT_VESSEL */ MDL_POTION_MAX, /* ITEMMDL_BOW */ - MDL_POTION_MAX, /* ITEMMDL_CLAWSHOWS */ + MDL_POTION_MAX, /* ITEMMDL_CLAWSHOTS */ MDL_POTION_MAX, /* ITEMMDL_BIRD_STATUETTE */ MDL_POTION_MAX, /* ITEMMDL_AC_BK */ MDL_POTION_MAX, /* ITEMMDL_FS_BK */ diff --git a/src/toBeSorted/item_mdl_name.cpp b/src/toBeSorted/item_mdl_name.cpp index a0b95f77..a9587885 100644 --- a/src/toBeSorted/item_mdl_name.cpp +++ b/src/toBeSorted/item_mdl_name.cpp @@ -22,7 +22,7 @@ static const u16 ITEM_TO_MODEL_INDEX[512] = { ITEMMDL_SPIRIT_VESSEL, /* ITEM_SPIRIT_VESSEL */ ITEMMDL_MAX, /* ITEM_UNK_18 */ ITEMMDL_BOW, /* ITEM_BOW */ - ITEMMDL_CLAWSHOWS, /* ITEM_CLAWSHOTS */ + ITEMMDL_CLAWSHOTS, /* ITEM_CLAWSHOTS */ ITEMMDL_BIRD_STATUETTE, /* ITEM_BIRD_STATUETTE */ ITEMMDL_MAX, /* ITEM_COMMON_BUG */ ITEMMDL_MAX, /* ITEM_UNCOMMON_BUG */ From 76ace07831aeade7f71ecbafec767ec09860f1ae Mon Sep 17 00:00:00 2001 From: robojumper Date: Thu, 30 Apr 2026 23:11:21 +0200 Subject: [PATCH 04/14] rest of the item_mdls OK --- config/SOUE01/symbols.txt | 44 ++++---- configure.py | 6 +- include/toBeSorted/item_mdl_light_fruit.h | 30 +++++ include/toBeSorted/item_mdl_stamina_fruit.h | 30 +++++ src/toBeSorted/item_mdl_light_fruit.cpp | 117 ++++++++++++++++++++ src/toBeSorted/item_mdl_stamina_fruit.cpp | 109 ++++++++++++++++++ 6 files changed, 311 insertions(+), 25 deletions(-) create mode 100644 include/toBeSorted/item_mdl_light_fruit.h create mode 100644 include/toBeSorted/item_mdl_stamina_fruit.h create mode 100644 src/toBeSorted/item_mdl_light_fruit.cpp create mode 100644 src/toBeSorted/item_mdl_stamina_fruit.cpp diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 8fb46bc8..3475a99b 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -9543,26 +9543,26 @@ vt_0x20__15dItemMdlRupee_cFUs = .text:0x80170230; // type:function size:0xAC setPriorityDraw__15dItemMdlRupee_cFv = .text:0x801702E0; // type:function size:0x48 unsetPriorityDraw__15dItemMdlRupee_cFv = .text:0x80170330; // type:function size:0x48 __dt__15dItemMdlRupee_cFv = .text:0x80170380; // type:function size:0x94 -IsItemLightFruit = .text:0x80170420; // type:function size:0x10 -fn_80170430 = .text:0x80170430; // type:function size:0x214 -fn_80170650 = .text:0x80170650; // type:function size:0x1C -fn_80170670 = .text:0x80170670; // type:function size:0x48 -fn_801706C0 = .text:0x801706C0; // type:function size:0x48 -fn_80170710 = .text:0x80170710; // type:function size:0x84 -fn_801707A0 = .text:0x801707A0; // type:function size:0x4 -fn_801707B0 = .text:0x801707B0; // type:function size:0x48 -fn_80170800 = .text:0x80170800; // type:function size:0x48 -fn_80170850 = .text:0x80170850; // type:function size:0x94 -isItemStaminaFruit = .text:0x801708F0; // type:function size:0x10 -fn_80170900 = .text:0x80170900; // type:function size:0x204 -fn_80170B10 = .text:0x80170B10; // type:function size:0x1C -fn_80170B30 = .text:0x80170B30; // type:function size:0x48 -fn_80170B80 = .text:0x80170B80; // type:function size:0x48 -fn_80170BD0 = .text:0x80170BD0; // type:function size:0x84 -fn_80170C60 = .text:0x80170C60; // type:function size:0x4 -fn_80170C70 = .text:0x80170C70; // type:function size:0x48 -fn_80170CC0 = .text:0x80170CC0; // type:function size:0x48 -fn_80170D10 = .text:0x80170D10; // type:function size:0x94 +isMdlForItemId__20dItemMdlLightFruit_cFUs = .text:0x80170420; // type:function size:0x10 +init__20dItemMdlLightFruit_cFUsP9dAcItem_cP12mAllocator_c = .text:0x80170430; // type:function size:0x214 +vt_0x10__20dItemMdlLightFruit_cFUc = .text:0x80170650; // type:function size:0x1C +setScale__20dItemMdlLightFruit_cFRC7mVec3_c = .text:0x80170670; // type:function size:0x48 +setLocalMtx__20dItemMdlLightFruit_cFRC6mMtx_c = .text:0x801706C0; // type:function size:0x48 +draw__20dItemMdlLightFruit_cFv = .text:0x80170710; // type:function size:0x84 +vt_0x20__20dItemMdlLightFruit_cFUs = .text:0x801707A0; // type:function size:0x4 +setPriorityDraw__20dItemMdlLightFruit_cFv = .text:0x801707B0; // type:function size:0x48 +unsetPriorityDraw__20dItemMdlLightFruit_cFv = .text:0x80170800; // type:function size:0x48 +__dt__20dItemMdlLightFruit_cFv = .text:0x80170850; // type:function size:0x94 +isMdlForItemId__22dItemMdlStaminaFruit_cFUs = .text:0x801708F0; // type:function size:0x10 +init__22dItemMdlStaminaFruit_cFUsP9dAcItem_cP12mAllocator_c = .text:0x80170900; // type:function size:0x204 +vt_0x10__22dItemMdlStaminaFruit_cFUc = .text:0x80170B10; // type:function size:0x1C +setScale__22dItemMdlStaminaFruit_cFRC7mVec3_c = .text:0x80170B30; // type:function size:0x48 +setLocalMtx__22dItemMdlStaminaFruit_cFRC6mMtx_c = .text:0x80170B80; // type:function size:0x48 +draw__22dItemMdlStaminaFruit_cFv = .text:0x80170BD0; // type:function size:0x84 +vt_0x20__22dItemMdlStaminaFruit_cFUs = .text:0x80170C60; // type:function size:0x4 +setPriorityDraw__22dItemMdlStaminaFruit_cFv = .text:0x80170C70; // type:function size:0x48 +unsetPriorityDraw__22dItemMdlStaminaFruit_cFv = .text:0x80170CC0; // type:function size:0x48 +__dt__22dItemMdlStaminaFruit_cFv = .text:0x80170D10; // type:function size:0x94 fn_80170DB0 = .text:0x80170DB0; // type:function size:0x8 fn_80170DC0 = .text:0x80170DC0; // type:function size:0x8 fn_80170DD0 = .text:0x80170DD0; // type:function size:0x8 @@ -35245,9 +35245,9 @@ __vt__14dItemMdlItem_c = .data:0x80528A38; // type:object size:0x30 lbl_80528A68 = .data:0x80528A68; // type:object size:0x9 data:string lbl_80528A74 = .data:0x80528A74; // type:object size:0x9 data:string __vt__15dItemMdlRupee_c = .data:0x80528A80; // type:object size:0x30 -LightFruitModel_vtable = .data:0x80528AB0; // type:object size:0x30 +__vt__20dItemMdlLightFruit_c = .data:0x80528AB0; // type:object size:0x30 lbl_80528AE0 = .data:0x80528AE0; // type:object size:0xA data:string -StaminaFruitModel_vtable = .data:0x80528AF0; // type:object size:0x30 +__vt__22dItemMdlStaminaFruit_c = .data:0x80528AF0; // type:object size:0x30 lbl_80528B20 = .data:0x80528B20; // type:object size:0x78 lbl_80528B98 = .data:0x80528B98; // type:object size:0x20 lbl_80528BB8 = .data:0x80528BB8; // type:object size:0x1C data:string diff --git a/configure.py b/configure.py index 47ababb1..812b59ab 100644 --- a/configure.py +++ b/configure.py @@ -595,9 +595,9 @@ config.libs = [ Object(Matching, "toBeSorted/counters/extra_wallet_counter.cpp"), Object(Matching, "toBeSorted/item_mdl_misc.cpp"), Object(Matching, "toBeSorted/item_mdl_item.cpp"), - Object(Matching, "toBeSorted/item_mdl_rupee.cpp"), - Object(NonMatching, "toBeSorted/item_mdl_light_fruit.cpp"), - Object(NonMatching, "toBeSorted/item_mdl_stamina_fruit.cpp"), + Object(Matching, "toBeSorted/item_mdl_rupee.cpp"), # non-deterministic codegen + Object(Matching, "toBeSorted/item_mdl_light_fruit.cpp"), + Object(Matching, "toBeSorted/item_mdl_stamina_fruit.cpp"), Object(NonMatching, "toBeSorted/item_spawn.cpp"), # probably multiple files, see sdata2 Object(NonMatching, "toBeSorted/unk_screen_effect.cpp"), Object(NonMatching, "toBeSorted/revision_info.cpp"), diff --git a/include/toBeSorted/item_mdl_light_fruit.h b/include/toBeSorted/item_mdl_light_fruit.h new file mode 100644 index 00000000..0711ed38 --- /dev/null +++ b/include/toBeSorted/item_mdl_light_fruit.h @@ -0,0 +1,30 @@ +#ifndef TOBESORTED_ITEM_MDL_LIGHT_FRUIT_H +#define TOBESORTED_ITEM_MDL_LIGHT_FRUIT_H + +#include "m/m3d/m_smdl.h" +#include "m/m3d/m_anmtexsrt.h" +#include "toBeSorted/item_mdl.h" + + +class dItemMdlLightFruit_c : public dItemMdl_c { +public: + /* 0x08 */ virtual ~dItemMdlLightFruit_c() {} + /* 0x0C */ virtual bool init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) override; + /* 0x10 */ virtual void vt_0x10(u8) override; + /* 0x14 */ virtual void setScale(const mVec3_c &scale) override; + /* 0x18 */ virtual void setLocalMtx(const mMtx_c &mtx) override; + /* 0x1C */ virtual void draw() override; + /* 0x20 */ virtual void vt_0x20(u16 itemId) override; + /* 0x24 */ virtual void setPriorityDraw() override; + /* 0x28 */ virtual void unsetPriorityDraw() override; + + static bool isMdlForItemId(u16 itemId); + +private: + /* 0x18 */ m3d::smdl_c mMdl1; + /* 0x34 */ m3d::smdl_c mMdl2; + /* 0x50 */ m3d::anmTexSrt_c mAnmTexSrt1; + /* 0x7C */ m3d::anmTexSrt_c mAnmTexSrt2; +}; + +#endif diff --git a/include/toBeSorted/item_mdl_stamina_fruit.h b/include/toBeSorted/item_mdl_stamina_fruit.h new file mode 100644 index 00000000..b2b0adf7 --- /dev/null +++ b/include/toBeSorted/item_mdl_stamina_fruit.h @@ -0,0 +1,30 @@ +#ifndef TOBESORTED_ITEM_MDL_STAMINA_FRUIT_H +#define TOBESORTED_ITEM_MDL_STAMINA_FRUIT_H + +#include "m/m3d/m_smdl.h" +#include "m/m3d/m_anmtexsrt.h" +#include "toBeSorted/item_mdl.h" + + +class dItemMdlStaminaFruit_c : public dItemMdl_c { +public: + /* 0x08 */ virtual ~dItemMdlStaminaFruit_c() {} + /* 0x0C */ virtual bool init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) override; + /* 0x10 */ virtual void vt_0x10(u8) override; + /* 0x14 */ virtual void setScale(const mVec3_c &scale) override; + /* 0x18 */ virtual void setLocalMtx(const mMtx_c &mtx) override; + /* 0x1C */ virtual void draw() override; + /* 0x20 */ virtual void vt_0x20(u16 itemId) override; + /* 0x24 */ virtual void setPriorityDraw() override; + /* 0x28 */ virtual void unsetPriorityDraw() override; + + static bool isMdlForItemId(u16 itemId); + +private: + /* 0x18 */ m3d::smdl_c mMdl1; + /* 0x34 */ m3d::smdl_c mMdl2; + /* 0x50 */ m3d::anmTexSrt_c mAnmTexSrt1; + /* 0x7C */ m3d::anmTexSrt_c mAnmTexSrt2; +}; + +#endif diff --git a/src/toBeSorted/item_mdl_light_fruit.cpp b/src/toBeSorted/item_mdl_light_fruit.cpp new file mode 100644 index 00000000..2a1e5b7a --- /dev/null +++ b/src/toBeSorted/item_mdl_light_fruit.cpp @@ -0,0 +1,117 @@ +#include "toBeSorted/item_mdl_light_fruit.h" + +#include "common.h" +#include "d/a/d_a_item.h" +#include "d/a/d_a_itembase.h" +#include "toBeSorted/arc_managers/oarc_manager.h" + + +bool dItemMdlLightFruit_c::isMdlForItemId(u16 itemId) { + return itemId == ITEM_LIGHT_FRUIT; +} + +bool dItemMdlLightFruit_c::init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) { + if (item == nullptr) { + return false; + } + + { + void *resData1 = OarcManager::GetInstance()->getMdlFromArc2("PutHoly"); + if (resData1 == nullptr) { + return false; + } + nw4r::g3d::ResFile res1(resData1); + if (!res1.IsValid()) { + return false; + } + + nw4r::g3d::ResMdl mdl1 = res1.GetResMdl("PutHoly"); + if (!mdl1.IsValid()) { + return false; + } + if (!mMdl1.create(mdl1, allocator, 0x324)) { + return false; + } + + nw4r::g3d::ResAnmTexSrt anmTexSrt1 = res1.GetResAnmTexSrt("Holy"); + if (!anmTexSrt1.IsValid()) { + return false; + } + TRY_CREATE(mAnmTexSrt1.create(mdl1, anmTexSrt1, allocator, nullptr, 1)); + mMdl1.setAnm(mAnmTexSrt1); + } + + { + void *resData2 = OarcManager::GetInstance()->getMdlFromArc2("GetHoly"); + if (resData2 == nullptr) { + // return false; + } + nw4r::g3d::ResFile res2(resData2); + if (!res2.IsValid()) { + return false; + } + + nw4r::g3d::ResMdl mdl2 = res2.GetResMdl("GetHoly"); + if (!mdl2.IsValid()) { + return false; + } + if (!mMdl2.create(mdl2, allocator, 0x324)) { + return false; + } + + nw4r::g3d::ResAnmTexSrt anmTexSrt2 = res2.GetResAnmTexSrt("Holy"); + if (!anmTexSrt2.IsValid()) { + return false; + } + TRY_CREATE(mAnmTexSrt2.create(mdl2, anmTexSrt2, allocator, nullptr, 1)); + mMdl2.setAnm(mAnmTexSrt2); + } + + mpItem = item; + return true; +} + +void dItemMdlLightFruit_c::vt_0x10(u8 arg) { + if (arg == ITEM_MDL_UNK0x14_3) { + field_0x14 = ITEM_MDL_UNK0x14_1; + } else { + field_0x14 = arg; + } +} + +void dItemMdlLightFruit_c::setScale(const mVec3_c &scale) { + mMdl1.setScale(scale); + mMdl2.setScale(scale); +} + +void dItemMdlLightFruit_c::setLocalMtx(const mMtx_c &mtx) { + mMdl1.setLocalMtx(mtx); + mMdl2.setLocalMtx(mtx); +} + +void dItemMdlLightFruit_c::draw() { + switch (field_0x14) { + case ITEM_MDL_UNK0x14_1: + mAnmTexSrt1.play(); + mpItem->fn_8002ECD0(&mMdl1, 7); + break; + case ITEM_MDL_UNK0x14_2: + mAnmTexSrt2.play(); + mpItem->fn_8002ECD0(&mMdl2, 6); + break; + } +} + +void dItemMdlLightFruit_c::vt_0x20(u16 itemId) { + // no-op +} + +void dItemMdlLightFruit_c::setPriorityDraw() { + mMdl1.setPriorityDraw(0x82, 0x7F); + mMdl2.setPriorityDraw(0x82, 0x7F); +} + +void dItemMdlLightFruit_c::unsetPriorityDraw() { + mMdl1.setPriorityDraw(0x7F, 0x7F); + mMdl2.setPriorityDraw(0x7F, 0x7F); +} diff --git a/src/toBeSorted/item_mdl_stamina_fruit.cpp b/src/toBeSorted/item_mdl_stamina_fruit.cpp new file mode 100644 index 00000000..5aee364d --- /dev/null +++ b/src/toBeSorted/item_mdl_stamina_fruit.cpp @@ -0,0 +1,109 @@ +#include "toBeSorted/item_mdl_stamina_fruit.h" + +#include "common.h" +#include "d/a/d_a_item.h" +#include "d/a/d_a_itembase.h" +#include "toBeSorted/arc_managers/oarc_manager.h" + +bool dItemMdlStaminaFruit_c::isMdlForItemId(u16 itemId) { + return itemId == ITEM_STAMINA_FRUIT; +} + +bool dItemMdlStaminaFruit_c::init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) { + void *resData1 = OarcManager::GetInstance()->getMdlFromArc2("PutGuts"); + if (resData1 == nullptr) { + return false; + } + nw4r::g3d::ResFile res1(resData1); + if (!res1.IsValid()) { + return false; + } + + nw4r::g3d::ResMdl mdl1 = res1.GetResMdl("PutGuts"); + if (!mdl1.IsValid()) { + return false; + } + if (!mMdl1.create(mdl1, allocator, 0x324)) { + return false; + } + + void *resData2 = OarcManager::GetInstance()->getMdlFromArc2("GetGuts"); + if (resData2 == nullptr) { + return false; + } + nw4r::g3d::ResFile res2(resData2); + if (!res2.IsValid()) { + return false; + } + + nw4r::g3d::ResMdl mdl2 = res2.GetResMdl("GetGuts"); + if (!mdl2.IsValid()) { + return false; + } + if (!mMdl2.create(mdl2, allocator, 0x324)) { + return false; + } + + nw4r::g3d::ResAnmTexSrt anmTexSrt1 = res1.GetResAnmTexSrt("GutsLight"); + if (!anmTexSrt1.IsValid()) { + return false; + } + TRY_CREATE(mAnmTexSrt1.create(mdl1, anmTexSrt1, allocator, nullptr, 1)); + mMdl1.setAnm(mAnmTexSrt1); + + nw4r::g3d::ResAnmTexSrt anmTexSrt2 = res2.GetResAnmTexSrt("GutsLight"); + if (!anmTexSrt2.IsValid()) { + return false; + } + TRY_CREATE(mAnmTexSrt2.create(mdl2, anmTexSrt2, allocator, nullptr, 1)); + mMdl2.setAnm(mAnmTexSrt2); + + mpItem = item; + + return true; +} + +void dItemMdlStaminaFruit_c::vt_0x10(u8 arg) { + if (arg == ITEM_MDL_UNK0x14_3) { + field_0x14 = ITEM_MDL_UNK0x14_1; + } else { + field_0x14 = arg; + } +} + +void dItemMdlStaminaFruit_c::setScale(const mVec3_c &scale) { + mMdl1.setScale(scale); + mMdl2.setScale(scale); +} + +void dItemMdlStaminaFruit_c::setLocalMtx(const mMtx_c &mtx) { + mMdl1.setLocalMtx(mtx); + mMdl2.setLocalMtx(mtx); +} + +void dItemMdlStaminaFruit_c::draw() { + switch (field_0x14) { + case ITEM_MDL_UNK0x14_1: + mAnmTexSrt1.play(); + mpItem->fn_8002ECD0(&mMdl1, 7); + break; + case ITEM_MDL_UNK0x14_2: + mAnmTexSrt2.play(); + mpItem->fn_8002ECD0(&mMdl2, 6); + break; + } +} + +void dItemMdlStaminaFruit_c::vt_0x20(u16 itemId) { + // no-op +} + +void dItemMdlStaminaFruit_c::setPriorityDraw() { + mMdl1.setPriorityDraw(0x82, 0x7F); + mMdl2.setPriorityDraw(0x82, 0x7F); +} + +void dItemMdlStaminaFruit_c::unsetPriorityDraw() { + mMdl1.setPriorityDraw(0x7F, 0x7F); + mMdl2.setPriorityDraw(0x7F, 0x7F); +} From 28b4624ffdeff9adfd53b9673d39d076d9e823ac Mon Sep 17 00:00:00 2001 From: robojumper Date: Thu, 30 Apr 2026 23:32:29 +0200 Subject: [PATCH 05/14] fixup! item_mdl_item OK remove no-op comment --- src/toBeSorted/item_mdl_rupee.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/toBeSorted/item_mdl_rupee.cpp b/src/toBeSorted/item_mdl_rupee.cpp index 70da8be9..148e671b 100644 --- a/src/toBeSorted/item_mdl_rupee.cpp +++ b/src/toBeSorted/item_mdl_rupee.cpp @@ -131,7 +131,6 @@ void dItemMdlRupee_c::draw() { } void dItemMdlRupee_c::vt_0x20(u16 itemId) { - // no-op int i = 0; bool found = false; while (!found && i < ARRAY_LENGTH(sMdlConfig)) { From f0d98002982bfed70817a0d2c110c55dd7b55231 Mon Sep 17 00:00:00 2001 From: robojumper Date: Fri, 1 May 2026 00:22:57 +0200 Subject: [PATCH 06/14] NonMatching item_mdl_rupee to be safe --- configure.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.py b/configure.py index 812b59ab..3358aed1 100644 --- a/configure.py +++ b/configure.py @@ -595,7 +595,7 @@ config.libs = [ Object(Matching, "toBeSorted/counters/extra_wallet_counter.cpp"), Object(Matching, "toBeSorted/item_mdl_misc.cpp"), Object(Matching, "toBeSorted/item_mdl_item.cpp"), - Object(Matching, "toBeSorted/item_mdl_rupee.cpp"), # non-deterministic codegen + Object(NonMatching, "toBeSorted/item_mdl_rupee.cpp"), # should be Matching but non-deterministic codegen Object(Matching, "toBeSorted/item_mdl_light_fruit.cpp"), Object(Matching, "toBeSorted/item_mdl_stamina_fruit.cpp"), Object(NonMatching, "toBeSorted/item_spawn.cpp"), # probably multiple files, see sdata2 From 6046f9bd7cb506cfff17aa1327a3f135867c8ed5 Mon Sep 17 00:00:00 2001 From: robojumper Date: Sat, 2 May 2026 18:21:12 +0200 Subject: [PATCH 07/14] dAcItem_c::{create, createHeap} OK --- config/SOUE01/splits.txt | 3 + config/SOUE01/symbols.txt | 124 ++-- include/d/a/d_a_base.h | 5 +- include/d/a/d_a_item.h | 402 +++++++++++-- include/d/a/d_a_itembase.h | 11 +- include/d/col/bg/d_bg_s_acch.h | 2 +- include/d/col/c/c_cc_d.h | 39 +- include/d/t/d_t_force_get_flag.h | 13 + include/toBeSorted/item_mdl.h | 1 + include/toBeSorted/item_mdl_misc.h | 1 + src/REL/d/a/obj/d_a_obj_barrel.cpp | 2 +- src/REL/d/a/obj/d_a_obj_tumble_weed.cpp | 2 +- src/d/a/d_a_base.cpp | 8 +- src/d/a/d_a_item.cpp | 719 +++++++++++++++++++++++- 14 files changed, 1206 insertions(+), 126 deletions(-) create mode 100644 include/d/t/d_t_force_get_flag.h diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index c3b2827a..af44b95e 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -1501,6 +1501,7 @@ d/a/d_a_item.cpp: .ctors start:0x804DB828 end:0x804DB82C .rodata start:0x804EBBB0 end:0x804ED340 .data start:0x80533268 end:0x80534490 + .sdata start:0x80573968 end:0x805739B0 .sbss start:0x805758B8 end:0x805758E0 .sdata2 start:0x8057BD88 end:0x8057BF80 .bss start:0x805B4490 end:0x805B48A8 @@ -1510,6 +1511,7 @@ d/a/obj/d_a_obj_bomb.cpp: .ctors start:0x804DB82C end:0x804DB830 .rodata start:0x804ED340 end:0x804ED350 .data start:0x80534490 end:0x805347A8 + .sdata start:0x805739B0 end:0x805739C8 .sbss start:0x805758E0 end:0x805758F0 d/a/obj/d_a_obj_arrow.cpp: @@ -1517,6 +1519,7 @@ d/a/obj/d_a_obj_arrow.cpp: .ctors start:0x804DB830 end:0x804DB834 .rodata start:0x804ED350 end:0x804ED380 .data start:0x805347A8 end:0x80534AD0 + .sdata start:0x805739C8 end:0x805739D8 .sbss start:0x805758F0 end:0x80575900 d/a/obj/d_a_obj_boomerang.cpp: diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 3475a99b..1fd503f6 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -13281,10 +13281,10 @@ AcItem__getItemTypeMaybeMaybeFromId = .text:0x80247220; // type:function size:0x AcItem__getItemAnimType = .text:0x80247280; // type:function size:0x44 AcItem__getHeartContainerHeartIncrease = .text:0x802472D0; // type:function size:0x8 AcItem__getCompletedHeatpieceHeartIncrease = .text:0x802472E0; // type:function size:0x8 -divBy5 = .text:0x802472F0; // type:function size:0x24 -getFlagIdxForTear = .text:0x80247320; // type:function size:0x60 -getShiftForTear = .text:0x80247380; // type:function size:0x34 -setDungeonflagForTearnum = .text:0x802473C0; // type:function size:0xB0 +getTearIdx__13dAcItemBase_cFi = .text:0x802472F0; // type:function size:0x24 +getFlagIdxForTear__13dAcItemBase_cFiPUl = .text:0x80247320; // type:function size:0x60 +getTearBit__13dAcItemBase_cFi = .text:0x80247380; // type:function size:0x34 +setDungeonFlagForTear__13dAcItemBase_cFi = .text:0x802473C0; // type:function size:0xB0 getTrialIndex2 = .text:0x80247470; // type:function size:0xA8 fn_80247520 = .text:0x80247520; // type:function size:0xC fn_80247530 = .text:0x80247530; // type:function size:0xC @@ -13329,14 +13329,14 @@ fn_80247950 = .text:0x80247950; // type:function size:0x28 AcItem__isItemFromMitts = .text:0x80247980; // type:function size:0x10 fn_80247990 = .text:0x80247990; // type:function size:0x8 getRandomEntryFromWeightedList = .text:0x802479A0; // type:function size:0x17C -determineActualItemIdFromItem = .text:0x80247B20; // type:function size:0x84 +determineActualItemIdFromItem__9dAcItem_cFUs = .text:0x80247B20; // type:function size:0x84 fn_80247BB0 = .text:0x80247BB0; // type:function size:0x10C m3d__smdl_c__getNodePos = .text:0x80247CC0; // type:function size:0x58 fn_80247D20 = .text:0x80247D20; // type:function size:0x14C fn_80247E70 = .text:0x80247E70; // type:function size:0x50 increment = .text:0x80247EC0; // type:function size:0x28 fn_80247EF0 = .text:0x80247EF0; // type:function size:0xA4 -fn_80247FA0 = .text:0x80247FA0; // type:function size:0x8 +getItemId__13dAcItemBase_cFv = .text:0x80247FA0; // type:function size:0x8 fn_80247FB0 = .text:0x80247FB0; // type:function size:0x8 dAcItem_c_classInit__Fv = .text:0x80247FC0; // type:function size:0x30 AcItem__dontForceDemo = .text:0x80247FF0; // type:function size:0x8 @@ -13354,8 +13354,8 @@ __dt__24sFStateFct_c<9dAcItem_c>Fv = .text:0x80248330; // type:function size:0x6 __dt__77sStateMgr_c<9dAcItem_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x802483A0; // type:function size:0xA0 __dt__47sFStateMgr_c<9dAcItem_c,20sStateMethodUsr_FI_c>Fv = .text:0x80248440; // type:function size:0xA4 __dt__9dAcItem_cFv = .text:0x802484F0; // type:function size:0x248 -fn_80248740 = .text:0x80248740; // type:function size:0x40 -fn_80248780 = .text:0x80248780; // type:function size:0x40 +__dt__13dAcItem_0xB3CFv = .text:0x80248740; // type:function size:0x40 +__dt__13dAcItem_0xB34Fv = .text:0x80248780; // type:function size:0x40 AcItem__spawnItem = .text:0x802487C0; // type:function size:0x170 spawnItem2 = .text:0x80248930; // type:function size:0xBC fn_802489F0 = .text:0x802489F0; // type:function size:0x298 @@ -13380,7 +13380,7 @@ fn_8024A150 = .text:0x8024A150; // type:function size:0xC fn_8024A160 = .text:0x8024A160; // type:function size:0x34 spawnItem22 = .text:0x8024A1A0; // type:function size:0x4 AcItem__getItemIdFromParam = .text:0x8024A1B0; // type:function size:0x8 -AcItem__getSubtypeFromParam = .text:0x8024A1C0; // type:function size:0x8 +getSubtypeFromParam__9dAcItem_cFUl = .text:0x8024A1C0; // type:function size:0x8 playSpawnRupeeSound = .text:0x8024A1D0; // type:function size:0x1C playSpawnHeartSound = .text:0x8024A1F0; // type:function size:0x1C playSpawnItemSound = .text:0x8024A210; // type:function size:0x1C @@ -13388,16 +13388,16 @@ fn_8024A230 = .text:0x8024A230; // type:function size:0x30 AcItem__setupItemParams = .text:0x8024A260; // type:function size:0x3C fn_8024A2A0 = .text:0x8024A2A0; // type:function size:0x10 AcItem__getItemId = .text:0x8024A2B0; // type:function size:0x8 -AcItem__getTearNumber = .text:0x8024A2C0; // type:function size:0xC -getFirstBitParams2 = .text:0x8024A2D0; // type:function size:0x24 +getTearIdx__9dAcItem_cFv = .text:0x8024A2C0; // type:function size:0xC +getFirstBitParams2__9dAcBase_cCFv = .text:0x8024A2D0; // type:function size:0x24 getParams2Lower_shift1_0x7__9dAcItem_cCFv = .text:0x8024A300; // type:function size:0x24 getCurrentTrial__9dAcItem_cFv = .text:0x8024A330; // type:function size:0x68 getTearSubtype__9dAcItem_cF7ITEM_ID = .text:0x8024A3A0; // type:function size:0x68 AcItem__GetItemGetType = .text:0x8024A410; // type:function size:0x3C AcItem__getItemListElement = .text:0x8024A450; // type:function size:0x8 AcItem__getFinalDeterminedItemId = .text:0x8024A460; // type:function size:0x8 -AcItem__initModels = .text:0x8024A470; // type:function size:0x75C -AcItem__init = .text:0x8024ABD0; // type:function size:0x2888 +createHeap__9dAcItem_cFv = .text:0x8024A470; // type:function size:0x75C +create__9dAcItem_cFv = .text:0x8024ABD0; // type:function size:0x2888 changeState__77sStateMgr_c<9dAcItem_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x8024D460; // type:function size:0x10 getStateID__77sStateMgr_c<9dAcItem_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x8024D470; // type:function size:0x10 AcItem__destroy = .text:0x8024D480; // type:function size:0xEC @@ -13405,10 +13405,10 @@ AcItem__update = .text:0x8024D570; // type:function size:0x66C executeState__77sStateMgr_c<9dAcItem_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8024DBE0; // type:function size:0x10 AcItem__draw = .text:0x8024DBF0; // type:function size:0x304 setNumberOfItems = .text:0x8024DF00; // type:function size:0x8 -AcItem__setFreestandingYOffset = .text:0x8024DF10; // type:function size:0x8 +setFreestandingYOffset__9dAcItem_cFf = .text:0x8024DF10; // type:function size:0x8 AcItem__setFramesInAir = .text:0x8024DF20; // type:function size:0x8 fn_8024DF30 = .text:0x8024DF30; // type:function size:0x8 -isItemDropFromEnemy = .text:0x8024DF40; // type:function size:0x24 +isItemDropFromEnemy__9dAcItem_cCFv = .text:0x8024DF40; // type:function size:0x24 resetNumberOfItems = .text:0x8024DF70; // type:function size:0xC AcItem__resetFramesInAir = .text:0x8024DF80; // type:function size:0x8 AcItem__incrementFramesInAir = .text:0x8024DF90; // type:function size:0x44 @@ -13487,20 +13487,20 @@ AcItem__isBombDrop = .text:0x80250BB0; // type:function size:0x58 isTear__9dAcItem_cF7ITEM_ID = .text:0x80250C10; // type:function size:0x78 AcItem__is_Larvae_Ore_JellyBlob_Claw_Horn_EvilCryst_OrnSkull_GoldSkull = .text:0x80250C90; // type:function size:0xB8 AcItem__isBug = .text:0x80250D50; // type:function size:0x7C -AcItem__isTreasure = .text:0x80250DD0; // type:function size:0x138 +isTreasure2__9dAcItem_cF7ITEM_ID = .text:0x80250DD0; // type:function size:0x138 isTreasure__9dAcItem_cF7ITEM_ID = .text:0x80250F10; // type:function size:0x88 -AcItem__isItemHeart = .text:0x80250FA0; // type:function size:0x34 +isHeart2__9dAcItem_cCFv = .text:0x80250FA0; // type:function size:0x34 isSingleArrow__9dAcItem_cCFv = .text:0x80250FE0; // type:function size:0x8 -isBundleOrArrows = .text:0x80250FF0; // type:function size:0x8 -AcItem__isItemSilverRupee = .text:0x80251000; // type:function size:0x8 -AcItem__isItemGoldRupee = .text:0x80251010; // type:function size:0x8 +isArrowBundle__9dAcItem_cCFv = .text:0x80250FF0; // type:function size:0x8 +isSilverRupee__9dAcItem_cCFv = .text:0x80251000; // type:function size:0x8 +isGoldRupee__9dAcItem_cCFv = .text:0x80251010; // type:function size:0x8 AcItem__isKeyPiece2 = .text:0x80251020; // type:function size:0x8 isItem10DekuSeeds = .text:0x80251030; // type:function size:0x8 -AcItem__isHeartPiece2 = .text:0x80251040; // type:function size:0x8 +isHeartPiece__9dAcItem_cCFv = .text:0x80251040; // type:function size:0x8 AcItem__isItemBirdStatuette = .text:0x80251050; // type:function size:0x8 AcItem__isLifeTreeFruit = .text:0x80251060; // type:function size:0x8 AcItem__isItemAnyRupee = .text:0x80251070; // type:function size:0x34 -AcItem__isItemAnyTear = .text:0x802510B0; // type:function size:0x8 +isAnyTear__9dAcItem_cCFv = .text:0x802510B0; // type:function size:0x8 AcItem__isBombRefill = .text:0x802510C0; // type:function size:0x8 isTriforce__9dAcItem_cCFv = .text:0x802510D0; // type:function size:0x8 fn_802510E0 = .text:0x802510E0; // type:function size:0x44 @@ -13674,11 +13674,11 @@ fn_80252AA0 = .text:0x80252AA0; // type:function size:0xC itemGetBirdMaybe = .text:0x80252AB0; // type:function size:0x40 itemGetEventStart__9dAcItem_cFP9dAcBase_c = .text:0x80252AF0; // type:function size:0xD8 itemGetEventEnd__9dAcItem_cFP9dAcBase_c = .text:0x80252BD0; // type:function size:0x90 -AcItem__getItemId2 = .text:0x80252C60; // type:function size:0x8 +getItemId2__9dAcItem_cCFv = .text:0x80252C60; // type:function size:0x8 AcItem__setFinalDeterminedItemId = .text:0x80252C70; // type:function size:0x8 getItemInitStructForItem = .text:0x80252C80; // type:function size:0x5C -AcItem__getItemInitStruct = .text:0x80252CE0; // type:function size:0x8 -AcItem__getItemFlagStruct = .text:0x80252CF0; // type:function size:0x54 +getItemInitStruct__9dAcItem_cCFv = .text:0x80252CE0; // type:function size:0x8 +getItemFlagStruct__13dAcItemBase_cFUs = .text:0x80252CF0; // type:function size:0x54 AcItem__setFlagForItem = .text:0x80252D50; // type:function size:0x34 AcItem__checkFlagForItem2 = .text:0x80252D90; // type:function size:0x34 AcItem__setItemFlagBasedOnId = .text:0x80252DD0; // type:function size:0x34 @@ -13689,7 +13689,7 @@ AcItem__setBoundingBox = .text:0x80252EF0; // type:function size:0x88 fn_80252F80 = .text:0x80252F80; // type:function size:0x88 fn_80253010 = .text:0x80253010; // type:function size:0x88 fn_802530A0 = .text:0x802530A0; // type:function size:0xFC -AcItem__setBoundingBox2 = .text:0x802531A0; // type:function size:0x28 +applyBoundingBox__9dAcItem_cFv = .text:0x802531A0; // type:function size:0x28 AcItem__performCollection1&2 = .text:0x802531D0; // type:function size:0x34 AcItem__performCollection1 = .text:0x80253210; // type:function size:0x7E4 AcItem__performCollection2 = .text:0x80253A00; // type:function size:0x350 @@ -13698,7 +13698,7 @@ fn_80253E20 = .text:0x80253E20; // type:function size:0xC fn_80253E30 = .text:0x80253E30; // type:function size:0x15C fn_80253F90 = .text:0x80253F90; // type:function size:0xC AcItem__shouldDespawn = .text:0x80253FA0; // type:function size:0xC4 -AcItem__onTouchLink = .text:0x80254070; // type:function size:0x1EC +onTouchLink__9dAcItem_cFv = .text:0x80254070; // type:function size:0x1EC AcItem__decideOnGetOrForcedGet = .text:0x80254260; // type:function size:0x80 fn_802542E0 = .text:0x802542E0; // type:function size:0xA4 AcItem__checkAbovePosition = .text:0x80254390; // type:function size:0x78 @@ -13714,11 +13714,11 @@ fn_802548A0 = .text:0x802548A0; // type:function size:0x5C fn_80254900 = .text:0x80254900; // type:function size:0x2C fn_80254930 = .text:0x80254930; // type:function size:0x24 AcItem__isSmallKeyStaminaFruitorHeartPiece = .text:0x80254960; // type:function size:0x64 -AcItem__setupUnkColliderFlags2 = .text:0x802549D0; // type:function size:0x1D0 +setupUnkColliderFlags2__9dAcItem_cFv = .text:0x802549D0; // type:function size:0x1D0 fn_80254BA0 = .text:0x80254BA0; // type:function size:0xC fn_80254BB0 = .text:0x80254BB0; // type:function size:0x10 fn_80254BC0 = .text:0x80254BC0; // type:function size:0xCC -AcItem__setDespawnTimer = .text:0x80254C90; // type:function size:0x10 +setDespawnTimer__9dAcItem_cFUs = .text:0x80254C90; // type:function size:0x10 fn_80254CA0 = .text:0x80254CA0; // type:function size:0xC AcItem__noLongerWaiting = .text:0x80254CB0; // type:function size:0xC fn_80254CC0 = .text:0x80254CC0; // type:function size:0x4C @@ -13884,26 +13884,26 @@ AcItem__addGetEvent = .text:0x802567F0; // type:function size:0xBC makeLinkLookTowardItem = .text:0x802568B0; // type:function size:0x98 AcItem__addToGetQueue = .text:0x80256950; // type:function size:0x7C AcItem__removeFromGetQueue = .text:0x802569D0; // type:function size:0x80 -fn_80256A50 = .text:0x80256A50; // type:function size:0x84 -AcItem__isSmallKey = .text:0x80256AE0; // type:function size:0x14 +hitCallback__9dAcItem_cFP12dAcObjBase_cP8cCcD_ObjP12dAcObjBase_cP8cCcD_Obj = .text:0x80256A50; // type:function size:0x84 +isSmallKey__9dAcItem_cCFv = .text:0x80256AE0; // type:function size:0x14 isAnyRupee = .text:0x80256B00; // type:function size:0x98 -AcItem__isItemGreenRupee = .text:0x80256BA0; // type:function size:0x8 -AcItem__isItemBlueRupee = .text:0x80256BB0; // type:function size:0x8 -AcItem__isItemRedRupee = .text:0x80256BC0; // type:function size:0x8 -AcItem__isHeart2 = .text:0x80256BD0; // type:function size:0x8 -AcItem__isItemRupoor = .text:0x80256BE0; // type:function size:0x8 -AcItem__is5GratitudeCrystals = .text:0x80256BF0; // type:function size:0x8 -AcItem__isLightFruit = .text:0x80256C00; // type:function size:0x8 -AcItem__isGratitudeCrystal = .text:0x80256C10; // type:function size:0x8 -AcItem__isItemSlingshot = .text:0x80256C20; // type:function size:0x8 -AcItem__isItemBabyRattle = .text:0x80256C30; // type:function size:0x8 -AcItem__isEldinOre2 = .text:0x80256C40; // type:function size:0x8 -AcItem__isJellyBlob2 = .text:0x80256C50; // type:function size:0x8 -AcItem__isAnyRupee = .text:0x80256C60; // type:function size:0x8 +isGreenRupee__9dAcItem_cCFv = .text:0x80256BA0; // type:function size:0x8 +isBlueRupee__9dAcItem_cCFv = .text:0x80256BB0; // type:function size:0x8 +isRedRupee__9dAcItem_cCFv = .text:0x80256BC0; // type:function size:0x8 +isHeart__9dAcItem_cCFv = .text:0x80256BD0; // type:function size:0x8 +isRupoor__9dAcItem_cCFv = .text:0x80256BE0; // type:function size:0x8 +is5GratitudeCrystals__9dAcItem_cCFv = .text:0x80256BF0; // type:function size:0x8 +isLightFruit__9dAcItem_cCFv = .text:0x80256C00; // type:function size:0x8 +isGratitudeCrystal__9dAcItem_cCFv = .text:0x80256C10; // type:function size:0x8 +isSlingshot__9dAcItem_cCFv = .text:0x80256C20; // type:function size:0x8 +isBabyRattle__9dAcItem_cCFv = .text:0x80256C30; // type:function size:0x8 +isEldinOre__9dAcItem_cCFv = .text:0x80256C40; // type:function size:0x8 +isJellyBlob__9dAcItem_cCFv = .text:0x80256C50; // type:function size:0x8 +isAnyRupee__9dAcItem_cCFv = .text:0x80256C60; // type:function size:0x8 AcItem__isSingleArrowOrBundle = .text:0x80256C70; // type:function size:0x20 -AcItem__isInsect = .text:0x80256C90; // type:function size:0x8 -AcItem__isUnkTreasureGroup1 = .text:0x80256CA0; // type:function size:0x8 -AcItem__isTreasure3 = .text:0x80256CB0; // type:function size:0x8 +isInsect__9dAcItem_cCFv = .text:0x80256C90; // type:function size:0x8 +isUnkTreasureGroup1__9dAcItem_cCFv = .text:0x80256CA0; // type:function size:0x8 +isTreasure3__9dAcItem_cCFv = .text:0x80256CB0; // type:function size:0x8 AcItem__isKeyPiece3 = .text:0x80256CC0; // type:function size:0x34 AcItem__is5GratitudeCrystals2 = .text:0x80256D00; // type:function size:0x34 AcItem__isItemSingleGratitudeCrystal = .text:0x80256D40; // type:function size:0x34 @@ -16988,7 +16988,7 @@ fn_802D5AC0 = .text:0x802D5AC0; // type:function size:0x8 fn_802D5AD0 = .text:0x802D5AD0; // type:function size:0x8 fn_802D5AE0 = .text:0x802D5AE0; // type:function size:0x8 fn_802D5AF0 = .text:0x802D5AF0; // type:function size:0x8 -fn_802D5B00 = .text:0x802D5B00; // type:function size:0x8 +tearIdxToParam__17dTgForceGetFlag_cFl = .text:0x802D5B00; // type:function size:0x8 fn_802D5B10 = .text:0x802D5B10; // type:function size:0x28 fn_802D5B40 = .text:0x802D5B40; // type:function size:0x10 fn_802D5B50 = .text:0x802D5B50; // type:function size:0xC @@ -28527,8 +28527,8 @@ lbl_804EBB94 = .rodata:0x804EBB94; // type:object size:0xC align:4 data:float lbl_804EBBA0 = .rodata:0x804EBBA0; // type:object size:0x10 ITEM_INIT_STRUCTS = .rodata:0x804EBBB0; // type:object size:0x87C DEFAULT_ITEM_INIT_STRUCT = .rodata:0x804EC42C; // type:object size:0x14 -l_item_flag_structs = .rodata:0x804EC440; // type:object size:0x538 scope:local -l_item_types = .rodata:0x804EC978; // type:object size:0x7F8 scope:local +sItemFlagStructs__13dAcItemBase_c = .rodata:0x804EC440; // type:object size:0x538 scope:local +sItemTypeFlags__13dAcItemBase_c = .rodata:0x804EC978; // type:object size:0x7F8 scope:local TRIAL_INDEX_STRUCTS = .rodata:0x804ED170; // type:object size:0x20 GLITTERING_SPORES_CHANCES = .rodata:0x804ED190; // type:object size:0x20 data:4byte lbl_804ED1B0 = .rodata:0x804ED1B0; // type:object size:0x18 @@ -28539,10 +28539,10 @@ lbl_804ED208 = .rodata:0x804ED208; // type:object size:0x20 lbl_804ED228 = .rodata:0x804ED228; // type:object size:0x20 lbl_804ED248 = .rodata:0x804ED248; // type:object size:0x20 RANDOM_ITEM_DEFINITIONS = .rodata:0x804ED268; // type:object size:0x38 data:4byte -lbl_804ED2A0 = .rodata:0x804ED2A0; // type:object size:0x30 +sSrcCyl = .rodata:0x804ED2A0; // type:object size:0x30 AcItem__SHOULD_DEMO_FUNCS = .rodata:0x804ED2D0; // type:object size:0x30 -lbl_804ED300 = .rodata:0x804ED300; // type:object size:0x18 -lbl_804ED318 = .rodata:0x804ED318; // type:object size:0x24 +sCb1s__15dAcItem_0xB3C_2 = .rodata:0x804ED300; // type:object size:0x18 +sCb2s__15dAcItem_0xB3C_2 = .rodata:0x804ED318; // type:object size:0x24 lbl_804ED340 = .rodata:0x804ED340; // type:object size:0x10 align:4 data:float lbl_804ED350 = .rodata:0x804ED350; // type:object size:0x30 lbl_804ED380 = .rodata:0x804ED380; // type:object size:0x30 @@ -36256,7 +36256,9 @@ AcItem__TearGetDemoThings = .data:0x805332C0; // type:object size:0x40 lbl_80533300 = .data:0x80533300; // type:object size:0xE data:string lbl_80533310 = .data:0x80533310; // type:object size:0x11 data:string g_profile_ITEM = .data:0x80533328; // type:object size:0x10 -lbl_80533338 = .data:0x80533338; // type:object size:0x85C +lbl_80533338 = .data:0x80533338; // type:object size:0x834 +lbl_80533B6C = .data:0x80533B6C; // type:object size:0x17 data:string +lbl_80533B84 = .data:0x80533B84; // type:object size:0xD data:string jumptable_80533B94 = .data:0x80533B94; // type:object size:0xE8 scope:local jumptable_80533C7C = .data:0x80533C7C; // type:object size:0xE8 scope:local lbl_80533D64 = .data:0x80533D64; // type:object size:0xC data:4byte @@ -36270,11 +36272,15 @@ __vt__47sFStateMgr_c<9dAcItem_c,20sStateMethodUsr_FI_c> = .data:0x80533F78; // t __vt__77sStateMgr_c<9dAcItem_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x80533FA8; // type:object size:0x30 __vt__24sFStateFct_c<9dAcItem_c> = .data:0x80533FD8; // type:object size:0x18 __vt__21sFState_c<9dAcItem_c> = .data:0x80533FF0; // type:object size:0x18 -lbl_80534008 = .data:0x80534008; // type:object size:0x1C -lbl_80534024 = .data:0x80534024; // type:object size:0x38 -lbl_8053405C = .data:0x8053405C; // type:object size:0x14 -lbl_80534070 = .data:0x80534070; // type:object size:0x3EC -lbl_8053445C = .data:0x8053445C; // type:object size:0x34 +__vt__15dAcItem_0xB3C_2 = .data:0x80534008; // type:object size:0x1C +__vt__15dAcItem_0xB3C_1 = .data:0x80534024; // type:object size:0x1C +__vt__13dAcItem_0xB3C = .data:0x80534040; // type:object size:0x1C +__vt__15dAcItem_0xB34_2 = .data:0x8053405C; // type:object size:0x14 +__vt__15dAcItem_0xB34_1 = .data:0x80534070; // type:object size:0x14 +__vt__13dAcItem_0xB34 = .data:0x80534084; // type:object size:0x14 +__vt__13dAcItemBase_c = .data:0x80534098; // type:object size:0x94 +lbl_80534130 = .data:0x80534130; // type:object size:0x32C +__vt__23sFStateID_c<9dAcItem_c> = .data:0x8053445C; // type:object size:0x34 g_profile_BOMB = .data:0x80534490; // type:object size:0x10 lbl_805344A0 = .data:0x805344A0; // type:object size:0x2C lbl_805344CC = .data:0x805344CC; // type:object size:0xA data:string diff --git a/include/d/a/d_a_base.h b/include/d/a/d_a_base.h index 2eae40a1..f063e4e2 100644 --- a/include/d/a/d_a_base.h +++ b/include/d/a/d_a_base.h @@ -8,6 +8,7 @@ #include "m/m_allocator.h" #include "m/m_angle.h" #include "m/m_vec.h" +#include "sized_string.h" #include "toBeSorted/actor_info.h" #include "toBeSorted/raii_ptr.h" #include "toBeSorted/sound_info.h" @@ -109,8 +110,7 @@ public: /* 0xEE */ u8 mPolyAttr0; /* 0xEF */ u8 mPolyAttr1; /* 0xF0 */ u32 mJStudioActor; - /* 0xF4 */ char someStr[4]; - /* 0xF8 */ char field_0xf8[0xfc - 0xf8]; + /* 0xF4 */ SizedString<8> mSomeStr; public: /* vt 0x08 */ virtual int create(); @@ -240,6 +240,7 @@ public: void setParams2UpperByte(u32 val); static u32 buildParams2(u32 lower, u32 upper); u32 getParams2Lower() const; + u32 getFirstBitParams2() const; static dAcBase_c *findActor(char *objName, dAcBase_c *parent); static dAcBase_c *searchActor(dAcBase_c *parent); // Kinda performs the code of the first param on every actor (second param is optional parent) diff --git a/include/d/a/d_a_item.h b/include/d/a/d_a_item.h index cdaa3115..c6a22cd1 100644 --- a/include/d/a/d_a_item.h +++ b/include/d/a/d_a_item.h @@ -18,10 +18,76 @@ #include "toBeSorted/actor_event.h" #include "toBeSorted/d_emitter.h" #include "toBeSorted/dowsing_target.h" +#include "toBeSorted/item_mdl.h" class dAcItem_0xB34 { public: - virtual ~dAcItem_0xB34(); + virtual ~dAcItem_0xB34() {} + virtual void vt_0x0C() = 0; + virtual void vt_0x10() = 0; +}; + +class dAcItem_0xB34_1 : public dAcItem_0xB34 { +public: + virtual ~dAcItem_0xB34_1() {} + virtual void vt_0x0C() override; + virtual void vt_0x10() override; +}; + +class dAcItem_0xB34_2 : public dAcItem_0xB34 { +public: + virtual ~dAcItem_0xB34_2() {} + virtual void vt_0x0C() override; + virtual void vt_0x10() override; + +private: + /* 0x04 */ u8 _0x04[0x0C - 0x04]; +}; + +class dAcItem_0xB3C { +public: + virtual ~dAcItem_0xB3C() {} + virtual void vt_0x0C(u16) = 0; + virtual void vt_0x10() = 0; + virtual void vt_0x14() = 0; + virtual void vt_0x18() = 0; + +protected: + /* 0x04 */ u8 _0x04[0x08 - 0x04]; +}; + +class dAcItem_0xB3C_1 : public dAcItem_0xB3C { +public: + dAcItem_0xB3C_1(u16, u16) {} + virtual ~dAcItem_0xB3C_1(); + virtual void vt_0x0C(u16) override; + virtual void vt_0x10() override; + virtual void vt_0x14() override; + virtual void vt_0x18() override; +}; + +class dAcItem_0xB3C_2 : public dAcItem_0xB3C { +public: + dAcItem_0xB3C_2(u16 a1, u16 a2) { + mCb1 = sCb1s[a1]; + mCb2 = sCb2s[a2]; + } + virtual ~dAcItem_0xB3C_2(); + virtual void vt_0x0C(u16) override; + virtual void vt_0x10() override; + virtual void vt_0x14() override; + virtual void vt_0x18() override; + +public: + typedef void (dAcItem_0xB3C_2::*Callback1)(); + typedef bool (dAcItem_0xB3C_2::*Callback2)(); + + static Callback1 sCb1s[2]; + static Callback2 sCb2s[3]; + + /* 0x08 */ Callback1 mCb1; + /* 0x14 */ Callback2 mCb2; + /* 0x20 */ u8 _0x20[0x24 - 0x20]; }; class dAcItem_c : public dAcItemBase_c { @@ -29,6 +95,12 @@ public: dAcItem_c(); virtual ~dAcItem_c(); + virtual int create() override; + virtual bool createHeap() override; + + virtual u16 getItemIdFromParams() override; + virtual void setItemId(u16 id); + STATE_FUNC_DECLARE(dAcItem_c, Wait); STATE_FUNC_DECLARE(dAcItem_c, Carry); STATE_FUNC_DECLARE(dAcItem_c, GetBeetle); @@ -84,11 +156,35 @@ public: static bool isSlingshot(ITEM_ID item); static bool isRupee(ITEM_ID item); static bool isKeyPiece(ITEM_ID item); + static bool isTreasure2(ITEM_ID item); static bool isTreasure(ITEM_ID item); static bool isTear(ITEM_ID item); + bool isLightFruit() const; bool isSingleArrow() const; + bool isArrowBundle() const; bool isTriforce() const; + bool isGratitudeCrystal() const; + bool is5GratitudeCrystals() const; + bool isHeart() const; + bool isSmallKey() const; + bool isGreenRupee() const; + bool isBlueRupee() const; + bool isRedRupee() const; + bool isRupoor() const; + bool isSilverRupee() const; + bool isGoldRupee() const; + bool isSlingshot() const; + bool isEldinOre() const; + bool isJellyBlob() const; + bool isUnkTreasureGroup1() const; + bool isHeartPiece() const; + bool isTreasure3() const; + bool isInsect() const; + bool isHeart2() const; + bool isAnyRupee() const; + bool isAnyTear() const; + bool isBabyRattle() const; u32 getParams2Lower_shift1_0x7() const; @@ -138,7 +234,238 @@ private: static bool sIsPerformingInitialCollection; static s32 sCollectionCurrentCount; - /* 0x334 */ UNKTYPE *mpMdl; // Model has its own handling system + static s32 sGetItemPouchSlot; + static s32 sGetItemQuantity; + + static const mVec3_c sFreestandingDowsingOffset; + + typedef bool (dAcItem_c::*sStaticPtmf)(); + static const sStaticPtmf sStaticPtmfs[]; + + static const ItemInitStruct *getItemInitStructForId(u16 itemId); + const ItemInitStruct *getItemInitStruct() const; + bool isItemDropFromEnemy() const; + static u16 determineActualItemIdFromItem(u16); + u16 getItemId2() const; + static s32 getSubtypeFromParam(u32 params); + void setupUnkColliderFlags2(); + static bool hitCallback(dAcObjBase_c *i_actorA, cCcD_Obj *i_objInfA, dAcObjBase_c *i_actorB, cCcD_Obj *i_objInfB); + void fn_80253F90(bool); + void fn_80256790(); + void fn_802567D0(); + void onTouchLink(); + void fn_80255DF0(); + void fn_80254BB0(); + void setDespawnTimer(u16 timer); + void applyBoundingBox(); + s32 getTearIdx(); + void setFreestandingYOffset(f32); + void fn_8024DF30(u32 flags); + + // static PTMF callbacks + bool fn_80248020(); + bool fn_80248010(); + bool fn_80255B30(); + bool fn_80255BA0(); + bool fn_80248040(); + bool fn_80248030(); + bool fn_80255BD0(); + bool fn_80255C40(); + + // PTMF callbacks + f32 fn_80254DE0(); + f32 fn_80254DF0(); + + f32 getSmallKeyFreestandingScale(); + f32 getLowValueRupeeFreestandingScale(); + f32 getHighValueRupeeFreestandingScale(); + f32 getSlingshotFreestandingScale(); + f32 getEldinOreFreestandingScale(); + f32 getJellyBlobFreestandingScale(); + f32 getUnkTreasureGroup1FreestandingScale(); + f32 getHeartPieceFreestandingScale(); + f32 getGratitudeCrystalFreestandingScale(); + f32 getDefaultFreestandingScale(); + + f32 callGetFreestandingModelScale(); + + f32 getTreasure3Scale(); + f32 getInsectScale(); + f32 getDefaultScale(); + + f32 getHighValueRupeePickupScale(); + f32 getDefaultPickupScale(); + + void moveNormal0(); + void moveNormal1(); + void moveSpecial(); + + void fn_802555D0(); + void fn_802555F0(); + + void bounceNone(); + void bounceNormal(); + void bounceRupee(); + + void fn_802558F0(); + void fn_80255AE0(); + void fn_802558E0(); + + bool fn_80248060(); + bool fn_80248050(); + bool fn_80255D50(); + bool fn_80255DB0(); + + void setLowValueRupeeBoundingBox(); + void setHighValueRupeeBoundingBox(); + void setArrowBundleBoundingBox(); + void setDefaultBoundingBox(); + + f32 getSmallKeyGravity1(); + f32 getGreenRupeeGravity1(); + f32 getBlueRupeeGravity1(); + f32 getRedRupeeGravity1(); + f32 getHeartGravity1(); + f32 getSingleArrowGravity1(); + f32 getArrowBundleGravity1(); + f32 getSilverRupeeGravity1(); + f32 getGoldRupeeGravity1(); + f32 getRupoorGravity1(); + f32 get5BombsGravity1(); + f32 get10BombsGravity1(); + f32 getFaroreTearGravity1(); + f32 get5SeedsGravity1(); + f32 getDefaultGravity1(); + + f32 getHeartGravity2(); + + f32 getGreenRupeeGravity3(); + f32 getBlueRupeeGravity3(); + f32 getRedRupeeGravity3(); + f32 getRupoorGravity3(); + f32 getSilverRupeeGravity3(); + f32 getGoldRupeeGravity3(); + + f32 getSmallKeyGravity4(); + f32 getGreenRupeeGravity4(); + f32 getBlueRupeeGravity4(); + f32 getRedRupeeGravity4(); + f32 getHeartGravity4(); + f32 getSingleArrowGravity4(); + f32 getArrowBundleGravity4(); + f32 getSilverRupeeGravity4(); + f32 getGoldRupeeGravity4(); + f32 getRupoorGravity4(); + f32 get5BombsGravity4(); + f32 get10BombsGravity4(); + f32 getFaroreTearGravity4(); + f32 get5SeedsGravity4(); + f32 getDefaultGravit4(); + + f32 getGreenRupeeDirHitKnockback(); + f32 getBlueRupeeDirHitKnockback(); + f32 getRedRupeeDirHitKnockback(); + f32 getSilverRupeeDirHitKnockback(); + f32 getGoldRupeeDirHitKnockback(); + f32 getRupoorDirHitKnockback(); + + f32 getGreenRupeeDirHitKnockbackRand(); + f32 getBlueRupeeDirHitKnockbackRand(); + f32 getRedRupeeDirHitKnockbackRand(); + f32 getSilverRupeeDirHitKnockbackRand(); + f32 getGoldRupeeDirHitKnockbackRand(); + f32 getRupoorDirHitKnockbackRand(); + + f32 getGreenRupeeHitKnockback(); + f32 getBlueRupeeHitKnockback(); + f32 getRedRupeeHitKnockback(); + f32 getSilverRupeeHitKnockback(); + f32 getGoldRupeeHitKnockback(); + f32 getRupoorHitKnockback(); + + f32 getGreenRupeeHitKnockbackRand(); + f32 getBlueRupeeHitKnockbackRand(); + f32 getRedRupeeHitKnockbackRand(); + f32 getSilverRupeeHitKnockbackRand(); + f32 getGoldRupeeHitKnockbackRand(); + f32 getRupoorHitKnockbackRand(); + + f32 getGreenRupeeHitSquareDistance2(); + f32 getBlueRupeeHitSquareDistance2(); + f32 getRedRupeeHitSquareDistance2(); + f32 getSilverRupeeHitSquareDistance2(); + f32 getGoldRupeeHitSquareDistance2(); + f32 getRupoorHitSquareDistance2(); + f32 getHeartHitSquareDistance2(); + + f32 getGreenRupeeDirHitKnockback2(); + f32 getBlueRupeeDirHitKnockback2(); + f32 getRedRupeeDirHitKnockback2(); + f32 getSilverRupeeDirHitKnockback2(); + f32 getGoldRupeeDirHitKnockback2(); + f32 getRupoorDirHitKnockback2(); + f32 getHeartDirHitKnockback2(); + + f32 getGreenRupeeDirHitKnockbackRand2(); + f32 getBlueRupeeDirHitKnockbackRand2(); + f32 getRedRupeeDirHitKnockbackRand2(); + f32 getSilverRupeeDirHitKnockbackRand2(); + f32 getGoldRupeeDirHitKnockbackRand2(); + f32 getRupoorDirHitKnockbackRand2(); + f32 getHeartDirHitKnockbackRand2(); + + f32 getGreenRupeeHitKnockback2(); + f32 getBlueRupeeHitKnockback2(); + f32 getRedRupeeHitKnockback2(); + f32 getSilverRupeeHitKnockback2(); + f32 getGoldRupeeHitKnockback2(); + f32 getRupoorHitKnockback2(); + f32 getHeartHitKnockback2(); + + f32 getGreenRupeeHitKnockbackRand2(); + f32 getBlueRupeeHitKnockbackRand2(); + f32 getRedRupeeHitKnockbackRand2(); + f32 getSilverRupeeHitKnockbackRand2(); + f32 getGoldRupeeHitKnockbackRand2(); + f32 getRupoorHitKnockbackRand2(); + f32 getHeartHitKnockbackRand2(); + + f32 getGreenRupeeDirHitKnockback3(); + f32 getBlueRupeeDirHitKnockback3(); + f32 getRedRupeeDirHitKnockback3(); + f32 getSilverRupeeDirHitKnockback3(); + f32 getGoldRupeeDirHitKnockback3(); + f32 getRupoorDirHitKnockback3(); + f32 getHeartDirHitKnockback3(); + + f32 getGreenRupeeDirHitKnockbackRand3(); + f32 getBlueRupeeDirHitKnockbackRand3(); + f32 getRedRupeeDirHitKnockbackRand3(); + f32 getSilverRupeeDirHitKnockbackRand3(); + f32 getGoldRupeeDirHitKnockbackRand3(); + f32 getRupoorDirHitKnockbackRand3(); + f32 getHeartDirHitKnockbackRand3(); + + f32 getGreenRupeeHitKnockback3(); + f32 getBlueRupeeHitKnockback3(); + f32 getRedRupeeHitKnockback3(); + f32 getSilverRupeeHitKnockback3(); + f32 getGoldRupeeHitKnockback3(); + f32 getRupoorHitKnockback3(); + f32 getHeartHitKnockback3(); + + f32 getGreenRupeeHitKnockbackRand3(); + f32 getBlueRupeeHitKnockbackRand3(); + f32 getRedRupeeHitKnockbackRand3(); + f32 getSilverRupeeHitKnockbackRand3(); + f32 getGoldRupeeHitKnockbackRand3(); + f32 getRupoorHitKnockbackRand3(); + f32 getHeartHitKnockbackRand3(); + + f32 fn_802577C0(); + f32 fn_802577D0(); + + /* 0x334 */ dItemMdl_c *mpMdl; /* 0x338 */ dShadowCircle_c mShdw; /* 0x340 */ mVec3_c field_0x340; /* 0x34C */ nw4r::ut::Color mColorFilter; @@ -157,45 +484,45 @@ private: /* 0xA2C */ dEmitter_c mEff_0xA2C; /* 0xA60 */ dEmitter_c mEff_0xA60; /* 0xA94 */ dAcRef_c mCoveredSand; - /* 0xAA0 */ dAcRef_c mUnkRef; + /* 0xAA0 */ dAcRef_c mForceSignRef; /* 0xAAC */ mVec3_c posCopy; /* 0xAB8 */ fLiNdBa_c mNode; /* 0xAC4 */ ActorEventRelated mEventRelated; /* 0xB14 */ DowsingTarget mDowsingTarget; /* 0xB34 */ dAcItem_0xB34 *field_0xB34[2]; - /* 0xB34 */ dAcItem_0xB34 *field_0xB3C; - /* 0xB40 */ UNKTYPE (dAcItem_c::*mFunc_0xB40)(UNKTYPE); - /* 0xB4C */ UNKTYPE (dAcItem_c::*mFunc_0xB4C)(UNKTYPE); - /* 0xB58 */ UNKTYPE (dAcItem_c::*mFunc_0xB58)(UNKTYPE); - /* 0xB64 */ UNKTYPE (dAcItem_c::*mFunc_0xB64)(UNKTYPE); - /* 0xB70 */ UNKTYPE (dAcItem_c::*mFunc_0xB70)(UNKTYPE); - /* 0xB7C */ UNKTYPE (dAcItem_c::*mFunc_0xB7C)(UNKTYPE); - /* 0xB88 */ UNKTYPE (dAcItem_c::*mFunc_0xB88)(UNKTYPE); - /* 0xB94 */ UNKTYPE (dAcItem_c::*mFunc_0xB94)(UNKTYPE); - /* 0xBA0 */ UNKTYPE (dAcItem_c::*mFunc_0xBA0)(UNKTYPE); + /* 0xB34 */ dAcItem_0xB3C *field_0xB3C; + /* 0xB40 */ void (dAcItem_c::*mFnAction)(); + /* 0xB4C */ void (dAcItem_c::*mFnBounce)(); + /* 0xB58 */ void (dAcItem_c::*mFunc_0xB58)(); + /* 0xB64 */ void (dAcItem_c::*mFnAction3)(); + /* 0xB70 */ bool (dAcItem_c::*mFnAction4)(); + /* 0xB7C */ f32 (dAcItem_c::*mFnGetGravity1)(); + /* 0xB88 */ f32 (dAcItem_c::*mFnGetHeartGravity)(); + /* 0xB94 */ f32 (dAcItem_c::*mFnGetRupeeGravity)(); + /* 0xBA0 */ f32 (dAcItem_c::*mFnGetGravity4)(); /* 0xBAC */ UNKTYPE (dAcItem_c::*mFunc_0xBAC)(UNKTYPE); /* 0xBB8 */ UNKTYPE (dAcItem_c::*mFunc_0xBB8)(UNKTYPE); - /* 0xBC4 */ UNKTYPE (dAcItem_c::*mFunc_0xBC4)(UNKTYPE); - /* 0xBD0 */ UNKTYPE (dAcItem_c::*mFunc_0xBD0)(UNKTYPE); - /* 0xBDC */ UNKTYPE (dAcItem_c::*mFunc_0xBDC)(UNKTYPE); - /* 0xBE8 */ UNKTYPE (dAcItem_c::*mFunc_0xBE8)(UNKTYPE); - /* 0xBF4 */ UNKTYPE (dAcItem_c::*mFunc_0xBF4)(UNKTYPE); - /* 0xC00 */ UNKTYPE (dAcItem_c::*mFunc_0xC00)(UNKTYPE); - /* 0xC0C */ UNKTYPE (dAcItem_c::*mFunc_0xC0C)(UNKTYPE); - /* 0xC18 */ UNKTYPE (dAcItem_c::*mFunc_0xC18)(UNKTYPE); - /* 0xC24 */ UNKTYPE (dAcItem_c::*mFunc_0xC24)(UNKTYPE); - /* 0xC30 */ UNKTYPE (dAcItem_c::*mFunc_0xC30)(UNKTYPE); - /* 0xC3C */ UNKTYPE (dAcItem_c::*mFunc_0xC3C)(UNKTYPE); - /* 0xC48 */ UNKTYPE (dAcItem_c::*mFunc_0xC48)(UNKTYPE); - /* 0xC54 */ UNKTYPE (dAcItem_c::*mFunc_0xC54)(UNKTYPE); - /* 0xC60 */ UNKTYPE (dAcItem_c::*mFunc_0xC60)(UNKTYPE); - /* 0xC6C */ UNKTYPE (dAcItem_c::*mFunc_0xC6C)(UNKTYPE); - /* 0xC78 */ UNKTYPE (dAcItem_c::*mFunc_0xC78)(UNKTYPE); - /* 0xC84 */ UNKTYPE (dAcItem_c::*mFunc_0xC84)(UNKTYPE); - /* 0xC90 */ UNKTYPE (dAcItem_c::*mFunc_0xC90)(UNKTYPE); + /* 0xBC4 */ f32 (dAcItem_c::*mFnGetFreestandingScale)(); + /* 0xBD0 */ f32 (dAcItem_c::*mFnGetScale)(); + /* 0xBDC */ f32 (dAcItem_c::*mFnGetPickupDemoScale)(); + /* 0xBE8 */ f32 (dAcItem_c::*mFnCallGetFreestandingScale)(); + /* 0xBF4 */ f32 (dAcItem_c::*mFnGetDirHitKnockback)(); + /* 0xC00 */ f32 (dAcItem_c::*mFnGetDirHitKnockbackRand)(); + /* 0xC0C */ f32 (dAcItem_c::*mFnGetHitKnockback)(); + /* 0xC18 */ f32 (dAcItem_c::*mFnGetHitKnockbackRand)(); + /* 0xC24 */ f32 (dAcItem_c::*mFnGetHitSquareDistance2)(); + /* 0xC30 */ f32 (dAcItem_c::*mFnGetDirHitKnockback2)(); + /* 0xC3C */ f32 (dAcItem_c::*mFnGetDirHitKnockbackRand2)(); + /* 0xC48 */ f32 (dAcItem_c::*mFnGetHitKnockback2)(); + /* 0xC54 */ f32 (dAcItem_c::*mFnGetHitKnockbackRand2)(); + /* 0xC60 */ f32 (dAcItem_c::*mFnGetDirHitKnockback3)(); + /* 0xC6C */ f32 (dAcItem_c::*mFnGetDirHitKnockbackRand3)(); + /* 0xC78 */ f32 (dAcItem_c::*mFnGetHitKnockback3)(); + /* 0xC84 */ f32 (dAcItem_c::*mFnGetHitKnockbackRand3)(); + /* 0xC90 */ f32 (dAcItem_c::*mFn_0xC90)(); /* 0xC9C */ UNKTYPE (dAcItem_c::*mFunc_0xC9C)(UNKTYPE); - /* 0xCA8 */ UNKTYPE (dAcItem_c::*mFunc_0xCA8)(UNKTYPE); - /* 0xCB4 */ UNKTYPE (dAcItem_c::*mFunc_0xCB4)(UNKTYPE); + /* 0xCA8 */ void (dAcItem_c::*mFnSetBoundingBox)(); + /* 0xCB4 */ f32 (dAcItem_c::*mFn_0xCB4)(void); /* 0xCC0 */ dAcRef_c mItemQueuePrev; /* 0xCCC */ dAcRef_c mItemQueueNext; /* 0xCD8 */ f32 field_0xCD8; @@ -210,11 +537,11 @@ private: /* 0xD08 */ u8 _D08[0xD14 - 0xD08]; /* 0xD14 */ f32 mFreestandingOffsetH; /* 0xD18 */ f32 field_0xD18; - /* 0xD1C */ int mGetItemPouchSlot; - /* 0xD20 */ int field_0xD20; + /* 0xD1C */ s32 mGetItemPouchSlot; + /* 0xD20 */ s32 field_0xD20; /* 0xD24 */ u8 _D24[0xD2C - 0xD24]; /* 0xD2C */ u32 mFramesInAir; - /* 0xD30 */ int mItemQuantity; + /* 0xD30 */ s32 mItemQuantity; /* 0xD34 */ u32 mItemFlags; /* 0xD38 */ mAng3_c field_0xD38; /* 0xD3E */ u16 field_0xD3E; @@ -222,8 +549,7 @@ private: /* 0xD42 */ s16 field_0xD42; /* 0xD44 */ u16 mRealItemId; /* 0xD46 */ s16 mDespawnTimer; - /* 0xD48 */ u8 field_0xD48; - /* 0xD49 */ u8 field_0xD49; + /* 0xD48 */ u16 field_0xD48; /* 0xD4A */ u8 field_0xD4A; /* 0xD4B */ u8 field_0xD4B; /* 0xD4C */ u8 field_0xD4C; diff --git a/include/d/a/d_a_itembase.h b/include/d/a/d_a_itembase.h index 9f91e60d..23f64926 100644 --- a/include/d/a/d_a_itembase.h +++ b/include/d/a/d_a_itembase.h @@ -234,11 +234,17 @@ struct ItemFlagStruct { u8 mFlagKind; u8 field_0x07; }; + +struct ItemInitStruct { + u8 _0x00[0x0D - 0x00]; +}; + class dAcItemBase_c : public dAcObjBase_c { public: dAcItemBase_c() {} virtual ~dAcItemBase_c() {} virtual u16 getItemId(); + virtual u16 getItemIdFromParams() = 0; static bool isValidItemTypeIdx(int itemId); static bool getItemTypeFromId(u16 itemID, u32 *pOutType); @@ -254,9 +260,12 @@ public: return mId; } -private: +protected: u16 mId; + const ItemFlagStruct* getItemFlagStruct() const; + static const ItemFlagStruct* getItemFlagStruct(u16 id); + static const ItemFlagStruct sDefaultFlagStruct; static const ItemFlagStruct sItemFlagStructs[167]; static const u32 sItemTypeFlags[MAX_ITEM_ID - 1]; diff --git a/include/d/col/bg/d_bg_s_acch.h b/include/d/col/bg/d_bg_s_acch.h index 0d12de5d..6756420f 100644 --- a/include/d/col/bg/d_bg_s_acch.h +++ b/include/d/col/bg/d_bg_s_acch.h @@ -388,7 +388,7 @@ public: // bool ChkRoofHit() { // return MaskRoofHit(); // } - void OffClrSpeedY() { + void SetClrSpeedY() { mFlags |= CLR_SPEED_Y; } bool ChkClrSpeedY() { diff --git a/include/d/col/c/c_cc_d.h b/include/d/col/c/c_cc_d.h index 58bf05e9..23e88d40 100644 --- a/include/d/col/c/c_cc_d.h +++ b/include/d/col/c/c_cc_d.h @@ -461,6 +461,10 @@ public: void OffRPrm(u32 m) { mRPrm = (mRPrm & ~m) | m; } + + void SetCallback(cCcD_HitCallback cb) { + mHit_cb = cb; + } }; class cCcD_ObjAt : public cCcD_GAtTgCoCommonBase { @@ -491,10 +495,6 @@ public: return MskSPrm(1); } - void SetCallback(cCcD_HitCallback cb) { - mHit_cb = cb; - } - u32 MskType(u32 mask) const { return mSrc.mType & mask; } @@ -657,6 +657,10 @@ public: field_0x4B = val; } + void SetSrcField_0x0C(u16 val) { + mSrc.field_0x0C = val; + } + void SetInfo_0x1(u8 val) { mSrc.mInfo.field_0x1 = val; } @@ -665,6 +669,10 @@ public: mSrc.mInfo.field_0x2 = val; } + void OnInfo_0x2(u16 val) { + mSrc.mInfo.field_0x2 |= val; + } + public: /* 0x1C */ cCcD_SrcGObjTg mSrc; /* 0x2C */ mVec3_c mAtHitDir; @@ -858,6 +866,10 @@ public: mTg.SetFlag_0xA(flag); } + void SetTgSrcField_0x0C(u16 val) { + mTg.SetSrcField_0x0C(val); + } + bool ChkTgHit() { return mTg.MskRPrm(1) != 0 && mTg.GetActor() != nullptr; } @@ -917,6 +929,10 @@ public: mAt.SetCallback(cb); } + void SetCoCallback(cCcD_HitCallback cb) { + mCo.SetCallback(cb); + } + u32 ChkTgNoAtHitInfSet() const { return mTg.MskSPrm(0x40); } @@ -997,6 +1013,12 @@ public: void OnTgElectric() { return mTg.OnSPrm(0x40000); } + void OnTg_0x800000() { + return mTg.OnSPrm(0x800000); + } + void OnTg_0x1000000() { + return mTg.OnSPrm(0x1000000); + } void OnTg_0x8000000() { return mTg.OnSPrm(0x8000000); } @@ -1006,6 +1028,9 @@ public: void ClrTg_0x10000() { return mTg.OffSPrm(0x10000); } + void ClrTg_0x800000() { + return mTg.OffSPrm(0x800000); + } void ClrTg_0x8000000() { return mTg.OffSPrm(0x8000000); } @@ -1016,6 +1041,9 @@ public: void OnTg_0x200000() { mTg.OnSPrm(0x200000); } + void ClrTg_0x200000() { + mTg.OffSPrm(0x200000); + } void SetTg_0x4B(u8 val) { mTg.Set_0x4B(val); @@ -1026,6 +1054,9 @@ public: void SetTgInfo_0x2(u16 val) { mTg.SetInfo_0x2(val); } + void OnTgInfo_0x2(u16 val) { + mTg.OnInfo_0x2(val); + } void SetTg_0x40000000() { mTg.OnSPrm(0x40000000); } diff --git a/include/d/t/d_t_force_get_flag.h b/include/d/t/d_t_force_get_flag.h new file mode 100644 index 00000000..b2dbcba5 --- /dev/null +++ b/include/d/t/d_t_force_get_flag.h @@ -0,0 +1,13 @@ +#ifndef D_T_FORCE_GET_FLAG_H +#define D_T_FORCE_GET_FLAG_H + +#include "d/t/d_tg.h" + +class dTgForceGetFlag_c : public dTg_c { +public: + static u32 tearIdxToParam(s32 tearNumber); + +private: +}; + +#endif diff --git a/include/toBeSorted/item_mdl.h b/include/toBeSorted/item_mdl.h index 107f9980..d4771617 100644 --- a/include/toBeSorted/item_mdl.h +++ b/include/toBeSorted/item_mdl.h @@ -14,6 +14,7 @@ class dAcItem_c; // vtable at 80533eb0 class dItemMdl_c : public dMdl_c { public: + dItemMdl_c() : field_0x14(ITEM_MDL_UNK0x14_0) {} /* 0x08 */ virtual ~dItemMdl_c() {} /* 0x0C */ virtual bool init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) = 0; /* 0x10 */ virtual void vt_0x10(u8) = 0; diff --git a/include/toBeSorted/item_mdl_misc.h b/include/toBeSorted/item_mdl_misc.h index a595fbcb..d34c9ff1 100644 --- a/include/toBeSorted/item_mdl_misc.h +++ b/include/toBeSorted/item_mdl_misc.h @@ -69,6 +69,7 @@ private: // Maybe a bad name because fairies etc. are also supported class dItemMdlBottle_c : public dItemMdl_c { public: + dItemMdlBottle_c() : mFlags(0) {} /* 0x08 */ virtual ~dItemMdlBottle_c() {} /* 0x0C */ virtual bool init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) override; /* 0x10 */ virtual void vt_0x10(u8) override; diff --git a/src/REL/d/a/obj/d_a_obj_barrel.cpp b/src/REL/d/a/obj/d_a_obj_barrel.cpp index 1955a3dd..a6c3d1ca 100644 --- a/src/REL/d/a/obj/d_a_obj_barrel.cpp +++ b/src/REL/d/a/obj/d_a_obj_barrel.cpp @@ -185,7 +185,7 @@ int dAcOBarrel_c::actorCreate() { } mSph.Set(sSrcSph); mSph.SetStts(mStts); - mObjAcch.OffClrSpeedY(); + mObjAcch.SetClrSpeedY(); mAcceleration = -4.f; mMaxSpeed = -40.f; diff --git a/src/REL/d/a/obj/d_a_obj_tumble_weed.cpp b/src/REL/d/a/obj/d_a_obj_tumble_weed.cpp index bbe61c61..1c89e7f2 100644 --- a/src/REL/d/a/obj/d_a_obj_tumble_weed.cpp +++ b/src/REL/d/a/obj/d_a_obj_tumble_weed.cpp @@ -51,7 +51,7 @@ int dAcOTumbleWeed_c::actorCreate() { mObjAcch.Set(this, 1, &mAcchCir); mAcchCir.SetWall(20.f, 60.f); - mObjAcch.OffClrSpeedY(); + mObjAcch.SetClrSpeedY(); mObjAcch.SetGndThinCellingOff(); mStts.SetRank(3); diff --git a/src/d/a/d_a_base.cpp b/src/d/a/d_a_base.cpp index 8619d9b2..9fac1e7a 100644 --- a/src/d/a/d_a_base.cpp +++ b/src/d/a/d_a_base.cpp @@ -53,10 +53,8 @@ dAcBase_c::dAcBase_c() mViewClipIdx(s_Create_ViewClipIdx), mActorNode(nullptr), mRoomID(s_Create_RoomId), - mActorSubtype(s_Create_Subtype) { - mJStudioActor = 0; - someStr[0] = 0; - + mActorSubtype(s_Create_Subtype), + mJStudioActor(0) { if (s_Create_Position) { setPosition(*s_Create_Position); } @@ -80,7 +78,7 @@ dAcBase_c::dAcBase_c() if (mpActorInfo == nullptr) { mpActorInfo = getActorInfoByProfileAndSubtype(mProfileName, mActorSubtype); } - someStr[0] = '\0'; + mSomeStr.empty(); } dAcBase_c::~dAcBase_c() {} diff --git a/src/d/a/d_a_item.cpp b/src/d/a/d_a_item.cpp index 1d4bcee5..8bbda693 100644 --- a/src/d/a/d_a_item.cpp +++ b/src/d/a/d_a_item.cpp @@ -1,12 +1,28 @@ #include "d/a/d_a_item.h" +#include "c/c_math.h" #include "common.h" #include "d/a/d_a_itembase.h" +#include "d/col/bg/d_bg_s.h" +#include "d/col/cc/d_cc_d.h" +#include "d/d_pouch.h" +#include "d/d_sc_game.h" #include "d/flag/dungeonflag_manager.h" -#include "d/flag/flag_index.h" +#include "d/flag/sceneflag_manager.h" +#include "d/flag/storyflag_manager.h" +#include "d/snd/d_snd_small_effect_mgr.h" +#include "d/snd/d_snd_wzsound.h" +#include "d/t/d_t_force_get_flag.h" #include "f/f_list_mg.h" +#include "f/f_profile_name.h" +#include "m/m_vec.h" #include "toBeSorted/dowsing_target.h" -#include "toBeSorted/file_manager.h" +#include "toBeSorted/event_manager.h" +#include "toBeSorted/item_mdl_item.h" +#include "toBeSorted/item_mdl_light_fruit.h" +#include "toBeSorted/item_mdl_misc.h" +#include "toBeSorted/item_mdl_rupee.h" +#include "toBeSorted/item_mdl_stamina_fruit.h" const ItemFlagStruct dAcItemBase_c::sDefaultFlagStruct = {0x28, 0x3C, 0x1E, 0xFF, 0x0000, 0x02, 0x01}; const ItemFlagStruct dAcItemBase_c::sItemFlagStructs[167] = { @@ -219,6 +235,42 @@ const u32 dAcItemBase_c::sItemTypeFlags[MAX_ITEM_ID - 1] = { 0xFFFF, 0x0, 0x0, 0x0, 0x0, 0x0, }; +static const dCcD_SrcCyl sSrcCyl = { + {{0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0}, + {~(AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000 | AT_TYPE_WIND), + 0x111, + {0, 0x08, 0x407}, + 0, + 0}, + {0xE9}}, + {40.0f, 60.0f} +}; + +static const char *const sResNodeName = "Set"; +/* static */ extern const char *const sDefaultGetItem = "DefaultGetItem"; +/* static */ extern const char *const sItemGetGorgeous = "ItemGetGorgeous"; +/* static */ extern const char *const sItemGetDefaultTbox = "ItemGetDefaultTBox"; +/* static */ extern const char *const sItemGetGorgeousTbox = "ItemGetGorgeousTBox"; +/* static */ extern const char *const sItemGetBird = "ItemGetBird"; + +struct TearIdIdx { + s32 idx; + u16 itemId; + u32 _0x04; + u32 _0x08; +}; + +/* static */ extern "C" TearIdIdx sTearIdxes[] = { + {0, ITEM_FARORE_TEAR}, + {1, ITEM_DIN_TEAR}, + {2, ITEM_NAYRU_TEAR}, + {3, ITEM_SACRED_TEAR}, +}; + +/* static */ extern const char *const sGetFairyBody = "GetFairy_body"; +/* static */ extern const char *const sBottleFairy_body = "BottleFairy_body"; + + bool dAcItemBase_c::isValidItemTypeIdx(int itemId) { return itemId < ARRAY_LENGTH(sItemTypeFlags); } @@ -306,18 +358,22 @@ fLiMgBa_c dAcItem_c::sItemList; SPECIAL_ACTOR_PROFILE(ITEM, dAcItem_c, fProfile::ITEM, 0x2B, 0, 2); -STATE_DEFINE(dAcItem_c, Wait); -STATE_DEFINE(dAcItem_c, Carry); -STATE_DEFINE(dAcItem_c, GetBeetle); -STATE_DEFINE(dAcItem_c, WaitGet); -STATE_DEFINE(dAcItem_c, Get); -STATE_DEFINE(dAcItem_c, WaitGetDemo); -STATE_DEFINE(dAcItem_c, WaitForcedGetDemo); -STATE_DEFINE(dAcItem_c, GetDemo); -STATE_DEFINE(dAcItem_c, WaitTBoxGetDemo); -STATE_DEFINE(dAcItem_c, ResurgeWait); -STATE_DEFINE(dAcItem_c, WaitTurnOff); -STATE_DEFINE(dAcItem_c, WaitSacredDewGetEffect); +const mVec3_c dAcItem_c::sFreestandingDowsingOffset(0.0f, 25.0f, 0.0f); + +const dAcItem_c::sStaticPtmf dAcItem_c::sStaticPtmfs[] = { + &dAcItem_c::fn_80248020, + nullptr, + &dAcItem_c::fn_80248010, + nullptr, + &dAcItem_c::fn_80255B30, + &dAcItem_c::fn_80255BA0, + &dAcItem_c::fn_80248040, + nullptr, + &dAcItem_c::fn_80248030, + nullptr, + &dAcItem_c::fn_80255BD0, + &dAcItem_c::fn_80255C40, +}; dAcItem_c::dAcItem_c() : mStateMgr(*this), @@ -360,14 +416,649 @@ dAcItem_c::dAcItem_c() sItemList.append(&mNode); mTargetFiRelated = 3; } + dAcItem_c::~dAcItem_c() { delete field_0xB3C; for (int i = 0; i < 2; i++) { delete field_0xB34[i]; } + delete mpMdl; mDowsingTarget.doUnregister(); } +bool dAcItem_c::createHeap() { + if (dItemMdlPut_c::isMdlForItemId(mRealItemId)) { + mpMdl = new dItemMdlPut_c(); + } else if (dItemMdlShield_c::isMdlForItemId(mRealItemId)) { + mpMdl = new dItemMdlShield_c(); + } else if (dItemMdlBottle_c::isMdlForItemId(mRealItemId)) { + mpMdl = new dItemMdlBottle_c(); + } else if (dItemMdlTear_c::isMdlForItemId(mRealItemId)) { + mpMdl = new dItemMdlTear_c(); + } else if (dItemMdlFirefly_c::isMdlForItemId(mRealItemId)) { + mpMdl = new dItemMdlFirefly_c(); + } else if (dItemMdlPotion_c::isMdlForItemId(mRealItemId)) { + mpMdl = new dItemMdlPotion_c(); + } else if (dItemMdlItem_c::isMdlForItemId(mRealItemId)) { + mpMdl = new dItemMdlItem_c(); + } else if (dItemMdlRupee_c::isMdlForItemId(mRealItemId)) { + mpMdl = new dItemMdlRupee_c(); + } else if (dItemMdlLightFruit_c::isMdlForItemId(mRealItemId)) { + mpMdl = new dItemMdlLightFruit_c(); + } else if (dItemMdlStaminaFruit_c::isMdlForItemId(mRealItemId)) { + mpMdl = new dItemMdlStaminaFruit_c(); + } else { + return false; + } + + if (mpMdl == nullptr) { + return false; + } + + if (!mpMdl->init(mRealItemId, this, &mAllocator)) { + return false; + } + + field_0xB34[0] = new dAcItem_0xB34_1(); + if (field_0xB34[0] == nullptr) { + return false; + } + field_0xB34[1] = new dAcItem_0xB34_2(); + if (field_0xB34[1] == nullptr) { + return false; + } + + if (getItemInitStruct()->_0x00[6] != 0) { + field_0xB3C = new dAcItem_0xB3C_2(getItemInitStruct()->_0x00[4], getItemInitStruct()->_0x00[5]); + if (mId == ITEM_STAMINA_FRUIT) { + // TODO ... + field_0xB3C->vt_0x0C(150 /* 0x96 */); + } else if (isLightFruit()) { + field_0xB3C->vt_0x0C(0 /* 0x0 */); + } + } else { + field_0xB3C = new dAcItem_0xB3C_1(getItemInitStruct()->_0x00[4], getItemInitStruct()->_0x00[5]); + } + + if (field_0xB3C == nullptr) { + return false; + } + + return true; +} + +// TODO this function pools .data but doesn't pool .bss for some reason +int dAcItem_c::create() { + u32 flag = getFromParams(0xA, 0xFF); + if (flag < 0xFF && SceneflagManager::sInstance->checkBoolFlag(mRoomID, flag)) { + return FAILED; + } + + u32 paramId = getItemIdFromParams(); + if (paramId == ITEM_NONE) { + return FAILED; + } + + if (isItemDropFromEnemy()) { + mId = determineActualItemIdFromItem(paramId); + } else { + mId = paramId; + } + + if (isGratitudeCrystal()) { + if (!StoryflagManager::sInstance->getCounterOrFlag(STORYFLAG_GRATITUDE_QUEST_STARTED) || !dScGame_c::currentSpawnInfo.isNight()) { + return FAILED; + } + } else if (isHeart()) { + if (isItemDropFromEnemy() && dScGame_c::isHeroMode()) { + switch (adventurePouchCountItem(ITEM_HEART_MEDAL)) { + case 0: return FAILED; + case 1: + if (cM::rndInt(2) < 1) { + return FAILED; + } + } + } + } + + setItemId(getItemId2()); + + switch (getItemInitStruct()->_0x00[9]) { + case 0: + mFn_0xC90 = &dAcItem_c::fn_80254DE0; + break; + case 1: + mFn_0xC90 = &dAcItem_c::fn_80254DF0; + break; + default: + return FAILED; + } + + if (isSmallKey()) { + mFnGetFreestandingScale = &dAcItem_c::getSmallKeyFreestandingScale; + } else if (isGreenRupee() || isBlueRupee() || isRedRupee() || isRupoor()) { + mFnGetFreestandingScale = &dAcItem_c::getLowValueRupeeFreestandingScale; + } else if (isSilverRupee() || isGoldRupee()) { + mFnGetFreestandingScale = &dAcItem_c::getHighValueRupeeFreestandingScale; + } else if (isSlingshot()) { + mFnGetFreestandingScale = &dAcItem_c::getSlingshotFreestandingScale; + } else if (isEldinOre()) { + mFnGetFreestandingScale = &dAcItem_c::getEldinOreFreestandingScale; + } else if (isJellyBlob()) { + mFnGetFreestandingScale = &dAcItem_c::getJellyBlobFreestandingScale; + } else if (isUnkTreasureGroup1()) { + mFnGetFreestandingScale = &dAcItem_c::getUnkTreasureGroup1FreestandingScale; + } else if (isHeartPiece()) { + mFnGetFreestandingScale = &dAcItem_c::getHeartPieceFreestandingScale; + } else if (isGratitudeCrystal()) { + mFnGetFreestandingScale = &dAcItem_c::getGratitudeCrystalFreestandingScale; + } else { + mFnGetFreestandingScale = &dAcItem_c::getDefaultFreestandingScale; + } + + if (isTreasure3()) { + mFnGetScale = &dAcItem_c::getTreasure3Scale; + } else if (isInsect()) { + mFnGetScale = &dAcItem_c::getInsectScale; + } else { + mFnGetScale = &dAcItem_c::getDefaultScale; + } + + if (isSilverRupee() || isGoldRupee()) { + mFnGetPickupDemoScale = &dAcItem_c::getHighValueRupeePickupScale; + } else { + mFnGetPickupDemoScale = &dAcItem_c::getDefaultPickupScale; + } + + mFnCallGetFreestandingScale = &dAcItem_c::callGetFreestandingModelScale; + + switch (getItemInitStruct()->_0x00[10]) { + case 0: + mFnAction = &dAcItem_c::moveNormal0; + break; + case 1: + mFnAction = &dAcItem_c::moveNormal1; + break; + case 2: + mFnAction = &dAcItem_c::moveSpecial; + break; + default: + return FAILED; + } + + if (isHeart2()) { + mFunc_0xB58 = &dAcItem_c::fn_802555F0; + } else { + mFunc_0xB58 = &dAcItem_c::fn_802555D0; + } + + if (isAnyRupee()) { + mFnBounce = &dAcItem_c::bounceRupee; + } else if (isHeart2()) { + mFnBounce = &dAcItem_c::bounceNone; + } else { + mFnBounce = &dAcItem_c::bounceNormal; + } + + if (isAnyRupee()) { + mFnAction3 = &dAcItem_c::fn_802558F0; + } else if (isAnyTear() || isTriforce() || isHeartPiece()) { + mFnAction3 = &dAcItem_c::fn_80255AE0; + } else { + mFnAction3 = &dAcItem_c::fn_802558E0; + } + + if (getItemInitStruct()->_0x00[8] == 0) { + mFnAction4 = &dAcItem_c::fn_80248060; + } else if (getItemInitStruct()->_0x00[8] == 1) { + mFnAction4 = &dAcItem_c::fn_80248050; + } else if (getItemInitStruct()->_0x00[8] == 2) { + mFnAction4 = &dAcItem_c::fn_80255D50; + } else if (getItemInitStruct()->_0x00[8] == 3) { + mFnAction4 = &dAcItem_c::fn_80255DB0; + } else if (getItemInitStruct()->_0x00[8] == 4) { + mFnAction4 = &dAcItem_c::fn_80248060; + } else { + return FAILED; + } + + mSubtype = mId; + + CREATE_ALLOCATOR(dAcItem_c); + + if (!getFromParams(0x13, 0x1)) { + mpMdl->setPriorityDraw(); + } + mStts.SetRank(1); + mCyl.Set(sSrcCyl); + mCyl.SetStts(mStts); + mCyl.SetR(getItemFlagStruct(mId)->field_0x00); + mCyl.SetH(getItemFlagStruct(mId)->field_0x01); + + setupUnkColliderFlags2(); + + if (isAnyRupee()) { + mCyl.OnTgInfo_0x2(0x8); + mCyl.SetTgSrcField_0x0C(0x8); + } + + u32 unk = getParams2Lower_shift1_0x7(); + if ((mId == ITEM_STAMINA_FRUIT && unk) || isLightFruit() || isAnyTear() || isTriforce() || isGratitudeCrystal()) { + mCyl.SetCoGrp(0x2); + } else { + mCyl.SetCoGrp(0xE); + } + + if (mId == ITEM_STAMINA_FRUIT || isHeartPiece() || isTriforce()) { + mCyl.ClrTg_0x800000(); + } else { + mCyl.OnTg_0x800000(); + } + + if (isHeartPiece()) { + mCyl.OnTg_0x1000000(); + } + + if (isHeartPiece()) { + mCyl.SetTg_0x4C(0x6CC0); + } else if (isBabyRattle()) { + mCyl.SetTg_0x4C(0x6480); + } else if (!isAnyRupee() && !isHeart2() && mId != ITEM_STAMINA_FRUIT) { + mCyl.SetTg_0x4C(0x6480); + } + + if (isBabyRattle()) { + mCyl.SetTgInfo_0x1(0x13); + } else if (isHeartPiece()) { + mCyl.SetTgInfo_0x1(0x15); + } else if (!isAnyRupee() && !isHeart2() && mId != ITEM_STAMINA_FRUIT) { + mCyl.SetTgInfo_0x1(0x13); + } + + if (isHeartPiece()) { + mCyl.ClrTg_0x200000(); + } else { + mCyl.OnTg_0x200000(); + } + + mCyl.SetCoCallback(hitCallback); + mAcchCir.SetWall(getItemFlagStruct(getItemId())->field_0x01 * 0.5f, getItemFlagStruct(getItemId())->field_0x00 * 0.6f); + mObjAcch.Set(this, 1, &mAcchCir); + mObjAcch.field_0x0D4 = 50.0f; + mObjAcch.SetClrSpeedY(); + mObjAcch.SetField_0xC(4); + mAcceleration = -2.0f; + mMaxSpeed = -80.0f; + + mGetItemPouchSlot = sGetItemPouchSlot; + mItemQuantity = sGetItemQuantity; + s32 subType = getSubtypeFromParam(mParams); + if (subType != 1 && subType != 2 && subType != 3 && subType != 4 && subType != 5 && subType != 6) { + fn_80253F90(true); + } else { + fn_80253F90(false); + } + + if (getSubtypeFromParam(mParams) == 2) { + fn_80256790(); + } else { + fn_802567D0(); + } + + // These need to not pool... + switch (getSubtypeFromParam(mParams)) { + default: + mStateMgr.changeState(StateID_Wait); + break; + case 1: + mStateMgr.changeState(StateID_Wait); + break; + case 2: + mStateMgr.changeState(StateID_Wait); + break; + case 3: + onTouchLink(); + break; + case 4: + mStateMgr.changeState(StateID_Get); + break; + case 5: + mStateMgr.changeState(StateID_WaitForcedGetDemo); + break; + case 6: + mStateMgr.changeState(StateID_GetBeetle); + break; + case 7: + mStateMgr.changeState(StateID_WaitTBoxGetDemo); + break; + } + + fn_80255DF0(); + fn_80254BB0(); + + if (isHeart()) { + setDespawnTimer(600); + } else { + setDespawnTimer(300); + } + + if (isGreenRupee() || isBlueRupee() || isRedRupee() || isRupoor()) { + mFnSetBoundingBox = &dAcItem_c::setLowValueRupeeBoundingBox; + } else if (isSilverRupee() || isGoldRupee()) { + mFnSetBoundingBox = &dAcItem_c::setHighValueRupeeBoundingBox; + } else if (isArrowBundle()) { + mFnSetBoundingBox = &dAcItem_c::setArrowBundleBoundingBox; + } else { + mFnSetBoundingBox = &dAcItem_c::setDefaultBoundingBox; + } + + applyBoundingBox(); + + switch (mId) { + case ITEM_SMALL_KEY: mFnGetGravity1 = &dAcItem_c::getSmallKeyGravity1; break; + case ITEM_GREEN_RUPEE: mFnGetGravity1 = &dAcItem_c::getGreenRupeeGravity1; break; + case ITEM_BLUE_RUPEE: mFnGetGravity1 = &dAcItem_c::getBlueRupeeGravity1; break; + case ITEM_RED_RUPEE: mFnGetGravity1 = &dAcItem_c::getRedRupeeGravity1; break; + case ITEM_HEART: mFnGetGravity1 = &dAcItem_c::getHeartGravity1; break; + case ITEM_SINGLE_ARROW: mFnGetGravity1 = &dAcItem_c::getSingleArrowGravity1; break; + case ITEM_BUNDLE_ARROWS: mFnGetGravity1 = &dAcItem_c::getArrowBundleGravity1; break; + case ITEM_SILVER_RUPEE: mFnGetGravity1 = &dAcItem_c::getSilverRupeeGravity1; break; + case ITEM_GOLD_RUPEE: mFnGetGravity1 = &dAcItem_c::getGoldRupeeGravity1; break; + case ITEM_RUPOOR: mFnGetGravity1 = &dAcItem_c::getRupoorGravity1; break; + case ITEM_5_BOMBS: mFnGetGravity1 = &dAcItem_c::get5BombsGravity1; break; + case ITEM_10_BOMBS: mFnGetGravity1 = &dAcItem_c::get10BombsGravity1; break; + case ITEM_FARORE_TEAR: mFnGetGravity1 = &dAcItem_c::getFaroreTearGravity1; break; + case ITEM_5_DEKU_SEEDS: mFnGetGravity1 = &dAcItem_c::get5SeedsGravity1; break; + default: mFnGetGravity1 = &dAcItem_c::getDefaultGravity1; break; + } + + switch (mId) { + case ITEM_HEART: mFnGetHeartGravity = &dAcItem_c::getHeartGravity2; break; + default: mFnGetHeartGravity = nullptr; break; + } + + switch (mId) { + case ITEM_GREEN_RUPEE: mFnGetRupeeGravity = &dAcItem_c::getGreenRupeeGravity3; break; + case ITEM_BLUE_RUPEE: mFnGetRupeeGravity = &dAcItem_c::getBlueRupeeGravity3; break; + case ITEM_RED_RUPEE: mFnGetRupeeGravity = &dAcItem_c::getRedRupeeGravity3; break; + case ITEM_SILVER_RUPEE: mFnGetRupeeGravity = &dAcItem_c::getSilverRupeeGravity3; break; + case ITEM_GOLD_RUPEE: mFnGetRupeeGravity = &dAcItem_c::getGoldRupeeGravity3; break; + case ITEM_RUPOOR: mFnGetRupeeGravity = &dAcItem_c::getRupoorGravity3; break; + default: mFnGetRupeeGravity = nullptr; break; + } + + switch (mId) { + case ITEM_SMALL_KEY: mFnGetGravity4 = &dAcItem_c::getSmallKeyGravity4; break; + case ITEM_GREEN_RUPEE: mFnGetGravity4 = &dAcItem_c::getGreenRupeeGravity4; break; + case ITEM_BLUE_RUPEE: mFnGetGravity4 = &dAcItem_c::getBlueRupeeGravity4; break; + case ITEM_RED_RUPEE: mFnGetGravity4 = &dAcItem_c::getRedRupeeGravity4; break; + case ITEM_HEART: mFnGetGravity4 = &dAcItem_c::getHeartGravity4; break; + case ITEM_SINGLE_ARROW: mFnGetGravity4 = &dAcItem_c::getSingleArrowGravity4; break; + case ITEM_BUNDLE_ARROWS: mFnGetGravity4 = &dAcItem_c::getArrowBundleGravity4; break; + case ITEM_SILVER_RUPEE: mFnGetGravity4 = &dAcItem_c::getSilverRupeeGravity4; break; + case ITEM_GOLD_RUPEE: mFnGetGravity4 = &dAcItem_c::getGoldRupeeGravity4; break; + case ITEM_RUPOOR: mFnGetGravity4 = &dAcItem_c::getRupoorGravity4; break; + case ITEM_5_BOMBS: mFnGetGravity4 = &dAcItem_c::get5BombsGravity4; break; + case ITEM_10_BOMBS: mFnGetGravity4 = &dAcItem_c::get10BombsGravity4; break; + case ITEM_FARORE_TEAR: mFnGetGravity4 = &dAcItem_c::getFaroreTearGravity4; break; + case ITEM_5_DEKU_SEEDS: mFnGetGravity4 = &dAcItem_c::get5SeedsGravity4; break; + default: mFnGetGravity4 = nullptr; break; + } + + switch (mId) { + case ITEM_GREEN_RUPEE: mFnGetDirHitKnockback = &dAcItem_c::getGreenRupeeDirHitKnockback; break; + case ITEM_BLUE_RUPEE: mFnGetDirHitKnockback = &dAcItem_c::getBlueRupeeDirHitKnockback; break; + case ITEM_RED_RUPEE: mFnGetDirHitKnockback = &dAcItem_c::getRedRupeeDirHitKnockback; break; + case ITEM_SILVER_RUPEE: mFnGetDirHitKnockback = &dAcItem_c::getSilverRupeeDirHitKnockback; break; + case ITEM_GOLD_RUPEE: mFnGetDirHitKnockback = &dAcItem_c::getGoldRupeeDirHitKnockback; break; + case ITEM_RUPOOR: mFnGetDirHitKnockback = &dAcItem_c::getRupoorDirHitKnockback; break; + default: mFnGetDirHitKnockback = nullptr; break; + } + + switch (mId) { + case ITEM_GREEN_RUPEE: mFnGetDirHitKnockbackRand = &dAcItem_c::getGreenRupeeDirHitKnockbackRand; break; + case ITEM_BLUE_RUPEE: mFnGetDirHitKnockbackRand = &dAcItem_c::getBlueRupeeDirHitKnockbackRand; break; + case ITEM_RED_RUPEE: mFnGetDirHitKnockbackRand = &dAcItem_c::getRedRupeeDirHitKnockbackRand; break; + case ITEM_SILVER_RUPEE: mFnGetDirHitKnockbackRand = &dAcItem_c::getSilverRupeeDirHitKnockbackRand; break; + case ITEM_GOLD_RUPEE: mFnGetDirHitKnockbackRand = &dAcItem_c::getGoldRupeeDirHitKnockbackRand; break; + case ITEM_RUPOOR: mFnGetDirHitKnockbackRand = &dAcItem_c::getRupoorDirHitKnockbackRand; break; + default: mFnGetDirHitKnockbackRand = nullptr; break; + } + + + switch (mId) { + case ITEM_GREEN_RUPEE: mFnGetHitKnockback = &dAcItem_c::getGreenRupeeHitKnockback; break; + case ITEM_BLUE_RUPEE: mFnGetHitKnockback = &dAcItem_c::getBlueRupeeHitKnockback; break; + case ITEM_RED_RUPEE: mFnGetHitKnockback = &dAcItem_c::getRedRupeeHitKnockback; break; + case ITEM_SILVER_RUPEE: mFnGetHitKnockback = &dAcItem_c::getSilverRupeeHitKnockback; break; + case ITEM_GOLD_RUPEE: mFnGetHitKnockback = &dAcItem_c::getGoldRupeeHitKnockback; break; + case ITEM_RUPOOR: mFnGetHitKnockback = &dAcItem_c::getRupoorHitKnockback; break; + default: mFnGetHitKnockback = nullptr; break; + } + + switch (mId) { + case ITEM_GREEN_RUPEE: mFnGetHitKnockbackRand = &dAcItem_c::getGreenRupeeHitKnockbackRand; break; + case ITEM_BLUE_RUPEE: mFnGetHitKnockbackRand = &dAcItem_c::getBlueRupeeHitKnockbackRand; break; + case ITEM_RED_RUPEE: mFnGetHitKnockbackRand = &dAcItem_c::getRedRupeeHitKnockbackRand; break; + case ITEM_SILVER_RUPEE: mFnGetHitKnockbackRand = &dAcItem_c::getSilverRupeeHitKnockbackRand; break; + case ITEM_GOLD_RUPEE: mFnGetHitKnockbackRand = &dAcItem_c::getGoldRupeeHitKnockbackRand; break; + case ITEM_RUPOOR: mFnGetHitKnockbackRand = &dAcItem_c::getRupoorHitKnockbackRand; break; + default: mFnGetHitKnockbackRand = nullptr; break; + } + + switch (mId) { + case ITEM_GREEN_RUPEE: mFnGetHitSquareDistance2 = &dAcItem_c::getGreenRupeeHitSquareDistance2; break; + case ITEM_BLUE_RUPEE: mFnGetHitSquareDistance2 = &dAcItem_c::getBlueRupeeHitSquareDistance2; break; + case ITEM_RED_RUPEE: mFnGetHitSquareDistance2 = &dAcItem_c::getRedRupeeHitSquareDistance2; break; + case ITEM_SILVER_RUPEE: mFnGetHitSquareDistance2 = &dAcItem_c::getSilverRupeeHitSquareDistance2; break; + case ITEM_GOLD_RUPEE: mFnGetHitSquareDistance2 = &dAcItem_c::getGoldRupeeHitSquareDistance2; break; + case ITEM_RUPOOR: mFnGetHitSquareDistance2 = &dAcItem_c::getRupoorHitSquareDistance2; break; + case ITEM_HEART: mFnGetHitSquareDistance2 = &dAcItem_c::getHeartHitSquareDistance2; break; + default: mFnGetHitSquareDistance2 = nullptr; break; + } + + switch (mId) { + case ITEM_GREEN_RUPEE: mFnGetDirHitKnockback2 = &dAcItem_c::getGreenRupeeDirHitKnockback2; break; + case ITEM_BLUE_RUPEE: mFnGetDirHitKnockback2 = &dAcItem_c::getBlueRupeeDirHitKnockback2; break; + case ITEM_RED_RUPEE: mFnGetDirHitKnockback2 = &dAcItem_c::getRedRupeeDirHitKnockback2; break; + case ITEM_SILVER_RUPEE: mFnGetDirHitKnockback2 = &dAcItem_c::getSilverRupeeDirHitKnockback2; break; + case ITEM_GOLD_RUPEE: mFnGetDirHitKnockback2 = &dAcItem_c::getGoldRupeeDirHitKnockback2; break; + case ITEM_RUPOOR: mFnGetDirHitKnockback2 = &dAcItem_c::getRupoorDirHitKnockback2; break; + case ITEM_HEART: mFnGetDirHitKnockback2 = &dAcItem_c::getHeartDirHitKnockback2; break; + default: mFnGetDirHitKnockback2 = nullptr; break; + } + + switch (mId) { + case ITEM_GREEN_RUPEE: mFnGetDirHitKnockbackRand2 = &dAcItem_c::getGreenRupeeDirHitKnockbackRand2; break; + case ITEM_BLUE_RUPEE: mFnGetDirHitKnockbackRand2 = &dAcItem_c::getBlueRupeeDirHitKnockbackRand2; break; + case ITEM_RED_RUPEE: mFnGetDirHitKnockbackRand2 = &dAcItem_c::getRedRupeeDirHitKnockbackRand2; break; + case ITEM_SILVER_RUPEE: mFnGetDirHitKnockbackRand2 = &dAcItem_c::getSilverRupeeDirHitKnockbackRand2; break; + case ITEM_GOLD_RUPEE: mFnGetDirHitKnockbackRand2 = &dAcItem_c::getGoldRupeeDirHitKnockbackRand2; break; + case ITEM_RUPOOR: mFnGetDirHitKnockbackRand2 = &dAcItem_c::getRupoorDirHitKnockbackRand2; break; + case ITEM_HEART: mFnGetDirHitKnockbackRand2 = &dAcItem_c::getHeartDirHitKnockbackRand2; break; + default: mFnGetDirHitKnockbackRand2 = nullptr; break; + } + + switch (mId) { + case ITEM_GREEN_RUPEE: mFnGetHitKnockback2 = &dAcItem_c::getGreenRupeeHitKnockback2; break; + case ITEM_BLUE_RUPEE: mFnGetHitKnockback2 = &dAcItem_c::getBlueRupeeHitKnockback2; break; + case ITEM_RED_RUPEE: mFnGetHitKnockback2 = &dAcItem_c::getRedRupeeHitKnockback2; break; + case ITEM_SILVER_RUPEE: mFnGetHitKnockback2 = &dAcItem_c::getSilverRupeeHitKnockback2; break; + case ITEM_GOLD_RUPEE: mFnGetHitKnockback2 = &dAcItem_c::getGoldRupeeHitKnockback2; break; + case ITEM_RUPOOR: mFnGetHitKnockback2 = &dAcItem_c::getRupoorHitKnockback2; break; + case ITEM_HEART: mFnGetHitKnockback2 = &dAcItem_c::getHeartHitKnockback2; break; + default: mFnGetHitKnockback2 = nullptr; break; + } + + switch (mId) { + case ITEM_GREEN_RUPEE: mFnGetHitKnockbackRand2 = &dAcItem_c::getGreenRupeeHitKnockbackRand2; break; + case ITEM_BLUE_RUPEE: mFnGetHitKnockbackRand2 = &dAcItem_c::getBlueRupeeHitKnockbackRand2; break; + case ITEM_RED_RUPEE: mFnGetHitKnockbackRand2 = &dAcItem_c::getRedRupeeHitKnockbackRand2; break; + case ITEM_SILVER_RUPEE: mFnGetHitKnockbackRand2 = &dAcItem_c::getSilverRupeeHitKnockbackRand2; break; + case ITEM_GOLD_RUPEE: mFnGetHitKnockbackRand2 = &dAcItem_c::getGoldRupeeHitKnockbackRand2; break; + case ITEM_RUPOOR: mFnGetHitKnockbackRand2 = &dAcItem_c::getRupoorHitKnockbackRand2; break; + case ITEM_HEART: mFnGetHitKnockbackRand2 = &dAcItem_c::getHeartHitKnockbackRand2; break; + default: mFnGetHitKnockbackRand2 = nullptr; break; + } + + switch (mId) { + case ITEM_GREEN_RUPEE: mFnGetDirHitKnockback3 = &dAcItem_c::getGreenRupeeDirHitKnockback3; break; + case ITEM_BLUE_RUPEE: mFnGetDirHitKnockback3 = &dAcItem_c::getBlueRupeeDirHitKnockback3; break; + case ITEM_RED_RUPEE: mFnGetDirHitKnockback3 = &dAcItem_c::getRedRupeeDirHitKnockback3; break; + case ITEM_SILVER_RUPEE: mFnGetDirHitKnockback3 = &dAcItem_c::getSilverRupeeDirHitKnockback3; break; + case ITEM_GOLD_RUPEE: mFnGetDirHitKnockback3 = &dAcItem_c::getGoldRupeeDirHitKnockback3; break; + case ITEM_RUPOOR: mFnGetDirHitKnockback3 = &dAcItem_c::getRupoorDirHitKnockback3; break; + case ITEM_HEART: mFnGetDirHitKnockback3 = &dAcItem_c::getHeartDirHitKnockback3; break; + default: mFnGetDirHitKnockbackRand2 = nullptr; break; // @bug copypasta mistake + } + + switch (mId) { + case ITEM_GREEN_RUPEE: mFnGetDirHitKnockbackRand3 = &dAcItem_c::getGreenRupeeDirHitKnockbackRand3; break; + case ITEM_BLUE_RUPEE: mFnGetDirHitKnockbackRand3 = &dAcItem_c::getBlueRupeeDirHitKnockbackRand3; break; + case ITEM_RED_RUPEE: mFnGetDirHitKnockbackRand3 = &dAcItem_c::getRedRupeeDirHitKnockbackRand3; break; + case ITEM_SILVER_RUPEE: mFnGetDirHitKnockbackRand3 = &dAcItem_c::getSilverRupeeDirHitKnockbackRand3; break; + case ITEM_GOLD_RUPEE: mFnGetDirHitKnockbackRand3 = &dAcItem_c::getGoldRupeeDirHitKnockbackRand3; break; + case ITEM_RUPOOR: mFnGetDirHitKnockbackRand3 = &dAcItem_c::getRupoorDirHitKnockbackRand3; break; + case ITEM_HEART: mFnGetDirHitKnockbackRand3 = &dAcItem_c::getHeartDirHitKnockbackRand3; break; + default: mFnGetDirHitKnockbackRand2 = nullptr; break; // @bug copypasta mistake + } + + switch (mId) { + case ITEM_GREEN_RUPEE: mFnGetHitKnockback3 = &dAcItem_c::getGreenRupeeHitKnockback3; break; + case ITEM_BLUE_RUPEE: mFnGetHitKnockback3 = &dAcItem_c::getBlueRupeeHitKnockback3; break; + case ITEM_RED_RUPEE: mFnGetHitKnockback3 = &dAcItem_c::getRedRupeeHitKnockback3; break; + case ITEM_SILVER_RUPEE: mFnGetHitKnockback3 = &dAcItem_c::getSilverRupeeHitKnockback3; break; + case ITEM_GOLD_RUPEE: mFnGetHitKnockback3 = &dAcItem_c::getGoldRupeeHitKnockback3; break; + case ITEM_RUPOOR: mFnGetHitKnockback3 = &dAcItem_c::getRupoorHitKnockback3; break; + case ITEM_HEART: mFnGetHitKnockback3 = &dAcItem_c::getHeartHitKnockback3; break; + default: mFnGetHitKnockback3 = nullptr; break; + } + + switch (mId) { + case ITEM_GREEN_RUPEE: mFnGetHitKnockbackRand3 = &dAcItem_c::getGreenRupeeHitKnockbackRand3; break; + case ITEM_BLUE_RUPEE: mFnGetHitKnockbackRand3 = &dAcItem_c::getBlueRupeeHitKnockbackRand3; break; + case ITEM_RED_RUPEE: mFnGetHitKnockbackRand3 = &dAcItem_c::getRedRupeeHitKnockbackRand3; break; + case ITEM_SILVER_RUPEE: mFnGetHitKnockbackRand3 = &dAcItem_c::getSilverRupeeHitKnockbackRand3; break; + case ITEM_GOLD_RUPEE: mFnGetHitKnockbackRand3 = &dAcItem_c::getGoldRupeeHitKnockbackRand3; break; + case ITEM_RUPOOR: mFnGetHitKnockbackRand3 = &dAcItem_c::getRupoorHitKnockbackRand3; break; + case ITEM_HEART: mFnGetHitKnockbackRand3 = &dAcItem_c::getHeartHitKnockbackRand3; break; + default: mFnGetHitKnockbackRand3 = nullptr; break; + } + + if (isHeart2()) { + mFn_0xCB4 = &dAcItem_c::fn_802577C0; + } else { + mFn_0xCB4 = &dAcItem_c::fn_802577D0; + } + + if (mbNoDespawn) { + dBgS::GetInstance()->SetLightingCode(this, 10.0f); + } else if (isHeart2()) { + mLinkage.bushTpFunc(mObjAcch); + } + + if (isHeart2()) { + field_0xD20 = 6; + } + + if (isAnyTear()) { + mSomeStr = "force"; + } + + if (isAnyTear()) { + s32 type = getTearSubtype((ITEM_ID)mId); + if (type == TEAR_MAX) { + type = TEAR_0; + } + dAcObjBase_c *forceSign = dAcObjBase_c::create(this, fProfile::OBJ_FORCE_SIGN, type & 0xFF, nullptr, nullptr, nullptr, nullptr, 0x3F); + if (forceSign != nullptr) { + mForceSignRef.link(forceSign); + } + } + + if (isAnyTear()) { + dAcBase_c *forceGetFlag = dAcBase_c::createActorStage(fProfile::TAG_FORCE_GET_FLAG, dTgForceGetFlag_c::tearIdxToParam(getTearIdx()), &mPosition, &mRotation, &mScale, 0, mRoomID, this); + if (forceGetFlag == nullptr) { + return FAILED; + } + } + + if (mId == ITEM_STAMINA_FRUIT && unk) { + // ((getFirstBitParams2__9dAcBase_cCFv((dAcBase_c *) this) << 8) & 0x100 & ~1) | (((u32) this->unk4 >> 0x13U) & 1) + + u32 p1 = (getFirstBitParams2() & 0x1) << 8; + u32 parms = ((mParams >> 0x13) & 0x1) | (p1 & ~0x1); + dAcObjBase_c *leaves = dAcObjBase_c::create(fProfile::OBJ_FRUIT_GUTS_LEAF, mRoomID, parms, &mPosition, &mRotation, &mScale, -1); + if (leaves == nullptr) { + return FAILED; + } + } + + if (isGreenRupee() || isBlueRupee() || isRedRupee() || isSilverRupee() || isGoldRupee()) { + mDowsingTarget.initialize(DowsingTarget::SLOT_RUPEE, 0, &sFreestandingDowsingOffset, 0.0f); + mDowsingTarget.doRegister(); + } else if (isHeart()) { + mDowsingTarget.initialize(DowsingTarget::SLOT_HEART, 0, &sFreestandingDowsingOffset, 0.0f); + mDowsingTarget.doRegister(); + } else if (is5GratitudeCrystals() || isGratitudeCrystal()) { + mDowsingTarget.initialize(DowsingTarget::SLOT_CRYSTAL, 0, &sFreestandingDowsingOffset, 0.0f); + mDowsingTarget.doRegister(); + } else if (isTreasure2((ITEM_ID)mId)) { + mDowsingTarget.initialize(DowsingTarget::SLOT_TREASURE, 0, &sFreestandingDowsingOffset, 0.0f); + mDowsingTarget.doRegister(); + } + + if (isGratitudeCrystal() || isUnkTreasureGroup1()) { + setFreestandingYOffset(-mpMdl->getMdl()->getResMdl().GetResNode(sResNodeName).GetTranslate().y); + } + + if (mId == ITEM_STAMINA_FRUIT && unk == 0) { + mItemFlags |= 4; + } + + if ((isGratitudeCrystal() || is5GratitudeCrystals()) && !isItemDropFromEnemy() && mStateMgr.isState(StateID_Wait)) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_ENERGY_SOURCE_OUTWELL); + } + + if (EventManager::isInEvent() && EventManager::isCurrentEvent("GetGenkiItem")) { + fn_8024DF30(mItemFlags | 0x20); + } + + // okay + bool is = isHeartPiece(); + if (is) { + is = dScGame_c::isCurrentStage("D100"); + } + if (is) { + is = mPosition.squareDistance(mVec3_c(0.0f, -190.0f, -9590.0f)) < 10000.0f; + } + if (is) { + // Skyview Temple - Heart Piece behind bars in main room + fn_8024DF30(mItemFlags | 0x80); + } + + field_0xD48 = cM::rndInt(0x10000); + mColorFilter.r = 0; + mColorFilter.g = 0; + mColorFilter.b = 0; + mLightLevelMaybe = 0.0f; + + return SUCCEEDED; +} + +STATE_DEFINE(dAcItem_c, Wait); +STATE_DEFINE(dAcItem_c, Carry); +STATE_DEFINE(dAcItem_c, GetBeetle); +STATE_DEFINE(dAcItem_c, WaitGet); +STATE_DEFINE(dAcItem_c, Get); +STATE_DEFINE(dAcItem_c, WaitGetDemo); +STATE_DEFINE(dAcItem_c, WaitForcedGetDemo); +STATE_DEFINE(dAcItem_c, GetDemo); +STATE_DEFINE(dAcItem_c, WaitTBoxGetDemo); +STATE_DEFINE(dAcItem_c, ResurgeWait); +STATE_DEFINE(dAcItem_c, WaitTurnOff); +STATE_DEFINE(dAcItem_c, WaitSacredDewGetEffect); + void dAcItem_c::initializeState_Wait() {} void dAcItem_c::executeState_Wait() {} void dAcItem_c::finalizeState_Wait() {} From 0aa06252f6456cbe9179ff53e71bbe3228bb3e91 Mon Sep 17 00:00:00 2001 From: robojumper Date: Sat, 2 May 2026 18:28:52 +0200 Subject: [PATCH 08/14] fixup! dAcItem_c::{create, createHeap} OK remove outdated comments --- src/d/a/d_a_item.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/d/a/d_a_item.cpp b/src/d/a/d_a_item.cpp index 8bbda693..6e854afb 100644 --- a/src/d/a/d_a_item.cpp +++ b/src/d/a/d_a_item.cpp @@ -487,7 +487,6 @@ bool dAcItem_c::createHeap() { return true; } -// TODO this function pools .data but doesn't pool .bss for some reason int dAcItem_c::create() { u32 flag = getFromParams(0xA, 0xFF); if (flag < 0xFF && SceneflagManager::sInstance->checkBoolFlag(mRoomID, flag)) { @@ -705,7 +704,6 @@ int dAcItem_c::create() { fn_802567D0(); } - // These need to not pool... switch (getSubtypeFromParam(mParams)) { default: mStateMgr.changeState(StateID_Wait); @@ -984,8 +982,6 @@ int dAcItem_c::create() { } if (mId == ITEM_STAMINA_FRUIT && unk) { - // ((getFirstBitParams2__9dAcBase_cCFv((dAcBase_c *) this) << 8) & 0x100 & ~1) | (((u32) this->unk4 >> 0x13U) & 1) - u32 p1 = (getFirstBitParams2() & 0x1) << 8; u32 parms = ((mParams >> 0x13) & 0x1) | (p1 & ~0x1); dAcObjBase_c *leaves = dAcObjBase_c::create(fProfile::OBJ_FRUIT_GUTS_LEAF, mRoomID, parms, &mPosition, &mRotation, &mScale, -1); From f9754e2edad7e1b69718970b66b07b4194c511ec Mon Sep 17 00:00:00 2001 From: robojumper Date: Sat, 2 May 2026 23:50:58 +0200 Subject: [PATCH 09/14] dAcItem_c::executeState_Wait almost OK --- config/SOUE01/symbols.txt | 4 +- include/d/a/d_a_base.h | 1 + include/d/a/d_a_item.h | 26 +- include/d/col/c/c_cc_d.h | 5 + src/d/a/d_a_item.cpp | 525 +++++++++++++++++++++++++------ src/d/col/bg/d_bg_s_roof_chk.cpp | 1 + 6 files changed, 466 insertions(+), 96 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 1fd503f6..2a135743 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -13656,7 +13656,7 @@ fn_802528C0 = .text:0x802528C0; // type:function size:0x8 fn_802528D0 = .text:0x802528D0; // type:function size:0x8 fn_802528E0 = .text:0x802528E0; // type:function size:0xC fn_802528F0 = .text:0x802528F0; // type:function size:0x6C -AcItem__UnsetHaveNoGravity = .text:0x80252960; // type:function size:0xC +unsetHaveNoGravity__9dAcItem_cFv = .text:0x80252960; // type:function size:0xC getItemRotateAngle = .text:0x80252970; // type:function size:0x24 getLightFruitTime = .text:0x802529A0; // type:function size:0x8 shouldBlinkBeforeDespawn = .text:0x802529B0; // type:function size:0x30 @@ -13721,7 +13721,7 @@ fn_80254BC0 = .text:0x80254BC0; // type:function size:0xCC setDespawnTimer__9dAcItem_cFUs = .text:0x80254C90; // type:function size:0x10 fn_80254CA0 = .text:0x80254CA0; // type:function size:0xC AcItem__noLongerWaiting = .text:0x80254CB0; // type:function size:0xC -fn_80254CC0 = .text:0x80254CC0; // type:function size:0x4C +tickDespawnTimer__9dAcItem_cFv = .text:0x80254CC0; // type:function size:0x4C fn_80254D10 = .text:0x80254D10; // type:function size:0x60 fn_80254D70 = .text:0x80254D70; // type:function size:0x64 fn_80254DE0 = .text:0x80254DE0; // type:function size:0x8 diff --git a/include/d/a/d_a_base.h b/include/d/a/d_a_base.h index f063e4e2..5bfb0c53 100644 --- a/include/d/a/d_a_base.h +++ b/include/d/a/d_a_base.h @@ -238,6 +238,7 @@ public: void setParams2Upper_ignoreLower(u32 val); int getParams2UpperByte(); void setParams2UpperByte(u32 val); + bool isFirstBitParams2NotSet(); static u32 buildParams2(u32 lower, u32 upper); u32 getParams2Lower() const; u32 getFirstBitParams2() const; diff --git a/include/d/a/d_a_item.h b/include/d/a/d_a_item.h index c6a22cd1..98952d59 100644 --- a/include/d/a/d_a_item.h +++ b/include/d/a/d_a_item.h @@ -100,6 +100,8 @@ public: virtual u16 getItemIdFromParams() override; virtual void setItemId(u16 id); + virtual bool shouldDespawn(); + virtual bool isItemSmallKeyOrHeartPieceOrStaminaFruit(); STATE_FUNC_DECLARE(dAcItem_c, Wait); STATE_FUNC_DECLARE(dAcItem_c, Carry); @@ -242,6 +244,9 @@ private: typedef bool (dAcItem_c::*sStaticPtmf)(); static const sStaticPtmf sStaticPtmfs[]; + static dAcRef_c sItemListHead; + static dAcRef_c sItemListTail; + static const ItemInitStruct *getItemInitStructForId(u16 itemId); const ItemInitStruct *getItemInitStruct() const; bool isItemDropFromEnemy() const; @@ -262,6 +267,23 @@ private: void setFreestandingYOffset(f32); void fn_8024DF30(u32 flags); + bool fn_80255CF0(); + bool fn_802574A0(); + void addToGetQueue(); + static bool fn_8024A230(); + void unsetHaveNoGravity(); + void fn_80252A80(); + void tickDespawnTimer(); + void fn_80253D50(); + bool fn_802577A0(); + void fn_80256F20(); + bool fn_80256E80(); + bool fn_80255C50(u32 specialCode); + bool fn_80255CA0(u32 specialCode); + void getCurrentModelScale(f32 *scale); + void makeLinkLookTowardItem(); + void fn_80254CA0(); + // static PTMF callbacks bool fn_80248020(); bool fn_80248010(); @@ -548,8 +570,8 @@ private: /* 0xD40 */ mAng mMdlRotY; /* 0xD42 */ s16 field_0xD42; /* 0xD44 */ u16 mRealItemId; - /* 0xD46 */ s16 mDespawnTimer; - /* 0xD48 */ u16 field_0xD48; + /* 0xD46 */ u16 mDespawnTimer; + /* 0xD48 */ mAng field_0xD48; /* 0xD4A */ u8 field_0xD4A; /* 0xD4B */ u8 field_0xD4B; /* 0xD4C */ u8 field_0xD4C; diff --git a/include/d/col/c/c_cc_d.h b/include/d/col/c/c_cc_d.h index 23e88d40..d5fa19bb 100644 --- a/include/d/col/c/c_cc_d.h +++ b/include/d/col/c/c_cc_d.h @@ -833,6 +833,11 @@ public: mCo.OnSPrm(f); } + void OffTgCoFlag(u32 f) { + mTg.OffSPrm(f); + mCo.OffSPrm(f); + } + void SetAtType(u32 type) { mAt.SetType(type); } diff --git a/src/d/a/d_a_item.cpp b/src/d/a/d_a_item.cpp index 6e854afb..4301c64a 100644 --- a/src/d/a/d_a_item.cpp +++ b/src/d/a/d_a_item.cpp @@ -3,8 +3,14 @@ #include "c/c_math.h" #include "common.h" #include "d/a/d_a_itembase.h" +#include "d/a/d_a_player.h" #include "d/col/bg/d_bg_s.h" +#include "d/col/bg/d_bg_s_gnd_chk.h" +#include "d/col/bg/d_bg_s_roof_chk.h" #include "d/col/cc/d_cc_d.h" +#include "d/col/cc/d_cc_s.h" +#include "d/d_camera.h" +#include "d/d_linkage.h" #include "d/d_pouch.h" #include "d/d_sc_game.h" #include "d/flag/dungeonflag_manager.h" @@ -16,8 +22,11 @@ #include "f/f_list_mg.h" #include "f/f_profile_name.h" #include "m/m_vec.h" +#include "s/s_Math.h" +#include "toBeSorted/d_emitter.h" #include "toBeSorted/dowsing_target.h" #include "toBeSorted/event_manager.h" +#include "toBeSorted/file_manager.h" #include "toBeSorted/item_mdl_item.h" #include "toBeSorted/item_mdl_light_fruit.h" #include "toBeSorted/item_mdl_misc.h" @@ -235,13 +244,21 @@ const u32 dAcItemBase_c::sItemTypeFlags[MAX_ITEM_ID - 1] = { 0xFFFF, 0x0, 0x0, 0x0, 0x0, 0x0, }; +struct GlitteringSporeRupeeChance { + s32 itemId; + s32 weight; +}; + +static const GlitteringSporeRupeeChance sSporeRupeeChances[] = { + {ITEM_GREEN_RUPEE, 4}, + { ITEM_BLUE_RUPEE, 5}, + { ITEM_RED_RUPEE, 1}, + { ITEM_RUPOOR, 1}, +}; + static const dCcD_SrcCyl sSrcCyl = { {{0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0}, - {~(AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000 | AT_TYPE_WIND), - 0x111, - {0, 0x08, 0x407}, - 0, - 0}, + {~(AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000 | AT_TYPE_WIND), 0x111, {0, 0x08, 0x407}, 0, 0}, {0xE9}}, {40.0f, 60.0f} }; @@ -262,15 +279,14 @@ struct TearIdIdx { /* static */ extern "C" TearIdIdx sTearIdxes[] = { {0, ITEM_FARORE_TEAR}, - {1, ITEM_DIN_TEAR}, - {2, ITEM_NAYRU_TEAR}, + {1, ITEM_DIN_TEAR}, + {2, ITEM_NAYRU_TEAR}, {3, ITEM_SACRED_TEAR}, }; /* static */ extern const char *const sGetFairyBody = "GetFairy_body"; /* static */ extern const char *const sBottleFairy_body = "BottleFairy_body"; - bool dAcItemBase_c::isValidItemTypeIdx(int itemId) { return itemId < ARRAY_LENGTH(sItemTypeFlags); } @@ -361,18 +377,12 @@ SPECIAL_ACTOR_PROFILE(ITEM, dAcItem_c, fProfile::ITEM, 0x2B, 0, 2); const mVec3_c dAcItem_c::sFreestandingDowsingOffset(0.0f, 25.0f, 0.0f); const dAcItem_c::sStaticPtmf dAcItem_c::sStaticPtmfs[] = { - &dAcItem_c::fn_80248020, - nullptr, - &dAcItem_c::fn_80248010, - nullptr, - &dAcItem_c::fn_80255B30, - &dAcItem_c::fn_80255BA0, - &dAcItem_c::fn_80248040, - nullptr, - &dAcItem_c::fn_80248030, - nullptr, - &dAcItem_c::fn_80255BD0, - &dAcItem_c::fn_80255C40, + &dAcItem_c::fn_80248020, nullptr, + &dAcItem_c::fn_80248010, nullptr, + &dAcItem_c::fn_80255B30, &dAcItem_c::fn_80255BA0, + &dAcItem_c::fn_80248040, nullptr, + &dAcItem_c::fn_80248030, nullptr, + &dAcItem_c::fn_80255BD0, &dAcItem_c::fn_80255C40, }; dAcItem_c::dAcItem_c() @@ -503,9 +513,10 @@ int dAcItem_c::create() { } else { mId = paramId; } - + if (isGratitudeCrystal()) { - if (!StoryflagManager::sInstance->getCounterOrFlag(STORYFLAG_GRATITUDE_QUEST_STARTED) || !dScGame_c::currentSpawnInfo.isNight()) { + if (!StoryflagManager::sInstance->getCounterOrFlag(STORYFLAG_GRATITUDE_QUEST_STARTED) || + !dScGame_c::currentSpawnInfo.isNight()) { return FAILED; } } else if (isHeart()) { @@ -523,14 +534,9 @@ int dAcItem_c::create() { setItemId(getItemId2()); switch (getItemInitStruct()->_0x00[9]) { - case 0: - mFn_0xC90 = &dAcItem_c::fn_80254DE0; - break; - case 1: - mFn_0xC90 = &dAcItem_c::fn_80254DF0; - break; - default: - return FAILED; + case 0: mFn_0xC90 = &dAcItem_c::fn_80254DE0; break; + case 1: mFn_0xC90 = &dAcItem_c::fn_80254DF0; break; + default: return FAILED; } if (isSmallKey()) { @@ -572,17 +578,10 @@ int dAcItem_c::create() { mFnCallGetFreestandingScale = &dAcItem_c::callGetFreestandingModelScale; switch (getItemInitStruct()->_0x00[10]) { - case 0: - mFnAction = &dAcItem_c::moveNormal0; - break; - case 1: - mFnAction = &dAcItem_c::moveNormal1; - break; - case 2: - mFnAction = &dAcItem_c::moveSpecial; - break; - default: - return FAILED; + case 0: mFnAction = &dAcItem_c::moveNormal0; break; + case 1: mFnAction = &dAcItem_c::moveNormal1; break; + case 2: mFnAction = &dAcItem_c::moveSpecial; break; + default: return FAILED; } if (isHeart2()) { @@ -622,7 +621,7 @@ int dAcItem_c::create() { } mSubtype = mId; - + CREATE_ALLOCATOR(dAcItem_c); if (!getFromParams(0x13, 0x1)) { @@ -681,7 +680,9 @@ int dAcItem_c::create() { } mCyl.SetCoCallback(hitCallback); - mAcchCir.SetWall(getItemFlagStruct(getItemId())->field_0x01 * 0.5f, getItemFlagStruct(getItemId())->field_0x00 * 0.6f); + mAcchCir.SetWall( + getItemFlagStruct(getItemId())->field_0x01 * 0.5f, getItemFlagStruct(getItemId())->field_0x00 * 0.6f + ); mObjAcch.Set(this, 1, &mAcchCir); mObjAcch.field_0x0D4 = 50.0f; mObjAcch.SetClrSpeedY(); @@ -705,30 +706,14 @@ int dAcItem_c::create() { } switch (getSubtypeFromParam(mParams)) { - default: - mStateMgr.changeState(StateID_Wait); - break; - case 1: - mStateMgr.changeState(StateID_Wait); - break; - case 2: - mStateMgr.changeState(StateID_Wait); - break; - case 3: - onTouchLink(); - break; - case 4: - mStateMgr.changeState(StateID_Get); - break; - case 5: - mStateMgr.changeState(StateID_WaitForcedGetDemo); - break; - case 6: - mStateMgr.changeState(StateID_GetBeetle); - break; - case 7: - mStateMgr.changeState(StateID_WaitTBoxGetDemo); - break; + default: mStateMgr.changeState(StateID_Wait); break; + case 1: mStateMgr.changeState(StateID_Wait); break; + case 2: mStateMgr.changeState(StateID_Wait); break; + case 3: onTouchLink(); break; + case 4: mStateMgr.changeState(StateID_Get); break; + case 5: mStateMgr.changeState(StateID_WaitForcedGetDemo); break; + case 6: mStateMgr.changeState(StateID_GetBeetle); break; + case 7: mStateMgr.changeState(StateID_WaitTBoxGetDemo); break; } fn_80255DF0(); @@ -776,13 +761,13 @@ int dAcItem_c::create() { } switch (mId) { - case ITEM_GREEN_RUPEE: mFnGetRupeeGravity = &dAcItem_c::getGreenRupeeGravity3; break; - case ITEM_BLUE_RUPEE: mFnGetRupeeGravity = &dAcItem_c::getBlueRupeeGravity3; break; - case ITEM_RED_RUPEE: mFnGetRupeeGravity = &dAcItem_c::getRedRupeeGravity3; break; - case ITEM_SILVER_RUPEE: mFnGetRupeeGravity = &dAcItem_c::getSilverRupeeGravity3; break; - case ITEM_GOLD_RUPEE: mFnGetRupeeGravity = &dAcItem_c::getGoldRupeeGravity3; break; - case ITEM_RUPOOR: mFnGetRupeeGravity = &dAcItem_c::getRupoorGravity3; break; - default: mFnGetRupeeGravity = nullptr; break; + case ITEM_GREEN_RUPEE: mFnGetRupeeGravity = &dAcItem_c::getGreenRupeeGravity3; break; + case ITEM_BLUE_RUPEE: mFnGetRupeeGravity = &dAcItem_c::getBlueRupeeGravity3; break; + case ITEM_RED_RUPEE: mFnGetRupeeGravity = &dAcItem_c::getRedRupeeGravity3; break; + case ITEM_SILVER_RUPEE: mFnGetRupeeGravity = &dAcItem_c::getSilverRupeeGravity3; break; + case ITEM_GOLD_RUPEE: mFnGetRupeeGravity = &dAcItem_c::getGoldRupeeGravity3; break; + case ITEM_RUPOOR: mFnGetRupeeGravity = &dAcItem_c::getRupoorGravity3; break; + default: mFnGetRupeeGravity = nullptr; break; } switch (mId) { @@ -823,7 +808,6 @@ int dAcItem_c::create() { default: mFnGetDirHitKnockbackRand = nullptr; break; } - switch (mId) { case ITEM_GREEN_RUPEE: mFnGetHitKnockback = &dAcItem_c::getGreenRupeeHitKnockback; break; case ITEM_BLUE_RUPEE: mFnGetHitKnockback = &dAcItem_c::getBlueRupeeHitKnockback; break; @@ -968,14 +952,18 @@ int dAcItem_c::create() { if (type == TEAR_MAX) { type = TEAR_0; } - dAcObjBase_c *forceSign = dAcObjBase_c::create(this, fProfile::OBJ_FORCE_SIGN, type & 0xFF, nullptr, nullptr, nullptr, nullptr, 0x3F); + dAcObjBase_c *forceSign = + dAcObjBase_c::create(this, fProfile::OBJ_FORCE_SIGN, type & 0xFF, nullptr, nullptr, nullptr, nullptr, 0x3F); if (forceSign != nullptr) { mForceSignRef.link(forceSign); } } if (isAnyTear()) { - dAcBase_c *forceGetFlag = dAcBase_c::createActorStage(fProfile::TAG_FORCE_GET_FLAG, dTgForceGetFlag_c::tearIdxToParam(getTearIdx()), &mPosition, &mRotation, &mScale, 0, mRoomID, this); + dAcBase_c *forceGetFlag = dAcBase_c::createActorStage( + fProfile::TAG_FORCE_GET_FLAG, dTgForceGetFlag_c::tearIdxToParam(getTearIdx()), &mPosition, &mRotation, + &mScale, 0, mRoomID, this + ); if (forceGetFlag == nullptr) { return FAILED; } @@ -984,7 +972,8 @@ int dAcItem_c::create() { if (mId == ITEM_STAMINA_FRUIT && unk) { u32 p1 = (getFirstBitParams2() & 0x1) << 8; u32 parms = ((mParams >> 0x13) & 0x1) | (p1 & ~0x1); - dAcObjBase_c *leaves = dAcObjBase_c::create(fProfile::OBJ_FRUIT_GUTS_LEAF, mRoomID, parms, &mPosition, &mRotation, &mScale, -1); + dAcObjBase_c *leaves = + dAcObjBase_c::create(fProfile::OBJ_FRUIT_GUTS_LEAF, mRoomID, parms, &mPosition, &mRotation, &mScale, -1); if (leaves == nullptr) { return FAILED; } @@ -1042,21 +1031,360 @@ int dAcItem_c::create() { return SUCCEEDED; } -STATE_DEFINE(dAcItem_c, Wait); -STATE_DEFINE(dAcItem_c, Carry); -STATE_DEFINE(dAcItem_c, GetBeetle); -STATE_DEFINE(dAcItem_c, WaitGet); -STATE_DEFINE(dAcItem_c, Get); -STATE_DEFINE(dAcItem_c, WaitGetDemo); -STATE_DEFINE(dAcItem_c, WaitForcedGetDemo); -STATE_DEFINE(dAcItem_c, GetDemo); -STATE_DEFINE(dAcItem_c, WaitTBoxGetDemo); -STATE_DEFINE(dAcItem_c, ResurgeWait); -STATE_DEFINE(dAcItem_c, WaitTurnOff); -STATE_DEFINE(dAcItem_c, WaitSacredDewGetEffect); - void dAcItem_c::initializeState_Wait() {} -void dAcItem_c::executeState_Wait() {} +void dAcItem_c::executeState_Wait() { + bool isFixedPosition; + + bool tmp = false; + mVec3_c topPos = getPosition() + mVec3_c::Ey * mCyl.GetH(); + bool chk = dBgS_ObjRoofChk::CheckPos(&getPosition()); + if (chk) { + tmp = dBgS_ObjRoofChk::GetRoofHeight() < topPos.y; + } + if (tmp) { + isFixedPosition = false; + } else { + f32 f = chk ? dBgS_ObjRoofChk::GetRoofHeight() : 500.0f; + mVec3_c chkPos = getPosition() + mVec3_c::Ey * f; + if (dBgS_ObjGndChk::CheckPos(chkPos)) { + if (topPos.y < dBgS_ObjGndChk::GetGroundHeight()) { + const dAcObjBase_c *obj = dBgS::GetInstance()->GetActorPointer(dBgS_ObjGndChk::GetInstance()); + if (obj == nullptr) { + isFixedPosition = false; + } else { + isFixedPosition = obj->mProfileName == fProfile::OBJ_DESERT; + } + } else { + isFixedPosition = false; + } + } else { + isFixedPosition = false; + } + } + + if (isBabyRattle() && !isFixedPosition) { + isFixedPosition = mCoveredSand.isLinked(); + } + + if (fn_80255CF0() && field_0xD4C > 16 && (!mbNoGravity || !isFixedPosition)) { + mCyl.OnTgCoFlag(0x1); + } else { + mCyl.OffTgCoFlag(0x1); + } + + if ((mItemFlags & 0x80) != 0) { + if (SceneflagManager::sInstance->checkBoolFlag(mRoomID, 0x1D)) { + mCyl.OnTgType(0x2); + } else { + mCyl.OffTgType(0x2); + } + } + + dAcPy_c *link = dAcPy_c::GetLinkM(); + bool tgHit = mCyl.ChkTgHit(); + bool tgBit1; + if (tgHit) { + tgBit1 = mCyl.ChkTgBit1(); + } else { + tgBit1 = false; + } + if (!link->checkFlags0x340(0x10)) { + if (field_0xD65 || (tgHit && (mCyl.ChkTgAtHitType(AT_TYPE_SWORD) || mCyl.ChkTgAtHitType(AT_TYPE_BUGNET)))) { + onTouchLink(); + return; + } + + if (fn_802574A0() && !tgBit1) { + // TODO weird double load of link + link = dAcPy_c::GetLinkM(); + if (!link->vt_0x1C0()) { + addToGetQueue(); + + if ((link->ifHasHealthAndSomethingElse() && this == sItemListHead.get() && + FileManager::GetInstance()->getCurrentHealth() != 0)) { + if (isSmallKey() || isBabyRattle()) { + mStateMgr.changeState(StateID_WaitForcedGetDemo); + } else { + mStateMgr.changeState(StateID_Get); + } + } else { + mStateMgr.changeState(StateID_Get); + } + } else { + mStateMgr.changeState(StateID_GetBeetle); + } + + return; + } + } + + u32 fruitParam = getParams2Lower_shift1_0x7(); + if (tgHit) { + if (mId == ITEM_STAMINA_FRUIT) { + dJEffManager_c::spawnEffect( + PARTICLE_RESOURCE_ID_MAPPING_373_, mPosition, &mRotation, &mScale, nullptr, nullptr, 0, 0 + ); + startSound(SE_O_REFRESH_FRUIT_BREAK); + if (!fruitParam) { + deleteRequest(); + } else { + mStateMgr.changeState(StateID_ResurgeWait); + } + return; + } else if (isLightFruit()) { + mStateMgr.changeState(StateID_ResurgeWait); + return; + } + + // Glittering Spores? + if (mCyl.ChkTgAtHitType(AT_TYPE_0x80000)) { + if (isHeart()) { + if (fn_8024A230()) { + mVec3_c spawnPos(mPosition.x, mPosition.y + 30.0f, mPosition.z); + dAcObjBase_c::create(fProfile::OBJ_FAIRY, mRoomID, 0x3F, &spawnPos, nullptr, nullptr, -1); + dJEffManager_c::spawnEffect( + PARTICLE_RESOURCE_ID_MAPPING_375_, spawnPos, nullptr, nullptr, nullptr, nullptr, 0, 0 + ); + deleteRequest(); + return; + } + } else { + s32 accWeight = 0; + for (int i = 0; i <= (int)ARRAY_LENGTH(sSporeRupeeChances) - 1; i++) { + if (getItemId() != sSporeRupeeChances[i].itemId) { + accWeight += sSporeRupeeChances[i].weight; + } + } + s32 roll = cM::rndInt(accWeight); + s32 acc = 0; + bool found = false; + int i = 0; + while (!found && i <= (int)ARRAY_LENGTH(sSporeRupeeChances) - 1) { + if (getItemId() == sSporeRupeeChances[i].itemId) { + i++; + } else { + acc += sSporeRupeeChances[i].weight; + if (roll < acc) { + found = true; + } else { + i++; + } + } + } + setItemId(sSporeRupeeChances[i].itemId); + mpMdl->vt_0x20(sSporeRupeeChances[i].itemId); + unsetHaveNoGravity(); + mVelocity.y = 10.0f; + fn_80252A80(); + } + } + } + + tickDespawnTimer(); + if (mDespawnTimer == 0) { + return; + } + + if (mLinkage.checkState(dLinkage_c::STATE_ACTIVE)) { + mStateMgr.changeState(StateID_Carry); + return; + } + + fn_80253D50(); + + if (mId == ITEM_STAMINA_FRUIT) { + if (isFirstBitParams2NotSet() && !fn_802577A0()) { + sLib::chase(&field_0xCD8, 1.0f, 0.05f); + } else { + sLib::chase(&field_0xCD8, 0.0f, 0.05f); + } + } else if (isLightFruit()) { + if ((this->*mFnAction4)()) { + sLib::chase(&field_0xCD8, 1.0f, 0.05f); + } else { + field_0xCD8 = 0.0f; + } + } + + bool tgHitArrow = tgHit && mCyl.ChkTgAtHitType(AT_TYPE_ARROW); + bool tgHitClawshot = tgHit && mCyl.ChkTgAtHitType(AT_TYPE_CLAWSHOT); + if (mbNoGravity && tgHit && + ((isAnyRupee() && tgHitArrow) || (isHeart2() && mCyl.ChkTgAtHitType(AT_TYPE_BELLOWS)) || + ((isAnyRupee() || isHeart2()) && + (mCyl.ChkTgAtHitType(AT_TYPE_SLINGSHOT) || mCyl.ChkTgAtHitType(AT_TYPE_CLAWSHOT))) || + mCyl.ChkTgAtHitType(AT_TYPE_BOMB) || mCyl.ChkTgAtHitType(AT_TYPE_0x800000))) { + unsetHaveNoGravity(); + } + + if (mbNoGravity && mCyl.ChkCoHit()) { + unsetHaveNoGravity(); + } + + if (!mbNoGravity) { + unsetActorProperty(AC_PROP_0x1); + } + + if (mbNoGravity) { + mObjAcch.SetMoveBGOnly(); + } else { + mObjAcch.ClrMoveBGOnly(); + } + + if (tgHitArrow) { + field_0xD62 = true; + } else if (tgHit || (!mObjAcch.ChkGroundLanding() && mObjAcch.ChkGndHit())) { + field_0xD62 = false; + } + if (tgHitClawshot) { + field_0xD63 = true; + } else if (tgHit || (!mObjAcch.ChkGroundLanding() && mObjAcch.ChkGndHit())) { + field_0xD63 = false; + } + + if (!mbNoGravity) { + if (!field_0xD51) { + if (isAnyRupee()) { + s32 which; + if (field_0xD62 || field_0xD63) { + which = 1; + } else { + which = 2; + } + if (which == 1 && mFnGetRupeeGravity == nullptr) { + which = 2; + } + if (which == 2 && mFnGetGravity1 == nullptr) { + which = 0; + } + + switch (which) { + case 1: mAcceleration = (this->*mFnGetRupeeGravity)(); break; + case 2: mAcceleration = (this->*mFnGetGravity1)(); break; + } + } else if (isHeart2()) { + if (field_0xD52) { + if (mFnGetHeartGravity != nullptr) { + mAcceleration = (this->*mFnGetHeartGravity)(); + } + } else { + if (mFnGetGravity1 != nullptr) { + mAcceleration = (this->*mFnGetGravity1)(); + } + } + } else { + if (mFnGetRupeeGravity == nullptr || !field_0xD62) { + if (mFnGetGravity1 != nullptr) { + mAcceleration = (this->*mFnGetGravity1)(); + } + } else { + if (mFnGetRupeeGravity != nullptr) { + mAcceleration = (this->*mFnGetRupeeGravity)(); + } + } + } + + if (mFnGetGravity4 != nullptr) { + mMaxSpeed = (this->*mFnGetGravity4)(); + } + + fn_80256F20(); + (this->*mFnAction)(); + calcVelocity(); + mPosition += mVelocity; + mPosition += mStts.GetCcMove(); + } + + if ((mId == ITEM_STAMINA_FRUIT && fruitParam) || isLightFruit()) { + /* nothing */ + } else { + if (!mbNoGravity && !field_0xD51 && 0.0f < mVelocity.y) { + mObjAcch.ClrRoofNone(); + mObjAcch.Clr_0x2000000(); + } else { + mObjAcch.SetRoofNone(); + mObjAcch.Set_0x2000000(); + } + + fn_80256E80(); + + if (mObjAcch.ChkGndHit() && mVelocity.y <= 0.0f) { + u32 specialCode = dBgS::GetInstance()->GetSpecialCode(mObjAcch.GetGnd()); + if (fn_80255C50(specialCode)) { + if (sLib::chase(&field_0xD00, -100.0f, (this->*mFn_0xCB4)())) { + deleteRequest(); + } + } else if (fn_80255CA0(specialCode)) { + sLib::chase(&field_0xD00, -30.0f, (this->*mFn_0xCB4)()); + } else { + sLib::chase(&field_0xD00, 0.0f, 6.0f); + } + } else { + field_0xD00 = 0.0f; + } + + mYOffset = field_0xD00; + if (isAnyTear() && mObjAcch.ChkGroundLanding()) { + startSoundWithFloatParam(SE_Item_A43_FALL, mVelocity.y); + } + } + } + + /* This Function keeps Triforce postion locked 8024edbc */ + if (isTriforce()) { + // TODO + f32 factor = field_0xD48.sin(); + mPosition = mPositionCopy + mVec3_c::Ey * (factor * 16.0f); + field_0xD48.mVal += 182; + } + + if ((mItemFlags & 0x4) != 0 && 3000.0f < mPositionCopy.y - mPosition.y) { + mItemFlags |= 0x8; + } + + if ((mItemFlags & 0x8) == 0) { + (this->*mFnAction3)(); + if (isAnyRupee() && field_0xD38.y > 0) { + holdSoundWithIntParam(SE_O_RUPEE_ROULETTE, field_0xD38.y); + } + + if (!field_0xD51) { + mCyl.SetC(mPosition); + dCcS::GetInstance()->Set(&mCyl); + } + + if (isSmallKey()) { + if (dScGame_c::isCurrentStage("F302")) { + f32 fScale; + getCurrentModelScale(&fScale); + mVec3_c scale(fScale, fScale, fScale); + mEff_0x8F4.holdEffect(PARTICLE_RESOURCE_ID_MAPPING_820_, mPosition, nullptr, &scale, nullptr, nullptr); + } + } else if (isTriforce()) { + f32 fScale; + getCurrentModelScale(&fScale); + mVec3_c scale(fScale, fScale, fScale); + mVec3_c offsetPos(mPosition.x, fScale * 20.0f + mPosition.y, mPosition.z); + dCamera_c *cam = dScGame_c::getCamera(); + mVec3_c dir = offsetPos - cam->getPosition(); + if (!dir.normalizeRS()) { + dir = cam->getTarget() - cam->getPosition(); + if (!dir.normalizeRS()) { + dir.set(mVec3_c::Ez); + dir.rotX(cam->getYAngle()); + dir.rotY(cam->getXZAngle()); + } + } + dir *= -40.0f; + // TODO - for some reason the argument vector is at an entirely wrong stack position... + // Fixing this wil probably fix the rest of the stack position issues in this function. + mEff_0x928.holdEffect(PARTICLE_RESOURCE_ID_MAPPING_821_, offsetPos + dir, nullptr, &scale, nullptr, nullptr); + } + makeLinkLookTowardItem(); + if (!mbNoDespawn && !isItemSmallKeyOrHeartPieceOrStaminaFruit()) { + fn_80254CA0(); + } + } +} void dAcItem_c::finalizeState_Wait() {} void dAcItem_c::initializeState_Carry() {} @@ -1102,3 +1430,16 @@ void dAcItem_c::finalizeState_WaitTurnOff() {} void dAcItem_c::initializeState_WaitSacredDewGetEffect() {} void dAcItem_c::executeState_WaitSacredDewGetEffect() {} void dAcItem_c::finalizeState_WaitSacredDewGetEffect() {} + +STATE_DEFINE(dAcItem_c, Wait); +STATE_DEFINE(dAcItem_c, Carry); +STATE_DEFINE(dAcItem_c, GetBeetle); +STATE_DEFINE(dAcItem_c, WaitGet); +STATE_DEFINE(dAcItem_c, Get); +STATE_DEFINE(dAcItem_c, WaitGetDemo); +STATE_DEFINE(dAcItem_c, WaitForcedGetDemo); +STATE_DEFINE(dAcItem_c, GetDemo); +STATE_DEFINE(dAcItem_c, WaitTBoxGetDemo); +STATE_DEFINE(dAcItem_c, ResurgeWait); +STATE_DEFINE(dAcItem_c, WaitTurnOff); +STATE_DEFINE(dAcItem_c, WaitSacredDewGetEffect); diff --git a/src/d/col/bg/d_bg_s_roof_chk.cpp b/src/d/col/bg/d_bg_s_roof_chk.cpp index f3fe4917..84a3c64d 100644 --- a/src/d/col/bg/d_bg_s_roof_chk.cpp +++ b/src/d/col/bg/d_bg_s_roof_chk.cpp @@ -31,6 +31,7 @@ void dBgS_ObjRoofChk::ClearInstance() { sInstance.ClearPi(); } +// TODO: const reference? bool dBgS_ObjRoofChk::CheckPos(const mVec3_c *pPos) { sInstance.SetPos(pPos); sRoofHeight = dBgS::GetInstance()->RoofChk(&sInstance); From 9843fc692291bf7532d0b26430d306e2dc47098d Mon Sep 17 00:00:00 2001 From: robojumper Date: Sun, 3 May 2026 20:56:05 +0200 Subject: [PATCH 10/14] Item progress --- config/SOUE01/symbols.txt | 224 ++-- include/d/a/d_a_base.h | 1 - include/d/a/d_a_item.h | 211 +++- include/d/a/d_a_itembase.h | 2 +- include/d/a/obj/d_a_obj_warp.h | 9 +- include/d/d_pouch.h | 3 + include/d/t/d_t_minigame_insect_capture.h | 8 + include/d/t/d_t_siren.h | 11 +- src/d/a/d_a_item.cpp | 1128 +++++++++++++++++++-- src/d/d_message.cpp | 2 +- 10 files changed, 1386 insertions(+), 213 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 2a135743..e0a3f829 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -2471,7 +2471,7 @@ fn_8005BBB0 = .text:0x8005BBB0; // type:function size:0xC fairyHeal__17daPlayerActBase_cFP11dAcOFairy_c = .text:0x8005BBC0; // type:function size:0xC turnSoupCold = .text:0x8005BBD0; // type:function size:0x8 addExtraHearts = .text:0x8005BBE0; // type:function size:0x74 -AcItem__healLink = .text:0x8005BC60; // type:function size:0x18 +healLink__9dAcItem_cFUlb = .text:0x8005BC60; // type:function size:0x18 getCurrentHealthCapacity__7dAcPy_cFv = .text:0x8005BC80; // type:function size:0x54 addDigInteractionTarget__7dAcPy_cFP9dAcBase_cf = .text:0x8005BCE0; // type:function size:0xC fn_8005BCF0 = .text:0x8005BCF0; // type:function size:0x30 @@ -10067,7 +10067,7 @@ drawPopups__16dLytMapMarkers_cFv = .text:0x80189B90; // type:function size:0x27C resetPopups__16dLytMapMarkers_cFv = .text:0x80189E10; // type:function size:0xF4 loadPopups__16dLytMapMarkers_cFv = .text:0x80189F10; // type:function size:0x8C getPouchSlotCount__Fb = .text:0x80189FA0; // type:function size:0x6C -isPouchItem = .text:0x8018A010; // type:function size:0x88 +isAnyPouchItem__9dAcItem_cF7ITEM_ID = .text:0x8018A010; // type:function size:0x88 isItemShield__Fl = .text:0x8018A0A0; // type:function size:0x18 isItemExtraAmmo__Fl = .text:0x8018A0C0; // type:function size:0x18 fn_8018A0E0 = .text:0x8018A0E0; // type:function size:0x20 @@ -10080,9 +10080,9 @@ isItemAnyRevitalizingPotion = .text:0x8018A280; // type:function size:0x28 isItemInBottle2 = .text:0x8018A2B0; // type:function size:0x68 getAdditionalInfoForPouchItem = .text:0x8018A320; // type:function size:0x4 getAdditionalInfoForPouchItem2 = .text:0x8018A330; // type:function size:0xC0 -setPouchSlotToValueWithExtraInfo = .text:0x8018A3F0; // type:function size:0x130 +collectPouchItemIntoSlot__FlUsUlb = .text:0x8018A3F0; // type:function size:0x130 tryCollectPouchItemInPouch = .text:0x8018A520; // type:function size:0x60 -collectPouchItem = .text:0x8018A580; // type:function size:0xD0 +collectPouchItem__FUs = .text:0x8018A580; // type:function size:0xD0 adventurePouchFindItemSlot__F7ITEM_ID = .text:0x8018A650; // type:function size:0x84 adventurePouchCountItem__F7ITEM_ID = .text:0x8018A6E0; // type:function size:0x74 convertLytPouchSlot__Fl = .text:0x8018A760; // type:function size:0x1C @@ -10480,7 +10480,7 @@ fn_801961F0 = .text:0x801961F0; // type:function size:0x220 fn_80196410 = .text:0x80196410; // type:function size:0x64 fn_80196480 = .text:0x80196480; // type:function size:0x10 fn_80196490 = .text:0x80196490; // type:function size:0x44 -TgInsectCaptureMinigame__addToCollectedBugs = .text:0x801964E0; // type:function size:0x6C +recordCollectedInsect__26dTgMinigameInsectCapture_cFll = .text:0x801964E0; // type:function size:0x6C TgInsectCaptureMinigame__getBugIndex = .text:0x80196550; // type:function size:0x44 TgStream__initList = .text:0x801965A0; // type:function size:0x50 TgStream__dtorList = .text:0x801965F0; // type:function size:0x58 @@ -13276,11 +13276,11 @@ fn_80246890 = .text:0x80246890; // type:function size:0x4 fn_802468A0 = .text:0x802468A0; // type:function size:0x4 fn_802468B0 = .text:0x802468B0; // type:function size:0xA8 ActorLink__sinit = .text:0x80246960; // type:function size:0x898 -fn_80247200 = .text:0x80247200; // type:function size:0x18 -AcItem__getItemTypeMaybeMaybeFromId = .text:0x80247220; // type:function size:0x54 -AcItem__getItemAnimType = .text:0x80247280; // type:function size:0x44 -AcItem__getHeartContainerHeartIncrease = .text:0x802472D0; // type:function size:0x8 -AcItem__getCompletedHeatpieceHeartIncrease = .text:0x802472E0; // type:function size:0x8 +isValidItemTypeIdx__13dAcItemBase_cFi = .text:0x80247200; // type:function size:0x18 +getItemTypeFromId__13dAcItemBase_cFUsPUl = .text:0x80247220; // type:function size:0x54 +getItemAnimType__13dAcItemBase_cFUsPUl = .text:0x80247280; // type:function size:0x44 +getHeartContainerHeartIncrease__13dAcItemBase_cFv = .text:0x802472D0; // type:function size:0x8 +getCompletedHeartPieceHeartIncrease__13dAcItemBase_cFv = .text:0x802472E0; // type:function size:0x8 getTearIdx__13dAcItemBase_cFi = .text:0x802472F0; // type:function size:0x24 getFlagIdxForTear__13dAcItemBase_cFiPUl = .text:0x80247320; // type:function size:0x60 getTearBit__13dAcItemBase_cFi = .text:0x80247380; // type:function size:0x34 @@ -13289,7 +13289,7 @@ getTrialIndex2 = .text:0x80247470; // type:function size:0xA8 fn_80247520 = .text:0x80247520; // type:function size:0xC fn_80247530 = .text:0x80247530; // type:function size:0xC fn_80247540 = .text:0x80247540; // type:function size:0x78 -AcItem__doFullHeal = .text:0x802475C0; // type:function size:0x28 +doFullHeal__9dAcItem_cFv = .text:0x802475C0; // type:function size:0x28 AcItem__isHeart = .text:0x802475F0; // type:function size:0x10 AcItem__isRupoor = .text:0x80247600; // type:function size:0x10 isItemBottleWithGlitteringSpores = .text:0x80247610; // type:function size:0x10 @@ -13322,7 +13322,7 @@ AcItem__isBluebirdFeather = .text:0x802477B0; // type:function size:0x10 AcItem__isGoldenSkull = .text:0x802477C0; // type:function size:0x10 AcItem__isGoddessPlume = .text:0x802477D0; // type:function size:0x10 isItemRevitalizingPotionPlusPlus = .text:0x802477E0; // type:function size:0x10 -isUpgradedPotionItem = .text:0x802477F0; // type:function size:0xC8 +isUpgradedPotion__9dAcItem_cF7ITEM_ID = .text:0x802477F0; // type:function size:0xC8 fn_802478C0 = .text:0x802478C0; // type:function size:0x68 AcItem__isItemFromMittsOrSword = .text:0x80247930; // type:function size:0x20 fn_80247950 = .text:0x80247950; // type:function size:0x28 @@ -13334,9 +13334,9 @@ fn_80247BB0 = .text:0x80247BB0; // type:function size:0x10C m3d__smdl_c__getNodePos = .text:0x80247CC0; // type:function size:0x58 fn_80247D20 = .text:0x80247D20; // type:function size:0x14C fn_80247E70 = .text:0x80247E70; // type:function size:0x50 -increment = .text:0x80247EC0; // type:function size:0x28 +increment__FPUl = .text:0x80247EC0; // type:function size:0x28 fn_80247EF0 = .text:0x80247EF0; // type:function size:0xA4 -getItemId__13dAcItemBase_cFv = .text:0x80247FA0; // type:function size:0x8 +getItemId__13dAcItemBase_cCFv = .text:0x80247FA0; // type:function size:0x8 fn_80247FB0 = .text:0x80247FB0; // type:function size:0x8 dAcItem_c_classInit__Fv = .text:0x80247FC0; // type:function size:0x30 AcItem__dontForceDemo = .text:0x80247FF0; // type:function size:0x8 @@ -13400,18 +13400,18 @@ createHeap__9dAcItem_cFv = .text:0x8024A470; // type:function size:0x75C create__9dAcItem_cFv = .text:0x8024ABD0; // type:function size:0x2888 changeState__77sStateMgr_c<9dAcItem_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>FRC12sStateIDIf_c = .text:0x8024D460; // type:function size:0x10 getStateID__77sStateMgr_c<9dAcItem_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>CFv = .text:0x8024D470; // type:function size:0x10 -AcItem__destroy = .text:0x8024D480; // type:function size:0xEC -AcItem__update = .text:0x8024D570; // type:function size:0x66C +doDelete__9dAcItem_cFv = .text:0x8024D480; // type:function size:0xEC +actorExecute__9dAcItem_cFv = .text:0x8024D570; // type:function size:0x66C executeState__77sStateMgr_c<9dAcItem_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x8024DBE0; // type:function size:0x10 -AcItem__draw = .text:0x8024DBF0; // type:function size:0x304 -setNumberOfItems = .text:0x8024DF00; // type:function size:0x8 +draw__9dAcItem_cFv = .text:0x8024DBF0; // type:function size:0x304 +setSpawnQuantity__9dAcItem_cFl = .text:0x8024DF00; // type:function size:0x8 setFreestandingYOffset__9dAcItem_cFf = .text:0x8024DF10; // type:function size:0x8 -AcItem__setFramesInAir = .text:0x8024DF20; // type:function size:0x8 -fn_8024DF30 = .text:0x8024DF30; // type:function size:0x8 +setFramesInAir__9dAcItem_cFUl = .text:0x8024DF20; // type:function size:0x8 +setItemFlags__9dAcItem_cFUl = .text:0x8024DF30; // type:function size:0x8 isItemDropFromEnemy__9dAcItem_cCFv = .text:0x8024DF40; // type:function size:0x24 -resetNumberOfItems = .text:0x8024DF70; // type:function size:0xC -AcItem__resetFramesInAir = .text:0x8024DF80; // type:function size:0x8 -AcItem__incrementFramesInAir = .text:0x8024DF90; // type:function size:0x44 +unsetSpawnQuantity__9dAcItem_cFv = .text:0x8024DF70; // type:function size:0xC +unsetFramesInAir__9dAcItem_cFv = .text:0x8024DF80; // type:function size:0x8 +incrementFramesInAir__9dAcItem_cFv = .text:0x8024DF90; // type:function size:0x44 initializeState_Wait__9dAcItem_cFv = .text:0x8024DFE0; // type:function size:0xA8 executeState_Wait__9dAcItem_cFv = .text:0x8024E090; // type:function size:0x10AC finalizeState_Wait__9dAcItem_cFv = .text:0x8024F140; // type:function size:0x7C @@ -13489,19 +13489,19 @@ AcItem__is_Larvae_Ore_JellyBlob_Claw_Horn_EvilCryst_OrnSkull_GoldSkull = .text:0 AcItem__isBug = .text:0x80250D50; // type:function size:0x7C isTreasure2__9dAcItem_cF7ITEM_ID = .text:0x80250DD0; // type:function size:0x138 isTreasure__9dAcItem_cF7ITEM_ID = .text:0x80250F10; // type:function size:0x88 -isHeart2__9dAcItem_cCFv = .text:0x80250FA0; // type:function size:0x34 +isHeartV__9dAcItem_cCFv = .text:0x80250FA0; // type:function size:0x34 isSingleArrow__9dAcItem_cCFv = .text:0x80250FE0; // type:function size:0x8 isArrowBundle__9dAcItem_cCFv = .text:0x80250FF0; // type:function size:0x8 isSilverRupee__9dAcItem_cCFv = .text:0x80251000; // type:function size:0x8 isGoldRupee__9dAcItem_cCFv = .text:0x80251010; // type:function size:0x8 AcItem__isKeyPiece2 = .text:0x80251020; // type:function size:0x8 -isItem10DekuSeeds = .text:0x80251030; // type:function size:0x8 +is10DekuSeeds__9dAcItem_cCFv = .text:0x80251030; // type:function size:0x8 isHeartPiece__9dAcItem_cCFv = .text:0x80251040; // type:function size:0x8 AcItem__isItemBirdStatuette = .text:0x80251050; // type:function size:0x8 -AcItem__isLifeTreeFruit = .text:0x80251060; // type:function size:0x8 -AcItem__isItemAnyRupee = .text:0x80251070; // type:function size:0x34 +isLifeTreeFruit__9dAcItem_cCFv = .text:0x80251060; // type:function size:0x8 +isAnyRupeeV__9dAcItem_cCFv = .text:0x80251070; // type:function size:0x34 isAnyTear__9dAcItem_cCFv = .text:0x802510B0; // type:function size:0x8 -AcItem__isBombRefill = .text:0x802510C0; // type:function size:0x8 +isAnyBombs__9dAcItem_cCFv = .text:0x802510C0; // type:function size:0x8 isTriforce__9dAcItem_cCFv = .text:0x802510D0; // type:function size:0x8 fn_802510E0 = .text:0x802510E0; // type:function size:0x44 fn_80251130 = .text:0x80251130; // type:function size:0x44 @@ -13534,8 +13534,8 @@ fn_80251620 = .text:0x80251620; // type:function size:0x8 AcItem__getPickupDemoScale = .text:0x80251630; // type:function size:0x64 AcItem__getFreestandingModelScale3 = .text:0x802516A0; // type:function size:0x4 AcItem__getPickupBeetleScale = .text:0x802516B0; // type:function size:0x6C -AcItem__getCurrentModelScale = .text:0x80251720; // type:function size:0x94 -AcItem__getCurrentModelScale2 = .text:0x802517C0; // type:function size:0x48 +getCurrentModelScale__9dAcItem_cFPf = .text:0x80251720; // type:function size:0x94 +getCurrentScale__9dAcItem_cFv = .text:0x802517C0; // type:function size:0x48 fn_80251810 = .text:0x80251810; // type:function size:0xA8 fn_802518C0 = .text:0x802518C0; // type:function size:0x78 fn_80251940 = .text:0x80251940; // type:function size:0xA8 @@ -13544,109 +13544,109 @@ AcItem__getPositionOffset = .text:0x80251A90; // type:function size:0x5C fn_80251AF0 = .text:0x80251AF0; // type:function size:0x78 checkFlag__9dAcItem_cFUl = .text:0x80251B70; // type:function size:0x128 setFlag__9dAcItem_cFl = .text:0x80251CA0; // type:function size:0xC0 -AcItem__checkFlagForItem = .text:0x80251D60; // type:function size:0x34 +checkFlagV__9dAcItem_cCFv = .text:0x80251D60; // type:function size:0x34 AcItem__checkItemFlag = .text:0x80251DA0; // type:function size:0x48 hasAnyFairy__9dAcItem_cFv = .text:0x80251DF0; // type:function size:0x50 setItemflag = .text:0x80251E40; // type:function size:0x1C getRupeeCounter = .text:0x80251E60; // type:function size:0x8 getRupeeCounter__9dAcItem_cFv = .text:0x80251E70; // type:function size:0x4 fn_80251E80 = .text:0x80251E80; // type:function size:0xC -addRupees__9dAcItem_cFl = .text:0x80251E90; // type:function size:0x18 +increaseRupeeCounter__9dAcItem_cFl = .text:0x80251E90; // type:function size:0x18 getCurrentWalletCapacity = .text:0x80251EB0; // type:function size:0x8 getCurrentWalletCapacity__9dAcItem_cFv = .text:0x80251EC0; // type:function size:0x4 -AcItem__getCurrentArrowCount = .text:0x80251ED0; // type:function size:0x8 +getBowArrowCount__9dAcItem_cFv = .text:0x80251ED0; // type:function size:0x8 getTotalArrowCount__9dAcItem_cFv = .text:0x80251EE0; // type:function size:0x38 -changeArrowCounter = .text:0x80251F20; // type:function size:0xC -AddOrRemoveArrows = .text:0x80251F30; // type:function size:0x9C -AcItem__getMaxNumberOfArrows = .text:0x80251FD0; // type:function size:0x8 +increaseArrowCounter__9dAcItem_cFl = .text:0x80251F20; // type:function size:0xC +increaseArrowAndPouchCounter__9dAcItem_cFl = .text:0x80251F30; // type:function size:0x9C +getBowArrowCapacity__9dAcItem_cFv = .text:0x80251FD0; // type:function size:0x8 getTotalArrowCapacity__9dAcItem_cFv = .text:0x80251FE0; // type:function size:0x38 getBombsCounter = .text:0x80252020; // type:function size:0x8 getTotalBombCount__9dAcItem_cFv = .text:0x80252030; // type:function size:0x38 changeBombCounter = .text:0x80252070; // type:function size:0xC -changeBombCounterAndPouch = .text:0x80252080; // type:function size:0x9C +increaseBombAndPouchCounter__9dAcItem_cFl = .text:0x80252080; // type:function size:0x9C getMaxStandardBombCapacity = .text:0x80252120; // type:function size:0x8 getTotalBombCapacity__9dAcItem_cFv = .text:0x80252130; // type:function size:0x38 getCurrentTearCount = .text:0x80252170; // type:function size:0x8 AcItem__incrementTearCount = .text:0x80252180; // type:function size:0xC getMaxTearCount = .text:0x80252190; // type:function size:0x8 -AcItem__getCurrentSlingshotSeedCount = .text:0x802521A0; // type:function size:0x8 +getSlingshotSeedCount__9dAcItem_cFv = .text:0x802521A0; // type:function size:0x8 getTotalSeedCount__9dAcItem_cFv = .text:0x802521B0; // type:function size:0x38 -AcItem__changeSlingshotSeedCount = .text:0x802521F0; // type:function size:0xC -addDekuSeeds = .text:0x80252200; // type:function size:0x9C -AcItem__getMaxNumberOfSlingshotSeeds = .text:0x802522A0; // type:function size:0x8 +increaseDekuSeedCounter__9dAcItem_cFl = .text:0x802521F0; // type:function size:0xC +increaseDekuSeedAndPouchCounter__9dAcItem_cFl = .text:0x80252200; // type:function size:0x9C +getSlingshotSeedCapacity__9dAcItem_cFv = .text:0x802522A0; // type:function size:0x8 getTotalSeedCapacity__9dAcItem_cFv = .text:0x802522B0; // type:function size:0x38 getKeyPieceCount__9dAcItem_cFv = .text:0x802522F0; // type:function size:0x8 -increaseKeyPieceCounter = .text:0x80252300; // type:function size:0xC +increaseKeyPieceCounter__9dAcItem_cFl = .text:0x80252300; // type:function size:0xC getSmallKeyCount__9dAcItem_cFv = .text:0x80252310; // type:function size:0x8 -increaseSmallKeyCounter = .text:0x80252320; // type:function size:0xC +increaseSmallKeyCounter__9dAcItem_cFl = .text:0x80252320; // type:function size:0xC getAdditionalPouchSlotCounter = .text:0x80252330; // type:function size:0x8 -addToAdditionalAdventurePouchCounter = .text:0x80252340; // type:function size:0xC -AcItem__getNumOfRemainingHeartPiecesForHeart = .text:0x80252350; // type:function size:0x8 -addToHeartPieceCounter = .text:0x80252360; // type:function size:0xC +increaseExtraPouchCounter__9dAcItem_cFl = .text:0x80252340; // type:function size:0xC +getNumRemainingHeartPiecesForNextHeart__9dAcItem_cFv = .text:0x80252350; // type:function size:0x8 +increaseHeartPieceCounter__9dAcItem_cFl = .text:0x80252360; // type:function size:0xC getHeartContainerHealthCount__9dAcItem_cFv = .text:0x80252370; // type:function size:0x8 -addToHeartPieceCounter2 = .text:0x80252380; // type:function size:0xC +increaseTotalHeartPieceCounter__9dAcItem_cFl = .text:0x80252380; // type:function size:0xC getFaronGrasshopperCount = .text:0x80252390; // type:function size:0x8 -increaseFaronGrasshopperCounter = .text:0x802523A0; // type:function size:0xC +increaseFaronGrasshopperCounter__9dAcItem_cFl = .text:0x802523A0; // type:function size:0xC getWoodlandRhinoBeetleCount = .text:0x802523B0; // type:function size:0x8 -increaseRhinoBeetleCounter = .text:0x802523C0; // type:function size:0xC +increaseWoodlandRhinoBeetleCounter__9dAcItem_cFl = .text:0x802523C0; // type:function size:0xC getDekuHornetCount = .text:0x802523D0; // type:function size:0x8 -increaseDekuHornetCounter = .text:0x802523E0; // type:function size:0xC +increaseDekuHornetCounter__9dAcItem_cFl = .text:0x802523E0; // type:function size:0xC getSkyloftMantisCount = .text:0x802523F0; // type:function size:0x8 -increaseMantisCounter = .text:0x80252400; // type:function size:0xC +increaseSkyloftMantisCounter__9dAcItem_cFl = .text:0x80252400; // type:function size:0xC getVolcanicLadybugCount = .text:0x80252410; // type:function size:0x8 -increaseLadybugCounter = .text:0x80252420; // type:function size:0xC +increaseVolcanicLadybugCounter__9dAcItem_cFl = .text:0x80252420; // type:function size:0xC getBlessedButterflyCount = .text:0x80252430; // type:function size:0x8 -increaseButterflyCounter = .text:0x80252440; // type:function size:0xC +increaseBlessedButterflyCounter__9dAcItem_cFl = .text:0x80252440; // type:function size:0xC getLanayruAntCount = .text:0x80252450; // type:function size:0x8 -increaseAntCounter = .text:0x80252460; // type:function size:0xC +increaseLanayruAntCounter__9dAcItem_cFl = .text:0x80252460; // type:function size:0xC getSandCicadaCount = .text:0x80252470; // type:function size:0x8 -increaseCicadaCounter = .text:0x80252480; // type:function size:0xC +increaseSandCicadaCounter__9dAcItem_cFl = .text:0x80252480; // type:function size:0xC getGerudoDragonflyCount = .text:0x80252490; // type:function size:0x8 -increaseDragonflyCounter = .text:0x802524A0; // type:function size:0xC +increaseGerudoDragonflyCounter__9dAcItem_cFl = .text:0x802524A0; // type:function size:0xC getEldinRollerCount = .text:0x802524B0; // type:function size:0x8 -increaseEldinRollerCounter = .text:0x802524C0; // type:function size:0xC +increaseEldinRollerCounter__9dAcItem_cFl = .text:0x802524C0; // type:function size:0xC getSkyStagBeetleCount = .text:0x802524D0; // type:function size:0x8 -increaseSkyStagBeetleCounter = .text:0x802524E0; // type:function size:0xC +increaseSkyStagBeetleCounter__9dAcItem_cFl = .text:0x802524E0; // type:function size:0xC getStarryFireFlyCount = .text:0x802524F0; // type:function size:0x8 -increaseStarryFireflyCounter = .text:0x80252500; // type:function size:0xC +increaseStarryFireflyCounter__9dAcItem_cFl = .text:0x80252500; // type:function size:0xC getHornetlarvaeCount = .text:0x80252510; // type:function size:0x8 -increaseHornetLarvaeCounter = .text:0x80252520; // type:function size:0xC +increaseHornetLarvaeCounter__9dAcItem_cFl = .text:0x80252520; // type:function size:0xC getBirdFeatherCount = .text:0x80252530; // type:function size:0x8 -increaseBirdFeatherCounter = .text:0x80252540; // type:function size:0xC +increaseBirdFeatherCounter__9dAcItem_cFl = .text:0x80252540; // type:function size:0xC getTumbleweedCount = .text:0x80252550; // type:function size:0x8 -increaseTumbleweedCounter = .text:0x80252560; // type:function size:0xC +increaseTumbleWeedCounter__9dAcItem_cFl = .text:0x80252560; // type:function size:0xC getLizardTailCount = .text:0x80252570; // type:function size:0x8 -increaseLizardTailCounter = .text:0x80252580; // type:function size:0xC +increaseLizardTailCounter__9dAcItem_cFl = .text:0x80252580; // type:function size:0xC getEldinOreCount = .text:0x80252590; // type:function size:0x8 -increaseEldinOreCounter = .text:0x802525A0; // type:function size:0xC +increaseEldinOreCounter__9dAcItem_cFl = .text:0x802525A0; // type:function size:0xC getAncientFlowerCount = .text:0x802525B0; // type:function size:0x8 -increaseAncientFlowerCounter = .text:0x802525C0; // type:function size:0xC +increaseAncientFlowerCounter__9dAcItem_cFl = .text:0x802525C0; // type:function size:0xC getAmberRelicCount = .text:0x802525D0; // type:function size:0x8 -increaseAmberRelicCounter = .text:0x802525E0; // type:function size:0xC +increaseAmberRelicCounter__9dAcItem_cFl = .text:0x802525E0; // type:function size:0xC getDuskRelicCount = .text:0x802525F0; // type:function size:0x8 -increaseDuskRelicCounter = .text:0x80252600; // type:function size:0xC +increaseDuskRelicCounter__9dAcItem_cFl = .text:0x80252600; // type:function size:0xC getJellyBlobCount = .text:0x80252610; // type:function size:0x8 -increaseJellyBlobCounter = .text:0x80252620; // type:function size:0xC +increaseJellyBlobCounter__9dAcItem_cFl = .text:0x80252620; // type:function size:0xC getMonsterClawCount = .text:0x80252630; // type:function size:0x8 -increaseMonsterClawCounter = .text:0x80252640; // type:function size:0xC +increaseMonsterClawCounter__9dAcItem_cFl = .text:0x80252640; // type:function size:0xC getMonsterHornCount = .text:0x80252650; // type:function size:0x8 -increaseMonsterHornCounter = .text:0x80252660; // type:function size:0xC +increaseMonsterHornCounter__9dAcItem_cFl = .text:0x80252660; // type:function size:0xC getOrnamentalSkullCount = .text:0x80252670; // type:function size:0x8 -increaseSkullCounter = .text:0x80252680; // type:function size:0xC +increaseSkullCounter__9dAcItem_cFl = .text:0x80252680; // type:function size:0xC getEvilCrystalCount = .text:0x80252690; // type:function size:0x8 -increaseEviLCrystalCounter = .text:0x802526A0; // type:function size:0xC +increaseEvilCrystalCounter__9dAcItem_cFl = .text:0x802526A0; // type:function size:0xC getBlueBirdFeatherCount = .text:0x802526B0; // type:function size:0x8 -increaseBlueBirdFeatherCounter = .text:0x802526C0; // type:function size:0xC +increaseBlueBirdFeatherCounter__9dAcItem_cFl = .text:0x802526C0; // type:function size:0xC getGoldenSkullCount = .text:0x802526D0; // type:function size:0x8 -increaseGoldenSkullCounter = .text:0x802526E0; // type:function size:0xC +increaseGoldenSkullCounter__9dAcItem_cFl = .text:0x802526E0; // type:function size:0xC getGoddesPlumeCount = .text:0x802526F0; // type:function size:0x8 -increaseGoddessPlumeCounter = .text:0x80252700; // type:function size:0xC +increaseGoddessPlumeCounter__9dAcItem_cFl = .text:0x80252700; // type:function size:0xC getGratitudeCrystalCount__9dAcItem_cFv = .text:0x80252710; // type:function size:0x8 -increaseGratitudeCrystalCounter = .text:0x80252720; // type:function size:0xC +increaseGratitudeCrystalCounter__9dAcItem_cFl = .text:0x80252720; // type:function size:0xC ActorLink__hasLifeTreeSeeding = .text:0x80252730; // type:function size:0x38 -AcItem__giveLifeTreeSeedling = .text:0x80252770; // type:function size:0x94 +setLifeTreeSeedlingFlag__9dAcItem_cFl = .text:0x80252770; // type:function size:0x94 getExtraWalletCount__9dAcItem_cFv = .text:0x80252810; // type:function size:0x8 -increaseExtraWalletCounter = .text:0x80252820; // type:function size:0xC +increaseExtraWalletCounter__9dAcItem_cFl = .text:0x80252820; // type:function size:0xC getTotalRequiredKeyPieceCount__9dAcItem_cFv = .text:0x80252830; // type:function size:0x8 hasAllKeyPieces = .text:0x80252840; // type:function size:0x44 AcItem__getDefaultOffset = .text:0x80252890; // type:function size:0xC @@ -13658,8 +13658,8 @@ fn_802528E0 = .text:0x802528E0; // type:function size:0xC fn_802528F0 = .text:0x802528F0; // type:function size:0x6C unsetHaveNoGravity__9dAcItem_cFv = .text:0x80252960; // type:function size:0xC getItemRotateAngle = .text:0x80252970; // type:function size:0x24 -getLightFruitTime = .text:0x802529A0; // type:function size:0x8 -shouldBlinkBeforeDespawn = .text:0x802529B0; // type:function size:0x30 +getLightFruitTime__9dAcItem_cFv = .text:0x802529A0; // type:function size:0x8 +isBlinkBeforeDespawnShown__9dAcItem_cFl = .text:0x802529B0; // type:function size:0x30 AcItem__canBeLinkedToWoodTag = .text:0x802529E0; // type:function size:0x4 AcItem__doDrop = .text:0x802529F0; // type:function size:0x24 fn_80252A20 = .text:0x80252A20; // type:function size:0x8 @@ -13667,7 +13667,7 @@ fn_80252A30 = .text:0x80252A30; // type:function size:0x4 ActorLink__getItemGetBottlePouchSlot = .text:0x80252A40; // type:function size:0x8 fn_80252A50 = .text:0x80252A50; // type:function size:0xC fn_80252A60 = .text:0x80252A60; // type:function size:0xC -AcItem__shouldNotShowModel = .text:0x80252A70; // type:function size:0xC +isMdlHidden__9dAcItem_cCFv = .text:0x80252A70; // type:function size:0xC fn_80252A80 = .text:0x80252A80; // type:function size:0xC fn_80252A90 = .text:0x80252A90; // type:function size:0xC fn_80252AA0 = .text:0x80252AA0; // type:function size:0xC @@ -13679,7 +13679,7 @@ AcItem__setFinalDeterminedItemId = .text:0x80252C70; // type:function size:0x8 getItemInitStructForItem = .text:0x80252C80; // type:function size:0x5C getItemInitStruct__9dAcItem_cCFv = .text:0x80252CE0; // type:function size:0x8 getItemFlagStruct__13dAcItemBase_cFUs = .text:0x80252CF0; // type:function size:0x54 -AcItem__setFlagForItem = .text:0x80252D50; // type:function size:0x34 +setFlagV__9dAcItem_cFv = .text:0x80252D50; // type:function size:0x34 AcItem__checkFlagForItem2 = .text:0x80252D90; // type:function size:0x34 AcItem__setItemFlagBasedOnId = .text:0x80252DD0; // type:function size:0x34 AcItem__getTreasureShift = .text:0x80252E10; // type:function size:0x48 @@ -13690,9 +13690,9 @@ fn_80252F80 = .text:0x80252F80; // type:function size:0x88 fn_80253010 = .text:0x80253010; // type:function size:0x88 fn_802530A0 = .text:0x802530A0; // type:function size:0xFC applyBoundingBox__9dAcItem_cFv = .text:0x802531A0; // type:function size:0x28 -AcItem__performCollection1&2 = .text:0x802531D0; // type:function size:0x34 -AcItem__performCollection1 = .text:0x80253210; // type:function size:0x7E4 -AcItem__performCollection2 = .text:0x80253A00; // type:function size:0x350 +performCollection__9dAcItem_cFv = .text:0x802531D0; // type:function size:0x34 +performCollectionPart1__9dAcItem_cFv = .text:0x80253210; // type:function size:0x7E4 +performCollectionPart2__9dAcItem_cFv = .text:0x80253A00; // type:function size:0x350 fn_80253D50 = .text:0x80253D50; // type:function size:0xC8 fn_80253E20 = .text:0x80253E20; // type:function size:0xC fn_80253E30 = .text:0x80253E30; // type:function size:0x15C @@ -13703,7 +13703,7 @@ AcItem__decideOnGetOrForcedGet = .text:0x80254260; // type:function size:0x80 fn_802542E0 = .text:0x802542E0; // type:function size:0xA4 AcItem__checkAbovePosition = .text:0x80254390; // type:function size:0x78 fn_80254410 = .text:0x80254410; // type:function size:0x34 -AcItem__updateLightingMaybe = .text:0x80254450; // type:function size:0x134 +updateLightingMaybe__9dAcItem_cFv = .text:0x80254450; // type:function size:0x134 fn_80254590 = .text:0x80254590; // type:function size:0xF0 fn_80254680 = .text:0x80254680; // type:function size:0x20 fn_802546A0 = .text:0x802546A0; // type:function size:0x64 @@ -13900,26 +13900,26 @@ isBabyRattle__9dAcItem_cCFv = .text:0x80256C30; // type:function size:0x8 isEldinOre__9dAcItem_cCFv = .text:0x80256C40; // type:function size:0x8 isJellyBlob__9dAcItem_cCFv = .text:0x80256C50; // type:function size:0x8 isAnyRupee__9dAcItem_cCFv = .text:0x80256C60; // type:function size:0x8 -AcItem__isSingleArrowOrBundle = .text:0x80256C70; // type:function size:0x20 +isAnyArrow__9dAcItem_cCFv = .text:0x80256C70; // type:function size:0x20 isInsect__9dAcItem_cCFv = .text:0x80256C90; // type:function size:0x8 isUnkTreasureGroup1__9dAcItem_cCFv = .text:0x80256CA0; // type:function size:0x8 isTreasure3__9dAcItem_cCFv = .text:0x80256CB0; // type:function size:0x8 -AcItem__isKeyPiece3 = .text:0x80256CC0; // type:function size:0x34 -AcItem__is5GratitudeCrystals2 = .text:0x80256D00; // type:function size:0x34 -AcItem__isItemSingleGratitudeCrystal = .text:0x80256D40; // type:function size:0x34 -AcItem__isFairy = .text:0x80256D80; // type:function size:0x34 -AcItem__isBottleFairy = .text:0x80256DC0; // type:function size:0x34 -AcItem__isStarryFirefly3 = .text:0x80256E00; // type:function size:0x34 -AcItem__isTreasureItem = .text:0x80256E40; // type:function size:0x34 +isKeyPieceV__9dAcItem_cCFv = .text:0x80256CC0; // type:function size:0x34 +is5GratitudeCrystals__9dAcItem_cCFv = .text:0x80256D00; // type:function size:0x34 +isGratitudeCrystal__9dAcItem_cCFv = .text:0x80256D40; // type:function size:0x34 +isFairyV__9dAcItem_cCFv = .text:0x80256D80; // type:function size:0x34 +isBottleFairyV__9dAcItem_cCFv = .text:0x80256DC0; // type:function size:0x34 +isStarryFireflyV__9dAcItem_cCFv = .text:0x80256E00; // type:function size:0x34 +isTreasureV__9dAcItem_cCFv = .text:0x80256E40; // type:function size:0x34 fn_80256E80 = .text:0x80256E80; // type:function size:0x68 -AcItem__setSceneflagForItem = .text:0x80256EF0; // type:function size:0x28 +setSceneFlag__9dAcItem_cFv = .text:0x80256EF0; // type:function size:0x28 fn_80256F20 = .text:0x80256F20; // type:function size:0x564 AcItem__setGrabbableByBeetle = .text:0x80257490; // type:function size:0x10 fn_802574A0 = .text:0x802574A0; // type:function size:0x6C -AcItem__setDungeonflagForTear = .text:0x80257510; // type:function size:0x4C +setDungeonFlag__9dAcItem_cFv = .text:0x80257510; // type:function size:0x4C fn_80257560 = .text:0x80257560; // type:function size:0x1A4 fn_80257710 = .text:0x80257710; // type:function size:0x5C -isFirstBitParams2NotSet = .text:0x80257770; // type:function size:0x28 +isFirstBitParams2NotSet__9dAcItem_cFv = .text:0x80257770; // type:function size:0x28 fn_802577A0 = .text:0x802577A0; // type:function size:0x18 fn_802577C0 = .text:0x802577C0; // type:function size:0x8 fn_802577D0 = .text:0x802577D0; // type:function size:0x8 @@ -13928,10 +13928,10 @@ fn_802577F0 = .text:0x802577F0; // type:function size:0x8 fn_80257800 = .text:0x80257800; // type:function size:0x6C fn_80257870 = .text:0x80257870; // type:function size:0x15C fn_802579D0 = .text:0x802579D0; // type:function size:0x40 -fn_80257A10 = .text:0x80257A10; // type:function size:0x68 -fn_80257A80 = .text:0x80257A80; // type:function size:0x3C -fn_80257AC0 = .text:0x80257AC0; // type:function size:0x44 -fn_80257B10 = .text:0x80257B10; // type:function size:0x10 +fn_80257A10__13dAcItem_0xB3CFP9dAcItem_c = .text:0x80257A10; // type:function size:0x68 +fn_80257A80__13dAcItem_0xB3CFv = .text:0x80257A80; // type:function size:0x3C +fn_80257AC0__13dAcItem_0xB3CFv = .text:0x80257AC0; // type:function size:0x44 +fn_80257B10__13dAcItem_0xB3CFv = .text:0x80257B10; // type:function size:0x10 fn_80257B20 = .text:0x80257B20; // type:function size:0x4 fn_80257B30 = .text:0x80257B30; // type:function size:0x4 fn_80257B40 = .text:0x80257B40; // type:function size:0x8 @@ -13964,10 +13964,10 @@ finalizeState__23sFStateID_c<9dAcItem_c>CFR9dAcItem_c = .text:0x80257E50; // typ executeState__23sFStateID_c<9dAcItem_c>CFR9dAcItem_c = .text:0x80257E80; // type:function size:0x30 initializeState__23sFStateID_c<9dAcItem_c>CFR9dAcItem_c = .text:0x80257EB0; // type:function size:0x30 __sinit_\d_a_item_cpp = .text:0x80257EE0; // type:function size:0xDD0 scope:local -fn_80258CB0 = .text:0x80258CB0; // type:function size:0x1C -fn_80258CD0 = .text:0x80258CD0; // type:function size:0x40 -fn_80258D10 = .text:0x80258D10; // type:function size:0x1C -fn_80258D30 = .text:0x80258D30; // type:function size:0x40 +__arraydtor$27711 = .text:0x80258CB0; // type:function size:0x1C +__dt__9TearIdIdxFv = .text:0x80258CD0; // type:function size:0x40 +__arraydtor$28351 = .text:0x80258D10; // type:function size:0x1C +__dt__20TearEffectColorThingFv = .text:0x80258D30; // type:function size:0x40 __dt__23sFStateID_c<9dAcItem_c>Fv = .text:0x80258D70; // type:function size:0x58 isSameName__23sFStateID_c<9dAcItem_c>CFPCc = .text:0x80258DD0; // type:function size:0x88 dAcBomb_c_classInit__Fv = .text:0x80258E60; // type:function size:0x134 @@ -36252,7 +36252,7 @@ lbl_80533278 = .data:0x80533278; // type:object size:0x10 data:string lbl_80533288 = .data:0x80533288; // type:object size:0x13 data:string lbl_8053329C = .data:0x8053329C; // type:object size:0x14 data:string lbl_805332B0 = .data:0x805332B0; // type:object size:0xC data:string -AcItem__TearGetDemoThings = .data:0x805332C0; // type:object size:0x40 +sTearIdxes = .data:0x805332C0; // type:object size:0x40 lbl_80533300 = .data:0x80533300; // type:object size:0xE data:string lbl_80533310 = .data:0x80533310; // type:object size:0x11 data:string g_profile_ITEM = .data:0x80533328; // type:object size:0x10 @@ -36266,7 +36266,7 @@ lbl_80533D70 = .data:0x80533D70; // type:object size:0xC data:4byte jumptable_80533D7C = .data:0x80533D7C; // type:object size:0x90 scope:local lbl_80533E0C = .data:0x80533E0C; // type:object size:0xF data:string jumptable_80533E1C = .data:0x80533E1C; // type:object size:0x90 scope:local -lbl_80533EAC = .data:0x80533EAC; // type:object size:0x34 +lbl_80533EB0 = .data:0x80533EB0; // type:object size:0x30 __vt__9dAcItem_c = .data:0x80533EE0; // type:object size:0x98 __vt__47sFStateMgr_c<9dAcItem_c,20sStateMethodUsr_FI_c> = .data:0x80533F78; // type:object size:0x30 __vt__77sStateMgr_c<9dAcItem_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x80533FA8; // type:object size:0x30 @@ -41222,7 +41222,7 @@ lbl_8057396C = .sdata:0x8057396C; // type:object size:0x5 data:string lbl_80573974 = .sdata:0x80573974; // type:object size:0x5 data:string lbl_8057397C = .sdata:0x8057397C; // type:object size:0x5 data:string lbl_80573984 = .sdata:0x80573984; // type:object size:0x5 data:string -ITEM_GET_BOTTLE_POUCH_SLOT = .sdata:0x8057398C; // type:object size:0x4 data:4byte +sGetItemPouchSlot__9dAcItem_c = .sdata:0x8057398C; // type:object size:0x4 data:4byte lbl_80573990 = .sdata:0x80573990; // type:object size:0x6 data:string lbl_80573998 = .sdata:0x80573998; // type:object size:0x5 data:string lbl_805739A0 = .sdata:0x805739A0; // type:object size:0x5 data:string @@ -42589,7 +42589,7 @@ lbl_805758B8 = .sbss:0x805758B8; // type:object size:0x4 align:4 data:float lbl_805758BC = .sbss:0x805758BC; // type:object size:0x4 align:4 data:float sItemList__9dAcItem_c = .sbss:0x805758C0; // type:object size:0x8 data:4byte lbl_805758C8 = .sbss:0x805758C8; // type:object size:0x8 data:4byte -NUMBER_OF_ITEMS = .sbss:0x805758D0; // type:object size:0x4 data:4byte +sGetItemQuantity__9dAcItem_c = .sbss:0x805758D0; // type:object size:0x4 data:4byte sIsPerformingInitialCollection__9dAcItem_c = .sbss:0x805758D4; // type:object size:0x1 data:byte TREASURE_TEMP_COLLECT = .sbss:0x805758D8; // type:object size:0x4 data:4byte sCollectionCurrentCount__9dAcItem_c = .sbss:0x805758DC; // type:object size:0x4 data:4byte @@ -52262,7 +52262,7 @@ AcSalbageNpc__STATE_CARRIED = .bss:0x805B2334; // type:object size:0xF4 data:4by lbl_805B2428 = .bss:0x805B2428; // type:object size:0x10 lbl_805B2438 = .bss:0x805B2438; // type:object size:0x6C align:4 data:float lbl_805B24A4 = .bss:0x805B24A4; // type:object size:0xC -TgInsectCaptureMinigame__ACTOR_REF = .bss:0x805B24B0; // type:object size:0x10 data:4byte +sInstance__26dTgMinigameInsectCapture_c = .bss:0x805B24B0; // type:object size:0x10 data:4byte lbl_805B24C0 = .bss:0x805B24C0; // type:object size:0x20 lbl_805B24E0 = .bss:0x805B24E0; // type:object size:0x10 StageMgr__STATE_READ_STAGE_RES = .bss:0x805B24F0; // type:object size:0x40 data:4byte @@ -52362,8 +52362,8 @@ AcItem__DEFAULT_OFFSET = .bss:0x805B4548; // type:object size:0xC align:4 data:f AcItem__ZERO_OFFSET = .bss:0x805B4554; // type:object size:0xC align:4 data:float lbl_805B4560 = .bss:0x805B4560; // type:object size:0xC align:4 data:float lbl_805B456C = .bss:0x805B456C; // type:object size:0x18 align:4 data:float -START_OF_ITEM_LIST = .bss:0x805B4584; // type:object size:0x18 data:4byte -END_OF_ITEM_LIST = .bss:0x805B459C; // type:object size:0x1C data:4byte +sItemListHead__9dAcItem_c = .bss:0x805B4584; // type:object size:0x18 data:4byte +sItemListTail__9dAcItem_c = .bss:0x805B459C; // type:object size:0x1C data:4byte AcItem__STATE_WAIT = .bss:0x805B45B8; // type:object size:0x40 data:4byte AcItem__STATE_CARRY = .bss:0x805B45F8; // type:object size:0x40 data:4byte AcItem__STATE_GET_BEETLE = .bss:0x805B4638; // type:object size:0x40 data:4byte diff --git a/include/d/a/d_a_base.h b/include/d/a/d_a_base.h index 5bfb0c53..f063e4e2 100644 --- a/include/d/a/d_a_base.h +++ b/include/d/a/d_a_base.h @@ -238,7 +238,6 @@ public: void setParams2Upper_ignoreLower(u32 val); int getParams2UpperByte(); void setParams2UpperByte(u32 val); - bool isFirstBitParams2NotSet(); static u32 buildParams2(u32 lower, u32 upper); u32 getParams2Lower() const; u32 getFirstBitParams2() const; diff --git a/include/d/a/d_a_item.h b/include/d/a/d_a_item.h index 98952d59..7928765a 100644 --- a/include/d/a/d_a_item.h +++ b/include/d/a/d_a_item.h @@ -18,7 +18,9 @@ #include "toBeSorted/actor_event.h" #include "toBeSorted/d_emitter.h" #include "toBeSorted/dowsing_target.h" -#include "toBeSorted/item_mdl.h" + +class dItemMdl_c; +class dAcItem_c; class dAcItem_0xB34 { public: @@ -52,6 +54,12 @@ public: virtual void vt_0x14() = 0; virtual void vt_0x18() = 0; + void fn_802579D0(); + bool fn_80257A10(dAcItem_c*); + bool fn_80257A80(); + void fn_80257AC0(); + bool fn_80257B10(); + protected: /* 0x04 */ u8 _0x04[0x08 - 0x04]; }; @@ -95,8 +103,11 @@ public: dAcItem_c(); virtual ~dAcItem_c(); - virtual int create() override; virtual bool createHeap() override; + virtual int create() override; + virtual int doDelete() override; + virtual int actorExecute() override; + virtual int draw() override; virtual u16 getItemIdFromParams() override; virtual void setItemId(u16 id); @@ -136,11 +147,15 @@ public: static s32 getTotalBombCount(); static s32 getTotalArrowCount(); + static s32 getBowArrowCount(); static s32 getTotalSeedCount(); + static s32 getSlingshotSeedCount(); static s32 getTotalBombCapacity(); - static s32 getTotalSeedCapacity(); + static s32 getBowArrowCapacity(); static s32 getTotalArrowCapacity(); + static s32 getTotalSeedCapacity(); + static s32 getSlingshotSeedCapacity(); static s32 getRupeeCounter(); static u32 getCurrentWalletCapacity(); @@ -161,10 +176,13 @@ public: static bool isTreasure2(ITEM_ID item); static bool isTreasure(ITEM_ID item); static bool isTear(ITEM_ID item); + static bool isAnyPouchItem(ITEM_ID item); + static bool isUpgradedPotion(ITEM_ID item); bool isLightFruit() const; bool isSingleArrow() const; bool isArrowBundle() const; + bool isAnyArrow() const; bool isTriforce() const; bool isGratitudeCrystal() const; bool is5GratitudeCrystals() const; @@ -183,10 +201,26 @@ public: bool isHeartPiece() const; bool isTreasure3() const; bool isInsect() const; - bool isHeart2() const; bool isAnyRupee() const; bool isAnyTear() const; bool isBabyRattle() const; + bool is10DekuSeeds() const; + bool isAnyBombs() const; + bool isLifeTreeFruit() const; + bool isBirdStatuette() const; + + // These go through the vtable to retrieve the item id. Can't think of a better name for now + bool isKeyPieceV() const; + bool isHeartV() const; + bool isTreasureV() const; + bool isGratitudeCrystalV() const; + bool is5GratitudeCrystalsV() const; + bool isFairyV() const; + bool isBottleFairyV() const; + bool isStarryFireflyV() const; + bool isAnyRupeeV() const; + + static void increaseRupeeCounter(s32 by); u32 getParams2Lower_shift1_0x7() const; @@ -194,8 +228,6 @@ public: static void itemGetEventStart(dAcBase_c *); static void itemGetEventEnd(dAcBase_c *); - static void addRupees(s32 amount); - static bool hasAnyFairy(); enum Trial_e { @@ -240,6 +272,8 @@ private: static s32 sGetItemQuantity; static const mVec3_c sFreestandingDowsingOffset; + static const mVec3_c sScale1Maybe; + static const mVec3_c sScale2Maybe; typedef bool (dAcItem_c::*sStaticPtmf)(); static const sStaticPtmf sStaticPtmfs[]; @@ -249,10 +283,103 @@ private: static const ItemInitStruct *getItemInitStructForId(u16 itemId); const ItemInitStruct *getItemInitStruct() const; + + static void setTreasureTempCollect(u16 id); + static void setSpawnQuantity(s32 quantity); + static void unsetSpawnQuantity(); + + void setObtainedItemId(u32, bool); + bool checkItemFlagV() const; + void setItemFlagV(); + bool checkFlagV() const; + void setFlagV(); + void setSceneFlag(); + void setDungeonFlag(); + + static void increaseKeyPieceCounter(s32 by); + static void increaseHeartPieceCounter(s32 by); + static void increaseTotalHeartPieceCounter(s32 by); + static void increaseFaronGrasshopperCounter(s32 by); + static s32 getFaronGrasshooperCounter(); + static void increaseWoodlandRhinoBeetleCounter(s32 by); + static s32 getWoodlandRhinoBeetleCounter(); + static void increaseDekuHornetCounter(s32 by); + static s32 getDekuHornetCounter(); + static void increaseSkyloftMantisCounter(s32 by); + static s32 getSkyloftMantisCounter(); + static void increaseVolcanicLadybugCounter(s32 by); + static s32 getVolcanicLadybugCounter(); + static void increaseBlessedButterflyCounter(s32 by); + static s32 getBlessedButterflyCounter(); + static void increaseLanayruAntCounter(s32 by); + static s32 getLanayruAntCounter(); + static void increaseSandCicadaCounter(s32 by); + static s32 getSandCicadaCounter(); + static void increaseGerudoDragonflyCounter(s32 by); + static s32 getGerudoDragonflyCounter(); + static void increaseEldinRollerCounter(s32 by); + static s32 getEldinRollerCounter(); + static void increaseSkyStagBeetleCounter(s32 by); + static s32 getSkyStagBeetleCounter(); + static void increaseStarryFireflyCounter(s32 by); + static s32 getStarryFireflyCounter(); + static void increaseHornetLarvaeCounter(s32 by); + static s32 getHornetLarvaeCounter(); + static void increaseBirdFeatherCounter(s32 by); + static s32 getBirdFeatherCounter(); + static void increaseTumbleWeedCounter(s32 by); + static s32 getTumbleWeedCounter(); + static void increaseLizardTailCounter(s32 by); + static s32 getLizardTailCounter(); + static void increaseEldinOreCounter(s32 by); + static s32 getEldinOreCounter(); + static void increaseAncientFlowerCounter(s32 by); + static s32 getAncientFlowerCounter(); + static void increaseAmberRelicCounter(s32 by); + static s32 getAmberRelicCounter(); + static void increaseDuskRelicCounter(s32 by); + static s32 getDuskRelicCounter(); + static void increaseJellyBlobCounter(s32 by); + static s32 getJellyBlobCounter(); + static void increaseMonsterClawCounter(s32 by); + static s32 getMonsterClawCounter(); + static void increaseMonsterHornCounter(s32 by); + static s32 getMonsterHornCounter(); + static void increaseSkullCounter(s32 by); + static s32 getSkullCounter(); + static void increaseEvilCrystalCounter(s32 by); + static s32 getEvilCrystalCounter(); + static void increaseBlueBirdFeatherCounter(s32 by); + static s32 getBlueBirdFeatherCounter(); + static void increaseGoldenSkullCounter(s32 by); + static s32 getGoldenSkullCounter(); + static void increaseGoddessPlumeCounter(s32 by); + static s32 getGoddessPlumeCounter(); + static void increaseGratitudeCrystalCounter(s32 by); + static s32 getGratitudeCrystalCounter(); + static void increaseExtraWalletCounter(s32 by); + static s32 getExtraWalletCounter(); + static void increaseSmallKeyCounter(s32 by); + static void increaseArrowCounter(s32 by); + static void increaseDekuSeedCounter(s32 by); + static void increaseArrowAndPouchCounter(s32 by); + static void increaseBombAndPouchCounter(s32 by); + static void increaseDekuSeedAndPouchCounter(s32 by); + static void increaseExtraPouchCounter(s32 by); + + static void increaseHealthCapacity(s32 by); + static void setLifeTreeSeedlingFlag(s32 by); + + static s32 getLightFruitTime(); + static s32 getNumRemainingHeartPiecesForNextHeart(); + static void doFullHeal(); + static void restoreStamina(); + bool isItemDropFromEnemy() const; static u16 determineActualItemIdFromItem(u16); u16 getItemId2() const; static s32 getSubtypeFromParam(u32 params); + bool isFirstBitParams2NotSet(); void setupUnkColliderFlags2(); static bool hitCallback(dAcObjBase_c *i_actorA, cCcD_Obj *i_objInfA, dAcObjBase_c *i_actorB, cCcD_Obj *i_objInfB); void fn_80253F90(bool); @@ -265,11 +392,15 @@ private: void applyBoundingBox(); s32 getTearIdx(); void setFreestandingYOffset(f32); - void fn_8024DF30(u32 flags); + void setFramesInAir(u32 numFrames); + void unsetFramesInAir(); + void incrementFramesInAir(); + void setItemFlags(u32 flags); bool fn_80255CF0(); bool fn_802574A0(); void addToGetQueue(); + void removeFromGetQueue(); static bool fn_8024A230(); void unsetHaveNoGravity(); void fn_80252A80(); @@ -281,9 +412,56 @@ private: bool fn_80255C50(u32 specialCode); bool fn_80255CA0(u32 specialCode); void getCurrentModelScale(f32 *scale); + f32 getCurrentScale(); + void fn_802518C0(mVec3_c *out); void makeLinkLookTowardItem(); void fn_80254CA0(); + void fn_802546A0(); + void fn_80254710(); + void fn_80254790(); + + bool checkAbovePosition(); + + bool isMdlHidden() const; + static bool isBlinkBeforeDespawnShown(s32 timer); + + void performCollection(); + void performCollectionPart1(); + void performCollectionPart2(); + + void fn_80254BC0(); + void fn_80255B10(); + void updateLightingMaybe(); + + void fn_80253E20(); + void fn_80254BA0(); + + void setNotWaiting(); + void fn_802548A0(); + void decideOnGetOrForcedGet(); + + void fn_80256710(mVec3_c &); + void fn_80257560(const mVec3_c &); + void fn_80254D10(); + bool fn_80254D70(); + void fn_802542E0(); + + static bool fn_80247BB0(); + bool checkShouldDemo(); + bool fn_80254EC0(); + void addGetEvent(); + void fn_80254590(mVec3_c &); + void fn_80254680(); + void fn_80254810(); + static s16 getItemRotateAngle(); + + static void getItemGetEventName(u16 id, char *const *name); + + // Could also return vector + static void fn_80247540(mVec3_c &); + void fn_80247560(const mVec3_c &); + // static PTMF callbacks bool fn_80248020(); bool fn_80248010(); @@ -314,7 +492,7 @@ private: f32 getTreasure3Scale(); f32 getInsectScale(); f32 getDefaultScale(); - + f32 getHighValueRupeePickupScale(); f32 getDefaultPickupScale(); @@ -487,6 +665,9 @@ private: f32 fn_802577C0(); f32 fn_802577D0(); + void fn_80255E80(); + void fn_80255F40(); + /* 0x334 */ dItemMdl_c *mpMdl; /* 0x338 */ dShadowCircle_c mShdw; /* 0x340 */ mVec3_c field_0x340; @@ -542,7 +723,7 @@ private: /* 0xC78 */ f32 (dAcItem_c::*mFnGetHitKnockback3)(); /* 0xC84 */ f32 (dAcItem_c::*mFnGetHitKnockbackRand3)(); /* 0xC90 */ f32 (dAcItem_c::*mFn_0xC90)(); - /* 0xC9C */ UNKTYPE (dAcItem_c::*mFunc_0xC9C)(UNKTYPE); + /* 0xC9C */ void (dAcItem_c::*mFn_0xC9C)(); /* 0xCA8 */ void (dAcItem_c::*mFnSetBoundingBox)(); /* 0xCB4 */ f32 (dAcItem_c::*mFn_0xCB4)(void); /* 0xCC0 */ dAcRef_c mItemQueuePrev; @@ -556,18 +737,22 @@ private: /* 0xCF0 */ u8 _CF0[0xD00 - 0xCF0]; /* 0xD00 */ f32 field_0xD00; /* 0xD04 */ f32 field_0xD04; - /* 0xD08 */ u8 _D08[0xD14 - 0xD08]; + /* 0xD08 */ u8 _D08[0xD0C - 0xD08]; + /* 0xD0C */ f32 field_0xD0C; + /* 0xD10 */ u8 _D10[0xD14 - 0xD10]; /* 0xD14 */ f32 mFreestandingOffsetH; /* 0xD18 */ f32 field_0xD18; /* 0xD1C */ s32 mGetItemPouchSlot; /* 0xD20 */ s32 field_0xD20; /* 0xD24 */ u8 _D24[0xD2C - 0xD24]; /* 0xD2C */ u32 mFramesInAir; - /* 0xD30 */ s32 mItemQuantity; + /* 0xD30 */ u32 mItemQuantity; /* 0xD34 */ u32 mItemFlags; - /* 0xD38 */ mAng3_c field_0xD38; + /* 0xD38 */ s16 field_0xD38; + /* 0xD3A */ s16 field_0xD3A; + /* 0xD3C */ s16 field_0xD3C; /* 0xD3E */ u16 field_0xD3E; - /* 0xD40 */ mAng mMdlRotY; + /* 0xD40 */ s16 mMdlRotY; /* 0xD42 */ s16 field_0xD42; /* 0xD44 */ u16 mRealItemId; /* 0xD46 */ u16 mDespawnTimer; diff --git a/include/d/a/d_a_itembase.h b/include/d/a/d_a_itembase.h index 23f64926..d0f29f23 100644 --- a/include/d/a/d_a_itembase.h +++ b/include/d/a/d_a_itembase.h @@ -243,7 +243,7 @@ class dAcItemBase_c : public dAcObjBase_c { public: dAcItemBase_c() {} virtual ~dAcItemBase_c() {} - virtual u16 getItemId(); + virtual u16 getItemId() const; virtual u16 getItemIdFromParams() = 0; static bool isValidItemTypeIdx(int itemId); diff --git a/include/d/a/obj/d_a_obj_warp.h b/include/d/a/obj/d_a_obj_warp.h index 33bb80de..ccba8330 100644 --- a/include/d/a/obj/d_a_obj_warp.h +++ b/include/d/a/obj/d_a_obj_warp.h @@ -63,9 +63,16 @@ public: || isLanayruTrialAndCompleted() || isHyliaTrialAndCompleted(); } + + void onCollectFirstTear() { + mFirstTearCollected = true; + } + private: - /* 0x330 */ u8 field_0x330[0xC66-0x330]; + /* 0x330 */ u8 field_0x330[0xC66 - 0x330]; /* 0xC66 */ u8 mTrialIndexBitmask; + /* 0xC67 */ u8 field_0xC67[0xC8D - 0xC67]; + /* 0xC8D */ bool mFirstTearCollected; /* 0x??? */ STATE_MGR_DECLARE(dAcOWarp_c); }; diff --git a/include/d/d_pouch.h b/include/d/d_pouch.h index 6ef2f808..3b3ae555 100644 --- a/include/d/d_pouch.h +++ b/include/d/d_pouch.h @@ -29,4 +29,7 @@ void sortStock(); u16 itemCheckFindItemSlot(ITEM_ID item); +void collectPouchItem(u16 id); +void collectPouchItemIntoSlot(s32 slot, u16 id, u32, bool); + #endif diff --git a/include/d/t/d_t_minigame_insect_capture.h b/include/d/t/d_t_minigame_insect_capture.h index c905809e..a634ce63 100644 --- a/include/d/t/d_t_minigame_insect_capture.h +++ b/include/d/t/d_t_minigame_insect_capture.h @@ -1,6 +1,7 @@ #ifndef D_T_MINIGAME_INSECT_CAPTURE_H #define D_T_MINIGAME_INSECT_CAPTURE_H +#include "d/a/d_a_base.h" #include "d/t/d_tg.h" class dTgMinigameInsectCapture_c : public dTg_c { @@ -8,7 +9,14 @@ public: dTgMinigameInsectCapture_c(); virtual ~dTgMinigameInsectCapture_c(); + static dTgMinigameInsectCapture_c *GetInstance() { + return sInstance.get(); + } + + void recordCollectedInsect(s32 id, s32 count); + private: + static dAcRef_c sInstance; }; #endif diff --git a/include/d/t/d_t_siren.h b/include/d/t/d_t_siren.h index 77456fa7..9cda9b7e 100644 --- a/include/d/t/d_t_siren.h +++ b/include/d/t/d_t_siren.h @@ -31,12 +31,21 @@ public: return sInstance->_hasCollectedAllTears(); } + static void setLightFruitTime(u16 time) { + if (sInstance == nullptr) { + return; + } + sInstance->mPillarTime = time; + } + private: bool outOfTime() const; bool _hasCollectedAllTears(); static dTgSiren_c *sInstance; - /* 0x0FC */ u8 _0x0FC[0x2C0 - 0x0FC]; + /* 0x0FC */ u8 _0x0FC[0x140 - 0x0FC]; + /* 0x140 */ u32 mPillarTime; + /* 0x144 */ u8 _0x144[0x2C0 - 0x144]; /* 0x2C0 */ Timekeeper mTimekeeper; }; diff --git a/src/d/a/d_a_item.cpp b/src/d/a/d_a_item.cpp index 4301c64a..ec833cfb 100644 --- a/src/d/a/d_a_item.cpp +++ b/src/d/a/d_a_item.cpp @@ -4,34 +4,36 @@ #include "common.h" #include "d/a/d_a_itembase.h" #include "d/a/d_a_player.h" +#include "d/a/npc/d_a_npc_talk_kensei.h" +#include "d/a/obj/d_a_obj_boomerang.h" +#include "d/a/obj/d_a_obj_warp.h" #include "d/col/bg/d_bg_s.h" -#include "d/col/bg/d_bg_s_gnd_chk.h" -#include "d/col/bg/d_bg_s_roof_chk.h" #include "d/col/cc/d_cc_d.h" #include "d/col/cc/d_cc_s.h" #include "d/d_camera.h" #include "d/d_linkage.h" +#include "d/d_player.h" #include "d/d_pouch.h" #include "d/d_sc_game.h" #include "d/flag/dungeonflag_manager.h" +#include "d/flag/itemflag_manager.h" #include "d/flag/sceneflag_manager.h" #include "d/flag/storyflag_manager.h" #include "d/snd/d_snd_small_effect_mgr.h" #include "d/snd/d_snd_wzsound.h" #include "d/t/d_t_force_get_flag.h" -#include "f/f_list_mg.h" -#include "f/f_profile_name.h" +#include "d/t/d_t_minigame_insect_capture.h" +#include "d/t/d_t_siren.h" #include "m/m_vec.h" -#include "s/s_Math.h" -#include "toBeSorted/d_emitter.h" -#include "toBeSorted/dowsing_target.h" #include "toBeSorted/event_manager.h" #include "toBeSorted/file_manager.h" +#include "toBeSorted/item_mdl.h" #include "toBeSorted/item_mdl_item.h" #include "toBeSorted/item_mdl_light_fruit.h" #include "toBeSorted/item_mdl_misc.h" #include "toBeSorted/item_mdl_rupee.h" #include "toBeSorted/item_mdl_stamina_fruit.h" +#include "toBeSorted/minigame_mgr.h" const ItemFlagStruct dAcItemBase_c::sDefaultFlagStruct = {0x28, 0x3C, 0x1E, 0xFF, 0x0000, 0x02, 0x01}; const ItemFlagStruct dAcItemBase_c::sItemFlagStructs[167] = { @@ -263,30 +265,6 @@ static const dCcD_SrcCyl sSrcCyl = { {40.0f, 60.0f} }; -static const char *const sResNodeName = "Set"; -/* static */ extern const char *const sDefaultGetItem = "DefaultGetItem"; -/* static */ extern const char *const sItemGetGorgeous = "ItemGetGorgeous"; -/* static */ extern const char *const sItemGetDefaultTbox = "ItemGetDefaultTBox"; -/* static */ extern const char *const sItemGetGorgeousTbox = "ItemGetGorgeousTBox"; -/* static */ extern const char *const sItemGetBird = "ItemGetBird"; - -struct TearIdIdx { - s32 idx; - u16 itemId; - u32 _0x04; - u32 _0x08; -}; - -/* static */ extern "C" TearIdIdx sTearIdxes[] = { - {0, ITEM_FARORE_TEAR}, - {1, ITEM_DIN_TEAR}, - {2, ITEM_NAYRU_TEAR}, - {3, ITEM_SACRED_TEAR}, -}; - -/* static */ extern const char *const sGetFairyBody = "GetFairy_body"; -/* static */ extern const char *const sBottleFairy_body = "BottleFairy_body"; - bool dAcItemBase_c::isValidItemTypeIdx(int itemId) { return itemId < ARRAY_LENGTH(sItemTypeFlags); } @@ -347,7 +325,16 @@ bool dAcItemBase_c::setDungeonFlagForTear(int tearNum) { return true; } -u16 dAcItemBase_c::getItemId() { +// This might be a cM::calcTimer thing... +bool increment(u32 *value) { + if (*value < UINT32_MAX) { + (*value)++; + return true; + } + return false; +} + +u16 dAcItemBase_c::getItemId() const { return mId; } @@ -370,11 +357,58 @@ u16 getIndex(u16 itemId) { // } // } -fLiMgBa_c dAcItem_c::sItemList; - -SPECIAL_ACTOR_PROFILE(ITEM, dAcItem_c, fProfile::ITEM, 0x2B, 0, 2); +static const char *const sResNodeName = "Set"; +/* static */ extern const char *const sDefaultGetItem = "DefaultGetItem"; +/* static */ extern const char *const sItemGetGorgeous = "ItemGetGorgeous"; +/* static */ extern const char *const sItemGetDefaultTbox = "ItemGetDefaultTBox"; +/* static */ extern const char *const sItemGetGorgeousTbox = "ItemGetGorgeousTBox"; +/* static */ extern const char *const sItemGetBird = "ItemGetBird"; const mVec3_c dAcItem_c::sFreestandingDowsingOffset(0.0f, 25.0f, 0.0f); +const mVec3_c dAcItem_c::sScale1Maybe(1.0f, 1.0f, 1.0f); +const mVec3_c dAcItem_c::sScale2Maybe(1.75f, 1.75f, 1.75f); + +struct TearIdIdx { + s32 idx; + u16 itemId; + mColor color1; + mColor color2; +}; + +/* static */ extern "C" TearIdIdx sTearIdxes[] = { + {0, ITEM_FARORE_TEAR, mColor(0x00, 0x80, 0x30, 0xFF), mColor(0xFF, 0xFF, 0xFF, 0xFF)}, + {1, ITEM_DIN_TEAR, mColor(0xFF, 0x64, 0x80, 0xFF), mColor(0xFF, 0xFF, 0xFF, 0xFF)}, + {2, ITEM_NAYRU_TEAR, mColor(0x80, 0x80, 0x00, 0xFF), mColor(0xFF, 0xFF, 0xFF, 0xFF)}, + {3, ITEM_SACRED_TEAR, mColor(0x00, 0x64, 0xC8, 0xFF), mColor(0xFF, 0xFF, 0xFF, 0xFF)}, +}; + +struct TearEffectColorThing { + mColor color1; + mColor color2; + mColor color3; + mColor color4; + mColor color5; + mColor color6; +}; + +extern "C" TearEffectColorThing sTearEffectColors[] = { + {mColor(0x80, 0xFF, 0x80, 0xFF), mColor(0x00, 0xFF, 0x40, 0xFF), mColor(0xC8, 0xFF, 0xC8, 0xFF), + mColor(0x40, 0xFF, 0x40, 0xFF), mColor(0x40, 0xFF, 0x60, 0xFF), mColor(0x00, 0xFF, 0x40, 0xFF)}, + + {mColor(0xFF, 0x80, 0xA0, 0xFF), mColor(0xFF, 0x40, 0x80, 0xFF), mColor(0xFF, 0xC8, 0xC8, 0xFF), + mColor(0xFF, 0x40, 0x80, 0xFF), mColor(0xFF, 0x60, 0x80, 0xFF), mColor(0xFF, 0x00, 0x40, 0xFF)}, + + {mColor(0xFF, 0xFF, 0x80, 0xFF), mColor(0xFF, 0xFF, 0x00, 0xFF), mColor(0xFF, 0xFF, 0xC8, 0xFF), + mColor(0xFF, 0xFF, 0x40, 0xFF), mColor(0xFF, 0xFF, 0xFF, 0xFF), mColor(0xFF, 0xFF, 0xFF, 0xFF)}, + + {mColor(0x80, 0xFF, 0xFF, 0xFF), mColor(0x00, 0x80, 0xFF, 0xFF), mColor(0xC8, 0xC8, 0xFF, 0xFF), + mColor(0x40, 0xA0, 0xFF, 0xFF), mColor(0xFF, 0xFF, 0xFF, 0xFF), mColor(0xFF, 0xFF, 0xFF, 0xFF)}, +}; + +/* static */ extern const char *const sGetFairyBody = "GetFairy_body"; +/* static */ extern const char *const sBottleFairy_body = "BottleFairy_body"; + +SPECIAL_ACTOR_PROFILE(ITEM, dAcItem_c, fProfile::ITEM, 0x2B, 0, 2); const dAcItem_c::sStaticPtmf dAcItem_c::sStaticPtmfs[] = { &dAcItem_c::fn_80248020, nullptr, @@ -385,6 +419,10 @@ const dAcItem_c::sStaticPtmf dAcItem_c::sStaticPtmfs[] = { &dAcItem_c::fn_80255BD0, &dAcItem_c::fn_80255C40, }; +fLiMgBa_c dAcItem_c::sItemList; +dAcRef_c dAcItem_c::sItemListHead; +dAcRef_c dAcItem_c::sItemListTail; + dAcItem_c::dAcItem_c() : mStateMgr(*this), mEff_0x8F4(this), @@ -584,7 +622,7 @@ int dAcItem_c::create() { default: return FAILED; } - if (isHeart2()) { + if (isHeartV()) { mFunc_0xB58 = &dAcItem_c::fn_802555F0; } else { mFunc_0xB58 = &dAcItem_c::fn_802555D0; @@ -592,7 +630,7 @@ int dAcItem_c::create() { if (isAnyRupee()) { mFnBounce = &dAcItem_c::bounceRupee; - } else if (isHeart2()) { + } else if (isHeartV()) { mFnBounce = &dAcItem_c::bounceNone; } else { mFnBounce = &dAcItem_c::bounceNormal; @@ -661,7 +699,7 @@ int dAcItem_c::create() { mCyl.SetTg_0x4C(0x6CC0); } else if (isBabyRattle()) { mCyl.SetTg_0x4C(0x6480); - } else if (!isAnyRupee() && !isHeart2() && mId != ITEM_STAMINA_FRUIT) { + } else if (!isAnyRupee() && !isHeartV() && mId != ITEM_STAMINA_FRUIT) { mCyl.SetTg_0x4C(0x6480); } @@ -669,7 +707,7 @@ int dAcItem_c::create() { mCyl.SetTgInfo_0x1(0x13); } else if (isHeartPiece()) { mCyl.SetTgInfo_0x1(0x15); - } else if (!isAnyRupee() && !isHeart2() && mId != ITEM_STAMINA_FRUIT) { + } else if (!isAnyRupee() && !isHeartV() && mId != ITEM_STAMINA_FRUIT) { mCyl.SetTgInfo_0x1(0x13); } @@ -927,7 +965,7 @@ int dAcItem_c::create() { default: mFnGetHitKnockbackRand3 = nullptr; break; } - if (isHeart2()) { + if (isHeartV()) { mFn_0xCB4 = &dAcItem_c::fn_802577C0; } else { mFn_0xCB4 = &dAcItem_c::fn_802577D0; @@ -935,11 +973,11 @@ int dAcItem_c::create() { if (mbNoDespawn) { dBgS::GetInstance()->SetLightingCode(this, 10.0f); - } else if (isHeart2()) { + } else if (isHeartV()) { mLinkage.bushTpFunc(mObjAcch); } - if (isHeart2()) { + if (isHeartV()) { field_0xD20 = 6; } @@ -1006,7 +1044,7 @@ int dAcItem_c::create() { } if (EventManager::isInEvent() && EventManager::isCurrentEvent("GetGenkiItem")) { - fn_8024DF30(mItemFlags | 0x20); + setItemFlags(mItemFlags | 0x20); } // okay @@ -1019,7 +1057,7 @@ int dAcItem_c::create() { } if (is) { // Skyview Temple - Heart Piece behind bars in main room - fn_8024DF30(mItemFlags | 0x80); + setItemFlags(mItemFlags | 0x80); } field_0xD48 = cM::rndInt(0x10000); @@ -1031,10 +1069,251 @@ int dAcItem_c::create() { return SUCCEEDED; } -void dAcItem_c::initializeState_Wait() {} +int dAcItem_c::doDelete() { + sItemList.remove(&this->mNode); + dAcItem_c *prev = mItemQueuePrev.get(); + dAcItem_c *next = mItemQueueNext.get(); + + if (prev == nullptr) { + if (next == nullptr) { + if (this == sItemListHead.get()) { + sItemListHead.unlink(); + } + if (this == sItemListTail.get()) { + sItemListTail.unlink(); + } + } else { + sItemListHead.link(next); + next->mItemQueuePrev.unlink(); + } + } else if (next == nullptr) { + sItemListTail.link(prev); + prev->mItemQueueNext.unlink(); + } else { + prev->mItemQueueNext.link(next); + next->mItemQueuePrev.link(prev); + } + + return SUCCEEDED; +} + +int dAcItem_c::actorExecute() { + if (!checkActorProperty(AC_PROP_0x10000000)) { + if (mId == ITEM_STAMINA_FRUIT) { + if (isFirstBitParams2NotSet() && !fn_802577A0()) { + field_0xCD8 = 0.0f; + } else { + field_0xCD8 = 1.0f; + } + } else if (isLightFruit()) { + if ((this->*mFnAction4)()) { + field_0xCD8 = 1.0f; + } else { + field_0xCD8 = 0.0f; + } + } + + dAcOScatterSand *ac = + static_cast(fManager_c::searchBaseByProfName(fProfile::OBJ_VSD, nullptr)); + bool keepGoing = true; + while (keepGoing && ac != nullptr) { + if (mPosition.squareDistance(ac->mPosition) < 90000.0f) { + mCoveredSand.link(ac); + keepGoing = false; + } else { + ac = static_cast(fManager_c::searchBaseByProfName(fProfile::OBJ_VSD, ac)); + } + } + } + + if (field_0xD4C < 0xFF) { + field_0xD4C++; + } + + fn_80254BC0(); + fn_80255B10(); + + field_0xD5C = 0; + field_0xD66 = 0; + + mStateMgr.executeState(); + + updateLightingMaybe(); + if (mDespawnTimer == 0) { + deleteRequest(); + return SUCCEEDED; + } + + if ((mItemFlags & 0x8) != 0) { + deleteRequest(); + return SUCCEEDED; + } + + mRotation.y += field_0xD38; + f32 scaleF = getCurrentScale(); + mScale.set(scaleF, scaleF, scaleF); + mVec3_c tmp1; + fn_802518C0(&tmp1); + mPositionCopy2.set(tmp1); + mVec3_c tmp2; + fn_802518C0(&tmp2); + mPositionCopy3.set(tmp2); + + mLinkage.fn_800511E0(this); + + if (!checkObjectProperty(OBJ_PROP_0x200)) { + mMtx_c mtx = mWorldMtx; + mtx.YrotM(mMdlRotY); + mtx.ZrotM(field_0xD42); + + if (isGratitudeCrystal() || isUnkTreasureGroup1()) { + if (mStateMgr.isState(StateID_Wait) || mStateMgr.isState(StateID_Carry)) { + f32 off = mFreestandingOffsetH; + f32 sc = getCurrentScale(); + mtx.m[1][3] += sc * off; + } + } else if (isInsect()) { + if (mStateMgr.isState(StateID_Get)) { + mtx.YrotM(-0x2000); + } + } + + mpMdl->setLocalMtx(mtx); + mpMdl->setScale(mScale); + + if (isFairyV() || isBottleFairyV()) { + m3d::smdl_c *mdl = mpMdl->getMdl(); + if (mdl != nullptr) { + mdl->calc(false); + } + } + } + + field_0xD51 = 0; + mCyl.ClrTgHit(); + mCyl.ClrCoHit(); + field_0xD65 = 0; + if ((isAnyRupeeV() || mId == ITEM_STAMINA_FRUIT) && field_0xD66 && mObjAcch.ChkGroundLanding()) { + dJEffManager_c::spawnGroundEffect(mPosition, mPolyAttr0, mPolyAttr1, field_0x1B4, 1, 0.7f, field_0x1B0); + } + + if (isStarryFireflyV() && !checkObjectProperty(OBJ_PROP_0x200)) { + fn_802546A0(); + } + + if (isFairyV() && !checkObjectProperty(OBJ_PROP_0x200)) { + fn_80254710(); + } + + if (isBottleFairyV() && !checkObjectProperty(OBJ_PROP_0x200)) { + fn_80254790(); + } + + if (checkAbovePosition()) { + mItemFlags |= 0x10; + f32 f = mPosition.y - dBgS_ObjGndChk::GetGroundHeight(); + field_0xD18 = f < 0.0f ? 0.0f : f; + } else { + mItemFlags &= ~0x10; + } + + applyBoundingBox(); + + bool tmp = 0.0f < field_0xD04; + if (tmp || mStateMgr.isState(StateID_WaitGetDemo) || mStateMgr.isState(StateID_Get) || + mStateMgr.isState(StateID_GetBeetle)) { + setActorProperty(AC_PROP_0x4); + } else { + unsetActorProperty(AC_PROP_0x4); + } + + return SUCCEEDED; +} + +int dAcItem_c::draw() { + if (mMdlScaleType == 2 || 0.0f < field_0xCD8) { + bool shouldDraw = true; + if (isMdlHidden()) { + shouldDraw = false; + } else if ((mStateMgr.isState(StateID_Wait) || mStateMgr.isState(StateID_Carry)) && mbIsWaiting) { + shouldDraw = isBlinkBeforeDespawnShown(mDespawnTimer); + } + if (shouldDraw) { + mpMdl->draw(); + } + + if (mLinkage.checkConnection(dLinkage_c::CONNECTION_9) || + (mId == ITEM_STAMINA_FRUIT && getParams2Lower_shift1_0x7()) || isLightFruit() || (mItemFlags & 0x10) == 0) { + /* nothing */ + } else if (mMdlScaleType == 2) { + mQuat_c v(mVec3_c(0.0f, 0.0f, 0.0f), getItemFlagStruct(getItemId())->field_0x02); + drawShadow(mShdw, nullptr, mWorldMtx, &v, -1, -1, -1, -1, -1, field_0xD18); + } else { + mQuat_c v( + mVec3_c(0.0f, field_0xCD8 * 0.5f * getItemFlagStruct(getItemId())->field_0x01, 0.0f), + field_0xCD8 * getItemFlagStruct(getItemId())->field_0x02 + ); + drawShadow(mShdw, nullptr, mWorldMtx, &v, -1, -1, -1, -1, -1, field_0xD18); + } + } + return SUCCEEDED; +} + +void dAcItem_c::setSpawnQuantity(s32 quantity) { + sGetItemQuantity = quantity; +} + +void dAcItem_c::setFreestandingYOffset(f32 off) { + mFreestandingOffsetH = off; +} + +void dAcItem_c::setFramesInAir(u32 numFrames) { + mFramesInAir = numFrames; +} + +void dAcItem_c::setItemFlags(u32 flags) { + mItemFlags = flags; +} + +bool dAcItem_c::isItemDropFromEnemy() const { + return mObjID != 0xFFFF; +} + +void dAcItem_c::unsetSpawnQuantity() { + sGetItemQuantity = 0; +} + +void dAcItem_c::unsetFramesInAir() { + setFramesInAir(0); +} + +void dAcItem_c::incrementFramesInAir() { + u32 v = mFramesInAir; + increment(&v); + setFramesInAir(v); +} + +void dAcItem_c::initializeState_Wait() { + if (mbNoGravity) { + setActorProperty(AC_PROP_0x1); + mSpeed = 0.0f; + mVelocity.y = 0.0f; + } + mpMdl->vt_0x10(dItemMdl_c::ITEM_MDL_UNK0x14_1); + field_0xD5B = 0; + field_0xD38 = field_0xD3A = field_0xD3C = 0; + fn_80253E20(); + if (mbNoGravity) { + mObjAcch.SetMoveBGOnly(); + } + mMdlScaleType = 0; + field_0xD00 = 0.0f; + mYOffset = 0.0f; +} + void dAcItem_c::executeState_Wait() { bool isFixedPosition; - + bool tmp = false; mVec3_c topPos = getPosition() + mVec3_c::Ey * mCyl.GetH(); bool chk = dBgS_ObjRoofChk::CheckPos(&getPosition()); @@ -1194,9 +1473,9 @@ void dAcItem_c::executeState_Wait() { if (mId == ITEM_STAMINA_FRUIT) { if (isFirstBitParams2NotSet() && !fn_802577A0()) { - sLib::chase(&field_0xCD8, 1.0f, 0.05f); - } else { sLib::chase(&field_0xCD8, 0.0f, 0.05f); + } else { + sLib::chase(&field_0xCD8, 1.0f, 0.05f); } } else if (isLightFruit()) { if ((this->*mFnAction4)()) { @@ -1209,8 +1488,8 @@ void dAcItem_c::executeState_Wait() { bool tgHitArrow = tgHit && mCyl.ChkTgAtHitType(AT_TYPE_ARROW); bool tgHitClawshot = tgHit && mCyl.ChkTgAtHitType(AT_TYPE_CLAWSHOT); if (mbNoGravity && tgHit && - ((isAnyRupee() && tgHitArrow) || (isHeart2() && mCyl.ChkTgAtHitType(AT_TYPE_BELLOWS)) || - ((isAnyRupee() || isHeart2()) && + ((isAnyRupee() && tgHitArrow) || (isHeartV() && mCyl.ChkTgAtHitType(AT_TYPE_BELLOWS)) || + ((isAnyRupee() || isHeartV()) && (mCyl.ChkTgAtHitType(AT_TYPE_SLINGSHOT) || mCyl.ChkTgAtHitType(AT_TYPE_CLAWSHOT))) || mCyl.ChkTgAtHitType(AT_TYPE_BOMB) || mCyl.ChkTgAtHitType(AT_TYPE_0x800000))) { unsetHaveNoGravity(); @@ -1261,7 +1540,7 @@ void dAcItem_c::executeState_Wait() { case 1: mAcceleration = (this->*mFnGetRupeeGravity)(); break; case 2: mAcceleration = (this->*mFnGetGravity1)(); break; } - } else if (isHeart2()) { + } else if (isHeartV()) { if (field_0xD52) { if (mFnGetHeartGravity != nullptr) { mAcceleration = (this->*mFnGetHeartGravity)(); @@ -1331,20 +1610,19 @@ void dAcItem_c::executeState_Wait() { /* This Function keeps Triforce postion locked 8024edbc */ if (isTriforce()) { - // TODO f32 factor = field_0xD48.sin(); mPosition = mPositionCopy + mVec3_c::Ey * (factor * 16.0f); field_0xD48.mVal += 182; } - if ((mItemFlags & 0x4) != 0 && 3000.0f < mPositionCopy.y - mPosition.y) { + if ((mItemFlags & 0x4) != 0 && 3000.0f < mPositionCopy.y - mPosition.y) { mItemFlags |= 0x8; } if ((mItemFlags & 0x8) == 0) { (this->*mFnAction3)(); - if (isAnyRupee() && field_0xD38.y > 0) { - holdSoundWithIntParam(SE_O_RUPEE_ROULETTE, field_0xD38.y); + if (isAnyRupee() && field_0xD3A > 0) { + holdSoundWithIntParam(SE_O_RUPEE_ROULETTE, field_0xD3A); } if (!field_0xD51) { @@ -1377,7 +1655,9 @@ void dAcItem_c::executeState_Wait() { dir *= -40.0f; // TODO - for some reason the argument vector is at an entirely wrong stack position... // Fixing this wil probably fix the rest of the stack position issues in this function. - mEff_0x928.holdEffect(PARTICLE_RESOURCE_ID_MAPPING_821_, offsetPos + dir, nullptr, &scale, nullptr, nullptr); + mEff_0x928.holdEffect( + PARTICLE_RESOURCE_ID_MAPPING_821_, offsetPos + dir, nullptr, &scale, nullptr, nullptr + ); } makeLinkLookTowardItem(); if (!mbNoDespawn && !isItemSmallKeyOrHeartPieceOrStaminaFruit()) { @@ -1385,50 +1665,459 @@ void dAcItem_c::executeState_Wait() { } } } -void dAcItem_c::finalizeState_Wait() {} -void dAcItem_c::initializeState_Carry() {} -void dAcItem_c::executeState_Carry() {} -void dAcItem_c::finalizeState_Carry() {} +void dAcItem_c::finalizeState_Wait() { + unsetActorProperty(AC_PROP_0x1); + mObjAcch.SetRoofNone(); + mObjAcch.Clr_0x2000000(); + field_0xD00 = 0.0f; + mYOffset = 0.0f; + if (isTriforce() && mEff_0x928.hasEmitters()) { + mEff_0x928.remove(true); + } +} + +void dAcItem_c::initializeState_Carry() { + mpMdl->vt_0x10(dItemMdl_c::ITEM_MDL_UNK0x14_1); + mSpeed = 0.0f; + mVelocity.y = 0.0f; + unsetHaveNoGravity(); + field_0xD38 = field_0xD3A = field_0xD3C = 0; + mCyl.OnTgSet(); + mCyl.ClrCoSet(); + fn_80254BA0(); + field_0xD4A = 0; + mMdlScaleType = 0; +} + +void dAcItem_c::executeState_Carry() { + if (!mbNoDespawn && !isItemSmallKeyOrHeartPieceOrStaminaFruit() && !mbIsWaiting && + mLinkage.checkConnection(dLinkage_c::CONNECTION_8)) { + fn_80254CA0(); + } + tickDespawnTimer(); + if (mDespawnTimer == 0) { + return; + } + + if (fn_802574A0()) { + // TODO weird double load + dAcPy_c *link = dAcPy_c::GetLinkM(); + if (!link->vt_0x1C0()) { + addToGetQueue(); + if (link->ifHasHealthAndSomethingElse() && this == sItemListHead.get() && + FileManager::sInstance->getCurrentHealth() != 0) { + mStateMgr.changeState(StateID_Get); + } else { + mStateMgr.changeState(StateID_WaitGet); + } + } else { + mStateMgr.changeState(StateID_GetBeetle); + } + } else if (!mLinkage.checkState(dLinkage_c::STATE_ACTIVE)) { + mStateMgr.changeState(StateID_Wait); + } else if (mLinkage.checkConnection(dLinkage_c::CONNECTION_9) && mCyl.ChkTgHit() && + !mCyl.ChkTgAtHitType(AT_TYPE_WHIP)) { + mLinkage.fn_80050EA0(this); + mStateMgr.changeState(StateID_Wait); + } else { + fn_80256E80(); + if (mLinkage.checkConnection(dLinkage_c::CONNECTION_9) || mLinkage.checkConnection(dLinkage_c::CONNECTION_8)) { + mCyl.SetC(mPosition); + dCcS::GetInstance()->Set(&mCyl); + } + + if (mLinkage.checkConnection(dLinkage_c::CONNECTION_7)) { + makeLinkLookTowardItem(); + } + } +} + +void dAcItem_c::finalizeState_Carry() { + setupUnkColliderFlags2(); +} + +void dAcItem_c::initializeState_GetBeetle() { + mpMdl->vt_0x10(dItemMdl_c::ITEM_MDL_UNK0x14_1); + setNotWaiting(); + field_0xD38 = field_0xD3A = field_0xD3C = 0; + field_0xD0C = 0.0f; + if (isAnyRupee()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_BE_GET_RUPEE); + } else if (isHeartV()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_BE_GET_HART); + } else if (isSmallKey()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_BE_GET_KEY); + } else if (mId == ITEM_STAMINA_FRUIT) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_BE_GET_REFRESH_FRUIT); + } else if (isUnkTreasureGroup1()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_BE_GET_MATERIAL); + } else { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_BE_GET_CONSUMP_ITEM); + } + + addToGetQueue(); + mMdlScaleType = 3; + fn_802548A0(); +} + +void dAcItem_c::executeState_GetBeetle() { + // TODO weird double load + dAcPy_c *link = dAcPy_c::GetLinkM(); + if (link == nullptr) { + return; + } + dAcBoomerang_c *beetlePtr = (dAcBoomerang_c *)link->vt_0x1C0(); + if (beetlePtr == nullptr) { + if (link->ifHasHealthAndSomethingElse() && this == sItemListHead.get() && + FileManager::sInstance->getCurrentHealth() != 0) { + decideOnGetOrForcedGet(); + } else { + mStateMgr.changeState(StateID_WaitGet); + } + } else if (37.6f - field_0xD0C < 1.6f) { + // TODO what are these numbers + mStateMgr.changeState(StateID_WaitGet); + } else { + mVec3_c v(0.0f, 5.0f, 0.0f); + // This + is weird... inline? + v.rotY(+beetlePtr->mRotation.y); + mPosition = beetlePtr->mPosition + v; + mPosition.y += field_0xD0C; + fn_80255E80(); + sLib::addCalcScaledDiff(&field_0xD0C, 37.6f, 0.1f, 10000.0f); + } +} -void dAcItem_c::initializeState_GetBeetle() {} -void dAcItem_c::executeState_GetBeetle() {} void dAcItem_c::finalizeState_GetBeetle() {} -void dAcItem_c::initializeState_WaitGet() {} -void dAcItem_c::executeState_WaitGet() {} -void dAcItem_c::finalizeState_WaitGet() {} +void dAcItem_c::initializeState_WaitGet() { + field_0xD64 = 0; + setObjectProperty(OBJ_PROP_0x200); + // TODO double load + dAcPy_c *link = dAcPy_c::GetLinkM(); + if (link != nullptr) { + mPosition.set(link->getPosition()); + } + mMdlScaleType = 1; + fn_802548A0(); +} -void dAcItem_c::initializeState_Get() {} -void dAcItem_c::executeState_Get() {} -void dAcItem_c::finalizeState_Get() {} +void dAcItem_c::executeState_WaitGet() { + // TODO double load + dAcPy_c *link = dAcPy_c::GetLinkM(); + if (link != nullptr) { + if (link->ifHasHealthAndSomethingElse()) { + field_0xD64 = true; + } + if (field_0xD64 && this == sItemListHead.get() && FileManager::GetInstance()->getCurrentHealth() != 0) { + decideOnGetOrForcedGet(); + } + } +} + +void dAcItem_c::finalizeState_WaitGet() { + unsetObjectProperty(OBJ_PROP_0x200); +} + +void dAcItem_c::initializeState_Get() { + mpMdl->vt_0x10(dItemMdl_c::ITEM_MDL_UNK0x14_1); + performCollection(); + if (isAnyTear()) { + mVec3_c tmp; + fn_80256710(tmp); + fn_80257560(tmp); + } + fn_80254D10(); + fn_80254D70(); + setNotWaiting(); + field_0xD38 = field_0xD3A = field_0xD3C = 0; + field_0xD4D = false; + mMdlScaleType = 1; + fn_802548A0(); +} + +void dAcItem_c::executeState_Get() { + if (!fn_80254D70()) { + fn_802542E0(); + } else { + // @bug always true + if (field_0xD4D < 0xFFFF) { + field_0xD4D++; + } + if (field_0xD4D > 12) { + removeFromGetQueue(); + } + } +} + +void dAcItem_c::finalizeState_Get() { + removeFromGetQueue(); +} + +void dAcItem_c::initializeState_WaitGetDemo() { + mpMdl->vt_0x10(dItemMdl_c::ITEM_MDL_UNK0x14_2); + setObjectProperty(OBJ_PROP_0x200); + setNotWaiting(); + field_0xD38 = field_0xD3A = field_0xD3C = 0; + mMdlScaleType = 2; + fn_802548A0(); + unsetFramesInAir(); +} + +void dAcItem_c::executeState_WaitGetDemo() { + s32 which = 0; + if (EventManager::isInEvent()) { + which = 2; + } else if (fn_80247BB0()) { + which = 2; + } else if ((isInsect() || isTreasure3()) && checkTreasureTempCollect(getItemId())) { + which = 2; + } else if (checkShouldDemo() && fn_80254EC0()) { + which = 1; + } else if (mFramesInAir > 10) { + which = 2; + } + + switch (which) { + case 1: addGetEvent(); break; + case 2: + unsetObjectProperty(OBJ_PROP_0x200); + mStateMgr.changeState(StateID_Get); + break; + } + unsetFramesInAir(); +} -void dAcItem_c::initializeState_WaitGetDemo() {} -void dAcItem_c::executeState_WaitGetDemo() {} void dAcItem_c::finalizeState_WaitGetDemo() {} -void dAcItem_c::initializeState_WaitForcedGetDemo() {} -void dAcItem_c::executeState_WaitForcedGetDemo() {} +void dAcItem_c::initializeState_WaitForcedGetDemo() { + mpMdl->vt_0x10(dItemMdl_c::ITEM_MDL_UNK0x14_2); + setObjectProperty(OBJ_PROP_0x200); + setNotWaiting(); + field_0xD38 = field_0xD3A = field_0xD3C = 0; + mMdlScaleType = 2; + fn_802548A0(); +} + +void dAcItem_c::executeState_WaitForcedGetDemo() { + if (isAnyTear() && mFramesInAir < 10) { + incrementFramesInAir(); + if (mFramesInAir == 10) { + fn_80257560(mPosition); + } + } + addGetEvent(); +} + void dAcItem_c::finalizeState_WaitForcedGetDemo() {} -void dAcItem_c::initializeState_GetDemo() {} -void dAcItem_c::executeState_GetDemo() {} -void dAcItem_c::finalizeState_GetDemo() {} +void dAcItem_c::initializeState_GetDemo() { + mpMdl->vt_0x10(dItemMdl_c::ITEM_MDL_UNK0x14_2); + switch (getItemId()) { + case ITEM_FARON_GRASSHOPPER: sCollectionCurrentCount = getFaronGrasshooperCounter(); break; + case ITEM_WOODLAND_RHINO_BEETLE: sCollectionCurrentCount = getWoodlandRhinoBeetleCounter(); break; + case ITEM_DEKU_HORNET: sCollectionCurrentCount = getDekuHornetCounter(); break; + case ITEM_SKYLOFT_MANTIS: sCollectionCurrentCount = getSkyloftMantisCounter(); break; + case ITEM_VOLCANIC_LADYBUG: sCollectionCurrentCount = getVolcanicLadybugCounter(); break; + case ITEM_BLESSED_BUTTERFLY: sCollectionCurrentCount = getBlessedButterflyCounter(); break; + case ITEM_LANAYRU_ANT: sCollectionCurrentCount = getLanayruAntCounter(); break; + case ITEM_SAND_CICADA: sCollectionCurrentCount = getSandCicadaCounter(); break; + case ITEM_GERUDO_DRAGONFLY: sCollectionCurrentCount = getGerudoDragonflyCounter(); break; + case ITEM_ELDIN_ROLLER: sCollectionCurrentCount = getEldinRollerCounter(); break; + case ITEM_SKY_STAG_BEETLE: sCollectionCurrentCount = getSkyStagBeetleCounter(); break; + case ITEM_STARRY_FIREFLY: sCollectionCurrentCount = getStarryFireflyCounter(); break; + case ITEM_HORNET_LARVAE: sCollectionCurrentCount = getHornetLarvaeCounter(); break; + case ITEM_BIRD_FEATHER: sCollectionCurrentCount = getBirdFeatherCounter(); break; + case ITEM_TUMBLE_WEED: sCollectionCurrentCount = getTumbleWeedCounter(); break; + case ITEM_LIZARD_TAIL: sCollectionCurrentCount = getLizardTailCounter(); break; + case ITEM_ELDIN_ORE: sCollectionCurrentCount = getEldinOreCounter(); break; + case ITEM_ANCIENT_FLOWER: sCollectionCurrentCount = getAncientFlowerCounter(); break; + case ITEM_AMBER_RELIC: sCollectionCurrentCount = getAmberRelicCounter(); break; + case ITEM_DUSK_RELIC: sCollectionCurrentCount = getDuskRelicCounter(); break; + case ITEM_JELLY_BLOB: sCollectionCurrentCount = getJellyBlobCounter(); break; + case ITEM_MONSTER_CLAW: sCollectionCurrentCount = getMonsterClawCounter(); break; + case ITEM_MONSTER_HORN: sCollectionCurrentCount = getMonsterHornCounter(); break; + case ITEM_ORNAMENTAL_SKULL: sCollectionCurrentCount = getSkullCounter(); break; + case ITEM_EVIL_CRYSTAL: sCollectionCurrentCount = getEvilCrystalCounter(); break; + case ITEM_BLUE_BIRD_FEATHER: sCollectionCurrentCount = getBlueBirdFeatherCounter(); break; + case ITEM_GOLDEN_SKULL: sCollectionCurrentCount = getGoldenSkullCounter(); break; + case ITEM_GODDESS_PLUME: sCollectionCurrentCount = getGoddessPlumeCounter(); break; + } + + performCollectionPart1(); + if (checkItemFlagV()) { + if (isAnyTear()) { + dAcOWarp_c *warp = static_cast(fManager_c::searchBaseByProfName(fProfile::OBJ_WARP)); + if (warp != nullptr) { + warp->onCollectFirstTear(); + } + } + } else { + bool doCollect = true; + if (ITEM_FARON_GRASSHOPPER <= mId && mId <= ITEM_STARRY_FIREFLY && + MinigameManager::isInMinigameState(MinigameManager::INSECT_CAPTURE)) { + doCollect = false; + } + if (doCollect) { + setItemFlagV(); + } + } + + setTreasureTempCollect(getItemId()); + setNotWaiting(); + field_0xD38 = field_0xD3A = field_0xD3C = 0; + mMdlRotY = 0; + setObjectProperty(OBJ_PROP_0x200); + mMdlScaleType = 2; + if (isBirdStatuette()) { + mFn_0xC9C = &dAcItem_c::fn_80255F40; + } else { + mFn_0xC9C = &dAcItem_c::fn_80255E80; + } +} + +void dAcItem_c::executeState_GetDemo() { + switch (mEventRelated.getCurrentEventCommand()) { + case 'act0': mEventRelated.advanceNext(); break; + case 'wait': mEventRelated.advanceNext(); break; + case 'halo': { + mVec3_c efPos; + fn_80254590(efPos); + mVec3_c diff = dScGame_c::getCamera()->getPosition() - mPosition; + // TODO close but an extsh is missing + mAng3_c rot((s32)-diff.atan2sY_XZ(), (s32)diff.atan2sX_Z(), 0); + u32 alpha = 0xFF; + if (dScGame_c::currentSpawnInfo.getTrial() == SpawnInfo::TRIAL) { + alpha = 0x80; + } + mEff_0x95C.holdEffect(PARTICLE_RESOURCE_ID_MAPPING_82_, efPos, &rot, nullptr, nullptr, nullptr); + mEff_0x95C.setGlobalAlpha(alpha); + mEventRelated.advanceNext(); + break; + } + case '????': break; + default: mEventRelated.advanceNext(); break; + } + + if (!checkObjectProperty(OBJ_PROP_0x200)) { + mPosition = getLinkPtr()->vt_0x1A4(); + if (isUpgradedPotion((ITEM_ID)getItemId())) { + fn_80254680(); + } else if (isAnyTear()) { + fn_80254810(); + } + mbShowItemLighting = true; + field_0x340 = mPosition; + (this->*mFn_0xC9C)(); + if (!isGratitudeCrystal() && !is5GratitudeCrystals()) { + mMdlRotY += getItemRotateAngle(); + } + field_0xD42 = mAng::d2s_c(0.0f); + + // TODO - ... + } + makeLinkLookTowardItem(); +} + +void dAcItem_c::finalizeState_GetDemo() { + mMdlRotY = 0; + field_0xD42 = 0; + performCollectionPart2(); + mbShowItemLighting = false; + if (mEff_0x95C.hasEmitters()) { + mEff_0x95C.remove(true); + } + if (isAnyTear() && mEff_0xA60.hasEmitters()) { + mEff_0xA60.remove(true); + } +} + +void dAcItem_c::initializeState_WaitTBoxGetDemo() { + mpMdl->vt_0x10(dItemMdl_c::ITEM_MDL_UNK0x14_2); + setNotWaiting(); + field_0xD38 = field_0xD3A = field_0xD3C = 0; + setObjectProperty(OBJ_PROP_0x200); + mMdlScaleType = 2; + fn_802548A0(); +} + +void dAcItem_c::executeState_WaitTBoxGetDemo() { + const char *name; + getItemGetEventName(getItemId(), &name); + Event ev(name, 1, 0x100001, (void *)itemGetEventStart, (void *)itemGetEventEnd); + EventManager::alsoSetAsCurrentEvent(this, &ev, nullptr); +} -void dAcItem_c::initializeState_WaitTBoxGetDemo() {} -void dAcItem_c::executeState_WaitTBoxGetDemo() {} void dAcItem_c::finalizeState_WaitTBoxGetDemo() {} -void dAcItem_c::initializeState_ResurgeWait() {} -void dAcItem_c::executeState_ResurgeWait() {} +void dAcItem_c::initializeState_ResurgeWait() { + mpMdl->vt_0x10(dItemMdl_c::ITEM_MDL_UNK0x14_1); + // TODO FPR swap + mPosition = mPositionCopy; + mRotation = mRotationCopy; + field_0xB3C->fn_802579D0(); + setNotWaiting(); + // TODO ??? + mbNoGravity = mbNoDespawn; + field_0xD38 = field_0xD3A = field_0xD3C = 0; + mMdlScaleType = 0; + field_0xCD8 = 0.0f; +} + +void dAcItem_c::executeState_ResurgeWait() { + if (field_0xB3C->fn_80257A10(this)) { + if (!field_0xB3C->fn_80257B10()) { + field_0xB3C->fn_80257AC0(); + if (field_0xB3C->fn_80257B10()) { + if (mId == ITEM_STAMINA_FRUIT) { + startSound(SE_O_REFRESH_FRUIT_SPROUT); + } + mStateMgr.changeState(StateID_Wait); + } + } + } else { + field_0xB3C->fn_80257A80(); + } +} + void dAcItem_c::finalizeState_ResurgeWait() {} -void dAcItem_c::initializeState_WaitTurnOff() {} -void dAcItem_c::executeState_WaitTurnOff() {} +void dAcItem_c::initializeState_WaitTurnOff() { + setNotWaiting(); + setObjectProperty(OBJ_PROP_0x200); + mSpeed = 0.0f; + mVelocity.set(0.0f, 0.0f, 0.0f); + field_0xD38 = field_0xD3A = field_0xD3C = 0; + mMdlScaleType = 2; +} + +void dAcItem_c::executeState_WaitTurnOff() { + if (field_0xD04 <= 0.0f) { + deleteRequest(); + } +} + void dAcItem_c::finalizeState_WaitTurnOff() {} -void dAcItem_c::initializeState_WaitSacredDewGetEffect() {} -void dAcItem_c::executeState_WaitSacredDewGetEffect() {} +void dAcItem_c::initializeState_WaitSacredDewGetEffect() { + setNotWaiting(); + setObjectProperty(OBJ_PROP_0x200); + mSpeed = 0.0f; + mVelocity.set(0.0f, 0.0f, 0.0f); + field_0xD38 = field_0xD3A = field_0xD3C = 0; + mMdlScaleType = 2; +} + +void dAcItem_c::executeState_WaitSacredDewGetEffect() { + if (!EventManager::isInEvent()) { + mVec3_c tmp; + fn_80247540(tmp); + fn_80247560(tmp); + mStateMgr.changeState(StateID_WaitTurnOff); + } +} + void dAcItem_c::finalizeState_WaitSacredDewGetEffect() {} STATE_DEFINE(dAcItem_c, Wait); @@ -1443,3 +2132,276 @@ STATE_DEFINE(dAcItem_c, WaitTBoxGetDemo); STATE_DEFINE(dAcItem_c, ResurgeWait); STATE_DEFINE(dAcItem_c, WaitTurnOff); STATE_DEFINE(dAcItem_c, WaitSacredDewGetEffect); + +void dAcItem_c::itemGetEventStart(dAcBase_c *arg) { + // TODO + dAcItem_c *item = static_cast(arg); + item->mStateMgr.changeState(StateID_GetDemo); + item->setObtainedItemId(item->getItemId(), true); + if (item->mId == ITEM_DUNGEON_MAP_FI && ItemflagManager::sInstance->getItemCounterOrFlag(0x32) == 0) { + Event ev("fays_map_guide", 100, 0x100001, nullptr, nullptr); + EventManager::changeOwnEvent(item, dAcNpcTalkKensei_c::GetInstance(), &ev, 0); + } +} + +void dAcItem_c::applyBoundingBox() { + (this->*mFnSetBoundingBox)(); +} + +void dAcItem_c::performCollection() { + performCollectionPart1(); + performCollectionPart2(); +} + +void dAcItem_c::performCollectionPart1() { + u16 id = getItemId(); + if (isKeyPieceV()) { + increaseKeyPieceCounter(1); + } else if (isLightFruit()) { + dTgSiren_c::setLightFruitTime(getLightFruitTime()); + } else if (isHeartPiece()) { + increaseHeartPieceCounter(1); + increaseTotalHeartPieceCounter(1); + } else { + f32 count; + switch (id) { + case ITEM_FARON_GRASSHOPPER: + if (!MinigameManager::isInMinigameState(MinigameManager::INSECT_CAPTURE)) { + increaseFaronGrasshopperCounter(mItemQuantity != 0 ? mItemQuantity : 1); + } + break; + case ITEM_WOODLAND_RHINO_BEETLE: + if (!MinigameManager::isInMinigameState(MinigameManager::INSECT_CAPTURE)) { + increaseWoodlandRhinoBeetleCounter(mItemQuantity != 0 ? mItemQuantity : 1); + } + break; + case ITEM_DEKU_HORNET: + if (!MinigameManager::isInMinigameState(MinigameManager::INSECT_CAPTURE)) { + increaseDekuHornetCounter(mItemQuantity != 0 ? mItemQuantity : 1); + } + break; + case ITEM_SKYLOFT_MANTIS: + if (!MinigameManager::isInMinigameState(MinigameManager::INSECT_CAPTURE)) { + increaseSkyloftMantisCounter(mItemQuantity != 0 ? mItemQuantity : 1); + } + break; + case ITEM_VOLCANIC_LADYBUG: + if (!MinigameManager::isInMinigameState(MinigameManager::INSECT_CAPTURE)) { + increaseVolcanicLadybugCounter(mItemQuantity != 0 ? mItemQuantity : 1); + } + break; + case ITEM_BLESSED_BUTTERFLY: + if (!MinigameManager::isInMinigameState(MinigameManager::INSECT_CAPTURE)) { + increaseBlessedButterflyCounter(mItemQuantity != 0 ? mItemQuantity : 1); + } + break; + case ITEM_LANAYRU_ANT: + if (!MinigameManager::isInMinigameState(MinigameManager::INSECT_CAPTURE)) { + increaseLanayruAntCounter(mItemQuantity != 0 ? mItemQuantity : 1); + } + break; + case ITEM_SAND_CICADA: + if (!MinigameManager::isInMinigameState(MinigameManager::INSECT_CAPTURE)) { + increaseSandCicadaCounter(mItemQuantity != 0 ? mItemQuantity : 1); + } + break; + case ITEM_GERUDO_DRAGONFLY: + if (!MinigameManager::isInMinigameState(MinigameManager::INSECT_CAPTURE)) { + increaseGerudoDragonflyCounter(mItemQuantity != 0 ? mItemQuantity : 1); + } + break; + case ITEM_ELDIN_ROLLER: + if (!MinigameManager::isInMinigameState(MinigameManager::INSECT_CAPTURE)) { + increaseEldinRollerCounter(mItemQuantity != 0 ? mItemQuantity : 1); + } + break; + case ITEM_SKY_STAG_BEETLE: + if (!MinigameManager::isInMinigameState(MinigameManager::INSECT_CAPTURE)) { + increaseSkyStagBeetleCounter(mItemQuantity != 0 ? mItemQuantity : 1); + } + break; + case ITEM_STARRY_FIREFLY: + if (!MinigameManager::isInMinigameState(MinigameManager::INSECT_CAPTURE)) { + increaseStarryFireflyCounter(mItemQuantity != 0 ? mItemQuantity : 1); + } + break; + case ITEM_HORNET_LARVAE: increaseHornetLarvaeCounter(1); break; + case ITEM_BIRD_FEATHER: + // ??? + count = mItemQuantity != 0 ? mItemQuantity : 1; + increaseBirdFeatherCounter(0.0f < count ? count : 1.0f); + break; + case ITEM_TUMBLE_WEED: increaseTumbleWeedCounter(1); break; + case ITEM_LIZARD_TAIL: increaseLizardTailCounter(1); break; + case ITEM_ELDIN_ORE: increaseEldinOreCounter(1); break; + case ITEM_ANCIENT_FLOWER: increaseAncientFlowerCounter(1); break; + case ITEM_AMBER_RELIC: increaseAmberRelicCounter(1); break; + case ITEM_DUSK_RELIC: increaseDuskRelicCounter(1); break; + case ITEM_JELLY_BLOB: increaseJellyBlobCounter(1); break; + case ITEM_MONSTER_CLAW: increaseMonsterClawCounter(1); break; + case ITEM_MONSTER_HORN: increaseMonsterHornCounter(1); break; + case ITEM_ORNAMENTAL_SKULL: increaseSkullCounter(1); break; + case ITEM_EVIL_CRYSTAL: increaseEvilCrystalCounter(1); break; + case ITEM_BLUE_BIRD_FEATHER: + // ??? + count = mItemQuantity != 0 ? mItemQuantity : 1; + increaseBlueBirdFeatherCounter(0.0f < count ? count : 1.0f); + break; + case ITEM_GOLDEN_SKULL: increaseGoldenSkullCounter(1); break; + case ITEM_GODDESS_PLUME: increaseGoddessPlumeCounter(1); break; + default: { + if (isTriforce()) { + doFullHeal(); + } else if (isGratitudeCrystal()) { + increaseGratitudeCrystalCounter(1); + } else if (is5GratitudeCrystals()) { + increaseGratitudeCrystalCounter(5); + } else if (id == ITEM_EXTRA_WALLET) { + increaseExtraWalletCounter(1); + } + break; + } + } + } + + if (mStateMgr.isState(StateID_GetDemo)) { + sIsPerformingInitialCollection = !checkFlagV(); + } + + bool doCollect = true; + if (ITEM_FARON_GRASSHOPPER <= mId && mId <= ITEM_STARRY_FIREFLY && + MinigameManager::isInMinigameState(MinigameManager::INSECT_CAPTURE)) { + doCollect = false; + } + if (doCollect) { + setFlagV(); + } + setSceneFlag(); + setDungeonFlag(); + + if (getSubtypeFromParam(mParams) == 7) { + return; + } + + if (isGreenRupee()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_RUPEE_GREEN); + } else if (isBlueRupee()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_RUPEE_BLUE); + } else if (isRedRupee()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_RUPEE_RED); + } else if (isSilverRupee()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_RUPEE_SILVER); + } else if (isGoldRupee()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_RUPEE_BLUE); + } else if (isRupoor()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_RUPEE_BABA); + } else if (isHeartV()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_HEART_PIECE_GET); + } else if (isAnyTear()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SIREN_GET_SHINE_DEW); + } else if (mId == ITEM_STAMINA_FRUIT) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_REFRESH_FRUIT); + } else if (isLightFruit()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SIREN_GET_HOLY_FRUIT); + } else if (mId == ITEM_5_DEKU_SEEDS || is10DekuSeeds()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_CONSUMP_ITEM_GET); + } else if (isAnyArrow()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_CONSUMP_ITEM_GET); + } else if (isAnyBombs()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_CONSUMP_ITEM_GET); + } else if (isInsect()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_MATERIAL); + } else if (isTreasureV()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_MATERIAL); + } else if (is5GratitudeCrystals() || isGratitudeCrystal()) { + if ((mItemFlags & 0x20) == 0) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_SOURCE_OUTWELL); + } + } else if (isBabyRattle()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_GARAGARA); + } else if (isLifeTreeFruit()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_LIFE_FRUIT); + } else if (mId == ITEM_HEART_CONTAINER) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_HEART_CONTAINER); + } else if (isTriforce()) { + dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_TRIFORCE); + } +} + +void dAcItem_c::performCollectionPart2() { + u16 id = getItemId(); + if (id == ITEM_SMALL_KEY) { + increaseSmallKeyCounter(1); + } else if (id == ITEM_GREEN_RUPEE) { + if (!MinigameManager::isInMinigameState(MinigameManager::THRILL_DIGGER)) { + increaseRupeeCounter(1); + } + } else if (id == ITEM_BLUE_RUPEE) { + if (!MinigameManager::isInMinigameState(MinigameManager::THRILL_DIGGER)) { + increaseRupeeCounter(5); + } + } else if (id == ITEM_RED_RUPEE) { + if (!MinigameManager::isInMinigameState(MinigameManager::THRILL_DIGGER)) { + increaseRupeeCounter(20); + } + } else if (isHeartV()) { + healLink(4, true); + } else if (id == ITEM_SINGLE_ARROW) { + increaseArrowAndPouchCounter(1); + } else if (id == ITEM_BUNDLE_ARROWS) { + increaseArrowAndPouchCounter(10); + } else if (id == ITEM_SILVER_RUPEE) { + if (!MinigameManager::isInMinigameState(MinigameManager::THRILL_DIGGER)) { + increaseRupeeCounter(100); + } + } else if (id == ITEM_GOLD_RUPEE) { + if (!MinigameManager::isInMinigameState(MinigameManager::THRILL_DIGGER)) { + increaseRupeeCounter(300); + } + } else if (id == ITEM_RUPOOR) { + if (!MinigameManager::isInMinigameState(MinigameManager::THRILL_DIGGER)) { + increaseRupeeCounter(-10); + } + } else if (id == ITEM_5_BOMBS) { + increaseBombAndPouchCounter(5); + } else if (id == ITEM_10_BOMBS) { + increaseBombAndPouchCounter(10); + } else if (mId == ITEM_STAMINA_FRUIT) { + restoreStamina(); + } else if (id == ITEM_5_DEKU_SEEDS) { + increaseDekuSeedAndPouchCounter(5); + } else if (is10DekuSeeds()) { + increaseDekuSeedAndPouchCounter(10); + } else if (id == ITEM_POUCH_EXPANSION) { + increaseExtraPouchCounter(1); + } else if (id == ITEM_HEART_CONTAINER) { + increaseHealthCapacity(getHeartContainerHeartIncrease()); + doFullHeal(); + } else if (isHeartPiece()) { + if (getNumRemainingHeartPiecesForNextHeart() == 0) { + increaseHealthCapacity(getCompletedHeartPieceHeartIncrease()); + } + doFullHeal(); + } else if (id == ITEM_LIFE_TREE_SEED) { + setLifeTreeSeedlingFlag(1); + } else if (id == ITEM_BOW || id == ITEM_IRON_BOW || id == ITEM_SACRED_BOW) { + if (!checkFlagV()) { + increaseArrowCounter(getBowArrowCapacity() - getBowArrowCount()); + } + } else if (id == ITEM_SLINGSHOT || id == ITEM_MIGHTY_SCATTERSHOT) { + if (!checkFlagV()) { + increaseDekuSeedCounter(getSlingshotSeedCapacity() - getSlingshotSeedCount()); + } + } else if (isAnyPouchItem((ITEM_ID)id)) { + if (mGetItemPouchSlot == -1) { + collectPouchItem(id); + } else { + collectPouchItemIntoSlot(mGetItemPouchSlot, id, -1, false); + } + } + + if (MinigameManager::isInMinigameState(MinigameManager::INSECT_CAPTURE) && + dTgMinigameInsectCapture_c::GetInstance() != nullptr) { + dTgMinigameInsectCapture_c::GetInstance()->recordCollectedInsect(mId, mItemQuantity != 0 ? mItemQuantity : 1); + } +} diff --git a/src/d/d_message.cpp b/src/d/d_message.cpp index c19a805e..5a1e703e 100644 --- a/src/d/d_message.cpp +++ b/src/d/d_message.cpp @@ -335,7 +335,7 @@ bool dFlow_c::handleEventInternal(const MsbFlowInfo *element) { if (dMessage_c::getInstance()->getField_0x2FC() != -1) { dMessage_c::getInstance()->setField_0x2FC(0x3C); } - dAcItem_c::addRupees(params1n2); + dAcItem_c::increaseRupeeCounter(params1n2); if ((s32)params1n2 > 0) { dLytMeter_c::setRupyField_0x8AD(1); } From 02bab6f41fc616ca7d9aa77f4a81782d65b16200 Mon Sep 17 00:00:00 2001 From: robojumper Date: Sun, 3 May 2026 21:26:44 +0200 Subject: [PATCH 11/14] Fixes --- config/SOUE01/symbols.txt | 44 +++--- include/d/a/d_a_item.h | 8 +- include/d/col/c/c_cc_d.h | 4 +- include/toBeSorted/item_mdl.h | 18 +-- include/toBeSorted/item_mdl_item.h | 4 +- include/toBeSorted/item_mdl_light_fruit.h | 12 +- include/toBeSorted/item_mdl_misc.h | 40 +++--- include/toBeSorted/item_mdl_rupee.h | 12 +- include/toBeSorted/item_mdl_stamina_fruit.h | 12 +- src/REL/d/a/b/d_a_b_lastboss.cpp | 2 +- src/REL/d/a/e/d_a_e_remly.cpp | 2 +- src/REL/d/a/obj/d_a_obj_barrel.cpp | 4 +- src/REL/d/a/obj/d_a_obj_bird_sp.cpp | 2 +- src/REL/d/a/obj/d_a_obj_chair.cpp | 2 +- src/REL/d/a/obj/d_a_obj_dungeon_ship.cpp | 2 +- .../a/obj/d_a_obj_flying_clawshot_target.cpp | 2 +- src/REL/d/a/obj/d_a_obj_grave.cpp | 2 +- src/REL/d/a/obj/d_a_obj_pinwheel.cpp | 2 +- src/REL/d/a/obj/d_a_obj_rope_igaiga.cpp | 2 +- src/REL/d/a/obj/d_a_obj_spike.cpp | 2 +- src/REL/d/a/obj/d_a_obj_toD3_stone_figure.cpp | 2 +- src/REL/d/a/obj/d_a_obj_triforce.cpp | 2 +- src/REL/d/a/obj/d_a_obj_tubo.cpp | 2 +- src/REL/d/a/obj/d_a_obj_tumble_weed.cpp | 2 +- src/REL/d/a/obj/d_a_obj_warp_hole.cpp | 2 +- src/d/a/d_a_item.cpp | 32 ++--- src/d/a/obj/d_a_obj_arrow.cpp | 2 +- src/d/a/obj/d_a_obj_tbox.cpp | 6 +- src/toBeSorted/item_mdl_item.cpp | 9 +- src/toBeSorted/item_mdl_light_fruit.cpp | 52 +++---- src/toBeSorted/item_mdl_misc.cpp | 134 +++++++++--------- src/toBeSorted/item_mdl_rupee.cpp | 52 +++---- src/toBeSorted/item_mdl_stamina_fruit.cpp | 52 +++---- 33 files changed, 262 insertions(+), 265 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index e0a3f829..b5a0aca9 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -9459,57 +9459,57 @@ getMax__18ExtraWalletCounterCFv = .text:0x8016E280; // type:function size:0x8 sc __sinit_\extra_wallet_counter_cpp = .text:0x8016E290; // type:function size:0x8 scope:local isMdlForItemId__13dItemMdlPut_cFUs = .text:0x8016E2A0; // type:function size:0x6C init__13dItemMdlPut_cFUsP9dAcItem_cP12mAllocator_c = .text:0x8016E310; // type:function size:0x194 -vt_0x10__13dItemMdlPut_cFUc = .text:0x8016E4B0; // type:function size:0x1C +setDrawMode__13dItemMdlPut_cFUc = .text:0x8016E4B0; // type:function size:0x1C setScale__13dItemMdlPut_cFRC7mVec3_c = .text:0x8016E4D0; // type:function size:0x48 setLocalMtx__13dItemMdlPut_cFRC6mMtx_c = .text:0x8016E520; // type:function size:0x48 draw__13dItemMdlPut_cFv = .text:0x8016E570; // type:function size:0x40 -vt_0x20__13dItemMdlPut_cFv = .text:0x8016E5B0; // type:function size:0x4 +changeItemId__13dItemMdlPut_cFUs = .text:0x8016E5B0; // type:function size:0x4 setPriorityDraw__13dItemMdlPut_cFv = .text:0x8016E5C0; // type:function size:0x48 unsetPriorityDraw__13dItemMdlPut_cFv = .text:0x8016E610; // type:function size:0x48 isMdlForItemId__16dItemMdlShield_cFUs = .text:0x8016E660; // type:function size:0x6C init__16dItemMdlShield_cFUsP9dAcItem_cP12mAllocator_c = .text:0x8016E6D0; // type:function size:0x15C -vt_0x10__16dItemMdlShield_cFUc = .text:0x8016E830; // type:function size:0x8 +setDrawMode__16dItemMdlShield_cFUc = .text:0x8016E830; // type:function size:0x8 setScale__16dItemMdlShield_cFRC7mVec3_c = .text:0x8016E840; // type:function size:0x8 setLocalMtx__16dItemMdlShield_cFRC6mMtx_c = .text:0x8016E850; // type:function size:0x8 draw__16dItemMdlShield_cFv = .text:0x8016E860; // type:function size:0x30 -vt_0x20__16dItemMdlShield_cFv = .text:0x8016E890; // type:function size:0x4 +changeItemId__16dItemMdlShield_cFUs = .text:0x8016E890; // type:function size:0x4 setPriorityDraw__16dItemMdlShield_cFv = .text:0x8016E8A0; // type:function size:0x10 unsetPriorityDraw__16dItemMdlShield_cFv = .text:0x8016E8B0; // type:function size:0x10 isMdlForItemId__16dItemMdlBottle_cFUs = .text:0x8016E8C0; // type:function size:0x6C init__16dItemMdlBottle_cFUsP9dAcItem_cP12mAllocator_c = .text:0x8016E930; // type:function size:0x104 -vt_0x10__16dItemMdlBottle_cFUc = .text:0x8016EA40; // type:function size:0x8 +setDrawMode__16dItemMdlBottle_cFUc = .text:0x8016EA40; // type:function size:0x8 setScale__16dItemMdlBottle_cFRC7mVec3_c = .text:0x8016EA50; // type:function size:0x8 setLocalMtx__16dItemMdlBottle_cFRC6mMtx_c = .text:0x8016EA60; // type:function size:0x8 draw__16dItemMdlBottle_cFv = .text:0x8016EA70; // type:function size:0x8C -vt_0x20__16dItemMdlBottle_cFv = .text:0x8016EB00; // type:function size:0x4 +changeItemId__16dItemMdlBottle_cFUs = .text:0x8016EB00; // type:function size:0x4 setPriorityDraw__16dItemMdlBottle_cFv = .text:0x8016EB10; // type:function size:0x10 unsetPriorityDraw__16dItemMdlBottle_cFv = .text:0x8016EB20; // type:function size:0x10 isMdlForItemId__14dItemMdlTear_cFUs = .text:0x8016EB30; // type:function size:0x4 init__14dItemMdlTear_cFUsP9dAcItem_cP12mAllocator_c = .text:0x8016EB40; // type:function size:0x360 -vt_0x10__14dItemMdlTear_cFUc = .text:0x8016EEA0; // type:function size:0x1C +setDrawMode__14dItemMdlTear_cFUc = .text:0x8016EEA0; // type:function size:0x1C setScale__14dItemMdlTear_cFRC7mVec3_c = .text:0x8016EEC0; // type:function size:0x48 setLocalMtx__14dItemMdlTear_cFRC6mMtx_c = .text:0x8016EF10; // type:function size:0x48 draw__14dItemMdlTear_cFv = .text:0x8016EF60; // type:function size:0x84 -vt_0x20__14dItemMdlTear_cFv = .text:0x8016EFF0; // type:function size:0x4 +changeItemId__14dItemMdlTear_cFUs = .text:0x8016EFF0; // type:function size:0x4 setPriorityDraw__14dItemMdlTear_cFv = .text:0x8016F000; // type:function size:0x48 unsetPriorityDraw__14dItemMdlTear_cFv = .text:0x8016F050; // type:function size:0x48 isMdlForItemId__17dItemMdlFirefly_cFUs = .text:0x8016F0A0; // type:function size:0x4 init__17dItemMdlFirefly_cFUsP9dAcItem_cP12mAllocator_c = .text:0x8016F0B0; // type:function size:0x13C -vt_0x10__17dItemMdlFirefly_cFUc = .text:0x8016F1F0; // type:function size:0x8 +setDrawMode__17dItemMdlFirefly_cFUc = .text:0x8016F1F0; // type:function size:0x8 setScale__17dItemMdlFirefly_cFRC7mVec3_c = .text:0x8016F200; // type:function size:0x8 setLocalMtx__17dItemMdlFirefly_cFRC6mMtx_c = .text:0x8016F210; // type:function size:0x8 draw__17dItemMdlFirefly_cFv = .text:0x8016F220; // type:function size:0x78 -vt_0x20__17dItemMdlFirefly_cFv = .text:0x8016F2A0; // type:function size:0x4 +changeItemId__17dItemMdlFirefly_cFUs = .text:0x8016F2A0; // type:function size:0x4 setPriorityDraw__17dItemMdlFirefly_cFv = .text:0x8016F2B0; // type:function size:0x10 unsetPriorityDraw__17dItemMdlFirefly_cFv = .text:0x8016F2C0; // type:function size:0x10 getMdl__17dItemMdlFirefly_cFv = .text:0x8016F2D0; // type:function size:0x8 isMdlForItemId__16dItemMdlPotion_cFUs = .text:0x8016F2E0; // type:function size:0x6C init__16dItemMdlPotion_cFUsP9dAcItem_cP12mAllocator_c = .text:0x8016F350; // type:function size:0x1D4 -vt_0x10__16dItemMdlPotion_cFUc = .text:0x8016F530; // type:function size:0x8 +setDrawMode__16dItemMdlPotion_cFUc = .text:0x8016F530; // type:function size:0x8 setScale__16dItemMdlPotion_cFRC7mVec3_c = .text:0x8016F540; // type:function size:0x8 setLocalMtx__16dItemMdlPotion_cFRC6mMtx_c = .text:0x8016F550; // type:function size:0x8 draw__16dItemMdlPotion_cFv = .text:0x8016F560; // type:function size:0x8C -vt_0x20__16dItemMdlPotion_cFv = .text:0x8016F5F0; // type:function size:0x4 +changeItemId__16dItemMdlPotion_cFUs = .text:0x8016F5F0; // type:function size:0x4 setPriorityDraw__16dItemMdlPotion_cFv = .text:0x8016F600; // type:function size:0x10 unsetPriorityDraw__16dItemMdlPotion_cFv = .text:0x8016F610; // type:function size:0x10 getMdl__16dItemMdlPotion_cFv = .text:0x8016F620; // type:function size:0x8 @@ -9524,42 +9524,42 @@ __dt__16dItemMdlShield_cFv = .text:0x8016F8E0; // type:function size:0x7C scope: __dt__13dItemMdlPut_cFv = .text:0x8016F960; // type:function size:0x7C scope:weak isMdlForItemId__14dItemMdlItem_cFUs = .text:0x8016F9E0; // type:function size:0x6C init__14dItemMdlItem_cFUsP9dAcItem_cP12mAllocator_c = .text:0x8016FA50; // type:function size:0x2C0 -vt_0x10__14dItemMdlItem_cFUc = .text:0x8016FD10; // type:function size:0x8 +setDrawMode__14dItemMdlItem_cFUc = .text:0x8016FD10; // type:function size:0x8 setScale__14dItemMdlItem_cFRC7mVec3_c = .text:0x8016FD20; // type:function size:0x8 setLocalMtx__14dItemMdlItem_cFRC6mMtx_c = .text:0x8016FD30; // type:function size:0x8 draw__14dItemMdlItem_cFv = .text:0x8016FD40; // type:function size:0x30 -vt_0x20__14dItemMdlItem_cFUs = .text:0x8016FD70; // type:function size:0x4 +changeItemId__14dItemMdlItem_cFUs = .text:0x8016FD70; // type:function size:0x4 setPriorityDraw__14dItemMdlItem_cFv = .text:0x8016FD80; // type:function size:0x10 unsetPriorityDraw__14dItemMdlItem_cFv = .text:0x8016FD90; // type:function size:0x10 getMdl__14dItemMdlItem_cFv = .text:0x8016FDA0; // type:function size:0x8 __dt__14dItemMdlItem_cFv = .text:0x8016FDB0; // type:function size:0x70 isMdlForItemId__15dItemMdlRupee_cFUs = .text:0x8016FE20; // type:function size:0x4C init__15dItemMdlRupee_cFUsP9dAcItem_cP12mAllocator_c = .text:0x8016FE70; // type:function size:0x2C0 -vt_0x10__15dItemMdlRupee_cFUc = .text:0x80170130; // type:function size:0x1C +setDrawMode__15dItemMdlRupee_cFUc = .text:0x80170130; // type:function size:0x1C setScale__15dItemMdlRupee_cFRC7mVec3_c = .text:0x80170150; // type:function size:0x48 setLocalMtx__15dItemMdlRupee_cFRC6mMtx_c = .text:0x801701A0; // type:function size:0x48 draw__15dItemMdlRupee_cFv = .text:0x801701F0; // type:function size:0x40 -vt_0x20__15dItemMdlRupee_cFUs = .text:0x80170230; // type:function size:0xAC +changeItemId__15dItemMdlRupee_cFUs = .text:0x80170230; // type:function size:0xAC setPriorityDraw__15dItemMdlRupee_cFv = .text:0x801702E0; // type:function size:0x48 unsetPriorityDraw__15dItemMdlRupee_cFv = .text:0x80170330; // type:function size:0x48 __dt__15dItemMdlRupee_cFv = .text:0x80170380; // type:function size:0x94 isMdlForItemId__20dItemMdlLightFruit_cFUs = .text:0x80170420; // type:function size:0x10 init__20dItemMdlLightFruit_cFUsP9dAcItem_cP12mAllocator_c = .text:0x80170430; // type:function size:0x214 -vt_0x10__20dItemMdlLightFruit_cFUc = .text:0x80170650; // type:function size:0x1C +setDrawMode__20dItemMdlLightFruit_cFUc = .text:0x80170650; // type:function size:0x1C setScale__20dItemMdlLightFruit_cFRC7mVec3_c = .text:0x80170670; // type:function size:0x48 setLocalMtx__20dItemMdlLightFruit_cFRC6mMtx_c = .text:0x801706C0; // type:function size:0x48 draw__20dItemMdlLightFruit_cFv = .text:0x80170710; // type:function size:0x84 -vt_0x20__20dItemMdlLightFruit_cFUs = .text:0x801707A0; // type:function size:0x4 +changeItemId__20dItemMdlLightFruit_cFUs = .text:0x801707A0; // type:function size:0x4 setPriorityDraw__20dItemMdlLightFruit_cFv = .text:0x801707B0; // type:function size:0x48 unsetPriorityDraw__20dItemMdlLightFruit_cFv = .text:0x80170800; // type:function size:0x48 __dt__20dItemMdlLightFruit_cFv = .text:0x80170850; // type:function size:0x94 isMdlForItemId__22dItemMdlStaminaFruit_cFUs = .text:0x801708F0; // type:function size:0x10 init__22dItemMdlStaminaFruit_cFUsP9dAcItem_cP12mAllocator_c = .text:0x80170900; // type:function size:0x204 -vt_0x10__22dItemMdlStaminaFruit_cFUc = .text:0x80170B10; // type:function size:0x1C +setDrawMode__22dItemMdlStaminaFruit_cFUc = .text:0x80170B10; // type:function size:0x1C setScale__22dItemMdlStaminaFruit_cFRC7mVec3_c = .text:0x80170B30; // type:function size:0x48 setLocalMtx__22dItemMdlStaminaFruit_cFRC6mMtx_c = .text:0x80170B80; // type:function size:0x48 draw__22dItemMdlStaminaFruit_cFv = .text:0x80170BD0; // type:function size:0x84 -vt_0x20__22dItemMdlStaminaFruit_cFUs = .text:0x80170C60; // type:function size:0x4 +changeItemId__22dItemMdlStaminaFruit_cFUs = .text:0x80170C60; // type:function size:0x4 setPriorityDraw__22dItemMdlStaminaFruit_cFv = .text:0x80170C70; // type:function size:0x48 unsetPriorityDraw__22dItemMdlStaminaFruit_cFv = .text:0x80170CC0; // type:function size:0x48 __dt__22dItemMdlStaminaFruit_cFv = .text:0x80170D10; // type:function size:0x94 @@ -13905,8 +13905,8 @@ isInsect__9dAcItem_cCFv = .text:0x80256C90; // type:function size:0x8 isUnkTreasureGroup1__9dAcItem_cCFv = .text:0x80256CA0; // type:function size:0x8 isTreasure3__9dAcItem_cCFv = .text:0x80256CB0; // type:function size:0x8 isKeyPieceV__9dAcItem_cCFv = .text:0x80256CC0; // type:function size:0x34 -is5GratitudeCrystals__9dAcItem_cCFv = .text:0x80256D00; // type:function size:0x34 -isGratitudeCrystal__9dAcItem_cCFv = .text:0x80256D40; // type:function size:0x34 +is5GratitudeCrystalsV__9dAcItem_cCFv = .text:0x80256D00; // type:function size:0x34 +isGratitudeCrystalV__9dAcItem_cCFv = .text:0x80256D40; // type:function size:0x34 isFairyV__9dAcItem_cCFv = .text:0x80256D80; // type:function size:0x34 isBottleFairyV__9dAcItem_cCFv = .text:0x80256DC0; // type:function size:0x34 isStarryFireflyV__9dAcItem_cCFv = .text:0x80256E00; // type:function size:0x34 diff --git a/include/d/a/d_a_item.h b/include/d/a/d_a_item.h index 7928765a..8c28c148 100644 --- a/include/d/a/d_a_item.h +++ b/include/d/a/d_a_item.h @@ -241,10 +241,10 @@ public: static Trial_e getCurrentTrial(); enum Tear_e { - TEAR_0, - TEAR_1, - TEAR_2, - TEAR_3, + TEAR_FARON, + TEAR_ELDIN, + TEAR_LANAYRU, + TEAR_GODDESS, TEAR_MAX }; diff --git a/include/d/col/c/c_cc_d.h b/include/d/col/c/c_cc_d.h index d5fa19bb..edd178ee 100644 --- a/include/d/col/c/c_cc_d.h +++ b/include/d/col/c/c_cc_d.h @@ -351,7 +351,7 @@ enum dCcD_ObjAtType { /* 0x 0001 0000 */ AT_TYPE_BELLOWS = (1 << 16), /* 0x 0002 0000 */ AT_TYPE_0x20000 = (1 << 17), /* 0x 0004 0000 */ AT_TYPE_0x40000 = (1 << 18), - /* 0x 0008 0000 */ AT_TYPE_0x80000 = (1 << 19), + /* 0x 0008 0000 */ AT_TYPE_GLITTERING_SPORES = (1 << 19), /* 0x 0010 0000 */ AT_TYPE_BUBBLE = (1 << 20), /* 0x 0020 0000 */ AT_TYPE_0x200000 = (1 << 21), /* 0x 0040 0000 */ AT_TYPE_BEETLE = (1 << 22), @@ -361,7 +361,7 @@ enum dCcD_ObjAtType { /* 0x 0400 0000 */ AT_TYPE_KOLOKTOS_SWORD = (1 << 26), /* 0x 0800 0000 */ AT_TYPE_0x8000000 = (1 << 27), /* 0x 0148 8200 */ AT_TYPE_COMMON0 = - AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000 | AT_TYPE_WIND, + AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_GLITTERING_SPORES | AT_TYPE_0x8000 | AT_TYPE_WIND, }; enum cCcD_AtModifiers_e { diff --git a/include/toBeSorted/item_mdl.h b/include/toBeSorted/item_mdl.h index d4771617..9897be10 100644 --- a/include/toBeSorted/item_mdl.h +++ b/include/toBeSorted/item_mdl.h @@ -14,30 +14,30 @@ class dAcItem_c; // vtable at 80533eb0 class dItemMdl_c : public dMdl_c { public: - dItemMdl_c() : field_0x14(ITEM_MDL_UNK0x14_0) {} + dItemMdl_c() : mDrawMode(DrawMode_None) {} /* 0x08 */ virtual ~dItemMdl_c() {} /* 0x0C */ virtual bool init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) = 0; - /* 0x10 */ virtual void vt_0x10(u8) = 0; + /* 0x10 */ virtual void setDrawMode(u8) = 0; /* 0x14 */ virtual void setScale(const mVec3_c &scale) = 0; /* 0x18 */ virtual void setLocalMtx(const mMtx_c &mtx) = 0; /* 0x1C */ virtual void draw() = 0; - /* 0x20 */ virtual void vt_0x20(u16 itemId) = 0; + /* 0x20 */ virtual void changeItemId(u16 itemId) = 0; /* 0x24 */ virtual void setPriorityDraw() = 0; /* 0x28 */ virtual void unsetPriorityDraw() = 0; /* 0x2C */ virtual m3d::smdl_c *getMdl() { return nullptr; } - enum ItemMdl0x14_e { - ITEM_MDL_UNK0x14_0, - ITEM_MDL_UNK0x14_1, - ITEM_MDL_UNK0x14_2, - ITEM_MDL_UNK0x14_3, + enum DrawMode_e { + DrawMode_None, + DrawMode_Put, + DrawMode_Get, + DrawMode_Max, }; protected: /* 0x10 */ dAcItem_c *mpItem; - /* 0x14 */ u8 field_0x14; + /* 0x14 */ u8 mDrawMode; }; #endif diff --git a/include/toBeSorted/item_mdl_item.h b/include/toBeSorted/item_mdl_item.h index d2dbbfd1..e6f27aef 100644 --- a/include/toBeSorted/item_mdl_item.h +++ b/include/toBeSorted/item_mdl_item.h @@ -9,11 +9,11 @@ class dItemMdlItem_c : public dItemMdl_c { public: /* 0x08 */ virtual ~dItemMdlItem_c() {} /* 0x0C */ virtual bool init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) override; - /* 0x10 */ virtual void vt_0x10(u8) override; + /* 0x10 */ virtual void setDrawMode(u8) override; /* 0x14 */ virtual void setScale(const mVec3_c &scale) override; /* 0x18 */ virtual void setLocalMtx(const mMtx_c &mtx) override; /* 0x1C */ virtual void draw() override; - /* 0x20 */ virtual void vt_0x20(u16 itemId) override; + /* 0x20 */ virtual void changeItemId(u16 itemId) override; /* 0x24 */ virtual void setPriorityDraw() override; /* 0x28 */ virtual void unsetPriorityDraw() override; /* 0x2C */ virtual m3d::smdl_c *getMdl() override; diff --git a/include/toBeSorted/item_mdl_light_fruit.h b/include/toBeSorted/item_mdl_light_fruit.h index 0711ed38..3278da3e 100644 --- a/include/toBeSorted/item_mdl_light_fruit.h +++ b/include/toBeSorted/item_mdl_light_fruit.h @@ -10,21 +10,21 @@ class dItemMdlLightFruit_c : public dItemMdl_c { public: /* 0x08 */ virtual ~dItemMdlLightFruit_c() {} /* 0x0C */ virtual bool init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) override; - /* 0x10 */ virtual void vt_0x10(u8) override; + /* 0x10 */ virtual void setDrawMode(u8) override; /* 0x14 */ virtual void setScale(const mVec3_c &scale) override; /* 0x18 */ virtual void setLocalMtx(const mMtx_c &mtx) override; /* 0x1C */ virtual void draw() override; - /* 0x20 */ virtual void vt_0x20(u16 itemId) override; + /* 0x20 */ virtual void changeItemId(u16 itemId) override; /* 0x24 */ virtual void setPriorityDraw() override; /* 0x28 */ virtual void unsetPriorityDraw() override; static bool isMdlForItemId(u16 itemId); private: - /* 0x18 */ m3d::smdl_c mMdl1; - /* 0x34 */ m3d::smdl_c mMdl2; - /* 0x50 */ m3d::anmTexSrt_c mAnmTexSrt1; - /* 0x7C */ m3d::anmTexSrt_c mAnmTexSrt2; + /* 0x18 */ m3d::smdl_c mPutMdl; + /* 0x34 */ m3d::smdl_c mGetMdl; + /* 0x50 */ m3d::anmTexSrt_c mPutAnmTexSrt; + /* 0x7C */ m3d::anmTexSrt_c mGetAnmTexSrt; }; #endif diff --git a/include/toBeSorted/item_mdl_misc.h b/include/toBeSorted/item_mdl_misc.h index d34c9ff1..ffee644f 100644 --- a/include/toBeSorted/item_mdl_misc.h +++ b/include/toBeSorted/item_mdl_misc.h @@ -14,11 +14,11 @@ class dItemMdlPut_c : public dItemMdl_c { public: /* 0x08 */ virtual ~dItemMdlPut_c() {} /* 0x0C */ virtual bool init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) override; - /* 0x10 */ virtual void vt_0x10(u8) override; + /* 0x10 */ virtual void setDrawMode(u8) override; /* 0x14 */ virtual void setScale(const mVec3_c &scale) override; /* 0x18 */ virtual void setLocalMtx(const mMtx_c &mtx) override; /* 0x1C */ virtual void draw() override; - /* 0x20 */ virtual void vt_0x20(u16 itemId) override; + /* 0x20 */ virtual void changeItemId(u16 itemId) override; /* 0x24 */ virtual void setPriorityDraw() override; /* 0x28 */ virtual void unsetPriorityDraw() override; @@ -34,19 +34,19 @@ private: static const MdlConfig sMdlConfig[]; static const u8 sMdlIdx[]; - /* 0x18 */ m3d::smdl_c mGetMdl; - /* 0x34 */ m3d::smdl_c mPutMdl; + /* 0x18 */ m3d::smdl_c mPutMdl; + /* 0x34 */ m3d::smdl_c mGetMdl; }; class dItemMdlShield_c : public dItemMdl_c { public: /* 0x08 */ virtual ~dItemMdlShield_c() {} /* 0x0C */ virtual bool init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) override; - /* 0x10 */ virtual void vt_0x10(u8) override; + /* 0x10 */ virtual void setDrawMode(u8) override; /* 0x14 */ virtual void setScale(const mVec3_c &scale) override; /* 0x18 */ virtual void setLocalMtx(const mMtx_c &mtx) override; /* 0x1C */ virtual void draw() override; - /* 0x20 */ virtual void vt_0x20(u16 itemId) override; + /* 0x20 */ virtual void changeItemId(u16 itemId) override; /* 0x24 */ virtual void setPriorityDraw() override; /* 0x28 */ virtual void unsetPriorityDraw() override; @@ -72,11 +72,11 @@ public: dItemMdlBottle_c() : mFlags(0) {} /* 0x08 */ virtual ~dItemMdlBottle_c() {} /* 0x0C */ virtual bool init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) override; - /* 0x10 */ virtual void vt_0x10(u8) override; + /* 0x10 */ virtual void setDrawMode(u8) override; /* 0x14 */ virtual void setScale(const mVec3_c &scale) override; /* 0x18 */ virtual void setLocalMtx(const mMtx_c &mtx) override; /* 0x1C */ virtual void draw() override; - /* 0x20 */ virtual void vt_0x20(u16 itemId) override; + /* 0x20 */ virtual void changeItemId(u16 itemId) override; /* 0x24 */ virtual void setPriorityDraw() override; /* 0x28 */ virtual void unsetPriorityDraw() override; /* 0x2C */ virtual m3d::smdl_c *getMdl() override { @@ -102,11 +102,11 @@ class dItemMdlTear_c : public dItemMdl_c { public: /* 0x08 */ virtual ~dItemMdlTear_c() {} /* 0x0C */ virtual bool init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) override; - /* 0x10 */ virtual void vt_0x10(u8) override; + /* 0x10 */ virtual void setDrawMode(u8) override; /* 0x14 */ virtual void setScale(const mVec3_c &scale) override; /* 0x18 */ virtual void setLocalMtx(const mMtx_c &mtx) override; /* 0x1C */ virtual void draw() override; - /* 0x20 */ virtual void vt_0x20(u16 itemId) override; + /* 0x20 */ virtual void changeItemId(u16 itemId) override; /* 0x24 */ virtual void setPriorityDraw() override; /* 0x28 */ virtual void unsetPriorityDraw() override; @@ -119,23 +119,23 @@ private: static const MdlConfig sMdlConfig[]; static const u8 sMdlIdx[]; - /* 0x18 */ m3d::smdl_c mMdl1; - /* 0x34 */ m3d::smdl_c mMdl2; - /* 0x50 */ m3d::anmTexPat_c mAnmTexPat1; - /* 0x7C */ m3d::anmTexPat_c mAnmTexPat2; - /* 0xA8 */ m3d::anmTexSrt_c mAnmTexSrt1; - /* 0xD4 */ m3d::anmTexSrt_c mAnmTexSrt2; + /* 0x18 */ m3d::smdl_c mPutMdl; + /* 0x34 */ m3d::smdl_c mGetMdl; + /* 0x50 */ m3d::anmTexPat_c mPutAnmTexPat; + /* 0x7C */ m3d::anmTexPat_c mGetAnmTexPat; + /* 0xA8 */ m3d::anmTexSrt_c mPutAnmTexSrt; + /* 0xD4 */ m3d::anmTexSrt_c mGetAnmTexSrt; }; class dItemMdlFirefly_c : public dItemMdl_c { public: /* 0x08 */ virtual ~dItemMdlFirefly_c() {} /* 0x0C */ virtual bool init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) override; - /* 0x10 */ virtual void vt_0x10(u8) override; + /* 0x10 */ virtual void setDrawMode(u8) override; /* 0x14 */ virtual void setScale(const mVec3_c &scale) override; /* 0x18 */ virtual void setLocalMtx(const mMtx_c &mtx) override; /* 0x1C */ virtual void draw() override; - /* 0x20 */ virtual void vt_0x20(u16 itemId) override; + /* 0x20 */ virtual void changeItemId(u16 itemId) override; /* 0x24 */ virtual void setPriorityDraw() override; /* 0x28 */ virtual void unsetPriorityDraw() override; /* 0x2C */ virtual m3d::smdl_c *getMdl() override; @@ -152,11 +152,11 @@ class dItemMdlPotion_c : public dItemMdl_c { public: /* 0x08 */ virtual ~dItemMdlPotion_c() {} /* 0x0C */ virtual bool init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) override; - /* 0x10 */ virtual void vt_0x10(u8) override; + /* 0x10 */ virtual void setDrawMode(u8) override; /* 0x14 */ virtual void setScale(const mVec3_c &scale) override; /* 0x18 */ virtual void setLocalMtx(const mMtx_c &mtx) override; /* 0x1C */ virtual void draw() override; - /* 0x20 */ virtual void vt_0x20(u16 itemId) override; + /* 0x20 */ virtual void changeItemId(u16 itemId) override; /* 0x24 */ virtual void setPriorityDraw() override; /* 0x28 */ virtual void unsetPriorityDraw() override; /* 0x2C */ virtual m3d::smdl_c *getMdl() override; diff --git a/include/toBeSorted/item_mdl_rupee.h b/include/toBeSorted/item_mdl_rupee.h index 41757072..1882516e 100644 --- a/include/toBeSorted/item_mdl_rupee.h +++ b/include/toBeSorted/item_mdl_rupee.h @@ -10,11 +10,11 @@ class dItemMdlRupee_c : public dItemMdl_c { public: /* 0x08 */ virtual ~dItemMdlRupee_c() {} /* 0x0C */ virtual bool init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) override; - /* 0x10 */ virtual void vt_0x10(u8) override; + /* 0x10 */ virtual void setDrawMode(u8) override; /* 0x14 */ virtual void setScale(const mVec3_c &scale) override; /* 0x18 */ virtual void setLocalMtx(const mMtx_c &mtx) override; /* 0x1C */ virtual void draw() override; - /* 0x20 */ virtual void vt_0x20(u16 itemId) override; + /* 0x20 */ virtual void changeItemId(u16 itemId) override; /* 0x24 */ virtual void setPriorityDraw() override; /* 0x28 */ virtual void unsetPriorityDraw() override; @@ -27,10 +27,10 @@ private: }; static const MdlConfig sMdlConfig[]; - /* 0x18 */ m3d::smdl_c mMdl1; - /* 0x34 */ m3d::smdl_c mMdl2; - /* 0x50 */ m3d::anmTexPat_c mAnmTexPat1; - /* 0x7C */ m3d::anmTexPat_c mAnmTexPat2; + /* 0x18 */ m3d::smdl_c mPutMdl; + /* 0x34 */ m3d::smdl_c mGetMdl; + /* 0x50 */ m3d::anmTexPat_c mPutAnmTexPat; + /* 0x7C */ m3d::anmTexPat_c mGetAnmTexPat; }; #endif diff --git a/include/toBeSorted/item_mdl_stamina_fruit.h b/include/toBeSorted/item_mdl_stamina_fruit.h index b2b0adf7..f8cd9d32 100644 --- a/include/toBeSorted/item_mdl_stamina_fruit.h +++ b/include/toBeSorted/item_mdl_stamina_fruit.h @@ -10,21 +10,21 @@ class dItemMdlStaminaFruit_c : public dItemMdl_c { public: /* 0x08 */ virtual ~dItemMdlStaminaFruit_c() {} /* 0x0C */ virtual bool init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) override; - /* 0x10 */ virtual void vt_0x10(u8) override; + /* 0x10 */ virtual void setDrawMode(u8) override; /* 0x14 */ virtual void setScale(const mVec3_c &scale) override; /* 0x18 */ virtual void setLocalMtx(const mMtx_c &mtx) override; /* 0x1C */ virtual void draw() override; - /* 0x20 */ virtual void vt_0x20(u16 itemId) override; + /* 0x20 */ virtual void changeItemId(u16 itemId) override; /* 0x24 */ virtual void setPriorityDraw() override; /* 0x28 */ virtual void unsetPriorityDraw() override; static bool isMdlForItemId(u16 itemId); private: - /* 0x18 */ m3d::smdl_c mMdl1; - /* 0x34 */ m3d::smdl_c mMdl2; - /* 0x50 */ m3d::anmTexSrt_c mAnmTexSrt1; - /* 0x7C */ m3d::anmTexSrt_c mAnmTexSrt2; + /* 0x18 */ m3d::smdl_c mPutMdl; + /* 0x34 */ m3d::smdl_c mGetMdl; + /* 0x50 */ m3d::anmTexSrt_c mPutAnmTexSrt; + /* 0x7C */ m3d::anmTexSrt_c mGetAnmTexSrt; }; #endif diff --git a/src/REL/d/a/b/d_a_b_lastboss.cpp b/src/REL/d/a/b/d_a_b_lastboss.cpp index d6a115c3..b93d5546 100644 --- a/src/REL/d/a/b/d_a_b_lastboss.cpp +++ b/src/REL/d/a/b/d_a_b_lastboss.cpp @@ -60,7 +60,7 @@ static dCcD_SrcCyl sSrcCyl1 = { /* mObjInf */ {/* mObjAt */ {0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0}, /* mObjTg */ - {~(AT_TYPE_BUGNET | AT_TYPE_0x80000 | AT_TYPE_BELLOWS | AT_TYPE_BEETLE | AT_TYPE_WIND | AT_TYPE_0x8000), + {~(AT_TYPE_BUGNET | AT_TYPE_GLITTERING_SPORES | AT_TYPE_BELLOWS | AT_TYPE_BEETLE | AT_TYPE_WIND | AT_TYPE_0x8000), 0x4103, {0, 0x4, 0x407}, 0x0, diff --git a/src/REL/d/a/e/d_a_e_remly.cpp b/src/REL/d/a/e/d_a_e_remly.cpp index fdf8a5a3..5b363fa1 100644 --- a/src/REL/d/a/e/d_a_e_remly.cpp +++ b/src/REL/d/a/e/d_a_e_remly.cpp @@ -357,7 +357,7 @@ int dAcEremly_c::actorExecute() { } break; case 12: { if (!isState(StateID_Fly) && mAnimation != ANM_Swim && mAnimation != ANM_SwimDamage) { - if (mSph.ChkTgHit() && mSph.ChkTgAtHitType(AT_TYPE_0x80000 | AT_TYPE_SLINGSHOT)) { + if (mSph.ChkTgHit() && mSph.ChkTgAtHitType(AT_TYPE_GLITTERING_SPORES | AT_TYPE_SLINGSHOT)) { mAngle.y = getXZAngleToPlayer(); mSpeed = -15.f; changeState(StateID_Stun); diff --git a/src/REL/d/a/obj/d_a_obj_barrel.cpp b/src/REL/d/a/obj/d_a_obj_barrel.cpp index a6c3d1ca..546fab3e 100644 --- a/src/REL/d/a/obj/d_a_obj_barrel.cpp +++ b/src/REL/d/a/obj/d_a_obj_barrel.cpp @@ -91,7 +91,7 @@ static dCcD_SrcCyl sSrcCyl = { { /* mObjAt */ {AT_TYPE_PHYSICS, 0x10013, {0, 0, 0}, 4, 0, 0, 0, 0, 0}, /* mObjTg */ - {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000), 0x2000111, {0, 0xF, 0x407}, 0, 0}, + {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_GLITTERING_SPORES | AT_TYPE_0x8000), 0x2000111, {0, 0xF, 0x407}, 0, 0}, /* mObjCo*/ {0xE9}, }, { @@ -102,7 +102,7 @@ static dCcD_SrcSph sSrcSph = { { /* mObjAt */ {AT_TYPE_PHYSICS, 0x10003, {0, 0, 0}, 4, 0, 0, 0, 0, 0}, /* mObjTg */ - {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000 | AT_TYPE_WIND), + {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_GLITTERING_SPORES | AT_TYPE_0x8000 | AT_TYPE_WIND), 0x2000111, {0, 0xF, 0x407}, 0, diff --git a/src/REL/d/a/obj/d_a_obj_bird_sp.cpp b/src/REL/d/a/obj/d_a_obj_bird_sp.cpp index 11d8e883..73a39ddf 100644 --- a/src/REL/d/a/obj/d_a_obj_bird_sp.cpp +++ b/src/REL/d/a/obj/d_a_obj_bird_sp.cpp @@ -12,7 +12,7 @@ dCcD_SrcSph dAcObjBirdSp_c::sCcSrc = { /* mObjInf */ { /* mObjAt */ {0, 2, {0, 0, 0}, 0, 0, 0, 0, 0, 0}, // AT_TYPE_COMMON0 - AT_TYPE_WIND - /* mObjTg */ {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000), 0x00000105, {0, 00, 0x407}, 0, 0}, + /* mObjTg */ {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_GLITTERING_SPORES | AT_TYPE_0x8000), 0x00000105, {0, 00, 0x407}, 0, 0}, /* mObjCo */ {0x00004029}}, /* mSphInf */ {1000.0f} }; diff --git a/src/REL/d/a/obj/d_a_obj_chair.cpp b/src/REL/d/a/obj/d_a_obj_chair.cpp index e34ba2ef..e5372827 100644 --- a/src/REL/d/a/obj/d_a_obj_chair.cpp +++ b/src/REL/d/a/obj/d_a_obj_chair.cpp @@ -35,7 +35,7 @@ static dCcD_SrcCyl sChairColData = { /* mObjInf */ {/* mObjAt */ {0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0}, /* mObjTg */ - {~(AT_TYPE_BUGNET | AT_TYPE_0x80000 | AT_TYPE_BEETLE | AT_TYPE_WIND | AT_TYPE_0x8000), + {~(AT_TYPE_BUGNET | AT_TYPE_GLITTERING_SPORES | AT_TYPE_BEETLE | AT_TYPE_WIND | AT_TYPE_0x8000), 0x111, {0, 0x7, 0x407}, 0x0, diff --git a/src/REL/d/a/obj/d_a_obj_dungeon_ship.cpp b/src/REL/d/a/obj/d_a_obj_dungeon_ship.cpp index 4bdfa042..fdece84a 100644 --- a/src/REL/d/a/obj/d_a_obj_dungeon_ship.cpp +++ b/src/REL/d/a/obj/d_a_obj_dungeon_ship.cpp @@ -31,7 +31,7 @@ dCcD_SrcCps dAcODungeonShip_c::sCcSrc = { { {0, 0x1003E, {0, 0, 0}, 0, 0, 0, 0, 0, 0}, - {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000 | AT_TYPE_WIND), + {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_GLITTERING_SPORES | AT_TYPE_0x8000 | AT_TYPE_WIND), 0x111, {0, 0, 0x407}, 0, diff --git a/src/REL/d/a/obj/d_a_obj_flying_clawshot_target.cpp b/src/REL/d/a/obj/d_a_obj_flying_clawshot_target.cpp index d48e43f5..59c63009 100644 --- a/src/REL/d/a/obj/d_a_obj_flying_clawshot_target.cpp +++ b/src/REL/d/a/obj/d_a_obj_flying_clawshot_target.cpp @@ -40,7 +40,7 @@ bool dAcOFlyingClawshotTarget_c::createHeap() { // clang-format off const cCcD_SrcGObj dAcOFlyingClawshotTarget_c::sColSrc = { /* mObjAt */ {0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0}, - /* mObjTg */ {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000 | AT_TYPE_WIND), 0x1080111, {0, 6, 0x407}, 0, 0}, + /* mObjTg */ {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_GLITTERING_SPORES | AT_TYPE_0x8000 | AT_TYPE_WIND), 0x1080111, {0, 6, 0x407}, 0, 0}, /* mObjCo */ {0x0} }; // clang-format on diff --git a/src/REL/d/a/obj/d_a_obj_grave.cpp b/src/REL/d/a/obj/d_a_obj_grave.cpp index e2cfac2e..b840bcf6 100644 --- a/src/REL/d/a/obj/d_a_obj_grave.cpp +++ b/src/REL/d/a/obj/d_a_obj_grave.cpp @@ -29,7 +29,7 @@ STATE_DEFINE(dAcOGrave_c, Move); dCcD_SrcUnk dAcOGrave_c::sUnkSrc = { {/* mObjAt */ {0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0}, /* mObjTg */ - {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000 | AT_TYPE_WIND), 0x111, {0, 6, 0x407}, 0, 0}, + {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_GLITTERING_SPORES | AT_TYPE_0x8000 | AT_TYPE_WIND), 0x111, {0, 6, 0x407}, 0, 0}, /* mObjCo */ {0}}, {-65.0f, 0.0f, -25.0f, 65.0f, 156.0f, 25.0f}, }; diff --git a/src/REL/d/a/obj/d_a_obj_pinwheel.cpp b/src/REL/d/a/obj/d_a_obj_pinwheel.cpp index 2a32dffb..e38af748 100644 --- a/src/REL/d/a/obj/d_a_obj_pinwheel.cpp +++ b/src/REL/d/a/obj/d_a_obj_pinwheel.cpp @@ -23,7 +23,7 @@ dCcD_SrcSph dAcOpinwheel_c::sSphSrc = { /* mObjInf */ {/* mObjAt */ {0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0}, /* mObjTg */ - {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000 | AT_TYPE_WIND), 0x111, {0, 6, 0x8}, 8, 0}, + {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_GLITTERING_SPORES | AT_TYPE_0x8000 | AT_TYPE_WIND), 0x111, {0, 6, 0x8}, 8, 0}, /* mObjCo */ {0xE9}}, /* mSphInf */ {50.f}, diff --git a/src/REL/d/a/obj/d_a_obj_rope_igaiga.cpp b/src/REL/d/a/obj/d_a_obj_rope_igaiga.cpp index 76423a7e..35b71ecc 100644 --- a/src/REL/d/a/obj/d_a_obj_rope_igaiga.cpp +++ b/src/REL/d/a/obj/d_a_obj_rope_igaiga.cpp @@ -38,7 +38,7 @@ dCcD_SrcSph dAcOropeIgaiga_c::sSphSrc = { /* mObjInf */ {/* mObjAt */ {AT_TYPE_DAMAGE, 0x1F, {0, 0, 0}, 1, 0, 0, 0, 0, 0}, /* mObjTg */ - {~(AT_TYPE_WIND | AT_TYPE_0x8000 | AT_TYPE_0x80000 | AT_TYPE_BEETLE | AT_TYPE_BUGNET), 0x311, {0, 0, 0x407}, 0, 0}, + {~(AT_TYPE_WIND | AT_TYPE_0x8000 | AT_TYPE_GLITTERING_SPORES | AT_TYPE_BEETLE | AT_TYPE_BUGNET), 0x311, {0, 0, 0x407}, 0, 0}, /* mObjCo */ {0xA9}}, /* mSphInf */ {20.f}, diff --git a/src/REL/d/a/obj/d_a_obj_spike.cpp b/src/REL/d/a/obj/d_a_obj_spike.cpp index 2e5be594..3db060fe 100644 --- a/src/REL/d/a/obj/d_a_obj_spike.cpp +++ b/src/REL/d/a/obj/d_a_obj_spike.cpp @@ -8,7 +8,7 @@ SPECIAL_ACTOR_PROFILE(OBJ_SPIKE, dAcOspike_c, fProfile::OBJ_SPIKE, 0x1D9, 0, 2); // clang-format off dCcD_SrcUnk dAcOspike_c::sCcSrc = { {{AT_TYPE_DAMAGE, 0x2003F, {0, 0, 0}, 1, 0, 0, 0, 0}, - {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000 | AT_TYPE_WIND), 0x111, 0x0, 0x06, 0x407, 0, }, + {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_GLITTERING_SPORES | AT_TYPE_0x8000 | AT_TYPE_WIND), 0x111, 0x0, 0x06, 0x407, 0, }, {0}}, {-1.0f, -246.0f, -472.0f, 73.0f, 255.0f, 482.0f}}; // clang-format on diff --git a/src/REL/d/a/obj/d_a_obj_toD3_stone_figure.cpp b/src/REL/d/a/obj/d_a_obj_toD3_stone_figure.cpp index e5f146df..4f1e0e87 100644 --- a/src/REL/d/a/obj/d_a_obj_toD3_stone_figure.cpp +++ b/src/REL/d/a/obj/d_a_obj_toD3_stone_figure.cpp @@ -19,7 +19,7 @@ f32 dAcOtoD3StoneFigure_c::sHeight = 290.0f; dCcD_SrcCyl dAcOtoD3StoneFigure_c::sCcSrc = { {{0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0}, - {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000 | AT_TYPE_WIND), + {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_GLITTERING_SPORES | AT_TYPE_0x8000 | AT_TYPE_WIND), 0x1000111, {0, 0x06, 0x407}, 0, diff --git a/src/REL/d/a/obj/d_a_obj_triforce.cpp b/src/REL/d/a/obj/d_a_obj_triforce.cpp index d8b1045f..9eaaec27 100644 --- a/src/REL/d/a/obj/d_a_obj_triforce.cpp +++ b/src/REL/d/a/obj/d_a_obj_triforce.cpp @@ -11,7 +11,7 @@ SPECIAL_ACTOR_PROFILE(OBJ_TRIFORCE, dAcOtriforce_c, fProfile::OBJ_TRIFORCE, 0x15 // clang-format off dCcD_SrcSph dAcOtriforce_c::sCcSrc = { {{0, 0, 0, 0, 0, 0, 0, 0, 0}, - {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000 | AT_TYPE_WIND), 0x111, 0x0, 0x06, 0x407, 0, 0}, + {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_GLITTERING_SPORES | AT_TYPE_0x8000 | AT_TYPE_WIND), 0x111, 0x0, 0x06, 0x407, 0, 0}, {0xE9}}, {150.0f}}; // clang-format on diff --git a/src/REL/d/a/obj/d_a_obj_tubo.cpp b/src/REL/d/a/obj/d_a_obj_tubo.cpp index c5efcdf1..c204164b 100644 --- a/src/REL/d/a/obj/d_a_obj_tubo.cpp +++ b/src/REL/d/a/obj/d_a_obj_tubo.cpp @@ -52,7 +52,7 @@ STATE_DEFINE(dAcOtubo_c, Rebirth); dCcD_SrcSph dAcOtubo_c::sSphSrc = { /* mObjInf */ {/* mObjAt */ {AT_TYPE_PHYSICS, 0x12, {0, 0, 0}, 2, 0, 0, 0, 0, 0}, - /* mObjTg */ {~(AT_TYPE_BUGNET | AT_TYPE_0x80000 | AT_TYPE_0x8000), 0x801111, {0, 0xA, 0x40F}, 8, 0}, + /* mObjTg */ {~(AT_TYPE_BUGNET | AT_TYPE_GLITTERING_SPORES | AT_TYPE_0x8000), 0x801111, {0, 0xA, 0x40F}, 8, 0}, /* mObjCo */ {0x1E9}}, /* mSphInf */ {30.f}, diff --git a/src/REL/d/a/obj/d_a_obj_tumble_weed.cpp b/src/REL/d/a/obj/d_a_obj_tumble_weed.cpp index 1c89e7f2..6d4f8062 100644 --- a/src/REL/d/a/obj/d_a_obj_tumble_weed.cpp +++ b/src/REL/d/a/obj/d_a_obj_tumble_weed.cpp @@ -34,7 +34,7 @@ STATE_DEFINE(dAcOTumbleWeed_c, Slope); dCcD_SrcSph dAcOTumbleWeed_c::sSphSrc = { /* mObjInf */ {/* mObjAt */ {0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0}, - /* mObjTg */ {~(AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000), 0x111, {0, 8, 0x40F}, 0, 0}, + /* mObjTg */ {~(AT_TYPE_BEETLE | AT_TYPE_GLITTERING_SPORES | AT_TYPE_0x8000), 0x111, {0, 8, 0x40F}, 0, 0}, /* mObjCo */ {0xE9}}, /* mSphInf */ {60.f}, diff --git a/src/REL/d/a/obj/d_a_obj_warp_hole.cpp b/src/REL/d/a/obj/d_a_obj_warp_hole.cpp index d0ee7416..b61cf595 100644 --- a/src/REL/d/a/obj/d_a_obj_warp_hole.cpp +++ b/src/REL/d/a/obj/d_a_obj_warp_hole.cpp @@ -15,7 +15,7 @@ dCcD_SrcCyl dAcOwarpHole_c::sCylSrc = { /* mObjInf */ {/* mObjAt */ {0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0}, /* mObjTg */ - {~(AT_TYPE_BUGNET | AT_TYPE_0x80000 | AT_TYPE_BEETLE | AT_TYPE_WIND | AT_TYPE_0x8000), 0x111, {0, 0, 0x407}, 0, 0}, + {~(AT_TYPE_BUGNET | AT_TYPE_GLITTERING_SPORES | AT_TYPE_BEETLE | AT_TYPE_WIND | AT_TYPE_0x8000), 0x111, {0, 0, 0x407}, 0, 0}, /* mObjCo */ {0x29}}, /* mCylInf */ {320.f, 300.f} diff --git a/src/d/a/d_a_item.cpp b/src/d/a/d_a_item.cpp index ec833cfb..5781c44c 100644 --- a/src/d/a/d_a_item.cpp +++ b/src/d/a/d_a_item.cpp @@ -260,7 +260,7 @@ static const GlitteringSporeRupeeChance sSporeRupeeChances[] = { static const dCcD_SrcCyl sSrcCyl = { {{0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0}, - {~(AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000 | AT_TYPE_WIND), 0x111, {0, 0x08, 0x407}, 0, 0}, + {~(AT_TYPE_BEETLE | AT_TYPE_GLITTERING_SPORES | AT_TYPE_0x8000 | AT_TYPE_WIND), 0x111, {0, 0x08, 0x407}, 0, 0}, {0xE9}}, {40.0f, 60.0f} }; @@ -988,7 +988,7 @@ int dAcItem_c::create() { if (isAnyTear()) { s32 type = getTearSubtype((ITEM_ID)mId); if (type == TEAR_MAX) { - type = TEAR_0; + type = TEAR_FARON; } dAcObjBase_c *forceSign = dAcObjBase_c::create(this, fProfile::OBJ_FORCE_SIGN, type & 0xFF, nullptr, nullptr, nullptr, nullptr, 0x3F); @@ -1299,7 +1299,7 @@ void dAcItem_c::initializeState_Wait() { mSpeed = 0.0f; mVelocity.y = 0.0f; } - mpMdl->vt_0x10(dItemMdl_c::ITEM_MDL_UNK0x14_1); + mpMdl->setDrawMode(dItemMdl_c::DrawMode_Put); field_0xD5B = 0; field_0xD38 = field_0xD3A = field_0xD3C = 0; fn_80253E20(); @@ -1415,8 +1415,7 @@ void dAcItem_c::executeState_Wait() { return; } - // Glittering Spores? - if (mCyl.ChkTgAtHitType(AT_TYPE_0x80000)) { + if (mCyl.ChkTgAtHitType(AT_TYPE_GLITTERING_SPORES)) { if (isHeart()) { if (fn_8024A230()) { mVec3_c spawnPos(mPosition.x, mPosition.y + 30.0f, mPosition.z); @@ -1451,7 +1450,7 @@ void dAcItem_c::executeState_Wait() { } } setItemId(sSporeRupeeChances[i].itemId); - mpMdl->vt_0x20(sSporeRupeeChances[i].itemId); + mpMdl->changeItemId(sSporeRupeeChances[i].itemId); unsetHaveNoGravity(); mVelocity.y = 10.0f; fn_80252A80(); @@ -1653,10 +1652,9 @@ void dAcItem_c::executeState_Wait() { } } dir *= -40.0f; - // TODO - for some reason the argument vector is at an entirely wrong stack position... - // Fixing this wil probably fix the rest of the stack position issues in this function. + mVec3_c efPos = offsetPos + dir; mEff_0x928.holdEffect( - PARTICLE_RESOURCE_ID_MAPPING_821_, offsetPos + dir, nullptr, &scale, nullptr, nullptr + PARTICLE_RESOURCE_ID_MAPPING_821_, efPos, nullptr, &scale, nullptr, nullptr ); } makeLinkLookTowardItem(); @@ -1678,7 +1676,7 @@ void dAcItem_c::finalizeState_Wait() { } void dAcItem_c::initializeState_Carry() { - mpMdl->vt_0x10(dItemMdl_c::ITEM_MDL_UNK0x14_1); + mpMdl->setDrawMode(dItemMdl_c::DrawMode_Put); mSpeed = 0.0f; mVelocity.y = 0.0f; unsetHaveNoGravity(); @@ -1738,7 +1736,7 @@ void dAcItem_c::finalizeState_Carry() { } void dAcItem_c::initializeState_GetBeetle() { - mpMdl->vt_0x10(dItemMdl_c::ITEM_MDL_UNK0x14_1); + mpMdl->setDrawMode(dItemMdl_c::DrawMode_Put); setNotWaiting(); field_0xD38 = field_0xD3A = field_0xD3C = 0; field_0xD0C = 0.0f; @@ -1821,7 +1819,7 @@ void dAcItem_c::finalizeState_WaitGet() { } void dAcItem_c::initializeState_Get() { - mpMdl->vt_0x10(dItemMdl_c::ITEM_MDL_UNK0x14_1); + mpMdl->setDrawMode(dItemMdl_c::DrawMode_Put); performCollection(); if (isAnyTear()) { mVec3_c tmp; @@ -1856,7 +1854,7 @@ void dAcItem_c::finalizeState_Get() { } void dAcItem_c::initializeState_WaitGetDemo() { - mpMdl->vt_0x10(dItemMdl_c::ITEM_MDL_UNK0x14_2); + mpMdl->setDrawMode(dItemMdl_c::DrawMode_Get); setObjectProperty(OBJ_PROP_0x200); setNotWaiting(); field_0xD38 = field_0xD3A = field_0xD3C = 0; @@ -1892,7 +1890,7 @@ void dAcItem_c::executeState_WaitGetDemo() { void dAcItem_c::finalizeState_WaitGetDemo() {} void dAcItem_c::initializeState_WaitForcedGetDemo() { - mpMdl->vt_0x10(dItemMdl_c::ITEM_MDL_UNK0x14_2); + mpMdl->setDrawMode(dItemMdl_c::DrawMode_Get); setObjectProperty(OBJ_PROP_0x200); setNotWaiting(); field_0xD38 = field_0xD3A = field_0xD3C = 0; @@ -1913,7 +1911,7 @@ void dAcItem_c::executeState_WaitForcedGetDemo() { void dAcItem_c::finalizeState_WaitForcedGetDemo() {} void dAcItem_c::initializeState_GetDemo() { - mpMdl->vt_0x10(dItemMdl_c::ITEM_MDL_UNK0x14_2); + mpMdl->setDrawMode(dItemMdl_c::DrawMode_Get); switch (getItemId()) { case ITEM_FARON_GRASSHOPPER: sCollectionCurrentCount = getFaronGrasshooperCounter(); break; case ITEM_WOODLAND_RHINO_BEETLE: sCollectionCurrentCount = getWoodlandRhinoBeetleCounter(); break; @@ -2034,7 +2032,7 @@ void dAcItem_c::finalizeState_GetDemo() { } void dAcItem_c::initializeState_WaitTBoxGetDemo() { - mpMdl->vt_0x10(dItemMdl_c::ITEM_MDL_UNK0x14_2); + mpMdl->setDrawMode(dItemMdl_c::DrawMode_Get); setNotWaiting(); field_0xD38 = field_0xD3A = field_0xD3C = 0; setObjectProperty(OBJ_PROP_0x200); @@ -2052,7 +2050,7 @@ void dAcItem_c::executeState_WaitTBoxGetDemo() { void dAcItem_c::finalizeState_WaitTBoxGetDemo() {} void dAcItem_c::initializeState_ResurgeWait() { - mpMdl->vt_0x10(dItemMdl_c::ITEM_MDL_UNK0x14_1); + mpMdl->setDrawMode(dItemMdl_c::DrawMode_Put); // TODO FPR swap mPosition = mPositionCopy; mRotation = mRotationCopy; diff --git a/src/d/a/obj/d_a_obj_arrow.cpp b/src/d/a/obj/d_a_obj_arrow.cpp index ae95ba89..f17c71bc 100644 --- a/src/d/a/obj/d_a_obj_arrow.cpp +++ b/src/d/a/obj/d_a_obj_arrow.cpp @@ -17,7 +17,7 @@ STATE_DEFINE(dAcArrow_c, Bound); cCcD_SrcGObj dAcArrow_c::sCcSrcInf = { {AT_TYPE_ARROW, 0x8BB, {0x15,0, 0}, 0, 0, 0, 0, 0, 0}, { - ~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000 | AT_TYPE_ARROW | AT_TYPE_0x100 | AT_TYPE_WIND | AT_TYPE_SLINGSHOT), + ~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_GLITTERING_SPORES | AT_TYPE_0x8000 | AT_TYPE_ARROW | AT_TYPE_0x100 | AT_TYPE_WIND | AT_TYPE_SLINGSHOT), 0x210, {0, 0, 0x407}, 0, 0 }, {0}, diff --git a/src/d/a/obj/d_a_obj_tbox.cpp b/src/d/a/obj/d_a_obj_tbox.cpp index 931dc459..bcacf40d 100644 --- a/src/d/a/obj/d_a_obj_tbox.cpp +++ b/src/d/a/obj/d_a_obj_tbox.cpp @@ -92,7 +92,7 @@ static char *const sOpenEventNames[] = { // TODO just copied from somewhere const cCcD_SrcGObj dAcTbox_c::sColSrc = { /* mObjAt */ {0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0}, - /* mObjTg */ {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000 | AT_TYPE_WIND), 0, {0, 0, 0x407}, 0, 0}, + /* mObjTg */ {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_GLITTERING_SPORES | AT_TYPE_0x8000 | AT_TYPE_WIND), 0, {0, 0, 0x407}, 0, 0}, /* mObjCo */ {0xE9} }; // clang-format on @@ -1079,7 +1079,7 @@ int dAcTbox_c::create() { // clang-format off static const dCcD_SrcUnk s3 = {{ /* mObjAt */ {0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0}, - /* mObjTg */ {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000 | AT_TYPE_WIND), 0x1010111, {7, 0x407}, 0, 0}, + /* mObjTg */ {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_GLITTERING_SPORES | AT_TYPE_0x8000 | AT_TYPE_WIND), 0x1010111, {7, 0x407}, 0, 0}, /* mObjCo */ {0x0}}, {0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f}, }; @@ -1090,7 +1090,7 @@ int dAcTbox_c::create() { // clang-format off static const dCcD_SrcUnk s4 = {{ /* mObjAt */ {0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0}, - /* mObjTg */ {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000 | AT_TYPE_WIND), 0x1010111, {6, 0x407}, 0, 0}, + /* mObjTg */ {~(AT_TYPE_BUGNET | AT_TYPE_BEETLE | AT_TYPE_GLITTERING_SPORES | AT_TYPE_0x8000 | AT_TYPE_WIND), 0x1010111, {6, 0x407}, 0, 0}, /* mObjCo */ {0x0}}, {0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f}, }; diff --git a/src/toBeSorted/item_mdl_item.cpp b/src/toBeSorted/item_mdl_item.cpp index db8d7dd4..eb2b2a0d 100644 --- a/src/toBeSorted/item_mdl_item.cpp +++ b/src/toBeSorted/item_mdl_item.cpp @@ -445,8 +445,8 @@ bool dItemMdlItem_c::init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) return true; } -void dItemMdlItem_c::vt_0x10(u8 arg) { - field_0x14 = arg; +void dItemMdlItem_c::setDrawMode(u8 arg) { + mDrawMode = arg; } void dItemMdlItem_c::setScale(const mVec3_c &scale) { @@ -458,15 +458,14 @@ void dItemMdlItem_c::setLocalMtx(const mMtx_c &mtx) { } void dItemMdlItem_c::draw() { - if (field_0x14 == ITEM_MDL_UNK0x14_2) { + if (mDrawMode == DrawMode_Get) { mpItem->fn_8002ECD0(&mMdl, 6); } else { - ITEM_MDL_UNK0x14_1: mpItem->fn_8002ECD0(&mMdl, 7); } } -void dItemMdlItem_c::vt_0x20(u16 itemId) { +void dItemMdlItem_c::changeItemId(u16 itemId) { // no-op } diff --git a/src/toBeSorted/item_mdl_light_fruit.cpp b/src/toBeSorted/item_mdl_light_fruit.cpp index 2a1e5b7a..fe6b3c01 100644 --- a/src/toBeSorted/item_mdl_light_fruit.cpp +++ b/src/toBeSorted/item_mdl_light_fruit.cpp @@ -29,7 +29,7 @@ bool dItemMdlLightFruit_c::init(u16 itemId, dAcItem_c *item, mAllocator_c *alloc if (!mdl1.IsValid()) { return false; } - if (!mMdl1.create(mdl1, allocator, 0x324)) { + if (!mPutMdl.create(mdl1, allocator, 0x324)) { return false; } @@ -37,8 +37,8 @@ bool dItemMdlLightFruit_c::init(u16 itemId, dAcItem_c *item, mAllocator_c *alloc if (!anmTexSrt1.IsValid()) { return false; } - TRY_CREATE(mAnmTexSrt1.create(mdl1, anmTexSrt1, allocator, nullptr, 1)); - mMdl1.setAnm(mAnmTexSrt1); + TRY_CREATE(mPutAnmTexSrt.create(mdl1, anmTexSrt1, allocator, nullptr, 1)); + mPutMdl.setAnm(mPutAnmTexSrt); } { @@ -55,7 +55,7 @@ bool dItemMdlLightFruit_c::init(u16 itemId, dAcItem_c *item, mAllocator_c *alloc if (!mdl2.IsValid()) { return false; } - if (!mMdl2.create(mdl2, allocator, 0x324)) { + if (!mGetMdl.create(mdl2, allocator, 0x324)) { return false; } @@ -63,55 +63,55 @@ bool dItemMdlLightFruit_c::init(u16 itemId, dAcItem_c *item, mAllocator_c *alloc if (!anmTexSrt2.IsValid()) { return false; } - TRY_CREATE(mAnmTexSrt2.create(mdl2, anmTexSrt2, allocator, nullptr, 1)); - mMdl2.setAnm(mAnmTexSrt2); + TRY_CREATE(mGetAnmTexSrt.create(mdl2, anmTexSrt2, allocator, nullptr, 1)); + mGetMdl.setAnm(mGetAnmTexSrt); } mpItem = item; return true; } -void dItemMdlLightFruit_c::vt_0x10(u8 arg) { - if (arg == ITEM_MDL_UNK0x14_3) { - field_0x14 = ITEM_MDL_UNK0x14_1; +void dItemMdlLightFruit_c::setDrawMode(u8 arg) { + if (arg == DrawMode_Max) { + mDrawMode = DrawMode_Put; } else { - field_0x14 = arg; + mDrawMode = arg; } } void dItemMdlLightFruit_c::setScale(const mVec3_c &scale) { - mMdl1.setScale(scale); - mMdl2.setScale(scale); + mPutMdl.setScale(scale); + mGetMdl.setScale(scale); } void dItemMdlLightFruit_c::setLocalMtx(const mMtx_c &mtx) { - mMdl1.setLocalMtx(mtx); - mMdl2.setLocalMtx(mtx); + mPutMdl.setLocalMtx(mtx); + mGetMdl.setLocalMtx(mtx); } void dItemMdlLightFruit_c::draw() { - switch (field_0x14) { - case ITEM_MDL_UNK0x14_1: - mAnmTexSrt1.play(); - mpItem->fn_8002ECD0(&mMdl1, 7); + switch (mDrawMode) { + case DrawMode_Put: + mPutAnmTexSrt.play(); + mpItem->fn_8002ECD0(&mPutMdl, 7); break; - case ITEM_MDL_UNK0x14_2: - mAnmTexSrt2.play(); - mpItem->fn_8002ECD0(&mMdl2, 6); + case DrawMode_Get: + mGetAnmTexSrt.play(); + mpItem->fn_8002ECD0(&mGetMdl, 6); break; } } -void dItemMdlLightFruit_c::vt_0x20(u16 itemId) { +void dItemMdlLightFruit_c::changeItemId(u16 itemId) { // no-op } void dItemMdlLightFruit_c::setPriorityDraw() { - mMdl1.setPriorityDraw(0x82, 0x7F); - mMdl2.setPriorityDraw(0x82, 0x7F); + mPutMdl.setPriorityDraw(0x82, 0x7F); + mGetMdl.setPriorityDraw(0x82, 0x7F); } void dItemMdlLightFruit_c::unsetPriorityDraw() { - mMdl1.setPriorityDraw(0x7F, 0x7F); - mMdl2.setPriorityDraw(0x7F, 0x7F); + mPutMdl.setPriorityDraw(0x7F, 0x7F); + mGetMdl.setPriorityDraw(0x7F, 0x7F); } diff --git a/src/toBeSorted/item_mdl_misc.cpp b/src/toBeSorted/item_mdl_misc.cpp index f9b0fbf9..0d539f48 100644 --- a/src/toBeSorted/item_mdl_misc.cpp +++ b/src/toBeSorted/item_mdl_misc.cpp @@ -237,7 +237,7 @@ bool dItemMdlPut_c::init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) { return false; } - if (!mGetMdl.create(mdl0, allocator, 0x120)) { + if (!mPutMdl.create(mdl0, allocator, 0x120)) { return false; } @@ -256,7 +256,7 @@ bool dItemMdlPut_c::init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) { return false; } - if (!mPutMdl.create(mdl1, allocator, 0x120)) { + if (!mGetMdl.create(mdl1, allocator, 0x120)) { return false; } @@ -264,43 +264,43 @@ bool dItemMdlPut_c::init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) { return true; } -void dItemMdlPut_c::vt_0x10(u8 arg) { - if (arg == ITEM_MDL_UNK0x14_3) { - field_0x14 = ITEM_MDL_UNK0x14_1; +void dItemMdlPut_c::setDrawMode(u8 arg) { + if (arg == DrawMode_Max) { + mDrawMode = DrawMode_Put; } else { - field_0x14 = arg; + mDrawMode = arg; } } void dItemMdlPut_c::setScale(const mVec3_c &scale) { - mGetMdl.setScale(scale); mPutMdl.setScale(scale); + mGetMdl.setScale(scale); } void dItemMdlPut_c::setLocalMtx(const mMtx_c &mtx) { - mGetMdl.setLocalMtx(mtx); mPutMdl.setLocalMtx(mtx); + mGetMdl.setLocalMtx(mtx); } void dItemMdlPut_c::draw() { - switch (field_0x14) { - case ITEM_MDL_UNK0x14_1: mpItem->fn_8002ECD0(&mGetMdl, 7); break; - case ITEM_MDL_UNK0x14_2: mpItem->fn_8002ECD0(&mPutMdl, 6); break; + switch (mDrawMode) { + case DrawMode_Put: mpItem->fn_8002ECD0(&mPutMdl, 7); break; + case DrawMode_Get: mpItem->fn_8002ECD0(&mGetMdl, 6); break; } } -void dItemMdlPut_c::vt_0x20(u16 itemId) { +void dItemMdlPut_c::changeItemId(u16 itemId) { // no-op } void dItemMdlPut_c::setPriorityDraw() { - mGetMdl.setPriorityDraw(0x82, 0x7F); mPutMdl.setPriorityDraw(0x82, 0x7F); + mGetMdl.setPriorityDraw(0x82, 0x7F); } void dItemMdlPut_c::unsetPriorityDraw() { - mGetMdl.setPriorityDraw(0x7F, 0x7F); mPutMdl.setPriorityDraw(0x7F, 0x7F); + mGetMdl.setPriorityDraw(0x7F, 0x7F); } enum ShieldIdx { @@ -546,8 +546,8 @@ bool dItemMdlShield_c::init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator return true; } -void dItemMdlShield_c::vt_0x10(u8 arg) { - field_0x14 = arg; +void dItemMdlShield_c::setDrawMode(u8 arg) { + mDrawMode = arg; } void dItemMdlShield_c::setScale(const mVec3_c &scale) { @@ -559,14 +559,14 @@ void dItemMdlShield_c::setLocalMtx(const mMtx_c &mtx) { } void dItemMdlShield_c::draw() { - if (field_0x14 == ITEM_MDL_UNK0x14_2) { + if (mDrawMode == DrawMode_Get) { mpItem->fn_8002ECD0(&mMdl, 6); } else { mpItem->fn_8002ECD0(&mMdl, 7); } } -void dItemMdlShield_c::vt_0x20(u16 itemId) { +void dItemMdlShield_c::changeItemId(u16 itemId) { // no-op } @@ -806,8 +806,8 @@ bool dItemMdlBottle_c::init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator return true; } -void dItemMdlBottle_c::vt_0x10(u8 arg) { - field_0x14 = arg; +void dItemMdlBottle_c::setDrawMode(u8 arg) { + mDrawMode = arg; } void dItemMdlBottle_c::setScale(const mVec3_c &scale) { @@ -823,18 +823,18 @@ void dItemMdlBottle_c::draw() { return; } - if (field_0x14 != ITEM_MDL_UNK0x14_1 || (mFlags & 0x1) == 0) { + if (mDrawMode != DrawMode_Put || (mFlags & 0x1) == 0) { mMdl.play(); } - if (field_0x14 == ITEM_MDL_UNK0x14_2) { + if (mDrawMode == DrawMode_Get) { mpItem->fn_8002ECD0(&mMdl.getModel(), 6); } else { mpItem->fn_8002ECD0(&mMdl.getModel(), 7); } } -void dItemMdlBottle_c::vt_0x20(u16 itemId) { +void dItemMdlBottle_c::changeItemId(u16 itemId) { // no-op } @@ -882,7 +882,7 @@ bool dItemMdlTear_c::init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) if (!mdl1.IsValid()) { return false; } - if (!mMdl1.create(mdl1, allocator, 0x327)) { + if (!mPutMdl.create(mdl1, allocator, 0x327)) { return false; } @@ -890,18 +890,18 @@ bool dItemMdlTear_c::init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) if (!anmTexSrt1.IsValid()) { return false; } - TRY_CREATE(mAnmTexSrt1.create(mdl1, anmTexSrt1, allocator, nullptr, 1)); - TRY_CREATE(mMdl1.setAnm(mAnmTexSrt1)); + TRY_CREATE(mPutAnmTexSrt.create(mdl1, anmTexSrt1, allocator, nullptr, 1)); + TRY_CREATE(mPutMdl.setAnm(mPutAnmTexSrt)); nw4r::g3d::ResAnmTexPat anmTexPat1 = res1.GetResAnmTexPat("Shizuku"); if (!anmTexPat1.IsValid()) { return false; } - if (!mAnmTexPat1.create(mdl1, anmTexPat1, allocator, nullptr, 1)) { + if (!mPutAnmTexPat.create(mdl1, anmTexPat1, allocator, nullptr, 1)) { return false; } - TRY_CREATE(mMdl1.setAnm(mAnmTexPat1)); - mAnmTexPat1.setFrame(frame, 0); + TRY_CREATE(mPutMdl.setAnm(mPutAnmTexPat)); + mPutAnmTexPat.setFrame(frame, 0); } { @@ -918,7 +918,7 @@ bool dItemMdlTear_c::init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) if (!mdl2.IsValid()) { return false; } - if (!mMdl2.create(mdl2, allocator, 0x327)) { + if (!mGetMdl.create(mdl2, allocator, 0x327)) { return false; } @@ -926,18 +926,18 @@ bool dItemMdlTear_c::init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) if (!anmTexSrt2.IsValid()) { return false; } - TRY_CREATE(mAnmTexSrt2.create(mdl2, anmTexSrt2, allocator, nullptr, 1)); - TRY_CREATE(mMdl2.setAnm(mAnmTexSrt2)); + TRY_CREATE(mGetAnmTexSrt.create(mdl2, anmTexSrt2, allocator, nullptr, 1)); + TRY_CREATE(mGetMdl.setAnm(mGetAnmTexSrt)); nw4r::g3d::ResAnmTexPat anmTexPat2 = res2.GetResAnmTexPat("Shizuku"); if (!anmTexPat2.IsValid()) { return false; } - if (!mAnmTexPat2.create(mdl2, anmTexPat2, allocator, nullptr, 1)) { + if (!mGetAnmTexPat.create(mdl2, anmTexPat2, allocator, nullptr, 1)) { return false; } - TRY_CREATE(mMdl2.setAnm(mAnmTexPat2)); - mAnmTexPat2.setFrame(frame, 0); + TRY_CREATE(mGetMdl.setAnm(mGetAnmTexPat)); + mGetAnmTexPat.setFrame(frame, 0); } mpItem = item; @@ -945,49 +945,49 @@ bool dItemMdlTear_c::init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) return true; } -void dItemMdlTear_c::vt_0x10(u8 arg) { - if (arg == ITEM_MDL_UNK0x14_3) { - field_0x14 = ITEM_MDL_UNK0x14_1; +void dItemMdlTear_c::setDrawMode(u8 arg) { + if (arg == DrawMode_Max) { + mDrawMode = DrawMode_Put; } else { - field_0x14 = arg; + mDrawMode = arg; } } void dItemMdlTear_c::setScale(const mVec3_c &scale) { - mMdl1.setScale(scale); - mMdl2.setScale(scale); + mPutMdl.setScale(scale); + mGetMdl.setScale(scale); } void dItemMdlTear_c::setLocalMtx(const mMtx_c &mtx) { - mMdl1.setLocalMtx(mtx); - mMdl2.setLocalMtx(mtx); + mPutMdl.setLocalMtx(mtx); + mGetMdl.setLocalMtx(mtx); } void dItemMdlTear_c::draw() { - switch (field_0x14) { - case ITEM_MDL_UNK0x14_1: - mAnmTexSrt1.play(); - mpItem->fn_8002ECD0(&mMdl1, 7); + switch (mDrawMode) { + case DrawMode_Put: + mPutAnmTexSrt.play(); + mpItem->fn_8002ECD0(&mPutMdl, 7); break; - case ITEM_MDL_UNK0x14_2: - mAnmTexSrt2.play(); - mpItem->fn_8002ECD0(&mMdl2, 6); + case DrawMode_Get: + mGetAnmTexSrt.play(); + mpItem->fn_8002ECD0(&mGetMdl, 6); break; } } -void dItemMdlTear_c::vt_0x20(u16 itemId) { +void dItemMdlTear_c::changeItemId(u16 itemId) { // no-op } void dItemMdlTear_c::setPriorityDraw() { - mMdl1.setPriorityDraw(0x82, 0x7F); - mMdl2.setPriorityDraw(0x82, 0x7F); + mPutMdl.setPriorityDraw(0x82, 0x7F); + mGetMdl.setPriorityDraw(0x82, 0x7F); } void dItemMdlTear_c::unsetPriorityDraw() { - mMdl1.setPriorityDraw(0x7F, 0x7F); - mMdl2.setPriorityDraw(0x7F, 0x7F); + mPutMdl.setPriorityDraw(0x7F, 0x7F); + mGetMdl.setPriorityDraw(0x7F, 0x7F); } bool dItemMdlFirefly_c::isMdlForItemId(u16 itemId) { @@ -1024,8 +1024,8 @@ bool dItemMdlFirefly_c::init(u16 itemId, dAcItem_c *item, mAllocator_c *allocato return true; } -void dItemMdlFirefly_c::vt_0x10(u8 arg) { - field_0x14 = arg; +void dItemMdlFirefly_c::setDrawMode(u8 arg) { + mDrawMode = arg; } void dItemMdlFirefly_c::setScale(const mVec3_c &scale) { @@ -1037,14 +1037,14 @@ void dItemMdlFirefly_c::setLocalMtx(const mMtx_c &mtx) { } void dItemMdlFirefly_c::draw() { - switch (field_0x14) { - case ITEM_MDL_UNK0x14_1: mpItem->fn_8002ECD0(&mMdl, 7); break; - case ITEM_MDL_UNK0x14_2: mpItem->fn_8002ECD0(&mMdl, 6); break; + switch (mDrawMode) { + case DrawMode_Put: mpItem->fn_8002ECD0(&mMdl, 7); break; + case DrawMode_Get: mpItem->fn_8002ECD0(&mMdl, 6); break; } mAnmMatClr.play(); } -void dItemMdlFirefly_c::vt_0x20(u16 itemId) { +void dItemMdlFirefly_c::changeItemId(u16 itemId) { // no-op } @@ -1298,8 +1298,8 @@ bool dItemMdlPotion_c::init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator return true; } -void dItemMdlPotion_c::vt_0x10(u8 arg) { - field_0x14 = arg; +void dItemMdlPotion_c::setDrawMode(u8 arg) { + mDrawMode = arg; } void dItemMdlPotion_c::setScale(const mVec3_c &scale) { @@ -1313,13 +1313,13 @@ void dItemMdlPotion_c::setLocalMtx(const mMtx_c &mtx) { void dItemMdlPotion_c::draw() { mAnmChr.play(); mAnmTexSrt.play(); - switch (field_0x14) { - case ITEM_MDL_UNK0x14_1: mpItem->fn_8002ECD0(&mMdl, 7); break; - case ITEM_MDL_UNK0x14_2: mpItem->fn_8002ECD0(&mMdl, 6); break; + switch (mDrawMode) { + case DrawMode_Put: mpItem->fn_8002ECD0(&mMdl, 7); break; + case DrawMode_Get: mpItem->fn_8002ECD0(&mMdl, 6); break; } } -void dItemMdlPotion_c::vt_0x20(u16 itemId) { +void dItemMdlPotion_c::changeItemId(u16 itemId) { // no-op } diff --git a/src/toBeSorted/item_mdl_rupee.cpp b/src/toBeSorted/item_mdl_rupee.cpp index 148e671b..0aec69f0 100644 --- a/src/toBeSorted/item_mdl_rupee.cpp +++ b/src/toBeSorted/item_mdl_rupee.cpp @@ -55,7 +55,7 @@ bool dItemMdlRupee_c::init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) if (!mdl1.IsValid()) { return false; } - if (!mMdl1.create(mdl1, allocator, 0x123)) { + if (!mPutMdl.create(mdl1, allocator, 0x123)) { return false; } @@ -63,11 +63,11 @@ bool dItemMdlRupee_c::init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) if (!anmTexPat1.IsValid()) { return false; } - if (!mAnmTexPat1.create(mdl1, anmTexPat1, allocator, nullptr, 1)) { + if (!mPutAnmTexPat.create(mdl1, anmTexPat1, allocator, nullptr, 1)) { return false; } - mMdl1.setAnm(mAnmTexPat1); - mAnmTexPat1.setFrame(sMdlConfig[i].texPatFrame, 0); + mPutMdl.setAnm(mPutAnmTexPat); + mPutAnmTexPat.setFrame(sMdlConfig[i].texPatFrame, 0); } { @@ -84,7 +84,7 @@ bool dItemMdlRupee_c::init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) if (!mdl2.IsValid()) { return false; } - if (!mMdl2.create(mdl2, allocator, 0x123)) { + if (!mGetMdl.create(mdl2, allocator, 0x123)) { return false; } @@ -93,11 +93,11 @@ bool dItemMdlRupee_c::init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) return false; } anmTexPat2.Bind(res2); - if (!mAnmTexPat2.create(mdl2, anmTexPat2, allocator, nullptr, 1)) { + if (!mGetAnmTexPat.create(mdl2, anmTexPat2, allocator, nullptr, 1)) { return false; } - mMdl2.setAnm(mAnmTexPat2); - mAnmTexPat2.setFrame(sMdlConfig[i].texPatFrame, 0); + mGetMdl.setAnm(mGetAnmTexPat); + mGetAnmTexPat.setFrame(sMdlConfig[i].texPatFrame, 0); } @@ -105,32 +105,32 @@ bool dItemMdlRupee_c::init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) return true; } -void dItemMdlRupee_c::vt_0x10(u8 arg) { - if (arg == ITEM_MDL_UNK0x14_3) { - field_0x14 = ITEM_MDL_UNK0x14_1; +void dItemMdlRupee_c::setDrawMode(u8 arg) { + if (arg == DrawMode_Max) { + mDrawMode = DrawMode_Put; } else { - field_0x14 = arg; + mDrawMode = arg; } } void dItemMdlRupee_c::setScale(const mVec3_c &scale) { - mMdl1.setScale(scale); - mMdl2.setScale(scale); + mPutMdl.setScale(scale); + mGetMdl.setScale(scale); } void dItemMdlRupee_c::setLocalMtx(const mMtx_c &mtx) { - mMdl1.setLocalMtx(mtx); - mMdl2.setLocalMtx(mtx); + mPutMdl.setLocalMtx(mtx); + mGetMdl.setLocalMtx(mtx); } void dItemMdlRupee_c::draw() { - switch (field_0x14) { - case ITEM_MDL_UNK0x14_1: mpItem->fn_8002ECD0(&mMdl1, 7); break; - case ITEM_MDL_UNK0x14_2: mpItem->fn_8002ECD0(&mMdl2, 6); break; + switch (mDrawMode) { + case DrawMode_Put: mpItem->fn_8002ECD0(&mPutMdl, 7); break; + case DrawMode_Get: mpItem->fn_8002ECD0(&mGetMdl, 6); break; } } -void dItemMdlRupee_c::vt_0x20(u16 itemId) { +void dItemMdlRupee_c::changeItemId(u16 itemId) { int i = 0; bool found = false; while (!found && i < ARRAY_LENGTH(sMdlConfig)) { @@ -142,17 +142,17 @@ void dItemMdlRupee_c::vt_0x20(u16 itemId) { } if (found) { - mAnmTexPat1.setFrame(sMdlConfig[i].texPatFrame, 0); - mAnmTexPat2.setFrame(sMdlConfig[i].texPatFrame, 0); + mPutAnmTexPat.setFrame(sMdlConfig[i].texPatFrame, 0); + mGetAnmTexPat.setFrame(sMdlConfig[i].texPatFrame, 0); } } void dItemMdlRupee_c::setPriorityDraw() { - mMdl1.setPriorityDraw(0x82, 0x7F); - mMdl2.setPriorityDraw(0x82, 0x7F); + mPutMdl.setPriorityDraw(0x82, 0x7F); + mGetMdl.setPriorityDraw(0x82, 0x7F); } void dItemMdlRupee_c::unsetPriorityDraw() { - mMdl1.setPriorityDraw(0x7F, 0x7F); - mMdl2.setPriorityDraw(0x7F, 0x7F); + mPutMdl.setPriorityDraw(0x7F, 0x7F); + mGetMdl.setPriorityDraw(0x7F, 0x7F); } diff --git a/src/toBeSorted/item_mdl_stamina_fruit.cpp b/src/toBeSorted/item_mdl_stamina_fruit.cpp index 5aee364d..cf1e0947 100644 --- a/src/toBeSorted/item_mdl_stamina_fruit.cpp +++ b/src/toBeSorted/item_mdl_stamina_fruit.cpp @@ -23,7 +23,7 @@ bool dItemMdlStaminaFruit_c::init(u16 itemId, dAcItem_c *item, mAllocator_c *all if (!mdl1.IsValid()) { return false; } - if (!mMdl1.create(mdl1, allocator, 0x324)) { + if (!mPutMdl.create(mdl1, allocator, 0x324)) { return false; } @@ -40,7 +40,7 @@ bool dItemMdlStaminaFruit_c::init(u16 itemId, dAcItem_c *item, mAllocator_c *all if (!mdl2.IsValid()) { return false; } - if (!mMdl2.create(mdl2, allocator, 0x324)) { + if (!mGetMdl.create(mdl2, allocator, 0x324)) { return false; } @@ -48,62 +48,62 @@ bool dItemMdlStaminaFruit_c::init(u16 itemId, dAcItem_c *item, mAllocator_c *all if (!anmTexSrt1.IsValid()) { return false; } - TRY_CREATE(mAnmTexSrt1.create(mdl1, anmTexSrt1, allocator, nullptr, 1)); - mMdl1.setAnm(mAnmTexSrt1); + TRY_CREATE(mPutAnmTexSrt.create(mdl1, anmTexSrt1, allocator, nullptr, 1)); + mPutMdl.setAnm(mPutAnmTexSrt); nw4r::g3d::ResAnmTexSrt anmTexSrt2 = res2.GetResAnmTexSrt("GutsLight"); if (!anmTexSrt2.IsValid()) { return false; } - TRY_CREATE(mAnmTexSrt2.create(mdl2, anmTexSrt2, allocator, nullptr, 1)); - mMdl2.setAnm(mAnmTexSrt2); + TRY_CREATE(mGetAnmTexSrt.create(mdl2, anmTexSrt2, allocator, nullptr, 1)); + mGetMdl.setAnm(mGetAnmTexSrt); mpItem = item; return true; } -void dItemMdlStaminaFruit_c::vt_0x10(u8 arg) { - if (arg == ITEM_MDL_UNK0x14_3) { - field_0x14 = ITEM_MDL_UNK0x14_1; +void dItemMdlStaminaFruit_c::setDrawMode(u8 arg) { + if (arg == DrawMode_Max) { + mDrawMode = DrawMode_Put; } else { - field_0x14 = arg; + mDrawMode = arg; } } void dItemMdlStaminaFruit_c::setScale(const mVec3_c &scale) { - mMdl1.setScale(scale); - mMdl2.setScale(scale); + mPutMdl.setScale(scale); + mGetMdl.setScale(scale); } void dItemMdlStaminaFruit_c::setLocalMtx(const mMtx_c &mtx) { - mMdl1.setLocalMtx(mtx); - mMdl2.setLocalMtx(mtx); + mPutMdl.setLocalMtx(mtx); + mGetMdl.setLocalMtx(mtx); } void dItemMdlStaminaFruit_c::draw() { - switch (field_0x14) { - case ITEM_MDL_UNK0x14_1: - mAnmTexSrt1.play(); - mpItem->fn_8002ECD0(&mMdl1, 7); + switch (mDrawMode) { + case DrawMode_Put: + mPutAnmTexSrt.play(); + mpItem->fn_8002ECD0(&mPutMdl, 7); break; - case ITEM_MDL_UNK0x14_2: - mAnmTexSrt2.play(); - mpItem->fn_8002ECD0(&mMdl2, 6); + case DrawMode_Get: + mGetAnmTexSrt.play(); + mpItem->fn_8002ECD0(&mGetMdl, 6); break; } } -void dItemMdlStaminaFruit_c::vt_0x20(u16 itemId) { +void dItemMdlStaminaFruit_c::changeItemId(u16 itemId) { // no-op } void dItemMdlStaminaFruit_c::setPriorityDraw() { - mMdl1.setPriorityDraw(0x82, 0x7F); - mMdl2.setPriorityDraw(0x82, 0x7F); + mPutMdl.setPriorityDraw(0x82, 0x7F); + mGetMdl.setPriorityDraw(0x82, 0x7F); } void dItemMdlStaminaFruit_c::unsetPriorityDraw() { - mMdl1.setPriorityDraw(0x7F, 0x7F); - mMdl2.setPriorityDraw(0x7F, 0x7F); + mPutMdl.setPriorityDraw(0x7F, 0x7F); + mGetMdl.setPriorityDraw(0x7F, 0x7F); } From 48fbe8d1da7a82412a73746620291af93354364a Mon Sep 17 00:00:00 2001 From: robojumper Date: Thu, 7 May 2026 19:52:36 +0200 Subject: [PATCH 12/14] Progress --- config/SOUE01/splits.txt | 1 + config/SOUE01/symbols.txt | 80 +++---- include/d/a/d_a_item.h | 120 +++++++--- include/d/a/d_a_itembase.h | 1 + include/d/d_angle.h | 17 ++ src/d/a/d_a_item.cpp | 374 +++++++++++++++++++++++++++---- src/d/a/obj/d_a_obj_tbox.cpp | 2 +- src/toBeSorted/item_mdl_misc.cpp | 2 +- 8 files changed, 483 insertions(+), 114 deletions(-) create mode 100644 include/d/d_angle.h diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index af44b95e..c8a60407 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -1495,6 +1495,7 @@ d/a/d_a_player.cpp: .rodata start:0x804EACF0 end:0x804EBBB0 .data start:0x80530170 end:0x80533268 .sbss start:0x805757B8 end:0x805758B8 + .sdata2 start:0x8057B650 end:0x8057BD88 d/a/d_a_item.cpp: .text start:0x80247200 end:0x80258E58 align:16 diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index b5a0aca9..5cc32b3a 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -13324,10 +13324,10 @@ AcItem__isGoddessPlume = .text:0x802477D0; // type:function size:0x10 isItemRevitalizingPotionPlusPlus = .text:0x802477E0; // type:function size:0x10 isUpgradedPotion__9dAcItem_cF7ITEM_ID = .text:0x802477F0; // type:function size:0xC8 fn_802478C0 = .text:0x802478C0; // type:function size:0x68 -AcItem__isItemFromMittsOrSword = .text:0x80247930; // type:function size:0x20 -fn_80247950 = .text:0x80247950; // type:function size:0x28 -AcItem__isItemFromMitts = .text:0x80247980; // type:function size:0x10 -fn_80247990 = .text:0x80247990; // type:function size:0x8 +isDefaultDeleteGround__Fl = .text:0x80247930; // type:function size:0x20 +isDefaultSwimGround__Fl = .text:0x80247950; // type:function size:0x28 +isHeartDeleteGround__Fl = .text:0x80247980; // type:function size:0x10 +isHeartSwimGround__Fl = .text:0x80247990; // type:function size:0x8 getRandomEntryFromWeightedList = .text:0x802479A0; // type:function size:0x17C determineActualItemIdFromItem__9dAcItem_cFUs = .text:0x80247B20; // type:function size:0x84 fn_80247BB0 = .text:0x80247BB0; // type:function size:0x10C @@ -13337,7 +13337,7 @@ fn_80247E70 = .text:0x80247E70; // type:function size:0x50 increment__FPUl = .text:0x80247EC0; // type:function size:0x28 fn_80247EF0 = .text:0x80247EF0; // type:function size:0xA4 getItemId__13dAcItemBase_cCFv = .text:0x80247FA0; // type:function size:0x8 -fn_80247FB0 = .text:0x80247FB0; // type:function size:0x8 +setItemId__13dAcItemBase_cFUs = .text:0x80247FB0; // type:function size:0x8 dAcItem_c_classInit__Fv = .text:0x80247FC0; // type:function size:0x30 AcItem__dontForceDemo = .text:0x80247FF0; // type:function size:0x8 AcItem__shouldForceDemo = .text:0x80248000; // type:function size:0x8 @@ -13392,7 +13392,7 @@ getTearIdx__9dAcItem_cFv = .text:0x8024A2C0; // type:function size:0xC getFirstBitParams2__9dAcBase_cCFv = .text:0x8024A2D0; // type:function size:0x24 getParams2Lower_shift1_0x7__9dAcItem_cCFv = .text:0x8024A300; // type:function size:0x24 getCurrentTrial__9dAcItem_cFv = .text:0x8024A330; // type:function size:0x68 -getTearSubtype__9dAcItem_cF7ITEM_ID = .text:0x8024A3A0; // type:function size:0x68 +getTearSubtype__9dAcItem_cFUl = .text:0x8024A3A0; // type:function size:0x68 AcItem__GetItemGetType = .text:0x8024A410; // type:function size:0x3C AcItem__getItemListElement = .text:0x8024A450; // type:function size:0x8 AcItem__getFinalDeterminedItemId = .text:0x8024A460; // type:function size:0x8 @@ -13450,9 +13450,9 @@ executeState_WaitSacredDewGetEffect__9dAcItem_cFv = .text:0x802506B0; // type:fu finalizeState_WaitSacredDewGetEffect__9dAcItem_cFv = .text:0x80250730; // type:function size:0x4 getItemFromBWheelItem__9dAcItem_cFv = .text:0x80250740; // type:function size:0xEC setItemPosition__9dAcItem_cFRC7mVec3_c = .text:0x80250830; // type:function size:0x40 -fn_80250870 = .text:0x80250870; // type:function size:0x38 -isStateWait__9dAcItem_cFv = .text:0x802508B0; // type:function size:0x50 -AcItem__setCarriedAndTransitionToGetState = .text:0x80250900; // type:function size:0x50 +setItemVelocity__9dAcItem_cFf = .text:0x80250870; // type:function size:0x38 +isStateWait__9dAcItem_cCFv = .text:0x802508B0; // type:function size:0x50 +stopCarryAndGet__9dAcItem_cFv = .text:0x80250900; // type:function size:0x50 AcItem__isGreenRupee = .text:0x80250950; // type:function size:0x10 AcItem__isBlueRupee = .text:0x80250960; // type:function size:0x10 AcItem__isRedRupee = .text:0x80250970; // type:function size:0x10 @@ -13506,13 +13506,13 @@ isTriforce__9dAcItem_cCFv = .text:0x802510D0; // type:function size:0x8 fn_802510E0 = .text:0x802510E0; // type:function size:0x44 fn_80251130 = .text:0x80251130; // type:function size:0x44 fn_80251180 = .text:0x80251180; // type:function size:0x44 -AcItem__getEventName = .text:0x802511D0; // type:function size:0x6C -fn_80251240 = .text:0x80251240; // type:function size:0x6C -AcItem__getEventNamePtrForItemId = .text:0x802512B0; // type:function size:0x4C -getItemGetEventName__9dAcItem_cFUsPPCc = .text:0x80251300; // type:function size:0x4C -fn_80251350 = .text:0x80251350; // type:function size:0x54 -AcItem__getPosition = .text:0x802513B0; // type:function size:0x24 -fn_802513E0 = .text:0x802513E0; // type:function size:0xC +getEventNameForAnim__9dAcItem_cFUlPPCc = .text:0x802511D0; // type:function size:0x6C +getTboxEventNameForAnim__9dAcItem_cFUlPPCc = .text:0x80251240; // type:function size:0x6C +getItemGetEventName__9dAcItem_cFUsPPCc = .text:0x802512B0; // type:function size:0x4C +getItemGetTboxEventName__9dAcItem_cFUsPPCc = .text:0x80251300; // type:function size:0x4C +playHeartStemCutSound__9dAcItem_cFv = .text:0x80251350; // type:function size:0x54 +getOffsetPosition__9dAcItem_cCFR7mVec3_c = .text:0x802513B0; // type:function size:0x24 +scaleBy__9dAcItem_cCFf = .text:0x802513E0; // type:function size:0xC AcItem__getSmallKeyFreestandingScale = .text:0x802513F0; // type:function size:0x38 fn_80251430 = .text:0x80251430; // type:function size:0x8 fn_80251440 = .text:0x80251440; // type:function size:0x8 @@ -13746,14 +13746,14 @@ fn_80255B30 = .text:0x80255B30; // type:function size:0x6C fn_80255BA0 = .text:0x80255BA0; // type:function size:0x28 fn_80255BD0 = .text:0x80255BD0; // type:function size:0x6C fn_80255C40 = .text:0x80255C40; // type:function size:0x10 -AcItem__IsSpawnedFromMittsOrSwordMaybe = .text:0x80255C50; // type:function size:0x48 -fn_80255CA0 = .text:0x80255CA0; // type:function size:0x48 +isItemDeleteGround__9dAcItem_cCFl = .text:0x80255C50; // type:function size:0x48 +isItemSwimGround__9dAcItem_cCFl = .text:0x80255CA0; // type:function size:0x48 fn_80255CF0 = .text:0x80255CF0; // type:function size:0x60 isDayOrInDungeon = .text:0x80255D50; // type:function size:0x54 fn_80255DB0 = .text:0x80255DB0; // type:function size:0x3C fn_80255DF0 = .text:0x80255DF0; // type:function size:0x84 -fn_80255E80 = .text:0x80255E80; // type:function size:0xB4 -fn_80255F40 = .text:0x80255F40; // type:function size:0x1C +rotateTowardsCamera__9dAcItem_cFv = .text:0x80255E80; // type:function size:0xB4 +rotateFixedBirdStatuette__9dAcItem_cFv = .text:0x80255F40; // type:function size:0x1C fn_80255F60 = .text:0x80255F60; // type:function size:0x8 fn_80255F70 = .text:0x80255F70; // type:function size:0x8 fn_80255F80 = .text:0x80255F80; // type:function size:0x8 @@ -13923,32 +13923,32 @@ isFirstBitParams2NotSet__9dAcItem_cFv = .text:0x80257770; // type:function size: fn_802577A0 = .text:0x802577A0; // type:function size:0x18 fn_802577C0 = .text:0x802577C0; // type:function size:0x8 fn_802577D0 = .text:0x802577D0; // type:function size:0x8 -fn_802577E0 = .text:0x802577E0; // type:function size:0x4 -fn_802577F0 = .text:0x802577F0; // type:function size:0x8 -fn_80257800 = .text:0x80257800; // type:function size:0x6C -fn_80257870 = .text:0x80257870; // type:function size:0x15C -fn_802579D0 = .text:0x802579D0; // type:function size:0x40 +vt_0x0C__15dAcItem_0xB34_1Fv = .text:0x802577E0; // type:function size:0x4 +vt_0x10__15dAcItem_0xB34_1FP9dAcItem_c = .text:0x802577F0; // type:function size:0x8 +vt_0x0C__15dAcItem_0xB34_2Fv = .text:0x80257800; // type:function size:0x6C +vt_0x10__15dAcItem_0xB34_2FP9dAcItem_c = .text:0x80257870; // type:function size:0x15C +fn_802579D0__13dAcItem_0xB3CFv = .text:0x802579D0; // type:function size:0x40 fn_80257A10__13dAcItem_0xB3CFP9dAcItem_c = .text:0x80257A10; // type:function size:0x68 fn_80257A80__13dAcItem_0xB3CFv = .text:0x80257A80; // type:function size:0x3C fn_80257AC0__13dAcItem_0xB3CFv = .text:0x80257AC0; // type:function size:0x44 -fn_80257B10__13dAcItem_0xB3CFv = .text:0x80257B10; // type:function size:0x10 -fn_80257B20 = .text:0x80257B20; // type:function size:0x4 -fn_80257B30 = .text:0x80257B30; // type:function size:0x4 -fn_80257B40 = .text:0x80257B40; // type:function size:0x8 -fn_80257B50 = .text:0x80257B50; // type:function size:0x8 +fn_80257B10__13dAcItem_0xB3CCFv = .text:0x80257B10; // type:function size:0x10 +vt_0x0C__15dAcItem_0xB3C_1FUs = .text:0x80257B20; // type:function size:0x4 +vt_0x10__15dAcItem_0xB3C_1Fv = .text:0x80257B30; // type:function size:0x4 +vt_0x14__15dAcItem_0xB3C_1FP9dAcItem_c = .text:0x80257B40; // type:function size:0x8 +vt_0x18__15dAcItem_0xB3C_1Fv = .text:0x80257B50; // type:function size:0x8 fn_80257B60 = .text:0x80257B60; // type:function size:0x4 fn_80257B70 = .text:0x80257B70; // type:function size:0x4 fn_80257B80 = .text:0x80257B80; // type:function size:0x8 fn_80257B90 = .text:0x80257B90; // type:function size:0x8 isOutOfTime = .text:0x80257BA0; // type:function size:0x1C -fn_80257BC0 = .text:0x80257BC0; // type:function size:0x8 -fn_80257BD0 = .text:0x80257BD0; // type:function size:0x4 -fn_80257BE0 = .text:0x80257BE0; // type:function size:0x28 -fn_80257C10 = .text:0x80257C10; // type:function size:0x8 -fn_80257C20 = .text:0x80257C20; // type:function size:0x40 -fn_80257C60 = .text:0x80257C60; // type:function size:0x40 -fn_80257CA0 = .text:0x80257CA0; // type:function size:0x40 -fn_80257CE0 = .text:0x80257CE0; // type:function size:0x40 +vt_0x0C__15dAcItem_0xB3C_2FUs = .text:0x80257BC0; // type:function size:0x8 +vt_0x10__15dAcItem_0xB3C_2Fv = .text:0x80257BD0; // type:function size:0x4 +vt_0x14__15dAcItem_0xB3C_2FP9dAcItem_c = .text:0x80257BE0; // type:function size:0x28 +vt_0x18__15dAcItem_0xB3C_2Fv = .text:0x80257C10; // type:function size:0x8 +__dt__15dAcItem_0xB3C_2Fv = .text:0x80257C20; // type:function size:0x40 +__dt__15dAcItem_0xB3C_1Fv = .text:0x80257C60; // type:function size:0x40 +__dt__15dAcItem_0xB34_2Fv = .text:0x80257CA0; // type:function size:0x40 +__dt__15dAcItem_0xB34_1Fv = .text:0x80257CE0; // type:function size:0x40 build__24sFStateFct_c<9dAcItem_c>FRC12sStateIDIf_c = .text:0x80257D20; // type:function size:0x60 dispose__24sFStateFct_c<9dAcItem_c>FRP10sStateIf_c = .text:0x80257D80; // type:function size:0xC initialize__21sFState_c<9dAcItem_c>Fv = .text:0x80257D90; // type:function size:0x1C @@ -28530,7 +28530,7 @@ DEFAULT_ITEM_INIT_STRUCT = .rodata:0x804EC42C; // type:object size:0x14 sItemFlagStructs__13dAcItemBase_c = .rodata:0x804EC440; // type:object size:0x538 scope:local sItemTypeFlags__13dAcItemBase_c = .rodata:0x804EC978; // type:object size:0x7F8 scope:local TRIAL_INDEX_STRUCTS = .rodata:0x804ED170; // type:object size:0x20 -GLITTERING_SPORES_CHANCES = .rodata:0x804ED190; // type:object size:0x20 data:4byte +sSporeRupeeChances = .rodata:0x804ED190; // type:object size:0x20 data:4byte lbl_804ED1B0 = .rodata:0x804ED1B0; // type:object size:0x18 lbl_804ED1C8 = .rodata:0x804ED1C8; // type:object size:0x18 lbl_804ED1E0 = .rodata:0x804ED1E0; // type:object size:0x10 @@ -48030,7 +48030,7 @@ lbl_8057BD74 = .sdata2:0x8057BD74; // type:object size:0x4 align:4 data:float lbl_8057BD78 = .sdata2:0x8057BD78; // type:object size:0x4 align:4 data:float lbl_8057BD7C = .sdata2:0x8057BD7C; // type:object size:0x4 align:4 data:float lbl_8057BD80 = .sdata2:0x8057BD80; // type:object size:0x4 align:4 data:float -DEFAULT_ITEM_FLAG_STRUCT = .sdata2:0x8057BD88; // type:object size:0x8 +sDefaultFlagStruct__13dAcItemBase_c = .sdata2:0x8057BD88; // type:object size:0x8 lbl_8057BD90 = .sdata2:0x8057BD90; // type:object size:0x4 data:4byte lbl_8057BD94 = .sdata2:0x8057BD94; // type:object size:0x4 data:4byte lbl_8057BD98 = .sdata2:0x8057BD98; // type:object size:0x4 data:4byte diff --git a/include/d/a/d_a_item.h b/include/d/a/d_a_item.h index 8c28c148..8d06e468 100644 --- a/include/d/a/d_a_item.h +++ b/include/d/a/d_a_item.h @@ -1,14 +1,16 @@ #ifndef D_A_ITEM_H #define D_A_ITEM_H +// clang-format off +// vtable order #include "common.h" +#include "d/d_shadow.h" #include "d/a/d_a_base.h" #include "d/a/d_a_itembase.h" #include "d/a/obj/d_a_obj_scattersand.h" #include "d/col/bg/d_bg_s_acch.h" #include "d/col/c/c_cc_d.h" #include "d/col/cc/d_cc_d.h" -#include "d/d_shadow.h" #include "f/f_list_mg.h" #include "f/f_list_nd.h" #include "m/m_angle.h" @@ -18,84 +20,100 @@ #include "toBeSorted/actor_event.h" #include "toBeSorted/d_emitter.h" #include "toBeSorted/dowsing_target.h" +// clang-format on class dItemMdl_c; class dAcItem_c; +/** Positions picked up items for a bit. */ class dAcItem_0xB34 { public: virtual ~dAcItem_0xB34() {} virtual void vt_0x0C() = 0; - virtual void vt_0x10() = 0; + virtual bool vt_0x10(dAcItem_c *item) = 0; }; +/** No-op impl that immediately hides the item */ class dAcItem_0xB34_1 : public dAcItem_0xB34 { public: virtual ~dAcItem_0xB34_1() {} virtual void vt_0x0C() override; - virtual void vt_0x10() override; + virtual bool vt_0x10(dAcItem_c *item) override; }; +/** Impl that positions picked up items above Link's head */ class dAcItem_0xB34_2 : public dAcItem_0xB34 { public: virtual ~dAcItem_0xB34_2() {} virtual void vt_0x0C() override; - virtual void vt_0x10() override; + virtual bool vt_0x10(dAcItem_c *item) override; private: - /* 0x04 */ u8 _0x04[0x0C - 0x04]; + /* 0x04 */ f32 mHighestRelativeHeadHeight; + /* 0x08 */ u8 mNumFrames; }; +/** Respawns certain items. */ class dAcItem_0xB3C { public: virtual ~dAcItem_0xB3C() {} virtual void vt_0x0C(u16) = 0; virtual void vt_0x10() = 0; - virtual void vt_0x14() = 0; - virtual void vt_0x18() = 0; + virtual bool vt_0x14(dAcItem_c *) = 0; + virtual UNKWORD vt_0x18() = 0; void fn_802579D0(); - bool fn_80257A10(dAcItem_c*); - bool fn_80257A80(); + bool fn_80257A10(dAcItem_c *); + void fn_80257A80(); void fn_80257AC0(); - bool fn_80257B10(); + bool fn_80257B10() const; protected: - /* 0x04 */ u8 _0x04[0x08 - 0x04]; + /* 0x04 */ UNKWORD field_0x04; }; +/** No-op impl that doesn't respawn items */ class dAcItem_0xB3C_1 : public dAcItem_0xB3C { public: dAcItem_0xB3C_1(u16, u16) {} - virtual ~dAcItem_0xB3C_1(); + virtual ~dAcItem_0xB3C_1() {} virtual void vt_0x0C(u16) override; virtual void vt_0x10() override; - virtual void vt_0x14() override; - virtual void vt_0x18() override; + virtual bool vt_0x14(dAcItem_c *) override; + virtual UNKWORD vt_0x18() override; }; +/** Impl that respawns items */ class dAcItem_0xB3C_2 : public dAcItem_0xB3C { public: dAcItem_0xB3C_2(u16 a1, u16 a2) { mCb1 = sCb1s[a1]; mCb2 = sCb2s[a2]; } - virtual ~dAcItem_0xB3C_2(); + virtual ~dAcItem_0xB3C_2() {} virtual void vt_0x0C(u16) override; virtual void vt_0x10() override; - virtual void vt_0x14() override; - virtual void vt_0x18() override; + virtual bool vt_0x14(dAcItem_c *) override; + virtual UNKWORD vt_0x18() override; public: typedef void (dAcItem_0xB3C_2::*Callback1)(); + // May or may not take a dAcItem_c* argument... typedef bool (dAcItem_0xB3C_2::*Callback2)(); static Callback1 sCb1s[2]; static Callback2 sCb2s[3]; + void Cb1_1(); + void Cb1_2(); + + bool Cb2_1(); + bool Cb2_2(); + bool Cb2_3(); + /* 0x08 */ Callback1 mCb1; /* 0x14 */ Callback2 mCb2; - /* 0x20 */ u8 _0x20[0x24 - 0x20]; + /* 0x20 */ UNKWORD field_0x20; }; class dAcItem_c : public dAcItemBase_c { @@ -110,10 +128,17 @@ public: virtual int draw() override; virtual u16 getItemIdFromParams() override; - virtual void setItemId(u16 id); + virtual void setItemId(u16 id) override; virtual bool shouldDespawn(); virtual bool isItemSmallKeyOrHeartPieceOrStaminaFruit(); + enum ItemGetAnim_e { + ANIM_DEFAULT, + ANIM_GORGEOUS, + ANIM_FROWN, + ANIM_SMALL, + }; + STATE_FUNC_DECLARE(dAcItem_c, Wait); STATE_FUNC_DECLARE(dAcItem_c, Carry); STATE_FUNC_DECLARE(dAcItem_c, GetBeetle); @@ -141,9 +166,11 @@ public: static void setFlag(s32 id); static bool checkTreasureTempCollect(u16 itemId); - void setItemPosition(const mVec3_c &); void getItemFromBWheelItem(); - bool isStateWait(); + void setItemPosition(const mVec3_c &); + void setItemVelocity(f32 f); + bool isStateWait() const; + void stopCarryAndGet(); static s32 getTotalBombCount(); static s32 getTotalArrowCount(); @@ -224,7 +251,10 @@ public: u32 getParams2Lower_shift1_0x7() const; + static bool getEventNameForAnim(u32 anim, const char **outName); + static bool getTboxEventNameForAnim(u32 anim, const char **outName); static bool getItemGetEventName(u16 item, const char **outName); + static bool getItemGetTboxEventName(u16 item, const char **outName); static void itemGetEventStart(dAcBase_c *); static void itemGetEventEnd(dAcBase_c *); @@ -248,7 +278,7 @@ public: TEAR_MAX }; - static Tear_e getTearSubtype(ITEM_ID item); + static Tear_e getTearSubtype(u32 item); static void healLink(u32 amount, bool); // move to dAcPy_c @@ -265,6 +295,10 @@ public: } private: + bool isField_0xD04GtZero() const { + return 0.0f < field_0xD04; + } + static bool sIsPerformingInitialCollection; static s32 sCollectionCurrentCount; @@ -275,8 +309,17 @@ private: static const mVec3_c sScale1Maybe; static const mVec3_c sScale2Maybe; + static const mVec3_c sUnkOffset1; + static const mVec3_c sUnkOffset2; + static const mVec3_c sUnkOffset3; + static const mVec3_c sUnkOffset4; + static const mVec3_c sUnkOffset5; + static const mVec3_c sUnkOffset6; + static const mVec2_c sUnkVec2; + typedef bool (dAcItem_c::*sStaticPtmf)(); - static const sStaticPtmf sStaticPtmfs[]; + static const sStaticPtmf sStaticPtmfs1[]; + static const sStaticPtmf sStaticPtmfs2[]; static dAcRef_c sItemListHead; static dAcRef_c sItemListTail; @@ -397,6 +440,11 @@ private: void incrementFramesInAir(); void setItemFlags(u32 flags); + /** Checks if the ground's specialCode should allow the item to sink, deleting the item when fully submerged */ + bool isItemDeleteGround(s32 specialCode) const; + /** Checks if the ground's specialCode should allow the item to "dip" into the ground */ + bool isItemSwimGround(s32 specialCode) const; + bool fn_80255CF0(); bool fn_802574A0(); void addToGetQueue(); @@ -409,8 +457,6 @@ private: bool fn_802577A0(); void fn_80256F20(); bool fn_80256E80(); - bool fn_80255C50(u32 specialCode); - bool fn_80255CA0(u32 specialCode); void getCurrentModelScale(f32 *scale); f32 getCurrentScale(); void fn_802518C0(mVec3_c *out); @@ -456,7 +502,10 @@ private: void fn_80254810(); static s16 getItemRotateAngle(); - static void getItemGetEventName(u16 id, char *const *name); + bool playHeartStemCutSound(); + + void getOffsetPosition(mVec3_c &position) const; + f32 scaleBy(f32 f) const; // Could also return vector static void fn_80247540(mVec3_c &); @@ -662,12 +711,14 @@ private: f32 getRupoorHitKnockbackRand3(); f32 getHeartHitKnockbackRand3(); - f32 fn_802577C0(); - f32 fn_802577D0(); + f32 getSinkSpeedHeart(); + f32 getSinkSpeedDefault(); - void fn_80255E80(); - void fn_80255F40(); +public: + void rotateTowardsCamera(); + void rotateFixedBirdStatuette(); +private: /* 0x334 */ dItemMdl_c *mpMdl; /* 0x338 */ dShadowCircle_c mShdw; /* 0x340 */ mVec3_c field_0x340; @@ -688,7 +739,7 @@ private: /* 0xA60 */ dEmitter_c mEff_0xA60; /* 0xA94 */ dAcRef_c mCoveredSand; /* 0xAA0 */ dAcRef_c mForceSignRef; - /* 0xAAC */ mVec3_c posCopy; + /* 0xAAC */ mVec3_c mItemPosCopy; /* 0xAB8 */ fLiNdBa_c mNode; /* 0xAC4 */ ActorEventRelated mEventRelated; /* 0xB14 */ DowsingTarget mDowsingTarget; @@ -725,7 +776,7 @@ private: /* 0xC90 */ f32 (dAcItem_c::*mFn_0xC90)(); /* 0xC9C */ void (dAcItem_c::*mFn_0xC9C)(); /* 0xCA8 */ void (dAcItem_c::*mFnSetBoundingBox)(); - /* 0xCB4 */ f32 (dAcItem_c::*mFn_0xCB4)(void); + /* 0xCB4 */ f32 (dAcItem_c::*mFnGetSinkSpeed)(void); /* 0xCC0 */ dAcRef_c mItemQueuePrev; /* 0xCCC */ dAcRef_c mItemQueueNext; /* 0xCD8 */ f32 field_0xCD8; @@ -735,9 +786,9 @@ private: /* 0xCE8 */ f32 field_0xCE8; /* 0xCEC */ f32 field_0xCEC; /* 0xCF0 */ u8 _CF0[0xD00 - 0xCF0]; - /* 0xD00 */ f32 field_0xD00; + /* 0xD00 */ f32 mSinkOffset; /* 0xD04 */ f32 field_0xD04; - /* 0xD08 */ u8 _D08[0xD0C - 0xD08]; + /* 0xD08 */ f32 field_0xD08; /* 0xD0C */ f32 field_0xD0C; /* 0xD10 */ u8 _D10[0xD14 - 0xD10]; /* 0xD14 */ f32 mFreestandingOffsetH; @@ -790,6 +841,7 @@ private: public: static fLiMgBa_c sItemList; + static fLiMgBa_c sUnusedList; }; #endif diff --git a/include/d/a/d_a_itembase.h b/include/d/a/d_a_itembase.h index d0f29f23..828d98c0 100644 --- a/include/d/a/d_a_itembase.h +++ b/include/d/a/d_a_itembase.h @@ -245,6 +245,7 @@ public: virtual ~dAcItemBase_c() {} virtual u16 getItemId() const; virtual u16 getItemIdFromParams() = 0; + virtual void setItemId(u16 id); static bool isValidItemTypeIdx(int itemId); static bool getItemTypeFromId(u16 itemID, u32 *pOutType); diff --git a/include/d/d_angle.h b/include/d/d_angle.h new file mode 100644 index 00000000..dc12dabc --- /dev/null +++ b/include/d/d_angle.h @@ -0,0 +1,17 @@ +#ifndef D_ANGLE_H +#define D_ANGLE_H + +#include "m/m_angle.h" +#include "m/m_vec.h" + +inline void setRotXY(mAng3_c &rot, s32 x, s32 y) { + rot.x.mVal = x; + rot.y.mVal = y; + rot.z.mVal = 0; +} + +inline void setRotXYVec(mAng3_c &rot, const mVec3_c &direction) { + setRotXY(rot, -direction.atan2sY_XZ(), direction.atan2sX_Z()); +} + +#endif diff --git a/src/d/a/d_a_item.cpp b/src/d/a/d_a_item.cpp index 5781c44c..f467afc7 100644 --- a/src/d/a/d_a_item.cpp +++ b/src/d/a/d_a_item.cpp @@ -10,6 +10,7 @@ #include "d/col/bg/d_bg_s.h" #include "d/col/cc/d_cc_d.h" #include "d/col/cc/d_cc_s.h" +#include "d/d_angle.h" #include "d/d_camera.h" #include "d/d_linkage.h" #include "d/d_player.h" @@ -24,6 +25,7 @@ #include "d/t/d_t_force_get_flag.h" #include "d/t/d_t_minigame_insect_capture.h" #include "d/t/d_t_siren.h" +#include "m/m_angle.h" #include "m/m_vec.h" #include "toBeSorted/event_manager.h" #include "toBeSorted/file_manager.h" @@ -325,6 +327,25 @@ bool dAcItemBase_c::setDungeonFlagForTear(int tearNum) { return true; } +static bool isDefaultDeleteGround(s32 specialCode) { + // Lava, Cursed Water + return specialCode == 7 || specialCode == 17; +} + +static bool isDefaultSwimGround(s32 specialCode) { + // Deep Sand (Knee Deep), Very Deep Sand (Void, Instant), Very Deep Sand (Void, Slow) + return specialCode == 10 || specialCode == 11 || specialCode == 16; +} + +static bool isHeartDeleteGround(s32 specialCode) { + // Lava + return specialCode == 7; +} + +static bool isHeartSwimGround(s32 specialCode) { + return false; +} + // This might be a cM::calcTimer thing... bool increment(u32 *value) { if (*value < UINT32_MAX) { @@ -358,10 +379,10 @@ u16 getIndex(u16 itemId) { // } static const char *const sResNodeName = "Set"; -/* static */ extern const char *const sDefaultGetItem = "DefaultGetItem"; -/* static */ extern const char *const sItemGetGorgeous = "ItemGetGorgeous"; -/* static */ extern const char *const sItemGetDefaultTbox = "ItemGetDefaultTBox"; -/* static */ extern const char *const sItemGetGorgeousTbox = "ItemGetGorgeousTBox"; +static const char *const sDefaultGetItem = "DefaultGetItem"; +static const char *const sItemGetGorgeous = "ItemGetGorgeous"; +static const char *const sItemGetDefaultTbox = "ItemGetDefaultTBox"; +static const char *const sItemGetGorgeousTbox = "ItemGetGorgeousTBox"; /* static */ extern const char *const sItemGetBird = "ItemGetBird"; const mVec3_c dAcItem_c::sFreestandingDowsingOffset(0.0f, 25.0f, 0.0f); @@ -369,17 +390,17 @@ const mVec3_c dAcItem_c::sScale1Maybe(1.0f, 1.0f, 1.0f); const mVec3_c dAcItem_c::sScale2Maybe(1.75f, 1.75f, 1.75f); struct TearIdIdx { - s32 idx; + dAcItem_c::Tear_e idx; u16 itemId; mColor color1; mColor color2; }; -/* static */ extern "C" TearIdIdx sTearIdxes[] = { - {0, ITEM_FARORE_TEAR, mColor(0x00, 0x80, 0x30, 0xFF), mColor(0xFF, 0xFF, 0xFF, 0xFF)}, - {1, ITEM_DIN_TEAR, mColor(0xFF, 0x64, 0x80, 0xFF), mColor(0xFF, 0xFF, 0xFF, 0xFF)}, - {2, ITEM_NAYRU_TEAR, mColor(0x80, 0x80, 0x00, 0xFF), mColor(0xFF, 0xFF, 0xFF, 0xFF)}, - {3, ITEM_SACRED_TEAR, mColor(0x00, 0x64, 0xC8, 0xFF), mColor(0xFF, 0xFF, 0xFF, 0xFF)}, +static TearIdIdx sTearIdxes[] = { + { dAcItem_c::TEAR_FARON, ITEM_FARORE_TEAR, mColor(0x00, 0x80, 0x30, 0xFF), mColor(0xFF, 0xFF, 0xFF, 0xFF)}, + { dAcItem_c::TEAR_ELDIN, ITEM_DIN_TEAR, mColor(0xFF, 0x64, 0x80, 0xFF), mColor(0xFF, 0xFF, 0xFF, 0xFF)}, + {dAcItem_c::TEAR_LANAYRU, ITEM_NAYRU_TEAR, mColor(0x80, 0x80, 0x00, 0xFF), mColor(0xFF, 0xFF, 0xFF, 0xFF)}, + {dAcItem_c::TEAR_GODDESS, ITEM_SACRED_TEAR, mColor(0x00, 0x64, 0xC8, 0xFF), mColor(0xFF, 0xFF, 0xFF, 0xFF)}, }; struct TearEffectColorThing { @@ -405,15 +426,32 @@ extern "C" TearEffectColorThing sTearEffectColors[] = { mColor(0x40, 0xA0, 0xFF, 0xFF), mColor(0xFF, 0xFF, 0xFF, 0xFF), mColor(0xFF, 0xFF, 0xFF, 0xFF)}, }; +struct UnkFloat { + f32 f; + UnkFloat(f32 f_) : f(f_) {} +}; + +const mVec3_c dAcItem_c::sUnkOffset1(0.0f, 28.0f, 0.0f); +const mVec3_c dAcItem_c::sUnkOffset2(0.0f, 0.0f, 0.0f); +const mVec3_c dAcItem_c::sUnkOffset3(0.0f, 28.0f, 0.0f); +const mVec3_c dAcItem_c::sUnkOffset4(0.0f, 0.0f, 0.0f); +const mVec3_c dAcItem_c::sUnkOffset5(0.0f, 25.0f, 0.0f); +const mVec3_c dAcItem_c::sUnkOffset6(0.0f, 25.0f, 0.0f); +extern const UnkFloat f1(0.25f); +extern const UnkFloat f2(1.0f); + /* static */ extern const char *const sGetFairyBody = "GetFairy_body"; /* static */ extern const char *const sBottleFairy_body = "BottleFairy_body"; SPECIAL_ACTOR_PROFILE(ITEM, dAcItem_c, fProfile::ITEM, 0x2B, 0, 2); -const dAcItem_c::sStaticPtmf dAcItem_c::sStaticPtmfs[] = { +const dAcItem_c::sStaticPtmf dAcItem_c::sStaticPtmfs1[] = { &dAcItem_c::fn_80248020, nullptr, &dAcItem_c::fn_80248010, nullptr, &dAcItem_c::fn_80255B30, &dAcItem_c::fn_80255BA0, +}; + +const dAcItem_c::sStaticPtmf dAcItem_c::sStaticPtmfs2[] = { &dAcItem_c::fn_80248040, nullptr, &dAcItem_c::fn_80248030, nullptr, &dAcItem_c::fn_80255BD0, &dAcItem_c::fn_80255C40, @@ -422,6 +460,7 @@ const dAcItem_c::sStaticPtmf dAcItem_c::sStaticPtmfs[] = { fLiMgBa_c dAcItem_c::sItemList; dAcRef_c dAcItem_c::sItemListHead; dAcRef_c dAcItem_c::sItemListTail; +fLiMgBa_c dAcItem_c::sUnusedList; dAcItem_c::dAcItem_c() : mStateMgr(*this), @@ -474,6 +513,23 @@ dAcItem_c::~dAcItem_c() { mDowsingTarget.doUnregister(); } +dAcItem_c::Tear_e dAcItem_c::getTearSubtype(u32 id) { + // If only this could be written in a simpler way... + bool found = false; + int i = 0; + while (!found && i <= (int)ARRAY_LENGTH(sTearIdxes) - 1) { + if (id == sTearIdxes[i].itemId) { + found = true; + } else { + i++; + } + } + if (found) { + return sTearIdxes[i].idx; + } + return TEAR_MAX; +} + bool dAcItem_c::createHeap() { if (dItemMdlPut_c::isMdlForItemId(mRealItemId)) { mpMdl = new dItemMdlPut_c(); @@ -966,9 +1022,9 @@ int dAcItem_c::create() { } if (isHeartV()) { - mFn_0xCB4 = &dAcItem_c::fn_802577C0; + mFnGetSinkSpeed = &dAcItem_c::getSinkSpeedHeart; } else { - mFn_0xCB4 = &dAcItem_c::fn_802577D0; + mFnGetSinkSpeed = &dAcItem_c::getSinkSpeedDefault; } if (mbNoDespawn) { @@ -986,7 +1042,7 @@ int dAcItem_c::create() { } if (isAnyTear()) { - s32 type = getTearSubtype((ITEM_ID)mId); + s32 type = getTearSubtype(mId); if (type == TEAR_MAX) { type = TEAR_FARON; } @@ -1219,8 +1275,7 @@ int dAcItem_c::actorExecute() { applyBoundingBox(); - bool tmp = 0.0f < field_0xD04; - if (tmp || mStateMgr.isState(StateID_WaitGetDemo) || mStateMgr.isState(StateID_Get) || + if (isField_0xD04GtZero() || mStateMgr.isState(StateID_WaitGetDemo) || mStateMgr.isState(StateID_Get) || mStateMgr.isState(StateID_GetBeetle)) { setActorProperty(AC_PROP_0x4); } else { @@ -1307,7 +1362,7 @@ void dAcItem_c::initializeState_Wait() { mObjAcch.SetMoveBGOnly(); } mMdlScaleType = 0; - field_0xD00 = 0.0f; + mSinkOffset = 0.0f; mYOffset = 0.0f; } @@ -1587,20 +1642,20 @@ void dAcItem_c::executeState_Wait() { if (mObjAcch.ChkGndHit() && mVelocity.y <= 0.0f) { u32 specialCode = dBgS::GetInstance()->GetSpecialCode(mObjAcch.GetGnd()); - if (fn_80255C50(specialCode)) { - if (sLib::chase(&field_0xD00, -100.0f, (this->*mFn_0xCB4)())) { + if (isItemDeleteGround(specialCode)) { + if (sLib::chase(&mSinkOffset, -100.0f, (this->*mFnGetSinkSpeed)())) { deleteRequest(); } - } else if (fn_80255CA0(specialCode)) { - sLib::chase(&field_0xD00, -30.0f, (this->*mFn_0xCB4)()); + } else if (isItemSwimGround(specialCode)) { + sLib::chase(&mSinkOffset, -30.0f, (this->*mFnGetSinkSpeed)()); } else { - sLib::chase(&field_0xD00, 0.0f, 6.0f); + sLib::chase(&mSinkOffset, 0.0f, 6.0f); } } else { - field_0xD00 = 0.0f; + mSinkOffset = 0.0f; } - mYOffset = field_0xD00; + mYOffset = mSinkOffset; if (isAnyTear() && mObjAcch.ChkGroundLanding()) { startSoundWithFloatParam(SE_Item_A43_FALL, mVelocity.y); } @@ -1653,9 +1708,7 @@ void dAcItem_c::executeState_Wait() { } dir *= -40.0f; mVec3_c efPos = offsetPos + dir; - mEff_0x928.holdEffect( - PARTICLE_RESOURCE_ID_MAPPING_821_, efPos, nullptr, &scale, nullptr, nullptr - ); + mEff_0x928.holdEffect(PARTICLE_RESOURCE_ID_MAPPING_821_, efPos, nullptr, &scale, nullptr, nullptr); } makeLinkLookTowardItem(); if (!mbNoDespawn && !isItemSmallKeyOrHeartPieceOrStaminaFruit()) { @@ -1668,7 +1721,7 @@ void dAcItem_c::finalizeState_Wait() { unsetActorProperty(AC_PROP_0x1); mObjAcch.SetRoofNone(); mObjAcch.Clr_0x2000000(); - field_0xD00 = 0.0f; + mSinkOffset = 0.0f; mYOffset = 0.0f; if (isTriforce() && mEff_0x928.hasEmitters()) { mEff_0x928.remove(true); @@ -1716,7 +1769,7 @@ void dAcItem_c::executeState_Carry() { mStateMgr.changeState(StateID_Wait); } else if (mLinkage.checkConnection(dLinkage_c::CONNECTION_9) && mCyl.ChkTgHit() && !mCyl.ChkTgAtHitType(AT_TYPE_WHIP)) { - mLinkage.fn_80050EA0(this); + mLinkage.forceRemove(this); mStateMgr.changeState(StateID_Wait); } else { fn_80256E80(); @@ -1782,7 +1835,7 @@ void dAcItem_c::executeState_GetBeetle() { v.rotY(+beetlePtr->mRotation.y); mPosition = beetlePtr->mPosition + v; mPosition.y += field_0xD0C; - fn_80255E80(); + rotateTowardsCamera(); sLib::addCalcScaledDiff(&field_0xD0C, 37.6f, 0.1f, 10000.0f); } } @@ -1969,9 +2022,9 @@ void dAcItem_c::initializeState_GetDemo() { setObjectProperty(OBJ_PROP_0x200); mMdlScaleType = 2; if (isBirdStatuette()) { - mFn_0xC9C = &dAcItem_c::fn_80255F40; + mFn_0xC9C = &dAcItem_c::rotateFixedBirdStatuette; } else { - mFn_0xC9C = &dAcItem_c::fn_80255E80; + mFn_0xC9C = &dAcItem_c::rotateTowardsCamera; } } @@ -1984,7 +2037,9 @@ void dAcItem_c::executeState_GetDemo() { fn_80254590(efPos); mVec3_c diff = dScGame_c::getCamera()->getPosition() - mPosition; // TODO close but an extsh is missing - mAng3_c rot((s32)-diff.atan2sY_XZ(), (s32)diff.atan2sX_Z(), 0); + // Same pattern as in rotateTowardsCamera + mAng3_c rot; + setRotXYVec(rot, diff); u32 alpha = 0xFF; if (dScGame_c::currentSpawnInfo.getTrial() == SpawnInfo::TRIAL) { alpha = 0x80; @@ -2042,7 +2097,7 @@ void dAcItem_c::initializeState_WaitTBoxGetDemo() { void dAcItem_c::executeState_WaitTBoxGetDemo() { const char *name; - getItemGetEventName(getItemId(), &name); + getItemGetTboxEventName(getItemId(), &name); Event ev(name, 1, 0x100001, (void *)itemGetEventStart, (void *)itemGetEventEnd); EventManager::alsoSetAsCurrentEvent(this, &ev, nullptr); } @@ -2091,7 +2146,7 @@ void dAcItem_c::initializeState_WaitTurnOff() { } void dAcItem_c::executeState_WaitTurnOff() { - if (field_0xD04 <= 0.0f) { + if (!isField_0xD04GtZero()) { deleteRequest(); } } @@ -2131,9 +2186,111 @@ STATE_DEFINE(dAcItem_c, ResurgeWait); STATE_DEFINE(dAcItem_c, WaitTurnOff); STATE_DEFINE(dAcItem_c, WaitSacredDewGetEffect); +void dAcItem_c::getItemFromBWheelItem() { + if (mStateMgr.isState(StateID_Get) || mStateMgr.isState(StateID_WaitGetDemo)) { + return; + } + if (!mStateMgr.isState(StateID_ResurgeWait)) { + onTouchLink(); + } +} + +void dAcItem_c::setItemPosition(const mVec3_c &pos) { + mPosition = pos; + field_0xD51 = 1; + if (!field_0xD5E) { + return; + } + field_0xD5F = 1; + mItemPosCopy = pos; +} + +void dAcItem_c::setItemVelocity(f32 f) { + mVelocity.y = f; + field_0xD51 = 0; + if (!field_0xD5E) { + return; + } + field_0xD60 = 0; + if (!field_0xD61) { + return; + } + field_0xD5F = 0; + field_0xD08 = 1.0f; +} + +bool dAcItem_c::isStateWait() const { + return mStateMgr.isState(StateID_Wait); +} + +void dAcItem_c::stopCarryAndGet() { + mLinkage.forceRemove(this); + mStateMgr.changeState(StateID_Get); +} + +bool dAcItem_c::getEventNameForAnim(u32 anim, const char **outName) { + if (outName == nullptr) { + return false; + } + switch (anim) { + default: return false; + case ANIM_DEFAULT: *outName = sDefaultGetItem; break; + case ANIM_GORGEOUS: *outName = sItemGetGorgeous; break; + case ANIM_FROWN: *outName = sDefaultGetItem; break; + case ANIM_SMALL: *outName = sDefaultGetItem; break; + } + return true; +} + +bool dAcItem_c::getTboxEventNameForAnim(u32 anim, const char **outName) { + if (outName == nullptr) { + return false; + } + switch (anim) { + default: return false; + case ANIM_DEFAULT: *outName = sItemGetDefaultTbox; break; + case ANIM_GORGEOUS: *outName = sItemGetGorgeousTbox; break; + case ANIM_FROWN: *outName = sItemGetDefaultTbox; break; + case ANIM_SMALL: *outName = sItemGetDefaultTbox; break; + } + return true; +} + +bool dAcItem_c::getItemGetEventName(u16 item, const char **outName) { + u32 anim; + if (getItemAnimType(item, &anim) == false) { + return false; + } + return getEventNameForAnim(anim, outName); +} + +bool dAcItem_c::getItemGetTboxEventName(u16 item, const char **outName) { + u32 anim; + if (getItemAnimType(item, &anim) == false) { + return false; + } + return getTboxEventNameForAnim(anim, outName); +} + +bool dAcItem_c::playHeartStemCutSound() { + dSoundSourceIf_c *src = getSoundSource(); + if (src == nullptr) { + return false; + } + return src->startSoundAtPosition(SE_O_HEART_STEM_CUT, mPosition); +} + +void dAcItem_c::getOffsetPosition(mVec3_c &position) const { + position.set(mPosition.x, mPosition.y + getYOffset(), mPosition.z); +} + +f32 dAcItem_c::scaleBy(f32 f) const { + return f * mBaseScale; +} + void dAcItem_c::itemGetEventStart(dAcBase_c *arg) { // TODO - dAcItem_c *item = static_cast(arg); + dAcItem_c *item = static_cast(arg); item->mStateMgr.changeState(StateID_GetDemo); item->setObtainedItemId(item->getItemId(), true); if (item->mId == ITEM_DUNGEON_MAP_FI && ItemflagManager::sInstance->getItemCounterOrFlag(0x32) == 0) { @@ -2250,9 +2407,9 @@ void dAcItem_c::performCollectionPart1() { default: { if (isTriforce()) { doFullHeal(); - } else if (isGratitudeCrystal()) { + } else if (isGratitudeCrystalV()) { increaseGratitudeCrystalCounter(1); - } else if (is5GratitudeCrystals()) { + } else if (is5GratitudeCrystalsV()) { increaseGratitudeCrystalCounter(5); } else if (id == ITEM_EXTRA_WALLET) { increaseExtraWalletCounter(1); @@ -2403,3 +2560,144 @@ void dAcItem_c::performCollectionPart2() { dTgMinigameInsectCapture_c::GetInstance()->recordCollectedInsect(mId, mItemQuantity != 0 ? mItemQuantity : 1); } } + +bool dAcItem_c::isItemDeleteGround(s32 specialCode) const { + if (isHeartV()) { + return isHeartDeleteGround(specialCode); + } else { + return isDefaultDeleteGround(specialCode); + } +} + +bool dAcItem_c::isItemSwimGround(s32 specialCode) const { + if (isHeartV()) { + return isHeartSwimGround(specialCode); + } else { + return isDefaultSwimGround(specialCode); + } +} + +void dAcItem_c::rotateTowardsCamera() { + dCamera_c *cam = dScGame_c::getCamera(); + if (cam == nullptr) { + return; + } + mVec3_c diff = cam->getPosition() - mPosition; + // TODO close but an extsh is missing + // Same pattern as in executeState_GetDemo + setRotXYVec(mRotation, diff); +} + +void dAcItem_c::rotateFixedBirdStatuette() { + mRotation.x.mVal = 1237; + mRotation.y.mVal = 20330; + mRotation.z.mVal = 0; +} + +void dAcItem_0xB34_1::vt_0x0C() { + // no-op +} + +bool dAcItem_0xB34_1::vt_0x10(dAcItem_c *item) { + return false; +} + +void dAcItem_0xB34_2::vt_0x0C() { + // TODO weird double load + dAcPy_c *link = dAcPy_c::GetLinkM(); + if (link != nullptr) { + mHighestRelativeHeadHeight = link->getHeadTranslation().y - link->getPosition().y; + } + mNumFrames = 0; +} + +bool dAcItem_0xB34_2::vt_0x10(dAcItem_c *item) { + if (mNumFrames >= 22) { + return false; + } + + // TODO weird double load + dAcPy_c *link = dAcPy_c::GetLinkM(); + if (link == nullptr) { + return false; + } + + mVec3_c linkPos = link->getPosition(); + mVec3_c headPos = link->getHeadTranslation(); + f32 diff = headPos.y - linkPos.y; + if (mHighestRelativeHeadHeight < diff) { + mHighestRelativeHeadHeight = diff; + } + + item->mPosition.set(headPos.x, linkPos.y + mHighestRelativeHeadHeight, headPos.z); + + f32 f = 12.0f; + if (mNumFrames != 0) { + f = (f32)mNumFrames * 0.5f * ((mNumFrames - 1) * -0.3f + 12.0f) + 12.0f; + } + item->mPosition.y += f; + item->rotateTowardsCamera(); + mNumFrames++; + return true; +} + +void dAcItem_0xB3C::fn_802579D0() { + fn_80257A80(); + vt_0x10(); +} + +bool dAcItem_0xB3C::fn_80257A10(dAcItem_c *item) { + if (item->getSquareDistToPlayer() < 40000.0f) { + return false; + } + return vt_0x14(item); +} + +void dAcItem_0xB3C::fn_80257A80() { + field_0x04 = vt_0x18(); +} + +void dAcItem_0xB3C::fn_80257AC0() { + if (field_0x04 == 0) { + return; + } + if (!EventManager::isInEvent()) { + field_0x04--; + } +} + +bool dAcItem_0xB3C::fn_80257B10() const { + return field_0x04 == 0; +} + +void dAcItem_0xB3C_1::vt_0x0C(u16 arg) { + // no-op +} + +void dAcItem_0xB3C_1::vt_0x10() { + // no-op +} + +bool dAcItem_0xB3C_1::vt_0x14(dAcItem_c *) { + return false; +} + +UNKWORD dAcItem_0xB3C_1::vt_0x18() { + return 0; +} + +void dAcItem_0xB3C_2::vt_0x0C(u16 arg) { + field_0x20 = arg; +} + +void dAcItem_0xB3C_2::vt_0x10() { + // no-op +} + +bool dAcItem_0xB3C_2::vt_0x14(dAcItem_c *) { + return (this->*mCb2)(); +} + +UNKWORD dAcItem_0xB3C_2::vt_0x18() { + return field_0x20; +} diff --git a/src/d/a/obj/d_a_obj_tbox.cpp b/src/d/a/obj/d_a_obj_tbox.cpp index bcacf40d..7f219bc4 100644 --- a/src/d/a/obj/d_a_obj_tbox.cpp +++ b/src/d/a/obj/d_a_obj_tbox.cpp @@ -1962,7 +1962,7 @@ void dAcTbox_c::initializeState_Open() { if (item != nullptr) { mItemRef.link(item); const char *evName; - if (dAcItem_c::getItemGetEventName(itemId, &evName)) { + if (dAcItem_c::getItemGetTboxEventName(itemId, &evName)) { Event ev(evName, 300, 4, (void *)dAcItem_c::itemGetEventStart, (void *)dAcItem_c::itemGetEventEnd); EventManager::changeOwnEvent(this, item, &ev, 0); } diff --git a/src/toBeSorted/item_mdl_misc.cpp b/src/toBeSorted/item_mdl_misc.cpp index 0d539f48..b9c345cd 100644 --- a/src/toBeSorted/item_mdl_misc.cpp +++ b/src/toBeSorted/item_mdl_misc.cpp @@ -860,7 +860,7 @@ bool dItemMdlTear_c::isMdlForItemId(u16 itemId) { bool dItemMdlTear_c::init(u16 itemId, dAcItem_c *item, mAllocator_c *allocator) { // TODO - why is TRY_CREATE used so inconsistently here? - dAcItem_c::Tear_e tear = dAcItem_c::getTearSubtype((ITEM_ID)itemId); + dAcItem_c::Tear_e tear = dAcItem_c::getTearSubtype(itemId); if (tear == dAcItem_c::TEAR_MAX) { return false; } From e10759e25a682411fac9a12eab44dce162836aa5 Mon Sep 17 00:00:00 2001 From: robojumper Date: Thu, 14 May 2026 15:17:03 +0200 Subject: [PATCH 13/14] Renames --- config/SOUE01/symbols.txt | 52 +++++++++++------------ include/d/a/d_a_item.h | 86 +++++++++++++++++++------------------- src/d/a/d_a_item.cpp | 87 +++++++++++++++++++-------------------- 3 files changed, 112 insertions(+), 113 deletions(-) diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 5cc32b3a..4b9c307a 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -13354,7 +13354,7 @@ __dt__24sFStateFct_c<9dAcItem_c>Fv = .text:0x80248330; // type:function size:0x6 __dt__77sStateMgr_c<9dAcItem_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x802483A0; // type:function size:0xA0 __dt__47sFStateMgr_c<9dAcItem_c,20sStateMethodUsr_FI_c>Fv = .text:0x80248440; // type:function size:0xA4 __dt__9dAcItem_cFv = .text:0x802484F0; // type:function size:0x248 -__dt__13dAcItem_0xB3CFv = .text:0x80248740; // type:function size:0x40 +__dt__18dAcItemResurgeIf_cFv = .text:0x80248740; // type:function size:0x40 __dt__13dAcItem_0xB34Fv = .text:0x80248780; // type:function size:0x40 AcItem__spawnItem = .text:0x802487C0; // type:function size:0x170 spawnItem2 = .text:0x80248930; // type:function size:0xBC @@ -13923,30 +13923,30 @@ isFirstBitParams2NotSet__9dAcItem_cFv = .text:0x80257770; // type:function size: fn_802577A0 = .text:0x802577A0; // type:function size:0x18 fn_802577C0 = .text:0x802577C0; // type:function size:0x8 fn_802577D0 = .text:0x802577D0; // type:function size:0x8 -vt_0x0C__15dAcItem_0xB34_1Fv = .text:0x802577E0; // type:function size:0x4 -vt_0x10__15dAcItem_0xB34_1FP9dAcItem_c = .text:0x802577F0; // type:function size:0x8 -vt_0x0C__15dAcItem_0xB34_2Fv = .text:0x80257800; // type:function size:0x6C -vt_0x10__15dAcItem_0xB34_2FP9dAcItem_c = .text:0x80257870; // type:function size:0x15C -fn_802579D0__13dAcItem_0xB3CFv = .text:0x802579D0; // type:function size:0x40 -fn_80257A10__13dAcItem_0xB3CFP9dAcItem_c = .text:0x80257A10; // type:function size:0x68 -fn_80257A80__13dAcItem_0xB3CFv = .text:0x80257A80; // type:function size:0x3C -fn_80257AC0__13dAcItem_0xB3CFv = .text:0x80257AC0; // type:function size:0x44 -fn_80257B10__13dAcItem_0xB3CCFv = .text:0x80257B10; // type:function size:0x10 -vt_0x0C__15dAcItem_0xB3C_1FUs = .text:0x80257B20; // type:function size:0x4 -vt_0x10__15dAcItem_0xB3C_1Fv = .text:0x80257B30; // type:function size:0x4 -vt_0x14__15dAcItem_0xB3C_1FP9dAcItem_c = .text:0x80257B40; // type:function size:0x8 -vt_0x18__15dAcItem_0xB3C_1Fv = .text:0x80257B50; // type:function size:0x8 +init__26dAcItemPickupPositionOff_cFv = .text:0x802577E0; // type:function size:0x4 +execute__26dAcItemPickupPositionOff_cFP9dAcItem_c = .text:0x802577F0; // type:function size:0x8 +init__25dAcItemPickupPositionOn_cFv = .text:0x80257800; // type:function size:0x6C +execute__25dAcItemPickupPositionOn_cFP9dAcItem_c = .text:0x80257870; // type:function size:0x15C +startResurgeTimer__18dAcItemResurgeIf_cFv = .text:0x802579D0; // type:function size:0x40 +canResurge__18dAcItemResurgeIf_cFP9dAcItem_c = .text:0x80257A10; // type:function size:0x68 +resetTimer__18dAcItemResurgeIf_cFv = .text:0x80257A80; // type:function size:0x3C +execute__18dAcItemResurgeIf_cFv = .text:0x80257AC0; // type:function size:0x44 +isTimerExpired__18dAcItemResurgeIf_cCFv = .text:0x80257B10; // type:function size:0x10 +setTimerInitVal__19dAcItemResurgeOff_cFUs = .text:0x80257B20; // type:function size:0x4 +postReset__19dAcItemResurgeOff_cFv = .text:0x80257B30; // type:function size:0x4 +isResurgeAllowed__19dAcItemResurgeOff_cFP9dAcItem_c = .text:0x80257B40; // type:function size:0x8 +getTimerInitVal__19dAcItemResurgeOff_cFv = .text:0x80257B50; // type:function size:0x8 fn_80257B60 = .text:0x80257B60; // type:function size:0x4 fn_80257B70 = .text:0x80257B70; // type:function size:0x4 fn_80257B80 = .text:0x80257B80; // type:function size:0x8 fn_80257B90 = .text:0x80257B90; // type:function size:0x8 isOutOfTime = .text:0x80257BA0; // type:function size:0x1C -vt_0x0C__15dAcItem_0xB3C_2FUs = .text:0x80257BC0; // type:function size:0x8 -vt_0x10__15dAcItem_0xB3C_2Fv = .text:0x80257BD0; // type:function size:0x4 -vt_0x14__15dAcItem_0xB3C_2FP9dAcItem_c = .text:0x80257BE0; // type:function size:0x28 -vt_0x18__15dAcItem_0xB3C_2Fv = .text:0x80257C10; // type:function size:0x8 -__dt__15dAcItem_0xB3C_2Fv = .text:0x80257C20; // type:function size:0x40 -__dt__15dAcItem_0xB3C_1Fv = .text:0x80257C60; // type:function size:0x40 +setTimerInitVal__18dAcItemResurgeOn_cFUs = .text:0x80257BC0; // type:function size:0x8 +postReset__18dAcItemResurgeOn_cFv = .text:0x80257BD0; // type:function size:0x4 +isResurgeAllowed__18dAcItemResurgeOn_cFP9dAcItem_c = .text:0x80257BE0; // type:function size:0x28 +getTimerInitVal__18dAcItemResurgeOn_cFv = .text:0x80257C10; // type:function size:0x8 +__dt__18dAcItemResurgeOn_cFv = .text:0x80257C20; // type:function size:0x40 +__dt__19dAcItemResurgeOff_cFv = .text:0x80257C60; // type:function size:0x40 __dt__15dAcItem_0xB34_2Fv = .text:0x80257CA0; // type:function size:0x40 __dt__15dAcItem_0xB34_1Fv = .text:0x80257CE0; // type:function size:0x40 build__24sFStateFct_c<9dAcItem_c>FRC12sStateIDIf_c = .text:0x80257D20; // type:function size:0x60 @@ -36272,12 +36272,12 @@ __vt__47sFStateMgr_c<9dAcItem_c,20sStateMethodUsr_FI_c> = .data:0x80533F78; // t __vt__77sStateMgr_c<9dAcItem_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x80533FA8; // type:object size:0x30 __vt__24sFStateFct_c<9dAcItem_c> = .data:0x80533FD8; // type:object size:0x18 __vt__21sFState_c<9dAcItem_c> = .data:0x80533FF0; // type:object size:0x18 -__vt__15dAcItem_0xB3C_2 = .data:0x80534008; // type:object size:0x1C -__vt__15dAcItem_0xB3C_1 = .data:0x80534024; // type:object size:0x1C -__vt__13dAcItem_0xB3C = .data:0x80534040; // type:object size:0x1C -__vt__15dAcItem_0xB34_2 = .data:0x8053405C; // type:object size:0x14 -__vt__15dAcItem_0xB34_1 = .data:0x80534070; // type:object size:0x14 -__vt__13dAcItem_0xB34 = .data:0x80534084; // type:object size:0x14 +__vt__18dAcItemResurgeOn_c = .data:0x80534008; // type:object size:0x1C +__vt__19dAcItemResurgeOff_c = .data:0x80534024; // type:object size:0x1C +__vt__18dAcItemResurgeIf_c = .data:0x80534040; // type:object size:0x1C +__vt__25dAcItemPickupPositionOn_c = .data:0x8053405C; // type:object size:0x14 +__vt__26dAcItemPickupPositionOff_c = .data:0x80534070; // type:object size:0x14 +__vt__25dAcItemPickupPositionIf_c = .data:0x80534084; // type:object size:0x14 __vt__13dAcItemBase_c = .data:0x80534098; // type:object size:0x94 lbl_80534130 = .data:0x80534130; // type:object size:0x32C __vt__23sFStateID_c<9dAcItem_c> = .data:0x8053445C; // type:object size:0x34 diff --git a/include/d/a/d_a_item.h b/include/d/a/d_a_item.h index 8d06e468..ae7bddb5 100644 --- a/include/d/a/d_a_item.h +++ b/include/d/a/d_a_item.h @@ -26,27 +26,27 @@ class dItemMdl_c; class dAcItem_c; /** Positions picked up items for a bit. */ -class dAcItem_0xB34 { +class dAcItemPickupPositionIf_c { public: - virtual ~dAcItem_0xB34() {} - virtual void vt_0x0C() = 0; - virtual bool vt_0x10(dAcItem_c *item) = 0; + virtual ~dAcItemPickupPositionIf_c() {} + virtual void init() = 0; + virtual bool execute(dAcItem_c *item) = 0; }; /** No-op impl that immediately hides the item */ -class dAcItem_0xB34_1 : public dAcItem_0xB34 { +class dAcItemPickupPositionOff_c : public dAcItemPickupPositionIf_c { public: - virtual ~dAcItem_0xB34_1() {} - virtual void vt_0x0C() override; - virtual bool vt_0x10(dAcItem_c *item) override; + virtual ~dAcItemPickupPositionOff_c() {} + virtual void init() override; + virtual bool execute(dAcItem_c *item) override; }; /** Impl that positions picked up items above Link's head */ -class dAcItem_0xB34_2 : public dAcItem_0xB34 { +class dAcItemPickupPositionOn_c : public dAcItemPickupPositionIf_c { public: - virtual ~dAcItem_0xB34_2() {} - virtual void vt_0x0C() override; - virtual bool vt_0x10(dAcItem_c *item) override; + virtual ~dAcItemPickupPositionOn_c() {} + virtual void init() override; + virtual bool execute(dAcItem_c *item) override; private: /* 0x04 */ f32 mHighestRelativeHeadHeight; @@ -54,52 +54,52 @@ private: }; /** Respawns certain items. */ -class dAcItem_0xB3C { +class dAcItemResurgeIf_c { public: - virtual ~dAcItem_0xB3C() {} - virtual void vt_0x0C(u16) = 0; - virtual void vt_0x10() = 0; - virtual bool vt_0x14(dAcItem_c *) = 0; - virtual UNKWORD vt_0x18() = 0; + virtual ~dAcItemResurgeIf_c() {} + virtual void setTimerInitVal(u16) = 0; + virtual void postReset() = 0; + virtual bool isResurgeAllowed(dAcItem_c *) = 0; + virtual s32 getTimerInitVal() = 0; - void fn_802579D0(); - bool fn_80257A10(dAcItem_c *); - void fn_80257A80(); - void fn_80257AC0(); - bool fn_80257B10() const; + void startResurgeTimer(); + bool canResurge(dAcItem_c *); + void resetTimer(); + void execute(); + bool isTimerExpired() const; protected: - /* 0x04 */ UNKWORD field_0x04; + /* 0x04 */ s32 mTimer; }; /** No-op impl that doesn't respawn items */ -class dAcItem_0xB3C_1 : public dAcItem_0xB3C { +class dAcItemResurgeOff_c : public dAcItemResurgeIf_c { public: - dAcItem_0xB3C_1(u16, u16) {} - virtual ~dAcItem_0xB3C_1() {} - virtual void vt_0x0C(u16) override; - virtual void vt_0x10() override; - virtual bool vt_0x14(dAcItem_c *) override; - virtual UNKWORD vt_0x18() override; + dAcItemResurgeOff_c(u16, u16) {} + virtual ~dAcItemResurgeOff_c() {} + virtual void setTimerInitVal(u16) override; + virtual void postReset() override; + virtual bool isResurgeAllowed(dAcItem_c *) override; + virtual s32 getTimerInitVal() override; }; /** Impl that respawns items */ -class dAcItem_0xB3C_2 : public dAcItem_0xB3C { +class dAcItemResurgeOn_c : public dAcItemResurgeIf_c { public: - dAcItem_0xB3C_2(u16 a1, u16 a2) { + dAcItemResurgeOn_c(u16 a1, u16 a2) { mCb1 = sCb1s[a1]; mCb2 = sCb2s[a2]; } - virtual ~dAcItem_0xB3C_2() {} - virtual void vt_0x0C(u16) override; - virtual void vt_0x10() override; - virtual bool vt_0x14(dAcItem_c *) override; - virtual UNKWORD vt_0x18() override; + virtual ~dAcItemResurgeOn_c() {} + virtual void setTimerInitVal(u16) override; + virtual void postReset() override; + virtual bool isResurgeAllowed(dAcItem_c *) override; + virtual s32 getTimerInitVal() override; public: - typedef void (dAcItem_0xB3C_2::*Callback1)(); + typedef void (dAcItemResurgeOn_c::*Callback1)(); // May or may not take a dAcItem_c* argument... - typedef bool (dAcItem_0xB3C_2::*Callback2)(); + typedef bool (dAcItemResurgeOn_c::*Callback2)(); static Callback1 sCb1s[2]; static Callback2 sCb2s[3]; @@ -113,7 +113,7 @@ public: /* 0x08 */ Callback1 mCb1; /* 0x14 */ Callback2 mCb2; - /* 0x20 */ UNKWORD field_0x20; + /* 0x20 */ s32 mInitVal; }; class dAcItem_c : public dAcItemBase_c { @@ -743,8 +743,8 @@ private: /* 0xAB8 */ fLiNdBa_c mNode; /* 0xAC4 */ ActorEventRelated mEventRelated; /* 0xB14 */ DowsingTarget mDowsingTarget; - /* 0xB34 */ dAcItem_0xB34 *field_0xB34[2]; - /* 0xB34 */ dAcItem_0xB3C *field_0xB3C; + /* 0xB34 */ dAcItemPickupPositionIf_c *mpPickupPositionCtl[2]; + /* 0xB34 */ dAcItemResurgeIf_c *mpResurgeCtl; /* 0xB40 */ void (dAcItem_c::*mFnAction)(); /* 0xB4C */ void (dAcItem_c::*mFnBounce)(); /* 0xB58 */ void (dAcItem_c::*mFunc_0xB58)(); diff --git a/src/d/a/d_a_item.cpp b/src/d/a/d_a_item.cpp index f467afc7..47cfabc2 100644 --- a/src/d/a/d_a_item.cpp +++ b/src/d/a/d_a_item.cpp @@ -505,9 +505,9 @@ dAcItem_c::dAcItem_c() } dAcItem_c::~dAcItem_c() { - delete field_0xB3C; + delete mpResurgeCtl; for (int i = 0; i < 2; i++) { - delete field_0xB34[i]; + delete mpPickupPositionCtl[i]; } delete mpMdl; mDowsingTarget.doUnregister(); @@ -563,28 +563,27 @@ bool dAcItem_c::createHeap() { return false; } - field_0xB34[0] = new dAcItem_0xB34_1(); - if (field_0xB34[0] == nullptr) { + mpPickupPositionCtl[0] = new dAcItemPickupPositionOn_c(); + if (mpPickupPositionCtl[0] == nullptr) { return false; } - field_0xB34[1] = new dAcItem_0xB34_2(); - if (field_0xB34[1] == nullptr) { + mpPickupPositionCtl[1] = new dAcItemPickupPositionOff_c(); + if (mpPickupPositionCtl[1] == nullptr) { return false; } if (getItemInitStruct()->_0x00[6] != 0) { - field_0xB3C = new dAcItem_0xB3C_2(getItemInitStruct()->_0x00[4], getItemInitStruct()->_0x00[5]); + mpResurgeCtl = new dAcItemResurgeOn_c(getItemInitStruct()->_0x00[4], getItemInitStruct()->_0x00[5]); if (mId == ITEM_STAMINA_FRUIT) { - // TODO ... - field_0xB3C->vt_0x0C(150 /* 0x96 */); + mpResurgeCtl->setTimerInitVal(150); } else if (isLightFruit()) { - field_0xB3C->vt_0x0C(0 /* 0x0 */); + mpResurgeCtl->setTimerInitVal(0); } } else { - field_0xB3C = new dAcItem_0xB3C_1(getItemInitStruct()->_0x00[4], getItemInitStruct()->_0x00[5]); + mpResurgeCtl = new dAcItemResurgeOff_c(getItemInitStruct()->_0x00[4], getItemInitStruct()->_0x00[5]); } - if (field_0xB3C == nullptr) { + if (mpResurgeCtl == nullptr) { return false; } @@ -2109,7 +2108,7 @@ void dAcItem_c::initializeState_ResurgeWait() { // TODO FPR swap mPosition = mPositionCopy; mRotation = mRotationCopy; - field_0xB3C->fn_802579D0(); + mpResurgeCtl->startResurgeTimer(); setNotWaiting(); // TODO ??? mbNoGravity = mbNoDespawn; @@ -2119,10 +2118,10 @@ void dAcItem_c::initializeState_ResurgeWait() { } void dAcItem_c::executeState_ResurgeWait() { - if (field_0xB3C->fn_80257A10(this)) { - if (!field_0xB3C->fn_80257B10()) { - field_0xB3C->fn_80257AC0(); - if (field_0xB3C->fn_80257B10()) { + if (mpResurgeCtl->canResurge(this)) { + if (!mpResurgeCtl->isTimerExpired()) { + mpResurgeCtl->execute(); + if (mpResurgeCtl->isTimerExpired()) { if (mId == ITEM_STAMINA_FRUIT) { startSound(SE_O_REFRESH_FRUIT_SPROUT); } @@ -2130,7 +2129,7 @@ void dAcItem_c::executeState_ResurgeWait() { } } } else { - field_0xB3C->fn_80257A80(); + mpResurgeCtl->resetTimer(); } } @@ -2594,15 +2593,15 @@ void dAcItem_c::rotateFixedBirdStatuette() { mRotation.z.mVal = 0; } -void dAcItem_0xB34_1::vt_0x0C() { +void dAcItemPickupPositionOff_c::init() { // no-op } -bool dAcItem_0xB34_1::vt_0x10(dAcItem_c *item) { +bool dAcItemPickupPositionOff_c::execute(dAcItem_c *item) { return false; } -void dAcItem_0xB34_2::vt_0x0C() { +void dAcItemPickupPositionOn_c::init() { // TODO weird double load dAcPy_c *link = dAcPy_c::GetLinkM(); if (link != nullptr) { @@ -2611,7 +2610,7 @@ void dAcItem_0xB34_2::vt_0x0C() { mNumFrames = 0; } -bool dAcItem_0xB34_2::vt_0x10(dAcItem_c *item) { +bool dAcItemPickupPositionOn_c::execute(dAcItem_c *item) { if (mNumFrames >= 22) { return false; } @@ -2641,63 +2640,63 @@ bool dAcItem_0xB34_2::vt_0x10(dAcItem_c *item) { return true; } -void dAcItem_0xB3C::fn_802579D0() { - fn_80257A80(); - vt_0x10(); +void dAcItemResurgeIf_c::startResurgeTimer() { + resetTimer(); + postReset(); } -bool dAcItem_0xB3C::fn_80257A10(dAcItem_c *item) { +bool dAcItemResurgeIf_c::canResurge(dAcItem_c *item) { if (item->getSquareDistToPlayer() < 40000.0f) { return false; } - return vt_0x14(item); + return isResurgeAllowed(item); } -void dAcItem_0xB3C::fn_80257A80() { - field_0x04 = vt_0x18(); +void dAcItemResurgeIf_c::resetTimer() { + mTimer = getTimerInitVal(); } -void dAcItem_0xB3C::fn_80257AC0() { - if (field_0x04 == 0) { +void dAcItemResurgeIf_c::execute() { + if (mTimer == 0) { return; } if (!EventManager::isInEvent()) { - field_0x04--; + mTimer--; } } -bool dAcItem_0xB3C::fn_80257B10() const { - return field_0x04 == 0; +bool dAcItemResurgeIf_c::isTimerExpired() const { + return mTimer == 0; } -void dAcItem_0xB3C_1::vt_0x0C(u16 arg) { +void dAcItemResurgeOff_c::setTimerInitVal(u16 arg) { // no-op } -void dAcItem_0xB3C_1::vt_0x10() { +void dAcItemResurgeOff_c::postReset() { // no-op } -bool dAcItem_0xB3C_1::vt_0x14(dAcItem_c *) { +bool dAcItemResurgeOff_c::isResurgeAllowed(dAcItem_c *) { return false; } -UNKWORD dAcItem_0xB3C_1::vt_0x18() { +s32 dAcItemResurgeOff_c::getTimerInitVal() { return 0; } -void dAcItem_0xB3C_2::vt_0x0C(u16 arg) { - field_0x20 = arg; +void dAcItemResurgeOn_c::setTimerInitVal(u16 arg) { + mInitVal = arg; } -void dAcItem_0xB3C_2::vt_0x10() { +void dAcItemResurgeOn_c::postReset() { // no-op } -bool dAcItem_0xB3C_2::vt_0x14(dAcItem_c *) { +bool dAcItemResurgeOn_c::isResurgeAllowed(dAcItem_c *) { return (this->*mCb2)(); } -UNKWORD dAcItem_0xB3C_2::vt_0x18() { - return field_0x20; +s32 dAcItemResurgeOn_c::getTimerInitVal() { + return mInitVal; } From 174f848c281a6bdc77531b6b0a7a59f1bd99565e Mon Sep 17 00:00:00 2001 From: robojumper Date: Sun, 24 May 2026 23:00:19 +0200 Subject: [PATCH 14/14] Consistency fix --- include/d/a/d_a_item.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/d/a/d_a_item.h b/include/d/a/d_a_item.h index ae7bddb5..42abaa95 100644 --- a/include/d/a/d_a_item.h +++ b/include/d/a/d_a_item.h @@ -776,7 +776,7 @@ private: /* 0xC90 */ f32 (dAcItem_c::*mFn_0xC90)(); /* 0xC9C */ void (dAcItem_c::*mFn_0xC9C)(); /* 0xCA8 */ void (dAcItem_c::*mFnSetBoundingBox)(); - /* 0xCB4 */ f32 (dAcItem_c::*mFnGetSinkSpeed)(void); + /* 0xCB4 */ f32 (dAcItem_c::*mFnGetSinkSpeed)(); /* 0xCC0 */ dAcRef_c mItemQueuePrev; /* 0xCCC */ dAcRef_c mItemQueueNext; /* 0xCD8 */ f32 field_0xCD8;