diff options
| author | robojumper <robojumper@gmail.com> | 2026-05-02 18:21:12 +0200 |
|---|---|---|
| committer | robojumper <robojumper@gmail.com> | 2026-05-10 20:05:47 +0200 |
| commit | 6046f9bd7cb506cfff17aa1327a3f135867c8ed5 (patch) | |
| tree | 3713e0e382f118b6cd111e4f706e7331bd379db4 /src/d | |
| parent | f0d98002982bfed70817a0d2c110c55dd7b55231 (diff) | |
dAcItem_c::{create, createHeap} OK
Diffstat (limited to 'src/d')
| -rw-r--r-- | src/d/a/d_a_base.cpp | 8 | ||||
| -rw-r--r-- | src/d/a/d_a_item.cpp | 719 |
2 files changed, 708 insertions, 19 deletions
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..8bbda693 100644 --- a/src/d/a/d_a_item.cpp +++ b/src/d/a/d_a_item.cpp @@ -1,12 +1,28 @@ #include "d/a/d_a_item.h" +#include "c/c_math.h" #include "common.h" #include "d/a/d_a_itembase.h" +#include "d/col/bg/d_bg_s.h" +#include "d/col/cc/d_cc_d.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 "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 "m/m_vec.h" #include "toBeSorted/dowsing_target.h" -#include "toBeSorted/file_manager.h" +#include "toBeSorted/event_manager.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" const ItemFlagStruct dAcItemBase_c::sDefaultFlagStruct = {0x28, 0x3C, 0x1E, 0xFF, 0x0000, 0x02, 0x01}; const ItemFlagStruct dAcItemBase_c::sItemFlagStructs[167] = { @@ -219,6 +235,42 @@ const u32 dAcItemBase_c::sItemTypeFlags[MAX_ITEM_ID - 1] = { 0xFFFF, 0x0, 0x0, 0x0, 0x0, 0x0, }; +static const dCcD_SrcCyl sSrcCyl = { + {{0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, 0}, + {~(AT_TYPE_BEETLE | AT_TYPE_0x80000 | AT_TYPE_0x8000 | AT_TYPE_WIND), + 0x111, + {0, 0x08, 0x407}, + 0, + 0}, + {0xE9}}, + {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); } @@ -306,18 +358,22 @@ fLiMgBa_c dAcItem_c::sItemList; 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 mVec3_c dAcItem_c::sFreestandingDowsingOffset(0.0f, 25.0f, 0.0f); + +const dAcItem_c::sStaticPtmf dAcItem_c::sStaticPtmfs[] = { + &dAcItem_c::fn_80248020, + nullptr, + &dAcItem_c::fn_80248010, + nullptr, + &dAcItem_c::fn_80255B30, + &dAcItem_c::fn_80255BA0, + &dAcItem_c::fn_80248040, + nullptr, + &dAcItem_c::fn_80248030, + nullptr, + &dAcItem_c::fn_80255BD0, + &dAcItem_c::fn_80255C40, +}; dAcItem_c::dAcItem_c() : mStateMgr(*this), @@ -360,14 +416,649 @@ dAcItem_c::dAcItem_c() sItemList.append(&mNode); mTargetFiRelated = 3; } + dAcItem_c::~dAcItem_c() { delete field_0xB3C; for (int i = 0; i < 2; i++) { delete field_0xB34[i]; } + delete mpMdl; mDowsingTarget.doUnregister(); } +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; + } + + field_0xB34[0] = new dAcItem_0xB34_1(); + if (field_0xB34[0] == nullptr) { + return false; + } + field_0xB34[1] = new dAcItem_0xB34_2(); + if (field_0xB34[1] == nullptr) { + return false; + } + + if (getItemInitStruct()->_0x00[6] != 0) { + field_0xB3C = new dAcItem_0xB3C_2(getItemInitStruct()->_0x00[4], getItemInitStruct()->_0x00[5]); + if (mId == ITEM_STAMINA_FRUIT) { + // TODO ... + field_0xB3C->vt_0x0C(150 /* 0x96 */); + } else if (isLightFruit()) { + field_0xB3C->vt_0x0C(0 /* 0x0 */); + } + } else { + field_0xB3C = new dAcItem_0xB3C_1(getItemInitStruct()->_0x00[4], getItemInitStruct()->_0x00[5]); + } + + if (field_0xB3C == nullptr) { + return false; + } + + return true; +} + +// TODO this function pools .data but doesn't pool .bss for some reason +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 (isHeart2()) { + mFunc_0xB58 = &dAcItem_c::fn_802555F0; + } else { + mFunc_0xB58 = &dAcItem_c::fn_802555D0; + } + + if (isAnyRupee()) { + mFnBounce = &dAcItem_c::bounceRupee; + } else if (isHeart2()) { + 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() && !isHeart2() && mId != ITEM_STAMINA_FRUIT) { + mCyl.SetTg_0x4C(0x6480); + } + + if (isBabyRattle()) { + mCyl.SetTgInfo_0x1(0x13); + } else if (isHeartPiece()) { + mCyl.SetTgInfo_0x1(0x15); + } else if (!isAnyRupee() && !isHeart2() && 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(); + } + + // These need to not pool... + 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 (isHeart2()) { + mFn_0xCB4 = &dAcItem_c::fn_802577C0; + } else { + mFn_0xCB4 = &dAcItem_c::fn_802577D0; + } + + if (mbNoDespawn) { + dBgS::GetInstance()->SetLightingCode(this, 10.0f); + } else if (isHeart2()) { + mLinkage.bushTpFunc(mObjAcch); + } + + if (isHeart2()) { + field_0xD20 = 6; + } + + if (isAnyTear()) { + mSomeStr = "force"; + } + + if (isAnyTear()) { + s32 type = getTearSubtype((ITEM_ID)mId); + if (type == TEAR_MAX) { + type = TEAR_0; + } + 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) { + // ((getFirstBitParams2__9dAcBase_cCFv((dAcBase_c *) this) << 8) & 0x100 & ~1) | (((u32) this->unk4 >> 0x13U) & 1) + + 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")) { + fn_8024DF30(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 + fn_8024DF30(mItemFlags | 0x80); + } + + field_0xD48 = cM::rndInt(0x10000); + mColorFilter.r = 0; + mColorFilter.g = 0; + mColorFilter.b = 0; + mLightLevelMaybe = 0.0f; + + return SUCCEEDED; +} + +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::initializeState_Wait() {} void dAcItem_c::executeState_Wait() {} void dAcItem_c::finalizeState_Wait() {} |
