From 8599b135d627ef5b7e3c300f8af10aa9109b4d5c Mon Sep 17 00:00:00 2001 From: TakaRikka <38417346+TakaRikka@users.noreply.github.com> Date: Sat, 6 Jul 2024 07:33:37 -0700 Subject: [PATCH] d_a_alink_hang done (#2172) --- include/d/a/d_a_alink.h | 21 +- include/d/a/d_a_player.h | 1 + include/rel/d/a/b/d_a_b_dr/d_a_b_dr.h | 2 + include/rel/d/a/b/d_a_b_dre/d_a_b_dre.h | 44 +- .../d_a_obj_lv5yiblltray.h | 37 +- .../d/a/obj/d_a_obj_swhang/d_a_obj_swhang.h | 3 +- .../d_a_obj_lv5yiblltray.cpp | 12 +- src/d/a/d_a_alink.cpp | 11 +- src/d/a/d_a_alink_hang.inc | 2245 ++++++++++++++++- 9 files changed, 2301 insertions(+), 75 deletions(-) diff --git a/include/d/a/d_a_alink.h b/include/d/a/d_a_alink.h index 773643d9b94..cb76aa13c5a 100644 --- a/include/d/a/d_a_alink.h +++ b/include/d/a/d_a_alink.h @@ -2256,9 +2256,9 @@ class daAlink_c : public daPy_py_c { /* 800FC240 */ int procHangReady(); /* 800FC2F4 */ int procHangLeverDownInit(); /* 800FC390 */ int procHangLeverDown(); - /* 800FC5A4 */ void setDragonHangPos(); + /* 800FC5A4 */ int setDragonHangPos(); /* 800FC6B4 */ int setOctaIealHangPos(); - /* 800FC748 */ void setBossBodyHangPos(); + /* 800FC748 */ int setBossBodyHangPos(); /* 800FC77C */ int procBossBodyHangInit(fopAc_ac_c*); /* 800FC870 */ int procBossBodyHang(); /* 800FCF58 */ int getLadderUnitCount() const; @@ -2266,7 +2266,7 @@ class daAlink_c : public daPy_py_c { /* 800FD048 */ void setLadderPosInit(); /* 800FD1F0 */ void setLadderPos(int); /* 800FD288 */ f32 getLadderMoveAnmSpeed(); - /* 800FD2AC */ void changeLadderMoveProc(int); + /* 800FD2AC */ int changeLadderMoveProc(int); /* 800FD4A8 */ int setMoveBGLadderCorrect(); /* 800FD5E4 */ int checkLadderFall(); /* 800FD648 */ int procLadderUpStartInit(); @@ -2286,14 +2286,14 @@ class daAlink_c : public daPy_py_c { /* 800FE174 */ void setClimbShapeOffset(); /* 800FE3C4 */ int getClimbDirectionFromAngle(); /* 800FE438 */ void changeClimbMoveProc(int); - /* 800FE5A0 */ void checkClimbMoveUpDownProc(int); - /* 800FE6E8 */ void checkClimbMoveSideProc(int); - /* 800FE868 */ void setMoveBGClimbCorrect(); + /* 800FE5A0 */ BOOL checkClimbMoveUpDownProc(int); + /* 800FE6E8 */ BOOL checkClimbMoveSideProc(int); + /* 800FE868 */ int setMoveBGClimbCorrect(); /* 800FEB90 */ int checkBgCorrectClimbMove(cXyz*, cXyz*); - /* 800FEC70 */ void checkClimbRoof(f32); + /* 800FEC70 */ BOOL checkClimbRoof(f32); /* 800FED50 */ int checkClimbGround(cXyz*, f32); - /* 800FEEC0 */ void checkBgClimbMove(int); - /* 800FF28C */ void setClimbStartNotGround(); + /* 800FEEC0 */ BOOL checkBgClimbMove(int); + /* 800FF28C */ int setClimbStartNotGround(); /* 800FF450 */ int procClimbUpStartInit(int); /* 800FF704 */ int procClimbUpStart(); /* 800FF818 */ int procClimbDownStartInit(s16); @@ -2311,7 +2311,7 @@ class daAlink_c : public daPy_py_c { /* 80100614 */ void setRoofHangHandOnSE(cBgS_PolyInfo*); /* 80100668 */ int checkRoofHangMovePos(); /* 80100770 */ int commonRoofHangProc(); - /* 801008EC */ void checkNextActionRoofHang(); + /* 801008EC */ int checkNextActionRoofHang(); /* 80100A10 */ int procRoofHangStartInit(cBgS_PolyInfo const&, cXyz const&, int); /* 80100AE4 */ int procRoofHangStart(); /* 80100BB4 */ int procRoofHangWaitInit(int); @@ -3230,6 +3230,7 @@ class daAlink_c : public daPy_py_c { static bool checkMidnaChargeAttack() { return dComIfGs_isEventBit(0x501); } u16 getMidnaMsgNum() const { return mMidnaMsgNum; } u32 getStartEvent() { return fopAcM_GetParam(this) >> 0x18; } + BOOL checkClimbFall() { return checkLadderFall(); } const daAlink_AnmData* getAnmData(daAlink_ANM anmID) const { return &m_anmDataTable[anmID]; } const daAlink_FaceTexData* getFaceTexData(daAlink_FTANM i_anmID) const { return &m_faceTexDataTable[i_anmID]; } diff --git a/include/d/a/d_a_player.h b/include/d/a/d_a_player.h index fefa599d538..98b1ef8eb9f 100644 --- a/include/d/a/d_a_player.h +++ b/include/d/a/d_a_player.h @@ -403,6 +403,7 @@ class daPy_py_c : public fopAc_ac_c { RFLG0_UNK_8000000 = 0x8000000, RFLG0_UNK_4000000 = 0x4000000, RFLG0_GRAB_PUT_START = 0x400000, + RFLG0_UNK_40000 = 0x40000, RFLG0_UNK_20000 = 0x20000, RFLG0_UNK_10000 = 0x10000, RFLG0_UNK_8000 = 0x8000, diff --git a/include/rel/d/a/b/d_a_b_dr/d_a_b_dr.h b/include/rel/d/a/b/d_a_b_dr/d_a_b_dr.h index 980b602e4a2..e10b7aa5655 100644 --- a/include/rel/d/a/b/d_a_b_dr/d_a_b_dr.h +++ b/include/rel/d/a/b/d_a_b_dr/d_a_b_dr.h @@ -76,6 +76,8 @@ class daB_DR_c : public fopEn_enemy_c { /* 805C5974 */ void create(); /* 805C62B0 */ daB_DR_c(); + MtxP getMtx() { return mpModelMorf->getModel()->getAnmMtx(15); } + void onTarget() { mTarget = true; } bool isBack() { return mPrm0; } diff --git a/include/rel/d/a/b/d_a_b_dre/d_a_b_dre.h b/include/rel/d/a/b/d_a_b_dre/d_a_b_dre.h index 5bd1a167103..d98de51ffce 100644 --- a/include/rel/d/a/b/d_a_b_dre/d_a_b_dre.h +++ b/include/rel/d/a/b/d_a_b_dre/d_a_b_dre.h @@ -1,8 +1,9 @@ #ifndef D_A_B_DRE_H #define D_A_B_DRE_H -#include "dolphin/types.h" #include "f_op/f_op_actor_mng.h" +#include "d/bg/d_bg_s_acch.h" +#include "Z2AudioLib/Z2Creature.h" /** * @ingroup actors-enemies @@ -37,8 +38,47 @@ class daB_DRE_c : public fopEn_enemy_c { /* 805CA6C0 */ void setBaseMtx(); /* 805CA944 */ void create(); + MtxP getMtx() { return field_0x6ec->getModel()->getAnmMtx(15); } + private: - /* 0x5ac */ u8 field_0x5ac[0x930 - 0x5ac]; + /* 0x5AC */ u8 field_0x5AC[0x5B0 - 0x5AC]; + /* 0x5B0 */ int mAnm; + /* 0x5B4 */ u8 field_0x5b4; + /* 0x5B5 */ u8 field_0x5b5; + /* 0x5B6 */ u8 field_0x5B6[0x5B7 - 0x5B6]; + /* 0x5B7 */ u8 field_0x5b7; + /* 0x5B8 */ u8 field_0x5b8; + /* 0x5B9 */ u8 field_0x5b9; + /* 0x5BA */ u8 field_0x5BA[0x5C8 - 0x5BA]; + /* 0x5C8 */ cXyz field_0x5c8; + /* 0x5D4 */ cXyz field_0x5d4; + /* 0x5E0 */ cXyz field_0x5e0; + /* 0x5EC */ cXyz field_0x5ec; + /* 0x5F8 */ f32 field_0x5f8; + /* 0x5FC */ s16 field_0x5fc; + /* 0x5FE */ u8 field_0x5FE[0x600 - 0x5FE]; + /* 0x600 */ f32 field_0x600; + /* 0x604 */ mDoExt_brkAnm* field_0x604; + /* 0x608 */ f32 field_0x608; + /* 0x60C */ u8 field_0x60C[0x610 - 0x60C]; + /* 0x610 */ f32 field_0x610; + /* 0x614 */ f32 field_0x614; + /* 0x618 */ f32 field_0x618; + /* 0x61C */ u32 field_0x61c[4]; + /* 0x62C */ s16 field_0x62c[5]; + /* 0x636 */ u8 field_0x636; + /* 0x637 */ u8 field_0x637; + /* 0x638 */ u8 field_0x638; + /* 0x639 */ u8 field_0x639[0x63C - 0x639]; + /* 0x63C */ request_of_phase_process_class mPhase; + /* 0x644 */ Z2CreatureEnemy mSound; + /* 0x6E8 */ u8 field_0x6E8[0x6EC - 0x6E8]; + /* 0x6EC */ mDoExt_McaMorfSO* field_0x6ec; + /* 0x6F0 */ dBgS_AcchCir mAcchCir; + /* 0x730 */ dBgS_ObjAcch mAcch; + /* 0x908 */ u8 field_0x908[0x910 - 0x908]; + /* 0x910 */ Z2CreatureEnemy* field_0x910; + /* 0x914 */ u8 field_0x914[0x930 - 0x914]; }; STATIC_ASSERT(sizeof(daB_DRE_c) == 0x930); diff --git a/include/rel/d/a/obj/d_a_obj_lv5yiblltray/d_a_obj_lv5yiblltray.h b/include/rel/d/a/obj/d_a_obj_lv5yiblltray/d_a_obj_lv5yiblltray.h index 90c12aa8338..42f62da70a3 100644 --- a/include/rel/d/a/obj/d_a_obj_lv5yiblltray/d_a_obj_lv5yiblltray.h +++ b/include/rel/d/a/obj/d_a_obj_lv5yiblltray/d_a_obj_lv5yiblltray.h @@ -2,6 +2,8 @@ #define D_A_OBJ_LV5YIBLLTRAY_H #include "f_op/f_op_actor_mng.h" +#include "d/bg/d_bg_s_movebg_actor.h" +#include "d/cc/d_cc_d.h" /** * @ingroup actors-objects @@ -11,24 +13,45 @@ * @details * */ -class daObjYIblltray_c : public fopAc_ac_c { +class daObjYIblltray_c : public dBgS_MoveBgActor, public request_of_phase_process_class { public: /* 80C6EBF8 */ void create1st(); /* 80C6EC88 */ void setMtx(); - /* 80C6EDA8 */ void CreateHeap(); - /* 80C6EEFC */ void Create(); /* 80C6F1E8 */ void rideActor(fopAc_ac_c*); /* 80C6F23C */ void sendBall(unsigned int); /* 80C6F440 */ void onAttention(); /* 80C6F450 */ void offAttention(); - /* 80C6F460 */ void Execute(f32 (**)[3][4]); /* 80C702E0 */ void initRotTo(); - /* 80C70330 */ void Draw(); - /* 80C70408 */ void Delete(); /* 80C7088C */ ~daObjYIblltray_c(); + /* 80C6EDA8 */ virtual int CreateHeap(); + /* 80C6EEFC */ virtual int Create(); + /* 80C6F460 */ virtual int Execute(Mtx**); + /* 80C70330 */ virtual int Draw(); + /* 80C70408 */ virtual int Delete(); + + cXyz& getHandlePos() { return mHandlePos; } + void onHang() { mIsHang = true; } + private: - /* 0x568 */ u8 field_0x568[0xa94 - 0x568]; + /* 0x5A8 */ cXyz field_0x5a8; + /* 0x5B4 */ cXyz field_0x5b4; + /* 0x5C0 */ Mtx field_0x5c0; + /* 0x5F0 */ Mtx field_0x5f0; + /* 0x620 */ J3DModel* field_0x620; + /* 0x624 */ s16 field_0x624; + /* 0x628 */ cXyz field_0x628; + /* 0x634 */ u32 field_0x634; + /* 0x638 */ int field_0x638; + /* 0x63C */ f32 field_0x63c; + /* 0x640 */ int field_0x640; + /* 0x644 */ dCcD_Cyl mCcCyl[3]; + /* 0x9F8 */ dCcD_Stts mCcStts; + /* 0xA34 */ J3DModel* field_0xa34; + /* 0xA38 */ mDoExt_bckAnm mBck; + /* 0xA54 */ Mtx field_0xa54; + /* 0xA84 */ u8 mIsHang; + /* 0xA88 */ cXyz mHandlePos; }; STATIC_ASSERT(sizeof(daObjYIblltray_c) == 0xa94); diff --git a/include/rel/d/a/obj/d_a_obj_swhang/d_a_obj_swhang.h b/include/rel/d/a/obj/d_a_obj_swhang/d_a_obj_swhang.h index d8a611d75d0..82cd74299f4 100644 --- a/include/rel/d/a/obj/d_a_obj_swhang/d_a_obj_swhang.h +++ b/include/rel/d/a/obj/d_a_obj_swhang/d_a_obj_swhang.h @@ -16,7 +16,6 @@ */ class daObjSwHang_c : public dBgS_MoveBgActor { public: - /* 80101874 */ cXyz getHangPos(); /* 80CFB9D8 */ void initBaseMtx(); /* 80CFBA60 */ void setBaseMtx(); /* 80CFBDD0 */ void create1st(); @@ -39,6 +38,8 @@ class daObjSwHang_c : public dBgS_MoveBgActor { /* 80CFCD04 */ virtual int Draw(); /* 80CFCD98 */ virtual int Delete(); + cXyz getHangPos() { return mHangPos; } + void setHangPlayer() { mHangPlayer = 1; } u8 getType() { return field_0x730; } diff --git a/rel/d/a/obj/d_a_obj_lv5yiblltray/d_a_obj_lv5yiblltray.cpp b/rel/d/a/obj/d_a_obj_lv5yiblltray/d_a_obj_lv5yiblltray.cpp index a301a14d08c..6b9cd45f4df 100644 --- a/rel/d/a/obj/d_a_obj_lv5yiblltray/d_a_obj_lv5yiblltray.cpp +++ b/rel/d/a/obj/d_a_obj_lv5yiblltray/d_a_obj_lv5yiblltray.cpp @@ -4,7 +4,6 @@ */ #include "rel/d/a/obj/d_a_obj_lv5yiblltray/d_a_obj_lv5yiblltray.h" -#include "d/cc/d_cc_d.h" #include "dol2asm.h" @@ -200,7 +199,8 @@ COMPILER_STRIP_GATE(0x80C709C8, &lit_3719); #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daObjYIblltray_c::CreateHeap() { +// asm int daObjYIblltray_c::CreateHeap() { +extern "C" asm void CreateHeap__16daObjYIblltray_cFv() { nofralloc #include "asm/rel/d/a/obj/d_a_obj_lv5yiblltray/d_a_obj_lv5yiblltray/CreateHeap__16daObjYIblltray_cFv.s" } @@ -272,7 +272,7 @@ static dCcD_SrcCyl l_cc_cyl_src = { #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daObjYIblltray_c::Create() { +asm int daObjYIblltray_c::Create() { nofralloc #include "asm/rel/d/a/obj/d_a_obj_lv5yiblltray/d_a_obj_lv5yiblltray/Create__16daObjYIblltray_cFv.s" } @@ -470,7 +470,7 @@ COMPILER_STRIP_GATE(0x80C70A28, &lit_4451); #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daObjYIblltray_c::Execute(f32 (**param_0)[3][4]) { +asm int daObjYIblltray_c::Execute(f32 (**param_0)[3][4]) { nofralloc #include "asm/rel/d/a/obj/d_a_obj_lv5yiblltray/d_a_obj_lv5yiblltray/Execute__16daObjYIblltray_cFPPA3_A4_f.s" } @@ -490,7 +490,7 @@ asm void daObjYIblltray_c::initRotTo() { #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daObjYIblltray_c::Draw() { +asm int daObjYIblltray_c::Draw() { nofralloc #include "asm/rel/d/a/obj/d_a_obj_lv5yiblltray/d_a_obj_lv5yiblltray/Draw__16daObjYIblltray_cFv.s" } @@ -500,7 +500,7 @@ asm void daObjYIblltray_c::Draw() { #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daObjYIblltray_c::Delete() { +asm int daObjYIblltray_c::Delete() { nofralloc #include "asm/rel/d/a/obj/d_a_obj_lv5yiblltray/d_a_obj_lv5yiblltray/Delete__16daObjYIblltray_cFv.s" } diff --git a/src/d/a/d_a_alink.cpp b/src/d/a/d_a_alink.cpp index 7579a3c9f78..299efd936f2 100644 --- a/src/d/a/d_a_alink.cpp +++ b/src/d/a/d_a_alink.cpp @@ -3926,8 +3926,11 @@ SECTION_SDATA2 static f32 lit_25874 = -0.00016276042151730508f; SECTION_SDATA2 static f32 lit_25916 = 214.0f; /* 80452FA8-80452FB0 0015A8 0008+00 1/1 0/0 0/0 .sdata2 offsetAngle$25945 */ -SECTION_SDATA2 static u8 offsetAngle[8] = { - 0x00, 0x00, 0x80, 0x00, 0x40, 0x00, 0xC0, 0x00, +SECTION_SDATA2 static s16 offsetAngle[] = { + 0x0000, + 0x8000, + 0x4000, + 0xC000, }; /* 80452FB0-80452FB4 0015B0 0004+00 1/1 0/0 0/0 .sdata2 @26233 */ @@ -5760,8 +5763,8 @@ SECTION_RODATA static Vec const localPaddleTop = { COMPILER_STRIP_GATE(0x803919E4, &localPaddleTop); /* 803919F0-803919FC 01E050 000C+00 1/1 0/0 0/0 .rodata underOffsetY$23302 */ -SECTION_RODATA static u8 const underOffsetY[12] = { - 0x41, 0x70, 0x00, 0x00, 0x42, 0xB4, 0x00, 0x00, 0x43, 0x16, 0x00, 0x00, +SECTION_RODATA static f32 const underOffsetY[3] = { + 15.0f, 90.0f, 150.0f, }; COMPILER_STRIP_GATE(0x803919F0, &underOffsetY); diff --git a/src/d/a/d_a_alink_hang.inc b/src/d/a/d_a_alink_hang.inc index 17eaaac7b07..4bc79f0d168 100644 --- a/src/d/a/d_a_alink_hang.inc +++ b/src/d/a/d_a_alink_hang.inc @@ -3,7 +3,13 @@ * Player hang / climb action handling */ +#include "SSystem/SComponent/c_math.h" +#include "d/a/d_a_alink.h" +#include "d/com/d_com_inf_game.h" +#include "rel/d/a/b/d_a_b_dr/d_a_b_dr.h" +#include "rel/d/a/b/d_a_b_dre/d_a_b_dre.h" #include "rel/d/a/b/d_a_b_ob/d_a_b_ob.h" +#include "rel/d/a/obj/d_a_obj_lv5yiblltray/d_a_obj_lv5yiblltray.h" #include "rel/d/a/obj/d_a_obj_swhang/d_a_obj_swhang.h" /* 800F9FDC-800F9FFC 0F491C 0020+00 2/2 0/0 0/0 .text getHangMoveAnmSpeed__9daAlink_cFv @@ -33,26 +39,169 @@ int daAlink_c::getHangDirectionFromAngle() { /* 800FA070-800FA338 0F49B0 02C8+00 2/2 0/0 0/0 .text hangMoveBgCheck__9daAlink_cFsP4cXyz */ +// matches with literals +#ifdef NONMATCHING +BOOL daAlink_c::hangMoveBgCheck(s16 param_0, cXyz* param_1) { + BOOL rt = false; + cM3dGPla sp78; + + f32 var_f31; + if (checkModeFlg(0x10000)) { + var_f31 = current.pos.y + field_0x598; + } else { + var_f31 = current.pos.y; + } + + cXyz sp84; + cXyz sp90; + f32 var_f30 = cM_ssin(shape_angle.y) * 4.5f; + f32 var_f29 = cM_scos(shape_angle.y) * 4.5f; + + if (param_1 != NULL) { + sp84 = field_0x3798; + sp90 = current.pos; + sp90.x += cM_ssin(param_0) * 30.0f; + sp90.z += cM_scos(param_0) * 30.0f; + } else { + sp84.set(current.pos.x, var_f31, current.pos.z); + sp90.set(sp84.x + cM_ssin(param_0) * 40.0f, sp84.y, sp84.z + cM_scos(param_0) * 40.0f); + } + + sp84.x -= var_f30; + sp84.z -= var_f29; + sp90.x -= var_f30; + sp90.z -= var_f29; + + cXyz sp9C; + for (int i = 0; i < 3; i++) { + sp90.y = sp84.y = var_f31 - underOffsetY[i]; + + if (commonLineCheck(&sp84, &sp90)) { + dComIfG_Bgsp().GetTriPla(mLinkLinChk, &sp78); + + if (cBgW_CheckBWall(sp78.mNormal.y)) { + if (cLib_distanceAngleS(sp78.mNormal.atan2sX_Z(), shape_angle.y) < 0x549F) { + if (param_1 == NULL) { + return true; + } + + sp9C = mLinkLinChk.i_GetCross() - sp90; + if (sp9C.abs2XZ() > param_1->abs2XZ()) { + *param_1 = sp9C; + rt = true; + } + } + } + } + } + + return rt; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm BOOL daAlink_c::hangMoveBgCheck(s16 param_0, cXyz* param_1) { - nofralloc +asm BOOL daAlink_c::hangMoveBgCheck(s16 param_0, cXyz* param_1){nofralloc #include "asm/d/a/d_a_alink/hangMoveBgCheck__9daAlink_cFsP4cXyz.s" } #pragma pop +#endif /* 800FA338-800FA5C8 0F4C78 0290+00 3/3 0/0 0/0 .text changeHangMoveProc__9daAlink_cFi */ +// matches with literals +#ifdef NONMATCHING +BOOL daAlink_c::changeHangMoveProc(int i_direction) { + if (!mLinkAcch.i_ChkGroundHit() || !dComIfG_Bgsp().ChkPolySafe(mLinkAcch.m_gnd)) { + return false; + } + + cM3dGPla sp58; + dComIfG_Bgsp().GetTriPla(mLinkAcch.m_gnd, &sp58); + if (sp58.mNormal.y < 0.9986f) { + return false; + } + + cXyz sp64; + cXyz sp70; + + s16 var_r29; + if (i_direction == DIR_LEFT) { + var_r29 = shape_angle.y + 0x4000; + } else if (i_direction == DIR_RIGHT) { + var_r29 = shape_angle.y - 0x4000; + } else { + var_r29 = current.angle.y; + } + + sp64.set(current.pos.x, current.pos.y + 5.0f, current.pos.z); + + f32 var_f31; + if (checkNoResetFlg2(FLG2_UNK_2000)) { + var_f31 = 40.0f; + } else { + var_f31 = 25.0f; + } + + sp70.set(sp64.x + var_f31 * cM_ssin(var_r29), sp64.y, sp64.z + var_f31 * cM_scos(var_r29)); + + if (commonLineCheck(&sp64, &sp70)) { + return false; + } + + mLinkGndChk.SetPos(&sp70); + if (fabsf(dComIfG_Bgsp().GroundCross(&mLinkGndChk) - current.pos.y) > 5.0f) { + cXyz sp7C; + cXyz sp88; + sp7C.set(sp70.x, current.pos.y - 5.0f, sp70.z); + sp88.set(sp70.x + cM_ssin(shape_angle.y) * 75.0f, sp7C.y, + sp70.z + cM_scos(shape_angle.y) * 75.0f); + if (!commonLineCheck(&sp7C, &sp88)) { + return false; + } + + dComIfG_Bgsp().GetTriPla(mLinkLinChk, &sp58); + if (cLib_distanceAngleS(sp58.mNormal.atan2sX_Z(), shape_angle.y) < 0x549F) { + return false; + } + } + + return hangMoveBgCheck(var_r29, NULL) == false; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm BOOL daAlink_c::changeHangMoveProc(int param_0) { +asm BOOL daAlink_c::changeHangMoveProc(int i_direction) { nofralloc #include "asm/d/a/d_a_alink/changeHangMoveProc__9daAlink_cFi.s" } #pragma pop +#endif /* 800FA5C8-800FA6E4 0F4F08 011C+00 5/5 0/0 0/0 .text checkHangFootWall__9daAlink_cFv */ +// matches with literals +#ifdef NONMATCHING +bool daAlink_c::checkHangFootWall() { + f32 var_f31 = cM_ssin(shape_angle.y); + f32 var_f30 = cM_scos(shape_angle.y); + cXyz sp4C(current.pos.x - var_f31 * 30.0f, current.pos.y - 120.0f, + current.pos.z - var_f30 * 30.0f); + cXyz sp58(current.pos.x + var_f31, sp4C.y, current.pos.z + var_f30); + + if (commonLineCheck(&sp4C, &sp58)) { + cM3dGPla sp40; + dComIfG_Bgsp().GetTriPla(mLinkLinChk, &sp40); + + if (fabsf(sp40.mNormal.y) <= 0.005f) { + onNoResetFlg2(FLG2_UNK_2000); + return true; + } + } + + offNoResetFlg2(FLG2_UNK_2000); + return false; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -61,6 +210,7 @@ asm bool daAlink_c::checkHangFootWall() { #include "asm/d/a/d_a_alink/checkHangFootWall__9daAlink_cFv.s" } #pragma pop +#endif /* 800FA6E4-800FA78C 0F5024 00A8+00 10/10 0/0 0/0 .text setHangGroundY__9daAlink_cFv */ // matches with literals @@ -108,6 +258,56 @@ int daAlink_c::changeHangEndProc() { } /* 800FA85C-800FAA7C 0F519C 0220+00 3/3 0/0 0/0 .text checkHangStartSideWall__9daAlink_cFs */ +// matches with literals +#ifdef NONMATCHING +void daAlink_c::checkHangStartSideWall(s16 param_0) { + s16 var_r28 = param_0 - 0x4000; + s16 var_r27 = param_0 + 0x8000; + f32 var_f31; + f32 var_f30; + + f32 var_f29; + if (checkWolf()) { + var_f29 = 35.0f; + } else { + var_f29 = 25.0f; + } + + var_f31 = var_f29 * cM_ssin(var_r28); + var_f30 = var_f29 * cM_scos(var_r28); + + cXyz sp7C; + cXyz sp88; + cM3dGPla sp70; + + sp7C.set(var_f31 + (current.pos.x + (cM_ssin(param_0) * 4.5f)), + current.pos.y - field_0x598 * 0.5f, + var_f30 + (current.pos.z + (cM_scos(param_0) * 4.5f))); + sp88.set(sp7C.x - var_f31 * 2.0f, sp7C.y, sp7C.z - var_f30 * 2.0f); + + for (int i = 0; i < 2; i++) { + if (commonLineCheck(&sp7C, &sp88)) { + dComIfG_Bgsp().GetTriPla(mLinkLinChk, &sp70); + if (cLib_distanceAngleS(sp70.mNormal.atan2sX_Z(), var_r27) < 0x549F) { + current.pos.x += var_f31; + current.pos.z += var_f30; + break; + } + } + + if (commonLineCheck(&sp88, &sp7C)) { + dComIfG_Bgsp().GetTriPla(mLinkLinChk, &sp70); + if (cLib_distanceAngleS(sp70.mNormal.atan2sX_Z(), var_r27) < 0x549F) { + current.pos.x -= var_f31; + current.pos.z -= var_f30; + break; + } + } + + sp88.y = sp7C.y = current.pos.y - 5.0f; + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -116,6 +316,7 @@ asm void daAlink_c::checkHangStartSideWall(s16 param_0) { #include "asm/d/a/d_a_alink/checkHangStartSideWall__9daAlink_cFs.s" } #pragma pop +#endif /* 800FAA7C-800FAE14 0F53BC 0398+00 3/3 0/0 0/0 .text procHangStartInit__9daAlink_cFv */ // matches with literals @@ -205,6 +406,77 @@ int daAlink_c::procHangStart() { /* 800FAECC-800FB1A4 0F580C 02D8+00 1/1 0/0 0/0 .text procHangFallStartInit__9daAlink_cFP8cM3dGPla */ +// matches with literals +#ifdef NONMATCHING +int daAlink_c::procHangFallStartInit(cM3dGPla* param_0) { + s16 var_r30 = param_0->mNormal.atan2sX_Z(); + current.pos.x -= param_0->mNormal.x * 1.5f; + current.pos.z -= param_0->mNormal.z * 1.5f; + + checkHangStartSideWall(var_r30); + + cXyz sp58(current.pos.x, current.pos.y + 50.0f, current.pos.z); + mLinkGndChk.SetPos(&sp58); + + f32 cross = dComIfG_Bgsp().GroundCross(&mLinkGndChk); + sp58.y = cross; + if (sp58.y != -1000000000.0f) { + if (sp58.y < current.pos.y + l_autoDownHeight) { + return 0; + } + + current.pos.y = sp58.y; + } + + s16 var_r28 = var_r30 - 0x4000; + f32 var_f31 = cM_ssin(var_r28) * 25.0f; + f32 var_f30 = cM_scos(var_r28) * 25.0f; + sp58.x += var_f31; + sp58.y = current.pos.y + 50.0f; + sp58.z += var_f30; + + mLinkGndChk.SetPos(&sp58); + cross = dComIfG_Bgsp().GroundCross(&mLinkGndChk); + if (cross < current.pos.y - 50.0f) { + sp58.x = current.pos.x - var_f31; + sp58.z = current.pos.z - var_f30; + mLinkGndChk.SetPos(&sp58); + + cross = dComIfG_Bgsp().GroundCross(&mLinkGndChk); + sp58.y = cross; + if (sp58.y < current.pos.y - 50.0f) { + return 0; + } + + current.pos = sp58; + } + + setOldRootQuaternion(0, shape_angle.y - (var_r30 + 0x8000), 0); + shape_angle.y = var_r30 + 0x8000; + current.angle.y = shape_angle.y; + + f32 morf; + if (mProcID == PROC_FRONT_ROLL) { + morf = 0.0f; + } else { + morf = daAlinkHIO_wallFall_c0::m.mOneHandGrabAnm.mInterpolation; + } + + commonProcInit(PROC_HANG_FALL_START); + offNoResetFlg2(FLG2_UNK_2000); + setSingleAnime(ANM_HANG_ONE_HAND, daAlinkHIO_wallFall_c0::m.mOneHandGrabAnm.mSpeed, + daAlinkHIO_wallFall_c0::m.mOneHandGrabAnm.mStartFrame, + daAlinkHIO_wallFall_c0::m.mOneHandGrabAnm.mEndFrame, morf); + + mNormalSpeed = 0.0f; + speed.y = 0.0f; + dComIfGp_setPlayerStatus0(0, 0x100); + voiceStart(Z2SE_AL_V_FOOT_MISS); + setBowHangAnime(); + setHangGroundY(); + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -213,6 +485,7 @@ asm int daAlink_c::procHangFallStartInit(cM3dGPla* param_0) { #include "asm/d/a/d_a_alink/procHangFallStartInit__9daAlink_cFP8cM3dGPla.s" } #pragma pop +#endif /* 800FB1A4-800FB2A0 0F5AE4 00FC+00 1/0 0/0 0/0 .text procHangFallStart__9daAlink_cFv */ int daAlink_c::procHangFallStart() { @@ -297,6 +570,30 @@ asm int daAlink_c::procHangUp() { #endif /* 800FB43C-800FB544 0F5D7C 0108+00 3/3 0/0 0/0 .text procHangWaitInit__9daAlink_cFv */ +// matches with literals +#ifdef NONMATCHING +int daAlink_c::procHangWaitInit() { + commonProcInit(PROC_HANG_WAIT); + + if (checkNoResetFlg2(FLG2_UNK_2000) && checkHangFootWall()) { + setSingleAnime(ANM_CLIMB_HANG, 0.0f, daAlinkHIO_ladder_c0::m.field_0x0.mEndFrame, + daAlinkHIO_ladder_c0::m.field_0x0.mEndFrame, 5.0f); + field_0x2f92 = 0xFE; + field_0x2f93 = 0xFE; + } else { + setSingleAnime(ANM_HANG_READY, 0.0f, daAlinkHIO_wallCatch_c0::m.mGrabAAnm.mEndFrame, + daAlinkHIO_wallCatch_c0::m.mGrabAAnm.mEndFrame, 5.0f); + } + + setBowHangAnime(); + field_0x2d7c = NULL; + mNormalSpeed = 0.0f; + speed.y = 0.0f; + dComIfGp_setPlayerStatus0(0, 0x100); + setHangGroundY(); + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -305,8 +602,39 @@ asm int daAlink_c::procHangWaitInit() { #include "asm/d/a/d_a_alink/procHangWaitInit__9daAlink_cFv.s" } #pragma pop +#endif /* 800FB544-800FB650 0F5E84 010C+00 1/0 0/0 0/0 .text procHangWait__9daAlink_cFv */ +// matches with literals +#ifdef NONMATCHING +int daAlink_c::procHangWait() { + if (changeHangEndProc()) { + return 1; + } + + setClimbShapeOffset(); + + if (checkNoResetFlg2(FLG2_UNK_2000) && !checkHangFootWall()) { + setSingleAnime(ANM_HANG_READY, 0.0f, daAlinkHIO_wallCatch_c0::m.mGrabAAnm.mEndFrame, + daAlinkHIO_wallCatch_c0::m.mGrabAAnm.mEndFrame, 10.0f); + } + + if (checkInputOnR()) { + int direction = getHangDirectionFromAngle(); + if (direction == DIR_FORWARD) { + return procHangClimbInit(daAlinkHIO_wallCatch_c0::m.mClimbAnm.mStartFrame); + } + + if (direction != DIR_BACKWARD && changeHangMoveProc(direction)) { + s16 temp = field_0x308c; + procHangMoveInit(direction); + field_0x308c = temp; + } + } + + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -315,8 +643,57 @@ asm int daAlink_c::procHangWait() { #include "asm/d/a/d_a_alink/procHangWait__9daAlink_cFv.s" } #pragma pop +#endif /* 800FB650-800FB790 0F5F90 0140+00 3/3 0/0 0/0 .text procHangMoveInit__9daAlink_cFi */ +// matches with literals +#ifdef NONMATCHING +int daAlink_c::procHangMoveInit(int param_0) { + commonProcInit(PROC_HANG_MOVE); + + if (checkNoResetFlg2(FLG2_UNK_2000) && checkHangFootWall()) { + daAlink_ANM anm; + + if (param_0 == 2) { + anm = ANM_CLIMB_SLIDE_LEFT; + field_0x33f0 = 1.0f; + field_0x30a2 = 0x1800; + } else { + anm = ANM_CLIMB_SLIDE_RIGHT; + field_0x33f0 = -1.0f; + field_0x30a2 = -0x1800; + } + + setSingleAnimeBaseSpeed(anm, getClimbMoveSideAnmSpeed(), 3.0f); + field_0x2f92 = 0xFE; + field_0x2f93 = 0xFE; + } else { + daAlink_ANM anm; + + if (param_0 == 2) { + anm = ANM_HANG_MOVE_LEFT; + } else { + anm = ANM_HANG_MOVE_RIGHT; + } + + setSingleAnimeBaseSpeed(anm, getHangMoveAnmSpeed(), + daAlinkHIO_wallMove_c0::m.mInterpolation); + } + + if (param_0 == 2) { + current.angle.y = shape_angle.y + 0x4000; + } else { + current.angle.y = shape_angle.y - 0x4000; + } + + dComIfGp_setPlayerStatus0(0, 0x100); + mNormalSpeed = 0.0f; + field_0x2f99 = 9; + setBowHangAnime(); + setHangGroundY(); + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -325,8 +702,118 @@ asm int daAlink_c::procHangMoveInit(int param_0) { #include "asm/d/a/d_a_alink/procHangMoveInit__9daAlink_cFi.s" } #pragma pop +#endif /* 800FB790-800FBBC8 0F60D0 0438+00 1/0 0/0 0/0 .text procHangMove__9daAlink_cFv */ +// matches with literals +#ifdef NONMATCHING +int daAlink_c::procHangMove() { + int direction = getHangDirectionFromAngle(); + field_0x2f99 = 1; + + if (!changeHangEndProc()) { + if (direction == DIR_FORWARD && checkInputOnR()) { + procHangClimbInit(daAlinkHIO_wallCatch_c0::m.mClimbAnm.mStartFrame); + } else { + daPy_frameCtrl_c* frameCtrl = mUnderFrameCtrl; + + if (checkAnmEnd(frameCtrl)) { + s16 temp = field_0x308c; + if (checkInputOnR() && direction != DIR_BACKWARD && changeHangMoveProc(direction)) { + procHangMoveInit(direction); + } else { + procHangWaitInit(); + } + + field_0x308c = temp; + } else { + if (fabsf(frameCtrl->getRate()) > 0.01f) { + if (checkNoResetFlg2(FLG2_UNK_2000)) { + setWaterInAnmRate(frameCtrl, getClimbMoveSideAnmSpeed()); + } else { + setWaterInAnmRate(frameCtrl, getHangMoveAnmSpeed()); + } + } + + if (changeHangMoveProc(4)) { + if (checkNoResetFlg2(FLG2_UNK_2000) && !checkHangFootWall()) { + daAlink_ANM anm; + f32 temp_f29 = frameCtrl->getFrame() / frameCtrl->getEnd(); + + if ((s16)(current.angle.y - shape_angle.y) > 0) { + anm = ANM_HANG_MOVE_LEFT; + } else { + anm = ANM_HANG_MOVE_RIGHT; + } + + setSingleAnimeBaseSpeed(anm, getHangMoveAnmSpeed(), 10.0f); + field_0x2f99 = 13; + + frameCtrl->setFrame(temp_f29 * (f32)frameCtrl->getEnd()); + getNowAnmPackUnder(UNDER_0)->setFrame(frameCtrl->getFrame()); + field_0x33f0 = 0.0f; + field_0x30a2 = 0; + } + + f32 temp_f31 = cM_ssin(shape_angle.y); + f32 temp_f30 = cM_scos(shape_angle.y); + f32 temp_f28 = cM_ssin(current.angle.y); + f32 temp_f27 = cM_scos(current.angle.y); + + cXyz spB0((current.pos.x + cM_ssin(current.angle.y) * 25.0f) - temp_f31 * 30.0f, + current.pos.y - 5.0f, + (current.pos.z + cM_scos(current.angle.y) * 25.0f) - + temp_f30 * 30.0f); + + cXyz spBC(spB0.x + temp_f31 * 60.0f, spB0.y, spB0.z + temp_f30 * 60.0f); + + if (commonLineCheck(&spB0, &spBC)) { + cM3dGPla spA4; + dComIfG_Bgsp().GetTriPla(mLinkLinChk, &spA4); + + s16 temp_r28 = spA4.mNormal.atan2sX_Z() + 0x8000; + if (temp_r28 != shape_angle.y) { + if ((s16)(current.angle.y - shape_angle.y) > 0) { + current.angle.y = temp_r28 + 0x4000; + } else { + current.angle.y = temp_r28 - 0x4000; + } + + s16 temp_r25 = shape_angle.y - temp_r28; + field_0x308c += temp_r25; + shape_angle.y = temp_r28; + + if (abs(temp_r25) < 100) { + field_0x308c = 0; + } else { + cXyz spC8(mLinkLinChk.i_GetCross()); + spC8.x -= spA4.mNormal.x * 1.5f; + spC8.y += 25.0f; + spC8.z -= spA4.mNormal.z * 1.5f; + + mLinkGndChk.SetPos(&spC8); + spC8.y = dComIfG_Bgsp().GroundCross(&mLinkGndChk); + + if (fabsf(spC8.y - current.pos.y) <= 5.0f) { + current.pos = spC8; + } + } + } + } + } else { + procHangWaitInit(); + } + } + + if (checkModeFlg(0x40)) { + setClimbShapeOffset(); + } + } + } + + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -335,8 +822,38 @@ asm int daAlink_c::procHangMove() { #include "asm/d/a/d_a_alink/procHangMove__9daAlink_cFv.s" } #pragma pop +#endif /* 800FBBC8-800FBCD4 0F6508 010C+00 6/6 0/0 0/0 .text procHangClimbInit__9daAlink_cFf */ +// matches with literals +#ifdef NONMATCHING +int daAlink_c::procHangClimbInit(f32 param_0) { + if (mLinkAcch.ChkRoofHit() || field_0x3174 == 6) { + return 0; + } + + BOOL wall_catch = mProcID == PROC_HANG_WALL_CATCH; + commonProcInit(PROC_HANG_CLIMB); + setSingleAnime(ANM_HANG_CLIMB_TOP, daAlinkHIO_wallCatch_c0::m.mClimbAnm.mSpeed, param_0, + daAlinkHIO_wallCatch_c0::m.mClimbAnm.mEndFrame, + daAlinkHIO_wallCatch_c0::m.mClimbAnm.mInterpolation); + + if (checkBowItem(mEquipItem)) { + field_0x33dc = mUnderFrameCtrl[0].getFrame(); + } + + dComIfGp_setPlayerStatus0(0, 0x200); + mNormalSpeed = 0.0f; + current.angle.y = shape_angle.y; + + if (!wall_catch) { + voiceStart(Z2SE_AL_V_CLIMB); + } + + setHangGroundY(); + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -345,8 +862,48 @@ asm int daAlink_c::procHangClimbInit(f32 param_0) { #include "asm/d/a/d_a_alink/procHangClimbInit__9daAlink_cFf.s" } #pragma pop +#endif /* 800FBCD4-800FBE04 0F6614 0130+00 1/0 0/0 0/0 .text procHangClimb__9daAlink_cFv */ +// matches with literals +#ifdef NONMATCHING +int daAlink_c::procHangClimb() { + daPy_frameCtrl_c* frameCtrl = mUnderFrameCtrl; + setHangGroundY(); + + if (checkModeFlg(0x4000) && field_0x33d8 > field_0x3834.y - 50.0f) { + return procLandInit(0.0f); + } + + if (checkBowItem(mEquipItem)) { + field_0x33dc = mUnderFrameCtrl[0].getFrame(); + } + + if (frameCtrl->checkPass(9.0f)) { + daAlink_footData_c* footdata = mFootData2; + + for (int i = 0; i < 2; i++) { + footdata->field_0x6 = 0; + footdata->field_0x4 = 0; + footdata->field_0x2 = 0; + footdata++; + } + } + + if (frameCtrl->getFrame() >= 9.0f) { + offModeFlg(0x4000); + } + + if (checkAnmEnd(frameCtrl)) { + checkNextAction(0); + } else if (frameCtrl->getFrame() > daAlinkHIO_wallCatch_c0::m.mClimbAnm.mCheckFrame) { + onModeFlg(4); + checkNextAction(1); + } + + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -355,9 +912,49 @@ asm int daAlink_c::procHangClimb() { #include "asm/d/a/d_a_alink/procHangClimb__9daAlink_cFv.s" } #pragma pop +#endif /* 800FBE04-800FC0D8 0F6744 02D4+00 3/3 0/0 0/0 .text procHangWallCatchInit__9daAlink_cFv */ +// matches with literals +#ifdef NONMATCHING +int daAlink_c::procHangWallCatchInit() { + cXyz sp2C = field_0x34ec - current.pos; + if (sp2C.absXZ() > field_0x18B0[0].GetWallR() + 20.0f) { + return 0; + } + + cXyz sp38; + sp38.set(field_0x34ec.x - cM_ssin(field_0x306e) * 1.5f, field_0x34ec.y + 10.0f, + field_0x34ec.z - cM_scos(field_0x306e) * 1.5f); + mLinkGndChk.SetPos(&sp38); + sp38.y = dComIfG_Bgsp().GroundCross(&mLinkGndChk); + + if (fabsf(sp38.y - field_0x34ec.y) > l_autoUpHeight) { + return 0; + } + + if (dComIfG_Bgsp().GetGroundCode(mLinkGndChk) == 6) { + return procHangStartInit(); + } + + commonProcInit(PROC_HANG_WALL_CATCH); + setSingleAnimeParam(ANM_CLIMB_TOP_SMALL, &daAlinkHIO_wallCatch_c0::m.mGrabBAnm); + setBowHangAnime(); + current.pos.x = sp38.x; + current.pos.y = sp38.y; + current.pos.z = sp38.z; + shape_angle.y = field_0x306e + 0x8000; + current.angle.y = shape_angle.y; + mNormalSpeed = 0.0f; + speed.y = 0.0f; + + dComIfGp_setPlayerStatus0(0, 0x100); + voiceStart(Z2SE_AL_V_GRAB); + setHangGroundY(); + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -366,6 +963,7 @@ asm int daAlink_c::procHangWallCatchInit() { #include "asm/d/a/d_a_alink/procHangWallCatchInit__9daAlink_cFv.s" } #pragma pop +#endif /* 800FC0D8-800FC178 0F6A18 00A0+00 1/0 0/0 0/0 .text procHangWallCatch__9daAlink_cFv */ int daAlink_c::procHangWallCatch() { @@ -437,14 +1035,14 @@ int daAlink_c::procHangReady() { */ int daAlink_c::procHangLeverDownInit() { if (mEquipItem != NO_ITEM) { - return procPreActionUnequipInit(0x5D, field_0x27f4); + return procPreActionUnequipInit(PROC_HANG_LEVER_DOWN, field_0x27f4); } commonProcInit(PROC_HANG_LEVER_DOWN); field_0x280c.setData(field_0x27f4); setSingleAnimeParam(ANM_CLIMB_JUMP, &daAlinkHIO_wallCatch_c0::m.mJumpAnm); mProcVar2.field_0x300c = field_0x27f4->shape_angle.y + 0x8000; - field_0x3198 = 145; + field_0x3198 = ANM_CLIMB_JUMP; f32 tmp_0 = FLOAT_LABEL(lit_6108); speed.y = tmp_0; @@ -453,6 +1051,51 @@ int daAlink_c::procHangLeverDownInit() { } /* 800FC390-800FC568 0F6CD0 01D8+00 1/0 0/0 0/0 .text procHangLeverDown__9daAlink_cFv */ +// matches with literals +#ifdef NONMATCHING +int daAlink_c::procHangLeverDown() { + daObjYIblltray_c* lever = (daObjYIblltray_c*)field_0x280c.getActor(); + if (lever == NULL) { + return checkNextAction(0); + } + + daPy_frameCtrl_c* frameCtrl = mUnderFrameCtrl; + if (field_0x3198 == ANM_CLIMB_JUMP) { + if (checkAnmEnd(frameCtrl)) { + shape_angle.y = mProcVar2.field_0x300c; + current.angle.y = shape_angle.y; + + current.pos.set(lever->getHandlePos().x - cM_ssin(shape_angle.y) * 8.0f, + lever->getHandlePos().y + 8.0f, + lever->getHandlePos().z - cM_scos(shape_angle.y) * 8.0f); + offModeFlg(1); + onModeFlg(0x6042); + + setSingleAnimeParam(ANM_HANG_READY, &daAlinkHIO_wallCatch_c0::m.mGrabAAnm); + voiceStart(Z2SE_AL_V_JUMP_HANG); + field_0x2f99 = 0x50; + field_0x3198 = ANM_HANG_READY; + } else { + cLib_addCalcAngleS(&shape_angle.y, mProcVar2.field_0x300c, 2, 0x1000, 0x400); + current.angle.y = shape_angle.y; + } + } else if (field_0x3198 == ANM_HANG_READY) { + if (checkAnmEnd(frameCtrl)) { + setSingleAnimeBase(ANM_PULL_IRONBALL_SWITCH); + field_0x3198 = ANM_PULL_IRONBALL_SWITCH; + lever->onHang(); + } + } else if (checkAnmEnd(frameCtrl)) { + checkNextAction(0); + } else if (frameCtrl->getFrame() >= 33.0f) { + field_0x2f92 = 4; + } else if (frameCtrl->getFrame() >= 31.0f) { + field_0x2f93 = 10; + } + + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -461,6 +1104,7 @@ asm int daAlink_c::procHangLeverDown() { #include "asm/d/a/d_a_alink/procHangLeverDown__9daAlink_cFv.s" } #pragma pop +#endif /* 800FC568-800FC5A4 0F6EA8 003C+00 1/0 0/0 0/0 .text changeDragonActor__9daAlink_cFP10fopAc_ac_c */ @@ -471,14 +1115,43 @@ void daAlink_c::changeDragonActor(fopAc_ac_c* param_0) { } /* 800FC5A4-800FC6B4 0F6EE4 0110+00 1/1 0/0 0/0 .text setDragonHangPos__9daAlink_cFv */ +// matches with literals +#ifdef NONMATCHING +int daAlink_c::setDragonHangPos() { + fopAc_ac_c* dragon = field_0x280c.getActor(); + if (dragon == NULL) { + return 0; + } + + if (fopAcM_GetName(dragon) == PROC_B_DR) { + mDoMtx_stack_c::copy(((daB_DR_c*)dragon)->getMtx()); + } else { + mDoMtx_stack_c::copy(((daB_DRE_c*)dragon)->getMtx()); + } + + mDoMtx_stack_c::multVecZero(¤t.pos); + mDoMtx_MtxToRot(mDoMtx_stack_c::get(), &shape_angle); + + cXyz sp18; + mDoMtx_stack_c::multVecSR(&cXyz::BaseY, &sp18); + if (sp18.y < 0.0f) { + shape_angle.y += 0x8000; + shape_angle.x = 0x8000 - shape_angle.x; + shape_angle.z *= -1; + } + + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daAlink_c::setDragonHangPos() { +asm int daAlink_c::setDragonHangPos() { nofralloc #include "asm/d/a/d_a_alink/setDragonHangPos__9daAlink_cFv.s" } #pragma pop +#endif /* 800FC6B4-800FC748 0F6FF4 0094+00 1/1 0/0 0/0 .text setOctaIealHangPos__9daAlink_cFv */ int daAlink_c::setOctaIealHangPos() { @@ -495,11 +1168,11 @@ int daAlink_c::setOctaIealHangPos() { } /* 800FC748-800FC77C 0F7088 0034+00 2/2 0/0 0/0 .text setBossBodyHangPos__9daAlink_cFv */ -void daAlink_c::setBossBodyHangPos() { +int daAlink_c::setBossBodyHangPos() { if (field_0x32cc != 0) { - setDragonHangPos(); + return setDragonHangPos(); } else { - setOctaIealHangPos(); + return setOctaIealHangPos(); } } @@ -540,6 +1213,169 @@ int daAlink_c::procBossBodyHangInit(fopAc_ac_c* param_0) { } /* 800FC870-800FCF58 0F71B0 06E8+00 1/0 0/0 0/0 .text procBossBodyHang__9daAlink_cFv */ +// matches with literals +#ifdef NONMATCHING +int daAlink_c::procBossBodyHang() { + fopEn_enemy_c* boss = (fopEn_enemy_c*)field_0x280c.getActor(); + + if (field_0x32cc != 0) { + setJumpMode(); + } + + if (mProcVar3.field_0x300e.x != 0 || !setBossBodyHangPos()) { + if (field_0x32cc != 0) { + if (mProcVar3.field_0x300e.x < 0) { + return procBackJumpInit(0); + } else { + field_0x3102 = shape_angle.y; + return procCoLargeDamageInit(-6, 1, 0, 0, NULL, 0); + } + } else { + field_0x3408 = 0.0f; + field_0x340c = 0.0f; + field_0x2ffe = shape_angle.y; + field_0x318c = 0; + return procOctaIealSpitInit(); + } + } else { + if (boss->checkDownFlg() && mProcVar2.field_0x300c != 0) { + setDoStatusEmphasys(0x30); + } + + daPy_frameCtrl_c* frameCtrl = mUnderFrameCtrl; + + if (checkAnmEnd(frameCtrl)) { + if (field_0x3198 != 0x16D && field_0x3198 != 0x16E) { + mProcVar2.field_0x300c = 1; + } + + if (field_0x3198 == 0x169) { + if (field_0x32cc != 0) { + setSingleAnimeBase(ANM_DRAGON_HANG_WAIT); + } else { + setSingleAnimeBase(ANM_MORPHEEL_HANG_WAIT); + } + + field_0x3198 = 0x16A; + } + } + + if (mProcVar0.field_0x3008 != 0 && field_0x3198 != 0x16B) { + if (field_0x32cc != 0) { + setSingleAnimeBase(ANM_DRAGON_HANG_WAIT_B); + } else { + setSingleAnimeBase(ANM_MORPHEEL_HANG_WAIT_B); + } + + field_0x3198 = 0x16B; + mProcVar0.field_0x3008 = 1; + mProcVar2.field_0x300c = 0; + + if (mEquipItem == 0x103) { + mProcVar3.field_0x300e.y = 2; + } else { + mProcVar3.field_0x300e.y = 0xFE; + } + } + + if (mProcVar2.field_0x300c != 0 && + ((dComIfGp_getDoStatus() == 0x30 && doTrigger()) || swordSwingTrigger())) + { + if (mEquipItem != 0x103) { + setSwordModel(); + } + + if (dComIfGp_getDoStatus() == 0x30 && doTrigger()) { + if (field_0x32cc != 0) { + setSingleAnimeBaseMorf(ANM_DRAGON_CUT_FINAL, 3.0f); + } else { + setSingleAnimeBaseMorf(ANM_MORPHEEL_CUT_FINAL, 3.0f); + } + + field_0x3198 = 0x16E; + mProcVar3.field_0x300e.y = 0; + field_0x3478 = 10000.0f; + field_0x347c = 61.0f; + setCutType(CUT_TYPE_FINISH_STAB); + mProcVar1.field_0x300a = 3; + } else { + setCutType(CUT_TYPE_NM_STAB); + mProcVar3.field_0x300e.z++; + + if (mProcVar3.field_0x300e.z == 4) { + if (field_0x32cc != 0) { + setSingleAnimeBase(ANM_DRAGON_CUT_B); + } else { + setSingleAnimeBase(ANM_MORPHEEL_CUT_B); + } + + field_0x3198 = 0x16D; + field_0x3478 = 10000.0f; + field_0x347c = 12.0f; + mProcVar3.field_0x300e.y = 2; + mProcVar1.field_0x300a = 3; + } else { + if (field_0x32cc != 0) { + setSingleAnimeParam(ANM_DRAGON_CUT, &daAlinkHIO_cut_c0::m.mStabAnm); + } else { + setSingleAnimeParam(ANM_MORPHEEL_CUT, &daAlinkHIO_cut_c0::m.mStabAnm); + } + + field_0x3198 = 0x16C; + field_0x3478 = daAlinkHIO_cut_c0::m.mStabAnm.mCheckFrame; + field_0x347c = 10.0f; + mProcVar3.field_0x300e.y = 0; + mProcVar1.field_0x300a = 1; + } + } + + frameCtrl->setRate(1.0f); + mProcVar2.field_0x300c = 0; + } else if (field_0x3198 == 0x16C || field_0x3198 == 0x16D || field_0x3198 == 0x16E) { + if (checkAnmEnd(frameCtrl)) { + if (field_0x3198 != 0x16C) { + mProcVar0.field_0x3008 = 1; + } + } else if (frameCtrl->getFrame() > field_0x3478) { + mProcVar2.field_0x300c = 1; + } else if (frameCtrl->checkPass(field_0x347c)) { + cXyz sp30 = mSwordTopPos - field_0x3498; + csXyz sp38(cM_atan2s(sp30.y, sp30.absXZ()), cM_atan2s(-sp30.x, -sp30.z), 0); + + boss->onCutDownHitFlg(); + dComIfGp_setHitMark(mProcVar1.field_0x300a, NULL, &mLeftHandPos, &sp38, NULL, 0); + } else if (field_0x3198 == 0x16D) { + if (frameCtrl->getFrame() >= 59.0f) { + field_0x2f93 = 9; + } else if (frameCtrl->getFrame() >= 51.0f) { + field_0x2f93 = 10; + } else if (frameCtrl->getFrame() >= 3.0f) { + field_0x2f93 = 5; + } + } else if (field_0x3198 == 0x16E) { + if (frameCtrl->getFrame() >= 148.0f) { + field_0x2f93 = 9; + } else if (frameCtrl->getFrame() >= 136.0f) { + field_0x2f93 = 10; + } else if (frameCtrl->getFrame() >= 32.0f) { + field_0x2f93 = 5; + } + + if (frameCtrl->getFrame() >= 117.0f) { + mProcVar3.field_0x300e.y = 0; + } else if (frameCtrl->getFrame() >= 105.0f) { + mProcVar3.field_0x300e.y = 0xFE; + } else { + mProcVar3.field_0x300e.y = 0; + } + } + } + } + + onEndResetFlg1(ERFLG1_GANON_FINISH); + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -548,6 +1384,7 @@ asm int daAlink_c::procBossBodyHang() { #include "asm/d/a/d_a_alink/procBossBodyHang__9daAlink_cFv.s" } #pragma pop +#endif /* 800FCF58-800FCF84 0F7898 002C+00 2/2 0/0 0/0 .text getLadderUnitCount__9daAlink_cCFv */ @@ -556,7 +1393,7 @@ int daAlink_c::getLadderUnitCount() const { } /* 800FCF84-800FD048 0F78C4 00C4+00 1/1 0/0 0/0 .text setLadderInit__9daAlink_cFv */ -// loop issue +// matches with literals #ifdef NONMATCHING int daAlink_c::setLadderInit() { onNoResetFlg3(FLG3_UNK_400000); @@ -565,12 +1402,12 @@ int daAlink_c::setLadderInit() { setLadderPos(getLadderUnitCount() - 2); while (mWaterY - current.pos.y > daAlinkHIO_swim_c0::m.mInitHeight) { - current.pos.y += lit_24618; + current.pos.y += 37.5f; } procLadderMoveInit(1, 0, ¤t.pos); field_0x33b0 = l_ladderAnmBaseTransY; - field_0x2060->initOldFrameMorf(lit_7808, 0, 35); + field_0x2060->initOldFrameMorf(5.0f, 0, 35); return 1; } @@ -588,6 +1425,54 @@ asm int daAlink_c::setLadderInit() { #endif /* 800FD048-800FD1F0 0F7988 01A8+00 1/1 0/0 0/0 .text setLadderPosInit__9daAlink_cFv */ +// matches with literals +#ifdef NONMATCHING +void daAlink_c::setLadderPosInit() { + cXyz sp20; + cXyz sp2C; + cXyz sp38; + dComIfG_Bgsp().GetTriPnt(mLinkLinChk, &sp20, &sp2C, &sp38); + mPolyInfo1.SetPolyInfo(mLinkLinChk); + + if (fabsf(sp20.y - sp2C.y) < 1.0f) { + field_0x34ec.x = (sp20.x + sp2C.x) * 0.5f; + + if (sp38.y > sp20.y) { + field_0x34ec.y = sp20.y; + field_0x33c0 = sp38.y; + } else { + field_0x34ec.y = sp38.y; + field_0x33c0 = sp20.y; + } + + field_0x34ec.z = (sp20.z + sp2C.z) * 0.5f; + } else if (fabsf(sp20.y - sp38.y) < 1.0f) { + field_0x34ec.x = (sp20.x + sp38.x) * 0.5f; + + if (sp2C.y > sp20.y) { + field_0x34ec.y = sp20.y; + field_0x33c0 = sp2C.y; + } else { + field_0x34ec.y = sp2C.y; + field_0x33c0 = sp20.y; + } + + field_0x34ec.z = (sp20.z + sp38.z) * 0.5f; + } else { + field_0x34ec.x = (sp2C.x + sp38.x) * 0.5f; + + if (sp20.y > sp2C.y) { + field_0x34ec.y = sp2C.y; + field_0x33c0 = sp20.y; + } else { + field_0x34ec.y = sp20.y; + field_0x33c0 = sp2C.y; + } + + field_0x34ec.z = (sp2C.z + sp38.z) * 0.5f; + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -596,16 +1481,30 @@ asm void daAlink_c::setLadderPosInit() { #include "asm/d/a/d_a_alink/setLadderPosInit__9daAlink_cFv.s" } #pragma pop +#endif /* 800FD1F0-800FD288 0F7B30 0098+00 2/2 0/0 0/0 .text setLadderPos__9daAlink_cFi */ +// matches with literals +#ifdef NONMATCHING +void daAlink_c::setLadderPos(int param_0) { + f32 var_f31 = cM_ssin(field_0x306e); + f32 var_f30 = cM_scos(field_0x306e); + + shape_angle.y = field_0x306e + 0x8000; + current.angle.y = shape_angle.y; + current.pos.set(field_0x34ec.x + var_f31 * 38.0f, + (field_0x34ec.y + (f32)param_0 * 37.5f) - 5.5f, + field_0x34ec.z + var_f30 * 38.0f); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daAlink_c::setLadderPos(int param_0) { - nofralloc +asm void daAlink_c::setLadderPos(int param_0){nofralloc #include "asm/d/a/d_a_alink/setLadderPos__9daAlink_cFi.s" } #pragma pop +#endif /* 800FD288-800FD2AC 0F7BC8 0024+00 2/2 0/0 0/0 .text getLadderMoveAnmSpeed__9daAlink_cFv */ @@ -616,16 +1515,90 @@ f32 daAlink_c::getLadderMoveAnmSpeed() { /* 800FD2AC-800FD4A8 0F7BEC 01FC+00 3/3 0/0 0/0 .text changeLadderMoveProc__9daAlink_cFi */ +// matches with literals +#ifdef NONMATCHING +int daAlink_c::changeLadderMoveProc(int param_0) { + cLib_addCalc(¤t.pos.x, field_0x37c8.x, 0.5f, 0.5f, 0.05f); + cLib_addCalc(¤t.pos.y, field_0x37c8.y, 0.5f, 0.5f, 0.05f); + cLib_addCalc(¤t.pos.z, field_0x37c8.z, 0.5f, 0.5f, 0.05f); + + if (checkEquipAnime()) { + return 0; + } + + if (checkInputOnR()) { + int temp_r3 = abs((s16)(field_0x2fe2 - shape_angle.y)); + if (temp_r3 > 0x3000 && temp_r3 < 0x5000) { + return 0; + } + + cXyz sp2C; + cXyz sp38; + sp2C.x = current.pos.x; + sp2C.z = current.pos.z; + + BOOL var_r30; + if (temp_r3 < 0x4000) { + sp2C.y = current.pos.y + field_0x598 + 37.5f; + var_r30 = false; + } else { + sp2C.y = (current.pos.y - 37.5f) - 15.0f; + var_r30 = true; + } + + sp38.x = sp2C.x + cM_ssin(shape_angle.y) * 50.0f; + sp38.z = sp2C.z + cM_scos(shape_angle.y) * 50.0f; + sp38.y = sp2C.y; + + if (!commonLineCheck(&sp2C, &sp38)) { + if (temp_r3 < 0x4000) { + procLadderUpEndInit(param_0); + } else { + procLadderDownEndInit(param_0); + } + } else if (dComIfG_Bgsp().GetWallCode(mLinkLinChk) != 4) { + if (temp_r3 >= 0x4000) { + procLadderDownEndInit(param_0); + } + } else { + procLadderMoveInit(param_0, var_r30, &field_0x37c8); + } + } + + return 0; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daAlink_c::changeLadderMoveProc(int param_0) { +asm int daAlink_c::changeLadderMoveProc(int param_0) { nofralloc #include "asm/d/a/d_a_alink/changeLadderMoveProc__9daAlink_cFi.s" } #pragma pop +#endif /* 800FD4A8-800FD5E4 0F7DE8 013C+00 5/5 0/0 0/0 .text setMoveBGLadderCorrect__9daAlink_cFv */ +// matches with literals +#ifdef NONMATCHING +int daAlink_c::setMoveBGLadderCorrect() { + if (dComIfG_Bgsp().ChkPolySafe(mPolyInfo1) && dComIfG_Bgsp().ChkMoveBG(mPolyInfo1)) { + dComIfG_Bgsp().MoveBgTransPos(mPolyInfo1, true, ¤t.pos, ¤t.angle, &shape_angle); + dComIfG_Bgsp().MoveBgTransPos(mPolyInfo1, true, &field_0x37c8, NULL, NULL); + } + + cXyz sp28; + sp28.set(field_0x37c8.x + cM_ssin(current.angle.y) * 50.0f, field_0x37c8.y, + field_0x37c8.z + cM_scos(current.angle.y) * 50.0f); + + if (!commonLineCheck(&field_0x37c8, &sp28) || dComIfG_Bgsp().GetWallCode(mLinkLinChk) != 4) { + return procFallInit(1, daAlinkHIO_autoJump_c0::m.mFallInterpolation); + } + + mPolyInfo1.SetPolyInfo(mLinkLinChk); + return 0; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -634,6 +1607,7 @@ asm int daAlink_c::setMoveBGLadderCorrect() { #include "asm/d/a/d_a_alink/setMoveBGLadderCorrect__9daAlink_cFv.s" } #pragma pop +#endif /* 800FD5E4-800FD648 0F7F24 0064+00 8/8 0/0 0/0 .text checkLadderFall__9daAlink_cFv */ int daAlink_c::checkLadderFall() { @@ -649,6 +1623,44 @@ int daAlink_c::checkLadderFall() { /* 800FD648-800FD7B0 0F7F88 0168+00 2/2 0/0 0/0 .text procLadderUpStartInit__9daAlink_cFv */ +// matches with literals +#ifdef NONMATCHING +int daAlink_c::procLadderUpStartInit() { + if (mEquipItem != NO_ITEM) { + return procPreActionUnequipInit(PROC_LADDER_UP_START, NULL); + } + + commonProcInit(PROC_LADDER_UP_START); + setSpecialGravity(0.0f, maxFallSpeed, 0); + speed.y = 0.0f; + mNormalSpeed = 0.0f; + speedF = 0.0f; + + setSingleAnimeBaseSpeed(ANM_LADDER_UP_START, daAlinkHIO_ladder_c0::m.field_0x28, + daAlinkHIO_ladder_c0::m.field_0x2C); + field_0x2f99 = 0x10; + field_0x3588 = l_waitBaseAnime; + dComIfGp_setPlayerStatus0(0, 0x2000000); + + f32 var_f31 = cM_ssin(field_0x306e); + f32 var_f30 = cM_scos(field_0x306e); + + current.pos.x = field_0x34ec.x + var_f31 * 40.0f; + current.pos.y = field_0x34ec.y; + current.pos.z = field_0x34ec.z + var_f30 * 40.0f; + + shape_angle.y = field_0x306e + 0x8000; + current.angle.y = shape_angle.y; + + field_0x37c8.x = field_0x34ec.x + var_f31 * 38.0f; + field_0x37c8.y = field_0x34ec.y + 32.0f; + field_0x37c8.z = field_0x34ec.z + var_f30 * 38.0f; + + mProcVar2.field_0x300c = 1; + mProcVar3.field_0x300e.y = 1; + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -657,6 +1669,7 @@ asm int daAlink_c::procLadderUpStartInit() { #include "asm/d/a/d_a_alink/procLadderUpStartInit__9daAlink_cFv.s" } #pragma pop +#endif /* 800FD7B0-800FD824 0F80F0 0074+00 1/0 0/0 0/0 .text procLadderUpStart__9daAlink_cFv */ int daAlink_c::procLadderUpStart() { @@ -725,6 +1738,50 @@ int daAlink_c::procLadderUpEnd() { } /* 800FD9CC-800FDB74 0F830C 01A8+00 2/2 0/0 0/0 .text procLadderDownStartInit__9daAlink_cFv */ +// matches with literals +#ifdef NONMATCHING +int daAlink_c::procLadderDownStartInit() { + onNoResetFlg3(FLG3_UNK_400000); + + if (mEquipItem != NO_ITEM) { + return procPreActionUnequipInit(PROC_LADDER_DOWN_START, NULL); + } + + commonProcInit(PROC_LADDER_DOWN_START); + setSpecialGravity(0.0f, maxFallSpeed, 0); + speed.y = 0.0f; + mNormalSpeed = 0.0f; + speedF = 0.0f; + + shape_angle.y = field_0x306e + 0x8000; + current.angle.y = field_0x306e; + + setSingleAnimeBaseSpeed(ANM_LADDER_DOWN_START, daAlinkHIO_ladder_c0::m.field_0x38, + daAlinkHIO_ladder_c0::m.field_0x3C); + field_0x2f99 = 0x10; + field_0x3588 = l_waitBaseAnime; + dComIfGp_setPlayerStatus0(0, 0x2000000); + setOldRootQuaternion(0, 0x8000, 0); + + shape_angle.y += 0x8000; + current.angle.y = shape_angle.y; + + f32 var_f31 = cM_ssin(field_0x306e); + f32 var_f30 = cM_scos(field_0x306e); + + current.pos.x = field_0x34ec.x + var_f31 * 40.0f; + current.pos.y = field_0x34ec.y; + current.pos.z = field_0x34ec.z + var_f30 * 40.0f; + + field_0x37c8.x = field_0x34ec.x - var_f31 * 48.0f; + field_0x37c8.y = (field_0x34ec.y - 187.5f) + 32.0f; + field_0x37c8.z = field_0x34ec.z - var_f30 * 48.0f; + + mProcVar2.field_0x300c = 0; + mProcVar3.field_0x300e.y = 0; + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -733,6 +1790,7 @@ asm int daAlink_c::procLadderDownStartInit() { #include "asm/d/a/d_a_alink/procLadderDownStartInit__9daAlink_cFv.s" } #pragma pop +#endif /* 800FDB74-800FDC18 0F84B4 00A4+00 1/0 0/0 0/0 .text procLadderDownStart__9daAlink_cFv */ @@ -800,6 +1858,73 @@ int daAlink_c::procLadderDownEnd() { } /* 800FDD90-800FDF50 0F86D0 01C0+00 3/3 0/0 0/0 .text procLadderMoveInit__9daAlink_cFiiP4cXyz */ +// matches with literals +#ifdef NONMATCHING +int daAlink_c::procLadderMoveInit(int param_0, int param_1, cXyz* param_2) { + BOOL var_r28 = checkModeFlg(2) ? true : false; + f32 anm_speed = getLadderMoveAnmSpeed(); + + commonProcInit(PROC_LADDER_MOVE); + + if (!var_r28) { + if (!param_1) { + field_0x37c8.y = param_2->y + 37.5f; + } else { + anm_speed *= -1.0f; + field_0x37c8.y = param_2->y - 37.5f; + } + } else { + field_0x37c8.y = param_2->y; + } + + field_0x37c8.x = param_2->x; + field_0x37c8.z = param_2->z; + + daAlink_ANM anm; + if (param_0) { + if (var_r28) { + field_0x3198 = 1; + } else { + field_0x3198 = 0; + } + + if (anm_speed >= 0.0f) { + anm = ANM_LADDER_LEFT_TO_RIGHT; + } else { + anm = ANM_LADDER_RIGHT_TO_LEFT; + } + } else { + field_0x3198 = 1; + + if (anm_speed >= 0.0f) { + anm = ANM_LADDER_RIGHT_TO_LEFT; + } else { + anm = ANM_LADDER_LEFT_TO_RIGHT; + } + } + + setSingleAnimeBaseSpeed(anm, anm_speed, daAlinkHIO_ladder_c0::m.field_0x50); + field_0x2f98 = param_1; + + if (!param_1) { + field_0x30a0 = -0x800; + field_0x33f4 = -1.0f; + } else { + field_0x30a0 = 0x2800; + field_0x33f4 = 1.0f; + } + + field_0x2f99 = 14; + setSpecialGravity(0.0f, maxFallSpeed, 0); + speed.y = 0.0f; + mNormalSpeed = 0.0f; + speedF = 0.0f; + mProcVar2.field_0x300c = 1; + mProcVar3.field_0x300e.y = 1; + dComIfGp_setPlayerStatus0(0, 0x2000000); + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -808,6 +1933,7 @@ asm int daAlink_c::procLadderMoveInit(int param_0, int param_1, cXyz* param_2) { #include "asm/d/a/d_a_alink/procLadderMoveInit__9daAlink_cFiiP4cXyz.s" } #pragma pop +#endif /* 800FDF50-800FE010 0F8890 00C0+00 1/0 0/0 0/0 .text procLadderMove__9daAlink_cFv */ int daAlink_c::procLadderMove() { @@ -871,6 +1997,58 @@ void daAlink_c::setClimbInit() { /* 800FE174-800FE3C4 0F8AB4 0250+00 8/8 0/0 0/0 .text setClimbShapeOffset__9daAlink_cFv */ +// matches with literals +#ifdef NONMATCHING +void daAlink_c::setClimbShapeOffset() { + cXyz sp54; + cXyz sp60; + cXyz sp6C; + cXyz sp78; + + s16 temp_r30 = shape_angle.y; + f32 var_f29 = cM_ssin(temp_r30); + f32 var_f28 = cM_scos(temp_r30); + + sp6C.x = current.pos.x; + sp6C.z = current.pos.z; + + if (checkModeFlg(0x10000)) { + sp6C.y = current.pos.y + field_0x598 * 0.5f; + } else { + sp6C.y = current.pos.y - 10.0f; + } + + sp54.set(sp6C.x - var_f29 * 30.0f, sp6C.y, sp6C.z - var_f28 * 30.0f); + sp60.set(sp6C.x + var_f29 * 55.0f, sp6C.y, sp6C.z + var_f28 * 55.0f); + + f32 var_f31 = var_f28 * 20.0f; + f32 var_f30 = var_f29 * -20.0f; + sp54.x += var_f31; + sp54.z += var_f30; + sp60.x += var_f31; + sp60.z += var_f30; + + if (commonLineCheck(&sp54, &sp60) && (!checkModeFlg(0x10000) || checkClimbCode(mLinkLinChk))) { + sp78 = mLinkLinChk.i_GetCross(); + } else { + field_0x308c = 0; + return; + } + + sp54.x -= var_f31 * 2.0f; + sp54.z -= var_f30 * 2.0f; + sp60.x -= var_f31 * 2.0f; + sp60.z -= var_f30 * 2.0f; + + if (!commonLineCheck(&sp54, &sp60) || (checkModeFlg(0x10000) && !checkClimbCode(mLinkLinChk))) { + field_0x308c = 0; + } else { + sp78 -= mLinkLinChk.i_GetCross(); + cLib_addCalcAngleS(&field_0x308c, (s16)((sp78.atan2sX_Z() - 0x4000) - shape_angle.y), 5, + 2000, 400); + } +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -879,6 +2057,7 @@ asm void daAlink_c::setClimbShapeOffset() { #include "asm/d/a/d_a_alink/setClimbShapeOffset__9daAlink_cFv.s" } #pragma pop +#endif /* 800FE3C4-800FE438 0F8D04 0074+00 1/1 0/0 0/0 .text getClimbDirectionFromAngle__9daAlink_cFv */ int daAlink_c::getClimbDirectionFromAngle() { @@ -900,45 +2079,201 @@ int daAlink_c::getClimbDirectionFromAngle() { /* 800FE438-800FE5A0 0F8D78 0168+00 3/3 0/0 0/0 .text changeClimbMoveProc__9daAlink_cFi */ +// matches with literals +#ifdef NONMATCHING +void daAlink_c::changeClimbMoveProc(int param_0) { + s16 temp_r29 = field_0x308c; + + if (checkInputOnR()) { + field_0x2f98 = getClimbDirectionFromAngle(); + if (field_0x2f98 == DIR_FORWARD || field_0x2f98 == DIR_BACKWARD) { + cXyz sp44(current.pos.x - cM_ssin(shape_angle.y) * 15.0f, current.pos.y + field_0x598, + current.pos.z - cM_scos(shape_angle.y) * 15.0f); + mLinkRoofChk.i_SetPos(sp44); + + f32 roof_y = dComIfG_Bgsp().RoofChk(&mLinkRoofChk); + if (field_0x2f98 == DIR_FORWARD && roof_y < sp44.y + 110.0f && + dComIfG_Bgsp().GetMonkeyBarsCode(mLinkRoofChk)) + { + procClimbToRoofInit(); + } else if (checkClimbMoveUpDownProc(field_0x2f98)) { + procClimbMoveUpDownInit(param_0); + } + } else if (checkClimbMoveSideProc(field_0x2f98)) { + procClimbMoveSideInit(); + } + } else { + procClimbWaitInit(1, 0); + } + + field_0x308c = temp_r29; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daAlink_c::changeClimbMoveProc(int param_0) { - nofralloc +asm void daAlink_c::changeClimbMoveProc(int param_0){nofralloc #include "asm/d/a/d_a_alink/changeClimbMoveProc__9daAlink_cFi.s" } #pragma pop +#endif /* 800FE5A0-800FE6E8 0F8EE0 0148+00 2/2 0/0 0/0 .text checkClimbMoveUpDownProc__9daAlink_cFi */ +// matches with literals +#ifdef NONMATCHING +BOOL daAlink_c::checkClimbMoveUpDownProc(int i_direction) { + f32 var_f31 = cM_ssin(shape_angle.y); + f32 var_f30 = cM_scos(shape_angle.y); + + if (i_direction == DIR_BACKWARD) { + return true; + } + + cXyz sp38(current.pos.x - var_f31 * 30.0f, current.pos.y + field_0x598 + 30.0f + 5.0f, + current.pos.z - var_f30 * 30.0f); + cXyz sp44(sp38.x + var_f31 * 80.0f, sp38.y, sp38.z + var_f30 * 80.0f); + + BOOL var_r30 = commonLineCheck(&sp38, &sp44); + if (var_r30 && !dBgS_CheckBWallPoly(mLinkLinChk)) { + var_r30 = false; + } + + if (!var_r30 || !checkClimbCode(mLinkLinChk)) { + if (checkClimbRoof(sp38.y) || (!var_r30 && checkClimbGround(&sp44, sp38.y))) { + return true; + } + + return false; + } + + return true; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daAlink_c::checkClimbMoveUpDownProc(int param_0) { - nofralloc +asm BOOL daAlink_c::checkClimbMoveUpDownProc(int param_0){nofralloc #include "asm/d/a/d_a_alink/checkClimbMoveUpDownProc__9daAlink_cFi.s" } #pragma pop +#endif /* 800FE6E8-800FE868 0F9028 0180+00 2/2 0/0 0/0 .text checkClimbMoveSideProc__9daAlink_cFi */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daAlink_c::checkClimbMoveSideProc(int param_0) { - nofralloc -#include "asm/d/a/d_a_alink/checkClimbMoveSideProc__9daAlink_cFi.s" -} -#pragma pop +// matches with literals +#ifdef NONMATCHING +BOOL daAlink_c::checkClimbMoveSideProc(int i_direction) { + f32 var_f31 = cM_ssin(shape_angle.y); + f32 var_f30 = cM_scos(shape_angle.y); + + cXyz sp40(current.pos.x - var_f31 * 30.0f, current.pos.y + field_0x598 * 0.5f, + current.pos.z - var_f30 * 30.0f); + + if (i_direction == DIR_LEFT) { + sp40.x += var_f30 * 40.0f; + sp40.z -= var_f31 * 40.0f; + } else { + sp40.x -= var_f30 * 40.0f; + sp40.z += var_f31 * 40.0f; + } + + cXyz sp4C(sp40.x + var_f31 * 230.0f, sp40.y, sp40.z + var_f30 * 230.0f); + + if (!commonLineCheck(&sp40, &sp4C) || !checkClimbCode(mLinkLinChk)) { + return false; + } + + cXyz sp58(current.pos); + if (checkBgClimbMove(i_direction)) { + current.pos = sp58; + return false; + } + + return true; +} +#else +#pragma push +#pragma optimization_level 0 +#pragma optimizewithasm off +asm BOOL daAlink_c::checkClimbMoveSideProc(int param_0) { + nofralloc +#include "asm/d/a/d_a_alink/checkClimbMoveSideProc__9daAlink_cFi.s" +} +#pragma pop +#endif /* 800FE868-800FEB90 0F91A8 0328+00 6/6 0/0 0/0 .text setMoveBGClimbCorrect__9daAlink_cFv */ +// matches with literals +#ifdef NONMATCHING +int daAlink_c::setMoveBGClimbCorrect() { + if (dComIfG_Bgsp().ChkPolySafe(mPolyInfo1) && dComIfG_Bgsp().ChkMoveBG(mPolyInfo1)) { + dComIfG_Bgsp().MoveBgTransPos(mPolyInfo1, true, ¤t.pos, ¤t.angle, &shape_angle); + } + + if (mProcID == PROC_CLIMB_DOWN_START && !checkAnmEnd(mUnderFrameCtrl)) { + return 0; + } + + if (mLinkAcch.i_ChkGroundHit()) { + return procFallInit(1, daAlinkHIO_autoJump_c0::m.mFallInterpolation); + } + + f32 var_f31 = cM_ssin(shape_angle.y); + f32 var_f30 = cM_scos(shape_angle.y); + + cXyz sp50(current.pos.x - var_f31 * 30.0f, current.pos.y + field_0x598 * 0.5f, + current.pos.z - var_f30 * 30.0f); + cXyz sp5C(current.pos.x + var_f31 * 200.0f, sp50.y, current.pos.z + var_f30 * 200.0f); + cXyz sp68(current.pos.x - var_f31 * 30.0f, current.pos.y, current.pos.z - var_f30 * 30.0f); + + mLinkGndChk.SetPos(&sp68); + + if (mProcID == PROC_CLIMB_MOVE_UPDOWN) { + sp5C.y = sp50.y = current.pos.y + field_0x598 * 0.9f; + + if (!commonLineCheck(&sp50, &sp5C) || !checkClimbCode(mLinkLinChk)) { + return procClimbWaitInit(1, 0); + } + + sp5C.y = sp50.y = current.pos.y + field_0x598 * 0.5f; + } + + if (!commonLineCheck(&sp50, &sp5C) || !checkClimbCode(mLinkLinChk) || + ((mProcID == PROC_CLIMB_MOVE_UPDOWN || mProcID == PROC_CLIMB_MOVE_SIDE) && + current.pos.y - 15.0f < dComIfG_Bgsp().GroundCross(&mLinkGndChk))) + { + return procFallInit(1, daAlinkHIO_autoJump_c0::m.mFallInterpolation); + } + + cM3dGPla sp44; + dComIfG_Bgsp().GetTriPla(mLinkLinChk, &sp44); + + s16 temp_r29 = sp44.mNormal.atan2sX_Z(); + if (cLib_distanceAngleS(temp_r29, shape_angle.y) <= 0x549F) { + return procFallInit(1, daAlinkHIO_autoJump_c0::m.mFallInterpolation); + } + + s16 temp_r28 = shape_angle.y; + shape_angle.y = temp_r29 + 0x8000; + + current.pos.x = mLinkLinChk.i_GetCross().x; + current.pos.z = mLinkLinChk.i_GetCross().z; + current.angle.y += (s16)(shape_angle.y - temp_r28); + field_0x308c += (s16)(temp_r28 - shape_angle.y); + + mPolyInfo1.SetPolyInfo(mLinkLinChk); + return 0; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daAlink_c::setMoveBGClimbCorrect() { +asm int daAlink_c::setMoveBGClimbCorrect() { nofralloc #include "asm/d/a/d_a_alink/setMoveBGClimbCorrect__9daAlink_cFv.s" } #pragma pop +#endif /* 800FEB90-800FEC70 0F94D0 00E0+00 1/1 0/0 0/0 .text * checkBgCorrectClimbMove__9daAlink_cFP4cXyzP4cXyz */ @@ -963,22 +2298,38 @@ int daAlink_c::checkBgCorrectClimbMove(cXyz* i_startPos, cXyz* i_endPos) { #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm int daAlink_c::checkBgCorrectClimbMove(cXyz* param_0, cXyz* param_1) { - nofralloc +asm int daAlink_c::checkBgCorrectClimbMove(cXyz* param_0, cXyz* param_1){nofralloc #include "asm/d/a/d_a_alink/checkBgCorrectClimbMove__9daAlink_cFP4cXyzP4cXyz.s" } #pragma pop #endif /* 800FEC70-800FED50 0F95B0 00E0+00 2/2 0/0 0/0 .text checkClimbRoof__9daAlink_cFf */ +// matches with literals +#ifdef NONMATCHING +BOOL daAlink_c::checkClimbRoof(f32 param_0) { + cXyz sp44(current.pos.x - cM_ssin(shape_angle.y) * 30.0f, param_0 - 30.0f, + current.pos.z - cM_scos(shape_angle.y) * 30.0f); + mLinkRoofChk.i_SetPos(sp44); + + if (dComIfG_Bgsp().RoofChk(&mLinkRoofChk) < param_0 + 30.0f && + dComIfG_Bgsp().GetMonkeyBarsCode(mLinkRoofChk)) + { + return true; + } + + return false; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daAlink_c::checkClimbRoof(f32 param_0) { +asm BOOL daAlink_c::checkClimbRoof(f32 param_0) { nofralloc #include "asm/d/a/d_a_alink/checkClimbRoof__9daAlink_cFf.s" } #pragma pop +#endif /* 800FED50-800FEEC0 0F9690 0170+00 2/2 0/0 0/0 .text checkClimbGround__9daAlink_cFP4cXyzf */ // matches with literals @@ -987,13 +2338,16 @@ int daAlink_c::checkClimbGround(cXyz* param_0, f32 param_1) { f32 var_f30 = cM_ssin(shape_angle.y); f32 var_f29 = cM_scos(shape_angle.y); - param_0->set(current.pos.x + (var_f30 * 4.5f), param_1 + 50.0f, current.pos.z + (var_f29 * 4.5f)); + param_0->set(current.pos.x + (var_f30 * 4.5f), param_1 + 50.0f, + current.pos.z + (var_f29 * 4.5f)); for (int i = 0; i < 3; i++) { mLinkGndChk.SetPos(param_0); f32 cross = dComIfG_Bgsp().GroundCross(&mLinkGndChk); - if (cross != -1000000000.0f && dBgS_CheckBGroundPoly(mLinkGndChk) && cross >= param_1 - 50.0f) { + if (cross != -1000000000.0f && dBgS_CheckBGroundPoly(mLinkGndChk) && + cross >= param_1 - 50.0f) + { param_0->y = cross; return 1; } @@ -1008,35 +2362,222 @@ int daAlink_c::checkClimbGround(cXyz* param_0, f32 param_1) { #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm int daAlink_c::checkClimbGround(cXyz* param_0, f32 param_1) { - nofralloc +asm int daAlink_c::checkClimbGround(cXyz* param_0, f32 param_1){nofralloc #include "asm/d/a/d_a_alink/checkClimbGround__9daAlink_cFP4cXyzf.s" } #pragma pop #endif /* 800FEEC0-800FF28C 0F9800 03CC+00 5/5 0/0 0/0 .text checkBgClimbMove__9daAlink_cFi */ +// matches with literals +#ifdef NONMATCHING +BOOL daAlink_c::checkBgClimbMove(int i_direction) { + f32 var_r28 = cM_ssin(shape_angle.y); + f32 var_r27 = cM_scos(shape_angle.y); + f32 var_f31 = var_r27 * 30.0f; + f32 var_f30 = var_r28 * -30.0f; + f32 var_f26 = var_r28 * -30.0f; + f32 var_f25 = var_r27 * -30.0f; + + cXyz sp8C; + cXyz sp98; + sp98.set(current.pos.x + var_f30, current.pos.y, current.pos.z - var_f31); + + if (i_direction != DIR_RIGHT) { + sp8C.set(sp98.x + var_f31, sp98.y, sp98.z + var_f30); + if (checkBgCorrectClimbMove(&sp98, &sp8C) && i_direction == DIR_LEFT) { + return true; + } + } + + if (i_direction != DIR_LEFT) { + sp8C.set(sp98.x - var_f31, sp98.y, sp98.z - var_f30); + if (checkBgCorrectClimbMove(&sp98, &sp8C) && i_direction == DIR_RIGHT) { + return true; + } + } + + sp98.y += field_0x598; + + if (i_direction != DIR_RIGHT) { + sp8C.set(sp98.x + var_f31, sp98.y, sp98.z + var_f30); + if (checkBgCorrectClimbMove(&sp98, &sp8C) && i_direction == DIR_LEFT) { + return true; + } + } + + if (i_direction != DIR_LEFT) { + sp8C.set(sp98.x - var_f31, sp98.y, sp98.z - var_f30); + if (checkBgCorrectClimbMove(&sp98, &sp8C) && i_direction == DIR_RIGHT) { + return true; + } + } + + if (i_direction != DIR_NONE) { + return false; + } + + sp8C.set(var_f26 + (current.pos.x + var_f31), current.pos.y, + var_f25 + (current.pos.z + var_f30)); + mLinkRoofChk.i_SetPos(sp8C); + + f32 var_f29 = dComIfG_Bgsp().RoofChk(&mLinkRoofChk) - field_0x598; + if (var_f29 < current.pos.y) { + current.pos.y = var_f29; + } + + sp8C.set(var_f26 + (current.pos.x - var_f31), current.pos.y, + var_f25 + (current.pos.z - var_f30)); + mLinkRoofChk.i_SetPos(sp8C); + + var_f29 = dComIfG_Bgsp().RoofChk(&mLinkRoofChk) - field_0x598; + if (var_f29 < current.pos.y) { + current.pos.y = var_f29; + } + + sp8C.set(sp98.x + var_r28 * 100.0f, sp98.y, sp98.z + var_r27 * 100.0f); + + if (!commonLineCheck(&sp98, &sp8C)) { + if (checkClimbRoof(sp98.y)) { + return procClimbToRoofInit(); + } + + if (checkClimbGround(&sp8C, sp98.y)) { + current.pos = sp8C; + onResetFlg0(RFLG0_UNK_40000); + return procHangClimbInit(daAlinkHIO_wallCatch_c0::m.mClimbAnm.mStartFrame); + } else { + current.pos.y -= 30.0f; + return procClimbWaitInit(1, 1); + } + } + + return false; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daAlink_c::checkBgClimbMove(int param_0) { +asm BOOL daAlink_c::checkBgClimbMove(int param_0) { nofralloc #include "asm/d/a/d_a_alink/checkBgClimbMove__9daAlink_cFi.s" } #pragma pop +#endif /* 800FF28C-800FF450 0F9BCC 01C4+00 2/2 0/0 0/0 .text setClimbStartNotGround__9daAlink_cFv */ +// matches with literals +#ifdef NONMATCHING +int daAlink_c::setClimbStartNotGround() { + if (mProcID == PROC_HOOKSHOT_FLY) { + current.pos.y = mHookshotTopPos.y; + mLinkGndChk.SetPos(¤t.pos); + + f32 gnd_y = dComIfG_Bgsp().GroundCross(&mLinkGndChk); + if (gnd_y < current.pos.y - field_0x598) { + current.pos.y -= field_0x598; + } else { + current.pos.y = gnd_y + 5.0f; + return 0; + } + + f32 var_f29 = cM_ssin(field_0x306e); + f32 var_f28 = cM_scos(field_0x306e); + f32 temp_f1 = (field_0x598 + 5.0f) - 60.0f; + cXyz sp6C(mHookshotTopPos.x + var_f29 * 30.0f, current.pos.y + 60.0f, + mHookshotTopPos.z + var_f28 * 30.0f); + cXyz sp78(mHookshotTopPos.x - var_f29 * 200.0f, sp6C.y, + mHookshotTopPos.z - var_f28 * 200.0f); + + f32 var_f31 = 0.0f; + while (var_f31 < temp_f1) { + if (commonLineCheck(&sp6C, &sp78) && checkClimbCode(mLinkLinChk)) { + break; + } + + var_f31 += 15.0f; + sp78.y = sp6C.y += 15.0f; + } + + current.pos.y += var_f31; + } + + deleteEquipItem(TRUE, FALSE); + field_0x2f98 = 0; + procClimbUpStartInit(0); + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daAlink_c::setClimbStartNotGround() { +asm int daAlink_c::setClimbStartNotGround() { nofralloc #include "asm/d/a/d_a_alink/setClimbStartNotGround__9daAlink_cFv.s" } #pragma pop +#endif /* 800FF450-800FF704 0F9D90 02B4+00 2/2 0/0 0/0 .text procClimbUpStartInit__9daAlink_cFi */ +// matches with literals +#ifdef NONMATCHING +int daAlink_c::procClimbUpStartInit(int param_0) { + setFrontWallType(); + if (field_0x2f91 != 3) { + return 0; + } + + u32 var_r29 = checkModeFlg(0x40000); + + commonProcInit(PROC_CLIMB_UP_START); + setSpecialGravity(0.0f, maxFallSpeed, 0); + speed.y = 0.0f; + mNormalSpeed = 0.0f; + + if (param_0 || var_r29 || cM_rnd() < 0.3f) { + setSingleAnimeParam(ANM_CLIMB_HANG, &daAlinkHIO_ladder_c0::m.field_0x0); + field_0x3478 = daAlinkHIO_ladder_c0::m.field_0x0.mCheckFrame; + voiceStart(Z2SE_AL_V_JUMP_HANG); + } else { + setSingleAnimeParam(ANM_CLIMB_HANG_MISS, &daAlinkHIO_ladder_c0::m.field_0x14); + field_0x3478 = daAlinkHIO_ladder_c0::m.field_0x14.mCheckFrame; + voiceStart(Z2SE_AL_V_FOOT_MISS); + } + + field_0x3198 = 1; + dComIfGp_setPlayerStatus0(0, 8); + + if (param_0) { + current.pos.y = field_0x34ec.y + daAlinkHIO_ladder_c0::m.field_0x6C; + } + + field_0x2f99 = 2; + mProcVar3.field_0x300e.z = 1; + + field_0x37c8.set(l_waitBaseAnime.x, l_ladderAnmBaseTransY, l_waitBaseAnime.z); + J3DTransformInfo* trans_info = field_0x2060->getOldFrameTransInfo(0); + trans_info->mTranslate.z -= ((field_0x34ec.z - field_0x3798.z) * cM_scos(shape_angle.y)) + + ((field_0x34ec.x - field_0x3798.x) * cM_ssin(shape_angle.y)); + + field_0x3588.set(trans_info->mTranslate.x, + trans_info->mTranslate.y - (current.pos.y - field_0x3798.y), + l_waitBaseAnime.z); + field_0x3588 = (field_0x3588 * field_0x2060->getOldFrameRate()) + + (field_0x37c8 * (1.0f - field_0x2060->getOldFrameRate())); + field_0x33b0 = field_0x3588.y; + + current.pos.x = field_0x34ec.x; + current.pos.z = field_0x34ec.z; + + shape_angle.y = field_0x306e + 0x8000; + current.angle.y = shape_angle.y; + mProcVar2.field_0x300c = 1; + mProcVar3.field_0x300e.y = 0; + setClimbShapeOffset(); + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -1045,8 +2586,35 @@ asm int daAlink_c::procClimbUpStartInit(int param_0) { #include "asm/d/a/d_a_alink/procClimbUpStartInit__9daAlink_cFi.s" } #pragma pop +#endif /* 800FF704-800FF818 0FA044 0114+00 1/0 0/0 0/0 .text procClimbUpStart__9daAlink_cFv */ +// matches with literals +#ifdef NONMATCHING +int daAlink_c::procClimbUpStart() { + if (setMoveBGClimbCorrect()) { + return 1; + } + + daPy_frameCtrl_c* frameCtrl = mUnderFrameCtrl; + + field_0x2f99 = 2; + mProcVar3.field_0x300e.z = 0; + + field_0x3588 = (field_0x3588 * field_0x2060->getOldFrameRate()) + + (field_0x37c8 * (1.0f - field_0x2060->getOldFrameRate())); + field_0x33b0 = field_0x3588.y; + + setClimbShapeOffset(); + if (!checkLadderFall() && + (checkAnmEnd(frameCtrl) || (checkInputOnR() && frameCtrl->getFrame() > field_0x3478))) + { + procClimbWaitInit(0, 0); + } + + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -1055,8 +2623,46 @@ asm int daAlink_c::procClimbUpStart() { #include "asm/d/a/d_a_alink/procClimbUpStart__9daAlink_cFv.s" } #pragma pop +#endif /* 800FF818-800FF9A8 0FA158 0190+00 1/1 0/0 0/0 .text procClimbDownStartInit__9daAlink_cFs */ +// matches with literals +#ifdef NONMATCHING +int daAlink_c::procClimbDownStartInit(s16 param_0) { + onNoResetFlg3(FLG3_UNK_400000); + commonProcInit(PROC_CLIMB_DOWN_START); + setSpecialGravity(0.0f, maxFallSpeed, 0); + speed.y = 0.0f; + mNormalSpeed = 0.0f; + speedF = 0.0f; + + deleteEquipItem(TRUE, FALSE); + + if (cM_rnd() < 0.7f) { + setSingleAnimeParam(ANM_CLIMB_HANG, &daAlinkHIO_ladder_c0::m.field_0x0); + field_0x3478 = daAlinkHIO_ladder_c0::m.field_0x0.mCheckFrame; + mProcVar0.field_0x3008 = 0; + } else { + setSingleAnimeParam(ANM_CLIMB_HANG_MISS, &daAlinkHIO_ladder_c0::m.field_0x14); + field_0x3478 = daAlinkHIO_ladder_c0::m.field_0x14.mCheckFrame; + mProcVar0.field_0x3008 = 1; + voiceStart(Z2SE_AL_V_FOOT_MISS); + } + + dComIfGp_setPlayerStatus0(0, 8); + setOldRootQuaternion(0, 0x8000, 0); + shape_angle.y = param_0 + 0x8000; + current.angle.y = shape_angle.y; + current.pos.y -= 190.0f; + + field_0x3588 = l_waitBaseAnime; + field_0x33b0 = l_ladderAnmBaseTransY; + mProcVar2.field_0x300c = 1; + mProcVar3.field_0x300e.y = 0; + mProcVar3.field_0x300e.x = 0; + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -1065,8 +2671,42 @@ asm int daAlink_c::procClimbDownStartInit(s16 param_0) { #include "asm/d/a/d_a_alink/procClimbDownStartInit__9daAlink_cFs.s" } #pragma pop +#endif /* 800FF9A8-800FFAB0 0FA2E8 0108+00 1/0 0/0 0/0 .text procClimbDownStart__9daAlink_cFv */ +// matches with literals +#ifdef NONMATCHING +int daAlink_c::procClimbDownStart() { + if (setMoveBGClimbCorrect()) { + return 1; + } + + daPy_frameCtrl_c* frameCtrl = mUnderFrameCtrl; + + if (mProcVar3.field_0x300e.x != 0) { + field_0x2f99 = 2; + } else { + field_0x2f99 = 0x50; + mProcVar3.field_0x300e.x = 1; + } + + if (field_0x33a8 < 0.2f) { + mProcVar0.field_0x3008 = 0; + } + + if (!checkClimbFall()) { + if (mProcVar0.field_0x3008 == 0 && + (checkAnmEnd(frameCtrl) || (checkInputOnR() && frameCtrl->getFrame() > field_0x3478))) + { + procClimbWaitInit(0, 0); + } else if (!checkBgClimbMove(4)) { + setClimbShapeOffset(); + } + } + + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -1075,8 +2715,68 @@ asm int daAlink_c::procClimbDownStart() { #include "asm/d/a/d_a_alink/procClimbDownStart__9daAlink_cFv.s" } #pragma pop +#endif /* 800FFAB0-800FFC58 0FA3F0 01A8+00 1/1 0/0 0/0 .text procClimbMoveUpDownInit__9daAlink_cFi */ +// matches with literals +#ifdef NONMATCHING +int daAlink_c::procClimbMoveUpDownInit(int param_0) { + commonProcInit(PROC_CLIMB_MOVE_UPDOWN); + current.angle.y = shape_angle.y; + + daAlink_ANM anm; + if (param_0) { + field_0x3198 = 0; + + if (field_0x2f98 == 0) { + anm = ANM_CLIMB_LEFT; + } else { + anm = ANM_CLIMB_RIGHT; + } + } else { + field_0x3198 = 1; + + if (field_0x2f98 == 0) { + anm = ANM_CLIMB_RIGHT; + } else { + anm = ANM_CLIMB_LEFT; + } + } + + if (!checkUnderMove0BckNoArc(ANM_CLIMB_LEFT) && !checkUnderMove0BckNoArc(ANM_CLIMB_RIGHT)) { + setSingleAnimeBaseSpeed(ANM_CLIMB_START, getClimbMoveUpDownAnmSpeed(), -1.0f); + field_0x32cc = anm; + } else { + f32 anm_speed = getClimbMoveUpDownAnmSpeed(); + if (field_0x2f98 == 1) { + anm_speed *= -1.0f; + } + + setSingleAnimeBaseSpeed(anm, anm_speed, 3.0f); + field_0x32cc = 0; + } + + if (field_0x2f98 == 0) { + field_0x30a0 = -0x1800; + field_0x33f4 = -1.0f; + } else { + field_0x30a0 = 0x2800; + field_0x33f4 = 1.0f; + } + + field_0x2f99 = 10; + setSpecialGravity(0.0f, maxFallSpeed, 0); + speed.y = 0.0f; + mNormalSpeed = 0.0f; + speedF = 0.0f; + mProcVar2.field_0x300c = 1; + mProcVar3.field_0x300e.y = 1; + + voiceStart(Z2SE_AL_V_CLIMB_WALL); + dComIfGp_setPlayerStatus0(0, 8); + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -1085,9 +2785,53 @@ asm int daAlink_c::procClimbMoveUpDownInit(int param_0) { #include "asm/d/a/d_a_alink/procClimbMoveUpDownInit__9daAlink_cFi.s" } #pragma pop +#endif /* 800FFC58-800FFDB0 0FA598 0158+00 1/0 0/0 0/0 .text procClimbMoveUpDown__9daAlink_cFv */ +// matches with literals +#ifdef NONMATCHING +int daAlink_c::procClimbMoveUpDown() { + if (setMoveBGClimbCorrect()) { + return 1; + } + + field_0x2f99 = 2; + + daPy_frameCtrl_c* frameCtrl = mUnderFrameCtrl; + + if (!checkClimbFall()) { + if (checkAnmEnd(frameCtrl)) { + if (field_0x32cc != 0) { + f32 anm_speed = getClimbMoveUpDownAnmSpeed(); + if (field_0x2f98 == 1) { + anm_speed *= -1.0f; + } + + setSingleAnimeBaseSpeed((daAlink_ANM)field_0x32cc, anm_speed, -1.0f); + field_0x2f99 = 10; + field_0x32cc = 0; + } else { + changeClimbMoveProc(field_0x3198); + } + } else if (!checkClimbMoveUpDownProc(field_0x2f98)) { + procClimbWaitInit(1, 1); + } else if (fabsf(frameCtrl->getRate()) > 0.1f) { + f32 anm_speed = getClimbMoveUpDownAnmSpeed(); + if (frameCtrl->getRate() < 0.0f) { + anm_speed *= -1.0f; + } + + setWaterInAnmRate(frameCtrl, anm_speed); + if (!checkBgClimbMove(4)) { + setClimbShapeOffset(); + } + } + } + + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -1096,9 +2840,54 @@ asm int daAlink_c::procClimbMoveUpDown() { #include "asm/d/a/d_a_alink/procClimbMoveUpDown__9daAlink_cFv.s" } #pragma pop +#endif /* 800FFDB0-800FFF4C 0FA6F0 019C+00 1/1 0/0 0/0 .text procClimbMoveSideInit__9daAlink_cFv */ +// matches with literals +#ifdef NONMATCHING +int daAlink_c::procClimbMoveSideInit() { + f32 anm_speed = getClimbMoveSideAnmSpeed(); + commonProcInit(PROC_CLIMB_MOVE_SIDE); + + if (field_0x2f98 == 3) { + field_0x33f0 = -1.0f; + field_0x30a2 = -0x1800; + } else { + field_0x33f0 = 1.0f; + field_0x30a2 = 0x1800; + } + + field_0x2f99 = 11; + + daAlink_ANM anm; + if (field_0x2f98 == 2) { + anm = ANM_CLIMB_SLIDE_LEFT; + } else { + anm = ANM_CLIMB_SLIDE_RIGHT; + } + + if (!checkUnderMove0BckNoArc(ANM_CLIMB_RIGHT) && !checkUnderMove0BckNoArc(ANM_CLIMB_LEFT)) { + setSingleAnimeBaseSpeed(anm, anm_speed, 3.0f); + field_0x3198 = 0; + } else { + field_0x3198 = anm; + setSingleAnimeBaseSpeed(ANM_CLIMB_START, -anm_speed, 3.0f); + } + + setSpecialGravity(0.0f, maxFallSpeed, 0); + speed.y = 0.0f; + mNormalSpeed = 0.0f; + mProcVar2.field_0x300c = 1; + mProcVar3.field_0x300e.y = 1; + field_0x3478 = M_PI / (f32)mUnderFrameCtrl[0].getEnd(); + field_0x347c = current.pos.y + 150.0f; + + dComIfGp_setPlayerStatus0(0, 8); + voiceStart(Z2SE_AL_V_CLIMB_WALL); + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -1107,8 +2896,56 @@ asm int daAlink_c::procClimbMoveSideInit() { #include "asm/d/a/d_a_alink/procClimbMoveSideInit__9daAlink_cFv.s" } #pragma pop +#endif /* 800FFF4C-801000F8 0FA88C 01AC+00 1/0 0/0 0/0 .text procClimbMoveSide__9daAlink_cFv */ +// matches with literals +#ifdef NONMATCHING +int daAlink_c::procClimbMoveSide() { + f32 var_f30 = current.pos.y; + + if (setMoveBGClimbCorrect()) { + return 1; + } + + if (field_0x3198 == 0) { + field_0x347c += var_f30 - current.pos.y; + } else { + field_0x347c = current.pos.y + 150.0f; + } + + field_0x2f99 = 3; + + daPy_frameCtrl_c* frameCtrl = mUnderFrameCtrl; + + if (!checkClimbFall()) { + if (checkAnmEnd(frameCtrl)) { + if (field_0x3198 == 0) { + changeClimbMoveProc(field_0x3198); + } else { + setSingleAnimeBaseSpeed((daAlink_ANM)field_0x3198, getClimbMoveSideAnmSpeed(), + 3.0f); + field_0x3198 = 0; + } + } else if (!checkClimbMoveSideProc(field_0x2f98)) { + current.pos.y = field_0x347c - 150.0f; + procClimbWaitInit(1, 0); + } else if (fabsf(frameCtrl->getFrame()) > 0.1f) { + f32 anm_speed = getClimbMoveSideAnmSpeed(); + if (frameCtrl->getRate() < 0.0f) { + anm_speed *= -1.0f; + } + + setWaterInAnmRate(frameCtrl, anm_speed); + if (!checkBgClimbMove(4) && (field_0x3198 == 0 || frameCtrl->getFrame() < 12.0f)) { + setClimbShapeOffset(); + } + } + } + + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -1117,8 +2954,52 @@ asm int daAlink_c::procClimbMoveSide() { #include "asm/d/a/d_a_alink/procClimbMoveSide__9daAlink_cFv.s" } #pragma pop +#endif /* 801000F8-80100258 0FAA38 0160+00 7/7 0/0 0/0 .text procClimbWaitInit__9daAlink_cFii */ +// matches with literals +#ifdef NONMATCHING +int daAlink_c::procClimbWaitInit(int param_0, int param_1) { + if (!commonProcInitNotSameProc(PROC_CLIMB_WAIT)) { + return 0; + } + + if (param_1 || checkUnderMove0BckNoArc(ANM_CLIMB_SLIDE_LEFT) || + checkUnderMove0BckNoArc(ANM_CLIMB_SLIDE_RIGHT)) + { + setSingleAnimeBaseSpeed(ANM_CLIMB_SLIDE_LEFT, 0.0f, 3.0f); + } + + mProcVar0.field_0x3008 = 0x33; + setSpecialGravity(0.0f, maxFallSpeed, 0); + speed.y = 0.0f; + mNormalSpeed = 0.0f; + speedF = 0.0f; + + field_0x2f99 = 10; + mProcVar2.field_0x300c = 1; + mProcVar3.field_0x300e.y = 0; + + if (param_0) { + if (field_0x2f98 == 0) { + field_0x30a0 = -0x1800; + field_0x33f4 = -1.0f; + } else if (field_0x2f98 == 1) { + field_0x30a0 = 0x2800; + field_0x33f4 = 1.0f; + } else if (field_0x2f98 == 3) { + field_0x30a2 = -0x1800; + field_0x33f0 = -1.0f; + } else { + field_0x30a2 = 0x1800; + field_0x33f0 = 1.0f; + } + } + + dComIfGp_setPlayerStatus0(0, 8); + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -1127,8 +3008,50 @@ asm int daAlink_c::procClimbWaitInit(int param_0, int param_1) { #include "asm/d/a/d_a_alink/procClimbWaitInit__9daAlink_cFii.s" } #pragma pop +#endif /* 80100258-801003E4 0FAB98 018C+00 1/0 0/0 0/0 .text procClimbWait__9daAlink_cFv */ +// matches with literals +#ifdef NONMATCHING +int daAlink_c::procClimbWait() { + if (setMoveBGClimbCorrect()) { + return 1; + } + + daPy_frameCtrl_c* frameCtrl = mUnderFrameCtrl; + + field_0x2f99 = 2; + + if (!checkClimbFall()) { + if (checkAnmEnd(frameCtrl)) { + changeClimbMoveProc(1); + + if (mProcID == PROC_CLIMB_WAIT) { + if (mProcVar0.field_0x3008 != 0) { + mProcVar0.field_0x3008--; + } else { + daPy_addCalcShort(&field_0x30a0, 0, 3, 0x800, 0x100); + daPy_addCalcShort(&field_0x30a2, 0, 3, 0x800, 0x100); + field_0x33f0 = field_0x30a2 * 0.0001627604f; + field_0x33f4 = -field_0x30a0 * -0.0001627604f; + } + } + } else if (fabsf(frameCtrl->getRate()) > 0.01f) { + f32 anm_speed = getClimbMoveUpDownAnmSpeed(); + if (frameCtrl->getRate() < 0.0f) { + anm_speed *= -1.0f; + } + + setWaterInAnmRate(frameCtrl, anm_speed); + if (!checkBgClimbMove(4)) { + setClimbShapeOffset(); + } + } + } + + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -1137,6 +3060,7 @@ asm int daAlink_c::procClimbWait() { #include "asm/d/a/d_a_alink/procClimbWait__9daAlink_cFv.s" } #pragma pop +#endif /* 801003E4-80100464 0FAD24 0080+00 2/2 0/0 0/0 .text procClimbToRoofInit__9daAlink_cFv */ @@ -1155,14 +3079,47 @@ int daAlink_c::procClimbToRoofInit() { } /* 80100464-801005CC 0FADA4 0168+00 1/0 0/0 0/0 .text procClimbToRoof__9daAlink_cFv */ +// matches with literals +#ifdef NONMATCHING +int daAlink_c::procClimbToRoof() { + if (setMoveBGClimbCorrect()) { + return 1; + } + + daPy_frameCtrl_c* frameCtrl = mUnderFrameCtrl; + + field_0x2f99 = 2; + + if (checkAnmEnd(frameCtrl)) { + shape_angle.y += 0x8000; + current.angle.y = shape_angle.y; + field_0x2fe6 = shape_angle.y; + setOldRootQuaternion(0, 0x8000, 0); + field_0x2060->getOldFrameTransInfo(0)->mTranslate.z *= -1.0f; + + cXyz sp38(current.pos.x + cM_ssin(shape_angle.y) * 95.0f, current.pos.y, + current.pos.z + cM_scos(shape_angle.y) * 95.0f); + mLinkRoofChk.i_SetPos(sp38); + + sp38.y = dComIfG_Bgsp().RoofChk(&mLinkRoofChk); + if (sp38.y < current.pos.y + 214.0f + 110.0f) { + procRoofHangStartInit(mLinkRoofChk, sp38, 1); + } else { + procFallInit(1, daAlinkHIO_autoJump_c0::m.mFallInterpolation); + } + } + + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm int daAlink_c::procClimbToRoof() { - nofralloc +asm int daAlink_c::procClimbToRoof(){nofralloc #include "asm/d/a/d_a_alink/procClimbToRoof__9daAlink_cFv.s" } #pragma pop +#endif /* 801005CC-801005F0 0FAF0C 0024+00 2/2 0/0 0/0 .text getRoofHangFMoveAnmSpeed__9daAlink_cCFv */ f32 daAlink_c::getRoofHangFMoveAnmSpeed() const { @@ -1188,6 +3145,28 @@ void daAlink_c::setRoofHangHandOnSE(cBgS_PolyInfo* unused) { /* 80100668-80100770 0FAFA8 0108+00 3/3 0/0 0/0 .text checkRoofHangMovePos__9daAlink_cFv */ +// matches with literals +#ifdef NONMATCHING +int daAlink_c::checkRoofHangMovePos() { + if (field_0x2f98 >= 4) { + field_0x2f98 = 0; + } + + s16 angle = shape_angle.y + offsetAngle[field_0x2f98]; + + cXyz sp38(current.pos.x + cM_ssin(angle) * 60.0f, (current.pos.y + 214.0f) - 10.0f, + current.pos.z + cM_scos(angle) * 60.0f); + mLinkRoofChk.i_SetPos(sp38); + + if (dComIfG_Bgsp().RoofChk(&mLinkRoofChk) < sp38.y + 50.0f) { + if (dComIfG_Bgsp().GetMonkeyBarsCode(mLinkRoofChk)) { + return true; + } + } + + return false; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -1196,8 +3175,38 @@ asm int daAlink_c::checkRoofHangMovePos() { #include "asm/d/a/d_a_alink/checkRoofHangMovePos__9daAlink_cFv.s" } #pragma pop +#endif /* 80100770-801008EC 0FB0B0 017C+00 5/5 0/0 0/0 .text commonRoofHangProc__9daAlink_cFv */ +// matches with literals +#ifdef NONMATCHING +int daAlink_c::commonRoofHangProc() { + if (dComIfG_Bgsp().ChkPolySafe(mPolyInfo2) && dComIfG_Bgsp().ChkMoveBG(mPolyInfo2)) { + dComIfG_Bgsp().MoveBgTransPos(mPolyInfo2, true, ¤t.pos, ¤t.angle, &shape_angle); + } + + setDoStatus(0x33); + + if (doTrigger()) { + return procFallInit(1, daAlinkHIO_autoJump_c0::m.mFallInterpolation); + } + + cXyz sp28(current.pos.x, (current.pos.y + 214.0f) - 10.0f, current.pos.z); + mLinkRoofChk.i_SetPos(sp28); + + f32 roof_y = dComIfG_Bgsp().RoofChk(&mLinkRoofChk); + if (roof_y < sp28.y + 50.0f && dComIfG_Bgsp().GetMonkeyBarsCode(mLinkRoofChk) && + current.pos.y > mLinkAcch.GetGroundH()) + { + current.pos.y = roof_y - 214.0f; + mPolyInfo2.SetPolyInfo(mLinkRoofChk); + } else { + return procFallInit(1, daAlinkHIO_autoJump_c0::m.mFallInterpolation); + } + + return 0; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -1206,16 +3215,54 @@ asm int daAlink_c::commonRoofHangProc() { #include "asm/d/a/d_a_alink/commonRoofHangProc__9daAlink_cFv.s" } #pragma pop +#endif /* 801008EC-80100A10 0FB22C 0124+00 5/5 0/0 0/0 .text checkNextActionRoofHang__9daAlink_cFv */ +// matches with literals +#ifdef NONMATCHING +int daAlink_c::checkNextActionRoofHang() { + if (checkInputOnR()) { + field_0x2f98 = getDirectionFromShapeAngle(); + + if (checkAttentionLock()) { + if (field_0x2f98 == 2 || field_0x2f98 == 3) { + if (checkRoofHangMovePos()) { + procRoofHangSideMoveInit(); + } else { + procRoofHangWaitInit(0); + } + + return 1; + } + } else { + if (field_0x2f98 == 1) { + return procRoofHangTurnInit(); + } + + field_0x2f98 = 0; + } + + if (checkRoofHangMovePos()) { + procRoofHangFrontMoveInit(); + } else { + procRoofHangWaitInit(0); + } + } else { + procRoofHangWaitInit(0); + } + + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daAlink_c::checkNextActionRoofHang() { +asm int daAlink_c::checkNextActionRoofHang() { nofralloc #include "asm/d/a/d_a_alink/checkNextActionRoofHang__9daAlink_cFv.s" } #pragma pop +#endif /* 80100A10-80100AE4 0FB350 00D4+00 2/2 0/0 0/0 .text * procRoofHangStartInit__9daAlink_cFRC13cBgS_PolyInfoRC4cXyzi */ @@ -1293,6 +3340,43 @@ int daAlink_c::procRoofHangWait() { } /* 80100DA4-80100EEC 0FB6E4 0148+00 1/1 0/0 0/0 .text procRoofHangFrontMoveInit__9daAlink_cFv */ +// matches with literals +#ifdef NONMATCHING +int daAlink_c::procRoofHangFrontMoveInit() { + commonProcInit(PROC_ROOF_HANG_FRONT_MOVE); + + f32 anm_speed = getRoofHangFMoveAnmSpeed(); + if (field_0x2f98 == 1) { + anm_speed *= -1.0f; + current.angle.y = shape_angle.y + 0x8000; + field_0x3478 = 0.0f; + field_0x347c = 18.0f; + } else { + current.angle.y = shape_angle.y; + field_0x3478 = 13.0f; + field_0x347c = 32.0f; + } + + f32 frame = -1; + if (checkUnderMove0BckNoArc(ANM_ROOF_HANG_MOVE)) { + frame = mUnderFrameCtrl[0].getFrame(); + } + + setSingleAnimeBaseSpeed(ANM_ROOF_HANG_MOVE, anm_speed, daAlinkHIO_roofHang_c0::m.field_0x2C); + + if (frame >= 0) { + mUnderFrameCtrl[0].setFrame(frame); + getNowAnmPackUnder(UNDER_0)->setFrame(frame); + field_0x2060->initOldFrameMorf(0.0f, 0, 0x23); + } + + setSpecialGravity(0.0f, maxFallSpeed, 0); + mNormalSpeed = 0.0f; + speed.y = 0.0f; + dComIfGp_setPlayerStatus1(0, 0x100000); + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -1301,9 +3385,84 @@ asm int daAlink_c::procRoofHangFrontMoveInit() { #include "asm/d/a/d_a_alink/procRoofHangFrontMoveInit__9daAlink_cFv.s" } #pragma pop +#endif /* 80100EEC-8010121C 0FB82C 0330+00 1/0 0/0 0/0 .text procRoofHangFrontMove__9daAlink_cFv */ +// matches with literals +#ifdef NONMATCHING +int daAlink_c::procRoofHangFrontMove() { + if (commonRoofHangProc()) { + return 1; + } + + daPy_frameCtrl_c* frameCtrl = mUnderFrameCtrl; + + if (frameCtrl->checkPass(17) || frameCtrl->checkPass(0)) { + checkNextActionRoofHang(); + } else { + if (!checkAttentionLock()) { + cLib_addCalcAngleS(¤t.angle.y, field_0x2fe2, daAlinkHIO_roofHang_c0::m.field_0x14, + daAlinkHIO_roofHang_c0::m.field_0x16, + daAlinkHIO_roofHang_c0::m.field_0x18); + + if (field_0x2f98 == 0) { + shape_angle.y = current.angle.y; + } else { + shape_angle.y = current.angle.y + 0x8000; + } + } + + f32 frame; + if (frameCtrl->getFrame() >= 17.0f) { + frame = frameCtrl->getFrame() - 17.0f; + } else { + frame = frameCtrl->getFrame(); + } + + mNormalSpeed = getAnmSpeedStickRate(daAlinkHIO_roofHang_c0::m.field_0x30, + daAlinkHIO_roofHang_c0::m.field_0x34) * + cM_fsin((frame * M_PI) * 0.08333334f); + if (mNormalSpeed < 0.0f) { + mNormalSpeed = 0.0f; + } + + f32 anm_speed = getRoofHangFMoveAnmSpeed(); + if (frameCtrl->getRate() < 0.0f) { + anm_speed *= -1.0f; + } + + setWaterInAnmRate(frameCtrl, anm_speed); + + if (anm_speed > 0.0f && mLinkAcch.ChkWallHit()) { + cXyz sp7C(current.pos.x, (current.pos.y - 3.0f) + 214.0f, current.pos.z); + + f32 temp_f29 = field_0x18B0[0].GetWallR() + 25.0f; + cXyz sp88(sp7C.x + temp_f29 * cM_ssin(shape_angle.y), sp7C.y, + sp7C.z + temp_f29 * cM_scos(shape_angle.y)); + + if (commonLineCheck(&sp7C, &sp88) && checkClimbCode(mLinkLinChk)) { + cM3dGPla sp70; + dComIfG_Bgsp().GetTriPla(mLinkLinChk, &sp70); + + if (cLib_distanceAngleS(sp70.mNormal.atan2sX_Z(), shape_angle.y) > 0x6000) { + current.pos.x = sp70.mNormal.x * 15.0f + mLinkLinChk.i_GetCross().x; + current.pos.z = sp70.mNormal.z * 15.0f + mLinkLinChk.i_GetCross().z; + return procFallInit(1, daAlinkHIO_autoJump_c0::m.mFallInterpolation); + } + } + } + + setRoofHangHandOnSE(&mPolyInfo2); + + if (!checkRoofHangMovePos()) { + procRoofHangWaitInit(0); + } + } + + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -1312,6 +3471,7 @@ asm int daAlink_c::procRoofHangFrontMove() { #include "asm/d/a/d_a_alink/procRoofHangFrontMove__9daAlink_cFv.s" } #pragma pop +#endif /* 8010121C-80101308 0FBB5C 00EC+00 1/1 0/0 0/0 .text procRoofHangSideMoveInit__9daAlink_cFv */ int daAlink_c::procRoofHangSideMoveInit() { @@ -1492,8 +3652,3 @@ int daAlink_c::procRoofSwitchHang() { return 1; } - -/* 80101874-80101890 0FC1B4 001C+00 2/2 0/0 0/0 .text getHangPos__13daObjSwHang_cFv */ -cXyz daObjSwHang_c::getHangPos() { - return mHangPos; -}