summaryrefslogtreecommitdiff
path: root/src/d/a/d_a_item.cpp
diff options
context:
space:
mode:
authorrobojumper <robojumper@gmail.com>2026-05-03 20:56:05 +0200
committerrobojumper <robojumper@gmail.com>2026-05-10 20:05:48 +0200
commit9843fc692291bf7532d0b26430d306e2dc47098d (patch)
treee46d6daff116858b802f71bcc5533e2834adacac /src/d/a/d_a_item.cpp
parentf9754e2edad7e1b69718970b66b07b4194c511ec (diff)
Item progress
Diffstat (limited to 'src/d/a/d_a_item.cpp')
-rw-r--r--src/d/a/d_a_item.cpp1128
1 files changed, 1045 insertions, 83 deletions
diff --git a/src/d/a/d_a_item.cpp b/src/d/a/d_a_item.cpp
index 4301c64a..ec833cfb 100644
--- a/src/d/a/d_a_item.cpp
+++ b/src/d/a/d_a_item.cpp
@@ -4,34 +4,36 @@
#include "common.h"
#include "d/a/d_a_itembase.h"
#include "d/a/d_a_player.h"
+#include "d/a/npc/d_a_npc_talk_kensei.h"
+#include "d/a/obj/d_a_obj_boomerang.h"
+#include "d/a/obj/d_a_obj_warp.h"
#include "d/col/bg/d_bg_s.h"
-#include "d/col/bg/d_bg_s_gnd_chk.h"
-#include "d/col/bg/d_bg_s_roof_chk.h"
#include "d/col/cc/d_cc_d.h"
#include "d/col/cc/d_cc_s.h"
#include "d/d_camera.h"
#include "d/d_linkage.h"
+#include "d/d_player.h"
#include "d/d_pouch.h"
#include "d/d_sc_game.h"
#include "d/flag/dungeonflag_manager.h"
+#include "d/flag/itemflag_manager.h"
#include "d/flag/sceneflag_manager.h"
#include "d/flag/storyflag_manager.h"
#include "d/snd/d_snd_small_effect_mgr.h"
#include "d/snd/d_snd_wzsound.h"
#include "d/t/d_t_force_get_flag.h"
-#include "f/f_list_mg.h"
-#include "f/f_profile_name.h"
+#include "d/t/d_t_minigame_insect_capture.h"
+#include "d/t/d_t_siren.h"
#include "m/m_vec.h"
-#include "s/s_Math.h"
-#include "toBeSorted/d_emitter.h"
-#include "toBeSorted/dowsing_target.h"
#include "toBeSorted/event_manager.h"
#include "toBeSorted/file_manager.h"
+#include "toBeSorted/item_mdl.h"
#include "toBeSorted/item_mdl_item.h"
#include "toBeSorted/item_mdl_light_fruit.h"
#include "toBeSorted/item_mdl_misc.h"
#include "toBeSorted/item_mdl_rupee.h"
#include "toBeSorted/item_mdl_stamina_fruit.h"
+#include "toBeSorted/minigame_mgr.h"
const ItemFlagStruct dAcItemBase_c::sDefaultFlagStruct = {0x28, 0x3C, 0x1E, 0xFF, 0x0000, 0x02, 0x01};
const ItemFlagStruct dAcItemBase_c::sItemFlagStructs[167] = {
@@ -263,30 +265,6 @@ static const dCcD_SrcCyl sSrcCyl = {
{40.0f, 60.0f}
};
-static const char *const sResNodeName = "Set";
-/* static */ extern const char *const sDefaultGetItem = "DefaultGetItem";
-/* static */ extern const char *const sItemGetGorgeous = "ItemGetGorgeous";
-/* static */ extern const char *const sItemGetDefaultTbox = "ItemGetDefaultTBox";
-/* static */ extern const char *const sItemGetGorgeousTbox = "ItemGetGorgeousTBox";
-/* static */ extern const char *const sItemGetBird = "ItemGetBird";
-
-struct TearIdIdx {
- s32 idx;
- u16 itemId;
- u32 _0x04;
- u32 _0x08;
-};
-
-/* static */ extern "C" TearIdIdx sTearIdxes[] = {
- {0, ITEM_FARORE_TEAR},
- {1, ITEM_DIN_TEAR},
- {2, ITEM_NAYRU_TEAR},
- {3, ITEM_SACRED_TEAR},
-};
-
-/* static */ extern const char *const sGetFairyBody = "GetFairy_body";
-/* static */ extern const char *const sBottleFairy_body = "BottleFairy_body";
-
bool dAcItemBase_c::isValidItemTypeIdx(int itemId) {
return itemId < ARRAY_LENGTH(sItemTypeFlags);
}
@@ -347,7 +325,16 @@ bool dAcItemBase_c::setDungeonFlagForTear(int tearNum) {
return true;
}
-u16 dAcItemBase_c::getItemId() {
+// This might be a cM::calcTimer thing...
+bool increment(u32 *value) {
+ if (*value < UINT32_MAX) {
+ (*value)++;
+ return true;
+ }
+ return false;
+}
+
+u16 dAcItemBase_c::getItemId() const {
return mId;
}
@@ -370,11 +357,58 @@ u16 getIndex(u16 itemId) {
// }
// }
-fLiMgBa_c dAcItem_c::sItemList;
-
-SPECIAL_ACTOR_PROFILE(ITEM, dAcItem_c, fProfile::ITEM, 0x2B, 0, 2);
+static const char *const sResNodeName = "Set";
+/* static */ extern const char *const sDefaultGetItem = "DefaultGetItem";
+/* static */ extern const char *const sItemGetGorgeous = "ItemGetGorgeous";
+/* static */ extern const char *const sItemGetDefaultTbox = "ItemGetDefaultTBox";
+/* static */ extern const char *const sItemGetGorgeousTbox = "ItemGetGorgeousTBox";
+/* static */ extern const char *const sItemGetBird = "ItemGetBird";
const mVec3_c dAcItem_c::sFreestandingDowsingOffset(0.0f, 25.0f, 0.0f);
+const mVec3_c dAcItem_c::sScale1Maybe(1.0f, 1.0f, 1.0f);
+const mVec3_c dAcItem_c::sScale2Maybe(1.75f, 1.75f, 1.75f);
+
+struct TearIdIdx {
+ s32 idx;
+ u16 itemId;
+ mColor color1;
+ mColor color2;
+};
+
+/* static */ extern "C" TearIdIdx sTearIdxes[] = {
+ {0, ITEM_FARORE_TEAR, mColor(0x00, 0x80, 0x30, 0xFF), mColor(0xFF, 0xFF, 0xFF, 0xFF)},
+ {1, ITEM_DIN_TEAR, mColor(0xFF, 0x64, 0x80, 0xFF), mColor(0xFF, 0xFF, 0xFF, 0xFF)},
+ {2, ITEM_NAYRU_TEAR, mColor(0x80, 0x80, 0x00, 0xFF), mColor(0xFF, 0xFF, 0xFF, 0xFF)},
+ {3, ITEM_SACRED_TEAR, mColor(0x00, 0x64, 0xC8, 0xFF), mColor(0xFF, 0xFF, 0xFF, 0xFF)},
+};
+
+struct TearEffectColorThing {
+ mColor color1;
+ mColor color2;
+ mColor color3;
+ mColor color4;
+ mColor color5;
+ mColor color6;
+};
+
+extern "C" TearEffectColorThing sTearEffectColors[] = {
+ {mColor(0x80, 0xFF, 0x80, 0xFF), mColor(0x00, 0xFF, 0x40, 0xFF), mColor(0xC8, 0xFF, 0xC8, 0xFF),
+ mColor(0x40, 0xFF, 0x40, 0xFF), mColor(0x40, 0xFF, 0x60, 0xFF), mColor(0x00, 0xFF, 0x40, 0xFF)},
+
+ {mColor(0xFF, 0x80, 0xA0, 0xFF), mColor(0xFF, 0x40, 0x80, 0xFF), mColor(0xFF, 0xC8, 0xC8, 0xFF),
+ mColor(0xFF, 0x40, 0x80, 0xFF), mColor(0xFF, 0x60, 0x80, 0xFF), mColor(0xFF, 0x00, 0x40, 0xFF)},
+
+ {mColor(0xFF, 0xFF, 0x80, 0xFF), mColor(0xFF, 0xFF, 0x00, 0xFF), mColor(0xFF, 0xFF, 0xC8, 0xFF),
+ mColor(0xFF, 0xFF, 0x40, 0xFF), mColor(0xFF, 0xFF, 0xFF, 0xFF), mColor(0xFF, 0xFF, 0xFF, 0xFF)},
+
+ {mColor(0x80, 0xFF, 0xFF, 0xFF), mColor(0x00, 0x80, 0xFF, 0xFF), mColor(0xC8, 0xC8, 0xFF, 0xFF),
+ mColor(0x40, 0xA0, 0xFF, 0xFF), mColor(0xFF, 0xFF, 0xFF, 0xFF), mColor(0xFF, 0xFF, 0xFF, 0xFF)},
+};
+
+/* static */ extern const char *const sGetFairyBody = "GetFairy_body";
+/* static */ extern const char *const sBottleFairy_body = "BottleFairy_body";
+
+SPECIAL_ACTOR_PROFILE(ITEM, dAcItem_c, fProfile::ITEM, 0x2B, 0, 2);
const dAcItem_c::sStaticPtmf dAcItem_c::sStaticPtmfs[] = {
&dAcItem_c::fn_80248020, nullptr,
@@ -385,6 +419,10 @@ const dAcItem_c::sStaticPtmf dAcItem_c::sStaticPtmfs[] = {
&dAcItem_c::fn_80255BD0, &dAcItem_c::fn_80255C40,
};
+fLiMgBa_c dAcItem_c::sItemList;
+dAcRef_c<dAcObjBase_c> dAcItem_c::sItemListHead;
+dAcRef_c<dAcObjBase_c> dAcItem_c::sItemListTail;
+
dAcItem_c::dAcItem_c()
: mStateMgr(*this),
mEff_0x8F4(this),
@@ -584,7 +622,7 @@ int dAcItem_c::create() {
default: return FAILED;
}
- if (isHeart2()) {
+ if (isHeartV()) {
mFunc_0xB58 = &dAcItem_c::fn_802555F0;
} else {
mFunc_0xB58 = &dAcItem_c::fn_802555D0;
@@ -592,7 +630,7 @@ int dAcItem_c::create() {
if (isAnyRupee()) {
mFnBounce = &dAcItem_c::bounceRupee;
- } else if (isHeart2()) {
+ } else if (isHeartV()) {
mFnBounce = &dAcItem_c::bounceNone;
} else {
mFnBounce = &dAcItem_c::bounceNormal;
@@ -661,7 +699,7 @@ int dAcItem_c::create() {
mCyl.SetTg_0x4C(0x6CC0);
} else if (isBabyRattle()) {
mCyl.SetTg_0x4C(0x6480);
- } else if (!isAnyRupee() && !isHeart2() && mId != ITEM_STAMINA_FRUIT) {
+ } else if (!isAnyRupee() && !isHeartV() && mId != ITEM_STAMINA_FRUIT) {
mCyl.SetTg_0x4C(0x6480);
}
@@ -669,7 +707,7 @@ int dAcItem_c::create() {
mCyl.SetTgInfo_0x1(0x13);
} else if (isHeartPiece()) {
mCyl.SetTgInfo_0x1(0x15);
- } else if (!isAnyRupee() && !isHeart2() && mId != ITEM_STAMINA_FRUIT) {
+ } else if (!isAnyRupee() && !isHeartV() && mId != ITEM_STAMINA_FRUIT) {
mCyl.SetTgInfo_0x1(0x13);
}
@@ -927,7 +965,7 @@ int dAcItem_c::create() {
default: mFnGetHitKnockbackRand3 = nullptr; break;
}
- if (isHeart2()) {
+ if (isHeartV()) {
mFn_0xCB4 = &dAcItem_c::fn_802577C0;
} else {
mFn_0xCB4 = &dAcItem_c::fn_802577D0;
@@ -935,11 +973,11 @@ int dAcItem_c::create() {
if (mbNoDespawn) {
dBgS::GetInstance()->SetLightingCode(this, 10.0f);
- } else if (isHeart2()) {
+ } else if (isHeartV()) {
mLinkage.bushTpFunc(mObjAcch);
}
- if (isHeart2()) {
+ if (isHeartV()) {
field_0xD20 = 6;
}
@@ -1006,7 +1044,7 @@ int dAcItem_c::create() {
}
if (EventManager::isInEvent() && EventManager::isCurrentEvent("GetGenkiItem")) {
- fn_8024DF30(mItemFlags | 0x20);
+ setItemFlags(mItemFlags | 0x20);
}
// okay
@@ -1019,7 +1057,7 @@ int dAcItem_c::create() {
}
if (is) {
// Skyview Temple - Heart Piece behind bars in main room
- fn_8024DF30(mItemFlags | 0x80);
+ setItemFlags(mItemFlags | 0x80);
}
field_0xD48 = cM::rndInt(0x10000);
@@ -1031,10 +1069,251 @@ int dAcItem_c::create() {
return SUCCEEDED;
}
-void dAcItem_c::initializeState_Wait() {}
+int dAcItem_c::doDelete() {
+ sItemList.remove(&this->mNode);
+ dAcItem_c *prev = mItemQueuePrev.get();
+ dAcItem_c *next = mItemQueueNext.get();
+
+ if (prev == nullptr) {
+ if (next == nullptr) {
+ if (this == sItemListHead.get()) {
+ sItemListHead.unlink();
+ }
+ if (this == sItemListTail.get()) {
+ sItemListTail.unlink();
+ }
+ } else {
+ sItemListHead.link(next);
+ next->mItemQueuePrev.unlink();
+ }
+ } else if (next == nullptr) {
+ sItemListTail.link(prev);
+ prev->mItemQueueNext.unlink();
+ } else {
+ prev->mItemQueueNext.link(next);
+ next->mItemQueuePrev.link(prev);
+ }
+
+ return SUCCEEDED;
+}
+
+int dAcItem_c::actorExecute() {
+ if (!checkActorProperty(AC_PROP_0x10000000)) {
+ if (mId == ITEM_STAMINA_FRUIT) {
+ if (isFirstBitParams2NotSet() && !fn_802577A0()) {
+ field_0xCD8 = 0.0f;
+ } else {
+ field_0xCD8 = 1.0f;
+ }
+ } else if (isLightFruit()) {
+ if ((this->*mFnAction4)()) {
+ field_0xCD8 = 1.0f;
+ } else {
+ field_0xCD8 = 0.0f;
+ }
+ }
+
+ dAcOScatterSand *ac =
+ static_cast<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();
+
+ bool tmp = 0.0f < field_0xD04;
+ if (tmp || mStateMgr.isState(StateID_WaitGetDemo) || mStateMgr.isState(StateID_Get) ||
+ mStateMgr.isState(StateID_GetBeetle)) {
+ setActorProperty(AC_PROP_0x4);
+ } else {
+ unsetActorProperty(AC_PROP_0x4);
+ }
+
+ return SUCCEEDED;
+}
+
+int dAcItem_c::draw() {
+ if (mMdlScaleType == 2 || 0.0f < field_0xCD8) {
+ bool shouldDraw = true;
+ if (isMdlHidden()) {
+ shouldDraw = false;
+ } else if ((mStateMgr.isState(StateID_Wait) || mStateMgr.isState(StateID_Carry)) && mbIsWaiting) {
+ shouldDraw = isBlinkBeforeDespawnShown(mDespawnTimer);
+ }
+ if (shouldDraw) {
+ mpMdl->draw();
+ }
+
+ if (mLinkage.checkConnection(dLinkage_c::CONNECTION_9) ||
+ (mId == ITEM_STAMINA_FRUIT && getParams2Lower_shift1_0x7()) || isLightFruit() || (mItemFlags & 0x10) == 0) {
+ /* nothing */
+ } else if (mMdlScaleType == 2) {
+ mQuat_c v(mVec3_c(0.0f, 0.0f, 0.0f), getItemFlagStruct(getItemId())->field_0x02);
+ drawShadow(mShdw, nullptr, mWorldMtx, &v, -1, -1, -1, -1, -1, field_0xD18);
+ } else {
+ mQuat_c v(
+ mVec3_c(0.0f, field_0xCD8 * 0.5f * getItemFlagStruct(getItemId())->field_0x01, 0.0f),
+ field_0xCD8 * getItemFlagStruct(getItemId())->field_0x02
+ );
+ drawShadow(mShdw, nullptr, mWorldMtx, &v, -1, -1, -1, -1, -1, field_0xD18);
+ }
+ }
+ return SUCCEEDED;
+}
+
+void dAcItem_c::setSpawnQuantity(s32 quantity) {
+ sGetItemQuantity = quantity;
+}
+
+void dAcItem_c::setFreestandingYOffset(f32 off) {
+ mFreestandingOffsetH = off;
+}
+
+void dAcItem_c::setFramesInAir(u32 numFrames) {
+ mFramesInAir = numFrames;
+}
+
+void dAcItem_c::setItemFlags(u32 flags) {
+ mItemFlags = flags;
+}
+
+bool dAcItem_c::isItemDropFromEnemy() const {
+ return mObjID != 0xFFFF;
+}
+
+void dAcItem_c::unsetSpawnQuantity() {
+ sGetItemQuantity = 0;
+}
+
+void dAcItem_c::unsetFramesInAir() {
+ setFramesInAir(0);
+}
+
+void dAcItem_c::incrementFramesInAir() {
+ u32 v = mFramesInAir;
+ increment(&v);
+ setFramesInAir(v);
+}
+
+void dAcItem_c::initializeState_Wait() {
+ if (mbNoGravity) {
+ setActorProperty(AC_PROP_0x1);
+ mSpeed = 0.0f;
+ mVelocity.y = 0.0f;
+ }
+ mpMdl->vt_0x10(dItemMdl_c::ITEM_MDL_UNK0x14_1);
+ field_0xD5B = 0;
+ field_0xD38 = field_0xD3A = field_0xD3C = 0;
+ fn_80253E20();
+ if (mbNoGravity) {
+ mObjAcch.SetMoveBGOnly();
+ }
+ mMdlScaleType = 0;
+ field_0xD00 = 0.0f;
+ mYOffset = 0.0f;
+}
+
void dAcItem_c::executeState_Wait() {
bool isFixedPosition;
-
+
bool tmp = false;
mVec3_c topPos = getPosition() + mVec3_c::Ey * mCyl.GetH();
bool chk = dBgS_ObjRoofChk::CheckPos(&getPosition());
@@ -1194,9 +1473,9 @@ void dAcItem_c::executeState_Wait() {
if (mId == ITEM_STAMINA_FRUIT) {
if (isFirstBitParams2NotSet() && !fn_802577A0()) {
- sLib::chase(&field_0xCD8, 1.0f, 0.05f);
- } else {
sLib::chase(&field_0xCD8, 0.0f, 0.05f);
+ } else {
+ sLib::chase(&field_0xCD8, 1.0f, 0.05f);
}
} else if (isLightFruit()) {
if ((this->*mFnAction4)()) {
@@ -1209,8 +1488,8 @@ void dAcItem_c::executeState_Wait() {
bool tgHitArrow = tgHit && mCyl.ChkTgAtHitType(AT_TYPE_ARROW);
bool tgHitClawshot = tgHit && mCyl.ChkTgAtHitType(AT_TYPE_CLAWSHOT);
if (mbNoGravity && tgHit &&
- ((isAnyRupee() && tgHitArrow) || (isHeart2() && mCyl.ChkTgAtHitType(AT_TYPE_BELLOWS)) ||
- ((isAnyRupee() || isHeart2()) &&
+ ((isAnyRupee() && tgHitArrow) || (isHeartV() && mCyl.ChkTgAtHitType(AT_TYPE_BELLOWS)) ||
+ ((isAnyRupee() || isHeartV()) &&
(mCyl.ChkTgAtHitType(AT_TYPE_SLINGSHOT) || mCyl.ChkTgAtHitType(AT_TYPE_CLAWSHOT))) ||
mCyl.ChkTgAtHitType(AT_TYPE_BOMB) || mCyl.ChkTgAtHitType(AT_TYPE_0x800000))) {
unsetHaveNoGravity();
@@ -1261,7 +1540,7 @@ void dAcItem_c::executeState_Wait() {
case 1: mAcceleration = (this->*mFnGetRupeeGravity)(); break;
case 2: mAcceleration = (this->*mFnGetGravity1)(); break;
}
- } else if (isHeart2()) {
+ } else if (isHeartV()) {
if (field_0xD52) {
if (mFnGetHeartGravity != nullptr) {
mAcceleration = (this->*mFnGetHeartGravity)();
@@ -1331,20 +1610,19 @@ void dAcItem_c::executeState_Wait() {
/* This Function keeps Triforce postion locked 8024edbc */
if (isTriforce()) {
- // TODO
f32 factor = field_0xD48.sin();
mPosition = mPositionCopy + mVec3_c::Ey * (factor * 16.0f);
field_0xD48.mVal += 182;
}
- if ((mItemFlags & 0x4) != 0 && 3000.0f < mPositionCopy.y - mPosition.y) {
+ if ((mItemFlags & 0x4) != 0 && 3000.0f < mPositionCopy.y - mPosition.y) {
mItemFlags |= 0x8;
}
if ((mItemFlags & 0x8) == 0) {
(this->*mFnAction3)();
- if (isAnyRupee() && field_0xD38.y > 0) {
- holdSoundWithIntParam(SE_O_RUPEE_ROULETTE, field_0xD38.y);
+ if (isAnyRupee() && field_0xD3A > 0) {
+ holdSoundWithIntParam(SE_O_RUPEE_ROULETTE, field_0xD3A);
}
if (!field_0xD51) {
@@ -1377,7 +1655,9 @@ void dAcItem_c::executeState_Wait() {
dir *= -40.0f;
// TODO - for some reason the argument vector is at an entirely wrong stack position...
// Fixing this wil probably fix the rest of the stack position issues in this function.
- mEff_0x928.holdEffect(PARTICLE_RESOURCE_ID_MAPPING_821_, offsetPos + dir, nullptr, &scale, nullptr, nullptr);
+ mEff_0x928.holdEffect(
+ PARTICLE_RESOURCE_ID_MAPPING_821_, offsetPos + dir, nullptr, &scale, nullptr, nullptr
+ );
}
makeLinkLookTowardItem();
if (!mbNoDespawn && !isItemSmallKeyOrHeartPieceOrStaminaFruit()) {
@@ -1385,50 +1665,459 @@ void dAcItem_c::executeState_Wait() {
}
}
}
-void dAcItem_c::finalizeState_Wait() {}
-void dAcItem_c::initializeState_Carry() {}
-void dAcItem_c::executeState_Carry() {}
-void dAcItem_c::finalizeState_Carry() {}
+void dAcItem_c::finalizeState_Wait() {
+ unsetActorProperty(AC_PROP_0x1);
+ mObjAcch.SetRoofNone();
+ mObjAcch.Clr_0x2000000();
+ field_0xD00 = 0.0f;
+ mYOffset = 0.0f;
+ if (isTriforce() && mEff_0x928.hasEmitters()) {
+ mEff_0x928.remove(true);
+ }
+}
+
+void dAcItem_c::initializeState_Carry() {
+ mpMdl->vt_0x10(dItemMdl_c::ITEM_MDL_UNK0x14_1);
+ mSpeed = 0.0f;
+ mVelocity.y = 0.0f;
+ unsetHaveNoGravity();
+ field_0xD38 = field_0xD3A = field_0xD3C = 0;
+ mCyl.OnTgSet();
+ mCyl.ClrCoSet();
+ fn_80254BA0();
+ field_0xD4A = 0;
+ mMdlScaleType = 0;
+}
+
+void dAcItem_c::executeState_Carry() {
+ if (!mbNoDespawn && !isItemSmallKeyOrHeartPieceOrStaminaFruit() && !mbIsWaiting &&
+ mLinkage.checkConnection(dLinkage_c::CONNECTION_8)) {
+ fn_80254CA0();
+ }
+ tickDespawnTimer();
+ if (mDespawnTimer == 0) {
+ return;
+ }
+
+ if (fn_802574A0()) {
+ // TODO weird double load
+ dAcPy_c *link = dAcPy_c::GetLinkM();
+ if (!link->vt_0x1C0()) {
+ addToGetQueue();
+ if (link->ifHasHealthAndSomethingElse() && this == sItemListHead.get() &&
+ FileManager::sInstance->getCurrentHealth() != 0) {
+ mStateMgr.changeState(StateID_Get);
+ } else {
+ mStateMgr.changeState(StateID_WaitGet);
+ }
+ } else {
+ mStateMgr.changeState(StateID_GetBeetle);
+ }
+ } else if (!mLinkage.checkState(dLinkage_c::STATE_ACTIVE)) {
+ mStateMgr.changeState(StateID_Wait);
+ } else if (mLinkage.checkConnection(dLinkage_c::CONNECTION_9) && mCyl.ChkTgHit() &&
+ !mCyl.ChkTgAtHitType(AT_TYPE_WHIP)) {
+ mLinkage.fn_80050EA0(this);
+ mStateMgr.changeState(StateID_Wait);
+ } else {
+ fn_80256E80();
+ if (mLinkage.checkConnection(dLinkage_c::CONNECTION_9) || mLinkage.checkConnection(dLinkage_c::CONNECTION_8)) {
+ mCyl.SetC(mPosition);
+ dCcS::GetInstance()->Set(&mCyl);
+ }
+
+ if (mLinkage.checkConnection(dLinkage_c::CONNECTION_7)) {
+ makeLinkLookTowardItem();
+ }
+ }
+}
+
+void dAcItem_c::finalizeState_Carry() {
+ setupUnkColliderFlags2();
+}
+
+void dAcItem_c::initializeState_GetBeetle() {
+ mpMdl->vt_0x10(dItemMdl_c::ITEM_MDL_UNK0x14_1);
+ setNotWaiting();
+ field_0xD38 = field_0xD3A = field_0xD3C = 0;
+ field_0xD0C = 0.0f;
+ if (isAnyRupee()) {
+ dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_BE_GET_RUPEE);
+ } else if (isHeartV()) {
+ dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_BE_GET_HART);
+ } else if (isSmallKey()) {
+ dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_BE_GET_KEY);
+ } else if (mId == ITEM_STAMINA_FRUIT) {
+ dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_BE_GET_REFRESH_FRUIT);
+ } else if (isUnkTreasureGroup1()) {
+ dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_BE_GET_MATERIAL);
+ } else {
+ dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_BE_GET_CONSUMP_ITEM);
+ }
+
+ addToGetQueue();
+ mMdlScaleType = 3;
+ fn_802548A0();
+}
+
+void dAcItem_c::executeState_GetBeetle() {
+ // TODO weird double load
+ dAcPy_c *link = dAcPy_c::GetLinkM();
+ if (link == nullptr) {
+ return;
+ }
+ dAcBoomerang_c *beetlePtr = (dAcBoomerang_c *)link->vt_0x1C0();
+ if (beetlePtr == nullptr) {
+ if (link->ifHasHealthAndSomethingElse() && this == sItemListHead.get() &&
+ FileManager::sInstance->getCurrentHealth() != 0) {
+ decideOnGetOrForcedGet();
+ } else {
+ mStateMgr.changeState(StateID_WaitGet);
+ }
+ } else if (37.6f - field_0xD0C < 1.6f) {
+ // TODO what are these numbers
+ mStateMgr.changeState(StateID_WaitGet);
+ } else {
+ mVec3_c v(0.0f, 5.0f, 0.0f);
+ // This + is weird... inline?
+ v.rotY(+beetlePtr->mRotation.y);
+ mPosition = beetlePtr->mPosition + v;
+ mPosition.y += field_0xD0C;
+ fn_80255E80();
+ sLib::addCalcScaledDiff(&field_0xD0C, 37.6f, 0.1f, 10000.0f);
+ }
+}
-void dAcItem_c::initializeState_GetBeetle() {}
-void dAcItem_c::executeState_GetBeetle() {}
void dAcItem_c::finalizeState_GetBeetle() {}
-void dAcItem_c::initializeState_WaitGet() {}
-void dAcItem_c::executeState_WaitGet() {}
-void dAcItem_c::finalizeState_WaitGet() {}
+void dAcItem_c::initializeState_WaitGet() {
+ field_0xD64 = 0;
+ setObjectProperty(OBJ_PROP_0x200);
+ // TODO double load
+ dAcPy_c *link = dAcPy_c::GetLinkM();
+ if (link != nullptr) {
+ mPosition.set(link->getPosition());
+ }
+ mMdlScaleType = 1;
+ fn_802548A0();
+}
+
+void dAcItem_c::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::initializeState_Get() {}
-void dAcItem_c::executeState_Get() {}
-void dAcItem_c::finalizeState_Get() {}
+void dAcItem_c::finalizeState_WaitGet() {
+ unsetObjectProperty(OBJ_PROP_0x200);
+}
+
+void dAcItem_c::initializeState_Get() {
+ mpMdl->vt_0x10(dItemMdl_c::ITEM_MDL_UNK0x14_1);
+ performCollection();
+ if (isAnyTear()) {
+ mVec3_c tmp;
+ fn_80256710(tmp);
+ fn_80257560(tmp);
+ }
+ fn_80254D10();
+ fn_80254D70();
+ setNotWaiting();
+ field_0xD38 = field_0xD3A = field_0xD3C = 0;
+ field_0xD4D = false;
+ mMdlScaleType = 1;
+ fn_802548A0();
+}
+
+void dAcItem_c::executeState_Get() {
+ if (!fn_80254D70()) {
+ fn_802542E0();
+ } else {
+ // @bug always true
+ if (field_0xD4D < 0xFFFF) {
+ field_0xD4D++;
+ }
+ if (field_0xD4D > 12) {
+ removeFromGetQueue();
+ }
+ }
+}
+
+void dAcItem_c::finalizeState_Get() {
+ removeFromGetQueue();
+}
+
+void dAcItem_c::initializeState_WaitGetDemo() {
+ mpMdl->vt_0x10(dItemMdl_c::ITEM_MDL_UNK0x14_2);
+ setObjectProperty(OBJ_PROP_0x200);
+ setNotWaiting();
+ field_0xD38 = field_0xD3A = field_0xD3C = 0;
+ mMdlScaleType = 2;
+ fn_802548A0();
+ unsetFramesInAir();
+}
+
+void dAcItem_c::executeState_WaitGetDemo() {
+ s32 which = 0;
+ if (EventManager::isInEvent()) {
+ which = 2;
+ } else if (fn_80247BB0()) {
+ which = 2;
+ } else if ((isInsect() || isTreasure3()) && checkTreasureTempCollect(getItemId())) {
+ which = 2;
+ } else if (checkShouldDemo() && fn_80254EC0()) {
+ which = 1;
+ } else if (mFramesInAir > 10) {
+ which = 2;
+ }
+
+ switch (which) {
+ case 1: addGetEvent(); break;
+ case 2:
+ unsetObjectProperty(OBJ_PROP_0x200);
+ mStateMgr.changeState(StateID_Get);
+ break;
+ }
+ unsetFramesInAir();
+}
-void dAcItem_c::initializeState_WaitGetDemo() {}
-void dAcItem_c::executeState_WaitGetDemo() {}
void dAcItem_c::finalizeState_WaitGetDemo() {}
-void dAcItem_c::initializeState_WaitForcedGetDemo() {}
-void dAcItem_c::executeState_WaitForcedGetDemo() {}
+void dAcItem_c::initializeState_WaitForcedGetDemo() {
+ mpMdl->vt_0x10(dItemMdl_c::ITEM_MDL_UNK0x14_2);
+ setObjectProperty(OBJ_PROP_0x200);
+ setNotWaiting();
+ field_0xD38 = field_0xD3A = field_0xD3C = 0;
+ mMdlScaleType = 2;
+ fn_802548A0();
+}
+
+void dAcItem_c::executeState_WaitForcedGetDemo() {
+ if (isAnyTear() && mFramesInAir < 10) {
+ incrementFramesInAir();
+ if (mFramesInAir == 10) {
+ fn_80257560(mPosition);
+ }
+ }
+ addGetEvent();
+}
+
void dAcItem_c::finalizeState_WaitForcedGetDemo() {}
-void dAcItem_c::initializeState_GetDemo() {}
-void dAcItem_c::executeState_GetDemo() {}
-void dAcItem_c::finalizeState_GetDemo() {}
+void dAcItem_c::initializeState_GetDemo() {
+ mpMdl->vt_0x10(dItemMdl_c::ITEM_MDL_UNK0x14_2);
+ switch (getItemId()) {
+ case ITEM_FARON_GRASSHOPPER: sCollectionCurrentCount = getFaronGrasshooperCounter(); break;
+ case ITEM_WOODLAND_RHINO_BEETLE: sCollectionCurrentCount = getWoodlandRhinoBeetleCounter(); break;
+ case ITEM_DEKU_HORNET: sCollectionCurrentCount = getDekuHornetCounter(); break;
+ case ITEM_SKYLOFT_MANTIS: sCollectionCurrentCount = getSkyloftMantisCounter(); break;
+ case ITEM_VOLCANIC_LADYBUG: sCollectionCurrentCount = getVolcanicLadybugCounter(); break;
+ case ITEM_BLESSED_BUTTERFLY: sCollectionCurrentCount = getBlessedButterflyCounter(); break;
+ case ITEM_LANAYRU_ANT: sCollectionCurrentCount = getLanayruAntCounter(); break;
+ case ITEM_SAND_CICADA: sCollectionCurrentCount = getSandCicadaCounter(); break;
+ case ITEM_GERUDO_DRAGONFLY: sCollectionCurrentCount = getGerudoDragonflyCounter(); break;
+ case ITEM_ELDIN_ROLLER: sCollectionCurrentCount = getEldinRollerCounter(); break;
+ case ITEM_SKY_STAG_BEETLE: sCollectionCurrentCount = getSkyStagBeetleCounter(); break;
+ case ITEM_STARRY_FIREFLY: sCollectionCurrentCount = getStarryFireflyCounter(); break;
+ case ITEM_HORNET_LARVAE: sCollectionCurrentCount = getHornetLarvaeCounter(); break;
+ case ITEM_BIRD_FEATHER: sCollectionCurrentCount = getBirdFeatherCounter(); break;
+ case ITEM_TUMBLE_WEED: sCollectionCurrentCount = getTumbleWeedCounter(); break;
+ case ITEM_LIZARD_TAIL: sCollectionCurrentCount = getLizardTailCounter(); break;
+ case ITEM_ELDIN_ORE: sCollectionCurrentCount = getEldinOreCounter(); break;
+ case ITEM_ANCIENT_FLOWER: sCollectionCurrentCount = getAncientFlowerCounter(); break;
+ case ITEM_AMBER_RELIC: sCollectionCurrentCount = getAmberRelicCounter(); break;
+ case ITEM_DUSK_RELIC: sCollectionCurrentCount = getDuskRelicCounter(); break;
+ case ITEM_JELLY_BLOB: sCollectionCurrentCount = getJellyBlobCounter(); break;
+ case ITEM_MONSTER_CLAW: sCollectionCurrentCount = getMonsterClawCounter(); break;
+ case ITEM_MONSTER_HORN: sCollectionCurrentCount = getMonsterHornCounter(); break;
+ case ITEM_ORNAMENTAL_SKULL: sCollectionCurrentCount = getSkullCounter(); break;
+ case ITEM_EVIL_CRYSTAL: sCollectionCurrentCount = getEvilCrystalCounter(); break;
+ case ITEM_BLUE_BIRD_FEATHER: sCollectionCurrentCount = getBlueBirdFeatherCounter(); break;
+ case ITEM_GOLDEN_SKULL: sCollectionCurrentCount = getGoldenSkullCounter(); break;
+ case ITEM_GODDESS_PLUME: sCollectionCurrentCount = getGoddessPlumeCounter(); break;
+ }
+
+ performCollectionPart1();
+ if (checkItemFlagV()) {
+ if (isAnyTear()) {
+ dAcOWarp_c *warp = static_cast<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::fn_80255F40;
+ } else {
+ mFn_0xC9C = &dAcItem_c::fn_80255E80;
+ }
+}
+
+void dAcItem_c::executeState_GetDemo() {
+ switch (mEventRelated.getCurrentEventCommand()) {
+ case 'act0': mEventRelated.advanceNext(); break;
+ case 'wait': mEventRelated.advanceNext(); break;
+ case 'halo': {
+ mVec3_c efPos;
+ fn_80254590(efPos);
+ mVec3_c diff = dScGame_c::getCamera()->getPosition() - mPosition;
+ // TODO close but an extsh is missing
+ mAng3_c rot((s32)-diff.atan2sY_XZ(), (s32)diff.atan2sX_Z(), 0);
+ u32 alpha = 0xFF;
+ if (dScGame_c::currentSpawnInfo.getTrial() == SpawnInfo::TRIAL) {
+ alpha = 0x80;
+ }
+ mEff_0x95C.holdEffect(PARTICLE_RESOURCE_ID_MAPPING_82_, efPos, &rot, nullptr, nullptr, nullptr);
+ mEff_0x95C.setGlobalAlpha(alpha);
+ mEventRelated.advanceNext();
+ break;
+ }
+ case '????': break;
+ default: mEventRelated.advanceNext(); break;
+ }
+
+ if (!checkObjectProperty(OBJ_PROP_0x200)) {
+ mPosition = getLinkPtr()->vt_0x1A4();
+ if (isUpgradedPotion((ITEM_ID)getItemId())) {
+ fn_80254680();
+ } else if (isAnyTear()) {
+ fn_80254810();
+ }
+ mbShowItemLighting = true;
+ field_0x340 = mPosition;
+ (this->*mFn_0xC9C)();
+ if (!isGratitudeCrystal() && !is5GratitudeCrystals()) {
+ mMdlRotY += getItemRotateAngle();
+ }
+ field_0xD42 = mAng::d2s_c(0.0f);
+
+ // TODO - ...
+ }
+ makeLinkLookTowardItem();
+}
+
+void dAcItem_c::finalizeState_GetDemo() {
+ mMdlRotY = 0;
+ field_0xD42 = 0;
+ performCollectionPart2();
+ mbShowItemLighting = false;
+ if (mEff_0x95C.hasEmitters()) {
+ mEff_0x95C.remove(true);
+ }
+ if (isAnyTear() && mEff_0xA60.hasEmitters()) {
+ mEff_0xA60.remove(true);
+ }
+}
+
+void dAcItem_c::initializeState_WaitTBoxGetDemo() {
+ mpMdl->vt_0x10(dItemMdl_c::ITEM_MDL_UNK0x14_2);
+ setNotWaiting();
+ field_0xD38 = field_0xD3A = field_0xD3C = 0;
+ setObjectProperty(OBJ_PROP_0x200);
+ mMdlScaleType = 2;
+ fn_802548A0();
+}
+
+void dAcItem_c::executeState_WaitTBoxGetDemo() {
+ const char *name;
+ getItemGetEventName(getItemId(), &name);
+ Event ev(name, 1, 0x100001, (void *)itemGetEventStart, (void *)itemGetEventEnd);
+ EventManager::alsoSetAsCurrentEvent(this, &ev, nullptr);
+}
-void dAcItem_c::initializeState_WaitTBoxGetDemo() {}
-void dAcItem_c::executeState_WaitTBoxGetDemo() {}
void dAcItem_c::finalizeState_WaitTBoxGetDemo() {}
-void dAcItem_c::initializeState_ResurgeWait() {}
-void dAcItem_c::executeState_ResurgeWait() {}
+void dAcItem_c::initializeState_ResurgeWait() {
+ mpMdl->vt_0x10(dItemMdl_c::ITEM_MDL_UNK0x14_1);
+ // TODO FPR swap
+ mPosition = mPositionCopy;
+ mRotation = mRotationCopy;
+ field_0xB3C->fn_802579D0();
+ setNotWaiting();
+ // TODO ???
+ mbNoGravity = mbNoDespawn;
+ field_0xD38 = field_0xD3A = field_0xD3C = 0;
+ mMdlScaleType = 0;
+ field_0xCD8 = 0.0f;
+}
+
+void dAcItem_c::executeState_ResurgeWait() {
+ if (field_0xB3C->fn_80257A10(this)) {
+ if (!field_0xB3C->fn_80257B10()) {
+ field_0xB3C->fn_80257AC0();
+ if (field_0xB3C->fn_80257B10()) {
+ if (mId == ITEM_STAMINA_FRUIT) {
+ startSound(SE_O_REFRESH_FRUIT_SPROUT);
+ }
+ mStateMgr.changeState(StateID_Wait);
+ }
+ }
+ } else {
+ field_0xB3C->fn_80257A80();
+ }
+}
+
void dAcItem_c::finalizeState_ResurgeWait() {}
-void dAcItem_c::initializeState_WaitTurnOff() {}
-void dAcItem_c::executeState_WaitTurnOff() {}
+void dAcItem_c::initializeState_WaitTurnOff() {
+ setNotWaiting();
+ setObjectProperty(OBJ_PROP_0x200);
+ mSpeed = 0.0f;
+ mVelocity.set(0.0f, 0.0f, 0.0f);
+ field_0xD38 = field_0xD3A = field_0xD3C = 0;
+ mMdlScaleType = 2;
+}
+
+void dAcItem_c::executeState_WaitTurnOff() {
+ if (field_0xD04 <= 0.0f) {
+ deleteRequest();
+ }
+}
+
void dAcItem_c::finalizeState_WaitTurnOff() {}
-void dAcItem_c::initializeState_WaitSacredDewGetEffect() {}
-void dAcItem_c::executeState_WaitSacredDewGetEffect() {}
+void dAcItem_c::initializeState_WaitSacredDewGetEffect() {
+ setNotWaiting();
+ setObjectProperty(OBJ_PROP_0x200);
+ mSpeed = 0.0f;
+ mVelocity.set(0.0f, 0.0f, 0.0f);
+ field_0xD38 = field_0xD3A = field_0xD3C = 0;
+ mMdlScaleType = 2;
+}
+
+void dAcItem_c::executeState_WaitSacredDewGetEffect() {
+ if (!EventManager::isInEvent()) {
+ mVec3_c tmp;
+ fn_80247540(tmp);
+ fn_80247560(tmp);
+ mStateMgr.changeState(StateID_WaitTurnOff);
+ }
+}
+
void dAcItem_c::finalizeState_WaitSacredDewGetEffect() {}
STATE_DEFINE(dAcItem_c, Wait);
@@ -1443,3 +2132,276 @@ STATE_DEFINE(dAcItem_c, WaitTBoxGetDemo);
STATE_DEFINE(dAcItem_c, ResurgeWait);
STATE_DEFINE(dAcItem_c, WaitTurnOff);
STATE_DEFINE(dAcItem_c, WaitSacredDewGetEffect);
+
+void dAcItem_c::itemGetEventStart(dAcBase_c *arg) {
+ // TODO
+ dAcItem_c *item = static_cast<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 (isGratitudeCrystal()) {
+ increaseGratitudeCrystalCounter(1);
+ } else if (is5GratitudeCrystals()) {
+ increaseGratitudeCrystalCounter(5);
+ } else if (id == ITEM_EXTRA_WALLET) {
+ increaseExtraWalletCounter(1);
+ }
+ break;
+ }
+ }
+ }
+
+ if (mStateMgr.isState(StateID_GetDemo)) {
+ sIsPerformingInitialCollection = !checkFlagV();
+ }
+
+ bool doCollect = true;
+ if (ITEM_FARON_GRASSHOPPER <= mId && mId <= ITEM_STARRY_FIREFLY &&
+ MinigameManager::isInMinigameState(MinigameManager::INSECT_CAPTURE)) {
+ doCollect = false;
+ }
+ if (doCollect) {
+ setFlagV();
+ }
+ setSceneFlag();
+ setDungeonFlag();
+
+ if (getSubtypeFromParam(mParams) == 7) {
+ return;
+ }
+
+ if (isGreenRupee()) {
+ dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_RUPEE_GREEN);
+ } else if (isBlueRupee()) {
+ dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_RUPEE_BLUE);
+ } else if (isRedRupee()) {
+ dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_RUPEE_RED);
+ } else if (isSilverRupee()) {
+ dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_RUPEE_SILVER);
+ } else if (isGoldRupee()) {
+ dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_RUPEE_BLUE);
+ } else if (isRupoor()) {
+ dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_RUPEE_BABA);
+ } else if (isHeartV()) {
+ dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_HEART_PIECE_GET);
+ } else if (isAnyTear()) {
+ dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SIREN_GET_SHINE_DEW);
+ } else if (mId == ITEM_STAMINA_FRUIT) {
+ dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_REFRESH_FRUIT);
+ } else if (isLightFruit()) {
+ dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_SIREN_GET_HOLY_FRUIT);
+ } else if (mId == ITEM_5_DEKU_SEEDS || is10DekuSeeds()) {
+ dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_CONSUMP_ITEM_GET);
+ } else if (isAnyArrow()) {
+ dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_CONSUMP_ITEM_GET);
+ } else if (isAnyBombs()) {
+ dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_CONSUMP_ITEM_GET);
+ } else if (isInsect()) {
+ dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_MATERIAL);
+ } else if (isTreasureV()) {
+ dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_MATERIAL);
+ } else if (is5GratitudeCrystals() || isGratitudeCrystal()) {
+ if ((mItemFlags & 0x20) == 0) {
+ dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_SOURCE_OUTWELL);
+ }
+ } else if (isBabyRattle()) {
+ dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_GARAGARA);
+ } else if (isLifeTreeFruit()) {
+ dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_LIFE_FRUIT);
+ } else if (mId == ITEM_HEART_CONTAINER) {
+ dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_HEART_CONTAINER);
+ } else if (isTriforce()) {
+ dSndSmallEffectMgr_c::GetInstance()->playSound(SE_S_GET_TRIFORCE);
+ }
+}
+
+void dAcItem_c::performCollectionPart2() {
+ u16 id = getItemId();
+ if (id == ITEM_SMALL_KEY) {
+ increaseSmallKeyCounter(1);
+ } else if (id == ITEM_GREEN_RUPEE) {
+ if (!MinigameManager::isInMinigameState(MinigameManager::THRILL_DIGGER)) {
+ increaseRupeeCounter(1);
+ }
+ } else if (id == ITEM_BLUE_RUPEE) {
+ if (!MinigameManager::isInMinigameState(MinigameManager::THRILL_DIGGER)) {
+ increaseRupeeCounter(5);
+ }
+ } else if (id == ITEM_RED_RUPEE) {
+ if (!MinigameManager::isInMinigameState(MinigameManager::THRILL_DIGGER)) {
+ increaseRupeeCounter(20);
+ }
+ } else if (isHeartV()) {
+ healLink(4, true);
+ } else if (id == ITEM_SINGLE_ARROW) {
+ increaseArrowAndPouchCounter(1);
+ } else if (id == ITEM_BUNDLE_ARROWS) {
+ increaseArrowAndPouchCounter(10);
+ } else if (id == ITEM_SILVER_RUPEE) {
+ if (!MinigameManager::isInMinigameState(MinigameManager::THRILL_DIGGER)) {
+ increaseRupeeCounter(100);
+ }
+ } else if (id == ITEM_GOLD_RUPEE) {
+ if (!MinigameManager::isInMinigameState(MinigameManager::THRILL_DIGGER)) {
+ increaseRupeeCounter(300);
+ }
+ } else if (id == ITEM_RUPOOR) {
+ if (!MinigameManager::isInMinigameState(MinigameManager::THRILL_DIGGER)) {
+ increaseRupeeCounter(-10);
+ }
+ } else if (id == ITEM_5_BOMBS) {
+ increaseBombAndPouchCounter(5);
+ } else if (id == ITEM_10_BOMBS) {
+ increaseBombAndPouchCounter(10);
+ } else if (mId == ITEM_STAMINA_FRUIT) {
+ restoreStamina();
+ } else if (id == ITEM_5_DEKU_SEEDS) {
+ increaseDekuSeedAndPouchCounter(5);
+ } else if (is10DekuSeeds()) {
+ increaseDekuSeedAndPouchCounter(10);
+ } else if (id == ITEM_POUCH_EXPANSION) {
+ increaseExtraPouchCounter(1);
+ } else if (id == ITEM_HEART_CONTAINER) {
+ increaseHealthCapacity(getHeartContainerHeartIncrease());
+ doFullHeal();
+ } else if (isHeartPiece()) {
+ if (getNumRemainingHeartPiecesForNextHeart() == 0) {
+ increaseHealthCapacity(getCompletedHeartPieceHeartIncrease());
+ }
+ doFullHeal();
+ } else if (id == ITEM_LIFE_TREE_SEED) {
+ setLifeTreeSeedlingFlag(1);
+ } else if (id == ITEM_BOW || id == ITEM_IRON_BOW || id == ITEM_SACRED_BOW) {
+ if (!checkFlagV()) {
+ increaseArrowCounter(getBowArrowCapacity() - getBowArrowCount());
+ }
+ } else if (id == ITEM_SLINGSHOT || id == ITEM_MIGHTY_SCATTERSHOT) {
+ if (!checkFlagV()) {
+ increaseDekuSeedCounter(getSlingshotSeedCapacity() - getSlingshotSeedCount());
+ }
+ } else if (isAnyPouchItem((ITEM_ID)id)) {
+ if (mGetItemPouchSlot == -1) {
+ collectPouchItem(id);
+ } else {
+ collectPouchItemIntoSlot(mGetItemPouchSlot, id, -1, false);
+ }
+ }
+
+ if (MinigameManager::isInMinigameState(MinigameManager::INSECT_CAPTURE) &&
+ dTgMinigameInsectCapture_c::GetInstance() != nullptr) {
+ dTgMinigameInsectCapture_c::GetInstance()->recordCollectedInsect(mId, mItemQuantity != 0 ? mItemQuantity : 1);
+ }
+}