mirror of https://github.com/zeldaret/tp.git
490 lines
13 KiB
C++
490 lines
13 KiB
C++
/**
|
|
* @file d_a_obj_lv7bridge.cpp
|
|
*
|
|
*/
|
|
|
|
#include "d/dolzel_rel.h" // IWYU pragma: keep
|
|
|
|
#include "d/actor/d_a_obj_lv7bridge.h"
|
|
#include "d/actor/d_a_obj_swspinner.h"
|
|
#include "d/d_s_play.h"
|
|
|
|
#if DEBUG
|
|
class daObjLv7Brg_HIO_c : public JORReflexible {
|
|
public:
|
|
daObjLv7Brg_HIO_c();
|
|
virtual ~daObjLv7Brg_HIO_c() {}
|
|
|
|
void genMessage(JORMContext*);
|
|
|
|
u8 field_0x04[0x08 - 0x04];
|
|
f32 field_0x08;
|
|
f32 field_0x0c;
|
|
};
|
|
|
|
daObjLv7Brg_HIO_c::daObjLv7Brg_HIO_c() {
|
|
}
|
|
|
|
void daObjLv7Brg_HIO_c::genMessage(JORMContext* ctx) {
|
|
// DEBUG NONMATCHING
|
|
}
|
|
|
|
static daObjLv7Brg_HIO_c l_HIO;
|
|
#endif
|
|
|
|
static void* searchSwSpinner(void* i_actor, void* i_data) {
|
|
fopAc_ac_c* swspinner = (fopAc_ac_c*)i_actor;
|
|
fopAc_ac_c* brg = (fopAc_ac_c*)i_data;
|
|
|
|
if (swspinner != NULL && fopAcM_IsActor(swspinner) && fopAcM_GetProfName(swspinner) == PROC_Obj_SwSpinner) {
|
|
if (((daObjLv7Brg_c*)brg)->getSwbit() == ((daObjSwSpinner_c*)swspinner)->getSwbit()) {
|
|
return swspinner;
|
|
}
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
daObjSwSpinner_c* daObjLv7Brg_c::search_swspinner() {
|
|
daObjSwSpinner_c* swspinner = NULL;
|
|
if (parentActorID == fpcM_ERROR_PROCESS_ID_e) {
|
|
swspinner = (daObjSwSpinner_c*)fpcM_Search(searchSwSpinner, this);
|
|
if (swspinner != NULL) {
|
|
parentActorID = fopAcM_GetID(swspinner);
|
|
}
|
|
}
|
|
|
|
return swspinner;
|
|
}
|
|
|
|
void daObjLv7Brg_c::initBaseMtx() {
|
|
mpModel->setBaseScale(scale);
|
|
|
|
if (mpBrokenModel != NULL) {
|
|
mpBrokenModel->setBaseScale(scale);
|
|
}
|
|
|
|
setBaseMtx();
|
|
}
|
|
|
|
static const int l_bmd[] = {4, 10};
|
|
|
|
static const int l_dzb[] = {7, 13};
|
|
|
|
static const u16 l_eff_id[] = {
|
|
dPa_RM(ID_ZI_S_LV7BRDG_BREAK_A),
|
|
dPa_RM(ID_ZI_S_LV7BRDG_BREAK_B),
|
|
dPa_RM(ID_ZI_S_LV7BRDG_BREAK_C),
|
|
dPa_RM(ID_ZI_S_LV7BRDG_BREAK_D),
|
|
dPa_RM(ID_ZI_S_LV7BRDG_BREAK_E),
|
|
dPa_RM(ID_ZI_S_LV7BRDG_BREAK_F),
|
|
dPa_RM(ID_ZI_S_LV7BRDG_BREAK_G),
|
|
dPa_RM(ID_ZI_S_LV7BRDG_BREAK_H),
|
|
dPa_RM(ID_ZI_S_LV7BRDG_BREAK_I),
|
|
};
|
|
|
|
static const u32 l_heap_size[] = {0x6000, 0x20000};
|
|
|
|
void daObjLv7Brg_c::setBaseMtx() {
|
|
cXyz sp8(field_0xa78, 0.0f, 0.0f);
|
|
if (mKind == 1) {
|
|
sp8.set(-field_0xa78, 0.0f, 0.0f);
|
|
}
|
|
|
|
mDoMtx_stack_c::YrotS(shape_angle.y);
|
|
mDoMtx_stack_c::multVec(&sp8, &sp8);
|
|
mDoMtx_stack_c::transS(current.pos);
|
|
mDoMtx_stack_c::transM(sp8);
|
|
mDoMtx_stack_c::YrotM(shape_angle.y);
|
|
mpModel->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
MTXCopy(mDoMtx_stack_c::get(), mBgMtx);
|
|
|
|
if (mKind == 1) {
|
|
mDoMtx_stack_c::transS(current.pos);
|
|
mDoMtx_stack_c::transM(sp8);
|
|
mDoMtx_stack_c::YrotM(shape_angle.y);
|
|
mpBrokenModel->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
}
|
|
}
|
|
|
|
static char* l_arcName[2] = {
|
|
"Obj_l7brg",
|
|
"K_bridge",
|
|
};
|
|
|
|
static dCcD_SrcCyl l_cyl_src = {
|
|
{
|
|
{0x0, {{AT_TYPE_CSTATUE_SWING, 0x0, 0xd}, {0x0, 0x0}, 0x19}}, // mObj
|
|
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0xd}, // mGObjAt
|
|
{dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x6}, // mGObjTg
|
|
{0x0}, // mGObjCo
|
|
}, // mObjInf
|
|
{
|
|
{0.0f, 0.0f, 0.0f}, // mCenter
|
|
100.0f, // mRadius
|
|
250.0f // mHeight
|
|
} // mCyl
|
|
};
|
|
|
|
int daObjLv7Brg_c::Create() {
|
|
field_0xa94 = -1;
|
|
field_0xa95 = field_0xa94;
|
|
|
|
if (mKind == 1) {
|
|
if (fopAcM_isSwitch(this, getSwbit3())) {
|
|
if (mpBgW != NULL && mpBgW->ChkUsed()) {
|
|
dComIfG_Bgsp().Release(mpBgW);
|
|
}
|
|
|
|
if (mpBgw2 != NULL && !mpBgw2->ChkUsed()) {
|
|
dComIfG_Bgsp().Regist(mpBgw2, this);
|
|
}
|
|
|
|
field_0xa94 = 1;
|
|
mpBck[1]->setFrame(mpBck[1]->getEndFrame());
|
|
field_0xa96 = 1;
|
|
OS_REPORT("壊れる橋:破壊済みです!\n");
|
|
}
|
|
|
|
if (fopAcM_isSwitch(this, getSwbit2())) {
|
|
field_0xa78 = 5100.0f;
|
|
setMode(1);
|
|
OS_REPORT("壊れる橋:移動済みです!\n");
|
|
}
|
|
} else if (mType == 0 && fopAcM_isSwitch(this, getSwbit2())) {
|
|
field_0xa78 = 5100.0f;
|
|
setMode(1);
|
|
}
|
|
|
|
fopAcM_setCullSizeFar(this, 100.0f);
|
|
initBaseMtx();
|
|
fopAcM_SetMtx(this, mpModel->getBaseTRMtx());
|
|
fopAcM_setCullSizeBox2(this, mpModel->getModelData());
|
|
mCcStts.Init(0xFF, 0xFF, this);
|
|
|
|
for (int i = 0; i < 2; i++) {
|
|
mCcCyl[i].Set(l_cyl_src);
|
|
mCcCyl[i].SetStts(&mCcStts);
|
|
}
|
|
|
|
calcCoPos();
|
|
MoveBGExecute();
|
|
return 1;
|
|
}
|
|
|
|
int daObjLv7Brg_c::CreateHeap() {
|
|
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(l_arcName[mKind], l_bmd[mKind]);
|
|
JUT_ASSERT(374, modelData != NULL);
|
|
mpModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084);
|
|
if (mpModel == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
if (mKind == 1) {
|
|
J3DModelData* modelData2 = (J3DModelData*)dComIfG_getObjectRes(l_arcName[mKind], 9);
|
|
JUT_ASSERT(374, modelData2 != NULL);
|
|
mpBrokenModel = mDoExt_J3DModel__create(modelData2, 0x80000, 0x11000084);
|
|
if (mpBrokenModel == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
for (int i = 0; i < 2; i++) {
|
|
static const int l_bck[] = {5, 6};
|
|
|
|
J3DAnmTransform* pbck = (J3DAnmTransform*)dComIfG_getObjectRes(l_arcName[mKind], l_bck[i]);
|
|
JUT_ASSERT(411, pbck != NULL);
|
|
|
|
mpBck[i] = new mDoExt_bckAnm();
|
|
if (mpBck[i] == NULL || !mpBck[i]->init(pbck, 1, 0, 1.0f, 0, -1, 0)) {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
mpBgw2 = new dBgW();
|
|
if (mpBgw2 != NULL && !mpBgw2->Set((cBgD_t*)dComIfG_getObjectRes(l_arcName[mKind], 0xE), 1, &mBgMtx)) {
|
|
mpBgw2->SetCrrFunc(dBgS_MoveBGProc_Typical);
|
|
} else {
|
|
mpBgw2 = NULL;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
int daObjLv7Brg_c::create1st() {
|
|
if (!mInitParams) {
|
|
mInitParams = TRUE;
|
|
field_0xa80 = home.angle.x;
|
|
field_0xa82 = home.angle.z;
|
|
shape_angle.x = 0;
|
|
current.angle.x = 0;
|
|
home.angle.x = 0;
|
|
shape_angle.z = 0;
|
|
current.angle.z = 0;
|
|
home.angle.z = 0;
|
|
}
|
|
|
|
mType = getType();
|
|
mKind = getKind();
|
|
|
|
int phase_state = dComIfG_resLoad(&mPhase, l_arcName[mKind]);
|
|
if (phase_state == cPhs_COMPLEATE_e) {
|
|
phase_state = MoveBGCreate(l_arcName[mKind], l_dzb[mKind], dBgS_MoveBGProc_Typical, l_heap_size[mKind], NULL);
|
|
if (phase_state == cPhs_ERROR_e) {
|
|
return phase_state;
|
|
}
|
|
}
|
|
|
|
return phase_state;
|
|
}
|
|
|
|
int daObjLv7Brg_c::Execute(Mtx** param_0) {
|
|
search_swspinner();
|
|
action();
|
|
|
|
*param_0 = &mBgMtx;
|
|
setBaseMtx();
|
|
|
|
cXyz sp1C(2550.0f, 0.0f, 0.0f);
|
|
if (mKind == 1) {
|
|
sp1C.x = -sp1C.x;
|
|
}
|
|
|
|
mDoMtx_stack_c::YrotS(shape_angle.y);
|
|
mDoMtx_stack_c::multVec(&sp1C, &sp1C);
|
|
mDoMtx_stack_c::transS(current.pos);
|
|
mDoMtx_stack_c::transM(sp1C);
|
|
mDoMtx_stack_c::YrotM(shape_angle.y);
|
|
mDoMtx_stack_c::multVecZero(&eyePos);
|
|
|
|
sp1C.set(7650.0f, 0.0f, 0.0f);
|
|
if (mKind == 1) {
|
|
sp1C.x = -sp1C.x;
|
|
}
|
|
|
|
mDoMtx_stack_c::YrotS(shape_angle.y);
|
|
mDoMtx_stack_c::multVec(&sp1C, &sp1C);
|
|
mDoMtx_stack_c::transS(current.pos);
|
|
mDoMtx_stack_c::transM(sp1C);
|
|
mDoMtx_stack_c::YrotM(shape_angle.y);
|
|
mDoMtx_stack_c::multVecZero(&field_0xa98);
|
|
|
|
if (field_0xa94 == 0) {
|
|
mpBck[0]->setPlaySpeed(1.0f);
|
|
mpBck[0]->play();
|
|
|
|
if (field_0xa95 == -1) {
|
|
cXyz effpos(-field_0xa78, 0.0f, 0.0f);
|
|
mDoMtx_stack_c::YrotS(shape_angle.y);
|
|
mDoMtx_stack_c::multVec(&effpos, &effpos);
|
|
mDoMtx_stack_c::transS(current.pos);
|
|
mDoMtx_stack_c::transM(effpos);
|
|
mDoMtx_stack_c::YrotM(shape_angle.y);
|
|
mDoMtx_stack_c::multVecZero(&effpos);
|
|
|
|
for (int i = 0; i < 9; i++) {
|
|
dComIfGp_particle_set(l_eff_id[i], &effpos, &home.angle, &scale, 0xFF, NULL, -1, NULL, NULL, NULL);
|
|
}
|
|
}
|
|
} else if (field_0xa94 == 1) {
|
|
mpBck[1]->setPlaySpeed(1.0f);
|
|
if (mpBck[1]->play()) {
|
|
if (mpBgW->ChkUsed()) {
|
|
dComIfG_Bgsp().Release(mpBgW);
|
|
}
|
|
|
|
if (mpBgw2 != NULL && !mpBgw2->ChkUsed()) {
|
|
dComIfG_Bgsp().Regist(mpBgw2, this);
|
|
}
|
|
|
|
field_0xa96 = 1;
|
|
}
|
|
}
|
|
|
|
if (mpBgw2 != NULL && mpBgw2->ChkUsed()) {
|
|
mpBgw2->Move();
|
|
}
|
|
|
|
field_0xa95 = field_0xa94;
|
|
return 1;
|
|
}
|
|
|
|
void daObjLv7Brg_c::action() {
|
|
static void (daObjLv7Brg_c::*mode_proc[])() = {
|
|
&daObjLv7Brg_c::mode_action,
|
|
&daObjLv7Brg_c::mode_end,
|
|
};
|
|
|
|
(this->*mode_proc[mMode])();
|
|
|
|
if (speedF < 0.0f || KREG_S(7) != 0) {
|
|
dComIfG_Ccsp()->Set(&mCcCyl[0]);
|
|
dComIfG_Ccsp()->Set(&mCcCyl[1]);
|
|
}
|
|
}
|
|
|
|
void daObjLv7Brg_c::mode_action() {
|
|
f32 var_f31;
|
|
f32 temp_f30 = field_0xa78;
|
|
f32 temp_f29 = speedF;
|
|
|
|
if (fopAcM_isSwitch(this, getSwbit())) {
|
|
if (5100.0f == field_0xa78) {
|
|
var_f31 = 0.0f;
|
|
} else {
|
|
#if DEBUG
|
|
var_f31 = l_HIO.field_0x08;
|
|
#else
|
|
var_f31 = 30.0f;
|
|
#endif
|
|
}
|
|
} else if (0.0f == field_0xa78) {
|
|
var_f31 = 0.0f;
|
|
} else {
|
|
#if DEBUG
|
|
var_f31 = -l_HIO.field_0x0c;
|
|
#else
|
|
var_f31 = -45.0f;
|
|
#endif
|
|
}
|
|
|
|
cLib_addCalc(&speedF, var_f31, 0.02f, 1.0f, 0.1f);
|
|
field_0xa78 += speedF;
|
|
|
|
if (0.0f != speedF) {
|
|
#if DEBUG
|
|
u32 var_r28 = 127.0f * speedF / l_HIO.field_0x08;
|
|
#else
|
|
u32 var_r28 = 127.0f * speedF / 30.0f;
|
|
#endif
|
|
fopAcM_seStartLevel(this, 0x8025F, var_r28);
|
|
}
|
|
|
|
if (0.0f != speedF && 0.0f == temp_f29) {
|
|
dComIfGp_getVibration().StartQuake(2, 0xF, cXyz(0.0f, 1.0f, 0.0f));
|
|
}
|
|
|
|
if (field_0xa78 < 0.0f) {
|
|
field_0xa78 = 0.0f;
|
|
speedF = 0.0f;
|
|
dComIfGp_getVibration().StopQuake(0x1F);
|
|
|
|
if (temp_f30 > 0.0f) {
|
|
dComIfGp_getVibration().StartShock(8, 0x1F, cXyz(0.0f, 1.0f, 0.0f));
|
|
}
|
|
} else if (field_0xa78 > 5100.0f) {
|
|
field_0xa78 = 5100.0f;
|
|
speedF = 0.0f;
|
|
dComIfGp_getVibration().StopQuake(0x1F);
|
|
|
|
if (temp_f30 < 5100.0f) {
|
|
mDoAud_seStart(Z2SE_OBJ_BRDG_STOP, &field_0xa98, 0, 0);
|
|
dComIfGp_getVibration().StartShock(8, 0x1F, cXyz(0.0f, 1.0f, 0.0f));
|
|
if (mType == 0) {
|
|
fopAcM_onSwitch(this, getSwbit2());
|
|
setMode(1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void daObjLv7Brg_c::mode_end() {}
|
|
|
|
void daObjLv7Brg_c::calcCoPos() {
|
|
cXyz sp8[2];
|
|
sp8[0].set(2700.0f, -80.0f, 450.0f);
|
|
sp8[1].set(2700.0f, -80.0f, -450.0f);
|
|
|
|
if (mKind == 1) {
|
|
sp8[0].set(-2700.0f, -80.0f, 450.0f);
|
|
sp8[1].set(-2700.0f, -80.0f, -450.0f);
|
|
}
|
|
|
|
mDoMtx_stack_c::transS(current.pos);
|
|
mDoMtx_stack_c::YrotM(shape_angle.y);
|
|
|
|
for (int i = 0; i < 2; i++) {
|
|
mDoMtx_stack_c::multVec(&sp8[i], &sp8[i]);
|
|
}
|
|
|
|
mCcCyl[0].SetC(sp8[0]);
|
|
mCcCyl[1].SetC(sp8[1]);
|
|
}
|
|
|
|
int daObjLv7Brg_c::Draw() {
|
|
if (0.0f == field_0xa78) {
|
|
return 1;
|
|
}
|
|
|
|
g_env_light.settingTevStruct(16, ¤t.pos, &tevStr);
|
|
g_env_light.setLightTevColorType_MAJI(mpModel, &tevStr);
|
|
dComIfGd_setListBG();
|
|
mDoExt_modelUpdateDL(mpModel);
|
|
|
|
if (mKind == 1) {
|
|
g_env_light.setLightTevColorType_MAJI(mpBrokenModel, &tevStr);
|
|
if (mpBck[0] != NULL && mpBck[1] != NULL && field_0xa96 == 0) {
|
|
if (field_0xa94 != -1) {
|
|
mpBck[field_0xa94]->entry(mpBrokenModel->getModelData());
|
|
}
|
|
mDoExt_modelUpdateDL(mpBrokenModel);
|
|
mDoExt_bckAnmRemove(mpBrokenModel->getModelData());
|
|
}
|
|
}
|
|
|
|
dComIfGd_setList();
|
|
return 1;
|
|
}
|
|
|
|
int daObjLv7Brg_c::Delete() {
|
|
if (mpBgw2 != NULL && mpBgw2->ChkUsed()) {
|
|
dComIfG_Bgsp().Release(mpBgw2);
|
|
}
|
|
|
|
dComIfG_resDelete(&mPhase, l_arcName[mKind]);
|
|
return 1;
|
|
}
|
|
|
|
static int daObjLv7Brg_create1st(daObjLv7Brg_c* i_this) {
|
|
fopAcM_ct(i_this, daObjLv7Brg_c);
|
|
return i_this->create1st();
|
|
}
|
|
|
|
static int daObjLv7Brg_MoveBGDelete(daObjLv7Brg_c* i_this) {
|
|
return i_this->MoveBGDelete();
|
|
}
|
|
|
|
static int daObjLv7Brg_MoveBGExecute(daObjLv7Brg_c* i_this) {
|
|
return i_this->MoveBGExecute();
|
|
}
|
|
|
|
static int daObjLv7Brg_MoveBGDraw(daObjLv7Brg_c* i_this) {
|
|
return i_this->MoveBGDraw();
|
|
}
|
|
|
|
static actor_method_class daObjLv7Brg_METHODS = {
|
|
(process_method_func)daObjLv7Brg_create1st,
|
|
(process_method_func)daObjLv7Brg_MoveBGDelete,
|
|
(process_method_func)daObjLv7Brg_MoveBGExecute,
|
|
0,
|
|
(process_method_func)daObjLv7Brg_MoveBGDraw,
|
|
};
|
|
|
|
actor_process_profile_definition g_profile_Obj_Lv7Bridge = {
|
|
fpcLy_CURRENT_e, // mLayerID
|
|
3, // mListID
|
|
fpcPi_CURRENT_e, // mListPrio
|
|
PROC_Obj_Lv7Bridge, // mProcName
|
|
&g_fpcLf_Method.base, // sub_method
|
|
sizeof(daObjLv7Brg_c), // mSize
|
|
0, // mSizeOther
|
|
0, // mParameters
|
|
&g_fopAc_Method.base, // sub_method
|
|
566, // mPriority
|
|
&daObjLv7Brg_METHODS, // sub_method
|
|
0x00040100, // mStatus
|
|
fopAc_ACTOR_e, // mActorType
|
|
fopAc_CULLBOX_CUSTOM_e, // cullType
|
|
};
|