/** * d_a_player_whide.inc * * Code relating to "wall hiding" (sidling). * * This file is not a standalone translation unit and is instead directly * included into d_a_player_main.cpp. * * The original name of this file is not known, but a best guess was taken * based on the original names of the functions it contains. */ #include "d/dolzel.h" // IWYU pragma: keep #include "d/actor/d_a_player_HIO.h" #include "d/actor/d_a_player_main.h" /* 8013707C-801371E0 .text setBlendWHideMoveAnime__9daPy_lk_cFf */ void daPy_lk_c::setBlendWHideMoveAnime(f32 param_0) { f32 fVar1; f32 fVar5; daPy_ANM dVar6; s16 sVar1; f32 fVar6; f32 fVar3; daPy_ANM dVar5; if (!checkNoResetFlg0(daPyFlg0_UNK10000)) { fVar1 = m_HIO->mWall.m.field_0x14; fVar5 = m_HIO->mWall.m.field_0x40; dVar6 = ANM_WALL; sVar1 = m_HIO->mWall.m.field_0x8; fVar6 = m_HIO->mWall.m.field_0x60; fVar3 = m_HIO->mWall.m.field_0x58; if (mDirection == DIR_LEFT) { dVar5 = ANM_WALLWR; } else { dVar5 = ANM_WALLWL; } } else { fVar1 = m_HIO->mWall.m.field_0x18; fVar5 = m_HIO->mWall.m.field_0x44; dVar6 = ANM_WALLDW; sVar1 = m_HIO->mWall.m.field_0xA; fVar6 = m_HIO->mWall.m.field_0x64; fVar3 = m_HIO->mWall.m.field_0x5C; if (mDirection == DIR_LEFT) { dVar5 = ANM_WALLWRDW; } else { dVar5 = ANM_WALLWLDW; } } fVar5 *= param_0; f32 fVar7; fVar7 = mNormalSpeed / mMaxNormalSpeed; if (fVar7 < 0.0f) { fVar7 = 0.0f; } f32 fVar4; if (fVar7 < fVar3) { fVar4 = 1.0f - fVar7 / fVar3; m3598 = 1.0f; } else { fVar4 = 0.0f; m3598 = (1.0f - ((1.0f - fVar6) * (fVar7 - fVar3)) / (1.0f - fVar3)); } setMoveAnime(fVar4, fVar1, 0.0f, dVar5, dVar6, 5, fVar5); mFrameCtrlUnder[UNDER_MOVE0_e].setEnd(sVar1); mFrameCtrlUnder[UNDER_MOVE1_e].setFrame(mFrameCtrlUnder[UNDER_MOVE1_e].getEnd() - 0.001f); mFrameCtrlUnder[UNDER_MOVE1_e].setRate(0.0f); mAnmRatioUnder[UNDER_MOVE1_e].getAnmTransform()->setFrame(mFrameCtrlUnder[UNDER_MOVE1_e].getFrame()); } /* 801371E0-80137608 .text getWHideModePolygon__9daPy_lk_cFP4cXyzP4cXyzP4cXyzi */ cM3dGPla* daPy_lk_c::getWHideModePolygon(cXyz* i_start, cXyz* i_end, cXyz* param_2, int direction) { if (i_start != NULL) { mLinkLinChk.Set(i_start, i_end, this); if (!dComIfG_Bgsp()->LineCross(&mLinkLinChk)) { return NULL; } } cM3dGPla* triPla = dComIfG_Bgsp()->GetTriPla(mLinkLinChk); s16 sVar7 = cM_atan2s(triPla->GetNP()->x, triPla->GetNP()->z); if (std::fabsf(triPla->GetNP()->y) > 0.05f) { return NULL; } int iVar4 = dComIfG_Bgsp()->GetSpecialCode(mLinkLinChk); if (iVar4 == 3) { return NULL; } *param_2 = mLinkLinChk.GetCross(); cXyz local_3c; local_3c.x = param_2->x + cM_ssin(sVar7) * m_HIO->mWall.m.field_0x50; local_3c.y = param_2->y; local_3c.z = param_2->z + cM_ssin(sVar7) * m_HIO->mWall.m.field_0x50; mGndChk.SetPos(&local_3c); f32 f31 = dComIfG_Bgsp()->GroundCross(&mGndChk); if (-G_CM3D_F_INF != f31 && !cBgW_CheckBGround(dComIfG_Bgsp()->GetTriPla(mGndChk)->GetNP()->y)) { return NULL; } if (direction == DIR_NONE) { f31 = 49.9f; } else { f31 = 99.8f; } cXyz local_48; if (direction != DIR_RIGHT) { local_3c.set( param_2->x + (f31 * triPla->GetNP()->z) + (triPla->GetNP()->x * 1.25f), param_2->y, param_2->z - (f31 * triPla->GetNP()->x) + (triPla->GetNP()->z * 1.25f) ); local_48.set(local_3c.x - (2.5f * triPla->GetNP()->x), local_3c.y, local_3c.z - (2.5f * triPla->GetNP()->z)); mLinkLinChk.Set(&local_3c, &local_48, this); if (!dComIfG_Bgsp()->LineCross(&mLinkLinChk)) { return NULL; } cM3dGPla* triPla; triPla = dComIfG_Bgsp()->GetTriPla(mLinkLinChk); if (sVar7 != cM_atan2s(triPla->GetNP()->x, triPla->GetNP()->z)) { return NULL; } } if (direction != DIR_LEFT) { local_3c.set( param_2->x - (f31 * triPla->GetNP()->z) + (triPla->GetNP()->x * 1.25f), param_2->y, param_2->z + (f31 * triPla->GetNP()->x) + (triPla->GetNP()->z * 1.25f) ); local_48.set(local_3c.x - (2.5f * triPla->GetNP()->x), local_3c.y, local_3c.z - (2.5f * triPla->GetNP()->z)); mLinkLinChk.Set(&local_3c, &local_48, this); if (!dComIfG_Bgsp()->LineCross(&mLinkLinChk)) { return NULL; } cM3dGPla* triPla; triPla = dComIfG_Bgsp()->GetTriPla(mLinkLinChk); int iVar4 = cM_atan2s(triPla->GetNP()->x, triPla->GetNP()->z); if (sVar7 != iVar4) { return NULL; } } if (direction != DIR_NONE) { if (direction == DIR_LEFT) { sVar7 = sVar7 - shape_angle.y; param_2->x += m_HIO->mWall.m.field_0x54 * triPla->GetNP()->z; param_2->z -= m_HIO->mWall.m.field_0x54 * triPla->GetNP()->x; } else { sVar7 = shape_angle.y - sVar7; param_2->x -= m_HIO->mWall.m.field_0x54 * triPla->GetNP()->z; param_2->z += m_HIO->mWall.m.field_0x54 * triPla->GetNP()->x; } if (sVar7 > 0x2aaa) { return NULL; } } else if (abs((s16)((sVar7 + -0x8000) - (current.angle.y))) > 0x1555) { return NULL; } return triPla; } /* 80137608-80137640 .text getWHideBasePos__9daPy_lk_cFP4cXyz */ void daPy_lk_c::getWHideBasePos(cXyz* param_0) { f32 fVar3; if (checkNoResetFlg0(daPyFlg0_UNK10000)) { fVar3 = 89.9f; } else { fVar3 = 125.0f; } param_0->set(current.pos.x, current.pos.y + fVar3, current.pos.z); } /* 80137640-8013769C .text getWHideNextPos__9daPy_lk_cFP4cXyzP4cXyz */ void daPy_lk_c::getWHideNextPos(cXyz* param_0, cXyz* param_1) { param_1->set( param_0->x + cM_ssin(current.angle.y) * m_HIO->mWall.m.field_0x54, param_0->y, param_0->z + cM_scos(current.angle.y) * m_HIO->mWall.m.field_0x54 ); } /* 8013769C-80137754 .text checkWHideBackWall__9daPy_lk_cFP4cXyz */ BOOL daPy_lk_c::checkWHideBackWall(cXyz* param_0) { if (param_0 == NULL) { return true; } cXyz local_18; local_18.set(param_0->x - 25.0f * cM_ssin(shape_angle.y), param_0->y, param_0->z - 25.0f * cM_scos(shape_angle.y)); mLinkLinChk.Set(param_0, &local_18, this); if (dComIfG_Bgsp()->LineCross(&mLinkLinChk)) { return true; } return false; } /* 80137754-80137828 .text checkWHideFrontFloor__9daPy_lk_cFP4cXyz */ BOOL daPy_lk_c::checkWHideFrontFloor(cXyz* param_0) { cXyz local_10(param_0->x + 40.0f * cM_ssin(shape_angle.y), param_0->y, param_0->z + 40.0f * cM_scos(shape_angle.y)); mGndChk.SetPos(&local_10); f32 ground_y = dComIfG_Bgsp()->GroundCross(&mGndChk); if (checkNoResetFlg0(daPyFlg0_UNK80000000) && current.pos.y > ground_y) { ground_y = current.pos.y; } if (std::fabsf(ground_y - current.pos.y) < 5.0f) { return TRUE; } else { return FALSE; } } /* 80137828-80137914 .text checkWHideModeChange__9daPy_lk_cFP4cXyz */ int daPy_lk_c::checkWHideModeChange(cXyz* param_0) { if (!checkNoResetFlg0(daPyFlg0_UNK10000)) { if (!checkWHideFrontFloor(param_0)) { dComIfGp_setRStatus(dActStts_BLANK_e); } else if (spActionButton()) { return 1; } } else { cXyz local_18; local_18.set(param_0->x, current.pos.y + 125.0f, param_0->z); if (!spActionButton() && !mAcch.ChkRoofHit() && checkWHideBackWall(&local_18)) { return -1; } } if (checkModeFlg(ModeFlg_00000001) && mCurProc != daPyProc_WHIDE_PEEP_e) { setTextureAnime(mAnmDataTable[ANM_WALL].mTexAnmIdx, 0); } return 0; } /* 80137914-80137A00 .text changeWHideEndProc__9daPy_lk_cFP4cXyz */ int daPy_lk_c::changeWHideEndProc(cXyz* param_0) { dComIfGp_setDoStatus(dActStts_SIDLE_e); dComIfGp_setRStatus(dActStts_CROUCH_e); if ((!doButton() && (!checkNoResetFlg0(daPyFlg0_UNK10000) || !mAcch.ChkRoofHit())) || (!checkUpperAnime(dRes_INDEX_LKANM_BCK_REST_e) && swordTrigger()) || !checkWHideBackWall(param_0)) { mNormalSpeed = 0.7f * mMaxNormalSpeed; current.angle.y = shape_angle.y; return checkNextMode(0); } if (checkNoResetFlg0(daPyFlg0_UNK10000) && mAcch.ChkRoofHit()) { onModeFlg(ModeFlg_04000000); } else { offModeFlg(ModeFlg_04000000); } return false; } /* 80137A00-80137BD8 .text procWHideReady_init__9daPy_lk_cFP8cM3dGPlaP4cXyz */ BOOL daPy_lk_c::procWHideReady_init(cM3dGPla* param_0, cXyz* param_1) { BOOL uVar1 = checkModeFlg(ModeFlg_WHIDE) ? TRUE : FALSE; offNoResetFlg0(daPyFlg0_UNK10000); commonProcInit(daPyProc_WHIDE_READY_e); mNormalSpeed = 0.0f; current.angle.y = shape_angle.y; m370C.x = param_1->x; m370C.y = param_1->y; m370C.z = param_1->z; if (param_0 != NULL) { mProcVar2.m34D4 = cM_atan2s(param_0->mNormal.x, param_0->mNormal.z); m370C.x += param_0->mNormal.x * m_HIO->mWall.m.field_0x50; m370C.z += param_0->mNormal.z * m_HIO->mWall.m.field_0x50; } else { mProcVar2.m34D4 = m352C; m370C.x += cM_ssin(m352C) * m_HIO->mWall.m.field_0x50; m370C.z += cM_scos(m352C) * m_HIO->mWall.m.field_0x50; } if (mEquipItem == daPyItem_NONE_e) { if (checkEquipAnime()) { resetActAnimeUpper(UPPER_MOVE2_e, -1.0f); } setSingleMoveAnime(ANM_WALL, 0.0f, m_HIO->mWall.m.field_0x24, -1, m_HIO->mWall.m.field_0x34); mProcVar6.m3570 = 1; } else { setBlendMoveAnime(m_HIO->mBasic.m.field_0xC); setAnimeUnequip(); mProcVar6.m3570 = 0; } if (uVar1 != 0) { dComIfGp_setPlayerStatus0(0, daPyStts0_UNK1_e); } return true; } /* 80137BD8-80137CD0 .text procWHideReady__9daPy_lk_cFv */ BOOL daPy_lk_c::procWHideReady() { if (changeWHideEndProc(NULL)) { return true; } if (mProcVar6.m3570 == 0) { if (checkNoUpperAnime()) { setSingleMoveAnime(ANM_WALL, 0.0f, m_HIO->mWall.m.field_0x24, -1, m_HIO->mWall.m.field_0x34); mProcVar6.m3570 = 1; } return true; } cLib_addCalc(¤t.pos.x, m370C.x, 0.25f, 10.0f, 4.0f); cLib_addCalc(¤t.pos.z, m370C.z, 0.25f, 10.0f, 4.0f); if (!cLib_addCalcAngleS(&shape_angle.y, mProcVar2.m34D4, 2, 0x2000, 0x800)) { daPy_matAnm_c::offMabaFlg(); procWHideWait_init(); } return true; } /* 80137CD0-80137DF0 .text procWHideWait_init__9daPy_lk_cFv */ BOOL daPy_lk_c::procWHideWait_init() { f32 fVar1; daPy_ANM dVar3; f32 dVar4; f32 dVar5; s16 sVar2; if (!checkNoResetFlg0(daPyFlg0_UNK10000)) { dVar3 = ANM_WALL; sVar2 = m_HIO->mWall.m.field_0x0; dVar4 = m_HIO->mWall.m.field_0x38; } else { dVar3 = ANM_WALLDW; sVar2 = m_HIO->mWall.m.field_0x2; dVar4 = m_HIO->mWall.m.field_0x3C; } if (mCurProc == daPyProc_WHIDE_READY_e) { fVar1 = m_HIO->mWall.m.field_0x24; } else { fVar1 = sVar2 - 0.001f; } dVar5 = fVar1; commonProcInit(daPyProc_WHIDE_WAIT_e); mNormalSpeed = 0.0f; setSingleMoveAnime(dVar3, m_HIO->mWall.m.field_0xC, dVar5, sVar2, dVar4); current.angle.y = shape_angle.y; dComIfGp_setPlayerStatus0(0, daPyStts0_UNK1_e); return true; } /* 80137DF0-80138074 .text procWHideWait__9daPy_lk_cFv */ BOOL daPy_lk_c::procWHideWait() { cXyz cStack_3c; cXyz cStack_48; getWHideBasePos(&cStack_3c); if (changeWHideEndProc(&cStack_3c)) { return true; } int iVar1 = checkWHideModeChange(&cStack_3c); if (iVar1 == 1) { setSingleMoveAnime( ANM_WALLDW, m_HIO->mWall.m.field_0x10, m_HIO->mWall.m.field_0x28, m_HIO->mWall.m.field_0x2, m_HIO->mWall.m.field_0x3C ); onNoResetFlg0(daPyFlg0_UNK10000); mAcchCir[2].SetWallH(89.9f); } else if (iVar1 == -1) { setSingleMoveAnime( ANM_WALLDW, -m_HIO->mWall.m.field_0x10, m_HIO->mWall.m.field_0x28, m_HIO->mWall.m.field_0x2, m_HIO->mWall.m.field_0x3C ); mFrameCtrlUnder[UNDER_MOVE0_e].setFrame(m_HIO->mWall.m.field_0x2 - 0.001f); mAnmRatioUnder[UNDER_MOVE0_e].getAnmTransform()->setFrame(mFrameCtrlUnder[UNDER_MOVE0_e].getFrame()); offNoResetFlg0(daPyFlg0_UNK10000); mAcchCir[2].SetWallH(125.0f); } if (mStickDistance > 0.05f && -G_CM3D_F_INF != mAcch.GetGroundH() && cBgW_CheckBGround(dComIfG_Bgsp()->GetTriPla(mAcch.m_gnd)->GetNP()->y)) { int direction = getDirectionFromCurrentAngle(); if (direction == DIR_RIGHT || direction == DIR_LEFT) { if (direction == DIR_RIGHT) { current.angle.y = shape_angle.y + -0x4000; mDirection = DIR_RIGHT; } else { current.angle.y = shape_angle.y + 0x4000; mDirection = DIR_LEFT; } getWHideNextPos(&cStack_3c, &cStack_48); BOOL iVar1 = checkWHideBackWall(&cStack_48); if (iVar1 && (!checkNoResetFlg0(daPyFlg0_UNK10000) || checkWHideFrontFloor(&cStack_48))) { return procWHideMove_init(); } if (!iVar1) { cStack_48 += (cStack_48 - cStack_3c) * 0.25f; mLinkLinChk.Set(&cStack_3c, &cStack_48, this); if (!dComIfG_Bgsp()->LineCross(&mLinkLinChk)) { return procWHidePeep_init(); } } } } current.angle.y = shape_angle.y; return true; } /* 80138074-801380F0 .text procWHideMove_init__9daPy_lk_cFv */ BOOL daPy_lk_c::procWHideMove_init() { commonProcInit(daPyProc_WHIDE_MOVE_e); if (mDirection == DIR_LEFT) { current.angle.y = shape_angle.y + 0x4000; } else { current.angle.y = shape_angle.y + -0x4000; } setBlendWHideMoveAnime(1.0f); dComIfGp_setPlayerStatus0(0, daPyStts0_UNK1_e); return true; } /* 801380F0-8013852C .text procWHideMove__9daPy_lk_cFv */ BOOL daPy_lk_c::procWHideMove() { if (changeSlideProc()) { return true; } cXyz acStack_24; getWHideBasePos(&acStack_24); s16 uVar1 = current.angle.y; if (changeWHideEndProc(&acStack_24)) { if (!doButton() && mStickDistance > 0.05f) { uint uVar3 = (uint)uVar1; current.pos.x += 50.0f * cM_ssin(uVar3); current.pos.z += 50.0f * cM_scos(uVar3); } return true; } cM3dGPla* triPla = dComIfG_Bgsp()->GetTriPla(mLinkLinChk); s16 sVar8 = cM_atan2s(triPla->GetNP()->x, triPla->GetNP()->z); f32 fVar2; if (checkWHideModeChange(&acStack_24) != 0) { fVar2 = 0.0f; } else if (mStickDistance > 0.05f && -G_CM3D_F_INF != mAcch.GetGroundH() && cBgW_CheckBGround(dComIfG_Bgsp()->GetTriPla(mAcch.m_gnd)->GetNP()->y)) { int direction = getDirectionFromCurrentAngle(); if (direction == DIR_BACKWARD) { current.angle.y -= -0x8000; mNormalSpeed *= 0.5f; if (mDirection == DIR_LEFT) { mDirection = DIR_RIGHT; } else { mDirection = DIR_LEFT; } setBlendWHideMoveAnime(2.0f); } if (direction == DIR_FORWARD || direction == DIR_BACKWARD) { fVar2 = m_HIO->mMove.m.field_0x14; fVar2 *= mStickDistance; } else { fVar2 = 0.0f; } } else { fVar2 = 0.0f; } cXyz cStack_30; setNormalSpeedF(fVar2, 0.5f, 2.0f, 0.25f); getWHideNextPos(&acStack_24, &cStack_30); if (checkNoResetFlg0(daPyFlg0_UNK10000) && !checkWHideFrontFloor(&cStack_30)) { mNormalSpeed = 0.0f; return procWHideWait_init(); } cXyz cStack_3c; triPla = getWHideModePolygon(&acStack_24, &cStack_30, &cStack_3c, mDirection); if (triPla != NULL) { return procWHideReady_init(triPla, &cStack_3c); } if (std::fabsf(mNormalSpeed) <= 0.001f) { return procWHideWait_init(); } if (mAcch.GetGroundH() == -G_CM3D_F_INF || !cBgW_CheckBGround(dComIfG_Bgsp()->GetTriPla(mAcch.m_gnd)->GetNP()->y) || !checkWHideBackWall(&cStack_30)) { mNormalSpeed = 0.0f; return procWHideWait_init(); } cXyz cStack_48; if (sVar8 != shape_angle.y && getWHideModePolygon(NULL, NULL, &cStack_48, mDirection) != NULL) { if ((s16)(current.angle.y - shape_angle.y) > 0) { current.angle.y = sVar8 + 0x4000; } else { current.angle.y = sVar8 - 0x4000; } shape_angle.y = sVar8; current.pos.x += 8.0f * cM_ssin(current.angle.y); current.pos.z += 8.0f * cM_scos(current.angle.y); } current.pos.x -= 0.8f * m_HIO->mWall.m.field_0x50 * cM_ssin(shape_angle.y); current.pos.z -= 0.8f * m_HIO->mWall.m.field_0x50 * cM_scos(shape_angle.y); setBlendWHideMoveAnime(-1.0f); return true; } /* 8013852C-801385EC .text procWHidePeep_init__9daPy_lk_cFv */ BOOL daPy_lk_c::procWHidePeep_init() { commonProcInit(daPyProc_WHIDE_PEEP_e); f32 fVar1; f32 fVar3; f32 fVar2; s16 sVar4; daPy_ANM anm; if (!checkNoResetFlg0(daPyFlg0_UNK10000)) { fVar1 = m_HIO->mWall.m.field_0x1C; fVar3 = m_HIO->mWall.m.field_0x48; fVar2 = m_HIO->mWall.m.field_0x2C; sVar4 = m_HIO->mWall.m.field_0x4; if (mDirection == DIR_LEFT) { anm = ANM_WALLPR; } else { anm = ANM_WALLPL; } } else { fVar1 = m_HIO->mWall.m.field_0x20; fVar3 = m_HIO->mWall.m.field_0x4C; fVar2 = m_HIO->mWall.m.field_0x30; sVar4 = m_HIO->mWall.m.field_0x6; if (mDirection == DIR_LEFT) { anm = ANM_WALLPRDW; } else { anm = ANM_WALLPLDW; } } setSingleMoveAnime(anm, fVar1, fVar2, sVar4, fVar3); dComIfGp_setPlayerStatus0(0, daPyStts0_UNK1_e); return true; } /* 801385EC-801387A4 .text procWHidePeep__9daPy_lk_cFv */ BOOL daPy_lk_c::procWHidePeep() { cXyz cStack_38; getWHideBasePos(&cStack_38); if (changeWHideEndProc(&cStack_38)) { return true; } f32 dVar3 = mFrameCtrlUnder[UNDER_MOVE0_e].getRate(); if (std::fabsf(dVar3) < 0.01f) { if (mFrameCtrlUnder[UNDER_MOVE0_e].getFrame() < (mFrameCtrlUnder[UNDER_MOVE0_e].getStart() + 1)) { return procWHideWait_init(); } } if (std::fabsf(dVar3) < 0.01f) { if (mDirection == DIR_LEFT) { dComIfGp_setPlayerStatus0(0, daPyStts0_UNK40_e); } else { dComIfGp_setPlayerStatus0(0, daPyStts0_UNK20_e); } if (!checkNoResetFlg0(daPyFlg0_UNK10000)) { dVar3 = m_HIO->mWall.m.field_0x1C; } else { dVar3 = m_HIO->mWall.m.field_0x20; } } if (checkWHideModeChange(&cStack_38) != 0) { if (dVar3 > 0.0f) { mFrameCtrlUnder[UNDER_MOVE0_e].setRate(-dVar3); } } else if (mStickDistance > 0.05f) { int direction = getDirectionFromCurrentAngle(); if ((direction != DIR_FORWARD && dVar3 > 0.0f) || (direction == 0 && dVar3 < 0.0f)) { mFrameCtrlUnder[UNDER_MOVE0_e].setRate(-dVar3); } } else if (dVar3 > 0.0f) { mFrameCtrlUnder[UNDER_MOVE0_e].setRate(-dVar3); } return true; }