From 3f2c2f73ce754de75ab97abaac411b54529658f8 Mon Sep 17 00:00:00 2001 From: LagoLunatic Date: Sun, 24 Sep 2023 21:20:57 -0400 Subject: [PATCH 1/3] Misc fixes --- include/d/d_cc_d.h | 12 ++-- include/d/d_particle.h | 2 +- include/f_op/f_op_actor.h | 4 ++ src/d/actor/d_a_arrow.cpp | 2 +- src/d/actor/d_a_obj_movebox.cpp | 4 +- src/d/d_cc_d.cpp | 115 -------------------------------- 6 files changed, 14 insertions(+), 125 deletions(-) diff --git a/include/d/d_cc_d.h b/include/d/d_cc_d.h index 40d8b8485..4290eda89 100644 --- a/include/d/d_cc_d.h +++ b/include/d/d_cc_d.h @@ -68,7 +68,7 @@ struct dCcD_SrcCps { class dCcD_GStts : public cCcD_GStts { public: dCcD_GStts(); - virtual ~dCcD_GStts(); + virtual ~dCcD_GStts() {} void Ct(); void Move(); @@ -108,7 +108,7 @@ public: virtual void Ct(); virtual void ClrAt(); virtual void ClrTg(); - virtual ~dCcD_Stts(); + virtual ~dCcD_Stts() {} }; // Size = 0x3C @@ -140,7 +140,7 @@ public: void SetEffCounterTimer(); void SubtractEffCounter() { mEffCounter -= 1; } bool ChkEffCounter() { return mEffCounter >= 0; } - virtual ~dCcD_GAtTgCoCommonBase(); + virtual ~dCcD_GAtTgCoCommonBase() {} void ClrEffCounter() { mEffCounter = 0; } u32 GetGFlag() const { return mGFlag; } @@ -161,7 +161,7 @@ public: class dCcD_GObjAt : public dCcD_GAtTgCoCommonBase { public: void Set(dCcD_SrcGObjAt const&); - virtual ~dCcD_GObjAt(); + virtual ~dCcD_GObjAt() {} void SetVec(cXyz& vec) { mVec = vec; } cXyz& GetVec() { return mVec; } cXyz* GetVecP() { return &mVec; } @@ -192,7 +192,7 @@ public: class dCcD_GObjTg : public dCcD_GAtTgCoCommonBase { public: void Set(dCcD_SrcGObjTg const&); - virtual ~dCcD_GObjTg(); + virtual ~dCcD_GObjTg() {} void SetSe(u8 se) { mSe = se; } void SetVec(cXyz& vec) { mVec = vec; } cXyz& GetVec() { return mVec; } @@ -222,7 +222,7 @@ private: // Correction (Co) Collider class dCcD_GObjCo : public dCcD_GAtTgCoCommonBase { public: - virtual ~dCcD_GObjCo(); + virtual ~dCcD_GObjCo() {} void Set(dCcD_SrcGObjCo const& pSrc) { dCcD_GAtTgCoCommonBase::Set(pSrc.mBase); } }; // Size = 0x1C ? diff --git a/include/d/d_particle.h b/include/d/d_particle.h index 4cc081445..efcc56857 100644 --- a/include/d/d_particle.h +++ b/include/d/d_particle.h @@ -56,7 +56,7 @@ public: STATIC_ASSERT(sizeof(dPa_followEcallBack) == 0x14); -class dPa_smokeEcallBack : dPa_followEcallBack { +class dPa_smokeEcallBack : public dPa_followEcallBack { public: dPa_smokeEcallBack(u8); virtual ~dPa_smokeEcallBack(); diff --git a/include/f_op/f_op_actor.h b/include/f_op/f_op_actor.h index c1b79af2d..be3a42f2d 100644 --- a/include/f_op/f_op_actor.h +++ b/include/f_op/f_op_actor.h @@ -172,8 +172,10 @@ class JntHit_c; struct fopAc_cullSizeSphere { public: +#ifndef __INTELLISENSE__ fopAc_cullSizeSphere() {} fopAc_cullSizeSphere(cXyz, float); +#endif /* 0x0 */ Vec mCenter; /* 0xC */ f32 mRadius; @@ -181,9 +183,11 @@ public: struct fopAc_cullSizeBox { public: +#ifndef __INTELLISENSE__ fopAc_cullSizeBox() {} fopAc_cullSizeBox(const fopAc_cullSizeBox&); fopAc_cullSizeBox(cXyz, cXyz); +#endif /* 0x0 */ Vec mMin; /* 0xC */ Vec mMax; diff --git a/src/d/actor/d_a_arrow.cpp b/src/d/actor/d_a_arrow.cpp index f7416f835..3dffd0ea9 100644 --- a/src/d/actor/d_a_arrow.cpp +++ b/src/d/actor/d_a_arrow.cpp @@ -274,7 +274,7 @@ void daArrow_c::arrowShooting() { setArrowShootSe(); if (mArrowType == TYPE_LIGHT && !mbShotByZelda) { - if (strcmp(dComIfGp_getStartStageName(), "GanonK") != 0) { + if (strcmp(dComIfGp_getStartStageName(), "GanonK") != 0) { // Not in Puppet Ganon's boss room. mCps.SetAtSpl((dCcG_At_Spl)0xB); } diff --git a/src/d/actor/d_a_obj_movebox.cpp b/src/d/actor/d_a_obj_movebox.cpp index 1c2e18a68..c3af525d9 100644 --- a/src/d/actor/d_a_obj_movebox.cpp +++ b/src/d/actor/d_a_obj_movebox.cpp @@ -558,8 +558,8 @@ namespace daObjMovebox { } else { numPnts = 4; } - if (numPnts > mPath->mNum) { - numPnts = mPath->mNum; + if (numPnts > mPath->m_num) { + numPnts = mPath->m_num; } s32 pntIdx; diff --git a/src/d/d_cc_d.cpp b/src/d/d_cc_d.cpp index 0377e51df..918605534 100644 --- a/src/d/d_cc_d.cpp +++ b/src/d/d_cc_d.cpp @@ -97,11 +97,6 @@ dCcD_GObjInf::dCcD_GObjInf() { /* Nonmatching */ } -/* 800AB63C-800AB7C0 .text __dt__12dCcD_GObjInfFv */ -dCcD_GObjInf::~dCcD_GObjInf() { - /* Nonmatching */ -} - /* 800AB7C0-800AB7C4 .text GetGObjInf__12dCcD_GObjInfFv */ cCcD_GObjInf* dCcD_GObjInf::GetGObjInf() { return (cCcD_GObjInf*)this; @@ -268,106 +263,6 @@ void dCcD_Sph::MoveCAt(cXyz&) { /* Nonmatching */ } -// /* 800AC0E8-800AC130 .text __dt__10cCcD_GSttsFv */ -// cCcD_GStts::~cCcD_GStts() { -// /* Nonmatching */ -// } - -// /* 800AC130-800AC228 .text __dt__12cCcD_GObjInfFv */ -// cCcD_GObjInf::~cCcD_GObjInf() { -// /* Nonmatching */ -// } - -// /* 800AC228-800AC310 .text __dt__8cCcD_ObjFv */ -// cCcD_Obj::~cCcD_Obj() { -// /* Nonmatching */ -// } - -// /* 800AC310-800AC3D0 .text __dt__14cCcD_ObjHitInfFv */ -// cCcD_ObjHitInf::~cCcD_ObjHitInf() { -// /* Nonmatching */ -// } - -// /* 800AC3D0-800AC42C .text __dt__10cCcD_ObjCoFv */ -// cCcD_ObjCo::~cCcD_ObjCo() { -// /* Nonmatching */ -// } - -// /* 800AC42C-800AC488 .text __dt__10cCcD_ObjTgFv */ -// cCcD_ObjTg::~cCcD_ObjTg() { -// /* Nonmatching */ -// } - -// /* 800AC488-800AC4E4 .text __dt__10cCcD_ObjAtFv */ -// cCcD_ObjAt::~cCcD_ObjAt() { -// /* Nonmatching */ -// } - -// /* 800AC4E4-800AC52C .text __dt__18cCcD_ObjCommonBaseFv */ -// cCcD_ObjCommonBase::~cCcD_ObjCommonBase() { -// /* Nonmatching */ -// } - -// /* 800AC52C-800AC534 .text GetGObjInf__8cCcD_ObjFv */ -// cCcD_GObjInf* cCcD_Obj::GetGObjInf() { -// /* Nonmatching */ -// } - -// /* 800AC534-800AC538 .text GetGObjInf__12cCcD_GObjInfCFv */ -// cCcD_GObjInf const* cCcD_GObjInf::GetGObjInf() const { -// /* Nonmatching */ -// } - -// /* 800AC538-800AC540 .text GetShapeAttr__8cCcD_ObjCFv */ -// cCcD_ShapeAttr const* cCcD_Obj::GetShapeAttr() const { -// /* Nonmatching */ -// } - -// /* 800AC540-800AC558 .text ClrAtHit__12cCcD_GObjInfFv */ -// void cCcD_GObjInf::ClrAtHit() { -// /* Nonmatching */ -// } - -// /* 800AC558-800AC570 .text ClrTgHit__12cCcD_GObjInfFv */ -// void cCcD_GObjInf::ClrTgHit() { -// /* Nonmatching */ -// } - -// /* 800AC570-800AC588 .text ClrCoHit__12cCcD_GObjInfFv */ -// void cCcD_GObjInf::ClrCoHit() { -// /* Nonmatching */ -// } - -// /* 800AC588-800AC58C .text GetGObjInf__12cCcD_GObjInfFv */ -// cCcD_GObjInf* cCcD_GObjInf::GetGObjInf() { -// /* Nonmatching */ -// } - -// /* 800AC58C-800AC594 .text GetGObjInf__8cCcD_ObjCFv */ -// cCcD_GObjInf const* cCcD_Obj::GetGObjInf() const { -// /* Nonmatching */ -// } - -/* 800AC594-800AC5F0 .text __dt__11dCcD_GObjCoFv */ -dCcD_GObjCo::~dCcD_GObjCo() { - /* Nonmatching */ -} - -/* 800AC5F0-800AC64C .text __dt__11dCcD_GObjTgFv */ -dCcD_GObjTg::~dCcD_GObjTg() { - /* Nonmatching */ -} - -/* 800AC64C-800AC6A8 .text __dt__11dCcD_GObjAtFv */ -dCcD_GObjAt::~dCcD_GObjAt() { - /* Nonmatching */ -} - -/* 800AC6A8-800AC6F0 .text __dt__22dCcD_GAtTgCoCommonBaseFv */ -dCcD_GAtTgCoCommonBase::~dCcD_GAtTgCoCommonBase() { - /* Nonmatching */ -} - /* 800AC6F0-800AC700 .text GetGStts__9dCcD_SttsFv */ cCcD_GStts* dCcD_Stts::GetGStts() { /* Nonmatching */ @@ -382,13 +277,3 @@ void dCcD_Stts::ClrAt() { void dCcD_Stts::ClrTg() { /* Nonmatching */ } - -/* 800AC71C-800AC7AC .text __dt__9dCcD_SttsFv */ -dCcD_Stts::~dCcD_Stts() { - /* Nonmatching */ -} - -/* 800AC7AC-800AC808 .text __dt__10dCcD_GSttsFv */ -dCcD_GStts::~dCcD_GStts() { - /* Nonmatching */ -} From e30ca82d277e742f84234b9af64735fb300be717 Mon Sep 17 00:00:00 2001 From: LagoLunatic Date: Mon, 25 Sep 2023 17:00:05 -0400 Subject: [PATCH 2/3] d_a_item progress --- include/d/actor/d_a_item.h | 51 ++- include/d/actor/d_a_itembase.h | 33 +- include/d/actor/d_a_player.h | 2 +- include/d/d_com_inf_game.h | 28 +- include/d/d_item.h | 28 +- include/d/d_item_data.h | 2 +- include/f_op/f_op_actor_mng.h | 15 +- src/d/actor/d_a_agb.cpp | 2 +- src/d/actor/d_a_item.cpp | 733 ++++++++++++++++++++++++++++----- 9 files changed, 731 insertions(+), 163 deletions(-) diff --git a/include/d/actor/d_a_item.h b/include/d/actor/d_a_item.h index 8627e8dda..7b82ed7ba 100644 --- a/include/d/actor/d_a_item.h +++ b/include/d/actor/d_a_item.h @@ -3,9 +3,12 @@ #include "d/actor/d_a_itembase.h" #include "d/d_particle.h" +#include "f_pc/f_pc_manager.h" class daItem_c : public daItemBase_c { public: + typedef void (daItem_c::*daItem_c_ModeFunc)(); + daItem_c() : mPtclFollowCb(0, 0), mPtclSmokeCb(1) {} float getYOffset(); @@ -13,7 +16,7 @@ public: void set_mtx_base(J3DModel*, cXyz, csXyz); void CreateInit(); s32 _daItem_create(); - s32 _daItem_execute(); + BOOL _daItem_execute(); void mode_proc_call(); void execInitNormalDirection(); void execMainNormalDirection(); @@ -24,12 +27,12 @@ public: void execWaitMain(); void execWaitMainFromBoss(); void scaleAnimFromBossItem(); - s32 _daItem_draw(); + BOOL _daItem_draw(); void setTevStr(); - s32 _daItem_delete(); + BOOL _daItem_delete(); void itemGetExecute(); void itemDefaultRotateY(); - bool checkItemDisappear(); + BOOL checkItemDisappear(); void setItemTimer(int); BOOL checkPlayerGet(); void itemActionForRupee(); @@ -40,14 +43,14 @@ public: void itemActionForArrow(); void checkWall(); void set_bound_se(); - s32 checkGetItem(); - void timeCount(); + BOOL checkGetItem(); + BOOL timeCount(); void mode_wait_init(); void mode_water_init(); void mode_wait(); void mode_water(); void initAction(); - s32 _daItem_isdelete(); + BOOL _daItem_isdelete(); s32 checkControl(); s32 startControl(); @@ -58,29 +61,47 @@ public: s32 checkActionNow(); static dCcD_SrcCyl m_cyl_src; + static s32 m_timer_max; public: /* 0x63C */ cXyz mScaleTarget; /* 0x648 */ s32 mSwitchId; /* 0x64C */ s32 mActivationSwitch; - /* 0x650 */ f32 field3_0x650; - /* 0x654 */ u8 field4_0x654[0x658 - 0x654]; + /* 0x650 */ f32 field_0x650; + /* 0x654 */ s16 field_0x654; + /* 0x656 */ s16 field_0x656; /* 0x658 */ s16 mItemTimer; - /* 0x65A */ s16 field7_0x65a; - /* 0x65C */ s16 field8_0x65c; - /* 0x65E */ u8 field10_0x65e[0x667 - 0x65E]; - /* 0x667 */ u8 mUnknownParam; - /* 0x668 */ u8 mItemAction; + /* 0x65A */ s16 field_0x65a; + /* 0x65C */ s16 field_0x65c; + /* 0x65E */ s16 mExtraZRot; + /* 0x660 */ u8 field_0x660[0x667 - 0x660]; + /* 0x667 */ u8 mType; + /* 0x668 */ u8 mAction; /* 0x669 */ u8 mStatusFlags; /* 0x66A */ u8 mMode; /* 0x66B */ u8 mCurState; - /* 0x66C */ u8 field23_0x66c[0x674 - 0x66C]; + /* 0x66C */ u8 field_0x66c; + /* 0x66D */ u8 field_0x66D[0x670 - 0x66D]; + /* 0x670 */ u32 mDemoItemBsPcId; /* 0x674 */ dPa_rippleEcallBack mPtclRippleCb; /* 0x688 */ dPa_followEcallBack mPtclFollowCb; /* 0x69C */ dPa_smokeEcallBack mPtclSmokeCb; /* 0x6BC */ JPABaseEmitter* mpParticleEmitter; + + // TODO add enums for type, action, state, and status flags + // state 7 is probably "about to start an item get demo" }; STATIC_ASSERT(sizeof(daItem_c) == 0x6C0); +class daItem_prm { +public: + static u32 getType(daItem_c* item) { return (fpcM_GetParam(item) & 0x03000000) >> 0x18; } + static u32 getAction(daItem_c* item) { return (fpcM_GetParam(item) & 0xFC000000) >> 0x1A; } + static u32 getItemNo(daItem_c* item) { return (fpcM_GetParam(item) & 0x000000FF) >> 0x00; } + static u32 getItemBitNo(daItem_c* item) { return (fpcM_GetParam(item) & 0x0000FF00) >> 0x08; } + static u32 getSwitchNo(daItem_c* item) { return (item->orig.angle.z & 0x00FF) >> 0; } + static u32 getSwitchNo2(daItem_c* item) { return (fpcM_GetParam(item) & 0x00FF0000) >> 0x10; } +}; + #endif /* D_A_ITEM_H */ \ No newline at end of file diff --git a/include/d/actor/d_a_itembase.h b/include/d/actor/d_a_itembase.h index ecd34edbe..c6279c2ec 100644 --- a/include/d/actor/d_a_itembase.h +++ b/include/d/actor/d_a_itembase.h @@ -12,24 +12,25 @@ class mDoExt_brkAnm; class mDoExt_bckAnm; struct daItemBase_c_m_data { - /* 0x00 */ float mFieldItemGravity; - /* 0x04 */ float field1_0x4; - /* 0x08 */ float field2_0x8; - /* 0x0C */ float mScaleAnimSpeed; - /* 0x10 */ float field4_0x10; - /* 0x14 */ short field5_0x14; - /* 0x16 */ short mDuration; - /* 0x18 */ short field7_0x18; - /* 0x1A */ u8 field8_0x1a; - /* 0x1B */ u8 field9_0x1b; - /* 0x1C */ short mNumFramesPerFullSpin; - u8 temp1[0x1A]; + /* 0x00 */ f32 mFieldItemGravity; + /* 0x04 */ f32 field_0x04; + /* 0x08 */ f32 field_0x08; + /* 0x0C */ f32 mScaleAnimSpeed; + /* 0x10 */ f32 field_0x10; + /* 0x14 */ s16 field_0x14; + /* 0x16 */ s16 mDuration; + /* 0x18 */ s16 field_0x18; + /* 0x1A */ u8 field_0x1A[0x1C - 0x1A]; + /* 0x1C */ s16 mNumFramesPerFullSpin; + /* 0x1E */ u8 field_0x1E[0x2A - 0x1E]; + /* 0x2A */ s16 mHeartMaxRandomZRot; + /* 0x2C */ u8 field_0x2C[0x38 - 0x2C]; /* 0x38 */ f32 mPickedUpInitialSpeedY; /* 0x3C */ f32 mPickedUpGravity; - /* 0x40 */ short field45_0x40; - /* 0x42 */ short field47_0x42; - u8 temp2[0x4]; - /* 0x48 */ float mVelocityScale; + /* 0x40 */ s16 field_0x40; + /* 0x42 */ s16 field_0x42; + /* 0x44 */ void* field_0x44; + /* 0x48 */ f32 mVelocityScale; }; STATIC_ASSERT(sizeof(daItemBase_c_m_data) == 0x4C); diff --git a/include/d/actor/d_a_player.h b/include/d/actor/d_a_player.h index f447c3b55..21be71793 100644 --- a/include/d/actor/d_a_player.h +++ b/include/d/actor/d_a_player.h @@ -136,7 +136,7 @@ public: void getLeftHandPos() const; void getRopeJumpLand() const; void checkRopeForceEnd() const; - cXyz getHeadTopPos() const; + cXyz getHeadTopPos() const { return mHeadTopPos; } void changePlayer(fopAc_ac_c*); void objWindHitCheck(dCcD_Cyl*); void setDoButtonQuake(); diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index 2d0060d69..12e25c848 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -557,6 +557,10 @@ inline void dComIfGs_onSaveTbox(int i_stageNo, int i_no) { void dComIfGs_onStageTbox(int i_stageNo, int i_no); BOOL dComIfGs_isStageTbox(int i_stageNo, int i_no); +inline void dComIfGs_onSaveSwitch(int i_stageNo, int i_no) { + g_dComIfG_gameInfo.save.getSavedata().getSave(i_stageNo).getBit().onSwitch(i_no); +} + BOOL dComIfGs_isStageBossEnemy(int i_stageNo); inline BOOL dComIfGs_isStageBossEnemy() { @@ -699,6 +703,22 @@ inline BOOL dComIfGs_isGetItem(int i_field, u8 i_item) { return g_dComIfG_gameInfo.save.getPlayer().getGetItem().isItem(i_field, i_item); } +inline BOOL dComIfGs_isGetItemBeast(u8 i_beast) { + return g_dComIfG_gameInfo.save.getPlayer().getGetBagItem().isBeast(i_beast); +} + +inline void dComIfGs_onGetItemBeast(u8 i_beast) { + g_dComIfG_gameInfo.save.getPlayer().getGetBagItem().onBeast(i_beast); +} + +inline BOOL dComIfGs_isGetItemBait(u8 i_bait) { + return g_dComIfG_gameInfo.save.getPlayer().getGetBagItem().isBait(i_bait); +} + +inline void dComIfGs_onGetItemBait(u8 i_bait) { + g_dComIfG_gameInfo.save.getPlayer().getGetBagItem().onBait(i_bait); +} + inline s16 dComIfGs_getWindY() { return g_dComIfG_gameInfo.save.getPlayer().getPlayerStatusB().getWindY(); } @@ -1246,8 +1266,12 @@ inline char* dComIfGp_evmng_getMyStringP(int staffIdx, const char* name) { return reinterpret_cast(dComIfGp_getEventManager().getMySubstanceP(staffIdx, name, 4)); //type 4 is string } -inline BOOL dComIfGp_evmng_startCheck(char* eventID) { - return dComIfGp_getEventManager().startCheckOld(eventID); +inline BOOL dComIfGp_evmng_startCheck(const char* pName) { + return dComIfGp_getEventManager().startCheckOld(pName); +} + +inline BOOL dComIfGp_evmng_endCheck(const char* pName) { + return dComIfGp_getEventManager().endCheckOld(pName); } inline BOOL dComIfGp_evmng_endCheck(s16 eventID) { diff --git a/include/d/d_item.h b/include/d/d_item.h index fdd8ecdfa..188ba322b 100644 --- a/include/d/d_item.h +++ b/include/d/d_item.h @@ -377,20 +377,20 @@ void item_getcheck_func_lithograph14(); void item_getcheck_func_lithograph15(); void item_getcheck_func_lithograph16(); void getRotenItemNumInBag(); -BOOL isDaizaItem(unsigned char); -BOOL isBomb(unsigned char); -void isArrow(unsigned char); -void isEmono(unsigned char); -void isEsa(unsigned char); -void isRupee(unsigned char); -void isLimitedItem(unsigned char); -void isNonSavedEmono(unsigned char); -BOOL isUseClothPacket(unsigned char); -void isTriforce(unsigned char); -void isHeart(unsigned char); -void getItemNoByLife(unsigned char); +BOOL isDaizaItem(u8); +BOOL isBomb(u8); +BOOL isArrow(u8); +BOOL isEmono(u8); +BOOL isEsa(u8); +BOOL isRupee(u8); +BOOL isLimitedItem(u8); +BOOL isNonSavedEmono(u8); +BOOL isUseClothPacket(u8); +BOOL isTriforce(u8); +BOOL isHeart(u8); +void getItemNoByLife(u8); void check_itemno(int); -void getEmonoItemFromLifeBallTable(unsigned short); -void getItemFromLifeBallTableWithoutEmono(unsigned short); +void getEmonoItemFromLifeBallTable(u16); +void getItemFromLifeBallTableWithoutEmono(u16); #endif /* D_ITEM_H */ \ No newline at end of file diff --git a/include/d/d_item_data.h b/include/d/d_item_data.h index a330605d2..6cd9975bf 100644 --- a/include/d/d_item_data.h +++ b/include/d/d_item_data.h @@ -299,7 +299,7 @@ struct dItem_data_item_info { /* 0x00 */ u8 mShadowSize; /* 0x01 */ u8 mCollisionH; // Cylinder Height /* 0x02 */ u8 mCollisionR; // Cylinder Radius - /* 0x03 */ u8 mFlag; + /* 0x03 */ u8 mFlag; // TODO enum }; STATIC_ASSERT(sizeof(dItem_data_item_info) == 0x4); diff --git a/include/f_op/f_op_actor_mng.h b/include/f_op/f_op_actor_mng.h index 1f304ca48..a9276e256 100644 --- a/include/f_op/f_op_actor_mng.h +++ b/include/f_op/f_op_actor_mng.h @@ -412,23 +412,18 @@ s32 fopAcM_rollPlayerCrash(fopAc_ac_c*, f32, u32); s32 fopAcM_checkCullingBox(f32[3][4], f32, f32, f32, f32, f32, f32); s32 fopAcM_cullingCheck(fopAc_ac_c*); void* event_second_actor(u16); -s32 fopAcM_orderTalkEvent(fopAc_ac_c*, fopAc_ac_c*, u16, u16); -s32 fopAcM_orderTalkItemBtnEvent(u16, fopAc_ac_c*, fopAc_ac_c*, u16, u16); +s32 fopAcM_orderTalkEvent(fopAc_ac_c*, fopAc_ac_c*); s32 fopAcM_orderSpeakEvent(fopAc_ac_c* i_actor); -s32 fopAcM_orderDoorEvent(fopAc_ac_c*, fopAc_ac_c*, u16, u16); -s32 fopAcM_orderCatchEvent(fopAc_ac_c*, fopAc_ac_c*, u16, u16); -s32 fopAcM_orderOtherEvent(fopAc_ac_c*, char*, u16, u16, u16); -s32 fopAcM_orderOtherEvent(fopAc_ac_c*, fopAc_ac_c*, char*, u16, u16, u16); +s32 fopAcM_orderDoorEvent(fopAc_ac_c*, fopAc_ac_c*); +s32 fopAcM_orderCatchEvent(fopAc_ac_c*, fopAc_ac_c*); s32 fopAcM_orderOtherEvent2(fopAc_ac_c*, char*, u16, u16); s32 fopAcM_orderChangeEventId(fopAc_ac_c* i_this, s16 eventIdx, u16 flag, u16 hind); s32 fopAcM_orderChangeEventId(fopAc_ac_c* i_this, fopAc_ac_c* i_partner, s16 eventIdx, u16 flag, u16 hind); s32 fopAcM_orderOtherEventId(fopAc_ac_c* actor, s16 eventID, u8 mapToolID, u16 param_3, u16 priority, u16 flag); -s32 fopAcM_orderMapToolEvent(fopAc_ac_c*, u8, s16, u16, u16, u16); -s32 fopAcM_orderMapToolAutoNextEvent(fopAc_ac_c*, u8, s16, u16, u16, u16); s32 fopAcM_orderPotentialEvent(fopAc_ac_c*, u16, u16, u16); -s32 fopAcM_orderItemEvent(fopAc_ac_c*, u16, u16); -s32 fopAcM_orderTreasureEvent(fopAc_ac_c*, fopAc_ac_c*, u16, u16); +s32 fopAcM_orderItemEvent(fopAc_ac_c*); +s32 fopAcM_orderTreasureEvent(fopAc_ac_c*, fopAc_ac_c*); fopAc_ac_c* fopAcM_getTalkEventPartner(fopAc_ac_c*); fopAc_ac_c* fopAcM_getItemEventPartner(fopAc_ac_c*); fopAc_ac_c* fopAcM_getEventPartner(fopAc_ac_c*); diff --git a/src/d/actor/d_a_agb.cpp b/src/d/actor/d_a_agb.cpp index 00720cf6f..f15566d00 100644 --- a/src/d/actor/d_a_agb.cpp +++ b/src/d/actor/d_a_agb.cpp @@ -413,7 +413,7 @@ void daAgb_c::modeLoad() { (this->*func)(); } else { mUploadAction = 0; - mEvtInfo.onCondition(1); + mEvtInfo.onCondition(dEvtCnd_CANTALK_e); mMode = 0; } } diff --git a/src/d/actor/d_a_item.cpp b/src/d/actor/d_a_item.cpp index 1f5a2e500..194139443 100644 --- a/src/d/actor/d_a_item.cpp +++ b/src/d/actor/d_a_item.cpp @@ -11,39 +11,17 @@ #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 "dolphin/types.h" class dCcD_GObjInf; -dCcD_SrcCyl daItem_c::m_cyl_src = { - // dCcD_SrcGObjInf - { - /* Flags */ 0, - /* SrcObjAt Type */ 0, - /* SrcObjAt Atp */ 0, - /* SrcObjAt SPrm */ 0, - /* SrcObjTg Type */ 0xFFFFFFFF, - /* SrcObjTg SPrm */ 0x09, - /* SrcObjCo SPrm */ 0x59, - /* SrcGObjAt Se */ 0, - /* SrcGObjAt HitMark */ 0, - /* SrcGObjAt Spl */ 0, - /* SrcGObjAt Mtrl */ 0, - /* SrcGObjAt GFlag */ 0, - /* SrcGObjTg Se */ 0, - /* SrcGObjTg HitMark */ 0, - /* SrcGObjTg Spl */ 0, - /* SrcGObjTg Mtrl */ 0, - /* SrcGObjTg GFlag */ 0x04, - /* SrcGObjCo GFlag */ 0, - }, - // cM3dGCylS - { - /* Center */ 0.0f, 0.0f, 0.0f, - /* Radius */ 10.0f, - /* Height */ 50.0f, - }, -}; +// 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}; + +s32 daItem_c::m_timer_max = 10000; /* 800F4BC8-800F4BD4 .text getData__12daItemBase_cFv */ daItemBase_c_m_data* daItemBase_c::getData() { @@ -51,8 +29,11 @@ daItemBase_c_m_data* daItemBase_c::getData() { } /* 800F4BD4-800F4C4C .text setArrowTrans__Fs4cXyz */ -void setArrowTrans(short, cXyz) { - /* Nonmatching */ +cXyz setArrowTrans(s16 yRot, cXyz offset) { + cXyz arrowTrans = offset; + mDoMtx_stack_c::YrotS(yRot); + mDoMtx_stack_c::multVec(&arrowTrans, &arrowTrans); + return arrowTrans; } /* 800F4C4C-800F4CD8 .text getYOffset__8daItem_cFv */ @@ -72,10 +53,10 @@ float daItem_c::getYOffset() { case GREEN_JELLY: case BLUE_JELLY: return 0.0f; - case SWORD: - return 20.0f; case SHIELD: return 23.0f; + case SWORD: + return 20.0f; case DROPPED_SWORD: return 10.0f; case GREEN_RUPEE: @@ -99,22 +80,61 @@ float daItem_c::getYOffset() { /* 800F4CD8-800F4E6C .text set_mtx__8daItem_cFv */ void daItem_c::set_mtx() { - /* Nonmatching */ + cXyz pos = current.pos; + csXyz rot = current.angle; + if (m_itemNo == UTUWA_HEART) { + rot.y = shape_angle.y; + } + set_mtx_base(mpModel, pos, rot); + + if (isArrow(m_itemNo)) { + cXyz offset(5.0f, 0.0f, 10.0f); + cXyz arrowTrans = setArrowTrans(current.angle.y, offset); + + pos += arrowTrans; + set_mtx_base(mpModelArrow[0], pos, rot); + + pos += arrowTrans; + set_mtx_base(mpModelArrow[1], pos, rot); + } } /* 800F4E6C-800F4FDC .text set_mtx_base__8daItem_cFP8J3DModel4cXyz5csXyz */ -void daItem_c::set_mtx_base(J3DModel*, cXyz, csXyz) { - /* Nonmatching */ +void daItem_c::set_mtx_base(J3DModel* pModel, cXyz pos, csXyz rot) { + if (!pModel) { + return; + } + + pModel->setBaseScale(mScale); + + mDoMtx_stack_c::transS(pos.x, pos.y + getYOffset(), pos.z); + + if (isRupee(m_itemNo)) { + u8 height = dItem_data::getH(m_itemNo); + mDoMtx_stack_c::transM(0.0f, height/2.0f, 0.0f); + } + + mDoMtx_stack_c::ZXYrotM(rot.x, rot.y, rot.z + mExtraZRot); + + if (isRupee(m_itemNo)) { + u8 height = dItem_data::getH(m_itemNo); + mDoMtx_stack_c::transM(0.0f, -height/2.0f, 0.0f); + } + + pModel->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 800F4FDC-800F5044 .text itemGetCallBack__FP10fopAc_ac_cP12dCcD_GObjInfP10fopAc_ac_cP12dCcD_GObjInf */ -void itemGetCallBack(fopAc_ac_c*, dCcD_GObjInf*, fopAc_ac_c*, dCcD_GObjInf*) { - /* Nonmatching */ +void itemGetCallBack(fopAc_ac_c* item_actor, dCcD_GObjInf*, fopAc_ac_c* collided_actor, dCcD_GObjInf*) { + daItem_c* item = (daItem_c*)item_actor; + daPy_lk_c* link = daPy_getPlayerLinkActorClass(); + if (item && item->checkPlayerGet() && collided_actor && collided_actor == link) { + item->itemGetExecute(); + } } /* 800F5044-800F53EC .text CreateInit__8daItem_cFv */ void daItem_c::CreateInit() { - /* Nonmatching */ mAcchCir.SetWall(30.0f, 30.0f); cXyz* speedPtr; mAcch.Set(¤t.pos, &next.pos, this, 1, &mAcchCir, speedPtr = &speed, NULL, NULL); @@ -139,17 +159,15 @@ void daItem_c::CreateInit() { mCyl.SetH(height); mItemTimer = getData()->mDuration; - field7_0x65a = getData()->field7_0x18; - field3_0x650 = speedPtr->y; + field_0x65a = getData()->field_0x18; + field_0x650 = speedPtr->y; mCurState = 0; - mUnknownParam = (fpcM_GetParam(this) & 0x03000000) >> 0x18; - // TODO: should probably add inlines here - // e.g. getType__10daItem_prmFP8daItem_c etc - if ((fpcM_GetParam(this) & 0x03000000) >> 0x18 == 3 || (fpcM_GetParam(this) & 0x03000000) >> 0x18 == 1) { + mType = daItem_prm::getType(this); + if (daItem_prm::getType(this) == 3 || daItem_prm::getType(this) == 1) { mStatusFlags |= 2; } - mItemAction = (fpcM_GetParam(this) & 0xFC000000) >> 0x1A; + mAction = daItem_prm::getAction(this); show(); @@ -174,12 +192,12 @@ void daItem_c::CreateInit() { break; } - mSwitchId = (fpcM_GetParam(this) & 0x00FF0000) >> 0x10; + mSwitchId = daItem_prm::getSwitchNo2(this); if (mSwitchId != 0xFF && !fopAcM_isSwitch(this, mSwitchId)) { hide(); mStatusFlags |= 2; } - mActivationSwitch = (orig.angle.z & 0x00FF) >> 0; + mActivationSwitch = daItem_prm::getSwitchNo(this); current.angle.z = 0; orig.angle.z = 0; @@ -198,25 +216,23 @@ void daItem_c::CreateInit() { set_mtx(); animPlay(1.0f, 1.0f, 1.0f, 1.0f, 1.0f); - s16 procname = PROC_BST; // Gohdan - if (fopAcIt_Judge(&fpcSch_JudgeForPName, &procname)) { + if (fopAcM_SearchByName(PROC_BST)) { // Gohdan mpParticleEmitter = dComIfGp_particle_set(0x81E1, ¤t.pos, NULL, NULL, 0xFF, NULL, -1, NULL, NULL, NULL); } } /* 800F53EC-800F5668 .text _daItem_create__8daItem_cFv */ s32 daItem_c::_daItem_create() { - /* Nonmatching */ fopAcM_SetupActor(this, daItem_c); - m_itemNo = (fpcM_GetParam(this) & 0x000000FF) >> 0x00; + m_itemNo = daItem_prm::getItemNo(this); if (!dItem_data::getFieldArc(m_itemNo)) { setLoadError(); return cPhs_ERROR_e; } - mPickupFlag = (fpcM_GetParam(this) & 0x0000FF00) >> 0x08; + mPickupFlag = daItem_prm::getItemBitNo(this); if (m_itemNo != BLUE_JELLY) { // Blue Chu Jelly uses mPickupFlag as if it was a switch. mPickupFlag &= 0x7F; if (dComIfGs_isItem(mPickupFlag, orig.roomNo) && mPickupFlag != 0x7F) { @@ -228,11 +244,11 @@ s32 daItem_c::_daItem_create() { s32 phase_state = dComIfG_resLoad(&mPhs, dItem_data::getFieldArc(m_itemNo)); if (phase_state == cPhs_COMPLEATE_e) { - s32 result = fopAcM_entrySolidHeap(this, &CheckFieldItemCreateHeap, dItem_data::getFieldHeapSize(m_itemNo)); - if (!result) { + // Note: The demo version calls getHeapSize instead of getFieldHeapSize here. + u32 heap_size = dItem_data::getFieldHeapSize(m_itemNo); + if (!fopAcM_entrySolidHeap(this, &CheckFieldItemCreateHeap, heap_size)) { return cPhs_ERROR_e; } - CreateInit(); } @@ -240,57 +256,191 @@ s32 daItem_c::_daItem_create() { } /* 800F5668-800F5834 .text _daItem_execute__8daItem_cFv */ -s32 daItem_c::_daItem_execute() { - /* Nonmatching */ +BOOL daItem_c::_daItem_execute() { + if (mSwitchId != 0xFF && !fopAcM_isSwitch(this, mSwitchId)) { + return TRUE; + } + if (mSwitchId != 0xFF && fopAcM_isSwitch(this, mSwitchId)) { + show(); + } + + timeCount(); + + mEyePos = current.pos; + mEyePos.y += dItem_data::getH(m_itemNo)/2.0f; + mAttentionInfo.mPosition = current.pos; + + switch (mCurState) { + case 3: + execBringNezumi(); + break; + case 0: + case 1: + if (checkActionNow()) { + mCurState = 1; + } else { + mCurState = 0; + } + case 2: + execWaitMain(); + break; + case 5: + execInitNormalDirection(); + case 6: + execMainNormalDirection(); + break; + case 7: + execInitGetDemoDirection(); + break; + case 8: + execWaitGetDemoDirection(); + break; + case 9: + execMainGetDemoDirection(); + break; + case 0xA: + case 0xB: + execWaitMainFromBoss(); + break; + } + + animPlay(1.0f, 1.0f, 1.0f, 1.0f, 1.0f); + set_mtx(); + + return TRUE; } /* 800F5834-800F59CC .text mode_proc_call__8daItem_cFv */ void daItem_c::mode_proc_call() { - /* Nonmatching */ + static daItem_c_ModeFunc mode_proc[] = { + &mode_wait, + &mode_wait, + &mode_water, + }; + + if (mType == 1) { + itemDefaultRotateY(); + } else { + (this->*mode_proc[mMode])(); + } + + if (mStatusFlags & 0x08) { + fopAc_ac_c* boomerang = (fopAc_ac_c*)fopAcM_SearchByName(PROC_BOOMERANG); + if (boomerang) { + current.pos = boomerang->current.pos; + } else { + mStatusFlags &= ~0x08; + } + } + + if (mStatusFlags & 0x40) { + fopAc_ac_c* grappling_hook = (fopAc_ac_c*)fopAcM_SearchByName(PROC_HIMO2); + if (grappling_hook) { + current.pos = grappling_hook->current.pos; + } else { + mStatusFlags &= ~0x40; + } + } + + if (mType == 1 && (fopAcM_checkHookCarryNow(this) || mStatusFlags & 0x08)) { + mType = 3; + } } /* 800F59CC-800F5AFC .text execInitNormalDirection__8daItem_cFv */ void daItem_c::execInitNormalDirection() { - /* Nonmatching */ - daPy_getPlayerActorClass()->getHeadTopPos(); - - field8_0x65c = getData()->field45_0x40; + daPy_py_c* player = daPy_getPlayerActorClass(); + cXyz headPos = player->getHeadTopPos(); + headPos.y += 15.0f; + current.pos = headPos; + current.angle.z = 0; + current.angle.x = 0; + mScale.set(mScaleTarget.x, mScaleTarget.y, mScaleTarget.z); + mExtraZRot = 0; + field_0x65c = getData()->field_0x40; f32 speedY = getData()->mPickedUpInitialSpeedY; - speed.x = 0; - speed.y = speedY; - speed.z = 0; + speed.set(0.0f, speedY, 0.0f); mGravity = getData()->mPickedUpGravity; show(); - // TODO dPa_smokeEcallBack - // TODO mpParticleEmitter + mCyl.SetTgType(0); + mCyl.OffCoSPrmBit(1); + + mPtclSmokeCb.end(); + if (mpParticleEmitter) { + mpParticleEmitter->becomeInvalidEmitter(); + mpParticleEmitter = NULL; + } + + mCurState = 6; } /* 800F5AFC-800F5BC8 .text execMainNormalDirection__8daItem_cFv */ void daItem_c::execMainNormalDirection() { - /* Nonmatching */ + daPy_py_c* player = daPy_getPlayerActorClass(); + cXyz headPos = player->getHeadTopPos(); + headPos.y += 15.0f; + current.pos.x = headPos.x; + current.pos.z = headPos.z; + fopAcM_posMoveF(this, NULL); + if (current.pos.y < headPos.y) { + current.pos.y = headPos.y; + } + + current.angle = dComIfGp_getCamera(0)->mAngle; + + field_0x65c--; + if (field_0x65c < 0) { + fopAcM_delete(this); + } } /* 800F5BC8-800F5C68 .text execInitGetDemoDirection__8daItem_cFv */ void daItem_c::execInitGetDemoDirection() { - /* Nonmatching */ + fopAc_ac_c* player = daPy_getPlayerActorClass(); + daPy_lk_c* link = daPy_getPlayerLinkActorClass(); + + hide(); + mPtclFollowCb.end(); + + if (player == link) { + fopAcM_orderItemEvent(this); + mEvtInfo.onCondition(dEvtCnd_CANGETITEM_e); + mDemoItemBsPcId = fopAcM_createItemForTrBoxDemo(¤t.pos, m_itemNo, -1, current.roomNo, NULL, NULL); + mCurState = 8; + } } /* 800F5C68-800F5CDC .text execWaitGetDemoDirection__8daItem_cFv */ void daItem_c::execWaitGetDemoDirection() { - /* Nonmatching */ + hide(); + + if (mEvtInfo.checkCommandItem()) { + mCurState = 9; + if (mDemoItemBsPcId != -1) { + dComIfGp_event_setItemPartnerId(mDemoItemBsPcId); + } + } else { + fopAcM_orderItemEvent(this); + mEvtInfo.onCondition(dEvtCnd_CANGETITEM_e); + } } /* 800F5CDC-800F5D44 .text execMainGetDemoDirection__8daItem_cFv */ void daItem_c::execMainGetDemoDirection() { - /* Nonmatching */ + hide(); + + if (dComIfGp_evmng_endCheck("DEFAULT_GETITEM")) { + dComIfGp_event_reset(); + fopAcM_delete(this); + } } /* 800F5D44-800F5D88 .text execBringNezumi__8daItem_cFv */ void daItem_c::execBringNezumi() { - if (mUnknownParam != 1) { + if (mType != 1) { fopAcM_posMoveF(this, mStts.GetCCMoveP()); } mode_proc_call(); @@ -298,25 +448,79 @@ void daItem_c::execBringNezumi() { /* 800F5D88-800F5F40 .text execWaitMain__8daItem_cFv */ void daItem_c::execWaitMain() { - /* Nonmatching */ + checkGetItem(); + if (mType != 1) { + fopAcM_posMoveF(this, mStts.GetCCMoveP()); + } + mode_proc_call(); + + if (!(mStatusFlags & 0x02)) { + f32 temp1 = mScaleTarget.x / getData()->mScaleAnimSpeed; + f32 temp2 = mScaleTarget.y / getData()->mScaleAnimSpeed; + f32 temp3 = mScaleTarget.z / getData()->mScaleAnimSpeed; + cLib_chaseF(&mScale.x, mScaleTarget.x, temp1); + cLib_chaseF(&mScale.y, mScaleTarget.y, temp2); + cLib_chaseF(&mScale.z, mScaleTarget.z, temp3); + } + + if (checkItemDisappear() && mItemTimer == 0) { + if (field_0x65a == 0) { + fopAcM_delete(this); + } + s32 temp1 = getData()->field_0x14; + s32 temp2 = field_0x634 / temp1; + if (!(field_0x634 - temp2 * temp1)) { + changeDraw(); + } + } + + if (!dItem_data::chkFlag(m_itemNo, 2)) { + if (mActivationSwitch == 0xFF || (mActivationSwitch != 0xFF && fopAcM_isSwitch(this, mActivationSwitch))) { + mCyl.SetC(current.pos); + dComIfG_Ccsp()->Set(&mCyl); + } + } } /* 800F5F40-800F5FC0 .text execWaitMainFromBoss__8daItem_cFv */ void daItem_c::execWaitMainFromBoss() { - /* Nonmatching */ + checkGetItem(); + if (mType != 1) { + fopAcM_posMoveF(this, mStts.GetCCMoveP()); + } + mode_proc_call(); + + if (mCurState != 0xB) { + scaleAnimFromBossItem(); + } + + mCyl.SetC(current.pos); + dComIfG_Ccsp()->Set(&mCyl); } /* 800F5FC0-800F60C0 .text scaleAnimFromBossItem__8daItem_cFv */ void daItem_c::scaleAnimFromBossItem() { - /* Nonmatching */ + if (field_0x638 < 30) { + mScale.x = cM_ssin(field_0x634*0x2000 - 0x4000)*2.0f / field_0x634+1.0f; + if (mScale.x < 0.0f) { + mScale.x = 0.0f; + } + mScale.y = mScale.x; + mScale.z = mScale.x; + } else { + if (field_0x638 == 30) { + fopAcM_seStart(this, JA_SE_CM_BOSS_HEART_APPEAR, 0); + } + mScale.setAll(1.0f); + } } /* 800F60C0-800F6110 .text _daItem_draw__8daItem_cFv */ -s32 daItem_c::_daItem_draw() { +BOOL daItem_c::_daItem_draw() { if (chkDraw()) { return DrawBase(); } - return 1; + return TRUE; } /* 800F6110-800F61C8 .text setTevStr__8daItem_cFv */ @@ -340,22 +544,241 @@ void daItem_c::setTevStr() { } /* 800F61C8-800F6268 .text _daItem_delete__8daItem_cFv */ -s32 daItem_c::_daItem_delete() { - /* Nonmatching */ +BOOL daItem_c::_daItem_delete() { mPtclRippleCb.end(); - // TODO + mPtclFollowCb.end(); + mPtclSmokeCb.end(); + if (mpParticleEmitter) { + mpParticleEmitter->becomeInvalidEmitter(); + mpParticleEmitter = NULL; + } + DeleteBase(dItem_data::getFieldArc(m_itemNo)); + + return TRUE; } /* 800F6268-800F6434 .text Reflect__FR4cXyzP4cXyzff */ -void Reflect(cXyz&, cXyz*, float, float) { - /* Nonmatching */ +bool Reflect(cXyz& surfVec, cXyz* moveVec, f32 param_2, f32 xzMult) { + // Reflects a vector off the normal of a surface. + cXyz reflectVec; + cXyz moveNorm; + cXyz surfNorm; + f32 mag = moveVec->abs(); + moveNorm = moveVec->normalize(); + surfNorm = surfVec.normalize(); + moveNorm = moveNorm * -1.0f; + f32 dot = 2.0f*surfNorm.getDotProduct(moveNorm); + bool hitFront = true; + if (dot < 0.0f) { + hitFront = false; + } + reflectVec = (surfNorm * dot) - moveNorm; + reflectVec *= mag; + moveVec->x = reflectVec.x * xzMult; + moveVec->y = reflectVec.y; + moveVec->z = reflectVec.z * xzMult; + return hitFront; } /* 800F6434-800F6D24 .text itemGetExecute__8daItem_cFv */ void daItem_c::itemGetExecute() { - /* Nonmatching */ - execItemGet(m_itemNo); + if (mCurState == 5) { + return; + } + mCurState = 5; + + switch (m_itemNo) { + case HEART: + mDoAud_seStart(JA_SE_HEART_PIECE, NULL, 0, 0); + execItemGet(m_itemNo); + break; + case GREEN_RUPEE: + mDoAud_seStart(JA_SE_LUPY_GET, NULL, 0, 0); + execItemGet(m_itemNo); + break; + case BLUE_RUPEE: + mDoAud_seStart(JA_SE_BLUE_LUPY_GET, NULL, 0, 0); + execItemGet(m_itemNo); + break; + case YELLOW_RUPEE: + mDoAud_seStart(JA_SE_BLUE_LUPY_GET, NULL, 0, 0); + execItemGet(m_itemNo); + break; + case RED_RUPEE: + mDoAud_seStart(JA_SE_RED_LUPY_GET, NULL, 0, 0); + execItemGet(m_itemNo); + break; + case PURPLE_RUPEE: + mDoAud_seStart(JA_SE_RED_LUPY_GET, NULL, 0, 0); + execItemGet(m_itemNo); + break; + case ORANGE_RUPEE: + mDoAud_seStart(JA_SE_RED_LUPY_GET, NULL, 0, 0); + execItemGet(m_itemNo); + break; + case SILVER_RUPEE: + 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; + break; + case S_MAGIC: + mDoAud_seStart(JA_SE_MAGIC_POT_GET_S, NULL, 0, 0); + execItemGet(m_itemNo); + break; + case L_MAGIC: + mDoAud_seStart(JA_SE_MAGIC_POT_GET_L, NULL, 0, 0); + execItemGet(m_itemNo); + break; + case BOMB_5: + case BOMB_10: + case BOMB_20: + case BOMB_30: + mDoAud_seStart(JA_SE_CONSUMP_ITEM_GET, NULL, 0, 0); + execItemGet(m_itemNo); + break; + case SMALL_KEY: + mCurState = 7; + break; + case TRIPLE_HEART: + mDoAud_seStart(JA_SE_HEART_PIECE, NULL, 0, 0); + execItemGet(m_itemNo); + break; + case PENDANT: + mDoAud_seStart(JA_SE_SPOILS_GET, NULL, 0, 0); + if (!dComIfGs_isGetItemBeast(7)) { + mCurState = 7; + dComIfGs_onGetItemBeast(7); + } else { + execItemGet(m_itemNo); + } + break; + case DEKU_LEAF: + mCurState = 7; + break; + case SWORD: + daItem_c* item = (daItem_c*)fopAcM_SearchByName(PROC_ITEM); + if (item && item->m_itemNo == SHIELD) { + item->itemGetExecute(); + } + mCurState = 7; + break; + case SHIELD: + item = (daItem_c*)fopAcM_SearchByName(PROC_ITEM); + if (item && item->m_itemNo == SWORD) { + item->itemGetExecute(); + } + mCurState = 7; + break; + case DROPPED_SWORD: + mCurState = 7; + break; + case SKULL_NECKLACE: + mDoAud_seStart(JA_SE_SPOILS_GET, NULL, 0, 0); + if (!dComIfGs_isGetItemBeast(0)) { + mCurState = 7; + dComIfGs_onGetItemBeast(0); + } else { + execItemGet(m_itemNo); + } + break; + case BOKOBABA_SEED: + mDoAud_seStart(JA_SE_SPOILS_GET, NULL, 0, 0); + if (!dComIfGs_isGetItemBeast(1)) { + mCurState = 7; + dComIfGs_onGetItemBeast(1); + } else { + execItemGet(m_itemNo); + } + break; + case GOLDEN_FEATHER: + mDoAud_seStart(JA_SE_SPOILS_GET, NULL, 0, 0); + if (!dComIfGs_isGetItemBeast(2)) { + mCurState = 7; + dComIfGs_onGetItemBeast(2); + } else { + execItemGet(m_itemNo); + } + break; + case BOKO_BELT: + mDoAud_seStart(JA_SE_SPOILS_GET, NULL, 0, 0); + if (!dComIfGs_isGetItemBeast(3)) { + mCurState = 7; + dComIfGs_onGetItemBeast(3); + } else { + execItemGet(m_itemNo); + } + break; + case RED_JELLY: + mDoAud_seStart(JA_SE_SPOILS_GET, NULL, 0, 0); + if (!dComIfGs_isGetItemBeast(4)) { + mCurState = 7; + dComIfGs_onGetItemBeast(4); + } else { + execItemGet(m_itemNo); + } + break; + case GREEN_JELLY: + mDoAud_seStart(JA_SE_SPOILS_GET, NULL, 0, 0); + if (!dComIfGs_isGetItemBeast(5)) { + mCurState = 7; + dComIfGs_onGetItemBeast(5); + } else { + execItemGet(m_itemNo); + } + break; + case BLUE_JELLY: + mDoAud_seStart(JA_SE_SPOILS_GET, NULL, 0, 0); + if (!dComIfGs_isGetItemBeast(6)) { + mCurState = 7; + 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(1)) { + mCurState = 7; + dComIfGs_onGetItemBait(1); + } else { + execItemGet(m_itemNo); + } + break; + } + + u8 roomNo = getRoomNo(); + s32 flag = mPickupFlag; + if (m_itemNo == BLUE_JELLY) { + // Blue Chu Jelly uses mPickupFlag as if it was a switch. + // Specifically a switch in stageNo 0xE, which is not used for anything else. + dComIfGs_onSaveSwitch(0xE, flag); + } else { + dComIfGs_onItem(flag, (s8)roomNo); + } + + mStatusFlags &= ~0x4; + + mCyl.SetTgType(0); + mCyl.OffCoSPrmBit(1); + mCyl.ClrTgHit(); + mCyl.ClrCoHit(); } /* 800F6D24-800F6D78 .text itemDefaultRotateY__8daItem_cFv */ @@ -366,8 +789,8 @@ void daItem_c::itemDefaultRotateY() { } /* 800F6D78-800F6E54 .text checkItemDisappear__8daItem_cFv */ -bool daItem_c::checkItemDisappear() { - bool disappearing = true; +BOOL daItem_c::checkItemDisappear() { + BOOL disappearing = true; if (mCurState == 3) { disappearing = false; show(); @@ -405,7 +828,7 @@ void daItem_c::setItemTimer(int timer) { /* 800F6E74-800F6EC8 .text checkPlayerGet__8daItem_cFv */ BOOL daItem_c::checkPlayerGet() { - if (field_0x638 < getData()->field47_0x42) { + if (field_0x638 < getData()->field_0x42) { return FALSE; } if (mCurState == 3) { @@ -446,18 +869,77 @@ void daItem_c::itemActionForArrow() { /* 800F7AF0-800F7BF8 .text checkWall__8daItem_cFv */ void daItem_c::checkWall() { - /* Nonmatching */ + // If the item hit a wall, bounce off. + if (!mAcch.ChkWallHit()) { + return; + } + + cM3dGPla* wallPlane = dComIfG_Bgsp()->GetTriPla(mAcchCir.GetBgIndex(), mAcchCir.GetPolyIndex()); + cXyz wallNorm = wallPlane->mNormal; + + cXyz vel; + vel.x = speedF * cM_ssin(current.angle.y); + vel.y = speed.y; + vel.z = speedF * cM_scos(current.angle.y); + + if (!cM3d_IsZero(vel.x) || !cM3d_IsZero(vel.z)) { + Reflect(wallNorm, &vel, 1.0f, 1.0f); + if (!cM3d_IsZero(vel.x)) { + current.angle.y = cM_atan2s(vel.x, vel.z); + } + } } /* 800F7BF8-800F7DDC .text set_bound_se__8daItem_cFv */ void daItem_c::set_bound_se() { - /* Nonmatching */ + if (field_0x638 < 10) { + return; + } + + f32 temp2 = fabs(field_0x650); + temp2 = 2.0f * temp2; + u32 temp = temp2; + if (temp > 100) { + temp = 100; + } + + switch (m_itemNo) { + case GREEN_RUPEE: + case BLUE_RUPEE: + case YELLOW_RUPEE: + case RED_RUPEE: + case PURPLE_RUPEE: + case ORANGE_RUPEE: + fopAcM_seStart(this, JA_SE_OBJ_LUPY_BOUND, temp); + break; + case S_MAGIC: + case L_MAGIC: + fopAcM_seStart(this, JA_SE_OBJ_M_POT_BOUND, temp); + break; + case ARROW_10: + case ARROW_20: + case ARROW_30: + case MAGIC_ARROW: + case LIGHT_ARROW: + fopAcM_seStart(this, JA_SE_CM_BST_ARROW_BOUND, temp); + break; + case KAKERA_HEART: + case UTUWA_HEART: + fopAcM_seStart(this, JA_SE_CM_BST_HEART_BOUND, temp); + break; + case BOMB_5: + case BOMB_10: + case BOMB_20: + case BOMB_30: + fopAcM_seStart(this, JA_SE_CM_BST_BOMB_BOUND, temp); + break; + } } /* 800F7DDC-800F7E6C .text checkGetItem__8daItem_cFv */ -s32 daItem_c::checkGetItem() { +BOOL daItem_c::checkGetItem() { if (!checkPlayerGet()) { - return 0; + return FALSE; } if (mCyl.ChkTgHit()) { @@ -466,24 +948,39 @@ s32 daItem_c::checkGetItem() { u32 atType = hitObj->GetAtType(); if (atType & AT_TYPE_SWORD) { itemGetExecute(); - return 1; + return TRUE; } else if (atType & AT_TYPE_BOOMERANG) { mStatusFlags |= 0x08; } } } - return 0; + return FALSE; } /* 800F7E6C-800F7F0C .text timeCount__8daItem_cFv */ -void daItem_c::timeCount() { - /* Nonmatching */ +BOOL daItem_c::timeCount() { + field_0x634++; + if (field_0x638 < m_timer_max) { + field_0x638++; + } + + if (checkPlayerGet() && !dComIfGp_event_runCheck()) { + if (mItemTimer > 0) { + mItemTimer--; + } else if (field_0x65a > 0) { + field_0x65a--; + } + } + + return TRUE; } /* 800F7F0C-800F7F50 .text mode_wait_init__8daItem_cFv */ void daItem_c::mode_wait_init() { - /* Nonmatching */ + mMode = 0; + mGravity = getData()->mFieldItemGravity; + mPtclRippleCb.end(); } /* 800F7F50-800F80CC .text mode_water_init__8daItem_cFv */ @@ -507,22 +1004,22 @@ void daItem_c::initAction() { } /* 800F8950-800F8970 .text daItem_Draw__FP8daItem_c */ -s32 daItem_Draw(daItem_c* i_this) { +BOOL daItem_Draw(daItem_c* i_this) { return i_this->_daItem_draw(); } /* 800F8970-800F8990 .text daItem_Execute__FP8daItem_c */ -s32 daItem_Execute(daItem_c* i_this) { +BOOL daItem_Execute(daItem_c* i_this) { return i_this->_daItem_execute(); } /* 800F8990-800F89B0 .text daItem_IsDelete__FP8daItem_c */ -s32 daItem_IsDelete(daItem_c* i_this) { +BOOL daItem_IsDelete(daItem_c* i_this) { return i_this->_daItem_isdelete(); } /* 800F89B0-800F89D0 .text daItem_Delete__FP8daItem_c */ -s32 daItem_Delete(daItem_c* i_this) { +BOOL daItem_Delete(daItem_c* i_this) { return i_this->_daItem_delete(); } @@ -532,10 +1029,40 @@ s32 daItem_Create(fopAc_ac_c* i_this) { } /* 800F89F0-800F89F8 .text _daItem_isdelete__8daItem_cFv */ -s32 daItem_c::_daItem_isdelete() { - return 1; +BOOL daItem_c::_daItem_isdelete() { + return TRUE; } +dCcD_SrcCyl daItem_c::m_cyl_src = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ 0, + /* SrcObjAt Atp */ 0, + /* SrcObjAt SPrm */ 0, + /* SrcObjTg Type */ 0xFFFFFFFF, + /* SrcObjTg SPrm */ 0x09, + /* SrcObjCo SPrm */ 0x59, + /* SrcGObjAt Se */ 0, + /* SrcGObjAt HitMark */ 0, + /* SrcGObjAt Spl */ 0, + /* SrcGObjAt Mtrl */ 0, + /* SrcGObjAt GFlag */ 0, + /* SrcGObjTg Se */ 0, + /* SrcGObjTg HitMark */ 0, + /* SrcGObjTg Spl */ 0, + /* SrcGObjTg Mtrl */ 0, + /* SrcGObjTg GFlag */ 0x04, + /* SrcGObjCo GFlag */ 0, + }, + // cM3dGCylS + { + /* Center */ 0.0f, 0.0f, 0.0f, + /* Radius */ 10.0f, + /* Height */ 50.0f, + }, +}; + static actor_method_class l_daItem_Method = { (process_method_func)daItem_Create, (process_method_func)daItem_Delete, From 7c3f4921512384b862a79d9c7fe515b73dfdecd5 Mon Sep 17 00:00:00 2001 From: LagoLunatic Date: Mon, 25 Sep 2023 17:17:55 -0400 Subject: [PATCH 3/3] Namespace fix --- include/d/actor/d_a_item.h | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/include/d/actor/d_a_item.h b/include/d/actor/d_a_item.h index 7b82ed7ba..a56017948 100644 --- a/include/d/actor/d_a_item.h +++ b/include/d/actor/d_a_item.h @@ -94,14 +94,13 @@ public: STATIC_ASSERT(sizeof(daItem_c) == 0x6C0); -class daItem_prm { -public: - static u32 getType(daItem_c* item) { return (fpcM_GetParam(item) & 0x03000000) >> 0x18; } - static u32 getAction(daItem_c* item) { return (fpcM_GetParam(item) & 0xFC000000) >> 0x1A; } - static u32 getItemNo(daItem_c* item) { return (fpcM_GetParam(item) & 0x000000FF) >> 0x00; } - static u32 getItemBitNo(daItem_c* item) { return (fpcM_GetParam(item) & 0x0000FF00) >> 0x08; } - static u32 getSwitchNo(daItem_c* item) { return (item->orig.angle.z & 0x00FF) >> 0; } - static u32 getSwitchNo2(daItem_c* item) { return (fpcM_GetParam(item) & 0x00FF0000) >> 0x10; } +namespace daItem_prm { + inline u32 getType(daItem_c* item) { return (fpcM_GetParam(item) & 0x03000000) >> 0x18; } + inline u32 getAction(daItem_c* item) { return (fpcM_GetParam(item) & 0xFC000000) >> 0x1A; } + inline u32 getItemNo(daItem_c* item) { return (fpcM_GetParam(item) & 0x000000FF) >> 0x00; } + inline u32 getItemBitNo(daItem_c* item) { return (fpcM_GetParam(item) & 0x0000FF00) >> 0x08; } + inline u32 getSwitchNo(daItem_c* item) { return (item->orig.angle.z & 0x00FF) >> 0; } + inline u32 getSwitchNo2(daItem_c* item) { return (fpcM_GetParam(item) & 0x00FF0000) >> 0x10; } }; #endif /* D_A_ITEM_H */ \ No newline at end of file