Files
dusklight/src/d/actor/d_a_alink_wolf.inc
T

9535 lines
301 KiB
C++

/**
* 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;
field_0x2060->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;
field_0x33a0 = 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<J3DModelData*>(dComIfG_getObjectRes(l_wArcName, 14)), 0x20200);
#ifdef TARGET_PC
// Update Wolf Link's eye maxLOD to prevent the eyes from disappearing
{
J3DTexture* tex = mpLinkModel->getModelData()->getTexture();
JUTNameTab* nametable = mpLinkModel->getModelData()->getTextureName();
if (tex != nullptr && nametable != nullptr) {
for (u16 i = 0; i < tex->getNum(); i++) {
const char* tex_name = nametable->getName(i);
if (tex_name != NULL && strcmp(tex_name, "wl_eyeball") == 0) {
ResTIMG* timg = tex->getResTIMG(i);
timg->maxLOD = 0;
}
}
}
}
#endif
J3DModelData* chainModelData = static_cast<J3DModelData*>(dComIfG_getObjectRes(l_wArcName, 15));
for (u16 i = 0; i < 4; i++) {
mpWlChainModels[i] = initModel(chainModelData, 0);
}
mpWlMidnaModel = initModelEnv(static_cast<J3DModelData*>(dComIfG_getObjectRes(l_wArcName, 10)), 0x1020200);
mpWlMidnaMaskModel =
initModel(static_cast<J3DModelData*>(dComIfG_getObjectRes(l_wArcName, 7)), 0x1000000);
mpWlMidnaHandModel =
initModel(static_cast<J3DModelData*>(dComIfG_getObjectRes(l_wArcName, 6)), 0x1000000);
mpWlMidnaHairModel =
initModelEnv(static_cast<J3DModelData*>(dComIfG_getObjectRes(l_wArcName, 11)), 0x1000000);
#ifdef TARGET_PC
// Update Midna's eye maxLOD to prevent the eyes from disappearing
{
J3DTexture* tex = mpWlMidnaModel->getModelData()->getTexture();
JUTNameTab* nametable = mpWlMidnaModel->getModelData()->getTextureName();
if (tex != nullptr && nametable != nullptr) {
for (u16 i = 0; i < tex->getNum(); i++) {
const char* tex_name = nametable->getName(i);
if (tex_name != NULL && strcmp(tex_name, "midona_eyeball") == 0) {
ResTIMG* timg = tex->getResTIMG(i);
timg->maxLOD = 0;
}
}
}
}
#endif
mpDMidnaBrk = static_cast<J3DAnmTevRegKey*>(dComIfG_getObjectRes(l_wArcName, 18));
mpDMidnaBrk->searchUpdateMaterialID(mpWlMidnaModel->getModelData());
mpWlMidnaModel->getModelData()->entryTevRegAnimator(mpDMidnaBrk);
mpDMidnaBrk->setFrame(1.0f);
mpDMidnaMaskBrk = static_cast<J3DAnmTevRegKey*>(dComIfG_getObjectRes(l_wArcName, 21));
mpDMidnaMaskBrk->searchUpdateMaterialID(mpWlMidnaMaskModel->getModelData());
mpWlMidnaMaskModel->getModelData()->entryTevRegAnimator(mpDMidnaMaskBrk);
mpDMidnaMaskBrk->setFrame(1.0f);
mpDMidnaHandBrk = static_cast<J3DAnmTevRegKey*>(dComIfG_getObjectRes(l_wArcName, 20));
mpDMidnaHandBrk->searchUpdateMaterialID(mpWlMidnaHandModel->getModelData());
mpWlMidnaHandModel->getModelData()->entryTevRegAnimator(mpDMidnaHandBrk);
mpDMidnaHandBrk->setFrame(1.0f);
mpDMidnaHairHandBrk = static_cast<J3DAnmTevRegKey*>(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;
field_0x30bc = 31;
field_0x30be = 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;
mpGhostLanternModel = 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<J3DModelData*>(dComIfG_getObjectRes("alSumou", 0x31));
mpLinkModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084);
mpLinkHatModel = initModel(static_cast<J3DModelData*>(dComIfG_getObjectRes("alSumou", 0x33)), 0);
mpLinkHandModel = initModel(static_cast<J3DModelData*>(dComIfG_getObjectRes("alSumou", 0x32)), 0);
} else if (checkCasualWearFlg()) {
onNoResetFlg2(FLG2_UNK_100000);
mpLinkModel = initModel(static_cast<J3DModelData*>(dComIfG_getObjectRes(l_bArcName, "bl.bmd")), 0);
mpLinkHatModel =
initModel(static_cast<J3DModelData*>(dComIfG_getObjectRes(l_bArcName, "bl_head.bmd")), 0);
mpLinkHandModel =
initModel(static_cast<J3DModelData*>(dComIfG_getObjectRes(l_bArcName, "bl_hands.bmd")), 0);
} else if (checkZoraWearFlg()) {
mpLinkModel = initModel(static_cast<J3DModelData*>(dComIfG_getObjectRes(l_zArcName, "zl.bmd")), 0);
mpLinkHatModel =
initModel(static_cast<J3DModelData*>(dComIfG_getObjectRes(l_zArcName, "zl_head.bmd")), 0);
mpLinkHandModel =
initModel(static_cast<J3DModelData*>(dComIfG_getObjectRes(l_zArcName, "al_hands.bmd")), 0);
} else if (checkMagicArmorWearFlg()) {
mpLinkModel =
initModel(static_cast<J3DModelData*>(dComIfG_getObjectRes(l_mArcName, "ml.bmd")), 0x1000000);
mpLinkHatModel =
initModel(static_cast<J3DModelData*>(dComIfG_getObjectRes(l_mArcName, "ml_head.bmd")), 0x1000000);
mpLinkHandModel =
initModel(static_cast<J3DModelData*>(dComIfG_getObjectRes(l_mArcName, "al_hands.bmd")), 0);
#if TARGET_PC
if (dComIfGs_getRupee() != 0 || dusk::getSettings().game.freeMagicArmor)
#else
if (dComIfGs_getRupee() != 0)
#endif
{
setMagicArmorBrk(1);
} else {
setMagicArmorBrk(0);
}
mMagicArmorBodyBrk->setFrame(mMagicArmorBodyBrk->getFrameMax());
mMagicArmorHeadBrk->setFrame(mMagicArmorHeadBrk->getFrameMax());
} else {
mpLinkModel = initModel(static_cast<J3DModelData*>(dComIfG_getObjectRes(l_kArcName, "al.bmd")), 0);
mpLinkHatModel =
initModel(static_cast<J3DModelData*>(dComIfG_getObjectRes(l_kArcName, "al_head.bmd")), 0);
mpLinkHandModel =
initModel(static_cast<J3DModelData*>(dComIfG_getObjectRes(l_kArcName, "al_hands.bmd")), 0);
}
if (checkNoResetFlg2(FLG2_UNK_200000) || !checkZoraWearFlg()) {
mpLinkFaceModel =
initModel(static_cast<J3DModelData*>(dComIfG_getObjectRes(mArcName, "al_face.bmd")), 0x20200);
} else {
mpLinkFaceModel =
initModel(static_cast<J3DModelData*>(dComIfG_getObjectRes(mArcName, "zl_face.bmd")), 0x20200);
}
#ifdef TARGET_PC
// Update Adult Link's eye maxLOD to prevent the eyes from disappearing
{
J3DTexture* tex = mpLinkFaceModel->getModelData()->getTexture();
JUTNameTab* nametable = mpLinkFaceModel->getModelData()->getTextureName();
if (tex != nullptr && nametable != nullptr) {
for (u16 i = 0; i < tex->getNum(); i++) {
const char* tex_name = nametable->getName(i);
if (tex_name != nullptr &&
(strcmp(tex_name, "al_eyeball") == 0 || strcmp(tex_name, "highlight02") == 0 ||
strcmp(tex_name, "eye_kage01") == 0))
{
ResTIMG* timg = tex->getResTIMG(i);
timg->maxLOD = 0;
}
}
}
}
#endif
modelData = static_cast<J3DModelData*>(dComIfG_getObjectRes(mArcName, "al_bootsH.bmd"));
u16 i;
for (i = 0; i < 2; i++) {
mpLinkBootModels[i] = initModel(modelData, 0);
}
mpKanteraModel = initModelEnv(static_cast<J3DModelData*>(dComIfG_getObjectRes(mArcName, "al_kantera.bmd")), 0);
modelData = static_cast<J3DModelData*>(dComIfG_getObjectRes(mArcName, "ef_ktGlow.bmd"));
mpKanteraGlowModel = initModel(modelData, 0x200);
mpKanteraGlowBtk = static_cast<J3DAnmTextureSRTKey*>(dComIfG_getObjectRes(mArcName, "ef_ktGlow.btk"));
mpKanteraGlowBtk->setFrame(0.0f);
mpKanteraGlowBtk->searchUpdateMaterialID(modelData);
modelData->entryTexMtxAnimator(mpKanteraGlowBtk);
mpGhostLanternModel = initModelEnv(static_cast<J3DModelData*>(dComIfG_getObjectRes("E_HP", "hp_ori.bmd")), 0);
modelData = static_cast<J3DModelData*>(dComIfG_getObjectRes(mArcName, "ef_ktGlow.bmd"));
mpGhostLanternGlowModel = initModel(modelData, 0x200);
mpGhostLanternGlowBtk = static_cast<J3DAnmTextureSRTKey*>(dComIfG_getObjectRes(mArcName, "ef_ktGlow.btk"));
mpGhostLanternGlowBtk->setFrame(0.0f);
mpGhostLanternGlowBtk->searchUpdateMaterialID(modelData);
modelData->entryTexMtxAnimator(mpGhostLanternGlowBtk);
mWoodSwordModel = initModel(static_cast<J3DModelData*>(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 TARGET_PC
if (dComIfGs_getRupee() != 0 || dusk::getSettings().game.freeMagicArmor) {
#else
if (dComIfGs_getRupee() != 0) {
#endif
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);
mpGhostLanternModel->setUserArea((uintptr_t)this);
mpGhostLanternModel->getModelData()->getJointNodePointer(1)->setCallBack(daAlink_ghostLanternModelCallBack);
mZ2Link.setLinkState(var_r27);
#if VERSION != VERSION_SHIELD_DEBUG
if (checkHookshotReadyMaterialOffMode()) {
setHookshotReadyMaterial();
}
#endif
if (param_0) {
fopAcM_SetMtx(this, mpLinkModel->getBaseTRMtx());
model = mpLinkModel;
field_0x2060->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;
field_0x30bc = 21;
field_0x30be = 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>((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(&current.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(&current.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(&current.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(&current.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(&current.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) {
field_0x2060->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) {
field_0x2060->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], &current.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 (!field_0x2060->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 (field_0x2060->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(&current.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, &current.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(&current.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(&current.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;
field_0x2060->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;
field_0x2060->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(&current.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(&current.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 (field_0x27f4 != NULL) {
name = fopAcM_GetName(field_0x27f4);
} else {
name = fpcNm_ALINK_e;
}
if (name == fpcNm_Tag_WaraHowl_e) {
shape_angle.y = field_0x27f4->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*)field_0x27f4;
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<daTag_Howl_c*>(field_0x27f4)->getCurveID());
} else if (name == fpcNm_Obj_WindStone_e) {
mZ2WolfHowlMgr.setCorrectCurve(static_cast<daWindStone_c*>(field_0x27f4)->getTuneId());
mProcVar0.field_0x3008 = static_cast<daWindStone_c*>(field_0x27f4)->getNextSceneId();
mProcVar4.field_0x3010 = 1;
} else if (name == fpcNm_Obj_SmWStone_e) {
mZ2WolfHowlMgr.setCorrectCurve(static_cast<daSmWStone_c*>(field_0x27f4)->getTuneId());
mProcVar4.field_0x3010 = 1;
} else if (name == fpcNm_Tag_WaraHowl_e) {
mZ2WolfHowlMgr.setCorrectCurve(static_cast<daTagWrHowl_c*>(field_0x27f4)->getTuneId());
} else {
mZ2WolfHowlMgr.setCorrectCurve(-1);
}
} else {
#if TARGET_PC
if (mZ2WolfHowlMgr.getCorrectCurveID() != 9) {
mZ2WolfHowlMgr.setCorrectCurve(-1);
}
#else
mZ2WolfHowlMgr.setCorrectCurve(-1);
#endif
}
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), nullptr);
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);
field_0x2060->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 {
#if TARGET_PC
if (daAlink_getAlinkActorClass()->getCorrectCurveID() == 9) {
if (dComIfGp_roomControl_getTimePass()) {
g_env_light.time_change_rate = 1.0f;
dComIfGp_event_reset();
dCam_getBody()->EndEventCamera(fopAcM_GetID(this));
} else {
setWolfHowlNotHappen(isSkipEdge);
}
return 1;
}
#endif
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<daKago_c*>(actor_p)->setEvent();
static_cast<daKago_c*>(actor_p)->setKagoPath(mProcVar5.field_0x3012);
} else if (actorName == fpcNm_OBJ_SEKIZOA_e) {
static_cast<daObj_Sekizoa_c*>(actor_p)->setWolfHowling();
} else if (actorName == fpcNm_E_PM_e) {
static_cast<daE_PM_c*>(actor_p)->AppearSet();
} else if (actorName == fpcNm_HORSE_e) {
daHorse_c* horse = static_cast<daHorse_c*>(actor_p);
int ret = horse->callHorse(&current.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<daNPC_TK_c*>(actor_p)->setEventWolf();
static_cast<daNPC_TK_c*>(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], &current.pos, TRUE);
if (hit_actor == NULL) {
hit_actor = checkWolfRopeHit(&mAtSph, &current.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(&current.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, &current.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()) {
field_0x30a0 = -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(&current.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) {
field_0x2060->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);
field_0x2060->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()) {
field_0x30a0 = -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()) {
field_0x30a0 = -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<daObjCrope_c*>(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()) {
field_0x30a0 = -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(&current.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()) {
field_0x30a0 = -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(&current.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>((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 (field_0x27f4 != NULL && fopAcM_GetName(field_0x27f4) == fpcNm_Tag_Wljump_e) {
wljump_p = field_0x27f4;
} else if (partner_p != NULL && fopAcM_GetName(partner_p) == fpcNm_Tag_Wljump_e) {
wljump_p = partner_p;
}
if (wljump_p != NULL) {
return static_cast<daTagWljump_c*>(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(&current.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<cXyz*>(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<daObj_Sekizoa_c*>(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 (field_0x2060->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) {
field_0x2060->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(&current.pos.x, field_0x37c8.x, 0.5f, 3.0f, 1.0f);
cLib_addCalc(&current.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);
}
}
field_0x310c = 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(&current.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 (field_0x27f4 != NULL && fopAcM_GetName(field_0x27f4) == fpcNm_Obj_Drop_e) {
setDoStatus(BUTTON_STATUS_UNK_57);
if (doTrigger()) {
fopAcM_setCarryNow(field_0x27f4, 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<J3DModelData*>(dComIfG_getObjectRes(l_arcName, 0x25)), 0x200);
field_0x0718 = static_cast<J3DAnmTextureSRTKey*>(dComIfG_getObjectRes(l_arcName, 0x49));
field_0x0718->searchUpdateMaterialID(mHeldItemModel->getModelData());
mpHookSound = JKR_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, &current.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 (field_0x2060->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(&current.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(&current.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<f32>(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<fopEn_enemy_c*>(mTargetedActor)->checkDeadFlg()))
{
mProcVar4.field_0x3010 = 0;
} else {
mProcVar4.field_0x3010 = 1;
}
if ((mTargetedActor != NULL && fopAcM_GetGroup(mTargetedActor) == fopAc_ENEMY_e && param_0 &&
!static_cast<fopEn_enemy_c*>(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(&current.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<fopEn_enemy_c*>(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(&current.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<daE_YMB_c*>(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(&current.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, &current.pos, &current.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(&current.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(&current.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, &current.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(field_0x27f4)) {
return checkNextActionWolf(0);
}
if (fopAcM_GetName(field_0x27f4) == fpcNm_Obj_MasterSword_e) {
setGrabItemActor(field_0x27f4);
return 1;
}
commonProcInit(PROC_WOLF_GRAB_UP);
f32 var_f31;
if (!fopAcM_CheckCarryType(field_0x27f4, 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(field_0x27f4);
shape_angle.y = fopAcM_searchActorAngleY(this, field_0x27f4);
current.angle.y = shape_angle.y;
mProcVar2.field_0x300c = shape_angle.y;
field_0x37c8 = field_0x27f4->current.pos - field_0x3510;
mProcVar3.field_0x300e = 0;
if (fopAcM_GetName(field_0x27f4) != fpcNm_Obj_Drop_e &&
fopAcM_GetName(field_0x27f4) != fpcNm_Obj_Sword_e)
{
f32 prev_x = current.pos.x;
f32 prev_z = current.pos.z;
current.pos.x = field_0x27f4->current.pos.x - var_f31 * cM_ssin(shape_angle.y);
current.pos.z = field_0x27f4->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 = field_0x27f4->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(field_0x27f4, 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, field_0x27f4);
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(field_0x27f4, fopAcM_CARRY_TYPE_1)) {
mProcVar2.field_0x300c = 1;
} else {
mProcVar2.field_0x300c = 0;
}
field_0x280c.setData(field_0x27f4);
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(&current.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);
}
#if TARGET_PC
if (field_0x280c.getActor() == NULL) {
return checkNextActionWolf(0);
}
#endif
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(&current.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();
field_0x27f4->actor_status |= fopAcStts_STAFF_EXTRA_e;
commonProcInit(PROC_WOLF_GANON_CATCH);
field_0x280c.setData(field_0x27f4);
static_cast<fopEn_enemy_c*>(field_0x27f4)->setThrowModeCatch();
setSingleAnimeWolfBase(WANM_PIG_GANON_CATCH_ST);
shape_angle.y = cLib_targetAngleY(&current.pos, &field_0x27f4->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(field_0x27f4);
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<daObjWchain_c*>(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(&current.pos, &chain->getJumpAimPos()), 2, 0x2000, 0x800);
current.angle.y = shape_angle.y;
} else if (mProcVar3.field_0x300e == 0) {
shape_angle.y = cLib_targetAngleY(&current.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<daObjWchain_c*>(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<daObjWchain_c*>(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) && field_0x27f4 != NULL && fopAcM_GetName(field_0x27f4) == fpcNm_Obj_Digpl_e) {
int type = ((daObjDigpl_c*)field_0x27f4)->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 (field_0x27f4 != NULL) {
mProcVar1.mDigActorName = fopAcM_GetName(field_0x27f4);
} 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 = field_0x27f4;
} 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* )field_0x27f4)->startDig();
} else if (mProcVar1.mDigActorName == fpcNm_Obj_Lv4DigSand_e) {
((daObjL4DigSand_c*)field_0x27f4)->startDig();
}
field_0x280c.setData(field_0x27f4);
} 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(field_0x27f4, this) <= 0x4000) {
shape_angle.y = field_0x27f4->shape_angle.y + 0x8000;
} else {
shape_angle.y = field_0x27f4->shape_angle.y;
}
current.angle.y = shape_angle.y;
current.pos.x = field_0x27f4->current.pos.x;
current.pos.z = field_0x27f4->current.pos.z;
((daObjDigholl_c*)field_0x27f4)->onDigStart();
mProcVar4.field_0x3010 = ((daObjDigholl_c*)field_0x27f4)->getSceneNum();
if (mProcVar4.field_0x3010 >= 0) {
field_0x3198 = 1;
} else {
field_0x3198 = 3;
}
dCam_getBody()->StartEventCamera(0x1E, fopAcM_GetID(this), "Type", 1, &field_0x3198, nullptr);
cXyz sp8(current.pos.x, 30.0f + field_0x27f4->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, &current.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, field_0x27f4);
current.angle.y = shape_angle.y;
current.pos.x = field_0x27f4->current.pos.x - cM_ssin(shape_angle.y) * 100.0f;
current.pos.z = field_0x27f4->current.pos.z - cM_scos(shape_angle.y) * 100.0f;
field_0x280c.setData(field_0x27f4);
static_cast<kytag03_class*>(field_0x27f4)->field_0x588 = 1;
static_cast<kytag03_class*>(field_0x27f4)->field_0x587 = 0;
mProcVar5.field_0x3012 = static_cast<kytag03_class*>(field_0x27f4)->field_0x589;
fopAcM_OnStatus(field_0x27f4, 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), nullptr);
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;
}