summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Padgham <jeff.ookami@gmail.com>2024-04-26 19:12:56 -0700
committerGitHub <noreply@github.com>2024-04-26 19:12:56 -0700
commitc163dc9ed31c69eb791be1dcdcd7ab8b296e95a1 (patch)
tree569d09bb0c51bde94264b8faeb83cee6b4ae1278
parent9e80bf0d84c150b07ca14cea53ee6d2f82b073c2 (diff)
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 <noreply>
-rw-r--r--include/d/a/d_a_alink.h5
-rw-r--r--include/d/cc/d_cc_d.h3
-rw-r--r--include/d/d_jnt_col.h2
-rw-r--r--include/d/particle/d_particle.h2
-rw-r--r--include/rel/d/a/d_a_arrow/d_a_arrow.h80
-rw-r--r--include/rel/d/a/d_a_hozelda/d_a_hozelda.h2
-rw-r--r--include/rel/d/a/e/d_a_e_pz/d_a_e_pz.h36
-rw-r--r--rel/d/a/d_a_arrow/d_a_arrow.cpp1408
-rw-r--r--rel/d/a/e/d_a_e_pz/d_a_e_pz.cpp31
-rw-r--r--src/d/a/d_a_alink_damage.inc6
-rw-r--r--src/d/d_jnt_col.cpp2
11 files changed, 1383 insertions, 194 deletions
diff --git a/include/d/a/d_a_alink.h b/include/d/a/d_a_alink.h
index 5914b1077d..7c06fa2c6f 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 3c7ac0a03d..64ee42a1ef 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 c72b7b4c50..58fae6ffbb 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 731d295690..7a51ed45ab 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 80e1d34523..0119677444 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 1928bfaf79..7ee052896b 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 7570446059..76862b840e 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 3149129f1e..4c6d0c9f43 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(&current.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<daArrow_c*>(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<daArrow_c*>(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, &current.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(&current.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(&current.pos, &target, this);
+
+ if (dComIfG_Bgsp().LineCross(&field_0x56c)) {
+ target = field_0x56c.i_GetCross();
+ }
+
+ static_cast<cM3dGCps*>(&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(&current.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(), &current.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, &current.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(&current.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, &current.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(&current.pos);
+ return TRUE;
+ }
+
+ if (mArrowType == 2) {
+ setLightArrowHitMark(&current.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(&current.pos, NULL);
+ } else {
+ procReturnInit(0);
+ dComIfGp_setHitMark(9, this, &current.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, &current.pos, &current.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, &current.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, &current.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"
+static void* daAlink_searchHorseZelda(fopAc_ac_c* param_0, void* param_1) {
+ if (fopAcM_GetName(param_0) == PROC_HOZELDA) {
+ return param_0;
+ }
+
+ return NULL;
}
-#pragma pop
+#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<s>__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 5d1ab47719..56fd7a3d6d 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 80044d763b..e8cd26b562 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 3889246534..130b099c2d 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"