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); +}