mirror of
https://github.com/zeldaret/tww.git
synced 2026-05-23 06:54:16 -04:00
9075155201
Co-authored-by: < >
2494 lines
71 KiB
C++
2494 lines
71 KiB
C++
/**
|
|
* d_a_npc_os.cpp
|
|
* Player - Servant of the Tower / お供石像 (Companion Statue)
|
|
*/
|
|
|
|
#include "d/dolzel_rel.h" // IWYU pragma: keep
|
|
#include "d/actor/d_a_npc_os.h"
|
|
#include "d/d_com_inf_game.h"
|
|
#include "d/d_procname.h"
|
|
#include "d/d_priority.h"
|
|
#include "d/actor/d_a_player_main.h"
|
|
#include "d/actor/d_a_pedestal.h"
|
|
#include "d/res/res_os.h"
|
|
#include "f_op/f_op_actor_mng.h"
|
|
#include "f_op/f_op_camera.h"
|
|
#include "m_Do/m_Do_controller_pad.h"
|
|
|
|
class daNpc_Os_HIO2_c : public JORReflexible {
|
|
public:
|
|
daNpc_Os_HIO2_c();
|
|
virtual ~daNpc_Os_HIO2_c() {}
|
|
|
|
void genMessage(JORMContext* ctx) {}
|
|
|
|
public:
|
|
/* 0x00 - vtable */
|
|
|
|
/* 0x04 */ f32 field_0x04;
|
|
/* 0x08 */ f32 field_0x08;
|
|
/* 0x0C */ f32 field_0x0C;
|
|
/* 0x10 */ f32 field_0x10;
|
|
/* 0x14 */ f32 field_0x14;
|
|
/* 0x18 */ f32 field_0x18;
|
|
/* 0x1C */ f32 field_0x1C;
|
|
/* 0x20 */ f32 field_0x20;
|
|
/* 0x24 */ s16 field_0x24;
|
|
/* 0x26 */ s16 field_0x26;
|
|
/* 0x28 */ s16 field_0x28;
|
|
}; // Size: 0x2A
|
|
|
|
class daNpc_Os_HIO_c : public JORReflexible {
|
|
public:
|
|
daNpc_Os_HIO_c();
|
|
virtual ~daNpc_Os_HIO_c() {}
|
|
|
|
void genMessage(JORMContext* ctx) {}
|
|
|
|
public:
|
|
/* 0x00 - vtable*/
|
|
|
|
/* 0x04 */ s8 mNo;
|
|
|
|
/* 0x08 */ daNpc_Os_HIO2_c mOs2;
|
|
/* 0x34 */ dNpc_HIO_c mNpc;
|
|
|
|
/* 0x5C */ daNpc_Os_c* field_0x5C;
|
|
/* 0x60 */ f32 field_0x60;
|
|
/* 0x64 */ f32 field_0x64;
|
|
/* 0x68 */ f32 field_0x68;
|
|
/* 0x6C */ f32 field_0x6C;
|
|
/* 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 field_0x88;
|
|
/* 0x8C */ f32 field_0x8C;
|
|
/* 0x90 */ f32 field_0x90;
|
|
/* 0x94 */ f32 field_0x94;
|
|
/* 0x98 */ f32 field_0x98;
|
|
/* 0x9C */ f32 field_0x9C;
|
|
/* 0xA0 */ f32 field_0xA0;
|
|
/* 0xA4 */ f32 field_0xA4;
|
|
/* 0xA8 */ f32 field_0xA8;
|
|
/* 0xAC */ f32 field_0xAC;
|
|
/* 0xB0 */ f32 field_0xB0;
|
|
}; // Size: 0xB4
|
|
|
|
static daNpc_Os_HIO_c l_HIO;
|
|
static s32 l_hio_counter = 0;
|
|
static cXyz l_smoke_scale(0.5f, 0.5f, 0.5f);
|
|
|
|
static dCcD_SrcCyl l_cyl_src = {
|
|
// dCcD_SrcGObjInf
|
|
{
|
|
/* Flags */ 0,
|
|
/* SrcObjAt Type */ 0,
|
|
/* SrcObjAt Atp */ 0,
|
|
/* SrcObjAt SPrm */ 0,
|
|
/* SrcObjTg Type */ ~AT_TYPE_BOOMERANG,
|
|
/* SrcObjTg SPrm */ cCcD_TgSPrm_Set_e | cCcD_TgSPrm_IsEnemy_e,
|
|
/* SrcObjCo SPrm */ cCcD_CoSPrm_VsGrpAll_e | cCcD_CoSPrm_IsPlayer_e | cCcD_CoSPrm_Set_e,
|
|
/* SrcGObjAt Se */ 0,
|
|
/* SrcGObjAt HitMark */ 0,
|
|
/* SrcGObjAt Spl */ 0,
|
|
/* SrcGObjAt Mtrl */ 0,
|
|
/* SrcGObjAt SPrm */ 0,
|
|
/* SrcGObjTg Se */ 0,
|
|
/* SrcGObjTg HitMark */ 0,
|
|
/* SrcGObjTg Spl */ 0,
|
|
/* 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 const char* l_staff_name[] = {
|
|
"Os",
|
|
"Os1",
|
|
"Os2"
|
|
};
|
|
|
|
static char* l_daiza_name[] = {
|
|
"Hdai1",
|
|
"Hdai2",
|
|
"Hdai3"
|
|
};
|
|
|
|
static Vec l_finish_home_pos[] = {
|
|
{683.0f, 340.0f, -8947.0f},
|
|
{-683.0f, 340.0f, -8947.0f},
|
|
{0.0f, 340.0f, -9630.0}
|
|
};
|
|
|
|
/* 000000EC-00000154 .text __ct__15daNpc_Os_HIO2_cFv */
|
|
daNpc_Os_HIO2_c::daNpc_Os_HIO2_c() {
|
|
field_0x04 = 3.5f;
|
|
field_0x08 = 17.0f;
|
|
field_0x0C = 2.5f;
|
|
field_0x10 = 1.8f;
|
|
field_0x14 = 0.6f;
|
|
field_0x24 = 3000;
|
|
field_0x26 = 1000;
|
|
field_0x28 = 5;
|
|
field_0x18 = 2.5f;
|
|
field_0x1C = 0.6f;
|
|
field_0x20 = 1.0f;
|
|
}
|
|
|
|
/* 00000154-000002B8 .text __ct__14daNpc_Os_HIO_cFv */
|
|
daNpc_Os_HIO_c::daNpc_Os_HIO_c() {
|
|
mNpc.m04 = -20.0f;
|
|
mNpc.mMaxHeadX = 0;
|
|
mNpc.mMaxHeadY = 0x1388;
|
|
mNpc.mMaxBackboneX = 0;
|
|
mNpc.mMaxBackboneY = 0;
|
|
mNpc.mMinHeadX = 0;
|
|
mNpc.mMinHeadY = -0x1388;
|
|
mNpc.mMinBackboneX = 0;
|
|
mNpc.mMinBackboneY = 0;
|
|
mNpc.mMaxTurnStep = 0x1000;
|
|
mNpc.mMaxHeadTurnVel = 0x800;
|
|
mNpc.mAttnYOffset = 130.0f;
|
|
mNpc.mMaxAttnAngleY = 0x4000;
|
|
mNpc.m22 = 0x0;
|
|
mNpc.mMaxAttnDistXZ = 200.0f;
|
|
|
|
field_0x5C = 0;
|
|
field_0x60 = 80.0f;
|
|
field_0x64 = 500.0f;
|
|
field_0x68 = 0.05f;
|
|
field_0x6C = 17.0f;
|
|
field_0x70 = 0.0f;
|
|
field_0x74 = 0.5f;
|
|
field_0x78 = 0.2f;
|
|
field_0x7C = 0.9f;
|
|
field_0x80 = 15.0f;
|
|
field_0x84 = 22.0f;
|
|
field_0x8C = 4.0f;
|
|
field_0x90 = -1.51367f;
|
|
field_0x94 = -1.09863f;
|
|
field_0x98 = -0.56152f;
|
|
field_0x9C = 0.1f;
|
|
field_0xA0 = 0.2f;
|
|
field_0xA4 = 10.0f;
|
|
field_0xA8 = 0.75f;
|
|
field_0xAC = 18.0f;
|
|
field_0xB0 = 8.0f;
|
|
mNo = -1;
|
|
}
|
|
|
|
/* 00000300-00000354 .text searchFromName__FPcUlUl */
|
|
static fopAc_ac_c* searchFromName(char* name, u32 param_1, u32 param_2) {
|
|
fopAc_ac_c* actor = fopAcM_searchFromName(name, param_1, param_2);
|
|
|
|
if(actor && fpcM_IsCreating(fopAcM_GetID(actor))) {
|
|
actor = NULL;
|
|
}
|
|
|
|
return actor;
|
|
}
|
|
|
|
/* 00000354-00000374 .text CheckCreateHeap__FP10fopAc_ac_c */
|
|
static BOOL CheckCreateHeap(fopAc_ac_c* i_this) {
|
|
return static_cast<daNpc_Os_c*>(i_this)->createHeap();
|
|
}
|
|
|
|
/* 00000374-00000538 .text create__10daNpc_Os_cFv */
|
|
cPhs_State daNpc_Os_c::create() {
|
|
fopAcM_SetupActor(this, daNpc_Os_c)
|
|
|
|
static u32 l_heap_size = 0xFA0;
|
|
|
|
cPhs_State result = dComIfG_resLoad(&mPhs, "Os");
|
|
if(result == cPhs_COMPLEATE_e) {
|
|
if(!fopAcM_entrySolidHeap(this, CheckCreateHeap, l_heap_size)) {
|
|
mpMorf = NULL;
|
|
return cPhs_ERROR_e;
|
|
}
|
|
|
|
if(!finishCheck()) {
|
|
checkRestart(getRestartNumber());
|
|
}
|
|
else {
|
|
if(argument < 3) {
|
|
home.pos = l_finish_home_pos[argument];
|
|
current.pos = home.pos;
|
|
}
|
|
}
|
|
|
|
setBaseMtx();
|
|
fopAcM_SetMtx(this, mpMorf->getModel()->getBaseTRMtx());
|
|
if(l_HIO.mNo < 0) {
|
|
l_HIO.mNo = mDoHIO_createChild("お供石像", &l_HIO); // "Companion Statue" (otomo sekizou)
|
|
l_HIO.field_0x5C = this;
|
|
l_hio_counter = 1;
|
|
}
|
|
else {
|
|
l_hio_counter += 1;
|
|
}
|
|
|
|
if(!init()) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
|
|
fopAcM_setStageLayer(this);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
/* 00000748-000008CC .text nodeCallBack__FP7J3DNodei */
|
|
static BOOL nodeCallBack(J3DNode* node, int calcTiming) {
|
|
if (calcTiming == J3DNodeCBCalcTiming_In) {
|
|
J3DModel* model = j3dSys.getModel();
|
|
J3DJoint* joint = (J3DJoint*)node;
|
|
daNpc_Os_c* i_this = (daNpc_Os_c*)model->getUserArea();
|
|
if (i_this) {
|
|
static cXyz l_offsetAttPos(0.0f, 0.0f, 0.0f);
|
|
static cXyz l_offsetEyePos(15.0f, 0.0f, 0.0f);
|
|
|
|
s32 jntNo = joint->getJntNo();
|
|
mDoMtx_stack_c::copy(model->getAnmMtx(jntNo));
|
|
mDoMtx_stack_c::multVec(&l_offsetAttPos, &i_this->getAttentionBasePos());
|
|
mDoMtx_stack_c::XrotM(i_this->getHead_y());
|
|
mDoMtx_stack_c::ZrotM(-i_this->getHead_x());
|
|
mDoMtx_stack_c::multVec(&l_offsetEyePos, &i_this->getEyePos());
|
|
i_this->incAttnSetCount();
|
|
cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx);
|
|
model->setAnmMtx(jntNo, mDoMtx_stack_c::get());
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/* 000008CC-00000988 .text tunoNodeCallBack__FP7J3DNodei */
|
|
static BOOL tunoNodeCallBack(J3DNode* node, int calcTiming) {
|
|
if (calcTiming == J3DNodeCBCalcTiming_In) {
|
|
J3DJoint* joint = (J3DJoint*)node;
|
|
J3DModel* model = j3dSys.getModel();
|
|
daNpc_Os_c* i_this = (daNpc_Os_c*)model->getUserArea();
|
|
if (i_this) {
|
|
s32 jntNo = joint->getJntNo();
|
|
if(!i_this->jointCheck(jntNo)) {
|
|
mDoMtx_stack_c::copy(model->getAnmMtx(jntNo));
|
|
mDoMtx_stack_c::scaleM(0.1f, 0.1f, 0.1f);
|
|
cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx);
|
|
model->setAnmMtx(jntNo, mDoMtx_stack_c::get());
|
|
}
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/* 00000988-00000C94 .text createHeap__10daNpc_Os_cFv */
|
|
BOOL daNpc_Os_c::createHeap() {
|
|
J3DModelData* modelData = static_cast<J3DModelData*>(dComIfG_getObjectRes("Os", OS_BDL_OS));
|
|
JUT_ASSERT(0x2F9, modelData != NULL);
|
|
|
|
mpMorf = new mDoExt_McaMorf(
|
|
modelData,
|
|
NULL, NULL,
|
|
static_cast<J3DAnmTransformKey*>(dComIfG_getObjectRes("Os", OS_BCK_OS_MOVE01)),
|
|
J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, 1,
|
|
NULL,
|
|
0x00080000,
|
|
0x11000002
|
|
);
|
|
|
|
if (!mpMorf || !mpMorf->getModel()) {
|
|
return false;
|
|
}
|
|
|
|
s16 headIdx = modelData->getJointName()->getIndex("head_joint");
|
|
if(headIdx >= 0) {
|
|
modelData->getJointNodePointer(headIdx)->setCallBack(&nodeCallBack);
|
|
}
|
|
mTuno1JointIdx = modelData->getJointName()->getIndex("tuno1_joint");
|
|
if(mTuno1JointIdx >= 0) {
|
|
modelData->getJointNodePointer(mTuno1JointIdx)->setCallBack(&tunoNodeCallBack);
|
|
}
|
|
mTuno2JointIdx = modelData->getJointName()->getIndex("tuno2_joint");
|
|
if(mTuno2JointIdx >= 0) {
|
|
modelData->getJointNodePointer(mTuno2JointIdx)->setCallBack(&tunoNodeCallBack);
|
|
}
|
|
mTuno3JointIdx =modelData->getJointName()->getIndex("tuno3_joint");
|
|
if(mTuno3JointIdx >= 0) {
|
|
modelData->getJointNodePointer(mTuno3JointIdx)->setCallBack(&tunoNodeCallBack);
|
|
}
|
|
|
|
mpMorf->getModel()->setUserArea((u32)this);
|
|
|
|
u8 anm;
|
|
if(wakeupCheck()) {
|
|
if(finishCheck()) {
|
|
anm = 1;
|
|
}
|
|
else {
|
|
anm = 6;
|
|
}
|
|
}
|
|
else {
|
|
anm = 5;
|
|
}
|
|
|
|
field_0x7A2 = 9;
|
|
|
|
if(!initBrkAnm(anm, false)) {
|
|
return false;
|
|
}
|
|
|
|
mAcchCir[0].SetWall(20.0f, 40.0f);
|
|
mAcchCir[1].SetWall(60.0f, 40.0f);
|
|
mAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 2, &mAcchCir[0], fopAcM_GetSpeed_p(this));
|
|
mAcch.OnLineCheck();
|
|
mAcch.ClrRoofNone();
|
|
mAcch.SetRoofCrrHeight(120.0f);
|
|
|
|
return true;
|
|
}
|
|
|
|
/* 00000C94-00000D10 .text jointCheck__10daNpc_Os_cFSc */
|
|
BOOL daNpc_Os_c::jointCheck(s8 param_1) {
|
|
if(argument == 0) {
|
|
if(param_1 == mTuno3JointIdx) {
|
|
return true;
|
|
}
|
|
}
|
|
else if(argument == 1) {
|
|
if(param_1 == mTuno2JointIdx) {
|
|
return true;
|
|
}
|
|
}
|
|
else if(argument == 2) {
|
|
if(param_1 == mTuno1JointIdx) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/* 00000D10-00000DBC .text wakeupCheck__10daNpc_Os_cFv */
|
|
BOOL daNpc_Os_c::wakeupCheck() {
|
|
if(argument == 0) {
|
|
if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_1780)) {
|
|
return true;
|
|
}
|
|
}
|
|
else if(argument == 1) {
|
|
if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_1740)) {
|
|
return true;
|
|
}
|
|
}
|
|
else if(argument == 2) {
|
|
if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_1720)) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/* 00000DBC-00000E3C .text setWakeup__10daNpc_Os_cFv */
|
|
void daNpc_Os_c::setWakeup() {
|
|
if(argument == 0) {
|
|
dComIfGs_onEventBit(dSv_event_flag_c::UNK_1780);
|
|
}
|
|
else if(argument == 1) {
|
|
dComIfGs_onEventBit(dSv_event_flag_c::UNK_1740);
|
|
}
|
|
else if(argument == 2) {
|
|
dComIfGs_onEventBit(dSv_event_flag_c::UNK_1720);
|
|
}
|
|
}
|
|
|
|
/* 00000E3C-00000EE8 .text finishCheck__10daNpc_Os_cFv */
|
|
BOOL daNpc_Os_c::finishCheck() {
|
|
if(argument == 0) {
|
|
if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_1710)) {
|
|
return true;
|
|
}
|
|
}
|
|
else if(argument == 1) {
|
|
if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_1704)) {
|
|
return true;
|
|
}
|
|
}
|
|
else if(argument == 2) {
|
|
if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_1B01)) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/* 00000EE8-00000F68 .text setFinish__10daNpc_Os_cFv */
|
|
void daNpc_Os_c::setFinish() {
|
|
if(argument == 0) {
|
|
dComIfGs_onEventBit(dSv_event_flag_c::UNK_1710);
|
|
}
|
|
else if(argument == 1) {
|
|
dComIfGs_onEventBit(dSv_event_flag_c::UNK_1704);
|
|
}
|
|
else if(argument == 2) {
|
|
dComIfGs_onEventBit(dSv_event_flag_c::UNK_1B01);
|
|
}
|
|
}
|
|
|
|
/* 00000F68-00000FA4 .text getWakeupOrderEventNum__10daNpc_Os_cFv */
|
|
s8 daNpc_Os_c::getWakeupOrderEventNum() {
|
|
if(argument == 0) {
|
|
return 1;
|
|
}
|
|
else if(argument == 1) {
|
|
return 3;
|
|
}
|
|
else if(argument == 2) {
|
|
return 5;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
/* 00000FA4-00001028 .text getFinishOrderEventNum__10daNpc_Os_cFv */
|
|
s8 daNpc_Os_c::getFinishOrderEventNum() {
|
|
if(fopAcM_checkCarryNow(this)) {
|
|
if(argument == 0) {
|
|
return 0xB;
|
|
}
|
|
else if(argument == 1) {
|
|
return 0xD;
|
|
}
|
|
else if(argument == 2) {
|
|
return 0xF;
|
|
}
|
|
}
|
|
else {
|
|
if(argument == 0) {
|
|
return 0xA;
|
|
}
|
|
else if(argument == 1) {
|
|
return 0xC;
|
|
}
|
|
else if(argument == 2) {
|
|
return 0xE;
|
|
}
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
/* 00001028-00001084 .text getMyStaffId__10daNpc_Os_cFv */
|
|
int daNpc_Os_c::getMyStaffId() {
|
|
if(argument < 3) {
|
|
return dComIfGp_evmng_getMyStaffId(l_staff_name[argument]);
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
/* 00001084-000010C4 .text getRestartNumber__10daNpc_Os_cFv */
|
|
s8 daNpc_Os_c::getRestartNumber() {
|
|
if(argument == 0) {
|
|
return 3;
|
|
}
|
|
else if(argument == 1) {
|
|
return 4;
|
|
}
|
|
else if(argument == 2) {
|
|
return 5;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* 000010C4-0000112C .text checkGoalRoom__10daNpc_Os_cFv */
|
|
BOOL daNpc_Os_c::checkGoalRoom() {
|
|
if(fopAcM_GetRoomNo(this) == 7 && wakeupCheck() && !finishCheck()) {
|
|
field_0x7A5 = getFinishOrderEventNum();
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/* 0000112C-000011C4 .text checkPlayerRoom__10daNpc_Os_cFv */
|
|
void daNpc_Os_c::checkPlayerRoom() {
|
|
offPlayerRoom(argument);
|
|
|
|
if(wakeupCheck() && !finishCheck()) {
|
|
fopAc_ac_c* link = dComIfGp_getLinkPlayer();
|
|
if (fopAcM_GetRoomNo(this) == fopAcM_GetRoomNo(link)) {
|
|
onPlayerRoom(argument);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 000011C4-00001300 .text eventOrderCheck__10daNpc_Os_cFv */
|
|
void daNpc_Os_c::eventOrderCheck() {
|
|
if(field_0x7A5 == -1) {
|
|
s8 roomNo = fopAcM_GetRoomNo(this);
|
|
if(argument == 0) {
|
|
if(roomNo == 7 && dComIfGs_isSwitch(field_0x794, roomNo) && !dComIfGs_isEventBit(dSv_event_flag_c::UNK_2510)) {
|
|
field_0x7A5 = 7;
|
|
}
|
|
}
|
|
else if(argument == 1) {
|
|
if(roomNo == 7 && dComIfGs_isSwitch(field_0x794, roomNo) && !dComIfGs_isEventBit(dSv_event_flag_c::UNK_2608)) {
|
|
field_0x7A5 = 8;
|
|
}
|
|
}
|
|
else if(argument == 2) {
|
|
if(roomNo == 7 && dComIfGs_isSwitch(field_0x794, roomNo) && !dComIfGs_isEventBit(dSv_event_flag_c::UNK_2604)) {
|
|
field_0x7A5 = 9;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 00001300-000013D4 .text makeBeam__10daNpc_Os_cFi */
|
|
void daNpc_Os_c::makeBeam(int param_1) {
|
|
if(field_0x738.getEmitter() == NULL) {
|
|
field_0x738.makeEmitter(dPa_name::ID_SCENE_826E, ¤t.pos, &shape_angle, 0);
|
|
|
|
if(param_1) {
|
|
fopAcM_seStartCurrent(this, JA_SE_OBJ_OSTATUE_LIGHT_ST, 0);
|
|
}
|
|
}
|
|
|
|
if(field_0x740.getEmitter() == NULL) {
|
|
field_0x740.makeEmitter(dPa_name::ID_SCENE_826F, ¤t.pos, &shape_angle, 0);
|
|
}
|
|
}
|
|
|
|
/* 000013D4-0000140C .text endBeam__10daNpc_Os_cFv */
|
|
void daNpc_Os_c::endBeam() {
|
|
field_0x738.end();
|
|
field_0x740.end();
|
|
}
|
|
|
|
/* 0000140C-00001454 .text wallHitCheck__10daNpc_Os_cFv */
|
|
s32 daNpc_Os_c::wallHitCheck() {
|
|
if(mAcch.ChkWallHit()) {
|
|
for(int i = 0; i < 2; i++) {
|
|
if(mAcchCir[i].ChkWallHit()) {
|
|
return i;
|
|
}
|
|
}
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
/* 00001454-000014CC .text walkProc__10daNpc_Os_cFfs */
|
|
void daNpc_Os_c::walkProc(f32 param_1, s16 param_2) {
|
|
if(mPrevMorfFrame > l_HIO.field_0xB0 && mPrevMorfFrame < l_HIO.field_0xAC) {
|
|
speedF = l_HIO.mOs2.field_0x08 * param_1;
|
|
}
|
|
else {
|
|
speedF = 0.0f;
|
|
}
|
|
|
|
cLib_addCalcAngleS(¤t.angle.y, param_2, l_HIO.mOs2.field_0x28, l_HIO.mOs2.field_0x24, l_HIO.mOs2.field_0x26);
|
|
}
|
|
|
|
/* 000014CC-0000159C .text setAction__10daNpc_Os_cFPM10daNpc_Os_cFPCvPvPv_iM10daNpc_Os_cFPCvPvPv_iPv */
|
|
BOOL daNpc_Os_c::setAction(ActionFunc_t* pOut, ActionFunc_t action, void* param_1) {
|
|
if(*pOut != action) {
|
|
if(*pOut) {
|
|
field_0x7A9 = 0xFF;
|
|
(this->**pOut)(param_1);
|
|
}
|
|
|
|
*pOut = action;
|
|
field_0x7A9 = 0;
|
|
field_0x7AC = 0;
|
|
field_0x7AE = 0;
|
|
field_0x7B0 = 0;
|
|
field_0x7B2 = 0;
|
|
field_0x7B8 = 0.0f;
|
|
(this->**pOut)(param_1);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/* 0000159C-0000164C .text npcAction__10daNpc_Os_cFPv */
|
|
void daNpc_Os_c::npcAction(void* param_1) {
|
|
if(!mNpcAction) {
|
|
speedF = 0.0f;
|
|
|
|
if(field_0x7A2 == 8) {
|
|
initBrkAnm(6, true);
|
|
}
|
|
|
|
setNpcAction(&daNpc_Os_c::waitNpcAction, 0);
|
|
}
|
|
|
|
(this->*mNpcAction)(param_1);
|
|
}
|
|
|
|
/* 0000164C-000016B0 .text setNpcAction__10daNpc_Os_cFM10daNpc_Os_cFPCvPvPv_iPv */
|
|
void daNpc_Os_c::setNpcAction(ActionFunc_t action, void* param_2) {
|
|
mPlayerAction = NULL;
|
|
setAction(&mNpcAction, action, param_2);
|
|
}
|
|
|
|
/* 000016B0-00001760 .text playerAction__10daNpc_Os_cFPv */
|
|
void daNpc_Os_c::playerAction(void* param_1) {
|
|
if(!mPlayerAction) {
|
|
speedF = 0.0f;
|
|
setPlayerAction(&daNpc_Os_c::waitPlayerAction, 0);
|
|
}
|
|
|
|
dComIfGp_setRStatusForce(dActStts_RETURN_e);
|
|
dComIfGp_setDoStatus(dActStts_HIDDEN_e);
|
|
dComIfGp_setAStatus(dActStts_HIDDEN_e);
|
|
|
|
(this->*mPlayerAction)(param_1);
|
|
}
|
|
|
|
/* 00001760-000017C4 .text setPlayerAction__10daNpc_Os_cFM10daNpc_Os_cFPCvPvPv_iPv */
|
|
void daNpc_Os_c::setPlayerAction(ActionFunc_t action, void* param_2) {
|
|
mNpcAction = NULL;
|
|
setAction(&mPlayerAction, action, param_2);
|
|
}
|
|
|
|
/* 000017C4-0000180C .text getStickAngY__10daNpc_Os_cFv */
|
|
s16 daNpc_Os_c::getStickAngY() {
|
|
return dCam_getControledAngleY(dComIfGp_getCamera(0)) + (g_mDoCPd_cpadInfo[0].mMainStickAngle + 0x8000);
|
|
}
|
|
|
|
/* 0000180C-00001964 .text calcStickPos__10daNpc_Os_cFsP4cXyz */
|
|
int daNpc_Os_c::calcStickPos(s16 param_1, cXyz* param_2) {
|
|
int ret;
|
|
|
|
// 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 lockon = attention.Lockon();
|
|
if(!lockon) {
|
|
ret = 0;
|
|
} else {
|
|
BOOL lockon = attention.LockonTruth();
|
|
ret = -1;
|
|
if (lockon) {
|
|
ret = 1;
|
|
}
|
|
}
|
|
|
|
if(attList == NULL) {
|
|
attList = attention.GetActionList(0);
|
|
}
|
|
|
|
if(attList) {
|
|
*param_2 = attList->getActor()->eyePos;
|
|
|
|
return ret;
|
|
}
|
|
|
|
if(lockon) {
|
|
param_1 = shape_angle.y;
|
|
}
|
|
|
|
param_2->set(current.pos.x + cM_ssin(param_1) * 100.0f, current.pos.y, current.pos.z + cM_scos(param_1) * 100.0f);
|
|
|
|
return ret;
|
|
}
|
|
|
|
/* 00001964-000019B8 .text returnLinkPlayer__10daNpc_Os_cFv */
|
|
void daNpc_Os_c::returnLinkPlayer() {
|
|
changePlayer(dComIfGp_getLinkPlayer());
|
|
offNpcCallCommand();
|
|
initBrkAnm(6, true);
|
|
}
|
|
|
|
/* 000019B8-00001A08 .text returnLinkCheck__10daNpc_Os_cFv */
|
|
BOOL daNpc_Os_c::returnLinkCheck() {
|
|
if(!dComIfGp_event_runCheck()) {
|
|
if((CPad_CHECK_TRIG_R(0) || CPad_CHECK_TRIG_START(0)) && mAcch.ChkGroundHit()) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/* 00001A08-00001CD8 .text waitNpcAction__10daNpc_Os_cFPv */
|
|
BOOL daNpc_Os_c::waitNpcAction(void*) {
|
|
if(field_0x7A9 == 0) {
|
|
maxFallSpeed = -100.0f;
|
|
gravity = l_HIO.field_0x8C;
|
|
speedF = 0.0f;
|
|
field_0x788 = 120.0f;
|
|
|
|
field_0x7A9 += 1;
|
|
}
|
|
else if(field_0x7A9 != -1) {
|
|
if(field_0x78C && mReachedAnimEnd) {
|
|
setAnm(0);
|
|
}
|
|
|
|
if(field_0x7A9 == 1) {
|
|
if(wakeupCheck() && dComIfGp_getCb1Player() == this) {
|
|
if(checkNpcNotChange()) {
|
|
offNpcNotChange();
|
|
initBrkAnm(4, true);
|
|
field_0x7A1 = 0;
|
|
field_0x7A9 += 1;
|
|
}
|
|
else {
|
|
field_0x7A9 += 1;
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
cLib_onBit<u32>(attention_info.flags, fopAc_Attn_ACTION_CARRY_e);
|
|
s16 angle = shape_angle.y + mJntCtrl.getHead_y() + mJntCtrl.getBackbone_y();
|
|
field_0x7A4 = chkAttention(current.pos, angle);
|
|
|
|
if(chkArea(¤t.pos)) {
|
|
lookBack(field_0x7A4, 0, 1);
|
|
}
|
|
|
|
current.angle.y = shape_angle.y;
|
|
|
|
if(finishCheck()) {
|
|
setNpcAction(&daNpc_Os_c::finish01NpcAction, 0);
|
|
}
|
|
}
|
|
|
|
cLib_offBit<u32>(attention_info.flags, (fopAc_Attn_LOCKON_TALK_e | fopAc_Attn_ACTION_SPEAK_e));
|
|
|
|
f32 dist_sq = fopAcM_searchPlayerDistance2(this);
|
|
if(!checkNpcCallCommand()) {
|
|
if(dist_sq < SQUARE(l_HIO.field_0x64)) {
|
|
daPy_getPlayerLinkActorClass()->onNpcCallCommand();
|
|
}
|
|
}
|
|
else {
|
|
if(wakeupCheck()) {
|
|
if(dist_sq >= SQUARE(l_HIO.field_0x60)) {
|
|
setNpcAction(&daNpc_Os_c::searchNpcAction, 0);
|
|
}
|
|
}
|
|
else {
|
|
field_0x7A5 = getWakeupOrderEventNum();
|
|
}
|
|
}
|
|
|
|
setAttention(true);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/* 00001CD8-00001E34 .text finish01NpcAction__10daNpc_Os_cFPv */
|
|
BOOL daNpc_Os_c::finish01NpcAction(void* param_1) {
|
|
if(field_0x7A9 == 0) {
|
|
if(dComIfGp_getCb1Player() == this) {
|
|
onNpcNotChange();
|
|
dComIfGp_setCb1Player(NULL);
|
|
}
|
|
|
|
setAnm(0);
|
|
initBrkAnm(0, true);
|
|
field_0x7A1 = 0;
|
|
maxFallSpeed = -100.0f;
|
|
gravity = l_HIO.field_0x8C;
|
|
speedF = 0.0f;
|
|
field_0x788 = 120.0f;
|
|
|
|
field_0x7A9 += 1;
|
|
}
|
|
else if(field_0x7A9 != -1) {
|
|
mJntCtrl.lookAtTarget(&shape_angle.y, 0, cXyz::Zero, shape_angle.y, field_0x798, true);
|
|
|
|
if(field_0x7A1) {
|
|
setNpcAction(&daNpc_Os_c::finish02NpcAction, 0);
|
|
}
|
|
|
|
setAttention(true);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/* 00001E34-00001F48 .text finish02NpcAction__10daNpc_Os_cFPv */
|
|
BOOL daNpc_Os_c::finish02NpcAction(void* param_1) {
|
|
if(field_0x7A9 == 0) {
|
|
if(param_1 == NULL) {
|
|
if(dComIfGs_isEventBit(dSv_event_flag_c::UNK_1B01)) {
|
|
setAnm_brkAnm(7);
|
|
}
|
|
else {
|
|
setAnm_brkAnm(1);
|
|
}
|
|
}
|
|
|
|
onFinish();
|
|
maxFallSpeed = -100.0f;
|
|
gravity = l_HIO.field_0x8C;
|
|
speedF = 0.0f;
|
|
field_0x788 = 120.0f;
|
|
|
|
field_0x7A9 += 1;
|
|
}
|
|
else if(field_0x7A9 != -1) {
|
|
mJntCtrl.lookAtTarget(&shape_angle.y, 0, cXyz::Zero, shape_angle.y, field_0x798, true);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
static fpc_ProcID l_msgId;
|
|
static msg_class* l_msg;
|
|
|
|
/* 00001F48-00002118 .text talkNpcAction__10daNpc_Os_cFPv */
|
|
BOOL daNpc_Os_c::talkNpcAction(void*) {
|
|
if(field_0x7A9 == 0) {
|
|
l_msgId = -1;
|
|
field_0x780 = getMsg();
|
|
cLib_offBit<u32>(attention_info.flags, fopAc_Attn_ACTION_CARRY_e);
|
|
field_0x7A3 = 0;
|
|
field_0x7A9 += 1;
|
|
}
|
|
else if(field_0x7A9 != -1) {
|
|
s16 angle = shape_angle.y + mJntCtrl.getHead_y() + mJntCtrl.getBackbone_y();
|
|
field_0x7A4 = chkAttention(current.pos, angle);
|
|
|
|
if(field_0x7A9 == 1) {
|
|
if(talk_init()) {
|
|
field_0x7A9 = 2;
|
|
}
|
|
}
|
|
else if(field_0x7A9 == 2) {
|
|
if(talk()) {
|
|
setNpcAction(&daNpc_Os_c::waitNpcAction, 0);
|
|
dComIfGp_event_reset();
|
|
}
|
|
}
|
|
else if(field_0x7A9 == 3) {
|
|
setNpcAction(&daNpc_Os_c::waitNpcAction, 0);
|
|
}
|
|
|
|
mJntCtrl.setTrn();
|
|
lookBack(field_0x7A4, 0, 0);
|
|
current.angle.y = shape_angle.y;
|
|
setAttention(mpMorf->isMorf());
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/* 00002118-000023A4 .text carryNpcAction__10daNpc_Os_cFPv */
|
|
BOOL daNpc_Os_c::carryNpcAction(void* param_1) {
|
|
if(field_0x7A9 == 0) {
|
|
setAnm(0);
|
|
|
|
cLib_offBit<u32>(attention_info.flags, fopAc_Attn_ACTION_CARRY_e);
|
|
offNpcCallCommand();
|
|
field_0x7AC = shape_angle.y - dComIfGp_getPlayer(0)->shape_angle.y;
|
|
field_0x788 = 120.0f;
|
|
field_0x7A9 += 1;
|
|
}
|
|
else if(field_0x7A9 == -1) {
|
|
field_0x7E4.y = 0.0f;
|
|
field_0x7E4.z = 0.0f;
|
|
}
|
|
else {
|
|
setRestart(getRestartNumber());
|
|
|
|
cLib_chaseF(&field_0x7E4.x, l_HIO.field_0x90, 1.0f);
|
|
cLib_chaseF(&field_0x7E4.y, l_HIO.field_0x94, 1.0f);
|
|
cLib_chaseF(&field_0x7E4.z, l_HIO.field_0x98, 1.0f);
|
|
|
|
s32 wallHit = wallHitCheck();
|
|
if(wallHit >= 0 || mAcch.ChkRoofHit()) {
|
|
fopAcM_cancelCarryNow(this);
|
|
|
|
s16 temp = mAcchCir[wallHit].GetWallAngleY();
|
|
setNpcAction(&daNpc_Os_c::throwNpcAction, &temp);
|
|
|
|
return true;
|
|
}
|
|
|
|
if(!fopAcM_checkCarryNow(this)) {
|
|
if(speedF > 0.0f) {
|
|
setNpcAction(&daNpc_Os_c::throwNpcAction, 0);
|
|
|
|
return true;
|
|
}
|
|
else {
|
|
fopAcM_seStartCurrent(this, JA_SE_OBJ_OSTATUE_PUT, 0);
|
|
smokeSet(dPa_name::ID_SCENE_A328);
|
|
setNpcAction(&daNpc_Os_c::waitNpcAction, 0);
|
|
|
|
return true;
|
|
}
|
|
}
|
|
|
|
mJntCtrl.lookAtTarget(&shape_angle.y, 0, cXyz::Zero, shape_angle.y, 0, false);
|
|
current.angle.y = shape_angle.y;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/* 000023A4-000024FC .text throwNpcAction__10daNpc_Os_cFPv */
|
|
BOOL daNpc_Os_c::throwNpcAction(void* param_1) {
|
|
if(field_0x7A9 == 0) {
|
|
if(param_1) {
|
|
speedF = 8.0f;
|
|
speed.y = 0.0f;
|
|
current.angle.y = *(s16*)param_1;
|
|
}
|
|
else {
|
|
speedF = l_HIO.field_0x80;
|
|
speed.y = l_HIO.field_0x84;
|
|
current.angle.y = shape_angle.y;
|
|
}
|
|
|
|
maxFallSpeed = -100.0f;
|
|
gravity = l_HIO.field_0x8C;
|
|
field_0x7A9 += 1;
|
|
}
|
|
else if(field_0x7A9 != -1) {
|
|
if(mAcch.ChkGroundHit()) {
|
|
fopAcM_seStartCurrent(this, JA_SE_OBJ_OSTATUE_PUT, 0);
|
|
smokeSet(dPa_name::ID_SCENE_A33B);
|
|
setNpcAction(&daNpc_Os_c::waitNpcAction, 0);
|
|
}
|
|
|
|
setAttention(true);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/* 000024FC-000025F0 .text jumpNpcAction__10daNpc_Os_cFPv */
|
|
BOOL daNpc_Os_c::jumpNpcAction(void* param_1) {
|
|
if(field_0x7A9 == 0) {
|
|
setAnm(0);
|
|
|
|
if(param_1) {
|
|
speed.y = *(f32*)param_1;
|
|
}
|
|
|
|
speedF = 50.0f;
|
|
maxFallSpeed = -100.0f;
|
|
gravity = l_HIO.field_0x8C;
|
|
field_0x7A9 += 1;
|
|
}
|
|
else if(field_0x7A9 != -1) {
|
|
if(mAcch.ChkGroundHit()) {
|
|
smokeSet(dPa_name::ID_SCENE_A33B);
|
|
setNpcAction(&daNpc_Os_c::waitNpcAction, 0);
|
|
}
|
|
|
|
setAttention(true);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/* 000025F0-000026BC .text routeAngCheck__10daNpc_Os_cFR4cXyzPs */
|
|
void daNpc_Os_c::routeAngCheck(cXyz& param_1, s16* param_2) {
|
|
cXyz cross = field_0x7F0.outprod(param_1);
|
|
s16 angle = cM_atan2s(cross.x, cross.z);
|
|
if((field_0x7F0.y >= 1.0f && cLib_distanceAngleS(angle, *param_2) > 0x4000) || fopAcM_searchPlayerDistanceY(this) * cross.y < 0.0f) {
|
|
angle += 0x8000;
|
|
}
|
|
|
|
*param_2 = angle;
|
|
}
|
|
|
|
/* 000026BC-00002920 .text routeWallCheck__10daNpc_Os_cFR4cXyzR4cXyzPs */
|
|
void daNpc_Os_c::routeWallCheck(cXyz& param_1, cXyz& param_2, s16* param_3) {
|
|
dBgS_LinChk linChk;
|
|
linChk.Set(¶m_1, ¶m_2, 0);
|
|
if(dComIfG_Bgsp()->LineCross(&linChk)) {
|
|
cM3dGPla* plane = dComIfG_Bgsp()->GetTriPla(linChk.GetBgIndex(), linChk.GetPolyIndex());
|
|
if(plane) {
|
|
routeAngCheck(*plane->GetNP(), param_3);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 00002D10-00002FA4 .text checkForwardGroundY__10daNpc_Os_cFs */
|
|
f32 daNpc_Os_c::checkForwardGroundY(s16 param_1) {
|
|
s32 wallHit = wallHitCheck();
|
|
if(wallHit >= 0) {
|
|
cM3dGPla* plane = dComIfG_Bgsp()->GetTriPla(mAcchCir[wallHit].GetBgIndex(), mAcchCir[wallHit].GetPolyIndex());
|
|
if(plane) {
|
|
if(cLib_distanceAngleS(param_1, cM_atan2s(plane->GetNP()->x, plane->GetNP()->z)) > 0x4000) {
|
|
dBgS_GndChk gndChk;
|
|
|
|
gndChk.OffWall();
|
|
cXyz temp(current.pos.x + cM_ssin(param_1) * 80.0f, current.pos.y + 80.0f, current.pos.z + cM_scos(param_1) * 80.0f);
|
|
gndChk.SetPos(&temp);
|
|
|
|
return dComIfG_Bgsp()->GroundCross(&gndChk);
|
|
}
|
|
}
|
|
}
|
|
|
|
return -1.0e7f;
|
|
}
|
|
|
|
/* 0000313C-00003210 .text checkWallJump__10daNpc_Os_cFs */
|
|
f32 daNpc_Os_c::checkWallJump(s16 param_1) {
|
|
f32 delta = checkForwardGroundY(param_1) - current.pos.y;
|
|
if(0.0f < delta && delta < 80.0f) {
|
|
delta = std::sqrtf(delta) * 3.6f;
|
|
}
|
|
else {
|
|
delta = -1.0f;
|
|
}
|
|
|
|
return delta;
|
|
}
|
|
|
|
/* 00003210-0000375C .text routeCheck__10daNpc_Os_cFfPs */
|
|
BOOL daNpc_Os_c::routeCheck(f32 param_1, s16* param_2) {
|
|
if(!mAcch.ChkGroundHit()) {
|
|
current.pos = old.pos;
|
|
speedF = 0.0f;
|
|
field_0x7A8 = 1;
|
|
|
|
dBgS_GndChk gndChk;
|
|
gndChk.OffWall();
|
|
cXyz temp(current.pos.x + cM_ssin(*param_2) * 80.0f, current.pos.y + 80.0f, current.pos.z + cM_scos(*param_2) * 80.0f);
|
|
gndChk.SetPos(&temp);
|
|
|
|
if(dComIfG_Bgsp()->GroundCross(&gndChk) - current.pos.y > -100.0f) {
|
|
if(cLib_distanceAngleS(current.angle.y, *param_2) < 0x800) {
|
|
setNpcAction(&daNpc_Os_c::jumpNpcAction, 0);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
if(param_1 > 360000.0f) {
|
|
return false;
|
|
}
|
|
|
|
temp.y = current.pos.y - 80.0f;
|
|
routeWallCheck(temp, current.pos, param_2);
|
|
}
|
|
else {
|
|
if(mAcch.ChkWallHit()) {
|
|
f32 temp4 = checkWallJump(*param_2);
|
|
if(temp4 >= 0.0f) {
|
|
setNpcAction(&daNpc_Os_c::jumpNpcAction, &temp4);
|
|
return true;
|
|
}
|
|
|
|
if(param_1 > 360000.0f) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
cXyz temp2(current.pos.x, current.pos.y + 80.0f, current.pos.z);
|
|
cXyz temp3(current.pos.x + cM_ssin(*param_2) * 80.0f, current.pos.y + 80.0f, current.pos.z + cM_scos(*param_2) * 80.0f);
|
|
routeWallCheck(temp2, temp3, param_2);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/* 0000375C-000039EC .text searchNpcAction__10daNpc_Os_cFPv */
|
|
BOOL daNpc_Os_c::searchNpcAction(void*) {
|
|
if(field_0x7A9 == 0) {
|
|
cLib_onBit<u32>(attention_info.flags, fopAc_Attn_ACTION_CARRY_e);
|
|
setAnm(1);
|
|
|
|
field_0x7A9 += 1;
|
|
}
|
|
else if(field_0x7A9 != -1) {
|
|
field_0x7A4 = 1;
|
|
daPy_py_c* player = daPy_getPlayerActorClass();
|
|
|
|
BOOL door = player->eventInfo.checkCommandDoor();
|
|
f32 dist_sq = fopAcM_searchPlayerDistanceXZ2(this);
|
|
f32 temp;
|
|
if (dist_sq < SQUARE(l_HIO.field_0x60)) {
|
|
temp = 0.0f;
|
|
} else {
|
|
temp = l_HIO.field_0xA8;
|
|
}
|
|
s16 angle, adjustedAngle;
|
|
angle = adjustedAngle = fopAcM_searchPlayerAngleY(this);
|
|
BOOL temp3 = routeCheck(dist_sq, &adjustedAngle) && cLib_distanceAngleS(angle, adjustedAngle) <= 0x2000;
|
|
if(door || !temp3 || (dComIfGp_checkPlayerStatus0(0, daPyStts0_UNK2000000_e | daPyStts0_UNK100_e | daPyStts0_UNK1_e) || player->checkAttentionLock())) {
|
|
temp = 0.0f;
|
|
offNpcCallCommand();
|
|
}
|
|
else {
|
|
setRestart(getRestartNumber());
|
|
if(!door) {
|
|
if(cLib_calcTimer(&field_0x7A7) == 0) {
|
|
field_0x7A6 ^= 1;
|
|
field_0x7A7 = cLib_getRndValue(8, 20);
|
|
}
|
|
|
|
mpMorf->setPlaySpeed(2.0f);
|
|
}
|
|
else {
|
|
mpMorf->setPlaySpeed(4.0f);
|
|
}
|
|
}
|
|
|
|
walkProc(temp, adjustedAngle);
|
|
cLib_addCalcAngleS(&shape_angle.y, current.angle.y, l_HIO.mOs2.field_0x28, l_HIO.mOs2.field_0x24 * 2, l_HIO.mOs2.field_0x26 * 2);
|
|
s16 temp4 = shape_angle.y;
|
|
lookBack(1, 0, 0);
|
|
if(temp < 0.001f) {
|
|
setNpcAction(&daNpc_Os_c::waitNpcAction, 0);
|
|
}
|
|
else {
|
|
shape_angle.y = temp4;
|
|
}
|
|
|
|
setAttention(true);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/* 000039EC-00003C64 .text waitPlayerAction__10daNpc_Os_cFPv */
|
|
BOOL daNpc_Os_c::waitPlayerAction(void*) {
|
|
if(field_0x7A9 == 0) {
|
|
speedF = 0.0f;
|
|
setAnm(0);
|
|
initBrkAnm(8, true);
|
|
|
|
field_0x7A9 += 1;
|
|
}
|
|
else if(field_0x7A9 != -1) {
|
|
dAttention_c& attention = dComIfGp_getAttention();
|
|
if(g_mDoCPd_cpadInfo[0].mMainStickValue >= l_HIO.field_0x9C || attention.Lockon()) {
|
|
s16 target = getStickAngY();
|
|
cLib_addCalcAngleS(¤t.angle.y, target, 0x19, 0x7FFF, 1);
|
|
cXyz temp;
|
|
s32 stickPos = calcStickPos(target, &temp);
|
|
if(stickPos == 0) {
|
|
shape_angle.y = current.angle.y;
|
|
}
|
|
else if(g_mDoCPd_cpadInfo[0].mMainStickValue >= l_HIO.field_0xA0) {
|
|
shape_angle.y = current.angle.y;
|
|
}
|
|
|
|
s16 temp2 = shape_angle.y;
|
|
mJntCtrl.lookAtTarget(&temp2, &temp, current.pos, shape_angle.y, l_HIO.mNpc.mMaxTurnStep, false);
|
|
|
|
if(stickPos > 0) {
|
|
shape_angle.y = temp2;
|
|
}
|
|
|
|
current.angle.y = shape_angle.y;
|
|
if(g_mDoCPd_cpadInfo[0].mMainStickValue >= l_HIO.field_0xA0 && stickPos == 0) {
|
|
current.angle.y = target;
|
|
setPlayerAction(&daNpc_Os_c::walkPlayerAction, 0);
|
|
}
|
|
}
|
|
else {
|
|
mJntCtrl.lookAtTarget(&shape_angle.y, 0, cXyz::Zero, shape_angle.y, 0, false);
|
|
current.angle.y = shape_angle.y;
|
|
}
|
|
|
|
setAttention(mpMorf->isMorf());
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/* 00003C64-00003E98 .text walkPlayerAction__10daNpc_Os_cFPv */
|
|
BOOL daNpc_Os_c::walkPlayerAction(void*) {
|
|
if(field_0x7A9 == 0) {
|
|
speedF = 0.0f;
|
|
setAnm(1);
|
|
initBrkAnm(8, true);
|
|
|
|
field_0x7A9 += 1;
|
|
}
|
|
else if(field_0x7A9 != -1) {
|
|
f32 stickValue = g_mDoCPd_cpadInfo[0].mMainStickValue;
|
|
s16 target = getStickAngY();
|
|
if(stickValue > 0.05f) {
|
|
if(mPrevMorfFrame > l_HIO.field_0xB0 && mPrevMorfFrame < l_HIO.field_0xAC) {
|
|
speedF = l_HIO.mOs2.field_0x08 * stickValue * l_HIO.mOs2.field_0x20;
|
|
}
|
|
else {
|
|
speedF = 0.0f;
|
|
cLib_addCalcAngleS(¤t.angle.y, target, l_HIO.mOs2.field_0x28, l_HIO.mOs2.field_0x24, l_HIO.mOs2.field_0x26);
|
|
}
|
|
|
|
cXyz temp;
|
|
s32 stickPos = calcStickPos(target, &temp);
|
|
if(stickPos == 0) {
|
|
cLib_addCalcAngleS(&shape_angle.y, current.angle.y, l_HIO.mOs2.field_0x28, l_HIO.mOs2.field_0x24 * 2, l_HIO.mOs2.field_0x26 * 2);
|
|
}
|
|
|
|
s16 temp2 = shape_angle.y;
|
|
mJntCtrl.lookAtTarget(&temp2, &temp, current.pos, shape_angle.y, l_HIO.mNpc.mMaxTurnStep, false);
|
|
|
|
if(stickPos > 0) {
|
|
shape_angle.y = temp2;
|
|
}
|
|
|
|
if(stickPos != 0) {
|
|
setPlayerAction(&daNpc_Os_c::waitPlayerAction, 0);
|
|
}
|
|
}
|
|
else {
|
|
setPlayerAction(&daNpc_Os_c::waitPlayerAction, 0);
|
|
}
|
|
|
|
setAttention(true);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
typedef void(daNpc_Os_c::*eventInitFunc)(int);
|
|
static eventInitFunc event_init_tbl[] = {
|
|
&daNpc_Os_c::initialWaitEvent,
|
|
&daNpc_Os_c::initialWakeupEvent,
|
|
&daNpc_Os_c::initialMoveEvent,
|
|
&daNpc_Os_c::initialEndEvent,
|
|
&daNpc_Os_c::initialTurnEvent,
|
|
&daNpc_Os_c::initialFinishEvent,
|
|
&daNpc_Os_c::initialMsgSetEvent,
|
|
&daNpc_Os_c::initialDefault,
|
|
&daNpc_Os_c::initialSwitchOnEvent,
|
|
&daNpc_Os_c::initialNextEvent,
|
|
&daNpc_Os_c::initialSaveEvent,
|
|
&daNpc_Os_c::initialMoveEndEvent
|
|
};
|
|
|
|
typedef BOOL(daNpc_Os_c::*eventActionFunc)(int);
|
|
static eventActionFunc event_action_tbl[] = {
|
|
&daNpc_Os_c::actionWaitEvent,
|
|
&daNpc_Os_c::actionWakeupEvent,
|
|
&daNpc_Os_c::actionMoveEvent,
|
|
&daNpc_Os_c::actionDefault,
|
|
&daNpc_Os_c::actionTurnEvent,
|
|
&daNpc_Os_c::actionFinishEvent,
|
|
&daNpc_Os_c::actionMsgSetEvent,
|
|
&daNpc_Os_c::actionMsgEndEvent,
|
|
&daNpc_Os_c::actionDefault,
|
|
&daNpc_Os_c::actionDefault,
|
|
&daNpc_Os_c::actionDefault,
|
|
&daNpc_Os_c::actionDefault
|
|
};
|
|
|
|
static char* cut_name_tbl[] = {
|
|
"WAIT",
|
|
"WAKEUP",
|
|
"MOVE",
|
|
"END",
|
|
"TURN",
|
|
"FINISH",
|
|
"MSGSET",
|
|
"MSGEND",
|
|
"SW_ON",
|
|
"NEXT",
|
|
"SAVE",
|
|
"MOVEEND",
|
|
};
|
|
|
|
/* 00003E98-00004228 .text eventProc__10daNpc_Os_cFv */
|
|
BOOL daNpc_Os_c::eventProc() {
|
|
if(eventInfo.checkCommandDemoAccrpt() && field_0x7A5 != -1) {
|
|
if(field_0x7A5 == 0) {
|
|
if(dComIfGp_evmng_startCheck("OPTION_CHAR_END") || dComIfGp_evmng_endCheck("OPTION_CHAR_END")) {
|
|
dComIfGp_event_setTalkPartner(dComIfGp_getLinkPlayer());
|
|
mDoAud_seStart(JA_SE_CTRL_NPC_TO_LINK);
|
|
}
|
|
else {
|
|
offReturnLink();
|
|
field_0x7A5 = -1;
|
|
}
|
|
}
|
|
else if(field_0x7A5 != 2 && field_0x7A5 != 4 && field_0x7A5 != 6) {
|
|
if(field_0x7A5 == 0xA || field_0x7A5 == 0xB || field_0x7A5 == 0xC || field_0x7A5 == 0xD || field_0x7A5 == 0xE || field_0x7A5 == 0xF) {
|
|
setNpcAction(&daNpc_Os_c::waitNpcAction, 0);
|
|
offNpcCallCommand();
|
|
onNpcNotChange();
|
|
dComIfGp_setCb1Player(NULL);
|
|
setFinish();
|
|
}
|
|
else if(field_0x7A5 == 8) {
|
|
dComIfGs_onEventBit(dSv_event_flag_c::UNK_2608);
|
|
}
|
|
else if(field_0x7A5 == 9) {
|
|
dComIfGs_onEventBit(dSv_event_flag_c::UNK_2604);
|
|
}
|
|
}
|
|
|
|
if(field_0x7A5 != -1) {
|
|
onEventAccept();
|
|
field_0x7A5 = -1;
|
|
}
|
|
}
|
|
|
|
int staffIdx = getMyStaffId();
|
|
if(dComIfGp_event_runCheck() && !checkCommandTalk()) {
|
|
if(staffIdx != -1) {
|
|
int actIdx = dComIfGp_evmng_getMyActIdx(staffIdx, cut_name_tbl, ARRAY_SIZE(cut_name_tbl), TRUE, 0);
|
|
if(actIdx == -1) {
|
|
dComIfGp_evmng_cutEnd(staffIdx);
|
|
}
|
|
else {
|
|
if(dComIfGp_evmng_getIsAddvance(staffIdx)) {
|
|
(this->*event_init_tbl[actIdx])(staffIdx);
|
|
}
|
|
|
|
if((this->*event_action_tbl[actIdx])(staffIdx)) {
|
|
dComIfGp_evmng_cutEnd(staffIdx);
|
|
}
|
|
}
|
|
}
|
|
|
|
if(isEventAccept()) {
|
|
if(dComIfGp_evmng_endCheck(field_0x7C4[field_0x7AA])) {
|
|
dComIfGp_event_reset();
|
|
offEventAccept();
|
|
|
|
if(field_0x7AA == 0) {
|
|
returnLinkPlayer();
|
|
offReturnLink();
|
|
}
|
|
|
|
field_0x7AA = -1;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
if(daPy_getPlayerLinkActorClass()->eventInfo.checkCommandDoor() == false) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/* 00004228-0000422C .text initialDefault__10daNpc_Os_cFi */
|
|
void daNpc_Os_c::initialDefault(int) {
|
|
return;
|
|
}
|
|
|
|
/* 0000422C-00004234 .text actionDefault__10daNpc_Os_cFi */
|
|
BOOL daNpc_Os_c::actionDefault(int) {
|
|
return true;
|
|
}
|
|
|
|
/* 00004234-000043AC .text initialWaitEvent__10daNpc_Os_cFi */
|
|
void daNpc_Os_c::initialWaitEvent(int staffIdx) {
|
|
field_0x7C0 = -1;
|
|
|
|
Vec* posData = dComIfGp_evmng_getMyVec3dP(staffIdx, "pos");
|
|
if(posData) {
|
|
current.pos.set(posData->x, posData->y, posData->z);
|
|
}
|
|
|
|
int* angleData = dComIfGp_evmng_getMyIntegerP(staffIdx, "angle");
|
|
if(angleData) {
|
|
s16 angle = *angleData;
|
|
current.angle.y = angle;
|
|
shape_angle.y = angle;
|
|
}
|
|
|
|
int* gravData = dComIfGp_evmng_getMyIntegerP(staffIdx, "gravity");
|
|
if(gravData) {
|
|
onGravity();
|
|
maxFallSpeed = -100.0f;
|
|
gravity = l_HIO.field_0x8C;
|
|
}
|
|
|
|
int* quakeData = dComIfGp_evmng_getMyIntegerP(staffIdx, "quake");
|
|
if(quakeData) {
|
|
dComIfGp_getVibration().StartShock(*quakeData, -0x11, cXyz(0.0f, 1.0f, 0.0f));
|
|
}
|
|
|
|
int* timerData = dComIfGp_evmng_getMyIntegerP(staffIdx, "timer");
|
|
if(timerData) {
|
|
field_0x7C0 = *timerData;
|
|
}
|
|
}
|
|
|
|
/* 000043AC-000043F0 .text actionWaitEvent__10daNpc_Os_cFi */
|
|
BOOL daNpc_Os_c::actionWaitEvent(int) {
|
|
if(field_0x7C0 < 0) {
|
|
return true;
|
|
}
|
|
|
|
return cLib_calcTimer(&field_0x7C0) == 0 ? TRUE : FALSE;
|
|
}
|
|
|
|
/* 000043F0-00004470 .text initialWakeupEvent__10daNpc_Os_cFi */
|
|
void daNpc_Os_c::initialWakeupEvent(int) {
|
|
if(dComIfGp_getCb1Player() == this) {
|
|
setWakeup();
|
|
maxFallSpeed = -100.0f;
|
|
gravity = l_HIO.field_0x8C;
|
|
offNpcNotChange();
|
|
initBrkAnm(4, true);
|
|
field_0x7A1 = 0;
|
|
}
|
|
}
|
|
|
|
/* 00004470-000044B0 .text actionWakeupEvent__10daNpc_Os_cFi */
|
|
BOOL daNpc_Os_c::actionWakeupEvent(int) {
|
|
if(field_0x7A1) {
|
|
initBrkAnm(6, true);
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/* 000044B0-000044D4 .text initialMoveEvent__10daNpc_Os_cFi */
|
|
void daNpc_Os_c::initialMoveEvent(int) {
|
|
setAnm(1);
|
|
}
|
|
|
|
/* 000044D4-00004644 .text actionMoveEvent__10daNpc_Os_cFi */
|
|
BOOL daNpc_Os_c::actionMoveEvent(int staffIdx) {
|
|
f32 value = 1.0f;
|
|
f32* data = dComIfGp_evmng_getMyFloatP(staffIdx, "Stick");
|
|
if(data) {
|
|
value = *data;
|
|
}
|
|
|
|
if(mpPedestal) {
|
|
if(fopAcM_searchActorDistanceXZ(this, mpPedestal) < 10.0f) {
|
|
speedF = 0.0f;
|
|
current.pos.x = mpPedestal->current.pos.x;
|
|
current.pos.z = mpPedestal->current.pos.z;
|
|
setAnm(0);
|
|
}
|
|
else {
|
|
walkProc(value, fopAcM_searchActorAngleY(this, mpPedestal));
|
|
mpMorf->setPlaySpeed(value * 2.0f);
|
|
cLib_addCalcAngleS(&shape_angle.y, current.angle.y, l_HIO.mOs2.field_0x28, l_HIO.mOs2.field_0x24 * 2, l_HIO.mOs2.field_0x26 * 2);
|
|
mJntCtrl.lookAtTarget(&shape_angle.y, 0, cXyz::Zero, shape_angle.y, 0, false);
|
|
}
|
|
|
|
setAttention(true);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/* 00004644-000046E4 .text initialMoveEndEvent__10daNpc_Os_cFi */
|
|
void daNpc_Os_c::initialMoveEndEvent(int staffIdx) {
|
|
int* data = dComIfGp_evmng_getMyIntegerP(staffIdx, "Daiza");
|
|
if(data && mpPedestal) {
|
|
current.pos.x = mpPedestal->current.pos.x;
|
|
current.pos.y = mpPedestal->current.pos.y + 240.0f;
|
|
current.pos.z = mpPedestal->current.pos.z;
|
|
}
|
|
|
|
speedF = 0.0f;
|
|
|
|
setAnm(0);
|
|
}
|
|
|
|
/* 000046E4-00004748 .text initialEndEvent__10daNpc_Os_cFi */
|
|
void daNpc_Os_c::initialEndEvent(int) {
|
|
setFinish();
|
|
|
|
u32 temp = 0;
|
|
setNpcAction(&daNpc_Os_c::finish02NpcAction, &temp);
|
|
}
|
|
|
|
/* 00004748-0000474C .text initialTurnEvent__10daNpc_Os_cFi */
|
|
void daNpc_Os_c::initialTurnEvent(int) {
|
|
return;
|
|
}
|
|
|
|
/* 0000474C-000047D4 .text actionTurnEvent__10daNpc_Os_cFi */
|
|
BOOL daNpc_Os_c::actionTurnEvent(int staffIdx) {
|
|
int* data = dComIfGp_evmng_getMyIntegerP(staffIdx, "Angle");
|
|
if(data) {
|
|
s16 temp = cLib_addCalcAngleS(&shape_angle.y, *data, 0x1E, 0x2000, 0x800);
|
|
current.angle.y = shape_angle.y;
|
|
|
|
if(temp == 0) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/* 000047D4-00004860 .text initialFinishEvent__10daNpc_Os_cFi */
|
|
void daNpc_Os_c::initialFinishEvent(int staffIdx) {
|
|
int* data = dComIfGp_evmng_getMyIntegerP(staffIdx, "Type");
|
|
|
|
u32 value = 0;
|
|
if(data) {
|
|
value = *data;
|
|
}
|
|
|
|
setAnm_brkAnm(value);
|
|
if(field_0x78C == 2 || field_0x78C == 4) {
|
|
makeBeam(1);
|
|
}
|
|
else {
|
|
endBeam();
|
|
}
|
|
}
|
|
|
|
/* 00004860-00004874 .text actionFinishEvent__10daNpc_Os_cFi */
|
|
BOOL daNpc_Os_c::actionFinishEvent(int) {
|
|
return field_0x7A1 ? TRUE : FALSE;
|
|
}
|
|
|
|
/* 00004874-000048D8 .text initialMsgSetEvent__10daNpc_Os_cFi */
|
|
void daNpc_Os_c::initialMsgSetEvent(int staffIdx) {
|
|
l_msgId = -1;
|
|
|
|
int* data = dComIfGp_evmng_getMyIntegerP(staffIdx, "MsgNo");
|
|
if(data) {
|
|
field_0x780 = *data;
|
|
}
|
|
}
|
|
|
|
/* 000048D8-000048F8 .text actionMsgSetEvent__10daNpc_Os_cFi */
|
|
BOOL daNpc_Os_c::actionMsgSetEvent(int) {
|
|
return talk_init();
|
|
}
|
|
|
|
/* 000048F8-00004918 .text actionMsgEndEvent__10daNpc_Os_cFi */
|
|
BOOL daNpc_Os_c::actionMsgEndEvent(int) {
|
|
return talk();
|
|
}
|
|
|
|
/* 00004918-00004988 .text initialSwitchOnEvent__10daNpc_Os_cFi */
|
|
void daNpc_Os_c::initialSwitchOnEvent(int) {
|
|
s8 roomNo = fopAcM_GetRoomNo(this);
|
|
if(roomNo == 7 && !dComIfGs_isSwitch(field_0x794, roomNo)) {
|
|
dComIfGs_onSwitch(field_0x794, roomNo);
|
|
}
|
|
}
|
|
|
|
/* 00004988-00004A60 .text initialNextEvent__10daNpc_Os_cFi */
|
|
void daNpc_Os_c::initialNextEvent(int staffIdx) {
|
|
int* data = dComIfGp_evmng_getMyIntegerP(staffIdx, "SE");
|
|
|
|
if(data) {
|
|
u32 value = *data;
|
|
fopAcM_seStartCurrent(this, JA_SE_OBJ_OSTATUE_PUT, 0);
|
|
}
|
|
|
|
if(argument == 0) {
|
|
field_0x7A5 = 2;
|
|
}
|
|
else if(argument == 1) {
|
|
field_0x7A5 = 4;
|
|
}
|
|
else if(argument == 2) {
|
|
field_0x7A5 = 6;
|
|
}
|
|
}
|
|
|
|
/* 00004A60-00004AF8 .text initialSaveEvent__10daNpc_Os_cFi */
|
|
void daNpc_Os_c::initialSaveEvent(int) {
|
|
home.pos = current.pos;
|
|
dComIfGs_setRestartOption(¤t.pos, home.angle.y, fopAcM_GetRoomNo(this), getRestartNumber());
|
|
}
|
|
|
|
/* 00004AF8-00004B64 .text talk_init__10daNpc_Os_cFv */
|
|
BOOL daNpc_Os_c::talk_init() {
|
|
if(l_msgId == -1) {
|
|
l_msgId = fopMsgM_messageSet(field_0x780, this);
|
|
}
|
|
else {
|
|
l_msg = fopMsgM_SearchByID(l_msgId);
|
|
if(l_msg) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/* 00004B64-00004C04 .text talk__10daNpc_Os_cFv */
|
|
BOOL daNpc_Os_c::talk() {
|
|
if(l_msg->mStatus == fopMsgStts_MSG_DISPLAYED_e) {
|
|
l_msg->mStatus = next_msgStatus(&field_0x780);
|
|
|
|
if(l_msg->mStatus == fopMsgStts_MSG_CONTINUES_e) {
|
|
fopMsgM_messageSet(field_0x780);
|
|
}
|
|
}
|
|
else if(l_msg->mStatus != fopMsgStts_INPUT_e && l_msg->mStatus != fopMsgStts_MSG_TYPING_e && l_msg->mStatus == fopMsgStts_BOX_CLOSED_e) {
|
|
l_msg->mStatus = fopMsgStts_MSG_DESTROYED_e;
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/* 00004C04-00004D20 .text setAnm__10daNpc_Os_cFi */
|
|
void daNpc_Os_c::setAnm(int param_1) {
|
|
struct anmPrm_c {
|
|
/* 0x00 */ s8 mAnmTblIdx;
|
|
/* 0x04 */ int mLoopMode;
|
|
/* 0x08 */ f32 mMorf;
|
|
/* 0x0C */ f32 mPlaySpeed;
|
|
/* 0x10 */ int m10;
|
|
};
|
|
|
|
static s8 l_anmTbl[] = {
|
|
OS_BCK_OS_MOVE01,
|
|
OS_BCK_OS_MOVE01,
|
|
OS_BCK_OS_AWAKE,
|
|
};
|
|
|
|
static anmPrm_c l_anmPrm[] = {
|
|
{
|
|
/* mAnmTblIdx */ 0,
|
|
/* mLoopMode */ J3DFrameCtrl::EMode_LOOP,
|
|
/* mMorf */ 8.0f,
|
|
/* mPlaySpeed */ 0.0f,
|
|
/* m10 */ 0,
|
|
},
|
|
{
|
|
/* mAnmTblIdx */ 1,
|
|
/* mLoopMode */ J3DFrameCtrl::EMode_LOOP,
|
|
/* mMorf */ 8.0f,
|
|
/* mPlaySpeed */ 2.0f,
|
|
/* m10 */ 0,
|
|
},
|
|
{
|
|
/* mAnmTblIdx */ 2,
|
|
/* mLoopMode */ J3DFrameCtrl::EMode_NONE,
|
|
/* mMorf */ 0.0f,
|
|
/* mPlaySpeed */ 1.0f,
|
|
/* m10 */ 0,
|
|
},
|
|
{
|
|
/* mAnmTblIdx */ 2,
|
|
/* mLoopMode */ J3DFrameCtrl::EMode_NONE,
|
|
/* mMorf */ 0.0f,
|
|
/* mPlaySpeed */ -1.0f,
|
|
/* m10 */ 0,
|
|
},
|
|
{
|
|
/* mAnmTblIdx */ 2,
|
|
/* mLoopMode */ J3DFrameCtrl::EMode_NONE,
|
|
/* mMorf */ 0.0f,
|
|
/* mPlaySpeed */ 0.0f,
|
|
/* m10 */ -1,
|
|
}
|
|
};
|
|
|
|
field_0x78C = param_1;
|
|
anmPrm_c& prm = l_anmPrm[param_1];
|
|
f32 playSpeed = prm.mPlaySpeed;
|
|
if(prm.mAnmTblIdx != field_0x7A0 || prm.mPlaySpeed != mpMorf->getPlaySpeed()) {
|
|
field_0x7A0 = prm.mAnmTblIdx;
|
|
s8* temp2 = &l_anmTbl[field_0x7A0]; // fakematch
|
|
mPrevMorfFrame = 0.0f;
|
|
mReachedAnimEnd = false;
|
|
dNpc_Os_setAnm(mpMorf, prm.mLoopMode, prm.mMorf, playSpeed, *temp2, "Os");
|
|
|
|
if(prm.m10 < 0) {
|
|
mpMorf->setFrame(mpMorf->getEndFrame());
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 00004D20-00004DD4 .text dNpc_Os_setAnm__10daNpc_Os_cFP14mDoExt_McaMorfiffiPCc */
|
|
BOOL daNpc_Os_c::dNpc_Os_setAnm(mDoExt_McaMorf* pMorf, int loopMode, f32 morf, f32 playSpeed, int idx, const char* arcName) {
|
|
BOOL ret = false;
|
|
|
|
if(pMorf) {
|
|
J3DAnmTransform* pAnimRes = (J3DAnmTransform*)dComIfG_getObjectRes(arcName, idx);
|
|
pMorf->setAnm(pAnimRes, loopMode, morf, playSpeed, 0.0f, -1.0f, NULL);
|
|
ret = true;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
/* 00004DD4-00004F48 .text initBrkAnm__10daNpc_Os_cFUcb */
|
|
BOOL daNpc_Os_c::initBrkAnm(u8 param_1, bool param_2) {
|
|
struct AnmTableEntry {
|
|
/* 0x00 */ u8 brkFileIndex;
|
|
/* 0x04 */ int loopMode;
|
|
/* 0x08 */ f32 speed;
|
|
/* 0x0C */ s32 unk_4;
|
|
}; // Size: 0x10
|
|
|
|
static AnmTableEntry brkAnmTbl[] = {
|
|
{OS_BRK_TURN_OFF, J3DFrameCtrl::EMode_NONE, 1.0f, 0},
|
|
{OS_BRK_TURN_OFF, J3DFrameCtrl::EMode_NONE, 1.0f, -1},
|
|
{OS_BRK_OS_AWAKE, J3DFrameCtrl::EMode_NONE, 1.0f, 0},
|
|
{OS_BRK_OS_AWAKE, J3DFrameCtrl::EMode_NONE, -1.0f, 0},
|
|
{OS_BRK_TURN_ON, J3DFrameCtrl::EMode_NONE, 1.0f, 0},
|
|
{OS_BRK_TURN_ON, J3DFrameCtrl::EMode_NONE, 0.0f, 0},
|
|
{OS_BRK_TENMETU, J3DFrameCtrl::EMode_LOOP, 1.0f, 0},
|
|
{OS_BRK_OS_AWAKE, J3DFrameCtrl::EMode_NONE, 0.0f, -1},
|
|
{OS_BRK_LINK, J3DFrameCtrl::EMode_LOOP, 1.0f, 0},
|
|
};
|
|
|
|
J3DModelData* modelData = mpMorf->getModel()->getModelData();
|
|
|
|
bool ret = false;
|
|
if(field_0x7A2 != param_1) {
|
|
J3DAnmTevRegKey* a_brk = static_cast<J3DAnmTevRegKey*>(dComIfG_getObjectRes("Os", brkAnmTbl[param_1].brkFileIndex));
|
|
JUT_ASSERT(0xBB9, a_brk != NULL);
|
|
|
|
if(mBrkAnm.init(modelData, a_brk, TRUE, brkAnmTbl[param_1].loopMode, brkAnmTbl[param_1].speed, 0, -1, param_2, 0)) {
|
|
field_0x7A2 = param_1;
|
|
if(brkAnmTbl[param_1].unk_4 < 0) {
|
|
mBrkAnm.setFrame(mBrkAnm.getEndFrame());
|
|
}
|
|
|
|
field_0x764 = mBrkAnm.getFrame();
|
|
|
|
ret = true;
|
|
}
|
|
}
|
|
else {
|
|
ret = true;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
/* 00004F48-00005048 .text playBrkAnm__10daNpc_Os_cFv */
|
|
void daNpc_Os_c::playBrkAnm() {
|
|
field_0x7A1 = mBrkAnm.play();
|
|
|
|
if(mBrkAnm.getPlaySpeed() < 0.0f) {
|
|
if(mBrkAnm.getFrame() > field_0x764) {
|
|
field_0x7A1 = 1;
|
|
}
|
|
}
|
|
else if(mBrkAnm.getFrame() < field_0x764) {
|
|
field_0x7A1 = 1;
|
|
}
|
|
|
|
field_0x764 = mBrkAnm.getFrame();
|
|
if(field_0x7A2 == 6 && field_0x764 > 5.0f && field_0x764 < 50.0f) {
|
|
fopAcM_seStartCurrent(this, JA_SE_OBJ_OSTATUE_BLINK, 0);
|
|
}
|
|
}
|
|
|
|
/* 00005048-000050B0 .text setAnm_brkAnm__10daNpc_Os_cFi */
|
|
void daNpc_Os_c::setAnm_brkAnm(int param_1) {
|
|
struct BrkTableEntry {
|
|
u8 unk_1;
|
|
u8 unk_2;
|
|
};
|
|
|
|
static BrkTableEntry anmBrkTbl[] = {
|
|
{0x00, 0x00},
|
|
{0x00, 0x01},
|
|
{0x02, 0x02},
|
|
{0x03, 0x03},
|
|
{0x00, 0x04},
|
|
{0x00, 0x05},
|
|
{0x00, 0x06},
|
|
{0x04, 0x07},
|
|
};
|
|
|
|
setAnm(anmBrkTbl[param_1].unk_1);
|
|
initBrkAnm(anmBrkTbl[param_1].unk_2, true);
|
|
field_0x7A1 = 0;
|
|
}
|
|
|
|
/* 000050B0-00005204 .text chkAttention__10daNpc_Os_cF4cXyzs */
|
|
BOOL daNpc_Os_c::chkAttention(cXyz param_1, s16 param_2) {
|
|
fopAc_ac_c* player = dComIfGp_getPlayer(0);
|
|
f32 maxDist = l_HIO.mNpc.mMaxAttnDistXZ;
|
|
s32 maxAngle = l_HIO.mNpc.mMaxAttnAngleY;
|
|
|
|
cXyz delta;
|
|
delta.x = player->current.pos.x - param_1.x;
|
|
delta.z = player->current.pos.z - param_1.z;
|
|
f32 dist = std::sqrtf(delta.x*delta.x + delta.z*delta.z);
|
|
|
|
s16 angle = cM_atan2s(delta.x, delta.z);
|
|
if(field_0x7A4) {
|
|
maxDist += 40.0f;
|
|
maxAngle += 0x71C;
|
|
}
|
|
|
|
angle -= param_2;
|
|
BOOL ret = false;
|
|
if(maxAngle > abs(angle) && maxDist > dist) {
|
|
ret = true;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
/* 00005204-000052D4 .text chkArea__10daNpc_Os_cFP4cXyz */
|
|
bool daNpc_Os_c::chkArea(cXyz* param_1) {
|
|
fopAc_ac_c* player = dComIfGp_getPlayer(0);
|
|
f32 maxDist = l_HIO.mNpc.mMaxAttnDistXZ;
|
|
|
|
cXyz delta;
|
|
delta.x = player->current.pos.x - param_1->x;
|
|
delta.z = player->current.pos.z - param_1->z;
|
|
f32 dist = std::sqrtf(delta.x*delta.x + delta.z*delta.z);
|
|
|
|
maxDist += 40.0f;
|
|
return maxDist > dist;
|
|
}
|
|
|
|
/* 000052D4-00005328 .text carryCheck__10daNpc_Os_cFv */
|
|
void daNpc_Os_c::carryCheck() {
|
|
if(fopAcM_checkCarryNow(this)) {
|
|
setNpcAction(&daNpc_Os_c::carryNpcAction, 0);
|
|
}
|
|
}
|
|
|
|
/* 00005328-000053C8 .text eventOrder__10daNpc_Os_cFv */
|
|
void daNpc_Os_c::eventOrder() {
|
|
if(!isEventAccept()) {
|
|
if(field_0x7A5 == 0x12 || field_0x7A5 == 0x11) {
|
|
eventInfo.onCondition(dEvtCnd_CANTALK_e);
|
|
|
|
if(field_0x7A5 == 0x12) {
|
|
fopAcM_orderSpeakEvent(this);
|
|
}
|
|
}
|
|
else if(field_0x7A5 != -1 && field_0x7A5 < 0x10) {
|
|
field_0x7AA = field_0x7A5;
|
|
fopAcM_orderOtherEventId(this, field_0x7C4[field_0x7AA]);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 000053C8-00005454 .text checkOrder__10daNpc_Os_cFv */
|
|
void daNpc_Os_c::checkOrder() {
|
|
if(eventInfo.checkCommandTalk() && (field_0x7A5 == 0x12 || field_0x7A5 == 0x11)) {
|
|
field_0x7A5 = 0xFF;
|
|
setNpcAction(&daNpc_Os_c::talkNpcAction, 0);
|
|
fopAcM_cancelCarryNow(this);
|
|
}
|
|
}
|
|
|
|
/* 00005454-00005468 .text checkCommandTalk__10daNpc_Os_cFv */
|
|
BOOL daNpc_Os_c::checkCommandTalk() {
|
|
return eventInfo.checkCommandTalk() ? TRUE : FALSE;
|
|
}
|
|
|
|
/* 00005468-000054BC .text next_msgStatus__10daNpc_Os_cFPUl */
|
|
u16 daNpc_Os_c::next_msgStatus(u32* pMsgNo) {
|
|
u16 status = fopMsgStts_MSG_CONTINUES_e;
|
|
|
|
if(*pMsgNo == 0) {
|
|
status = fopMsgStts_MSG_ENDS_e;
|
|
}
|
|
else if(*pMsgNo == 0xEF4) {
|
|
dComIfGs_onEventBit(dSv_event_flag_c::UNK_2510);
|
|
status = fopMsgStts_MSG_ENDS_e;
|
|
}
|
|
|
|
return status;
|
|
}
|
|
|
|
/* 000054BC-000054C4 .text getMsg__10daNpc_Os_cFv */
|
|
u32 daNpc_Os_c::getMsg() {
|
|
return 0;
|
|
}
|
|
|
|
/* 000054C4-0000557C .text setCollision__10daNpc_Os_cFv */
|
|
void daNpc_Os_c::setCollision() {
|
|
cXyz dummy(0.0f, 0.0f, 0.0f);
|
|
cXyz temp = current.pos;
|
|
mCyl.SetC(temp);
|
|
mCyl.SetR(30.0f);
|
|
mCyl.SetH(field_0x788);
|
|
|
|
if(dComIfGp_getPlayer(0) == this) {
|
|
mStts.SetWeight(0xFE);
|
|
}
|
|
else {
|
|
mStts.SetWeight(0xFF);
|
|
}
|
|
|
|
dComIfG_Ccsp()->Set(&mCyl);
|
|
}
|
|
|
|
/* 0000557C-000055D4 .text setAttention__10daNpc_Os_cFb */
|
|
void daNpc_Os_c::setAttention(bool param_1) {
|
|
if(!param_1 && field_0x7A3 >= 2) {
|
|
return;
|
|
}
|
|
|
|
eyePos.set(field_0x748.x, field_0x748.y, field_0x748.z);
|
|
attention_info.position.set(current.pos.x, current.pos.y + l_HIO.mNpc.mAttnYOffset, current.pos.z);
|
|
}
|
|
|
|
/* 000055D4-000056F4 .text lookBack__10daNpc_Os_cFiii */
|
|
void daNpc_Os_c::lookBack(int param_1, int param_2, int param_3) {
|
|
cXyz* dstPos = NULL;
|
|
cXyz temp2;
|
|
cXyz temp(0.0f, 0.0f, 0.0f);
|
|
s16 targetY = shape_angle.y;
|
|
|
|
if(mJntCtrl.trnChk()) {
|
|
cLib_addCalcAngleS2(&field_0x798, l_HIO.mNpc.mMaxHeadTurnVel, 4, 0x800);
|
|
}
|
|
else {
|
|
field_0x798 = 0;
|
|
}
|
|
|
|
if(param_1) {
|
|
temp2 = dNpc_playerEyePos(l_HIO.mNpc.m04);
|
|
dstPos = &temp2;
|
|
temp = current.pos;
|
|
temp.y = eyePos.y;
|
|
}
|
|
|
|
mJntCtrl.lookAtTarget(&shape_angle.y, dstPos, temp, targetY, field_0x798, param_3);
|
|
}
|
|
|
|
/* 000056F4-00005824 .text setBaseMtx__10daNpc_Os_cFv */
|
|
void daNpc_Os_c::setBaseMtx() {
|
|
J3DModel* pModel = mpMorf->getModel();
|
|
if(fopAcM_checkCarryNow(this)) {
|
|
mDoMtx_stack_c::transS(current.pos);
|
|
mDoMtx_stack_c::YrotM(shape_angle.y);
|
|
mDoMtx_stack_c::transM(field_0x7E4);
|
|
mDoMtx_stack_c::XrotM(shape_angle.x);
|
|
mDoMtx_stack_c::ZrotM(shape_angle.z);
|
|
}
|
|
else {
|
|
mDoMtx_stack_c::transS(current.pos.x, current.pos.y + 95.0f, current.pos.z);
|
|
mDoMtx_stack_c::YrotM(shape_angle.y);
|
|
mDoMtx_stack_c::transM(field_0x7E4);
|
|
mDoMtx_stack_c::XrotM(shape_angle.x);
|
|
mDoMtx_stack_c::ZrotM(shape_angle.z);
|
|
mDoMtx_stack_c::transM(0.0f, -95.0f, 0.0f);
|
|
}
|
|
|
|
pModel->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
mpMorf->calc();
|
|
}
|
|
|
|
static const char* event_name_tbl[] = {
|
|
"OPTION_CHAR_END",
|
|
"Os_Wakeup",
|
|
"Os_Finish",
|
|
"Os1_Wakeup",
|
|
"Os1_Finish",
|
|
"Os2_Wakeup",
|
|
"Os2_Finish",
|
|
"Os_Message",
|
|
"Os1_Message",
|
|
"Os2_Message",
|
|
"Os_Finit0",
|
|
"Os_Finit1",
|
|
"Os1_Finit0",
|
|
"Os1_Finit1",
|
|
"Os2_Finit0",
|
|
"Os2_Finit1"
|
|
};
|
|
|
|
/* 00005824-00005B58 .text init__10daNpc_Os_cFv */
|
|
BOOL daNpc_Os_c::init() {
|
|
cXyz dummy(0.0f, 0.0f, 0.0f);
|
|
|
|
field_0x794 = fopAcM_GetParam(this) >> 0x10 & 0xFF;
|
|
attention_info.distances[fopAc_Attn_TYPE_CARRY_e] = 0x27;
|
|
// Fakematch, the next two lines get optimized out, but they affect the regalloc when copying the tevstr.
|
|
speedF = speedF;
|
|
speedF = speedF;
|
|
m_smoke_tevstr = tevStr;
|
|
m_smoke.setTevStr(&m_smoke_tevstr);
|
|
m_playerRoom[argument] = false;
|
|
clearStatus();
|
|
gravity = l_HIO.field_0x8C;
|
|
field_0x7A0 = 3;
|
|
field_0x78C = 5;
|
|
if(wakeupCheck()) {
|
|
onGravity();
|
|
}
|
|
else {
|
|
offGravity();
|
|
}
|
|
|
|
if(finishCheck()) {
|
|
setNpcAction(&daNpc_Os_c::finish02NpcAction, 0);
|
|
}
|
|
else {
|
|
setAnm(0);
|
|
setNpcAction(&daNpc_Os_c::waitNpcAction, 0);
|
|
}
|
|
|
|
field_0x754 = current.pos;
|
|
field_0x748 = current.pos;
|
|
|
|
field_0x7AA = -1;
|
|
field_0x7A5 = -1;
|
|
field_0x788 = 120.0f;
|
|
mpPedestal = NULL;
|
|
mStts.Init(0xFF, 0xFF, this);
|
|
mCyl.Set(l_cyl_src);
|
|
mCyl.SetStts(&mStts);
|
|
for(int i = 0; i < 0x10; i++) {
|
|
field_0x7C4[i] = dComIfGp_evmng_getEventIdx(event_name_tbl[i]);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/* 00005B58-00005CC8 .text draw__10daNpc_Os_cFv */
|
|
BOOL daNpc_Os_c::draw() {
|
|
if(fopAcM_GetHomeRoomNo(this) < 0) {
|
|
return true;
|
|
}
|
|
else if(finishCheck() && mpPedestal == NULL) {
|
|
return true;
|
|
}
|
|
else if(!dComIfGp_roomControl_checkStatusFlag(fopAcM_GetRoomNo(this), 0x10)) {
|
|
return true;
|
|
}
|
|
|
|
J3DModel* pModel = mpMorf->getModel();
|
|
J3DModelData* pModelData = pModel->getModelData();
|
|
|
|
g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr);
|
|
g_env_light.setLightTevColorType(pModel, &tevStr);
|
|
|
|
mBrkAnm.entry(pModelData);
|
|
mpMorf->entryDL();
|
|
mBrkAnm.remove(pModelData);
|
|
|
|
if(!fopAcM_checkCarryNow(this) && field_0x784 & 0x10) {
|
|
cXyz shadowPos(current.pos.x, current.pos.y + 150.0f, current.pos.z);
|
|
|
|
mShadowId = dComIfGd_setShadow(
|
|
mShadowId, 0, pModel, &shadowPos, 800.0f, 20.0f,
|
|
current.pos.y, mAcch.GetGroundH(), mAcch.m_gnd, &tevStr
|
|
);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/* 00005CC8-00005DF4 .text animationPlay__10daNpc_Os_cFv */
|
|
void daNpc_Os_c::animationPlay() {
|
|
u32 mtrlSndId = 0;
|
|
if (field_0x784 & 0x10 && mAcch.ChkGroundHit() && dComIfG_Bgsp()->ChkPolySafe(mAcch.m_gnd)) {
|
|
mtrlSndId = dComIfG_Bgsp()->GetMtrlSndId(mAcch.m_gnd);
|
|
}
|
|
|
|
mReachedAnimEnd = mpMorf->play(&eyePos, mtrlSndId, dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
|
|
|
|
f32 frame = mpMorf->getFrame();
|
|
if (mpMorf->getPlaySpeed() < 0.0f) {
|
|
if (frame > mPrevMorfFrame) {
|
|
mReachedAnimEnd = true;
|
|
}
|
|
} else if (frame < mPrevMorfFrame) {
|
|
mReachedAnimEnd = true;
|
|
}
|
|
|
|
mPrevMorfFrame = frame;
|
|
|
|
if(field_0x78C == 1 && mpMorf->checkFrame(17.0f)) {
|
|
smokeSet(dPa_name::ID_SCENE_A328);
|
|
}
|
|
|
|
playBrkAnm();
|
|
}
|
|
|
|
/* 00005DF4-00005E5C .text smokeSet__10daNpc_Os_cFUs */
|
|
void daNpc_Os_c::smokeSet(u16 particle) {
|
|
dComIfGp_particle_set(particle, ¤t.pos, 0, 0, -1, &m_smoke);
|
|
}
|
|
|
|
/* 00005E5C-00006AF8 .text execute__10daNpc_Os_cFv */
|
|
BOOL daNpc_Os_c::execute() {
|
|
static JGeometry::TVec3<f32> splash_scale(0.6f, 0.6f, 0.6f);
|
|
static JGeometry::TVec3<f32> ripple_scale(1.0f, 1.0f, 1.0f);
|
|
|
|
field_0x784 &= ~0x10;
|
|
fopAcM_OffStatus(this, fopAcStts_SHOWMAP_e);
|
|
checkPlayerRoom();
|
|
if(!finishCheck()) {
|
|
if(!check_initialRoom()) {
|
|
if(dComIfGp_getCb1Player() == this) {
|
|
dComIfGp_setCb1Player(NULL);
|
|
}
|
|
|
|
endBeam();
|
|
return true;
|
|
}
|
|
|
|
initialRestartOption(getRestartNumber(), TRUE);
|
|
|
|
if(wakeupCheck()) {
|
|
offNpcNotChange();
|
|
}
|
|
else {
|
|
onNpcNotChange();
|
|
}
|
|
}
|
|
|
|
fopAcM_setStageLayer(this);
|
|
|
|
if(chkNpcAction(&daNpc_Os_c::carryNpcAction)) {
|
|
mAcchCir[0].SetWallR(15.0f);
|
|
mAcchCir[1].SetWallR(15.0f);
|
|
}
|
|
else {
|
|
mAcchCir[0].SetWallR(40.0f);
|
|
mAcchCir[1].SetWallR(40.0f);
|
|
}
|
|
|
|
mpPedestal = (daPedestal::daPds_c*)searchFromName(l_daiza_name[argument], 0xFF, 1);
|
|
if(mpPedestal) {
|
|
if(!isFinish()) {
|
|
if(finishCheck()) {
|
|
home.pos.x = mpPedestal->current.pos.x;
|
|
home.pos.y = mpPedestal->current.pos.y + 240.0f;
|
|
home.pos.z = mpPedestal->current.pos.z;
|
|
}
|
|
}
|
|
else if(!isSetHomePos()) {
|
|
home.pos.x = mpPedestal->current.pos.x;
|
|
home.pos.y = mpPedestal->current.pos.y + 240.0f;
|
|
home.pos.z = mpPedestal->current.pos.z;
|
|
|
|
s32 pedestalHomeRoom = fopAcM_GetHomeRoomNo(mpPedestal);
|
|
if(pedestalHomeRoom != fopAcM_GetHomeRoomNo(this)) {
|
|
fopAcM_SetHomeRoomNo(this, pedestalHomeRoom);
|
|
}
|
|
if(pedestalHomeRoom != fopAcM_GetRoomNo(this)) {
|
|
fopAcM_SetRoomNo(this, pedestalHomeRoom);
|
|
}
|
|
|
|
mAcch.CrrPos(*dComIfG_Bgsp());
|
|
|
|
field_0x784 |= 0x10;
|
|
if(mAcch.GetGroundH() != -G_CM3D_F_INF) {
|
|
tevStr.mRoomNo = dComIfG_Bgsp()->GetRoomId(mAcch.m_gnd);
|
|
tevStr.mEnvrIdxOverride = dComIfG_Bgsp()->GetPolyColor(mAcch.m_gnd);
|
|
|
|
onSetHomePos();
|
|
}
|
|
}
|
|
}
|
|
|
|
if(finishCheck()) {
|
|
if(isFinish()) {
|
|
current.pos = home.pos;
|
|
}
|
|
|
|
s32 roomNo = fopAcM_GetRoomNo(this);
|
|
BOOL flag = dComIfGp_roomControl_checkStatusFlag(roomNo, 0x10);
|
|
if(roomNo < 0 || !flag || mpPedestal == NULL) {
|
|
endBeam();
|
|
|
|
return true;
|
|
}
|
|
}
|
|
else {
|
|
if(check_moveStop()) {
|
|
setNpcAction(&daNpc_Os_c::waitNpcAction, 0);
|
|
field_0x7A3 = 0;
|
|
endBeam();
|
|
|
|
return true;
|
|
}
|
|
|
|
if(field_0x7A8 && dComIfG_Bgsp()->ChkPolySafe(field_0x7FC) && dComIfG_Bgsp()->ChkMoveBG(field_0x7FC)) {
|
|
cXyz dummy = old.pos;
|
|
|
|
dComIfG_Bgsp()->MoveBgCrrPos(field_0x7FC, true, &old.pos, 0, 0);
|
|
}
|
|
}
|
|
|
|
fopAcM_SetStatusMap(this, 0xE);
|
|
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(!isFinish()) {
|
|
if(!fopAcM_checkCarryNow(this) && isGravity() && checkNowPosMove(l_staff_name[argument])) {
|
|
if (maxFallSpeed < speed.y) {
|
|
speed.y -= gravity;
|
|
if (speed.y < maxFallSpeed) {
|
|
speed.y = maxFallSpeed;
|
|
}
|
|
} else if (maxFallSpeed > speed.y) {
|
|
speed.y += gravity;
|
|
if (speed.y > maxFallSpeed) {
|
|
speed.y = maxFallSpeed;
|
|
}
|
|
}
|
|
|
|
speed.x = speedF * cM_ssin(current.angle.y);
|
|
speed.z = speedF * cM_scos(current.angle.y);
|
|
|
|
fopAcM_posMove(this, mStts.GetCCMoveP());
|
|
}
|
|
|
|
|
|
mAcch.CrrPos(*dComIfG_Bgsp());
|
|
field_0x784 |= 0x10;
|
|
|
|
if(chkPlayerAction(&daNpc_Os_c::walkPlayerAction) || chkNpcAction(&daNpc_Os_c::searchNpcAction)) {
|
|
if(!mAcch.ChkGroundHit()) {
|
|
f32 gndY = mAcch.GetGroundH();
|
|
f32 delta = gndY - current.pos.y;
|
|
if(delta < 0.0f && delta >= -30.1f) {
|
|
current.pos.y = gndY;
|
|
mAcch.SetGroundHit();
|
|
speed.y = 0.0f;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(mAcch.GetGroundH() != -G_CM3D_F_INF) {
|
|
cM3dGPla* plane = dComIfG_Bgsp()->GetTriPla(mAcch.m_gnd.GetBgIndex(), mAcch.m_gnd.GetPolyIndex());
|
|
if(plane) {
|
|
field_0x7F0 = *plane->GetNP();
|
|
}
|
|
|
|
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);
|
|
field_0x7FC.SetPolyInfo(mAcch.m_gnd);
|
|
|
|
if(roomNo != 7) {
|
|
mpPedestal = NULL;
|
|
}
|
|
}
|
|
|
|
field_0x7A8 = mAcch.ChkGroundHit();
|
|
if(!fopAcM_checkCarryNow(this)) {
|
|
if(mAcch.GetGroundH() == -G_CM3D_F_INF || dComIfG_Bgsp()->GetGroundCode(mAcch.m_gnd) == 4) {
|
|
if(m4E8 < 30) {
|
|
m4E8 += 1;
|
|
}
|
|
else if(!dComIfGp_roomControl_checkStatusFlag(fopAcM_GetHomeRoomNo(this), 0x10)) {
|
|
current = home;
|
|
shape_angle = home.angle;
|
|
speedF = 0.0f;
|
|
m4E8 = 0;
|
|
}
|
|
else {
|
|
daPy_getPlayerLinkActorClass()->npcStartRestartRoom();
|
|
}
|
|
}
|
|
else {
|
|
m4E8 = 0;
|
|
}
|
|
|
|
if(mAcch.ChkWaterIn()) {
|
|
daPy_getPlayerLinkActorClass()->npcStartRestartRoom();
|
|
|
|
if(!isWaterHit()) {
|
|
onWaterHit();
|
|
|
|
JPABaseEmitter* splash = dComIfGp_particle_set(dPa_name::ID_COMMON_0040, ¤t.pos);
|
|
if(splash) {
|
|
splash->setRate(15.0f);
|
|
splash->setGlobalScale(splash_scale);
|
|
}
|
|
|
|
JPABaseEmitter* ripple = dComIfGp_particle_setSingleRipple(dPa_name::ID_COMMON_003D, ¤t.pos);
|
|
if(ripple) {
|
|
ripple->setGlobalScale(ripple_scale);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
mAcch.CrrPos(*dComIfG_Bgsp());
|
|
|
|
field_0x784 |= 0x10;
|
|
if(mAcch.GetGroundH() != -G_CM3D_F_INF) {
|
|
tevStr.mRoomNo = dComIfG_Bgsp()->GetRoomId(mAcch.m_gnd);
|
|
tevStr.mEnvrIdxOverride = dComIfG_Bgsp()->GetPolyColor(mAcch.m_gnd);
|
|
}
|
|
}
|
|
|
|
if(!fopAcM_checkCarryNow(this)) {
|
|
setCollision();
|
|
}
|
|
|
|
if(checkNowPosMove(l_staff_name[argument])) {
|
|
animationPlay();
|
|
}
|
|
|
|
if(!eventProc()) {
|
|
if(!finishCheck()) {
|
|
if(dComIfGp_getPlayer(0) == this) {
|
|
fopAcM_SetStatusMap(this, 0x13);
|
|
|
|
if(isReturnLink()) {
|
|
field_0x7A5 = 0;
|
|
}
|
|
else {
|
|
playerAction(0);
|
|
if(returnLinkCheck()) {
|
|
returnLink();
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if(wakeupCheck()) {
|
|
fopAcM_SetStatusMap(this, 0xE);
|
|
}
|
|
|
|
carryCheck();
|
|
checkOrder();
|
|
npcAction(0);
|
|
|
|
if(!chkNpcAction(&daNpc_Os_c::throwNpcAction)) {
|
|
current.angle.y = shape_angle.y;
|
|
}
|
|
}
|
|
|
|
checkGoalRoom();
|
|
}
|
|
|
|
if(field_0x78C == 2 || field_0x78C == 4) {
|
|
makeBeam(0);
|
|
}
|
|
else {
|
|
endBeam();
|
|
}
|
|
|
|
eventOrderCheck();
|
|
}
|
|
|
|
eventOrder();
|
|
setBaseMtx();
|
|
if(field_0x738.getEmitter() || field_0x740.getEmitter()) {
|
|
fopAcM_seStartCurrent(this, JA_SE_OBJ_OSTATUE_LIGHT_SUS, 0);
|
|
}
|
|
|
|
m_smoke_tevstr = tevStr;
|
|
|
|
return true;
|
|
}
|
|
|
|
/* 00006AF8-00006E1C .text __dt__10daNpc_Os_cFv */
|
|
daNpc_Os_c::~daNpc_Os_c() {
|
|
dComIfG_resDelete(&mPhs, "Os");
|
|
|
|
if (heap) {
|
|
mpMorf->stopZelAnime();
|
|
}
|
|
|
|
endBeam();
|
|
m_smoke.remove();
|
|
if(l_hio_counter != 0) {
|
|
l_hio_counter -= 1;
|
|
}
|
|
|
|
if(l_hio_counter <= 0 && l_HIO.mNo >= 0) {
|
|
mDoHIO_deleteChild(l_HIO.mNo);
|
|
l_HIO.mNo = -1;
|
|
}
|
|
|
|
m_playerRoom[argument] = false;
|
|
m_cattleRoomNo = -1;
|
|
}
|
|
|
|
/* 00006E1C-00006E3C .text daNpc_Os_Create__FP10fopAc_ac_c */
|
|
static cPhs_State daNpc_Os_Create(fopAc_ac_c* i_this) {
|
|
return static_cast<daNpc_Os_c*>(i_this)->create();
|
|
}
|
|
|
|
/* 00006E3C-00006E64 .text daNpc_Os_Delete__FP10daNpc_Os_c */
|
|
static BOOL daNpc_Os_Delete(daNpc_Os_c* i_this) {
|
|
i_this->~daNpc_Os_c();
|
|
return true;
|
|
}
|
|
|
|
/* 00006E64-00006EA8 .text daNpc_Os_Execute__FP10daNpc_Os_c */
|
|
static BOOL daNpc_Os_Execute(daNpc_Os_c* i_this) {
|
|
BOOL ret = i_this->execute();
|
|
|
|
if(i_this->argument == 2) {
|
|
i_this->setCattleRoomNo(fopAcM_GetRoomNo(i_this));
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
/* 00006EA8-00006EC8 .text daNpc_Os_Draw__FP10daNpc_Os_c */
|
|
static BOOL daNpc_Os_Draw(daNpc_Os_c* i_this) {
|
|
return i_this->draw();
|
|
}
|
|
|
|
/* 00006EC8-00006ED0 .text daNpc_Os_IsDelete__FP10daNpc_Os_c */
|
|
static BOOL daNpc_Os_IsDelete(daNpc_Os_c* i_this) {
|
|
return true;
|
|
}
|
|
|
|
/* 00006ED0-00006F04 .text end__28daNpc_Os_infiniteEcallBack_cFv */
|
|
void daNpc_Os_infiniteEcallBack_c::end() {
|
|
if(mpBaseEmitter) {
|
|
mpBaseEmitter->becomeInvalidEmitter();
|
|
mpBaseEmitter->setEmitterCallBackPtr(NULL);
|
|
mpBaseEmitter = NULL;
|
|
}
|
|
}
|
|
|
|
/* 00006F04-00006F8C .text makeEmitter__28daNpc_Os_infiniteEcallBack_cFUsPC4cXyzPC5csXyzPC4cXyz */
|
|
void daNpc_Os_infiniteEcallBack_c::makeEmitter(u16 param_1, const cXyz* param_2, const csXyz* param_3, const cXyz* param_4) {
|
|
end();
|
|
dComIfGp_particle_set(param_1, param_2, param_3, param_4, -1, this);
|
|
}
|
|
|
|
static actor_method_class l_daNpc_Os_Method = {
|
|
(process_method_func)daNpc_Os_Create,
|
|
(process_method_func)daNpc_Os_Delete,
|
|
(process_method_func)daNpc_Os_Execute,
|
|
(process_method_func)daNpc_Os_IsDelete,
|
|
(process_method_func)daNpc_Os_Draw,
|
|
};
|
|
|
|
actor_process_profile_definition g_profile_NPC_OS = {
|
|
/* LayerID */ fpcLy_CURRENT_e,
|
|
/* ListID */ 0x0007,
|
|
/* ListPrio */ fpcPi_CURRENT_e,
|
|
/* ProcName */ PROC_NPC_OS,
|
|
/* Proc SubMtd */ &g_fpcLf_Method.base,
|
|
/* Size */ sizeof(daNpc_Os_c),
|
|
/* SizeOther */ 0,
|
|
/* Parameters */ 0,
|
|
/* Leaf SubMtd */ &g_fopAc_Method.base,
|
|
/* Priority */ PRIO_NPC_OS,
|
|
/* Actor SubMtd */ &l_daNpc_Os_Method,
|
|
/* Status */ fopAcStts_CULL_e | fopAcStts_FREEZE_e | fopAcStts_UNK4000_e | fopAcStts_UNK40000_e | fopAcStts_UNK2000000_e | fopAcStts_UNK8000000_e,
|
|
/* Group */ fopAc_ACTOR_e,
|
|
/* CullType */ fopAc_CULLBOX_0_e,
|
|
};
|