diff options
| author | robojumper <robojumper@gmail.com> | 2026-05-24 23:08:30 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-05-24 23:08:30 +0200 |
| commit | 483ac7b934e4e3443366640320ae9b1ade65fe90 (patch) | |
| tree | 2015b1c591f4c006241dd44ef272c9987e48b233 /src | |
| parent | 388abef134a6c7156f1309d6453ac2eb260642e1 (diff) | |
| parent | 174f848c281a6bdc77531b6b0a7a59f1bd99565e (diff) | |
Merge pull request #311 from robojumper/item_mdl
some item model stuff
Diffstat (limited to 'src')
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() {} |
