From 7cc42a95266e9994610eea0dc56128c390035f00 Mon Sep 17 00:00:00 2001 From: Aetias Date: Sun, 14 Apr 2024 14:19:59 +0200 Subject: [PATCH] Decomp `ItemManager::LoadFanfareItem` --- asm/ov00/Item/ItemManager.s | 208 +------------------------------ asm/ov05.inc | 2 +- asm/ov05.s | 4 +- asm/ov14/ov14_0213b778.inc | 2 +- asm/ov14/ov14_0213b778.s | 2 +- asm/ov15.inc | 2 +- asm/ov15.s | 4 +- include/Item/ItemManager.hpp | 4 + src/00_Core/Item/ItemManager.cpp | 63 ++++++++++ 9 files changed, 81 insertions(+), 210 deletions(-) diff --git a/asm/ov00/Item/ItemManager.s b/asm/ov00/Item/ItemManager.s index e3e15022..5c7cd03e 100644 --- a/asm/ov00/Item/ItemManager.s +++ b/asm/ov00/Item/ItemManager.s @@ -3,202 +3,6 @@ .text - .global _ZN11ItemManager15LoadFanfareItemEj - thumb_func_start _ZN11ItemManager15LoadFanfareItemEj -_ZN11ItemManager15LoadFanfareItemEj: ; 0x020adb30 - push {r4, r5, lr} - sub sp, #0x10c - add r5, r0, #0 - mov r0, #0x46 - lsl r0, r0, #2 - str r1, [r5, r0] - cmp r1, #0x2b - beq _020adb54 - cmp r1, #0x25 - beq _020adb54 - cmp r1, #0x79 - blt _020adb4c - cmp r1, #0x7c - ble _020adb54 -_020adb4c: - cmp r1, #0x7e - beq _020adb54 - cmp r1, #0x85 - bne _020adb5c -_020adb54: - ldr r0, _020adc8c ; =data_027e1058 - ldr r0, [r0] - ldr r1, [r0] - b _020adc7c -_020adb5c: - cmp r1, #0x30 - blt _020adb76 - cmp r1, #0x37 - bgt _020adb76 - ldr r0, _020adc90 ; =data_027e105c - sub r1, #0x30 - ldr r0, [r0] - mov r2, #1 - mov r3, #0 - bl LoadTreasureItemFanfare - add r1, r0, #0 - b _020adc7c -_020adb76: - cmp r1, #0x7d - bne _020adb82 - ldr r0, _020adc90 ; =data_027e105c - ldr r0, [r0] - ldr r1, [r0] - b _020adc7c -_020adb82: - add r3, sp, #0x8c - mov r2, #0x80 - mov r0, #0 -_020adb88: - strb r0, [r3] - add r3, r3, #1 - sub r2, r2, #1 - bne _020adb88 - add r3, sp, #0xc - mov r2, #0x80 - mov r0, #0 -_020adb96: - strb r0, [r3] - add r3, r3, #1 - sub r2, r2, #1 - bne _020adb96 - mov r4, #0 - cmp r1, #0x28 - bne _020adbb4 - add r0, r5, #0 - add r0, #0xb4 - ldrh r0, [r0] - cmp r0, #1 - blt _020adbb4 - ldr r0, _020adc94 ; =data_ov00_020e5df8 - ldr r4, [r0, #4] - b _020adc22 -_020adbb4: - cmp r1, #0x29 - bne _020adbc8 - add r0, r5, #0 - add r0, #0xb6 - ldrh r0, [r0] - cmp r0, #1 - blt _020adbc8 - ldr r0, _020adc94 ; =data_ov00_020e5df8 - ldr r4, [r0, #8] - b _020adc22 -_020adbc8: - cmp r1, #0x2a - bne _020adbdc - add r0, r5, #0 - add r0, #0xb8 - ldrh r0, [r0] - cmp r0, #1 - blt _020adbdc - ldr r0, _020adc94 ; =data_ov00_020e5df8 - ldr r4, [r0, #0xc] - b _020adc22 -_020adbdc: - cmp r1, #0x3e - bne _020adbe6 - ldr r0, _020adc98 ; =data_ov00_020e5c78 - ldr r4, [r0, #0x2c] - b _020adc22 -_020adbe6: - cmp r1, #0x46 - bge _020adbf2 - ldr r0, _020adc9c ; =data_ov00_020e5c9c - lsl r1, r1, #2 - ldr r4, [r0, r1] - b _020adc22 -_020adbf2: - cmp r1, #0x71 - blt _020adc04 - cmp r1, #0x79 - bge _020adc04 - sub r1, #0x71 - ldr r0, _020adca0 ; =data_ov00_020e5db4 - lsl r1, r1, #2 - ldr r4, [r0, r1] - b _020adc22 -_020adc04: - cmp r1, #0x7f - blt _020adc16 - cmp r1, #0x88 - bge _020adc16 - sub r1, #0x7f - ldr r0, _020adca4 ; =data_ov00_020e5dd4 - lsl r1, r1, #2 - ldr r4, [r0, r1] - b _020adc22 -_020adc16: - cmp r1, #0x4b - blt _020adc22 - cmp r1, #0x6a - bgt _020adc22 - ldr r0, _020adc94 ; =data_ov00_020e5df8 - ldr r4, [r0] -_020adc22: - cmp r4, #0 - bne _020adc2a - ldr r0, _020adc98 ; =data_ov00_020e5c78 - ldr r4, [r0, #0x20] -_020adc2a: - ldr r1, _020adc94 ; =data_ov00_020e5df8 - add r0, sp, #0x8c - ldr r1, [r1, #0x10] - blx strcat - add r0, sp, #0x8c - add r1, r4, #0 - blx strcat - ldr r1, _020adc94 ; =data_ov00_020e5df8 - add r0, sp, #0x8c - ldr r1, [r1, #0x14] - blx strcat - ldr r1, _020adc94 ; =data_ov00_020e5df8 - add r0, sp, #0xc - ldr r1, [r1, #0x10] - blx strcat - add r0, sp, #0xc - add r1, r4, #0 - blx strcat - ldr r1, _020adc94 ; =data_ov00_020e5df8 - add r0, sp, #0xc - ldr r1, [r1, #0x18] - blx strcat - mov r3, #0 - str r3, [sp] - str r3, [sp, #4] - mov r0, #1 - str r0, [sp, #8] - mov r0, #0x12 - lsl r0, r0, #4 - ldr r0, [r5, r0] - add r1, sp, #0x8c - add r2, sp, #0xc - bl func_ov00_02079ffc - add r1, r0, #0 -_020adc7c: - mov r0, #0x45 - lsl r0, r0, #2 - ldr r0, [r5, r0] - ldr r2, [r0] - ldr r2, [r2, #0xc] - blx r2 - add sp, #0x10c - pop {r4, r5, pc} - .align 2, 0 - thumb_func_end _ZN11ItemManager15LoadFanfareItemEj -_020adc8c: .word data_027e1058 -_020adc90: .word data_027e105c -_020adc94: .word data_ov00_020e5df8 -_020adc98: .word data_ov00_020e5c78 -_020adc9c: .word data_ov00_020e5c9c -_020adca0: .word data_ov00_020e5db4 -_020adca4: .word data_ov00_020e5dd4 - .global _ZNK11ItemManager19GetFanfareItemScaleEP5Vec3p thumb_func_start _ZNK11ItemManager19GetFanfareItemScaleEP5Vec3p _ZNK11ItemManager19GetFanfareItemScaleEP5Vec3p: ; 0x020adca8 @@ -1717,8 +1521,8 @@ data_ov00_020e5c70: ; 0x020e5c70 data_ov00_020e5c74: ; 0x020e5c74 .ascii "anc" .byte 0x00 - .global data_ov00_020e5c78 -data_ov00_020e5c78: ; 0x020e5c78 + .global sUnknownItemModelNames +sUnknownItemModelNames: ; 0x020e5c78 .word data_ov00_020e5c74 .global data_ov00_020e5c7c data_ov00_020e5c7c: ; 0x020e5c7c @@ -1744,8 +1548,8 @@ data_ov00_020e5c94: ; 0x020e5c94 .global data_ov00_020e5c98 data_ov00_020e5c98: ; 0x020e5c98 .word data_ov00_020e5e14 - .global data_ov00_020e5c9c -data_ov00_020e5c9c: ; 0x020e5c9c + .global sItemModelNames +sItemModelNames: ; 0x020e5c9c .word data_ov00_020e5e18 .global data_ov00_020e5ca0 data_ov00_020e5ca0: ; 0x020e5ca0 @@ -2005,8 +1809,8 @@ data_ov00_020e5df0: ; 0x020e5df0 .global data_ov00_020e5df4 data_ov00_020e5df4: ; 0x020e5df4 .byte 0x00, 0x00, 0x00, 0x00 - .global data_ov00_020e5df8 -data_ov00_020e5df8: ; 0x020e5df8 + .global sSpecialItemModelNames +sSpecialItemModelNames: ; 0x020e5df8 .word data_ov00_020e6030 .global data_ov00_020e5dfc data_ov00_020e5dfc: ; 0x020e5dfc diff --git a/asm/ov05.inc b/asm/ov05.inc index c361214b..e7f377dc 100644 --- a/asm/ov05.inc +++ b/asm/ov05.inc @@ -2,7 +2,7 @@ .extern Divide .extern _ZN10PlayerBase18func_ov00_020a7c00Ei .extern _ZN11ItemManager12GetItemModelEj -.extern _ZN11ItemManager15LoadFanfareItemEj +.extern _ZN11ItemManager15LoadFanfareItemEi .extern _ZN11ItemManager18func_ov00_020ae648Ejjj .extern _ZN11ItemManager8GiveItemEjjj .extern _ZN13LinkStateBase10GetStateIdEv diff --git a/asm/ov05.s b/asm/ov05.s index ed87b038..1d63faa5 100644 --- a/asm/ov05.s +++ b/asm/ov05.s @@ -9726,7 +9726,7 @@ _02108c34: ldr r0, _02108cf0 ; =gItemManager ldr r1, [r4, #0x74] ldr r0, [r0] - blx _ZN11ItemManager15LoadFanfareItemEj + blx _ZN11ItemManager15LoadFanfareItemEi ldr r0, [r4, #0x74] mov r2, #1 cmp r0, #0x81 @@ -9884,7 +9884,7 @@ _02108e44: ldr r0, _02108e88 ; =gItemManager mov r1, r4 ldr r0, [r0] - blx _ZN11ItemManager15LoadFanfareItemEj + blx _ZN11ItemManager15LoadFanfareItemEi ldmia sp!, {r3, r4, r5, pc} .align 2, 0 arm_func_end func_ov05_02108e08 diff --git a/asm/ov14/ov14_0213b778.inc b/asm/ov14/ov14_0213b778.inc index a3e8d9a2..64a80265 100644 --- a/asm/ov14/ov14_0213b778.inc +++ b/asm/ov14/ov14_0213b778.inc @@ -7,7 +7,7 @@ .extern _ZN11ItemManager12GetEquipItemEi .extern _ZN11ItemManager12GetItemModelEj .extern _ZN11ItemManager13TickEquipItemEv -.extern _ZN11ItemManager15LoadFanfareItemEj +.extern _ZN11ItemManager15LoadFanfareItemEi .extern _ZN11ItemManager15SetEquippedItemEi .extern _ZN11ItemManager17EquipPreviousItemEv .extern _ZN11ItemManager18EquipItem_vfunc_38Ei diff --git a/asm/ov14/ov14_0213b778.s b/asm/ov14/ov14_0213b778.s index da491079..32105660 100644 --- a/asm/ov14/ov14_0213b778.s +++ b/asm/ov14/ov14_0213b778.s @@ -26983,7 +26983,7 @@ _0215074c: ldr r0, _02150764 ; =gItemManager add r1, r4, #0 ldr r0, [r0] - bl _ZN11ItemManager15LoadFanfareItemEj + bl _ZN11ItemManager15LoadFanfareItemEi add r0, r5, #0 mov r1, #0 bl func_ov14_02150848 diff --git a/asm/ov15.inc b/asm/ov15.inc index da3958ec..5930030c 100644 --- a/asm/ov15.inc +++ b/asm/ov15.inc @@ -11,7 +11,7 @@ .extern _ZN10PlayerBase9AddHealthEs .extern _ZN11ItemManager10GiveRupeesEjj .extern _ZN11ItemManager10SetUnk_09eEjt -.extern _ZN11ItemManager15LoadFanfareItemEj +.extern _ZN11ItemManager15LoadFanfareItemEi .extern _ZN11ItemManager18func_ov00_020ad528Ev .extern _ZN11ItemManager18func_ov00_020ae648Ejjj .extern _ZN11ItemManager19SetTreasureSalvagedEj diff --git a/asm/ov15.s b/asm/ov15.s index 9acb5ed9..d0c984e5 100644 --- a/asm/ov15.s +++ b/asm/ov15.s @@ -44543,7 +44543,7 @@ _02145334: ldr r0, _0214581c ; =gItemManager mov r1, r5 ldr r0, [r0] - blx _ZN11ItemManager15LoadFanfareItemEj + blx _ZN11ItemManager15LoadFanfareItemEi mov r0, r6 mov r1, #1 bl func_ov15_0216e168 @@ -88262,7 +88262,7 @@ _0216a93c: ldr r0, _0216a95c ; =gItemManager mov r1, r4 ldr r0, [r0] - blx _ZN11ItemManager15LoadFanfareItemEj + blx _ZN11ItemManager15LoadFanfareItemEi mov r0, r5 bl func_ov15_0216a968 add sp, sp, #4 diff --git a/include/Item/ItemManager.hpp b/include/Item/ItemManager.hpp index 44defa6f..06009148 100644 --- a/include/Item/ItemManager.hpp +++ b/include/Item/ItemManager.hpp @@ -1,5 +1,9 @@ #pragma once +extern "C" { + #include +} + #include "global.h" #include "types.h" #include "lib/math.h" diff --git a/src/00_Core/Item/ItemManager.cpp b/src/00_Core/Item/ItemManager.cpp index 614f9a50..5cf6d02b 100644 --- a/src/00_Core/Item/ItemManager.cpp +++ b/src/00_Core/Item/ItemManager.cpp @@ -380,3 +380,66 @@ THUMB void ItemManager::RemoveItem(ItemFlag item) { (*mAmmo)[item] = 0; } } + +extern ItemModel **data_027e1058; +extern ItemModel **data_027e105c; +extern "C" ItemModel* func_ov00_02079ffc(void*, const char *modelName, const char *textureName, unk32 param4, unk8 param5, unk8 param6, bool param7); +extern "C" ItemModel* LoadTreasureItemFanfare(ItemModel**, s32 treasureType, bool, bool); +extern const char *sUnknownItemModelNames[]; +extern const char *data_ov00_020e5dd4[]; +extern const char *data_ov00_020e5db4[]; +extern const char *sItemModelNames[]; +extern const char *sSpecialItemModelNames[]; +THUMB void ItemManager::LoadFanfareItem(ItemId id) { + mFanfareItem = id; + + ItemModel *model; + if ( + id == ItemId_Unk_43 || + id == ItemId_Cannon || + (id >= ItemId_GOLDEN_SHIP_START && id <= ItemId_GOLDEN_SHIP_END) || + id == ItemId_Unk_126 || + id == ItemId_Unk_133 + ) { + model = *data_027e1058; + } else if ( + id >= ItemId_TREASURE_START && + id <= ItemId_TREASURE_END + ) { + model = LoadTreasureItemFanfare(data_027e105c, id - ItemId_TREASURE_START, true, false); + } else if (id == ItemId_Unk_125) { + model = *data_027e105c; + } else { + char modelName[0x80] = {}; + char textureName[0x80] = {}; + const char *itemName = NULL; + if (id == ItemId_Quiver && (s32) mQuiverSize >= 1) { + itemName = sSpecialItemModelNames[1]; + } else if (id == ItemId_BigBombBag && (s32) mBombBagSize >= 1) { + itemName = sSpecialItemModelNames[2]; + } else if (id == ItemId_BigBombchuBag && (s32) mBombchuBagSize >= 1) { + itemName = sSpecialItemModelNames[3]; + } else if (id == ItemId_HerosNewClothes) { + itemName = sUnknownItemModelNames[11]; + } else if (id < ItemId_Unk_70) { + itemName = sItemModelNames[id]; + } else if (id >= ItemId_SwordsmanScroll && id < ItemId_GoldenChimney) { + itemName = data_ov00_020e5db4[id - ItemId_SwordsmanScroll]; + } else if (id >= ItemId_CycloneSlate && id < ItemId_Unk_136) { + itemName = data_ov00_020e5dd4[id - ItemId_CycloneSlate]; + } else if (id >= ItemId_TREASURE_CHART_START && id <= ItemId_TREASURE_CHART_END) { + itemName = sSpecialItemModelNames[0]; + } + if (!itemName) { + itemName = sUnknownItemModelNames[8]; + } + strcat(modelName, sSpecialItemModelNames[4]); + strcat(modelName, itemName); + strcat(modelName, sSpecialItemModelNames[5]); + strcat(textureName, sSpecialItemModelNames[4]); + strcat(textureName, itemName); + strcat(textureName, sSpecialItemModelNames[6]); + model = func_ov00_02079ffc(mFanfareItemModel, modelName, textureName, 0, 0, 0, true); + } + mUnk_114->vfunc_0c(model); +}