mirror of https://github.com/zeldaret/tp.git
228 lines
8.0 KiB
C++
228 lines
8.0 KiB
C++
/**
|
|
* @file d_a_obj_lv6FurikoTrap.cpp
|
|
*
|
|
*/
|
|
|
|
#include "d/dolzel_rel.h" // IWYU pragma: keep
|
|
#include "d/d_s_play.h"
|
|
|
|
#include "d/actor/d_a_obj_lv6FurikoTrap.h"
|
|
|
|
|
|
/* 80C7248C-80C724C8 0000EC 003C+00 1/1 0/0 0/0 .text __ct__21daLv6FurikoTrap_HIO_cFv */
|
|
daLv6FurikoTrap_HIO_c::daLv6FurikoTrap_HIO_c() {
|
|
mIntervalSeconds = 1.0f;
|
|
mMaxAngle = 45.0f;
|
|
unk10 = 3;
|
|
}
|
|
|
|
#if DEBUG
|
|
void daLv6FurikoTrap_HIO_c::genMessage(JORMContext* context) {
|
|
context->genSlider("周期(秒)", &mIntervalSeconds, 0.1f, 100.0f, 0, NULL, -1, -1, 0x200, 0x18);
|
|
context->genSlider("最大角度", &mMaxAngle, 0.1f, 90.0f, 0, NULL, -1, -1, 0x200, 0x18);
|
|
}
|
|
#endif
|
|
|
|
static daLv6FurikoTrap_HIO_c l_HIO;
|
|
|
|
const dCcD_SrcGObjInf daLv6FurikoTrap_c::mCcDObjInfo = {
|
|
{0, {{0x800, 1, 0x1f}, {0, 0}, {0x79}}},
|
|
{1, 0, 1, 0, 1},
|
|
{0xa, 5, 0, 0, 0},
|
|
{0},
|
|
};
|
|
dCcD_SrcSph daLv6FurikoTrap_c::mCcDSph = {mCcDObjInfo};
|
|
|
|
/* 80C72510-80C72598 000170 0088+00 2/2 0/0 0/0 .text setBaseMtx__17daLv6FurikoTrap_cFv */
|
|
void daLv6FurikoTrap_c::setBaseMtx() {
|
|
mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z);
|
|
mDoMtx_stack_c::ZXYrotM(shape_angle.x, shape_angle.y, shape_angle.z);
|
|
mModel->setBaseScale(scale);
|
|
mModel->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
}
|
|
|
|
/* 80C72598-80C72604 0001F8 006C+00 1/0 0/0 0/0 .text CreateHeap__17daLv6FurikoTrap_cFv */
|
|
int daLv6FurikoTrap_c::CreateHeap() {
|
|
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("L6Furiko", 4);
|
|
JUT_ASSERT(236, modelData != NULL);
|
|
mModel = mDoExt_J3DModel__create(modelData, 0, 0x11000084);
|
|
if (mModel == NULL) {
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
/* 80C72604-80C727D4 000264 01D0+00 1/1 0/0 0/0 .text create__17daLv6FurikoTrap_cFv */
|
|
int daLv6FurikoTrap_c::create() {
|
|
fopAcM_ct(this, daLv6FurikoTrap_c);
|
|
int phase = dComIfG_resLoad(&mPhase, "L6Furiko");
|
|
if (phase == cPhs_COMPLEATE_e) {
|
|
if (MoveBGCreate("L6Furiko", 7, dBgS_MoveBGProc_TypicalRotY, 0x2e80, NULL) == cPhs_ERROR_e)
|
|
{
|
|
return cPhs_ERROR_e;
|
|
}
|
|
fopAcM_SetMtx(this, mModel->getBaseTRMtx());
|
|
fopAcM_setCullSizeBox2(this, mModel->getModelData());
|
|
init_modeMove();
|
|
setBaseMtx();
|
|
mCcStts.Init(0xff, 0, this);
|
|
for (int i = 0; i < 13; i++) {
|
|
mCcSph1[i].Set(mCcDSph);
|
|
mCcSph1[i].SetStts(&mCcStts);
|
|
}
|
|
for (int i = 0; i < 6; i++) {
|
|
mCcSph2[i].Set(mCcDSph);
|
|
mCcSph2[i].SetStts(&mCcStts);
|
|
}
|
|
#if DEBUG
|
|
l_HIO.entryHIO("振り子トラップ(Lv6)");
|
|
#endif
|
|
}
|
|
return phase;
|
|
}
|
|
|
|
/* 80C729B4-80C72CA8 000614 02F4+00 1/0 0/0 0/0 .text Execute__17daLv6FurikoTrap_cFPPA3_A4_f */
|
|
int daLv6FurikoTrap_c::Execute(Mtx** i_pMtx) {
|
|
move();
|
|
*i_pMtx = &mModel->getBaseTRMtx();
|
|
setBaseMtx();
|
|
for (int i = 0; i < 13; i++) {
|
|
cXyz c(0.0f, -850.0f + oREG_F(0), 0.0f);
|
|
mDoMtx_stack_c::ZrotS(cM_deg2s((-21.5f + oREG_F(2)) + i * (3.6f + oREG_F(3))));
|
|
mDoMtx_stack_c::ZXYrotM(shape_angle.x, shape_angle.y, shape_angle.z);
|
|
mDoMtx_stack_c::multVec(&c, &c);
|
|
c += current.pos;
|
|
mCcSph1[i].SetR(30.0f + oREG_F(4));
|
|
mCcSph1[i].SetC(c);
|
|
dComIfG_Ccsp()->Set(&mCcSph1[i]);
|
|
mCcSph1[i].ClrAtHit();
|
|
}
|
|
for (int i = 0; i < 3; i++) {
|
|
static f32 posx[] = {383.0f, 356.0f, 329.0f};
|
|
static f32 posy[] = {-660.0f, -700.0f, -740.0f};
|
|
cXyz c(posx[i] + oREG_F(5), posy[i] + oREG_F(6), 0.0f);
|
|
cXyz c2(-posx[i] + oREG_F(5), posy[i] + oREG_F(6), 0.0f);
|
|
mDoMtx_stack_c::ZXYrotS(shape_angle.x, shape_angle.y, shape_angle.z);
|
|
mDoMtx_stack_c::multVec(&c, &c);
|
|
mDoMtx_stack_c::multVec(&c2, &c2);
|
|
c += current.pos;
|
|
c2 += current.pos;
|
|
mCcSph2[i].SetR(30.0f + oREG_F(4));
|
|
mCcSph2[i + 3].SetR(30.0f + oREG_F(4));
|
|
mCcSph2[i].SetC(c);
|
|
mCcSph2[i + 3].SetC(c2);
|
|
dComIfG_Ccsp()->Set(&mCcSph2[i]);
|
|
dComIfG_Ccsp()->Set(&mCcSph2[i + 3]);
|
|
mCcSph2[i].ClrAtHit();
|
|
}
|
|
mCcStts.Move();
|
|
return TRUE;
|
|
}
|
|
|
|
/* 80C72CA8-80C72D24 000908 007C+00 1/1 0/0 0/0 .text move__17daLv6FurikoTrap_cFv */
|
|
void daLv6FurikoTrap_c::move() {
|
|
typedef void (daLv6FurikoTrap_c::*func_call)();
|
|
static const func_call mode_proc[] = {
|
|
&daLv6FurikoTrap_c::modeMove
|
|
};
|
|
(this->*mode_proc[mMode])();
|
|
}
|
|
|
|
/* 80C72D24-80C72D38 000984 0014+00 1/1 0/0 0/0 .text init_modeMove__17daLv6FurikoTrap_cFv */
|
|
void daLv6FurikoTrap_c::init_modeMove() {
|
|
mAngle = 0;
|
|
mTimer = 0;
|
|
mMode = 0;
|
|
}
|
|
|
|
/* 80C72D38-80C72EE0 000998 01A8+00 1/0 0/0 0/0 .text modeMove__17daLv6FurikoTrap_cFv */
|
|
void daLv6FurikoTrap_c::modeMove() {
|
|
int unused = shape_angle.z;
|
|
mAngleIncrement = cM_deg2s((2.0f * l_HIO.mMaxAngle) / (30.0f * l_HIO.mIntervalSeconds));
|
|
s16 s = cM_deg2s(cM_scos(mAngle) * l_HIO.mMaxAngle);
|
|
shape_angle.z = s;
|
|
mAngle += mAngleIncrement;
|
|
if (std::fabs(cM_scos(mAngle)) > 0.999f && mTimer == 0) {
|
|
mTimer = 3;
|
|
cXyz c(0.0f, -940.0f, 0.0f);
|
|
mDoMtx_stack_c::ZXYrotS(shape_angle.x, shape_angle.y, shape_angle.z);
|
|
mDoMtx_stack_c::multVec(&c, &c);
|
|
c += current.pos;
|
|
mDoAud_seStart(Z2SE_OBJ_L6_BLADE, &c, (u32)fopAcM_GetSpeedF(this),
|
|
dComIfGp_getReverb(fopAcM_GetRoomNo(this)));
|
|
}
|
|
if (mTimer != 0) {
|
|
mTimer--;
|
|
}
|
|
}
|
|
|
|
/* 80C72EE0-80C72F94 000B40 00B4+00 1/0 0/0 0/0 .text Draw__17daLv6FurikoTrap_cFv */
|
|
int daLv6FurikoTrap_c::Draw() {
|
|
g_env_light.settingTevStruct(0x10, ¤t.pos, &tevStr);
|
|
g_env_light.setLightTevColorType_MAJI(mModel, &tevStr);
|
|
fopAcM_setEffectMtx(this, mModel->getModelData());
|
|
dComIfGd_setListBG();
|
|
mDoExt_modelUpdateDL(mModel);
|
|
dComIfGd_setList();
|
|
return TRUE;
|
|
}
|
|
|
|
/* 80C72F94-80C72FC4 000BF4 0030+00 1/0 0/0 0/0 .text Delete__17daLv6FurikoTrap_cFv */
|
|
int daLv6FurikoTrap_c::Delete() {
|
|
dComIfG_resDelete(&mPhase, "L6Furiko");
|
|
#if DEBUG
|
|
l_HIO.removeHIO();
|
|
#endif
|
|
return TRUE;
|
|
}
|
|
|
|
/* 80C72FC4-80C72FF0 000C24 002C+00 1/0 0/0 0/0 .text daLv6FurikoTrap_Draw__FP17daLv6FurikoTrap_c */
|
|
static int daLv6FurikoTrap_Draw(daLv6FurikoTrap_c* i_this) {
|
|
return i_this->MoveBGDraw();
|
|
}
|
|
|
|
/* 80C72FF0-80C73010 000C50 0020+00 1/0 0/0 0/0 .text daLv6FurikoTrap_Execute__FP17daLv6FurikoTrap_c */
|
|
static int daLv6FurikoTrap_Execute(daLv6FurikoTrap_c* i_this) {
|
|
return i_this->MoveBGExecute();
|
|
}
|
|
|
|
/* 80C73010-80C73030 000C70 0020+00 1/0 0/0 0/0 .text daLv6FurikoTrap_Delete__FP17daLv6FurikoTrap_c */
|
|
static int daLv6FurikoTrap_Delete(daLv6FurikoTrap_c* i_this) {
|
|
fpc_ProcID id = fopAcM_GetID(i_this);
|
|
return i_this->MoveBGDelete();
|
|
}
|
|
|
|
/* 80C73030-80C73050 000C90 0020+00 1/0 0/0 0/0 .text daLv6FurikoTrap_Create__FP10fopAc_ac_c */
|
|
static int daLv6FurikoTrap_Create(fopAc_ac_c* i_this) {
|
|
daLv6FurikoTrap_c* this_trap = (daLv6FurikoTrap_c*)i_this;
|
|
fpc_ProcID id = fopAcM_GetID(i_this);
|
|
return this_trap->create();
|
|
}
|
|
|
|
/* 80C73214-80C73234 -00001 0020+00 1/0 0/0 0/0 .data l_daLv6FurikoTrap_Method */
|
|
static actor_method_class l_daLv6FurikoTrap_Method = {
|
|
(process_method_func)daLv6FurikoTrap_Create,
|
|
(process_method_func)daLv6FurikoTrap_Delete,
|
|
(process_method_func)daLv6FurikoTrap_Execute,
|
|
0,
|
|
(process_method_func)daLv6FurikoTrap_Draw,
|
|
};
|
|
|
|
/* 80C73234-80C73264 -00001 0030+00 0/0 0/0 1/0 .data g_profile_Obj_Lv6FuriTrap */
|
|
extern actor_process_profile_definition g_profile_Obj_Lv6FuriTrap = {
|
|
fpcLy_CURRENT_e, // mLayerID
|
|
3, // mListID
|
|
fpcPi_CURRENT_e, // mListPrio
|
|
PROC_Obj_Lv6FuriTrap, // mProcName
|
|
&g_fpcLf_Method.base, // sub_method
|
|
sizeof(daLv6FurikoTrap_c), // mSize
|
|
0, // mSizeOther
|
|
0, // mParameters
|
|
&g_fopAc_Method.base, // sub_method
|
|
627, // mPriority
|
|
&l_daLv6FurikoTrap_Method, // sub_method
|
|
0x00040000, // mStatus
|
|
fopAc_ACTOR_e, // mActorType
|
|
fopAc_CULLBOX_CUSTOM_e, // cullType
|
|
};
|