Files
dusklight/src/d/actor/d_a_alink_hook.inc
T
2026-02-27 11:20:39 -07:00

2129 lines
67 KiB
C++

/**
* d_a_alink_hook.inc
* Player Clawshot action handling
*/
#include "d/actor/d_a_alink.h"
#include "d/actor/d_a_b_dr.h"
#include "d/actor/d_a_obj_swhang.h"
#include "d/actor/d_a_obj_chandelier.h"
#include "JSystem/J3DGraphBase/J3DMaterial.h"
enum {
HS_MODE_NONE_e,
HS_MODE_READY_e,
HS_MODE_SHOOT_e = 3,
HS_MODE_FLY_e,
HS_MODE_RETURN_e = 6,
};
void daAlink_c::hsChainShape_c::draw() {
static const int dummy = 0;
daAlink_c* alink = (daAlink_c*)getUserArea();
J3DModelData* modelData = alink->getItemModelData();
J3DMaterial* material = modelData->getMaterialNodePointer(0);
daAlink_hsChainLight_c* chainLight = (daAlink_hsChainLight_c*)&alink->tevStr;
j3dSys.setVtxPos(modelData->getVtxPosArray());
j3dSys.setVtxNrm(modelData->getVtxNrmArray());
j3dSys.setVtxCol(modelData->getVtxColorArray(0));
J3DShape::resetVcdVatCache();
material->loadSharedDL();
material->getShape()->loadPreDrawSetting();
GXColor ambColor;
ambColor.r = chainLight->AmbCol.r;
ambColor.g = chainLight->AmbCol.g;
ambColor.b = chainLight->AmbCol.b;
ambColor.a = chainLight->AmbCol.a;
GXSetChanAmbColor(GX_COLOR0A0, ambColor);
GXSetChanMatColor(GX_COLOR0A0, g_whiteColor);
dKy_setLight_again();
dKy_GxFog_tevstr_set(chainLight);
GXLoadLightObjImm(chainLight->getLightObj(), GX_LIGHT0);
if (alink->checkIronBallEquip()) {
cXyz* ppos = alink->getIronBallChainPos();
csXyz* pangle = alink->getIronBallChainAngle();
ppos++;
pangle++;
int i;
for (i = 0; i < 101; i++, ppos++, pangle++) {
mDoMtx_stack_c::copy(j3dSys.getViewMtx());
mDoMtx_stack_c::transM(*ppos);
mDoMtx_stack_c::ZXYrotM(*pangle);
mDoMtx_stack_c::scaleM(2.0f, 2.0f, 2.0f);
GXLoadPosMtxImm(mDoMtx_stack_c::get(), GX_PNMTX0);
GXLoadNrmMtxImm(mDoMtx_stack_c::get(), GX_PNMTX0);
material->getShape()->simpleDrawCache();
}
cXyz spC8;
cXyz spBC;
for (i = 0; i < 2; i++) {
cXyz* sp48;
csXyz* sp44;
s16 sp14;
s16 sp12;
s16 sp10;
s16 spE;
if (i == 0) {
sp48 = alink->getIronBallChainPos() + alink->getIronBallHandChainNum();
spC8 = alink->getIronBallChainHandRootPos() - *sp48;
sp44 = alink->getIronBallChainAngle() + alink->getIronBallHandChainNum();
spE = 0x3000;
} else {
sp48 = alink->getIronBallChainPos();
mDoMtx_stack_c::transS(*(alink->getIronBallChainPos() + 1));
mDoMtx_stack_c::ZXYrotM(*(alink->getIronBallChainAngle() + 1));
mDoMtx_stack_c::multVec(&l_ironBallChainVec, &spC8);
spC8 -= *sp48;
sp44 = alink->getIronBallChainAngle() + 1;
spE = -0x3000;
}
sp10 = (s16)sp44->y;
sp14 = sp44->z + spE;
f32 var_f29 = spC8.abs();
spBC = *sp48;
if (var_f29 > 5.0f) {
f32 sp40 = spC8.absXZ();
if (sp40 >= 1.0f) {
sp10 = spC8.atan2sX_Z();
}
sp12 = spC8.atan2sY_XZ();
cXyz spB0 = spC8 * (10.0f / var_f29);
while (var_f29 > 5.0f) {
mDoMtx_stack_c::copy(j3dSys.getViewMtx());
mDoMtx_stack_c::transM(spBC);
mDoMtx_stack_c::ZXYrotM(sp12, sp10, sp14);
mDoMtx_stack_c::scaleM(2.0f, 2.0f, 2.0f);
GXLoadPosMtxImm(mDoMtx_stack_c::get(), GX_PNMTX0);
GXLoadNrmMtxImm(mDoMtx_stack_c::get(), GX_PNMTX0);
material->getShape()->simpleDrawCache();
spBC += spB0;
var_f29 -= 10.0f;
sp14 += spE;
}
}
}
} else {
const cXyz& chainRootPos = alink->getHsChainRootPos();
const cXyz& chainTopPos = alink->getHsChainTopPos();
cXyz maxDistance = chainRootPos - chainTopPos;
f32 maxDistanceF = maxDistance.abs();
f32 var_f30;
cXyz sp98;
csXyz sp6C;
if (maxDistanceF > 1.0f) {
maxDistance *= (1.0f / maxDistanceF);
var_f30 = 0.0f;
sp98 = chainTopPos;
sp6C.set(maxDistance.atan2sY_XZ(), maxDistance.atan2sX_Z(), 0);
sp98 = chainTopPos;
csXyz sp64(sp6C);
f32 sp34 = M_PI / maxDistanceF;
f32 temp_f27;
f32 var_f26 = 0.0f;
f32 var_f28;
var_f28 = 2.5f * alink->getHookshotStopTime();
if (alink->getHookshotStopTime() & 1) {
var_f28 *= -1.0f;
}
(void)0;
while (maxDistanceF > var_f30) {
temp_f27 = var_f28 * cM_fsin(sp34 * var_f30);
s16 spC = cM_atan2s(temp_f27 - var_f26, 5.0f);
sp64.x = sp6C.x + spC;
mDoMtx_stack_c::transS(sp98);
mDoMtx_stack_c::ZXYrotM(sp64);
static const Vec hsVec = {0.0f, 0.0f, 5.0f};
mDoMtx_stack_c::multVec(&hsVec, &sp98);
mDoMtx_stack_c::revConcat(j3dSys.getViewMtx());
GXLoadPosMtxImm(mDoMtx_stack_c::get(), GX_PNMTX0);
GXLoadNrmMtxImm(mDoMtx_stack_c::get(), GX_PNMTX0);
material->getShape()->simpleDrawCache();
ANGLE_ADD_2(sp64.z, 0x3000);
var_f26 = temp_f27;
var_f30 += fabsf(cM_scos(spC)) * 5.0f;
}
}
const cXyz& subChainRootPos = alink->getHsSubChainRootPos();
const cXyz& subChainTopPos = alink->getHsSubChainTopPos();
maxDistance = subChainRootPos - subChainTopPos;
maxDistanceF = maxDistance.abs();
if (maxDistanceF > 1.0f) {
maxDistance *= (1.0f / maxDistanceF);
var_f30 = 0.0f;
sp98 = subChainTopPos;
sp6C.set(maxDistance.atan2sY_XZ(), maxDistance.atan2sX_Z(), 0);
while (maxDistanceF > var_f30) {
mDoMtx_stack_c::copy(j3dSys.getViewMtx());
mDoMtx_stack_c::transM(sp98);
mDoMtx_stack_c::ZXYrotM(sp6C);
GXLoadPosMtxImm(mDoMtx_stack_c::get(), GX_PNMTX0);
GXLoadNrmMtxImm(mDoMtx_stack_c::get(), GX_PNMTX0);
material->getShape()->simpleDrawCache();
sp98 += maxDistance * 5.0f;
ANGLE_ADD_2(sp6C.z, 0x3000);
var_f30 += 5.0f;
}
}
}
}
void daAlink_c::hookshotAtHitCallBack(dCcD_GObjInf* i_atObjInf, fopAc_ac_c* i_tgActor,
dCcD_GObjInf* i_tgObjInf) {
if (i_tgActor != NULL && fopAcM_IsActor(i_tgActor) && !i_tgObjInf->ChkTgHookshotThrough()) {
f32 dist_to_hitpos = getHsChainTopPos().abs(*i_atObjInf->GetAtHitPosP());
if (dist_to_hitpos < mSearchBallScale) {
mSearchBallScale = dist_to_hitpos;
if (checkHookshotWait()) {
if (fopAcM_CheckStatus(i_tgActor, 0x280000)) {
mHookTargetAcKeep.setData(i_tgActor);
} else {
field_0x3494 = 1.0f;
}
} else if (!i_tgObjInf->ChkTgShield()) {
mHookTargetAcKeep.setData(i_tgActor);
field_0x381c = *i_atObjInf->GetAtHitPosP();
} else {
field_0x3494 = 1.0f;
}
}
}
}
static void daAlink_hookshotAtHitCallBack(fopAc_ac_c* i_atActor, dCcD_GObjInf* i_atObjInf,
fopAc_ac_c* i_tgActor, dCcD_GObjInf* i_tgObjInf) {
static_cast<daAlink_c*>(i_atActor)->hookshotAtHitCallBack(i_atObjInf, i_tgActor, i_tgObjInf);
}
cXyz* daAlink_c::getHookshotTopPos() {
if (checkHookshotItem(mEquipItem)) {
return &mHookshotTopPos;
}
return NULL;
}
bool daAlink_c::checkHookshotReturnMode() const {
return checkHookshotItem(mEquipItem) &&
(mItemMode == HS_MODE_FLY_e || mItemMode == 5 || mItemMode == HS_MODE_RETURN_e);
}
bool daAlink_c::checkHookshotShootReturnMode() const {
return (checkHookshotItem(mEquipItem) && mItemMode == HS_MODE_SHOOT_e) ||
checkHookshotReturnMode();
}
void daAlink_c::resetHookshotMode() {
mItemMode = HS_MODE_NONE_e;
initLockAt();
mSearchBallScale = FLT_MAX;
}
BOOL daAlink_c::setEnemyBombHookshot(fopAc_ac_c* i_actor) {
if (mHookTargetAcKeep.getActor() != NULL) {
cancelHookshotCarry();
mHookTargetAcKeep.setData(i_actor);
fopAcM_setHookCarryNow(i_actor);
return true;
}
return false;
}
bool daAlink_c::checkLv7BossRoom() {
return checkStageName("D_MN07A");
}
BOOL daAlink_c::checkHookshotStickBG(cBgS_PolyInfo& i_polyinfo) {
#if DEBUG
if (mpHIO->mItem.mHookshot.m.mForceStick) {
return TRUE;
}
#endif
if (dComIfG_Bgsp().ChkPolyHSStick(i_polyinfo)) {
dBgW_Base* bgw_p = dComIfG_Bgsp().GetBgWBasePointer(i_polyinfo);
if (bgw_p != NULL && bgw_p->ChkPushPullOk()) {
return TRUE;
}
}
return FALSE;
}
void daAlink_c::cancelHookshotCarry() {
if (mHookTargetAcKeep.getActor() != NULL) {
fopAcM_cancelHookCarryNow(mHookTargetAcKeep.getActor());
mHookTargetAcKeep.clearData();
}
}
void daAlink_c::changeHookshotDrawModel() {
if (mEquipItem == fpcNm_ITEM_HOOKSHOT && field_0x3020 == 1) {
J3DModel* tmp = mHeldItemModel;
mHeldItemModel = field_0x0710;
field_0x0710 = tmp;
tmp = mpHookTipModel;
mpHookTipModel = field_0x0714;
field_0x0714 = tmp;
}
}
BOOL daAlink_c::checkHookshotRoofLv7Boss() {
return mCargoCarryAcKeep.getActor() != NULL &&
fopAcM_GetName(mCargoCarryAcKeep.getActor()) == PROC_B_DR;
}
BOOL daAlink_c::checkChaseHookshot() {
if (field_0x2804 == NULL) {
if (mTargetedActor != NULL) {
field_0x2804 = mTargetedActor;
} else {
field_0x2804 = this;
}
} else if (field_0x2804 != mTargetedActor) {
field_0x2804 = this;
}
if (mTargetedActor != NULL) {
s16 actorName = fopAcM_GetName(mTargetedActor);
return field_0x2804 == mTargetedActor &&
(checkBossOctaIealRoom() || actorName == PROC_Obj_FallObj ||
actorName == PROC_B_DR || actorName == PROC_E_PH);
}
return false;
}
BOOL daAlink_c::checkOctaIealSpecialCollect() {
return mProcID == PROC_HOOKSHOT_FLY && checkHookshotItem(mEquipItem) && checkBossOctaIealRoom();
}
BOOL daAlink_c::checkBossOctaIealRoom() {
return checkStageName("D_MN01A");
}
BOOL daAlink_c::checkHookshotWait() const {
return mItemMode == HS_MODE_NONE_e || mItemMode == HS_MODE_READY_e;
}
void daAlink_c::setHookshotCatchNow() {
field_0x3026 = 5;
dComIfGp_getVibration().StartShock(VIBMODE_S_POWER4, 1, cXyz(0.0f, 1.0f, 0.0f));
}
bool daAlink_c::setHookshotCarryOffset(fpc_ProcID i_carryActorID, cXyz const* i_posOffset) {
fopAc_ac_c* actor;
if (dComIfGp_checkPlayerStatus1(0, 0x10000)) {
actor = mCargoCarryAcKeep.getActor();
if (actor != NULL && fopAcM_checkHookCarryNow(actor) &&
i_carryActorID == mCargoCarryAcKeep.getID())
{
field_0x37c8 = *i_posOffset;
return true;
}
}
actor = mHookTargetAcKeep.getActor();
if (actor != NULL && fopAcM_checkHookCarryNow(actor) &&
i_carryActorID == mHookTargetAcKeep.getID())
{
mIronBallCenterPos = *i_posOffset;
return true;
}
return false;
}
void daAlink_c::setHookshotModel() {
J3DAnmTransform* bck = (J3DAnmTransform*)mAnmHeap9.loadDataIdx(dRes_ID_ALANM_BCK_HS_SPIN_e);
JKRHeap* heap = setItemHeap();
if (!mItemBck.init(bck, FALSE, 2, 1.0f, 0, -1, false)) {
JUT_ASSERT(676, FALSE);
}
mHeldItemModel = initModel(loadAramBmd(dRes_ID_ALANM_BMD_AL_HS_e, 0x5C00), 0);
mpHookTipModel = initModel(loadAramBmd(dRes_ID_ALANM_BMD_AL_HS_TIP_e, 0x3800), 0);
field_0x0710 = initModel(mHeldItemModel->getModelData(), 0);
field_0x0714 = initModel(mpHookTipModel->getModelData(), 0);
mpItemModelData = loadAramBmd(dRes_ID_ALANM_BMD_AL_HS_KUSARI_e, 0x1000);
mpHookChain = new hsChainShape_c();
mpHookSound = new Z2SoundObjSimple();
mpHookshotLinChk = new dBgS_ObjLinChk();
mpHookshotLinChk->OffFullGrp();
mpHookshotLinChk->OnWaterGrp();
bck = (J3DAnmTransform*)loadAram(dRes_ID_ALANM_BCK_HS_TIP_OPEN_e, 0x800);
if (!mHookTipBck.init(bck, FALSE, 2, 1.0f, 0, -1, false)) {
JUT_ASSERT(701, FALSE);
}
mDoExt_setCurrentHeap(heap);
resetHookshotMode();
mpHookChain->setUserArea((uintptr_t)this);
field_0x2f94 = 1;
if (mEquipItem == fpcNm_ITEM_W_HOOKSHOT) {
field_0x2f95 = 6;
}
field_0x3020 = 0;
field_0x3024 = 0;
mAtCps[0].SetAtSpl(dCcG_At_Spl_UNK_0);
mAtCps[0].OffAtNoHitMark();
mAtCps[0].SetAtAtp(0);
mAtCps[0].SetR(5.0f);
mAtCps[0].SetAtSe(dCcD_SE_HOOKSHOT_STICK);
mAtCps[0].SetAtType(AT_TYPE_HOOKSHOT);
mAtCps[0].SetAtHitMark(1);
mAtCps[0].OnAtSetBit();
mAtCps[0].SetAtHitCallback(daAlink_hookshotAtHitCallBack);
mAtCps[0].SetAtMtrl(dCcD_MTRL_NONE);
mpHookSound->init(&mHookshotTopPos, 1);
}
void daAlink_c::setHookshotSight() {
cXyz sight_pos;
f32 max_length;
if (checkLv7BossRoom()) {
max_length = mpHIO->mItem.mHookshot.m.mBossMaxLength;
} else {
max_length = mpHIO->mItem.mHookshot.m.mMaxLength;
}
BOOL line_cross = checkSightLine(max_length, &sight_pos);
if (mHookTargetAcKeep.getActor() != NULL) {
mSight.setPos(&mHookTargetAcKeep.getActor()->eyePos);
} else {
mSight.setPos(&sight_pos);
}
if (mItemMode == HS_MODE_READY_e) {
mSight.onDrawFlg();
if ((line_cross && field_0x3494 < 0.0f && checkHookshotStickBG(mRopeLinChk)) ||
mHookTargetAcKeep.getActor() != NULL)
{
mSight.onLockFlg();
if (mHookTargetAcKeep.getActor() != NULL &&
fopAcM_GetName(mHookTargetAcKeep.getActor()) == PROC_B_DR)
{
((daB_DR_c*)mHookTargetAcKeep.getActor())->onTarget();
}
} else {
mSight.offLockFlg();
}
} else {
mSight.offDrawFlg();
}
mHookTargetAcKeep.clearData();
field_0x3494 = -1.0f;
}
void daAlink_c::cancelHookshotShot() {
if (checkHookshotItem(mEquipItem) &&
(mItemMode == HS_MODE_SHOOT_e || mItemMode == 5 || mItemMode == HS_MODE_FLY_e))
{
if (mProcID != PROC_HOOKSHOT_MOVE && mProcID != PROC_HOOKSHOT_FLY &&
mProcID != PROC_HOOKSHOT_SUBJECT)
{
mItemMode = HS_MODE_RETURN_e;
}
}
}
bool daAlink_c::cancelHookshotMove() {
if (mFastShotTime == 0 && mItemMode == HS_MODE_NONE_e) {
if (checkHookshotAnime() &&
((mTargetedActor == NULL && !checkAttentionLock()) || !itemButton()))
{
resetUpperAnime(UPPER_2, -1.0f);
return 1;
}
}
return 0;
}
BOOL daAlink_c::checkHookshotReadyMaterialOffMode() const {
return mProcID == PROC_HOOKSHOT_WALL_SHOOT || mProcID == PROC_HORSE_HOOKSHOT_SUBJECT ||
mProcID == PROC_SWIM_HOOKSHOT_SUBJECT || mProcID == PROC_HOOKSHOT_SUBJECT;
}
void daAlink_c::setHookshotReadyMaterial() {
if (checkNoResetFlg2(FLG2_UNK_80000) || checkCasualWearFlg()) {
mFallVoiceInit = 0;
} else if (checkZoraWearFlg()) {
field_0x32cc = 0x37B;
mFallVoiceInit = 14;
} else if (checkMagicArmorWearFlg()) {
field_0x32cc = 0xC80;
mFallVoiceInit = 13;
} else {
field_0x32cc = 0x11C47;
mFallVoiceInit = 18;
}
}
int daAlink_c::initHookshotUpperAnimeSpeed(BOOL param_0) {
if (checkHookshotWait()) {
if (param_0) {
mUpperFrameCtrl[2].setRate(0.0f);
mUpperFrameCtrl[2].setFrame(0.0f);
getNowAnmPackUpper(UPPER_2)->setFrame(0.0f);
} else {
setWaterInAnmRate(&mUpperFrameCtrl[2], mpHIO->mItem.mHookshot.m.mWaitAnmSpeed);
}
return 1;
}
return 0;
}
void daAlink_c::initHookshotReady() {
mItemMode = HS_MODE_READY_e;
field_0x33e0 = 0.0f;
dComIfGp_getVibration().StartShock(VIBMODE_S_POWER1, 1, cXyz(0.0f, 1.0f, 0.0f));
mItemVar0.field_0x3018 = 3;
field_0x3494 = -1.0f;
}
void daAlink_c::setHookshotReadyAnime() {
{
f32 speed;
if (!checkAttentionLock() && mFastShotTime == 0) {
speed = 0.0f;
} else {
speed = mpHIO->mItem.mHookshot.m.mWaitAnmSpeed;
}
setUpperAnimeBaseSpeed(dRes_ID_ALANM_BCK_HSWAIT_e, speed, 3.0f);
field_0x3020 = 0;
initHookshotReady();
}
}
int daAlink_c::checkUpperItemActionHookshot() {
if (checkHookshotWait()) {
mSearchBallScale = FLT_MAX;
}
if (mItemMode == HS_MODE_READY_e) {
if (!itemButton() && mItemVar0.field_0x3018 == 0 && checkReadyItem()) {
mItemMode = 2;
field_0x3026 = 0;
field_0x3494 = -1.0f;
mHookTargetAcKeep.clearData();
cancelLockAt();
field_0x2804 = NULL;
if (mProcID == PROC_HOOKSHOT_ROOF_SHOOT || mProcID == PROC_HOOKSHOT_WALL_SHOOT) {
daAlink_ANM anmID;
if (mProcID == PROC_HOOKSHOT_ROOF_SHOOT) {
if (field_0x3020 == 0) {
anmID = ANM_HOOKSHOT_HANG_SHOOT_RIGHT;
} else {
anmID = ANM_HOOKSHOT_HANG_SHOOT_LEFT;
}
} else if (field_0x3020 == 0) {
anmID = ANM_HOOKSHOT_WALL_SHOOT_RIGHT;
} else {
anmID = ANM_HOOKSHOT_WALL_SHOOT_LEFT;
}
setSingleAnimeBaseMorf(anmID, 0.0f);
} else if (checkModeFlg(0x40400)) {
setUpperAnimeParam(0x18C, UPPER_2, &mpHIO->mItem.mHookshot.m.mShootAnm);
if (checkModeFlg(0x40000)) {
mNormalSpeed = 0.0f;
}
} else {
mUpperFrameCtrl[2].setRate(0.0f);
mUpperFrameCtrl[2].setFrame(0.0f);
getNowAnmPackUpper(UPPER_2)->setFrame(0.0f);
mNormalSpeed = 0.0f;
onModeFlg(1);
mSpeedModifier = 0.0f;
mNowAnmPackUpper[2].setRatio(0.0f);
setSingleAnimeParam(ANM_HOOKSHOT_SHOOT, &mpHIO->mItem.mHookshot.m.mShootAnm);
}
if (!checkNoResetFlg3(FLG3_UNK_4)) {
dComIfGp_getVibration().StartQuake(VIBMODE_Q_POWER1, 1, cXyz(0.0f, 1.0f, 0.0f));
onNoResetFlg3(FLG3_UNK_4);
}
return 1;
}
} else if (mItemMode == HS_MODE_NONE_e) {
#if PLATFORM_GCN
if (checkModeFlg(0x400) && checkAttentionLock() && mTargetedActor == NULL) {
resetUpperAnime(UPPER_2, 3.0f);
dComIfGp_clearPlayerStatus0(0, 0x4000);
return 1;
}
#endif
if (checkReadyItem() && itemButton()) {
initHookshotReady();
}
} else if (mItemMode == HS_MODE_SHOOT_e) {
if (checkReadyItem() && itemTrigger()) {
mItemMode = HS_MODE_RETURN_e;
}
checkNextActionHookshot();
return 1;
} else if (mItemMode == HS_MODE_RETURN_e) {
checkNextActionHookshot();
return 1;
} else if (mItemMode == 5 || mItemMode == HS_MODE_FLY_e) {
if (field_0x3026 != 0) {
field_0x3026--;
setHookshotTopPosFly();
return 1;
}
return procHookshotFlyInit();
}
if (mItemVar0.field_0x3018 > 0) {
mItemVar0.field_0x3018--;
}
return cancelUpperItemReadyAnime(0);
}
int daAlink_c::checkNextActionHookshot() {
if (mProcID == PROC_HOOKSHOT_ROOF_SHOOT || mProcID == PROC_HOOKSHOT_WALL_SHOOT) {
return 0;
}
if (mFastShotTime != 0 && checkHookshotWait()) {
mFastShotTime--;
}
if (!checkHookshotAnime()) {
setHookshotReadyAnime();
setFastShotTimer();
if (!checkAttentionLock()) {
field_0x2fe4 = shape_angle.y;
}
}
if (!checkAttentionLock() && mFastShotTime == 0) {
if (checkModeFlg(0x400)) {
if (checkCanoeRide()) {
return procCanoeHookshotSubjectInit();
} else {
return procHorseHookshotSubjectInit();
}
} else if (checkModeFlg(0x40000)) {
return procSwimHookshotSubjectInit();
} else {
return procHookshotSubjectInit();
}
} else if (checkModeFlg(0x400)) {
if (checkCanoeRide()) {
return procCanoeHookshotMoveInit();
} else {
return procHorseHookshotMoveInit();
}
} else if (checkModeFlg(0x40000)) {
return procSwimHookshotMoveInit();
} else {
return procHookshotMoveInit();
}
}
void daAlink_c::setHookshotReturnEnd() {
resetHookshotMode();
cancelItemUseQuake(0);
seStartOnlyReverb(Z2SE_LK_HS_WIND_UP_FIN);
if (checkHookshotReadyAnime()) {
mNowAnmPackUpper[2].setRatio(1.0f);
field_0x2060->initOldFrameMorf(3.0f, field_0x30a8, field_0x30aa);
} else if (checkHookshotShootAnime()) {
int _;
f32 anmSpeed;
if (!checkAttentionLock()) {
anmSpeed = 0.0f;
} else {
anmSpeed = mpHIO->mItem.mHookshot.m.mWaitAnmSpeed;
}
setUpperAnimeBaseSpeed(dRes_ID_ALANM_BCK_HSWAIT_e, anmSpeed, 3.0f);
}
mFastShotTime = 0;
}
int daAlink_c::setHookshotHangMoveBGCollect() {
cBgS_PolyInfo* polyinfo;
if (mItemMode == HS_MODE_FLY_e) {
polyinfo = &mPolyInfo3;
} else {
polyinfo = &mPolyInfo2;
}
fopAc_ac_c* carry_actor = mCargoCarryAcKeep.getActor();
if (carry_actor != NULL) {
cXyz sp28(mIronBallBgChkPos);
mDoMtx_stack_c::transS(carry_actor->current.pos);
mDoMtx_stack_c::ZXYrotM(carry_actor->shape_angle);
mDoMtx_stack_c::multVec(&field_0x37c8, &mIronBallBgChkPos);
current.pos += mIronBallBgChkPos - sp28;
ANGLE_ADD(shape_angle.y, mProcVar0.field_0x3008 - carry_actor->shape_angle.y);
current.angle.y = shape_angle.y;
mProcVar0.field_0x3008 = carry_actor->shape_angle.y;
} else if (dComIfG_Bgsp().ChkPolySafe(*polyinfo)) {
if (!checkHookshotStickBG(*polyinfo)) {
return 0;
}
if (dComIfG_Bgsp().ChkMoveBG(*polyinfo)) {
dComIfG_Bgsp().MoveBgTransPos(*polyinfo, 1, &current.pos, &current.angle, &shape_angle);
csXyz sp8(0, field_0x3022, 0);
dComIfG_Bgsp().MoveBgTransPos(*polyinfo, 1, &mIronBallBgChkPos, NULL, &sp8);
field_0x3022 = sp8.y;
s16 movebg_name = getMoveBGActorName(*polyinfo, 1);
if (movebg_name == PROC_Obj_SwHang) {
daObjSwHang_c* swhang = (daObjSwHang_c*)dComIfG_Bgsp().GetActorPointer(*polyinfo);
swhang->setHangPlayer();
f32 prev_y = mIronBallBgChkPos.y;
mIronBallBgChkPos.y = swhang->getHangPos().y;
current.pos.y += mIronBallBgChkPos.y - prev_y;
} else if (movebg_name == PROC_Obj_Chandelier) {
((daObjChandelier_c*)dComIfG_Bgsp().GetActorPointer(*polyinfo))->moveHookOn();
}
}
} else {
return 0;
}
return 1;
}
void daAlink_c::setHookshotTopPosFly() {
fopAc_ac_c* targetAc_p = mHookTargetAcKeep.getActor();
if (mItemMode == 5) {
if (targetAc_p != NULL && fopAcM_checkHookCarryNow(targetAc_p)) {
mDoMtx_stack_c::transS(targetAc_p->current.pos);
mDoMtx_stack_c::ZXYrotM(targetAc_p->shape_angle);
mDoMtx_stack_c::multVec(&mIronBallCenterPos, &mHookshotTopPos);
} else {
mItemMode = HS_MODE_RETURN_e;
}
} else if (!dComIfG_Bgsp().ChkPolySafe(mPolyInfo2) || !checkHookshotStickBG(mPolyInfo2) ||
(targetAc_p != NULL && !fopAcM_checkHookCarryNow(targetAc_p)))
{
mItemMode = HS_MODE_RETURN_e;
} else if (dComIfG_Bgsp().ChkMoveBG(mPolyInfo2)) {
csXyz angle(field_0x301c, field_0x301e, 0);
dComIfG_Bgsp().MoveBgTransPos(mPolyInfo2, true, &mHookshotTopPos, NULL, &angle);
field_0x301c = angle.x;
field_0x301e = angle.y;
}
}
static cXyz l_hookSnowSandHitScale(0.5f, 0.5f, 0.5f);
void daAlink_c::setHookshotPos() {
mDoMtx_stack_c::copy(mpLinkModel->getAnmMtx(mLeftItemJntNo));
mDoMtx_stack_c::transM(-2.0f, 1.0f, 1.0f);
mDoMtx_stack_c::XYZrotM(cM_deg2s(5.7f), cM_deg2s(162.0f), 0);
J3DModel* model;
if (field_0x3020 == 0) {
model = mHeldItemModel;
} else {
model = field_0x0710;
}
model->setBaseTRMtx(mDoMtx_stack_c::get());
mDoMtx_stack_c::copy(mpLinkModel->getAnmMtx(mRightItemJntNo));
mDoMtx_stack_c::transM(-2.0f, 0.0f, 1.0f);
mDoMtx_stack_c::XYZrotM(cM_deg2s(-78.0f), cM_deg2s(182.0f), cM_deg2s(-99.0f));
if (field_0x3020 == 0) {
model = field_0x0710;
} else {
model = mHeldItemModel;
}
model->setBaseTRMtx(mDoMtx_stack_c::get());
if (mItemMode == 2 || mItemMode == HS_MODE_SHOOT_e) {
field_0x33dc += 1.0f;
if (field_0x33dc >= mItemBck.getBckAnm()->getFrameMax()) {
field_0x33dc -= mItemBck.getBckAnm()->getFrameMax();
}
field_0x33e0 = mHookTipBck.getBckAnm()->getFrameMax();
} else if (mItemMode == HS_MODE_FLY_e || mItemMode == 5 || mItemMode == HS_MODE_RETURN_e) {
field_0x33dc -= 1.0f;
if (field_0x33dc < 0.0f) {
field_0x33dc += mItemBck.getBckAnm()->getFrameMax();
}
if (mItemMode == HS_MODE_RETURN_e && mHookTargetAcKeep.getActor() == NULL) {
field_0x33e0 = 0.0f;
} else {
field_0x33e0 = 14.0f;
}
} else if (mItemMode == HS_MODE_READY_e) {
if (!checkHookshotAnime() && mProcID != PROC_HOOKSHOT_WALL_SHOOT &&
mProcID != PROC_HOOKSHOT_ROOF_SHOOT)
{
resetHookshotMode();
field_0x33e0 = 0.0f;
} else {
if (field_0x33e0 < 0.1f) {
seStartOnlyReverb(Z2SE_AL_HS_OPEN);
}
field_0x33e0 += 1.0f;
if (field_0x33e0 > mHookTipBck.getBckAnm()->getFrameMax()) {
field_0x33e0 = mHookTipBck.getBckAnm()->getFrameMax();
}
}
} else {
field_0x33e0 = 0.0f;
}
mItemBck.entry(field_0x0710->getModelData(), 0.0f);
field_0x0710->calc();
static Vec const hookRoot = {0.0f, 0.0f, 23.5f};
mDoMtx_multVec(mHeldItemModel->getBaseTRMtx(), &hookRoot, &mHeldItemRootPos);
mDoMtx_multVec(field_0x0710->getBaseTRMtx(), &hookRoot, &field_0x3810);
mpHookSound->framework(0, mVoiceReverbIntensity);
fopAc_ac_c* targetAc_p = mHookTargetAcKeep.getActor();
f32 var_f29;
f32 return_speed;
f32 shoot_speed;
f32 max_length;
if (checkLv7BossRoom()) {
return_speed = mpHIO->mItem.mHookshot.m.mBossReturnSpeed;
shoot_speed = mpHIO->mItem.mHookshot.m.mBossShootSpeed;
max_length = mpHIO->mItem.mHookshot.m.mBossMaxLength;
} else {
return_speed = mpHIO->mItem.mHookshot.m.mReturnSpeed;
shoot_speed = mpHIO->mItem.mHookshot.m.mShootSpeed;
max_length = mpHIO->mItem.mHookshot.m.mMaxLength;
}
if (mItemMode == HS_MODE_RETURN_e) {
if (targetAc_p != NULL) {
if (checkLv7BossRoom()) {
return_speed = mpHIO->mItem.mHookshot.m.mBossStickReturnSpeed;
} else {
return_speed = mpHIO->mItem.mHookshot.m.mStickReturnSpeed;
}
}
if (checkModeFlg(0x400)) {
return_speed += current.pos.abs(field_0x3798);
}
if (field_0x3026 != 0) {
field_0x3026--;
} else if (mProcID != PROC_ELEC_DAMAGE || !checkHookshotAnime()) {
if (cLib_chasePos(&mHookshotTopPos, mHeldItemRootPos, return_speed)) {
setHookshotReturnEnd();
} else {
cXyz sp1AC = mHookshotTopPos - mHeldItemRootPos;
field_0x301c = sp1AC.atan2sY_XZ();
field_0x301e = sp1AC.atan2sX_Z();
seStartOnlyReverbLevel(Z2SE_LK_HS_WIND_UP);
}
}
if (targetAc_p != NULL) {
if (fopAcM_checkHookCarryNow(targetAc_p)) {
targetAc_p->current.pos = mHookshotTopPos - mIronBallCenterPos;
if (mItemMode == HS_MODE_NONE_e) {
cancelHookshotCarry();
}
} else {
mHookTargetAcKeep.clearData();
}
}
}
if (checkHookshotWait() || mItemMode == 2) {
csXyz* var_r28;
if (mProcID == PROC_HOOKSHOT_WALL_SHOOT || mProcID == PROC_HOOKSHOT_ROOF_SHOOT) {
var_r28 = (csXyz*)&mProcVar3.field_0x300e;
} else {
var_r28 = &mBodyAngle;
}
if (mProcID == PROC_HOOKSHOT_WALL_SHOOT) {
field_0x301e = mProcVar4.field_0x3010;
} else {
field_0x301e = (s16)(shape_angle.y + mBodyAngle.y);
}
if (mTargetedActor != NULL && mItemMode == 2) {
s16 var_r25 = getBodyAngleXAtnActor(0);
if (cLib_distanceAngleS(var_r25, var_r28->x) < 0x3000) {
cXyz sp1A0;
getBodyAngleXBasePos(&sp1A0);
mDoMtx_stack_c::transS(sp1A0);
mDoMtx_stack_c::ZXYrotM(var_r25, field_0x301e, 0);
mDoMtx_stack_c::XrotM(-var_r28->x);
mDoMtx_stack_c::YrotM(-field_0x301e);
mDoMtx_stack_c::transM(-sp1A0.x, -sp1A0.y, -sp1A0.z);
mDoMtx_stack_c::multVec(&mHookshotTopPos, &mHookshotTopPos);
var_r28->x = var_r25;
}
}
field_0x301c = var_r28->x;
mDoMtx_stack_c::ZXYrotS(field_0x301c, field_0x301e, 0);
mDoMtx_stack_c::multVec(&cXyz::BaseZ, &mIronBallCenterPos);
if (mItemMode == 2) {
seStartOnlyReverb(Z2SE_LK_HS_SHOOT);
if (mTargetedActor != NULL) {
field_0x3028 = 1;
} else {
field_0x3028 = 0;
}
} else {
field_0x3828 = mHeldItemRootPos;
}
mDoMtx_stack_c::copy(mHeldItemModel->getBaseTRMtx());
mDoMtx_stack_c::transM(cXyz(hookRoot));
if (mTargetedActor != NULL || mItemMode != 2) {
mDoMtx_stack_c::multVecZero(&mHookshotTopPos);
}
if (mItemMode == 2) {
mItemMode = HS_MODE_SHOOT_e;
}
} else {
cXyz sp194(mHookshotTopPos);
if (mItemMode != HS_MODE_RETURN_e && mItemMode == HS_MODE_SHOOT_e) {
if (mAtCps[0].ChkAtHit() &&
(mHookTargetAcKeep.getActor() != NULL || field_0x3494 > 0.0f))
{
if (mHookTargetAcKeep.getActor() != NULL) {
mHookshotTopPos = field_0x381c;
targetAc_p = mHookTargetAcKeep.getActor();
if (targetAc_p != NULL && (targetAc_p->actor_status & 0x280000)) {
mHookTargetAcKeep.setData(targetAc_p);
mIronBallCenterPos = mHookshotTopPos - targetAc_p->current.pos;
setHookshotCatchNow();
if (targetAc_p->actor_status & 0x200000) {
mItemMode = 5;
field_0x316c.set(field_0x301c, field_0x301e, 0);
mDoMtx_stack_c::ZrotS(-targetAc_p->shape_angle.z);
mDoMtx_stack_c::XrotM(-targetAc_p->shape_angle.x);
mDoMtx_stack_c::YrotM(-targetAc_p->shape_angle.y);
mDoMtx_stack_c::multVecSR(&mIronBallCenterPos, &mIronBallCenterPos);
} else {
mItemMode = HS_MODE_RETURN_e;
}
fopAcM_setHookCarryNow(targetAc_p);
} else {
mHookTargetAcKeep.clearData();
mItemMode = HS_MODE_RETURN_e;
dComIfGp_getVibration().StartShock(VIBMODE_S_POWER1, 1, cXyz(0.0f, 1.0f, 0.0f));
}
} else {
mItemMode = HS_MODE_RETURN_e;
dComIfGp_getVibration().StartShock(VIBMODE_S_POWER1, 1, cXyz(0.0f, 1.0f, 0.0f));
}
} else {
if (checkChaseHookshot()) {
cXyz sp188 = mTargetedActor->eyePos - mHookshotTopPos;
if (sp188.inprod(mIronBallCenterPos) >= 0.0f) {
mIronBallCenterPos = sp188;
mIronBallCenterPos.normalizeZP();
field_0x301c = mIronBallCenterPos.atan2sY_XZ();
field_0x301e = mIronBallCenterPos.atan2sX_Z();
}
}
mHookshotTopPos += mIronBallCenterPos * shoot_speed;
if (checkModeFlg(0x400)) {
mHookshotTopPos += current.pos - field_0x3798;
}
cXyz sp17C = mHookshotTopPos - mHeldItemRootPos;
var_f29 = sp17C.abs();
sp17C *= 1.0f / var_f29;
f32 var_f26 = max_length - 15.0f;
if (var_f29 >= var_f26) {
mHookshotTopPos = mHeldItemRootPos + (sp17C * var_f26);
mItemMode = HS_MODE_RETURN_e;
}
cXyz sp170;
if (field_0x3828.abs2(mHeldItemRootPos) > 400.0f ||
current.pos.abs2(field_0x3798) > 1.0f || shape_angle.y != mPrevAngleY)
{
field_0x3028 = 1;
}
if (field_0x3028 != 0) {
sp170 = mHeldItemRootPos;
} else {
sp170 = field_0x3828;
}
sp170 -= mIronBallCenterPos * 100.0f;
cXyz sp164 = mHookshotTopPos + (mIronBallCenterPos * 15.0f);
mRopeLinChk.Set(&sp170, &sp164, this);
if (dComIfG_Bgsp().LineCross(&mRopeLinChk)) {
u32 hit_se;
if (checkHookshotStickBG(mRopeLinChk)) {
setHookshotCatchNow();
mItemMode = HS_MODE_FLY_e;
hit_se = Z2SE_HIT_HOOKSHOT_STICK;
if (dComIfGp_checkPlayerStatus1(0, 0x2010000) != 0 &&
mCargoCarryAcKeep.getActor() == NULL)
{
mPolyInfo3.SetPolyInfo(mPolyInfo2);
} else {
mPolyInfo3.ClearPi();
}
mPolyInfo2.SetPolyInfo(mRopeLinChk);
if (dComIfG_Bgsp().ChkMoveBG_NoDABg(mRopeLinChk)) {
targetAc_p = dComIfG_Bgsp().GetActorPointer(mRopeLinChk);
mHookTargetAcKeep.setData(targetAc_p);
fopAcM_setHookCarryNow(targetAc_p);
}
} else {
int poly_att0 = dComIfG_Bgsp().GetPolyAtt0(mRopeLinChk);
dComIfGp_getVibration().StartShock(VIBMODE_S_POWER1, 1, cXyz(0.0f, 1.0f, 0.0f));
mItemMode = HS_MODE_RETURN_e;
hit_se = Z2SE_HIT_HOOKSHOT_REBOUND;
cM3dGPla tripla;
dComIfG_Bgsp().GetTriPla(mRopeLinChk, &tripla);
csXyz sp30;
if (poly_att0 == 0xD || poly_att0 == 3) {
u16 particle_id;
if (poly_att0 == 0xD) {
particle_id = dPa_RM(ID_ZI_S_DOWNSNOW_A);
} else {
particle_id = dPa_RM(ID_ZI_S_DOWNSAND_A);
}
sp30.set(cM_atan2s(tripla.mNormal.absXZ(), tripla.mNormal.y),
tripla.mNormal.atan2sX_Z(), 0);
dComIfGp_particle_setPolyColor(
particle_id, mRopeLinChk, mRopeLinChk.GetCrossP(), &tevStr, &sp30,
(cXyz*)&l_hookSnowSandHitScale, 0, NULL, -1, NULL);
if (poly_att0 == 0xD) {
dComIfGp_particle_setPolyColor(
dPa_RM(ID_ZI_S_DOWNSNOW_B), mRopeLinChk, mRopeLinChk.GetCrossP(), &tevStr, &sp30,
(cXyz*)&l_hookSnowSandHitScale, 0, NULL, -1, NULL);
}
} else {
sp30.set(cM_atan2s(tripla.mNormal.y, tripla.mNormal.absXZ()),
cM_atan2s(-tripla.mNormal.x, -tripla.mNormal.z), 0);
dComIfGp_setHitMark(9, NULL, mRopeLinChk.GetCrossP(), &sp30, NULL, 0);
}
}
mHookshotTopPos = mRopeLinChk.GetCross() - (mIronBallCenterPos * 15.0f);
cM3dGPla tripla;
dComIfG_Bgsp().GetTriPla(mRopeLinChk, &tripla);
field_0x316c.set(cM_atan2s(tripla.mNormal.y, tripla.mNormal.absXZ()),
cM_atan2s(-tripla.mNormal.x, -tripla.mNormal.z), 0);
mZ2Link.startHitItemSE(hit_se, dKy_pol_sound_get(&mRopeLinChk), mpHookSound, -1.0f);
} else {
seStartOnlyReverbLevel(Z2SE_LK_HS_CHAIN);
}
}
}
mDoMtx_stack_c::transS(mHookshotTopPos);
mDoMtx_stack_c::ZXYrotM(field_0x301c, field_0x301e, 0);
mpHookshotLinChk->Set(&sp194, &mHookshotTopPos, this);
if (dComIfG_Bgsp().LineCross(mpHookshotLinChk) &&
dComIfG_Bgsp().GetPolyAtt0(*mpHookshotLinChk) != 6)
{
fopKyM_createWpillar(mpHookshotLinChk->GetCrossP(), 0.5f, 0);
mDoAud_seStart(Z2SE_CM_BODYFALL_WATER_S, mpHookshotLinChk->GetCrossP(), 0,
mVoiceReverbIntensity);
}
}
mHookTipBck.entry(mpHookTipModel->getModelData(), field_0x33e0);
mpHookTipModel->setBaseTRMtx(mDoMtx_stack_c::get());
mpHookTipModel->calc();
f32 bck_frame;
if (dComIfGp_checkPlayerStatus1(0, 0x10000)) {
mDoMtx_stack_c::transS(mIronBallBgChkPos);
mDoMtx_stack_c::ZXYrotM(-0x4000, field_0x3022, 0);
bck_frame = 14.0f;
} else if (dComIfGp_checkPlayerStatus1(0, 0x2000000)) {
mDoMtx_stack_c::transS(mIronBallBgChkPos);
mDoMtx_stack_c::ZXYrotM(0, field_0x3022, 0);
bck_frame = 14.0f;
} else {
if (field_0x3024 != 0) {
cLib_chasePos(&mIronBallBgChkPos, field_0x3810, 2.0f * return_speed);
cXyz sp158 = mIronBallBgChkPos - field_0x3810;
if (sp158.abs2() < 1.0f) {
field_0x3024 = 0;
} else {
mDoMtx_stack_c::transS(mIronBallBgChkPos);
mDoMtx_stack_c::ZXYrotM(sp158.atan2sY_XZ(), sp158.atan2sX_Z(), 0);
}
}
if (field_0x3024 == 0) {
mDoMtx_stack_c::copy(field_0x0710->getBaseTRMtx());
mDoMtx_stack_c::transM(cXyz(hookRoot));
mIronBallBgChkPos = field_0x3810;
}
bck_frame = 0.0f;
}
mHookTipBck.entry(field_0x0714->getModelData(), bck_frame);
field_0x0714->setBaseTRMtx(mDoMtx_stack_c::get());
field_0x0714->calc();
}
void daAlink_c::setHookshotRoofWaitAnime() {
daAlink_ANM anm;
if (checkHookshotRoofLv7Boss()) {
if (field_0x3020 == 0) {
anm = ANM_DRAGON_HANG_RIGHT;
} else {
anm = ANM_DRAGON_HANG_LEFT;
}
} else {
if (field_0x3020 == 0) {
anm = ANM_HOOKSHOT_HANG_RIGHT;
} else {
anm = ANM_HOOKSHOT_HANG_LEFT;
}
onModeFlg(0x100);
}
setSingleAnimeBaseMorf(anm, 2.0f);
}
void daAlink_c::setHookshotWallWaitAnime() {
daAlink_ANM anm;
if (field_0x3020 == 0) {
anm = ANM_HOOKSHOT_WALL_RIGHT;
} else {
anm = ANM_HOOKSHOT_WALL_LEFT;
}
setSingleAnimeBaseMorf(anm, 2.0f);
onModeFlg(0x100);
}
void daAlink_c::hookshotRoofTurn() {
BOOL is_play_sound = false;
if (!dComIfGp_checkPlayerStatus0(0, 0x2000)) {
f32 max_rise_y = (mIronBallBgChkPos.y + 15.0f) - 1.5f;
f32 min_descend_y = mIronBallBgChkPos.y - mpHIO->mItem.mHookshot.m.mMaxLength;
if (checkInputOnR()) {
int stick_direction = getDirectionFromAngle(mStickAngle);
s16 angle = 1024.0f * mMoveValue * mMoveValue;
if (stick_direction == DIR_LEFT) {
shape_angle.y += angle;
} else if (stick_direction == DIR_RIGHT) {
shape_angle.y -= angle;
}
current.angle.y = shape_angle.y;
if (stick_direction == DIR_FORWARD) {
current.pos.y += mpHIO->mItem.mHookshot.m.mRoofHangRiseSpeed * mStickValue;
if (current.pos.y > max_rise_y) {
current.pos.y = max_rise_y;
} else {
seStartOnlyReverbLevel(Z2SE_AL_HS_HANGING_UP);
is_play_sound = true;
}
} else if (stick_direction == DIR_BACKWARD) {
f32 descend_speed = mpHIO->mItem.mHookshot.m.mRoofHangDecendSpeed * mMoveValue;
if (checkBootsOrArmorHeavy()) {
descend_speed *= 1.5f;
}
current.pos.y -= descend_speed;
if (min_descend_y > current.pos.y) {
current.pos.y = min_descend_y;
} else {
seStartOnlyReverbLevel(Z2SE_AL_HS_HANGING_DOWN);
is_play_sound = true;
}
}
}
u8 status_dir = 0;
if (current.pos.y < max_rise_y) {
status_dir |= (u8)0x8;
}
if (current.pos.y > min_descend_y) {
status_dir |= (u8)0x2;
}
if (!checkEventRun()) {
dComIfGp_set3DStatusForce(0x78, status_dir, 0);
}
}
if (is_play_sound) {
if (!checkNoResetFlg3(FLG3_UNK_4)) {
dComIfGp_getVibration().StartQuake(1, 1, cXyz(0.0f, 1.0f, 0.0f));
onNoResetFlg3(FLG3_UNK_4);
}
} else {
cancelItemUseQuake(0);
}
}
void daAlink_c::initHookshotRoofWaitActor(fopAc_ac_c* i_actor) {
if (i_actor != NULL) {
mCargoCarryAcKeep.setData(i_actor);
field_0x37c8 = mIronBallBgChkPos - i_actor->current.pos;
mDoMtx_stack_c::XrotS(-i_actor->shape_angle.x);
mDoMtx_stack_c::YrotM(-i_actor->shape_angle.y);
mDoMtx_stack_c::multVecSR(&field_0x37c8, &field_0x37c8);
mProcVar0.field_0x3008 = i_actor->shape_angle.y;
fopAcM_setHookCarryNow(i_actor);
mProcVar4.field_0x3010 = 1;
} else {
mCargoCarryAcKeep.clearData();
mProcVar4.field_0x3010 = 0;
}
}
int daAlink_c::checkNextHookPoint() {
if (field_0x3026 != 0) {
fopAc_ac_c* targetAc_p = mHookTargetAcKeep.getActor();
if ((mItemMode == 5 && targetAc_p != NULL && fopAcM_checkHookCarryNow(targetAc_p)) ||
(mItemMode == HS_MODE_FLY_e && dComIfG_Bgsp().ChkPolySafe(mPolyInfo2) &&
checkHookshotStickBG(mPolyInfo2) &&
(targetAc_p == NULL || fopAcM_checkHookCarryNow(targetAc_p))))
{
field_0x3026 = 0;
return procHookshotFlyInit();
}
} else if (dComIfGp_checkPlayerStatus1(0, 0x10000) && checkHookshotRoofLv7Boss()) {
if (!fopAcM_checkHookCarryNow(mCargoCarryAcKeep.getActor())) {
field_0x3102 = shape_angle.y;
return procCoLargeDamageInit(-6, TRUE, 0, 0, NULL, 0);
}
}
return procFallInit(1, 5.0f);
}
int daAlink_c::checkLandHookshotHang() {
mLinkGndChk.SetPos(&field_0x3834);
f32 ground_cross = dComIfG_Bgsp().GroundCross(&mLinkGndChk);
if (!setHookshotHangMoveBGCollect() || ground_cross > mLeftFootPos.y ||
ground_cross > mRightFootPos.y)
{
return checkNextHookPoint();
}
if (mProcID != PROC_HOOKSHOT_ROOF_BOOTS &&
((mProcID != PROC_HOOKSHOT_ROOF_SHOOT && mProcID != PROC_HOOKSHOT_WALL_SHOOT) ||
checkHookshotWait()) &&
(!checkHookshotRoofLv7Boss() || !checkEquipHeavyBoots()) &&
checkSetItemTrigger(fpcNm_ITEM_HVY_BOOTS))
{
if (dComIfGp_checkPlayerStatus1(0, 0x10000)) {
return procHookshotRoofBootsInit(mCargoCarryAcKeep.getActor());
}
setHeavyBoots(1);
}
return 0;
}
int daAlink_c::commonHookshotRoofWait() {
setJumpMode();
if (mProcVar4.field_0x3010 != 0) {
mCargoCarryAcKeep.setActor();
if (mCargoCarryAcKeep.getActor() == NULL || !fopAcM_checkHookCarryNow(mCargoCarryAcKeep.getActor())) {
return checkNextHookPoint();
}
}
if (mLinkAcch.ChkWallHit()) {
return checkNextHookPoint();
}
cXyz start_pos = field_0x3810 + (current.pos - field_0x3798);
mRopeLinChk.Set(&start_pos, &mIronBallBgChkPos, this);
if (dComIfG_Bgsp().LineCross(&mRopeLinChk)) {
return checkNextHookPoint();
}
if (checkLandHookshotHang()) {
return 1;
}
return 0;
}
int daAlink_c::commonHookshotWallWait() {
setJumpMode();
if (checkLandHookshotHang()) {
return TRUE;
} else {
return FALSE;
}
}
int daAlink_c::procHookshotSubjectInit() {
if (!commonProcInitNotSameProc(PROC_HOOKSHOT_SUBJECT)) {
return 0;
}
mNormalSpeed = 0.0f;
if (initHookshotUpperAnimeSpeed(1)) {
setSingleAnimeBaseSpeed(ANM_ATN_WAIT_LEFT, 0.0f,
mpHIO->mItem.mHookshot.m.mStartInterpolation);
}
dComIfGp_setPlayerStatus0(0, 0x4000);
current.angle.y = shape_angle.y;
setHookshotReadyMaterial();
return 1;
}
int daAlink_c::procHookshotSubject() {
if (checkHookshotWait()) {
setDoStatus(BUTTON_STATUS_BACK);
}
setShapeAngleToAtnActor(0);
mSight.offDrawFlg();
if (!checkNextAction(0)) {
if (checkHookshotWait()) {
if (setBodyAngleToCamera()) {
setHookshotSight();
}
dComIfGp_clearPlayerStatus0(0, 0x40000);
} else {
dComIfGp_setPlayerStatus0(0, 0x40000);
}
}
return 1;
}
int daAlink_c::procHookshotMoveInit() {
if (!commonProcInitNotSameProc(PROC_HOOKSHOT_MOVE)) {
return 0;
}
if (checkZeroSpeedF()) {
onModeFlg(1);
}
if (initHookshotUpperAnimeSpeed(0)) {
setBlendAtnMoveAnime(mpHIO->mItem.mHookshot.m.mStartInterpolation);
}
dComIfGp_setPlayerStatus0(0, 0x4000);
return 1;
}
int daAlink_c::procHookshotMove() {
cancelHookshotMove();
if (!checkNextAction(0)) {
f32 blend = -1.0f;
if (checkZeroSpeedF()) {
onModeFlg(1);
if (field_0x2f98 != 2) {
field_0x2f98 = 2;
blend = mpHIO->mBasic.m.mBasicInterpolation;
}
} else {
offModeFlg(1);
}
if (checkHookshotWait()) {
setBlendAtnMoveAnime(blend);
setBodyAngleXReadyAnime(0);
} else if (checkChaseHookshot()) {
setBodyAngleXReadyAnime(0);
}
}
return 1;
}
int daAlink_c::procHookshotFlyInit() {
commonProcInit(PROC_HOOKSHOT_FLY);
if (!checkNoResetFlg0(FLG0_SWIM_UP)) {
onNoResetFlg0(FLG0_WATER_IN_MOVE);
}
daAlink_ANM anm;
if (field_0x3020 == 0) {
anm = ANM_HOOKSHOT_FLY_LEFT;
} else {
anm = ANM_HOOKSHOT_FLY_RIGHT;
}
setSingleAnimeBase(anm);
mBodyAngle.x = 0;
setSpecialGravity(0.0f, maxFallSpeed, 0);
mNormalSpeed = 0.0f;
speed.y = 0.0f;
dComIfGp_clearPlayerStatus0(0, 0x40000);
dComIfGp_setPlayerStatus1(0, 0x10);
voiceStart(Z2SE_AL_V_JUMP_L);
field_0x37c8 = field_0x3798;
current.pos = field_0x3834;
field_0x37d4 = cXyz::Zero;
shape_angle.x = field_0x301c;
shape_angle.y = field_0x301e;
current.angle.y = shape_angle.y;
mProcVar0.field_0x3008 = 1;
mProcVar1.field_0x300a = 4;
field_0x2f99 = 0x50;
mProcVar2.field_0x300c = mItemMode;
mProcVar5.field_0x3012 = 0;
procHookshotFly();
return 1;
}
int daAlink_c::procHookshotFly() {
fopAc_ac_c* targetAc_p = mHookTargetAcKeep.getActor();
s16 targetAc_name;
if (targetAc_p != NULL) {
targetAc_name = fopAcM_GetName(targetAc_p);
} else {
targetAc_name = PROC_ALINK;
}
BOOL var_r29 = FALSE;
if (targetAc_name == PROC_Obj_SwHang) {
int swhang_type = static_cast<daObjSwHang_c*>(targetAc_p)->getType();
if (swhang_type == 3 || swhang_type == 4) {
var_r29 = TRUE;
}
}
s16 temp_r24 = field_0x301e;
cXyz spAC(mHookshotTopPos);
setHookshotTopPosFly();
field_0x37d4 = mHookshotTopPos - mHeldItemRootPos;
if (mProcVar0.field_0x3008 != 0 && cLib_distanceAngleS(field_0x37d4.atan2sX_Z(), temp_r24) > 0x4000) {
setHookshotReturnEnd();
} else {
mProcVar0.field_0x3008 = 0;
f32 temp_f31 = field_0x37d4.abs();
f32 temp_f30 = mpHIO->mItem.mHookshot.m.mStickReturnSpeed + spAC.abs(mHookshotTopPos);
if (temp_f31 < temp_f30 || mProcVar1.field_0x300a == 0) {
setHookshotReturnEnd();
} else {
field_0x37d4 *= temp_f30 / temp_f31;
seStartOnlyReverbLevel(Z2SE_LK_HS_WIND_UP);
if (temp_f31 < temp_f30 * 1.5f) {
mProcVar1.field_0x300a--;
}
}
}
current.pos += field_0x37d4;
if (checkSetItemTrigger(fpcNm_ITEM_W_HOOKSHOT) != 0) {
mProcVar5.field_0x3012 = 1;
} else if (mProcVar5.field_0x3012 != 0 && !itemButton()) {
mProcVar5.field_0x3012 = 0;
}
if (mItemMode != 5 && mItemMode != HS_MODE_FLY_e) {
if (targetAc_name == PROC_B_OB ||
(targetAc_name == PROC_B_DR && static_cast<daB_DR_c*>(targetAc_p)->isBack()))
{
dComIfGp_getVibration().StartShock(1, 1, cXyz(0.0f, 1.0f, 0.0f));
return procBossBodyHangInit(targetAc_p);
} else {
cM3dGPla tripla;
BOOL var_r28 = FALSE;
BOOL var_r27 = FALSE;
BOOL is_force_fall = checkStageName("D_MN10") && fopAcM_GetRoomNo(this) == 4;
if (mProcVar2.field_0x300c == 4 && dComIfG_Bgsp().ChkPolySafe(mPolyInfo2)) {
var_r28 = dComIfG_Bgsp().GetTriPla(mPolyInfo2, &tripla);
var_r27 = cBgW_CheckBRoof(tripla.mNormal.y);
if (!checkHookshotStickBG(mPolyInfo2)) {
var_r28 = FALSE;
}
}
if (!is_force_fall && !mLinkAcch.ChkGroundHit() && !var_r27 && checkFrontWallTypeAction())
{
voiceStart(Z2SE_AL_V_CLIMB);
dComIfGp_getVibration().StartShock(1, 1, cXyz(0.0f, 1.0f, 0.0f));
return 1;
} else {
cXyz spA0 = current.pos - field_0x37c8;
if (commonLineCheck(&field_0x37c8, &current.pos)) {
current.pos = mLinkLinChk.GetCross();
spA0.y = 0.0f;
spA0.normalizeZP();
current.pos.x -= spA0.x * 35.0f;
current.pos.z -= spA0.z * 35.0f;
}
if (var_r28 && !var_r27) {
cXyz sp94(mHookshotTopPos.x + tripla.mNormal.x * 35.0f, mHookshotTopPos.y + 5.0f,
mHookshotTopPos.z + tripla.mNormal.z * 35.0f);
mLinkGndChk.SetPos(&sp94);
f32 temp_f29 = dComIfG_Bgsp().GroundCross(&mLinkGndChk);
if (temp_f29 > mHookshotTopPos.y - 150.0f || is_force_fall) {
current.pos.x = sp94.x;
current.pos.z = sp94.z;
is_force_fall = true;
}
}
setJumpMode();
if (mLinkAcch.ChkGroundHit()) {
checkNextAction(0);
} else if (is_force_fall) {
procFallInit(1, 5.0f);
field_0x2f99 = 0x70;
} else if (targetAc_name == PROC_E_PH || targetAc_name == PROC_B_DR || var_r29) {
procHookshotRoofWaitInit(1, targetAc_p, mProcVar5.field_0x3012);
} else if (var_r28 && dComIfG_Bgsp().GetMonkeyBarsCode(mPolyInfo2)) {
cXyz sp88;
mDoMtx_stack_c::ZXYrotS(field_0x301c, field_0x301e, 0);
mDoMtx_stack_c::multVec(&cXyz::BaseZ, &sp88);
sp88 = mHookshotTopPos + (sp88 * 15.0f);
procRoofHangStartInit(mPolyInfo2, sp88, 0);
} else if (var_r28 && var_r27) {
procHookshotRoofWaitInit(1, NULL, mProcVar5.field_0x3012);
} else if (var_r28 && field_0x2f91 != 3 && fabsf(tripla.mNormal.y) < 0.05f) {
procHookshotWallWaitInit(1, tripla.mNormal.atan2sX_Z(), mProcVar5.field_0x3012);
} else {
procFallInit(1, 5.0f);
field_0x2f99 = 0x70;
}
voiceStart(Z2SE_AL_V_CLIMB);
if (mProcID != PROC_FALL) {
dComIfGp_getVibration().StartShock(1, 1, cXyz(0.0f, 1.0f, 0.0f));
}
}
}
} else {
cXyz sp7C = mHookshotTopPos - current.pos;
cLib_addCalcAngleS(&shape_angle.x, sp7C.atan2sY_XZ(), 2, 0x2000, 0x800);
cLib_addCalcAngleS(&shape_angle.y, sp7C.atan2sX_Z(), 2, 0x2000, 0x800);
current.angle.y = shape_angle.y;
field_0x37c8 = field_0x3798;
}
return 1;
}
int daAlink_c::procHookshotRoofWaitInit(BOOL param_0, fopAc_ac_c* param_1, int param_2) {
commonProcInit(PROC_HOOKSHOT_ROOF_WAIT);
if (param_0) {
cXyz sp28;
mDoMtx_stack_c::ZXYrotS(field_0x301c, field_0x301e, 0);
mDoMtx_stack_c::multVec(&cXyz::BaseZ, &sp28);
current.pos = mHookshotTopPos + (sp28 * 15.0f);
current.pos.y -= 1.5f;
field_0x3022 = field_0x301e;
mIronBallBgChkPos.set(current.pos.x, current.pos.y - 15.0f, current.pos.z);
daAlink_ANM anm;
if (field_0x3020 == 0) {
field_0x3020 = 1;
anm = ANM_HOOKSHOT_HANG_END_LEFT;
} else {
field_0x3020 = 0;
anm = ANM_HOOKSHOT_HANG_END_RIGHT;
}
mProcVar2.field_0x300c = 0;
setSingleAnimeParam(anm, &mpHIO->mItem.mHookshot.m.mRoofHangAnm);
} else {
setHookshotRoofWaitAnime();
mProcVar2.field_0x300c = 1;
}
resetHookshotMode();
field_0x3024 = 1;
setSpecialGravity(0.0f, maxFallSpeed, 0);
mNormalSpeed = 0.0f;
speed.y = 0.0f;
current.angle.y = shape_angle.y;
initHookshotRoofWaitActor(param_1);
if (param_0) {
setHookshotHangMoveBGCollect();
}
field_0x2b98 = 6.5f;
mProcVar5.field_0x3012 = param_2;
dComIfGp_setPlayerStatus1(0, 0x10000);
mCcStts.SetWeight(255);
return 1;
}
int daAlink_c::procHookshotRoofWait() {
if (dComIfGp_checkCameraAttentionStatus(field_0x317c, 0x80)) {
if (checkSubjectEnd(TRUE)) {
dComIfGp_clearPlayerStatus0(0, 0x2000);
mBodyAngle.y = 0;
mBodyAngle.x = 0;
offModeFlg(0x60000000);
} else if (dComIfGp_checkPlayerStatus0(0, 0x2000)) {
setBodyAngleToCamera();
}
} else if (dCam_getBody()->ChangeModeOK(4)) {
onResetFlg0(RFLG0_UNK_4000000);
if (dComIfGp_checkCameraAttentionStatus(field_0x317c, 0x1000)) {
field_0x310c = shape_angle.y;
field_0x310a = 0;
setSubjectMode();
onModeFlg(0x60000000);
}
}
if (commonHookshotRoofWait()) {
return 1;
}
if (!checkHookshotRoofLv7Boss() || !checkBootsOrArmorHeavy()) {
setDoStatusEmphasys(BUTTON_STATUS_LET_GO);
if (doTrigger()) {
return procFallInit(1, 5.0f);
}
}
setShapeAngleToAtnActor(0);
if (mProcVar2.field_0x300c == 0) {
if (checkSetItemTrigger(fpcNm_ITEM_W_HOOKSHOT)) {
mProcVar5.field_0x3012 = 1;
} else if (mProcVar5.field_0x3012 != 0 && !itemButton()) {
mProcVar5.field_0x3012 = 0;
}
daPy_frameCtrl_c* frameCtrl_p = mUnderFrameCtrl;
if (checkAnmEnd(frameCtrl_p) ||
((checkInputOnR() || mProcVar5.field_0x3012 != 0 || checkHookshotRoofLv7Boss()) &&
frameCtrl_p->getFrame() > mpHIO->mItem.mHookshot.m.mRoofHangAnm.mCancelFrame))
{
setHookshotRoofWaitAnime();
mProcVar2.field_0x300c = 1;
}
} else if (!checkHookshotRoofLv7Boss()) {
if (checkSetItemTrigger(fpcNm_ITEM_W_HOOKSHOT) || mProcVar5.field_0x3012 != 0) {
return procHookshotRoofShootInit(mCargoCarryAcKeep.getActor());
}
hookshotRoofTurn();
}
return 1;
}
int daAlink_c::procHookshotRoofShootInit(fopAc_ac_c* param_0) {
commonProcInit(PROC_HOOKSHOT_ROOF_SHOOT);
daAlink_ANM anm;
if (field_0x3020 == 0) {
anm = ANM_HOOKSHOT_HANG_WAIT_RIGHT;
} else {
anm = ANM_HOOKSHOT_HANG_WAIT_LEFT;
}
setSingleAnimeBaseSpeed(anm, 1.0f, 3.0f);
setFastShotTimer();
setSpecialGravity(0.0f, maxFallSpeed, 0);
mNormalSpeed = 0.0f;
speed.y = 0.0f;
field_0x2b98 = 6.5f;
initHookshotRoofWaitActor(param_0);
initHookshotReady();
dComIfGp_setPlayerStatus1(0, 0x10000);
dComIfGp_setPlayerStatus0(0, 0x4000);
mCcStts.SetWeight(255);
mProcVar2.field_0x300c = 0;
mProcVar3.field_0x300e = mBodyAngle.x;
return 1;
}
int daAlink_c::procHookshotRoofShoot() {
if (checkHookshotWait()) {
setDoStatus(BUTTON_STATUS_BACK);
}
if (commonHookshotRoofWait()) {
return 1;
}
if (checkHookshotWait()) {
setShapeAngleToAtnActor(0);
}
mSight.offDrawFlg();
dComIfGp_clearPlayerStatus0(0, 0x40000);
if (mFastShotTime != 0 && checkHookshotWait()) {
mFastShotTime--;
}
if (!checkUpperItemActionHookshot()) {
mBodyAngle.x = mProcVar3.field_0x300e;
if (!checkAttentionLock() && mFastShotTime == 0) {
if (checkHookshotWait()) {
mUnderFrameCtrl[0].setRate(0.0f);
mUnderFrameCtrl[0].setFrame(0.0f);
getNowAnmPackUnder(UNDER_0)->setFrame(0.0f);
if (mProcVar2.field_0x300c != 0 && setBodyAngleToCamera()) {
setHookshotSight();
}
} else {
dComIfGp_setPlayerStatus0(0, 0x40000);
}
mProcVar2.field_0x300c = 1;
} else {
if (mTargetedActor == NULL && mItemMode == HS_MODE_NONE_e) {
return procHookshotRoofWaitInit(0, mCargoCarryAcKeep.getActor(), 0);
}
if (checkHookshotWait()) {
mUnderFrameCtrl[0].setRate(1.0f);
if (mProcVar2.field_0x300c == 0) {
setBodyAngleXReadyAnime(0);
hookshotRoofTurn();
} else {
cancelItemUseQuake(0);
}
}
mProcVar2.field_0x300c = 0;
}
mProcVar3.field_0x300e = mBodyAngle.x;
mBodyAngle.x = 0;
}
return 1;
}
int daAlink_c::procHookshotRoofBootsInit(fopAc_ac_c* param_0) {
commonProcInit(PROC_HOOKSHOT_ROOF_BOOTS);
daAlink_ANM anm;
if (field_0x3020 == 0) {
anm = ANM_HOOKSHOT_HANG_RIGHT_START;
} else {
anm = ANM_HOOKSHOT_HANG_LEFT_START;
}
setSingleAnimeBaseMorf(anm, 2.0f);
resetHookshotMode();
field_0x3024 = 1;
setSpecialGravity(0.0f, maxFallSpeed, 0);
mNormalSpeed = 0.0f;
speed.y = 0.0f;
current.angle.y = shape_angle.y;
initHookshotRoofWaitActor(param_0);
field_0x2b98 = 6.5f;
dComIfGp_setPlayerStatus1(0, 0x10000);
mCcStts.SetWeight(255);
return 1;
}
int daAlink_c::procHookshotRoofBoots() {
if (commonHookshotRoofWait()) {
return 1;
}
if (!checkHookshotRoofLv7Boss() || !checkBootsOrArmorHeavy()) {
setDoStatusEmphasys(BUTTON_STATUS_LET_GO);
if (doTrigger()) {
return procFallInit(1, 5.0f);
}
}
daPy_frameCtrl_c* frameCtrl_p = mUnderFrameCtrl;
if (checkAnmEnd(frameCtrl_p)) {
return procHookshotRoofWaitInit(0, mCargoCarryAcKeep.getActor(), 0);
}
if (frameCtrl_p->checkPass(4.0f)) {
setHeavyBoots(1);
} else if (checkNoResetFlg0(FLG0_EQUIP_HVY_BOOTS) && frameCtrl_p->checkPass(10.0f)) {
dComIfGp_getVibration().StartShock(3, 1, cXyz(0.0f, 1.0f, 0.0f));
}
return 1;
}
int daAlink_c::procHookshotWallWaitInit(int param_0, s16 param_1, int param_2) {
commonProcInit(PROC_HOOKSHOT_WALL_WAIT);
if (param_0) {
setOldRootQuaternion(0, -0x8000, 0);
cXyz sp28;
mDoMtx_stack_c::ZXYrotS(field_0x301c, field_0x301e, 0);
mDoMtx_stack_c::multVec(&cXyz::BaseZ, &sp28);
current.pos = mHookshotTopPos + (sp28 * 15.0f);
shape_angle.y = param_1;
current.pos.x += cM_ssin(shape_angle.y) * 1.5f;
current.pos.z += cM_scos(shape_angle.y) * 1.5f;
field_0x3022 = param_1 + 0x8000;
mIronBallBgChkPos.set(current.pos.x + cM_ssin(shape_angle.y) * 15.0f, current.pos.y,
current.pos.z + cM_scos(shape_angle.y) * 15.0f);
daAlink_ANM anm;
if (field_0x3020 == 0) {
field_0x3020 = 1;
anm = ANM_HOOKSHOT_WALL_END_LEFT;
} else {
field_0x3020 = 0;
anm = ANM_HOOKSHOT_WALL_END_RIGHT;
}
mProcVar2.field_0x300c = 0;
setSingleAnimeParam(anm, &mpHIO->mItem.mHookshot.m.mWallHangAnm);
} else {
setHookshotWallWaitAnime();
mProcVar2.field_0x300c = 1;
}
dComIfGp_setPlayerStatus1(0, 0x2000000);
resetHookshotMode();
field_0x3024 = 1;
setSpecialGravity(0.0f, maxFallSpeed, 0);
mNormalSpeed = 0.0f;
speed.y = 0.0f;
current.angle.y = shape_angle.y;
if (param_0) {
setHookshotHangMoveBGCollect();
}
mProcVar5.field_0x3012 = param_2;
return 1;
}
int daAlink_c::procHookshotWallWait() {
if (dComIfGp_checkCameraAttentionStatus(field_0x317c, 0x80)) {
if (checkSubjectEnd(TRUE)) {
dComIfGp_clearPlayerStatus0(0, 0x2000);
mBodyAngle.x = 0;
offModeFlg(0x60000000);
} else if (dComIfGp_checkPlayerStatus0(0, 0x2000)) {
s16 old_angle = shape_angle.y;
shape_angle.y = field_0x310c;
setBodyAngleToCamera();
shape_angle.y = old_angle;
old_angle = field_0x310c - shape_angle.y;
if (old_angle > 0x4000) {
field_0x310c = shape_angle.y + 0x4000;
} else if (old_angle < -0x4000) {
field_0x310c = shape_angle.y - 0x4000;
}
}
} else if (dCam_getBody()->ChangeModeOK(4)) {
onResetFlg0(RFLG0_UNK_4000000);
if (dComIfGp_checkCameraAttentionStatus(field_0x317c, 0x1000)) {
field_0x310c = shape_angle.y;
field_0x310a = 0;
setSubjectMode();
onModeFlg(0x60000000);
}
}
if (commonHookshotWallWait()) {
return 1;
}
setDoStatusEmphasys(BUTTON_STATUS_LET_GO);
if (doTrigger()) {
return procFallInit(1, 5.0f);
}
if (mProcVar2.field_0x300c == 0) {
if (checkSetItemTrigger(fpcNm_ITEM_W_HOOKSHOT)) {
mProcVar5.field_0x3012 = 1;
} else if (mProcVar5.field_0x3012 != 0 && !itemButton()) {
mProcVar5.field_0x3012 = 0;
}
daPy_frameCtrl_c* frameCtrl_p = mUnderFrameCtrl;
if (checkAnmEnd(frameCtrl_p) ||
((checkInputOnR() || mProcVar5.field_0x3012 != 0) &&
frameCtrl_p->getFrame() > mpHIO->mItem.mHookshot.m.mWallHangAnm.mCancelFrame))
{
setHookshotWallWaitAnime();
mProcVar2.field_0x300c = 1;
}
} else if (checkSetItemTrigger(fpcNm_ITEM_W_HOOKSHOT) || mProcVar5.field_0x3012 != 0) {
return procHookshotWallShootInit();
}
return 1;
}
int daAlink_c::procHookshotWallShootInit() {
commonProcInit(PROC_HOOKSHOT_WALL_SHOOT);
daAlink_ANM anm;
if (field_0x3020 == 0) {
anm = ANM_HOOKSHOT_WALL_WAIT_RIGHT;
} else {
anm = ANM_HOOKSHOT_WALL_WAIT_LEFT;
}
setSingleAnimeBaseSpeed(anm, 1.0f, 3.0f);
setFastShotTimer();
setSpecialGravity(0.0f, maxFallSpeed, 0);
mNormalSpeed = 0.0f;
speed.y = 0.0f;
dComIfGp_setPlayerStatus1(0, 0x2000000);
initHookshotReady();
dComIfGp_setPlayerStatus0(0, 0x4000);
mProcVar2.field_0x300c = 0;
mProcVar3.field_0x300e = mBodyAngle.x;
mProcVar4.field_0x3010 = shape_angle.y;
field_0x310c = mProcVar4.field_0x3010;
setHookshotReadyMaterial();
return 1;
}
int daAlink_c::procHookshotWallShoot() {
if (checkHookshotWait()) {
setDoStatus(BUTTON_STATUS_BACK);
}
if (commonHookshotWallWait()) {
return 1;
}
mSight.offDrawFlg();
dComIfGp_clearPlayerStatus0(0, 0x40000);
if (mFastShotTime != 0 && checkHookshotWait()) {
mFastShotTime--;
}
BOOL var_r31 = false;
if (!checkUpperItemActionHookshot()) {
s16 old_angle = shape_angle.y;
mBodyAngle.x = mProcVar3.field_0x300e;
shape_angle.y = mProcVar4.field_0x3010;
if (!checkAttentionLock() && mFastShotTime == 0) {
if (checkHookshotWait()) {
mUnderFrameCtrl[0].setRate(0.0f);
mUnderFrameCtrl[0].setFrame(0.0f);
getNowAnmPackUnder(UNDER_0)->setFrame(0.0f);
if (mProcVar2.field_0x300c != 0 && setBodyAngleToCamera()) {
var_r31 = true;
}
} else {
dComIfGp_setPlayerStatus0(0, 0x40000);
}
mProcVar2.field_0x300c = 1;
} else {
if (mTargetedActor == NULL && mItemMode == HS_MODE_NONE_e) {
shape_angle.y = old_angle;
return procHookshotWallWaitInit(0, 0, 0);
}
if (checkHookshotWait()) {
setWaterInAnmRate(mUnderFrameCtrl, 1.0f);
if (mProcVar2.field_0x300c == 0) {
setBodyAngleXReadyAnime(0);
if (!setShapeAngleToAtnActor(0)) {
cLib_addCalcAngleS(&shape_angle.y, old_angle, 4, 0xC00, 0x180);
}
}
}
mProcVar2.field_0x300c = 0;
}
s16 var_r27 = shape_angle.y - old_angle;
if (var_r27 > 0x4000) {
shape_angle.y = old_angle + 0x4000;
} else if (var_r27 < -0x4000) {
shape_angle.y = old_angle - 0x4000;
}
if (var_r31) {
setHookshotSight();
}
mProcVar3.field_0x300e = mBodyAngle.x;
mBodyAngle.x = 0;
field_0x310c = shape_angle.y;
mProcVar4.field_0x3010 = shape_angle.y;
shape_angle.y = old_angle;
}
return 1;
}