mirror of https://github.com/zeldaret/tp.git
789 lines
27 KiB
C++
789 lines
27 KiB
C++
/**
|
|
* @file d_a_obj_nan.cpp
|
|
*
|
|
*/
|
|
|
|
#include "d/dolzel_rel.h" // IWYU pragma: keep
|
|
|
|
#include "d/actor/d_a_obj_nan.h"
|
|
#include "SSystem/SComponent/c_xyz.h"
|
|
#include "d/d_menu_insect.h"
|
|
#include "d/d_cc_uty.h"
|
|
#include "d/d_com_inf_game.h"
|
|
|
|
class daObj_NanHIO_c {
|
|
public:
|
|
/* 80CA05AC */ daObj_NanHIO_c();
|
|
/* 80CA30D0 */ virtual ~daObj_NanHIO_c() {}
|
|
|
|
/* 0x04 */ s8 field_0x4;
|
|
/* 0x08 */ f32 field_0x8;
|
|
/* 0x0C */ f32 field_0xc;
|
|
};
|
|
|
|
/* 80CA32D0-80CA3310 000020 0040+00 0/1 0/0 0/0 .data cc_sph_src__25@unnamed@d_a_obj_nan_cpp@ */
|
|
static dCcD_SrcSph cc_sph_src = {
|
|
{
|
|
{0x0, {{0x0, 0x0, 0x0}, {0x014040, 0x43}, 0}}, // mObj
|
|
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x0}, // mGObjAt
|
|
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x2}, // mGObjTg
|
|
{0x0}, // mGObjCo
|
|
}, // mObjInf
|
|
{
|
|
{{0.0f, 0.0f, 0.0f}, 20.0f} // mSph
|
|
} // mSphAttr
|
|
};
|
|
|
|
/* 80CA05AC-80CA05D4 0000EC 0028+00 1/1 0/0 0/0 .text __ct__14daObj_NanHIO_cFv */
|
|
daObj_NanHIO_c::daObj_NanHIO_c() {
|
|
field_0x4 = -1;
|
|
field_0xc = 1.2f;
|
|
field_0x8 = 1.2f;
|
|
}
|
|
|
|
/* 80CA05D4-80CA0678 000114 00A4+00 9/9 0/0 0/0 .text
|
|
* setAction__10daObjNAN_cFM10daObjNAN_cFPCvPv_v */
|
|
void daObjNAN_c::setAction(actionFunc action) {
|
|
if (mAction != NULL) {
|
|
field_0x7d0 = -1;
|
|
(this->*mAction)();
|
|
}
|
|
mPrevAction = mAction;
|
|
mAction = action;
|
|
field_0x7d0 = 0;
|
|
(this->*mAction)();
|
|
}
|
|
|
|
/* ############################################################################################## */
|
|
/* 80CA31C0-80CA31C8 000004 0008+00 0/1 0/0 0/0 .rodata l_nan_brk_index */
|
|
static int const l_nan_brk_index[2] = {
|
|
13, 12,
|
|
};
|
|
|
|
/* 80CA31C8-80CA31D0 00000C 0008+00 0/1 0/0 0/0 .rodata l_nan_btk_index */
|
|
static int const l_nan_btk_index[2] = {
|
|
17, 16,
|
|
};
|
|
|
|
inline int daObjNAN_c::CreateHeap() {
|
|
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("I_Nan", 9);
|
|
JUT_ASSERT(254, modelData != NULL);
|
|
mMorf = new mDoExt_McaMorfSO(modelData, NULL, NULL,
|
|
(J3DAnmTransform*)dComIfG_getObjectRes("I_Nan", 6), 2, 1.0f,
|
|
0, -1, &mCreatureSound, 0, 0x11000284);
|
|
if (mMorf == NULL || mMorf->getModel() == NULL) {
|
|
return 0;
|
|
}
|
|
J3DModel* model = mMorf->getModel();
|
|
mBrk = new mDoExt_brkAnm();
|
|
if (mBrk == NULL) {
|
|
return 0;
|
|
}
|
|
J3DAnmTevRegKey* anmRegKey =
|
|
(J3DAnmTevRegKey*)dComIfG_getObjectRes("I_Nan", l_nan_brk_index[field_0x7fb]);
|
|
if (mBrk->init(model->getModelData(), anmRegKey, 1, 2, 1.0f, 0, -1) == 0) {
|
|
return 0;
|
|
}
|
|
mBtk = new mDoExt_btkAnm();
|
|
if (mBtk == NULL) {
|
|
return 0;
|
|
}
|
|
J3DAnmTextureSRTKey* anmTexture =
|
|
(J3DAnmTextureSRTKey*)dComIfG_getObjectRes("I_Nan", l_nan_btk_index[field_0x7fb]);
|
|
if (mBtk->init(model->getModelData(), anmTexture, 1, 2, 1.0f, 0, -1) == 0) {
|
|
return 0;
|
|
}
|
|
mMorf->setAnm((J3DAnmTransform*)dComIfG_getObjectRes("I_Nan", 6), 2, 5.0f, 1.0f, 0.0f, -1.0f);
|
|
return 1;
|
|
}
|
|
|
|
/* 80CA0678-80CA08EC 0001B8 0274+00 1/1 0/0 0/0 .text useHeapInit__FP10fopAc_ac_c */
|
|
static int useHeapInit(fopAc_ac_c* i_this) {
|
|
return static_cast<daObjNAN_c*>(i_this)->CreateHeap();
|
|
}
|
|
|
|
/* 80CA0934-80CA0954 000474 0020+00 1/0 0/0 0/0 .text daObjNAN_Create__FP10fopAc_ac_c */
|
|
static int daObjNAN_Create(fopAc_ac_c* i_this) {
|
|
fopAcM_GetID(i_this);
|
|
return static_cast<daObjNAN_c*>(i_this)->create();
|
|
}
|
|
|
|
/* 80CA0954-80CA0978 000494 0024+00 1/0 0/0 0/0 .text daObjNAN_Delete__FP10daObjNAN_c */
|
|
static int daObjNAN_Delete(daObjNAN_c* i_this) {
|
|
fopAcM_GetID(i_this);
|
|
static_cast<daObjNAN_c*>(i_this)->_delete();
|
|
return 1;
|
|
}
|
|
|
|
/* 80CA0978-80CA0A2C 0004B8 00B4+00 1/1 0/0 0/0 .text nan_posMove__10daObjNAN_cFv */
|
|
void daObjNAN_c::nan_posMove() {
|
|
if (field_0x7fc == 0) {
|
|
cLib_chaseAngleS(&field_0x7d4.x, field_0x7da.x, 0x100);
|
|
cLib_chaseAngleS(&field_0x7d4.z, field_0x7da.z, 0x100);
|
|
}
|
|
cXyz zSpeed(0.0f, 0.0f, speedF);
|
|
cXyz posOffset(0.0f, 0.0f, 0.0f);
|
|
mDoMtx_stack_c::ZXYrotS(field_0x7d4);
|
|
mDoMtx_stack_c::YrotM(shape_angle.y);
|
|
mDoMtx_stack_c::multVec(&zSpeed, &posOffset);
|
|
current.pos += posOffset;
|
|
}
|
|
|
|
/* 80CA0A2C-80CA0D54 00056C 0328+00 4/0 0/0 0/0 .text turn__10daObjNAN_cFv */
|
|
void daObjNAN_c::turn() {
|
|
if (field_0x7d0 == 0) {
|
|
speedF = 0.0f;
|
|
field_0x7d0++;
|
|
} else if (field_0x7d0 != -1) {
|
|
dBgS_LinChk linChk;
|
|
cXyz cStack_b8(0.0f, 20.0f, 0.0f);
|
|
cXyz cStack_c4(0.0f, -20.0f, 0.0f);
|
|
mDoMtx_stack_c::transS(current.pos);
|
|
mDoMtx_stack_c::ZXYrotM(field_0x7d4);
|
|
mDoMtx_stack_c::YrotM(current.angle.y);
|
|
mDoMtx_stack_c::multVec(&cStack_b8, &cStack_b8);
|
|
mDoMtx_stack_c::multVec(&cStack_c4, &cStack_c4);
|
|
linChk.SetObj();
|
|
linChk.Set(&cStack_b8, &cStack_c4, NULL);
|
|
if (dComIfG_Bgsp().LineCross(&linChk)) {
|
|
cM3dGPla plane;
|
|
dComIfG_Bgsp().GetTriPla(linChk, &plane);
|
|
const cXyz* normal = plane.GetNP();
|
|
cXyz cStack_d0(0.0f, 0.0f, 0.0f);
|
|
cXyz cStack_dc(0.0f, normal->y, normal->z);
|
|
f32 uVar9 = cStack_d0.abs(cStack_dc);
|
|
current.pos = linChk.GetCross();
|
|
s16 uVar6 = cM_atan2s(normal->z, normal->y);
|
|
field_0x7da.x = uVar6;
|
|
field_0x7d4.x = uVar6;
|
|
s16 sVar7 = -cM_atan2s(normal->x, uVar9);
|
|
field_0x7da.z = sVar7;
|
|
field_0x7d4.z = sVar7;
|
|
}
|
|
field_0x7fc = nan_WalkAnm();
|
|
if (field_0x7fc == 0 &&
|
|
cLib_chaseAngleS(¤t.angle.y, field_0x7e4, 0x40) != 0)
|
|
{
|
|
setAction(&daObjNAN_c::walk);
|
|
}
|
|
if (mDraw) {
|
|
nan_setParticle();
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 80CA0D9C-80CA0E7C 0008DC 00E0+00 2/2 0/0 0/0 .text nan_WalkAnm__10daObjNAN_cFv */
|
|
u8 daObjNAN_c::nan_WalkAnm() {
|
|
if (mMorf->getFrame() == 39.0f ||
|
|
mMorf->getFrame() == 79.0f)
|
|
{
|
|
if (field_0x7e2 != 0) {
|
|
field_0x7e2--;
|
|
mMorf->setPlaySpeed(0.0f);
|
|
return 1;
|
|
}
|
|
field_0x7e2 = (u8)(cM_rndF(30.0f) + 18.0f);
|
|
mMorf->setPlaySpeed(1.0f);
|
|
mCreatureSound.startCreatureSoundLevel(Z2SE_INSCT_KSKS, 0, -1);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/* 80CA0E7C-80CA1184 0009BC 0308+00 1/0 0/0 0/0 .text wait__10daObjNAN_cFv */
|
|
void daObjNAN_c::wait() {
|
|
if (field_0x7d0 == 0) {
|
|
field_0x7d0++;
|
|
} else if (field_0x7d0 == -1) {
|
|
home.pos = current.pos;
|
|
} else {
|
|
dBgS_LinChk linChk;
|
|
cXyz cStack_b8;
|
|
cXyz cStack_c4;
|
|
cStack_b8.set(0.0f, 20.0f, 0.0f);
|
|
cStack_c4.set(0.0f, -1000.0f, 0.0f);
|
|
mDoMtx_stack_c::transS(current.pos);
|
|
mDoMtx_stack_c::ZXYrotM(current.angle);
|
|
mDoMtx_stack_c::multVec(&cStack_b8, &cStack_b8);
|
|
mDoMtx_stack_c::multVec(&cStack_c4, &cStack_c4);
|
|
linChk.SetObj();
|
|
linChk.Set(&cStack_b8, &cStack_c4, NULL);
|
|
if (dComIfG_Bgsp().LineCross(&linChk)) {
|
|
cM3dGPla plane;
|
|
dComIfG_Bgsp().GetTriPla(linChk, &plane);
|
|
const cXyz* normal = plane.GetNP();
|
|
cXyz cStack_d0(0.0f, 0.0f, 0.0f);
|
|
cXyz cStack_dc(0.0f, normal->y, normal->z);
|
|
f32 uVar8 = cStack_d0.abs(cStack_dc);
|
|
current.pos = old.pos = linChk.GetCross();
|
|
s16 uVar6 = cM_atan2s(normal->z, normal->y);
|
|
field_0x7da.x = uVar6;
|
|
field_0x7d4.x = uVar6;
|
|
s16 sVar7 = -cM_atan2s(normal->x, uVar8);
|
|
field_0x7da.z = sVar7;
|
|
field_0x7d4.z = sVar7;
|
|
current.angle.z = 0;
|
|
current.angle.x = 0;
|
|
setAction(&daObjNAN_c::walk);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 80CA1184-80CA1904 000CC4 0780+00 4/0 0/0 0/0 .text walk__10daObjNAN_cFv */
|
|
void daObjNAN_c::walk() {
|
|
if (field_0x7d0 == 0) {
|
|
field_0x7e0 = 180;
|
|
field_0x7e2 = (u8)(cM_rndF(30.0f) + 18.0f);
|
|
field_0x7f8 = 600;
|
|
field_0x7fc = 0;
|
|
speedF = 0.0f;
|
|
field_0x7d0++;
|
|
} else if (field_0x7d0 == -1) {
|
|
speedF = 0.0f;
|
|
} else {
|
|
field_0x7fc = nan_WalkAnm();
|
|
f32 dVar15;
|
|
if (field_0x7fc != 0) {
|
|
dVar15 = 0.0f;
|
|
speedF = 0;
|
|
} else {
|
|
dVar15 = 0.2f;
|
|
if (60.0f < mMorf->getFrame() ||
|
|
(30.0f < mMorf->getFrame() && mMorf->getFrame() < 40.0f))
|
|
{
|
|
dVar15 = 0.0f;
|
|
}
|
|
}
|
|
if (field_0x7da.x != field_0x7d4.x ||
|
|
field_0x7da.z != field_0x7d4.z)
|
|
{
|
|
dVar15 = 0.0f;
|
|
speedF = 0;
|
|
}
|
|
cLib_chaseF(&speedF, dVar15, 0.02f);
|
|
nan_posMove();
|
|
if (mDraw) {
|
|
nan_setParticle();
|
|
}
|
|
dBgS_LinChk adStack_c8;
|
|
dBgS_LinChk adStack_138;
|
|
cXyz cStack_170(0.0f, 20.0f, 0.0f);
|
|
cXyz cStack_17c(0.0f, -20.0f, 0.0f);
|
|
cXyz cStack_188(0.0f, 20.0f, 12.0f);
|
|
mDoMtx_stack_c::transS(current.pos);
|
|
mDoMtx_stack_c::ZXYrotM(field_0x7d4);
|
|
mDoMtx_stack_c::YrotM(current.angle.y);
|
|
mDoMtx_stack_c::multVec(&cStack_170, &cStack_170);
|
|
mDoMtx_stack_c::multVec(&cStack_17c, &cStack_17c);
|
|
mDoMtx_stack_c::multVec(&cStack_188, &cStack_188);
|
|
adStack_c8.SetObj();
|
|
adStack_138.SetObj();
|
|
adStack_c8.Set(&cStack_170, &cStack_17c, NULL);
|
|
adStack_138.Set(&cStack_170, &cStack_188, NULL);
|
|
if (dComIfG_Bgsp().LineCross(&adStack_c8)) {
|
|
cM3dGPla plane1;
|
|
dComIfG_Bgsp().GetTriPla(adStack_c8, &plane1);
|
|
const cXyz* normal = plane1.GetNP();
|
|
cXyz cStack_194(0.0f, 0.0f, 0.0f);
|
|
cXyz cStack_1a0(0.0f, normal->y, normal->z);
|
|
f32 uVar14 = cStack_194.abs(cStack_1a0);
|
|
current.pos = adStack_c8.GetCross();
|
|
field_0x7da.x = cM_atan2s(normal->z, normal->y);
|
|
field_0x7da.z = -cM_atan2s(normal->x, uVar14);
|
|
if (dComIfG_Bgsp().LineCross(&adStack_138)) {
|
|
cM3dGPla plane2;
|
|
dComIfG_Bgsp().GetTriPla(adStack_138, &plane2);
|
|
normal = plane2.GetNP();
|
|
current.pos = old.pos;
|
|
field_0x7e4 = cM_atan2s(normal->x, normal->z) + cM_rndFX(6144.0f);
|
|
setAction(&daObjNAN_c::turn);
|
|
return;
|
|
} else {
|
|
|
|
}
|
|
} else {
|
|
current.pos = old.pos;
|
|
field_0x7e4 = current.angle.y - 0x8000 + cM_rndFX(6144.0f);
|
|
setAction(&daObjNAN_c::turn);
|
|
return;
|
|
}
|
|
|
|
if (field_0x7f8 == 0) {
|
|
field_0x7e4 = cM_rndFX(32768.0f);
|
|
setAction(&daObjNAN_c::turn);
|
|
return;
|
|
} else if (field_0x7e0 == 0 && home.pos.abs(current.pos) > 200.0f) {
|
|
cXyz local_1ac;
|
|
local_1ac = home.pos - current.pos;
|
|
local_1ac.x += cM_rndFX(1050.0f);
|
|
local_1ac.z += cM_rndFX(1050.0f);
|
|
field_0x7e4 = cM_atan2s(local_1ac.x, local_1ac.z);
|
|
setAction(&daObjNAN_c::turn);
|
|
return;
|
|
} else {
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 80CA1904-80CA1A20 001444 011C+00 1/0 0/0 0/0 .text bin_wait__10daObjNAN_cFv */
|
|
void daObjNAN_c::bin_wait() {
|
|
if (field_0x7d0 == 0) {
|
|
fopAcM_OnStatus(this, 0x4000);
|
|
mDraw = false;
|
|
field_0x7d0++;
|
|
} else if (field_0x7d0 != -1 && field_0x56c != 0) {
|
|
current.angle.y = daPy_getPlayerActorClass()->current.angle.y - 0x4000;
|
|
if (strcmp("R_SP160", dComIfGp_getStartStageName()) == 0 &&
|
|
dComIfGp_getStartStageRoomNo() == 3)
|
|
{
|
|
field_0x7fa = 1;
|
|
mDraw = true;
|
|
setAction(&daObjNAN_c::drop);
|
|
} else {
|
|
setAction(&daObjNAN_c::bin_action);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 80CA1A20-80CA1B50 001560 0130+00 1/0 0/0 0/0 .text bin_action__10daObjNAN_cFv */
|
|
void daObjNAN_c::bin_action() {
|
|
if (field_0x7d0 == 0) {
|
|
mDraw = true;
|
|
gravity = -2.0f;
|
|
maxFallSpeed = gravity;
|
|
scale.setall(0.4f);
|
|
field_0x7e0 = 10.0f;
|
|
field_0x7d0++;
|
|
} else if (field_0x7d0 == -1) {
|
|
gravity = 0.0f;
|
|
maxFallSpeed = 0.0f;
|
|
} else {
|
|
f32 newScale = scale.x;
|
|
if (mDraw) {
|
|
nan_setParticle();
|
|
}
|
|
fopAcM_posMoveF(this, 0);
|
|
if (field_0x7e0 != 0) {
|
|
cLib_chaseF(&newScale, 0.6f, 0.1f);
|
|
} else {
|
|
cLib_addCalc2(&newScale, 0.0f, 62.0f, 0.05f);
|
|
scale.setall(newScale);
|
|
if (newScale < 0.1) {
|
|
fopAcM_delete(this);
|
|
return;
|
|
}
|
|
}
|
|
scale.setall(newScale);
|
|
}
|
|
}
|
|
|
|
/* 80CA1B50-80CA1D5C 001690 020C+00 6/6 0/0 0/0 .text nan_setParticle__10daObjNAN_cFv */
|
|
void daObjNAN_c::nan_setParticle() {
|
|
if (CheckZ()) {
|
|
cLib_chaseF(&field_0x7e8, 0.0f, 1.0f);
|
|
} else {
|
|
cLib_chaseF(&field_0x7e8, 1.0f, 1.0f);
|
|
}
|
|
if (field_0x7fa != 2) {
|
|
if (strcmp("R_SP160", dComIfGp_getStartStageName()) == 0) {
|
|
if (strcmp("R_SP160", dComIfGp_getStartStageName()) != 0) {
|
|
return;
|
|
}
|
|
if (dComIfGp_getStartStageRoomNo() == 3) {
|
|
return;
|
|
}
|
|
}
|
|
mParticleKey1 = dComIfGp_particle_set(mParticleKey1, 0xa1b, ¤t.pos, &tevStr,
|
|
&shape_angle, 0, 0xff, 0, -1, 0, 0, 0);
|
|
JPABaseEmitter* pEmitter = (JPABaseEmitter*)dComIfGp_particle_getEmitter(mParticleKey1);
|
|
if (pEmitter != NULL) {
|
|
pEmitter->setGlobalParticleScale(field_0x7e8 * scale.x, field_0x7e8 * scale.x);
|
|
}
|
|
mParticleKey2 = dComIfGp_particle_set(mParticleKey2, 0xa1c, ¤t.pos, &tevStr,
|
|
&shape_angle, 0, 0xff, 0, -1, 0, 0, 0);
|
|
pEmitter = dComIfGp_particle_getEmitter(mParticleKey2);
|
|
if (pEmitter != NULL) {
|
|
pEmitter->setGlobalParticleScale(field_0x7e8 * scale.x, field_0x7e8 * scale.x);
|
|
}
|
|
mCreatureSound.startCreatureSoundLevel(Z2SE_INSCT_KIRA, 0, -1);
|
|
}
|
|
}
|
|
|
|
/* 80CA1D5C-80CA1F60 00189C 0204+00 1/0 0/0 0/0 .text hook__10daObjNAN_cFv */
|
|
void daObjNAN_c::hook() {
|
|
if (field_0x7d0 == 0) {
|
|
daPy_py_c* player = daPy_getPlayerActorClass();
|
|
cXyz cStack_b0(0.0f, -5.0f, 0.0f);
|
|
mSph.SetTgType(0);
|
|
player->setHookshotCarryOffset(fopAcM_GetID(this), &cStack_b0);
|
|
field_0x7d0++;
|
|
} else if (field_0x7d0 == -1) {
|
|
mSph.SetTgType(0x14040);
|
|
home.pos = current.pos;
|
|
} else {
|
|
if (mDraw) {
|
|
nan_setParticle();
|
|
}
|
|
if (!fopAcM_CheckStatus(this, 0x100000)) {
|
|
setAction(&daObjNAN_c::drop);
|
|
}
|
|
dBgS_LinChk linkChk;
|
|
linkChk.SetObj();
|
|
linkChk.Set(&old.pos, ¤t.pos, NULL);
|
|
if (dComIfG_Bgsp().LineCross(&linkChk)) {
|
|
cM3dGPla plane;
|
|
cXyz local_bc;
|
|
dComIfG_Bgsp().GetTriPla(linkChk, &plane);
|
|
const cXyz* normal = plane.GetNP();
|
|
local_bc = linkChk.GetCross();
|
|
local_bc.x += normal->x * 20.0f;
|
|
local_bc.y += normal->y * 20.0f;
|
|
local_bc.z += normal->z * 20.0f;
|
|
current.pos = old.pos = local_bc;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 80CA1F60-80CA2368 001AA0 0408+00 1/0 0/0 0/0 .text boomerang__10daObjNAN_cFv */
|
|
void daObjNAN_c::boomerang() {
|
|
if (field_0x7d0 == 0) {
|
|
mSph.SetTgType(0);
|
|
mSph.GetTgHitGObj();
|
|
mBoomerangMove.initOffset(¤t.pos);
|
|
field_0x7d4.setall(0);
|
|
field_0x7da.setall(0);
|
|
field_0x7d0++;
|
|
} else if (field_0x7d0 == -1) {
|
|
mSph.SetTgType(0x14040);
|
|
home.pos = current.pos;
|
|
} else {
|
|
daPy_getPlayerActorClass();
|
|
if (mDraw) {
|
|
nan_setParticle();
|
|
}
|
|
if (mBoomerangMove.posMove(¤t.pos, ¤t.angle.y, NULL, 0x1c00) == 0) {
|
|
daPy_py_c* player = daPy_getPlayerActorClass();
|
|
dBgS_LinChk linChk;
|
|
cXyz cStack_cc;
|
|
cXyz cStack_d8(0.0f, 0.0f, 100.0f);
|
|
cStack_cc = player->current.pos;
|
|
cStack_cc.y += 200.0f;
|
|
mDoMtx_stack_c::transS(cStack_cc);
|
|
mDoMtx_stack_c::YrotM(cM_rndFX(32768.0f));
|
|
mDoMtx_stack_c::multVec(&cStack_d8, &cStack_d8);
|
|
linChk.SetObj();
|
|
linChk.Set(&cStack_cc, &cStack_d8, NULL);
|
|
if (dComIfG_Bgsp().LineCross(&linChk)) {
|
|
cM3dGPla plane;
|
|
dComIfG_Bgsp().GetTriPla(linChk, &plane);
|
|
const cXyz* normal = plane.GetNP();
|
|
cXyz cStack_e4(0.0f, 0.0f, 0.0f);
|
|
cXyz cStack_f0(0.0f, normal->y, normal->z);
|
|
f32 uVar11 = cStack_e4.abs(cStack_f0);
|
|
current.pos = old.pos = linChk.GetCross();
|
|
s16 uVar7 = cM_atan2s(normal->z, normal->y);
|
|
field_0x7da.x = uVar7;
|
|
field_0x7d4.x = uVar7;
|
|
s16 sVar8 = -cM_atan2s(normal->x, uVar11);
|
|
field_0x7da.z = sVar8;
|
|
field_0x7d4.z = sVar8;
|
|
setAction(&daObjNAN_c::walk);
|
|
} else {
|
|
current.pos = old.pos = cStack_cc;
|
|
setAction(&daObjNAN_c::drop);
|
|
}
|
|
} else {
|
|
mBoomerangMove.bgCheckAfterOffset(¤t.pos);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 80CA2368-80CA2658 001EA8 02F0+00 3/0 0/0 0/0 .text drop__10daObjNAN_cFv */
|
|
void daObjNAN_c::drop() {
|
|
if (field_0x7d0 == 0) {
|
|
speedF = 0.0f;
|
|
gravity = -5.0f;
|
|
maxFallSpeed = -30.0f;
|
|
field_0x7d4.setall(0);
|
|
field_0x7da.setall(0);
|
|
field_0x7d0++;
|
|
} else if (field_0x7d0 == -1) {
|
|
gravity = 0.0f;
|
|
maxFallSpeed = 0.0f;
|
|
home.pos = current.pos;
|
|
} else {
|
|
dBgS_LinChk linChk;
|
|
fopAcM_posMoveF(this, NULL);
|
|
linChk.SetObj();
|
|
linChk.Set(&old.pos, ¤t.pos, NULL);
|
|
if (dComIfG_Bgsp().LineCross(&linChk)) {
|
|
cM3dGPla plane;
|
|
dComIfG_Bgsp().GetTriPla(linChk, &plane);
|
|
const cXyz* normal = plane.GetNP();
|
|
cXyz cStack_e4(0.0f, 0.0f, 0.0f);
|
|
cXyz cStack_f0(0.0f, normal->y, normal->z);
|
|
f32 uVar11 = cStack_e4.abs(cStack_f0);
|
|
current.pos = old.pos = linChk.GetCross();
|
|
s16 uVar7 = cM_atan2s(normal->z, normal->y);
|
|
field_0x7da.x = uVar7;
|
|
field_0x7d4.x = uVar7;
|
|
s16 sVar8 = -cM_atan2s(normal->x, uVar11);
|
|
field_0x7da.z = sVar8;
|
|
field_0x7d4.z = sVar8;
|
|
setAction(&daObjNAN_c::walk);
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
/* 80CA2658-80CA270C 002198 00B4+00 1/1 0/0 0/0 .text hit_check__10daObjNAN_cFv */
|
|
void daObjNAN_c::hit_check() {
|
|
dCcU_AtInfo local_40;
|
|
mStts.Move();
|
|
if (mSph.ChkTgHit()) {
|
|
local_40.mpCollider = mSph.GetTgHitObj();
|
|
if (local_40.mpCollider->ChkAtType(AT_TYPE_HOOKSHOT)) {
|
|
setAction(&daObjNAN_c::hook);
|
|
} else {
|
|
setAction(&daObjNAN_c::boomerang);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 80CA270C-80CA276C 00224C 0060+00 1/1 0/0 0/0 .text action__10daObjNAN_cFv */
|
|
void daObjNAN_c::action() {
|
|
(this->*mAction)();
|
|
shape_angle = current.angle;
|
|
if (field_0x7fa == 0) {
|
|
Insect_GetDemoMain();
|
|
}
|
|
}
|
|
|
|
/* ############################################################################################## */
|
|
/* 80CA3270-80CA3274 0000B4 0002+02 0/1 0/0 0/0 .rodata l_nan_itemno */
|
|
static u8 const l_nan_itemno[2] = {
|
|
fpcNm_ITEM_M_NANAFUSHI, fpcNm_ITEM_F_NANAFUSHI,
|
|
};
|
|
|
|
/* 80CA276C-80CA2904 0022AC 0198+00 1/1 0/0 0/0 .text execute__10daObjNAN_cFv */
|
|
int daObjNAN_c::execute() {
|
|
if (ChkGetDemo()) {
|
|
field_0x57c = field_0x578 + 10000.0f;
|
|
mCreatureSound.startCreatureSoundLevel(Z2SE_INSCT_KIRA, 0, -1);
|
|
Insect_GetDemoMain();
|
|
nan_setParticle();
|
|
return 1;
|
|
}
|
|
if (field_0x7e0 != 0) {
|
|
field_0x7e0--;
|
|
}
|
|
if (field_0x7f8 != 0) {
|
|
field_0x7f8--;
|
|
}
|
|
|
|
if (field_0x7fa == 0) {
|
|
hit_check();
|
|
}
|
|
action();
|
|
mBrk->play();
|
|
mBtk->play();
|
|
mMorf->play(0, dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
|
|
setBaseMtx();
|
|
if (field_0x7fa == 0) {
|
|
mSph.SetC(current.pos);
|
|
mSph.SetR(scale.x * 20.0f);
|
|
dComIfG_Ccsp()->Set(&mSph);
|
|
eyePos = current.pos;
|
|
attention_info.position = eyePos;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
/* ############################################################################################## */
|
|
/* 80CA3498-80CA349C 000008 0004+00 2/2 0/0 0/0 .bss None */
|
|
static u8 l_hio_init;
|
|
|
|
/* 80CA2904-80CA296C 002444 0068+00 1/1 0/0 0/0 .text _delete__10daObjNAN_cFv */
|
|
int daObjNAN_c::_delete() {
|
|
dComIfG_resDelete(&mPhase, "I_Nan");
|
|
if (field_0x7fd != 0) {
|
|
l_hio_init = 0;
|
|
}
|
|
if (heap != NULL) {
|
|
mMorf->stopZelAnime();
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
/* 80CA296C-80CA29EC 0024AC 0080+00 1/1 0/0 0/0 .text setBaseMtx__10daObjNAN_cFv */
|
|
void daObjNAN_c::setBaseMtx() {
|
|
J3DModel* model = mMorf->getModel();
|
|
mDoMtx_stack_c::transS(current.pos);
|
|
mDoMtx_stack_c::ZXYrotM(field_0x7d4);
|
|
mDoMtx_stack_c::ZXYrotM(shape_angle);
|
|
model->setBaseScale(scale);
|
|
model->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
mMorf->modelCalc();
|
|
}
|
|
|
|
inline int daObjNAN_c::draw() {
|
|
if (mDraw) {
|
|
CalcZBuffer(50.0f);
|
|
J3DModel* model = mMorf->getModel();
|
|
g_env_light.settingTevStruct(0, ¤t.pos, &tevStr);
|
|
g_env_light.setLightTevColorType_MAJI(model, &tevStr);
|
|
mBtk->entry(model->getModelData());
|
|
mBrk->entry(model->getModelData());
|
|
if (field_0x7fa != 2) {
|
|
fopAcM_setEffectMtx(this, model->getModelData());
|
|
mMorf->entryDL();
|
|
if (field_0x7fa != 1) {
|
|
dBgS_GndChk gndChk;
|
|
cXyz cStack_88(current.pos);
|
|
cStack_88.y += 20.0f;
|
|
gndChk.SetPos(&cStack_88);
|
|
f32 groundCross = dComIfG_Bgsp().GroundCross(&gndChk);
|
|
if (groundCross != G_CM3D_F_INF) {
|
|
dComIfGd_setSimpleShadow(¤t.pos, groundCross, 15.0f, gndChk, 0, -0.6f,
|
|
dDlst_shadowControl_c::getSimpleTex());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
/* 80CA29EC-80CA2B48 00252C 015C+00 1/0 0/0 0/0 .text daObjNAN_Draw__FP10daObjNAN_c */
|
|
static int daObjNAN_Draw(daObjNAN_c* i_this) {
|
|
return i_this->draw();
|
|
}
|
|
|
|
/* 80CA2B48-80CA2B68 002688 0020+00 2/1 0/0 0/0 .text daObjNAN_Execute__FP10daObjNAN_c */
|
|
static int daObjNAN_Execute(daObjNAN_c* i_this) {
|
|
return i_this->execute();
|
|
}
|
|
|
|
/* ############################################################################################## */
|
|
/* 80CA3294-80CA3298 0000D8 0004+00 0/1 0/0 0/0 .rodata l_musiya_num */
|
|
static u16 const l_musiya_num[2] = {
|
|
0x0199, /* dSv_event_flag_c::F_0409 - Misc. - Phasmid (M) */
|
|
0x019A, /* dSv_event_flag_c::F_0410 - Misc. - Phasmid (F) */
|
|
};
|
|
|
|
/* 80CA3298-80CA329C 0000DC 0004+00 0/1 0/0 0/0 .rodata l_heapsize */
|
|
static u16 const l_heapsize[2] = {0x0EE0, 0x0EC0};
|
|
|
|
/* 80CA34A8-80CA34B8 000018 0010+00 2/2 0/0 0/0 .bss l_HIO */
|
|
static daObj_NanHIO_c l_HIO;
|
|
|
|
/* 80CA2B68-80CA2FDC 0026A8 0474+00 1/1 0/0 0/0 .text create__10daObjNAN_cFv */
|
|
int daObjNAN_c::create() {
|
|
u8 uVar6 = (fopAcM_GetParam(this) & 0xf00) >> 8;
|
|
fopAcM_ct(this, daObjNAN_c);
|
|
int rv = dComIfG_resLoad(&mPhase, "I_Nan");
|
|
if (rv == cPhs_COMPLEATE_e) {
|
|
OS_REPORT("NAN PARAM %x\n", fopAcM_GetParam(this));
|
|
field_0x7fa = fopAcM_GetParam(this) & 3;
|
|
if (field_0x7fa == 3) {
|
|
field_0x7fa = 0;
|
|
}
|
|
field_0x7fb = (fopAcM_GetParam(this) & 0x10) >> 4;
|
|
if (field_0x7fb != 0) {
|
|
scale.setall(l_HIO.field_0x8);
|
|
} else {
|
|
scale.setall(l_HIO.field_0xc);
|
|
}
|
|
if (uVar6 == 15) {
|
|
uVar6 = 0;
|
|
}
|
|
setItemNo(l_nan_itemno[field_0x7fb]);
|
|
setSaveBitNo(l_musiya_num[field_0x7fb]);
|
|
if (field_0x7fa != 2) {
|
|
if (uVar6 != 0) {
|
|
if (!dComIfGs_isEventBit(dSv_event_flag_c::saveBitLabels[l_musiya_num[0]]) || !dComIfGs_isEventBit(dSv_event_flag_c::saveBitLabels[l_musiya_num[1]])) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
} else {
|
|
if (strcmp("R_SP160", dComIfGp_getStartStageName()) == 0 &&
|
|
dComIfGp_getStartStageRoomNo() == 3)
|
|
{
|
|
if (dMenu_Insect_c::isCatchNotGiveInsect(m_itemNo)) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
if ((field_0x7fb == 0 && !dComIfGs_isEventBit(dSv_event_flag_c::saveBitLabels[l_musiya_num[0]])) ||
|
|
(field_0x7fb != 0 && !dComIfGs_isEventBit(dSv_event_flag_c::saveBitLabels[l_musiya_num[1]])))
|
|
{
|
|
return cPhs_ERROR_e;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
OS_REPORT("/////////////// I_NAN /////////////////\n");
|
|
if (fopAcM_entrySolidHeap(this, useHeapInit, l_heapsize[field_0x7fb]) == 0) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
OS_REPORT("/////////////// I_NAN SET OK //////////\n");
|
|
if (l_hio_init == 0) {
|
|
l_hio_init = 1;
|
|
field_0x7fd = 1;
|
|
l_HIO.field_0x4 = -1;
|
|
}
|
|
gravity = 0.0f;
|
|
fopAcM_SetMtx(this, mMorf->getModel()->getBaseTRMtx());
|
|
fopAcM_SetMin(this, -50.0f, -50.0f, -50.0f);
|
|
fopAcM_SetMax(this, 50.0f, 50.0f, 50.0f);
|
|
attention_info.flags = 0;
|
|
health = 10;
|
|
field_0x560 = 10;
|
|
mCreatureSound.init(¤t.pos, &eyePos, 3, 1);
|
|
if (field_0x7fa == 0) {
|
|
attention_info.distances[fopAc_attn_CARRY_e] = 93;
|
|
mStts.Init(100, 0, this);
|
|
mSph.Set(cc_sph_src);
|
|
mSph.SetStts(&mStts);
|
|
}
|
|
if (field_0x7fa == 2) {
|
|
setAction(&daObjNAN_c::bin_wait);
|
|
} else {
|
|
setAction(&daObjNAN_c::wait);
|
|
}
|
|
daObjNAN_Execute(this);
|
|
}
|
|
return rv;
|
|
}
|
|
|
|
/* 80CA30C8-80CA30D0 002C08 0008+00 1/0 0/0 0/0 .text daObjNAN_IsDelete__FP10daObjNAN_c
|
|
*/
|
|
static int daObjNAN_IsDelete(daObjNAN_c* i_this) {
|
|
return 1;
|
|
}
|
|
|
|
/* 80CA33D0-80CA33F0 -00001 0020+00 1/0 0/0 0/0 .data l_daObjNAN_Method */
|
|
static actor_method_class l_daObjNAN_Method = {
|
|
(process_method_func)daObjNAN_Create,
|
|
(process_method_func)daObjNAN_Delete,
|
|
(process_method_func)daObjNAN_Execute,
|
|
(process_method_func)daObjNAN_IsDelete,
|
|
(process_method_func)daObjNAN_Draw,
|
|
};
|
|
|
|
/* 80CA33F0-80CA3420 -00001 0030+00 0/0 0/0 1/0 .data g_profile_Obj_Nan */
|
|
extern actor_process_profile_definition g_profile_Obj_Nan = {
|
|
fpcLy_CURRENT_e, // mLayerID
|
|
7, // mListID
|
|
fpcPi_CURRENT_e, // mListPrio
|
|
PROC_Obj_Nan, // mProcName
|
|
&g_fpcLf_Method.base, // sub_method
|
|
sizeof(daObjNAN_c), // mSize
|
|
0, // mSizeOther
|
|
0, // mParameters
|
|
&g_fopAc_Method.base, // sub_method
|
|
480, // mPriority
|
|
&l_daObjNAN_Method, // sub_method
|
|
0x000C0120, // mStatus
|
|
fopAc_ENV_e, // mActorType
|
|
fopAc_CULLBOX_CUSTOM_e, // cullType
|
|
};
|
|
|
|
/* 80CA32A0-80CA32A0 0000E4 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */
|