mirror of
https://github.com/zeldaret/tww.git
synced 2026-06-07 20:01:27 -04:00
3462 lines
97 KiB
C++
3462 lines
97 KiB
C++
/**
|
|
* d_a_npc_cb1.cpp
|
|
* Player - Makar
|
|
*/
|
|
|
|
#include "d/dolzel_rel.h" // IWYU pragma: keep
|
|
#include "d/actor/d_a_npc_cb1.h"
|
|
#include "d/actor/d_a_obj_vmc.h"
|
|
#include "d/actor/d_a_ship.h"
|
|
#include "d/d_camera.h"
|
|
#include "d/d_com_inf_game.h"
|
|
#include "d/d_kankyo_wether.h"
|
|
#include "d/d_procname.h"
|
|
#include "d/d_priority.h"
|
|
#include "d/d_cc_d.h"
|
|
#include "d/d_s_play.h"
|
|
#include "d/d_snap.h"
|
|
#include "f_op/f_op_camera.h"
|
|
#include "m_Do/m_Do_controller_pad.h"
|
|
#include "d/actor/d_a_player_main.h"
|
|
#include "d/res/res_cb.h"
|
|
|
|
class daNpc_Cb1_HIO_c : public JORReflexible {
|
|
public:
|
|
daNpc_Cb1_HIO_c();
|
|
virtual ~daNpc_Cb1_HIO_c() {}
|
|
void genMessage(JORMContext*) {}
|
|
|
|
public:
|
|
/* 0x04 */ s8 mNo;
|
|
/* 0x08 */ dNpc_HIO_c mNpc;
|
|
/* 0x30 */ f32 field_0x30;
|
|
/* 0x34 */ f32 mPlayerChaseDistance; // distance from the player before Makar starts following him (while called)
|
|
/* 0x38 */ f32 mChaseDistScale; // scales the distance to the player to get a target speed
|
|
/* 0x3C */ f32 mMaxWalkSpeed;
|
|
/* 0x40 */ f32 mMinWalkSpeed;
|
|
/* 0x44 */ f32 mForwardAccel;
|
|
/* 0x48 */ f32 mDecelScale; // scales speed to get deceleration in daNpc_Cb1_c::breaking()
|
|
/* 0x4C */ f32 mMaxDecel;
|
|
/* 0x50 */ f32 mDecel;
|
|
/* 0x54 */ f32 mWalkAnmSpeedScale;
|
|
/* 0x58 */ f32 mMaxWalkAnmSpeed;
|
|
/* 0x5C */ f32 mNpcFlyLaunchSpeedF; // forward speed when Makar jumps to start flying
|
|
/* 0x60 */ f32 mNpcFlyLaunchSpeedY;
|
|
/* 0x64 */ f32 field_0x64;
|
|
/* 0x68 */ f32 mHitSpeedScaleF; // scales forward speed when Makar is hit
|
|
/* 0x6C */ f32 mHitSpeedScaleY; // scales forward speed to get y recoil speed when Makar is hit
|
|
/* 0x70 */ f32 field_0x70;
|
|
/* 0x74 */ f32 field_0x74;
|
|
/* 0x78 */ f32 field_0x78;
|
|
/* 0x7C */ f32 field_0x7C;
|
|
/* 0x80 */ f32 field_0x80;
|
|
/* 0x84 */ f32 field_0x84;
|
|
/* 0x88 */ f32 mStickWalkSpeedScale; // scales main stick value to get a target speed
|
|
/* 0x8C */ f32 field_0x8C;
|
|
/* 0x90 */ f32 field_0x90;
|
|
/* 0x94 */ u8 field_0x94[4];
|
|
/* 0x98 */ f32 field_0x98;
|
|
/* 0x9C */ f32 field_0x9C;
|
|
/* 0xA0 */ f32 field_0xA0;
|
|
/* 0xA4 */ f32 field_0xA4;
|
|
/* 0xA8 */ f32 field_0xA8;
|
|
/* 0xAC */ f32 mStickFlySpeedScale;
|
|
/* 0xB0 */ f32 field_0xB0;
|
|
/* 0xB4 */ f32 field_0xB4;
|
|
/* 0xB8 */ f32 field_0xB8;
|
|
/* 0xBC */ f32 mFlyLaunchSpeedY;
|
|
/* 0xC0 */ f32 field_0xC0;
|
|
/* 0xC4 */ f32 field_0xC4;
|
|
/* 0xC8 */ s16 field_0xC8;
|
|
/* 0xCA */ s16 mPlayerFlyTimer;
|
|
/* 0xCC */ s16 field_0xCC;
|
|
/* 0xCE */ s16 field_0xCE;
|
|
/* 0xD0 */ s16 field_0xD0;
|
|
/* 0xD2 */ s16 field_0xD2;
|
|
/* 0xD4 */ s16 field_0xD4;
|
|
/* 0xD6 */ s16 field_0xD6;
|
|
/* 0xD8 */ s16 field_0xD8;
|
|
/* 0xDA */ s16 field_0xDA;
|
|
/* 0xDC */ s16 mNpcFlyTimer;
|
|
/* 0xDE */ s16 field_0xDE;
|
|
/* 0xE0 */ s16 field_0xE0;
|
|
/* 0xE2 */ s16 field_0xE2;
|
|
/* 0xE4 */ s16 field_0xE4;
|
|
/* 0xE6 */ s16 field_0xE6;
|
|
/* 0xE8 */ s16 field_0xE8;
|
|
/* 0xEA */ s16 field_0xEA;
|
|
/* 0xEC */ s16 field_0xEC;
|
|
/* 0xEE */ u8 mDamageTimer;
|
|
/* 0xEF */ u8 field_0xEF;
|
|
}; // Size: 0xF0
|
|
|
|
daNpc_Cb1_HIO_c l_HIO;
|
|
|
|
static dCcD_SrcCyl l_cyl_src = {
|
|
// dCcD_SrcGObjInf
|
|
{
|
|
/* Flags */ 0,
|
|
/* SrcObjAt Type */ 0,
|
|
/* SrcObjAt Atp */ 0,
|
|
/* SrcObjAt SPrm */ 0,
|
|
/* SrcObjTg Type */ AT_TYPE_ALL & ~AT_TYPE_BOOMERANG & ~AT_TYPE_WIND & ~AT_TYPE_LIGHT,
|
|
/* SrcObjTg SPrm */ cCcD_TgSPrm_Set_e | cCcD_TgSPrm_IsPlayer_e,
|
|
/* SrcObjCo SPrm */ cCcD_CoSPrm_Set_e | cCcD_CoSPrm_IsPlayer_e | cCcD_CoSPrm_VsGrpAll_e,
|
|
/* SrcGObjAt Se */ 0,
|
|
/* SrcGObjAt HitMark */ dCcG_AtHitMark_None_e,
|
|
/* SrcGObjAt Spl */ dCcG_At_Spl_UNK0,
|
|
/* SrcGObjAt Mtrl */ 0,
|
|
/* SrcGObjAt SPrm */ 0,
|
|
/* SrcGObjTg Se */ 0,
|
|
/* SrcGObjTg HitMark */ 0,
|
|
/* SrcGObjTg Spl */ dCcG_Tg_Spl_UNK0,
|
|
/* SrcGObjTg Mtrl */ 0,
|
|
/* SrcGObjTg SPrm */ dCcG_TgSPrm_NoHitMark_e,
|
|
/* SrcGObjCo SPrm */ 0,
|
|
},
|
|
// cM3dGCylS
|
|
{{
|
|
/* Center */ {0.0f, 0.0f, 0.0f},
|
|
/* Radius */ 30.0f,
|
|
/* Height */ 80.0f,
|
|
}},
|
|
};
|
|
|
|
|
|
static dCcD_SrcCyl l_wind_cyl_src = {
|
|
// dCcD_SrcGObjInf
|
|
{
|
|
/* Flags */ 0,
|
|
/* SrcObjAt Type */ 0,
|
|
/* SrcObjAt Atp */ 0,
|
|
/* SrcObjAt SPrm */ 0,
|
|
/* SrcObjTg Type */ AT_TYPE_ALL & ~AT_TYPE_WATER & ~AT_TYPE_UNK20000 & ~AT_TYPE_UNK400000 & ~AT_TYPE_LIGHT,
|
|
/* SrcObjTg SPrm */ cCcD_TgSPrm_Set_e | cCcD_TgSPrm_IsPlayer_e,
|
|
/* SrcObjCo SPrm */ 0,
|
|
/* SrcGObjAt Se */ 0,
|
|
/* SrcGObjAt HitMark */ dCcG_AtHitMark_None_e,
|
|
/* SrcGObjAt Spl */ dCcG_At_Spl_UNK0,
|
|
/* SrcGObjAt Mtrl */ 0,
|
|
/* SrcGObjAt SPrm */ 0,
|
|
/* SrcGObjTg Se */ 0,
|
|
/* SrcGObjTg HitMark */ 0,
|
|
/* SrcGObjTg Spl */ dCcG_Tg_Spl_UNK0,
|
|
/* SrcGObjTg Mtrl */ 0,
|
|
/* SrcGObjTg SPrm */ dCcG_TgSPrm_NoHitMark_e,
|
|
/* SrcGObjCo SPrm */ 0,
|
|
},
|
|
// cM3dGCylS
|
|
{{
|
|
/* Center */ {0.0f, 0.0f, 0.0f},
|
|
/* Radius */ 30.0f,
|
|
/* Height */ 80.0f,
|
|
}},
|
|
};
|
|
|
|
|
|
/* 000000EC-0000031C .text __ct__15daNpc_Cb1_HIO_cFv */
|
|
daNpc_Cb1_HIO_c::daNpc_Cb1_HIO_c() {
|
|
mNpc.m04 = -20.0f;
|
|
mNpc.mMaxHeadX = 0;
|
|
mNpc.mMaxHeadY = 0;
|
|
mNpc.mMaxBackboneX = 0xBB8;
|
|
mNpc.mMaxBackboneY = 0x1770;
|
|
mNpc.mMinHeadX = 0;
|
|
mNpc.mMinHeadY = 0;
|
|
mNpc.mMinBackboneX = -0x3E8;
|
|
mNpc.mMinBackboneY = -0x1770;
|
|
mNpc.mMaxTurnStep = 0x7D0;
|
|
mNpc.mMaxHeadTurnVel = 0x7D0;
|
|
mNpc.mAttnYOffset = 65.0f;
|
|
mNpc.mMaxAttnAngleY = 0x4000;
|
|
mNpc.m22 = 0;
|
|
mNpc.mMaxAttnDistXZ = 180.0f;
|
|
field_0x30 = 50.0f;
|
|
mPlayerChaseDistance = 140.0f;
|
|
mChaseDistScale = 0.05f;
|
|
mMaxWalkSpeed = 9.0f;
|
|
mMinWalkSpeed = 3.0f;
|
|
mForwardAccel = 0.4f;
|
|
field_0xE8 = 0x8FC;
|
|
field_0xEA = 0x320;
|
|
field_0xEC = 0x3;
|
|
mDecelScale = 0.9f;
|
|
mMaxDecel = 1.0f;
|
|
mDecel = 1.0f;
|
|
mWalkAnmSpeedScale = 0.45f;
|
|
mMaxWalkAnmSpeed = 0.9f;
|
|
mNpcFlyLaunchSpeedF = 50.0f;
|
|
mNpcFlyLaunchSpeedY = 20.0f;
|
|
field_0x64 = 8.0f;
|
|
mHitSpeedScaleF = -1.0f;
|
|
mHitSpeedScaleY = 3.5f;
|
|
field_0x70 = -4.0f;
|
|
field_0x74 = -1.5f;
|
|
field_0x78 = -6.0f;
|
|
field_0x7C = -7.6f;
|
|
field_0x80 = 0.1f;
|
|
field_0x84 = 0.2f;
|
|
mStickWalkSpeedScale = 10.0f;
|
|
field_0xC8 = -0x1000;
|
|
mPlayerFlyTimer = 450;
|
|
field_0xCC = 0x64;
|
|
field_0xCE = 0xF;
|
|
field_0xD0 = 0x4E20;
|
|
field_0xD2 = 0x190;
|
|
field_0xD4 = 0x9C4;
|
|
field_0xD6 = 0xC8;
|
|
field_0x8C = 0.0002f;
|
|
field_0x90 = -15.0f;
|
|
field_0x98 = 10.0f;
|
|
field_0x9C = 10.0f;
|
|
field_0xA0 = -2.5f;
|
|
field_0xD8 = 1;
|
|
field_0xA4 = 100.0f;
|
|
field_0xA8 = 6000.0f;
|
|
field_0xE0 = 0xC8;
|
|
mStickFlySpeedScale = 0.5f;
|
|
field_0xDA = 0x2968;
|
|
field_0xB0 = 34.0f;
|
|
field_0xB4 = 2.0f;
|
|
mNpcFlyTimer = 60;
|
|
field_0xDE = 0xD;
|
|
field_0xB8 = 2.0f;
|
|
mFlyLaunchSpeedY = 50.0f;
|
|
field_0xC0 = 400.0f;
|
|
field_0xE2 = 0x5;
|
|
field_0xE4 = 0x14;
|
|
field_0xE6 = 0xBB8;
|
|
field_0xC4 = 20.0f;
|
|
mDamageTimer = 60;
|
|
field_0xEF = 0;
|
|
mNo = -1;
|
|
}
|
|
|
|
/* 0000031C-00000424 .text isTagCheckOK__11daNpc_Cb1_cFv */
|
|
BOOL daNpc_Cb1_c::isTagCheckOK() {
|
|
if(chkNpcAction(&daNpc_Cb1_c::waitNpcAction) || chkNpcAction(&daNpc_Cb1_c::searchNpcAction)) {
|
|
return TRUE;
|
|
}
|
|
|
|
if(chkNpcAction(&daNpc_Cb1_c::carryNpcAction) && !daPy_getPlayerLinkActorClass()->checkCarryActionNow()) {
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/* 00000424-000004D8 .text setMessageAnimation__11daNpc_Cb1_cFUc */
|
|
void daNpc_Cb1_c::setMessageAnimation(u8 param_1) {
|
|
if(!fopAcM_checkCarryNow(this) && dComIfGp_event_runCheck()) {
|
|
int staffIdx = dComIfGp_evmng_getMyStaffId("Cb1");
|
|
if(staffIdx != -1 && strcmp(dComIfGp_evmng_getMyActName(staffIdx), "WAIT") == 0) {
|
|
setAnm(getAnmType(param_1));
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 000004D8-000004F8 .text CheckCreateHeap__FP10fopAc_ac_c */
|
|
static BOOL CheckCreateHeap(fopAc_ac_c* i_this) {
|
|
return static_cast<daNpc_Cb1_c*>(i_this)->createHeap();
|
|
}
|
|
|
|
/* 000004F8-00000814 .text create__11daNpc_Cb1_cFv */
|
|
cPhs_State daNpc_Cb1_c::create() {
|
|
fopAcM_ct(this, daNpc_Cb1_c);
|
|
|
|
if(!isTypeBossDie()) {
|
|
#if VERSION == VERSION_DEMO
|
|
if(dComIfGs_isStageBossEnemy(dSv_save_c::STAGE_WT))
|
|
#else
|
|
if(dComIfGs_checkGetItem(dItem_MASTER_SWORD_3_e))
|
|
#endif
|
|
{
|
|
if(!isTypeKazeBoss()) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
}
|
|
else if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_2910)) {
|
|
if(!isTypeKaze()) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
}
|
|
else if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_2E02)) {
|
|
if(!isTypeEkaze()) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
}
|
|
else if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_1610)) {
|
|
if(strcmp(dComIfGp_getStartStageName(), "sea") != 0 || !dComIfGs_isEventBit(dSv_event_flag_c::UNK_1604)) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
}
|
|
else if(dComIfGs_checkGetItem(dItem_MASTER_SWORD_2_e)) {
|
|
if(!isTypeWaterFall()) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
}
|
|
else if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_1820)) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
else if(dComIfGs_checkGetItem(dItem_PEARL_FARORE_e)) {
|
|
if(!isTypeForest()) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
}
|
|
else {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
}
|
|
|
|
cPhs_State result = dComIfG_resLoad(&mPhs, "Cb");
|
|
if(result == cPhs_COMPLEATE_e) {
|
|
if(isTypeKaze()) {
|
|
if(dComIfGs_getPlayerPriestFlag() == 1) {
|
|
dComIfGs_setRestartOption(&dComIfGs_getPlayerPriestPos(), dComIfGs_getPlayerPriestRotate(), dComIfGs_getPlayerPriestRoomNo(), 1);
|
|
}
|
|
|
|
#if VERSION > VERSION_DEMO
|
|
checkRestart(1);
|
|
#endif
|
|
}
|
|
#if VERSION == VERSION_DEMO
|
|
checkRestart(1);
|
|
#endif
|
|
|
|
if(dComIfGp_getCb1Player()) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
|
|
#if VERSION == VERSION_DEMO
|
|
if(isTypeForest() || isTypeWaterFall() || isTypeEkaze() || isTypeKaze())
|
|
#else
|
|
if(isTypeKazeBoss() || isTypeForest() || isTypeWaterFall() || isTypeEkaze() || isTypeKaze())
|
|
#endif
|
|
{
|
|
onMusic();
|
|
}
|
|
|
|
if(!fopAcM_entrySolidHeap(this, CheckCreateHeap, 0x9400)) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
|
|
setBaseMtx();
|
|
fopAcM_SetMtx(this, mpMorf->getModel()->getBaseTRMtx());
|
|
|
|
if(!init()) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
|
|
fopAcM_setStageLayer(this);
|
|
|
|
if(l_HIO.mNo < 0) {
|
|
l_HIO.mNo = mDoHIO_createChild("マコレ", &l_HIO);
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
/* 00000814-00000984 .text nodeCallBack__FP7J3DNodei */
|
|
static BOOL nodeCallBack(J3DNode* node, int calcTiming) {
|
|
if (calcTiming == J3DNodeCBCalcTiming_In) {
|
|
J3DJoint* joint = (J3DJoint*)node;
|
|
J3DModel* model = j3dSys.getModel();
|
|
|
|
daNpc_Cb1_c* a_this = (daNpc_Cb1_c*)model->getUserArea();
|
|
if (a_this != NULL) {
|
|
static cXyz l_offsetAttPos(0.0f, 0.0f, 0.0f);
|
|
static cXyz l_offsetEyePos(20.0f, 10.0f, 0.0f);
|
|
|
|
s32 jnt_no = joint->getJntNo();
|
|
mDoMtx_stack_c::copy(model->getAnmMtx(jnt_no));
|
|
mDoMtx_stack_c::XrotM(a_this->getBackbone_y());
|
|
mDoMtx_stack_c::ZrotM(-a_this->getBackbone_x());
|
|
mDoMtx_stack_c::multVec(&l_offsetEyePos, &a_this->getEyePos());
|
|
|
|
a_this->incAttnSetCount();
|
|
|
|
cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx);
|
|
model->setAnmMtx(jnt_no, mDoMtx_stack_c::get());
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00000984-00000CF4 .text nutNodeCallBack__FP7J3DNodei */
|
|
static BOOL nutNodeCallBack(J3DNode* node, int calcTiming) {
|
|
if (calcTiming == J3DNodeCBCalcTiming_In) {
|
|
J3DJoint* joint = (J3DJoint*)node;
|
|
J3DModel* model = j3dSys.getModel();
|
|
|
|
daNpc_Cb1_c* a_this = (daNpc_Cb1_c*)model->getUserArea();
|
|
if (a_this != NULL) {
|
|
static cXyz l_nutOffset(0.0f, 0.0f, 0.0f);
|
|
static cXyz l_nutBase(1.0f, 0.0f, 0.0f);
|
|
|
|
s32 jnt_no = joint->getJntNo();
|
|
|
|
cXyz temp2(model->getAnmMtx(jnt_no)[0][3], model->getAnmMtx(jnt_no)[1][3], model->getAnmMtx(jnt_no)[2][3]);
|
|
a_this->getNutPos() += a_this->getNusSpeed();
|
|
cXyz temp = a_this->getNutPos() - temp2;
|
|
|
|
f32 temp4 = temp.abs();
|
|
f32 f1;
|
|
if(!cM3d_IsZero(temp4)) {
|
|
f1 = 14.0f / temp4;
|
|
temp *= f1;
|
|
}
|
|
|
|
a_this->getNutPos() = temp2 + temp;
|
|
|
|
a_this->getNusSpeed() += temp * -0.15f;
|
|
a_this->getNusSpeed().y += -1.3f;
|
|
|
|
f32 temp5 = a_this->getNusSpeed().abs();
|
|
if(!cM3d_IsZero(temp5)) {
|
|
f1 = 5.8f / temp5;
|
|
a_this->getNusSpeed() *= f1;
|
|
}
|
|
|
|
Mtx temp3;
|
|
cM3d_UpMtx_Base(l_nutBase, temp, temp3);
|
|
model->getAnmMtx(jnt_no)[0][0] = temp3[0][0];
|
|
model->getAnmMtx(jnt_no)[0][1] = temp3[0][1];
|
|
model->getAnmMtx(jnt_no)[0][2] = temp3[0][2];
|
|
model->getAnmMtx(jnt_no)[1][0] = temp3[1][0];
|
|
model->getAnmMtx(jnt_no)[1][1] = temp3[1][1];
|
|
model->getAnmMtx(jnt_no)[1][2] = temp3[1][2];
|
|
model->getAnmMtx(jnt_no)[2][0] = temp3[2][0];
|
|
model->getAnmMtx(jnt_no)[2][1] = temp3[2][1];
|
|
model->getAnmMtx(jnt_no)[2][2] = temp3[2][2];
|
|
cMtx_copy(model->getAnmMtx(jnt_no), J3DSys::mCurrentMtx);
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
static fpc_ProcID l_msgId;
|
|
static msg_class* l_msg;
|
|
|
|
/* 00000CF4-00000D9C .text ppNodeCallBack__FP7J3DNodei */
|
|
static BOOL ppNodeCallBack(J3DNode* node, int calcTiming) {
|
|
if (calcTiming == J3DNodeCBCalcTiming_In) {
|
|
J3DJoint* joint = (J3DJoint*)node;
|
|
J3DModel* model = j3dSys.getModel();
|
|
|
|
daNpc_Cb1_c* a_this = (daNpc_Cb1_c*)model->getUserArea();
|
|
if (a_this != NULL) {
|
|
s32 jnt_no = joint->getJntNo();
|
|
mDoMtx_stack_c::YrotS(a_this->getWork3());
|
|
mDoMtx_stack_c::revConcat(model->getAnmMtx(jnt_no));
|
|
cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx);
|
|
model->setAnmMtx(jnt_no, mDoMtx_stack_c::get());
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00000D9C-00001458 .text createHeap__11daNpc_Cb1_cFv */
|
|
BOOL daNpc_Cb1_c::createHeap() {
|
|
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("Cb", CB_BDL_CB);
|
|
JUT_ASSERT(DEMO_SELECT(937, 936), modelData != NULL);
|
|
|
|
mpMorf = new mDoExt_McaMorf(
|
|
modelData,
|
|
NULL, NULL,
|
|
NULL,
|
|
-1, 1.0f, 0, -1, 1,
|
|
NULL,
|
|
0x00080000,
|
|
0x11000022
|
|
);
|
|
|
|
if(mpMorf == NULL || mpMorf->getModel() == NULL) {
|
|
return FALSE;
|
|
}
|
|
|
|
m_backbone_jnt_num = modelData->getJointName()->getIndex("backbone");
|
|
JUT_ASSERT(DEMO_SELECT(949, 948), m_backbone_jnt_num >= 0);
|
|
|
|
m_armRend_jnt_num = modelData->getJointName()->getIndex("armRend");
|
|
JUT_ASSERT(DEMO_SELECT(952, 951), m_armRend_jnt_num >= 0);
|
|
|
|
m_armL2_jnt_num = modelData->getJointName()->getIndex("armL2");
|
|
JUT_ASSERT(DEMO_SELECT(955, 954), m_armL2_jnt_num >= 0);
|
|
|
|
modelData->getJointNodePointer(m_backbone_jnt_num)->setCallBack(nodeCallBack);
|
|
|
|
mpMorf->getModel()->setUserArea((u32)this);
|
|
|
|
mpFaceModel = mDoExt_J3DModel__create((J3DModelData*)dComIfG_getObjectRes("Cb", CB_BDL_CB_FACE), 0x00080000, 0x11000022);
|
|
if(mpFaceModel == NULL) {
|
|
return FALSE;
|
|
}
|
|
|
|
if(isMusic()) {
|
|
modelData = (J3DModelData*)dComIfG_getObjectRes("Cb", CB_BDL_CB_STICK);
|
|
JUT_ASSERT(DEMO_SELECT(973, 972), modelData != NULL);
|
|
mpStickModel = mDoExt_J3DModel__create(modelData, 0x00080000, 0x11000022);
|
|
if(mpStickModel == NULL) {
|
|
return FALSE;
|
|
}
|
|
|
|
m_nut_jnt_num = modelData->getJointName()->getIndex("nut");
|
|
JUT_ASSERT(DEMO_SELECT(983, 982), m_nut_jnt_num >= 0);
|
|
modelData->getJointNodePointer(m_nut_jnt_num)->setCallBack(nutNodeCallBack);
|
|
|
|
mpStickModel->setUserArea((u32)this);
|
|
|
|
modelData = (J3DModelData*)dComIfG_getObjectRes("Cb", CB_BDL_CB_CELLO);
|
|
JUT_ASSERT(DEMO_SELECT(990, 989), modelData != NULL);
|
|
mpCelloModel = mDoExt_J3DModel__create(modelData, 0x00080000, 0x11000022);
|
|
if(mpCelloModel == NULL) {
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
modelData = (J3DModelData*)dComIfG_getObjectRes("Cb", CB_BDL_PP);
|
|
JUT_ASSERT(DEMO_SELECT(1002, 1001), modelData != NULL);
|
|
mpPropellerModel = mDoExt_J3DModel__create(modelData, 0x00080000, 0x11000022);
|
|
if(mpPropellerModel == NULL) {
|
|
return FALSE;
|
|
}
|
|
|
|
m_center_jnt_num = modelData->getJointName()->getIndex("center");
|
|
modelData->getJointNodePointer(m_center_jnt_num)->setCallBack(ppNodeCallBack);
|
|
|
|
mpPropellerModel->setUserArea((u32)this);
|
|
|
|
if(!mPropellerBckAnim.init(modelData, (J3DAnmTransform*)dComIfG_getObjectRes("Cb", CB_BCK_M_OPEN), FALSE, J3DFrameCtrl::EMode_NONE)) {
|
|
return FALSE;
|
|
}
|
|
|
|
modelData = (J3DModelData*)dComIfG_getObjectRes("Cb", CB_BDL_CB_NUT);
|
|
JUT_ASSERT(DEMO_SELECT(1026, 1025), modelData != NULL);
|
|
mpNutModel = mDoExt_J3DModel__create(modelData, 0x00080000, 0x11000022);
|
|
if(mpNutModel == NULL) {
|
|
return FALSE;
|
|
}
|
|
|
|
if(!mNutBckAnim.init(modelData, (J3DAnmTransform*)dComIfG_getObjectRes("Cb", CB_BCK_NUT_SOW), TRUE, J3DFrameCtrl::EMode_NONE)) {
|
|
return FALSE;
|
|
}
|
|
|
|
mAcchCir[0].SetWall(20.0f, 20.0f);
|
|
mAcchCir[1].SetWall(80.0f, 20.0f);
|
|
mAcch.SetRoofCrrHeight(100.0f);
|
|
mAcch.ClrRoofNone();
|
|
mAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, ARRAY_SIZE(mAcchCir), mAcchCir, fopAcM_GetSpeed_p(this));
|
|
mAcch.OnLineCheck();
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00001458-0000155C .text setAction__11daNpc_Cb1_cFPM11daNpc_Cb1_cFPCvPvPv_iM11daNpc_Cb1_cFPCvPvPv_iPv */
|
|
BOOL daNpc_Cb1_c::setAction(daNpc_Cb1_c::ActionFunc_t* param_1, daNpc_Cb1_c::ActionFunc_t param_2, void* param_3) {
|
|
#if VERSION > VERSION_DEMO
|
|
setFlyingTimer(0);
|
|
offFlying();
|
|
#endif
|
|
|
|
if(*param_1 != param_2) {
|
|
if(*param_1) {
|
|
m8F0 = -1;
|
|
(this->**param_1)(param_3);
|
|
}
|
|
|
|
*param_1 = param_2;
|
|
|
|
m8F0 = 0;
|
|
m8F4 = 0;
|
|
m8F6 = 0;
|
|
m8F8 = 0;
|
|
m8FA = 0;
|
|
m8FC = 0.0f;
|
|
m8F1 = 0;
|
|
m8F2 = 0;
|
|
shape_angle.x = 0;
|
|
shape_angle.z = 0;
|
|
attention_info.flags = 0;
|
|
|
|
(this->**param_1)(param_3);
|
|
|
|
m8F0++;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 0000155C-000015C0 .text setWaitAction__11daNpc_Cb1_cFPv */
|
|
void daNpc_Cb1_c::setWaitAction(void* param_1) {
|
|
if(dComIfGp_getPlayer(0) == this) {
|
|
setPlayerAction(&daNpc_Cb1_c::waitPlayerAction, NULL);
|
|
}
|
|
else {
|
|
setWaitNpcAction(param_1);
|
|
}
|
|
}
|
|
|
|
/* 000015C0-00001634 .text setWaitNpcAction__11daNpc_Cb1_cFPv */
|
|
void daNpc_Cb1_c::setWaitNpcAction(void*) {
|
|
setNpcAction(isShipRide() ? &daNpc_Cb1_c::shipNpcAction : (isMusic() ? &daNpc_Cb1_c::musicNpcAction : &daNpc_Cb1_c::waitNpcAction), NULL);
|
|
}
|
|
|
|
/* 00001634-000016A4 .text npcAction__11daNpc_Cb1_cFPv */
|
|
void daNpc_Cb1_c::npcAction(void* param_1) {
|
|
if(!mNpcAction) {
|
|
speedF = 0.0f;
|
|
setWaitNpcAction(NULL);
|
|
}
|
|
|
|
(this->*mNpcAction)(param_1);
|
|
}
|
|
|
|
/* 000016A4-00001708 .text setNpcAction__11daNpc_Cb1_cFM11daNpc_Cb1_cFPCvPvPv_iPv */
|
|
void daNpc_Cb1_c::setNpcAction(daNpc_Cb1_c::ActionFunc_t param_1, void* param_2) {
|
|
mPlayerAction = NULL;
|
|
setAction(&mNpcAction, param_1, param_2);
|
|
}
|
|
|
|
/* 00001708-000017AC .text playerAction__11daNpc_Cb1_cFPv */
|
|
void daNpc_Cb1_c::playerAction(void* param_1) {
|
|
if(!mPlayerAction) {
|
|
speedF = 0.0f;
|
|
setPlayerAction(&daNpc_Cb1_c::waitPlayerAction, NULL);
|
|
}
|
|
|
|
dComIfGp_setDoStatus(dActStts_FLY_e);
|
|
|
|
(this->*mPlayerAction)(param_1);
|
|
}
|
|
|
|
/* 000017AC-00001810 .text setPlayerAction__11daNpc_Cb1_cFM11daNpc_Cb1_cFPCvPvPv_iPv */
|
|
void daNpc_Cb1_c::setPlayerAction(daNpc_Cb1_c::ActionFunc_t param_1, void* param_2) {
|
|
mNpcAction = NULL;
|
|
setAction(&mPlayerAction, param_1, param_2);
|
|
}
|
|
|
|
/* 00001810-00001858 .text getStickAngY__11daNpc_Cb1_cFv */
|
|
s16 daNpc_Cb1_c::getStickAngY() {
|
|
return 0x8000 + g_mDoCPd_cpadInfo[0].mMainStickAngle + dCam_getControledAngleY(dComIfGp_getCamera(0));
|
|
}
|
|
|
|
/* 00001858-000019B0 .text calcStickPos__11daNpc_Cb1_cFsP4cXyz */
|
|
int daNpc_Cb1_c::calcStickPos(s16 param_1, cXyz* param_2) {
|
|
// This temp variable for attention is probably a fakematch, but it fixes a regswap in dAttention_c::Lockon.
|
|
dAttention_c& attention = dComIfGp_getAttention();
|
|
dAttList_c* attList = attention.GetLockonList(0);
|
|
|
|
bool r26 = attention.Lockon();
|
|
|
|
int r31 = !r26 ? 0 : (attention.LockonTruth() ? 1 : -1);
|
|
|
|
if (attList == NULL) {
|
|
attList = attention.GetActionList(0);
|
|
}
|
|
if (attList) {
|
|
*param_2 = attList->getActor()->eyePos;
|
|
return r31;
|
|
}
|
|
|
|
if (r26) {
|
|
param_1 = shape_angle.y;
|
|
}
|
|
|
|
param_2->set(
|
|
current.pos.x + 100.0f * cM_ssin(param_1),
|
|
current.pos.y,
|
|
current.pos.z + 100.0f * cM_scos(param_1)
|
|
);
|
|
|
|
return r31;
|
|
}
|
|
|
|
/* 000019B0-00001A18 .text flyCheck__11daNpc_Cb1_cFv */
|
|
BOOL daNpc_Cb1_c::flyCheck() {
|
|
if(!CPad_CHECK_TRIG_A(0)) {
|
|
return FALSE;
|
|
}
|
|
|
|
setPlayerAction(&daNpc_Cb1_c::flyPlayerAction, NULL);
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00001A18-00001B28 .text checkLanding__11daNpc_Cb1_cFv */
|
|
void daNpc_Cb1_c::checkLanding() {
|
|
if(m900 > 200.0f) {
|
|
if(dComIfG_Bgsp()->GetSpecialCode(mAcch.m_gnd) != 1) {
|
|
fopAcM_monsSeStart(this, JA_SE_CV_CB_LANDING, 0);
|
|
}
|
|
|
|
int temp;
|
|
dComIfGp_particle_setSimpleLand(mAcch.m_gnd, ¤t.pos, &shape_angle, 1.25f, 1.5f, 1.0f, &tevStr, &temp, 7);
|
|
}
|
|
else {
|
|
int temp;
|
|
dComIfGp_particle_setSimpleLand(mAcch.m_gnd, ¤t.pos, &shape_angle, 0.625f, 0.75f, 0.5f, &tevStr, &temp, 7);
|
|
}
|
|
}
|
|
|
|
/* 00001B28-00001B68 .text breaking__11daNpc_Cb1_cFv */
|
|
void daNpc_Cb1_c::breaking() {
|
|
cLib_addCalc(&speedF, 0.0f, l_HIO.mDecelScale, l_HIO.mMaxDecel, l_HIO.mDecel);
|
|
}
|
|
|
|
/* 00001B68-0000270C .text flyAction__11daNpc_Cb1_cFifsi */
|
|
BOOL daNpc_Cb1_c::flyAction(BOOL param_1, f32 param_2, s16 param_3, BOOL param_4) {
|
|
bool isMakarPlayer = dComIfGp_getPlayer(0) == this;
|
|
f32 ySpeedLimit = l_HIO.field_0x98;
|
|
f32 temp3 = m8F8 * l_HIO.field_0x8C;
|
|
BOOL temp4 = FALSE;
|
|
|
|
if(mAcch.ChkGroundHit()) {
|
|
breaking();
|
|
cLib_chaseAngleS(&shape_angle.x, 0, l_HIO.field_0xE0);
|
|
cLib_chaseAngleS(&shape_angle.z, 0, l_HIO.field_0xE0);
|
|
gravity = l_HIO.field_0xA0 + temp3;
|
|
}
|
|
else if(m8F0 < 3) {
|
|
BOOL temp7 = calcFlyingTimer();
|
|
if(isMakarPlayer) {
|
|
if(temp7) {
|
|
fopAcM_monsSeStart(this, JA_SE_CV_CB_FLY_END, 0);
|
|
}
|
|
|
|
onFlying();
|
|
}
|
|
|
|
m900 = 0.0f;
|
|
|
|
cXyz temp(0.0f, temp3 + l_HIO.field_0xA0, 0.0f);
|
|
|
|
f32 temp5 = l_HIO.field_0x9C;
|
|
|
|
if(m8F2) {
|
|
temp.x += param_2 * cM_ssin(param_3);
|
|
temp.z += param_2 * cM_scos(param_3);
|
|
}
|
|
|
|
#if VERSION == VERSION_DEMO
|
|
if(mWindCyl.ChkTgHit())
|
|
#else
|
|
if(!isMusic() && mWindCyl.ChkTgHit())
|
|
#endif
|
|
{
|
|
cCcD_Obj* tg = mWindCyl.GetTgHitObj();
|
|
if(tg && tg->ChkAtType(AT_TYPE_WIND)) {
|
|
temp += *mWindCyl.GetTgRVecP() * 0.01f;
|
|
temp5 = 30.0f;
|
|
ySpeedLimit = 30.0f;
|
|
}
|
|
|
|
m8F8 = 20000;
|
|
temp4 = TRUE;
|
|
}
|
|
else {
|
|
cXyz temp3;
|
|
f32 power;
|
|
dKyw_get_AllWind_vec(¤t.pos, &temp3, &power);
|
|
power *= l_HIO.field_0xB8;
|
|
temp += temp3 * power;
|
|
temp5 += power;
|
|
ySpeedLimit += power;
|
|
s16 temp8 = power * 400.0f;
|
|
if(m8F8 < temp8) {
|
|
m8F8 = temp8;
|
|
}
|
|
}
|
|
|
|
s16 angle = cM_atan2s(temp.x, temp.z);
|
|
|
|
f32 temp6_2 = cLib_maxLimit(std::sqrtf(SQUARE(temp.x) + SQUARE(temp.z)), temp5);
|
|
angle = angle - shape_angle.y;
|
|
f32 temp6 = temp6_2 * l_HIO.field_0xA8;
|
|
if (temp6 > 14000.0f) {
|
|
temp6 = 14000.0f;
|
|
}
|
|
|
|
s16 cos = temp6 * cM_scos(angle);
|
|
s16 sin = -temp6 * cM_ssin(angle);
|
|
cLib_chaseAngleS(&shape_angle.x, cos, l_HIO.field_0xE0);
|
|
cLib_chaseAngleS(&shape_angle.z, sin, l_HIO.field_0xE0);
|
|
|
|
lookBack(0);
|
|
|
|
speed += temp;
|
|
|
|
f32 temp8 = speed.abs();
|
|
if(!cM3d_IsZero(temp8) && temp8 > temp5) {
|
|
f32 temp2 = temp8;
|
|
cLib_chaseF(&temp8, temp5, 1.0f);
|
|
if(temp8 > 30.0f) {
|
|
temp8 = 30.0f;
|
|
}
|
|
speed *= temp8 / temp2;
|
|
}
|
|
|
|
current.angle.y = cM_atan2s(speed.x, speed.z);
|
|
|
|
speedF = std::sqrtf(SQUARE(speed.x) + SQUARE(speed.z));
|
|
if(speed.y > ySpeedLimit) {
|
|
speed.y = ySpeedLimit;
|
|
}
|
|
gravity = 0.0f;
|
|
}
|
|
|
|
if(m8F0 == 1) {
|
|
if(m8D7) {
|
|
if(!mAcch.ChkGroundHit()) {
|
|
m8F8 = l_HIO.field_0xDA;
|
|
speed.y += l_HIO.field_0xB0;
|
|
setAnm(ANM_07);
|
|
}
|
|
else {
|
|
setAnm(ANM_05);
|
|
}
|
|
|
|
m8F0++;
|
|
}
|
|
else if(mpMorf->checkFrame(6.0f)) {
|
|
fopAcM_seStart(this, JA_SE_CM_PRAPELLO_OPEN, 0);
|
|
JPABaseEmitter* emitter = dComIfGp_particle_set(dPa_name::ID_AK_SN_PERAPROOPEN00, ¤t.pos);
|
|
if(emitter) {
|
|
emitter->setGlobalRTMatrix(mpPropellerModel->getAnmMtx(m_center_jnt_num));
|
|
}
|
|
}
|
|
}
|
|
else if(m8F0 == 2) {
|
|
if(isMakarPlayer && (temp4 || getFlyingTimer() < l_HIO.field_0xCE)) {
|
|
if(setAnm(ANM_15) && temp4) {
|
|
fopAcM_monsSeStart(this, JA_SE_CV_CB_FLY_END, 0);
|
|
}
|
|
}
|
|
else if(m8DC != 6 && m8FC > l_HIO.field_0xD8) {
|
|
setAnm(ANM_07);
|
|
}
|
|
|
|
if(getFlyingTimer() != 0 && param_1) {
|
|
cLib_chaseS(&m8F8, l_HIO.field_0xD0, l_HIO.field_0xD4);
|
|
m8F6 = 0;
|
|
}
|
|
else {
|
|
cLib_chaseS(&m8F8, mAcch.ChkGroundHit() ? l_HIO.field_0xD2 : 0, l_HIO.field_0xD6);
|
|
}
|
|
|
|
m8FA += m8F8;
|
|
m8FC += (current.pos.y - old.pos.y);
|
|
|
|
if(m8FC > l_HIO.field_0xA4) {
|
|
m8F2 = 1;
|
|
}
|
|
|
|
fopAcM_seStart(this, JA_SE_CM_PRAPELLO_ROLLING, m8F8 * (100.0f / l_HIO.field_0xD0));
|
|
|
|
if(param_4 || (!isMakarPlayer && mAcch.ChkWallHit()) || (!mAcch.ChkGroundHit() && m8F8 == 0) ||
|
|
(mAcch.ChkGroundHit() && m8F8 <= l_HIO.field_0xD2 && (g_mDoCPd_cpadInfo[0].mMainStickValue >= l_HIO.field_0x80 || ++m8F6 > l_HIO.field_0xCC))
|
|
) {
|
|
setAnm(ANM_06);
|
|
mpMorf->setFrame(8.0f);
|
|
m8F0++;
|
|
offFlying();
|
|
}
|
|
else if(mAcch.ChkGroundHit() && m8DC == 6) {
|
|
setAnm(ANM_05);
|
|
}
|
|
|
|
maxFallSpeed = l_HIO.field_0x90;
|
|
}
|
|
else {
|
|
if(m8DC == 4 && m8D7) {
|
|
setAnm(ANM_02);
|
|
fopAcM_seStart(this, JA_SE_CM_PRAPELLO_OPEN, 0);
|
|
}
|
|
|
|
if(mAcch.ChkGroundHit()) {
|
|
if(m8E0 == 0 && m8F0 == 3) {
|
|
if(dComIfG_Bgsp()->GetSpecialCode(mAcch.m_gnd) != 1) {
|
|
speed.y = l_HIO.field_0x64;
|
|
checkLanding();
|
|
}
|
|
|
|
m8F0++;
|
|
}
|
|
else if(m8DC != 4) {
|
|
if(isMakarPlayer) {
|
|
setPlayerAction(&daNpc_Cb1_c::waitPlayerAction, NULL);
|
|
}
|
|
else {
|
|
setNpcAction(&daNpc_Cb1_c::waitNpcAction, NULL);
|
|
|
|
dComIfGp_getCamera(0)->mCamera.ForceLockOff(fopAcM_GetID(this));
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 0000270C-00002818 .text walkAction__11daNpc_Cb1_cFffs */
|
|
BOOL daNpc_Cb1_c::walkAction(f32 targetSpeed, f32 accel, s16 targetAngle) {
|
|
cLib_chaseAngleS(¤t.angle.y, targetAngle, 0x400);
|
|
lookBack(1);
|
|
shape_angle.y = current.angle.y;
|
|
if(cLib_chaseF(&speedF, targetSpeed, accel) && targetSpeed == 0.0f) {
|
|
setNpcAction(&daNpc_Cb1_c::waitNpcAction, NULL);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
f32 playSpeed = std::fabsf(speedF) * l_HIO.mWalkAnmSpeedScale;
|
|
playSpeed = cLib_minLimit(playSpeed, l_HIO.mMaxWalkAnmSpeed);
|
|
mpMorf->setPlaySpeed(playSpeed);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/* 00002818-00002868 .text returnLinkPlayer__11daNpc_Cb1_cFv */
|
|
void daNpc_Cb1_c::returnLinkPlayer() {
|
|
changePlayer(dComIfGp_getLinkPlayer());
|
|
offFlying();
|
|
setWaitNpcAction(NULL);
|
|
}
|
|
|
|
/* 00002868-00002914 .text isFlyAction__11daNpc_Cb1_cFv */
|
|
BOOL daNpc_Cb1_c::isFlyAction() {
|
|
return chkPlayerAction(&daNpc_Cb1_c::flyPlayerAction) || chkNpcAction(&daNpc_Cb1_c::flyNpcAction);
|
|
}
|
|
|
|
/* 00002914-00002A2C .text sowCheck__11daNpc_Cb1_cFv */
|
|
BOOL daNpc_Cb1_c::sowCheck() {
|
|
#if VERSION > VERSION_DEMO
|
|
if(!dComIfGp_event_runCheck() && !isReturnLink())
|
|
#endif
|
|
{
|
|
dAttList_c* list = dComIfGp_getAttention().getActionBtnB();
|
|
if(list) {
|
|
fopAc_ac_c* actor = list->getActor();
|
|
|
|
if((list->mType == fopAc_Attn_TYPE_SPEAK_e || list->mType == fopAc_Attn_TYPE_TALK_e) && (actor->attention_info.flags & fopAc_Attn_UNK10000000_e)) {
|
|
if(m8E2 != 0x2D) {
|
|
#if VERSION == VERSION_DEMO
|
|
dComIfGp_getVibration().StartShock(2, -0x21, cXyz(0.0f, 1.0f, 0.0f));
|
|
#else
|
|
dComIfGp_getVibration().StartShock(4, -0x21, cXyz(0.0f, 1.0f, 0.0f));
|
|
#endif
|
|
}
|
|
|
|
dComIfGp_setDoStatus(dActStts_ba_nageru__dupe_2D);
|
|
|
|
if(CPad_CHECK_TRIG_A(0)) {
|
|
eventInfo.onCondition(dEvtCnd_CANTALK_e);
|
|
fopAcM_orderTalkEvent(this, actor);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
}
|
|
}
|
|
|
|
return flyCheck();
|
|
}
|
|
|
|
/* 00002A2C-00002AD8 .text shipRideCheck__11daNpc_Cb1_cFv */
|
|
BOOL daNpc_Cb1_c::shipRideCheck() {
|
|
if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_1604) && dComIfGp_getShipActor()) {
|
|
setNpcAction(&daNpc_Cb1_c::shipNpcAction, NULL);
|
|
onShipRide();
|
|
fopDwTg_DrawQTo(&draw_tag);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
#ifdef __MWERKS__
|
|
static
|
|
#endif
|
|
daNpc_Cb1_c::mode_entry_t daNpc_Cb1_c::m_evProcTbl[] = {
|
|
{
|
|
&daNpc_Cb1_c::evInitWait,
|
|
&daNpc_Cb1_c::evActWait
|
|
},
|
|
{
|
|
&daNpc_Cb1_c::evInitMsgSet,
|
|
&daNpc_Cb1_c::evActMsgSet
|
|
},
|
|
{
|
|
&daNpc_Cb1_c::evInitMsgEnd,
|
|
&daNpc_Cb1_c::evActMsgEnd
|
|
},
|
|
{
|
|
&daNpc_Cb1_c::evInitMovePos,
|
|
&daNpc_Cb1_c::evActMovePos
|
|
},
|
|
{
|
|
&daNpc_Cb1_c::evInitOffsetLink,
|
|
&daNpc_Cb1_c::evActOffsetLink
|
|
},
|
|
{
|
|
&daNpc_Cb1_c::evInitWalk,
|
|
&daNpc_Cb1_c::evActWalk
|
|
},
|
|
{
|
|
&daNpc_Cb1_c::evInitToLink,
|
|
&daNpc_Cb1_c::evActToLink
|
|
},
|
|
{
|
|
&daNpc_Cb1_c::evInitTact,
|
|
&daNpc_Cb1_c::evActTact
|
|
},
|
|
{
|
|
&daNpc_Cb1_c::evInitCelloPlay,
|
|
&daNpc_Cb1_c::evActCelloPlay
|
|
},
|
|
{
|
|
&daNpc_Cb1_c::evInitTurn,
|
|
&daNpc_Cb1_c::evActTurn
|
|
},
|
|
{
|
|
&daNpc_Cb1_c::evInitSow,
|
|
&daNpc_Cb1_c::evActSow
|
|
},
|
|
{
|
|
&daNpc_Cb1_c::evInitSetAnm,
|
|
&daNpc_Cb1_c::evActSetAnm
|
|
},
|
|
{
|
|
&daNpc_Cb1_c::evInitSetGoal,
|
|
&daNpc_Cb1_c::evActSetGoal
|
|
},
|
|
{
|
|
&daNpc_Cb1_c::evInitWarp,
|
|
&daNpc_Cb1_c::evActWarp
|
|
},
|
|
{
|
|
&daNpc_Cb1_c::evInitEnd,
|
|
&daNpc_Cb1_c::evActEnd
|
|
},
|
|
};
|
|
|
|
static char* l_cutNameTbl[] = {
|
|
"WAIT",
|
|
"MSG_SET",
|
|
"MSG_END",
|
|
"POS_MOV",
|
|
"OFFSET_LINK",
|
|
"WALK",
|
|
"TO_LINK",
|
|
"TACT",
|
|
"CELLOPLAY",
|
|
"TURN",
|
|
"SOW",
|
|
"SET_ANM",
|
|
"SET_GOAL",
|
|
"WARP",
|
|
"END",
|
|
};
|
|
|
|
/* 00002AD8-00002DC8 .text eventProc__11daNpc_Cb1_cFv */
|
|
BOOL daNpc_Cb1_c::eventProc() {
|
|
#if VERSION > VERSION_JPN
|
|
mAcch.ClrWallNone();
|
|
#endif
|
|
|
|
if(eventInfo.checkCommandDemoAccrpt() && m8DD != -1) {
|
|
if(m8DD == 0) {
|
|
fopAcM_onDraw(this);
|
|
}
|
|
else if(m8DD == 1) {
|
|
dComIfGp_event_setTalkPartner(dComIfGp_getLinkPlayer());
|
|
mDoAud_seStart(JA_SE_CTRL_NPC_TO_LINK);
|
|
}
|
|
|
|
onEventAccept();
|
|
m8DD = -1;
|
|
}
|
|
|
|
int staffIdx = dComIfGp_evmng_getMyStaffId("Cb1");
|
|
if(dComIfGp_event_runCheck() && (dComIfGp_getPlayer(0) == this || !checkCommandTalk())) {
|
|
if(staffIdx != -1) {
|
|
int actIdx = dComIfGp_evmng_getMyActIdx(staffIdx, l_cutNameTbl, ARRAY_SIZE(l_cutNameTbl), TRUE, 0);
|
|
if(actIdx == -1) {
|
|
dComIfGp_evmng_cutEnd(staffIdx);
|
|
}
|
|
else {
|
|
if(dComIfGp_evmng_getIsAddvance(staffIdx)) {
|
|
(this->*m_evProcTbl[actIdx].init)(staffIdx);
|
|
speedF = 0.0f;
|
|
}
|
|
|
|
if((this->*m_evProcTbl[actIdx].run)(staffIdx)) {
|
|
dComIfGp_evmng_cutEnd(staffIdx);
|
|
}
|
|
}
|
|
|
|
mPlayerAction = NULL;
|
|
mNpcAction = NULL;
|
|
|
|
#if VERSION > VERSION_JPN
|
|
mAcch.SetWallNone();
|
|
#endif
|
|
}
|
|
|
|
|
|
if(isEventAccept()) {
|
|
if(dComIfGp_evmng_endCheck(mEventIdx[m8E3])) {
|
|
dComIfGp_event_reset();
|
|
offEventAccept();
|
|
|
|
if(m8E3 == 1) {
|
|
returnLinkPlayer();
|
|
offReturnLink();
|
|
}
|
|
|
|
m8E3 = 0xFF;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
if(staffIdx != -1) {
|
|
return TRUE;
|
|
}
|
|
|
|
#if VERSION > VERSION_DEMO
|
|
if(dComIfGp_getLinkPlayer()->eventInfo.checkCommandDoor() == FALSE) {
|
|
return TRUE;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/* 00002DC8-00002E5C .text evCheckDisp__11daNpc_Cb1_cFi */
|
|
void daNpc_Cb1_c::evCheckDisp(int staffIdx) {
|
|
int* pDisp = dComIfGp_evmng_getMyIntegerP(staffIdx, "Disp");
|
|
if(pDisp) {
|
|
if(*pDisp) {
|
|
fopAcM_onDraw(this);
|
|
}
|
|
else {
|
|
fopDwTg_DrawQTo(&draw_tag);
|
|
}
|
|
}
|
|
else {
|
|
fopAcM_onDraw(this);
|
|
}
|
|
}
|
|
|
|
/* 00002E5C-00002EF8 .text evInitWait__11daNpc_Cb1_cFi */
|
|
void daNpc_Cb1_c::evInitWait(int staffIdx) {
|
|
evCheckDisp(staffIdx);
|
|
|
|
int* pTimer = dComIfGp_evmng_getMyIntegerP(staffIdx, "Timer");
|
|
if(pTimer) {
|
|
m8EE = *pTimer;
|
|
}
|
|
else {
|
|
m8EE = 0;
|
|
}
|
|
|
|
setAnm(isMusic() ? ANM_08 : ANM_00);
|
|
}
|
|
|
|
/* 00002EF8-00002F5C .text evActWait__11daNpc_Cb1_cFi */
|
|
BOOL daNpc_Cb1_c::evActWait(int) {
|
|
s16 temp = m8EE;
|
|
if(cLib_chaseS(&m8EE, 0, 1)) {
|
|
if(temp < 0) {
|
|
dComIfGp_event_reset();
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/* 00002F5C-00002FF0 .text evInitMsgSet__11daNpc_Cb1_cFi */
|
|
void daNpc_Cb1_c::evInitMsgSet(int staffIdx) {
|
|
l_msgId = fpcM_ERROR_PROCESS_ID_e;
|
|
|
|
int* pMsgNo = dComIfGp_evmng_getMyIntegerP(staffIdx, "MsgNo");
|
|
if(pMsgNo) {
|
|
mMsgNo = *pMsgNo;
|
|
|
|
if(mMsgNo == 0x1520 && dComIfGs_isEventBit(dSv_event_flag_c::UNK_1840)) {
|
|
mMsgNo = 0x1522;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 00002FF0-00003010 .text evActMsgSet__11daNpc_Cb1_cFi */
|
|
BOOL daNpc_Cb1_c::evActMsgSet(int) {
|
|
return initTalk();
|
|
}
|
|
|
|
/* 00003010-00003014 .text evInitMsgEnd__11daNpc_Cb1_cFi */
|
|
void daNpc_Cb1_c::evInitMsgEnd(int) {}
|
|
|
|
/* 00003014-000030A4 .text evActMsgEnd__11daNpc_Cb1_cFi */
|
|
BOOL daNpc_Cb1_c::evActMsgEnd(int staffIdx) {
|
|
BOOL result = execTalk(0);
|
|
|
|
if(result) {
|
|
dComIfGp_evmng_getMyIntegerP(staffIdx, "EndMode");
|
|
setWaitAction(NULL);
|
|
}
|
|
else {
|
|
mJntCtrl.setTrn();
|
|
lookBack(1);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
/* 000030A4-000031E0 .text evInitMovePos__11daNpc_Cb1_cFi */
|
|
void daNpc_Cb1_c::evInitMovePos(int staffIdx) {
|
|
f32* pAngle = dComIfGp_evmng_getMyFloatP(staffIdx, "Angle");
|
|
if(pAngle) {
|
|
s16 angle = cM_deg2s(*pAngle);
|
|
current.angle.y = angle;
|
|
shape_angle.y = angle;
|
|
}
|
|
|
|
cXyz* pPos = dComIfGp_evmng_getMyXyzP(staffIdx, "Pos");
|
|
if(pPos) {
|
|
current.pos = *pPos;
|
|
}
|
|
|
|
const char* pShipRide = dComIfGp_evmng_getMyStringP(staffIdx, "ShipRide");
|
|
if(pShipRide) {
|
|
if(strcmp(pShipRide, "on") == 0) {
|
|
onShipRide();
|
|
}
|
|
else if(strcmp(pShipRide, "off") == 0) {
|
|
offShipRide();
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 000031E0-000031E8 .text evActMovePos__11daNpc_Cb1_cFi */
|
|
BOOL daNpc_Cb1_c::evActMovePos(int) {
|
|
return 1;
|
|
}
|
|
|
|
/* 000031E8-000032E4 .text evInitOffsetLink__11daNpc_Cb1_cFi */
|
|
void daNpc_Cb1_c::evInitOffsetLink(int staffIdx) {
|
|
daPy_lk_c* pLink = daPy_getPlayerLinkActorClass();
|
|
|
|
cXyz* pTo = dComIfGp_evmng_getMyXyzP(staffIdx, "To");
|
|
if(pTo) {
|
|
cXyz dest;
|
|
cLib_offsetPos(&dest, ¤t.pos, shape_angle.y, pTo);
|
|
pLink->setPlayerPosAndAngle(&dest, cLib_targetAngleY(&dest, ¤t.pos));
|
|
}
|
|
|
|
cXyz* pFrom = dComIfGp_evmng_getMyXyzP(staffIdx, "From");
|
|
if(pFrom) {
|
|
fopAc_ac_c* pPlayer = dComIfGp_getPlayer(0);
|
|
cLib_offsetPos(¤t.pos, &pLink->current.pos, pPlayer->shape_angle.y, pFrom);
|
|
}
|
|
|
|
current.angle.y = fopAcM_searchActorAngleY(this, dComIfGp_getPlayer(0));
|
|
shape_angle.y = current.angle.y;
|
|
}
|
|
|
|
/* 000032E4-000032EC .text evActOffsetLink__11daNpc_Cb1_cFi */
|
|
BOOL daNpc_Cb1_c::evActOffsetLink(int) {
|
|
return 1;
|
|
}
|
|
|
|
/* 000032EC-00003328 .text evInitWalk__11daNpc_Cb1_cFi */
|
|
void daNpc_Cb1_c::evInitWalk(int) {
|
|
setAnm(ANM_01);
|
|
speedF = 0.0f;
|
|
}
|
|
|
|
/* 00003328-0000373C .text evActWalk__11daNpc_Cb1_cFi */
|
|
BOOL daNpc_Cb1_c::evActWalk(int staffIdx) {
|
|
f32* speed_p = dComIfGp_evmng_getMyFloatP(staffIdx, "Speed");
|
|
f32* pDist = dComIfGp_evmng_getMyFloatP(staffIdx, "Dist");
|
|
|
|
JUT_ASSERT(VERSION_SELECT(2042, 2055, 2060, 2060), speed_p != NULL);
|
|
|
|
cXyz* pPos = dComIfGp_evmng_getMyXyzP(staffIdx, "Pos");
|
|
cXyz temp;
|
|
cXyz temp2;
|
|
cXyz temp4;
|
|
if(pPos) {
|
|
temp = *pPos;
|
|
temp4 = *pPos;
|
|
}
|
|
else {
|
|
cXyz* pOffset = dComIfGp_evmng_getMyXyzP(staffIdx, "Offset");
|
|
if(pOffset) {
|
|
fopAc_ac_c* target = dComIfGp_event_getTalkPartner();
|
|
JUT_ASSERT(VERSION_SELECT(2059, 2072, 2077, 2077), target != NULL);
|
|
|
|
cLib_offsetPos(&temp, &target->current.pos, fopAcM_searchActorAngleY(this, target), pOffset);
|
|
temp4 = target->current.pos;
|
|
}
|
|
else {
|
|
temp = *dComIfGp_evmng_getGoal();
|
|
temp4 = temp;
|
|
}
|
|
}
|
|
|
|
temp2 = temp - current.pos;
|
|
s16 angle = cM_atan2s(temp2.x, temp2.z);
|
|
|
|
if(!pDist) {
|
|
if(temp2.absXZ() <= *speed_p) {
|
|
setAnm(ANM_00);
|
|
current.pos = temp;
|
|
speedF = 0.0f;
|
|
|
|
return TRUE;
|
|
}
|
|
}
|
|
else {
|
|
if(temp2.absXZ() < *pDist) {
|
|
setAnm(ANM_00);
|
|
speedF = 0.0f;
|
|
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
f32 walkSpeed = *speed_p;
|
|
if(cLib_distanceAngleS(shape_angle.y, angle) > 0x4000) {
|
|
walkSpeed = -walkSpeed;
|
|
angle += 0x8000;
|
|
}
|
|
|
|
if(mAcch.ChkGroundHit()) {
|
|
walkAction(walkSpeed, l_HIO.mForwardAccel, angle);
|
|
}
|
|
else if(m8E0) {
|
|
speed.y = 10.0f;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/* 0000373C-00003798 .text evInitToLink__11daNpc_Cb1_cFi */
|
|
void daNpc_Cb1_c::evInitToLink(int) {
|
|
setAnm(ANM_01);
|
|
speedF = 0.0f;
|
|
current.angle.y = fopAcM_searchActorAngleY(this, dComIfGp_getPlayer(0));
|
|
shape_angle.y = current.angle.y;
|
|
}
|
|
|
|
/* 00003798-000038D8 .text evActToLink__11daNpc_Cb1_cFi */
|
|
BOOL daNpc_Cb1_c::evActToLink(int staffIdx) {
|
|
f32* speed_p = dComIfGp_evmng_getMyFloatP(staffIdx, "Speed");
|
|
f32* dist_p = dComIfGp_evmng_getMyFloatP(staffIdx, "Dist");
|
|
|
|
JUT_ASSERT(VERSION_SELECT(2131, 2144, 2149, 2149), speed_p != NULL && dist_p != NULL);
|
|
|
|
if(fopAcM_searchActorDistanceXZ(this, dComIfGp_getPlayer(0)) < *dist_p) {
|
|
setAnm(ANM_00);
|
|
speedF = 0.0f;
|
|
|
|
return TRUE;
|
|
}
|
|
else {
|
|
walkAction(*speed_p, l_HIO.mForwardAccel, fopAcM_searchActorAngleY(this, dComIfGp_getPlayer(0)));
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/* 000038D8-000038FC .text evInitTact__11daNpc_Cb1_cFi */
|
|
void daNpc_Cb1_c::evInitTact(int) {
|
|
setAnm(ANM_08);
|
|
}
|
|
|
|
/* 000038FC-00003A2C .text evActTact__11daNpc_Cb1_cFi */
|
|
BOOL daNpc_Cb1_c::evActTact(int staffIdx) {
|
|
int* pPrm0 = dComIfGp_evmng_getMyIntegerP(staffIdx, "prm0");
|
|
|
|
s32 prm = 0;
|
|
if(pPrm0) {
|
|
prm = *pPrm0;
|
|
}
|
|
|
|
s32 song = daPy_getPlayerActorClass()->getTactMusic();
|
|
if(song >= 0) {
|
|
onTactCorrect();
|
|
}
|
|
|
|
BOOL result = execTalk(1);
|
|
if(result) {
|
|
if(isTactCorrect()) {
|
|
offTactCorrect();
|
|
if(song == prm) {
|
|
mMsgNo = 0x1526;
|
|
}
|
|
else {
|
|
mMsgNo = 0x1523;
|
|
}
|
|
}
|
|
else {
|
|
m8DD = 3;
|
|
|
|
if(isTactCancel()) {
|
|
mMsgNo = 0x1525;
|
|
offTactCancel();
|
|
}
|
|
|
|
fopAcM_onDraw(this);
|
|
|
|
dComIfGp_event_reset();
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
/* 00003A2C-00003A50 .text evInitCelloPlay__11daNpc_Cb1_cFi */
|
|
void daNpc_Cb1_c::evInitCelloPlay(int) {
|
|
#if VERSION == VERSION_DEMO
|
|
setAnm(ANM_09);
|
|
#else
|
|
setAnm(ANM_17);
|
|
#endif
|
|
}
|
|
|
|
/* 00003A50-00003A84 .text evActCelloPlay__11daNpc_Cb1_cFi */
|
|
BOOL daNpc_Cb1_c::evActCelloPlay(int) {
|
|
return daPy_getPlayerLinkActorClass()->checkEndTactMusic() ? TRUE : FALSE;
|
|
}
|
|
|
|
/* 00003A84-00003ABC .text evInitTurn__11daNpc_Cb1_cFi */
|
|
void daNpc_Cb1_c::evInitTurn(int param_1) {
|
|
evCheckDisp(param_1);
|
|
setAnm(ANM_00);
|
|
}
|
|
|
|
/* 00003ABC-00003C0C .text evActTurn__11daNpc_Cb1_cFi */
|
|
BOOL daNpc_Cb1_c::evActTurn(int staffIdx) {
|
|
f32* pAngle = dComIfGp_evmng_getMyFloatP(staffIdx, "Angle");
|
|
|
|
s16 angle;
|
|
if(pAngle) {
|
|
angle = cM_deg2s(*pAngle);
|
|
}
|
|
else {
|
|
fopAc_ac_c* target;
|
|
if(dComIfGp_evmng_getMyIntegerP(staffIdx, "Target")) {
|
|
target = dComIfGp_getLinkPlayer();
|
|
}
|
|
else {
|
|
target = dComIfGp_event_getTalkPartner();
|
|
}
|
|
|
|
JUT_ASSERT(VERSION_SELECT(2308, 2321, 2326, 2326), target != NULL);
|
|
|
|
angle = fopAcM_searchActorAngleY(this, target);
|
|
}
|
|
|
|
if(cLib_chaseAngleS(&shape_angle.y, angle, 0x800)) {
|
|
shape_angle.y = angle;
|
|
current.angle.y = angle;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
current.angle.y = shape_angle.y;
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/* 00003C0C-00003CEC .text evInitSow__11daNpc_Cb1_cFi */
|
|
void daNpc_Cb1_c::evInitSow(int staffIdx) {
|
|
setAnm(ANM_0C);
|
|
|
|
mNutBckAnim.initPlay(mNutBckAnim.getBckAnm()->getFrameMax(), J3DFrameCtrl::EMode_NONE, 1.0f, 0, -1, true);
|
|
onNut();
|
|
|
|
int* timer_p = dComIfGp_evmng_getMyIntegerP(staffIdx, "Timer");
|
|
JUT_ASSERT(VERSION_SELECT(2353, 2366, 2371, 2371), timer_p != NULL);
|
|
|
|
m8EE = *timer_p;
|
|
}
|
|
|
|
/* 00003CEC-00003D90 .text evActSow__11daNpc_Cb1_cFi */
|
|
BOOL daNpc_Cb1_c::evActSow(int staffIdx) {
|
|
if(mNutBckAnim.play() && isNut()) {
|
|
offNut();
|
|
|
|
((daObjVmc::Act_c*)dComIfGp_event_getTalkPartner())->daObjVmc_ChangeGrow();
|
|
}
|
|
|
|
if(m8D7) {
|
|
setAnm(ANM_00);
|
|
}
|
|
|
|
if(cLib_calcTimer(&m8EE) == 0) {
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/* 00003D90-00003DF8 .text evInitSetAnm__11daNpc_Cb1_cFi */
|
|
void daNpc_Cb1_c::evInitSetAnm(int staffIdx) {
|
|
int* pNumber = dComIfGp_evmng_getMyIntegerP(staffIdx, "Number");
|
|
if(pNumber) {
|
|
setAnm(getAnmType(*pNumber));
|
|
}
|
|
}
|
|
|
|
/* 00003DF8-00003E00 .text evActSetAnm__11daNpc_Cb1_cFi */
|
|
BOOL daNpc_Cb1_c::evActSetAnm(int) {
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00003E00-00003E74 .text evInitSetGoal__11daNpc_Cb1_cFi */
|
|
void daNpc_Cb1_c::evInitSetGoal(int staffIdx) {
|
|
cXyz* pOffset = dComIfGp_evmng_getMyXyzP(staffIdx, "Offset");
|
|
if(pOffset) {
|
|
cLib_offsetPos(dComIfGp_evmng_getGoal(), ¤t.pos, shape_angle.y, pOffset);
|
|
}
|
|
}
|
|
|
|
/* 00003E74-00003E98 .text evActSetGoal__11daNpc_Cb1_cFi */
|
|
BOOL daNpc_Cb1_c::evActSetGoal(int param_1) {
|
|
#if VERSION > VERSION_JPN
|
|
evInitSetGoal(param_1);
|
|
#endif
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00003E98-00003EF4 .text evInitWarp__11daNpc_Cb1_cFi */
|
|
void daNpc_Cb1_c::evInitWarp(int) {
|
|
setAnm(ANM_00);
|
|
speed.y = REG18_F(13) + 2.5f;
|
|
m8EE = -(REG18_S(5) + 0x14);
|
|
}
|
|
|
|
/* 00003EF4-0000405C .text evActWarp__11daNpc_Cb1_cFi */
|
|
BOOL daNpc_Cb1_c::evActWarp(int) {
|
|
gravity = 0.0f;
|
|
|
|
if(m8EE < 0) {
|
|
if(cLib_chaseF(&speed.y, 0.0f, REG18_F(14) + 0.1f) && cLib_chaseS(&m8EE, 0, 1)) {
|
|
m8EE = 0;
|
|
}
|
|
}
|
|
else {
|
|
if(cLib_chaseS(&m8EE, REG18_S(6) + 8000, REG18_S(7) + 400)) {
|
|
cLib_chaseF(&speed.y, REG18_F(15) + 20.0f, REG18_F(16) + 0.5f);
|
|
cLib_chaseF(&scale.x, 0.0f, REG18_F(17) + 0.05f);
|
|
|
|
scale.z = scale.x;
|
|
|
|
if(cLib_chaseF(&scale.y, REG18_F(18) + 4.0f, REG18_F(19) + 0.05f)) {
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
current.angle.y += m8EE;
|
|
shape_angle.y = current.angle.y;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/* 0000405C-00004174 .text evInitEnd__11daNpc_Cb1_cFi */
|
|
void daNpc_Cb1_c::evInitEnd(int staffIdx) {
|
|
int* pEndMode = dComIfGp_evmng_getMyIntegerP(staffIdx, "EndMode");
|
|
|
|
int mode;
|
|
if(pEndMode == NULL) {
|
|
mode = 0;
|
|
}
|
|
else {
|
|
mode = *pEndMode;
|
|
}
|
|
|
|
if(mode == -2) {
|
|
if(mMsgNo == 0x1526) {
|
|
dComIfGp_setNextStage("Otkura", 0xE6, 0, 8);
|
|
dComIfGs_onEventBit(dSv_event_flag_c::UNK_1610);
|
|
dComIfGs_onEventBit(dSv_event_flag_c::UNK_1604);
|
|
}
|
|
|
|
dComIfGp_event_reset();
|
|
setWaitAction(NULL);
|
|
}
|
|
else if(mode == -1) {
|
|
dComIfGp_event_reset();
|
|
setWaitAction(NULL);
|
|
}
|
|
else {
|
|
setWaitAction(NULL);
|
|
}
|
|
}
|
|
|
|
/* 00004174-0000417C .text evActEnd__11daNpc_Cb1_cFi */
|
|
BOOL daNpc_Cb1_c::evActEnd(int) {
|
|
return TRUE;
|
|
}
|
|
|
|
/* 0000417C-000041A4 .text getAnmType__11daNpc_Cb1_cFi */
|
|
u8 daNpc_Cb1_c::getAnmType(int param_1) {
|
|
static u8 l_talkAnmType[] = {ANM_00, ANM_08, ANM_0A, ANM_0E, ANM_10, ANM_11, ANM_12, ANM_13, ANM_14, ANM_0D, ANM_17};
|
|
|
|
if((u32)param_1 < ARRAY_SIZE(l_talkAnmType)) {
|
|
return l_talkAnmType[param_1];
|
|
}
|
|
|
|
return l_talkAnmType[0];
|
|
}
|
|
|
|
/* 000041A4-00004228 .text initTalk__11daNpc_Cb1_cFv */
|
|
BOOL daNpc_Cb1_c::initTalk() {
|
|
if(l_msgId == fpcM_ERROR_PROCESS_ID_e) {
|
|
if(mMsgNo == 0x5AC) {
|
|
l_msgId = fopMsgM_tactMessageSet();
|
|
}
|
|
else {
|
|
l_msgId = fopMsgM_messageSet(mMsgNo, this);
|
|
}
|
|
}
|
|
else {
|
|
l_msg = fopMsgM_SearchByID(l_msgId);
|
|
if(l_msg) {
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/* 00004228-00004358 .text execTalk__11daNpc_Cb1_cFi */
|
|
BOOL daNpc_Cb1_c::execTalk(BOOL param_1) {
|
|
if(l_msg->mStatus == fopMsgStts_MSG_DISPLAYED_e) {
|
|
l_msg->mStatus = next_msgStatus(&mMsgNo);
|
|
|
|
if(l_msg->mStatus == fopMsgStts_MSG_CONTINUES_e) {
|
|
fopMsgM_messageSet(mMsgNo);
|
|
}
|
|
}
|
|
else if(l_msg->mStatus == fopMsgStts_INPUT_e) {
|
|
if(param_1) {
|
|
if(dComIfGp_checkMesgCancelButton()) {
|
|
l_msg->mStatus = fopMsgStts_MSG_ENDS_e;
|
|
fopMsgM_messageSendOn();
|
|
onTactCancel();
|
|
}
|
|
|
|
if(isTactCorrect()) {
|
|
l_msg->mStatus = fopMsgStts_MSG_ENDS_e;
|
|
fopMsgM_messageSendOn();
|
|
}
|
|
}
|
|
}
|
|
else if(l_msg->mStatus == fopMsgStts_MSG_TYPING_e) {
|
|
if(mMsgNo != 0x5AC) {
|
|
setAnm(getAnmType(dComIfGp_getMesgAnimeAttrInfo()));
|
|
}
|
|
}
|
|
else if(l_msg->mStatus == fopMsgStts_BOX_CLOSED_e) {
|
|
l_msg->mStatus = fopMsgStts_MSG_DESTROYED_e;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/* 00004358-0000461C .text waitNpcAction__11daNpc_Cb1_cFPv */
|
|
BOOL daNpc_Cb1_c::waitNpcAction(void* param_1) {
|
|
if(m8F0 == 0) {
|
|
if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_1610)) {
|
|
cLib_onBit<u32>(attention_info.flags, fopAc_Attn_ACTION_CARRY_e);
|
|
}
|
|
|
|
u8 anm = ANM_00;
|
|
if(param_1) {
|
|
u32 seNum;
|
|
|
|
if(isPlayerFind()) {
|
|
anm = ANM_0F;
|
|
seNum = JA_SE_CV_CB_LEFT_ALONE;
|
|
}
|
|
else {
|
|
anm = ANM_14;
|
|
seNum = JA_SE_CV_CB_TROUBLE;
|
|
}
|
|
|
|
fopAcM_monsSeStart(this, seNum, 0);
|
|
}
|
|
|
|
setAnm(anm);
|
|
offPlayerFind();
|
|
speedF = 0.0f;
|
|
}
|
|
else if(m8F0 != -1) {
|
|
if(m8E1) {
|
|
setNpcAction(&daNpc_Cb1_c::searchNpcAction, NULL);
|
|
}
|
|
else {
|
|
mHasAttention = chkAttention(m8DC == 0x14 ? 4000.0f : l_HIO.mNpc.mMaxAttnDistXZ, 0x10000);
|
|
|
|
BOOL temp = mHasAttention;
|
|
if(temp) {
|
|
if(getMsg()) {
|
|
m8DD = 6;
|
|
cLib_onBit<u32>(attention_info.flags, fopAc_Attn_ACTION_SPEAK_e | fopAc_Attn_LOCKON_TALK_e);
|
|
}
|
|
else {
|
|
cLib_offBit<u32>(attention_info.flags, fopAc_Attn_ACTION_SPEAK_e | fopAc_Attn_LOCKON_TALK_e);
|
|
}
|
|
}
|
|
else {
|
|
cLib_offBit<u32>(attention_info.flags, fopAc_Attn_ACTION_SPEAK_e | fopAc_Attn_LOCKON_TALK_e);
|
|
}
|
|
|
|
f32 dist_sq = fopAcM_searchActorDistance2(this, dComIfGp_getPlayer(0));
|
|
|
|
if(!checkNpcCallCommand()) {
|
|
if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_1610) && dist_sq < SQUARE(l_HIO.field_0xC0)) {
|
|
daPy_getPlayerLinkActorClass()->onNpcCall();
|
|
|
|
temp = TRUE;
|
|
}
|
|
}
|
|
else {
|
|
if(dist_sq >= SQUARE(l_HIO.mPlayerChaseDistance)) {
|
|
setNpcAction(&daNpc_Cb1_c::searchNpcAction, NULL);
|
|
}
|
|
|
|
temp = TRUE;
|
|
}
|
|
|
|
lookBack(temp);
|
|
|
|
current.angle.y = shape_angle.y;
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 0000461C-000047B0 .text talkNpcAction__11daNpc_Cb1_cFPv */
|
|
BOOL daNpc_Cb1_c::talkNpcAction(void*) {
|
|
if(m8F0 == 0) {
|
|
l_msgId = fpcM_ERROR_PROCESS_ID_e;
|
|
|
|
mMsgNo = getMsg();
|
|
|
|
cLib_offBit<u32>(attention_info.flags, fopAc_Attn_ACTION_CARRY_e);
|
|
|
|
if(!isMusic()) {
|
|
setAnm(isShipRide() ? ANM_0D : ANM_00);
|
|
}
|
|
}
|
|
else if(m8F0 != -1) {
|
|
mHasAttention = true;
|
|
|
|
if(m8F0 == 1) {
|
|
if(initTalk()) {
|
|
m8F0 = 2;
|
|
}
|
|
}
|
|
else if(m8F0 == 2) {
|
|
if(execTalk(0)) {
|
|
setWaitNpcAction(NULL);
|
|
|
|
dComIfGp_event_reset();
|
|
}
|
|
}
|
|
|
|
if(isShipRide()) {
|
|
daShip_c* pShip = dComIfGp_getShipActor();
|
|
if(pShip) {
|
|
fopAc_ac_c* pLink = dComIfGp_getLinkPlayer();
|
|
cXyz temp = current.pos - (pLink->current.pos - current.pos);
|
|
pShip->setAtnPos(&temp);
|
|
}
|
|
}
|
|
else {
|
|
mJntCtrl.setTrn();
|
|
lookBack(1);
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 000047B0-00004B74 .text carryNpcAction__11daNpc_Cb1_cFPv */
|
|
BOOL daNpc_Cb1_c::carryNpcAction(void*) {
|
|
if(m8F0 == 0) {
|
|
cLib_offBit<u32>(attention_info.flags, fopAc_Attn_ACTION_CARRY_e);
|
|
offNpcCallCommand();
|
|
m8F4 = fopAcM_toPlayerShapeAngleY(this);
|
|
|
|
if(isNoCarryAction()) {
|
|
fopAcM_monsSeStart(this, JA_SE_CV_CB_DAMAGE, 0);
|
|
setAnm(ANM_0B);
|
|
}
|
|
else {
|
|
fopAcM_monsSeStart(this, JA_SE_CV_CB_LIFT_UP, 0);
|
|
setAnm(ANM_03);
|
|
}
|
|
|
|
onNpcNotChange();
|
|
}
|
|
else if(m8F0 == -1) {
|
|
m904.y = 0.0f;
|
|
m904.z = 0.0f;
|
|
|
|
offNoCarryAction();
|
|
|
|
offNpcNotChange();
|
|
}
|
|
else {
|
|
if(isNoCarryAction()) {
|
|
mpMorf->setPlaySpeed(2.0f);
|
|
}
|
|
else {
|
|
setRestart(1);
|
|
|
|
daPy_py_c* pPlayer = (daPy_py_c*)dComIfGp_getPlayer(0);
|
|
f32 oldPlaySpeed = mpMorf->getPlaySpeed();
|
|
|
|
if(0.0f == pPlayer->getSpeedF() && pPlayer->getBaseAnimeFrame() <= mpMorf->getEndFrame()) {
|
|
mpMorf->setFrame(pPlayer->getBaseAnimeFrame());
|
|
mpMorf->setPlaySpeed(0.0f);
|
|
}
|
|
else {
|
|
mpMorf->setPlaySpeed(1.0f);
|
|
}
|
|
|
|
if(oldPlaySpeed != mpMorf->getPlaySpeed()) {
|
|
mpMorf->setMorf(4.0f);
|
|
}
|
|
|
|
cLib_chaseF(&m904.x, l_HIO.field_0x74, 1.0f);
|
|
cLib_chaseF(&m904.y, l_HIO.field_0x78, 1.0f);
|
|
cLib_chaseF(&m904.z, l_HIO.field_0x7C, 1.0f);
|
|
|
|
cLib_chaseAngleS(&m8F4, 0, 0x800);
|
|
shape_angle.y = pPlayer->shape_angle.y + m8F4;
|
|
}
|
|
|
|
if(!fopAcM_checkCarryNow(this)) {
|
|
if(fopAcM_GetSpeedF(this) > 0.0f) {
|
|
setNpcAction(&daNpc_Cb1_c::flyNpcAction, NULL);
|
|
}
|
|
else {
|
|
setNpcAction(&daNpc_Cb1_c::waitNpcAction, NULL);
|
|
}
|
|
}
|
|
|
|
mJntCtrl.lookAtTarget(&shape_angle.y, NULL, cXyz::Zero, shape_angle.y, 0, false);
|
|
current.angle.y = shape_angle.y;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00004B74-00004CBC .text flyNpcAction__11daNpc_Cb1_cFPv */
|
|
BOOL daNpc_Cb1_c::flyNpcAction(void*) {
|
|
s8 temp = m8F0;
|
|
if(temp == 0) {
|
|
speedF = l_HIO.mNpcFlyLaunchSpeedF;
|
|
speed.y = l_HIO.mNpcFlyLaunchSpeedY;
|
|
|
|
setAnm(ANM_04);
|
|
|
|
setFlyingTimer(l_HIO.mNpcFlyTimer);
|
|
|
|
m8FC = l_HIO.field_0xD8 + 1;
|
|
|
|
fopAcM_monsSeStart(this, JA_SE_CV_CB_THROW, 0);
|
|
}
|
|
else if(temp != -1) {
|
|
flyAction(m8F1 ? FALSE : TRUE, 0.0f, 0, FALSE);
|
|
|
|
if(temp != 1) {
|
|
m8F1 = (m8F1 + 1) % l_HIO.field_0xDE;
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00004CBC-00004D88 .text routeAngCheck__11daNpc_Cb1_cFR4cXyzPs */
|
|
void daNpc_Cb1_c::routeAngCheck(cXyz& param_1, s16* param_2) {
|
|
cXyz temp = m910.outprod(param_1);
|
|
s16 angle = cM_atan2s(temp.x, temp.z);
|
|
|
|
if((m910.y >= 1.0f && cLib_distanceAngleS(angle, *param_2) > 0x4000) || fopAcM_searchPlayerDistanceY(this) * temp.y < 0.0f) {
|
|
angle += 0x8000;
|
|
}
|
|
|
|
*param_2 = angle;
|
|
}
|
|
|
|
/* 00004D88-00004FEC .text routeWallCheck__11daNpc_Cb1_cFR4cXyzR4cXyzPs */
|
|
void daNpc_Cb1_c::routeWallCheck(cXyz& param_1, cXyz& param_2, s16* param_3) {
|
|
dBgS_LinChk lin_chk;
|
|
lin_chk.Set(¶m_1, ¶m_2, NULL);
|
|
|
|
if(dComIfG_Bgsp()->LineCross(&lin_chk)) {
|
|
cM3dGPla* pla = dComIfG_Bgsp()->GetTriPla(lin_chk);
|
|
if(pla) {
|
|
routeAngCheck(pla->mNormal, param_3);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 000053DC-0000565C .text checkForwardGroundY__11daNpc_Cb1_cFs */
|
|
f32 daNpc_Cb1_c::checkForwardGroundY(s16 param_1) {
|
|
cM3dGPla* pla = dComIfG_Bgsp()->GetTriPla(mAcchCir[0]);
|
|
|
|
if(pla && cLib_distanceAngleS(param_1, cM_atan2s(pla->mNormal.x, pla->mNormal.z)) > 0x4000) {
|
|
dBgS_GndChk gnd_chk;
|
|
gnd_chk.OffWall();
|
|
cXyz pos(current.pos.x + cM_ssin(param_1) * 80.0f, current.pos.y + 80.0f, current.pos.z + cM_scos(param_1) * 80.0f);
|
|
gnd_chk.SetPos(&pos);
|
|
return dComIfG_Bgsp()->GroundCross(&gnd_chk);
|
|
}
|
|
|
|
return -1e+7;
|
|
}
|
|
|
|
/* 000057F4-000058C8 .text checkWallJump__11daNpc_Cb1_cFs */
|
|
f32 daNpc_Cb1_c::checkWallJump(s16 param_1) {
|
|
f32 temp = checkForwardGroundY(param_1) - current.pos.y;
|
|
if(0.0f < temp && temp < 80.0f) {
|
|
return std::sqrtf(temp) * 3.8f;
|
|
}
|
|
|
|
return -1.0f;
|
|
}
|
|
|
|
/* 000058C8-0000593C .text chkWallHit__11daNpc_Cb1_cFv */
|
|
BOOL daNpc_Cb1_c::chkWallHit() {
|
|
if(mAcch.ChkWallHit()) {
|
|
s16 temp;
|
|
if(mAcchCir[0].ChkWallHit()) {
|
|
temp = mAcchCir[0].GetWallAngleY();
|
|
}
|
|
else if(mAcchCir[1].ChkWallHit()) {
|
|
temp = mAcchCir[1].GetWallAngleY();
|
|
}
|
|
|
|
return cLib_distanceAngleS(shape_angle.y, temp) > 0x6000;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/* 0000593C-00005F0C .text routeCheck__11daNpc_Cb1_cFfPs */
|
|
BOOL daNpc_Cb1_c::routeCheck(f32 param_1, s16* param_2) {
|
|
if(!mAcch.ChkGroundHit()) {
|
|
cXyz temp = current.pos;
|
|
current.pos = old.pos;
|
|
speedF = 0.0f;
|
|
m8E0 = 1;
|
|
|
|
dBgS_LinChk lin_chk;
|
|
lin_chk.Set(&temp, ¤t.pos, NULL);
|
|
|
|
if(dComIfG_Bgsp()->LineCross(&lin_chk)) {
|
|
cM3dGPla* pla = dComIfG_Bgsp()->GetTriPla(lin_chk);
|
|
if(pla && cLib_distanceAngleS(*param_2, cM_atan2s(pla->mNormal.x, pla->mNormal.z)) > 0x4000) {
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
if(mAcch.GetGroundH() - temp.y < -30.0f) {
|
|
return FALSE;
|
|
}
|
|
|
|
setNpcAction(&daNpc_Cb1_c::jumpNpcAction, NULL);
|
|
}
|
|
else {
|
|
if(chkWallHit()) {
|
|
f32 temp = checkWallJump(*param_2);
|
|
if(temp >= 0.0f) {
|
|
setNpcAction(&daNpc_Cb1_c::jumpNpcAction, &temp);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
if(param_1 > SQUARE(600.0f)) {
|
|
return FALSE;
|
|
}
|
|
|
|
if(std::fabsf(dComIfGp_getPlayer(0)->current.pos.y - current.pos.y) > 100.0f) {
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
cXyz temp(current.pos.x, current.pos.y + 100.0f, current.pos.z);
|
|
cXyz temp2(cM_ssin(*param_2) * 80.0f + current.pos.x, current.pos.y + 100.0f, cM_scos(*param_2) * 80.0f + current.pos.z);
|
|
routeWallCheck(temp, temp2, param_2);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00005F0C-000062F4 .text searchNpcAction__11daNpc_Cb1_cFPv */
|
|
BOOL daNpc_Cb1_c::searchNpcAction(void*) {
|
|
f32 temp2;
|
|
|
|
if(m8F0 == 0) {
|
|
cLib_onBit<u32>(attention_info.flags, fopAc_Attn_ACTION_CARRY_e);
|
|
setAnm(ANM_01);
|
|
}
|
|
else if(m8F0 != -1) {
|
|
s16 temp;
|
|
if(m8E1) {
|
|
s16 temp3 = m8E1 < 0 ? -0x4000 : 0x4000;
|
|
temp = temp3 + cM_atan2s(m91C.x, m91C.z);
|
|
}
|
|
else {
|
|
if(!checkNpcCallCommand()) {
|
|
temp2 = 0.0f;
|
|
|
|
if(speedF == 0.0f) {
|
|
setNpcAction(&daNpc_Cb1_c::waitNpcAction, NULL);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
temp2 = 0.0f;
|
|
temp = current.angle.y;
|
|
}
|
|
else {
|
|
mHasAttention = true;
|
|
|
|
fopAc_ac_c* pPlayer = dComIfGp_getPlayer(0);
|
|
|
|
BOOL door = pPlayer->eventInfo.checkCommandDoor();
|
|
f32 dist_sq = fopAcM_searchPlayerDistance2(this);
|
|
f32 dist_xz_sq = fopAcM_searchPlayerDistanceXZ2(this);
|
|
|
|
if(!door && dist_sq < SQUARE(l_HIO.mPlayerChaseDistance)) {
|
|
temp2 = 0.0f;
|
|
}
|
|
else {
|
|
temp2 = l_HIO.mChaseDistScale * std::sqrtf(dist_xz_sq);
|
|
temp2 = cLib_maxLimit(temp2, l_HIO.mMaxWalkSpeed);
|
|
}
|
|
|
|
temp = fopAcM_searchPlayerAngleY(this);
|
|
if(door || !routeCheck(dist_xz_sq, &temp) || dComIfGp_checkPlayerStatus0(0, daPyStts0_UNK2000000_e | daPyStts0_UNK100_e | daPyStts0_UNK1_e) || ((daPy_py_c*)pPlayer)->checkAttentionLock()) {
|
|
temp2 = 0.0f;
|
|
|
|
if(speedF == 0.0f) {
|
|
offNpcCallCommand();
|
|
|
|
setNpcAction(&daNpc_Cb1_c::waitNpcAction, this);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
temp2 = 0.0f;
|
|
temp = current.angle.y;
|
|
}
|
|
|
|
if(dist_xz_sq < SQUARE(400.0f) && cLib_distanceAngleS(shape_angle.y, temp) < 0x2000 && std::fabsf(fopAcM_searchPlayerDistanceY(this)) < 100.0f) {
|
|
onPlayerFind();
|
|
}
|
|
|
|
if(cLib_calcTimer(&m8DF) == 0) {
|
|
m8DE ^= 1;
|
|
m8DF = cLib_getRndValue(l_HIO.field_0xE2, l_HIO.field_0xE4);
|
|
}
|
|
|
|
temp += m8DE ? -l_HIO.field_0xE6 : l_HIO.field_0xE6;
|
|
}
|
|
}
|
|
|
|
if(mCyl.ChkCoHit()) {
|
|
setNpcAction(&daNpc_Cb1_c::hitNpcAction, NULL);
|
|
}
|
|
else {
|
|
walkAction(temp2, l_HIO.mForwardAccel, temp);
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 000062F4-00006440 .text hitNpcAction__11daNpc_Cb1_cFPv */
|
|
BOOL daNpc_Cb1_c::hitNpcAction(void*) {
|
|
if(m8F0 == 0) {
|
|
cLib_offBit<u32>(attention_info.flags, fopAc_Attn_ACTION_CARRY_e);
|
|
|
|
speedF = cLib_maxLimit(speedF, l_HIO.mMaxWalkSpeed * 0.5f);
|
|
speed.y = l_HIO.mHitSpeedScaleY * std::fabsf(speedF);
|
|
speedF *= l_HIO.mHitSpeedScaleF;
|
|
|
|
fopAcM_seStart(this, JA_SE_CM_CB_BOUND, 0);
|
|
|
|
setAnm(ANM_02);
|
|
}
|
|
else if(m8F0 != -1 && mAcch.ChkGroundHit()) {
|
|
speedF = 0.0f;
|
|
|
|
setNpcAction(&daNpc_Cb1_c::waitNpcAction, NULL);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00006440-00006518 .text jumpNpcAction__11daNpc_Cb1_cFPv */
|
|
BOOL daNpc_Cb1_c::jumpNpcAction(void* param_1) {
|
|
if(m8F0 == 0) {
|
|
if(param_1) {
|
|
speed.y = *(f32*)param_1;
|
|
}
|
|
else {
|
|
speed.y = 10.0f;
|
|
}
|
|
|
|
speedF = 4.0f;
|
|
m900 = 0.0f;
|
|
setAnm(ANM_16);
|
|
}
|
|
else if(m8F0 != -1 && mAcch.ChkGroundHit()) {
|
|
checkLanding();
|
|
speedF = 0.0f;
|
|
setNpcAction(&daNpc_Cb1_c::waitNpcAction, NULL);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00006518-00006574 .text rescueNpcAction__11daNpc_Cb1_cFPv */
|
|
BOOL daNpc_Cb1_c::rescueNpcAction(void*) {
|
|
#if VERSION <= VERSION_JPN
|
|
if(m8F0 == 0) {
|
|
setAnm(ANM_00);
|
|
fopDwTg_DrawQTo(&draw_tag);
|
|
} else if(m8F0 != -1) {
|
|
m8DD = 0;
|
|
}
|
|
#else
|
|
if(m8F0 != -1) {
|
|
if(m8F0 == 0) {
|
|
setAnm(ANM_00);
|
|
fopDwTg_DrawQTo(&draw_tag);
|
|
}
|
|
|
|
m8DD = 0;
|
|
}
|
|
#endif
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00006574-00006658 .text musicNpcAction__11daNpc_Cb1_cFPv */
|
|
BOOL daNpc_Cb1_c::musicNpcAction(void*) {
|
|
if(m8F0 == 0) {
|
|
setAnm(ANM_09);
|
|
}
|
|
#if VERSION == VERSION_DEMO
|
|
else if(m8F0 != -1)
|
|
#else
|
|
else if(m8F0 != -1 && !isTypeKazeBoss())
|
|
#endif
|
|
{
|
|
#if VERSION == VERSION_DEMO
|
|
getStickAngY();
|
|
#endif
|
|
cLib_addCalcAngleS(&shape_angle.y, home.angle.y, 8, 0x2000, 0x400);
|
|
current.angle.y = shape_angle.y;
|
|
|
|
mHasAttention = chkAttention(l_HIO.mNpc.mMaxAttnDistXZ, 0x10000);
|
|
|
|
if(mHasAttention) {
|
|
if(isTypeWaterFall()) {
|
|
m8DD = 7;
|
|
}
|
|
else {
|
|
m8DD = 6;
|
|
}
|
|
|
|
cLib_onBit<u32>(attention_info.flags, fopAc_Attn_ACTION_SPEAK_e | fopAc_Attn_LOCKON_TALK_e);
|
|
}
|
|
else {
|
|
cLib_offBit<u32>(attention_info.flags, fopAc_Attn_ACTION_SPEAK_e | fopAc_Attn_LOCKON_TALK_e);
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00006658-000067A4 .text shipNpcAction__11daNpc_Cb1_cFPv */
|
|
BOOL daNpc_Cb1_c::shipNpcAction(void*) {
|
|
if(m8F0 == 0) {
|
|
onNpcNotChange();
|
|
|
|
setAnm(ANM_0D);
|
|
|
|
speedF = 0.0f;
|
|
|
|
m8F0++;
|
|
}
|
|
else if(m8F0 != -1) {
|
|
if(!dComIfGs_isEventBit(dSv_event_flag_c::UNK_1604)) {
|
|
setNpcAction(&daNpc_Cb1_c::waitNpcAction, NULL);
|
|
offShipRide();
|
|
}
|
|
else {
|
|
mHasAttention = chkAttention(500.0f, l_HIO.mNpc.mMaxAttnAngleY);
|
|
|
|
BOOL temp = mHasAttention;
|
|
if(temp && !dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e) && getMsg()) {
|
|
m8DD = 6;
|
|
cLib_onBit<u32>(attention_info.flags, fopAc_Attn_ACTION_SPEAK_e | fopAc_Attn_LOCKON_TALK_e);
|
|
}
|
|
else {
|
|
cLib_offBit<u32>(attention_info.flags, fopAc_Attn_ACTION_SPEAK_e | fopAc_Attn_LOCKON_TALK_e);
|
|
}
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 000067A4-000069E8 .text waitPlayerAction__11daNpc_Cb1_cFPv */
|
|
BOOL daNpc_Cb1_c::waitPlayerAction(void*) {
|
|
if(m8F0 == 0) {
|
|
setAnm(ANM_00);
|
|
cLib_onBit<u32>(attention_info.flags, ~0);
|
|
}
|
|
else if(m8F0 != -1 && !sowCheck()) {
|
|
dAttention_c& attention = dComIfGp_getAttention();
|
|
|
|
if(g_mDoCPd_cpadInfo[0].mMainStickValue >= l_HIO.field_0x80 || attention.Lockon()) {
|
|
s16 target = getStickAngY();
|
|
cLib_addCalcAngleS(¤t.angle.y, target, 0x19, 0x7FFF, 1);
|
|
|
|
cXyz temp;
|
|
int stickPos = calcStickPos(target, &temp);
|
|
if(stickPos == 0) {
|
|
shape_angle.y = current.angle.y;
|
|
}
|
|
else if(g_mDoCPd_cpadInfo[0].mMainStickValue >= l_HIO.field_0x84) {
|
|
shape_angle.y = current.angle.y;
|
|
}
|
|
|
|
s16 temp3 = shape_angle.y;
|
|
mJntCtrl.lookAtTarget(&temp3, &temp, current.pos, shape_angle.y, l_HIO.mNpc.mMaxTurnStep, false);
|
|
|
|
if(stickPos > 0) {
|
|
shape_angle.y = temp3;
|
|
}
|
|
|
|
current.angle.y = shape_angle.y;
|
|
|
|
if(g_mDoCPd_cpadInfo[0].mMainStickValue >= l_HIO.field_0x84 && stickPos == 0) {
|
|
current.angle.y = target;
|
|
setPlayerAction(&daNpc_Cb1_c::walkPlayerAction, NULL);
|
|
}
|
|
}
|
|
else {
|
|
mJntCtrl.lookAtTarget(&shape_angle.y, NULL, cXyz::Zero, shape_angle.y, 0, false);
|
|
current.angle.y = shape_angle.y;
|
|
}
|
|
|
|
breaking();
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 000069E8-00006D00 .text walkPlayerAction__11daNpc_Cb1_cFPv */
|
|
BOOL daNpc_Cb1_c::walkPlayerAction(void*) {
|
|
if(m8F0 == 0) {
|
|
setAnm(ANM_01);
|
|
cLib_onBit<u32>(attention_info.flags, ~0);
|
|
}
|
|
else if(m8F0 != -1 && !sowCheck()) {
|
|
f32 temp = g_mDoCPd_cpadInfo[0].mMainStickValue * l_HIO.mStickWalkSpeedScale;
|
|
s16 temp7 = getStickAngY();
|
|
s32 temp2 = cLib_distanceAngleS(temp7, current.angle.y);
|
|
f32 temp6 = l_HIO.mForwardAccel;
|
|
|
|
if(temp > speedF) {
|
|
if(temp < l_HIO.mMinWalkSpeed) {
|
|
temp = l_HIO.mMinWalkSpeed;
|
|
}
|
|
}
|
|
else {
|
|
temp6 = l_HIO.mDecel;
|
|
}
|
|
|
|
if(temp2 > 0x6000) {
|
|
temp = 0.0f;
|
|
if(speedF != 0.0f) {
|
|
temp7 = current.angle.y;
|
|
}
|
|
|
|
temp6 = 2.0f;
|
|
}
|
|
|
|
cLib_addCalcAngleS(¤t.angle.y, temp7, l_HIO.field_0xEC, l_HIO.field_0xE8, l_HIO.field_0xEA);
|
|
|
|
cXyz temp4;
|
|
int stickPos = calcStickPos(temp7, &temp4);
|
|
if(stickPos == 0) {
|
|
cLib_addCalcAngleS(&shape_angle.y, current.angle.y, 8, 0x2000, 0x400);
|
|
}
|
|
|
|
s16 temp3 = shape_angle.y;
|
|
mJntCtrl.lookAtTarget(&temp3, &temp4, current.pos, shape_angle.y, l_HIO.mNpc.mMaxTurnStep, false);
|
|
|
|
if(stickPos > 0) {
|
|
shape_angle.y = temp3;
|
|
}
|
|
|
|
temp = cLib_maxLimit(temp, l_HIO.mMaxWalkSpeed);
|
|
|
|
if(cLib_chaseF(&speedF, temp, temp6) && temp == 0) {
|
|
setPlayerAction(&daNpc_Cb1_c::waitPlayerAction, NULL);
|
|
}
|
|
else {
|
|
f32 temp8 = speedF * l_HIO.mWalkAnmSpeedScale;
|
|
mpMorf->setPlaySpeed(cLib_minLimit(temp8, l_HIO.mMaxWalkAnmSpeed));
|
|
|
|
if(!mAcch.ChkGroundHit()) {
|
|
setPlayerAction(&daNpc_Cb1_c::jumpPlayerAction, NULL);
|
|
}
|
|
else if(chkWallHit()) {
|
|
f32 temp5 = checkWallJump(current.angle.y);
|
|
if(temp5 >= 0.0f) {
|
|
setPlayerAction(&daNpc_Cb1_c::jumpPlayerAction, &temp5);
|
|
|
|
return TRUE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00006D00-00006E20 .text hitPlayerAction__11daNpc_Cb1_cFPv */
|
|
BOOL daNpc_Cb1_c::hitPlayerAction(void*) {
|
|
if(m8F0 == 0) {
|
|
speedF = cLib_maxLimit(speedF, 0.5f * l_HIO.mMaxWalkSpeed);
|
|
speed.y = l_HIO.mHitSpeedScaleY * std::fabsf(speedF);
|
|
speedF *= l_HIO.mHitSpeedScaleF;
|
|
|
|
fopAcM_seStart(this, JA_SE_CM_CB_BOUND, 0);
|
|
|
|
setAnm(ANM_02);
|
|
}
|
|
else if(m8F0 != -1 && mAcch.ChkGroundHit()) {
|
|
returnLink();
|
|
speedF = 0.0f;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00006E20-00006EFC .text jumpPlayerAction__11daNpc_Cb1_cFPv */
|
|
BOOL daNpc_Cb1_c::jumpPlayerAction(void* param_1) {
|
|
if(m8F0 == 0) {
|
|
if(param_1) {
|
|
speed.y = *(f32*)param_1;
|
|
}
|
|
else {
|
|
speed.y = 10.0f;
|
|
}
|
|
|
|
m900 = 0.0f;
|
|
setAnm(ANM_16);
|
|
}
|
|
else if(m8F0 != -1 && !flyCheck() && mAcch.ChkGroundHit()) {
|
|
checkLanding();
|
|
speedF = 0.0f;
|
|
setPlayerAction(&daNpc_Cb1_c::waitPlayerAction, NULL);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00006EFC-00006FFC .text flyPlayerAction__11daNpc_Cb1_cFPv */
|
|
BOOL daNpc_Cb1_c::flyPlayerAction(void*) {
|
|
if(m8F0 == 0) {
|
|
speed.y = l_HIO.mFlyLaunchSpeedY;
|
|
|
|
setAnm(ANM_04);
|
|
|
|
setFlyingTimer(l_HIO.mPlayerFlyTimer);
|
|
|
|
fopAcM_monsSeStart(this, JA_SE_CV_CB_LEAF_OUT, 0);
|
|
}
|
|
else if(m8F0 != -1) {
|
|
dComIfGp_setAStatus(dActStts_LET_GO_e);
|
|
flyAction(CPad_CHECK_TRIG_A(0), g_mDoCPd_cpadInfo[0].mMainStickValue * l_HIO.mStickFlySpeedScale, getStickAngY(), CPad_CHECK_TRIG_B(0));
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00006FFC-0000707C .text carryPlayerAction__11daNpc_Cb1_cFPv */
|
|
BOOL daNpc_Cb1_c::carryPlayerAction(void*) {
|
|
if(m8F0 == 0) {
|
|
setAnm(ANM_0B);
|
|
|
|
fopAcM_monsSeStart(this, JA_SE_CV_CB_DAMAGE_S, 0);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 0000707C-000070D0 .text daNpc_Cb1_XyCheckCB__FPvi */
|
|
static s16 daNpc_Cb1_XyCheckCB(void* i_this, int i_itemBtn) {
|
|
return static_cast<daNpc_Cb1_c*>(i_this)->XyCheckCB(i_itemBtn);
|
|
}
|
|
|
|
/* 000070D0-000070D8 .text daNpc_Cb1_XyEventCB__FPvi */
|
|
static s16 daNpc_Cb1_XyEventCB(void* param_1, int param_2) {
|
|
return static_cast<daNpc_Cb1_c*>(param_1)->XyEventCB(param_2);
|
|
}
|
|
|
|
/* 000070D8-0000711C .text calcFlyingTimer__11daNpc_Cb1_cFv */
|
|
BOOL daNpc_Cb1_c::calcFlyingTimer() {
|
|
if(getFlyingTimer() != 0 && !cLib_calcTimer(&m_flyingTimer)) {
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/* 0000711C-00007250 .text initAnm__11daNpc_Cb1_cFSci */
|
|
void daNpc_Cb1_c::initAnm(s8 param_1, BOOL param_2) {
|
|
if(param_1 >= 0) {
|
|
m8DC = param_1;
|
|
|
|
AnmData& data = anmTblData[m8DC];
|
|
|
|
m8B0 = 0;
|
|
|
|
dNpc_setAnm(mpMorf, data.mLoopMode, param_2 ? data.field_0x02 : 0.0f, data.mSpeed, abs(data.mAnmFileIdx), -1, "Cb");
|
|
|
|
m8D7 = 0;
|
|
m8D8 = 0;
|
|
|
|
if(data.mAnmFileIdx < 0) {
|
|
onMusic();
|
|
}
|
|
else {
|
|
offMusic();
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 00007250-000072B4 .text musicPlay__11daNpc_Cb1_cFv */
|
|
void daNpc_Cb1_c::musicPlay() {
|
|
if(!isTypeKazeBoss()) {
|
|
mDoAud_cbPracticePlay(&eyePos);
|
|
}
|
|
else {
|
|
mDoAud_bgmStart(JA_BGM_MAKORE_TAKT_8);
|
|
}
|
|
}
|
|
|
|
/* 000072B4-000072EC .text musicStop__11daNpc_Cb1_cFv */
|
|
void daNpc_Cb1_c::musicStop() {
|
|
if(!isTypeKazeBoss()) {
|
|
mDoAud_cbPracticeStop();
|
|
}
|
|
}
|
|
|
|
daNpc_Cb1_c::AnmData daNpc_Cb1_c::anmTblData[] = {
|
|
{0x17, 0x02, 0x08, 0x01, -1, -1},
|
|
{0x1A, 0x02, 0x04, 0x01, -1, -1},
|
|
{0x0C, 0x00, 0x04, 0x01, -1, -1},
|
|
{0x0B, 0x02, 0x04, 0x01, -1, -1},
|
|
{0x10, 0x00, 0x04, 0x01, -1, -1},
|
|
{0x11, 0x02, 0x00, 0x01, -1, -1},
|
|
{0x09, 0x02, 0x0F, 0x01, -1, -1},
|
|
{-0x18, 0x02, 0x10, 0x01, -1, -1},
|
|
{-0x13, 0x02, 0x08, 0x01, -1, -1},
|
|
{-0x12, 0x02, 0x08, 0x01, -1, -1},
|
|
{0x0D, 0x02, 0x08, 0x01, -1, -1},
|
|
{0x15, 0x00, 0x08, 0x01, -1, -1},
|
|
{0x14, 0x02, 0x08, 0x01, -1, -1},
|
|
{-0x18, 0x02, 0x08, 0x01, 0x02, 0x0E},
|
|
{-0x04, 0x00, 0x10, 0x01, -1, 0x0F},
|
|
{-0x18, 0x02, 0x00, 0x01, 0x02, -1},
|
|
{-0x13, 0x00, 0x10, 0x01, -1, 0x11},
|
|
{-0x12, 0x02, 0x00, 0x01, 0x18, 0x12},
|
|
{-0x13, 0x00, 0x00, 0x01, -1, 0x13},
|
|
{-0x18, 0x02, 0x10, 0x01, 0x03, 0x10},
|
|
{0x06, 0x02, 0x08, 0x01, 0x04, 0x00},
|
|
{0x05, 0x00, 0x08, 0x01, -1, 0x00},
|
|
{0x07, 0x00, 0x08, 0x01, -1, 0x17},
|
|
{0x06, 0x02, 0x08, 0x01, -1, -1},
|
|
{0x08, 0x02, 0x08, 0x01, -1, -1},
|
|
{0x19, 0x02, 0x08, 0x01, 0x03, 0x00},
|
|
{0x0A, 0x02, 0x08, 0x01, -1, -1},
|
|
{0x17, 0x02, 0x08, 0x01, -1, -1},
|
|
};
|
|
s8 daNpc_Cb1_c::anmPrmData[] = {0, 1, 2, 3, 4, 5, 4, 6, 7, 0x10, 8, 0xA, 0xB, 0xC, 0xE, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x09};
|
|
|
|
/* 000072EC-00007390 .text setAnm__11daNpc_Cb1_cFUc */
|
|
BOOL daNpc_Cb1_c::setAnm(u8 param_1) {
|
|
if(m8DB == param_1) {
|
|
return FALSE;
|
|
}
|
|
|
|
if(m8DB == 9) {
|
|
#if VERSION == VERSION_DEMO
|
|
mDoAud_cbPracticeStop();
|
|
#else
|
|
musicStop();
|
|
#endif
|
|
}
|
|
|
|
m8DB = param_1;
|
|
|
|
if(m8DB == 9) {
|
|
fopAcM_OnStatus(this, fopAcStts_NOPAUSE_e);
|
|
}
|
|
else {
|
|
fopAcM_OffStatus(this, fopAcStts_NOPAUSE_e);
|
|
}
|
|
|
|
initAnm(anmPrmData[m8DB], 1);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00007390-000074F0 .text playAnm__11daNpc_Cb1_cFv */
|
|
void daNpc_Cb1_c::playAnm() {
|
|
BOOL r3 = mpMorf->play(
|
|
&eyePos,
|
|
#if VERSION == VERSION_DEMO
|
|
mAcch.ChkGroundHit() ? dComIfG_Bgsp()->GetMtrlSndId(mAcch.m_gnd) : 0,
|
|
#else
|
|
(m_status & daCbStts_UNK_0100) && mAcch.ChkGroundHit() ? dComIfG_Bgsp()->GetMtrlSndId(mAcch.m_gnd) : 0,
|
|
#endif
|
|
dComIfGp_getReverb(fopAcM_GetRoomNo(this))
|
|
);
|
|
if(r3 || mpMorf->getFrame() < m8B0) {
|
|
m8D7 = 1;
|
|
m8D8++;
|
|
|
|
AnmData& data = anmTblData[m8DC];
|
|
|
|
#if VERSION == VERSION_DEMO
|
|
if(m8D8 >= data.field_0x04)
|
|
#else
|
|
s8 temp = data.field_0x04;
|
|
if(isTypeKazeBoss() && temp == 0x18) {
|
|
temp = 0xD;
|
|
}
|
|
if(m8D8 >= temp)
|
|
#endif
|
|
{
|
|
if(data.field_0x05 == 0x13) {
|
|
#if VERSION == VERSION_DEMO
|
|
mDoAud_cbPracticeStop();
|
|
#else
|
|
musicStop();
|
|
#endif
|
|
}
|
|
else if(data.field_0x05 == 0x11) {
|
|
#if VERSION == VERSION_DEMO
|
|
mDoAud_cbPracticePlay(&eyePos);
|
|
#else
|
|
musicPlay();
|
|
#endif
|
|
}
|
|
|
|
initAnm(data.field_0x05, 1);
|
|
}
|
|
}
|
|
|
|
m8B0 = mpMorf->getFrame();
|
|
}
|
|
|
|
/* 000074F0-00007650 .text chkAttention__11daNpc_Cb1_cFfl */
|
|
BOOL daNpc_Cb1_c::chkAttention(f32 param_1, s32 param_2) {
|
|
cXyz temp;
|
|
temp.x = dComIfGp_getPlayer(0)->current.pos.x - current.pos.x;
|
|
temp.z = dComIfGp_getPlayer(0)->current.pos.z - current.pos.z;
|
|
|
|
f32 diff = std::sqrtf(SQUARE(temp.x) + SQUARE(temp.z));
|
|
s16 angle = cM_atan2s(temp.x, temp.z);
|
|
|
|
if(mHasAttention) {
|
|
param_1 += 40.0f;
|
|
param_2 += 0x71C;
|
|
}
|
|
|
|
s16 temp2 = shape_angle.y + getHead_y() + getBackbone_y();
|
|
angle -= temp2;
|
|
|
|
BOOL result = FALSE;
|
|
if(abs(angle) < param_2 && param_1 > diff) {
|
|
result = TRUE;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
/* 00007650-000076A4 .text carryCheck__11daNpc_Cb1_cFv */
|
|
void daNpc_Cb1_c::carryCheck() {
|
|
if(fopAcM_checkCarryNow(this)) {
|
|
setNpcAction(&daNpc_Cb1_c::carryNpcAction, NULL);
|
|
}
|
|
}
|
|
|
|
/* 000076A4-0000776C .text eventOrder__11daNpc_Cb1_cFv */
|
|
void daNpc_Cb1_c::eventOrder() {
|
|
if(m8DD == 5 || m8DD == 6) {
|
|
eventInfo.onCondition(dEvtCnd_CANTALK_e);
|
|
|
|
if(m8DD == 5) {
|
|
fopAcM_orderSpeakEvent(this);
|
|
}
|
|
}
|
|
else if(m8DD == 7) {
|
|
eventInfo.onCondition(dEvtCnd_CANTALKITEM_e);
|
|
eventInfo.onCondition(dEvtCnd_CANTALK_e);
|
|
}
|
|
else if(m8DD != -1 && m8DD < 5) {
|
|
m8E3 = m8DD;
|
|
if(m8E3 != -1 && mEventIdx[m8E3] != -1) {
|
|
fopAcM_orderOtherEventId(this, mEventIdx[m8E3]);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 0000776C-00007848 .text checkOrder__11daNpc_Cb1_cFv */
|
|
void daNpc_Cb1_c::checkOrder() {
|
|
if(eventInfo.checkCommandTalk()) {
|
|
if(m8DD == 5 || m8DD == 6 || m8DD == 7) {
|
|
m8DD = -1;
|
|
if(dComIfGp_event_chkTalkXY()) {
|
|
onTact();
|
|
}
|
|
else {
|
|
setNpcAction(&daNpc_Cb1_c::talkNpcAction, NULL);
|
|
}
|
|
|
|
fopAcM_cancelCarryNow(this);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 00007848-000078C4 .text checkCommandTalk__11daNpc_Cb1_cFv */
|
|
BOOL daNpc_Cb1_c::checkCommandTalk() {
|
|
if(eventInfo.checkCommandTalk()) {
|
|
if(dComIfGp_event_chkTalkXY()) {
|
|
if(m8DD == 7) {
|
|
m8DD = -1;
|
|
}
|
|
|
|
onTact();
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/* 000078C4-000079AC .text next_msgStatus__11daNpc_Cb1_cFPUl */
|
|
u16 daNpc_Cb1_c::next_msgStatus(u32* pMsgNo) {
|
|
if(*pMsgNo == 0x5AC) {
|
|
return fopMsgStts_MSG_ENDS_e;
|
|
}
|
|
else if(*pMsgNo == 0x1520 || (0x1519 <= *pMsgNo && *pMsgNo <= 0x151D) || *pMsgNo == 0x1523 || (0x14C2 <= *pMsgNo && *pMsgNo <= 0x14C3)) {
|
|
*pMsgNo += 1;
|
|
}
|
|
else if(*pMsgNo == 0x151E) {
|
|
dComIfGs_onEventBit(dSv_event_flag_c::UNK_1880);
|
|
return fopMsgStts_MSG_ENDS_e;
|
|
}
|
|
else if(*pMsgNo == 0x1521) {
|
|
dComIfGs_onEventBit(dSv_event_flag_c::UNK_1840);
|
|
return fopMsgStts_MSG_ENDS_e;
|
|
}
|
|
else if(*pMsgNo == 0x14C4) {
|
|
dComIfGs_onEventBit(dSv_event_flag_c::UNK_1904);
|
|
return fopMsgStts_MSG_ENDS_e;
|
|
}
|
|
else {
|
|
return fopMsgStts_MSG_ENDS_e;
|
|
}
|
|
|
|
return fopMsgStts_MSG_CONTINUES_e;
|
|
}
|
|
|
|
/* 000079AC-00007A8C .text getMsg__11daNpc_Cb1_cFv */
|
|
u32 daNpc_Cb1_c::getMsg() {
|
|
#if VERSION == VERSION_DEMO
|
|
if(isShipRide()) {
|
|
return 0x152F;
|
|
}
|
|
#endif
|
|
|
|
if(isTypeBossDie()) {
|
|
return 0x1456;
|
|
}
|
|
|
|
if(isTypeForest()) {
|
|
return dComIfGs_isEventBit(dSv_event_flag_c::UNK_1904) ? 0x14C5 : 0x14C2;
|
|
}
|
|
|
|
if(isTypeWaterFall()) {
|
|
if(isTact()) {
|
|
return dComIfGs_isEventBit(dSv_event_flag_c::UNK_1840) ? 0x1522 : 0x1520;
|
|
}
|
|
|
|
return dComIfGs_isEventBit(dSv_event_flag_c::UNK_1880) ? 0x151F : 0x1519;
|
|
}
|
|
|
|
#if VERSION > VERSION_DEMO
|
|
if(isShipRide()) {
|
|
return 0x152F;
|
|
}
|
|
#endif
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* 00007A8C-00007B38 .text setCollision__11daNpc_Cb1_cFv */
|
|
void daNpc_Cb1_c::setCollision() {
|
|
mCyl.SetC(current.pos);
|
|
mCyl.SetR(20.0f);
|
|
mCyl.SetH(60.0f);
|
|
|
|
dComIfG_Ccsp()->Set(&mCyl);
|
|
|
|
mWindCyl.SetC(current.pos);
|
|
mWindCyl.SetR(20.0f);
|
|
mWindCyl.SetH(60.0f);
|
|
|
|
dComIfG_Ccsp()->Set(&mWindCyl);
|
|
}
|
|
|
|
/* 00007B38-00007C4C .text lookBack__11daNpc_Cb1_cFi */
|
|
void daNpc_Cb1_c::lookBack(BOOL param_1) {
|
|
cXyz* dstPos = NULL;
|
|
cXyz vec2;
|
|
cXyz vec(0.0f, 0.0f, 0.0f);
|
|
|
|
s16 desiredY = shape_angle.y;
|
|
|
|
if(mJntCtrl.trnChk()) {
|
|
cLib_addCalcAngleS2(&m8D0, l_HIO.mNpc.mMaxHeadTurnVel, 4, 0x800);
|
|
}
|
|
else {
|
|
m8D0 = 0;
|
|
}
|
|
|
|
if(param_1) {
|
|
vec2 = dNpc_playerEyePos(l_HIO.mNpc.m04);
|
|
dstPos = &vec2;
|
|
vec = current.pos;
|
|
vec.y = eyePos.y;
|
|
}
|
|
|
|
mJntCtrl.lookAtTarget(&shape_angle.y, dstPos, vec, desiredY, m8D0, 0);
|
|
}
|
|
|
|
/* 00007C4C-00007E7C .text setBaseMtx__11daNpc_Cb1_cFv */
|
|
void daNpc_Cb1_c::setBaseMtx() {
|
|
J3DModel* pModel = mpMorf->getModel();
|
|
|
|
if(isShipRide()) {
|
|
daShip_c* pShip = dComIfGp_getShipActor();
|
|
if(pShip != NULL) {
|
|
mDoMtx_stack_c::copy(pShip->getHeadJntMtx());
|
|
mDoMtx_stack_c::transM(10.92f, 0.57f, -14.0f);
|
|
mDoMtx_stack_c::XYZrotM(-0x3AAA, 0, 0x40FE);
|
|
|
|
pModel->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
MtxP pMtx = mDoMtx_stack_c::get();
|
|
current.pos.set(pMtx[0][3], pMtx[1][3], pMtx[2][3]);
|
|
|
|
shape_angle.y = pShip->shape_angle.y + 0x8000;
|
|
|
|
fopAcM_OnStatus(this, fopAcStts_UNK4000_e);
|
|
|
|
tevStr.mRoomNo = pShip->tevStr.mRoomNo;
|
|
tevStr.mEnvrIdxOverride = pShip->tevStr.mEnvrIdxOverride;
|
|
|
|
pShip->onCb1Ride();
|
|
|
|
fopAcM_onDraw(this);
|
|
}
|
|
}
|
|
else {
|
|
pModel->setBaseScale(scale);
|
|
|
|
mDoMtx_stack_c::transS(current.pos.x, current.pos.y + 25.0f, current.pos.z);
|
|
mDoMtx_stack_c::YrotM(shape_angle.y);
|
|
mDoMtx_stack_c::transM(m904);
|
|
mDoMtx_stack_c::XrotM(shape_angle.x);
|
|
mDoMtx_stack_c::transM(0.0f, -25.0f, 0.0f);
|
|
mDoMtx_stack_c::ZrotM(shape_angle.z);
|
|
|
|
pModel->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
|
|
if(mpNutModel && isNut()) {
|
|
mpNutModel->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
}
|
|
|
|
if(mpPropellerModel) {
|
|
mDoMtx_stack_c::transM(0.0f, 24.8f, 1.5f);
|
|
mpPropellerModel->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
mpPropellerModel->calc();
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 00007E7C-00008104 .text init__11daNpc_Cb1_cFv */
|
|
BOOL daNpc_Cb1_c::init() {
|
|
gravity = l_HIO.field_0x70;
|
|
|
|
#if VERSION > VERSION_DEMO
|
|
offPlayerRoom();
|
|
offFlying();
|
|
setFlyingTimer(0);
|
|
m_status = 0;
|
|
#endif
|
|
|
|
attention_info.distances[fopAc_Attn_TYPE_TALK_e] = 0xAB;
|
|
attention_info.distances[fopAc_Attn_TYPE_SPEAK_e] = 0xAB;
|
|
attention_info.distances[fopAc_Attn_TYPE_CARRY_e] = 8;
|
|
|
|
#if VERSION == VERSION_DEMO
|
|
if(!dComIfGs_isEventBit(dSv_event_flag_c::UNK_1610)) {
|
|
onNpcNotChange();
|
|
}
|
|
|
|
if (shipRideCheck()) {
|
|
attention_info.distances[fopAc_Attn_TYPE_TALK_e] = 0xAF;
|
|
attention_info.distances[fopAc_Attn_TYPE_SPEAK_e] = 0xAF;
|
|
} else if(isTypeBossDie()) {
|
|
setNpcAction(&daNpc_Cb1_c::rescueNpcAction, NULL);
|
|
} else if(isTypeForest()) {
|
|
setNpcAction(&daNpc_Cb1_c::musicNpcAction, NULL);
|
|
} else if(isTypeWaterFall()) {
|
|
setNpcAction(&daNpc_Cb1_c::musicNpcAction, NULL);
|
|
} else {
|
|
if(isTypeEkaze()) {
|
|
onNpcCallCommand();
|
|
setNpcAction(&daNpc_Cb1_c::waitNpcAction, NULL);
|
|
} else {
|
|
setNpcAction(&daNpc_Cb1_c::waitNpcAction, NULL);
|
|
}
|
|
offMusic();
|
|
}
|
|
#elif VERSION == VERSION_JPN
|
|
onNpcNotChange();
|
|
|
|
if(isTypeKazeBoss() || isTypeForest() || isTypeWaterFall()) {
|
|
setNpcAction(&daNpc_Cb1_c::musicNpcAction, NULL);
|
|
home.roomNo = -1;
|
|
current.roomNo = -1;
|
|
gravity = -0.1f;
|
|
} else if(isTypeBossDie()) {
|
|
daNpc_Cb1_c::ActionFunc_t func =
|
|
dComIfGs_isStageBossEnemy(dSv_save_c::STAGE_FW) ?
|
|
&daNpc_Cb1_c::waitNpcAction :
|
|
&daNpc_Cb1_c::rescueNpcAction;
|
|
setNpcAction(func, NULL);
|
|
} else if(!isTypeEkaze() && !isTypeKaze() && shipRideCheck()) {
|
|
attention_info.distances[fopAc_Attn_TYPE_TALK_e] = 0xAF;
|
|
attention_info.distances[fopAc_Attn_TYPE_SPEAK_e] = 0xAF;
|
|
} else {
|
|
if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_1610)) {
|
|
offNpcNotChange();
|
|
}
|
|
if(isTypeEkaze()) {
|
|
onNpcCallCommand();
|
|
}
|
|
setNpcAction(&daNpc_Cb1_c::waitNpcAction, NULL);
|
|
offMusic();
|
|
}
|
|
#else // VERSION_USA or VERSION_PAL
|
|
static const char* l_eventNameTbl[] = {
|
|
"cb_rescue",
|
|
"OPTION_CHAR_END",
|
|
"cb_tact",
|
|
"cb_tactCancel",
|
|
"cb_sow"
|
|
};
|
|
|
|
for(int i = 0; i < 5; i++) {
|
|
mEventIdx[i] = dComIfGp_evmng_getEventIdx(l_eventNameTbl[i]);
|
|
}
|
|
|
|
m8E3 = -1;
|
|
m8DD = -1;
|
|
|
|
eventInfo.setXyCheckCB(&daNpc_Cb1_XyCheckCB);
|
|
eventInfo.setXyEventCB(&daNpc_Cb1_XyEventCB);
|
|
|
|
onNpcNotChange();
|
|
|
|
if(isTypeKazeBoss() || isTypeForest() || isTypeWaterFall()) {
|
|
setNpcAction(&daNpc_Cb1_c::musicNpcAction, NULL);
|
|
|
|
home.roomNo = -1;
|
|
current.roomNo = -1;
|
|
|
|
gravity = -0.1f;
|
|
}
|
|
else if(isTypeBossDie()) {
|
|
setNpcAction(dComIfGs_isStageBossEnemy(dSv_save_c::STAGE_FW) ? &daNpc_Cb1_c::waitNpcAction : &daNpc_Cb1_c::rescueNpcAction, NULL);
|
|
}
|
|
else if(!isTypeEkaze() && !isTypeKaze() && shipRideCheck()) {
|
|
attention_info.distances[fopAc_Attn_TYPE_TALK_e] = 0xAF;
|
|
attention_info.distances[fopAc_Attn_TYPE_SPEAK_e] = 0xAF;
|
|
}
|
|
else {
|
|
if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_1610)) {
|
|
offNpcNotChange();
|
|
}
|
|
|
|
if(isTypeEkaze()) {
|
|
onNpcCallCommand();
|
|
}
|
|
|
|
setNpcAction(&daNpc_Cb1_c::waitNpcAction, NULL);
|
|
|
|
offMusic();
|
|
}
|
|
#endif
|
|
|
|
mStts.Init(0xFE, 0xFF, this);
|
|
mCyl.Set(l_cyl_src);
|
|
mCyl.SetStts(&mStts);
|
|
mWindCyl.Set(l_wind_cyl_src);
|
|
mWindCyl.SetStts(&mStts);
|
|
|
|
#if VERSION <= VERSION_JPN
|
|
static const char* l_eventNameTbl[] = {
|
|
"cb_rescue",
|
|
"OPTION_CHAR_END",
|
|
"cb_tact",
|
|
"cb_tactCancel",
|
|
"cb_sow"
|
|
};
|
|
|
|
for(int i = 0; i < 5; i++) {
|
|
mEventIdx[i] = dComIfGp_evmng_getEventIdx(l_eventNameTbl[i]);
|
|
}
|
|
|
|
m8E3 = -1;
|
|
#if VERSION == VERSION_JPN
|
|
m8DD = -1;
|
|
#endif
|
|
|
|
eventInfo.setXyCheckCB(&daNpc_Cb1_XyCheckCB);
|
|
eventInfo.setXyEventCB(&daNpc_Cb1_XyEventCB);
|
|
#endif
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00008104-000084A4 .text draw__11daNpc_Cb1_cFv */
|
|
BOOL daNpc_Cb1_c::draw() {
|
|
if(isShipRide()) {
|
|
daShip_c* pShip = dComIfGp_getShipActor();
|
|
if(pShip && pShip->checkHeadNoDraw()) {
|
|
return TRUE;
|
|
}
|
|
}
|
|
else
|
|
#if VERSION > VERSION_DEMO
|
|
if(!fopAcM_checkCarryNow(this))
|
|
#endif
|
|
{
|
|
s32 homeRoomNo = fopAcM_GetHomeRoomNo(this);
|
|
if (homeRoomNo < 0 || !dComIfGp_roomControl_checkStatusFlag(homeRoomNo, 0x10)) {
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
J3DModel* pModel = mpMorf->getModel();
|
|
|
|
g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr);
|
|
drawDamageFog();
|
|
g_env_light.setLightTevColorType(pModel, &tevStr);
|
|
|
|
mpMorf->updateDL();
|
|
|
|
J3DModel* pFaceModel = mpFaceModel;
|
|
g_env_light.setLightTevColorType(pFaceModel, &tevStr);
|
|
|
|
pFaceModel->setBaseTRMtx(pModel->getAnmMtx(m_backbone_jnt_num));
|
|
mDoExt_modelUpdateDL(pFaceModel);
|
|
|
|
mShadowId = 0;
|
|
if(
|
|
#if VERSION > VERSION_DEMO
|
|
(m_status & daCbStts_UNK_0100) &&
|
|
#endif
|
|
fopAcM_GetHomeRoomNo(this) >= 0 && !fopAcM_checkCarryNow(this) && !isShipRide()
|
|
) {
|
|
cXyz shadowPos(current.pos.x, current.pos.y + 80.0f, current.pos.z);
|
|
mShadowId = dComIfGd_setShadow(
|
|
mShadowId, 0, mpMorf->getModel(), &shadowPos, 600.0f, 20.0f,
|
|
current.pos.y, mAcch.GetGroundH(), mAcch.m_gnd, &tevStr
|
|
);
|
|
}
|
|
|
|
if(isMusic()) {
|
|
g_env_light.setLightTevColorType(mpStickModel, &tevStr);
|
|
|
|
mpStickModel->setBaseTRMtx(pModel->getAnmMtx(m_armRend_jnt_num));
|
|
mDoExt_modelUpdateDL(mpStickModel);
|
|
|
|
g_env_light.setLightTevColorType(mpCelloModel, &tevStr);
|
|
|
|
mpCelloModel->setBaseTRMtx(pModel->getAnmMtx(m_armL2_jnt_num));
|
|
mDoExt_modelUpdateDL(mpCelloModel);
|
|
|
|
if(
|
|
#if VERSION > VERSION_DEMO
|
|
(m_status & daCbStts_UNK_0100) &&
|
|
#endif
|
|
mShadowId
|
|
) {
|
|
dComIfGd_addRealShadow(mShadowId, mpStickModel);
|
|
dComIfGd_addRealShadow(mShadowId, mpCelloModel);
|
|
}
|
|
}
|
|
else {
|
|
if(mpPropellerModel && isFlyAction() && m8DC != 2) {
|
|
f32 frame = 11.0f;
|
|
if(m8DC == 4) {
|
|
frame = mpMorf->getFrame();
|
|
}
|
|
mPropellerBckAnim.entry(mpPropellerModel->getModelData(), frame);
|
|
|
|
g_env_light.setLightTevColorType(mpPropellerModel, &tevStr);
|
|
|
|
mDoExt_modelUpdateDL(mpPropellerModel);
|
|
|
|
if(
|
|
#if VERSION > VERSION_DEMO
|
|
(m_status & daCbStts_UNK_0100) &&
|
|
#endif
|
|
mShadowId
|
|
) {
|
|
dComIfGd_addRealShadow(mShadowId, mpPropellerModel);
|
|
}
|
|
}
|
|
else if(mpNutModel && isNut()) {
|
|
J3DModelData* pModelData = mpNutModel->getModelData();
|
|
mNutBckAnim.entry(pModelData);
|
|
|
|
g_env_light.setLightTevColorType(mpNutModel, &tevStr);
|
|
|
|
mDoExt_modelUpdateDL(mpNutModel);
|
|
}
|
|
}
|
|
|
|
dSnap_RegistFig(DSNAP_TYPE_CB1, this, 1.0f, 1.0f, 1.0f);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 000084A4-00009090 .text execute__11daNpc_Cb1_cFv */
|
|
BOOL daNpc_Cb1_c::execute() {
|
|
cLib_offBit<u32>(actor_status, fopAcStts_SHOWMAP_e);
|
|
|
|
executeDamageFog();
|
|
|
|
fopAcM_setStageLayer(this);
|
|
|
|
if(fopAcM_GetRoomNo(this) == dComIfGp_roomControl_getStayNo()) {
|
|
onPlayerRoom();
|
|
}
|
|
else {
|
|
offPlayerRoom();
|
|
}
|
|
|
|
#if VERSION > VERSION_DEMO
|
|
m_status &= ~daCbStts_UNK_0100;
|
|
#endif
|
|
|
|
if(
|
|
!isShipRide()
|
|
#if VERSION > VERSION_DEMO
|
|
&& !fopAcM_checkCarryNow(this)
|
|
#endif
|
|
) {
|
|
if(
|
|
!check_initialRoom()
|
|
#if VERSION > VERSION_DEMO
|
|
|| (isTypeKazeBoss() && !dComIfG_Bgsp()->ChkMoveBG_NoDABg(mAcch.m_gnd))
|
|
#endif
|
|
) {
|
|
#if VERSION > VERSION_DEMO
|
|
home.roomNo = 0xFF;
|
|
current.roomNo = 0xFF;
|
|
#endif
|
|
|
|
if(dComIfGp_getCb1Player() == this) {
|
|
dComIfGp_setCb1Player(NULL);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
initialRestartOption(1, isTypeKaze());
|
|
|
|
if(!isShipRide() && check_moveStop()) {
|
|
setWaitNpcAction(NULL);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
if(m8E0 && dComIfG_Bgsp()->ChkPolySafe(mPolyInfo) && dComIfG_Bgsp()->ChkMoveBG(mPolyInfo)) {
|
|
cXyz temp = old.pos;
|
|
dComIfG_Bgsp()->MoveBgCrrPos(mPolyInfo, true, &old.pos, NULL, NULL);
|
|
}
|
|
|
|
mJntCtrl.setParam(l_HIO.mNpc.mMaxBackboneX, l_HIO.mNpc.mMaxBackboneY,
|
|
l_HIO.mNpc.mMinBackboneX, l_HIO.mNpc.mMinBackboneY,
|
|
l_HIO.mNpc.mMaxHeadX, l_HIO.mNpc.mMaxHeadY,
|
|
l_HIO.mNpc.mMinHeadX, l_HIO.mNpc.mMinHeadY,
|
|
l_HIO.mNpc.mMaxTurnStep
|
|
);
|
|
}
|
|
|
|
#if VERSION == VERSION_DEMO
|
|
if (checkNowPosMove("Cb1")) {
|
|
playAnm();
|
|
}
|
|
#endif
|
|
|
|
cXyz temp2 = cXyz::Zero;
|
|
f32 temp3 = 3.0f;
|
|
|
|
if(!fopAcM_checkCarryNow(this) && !isShipRide()) {
|
|
if(checkNowPosMove("Cb1") && !isReturnLink()) {
|
|
f32 temp4 = current.pos.y;
|
|
fopAcM_posMoveF(this, mStts.GetCCMoveP());
|
|
m900 += temp4 - current.pos.y;
|
|
current.pos.x += m88C.x;
|
|
current.pos.z += m88C.z;
|
|
maxFallSpeed = -100.0f;
|
|
gravity = l_HIO.field_0x70;
|
|
}
|
|
|
|
m8E0 = mAcch.ChkGroundHit();
|
|
mAcch.CrrPos(*dComIfG_Bgsp());
|
|
#if VERSION > VERSION_DEMO
|
|
m_status |= daCbStts_UNK_0100;
|
|
#endif
|
|
|
|
if(mAcch.GetGroundH() == -G_CM3D_F_INF || dComIfG_Bgsp()->GetGroundCode(mAcch.m_gnd) == 4) {
|
|
if(isFlyAction() && m8FC > -400.0f) {
|
|
m4E8 = 0;
|
|
}
|
|
else if(m4E8 < 0x1E) {
|
|
m4E8++;
|
|
}
|
|
else if(!dComIfGp_roomControl_checkStatusFlag(fopAcM_GetHomeRoomNo(this), 0x10)) {
|
|
current = home;
|
|
shape_angle = home.angle;
|
|
speedF = 0.0f;
|
|
m4E8 = 0;
|
|
|
|
fopAcM_seStart(this, JA_SE_CV_CB_LEFT_ALONE, 0);
|
|
}
|
|
else {
|
|
daPy_getPlayerLinkActorClass()->npcStartRestartRoom();
|
|
}
|
|
}
|
|
else {
|
|
m4E8 = 0;
|
|
}
|
|
|
|
if(mAcch.GetGroundH() != -G_CM3D_F_INF) {
|
|
cM3dGPla* pla = dComIfG_Bgsp()->GetTriPla(mAcch.m_gnd);
|
|
if(pla) {
|
|
m910 = pla->mNormal;
|
|
|
|
if(m8E0) {
|
|
maxFallSpeed = -4.0f - (1.0f - m910.y) * 100.0f;
|
|
|
|
if(dComIfG_Bgsp()->GetSpecialCode(mAcch.m_gnd) == 1) {
|
|
f32 temp = m910.abs2XZ();
|
|
temp2.x = m910.x * 40.0f;
|
|
temp2.z = m910.z * 40.0f;
|
|
speed.y = std::sqrtf(1.0f - temp) * -40.0f;
|
|
maxFallSpeed = speed.y;
|
|
temp3 = temp * 2.0f;
|
|
|
|
checkLanding();
|
|
}
|
|
}
|
|
}
|
|
|
|
s8 roomNo = dComIfG_Bgsp()->GetRoomId(mAcch.m_gnd);
|
|
fopAcM_SetRoomNo(this, roomNo);
|
|
tevStr.mRoomNo = roomNo;
|
|
tevStr.mEnvrIdxOverride = dComIfG_Bgsp()->GetPolyColor(mAcch.m_gnd);
|
|
mStts.SetRoomId(roomNo);
|
|
mPolyInfo = mAcch.m_gnd;
|
|
}
|
|
|
|
setCollision();
|
|
}
|
|
|
|
#if VERSION > VERSION_DEMO
|
|
if(checkNowPosMove("Cb1")) {
|
|
playAnm();
|
|
}
|
|
#endif
|
|
|
|
#if VERSION > VERSION_JPN
|
|
if(dComIfGp_getPlayer(0) == this) {
|
|
dComIfGp_setDoStatus(dActStts_BLANK_e);
|
|
dComIfGp_setAStatus(dActStts_HIDDEN_e);
|
|
dComIfGp_setRStatusForce(dActStts_BLANK_e);
|
|
}
|
|
#endif
|
|
|
|
if(!eventProc()) {
|
|
offTact();
|
|
|
|
if(
|
|
!isFlyAction()
|
|
#if VERSION > VERSION_DEMO
|
|
&& !isMusic()
|
|
#endif
|
|
&& mWindCyl.ChkTgHit()
|
|
) {
|
|
temp2 = *mWindCyl.GetTgRVecP();
|
|
f32 temp = mWindCyl.GetTgRVecP()->absXZ();
|
|
if(temp < 1.0f) {
|
|
temp2 = (current.pos - *mWindCyl.GetTgHitPosP()) * 30.0f;
|
|
}
|
|
|
|
if(temp > 30.0f) {
|
|
temp2 *= 30.0f / temp;
|
|
}
|
|
|
|
temp3 = 1.0f;
|
|
}
|
|
|
|
cLib_addCalcPosXZ(&m88C, temp2, 0.5f, temp3, 0.5f);
|
|
if(dComIfGp_getPlayer(0) == this) {
|
|
#if VERSION <= VERSION_JPN
|
|
int r4 = dActStts_BLANK_e;
|
|
dComIfGp_setDoStatus(r4);
|
|
dComIfGp_setAStatus(dActStts_HIDDEN_e);
|
|
if(mAcch.ChkGroundHit() != false) {
|
|
r4 = dActStts_RETURN_e;
|
|
}
|
|
dComIfGp_setRStatusForce(r4);
|
|
#else
|
|
if(mAcch.ChkGroundHit()) {
|
|
dComIfGp_setRStatusForce(dActStts_RETURN_e);
|
|
}
|
|
#endif
|
|
|
|
fopAcM_SetStatusMap(this, 0x12);
|
|
|
|
if(isReturnLink()) {
|
|
m8DD = 1;
|
|
}
|
|
else {
|
|
if(isNoCarryAction()) {
|
|
setPlayerAction(&daNpc_Cb1_c::carryPlayerAction, NULL);
|
|
returnLink();
|
|
}
|
|
|
|
#if VERSION == VERSION_DEMO
|
|
playerAction(NULL);
|
|
|
|
if(dComIfGp_getRStatusForce() == 7 && !dComIfGp_event_runCheck() && (CPad_CHECK_TRIG_R(0) || CPad_CHECK_TRIG_START(0))) {
|
|
returnLink();
|
|
} else
|
|
#else
|
|
|
|
if(!dComIfGp_event_runCheck() && dComIfGp_getRStatusForce() == 7 && !dComIfGp_event_runCheck() && (CPad_CHECK_TRIG_R(0) || CPad_CHECK_TRIG_START(0))) {
|
|
returnLink();
|
|
}
|
|
|
|
playerAction(NULL);
|
|
#endif
|
|
|
|
if(
|
|
getDamageFogTimer() == 0
|
|
#if VERSION > VERSION_DEMO
|
|
&& !isMusic()
|
|
#endif
|
|
&& mCyl.ChkTgHit()
|
|
&& mCyl.GetTgHitObj()
|
|
) {
|
|
cXyz temp = current.pos - *mCyl.GetTgHitPosP();
|
|
current.angle.y = cM_atan2s(temp.x, temp.z);
|
|
speedF = l_HIO.field_0xC4;
|
|
setPlayerAction(&daNpc_Cb1_c::hitPlayerAction, NULL);
|
|
setDamageFogTimer(l_HIO.mDamageTimer);
|
|
fopAcM_monsSeStart(this, JA_SE_CV_CB_DAMAGE, 0);
|
|
}
|
|
}
|
|
|
|
m8E2 = dComIfGp_getDoStatus();
|
|
}
|
|
else {
|
|
m8E1 = chkMoveBlock(&m91C);
|
|
|
|
if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_1610)) {
|
|
fopAcM_SetStatusMap(this, 0xD);
|
|
}
|
|
else {
|
|
fopAcM_SetStatusMap(this, 0x7);
|
|
}
|
|
|
|
carryCheck();
|
|
checkOrder();
|
|
npcAction(NULL);
|
|
|
|
if(!chkNpcAction(&daNpc_Cb1_c::flyNpcAction)) {
|
|
current.angle.y = shape_angle.y;
|
|
}
|
|
|
|
if(
|
|
getDamageFogTimer() == 0 &&
|
|
#if VERSION > VERSION_DEMO
|
|
!isMusic() &&
|
|
#endif
|
|
mCyl.ChkTgHit() &&
|
|
mCyl.GetTgHitObj()
|
|
) {
|
|
cXyz temp = current.pos - *mCyl.GetTgHitPosP();
|
|
current.angle.y = cM_atan2s(temp.x, temp.z);
|
|
speedF = l_HIO.field_0xC4;
|
|
setNpcAction(&daNpc_Cb1_c::hitNpcAction, NULL);
|
|
setDamageFogTimer(l_HIO.mDamageTimer);
|
|
fopAcM_monsSeStart(this, JA_SE_CV_CB_DAMAGE, 0);
|
|
}
|
|
|
|
m8E2 = 0;
|
|
}
|
|
}
|
|
|
|
eventOrder();
|
|
setBaseMtx();
|
|
|
|
cXyz temp5(0.0f, l_HIO.mNpc.mAttnYOffset, 0.0f);
|
|
cLib_offsetPos(&attention_info.position, ¤t.pos, shape_angle.y, &temp5);
|
|
cXyz temp6(0.0f, l_HIO.field_0x30, 0.0f);
|
|
cLib_offsetPos(&eyePos, ¤t.pos, shape_angle.y, &temp6);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00009090-000093A8 .text __dt__11daNpc_Cb1_cFv */
|
|
daNpc_Cb1_c::~daNpc_Cb1_c() {
|
|
dComIfG_resDelete(&mPhs, "Cb");
|
|
|
|
|
|
#if VERSION == VERSION_DEMO
|
|
if(mpMorf)
|
|
#else
|
|
if(heap && mpMorf)
|
|
#endif
|
|
{
|
|
mpMorf->stopZelAnime();
|
|
}
|
|
|
|
if(l_HIO.mNo >= 0) {
|
|
mDoHIO_deleteChild(l_HIO.mNo);
|
|
l_HIO.mNo = -1;
|
|
}
|
|
|
|
offFlying();
|
|
offPlayerRoom();
|
|
|
|
#if VERSION == VERSION_DEMO
|
|
mDoAud_cbPracticeStop();
|
|
#else
|
|
musicStop();
|
|
#endif
|
|
}
|
|
|
|
/* 000093A8-000093C8 .text daNpc_Cb1_Create__FP10fopAc_ac_c */
|
|
static cPhs_State daNpc_Cb1_Create(fopAc_ac_c* i_this) {
|
|
return ((daNpc_Cb1_c*)i_this)->create();
|
|
}
|
|
|
|
/* 000093C8-000093F0 .text daNpc_Cb1_Delete__FP11daNpc_Cb1_c */
|
|
static BOOL daNpc_Cb1_Delete(daNpc_Cb1_c* i_this) {
|
|
((daNpc_Cb1_c*)i_this)->~daNpc_Cb1_c();
|
|
return TRUE;
|
|
}
|
|
|
|
/* 000093F0-00009410 .text daNpc_Cb1_Execute__FP11daNpc_Cb1_c */
|
|
static BOOL daNpc_Cb1_Execute(daNpc_Cb1_c* i_this) {
|
|
return ((daNpc_Cb1_c*)i_this)->execute();
|
|
}
|
|
|
|
/* 00009410-00009430 .text daNpc_Cb1_Draw__FP11daNpc_Cb1_c */
|
|
static BOOL daNpc_Cb1_Draw(daNpc_Cb1_c* i_this) {
|
|
return ((daNpc_Cb1_c*)i_this)->draw();
|
|
}
|
|
|
|
/* 00009430-00009438 .text daNpc_Cb1_IsDelete__FP11daNpc_Cb1_c */
|
|
static BOOL daNpc_Cb1_IsDelete(daNpc_Cb1_c*) {
|
|
return TRUE;
|
|
}
|
|
|
|
static actor_method_class l_daNpc_Cb1_Method = {
|
|
(process_method_func)daNpc_Cb1_Create,
|
|
(process_method_func)daNpc_Cb1_Delete,
|
|
(process_method_func)daNpc_Cb1_Execute,
|
|
(process_method_func)daNpc_Cb1_IsDelete,
|
|
(process_method_func)daNpc_Cb1_Draw,
|
|
};
|
|
|
|
actor_process_profile_definition g_profile_NPC_CB1 = {
|
|
/* LayerID */ fpcLy_CURRENT_e,
|
|
/* ListID */ 0x0007,
|
|
/* ListPrio */ fpcPi_CURRENT_e,
|
|
/* ProcName */ PROC_NPC_CB1,
|
|
/* Proc SubMtd */ &g_fpcLf_Method.base,
|
|
/* Size */ sizeof(daNpc_Cb1_c),
|
|
/* SizeOther */ 0,
|
|
/* Parameters */ 0,
|
|
/* Leaf SubMtd */ &g_fopAc_Method.base,
|
|
/* Priority */ PRIO_NPC_CB1,
|
|
/* Actor SubMtd */ &l_daNpc_Cb1_Method,
|
|
/* Status */ 0x07 | fopAcStts_SHOWMAP_e | fopAcStts_CULL_e | fopAcStts_FREEZE_e | fopAcStts_UNK4000_e | fopAcStts_UNK40000_e | fopAcStts_UNK2000000_e,
|
|
/* Group */ fopAc_NPC_e,
|
|
/* CullType */ fopAc_CULLBOX_12_e,
|
|
};
|