// // d_a_npc_tr.cpp // NPC - Trout // #include "d/dolzel_rel.h" #include "d/actor/d_a_npc_tr.h" #include "SSystem/SComponent/c_math.h" #include "d/d_com_inf_game.h" #include "m_Do/m_Do_mtx.h" // // Declarations: // /* 80B25A0C-80B25A54 0000EC 0048+00 1/1 0/0 0/0 .text __ct__14daNPC_TR_HIO_cFv */ daNPC_TR_HIO_c::daNPC_TR_HIO_c() { field_0x4 = -1; field_0x8 = 0.8f; field_0xc = 15.0f; field_0x10 = 0.3f; field_0x14 = 0.6f; field_0x18 = 250.0f; } /* 80B25A54-80B25B78 000134 0124+00 1/1 0/0 0/0 .text nodeCallBack__FP8J3DJointi */ static int nodeCallBack(J3DJoint* p_joint, int param_1) { if (param_1 == 0) { int jointNo = p_joint->getJntNo(); J3DModel* sysModel = j3dSys.getModel(); npc_tr_class* npc_tr = (npc_tr_class*)sysModel->getUserArea(); mDoMtx_copy(sysModel->getAnmMtx(jointNo), *calc_mtx); if (jointNo == 1) { mDoMtx_YrotM(*calc_mtx, npc_tr->field_0x5f2[0] + (s16)(npc_tr->field_0x5f8 * 0.3f)); } else if (jointNo >= 1 && jointNo <= 3) { mDoMtx_YrotM(*calc_mtx, npc_tr->field_0x5f2[jointNo - 1] + (s16)(npc_tr->field_0x5f8)); } sysModel->setAnmMtx(jointNo, *calc_mtx); mDoMtx_copy(*calc_mtx, j3dSys.mCurrentMtx); } return 1; } /* 80B25B78-80B25BDC 000258 0064+00 1/0 0/0 0/0 .text daNPC_TR_Draw__FP12npc_tr_class */ static int daNPC_TR_Draw(npc_tr_class* npc_tr) { g_env_light.settingTevStruct(0, &npc_tr->current.pos, &npc_tr->tevStr); g_env_light.setLightTevColorType_MAJI(npc_tr->field_0x5b8, &npc_tr->tevStr); mDoExt_modelUpdateDL(npc_tr->field_0x5b8); return 1; } // placeholder for daNPC_TR_HIO_c::genMessage to generate literals in the right place static f32 dummyLiterals() { f32 dummy = 50.0f; dummy *= 0.0f; dummy *= 1000.0f; dummy *= 200.0f; return dummy; } /* 80B26678-80B2667C 000008 0004+00 2/2 0/0 0/0 .bss None */ static u8 data_80B26678; /* 80B26688-80B266A4 000018 001C+00 5/5 0/0 0/0 .bss l_HIO */ static daNPC_TR_HIO_c l_HIO; /* 80B25BDC-80B25FE0 0002BC 0404+00 1/1 0/0 0/0 .text npc_tr_move__FP12npc_tr_class */ static void npc_tr_move(npc_tr_class* npc_tr) { cXyz distance; f32 var_f31; s16 var_r29; switch (npc_tr->field_0x5c0) { case 0: if (npc_tr->field_0x5dc[0] == 0) { for (int i = 0; i < 100; i++) { npc_tr->field_0x5c4.x = npc_tr->home.pos.x + cM_rndFX(1000.0f); npc_tr->field_0x5c4.y = npc_tr->home.pos.y + cM_rndFX(200.0f); npc_tr->field_0x5c4.z = npc_tr->home.pos.z + cM_rndFX(1000.0f); distance = npc_tr->field_0x5c4 - npc_tr->current.pos; distance.y = 0.0f; if (distance.abs() > 500.0f) { npc_tr->field_0x5c0 = 1; npc_tr->field_0x5dc[0] = (s16)(cM_rndF(30.0f) + 30.0f); break; } } } npc_tr->field_0x5e8 = 0.1f; var_r29 = 0; var_f31 = 0.05f; break; case 1: if (npc_tr->field_0x5dc[0] == 0) { npc_tr->field_0x5c0 = 0; npc_tr->field_0x5dc[0] = (s16)(cM_rndF(30.0f) + 30.0f); } npc_tr->field_0x5e8 = l_HIO.field_0x10; var_r29 = 0x400; var_f31 = 0.5f; break; } if (npc_tr->field_0x5dc[1] != 0) { var_f31 = 0.5f; npc_tr->field_0x5e8 = l_HIO.field_0x14; var_r29 = 0x600; } else if (npc_tr->field_0x5d8 < l_HIO.field_0x18) { npc_tr->field_0x5dc[1] = (s16)(cM_rndF(20.0f) + 20.0f); if (npc_tr->field_0x5c0 == 1) { npc_tr->field_0x5c0 = 0; } } distance = npc_tr->field_0x5c4 - npc_tr->current.pos; s16 angle = npc_tr->current.angle.y; cLib_addCalcAngleS2(&npc_tr->current.angle.y, cM_atan2s(distance.x, distance.z), 4, var_r29); f32 var_f2 = JMAFastSqrt((distance.x * distance.x) + (distance.z * distance.z)); cLib_addCalcAngleS2(&npc_tr->current.angle.x, -cM_atan2s(distance.y, var_f2), 4, var_r29); angle -= npc_tr->current.angle.y; f32 var_f1_2 = angle * 5.0f; if (var_f1_2 > 4000.0f) { var_f1_2 = 4000.0f; } else if (var_f1_2 < -4000.0f) { var_f1_2 = -4000.0f; } cLib_addCalc2(&npc_tr->field_0x5f8, var_f1_2, 0.5f, 1000.0f); cLib_addCalc2(&npc_tr->speedF, npc_tr->field_0x5e4 * l_HIO.field_0xc, 1.0f, var_f31); } /* 80B25FE0-80B261D8 0006C0 01F8+00 1/1 0/0 0/0 .text action__FP12npc_tr_class */ static void action(npc_tr_class* i_this) { switch (i_this->field_0x5be) { case 0: npc_tr_move(i_this); break; } cLib_addCalcAngleS2(&i_this->shape_angle.y, i_this->current.angle.GetY(), 4, 0x2000); cLib_addCalcAngleS2(&i_this->shape_angle.x, i_this->current.angle.GetX(), 4, 0x2000); mDoMtx_YrotS(*calc_mtx, i_this->current.angle.GetY()); mDoMtx_XrotM(*calc_mtx, i_this->current.angle.GetX()); cXyz v; v.x = 0.0f; v.y = 0.0f; v.z = i_this->speedF * l_HIO.field_0x8; MtxPosition(&v, &i_this->speed); i_this->current.pos += i_this->speed; cLib_addCalc2(&i_this->field_0x5e4, i_this->field_0x5e8, 1.0f, 0.2f); cLib_addCalc2(&i_this->field_0x5fc, i_this->field_0x5e4 * 2000.0f + 2000.0f, 0.5f, 200.0f); i_this->field_0x5ee = i_this->field_0x5e4 * 13000.0f + 2000.0f; i_this->field_0x5ec += i_this->field_0x5ee; f32 local_28[3] = {0.5f, 1.0f, 2.5f}; for (int i = 0; i < 3; ++i) { i_this->field_0x5f2[i] = local_28[i] * (i_this->field_0x5fc * cM_ssin(i_this->field_0x5ec + (i * -15000))); } i_this->field_0x5f0 = cM_ssin(i_this->field_0x5ec + -7000) * i_this->field_0x5fc * -0.3f; } /* 80B261D8-80B262D0 0008B8 00F8+00 2/1 0/0 0/0 .text daNPC_TR_Execute__FP12npc_tr_class */ static int daNPC_TR_Execute(npc_tr_class* npc_tr) { npc_tr->field_0x5bc++; npc_tr->field_0x5d8 = fopAcM_searchActorDistance(npc_tr, (fopAc_ac_c*)dComIfGp_getPlayer(0)); for (int i = 0; i < 4; i++) { if (npc_tr->field_0x5dc[i] != 0) { npc_tr->field_0x5dc[i]--; } } action(npc_tr); mDoMtx_stack_c::transS(npc_tr->current.pos.x, npc_tr->current.pos.y, npc_tr->current.pos.z); mDoMtx_stack_c::YrotM(npc_tr->shape_angle.y + npc_tr->field_0x5f0); mDoMtx_stack_c::XrotM(npc_tr->shape_angle.x); f32 scale = npc_tr->scale.x * l_HIO.field_0x8; mDoMtx_stack_c::scaleM(scale, scale, scale); MTXCopy(mDoMtx_stack_c::get(), npc_tr->field_0x5b8->mBaseTransformMtx); return 1; } /* 80B262D0-80B262D8 0009B0 0008+00 1/0 0/0 0/0 .text daNPC_TR_IsDelete__FP12npc_tr_class */ static bool daNPC_TR_IsDelete(npc_tr_class* param_0) { return true; } /* 80B262D8-80B2632C 0009B8 0054+00 1/0 0/0 0/0 .text daNPC_TR_Delete__FP12npc_tr_class */ static int daNPC_TR_Delete(npc_tr_class* npc_tr) { dComIfG_resDelete(&npc_tr->mPhaseReq, "NPC_TR"); if (npc_tr->field_0x600) { data_80B26678 = 0; } return 1; } /* 80B2632C-80B263E4 000A0C 00B8+00 1/1 0/0 0/0 .text useHeapInit__FP10fopAc_ac_c */ static int useHeapInit(fopAc_ac_c* actor) { npc_tr_class* npc_tr = (npc_tr_class*)actor; J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("NPC_TR", 3); npc_tr->field_0x5b8 = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084); if (npc_tr->field_0x5b8 == NULL) { return 0; } npc_tr->field_0x5b8->setUserArea((uintptr_t)actor); for (u16 i = 0; i < npc_tr->field_0x5b8->getModelData()->getJointNum(); i++) { npc_tr->field_0x5b8->getModelData()->getJointNodePointer(i)->setCallBack(nodeCallBack); } return 1; } /* 80B263E4-80B264E4 000AC4 0100+00 1/0 0/0 0/0 .text daNPC_TR_Create__FP10fopAc_ac_c */ static int daNPC_TR_Create(fopAc_ac_c* i_this) { fopAcM_SetupActor(i_this, npc_tr_class); npc_tr_class* npc_tr = (npc_tr_class*)i_this; int phase_state = dComIfG_resLoad(&npc_tr->mPhaseReq, "NPC_TR"); if (phase_state == cPhs_COMPLEATE_e) { npc_tr->field_0x5b4 = fopAcM_GetParam(npc_tr); if (!fopAcM_entrySolidHeap(npc_tr, useHeapInit, 0x4B000)) { return cPhs_ERROR_e; } if (!data_80B26678) { npc_tr->field_0x600 = 1; data_80B26678 = 1; l_HIO.field_0x4 = -1; } npc_tr->cullMtx = npc_tr->field_0x5b8->getBaseTRMtx(); npc_tr->scale.x = cM_rndFX(0.1f) + 0.8f; daNPC_TR_Execute(npc_tr); } return phase_state; } /* 80B264E4-80B2652C 000BC4 0048+00 2/1 0/0 0/0 .text __dt__14daNPC_TR_HIO_cFv */ daNPC_TR_HIO_c::~daNPC_TR_HIO_c() {} /* 80B26610-80B26630 -00001 0020+00 1/0 0/0 0/0 .data l_daNPC_TR_Method */ static actor_method_class l_daNPC_TR_Method = { (process_method_func)daNPC_TR_Create, (process_method_func)daNPC_TR_Delete, (process_method_func)daNPC_TR_Execute, (process_method_func)daNPC_TR_IsDelete, (process_method_func)daNPC_TR_Draw, }; /* 80B26630-80B26660 -00001 0030+00 0/0 0/0 1/0 .data g_profile_NPC_TR */ extern actor_process_profile_definition g_profile_NPC_TR = { fpcLy_CURRENT_e, // mLayerID 7, // mListID fpcPi_CURRENT_e, // mListPrio PROC_NPC_TR, // mProcName &g_fpcLf_Method.base, // sub_method sizeof(npc_tr_class), // mSize 0, // mSizeOther 0, // mParameters &g_fopAc_Method.base, // sub_method 723, // mPriority &l_daNPC_TR_Method, // sub_method 0x40100, // mStatus fopAc_ENEMY_e, // mActorType fopAc_CULLBOX_0_e, // cullType };