/** * d_a_alink_wolf.inc * General Player Wolf action handling */ #include "JSystem/J3DGraphBase/J3DMaterial.h" #include "d/actor/d_a_alink.h" #include "d/actor/d_a_e_pm.h" #include "d/actor/d_a_e_yc.h" #include "d/actor/d_a_e_ymb.h" #include "d/actor/d_a_horse.h" #include "d/actor/d_a_kago.h" #include "d/actor/d_a_kytag03.h" #include "d/actor/d_a_npc_gwolf.h" #include "d/actor/d_a_npc_moi.h" #include "d/actor/d_a_npc_tk.h" #include "d/actor/d_a_obj_crope.h" #include "d/actor/d_a_obj_smw_stone.h" #include "d/actor/d_a_obj_wchain.h" #include "d/actor/d_a_obj_wind_stone.h" #include "d/actor/d_a_obj_yobikusa.h" #include "d/actor/d_a_tag_howl.h" #include "d/actor/d_a_tag_wara_howl.h" #include "d/actor/d_a_tag_wljump.h" #include "d/actor/d_a_obj_lv4digsand.h" #include "d/actor/d_a_obj_digplace.h" #include "d/actor/d_a_obj_digsnow.h" #include "d/actor/d_a_obj_digholl.h" #include "d/actor/d_a_obj_sekizoa.h" #include "d/actor/d_a_midna.h" #include "d/d_com_inf_game.h" #include "d/d_msg_object.h" #include "f_op/f_op_kankyo_mng.h" #include "m_Do/m_Do_controller_pad.h" // Forward declarations (for clangd) int daAlink_kandelaarModelCallBack(J3DJoint* param_0, int param_1); extern BOOL l_debugMode; extern const char l_wArcName[]; extern const char l_bArcName[]; extern const char l_kArcName[]; extern const char l_zArcName[]; extern const char l_mArcName[]; extern const char l_hyShdArcName[]; extern const char l_cWShdArcName[]; extern const char l_sWShdArcName[]; extern const char l_arcName[]; extern dJntColData_c l_jntColData[]; extern dJntColData_c l_wolfJntColData[]; extern f32 l_autoUpHeight; extern f32 l_autoDownHeight; extern f32 const l_crawlStartFrontOffset[]; extern Vec const l_crawlFrontOffset; extern Vec const l_crawlBackOffset; extern Vec const l_crawlTopOffset; extern Vec const l_crawlFrontUpOffset; extern Vec const l_wolfLieFrontUpOffset; extern Vec const l_crawlBackUpOffset; extern Vec const l_wolfLieBackUpOffset; extern Vec const l_crawlStandUpOffset; extern Vec const l_wolfLieStandUpOffset; extern Vec const l_crawlTopUpOffset; extern Vec const l_wolfLieTopUpOffset; extern Vec const l_crawlSideOffset; extern Vec const l_wolfLieSideOffset; extern Vec const l_crawlMinSideOffset; extern f32 const l_wolfFootOnFrame[][4]; extern cXyz l_wolfBaseAnime; extern cXyz l_wolfRopeBaseAnime; void daAlink_c::changeCommon() { fopAcM_SetMtx(this, mpLinkModel->getBaseTRMtx()); model = mpLinkModel; m_oldFrameCalc->offOldFrameFlg(); field_0x2f8c = 0; resetUpperAnime(UPPER_2, -1.0f); offNoResetFlg1(FLG1_UNK_20000000); offKandelaarModel(); int i; for (i = 0; i < 2; i++) { mFootData1[i].field_0x2 = 0; mFootData1[i].field_0x4 = 0; mFootData1[i].field_0x6 = 0; mFootData2[i].field_0x2 = 0; mFootData2[i].field_0x4 = 0; mFootData2[i].field_0x6 = 0; } for (i = 0; i < 10; i++) { field_0x302c[i] = 0; field_0x3040[i] = 0; } for (i = 0; i < 3; i++) { field_0x3054[i] = 0; field_0x305a[i] = 0; } shape_angle.z = 0; field_0x2fec = 0; field_0x2fee = 0; mBodyAngle.set(0, 0, 0); field_0x3080 = 0; field_0x3082 = 0; offNoResetFlg1(daPy_FLG1(FLG1_DASH_MODE | FLG1_UNK_200000 | FLG1_UNK_80)); offNoResetFlg2(FLG2_UNK_8000000); field_0x2180[0]->init(); field_0x2180[1]->init(); mWolfEyeUpTimer = 0; resetCombo(TRUE); mItemTrigger = 0; mItemButton = 0; field_0x2ba4 = 0.0f; mFootSpeed = 0.0f; field_0x2fcc = 0; field_0x32a0[0].r = 0; field_0x32a0[0].g = 0; field_0x32a0[0].b = 0; field_0x32a0[1].r = 0; field_0x32a0[1].g = 0; field_0x32a0[1].b = 0; field_0x2fc4 = 0; mHotspringRecoverTimer = mpHIO->mBasic.m.mHotspringRecoverTime; field_0x2fc9 = 0x10; i = 0; for (; i < 4; i++) { clearFirePointDamageEffect(i); } field_0x30d0 = 0; field_0x30d2 = 0; field_0x2fc3 = 10; } void daAlink_c::changeWolf() { JKRHeap* current_heap = mAnmHeap3.setAnimeHeap(); mpLinkModel = initModel(static_cast(dComIfG_getObjectRes(l_wArcName, 14)), 0x20200); J3DModelData* chainModelData = static_cast(dComIfG_getObjectRes(l_wArcName, 15)); for (u16 i = 0; i < 4; i++) { mpWlChainModels[i] = initModel(chainModelData, 0); } mpWlMidnaModel = initModelEnv(static_cast(dComIfG_getObjectRes(l_wArcName, 10)), 0x1020200); mpWlMidnaMaskModel = initModel(static_cast(dComIfG_getObjectRes(l_wArcName, 7)), 0x1000000); mpWlMidnaHandModel = initModel(static_cast(dComIfG_getObjectRes(l_wArcName, 6)), 0x1000000); mpWlMidnaHairModel = initModelEnv(static_cast(dComIfG_getObjectRes(l_wArcName, 11)), 0x1000000); mpDMidnaBrk = static_cast(dComIfG_getObjectRes(l_wArcName, 18)); mpDMidnaBrk->searchUpdateMaterialID(mpWlMidnaModel->getModelData()); mpWlMidnaModel->getModelData()->entryTevRegAnimator(mpDMidnaBrk); mpDMidnaBrk->setFrame(1.0f); mpDMidnaMaskBrk = static_cast(dComIfG_getObjectRes(l_wArcName, 21)); mpDMidnaMaskBrk->searchUpdateMaterialID(mpWlMidnaMaskModel->getModelData()); mpWlMidnaMaskModel->getModelData()->entryTevRegAnimator(mpDMidnaMaskBrk); mpDMidnaMaskBrk->setFrame(1.0f); mpDMidnaHandBrk = static_cast(dComIfG_getObjectRes(l_wArcName, 20)); mpDMidnaHandBrk->searchUpdateMaterialID(mpWlMidnaHandModel->getModelData()); mpWlMidnaHandModel->getModelData()->entryTevRegAnimator(mpDMidnaHandBrk); mpDMidnaHandBrk->setFrame(1.0f); mpDMidnaHairHandBrk = static_cast(dComIfG_getObjectRes(l_wArcName, 19)); mpDMidnaHairHandBrk->searchUpdateMaterialID(mpWlMidnaHairModel->getModelData()); mpWlMidnaHairModel->getModelData()->entryTevRegAnimator(mpDMidnaHairHandBrk); mpDMidnaHairHandBrk->setFrame(1.0f); mDoExt_setCurrentHeap(current_heap); dComIfGs_setTransformStatus(1); mpLinkModel->setUserArea((uintptr_t)this); changeModelDataDirectWolf(0); mEyeHL1.entry(field_0x064C, "wl_eye_Hilight"); mEyeHL2.entry(mpWlMidnaModel->getModelData(), "midona_eye_Hlight"); field_0x064C->getMaterialNodePointer(4)->setMaterialAnm(field_0x2180[0]); field_0x064C->getMaterialNodePointer(5)->setMaterialAnm(field_0x2180[1]); field_0x06e8 = field_0x064C->getMaterialNodePointer(1)->getShape(); changeCommon(); onNoResetFlg1(FLG1_IS_WOLF); deleteEquipItem(FALSE, FALSE); field_0x2e44.init(this, l_wolfJntColData, mpLinkModel, 18); offNoResetFlg1(FLG1_UNK_800000); mHeight = 115.0f; mLinkAcch.SetRoofCrrHeight(mHeight); mMaxSpeed = mpHIO->mWolf.mWlMove.m.mMaxSpeed; l_autoUpHeight = mpHIO->mWolf.mWlWallHang.m.mAutoWalkHeight + 0.01f; l_autoDownHeight = -l_autoUpHeight; field_0x3470 = cM_scos(cM_deg2s(mpHIO->mWolf.mWlSlide.m.mSlidingAngle)); field_0x3122 = cM_deg2s(mpHIO->mWolf.mWlSlide.m.mClimbingAngle); field_0x3458 = -60.0f; field_0x345c = -130.0f; field_0x2e44.offPassNum(16); field_0x2e44.offPassNum(15); offNoResetFlg0(FLG0_WATER_IN_MOVE); setHeavyBoots(0); for (int i = 0; i < 3; i++) { field_0x3094[i] = 0; field_0x309a[i] = 0; } mZ2Link.setLinkState(1); field_0x30d6 = 0; field_0x2fa6 = 0; field_0x2e54.changeWaterOffset(mpHIO->mBasic.m.mWolfWaterSurfaceEffectHeight); field_0x2e54.changeRippleOffset(mHeight); mWoodSwordModel = NULL; field_0x3420 = 1.25f; field_0x30c6 = 40; field_0x30a8 = 3; field_0x30aa = 15; field_0x30ae = 0x1000; field_0x3424 = 8.0f; field_0x3428 = 50.0f; field_0x2f50 = &l_wolfLieSideOffset; field_0x2f54 = &l_wolfLieTopUpOffset; m_swordBlur.field_0x14 = 0; resetAtCollision(0); mLeftHandJntNo = 19; mRightHandJntNo = 24; mLeftItemJntNo = 19; mRightItemJntNo = 24; field_0x30c4 = 3; field_0x30b4 = 4; mLeftFootJnt = 31; mRightFootJnt = 36; field_0x32c4[0] = 1; field_0x32c4[1] = 2; field_0x30b6 = 2; attention_info.field_0xa = 50; dCcD_Cyl* cyl_p = mTgCyls; for (int i = 0; i < 3; i++, cyl_p++) { cyl_p->OffTgShieldFrontRange(); cyl_p->OffTgSmallShield(); cyl_p->OffTgSpShield(); cyl_p->OffTgShield(); } mAtSph.StartCAt(current.pos); mAtSph.OffAtSetBit(); mAtSph.OnTgSetBit(); mAtSph.OnCoSetBit(); mAtSph.SetR(40.0f); mpKanteraModel = NULL; mpLinkHatModel = NULL; mpLinkFaceModel = NULL; mpLinkHandModel = NULL; mMagicArmorBodyBrk = NULL; mMagicArmorHeadBrk = NULL; field_0x2fc7 = dStage_stagInfo_GetWolfDashType(dComIfGp_getStage()->getStagInfo()); } void daAlink_c::changeLink(int param_0) { JKRHeap* current_heap = mAnmHeap3.setAnimeHeap(); offNoResetFlg2(daPy_FLG2(FLG2_UNK_100000 | FLG2_UNK_80000)); mMagicArmorBodyBrk = NULL; mMagicArmorHeadBrk = NULL; J3DModelData* modelData; if (checkNoResetFlg2(FLG2_UNK_200000)) { offNoResetFlg2(FLG2_UNK_200000); onNoResetFlg2(FLG2_UNK_80000); modelData = static_cast(dComIfG_getObjectRes("alSumou", 0x31)); mpLinkModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084); mpLinkHatModel = initModel(static_cast(dComIfG_getObjectRes("alSumou", 0x33)), 0); mpLinkHandModel = initModel(static_cast(dComIfG_getObjectRes("alSumou", 0x32)), 0); } else if (checkCasualWearFlg()) { onNoResetFlg2(FLG2_UNK_100000); mpLinkModel = initModel(static_cast(dComIfG_getObjectRes(l_bArcName, "bl.bmd")), 0); mpLinkHatModel = initModel(static_cast(dComIfG_getObjectRes(l_bArcName, "bl_head.bmd")), 0); mpLinkHandModel = initModel(static_cast(dComIfG_getObjectRes(l_bArcName, "bl_hands.bmd")), 0); } else if (checkZoraWearFlg()) { mpLinkModel = initModel(static_cast(dComIfG_getObjectRes(l_zArcName, "zl.bmd")), 0); mpLinkHatModel = initModel(static_cast(dComIfG_getObjectRes(l_zArcName, "zl_head.bmd")), 0); mpLinkHandModel = initModel(static_cast(dComIfG_getObjectRes(l_zArcName, "al_hands.bmd")), 0); } else if (checkMagicArmorWearFlg()) { mpLinkModel = initModel(static_cast(dComIfG_getObjectRes(l_mArcName, "ml.bmd")), 0x1000000); mpLinkHatModel = initModel(static_cast(dComIfG_getObjectRes(l_mArcName, "ml_head.bmd")), 0x1000000); mpLinkHandModel = initModel(static_cast(dComIfG_getObjectRes(l_mArcName, "al_hands.bmd")), 0); if (dComIfGs_getRupee() != 0) { setMagicArmorBrk(1); } else { setMagicArmorBrk(0); } mMagicArmorBodyBrk->setFrame(mMagicArmorBodyBrk->getFrameMax()); mMagicArmorHeadBrk->setFrame(mMagicArmorHeadBrk->getFrameMax()); } else { mpLinkModel = initModel(static_cast(dComIfG_getObjectRes(l_kArcName, "al.bmd")), 0); mpLinkHatModel = initModel(static_cast(dComIfG_getObjectRes(l_kArcName, "al_head.bmd")), 0); mpLinkHandModel = initModel(static_cast(dComIfG_getObjectRes(l_kArcName, "al_hands.bmd")), 0); } if (checkNoResetFlg2(FLG2_UNK_200000) || !checkZoraWearFlg()) { mpLinkFaceModel = initModel(static_cast(dComIfG_getObjectRes(mArcName, "al_face.bmd")), 0x20200); } else { mpLinkFaceModel = initModel(static_cast(dComIfG_getObjectRes(mArcName, "zl_face.bmd")), 0x20200); } modelData = static_cast(dComIfG_getObjectRes(mArcName, "al_bootsH.bmd")); u16 i; for (i = 0; i < 2; i++) { mpLinkBootModels[i] = initModel(modelData, 0); } mpKanteraModel = initModelEnv(static_cast(dComIfG_getObjectRes(mArcName, "al_kantera.bmd")), 0); modelData = static_cast(dComIfG_getObjectRes(mArcName, "ef_ktGlow.bmd")); mpKanteraGlowModel = initModel(modelData, 0x200); mpKanteraGlowBtk = static_cast(dComIfG_getObjectRes(mArcName, "ef_ktGlow.btk")); mpKanteraGlowBtk->setFrame(0.0f); mpKanteraGlowBtk->searchUpdateMaterialID(modelData); modelData->entryTexMtxAnimator(mpKanteraGlowBtk); mWoodSwordModel = initModel(static_cast(dComIfG_getObjectRes(mArcName, "al_SWB.bmd")), 0); mDoExt_setCurrentHeap(current_heap); dComIfGs_setTransformStatus(0); mpLinkModel->setUserArea((uintptr_t)this); mpLinkHatModel->setUserArea((uintptr_t)this); changeModelDataDirect(param_0); field_0x06e4 = NULL; u8 var_r27; if (checkNoResetFlg2(FLG2_UNK_80000)) { field_0x06d8 = field_0x064C->getMaterialNodePointer(4)->getShape(); field_0x06dc = field_0x064C->getMaterialNodePointer(5)->getShape(); field_0x06e0 = NULL; field_0x06e8 = field_0x064C->getMaterialNodePointer(3)->getShape(); field_0x06ec = NULL; field_0x06f0 = field_0x064C->getMaterialNodePointer(2)->getShape(); var_r27 = 2; } else if (checkCasualWearFlg()) { field_0x06d8 = field_0x064C->getMaterialNodePointer(3)->getShape(); field_0x06dc = field_0x064C->getMaterialNodePointer(4)->getShape(); field_0x06e0 = NULL; field_0x06e8 = field_0x064C->getMaterialNodePointer(2)->getShape(); field_0x06ec = field_0x064C->getMaterialNodePointer(0)->getShape(); field_0x06f0 = field_0x064C->getMaterialNodePointer(1)->getShape(); var_r27 = 2; } else if (checkZoraWearFlg()) { field_0x06d8 = field_0x064C->getMaterialNodePointer(4)->getShape(); field_0x06dc = field_0x064C->getMaterialNodePointer(5)->getShape(); field_0x06e0 = field_0x064C->getMaterialNodePointer(8)->getShape(); field_0x06e4 = field_0x064C->getMaterialNodePointer(9)->getShape(); field_0x06e4->hide(); field_0x06e8 = NULL; field_0x06ec = field_0x064C->getMaterialNodePointer(2)->getShape(); field_0x06f0 = field_0x064C->getMaterialNodePointer(11)->getShape(); var_r27 = 3; } else if (checkMagicArmorWearFlg()) { field_0x06d8 = field_0x064C->getMaterialNodePointer(4)->getShape(); field_0x06dc = field_0x064C->getMaterialNodePointer(5)->getShape(); field_0x06e0 = field_0x064C->getMaterialNodePointer(10)->getShape(); field_0x06e8 = field_0x064C->getMaterialNodePointer(3)->getShape(); field_0x06ec = field_0x064C->getMaterialNodePointer(1)->getShape(); field_0x06f0 = field_0x064C->getMaterialNodePointer(2)->getShape(); if (dComIfGs_getRupee() != 0) { var_r27 = 4; } else { var_r27 = 5; } } else { field_0x064C->getMaterialNodePointer(16)->getShape()->hide(); field_0x06d8 = field_0x064C->getMaterialNodePointer(11)->getShape(); field_0x06dc = field_0x064C->getMaterialNodePointer(12)->getShape(); field_0x06e0 = field_0x064C->getMaterialNodePointer(6)->getShape(); field_0x06e8 = field_0x064C->getMaterialNodePointer(8)->getShape(); field_0x06ec = field_0x064C->getMaterialNodePointer(4)->getShape(); field_0x06f0 = field_0x064C->getMaterialNodePointer(7)->getShape(); var_r27 = 0; } if (field_0x06e0 != NULL) { if (checkEquipHeavyBoots()) { field_0x06e0->hide(); } else { field_0x06e0->show(); if (checkZoraWearMaskDraw()) { field_0x06e4->show(); } } } field_0x06d0 = field_0x06d8; field_0x06d4 = field_0x06dc; modelData = mpLinkHandModel->getModelData(); for (i = 0; i < 11; i++) { modelData->getMaterialNodePointer(i)->getShape()->hide(); } modelData = mpLinkFaceModel->getModelData(); modelData->getMaterialNodePointer(2)->setMaterialAnm(field_0x2180[0]); modelData->getMaterialNodePointer(3)->setMaterialAnm(field_0x2180[1]); mEyeHL1.entry(modelData, "highlight02"); mpKanteraModel->setUserArea((uintptr_t)this); mpKanteraModel->getModelData()->getJointNodePointer(1)->setCallBack(daAlink_kandelaarModelCallBack); mZ2Link.setLinkState(var_r27); #if VERSION != VERSION_SHIELD_DEBUG if (checkHookshotReadyMaterialOffMode()) { setHookshotReadyMaterial(); } #endif if (param_0) { fopAcM_SetMtx(this, mpLinkModel->getBaseTRMtx()); model = mpLinkModel; m_oldFrameCalc->offOldFrameFlg(); } else { changeCommon(); offNoResetFlg1(FLG1_IS_WOLF); field_0x2e44.init(this, l_jntColData, mpLinkModel, 18); field_0x3088 = 0; field_0x302c[7] = -0x3800; field_0x3060 = 0; field_0x3062 = shape_angle.y; mHeight = 180.0f; mLinkAcch.SetRoofCrrHeight(mHeight); mMaxSpeed = mpHIO->mMove.m.mMaxSpeed; l_autoUpHeight = mpHIO->mWallHang.m.auto_walk_height + 0.01f; l_autoDownHeight = -l_autoUpHeight; field_0x3470 = cM_scos(cM_deg2s(mpHIO->mSlide.m.mSlideAngle)); field_0x3122 = cM_deg2s(mpHIO->mSlide.m.mClimbAngle); field_0x3458 = -120.0f; field_0x345c = -200.0f; field_0x2e54.changeWaterOffset(mpHIO->mBasic.m.mWaterSurfaceEffectHeight); field_0x2e54.changeRippleOffset(mHeight); offWolfEyeUp(); field_0x3420 = 1.0f; field_0x30c6 = 35; field_0x30a8 = 1; field_0x30aa = 16; field_0x30ae = 0x2000; field_0x3424 = 4.0f; field_0x3428 = 35.0f; field_0x2f50 = &l_crawlSideOffset; field_0x2f54 = &l_crawlTopUpOffset; resetWolfAtCollision(); resetWolfBallGrab(); deleteEquipItem(FALSE, FALSE); field_0x2fb0 = 0; for (int i = 0; i < 10; i++) { mWolfLockAcKeep[i].clearData(); } mWolfLockNum = 0; mLeftHandJntNo = 9; mRightHandJntNo = 14; mLeftItemJntNo = 10; mRightItemJntNo = 15; field_0x30c4 = 3; field_0x30b4 = 4; mLeftFootJnt = 21; mRightFootJnt = 26; field_0x30b6 = 5; field_0x32c4[0] = 2; field_0x32c4[1] = 16; attention_info.field_0xa = 10; dCcD_Cyl* cyl_p = mTgCyls; for (int i = 0; i < 3; i++, cyl_p++) { cyl_p->OnTgShieldFrontRange(); cyl_p->OnTgSmallShield(); } mMagneBootsTopVec = cXyz::BaseY; mAtSph.OnAtSetBit(); mAtSph.OffTgSetBit(); mAtSph.OffCoSetBit(); mpWlMidnaModel = NULL; mpWlMidnaMaskModel = NULL; mpWlMidnaHandModel = NULL; mpWlMidnaHairModel = NULL; } } void daAlink_c::onWolfEyeUp() { if (!checkWolfEyeUp()) { mZ2Link.setWolfEyeOpen(true); mWolfEyeUp = mpHIO->mWolf.m.mSensesLingerTime; field_0x2fd2 = 20; } } void daAlink_c::offWolfEyeUp() { if (checkWolfEyeUp()) { mWolfEyeUp = 0; field_0x2fd2 = 20; mZ2Link.setWolfEyeOpen(false); } } BOOL daAlink_c::wolfSenseTrigger() { return itemTriggerCheck(BTN_X); } void daAlink_c::setWolfSenceStatus(u8 i_status) { dComIfGp_setXStatus(i_status, 0); } BOOL daAlink_c::wolfClawTrigger() { return itemTriggerCheck(BTN_Y); } void daAlink_c::setWolfDigStatus(u8 i_flag) { dComIfGp_setYStatus(BUTTON_STATUS_DIG, i_flag); } BOOL daAlink_c::checkWolfShapeReverse() const { return ((mProcID == PROC_WOLF_SLIDE_READY || mProcID == PROC_WOLF_LOCK_ATTACK_TURN || mProcID == PROC_WOLF_JUMP_AT_SLIDE_LAND ) && mProcVar2.field_0x300c != 0 ) || mProcID == PROC_WOLF_SLIP_TURN_LAND || (mProcID == PROC_WOLF_LARGE_DAMAGE_UP && field_0x3198 != 0) || mProcID == PROC_WOLF_ROPE_TURN; } BOOL daAlink_c::checkWolfSideStep() const { return field_0x2f98 != 0 && ((mProcID == PROC_WOLF_ATN_AC_MOVE && !checkModeFlg(1)) || mProcID == PROC_WOLF_SIDESTEP_LAND || mProcID == PROC_WOLF_BACKJUMP_LAND); } void daAlink_c::setWolfTailAngle() { s16* var_r30 = field_0x3094; s16* var_r29 = field_0x309a; s16 var_r27 = (s16)(shape_angle.y - mPrevAngleY); for (int i = 0; i < 3; i++, var_r30++, var_r29++) { if (checkEndResetFlg0(ERFLG0_UNK_800000)) { *var_r30 = 0; *var_r29 = 0; } else { *var_r30 -= var_r27; s16 sp38 = *var_r30; cLib_addCalcAngleS(var_r30, 0, 5, 500, 50); *var_r30 = cLib_minMaxLimit((s16)(*var_r30 + *var_r29), -0x1000, 0x1000); var_r27 = (s16)(*var_r30 - sp38); *var_r29 = var_r27 * 0.5f; } } } BOOL daAlink_c::checkWolfSlowDash() { return field_0x2fc7 == 1 || field_0x2fc7 == 3 || mGroundCode == 11; } void daAlink_c::setSpeedAndAngleWolf() { f32 speed = 0.0f; f32 acceleration; f32 deceleration; s16 turn_rate; s16 turn_max; s16 turn_min; if (checkWolfDashMode()) { turn_rate = mpHIO->mWolf.mWlMove.m.mTurnAngleRate; turn_max = mpHIO->mWolf.mWlMove.m.mTurnMax; turn_min = mpHIO->mWolf.mWlMove.m.mTurnMin; if (checkWolfSlowDash()) { acceleration = mpHIO->mWolf.mWlMove.m.mADashAccelerationSlow; } else if (field_0x2fc7 == 2) { acceleration = mpHIO->mWolf.mWlMove.m.mADashAccelerationSlow2; } else { acceleration = mpHIO->mWolf.mWlMove.m.mADashAcceleration; } deceleration = mpHIO->mWolf.mWlMove.m.mDeceleration; } else { turn_rate = mpHIO->mWolf.mWlMoveNoP.m.mTurnAngleRate; turn_max = mpHIO->mWolf.mWlMoveNoP.m.mTurnMax; turn_min = mpHIO->mWolf.mWlMoveNoP.m.mTurnMin; acceleration = mpHIO->mWolf.mWlMoveNoP.m.mAcceleration; deceleration = mpHIO->mWolf.mWlMoveNoP.m.mDeceleration; } BOOL isEventRun = checkEventRun(); if (checkInputOnR()) { s16 temp_r4 = current.angle.y; BOOL var_r26 = FALSE; f32 temp_f28 = mStickValue * mStickValue; f32 temp_f27 = speedF / mMaxSpeed; if (cLib_distanceAngleS(mMoveAngle, current.angle.y) > 0x7000 && abs(field_0x3180) < 0x5000 && ((!checkModeFlg(1) && !(speedF < 0.001f)) || mStickValue > 0.85f)) { if ((checkModeFlg(1) || speedF < 0.001f) && !isEventRun && (mProcID == PROC_WOLF_WAIT || mProcID == PROC_WOLF_MOVE)) { cLib_addCalcAngleS(¤t.angle.y, mMoveAngle, turn_rate, turn_max, turn_min); if (mProcID == PROC_WOLF_MOVE && temp_f27 > 0.6f) { var_r26 = 1; } } else if (mProcID == PROC_WOLF_MOVE && ((checkWolfDashMode() && temp_f27 > mpHIO->mWolf.mWlMove.m.mSlipStartRate) || (!checkWolfDashMode() && temp_f27 > mpHIO->mWolf.mWlMoveNoP.m.mSlideStartRate))) { return; } else { cLib_addCalcAngleS(¤t.angle.y, mMoveAngle, turn_rate, turn_max, turn_min); if (mProcID == PROC_WOLF_MOVE && temp_f27 > 0.6f) { var_r26 = 1; } } } else { s16 var_r6; s16 var_r7; if (isEventRun) { var_r6 = turn_max; var_r7 = turn_min; } else { var_r6 = turn_max * temp_f28; if (var_r6 < 10) { var_r6 = 10; } var_r7 = turn_min * temp_f28; if (var_r7 < 1) { var_r7 = 1; } } cLib_addCalcAngleS(¤t.angle.y, mMoveAngle, turn_rate, var_r6, var_r7); } if (wolfSideBgCheck(temp_r4)) { current.angle.y = temp_r4; onEndResetFlg1(ERFLG1_UNK_200000); if (cLib_distanceAngleS(mMoveAngle, current.angle.y) > 0x7000) { var_r26 = TRUE; } } if (!var_r26) { f32 temp_f27_2 = getStickAngleDistanceRate(); if (isEventRun) { speed = temp_f27_2 * (acceleration * mStickValue); } else { f32 var_f26 = (1.0f - fabsf(mNormalSpeed / mMaxSpeed)) * 0.3f; if (checkHeavyStateOn(TRUE, TRUE) != 0) { var_f26 *= mHeavySpeedMultiplier; } if ((!checkNoResetFlg1(FLG1_UNK_20000000) || cLib_distanceAngleS(current.angle.y + 0x8000, field_0x3092) >= 0xC00) && mStickValue > var_f26) { speed = temp_f27_2 * (acceleration * temp_f28); } } } } if (checkInputOnR() || mProcID == PROC_WOLF_ROLL_ATTACK_MOVE) { s16 temp_r26 = shape_angle.y; s16 var_r4; if (checkWolfShapeReverse()) { var_r4 = mMoveAngle + 0x8000; } else { var_r4 = mMoveAngle; } cLib_addCalcAngleS(&shape_angle.y, var_r4, turn_rate, (s16)turn_max * 2, (s16)turn_min * 2); int temp_r3 = (s16)(temp_r26 - current.angle.y) * (s16)(shape_angle.y - current.angle.y); if (temp_r3 <= 0 && temp_r3 >= -0x1000000) { shape_angle.y = current.angle.y; } } else if (!isEventRun && !checkInputOnR() && checkAttentionState() && mProcID == PROC_WOLF_WAIT) { cLib_addCalcAngleS(&shape_angle.y, field_0x2fe4, 2, 0x2000, 0x800); current.angle.y = shape_angle.y; } setNormalSpeedF(speed, deceleration); } void daAlink_c::setSpeedAndAngleWolfAtn() { f32 speed; f32 acceleration; f32 deceleration; if (field_0x2f98 == 1) { acceleration = mpHIO->mWolf.mWlAtnMove.m.mRearAcceleration; deceleration = mpHIO->mWolf.mWlAtnMove.m.mRearDeceleration; } else { acceleration = mpHIO->mWolf.mWlAtnMove.m.mAcceleration; deceleration = mpHIO->mWolf.mWlAtnMove.m.mDeceleration; } s16 turn_max; if (checkFmChainGrabAnime()) { turn_max = 1000; } else { turn_max = mpHIO->mWolf.mWlAtnMove.m.mTurnAngleMax; } s16 var_r27; if (checkUnderMove0BckNoArcWolf(WANM_CHAIN_PULL_END)) { var_r27 = getChainStickAngleY(field_0x2fe4); } else { var_r27 = mMoveAngle; } if (checkInputOnR()) { if (getDirectionFromCurrentAngle() == DIR_BACKWARD && (field_0x2f98 == 0 || field_0x2f98 == 1)) { ANGLE_ADD_2(current.angle.y, 0x8000); mNormalSpeed *= -1.0f; if (checkWolfAtnMoveBack((s16)(current.angle.y - shape_angle.y))) { field_0x2f98 = 1; } else { field_0x2f98 = 0; } } s16 temp_r28 = current.angle.y; cLib_addCalcAngleS(¤t.angle.y, var_r27, mpHIO->mWolf.mWlAtnMove.m.mTurnAngleRate, turn_max, mpHIO->mWolf.mWlAtnMove.m.mTurnAngleMin); if (wolfSideBgCheck(temp_r28)) { current.angle.y = temp_r28; onEndResetFlg1(ERFLG1_UNK_200000); } speed = acceleration * mStickValue * cM_scos((s16)(current.angle.y - temp_r28)); } else { if (checkZeroSpeedF()) { if (!setShapeAngleToAtnActor(0) && !checkEventRun() && !checkInputOnR() && (mProcID == PROC_WOLF_WAIT || mProcID == PROC_WOLF_ROLL_ATTACK_MOVE || mProcID == PROC_WOLF_ATN_AC_MOVE)) { cLib_addCalcAngleS(&shape_angle.y, field_0x2fe4, 2, 0x2000, 0x800); } if (field_0x2f98 == 1) { current.angle.y = shape_angle.y + 0x8000; } else { current.angle.y = shape_angle.y; } } speed = 0.0f; } if (!checkWolfShapeReverse()) { s16 var_r26; if (field_0x2f98 == 1 || (checkEndResetFlg1(ERFLG1_UNK_200000) && cLib_distanceAngleS(shape_angle.y, current.angle.y) > 0x4000)) { var_r26 = current.angle.y + 0x8000; } else { var_r26 = current.angle.y; } cLib_addCalcAngleS(&shape_angle.y, var_r26, mpHIO->mWolf.mWlAtnMove.m.mTurnAngleRate, (s16)turn_max * 2, mpHIO->mWolf.mWlAtnMove.m.mTurnAngleMin * 2); } setNormalSpeedF(speed, deceleration); } BOOL daAlink_c::checkWolfAtnWait() { if ((checkEnemyGroup(mTargetedActor) || mDemo.getDemoMode() == daPy_demo_c::DEMO_UNK_23_e) || (mTargetedActor != NULL && fopAcM_GetName(mTargetedActor) == fpcNm_NPC_MOI_e && ((daNpc_Moi_c*)mTargetedActor)->chkSFight())) { return true; } return false; } BOOL daAlink_c::checkUnderMove0BckNoArcWolf(daAlink_c::daAlink_WANM i_anm) const { return mUnderAnmHeap[0].checkNoSetArcNo() && m_wlAnmDataTable[i_anm].m_bckID == mUnderAnmHeap[0].getIdx(); } void daAlink_c::setBlendWolfMoveAnime(f32 param_0) { f32 temp_f30; daPy_frameCtrl_c* framectrl0; daPy_frameCtrl_c* framectrl1; f32 idleAnmSpeed; f32 walkAnmSpeed; f32 jogAnmSpeed; f32 runAnmSpeed; f32 climbAnmSpeed; f32 walkToJogRate; f32 idleToWalkRate; f32 jogToRunRate; f32 walkRunMorf; f32 runAnmMinBlendRate; f32 spC; f32 sp8; if (mGroundCode == 8) { sp8 = 1.0f; } else { sp8 = cM_scos(field_0x2ff0); } f32 var_f31; temp_f30 = fabsf(mNormalSpeed * sp8) / mMaxSpeed; framectrl0 = &mUnderFrameCtrl[0]; framectrl1 = &mUnderFrameCtrl[1]; if (checkWolfDashMode()) { walkToJogRate = mpHIO->mWolf.mWlMove.m.mWalkToBriskWalkRate; walkRunMorf = mpHIO->mWolf.mWlMove.m.mWalkRunInterpolation; idleToWalkRate = mpHIO->mWolf.mWlMove.m.mIdleToWalkRate; jogToRunRate = mpHIO->mWolf.mWlMove.m.mStandbyRunToRunRate; idleAnmSpeed = mpHIO->mWolf.mWlMove.m.mIdleAnmSpeed; walkAnmSpeed = mpHIO->mWolf.mWlMove.m.mWalkAnmSpeed; jogAnmSpeed = mpHIO->mWolf.mWlMove.m.mBriskWalkAnmSpeed; runAnmSpeed = mpHIO->mWolf.mWlMove.m.mRunAnmSpeed; climbAnmSpeed = mpHIO->mWolf.mWlSlide.m.mClimbingAnmSpeed; runAnmMinBlendRate = mpHIO->mWolf.mWlMove.m.mRunAnmMinBlendRate; } else { walkToJogRate = mpHIO->mWolf.mWlMoveNoP.m.mWalkToJogRate; walkRunMorf = mpHIO->mWolf.mWlMoveNoP.m.mWalkRunInterpolation; idleToWalkRate = mpHIO->mWolf.mWlMoveNoP.m.mIdleToWalkRate; jogToRunRate = mpHIO->mWolf.mWlMoveNoP.m.mJogToRunRate; idleAnmSpeed = mpHIO->mWolf.mWlMoveNoP.m.mIdleAnmSpeed; walkAnmSpeed = mpHIO->mWolf.mWlMoveNoP.m.mWalkAnmSpeed; jogAnmSpeed = mpHIO->mWolf.mWlMoveNoP.m.mJogAnmSpeed; runAnmSpeed = mpHIO->mWolf.mWlMoveNoP.m.mRunAnmSpeed; climbAnmSpeed = mpHIO->mWolf.mWlSlide.m.mClimbingAnmSpeedWeak; runAnmMinBlendRate = mpHIO->mWolf.mWlMoveNoP.m.mRunAnmMinBlendRate; } if (temp_f30 < walkToJogRate || checkAttentionState() || checkHeavyStateOn(TRUE, TRUE) || checkSlope()) { field_0x2fc1 = 0; if ((temp_f30 < walkToJogRate || checkAttentionState() || checkHeavyStateOn(TRUE, TRUE)) && field_0x30d0 != 0) { field_0x30d0 = 0; offNoResetFlg1(FLG1_DASH_MODE); } if (checkNoResetFlg1(FLG1_UNK_800000)) { offNoResetFlg1(FLG1_UNK_800000); param_0 = walkRunMorf; } int var_r29 = 1; daAlink_WANM var_r27 = WANM_WAIT; daAlink_WANM var_r26; daAlink_WANM var_r25; if (checkHeavyStateOn(TRUE, TRUE)) { var_r26 = WANM_ATN_LOCK_WALK_FRONT; var_r25 = WANM_ATN_LOCK_WALK_FRONT; walkAnmSpeed = 1.2f; jogAnmSpeed = 1.2f; } else { var_r25 = WANM_WALK_B; var_r26 = WANM_WALK_A; } if (temp_f30 < idleToWalkRate) { if (checkModeFlg(1)) { var_r29 = 2; s16 temp_r0 = shape_angle.y - mPrevAngleY; if (abs(temp_r0) > 0 && !checkAttentionState()) { var_f31 = 0.64999998f + (0.001f * abs(temp_r0)); if (var_f31 > 1.0f) { var_f31 = 1.0f; } var_f31 = 1.0f - var_f31; setDoubleAnimeWolf(var_f31, walkAnmSpeed, idleAnmSpeed, var_r26, var_r27, var_r29, param_0); return; } if (checkAttentionState()) { var_r27 = WANM_ATN; idleAnmSpeed = mpHIO->mWolf.mWlMove.m.mGazeIdleAnmSpeed; } else if (checkWindSpeedOnXZ() && !checkEventRun()) { var_r27 = WANM_WAIT_WIND; idleAnmSpeed = 1.0f; } } if (checkSlope()) { var_r26 = WANM_WALK_SLOPE; var_r27 = WANM_WAIT; walkAnmSpeed = climbAnmSpeed; field_0x2fc1 = 2; } var_f31 = temp_f30 / idleToWalkRate; setDoubleAnimeWolf(var_f31, idleAnmSpeed, walkAnmSpeed, var_r27, var_r26, var_r29, param_0); } else if (checkSlope()) { field_0x2fc1 = 2; setDoubleAnimeWolf(1.0f, climbAnmSpeed, climbAnmSpeed, WANM_WALK_SLOPE, WANM_WALK_SLOPE, var_r29, param_0); field_0x2fc1 = 2; } else { var_f31 = (temp_f30 - idleToWalkRate) / (walkToJogRate - idleToWalkRate); if (var_f31 > 1.0f) { var_f31 = 1.0f; } setDoubleAnimeWolf(var_f31, walkAnmSpeed, jogAnmSpeed, var_r26, var_r25, var_r29, param_0); } if (!checkBarkAnime() && var_r29 != 1) { checkAttentionState(); } return; } if (!checkNoResetFlg1(FLG1_UNK_800000)) { onNoResetFlg1(FLG1_UNK_800000); param_0 = walkRunMorf; } field_0x2fc1 = 1; if (temp_f30 < jogToRunRate) { var_f31 = runAnmMinBlendRate + (((1.0f - runAnmMinBlendRate) * (temp_f30 - walkToJogRate)) / (jogToRunRate - walkToJogRate)); setDoubleAnimeWolf(var_f31, idleAnmSpeed, runAnmSpeed, WANM_WAIT, WANM_DASH_A, 1, param_0); } else { if (!checkWolfDashMode()) { setDoubleAnimeWolf(1.0f, runAnmSpeed, runAnmSpeed, WANM_DASH_A, WANM_DASH_A, 1, param_0); } else { var_f31 = (temp_f30 - jogToRunRate) / (mpHIO->mWolf.mWlMove.m.mRunToQuickRunRate - jogToRunRate); if (var_f31 > 1.0f) { var_f31 = 1.0f; } if (checkNoResetFlg1(FLG1_DASH_MODE)) { if (checkWolfSlowDash()) { spC = mpHIO->mWolf.mWlMove.m.mADashQuickRunASpeedSlow; } else if (field_0x2fc7 == 2) { spC = mpHIO->mWolf.mWlMove.m.mADashQuickRunASpeedSlow2; } else { spC = mpHIO->mWolf.mWlMove.m.mADashQuickRunAnmSpeed; } } else { spC = mpHIO->mWolf.mWlMove.m.mQuickRunAnmSpeed; } setDoubleAnimeWolf(var_f31, runAnmSpeed, spC, WANM_DASH_A, WANM_DASH_B, 1, param_0); } if (framectrl1->checkPass(l_wolfFootOnFrame[1][0])) { field_0x2f9d = 8; } else if (framectrl1->checkPass(l_wolfFootOnFrame[1][1])) { field_0x2f9d = 0x10; } else if (framectrl1->checkPass(l_wolfFootOnFrame[1][2])) { field_0x2f9d = 0x20; } else if (framectrl1->checkPass(l_wolfFootOnFrame[1][3])) { field_0x2f9d = 0x40; } if (checkWindSpeedOnAngle()) { onEndResetFlg0(ERFLG0_UNK_2000); if (checkNoSetUpperAnime()) { setUpperAnimeBase(dRes_ID_ALANM_BCK_WL_DASHWIND_e); } } } if (!checkBarkAnime() && framectrl1->checkPass(11.0f)) { voiceStart(Z2SE_WL_V_BREATH_RUN); } } BOOL daAlink_c::checkWolfAtnMoveBack(s16 param_0) { f32 cos = cM_scos(param_0); return (field_0x2f98 != 1 && cos < -0.3826834261417389f) || (field_0x2f98 == 1 && cos < -0.1736481785774231f); } void daAlink_c::setWolfAtnMoveDirection() { if (!checkAttentionState() && mProcID != PROC_WOLF_ROLL_ATTACK_MOVE) { field_0x2f98 = 0; return; } s16 var_r29; if (checkUnderMove0BckNoArcWolf(WANM_CHAIN_PULL_END)) { var_r29 = getChainStickAngleY(field_0x2fe4); } else { var_r29 = mMoveAngle; } if ((mProcID == PROC_WOLF_ATN_AC_MOVE || mProcID == PROC_WOLF_ROLL_ATTACK_MOVE) && checkModeFlg(1) && checkZeroSpeedF()) { if (checkInputOnR()) { s16 temp_r28 = current.angle.y; current.angle.y = var_r29; if (wolfSideBgCheck(temp_r28)) { current.angle.y = temp_r28; onEndResetFlg1(ERFLG1_UNK_200000); } } else { current.angle.y = shape_angle.y; } } if (mTargetedActor != NULL) { field_0x2fe4 = cLib_targetAngleY(¤t.pos, &mTargetedActor->eyePos); } s16 temp_r27 = var_r29 - field_0x2fe4; if (mDemo.getDemoMode() == daPy_demo_c::DEMO_UNK_23_e) { field_0x2f98 = 0; } else if (checkInputOnR()) { if (checkWolfAtnMoveBack(temp_r27)) { field_0x2f98 = 1; } else { field_0x2f98 = getDirectionFromAngle(temp_r27); } } else if (mProcID != PROC_WOLF_ROLL_ATTACK_MOVE) { if (field_0x2f98 == 1) { ANGLE_ADD_2(current.angle.y, 0x8000); mNormalSpeed *= -1.0f; } field_0x2f98 = 0; } } void daAlink_c::setBlendWolfAtnMoveAnime(f32 param_0) { if (checkSetChainPullAnime(field_0x2fe4)) { daAlink_WANM anm; if (checkEndResetFlg1(ERFLG1_CHAIN_PULL_END)) { anm = WANM_CHAIN_PULL_END; } else { anm = WANM_CHAIN_PULL; } if (!checkUnderMove0BckNoArcWolf(anm)) { f32 anm_speed; if (checkChainBlockPushPull()) { anm_speed = 0.7f; } else { anm_speed = 1.0f; } setSingleAnimeWolfBaseSpeed(anm, anm_speed, 3.0f); } } else if (field_0x2f98 == 1) { setBlendWolfAtnBackMoveAnime(param_0); } else { field_0x2fc1 = 0; s16 var_r28; if (mGroundCode == 8 || !mLinkAcch.ChkGroundHit()) { var_r28 = 0; } else { var_r28 = getGroundAngle(&mLinkAcch.m_gnd, current.angle.y); } f32 var_f31 = fabsf((mNormalSpeed * cM_scos(var_r28)) / mMaxSpeed); f32 var_f30; if (var_f31 < mpHIO->mWolf.mWlAtnMove.m.mWalkChangeRate) { var_f30 = var_f31 / mpHIO->mWolf.mWlAtnMove.m.mWalkChangeRate; int var_r27; if (checkModeFlg(1)) { var_r27 = 2; } else { var_r27 = 3; } daAlink_WANM var_r26; f32 var_f28; if (checkWolfAtnWait()) { var_r26 = WANM_ATN; var_f28 = mpHIO->mWolf.mWlMove.m.mGazeIdleAnmSpeed; } else { var_r26 = WANM_WAIT; var_f28 = mpHIO->mWolf.mWlMoveNoP.m.mIdleAnmSpeed; } setDoubleAnimeWolf(var_f30, var_f28, mpHIO->mWolf.mWlAtnMove.m.mWalkAnmSpeed, var_r26, WANM_ATN_LOCK_WALK_FRONT, var_r27, param_0); } else if (var_f31 < mpHIO->mWolf.mWlAtnMove.m.mRunChangeRate) { var_f30 = (var_f31 - mpHIO->mWolf.mWlAtnMove.m.mWalkChangeRate) / (mpHIO->mWolf.mWlAtnMove.m.mRunChangeRate - mpHIO->mWolf.mWlAtnMove.m.mWalkChangeRate); setDoubleAnimeWolf(var_f30, mpHIO->mWolf.mWlAtnMove.m.mWalkAnmSpeed, mpHIO->mWolf.mWlAtnMove.m.mRunAnmSpeed, WANM_ATN_LOCK_WALK_FRONT, WANM_ATN_LOCK_RUN, 3, param_0); } else { setDoubleAnimeWolf(1.0f, mpHIO->mWolf.mWlAtnMove.m.mRunAnmSpeed, mpHIO->mWolf.mWlAtnMove.m.mRunAnmSpeed, WANM_ATN_LOCK_RUN, WANM_ATN_LOCK_RUN, 3, param_0); } } } void daAlink_c::setBlendWolfAtnBackMoveAnime(f32 param_0) { mMaxSpeed = mpHIO->mWolf.mWlAtnMove.m.mRearMaxSpeed; f32 var_f31 = fabsf(mNormalSpeed * (mGroundCode == 8 ? 1.0f : cM_scos(field_0x2ff0))) / mMaxSpeed; field_0x2fc1 = 3; if (var_f31 < mpHIO->mWolf.mWlAtnMove.m.mRearWalkChangeRate) { f32 var_f29 = var_f31 / mpHIO->mWolf.mWlAtnMove.m.mRearWalkChangeRate; int var_r29; if (checkModeFlg(1)) { var_r29 = 2; } else { var_r29 = 3; } daAlink_WANM var_r28; f32 var_f30; if (checkWolfAtnWait()) { var_r28 = WANM_ATN; var_f30 = mpHIO->mWolf.mWlMove.m.mGazeIdleAnmSpeed; } else { var_r28 = WANM_WAIT; var_f30 = mpHIO->mWolf.mWlMoveNoP.m.mIdleAnmSpeed; } setDoubleAnimeWolf(var_f29, var_f30, mpHIO->mWolf.mWlAtnMove.m.mRearWalkAnmSpeed, var_r28, WANM_ATN_LOCK_WALK_BACK, var_r29, param_0); } else { setDoubleAnimeWolf(1.0f, mpHIO->mWolf.mWlAtnMove.m.mRearWalkAnmSpeed, mpHIO->mWolf.mWlAtnMove.m.mRearWalkAnmSpeed, WANM_ATN_LOCK_WALK_BACK, WANM_ATN_LOCK_WALK_BACK, 3, param_0); } } int daAlink_c::setDoubleAnimeWolf(f32 param_0, f32 param_1, f32 param_2, daAlink_c::daAlink_WANM param_3, daAlink_c::daAlink_WANM param_4, int param_5, f32 param_6) { if (!checkWolf()) { // "Is Adult Link but setting Wolf animation\n" OS_REPORT("リンクなのに狼アニメ設定\n"); JUT_ASSERT(2091, FALSE); } J3DAnmTransform* var_r25 = getNowAnmPackUnder(UNDER_0); daPy_frameCtrl_c* framectrl0 = &mUnderFrameCtrl[0]; daPy_frameCtrl_c* framectrl1 = &mUnderFrameCtrl[1]; J3DAnmTransform* var_r29 = getAnimeResource(&mUnderAnmHeap[0], m_wlAnmDataTable[param_3].m_bckID, 0x2C00); int var_r30; if (var_r29 == NULL) { var_r29 = getNowAnmPackUnder(UNDER_0); var_r30 = 0; } else { var_r30 = 1; } J3DAnmTransform* var_r28 = getAnimeResource(&mUnderAnmHeap[1], m_wlAnmDataTable[param_4].m_bckID, 0x2C00); if (!var_r28) { var_r28 = getNowAnmPackUnder(UNDER_1); } else { var_r30 |= 1; } if (var_r30 != 0 && param_6 < 0.0f) { param_6 = mpHIO->mWolf.mWlMove.m.mNormalInterpolation; } commonDoubleAnime(var_r29, NULL, var_r28, NULL, param_0, param_1, param_2, param_5); if (param_6 >= 0.0f) { m_oldFrameCalc->initOldFrameMorf(param_6, 0, 40); } setFaceBasicTexture(FTANM_WL_MABA01); if (checkWolfLieCode()) { mMidnaAnm = 2; } else { mMidnaAnm = m_wlAnmDataTable[param_3].m_midnaAnm; } daAlink_WANM var_r27; if (checkModeFlg(1)) { field_0x215c = &mUnderFrameCtrl[0]; var_r27 = param_3; } else { field_0x215c = &mUnderFrameCtrl[1]; var_r27 = param_4; } field_0x2160 = m_wlAnmDataTable[var_r27].m_voiceFrames; field_0x2fd8 = m_wlAnmDataTable[var_r27].m_voiceIdx; return 1; } void daAlink_c::setSingleAnimeWolfBase(daAlink_c::daAlink_WANM i_anmID) { setSingleAnimeWolf(i_anmID, 1.0f, 0.0f, -1, 3.0f); } void daAlink_c::setSingleAnimeWolfBaseMorf(daAlink_c::daAlink_WANM i_anmID, f32 i_morf) { setSingleAnimeWolf(i_anmID, 1.0f, 0.0f, -1, i_morf); } void daAlink_c::setSingleAnimeWolfBaseSpeed(daAlink_c::daAlink_WANM i_anmID, f32 i_speed, f32 i_morf) { setSingleAnimeWolf(i_anmID, i_speed, 0.0f, -1, i_morf); } int daAlink_c::setSingleAnimeWolf(daAlink_c::daAlink_WANM i_anmID, f32 i_speed, f32 i_start, s16 i_endFrame, f32 i_morf) { if (!checkWolf()) { // "Is Adult Link but setting Wolf animation\n" OS_REPORT("リンクなのに狼アニメ設定\n"); JUT_ASSERT(2214, FALSE); } J3DAnmTransform* var_r30 = getAnimeResource(&mUnderAnmHeap[0], m_wlAnmDataTable[i_anmID].m_bckID, 0x10800); if (var_r30 == NULL) { var_r30 = getNowAnmPackUnder(UNDER_0); } commonSingleAnime(var_r30, NULL, i_speed, i_start, i_endFrame); if (i_morf >= 0.0f) { m_oldFrameCalc->initOldFrameMorf(i_morf, 0, 40); } setFaceBasicTexture(FTANM_WL_MABA01); if (checkWolfLieCode()) { mMidnaAnm = 2; } else { mMidnaAnm = m_wlAnmDataTable[i_anmID].m_midnaAnm; } field_0x215c = mUnderFrameCtrl; field_0x2160 = m_wlAnmDataTable[i_anmID].m_voiceFrames; field_0x2fd8 = m_wlAnmDataTable[i_anmID].m_voiceIdx; return 1; } void daAlink_c::setSingleAnimeWolfParam(daAlink_c::daAlink_WANM i_anmID, daAlinkHIO_anm_c const* i_anmData) { setSingleAnimeWolf(i_anmID, i_anmData->mSpeed, i_anmData->mStartFrame, i_anmData->mEndFrame, i_anmData->mInterpolation); } int daAlink_c::checkWolfLandAction(BOOL param_0) { f32 temp_f31 = 0.0099999998f * (mFallHeight - current.pos.y); if (checkNoLandDamageSlidePolygon() || temp_f31 < mpHIO->mWolf.mWlDamage.mFall.m.mSmallDamageHeight) { if (param_0) { procWolfLandDamageInit(0); } else if (mProcID == PROC_WOLF_JUMP_ATTACK || mProcID == PROC_WOLF_DASH_REVERSE) { return 0; } else { procWolfLandInit(); } } else { procWolfLandDamageInit(temp_f31 < mpHIO->mWolf.mWlDamage.mFall.m.mLargeDamageHeight ? 1 : 2); } return 1; } BOOL daAlink_c::checkMidnaUseAbility() const { return dComIfGp_checkPlayerStatus1(0, 0x800000) || dKy_withwarp_capture_check(); } void daAlink_c::checkWolfUseAbility() { if (mProcID == PROC_WOLF_GIANT_PUZZLE) { return; } if (checkMidnaLockJumpPoint() != NULL && !checkMidnaRide()) { offWolfEyeUp(); return; } if (dComIfGs_isEventBit(dSv_event_flag_c::F_0550) && field_0x2fd2 == 0 #if DEBUG && !l_debugMode #endif && !checkEventRun() && mWolfEyeUp < mpHIO->mWolf.m.mSensesLingerTime && wolfSenseTrigger()) { if (!checkWolfEyeUp()) { onWolfEyeUp(); } else { offWolfEyeUp(); } } } int daAlink_c::checkWolfGroundSpecialMode() { if (mLinkAcch.ChkGroundHit() && !checkModeFlg(MODE_PLAYER_FLY) && checkEndResetFlg0(ERFLG0_UNK_1)) { return procCoMetamorphoseInit(); } else if (mMode == SMODE_WOLF_PUZZLE || mMode == 0x28) { return procWolfGiantPuzzleInit(); } else if (checkCargoCarry()) { return procWolfCargoCarryInit(); } else if (checkSlideAction()) { return 1; } else if (checkEndResetFlg1(ERFLG1_NS_SCREAM)) { return procWolfScreamWaitInit(); } return 0; } int daAlink_c::checkNextActionWolf(int param_0) { if (checkDeadAction(1)) { return 1; } if (checkEndResetFlg1(ERFLG1_MIDNA_RIDE_SHOCK) && (mProcID == PROC_WOLF_WAIT || mProcID == PROC_WOLF_SERVICE_WAIT || mProcID == PROC_WOLF_TIRED_WAIT || (!checkInputOnR() && mProcID == PROC_WOLF_MOVE) || mProcID == PROC_WOLF_LIE_START || mProcID == PROC_WOLF_LIE_MOVE || mProcID == PROC_WOLF_ATN_AC_MOVE)) { return procWolfMidnaRideShockInit(); } if ((!checkAttentionState() || (mProcID != PROC_WOLF_WAIT_ATTACK && mProcID != PROC_WOLF_JUMP_AT_NORMAL_LAND)) && ((mProcID != PROC_WOLF_WAIT_SLIP && !param_0) || checkInputOnR())) { if (checkAttentionState()) { setSpeedAndAngleWolfAtn(); } else { setSpeedAndAngleWolf(); } } setFrontWallType(); if (checkSlope()) { if (checkWolfDashMode()) { mMaxSpeed = mpHIO->mWolf.mWlSlide.m.mClimbingMaxSpeed; } else { mMaxSpeed = mpHIO->mWolf.mWlSlide.m.mClimbingMaxSpeedWeak; } } else if (checkFmChainGrabAnime()) { mMaxSpeed = 13.0f; } else if (mTargetedActor != NULL) { mMaxSpeed = mpHIO->mWolf.mWlAtnMove.m.mMaxSpeed; } else if (checkAttentionState()) { mMaxSpeed = mpHIO->mWolf.mWlMove.m.mGazeMaxSpeed; } else if (checkNoResetFlg1(FLG1_DASH_MODE)) { if (checkWolfSlowDash()) { mMaxSpeed = mpHIO->mWolf.mWlMove.m.mADashMaxSpeedSlow; } else if (field_0x2fc7 == 2) { mMaxSpeed = mpHIO->mWolf.mWlMove.m.mADashMaxSpeedSlow2; } else { mMaxSpeed = mpHIO->mWolf.mWlMove.m.mADashMaxSpeed; } } else if (checkWolfDashMode()) { mMaxSpeed = mpHIO->mWolf.mWlMove.m.mMaxSpeed; } else { mMaxSpeed = mpHIO->mWolf.mWlMoveNoP.m.mMaxSpeed; } if (checkWolfGroundSpecialMode()) { return 1; } if (checkWolfLieContinue(0)) { return procWolfLieStartInit(0); } if (checkNextActionFromButton()) { return 1; } fopAc_ac_c* var_r4 = checkWolfRopeHit(&mTgCyls[0], mTgCyls[0].GetCP(), FALSE); if (var_r4 == NULL) { var_r4 = checkWolfRopeHit(&mTgCyls[1], ¤t.pos, FALSE); } if (var_r4 != NULL) { field_0x280c.setData(var_r4); return procWolfRopeMoveInit(0, 1); } if (param_0 && !checkInputOnR()) { return 0; } BOOL rt; if (!checkInputOnR() && mProcID == PROC_WOLF_WAIT_SLIP && checkWolfWaitSlipPolygon()) { rt = FALSE; } else if (checkAttentionState()) { rt = procWolfAtnActorMoveInit(); } else { field_0x2f98 = 4; if (checkZeroSpeedF()) { if (!checkEventRun() && mStickValue > 0.85f && abs(field_0x3180) < 0x5000 && (mProcID == PROC_WOLF_WAIT || mProcID == PROC_WOLF_MOVE) && cLib_distanceAngleS(mMoveAngle, current.angle.y) > 0x7000) { if (checkEndResetFlg1(ERFLG1_UNK_200000)) { rt = procWolfSlipTurnInit(0); } else { rt = 0; } if (!rt && !checkEventRun()) { rt = checkWaitAction(); } } else { rt = checkWaitAction(); } } else if (checkInputOnR() && mGndPolySpecialCode != dBgW_SPCODE_ICE && abs(field_0x3180) < 0x5000 && cLib_distanceAngleS(mMoveAngle, current.angle.y) > 0x7000 && ((checkWolfDashMode() && speedF / mMaxSpeed > mpHIO->mWolf.mWlMove.m.mSlipStartRate) || (!checkWolfDashMode() && speedF / mMaxSpeed > mpHIO->mWolf.mWlMoveNoP.m.mSlideStartRate))) { rt = procWolfSlipInit(); } else { rt = procWolfMoveInit(); } } return rt; } BOOL daAlink_c::wolfSideBgCheck(s16 param_0) { s16 var_r31 = current.angle.y - param_0; if (var_r31 == 0) { return 0; } f32 temp_f31 = cM_scos(param_0); f32 temp_f30 = cM_ssin(param_0); f32 temp_f29 = cM_scos(current.angle.y); f32 temp_f28 = cM_ssin(current.angle.y); cXyz sp14(current.pos.x + temp_f30 * 90.0f, current.pos.y + mAcchCir[2].GetWallH(), current.pos.z + temp_f31 * 90.0f); cXyz sp8(current.pos.x + temp_f28 * 90.0f, sp14.y, current.pos.z + temp_f29 * 90.0f); if (var_r31 > 0) { sp8.x += temp_f29 * 35.0f; sp8.z -= temp_f28 * 35.0f; } else { sp8.x -= temp_f29 * 35.0f; sp8.z += temp_f28 * 35.0f; } if (commonLineCheck(&sp14, &sp8)) { sp14.x = current.pos.x - temp_f30 * 50.0f; sp14.z = current.pos.z - temp_f31 * 50.0f; sp8.x = current.pos.x - temp_f28 * 50.0f; sp8.z = current.pos.z - temp_f29 * 50.0f; if (var_r31 > 0) { sp8.x -= temp_f29 * 35.0f; sp8.z += temp_f28 * 35.0f; } else { sp8.x += temp_f29 * 35.0f; sp8.z -= temp_f28 * 35.0f; } if (commonLineCheck(&sp14, &sp8)) { return true; } } return false; } BOOL daAlink_c::checkWolfAttackReverse(int param_0) { if (mProcID != PROC_WOLF_LOCK_ATTACK && checkAtShieldHit(mAtCyl)) { return procWolfAttackReverseInit(); } if ((checkNoResetFlg0(daPy_FLG0(FLG0_UNK_10 | FLG0_UNK_8)) && mProcID == PROC_WOLF_DASH) || (param_0 && !checkNoResetFlg3(FLG3_UNK_400) && checkNoResetFlg1(FLG1_UNK_20000000) && cLib_distanceAngleS(field_0x3092, current.angle.y) > 0x6000)) { if (mProcID == PROC_WOLF_DASH) { return procWolfDashReverseInit(0); } else { if (checkNoResetFlg3(FLG3_UNK_800000)) { dComIfGp_setHitMark(2, NULL, &field_0x378c, &field_0x3166, NULL, 0); } return procWolfAttackReverseInit(); } } return false; } int daAlink_c::checkWolfBarrierHitReverse() { if (field_0x3100 != 0 && mProcID != PROC_FRONT_ROLL_SUCCESS && mProcID != PROC_DAMAGE && mProcID != PROC_WOLF_ATTACK_REVERSE && mProcID != PROC_WOLF_DASH_REVERSE) { if (checkWolf()) { return procWolfDashReverseInit(1); } else if (mLinkAcch.ChkGroundHit()) { if (cLib_distanceAngleS(shape_angle.y, field_0x3102) >= 0x4000) { setFrontRollCrashShock(0); return procDamageInit(NULL, 1); } else { return procFrontRollSuccessInit(); } } else { setFrontRollCrashShock(0); return procCoLargeDamageInit(-6, TRUE, 0, 0, NULL, 0); } } return 0; } BOOL daAlink_c::checkWolfBarrierWallHit(cBgS_PolyInfo& i_polyinfo) { if (field_0x3100 != 0 || checkZeroSpeedF()) { return false; } s16 bg_name = getMoveBGActorName(i_polyinfo, TRUE); if (bg_name == fpcNm_OBJ_TP_e || bg_name == fpcNm_OBJ_GB_e || bg_name == fpcNm_Obj_GanonWall2_e) { return true; } return false; } void daAlink_c::wolfBgCheck() { offNoResetFlg3(daPy_FLG3(FLG3_UNK_800000 | FLG3_UNK_400)); if (checkModeFlg(0x224000) || mProcID == PROC_WOLF_TAG_JUMP || mProcID == PROC_LARGE_DAMAGE) { offNoResetFlg1(FLG1_UNK_20000000); return; } cXyz sp38; cXyz sp2C; cXyz sp20; cXyz sp14; cXyz sp8; int var_r24 = 0; int i; f32 temp_f27 = cM_ssin(shape_angle.y); f32 temp_f26 = cM_scos(shape_angle.y); f32 temp_f30; f32 var_f31; f32 var_f29; f32 var_f28; if (checkModeFlg(2)) { var_f29 = 0.0f; var_f28 = 1.0f; } else { var_f29 = cM_ssin(shape_angle.x); var_f28 = cM_scos(shape_angle.x); } int var_r26; if (checkModeFlg(0x40000)) { var_r26 = 0; } else { var_r26 = 2; } cM3dGPla tripla; for (i = 0; i < 2; i++) { sp38.set(current.pos.x, current.pos.y + mAcchCir[2].GetWallH(), current.pos.z); if (mLinkAcch.ChkGroundHit()) { sp38.y -= speed.y; } if (i == 0) { var_f31 = -50.0f; } else { var_f31 = 90.0f; } temp_f30 = var_f31 * var_f28; sp2C.set(current.pos.x + (temp_f30 * temp_f27), sp38.y - (var_f31 * var_f29), current.pos.z + (temp_f30 * temp_f26)); int var_r28 = getCrawlMoveVec(&sp38, &sp2C, &sp20, var_r26, 0, &field_0x2fca); if (var_r28) { if (dComIfG_Bgsp().GetPolyAttackThrough(mLinkLinChk)) { onNoResetFlg3(FLG3_UNK_400); } if (checkWolfBarrierWallHit(mLinkLinChk)) { setWolfBarrierHitEffect(mLinkLinChk); } else { onNoResetFlg3(FLG3_UNK_800000); dComIfG_Bgsp().GetTriPla(mLinkLinChk, &tripla); field_0x378c = mLinkLinChk.GetCross(); } } sp38.y -= mAcchCir[2].GetWallH() - mAcchCir[0].GetWallH(); sp2C.y -= mAcchCir[2].GetWallH() - mAcchCir[0].GetWallH(); int var_r25 = getCrawlMoveVec(&sp38, &sp2C, &sp14, var_r26, 0, &field_0x2fca); if (var_r25) { if (dComIfG_Bgsp().GetPolyAttackThrough(mLinkLinChk)) { onNoResetFlg3(FLG3_UNK_400); } if (checkWolfBarrierWallHit(mLinkLinChk)) { setWolfBarrierHitEffect(mLinkLinChk); } else { onNoResetFlg3(FLG3_UNK_800000); dComIfG_Bgsp().GetTriPla(mLinkLinChk, &tripla); field_0x378c = mLinkLinChk.GetCross(); } } if (var_r28 != 0 || var_r25 != 0) { onNoResetFlg1(FLG1_UNK_20000000); if (var_r28 != 0 && var_r25 != 0) { if (sp20.abs2() > sp14.abs2()) { sp8 = sp20; } else { sp8 = sp14; } } else if (var_r28 != 0) { sp8 = sp20; } else { sp8 = sp14; } sp38 -= sp8; sp2C -= sp8; var_r28 = getCrawlMoveVec(&sp38, &sp2C, &sp20, var_r26, 0, NULL); sp38.y += mAcchCir[2].GetWallH() - mAcchCir[0].GetWallH(); sp2C.y += mAcchCir[2].GetWallH() - mAcchCir[0].GetWallH(); var_r25 = getCrawlMoveVec(&sp38, &sp2C, &sp14, var_r26, 0, NULL); if (var_r28 != 0 || var_r25 != 0) { if (var_r28 != 0 && var_r25 != 0) { if (sp20.abs2() > sp14.abs2()) { sp8 += sp20; } else { sp8 += sp14; } } else if (var_r28 != 0) { sp8 += sp20; } else { sp8 += sp14; } } current.pos -= sp8; field_0x3092 = cM_atan2s(-sp8.x, -sp8.z); if (checkNoResetFlg3(FLG3_UNK_800000)) { field_0x3166.set(cM_atan2s(tripla.mNormal.y, tripla.mNormal.absXZ()), cM_atan2s(-tripla.mNormal.x, -tripla.mNormal.z), 0); } var_r24++; } } if (var_r24 == 0 && checkNoResetFlg1(FLG1_UNK_20000000)) { for (i = 0; i < 2; i++) { sp38.set(current.pos.x, current.pos.y + mAcchCir[2].GetWallH(), current.pos.z); if (mLinkAcch.ChkGroundHit()) { sp38.y -= speed.y; } if (i == 0) { var_f31 = -60.0f; } else { var_f31 = 100.0f; } temp_f30 = var_f31 * var_f28; sp2C.set(current.pos.x + (temp_f30 * temp_f27), sp38.y - (var_f31 * var_f29), current.pos.z + (temp_f30 * temp_f26)); if (getCrawlMoveVec(&sp38, &sp2C, &sp20, var_r26, 0, NULL)) { break; } sp38.y -= mAcchCir[2].GetWallH() - mAcchCir[0].GetWallH(); sp2C.y -= mAcchCir[2].GetWallH() - mAcchCir[0].GetWallH(); if (getCrawlMoveVec(&sp38, &sp2C, &sp14, var_r26, 0, NULL)) { break; } } if (i == 2) { offNoResetFlg1(FLG1_UNK_20000000); } } if (var_r24 == 2) { if (field_0x2fa6 == 0 && !checkEndResetFlg1(ERFLG1_UNK_200000)) { s16 var_r27 = field_0x3092 - shape_angle.y; if (var_r27 <= 0) { ANGLE_ADD(var_r27, 0x4000); } else { ANGLE_SUB(var_r27, 0x4000); } mPrevAngleY += var_r27; current.angle.y += var_r27; shape_angle.y += var_r27; } field_0x2fa6 = 3; } else if (field_0x2fa6 != 0) { field_0x2fa6--; } } void daAlink_c::changeWolfBlendRate(int param_0) { if (checkWolfGrabAnime()) { if (param_0 == 7) { mNowAnmPackUpper[2].setRatio(0.0f); } else if (param_0 == 3) { mNowAnmPackUpper[2].setRatio(1.0f); } } else if (checkBarkAnime()) { if (param_0 == 2) { mNowAnmPackUpper[2].setRatio(0.0f); } else if (param_0 == 3) { mNowAnmPackUpper[2].setRatio(1.0f); } } } void daAlink_c::setWolfFootMatrix() { static const u16 fFootJoint[] = { 16, 21, }; static const u16 bFootJoint[] = { 28, 33, }; daAlink_footData_c* footData = mFootData1; int i, j; int var_r31; for (i = 0; i < 2; i++, footData++) { var_r31 = fFootJoint[i]; for (j = 0; j < 3; j++, var_r31++) { cMtx_copy(mpLinkModel->getAnmMtx(var_r31), footData->field_0x14[j]); if (j == 1) { var_r31++; } } } footData = mFootData2; for (i = 0; i < 2; i++, footData++) { var_r31 = bFootJoint[i]; for (j = 0; j < 3; j++, var_r31++) { cMtx_copy(mpLinkModel->getAnmMtx(var_r31), footData->field_0x14[j]); if (j == 0) { var_r31++; } } } if (!m_oldFrameCalc->getOldFrameFlg()) { return; } cXyz sp40[4]; cXyz sp34(0.0f, 0.0f, 0.0f); cXyz sp28; footData = mFootData1; for (i = 0; i < 2; i++, footData++) { var_r31 = fFootJoint[i]; for (j = 0; j < 4; j++, var_r31++) { mDoMtx_multVecZero(mpLinkModel->getAnmMtx(var_r31), &sp40[j]); } var_r31 = fFootJoint[i]; setMatrixWorldAxisRot(mpLinkModel->getAnmMtx(var_r31), footData->field_0x6, 0, 0, 0, NULL); sp34.x = sp40[0].abs(sp40[1]); mDoMtx_stack_c::multVec(&sp34, &sp28); var_r31++; setMatrixWorldAxisRot(mpLinkModel->getAnmMtx(var_r31), footData->field_0x4, 0, 0, 0, &sp28); sp34.x = sp40[1].abs(sp40[2]); mDoMtx_stack_c::multVec(&sp34, &sp28); var_r31++; setMatrixWorldAxisRot(mpLinkModel->getAnmMtx(var_r31), footData->field_0x4, 0, 0, 0, &sp28); sp34.x = sp40[2].abs(sp40[3]); mDoMtx_stack_c::multVec(&sp34, &sp28); var_r31++; setMatrixWorldAxisRot(mpLinkModel->getAnmMtx(var_r31), footData->field_0x2, 0, 0, 0, &sp28); } footData = mFootData2; for (i = 0; i < 2; i++, footData++) { var_r31 = bFootJoint[i]; for (j = 0; j < 4; j++, var_r31++) { mDoMtx_multVecZero(mpLinkModel->getAnmMtx(var_r31), &sp40[j]); } var_r31 = bFootJoint[i]; setMatrixWorldAxisRot(mpLinkModel->getAnmMtx(var_r31), footData->field_0x6, 0, 0, 0, NULL); sp34.x = sp40[0].abs(sp40[1]); mDoMtx_stack_c::multVec(&sp34, &sp28); var_r31++; setMatrixWorldAxisRot(mpLinkModel->getAnmMtx(var_r31), footData->field_0x6, 0, 0, 0, &sp28); sp34.x = sp40[1].abs(sp40[2]); mDoMtx_stack_c::multVec(&sp34, &sp28); var_r31++; setMatrixWorldAxisRot(mpLinkModel->getAnmMtx(var_r31), footData->field_0x4, 0, 0, 0, &sp28); sp34.x = sp40[2].abs(sp40[3]); mDoMtx_stack_c::multVec(&sp34, &sp28); var_r31++; setMatrixWorldAxisRot(mpLinkModel->getAnmMtx(var_r31), footData->field_0x2, 0, 0, 0, &sp28); } } void daAlink_c::wolfFootBgCheck() { int i; int j; if (m_oldFrameCalc->getOldFrameFlg()) { cXyz spBC; cXyz spB0; u32 sp30; MtxP sp2C = mpLinkModel->getBaseTRMtx(); sp30 = checkModeFlg(1); cXyz spC8[4]; f32 spA0[2][2]; s16 sp58[2][2]; s16 sp50[2][2]; s16 sp48[2][2]; int sp40[2]; f32 sp38[2]; static Vec const localFootOffset = {6.0f, -5.0f, 0.0f}; static Vec const frontOffset = {0.0f, 0.0f, 50.0f}; mDoMtx_multVec(mpLinkModel->getAnmMtx(0x13), &localFootOffset, &spC8[0]); mDoMtx_multVec(mpLinkModel->getAnmMtx(0x18), &localFootOffset, &spC8[1]); mDoMtx_multVec(mpLinkModel->getAnmMtx(0x1F), &localFootOffset, &spC8[2]); mDoMtx_multVec(mpLinkModel->getAnmMtx(0x24), &localFootOffset, &spC8[3]); BOOL sp28 = !mLinkAcch.ChkGroundHit() || checkModeFlg(0x78C52); BOOL sp24 = sp28 || (mLinkAcch.ChkGroundHit() && mSinkShapeOffset < 0.0f); int j; int i; daAlink_footData_c* footData; f32* sp20 = &spA0[0][0]; cXyz* var_r26 = &spC8[0]; f32 temp_f31; f32 temp_f30; f32 temp_f29; f32 var_f28; f32 temp_f27; temp_f29 = 50.0f * fabsf(cM_ssin(field_0x2ff0)); temp_f27 = 30.0f + temp_f29; f32 sp1C = -temp_f27; mDoMtx_stack_c::XrotS(-shape_angle.x); mDoMtx_stack_c::YrotM(-shape_angle.y); for (i = 0; i < 2; i++) { if (i == 0) { footData = mFootData1; } else { footData = mFootData2; } for (j = 0; j < 2; j++, footData++, sp20++, var_r26++) { if (sp24) { footData->field_0x1 = 0xF; } else { spB0 = *var_r26 - footData->field_0x8; if (spB0.abs2XZ() < 100.0f && sp30 && footData->field_0x0 != 0) { if (footData->field_0x1 != 0) { footData->field_0x1--; } else { *var_r26 = footData->field_0x8; } } else { footData->field_0x1 = 0xF; } } footData->field_0x8 = *var_r26; spBC.set(var_r26->x, temp_f29 + (50.0f + (current.pos.y + l_autoUpHeight)), var_r26->z); mLinkGndChk.SetPos(&spBC); temp_f31 = dComIfG_Bgsp().GroundCross(&mLinkGndChk); temp_f30 = var_r26->y - temp_f31; if (-G_CM3D_F_INF != temp_f31 && temp_f30 < temp_f27 && temp_f30 > sp1C) { *sp20 = temp_f31; footData->field_0x0 = 1; sp48[i][j] = getGroundAngle(&mLinkGndChk, shape_angle.y); spBC.set(var_r26->x - current.pos.x, temp_f31 - current.pos.y, var_r26->z - current.pos.z); mDoMtx_stack_c::multVec(&spBC, &spB0); *sp20 = spB0.y + current.pos.y; } else { *sp20 = current.pos.y; footData->field_0x0 = 0; } } } if (!sp24) { for (i = 0; i < 2; i++) { if (spA0[i][1] > spA0[i][0]) { sp38[i] = spA0[i][0]; sp40[i] = 0; } else { sp38[i] = spA0[i][1]; sp40[i] = 1; } } if (sp38[0] > sp38[1]) { var_f28 = sp38[1]; } else { var_f28 = sp38[0]; } } setSandShapeOffset(); setMatrixOffset(&mSinkShapeOffset, mSinkShapeOffset); setSandDownBgCheckWallH(); var_f28 = 0.0f; setMatrixOffset(&field_0x2b94, var_f28); for (i = 0; i < 2; i++) { if (i == 0) { footData = mFootData1; } else { footData = mFootData2; } for (j = 0; j < 2; j++, footData++) { if (sp24 || (i == 0 && checkUnderMove0BckNoArcWolf(WANM_SMELL))) { sp58[i][j] = 0; sp50[i][j] = 0; } else { temp_f30 = spA0[i][j] - sp2C[1][3]; if (temp_f30 >= 35.0f) { temp_f30 = 35.0f; } if (temp_f30 > 0.0f || sp30) { if (!setLegAngle(temp_f30, footData, &sp58[i][j], &sp50[i][j], 1)) { sp58[i][j] = 0; sp50[i][j] = 0; } } else { sp58[i][j] = 0; sp50[i][j] = 0; } } cLib_addCalcAngleS(&footData->field_0x6, sp58[i][j], 2, 0x1800, 0x10); cLib_addCalcAngleS(&footData->field_0x4, sp50[i][j], 2, 0x1800, 0x10); s16 spE; if (mProcID == PROC_WOLF_SLIDE_READY) { spE = shape_angle.x; } else { spE = -shape_angle.x; } if (!sp24 && footData->field_0x0 != 0 && mGroundCode != 8 && sp30) { spE += sp48[i][j]; } cLib_addCalcAngleS(&footData->field_0x2, spE, 2, 0x1800, 0x10); } } s16 spC; if (!sp28) { cXyz sp90; cXyz sp84; mDoMtx_stack_c::transS(current.pos); mDoMtx_stack_c::YrotM(shape_angle.y + field_0x308c); mDoMtx_stack_c::multVec(&frontOffset, &sp90); sp84 = (current.pos * 2.0f) - sp90; sp90.y += 165.0f; sp84.y += 165.0f; mLinkGndChk.SetPos(&sp90); temp_f31 = dComIfG_Bgsp().GroundCross(&mLinkGndChk); if (fabsf(temp_f31 - current.pos.y) < 55.0f + temp_f29) { sp90.y = temp_f31; } else { sp90.y = current.pos.y; } int sp18; if (-G_CM3D_F_INF != temp_f31) { sp18 = dComIfG_Bgsp().GetPolyAtt0(mLinkGndChk); } if (-G_CM3D_F_INF == temp_f31 || sp18 == 3 || sp18 == 0xD) { sp90.y += mSinkShapeOffset; } mLinkGndChk.SetPos(&sp84); temp_f31 = dComIfG_Bgsp().GroundCross(&mLinkGndChk); if (fabsf(temp_f31 - current.pos.y) < 55.0f + temp_f29) { sp84.y = temp_f31; } else { sp84.y = current.pos.y; } if (-G_CM3D_F_INF != temp_f31) { sp18 = dComIfG_Bgsp().GetPolyAtt0(mLinkGndChk); } if (-G_CM3D_F_INF == temp_f31 || sp18 == 3 || sp18 == 0xD) { sp84.y += mSinkShapeOffset; } sp90 -= sp84; spC = sp90.atan2sY_XZ(); } else if (checkModeFlg(0x20000) || mProcID == PROC_METAMORPHOSE || mProcID == PROC_WOLF_TAG_JUMP) { spC = mProcVar2.field_0x300c; } else if (mProcID == PROC_WOLF_SLIP_TURN || mProcID == PROC_WOLF_SLIDE_READY || mProcID == PROC_WOLF_DIG || mProcID == PROC_WOLF_SLIP_TURN_LAND) { spC = field_0x2ff0; } else { spC = 0; } if (mProcID != PROC_WOLF_CARGO_CARRY) { cLib_addCalcAngleS(&shape_angle.x, spC, 3, 0x1000, 1000); } if (checkModeFlg(1) ) { spC = -shape_angle.x; } else { spC = 0; } cLib_addCalcAngleS(&field_0x30d6, spC, 3, 0x1000, 0x100); } } BOOL daAlink_c::checkWolfWaitSlipPolygon() { if (!dComIfG_Bgsp().ChkPolySafe(mLinkAcch.m_gnd) || mGndPolySpecialCode == dBgW_SPCODE_HEAVY_SNOW || mGroundCode == 8) { return FALSE; } cM3dGPla tripla; if (!dComIfG_Bgsp().GetTriPla(mLinkAcch.m_gnd, &tripla) || !cBgW_CheckBGround(tripla.mNormal.y)) { return FALSE; } if (mGndPolySpecialCode == dBgW_SPCODE_LIGHT_SNOW && tripla.mNormal.y < cM_scos(cM_deg2s(mpHIO->mSlide.m.mClimbAngle))) { return TRUE; } return cM_atan2s(tripla.mNormal.absXZ(), tripla.mNormal.y) > field_0x3122; } f32 daAlink_c::setWolfWaitSlip() { cM3dGPla tripla; dComIfG_Bgsp().GetTriPla(mLinkAcch.m_gnd, &tripla); current.angle.y = tripla.mNormal.atan2sX_Z(); f32 var_f31; f32 temp_f30 = JMAFastSqrt(1.0f - tripla.mNormal.y); if (abs((s16)(shape_angle.y - current.angle.y)) >= 0x4000) { mProcVar2.field_0x300c = 1; var_f31 = -1000.0f; } else { mProcVar2.field_0x300c = 0; var_f31 = 1000.0f; } field_0x37c8.set(current.pos.x + (temp_f30 * (var_f31 * tripla.mNormal.x)), eyePos.y - (var_f31 * tripla.mNormal.y), current.pos.z + (temp_f30 * (var_f31 * tripla.mNormal.z))); return temp_f30; } void daAlink_c::checkWolfAtnDoCharge() {} void daAlink_c::setWolfChainPos() { static const int dummy1 = 0; static const int dummy2 = 0; static Vec const wolfChainBaseOffset = {22.0f, 0.0f, -12.0f}; static Vec const wolfChainVec = {0.0f, 0.0f, -9.0f}; f32 temp_f31; f32 temp_f30; int i; if (mClothesChangeWaitTimer == 0) { cXyz* var_r29 = field_0x363c; cXyz* var_r26 = field_0x366c; csXyz* var_r30 = field_0x3142; if (checkEndResetFlg0(ERFLG0_UNK_800000)) { for (i = 0; i < 4; i++, var_r26++) { *var_r26 = cXyz::Zero; } var_r26 = field_0x366c; } cXyz sp78; mDoMtx_multVec(mpLinkModel->getAnmMtx(17), &wolfChainBaseOffset, &sp78); cXyz sp6C; mDoMtx_multVecSR(mpLinkModel->getAnmMtx(17), &cXyz::BaseZ, &sp6C); s16 sp12 = sp6C.atan2sX_Z(); s16 sp10 = sp6C.atan2sY_XZ(); mDoMtx_multVecSR(mpLinkModel->getAnmMtx(17), &cXyz::BaseY, &sp6C); s16 spE = (cM_atan2s(sp6C.y, sp6C.absXZ()) + 0x4000); if (!checkNoResetFlg1(FLG1_UNK_200000)) { onNoResetFlg1(FLG1_UNK_200000); mDoMtx_stack_c::transS(sp78); mDoMtx_stack_c::ZXYrotM(-0x2000, sp12, 0); mDoMtx_stack_c::multVec(&wolfChainVec, var_r29); var_r30->set(-0x2000, sp12, spE); *var_r26 = cXyz::Zero; var_r29++; var_r26++; var_r30++; for (int i = 1; i < 4; i++, var_r29++, var_r26++, var_r30++) { *var_r29 = *(var_r29 - 1); var_r29->y -= 9.0f; *var_r30 = *(var_r30 - 1); ANGLE_ADD_2(var_r30->z, 0x4000); *var_r26 = cXyz::Zero; } } else { cXyz sp60; cXyz sp54; for (i = 0; i < 4; i++, var_r29++, var_r26++, var_r30++) { sp60 = *var_r29; if (checkEndResetFlg0(ERFLG0_UNK_800000)) { sp6C = cXyz::Zero; } else { sp6C = (*var_r29 - sp78) + *var_r26; } sp6C.y += -1.5f; temp_f30 = sp6C.absXZ(); s16 spC = cM_atan2s(sp6C.y, temp_f30); s16 spA; if (temp_f30 < 1.0f) { spA = var_r30->y; } else { spA = cM_atan2s(-sp6C.x, -sp6C.z); } s16 sp8; if (i == 0) { sp8 = (spA - sp12); if (sp8 > 0x2000) { spA = (sp12 + 0x2000); } else if (sp8 < -0x2000) { spA = (sp12 - 0x2000); } sp8 = (spC - sp10); if (sp8 > 0x2000) { spC = (sp10 + 0x2000); } else if (sp8 < -0x2000) { spC = (sp10 - 0x2000); } } var_r30->set(spC, spA, spE); mDoMtx_stack_c::transS(sp78); mDoMtx_stack_c::ZXYrotM(*var_r30); mDoMtx_stack_c::multVec(&wolfChainVec, var_r29); sp54.set(var_r29->x, 10.0f + var_r29->y, var_r29->z); mLinkGndChk.SetPos(&sp54); temp_f31 = 3.0f + dComIfG_Bgsp().GroundCross(&mLinkGndChk); if (temp_f31 > var_r29->y) { var_r30->x = cM_atan2s(sp6C.y + (temp_f31 - var_r29->y), temp_f30 + (temp_f31 - var_r29->y)); cM3dGPla sp84; dComIfG_Bgsp().GetTriPla(mLinkGndChk, &sp84); var_r30->z = fopAcM_getPolygonAngle(&sp84, (var_r30->y + 0x4000)); sp8 = var_r30[-1].z - var_r30->z; if ((sp8 >= 0 && sp8 <= 0x4000) || sp8 < -0x4000) { ANGLE_SUB_2(var_r30->z, 0x2000); } else { ANGLE_ADD_2(var_r30->z, 0x2000); } mDoMtx_stack_c::transS(sp78); mDoMtx_stack_c::ZXYrotM(*var_r30); mDoMtx_stack_c::multVec(&wolfChainVec, var_r29); } *var_r26 = (*var_r29 - sp60) * 0.8f; sp78 = *var_r29; spE = (var_r30->z + 0x4000); } } for (i = 0; i < 4; i++) { mDoMtx_stack_c::transS(field_0x363c[i]); mDoMtx_stack_c::ZXYrotM(field_0x3142[i]); mpWlChainModels[i]->setBaseTRMtx(mDoMtx_stack_c::get()); mpWlChainModels[i]->calc(); } } } void daAlink_c::setWolfAnmVoice() { static u32 const label[12] = { Z2SE_WL_V_BREATH_SIT, Z2SE_WL_V_BREATH_WAIT, Z2SE_WL_V_BREATH_WALK, Z2SE_WL_V_BREATH_TIRED, Z2SE_WL_V_DASH, Z2SE_WL_V_BREATH_JUMP, Z2SE_WL_V_SLIP_CLIMB, Z2SE_WL_V_PUSH_ROCK, Z2SE_WL_V_TURN_BACK, Z2SE_WL_V_HOLD_THROW, Z2SE_WL_V_FAILED, Z2SE_WL_V_NOSE, }; const s8* var_r29 = field_0x2160; if (field_0x2fd8 >= 12 || field_0x215c == NULL) { return; } for (int i = 0; i < 4; i++, var_r29++) { if (*var_r29 == -1) { return; } if (field_0x215c->checkPass(*var_r29)) { voiceStart(label[field_0x2fd8]); } } } int daAlink_c::procWolfServiceWaitInit(int param_0) { commonProcInit(PROC_WOLF_SERVICE_WAIT); mProcVar5.field_0x3012 = 0; if (param_0 == 2) { setSingleAnimeWolfBase(WANM_SERVICE_WAIT_D); field_0x3198 = 0; mProcVar2.field_0x300c = 0; mProcVar5.field_0x3012 = 1; } else if (param_0 == 1) { if (cM_rnd() < 0.5f) { setSingleAnimeWolfBase(WANM_SERVICE_WAIT_A); setFaceBasicTexture(FTANM_WL_SWAITA); field_0x3198 = 0; mProcVar2.field_0x300c = 0; } else { setSingleAnimeWolf(WANM_SIT, 1.0f, mpHIO->mWolf.mWlLie.m.mSittingAnm.mStartFrame, mpHIO->mWolf.mWlLie.m.mSittingAnm.mEndFrame, mpHIO->mWolf.mWlLie.m.mSittingAnm.mInterpolation); field_0x3198 = 0; mProcVar2.field_0x300c = 1; } } else { setSingleAnimeWolfBase(WANM_WAIT_A_TO_S); field_0x3198 = 0; mProcVar2.field_0x300c = 0; } mProcVar4.field_0x3010 = 0; mProcVar0.field_0x3008 = cM_rndF(150.0f) + 150.0f; mNormalSpeed = 0.0f; current.angle.y = shape_angle.y; field_0x2f98 = 4; return 1; } int daAlink_c::procWolfServiceWait() { daPy_frameCtrl_c* framectrl = &mUnderFrameCtrl[0]; if (mDemo.getDemoMode() != daPy_demo_c::DEMO_UNK_94_e && !checkNextActionWolf(0) && !checkFrontWallTypeAction() && ((checkEventRun() && mProcVar5.field_0x3012 == 0) || shape_angle.y != mPrevAngleY)) { framectrl->setRate(0.0f); field_0x3198 = 1; procWolfWaitInit(); } else if (checkAnmEnd(framectrl)) { if (checkUnderMove0BckNoArcWolf(WANM_SERVICE_WAIT_A)) { setSingleAnimeWolfBase(WANM_WAIT_A_TO_S); field_0x3198 = 0; mProcVar2.field_0x300c = 0; } else if (mProcVar2.field_0x300c != 0) { setSingleAnimeWolfBaseSpeed(WANM_WAIT_SIT, mpHIO->mWolf.mWlLie.m.mSittingIdleAnmSpeed, mpHIO->mWolf.mWlLie.m.mSittingIdleInterp); } else if (mProcVar4.field_0x3010 == 0) { setSingleAnimeWolfBase(WANM_SERVICE_WAIT_D); } else { procWolfServiceWaitInit(1); } } else if (checkUnderMove0BckNoArcWolf(WANM_WAIT_SIT)) { mProcVar0.field_0x3008--; if (mProcVar0.field_0x3008 == 0) { setSingleAnimeWolfBaseSpeed(WANM_SIT, -1.0f, 2.0f); field_0x3198 = 1; mProcVar2.field_0x300c = 0; } } else if (checkUnderMove0BckNoArcWolf(WANM_SERVICE_WAIT_A) && framectrl->checkPass(25.0f)) { voiceStart(Z2SE_WL_V_YAWN); } else if (checkUnderMove0BckNoArcWolf(WANM_SERVICE_WAIT_D) && mProcVar5.field_0x3012 == 0) { mProcVar0.field_0x3008--; if (mProcVar0.field_0x3008 == 0 && mDemo.getDemoMode() != daPy_demo_c::DEMO_UNK_94_e) { setSingleAnimeWolfBaseSpeed(WANM_WAIT_A_TO_S, -1.0f, 3.0f); mProcVar4.field_0x3010 = 1; } } return 1; } int daAlink_c::procWolfTiredWaitInit() { if (checkWolfWaitSlipPolygon() && !checkInputOnR()) { return procWolfWaitSlipInit(); } if (!commonProcInitNotSameProc(PROC_WOLF_TIRED_WAIT)) { return 0; } mNormalSpeed = 0.0f; setSingleAnimeWolfBase(WANM_WAIT_TO_TIRED); return 1; } int daAlink_c::procWolfTiredWait() { daPy_frameCtrl_c* frameCtrl = mUnderFrameCtrl; if (!checkNextActionWolf(0)) { if (checkAnmEnd(frameCtrl)) { setSingleAnimeWolfBase(WANM_WAIT_TIRED); } else if (frameCtrl->getAttribute() != 2) { } } return 1; } int daAlink_c::procWolfMidnaRideShockInit() { if (!checkWolf()) { dComIfGp_evmng_cutEnd(mAlinkStaffId); return procWaitInit(); } if (!commonProcInitNotSameProc(PROC_WOLF_MIDNA_RIDE_SHOCK)) { return 0; } setSingleAnimeWolfBase(WANM_MIDNA_SHOCK); setFaceBasicTexture(FTANM_WL_MDSHOCK); voiceStart(Z2SE_WL_V_MD_SHOCK); mNormalSpeed = 0.0f; current.angle.y = shape_angle.y; return 1; } int daAlink_c::procWolfMidnaRideShock() { daPy_frameCtrl_c* frameCtrl = mUnderFrameCtrl; if (checkAnmEnd(frameCtrl)) { if (mDemo.getDemoMode() == daPy_demo_c::DEMO_WOLF_MIDNA_RIDE_SHOCK_e) { dComIfGp_evmng_cutEnd(mAlinkStaffId); } else { checkNextActionWolf(0); } } else if (frameCtrl->getFrame() > 11.0f && mDemo.getDemoMode() != daPy_demo_c::DEMO_WOLF_MIDNA_RIDE_SHOCK_e) { checkNextActionWolf(1); } return 1; } int daAlink_c::procWolfWaitInit() { if (checkWolfWaitSlipPolygon() && !checkInputOnR()) { return procWolfWaitSlipInit(); } if (mProcID == PROC_WOLF_WAIT) { return 0; } if (mProcID == PROC_WOLF_SERVICE_WAIT && (!checkEventRun() || mProcVar5.field_0x3012 != 0) && (field_0x3198 == 0 || !checkAnmEnd(mUnderFrameCtrl)) && checkNoUpperAnime()) { return 0; } commonProcInit(PROC_WOLF_WAIT); setBlendWolfMoveAnime(mpHIO->mWolf.mWlMove.m.mIdleInterpolation); current.angle.y = shape_angle.y; field_0x2f98 = 4; mNormalSpeed = 0.0f; initServiceWaitTime(); return 1; } int daAlink_c::procWolfWait() { s16 old_shapeangle = shape_angle.y; if (!checkNextActionWolf(0) && !checkFrontWallTypeAction()) { field_0x33f0 = (s16)(shape_angle.y - old_shapeangle) * 0.004999999888241291f; setBlendWolfMoveAnime(-1.0f); if (checkServiceWaitMode()) { field_0x30ca--; if (field_0x30ca == 0) { procWolfServiceWaitInit(0); } } else { initServiceWaitTime(); } } return 1; } int daAlink_c::procWolfMoveInit() { if (!commonProcInitNotSameProc(PROC_WOLF_MOVE)) { return 0; } setBlendWolfMoveAnime(mpHIO->mWolf.mWlMove.m.mNormalInterpolation); setFootEffectProcType(3); return 1; } int daAlink_c::procWolfMove() { if (!checkNextActionWolf(0) && !checkFrontWallTypeAction()) { if (mDemo.getDemoMode() == daPy_demo_c::DEMO_UNK_2_e) { if (mNormalSpeed > mMaxSpeed * mpHIO->mWolf.mWlMoveNoP.m.mWalkToJogRate) { mNormalSpeed = mMaxSpeed * mpHIO->mWolf.mWlMoveNoP.m.mWalkToJogRate; } } setBlendWolfMoveAnime(-1.0f); field_0x30a2 = field_0x2fec; } return 1; } int daAlink_c::procWolfDashInit() { commonProcInit(PROC_WOLF_DASH); setSingleAnimeWolfParam(WANM_DASH_START, &mpHIO->mWolf.mWlMove.m.mADashAnm); setFootEffectProcType(3); current.angle.y = shape_angle.y; onNoResetFlg1(FLG1_DASH_MODE); mProcVar2.field_0x300c = 0; mProcVar3.field_0x300e = 0; if (checkWolfSlowDash()) { field_0x30d0 = mpHIO->mWolf.mWlMove.m.mADashDurationSlow; mMaxSpeed = mpHIO->mWolf.mWlMove.m.mADashMaxSpeedSlow; if (mNormalSpeed < mpHIO->mWolf.mWlMove.m.mADashInitSpeedSlow) { mNormalSpeed = mpHIO->mWolf.mWlMove.m.mADashInitSpeedSlow; } } else if (field_0x2fc7 == 2) { mMaxSpeed = mpHIO->mWolf.mWlMove.m.mADashMaxSpeedSlow2; mMaxSpeed = mpHIO->mWolf.mWlMove.m.mADashMaxSpeedSlow2; if (mNormalSpeed < mpHIO->mWolf.mWlMove.m.mADashInitSpeedSlow2) { mNormalSpeed = mpHIO->mWolf.mWlMove.m.mADashInitSpeedSlow2; } } else { field_0x30d0 = mpHIO->mWolf.mWlMove.m.mADashDuration; mMaxSpeed = mpHIO->mWolf.mWlMove.m.mADashMaxSpeed; if (mNormalSpeed < mpHIO->mWolf.mWlMove.m.mADashInitSpeed) { mNormalSpeed = mpHIO->mWolf.mWlMove.m.mADashInitSpeed; } } return 1; } int daAlink_c::procWolfDash() { daPy_frameCtrl_c* frameCtrl_p = mUnderFrameCtrl; cM3dGPla poly; if (getSlidePolygon(&poly)) { return checkNextActionWolf(0); } f32 step_amount; if (checkWolfSlowDash()) { step_amount = mpHIO->mWolf.mWlMove.m.mADashAccelerationSlow; } else if (field_0x2fc7 == 2) { step_amount = mpHIO->mWolf.mWlMove.m.mADashAccelerationSlow2; } else { step_amount = mpHIO->mWolf.mWlMove.m.mADashAcceleration; } cLib_chaseF(&mNormalSpeed, mMaxSpeed, step_amount); if (checkInputOnR()) { cLib_addCalcAngleS(¤t.angle.y, mMoveAngle, mpHIO->mWolf.mWlMove.m.mTurnAngleRate, mpHIO->mWolf.mWlMove.m.mTurnMax, mpHIO->mWolf.mWlMove.m.mTurnMin); shape_angle.y = current.angle.y; } if (frameCtrl_p->getFrame() > 3.0f && checkWolfAttackReverse(1)) { return 1; } if (swordSwingTrigger()) { mProcVar3.field_0x300e = 1; } if (checkAnmEnd(frameCtrl_p)) { if (mProcVar3.field_0x300e != 0) { return checkWolfAttackAction(); } if (checkWolfSlowDash()) { field_0x30d2 = mpHIO->mWolf.mWlMove.m.mADashCooldownTimeSlow; } else if (field_0x2fc7 == 2) { field_0x30d2 = mpHIO->mWolf.mWlMove.m.mADashCooldownTimeSlow2; } else { field_0x30d2 = mpHIO->mWolf.mWlMove.m.mADashCooldownTime; } return checkNextActionWolf(0); } else if (frameCtrl_p->getFrame() > mpHIO->mWolf.mWlMove.m.mADashAnm.mCancelFrame) { if (mProcVar3.field_0x300e != 0) { return checkWolfAttackAction(); } if (checkWolfSlowDash()) { field_0x30d2 = mpHIO->mWolf.mWlMove.m.mADashCooldownTimeSlow; } else if (field_0x2fc7 == 2) { field_0x30d2 = mpHIO->mWolf.mWlMove.m.mADashCooldownTimeSlow2; } else { field_0x30d2 = mpHIO->mWolf.mWlMove.m.mADashCooldownTime; } checkNextActionWolf(1); return 1; } else if (frameCtrl_p->checkPass(2.5f) || frameCtrl_p->checkPass(14.0f)) { field_0x2f9d = 0x60; onResetFlg1(RFLG1_UNK_30); } else if (frameCtrl_p->checkPass(8.0f) || frameCtrl_p->checkPass(16.5f)) { field_0x2f9d = 0x18; onResetFlg1(daPy_RFLG1(RFLG1_UNK_8 | RFLG1_UNK_4)); } field_0x30a2 = field_0x2fec; return 1; } int daAlink_c::procWolfDashReverseInit(int param_0) { commonProcInit(PROC_WOLF_DASH_REVERSE); setSingleAnimeWolf(WANM_ATTACK_RECOIL_GROUND, mpHIO->mWolf.mWlMove.m.mDashReboundAnm.mSpeed, mpHIO->mWolf.mWlMove.m.mDashReboundAnm.mStartFrame, 5, mpHIO->mWolf.mWlMove.m.mDashReboundAnm.mInterpolation); if (param_0) { current.angle.y = field_0x3102 + 0x8000; if (cLib_distanceAngleS(current.angle.y, shape_angle.y) > 0x6000) { mNormalSpeed = 10.0f; speed.y = 10.0f; } else { mNormalSpeed = 20.0f; speed.y = 15.0f; } mProcVar2.field_0x300c = 1; } else { mNormalSpeed = mpHIO->mWolf.mWlMove.m.mDashReboundHorizontalSpeed; speed.y = mpHIO->mWolf.mWlMove.m.mDashReboundVerticalSpeed; ANGLE_ADD_2(current.angle.y, 0x8000); mProcVar2.field_0x300c = 0; } dComIfGp_getVibration().StartShock(5, 15, cXyz(0.0f, 1.0f, 0.0f)); dKy_Sound_set(current.pos, 100, fopAcM_GetID(this), 5); seStartOnlyReverb(Z2SE_WOLF_BODYATTACK); field_0x3588 = l_wolfBaseAnime; onResetFlg0(RFLG0_FRONT_ROLL_CRASH); return 1; } int daAlink_c::procWolfDashReverse() { daPy_frameCtrl_c* frameCtrl_p = mUnderFrameCtrl; if (mProcVar2.field_0x300c == 0) { field_0x2f99 = 4; } if (!checkModeFlg(0x2)) { if (checkAnmEnd(frameCtrl_p)) { checkNextActionWolf(0); } else if (frameCtrl_p->getFrame() > mpHIO->mWolf.mWlMove.m.mDashReboundAnm.mCancelFrame) { checkNextActionWolf(1); } } else if (mProcVar2.field_0x300c != 0) { mProcVar2.field_0x300c = 0; } else if (((mLinkAcch.ChkGroundHit() || checkEndResetFlg2(ERFLG2_UNK_100)) && checkModeFlg(0x2))) { if (checkWolfLandAction(0)) { return 1; } mNormalSpeed = 0.0f; frameCtrl_p->setFrame(mpHIO->mWolf.mWlMove.m.mDashReboundAnm.mSpeed + frameCtrl_p->getFrame()); getNowAnmPackUnder(UNDER_0)->setFrame(frameCtrl_p->getFrame()); frameCtrl_p->setRate(mpHIO->mWolf.mWlMove.m.mDashReboundAnm.mSpeed); frameCtrl_p->setEnd(mpHIO->mWolf.mWlMove.m.mDashReboundAnm.mEndFrame); #if DEBUG mpHIO->jumpStateUpdate(&mLastJumpPos, ¤t.pos, l_jumpTop); #endif current.angle.y = shape_angle.y; offModeFlg(0x2); onModeFlg(0x8000); } return 1; } int daAlink_c::procWolfAtnActorMoveInit() { if (!commonProcInitNotSameProc(PROC_WOLF_ATN_AC_MOVE)) { return 0; } if (checkZeroSpeedF()) { onModeFlg(1); } setWolfAtnMoveDirection(); setBlendWolfAtnMoveAnime(mpHIO->mWolf.mWlMove.m.mNormalInterpolation); if (checkWolfAtnWait()) { voiceStartLevel(Z2SE_WL_V_ROAR); } return 1; } int daAlink_c::procWolfAtnActorMove() { setWolfAtnMoveDirection(); if (!checkNextActionWolf(0)) { if (checkZeroSpeedF()) { onModeFlg(1); if (checkWolfWaitSlipPolygon() && !checkInputOnR()) { return procWolfWaitSlipInit(); } } else { offModeFlg(1); } setBlendWolfAtnMoveAnime(-1.0f); if (checkWolfAtnWait()) { voiceStartLevel(Z2SE_WL_V_ROAR); } } return 1; } int daAlink_c::procWolfWaitTurnInit() { if (!commonProcInitNotSameProc(PROC_WOLF_WAIT_TURN)) { return 0; } f32 anm_speed; if (checkWolfDashMode()) { anm_speed = mpHIO->mWolf.mWlMove.m.mWalkAnmSpeed; } else { anm_speed = mpHIO->mWolf.mWlMoveNoP.m.mWalkAnmSpeed; } setSingleAnimeWolfBaseSpeed(WANM_WALK_A, anm_speed, mpHIO->mWolf.mWlMove.m.mNormalInterpolation); if (checkEventRun()) { mNormalSpeed = 0.0f; } mProcVar3.field_0x300e = mMoveAngle; current.angle.y = shape_angle.y; return 1; } int daAlink_c::procWolfWaitTurn() { f32 step_amount; if (checkWolfDashMode()) { step_amount = mpHIO->mWolf.mWlMove.m.mDeceleration; } else { step_amount = mpHIO->mWolf.mWlMoveNoP.m.mDeceleration; } cLib_chaseF(&mNormalSpeed, 0.0f, step_amount); if (checkWolfGroundSpecialMode()) { return 1; } s16 var_r31 = cLib_addCalcAngleS(&shape_angle.y, mProcVar3.field_0x300e, 30, 0x3CDF, 8000); current.angle.y = shape_angle.y; if (checkNextActionFromButton()) { return 1; } if (var_r31 == 0) { if (checkEventRun()) { if (mDemo.getDemoMode() == daPy_demo_c::DEMO_WAIT_TURN_e) { dComIfGp_evmng_cutEnd(mAlinkStaffId); } else { checkNextActionWolf(0); } } else { checkNextActionWolf(0); } } return 1; } int daAlink_c::procWolfSideStepInit(int param_0) { if (field_0x2f98 == 1 && !param_0 && checkFirstMidnaDemo() && !checkWolfGrabAnime() && field_0x2fcc != 0) { return procWolfBackJumpInit(0); } commonProcInit(PROC_WOLF_SIDESTEP); if (field_0x2f98 == 0 || param_0) { field_0x2f98 = 1; } if (field_0x2f98 == 1) { if (mTargetedActor != NULL) { mProcVar2.field_0x300c = cLib_targetAngleY(¤t.pos, &mTargetedActor->eyePos); } else { mProcVar2.field_0x300c = shape_angle.y; } current.angle.y = shape_angle.y + 0x8000; setSingleAnimeWolfParam(WANM_BACK_JUMP_START, &mpHIO->mWolf.mWlSideStep.m.mBackJumpAnm); mNormalSpeed = mpHIO->mWolf.mWlSideStep.m.mBackJumpHorizSpeed; speed.y = mpHIO->mWolf.mWlSideStep.m.mBackJumpVertSpeed; mProcVar1.field_0x300a = 0; } else { shape_angle.y = field_0x2fe4; daAlink_WANM jump_anm; if (field_0x2f98 == 2) { jump_anm = WANM_SIDE_JUMP_LEFT_START; current.angle.y = shape_angle.y + 0x4000; } else { jump_anm = WANM_SIDE_JUMP_RIGHT_START; current.angle.y = shape_angle.y - 0x4000; } setSingleAnimeWolfParam(jump_anm, &mpHIO->mWolf.mWlSideStep.m.mSideJumpAnm); mNormalSpeed = mpHIO->mWolf.mWlSideStep.m.mSideJumpHorizSpeed; speed.y = mpHIO->mWolf.mWlSideStep.m.mSideJumpVertSpeed; mProcVar1.field_0x300a = 1; } mProcVar5.field_0x3012 = 0; mProcVar3.field_0x300e = 0; voiceStart(Z2SE_WL_V_BREATH_JUMP); return 1; } int daAlink_c::procWolfSideStep() { if (mProcVar1.field_0x300a == 0) { cLib_addCalcAngleS( &shape_angle.y, mProcVar2.field_0x300c, mpHIO->mWolf.mWlAtnMove.m.mTurnAngleRate, mpHIO->mWolf.mWlAtnMove.m.mTurnAngleMax, mpHIO->mWolf.mWlAtnMove.m.mTurnAngleMin); current.angle.y = shape_angle.y + 0x8000; } else if (mTargetedActor != NULL) { cLib_addCalcAngleS(&shape_angle.y, fopAcM_searchActorAngleY(this, mTargetedActor), 5, 0x5E8, 0x13C); if (field_0x2f98 == 2) { current.angle.y = shape_angle.y + 0x4000; } else { current.angle.y = shape_angle.y - 0x4000; } } checkWolfAtnDoCharge(); if (mLinkAcch.ChkGroundHit() && mProcVar3.field_0x300e != 0) { return procWolfSideStepLandInit(mProcVar5.field_0x3012); } if (mDemo.getDemoMode() != daPy_demo_c::DEMO_UNK_16_e && current.pos.y < mLastJumpPos.y - mpHIO->mWolf.mWlSideStep.m.mFallHeight) { field_0x2f98 = 0; return procWolfFallInit(2, mpHIO->mWolf.mWlSideStep.m.mFallInterp); } mProcVar3.field_0x300e = 1; return 1; } int daAlink_c::procWolfSideStepLandInit(s16 param_0) { commonProcInit(PROC_WOLF_SIDESTEP_LAND); if (field_0x2f98 == 1) { setSingleAnimeWolfParam(WANM_BACK_JUMP_END, &mpHIO->mWolf.mWlSideStep.m.mBackLandAnm); field_0x3478 = mpHIO->mWolf.mWlSideStep.m.mBackLandAnm.mCancelFrame; field_0x2fcc = 10; } else { int _; field_0x2fcc = 0; setSingleAnimeWolfParam( field_0x2f98 == 2 ? WANM_SIDE_JUMP_LEFT_END : WANM_SIDE_JUMP_RIGHT_END, // Fakematch, should be &mpHIO->mWolf.mWlSideStep.m.mSideLandAnm #if DEBUG &mpHIO->mWolf.mWlSideStep.m.mSideLandAnm #else &daAlinkHIO_wlSideStep_c0::m.mSideLandAnm #endif ); field_0x3478 = mpHIO->mWolf.mWlSideStep.m.mSideLandAnm.mCancelFrame; } mProcVar5.field_0x3012 = param_0; field_0x2f9d = 4; setFootEffectProcType(2); onResetFlg1(daPy_RFLG1(RFLG1_UNK_8 | RFLG1_UNK_4)); mNormalSpeed = 0.0f; setStepLandVibration(); return 1; } int daAlink_c::procWolfSideStepLand() { daPy_frameCtrl_c* frameCtrl = mUnderFrameCtrl; if (field_0x2fcc != 0) { field_0x2fcc = 10; } setWolfAtnMoveDirection(); checkWolfAtnDoCharge(); if (checkAnmEnd(frameCtrl)) { if (mDemo.getDemoMode() == daPy_demo_c::DEMO_UNK_16_e) { dComIfGp_evmng_cutEnd(mAlinkStaffId); } else { checkNextActionWolf(0); } } else if (frameCtrl->getFrame() > field_0x3478) { checkNextActionWolf(1); } return 1; } int daAlink_c::procWolfBackJumpInit(int param_0) { commonProcInit(PROC_WOLF_BACKJUMP); if (param_0 == 1) { setSingleAnimeWolfParam(WANM_BACKFLIP_START, &mpHIO->mWolf.mWlAttack.mWlAtDown.m.mBackRollAnm); mNormalSpeed = mpHIO->mWolf.mWlAttack.mWlAtDown.m.mLandingSideRollMovementWidth; speed.y = mpHIO->mWolf.mWlAttack.mWlAtDown.m.mLandingFrontBackMovementWidth; voiceStart(Z2SE_WL_V_BREATH_JUMP); } else { if (param_0 == 2) { setSingleAnimeWolf(WANM_BACKFLIP_START, mpHIO->mWolf.mWlAttack.mWlAtCjump.m.mFlipKickPostAnmSpeed, mpHIO->mWolf.mWlAttack.mWlAtCjump.m.mFlipKickPostStartF, mpHIO->mWolf.mWlBackJump.m.mBackJumpAnm.mEndFrame, mpHIO->mWolf.mWlBackJump.m.mBackJumpAnm.mInterpolation); } else { setSingleAnimeWolfParam(WANM_BACKFLIP_START, &mpHIO->mWolf.mWlBackJump.m.mBackJumpAnm); voiceStart(Z2SE_WL_V_BREATH_JUMP); } mNormalSpeed = mpHIO->mWolf.mWlBackJump.m.mBackJumpHorizSpeed; speed.y = mpHIO->mWolf.mWlBackJump.m.mBackJumpVertSpeed; } if (mTargetedActor != NULL && param_0 == 0) { mProcVar2.field_0x300c = cLib_targetAngleY(¤t.pos, &mTargetedActor->eyePos); } else { mProcVar2.field_0x300c = shape_angle.y; } current.angle.y = shape_angle.y + 0x8000; field_0x3478 = mNormalSpeed; mProcVar5.field_0x3012 = 0; if (param_0 == 0) { mProcVar4.field_0x3010 = 1; } else { mProcVar4.field_0x3010 = 0; } return 1; } int daAlink_c::procWolfBackJump() { cLib_addCalcAngleS(&shape_angle.y, mProcVar2.field_0x300c, mpHIO->mWolf.mWlAtnMove.m.mTurnAngleRate, mpHIO->mWolf.mWlAtnMove.m.mTurnAngleMax, mpHIO->mWolf.mWlAtnMove.m.mTurnAngleMin); current.angle.y = shape_angle.y - -0x8000; if (mProcVar4.field_0x3010 != 0) { checkWolfAtnDoCharge(); } backJumpSpeedDec(); if (checkAnmEnd(mUnderFrameCtrl) && mLinkAcch.ChkGroundHit()) { procWolfBackJumpLandInit(mProcVar5.field_0x3012, mProcVar4.field_0x3010); } else if (mDemo.getDemoMode() != daPy_demo_c::DEMO_UNK_16_e && current.pos.y < mLastJumpPos.y - mpHIO->mWolf.mWlBackJump.m.mFallHeight) { field_0x2f98 = 0; procWolfFallInit(2, mpHIO->mWolf.mWlBackJump.m.mFallInterp); } return 1; } int daAlink_c::procWolfBackJumpLandInit(s16 param_0, s16 param_1) { commonProcInit(PROC_WOLF_BACKJUMP_LAND); setSingleAnimeWolfParam(WANM_BACKFLIP_END, &mpHIO->mWolf.mWlBackJump.m.mBackLandAnm); mNormalSpeed = 0.0f; field_0x2f9d = 4; setFootEffectProcType(2); field_0x2fcc = 10; mProcVar5.field_0x3012 = param_0; mProcVar4.field_0x3010 = param_1; setStepLandVibration(); return 1; } int daAlink_c::procWolfBackJumpLand() { daPy_frameCtrl_c* frameCtrl = mUnderFrameCtrl; if (field_0x2fcc != 0) { field_0x2fcc = 10; } setWolfAtnMoveDirection(); if (mProcVar4.field_0x3010 != 0) { checkWolfAtnDoCharge(); } if (checkAnmEnd(frameCtrl)) { if (mDemo.getDemoMode() == daPy_demo_c::DEMO_UNK_16_e) { dComIfGp_evmng_cutEnd(mAlinkStaffId); } else { checkNextActionWolf(0); } } else if (frameCtrl->getFrame() > mpHIO->mWolf.mWlBackJump.m.mBackLandAnm.mCancelFrame) { checkNextActionWolf(1); } return 1; } int daAlink_c::procWolfHowlInit(int param_0) { if (checkEventRun() && mProcID == PROC_WOLF_HOWL) { return 0; } commonProcInit(PROC_WOLF_HOWL); if (param_0 != 0) { setSingleAnimeWolfParam(WANM_HOWL_SIT, &mpHIO->mWolf.mWlHowl.m.mSittingHowlAnm); onModeFlg(0x800000); field_0x3478 = mpHIO->mWolf.mWlHowl.m.mSittingHowlAnm.mCancelFrame; mProcVar3.field_0x300e = 1; } else { setSingleAnimeWolfParam(WANM_HOWL, &mpHIO->mWolf.mWlHowl.m.mHowlAnm); field_0x3478 = mpHIO->mWolf.mWlHowl.m.mHowlAnm.mCancelFrame; mProcVar3.field_0x300e = 0; } mNormalSpeed = 0.0f; mProcVar2.field_0x300c = 0; return 1; } int daAlink_c::procWolfHowl() { daPy_frameCtrl_c* frameCtrl_p = mUnderFrameCtrl; if (checkAnmEnd(frameCtrl_p)) { if (doButton()) { procWolfHowlInit(mProcVar3.field_0x300e); } else { checkNextActionWolf(0); } } else if (frameCtrl_p->getFrame() > field_0x3478) { if (doButton()) { procWolfHowlInit(mProcVar3.field_0x300e); } else { checkNextActionWolf(1); } } else { if ((!doButton() || mProcVar2.field_0x300c != 0) && mDemo.getDemoMode() != daPy_demo_c::DEMO_UNK_21_e && mDemo.getDemoMode() != daPy_demo_c::DEMO_UNK_22_e) { if (!(frameCtrl_p->getFrame() < 38.0f)) { mProcVar2.field_0x300c = 1; } } else if (frameCtrl_p->getFrame() > 56.0f) { frameCtrl_p->setFrame((frameCtrl_p->getFrame() - 56.0f) + 38.0f); } if (frameCtrl_p->getFrame() >= 38.0f && frameCtrl_p->getFrame() <= 56.0f) { onResetFlg0(RFLG0_UNK_40000000); voiceStartLevel(Z2SE_WL_V_HOWL); dKy_Sound_set(current.pos, 100, fopAcM_GetID(this), 1); } } return 1; } int daAlink_c::procWolfAutoJumpInit(int param_0) { commonProcInit(PROC_WOLF_AUTO_JUMP); f32 anmSpeed; f32 minSpeed; f32 speedRate; s16 angle; if (checkWolfDashMode() && field_0x2fc7 != 3) { anmSpeed = mpHIO->mWolf.mWlAutoJump.m.mJumpAnm.mSpeed; mMaxSpeed = mpHIO->mWolf.mWlAutoJump.m.mJumpMaxSpeed; minSpeed = mpHIO->mWolf.mWlAutoJump.m.mJumpMinSpeed; speedRate = mpHIO->mWolf.mWlAutoJump.m.mJumpSpeedRate; angle = mpHIO->mWolf.mWlAutoJump.m.mJumpAngle; onNoResetFlg2(FLG2_WOLF_DASH_AUTO_JUMP); } else { anmSpeed = mpHIO->mWolf.mWlAutoJump.m.mWeakJumpAnmSpeed; mMaxSpeed = mpHIO->mWolf.mWlAutoJump.m.mWeakJumpMaxSpeed; minSpeed = mpHIO->mWolf.mWlAutoJump.m.mWeakJumpMinSpeed; speedRate = mpHIO->mWolf.mWlAutoJump.m.mWeakJumpSpeedRate; angle = mpHIO->mWolf.mWlAutoJump.m.mWeakJumpAngle; } setSingleAnimeWolf(WANM_JUMP_ATTACK_START, anmSpeed, mpHIO->mWolf.mWlAutoJump.m.mJumpAnm.mStartFrame, mpHIO->mWolf.mWlAutoJump.m.mJumpAnm.mEndFrame, mpHIO->mWolf.mWlAutoJump.m.mJumpAnm.mInterpolation); if (speedF > mMaxSpeed || param_0 || mpHIO->mWolf.mWlAutoJump.m.mAlwaysMaxSpeedJump == TRUE) { speedF = mMaxSpeed; } else if (speedF < minSpeed) { speedF = minSpeed; } mNormalSpeed = speedF * speedRate; speed.y = mNormalSpeed * cM_ssin(angle); mNormalSpeed *= cM_scos(angle); field_0x3588 = l_wolfBaseAnime; field_0x33b0 = l_wolfBaseAnime.y; current.angle.y = shape_angle.y; offNoResetFlg0(FLG0_UNK_40000); onResetFlg0(RFLG0_AUTO_JUMP_START); voiceStart(Z2SE_WL_V_BREATH_JUMP); mProcVar2.field_0x300c = 1; return 1; } int daAlink_c::procWolfAutoJump() { if (mMode != 0x27) { if (checkInputOnR() && getDirectionFromCurrentAngle() == DIR_BACKWARD) { cLib_chaseF(&mNormalSpeed, 0.0f, mStickValue * 0.2f); } else if (!checkInputOnR()) { cLib_chaseF(&mNormalSpeed, 0.0f, 0.1f); } } field_0x2f99 = 7; if (mLinkAcch.ChkGroundHit()) { return checkWolfLandAction(0); } if (checkFrontWallTypeAction()) { return 1; } if (checkWolfRopeJumpHang()) { return 1; } daPy_frameCtrl_c* frameCtrl_p = mUnderFrameCtrl; if (!checkUnderMove0BckNoArcWolf(WANM_FALL_LAND) && (mFallHeight - current.pos.y) * 0.01f > mpHIO->mWolf.mWlDamage.mFall.m.mAirAnmTransitionHeight) { field_0x2f99 = 12; setSingleAnimeWolfBaseSpeed(WANM_FALL_LAND, 0.0f, mpHIO->mWolf.mWlDamage.mFall.m.mAirAnmInterp); } else if (checkUnderMove0BckNoArcWolf(WANM_JUMP_ATTACK_START)) { if (speed.y < -gravity) { field_0x2f99 = 12; setSingleAnimeWolfParam(WANM_JUMP_ATTACK, &mpHIO->mWolf.mWlAutoJump.m.mClimbAnm); } else if (checkAnmEnd(frameCtrl_p)) { field_0x2f99 = 12; setSingleAnimeWolf(WANM_JUMP_ATTACK, 0.0f, mpHIO->mWolf.mWlAutoJump.m.mClimbAnm.mStartFrame, mpHIO->mWolf.mWlAutoJump.m.mClimbAnm.mEndFrame, mpHIO->mWolf.mWlAutoJump.m.mClimbAnm.mInterpolation); mProcVar2.field_0x300c = 0; } } else if (mProcVar2.field_0x300c == 0 && checkUnderMove0BckNoArcWolf(WANM_JUMP_ATTACK) && speed.y < -gravity) { mProcVar2.field_0x300c = 1; frameCtrl_p->setRate(mpHIO->mWolf.mWlAutoJump.m.mClimbAnm.mSpeed); } return 1; } int daAlink_c::procWolfFallInit(int param_0, f32 i_morf) { if (!commonProcInitNotSameProc(PROC_WOLF_FALL)) { return 0; } mProcVar5.field_0x3012 = 0; if (param_0 == 1) { mNormalSpeed = 0.0f; speed.y = 0.0f; current.angle.y = shape_angle.y; } else if (param_0 == 4) { current.angle.y = field_0x2ffe; dComIfGp_getVibration().StartShock(6, 31, cXyz(0.0f, 1.0f, 0.0f)); setDamagePointNormal(field_0x318c); onNoResetFlg1(FLG1_THROW_DAMAGE); if (mDamageTimer != 0) { onModeFlg(8); } mNormalSpeed = field_0x3408; speed.y = field_0x340c; mProcVar5.field_0x3012 = 1; } setSingleAnimeWolfBaseSpeed(WANM_JUMP_ATTACK, 0.0f, i_morf); daPy_frameCtrl_c* frameCtrl_p = mUnderFrameCtrl; frameCtrl_p->setFrame(frameCtrl_p->getEnd() - 0.001f); getNowAnmPackUnder(UNDER_0)->setFrame(frameCtrl_p->getFrame()); field_0x3588 = l_wolfBaseAnime; field_0x2f99 = 12; resetBasAnime(); offNoResetFlg0(FLG0_UNK_40000); if (param_0 != 4 && current.angle.y == shape_angle.y) { if (mNormalSpeed > 1.0f) { mProcVar0.field_0x3008 = 2; } else { mProcVar0.field_0x3008 = 1; } } else { mProcVar0.field_0x3008 = 0; } mProcVar1.field_0x300a = 7; return 1; } int daAlink_c::procWolfFall() { if (mProcVar5.field_0x3012 == 0) { cLib_chaseF(&mNormalSpeed, 0.0f, 0.1f); } else if (mProcVar5.field_0x3012 > 0) { mProcVar5.field_0x3012 = -1; return 1; } field_0x2f99 = 4; if (mLinkAcch.ChkGroundHit()) { return checkWolfLandAction(0); } if (mProcVar0.field_0x3008 == 1) { if (mProcVar1.field_0x300a > 0) { mProcVar1.field_0x300a--; } else if (checkInputOnR() && getDirectionFromShapeAngle() == DIR_FORWARD && checkFrontWallTypeAction()) { return 1; } } else if (mProcVar0.field_0x3008 == 2 && checkFrontWallTypeAction()) { return 1; } if (checkWolfRopeJumpHang()) { return 1; } if (!checkUnderMove0BckNoArcWolf(WANM_FALL_LAND) && (mFallHeight - current.pos.y) * 0.01f > mpHIO->mWolf.mWlDamage.mFall.m.mAirAnmTransitionHeight) { field_0x2f99 = 12; setSingleAnimeWolfBaseSpeed(WANM_FALL_LAND, 0.0f, mpHIO->mWolf.mWlDamage.mFall.m.mAirAnmInterp); } return 1; } int daAlink_c::procWolfLandInit() { commonProcInit(PROC_WOLF_LAND); mNormalSpeed = 0.0f; field_0x2f99 = 12; setSingleAnimeWolfParam(WANM_JUMP_ATTACK_END, &mpHIO->mWolf.mWlAutoJump.m.mLandingAnm); field_0x3478 = mpHIO->mWolf.mWlAutoJump.m.mLandingAnm.mCancelFrame; mProcVar2.field_0x300c = 1; field_0x2f9d = 4; setFootEffectProcType(4); dComIfGp_getVibration().StartShock(1, 15, cXyz(0.0f, 1.0f, 0.0f)); return 1; } int daAlink_c::procWolfLand() { daPy_frameCtrl_c* frameCtrl = mUnderFrameCtrl; if (mProcVar2.field_0x300c != 0) { field_0x2f99 = 4; } if (checkAnmEnd(frameCtrl)) { checkNextActionWolf(0); } else if (frameCtrl->getFrame() > field_0x3478) { checkNextActionWolf(1); } return 1; } int daAlink_c::procWolfSitInit(int param_0) { if (!commonProcInitNotSameProc(PROC_WOLF_SIT)) { return 0; } if (param_0 != 0 && !checkUnderMove0BckNoArcWolf(WANM_WAIT_SIT) && !checkUnderMove0BckNoArcWolf(WANM_HOWL_SIT)) { setSingleAnimeWolfParam(WANM_SIT, &mpHIO->mWolf.mWlLie.m.mSittingAnm); field_0x3198 = 0; } else { field_0x3198 = 1; if (!checkUnderMove0BckNoArcWolf(WANM_WAIT_SIT)) { setSingleAnimeWolfBaseSpeed(WANM_WAIT_SIT, mpHIO->mWolf.mWlLie.m.mSittingIdleAnmSpeed, mpHIO->mWolf.mWlLie.m.mSittingIdleInterp); } } current.angle.y = shape_angle.y; return 1; } int daAlink_c::procWolfSit() { daPy_frameCtrl_c* frameCtrl = mUnderFrameCtrl; cLib_chaseF(&mNormalSpeed, 0.0f, checkWolfDashMode() ? mpHIO->mWolf.mWlMove.m.mDeceleration : mpHIO->mWolf.mWlMoveNoP.m.mDeceleration); if (!spActionButton() && mDemo.getDemoMode() != daPy_demo_c::DEMO_UNK_15_e) { checkNextActionWolfFromLie(); } else if (checkAnmEnd(frameCtrl)) { setSingleAnimeWolfBaseSpeed(WANM_WAIT_SIT, mpHIO->mWolf.mWlLie.m.mSittingIdleAnmSpeed, mpHIO->mWolf.mWlLie.m.mSittingIdleInterp); field_0x3198 = 1; } return 1; } int daAlink_c::procWolfStepMoveInit() { commonProcInit(PROC_WOLF_STEP_MOVE); setSingleAnimeWolfParam(WANM_BUMP_START, &mpHIO->mWolf.mWlWallHang.m.mLedgeClimbAnm); field_0x3478 = 0.5f * mNormalSpeed; mNormalSpeed = 0.0f; mProcVar2.field_0x300c = 0; field_0x3588 = l_wolfBaseAnime; current.pos.x -= cM_ssin(shape_angle.y) * 10.0f; current.pos.z -= cM_scos(shape_angle.y) * 10.0f; m_oldFrameCalc->getOldFrameTransInfo(0)->mTranslate.z += 10.0f; return 1; } int daAlink_c::procWolfStepMove() { daPy_frameCtrl_c* frameCtrl_p = mUnderFrameCtrl; if (mProcVar2.field_0x300c != 0) { field_0x2f99 = 4; if (checkAnmEnd(frameCtrl_p)) { return checkNextActionWolf(0); } if (frameCtrl_p->getFrame() > mpHIO->mWolf.mWlWallHang.m.mLedgeLandAnm.mCancelFrame) { mNormalSpeed = field_0x3478; if (checkNextActionWolf(1)) { return 1; } mNormalSpeed = 0.0f; } } else if (checkAnmEnd(frameCtrl_p)) { setSingleAnimeWolfParam(WANM_BUMP_END, &mpHIO->mWolf.mWlWallHang.m.mLedgeLandAnm); current.pos.set(field_0x34ec.x + cM_ssin(shape_angle.y) * 2.0f, field_0x34ec.y, field_0x34ec.z + cM_scos(shape_angle.y) * 2.0f); field_0x2f99 = 0x50; mProcVar2.field_0x300c = 1; } return 1; } int daAlink_c::procWolfSlipInit() { commonProcInit(PROC_WOLF_SLIP); setSingleAnimeWolfParam(WANM_SLIP, &mpHIO->mWolf.mWlMove.m.mSlipAnm); if (checkWolfDashMode()) { mNormalSpeed = speedF * mpHIO->mWolf.mWlMove.m.mSlipInitSpeedRate; } else { mNormalSpeed = speedF * mpHIO->mWolf.mWlMoveNoP.m.mSlideInitSpeed; } current.angle.y = shape_angle.y; field_0x3588 = l_wolfBaseAnime; setFootEffectProcType(1); return 1; } int daAlink_c::procWolfSlip() { daPy_frameCtrl_c* frameCtrl_p = mUnderFrameCtrl; field_0x2f99 = 5; f32 deceleration; if (checkWolfDashMode()) { deceleration = mpHIO->mWolf.mWlMove.m.mSlipDeceleration; } else { deceleration = mpHIO->mWolf.mWlMoveNoP.m.mSlideDeceleration; } cLib_chaseF(&mNormalSpeed, 0.0f, deceleration); if (checkAnmEnd(frameCtrl_p)) { mNormalSpeed = 0.0f; if (checkInputOnR()) { procWolfSlipTurnInit(1); } else { current.pos.x += cM_scos(shape_angle.y) * 30.0f; current.pos.z -= cM_ssin(shape_angle.y) * 30.0f; m_oldFrameCalc->getOldFrameTransInfo(0)->mTranslate.x -= 30.0f; checkNextActionWolf(0); } } else { if (mNormalSpeed > 2.5f && frameCtrl_p->getFrame() >= 5.0f) { field_0x2f9d = 0x78; } seStartMapInfoLevel(Z2SE_FN_WOLF_SLIP); } return 1; } int daAlink_c::procWolfSlipTurnInit(int param_0) { if (!commonProcInitNotSameProc(PROC_WOLF_SLIP_TURN)) { return 0; } f32 start_frame; if (param_0) { start_frame = mpHIO->mWolf.mWlMove.m.mReverseAnm.mStartFrame; current.angle.y = shape_angle.y + 0x8000; if (checkWolfDashMode()) { field_0x347c = mpHIO->mWolf.mWlMove.m.mReverseSpeed; } else { field_0x347c = mpHIO->mWolf.mWlMoveNoP.m.mReverseSpeed; } } else { start_frame = mpHIO->mWolf.mWlMove.m.mIdleReverseStartFrame; current.angle.y = mMoveAngle; setOldRootQuaternion(0, (shape_angle.y - current.angle.y) - 0x8000, 0); shape_angle.y = current.angle.y + 0x8000; field_0x347c = 10.0f; } setSingleAnimeWolf(WANM_TURN, mpHIO->mWolf.mWlMove.m.mReverseAnm.mSpeed, start_frame, 12, mpHIO->mWolf.mWlMove.m.mReverseAnm.mInterpolation); voiceStart(Z2SE_WL_V_BREATH_JUMP); mNormalSpeed = 0.0f; field_0x2f99 = 5; field_0x3588 = l_wolfBaseAnime; field_0x3478 = 1.0f / (12.0f - start_frame); return 1; } int daAlink_c::procWolfSlipTurn() { daPy_frameCtrl_c* frameCtrl_p = mUnderFrameCtrl; field_0x2f99 = 5; f32 var_f31 = (0.5f - field_0x3478 * (frameCtrl_p->getFrame() - frameCtrl_p->getStart())) * 2.0f; field_0x3588.x = l_wolfBaseAnime.x * var_f31; field_0x3588.z = l_wolfBaseAnime.z * var_f31; if (checkAnmEnd(frameCtrl_p) && mLinkAcch.ChkGroundHit()) { return procWolfSlipTurnLandInit(); } if (!checkModeFlg(2) && frameCtrl_p->getFrame() > 4.5f) { mNormalSpeed = field_0x347c; setJumpMode(); } else if (checkModeFlg(2) && current.pos.y < mLastJumpPos.y - mpHIO->mWolf.mWlMove.m.mReverseFallHeight) { setOldRootQuaternion(0, -0x8000, 0); shape_angle.y = current.angle.y; mPrevAngleY = shape_angle.y; procWolfFallInit(2, mpHIO->mWolf.mWlMove.m.mReverseFallInterpolation); } return 1; } int daAlink_c::procWolfSlipTurnLandInit() { commonProcInit(PROC_WOLF_SLIP_TURN_LAND); daPy_frameCtrl_c* frameCtrl = mUnderFrameCtrl; setFrameCtrl(frameCtrl, 0, 0, mpHIO->mWolf.mWlMove.m.mReverseAnm.mEndFrame, mpHIO->mWolf.mWlMove.m.mReverseAnm.mSpeed, frameCtrl->getFrame() + mpHIO->mWolf.mWlMove.m.mReverseAnm.mSpeed); mNormalSpeed = 0.25f * mpHIO->mWolf.mWlMoveNoP.m.mMaxSpeed; field_0x2f99 = 5; setFootEffectProcType(2); field_0x2f9d = 8; field_0x2f98 = 0; return 1; } int daAlink_c::procWolfSlipTurnLand() { daPy_frameCtrl_c* frameCtrl = mUnderFrameCtrl; field_0x2f99 = 5; if (checkAnmEnd(frameCtrl)) { checkNextActionWolf(0); } else if (frameCtrl->getFrame() > mpHIO->mWolf.mWlMove.m.mReverseAnm.mCancelFrame) { checkNextActionWolf(1); } return 1; } int daAlink_c::procWolfSlideReadyInit(s16 i_angle, int param_1) { commonProcInit(PROC_WOLF_SLIDE_READY); field_0x3090 = 8; current.angle.y = i_angle; setSingleAnimeWolfParam(WANM_SLIDE_FORWARD_START, &mpHIO->mWolf.mWlSlide.m.mFrontSlideAnm); voiceStart(Z2SE_WL_V_SLIP_ROLL); mNormalSpeed = 0.0f; mMaxSpeed = mpHIO->mWolf.mWlSlide.m.mMaxSpeed; field_0x3588 = l_wolfBaseAnime; field_0x3478 = 1.0f / mUnderFrameCtrl[0].getEnd(); mProcVar2.field_0x300c = 0; mProcVar3.field_0x300e = param_1; mCcStts.SetWeight(255); return 1; } int daAlink_c::procWolfSlideReady() { daPy_frameCtrl_c* frameCtrl_p = mUnderFrameCtrl; field_0x2f99 = 5; f32 var_f31 = (0.5f - field_0x3478 * frameCtrl_p->getFrame()) * 2.0f; field_0x3588.x = l_wolfBaseAnime.x * var_f31; field_0x3588.z = l_wolfBaseAnime.z * var_f31; cM3dGPla slide_poly; if (getSlidePolygon(&slide_poly)) { s16 var_r28 = slide_poly.mNormal.atan2sX_Z(); cLib_addCalcAngleS(¤t.angle.y, var_r28, 4, 0x1000, 0x400); cLib_addCalcAngleS(&shape_angle.y, current.angle.y, 4, 0x1000, 0x400); } if (frameCtrl_p->checkPass(5.0f)) { mProcVar2.field_0x300c = 1; } if (checkAnmEnd(frameCtrl_p)) { if (mProcVar3.field_0x300e != 0) { procWolfSlideInit(current.angle.y, 1); } else { procWolfSlopeStartInit(1); } } else if (frameCtrl_p->checkPass(18.0f)) { offModeFlg(0x8000); } return 1; } int daAlink_c::procWolfSlideInit(s16 i_angle, int param_1) { if (cLib_distanceAngleS(i_angle, shape_angle.y) < 0x3800 && !param_1) { return procWolfSlideReadyInit(i_angle, 1); } BOOL is_prev_slideReady = mProcID == PROC_WOLF_SLIDE_READY; commonProcInit(PROC_WOLF_SLIDE); mCcStts.SetWeight(255); field_0x3090 = 8; current.angle.y = i_angle; setSingleAnimeWolfParam(WANM_SLIDE_BACKWARD, &mpHIO->mWolf.mWlSlide.m.mBackSlideAnm); if (param_1) { mUnderFrameCtrl[0].setFrame(mpHIO->mWolf.mWlSlide.m.mBackSlideAnm.mEndFrame); getNowAnmPackUnder(UNDER_0)->setFrame(mpHIO->mWolf.mWlSlide.m.mBackSlideAnm.mEndFrame); } dComIfGp_setPlayerStatus1(0, 0x200); field_0x2f9d = 0x78; setFootEffectProcType(1); mMaxSpeed = mpHIO->mWolf.mWlSlide.m.mMaxSpeed; return 1; } int daAlink_c::procWolfSlide() { cM3dGPla slide_poly; if (getSlidePolygon(&slide_poly)) { s16 var_r30 = slide_poly.mNormal.atan2sX_Z(); cLib_addCalcAngleS(¤t.angle.y, var_r30, 4, 0x1000, 0x400); cLib_addCalcAngleS(&shape_angle.y, current.angle.y + 0x8000, 4, 0x1000, 0x400); mNormalSpeed += mpHIO->mWolf.mWlSlide.m.mAcceleration * ((1.0f - slide_poly.mNormal.y) * 0.5f + 1.0f) * cM_scos(current.angle.y - var_r30); if (mNormalSpeed > mMaxSpeed) { mNormalSpeed = mMaxSpeed; } field_0x2f9d = 0x78; seStartMapInfoLevel(Z2SE_FN_WOLF_SLIP); } else { procWolfSlideLandInit(); } return 1; } int daAlink_c::procWolfSlideLandInit() { commonProcInit(PROC_WOLF_SLIDE_LAND); setSingleAnimeWolfParam(WANM_SLIDE_BACKWARD_END, &mpHIO->mWolf.mWlSlide.m.mLandingAnm); mNormalSpeed *= 0.5f; mCcStts.SetWeight(255); return 1; } int daAlink_c::procWolfSlideLand() { daPy_frameCtrl_c* frameCtrl = mUnderFrameCtrl; cLib_chaseF(&mNormalSpeed, 0.0f, 4.0f); if (checkAnmEnd(frameCtrl)) { current.angle.y = shape_angle.y; checkNextActionWolf(0); } else if (frameCtrl->getFrame() > mpHIO->mWolf.mWlSlide.m.mLandingAnm.mCancelFrame) { s16 old_angle = current.angle.y; current.angle.y = shape_angle.y; if (!checkNextActionWolf(1)) { current.angle.y = old_angle; } } return 1; } int daAlink_c::procWolfWaitSlipInit() { if (!commonProcInitNotSameProc(PROC_WOLF_WAIT_SLIP)) { return 0; } setSingleAnimeWolfBaseSpeed(WANM_ATN, mpHIO->mWolf.mWlMove.m.mGazeIdleAnmSpeed, mpHIO->mWolf.mWlMove.m.mIdleInterpolation); mNormalSpeed = 0.0f; setWolfWaitSlip(); field_0x2f9d = 120; setFootEffectProcType(1); return 1; } int daAlink_c::procWolfWaitSlip() { f32 var_f31 = mNormalSpeed; mNormalSpeed = 0.0f; current.angle.y = shape_angle.y; if (checkInputOnR() && checkWolfWaitSlipPolygon()) { cM3dGPla tri; dComIfG_Bgsp().GetTriPla(mLinkAcch.m_gnd, &tri); s16 var_r30 = tri.mNormal.atan2sX_Z(); if (getGroundAngle(&mLinkAcch.m_gnd, mMoveAngle) < -field_0x3122) { int var_r3 = abs((s16)(var_r30 - shape_angle.y)); if (var_r3 >= 0x6000) { return procWolfSlopeStartInit(0); } else if (var_r3 <= 0x2000) { return procWolfSlideReadyInit(current.angle.y, 0); } } } if (!checkNextActionWolf(0)) { f32 temp_f1 = setWolfWaitSlip(); mNormalSpeed = var_f31 + (mpHIO->mWolf.mWlSlide.m.mSlipDownAcceleration * (temp_f1 + 1.0f)); if (mNormalSpeed > mpHIO->mWolf.mWlSlide.m.mSlipDownMaxSpeed) { mNormalSpeed = mpHIO->mWolf.mWlSlide.m.mSlipDownMaxSpeed; } field_0x2f9d = 0x78; s16 var_r4; if (mProcVar2.field_0x300c != 0) { var_r4 = current.angle.y + 0x8000; } else { var_r4 = current.angle.y; } cLib_addCalcAngleS(&shape_angle.y, var_r4, 4, mpHIO->mWolf.mWlSlide.m.mSlipDownRotationMax, mpHIO->mWolf.mWlSlide.m.mSlipDownRotationMin); seStartMapInfoLevel(Z2SE_FN_WOLF_SLIP); } return 1; } int daAlink_c::procWolfSlopeStartInit(int param_0) { commonProcInit(PROC_WOLF_SLOPE_START); setSingleAnimeWolfParam(WANM_SLIDE_W, &mpHIO->mWolf.mWlSlide.m.mSlipDownRecoveryAnm); field_0x3588 = l_wolfBaseAnime; mNormalSpeed = 0.0f; current.angle.y = shape_angle.y; if (param_0) { field_0x2f99 = 13; } return 1; } int daAlink_c::procWolfSlopeStart() { daPy_frameCtrl_c* frameCtrl = mUnderFrameCtrl; if (checkAnmEnd(frameCtrl)) { checkNextActionWolf(0); } else if (frameCtrl->getFrame() > mpHIO->mWolf.mWlSlide.m.mSlipDownRecoveryAnm.mCancelFrame) { if (!checkNextActionWolf(1)) { field_0x2f99 = 5; } } else { field_0x2f99 = 5; } return 1; } static fopAc_ac_c* daAlink_searchGoldWolf(fopAc_ac_c* i_actor, void* i_data) { UNUSED(i_data); if (fopAcM_GetName(i_actor) == fpcNm_NPC_GWOLF_e) { return i_actor; } return NULL; } static void* daAlink_searchWolfHowl(fopAc_ac_c* i_actor, void* i_data) { s16 actor_name = fopAcM_GetName(i_actor); fopAc_ac_c** var_r30 = (fopAc_ac_c**)i_data; daAlink_c* player_p = daAlink_getAlinkActorClass(); if ((actor_name == fpcNm_KAGO_e && dComIfGs_isEventBit(dSv_event_flag_c::M_051)) || (actor_name == fpcNm_E_PM_e && player_p->current.pos.abs2XZ(i_actor->current.pos) < SQUARE(3000.0f)) || actor_name == fpcNm_OBJ_SEKIZOA_e || (*var_r30 == NULL && actor_name == player_p->getGrassHowlEventActor())) { *var_r30 = i_actor; } return NULL; } void daAlink_c::setWolfHowlNotHappen(int param_0) { mMsgClassID = fpcM_ERROR_PROCESS_ID_e; if (field_0x3198 == 0xEE) { field_0x32cc = 0x532; } else { field_0x32cc = 0x535; } mProcVar2.field_0x300c = 0; if (!checkUnderMove0BckNoArcWolf(WANM_HOWL_END)) { if (param_0 != 0) { setSingleAnimeWolfBaseSpeed(WANM_WAIT_SIT, mpHIO->mWolf.mWlLie.m.mSittingIdleAnmSpeed, mpHIO->mWolf.mWlLie.m.mSittingIdleInterp); } else { setSingleAnimeWolfBase(WANM_SERVICE_WAIT_D); } } } int daAlink_c::procWolfHowlDemoInit() { if (!dComIfGp_event_compulsory(this, NULL, 0xFFFF)) { return 0; } mDemo.setSpecialDemoType(); s16 name; if (mPriActorOwn != NULL) { name = fopAcM_GetName(mPriActorOwn); } else { name = fpcNm_ALINK_e; } if (name == fpcNm_Tag_WaraHowl_e) { shape_angle.y = mPriActorOwn->shape_angle.y; current.angle.y = shape_angle.y; } else { f32 var_f31 = cM_ssin(shape_angle.y) * 200.0f; f32 var_f30 = cM_scos(shape_angle.y) * 200.0f; cXyz sp14; cXyz sp8; sp14.set(attention_info.position.x, attention_info.position.y - 50.0f, attention_info.position.z); sp8.set(sp14.x + var_f31, sp14.y, sp14.z + var_f30); if (commonLineCheck(&sp14, &sp8)) { sp8.x = sp14.x - var_f31; sp8.z = sp14.z - var_f30; if (!commonLineCheck(&sp14, &sp8)) { ANGLE_ADD_2(shape_angle.y, 0x8000); } else { sp8.x = sp14.x + var_f30; sp8.z = sp14.z - var_f31; if (!commonLineCheck(&sp14, &sp8)) { ANGLE_ADD_2(shape_angle.y, 0x4000); } else { sp8.x = sp14.x - var_f30; sp8.z = sp14.z + var_f31; if (!commonLineCheck(&sp14, &sp8)) { ANGLE_SUB_2(shape_angle.y, 0x4000); } } } current.angle.y = shape_angle.y; } } commonProcInit(PROC_WOLF_HOWL_DEMO); field_0x3198 = -1; mProcVar5.field_0x3012 = -1; mProcVar4.field_0x3010 = 0; mProcVar0.field_0x3008 = -1; if (name != fpcNm_ALINK_e) { if (name == fpcNm_Obj_Yobikusa_e) { daObjYobikusa_c* yobikusa_p = (daObjYobikusa_c*)mPriActorOwn; mZ2WolfHowlMgr.setCorrectCurve(yobikusa_p->getType()); mProcVar5.field_0x3012 = yobikusa_p->getPathID(); shape_angle.y = yobikusa_p->shape_angle.y; current.angle.y = shape_angle.y; if (yobikusa_p->getType() == 0) { field_0x3198 = 0x100; } else if (yobikusa_p->getType() == 1) { field_0x3198 = 0xEE; } } else if (name == fpcNm_TAG_HOWL_e) { mZ2WolfHowlMgr.setCorrectCurve(static_cast(mPriActorOwn)->getCurveID()); } else if (name == fpcNm_Obj_WindStone_e) { mZ2WolfHowlMgr.setCorrectCurve(static_cast(mPriActorOwn)->getTuneId()); mProcVar0.field_0x3008 = static_cast(mPriActorOwn)->getNextSceneId(); mProcVar4.field_0x3010 = 1; } else if (name == fpcNm_Obj_SmWStone_e) { mZ2WolfHowlMgr.setCorrectCurve(static_cast(mPriActorOwn)->getTuneId()); mProcVar4.field_0x3010 = 1; } else if (name == fpcNm_Tag_WaraHowl_e) { mZ2WolfHowlMgr.setCorrectCurve(static_cast(mPriActorOwn)->getTuneId()); } else { mZ2WolfHowlMgr.setCorrectCurve(-1); } } else { mZ2WolfHowlMgr.setCorrectCurve(-1); } mNormalSpeed = 0.0f; if (!checkUnderMove0BckNoArcWolf(WANM_WAIT_SIT) && !checkUnderMove0BckNoArcWolf(WANM_LISTEN) && !checkUnderMove0BckNoArcWolf(WANM_HOWL_SIT)) { setSingleAnimeWolfParam(WANM_SIT, &mpHIO->mWolf.mWlLie.m.mSittingAnm); field_0x347c = -1.0f; } else { field_0x347c = 10.0f; if (mProcVar4.field_0x3010 == 0) { setSingleAnimeWolfBaseSpeed(WANM_WAIT_SIT, mpHIO->mWolf.mWlLie.m.mSittingIdleAnmSpeed, mpHIO->mWolf.mWlLie.m.mSittingIdleInterp); } else { setSingleAnimeWolfBase(WANM_LISTEN); setFaceBasicTexture(FTANM_WL_C_A); } } dCam_getBody()->StartEventCamera(12, fopAcM_GetID(this), 0); mProcVar1.field_0x300a = 0; mMsgClassID = fpcM_ERROR_PROCESS_ID_e; field_0x32cc = 0x5DD; mProcVar2.field_0x300c = 0; mProcVar3.field_0x300e = -1; mDoAud_taktModeMute(); if (checkStageName("F_SP200")) { field_0x280c.setData((fopAc_ac_c*)fopAcIt_Judge((fopAcIt_JudgeFunc)daAlink_searchGoldWolf, NULL)); } else { field_0x280c.clearData(); } dComIfGp_setPlayerStatus1(0, 0x4000000); return 1; } int daAlink_c::procWolfHowlDemo() { daPy_frameCtrl_c* frameCtrl_p = mUnderFrameCtrl; daNpc_GWolf_c* gwolf_p = (daNpc_GWolf_c*)field_0x280c.getActor(); BOOL isSkipEdge = dComIfGp_getEvent()->checkSkipEdge(); if (isSkipEdge) { mZ2WolfHowlMgr.skipCorrectDemo(); } if (checkEndMessage(field_0x32cc) || (isSkipEdge && (field_0x32cc == 0x535 || field_0x32cc == 0x532))) { if (mProcVar2.field_0x300c == 0) { resetSpecialEvent(); field_0x30b2 = 0; field_0x30b0 = 0; mDoAud_taktModeMuteOff(); return 1; } } else if (field_0x32cc == 0x535 || field_0x32cc == 0x532) { if (checkUnderMove0BckNoArcWolf(WANM_HOWL_END) && checkAnmEnd(frameCtrl_p)) { setSingleAnimeWolfBase(WANM_SERVICE_WAIT_D); } return 1; } if (field_0x347c < 0.0f) { if (checkAnmEnd(frameCtrl_p)) { if (mProcVar4.field_0x3010 != 0) { setSingleAnimeWolfBase(WANM_LISTEN); setFaceBasicTexture(FTANM_WL_C_A); } else { setSingleAnimeWolfBaseSpeed(WANM_WAIT_SIT, mpHIO->mWolf.mWlLie.m.mSittingIdleAnmSpeed, mpHIO->mWolf.mWlLie.m.mSittingIdleInterp); } field_0x347c = 1.0f; } } else if (field_0x347c > 1.5f) { field_0x347c -= 1.0f; } else { bool isHowl = mDoCPd_c::getHoldA(PAD_1) != false; if (mProcVar4.field_0x3010 != 0 && mProcVar2.field_0x300c != 0) { isHowl = false; } if (checkUnderMove0BckNoArcWolf(WANM_HOWL_SUCCESS)) { if (gwolf_p == NULL) { dComIfGp_getEvent()->startCheckSkipEdge(this); } } else if (checkUnderMove0BckNoArcWolf(WANM_HOWL_END)) { if (gwolf_p == NULL) { dComIfGp_getEvent()->startCheckSkipEdge(this); } } else if ((isHowl || mZ2WolfHowlMgr.getTimer() != 0) && mZ2WolfHowlMgr.getReleaseTimer() != 30) { if (!checkUnderMove0BckNoArcWolf(WANM_HOWL_SIT) || mProcVar1.field_0x300a == 0) { mProcVar1.field_0x300a = 1; setSingleAnimeWolfParam(WANM_HOWL_SIT, &mpHIO->mWolf.mWlHowl.m.mSittingHowlAnm); } else { if (frameCtrl_p->getFrame() > 56.0f) { frameCtrl_p->setFrame((frameCtrl_p->getFrame() - 56.0f) + 38.0f); } if (frameCtrl_p->getFrame() >= 38.0f && frameCtrl_p->getFrame() <= 56.0f) { onResetFlg0(RFLG0_UNK_40000000); } } } else { if (mZ2WolfHowlMgr.getReleaseTimer() == 30) { frameCtrl_p->setFrame(56.0f); m_oldFrameCalc->initOldFrameMorf(3.0f, 0, 40); } mProcVar1.field_0x300a = 0; if (dMsgObject_isHowlHearingMode() && (checkAnmEnd(frameCtrl_p) || checkUnderMove0BckNoArcWolf(WANM_WAIT_SIT))) { setSingleAnimeWolfBase(WANM_LISTEN); setFaceBasicTexture(FTANM_WL_C_A); } else if (checkAnmEnd(frameCtrl_p)) { setSingleAnimeWolfBaseSpeed(WANM_WAIT_SIT, mpHIO->mWolf.mWlLie.m.mSittingIdleAnmSpeed, mpHIO->mWolf.mWlLie.m.mSittingIdleInterp); } } s16 var_r25 = mProcVar3.field_0x300e; f32 stick_y = mDoCPd_c::getStickY(PAD_1); mProcVar3.field_0x300e = mZ2WolfHowlMgr.startWolfHowlSound(0.0f, stick_y, isHowl, 0.0f); s16 var_r26_2 = 0; if (mProcVar3.field_0x300e == -1 || isSkipEdge) { if (checkUnderMove0BckNoArcWolf(WANM_HOWL_END) || isSkipEdge) { if (checkAnmEnd(frameCtrl_p) || isSkipEdge) { if (mProcVar0.mHowlExitID >= 0) { dStage_changeScene(mProcVar0.mHowlExitID, 0.0f, 0, fopAcM_GetRoomNo(this), shape_angle.y, -1); } else { fopAc_ac_c* actor_p = NULL; if (gwolf_p == NULL) { fopAcIt_Executor((fopAcIt_ExecutorFunc)daAlink_searchWolfHowl, &actor_p); } else { actor_p = gwolf_p; } field_0x30b2 = 0; field_0x30b0 = 0; if (actor_p != NULL) { fopAcM_OnStatus(actor_p, 0x800); s16 actorName = fopAcM_GetName(actor_p); if (actorName == fpcNm_KAGO_e) { static_cast(actor_p)->setEvent(); static_cast(actor_p)->setKagoPath(mProcVar5.field_0x3012); } else if (actorName == fpcNm_OBJ_SEKIZOA_e) { static_cast(actor_p)->setWolfHowling(); } else if (actorName == fpcNm_E_PM_e) { static_cast(actor_p)->AppearSet(); } else if (actorName == fpcNm_HORSE_e) { daHorse_c* horse = static_cast(actor_p); int ret = horse->callHorse(¤t.pos); if (ret == 1 || ret == 2) { mDoAud_taktModeMuteOff(); return procCoHorseCallWaitInit(ret); } if (ret != 3) { setWolfHowlNotHappen(isSkipEdge); return 1; } } else if (actorName == fpcNm_NPC_TK_e) { static_cast(actor_p)->setEventWolf(); static_cast(actor_p)->setHawkPath(mProcVar5.field_0x3012); } } else if (mProcVar4.field_0x3010 == 0) { setWolfHowlNotHappen(isSkipEdge); return 1; } if (gwolf_p == NULL) { resetSpecialEvent(); } else { endDemoMode(); } mDoAud_taktModeMuteOff(); } procWolfServiceWaitInit(2); return 1; } } else if (var_r25 != -1) { setSingleAnimeWolfBase(WANM_HOWL_END); if (gwolf_p != NULL) { gwolf_p->setHowlingEndFlag(); } } else { var_r26_2 = (s16)(stick_y * -6144.0f); } } else if (mProcVar2.field_0x300c == 0) { mProcVar2.field_0x300c = 1; dMsgObject_onMsgSend(); setSingleAnimeWolfBase(WANM_HOWL_SUCCESS); mUnderFrameCtrl[0].setLoop(27); mUnderFrameCtrl[0].setAttribute(2); setFaceBasicTexture(FTANM_WL_HOWLC); if (gwolf_p != NULL) { fopAcM_OnStatus(gwolf_p, 0x800); gwolf_p->setHowlingFlag(); dComIfGp_event_reset(); dCam_getBody()->EndEventCamera(fopAcM_GetID(this)); } else { dComIfGp_getEvent()->startCheckSkipEdge(this); } } cLib_addCalcAngleS(&field_0x30b2, var_r26_2, 5, 0x800, 0x100); } return 1; } BOOL daAlink_c::checkWolfRope() { return checkModeFlg(0x20000) && field_0x280c.getActor() != NULL && fopAcM_GetName(field_0x280c.getActor()) == fpcNm_Obj_Crope_e; } fopAc_ac_c* daAlink_c::checkWolfRopeHit(dCcD_GObjInf* i_collider, cXyz const* param_1, int param_2) const { daObjCrope_c* rope_p = (daObjCrope_c*)i_collider->GetCoHitAc(); if (i_collider->ChkCoHit() && rope_p != NULL && fopAcM_GetName(rope_p) == fpcNm_Obj_Crope_e) { if (param_2) { if (rope_p->getRopeStartPos()->abs2XZ(*param_1) > SQUARE(100.0f)) { if (rope_p->getRopeEndPos()->abs2XZ(*param_1) > SQUARE(100.0f)) { return rope_p; } } } else if (checkInputOnR()) { mDoMtx_stack_c::YrotS(-rope_p->shape_angle.y); mDoMtx_stack_c::transM(-rope_p->getRopeStartPos()->x, -rope_p->getRopeStartPos()->y, -rope_p->getRopeStartPos()->z); cXyz sp44; cXyz sp38; mDoMtx_stack_c::multVec(param_1, &sp44); mDoMtx_stack_c::multVec(rope_p->getRopeEndPos(), &sp38); if (fabsf(sp44.x) < 40.0f && (sp44.z > -10.0f || sp44.z - sp38.z < 10.0f)) { return rope_p; } } } return NULL; } int daAlink_c::checkWolfRopeJumpHang() { fopAc_ac_c* hit_actor = checkWolfRopeHit(&mTgCyls[0], ¤t.pos, TRUE); if (hit_actor == NULL) { hit_actor = checkWolfRopeHit(&mAtSph, ¤t.pos, TRUE); } if (hit_actor != NULL) { field_0x280c.setData(hit_actor); return procWolfRopeHangInit(4); } return 0; } f32 daAlink_c::getWolfRopeMoveSpeed() { daPy_frameCtrl_c* frameCtrl = mUnderFrameCtrl; f32 frame; if (frameCtrl->getFrame() >= 13.5f) { frame = frameCtrl->getFrame() - 13.5f; } else { frame = frameCtrl->getFrame(); } return mpHIO->mWolf.mWlRope.m.mMovementRate * frameCtrl->getRate() * cM_fsin(0.23271057f * frame); } int daAlink_c::setWolfRopePosY() { daObjCrope_c* rope = (daObjCrope_c*)field_0x280c.getActor(); cXyz* ropeStartPos = rope->getRopeStartPos(); cXyz* ropeEndPos = rope->getRopeEndPos(); cXyz* ropeVec = rope->getRopeVec(); f32 ropeStartRate = rope->getStartRate(¤t.pos); f32 var_f31; if (mProcID == PROC_WOLF_ROPE_MOVE && (((var_f31 = rope->getStartRate(&mLeftHandPos)) < 0.0f || var_f31 > 1.0f) || ((var_f31 = rope->getStartRate(&mRightHandPos)) < 0.0f || var_f31 > 1.0f) || ((var_f31 = rope->getStartRate(&mLeftFootPos)) < 0.0f || var_f31 > 1.0f) || ((var_f31 = rope->getStartRate(&mRightFootPos)) < 0.0f || var_f31 > 1.0f))) { int _; if (ropeStartPos->abs2XZ(current.pos) > ropeEndPos->abs2XZ(current.pos)) { current.pos.y = ropeEndPos->y; } else { current.pos.y = ropeStartPos->y; } rope->onOutFlg(); return 1; } if (ropeStartRate < 0.0f) { current.pos.y = ropeStartPos->y; } else if (ropeStartRate > 1.0f) { current.pos.y = ropeEndPos->y; } else { current.pos.y = ((ropeStartPos->y + (ropeStartRate * ropeVec->y)) - 40.0f) - (10.0f * cM_fsin(M_PI * ropeStartRate)); } return 0; } s16 daAlink_c::initWolfRopeShapeAngle() { fopAc_ac_c* actor = field_0x280c.getActor(); if (abs((s16)(actor->shape_angle.y - shape_angle.y)) < 0x4000) { shape_angle.y = actor->shape_angle.y; return actor->shape_angle.x; } else { shape_angle.y = actor->shape_angle.y - -0x8000; return -actor->shape_angle.x; } } void daAlink_c::wolfRopeSwingInc(f32 param_0) { field_0x3478 += param_0; u32 var_r6 = (u32)((field_0x3478 * 127.0f) / 100.0f); if (var_r6 > 127) { var_r6 = 127; } mDoAud_seStart(Z2SE_FN_ROPE_CREAK_ADD, ¤t.pos, var_r6, mVoiceReverbIntensity); } void daAlink_c::setWolfRopeOffsetY(int param_0) { if (param_0) { field_0x3478 = 0.0f; field_0x2b98 = 0.0f; mProcVar0.field_0x3008 = 0; } else { if (field_0x3478 > 100.0f) { field_0x3478 = 100.0f; } cLib_addCalc(&field_0x3478, 2.0f, 0.05f, 1.0f, 0.05f); field_0x2b98 = field_0x3478 * (cM_scos(mProcVar0.field_0x3008) - 1.0f) * 0.5f; f32 var_f3 = field_0x3478 - 2.0f; if (var_f3 > 2.0f) { var_f3 = 2.0f; } mProcVar0.field_0x3008 += var_f3 * (f32)0x600 + (f32)0xC00; } } int daAlink_c::getDirectionRopeMove() const { s16 angle = mMoveAngle - shape_angle.y; if (abs(angle) > 0x5000) { return DIR_BACKWARD; } if (angle >= 0x3000) { return DIR_LEFT; } if (angle <= -0x3000) { return DIR_RIGHT; } return DIR_FORWARD; } int daAlink_c::procWolfRopeMoveInit(int param_0, int param_1) { daObjCrope_c* rope_p = (daObjCrope_c*)field_0x280c.getActor(); commonProcInit(PROC_WOLF_ROPE_MOVE); mProcVar2.field_0x300c = initWolfRopeShapeAngle(); current.angle.y = shape_angle.y; setSingleAnimeWolfBaseSpeed(WANM_ROPE_WALK, 0.0f, mpHIO->mWolf.mWlRope.m.mMovementInterpolation); if (param_0) { mUnderFrameCtrl[0].setFrame(13.5f); getNowAnmPackUnder(UNDER_0)->setFrame(13.5f); } setSpecialGravity(0.0f, maxFallSpeed, 0); speed.y = 0.0f; if (param_1) { current.pos = rope_p->getPlayerNearPos(); field_0x3478 = 0.0f; mProcVar0.field_0x3008 = 0; } setWolfRopeOffsetY(setWolfRopePosY()); if (checkWolfGrabAnime()) { mProcNeckX = -0x1800; } mProcVar3.field_0x300e = 0; initServiceWaitTime(); return 1; } int daAlink_c::procWolfRopeMove() { daPy_frameCtrl_c* framectrl = &mUnderFrameCtrl[0]; daObjCrope_c* rope = (daObjCrope_c*)field_0x280c.getActor(); int var_r27 = 0; f32 temp_f26 = getAnmSpeedStickRate(mpHIO->mWolf.mWlRope.m.mMovementMinAnmSpeed, mpHIO->mWolf.mWlRope.m.mMovementMaxAnmSpeed); f32 temp_f25 = -1.0f * getAnmSpeedStickRate(mpHIO->mWolf.mWlRope.m.mMovementMinAnmSpeed, mpHIO->mWolf.mWlRope.m.mBackMovementMaxAnmSpeed); if (framectrl->getRate() > 0.0f) { framectrl->setRate(temp_f26); } else if (framectrl->getRate() < 0.0f) { framectrl->setRate(temp_f25); } else { var_r27 = 1; } cXyz* ropeStartPos = rope->getRopeStartPos(); cXyz* ropeEndPos = rope->getRopeEndPos(); cXyz* ropeVec = rope->getRopeVec(); f32 ropeStartRate = rope->getStartRate(¤t.pos); if (setTalkStatus()) { if (orderTalk(1)) { return 1; } } else if (mTargetedActor != NULL) { setDoStatus(BUTTON_STATUS_UNK_139); if (doTrigger()) { return procWolfJumpAttackInit(1); } } int ropeMoveDirection = getDirectionRopeMove(); f32 rope_start_distXZ = ropeStartPos->absXZ(current.pos); f32 rope_end_distXZ = ropeEndPos->absXZ(current.pos); if (ropeStartRate > 0.0f && ropeStartRate < 1.0f && rope_start_distXZ > 100.0f && rope_end_distXZ > 100.0f) { if (mCcStts.GetCCMoveP()->abs2XZ() > SQUARE(10.0f)) { mCcStts.ClrCcMove(); if (mCcStts.GetCCMoveP()->atan2sX_Z() - shape_angle.y > 0) { return procWolfRopeHangInit(2); } return procWolfRopeHangInit(3); } if (checkWindSpeedOnXZ()) { if (field_0x35b8.atan2sX_Z() - shape_angle.y > 0) { return procWolfRopeHangInit(2); } return procWolfRopeHangInit(3); } if (mMoveValue > 0.5f) { if (ropeMoveDirection == DIR_LEFT) { return procWolfRopeStaggerInit(2); } else if (ropeMoveDirection == DIR_RIGHT) { return procWolfRopeStaggerInit(3); } } } mCcStts.ClrCcMove(); if (ropeStartRate > 0.0f && ropeStartRate < 1.0f && rope_start_distXZ > 85.0f && rope_end_distXZ > 85.0f) { if (!checkInputOnR() && var_r27 != 0 && checkServiceWaitMode()) { if (field_0x30ca != 0) { field_0x30ca--; } else { return procWolfRopeStaggerInit(4); } } else { initServiceWaitTime(); } } else { initServiceWaitTime(); } if (var_r27 == 1 || framectrl->checkPass(0.0f) || framectrl->checkPass(15.0f)) { if (checkInputOnR() && ropeMoveDirection != DIR_RIGHT && ropeMoveDirection != DIR_LEFT) { if (var_r27 != 0 && mMoveValue > 0.5f && cLib_distanceAngleS(mMoveAngle, shape_angle.y) > 0x7000 && ((shape_angle.y == rope->shape_angle.y && rope_start_distXZ > 70.0f) || (shape_angle.y != rope->shape_angle.y && rope_end_distXZ > 70.0f))) { return procWolfRopeTurnInit(); } if (ropeMoveDirection != DIR_BACKWARD) { framectrl->setRate(temp_f26); framectrl->setLoop(0); } else { framectrl->setRate(temp_f25); framectrl->setLoop(framectrl->getEnd()); } initBasAnime(); wolfRopeSwingInc(10.0f); mProcVar0.field_0x3008 = 0; } else if (var_r27 == 0) { stopHalfMoveAnime(13.5f); wolfRopeSwingInc(10.0f); mProcVar0.field_0x3008 = 0; } else if (checkSubjectAction()) { return 1; } } mNormalSpeed = getWolfRopeMoveSpeed(); if (mNormalSpeed < 0.0f) { mNormalSpeed *= -1.0f; current.angle.y = shape_angle.y + 0x8000; if (checkInputOnR() && !checkAttentionLock()) { mProcVar3.field_0x300e++; if (mProcVar3.field_0x300e == 60) { return procWolfRopeTurnInit(); } } else { mProcVar3.field_0x300e = 0; } } else { current.angle.y = shape_angle.y; mProcVar3.field_0x300e = 0; } f32 var_f24 = 45.0f; if ((ropeStartRate < 0.0f && rope_start_distXZ > var_f24) || (ropeStartRate > 1.0f && rope_end_distXZ > var_f24)) { rope->offRide(); f32 var_f27; if (current.angle.y != shape_angle.y) { var_f27 = 80.0f; } else { var_f27 = 40.0f; } current.pos.x += var_f27 * cM_ssin(current.angle.y); current.pos.z += var_f27 * cM_scos(current.angle.y); current.angle.y = shape_angle.y; return checkNextActionWolf(0); } setWolfRopeOffsetY(setWolfRopePosY()); f32 temp_f30 = framectrl->getFrame(); if (temp_f30 < 1.0f || (temp_f30 > 12.5f && temp_f30 < 14.5f) || temp_f30 > (framectrl->getEnd() - 1.0f)) { if (mLeftHandPos.abs2XZ(current.pos) > mRightHandPos.abs2XZ(current.pos)) { rope->setFrontJoint(19); rope->setBackJoint(31); } else { rope->setFrontJoint(24); rope->setBackJoint(36); } } else if (temp_f30 < 13.5f) { rope->setFrontJoint(19); rope->setBackJoint(36); } else { rope->setFrontJoint(24); rope->setBackJoint(31); } return 1; } int daAlink_c::procWolfRopeHangInit(int param_0) { daObjCrope_c* rope_p = (daObjCrope_c*)field_0x280c.getActor(); commonProcInit(PROC_WOLF_ROPE_HANG); if (param_0 != 4) { mProcVar3.field_0x300e = 0; setSingleAnimeWolf(WANM_HANG, mpHIO->mWolf.mWlRope.m.mTwistClimbAnmSpeed, 0.0f, 16, mpHIO->mWolf.mWlRope.m.mFallInterpolation); rope_p->rideKeep(); } else { mProcVar3.field_0x300e = 1; daAlink_WANM climb_anm; s16 temp_r0 = shape_angle.y - rope_p->shape_angle.y; if ((temp_r0 >= 0 && temp_r0 < 0x4000) || temp_r0 <= -0x4000) { param_0 = 3; climb_anm = WANM_ROPE_CLIMB_RIGHT; } else { param_0 = 2; climb_anm = WANM_ROPE_CLIMB_LEFT; } setSingleAnimeWolfBaseSpeed(climb_anm, mpHIO->mWolf.mWlRope.m.mTwistClimbAnmSpeed, mpHIO->mWolf.mWlRope.m.mTwistClimbInterpolation); rope_p->setFrontJoint(19); rope_p->setBackJoint(23); current.pos = rope_p->getPlayerNearPos(); field_0x2f99 = 0; dComIfGp_getVibration().StartShock(2, 15, cXyz(0.0f, 1.0f, 0.0f)); } field_0x3198 = param_0; mProcVar4.field_0x3010 = initWolfRopeShapeAngle(); mProcVar2.field_0x300c = 0; if (param_0 == 2) { ANGLE_SUB_2(shape_angle.y, 0x4000); mProcVar4.field_0x3010 = -mProcVar4.field_0x3010; } else { ANGLE_ADD(shape_angle.y, 0x4000); } wolfRopeSwingInc(50.0f); mProcVar0.field_0x3008 = 0; setWolfRopePosY(); setWolfRopeOffsetY(0); setSpecialGravity(0.0f, maxFallSpeed, 0); speed.y = 0.0f; mNormalSpeed = 0.0f; shape_angle.x = 0; return 1; } int daAlink_c::procWolfRopeHang() { daPy_frameCtrl_c* framectrl = &mUnderFrameCtrl[0]; daObjCrope_c* rope = (daObjCrope_c*)field_0x280c.getActor(); if (rope == NULL) { return checkNextActionWolf(0); } if (checkAnmEnd(framectrl)) { if (mProcVar3.field_0x300e != 0) { m_oldFrameCalc->getOldFrameTransInfo(0)->mTranslate.z -= 15.0f; if (field_0x3198 == 2) { ANGLE_ADD_2(shape_angle.y, 0x4000); setOldRootQuaternion(0, -0x4000, 0); shape_angle.x = -shape_angle.z; return procWolfRopeMoveInit(0, 0); } else { ANGLE_SUB_2(shape_angle.y, 0x4000); setOldRootQuaternion(0, 0x4000, 0); shape_angle.x = shape_angle.z; return procWolfRopeMoveInit(1, 0); } } mProcVar3.field_0x300e = 1; daAlink_WANM anm; if (field_0x3198 == 2) { anm = WANM_ROPE_CLIMB_LEFT; } else { anm = WANM_ROPE_CLIMB_RIGHT; } setSingleAnimeWolfBaseSpeed(anm, mpHIO->mWolf.mWlRope.m.mTwistClimbAnmSpeed, mpHIO->mWolf.mWlRope.m.mTwistClimbInterpolation); } f32 temp_f31 = framectrl->getFrame(); if (mProcVar3.field_0x300e == 0 || temp_f31 < 22.0f) { setDoStatus(BUTTON_STATUS_DROP_DOWN); if (doTrigger()) { rope->setCoCancelTimer(); current.pos.x -= 80.0f * cM_ssin(shape_angle.y); current.pos.z -= 80.0f * cM_scos(shape_angle.y); m_oldFrameCalc->getOldFrameTransInfo(0)->mTranslate.z += 80.0f; return procWolfFallInit(2, mpHIO->mWolf.mWlAutoJump.m.mNormalFallInterp); } } if (mProcVar3.field_0x300e != 0) { if (field_0x3198 == 2) { if (framectrl->checkPass(22.0f)) { wolfRopeSwingInc(15.0f); mProcVar0.field_0x3008 = 0; } if (temp_f31 < 1.0f) { rope->setFrontJoint(19); rope->setBackJoint(23); } else if (temp_f31 < 5.0f) { rope->setFrontJoint(-1); } else if (temp_f31 < 22.0f) { rope->setFrontJoint(18); } else if (temp_f31 < 41.0f) { rope->setBackJoint(36); } else { rope->setFrontJoint(19); rope->setBackJoint(31); if (checkWolfGrabAnime()) { mProcNeckX = -0x1800; } } } else { if (framectrl->checkPass(27.0f)) { wolfRopeSwingInc(15.0f); mProcVar0.field_0x3008 = 0; } if (temp_f31 < 1.0f) { rope->setFrontJoint(19); rope->setBackJoint(23); } else if (temp_f31 < 12.0f) { rope->setFrontJoint(-1); } else if (temp_f31 < 27.0f) { rope->setFrontJoint(18); } else if (temp_f31 < 46.0f) { rope->setFrontJoint(31); } else { rope->setBackJoint(24); rope->setFrontJoint(36); if (checkWolfGrabAnime()) { mProcNeckX = -0x1800; } } } } else { if (framectrl->checkPass(4.0f)) { dComIfGp_getVibration().StartShock(2, 0xF, cXyz(0.0f, 1.0f, 0.0f)); } if (temp_f31 < 7.0f) { rope->rideKeep(); } else if (temp_f31 < 9.0f) { rope->setFrontJoint(19); } else { rope->setBackJoint(23); } } setWolfRopeOffsetY(0); return 1; } int daAlink_c::procWolfRopeTurnInit() { commonProcInit(PROC_WOLF_ROPE_TURN); setSingleAnimeWolfParam(WANM_ROPE_TURN, &mpHIO->mWolf.mWlRope.m.mFlipAnm); voiceStart(Z2SE_WL_V_BREATH_JUMP); setSpecialGravity(0.0f, maxFallSpeed, 0); speed.y = 0.0f; mNormalSpeed = 0.0f; mProcVar3.field_0x300e = initWolfRopeShapeAngle(); current.angle.y = shape_angle.y + 0x8000; field_0x3588 = l_wolfBaseAnime; shape_angle.x = 0; field_0x37c8 = current.pos; mProcVar2.field_0x300c = 0; field_0x347c = 1.0f / mUnderFrameCtrl[0].getEnd(); static_cast(field_0x280c.getActor())->rideKeep(); return 1; } int daAlink_c::procWolfRopeTurn() { daPy_frameCtrl_c* framectrl = &mUnderFrameCtrl[0]; daObjCrope_c* rope = (daObjCrope_c*)field_0x280c.getActor(); field_0x2f99 = 4; f32 temp_f30 = field_0x347c * framectrl->getFrame(); field_0x3588.x = l_wolfBaseAnime.x - (temp_f30 * (l_wolfBaseAnime.x + l_wolfRopeBaseAnime.x)); field_0x3588.z = l_wolfBaseAnime.z - (temp_f30 * (l_wolfBaseAnime.z + l_wolfRopeBaseAnime.z)); setWolfRopePosY(); if (checkAnmEnd(framectrl)) { return procWolfRopeMoveInit(0, 0); } f32 anm_frame = framectrl->getFrame(); if (framectrl->checkPass(9.0f)) { wolfRopeSwingInc(30.0f); mProcVar0.field_0x3008 = 0; dComIfGp_getVibration().StartShock(1, 0xF, cXyz(0.0f, 1.0f, 0.0f)); } else if (framectrl->checkPass(13.0f)) { wolfRopeSwingInc(10.0f); mProcVar0.field_0x3008 = 0; } if (!(anm_frame < 7.0f)) { int _; if (anm_frame < 9.0f) { mProcVar2.field_0x300c = mProcVar3.field_0x300e; rope->setFrontJoint(19); } else if (anm_frame < 11.0f) { rope->setFrontJoint(24); } else if (anm_frame < 13.0f) { rope->setFrontJoint(24); rope->setBackJoint(31); } else { rope->setFrontJoint(19); rope->setBackJoint(31); } } setWolfRopeOffsetY(0); return 1; } int daAlink_c::procWolfRopeStaggerInit(int param_0) { commonProcInit(PROC_WOLF_ROPE_STAGGER); if (param_0 == 4) { setSingleAnimeWolfBase(WANM_ROPE_WAIT); mNormalSpeed = 0.0f; mProcVar3.field_0x300e = 1; } else { setSingleAnimeWolfBase(WANM_ROPE_FALTER); field_0x3588 = l_wolfRopeBaseAnime; mProcVar3.field_0x300e = 0; } mProcVar4.field_0x3010 = param_0; mProcVar2.field_0x300c = initWolfRopeShapeAngle(); setSpecialGravity(0.0f, maxFallSpeed, 0); speed.y = 0.0f; current.angle.y = shape_angle.y; if (checkWolfGrabAnime()) { mProcNeckX = -0x1800; } daObjCrope_c* rope_p = (daObjCrope_c*)field_0x280c.getActor(); rope_p->setFrontJoint(19); rope_p->setBackJoint(31); return 1; } int daAlink_c::procWolfRopeStagger() { daPy_frameCtrl_c* framectrl = &mUnderFrameCtrl[0]; daObjCrope_c* rope = (daObjCrope_c*)field_0x280c.getActor(); f32 ropeStartRate, ropeStartDistXZ, ropeEndDistXZ; ropeStartDistXZ = rope->getRopeStartPos()->absXZ(current.pos); ropeEndDistXZ = rope->getRopeEndPos()->absXZ(current.pos); ropeStartRate = rope->getStartRate(¤t.pos); if (mCcStts.GetCCMoveP()->abs2XZ() > 100.0f) { mCcStts.ClrCcMove(); if ((mCcStts.GetCCMoveP()->atan2sX_Z() - shape_angle.y) > 0) { return procWolfRopeHangInit(2); } else { return procWolfRopeHangInit(3); } } if (!(ropeStartRate > 0.0f) || !(ropeStartRate < 1.0f) || !(ropeStartDistXZ > 85.0f) || !(ropeEndDistXZ > 85.0f)) { return procWolfRopeMoveInit(0, 0); } if (checkAnmEnd(framectrl)) { if (mProcVar3.field_0x300e != 0) { return procWolfRopeMoveInit(0, 0); } else { return procWolfRopeHangInit(mProcVar4.field_0x3010); } } mCcStts.ClrCcMove(); int direction = getDirectionRopeMove(); if ((mProcVar3.field_0x300e != 0 && checkInputOnR()) || (mProcVar3.field_0x300e == 0 && (!checkInputOnR() || direction == DIR_FORWARD || direction == DIR_BACKWARD))) { return procWolfRopeMoveInit(0, 0); } if (mProcVar3.field_0x300e != 0) { if (checkSubjectAction()) { return 1; } if (framectrl->checkPass(30.0f) || framectrl->checkPass(61.0f) || framectrl->checkPass(86.0f)) { wolfRopeSwingInc(10.0f); } else if (framectrl->checkPass(65.0f)) { voiceStart(Z2SE_WL_V_FOOTMISS); } } else { if (framectrl->checkPass(16.0f) || framectrl->checkPass(33.0f) || framectrl->checkPass(50.0f) || framectrl->checkPass(71.0f)) { wolfRopeSwingInc(10.0f); } else if (framectrl->checkPass(60.0f)) { voiceStart(Z2SE_WL_V_BREATH_JUMP); } field_0x2f99 = 4; daObjCrope_c* rope = (daObjCrope_c*)field_0x280c.getActor(); if (framectrl->getFrame() > 46.0f) { mNormalSpeed = 0.0f; } else { mNormalSpeed = (7.0f + (2.0f * (2 - ((int)framectrl->getFrame() / 15)))) * fabsf(cM_fsin((M_PI * framectrl->getFrame()) / 15.0f)); } if ((framectrl->getFrame() >= 5.0f && framectrl->getFrame() < 19.0f) || (framectrl->getFrame() >= 39.0f && framectrl->getFrame() < 51.0f)) { rope->setBackJoint(36); } else { rope->setBackJoint(31); } if ((framectrl->getFrame() >= 13.0f && framectrl->getFrame() < 30.0f) || (framectrl->getFrame() >= 48.0f && framectrl->getFrame() < 63.0f)) { rope->setFrontJoint(24); } else { rope->setFrontJoint(19); } } setWolfRopeOffsetY(0); return 1; } int daAlink_c::procWolfRopeSubjectivityInit() { fopAc_ac_c* rope = field_0x280c.getActor(); commonProcInit(PROC_WOLF_ROPE_SUBJECTIVITY); if (!checkUnderMove0BckNoArcWolf(WANM_ROPE_WALK)) { setSingleAnimeWolfBaseSpeed(WANM_ROPE_WALK, 0.0f, mpHIO->mWolf.mWlRope.m.mMovementInterpolation); } mProcVar2.field_0x300c = initWolfRopeShapeAngle(); current.angle.y = shape_angle.y; setSpecialGravity(0.0f, maxFallSpeed, 0); speed.y = 0.0f; mNormalSpeed = 0.0f; setWolfRopeOffsetY(setWolfRopePosY()); if (checkWolfGrabAnime()) { mProcNeckX = -0x1800; } setSubjectMode(); return 1; } int daAlink_c::procWolfRopeSubjectivity() { daPy_frameCtrl_c* framectrl = &mUnderFrameCtrl[0]; daObjCrope_c* rope = (daObjCrope_c*)field_0x280c.getActor(); cXyz* ropeStartPos = rope->getRopeStartPos(); cXyz* ropeEndPos = rope->getRopeEndPos(); cXyz* ropeVec = rope->getRopeVec(); f32 ropeStartRate = rope->getStartRate(¤t.pos); f32 ropeStartDistXZ = ropeStartPos->absXZ(current.pos); f32 ropeEndDistXZ = ropeEndPos->absXZ(current.pos); onResetFlg0(RFLG0_UNK_4000000); if (ropeStartRate > 0.0f && ropeStartRate < 1.0f && ropeStartDistXZ > 100.0f && ropeEndDistXZ > 100.0f && mCcStts.GetCCMoveP()->abs2XZ() > SQUARE(10.0f)) { mCcStts.ClrCcMove(); if ((mCcStts.GetCCMoveP()->atan2sX_Z() - shape_angle.y) > 0) { return procWolfRopeHangInit(2); } else { return procWolfRopeHangInit(3); } } mCcStts.ClrCcMove(); setWolfRopeOffsetY(setWolfRopePosY()); if (checkSubjectEnd(TRUE)) { int var_r27; if (framectrl->getFrame() >= 12.5f && framectrl->getFrame() <= 14.5f) { var_r27 = 1; } else { var_r27 = 0; } return procWolfRopeMoveInit(var_r27, 0); } shape_angle.y += mBodyAngle.y; setBodyAngleToCamera(); s16 r24 = cLib_minMaxLimit((s16)(shape_angle.y - current.angle.y), -0x5000, 0x5000); mBodyAngle.y = r24; shape_angle.y = current.angle.y; return 1; } int daAlink_c::getWolfTagJumpTime() const { int time; if (mProcID == PROC_WOLF_TAG_JUMP) { time = mProcVar0.field_0x3008 + (int)((mpHIO->mWolf.mWlPoint.m.mLandingAnm.mCancelFrame - mpHIO->mWolf.mWlPoint.m.mLandingAnm.mStartFrame) / mpHIO->mWolf.mWlPoint.m.mLandingAnm.mSpeed); } else { time = (int)(checkMidnaLockJumpPoint()->abs(current.pos) / mpHIO->mWolf.mWlPoint.m.mTagJumpSpeed); } time -= 2; if (time < 1) { time = 1; } return time; } const cXyz* daAlink_c::checkMidnaLockJumpPoint() const { if ((!mLinkAcch.ChkGroundHit() && mProcID != PROC_WOLF_TAG_JUMP) || checkMidnaUseAbility() || getMidnaActor()->eventInfo.checkCommandTalk()) { return NULL; } fopAc_ac_c* partner_p = fopAcM_getTalkEventPartner(daPy_getLinkPlayerActorClass()); fopAc_ac_c* wljump_p = NULL; if (checkWolfTagLockJumpReady()) { return &field_0x3738; } if (mProcID == PROC_WOLF_TAG_JUMP && field_0x280c.getActorConst() != NULL) { wljump_p = field_0x280c.getActorConst(); } else if (mPriActorOwn != NULL && fopAcM_GetName(mPriActorOwn) == fpcNm_Tag_Wljump_e) { wljump_p = mPriActorOwn; } else if (partner_p != NULL && fopAcM_GetName(partner_p) == fpcNm_Tag_Wljump_e) { wljump_p = partner_p; } if (wljump_p != NULL) { return static_cast(wljump_p)->getLockPos(); } return NULL; } int daAlink_c::procWolfTagJumpInit(fopAc_ac_c* i_tag) { commonProcInit(PROC_WOLF_TAG_JUMP); field_0x3480 = mpHIO->mWolf.mWlPoint.m.mTagJumpSpeed; field_0x3198 = 0; if (i_tag == NULL) { field_0x37c8.set(current.pos.x + (300.0f * cM_ssin(shape_angle.y)), current.pos.y + 200.0f, current.pos.z + (300.0f * cM_scos(shape_angle.y))); field_0x3480 = 30.0f; field_0x280c.clearData(); mProcVar1.field_0x300a = 0; field_0x3198 = 1; } else { daTagWljump_c* tag = (daTagWljump_c*)i_tag; field_0x37c8 = *tag->getLockPos(); cXyz sp14 = field_0x37c8 - current.pos; f32 temp_f31 = tag->getLandArea() / sp14.absXZ(); field_0x37c8.x -= sp14.x * temp_f31; field_0x37c8.z -= sp14.z * temp_f31; field_0x280c.setData(i_tag); tag->onNextCheckFlg(); mProcVar1.field_0x300a = tag->getNotSlideFlg(); } setSingleAnimeWolf(WANM_JUMP_ATTACK_START, mpHIO->mWolf.mWlAutoJump.m.mWeakJumpAnmSpeed, mpHIO->mWolf.mWlAutoJump.m.mJumpAnm.mStartFrame, mpHIO->mWolf.mWlAutoJump.m.mJumpAnm.mEndFrame, mpHIO->mWolf.mWlAutoJump.m.mJumpAnm.mInterpolation); field_0x3588 = l_wolfBaseAnime; cXyz sp8 = field_0x37c8 - current.pos; f32 temp_f30 = 1.0f / sp8.abs(); shape_angle.y = sp8.atan2sX_Z(); current.angle.y = shape_angle.y; field_0x2fe4 = shape_angle.y; mNormalSpeed = temp_f30 * (field_0x3480 * sp8.absXZ()); mProcVar0.field_0x3008 = (sp8.absXZ() / mNormalSpeed) - 1.0f; if (mProcVar0.field_0x3008 < 1) { mProcVar0.field_0x3008 = 1; } if (fabsf(sp8.y) < 50.0f) { setSpecialGravity(-(120.0f + (2.0f * (60.0f - sp8.y)) + (4.0f * JMAFastSqrt(60.0f * (60.0f - sp8.y)))) / (mProcVar0.field_0x3008 * mProcVar0.field_0x3008), maxFallSpeed, 0); speed.y = JMAFastSqrt(-120.0f * gravity); mProcVar3.field_0x300e = 0; } else if (sp8.y > 0.0f) { setSpecialGravity((-2.0f * sp8.y) / (mProcVar0.field_0x3008 * mProcVar0.field_0x3008), maxFallSpeed, 0); speed.y = -gravity * mProcVar0.field_0x3008; mProcVar3.field_0x300e = 1; } else { speed.y = 0.0f; setSpecialGravity((2.0f * sp8.y) / (mProcVar0.field_0x3008 * mProcVar0.field_0x3008), maxFallSpeed, 0); mProcVar3.field_0x300e = 1; } mProcVar2.field_0x300c = cM_atan2s(-speed.y, mNormalSpeed) >> 1; field_0x3478 = speed.y; mProcVar4.field_0x3010 = 0; offNoResetFlg0(FLG0_UNK_40000); voiceStart(Z2SE_WL_V_LOCK_JUMP); mProcVar5.field_0x3012 = 0; return 1; } int daAlink_c::procWolfTagJump() { daTagWljump_c* tag = (daTagWljump_c*)field_0x280c.getActor(); daPy_frameCtrl_c* framectrl = &mUnderFrameCtrl[0]; mProcVar0.field_0x3008--; if (mProcVar0.field_0x3008 < 0) { if (tag == NULL || tag->getLockPos() == NULL || mProcVar0.field_0x3008 < -mpHIO->mWolf.mWlPoint.m.mLockJumpStopTime) { procWolfWaitInit(); } else { if (field_0x3198 == 0) { onResetFlg0(RFLG0_WOLF_TAG_LOCK_JUMP_READY); } field_0x3738 = *tag->getLockPos(); setDoStatus(BUTTON_STATUS_UNK_147); cLib_addCalcAngleS(&shape_angle.y, cLib_targetAngleY(¤t.pos, &field_0x3738), 2, 0x2000, 0x800); current.angle.y = shape_angle.y; if (doTrigger()) { mProcVar5.field_0x3012 = 1; } if (mProcVar5.field_0x3012 && (checkModeFlg(0x100) || checkAnmEnd(framectrl) || framectrl->getFrame() > mpHIO->mWolf.mWlPoint.m.mLandingAnm.mCancelFrame)) { procWolfTagJumpInit(tag); } else if (checkAnmEnd(framectrl)) { onModeFlg(0x100); setSingleAnimeWolfBaseSpeed(WANM_WAIT_B, mpHIO->mWolf.mWlPoint.m.mIdleAnmSpeed, mpHIO->mWolf.mWlPoint.m.mIdleInterpolation); } } return 1; } field_0x2f99 = 4; if (mProcVar3.field_0x300e != 0) { speed.y = field_0x3478 + gravity; field_0x3478 = speed.y; } mProcVar2.field_0x300c = cM_atan2s(-speed.y, mNormalSpeed) >> 1; if (checkUnderMove0BckNoArcWolf(WANM_JUMP_ATTACK_START) && checkAnmEnd(framectrl)) { field_0x2f99 = 0xC; setSingleAnimeWolfBaseSpeed(WANM_JUMP_ATTACK, 0.0f, mpHIO->mWolf.mWlAutoJump.m.mClimbAnm.mInterpolation); } if (mProcVar0.field_0x3008 == 0) { cXyz sp14 = field_0x37c8 - current.pos; if (sp14.absXZ() < (31.0f + field_0x3480)) { if (field_0x3198 == 0) { current.pos = field_0x37c8; } if (tag != NULL) { if (tag->getLockPos() != NULL) { onResetFlg0(RFLG0_WOLF_TAG_LOCK_JUMP_READY); field_0x3738 = *tag->getLockPos(); if (mProcVar1.field_0x300a != 0) { field_0x2f99 = 0x50; setSingleAnimeWolfParam(WANM_JUMP_B_END, &mpHIO->mWolf.mWlPoint.m.mLandingAnm); mNormalSpeed = 0.0f; speed = cXyz::Zero; setSpecialGravity(0.0f, maxFallSpeed, 0); field_0x2f9d = 4; setFootEffectProcType(4); dComIfGp_getVibration().StartShock(2, 0xF, cXyz(0.0f, 1.0f, 0.0f)); } else { procWolfTagJumpLandInit(tag); } } else { procWolfTagJumpLandInit(NULL); } } else if (field_0x3198 != 0) { procWolfFallInit(2, mpHIO->mWolf.mWlAutoJump.m.mNormalFallInterp); } else { current.pos.x -= 50.0f * cM_ssin(shape_angle.y); current.pos.z -= 50.0f * cM_scos(shape_angle.y); procWolfTagJumpLandInit(NULL); } } else { procWolfFallInit(2, mpHIO->mWolf.mWlAutoJump.m.mNormalFallInterp); } } return 1; } int daAlink_c::procWolfTagJumpLandInit(fopAc_ac_c* i_tag) { commonProcInit(PROC_WOLF_TAG_JUMP_LAND); setSingleAnimeWolfParam(WANM_ATTACK_A_END_FRONT, &mpHIO->mWolf.mWlPoint.m.mTagLandingAnm); if (mGndPolySpecialCode == dBgW_SPCODE_ICE) { mNormalSpeed = mpHIO->mWolf.mWlPoint.m.mLockLandingIceInitSpeed; } else { mNormalSpeed = 0.0f; } speed.y = 0.0f; field_0x3588 = l_wolfBaseAnime; if (i_tag != NULL) { field_0x280c.setData(i_tag); } field_0x2f9d = 0x78; setFootEffectProcType(1); field_0x2f99 = 12; dComIfGp_getVibration().StartShock(2, 15, cXyz(0.0f, 1.0f, 0.0f)); return 1; } int daAlink_c::procWolfTagJumpLand() { daPy_frameCtrl_c* frameCtrl_p = mUnderFrameCtrl; daTagWljump_c* wljump_p = (daTagWljump_c*)field_0x280c.getActor(); if (wljump_p != NULL && wljump_p->getLockPos() != NULL) { onResetFlg0(RFLG0_WOLF_TAG_LOCK_JUMP_READY); field_0x3738 = *wljump_p->getLockPos(); if (frameCtrl_p->getFrame() > mpHIO->mWolf.mWlPoint.m.mTagLandingAnm.mCancelFrame) { setDoStatus(BUTTON_STATUS_UNK_147); if (doTrigger()) { return procWolfTagJumpInit(field_0x280c.getActor()); } } } field_0x2f99 = 4; if (cLib_addCalc(&mNormalSpeed, 0.0f, mpHIO->mWolf.mWlPoint.m.mLockLandingIceDecelRate, mpHIO->mWolf.mWlPoint.m.mLockLandingIceMaxDecel, mpHIO->mWolf.mWlPoint.m.mLockLandingIceMinDecel) < 3.0f) { if (checkAnmEnd(frameCtrl_p)) { checkNextActionWolf(0); } else if (!(frameCtrl_p->getFrame() > mpHIO->mWolf.mWlPoint.m.mTagLandingAnm.mCancelFrame) || !checkNextActionWolf(1)) { field_0x2f9d = 0x78; seStartMapInfoLevel(Z2SE_FN_WOLF_SLIP); } } else { field_0x2f9d = 0x78; seStartMapInfoLevel(Z2SE_FN_WOLF_SLIP); } return 1; } static fopAc_ac_c* daAlink_searchGiant(fopAc_ac_c* i_actor, void* i_data) { cXyz* gnd_chk_pos = static_cast(i_data); if (fopAcM_GetName(i_actor) == fpcNm_OBJ_SEKIZOA_e && i_actor->current.pos.abs2(*gnd_chk_pos) < SQUARE(200.0f)) { return i_actor; } return NULL; } static void* daAlink_searchGiantTalk(fopAc_ac_c* i_actor, void* i_data) { UNUSED(i_data); if (fopAcM_GetName(i_actor) == fpcNm_OBJ_SEKIZOA_e && static_cast(i_actor)->getType() == 0) { return i_actor; } return NULL; } int daAlink_c::procWolfGiantPuzzleInit() { if (!commonProcInitNotSameProc(PROC_WOLF_GIANT_PUZZLE)) { return 0; } setBlendWolfMoveAnime(mpHIO->mWolf.mWlMove.m.mIdleInterpolation); current.angle.y = shape_angle.y; field_0x2f98 = 4; mProcVar2.mPuzzleAimAngle = shape_angle.y; field_0x3478 = 0.0f; field_0x347c = mpHIO->mWolf.mWlMoveNoP.m.mDeceleration; mMaxSpeed = mpHIO->mWolf.mWlMoveNoP.m.mMaxSpeed; offWolfEyeUp(); return 1; } int daAlink_c::procWolfGiantPuzzle() { if (mMode == 0) { return checkNextActionWolf(0); } if (!checkNoResetFlg0(FLG0_UNK_4000) && mProcVar2.field_0x300c == shape_angle.y && mMode != 0x28 && checkZeroSpeedF()) { setDoStatusEmphasys(BUTTON_STATUS_SPEAK); if (doTrigger()) { fopAc_ac_c* giant_p = (fopAc_ac_c*)fopAcIt_Judge((fopAcIt_JudgeFunc)daAlink_searchGiantTalk, NULL); if (giant_p != NULL) { fopAcM_orderTalkEvent(this, giant_p, 0, 0); } } else if (checkInputOnR()) { int direction = getDirectionFromShapeAngle(); if (direction == DIR_FORWARD) { cXyz gnd_chk_pos(current.pos.x + cM_ssin(shape_angle.y) * 600.0f, current.pos.y + 10.0f, current.pos.z + cM_scos(shape_angle.y) * 600.0f); mLinkGndChk.SetPos(&gnd_chk_pos); if (fabsf(dComIfG_Bgsp().GroundCross(&mLinkGndChk) - current.pos.y) < 0.1f && fopAcIt_Judge((fopAcIt_JudgeFunc)daAlink_searchGiant, &gnd_chk_pos) == NULL) { field_0x347c = mpHIO->mWolf.mWlMoveNoP.m.mAcceleration; field_0x3478 = mMaxSpeed; } } else if (direction == DIR_LEFT) { ANGLE_ADD_2(mProcVar2.mPuzzleAimAngle, 0x4000); } else if (direction == DIR_RIGHT) { ANGLE_SUB_2(mProcVar2.mPuzzleAimAngle, 0x4000); } else { ANGLE_ADD_2(mProcVar2.mPuzzleAimAngle, 0x8000); } } } cLib_chaseF(&mNormalSpeed, field_0x3478, field_0x347c); if (mProcVar2.mPuzzleAimAngle != shape_angle.y) { cLib_addCalcAngleS( &shape_angle.y, mProcVar2.mPuzzleAimAngle, mpHIO->mWolf.mWlMoveNoP.m.mTurnAngleRate, mpHIO->mWolf.mWlMoveNoP.m.mTurnMax, mpHIO->mWolf.mWlMoveNoP.m.mTurnMin); current.angle.y = shape_angle.y; } if (checkZeroSpeedF()) { onModeFlg(1); } else { offModeFlg(1); } setBlendWolfMoveAnime(-1.0f); return 1; } void daAlink_c::setWolfHangGroundY() { cXyz pos; mDoMtx_multVecZero(mpLinkModel->getAnmMtx(0), &pos); mLinkGndChk.SetPos(&pos); field_0x33d8 = dComIfG_Bgsp().GroundCross(&mLinkGndChk); } int daAlink_c::changeWolfHangEndProc() { setWolfHangGroundY(); f32 var_f1; if (checkNoResetFlg0(FLG0_UNK_80) && mWaterY > field_0x33d8) { var_f1 = mpHIO->mWolf.mWlSwim.m.mStartHeight + mpHIO->mWolf.mWlSwim.m.mClimbBelowWaterSurface; } else { var_f1 = mpHIO->mWolf.mWlWallHang.m.mHangingFootHeight; } if (current.pos.y < (field_0x33d8 + var_f1) - 1.0f) { return procWolfLandInit(); } else { setDoStatus(BUTTON_STATUS_DROP_DOWN); if (doTrigger()) { current.pos.x -= cM_ssin(shape_angle.y) * 50.0f; current.pos.z -= cM_scos(shape_angle.y) * 50.0f; onNoResetFlg2(FLG2_UNK_200); procWolfFallInit(2, mpHIO->mWolf.mWlWallHang.m.mHangingFallInterp); return 1; } } return 0; } int daAlink_c::procWolfHangReadyInit() { commonProcInit(PROC_WOLF_HANG_READY); setSingleAnimeWolf(WANM_VJMP_START, mpHIO->mWolf.mWlWallHang.m.mPreGrabJumpAnm.mSpeed, mpHIO->mWolf.mWlWallHang.m.mPreGrabJumpAnm.mStartFrame, 12, mpHIO->mWolf.mWlWallHang.m.mPreGrabJumpAnm.mInterpolation); field_0x3198 = field_0x2f91; mProcVar2.field_0x300c = field_0x306e + 0x8000; mNormalSpeed = 0.0f; speed.y = 0.0f; return 1; } int daAlink_c::procWolfHangReady() { daPy_frameCtrl_c* frameCtrl = mUnderFrameCtrl; cLib_addCalcAngleS(&shape_angle.y, mProcVar2.field_0x300c, 2, 0x1000, 0x400); current.angle.y = shape_angle.y; if (checkAnmEnd(frameCtrl)) { shape_angle.y = mProcVar2.field_0x300c; current.angle.y = shape_angle.y; if (!procWolfHangWallCatchInit(field_0x3198)) { checkWaitAction(); } } return 1; } int daAlink_c::procWolfHangWallCatchInit(int param_0) { cXyz sp18; int var_r29; if (mProcID != PROC_WOLF_HANG_FALL_START) { cXyz spC = current.pos; if (checkModeFlg(2)) { current.pos.set(field_0x34ec.x - (1.5f * cM_ssin(field_0x306e)), field_0x34ec.y, field_0x34ec.z - (1.5f * cM_scos(field_0x306e))); checkHangStartSideWall(field_0x306e); } if (field_0x34ec.absXZ(current.pos) > 120.0f) { current.pos = spC; return 0; } if (checkModeFlg(2)) { sp18.set(current.pos.x, 10.0f + field_0x34ec.y, current.pos.z); } else { sp18.set(field_0x34ec.x - (1.5f * cM_ssin(field_0x306e)), 10.0f + field_0x34ec.y, field_0x34ec.z - (1.5f * cM_scos(field_0x306e))); } mLinkGndChk.SetPos(&sp18); sp18.y = dComIfG_Bgsp().GroundCross(&mLinkGndChk); if (fabsf(sp18.y - field_0x34ec.y) > l_autoUpHeight) { return 0; } var_r29 = dComIfG_Bgsp().GetGroundCode(mLinkGndChk); shape_angle.y = field_0x306e + 0x8000; } else { sp18 = current.pos; var_r29 = mGroundCode; } if (checkModeFlg(0x40000)) { mProcVar2.field_0x300c = 1; } else { mProcVar2.field_0x300c = 0; } commonProcInit(PROC_WOLF_HANG_WALL_CATCH); if (param_0 == 8 && var_r29 != 6) { setSingleAnimeWolfParam(WANM_VJMP_CLIMB, &mpHIO->mWolf.mWlWallHang.m.mClimbAnm); mProcVar3.field_0x300e = 1; } else { setSingleAnimeWolfParam(WANM_VJMP_CLIMB_HANG, &mpHIO->mWolf.mWlWallHang.m.mWallGrabAnm); mProcVar3.field_0x300e = 0; } current.pos.x = sp18.x; current.pos.y = sp18.y; current.pos.z = sp18.z; current.angle.y = shape_angle.y; field_0x3588.x = 0.33864477f; field_0x3588.z = -29.525135f; mNormalSpeed = 0.0f; speed.y = 0.0f; dComIfGp_setPlayerStatus0(0, 0x200); setWolfHangGroundY(); field_0x3478 = mpLinkModel->getAnmMtx(0)[1][3]; mProcVar4.field_0x3010 = 0; return 1; } int daAlink_c::procWolfHangWallCatch() { daPy_frameCtrl_c* frameCtrl_p = mUnderFrameCtrl; if (mProcVar3.field_0x300e != 0 && frameCtrl_p->getFrame() >= 23.0f) { field_0x2f99 = 4; offModeFlg(0x4000); } else if (changeWolfHangEndProc()) { return 1; } f32 temp_f2 = field_0x3478; field_0x3478 = mpLinkModel->getAnmMtx(0)[1][3]; if (temp_f2 < field_0x33b8 && field_0x3478 >= field_0x33b8) { seStartMapInfo(Z2SE_WL_OUTOF_WATER); } if (checkAnmEnd(frameCtrl_p)) { if (mProcVar3.field_0x300e == 0) { if (mGroundCode == 6) { if (mProcVar4.field_0x3010 == 0) { setSingleAnimeWolf(WANM_HANG, mpHIO->mWolf.mWlWallHang.m.mFallGrabAnm.mSpeed, 35.0f, mpHIO->mWolf.mWlWallHang.m.mFallGrabAnm.mEndFrame, 5.0f); mProcVar4.field_0x3010 = 1; } } else { setSingleAnimeWolf(WANM_VJMP_CLIMB, mpHIO->mWolf.mWlWallHang.m.mClimbAnm.mSpeed, 17.0f, mpHIO->mWolf.mWlWallHang.m.mClimbAnm.mEndFrame, 2.0f); mProcVar3.field_0x300e = 1; } } else { checkNextActionWolf(0); int temp_r3 = mProcVar2.field_0x300c; if (mProcID == PROC_WOLF_WAIT && temp_r3 != 0) { procWolfSwimEndWaitInit(0); } onNoResetFlg1(FLG1_UNK_20); } } else if (mProcVar3.field_0x300e != 0 && frameCtrl_p->getFrame() > mpHIO->mWolf.mWlWallHang.m.mClimbAnm.mCancelFrame && checkNextActionWolf(1)) { onNoResetFlg1(FLG1_UNK_20); } return 1; } int daAlink_c::procWolfHangFallStartInit(cM3dGPla* i_tripla) { if (mProcID == PROC_WOLF_HANG_WALL_CATCH || checkNoResetFlg1(FLG1_UNK_20)) { return 0; } s16 var_r30 = i_tripla->mNormal.atan2sX_Z(); current.pos.x -= i_tripla->mNormal.x * 1.5f; current.pos.z -= i_tripla->mNormal.z * 1.5f; checkHangStartSideWall(var_r30); cXyz gnd_chk_pos(current.pos.x, current.pos.y + 50.0f, current.pos.z); mLinkGndChk.SetPos(&gnd_chk_pos); gnd_chk_pos.y = dComIfG_Bgsp().GroundCross(&mLinkGndChk); if (gnd_chk_pos.y != -G_CM3D_F_INF) { if (gnd_chk_pos.y < current.pos.y + l_autoDownHeight) { return 0; } current.pos.y = gnd_chk_pos.y; } commonProcInit(PROC_WOLF_HANG_FALL_START); setOldRootQuaternion(0, shape_angle.y - (var_r30 + 0x8000), 0); shape_angle.y = var_r30 + 0x8000; current.angle.y = shape_angle.y; setSingleAnimeWolfParam(WANM_HANG, &mpHIO->mWolf.mWlWallHang.m.mFallGrabAnm); f32 sin = cM_ssin(shape_angle.y); f32 cos = cM_scos(shape_angle.y); cXyz line_start(current.pos.x - sin * 50.0f, current.pos.y - 120.0f, current.pos.z - cos * 50.0f); cXyz line_end(current.pos.x + sin, line_start.y, current.pos.z + cos); if (commonLineCheck(&line_start, &line_end)) { mProcVar2.field_0x300c = 1; } else { mProcVar2.field_0x300c = 0; } mProcVar3.field_0x300e = 0; mNormalSpeed = 0.0f; speed.y = 0.0f; dComIfGp_setPlayerStatus0(0, 0x100); field_0x33d8 = mLinkAcch.GetGroundH(); return 1; } int daAlink_c::procWolfHangFallStart() { daPy_frameCtrl_c* frameCtrl_p = mUnderFrameCtrl; if (m_oldFrameCalc->getOldFrameRate() < 0.1f && changeWolfHangEndProc()) { return 1; } if (frameCtrl_p->checkPass(6.0f)) { dComIfGp_getVibration().StartShock(1, 1, cXyz(0.0f, 1.0f, 0.0f)); } if (mProcVar2.field_0x300c == 0 && mProcVar3.field_0x300e == 0) { if (frameCtrl_p->getFrame() > 22.0f) { frameCtrl_p->setFrame(22.0f); getNowAnmPackUnder(UNDER_0)->setFrame(22.0f); if (checkInputOnR() && getDirectionFromShapeAngle() == DIR_FORWARD) { mProcVar3.field_0x300e = 1; } } } else if (checkAnmEnd(mUnderFrameCtrl) && ((checkInputOnR() && getDirectionFromShapeAngle() == DIR_FORWARD) || mProcVar3.field_0x300e != 0)) { procWolfHangWallCatchInit(8); } return 1; } void daAlink_c::setWolfHeadDamage() { setUpperAnimeParam(dRes_ID_ALANM_BCK_WL_DAM_e, UPPER_2, &mpHIO->mWolf.mWlDamage.m.mRunningAnm); seStartOnlyReverb(Z2SE_AL_DAMAGE_NORMAL); freeGrabItem(); setFacePriTexture(FTANM_WL_DAM); voiceStart(Z2SE_WL_V_DAMAGE); } int daAlink_c::procWolfDamageInit(dCcD_GObjInf* i_hitObj) { commonProcInit(PROC_WOLF_DAMAGE); cXyz sp14; f32 temp_f31 = cM_ssin(shape_angle.y); f32 temp_f30 = cM_scos(shape_angle.y); cXyz* var_r30; if (i_hitObj != NULL) { var_r30 = getDamageVec(i_hitObj); } else { sp14.set(cM_ssin(field_0x311e), 0.0f, cM_scos(field_0x311e)); var_r30 = &sp14; } cXyz sp8((var_r30->z * -temp_f31) + (var_r30->x * temp_f30), var_r30->y, (var_r30->z * temp_f30) + (var_r30->x * temp_f31)); int direction = getDirectionFromAngle(cM_atan2s(-sp8.x, -sp8.z)); if (direction == DIR_FORWARD) { setSingleAnimeWolfParam(WANM_DMG_FRONT, &mpHIO->mWolf.mWlDamage.mNormal.m.mForwardAnm); field_0x3478 = mpHIO->mWolf.mWlDamage.mNormal.m.mForwardAnm.mCancelFrame; } else if (direction == DIR_BACKWARD) { setSingleAnimeWolfParam(WANM_DMG_BACK, &mpHIO->mWolf.mWlDamage.mNormal.m.mBackwardAnm); field_0x3478 = mpHIO->mWolf.mWlDamage.mNormal.m.mBackwardAnm.mCancelFrame; } else if (direction == DIR_LEFT) { setSingleAnimeWolfParam(WANM_DMG_LEFT, &mpHIO->mWolf.mWlDamage.mNormal.m.mLeftAnm); field_0x3478 = mpHIO->mWolf.mWlDamage.mNormal.m.mLeftAnm.mCancelFrame; } else { setSingleAnimeWolfParam(WANM_DMG_RIGHT, &mpHIO->mWolf.mWlDamage.mNormal.m.mRightAnm); field_0x3478 = mpHIO->mWolf.mWlDamage.mNormal.m.mRightAnm.mCancelFrame; } setFaceBasicTexture(FTANM_WL_DAM); current.angle.y = var_r30->atan2sX_Z(); mProcVar4.field_0x3010 = current.angle.y; mNormalSpeed = mpHIO->mWolf.mWlDamage.mNormal.m.mInitSpeed + (mpHIO->mWolf.mWlDamage.mNormal.m.mAttackSpeedRate * var_r30->absXZ()); if (mNormalSpeed > mpHIO->mWolf.mWlMove.m.mMaxSpeed) { mNormalSpeed = mpHIO->mWolf.mWlMove.m.mMaxSpeed; } field_0x3588 = l_wolfBaseAnime; if (i_hitObj == NULL || (i_hitObj->GetTgHitGObj() != NULL && i_hitObj->GetTgHitGObj()->GetAtMtrl() == dCcD_MTRL_ICE)) { mUnderFrameCtrl[0].setRate(mpHIO->mWolf.mWlDamage.mNormal.m.mIceDamageAnmSpeed); mUnderFrameCtrl[0].setEnd(3); mNormalSpeed = 0.0f; mProcVar0.field_0x3008 = 90; onNoResetFlg1(FLG1_FREEZE_DAMAGE); seStartOnlyReverb(Z2SE_AL_FREEZE); voiceStart(Z2SE_WL_V_DAMAGE_FREEZE); } else { mProcVar0.field_0x3008 = 0; seStartOnlyReverb(Z2SE_AL_DAMAGE_NORMAL); voiceStart(Z2SE_WL_V_DAMAGE); } mProcVar1.field_0x300a = 0; return 1; } int daAlink_c::procWolfDamage() { daPy_frameCtrl_c* frameCtrl_p = mUnderFrameCtrl; cLib_chaseF(&mNormalSpeed, 0.0f, mpHIO->mWolf.mWlDamage.mNormal.m.mDeceleration); field_0x2f99 = 5; if (checkFreezeDamage()) { freezeTimerDamage(); } if (checkAnmEnd(frameCtrl_p)) { current.angle.y = shape_angle.y; if (!checkFreezeDamage()) { checkNextActionWolf(0); } else if (mProcVar0.field_0x3008 == 0) { seStartOnlyReverb(Z2SE_AL_FREEZE_RECOVER); procWolfRollAttackInit(1, 2); onModeFlg(8); } } else if (frameCtrl_p->getFrame() > field_0x3478) { current.angle.y = shape_angle.y; if (!checkNextActionWolf(1)) { current.angle.y = mProcVar4.field_0x3010; } } return 1; } int daAlink_c::procWolfLargeDamageUpInit(int param_0, int param_1, s16 param_2, s16 param_3) { if (!commonProcInitNotSameProc(PROC_WOLF_LARGE_DAMAGE_UP)) { return 0; } const daAlinkHIO_wlDamLaHu_c1* anmParams; if (param_1 != 0) { anmParams = &mpHIO->mWolf.mWlDamage.mLarge.m; } else { anmParams = &mpHIO->mWolf.mWlDamage.mHuge.m; } field_0x3198 = 0; mProcVar2.field_0x300c = 0; mProcVar3.field_0x300e = 0; field_0x319c = param_0; mProcVar4.field_0x3010 = 0; mProcVar5.field_0x3012 = 0; f32 var_f31, var_f30, var_f29; daAlink_WANM anm; s16 var_r27; if (param_0 < 0) { if (param_0 == -3) { anm = WANM_DMG_AIR_FRONT_GETUP; var_f29 = 0.0f; var_r27 = -1; var_f30 = 5.0f; var_f31 = 1.0f; mProcVar0.field_0x3008 = -1; field_0x3478 = 36.0f; field_0x2f9d = 4; } else { if (param_0 == -2) { var_f30 = 0.0f; if (getMidnaActor() != NULL) { getMidnaActor()->onForceMorfCancel(); } if (mDemo.getDemoType() != daPy_demo_c::DEMO_TYPE_TOOL_e) { mProcVar5.field_0x3012 = 1; } } else { var_f30 = mpHIO->mWolf.mWlDamage.mLarge.m.mFrontRiseAnm.mInterpolation; } anm = WANM_DMG_AIR_FRONT_GETUP; var_f29 = 16.0f; var_r27 = -1; field_0x3478 = mpHIO->mWolf.mWlDamage.mLarge.m.mFrontRiseAnm.mCancelFrame; if (param_0 == -4) { onNoResetFlg2(FLG2_PRESSED_DAMAGE); mProcVar0.field_0x3008 = 0; var_f31 = 0.0f; } else if (param_0 == -5 && mDemo.getParam1() > 0) { mProcVar0.field_0x3008 = mDemo.getParam1(); var_f31 = 0.0f; } else if (param_0 == -2 && mDemo.getDemoType() == daPy_demo_c::DEMO_TYPE_TOOL_e) { mProcVar0.field_0x3008 = 0x1E; var_f31 = 0.0f; } else { mProcVar0.field_0x3008 = 1; var_f31 = mpHIO->mWolf.mWlDamage.m.mReturnWakeupAnmSpeed; } offModeFlg(0x10008000); mProcVar3.field_0x300e = 1; } mProcVar2.field_0x300c = 1; setSingleAnimeWolf(anm, var_f31, var_f29, var_r27, var_f30); setFaceBasicTexture(FTANM_WL_DAMFFBUP); field_0x347c = 9.0f; field_0x3484 = 13.0f; } 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 == 0x29) { setSingleAnimeWolfParam(WANM_DMG_AIR_BACK_GETUP, &anmParams->mBackRiseAnm); setFaceBasicTexture(FTANM_WL_DAMFFBUP); field_0x3478 = anmParams->mBackRiseAnm.mCancelFrame; field_0x347c = 16.0f; field_0x3198 = 1; field_0x3484 = 15.0; } else if (param_0 == 0x2A) { setSingleAnimeWolfParam(WANM_DMG_AIR_LEFT_GETUP, &anmParams->mLeftRiseAnm); setFaceBasicTexture(FTANM_WL_DAMFLRUP); field_0x3478 = anmParams->mLeftRiseAnm.mCancelFrame; field_0x347c = 11.0f; field_0x3484 = 13.0f; } else if (param_0 == 0x2B) { setSingleAnimeWolfParam(WANM_DMG_AIR_RIGHT_GETUP, &anmParams->mRightRiseAnm); setFaceBasicTexture(FTANM_WL_DAMFLRUP); field_0x3478 = anmParams->mRightRiseAnm.mCancelFrame; field_0x347c = 11.0f; field_0x3484 = 13.0f; } else { setSingleAnimeWolfParam(WANM_DMG_AIR_FRONT_GETUP, &anmParams->mFrontRiseAnm); setFaceBasicTexture(FTANM_WL_DAMFFBUP); field_0x3478 = anmParams->mFrontRiseAnm.mCancelFrame; field_0x347c = 9.0f; field_0x3484 = 13.0f; } if (param_1 != 0) { mProcVar4.field_0x3010 = 1; } } setOldRootQuaternion(param_2, 0, param_3); mNormalSpeed = 0.0f; current.angle.y = shape_angle.y; setFootEffectProcType(4); field_0x3588 = l_wolfBaseAnime; field_0x3480 = 1.0f / mUnderFrameCtrl[0].getEnd(); return 1; } int daAlink_c::procWolfLargeDamageUp() { daPy_frameCtrl_c* framectrl = &mUnderFrameCtrl[0]; mProcVar4.field_0x3010 = 0; if (mProcVar2.field_0x300c == 0) { field_0x2f99 = 5; } else { mProcVar2.field_0x300c = 0; } if (field_0x3198 != 0) { f32 temp_f31 = 2.0f * (0.5f - (field_0x3480 * framectrl->getFrame())); field_0x3588.x = l_wolfBaseAnime.x * temp_f31; field_0x3588.z = l_wolfBaseAnime.z * temp_f31; } if (field_0x319c == -4) { if (checkNoResetFlg2(FLG2_PRESSED_DAMAGE)) { return 1; } framectrl->setRate(mpHIO->mWolf.mWlDamage.mLarge.m.mFrontRiseAnm.mSpeed); } if (mProcVar0.field_0x3008 > 0) { mProcVar0.field_0x3008--; if (mProcVar0.field_0x3008 == 0) { mProcVar0.field_0x3008 = -1; framectrl->setRate(mpHIO->mWolf.mWlDamage.m.mReturnWakeupAnmSpeed); framectrl->offEndFlg(); } } else { if (mProcVar3.field_0x300e != 0 && framectrl->checkPass(24.0f)) { voiceStart(Z2SE_WL_V_RESTART); } if (framectrl->getFrame() > field_0x347c) { offModeFlg(0x8000); } if (checkAnmEnd(framectrl)) { if (mProcVar5.field_0x3012 != 0) { daMidna_c* midna = (daMidna_c*)getMidnaActor(); if (midna->checkDemoPortalWarpWait()) { midna->changeDemoMode(13); return procWolfMidnaRideShockInit(); } } if (mDemo.getDemoMode() == daPy_demo_c::DEMO_UNK_27_e || mDemo.getDemoMode() == daPy_demo_c::DEMO_UNK_9_e) { dComIfGp_evmng_cutEnd(mAlinkStaffId); } else { checkNextActionWolf(0); } } else if (framectrl->getFrame() > field_0x3478) { checkNextActionWolf(1); } else if (checkEndResetFlg1(ERFLG1_LARGE_DAMAGE_UP_STOP) && framectrl->getFrame() > field_0x3484) { framectrl->setFrame(field_0x3484); getNowAnmPackUnder(UNDER_0)->setFrame(field_0x3484); } } return 1; } int daAlink_c::procWolfLandDamageInit(int param_0) { f32 var_f31; if (param_0 == 2) { if (!checkEventRun()) { setLandDamagePoint(8); } var_f31 = mpHIO->mWolf.mWlDamage.mFall.m.mLandingAnm.mStartFrame; mProcVar0.field_0x3008 = mpHIO->mDamage.mDamFall.m.mBigStopTime; dComIfGp_getVibration().StartShock(5, 31, cXyz(0.0f, 1.0f, 0.0f)); } else { var_f31 = mpHIO->mWolf.mWlDamage.mFall.m.mSmallDamageLandingStartFrame; mProcVar0.field_0x3008 = mpHIO->mWolf.mWlDamage.mFall.m.mSmallStopTime; if (param_0 == 1) { if (!checkEventRun()) { setLandDamagePoint(4); } dComIfGp_getVibration().StartShock(4, 31, cXyz(0.0f, 1.0f, 0.0f)); } } commonProcInit(PROC_WOLF_LAND_DAMAGE); mNormalSpeed = 0.0f; if (param_0 == 0) { offModeFlg(8); } else { seStartOnlyReverb(JA_SE_LK_FALL_DAMAGE); voiceStart(Z2SE_WL_V_LAND_DAMAGE); } setSingleAnimeWolf(WANM_FALL_LAND, mpHIO->mWolf.mWlDamage.mFall.m.mLandingAnm.mSpeed, var_f31, mpHIO->mWolf.mWlDamage.mFall.m.mLandingAnm.mEndFrame, mpHIO->mWolf.mWlDamage.mFall.m.mLandingAnm.mInterpolation); setFaceBasicTexture(FTANM_WL_LANDDAMA); field_0x3198 = 0; field_0x2f9d = 4; setFootEffectProcType(4); return 1; } int daAlink_c::procWolfLandDamage() { daPy_frameCtrl_c* frameCtrl = mUnderFrameCtrl; if (field_0x3198 != 0) { if (checkAnmEnd(frameCtrl)) { checkNextActionWolf(0); } else if (frameCtrl->getFrame() > mpHIO->mWolf.mWlDamage.mFall.m.mRightRiseAnm.mCancelFrame) { checkNextActionWolf(1); } } else if (checkAnmEnd(frameCtrl)) { if (mProcVar0.field_0x3008 > 0) { mProcVar0.field_0x3008--; } else { setSingleAnimeWolfParam(WANM_FALL_LAND_START, &mpHIO->mWolf.mWlDamage.mFall.m.mRightRiseAnm); setFaceBasicTexture(FTANM_WL_LANDDAMAST); field_0x3198 = 1; } } return 1; } void daAlink_c::setWolfScreamWaitAnime() { setSingleAnimeWolfBase(WANM_WAIT_STUNNED); setFaceBasicTexture(FTANM_WL_B_A); voiceStart(Z2SE_WL_V_TERRORED); mProcVar2.field_0x300c = 1; dComIfGp_getVibration().StartQuake(5, 1, cXyz(0.0f, 1.0f, 0.0f)); } int daAlink_c::procWolfScreamWaitInit() { commonProcInit(PROC_WOLF_SCREAM_WAIT); if (checkEndResetFlg1(ERFLG1_UNK_2)) { setWolfScreamWaitAnime(); } else { setSingleAnimeWolfBaseSpeed(WANM_WAIT, mpHIO->mWolf.mWlMoveNoP.m.mIdleAnmSpeed, mpHIO->mWolf.mWlMove.m.mIdleInterpolation); mProcVar2.field_0x300c = 0; } mNormalSpeed = 0.0f; mProcVar3.field_0x300e = 0; field_0x3588 = l_wolfBaseAnime; return 1; } int daAlink_c::procWolfScreamWait() { daPy_frameCtrl_c* frameCtrl = mUnderFrameCtrl; if (!checkEndResetFlg1(ERFLG1_NS_SCREAM)) { if (mProcVar3.field_0x300e != 0) { field_0x2f99 = 5; if (checkAnmEnd(frameCtrl)) { checkNextActionWolf(0); } else if (frameCtrl->getFrame() > mpHIO->mWolf.mWlDamage.mLarge.m.mFrontRiseAnm.mCancelFrame) { checkNextActionWolf(1); } } else { mProcVar3.field_0x300e = 1; setSingleAnimeWolf(WANM_DMG_AIR_FRONT_GETUP, mpHIO->mWolf.mWlDamage.mLarge.m.mFrontRiseAnm.mSpeed, 20.0f, mpHIO->mWolf.mWlDamage.mLarge.m.mFrontRiseAnm.mEndFrame, mpHIO->mWolf.mWlDamage.mLarge.m.mFrontRiseAnm.mInterpolation); field_0x2f99 = 13; } } else if (mProcVar2.field_0x300c == 0 && checkEndResetFlg1(ERFLG1_UNK_2)) { setWolfScreamWaitAnime(); } return 1; } f32 daAlink_c::getWolfLieMoveAnmSpeed() { if (field_0x3198 != 0) { return getAnmSpeedStickRate(0.5f, 2.0f); } return getAnmSpeedStickRate(mpHIO->mWolf.mWlLie.m.mProneMinAnmSpeed, mpHIO->mWolf.mWlLie.m.mProneMaxAnmSpeed); } f32 daAlink_c::getWolfLieMoveSpeed() { daPy_frameCtrl_c* frameCtrl_p = mUnderFrameCtrl; f32 var_f1; if (frameCtrl_p->getFrame() >= 15.0f) { var_f1 = frameCtrl_p->getFrame() - 15.0f; } else { var_f1 = frameCtrl_p->getFrame(); } return mpHIO->mWolf.mWlLie.m.mProneMoveRate * frameCtrl_p->getRate() * cM_fsin(var_f1 * 0.20943952f); } BOOL daAlink_c::checkMidnaDisappearMode() const { return mProcID == PROC_WOLF_DIG_THROUGH || (checkWolf() && dComIfGp_checkPlayerStatus0(0, 0x8000000) && !dComIfGp_checkPlayerStatus0(0, 0x10) && !(mTargetedActor != NULL && mTargetedActor->attention_info.flags & fopAc_AttnFlag_UNK_0x800000)); } BOOL daAlink_c::checkWolfLieContinue(int param_0) { cM3dGPla slide_poly; if ((param_0 || ((mTargetedActor != NULL && (mTargetedActor->attention_info.flags & fopAc_AttnFlag_UNK_0x800000)) && (fopAcM_GetName(mTargetedActor) == fpcNm_NPC_JAGAR_e || fopAcM_GetName(mTargetedActor) == fpcNm_NPC_BOU_e))) && !getSlidePolygon(&slide_poly) && !checkWolfLieWaterIn()) { return true; } return false; } int daAlink_c::checkNextActionWolfFromLie() { if (checkNextActionWolf(0)) { if (field_0x2f8c == 1 || field_0x2f8c == 2 || field_0x2f8c == 3) { m_oldFrameCalc->initOldFrameMorf(mpHIO->mWolf.mWlLie.m.mStandUpInterp, 0, 40); } return true; } return false; } void daAlink_c::setWolfLieMoveVoice(int param_0) { daPy_frameCtrl_c* frameCtrl = mUnderFrameCtrl; if (frameCtrl->getRate() == 0.0f && mProcVar5.field_0x3012 != 0) { mProcVar5.field_0x3012--; } if ((param_0 != 0 && (frameCtrl->checkPass(11.0f) || frameCtrl->checkPass(26.0f))) || (frameCtrl->getRate() == 0.0f && mProcVar5.field_0x3012 == 0)) { voiceStart(Z2SE_WL_V_BREATH_WALK); mProcVar5.field_0x3012 = 30; } } bool daAlink_c::checkWolfLieCode() { if (mLinkAcch.ChkGroundHit() && mGndPolySpecialCode == 4) { return true; } return false; } int daAlink_c::procWolfLieStartInit(int param_0) { commonProcInit(PROC_WOLF_LIE_START); field_0x3588 = l_wolfBaseAnime; setSingleAnimeWolfParam(WANM_CROUCH, &mpHIO->mWolf.mWlLie.m.mProneStartAnm); if (param_0) { shape_angle.y = field_0x306e + 0x8000; current.pos.x = field_0x34ec.x + cM_ssin(field_0x306e) * 90.0f; current.pos.z = field_0x34ec.z + cM_scos(field_0x306e) * 90.0f; mProcVar4.field_0x3010 = 1; } else { mProcVar4.field_0x3010 = 0; } mNormalSpeed = 0.0f; current.angle.y = shape_angle.y; field_0x2f99 = 0; mProcVar5.field_0x3012 = 30; dComIfGp_setPlayerStatus0(0, 0x8000000); return 1; } int daAlink_c::procWolfLieStart() { daPy_frameCtrl_c* frameCtrl_p = mUnderFrameCtrl; decideCrawlDoStatus(); if (mProcVar4.field_0x3010 != 0) { if (checkAnmEnd(frameCtrl_p)) { procWolfLieMoveInit(1); } } else if (!checkWolfLieContinue(0)) { checkNextActionWolfFromLie(); } else if (checkInputOnR() && (checkAnmEnd(frameCtrl_p) || frameCtrl_p->getFrame() > mpHIO->mWolf.mWlLie.m.mProneStartAnm.mCancelFrame)) { procWolfLieMoveInit(0); } else { field_0x2f99 = 4; setWolfLieMoveVoice(0); setTalkStatus(); orderTalk(1); } return 1; } int daAlink_c::procWolfLieMoveInit(int param_0) { BOOL is_prev_talk = mProcID == PROC_TALK; BOOL is_no_crouchWalk = checkUnderMove0BckNoArcWolf(WANM_CROUCH_WALK) == FALSE; BOOL var_r28; if (dComIfGp_checkPlayerStatus0(0, 0x2000)) { var_r28 = TRUE; } else { var_r28 = FALSE; } if (!commonProcInitNotSameProc(PROC_WOLF_LIE_MOVE)) { return 0; } mProcVar3.field_0x300e = 0; if (!is_no_crouchWalk) { if (is_prev_talk) { is_no_crouchWalk = true; } else { onModeFlg(0x6000); } } else { f32 anm_speed = getWolfLieMoveAnmSpeed(); if (mDemo.getDemoMode() == daPy_demo_c::DEMO_UNK_44_e) { anm_speed = 0.0f; } else if (param_0) { mProcVar3.field_0x300e = 1; onModeFlg(0x6000); } else if (getDirectionFromShapeAngle() == DIR_BACKWARD) { anm_speed *= -1.0f; } current.angle.y = shape_angle.y; setSingleAnimeWolfBaseSpeed(WANM_CROUCH_WALK, anm_speed, mpHIO->mWolf.mWlLie.m.mProneMoveInterp); } field_0x3198 = is_no_crouchWalk ^ 1; mProcVar4.field_0x3010 = is_prev_talk; field_0x2f99 = 0xD; dComIfGp_setPlayerStatus0(0, 0x8000000); if (var_r28) { dComIfGp_setPlayerStatus0(0, 0x2000); } mProcVar5.field_0x3012 = 30; if (checkAttentionLock()) { field_0x2fe4 = shape_angle.y; } return 1; } int daAlink_c::procWolfLieMove() { daPy_frameCtrl_c* framectrl = &mUnderFrameCtrl[0]; cXyz sp64; cXyz sp58; cXyz sp4C; field_0x2f99 = 0xD; decideCrawlDoStatus(); cMtx_multVec(mpLinkModel->getBaseTRMtx(), &l_wolfLieStandUpOffset, &sp58); cMtx_multVec(mpLinkModel->getBaseTRMtx(), &l_wolfLieFrontUpOffset, &sp64); cMtx_multVec(mpLinkModel->getBaseTRMtx(), &l_wolfLieBackUpOffset, &sp4C); cXyz sp40; cXyz sp34; cMtx_multVecSR(mpLinkModel->getBaseTRMtx(), &l_crawlMinSideOffset, &sp34); BOOL sp18 = checkNotCrawlStand(&sp58); BOOL sp14 = checkNotCrawlStand(&sp64); BOOL sp10 = checkNotCrawlStand(&sp4C); int var_r28; if (sp18 || sp14 || sp10 || mDemo.getDemoMode() == 0x2C || checkNotCrawlStand(&sp64, &sp34) || checkNotCrawlStand(&sp4C, &sp34) || checkNotCrawlStand(&sp58, &sp34)) { var_r28 = 0; onModeFlg(0x04000000); } else { var_r28 = 1; offModeFlg(0x04000000); } if (mDemo.getDemoMode() == 0x2C) { dComIfGp_evmng_cutEnd(mAlinkStaffId); } cM3dGPla sp70; if (!checkWolfLieContinue(!var_r28 || mProcVar3.field_0x300e != 0 || mProcVar4.field_0x3010 != 0)) { checkNextActionWolfFromLie(); } else { mProcVar4.field_0x3010 = 0; int var_r27 = 0; f32 temp_f31 = getWolfLieMoveAnmSpeed(); if (framectrl->getRate() > 0.0f) { framectrl->setRate(temp_f31); } else if (framectrl->getRate() < 0.0f) { framectrl->setRate(-temp_f31); } else { var_r27 = 1; } if (var_r27 == 1 || framectrl->checkPass(0.0f) || framectrl->checkPass(15.0f)) { if (mProcVar3.field_0x300e != 0) { mProcVar3.field_0x300e--; framectrl->setRate(temp_f31); framectrl->setLoop(0); } else if (checkInputOnR()) { if (getDirectionFromShapeAngle() != 1) { framectrl->setRate(temp_f31); framectrl->setLoop(0); } else { framectrl->setRate(-temp_f31); framectrl->setLoop(framectrl->getEnd()); } initBasAnime(); } else if (var_r27 == 0) { stopHalfMoveAnime(15.0f); } } setWolfLieMoveVoice(1); int spC = field_0x3198; s16 spA; cXyz sp28; field_0x3198 = 0; if (checkCrawlInHoll(&sp64, &sp4C, &sp28, var_r28)) { setCrawlMoveHoll(); } else if (spC && sp18 && sp14 && sp10 && var_r28 == 0 && changeCrawlAutoMoveProc(&sp28)) { return 1; } else if (mProcVar3.field_0x300e == 0 && checkInputOnR()) { if (getWolfLieMoveSpeed() >= 0.0f) { spA = mMoveAngle; } else { spA = mMoveAngle + 0x8000; } cLib_addCalcAngleS(&shape_angle.y, spA, mpHIO->mWolf.mWlLie.m.mProneTurnRate, mpHIO->mWolf.mWlLie.m.mProneTurnMax, mpHIO->mWolf.mWlLie.m.mProneTurnMin); } mNormalSpeed = getWolfLieMoveSpeed(); cXyz sp1C; if (mNormalSpeed < 0.0f) { mNormalSpeed *= -1.0f; current.angle.y = shape_angle.y + 0x8000; } else { current.angle.y = shape_angle.y; } if (field_0x3198 != 0) { onModeFlg(0x6000); } else { offModeFlg(0x6000); } if (checkAttentionLock()) { field_0x2fe4 = shape_angle.y; } setTalkStatus(); orderTalk(1); } return 1; } int daAlink_c::procWolfLieAutoMoveInit(int param_0, cXyz* param_1) { BOOL var_r30; if (dComIfGp_checkPlayerStatus0(0, 0x2000)) { var_r30 = TRUE; } else { var_r30 = FALSE; } commonProcInit(PROC_WOLF_LIE_AUTO_MOVE); field_0x37c8 = *param_1; field_0x3198 = param_0; mProcVar0.field_0x3008 = 20; mProcVar1.field_0x300a = 300; setCrawlMoveDirectionArrow(); mNormalSpeed = 0.0f; field_0x2f99 = 13; dComIfGp_setPlayerStatus0(0, 0x8000000); if (var_r30) { dComIfGp_setPlayerStatus0(0, 0x2000); } mProcVar5.field_0x3012 = 30; return 1; } int daAlink_c::procWolfLieAutoMove() { field_0x2f99 = 0xD; daPy_frameCtrl_c* framectrl = &mUnderFrameCtrl[0]; s16 temp_r27 = shape_angle.y; s16 temp_r26 = current.angle.y; setWolfLieMoveVoice(1); if (mProcVar0.field_0x3008 > 0) { if (framectrl->checkPass(0.0f) || framectrl->checkPass(15.0f)) { stopHalfMoveAnime(15.0f); mNormalSpeed = 0.0f; } else if (checkAnmEnd(framectrl)) { mNormalSpeed = 0.0f; mProcVar0.field_0x3008--; } 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) { framectrl->setRate(2.0f); framectrl->setLoop(0); } else { framectrl->setRate(-2.0f); framectrl->setLoop(framectrl->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 = getWolfLieMoveSpeed(); if (mNormalSpeed < 0.0f) { mNormalSpeed *= -1.0f; current.angle.y = shape_angle.y + 0x8000; } if (var_r28 != 0 || mProcVar1.field_0x300a == 0) { procWolfLieMoveInit(0); } } mCameraAngleY = shape_angle.y; return 1; } void daAlink_c::setSpeedAndAngleSwimWolf() { if (checkWolfDashMode()) { mMaxSpeed = mpHIO->mWolf.mWlSwim.m.mMaxSpeed; } else { mMaxSpeed = mpHIO->mWolf.mWlSwim.m.mMaxSpeedWeak; } f32 speed; s16 prev_angle; if (checkInputOnR()) { prev_angle = current.angle.y; cLib_addCalcAngleS(¤t.angle.y, mMoveAngle, mpHIO->mWolf.mWlSwim.m.mTurnRate, mpHIO->mWolf.mWlSwim.m.mTurnMax, mpHIO->mWolf.mWlSwim.m.mTurnMin); speed = mStickValue * 3.0f * cM_scos(current.angle.y - prev_angle); shape_angle.y = current.angle.y; } else { speed = 0.0f; } if (checkWolfSwimDashAnime()) { speed = 3.0f; } if (checkAttentionState() && mProcID == PROC_WOLF_SWIM_WAIT) { if (mTargetedActor != NULL) { setShapeAngleToAtnActor(0); } else { cLib_addCalcAngleS(&shape_angle.y, field_0x2fe4, mpHIO->mWolf.mWlSwim.m.mIdleTurnRate, mpHIO->mWolf.mWlSwim.m.mIdleTurnMax, mpHIO->mWolf.mWlSwim.m.mIdleTurnMin); } current.angle.y = shape_angle.y; } setNormalSpeedF(speed, mpHIO->mWolf.mWlSwim.m.mDeceleration); if (dComIfGp_checkPlayerStatus0(0, 0x10)) { mNormalSpeed = 0.0f; } } f32 daAlink_c::getWolfSwimMoveAnmSpeed() { f32 anm_speed = fabsf(mNormalSpeed) / mMaxSpeed; if (anm_speed > 1.0f) { anm_speed = 1.0f; } if (checkWolfDashMode()) { return mpHIO->mWolf.mWlSwim.m.mMoveMinAnmSpeed + anm_speed * (mpHIO->mWolf.mWlSwim.m.mMoveMaxAnmSpeed - mpHIO->mWolf.mWlSwim.m.mMoveMinAnmSpeed); } else { return mpHIO->mWolf.mWlSwim.m.mMoveMinAnmSpeedWeak + anm_speed * (mpHIO->mWolf.mWlSwim.m.mMoveMaxAnmSpeedWeak - mpHIO->mWolf.mWlSwim.m.mMoveMinAnmSpeedWeak); } } int daAlink_c::decideDoStatusSwimWolf() { setTalkStatus(); if (orderTalk(1)) { return 1; } if (mPriActorOwn != NULL && fopAcM_GetName(mPriActorOwn) == fpcNm_Obj_Drop_e) { setDoStatus(BUTTON_STATUS_UNK_57); if (doTrigger()) { fopAcM_setCarryNow(mPriActorOwn, 0); onResetFlg0(RFLG0_GRAB_UP_START); } } else if (checkNoResetFlg0(FLG0_SWIM_UP) && field_0x30d2 == 0 && !checkWolfSwimDashAnime() && mProcID == PROC_WOLF_SWIM_MOVE) { setDoStatus(BUTTON_STATUS_DASH); if (doTrigger()) { onNoResetFlg1(FLG1_DASH_MODE); if (field_0x2fc7 == 1 || field_0x2fc7 == 3) { field_0x30d0 = mpHIO->mWolf.mWlMove.m.mADashDurationSlow; } else if (field_0x2fc7 == 2) { field_0x30d0 = mpHIO->mWolf.mWlMove.m.mADashDurationSlow2; } else { field_0x30d0 = mpHIO->mWolf.mWlMove.m.mADashDuration; } setSingleAnimeWolfParam(WANM_SWIM_DASH, &mpHIO->mWolf.mWlSwim.m.mDashAnm); } } if (checkWolfSwimDashAnime() && mUnderFrameCtrl[0].checkPass(7.0f)) { cXyz pillar_pos(current.pos.x + cM_ssin(shape_angle.y) * 60.0f, current.pos.y, current.pos.z + cM_scos(shape_angle.y) * 60.0f); fopKyM_createWpillar(&pillar_pos, 0.75f, 0); } return 0; } int daAlink_c::procWolfSwimUpInit() { commonProcInit(PROC_WOLF_SWIM_UP); speed.y = 0.0f; current.pos.y = mWaterY; onNoResetFlg0(FLG0_SWIM_UP); mZ2Link.setInWater(false); setSingleAnimeWolfParam(WANM_SWIM_RESURFACE, &mpHIO->mWolf.mWlSwim.m.mSurfacingAnm); setFaceBasicTexture(FTANM_WL_SWIMP); dComIfGp_setPlayerStatus0(0, 0x100000); seStartMapInfo(Z2SE_WL_OUTOF_WATER); mProcVar5.field_0x3012 = 1; return 1; } int daAlink_c::procWolfSwimUp() { daPy_frameCtrl_c* frameCtrl = mUnderFrameCtrl; setNormalSpeedF(0.0f, mpHIO->mWolf.mWlSwim.m.mDeceleration); if (checkAnmEnd(frameCtrl)) { procWolfSwimWaitInit(0); } else if (checkInputOnR() && frameCtrl->getFrame() > mpHIO->mWolf.mWlSwim.m.mSurfacingAnm.mCancelFrame) { procWolfSwimMoveInit(); } else { current.pos.y = mWaterY; } return 1; } int daAlink_c::procWolfSwimWaitInit(int param_0) { f32 morf; if (mProcID == PROC_WOLF_SWIM_UP) { morf = 0.0f; } else { morf = mpHIO->mWolf.mWlSwim.m.mIdleInterp; } commonProcInit(PROC_WOLF_SWIM_WAIT); if (param_0) { seStartMapInfo(Z2SE_WL_INTO_WATER); mProcVar4.field_0x3010 = 0; mProcVar5.field_0x3012 = 1; } else { mProcVar5.field_0x3012 = 0; } f32 anm_speed; if (checkWolfDashMode()) { anm_speed = mpHIO->mWolf.mWlSwim.m.mIdleAnmSpeed; } else { anm_speed = mpHIO->mWolf.mWlSwim.m.mIdleAnmSpeedWeak; } setSingleAnimeWolfBaseSpeed(WANM_SWIM_WAIT, anm_speed, morf); dComIfGp_setPlayerStatus0(0, 0x100000); if (checkNoResetFlg0(FLG0_SWIM_UP)) { current.pos.y = mWaterY; speed.y = 0.0f; } mProcVar2.field_0x300c = 0; return 1; } int daAlink_c::procWolfSwimWait() { if (mDemo.getDemoMode() == daPy_demo_c::DEMO_UNK_6_e || mDemo.getDemoMode() == daPy_demo_c::DEMO_UNK_8_e) { setShapeAngleToTalkActor(); current.angle.y = shape_angle.y; } setSpeedAndAngleSwimWolf(); setSwimUpDownOffset(); if (checkWolfDashMode()) { mUnderFrameCtrl[0].setRate(mpHIO->mWolf.mWlSwim.m.mIdleAnmSpeed); } else { mUnderFrameCtrl[0].setRate(mpHIO->mWolf.mWlSwim.m.mIdleAnmSpeedWeak); } if (checkSwimUpAction()) { return 1; } if (decideDoStatusSwimWolf()) { return 1; } if (checkInputOnR()) { procWolfSwimMoveInit(); } return 1; } int daAlink_c::procWolfSwimMoveInit() { commonProcInit(PROC_WOLF_SWIM_MOVE); setSingleAnimeWolfBaseSpeed(WANM_SWIM, getWolfSwimMoveAnmSpeed(), mpHIO->mWolf.mWlSwim.m.mMoveInterp); if (checkNoResetFlg0(FLG0_SWIM_UP)) { current.pos.y = mWaterY; speed.y = 0.0f; } dComIfGp_setPlayerStatus0(0, 0x100000); return 1; } int daAlink_c::procWolfSwimMove() { setSpeedAndAngleSwimWolf(); daPy_frameCtrl_c* framectrl = mUnderFrameCtrl; if (!checkWolfSwimDashAnime()) { framectrl->setRate(getWolfSwimMoveAnmSpeed()); } if (checkSwimUpAction()) { return 1; } if (decideDoStatusSwimWolf()) { return 1; } if (checkAnmEnd(mUnderFrameCtrl) && checkWolfSwimDashAnime()) { setSingleAnimeWolfBaseSpeed(WANM_SWIM, getWolfSwimMoveAnmSpeed(), mpHIO->mWolf.mWlSwim.m.mMoveInterp); if (field_0x2fc7 == 1 || field_0x2fc7 == 3) { field_0x30d2 = mpHIO->mWolf.mWlMove.m.mADashCooldownTimeSlow; } else if (field_0x2fc7 == 2) { field_0x30d2 = mpHIO->mWolf.mWlMove.m.mADashCooldownTimeSlow2; } else { field_0x30d2 = mpHIO->mWolf.mWlMove.m.mADashCooldownTime; } } if (checkFrontWallTypeAction()) { swimOutAfter(1); return 1; } if (!checkInputOnR() && !checkWolfSwimDashAnime()) { procWolfSwimWaitInit(0); } return 1; } int daAlink_c::procWolfSwimEndWaitInit(int param_0) { commonProcInit(PROC_WOLF_SWIM_END_WAIT); setSingleAnimeWolfParam(WANM_WAIT_SHAKE, &mpHIO->mWolf.mWlSwim.m.mWaterSplashIdleAnm); setFaceBasicTexture(FTANM_WL_SWAITB); mDoMtx_multVecZero(mpLinkModel->getAnmMtx(3), &field_0x37c8); if (param_0 == 0) { mProcVar3.field_0x300e = 0; } else if (mGndPolyAtt0 == 13) { mProcVar3.field_0x300e = 2; } else { mProcVar3.field_0x300e = 1; } JPABaseEmitter* spC = NULL; JPABaseEmitter* sp8 = NULL; field_0x32cc = 0; if (param_0 != 0) { field_0x31bc = 0; } else { for (int i = 0; i < 2; i++) { field_0x32c0[i] = 0; } } setWolfSwimEndEffect(&spC, &sp8); mProcVar2.field_0x300c = param_0; return 1; } int daAlink_c::procWolfSwimEndWait() { daPy_frameCtrl_c* frameCtrl_p = mUnderFrameCtrl; mDoMtx_multVecZero(mpLinkModel->getAnmMtx(3), &field_0x37c8); if (frameCtrl_p->checkPass(6.0f)) { if (mProcVar2.field_0x300c == 0) { seStartOnlyReverb(Z2SE_WOLF_WIPE_OFF_WATER); } else { seStartOnlyReverb(Z2SE_WOLF_WIPE_OFF_DUST); } } JPABaseEmitter* spC = NULL; JPABaseEmitter* sp8 = NULL; setWolfSwimEndEffect(&spC, &sp8); if (checkAnmEnd(frameCtrl_p)) { checkNextActionWolf(0); } else if (frameCtrl_p->getFrame() > mpHIO->mWolf.mWlSwim.m.mWaterSplashIdleAnm.mCancelFrame) { checkNextActionWolf(1); } if (mProcID != PROC_WOLF_SWIM_END_WAIT) { if (spC != NULL) { spC->stopDrawParticle(); } if (sp8 != NULL) { sp8->stopDrawParticle(); } } return 1; } bool daAlink_c::onWolfEnemyBiteAll(fopAc_ac_c* i_enemy, daPy_py_c::daPy_FLG2 i_flag) { if (field_0x281c.getActor() != NULL) { return 0; } if (i_flag == FLG2_UNK_8) { if (mCutType != CUT_TYPE_WOLF_B_LEFT && mCutType != CUT_TYPE_WOLF_B_RIGHT && mCutType != CUT_TYPE_WOLF_JUMP_S && mCutType != CUT_TYPE_WOLF_JUMP && mCutType != CUT_TYPE_WOLF_JUMP_S_FINISH) { return 0; } } else if (mCutType != CUT_TYPE_WOLF_JUMP) { return 0; } onNoResetFlg2(i_flag); field_0x281c.setData(i_enemy); return 1; } void daAlink_c::resetWolfEnemyBiteAll() { field_0x281c.clearData(); offNoResetFlg2(daPy_FLG2(FLG2_WOLF_ENEMY_HANG_BITE | FLG2_UNK_10 | FLG2_UNK_8)); } void daAlink_c::checkWolfEnemyThrowAction() { daPy_frameCtrl_c* frameCtrl = &mUpperFrameCtrl[2]; if (checkAnmEnd(frameCtrl)) { resetUpperAnime(UPPER_2, 3.0f); } else if (frameCtrl->checkPass(17.0f)) { resetWolfEnemyBiteAll(); } } void daAlink_c::setWolfLockDomeModel() { JKRHeap* prev_heap = setItemHeap(); mHeldItemModel = initModel(loadAramBmd(dRes_ID_ALANM_BMD_S_BALL_YAMI_e, 0x1C00), 0x200); field_0x0718 = loadAramItemBtk(dRes_ID_ALANM_BTK_S_BALL_YAMI_e, mHeldItemModel); field_0x0724 = loadAramItemBrk(dRes_ID_ALANM_BRK_S_BALL_YAMI_e, mHeldItemModel); mDoExt_setCurrentHeap(prev_heap); mEquipItem = 0x109; mItemVar0.field_0x3018 = 0; mSearchBallScale = mpHIO->mWolf.mWlAttack.mWlAtLock.m.mStartRadius; dComIfGp_setPlayerStatus1(0, 0x800000); seStartOnlyReverb(Z2SE_MIDNA_BIND_AREA_OPEN); if (dKy_darkworld_check()) { field_0x0724->setFrame(1.0f); } else { field_0x0724->setFrame(0.0f); } } void daAlink_c::setWolfBallModel() { JKRHeap* prev_heap = setItemHeap(); mHeldItemModel = initModel(static_cast(dComIfG_getObjectRes(l_arcName, 0x25)), 0x200); field_0x0718 = static_cast(dComIfG_getObjectRes(l_arcName, 0x49)); field_0x0718->searchUpdateMaterialID(mHeldItemModel->getModelData()); mpHookSound = new Z2SoundObjSimple(); mDoExt_setCurrentHeap(prev_heap); mEquipItem = 0x10A; field_0x33dc = 0.0f; mDoMtx_multVecZero(mpLinkModel->getAnmMtx(6), &mHeldItemRootPos); mIronBallCenterPos = mHeldItemRootPos; mHookshotTopPos = mHeldItemRootPos; field_0x2f38.setOldPosP(&mHookshotTopPos, &mIronBallCenterPos); field_0x32d4 = 0; mpHookSound->init(&mHeldItemRootPos, 1); } void daAlink_c::resetWolfBallGrab() { if (mEquipItem == 0x10A) { seStartOnlyReverb(Z2SE_OBJ_POU_SOUL_BREAK); deleteEquipItem(FALSE, FALSE); if (checkWolfGrabAnimeObj()) { resetUpperAnime(UPPER_2, 3.0f); } dComIfGp_particle_setColor(dPa_RM(ID_ZI_S_ID_SETC_A), &mHeldItemRootPos, &tevStr, NULL, NULL, 0.0f, 0xFF); dComIfGp_particle_setColor(dPa_RM(ID_ZI_S_ID_SETC_B), &mHeldItemRootPos, &tevStr, NULL, NULL, 0.0f, 0xFF); onEndResetFlg0(ERFLG0_UNK_20000000); offNoResetFlg3(FLG3_UNK_200000); } } void daAlink_c::checkWolfLockData() { int i; int var_r29; for (i = 0; i < 10; i++) { mWolfLockAcKeep[i].setActor(); } for (i = 0; i < mWolfLockNum; i++) { if (mWolfLockAcKeep[i].getActor() == NULL) { for (var_r29 = i; var_r29 < mWolfLockNum - 1; var_r29++) { mWolfLockAcKeep[var_r29].setData(mWolfLockAcKeep[var_r29 + 1].getActor()); } mWolfLockAcKeep[var_r29].clearData(); i--; mWolfLockNum--; } } } BOOL daAlink_c::checkWolfLock(fopAc_ac_c* i_actor) const { fpc_ProcID actor_id = fopAcM_GetID(i_actor); for (int i = 0; i < mWolfLockNum; i++) { if (actor_id == mWolfLockAcKeep[i].getID()) { return true; } } return false; } bool daAlink_c::cancelWolfLock(fopAc_ac_c* i_actor) { fpc_ProcID actor_id = fopAcM_GetID(i_actor); for (int i = 0; i < mWolfLockNum; i++) { if (actor_id == mWolfLockAcKeep[i].getID()) { mWolfLockAcKeep[i].clearData(); return true; } } return false; } fopAc_ac_c* daAlink_c::getWolfLockActorEnd() { return mWolfLockAcKeep[0].getActor(); } void daAlink_c::searchWolfLockEnemy(fopAc_ac_c* i_actor, void* i_data) { for (int i = 0; i < mWolfLockNum; i++) { if (mWolfLockAcKeep[i].getActor() == i_actor) { return; } } if (fopAcM_GetGroup(i_actor) == fopAc_ENEMY_e && i_actor->attention_info.flags & (fopAc_AttnFlag_BATTLE_e | fopAc_AttnFlag_LOCK_e) && !((fopEn_enemy_c*)i_actor)->checkWolfNoLock()) { f32 enemy_dist2 = current.pos.abs2(i_actor->eyePos); if (i_actor->eyePos.y >= current.pos.y - 50.0f && enemy_dist2 < field_0x3478) { field_0x3478 = enemy_dist2; fopAc_ac_c** lock_actor_pp = (fopAc_ac_c**)i_data; *lock_actor_pp = i_actor; } } } static int daAlink_searchWolfLockEnemy(fopAc_ac_c* i_actor, void* i_data) { daAlink_getAlinkActorClass()->searchWolfLockEnemy(i_actor, i_data); return 0; } void daAlink_c::checkWolfComboCnt() { if (!dComIfGp_checkPlayerStatus1(0, 0x1000000)) { if (mComboCutCount == 2 && checkAttentionLock() && (mAtCyl.ChkAtHit() #if DEBUG || mpHIO->mCut.m.mForceHitCombo #endif ) ) { onNoResetFlg0(FLG0_UNK_8000); } if (field_0x307e > 0) { field_0x307e--; } else { resetCombo(TRUE); } } } BOOL daAlink_c::checkWolfAttackAction() { static int const normalType0[] = {3, 3, 3, 0, 0}; static int const normalType1[] = {0, 0, 0, 3, 3}; if (mComboCutCount == 4) { resetCombo(TRUE); } mComboCutCount++; int atk_direction = getCutDirection(); if (checkWolfDashMode()) { mComboCutCount = 4; return procWolfJumpAttackInit(0); } else if (checkNoResetFlg0(FLG0_UNK_8000)) { if (mComboCutCount == 4) { if (atk_direction == DIR_NONE) { return procWolfWaitAttackInit(2); } else if (atk_direction == DIR_FORWARD || atk_direction == DIR_LEFT) { return procWolfJumpAttackInit(0); } else { return procWolfRollAttackInit(1, 0); } } else if (atk_direction == DIR_RIGHT || atk_direction == DIR_BACKWARD) { return procWolfWaitAttackInit(2); } else { return procWolfJumpAttackInit(2); } } else if (mComboCutCount == 4) { if (mTargetedActor == NULL) { if (atk_direction == DIR_LEFT || atk_direction == DIR_NONE) { return procWolfWaitAttackInit(2); } else { return procWolfJumpAttackInit(0); } } else if (atk_direction == DIR_LEFT) { return procWolfRollAttackInit(0, 0); } else if (atk_direction == DIR_RIGHT) { return procWolfRollAttackInit(1, 0); } else if (atk_direction == DIR_FORWARD) { return procWolfJumpAttackInit(0); } else { return procWolfJumpAttackInit(2); } } else if (mComboCutCount == 2) { return procWolfWaitAttackInit(normalType0[atk_direction]); } else if (mComboCutCount == 1 && atk_direction == DIR_FORWARD) { return procWolfJumpAttackInit(0); } else { return procWolfWaitAttackInit(normalType1[atk_direction]); } } void daAlink_c::setWolfEnemyThrowUpperAnime(daAlink_c::daAlink_WANM i_anmID, f32 param_1) { setUpperAnime( i_anmID == WANM_FLING_LEFT ? (u16)dRes_ID_ALANM_BCK_WL_FLINGNECKL_e : (u16)dRes_ID_ALANM_BCK_WL_FLINGNECKR_e, UPPER_2, // Fakematch, should be // mpHIO->mWolf.mWlAttack.mWlAtBite.m.mEnemyBiteThrowAnmSpeed, #if DEBUG mpHIO->mWolf.mWlAttack.mWlAtBite.m.mEnemyBiteThrowAnmSpeed, #else daAlinkHIO_wlAtBite_c0::m.mEnemyBiteThrowAnmSpeed, #endif param_1, -1, -1.0f ); } BOOL daAlink_c::setWolfEnemyHangBitePos(fopEn_enemy_c* i_enemy) { if (i_enemy != NULL) { cXyz old_pos = current.pos = i_enemy->getDownPos(); current.pos.x -= 60.0f * cM_ssin(shape_angle.y); current.pos.y -= 135.0f; current.pos.z -= 60.0f * cM_scos(shape_angle.y); if (commonLineCheck(&field_0x3540, ¤t.pos)) { current.pos = old_pos; return FALSE; } else { return TRUE; } } return FALSE; } static cXyz l_wolfBiteHitMarkScale(0.5f, 0.5f, 0.5f); void daAlink_c::setWolfBiteDamage(fopEn_enemy_c* i_enemy) { i_enemy->onWolfBiteDamage(); cXyz pos; mDoMtx_multVecZero(mpLinkModel->getAnmMtx(13), &pos); dComIfGp_setHitMark(1, i_enemy, &pos, &shape_angle, (cXyz*)&l_wolfBiteHitMarkScale, 0); dComIfGp_getVibration().StartShock(3, 31, cXyz(0.0f, 1.0f, 0.0f)); } BOOL daAlink_c::checkWolfLockAttackChargeState() { return checkMidnaRide() && checkMidnaChargeAttack() && !daMidna_c::checkMidnaTired() && daMidna_c::checkMidnaRealBody(); } int daAlink_c::procWolfRollAttackChargeInit() { commonProcInit(PROC_WOLF_ROLL_ATTACK_CHARGE); setSingleAnimeWolfBaseSpeed(WANM_CUT_TURN_CHARGE, 0.0f, mpHIO->mWolf.mWlAttack.m.mReadyInterpolation); voiceStartLevel(Z2SE_WL_V_ROAR); return 1; } int daAlink_c::procWolfRollAttackCharge() { if (checkWolfGroundSpecialMode()) { return 1; } #if PLATFORM_GCN if (!itemButtonCheck(BTN_B)) { checkWolfAttackAction(); } else #endif if (m_oldFrameCalc->getOldFrameRate() < 0.1f) { procWolfRollAttackMoveInit(); } else { cLib_chaseF(&mNormalSpeed, 0.0f, mpHIO->mWolf.mWlMoveNoP.m.mDeceleration); setShapeAngleToAtnActor(0); current.angle.y = shape_angle.y; voiceStartLevel(Z2SE_WL_V_ROAR); } return 1; } int daAlink_c::procWolfRollAttackMoveInit() { commonProcInit(PROC_WOLF_ROLL_ATTACK_MOVE); if (checkZeroSpeedF()) { onModeFlg(1); } mProcVar0.field_0x3008 = mpHIO->mWolf.mWlAttack.m.mChargeTime; mProcVar1.field_0x300a = mpHIO->mWolf.mWlAttack.mWlAtLock.m.mAutoActivationTime; mProcVar5.field_0x3012 = 30; field_0x3198 = 0; field_0x2fe4 = shape_angle.y; voiceStartLevel(Z2SE_WL_V_ROAR); dComIfGp_setPlayerStatus0(0, 0x40000000); return 1; } int daAlink_c::procWolfRollAttackMove() { daPy_frameCtrl_c* frameCtrl_p = mUnderFrameCtrl; if (checkWolfGroundSpecialMode()) { return 1; } if (!swordButton() || mProcVar1.field_0x300a == 0) { if (mTargetedActor != NULL) { shape_angle.y = cLib_targetAngleY(¤t.pos, &mTargetedActor->eyePos); current.angle.y = shape_angle.y; } if (mProcVar0.field_0x3008 == 0) { if (mWolfLockNum != 0) { resetCombo(TRUE); return procWolfLockAttackInit(0); } else { return procWolfRollAttackInit(1, 0); } } return checkWolfAttackAction(); } if (mProcVar0.field_0x3008 != 0) { mProcVar0.field_0x3008--; if (mProcVar0.field_0x3008 == 0 && checkWolfLockAttackChargeState()) { setWolfLockDomeModel(); } } else { onResetFlg0(RFLG0_UNK_10); if (mEquipItem == 0x109) { seStartOnlyReverbLevel(Z2SE_MIDNA_BIND_AREA_SUS); mProcVar1.field_0x300a--; if (mSearchBallScale < mpHIO->mWolf.mWlAttack.mWlAtLock.m.mMaxRadius && cLib_chaseF(&mSearchBallScale, mpHIO->mWolf.mWlAttack.mWlAtLock.m.mMaxRadius, mpHIO->mWolf.mWlAttack.mWlAtLock.m.mRadiusAcceleration)) { mItemVar0.field_0x3018 = 1; } if (mWolfLockNum < 10) { field_0x3478 = mSearchBallScale * mSearchBallScale; fopAc_ac_c* lock_actor_p = NULL; fopAcIt_Executor((fopAcIt_ExecutorFunc)daAlink_searchWolfLockEnemy, &lock_actor_p); if (lock_actor_p != NULL) { for (int i = mWolfLockNum - 1; i >= 0; i--) { mWolfLockAcKeep[i + 1].setData(mWolfLockAcKeep[i].getActor()); } mWolfLockAcKeep[0].setData(lock_actor_p); mWolfLockNum++; } } } } voiceStartLevel(Z2SE_WL_V_ROAR); BOOL var_r28 = FALSE; f32 anm_speed = getWolfLieMoveAnmSpeed(); if (frameCtrl_p->getRate() > 0.0f) { frameCtrl_p->setRate(anm_speed); } else if (frameCtrl_p->getRate() < 0.0f) { frameCtrl_p->setRate(-anm_speed); } else { var_r28 = TRUE; } setWolfAtnMoveDirection(); if (var_r28 == TRUE || frameCtrl_p->checkPass(0.0f) || frameCtrl_p->checkPass(15.0f)) { if (checkInputOnR()) { if (field_0x2f98 != 1) { frameCtrl_p->setRate(anm_speed); frameCtrl_p->setLoop(0); } else { frameCtrl_p->setRate(-anm_speed); frameCtrl_p->setLoop(frameCtrl_p->getEnd()); } initBasAnime(); } else if (!var_r28) { stopHalfMoveAnime(15.0f); } } setSpeedAndAngleWolfAtn(); mNormalSpeed = getWolfLieMoveSpeed(); if (mNormalSpeed < 0.0f) { mNormalSpeed *= -1.0f; } if (checkZeroSpeedF()) { onModeFlg(1); } else { offModeFlg(1); } return 1; } int daAlink_c::procWolfJumpAttackInit(int param_0) { commonProcInit(PROC_WOLF_JUMP_ATTACK); mProcVar0.field_0x3008 = 0; f32 max_vertical_speed; f32 min_vertical_speed; f32 min_horizontal_speed; f32 attack_init_speed; f32 var_f30; f32 var_f29; if (param_0 == 1) { setCutType(CUT_TYPE_WOLF_JUMP); setCylAtParam(AT_TYPE_WOLF_ATTACK, dCcG_At_Spl_UNK_1, 3, dCcD_SE_WOLF_BITE, 3, mpHIO->mWolf.mWlAttack.mWlAtCjump.m.mAttackRadius, mpHIO->mWolf.mWlAttack.mWlAtCjump.m.mAttackHeight); mMaxSpeed = mpHIO->mWolf.mWlAttack.mWlAtCjump.m.mMaxHorizontalSpeed; max_vertical_speed = mpHIO->mWolf.mWlAttack.mWlAtCjump.m.mMaxVerticalSpeed; if (mTargetedActor != NULL) { min_vertical_speed = mpHIO->mWolf.mWlAttack.mWlAtCjump.m.mMinVerticalSpeed; attack_init_speed = mpHIO->mWolf.mWlAttack.mWlAtCjump.m.mAttackInitSpeed; } else { min_vertical_speed = 25.0f; attack_init_speed = 26.0f; } min_horizontal_speed = mpHIO->mWolf.mWlAttack.mWlAtCjump.m.mMinHorizontalSpeed; field_0x3438 = mpHIO->mWolf.mWlAttack.mWlAtCjump.m.mAttackRadiusOffset; voiceStart(Z2SE_WL_V_ATTACK_L); seStartOnlyReverb(Z2SE_WOLFATTACK_WIND_SCREW); if (!dComIfGs_isEventBit(dSv_event_flag_c::M_010) && checkStageName("R_SP30")) { mProcVar0.field_0x3008 = 1; } if (mTargetedActor != NULL) { mProcVar5.field_0x3012 = 1; } else { mProcVar5.field_0x3012 = 0; } mProcVar4.field_0x3010 = 1; } else { if (mComboCutCount == 4) { setCutType(CUT_TYPE_WOLF_JUMP_S_FINISH); setCylAtParam(AT_TYPE_WOLF_ATTACK, dCcG_At_Spl_UNK_1, 3, dCcD_SE_WOLF_BITE, 3, mpHIO->mWolf.mWlAttack.mWlAtNjump.m.mAttackRadius, mpHIO->mWolf.mWlAttack.mWlAtNjump.m.mAttackHeight); voiceStart(Z2SE_WL_V_ATTACK_L); seStartOnlyReverb(Z2SE_WOLFATTACK_WIND_SCREW); mProcVar5.field_0x3012 = 1; } else { setCutType(CUT_TYPE_WOLF_JUMP_S); setCylAtParam(AT_TYPE_WOLF_ATTACK, dCcG_At_Spl_UNK_0, 1, dCcD_SE_WOLF_BITE, 2, mpHIO->mWolf.mWlAttack.mWlAtNjump.m.mAttackRadius, mpHIO->mWolf.mWlAttack.mWlAtNjump.m.mAttackHeight); voiceStart(Z2SE_WL_V_ATTACK_S); seStartOnlyReverb(Z2SE_WOLFATTACK_WIND_S); mProcVar5.field_0x3012 = 0; } mMaxSpeed = mpHIO->mWolf.mWlAttack.mWlAtNjump.m.mMaxHorizontalSpeed; min_horizontal_speed = mpHIO->mWolf.mWlAttack.mWlAtNjump.m.mMinHorizontalSpeed; max_vertical_speed = mpHIO->mWolf.mWlAttack.mWlAtNjump.m.mMaxVerticalSpeed; min_vertical_speed = mpHIO->mWolf.mWlAttack.mWlAtNjump.m.mMinVerticalSpeed; field_0x3438 = mpHIO->mWolf.mWlAttack.mWlAtNjump.m.mAttackRadiusOffset; attack_init_speed = mpHIO->mWolf.mWlAttack.mWlAtNjump.m.mAttackInitSpeed; mProcVar4.field_0x3010 = 0; } setSingleAnimeWolfParam(WANM_ATTACK_A_START, &mpHIO->mWolf.mWlAttack.mWlAtNjump.m.mAerialAttackAnm); if (mTargetedActor != NULL) { shape_angle.y = cLib_targetAngleY(¤t.pos, &mTargetedActor->eyePos); if (mComboCutCount == 1 && param_0 != 1) { speed.y = min_vertical_speed; mNormalSpeed = (-gravity * eyePos.absXZ(mTargetedActor->eyePos)) / (2.0f * speed.y); } else { var_f30 = (mTargetedActor->eyePos.y - eyePos.y) - 10.0f; if (mProcVar0.field_0x3008 != 0) { var_f30 -= 10.0f; } if (var_f30 > 0.0f) { var_f29 = JMAFastSqrt((2.0f * var_f30) / -gravity); } else { var_f29 = 0.0f; } if (var_f29 >= 1.0f) { f32 temp_f25 = 1.0f / var_f29; mNormalSpeed = temp_f25 * current.pos.absXZ(mTargetedActor->eyePos); speed.y = cLib_minMaxLimit(temp_f25 * (var_f30 - (var_f29 * (0.5f * gravity * var_f29))), min_vertical_speed, max_vertical_speed); } else { mNormalSpeed = attack_init_speed; speed.y = min_vertical_speed; } (void)0; } } else { mNormalSpeed = attack_init_speed; speed.y = min_vertical_speed; } if (mNormalSpeed > mMaxSpeed) { mNormalSpeed = mMaxSpeed; } else if (mNormalSpeed < min_horizontal_speed) { mNormalSpeed = min_horizontal_speed; } mProcVar1.field_0x300a = param_0; field_0x3588 = l_wolfBaseAnime; field_0x33b0 = l_wolfBaseAnime.y; field_0x3198 = 0; field_0x32cc = 0; mProcVar2.field_0x300c = 0; mProcVar3.field_0x300e = 0; onResetFlg0(RFLG0_UNK_2); dComIfGp_setPlayerStatus0(0, 2); if (param_0 != 0) { dComIfGp_setPlayerStatus1(0, 0x200000); } current.angle.y = shape_angle.y; if (param_0 != 1) { field_0x307e = mpHIO->mWolf.mWlAttack.m.mComboDuration; } return 1; } int daAlink_c::procWolfJumpAttack() { daPy_frameCtrl_c* frameCtrl_p = mUnderFrameCtrl; if (mProcVar3.field_0x300e != 0 && mNormalSpeed > mpHIO->mWolf.mWlAttack.mWlAtCjump.m.mHitMinSpeed) { cLib_chaseF(&mNormalSpeed, mpHIO->mWolf.mWlAttack.mWlAtCjump.m.mHitMinSpeed, mpHIO->mWolf.mWlAttack.mWlAtCjump.m.mHitDecel); } if (mAtCyl.ChkAtHit()) { field_0x3198 = 1; if (mProcVar4.field_0x3010 != 0 && mProcVar3.field_0x300e == 0) { mNormalSpeed *= mpHIO->mWolf.mWlAttack.mWlAtCjump.m.mHitDecelRate; mProcVar3.field_0x300e = 1; } } if (checkWolfAttackReverse(field_0x32cc)) { return 1; } if (mLinkAcch.ChkGroundHit() && checkWolfLandAction(0)) { return 1; } if (mLinkAcch.ChkGroundHit() && checkSlideAction()) { dComIfGp_getVibration().StartShock(1, 15, cXyz(0.0f, 1.0f, 0.0f)); return 1; } field_0x32cc = 1; if (mProcVar1.field_0x300a != 1) { field_0x307e = mpHIO->mWolf.mWlAttack.m.mComboDuration; } if (mProcVar0.field_0x3008 != 0 && checkFrontWallTypeAction()) { return 1; } field_0x2f99 = 7; if (mLinkAcch.ChkGroundHit()) { dComIfGp_getVibration().StartShock(1, 15, cXyz(0.0f, 1.0f, 0.0f)); if (checkNoResetFlg2(FLG2_UNK_8)) { procWolfEnemyThrowInit(4); } else if (mProcVar5.field_0x3012 != 0 || mProcVar1.field_0x300a == 2 || mProcVar1.field_0x300a == 3) { procWolfJumpAttackSlideLandInit(field_0x3198, 1, mProcVar1.field_0x300a == 2); } else { procWolfJumpAttackNormalLandInit(0); } return 1; } if (checkNoResetFlg2(FLG2_WOLF_ENEMY_HANG_BITE)) { return procWolfEnemyHangBiteInit(); } if (checkAnmEnd(frameCtrl_p)) { if (mProcVar2.field_0x300c == 0) { mProcVar2.field_0x300c = 1; setSingleAnimeWolfBaseSpeed(WANM_ATTACK_A, mpHIO->mWolf.mWlAttack.mWlAtNjump.m.mAerialAnmSpeed, mpHIO->mWolf.mWlAttack.mWlAtNjump.m.mAerialInterpolation); onResetFlg0(RFLG0_UNK_2); } else { onResetFlg0(RFLG0_UNK_2); } } else { onResetFlg0(RFLG0_UNK_2); if (current.pos.y < mLastJumpPos.y - mpHIO->mWolf.mWlAttack.m.mFallHeight) { procWolfFallInit(2, mpHIO->mWolf.mWlAttack.m.mFallInterpolation); } } return 1; } int daAlink_c::procWolfJumpAttackKickInit() { commonProcInit(PROC_WOLF_JUMP_AT_KICK); setSingleAnimeWolfParam(WANM_JUMP_KICK, &mpHIO->mWolf.mWlAttack.mWlAtCjump.m.mFlipKickAnm); speed.y = 0.0f; mNormalSpeed = 0.0f; setSpecialGravity(0.0f, maxFallSpeed, 0); voiceStart(Z2SE_WL_V_ATTACK_S); seStartOnlyReverb(Z2SE_WOLFATTACK_WIND_S); dComIfGp_setPlayerStatus1(0, 0x200000); return 1; } int daAlink_c::procWolfJumpAttackKick() { if (checkAnmEnd(mUnderFrameCtrl)) { procWolfBackJumpInit(2); dComIfGp_setPlayerStatus1(0, 0x200000); } return 1; } int daAlink_c::procWolfJumpAttackSlideLandInit(int param_0, int param_1, int param_2) { commonProcInit(PROC_WOLF_JUMP_AT_SLIDE_LAND); if (mTargetedActor == NULL || !param_0 || (fopAcM_GetGroup(mTargetedActor) == fopAc_ENEMY_e && static_cast(mTargetedActor)->checkDeadFlg())) { mProcVar4.field_0x3010 = 0; } else { mProcVar4.field_0x3010 = 1; } if ((mTargetedActor != NULL && fopAcM_GetGroup(mTargetedActor) == fopAc_ENEMY_e && param_0 && !static_cast(mTargetedActor)->checkDeadFlg() && fopAcM_seenActorAngleY(this, mTargetedActor) > 0x5000) || param_2) { setSingleAnimeWolfParam(WANM_ATTACK_A_END_BACK, &mpHIO->mWolf.mWlAttack.mWlAtLand.m.mBackSlideAnm); mProcVar2.field_0x300c = 1; field_0x3588.set(-l_wolfBaseAnime.x, l_wolfBaseAnime.y, -l_wolfBaseAnime.z); field_0x3478 = mpHIO->mWolf.mWlAttack.mWlAtLand.m.mBackSlideAnm.mCancelFrame; } else { setSingleAnimeWolfParam(WANM_ATTACK_A_END_FRONT, &mpHIO->mWolf.mWlAttack.mWlAtLand.m.mFrontSlideAnm); mProcVar2.field_0x300c = 0; field_0x3588 = l_wolfBaseAnime; field_0x3478 = mpHIO->mWolf.mWlAttack.mWlAtLand.m.mFrontSlideAnm.mCancelFrame; } field_0x2f9d = 4; setFootEffectProcType(1); mProcVar0.field_0x3008 = param_2; mNormalSpeed *= 0.5f; if (param_1) { field_0x2f99 = 4; } mProcVar5.field_0x3012 = 0; field_0x307e = mpHIO->mWolf.mWlAttack.m.mComboDuration; field_0x2f98 = 0; return 1; } int daAlink_c::procWolfJumpAttackSlideLand() { if (checkWolfGroundSpecialMode()) { return 1; } daPy_frameCtrl_c* frameCtrl_p = mUnderFrameCtrl; field_0x2f99 = 4; cLib_addCalc(&mNormalSpeed, 0.0f, 0.3f, mpHIO->mWolf.mWlAttack.mWlAtLand.m.mSlideDeceleration, 0.5f); if (mProcVar4.field_0x3010 != 0) { setShapeAngleToAtnActor(0); } setComboReserb(); checkCutTurnCharge(); if (checkAnmEnd(frameCtrl_p)) { if (checkZeroSpeedF()) { current.angle.y = shape_angle.y; if (mProcVar0.field_0x3008 != 0) { procWolfJumpAttackInit(3); } else { checkNextActionWolf(0); } } } else if (frameCtrl_p->getFrame() > field_0x3478 && mNormalSpeed <= 5.0f) { s16 prev_angle = current.angle.y; current.angle.y = shape_angle.y; if (mProcVar0.field_0x3008 != 0) { procWolfJumpAttackInit(3); } else if (!checkNextActionWolf(1)) { current.angle.y = prev_angle; } } else if (mNormalSpeed > 5.0f) { field_0x2f9d = 4; seStartMapInfoLevel(Z2SE_FN_WOLF_SLIP); } return 1; } int daAlink_c::procWolfJumpAttackNormalLandInit(int param_0) { commonProcInit(PROC_WOLF_JUMP_AT_NORMAL_LAND); setSingleAnimeWolfParam(WANM_ATTACK_A_END, &mpHIO->mWolf.mWlAttack.mWlAtLand.m.mNormalLandingAnm); setFootEffectProcType(2); field_0x2f9d = 0x18; mNormalSpeed = 0.0f; mProcVar5.field_0x3012 = 0; mProcVar2.field_0x300c = param_0; field_0x2f99 = 12; field_0x307e = mpHIO->mWolf.mWlAttack.m.mComboDuration; if (param_0 != 0) { dComIfGp_setPlayerStatus1(0, 0x200000); } return 1; } int daAlink_c::procWolfJumpAttackNormalLand() { if (checkWolfGroundSpecialMode()) { return 1; } daPy_frameCtrl_c* frameCtrl = mUnderFrameCtrl; field_0x2f99 = 4; cLib_chaseF(&mNormalSpeed, 0.0f, mpHIO->mWolf.mWlMoveNoP.m.mDeceleration); setComboReserb(); checkCutTurnCharge(); if (checkAnmEnd(frameCtrl)) { checkNextActionWolf(0); } else if (frameCtrl->getFrame() > mpHIO->mWolf.mWlAttack.mWlAtLand.m.mNormalLandingAnm.mCancelFrame) { if (mProcVar2.field_0x300c != 0) { ANGLE_ADD_2(shape_angle.y, 0x8000); return procWolfJumpAttackInit(3); } if (checkNextActionWolf(1)) { return 1; } } return 1; } int daAlink_c::procWolfWaitAttackInit(int i_attackType) { struct daAlink_WCutParamTbl { /* 0x0 */ daAlink_c::daAlink_WANM m_anmID; /* 0x4 */ u8 m_cutType; }; // Size: 0x8 static const daAlink_WCutParamTbl dataTabl[] = { { daAlink_c::WANM_ATTACK_B_LEFT, daAlink_c::CUT_TYPE_WOLF_B_LEFT, }, { daAlink_c::WANM_ATTACK_B_FRONT, daAlink_c::CUT_TYPE_WOLF_B_FRONT, }, { daAlink_c::WANM_ATTACK_B_TAIL, daAlink_c::CUT_TYPE_WOLF_B_BACK, }, { daAlink_c::WANM_ATTACK_B_RIGHT, daAlink_c::CUT_TYPE_WOLF_B_RIGHT, }, }; const daAlinkHIO_wlAtWait_c1* atk_hio; const daAlink_WCutParamTbl* atk_params = &dataTabl[i_attackType]; commonProcInit(PROC_WOLF_WAIT_ATTACK); setCutType(atk_params->m_cutType); mProcVar2.field_0x300c = 0; if (i_attackType == 2) { atk_hio = &mpHIO->mWolf.mWlAttack.mTailAttack.m; mProcVar3.field_0x300e = 0; } else if (i_attackType == 1) { atk_hio = &mpHIO->mWolf.mWlAttack.mScratchAttack.m; mProcVar3.field_0x300e = 1; } else { atk_hio = &mpHIO->mWolf.mWlAttack.mHorizontalAttack.m; mProcVar3.field_0x300e = 1; } f32 start_frame; if (mComboCutCount == 4) { setCylAtParam(AT_TYPE_WOLF_ATTACK, dCcG_At_Spl_UNK_1, 3, dCcD_SE_WOLF_BITE, 3, atk_hio->mAttackRadius, atk_hio->mAttackHeight); field_0x3478 = atk_hio->mAttackAnm.mCancelFrame; mProcVar0.field_0x3008 = atk_hio->mStopTime; start_frame = atk_hio->mAttackAnm.mStartFrame; } else { setCylAtParam(AT_TYPE_WOLF_ATTACK, dCcG_At_Spl_UNK_0, 1, dCcD_SE_WOLF_BITE, 2, atk_hio->mAttackRadius, atk_hio->mAttackHeight); field_0x3478 = atk_hio->mComboMidCF; mProcVar0.field_0x3008 = atk_hio->mComboMidStopTime; start_frame = atk_hio->mComboMidStartF; } setSingleAnimeWolf(atk_params->m_anmID, atk_hio->mAttackAnm.mSpeed, start_frame, atk_hio->mAttackAnm.mEndFrame, atk_hio->mAttackAnm.mInterpolation); if (mTargetedActor != NULL) { shape_angle.y = cLib_targetAngleY(¤t.pos, &mTargetedActor->eyePos); } current.angle.y = shape_angle.y; mProcVar5.field_0x3012 = 0; mProcVar1.field_0x300a = 2; field_0x347c = atk_hio->mAttackJudgmentStartForward; field_0x3480 = atk_hio->mAttackJudgmentEndForward; field_0x3484 = atk_hio->mSpeedAddForward; field_0x3488 = atk_hio->mSpeed; field_0x3438 = atk_hio->mAttackRadiusOffset; field_0x307e = mpHIO->mWolf.mWlAttack.m.mComboDuration; field_0x3588 = l_wolfBaseAnime; if (mComboCutCount != 1) { field_0x2f99 = 13; } return 1; } int daAlink_c::procWolfWaitAttack() { if (checkWolfGroundSpecialMode()) { return 1; } daPy_frameCtrl_c* frameCtrl_p = mUnderFrameCtrl; field_0x2f99 = 5; cLib_chaseF(&mNormalSpeed, 0.0f, mpHIO->mWolf.mWlMoveNoP.m.mDeceleration); setComboReserb(); checkCutTurnCharge(); if (mCutType != CUT_TYPE_WOLF_B_BACK && checkWolfAttackReverse(mProcVar1.field_0x300a == 0)) { return 1; } if (checkNoResetFlg2(FLG2_UNK_8) && frameCtrl_p->getFrame() >= 14.0f) { return procWolfEnemyThrowInit(mCutType == CUT_TYPE_WOLF_B_LEFT ? 2 : 3); } if (checkAnmEnd(frameCtrl_p)) { resetCombo(TRUE); if (mDemo.getDemoMode() == daPy_demo_c::DEMO_UNK_43_e) { dComIfGp_evmng_cutEnd(mAlinkStaffId); } else if (mProcVar0.field_0x3008 > 0) { if (!(frameCtrl_p->getFrame() > field_0x3478) || !checkNextActionWolf(1)) { mProcVar0.field_0x3008--; } } else { mNormalSpeed = 0.0f; checkNextActionWolf(0); } } else if (frameCtrl_p->getFrame() > field_0x3478) { if (!checkNextActionWolf(1)) { resetCombo(TRUE); } } else { int _; setShapeAngleToAtnActor(1); current.angle.y = shape_angle.y; if (frameCtrl_p->checkPass(field_0x3484)) { mNormalSpeed = field_0x3488; } if (mProcVar2.field_0x300c == 0 && frameCtrl_p->getFrame() >= 3.0f) { if (mComboCutCount == 4) { voiceStart(Z2SE_WL_V_ATTACK_L); } else { voiceStart(Z2SE_WL_V_ATTACK_S); } if (mProcVar3.field_0x300e == 0) { seStartOnlyReverb(Z2SE_WOLFATTACK_WIND_TAIL); } else { seStartOnlyReverb(Z2SE_WOLFATTACK_WIND_S); } mProcVar2.field_0x300c = 1; } if (frameCtrl_p->getFrame() >= field_0x347c && frameCtrl_p->getFrame() < field_0x3480) { onResetFlg0(RFLG0_UNK_2); if (mProcVar1.field_0x300a != 0) { mProcVar1.field_0x300a--; } } } return 1; } int daAlink_c::procWolfRollAttackInit(int param_0, int param_1) { commonProcInit(PROC_WOLF_ROLL_ATTACK); if (param_0 == 2) { param_0 = getCutTurnDirection(); } daAlink_WANM anm; if (param_0 == 1) { anm = WANM_CUT_TURN_RIGHT; mProcVar2.field_0x300c = 1; setCutType(CUT_TYPE_WOLF_TURN_RIGHT); } else { anm = WANM_CUT_TURN_LEFT; mProcVar2.field_0x300c = 0; setCutType(CUT_TYPE_WOLF_TURN_LEFT); } setSingleAnimeWolfParam(anm, &mpHIO->mWolf.mWlAttack.mAtRoll.m.mAttackAnm); field_0x3478 = mpHIO->mWolf.mWlAttack.mAtRoll.m.mAttackRadius; setCylAtParam(AT_TYPE_WOLF_CUT_TURN, dCcG_At_Spl_UNK_1, 3, dCcD_SE_WOLF_BITE, 3, field_0x3478 * 0.5f, 155.0f); mNormalSpeed = 0.0f; mProcVar3.field_0x300e = param_1; if (param_1 != 0) { mUnderFrameCtrl[0].setStart(mpHIO->mWolf.mWlAttack.mAtRoll.m.mSpiderThreadEscapeStartF); } else { seStartOnlyReverb(Z2SE_WOLFATTACK_WIND_L); voiceStart(Z2SE_WL_V_ATTACK_SPIN); } current.angle.y = shape_angle.y; field_0x3180 = 0; if (getMidnaActor() != NULL) { // NOTE: this call does nothing getMidnaActor()->resetRatBody(); } return 1; } int daAlink_c::procWolfRollAttack() { if (checkWolfGroundSpecialMode()) { return 1; } daPy_frameCtrl_c* frameCtrl_p = mUnderFrameCtrl; cLib_chaseF(&mNormalSpeed, 0.0f, mpHIO->mWolf.mWlMoveNoP.m.mDeceleration); if (checkAnmEnd(frameCtrl_p)) { checkNextActionWolf(0); } else if (frameCtrl_p->getFrame() > mpHIO->mWolf.mWlAttack.mAtRoll.m.mAttackAnm.mCancelFrame) { checkNextActionWolf(1); } else if (mProcVar3.field_0x300e == 0 && frameCtrl_p->getFrame() >= 4.0f && frameCtrl_p->getFrame() < 13.0f) { if (!checkNoResetFlg0(FLG0_CUT_AT_FLG)) { mNormalSpeed = mpHIO->mWolf.mWlAttack.mAtRoll.m.mAttackSpeed; } onResetFlg0(RFLG0_UNK_2); cLib_chaseF(mAtCyl.GetRP(), field_0x3478, 20.0f); } return 1; } int daAlink_c::procWolfDownAttackInit() { commonProcInit(PROC_WOLF_DOWN_ATTACK); setSingleAnimeWolfParam(WANM_ATTACK_POE_START, &mpHIO->mWolf.mWlAttack.mWlAtDown.m.mLowStanceAnm); cXyz sp24(static_cast(mTargetedActor)->getDownPos()); sp24.y += 50.0f; if (fopAcM_gc_c::gndCheck(&sp24)) { sp24.y = fopAcM_gc_c::getGroundY(); } else { sp24.y -= 50.0f; } current.angle.y = cLib_targetAngleY(¤t.pos, &sp24); sp24.x -= cM_ssin(current.angle.y) * 80.0f; sp24.z -= cM_scos(current.angle.y) * 80.0f; f32 var_f1 = current.pos.absXZ(sp24); if (var_f1 > 800.0f) { var_f1 = 800.0f; } speed.y = mpHIO->mWolf.mWlAttack.mWlAtDown.m.mSideRollMovementWidth; f32 temp_f3 = speed.y + gravity; f32 var_f0 = temp_f3 * temp_f3 + gravity * 2.0f * (sp24.y - current.pos.y); if (var_f0 < 0.0f) { mNormalSpeed = (var_f1 * gravity) / -temp_f3; } else { mNormalSpeed = (var_f1 * gravity) / (-JMAFastSqrt(var_f0) - temp_f3); } mProcVar2.field_0x300c = 0; field_0x280c.setData(mTargetedActor); voiceStart(Z2SE_WL_V_ATTACK_POU_ST); seStartOnlyReverb(Z2SE_WOLFATTACK_WIND_S); return 1; } int daAlink_c::procWolfDownAttack() { if (mLinkAcch.ChkGroundHit() && speed.y <= 0.0f) { fopEn_enemy_c* enemy_p = (fopEn_enemy_c*)field_0x280c.getActor(); if (enemy_p != NULL && enemy_p->checkDownFlg() && eyePos.abs2XZ(enemy_p->getDownPos()) < SQUARE(100.0f) && fabsf(enemy_p->current.pos.y - current.pos.y) < 50.0f) { procWolfDownAtLandInit(enemy_p); } else { procWolfDownAtMissLandInit(); } } else if (checkAnmEnd(mUnderFrameCtrl)) { if (checkUnderMove0BckNoArcWolf(WANM_ATTACK_POE_START)) { setSingleAnimeWolfParam(WANM_ATTACK_POE, &mpHIO->mWolf.mWlAttack.mWlAtDown.m.mPushDownAnm); shape_angle.y = current.angle.y; } } else if (checkUnderMove0BckNoArcWolf(WANM_ATTACK_POE_START)) { cLib_addCalcAngleS(&shape_angle.y, current.angle.y, 2, 0x2000, 0x800); } return 1; } int daAlink_c::procWolfDownAtLandInit(fopEn_enemy_c* i_enemy) { commonProcInit(PROC_WOLF_DOWN_AT_LAND); field_0x280c.setData(i_enemy); setSingleAnimeWolfParam(WANM_ATTACK_POE_END, &mpHIO->mWolf.mWlAttack.mWlAtDown.m.mFrontRollAnm); field_0x2f9d = 4; setFootEffectProcType(2); i_enemy->onWolfDownStartFlg(); mNormalSpeed = 0.0f; setWolfBallModel(); voiceStart(Z2SE_WL_V_ATTACK_POU_BITE); dComIfGp_getVibration().StartShock(2, 15, cXyz(0.0f, 1.0f, 0.0f)); return 1; } int daAlink_c::procWolfDownAtLand() { if (checkWolfGroundSpecialMode()) { return 1; } fopEn_enemy_c* enemy_p = (fopEn_enemy_c*)field_0x280c.getActor(); daPy_frameCtrl_c* frameCtrl_p = mUnderFrameCtrl; if (checkAnmEnd(frameCtrl_p)) { if (checkUnderMove0BckNoArcWolf(WANM_PULL_OUT)) { setUpperAnime(dRes_ID_ALANM_BCK_WL_PICKUPA_e, UPPER_2, 0.0f, 20.0f, -1, -1.0f); if (enemy_p != NULL) { enemy_p->onWolfDownPullEndFlg(); dComIfGp_particle_setColor(dPa_RM(ID_ZI_S_ID_SETB_A), &enemy_p->getDownPos(), &tevStr, NULL, NULL, 0.0f, 0xFF); dComIfGp_particle_setColor(dPa_RM(ID_ZI_S_ID_SETB_B), &enemy_p->getDownPos(), &tevStr, NULL, NULL, 0.0f, 0xFF); dComIfGp_particle_setColor(dPa_RM(ID_ZI_S_ID_SETB_C), &enemy_p->getDownPos(), &tevStr, NULL, NULL, 0.0f, 0xFF); } return procWolfBackJumpInit(1); } setSingleAnimeWolfParam(WANM_PULL_OUT, &mpHIO->mWolf.mWlAttack.mWlAtDown.m.mProneGetUpAnm); dComIfGp_getVibration().StartShock(2, 15, cXyz(0.0f, 1.0f, 0.0f)); } else if (checkUnderMove0BckNoArcWolf(WANM_ATTACK_POE_END) && (frameCtrl_p->checkPass(9.0f) || frameCtrl_p->checkPass(16.0f))) { dComIfGp_getVibration().StartShock(2, 15, cXyz(0.0f, 1.0f, 0.0f)); } return 1; } int daAlink_c::procWolfDownAtMissLandInit() { commonProcInit(PROC_WOLF_DOWN_AT_MISS_LAND); setSingleAnimeWolfParam(WANM_ATTACK_POE_MISS, &mpHIO->mWolf.mWlAttack.mWlAtDown.m.mRollOverAnm); setFaceBasicTexture(FTANM_WL_ATTACKUNG); mNormalSpeed = 0.0f; setFootEffectProcType(1); field_0x2f9d = 0x18; field_0x3588 = l_wolfBaseAnime; dComIfGp_getVibration().StartShock(1, 15, cXyz(0.0f, 1.0f, 0.0f)); return 1; } int daAlink_c::procWolfDownAtMissLand() { daPy_frameCtrl_c* frameCtrl = mUnderFrameCtrl; if (checkWolfGroundSpecialMode()) { return 1; } field_0x2f99 = 4; if (checkAnmEnd(frameCtrl)) { checkNextActionWolf(0); } else if (frameCtrl->getFrame() > mpHIO->mWolf.mWlAttack.mWlAtDown.m.mRollOverAnm.mCancelFrame) { checkNextActionWolf(1); } else if (frameCtrl->getFrame() >= 3.0f && frameCtrl->getFrame() < 8.0f) { seStartMapInfoLevel(Z2SE_FN_WOLF_SLIP); field_0x2f9d = 0x18; } return 1; } int daAlink_c::procWolfLockAttackInit(int param_0) { commonProcInit(PROC_WOLF_LOCK_ATTACK); setSingleAnimeWolfParam(WANM_ATTACK_A_START, &mpHIO->mWolf.mWlAttack.mWlAtNjump.m.mAerialAttackAnm); if (fopAcM_GetName(mWolfLockAcKeep[0].getActor()) == fpcNm_E_YMB_e) { mProcVar5.field_0x3012 = 1; if (param_0 == 0) { mProcVar1.field_0x300a = static_cast(mWolfLockAcKeep[0].getActor())->getMaxLockAttack(); } mProcVar1.field_0x300a--; field_0x37c8 = mWolfLockAcKeep[0].getActor()->eyePos; if (mProcVar1.field_0x300a == 0) { mWolfLockAcKeep[0].clearData(); } } else { field_0x37c8 = mWolfLockAcKeep[0].getActor()->eyePos; mWolfLockAcKeep[0].clearData(); mProcVar5.field_0x3012 = 0; } shape_angle.y = cLib_targetAngleY(¤t.pos, &field_0x37c8); current.angle.y = shape_angle.y; cXyz l_eyePosDelta = field_0x37c8 - eyePos; if (l_eyePosDelta.y < 10.0f) { l_eyePosDelta.y = 10.0f; } else if (l_eyePosDelta.y > mpHIO->mWolf.mWlAttack.mWlAtLock.m.mMaxJumpHeight) { l_eyePosDelta.y = mpHIO->mWolf.mWlAttack.mWlAtLock.m.mMaxJumpHeight; } f32 var_f30 = l_eyePosDelta.absXZ(); if (var_f30 > mpHIO->mWolf.mWlAttack.mWlAtLock.m.mMaxJumpDistance) { var_f30 = mpHIO->mWolf.mWlAttack.mWlAtLock.m.mMaxJumpDistance / var_f30; l_eyePosDelta.x *= var_f30; l_eyePosDelta.z *= var_f30; } f32 var_f29 = l_eyePosDelta.abs(); f32 var_f31 = var_f29 / mpHIO->mWolf.mWlAttack.mWlAtLock.m.mAttackSpeed; if (var_f31 < 1.0f) var_f31 = 1.0f; f32 var_f28 = mpHIO->mWolf.mWlAttack.mWlAtLock.m.mAttackSpeed / var_f29; mNormalSpeed = var_f28 * l_eyePosDelta.absXZ(); setSpecialGravity((l_eyePosDelta.y * -2.0f) / (var_f31 * var_f31), maxFallSpeed, 0); speed.y = -gravity * var_f31; mProcVar0.field_0x3008 = var_f31; setCylAtParam(AT_TYPE_MIDNA_LOCK, dCcG_At_Spl_UNK_0, 1, dCcD_SE_WOLF_BITE, 6, mpHIO->mWolf.mWlAttack.mWlAtLock.m.mAttackRadius, mpHIO->mWolf.mWlAttack.mWlAtLock.m.mAttackHeight); field_0x3438 = mpHIO->mWolf.mWlAttack.mWlAtLock.m.mAttackRadiusOffset; setCutType(CUT_TYPE_WOLF_LOCK); voiceStart(Z2SE_WL_V_ATTACK_THRUST); dComIfGp_setPlayerStatus1(0, 0x1000000); dComIfGp_particle_set(ID_ZI_J_WL_LOCKATDASH_A, ¤t.pos, ¤t.angle, 0); return 1; } int daAlink_c::procWolfLockAttack() { BOOL isAtShieldHit = false; for (int i = 0; i < 3; i++) { if (checkAtShieldHit(mTgCyls[i])) { isAtShieldHit = true; break; } } // early return checks for colliding with at shields or if the actor hit is not freezard if (isAtShieldHit || (checkAtShieldHit(mAtCyl) && (mAtCyl.GetAtHitAc() == NULL || fopAcM_GetName(mAtCyl.GetAtHitAc()) != fpcNm_E_FB_e))) { return procCoLargeDamageInit(-4, TRUE, 0, 0, NULL, 2); } if (checkWolfAttackReverse(1)) { return 1; } if (mProcVar0.field_0x3008 != 0) { mProcVar0.field_0x3008--; if (mProcVar0.field_0x3008 == 0) { setSpecialGravity(mpHIO->mWolf.mWlAttack.mWlAtLock.m.mGravity, maxFallSpeed, 0); } } else if (mNormalSpeed > 30.0f) { cLib_addCalc(&mNormalSpeed, 30.0f, 0.3f, 5.0f, 1.0f); } if (checkAnmEnd(mUnderFrameCtrl) && checkUnderMove0BckNoArcWolf(WANM_ATTACK_A_START)) { setSingleAnimeWolfBaseSpeed(WANM_ATTACK_A, mpHIO->mWolf.mWlAttack.mWlAtNjump.m.mAerialAnmSpeed, mpHIO->mWolf.mWlAttack.mWlAtNjump.m.mAerialInterpolation); } if (mLinkAcch.ChkGroundHit() || (mProcVar5.field_0x3012 != 0 && current.pos.y < mWaterY)) { if (!mLinkAcch.ChkGroundHit()) { current.pos.y = mWaterY; } if (mWolfLockNum != 0) { procWolfLockAttackTurnInit(mProcVar1.field_0x300a); } else { if (mNormalSpeed > mpHIO->mWolf.mWlAttack.mWlAtNjump.m.mMaxHorizontalSpeed) { mNormalSpeed = mpHIO->mWolf.mWlAttack.mWlAtNjump.m.mMaxHorizontalSpeed; } procWolfJumpAttackSlideLandInit(0, 0, 0); } } else { mZ2Link.startLinkSoundLevel(Z2SE_WOLFATTACK_WIND_RUSH, mComboCutCount, mVoiceReverbIntensity); onResetFlg0(RFLG0_UNK_2); } return 1; } int daAlink_c::procWolfLockAttackTurnInit(int param_0) { commonProcInit(PROC_WOLF_LOCK_ATTACK_TURN); if (abs((s16)(cLib_targetAngleY(¤t.pos, &mWolfLockAcKeep[0].getActor()->eyePos) - shape_angle.y)) > 0x4000) { setSingleAnimeWolfParam(WANM_ATTACK_A_END_BACK, &mpHIO->mWolf.mWlAttack.mWlAtLock.m.mRearLandingAnm); mProcVar2.field_0x300c = 1; field_0x3588.set(-l_wolfBaseAnime.x, l_wolfBaseAnime.y, -l_wolfBaseAnime.z); } else { setSingleAnimeWolfParam(WANM_ATTACK_A_END_FRONT, &mpHIO->mWolf.mWlAttack.mWlAtLock.m.mFrontLandingAnm); mProcVar2.field_0x300c = 0; field_0x3588 = l_wolfBaseAnime; } if (mWolfLockAcKeep[0].getActor() != NULL && fopAcM_GetName(mWolfLockAcKeep[0].getActor()) == fpcNm_E_YMB_e) { mProcVar5.field_0x3012 = 1; } else { mProcVar5.field_0x3012 = 0; } field_0x2f9d = 4; setFootEffectProcType(1); mNormalSpeed *= 0.5f; field_0x2f99 = 4; dComIfGp_setPlayerStatus1(0, 0x1000000); offResetFlg0(RFLG0_UNK_8000000); mComboCutCount++; mProcVar1.field_0x300a = param_0; return 1; } int daAlink_c::procWolfLockAttackTurn() { field_0x2f99 = 4; if (mProcVar5.field_0x3012 != 0 && current.pos.y < mWaterY) { current.pos.y = mWaterY; } if (mWolfLockNum != 0) { s16 target_angle = cLib_targetAngleY(¤t.pos, &mWolfLockAcKeep[0].getActor()->eyePos); if (mProcVar2.field_0x300c != 0) { ANGLE_ADD_2(target_angle, 0x8000); } cLib_addCalcAngleS(&shape_angle.y, target_angle, 2, 0x2000, 0x800); } cLib_addCalc(&mNormalSpeed, 0.0f, 0.3f, 5.0f, 1.0f); if (checkAnmEnd(mUnderFrameCtrl)) { if (mWolfLockNum != 0) { procWolfLockAttackInit(mProcVar1.field_0x300a); } else if (checkZeroSpeedF()) { current.angle.y = shape_angle.y; checkNextActionWolf(0); } else { field_0x2f9d = 4; seStartMapInfoLevel(Z2SE_FN_WOLF_SLIP); } } return 1; } int daAlink_c::procWolfAttackReverseInit() { commonProcInit(PROC_WOLF_ATTACK_REVERSE); setSingleAnimeWolfBase(WANM_ATTACK_RECOIL_START); setFaceBasicTexture(FTANM_WL_ATTACKREST); mNormalSpeed = mpHIO->mWolf.mWlAttack.m.mJumpBackSpeedH; speed.y = mpHIO->mWolf.mWlAttack.m.mJumpBackSpeedV; ANGLE_ADD_2(current.angle.y, 0x8000); dComIfGp_getVibration().StartShock(5, 15, cXyz(0.0f, 1.0f, 0.0f)); dKy_Sound_set(current.pos, 100, fopAcM_GetID(this), 5); seStartOnlyReverb(Z2SE_WOLF_BODYATTACK); onResetFlg1(RFLG1_WOLF_ATTACK_REVERSE); field_0x3588 = l_wolfBaseAnime; return 1; } int daAlink_c::procWolfAttackReverse() { if (checkWolfGroundSpecialMode()) { return 1; } daPy_frameCtrl_c* frameCtrl_p = mUnderFrameCtrl; field_0x2f99 = 4; if (!checkModeFlg(2)) { if (frameCtrl_p->checkPass(30.0f)) { voiceStart(Z2SE_WL_V_NOSE); } if (checkAnmEnd(frameCtrl_p)) { checkNextActionWolf(0); } else if (frameCtrl_p->getFrame() > mpHIO->mWolf.mWlAttack.m.mJumpBackLandAnm.mCancelFrame) { checkNextActionWolf(1); } } else if ((mLinkAcch.ChkGroundHit() || checkEndResetFlg2(ERFLG2_UNK_100)) && checkModeFlg(2)) { if (checkWolfLandAction(0)) { return 1; } mNormalSpeed = 0.0f; setSingleAnimeWolfParam(WANM_ATTACK_RECOIL_END, &mpHIO->mWolf.mWlAttack.m.mJumpBackLandAnm); setFaceBasicTexture(FTANM_WL_ATTACKREED); #if DEBUG mpHIO->jumpStateUpdate(&mLastJumpPos, ¤t.pos, l_jumpTop); #endif current.angle.y = shape_angle.y; offModeFlg(2); onModeFlg(1); } return 1; } int daAlink_c::procWolfEnemyThrowInit(int param_0) { commonProcInit(PROC_WOLF_ENEMY_THROW); daAlink_WANM anm; if (param_0 == 2 || (param_0 == 4 && cM_rnd() < 0.5f)) { anm = WANM_FLING_LEFT; onNoResetFlg2(FLG2_WOLF_ENEMY_LEFT_THROW); } else { anm = WANM_FLING_RIGHT; offNoResetFlg2(FLG2_WOLF_ENEMY_LEFT_THROW); } f32 start_frame; if (param_0 == 4) { start_frame = 0.0f; } else { start_frame = 3.0f; } setSingleAnimeWolf(anm, mpHIO->mWolf.mWlAttack.mWlAtBite.m.mEnemyBiteThrowAnmSpeed, start_frame, -1, mpHIO->mWolf.mWlAttack.mWlAtBite.m.mEnemyBiteThrowInterpolation); setWolfEnemyThrowUpperAnime(anm, start_frame); field_0x3588 = l_wolfBaseAnime; mNormalSpeed = 0.0f; speed.y = 0.0f; field_0x2f99 = 13; current.angle.y = shape_angle.y; return 1; } int daAlink_c::procWolfEnemyThrow() { if (checkWolfGroundSpecialMode()) { return 1; } daPy_frameCtrl_c* frameCtrl = mUnderFrameCtrl; field_0x2f99 = 5; if (checkAnmEnd(frameCtrl)) { checkNextActionWolf(0); } else if (frameCtrl->getFrame() > mpHIO->mWolf.mWlAttack.mWlAtBite.m.mEnemyBiteThrowCF) { checkNextActionWolf(1); } return 1; } int daAlink_c::procWolfEnemyHangBiteInit() { commonProcInit(PROC_WOLF_ENEMY_HANG_BITE); setSingleAnimeWolfParam(WANM_CATCH_START, &mpHIO->mWolf.mWlAttack.mWlAtBite.m.mHangingBitePreparationAnm); mNormalSpeed = 0.0f; speed.y = 0.0f; setSpecialGravity(0.0f, maxFallSpeed, 0); if (!setWolfEnemyHangBitePos((fopEn_enemy_c*)field_0x281c.getActor())) { return procWolfJumpAttackKickInit(); } else { current.angle.y = shape_angle.y; field_0x2f99 = 0x50; mProcVar0.field_0x3008 = mpHIO->mWolf.mWlAttack.mWlAtBite.m.mBiteAttachTime; mProcVar1.field_0x300a = 0; mProcVar2.field_0x300c = 0; mProcVar3.field_0x300e = 0; field_0x3478 = mpHIO->mWolf.mWlAttack.mWlAtBite.m.mHangingBiteMidAnmSpeedMin; mProcVar4.field_0x3010 = shape_angle.y; voiceStart(Z2SE_WL_V_BITE_ATTACK); dComIfGp_setPlayerStatus1(0, 0x200000); } return 1; } int daAlink_c::procWolfEnemyHangBite() { daPy_frameCtrl_c* frameCtrl_p = mUnderFrameCtrl; fopEn_enemy_c* enemy_p = (fopEn_enemy_c*)field_0x281c.getActor(); if (!setWolfEnemyHangBitePos(enemy_p)) { return procWolfJumpAttackKickInit(); } cLib_addCalcAngleS(&shape_angle.y, mProcVar4.field_0x3010, 2, 0x2000, 0x800); current.angle.y = shape_angle.y; setDoStatusContinuation(3); if (doTrigger()) { mProcVar3.field_0x300e = 1; mProcVar0.field_0x3008 = mpHIO->mWolf.mWlAttack.mWlAtBite.m.mBiteAttachTime; } else if (mProcVar0.field_0x3008 != 0) { mProcVar0.field_0x3008--; } if (mProcVar2.field_0x300c == 0) { if (checkAnmEnd(frameCtrl_p)) { if (mProcVar3.field_0x300e != 0) { setSingleAnimeWolfBaseSpeed(WANM_CATCH, field_0x3478, 3.0f); mProcVar3.field_0x300e = 0; mProcVar2.field_0x300c = 1; } else if (mProcVar0.field_0x3008 == 0) { return procWolfJumpAttackKickInit(); } } } else { if (mProcVar0.field_0x3008 == 0) { return procWolfJumpAttackKickInit(); } if (doTrigger()) { cLib_chaseF(&field_0x3478, mpHIO->mWolf.mWlAttack.mWlAtBite.m.mHangingBiteMidAnmSpeedMax, mpHIO->mWolf.mWlAttack.mWlAtBite.m.mHangingBiteMidAnmSpeedAcceleration); } else { cLib_chaseF(&field_0x3478, mpHIO->mWolf.mWlAttack.mWlAtBite.m.mHangingBiteMidAnmSpeedMin, mpHIO->mWolf.mWlAttack.mWlAtBite.m.mHangingBiteMidAnmSpeedDeceleration); } if (frameCtrl_p->getRate() < 0.1f) { if (mProcVar3.field_0x300e != 0) { mProcVar3.field_0x300e = 0; frameCtrl_p->setRate(field_0x3478); } } else { frameCtrl_p->setRate(field_0x3478); if (frameCtrl_p->checkPass(0.0f) || frameCtrl_p->checkPass(17.0f)) { if (mProcVar3.field_0x300e == 0) { if (frameCtrl_p->checkPass(0.0f)) { frameCtrl_p->setFrame(0.0f); } else { frameCtrl_p->setFrame(17.0f); } getNowAnmPackUnder(UNDER_0)->setFrame(frameCtrl_p->getFrame()); frameCtrl_p->setRate(0.0f); } else { mProcVar3.field_0x300e = 0; } } else if (frameCtrl_p->checkPass(14.0f) || frameCtrl_p->checkPass(36.0f)) { setWolfBiteDamage(enemy_p); } else if (frameCtrl_p->checkPass(7.5f) || frameCtrl_p->checkPass(30.0f)) { voiceStart(Z2SE_WL_V_BITE_ATTACK); } else if (frameCtrl_p->checkPass(20.0f)) { voiceStart(Z2SE_WL_V_BITE_THROAT); } } } return 1; } int daAlink_c::procWolfGrabUpInit() { if (fopAcM_checkCarryNow(mPriActorOwn)) { return checkNextActionWolf(0); } if (fopAcM_GetName(mPriActorOwn) == fpcNm_Obj_MasterSword_e) { setGrabItemActor(mPriActorOwn); return 1; } commonProcInit(PROC_WOLF_GRAB_UP); f32 var_f31; if (!fopAcM_CheckCarryType(mPriActorOwn, fopAcM_CARRY_ITEM)) { setSingleAnimeWolfParam(WANM_PICKUP_A, &mpHIO->mWolf.mWlGrab.m.mPotGrabAnm); var_f31 = 120.0f; field_0x3478 = 10.0f; field_0x347c = mpHIO->mWolf.mWlGrab.m.mPotGrabAnm.mCancelFrame; } else { setSingleAnimeWolfParam(WANM_PICKUP_B, &mpHIO->mWolf.mWlGrab.m.mBoneGrabAnm); var_f31 = 80.0f; field_0x3478 = 7.0f; field_0x347c = mpHIO->mWolf.mWlGrab.m.mBoneGrabAnm.mCancelFrame; } setGrabItemActor(mPriActorOwn); shape_angle.y = fopAcM_searchActorAngleY(this, mPriActorOwn); current.angle.y = shape_angle.y; mProcVar2.field_0x300c = shape_angle.y; field_0x37c8 = mPriActorOwn->current.pos - field_0x3510; mProcVar3.field_0x300e = 0; if (fopAcM_GetName(mPriActorOwn) != fpcNm_Obj_Drop_e && fopAcM_GetName(mPriActorOwn) != fpcNm_Obj_Sword_e) { f32 prev_x = current.pos.x; f32 prev_z = current.pos.z; current.pos.x = mPriActorOwn->current.pos.x - var_f31 * cM_ssin(shape_angle.y); current.pos.z = mPriActorOwn->current.pos.z - var_f31 * cM_scos(shape_angle.y); field_0x37c8.x -= current.pos.x - prev_x; field_0x37c8.z -= current.pos.z - prev_z; } field_0x33e4 = mPriActorOwn->current.pos.absXZ(current.pos) - 100.0f; if (field_0x33e4 < 0.0f) { field_0x33e4 = 0.0f; } mNormalSpeed = 0.0f; return 1; } int daAlink_c::procWolfGrabUp() { daPy_frameCtrl_c* frameCtrl_p = mUnderFrameCtrl; fopAc_ac_c* item_p = mGrabItemAcKeep.getActor(); if (item_p == NULL) { return checkNextActionWolf(0); } if (frameCtrl_p->checkPass(field_0x3478)) { onResetFlg0(RFLG0_GRAB_UP_START); fopAcM_setStageLayer(item_p); voiceStart(Z2SE_WL_V_HOLD_MOUTH); } if (frameCtrl_p->getFrame() >= field_0x3478) { mProcVar3.field_0x300e = 1; } if (checkAnmEnd(frameCtrl_p)) { setUpperAnime(mUnderAnmHeap[0].getIdx(), UPPER_2, 0.0f, frameCtrl_p->getEnd() - 0.001f, -1, -1.0f); checkNextActionWolf(0); } else if (frameCtrl_p->getFrame() > field_0x347c) { setUpperAnime(mUnderAnmHeap[0].getIdx(), UPPER_2, 0.0f, frameCtrl_p->getEnd() - 0.001f, -1, -1.0f); if (!checkNextActionWolf(1)) { resetUpperAnime(UPPER_2, -1.0f); } } return 1; } int daAlink_c::procWolfGrabPutInit() { if (mProcID == PROC_WOLF_GRAB_PUT) { return 0; } BOOL isGrabObjAnm = checkWolfGrabAnimeObj(); commonProcInit(PROC_WOLF_GRAB_PUT); if (isGrabObjAnm) { setSingleAnimeWolfParam(WANM_PICKUP_A, &mpHIO->mWolf.mWlGrab.m.mPotReleaseAnm); field_0x3478 = 10.0f; field_0x347c = mpHIO->mWolf.mWlGrab.m.mPotReleaseAnm.mCancelFrame; } else { setSingleAnimeWolfParam(WANM_PICKUP_B, &mpHIO->mWolf.mWlGrab.m.mBoneReleaseAnm); field_0x3478 = 7.0f; field_0x347c = mpHIO->mWolf.mWlGrab.m.mBoneReleaseAnm.mCancelFrame; } mNormalSpeed = 0.0f; return 1; } int daAlink_c::procWolfGrabPut() { daPy_frameCtrl_c* frameCtrl_p = mUnderFrameCtrl; fopAc_ac_c* actor_p = mGrabItemAcKeep.getActor(); if (frameCtrl_p->getFrame() < field_0x3478) { if (actor_p != NULL) { actor_p->speedF = 0.0f; actor_p->current.pos.x += field_0x33e4 * cM_ssin(shape_angle.y); actor_p->current.pos.z += field_0x33e4 * cM_scos(shape_angle.y); freeGrabItem(); } if (checkAnmEnd(frameCtrl_p)) { if (mDemo.getDemoMode() == daPy_demo_c::DEMO_GRAB_PUT_e) { dComIfGp_evmng_cutEnd(mAlinkStaffId); } else { checkNextActionWolf(0); } } else if (frameCtrl_p->getFrame() < field_0x347c) { checkNextActionWolf(1); } } else { if (actor_p == NULL) { if (mDemo.getDemoMode() == daPy_demo_c::DEMO_GRAB_PUT_e) { dComIfGp_evmng_cutEnd(mAlinkStaffId); return 1; } else { return checkNextActionWolf(0); } } if (grabLineCheck(&field_0x34e0, &actor_p->current.pos) && dBgS_CheckBWallPoly(mObjLinChk)) { cXyz sp8 = actor_p->current.pos - mObjLinChk.GetCross(); current.pos.x -= sp8.x * 1.5f; current.pos.z -= sp8.z * 1.5f; } } return 1; } int daAlink_c::procWolfGrabThrowInit() { commonProcInit(PROC_WOLF_GRAB_THROW); setSingleAnimeWolfParam(WANM_PICKUP_THROW, &mpHIO->mWolf.mWlGrab.m.mThrowAnm); current.angle.y = shape_angle.y; return 1; } int daAlink_c::procWolfGrabThrow() { daPy_frameCtrl_c* frameCtrl = mUnderFrameCtrl; cLib_chaseF(&mNormalSpeed, 0.0f, mpHIO->mWolf.mWlMoveNoP.m.mDeceleration); setShapeAngleToAtnActor(0); current.angle.y = shape_angle.y; if (frameCtrl->checkPass(10.0f)) { setGrabItemThrow(); } if (checkAnmEnd(frameCtrl)) { checkNextActionWolf(0); } else if (frameCtrl->getFrame() > mpHIO->mWolf.mWlGrab.m.mThrowAnm.mCancelFrame) { checkNextActionWolf(1); } return 1; } int daAlink_c::procWolfPushInit() { commonProcInit(PROC_WOLF_PUSH); mProcVar3.field_0x300e = 18; s16 end_frame; if (fopAcM_CheckCarryType(mPriActorOwn, fopAcM_CARRY_TYPE_1)) { mProcVar2.field_0x300c = 1; end_frame = 24; } else { mProcVar2.field_0x300c = 0; end_frame = mProcVar3.field_0x300e; } setSingleAnimeWolf(WANM_PUSH_LIGHT, 1.0f, 0.0f, end_frame, 3.0f); mUnderFrameCtrl[0].setAttribute(0); mNormalSpeed = 0.0f; shape_angle.y = fopAcM_searchActorAngleY(this, mPriActorOwn); current.angle.y = shape_angle.y; field_0x3588 = l_wolfBaseAnime; field_0x2f99 = 12; field_0x34d4 = l_wolfBaseAnime; current.pos.x += cM_ssin(shape_angle.y) * 50.0f; current.pos.z += cM_scos(shape_angle.y) * 50.0f; if (fopAcM_CheckCarryType(mPriActorOwn, fopAcM_CARRY_TYPE_1)) { mProcVar2.field_0x300c = 1; } else { mProcVar2.field_0x300c = 0; } field_0x280c.setData(mPriActorOwn); return 1; } int daAlink_c::procWolfPush() { daPy_frameCtrl_c* frameCtrl = mUnderFrameCtrl; field_0x2f99 = 4; if (checkAnmEnd(frameCtrl)) { if (mProcVar2.field_0x300c != 0) { setSingleAnimeWolf(WANM_PUSH_LIGHT, 1.0f, 0.0f, mProcVar3.field_0x300e, 3.0f); mUnderFrameCtrl[0].setAttribute(0); mProcVar2.field_0x300c = 0; } else { checkNextActionWolf(0); } } else if (mProcVar2.field_0x300c == 0 && frameCtrl->checkPass(17.5f)) { if (field_0x280c.getActor() != NULL) { fopAcM_setCarryNow(field_0x280c.getActor(), 0); } } return 1; } static fopAc_ac_c* daAlink_searchEnemyCargo(fopAc_ac_c* i_actor, void* i_data) { UNUSED(i_data); if (fopAcM_GetName(i_actor) == fpcNm_E_YC_e) { return i_actor; } return NULL; } int daAlink_c::procWolfCargoCarryInit() { if (!commonProcInitNotSameProc(PROC_WOLF_CARGO_CARRY)) { return 1; } mNormalSpeed = 0.0f; speed.y = 0.0f; setSpecialGravity(0.0f, maxFallSpeed, 0); daAlink_WANM anm; if (checkCargoCarry()) { mProcVar2.field_0x300c = 1; anm = WANM_WAIT_KARGOROK; } else { mProcVar2.field_0x300c = 0; fopAc_ac_c* cargo_actor = (fopAc_ac_c*)fopAcIt_Judge((fopAcIt_JudgeFunc)daAlink_searchEnemyCargo, NULL); if (cargo_actor != NULL) { field_0x280c.setData(cargo_actor); } anm = WANM_CATCH_KARGOROK; } if (!dComIfGp_evmng_checkStartDemo()) { voiceStart(Z2SE_WL_V_CATCHED); } setSingleAnimeWolfBase(anm); return 1; } int daAlink_c::procWolfCargoCarry() { setJumpMode(); if (mProcVar2.field_0x300c != 0) { mCargoCarryAcKeep.setActor(); if (mCargoCarryAcKeep.getActor() == NULL || !checkCargoCarry()) { offCargoCarry(); return checkNextActionWolf(0); } mDoMtx_stack_c::copy(((daKago_c*)mCargoCarryAcKeep.getActor())->getLegR3Mtx()); mDoMtx_stack_c::transM(-9.0f, -17.0f, -30.0f); mDoMtx_stack_c::multVecZero(¤t.pos); mDoMtx_stack_c::ZXYrotM(-0x1928, 0x3FFF, 0); mDoMtx_MtxToRot(mDoMtx_stack_c::get(), &shape_angle); current.angle.y = shape_angle.y; checkSubjectAction(); } else { if (checkEndResetFlg1(ERFLG1_UNK_10000)) { return checkNextActionWolf(0); } mDoMtx_stack_c::copy(((e_yc_class*)field_0x280c.getActor())->getLegR3Mtx()); mDoMtx_stack_c::transM(-9.0f, -7.0f, -30.0f); mDoMtx_stack_c::multVecZero(¤t.pos); mDoMtx_stack_c::ZXYrotM(0x770C, 0, -0x4C94); mDoMtx_MtxToRot(mDoMtx_stack_c::get(), &shape_angle); current.angle.y = shape_angle.y; voiceStartLevel(Z2SE_WL_V_CATCHED_LOOP); } return 1; } int daAlink_c::procWolfChainUpInit() { field_0x2fa3 = searchFmChainPos(); if (field_0x2fa3 == 0) { return procWolfWaitInit(); } commonProcInit(PROC_WOLF_CHAIN_UP); setSingleAnimeWolfParam(WANM_PICKUP_B, &mpHIO->mWolf.mWlGrab.m.mBoneGrabAnm); mNormalSpeed = 0.0f; return 1; } int daAlink_c::procWolfChainUp() { daPy_frameCtrl_c* frameCtrl = mUnderFrameCtrl; #if PLATFORM_GCN setWallGrabStatus(BUTTON_STATUS_UNK_150, BUTTON_STATUS_FLAG_EMPHASIS); #endif if (checkAnmEnd(frameCtrl) || (checkInputOnR() && frameCtrl->getFrame() > mpHIO->mWolf.mWlGrab.m.mBoneGrabAnm.mCancelFrame)) { u8 old_2fa3 = field_0x2fa3; fopAc_ac_c* old_actor = field_0x2844.getActor(); procWolfWaitInit(); setUpperAnimeBaseSpeed(m_wlAnmDataTable[WANM_CHAIN_PULL].m_bckID, 0.0f, 3.0f); if (old_actor != NULL) { field_0x2fa3 = old_2fa3; field_0x2844.setData(old_actor); } } return 1; } int daAlink_c::procWolfGanonCatchInit() { if (!dComIfGp_event_compulsory(this, NULL, 0xFFEF)) { return 0; } mDemo.setSpecialDemoType(); mPriActorOwn->actor_status |= fopAcStts_STAFF_EXTRA_e; commonProcInit(PROC_WOLF_GANON_CATCH); field_0x280c.setData(mPriActorOwn); static_cast(mPriActorOwn)->setThrowModeCatch(); setSingleAnimeWolfBase(WANM_PIG_GANON_CATCH_ST); shape_angle.y = cLib_targetAngleY(¤t.pos, &mPriActorOwn->current.pos); current.angle.y = shape_angle.y + 0x8000; mNormalSpeed = 50.0f; mProcVar5.field_0x3012 = 30; mProcVar2.field_0x300c = 0; mProcVar3.field_0x300e = 0; setFootEffectProcType(0); field_0x2f9d = 0x60; mProcVar4.field_0x3010 = 4; return 1; } int daAlink_c::procWolfGanonCatch() { daPy_frameCtrl_c* frameCtrl_p = mUnderFrameCtrl; if (mProcVar2.field_0x300c == 0) { fopEn_enemy_c* ganon_p = (fopEn_enemy_c*)field_0x280c.getActor(); if (ganon_p == NULL) { resetSpecialEvent(); procWolfWaitInit(); return 1; } if (!doButton() || !mLinkAcch.ChkGroundHit()) { resetSpecialEvent(); ganon_p->setThrowModeDash(); procWolfWaitInit(); return 1; } if (checkAnmEnd(frameCtrl_p)) { setSingleAnimeWolfBase(WANM_PIG_GANON_CATCH_END); } if (checkInputOnR()) { int direction = getDirectionFromAngle(mStickAngle); if (direction == DIR_LEFT || direction == DIR_RIGHT) { mProcVar4.field_0x3010 = direction; } } if (cLib_chaseF(&mNormalSpeed, 0.0f, 1.0f)) { if (mProcVar5.field_0x3012 != 0) { mProcVar5.field_0x3012--; } else { if (mProcVar4.field_0x3010 == DIR_LEFT) { setSingleAnimeWolfBase(WANM_PIG_GANON_THROW_LEFT_START); ganon_p->setThrowModeThrowLeft(); } else if (mProcVar4.field_0x3010 == DIR_RIGHT) { setSingleAnimeWolfBase(WANM_PIG_GANON_THROW_RIGHT_START); ganon_p->setThrowModeThrowRight(); } else { resetSpecialEvent(); ganon_p->setThrowModeDash(); procWolfWaitInit(); return 1; } mProcVar2.field_0x300c = 1; current.angle.y = shape_angle.y; } } else if (mNormalSpeed > 5.0f) { field_0x2f9d = 0x60; } } else { if (checkAnmEnd(frameCtrl_p)) { if (mProcVar4.field_0x3010 == DIR_LEFT) { setSingleAnimeWolfBase(WANM_PIG_GANON_THROW_LEFT_END); } else { setSingleAnimeWolfBase(WANM_PIG_GANON_THROW_RIGHT_END); } } if (mProcVar3.field_0x300e != 0) { resetSpecialEvent(); procWolfWaitInit(); } } return 1; } int daAlink_c::procWolfChainReadyInit() { commonProcInit(PROC_WOLF_CHAIN_READY); field_0x280c.setData(mPriActorOwn); setSingleAnimeWolfParam(WANM_ATTACK_A_START, &mpHIO->mWolf.mWlAttack.mWlAtNjump.m.mAerialAttackAnm); mNormalSpeed = 0.0f; mProcVar2.field_0x300c = 0; mProcVar3.field_0x300e = 0; return 1; } int daAlink_c::procWolfChainReady() { daObjWchain_c* chain = static_cast(field_0x280c.getActor()); daPy_frameCtrl_c* framectrl = mUnderFrameCtrl; if (chain == NULL || mLinkAcch.ChkWallHit()) { return procWolfFallInit(2, mpHIO->mWolf.mWlAutoJump.m.mNormalFallInterp); } else if (framectrl->getFrame() < 3.0f) { cLib_addCalcAngleS(&shape_angle.y, cLib_targetAngleY(¤t.pos, &chain->getJumpAimPos()), 2, 0x2000, 0x800); current.angle.y = shape_angle.y; } else if (mProcVar3.field_0x300e == 0) { shape_angle.y = cLib_targetAngleY(¤t.pos, &chain->getJumpAimPos()); current.angle.y = shape_angle.y; mProcVar3.field_0x300e = 1; cXyz vec1 = chain->getJumpAimPos() - field_0x34e0; f32 dist_xz = vec1.absXZ(); f32 dist = vec1.abs(); mProcVar2.field_0x300c = vec1.atan2sY_XZ() >> 1; mNormalSpeed = dist_xz * 40.0f / dist + 1.0f; mProcVar0.field_0x3008 = dist_xz / mNormalSpeed + 1.0f; speed.y = (vec1.y - gravity * 0.5f * mProcVar0.field_0x3008 * mProcVar0.field_0x3008) / mProcVar0.field_0x3008; } else { mProcVar0.field_0x3008--; if (chain->getJumpAimPos().abs2(field_0x34e0) < 10000.0f) { procWolfChainWaitInit(); } else if (mProcVar0.field_0x3008 == 0) { procWolfFallInit(2, mpHIO->mWolf.mWlAutoJump.m.mNormalFallInterp); } } return 1; } int daAlink_c::procWolfChainWaitInit() { daObjWchain_c* chain = static_cast(field_0x280c.getActor()); commonProcInit(PROC_WOLF_CHAIN_WAIT); setSingleAnimeWolfParam(WANM_HANDLE_HANG, &mpHIO->mWolf.mWlChain.m.mLoweringStartAnm); mProcVar1.field_0x300a = 0; chain->onRide(); field_0x2f99 = 0x50; current.pos = chain->getTopPos(); setSpecialGravity(0.0f, maxFallSpeed, 0); speed.y = 0.0f; mProcVar4.field_0x3010 = 0; mProcVar0.field_0x3008 = mpHIO->mWolf.mWlChain.m.mTensionWaitTime + 20; field_0x3478 = chain->getPullLength(); current.angle.y = shape_angle.y; if (mNormalSpeed > 30.0f) { mNormalSpeed = 15.0f; } else { mNormalSpeed *= 0.5f; } field_0x37c8.set(mNormalSpeed * cM_ssin(shape_angle.y), 0.0f, mNormalSpeed * cM_scos(shape_angle.y)); mNormalSpeed = 0.0f; voiceStart(Z2SE_WL_V_BITE_HANG); return 1; } int daAlink_c::procWolfChainWait() { daObjWchain_c* chain = static_cast(field_0x280c.getActor()); if (chain == NULL || mProcVar0.field_0x3008 <= -mpHIO->mWolf.mWlChain.m.mReleaseWaitTime) { mNormalSpeed = field_0x37c8.absXZ(); current.angle.y = field_0x37c8.atan2sX_Z(); onNoResetFlg2(FLG2_UNK_200); return procWolfFallInit(2, mpHIO->mWolf.mWlWallHang.m.mHangingFallInterp); } if (mProcVar4.field_0x3010 == 0) { if (mProcVar0.field_0x3008 > 20) { mProcVar0.field_0x3008--; } else { field_0x3478 += mpHIO->mWolf.mWlChain.m.mFallSpeed; if (field_0x3478 > chain->getSwitchOffset()) { chain->onNowSwitchFlg(); mProcVar4.field_0x3010 = 1; dComIfGp_getVibration().StartShock(7, 3, cXyz(0.0f, 1.0f, 0.0f)); } } } else { mProcVar0.field_0x3008--; if (mProcVar0.field_0x3008 < 0) { field_0x3478 = chain->getDownOffset(); } else { field_0x3478 = (chain->getSwitchOffset() + chain->getLastOffset() * 0.5f) + (mProcVar0.field_0x3008 * 0.5f * 0.05f + 0.5f) * chain->getLastOffset() * cM_scos(mProcVar0.field_0x3008 * 0x3000); if (mProcVar0.field_0x3008 == 0) { chain->onEndFlg(); } } } cXyz vec1 = current.pos - chain->getRoofPos(); if (checkInputOnR()) { vec1.x += mStickValue * cM_ssin(mMoveAngle); vec1.z += mStickValue * cM_scos(mMoveAngle); } vec1.y -= 15.0f; vec1 += field_0x37c8; vec1.normalizeZP(); current.pos = chain->getRoofPos() + vec1 * (field_0x3478 + chain->getInitOutLength()); field_0x37c8 = (current.pos - field_0x3798) * 0.95f; mDoMtx_stack_c::YrotS(-shape_angle.y); mDoMtx_stack_c::multVec(&vec1, &vec1); shape_angle.x = cM_atan2s(-vec1.z, -vec1.y); shape_angle.z = cM_atan2s(vec1.x, JMAFastSqrt(vec1.y * vec1.y + vec1.z * vec1.z)); mProcVar2.field_0x300c = shape_angle.x; daPy_frameCtrl_c* frame_ctrl = &mUnderFrameCtrl[0]; if (mProcVar1.field_0x300a != 0 || checkAnmEnd(frame_ctrl)) { daAlink_WANM anm; f32 anmSpeed, morf, f3; if (checkInputOnR()) { anm = WANM_HANDLE_HANG_SW; anmSpeed = mpHIO->mWolf.mWlChain.m.mWaitAnmSpeed; morf = mpHIO->mWolf.mWlChain.m.mWaitInterp; } else { anm = WANM_HANDLE_HANG_WAIT; anmSpeed = mpHIO->mWolf.mWlChain.m.mSwingAnmSpeed; morf = mpHIO->mWolf.mWlChain.m.mSwingInterp; } if (anm != mUnderAnmHeap[0].getIdx()) { if (mProcVar1.field_0x300a == 0) { mProcVar1.field_0x300a = 1; f3 = 0.0f; } else { f3 = frame_ctrl->getFrame() / frame_ctrl->getEnd(); } setSingleAnimeWolfBaseSpeed(anm, anmSpeed, morf); frame_ctrl->setFrame(f3 * frame_ctrl->getEnd()); } } chain->setPullLength(field_0x3478); return 1; } int daAlink_c::procWolfDigInit() { BOOL var_r28 = TRUE; if (checkEndResetFlg1(ERFLG1_UNK_100000) && mPriActorOwn != NULL && fopAcM_GetName(mPriActorOwn) == fpcNm_Obj_Digpl_e) { int type = ((daObjDigpl_c*)mPriActorOwn)->getType(); if (type == 0 || type == 2 || type == 3) { var_r28 = FALSE; } } if (!checkEndResetFlg1(ERFLG1_UNK_100000)) { var_r28 = 0; } if (var_r28) { if (!dComIfGp_event_compulsory(this, NULL, 0xFFFF)) { return 0; } mDemo.setSpecialDemoType(); } commonProcInit(PROC_WOLF_DIG); mFallVoiceInit = var_r28; if (mPriActorOwn != NULL) { mProcVar1.mDigActorName = fopAcM_GetName(mPriActorOwn); } else { mProcVar1.mDigActorName = fpcNm_ALINK_e; } fopAc_ac_c* var_r29; if (checkEndResetFlg1(ERFLG1_UNK_100000) && mProcVar1.mDigActorName != fpcNm_Obj_Lv4DigSand_e && mProcVar1.mDigActorName != fpcNm_Obj_DigSnow_e) { var_r29 = mPriActorOwn; } else { var_r29 = NULL; } mProcVar5.field_0x3012 = 0; mProcVar4.mDigExitID = 0; if (var_r29 != NULL) { if (fopAcM_GetName(var_r29) == fpcNm_Obj_Digpl_e) { mProcVar2.mDigType = ((daObjDigpl_c*)var_r29)->getType(); mProcVar4.mDigExitID = ((daObjDigpl_c*)var_r29)->getSceneNum(); field_0x280c.setData(var_r29); mProcVar5.field_0x3012 = 1; } else { field_0x280c.clearData(); mProcVar2.mDigType = 3; } s16 var_r27 = fopAcM_searchActorAngleY(this, var_r29); if (abs((s16)(var_r27 - shape_angle.y)) > 0x4000) { ANGLE_ADD_2(var_r27, 0x8000); } shape_angle.y = var_r27; current.angle.y = shape_angle.y; current.pos.x = var_r29->current.pos.x - (50.0f * cM_ssin(shape_angle.y)); current.pos.z = var_r29->current.pos.z - (50.0f * cM_scos(shape_angle.y)); field_0x37c8 = var_r29->current.pos; } else { mProcVar2.mDigType = 4; if (checkEndResetFlg1(ERFLG1_UNK_100000)) { if (mProcVar1.mDigActorName == fpcNm_Obj_DigSnow_e) { ((daObjDigSnow_c* )mPriActorOwn)->startDig(); } else if (mProcVar1.mDigActorName == fpcNm_Obj_Lv4DigSand_e) { ((daObjL4DigSand_c*)mPriActorOwn)->startDig(); } field_0x280c.setData(mPriActorOwn); } else { field_0x280c.clearData(); } field_0x37c8.set(current.pos.x + (50.0f * cM_ssin(shape_angle.y)), current.pos.y, current.pos.z + (50.0f * cM_scos(shape_angle.y))); } s16 end_frame; if (mProcVar2.mDigType == 0 || mProcVar2.mDigType == 2 || mProcVar2.mDigType == 3) { end_frame = 59; field_0x3478 = 51.0f; } else if (mProcVar2.mDigType == 1) { end_frame = 33; field_0x3478 = 100.0f; dCam_getBody()->SetTrimTypeForce(3); } else { end_frame = mpHIO->mWolf.mWlChain.m.mDigAnm.mEndFrame; field_0x3478 = 66.0f; } f32 start_frame; if (checkEndResetFlg1(ERFLG1_UNK_100000)) { start_frame = 0.0f; } else { start_frame = 29.0f; end_frame = 59; } setSingleAnimeWolf(WANM_DIG, mpHIO->mWolf.mWlChain.m.mDigAnm.mSpeed, start_frame, end_frame, mpHIO->mWolf.mWlChain.m.mDigAnm.mInterpolation); mNormalSpeed = 0.0f; field_0x3588 = l_wolfBaseAnime; mProcVar3.mDigChangeArea = false; cXyz sp8(field_0x37c8.x, 10.0f + field_0x37c8.y, field_0x37c8.z); mLinkGndChk.SetPos(&sp8); f32 temp_f1 = dComIfG_Bgsp().GroundCross(&mLinkGndChk); if (field_0x37c8.y - temp_f1 < l_autoUpHeight) { mPolyInfo2.SetPolyInfo(mLinkGndChk); field_0x37c8.y = temp_f1; } else { mPolyInfo2.SetPolyInfo(mLinkAcch.m_gnd); } field_0x37d4 = field_0x37c8; if (fopAcM_wt_c::waterCheck(&field_0x37c8) && fopAcM_wt_c::getPolyAtt0() != 6 && fopAcM_wt_c::getWaterY() > field_0x37c8.y) { field_0x37d4.y = fopAcM_wt_c::getWaterY(); field_0x3198 = 7; mPolyInfo2.SetPolyInfo(*fopAcM_wt_c::getWaterCheck()); } else { field_0x3198 = dComIfG_Bgsp().GetPolyAtt0(mPolyInfo2); } field_0x32cc = 0; mProcVar0.field_0x3008 = 0; return 1; } int daAlink_c::procWolfDig() { daPy_frameCtrl_c* frame_ctrl = &mUnderFrameCtrl[0]; fopAc_ac_c* dig_actor; if (mProcVar5.field_0x3012 != 0) { dig_actor = field_0x280c.getActor(); } else { dig_actor = NULL; } if (mProcVar2.mDigType == 1) { dCam_getBody()->SetTrimTypeForce(3); } field_0x2f99 = 4; onEndResetFlg1(ERFLG1_WOLF_EYE_KEEP); cXyz sp14(field_0x37c8); dComIfG_Bgsp().MoveBgCrrPos(mLinkAcch.m_gnd, mLinkAcch.ChkGroundHit(), &field_0x37c8, NULL, NULL, false, false); field_0x37d4 += field_0x37c8 - sp14; BOOL var_r28 = FALSE; if (mProcVar3.mDigChangeArea) { if (frame_ctrl->getFrame() >= 25.0f) { onSceneChangeArea(mProcVar4.mDigExitID, 0xFF, NULL); if (dig_actor != NULL) { ((daObjDigpl_c*)dig_actor)->onDigFlg(); field_0x280c.clearData(); } } setWolfDigEffect(); } else if (checkAnmEnd(frame_ctrl)) { if (mProcVar2.mDigType == 1) { setSingleAnimeWolfParam(WANM_DIG_IN, &mpHIO->mWolf.mWlChain.m.mDigFallAnm); mProcVar3.mDigChangeArea = true; setWolfDigEffect(); } else { if (field_0x280c.getActor() != NULL) { if (mProcVar1.mDigActorName == fpcNm_Obj_DigSnow_e) { ((daObjDigSnow_c*)field_0x280c.getActor())->endDig(); } else if (mProcVar1.mDigActorName == fpcNm_Obj_Lv4DigSand_e) { ((daObjL4DigSand_c*)field_0x280c.getActor())->endDig(); } } if (checkEventRun() && mFallVoiceInit != 0) { resetSpecialEvent(); } else { procWolfWaitInit(); } } } else { if (frame_ctrl->checkPass(field_0x3478) && dig_actor != NULL) { ((daObjDigpl_c*)dig_actor)->onDigFlg(); field_0x280c.clearData(); } if (frame_ctrl->getFrame() >= 11.0f) { if (frame_ctrl->getFrame() <= 41.0f) { if (mProcVar0.field_0x3008 == 0) { mProcVar0.field_0x3008 = 1; seStartOnlyReverb(Z2SE_WOLF_DIG_HOLE); } setWolfDigEffect(); if (checkMidnaRide()) { getMidnaActor()->setForceNeckAimPos(field_0x37c8); } } } } return 1; } int daAlink_c::procWolfDigThroughInit(int param_0) { static const int dummy = 0; static const u16 snowID[] = { dPa_RM(ID_ZI_S_DIGTHROUGHSNOW_A), dPa_RM(ID_ZI_S_DIGTHROUGHSNOW_B), dPa_RM(ID_ZI_S_DIGTHROUGHSNOW_C), dPa_RM(ID_ZI_S_DIGTHROUGHSNOW_D), }; static const u16 smokeID[] = { dPa_RM(ID_ZI_S_DIGTHROUGHA_A), dPa_RM(ID_ZI_S_DIGTHROUGHA_B), dPa_RM(ID_ZI_S_DIGTHROUGHA_C), dPa_RM(ID_ZI_S_DIGTHROUGHA_D), }; if (param_0 != 0) { mDemo.setSpecialDemoType(); } else if (!dComIfGp_event_compulsory(this, NULL, 0xFFFF)) { return 0; } else { mDemo.setSpecialDemoType(); } commonProcInit(PROC_WOLF_DIG_THROUGH); int poly_att = mGndPolyAtt0; if (param_0 == 0) { if (fopAcM_seenActorAngleY(mPriActorOwn, this) <= 0x4000) { shape_angle.y = mPriActorOwn->shape_angle.y + 0x8000; } else { shape_angle.y = mPriActorOwn->shape_angle.y; } current.angle.y = shape_angle.y; current.pos.x = mPriActorOwn->current.pos.x; current.pos.z = mPriActorOwn->current.pos.z; ((daObjDigholl_c*)mPriActorOwn)->onDigStart(); mProcVar4.field_0x3010 = ((daObjDigholl_c*)mPriActorOwn)->getSceneNum(); if (mProcVar4.field_0x3010 >= 0) { field_0x3198 = 1; } else { field_0x3198 = 3; } dCam_getBody()->StartEventCamera(0x1E, fopAcM_GetID(this), "Type", 1, &field_0x3198, 0); cXyz sp8(current.pos.x, 30.0f + mPriActorOwn->current.pos.y, current.pos.z); if (fopAcM_gc_c::gndCheck(&sp8)) { poly_att = fopAcM_gc_c::getPolyAtt0(); } } else { field_0x3198 = -1; mProcVar4.field_0x3010 = -1; current.pos.x -= 30.0f * cM_ssin(shape_angle.y); current.pos.z -= 30.0f * cM_scos(shape_angle.y); } mProcVar5.field_0x3012 = param_0; const u16* effList; if (poly_att == 13) { effList = snowID; } else { effList = smokeID; } for (int i = 0; i < 4; i++, effList++) { dComIfGp_particle_set(*effList, ¤t.pos, &shape_angle, NULL); } seStartOnlyReverb(Z2SE_WOLF_DIG_HOLE_THROUGH); setSingleAnimeWolfBase(WANM_DIG_UNDER); setFaceBasicTexture(FTANM_WL_THROUGH); mNormalSpeed = 0.0f; speed.y = 0.0f; setSpecialGravity(0.0f, maxFallSpeed, 0); field_0x3588 = l_wolfBaseAnime; field_0x2f99 = 4; field_0x34d4 = l_wolfBaseAnime; mProcVar3.field_0x300e = 0; return 1; } int daAlink_c::procWolfDigThrough() { daPy_frameCtrl_c* frameCtrl_p = mUnderFrameCtrl; field_0x2f99 = 4; if (mProcVar3.field_0x300e != 0) { onSceneChangeArea(mProcVar4.field_0x3010, 0xFF, NULL); } else { if (checkAnmEnd(frameCtrl_p)) { if (mProcVar5.field_0x3012 != 0) { dComIfGs_setRestartRoom(current.pos, shape_angle.y, getStartRoomNo()); } resetSpecialEvent(); if (checkInputOnR()) { checkNextActionWolf(0); } else { field_0x2f99 = 4; procWolfSwimEndWaitInit(1); } return 1; } if (mProcVar4.field_0x3010 >= 0 && frameCtrl_p->checkPass(21.0f)) { mProcVar3.field_0x300e = 1; } } if (frameCtrl_p->checkPass(100.0f)) { voiceStart(Z2SE_WL_V_BREATH_RUN); } return 1; } void daAlink_c::setSmellSave() { if (dComIfGs_getCollectSmell() == dItemNo_SMELL_MEDICINE_e) { dComIfGs_offEventBit(dSv_event_flag_c::F_0387); } dMsgObject_setSmellType(mProcVar5.field_0x3012); if (mProcVar5.field_0x3012 == dItemNo_SMELL_MEDICINE_e) { dComIfGs_onEventBit(dSv_event_flag_c::F_0387); } else if (mProcVar5.field_0x3012 == dItemNo_SMELL_CHILDREN_e) { fopAcM_onSwitch(this, 102); } else if (mProcVar5.field_0x3012 == dItemNo_SMELL_YELIA_POUCH_e) { fopAcM_onSwitch(this, 103); } else if (mProcVar5.field_0x3012 == dItemNo_SMELL_FISH_e) { dComIfGs_onEventBit(dSv_event_flag_c::F_0801); } else if (mProcVar5.field_0x3012 == dItemNo_SMELL_POH_e) { dComIfGs_onEventBit(dSv_event_flag_c::F_0810); } setGetSubBgm(mProcVar5.field_0x3012); } int daAlink_c::procWolfGetSmellInit() { if (!dComIfGp_event_compulsory(this, NULL, 0xFFFF)) { return 0; } mDemo.setSpecialDemoType(); commonProcInit(PROC_WOLF_GET_SMELL); setSingleAnimeWolfBaseSpeed(WANM_SMELL, mpHIO->mWolf.mWlChain.m.mSniffAnmSpeed, mpHIO->mWolf.mWlChain.m.mSniffInterp); voiceStartLevel(Z2SE_WL_V_SNIFF); shape_angle.y = fopAcM_searchActorAngleY(this, mPriActorOwn); current.angle.y = shape_angle.y; current.pos.x = mPriActorOwn->current.pos.x - cM_ssin(shape_angle.y) * 100.0f; current.pos.z = mPriActorOwn->current.pos.z - cM_scos(shape_angle.y) * 100.0f; field_0x280c.setData(mPriActorOwn); static_cast(mPriActorOwn)->field_0x588 = 1; static_cast(mPriActorOwn)->field_0x587 = 0; mProcVar5.field_0x3012 = static_cast(mPriActorOwn)->field_0x589; fopAcM_OnStatus(mPriActorOwn, 0x800); dComIfGp_setPlayerStatus1(0, 0x4000000); mProcVar2.field_0x300c = 0; if (dComIfGs_getCollectSmell() == dItemNo_NONE_e) { field_0x3198 = 0xBBC; } else { field_0x3198 = 0xBBB; } field_0x319c = -1; if (mProcVar5.field_0x3012 == dItemNo_SMELL_YELIA_POUCH_e) { field_0x319c = 0x2220; } else if (mProcVar5.field_0x3012 == dItemNo_SMELL_CHILDREN_e) { field_0x319c = 0x2240; } if (field_0x319c < 0 || dComIfGs_isEventBit(field_0x319c)) { field_0x319c = -1; } mProcVar4.field_0x3010 = 0; mNormalSpeed = 0.0f; field_0x3588 = l_wolfBaseAnime; onWolfEyeUp(); return 1; } int daAlink_c::procWolfGetSmell() { kytag03_class* kytag3_p = (kytag03_class*)field_0x280c.getActor(); if (field_0x319c >= 0) { if (checkSpecialDemoMode()) { dComIfGp_getEvent()->reset(this); dComIfGp_clearPlayerStatus1(0, 0x4000000); if (mProcVar5.field_0x3012 == dItemNo_SMELL_YELIA_POUCH_e) { fopAcM_orderOtherEvent(this, "SMELL_1st", 0xFFFF, 0x400, 1); } else { fopAcM_orderOtherEvent(this, "SMELL_Child", 0xFFFF, 0x400, 1); } mDemo.setSystemDemoType(); } else if (mDemo.getParam0() == 0) { dComIfGs_onEventBit(field_0x319c); dComIfGp_evmng_cutEnd(mAlinkStaffId); if (kytag3_p != NULL) { kytag3_p->field_0x588 = 0; } } } if (checkUnderMove0BckNoArcWolf(WANM_SMELL)) { voiceStartLevel(Z2SE_WL_V_SNIFF); } if (mProcVar4.field_0x3010 != 0) { field_0x2f99 = 4; } if (mProcVar2.field_0x300c != 0) { if (mMsgFlow.doFlow(this, NULL, 0)) { if (kytag3_p != NULL) { kytag3_p->field_0x588 = 0; } resetSpecialEvent(); } else if (mMsgFlow.getChoiceNo() == 0 && mProcVar5.field_0x3012 != dComIfGs_getCollectSmell()) { setSmellSave(); } } else if (mProcVar4.field_0x3010 == 0) { if ((kytag3_p == NULL || (field_0x319c < 0 && kytag3_p->field_0x588 == 2)) || (mDemo.getDemoMode() == 0x37 && mDemo.getParam0() == 1)) { setSingleAnimeWolf(WANM_GET_A, 1.0f, 10.0f, -1, 3.0f); dComIfGp_setPlayerStatus1(0, 0x4000000); if (kytag3_p != NULL) { fopAcM_OnStatus(kytag3_p, 0x800); } mProcVar4.field_0x3010 = 1; dCam_getBody()->StartEventCamera(8, fopAcM_GetID(this), 0); field_0x2f99 = 12; if (field_0x3198 == 0xBBC) { setSmellSave(); } } else if (mProcVar0.field_0x3008 != 0) { mProcVar0.field_0x3008--; } } else if (checkAnmEnd(mUnderFrameCtrl)) { setSingleAnimeWolfBase(WANM_GET); field_0x2f99 = 12; mProcVar2.field_0x300c = 1; mMsgFlow.init(this, field_0x3198, 0, NULL); } return 1; }