From c163dc9ed31c69eb791be1dcdcd7ab8b296e95a1 Mon Sep 17 00:00:00 2001 From: Jeff Padgham Date: Fri, 26 Apr 2024 19:12:56 -0700 Subject: [PATCH] d_a_arrow work (#2139) * WIP commit, about halfway done * More progress, fixed up some issues * Most functions match, minor issues in draw/create, dtor needs particle work * Forgot to remove NONMATCHING define --------- Co-authored-by: GinNoOokami --- include/d/a/d_a_alink.h | 5 +- include/d/cc/d_cc_d.h | 3 + include/d/d_jnt_col.h | 2 +- include/d/particle/d_particle.h | 2 + include/rel/d/a/d_a_arrow/d_a_arrow.h | 80 +- include/rel/d/a/d_a_hozelda/d_a_hozelda.h | 2 + include/rel/d/a/e/d_a_e_pz/d_a_e_pz.h | 36 + rel/d/a/d_a_arrow/d_a_arrow.cpp | 1410 +++++++++++++++++++-- rel/d/a/e/d_a_e_pz/d_a_e_pz.cpp | 31 - src/d/a/d_a_alink_damage.inc | 6 +- src/d/d_jnt_col.cpp | 2 +- 11 files changed, 1384 insertions(+), 195 deletions(-) diff --git a/include/d/a/d_a_alink.h b/include/d/a/d_a_alink.h index 5914b1077d5..7c06fa2c6fb 100644 --- a/include/d/a/d_a_alink.h +++ b/include/d/a/d_a_alink.h @@ -1762,7 +1762,7 @@ public: /* 800D74A4 */ void setLandDamagePoint(int); /* 800D74F4 */ Vec* getDamageVec(dCcD_GObjInf*); /* 800D76C4 */ void setDashDamage(); - /* 800D7768 */ static bool checkIcePolygonDamage(cBgS_PolyInfo*); + /* 800D7768 */ static BOOL checkIcePolygonDamage(cBgS_PolyInfo*); /* 800D77C8 */ BOOL checkMagicArmorNoDamage(); /* 800D7820 */ void checkPolyDamage(); /* 800D7A98 */ bool checkElecReturnDamage(dCcD_GObjInf&, fopAc_ac_c**); @@ -3237,6 +3237,7 @@ public: BOOL checkReinRide() const { return mRideStatus == 1 || mRideStatus == 2; } int getGrassHowlEventActor() const { return field_0x3198; } MtxP getShieldMtx() const { return mShieldModel->getBaseTRMtx(); } + MtxP getMagneBootsMtx() { return mMagneBootMtx; } bool checkFishingCastMode() const { bool var_r5; @@ -3360,6 +3361,8 @@ public: s8 getOnLineNum() { return mZ2WolfHowlMgr.getOnLineNum(); } SongNote getCorrectLine(u8 param_0) { return mZ2WolfHowlMgr.getCorrectLine(param_0); } + void itemHitSE(u32 param_1, u32 param_2, Z2SoundObjBase* param_3) { mZ2Link.startHitItemSE(param_1, param_2, param_3, -1.0f); } + inline bool checkWindSpeedOnXZ() const; inline void startRestartRoomFromOut(int, u32, int); inline u16 getReadyItem(); diff --git a/include/d/cc/d_cc_d.h b/include/d/cc/d_cc_d.h index 3c7ac0a03da..64ee42a1ef3 100644 --- a/include/d/cc/d_cc_d.h +++ b/include/d/cc/d_cc_d.h @@ -236,6 +236,7 @@ public: u8 GetHitMark() { return mHitMark; } void SetRVec(cXyz& vec) { mRVec = vec; } cXyz* GetVecP() { return &mVec; } + cXyz* GetRVecP() { return &mRVec; } void SetHitPos(cXyz& pos) { mHitPos = pos; } cXyz* GetHitPosP() { return &mHitPos; } @@ -362,6 +363,7 @@ public: bool ChkTgWolfSpNoDamage() { return mGObjTg.ChkSPrm(0x800); } bool ChkAtNoHitMark() { return mGObjAt.ChkSPrm(2); } bool ChkTgNoHitMark() { return mGObjTg.ChkSPrm(4); } + bool ChkTgArrowThrough() { return mGObjTg.ChkSPrm(0x20); } bool ChkTgHookShotNoHitMark() { return mGObjTg.ChkSPrm(0x400); } bool ChkTgArrowNoHitMark() { return mGObjTg.ChkSPrm(0x1000); } dCcG_Tg_Spl GetTgSpl() { return (dCcG_Tg_Spl)mGObjTg.GetSpl(); } @@ -389,6 +391,7 @@ public: u32 GetTgHitObjHitSeID(int i_soundID) { return getHitSeID(GetTgHitObjSe(),i_soundID); } cXyz* GetAtHitPosP() { return mGObjAt.GetHitPosP(); } cXyz* GetTgHitPosP() { return mGObjTg.GetHitPosP(); } + cXyz* GetTgRVecP() { return mGObjTg.GetRVecP(); } bool ChkTgHookshotThrough() { return mGObjTg.ChkSPrm(0x80); } static const Z2SoundID m_hitSeID[24]; diff --git a/include/d/d_jnt_col.h b/include/d/d_jnt_col.h index c72b7b4c50b..58fae6ffbb6 100644 --- a/include/d/d_jnt_col.h +++ b/include/d/d_jnt_col.h @@ -22,7 +22,7 @@ public: /* 80035CA0 */ int init(fopAc_ac_c*, dJntColData_c const*, J3DModel*, int); /* 80035CC8 */ static void setNowLine(cM3dGLin*, cXyz const*, csXyz const*, cXyz*); /* 80035DC8 */ void searchNearPos(cM3dGLin const*, cXyz const*, cXyz*, int) const; - /* 80036AEC */ void getArrowOffsetPosAndAngle(cXyz const*, csXyz const*, cXyz*, cXyz*) const; + /* 80036AEC */ int getArrowOffsetPosAndAngle(cXyz const*, csXyz const*, cXyz*, cXyz*) const; /* 80036C44 */ int getHitmarkPosAndAngle(cXyz const*, csXyz const*, cXyz*, csXyz*, int) const; /* 80036FA8 */ void setArrowPosAndAngle(cXyz const*, cXyz const*, int, cXyz*, csXyz*); diff --git a/include/d/particle/d_particle.h b/include/d/particle/d_particle.h index 731d2956904..7a51ed45ab7 100644 --- a/include/d/particle/d_particle.h +++ b/include/d/particle/d_particle.h @@ -31,6 +31,8 @@ public: /* 8004F6C4 */ virtual void executeAfter(JPABaseEmitter*); /* 8004FABC */ virtual void setup(JPABaseEmitter*, cXyz const*, csXyz const*, s8); + void setRate(f32 rate) { mRate = rate; } + private: /* 0x04 */ f32 mRate; /* 0x08 */ int mMaxCnt; diff --git a/include/rel/d/a/d_a_arrow/d_a_arrow.h b/include/rel/d/a/d_a_arrow/d_a_arrow.h index 80e1d345233..01196774440 100644 --- a/include/rel/d/a/d_a_arrow/d_a_arrow.h +++ b/include/rel/d/a/d_a_arrow/d_a_arrow.h @@ -8,41 +8,48 @@ class daArrow_c : public fopAc_ac_c { public: - /* 80499C6C */ void createHeap(); + enum ArrowType_e { + ARROW_TYPE_NORMAL = 0, // Needs verification + ARROW_TYPE_BOMB = 1, + ARROW_TYPE_LIGHT = 2, + ARROW_TYPE_SLING = 4, + }; + + /* 80499C6C */ int createHeap(); /* 80499D8C */ void atHitCallBack(dCcD_GObjInf*, fopAc_ac_c*, dCcD_GObjInf*); /* 80499FBC */ void decAlphaBlur(); /* 8049A04C */ void setBlur(); /* 8049A110 */ void setLightArrowHitMark(cXyz const*); /* 8049A1EC */ void setLightChargeEffect(int); - /* 8049A370 */ void setArrowWaterNextPos(cXyz*, cXyz*); + /* 8049A370 */ int setArrowWaterNextPos(cXyz*, cXyz*); /* 8049A76C */ void setArrowAt(f32); /* 8049A9CC */ void arrowShooting(); /* 8049AC84 */ void setBombArrowExplode(cXyz*); /* 8049ACE0 */ void setRoomInfo(); /* 8049AD74 */ void clearNearActorData(); - /* 8049AD94 */ void getVibAngle(); + /* 8049AD94 */ s16 getVibAngle(); /* 8049AE64 */ void setNormalMatrix(); /* 8049AF18 */ void setSmokePos(); /* 8049AFEC */ void setKeepMatrix(); - /* 8049B120 */ void setStopActorMatrix(); + /* 8049B120 */ fopAc_ac_c* setStopActorMatrix(); /* 8049B214 */ void setBombMoveEffect(); - /* 8049B370 */ void checkReget(); - /* 8049B45C */ void procWait(); - /* 8049B764 */ void procMove(); - /* 8049C700 */ void procReturnInit(int); - /* 8049C874 */ void procReturn(); - /* 8049CB70 */ void procBGStop(); - /* 8049CC60 */ void procActorStop(); - /* 8049CCCC */ void procActorControllStop(); - /* 8049CCF0 */ void procSlingHitInit(cXyz*, dCcD_GObjInf*); - /* 8049CE50 */ void procSlingHit(); - /* 8049CEA0 */ void execute(); - /* 8049D0CC */ void draw(); - /* 8049D440 */ void create(); + /* 8049B370 */ bool checkReget(); + /* 8049B45C */ int procWait(); + /* 8049B764 */ int procMove(); + /* 8049C700 */ int procReturnInit(int); + /* 8049C874 */ int procReturn(); + /* 8049CB70 */ int procBGStop(); + /* 8049CC60 */ int procActorStop(); + /* 8049CCCC */ int procActorControllStop(); + /* 8049CCF0 */ int procSlingHitInit(cXyz*, dCcD_GObjInf*); + /* 8049CE50 */ int procSlingHit(); + /* 8049CEA0 */ int execute(); + /* 8049D0CC */ int draw(); + /* 8049D440 */ cPhs__Step create(); /* 8049D98C */ ~daArrow_c(); void setBombArrowExplode() { field_0x950 = 0; } - bool checkBombArrow() const { return mIsBombArrow == true; } + bool checkBombArrow() const { return mArrowType == true; } void setShoot() { fopAcM_SetParam(this, 1); } void setChargeShoot() { fopAcM_SetParam(this, 2); } @@ -71,26 +78,39 @@ public: NULL); } - /* 0x568 */ J3DModel* field_0x568; + /* 0x568 */ J3DModel* mpModel; /* 0x56C */ dBgS_ArrowLinChk field_0x56c; /* 0x5DC */ dBgS_ObjLinChk field_0x5dc; /* 0x64C */ dCcD_Stts field_0x64c; /* 0x688 */ dCcD_Cps field_0x688; /* 0x7CC */ dCcD_Sph field_0x7cc; - /* 0x904 */ Z2SoundObjArrow field_0x904; - /* 0x93C */ bool mIsBombArrow; - /* 0x93D */ u8 field_0x93d[0x948 - 0x93D]; - /* 0x948 */ u8 mReverb; - /* 0x949 */ u8 field_0x949[0x950 - 0x949]; - /* 0x950 */ u16 field_0x950; + /* 0x904 */ Z2SoundObjArrow mSoundObjArrow; + /* 0x93C */ u8 mArrowType; + /* 0x93D */ u8 field_0x93d; + /* 0x93E */ s8 field_0x93e; + /* 0x93F */ u8 field_0x93f; + /* 0x940 */ u8 field_0x940; + /* 0x941 */ u8 field_0x941; + /* 0x942 */ u8 field_0x942; + /* 0x943 */ u8 field_0x943; + /* 0x944 */ u8 field_0x944; + /* 0x945 */ u8 field_0x945; + /* 0x946 */ u8 field_0x946; + /* 0x947 */ u8 field_0x947; + /* 0x948 */ s8 mReverb; + /* 0x949 */ u8 field_0x949[0x94C - 0x949]; + /* 0x94C */ u16 field_0x94c; + /* 0x94E */ s16 field_0x94e; + /* 0x950 */ s16 field_0x950; /* 0x952 */ s16 field_0x952; /* 0x954 */ s16 field_0x954; - /* 0x956 */ u16 field_0x956; + /* 0x956 */ s16 field_0x956; /* 0x958 */ csXyz field_0x958; /* 0x960 */ int field_0x960; /* 0x964 */ u32 field_0x964; /* 0x968 */ u32 field_0x968; - /* 0x96C */ u8 field_0x96c[0x994 - 0x96C]; + /* 0x96C */ u32 field_0x96c[4]; + /* 0x97C */ u32 field_0x97c[6]; /* 0x994 */ u32 mHitAcID; /* 0x998 */ f32 field_0x998; /* 0x99C */ f32 field_0x99c; @@ -106,7 +126,11 @@ public: /* 0x9FC */ cXyz field_0x9fc; /* 0xA08 */ daPy_actorKeep_c field_0xa08; /* 0xA10 */ dPa_hermiteEcallBack_c field_0xa10; - /* 0xA28 */ void (daArrow_c::*mProcFunc)(); + /* 0xA28 */ int (daArrow_c::*mProcFunc)(); + + static s16 m_count; }; +STATIC_ASSERT(sizeof(daArrow_c) == 0xA34); + #endif /* D_A_ARROW_H */ diff --git a/include/rel/d/a/d_a_hozelda/d_a_hozelda.h b/include/rel/d/a/d_a_hozelda/d_a_hozelda.h index 1928bfaf796..7ee052896b8 100644 --- a/include/rel/d/a/d_a_hozelda/d_a_hozelda.h +++ b/include/rel/d/a/d_a_hozelda/d_a_hozelda.h @@ -2,6 +2,7 @@ #define D_A_HOZELDA_H #include "f_op/f_op_actor_mng.h" +#include "JSystem/J3DGraphAnimator/J3DMaterialAnm.h" class daHoZelda_matAnm_c : public J3DMaterialAnm { public: @@ -49,6 +50,7 @@ public: /* 808489CC */ void execute(); /* 80848B64 */ void draw(); + MtxP getRightHandMtx() { return mpZeldaModel->getAnmMtx(22); } u8 checkBowMode() const { return field_0x6d8; } void setDamageInit() { field_0x6db = 1; } diff --git a/include/rel/d/a/e/d_a_e_pz/d_a_e_pz.h b/include/rel/d/a/e/d_a_e_pz/d_a_e_pz.h index 7570446059f..76862b840e1 100644 --- a/include/rel/d/a/e/d_a_e_pz/d_a_e_pz.h +++ b/include/rel/d/a/e/d_a_e_pz/d_a_e_pz.h @@ -3,4 +3,40 @@ #include "dolphin/types.h" +struct daE_PZ_c { + void onBombArrowHit() { field_0x845 = 1; } + + /* 807585BC */ void draw(); + /* 80758800 */ void setBck(int, u8, f32, f32); + /* 807588AC */ void setActionMode(int, int); + /* 807588B8 */ void mEntrySUB(bool); + /* 80758A94 */ void mPzScaleSet(bool); + /* 80758BA0 */ void mEnemyScaleSet(); + /* 80758D44 */ void getCutType(); + /* 80758DA4 */ void mSetFirePos(); + /* 80758E04 */ void damage_check(); + /* 807592F4 */ void executeSearchPoint(); + /* 807593CC */ void executeOpeningDemo(); + /* 8075B7E0 */ void mPointerSet(); + /* 8075B970 */ void executeWait(); + /* 8075C6AC */ void executeAttack(); + /* 8075CB80 */ void executeDamage(); + /* 8075CE68 */ void executeDead(); + /* 8075D94C */ void executeSummonsBullet(); + /* 8075F0BC */ void executeBullet(); + /* 8075F3A8 */ void action(); + /* 8075F510 */ void action_fire(); + /* 8075F578 */ void fire_mtx_set(); + /* 8075F734 */ void mtx_set(); + /* 8075F7E8 */ void cc_set(); + /* 8075F964 */ void execute(); + /* 8075FA88 */ void _delete(); + /* 8075FB4C */ void CreateHeap(); + /* 8076010C */ void create(); + /* 807607EC */ daE_PZ_c(); + + /* 0x000 */ u8 base[0x845]; + /* 0x845 */ u8 field_0x845; +}; + #endif /* D_A_E_PZ_H */ diff --git a/rel/d/a/d_a_arrow/d_a_arrow.cpp b/rel/d/a/d_a_arrow/d_a_arrow.cpp index 3149129f1ed..4c6d0c9f430 100644 --- a/rel/d/a/d_a_arrow/d_a_arrow.cpp +++ b/rel/d/a/d_a_arrow/d_a_arrow.cpp @@ -4,8 +4,16 @@ // #include "rel/d/a/d_a_arrow/d_a_arrow.h" +#include "JSystem/J3DGraphBase/J3DMaterial.h" +#include "SSystem/SComponent/c_math.h" #include "dol2asm.h" +#include "f_op/f_op_kankyo_mng.h" #include "d/com/d_com_inf_game.h" +#include "d/a/d_a_alink.h" +#include "d/d_bomb.h" +#include "rel/d/a/e/d_a_e_pz/d_a_e_pz.h" +#include "rel/d/a/d_a_horse/d_a_horse.h" +#include "rel/d/a/d_a_hozelda/d_a_hozelda.h" // // Forward References: @@ -47,7 +55,7 @@ extern "C" void procSlingHit__9daArrow_cFv(); extern "C" void execute__9daArrow_cFv(); extern "C" static void daArrow_execute__FP9daArrow_c(); extern "C" void draw__9daArrow_cFv(); -extern "C" static void daArrow_draw__FP9daArrow_c(); +extern "C" static int daArrow_draw__FP9daArrow_c(); extern "C" static void daAlink_searchHorseZelda__FP10fopAc_ac_cPv(); extern "C" void create__9daArrow_cFv(); extern "C" void cleanup__18dPa_levelEcallBackFv(); @@ -55,9 +63,9 @@ extern "C" void __dt__18dPa_levelEcallBackFv(); extern "C" void __dt__8cM3dGSphFv(); extern "C" void __dt__8cM3dGAabFv(); extern "C" void __dt__10dCcD_GSttsFv(); -extern "C" static void daArrow_create__FP9daArrow_c(); +extern "C" static int daArrow_create__FP9daArrow_c(); extern "C" void __dt__9daArrow_cFv(); -extern "C" static void daArrow_delete__FP9daArrow_c(); +extern "C" static int daArrow_delete__FP9daArrow_c(); extern "C" void __dt__10cCcD_GSttsFv(); extern "C" void execute__18JPAEmitterCallBackFP14JPABaseEmitter(); extern "C" void executeAfter__18JPAEmitterCallBackFP14JPABaseEmitter(); @@ -216,33 +224,42 @@ extern "C" void __register_global_object(); // Declarations: // -/* ############################################################################################## */ -/* 8049DE04-8049DE04 000180 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ -#pragma push -#pragma force_active on -SECTION_DEAD static char const* const stringBase_8049DE04 = "HoZelda"; -#pragma pop - /* 80499C6C-80499D6C 0000EC 0100+00 1/1 0/0 0/0 .text createHeap__9daArrow_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daArrow_c::createHeap() { - nofralloc -#include "asm/rel/d/a/d_a_arrow/d_a_arrow/createHeap__9daArrow_cFv.s" +int daArrow_c::createHeap() { + J3DModelData* model_data; + + if (mArrowType == 2) { + model_data = (J3DModelData*)dComIfG_getObjectRes("HoZelda", 0x1f); + } else { + u16 index; + + if (mArrowType == 4) { + index = 0x20; + } else if (mArrowType == 1) { + index = 0x1d; + } else { + index = 0x1c; + } + model_data = (J3DModelData*)dComIfG_getObjectRes(daAlink_c::getAlinkArcName(), index); + } + + mpModel = mDoExt_J3DModel__create(model_data, 0x80000, 0x11000084); + + if (mpModel == NULL) { + return FALSE; + } + + mSoundObjArrow.init(¤t.pos, 1); + mReverb = dComIfGp_getReverb(fopAcM_GetRoomNo(this)); + + return TRUE; } -#pragma pop /* 80499D6C-80499D8C 0001EC 0020+00 1/1 0/0 0/0 .text daArrow_createHeap__FP10fopAc_ac_c */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -static asm void daArrow_createHeap(fopAc_ac_c* param_0) { - nofralloc -#include "asm/rel/d/a/d_a_arrow/d_a_arrow/daArrow_createHeap__FP10fopAc_ac_c.s" +static int daArrow_createHeap(fopAc_ac_c* i_this) { + return static_cast(i_this)->createHeap(); } -#pragma pop /* ############################################################################################## */ /* 8049DC84-8049DC90 000000 000C+00 15/15 0/0 0/0 .rodata @3768 */ @@ -283,6 +300,7 @@ const static dCcD_SrcSph l_coSphSrc = { }; #pragma pop +#ifndef NONMATCHING /* 8049DD1C-8049DD24 000098 0004+04 2/12 0/0 0/0 .rodata @4130 */ SECTION_RODATA static u8 const lit_4130[4 + 4 /* padding */] = { 0x00, @@ -323,9 +341,40 @@ SECTION_RODATA static u8 const lit_4133[8] = { }; COMPILER_STRIP_GATE(0x8049DD34, &lit_4133); #pragma pop +#endif /* 80499D8C-80499F9C 00020C 0210+00 1/1 0/0 0/0 .text * atHitCallBack__9daArrow_cFP12dCcD_GObjInfP10fopAc_ac_cP12dCcD_GObjInf */ +#ifdef NONMATCHING +// matches with literals +void daArrow_c::atHitCallBack(dCcD_GObjInf* i_atObjInf, fopAc_ac_c* i_tgActor, dCcD_GObjInf* i_tgObjInf) { + if (i_tgObjInf->ChkTgArrowThrough()) { + if (i_tgActor != NULL && fopAcM_GetName(i_tgActor) == PROC_E_PZ) { + ((daE_PZ_c*)i_tgActor)->onBombArrowHit(); + } + } else if (i_tgActor != NULL && fopAcM_IsActor(i_tgActor)) { + cXyz* hit_pos_p = i_atObjInf->GetAtHitPosP(); + f32 dist_to_hitpos = current.pos.abs(*hit_pos_p); + + if (dist_to_hitpos < field_0x998) { + field_0x998 = dist_to_hitpos; + mHitAcID = fopAcM_GetID(i_tgActor); + + if (mArrowType == 1) { + field_0x9a8 = *hit_pos_p; + } else if (i_tgObjInf->ChkTgShield()) { + field_0x93e = 1; + } else { + field_0x93e = 0; + dJntCol_c * jnt = fopAcM_GetJntCol(i_tgActor); + if (jnt != NULL) { + field_0x960 = jnt->getArrowOffsetPosAndAngle(hit_pos_p, &shape_angle, &field_0x9a8, &field_0x9b4); + } + } + } + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -335,35 +384,47 @@ asm void daArrow_c::atHitCallBack(dCcD_GObjInf* param_0, fopAc_ac_c* param_1, #include "asm/rel/d/a/d_a_arrow/d_a_arrow/atHitCallBack__9daArrow_cFP12dCcD_GObjInfP10fopAc_ac_cP12dCcD_GObjInf.s" } #pragma pop +#endif /* 80499F9C-80499FBC 00041C 0020+00 1/1 0/0 0/0 .text * daArrow_atHitCallBack__FP10fopAc_ac_cP12dCcD_GObjInfP10fopAc_ac_cP12dCcD_GObjInf */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -static asm void daArrow_atHitCallBack(fopAc_ac_c* param_0, dCcD_GObjInf* param_1, - fopAc_ac_c* param_2, dCcD_GObjInf* param_3) { - nofralloc -#include "asm/rel/d/a/d_a_arrow/d_a_arrow/daArrow_atHitCallBack__FP10fopAc_ac_cP12dCcD_GObjInfP10fopAc_ac_cP12dCcD_GObjInf.s" +static void daArrow_atHitCallBack(fopAc_ac_c* i_this, dCcD_GObjInf* i_atObjInf, fopAc_ac_c* i_tgActor, dCcD_GObjInf* i_tgObjInf) { + static_cast(i_this)->atHitCallBack(i_atObjInf, i_tgActor, i_tgObjInf); } -#pragma pop /* 80499FBC-8049A04C 00043C 0090+00 5/5 0/0 0/0 .text decAlphaBlur__9daArrow_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daArrow_c::decAlphaBlur() { - nofralloc -#include "asm/rel/d/a/d_a_arrow/d_a_arrow/decAlphaBlur__9daArrow_cFv.s" +void daArrow_c::decAlphaBlur() { + for (int i = 0; i < field_0x946; i++) { + JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(field_0x97c[0]); + if (emitter != NULL) { + u8 alpha = emitter->getGlobalAlpha(); + if (alpha > 0x33) { + setBlur(); + emitter->setGlobalAlpha(alpha - 51); + } else { + emitter->setGlobalAlpha(0); + } + } + } } -#pragma pop +#ifndef NONMATCHING /* ############################################################################################## */ /* 8049DD3C-8049DD40 0000B8 0004+00 4/10 0/0 0/0 .rodata @4187 */ SECTION_RODATA static f32 const lit_4187 = 1.0f; COMPILER_STRIP_GATE(0x8049DD3C, &lit_4187); +#endif /* 8049A04C-8049A110 0004CC 00C4+00 5/5 0/0 0/0 .text setBlur__9daArrow_cFv */ +#ifdef NONMATCHING +// matches with literals +void daArrow_c::setBlur() { + for (int i = 0; i < field_0x946; i++) { + field_0x97c[i] = dComIfGp_particle_set(field_0x97c[i], field_0x94c, ¤t.pos, &tevStr); + dComIfGp_particle_levelEmitterOnEventMove(field_0x97c[i]); + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -372,15 +433,38 @@ asm void daArrow_c::setBlur() { #include "asm/rel/d/a/d_a_arrow/d_a_arrow/setBlur__9daArrow_cFv.s" } #pragma pop +#endif /* ############################################################################################## */ /* 8049DD40-8049DD4C 0000BC 000C+00 1/1 0/0 0/0 .rodata effName$4192 */ +#ifndef NONMATCHING SECTION_RODATA static u8 const effName_4192[12] = { 0x89, 0x6F, 0x89, 0x70, 0x89, 0x71, 0x89, 0x72, 0x89, 0x73, 0x89, 0x74, }; COMPILER_STRIP_GATE(0x8049DD40, &effName_4192); +#else +static u16 const effName_4192[] = { + 0x896F, + 0x8970, + 0x8971, + 0x8972, + 0x8973, + 0x8974, +}; +#endif /* 8049A110-8049A1EC 000590 00DC+00 1/1 0/0 0/0 .text setLightArrowHitMark__9daArrow_cFPC4cXyz */ +#ifdef NONMATCHING +// matches with literals +void daArrow_c::setLightArrowHitMark(cXyz const* param_0) { + for (int i = 0; i < 6; i++) { + dComIfGp_particle_set(effName_4192[i], param_0, &shape_angle, NULL); + } + + field_0x93f = 1; + mSoundObjArrow.startSound(Z2SE_ZELDA_ARROW_HIT, 0, mReverb); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -389,7 +473,9 @@ asm void daArrow_c::setLightArrowHitMark(cXyz const* param_0) { #include "asm/rel/d/a/d_a_arrow/d_a_arrow/setLightArrowHitMark__9daArrow_cFPC4cXyz.s" } #pragma pop +#endif +#ifndef NONMATCHING /* ############################################################################################## */ /* 8049DD4C-8049DD54 0000C8 0008+00 0/1 0/0 0/0 .rodata effName$4214 */ #pragma push @@ -408,9 +494,40 @@ SECTION_RODATA static u8 const localEffPos[12] = { }; COMPILER_STRIP_GATE(0x8049DD54, &localEffPos); #pragma pop +#else +static u16 const effName_4214[] = { + 0x8975, + 0x8976, + 0x8977, + 0x8978, + +}; +static Vec const localEffPos = {0.0f, 0.0f, 90.0f}; +#endif /* 8049A1EC-8049A334 00066C 0148+00 2/2 0/0 0/0 .text setLightChargeEffect__9daArrow_cFi */ +#ifdef NONMATCHING +// matches with literals +void daArrow_c::setLightChargeEffect(int param_0) { + if (mpModel != NULL) { + cXyz pos; + BOOL bVar1 = param_0 == 0 && (fopAcM_GetParam(this) == 1 || fopAcM_GetParam(this) == 2 || fopAcM_GetParam(this) == 0); + mDoMtx_multVec(mpModel->getBaseTRMtx(), &localEffPos, &pos); + for (int i = 0; i < 4; i++) { + if (bVar1) { + field_0x96c[i] = dComIfGp_particle_set(field_0x96c[i], effName_4214[i], &pos, &tevStr); + dComIfGp_particle_levelEmitterOnEventMove(field_0x96c[i]); + } else { + JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(field_0x96c[i]); + if (emitter != NULL) { + emitter->stopDrawParticle(); + } + } + } + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -419,6 +536,7 @@ asm void daArrow_c::setLightChargeEffect(int param_0) { #include "asm/rel/d/a/d_a_arrow/d_a_arrow/setLightChargeEffect__9daArrow_cFi.s" } #pragma pop +#endif /* 8049A334-8049A370 0007B4 003C+00 1/1 0/0 0/0 .text __dt__4cXyzFv */ #pragma push @@ -431,6 +549,7 @@ extern "C" asm void __dt__4cXyzFv() { } #pragma pop +#ifndef NONMATCHING /* ############################################################################################## */ /* 8049DD60-8049DD64 0000DC 0004+00 0/1 0/0 0/0 .rodata @4385 */ #pragma push @@ -445,18 +564,61 @@ COMPILER_STRIP_GATE(0x8049DD60, &lit_4385); SECTION_RODATA static f32 const lit_4386 = 80.0f; COMPILER_STRIP_GATE(0x8049DD64, &lit_4386); #pragma pop +#endif /* 8049A370-8049A76C 0007F0 03FC+00 2/2 0/0 0/0 .text * setArrowWaterNextPos__9daArrow_cFP4cXyzP4cXyz */ +#ifdef NONMATCHING +// matches with literals +int daArrow_c::setArrowWaterNextPos(cXyz* i_start, cXyz* i_end) { + field_0x5dc.Set(i_start, i_end, this); + + if (dComIfG_Bgsp().LineCross(&field_0x5dc)) { + if (dComIfG_Bgsp().GetPolyAtt0(field_0x5dc) == 6) { + *i_end = field_0x5dc.i_GetCross(); + return 2; + } + + cXyz v = *i_end - field_0x5dc.i_GetCross(); + f32 dis = (*i_end).abs(*i_start); + + if (dis > 0.0001f) { + dis = v.abs() / dis; + } else { + dis = 1.0f; + } + + v.normalizeZP(); + *i_end = field_0x5dc.i_GetCross() + v * 80.0f * dis; + return 1; + } + + if (fopAcM_wt_c::waterCheck(i_start) && fopAcM_wt_c::getWaterY() > i_start->y) { + if (fopAcM_wt_c::getPolyAtt0() == 6) { + i_end->y = fopAcM_wt_c::getWaterY(); + return 4; + } + + cXyz v = *i_end - *i_start; + v.normalizeZP(); + *i_end = *i_start + (v * 80.0f); + return 3; + } + + return 0; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daArrow_c::setArrowWaterNextPos(cXyz* param_0, cXyz* param_1) { +asm int daArrow_c::setArrowWaterNextPos(cXyz* param_0, cXyz* param_1) { nofralloc #include "asm/rel/d/a/d_a_arrow/d_a_arrow/setArrowWaterNextPos__9daArrow_cFP4cXyzP4cXyz.s" } #pragma pop +#endif +#ifndef NONMATCHING /* ############################################################################################## */ /* 8049DD68-8049DD6C 0000E4 0004+00 0/1 0/0 0/0 .rodata @4445 */ #pragma push @@ -478,8 +640,64 @@ COMPILER_STRIP_GATE(0x8049DD6C, &lit_4446); SECTION_RODATA static f32 const lit_4447 = -300.0f; COMPILER_STRIP_GATE(0x8049DD70, &lit_4447); #pragma pop +#endif /* 8049A76C-8049A9CC 000BEC 0260+00 2/2 0/0 0/0 .text setArrowAt__9daArrow_cFf */ +#ifdef NONMATCHING +// matches with literals +void daArrow_c::setArrowAt(f32 param_0) { + daAlink_c* player = daAlink_getAlinkActorClass(); + + f32 radius; + if (mArrowType == 4) { + radius = 8.0f; + } else { + radius = 5.0f; + } + + f32 arrow_start = player->getArrowIncAtMaxStart(); + if (param_0 > arrow_start) { + f32 inc = player->getArrowIncAtMax(); + if (inc <= arrow_start) { + radius += player->getArrowIncAtR(); + } else { + f32 mod = (param_0 - arrow_start) / (inc - arrow_start); + if (mod > 1.0f) { + mod = 1.0f; + } + radius += (mod * player->getArrowIncAtR()); + } + } + + cXyz target = current.pos + speed * (mOutLengthRate + 1.0f); + + if (field_0x945 == 0) { + setArrowWaterNextPos(¤t.pos, &target); + } else { + f32 fVar7 = target.y - field_0x9fc.y; + if (fVar7 < -300.0f) { + f32 fVar1 = fabsf(target.y - current.pos.y); + fVar7 = -300.0f - fVar7; + + if (fVar1 > fVar7) { + target = current.pos + speed * ((mOutLengthRate + 1.0f) * ((fVar1 - fVar7) / fVar1)); + } + } + } + + field_0x56c.Set(¤t.pos, &target, this); + + if (dComIfG_Bgsp().LineCross(&field_0x56c)) { + target = field_0x56c.i_GetCross(); + } + + static_cast(&field_0x688)->Set(current.pos, target, radius); + field_0x688.CalcAtVec(); + + g_dComIfG_gameInfo.play.mCcs.Set(&field_0x688); // fake match: debug rom shows dComIfG_Ccsp() + g_dComIfG_gameInfo.play.mCcs.SetMass(&field_0x688, 1); // fake match: debug rom shows dComIfG_Ccsp() +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -488,13 +706,90 @@ asm void daArrow_c::setArrowAt(f32 param_0) { #include "asm/rel/d/a/d_a_arrow/d_a_arrow/setArrowAt__9daArrow_cFf.s" } #pragma pop +#endif +#ifndef NONMATCHING /* ############################################################################################## */ /* 8049DD74-8049DD78 0000F0 0004+00 1/1 0/0 0/0 .rodata @4541 */ SECTION_RODATA static f32 const lit_4541 = 100.0f; COMPILER_STRIP_GATE(0x8049DD74, &lit_4541); +#endif /* 8049A9CC-8049AC84 000E4C 02B8+00 2/2 0/0 0/0 .text arrowShooting__9daArrow_cFv */ +#ifdef NONMATCHING +// matches with literals +void daArrow_c::arrowShooting() { + daAlink_c* link = daAlink_getAlinkActorClass(); + + field_0x950 = link->getBombArrowFlyExplodeTime(); + + if (mArrowType == 4) { + current.angle.x = -link->getBodyAngleX(); + current.angle.y = link->shape_angle.y + link->getBodyAngleY(); + } else if (dComIfGp_checkPlayerStatus0(0, 0x200000) || fopAcM_GetParam(this) == 2) { + cXyz* pos = link->checkBowCameraArrowPosP(&shape_angle.x, &shape_angle.y); + if (pos != NULL) { + current.pos = *pos; + + if (link->checkMagneBootsOn()) { + mDoMtx_stack_c::copy(link->getMagneBootsMtx()); + mDoMtx_stack_c::ZXYrotM(shape_angle); + mDoMtx_MtxToRot(mDoMtx_stack_c::get(), &shape_angle); + } + + current.angle.x = -shape_angle.x; + current.angle.y = shape_angle.y; + } + } + + speedF = 100.f; + mStartPos = current.pos; + + f32 cos = cM_scos(current.angle.x); + speed.x = cos * (field_0x99c * cM_ssin(current.angle.y)); + speed.y = field_0x99c * cM_ssin(current.angle.x); + speed.z = cos * (field_0x99c * cM_scos(current.angle.y)); + + daPy_py_c* player = daPy_getPlayerActorClass(); + if (player->checkHorseRide()) { + daHorse_c* horse = dComIfGp_getHorseActor(); + cMtx_YrotS(*calc_mtx, horse->shape_angle.y); + + cXyz src; + cXyz dst; + + src.x = 0.0f; + src.y = 0.0f; + src.z = horse->speedF; + + MtxPosition(&src, &dst); + + speed += dst; + } + + if (mArrowType == 2) { + field_0x688.SetAtMtrl(04); + field_0x688.OnAtNoHitMark(); + } else { + if (mArrowType == 4) { + field_0x688.SetAtType(0x80); + field_0x688.SetAtSe(22); + field_0x688.SetAtAtp(0); + field_0x688.OnAtNoHitMark(); + } + + field_0x94e = m_count; + m_count++; + if (m_count == 6) { + m_count = 0; + } + } + + setBlur(); + setArrowAt(0.0f); + clearNearActorData(); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -503,18 +798,32 @@ asm void daArrow_c::arrowShooting() { #include "asm/rel/d/a/d_a_arrow/d_a_arrow/arrowShooting__9daArrow_cFv.s" } #pragma pop +#endif /* 8049AC84-8049ACE0 001104 005C+00 3/3 0/0 0/0 .text setBombArrowExplode__9daArrow_cFP4cXyz */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daArrow_c::setBombArrowExplode(cXyz* param_0) { - nofralloc -#include "asm/rel/d/a/d_a_arrow/d_a_arrow/setBombArrowExplode__9daArrow_cFP4cXyz.s" +void daArrow_c::setBombArrowExplode(cXyz* param_0) { + dBomb_c::createNormalBombExplode(param_0); + field_0x93f = 1; } -#pragma pop /* 8049ACE0-8049AD74 001160 0094+00 1/1 0/0 0/0 .text setRoomInfo__9daArrow_cFv */ +#ifdef NONMATCHING +// matches with literals +void daArrow_c::setRoomInfo() { + int roomNo; + + if (fopAcM_gc_c::gndCheck(¤t.pos)) { + roomNo = fopAcM_gc_c::getRoomId(); + tevStr.mEnvrIdxOverride = fopAcM_gc_c::getPolyColor(); + } else { + roomNo = dComIfGp_roomControl_getStayNo(); + } + + tevStr.mRoomNo = roomNo; + field_0x64c.SetRoomId(roomNo); + fopAcM_SetRoomNo(this, roomNo); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -523,17 +832,16 @@ asm void daArrow_c::setRoomInfo() { #include "asm/rel/d/a/d_a_arrow/d_a_arrow/setRoomInfo__9daArrow_cFv.s" } #pragma pop +#endif /* 8049AD74-8049AD94 0011F4 0020+00 2/2 0/0 0/0 .text clearNearActorData__9daArrow_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daArrow_c::clearNearActorData() { - nofralloc -#include "asm/rel/d/a/d_a_arrow/d_a_arrow/clearNearActorData__9daArrow_cFv.s" +void daArrow_c::clearNearActorData() { + field_0x93e = 0; + field_0x998 = FLT_MAX; + mHitAcID = -1; } -#pragma pop +#ifndef NONMATCHING /* ############################################################################################## */ /* 8049DD78-8049DD7C 0000F4 0004+00 0/1 0/0 0/0 .rodata @4576 */ #pragma push @@ -575,17 +883,36 @@ SECTION_RODATA static u8 const lit_4582[8] = { }; COMPILER_STRIP_GATE(0x8049DD8C, &lit_4582); #pragma pop +#endif /* 8049AD94-8049AE64 001214 00D0+00 2/2 0/0 0/0 .text getVibAngle__9daArrow_cFv */ +#ifdef NONMATCHING +// matches with literals +s16 daArrow_c::getVibAngle() { + s16 angle; + if (cLib_calcTimer(&field_0x952)) { + field_0x954 += (s16)(21243.0f - cM_rndF(4096.0f)); + + f32 f = field_0x952 * 0.02f; + angle = f * 1024.0f * f * cM_ssin(field_0x954); + } else { + angle = 0; + } + + return angle; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daArrow_c::getVibAngle() { +asm s16 daArrow_c::getVibAngle() { nofralloc #include "asm/rel/d/a/d_a_arrow/d_a_arrow/getVibAngle__9daArrow_cFv.s" } #pragma pop +#endif +#ifndef NONMATCHING /* ############################################################################################## */ /* 8049DD94-8049DD98 000110 0004+00 1/2 0/0 0/0 .rodata @4606 */ SECTION_RODATA static f32 const lit_4606 = -95.0f; @@ -597,8 +924,25 @@ COMPILER_STRIP_GATE(0x8049DD94, &lit_4606); SECTION_RODATA static f32 const lit_4607 = -47.5f; COMPILER_STRIP_GATE(0x8049DD98, &lit_4607); #pragma pop +#endif /* 8049AE64-8049AF18 0012E4 00B4+00 4/4 0/0 0/0 .text setNormalMatrix__9daArrow_cFv */ +#ifdef NONMATCHING +// matches with literals +void daArrow_c::setNormalMatrix() { + mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z); + mDoMtx_stack_c::ZXYrotM(shape_angle.x, shape_angle.y, 0); + + u32 param = fopAcM_GetParam(this); + if (param == 4) { + mDoMtx_stack_c::transM(0.0f, 0.0f, -95.0f); + } else if (param == 5) { + mDoMtx_stack_c::transM(0.0f, 0.0f, -47.5f); + + } + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -607,7 +951,9 @@ asm void daArrow_c::setNormalMatrix() { #include "asm/rel/d/a/d_a_arrow/d_a_arrow/setNormalMatrix__9daArrow_cFv.s" } #pragma pop +#endif +#ifndef NONMATCHING /* ############################################################################################## */ /* 8049DD9C-8049DDA0 000118 0004+00 0/1 0/0 0/0 .rodata @4630 */ #pragma push @@ -636,6 +982,7 @@ COMPILER_STRIP_GATE(0x8049DDA4, &lit_4632); SECTION_RODATA static f32 const lit_4633 = 9.0f / 10.0f; COMPILER_STRIP_GATE(0x8049DDA8, &lit_4633); #pragma pop +#endif /* 8049DF60-8049DF64 000008 0001+03 1/1 0/0 0/0 .bss @1109 */ static u8 lit_1109[1 + 3 /* padding */]; @@ -730,6 +1077,7 @@ static u8 lit_1010[1 + 3 /* padding */]; static u8 lit_1009[1 + 3 /* padding */]; #pragma pop +#ifndef NONMATCHING /* 8049DFA0-8049DFB0 000048 000C+04 0/1 0/0 0/0 .bss @4612 */ #pragma push #pragma force_active on @@ -741,8 +1089,20 @@ static u8 lit_4612[12 + 4 /* padding */]; #pragma force_active on static u8 localOffset[12]; #pragma pop +#endif /* 8049AF18-8049AFEC 001398 00D4+00 3/3 0/0 0/0 .text setSmokePos__9daArrow_cFv */ +#ifdef NONMATCHING +// matches with literals +void daArrow_c::setSmokePos() { + static cXyz localOffset(-3.3f, -3.0f, 94.0f); + + mDoMtx_multVec(mpModel->getBaseTRMtx(), &localOffset, &field_0x9cc); + field_0x958.y = shape_angle.y; + + mSmokePos = (field_0x9cc - field_0x9d8) * 0.9f; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -751,7 +1111,9 @@ asm void daArrow_c::setSmokePos() { #include "asm/rel/d/a/d_a_arrow/d_a_arrow/setSmokePos__9daArrow_cFv.s" } #pragma pop +#endif +#ifndef NONMATCHING /* ############################################################################################## */ /* 8049DDAC-8049DDB0 000128 0004+00 0/2 0/0 0/0 .rodata @4674 */ #pragma push @@ -766,8 +1128,34 @@ COMPILER_STRIP_GATE(0x8049DDAC, &lit_4674); SECTION_RODATA static f32 const lit_4675 = -2.0f; COMPILER_STRIP_GATE(0x8049DDB0, &lit_4675); #pragma pop +#endif /* 8049AFEC-8049B120 00146C 0134+00 3/3 0/0 0/0 .text setKeepMatrix__9daArrow_cFv */ +#ifdef NONMATCHING +// matches with literals +void daArrow_c::setKeepMatrix() { + if (mArrowType == 2) { + daHoZelda_c* actor = (daHoZelda_c*)field_0xa08.getActor(); + if (actor != NULL) { + mDoMtx_stack_c::copy(actor->getRightHandMtx()); + mDoMtx_stack_c::transM(20.0f, -2.0f, 0.0f); + mDoMtx_XYZrotM(mDoMtx_stack_c::get(), cM_deg2s(90.0f), cM_deg2s(60.0f), cM_deg2s(90.0f)); + } else { + field_0x93f = 1; + return; + } + } else { + mDoMtx_stack_c::YrotS(-0x8000); + mDoMtx_stack_c::revConcat(daAlink_getAlinkActorClass()->getLeftItemMatrix()); + } + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); + mDoMtx_multVecZero(mpModel->getBaseTRMtx(), ¤t.pos); + mDoMtx_MtxToRot(mpModel->getBaseTRMtx(), &shape_angle); + + current.angle.y = shape_angle.y; + current.angle.x = -shape_angle.x; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -776,23 +1164,69 @@ asm void daArrow_c::setKeepMatrix() { #include "asm/rel/d/a/d_a_arrow/d_a_arrow/setKeepMatrix__9daArrow_cFv.s" } #pragma pop +#endif /* 8049B120-8049B214 0015A0 00F4+00 2/2 0/0 0/0 .text setStopActorMatrix__9daArrow_cFv */ +#ifdef NONMATCHING +// matches with literals +fopAc_ac_c* daArrow_c::setStopActorMatrix() { + s16 vibe_angle = getVibAngle(); + fopAc_ac_c* actor = fopAcM_SearchByID(mHitAcID); + if (actor == NULL) { + return NULL; + } + + dJntCol_c* jnt = fopAcM_GetJntCol(actor); + if (jnt == NULL) { + return NULL; + } + + jnt->setArrowPosAndAngle(&field_0x9a8, &field_0x9b4, field_0x960, ¤t.pos, &shape_angle); + mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z); + mDoMtx_stack_c::ZXYrotM(shape_angle.x + vibe_angle, shape_angle.y, shape_angle.z); + mDoMtx_stack_c::transM(0.0f, 0.0f, -95.0f); + mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); + + return actor; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daArrow_c::setStopActorMatrix() { +asm fopAc_ac_c* daArrow_c::setStopActorMatrix() { nofralloc #include "asm/rel/d/a/d_a_arrow/d_a_arrow/setStopActorMatrix__9daArrow_cFv.s" } #pragma pop +#endif +#ifndef NONMATCHING /* ############################################################################################## */ /* 8049DDB4-8049DDB8 000130 0004+00 1/1 0/0 0/0 .rodata @4749 */ SECTION_RODATA static f32 const lit_4749 = 0.25f; COMPILER_STRIP_GATE(0x8049DDB4, &lit_4749); +#endif /* 8049B214-8049B370 001694 015C+00 4/4 0/0 0/0 .text setBombMoveEffect__9daArrow_cFv */ +#ifdef NONMATCHING +// matches with literals +void daArrow_c::setBombMoveEffect() { + if (mArrowType == 1 && field_0x945 == 0 && field_0x943 == 0) { + setSmokePos(); + field_0x964 = dComIfGp_particle_set(field_0x964, 0x1e0, &field_0x9cc, &tevStr, &field_0x958, NULL, 0xff, &field_0xa10, -1, NULL, NULL, NULL); + dComIfGp_particle_levelEmitterOnEventMove(field_0x964); + field_0xa10.setRate(0.25f); + + field_0x968 = dComIfGp_particle_set(field_0x968, 0x1de, &field_0x9cc, &tevStr, &field_0x958, NULL, 0xff, NULL, -1, NULL, NULL, NULL); + dComIfGp_particle_levelEmitterOnEventMove(field_0x968); + + JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(field_0x968); + if (emitter != NULL) { + emitter->playDrawParticle(); + } + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -801,7 +1235,9 @@ asm void daArrow_c::setBombMoveEffect() { #include "asm/rel/d/a/d_a_arrow/d_a_arrow/setBombMoveEffect__9daArrow_cFv.s" } #pragma pop +#endif +#ifndef NONMATCHING /* ############################################################################################## */ /* 8049DDB8-8049DDBC 000134 0004+00 0/3 0/0 0/0 .rodata @4763 */ #pragma push @@ -809,27 +1245,49 @@ asm void daArrow_c::setBombMoveEffect() { SECTION_RODATA static f32 const lit_4763 = -1.0f; COMPILER_STRIP_GATE(0x8049DDB8, &lit_4763); #pragma pop +#endif /* 8049B370-8049B45C 0017F0 00EC+00 2/2 0/0 0/0 .text checkReget__9daArrow_cFv */ +#ifdef NONMATCHING +// matches with literals +bool daArrow_c::checkReget() { + if (field_0x7cc.ChkCoHit()) { + dComIfGp_setItemArrowNumCount(1); + fopAcM_createItemForSimpleDemo(¤t.pos, ARROW_1, -1, NULL, NULL, 0.0f, 0.0f); + mDoAud_seStart(Z2SE_CONSUMP_ITEM_GET, 0, 0, 0); + field_0x93f = 1; + return true; + } else { + field_0x7cc.SetC(current.pos); + dComIfG_Ccsp()->Set(&field_0x7cc); + return false; + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daArrow_c::checkReget() { +asm bool daArrow_c::checkReget() { nofralloc #include "asm/rel/d/a/d_a_arrow/d_a_arrow/checkReget__9daArrow_cFv.s" } #pragma pop +#endif + +#ifndef NONMATCHING /* ############################################################################################## */ /* 8049DDBC-8049DDC0 000138 0004+00 2/3 0/0 0/0 .rodata @4868 */ SECTION_RODATA static f32 const lit_4868 = 95.0f; COMPILER_STRIP_GATE(0x8049DDBC, &lit_4868); +#endif /* 8049DE0C-8049DE18 000000 000C+00 1/1 0/0 0/0 .data cNullVec__6Z2Calc */ SECTION_DATA static u8 cNullVec__6Z2Calc[12] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; +#ifndef NONMATCHING /* 8049DE18-8049DE2C 00000C 0004+10 0/0 0/0 0/0 .data @1787 */ #pragma push #pragma force_active on @@ -842,24 +1300,100 @@ SECTION_DATA static u32 lit_1787[1 + 4 /* padding */] = { 0x00000000, }; #pragma pop +#endif +#ifndef NONMATCHING /* 8049DE2C-8049DE38 -00001 000C+00 1/1 0/0 0/0 .data @4777 */ SECTION_DATA static void* lit_4777[3] = { (void*)NULL, (void*)0xFFFFFFFF, (void*)procMove__9daArrow_cFv, }; +#endif /* 8049B45C-8049B764 0018DC 0308+00 1/0 0/0 0/0 .text procWait__9daArrow_cFv */ +#ifdef NONMATCHING +// matches with literals +int daArrow_c::procWait() { + setKeepMatrix(); + + u32 param = fopAcM_GetParam(this); + if (param == 1 || param == 2) { + tevStr.mFogColor.r = 0; + tevStr.mFogColor.g = 0; + tevStr.mFogColor.b = 0; + + daAlink_c* link = daAlink_getAlinkActorClass(); + if (mArrowType == 1) { + field_0x688.SetAtAtp(0); + if (!link->checkCanoeSlider()) { + field_0x688.OnAtSPrmBit(0x20); + } + } else { + field_0x688.SetAtAtp(2); + } + link->getArrowFlyData(&mFlyMax, &field_0x99c, 0); + mOutLengthRate = 95.0f / field_0x99c; + field_0xa10.setOldPosP(&field_0x9d8, &field_0x9e4); + JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(field_0x964); + if (emitter != NULL) { + emitter->setParticleCallBackPtr(NULL); + } + mProcFunc = &daArrow_c::procMove; + arrowShooting(); + setBombMoveEffect(); + } else if (mArrowType == 1) { + setSmokePos(); + + field_0x964 = dComIfGp_particle_set(field_0x964, 0x1df, &field_0x9cc, &tevStr, &field_0x958, NULL, 0xff, NULL, -1, NULL, NULL, NULL); + dComIfGp_particle_levelEmitterOnEventMove(field_0x964); + + JPABaseEmitter* emitter = dComIfGp_particle_getEmitter(field_0x964); + if (emitter != NULL) { + emitter->setParticleCallBackPtr(dPa_control_c::getParticleTracePCB()); + emitter->setUserWork((u32)&mSmokePos); + + if (field_0x942 != 0) { + emitter->stopDrawParticle(); + } else { + emitter->playDrawParticle(); + } + } + + field_0x968 = dComIfGp_particle_set(field_0x968, 0x1de, &field_0x9cc, &tevStr, &field_0x958, NULL, 0xff, NULL, -1, NULL, NULL, NULL); + dComIfGp_particle_levelEmitterOnEventMove(field_0x968); + emitter = dComIfGp_particle_getEmitter(field_0x968); + if (emitter != NULL) { + if (field_0x942 != 0) { + emitter->stopDrawParticle(); + } else { + emitter->playDrawParticle(); + } + } + + mSoundObjArrow.startLevelSound(0x8000a, 0, mReverb); + } + + if(dComIfGp_checkCameraAttentionStatus(dComIfGp_getPlayerCameraID(0), 2)) { + field_0x942 = 3; + } else { + field_0x942 = 0; + } + + return TRUE; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daArrow_c::procWait() { +asm int daArrow_c::procWait() { nofralloc #include "asm/rel/d/a/d_a_arrow/d_a_arrow/procWait__9daArrow_cFv.s" } #pragma pop +#endif +#ifndef NONMATCHING /* ############################################################################################## */ /* 8049DDC0-8049DDC4 00013C 0004+00 0/1 0/0 0/0 .rodata @5356 */ #pragma push @@ -871,7 +1405,7 @@ COMPILER_STRIP_GATE(0x8049DDC0, &lit_5356); /* 8049DDC4-8049DDC8 000140 0004+00 0/1 0/0 0/0 .rodata @5357 */ #pragma push #pragma force_active on -SECTION_RODATA static u32 const lit_5357 = 0x3F980000; +SECTION_RODATA static u32 const lit_5357 = 0x3F980000; // 1.1875 COMPILER_STRIP_GATE(0x8049DDC4, &lit_5357); #pragma pop @@ -946,6 +1480,7 @@ SECTION_DATA static void* lit_5716[3] = { (void*)0xFFFFFFFF, (void*)procWait__9daArrow_cFv, }; +#endif /* 8049DE8C-8049DEAC -00001 0020+00 1/0 0/0 0/0 .data l_daArrowMethodTable */ SECTION_DATA static void* l_daArrowMethodTable[8] = { @@ -1029,14 +1564,321 @@ SECTION_DATA extern void* __vt__8cM3dGPla[3] = { }; /* 8049B764-8049C6B8 001BE4 0F54+00 2/0 0/0 0/0 .text procMove__9daArrow_cFv */ +#ifdef NONMATCHING +// matches with literals +int daArrow_c::procMove() { + if (fopAcM_GetParam(this) == 6) { + setBlur(); + mProcFunc = &daArrow_c::procActorControllStop; + speedF = 0.0f; + procActorControllStop(); + return TRUE; + } + + current.pos += speed; + cXyz v = current.pos + speed * mOutLengthRate; + BOOL bVar14 = FALSE; + if (field_0x945 == 0) { + field_0x56c.Set(&old.pos, &v, this); + + cXyz v2; + if (dComIfG_Bgsp().LineCross(&field_0x56c)) { + v2 = field_0x56c.i_GetCross(); + } else { + v2 = v; + } + + int water_next_pos = setArrowWaterNextPos(&old.pos, &v2); + if (water_next_pos != 0) { + if (water_next_pos == 2 || water_next_pos == 4) { + bVar14 = TRUE; + } else if (water_next_pos == 1) { + fopKyM_createWpillar(field_0x5dc.GetCrossP(), 0.3f, 0); + mDoAud_seStart(0x60031, field_0x5dc.GetCrossP(), 0, mReverb); + } + + field_0x945 = 1; + if (water_next_pos == 4 || water_next_pos == 3) { + field_0x9fc = old.pos; + } else { + field_0x9fc = field_0x5dc.i_GetCross(); + } + + speed.normalizeZP(); + current.pos = v2 - (speed * 95.0f); + speed *= 80.0f; + + if (mArrowType != 4) { + mOutLengthRate = 1.1875f; + } + + v = v2; + } + } + + field_0x56c.Set(&old.pos, &v, this); + + u8 uVar17; + BOOL line_cross = dComIfG_Bgsp().LineCross(&field_0x56c); + if (field_0x688.ChkTgHit() && field_0x688.GetTgHitGObj() != NULL) { + uVar17 = field_0x688.GetTgHitGObj()->GetAtMtrl(); + } else { + uVar17 = 0; + } + + if (uVar17 == 2 || (line_cross && daAlink_c::checkIcePolygonDamage(&field_0x56c))) { + field_0x943 = 1; + } else if (uVar17 == 3) { + current.pos = *field_0x688.GetTgHitPosP(); + if(field_0x688.GetTgRVecP()->abs2XZ() < 1.0f ) { + if (field_0x688.GetTgHitAc() != NULL) { + current.angle.y = fopAcM_searchActorAngleY(this, field_0x688.GetTgHitAc()); + } else { + current.angle.y = cLib_targetAngleY(&old.pos, ¤t.pos); + } + } else { + current.angle.y = cM_atan2s(-field_0x688.GetTgRVecP()->x, -field_0x688.GetTgRVecP()->z); + } + shape_angle.y = current.angle.y; + procReturnInit(1); + return TRUE; + } + + int iVar3; + if (field_0x688.ChkAtHit() != 0) { + if (mArrowType == 1 && field_0x943 == 0) { + if (field_0x945 != 0) { + field_0x93f = 1; + return TRUE; + } + + if (mHitAcID != -1) { + setBombArrowExplode(&field_0x9a8); + return TRUE; + } + } + + if (mArrowType == 4) { + if (field_0x688.GetAtHitAc() != NULL && fopAcM_GetName(field_0x688.GetAtHitAc()) == PROC_E_PZ) { + iVar3 = 0; + } else { + procSlingHitInit(field_0x688.GetAtHitPosP(), &field_0x688); + return TRUE; + } + } else if (field_0x943 != 0) { + iVar3 = 2; + } else { + if (mHitAcID == -1) { + iVar3 = 0; + } else { + iVar3 = 1; + fopAc_ac_c* hit_ac = fopAcM_SearchByID(mHitAcID); + if (field_0x93e) { + iVar3 = 2; + } else { + if (hit_ac != NULL && fopAcM_GetJntCol(hit_ac) != NULL) { + if (field_0x960 >= 0) { + iVar3 = 4; + } else { + if (field_0x960 == -1) { + iVar3 = 3; + } else if (field_0x960 == -2) { + iVar3 = 2; + } + } + } + } + } + } + + if (iVar3 != 4) { + clearNearActorData(); + } + } else { + if (line_cross && field_0x943 != 0) { + iVar3 = 2; + } else { + iVar3 = 0; + } + } + + if (iVar3 != 0 && iVar3 != 3) { + if (mArrowType == 2) { + setLightArrowHitMark(field_0x688.GetAtHitPosP()); + setBlur(); + } else if (mArrowType == 4) { + procSlingHitInit(field_0x56c.GetCrossP(), NULL); + } else if (iVar3 == 2) { + if (field_0x945) { + field_0x93f = 1; + } else { + procReturnInit(0); + current.pos = old.pos; + setNormalMatrix(); + } + } else if (iVar3 == 4) { + setBlur(); + fopAcM_SetParam(this, 3); + mProcFunc = &daArrow_c::procActorStop; + speedF = 0.0f; + setStopActorMatrix(); + } else { + field_0x93f = 1; + if (field_0x945 == 0 && field_0x688.ChkAtHit()) { + current.pos = *field_0x688.GetAtHitPosP(); + setBlur(); + } + } + return TRUE; + } + + if (line_cross) { + current.pos = field_0x56c.i_GetCross(); + + if (field_0x945 != 0 && (mArrowType == 1 || current.pos.y - field_0x9fc.y < -300.0f)) { + field_0x93f = 1; + return TRUE; + } + + dKy_Sound_set(current.pos, 3, fopAcM_GetID(this), 10); + + if (mArrowType == 1) { + setBombArrowExplode(¤t.pos); + return TRUE; + } + + if (mArrowType == 2) { + setLightArrowHitMark(¤t.pos); + } + + cM3dGPla local_4c; + u32 se_id; + dComIfG_Bgsp().GetTriPla(field_0x56c, &local_4c); + int local_d8 = dComIfG_Bgsp().GetPolyAtt0(field_0x56c); + if (local_d8 == 2 || mArrowType == 4 || local_d8 == 0xe || local_d8 == 10 || local_d8 == 8) { + if (field_0x945 != 0) { + field_0x93f = 1; + return TRUE; + } + + csXyz angle( + cM_atan2s(local_4c.i_GetNP()->y, local_4c.i_GetNP()->absXZ()), + cM_atan2s(-local_4c.i_GetNP()->x, -local_4c.i_GetNP()->z), + 0.0f + ); + if (mArrowType == 4) { + se_id = 0x40018; + current.angle = angle; + procSlingHitInit(¤t.pos, NULL); + } else { + procReturnInit(0); + dComIfGp_setHitMark(9, this, ¤t.pos, &angle, NULL, 0); + se_id = 0x40017; + } + } else { + setBlur(); + mProcFunc = &daArrow_c::procBGStop; + fopAcM_SetParam(this, 4); + speedF = 0.0f; + se_id = Z2SE_HIT_AL_ARROW_STICK; + current.angle.x = shape_angle.x; + dComIfG_Bgsp().ArrowStickCallBack(field_0x56c, this, field_0x56c.i_GetCross()); + } + + daAlink_getAlinkActorClass()->itemHitSE(se_id, dKy_pol_sound_get(&field_0x56c) & 0xff, &mSoundObjArrow); + } else { + if (field_0x945 != 0) { + if (bVar14) { + field_0x93f = 1; + return TRUE; + } + + f32 f = current.pos.y - field_0x9fc.y; + if (f < -300.0f) { + field_0x688.OffAtSetBit(); + field_0x688.ResetAtHit(); + if (cLib_chaseF(&scale.x, 0.0f, 0.1f)) { + field_0x93f = 1; + return TRUE; + } + + f32 x = scale.x; + scale.y = x; + scale.z = x; + mpModel->setBaseScale(scale); + } else { + if (f > 95.0f) { + field_0x93f = 1; + return TRUE; + } + setArrowAt(current.pos.abs(mStartPos)); + } + } else { + f32 distance = current.pos.abs(mStartPos); + if (distance > mFlyMax || fopAcM_GetGravity(this) < 0.0f) { + if (mArrowType == 4) { + fopAcM_SetGravity(this, -5.0f); + } else { + fopAcM_SetGravity(this, -2.0f); + } + speed.y += fopAcM_GetGravity(this); + + if (field_0x956 != 0) { + field_0x956--; + } else { + field_0x93f = 1; + return TRUE; + + } + shape_angle.x = speed.atan2sY_XZ(); + current.angle.x = -shape_angle.x; + + if (mArrowType != 4) { + mOutLengthRate = 95.0f / speed.abs(); + } + } + + u32 sound_id; + if (mArrowType == 2) { + sound_id = 0x6001c; + } else { + if (fopAcM_GetParam(this) == 2) { + if (mArrowType == 1) { + sound_id = Z2SE_OBJ_ARROWBOMB_FLYGAIN; + } else { + sound_id = Z2SE_OBJ_ARROW_FLY_GAIN; + } + } else if (mArrowType == 1) { + sound_id = Z2SE_OBJ_ARROWBOMB_FLY; + } else { + sound_id = Z2SE_OBJ_ARROW_FLY_NORMAL; + } + } + + if (mArrowType != 4) { + mSoundObjArrow.startLevelSound(sound_id, 0, mReverb); + } + + setArrowAt(distance); + setBlur(); + } + } + + setNormalMatrix(); + setBombMoveEffect(); + + return TRUE; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daArrow_c::procMove() { +asm int daArrow_c::procMove() { nofralloc #include "asm/rel/d/a/d_a_arrow/d_a_arrow/procMove__9daArrow_cFv.s" } #pragma pop +#endif /* 8049C6B8-8049C700 002B38 0048+00 1/0 0/0 0/0 .text __dt__8cM3dGPlaFv */ #pragma push @@ -1049,6 +1891,7 @@ extern "C" asm void __dt__8cM3dGPlaFv() { } #pragma pop +#ifndef NONMATCHING /* ############################################################################################## */ /* 8049DDD0-8049DDD4 00014C 0004+00 0/1 0/0 0/0 .rodata @5385 */ #pragma push @@ -1070,17 +1913,49 @@ COMPILER_STRIP_GATE(0x8049DDD4, &lit_5386); SECTION_RODATA static f32 const lit_5387 = 11264.0f; COMPILER_STRIP_GATE(0x8049DDD8, &lit_5387); #pragma pop +#endif /* 8049C700-8049C874 002B80 0174+00 1/1 0/0 0/0 .text procReturnInit__9daArrow_cFi */ +#ifdef NONMATCHING +// matches with literals +int daArrow_c::procReturnInit(int param_0) { + setBlur(); + setBombMoveEffect(); + fopAcM_SetParam(this, 5); + + mProcFunc = &daArrow_c::procReturn; + speedF = 0.0f; + + s16 rnd_y = cM_rndFX(8192.0f) + (current.angle.y + 0x8000); + s16 sVar6; + + if (param_0 != 0) { + sVar6 = 8192.0f - cM_rndF(4096.0f); + } else { + sVar6 = -cM_rndF(4096.0f); + } + + f32 f = cM_rndF(15.0f) + 15.0f; + speed.y = f * cM_ssin(sVar6); + speed.x = (f * cM_ssin(rnd_y)) * cM_scos(sVar6); + speed.z = (f * cM_scos(rnd_y)) * cM_scos(sVar6); + + field_0x954 = 11264.0f - cM_rndF(4096.0f); + + return TRUE; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daArrow_c::procReturnInit(int param_0) { +asm int daArrow_c::procReturnInit(int param_0) { nofralloc #include "asm/rel/d/a/d_a_arrow/d_a_arrow/procReturnInit__9daArrow_cFi.s" } #pragma pop +#endif +#ifndef NONMATCHING /* ############################################################################################## */ /* 8049DDDC-8049DDE0 000158 0004+00 0/1 0/0 0/0 .rodata @5458 */ #pragma push @@ -1102,91 +1977,250 @@ COMPILER_STRIP_GATE(0x8049DDE0, &lit_5459); SECTION_RODATA static f32 const lit_5460 = 5000.0f; COMPILER_STRIP_GATE(0x8049DDE4, &lit_5460); #pragma pop +#endif /* 8049C874-8049CB70 002CF4 02FC+00 1/0 0/0 0/0 .text procReturn__9daArrow_cFv */ +#ifdef NONMATCHING +// matches with literals +int daArrow_c::procReturn() { + setBombMoveEffect(); + + speed.y -= 2.0f; + current.pos += speed; + + shape_angle.x += field_0x954; + + cXyz pos = current.pos + speed * mOutLengthRate; + field_0x56c.Set(&old.pos, &pos, this); + decAlphaBlur(); + + if(dComIfG_Bgsp().LineCross(&field_0x56c)) { + if (mArrowType == 1 && field_0x943 == 0) { + setBombArrowExplode(field_0x56c.GetCrossP()); + return TRUE; + } + + cM3dGPla cStack_34; + cXyz pos; + dComIfG_Bgsp().GetTriPla(field_0x56c, &cStack_34); + f32 speed_magnitude = speed.abs(); + C_VECReflect(&speed, cStack_34.i_GetNP(), &pos); + speed.x = pos.x * speed_magnitude * 0.5f; + speed.y = pos.y * speed_magnitude * 0.5f; + speed.z = pos.z * speed_magnitude * 0.5f; + field_0x954 = -(field_0x954 >> 1); + + if (dBgS_CheckBGroundPoly(field_0x56c)) { + field_0x93d = 1; + } + } else { + if ((field_0x93d != 0 && speed.y <= 0.0f) || mStartPos.y - 5000.0f > current.pos.y) { + field_0x93f = 1; + return TRUE; + } + } + + setNormalMatrix(); + + return TRUE; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daArrow_c::procReturn() { +asm int daArrow_c::procReturn() { nofralloc #include "asm/rel/d/a/d_a_arrow/d_a_arrow/procReturn__9daArrow_cFv.s" } #pragma pop +#endif /* 8049CB70-8049CC60 002FF0 00F0+00 1/0 0/0 0/0 .text procBGStop__9daArrow_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daArrow_c::procBGStop() { - nofralloc -#include "asm/rel/d/a/d_a_arrow/d_a_arrow/procBGStop__9daArrow_cFv.s" +int daArrow_c::procBGStop() { + if (field_0x944 != 0 || !dComIfG_Bgsp().ChkPolySafe(field_0x56c)) { + field_0x93f = 1; + return TRUE; + } + + BOOL update_angle = FALSE; + s16 angle = getVibAngle(); + + if(field_0x952) { + update_angle = TRUE; + } + decAlphaBlur(); + + if (dComIfG_Bgsp().ChkMoveBG(field_0x56c)) { + dComIfG_Bgsp().MoveBgTransPos(field_0x56c, true, ¤t.pos, ¤t.angle, &shape_angle); + update_angle = TRUE; + } + + if (update_angle) { + shape_angle.x = current.angle.x + angle; + setNormalMatrix(); + } + + checkReget(); + return TRUE; } -#pragma pop /* 8049CC60-8049CCCC 0030E0 006C+00 1/0 0/0 0/0 .text procActorStop__9daArrow_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daArrow_c::procActorStop() { - nofralloc -#include "asm/rel/d/a/d_a_arrow/d_a_arrow/procActorStop__9daArrow_cFv.s" +int daArrow_c::procActorStop() { + decAlphaBlur(); + + fopAc_ac_c* actor = setStopActorMatrix(); + if (field_0x944 != 0 || actor == NULL) { + field_0x93f = 1; + } else { + if (actor->group != 4) { + checkReget(); + } + } + + return TRUE; } -#pragma pop /* 8049CCCC-8049CCF0 00314C 0024+00 2/1 0/0 0/0 .text procActorControllStop__9daArrow_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daArrow_c::procActorControllStop() { - nofralloc -#include "asm/rel/d/a/d_a_arrow/d_a_arrow/procActorControllStop__9daArrow_cFv.s" +int daArrow_c::procActorControllStop() { + decAlphaBlur(); + return TRUE; } -#pragma pop /* 8049CCF0-8049CE50 003170 0160+00 1/1 0/0 0/0 .text * procSlingHitInit__9daArrow_cFP4cXyzP12dCcD_GObjInf */ +#ifdef NONMATCHING +// matches with literals +int daArrow_c::procSlingHitInit(cXyz* param_0, dCcD_GObjInf* param_1) { + fopAc_ac_c* hit_ac; + if (param_1 != NULL) { + hit_ac = param_1->GetAtHitAc(); + } else { + hit_ac = NULL; + } + + if (!daAlink_c::notSwordHitVibActor(hit_ac)) { + u16 hitmark; + if (hit_ac != NULL && fopAcM_checkStatus(hit_ac, 0x10000) != 0) { + hitmark = 1; + } else { + hitmark = 9; + if (hit_ac != NULL && param_1->GetAtHitGObj() != NULL) { + if (param_1->GetAtHitGObj()->ChkTgNoSlingHitInfSet()) { + mDoAud_seStart(0x40018, param_0, 0x2d, mReverb); + } + } + } + dComIfGp_setHitMark(hitmark, hit_ac, param_0, ¤t.angle, NULL, 0); + } + + setBlur(); + fopAcM_SetParam(this, 8); + mProcFunc = &daArrow_c::procSlingHit; + speedF = 0.0f; + field_0x956 = 5; + + return TRUE; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daArrow_c::procSlingHitInit(cXyz* param_0, dCcD_GObjInf* param_1) { +asm int daArrow_c::procSlingHitInit(cXyz* param_0, dCcD_GObjInf* param_1) { nofralloc #include "asm/rel/d/a/d_a_arrow/d_a_arrow/procSlingHitInit__9daArrow_cFP4cXyzP12dCcD_GObjInf.s" } #pragma pop +#endif /* 8049CE50-8049CEA0 0032D0 0050+00 1/0 0/0 0/0 .text procSlingHit__9daArrow_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daArrow_c::procSlingHit() { - nofralloc -#include "asm/rel/d/a/d_a_arrow/d_a_arrow/procSlingHit__9daArrow_cFv.s" +int daArrow_c::procSlingHit() { + decAlphaBlur(); + + if (field_0x956 != 0) { + field_0x956--; + } else { + field_0x93f = 1; + } + return TRUE; } -#pragma pop /* 8049CEA0-8049D0AC 003320 020C+00 1/1 0/0 0/0 .text execute__9daArrow_cFv */ +#ifdef NONMATCHING +// matches with literals +int daArrow_c::execute() { + field_0xa08.setActor(); + mReverb = dComIfGp_getReverb(fopAcM_GetRoomNo(this)); + + if (field_0x945 == 0 && field_0x943 == 0) { + field_0x9e4 = field_0x9d8; + field_0x9d8 = field_0x9cc; + } + + if (field_0x93f != 0) { + setLightChargeEffect(1); + fopAcM_delete(this); + return TRUE; + } else { + if (field_0x94e == m_count) { + field_0x944 = 1; + } + + if (field_0x942 != 0) { + field_0x942--; + } + + (this->*mProcFunc)(); + + if (mArrowType == 1 && field_0x93f == 0) { + if (field_0x950 != 0) { + field_0x950--; + } else { + f32 amp = cM_scos(current.angle.x) * 95.0f; + cXyz pos( + current.pos.x + amp * cM_ssin(current.angle.y), + current.pos.y + cM_ssin(current.angle.x) * 95.0f, + current.pos.z + amp * cM_scos(current.angle.y) + ); + setBombArrowExplode(&pos); + return TRUE; + } + } + + if (mArrowType == 2) { + setLightChargeEffect(0); + } + + attention_info.position = current.pos; + eyePos = current.pos; + + setRoomInfo(); + + mSoundObjArrow.framework(0, mReverb); + } + + return TRUE; +} + +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daArrow_c::execute() { +asm int daArrow_c::execute() { nofralloc #include "asm/rel/d/a/d_a_arrow/d_a_arrow/execute__9daArrow_cFv.s" } #pragma pop +#endif /* 8049D0AC-8049D0CC 00352C 0020+00 1/0 0/0 0/0 .text daArrow_execute__FP9daArrow_c */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -static asm void daArrow_execute(daArrow_c* param_0) { - nofralloc -#include "asm/rel/d/a/d_a_arrow/d_a_arrow/daArrow_execute__FP9daArrow_c.s" +static int daArrow_execute(daArrow_c* i_this) { + return i_this->execute(); } -#pragma pop /* ############################################################################################## */ /* 8049DDE8-8049DDF0 000164 0008+00 0/1 0/0 0/0 .rodata tmpColor$5589 */ +#ifndef NONMATCHING #pragma push #pragma force_active on SECTION_RODATA static u8 const tmpColor[8] = { @@ -1208,38 +2242,95 @@ COMPILER_STRIP_GATE(0x8049DDF0, &lit_5676); SECTION_RODATA static f32 const lit_5677 = 50.0f; COMPILER_STRIP_GATE(0x8049DDF4, &lit_5677); #pragma pop +#endif /* 8049D0CC-8049D40C 00354C 0340+00 1/1 0/0 0/0 .text draw__9daArrow_cFv */ +#ifdef NONMATCHING +// regalloc, literals +int daArrow_c::draw() { + g_env_light.settingTevStruct(0, ¤t.pos, &tevStr); + + if (field_0x942 != 0 || field_0x93f != 0 || fopAcM_GetParam(this) == 8) { + return TRUE; + } + + GXColorS10 tmpColor = {0, 0, 0}; + J3DGXColorS10 color = (tmpColor); + + daAlink_c* link = daAlink_getAlinkActorClass(); + if (fopAcM_GetParam(this) == 0 && field_0x940 != 0) { + setKeepMatrix(); + field_0x940 = 0; + } + + if (mArrowType == 1) { + if (field_0x943 != 0) { + color.r = link->getFreezeR(); + color.g = link->getFreezeG(); + color.b = link->getFreezeB(); + } else { + s16 explode_time = daAlink_getAlinkActorClass()->getBombExplodeTime(); + f32 r; + + if (field_0x950 > explode_time >> 1) { + r = fabsf(cM_fsin((field_0x950 - (explode_time >> 1)) * M_PI / (explode_time >> 2))); + } else if (field_0x950 > explode_time >> 2) { + r = fabsf(cM_fsin((field_0x950 - (explode_time >> 1)) * M_PI / (explode_time >> 3))); + } else { + r = fabsf(cM_fsin((field_0x950 - (explode_time >> 3)) * M_PI / (explode_time >> 4))); + } + + color.r = (u8)(r * 50.0f); + } + + mpModel->getModelData()->getMaterialNodePointer(1)->setTevColor(1, &color); + } + + if (field_0x943 != 0) { + tevStr.mFogColor.r = link->getFreezeR(); + tevStr.mFogColor.g = link->getFreezeG(); + tevStr.mFogColor.b = link->getFreezeB(); + } + + g_env_light.setLightTevColorType_MAJI(mpModel, &tevStr); + mDoExt_modelUpdateDL(mpModel); + + if (mArrowType == 1) { + color.r = 0; + color.g = 0; + color.b = 0; + mpModel->getModelData()->getMaterialNodePointer(1)->setTevColor(1, &color); + } + + return TRUE; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daArrow_c::draw() { +asm int daArrow_c::draw() { nofralloc #include "asm/rel/d/a/d_a_arrow/d_a_arrow/draw__9daArrow_cFv.s" } #pragma pop +#endif /* 8049D40C-8049D42C 00388C 0020+00 1/0 0/0 0/0 .text daArrow_draw__FP9daArrow_c */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -static asm void daArrow_draw(daArrow_c* param_0) { - nofralloc -#include "asm/rel/d/a/d_a_arrow/d_a_arrow/daArrow_draw__FP9daArrow_c.s" +static int daArrow_draw(daArrow_c* i_this) { + return i_this->draw(); } -#pragma pop /* 8049D42C-8049D440 0038AC 0014+00 1/1 0/0 0/0 .text daAlink_searchHorseZelda__FP10fopAc_ac_cPv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -static asm void daAlink_searchHorseZelda(fopAc_ac_c* param_0, void* param_1) { - nofralloc -#include "asm/rel/d/a/d_a_arrow/d_a_arrow/daAlink_searchHorseZelda__FP10fopAc_ac_cPv.s" -} -#pragma pop +static void* daAlink_searchHorseZelda(fopAc_ac_c* param_0, void* param_1) { + if (fopAcM_GetName(param_0) == PROC_HOZELDA) { + return param_0; + } + return NULL; +} + +#ifndef NONMATCHING /* ############################################################################################## */ /* 8049DDF8-8049DDFC 000174 0004+00 0/1 0/0 0/0 .rodata @5813 */ #pragma push @@ -1261,16 +2352,82 @@ COMPILER_STRIP_GATE(0x8049DDFC, &lit_5814); SECTION_RODATA static f32 const lit_5815 = 110.0f; COMPILER_STRIP_GATE(0x8049DE00, &lit_5815); #pragma pop +#endif /* 8049D440-8049D808 0038C0 03C8+00 1/1 0/0 0/0 .text create__9daArrow_cFv */ +#ifdef NONMATCHING +// regalloc, stack issue, literals +cPhs__Step daArrow_c::create() { + fopAcM_SetupActor(this, daArrow_c); + + mArrowType = fopAcM_GetParamBit(this, 8, 8); + fopAcM_SetParam(this, (u8)fopAcM_GetParam(this)); + + if (!fopAcM_entrySolidHeap(this, daArrow_createHeap, mArrowType == 1 ? 0xea0 : 0x810)) { + return cPhs_ERROR_e; + } + + if (mArrowType == 2) { + field_0xa08.setData(fopAcM_Search((fopAcIt_JudgeFunc)daAlink_searchHorseZelda, NULL)); + field_0x946 = 6; + field_0x94c = 0x896e; + } else if (mArrowType == 0) { + field_0x946 = 1; + field_0x94c = 0x3b8; + } else if (mArrowType == 4) { + field_0x946 = 1; + field_0x94c = 0xa55; + } else { + field_0x946 = 0; + } + + field_0x940 = 1; + + field_0x64c.Init(10, 0xff, this); + field_0x688.Set(l_atCpsSrc); + field_0x688.SetStts(&field_0x64c); + field_0x688.SetAtHitCallback(daArrow_atHitCallBack); + field_0x7cc.Set(l_coSphSrc); + field_0x7cc.SetStts(&field_0x64c); + + daAlink_c* player = daAlink_getAlinkActorClass(); + if (mArrowType == 4) { + setNormalMatrix(); + player->getArrowFlyData(&mFlyMax, &field_0x99c, 0); + mOutLengthRate = 0.0f; + arrowShooting(); + mProcFunc = &daArrow_c::procMove; + } else { + mProcFunc = &daArrow_c::procWait; + setKeepMatrix(); + } + + fopAcM_SetMtx(this, mpModel->getBaseTRMtx()); + fopAcM_SetMin(this, -6.0f, -6.0f, 0.0f); + fopAcM_SetMax(this, 6.0f, 6.0f, 110.0f); + + setSmokePos(); + + field_0x94e = -1; + field_0x956 = 300; + field_0x952 = 50.0f - cM_rndF(20.0f); + + field_0x950 = player->getBombExplodeTime(); + field_0x5dc.OffFullGrp(); + field_0x5dc.OnWaterGrp(); + + return cPhs_COMPLEATE_e; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daArrow_c::create() { +asm cPhs__Step daArrow_c::create() { nofralloc #include "asm/rel/d/a/d_a_arrow/d_a_arrow/create__9daArrow_cFv.s" } #pragma pop +#endif /* 8049D808-8049D80C 003C88 0004+00 1/0 0/0 0/0 .text cleanup__18dPa_levelEcallBackFv */ void dPa_levelEcallBack::cleanup() { @@ -1322,14 +2479,9 @@ extern "C" asm void __dt__10dCcD_GSttsFv() { #pragma pop /* 8049D96C-8049D98C 003DEC 0020+00 1/0 0/0 0/0 .text daArrow_create__FP9daArrow_c */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -static asm void daArrow_create(daArrow_c* param_0) { - nofralloc -#include "asm/rel/d/a/d_a_arrow/d_a_arrow/daArrow_create__FP9daArrow_c.s" +static int daArrow_create(daArrow_c* i_this) { + return i_this->create(); } -#pragma pop /* 8049D98C-8049DBD8 003E0C 024C+00 1/1 0/0 0/0 .text __dt__9daArrow_cFv */ #pragma push @@ -1342,14 +2494,10 @@ asm daArrow_c::~daArrow_c() { #pragma pop /* 8049DBD8-8049DC00 004058 0028+00 1/0 0/0 0/0 .text daArrow_delete__FP9daArrow_c */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -static asm void daArrow_delete(daArrow_c* param_0) { - nofralloc -#include "asm/rel/d/a/d_a_arrow/d_a_arrow/daArrow_delete__FP9daArrow_c.s" +static int daArrow_delete(daArrow_c* i_this) { + i_this->~daArrow_c(); + return TRUE; } -#pragma pop /* 8049DC00-8049DC48 004080 0048+00 1/0 0/0 0/0 .text __dt__10cCcD_GSttsFv */ #pragma push @@ -1387,6 +2535,7 @@ void JPAEmitterCallBack::drawAfter(JPABaseEmitter* param_0) { /* empty function */ } +#ifndef NONMATCHING /* 8049DC58-8049DC74 0040D8 001C+00 1/1 0/0 0/0 .text cLib_calcTimer__FPs */ #pragma push #pragma optimization_level 0 @@ -1396,6 +2545,7 @@ extern "C" asm void func_8049DC58(void* _this, s16* param_0) { #include "asm/rel/d/a/d_a_arrow/d_a_arrow/func_8049DC58.s" } #pragma pop +#endif /* ############################################################################################## */ /* 8049DFBC-8049DFC0 000064 0004+00 0/0 0/0 0/0 .bss diff --git a/rel/d/a/e/d_a_e_pz/d_a_e_pz.cpp b/rel/d/a/e/d_a_e_pz/d_a_e_pz.cpp index 5d1ab477191..56fd7a3d6dc 100644 --- a/rel/d/a/e/d_a_e_pz/d_a_e_pz.cpp +++ b/rel/d/a/e/d_a_e_pz/d_a_e_pz.cpp @@ -99,37 +99,6 @@ struct daPy_py_c { static u8 m_midnaActor[4]; }; -struct daE_PZ_c { - /* 807585BC */ void draw(); - /* 80758800 */ void setBck(int, u8, f32, f32); - /* 807588AC */ void setActionMode(int, int); - /* 807588B8 */ void mEntrySUB(bool); - /* 80758A94 */ void mPzScaleSet(bool); - /* 80758BA0 */ void mEnemyScaleSet(); - /* 80758D44 */ void getCutType(); - /* 80758DA4 */ void mSetFirePos(); - /* 80758E04 */ void damage_check(); - /* 807592F4 */ void executeSearchPoint(); - /* 807593CC */ void executeOpeningDemo(); - /* 8075B7E0 */ void mPointerSet(); - /* 8075B970 */ void executeWait(); - /* 8075C6AC */ void executeAttack(); - /* 8075CB80 */ void executeDamage(); - /* 8075CE68 */ void executeDead(); - /* 8075D94C */ void executeSummonsBullet(); - /* 8075F0BC */ void executeBullet(); - /* 8075F3A8 */ void action(); - /* 8075F510 */ void action_fire(); - /* 8075F578 */ void fire_mtx_set(); - /* 8075F734 */ void mtx_set(); - /* 8075F7E8 */ void cc_set(); - /* 8075F964 */ void execute(); - /* 8075FA88 */ void _delete(); - /* 8075FB4C */ void CreateHeap(); - /* 8076010C */ void create(); - /* 807607EC */ daE_PZ_c(); -}; - struct daE_PZ_HIO_c { /* 8075856C */ daE_PZ_HIO_c(); /* 80760C60 */ ~daE_PZ_HIO_c(); diff --git a/src/d/a/d_a_alink_damage.inc b/src/d/a/d_a_alink_damage.inc index 80044d763b9..e8cd26b5629 100644 --- a/src/d/a/d_a_alink_damage.inc +++ b/src/d/a/d_a_alink_damage.inc @@ -265,12 +265,12 @@ void daAlink_c::setDashDamage() { /* 800D7768-800D77C8 0D20A8 0060+00 2/2 0/0 3/3 .text * checkIcePolygonDamage__9daAlink_cFP13cBgS_PolyInfo */ -bool daAlink_c::checkIcePolygonDamage(cBgS_PolyInfo* i_poly) { +BOOL daAlink_c::checkIcePolygonDamage(cBgS_PolyInfo* i_poly) { if (dComIfG_Bgsp().GetPolyAtt0(*i_poly) == 8 && dKy_pol_argument_get(i_poly) & 0x60) { - return true; + return TRUE; } - return false; + return FALSE; } /* 800D77C8-800D7820 0D2108 0058+00 8/8 0/0 0/0 .text checkMagicArmorNoDamage__9daAlink_cFv */ diff --git a/src/d/d_jnt_col.cpp b/src/d/d_jnt_col.cpp index 38892465347..130b099c2db 100644 --- a/src/d/d_jnt_col.cpp +++ b/src/d/d_jnt_col.cpp @@ -204,7 +204,7 @@ asm cM3dGSph::~cM3dGSph() { #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void dJntCol_c::getArrowOffsetPosAndAngle(cXyz const* param_0, csXyz const* param_1, +asm int dJntCol_c::getArrowOffsetPosAndAngle(cXyz const* param_0, csXyz const* param_1, cXyz* param_2, cXyz* param_3) const { nofralloc #include "asm/d/d_jnt_col/getArrowOffsetPosAndAngle__9dJntCol_cCFPC4cXyzPC5csXyzP4cXyzP4cXyz.s"