mirror of
https://github.com/zeldaret/tww.git
synced 2026-05-23 15:01:33 -04:00
1895 lines
59 KiB
C++
1895 lines
59 KiB
C++
/**
|
|
* d_a_rd.cpp
|
|
* Enemy - ReDead
|
|
*/
|
|
|
|
#include "d/actor/d_a_rd.h"
|
|
#include "d/res/res_rd.h"
|
|
#include "d/d_procname.h"
|
|
#include "f_op/f_op_actor_mng.h"
|
|
#include "d/d_com_inf_game.h"
|
|
#include "m_Do/m_Do_mtx.h"
|
|
#include "d/d_lib.h"
|
|
#include "d/d_material.h"
|
|
#include "d/d_snap.h"
|
|
#include "d/actor/d_a_player.h"
|
|
#include "d/actor/d_a_player_main.h"
|
|
#include "d/d_cc_uty.h"
|
|
#include "d/d_s_play.h"
|
|
#include "d/d_item_data.h"
|
|
#include "m_Do/m_Do_controller_pad.h"
|
|
|
|
#include "weak_bss_936_to_1036.h" // IWYU pragma: keep
|
|
#include "weak_data_1811.h" // IWYU pragma: keep
|
|
|
|
static daRd_HIO_c l_HIO;
|
|
|
|
const u32 daRd_c::m_heapsize = 0x2520;
|
|
const char daRd_c::m_arc_name[] = "Rd";
|
|
const dCcD_SrcCyl daRd_c::m_cyl_src = {
|
|
// dCcD_SrcGObjInf
|
|
{
|
|
/* Flags */ 0,
|
|
/* SrcObjAt Type */ 0,
|
|
/* SrcObjAt Atp */ 0,
|
|
/* SrcObjAt SPrm */ 0,
|
|
/* SrcObjTg Type */ ~(AT_TYPE_WATER | AT_TYPE_UNK20000 | AT_TYPE_WIND | AT_TYPE_UNK400000),
|
|
/* SrcObjTg SPrm */ cCcD_TgSPrm_Set_e | cCcD_TgSPrm_IsOther_e,
|
|
/* SrcObjCo SPrm */ cCcD_CoSPrm_Set_e | cCcD_CoSPrm_IGrpAll_e | cCcD_CoSPrm_VsGrpAll_e,
|
|
/* SrcGObjAt Se */ 0,
|
|
/* SrcGObjAt HitMark */ 0,
|
|
/* SrcGObjAt Spl */ 0,
|
|
/* SrcGObjAt Mtrl */ 0,
|
|
/* SrcGObjAt SPrm */ 0,
|
|
/* SrcGObjTg Se */ dCcG_SE_UNK23,
|
|
/* SrcGObjTg HitMark */ 0,
|
|
/* SrcGObjTg Spl */ 0,
|
|
/* SrcGObjTg Mtrl */ 0,
|
|
/* SrcGObjTg SPrm */ dCcG_TgSPrm_NoConHit_e | dCcG_TgSPrm_NoHitMark_e,
|
|
/* SrcGObjCo SPrm */ 0,
|
|
},
|
|
// cM3dGCylS
|
|
{
|
|
/* Center */ 0.0f, 0.0f, 0.0f,
|
|
/* Radius */ 0.0f,
|
|
/* Height */ 0.0f,
|
|
},
|
|
};
|
|
|
|
/* 000000EC-0000027C .text __ct__10daRd_HIO_cFv */
|
|
daRd_HIO_c::daRd_HIO_c() {
|
|
m2C = 0x0;
|
|
m30 = 650.0f;
|
|
m34 = 650.0f;
|
|
mCryRadius = 500.0f;
|
|
mAttackRadius = 125.0f;
|
|
m40 = 0x2000;
|
|
mCrySpreadAngle = 0x1B58;
|
|
mAttackSpreadAngle = 0x6000;
|
|
m46 = 0xA;
|
|
m48 = 0x5;
|
|
m4A = 0x3C;
|
|
m4C = 0x32;
|
|
m4E = 0x384;
|
|
m58 = 10.0f;
|
|
m5C = 10.0f;
|
|
m60 = 50.0f;
|
|
m64 = 30.0f;
|
|
m68 = 1.8f;
|
|
mReturnWalkSpeed = 2.0f;
|
|
m70 = 1.25f;
|
|
m74 = 0.9f;
|
|
m50 = 0x28;
|
|
m78 = 0x2D;
|
|
m54 = 0x87;
|
|
m52 = 0x96;
|
|
mParalysisDuration = 2*30;
|
|
mNpc.m04 = -20.0f;
|
|
mNpc.mMaxHeadX = 0x1FFE;
|
|
mNpc.mMaxHeadY = 0x4000;
|
|
mNpc.mMaxBackboneX = 0x0;
|
|
mNpc.mMaxBackboneY = 0x2000;
|
|
mNpc.mMinHeadX = -0x9C4;
|
|
mNpc.mMinHeadY = -0x4000;
|
|
mNpc.mMinBackboneX = 0x0;
|
|
mNpc.mMinBackboneY = -0x2000;
|
|
mNpc.mMaxTurnStep = 0x250;
|
|
mNpc.mMaxHeadTurnVel = 0x150;
|
|
mNpc.mAttnYOffset = 50.0f;
|
|
mNpc.mMaxAttnAngleY = 0x7FFF;
|
|
mNpc.m22 = 0x0;
|
|
mNpc.mMaxAttnDistXZ = 400.0f;
|
|
}
|
|
|
|
/* 0000027C-000002A8 .text searchNeadDeadRd_CB__FPvPv */
|
|
static void* searchNeadDeadRd_CB(void* i_actor, void* i_this) {
|
|
return static_cast<daRd_c*>(i_this)->_searchNearDeadRd(static_cast<fopAc_ac_c*>(i_actor));
|
|
}
|
|
|
|
/* 000002A8-0000030C .text _searchNearDeadRd__6daRd_cFP10fopAc_ac_c */
|
|
fopAc_ac_c* daRd_c::_searchNearDeadRd(fopAc_ac_c* i_actor) {
|
|
if (fopAcM_GetName(i_actor) == PROC_RD) {
|
|
daRd_c* other = static_cast<daRd_c*>(i_actor);
|
|
if (other->mMode == MODE_DEATH) {
|
|
if (fopAcM_searchActorDistanceXZ(this, i_actor) < l_HIO.m34) {
|
|
return i_actor;
|
|
}
|
|
}
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
/* 0000030C-00000358 .text nodeControl_CB__FP7J3DNodei */
|
|
static BOOL nodeControl_CB(J3DNode* node, int param_1) {
|
|
if (!param_1) {
|
|
J3DModel* model = j3dSys.getModel();
|
|
daRd_c* i_this = reinterpret_cast<daRd_c*>(model->getUserArea());
|
|
if (i_this) {
|
|
i_this->_nodeControl(node, model);
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/* 00000358-00000514 .text _nodeControl__6daRd_cFP7J3DNodeP8J3DModel */
|
|
BOOL daRd_c::_nodeControl(J3DNode* node, J3DModel* model) {
|
|
J3DJoint* joint = static_cast<J3DJoint*>(node);
|
|
int jntNo = joint->getJntNo();
|
|
cMtx_copy(model->getAnmMtx(jntNo), mDoMtx_stack_c::get());
|
|
|
|
if (mJntCtrl.getHeadJntNum() == jntNo) {
|
|
static cXyz l_offsetAttPos(0.0f, 0.0f, 0.0f);
|
|
static cXyz l_offsetEyePos(24.0f, -16.0f, 0.0f);
|
|
mDoMtx_stack_c::multVec(&l_offsetAttPos, &mTargetPos);
|
|
mDoMtx_stack_c::XrotM((int)mJntCtrl.getHead_y());
|
|
mDoMtx_stack_c::ZrotM((int)mJntCtrl.getHead_x());
|
|
mDoMtx_stack_c::multVec(&l_offsetEyePos, &mRdEyePos);
|
|
mDoMtx_stack_c::XrotM(mD1A);
|
|
mDoMtx_stack_c::ZrotM(mD1C);
|
|
mDoMtx_stack_c::YrotM(mD1E);
|
|
} else if (mJntCtrl.getBackboneJntNum() == jntNo) {
|
|
mDoMtx_stack_c::XrotM((int)mJntCtrl.getBackbone_y());
|
|
mDoMtx_stack_c::ZrotM((int)mJntCtrl.getBackbone_x());
|
|
}
|
|
|
|
cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx);
|
|
model->setAnmMtx(jntNo, mDoMtx_stack_c::get());
|
|
}
|
|
|
|
/* 00000550-0000059C .text nodeHeadControl_CB__FP7J3DNodei */
|
|
static BOOL nodeHeadControl_CB(J3DNode* node, int param_1) {
|
|
if (!param_1) {
|
|
J3DModel* model = j3dSys.getModel();
|
|
daRd_c* i_this = reinterpret_cast<daRd_c*>(model->getUserArea());
|
|
if (i_this) {
|
|
i_this->_nodeHeadControl(node, model);
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/* 0000059C-000006A0 .text _nodeHeadControl__6daRd_cFP7J3DNodeP8J3DModel */
|
|
BOOL daRd_c::_nodeHeadControl(J3DNode* node, J3DModel* model) {
|
|
J3DJoint* joint = static_cast<J3DJoint*>(node);
|
|
int jntNo = joint->getJntNo();
|
|
|
|
cXyz temp4(mD38, 0.0f, 0.0f);
|
|
cMtx_copy(model->getAnmMtx(jntNo), mDoMtx_stack_c::get());
|
|
mDoMtx_stack_c::transM(temp4);
|
|
|
|
cMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx);
|
|
cXyz temp3(0.0f, 0.0f, 50.0f);
|
|
mDoMtx_stack_c::multVec(&temp3, &mRdEyePos);
|
|
model->setAnmMtx(jntNo, mDoMtx_stack_c::get());
|
|
cMtx_copy(mDoMtx_stack_c::get(), mCE8);
|
|
|
|
Mtx mtx;
|
|
csXyz angle;
|
|
mDoMtx_inverseTranspose(mDoMtx_stack_c::get(), mtx);
|
|
mDoMtx_MtxToRot(mtx, &angle);
|
|
mHeadAngle = angle.y;
|
|
}
|
|
|
|
/* 000006A0-000006C0 .text createHeap_CB__FP10fopAc_ac_c */
|
|
static BOOL createHeap_CB(fopAc_ac_c* i_this) {
|
|
return static_cast<daRd_c*>(i_this)->_createHeap();
|
|
}
|
|
|
|
/* 000006C0-0000096C .text _createHeap__6daRd_cFv */
|
|
BOOL daRd_c::_createHeap() {
|
|
J3DModelData* modelData = static_cast<J3DModelData*>(dComIfG_getObjectRes(m_arc_name, RD_BDL_RD));
|
|
JUT_ASSERT(504, modelData != NULL);
|
|
|
|
mpMorf = new mDoExt_McaMorf(
|
|
modelData,
|
|
NULL, NULL,
|
|
static_cast<J3DAnmTransformKey*>(dComIfG_getObjectRes(m_arc_name, RD_BCK_SUWARIP)),
|
|
J3DFrameCtrl::LOOP_REPEAT_e, 1.0f, 0, -1, 1,
|
|
NULL,
|
|
0x00080000,
|
|
0x37441622
|
|
);
|
|
if (mpMorf == NULL || mpMorf->getModel() == NULL) {
|
|
return FALSE;
|
|
}
|
|
mpMorf->getModel()->setUserArea(reinterpret_cast<u32>(this));
|
|
|
|
if (!mInvisModel.create(mpMorf->getModel())) {
|
|
return FALSE;
|
|
}
|
|
|
|
J3DAnmTextureSRTKey* btk = static_cast<J3DAnmTextureSRTKey*>(dComIfG_getObjectRes(m_arc_name, RD_BTK_RD_CLOSE));
|
|
JUT_ASSERT(525, btk != NULL);
|
|
if (!mBtkAnm.init(modelData, btk, true, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, 0, -1, false, 0)) {
|
|
return FALSE;
|
|
}
|
|
|
|
modelData->getJointNodePointer(0x0C)->setCallBack(nodeHeadControl_CB); // ree_atama_1
|
|
|
|
J3DAnmTevRegKey* brk = static_cast<J3DAnmTevRegKey*>(dComIfG_getObjectRes(m_arc_name, RD_BRK_NML));
|
|
JUT_ASSERT(550, brk != NULL);
|
|
if (!mBrkAnm.init(modelData, brk, true, J3DFrameCtrl::LOOP_ONCE_e, 1.0f, 0, -1, false, 0)) {
|
|
return FALSE;
|
|
}
|
|
|
|
return createArrowHeap() ? TRUE : FALSE;
|
|
}
|
|
|
|
/* 0000096C-000009D0 .text createArrowHeap__6daRd_cFv */
|
|
bool daRd_c::createArrowHeap() {
|
|
static Vec sebone_cyl_offset[] = {{0.0f, 0.0f, 0.0f}, {30.0f, 0.0f, 0.0f}};
|
|
static Vec muneA_cyl_offset[] = {{5.0f, -5.0f, 0.0f}, {20.0f, -5.0f, 0.0f}};
|
|
static Vec muneB1_cyl_offset[] = {{15.0f, 0.0f, -15.0f}, {50.0f, 0.0f, -15.0f}};
|
|
static Vec muneB2_cyl_offset[] = {{15.0f, 0.0f, 0.0f}, {50.0f, 0.0f, 0.0f}};
|
|
static Vec muneB3_cyl_offset[] = {{15.0f, 0.0f, 15.0f}, {50.0f, 0.0f, 15.0f}};
|
|
static Vec kosi1_cyl_offset[] = {{0.0f, 0.0f, -10.0f}, {20.0f, 0.0f, -10.0f}};
|
|
static Vec kosi2_cyl_offset[] = {{0.0f, 0.0f, 0.0f}, {20.0f, 0.0f, 0.0f}};
|
|
static Vec kosi3_cyl_offset[] = {{0.0f, 0.0f, 10.0f}, {20.0f, 0.0f, 10.0f}};
|
|
static Vec asi1_cyl_offset[] = {{-8.0f, 0.0f, 0.0f}, {30.0f, 0.0f, 0.0f}};
|
|
static Vec asi2_cyl_offset[] = {{-3.0f, 0.0f, 0.0f}, {15.0f, 0.0f, 0.0f}};
|
|
static Vec asi3_cyl_offset[] = {{0.0f, 0.0f, 0.0f}, {11.0f, 0.0f, 0.0f}};
|
|
static Vec head_sph_offset[] = {{30.0f, 0.0f, -5.0f}};
|
|
static Vec ude1_cyl_offset[] = {{-5.0f, -8.0f, -1.0f}, {60.0f, 4.0f, 1.0f}};
|
|
static Vec ude2_cyl_offset[] = {{-3.0f, 0.0f, 0.0f}, {55.0f, 0.0f, 0.0f}};
|
|
static Vec te_cyl_offset[] = {{8.0f, 2.0f, 0.0f}, {30.0f, 2.0f, 0.0f}};
|
|
static Vec yubi_cyl_offset[] = {{0.0f, 0.0f, 0.0f}, {17.0f, 0.0f, 0.0f}};
|
|
static __jnt_hit_data_c search_data[] = {
|
|
{
|
|
/* mShapeType */ 0, // Cylinder
|
|
/* mJointIndex */ 0x01,
|
|
/* mRadius */ 4.0f,
|
|
/* mpOffsets */ kosi1_cyl_offset,
|
|
},
|
|
{
|
|
/* mShapeType */ 0, // Cylinder
|
|
/* mJointIndex */ 0x01,
|
|
/* mRadius */ 4.0f,
|
|
/* mpOffsets */ kosi2_cyl_offset,
|
|
},
|
|
{
|
|
/* mShapeType */ 0, // Cylinder
|
|
/* mJointIndex */ 0x01,
|
|
/* mRadius */ 4.0f,
|
|
/* mpOffsets */ kosi3_cyl_offset,
|
|
},
|
|
{
|
|
/* mShapeType */ 0, // Cylinder
|
|
/* mJointIndex */ 0x02,
|
|
/* mRadius */ 2.0f,
|
|
/* mpOffsets */ asi1_cyl_offset,
|
|
},
|
|
{
|
|
/* mShapeType */ 0, // Cylinder
|
|
/* mJointIndex */ 0x03,
|
|
/* mRadius */ 2.0f,
|
|
/* mpOffsets */ asi2_cyl_offset,
|
|
},
|
|
{
|
|
/* mShapeType */ 0, // Cylinder
|
|
/* mJointIndex */ 0x04,
|
|
/* mRadius */ 2.0f,
|
|
/* mpOffsets */ asi3_cyl_offset,
|
|
},
|
|
{
|
|
/* mShapeType */ 0, // Cylinder
|
|
/* mJointIndex */ 0x05,
|
|
/* mRadius */ 2.0f,
|
|
/* mpOffsets */ asi1_cyl_offset,
|
|
},
|
|
{
|
|
/* mShapeType */ 0, // Cylinder
|
|
/* mJointIndex */ 0x06,
|
|
/* mRadius */ 2.0f,
|
|
/* mpOffsets */ asi2_cyl_offset,
|
|
},
|
|
{
|
|
/* mShapeType */ 0, // Cylinder
|
|
/* mJointIndex */ 0x07,
|
|
/* mRadius */ 2.0f,
|
|
/* mpOffsets */ asi3_cyl_offset,
|
|
},
|
|
{
|
|
/* mShapeType */ 0, // Cylinder
|
|
/* mJointIndex */ 0x08,
|
|
/* mRadius */ 6.0f,
|
|
/* mpOffsets */ sebone_cyl_offset,
|
|
},
|
|
{
|
|
/* mShapeType */ 0, // Cylinder
|
|
/* mJointIndex */ 0x09,
|
|
/* mRadius */ 10.0f,
|
|
/* mpOffsets */ muneA_cyl_offset,
|
|
},
|
|
{
|
|
/* mShapeType */ 0, // Cylinder
|
|
/* mJointIndex */ 0x09,
|
|
/* mRadius */ 6.0f,
|
|
/* mpOffsets */ muneB1_cyl_offset,
|
|
},
|
|
{
|
|
/* mShapeType */ 0, // Cylinder
|
|
/* mJointIndex */ 0x09,
|
|
/* mRadius */ 6.0f,
|
|
/* mpOffsets */ muneB2_cyl_offset,
|
|
},
|
|
{
|
|
/* mShapeType */ 0, // Cylinder
|
|
/* mJointIndex */ 0x09,
|
|
/* mRadius */ 6.0f,
|
|
/* mpOffsets */ muneB3_cyl_offset,
|
|
},
|
|
{
|
|
/* mShapeType */ 0, // Cylinder
|
|
/* mJointIndex */ 0x0F,
|
|
/* mRadius */ 2.0f,
|
|
/* mpOffsets */ ude1_cyl_offset,
|
|
},
|
|
{
|
|
/* mShapeType */ 0, // Cylinder
|
|
/* mJointIndex */ 0x10,
|
|
/* mRadius */ 2.0f,
|
|
/* mpOffsets */ ude2_cyl_offset,
|
|
},
|
|
{
|
|
/* mShapeType */ 0, // Cylinder
|
|
/* mJointIndex */ 0x11,
|
|
/* mRadius */ 6.0f,
|
|
/* mpOffsets */ te_cyl_offset,
|
|
},
|
|
{
|
|
/* mShapeType */ 0, // Cylinder
|
|
/* mJointIndex */ 0x12,
|
|
/* mRadius */ 6.0f,
|
|
/* mpOffsets */ yubi_cyl_offset,
|
|
},
|
|
{
|
|
/* mShapeType */ 0, // Cylinder
|
|
/* mJointIndex */ 0x13,
|
|
/* mRadius */ 2.0f,
|
|
/* mpOffsets */ ude1_cyl_offset,
|
|
},
|
|
{
|
|
/* mShapeType */ 0, // Cylinder
|
|
/* mJointIndex */ 0x14,
|
|
/* mRadius */ 2.0f,
|
|
/* mpOffsets */ ude2_cyl_offset,
|
|
},
|
|
{
|
|
/* mShapeType */ 0, // Cylinder
|
|
/* mJointIndex */ 0x15,
|
|
/* mRadius */ 6.0f,
|
|
/* mpOffsets */ te_cyl_offset,
|
|
},
|
|
{
|
|
/* mShapeType */ 0, // Cylinder
|
|
/* mJointIndex */ 0x16,
|
|
/* mRadius */ 6.0f,
|
|
/* mpOffsets */ yubi_cyl_offset,
|
|
},
|
|
};
|
|
mpJntHit = JntHit_create(mpMorf->getModel(), search_data, ARRAY_SIZE(search_data));
|
|
if (mpJntHit) {
|
|
jntHit = mpJntHit;
|
|
} else {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/* 000009D0-00000A38 .text checkPlayerInAttack__6daRd_cFv */
|
|
bool daRd_c::checkPlayerInAttack() {
|
|
return dLib_checkActorInFan(current.pos, dComIfGp_getLinkPlayer(), shape_angle.y, l_HIO.mAttackSpreadAngle, l_HIO.mAttackRadius, 100.0f);
|
|
}
|
|
|
|
/* 00000A38-00000AA0 .text checkPlayerInCry__6daRd_cFv */
|
|
bool daRd_c::checkPlayerInCry() {
|
|
return dLib_checkActorInFan(current.pos, dComIfGp_getLinkPlayer(), mHeadAngle, l_HIO.mCrySpreadAngle, l_HIO.mCryRadius, 100.0f);
|
|
}
|
|
|
|
/* 00000AA0-00000D78 .text lookBack__6daRd_cFv */
|
|
void daRd_c::lookBack() {
|
|
daPy_py_c* player = (daPy_py_c*)dComIfGp_getLinkPlayer();
|
|
bool r29 = false;
|
|
if (cLib_calcTimer(&mCE4) != 0 && mMode != MODE_ATTACK && mMode != MODE_CRY && mMode != MODE_DEATH) {
|
|
mJntCtrl.clrTrn();
|
|
mJntCtrl.offHeadLock();
|
|
mJntCtrl.offBackBoneLock();
|
|
mTargetPos = player->getHeadTopPos();
|
|
} else {
|
|
switch (mMode) {
|
|
case MODE_WAIT:
|
|
case MODE_DEATH:
|
|
case MODE_ATTACK:
|
|
r29 = false;
|
|
mJntCtrl.clrTrn();
|
|
mJntCtrl.onHeadLock();
|
|
mJntCtrl.onBackBoneLock();
|
|
break;
|
|
case MODE_MOVE:
|
|
case MODE_CRY:
|
|
case MODE_RETURN:
|
|
case MODE_SILENT_PRAY:
|
|
mJntCtrl.setTrn();
|
|
// Fall-through
|
|
default:
|
|
mJntCtrl.offHeadLock();
|
|
mJntCtrl.offBackBoneLock();
|
|
break;
|
|
}
|
|
|
|
switch (mAnmPrmIdx) {
|
|
case AnmPrm_SUWARIP:
|
|
case AnmPrm_TATSU:
|
|
case AnmPrm_SUWARU:
|
|
r29 = false;
|
|
mJntCtrl.clrTrn();
|
|
mJntCtrl.onHeadLock();
|
|
mJntCtrl.onBackBoneLock();
|
|
break;
|
|
}
|
|
|
|
switch (mMode) {
|
|
case MODE_CRY:
|
|
if (dLib_checkActorInFan(current.pos, player, shape_angle.y, l_HIO.mCrySpreadAngle, 150.0f, 100.0f)) {
|
|
mJntCtrl.clrTrn();
|
|
mJntCtrl.onHeadLock();
|
|
mJntCtrl.onBackBoneLock();
|
|
}
|
|
mTargetPos = player->getHeadTopPos();
|
|
break;
|
|
case MODE_RETURN:
|
|
if (dLib_checkActorInCircle(mSpawnPos, this, 100.0f, 1000.0f)) {
|
|
mJntCtrl.clrTrn();
|
|
mJntCtrl.onHeadLock();
|
|
mJntCtrl.onBackBoneLock();
|
|
}
|
|
mTargetPos = mSpawnPos;
|
|
break;
|
|
case MODE_SILENT_PRAY:
|
|
break;
|
|
default:
|
|
mTargetPos = player->getHeadTopPos();
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (mJntCtrl.trnChk()) {
|
|
cLib_addCalcAngleS2(&mMaxHeadTurnVel, l_HIO.mNpc.mMaxHeadTurnVel, 4, 0x800);
|
|
} else {
|
|
mMaxHeadTurnVel = 0;
|
|
}
|
|
|
|
mJntCtrl.lookAtTarget(&shape_angle.y, &mTargetPos, mRdEyePos, shape_angle.y, mMaxHeadTurnVel, r29);
|
|
}
|
|
|
|
/* 00000D78-00001650 .text checkTgHit__6daRd_cFv */
|
|
bool daRd_c::checkTgHit() {
|
|
if (mMode == MODE_DEATH || mMode == MODE_KANOKE || mMode == MODE_SW_WAIT) {
|
|
return false;
|
|
}
|
|
|
|
cCcD_Obj* hitObj;
|
|
|
|
if (mCyl.ChkTgHit()) {
|
|
hitObj = mCyl.GetTgHitObj();
|
|
if (hitObj->GetAtType() == AT_TYPE_LIGHT) {
|
|
fopAcM_seStart(this, JA_SE_CM_PW_BECOME_SOLID, 0);
|
|
modeProcInit(MODE_PARALYSIS);
|
|
return true;
|
|
}
|
|
}
|
|
|
|
daPy_py_c* player = (daPy_py_c*)dComIfGp_getLinkPlayer();
|
|
mStts.Move();
|
|
if (cLib_calcTimer(&m2C4) == 0 && mCyl.ChkTgHit()) {
|
|
bool r29 = true;
|
|
hitObj = mCyl.GetTgHitObj();
|
|
m2C4 = l_HIO.m48;
|
|
if (hitObj == NULL) {
|
|
return false;
|
|
}
|
|
|
|
switch (hitObj->GetAtType()) {
|
|
case AT_TYPE_SWORD:
|
|
case AT_TYPE_MACHETE:
|
|
case AT_TYPE_UNK800:
|
|
case AT_TYPE_DARKNUT_SWORD:
|
|
case AT_TYPE_MOBLIN_SPEAR:
|
|
fopAcM_seStart(this, JA_SE_LK_SW_HIT_S, 0x20);
|
|
|
|
switch (player->getCutType()) {
|
|
case 0x05:
|
|
case 0x06:
|
|
case 0x07:
|
|
case 0x08:
|
|
case 0x09:
|
|
case 0x0A:
|
|
case 0x0C:
|
|
case 0x0E:
|
|
case 0x0F:
|
|
case 0x10:
|
|
case 0x15:
|
|
case 0x17:
|
|
case 0x19:
|
|
case 0x1A:
|
|
case 0x1B:
|
|
mHitType = 1;
|
|
break;
|
|
default:
|
|
mHitType = 0;
|
|
break;
|
|
}
|
|
break;
|
|
case AT_TYPE_WIND:
|
|
r29 = false;
|
|
mHitType = 3;
|
|
mCE0 = 40;
|
|
break;
|
|
case AT_TYPE_BOOMERANG:
|
|
case AT_TYPE_BOKO_STICK:
|
|
r29 = false;
|
|
fopAcM_seStart(this, JA_SE_LK_W_WEP_HIT, 0x44);
|
|
mHitType = 4;
|
|
mCE0 = 40;
|
|
break;
|
|
case AT_TYPE_HOOKSHOT:
|
|
fopAcM_seStart(this, JA_SE_LK_HS_SPIKE, 0x44);
|
|
r29 = false;
|
|
mHitType = 12;
|
|
break;
|
|
case AT_TYPE_SKULL_HAMMER:
|
|
case AT_TYPE_STALFOS_MACE:
|
|
fopAcM_seStart(this, JA_SE_LK_HAMMER_HIT, 0x20);
|
|
mHitType = 7;
|
|
if (player->getCutType() == 0x11) {
|
|
mHitType = 8;
|
|
}
|
|
break;
|
|
case AT_TYPE_BOMB:
|
|
mHitType = 6;
|
|
break;
|
|
case AT_TYPE_ICE_ARROW:
|
|
r29 = false;
|
|
fopAcM_seStart(this, JA_SE_LK_ARROW_HIT, 0x44);
|
|
mEnemyIce.mFreezeDuration = l_HIO.m4A;
|
|
enemy_fire_remove(&mEnemyFire);
|
|
health += 4;
|
|
mHitType = 9;
|
|
break;
|
|
case AT_TYPE_FIRE_ARROW:
|
|
r29 = false;
|
|
fopAcM_seStart(this, JA_SE_LK_ARROW_HIT, 0x44);
|
|
mEnemyFire.mFireDuration = l_HIO.m4C;
|
|
mHitType = 0xA;
|
|
break;
|
|
case AT_TYPE_LIGHT_ARROW:
|
|
r29 = false;
|
|
fopAcM_seStart(this, JA_SE_LK_ARROW_HIT, 0x20);
|
|
mEnemyIce.mLightShrinkTimer = 1;
|
|
mHitType = 0xB;
|
|
break;
|
|
case AT_TYPE_NORMAL_ARROW:
|
|
mHitType = 5;
|
|
if (!dLib_checkActorInCircle(current.pos, player, l_HIO.mCryRadius, 1000.0f)) {
|
|
fopAcM_seStart(this, JA_SE_LK_ARROW_HIT, 0x44);
|
|
mCE0 = 40;
|
|
r29 = false;
|
|
} else {
|
|
fopAcM_seStart(this, JA_SE_LK_ARROW_HIT, 0x20);
|
|
}
|
|
break;
|
|
case AT_TYPE_FIRE:
|
|
case AT_TYPE_UNK20000:
|
|
r29 = false;
|
|
if (mEnemyFire.mState == 0) {
|
|
mEnemyFire.mFireDuration = l_HIO.m4C;
|
|
} else {
|
|
mHitType = 0xD;
|
|
}
|
|
break;
|
|
case AT_TYPE_GRAPPLING_HOOK:
|
|
dComIfGp_particle_set(dPa_name::ID_COMMON_STARS_BLOW, &attention_info.position);
|
|
fopAcM_seStart(this, JA_SE_LK_W_WEP_HIT, 0x44);
|
|
mHitType = 0xE;
|
|
r29 = false;
|
|
mCE0 = 40;
|
|
break;
|
|
}
|
|
|
|
CcAtInfo atInfo;
|
|
atInfo.pParticlePos = NULL;
|
|
atInfo.mpObj = mCyl.GetTgHitObj();
|
|
if (r29) {
|
|
cXyz* hitPos = mCyl.GetTgHitPosP();
|
|
cc_at_check(this, &atInfo);
|
|
if (mHitType == 1 || mHitType == 7 || mHitType == 8 || health <= 0) {
|
|
dComIfGp_particle_set(0x10, mCyl.GetTgHitPosP());
|
|
cXyz scale(2.0f, 2.0f, 2.0f);
|
|
dComIfGp_particle_set(dPa_name::ID_COMMON_BIG_HIT, hitPos, &player->shape_angle, &scale);
|
|
if (health <= 0) {
|
|
modeProcInit(MODE_DEATH);
|
|
} else {
|
|
modeProcInit(MODE_DAMAGE);
|
|
}
|
|
} else {
|
|
dComIfGp_particle_set(dPa_name::ID_COMMON_NORMAL_HIT, hitPos, &player->shape_angle);
|
|
modeProcInit(MODE_DAMAGE);
|
|
}
|
|
} else if (mHitType == 0xE) {
|
|
s8 origHealth = health;
|
|
health = 0xA;
|
|
cc_at_check(this, &atInfo);
|
|
health = origHealth;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
if (dComIfGp_getDetect().chk_light(¤t.pos)) {
|
|
fopAcM_seStart(this, JA_SE_CM_PW_BECOME_SOLID, 0);
|
|
modeProcInit(MODE_PARALYSIS);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/* 00001650-000017D0 .text setCollision__6daRd_cFv */
|
|
void daRd_c::setCollision() {
|
|
if (mMode == MODE_DEATH) {
|
|
mCyl.OffCoSPrmBit(cCcD_CoSPrm_VsEnemy_e);
|
|
mCyl.OffCoSPrmBit(cCcD_CoSPrm_IsEnemy_e);
|
|
mCyl.OffTgSPrmBit(cCcD_TgSPrm_Set_e);
|
|
mCyl.OffTgSPrmBit(cCcD_TgSPrm_IsOther_e);
|
|
} else if (mMode == MODE_ATTACK || mMode == MODE_CRY || dComIfGp_evmng_startCheck("DEFAULT_RD_CRY")) {
|
|
mCyl.OffCoSPrmBit(cCcD_CoSPrm_VsEnemy_e);
|
|
mCyl.OffCoSPrmBit(cCcD_CoSPrm_IsEnemy_e);
|
|
} else {
|
|
mCyl.OnCoSPrmBit(cCcD_CoSPrm_VsEnemy_e);
|
|
mCyl.OnCoSPrmBit(cCcD_CoSPrm_IsEnemy_e);
|
|
}
|
|
|
|
if (isAnm(AnmPrm_SUWARIP)) {
|
|
mCyl.SetR(80.0f + REG8_F(1));
|
|
mCyl.SetH(170.0f + REG8_F(0));
|
|
} else {
|
|
mCyl.SetR(80.0f + REG8_F(1));
|
|
mCyl.SetH(250.0f + REG8_F(0));
|
|
}
|
|
|
|
mCyl.SetC(current.pos);
|
|
dComIfG_Ccsp()->Set(&mCyl);
|
|
}
|
|
|
|
/* 000017D0-0000180C .text setIceCollision__6daRd_cFv */
|
|
void daRd_c::setIceCollision() {
|
|
if (isAnm(AnmPrm_SUWARIP)) {
|
|
mEnemyIce.mWallRadius = 50.0f;
|
|
mEnemyIce.mCylHeight = 170.0f;
|
|
} else {
|
|
mEnemyIce.mWallRadius = 50.0f;
|
|
mEnemyIce.mCylHeight = 250.0f;
|
|
}
|
|
}
|
|
|
|
/* 0000180C-00001970 .text setAttention__6daRd_cFv */
|
|
void daRd_c::setAttention() {
|
|
cXyz attnPos(60.0f, 0.0f, 0.0f);
|
|
cXyz eyeballPos(60.0f, 0.0f, 0.0f);
|
|
mDoMtx_stack_c::copy(mpMorf->getModel()->getAnmMtx(0x0C)); // ree_atama_1 joint
|
|
mDoMtx_stack_c::multVec(&attnPos, &attention_info.position);
|
|
mDoMtx_stack_c::multVecZero(&eyeballPos);
|
|
eyePos = eyeballPos;
|
|
attention_info.position.y += l_HIO.m58;
|
|
eyePos.y += l_HIO.m5C;
|
|
|
|
if (dComIfGp_event_runCheck()) {
|
|
attention_info.position = current.pos;
|
|
eyePos = current.pos;
|
|
attention_info.position.y += 150.0f;
|
|
eyePos.y += 150.0f;
|
|
}
|
|
|
|
if (mEnemyIce.mFreezeTimer > 20) {
|
|
fopAcM_OffStatus(this, fopAcStts_UNK200000_e);
|
|
} else {
|
|
fopAcM_OnStatus(this, fopAcStts_UNK200000_e);
|
|
}
|
|
}
|
|
|
|
/* 00001970-000019F8 .text setMtx__6daRd_cFv */
|
|
void daRd_c::setMtx() {
|
|
J3DModel* model = mpMorf->getModel();
|
|
model->setBaseScale(scale);
|
|
mDoMtx_stack_c::transS(current.pos);
|
|
mDoMtx_stack_c::YrotM(shape_angle.y);
|
|
model->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
}
|
|
|
|
/* 000019F8-00001A3C .text modeWaitInit__6daRd_cFv */
|
|
void daRd_c::modeWaitInit() {
|
|
mAcchCir.SetWallR(60.0f);
|
|
speedF = 0.0f;
|
|
}
|
|
|
|
/* 00001A3C-00001DDC .text modeWait__6daRd_cFv */
|
|
void daRd_c::modeWait() {
|
|
if (checkTgHit()) {
|
|
return;
|
|
}
|
|
|
|
speedF = 0.0f;
|
|
fopAc_ac_c* player = dComIfGp_getLinkPlayer();
|
|
BOOL isOto = fopAcM_otoCheck(this, mAreaRadius);
|
|
if (!isLinkControl()) {
|
|
if (dLib_checkActorInCircle(mSpawnPos, this, mAreaRadius, 1000.0f)) {
|
|
// The ReDead will only wake up if the player is in a 200-unit-tall cylinder around its spawn point.
|
|
// Bug: If the ReDead spawned high up in the air, its spawn point will remain there even after the ReDead
|
|
// itself has fallen down to ground level. This means it will not be able to notice the player properly.
|
|
if (dLib_checkActorInCircle(mSpawnPos, player, mAreaRadius, 100.0f)) {
|
|
if ((dLib_checkActorInCircle(mSpawnPos, player, mAreaRadius, 100.0f) && player->speedF > 10.0f + REG12_F(4)) ||
|
|
isOto ||
|
|
dLib_checkActorInFan(current.pos, player, shape_angle.y, l_HIO.m40, l_HIO.m34, 100.0f)
|
|
) {
|
|
modeProcInit(MODE_MOVE);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (dLib_checkActorInCircle(mSpawnPos, this, 100.0f, 1000.0f)) {
|
|
cLib_addCalcAngleS2(&shape_angle.y, mSpawnAngle, 0x4, 0x200);
|
|
if (cLib_distanceAngleS(shape_angle.y, mSpawnAngle) <= 0x200) {
|
|
shape_angle.y = mSpawnAngle;
|
|
if (mWhichIdleAnm == 1 && !isAnm(AnmPrm_SUWARIP)) {
|
|
setAnm(AnmPrm_SUWARU, false);
|
|
}
|
|
if (mWhichIdleAnm == 0) {
|
|
setAnm(AnmPrm_TACHIP1, false);
|
|
}
|
|
}
|
|
} else if (!dLib_checkActorInCircle(mSpawnPos, this, mAreaRadius, 1000.0f) ||
|
|
!dLib_checkActorInCircle(mSpawnPos, player, mAreaRadius, 100.0f)
|
|
) {
|
|
modeProcInit(MODE_RETURN);
|
|
return;
|
|
}
|
|
if (!isLinkControl() && checkPlayerInAttack() && isAnm(AnmPrm_TACHIP1)) {
|
|
modeProcInit(MODE_ATTACK);
|
|
}
|
|
}
|
|
|
|
/* 00001DDC-00001E68 .text modeDeathInit__6daRd_cFv */
|
|
void daRd_c::modeDeathInit() {
|
|
fopAcM_monsSeStart(this, JA_SE_CV_RD_DIE, 0);
|
|
setAnm(AnmPrm_DEAD, false);
|
|
speedF = 0.0f;
|
|
mTimer1 = 10*30;
|
|
}
|
|
|
|
/* 00001E68-00001F14 .text modeDeath__6daRd_cFv */
|
|
void daRd_c::modeDeath() {
|
|
if (!mpMorf->isStop()) {
|
|
return;
|
|
}
|
|
|
|
fopAcM_onActor(this);
|
|
|
|
// Do not consider the ReDead to be a living enemy while its death animation is playing out.
|
|
fopAcM_SetGroup(this, fopAc_ENV_e);
|
|
|
|
if (cLib_calcTimer(&mTimer1) == 0) {
|
|
fopAcM_createDisappear(this, ¤t.pos, 5);
|
|
fopAcM_delete(this);
|
|
}
|
|
}
|
|
|
|
/* 00001F14-00001F98 .text modeDamageInit__6daRd_cFv */
|
|
void daRd_c::modeDamageInit() {
|
|
fopAcM_monsSeStart(this, JA_SE_CV_RD_DAMAGE, 0);
|
|
setAnm(AnmPrm_DAMAGE, true);
|
|
speedF = 0.0f;
|
|
}
|
|
|
|
/* 00001F98-00002084 .text modeDamage__6daRd_cFv */
|
|
void daRd_c::modeDamage() {
|
|
if (checkTgHit()) {
|
|
return;
|
|
}
|
|
fopAc_ac_c* player = dComIfGp_getLinkPlayer();
|
|
if (!mpMorf->isStop()) {
|
|
return;
|
|
}
|
|
|
|
if (dLib_checkActorInCircle(mSpawnPos, player, mAreaRadius, 100.0f)) {
|
|
modeProcInit(MODE_MOVE);
|
|
} else {
|
|
modeProcInit(MODE_WAIT);
|
|
}
|
|
}
|
|
|
|
/* 00002084-000020EC .text modeParalysisInit__6daRd_cFv */
|
|
void daRd_c::modeParalysisInit() {
|
|
if (!isAnm(AnmPrm_BEAM_HIT) && !isAnm(AnmPrm_BEAM)) {
|
|
setAnm(AnmPrm_BEAM_HIT, false);
|
|
}
|
|
mTimer1 = l_HIO.mParalysisDuration;
|
|
speedF = 0.0f;
|
|
}
|
|
|
|
/* 000020EC-000021F0 .text modeParalysis__6daRd_cFv */
|
|
void daRd_c::modeParalysis() {
|
|
if (isAnm(AnmPrm_BEAM_HIT) && mpMorf->isStop()) {
|
|
setAnm(AnmPrm_BEAM, false);
|
|
} else if (isAnm(AnmPrm_BEAM)) {
|
|
if (cLib_calcTimer(&mTimer1) == 0) {
|
|
setAnm(AnmPrm_BEAM_END, false);
|
|
}
|
|
} else if (isAnm(AnmPrm_BEAM_END) && mpMorf->isStop()) {
|
|
modeProcInit(MODE_WAIT);
|
|
}
|
|
|
|
if (checkTgHit()) {
|
|
// This line setting speedF to itself gets optimized out and produces no code, but affects codegen.
|
|
// It's not known what the original code that got optimized out here was, it could be speedF or something else.
|
|
speedF = speedF;
|
|
}
|
|
}
|
|
|
|
/* 000021F0-0000223C .text modeMoveInit__6daRd_cFv */
|
|
void daRd_c::modeMoveInit() {
|
|
if (mWhichIdleAnm == 1 && (isAnm(AnmPrm_SUWARIP) || isAnm(AnmPrm_SUWARU))) {
|
|
setAnm(AnmPrm_TATSU, false);
|
|
}
|
|
}
|
|
|
|
/* 0000223C-000024B0 .text modeMove__6daRd_cFv */
|
|
void daRd_c::modeMove() {
|
|
if (!checkTgHit() && !isAnm(AnmPrm_TATSU)) {
|
|
if (!isLinkControl() && checkPlayerInCry()) {
|
|
modeProcInit(MODE_CRY);
|
|
return;
|
|
}
|
|
daPy_py_c* player = (daPy_py_c*)dComIfGp_getLinkPlayer();
|
|
if (!dLib_checkActorInCircle(mSpawnPos, this, mAreaRadius, 1000.0f) || !dLib_checkActorInCircle(mSpawnPos, player, mAreaRadius, 100.0f)) {
|
|
modeProcInit(MODE_RETURN);
|
|
return;
|
|
}
|
|
int angle = cLib_distanceAngleS(fopAcM_searchPlayerAngleY(this), mHeadAngle);
|
|
if (angle < 0x50) {
|
|
f32 dist = fopAcM_searchPlayerDistanceXZ(this);
|
|
f32 temp = (dist / 100.0f) + REG12_F(3);
|
|
if (temp > 1.0f) {
|
|
temp = 1.0f;
|
|
}
|
|
if (temp < 0.1f) {
|
|
temp = 0.1f;
|
|
}
|
|
f32 temp2 = l_HIO.m68;
|
|
if (mEnemyFire.mState != 0) {
|
|
temp2 *= 2.0f;
|
|
}
|
|
cLib_addCalc2(&speedF, temp2*temp, 0.1f, 0.1f + REG12_F(0));
|
|
} else {
|
|
cLib_addCalc2(&speedF, 0.0f, 0.1f, 0.1f + REG12_F(0));
|
|
}
|
|
if (speedF < 0.1f) {
|
|
setAnm(AnmPrm_TACHIP1, false);
|
|
} else {
|
|
setAnm(AnmPrm_WALK, false);
|
|
}
|
|
if (!isLinkControl() && checkPlayerInAttack()) {
|
|
modeProcInit(MODE_ATTACK);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 000024B0-000025A8 .text modeCryInit__6daRd_cFv */
|
|
void daRd_c::modeCryInit() {
|
|
if (isLinkControl()) {
|
|
modeProcInit(MODE_RETURN);
|
|
return;
|
|
}
|
|
if (dComIfGp_evmng_startCheck("DEFAULT_RD_CRY")) {
|
|
dComIfGp_event_reset();
|
|
}
|
|
fopAcM_orderOtherEvent(this, "DEFAULT_RD_CRY");
|
|
fopAcM_monsSeStart(this, JA_SE_CV_RD_SCREAM, 0);
|
|
mTimer1 = l_HIO.m54;
|
|
mBreakFreeCounter = l_HIO.m78;
|
|
}
|
|
|
|
/* 000025A8-000028B8 .text modeCry__6daRd_cFv */
|
|
void daRd_c::modeCry() {
|
|
setAnm(AnmPrm_WALK, false);
|
|
|
|
f32 stickPosX = g_mDoCPd_cpadInfo[0].mMainStickPosX;
|
|
f32 stickPosY = g_mDoCPd_cpadInfo[0].mMainStickPosY;
|
|
if (eventInfo.checkCommandDemoAccrpt() || dComIfGp_evmng_startCheck("DEFAULT_RD_CRY")) {
|
|
if (isLinkControl()) {
|
|
dComIfGp_event_reset();
|
|
modeProcInit(MODE_RETURN);
|
|
} else if (checkTgHit()) {
|
|
dComIfGp_event_reset();
|
|
} else {
|
|
s16 targetY = fopAcM_searchPlayerAngleY(this);
|
|
f32 dist = fopAcM_searchPlayerDistanceXZ(this);
|
|
f32 temp = (dist / 100.0f) + REG12_F(3);
|
|
if (temp > 1.0f) {
|
|
temp = 1.0f;
|
|
}
|
|
if (temp < 0.1f) {
|
|
temp = 0.1f;
|
|
}
|
|
f32 temp2 = l_HIO.m68;
|
|
if (mEnemyFire.mState != 0) {
|
|
temp2 *= 2.0f;
|
|
}
|
|
cLib_addCalc2(&speedF, temp2*temp, 0.1f, 0.1f + REG12_F(0));
|
|
|
|
if (mD3C > 0 && stickPosX < 0.0f) {
|
|
mD3C = -1;
|
|
mBreakFreeCounter--;
|
|
} else if (mD3C < 0 && stickPosX > 0.0f) {
|
|
mD3C = 1;
|
|
mBreakFreeCounter--;
|
|
}
|
|
|
|
if (mD40 > 0 && stickPosY < 0.0f) {
|
|
mD40 = -1;
|
|
mBreakFreeCounter--;
|
|
} else if (mD40 < 0 && stickPosY > 0.0f) {
|
|
mD40 = 1;
|
|
mBreakFreeCounter--;
|
|
}
|
|
|
|
if (CPad_CHECK_TRIG_A(0) || CPad_CHECK_TRIG_B(0) || CPad_CHECK_TRIG_X(0) || CPad_CHECK_TRIG_Y(0)) {
|
|
mBreakFreeCounter--;
|
|
}
|
|
|
|
if (cLib_calcTimer(&mTimer1) == 0 || mBreakFreeCounter < 0) {
|
|
dComIfGp_event_reset();
|
|
modeProcInit(MODE_CRY_WAIT);
|
|
} else if (checkPlayerInAttack()) {
|
|
dComIfGp_event_reset();
|
|
modeProcInit(MODE_ATTACK);
|
|
}
|
|
}
|
|
} else {
|
|
modeProcInit(MODE_CRY_WAIT);
|
|
}
|
|
}
|
|
|
|
/* 000028B8-000028CC .text modeCryWaitInit__6daRd_cFv */
|
|
void daRd_c::modeCryWaitInit() {
|
|
mTimer1 = 60;
|
|
mTimer2 = 45;
|
|
}
|
|
|
|
/* 000028CC-000029E4 .text modeCryWait__6daRd_cFv */
|
|
void daRd_c::modeCryWait() {
|
|
if (checkTgHit()) {
|
|
return;
|
|
}
|
|
if (isLinkControl()) {
|
|
modeProcInit(MODE_RETURN);
|
|
return;
|
|
}
|
|
if (dComIfGp_evmng_startCheck("DEFAULT_RD_CRY")) {
|
|
onIkari();
|
|
setBtkAnm(3);
|
|
}
|
|
if (dComIfGp_event_runCheck()) {
|
|
mTimer1 = 60;
|
|
mTimer2 = 45;
|
|
} else if (isAnm(AnmPrm_WALK)) {
|
|
if (cLib_calcTimer(&mTimer1) == 0) {
|
|
modeProcInit(MODE_MOVE);
|
|
} else if (cLib_calcTimer(&mTimer2) == 0 && checkPlayerInAttack()) {
|
|
modeProcInit(MODE_ATTACK);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 000029E4-00002A58 .text modeAttackInit__6daRd_cFv */
|
|
void daRd_c::modeAttackInit() {
|
|
mAcchCir.SetWallR(70.0f);
|
|
mTimer1 = l_HIO.m52;
|
|
mBreakFreeCounter = l_HIO.m50;
|
|
mTimer2 = 30;
|
|
setAnm(AnmPrm_WALK, false);
|
|
speedF = 0.0f;
|
|
}
|
|
|
|
/* 00002A58-00002F30 .text modeAttack__6daRd_cFv */
|
|
void daRd_c::modeAttack() {
|
|
if (dComIfGp_evmng_startCheck("DEFAULT_RD_CRY")) {
|
|
dComIfGp_event_reset();
|
|
}
|
|
if ((dComIfGp_evmng_startCheck("DEFAULT_RD_CRY") || dComIfGp_evmng_startCheck("DEFAULT_RD_ATTACK")) && isLinkControl()) {
|
|
dComIfGp_event_reset();
|
|
modeProcInit(MODE_RETURN);
|
|
return;
|
|
}
|
|
|
|
f32 stickPosX = g_mDoCPd_cpadInfo[0].mMainStickPosX;
|
|
f32 stickPosY = g_mDoCPd_cpadInfo[0].mMainStickPosY;
|
|
if (eventInfo.checkCommandDemoAccrpt()) {
|
|
daPy_py_c* player = (daPy_py_c*)dComIfGp_getLinkPlayer();
|
|
if (isAnm(AnmPrm_ATACK)) {
|
|
f32 frame = player->getBaseAnimeFrame();
|
|
mpMorf->setFrame(frame);
|
|
cLib_addCalcAngleS2(&shape_angle.y, player->shape_angle.y, 0x4, 0x2000);
|
|
} else {
|
|
s16 targetY = fopAcM_searchPlayerAngleY(this);
|
|
cLib_addCalcAngleS2(&shape_angle.y, targetY, 0x4, 0x2000);
|
|
}
|
|
|
|
if (checkTgHit()) {
|
|
dComIfGp_event_reset();
|
|
return;
|
|
}
|
|
f32 dist = fopAcM_searchPlayerDistanceXZ(this);
|
|
if (dist <= 50.0f + REG12_F(5) && !isAnm(AnmPrm_ATACK)) {
|
|
offIkari();
|
|
setAnm(AnmPrm_WALK2ATACK, false);
|
|
}
|
|
if (dist <= 20.0f + REG12_F(2)) {
|
|
cLib_addCalcPosXZ2(¤t.pos, player->current.pos, 0.3f, 1.0f);
|
|
if (cLib_calcTimer(&mTimer2) == 0) {
|
|
if (!daPy_getPlayerLinkActorClass()->checkNoDamageMode()) {
|
|
daPy_getPlayerLinkActorClass()->setDamagePoint(-1.0f);
|
|
}
|
|
mTimer2 = 30;
|
|
}
|
|
} else if (mAcch.ChkWallHit()) {
|
|
player->changeOriginalDemo();
|
|
cXyz pos = player->current.pos;
|
|
cLib_addCalcPosXZ2(&pos, current.pos, 0.3f, 10.0f);
|
|
player->setPlayerPosAndAngle(&pos, player->shape_angle.y);
|
|
} else {
|
|
cLib_addCalcPosXZ2(¤t.pos, player->current.pos, 0.3f, 10.0f);
|
|
}
|
|
|
|
if (dComIfGs_getLife() == 0) {
|
|
dComIfGp_event_reset();
|
|
setAnm(AnmPrm_ATACK2WALK, false);
|
|
modeProcInit(MODE_WAIT);
|
|
return;
|
|
}
|
|
|
|
if (mD3C > 0 && stickPosX < 0.0f) {
|
|
mD3C = -1;
|
|
mBreakFreeCounter--;
|
|
} else if (mD3C < 0 && stickPosX > 0.0f) {
|
|
mD3C = 1;
|
|
mBreakFreeCounter--;
|
|
}
|
|
|
|
if (mD40 > 0 && stickPosY < 0.0f) {
|
|
mD40 = -1;
|
|
mBreakFreeCounter--;
|
|
} else if (mD40 < 0 && stickPosY > 0.0f) {
|
|
mD40 = 1;
|
|
mBreakFreeCounter--;
|
|
}
|
|
|
|
if (CPad_CHECK_TRIG_A(0) || CPad_CHECK_TRIG_B(0) || CPad_CHECK_TRIG_X(0) || CPad_CHECK_TRIG_Y(0)) {
|
|
mBreakFreeCounter--;
|
|
}
|
|
|
|
if (cLib_calcTimer(&mTimer1) == 0 || mBreakFreeCounter < 0) {
|
|
dComIfGp_event_reset();
|
|
setAnm(AnmPrm_ATACK2WALK, false);
|
|
modeProcInit(MODE_CRY_WAIT);
|
|
}
|
|
} else if (!checkTgHit()) {
|
|
fopAcM_orderOtherEvent(this, "DEFAULT_RD_ATTACK", 0x1CF);
|
|
}
|
|
}
|
|
|
|
/* 00002F30-00002F34 .text modeReturnInit__6daRd_cFv */
|
|
void daRd_c::modeReturnInit() {
|
|
}
|
|
|
|
/* 00002F34-00003208 .text modeReturn__6daRd_cFv */
|
|
void daRd_c::modeReturn() {
|
|
if (checkTgHit()) {
|
|
return;
|
|
}
|
|
|
|
setAnm(AnmPrm_WALK, false);
|
|
|
|
if (dLib_checkActorInCircle(mSpawnPos, this, 100.0f, 1000.0f)) {
|
|
speedF = 0.0f;
|
|
cLib_addCalcAngleS2(&shape_angle.y, mSpawnAngle, 0xA, 0x200);
|
|
if (cLib_distanceAngleS(shape_angle.y, mSpawnAngle) <= 0x200) {
|
|
shape_angle.y = mSpawnAngle;
|
|
modeProcInit(MODE_WAIT);
|
|
return;
|
|
}
|
|
} else {
|
|
cLib_addCalc2(&speedF, l_HIO.mReturnWalkSpeed, 0.1f, 0.1f + REG12_F(0));
|
|
}
|
|
|
|
if (dComIfGp_evmng_startCheck("DEFAULT_RD_ATTACK")) {
|
|
return;
|
|
}
|
|
|
|
daPy_py_c* player = (daPy_py_c*)dComIfGp_getLinkPlayer();
|
|
BOOL isOto = fopAcM_otoCheck(this, mAreaRadius);
|
|
if (!isLinkControl()) {
|
|
if (dLib_checkActorInCircle(mSpawnPos, this, mAreaRadius, 1000.0f)) {
|
|
if (dLib_checkActorInCircle(mSpawnPos, player, mAreaRadius, 100.0f)) {
|
|
if ((dLib_checkActorInCircle(mSpawnPos, player, mAreaRadius, 100.0f) && player->speedF > 10.0f + REG12_F(4)) ||
|
|
isOto ||
|
|
dLib_checkActorInFan(current.pos, player, shape_angle.y, l_HIO.m40, l_HIO.m34, 100.0f)
|
|
) {
|
|
modeProcInit(MODE_MOVE);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 00003208-0000320C .text modeSilentPrayInit__6daRd_cFv */
|
|
void daRd_c::modeSilentPrayInit() {
|
|
}
|
|
|
|
/* 0000320C-00003400 .text modeSilentPray__6daRd_cFv */
|
|
void daRd_c::modeSilentPray() {
|
|
if (checkTgHit()) {
|
|
return;
|
|
}
|
|
|
|
setAnm(AnmPrm_WALK, false);
|
|
|
|
daPy_py_c* player = (daPy_py_c*)dComIfGp_getLinkPlayer();
|
|
fopAc_ac_c* corpse;
|
|
if (fopAcM_SearchByID(mCorpseID, &corpse)) {
|
|
mTargetPos = corpse->current.pos;
|
|
if (dLib_checkActorInCircle(mTargetPos, this, 200.0f, 1000.0f)) {
|
|
setAnm(AnmPrm_TACHIP1, false);
|
|
speedF = 0.0f;
|
|
} else {
|
|
cLib_addCalc2(&speedF, l_HIO.mReturnWalkSpeed, 0.1f, 0.1f + REG12_F(0));
|
|
}
|
|
} else if (!isLinkControl()) {
|
|
if (dLib_checkActorInCircle(mSpawnPos, player, mAreaRadius, 100.0f)) {
|
|
modeProcInit(MODE_MOVE);
|
|
} else {
|
|
modeProcInit(MODE_WAIT);
|
|
}
|
|
} else {
|
|
modeProcInit(MODE_RETURN);
|
|
}
|
|
|
|
if (!isLinkControl()) {
|
|
if (checkPlayerInCry()) {
|
|
modeProcInit(MODE_CRY);
|
|
}
|
|
if (checkPlayerInAttack()) {
|
|
modeProcInit(MODE_ATTACK);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 00003400-00003428 .text modeSwWaitInit__6daRd_cFv */
|
|
void daRd_c::modeSwWaitInit() {
|
|
setAnm(AnmPrm_KANOKEP, false);
|
|
}
|
|
|
|
/* 00003428-00003480 .text modeSwWait__6daRd_cFv */
|
|
void daRd_c::modeSwWait() {
|
|
if (dComIfGs_isSwitch(mSwNo, current.roomNo)) {
|
|
modeProcInit(MODE_KANOKE);
|
|
}
|
|
}
|
|
|
|
/* 00003480-00003514 .text modeKanokeInit__6daRd_cFv */
|
|
void daRd_c::modeKanokeInit() {
|
|
setAnm(AnmPrm_KANOKEP, false);
|
|
mTimer1 = 90;
|
|
cXyz offset(0.0f, 0.0f, 150.0f);
|
|
mDoMtx_stack_c::transS(current.pos);
|
|
mDoMtx_stack_c::YrotM(shape_angle.y);
|
|
mDoMtx_stack_c::multVec(&offset, &mSpawnPos);
|
|
}
|
|
|
|
/* 00003514-0000355C .text modeKanoke__6daRd_cFv */
|
|
void daRd_c::modeKanoke() {
|
|
if (cLib_calcTimer(&mTimer1) == 0) {
|
|
modeProcInit(MODE_RETURN);
|
|
}
|
|
}
|
|
|
|
/* 0000355C-000038D4 .text modeProc__6daRd_cFQ26daRd_c6Proc_ei */
|
|
void daRd_c::modeProc(daRd_c::Proc_e proc, int newMode) {
|
|
struct ModeEntry {
|
|
ModeFunc init;
|
|
ModeFunc run;
|
|
const char* name;
|
|
};
|
|
|
|
static ModeEntry mode_tbl[] = {
|
|
{
|
|
&daRd_c::modeWaitInit,
|
|
&daRd_c::modeWait,
|
|
"WAIT",
|
|
},
|
|
{
|
|
&daRd_c::modeDamageInit,
|
|
&daRd_c::modeDamage,
|
|
"DAMAGE",
|
|
},
|
|
{
|
|
&daRd_c::modeParalysisInit,
|
|
&daRd_c::modeParalysis,
|
|
"PARALYSIS",
|
|
},
|
|
{
|
|
&daRd_c::modeDeathInit,
|
|
&daRd_c::modeDeath,
|
|
"DEATH",
|
|
},
|
|
{
|
|
&daRd_c::modeMoveInit,
|
|
&daRd_c::modeMove,
|
|
"MOVE",
|
|
},
|
|
{
|
|
&daRd_c::modeCryInit,
|
|
&daRd_c::modeCry,
|
|
"CRY",
|
|
},
|
|
{
|
|
&daRd_c::modeCryWaitInit,
|
|
&daRd_c::modeCryWait,
|
|
"CRY_WAIT",
|
|
},
|
|
{
|
|
&daRd_c::modeAttackInit,
|
|
&daRd_c::modeAttack,
|
|
"ATTACK",
|
|
},
|
|
{
|
|
&daRd_c::modeReturnInit,
|
|
&daRd_c::modeReturn,
|
|
"RETURN",
|
|
},
|
|
{
|
|
&daRd_c::modeSilentPrayInit,
|
|
&daRd_c::modeSilentPray,
|
|
"SILENT_PRAY",
|
|
},
|
|
{
|
|
&daRd_c::modeSwWaitInit,
|
|
&daRd_c::modeSwWait,
|
|
"SW_WAIT",
|
|
},
|
|
{
|
|
&daRd_c::modeKanokeInit,
|
|
&daRd_c::modeKanoke,
|
|
"KANOKE",
|
|
},
|
|
};
|
|
|
|
if (proc == PROC_INIT) {
|
|
if (newMode == MODE_CRY || newMode == MODE_ATTACK) {
|
|
onIkari();
|
|
setBtkAnm(3);
|
|
} else if (newMode != MODE_DAMAGE) {
|
|
offIkari();
|
|
setBtkAnm(4);
|
|
}
|
|
|
|
if (newMode == MODE_DEATH || newMode == MODE_SW_WAIT) {
|
|
fopAcM_OffStatus(this, fopAcStts_SHOWMAP_e);
|
|
cLib_offBit<u32>(attention_info.flags, fopAc_Attn_LOCKON_BATTLE_e);
|
|
} else {
|
|
fopAcM_OnStatus(this, fopAcStts_SHOWMAP_e);
|
|
cLib_onBit<u32>(attention_info.flags, fopAc_Attn_LOCKON_BATTLE_e);
|
|
}
|
|
|
|
mMode = newMode;
|
|
(this->*mode_tbl[mMode].init)();
|
|
} else if (proc == PROC_EXEC) {
|
|
(this->*mode_tbl[mMode].run)();
|
|
}
|
|
}
|
|
|
|
/* 000038D4-000039AC .text setBrkAnm__6daRd_cFSc */
|
|
void daRd_c::setBrkAnm(s8 idx) {
|
|
static const int a_anm_idx_tbl[] = {
|
|
RD_BRK_NML,
|
|
RD_BRK_BEAM_HIT,
|
|
RD_BRK_BEAM,
|
|
RD_BRK_BEAM_END,
|
|
};
|
|
static const int a_play_mod_tbl[] = {
|
|
J3DFrameCtrl::LOOP_ONCE_e,
|
|
J3DFrameCtrl::LOOP_ONCE_e,
|
|
J3DFrameCtrl::LOOP_REPEAT_e,
|
|
J3DFrameCtrl::LOOP_ONCE_e,
|
|
};
|
|
|
|
J3DModel* model = mpMorf->getModel();
|
|
J3DAnmTevRegKey* brk = static_cast<J3DAnmTevRegKey*>(dComIfG_getObjectRes(m_arc_name, a_anm_idx_tbl[idx]));
|
|
JUT_ASSERT(1890, brk != NULL);
|
|
mBrkAnm.init(model->getModelData(), brk, true, a_play_mod_tbl[idx], 1.0f, 0, -1, true, 0);
|
|
}
|
|
|
|
/* 000039AC-00003B3C .text setBtkAnm__6daRd_cFSc */
|
|
void daRd_c::setBtkAnm(s8 idx) {
|
|
static const int a_anm_idx_tbl[] = {
|
|
RD_BTK_RD_IKARI,
|
|
RD_BTK_RD_NML,
|
|
RD_BTK_RD_OPEN,
|
|
RD_BTK_RD_CLOSE,
|
|
};
|
|
struct anm_prm_struct {
|
|
s8 m00;
|
|
s8 m01;
|
|
int loopMode;
|
|
};
|
|
static const anm_prm_struct a_anm_prm_tbl[] = {
|
|
{0x01, -1, J3DFrameCtrl::LOOP_ONCE_e},
|
|
{0x00, -1, J3DFrameCtrl::LOOP_REPEAT_e},
|
|
{0x01, -1, J3DFrameCtrl::LOOP_REPEAT_e},
|
|
{0x02, 0x01, J3DFrameCtrl::LOOP_ONCE_e},
|
|
{0x03, 0x02, J3DFrameCtrl::LOOP_ONCE_e},
|
|
};
|
|
|
|
if (idx != 5) {
|
|
m6DB = idx;
|
|
}
|
|
|
|
int r5 = a_anm_prm_tbl[m6DB].m00;
|
|
if (m6DC != m6DB && r5 != -1) {
|
|
J3DAnmTextureSRTKey* btk = static_cast<J3DAnmTextureSRTKey*>(dComIfG_getObjectRes(m_arc_name, a_anm_idx_tbl[r5]));
|
|
JUT_ASSERT(1930, btk != NULL);
|
|
J3DModelData* modelData = mpMorf->getModel()->getModelData();
|
|
mBtkAnm.init(modelData, btk, true, a_anm_prm_tbl[m6DB].loopMode, 1.0f, 0, -1, true, 0);
|
|
|
|
if (mBtkAnm.isStop()) {
|
|
if (a_anm_prm_tbl[m6DB].m01 != -1 && a_anm_prm_tbl[m6DB].loopMode == J3DFrameCtrl::LOOP_ONCE_e) {
|
|
m6DB = a_anm_prm_tbl[m6DB].m01;
|
|
}
|
|
}
|
|
}
|
|
|
|
m6DC = m6DB;
|
|
}
|
|
|
|
/* 00003B3C-00003C48 .text setAnm__6daRd_cFScb */
|
|
void daRd_c::setAnm(s8 anmPrmIdx, bool param_2) {
|
|
static const int a_anm_bcks_tbl[] = {
|
|
RD_BCK_TACHIP,
|
|
RD_BCK_SUWARIP,
|
|
RD_BCK_WALK2ATACK,
|
|
RD_BCK_ATACK,
|
|
RD_BCK_ATACK2WALK,
|
|
RD_BCK_WALK,
|
|
RD_BCK_DAMAGE,
|
|
RD_BCK_DEAD,
|
|
RD_BCK_TATSU,
|
|
RD_BCK_SUWARU,
|
|
RD_BCK_KANOKEP,
|
|
RD_BCK_BEAM_HIT,
|
|
RD_BCK_BEAM,
|
|
RD_BCK_BEAM_END,
|
|
};
|
|
static const dLib_anm_prm_c a_anm_prm_tbl[] = {
|
|
{
|
|
// AnmPrm_TACHIP0
|
|
/* mBckIdx */ BckIdx_TACHIP,
|
|
/* mNextPrmIdx */ -1,
|
|
/* field_0x02 */ 0,
|
|
/* mMorf */ 8.0f,
|
|
/* mPlaySpeed */ 1.0f,
|
|
/* mLoopMode */ J3DFrameCtrl::LOOP_REPEAT_e
|
|
},
|
|
{
|
|
// AnmPrm_TACHIP1
|
|
/* mBckIdx */ BckIdx_TACHIP,
|
|
/* mNextPrmIdx */ -1,
|
|
/* field_0x02 */ 0,
|
|
/* mMorf */ 8.0f,
|
|
/* mPlaySpeed */ 1.0f,
|
|
/* mLoopMode */ J3DFrameCtrl::LOOP_REPEAT_e
|
|
},
|
|
{
|
|
// AnmPrm_SUWARIP
|
|
/* mBckIdx */ BckIdx_SUWARIP,
|
|
/* mNextPrmIdx */ -1,
|
|
/* field_0x02 */ 0,
|
|
/* mMorf */ 8.0f,
|
|
/* mPlaySpeed */ 1.0f,
|
|
/* mLoopMode */ J3DFrameCtrl::LOOP_REPEAT_e
|
|
},
|
|
{
|
|
// AnmPrm_WALK2ATACK
|
|
/* mBckIdx */ BckIdx_WALK2ATACK,
|
|
/* mNextPrmIdx */ AnmPrm_ATACK,
|
|
/* field_0x02 */ 0,
|
|
/* mMorf */ 8.0f,
|
|
/* mPlaySpeed */ 1.0f,
|
|
/* mLoopMode */ J3DFrameCtrl::LOOP_ONCE_e
|
|
},
|
|
{
|
|
// AnmPrm_ATACK
|
|
/* mBckIdx */ BckIdx_ATACK,
|
|
/* mNextPrmIdx */ -1,
|
|
/* field_0x02 */ 0,
|
|
/* mMorf */ 8.0f,
|
|
/* mPlaySpeed */ 1.0f,
|
|
/* mLoopMode */ J3DFrameCtrl::LOOP_REPEAT_e
|
|
},
|
|
{
|
|
// AnmPrm_ATACK2WALK
|
|
/* mBckIdx */ BckIdx_ATACK2WALK,
|
|
/* mNextPrmIdx */ AnmPrm_WALK,
|
|
/* field_0x02 */ 0,
|
|
/* mMorf */ 8.0f,
|
|
/* mPlaySpeed */ 1.0f,
|
|
/* mLoopMode */ J3DFrameCtrl::LOOP_ONCE_e
|
|
},
|
|
{
|
|
// AnmPrm_WALK
|
|
/* mBckIdx */ BckIdx_WALK,
|
|
/* mNextPrmIdx */ -1,
|
|
/* field_0x02 */ 0,
|
|
/* mMorf */ 8.0f,
|
|
/* mPlaySpeed */ 1.0f,
|
|
/* mLoopMode */ J3DFrameCtrl::LOOP_REPEAT_e
|
|
},
|
|
{
|
|
// AnmPrm_DAMAGE
|
|
/* mBckIdx */ BckIdx_DAMAGE,
|
|
/* mNextPrmIdx */ AnmPrm_TACHIP1,
|
|
/* field_0x02 */ 0,
|
|
/* mMorf */ 2.0f,
|
|
/* mPlaySpeed */ 1.0f,
|
|
/* mLoopMode */ J3DFrameCtrl::LOOP_ONCE_e
|
|
},
|
|
{
|
|
// AnmPrm_DEAD
|
|
/* mBckIdx */ BckIdx_DEAD,
|
|
/* mNextPrmIdx */ -1,
|
|
/* field_0x02 */ 0,
|
|
/* mMorf */ 2.0f,
|
|
/* mPlaySpeed */ 1.0f,
|
|
/* mLoopMode */ J3DFrameCtrl::LOOP_ONCE_e
|
|
},
|
|
{
|
|
// AnmPrm_TATSU
|
|
/* mBckIdx */ BckIdx_TATSU,
|
|
/* mNextPrmIdx */ AnmPrm_TACHIP1,
|
|
/* field_0x02 */ 0,
|
|
/* mMorf */ 8.0f,
|
|
/* mPlaySpeed */ 0.5f,
|
|
/* mLoopMode */ J3DFrameCtrl::LOOP_ONCE_e
|
|
},
|
|
{
|
|
// AnmPrm_SUWARU
|
|
/* mBckIdx */ BckIdx_SUWARU,
|
|
/* mNextPrmIdx */ AnmPrm_SUWARIP,
|
|
/* field_0x02 */ 0,
|
|
/* mMorf */ 8.0f,
|
|
/* mPlaySpeed */ 0.5f,
|
|
/* mLoopMode */ J3DFrameCtrl::LOOP_ONCE_e
|
|
},
|
|
{
|
|
// AnmPrm_KANOKEP
|
|
/* mBckIdx */ BckIdx_KANOKEP,
|
|
/* mNextPrmIdx */ -1,
|
|
/* field_0x02 */ 0,
|
|
/* mMorf */ 8.0f,
|
|
/* mPlaySpeed */ 1.0f,
|
|
/* mLoopMode */ J3DFrameCtrl::LOOP_REPEAT_e
|
|
},
|
|
{
|
|
// AnmPrm_BEAM_HIT
|
|
/* mBckIdx */ BckIdx_BEAM_HIT,
|
|
/* mNextPrmIdx */ -1,
|
|
/* field_0x02 */ 0,
|
|
/* mMorf */ 2.0f,
|
|
/* mPlaySpeed */ 1.0f,
|
|
/* mLoopMode */ J3DFrameCtrl::LOOP_ONCE_e
|
|
},
|
|
{
|
|
// AnmPrm_BEAM
|
|
/* mBckIdx */ BckIdx_BEAM,
|
|
/* mNextPrmIdx */ -1,
|
|
/* field_0x02 */ 0,
|
|
/* mMorf */ 2.0f,
|
|
/* mPlaySpeed */ 1.0f,
|
|
/* mLoopMode */ J3DFrameCtrl::LOOP_REPEAT_e
|
|
},
|
|
{
|
|
// AnmPrm_BEAM_END
|
|
/* mBckIdx */ BckIdx_BEAM_END,
|
|
/* mNextPrmIdx */ -1,
|
|
/* field_0x02 */ 0,
|
|
/* mMorf */ 2.0f,
|
|
/* mPlaySpeed */ 1.0f,
|
|
/* mLoopMode */ J3DFrameCtrl::LOOP_ONCE_e
|
|
},
|
|
};
|
|
|
|
if (anmPrmIdx != AnmPrm_NULL) {
|
|
mAnmPrmIdx = anmPrmIdx;
|
|
}
|
|
|
|
if (mOldAnmPrmIdx != mAnmPrmIdx) {
|
|
if (isAnm(AnmPrm_BEAM_HIT)) {
|
|
setBrkAnm(0x1);
|
|
} else if (isAnm(AnmPrm_BEAM)) {
|
|
setBrkAnm(0x2);
|
|
} else if (isAnm(AnmPrm_BEAM_END)) {
|
|
setBrkAnm(0x3);
|
|
} else {
|
|
setBrkAnm(0x0);
|
|
}
|
|
}
|
|
|
|
if (mBckIdx == BckIdx_BEAM_HIT || mBckIdx == BckIdx_BEAM || mBckIdx == BckIdx_BEAM_END) {
|
|
mBrkAnm.setFrame(mpMorf->getFrame());
|
|
}
|
|
|
|
dLib_bcks_setAnm(m_arc_name, mpMorf, &mBckIdx, &mAnmPrmIdx, &mOldAnmPrmIdx, a_anm_bcks_tbl, a_anm_prm_tbl, param_2);
|
|
}
|
|
|
|
/* 00003C48-000040A8 .text _execute__6daRd_cFv */
|
|
bool daRd_c::_execute() {
|
|
if (mMode == MODE_SW_WAIT) {
|
|
fopAcM_posMoveF(this, mStts.GetCCMoveP());
|
|
mAcch.CrrPos(*dComIfG_Bgsp());
|
|
setMtx();
|
|
mpMorf->play(NULL, 0, 0);
|
|
mpMorf->calc();
|
|
modeProc(PROC_EXEC, MODE_NULL);
|
|
return true;
|
|
}
|
|
|
|
fopAcM_setGbaName(this, dItem_MIRROR_SHIELD_e, 0x12, 0x30);
|
|
setIceCollision();
|
|
if (mMode != MODE_SILENT_PRAY && mMode != MODE_DEATH && mMode != MODE_DAMAGE &&
|
|
mMode != MODE_ATTACK && mMode != MODE_CRY && mMode != MODE_CRY_WAIT)
|
|
{
|
|
daRd_c* corpse = (daRd_c*)fopAcIt_Judge(&searchNeadDeadRd_CB, this);
|
|
if (corpse != NULL) {
|
|
mCorpseID = fopAcM_GetID(corpse);
|
|
modeProcInit(MODE_SILENT_PRAY);
|
|
}
|
|
}
|
|
if (mMode != MODE_ATTACK && mMode != MODE_WAIT && mMode != MODE_DEATH && mMode != MODE_RETURN) {
|
|
if (dComIfGp_evmng_startCheck("DEFAULT_RD_ATTACK")) {
|
|
modeProcInit(MODE_RETURN);
|
|
}
|
|
}
|
|
current.angle = shape_angle;
|
|
|
|
if (mEnemyFire.mState == 0) { // Not on fire (TODO enum)
|
|
mCyl.SetAtType(0);
|
|
m6D4 = l_HIO.m4E;
|
|
} else {
|
|
mCyl.SetAtType(AT_TYPE_FIRE);
|
|
if (mMode != MODE_DEATH && mMode != MODE_CRY && mMode != MODE_ATTACK) {
|
|
if (cLib_calcTimer(&m6D4) == 0) {
|
|
modeProcInit(MODE_DEATH);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (enemy_ice(&mEnemyIce)) {
|
|
mpMorf->getModel()->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
mpMorf->calc();
|
|
speedF = 0.0f;
|
|
setAttention();
|
|
return true;
|
|
}
|
|
|
|
if (mCE0 == 1) {
|
|
mCE4 = 4*30;
|
|
}
|
|
|
|
if (cLib_calcTimer(&mCE0) == 0) {
|
|
cLib_addCalcAngleS2(&mD1E, 0, 0xC, 0x100);
|
|
cLib_addCalcAngleS2(&mD2E, 0, 0xC, 0x100);
|
|
} else {
|
|
cLib_addCalcAngleS2(&mD1E, 0x2000, 0x4, 0x800);
|
|
cLib_addCalcAngleS2(&mD2E, 0x500, 0x4, 0x200);
|
|
}
|
|
|
|
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 (mMode != MODE_PARALYSIS) {
|
|
lookBack();
|
|
}
|
|
|
|
if (mbIkari) {
|
|
cLib_addCalc2(&mD38, l_HIO.m60, 0.1f, l_HIO.m64);
|
|
} else {
|
|
cLib_addCalc2(&mD38, 0.0f, 0.1f, l_HIO.m64);
|
|
}
|
|
|
|
if (isAnm(AnmPrm_WALK)) {
|
|
f32 temp = speedF * l_HIO.m70;
|
|
mpMorf->setPlaySpeed(temp < l_HIO.m74 ? l_HIO.m74 : temp);
|
|
if (mMode == MODE_ATTACK) {
|
|
mpMorf->setPlaySpeed(3.0f);
|
|
}
|
|
}
|
|
|
|
setAttention();
|
|
setCollision();
|
|
fopAcM_posMoveF(this, mStts.GetCCMoveP());
|
|
mAcch.CrrPos(*dComIfG_Bgsp());
|
|
setMtx();
|
|
mBtkAnm.play();
|
|
mBrkAnm.play();
|
|
mpMorf->play(¤t.pos, 0, 0);
|
|
mpMorf->calc();
|
|
enemy_fire(&mEnemyFire);
|
|
modeProc(PROC_EXEC, MODE_NULL);
|
|
setAnm(AnmPrm_NULL, false);
|
|
setBtkAnm(0x5);
|
|
g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr);
|
|
|
|
return false;
|
|
}
|
|
|
|
/* 000040A8-000041A8 .text debugDraw__6daRd_cFv */
|
|
void daRd_c::debugDraw() {
|
|
cXyz spawnPos = mSpawnPos;
|
|
spawnPos.y += 10.0f;
|
|
cXyz pos = current.pos;
|
|
pos.y += 10.0f;
|
|
GXColor unused = {0x00, 0xFF, 0x00, 0x80}; // Unused color, needed for the .rodata section to match.
|
|
dLib_debugDrawFan(pos, mHeadAngle, l_HIO.mCrySpreadAngle, l_HIO.mCryRadius, (GXColor){0xFF, 0xFF, 0x00, 0x80});
|
|
dLib_debugDrawFan(pos, shape_angle.y, l_HIO.mAttackSpreadAngle, l_HIO.mAttackRadius, (GXColor){0xFF, 0x00, 0x00, 0x80});
|
|
dLib_debugDrawFan(pos, shape_angle.y, l_HIO.m40, l_HIO.m34, (GXColor){0xFF, 0x00, 0xFF, 0x80});
|
|
dLib_debugDrawAxis(mCE8, 50.0f);
|
|
}
|
|
|
|
/* 000041A8-00004318 .text _draw__6daRd_cFv */
|
|
bool daRd_c::_draw() {
|
|
if (mMode == MODE_SW_WAIT) {
|
|
return true;
|
|
}
|
|
|
|
if (l_HIO.m2C != 0) {
|
|
debugDraw();
|
|
}
|
|
|
|
J3DModel* model = mpMorf->getModel();
|
|
J3DModelData* modelData = model->getModelData();
|
|
g_env_light.setLightTevColorType(model, &tevStr);
|
|
|
|
if (mEnemyIce.mFreezeTimer > 20) {
|
|
dMat_control_c::iceEntryDL(mpMorf, -1, &mInvisModel);
|
|
} else {
|
|
mBrkAnm.entry(modelData);
|
|
mBtkAnm.entry(modelData);
|
|
mpMorf->updateDL();
|
|
mBtkAnm.remove(modelData);
|
|
mBrkAnm.remove(modelData);
|
|
}
|
|
|
|
cXyz shadowPos(current.pos.x, current.pos.y + 150.0f, current.pos.z);
|
|
mShadowId = dComIfGd_setShadow(
|
|
mShadowId, 1, mpMorf->getModel(), &shadowPos, 800.0f, 40.0f,
|
|
current.pos.y, mAcch.GetGroundH(), mAcch.m_gnd, &tevStr
|
|
);
|
|
|
|
dSnap_RegistFig(DSNAP_TYPE_RD, this, 1.0f, 1.0f, 1.0f);
|
|
|
|
return true;
|
|
}
|
|
|
|
/* 00004318-00004338 .text isLinkControl__6daRd_cFv */
|
|
bool daRd_c::isLinkControl() {
|
|
return dComIfGp_getPlayer(0) != dComIfGp_getLinkPlayer();
|
|
}
|
|
|
|
/* 00004338-000046A4 .text createInit__6daRd_cFv */
|
|
void daRd_c::createInit() {
|
|
mStts.Init(0xFF, 0, this);
|
|
mCyl.Set(m_cyl_src);
|
|
mCyl.SetStts(&mStts);
|
|
mAcchCir.SetWall(30.0f, 30.0f);
|
|
mAcch.Set(fopAcM_GetPosition_p(this), fopAcM_GetOldPosition_p(this), this, 1, &mAcchCir, fopAcM_GetSpeed_p(this));
|
|
mAcch.SetRoofNone();
|
|
J3DModelData* modelData = mpMorf->getModel()->getModelData();
|
|
mJntCtrl.setHeadJntNum(0x0A); // ree_kubi_1
|
|
mJntCtrl.setBackboneJntNum(0x08); // ree_mune_1
|
|
modelData->getJointNodePointer(0x0A)->setCallBack(nodeControl_CB); // ree_kubi_1
|
|
modelData->getJointNodePointer(0x08)->setCallBack(nodeControl_CB); // ree_mune_1
|
|
setBtkAnm(2);
|
|
|
|
if (mChecksSwitch == 0) {
|
|
modeProcInit(MODE_SW_WAIT);
|
|
cXyz offset(0.0f, 40.0f, 10.0f);
|
|
mDoMtx_stack_c::transS(current.pos);
|
|
mDoMtx_stack_c::YrotM(shape_angle.y);
|
|
mDoMtx_stack_c::multVec(&offset, ¤t.pos);
|
|
} else {
|
|
modeProcInit(MODE_WAIT);
|
|
switch (mWhichIdleAnm) {
|
|
case 0:
|
|
setAnm(AnmPrm_TACHIP1, false);
|
|
break;
|
|
case 1:
|
|
setAnm(AnmPrm_SUWARIP, false);
|
|
break;
|
|
}
|
|
}
|
|
|
|
setBrkAnm(0);
|
|
setMtx();
|
|
mBtkAnm.play();
|
|
mBrkAnm.play();
|
|
mpMorf->play(¤t.pos, 0, 0);
|
|
mBrkAnm.setFrame(0.0f);
|
|
mpMorf->calc();
|
|
g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr);
|
|
fopAcM_SetMtx(this, mpMorf->getModel()->getBaseTRMtx());
|
|
fopAcM_setCullSizeBox(this, -100.0f, -10.0f, -100.0f, 100.0f, 250.0f, 150.0f);
|
|
|
|
mD3C = 1;
|
|
mD40 = 1;
|
|
stealItemLeft = 5;
|
|
|
|
mEnemyFire.mpMcaMorf = mpMorf;
|
|
mEnemyFire.mpActor = this;
|
|
static u8 fire_j[ARRAY_SIZE(mEnemyFire.mFlameJntIdxs)] = {
|
|
0x0C, 0x01, 0x0F, 0x11, 0x13, 0x15, 0x02, 0x04, 0x05, 0x07,
|
|
};
|
|
static f32 fire_sc[ARRAY_SIZE(mEnemyFire.mParticleScale)] = {
|
|
2.0f, 2.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
|
|
};
|
|
for (int i = 0; i < ARRAY_SIZE(mEnemyFire.mFlameJntIdxs); i++) {
|
|
mEnemyFire.mFlameJntIdxs[i] = fire_j[i];
|
|
mEnemyFire.mParticleScale[i] = fire_sc[i];
|
|
}
|
|
|
|
mEnemyIce.mpActor = this;
|
|
mEnemyIce.m00C = 1;
|
|
mEnemyIce.mWallRadius = 50.0f;
|
|
mEnemyIce.mCylHeight = 250.0f;
|
|
|
|
max_health = l_HIO.m46;
|
|
health = max_health;
|
|
mSpawnPos = current.pos;
|
|
mSpawnAngle = shape_angle.y;
|
|
gravity = -4.5f;
|
|
|
|
// TODO: figure out if 1 and 2 actually drop different items
|
|
if (mWhichIdleAnm == 0) {
|
|
itemTableIdx = dComIfGp_CharTbl()->GetNameIndex("Rdead1", 0);
|
|
}
|
|
if (mWhichIdleAnm == 1) {
|
|
itemTableIdx = dComIfGp_CharTbl()->GetNameIndex("Rdead2", 0);
|
|
}
|
|
}
|
|
|
|
/* 000046A4-00004720 .text getArg__6daRd_cFv */
|
|
void daRd_c::getArg() {
|
|
u32 params = fopAcM_GetParam(this);
|
|
mWhichIdleAnm = fopAcM_GetParamBit(params, 0x00, 1);
|
|
u8 radiusParam = fopAcM_GetParamBit(params, 0x01, 7);
|
|
s32 areaRadius = radiusParam;
|
|
mChecksSwitch = fopAcM_GetParamBit(params, 0x08, 8);
|
|
mSwNo = fopAcM_GetParamBit(params, 0x18, 8);
|
|
if ((s32)radiusParam == 0x7F) {
|
|
areaRadius = 0;
|
|
}
|
|
mAreaRadius = l_HIO.m30 + areaRadius;
|
|
}
|
|
|
|
/* 00004720-000047C8 .text _create__6daRd_cFv */
|
|
s32 daRd_c::_create() {
|
|
fopAcM_SetupActor(this, daRd_c);
|
|
|
|
s32 phase_state = dComIfG_resLoad(&mPhs, m_arc_name);
|
|
|
|
if (phase_state == cPhs_COMPLEATE_e) {
|
|
getArg();
|
|
|
|
if (!fopAcM_entrySolidHeap(this, createHeap_CB, 0x2520)) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
|
|
createInit();
|
|
}
|
|
|
|
return phase_state;
|
|
}
|
|
|
|
/* 00004F60-00004FB8 .text _delete__6daRd_cFv */
|
|
bool daRd_c::_delete() {
|
|
dComIfG_resDelete(&mPhs, m_arc_name);
|
|
enemy_fire_remove(&mEnemyFire);
|
|
if (heap) {
|
|
mpMorf->stopZelAnime();
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/* 00004FB8-00004FD8 .text daRdCreate__FPv */
|
|
static s32 daRdCreate(void* i_this) {
|
|
return static_cast<daRd_c*>(i_this)->_create();
|
|
}
|
|
|
|
/* 00004FD8-00004FFC .text daRdDelete__FPv */
|
|
static BOOL daRdDelete(void* i_this) {
|
|
return static_cast<daRd_c*>(i_this)->_delete();
|
|
}
|
|
|
|
/* 00004FFC-00005020 .text daRdExecute__FPv */
|
|
static BOOL daRdExecute(void* i_this) {
|
|
return static_cast<daRd_c*>(i_this)->_execute();
|
|
}
|
|
|
|
/* 00005020-00005044 .text daRdDraw__FPv */
|
|
static BOOL daRdDraw(void* i_this) {
|
|
return static_cast<daRd_c*>(i_this)->_draw();
|
|
}
|
|
|
|
/* 00005044-0000504C .text daRdIsDelete__FPv */
|
|
static BOOL daRdIsDelete(void* i_this) {
|
|
return TRUE;
|
|
}
|
|
|
|
static actor_method_class daRdMethodTable = {
|
|
(process_method_func)daRdCreate,
|
|
(process_method_func)daRdDelete,
|
|
(process_method_func)daRdExecute,
|
|
(process_method_func)daRdIsDelete,
|
|
(process_method_func)daRdDraw,
|
|
};
|
|
|
|
actor_process_profile_definition g_profile_RD = {
|
|
/* LayerID */ fpcLy_CURRENT_e,
|
|
/* ListID */ 0x0007,
|
|
/* ListPrio */ fpcPi_CURRENT_e,
|
|
/* ProcName */ PROC_RD,
|
|
/* Proc SubMtd */ &g_fpcLf_Method.base,
|
|
/* Size */ sizeof(daRd_c),
|
|
/* SizeOther */ 0,
|
|
/* Parameters */ 0,
|
|
/* Leaf SubMtd */ &g_fopAc_Method.base,
|
|
/* Priority */ 0x00D4,
|
|
/* Actor SubMtd */ &daRdMethodTable,
|
|
/* Status */ fopAcStts_CULL_e | fopAcStts_UNK40000_e | fopAcStts_UNK200000_e,
|
|
/* Group */ fopAc_ENEMY_e,
|
|
/* CullType */ fopAc_CULLBOX_CUSTOM_e,
|
|
};
|