From 467b7bffcacbafdbd35cdf2eab78d95d1ed37311 Mon Sep 17 00:00:00 2001 From: TakaRikka <38417346+TakaRikka@users.noreply.github.com> Date: Mon, 4 Nov 2024 04:34:18 -0800 Subject: [PATCH] alink crawl / damage done (#2236) --- include/d/actor/d_a_alink.h | 33 +- src/d/actor/d_a_alink_HIO_data.inc | 4 +- src/d/actor/d_a_alink_crawl.inc | 541 ++++++++++++++++++- src/d/actor/d_a_alink_damage.inc | 837 ++++++++++++++++++++++++++++- 4 files changed, 1350 insertions(+), 65 deletions(-) diff --git a/include/d/actor/d_a_alink.h b/include/d/actor/d_a_alink.h index 00c3e922c62..6cbd7d1d529 100644 --- a/include/d/actor/d_a_alink.h +++ b/include/d/actor/d_a_alink.h @@ -2263,7 +2263,7 @@ public: /* 800F7E48 */ BOOL changeCrawlAutoMoveProc(cXyz*); /* 800F81C0 */ int getCrawlMoveVec(cXyz*, cXyz*, cXyz*, int, int, u8*); /* 800F85C0 */ void crawlBgCheck(cXyz*, cXyz*, int); - /* 800F8700 */ void checkCrawlSideWall(cXyz*, cXyz*, cXyz*, cXyz*, s16*, s16*); + /* 800F8700 */ BOOL checkCrawlSideWall(cXyz*, cXyz*, cXyz*, cXyz*, s16*, s16*); /* 800F88F8 */ void decideCrawlDoStatus(); /* 800F89E0 */ BOOL checkNotCrawlStand(cXyz*); /* 800F8A50 */ BOOL checkNotCrawlStand(cXyz*, cXyz*); @@ -3426,6 +3426,8 @@ public: return i_frameCtrl->checkAnmEnd(); } + BOOL checkCrawlWaterIn() { return mWaterY > current.pos.y + 15.5f; } + const cXyz& getHsChainTopPos() const { return mHookshotTopPos; } const cXyz& getHsChainRootPos() const { return mHeldItemRootPos; } @@ -3644,7 +3646,7 @@ public: /* 0x028B0 */ fpc_ProcID mShieldArrowIDs[16]; /* 0x028F0 */ fpc_ProcID mMsgClassID; /* 0x028F4 */ int mAtnActorID; - /* 0x028F8 */ int field_0x28f8; + /* 0x028F8 */ fpc_ProcID field_0x28f8; /* 0x028FC */ int field_0x28fc; /* 0x02900 */ u32 field_0x2900; /* 0x02904 */ daAlink_footData_c mFootData1[2]; @@ -5124,7 +5126,7 @@ public: static daAlinkHIO_damNormal_c1 const m; }; -class daAlinkHIO_damLarge_c1 { +class daAlinkHIO_damLaHu_c1 { public: /* 0x00 */ daAlinkHIO_anm_c field_0x0; /* 0x14 */ daAlinkHIO_anm_c field_0x14; @@ -5141,35 +5143,16 @@ public: /* 0xB0 */ f32 field_0xB0; /* 0xB4 */ f32 field_0xB4; /* 0xB8 */ f32 field_0xB8; -}; // Size: 0xBC +}; class daAlinkHIO_damLarge_c0 { public: - static daAlinkHIO_damLarge_c1 const m; + static daAlinkHIO_damLaHu_c1 const m; }; -class daAlinkHIO_damHuge_c1 { -public: - /* 0x00 */ daAlinkHIO_anm_c field_0x0; - /* 0x14 */ daAlinkHIO_anm_c field_0x14; - /* 0x28 */ daAlinkHIO_anm_c field_0x28; - /* 0x3C */ daAlinkHIO_anm_c field_0x3C; - /* 0x50 */ daAlinkHIO_anm_c field_0x50; - /* 0x64 */ daAlinkHIO_anm_c field_0x64; - /* 0x78 */ daAlinkHIO_anm_c field_0x78; - /* 0x8C */ daAlinkHIO_anm_c field_0x8C; - /* 0xA0 */ s16 field_0xA0; - /* 0xA4 */ f32 field_0xA4; - /* 0xA8 */ f32 field_0xA8; - /* 0xAC */ f32 field_0xAC; - /* 0xB0 */ f32 field_0xB0; - /* 0xB4 */ f32 field_0xB4; - /* 0xB8 */ f32 field_0xB8; -}; // Size: 0xBC - class daAlinkHIO_damHuge_c0 { public: - static daAlinkHIO_damHuge_c1 const m; + static daAlinkHIO_damLaHu_c1 const m; }; class daAlinkHIO_damHorse_c1 { diff --git a/src/d/actor/d_a_alink_HIO_data.inc b/src/d/actor/d_a_alink_HIO_data.inc index b91cb8ed457..9125bc78076 100644 --- a/src/d/actor/d_a_alink_HIO_data.inc +++ b/src/d/actor/d_a_alink_HIO_data.inc @@ -1238,7 +1238,7 @@ const daAlinkHIO_damNormal_c1 daAlinkHIO_damNormal_c0::m = { }; /* 8038E2B0-8038E36C 01A910 00BC+00 2/4 0/0 0/0 .rodata m__22daAlinkHIO_damLarge_c0 */ -const daAlinkHIO_damLarge_c1 daAlinkHIO_damLarge_c0::m = { +const daAlinkHIO_damLaHu_c1 daAlinkHIO_damLarge_c0::m = { { 49, 0.8f, @@ -1305,7 +1305,7 @@ const daAlinkHIO_damLarge_c1 daAlinkHIO_damLarge_c0::m = { }; /* 8038E36C-8038E428 01A9CC 00BC+00 1/3 0/0 0/0 .rodata m__21daAlinkHIO_damHuge_c0 */ -const daAlinkHIO_damHuge_c1 daAlinkHIO_damHuge_c0::m = { +const daAlinkHIO_damLaHu_c1 daAlinkHIO_damHuge_c0::m = { { 49, 0.8f, diff --git a/src/d/actor/d_a_alink_crawl.inc b/src/d/actor/d_a_alink_crawl.inc index 54fdac045ed..38197fe8203 100644 --- a/src/d/actor/d_a_alink_crawl.inc +++ b/src/d/actor/d_a_alink_crawl.inc @@ -80,7 +80,80 @@ void daAlink_c::setCrawlMoveDirectionArrow() { /* 800F7E48-800F81C0 0F2788 0378+00 2/2 0/0 0/0 .text changeCrawlAutoMoveProc__9daAlink_cFP4cXyz */ BOOL daAlink_c::changeCrawlAutoMoveProc(cXyz* param_0) { - // NONMATCHING + cXyz sp70; + cXyz sp64; + cXyz sp58; + cXyz sp4C; + cXyz sp40; + cXyz sp34; + cXyz sp28; + f32 spC; + s16 spA; + s16 sp8; + + f32 temp_f31 = cM_ssin(current.angle.y); + f32 temp_f30 = cM_scos(current.angle.y); + f32 temp_f29 = cM_ssin(shape_angle.y); + f32 temp_f28 = cM_scos(shape_angle.y); + + int var_r29 = 0; + + sp70.x = param_0->x + (95.0f * temp_f31); + sp70.y = param_0->y; + sp70.z = param_0->z + (95.0f * temp_f30); + + if (!commonLineCheck(param_0, &sp70) || (!checkWolf() && dComIfG_Bgsp().GetWallCode(mLinkLinChk) == 6)) { + sp4C.x = sp70.x + (55.0f * temp_f30); + sp4C.y = sp70.y; + sp4C.z = sp70.z - (55.0f * temp_f31); + + if (checkCrawlSideWall(&sp70, &sp4C, &sp34, &sp28, &spA, &sp8)) { + var_r29 |= 1; + } else { + return 0; + } + } + + sp4C.x = param_0->x + (55.0f * temp_f28); + sp4C.y = param_0->y; + sp4C.z = param_0->z - (55.0f * temp_f29); + + sp40 = (*param_0 * 2.0f) - sp4C; + + if (commonLineCheck(param_0, &sp4C)) { + var_r29 |= 8; + + sp58.x = sp40.x + (95.0f * temp_f29); + sp58.y = sp40.y; + sp58.z = sp40.z + (95.0f * temp_f28); + if (!checkCrawlSideWall(&sp40, &sp58, &sp34, &sp28, &spA, &sp8)) { + return 0; + } + } else { + var_r29 |= 4; + + sp58.x = sp4C.x - (95.0f * temp_f29); + sp58.y = sp4C.y; + sp58.z = sp4C.z - (95.0f * temp_f28); + if (!checkCrawlSideWall(&sp4C, &sp58, &sp34, &sp28, &spA, &sp8)) { + return 0; + } + + if (!commonLineCheck(param_0, &sp40)) { + var_r29 |= 8; + } + } + + + if (cM3d_Len2dSqPntAndSegLine(0.5f * (sp34.x + sp28.x), 0.5f * (sp34.z + sp28.z), sp70.x, sp70.z, param_0->x - (95.0f * temp_f31), param_0->z - (95.0f * temp_f30), &sp64.x, &sp64.z, &spC)) { + sp64.y = current.pos.y; + if (checkWolf()) { + return procWolfLieAutoMoveInit(var_r29, &sp64); + } else { + return procCrawlAutoMoveInit(var_r29, &sp64); + } + } + return 0; } @@ -88,7 +161,55 @@ BOOL daAlink_c::changeCrawlAutoMoveProc(cXyz* param_0) { * getCrawlMoveVec__9daAlink_cFP4cXyzP4cXyzP4cXyziiPUc */ int daAlink_c::getCrawlMoveVec(cXyz* param_0, cXyz* param_1, cXyz* param_2, int param_3, int param_4, u8* param_5) { - // NONMATCHING + if (commonLineCheck(param_0, param_1) && ((param_4 == 0 && (!checkWolf() || !dComIfGp_checkPlayerStatus0(0, 0x08000000))) || dComIfG_Bgsp().GetWallCode(mLinkLinChk) != 6) && (!checkWolf() || dComIfG_Bgsp().GetWallCode(mLinkLinChk) != 7)) { + cM3dGPla sp3C; + dComIfG_Bgsp().GetTriPla(mLinkLinChk, &sp3C); + + int temp_r27 = dComIfG_Bgsp().GetSpecialCode(mLinkLinChk); + if (cBgW_CheckBWall(sp3C.mNormal.y) || (param_3 == 2 && cBgW_CheckBGround(sp3C.mNormal.y))) { + cXyz sp1C = *param_1 - mLinkLinChk.i_GetCross(); + s16 temp_r26 = sp3C.mNormal.atan2sX_Z(); + s16 temp_r3 = sp1C.atan2sX_Z(); + + if (abs((s16)((temp_r3 + 0x8000) - temp_r26)) > 0x3000) { + return 0; + } + + f32 temp_f31 = -sp1C.absXZ() * cM_scos(((temp_r3 - temp_r26) - 0x8000)); + + param_2->x = temp_f31 * sp3C.mNormal.x; + if (param_3 != 1) { + param_2->y = 0.0f; + } else { + param_2->y = sp1C.y; + } + param_2->z = temp_f31 * sp3C.mNormal.z; + + if (param_5 != NULL && (dKy_pol_argument_get(&mLinkLinChk) & 0x60)) { + *param_5 = 3; + + cM3dGPla sp28; + dComIfG_Bgsp().GetTriPla(mLinkLinChk, &sp28); + + field_0x311e = sp28.mNormal.atan2sX_Z(); + + if (checkIcePolygonDamage(&mLinkLinChk)) { + *param_5 |= 0x80; + } + + if (dKy_pol_argument_get(&mLinkLinChk) & 0x20) { + *param_5 |= 0x40; + } + } + return 1; + } + + if (param_3 == 1 && (temp_r27 == 1 || (sp3C.mNormal.y < field_0x3470 && temp_r27 == 2))) { + *param_2 = *param_1 - mLinkLinChk.i_GetCross(); + return 1; + } + } + return 0; } @@ -119,9 +240,35 @@ void daAlink_c::crawlBgCheck(cXyz* param_0, cXyz* param_1, int param_2) { /* 800F8700-800F88F8 0F3040 01F8+00 2/2 0/0 0/0 .text * checkCrawlSideWall__9daAlink_cFP4cXyzP4cXyzP4cXyzP4cXyzPsPs */ -void daAlink_c::checkCrawlSideWall(cXyz* param_0, cXyz* param_1, cXyz* param_2, cXyz* param_3, +BOOL daAlink_c::checkCrawlSideWall(cXyz* param_0, cXyz* param_1, cXyz* param_2, cXyz* param_3, s16* param_4, s16* param_5) { - // NONMATCHING + cXyz sp58; + cXyz sp4C; + + if (commonLineCheck(param_0, param_1)) { + cM3dGPla sp64; + *param_2 = mLinkLinChk.i_GetCross(); + dComIfG_Bgsp().GetTriPla(mLinkLinChk, &sp64); + + *param_4 = sp64.mNormal.atan2sX_Z(); + + sp4C = *param_2 + (sp64.mNormal * 95.0f); + sp58 = (sp4C + *param_2) * 0.5f; + if (commonLineCheck(&sp58, &sp4C)) { + *param_3 = mLinkLinChk.i_GetCross(); + dComIfG_Bgsp().GetTriPla(mLinkLinChk, &sp64); + + *param_5 = sp64.mNormal.atan2sX_Z(); + + cXyz sp40 = *param_2 - *param_3; + f32 temp_f31 = sp40.abs2XZ(); + if (cLib_distanceAngleS(*param_4, *param_5) > 0x7F00 && temp_f31 < 9025.0f && temp_f31 > 4900.0f) { + return 1; + } + } + } + + return 0; } /* 800F88F8-800F89E0 0F3238 00E8+00 6/6 0/0 0/0 .text decideCrawlDoStatus__9daAlink_cFv @@ -171,7 +318,35 @@ BOOL daAlink_c::checkNotCrawlStand(cXyz* param_0, cXyz* param_1) { /* 800F8B00-800F8D04 0F3440 0204+00 2/2 0/0 0/0 .text * checkCrawlInHoll__9daAlink_cFP4cXyzP4cXyzP4cXyzi */ BOOL daAlink_c::checkCrawlInHoll(cXyz* param_0, cXyz* param_1, cXyz* param_2, int param_3) { - // NONMATCHING + cXyz spC0; + cXyz spB4; + cXyz spA8; + cXyz sp9C; + cXyz sp90; + cXyz sp84; + s16 sp16; + s16 sp14; + + cMtx_multVec(mpLinkModel->getBaseTRMtx(), field_0x2f50, &spC0); + cMtx_multVec(mpLinkModel->getBaseTRMtx(), field_0x2f54, param_2); + + if (mUnderFrameCtrl[0].getRate() >= 0.0f) { + sp90 = (*param_0 - *param_2) * 0.5f; + } else if (mUnderFrameCtrl[0].getRate() < 0.0f) { + sp90 = (*param_1 - *param_2) * 0.5f; + } + + spC0 += sp90; + *param_2 += sp90; + spB4 = (*param_2 * 2.0f) - spC0; + + if (checkCrawlSideWall(param_2, &spC0, &spA8, &sp9C, &sp16, &sp14) || checkCrawlSideWall(param_2, &spB4, &sp9C, &spA8, &sp14, &sp16)) { + field_0x3198 = 1; + field_0x37c8 = ((spA8 + sp9C) * 0.5f) - sp90; + mProcVar2.field_0x300c = sp16 + 0x4000; + return 1; + } + return 0; } @@ -242,13 +417,82 @@ void daAlink_c::stopHalfMoveAnime(f32 param_0) { /* 800F8F84-800F9210 0F38C4 028C+00 2/2 0/0 0/0 .text setCrawlAutoMoveAimPos__9daAlink_cFv */ void daAlink_c::setCrawlAutoMoveAimPos() { - // NONMATCHING + int temp_r30 = getDirectionFromShapeAngle(); + f32 temp_f31 = cM_ssin(shape_angle.y); + f32 temp_f30 = cM_scos(shape_angle.y); + + if (temp_r30 == 2 && (field_0x3198 & 4)) { + field_0x37c8.x += 1.5f * (95.0f * temp_f30); + field_0x37c8.z -= 1.5f * (95.0f * temp_f31); + + mProcVar2.field_0x300c = current.angle.y + 0x4000; + + if (current.angle.y == shape_angle.y) { + mProcVar3.field_0x300e = 1; + } else { + mProcVar3.field_0x300e = -1; + } + + mProcVar0.field_0x3008 = -1; + } else if (temp_r30 == 3 && (field_0x3198 & 8)) { + field_0x37c8.x -= 1.5f * (95.0f * temp_f30); + field_0x37c8.z += 1.5f * (95.0f * temp_f31); + + mProcVar2.field_0x300c = current.angle.y - 0x4000; + + if (current.angle.y == shape_angle.y) { + mProcVar3.field_0x300e = 1; + } else { + mProcVar3.field_0x300e = -1; + } + + mProcVar0.field_0x3008 = -1; + } else if ((field_0x3198 & 1) && ((shape_angle.y == current.angle.y && temp_r30 == 0) || (shape_angle.y != current.angle.y && temp_r30 == 1))) { + field_0x37c8.x += 1.5f * (95.0f * cM_ssin(current.angle.y)); + field_0x37c8.z += 1.5f * (95.0f * cM_scos(current.angle.y)); + + mProcVar2.field_0x300c = shape_angle.y; + mProcVar3.field_0x300e = 0; + mProcVar0.field_0x3008 = -1; + } else if ((shape_angle.y == current.angle.y && temp_r30 == 1) || (shape_angle.y != current.angle.y && temp_r30 == 0)) { + current.angle.y += 0x8000; + field_0x37c8.x -= 1.5f * (95.0f * cM_ssin(current.angle.y)); + field_0x37c8.z -= 1.5f * (95.0f * cM_scos(current.angle.y)); + + mProcVar2.field_0x300c = shape_angle.y; + mProcVar3.field_0x300e = 0; + mProcVar0.field_0x3008 = -1; + } } /* 800F9210-800F9384 0F3B50 0174+00 2/2 0/0 0/0 .text procCrawlStartInit__9daAlink_cFv */ int daAlink_c::procCrawlStartInit() { - // NONMATCHING - return 0; + if (mEquipItem != NO_ITEM) { + return procPreActionUnequipInit(PROC_CRAWL_START, NULL); + } + + commonProcInit(PROC_CRAWL_START); + + field_0x3588 = l_waitBaseAnime; + setSingleAnimeParam(ANM_CRAWL_START, &daAlinkHIO_crouch_c0::m.mCrawlStartAnm); + + mNormalSpeed = 0.0f; + shape_angle.y = field_0x306e + 0x8000; + current.angle.y = shape_angle.y; + current.pos.x = field_0x34ec.x + (35.0f * cM_ssin(field_0x306e)); + current.pos.z = field_0x34ec.z + (35.0f * cM_scos(field_0x306e)); + + if (daAlinkHIO_crouch_c0::m.mCrawlStartAnm.mCheckFrame > daAlinkHIO_crouch_c0::m.mCrawlStartAnm.mEndFrame) { + field_0x347c = daAlinkHIO_crouch_c0::m.mCrawlStartAnm.mEndFrame; + } else { + field_0x347c = daAlinkHIO_crouch_c0::m.mCrawlStartAnm.mCheckFrame; + } + + field_0x3478 = 1.0f / (field_0x347c - daAlinkHIO_crouch_c0::m.mCrawlStartAnm.mStartFrame); + field_0x33cc = 0.0f; + + dComIfGp_setPlayerStatus0(0, 0x08000000); + return 1; } /* 800F9384-800F9474 0F3CC4 00F0+00 1/0 0/0 0/0 .text procCrawlStart__9daAlink_cFv */ @@ -278,18 +522,152 @@ int daAlink_c::procCrawlStart() { /* 800F9474-800F95B8 0F3DB4 0144+00 3/3 0/0 0/0 .text procCrawlMoveInit__9daAlink_cFss */ int daAlink_c::procCrawlMoveInit(s16 param_0, s16 param_1) { - // NONMATCHING - return 0; + BOOL var_r29; + BOOL var_r28 = 0; + + if (mProcID == PROC_CRAWL_AUTO_MOVE) { + var_r29 = 0; + } else { + var_r29 = 1; + if (mProcID == PROC_CRAWL_START) { + var_r28 = 1; + } + } + + BOOL var_r27; + if (dComIfGp_checkPlayerStatus0(0, 0x2000)) { + var_r27 = 1; + } else { + var_r27 = 0; + } + + commonProcInit(PROC_CRAWL_MOVE); + mProcVar3.field_0x300e = 0; + + if (var_r29 != 0) { + f32 var_f31 = getCrawlMoveAnmSpeed(); + if (var_r28 != 0) { + mProcVar3.field_0x300e = 1; + } else if (getDirectionFromShapeAngle() == 1) { + var_f31 *= -1.0f; + } + + current.angle.y = shape_angle.y; + setSingleAnimeBaseSpeed(ANM_CRAWL, var_f31, daAlinkHIO_crouch_c0::m.mCrawlInterpolation); + } + + field_0x3198 = var_r29 ^ 1; + shape_angle.x = param_0; + shape_angle.z = param_1; + field_0x33cc = 1.0f; + field_0x2f99 = 0xC; + + dComIfGp_setPlayerStatus0(0, 0x08000000); + + if (var_r27 != 0) { + dComIfGp_setPlayerStatus0(0, 0x2000); + } + + return 1; } /* 800F95B8-800F99FC 0F3EF8 0444+00 1/0 0/0 0/0 .text procCrawlMove__9daAlink_cFv */ int daAlink_c::procCrawlMove() { - // NONMATCHING - return 0; + daPy_frameCtrl_c* temp_r29 = &mUnderFrameCtrl[0]; + cXyz sp54; + cXyz sp48; + cXyz sp3C; + + field_0x2f99 = 0xC; + decideCrawlDoStatus(); + + cMtx_multVec(mpLinkModel->getBaseTRMtx(), &l_crawlStandUpOffset, &sp48); + cMtx_multVec(mpLinkModel->getBaseTRMtx(), &l_crawlFrontUpOffset, &sp54); + cMtx_multVec(mpLinkModel->getBaseTRMtx(), &l_crawlBackUpOffset, &sp3C); + + cXyz sp30; + cXyz sp24; + cMtx_multVecSR(mpLinkModel->getBaseTRMtx(), &l_crawlMinSideOffset, &sp24); + + BOOL temp_r25 = checkNotCrawlStand(&sp48); + BOOL temp_r24 = checkNotCrawlStand(&sp54); + BOOL temp_r23 = checkNotCrawlStand(&sp3C); + BOOL var_r27; + if (temp_r25 || temp_r24 || temp_r23 || checkNotCrawlStand(&sp54, &sp24) || checkNotCrawlStand(&sp3C, &sp24) || checkNotCrawlStand(&sp48, &sp24)) { + var_r27 = 0; + onModeFlg(0x04000000); + } else { + var_r27 = 1; + offModeFlg(0x04000000); + } + + cM3dGPla sp60; + + if ((var_r27 != 0 && mProcVar3.field_0x300e == 0) || getSlidePolygon(&sp60) || checkCrawlWaterIn()) { + procCrawlEndInit(1, shape_angle.x, shape_angle.z); + } else { + BOOL var_r26 = 0; + f32 temp_f31 = getCrawlMoveAnmSpeed(); + + if (temp_r29->getRate() > 0.0f) { + setWaterInAnmRate(temp_r29, temp_f31); + } else if (temp_r29->getRate() < 0.0f) { + setWaterInAnmRate(temp_r29, -temp_f31); + } else { + var_r26 = 1; + } + + if (var_r26 == 1 || temp_r29->checkPass(0.0f) || temp_r29->checkPass(17.0f)) { + if (mProcVar3.field_0x300e != 0) { + mProcVar3.field_0x300e--; + setWaterInAnmRate(temp_r29, temp_f31); + temp_r29->setLoop(0); + } else if (checkInputOnR()) { + if (getDirectionFromShapeAngle() != 1) { + setWaterInAnmRate(temp_r29, temp_f31); + temp_r29->setLoop(0); + } else { + setWaterInAnmRate(temp_r29, -temp_f31); + temp_r29->setLoop(temp_r29->getEnd()); + } + + initBasAnime(); + } else if (var_r26 == 0) { + stopHalfMoveAnime(17.0f); + } + } + + int sp8 = field_0x3198; + cXyz sp18; + field_0x3198 = 0; + + if (checkCrawlInHoll(&sp54, &sp3C, &sp18, var_r27)) { + setCrawlMoveHoll(); + } else if (sp8 != 0 && temp_r25 && temp_r24 && temp_r23 && var_r27 == 0 && changeCrawlAutoMoveProc(&sp18) ) { + return 1; + } else if (mProcVar3.field_0x300e == 0 && checkInputOnR() && temp_r29->getRate() > 0.0f) { + setCrawlMoveAngle(); + } + + mNormalSpeed = getCrawlMoveSpeed(); + + cXyz spC; + if (mNormalSpeed < 0.0f) { + mNormalSpeed *= -1.0f; + current.angle.y = shape_angle.y + 0x8000; + cMtx_multVec(mpLinkModel->getBaseTRMtx(), &l_crawlBackOffset, &spC); + crawlBgCheck(&spC, &sp3C, 1); + } else { + cMtx_multVec(mpLinkModel->getBaseTRMtx(), &l_crawlFrontOffset, &spC); + crawlBgCheck(&spC, &sp54, 1); + } + } + + return 1; } /* 800F99FC-800F9ABC 0F433C 00C0+00 1/1 0/0 0/0 .text procCrawlAutoMoveInit__9daAlink_cFiP4cXyz */ -// NONMATCHING - r30 / r31 swap +// NONMATCHING - extrwi vs rlwinm int daAlink_c::procCrawlAutoMoveInit(int param_0, cXyz* param_1) { BOOL var_r30 = dComIfGp_checkPlayerStatus0(0, 0x2000); commonProcInit(PROC_CRAWL_AUTO_MOVE); @@ -313,14 +691,143 @@ int daAlink_c::procCrawlAutoMoveInit(int param_0, cXyz* param_1) { /* 800F9ABC-800F9D7C 0F43FC 02C0+00 1/0 0/0 0/0 .text procCrawlAutoMove__9daAlink_cFv */ int daAlink_c::procCrawlAutoMove() { - // NONMATCHING - return 0; + field_0x2f99 = 0xC; + + daPy_frameCtrl_c* temp_r29 = &mUnderFrameCtrl[0]; + s16 temp_r27 = shape_angle.y; + s16 temp_r26 = current.angle.y; + + if (mProcVar0.field_0x3008 > 0) { + if (temp_r29->checkPass(0.0f) || temp_r29->checkPass(17.0f)) { + stopHalfMoveAnime(17.0f); + mNormalSpeed = 0.0f; + } else if (checkAnmEnd(temp_r29)) { + mNormalSpeed = 0.0f; + mProcVar0.field_0x3008 -= 1; + } + + setCrawlMoveDirectionArrow(); + decideCrawlDoStatus(); + + shape_angle.y = temp_r27; + current.angle.y = temp_r26; + } else if (mProcVar0.field_0x3008 == 0) { + setCrawlMoveDirectionArrow(); + if (checkInputOnR()) { + setCrawlAutoMoveAimPos(); + + if (mProcVar0.field_0x3008 == -1) { + dComIfGp_setAdvanceDirection(0); + + if (shape_angle.y == current.angle.y) { + setWaterInAnmRate(temp_r29, 2.0f); + temp_r29->setLoop(0); + } else { + setWaterInAnmRate(temp_r29, -2.0f); + temp_r29->setLoop(temp_r29->getEnd()); + } + + initBasAnime(); + } + } else { + decideCrawlDoStatus(); + shape_angle.y = temp_r27; + current.angle.y = temp_r26; + } + } else { + int var_r28 = 1; + if (mProcVar1.field_0x300a > 0) { + mProcVar1.field_0x300a--; + } + + if (mProcVar3.field_0x300e != 0) { + if (cLib_addCalcAngleS(&shape_angle.y, mProcVar2.field_0x300c, 5, 0x480, 0x80)) { + var_r28 = 0; + } + + if (mProcVar3.field_0x300e < 0) { + current.angle.y = shape_angle.y + 0x8000; + } else { + current.angle.y = shape_angle.y; + } + + cLib_addCalc(¤t.pos.x, field_0x37c8.x, 0.5f, 3.0f, 1.0f); + cLib_addCalc(¤t.pos.z, field_0x37c8.z, 0.5f, 3.0f, 1.0f); + } + + cXyz sp8 = field_0x37c8 - current.pos; + if (cLib_distanceAngleS(sp8.atan2sX_Z(), current.angle.y) < 0x6000) { + var_r28 = 0; + } + + mNormalSpeed = getCrawlMoveSpeed(); + + if (mNormalSpeed < 0.0f) { + mNormalSpeed *= -1.0f; + current.angle.y = shape_angle.y + 0x8000; + } + + if (var_r28 != 0 || mProcVar1.field_0x300a == 0) { + procCrawlMoveInit(shape_angle.x, shape_angle.z); + } + } + + field_0x310c = shape_angle.y; + return 1; } /* 800F9D7C-800F9F30 0F46BC 01B4+00 1/1 0/0 0/0 .text procCrawlEndInit__9daAlink_cFiss */ int daAlink_c::procCrawlEndInit(int param_0, s16 param_1, s16 param_2) { - // NONMATCHING - return 0; + daPy_frameCtrl_c* temp_r29 = &mUnderFrameCtrl[0]; + f32 var_f31 = temp_r29->getFrame(); + + commonProcInit(PROC_CRAWL_END); + + current.angle.y = shape_angle.y; + field_0x2f99 = 0xC; + + const daAlinkHIO_anm_c* temp_r30 = &daAlinkHIO_crouch_c0::m.mCrawlEndAnm; + + f32 var_f30; + if (param_0 != 0) { + var_f30 = temp_r30->mInterpolation; + } else { + var_f30 = -1.0f; + } + + setSingleAnime(ANM_CRAWL_START, temp_r30->mSpeed, temp_r30->mStartFrame, temp_r30->mEndFrame, var_f30); + + if (param_0 == 0) { + if (temp_r30->mStartFrame > var_f31) { + var_f31 = temp_r30->mStartFrame; + } else if (temp_r30->mEndFrame <= var_f31) { + var_f31 = temp_r30->mEndFrame; + } + + temp_r29->setFrame(var_f31); + getNowAnmPackUnder(UNDER_0)->setFrame(var_f31); + } + + J3DTransformInfo sp10; + getNowAnmPackUnder(UNDER_0)->getTransform(0, &sp10); + + field_0x34d4.x = sp10.mTranslate.x; + field_0x34d4.y = sp10.mTranslate.y; + field_0x34d4.z = sp10.mTranslate.z; + + mNormalSpeed = 0.0f; + shape_angle.x = param_1; + shape_angle.z = param_2; + + if (temp_r30->mCheckFrame > temp_r30->mStartFrame) { + field_0x347c = temp_r30->mCheckFrame; + } else { + field_0x347c = temp_r30->mStartFrame; + } + + field_0x3478 = 1.0f / (temp_r30->mEndFrame - field_0x347c); + field_0x3588 = l_waitBaseAnime; + return 1; } /* 800F9F30-800F9FDC 0F4870 00AC+00 1/0 0/0 0/0 .text procCrawlEnd__9daAlink_cFv */ diff --git a/src/d/actor/d_a_alink_damage.inc b/src/d/actor/d_a_alink_damage.inc index b47e832058c..06bed0b62b8 100644 --- a/src/d/actor/d_a_alink_damage.inc +++ b/src/d/actor/d_a_alink_damage.inc @@ -4,7 +4,10 @@ */ #include "d/actor/d_a_alink.h" +#include "d/d_com_inf_game.h" #include "d/actor/d_a_horse.h" +#include "d/actor/d_a_crod.h" +#include "d/d_msg_object.h" /* 800D6D94-800D6DA4 0D16D4 0010+00 0/0 0/0 2/2 .text getFreezeR__9daAlink_cCFv */ s16 daAlink_c::getFreezeR() const { @@ -928,33 +931,592 @@ int daAlink_c::procDamage() { * procCoLargeDamageInit__9daAlink_cFiissP12dCcD_GObjInfi */ int daAlink_c::procCoLargeDamageInit(int param_0, int param_1, s16 param_2, s16 param_3, dCcD_GObjInf* param_4, int param_5) { - // NONMATCHING - return 0; + u32 sp10 = checkReinRide(); + + if (!commonProcInitNotSameProc(PROC_LARGE_DAMAGE)) { + return 0; + } + + if (mCopyRodAcKeep.getActor() != NULL) { + ((daCrod_c*)mCopyRodAcKeep.getActor())->offControll(); + } + + field_0x3480 = -1.0f; + mFallVoiceInit = 0; + + int var_r30; + if (param_0 == -3) { + current.angle.y = field_0x2ffe; + var_r30 = getDirectionFromAngle((current.angle.y - shape_angle.y)); + + dComIfGp_getVibration().StartShock(6, 0x1F, cXyz(0.0f, 1.0f, 0.0f)); + setDamagePointNormal(field_0x318c); + onNoResetFlg1(FLG1_THROW_DAMAGE); + } else if (param_0 == -4) { + var_r30 = 1; + current.angle.y = shape_angle.y + 0x8000; + } else if (param_0 == -2) { + var_r30 = mDemo.getParam0(); + + if (var_r30 == 0) { + current.angle.y = shape_angle.y; + } else if (var_r30 == 2) { + current.angle.y = shape_angle.y + 0x4000; + } else if (var_r30 == 3) { + current.angle.y = shape_angle.y - 0x4000; + } else { + current.angle.y = shape_angle.y + 0x8000; + } + } else if (param_0 == -5) { + if (param_5 == 1) { + onNoResetFlg1(FLG1_ICE_FREEZE); + } + + current.angle.y = field_0x311e; + var_r30 = getDirectionFromAngle((current.angle.y - shape_angle.y)); + } else if (param_0 == -1) { + if (param_4 != NULL) { + cXyz* temp_r3 = getDamageVec(param_4); + current.angle.y = temp_r3->atan2sX_Z(); + + if (param_4->GetTgHitGObj() != NULL) { + if (param_4->GetTgHitGObj()->GetAtMtrl() == dCcD_MTRL_ICE) { + onNoResetFlg1(FLG1_ICE_FREEZE); + } + } + } + + var_r30 = getDirectionFromAngle((current.angle.y - shape_angle.y)); + } else if (param_0 == -6) { + current.angle.y = field_0x3102 + 0x8000; + var_r30 = getDirectionFromAngle((current.angle.y - shape_angle.y)); + offModeFlg(8); + field_0x3480 = 1.0f; + } else { + if (checkWolf()) { + if (param_0 == 0x2D) { + var_r30 = 1; + } else if (param_0 == 0x2E) { + var_r30 = 2; + } else if (param_0 == 0x2F) { + var_r30 = 3; + } else { + var_r30 = 0; + } + } else if (param_0 == 0x88) { + var_r30 = 1; + } else if (param_0 == 0x89) { + var_r30 = 2; + } else if (param_0 == 0x8A) { + var_r30 = 3; + } else { + var_r30 = 0; + } + setOldRootQuaternion(param_2, 0, param_3); + mFallVoiceInit = 1; + } + + if (var_r30 == 0) { + if (checkWolf()) { + field_0x3198 = 0x29; + mProcVar2.field_0x300c = 0; + } else { + field_0x3198 = 0x84; + mProcVar2.field_0x300c = 0x3FFF; + } + + mProcVar3.field_0x300e = 1; + shape_angle.y = current.angle.y; + } else if (var_r30 == 3) { + if (checkWolf()) { + field_0x3198 = 0x2A; + mProcVar2.field_0x300c = 0x2000; + } else { + field_0x3198 = 0x85; + mProcVar2.field_0x300c = 0x3FFF; + } + + mProcVar3.field_0x300e = 0; + shape_angle.y = current.angle.y + 0x4000; + } else if (var_r30 == 2) { + if (checkWolf()) { + field_0x3198 = 0x2B; + mProcVar2.field_0x300c = -0x2000; + } else { + field_0x3198 = 0x86; + mProcVar2.field_0x300c = -0x3FFF; + } + + mProcVar3.field_0x300e = 0; + shape_angle.y = current.angle.y - 0x4000; + } else { + if (checkWolf()) { + field_0x3198 = 0x28; + mProcVar2.field_0x300c = -0x3FFF; + } else { + field_0x3198 = 0x83; + mProcVar2.field_0x300c = -0x3FFF; + } + + mProcVar3.field_0x300e = 1; + shape_angle.y = current.angle.y + 0x8000; + } + + const daAlinkHIO_wlDamLaHu_c1* var_r29; + const daAlinkHIO_damLaHu_c1* var_r28; + if (checkWolf()) { + if (param_1 != 0) { + var_r29 = &daAlinkHIO_wlDamLarge_c0::m; + } else { + var_r29 = &daAlinkHIO_wlDamHuge_c0::m; + } + + setSpecialGravity(var_r29->field_0x54, maxFallSpeed, 0); + mProcVar4.field_0x3010 = var_r29->field_0x50; + field_0x3478 = var_r29->field_0x64; + field_0x347c = var_r29->field_0x68; + setSingleAnimeWolfBaseMorf((daAlink_c::daAlink_WANM)field_0x3198, var_r29->field_0x58); + setFaceBasicTexture(FTANM_UNK_91); + } else { + if (param_1 != 0) { + var_r28 = &daAlinkHIO_damLarge_c0::m; + } else { + var_r28 = &daAlinkHIO_damHuge_c0::m; + } + + setSpecialGravity(var_r28->field_0xA4, maxFallSpeed, 0); + mProcVar4.field_0x3010 = var_r28->field_0xA0; + field_0x3478 = var_r28->field_0xB4; + field_0x347c = var_r28->field_0xB8; + setSingleAnimeBaseMorf((daAlink_c::daAlink_ANM)field_0x3198, var_r28->field_0xA8); + } + + if (param_0 < 0) { + if (checkBoarSingleBattle() && dComIfGp_getHorseActor() != NULL && dComIfGp_getHorseActor()->checkCowHit()) { + mNormalSpeed = 80.0f; + speed.y = 80.0f; + onModeFlg(0x2000); + } else if (param_1 == 0 && checkMiddleBossGoronRoom()) { + mNormalSpeed = 60.0f; + speed.y = 30.0f; + } else if (param_0 == -3) { + mNormalSpeed = field_0x3408; + speed.y = field_0x340c; + } else { + if (checkWolf()) { + mNormalSpeed = var_r29->field_0x5C; + speed.y = var_r29->field_0x60; + } else { + mNormalSpeed = var_r28->field_0xAC; + speed.y = var_r28->field_0xB0; + } + + if (param_0 == -6) { + field_0x3478 = 1000.0f; + } + } + + if (param_5 != 2) { + if (param_0 != -6) { + if (checkWolf()) { + voiceStart(Z2SE_WL_V_DAMAGE); + } else if (checkFreezeDamage()) { + voiceStart(Z2SE_AL_V_DAMAGE_FREEZE); + } else { + voiceStart(Z2SE_AL_V_DAMAGE_L); + } + } + + if (checkFreezeDamage()) { + seStartOnlyReverb(Z2SE_AL_FREEZE); + } else { + seStartOnlyReverb(Z2SE_AL_DAMAGE_LARGE); + } + } + } else { + if (checkWolf()) { + mNormalSpeed = var_r29->field_0x64; + } else { + mNormalSpeed = var_r28->field_0xB4; + } + + current.pos.x += 35.0f * cM_ssin(current.angle.y); + current.pos.z += 35.0f * cM_scos(current.angle.y); + speed.y = 0.0f; + } + + mBodyAngle.set(0, 0, 0); + + mProcVar0.field_0x3008 = 0; + mProcVar1.field_0x300a = param_1; + mProcVar5.field_0x3012 = 0x14; + + if (checkBoarSingleBattle()) { + mLinkAcch.SetWallNone(); + mLinkAcch.OffLineCheck(); + onModeFlg(0x4000); + } + + if (sp10) { + onModeFlg(0x2000); + field_0x32cc = 5; + } + + return 1; } /* 800D9E88-800DA180 0D47C8 02F8+00 1/0 0/0 0/0 .text procCoLargeDamage__9daAlink_cFv */ int daAlink_c::procCoLargeDamage() { - // NONMATCHING - return 0; + if (field_0x32cc != 0) { + field_0x32cc--; + } else { + offModeFlg(0x2000); + } + + if (checkWolf() || !checkUnderMove0BckNoArc(ANM_FALL)) { + s16* var_r27; + if (mProcVar3.field_0x300e != 0) { + var_r27 = &field_0x3080; + } else { + var_r27 = &field_0x3082; + } + + cLib_chaseAngleS(var_r27, mProcVar2.field_0x300c, mProcVar4.field_0x3010); + } + + cLib_chaseF(&mNormalSpeed, 0.0f, field_0x347c); + + if (mProcVar0.field_0x3008 == 0) { + mProcVar0.field_0x3008 = 1; + return 1; + } + + offModeFlg(0x2000); + + if (!checkWolf()) { + setFallVoice(); + } + + if ((mLinkAcch.i_ChkGroundHit() || checkEndResetFlg2(ERFLG2_UNK_100)) && !checkBoarSingleBattle()) { + if (checkWolf()) { + procWolfLargeDamageUpInit(field_0x3198, mProcVar1.field_0x300a, field_0x3080, field_0x3082); + } else { + BOOL temp_r26 = field_0x3480 > 0.0f; + procLargeDamageUpInit(field_0x3198, mProcVar1.field_0x300a, field_0x3080, field_0x3082); + + if (temp_r26) { + offModeFlg(8); + checkCutLandDamage(); + } + } + } else if (checkBoarSingleBattle()) { + if (!checkUnderMove0BckNoArc(ANM_FALL) && field_0x2060->getOldFrameRate() < 0.1f) { + if (mProcVar5.field_0x3012 != 0) { + mProcVar5.field_0x3012--; + } else { + voiceStart(Z2SE_AL_V_FALL); + setSingleAnimeBaseMorf(ANM_FALL, daAlinkHIO_damage_c0::m.mInvertedFallInterpolation); + setOldRootQuaternion(field_0x3080, 0, field_0x3082); + field_0x3080 = 0; + field_0x3082 = 0; + } + } + } else if (mLinkAcch.ChkWallHit() && mNormalSpeed > field_0x3478) { + cXyz sp14; + cXyz sp8; + dBgS_AcchCir* var_r29 = mAcchCir; + + for (int i = 0; i < 3; i++, var_r29++) { + if (var_r29->ChkWallHit()) { + sp14.set(current.pos.x, current.pos.y + var_r29->GetWallH(), current.pos.z); + sp8.set(sp14.x + (cM_ssin(current.angle.y) * (var_r29->GetWallR() + 25.0f)), sp14.y, sp14.z + (cM_scos(current.angle.y) * (var_r29->GetWallR() + 25.0f))); + + if (commonLineCheck(&sp14, &sp8)) { + return procCoLargeDamageWallInit(field_0x3198, mProcVar1.field_0x300a, field_0x3080, field_0x3082); + } + } + } + } + + return 1; } /* 800DA180-800DA554 0D4AC0 03D4+00 2/2 0/0 0/0 .text procLargeDamageUpInit__9daAlink_cFiiss */ int daAlink_c::procLargeDamageUpInit(int param_0, int param_1, s16 param_2, s16 param_3) { - // NONMATCHING - return 0; + if (!commonProcInitNotSameProc(PROC_LARGE_DAMAGE_UP)) { + return 0; + } + + const daAlinkHIO_damLaHu_c1* var_r30; + if (param_1 != 0) { + var_r30 = &daAlinkHIO_damLarge_c0::m; + } else { + var_r30 = &daAlinkHIO_damHuge_c0::m; + } + + mProcVar1.field_0x300a = 0; + mProcVar2.field_0x300c = 0; + field_0x3198 = param_0; + offGoatStopGame(); + mProcVar4.field_0x3010 = 0; + + if (param_0 == -4) { + onNoResetFlg2(FLG2_UNK_1000); + mProcVar0.field_0x3008 = 0; + mProcVar1.field_0x300a = 1; + mProcVar2.field_0x300c = 1; + + voiceStart(Z2SE_AL_V_DAMAGE_COMIC); + seStartOnlyReverb(Z2SE_AL_DAMAGE_LARGE); + setSingleAnimeBase(ANM_DMG_FBW); + + field_0x32cc = 0x88; + field_0x3478 = var_r30->field_0x14.mCheckFrame; + field_0x3480 = 39.0f; + field_0x3484 = 1000.0f; + } else if (param_0 < 0) { + daAlink_ANM var_r28; + s16 var_r27; + f32 var_f29; + f32 var_f30; + f32 var_f31; + + if (param_0 == -3) { + var_r28 = ANM_DMG_AIR_LAND; + var_f29 = 0.0f; + var_r27 = -1; + var_f30 = 5.0f; + var_f31 = 1.0f; + + mProcVar0.field_0x3008 = -1; + field_0x3478 = var_r30->field_0x0.mCheckFrame; + field_0x3480 = 39.0f; + field_0x2f9d = 4; + field_0x3484 = 18.0f; + } else { + if (param_0 == -2) { + var_f30 = 0.0f; + } else { + var_f30 = daAlinkHIO_damLarge_c0::m.field_0x14.mInterpolation; + } + + field_0x3484 = 9.0f; + var_r28 = ANM_DMG_LARGE_LAND; + var_f29 = 9.0f; + var_r27 = -1; + field_0x3478 = var_r30->field_0x14.mCheckFrame; + + if (param_0 == -5 && mDemo.getParam1() > 0) { + mProcVar0.field_0x3008 = mDemo.getParam1(); + var_f31 = 0.0f; + } else if (param_0 == -2 && mDemo.getDemoType() == 1) { + mProcVar0.field_0x3008 = 0x1E; + var_f31 = 0.0f; + } else { + mProcVar0.field_0x3008 = -1; + var_f31 = daAlinkHIO_damage_c0::m.mRecoverStandAnmSpeed; + } + + mProcVar1.field_0x300a = 1; + mProcVar2.field_0x300c = 1; + field_0x3480 = 39.0f; + } + + setSingleAnime(var_r28, var_f31, var_f29, var_r27, var_f30); + field_0x32cc = var_r28; + } else { + mProcVar0.field_0x3008 = 0; + + dComIfGp_getVibration().StartShock(6, 0x1F, cXyz(0.0f, 1.0f, 0.0f)); + seStartMapInfo(Z2SE_BODY_FALL_DOWN); + field_0x2f9d = 4; + + if (param_0 == 0x84) { + setSingleAnimeParam(ANM_DMG_LARGE_LAND, &var_r30->field_0x14); + field_0x3478 = var_r30->field_0x14.mCheckFrame; + mProcVar1.field_0x300a = 1; + field_0x3480 = 39.0f; + field_0x32cc = 0x88; + field_0x3484 = 9.0f; + } else if (param_0 == 0x85) { + setSingleAnimeParam(ANM_DMG_AIR_LEFT_LAND, &var_r30->field_0x28); + field_0x3478 = var_r30->field_0x28.mCheckFrame; + field_0x3480 = 29.0f; + field_0x32cc = 0x89; + field_0x3484 = 6.0f; + } else if (param_0 == 0x86) { + setSingleAnimeParam(ANM_DMG_AIR_RIGHT_LAND, &var_r30->field_0x3C); + field_0x3478 = var_r30->field_0x3C.mCheckFrame; + field_0x3480 = 29.0f; + field_0x32cc = 0x8A; + field_0x3484 = 6.0f; + } else { + setSingleAnimeParam(ANM_DMG_AIR_LAND, &var_r30->field_0x0); + field_0x3478 = var_r30->field_0x0.mCheckFrame; + field_0x3480 = 39.0f; + field_0x32cc = 0x87; + field_0x3484 = 18.0f; + } + + if (param_1 != 0) { + mProcVar4.field_0x3010 = 1; + } + } + + field_0x33cc = 1.0f; + field_0x347c = 2.0f / (field_0x3478 - mUnderFrameCtrl[0].getStart()); + setOldRootQuaternion(param_2, 0, param_3); + mNormalSpeed = 0.0f; + current.angle.y = shape_angle.y; + setFootEffectProcType(4); + return 1; } /* 800DA554-800DA82C 0D4E94 02D8+00 1/0 0/0 0/0 .text procLargeDamageUp__9daAlink_cFv */ int daAlink_c::procLargeDamageUp() { - // NONMATCHING - return 0; + daPy_frameCtrl_c* temp_r30 = &mUnderFrameCtrl[0]; + mProcVar4.field_0x3010 = 0; + field_0x33cc = field_0x347c * (field_0x3478 - temp_r30->getFrame()); + onEndResetFlg0(ERFLG0_UNK_8000000); + + if (field_0x3198 == -4) { + if (checkNoResetFlg2(FLG2_UNK_1000)) { + return 1; + } + + setSingleAnime(ANM_DMG_LARGE_LAND, daAlinkHIO_damLarge_c0::m.field_0x14.mSpeed, 9.0f, -1, daAlinkHIO_damLarge_c0::m.field_0x14.mInterpolation); + field_0x3198 = -3; + field_0x347c = 2.0f / (field_0x3478 - 9.0f); + } + + if (mProcVar0.field_0x3008 > 0) { + mProcVar0.field_0x3008--; + + if (mProcVar0.field_0x3008 == 0) { + mProcVar0.field_0x3008 = -1; + setWaterInAnmRate(temp_r30, daAlinkHIO_damage_c0::m.mRecoverStandAnmSpeed); + temp_r30->offEndFlg(); + } + } else { + if (temp_r30->getFrame() > field_0x3480) { + field_0x2f92 = 1; + field_0x2f93 = 6; + } + + if (checkAnmEnd(temp_r30)) { + offModeFlg(0x04000000); + + if ((checkEventRun() && mProcVar0.field_0x3008 < 0) || mDemo.getDemoMode() == 0x1B || mDemo.getDemoMode() == 9) { + dComIfGp_evmng_cutEnd(field_0x3184); + } else { + checkNextAction(0); + } + } else if (temp_r30->getFrame() > field_0x3478) { + if (!checkEventRun()) { + onModeFlg(4); + } + + checkNextAction(1); + } else if (mProcVar2.field_0x300c != 0 && temp_r30->checkPass(18.0f)) { + voiceStart(Z2SE_AL_V_LANDING_FAIL_2); + mProcVar2.field_0x300c = 0; + } else if (checkNoResetFlg0(FLG0_UNK_200000)) { + onModeFlg(0x04000000); + + if (!dMsgObject_isTalkNowCheck() && temp_r30->getFrame() > 19.0f) { + temp_r30->setFrame(19.0f); + getNowAnmPackUnder(UNDER_0)->setFrame(19.0f); + } else if (dMsgObject_isTalkNowCheck()) { + offNoResetFlg0(FLG0_UNK_200000); + } + } else if (checkEndResetFlg1(ERFLG1_UNK_8000000) && temp_r30->getFrame() > field_0x3484) { + temp_r30->setFrame(field_0x3484); + getNowAnmPackUnder(UNDER_0)->setFrame(field_0x3484); + } + } + + return 1; } /* 800DA82C-800DAC28 0D516C 03FC+00 1/1 0/0 0/0 .text procCoLargeDamageWallInit__9daAlink_cFiiss */ int daAlink_c::procCoLargeDamageWallInit(int param_0, int param_1, s16 param_2, s16 param_3) { - // NONMATCHING - return 0; + if (mProcID == PROC_LARGE_DAMAGE_WALL) { + return 0; + } + + cM3dGPla sp18; + dComIfG_Bgsp().GetTriPla(mLinkLinChk, &sp18); + s16 temp_r26 = sp18.mNormal.atan2sX_Z(); + + if (param_0 < 0 || !cBgW_CheckBWall(sp18.mNormal.y) || cLib_distanceAngleS(temp_r26, (current.angle.y - 0x8000)) > cM_deg2s(30.0f)) { + return 0; + } + + commonProcInit(PROC_LARGE_DAMAGE_WALL); + + s16 temp_r29 = cM_atan2s(sp18.mNormal.y, sp18.mNormal.absXZ()); + + current.angle.y = temp_r26; + current.pos.x = mLinkLinChk.i_GetCross().x; + current.pos.z = mLinkLinChk.i_GetCross().z; + + setOldRootQuaternion(param_2, 0, param_3); + + if (checkWolf()) { + if (param_0 == 0x29) { + field_0x3198 = 0x2D; + setSingleAnimeWolfBase(WANM_DMG_AIR_FRONT); + field_0x3080 = temp_r29; + } else if (param_0 == 0x2A) { + field_0x3198 = 0x2E; + setSingleAnimeWolf(WANM_DMG_AIR_LEFT_GETUP, 1.0f, 2.0f, 3, 3.0f); + field_0x3082 = temp_r29 - 0x4000; + } else if (param_0 == 0x2B) { + field_0x3198 = 0x2F; + setSingleAnimeWolf(WANM_DMG_AIR_RIGHT_GETUP, 1.0f, 2.0f, 3, 3.0f); + field_0x3082 = 0x4000 - temp_r29; + } else { + field_0x3198 = 0x2C; + setSingleAnimeWolfBase(WANM_DMG_AIR_BACK); + field_0x3080 = -temp_r29; + } + + setFaceBasicTexture(FTANM_UNK_91); + } else { + const daAlinkHIO_damLaHu_c1* var_r28; + if (param_1 != 0) { + var_r28 = &daAlinkHIO_damLarge_c0::m; + } else { + var_r28 = &daAlinkHIO_damHuge_c0::m; + } + + if (param_0 == 0x84) { + field_0x3198 = 0x88; + setSingleAnimeParam(ANM_DMG_LARGE_LAND, &var_r28->field_0x64); + field_0x3080 = temp_r29 - 0x4000; + } else if (param_0 == 0x85) { + field_0x3198 = 0x89; + setSingleAnimeParam(ANM_DMG_AIR_LEFT_LAND, &var_r28->field_0x78); + field_0x3082 = temp_r29 - 0x4000; + } else if (param_0 == 0x86) { + field_0x3198 = 0x8A; + setSingleAnimeParam(ANM_DMG_AIR_RIGHT_LAND, &var_r28->field_0x8C); + field_0x3082 = 0x4000 - temp_r29; + } else { + field_0x3198 = 0x87; + setSingleAnimeParam(ANM_DMG_AIR_LAND, &var_r28->field_0x50); + field_0x3080 = 0x4000 - temp_r29; + } + } + + mNormalSpeed = 0.0f; + speed.y = 0.0f; + setSpecialGravity(0.0f, maxFallSpeed, 0); + + dComIfGp_getVibration().StartShock(6, 0xF, cXyz(0.0f, 1.0f, 0.0f)); + mProcVar0.field_0x3008 = param_1; + return 1; } /* 800DAC28-800DAC84 0D5568 005C+00 1/0 0/0 0/0 .text procCoLargeDamageWall__9daAlink_cFv @@ -1012,8 +1574,50 @@ int daAlink_c::procCoPolyDamage() { /* 800DAE10-800DB060 0D5750 0250+00 2/2 0/0 0/0 .text procLandDamageInit__9daAlink_cFi */ int daAlink_c::procLandDamageInit(int param_0) { - // NONMATCHING - return 0; + f32 var_f31; + if (param_0 == 0) { + var_f31 = daAlinkHIO_damFall_c0::m.mSmallDmgLandStartFrame; + mProcVar0.field_0x3008 = daAlinkHIO_autoJump_c0::m.mSpinJumpLandStopTime; + + if (mProcID == PROC_MAGNE_BOOTS_FLY) { + dComIfGp_getVibration().StartShock(6, 0x1F, cXyz(0.0f, 1.0f, 0.0f)); + } else { + dComIfGp_getVibration().StartShock(2, 0xF, cXyz(0.0f, 1.0f, 0.0f)); + } + } else if (param_0 == 1) { + if (!checkEventRun()) { + setLandDamagePoint(4); + } + + var_f31 = daAlinkHIO_damFall_c0::m.mSmallDmgLandStartFrame; + mProcVar0.field_0x3008 = daAlinkHIO_damFall_c0::m.mSmallStopTime; + dComIfGp_getVibration().StartShock(4, 0x1F, cXyz(0.0f, 1.0f, 0.0f)); + } else { + if (!checkEventRun()) { + setLandDamagePoint(8); + } + + var_f31 = daAlinkHIO_damFall_c0::m.mLandAnm.mStartFrame; + mProcVar0.field_0x3008 = daAlinkHIO_damFall_c0::m.mBigStopTime; + dComIfGp_getVibration().StartShock(5, 0x1F, cXyz(0.0f, 1.0f, 0.0f)); + } + + commonProcInit(PROC_LAND_DAMAGE); + mNormalSpeed = 0.0f; + + if (param_0 == 0) { + offModeFlg(8); + } else { + seStartOnlyReverb(JA_SE_LK_FALL_DAMAGE); + voiceStart(Z2SE_AL_V_LANDING_FAIL); + } + + setSingleAnime(ANM_DMG_FALL, daAlinkHIO_damFall_c0::m.mLandAnm.mSpeed, var_f31, daAlinkHIO_damFall_c0::m.mLandAnm.mEndFrame, daAlinkHIO_damFall_c0::m.mLandAnm.mInterpolation); + field_0x3198 = 0; + field_0x2f9d = 4; + setFootEffectProcType(4); + onResetFlg1(RFLG1_UNK_30); + return 1; } /* 800DB060-800DB140 0D59A0 00E0+00 1/0 0/0 0/0 .text procLandDamage__9daAlink_cFv */ @@ -1044,14 +1648,123 @@ int daAlink_c::procLandDamage() { /* 800DB140-800DB418 0D5A80 02D8+00 1/1 0/0 0/0 .text * procCoElecDamageInit__9daAlink_cFP10fopAc_ac_cP12dCcD_GObjInfi */ int daAlink_c::procCoElecDamageInit(fopAc_ac_c* param_0, dCcD_GObjInf* param_1, int param_2) { - // NONMATCHING - return 0; + if (!dComIfGp_event_compulsory(this, NULL, 0xFFEF)) { + return 0; + } + + mDemo.setSpecialDemoType(); + u32 temp_r27 = checkModeFlg(0x70C52); + + if (mCopyRodAcKeep.getActor() != NULL) { + ((daCrod_c*)mCopyRodAcKeep.getActor())->offControll(); + } + + if (param_0 != NULL) { + param_0->actor_status |= 0x800; + } + + commonProcInit(PROC_ELEC_DAMAGE); + mNormalSpeed = 0.0f; + mProcVar2.field_0x300c = 0; + + daAlink_ANM var_r29; + daAlink_WANM var_r28; + if ((mLinkAcch.i_ChkGroundHit() && !temp_r27) || checkMagneBootsOn()) { + if (mEquipItem == IRONBALL) { + setIronBallWaitUpperAnime(1); + } + var_r29 = ANM_ELEC_STUN_GND; + var_r28 = WANM_DMG_ELEC_GROUND; + } else { + var_r29 = ANM_ELEC_STUN_AIR; + var_r28 = WANM_DMG_ELEC_AIR; + + setSpecialGravity(0.0f, maxFallSpeed, 0); + speed.y = 0.0f; + + if (!checkModeFlg(0x40000)) { + setJumpMode(); + } else { + dComIfGp_setPlayerStatus0(0, 0x100000); + field_0x2f99 = 0xF; + field_0x3588 = l_waitBaseAnime; + field_0x33b0 = -50.0f; + + if (getZoraSwim()) { + current.pos.y += 50.0f; + field_0x3080 += 0x4000; + } + } + } + + if (!dComIfGp_checkCameraAttentionStatus(field_0x317c, 2) && !dComIfGp_checkCameraAttentionStatus(field_0x317c, 0x20)) { + dCam_getBody()->Stop(); + mProcVar2.field_0x300c = 1; + } + + if (checkWolf()) { + voiceStart(Z2SE_WL_V_DAMAGE_ELEC); + setSingleAnimeWolfBase(var_r28); + setFaceBasicTexture(FTANM_UNK_91); + } else { + voiceStart(Z2SE_AL_V_DAMAGE_ELEC); + setSingleAnimeBase(var_r29); + } + + mProcVar0.field_0x3008 = 0x2D; + mProcVar3.field_0x300e = 3; + + field_0x3198 = checkLargeAttack(param_2) | checkHugeAttack(param_2); + + if (param_1 != NULL) { + mProcVar4.field_0x3010 = getDamageVec(param_1)->atan2sX_Z(); + } else { + mProcVar4.field_0x3010 = shape_angle.y + 0x8000; + } + + dComIfGp_clearPlayerStatus0(0, 0x4000); + return 1; } /* 800DB418-800DB5B0 0D5D58 0198+00 1/0 0/0 0/0 .text procCoElecDamage__9daAlink_cFv */ int daAlink_c::procCoElecDamage() { - // NONMATCHING - return 0; + seStartOnlyReverbLevel(Z2SE_AL_ELEC_DAMAGE); + + if (checkModeFlg(0x40000) && field_0x2f99 != 0xF) { + field_0x2f99 = 7; + daPy_addCalcShort(&field_0x3080, 0, 4, 0xC00, 0x180); + } + + if (mProcVar3.field_0x300e != 0) { + dComIfGp_getVibration().StartQuake(5, 1, cXyz(0.0f, 1.0f, 0.0f)); + mProcVar3.field_0x300e--; + } + + if (mProcVar0.field_0x3008 != 0) { + mProcVar0.field_0x3008--; + } else { + if (mProcVar2.field_0x300c != 0) { + dCam_getBody()->Start(); + } + + resetSpecialEvent(); + dComIfGp_getVibration().StopQuake(0x1F); + + if (checkModeFlg(2) || field_0x3198 != 0) { + current.angle.y = mProcVar4.field_0x3010; + procCoLargeDamageInit(-1, 1, 0, 0, NULL, 2); + } else if (checkModeFlg(0x40000)) { + if (checkWolf()) { + procWolfSwimWaitInit(0); + } else { + procSwimWaitInit(0); + } + } else if (mProcID == PROC_ELEC_DAMAGE) { + checkWaitAction(); + } + } + + return 1; } /* 800DB5B0-800DB610 0D5EF0 0060+00 2/2 0/0 0/0 .text procStEscapeInit__9daAlink_cFv */ @@ -1082,15 +1795,97 @@ int daAlink_c::procStEscape() { } /* 800DB6A4-800DB860 0D5FE4 01BC+00 1/1 0/0 0/0 .text procDkCaughtInit__9daAlink_cFUi */ -int daAlink_c::procDkCaughtInit(unsigned int param_0) { - // NONMATCHING - return 0; +int daAlink_c::procDkCaughtInit(fpc_ProcID param_0) { + if (!commonProcInitNotSameProc(PROC_DK_CAUGHT)) { + return 0; + } + + if (checkZeroSpeedF()) { + onModeFlg(1); + } + + setSingleAnimeBase(ANM_WAIT_D_B); + onNoResetFlg1(FLG1_UNK_1); + + field_0x28f8 = param_0; + mNormalSpeed = 0.0f; + mProcVar0.field_0x3008 = daAlinkHIO_damCaught_c0::m.field_0x14; + + fopAc_ac_c* temp_r3 = fopAcM_SearchByID(field_0x28f8); + if (temp_r3 != NULL) { + field_0x3478 = temp_r3->home.pos.abs(current.pos); + } + + field_0x594 = 13.0f; + return 1; } /* 800DB860-800DBC98 0D61A0 0438+00 1/0 0/0 0/0 .text procDkCaught__9daAlink_cFv */ int daAlink_c::procDkCaught() { - // NONMATCHING - return 0; + fopAc_ac_c* temp_r3 = fopAcM_SearchByID(field_0x28f8); + if (temp_r3 == NULL || !checkNoResetFlg1(FLG1_UNK_1)) { + voiceStart(Z2SE_AL_V_ZENTEN_FAIL_2); + return procFrontRollSuccessInit(); + } + + if (checkCaughtEscapeCutTurn()) { + return 1; + } + + cXyz sp38 = temp_r3->home.pos - current.pos; + multVecMagneBootInvMtx(&sp38); + cLib_addCalcAngleS(&shape_angle.y, sp38.atan2sX_Z(), 2, 0x2000, 0x800); + + cXyz sp2C = current.pos - temp_r3->home.pos; + f32 temp_f1 = sp2C.abs(); + if (temp_f1 > field_0x3478) { + current.pos = temp_r3->home.pos + ((sp2C * field_0x3478) / temp_f1); + } + + f32 var_f30; + if (checkInputOnR()) { + if (getDirectionFromCurrentAngle() == 1) { + current.angle.y += 0x8000; + mNormalSpeed *= -1.0f; + } + + if (checkZeroSpeedF()) { + current.angle.y = field_0x2fe2; + } + + s16 temp_r28 = current.angle.y; + cLib_addCalcAngleS(¤t.angle.y, field_0x2fe2, daAlinkHIO_atnMove_c0::m.mTurnAngleRate, daAlinkHIO_atnMove_c0::m.mMaxTurnAngle, daAlinkHIO_atnMove_c0::m.mMinTurnAngle); + var_f30 = daAlinkHIO_atnMove_c0::m.mAcceleration * field_0x33a8 * cM_scos((current.angle.y - temp_r28)); + } else { + var_f30 = 0.0f; + } + + setNormalSpeedF(var_f30, daAlinkHIO_atnMove_c0::m.mDeceleration); + + if (checkZeroSpeedF()) { + onModeFlg(1); + } else { + offModeFlg(1); + } + + mProcVar0.field_0x3008--; + + if (escapeTrigger()) { + mProcVar0.field_0x3008 -= daAlinkHIO_damCaught_c0::m.field_0x16; + } + + if (checkInputOnR() && abs((s16)(mStickAngle - mPrevStickAngle)) > 0x1000) { + mProcVar0.field_0x3008 -= daAlinkHIO_damCaught_c0::m.field_0x16; + } + + if (mProcVar0.field_0x3008 < 0) { + voiceStart(Z2SE_AL_V_ZENTEN_FAIL_2); + procFrontRollSuccessInit(); + } else { + voiceStartLevel(Z2SE_AL_V_BITTEN_LOOP); + } + + return 1; } /* 800DBC98-800DBD1C 0D65D8 0084+00 2/2 0/0 0/0 .text setScreamWaitAnime__9daAlink_cFv */