mirror of
https://github.com/TwilitRealm/dusklight
synced 2026-05-30 00:16:19 -04:00
dfa8efa97b
* some wii OS fixes * remove old dol2asm comments * remove dol2asm.h * remove function address comments * normalize ATTRIBUTE_ALIGN usage * DECL_WEAK macro * fix gcc attribute weak macro * wrap more mwcc specific things in ifdefs * fixes * fix revo sdk version flags * fixes
279 lines
7.1 KiB
C++
279 lines
7.1 KiB
C++
/**
|
|
* @file d_a_obj_rotBridge.cpp
|
|
*
|
|
*/
|
|
|
|
#include "d/dolzel_rel.h" // IWYU pragma: keep
|
|
|
|
#include "d/actor/d_a_obj_rotBridge.h"
|
|
|
|
static char* l_resNameIdx[3] = {
|
|
"P_Mbridge",
|
|
"P_Mbridge",
|
|
"P_Mbrid9",
|
|
};
|
|
|
|
daRotBridge_HIO_c::daRotBridge_HIO_c() {
|
|
field_0x5 = 60;
|
|
field_0x6 = 1;
|
|
shake_power = 3;
|
|
vibration_range[0] = 1500.0f;
|
|
vibration_range[1] = 1500.0f;
|
|
vibration_range[2] = 1500.0f;
|
|
draw_wall_collision = FALSE;
|
|
}
|
|
|
|
void daRotBridge_c::setBaseMtx() {
|
|
|
|
if (mpBgW2 != NULL) {
|
|
mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z);
|
|
|
|
if (home.angle.y == 0) {
|
|
mDoMtx_stack_c::YrotM(-0x4000);
|
|
} else {
|
|
mDoMtx_stack_c::YrotM(-0x8000);
|
|
}
|
|
|
|
mpModel->setBaseScale(scale);
|
|
mpModel->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
MTXCopy(mDoMtx_stack_c::get(), mMtx);
|
|
}
|
|
|
|
mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z);
|
|
mDoMtx_stack_c::YrotM(shape_angle.y);
|
|
|
|
mpModel->setBaseScale(scale);
|
|
mpModel->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
}
|
|
|
|
static const int l_bmdIdx[] = {
|
|
8,
|
|
8,
|
|
8,
|
|
};
|
|
|
|
static const int l_dzbIdx[] = {
|
|
12,
|
|
12,
|
|
11,
|
|
};
|
|
|
|
static const int l_bckIdx[] = {
|
|
5,
|
|
5,
|
|
5,
|
|
};
|
|
|
|
int daRotBridge_c::CreateHeap() {
|
|
J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(l_resNameIdx[mType], l_bmdIdx[mType]);
|
|
JUT_ASSERT(216, modelData != NULL);
|
|
|
|
mpModel = mDoExt_J3DModel__create(modelData, J3DMdlFlag_DifferedDLBuffer, BMD_DEFAULT_DIFF_FLAGS);
|
|
if (mpModel == NULL) {
|
|
return 0;
|
|
}
|
|
|
|
int res = mBck.init((J3DAnmTransform*)dComIfG_getObjectRes(l_resNameIdx[mType], l_bckIdx[mType]), 1, 0, 1.0f, 0, -1, 0);
|
|
JUT_ASSERT(230, res == 1);
|
|
|
|
u8 temp_r25 = (fopAcM_GetParam(this) & 0xF000) >> 0xC;
|
|
if (mType == 1 && temp_r25 != 15) {
|
|
mpBgW2 = new dBgW();
|
|
if (mpBgW2 == NULL || mpBgW2->Set((cBgD_t*)dComIfG_getObjectRes(l_resNameIdx[mType], 0xB), 1, &mMtx)) {
|
|
mpBgW2 = NULL;
|
|
return 0;
|
|
}
|
|
} else {
|
|
mpBgW2 = NULL;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
int daRotBridge_c::create() {
|
|
fopAcM_ct(this, daRotBridge_c);
|
|
|
|
mType = (fopAcM_GetParam(this) & 0xF00) >> 8;
|
|
|
|
int phase_state = dComIfG_resLoad(&mPhase, l_resNameIdx[mType]);
|
|
if (phase_state == cPhs_COMPLEATE_e) {
|
|
if (MoveBGCreate(l_resNameIdx[mType], l_dzbIdx[mType], dBgS_MoveBGProc_TypicalRotY, 0x2C80, NULL) == cPhs_ERROR_e) {
|
|
return cPhs_ERROR_e;
|
|
}
|
|
|
|
bitSw = fopAcM_isSwitch(this, fopAcM_GetParam(this) & 0xFF);
|
|
mBck.setEndFrame(mBck.getEndFrame() - 1.0f);
|
|
mBckSpeed = 1.0f;
|
|
mBridgeAngle = 0;
|
|
|
|
if (bitSw == 0) {
|
|
shape_angle.y += 0x4000;
|
|
mBridgeAngle = 1;
|
|
}
|
|
|
|
mBck.setPlaySpeed(mBckSpeed);
|
|
mpModel->calcAnmMtx();
|
|
|
|
mpBgW->SetRideCallback(rideCallBack);
|
|
if (mpBgW2 != NULL && mpBgW2->ChkUsed()) {
|
|
dComIfG_Bgsp().Release(mpBgW2);
|
|
mpBgW2->Move();
|
|
}
|
|
|
|
mDoMove = FALSE;
|
|
mIsPlayerRide = FALSE;
|
|
mIsPlayerInArea = FALSE;
|
|
|
|
fopAcM_SetMtx(this, mpModel->getBaseTRMtx());
|
|
fopAcM_setCullSizeBox2(this, mpModel->getModelData());
|
|
setBaseMtx();
|
|
}
|
|
|
|
return phase_state;
|
|
}
|
|
|
|
void daRotBridge_c::rideCallBack(dBgW* i_bgw, fopAc_ac_c* i_bgActor, fopAc_ac_c* i_rideActor) {
|
|
if (fopAcM_GetName(i_rideActor) == PROC_ALINK) {
|
|
((daRotBridge_c*)i_bgActor)->mIsPlayerRide = TRUE;
|
|
}
|
|
}
|
|
|
|
int daRotBridge_c::Execute(Mtx** param_0) {
|
|
u8 isSw = fopAcM_isSwitch(this, fopAcM_GetParam(this) & 0xFF);
|
|
if (bitSw != isSw) {
|
|
if (isSw) {
|
|
mDoMove = TRUE;
|
|
fopAcM_seStart(this, Z2SE_OBJ_ROLLBRG_MOVESTART, 0);
|
|
|
|
if (mpBgW2 != NULL) {
|
|
dComIfG_Bgsp().Regist(mpBgW2, this);
|
|
mpBgW2->Move();
|
|
}
|
|
}
|
|
|
|
bitSw = isSw;
|
|
}
|
|
|
|
playerAreaCheck();
|
|
moveBridge();
|
|
*param_0 = (Mtx*)mpModel->getAnmMtx(0);
|
|
mIsPlayerRide = FALSE;
|
|
return 1;
|
|
}
|
|
|
|
static daRotBridge_HIO_c l_HIO;
|
|
|
|
void daRotBridge_c::playerAreaCheck() {
|
|
fopAc_ac_c* player = dComIfGp_getPlayer(0);
|
|
|
|
cXyz sp8 = current.pos - player->current.pos;
|
|
f32 pl_dist = sp8.absXZ();
|
|
|
|
mIsPlayerInArea = FALSE;
|
|
if (pl_dist <= l_HIO.vibration_range[mType]) {
|
|
mIsPlayerInArea = TRUE;
|
|
}
|
|
}
|
|
|
|
void daRotBridge_c::moveBridge() {
|
|
if (mDoMove) {
|
|
mDoMtx_MtxToRot(mpModel->getAnmMtx(0), &mRotation);
|
|
shape_angle.y = mRotation.y;
|
|
|
|
if (mBck.play()) {
|
|
mBck.setPlaySpeed(mBckSpeed);
|
|
mBck.setFrame(mBck.getStartFrame());
|
|
mDoMove = FALSE;
|
|
|
|
if (mpBgW2 != NULL && mpBgW2->ChkUsed()) {
|
|
dComIfG_Bgsp().Release(mpBgW2);
|
|
mpBgW2->Move();
|
|
}
|
|
|
|
if (mIsPlayerRide || mIsPlayerInArea) {
|
|
dComIfGp_getVibration().StartShock(l_HIO.shake_power, 0xF, cXyz(0.0f, 1.0f, 0.0f));
|
|
}
|
|
|
|
shape_angle.y &= 0xF000;
|
|
setBaseMtx();
|
|
mBridgeAngle ^= 1;
|
|
} else {
|
|
if (mBck.getFrame() == mBck.getEndFrame() - 10.0f) {
|
|
fopAcM_seStart(this, Z2SE_OBJ_ROLLBRG_MOVEEND, 0);
|
|
}
|
|
|
|
fopAcM_seStartLevel(this, Z2SE_OBJ_ROLLBRG_MOVE, 0);
|
|
}
|
|
}
|
|
}
|
|
|
|
int daRotBridge_c::Draw() {
|
|
#if DEBUG
|
|
if (l_HIO.draw_wall_collision && mpBgW2 != NULL) {
|
|
mpBgW2->CalcPlane();
|
|
}
|
|
#endif
|
|
|
|
g_env_light.settingTevStruct(16, ¤t.pos, &tevStr);
|
|
g_env_light.setLightTevColorType_MAJI(mpModel, &tevStr);
|
|
|
|
mBck.entry(mpModel->getModelData());
|
|
|
|
dComIfGd_setListBG();
|
|
mDoExt_modelUpdateDL(mpModel);
|
|
dComIfGd_setList();
|
|
return 1;
|
|
}
|
|
|
|
int daRotBridge_c::Delete() {
|
|
dComIfG_resDelete(&mPhase, l_resNameIdx[mType]);
|
|
|
|
if (mpBgW2 != NULL && mpBgW2->ChkUsed()) {
|
|
dComIfG_Bgsp().Release(mpBgW2);
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
static int daRotBridge_Draw(daRotBridge_c* i_this) {
|
|
return i_this->MoveBGDraw();
|
|
}
|
|
|
|
static int daRotBridge_Execute(daRotBridge_c* i_this) {
|
|
return i_this->MoveBGExecute();
|
|
}
|
|
|
|
static int daRotBridge_Delete(daRotBridge_c* i_this) {
|
|
return i_this->MoveBGDelete();
|
|
}
|
|
|
|
static int daRotBridge_Create(fopAc_ac_c* i_this) {
|
|
fpc_ProcID id = fopAcM_GetID(i_this);
|
|
return ((daRotBridge_c*)i_this)->create();
|
|
}
|
|
|
|
static actor_method_class l_daRotBridge_Method = {
|
|
(process_method_func)daRotBridge_Create,
|
|
(process_method_func)daRotBridge_Delete,
|
|
(process_method_func)daRotBridge_Execute,
|
|
0,
|
|
(process_method_func)daRotBridge_Draw,
|
|
};
|
|
|
|
extern actor_process_profile_definition g_profile_Obj_RotBridge = {
|
|
fpcLy_CURRENT_e, // mLayerID
|
|
3, // mListID
|
|
fpcPi_CURRENT_e, // mListPrio
|
|
PROC_Obj_RotBridge, // mProcName
|
|
&g_fpcLf_Method.base, // sub_method
|
|
sizeof(daRotBridge_c), // mSize
|
|
0, // mSizeOther
|
|
0, // mParameters
|
|
&g_fopAc_Method.base, // sub_method
|
|
490, // mPriority
|
|
&l_daRotBridge_Method, // sub_method
|
|
0x00040000, // mStatus
|
|
fopAc_ACTOR_e, // mActorType
|
|
fopAc_CULLBOX_CUSTOM_e, // cullType
|
|
};
|