From c9485926d68d47bfc790fe1e7dddeba33b0e5bbe Mon Sep 17 00:00:00 2001 From: LagoLunatic Date: Sat, 14 Oct 2023 23:30:07 -0400 Subject: [PATCH] d_a_item 98% --- include/JSystem/JParticle/JPAEmitter.h | 1 + include/SSystem/SComponent/c_math.h | 19 +- include/d/actor/d_a_item.h | 38 +- include/d/actor/d_a_itembase.h | 13 +- include/d/d_bg_s_gnd_chk.h | 4 +- include/d/d_com_inf_game.h | 10 +- include/d/d_detect.h | 2 +- src/d/actor/d_a_item.cpp | 629 +++++++++++++++++++++---- 8 files changed, 603 insertions(+), 113 deletions(-) diff --git a/include/JSystem/JParticle/JPAEmitter.h b/include/JSystem/JParticle/JPAEmitter.h index 893ad4ed2..7277afce6 100644 --- a/include/JSystem/JParticle/JPAEmitter.h +++ b/include/JSystem/JParticle/JPAEmitter.h @@ -113,6 +113,7 @@ public: JPASetRMtxTVecfromMtx(mtx, mGlobalRotation, mGlobalTranslation); } void setGlobalTranslation(f32 x, f32 y, f32 z) { mGlobalTranslation.set(x, y, z); } + void setGlobalTranslation(const JGeometry::TVec3& trans) { mGlobalTranslation.set(trans); } void setGlobalScale(const JGeometry::TVec3& scale) { mGlobalDynamicsScale.set(scale); mGlobalParticleScale.set(scale); diff --git a/include/SSystem/SComponent/c_math.h b/include/SSystem/SComponent/c_math.h index fac1f5a4f..60ff8da27 100644 --- a/include/SSystem/SComponent/c_math.h +++ b/include/SSystem/SComponent/c_math.h @@ -8,9 +8,24 @@ u16 U_GetAtanTable(float, float); s16 cM_atan2s(float y, float x); float cM_atan2f(float y, float x); void cM_initRnd(int, int, int); + +/** + * Returns a pseudo-random float between 0.0f and 1.0f. + */ float cM_rnd(void); -float cM_rndF(float); -float cM_rndFX(float); + +/** + * Returns a pseudo-random float between 0.0f and max. + * @param max The maximum value + */ +float cM_rndF(float max); + +/** + * Returns a pseudo-random float between -max and max. + * @param max The maximum value + */ +float cM_rndFX(float max); + void cM_initRnd2(int, int, int); float cM_rnd2(void); float cM_rndF2(float); diff --git a/include/d/actor/d_a_item.h b/include/d/actor/d_a_item.h index 12dfc2d45..0cd692f8a 100644 --- a/include/d/actor/d_a_item.h +++ b/include/d/actor/d_a_item.h @@ -9,6 +9,18 @@ class daItem_c : public daItemBase_c { public: typedef void (daItem_c::*daItem_c_ModeFunc)(); + enum State { + STATE_WAIT_MAIN = 0x2, + STATE_BRING_NEZUMI = 0x3, + STATE_INIT_NORMAL = 0x5, + STATE_MAIN_NORMAL = 0x6, + STATE_INIT_GET_DEMO = 0x7, + STATE_WAIT_GET_DEMO = 0x8, + STATE_MAIN_GET_DEMO = 0x9, + STATE_WAIT_BOSS1 = 0xA, + STATE_WAIT_BOSS2 = 0xB, + }; + float getYOffset(); void set_mtx(); void set_mtx_base(J3DModel*, cXyz, csXyz); @@ -33,12 +45,12 @@ public: BOOL checkItemDisappear(); void setItemTimer(int); BOOL checkPlayerGet(); - void itemActionForRupee(); - void itemActionForHeart(); - void itemActionForKey(); - void itemActionForEmono(); - void itemActionForSword(); - void itemActionForArrow(); + BOOL itemActionForRupee(); + BOOL itemActionForHeart(); + BOOL itemActionForKey(); + BOOL itemActionForEmono(); + BOOL itemActionForSword(); + BOOL itemActionForArrow(); void checkWall(); void set_bound_se(); BOOL checkGetItem(); @@ -47,7 +59,7 @@ public: void mode_water_init(); void mode_wait(); void mode_water(); - void initAction(); + BOOL initAction(); BOOL _daItem_isdelete(); s32 checkControl(); @@ -67,18 +79,20 @@ public: /* 0x64C */ s32 mActivationSwitch; /* 0x650 */ f32 field_0x650; /* 0x654 */ s16 field_0x654; - /* 0x656 */ s16 field_0x656; - /* 0x658 */ s16 mItemTimer; + /* 0x656 */ s16 mTargetAngleX; + /* 0x658 */ s16 mDisappearTimer; /* 0x65A */ s16 field_0x65a; /* 0x65C */ s16 field_0x65c; /* 0x65E */ s16 mExtraZRot; - /* 0x660 */ u8 field_0x660[0x667 - 0x660]; + /* 0x660 */ s16 field_0x660; + /* 0x662 */ u8 field_0x662[0x666 - 0x662]; + /* 0x666 */ u8 field_0x666; /* 0x667 */ u8 mType; /* 0x668 */ u8 mAction; - /* 0x669 */ u8 mStatusFlags; + /* 0x669 */ u8 mStatusFlags; // TODO rename this /* 0x66A */ u8 mMode; /* 0x66B */ u8 mCurState; - /* 0x66C */ u8 field_0x66c; + /* 0x66C */ u8 mOnGroundTimer; /* 0x66D */ u8 field_0x66D[0x670 - 0x66D]; /* 0x670 */ u32 mDemoItemBsPcId; /* 0x674 */ dPa_rippleEcallBack mPtclRippleCb; diff --git a/include/d/actor/d_a_itembase.h b/include/d/actor/d_a_itembase.h index c6279c2ec..d3904d8cc 100644 --- a/include/d/actor/d_a_itembase.h +++ b/include/d/actor/d_a_itembase.h @@ -20,16 +20,21 @@ struct daItemBase_c_m_data { /* 0x14 */ s16 field_0x14; /* 0x16 */ s16 mDuration; /* 0x18 */ s16 field_0x18; - /* 0x1A */ u8 field_0x1A[0x1C - 0x1A]; + /* 0x1A */ s16 field_0x1A; /* 0x1C */ s16 mNumFramesPerFullSpin; - /* 0x1E */ u8 field_0x1E[0x2A - 0x1E]; + /* 0x1E */ u8 field_0x1E[0x20 - 0x1E]; + /* 0x20 */ f32 field_0x20; + /* 0x24 */ f32 field_0x24; + /* 0x28 */ s16 field_0x28; /* 0x2A */ s16 mHeartMaxRandomZRot; - /* 0x2C */ u8 field_0x2C[0x38 - 0x2C]; + /* 0x2C */ f32 field_0x2C; + /* 0x30 */ f32 field_0x30; + /* 0x34 */ u8 field_0x34[0x38 - 0x34]; /* 0x38 */ f32 mPickedUpInitialSpeedY; /* 0x3C */ f32 mPickedUpGravity; /* 0x40 */ s16 field_0x40; /* 0x42 */ s16 field_0x42; - /* 0x44 */ void* field_0x44; + /* 0x44 */ f32 field_0x44; /* 0x48 */ f32 mVelocityScale; }; diff --git a/include/d/d_bg_s_gnd_chk.h b/include/d/d_bg_s_gnd_chk.h index b277f033e..39f3aaf12 100644 --- a/include/d/d_bg_s_gnd_chk.h +++ b/include/d/d_bg_s_gnd_chk.h @@ -30,12 +30,12 @@ public: class dBgS_ObjGndChk_Yogan : public dBgS_ObjGndChk { public: - /* 806bf6a4 */ dBgS_ObjGndChk_Yogan() { + dBgS_ObjGndChk_Yogan() { OffNormalGrp(); OnYoganGrp(); } - /* 806bf53c */ virtual ~dBgS_ObjGndChk_Yogan(); + virtual ~dBgS_ObjGndChk_Yogan() {} }; // Size: 0x54 class dBgS_ObjGndChk_Wtr : public dBgS_ObjGndChk { diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index 4807675a3..e551580cd 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -619,8 +619,10 @@ STATIC_ASSERT(sizeof(dComIfG_inf_c) == 0x1D1C8); extern dComIfG_inf_c g_dComIfG_gameInfo; -extern JUtility::TColor g_saftyWhiteColor; +extern JUtility::TColor g_clearColor; extern JUtility::TColor g_blackColor; +extern JUtility::TColor g_whiteColor; +extern JUtility::TColor g_saftyWhiteColor; /** * === SAVE === @@ -2033,6 +2035,12 @@ inline void dComIfGp_particle_setStripes(u16 particleID, const cXyz* pos, const pParticle->setNormalStripes(particleID, pos, angle, scale, param_4, param_5); } +inline void dComIfGp_particle_setSimple(u16 particleID, cXyz* pos, u8 alpha, GXColor& prmColor, + GXColor& envColor, int param_6) { + dPa_control_c* pParticle = g_dComIfG_gameInfo.play.getParticle(); + pParticle->setSimple(particleID, pos, alpha, prmColor, envColor, param_6); +} + inline void dComIfGp_particle_calc3D() { g_dComIfG_gameInfo.play.getParticle()->calc3D(); } diff --git a/include/d/d_detect.h b/include/d/d_detect.h index 3395494d2..61d15dfa4 100644 --- a/include/d/d_detect.h +++ b/include/d/d_detect.h @@ -15,7 +15,7 @@ public: ~dDetect_c(); void proc(); - void chk_quake(const cXyz*) const; + bool chk_quake(const cXyz*) const; void set_quake(const cXyz*); void chk_quake_area(const cXyz*) const; void search_tag_light(void*, void*); diff --git a/src/d/actor/d_a_item.cpp b/src/d/actor/d_a_item.cpp index e251ff0d0..2e7b567f1 100644 --- a/src/d/actor/d_a_item.cpp +++ b/src/d/actor/d_a_item.cpp @@ -8,15 +8,15 @@ #include "d/actor/d_a_itembase_static.h" #include "d/actor/d_a_item.h" #include "d/actor/d_a_player_link.h" +#include "d/actor/d_a_sea.h" #include "d/d_com_inf_game.h" #include "JSystem/JKernel/JKRHeap.h" #include "d/d_procname.h" #include "m_Do/m_Do_mtx.h" #include "f_op/f_op_camera_mng.h" +#include "m_Do/m_Do_controller_pad.h" #include "dolphin/types.h" -class dCcD_GObjInf; - // Needed for the .data section to match. static f32 dummy1[3] = {1.0f, 1.0f, 1.0f}; static f32 dummy2[3] = {1.0f, 1.0f, 1.0f}; @@ -39,7 +39,7 @@ cXyz setArrowTrans(s16 yRot, cXyz offset) { /* 800F4C4C-800F4CD8 .text getYOffset__8daItem_cFv */ float daItem_c::getYOffset() { switch (m_itemNo) { - case HEART: + case BOKO_BELT: return 0.0f; case SKULL_NECKLACE: return 0.0f; @@ -47,18 +47,22 @@ float daItem_c::getYOffset() { return 0.0f; case GOLDEN_FEATHER: return 0.0f; - case BOKO_BELT: - return 0.0f; case RED_JELLY: case GREEN_JELLY: case BLUE_JELLY: return 0.0f; + case SMALL_KEY: + case BOSS_KEY: + return 0.0f; case SHIELD: return 23.0f; case SWORD: return 20.0f; case DROPPED_SWORD: return 10.0f; + case KAKERA_HEART: + case UTUWA_HEART: + return 0.0f; case GREEN_RUPEE: case BLUE_RUPEE: case YELLOW_RUPEE: @@ -67,11 +71,7 @@ float daItem_c::getYOffset() { case ORANGE_RUPEE: case SILVER_RUPEE: return 0.0f; - case KAKERA_HEART: - case UTUWA_HEART: - return 0.0f; - case SMALL_KEY: - case BOSS_KEY: + case HEART: return 0.0f; default: return 0.0f; @@ -158,7 +158,7 @@ void daItem_c::CreateInit() { mCyl.SetR(radius); mCyl.SetH(height); - mItemTimer = getData()->mDuration; + mDisappearTimer = getData()->mDuration; field_0x65a = getData()->field_0x18; field_0x650 = speedPtr->y; mCurState = 0; @@ -181,14 +181,10 @@ void daItem_c::CreateInit() { case BOMB_10: case BOMB_20: case BOMB_30: - mScaleTarget.x = 0.6f; - mScaleTarget.y = 0.6f; - mScaleTarget.z = 0.6f; + mScaleTarget.setAll(0.6f); break; default: - mScaleTarget.x = 1.0f; - mScaleTarget.y = 1.0f; - mScaleTarget.z = 1.0f; + mScaleTarget.setAll(1.0f); break; } @@ -271,7 +267,7 @@ BOOL daItem_c::_daItem_execute() { mAttentionInfo.mPosition = current.pos; switch (mCurState) { - case 3: + case STATE_BRING_NEZUMI: execBringNezumi(); break; case 0: @@ -281,25 +277,25 @@ BOOL daItem_c::_daItem_execute() { } else { mCurState = 0; } - case 2: + case STATE_WAIT_MAIN: execWaitMain(); break; - case 5: + case STATE_INIT_NORMAL: execInitNormalDirection(); - case 6: + case STATE_MAIN_NORMAL: execMainNormalDirection(); break; - case 7: + case STATE_INIT_GET_DEMO: execInitGetDemoDirection(); break; - case 8: + case STATE_WAIT_GET_DEMO: execWaitGetDemoDirection(); break; - case 9: + case STATE_MAIN_GET_DEMO: execMainGetDemoDirection(); break; - case 0xA: - case 0xB: + case STATE_WAIT_BOSS1: + case STATE_WAIT_BOSS2: execWaitMainFromBoss(); break; } @@ -374,7 +370,7 @@ void daItem_c::execInitNormalDirection() { mpParticleEmitter = NULL; } - mCurState = 6; + mCurState = STATE_MAIN_NORMAL; } /* 800F5AFC-800F5BC8 .text execMainNormalDirection__8daItem_cFv */ @@ -409,7 +405,7 @@ void daItem_c::execInitGetDemoDirection() { fopAcM_orderItemEvent(this); mEvtInfo.onCondition(dEvtCnd_CANGETITEM_e); mDemoItemBsPcId = fopAcM_createItemForTrBoxDemo(¤t.pos, m_itemNo, -1, current.roomNo, NULL, NULL); - mCurState = 8; + mCurState = STATE_WAIT_GET_DEMO; } } @@ -418,7 +414,7 @@ void daItem_c::execWaitGetDemoDirection() { hide(); if (mEvtInfo.checkCommandItem()) { - mCurState = 9; + mCurState = STATE_MAIN_GET_DEMO; if (mDemoItemBsPcId != -1) { dComIfGp_event_setItemPartnerId(mDemoItemBsPcId); } @@ -463,7 +459,7 @@ void daItem_c::execWaitMain() { cLib_chaseF(&mScale.z, mScaleTarget.z, temp3); } - if (checkItemDisappear() && mItemTimer == 0) { + if (checkItemDisappear() && mDisappearTimer == 0) { if (field_0x65a == 0) { fopAcM_delete(this); } @@ -490,7 +486,7 @@ void daItem_c::execWaitMainFromBoss() { } mode_proc_call(); - if (mCurState != 0xB) { + if (mCurState != STATE_WAIT_BOSS2) { scaleAnimFromBossItem(); } @@ -583,10 +579,10 @@ bool Reflect(cXyz& surfVec, cXyz* moveVec, f32 param_2, f32 xzMult) { /* 800F6434-800F6D24 .text itemGetExecute__8daItem_cFv */ void daItem_c::itemGetExecute() { - if (mCurState == 5) { + if (mCurState == STATE_INIT_NORMAL) { return; } - mCurState = 5; + mCurState = STATE_INIT_NORMAL; switch (m_itemNo) { case HEART: @@ -621,13 +617,13 @@ void daItem_c::itemGetExecute() { mDoAud_seStart(JA_SE_RED_LUPY_GET, NULL, 0, 0); execItemGet(m_itemNo); break; - case UTUWA_HEART: - mDoAud_seStart(JA_SE_HEART_PIECE, NULL, 0, 0); - mCurState = 7; - break; case KAKERA_HEART: mDoAud_seStart(JA_SE_HEART_PIECE, NULL, 0, 0); - mCurState = 7; + mCurState = STATE_INIT_GET_DEMO; + break; + case UTUWA_HEART: + mDoAud_seStart(JA_SE_HEART_PIECE, NULL, 0, 0); + mCurState = STATE_INIT_GET_DEMO; break; case S_MAGIC: mDoAud_seStart(JA_SE_MAGIC_POT_GET_S, NULL, 0, 0); @@ -641,11 +637,14 @@ void daItem_c::itemGetExecute() { case BOMB_10: case BOMB_20: case BOMB_30: + case ARROW_10: + case ARROW_20: + case ARROW_30: mDoAud_seStart(JA_SE_CONSUMP_ITEM_GET, NULL, 0, 0); execItemGet(m_itemNo); break; case SMALL_KEY: - mCurState = 7; + mCurState = STATE_INIT_GET_DEMO; break; case TRIPLE_HEART: mDoAud_seStart(JA_SE_HEART_PIECE, NULL, 0, 0); @@ -654,36 +653,36 @@ void daItem_c::itemGetExecute() { case PENDANT: mDoAud_seStart(JA_SE_SPOILS_GET, NULL, 0, 0); if (!dComIfGs_isGetItemBeast(7)) { - mCurState = 7; + mCurState = STATE_INIT_GET_DEMO; dComIfGs_onGetItemBeast(7); } else { execItemGet(m_itemNo); } break; case DEKU_LEAF: - mCurState = 7; + mCurState = STATE_INIT_GET_DEMO; break; case SWORD: daItem_c* item = (daItem_c*)fopAcM_SearchByName(PROC_ITEM); if (item && item->m_itemNo == SHIELD) { item->itemGetExecute(); } - mCurState = 7; + mCurState = STATE_INIT_GET_DEMO; break; case SHIELD: item = (daItem_c*)fopAcM_SearchByName(PROC_ITEM); if (item && item->m_itemNo == SWORD) { item->itemGetExecute(); } - mCurState = 7; + mCurState = STATE_INIT_GET_DEMO; break; case DROPPED_SWORD: - mCurState = 7; + mCurState = STATE_INIT_GET_DEMO; break; case SKULL_NECKLACE: mDoAud_seStart(JA_SE_SPOILS_GET, NULL, 0, 0); if (!dComIfGs_isGetItemBeast(0)) { - mCurState = 7; + mCurState = STATE_INIT_GET_DEMO; dComIfGs_onGetItemBeast(0); } else { execItemGet(m_itemNo); @@ -692,7 +691,7 @@ void daItem_c::itemGetExecute() { case BOKOBABA_SEED: mDoAud_seStart(JA_SE_SPOILS_GET, NULL, 0, 0); if (!dComIfGs_isGetItemBeast(1)) { - mCurState = 7; + mCurState = STATE_INIT_GET_DEMO; dComIfGs_onGetItemBeast(1); } else { execItemGet(m_itemNo); @@ -701,7 +700,7 @@ void daItem_c::itemGetExecute() { case GOLDEN_FEATHER: mDoAud_seStart(JA_SE_SPOILS_GET, NULL, 0, 0); if (!dComIfGs_isGetItemBeast(2)) { - mCurState = 7; + mCurState = STATE_INIT_GET_DEMO; dComIfGs_onGetItemBeast(2); } else { execItemGet(m_itemNo); @@ -710,7 +709,7 @@ void daItem_c::itemGetExecute() { case BOKO_BELT: mDoAud_seStart(JA_SE_SPOILS_GET, NULL, 0, 0); if (!dComIfGs_isGetItemBeast(3)) { - mCurState = 7; + mCurState = STATE_INIT_GET_DEMO; dComIfGs_onGetItemBeast(3); } else { execItemGet(m_itemNo); @@ -719,7 +718,7 @@ void daItem_c::itemGetExecute() { case RED_JELLY: mDoAud_seStart(JA_SE_SPOILS_GET, NULL, 0, 0); if (!dComIfGs_isGetItemBeast(4)) { - mCurState = 7; + mCurState = STATE_INIT_GET_DEMO; dComIfGs_onGetItemBeast(4); } else { execItemGet(m_itemNo); @@ -728,7 +727,7 @@ void daItem_c::itemGetExecute() { case GREEN_JELLY: mDoAud_seStart(JA_SE_SPOILS_GET, NULL, 0, 0); if (!dComIfGs_isGetItemBeast(5)) { - mCurState = 7; + mCurState = STATE_INIT_GET_DEMO; dComIfGs_onGetItemBeast(5); } else { execItemGet(m_itemNo); @@ -737,25 +736,25 @@ void daItem_c::itemGetExecute() { case BLUE_JELLY: mDoAud_seStart(JA_SE_SPOILS_GET, NULL, 0, 0); if (!dComIfGs_isGetItemBeast(6)) { - mCurState = 7; + mCurState = STATE_INIT_GET_DEMO; dComIfGs_onGetItemBeast(6); } else { execItemGet(m_itemNo); } break; - case ANIMAL_ESA: - mDoAud_seStart(JA_SE_ESA_GET, NULL, 0, 0); - if (!dComIfGs_isGetItemBait(0)) { - mCurState = 7; - dComIfGs_onGetItemBait(0); - } else { - execItemGet(m_itemNo); - } - break; case BIRD_ESA_5: + mDoAud_seStart(JA_SE_ESA_GET, NULL, 0, 0); + if (!dComIfGs_isGetItemBait(0)) { + mCurState = STATE_INIT_GET_DEMO; + dComIfGs_onGetItemBait(0); + } else { + execItemGet(m_itemNo); + } + break; + case ANIMAL_ESA: mDoAud_seStart(JA_SE_ESA_GET, NULL, 0, 0); if (!dComIfGs_isGetItemBait(1)) { - mCurState = 7; + mCurState = STATE_INIT_GET_DEMO; dComIfGs_onGetItemBait(1); } else { execItemGet(m_itemNo); @@ -790,28 +789,28 @@ void daItem_c::itemDefaultRotateY() { /* 800F6D78-800F6E54 .text checkItemDisappear__8daItem_cFv */ BOOL daItem_c::checkItemDisappear() { - BOOL disappearing = true; - if (mCurState == 3) { - disappearing = false; + BOOL disappearing = TRUE; + if (mCurState == STATE_BRING_NEZUMI) { + disappearing = FALSE; show(); } if (mStatusFlags & 0x02) { - disappearing = false; + disappearing = FALSE; } if (mStatusFlags & 0x10) { - disappearing = false; + disappearing = FALSE; } if (dItem_data::chkFlag(m_itemNo, 0x01)) { - disappearing = false; + disappearing = FALSE; } if (g_dComIfG_gameInfo.play.mEvtCtrl.mMode != 0) { - disappearing = false; + disappearing = FALSE; } if (mCurState == 4) { - disappearing = false; + disappearing = FALSE; } if ((mStatusFlags & 0x08) || (mStatusFlags & 0x40) || (mStatus & fopAcStts_HOOK_CARRY_e)) { - disappearing = false; + disappearing = FALSE; show(); } return disappearing; @@ -823,7 +822,7 @@ void daItem_c::setItemTimer(int timer) { mStatusFlags |= 0x10; return; } - mItemTimer = timer; + mDisappearTimer = timer; } /* 800F6E74-800F6EC8 .text checkPlayerGet__8daItem_cFv */ @@ -831,40 +830,280 @@ BOOL daItem_c::checkPlayerGet() { if (field_0x638 < getData()->field_0x42) { return FALSE; } - if (mCurState == 3) { + if (mCurState == STATE_BRING_NEZUMI) { return FALSE; } return TRUE; } /* 800F6EC8-800F7028 .text itemActionForRupee__8daItem_cFv */ -void daItem_c::itemActionForRupee() { - /* Nonmatching */ +BOOL daItem_c::itemActionForRupee() { + mAcch.CrrPos(*dComIfG_Bgsp()); + checkWall(); + + if (mAcch.ChkGroundLanding()) { + f32 temp2 = field_0x650 * getData()->field_0x04; + if (temp2 > mGravity - 0.5f) { + speedF = 0.0f; + } else { + speed.set(0.0f, -temp2, 0.0f); + } + + mOnGroundTimer++; + if (mOnGroundTimer >= 2) { + cLib_offBit(mStatusFlags, (u8)0x04); + } + + set_bound_se(); + } else if (mAcch.ChkGroundHit()) { + itemDefaultRotateY(); + speedF = 0.0f; + cLib_offBit(mStatusFlags, (u8)0x04); + mOnGroundTimer = 1; + } + + if (speed.y != 0.0f) { + field_0x650 = speed.y; + } + + field_0x654 = getData()->field_0x1A; + + if (mOnGroundTimer == 0) { + mTargetAngleX = current.angle.x + field_0x654; + } else { + mTargetAngleX = 0; + } + + if (!cLib_checkBit(mStatusFlags, (u8)0x02)) { + cLib_chaseAngleS(¤t.angle.x, mTargetAngleX, field_0x654); + } + + return TRUE; } /* 800F7028-800F713C .text itemActionForHeart__8daItem_cFv */ -void daItem_c::itemActionForHeart() { - /* Nonmatching */ +BOOL daItem_c::itemActionForHeart() { + f32 origSpeedY = speed.y; + if (origSpeedY < 0.0f) { + mGravity = 0.0f; + speed.set(0.0f, getData()->field_0x20, 0.0f); + } + + mAcch.CrrPos(*dComIfG_Bgsp()); + + if (mAcch.ChkGroundLanding() || mAcch.ChkGroundHit()) { + cLib_offBit(mStatusFlags, (u8)0x04); + mExtraZRot = 0; + speed.set(0.0f, -1.0f, 0.0f); + speedF = 0.0f; + itemDefaultRotateY(); + } else if (origSpeedY < 0.0f) { + f32 temp2 = getData()->field_0x24; + int temp = field_0x634 * getData()->field_0x28; + speedF = temp2 * cM_ssin(temp); + } + + return TRUE; } /* 800F713C-800F72A4 .text itemActionForKey__8daItem_cFv */ -void daItem_c::itemActionForKey() { - /* Nonmatching */ +BOOL daItem_c::itemActionForKey() { + mAcch.CrrPos(*dComIfG_Bgsp()); + checkWall(); + + if (mAcch.ChkGroundLanding()) { + f32 temp2 = field_0x650 * getData()->field_0x04; + if (temp2 > mGravity - 0.5f) { + speedF = 0.0f; + current.angle.x = 0x4000; + mTargetAngleX = current.angle.x; + field_0x654 = 0; + } else { + speed.set(0.0f, -temp2, 0.0f); + } + + mOnGroundTimer++; + if (mOnGroundTimer >= 2) { + cLib_offBit(mStatusFlags, (u8)0x04); + } + } else if (mAcch.ChkGroundHit()) { + mOnGroundTimer = 1; + mTargetAngleX = 0; + current.angle.x = 0; + cLib_offBit(mStatusFlags, (u8)0x04); + itemDefaultRotateY(); + } + + if (speed.y != 0.0f) { + field_0x650 = speed.y; + } + + field_0x654 = getData()->field_0x1A; + + if (mOnGroundTimer == 0) { + mTargetAngleX = current.angle.x + field_0x654; + } else { + mTargetAngleX = 0; + } + + cLib_chaseAngleS(¤t.angle.x, mTargetAngleX, field_0x654); + + return TRUE; } /* 800F72A4-800F73A4 .text itemActionForEmono__8daItem_cFv */ -void daItem_c::itemActionForEmono() { - /* Nonmatching */ +BOOL daItem_c::itemActionForEmono() { + mAcch.CrrPos(*dComIfG_Bgsp()); + + if (mAcch.ChkGroundLanding()) { + f32 temp2 = field_0x650 * getData()->field_0x04; + if (temp2 > mGravity - 0.5f) { + speedF = 0.0f; + } else { + speed.set(0.0f, -temp2, 0.0f); + } + + set_bound_se(); + } else if (mAcch.ChkGroundHit()) { + s16 rotationSpeed = 0xFFFF / getData()->mNumFramesPerFullSpin; + rotationSpeed = rotationSpeed / 2; + fopAcM_addAngleY(this, current.angle.y + rotationSpeed, rotationSpeed); + speedF = 0.0f; + } + + if (speed.y != 0.0f) { + field_0x650 = speed.y; + } + + return TRUE; } /* 800F73A4-800F7898 .text itemActionForSword__8daItem_cFv */ -void daItem_c::itemActionForSword() { - /* Nonmatching */ +BOOL daItem_c::itemActionForSword() { + /* Nonmatching - regalloc */ + mAcch.CrrPos(*dComIfG_Bgsp()); + + bool isQuake = dComIfGp_getDetect().chk_quake(¤t.pos); + if (isQuake && !cLib_checkBit(mStatusFlags, (u8)0x20) && mAcch.ChkGroundHit()) { + speed.set(0.0f, 21.0f, 0.0f); + mGravity = -3.5f; + } + + if (mAcch.ChkGroundLanding()) { + f32 temp = field_0x650 * 0.9f; + speed.set(0.0f, -temp, 0.0f); + + if (m_itemNo == SWORD) { + if (field_0x638 > 15) { + fopAcM_seStart(this, JA_SE_OBJ_LNK_SWORD_FALL, 0); + } + } else if (m_itemNo == SHIELD) { + if (field_0x638 > 15) { + fopAcM_seStart(this, JA_SE_OBJ_LNK_SHIELD_FALL, 0); + } + } + } + + dBgS_ObjGndChk gndChk; + cXyz bottomPos(0.0f, 0.0f, 0.0f); + cXyz topPos(0.0f, 50.0f, 0.0f); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::ZXYrotM(current.angle); + mDoMtx_stack_c::multVec(&bottomPos, &bottomPos); + mDoMtx_stack_c::multVec(&topPos, &topPos); + gndChk.SetPos(&bottomPos); + f32 groundY = dComIfG_Bgsp()->GroundCross(&gndChk); + f32 temp3 = groundY - bottomPos.y; + gndChk.SetPos(&topPos); + groundY = dComIfG_Bgsp()->GroundCross(&gndChk); + f32 temp4 = groundY - topPos.y; + + if (field_0x666 == 1) { + field_0x660 = 0x2000; + } + + if (temp3 > 0.0f || temp4 > 0.0f) { + if (temp3 > 0.0f) { + field_0x660 = -0.8f * field_0x660; + } else if (temp4 > 0.0f) { + field_0x660 = -0.8f * field_0x660; + } + field_0x666++; + } + + if (field_0x660 == 0) { + field_0x666 = 0; + } else { + cLib_addCalcAngleS2(¤t.angle.x, field_0x660 + 0x4000, 10, 0x800); + } + + if (isQuake) { + cLib_onBit(mStatusFlags, (u8)0x20); + } else { + cLib_offBit(mStatusFlags, (u8)0x20); + } + + return TRUE; } /* 800F7898-800F7AF0 .text itemActionForArrow__8daItem_cFv */ -void daItem_c::itemActionForArrow() { - /* Nonmatching */ +BOOL daItem_c::itemActionForArrow() { + mAcch.CrrPos(*dComIfG_Bgsp()); + + if (mOnGroundTimer == 0 && mpParticleEmitter && fopAcM_SearchByName(PROC_BST)) { // Gohdan + f32 transX = current.pos.x; + f32 transY = current.pos.y; + f32 transZ = current.pos.z; + mpParticleEmitter->setGlobalTranslation(transX, transY, transZ); + } + + if (mAcch.ChkGroundLanding()) { + f32 temp_f3 = field_0x650 * getData()->field_0x04; + if (temp_f3 > mGravity - 0.5f) { + speedF = 0.0f; + } else { + speed.set(0.0f, -temp_f3, 0.0f); + speedF *= 0.5f; + } + + mOnGroundTimer++; + + if (mOnGroundTimer == 1 && fopAcM_SearchByName(PROC_BST)) { // Gohdan + JPABaseEmitter* emitter = dComIfGp_particle_set(0xA1E2, ¤t.pos, NULL, NULL, 0xFF, &mPtclSmokeCb, fopAcM_GetRoomNo(this)); + if (emitter) { + emitter->setMaxFrame(1); + } + } + + if (mpParticleEmitter) { + mpParticleEmitter->becomeInvalidEmitter(); + mpParticleEmitter = NULL; + } + + set_bound_se(); + } else if (mAcch.ChkGroundHit()) { + speedF = 0.0f; + + if (m_itemNo != UTUWA_HEART) { + itemDefaultRotateY(); + } + } + + if (m_itemNo == UTUWA_HEART) { + if (mOnGroundTimer != 0) { + getData(); + s16 rotationSpeed = 0xFFFF / getData()->mNumFramesPerFullSpin; + cLib_addCalcAngleS(&field_0x654, rotationSpeed, 10, 0x400, 0x100); + } + + cLib_chaseAngleS(&shape_angle.y, shape_angle.y + field_0x654, field_0x654); + } + + if (speed.y != 0.0f) { + field_0x650 = speed.y; + } + + return TRUE; } /* 800F7AF0-800F7BF8 .text checkWall__8daItem_cFv */ @@ -966,8 +1205,8 @@ BOOL daItem_c::timeCount() { } if (checkPlayerGet() && !dComIfGp_event_runCheck()) { - if (mItemTimer > 0) { - mItemTimer--; + if (mDisappearTimer > 0) { + mDisappearTimer--; } else if (field_0x65a > 0) { field_0x65a--; } @@ -985,22 +1224,230 @@ void daItem_c::mode_wait_init() { /* 800F7F50-800F80CC .text mode_water_init__8daItem_cFv */ void daItem_c::mode_water_init() { - /* Nonmatching */ + mMode = 2; + + if (daSea_ChkArea(current.pos.x, current.pos.z)) { + f32 seaH = daSea_calcWave(current.pos.x, current.pos.z); + if (seaH > current.pos.y) { + current.pos.y = seaH; + } + } else { + if (!mAcch.ChkWaterHit() || mAcch.m_wtr.GetHeight() < current.pos.y) { + mode_wait_init(); + } + current.pos.y = mAcch.m_wtr.GetHeight(); + } + + speed.setAll(0.0f); + speedF = 0.0f; + current.angle.z = 0; + current.angle.x = 0; + mExtraZRot = 0; + field_0x654 = 0; + cLib_offBit(mStatusFlags, (u8)0x04); + mScale.set(mScaleTarget.x, mScaleTarget.y, mScaleTarget.z); + + cXyz scale; + f32 temp = dItem_data::getShadowSize(m_itemNo); + f32 temp3 = temp / dItem_data::getShadowSize(GREEN_RUPEE); + temp3 *= mScale.x; + scale.setAll(temp3); + + dComIfGp_particle_setShipTail(0x33, ¤t.pos, NULL, &scale, 0xFF, &mPtclRippleCb); + mPtclRippleCb.mRate = 0.0f; } /* 800F80CC-800F844C .text mode_wait__8daItem_cFv */ void daItem_c::mode_wait() { - /* Nonmatching */ + if (cLib_checkBit(mStatusFlags, (u8)0x04) && dItem_data::checkAppearEffect(m_itemNo)) { + u16 appearEffect = dItem_data::getAppearEffect(m_itemNo); + dComIfGp_particle_setSimple(appearEffect, ¤t.pos, 0xFF, g_whiteColor, g_whiteColor, 0); + } + + switch (m_itemNo) { + case HEART: + case TRIPLE_HEART: + itemActionForHeart(); + break; + case KAKERA_HEART: + case UTUWA_HEART: + case BOMB_5: + case BOMB_10: + case BOMB_20: + case BOMB_30: + case ARROW_10: + case ARROW_20: + case ARROW_30: + case MAGIC_ARROW: + case LIGHT_ARROW: + itemActionForArrow(); + break; + case SMALL_KEY: + itemActionForKey(); + break; + case S_MAGIC: + case L_MAGIC: + case PENDANT: + case SKULL_NECKLACE: + case BOKOBABA_SEED: + case GOLDEN_FEATHER: + case BOKO_BELT: + case RED_JELLY: + case GREEN_JELLY: + case BLUE_JELLY: + itemActionForEmono(); + break; + case SWORD: + case SHIELD: + case DROPPED_SWORD: + itemActionForSword(); + break; + default: + itemActionForRupee(); + break; + } + + if (mAcch.ChkWaterHit() && mAcch.m_wtr.GetHeight() > current.pos.y + || (daSea_ChkArea(current.pos.x, current.pos.z) && daSea_calcWave(current.pos.x, current.pos.z) > current.pos.y)) + { + mode_water_init(); + } + + dBgS_ObjGndChk_Yogan gndChk; + cXyz temp; + temp.set(next.pos.x, next.pos.y, next.pos.z); + gndChk.SetPos(&temp); + f32 groundY = dComIfG_Bgsp()->GroundCross(&gndChk); + if (groundY != -1000000000.0f && groundY > current.pos.y) { + fopAcM_delete(this); + } } /* 800F844C-800F8528 .text mode_water__8daItem_cFv */ void daItem_c::mode_water() { - /* Nonmatching */ + mAcch.CrrPos(*dComIfG_Bgsp()); + + if (daSea_ChkArea(current.pos.x, current.pos.z)) { + f32 seaH = daSea_calcWave(current.pos.x, current.pos.z); + if (seaH >= current.pos.y) { + current.pos.y = seaH; + } else { + mode_wait_init(); + } + } else if (!mAcch.ChkWaterHit() || mAcch.m_wtr.GetHeight() < current.pos.y) { + mode_wait_init(); + } else { + current.pos.y = mAcch.m_wtr.GetHeight(); + } + + s16 rotationSpeed = 0xFFFF / daItemBase_c::m_data.mNumFramesPerFullSpin; + fopAcM_addAngleY(this, current.angle.y + rotationSpeed, rotationSpeed); } /* 800F8528-800F8950 .text initAction__8daItem_cFv */ -void daItem_c::initAction() { - /* Nonmatching */ +BOOL daItem_c::initAction() { + /* Nonmatching - regalloc */ + if (cLib_checkBit(mStatusFlags, (u8)0x02)) { + mScale.set(mScaleTarget.x, mScaleTarget.y, mScaleTarget.z); + + switch (mAction) { + case 4: + current.angle.y = cM_rndF((f32)0xFFFF); + f32 temp = getData()->field_0x2C + cM_rndF(5.0f); + speedF = cM_rndF(getData()->field_0x30); + speed.set(0.0f, temp, 0.0f); + // speedF = cM_rndF(getData()->field_0x30); + break; + case 5: + speed.setAll(0.0f); + speedF = 0.0f; + mScale.setAll(0.0f); + mCurState = STATE_WAIT_BOSS1; + fopAcM_OnStatus(this, fopAcStts_UNK4000_e); + field_0x654 = 0x4A8; + break; + case 0xC: + mScale.setAll(1.0f); + mCurState = STATE_WAIT_BOSS2; + fopAcM_OnStatus(this, fopAcStts_UNK4000_e); + field_0x654 = 0x4A8; + break; + } + + mGravity = getData()->mFieldItemGravity; + cLib_offBit(mStatusFlags, (u8)0x04); + mMode = 0; + + return TRUE; + } + + // TODO: usage of uninitialized register? + f32 temp_f31; + switch (mAction) { + case 1: + temp_f31 = getData()->field_0x08 + cM_rndFX(5.0f); + speedF = getData()->field_0x10 / 10.0f; + if (g_mDoCPd_cpadInfo[0].mMainStickValue) { + speedF = getData()->field_0x10; + } + current.angle.y = cM_rndF((f32)0xFFFF); + break; + case 3: + temp_f31 = 25.0f; + current.angle.y = cM_rndF((f32)0xFFFF); + speedF = getData()->mVelocityScale; + break; + case 7: + speedF = getData()->mVelocityScale * 1.5f; + current.angle.y = cM_rndF((f32)0xFFFF); + temp_f31 = getData()->field_0x08 + cM_rndFX(5.0f); + break; + case 2: + case 4: + case 9: + speedF = 0.0f; + current.angle.y = cM_rndF((f32)0xFFFF); + temp_f31 = getData()->field_0x08 + cM_rndFX(5.0f); + break; + case 8: + current.angle.y = cM_rndF((f32)0xFFFF); + temp_f31 = getData()->field_0x44 + cM_rndFX(5.0f); + speedF = getData()->mVelocityScale; + break; + case 0xA: + mGravity = getData()->mFieldItemGravity; + mScale.setAll(0.0f); + mMode = 0; + break; + case 0xB: + current.angle.y = cM_rndF((f32)0xFFFF); + temp_f31 = 0.0f; + speedF = 0.0f; + break; + case 6: + temp_f31 = getData()->field_0x08 + cM_rndFX(5.0f); + break; + case 0: + case 5: + break; + } + + mExtraZRot = 0; + + if (isHeart(m_itemNo)) { + speedF = 2.0f * speedF; + mExtraZRot = cM_rndFX(getData()->mHeartMaxRandomZRot); + } + + mGravity = getData()->mFieldItemGravity; + speed.set(0.0f, temp_f31, 0.0f); + mScale.setAll(0.0f); + + mMode = 0; + + cLib_onBit(mStatusFlags, (u8)0x04); + + return TRUE; } /* 800F8950-800F8970 .text daItem_Draw__FP8daItem_c */