mirror of https://github.com/zeldaret/tp.git
457 lines
15 KiB
C++
457 lines
15 KiB
C++
/**
|
|
* @file d_a_obj_lv6bemos.cpp
|
|
*
|
|
*/
|
|
|
|
#include "d/dolzel_rel.h"
|
|
|
|
#include "d/actor/d_a_obj_lv6bemos.h"
|
|
#include "SSystem/SComponent/c_lib.h"
|
|
#include "d/actor/d_a_player.h"
|
|
#include "d/d_cc_d.h"
|
|
|
|
enum Obj_lv6bm_RES_File_ID {
|
|
/* BCK */
|
|
/* 0x07 */ BCK_EF_BIMOBEAM = 0x07,
|
|
|
|
/* BMDE */
|
|
/* 0x0A */ BMDE_BM6 = 0xA,
|
|
|
|
/* BMDR */
|
|
/* 0x0D */ BMDR_EF_BIMOBEAM = 0xD,
|
|
/* 0x0E */ BMDR_K_BIMO00,
|
|
|
|
/* BTK */
|
|
/* 0x11 */ BTK_EF_BIMOBEAM = 0x11,
|
|
/* 0x12 */ BTK_EF_BIMOBEAM_OFF,
|
|
/* 0x13 */ BTK_EF_BIMOBEAM_ON,
|
|
|
|
/* DZB */
|
|
/* 0x16 */ DZB_K_BIMO00 = 0x16,
|
|
/* 0x17 */ DZB_LV6_OBJ_BEMOS,
|
|
};
|
|
|
|
/* 80C7DECC-80C7DF0C 000000 0040+00 5/5 0/0 0/0 .rodata l_sph_src */
|
|
const static dCcD_SrcSph l_sph_src = {
|
|
{
|
|
{0x0, {{0x0, 0x0, 0x1e}, {0xd8fbfdff, 0x11}, 0x0}}, // mObj
|
|
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x8}, // mGObjAt
|
|
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x2}, // mGObjTg
|
|
{0x0}, // mGObjCo
|
|
}, // mObjInf
|
|
{
|
|
{{0.0f, 0.0f, 0.0f}, 50.0f} // mSph
|
|
} // mSphAttr
|
|
};
|
|
|
|
/* 80C7CB18-80C7CE24 000078 030C+00 1/1 0/0 0/0 .text nodeCallBack__FP8J3DJointi */
|
|
static int nodeCallBack(J3DJoint* i_joint, int param_2) {
|
|
if (param_2 == 0) {
|
|
int jntNo = i_joint->getJntNo();
|
|
J3DModel* model = j3dSys.getModel();
|
|
daObjL6Bm_c* i_this = (daObjL6Bm_c*)model->getUserArea();
|
|
|
|
mDoMtx_stack_c::copy(model->getAnmMtx(jntNo));
|
|
|
|
if (jntNo == 1) {
|
|
mDoMtx_stack_c::XrotM(i_this->field_0x892);
|
|
} else if (jntNo == 2) {
|
|
mDoMtx_stack_c::push();
|
|
mDoMtx_stack_c::multVecZero(&i_this->field_0x894);
|
|
daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0);
|
|
|
|
if (i_this->field_0x891 != 0) {
|
|
cLib_addCalc0(&i_this->field_0x914, 0.1f, 20.0f);
|
|
} else {
|
|
i_this->field_0x914 = 200.0f;
|
|
}
|
|
|
|
f32 fVar1 = player->current.pos.absXZ(i_this->field_0x894);
|
|
f32 yDiff = i_this->field_0x894.y - player->current.pos.y;
|
|
if (fVar1 > i_this->field_0x914) {
|
|
fVar1 -= i_this->field_0x914;
|
|
}
|
|
|
|
s16 sVar1 = cM_atan2s(yDiff, fVar1);
|
|
if (sVar1 > 8000) {
|
|
sVar1 = 8000;
|
|
}
|
|
|
|
mDoMtx_stack_c::transS(i_this->field_0x894);
|
|
mDoMtx_stack_c::YrotM(i_this->field_0x892);
|
|
mDoMtx_stack_c::XrotM(sVar1);
|
|
i_this->mBeamEffectModel->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
cXyz sp40(0.0f, 0.0f, 1200.0f);
|
|
mDoMtx_stack_c::multVec(&sp40, &i_this->field_0x72c.mEnd);
|
|
i_this->field_0x72c.mStart = i_this->field_0x894;
|
|
i_this->field_0x72c.mRadius = 20.0f;
|
|
|
|
i_this->field_0x5e8.cM3dGCps::Set(i_this->field_0x72c);
|
|
i_this->field_0x5e8.CalcAtVec();
|
|
mDoMtx_stack_c::pop();
|
|
}
|
|
|
|
model->setAnmMtx(jntNo, mDoMtx_stack_c::get());
|
|
mDoMtx_copy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx);
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 80C7CE24-80C7CE60 000384 003C+00 1/1 0/0 0/0 .text initBaseMtx__11daObjL6Bm_cFv */
|
|
void daObjL6Bm_c::initBaseMtx() {
|
|
mBeamosModel->setBaseScale(scale);
|
|
setBaseMtx();
|
|
}
|
|
|
|
/* 80C7CE60-80C7CED4 0003C0 0074+00 2/2 0/0 0/0 .text setBaseMtx__11daObjL6Bm_cFv */
|
|
void daObjL6Bm_c::setBaseMtx() {
|
|
mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z);
|
|
mDoMtx_stack_c::YrotM(shape_angle.y);
|
|
mBeamosModel->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
MTXCopy(mDoMtx_stack_c::get(), mBgMtx);
|
|
}
|
|
|
|
/* 80C7DF98-80C7DF9C -00001 0004+00 4/4 0/0 0/0 .data l_arcName */
|
|
static char* l_arcName = "Obj_lv6bm";
|
|
|
|
/* 80C7DF9C-80C7DFB4 000024 0018+00 1/1 0/0 0/0 .data l_cull_box */
|
|
static f32 l_cull_box[6] = {
|
|
-200.0f, -100.0f, -200.0f,
|
|
200.0f, 100.0f, 200.0f,
|
|
};
|
|
|
|
/* 80C7DFB4-80C7E000 00003C 004C+00 1/1 0/0 0/0 .data l_cps_src */
|
|
static dCcD_SrcCps l_cps_src = {
|
|
{
|
|
{0x0, {{0x100, 0x1, 0x1d}, {0x0, 0x0}, 0x0}}, // mObj
|
|
{dCcD_SE_SWORD, 0x0, 0x0, 0x0, 0x0}, // mGObjAt
|
|
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x4}, // mGObjTg
|
|
{0x0}, // mGObjCo
|
|
}, // mObjInf
|
|
{
|
|
{{0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 0.0f}, 50.0f}, // mCps
|
|
} // mCpsAttr
|
|
};
|
|
|
|
/* 80C7CED4-80C7CFD0 000434 00FC+00 1/0 0/0 0/0 .text Create__11daObjL6Bm_cFv */
|
|
int daObjL6Bm_c::Create() {
|
|
initBaseMtx();
|
|
fopAcM_SetMtx(this, mBeamosModel->getBaseTRMtx());
|
|
mStts.Init(0xFF, 0xFF, this);
|
|
field_0x5e8.Set(l_cps_src);
|
|
field_0x5e8.SetStts(&mStts);
|
|
field_0x748.Set(l_sph_src);
|
|
field_0x748.SetStts(&mStts);
|
|
|
|
fopAcM_setCullSizeBox(this, l_cull_box[0], l_cull_box[1], l_cull_box[2], l_cull_box[3], l_cull_box[4], l_cull_box[5]);
|
|
|
|
J3DJoint* neckJnt = mBeamosModel->getModelData()->getJointNodePointer(1);
|
|
if (neckJnt != NULL) {
|
|
neckJnt->setCallBack(nodeCallBack);
|
|
}
|
|
|
|
J3DJoint* eyeJnt = mBeamosModel->getModelData()->getJointNodePointer(2);
|
|
if (eyeJnt != NULL) {
|
|
eyeJnt->setCallBack(nodeCallBack);
|
|
}
|
|
|
|
mBeamosModel->setUserArea((u32)this);
|
|
|
|
if (neckJnt == NULL) {
|
|
OS_REPORT_ERROR("表ビーモス:首ジョイントが見つかりませんでした!\n"); // Table Beamos : Neck joint not found!
|
|
}
|
|
|
|
if (eyeJnt == NULL) {
|
|
OS_REPORT_ERROR("表ビーモス:目ジョイントが見つかりませんでした!\n"); // Table Beamos: Eye joint not found!
|
|
}
|
|
|
|
setAction(0);
|
|
return 1;
|
|
}
|
|
|
|
/* 80C7CFD0-80C7D2B0 000530 02E0+00 1/0 0/0 0/0 .text CreateHeap__11daObjL6Bm_cFv */
|
|
int daObjL6Bm_c::CreateHeap() {
|
|
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(l_arcName, BMDR_K_BIMO00);
|
|
JUT_ASSERT(620, modelData != 0);
|
|
mBeamosModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084);
|
|
if (mBeamosModel == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
modelData = (J3DModelData*)dComIfG_getObjectRes(l_arcName, BMDR_EF_BIMOBEAM);
|
|
JUT_ASSERT(634, modelData != 0);
|
|
mBeamEffectModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000284);
|
|
if (mBeamEffectModel == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
J3DAnmTextureSRTKey* pbtk = (J3DAnmTextureSRTKey*)dComIfG_getObjectRes(l_arcName, BTK_EF_BIMOBEAM_ON);
|
|
JUT_ASSERT(648, pbtk != 0);
|
|
mpBtkAnm = new mDoExt_btkAnm();
|
|
if (mpBtkAnm == NULL || mpBtkAnm->init(modelData, pbtk, 1, 0, 1.0f, 0, -1) == 0) {
|
|
return 0;
|
|
}
|
|
|
|
#ifdef DEBUG
|
|
pbtk = (J3DAnmTextureSRTKey*)dComIfG_getObjectRes(l_arcName, BTK_EF_BIMOBEAM_OFF);
|
|
JUT_ASSERT(660, pbtk != 0);
|
|
#endif
|
|
|
|
pbtk = (J3DAnmTextureSRTKey*)dComIfG_getObjectRes(l_arcName, BTK_EF_BIMOBEAM);
|
|
JUT_ASSERT(666, pbtk != 0);
|
|
mpBtkAnm2 = new mDoExt_btkAnm();
|
|
if (mpBtkAnm2 == NULL || mpBtkAnm2->init(modelData, pbtk, 1, 2, 1.0f, 0, -1) == 0) {
|
|
return 0;
|
|
}
|
|
|
|
J3DAnmTransform* pbck = (J3DAnmTransform*)dComIfG_getObjectRes(l_arcName, BCK_EF_BIMOBEAM);
|
|
JUT_ASSERT(678, pbck != 0);
|
|
mBeamBck = new mDoExt_bckAnm();
|
|
if (mBeamBck == NULL || mBeamBck->init(pbck, 1, 2, 1.0f, 0, -1, false) == 0) {
|
|
return 0;
|
|
}
|
|
|
|
if (field_0x891 != 0) {
|
|
mpBtkAnm->setFrame(mpBtkAnm->getEndFrame());
|
|
mpBtkAnm2->setPlaySpeed(1.0f);
|
|
field_0x8b2 = 0x1000;
|
|
field_0x8b4 = 4;
|
|
field_0x890 = 5;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 80C7D2F8-80C7D3A4 000858 00AC+00 1/1 0/0 0/0 .text create1st__11daObjL6Bm_cFv */
|
|
cPhs__Step daObjL6Bm_c::create1st() {
|
|
if (fopAcM_isSwitch(this, getSwBit())) {
|
|
OS_REPORT("ビーモス破壊済み!<%d>\n", getSwBit() & 0xFF); // Beamos has been destroyed! <%d>\n
|
|
return cPhs_ERROR_e;
|
|
}
|
|
|
|
cPhs__Step phase = (cPhs__Step)dComIfG_resLoad(&mPhase, l_arcName);
|
|
if (phase == cPhs_COMPLEATE_e) {
|
|
phase = (cPhs__Step)MoveBGCreate(l_arcName, DZB_K_BIMO00, NULL, 0x4000, NULL);
|
|
if (phase == cPhs_ERROR_e) {
|
|
return phase;
|
|
}
|
|
}
|
|
|
|
return phase;
|
|
}
|
|
|
|
/* 80C7D3A4-80C7D4F4 000904 0150+00 1/0 0/0 0/0 .text Execute__11daObjL6Bm_cFPPA3_A4_f */
|
|
int daObjL6Bm_c::Execute(f32 (**param_1)[3][4]) {
|
|
static u16 const l_particle_id[6] = {
|
|
0x828F, 0x8290, 0x8291, 0x8292, 0x8293, 0x8294,
|
|
};
|
|
|
|
if (field_0x891 != 0) {
|
|
mBeamBck->play();
|
|
dComIfG_Ccsp()->Set(&field_0x5e8);
|
|
}
|
|
|
|
if (field_0x748.ChkTgHit() && field_0x748.GetTgHitObj() != NULL) {
|
|
for (int i = 0; i < 5; i++) {
|
|
dComIfGp_particle_set(l_particle_id[i], ¤t.pos, NULL, &scale, 0xFF, NULL, -1, NULL, NULL, NULL);
|
|
}
|
|
|
|
fopAcM_delete(this);
|
|
fopAcM_onSwitch(this, getSwBit());
|
|
}
|
|
|
|
field_0x748.SetC(field_0x894);
|
|
dComIfG_Ccsp()->Set(&field_0x748);
|
|
action();
|
|
*param_1 = &mBgMtx;
|
|
setBaseMtx();
|
|
return 1;
|
|
}
|
|
|
|
/* 80C7D4F4-80C7D598 000A54 00A4+00 1/1 0/0 0/0 .text action__11daObjL6Bm_cFv */
|
|
void daObjL6Bm_c::action() {
|
|
static daObjL6Bm_c::actionFunc l_func[3] = {
|
|
&daObjL6Bm_c::actionWait,
|
|
&daObjL6Bm_c::actionFindPlayer,
|
|
&daObjL6Bm_c::actionAttack,
|
|
};
|
|
|
|
(this->*l_func[mAction])();
|
|
}
|
|
|
|
/* 80C7D598-80C7D6CC 000AF8 0134+00 1/0 0/0 0/0 .text actionWait__11daObjL6Bm_cFv */
|
|
void daObjL6Bm_c::actionWait() {
|
|
bool var_r28 = false;
|
|
bool var_r27 = false;
|
|
f32 fVar1;
|
|
f32 playerDistance = fopAcM_searchPlayerDistanceXZ(this);
|
|
|
|
if (getArg0() != 0xFF) {
|
|
fVar1 = getArg0() * 50.0f;
|
|
} else {
|
|
fVar1 = 1000.0f;
|
|
}
|
|
|
|
if (playerDistance < fVar1) {
|
|
var_r28 = true;
|
|
}
|
|
|
|
s16 targetAngle = cLib_targetAngleY(fopAcM_GetPosition_p(this), fopAcM_GetPosition_p(dComIfGp_getPlayer(0)));
|
|
s16 angleDiff = (s16)abs((s16)(targetAngle - current.angle.y));
|
|
s16 unkBound = 0x2000;
|
|
if (angleDiff < unkBound / 2) {
|
|
var_r27 = true;
|
|
}
|
|
|
|
if (var_r28 && var_r27) {
|
|
setAction(1);
|
|
field_0x911 = 20;
|
|
} else {
|
|
s16 sVar1;
|
|
if (getArg1() != 0xFF) {
|
|
sVar1 = (u16)getArg1() * 100;
|
|
} else {
|
|
sVar1 = 0x4B0;
|
|
}
|
|
current.angle.y += sVar1;
|
|
}
|
|
|
|
field_0x892 = current.angle.y;
|
|
if (mpBtkAnm->play() != 0) {
|
|
mpBtkAnm->setPlaySpeed(0.0f);
|
|
}
|
|
}
|
|
|
|
/* 80C7D6CC-80C7D894 000C2C 01C8+00 1/0 0/0 0/0 .text actionFindPlayer__11daObjL6Bm_cFv */
|
|
void daObjL6Bm_c::actionFindPlayer() {
|
|
f32 fVar1;
|
|
bool var_r28 = false;
|
|
f32 playerDistance = fopAcM_searchPlayerDistanceXZ(this);
|
|
|
|
if (getArg0() != 0xFF) {
|
|
fVar1 = getArg0() * 50.0f;
|
|
} else {
|
|
fVar1 = 1000.0f;
|
|
}
|
|
|
|
if (playerDistance < fVar1) {
|
|
var_r28 = true;
|
|
}
|
|
|
|
if (!var_r28) {
|
|
OS_REPORT("プレイヤー離れました!\n"); // Player has left!\n
|
|
setAction(0);
|
|
|
|
if (field_0x891 != 0) {
|
|
mpBtkAnm->init(mBeamEffectModel->getModelData(), (J3DAnmTextureSRTKey*)dComIfG_getObjectRes(l_arcName, BTK_EF_BIMOBEAM_OFF),
|
|
1, 0, 1.0f, 0, -1);
|
|
field_0x891 = 0;
|
|
}
|
|
} else {
|
|
cLib_addCalcAngleS2(¤t.angle.y, fopAcM_searchPlayerAngleY(this), 10, 0x400);
|
|
if (cLib_calcTimer(&field_0x911) == 0) {
|
|
if (field_0x891 == 0) {
|
|
mpBtkAnm->init(mBeamEffectModel->getModelData(), (J3DAnmTextureSRTKey*)dComIfG_getObjectRes(l_arcName, BTK_EF_BIMOBEAM_ON),
|
|
1, 0, 0.0f, 0, -1);
|
|
field_0x891 = 1;
|
|
mpBtkAnm->setPlaySpeed(1.0f);
|
|
}
|
|
|
|
mpBtkAnm->play();
|
|
mpBtkAnm2->play();
|
|
}
|
|
}
|
|
|
|
field_0x892 = current.angle.y;
|
|
}
|
|
|
|
/* 80C7D894-80C7D898 000DF4 0004+00 1/0 0/0 0/0 .text actionAttack__11daObjL6Bm_cFv */
|
|
void daObjL6Bm_c::actionAttack() {
|
|
/* empty function */
|
|
}
|
|
|
|
/* 80C7D898-80C7DA74 000DF8 01DC+00 1/0 0/0 0/0 .text Draw__11daObjL6Bm_cFv */
|
|
int daObjL6Bm_c::Draw() {
|
|
g_env_light.settingTevStruct(16, ¤t.pos, &tevStr);
|
|
g_env_light.setLightTevColorType_MAJI(mBeamosModel, &tevStr);
|
|
dComIfGd_setListBG();
|
|
mDoExt_modelUpdateDL(mBeamosModel);
|
|
dComIfGd_setList();
|
|
|
|
if (field_0x891 != 0) {
|
|
g_env_light.setLightTevColorType_MAJI(mBeamEffectModel, &tevStr);
|
|
mpBtkAnm->entry(mBeamEffectModel->getModelData());
|
|
mpBtkAnm2->entry(mBeamEffectModel->getModelData());
|
|
mBeamBck->entry(mBeamEffectModel->getModelData());
|
|
mDoExt_modelUpdateDL(mBeamEffectModel);
|
|
mBeamBck->remove(mBeamEffectModel->getModelData());
|
|
mpBtkAnm->remove(mBeamEffectModel->getModelData());
|
|
mpBtkAnm2->remove(mBeamEffectModel->getModelData());
|
|
}
|
|
|
|
if (field_0x90c != -1000000000.0f) {
|
|
cM3dGPla plane;
|
|
if (dComIfG_Bgsp().GetTriPla(mObjGndChk, &plane)) {
|
|
dComIfGd_setSimpleShadow(¤t.pos, field_0x90c, 120.0f, &plane.mNormal, 0,
|
|
1.0f, dDlst_shadowControl_c::getSimpleTex());
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 80C7DABC-80C7DAF0 00101C 0034+00 1/0 0/0 0/0 .text Delete__11daObjL6Bm_cFv */
|
|
int daObjL6Bm_c::Delete() {
|
|
dComIfG_resDelete(&mPhase, l_arcName);
|
|
return 1;
|
|
}
|
|
|
|
/* 80C7DAF0-80C7DC78 001050 0188+00 1/0 0/0 0/0 .text daObjL6Bm_create1st__FP11daObjL6Bm_c */
|
|
static int daObjL6Bm_create1st(daObjL6Bm_c* i_this) {
|
|
fopAcM_SetupActor(i_this, daObjL6Bm_c);
|
|
return i_this->create1st();
|
|
}
|
|
|
|
/* 80C7DDDC-80C7DDFC 00133C 0020+00 1/0 0/0 0/0 .text daObjL6Bm_MoveBGDelete__FP11daObjL6Bm_c */
|
|
static int daObjL6Bm_MoveBGDelete(daObjL6Bm_c* i_this) {
|
|
return i_this->MoveBGDelete();
|
|
}
|
|
|
|
/* 80C7DDFC-80C7DE1C 00135C 0020+00 1/0 0/0 0/0 .text daObjL6Bm_MoveBGExecute__FP11daObjL6Bm_c */
|
|
static int daObjL6Bm_MoveBGExecute(daObjL6Bm_c* i_this) {
|
|
return i_this->MoveBGExecute();
|
|
}
|
|
|
|
/* 80C7DE1C-80C7DE48 00137C 002C+00 1/0 0/0 0/0 .text daObjL6Bm_MoveBGDraw__FP11daObjL6Bm_c */
|
|
static int daObjL6Bm_MoveBGDraw(daObjL6Bm_c* i_this) {
|
|
return i_this->MoveBGDraw();
|
|
}
|
|
|
|
/* 80C7E048-80C7E068 -00001 0020+00 1/0 0/0 0/0 .data daObjL6Bm_METHODS */
|
|
static actor_method_class daObjL6Bm_METHODS = {
|
|
(process_method_func)daObjL6Bm_create1st,
|
|
(process_method_func)daObjL6Bm_MoveBGDelete,
|
|
(process_method_func)daObjL6Bm_MoveBGExecute,
|
|
0,
|
|
(process_method_func)daObjL6Bm_MoveBGDraw,
|
|
};
|
|
|
|
/* 80C7E068-80C7E098 -00001 0030+00 0/0 0/0 1/0 .data g_profile_Obj_Lv6bemos */
|
|
extern actor_process_profile_definition g_profile_Obj_Lv6bemos = {
|
|
fpcLy_CURRENT_e, // mLayerID
|
|
3, // mListID
|
|
fpcPi_CURRENT_e, // mListPrio
|
|
PROC_Obj_Lv6bemos, // mProcName
|
|
&g_fpcLf_Method.base, // sub_method
|
|
sizeof(daObjL6Bm_c), // mSize
|
|
0, // mSizeOther
|
|
0, // mParameters
|
|
&g_fopAc_Method.base, // sub_method
|
|
630, // mPriority
|
|
&daObjL6Bm_METHODS, // sub_method
|
|
0x00040100, // mStatus
|
|
fopAc_ACTOR_e, // mActorType
|
|
fopAc_CULLBOX_CUSTOM_e, // cullType
|
|
};
|