summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorrobojumper <robojumper@gmail.com>2026-05-24 23:08:30 +0200
committerGitHub <noreply@github.com>2026-05-24 23:08:30 +0200
commit483ac7b934e4e3443366640320ae9b1ade65fe90 (patch)
tree2015b1c591f4c006241dd44ef272c9987e48b233 /src
parent388abef134a6c7156f1309d6453ac2eb260642e1 (diff)
parent174f848c281a6bdc77531b6b0a7a59f1bd99565e (diff)
Merge pull request #311 from robojumper/item_mdl
some item model stuff
Diffstat (limited to 'src')
-rw-r--r--src/REL/d/a/b/d_a_b_lastboss.cpp2
-rw-r--r--src/REL/d/a/e/d_a_e_remly.cpp2
-rw-r--r--src/REL/d/a/obj/d_a_obj_barrel.cpp6
-rw-r--r--src/REL/d/a/obj/d_a_obj_bird_sp.cpp2
-rw-r--r--src/REL/d/a/obj/d_a_obj_chair.cpp2
-rw-r--r--src/REL/d/a/obj/d_a_obj_dungeon_ship.cpp2
-rw-r--r--src/REL/d/a/obj/d_a_obj_flying_clawshot_target.cpp2
-rw-r--r--src/REL/d/a/obj/d_a_obj_grave.cpp2
-rw-r--r--src/REL/d/a/obj/d_a_obj_pinwheel.cpp2
-rw-r--r--src/REL/d/a/obj/d_a_obj_rope_igaiga.cpp2
-rw-r--r--src/REL/d/a/obj/d_a_obj_spike.cpp2
-rw-r--r--src/REL/d/a/obj/d_a_obj_toD3_stone_figure.cpp2
-rw-r--r--src/REL/d/a/obj/d_a_obj_triforce.cpp2
-rw-r--r--src/REL/d/a/obj/d_a_obj_tubo.cpp2
-rw-r--r--src/REL/d/a/obj/d_a_obj_tumble_weed.cpp4
-rw-r--r--src/REL/d/a/obj/d_a_obj_warp_hole.cpp2
-rw-r--r--src/d/a/d_a_base.cpp8
-rw-r--r--src/d/a/d_a_item.cpp2381
-rw-r--r--src/d/a/obj/d_a_obj_arrow.cpp2
-rw-r--r--src/d/a/obj/d_a_obj_tbox.cpp8
-rw-r--r--src/d/col/bg/d_bg_s_roof_chk.cpp1
-rw-r--r--src/d/d_message.cpp2
-rw-r--r--src/toBeSorted/item_mdl_item.cpp482
-rw-r--r--src/toBeSorted/item_mdl_light_fruit.cpp117
-rw-r--r--src/toBeSorted/item_mdl_misc.cpp1336
-rw-r--r--src/toBeSorted/item_mdl_name.cpp528
-rw-r--r--src/toBeSorted/item_mdl_rupee.cpp158
-rw-r--r--src/toBeSorted/item_mdl_stamina_fruit.cpp109
-rw-r--r--src/toBeSorted/mdl_base.cpp4
29 files changed, 5096 insertions, 78 deletions
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 1955a3dd..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,
@@ -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_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 bbe61c61..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},
@@ -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/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_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..47cfabc2 100644
--- a/src/d/a/d_a_item.cpp
+++ b/src/d/a/d_a_item.cpp
@@ -1,12 +1,41 @@
#include "d/a/d_a_item.h"
+#include "c/c_math.h"
#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/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"
+#include "d/d_pouch.h"
+#include "d/d_sc_game.h"
#include "d/flag/dungeonflag_manager.h"
-#include "d/flag/flag_index.h"
-#include "f/f_list_mg.h"
-#include "toBeSorted/dowsing_target.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 "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"
+#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] = {
@@ -219,6 +248,25 @@ 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_GLITTERING_SPORES | AT_TYPE_0x8000 | AT_TYPE_WIND), 0x111, {0, 0x08, 0x407}, 0, 0},
+ {0xE9}},
+ {40.0f, 60.0f}
+};
+
bool dAcItemBase_c::isValidItemTypeIdx(int itemId) {
return itemId < ARRAY_LENGTH(sItemTypeFlags);
}
@@ -279,7 +327,35 @@ bool dAcItemBase_c::setDungeonFlagForTear(int tearNum) {
return true;
}
-u16 dAcItemBase_c::getItemId() {
+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) {
+ (*value)++;
+ return true;
+ }
+ return false;
+}
+
+u16 dAcItemBase_c::getItemId() const {
return mId;
}
@@ -302,22 +378,89 @@ u16 getIndex(u16 itemId) {
// }
// }
-fLiMgBa_c dAcItem_c::sItemList;
+static const char *const sResNodeName = "Set";
+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);
+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 {
+ dAcItem_c::Tear_e idx;
+ u16 itemId;
+ mColor color1;
+ mColor color2;
+};
+
+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 {
+ 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)},
+};
+
+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);
-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 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,
+};
+
+fLiMgBa_c dAcItem_c::sItemList;
+dAcRef_c<dAcObjBase_c> dAcItem_c::sItemListHead;
+dAcRef_c<dAcObjBase_c> dAcItem_c::sItemListTail;
+fLiMgBa_c dAcItem_c::sUnusedList;
dAcItem_c::dAcItem_c()
: mStateMgr(*this),
@@ -360,58 +503,2200 @@ dAcItem_c::dAcItem_c()
sItemList.append(&mNode);
mTargetFiRelated = 3;
}
+
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();
}
-void dAcItem_c::initializeState_Wait() {}
-void dAcItem_c::executeState_Wait() {}
-void dAcItem_c::finalizeState_Wait() {}
+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();
+ } 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;
+ }
+
+ mpPickupPositionCtl[0] = new dAcItemPickupPositionOn_c();
+ if (mpPickupPositionCtl[0] == nullptr) {
+ return false;
+ }
+ mpPickupPositionCtl[1] = new dAcItemPickupPositionOff_c();
+ if (mpPickupPositionCtl[1] == nullptr) {
+ return false;
+ }
+
+ if (getItemInitStruct()->_0x00[6] != 0) {
+ mpResurgeCtl = new dAcItemResurgeOn_c(getItemInitStruct()->_0x00[4], getItemInitStruct()->_0x00[5]);
+ if (mId == ITEM_STAMINA_FRUIT) {
+ mpResurgeCtl->setTimerInitVal(150);
+ } else if (isLightFruit()) {
+ mpResurgeCtl->setTimerInitVal(0);
+ }
+ } else {
+ mpResurgeCtl = new dAcItemResurgeOff_c(getItemInitStruct()->_0x00[4], getItemInitStruct()->_0x00[5]);
+ }
+
+ if (mpResurgeCtl == nullptr) {
+ return false;
+ }
+
+ return true;
+}
+
+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 (isHeartV()) {
+ mFunc_0xB58 = &dAcItem_c::fn_802555F0;
+ } else {
+ mFunc_0xB58 = &dAcItem_c::fn_802555D0;
+ }
+
+ if (isAnyRupee()) {
+ mFnBounce = &dAcItem_c::bounceRupee;
+ } else if (isHeartV()) {
+ 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() && !isHeartV() && mId != ITEM_STAMINA_FRUIT) {
+ mCyl.SetTg_0x4C(0x6480);
+ }
+
+ if (isBabyRattle()) {
+ mCyl.SetTgInfo_0x1(0x13);
+ } else if (isHeartPiece()) {
+ mCyl.SetTgInfo_0x1(0x15);
+ } else if (!isAnyRupee() && !isHeartV() && 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();
+ }
+
+ 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 (isHeartV()) {
+ mFnGetSinkSpeed = &dAcItem_c::getSinkSpeedHeart;
+ } else {
+ mFnGetSinkSpeed = &dAcItem_c::getSinkSpeedDefault;
+ }
+
+ if (mbNoDespawn) {
+ dBgS::GetInstance()->SetLightingCode(this, 10.0f);
+ } else if (isHeartV()) {
+ mLinkage.bushTpFunc(mObjAcch);
+ }
+
+ if (isHeartV()) {
+ field_0xD20 = 6;
+ }
+
+ if (isAnyTear()) {
+ mSomeStr = "force";
+ }
+
+ if (isAnyTear()) {
+ s32 type = getTearSubtype(mId);
+ if (type == TEAR_MAX) {
+ type = TEAR_FARON;
+ }
+ 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) {
+ 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")) {
+ setItemFlags(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
+ setItemFlags(mItemFlags | 0x80);
+ }
+
+ field_0xD48 = cM::rndInt(0x10000);
+ mColorFilter.r = 0;
+ mColorFilter.g = 0;
+ mColorFilter.b = 0;
+ mLightLevelMaybe = 0.0f;
+
+ return SUCCEEDED;
+}
+
+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<dAcOScatterSand *>(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<dAcOScatterSand *>(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();
+
+ if (isField_0xD04GtZero() || 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->setDrawMode(dItemMdl_c::DrawMode_Put);
+ field_0xD5B = 0;
+ field_0xD38 = field_0xD3A = field_0xD3C = 0;
+ fn_80253E20();
+ if (mbNoGravity) {
+ mObjAcch.SetMoveBGOnly();
+ }
+ mMdlScaleType = 0;
+ mSinkOffset = 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());
+ 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;
+ }
+
+ if (mCyl.ChkTgAtHitType(AT_TYPE_GLITTERING_SPORES)) {
+ 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->changeItemId(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, 0.0f, 0.05f);
+ } else {
+ sLib::chase(&field_0xCD8, 1.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) || (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();
+ }
+
+ 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 (isHeartV()) {
+ 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 (isItemDeleteGround(specialCode)) {
+ if (sLib::chase(&mSinkOffset, -100.0f, (this->*mFnGetSinkSpeed)())) {
+ deleteRequest();
+ }
+ } else if (isItemSwimGround(specialCode)) {
+ sLib::chase(&mSinkOffset, -30.0f, (this->*mFnGetSinkSpeed)());
+ } else {
+ sLib::chase(&mSinkOffset, 0.0f, 6.0f);
+ }
+ } else {
+ mSinkOffset = 0.0f;
+ }
+
+ mYOffset = mSinkOffset;
+ if (isAnyTear() && mObjAcch.ChkGroundLanding()) {
+ startSoundWithFloatParam(SE_Item_A43_FALL, mVelocity.y);
+ }
+ }
+ }
+
+ /* This Function keeps Triforce postion locked 8024edbc */
+ if (isTriforce()) {
+ 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_0xD3A > 0) {
+ holdSoundWithIntParam(SE_O_RUPEE_ROULETTE, field_0xD3A);
+ }
+
+ 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;
+ mVec3_c efPos = offsetPos + dir;
+ mEff_0x928.holdEffect(PARTICLE_RESOURCE_ID_MAPPING_821_, efPos, nullptr, &scale, nullptr, nullptr);
+ }
+ makeLinkLookTowardItem();
+ if (!mbNoDespawn && !isItemSmallKeyOrHeartPieceOrStaminaFruit()) {
+ fn_80254CA0();
+ }
+ }
+}
+
+void dAcItem_c::finalizeState_Wait() {
+ unsetActorProperty(AC_PROP_0x1);
+ mObjAcch.SetRoofNone();
+ mObjAcch.Clr_0x2000000();
+ mSinkOffset = 0.0f;
+ mYOffset = 0.0f;
+ if (isTriforce() && mEff_0x928.hasEmitters()) {
+ mEff_0x928.remove(true);
+ }
+}
+
+void dAcItem_c::initializeState_Carry() {
+ mpMdl->setDrawMode(dItemMdl_c::DrawMode_Put);
+ 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.forceRemove(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->setDrawMode(dItemMdl_c::DrawMode_Put);
+ 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);
+ }
-void dAcItem_c::initializeState_Carry() {}
-void dAcItem_c::executeState_Carry() {}
-void dAcItem_c::finalizeState_Carry() {}
+ 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;
+ rotateTowardsCamera();
+ 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->setDrawMode(dItemMdl_c::DrawMode_Put);
+ 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->setDrawMode(dItemMdl_c::DrawMode_Get);
+ 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->setDrawMode(dItemMdl_c::DrawMode_Get);
+ 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->setDrawMode(dItemMdl_c::DrawMode_Get);
+ 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<dAcOWarp_c *>(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::rotateFixedBirdStatuette;
+ } else {
+ mFn_0xC9C = &dAcItem_c::rotateTowardsCamera;
+ }
+}
+
+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
+ // Same pattern as in rotateTowardsCamera
+ mAng3_c rot;
+ setRotXYVec(rot, diff);
+ 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->setDrawMode(dItemMdl_c::DrawMode_Get);
+ setNotWaiting();
+ field_0xD38 = field_0xD3A = field_0xD3C = 0;
+ setObjectProperty(OBJ_PROP_0x200);
+ mMdlScaleType = 2;
+ fn_802548A0();
+}
+
+void dAcItem_c::executeState_WaitTBoxGetDemo() {
+ const char *name;
+ getItemGetTboxEventName(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->setDrawMode(dItemMdl_c::DrawMode_Put);
+ // TODO FPR swap
+ mPosition = mPositionCopy;
+ mRotation = mRotationCopy;
+ mpResurgeCtl->startResurgeTimer();
+ setNotWaiting();
+ // TODO ???
+ mbNoGravity = mbNoDespawn;
+ field_0xD38 = field_0xD3A = field_0xD3C = 0;
+ mMdlScaleType = 0;
+ field_0xCD8 = 0.0f;
+}
+
+void dAcItem_c::executeState_ResurgeWait() {
+ if (mpResurgeCtl->canResurge(this)) {
+ if (!mpResurgeCtl->isTimerExpired()) {
+ mpResurgeCtl->execute();
+ if (mpResurgeCtl->isTimerExpired()) {
+ if (mId == ITEM_STAMINA_FRUIT) {
+ startSound(SE_O_REFRESH_FRUIT_SPROUT);
+ }
+ mStateMgr.changeState(StateID_Wait);
+ }
+ }
+ } else {
+ mpResurgeCtl->resetTimer();
+ }
+}
+
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 (!isField_0xD04GtZero()) {
+ 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);
+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::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<dAcItem_c *>(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 (isGratitudeCrystalV()) {
+ increaseGratitudeCrystalCounter(1);
+ } else if (is5GratitudeCrystalsV()) {
+ 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);
+ }
+}
+
+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 dAcItemPickupPositionOff_c::init() {
+ // no-op
+}
+
+bool dAcItemPickupPositionOff_c::execute(dAcItem_c *item) {
+ return false;
+}
+
+void dAcItemPickupPositionOn_c::init() {
+ // TODO weird double load
+ dAcPy_c *link = dAcPy_c::GetLinkM();
+ if (link != nullptr) {
+ mHighestRelativeHeadHeight = link->getHeadTranslation().y - link->getPosition().y;
+ }
+ mNumFrames = 0;
+}
+
+bool dAcItemPickupPositionOn_c::execute(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 dAcItemResurgeIf_c::startResurgeTimer() {
+ resetTimer();
+ postReset();
+}
+
+bool dAcItemResurgeIf_c::canResurge(dAcItem_c *item) {
+ if (item->getSquareDistToPlayer() < 40000.0f) {
+ return false;
+ }
+ return isResurgeAllowed(item);
+}
+
+void dAcItemResurgeIf_c::resetTimer() {
+ mTimer = getTimerInitVal();
+}
+
+void dAcItemResurgeIf_c::execute() {
+ if (mTimer == 0) {
+ return;
+ }
+ if (!EventManager::isInEvent()) {
+ mTimer--;
+ }
+}
+
+bool dAcItemResurgeIf_c::isTimerExpired() const {
+ return mTimer == 0;
+}
+
+void dAcItemResurgeOff_c::setTimerInitVal(u16 arg) {
+ // no-op
+}
+
+void dAcItemResurgeOff_c::postReset() {
+ // no-op
+}
+
+bool dAcItemResurgeOff_c::isResurgeAllowed(dAcItem_c *) {
+ return false;
+}
+
+s32 dAcItemResurgeOff_c::getTimerInitVal() {
+ return 0;
+}
+
+void dAcItemResurgeOn_c::setTimerInitVal(u16 arg) {
+ mInitVal = arg;
+}
+
+void dAcItemResurgeOn_c::postReset() {
+ // no-op
+}
+
+bool dAcItemResurgeOn_c::isResurgeAllowed(dAcItem_c *) {
+ return (this->*mCb2)();
+}
+
+s32 dAcItemResurgeOn_c::getTimerInitVal() {
+ return mInitVal;
+}
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..7f219bc4 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},
};
@@ -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/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);
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);
}
diff --git a/src/toBeSorted/item_mdl_item.cpp b/src/toBeSorted/item_mdl_item.cpp
new file mode 100644
index 00000000..eb2b2a0d
--- /dev/null
+++ b/src/toBeSorted/item_mdl_item.cpp
@@ -0,0 +1,482 @@
+#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::setDrawMode(u8 arg) {
+ mDrawMode = 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 (mDrawMode == DrawMode_Get) {
+ mpItem->fn_8002ECD0(&mMdl, 6);
+ } else {
+ mpItem->fn_8002ECD0(&mMdl, 7);
+ }
+}
+
+void dItemMdlItem_c::changeItemId(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_light_fruit.cpp b/src/toBeSorted/item_mdl_light_fruit.cpp
new file mode 100644
index 00000000..fe6b3c01
--- /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 (!mPutMdl.create(mdl1, allocator, 0x324)) {
+ return false;
+ }
+
+ nw4r::g3d::ResAnmTexSrt anmTexSrt1 = res1.GetResAnmTexSrt("Holy");
+ if (!anmTexSrt1.IsValid()) {
+ return false;
+ }
+ TRY_CREATE(mPutAnmTexSrt.create(mdl1, anmTexSrt1, allocator, nullptr, 1));
+ mPutMdl.setAnm(mPutAnmTexSrt);
+ }
+
+ {
+ 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 (!mGetMdl.create(mdl2, allocator, 0x324)) {
+ return false;
+ }
+
+ nw4r::g3d::ResAnmTexSrt anmTexSrt2 = res2.GetResAnmTexSrt("Holy");
+ if (!anmTexSrt2.IsValid()) {
+ return false;
+ }
+ TRY_CREATE(mGetAnmTexSrt.create(mdl2, anmTexSrt2, allocator, nullptr, 1));
+ mGetMdl.setAnm(mGetAnmTexSrt);
+ }
+
+ mpItem = item;
+ return true;
+}
+
+void dItemMdlLightFruit_c::setDrawMode(u8 arg) {
+ if (arg == DrawMode_Max) {
+ mDrawMode = DrawMode_Put;
+ } else {
+ mDrawMode = arg;
+ }
+}
+
+void dItemMdlLightFruit_c::setScale(const mVec3_c &scale) {
+ mPutMdl.setScale(scale);
+ mGetMdl.setScale(scale);
+}
+
+void dItemMdlLightFruit_c::setLocalMtx(const mMtx_c &mtx) {
+ mPutMdl.setLocalMtx(mtx);
+ mGetMdl.setLocalMtx(mtx);
+}
+
+void dItemMdlLightFruit_c::draw() {
+ switch (mDrawMode) {
+ case DrawMode_Put:
+ mPutAnmTexSrt.play();
+ mpItem->fn_8002ECD0(&mPutMdl, 7);
+ break;
+ case DrawMode_Get:
+ mGetAnmTexSrt.play();
+ mpItem->fn_8002ECD0(&mGetMdl, 6);
+ break;
+ }
+}
+
+void dItemMdlLightFruit_c::changeItemId(u16 itemId) {
+ // no-op
+}
+
+void dItemMdlLightFruit_c::setPriorityDraw() {
+ mPutMdl.setPriorityDraw(0x82, 0x7F);
+ mGetMdl.setPriorityDraw(0x82, 0x7F);
+}
+
+void dItemMdlLightFruit_c::unsetPriorityDraw() {
+ mPutMdl.setPriorityDraw(0x7F, 0x7F);
+ mGetMdl.setPriorityDraw(0x7F, 0x7F);
+}
diff --git a/src/toBeSorted/item_mdl_misc.cpp b/src/toBeSorted/item_mdl_misc.cpp
new file mode 100644
index 00000000..b9c345cd
--- /dev/null
+++ b/src/toBeSorted/item_mdl_misc.cpp
@@ -0,0 +1,1336 @@
+#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"
+
+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 */
+ 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_CLAWSHOTS */
+ 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 (!mPutMdl.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 (!mGetMdl.create(mdl1, allocator, 0x120)) {
+ return false;
+ }
+
+ mpItem = item;
+ return true;
+}
+
+void dItemMdlPut_c::setDrawMode(u8 arg) {
+ if (arg == DrawMode_Max) {
+ mDrawMode = DrawMode_Put;
+ } else {
+ mDrawMode = arg;
+ }
+}
+
+void dItemMdlPut_c::setScale(const mVec3_c &scale) {
+ mPutMdl.setScale(scale);
+ mGetMdl.setScale(scale);
+}
+
+void dItemMdlPut_c::setLocalMtx(const mMtx_c &mtx) {
+ mPutMdl.setLocalMtx(mtx);
+ mGetMdl.setLocalMtx(mtx);
+}
+
+void dItemMdlPut_c::draw() {
+ switch (mDrawMode) {
+ case DrawMode_Put: mpItem->fn_8002ECD0(&mPutMdl, 7); break;
+ case DrawMode_Get: mpItem->fn_8002ECD0(&mGetMdl, 6); break;
+ }
+}
+
+void dItemMdlPut_c::changeItemId(u16 itemId) {
+ // no-op
+}
+
+void dItemMdlPut_c::setPriorityDraw() {
+ mPutMdl.setPriorityDraw(0x82, 0x7F);
+ mGetMdl.setPriorityDraw(0x82, 0x7F);
+}
+
+void dItemMdlPut_c::unsetPriorityDraw() {
+ mPutMdl.setPriorityDraw(0x7F, 0x7F);
+ mGetMdl.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 */
+ 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_CLAWSHOTS */
+ 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::setDrawMode(u8 arg) {
+ mDrawMode = 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 (mDrawMode == DrawMode_Get) {
+ mpItem->fn_8002ECD0(&mMdl, 6);
+ } else {
+ mpItem->fn_8002ECD0(&mMdl, 7);
+ }
+}
+
+void dItemMdlShield_c::changeItemId(u16 itemId) {
+ // no-op
+}
+
+void dItemMdlShield_c::setPriorityDraw() {
+ mMdl.setPriorityDraw(0x82, 0x7F);
+}
+
+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 */
+ 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_CLAWSHOTS */
+ 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::setDrawMode(u8 arg) {
+ mDrawMode = 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 (mDrawMode != DrawMode_Put || (mFlags & 0x1) == 0) {
+ mMdl.play();
+ }
+
+ if (mDrawMode == DrawMode_Get) {
+ mpItem->fn_8002ECD0(&mMdl.getModel(), 6);
+ } else {
+ mpItem->fn_8002ECD0(&mMdl.getModel(), 7);
+ }
+}
+
+void dItemMdlBottle_c::changeItemId(u16 itemId) {
+ // 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(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 (!mPutMdl.create(mdl1, allocator, 0x327)) {
+ return false;
+ }
+
+ nw4r::g3d::ResAnmTexSrt anmTexSrt1 = res1.GetResAnmTexSrt("Shizuku");
+ if (!anmTexSrt1.IsValid()) {
+ return false;
+ }
+ 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 (!mPutAnmTexPat.create(mdl1, anmTexPat1, allocator, nullptr, 1)) {
+ return false;
+ }
+ TRY_CREATE(mPutMdl.setAnm(mPutAnmTexPat));
+ mPutAnmTexPat.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 (!mGetMdl.create(mdl2, allocator, 0x327)) {
+ return false;
+ }
+
+ nw4r::g3d::ResAnmTexSrt anmTexSrt2 = res2.GetResAnmTexSrt("Shizuku");
+ if (!anmTexSrt2.IsValid()) {
+ return false;
+ }
+ 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 (!mGetAnmTexPat.create(mdl2, anmTexPat2, allocator, nullptr, 1)) {
+ return false;
+ }
+ TRY_CREATE(mGetMdl.setAnm(mGetAnmTexPat));
+ mGetAnmTexPat.setFrame(frame, 0);
+ }
+
+ mpItem = item;
+
+ return true;
+}
+
+void dItemMdlTear_c::setDrawMode(u8 arg) {
+ if (arg == DrawMode_Max) {
+ mDrawMode = DrawMode_Put;
+ } else {
+ mDrawMode = arg;
+ }
+}
+
+void dItemMdlTear_c::setScale(const mVec3_c &scale) {
+ mPutMdl.setScale(scale);
+ mGetMdl.setScale(scale);
+}
+
+void dItemMdlTear_c::setLocalMtx(const mMtx_c &mtx) {
+ mPutMdl.setLocalMtx(mtx);
+ mGetMdl.setLocalMtx(mtx);
+}
+
+void dItemMdlTear_c::draw() {
+ switch (mDrawMode) {
+ case DrawMode_Put:
+ mPutAnmTexSrt.play();
+ mpItem->fn_8002ECD0(&mPutMdl, 7);
+ break;
+ case DrawMode_Get:
+ mGetAnmTexSrt.play();
+ mpItem->fn_8002ECD0(&mGetMdl, 6);
+ break;
+ }
+}
+
+void dItemMdlTear_c::changeItemId(u16 itemId) {
+ // no-op
+}
+
+void dItemMdlTear_c::setPriorityDraw() {
+ mPutMdl.setPriorityDraw(0x82, 0x7F);
+ mGetMdl.setPriorityDraw(0x82, 0x7F);
+}
+
+void dItemMdlTear_c::unsetPriorityDraw() {
+ mPutMdl.setPriorityDraw(0x7F, 0x7F);
+ mGetMdl.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::setDrawMode(u8 arg) {
+ mDrawMode = 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 (mDrawMode) {
+ case DrawMode_Put: mpItem->fn_8002ECD0(&mMdl, 7); break;
+ case DrawMode_Get: mpItem->fn_8002ECD0(&mMdl, 6); break;
+ }
+ mAnmMatClr.play();
+}
+
+void dItemMdlFirefly_c::changeItemId(u16 itemId) {
+ // 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;
+}
+
+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 */
+ 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_CLAWSHOTS */
+ 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::setDrawMode(u8 arg) {
+ mDrawMode = 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 (mDrawMode) {
+ case DrawMode_Put: mpItem->fn_8002ECD0(&mMdl, 7); break;
+ case DrawMode_Get: mpItem->fn_8002ECD0(&mMdl, 6); break;
+ }
+}
+
+void dItemMdlPotion_c::changeItemId(u16 itemId) {
+ // 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..a9587885
--- /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_CLAWSHOTS, /* 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/item_mdl_rupee.cpp b/src/toBeSorted/item_mdl_rupee.cpp
new file mode 100644
index 00000000..0aec69f0
--- /dev/null
+++ b/src/toBeSorted/item_mdl_rupee.cpp
@@ -0,0 +1,158 @@
+#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 (!mPutMdl.create(mdl1, allocator, 0x123)) {
+ return false;
+ }
+
+ nw4r::g3d::ResAnmTexPat anmTexPat1 = res1.GetResAnmTexPat("Rupee");
+ if (!anmTexPat1.IsValid()) {
+ return false;
+ }
+ if (!mPutAnmTexPat.create(mdl1, anmTexPat1, allocator, nullptr, 1)) {
+ return false;
+ }
+ mPutMdl.setAnm(mPutAnmTexPat);
+ mPutAnmTexPat.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 (!mGetMdl.create(mdl2, allocator, 0x123)) {
+ return false;
+ }
+
+ nw4r::g3d::ResAnmTexPat anmTexPat2 = res2.GetResAnmTexPat("Rupee");
+ if (!anmTexPat2.IsValid()) {
+ return false;
+ }
+ anmTexPat2.Bind(res2);
+ if (!mGetAnmTexPat.create(mdl2, anmTexPat2, allocator, nullptr, 1)) {
+ return false;
+ }
+ mGetMdl.setAnm(mGetAnmTexPat);
+ mGetAnmTexPat.setFrame(sMdlConfig[i].texPatFrame, 0);
+ }
+
+
+ mpItem = item;
+ return true;
+}
+
+void dItemMdlRupee_c::setDrawMode(u8 arg) {
+ if (arg == DrawMode_Max) {
+ mDrawMode = DrawMode_Put;
+ } else {
+ mDrawMode = arg;
+ }
+}
+
+void dItemMdlRupee_c::setScale(const mVec3_c &scale) {
+ mPutMdl.setScale(scale);
+ mGetMdl.setScale(scale);
+}
+
+void dItemMdlRupee_c::setLocalMtx(const mMtx_c &mtx) {
+ mPutMdl.setLocalMtx(mtx);
+ mGetMdl.setLocalMtx(mtx);
+}
+
+void dItemMdlRupee_c::draw() {
+ switch (mDrawMode) {
+ case DrawMode_Put: mpItem->fn_8002ECD0(&mPutMdl, 7); break;
+ case DrawMode_Get: mpItem->fn_8002ECD0(&mGetMdl, 6); break;
+ }
+}
+
+void dItemMdlRupee_c::changeItemId(u16 itemId) {
+ int i = 0;
+ bool found = false;
+ while (!found && i < ARRAY_LENGTH(sMdlConfig)) {
+ if (itemId == sMdlConfig[i].itemId) {
+ found = true;
+ } else {
+ i++;
+ }
+ }
+
+ if (found) {
+ mPutAnmTexPat.setFrame(sMdlConfig[i].texPatFrame, 0);
+ mGetAnmTexPat.setFrame(sMdlConfig[i].texPatFrame, 0);
+ }
+}
+
+void dItemMdlRupee_c::setPriorityDraw() {
+ mPutMdl.setPriorityDraw(0x82, 0x7F);
+ mGetMdl.setPriorityDraw(0x82, 0x7F);
+}
+
+void dItemMdlRupee_c::unsetPriorityDraw() {
+ 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
new file mode 100644
index 00000000..cf1e0947
--- /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 (!mPutMdl.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 (!mGetMdl.create(mdl2, allocator, 0x324)) {
+ return false;
+ }
+
+ nw4r::g3d::ResAnmTexSrt anmTexSrt1 = res1.GetResAnmTexSrt("GutsLight");
+ if (!anmTexSrt1.IsValid()) {
+ return false;
+ }
+ 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(mGetAnmTexSrt.create(mdl2, anmTexSrt2, allocator, nullptr, 1));
+ mGetMdl.setAnm(mGetAnmTexSrt);
+
+ mpItem = item;
+
+ return true;
+}
+
+void dItemMdlStaminaFruit_c::setDrawMode(u8 arg) {
+ if (arg == DrawMode_Max) {
+ mDrawMode = DrawMode_Put;
+ } else {
+ mDrawMode = arg;
+ }
+}
+
+void dItemMdlStaminaFruit_c::setScale(const mVec3_c &scale) {
+ mPutMdl.setScale(scale);
+ mGetMdl.setScale(scale);
+}
+
+void dItemMdlStaminaFruit_c::setLocalMtx(const mMtx_c &mtx) {
+ mPutMdl.setLocalMtx(mtx);
+ mGetMdl.setLocalMtx(mtx);
+}
+
+void dItemMdlStaminaFruit_c::draw() {
+ switch (mDrawMode) {
+ case DrawMode_Put:
+ mPutAnmTexSrt.play();
+ mpItem->fn_8002ECD0(&mPutMdl, 7);
+ break;
+ case DrawMode_Get:
+ mGetAnmTexSrt.play();
+ mpItem->fn_8002ECD0(&mGetMdl, 6);
+ break;
+ }
+}
+
+void dItemMdlStaminaFruit_c::changeItemId(u16 itemId) {
+ // no-op
+}
+
+void dItemMdlStaminaFruit_c::setPriorityDraw() {
+ mPutMdl.setPriorityDraw(0x82, 0x7F);
+ mGetMdl.setPriorityDraw(0x82, 0x7F);
+}
+
+void dItemMdlStaminaFruit_c::unsetPriorityDraw() {
+ mPutMdl.setPriorityDraw(0x7F, 0x7F);
+ mGetMdl.setPriorityDraw(0x7F, 0x7F);
+}
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() {}