mirror of https://github.com/zeldaret/tp.git
935 lines
28 KiB
C++
935 lines
28 KiB
C++
/**
|
|
* @file d_a_obj_swpush.cpp
|
|
*
|
|
*/
|
|
|
|
#include "d/actor/d_a_obj_swpush.h"
|
|
#include "d/actor/d_a_player.h"
|
|
#include "d/d_s_play.h"
|
|
#include "Z2AudioLib/Z2Instances.h"
|
|
|
|
enum Kbota_00_RES_File_ID {
|
|
/* BMDR */
|
|
/* 0x4 */ BMDR_KBOTA_00 = 0x4,
|
|
|
|
/* DZB */
|
|
/* 0x7 */ DZB_KBOTA_00 = 0x7,
|
|
};
|
|
|
|
enum S_lv3bota_RES_File_ID {
|
|
/* BMDR */
|
|
/* 0x4 */ BMDR_S_LV3BOTA = 0x4,
|
|
|
|
/* DZB */
|
|
/* 0x7 */ DZB_KBOTA2_00 = 0x7,
|
|
};
|
|
|
|
enum S_lv6bota_RES_File_ID {
|
|
/* BMDR */
|
|
/* 0x4 */ BMDR_S_LV6BOTA = 0x4,
|
|
|
|
/* DZB */
|
|
/* 0x7 */ DZB_KBOTA3_00 = 0x7,
|
|
};
|
|
|
|
/* 80482D4C-80482D7C 0000EC 0030+00 1/1 0/0 0/0 .text prmZ_init__Q211daObjSwpush5Act_cFv */
|
|
void daObjSwpush::Act_c::prmZ_init() {
|
|
if (mPrmZInit) {
|
|
return;
|
|
}
|
|
mPrmZ = home.angle.z;
|
|
mPrmZInit = true;
|
|
home.angle.z = 0;
|
|
current.angle.z = 0;
|
|
shape_angle.z = 0;
|
|
}
|
|
|
|
/* 80482D7C-80482DC4 00011C 0048+00 2/2 0/0 0/0 .text is_switch2__Q211daObjSwpush5Act_cCFv */
|
|
bool daObjSwpush::Act_c::is_switch2() const {
|
|
return fopAcM_isSwitch(this, prmZ_get_swSave2() & 0xFF);
|
|
}
|
|
|
|
/* 80482DC4-80482DE8 000164 0024+00 1/1 0/0 0/0 .text solidHeapCB__Q211daObjSwpush5Act_cFP10fopAc_ac_c */
|
|
BOOL daObjSwpush::Act_c::solidHeapCB(fopAc_ac_c* a_this) {
|
|
return static_cast<daObjSwpush::Act_c*>(a_this)->create_heap();
|
|
}
|
|
|
|
/* 80484D10-80484D18 000000 0006+02 8/8 0/0 0/0 .rodata M_bmd__Q211daObjSwpush5Act_c */
|
|
s16 const daObjSwpush::Act_c::M_bmd[3] = {BMDR_KBOTA_00, BMDR_S_LV3BOTA, BMDR_S_LV6BOTA};
|
|
|
|
/* 80484D18-80484D20 000008 0006+02 1/1 0/0 0/0 .rodata M_dzb__Q211daObjSwpush5Act_c */
|
|
s16 const daObjSwpush::Act_c::M_dzb[3] = {DZB_KBOTA_00, DZB_KBOTA2_00, DZB_KBOTA3_00};
|
|
|
|
UNK_REL_DATA;
|
|
|
|
/* 80484EA4-80484EB0 -00001 000C+00 3/3 0/0 0/0 .data M_arcname__Q211daObjSwpush5Act_c */
|
|
char* daObjSwpush::Act_c::M_arcname[3] = {
|
|
"Kbota_00",
|
|
"S_lv3bota",
|
|
"S_lv6bota",
|
|
};
|
|
|
|
/* 80482DE8-80482FE8 000188 0200+00 1/1 0/0 0/0 .text create_heap__Q211daObjSwpush5Act_cFv */
|
|
bool daObjSwpush::Act_c::create_heap() {
|
|
bool rv = false;
|
|
J3DModelData* model_data = (J3DModelData*)dComIfG_getObjectRes(M_arcname[mMdl], M_bmd[mMdl]);
|
|
|
|
JUT_ASSERT(518, model_data != 0);
|
|
|
|
mpModel = mDoExt_J3DModel__create(model_data, 0x80000, 0x11000084);
|
|
if (mpModel != NULL) {
|
|
JUTNameTab* jointName = mpModel->getModelData()->getJointTree().getJointName();
|
|
for (u16 i = 0; i < mpModel->getModelData()->getJointNum(); i++) {
|
|
bool bVar1 = false;
|
|
if (strcmp(jointName->getName(i), "bottan") == 0 || strcmp(jointName->getName(i), "botan") == 0) {
|
|
bVar1 = true;
|
|
}
|
|
|
|
if (bVar1) {
|
|
model_data->getJointNodePointer(i)->setCallBack(jnodeCB);
|
|
mpModel->setUserArea((u32)this);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
cBgD_t* bg_data = (cBgD_t*)dComIfG_getObjectRes(M_arcname[mMdl], M_dzb[mMdl]);
|
|
|
|
JUT_ASSERT(569, bg_data != 0);
|
|
|
|
bool bVar2 = false;
|
|
mpBgW = new dBgWSv();
|
|
if (mpBgW != NULL && mpBgW->Set(bg_data, 0) == 0) {
|
|
bVar2 = true;
|
|
}
|
|
|
|
if (mpModel != NULL && mpBgW != NULL && bVar2) {
|
|
rv = true;
|
|
}
|
|
|
|
if (rv == false) {
|
|
mpBgW = NULL;
|
|
}
|
|
|
|
return rv;
|
|
}
|
|
|
|
/* 80482FE8-80483038 000388 0050+00 1/1 0/0 0/0 .text create_res_load__Q211daObjSwpush5Act_cFv */
|
|
cPhs__Step daObjSwpush::Act_c::create_res_load() {
|
|
cPhs__Step phase = (cPhs__Step)dComIfG_resLoad(&mPhase, M_arcname[mMdl]);
|
|
if (phase != cPhs_COMPLEATE_e) {
|
|
return phase;
|
|
}
|
|
|
|
return cPhs_COMPLEATE_e;
|
|
}
|
|
|
|
/* 80484D20-80484D2C 000010 000C+00 0/1 0/0 0/0 .rodata M_heap_size__Q211daObjSwpush5Act_c */
|
|
u32 const daObjSwpush::Act_c::M_heap_size[3] = {0x1000, 0x1000, 0x1000};
|
|
|
|
/* 80484D2C-80484E08 00001C 00DC+00 4/10 0/0 0/0 .rodata M_attr__Q211daObjSwpush5Act_c */
|
|
daObjSwpush::Hio_c::Attr_c const daObjSwpush::Act_c::M_attr[5] = {
|
|
{
|
|
(AttrFlag_e)(FLAG_STAY_PRESSED | FLAG_OBEY_SAVE),
|
|
1.0f,
|
|
0.9f,
|
|
0.6f,
|
|
0.0f,
|
|
-0.3f,
|
|
1,
|
|
6,
|
|
6,
|
|
13,
|
|
1.0f,
|
|
2.5f,
|
|
10,
|
|
},
|
|
{
|
|
FLAG_UNK20,
|
|
1.25f,
|
|
0.9f,
|
|
0.6f,
|
|
0.0f,
|
|
-0.3f,
|
|
1,
|
|
6,
|
|
6,
|
|
13,
|
|
1.0f,
|
|
2.5f,
|
|
10,
|
|
},
|
|
{
|
|
(AttrFlag_e)(FLAG_ON_IS_UP | FLAG_STAY_PRESSED | FLAG_OBEY_SAVE),
|
|
1.0f,
|
|
0.9f,
|
|
0.6f,
|
|
0.0f,
|
|
-0.3f,
|
|
1,
|
|
6,
|
|
6,
|
|
13,
|
|
1.0f,
|
|
2.5f,
|
|
10,
|
|
},
|
|
{
|
|
FLAG_IS_TOGGLE,
|
|
1.0f,
|
|
0.9f,
|
|
0.6f,
|
|
0.0f,
|
|
-0.3f,
|
|
1,
|
|
6,
|
|
6,
|
|
13,
|
|
1.0f,
|
|
2.5f,
|
|
10,
|
|
},
|
|
{
|
|
FLAG_UNK20,
|
|
1.0f,
|
|
0.9f,
|
|
0.6f,
|
|
0.0f,
|
|
-0.3f,
|
|
1,
|
|
6,
|
|
6,
|
|
13,
|
|
1.0f,
|
|
2.5f,
|
|
10,
|
|
},
|
|
|
|
};
|
|
|
|
/* 80484E08-80484E0C 0000F8 0004+00 0/3 0/0 0/0 .rodata M_op_vtx__Q211daObjSwpush5Act_c */
|
|
u8 const daObjSwpush::Act_c::M_op_vtx[4] = {0x0D, 0x0B, 0x0A, 0x0C};
|
|
|
|
/* 80483038-80483450 0003D8 0418+00 1/1 0/0 0/0 .text Mthd_Create__Q211daObjSwpush5Act_cFv */
|
|
cPhs__Step daObjSwpush::Act_c::Mthd_Create() {
|
|
fopAcM_SetupActor(this, daObjSwpush::Act_c);
|
|
|
|
prmZ_init();
|
|
mType = prm_get_type();
|
|
mMdl = prm_get_mdl();
|
|
|
|
if (mType == 4) {
|
|
mMdl = 1;
|
|
} else if (mMdl == 15) {
|
|
mMdl = 0;
|
|
}
|
|
|
|
cPhs__Step phase = create_res_load();
|
|
if (phase == cPhs_COMPLEATE_e) {
|
|
scale.x *= attr().scale;
|
|
scale.z *= attr().scale;
|
|
|
|
if (mType != 4) {
|
|
scale.y = 0.5f;
|
|
}
|
|
|
|
field_0x5f8.x = 1.25f;
|
|
field_0x5f8.y = 0.5f;
|
|
field_0x5f8.z = 1.25f;
|
|
|
|
if (prm_get_couple() != 0) {
|
|
scale.x *= 2.0f;
|
|
scale.z *= 2.0f;
|
|
}
|
|
|
|
if (fopAcM_entrySolidHeap(this, solidHeapCB, M_heap_size[mMdl])) {
|
|
if (dComIfG_Bgsp().Regist(mpBgW, this)) {
|
|
phase = cPhs_ERROR_e;
|
|
} else {
|
|
mDoMtx_stack_c::transS(current.pos);
|
|
mDoMtx_stack_c::ZXYrotM(shape_angle);
|
|
mDoMtx_stack_c::scaleM(field_0x5f8);
|
|
MTXCopy(mDoMtx_stack_c::get(), mMtx);
|
|
mpBgW->ClrNoCalcVtx();
|
|
mpBgW->SetBaseMtxP(mMtx);
|
|
mpBgW->GlobalVtx();
|
|
mpBgW->SetBaseMtxP(NULL);
|
|
mpBgW->SetNoCalcVtx();
|
|
field_0x5a4 = mpBgW->GetVtxTbl()[M_op_vtx[0]].y;
|
|
mpBgW->SetRideCallback(rideCB);
|
|
|
|
fopAcM_SetMtx(this, mpModel->getBaseTRMtx());
|
|
init_mtx();
|
|
fopAcM_setCullSizeBox(this, attr().scale * -80.0f, -2.0f, attr().scale * -80.0f, attr().scale * 80.0f, 39.0f, attr().scale * 80.0f);
|
|
mVibTimer = 0;
|
|
mRidingMode = 0;
|
|
mPrevRiding = false;
|
|
mMiniPushTimer = 0;
|
|
mMiniPushFlg = false;
|
|
mHeavyRiding = false;
|
|
mPrevHeavyRiding = false;
|
|
mPushTimer = 0;
|
|
mPushFlg = false;
|
|
mSpeed = 0.0f;
|
|
field_0x5e0 = 0;
|
|
field_0x5e4 = 0;
|
|
field_0x5f2 = 0;
|
|
field_0x5f3 = 0;
|
|
|
|
set_btp_frame();
|
|
|
|
bool is_toggle = cLib_checkBit<int>(attr().flags, FLAG_IS_TOGGLE);
|
|
bool on_is_up = cLib_checkBit<int>(attr().flags, FLAG_ON_IS_UP);
|
|
bool flg20 = cLib_checkBit<int>(attr().flags, FLAG_UNK20);
|
|
bool is_sw = is_switch();
|
|
bool is_sw2 = is_switch2();
|
|
|
|
if ((is_toggle || (!is_sw && !on_is_up) || (is_sw && on_is_up)) && (!flg20 || !is_sw2)) {
|
|
mTargetHFrac = 1.0f;
|
|
mCurHFrac = 1.0f;
|
|
field_0x5d8 = 0.0f;
|
|
field_0x5dc = 1.0f;
|
|
field_0x5e8 = 1.0f;
|
|
mTopPos = 0.0f;
|
|
mode_upper_init();
|
|
} else {
|
|
mTargetHFrac = 0.0f;
|
|
mCurHFrac = 0.0f;
|
|
field_0x5d8 = -35.5f;
|
|
field_0x5dc = 0.0f;
|
|
field_0x5e8 = 0.0f;
|
|
mTopPos = -35.5f;
|
|
mMiniPushTimer = 5;
|
|
mMiniPushFlg = true;
|
|
mode_lower_init();
|
|
}
|
|
|
|
mEventID = dComIfGp_getEventManager().getEventIdx(this, prm_get_evId());
|
|
|
|
OS_REPORT("踏みスイッチ<%x><%d %d>\n", fopAcM_GetParam(this), prm_get_evId() & 0xFF, mEventID);
|
|
|
|
demo_non_init();
|
|
Mthd_Execute();
|
|
}
|
|
} else {
|
|
phase = cPhs_ERROR_e;
|
|
}
|
|
}
|
|
|
|
return phase;
|
|
}
|
|
|
|
/* 8048348C-804834E8 00082C 005C+00 1/1 0/0 0/0 .text Mthd_Delete__Q211daObjSwpush5Act_cFv */
|
|
int daObjSwpush::Act_c::Mthd_Delete() {
|
|
if (dComIfG_Bgsp().Release(mpBgW)) {
|
|
OS_REPORT_ERROR("Release Error(%s %d)\n", "d_a_obj_swpush.cpp", 777);
|
|
}
|
|
|
|
dComIfG_resDelete(&mPhase, M_arcname[mMdl]);
|
|
return 1;
|
|
}
|
|
|
|
/* 804834E8-80483534 000888 004C+00 2/2 0/0 0/0 .text set_mtx__Q211daObjSwpush5Act_cFv */
|
|
void daObjSwpush::Act_c::set_mtx() {
|
|
mDoMtx_stack_c::transS(current.pos);
|
|
mDoMtx_stack_c::ZXYrotM(shape_angle);
|
|
mpModel->setBaseTRMtx(mDoMtx_stack_c::get());
|
|
}
|
|
|
|
/* 80483534-80483570 0008D4 003C+00 1/1 0/0 0/0 .text init_mtx__Q211daObjSwpush5Act_cFv */
|
|
void daObjSwpush::Act_c::init_mtx() {
|
|
mpModel->setBaseScale(scale);
|
|
set_mtx();
|
|
}
|
|
|
|
/* 80483570-80483574 000910 0004+00 2/2 0/0 0/0 .text set_btp_frame__Q211daObjSwpush5Act_cFv */
|
|
void daObjSwpush::Act_c::set_btp_frame() {
|
|
/* empty function */
|
|
}
|
|
|
|
UNK_REL_BSS;
|
|
|
|
/* 80483574-80483910 000914 039C+00 1/1 0/0 0/0 .text rideCB__Q211daObjSwpush5Act_cFP4dBgWP10fopAc_ac_cP10fopAc_ac_c */
|
|
void daObjSwpush::Act_c::rideCB(dBgW* i_bgw, fopAc_ac_c* i_ac, fopAc_ac_c* i_pt) {
|
|
Act_c* i_this = (Act_c*)i_ac;
|
|
if (fopAcM_checkStatus(i_pt, fopAcStts_FREEZE_e)) {
|
|
static cXyz no_push_vec[4] = {
|
|
cXyz(-1.0f, 0.0f, -1.0f),
|
|
cXyz(-1.0f, 0.0f, 1.0f),
|
|
cXyz(1.0f, 0.0f, 1.0f),
|
|
cXyz(1.0f, 0.0f, -1.0f),
|
|
};
|
|
|
|
cBgD_Vtx_t* vtxTbl = i_this->mpBgW->GetVtxTbl();
|
|
cM3dGTri tri;
|
|
cXyz vecs[4];
|
|
cXyz spa8;
|
|
int vtxnum = i_this->mpBgW->GetVtxNum();
|
|
|
|
#ifdef DEBUG
|
|
for (int i = 0; i < 4; i++) {
|
|
JUT_ASSERT(859, M_op_vtx[i] < vtxnum);
|
|
}
|
|
#endif
|
|
|
|
f32 fVar1 = i_this->mPrevRiding ? i_this->attr().step_down_space : i_this->attr().step_up_space;
|
|
mDoMtx_stack_c::push();
|
|
mDoMtx_stack_c::YrotS(i_this->shape_angle.y);
|
|
mDoMtx_stack_c::scaleM(fVar1, fVar1, fVar1);
|
|
mDoMtx_stack_c::scaleM(1.25f, 1.0f, 1.25f);
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
vecs[i].set(vtxTbl[M_op_vtx[i]]);
|
|
mDoMtx_stack_c::multVec(&no_push_vec[i], &spa8);
|
|
vecs[i] += spa8;
|
|
}
|
|
|
|
mDoMtx_stack_c::pop();
|
|
|
|
static s8 const tri_id[2][3] = {
|
|
{0, 1, 2},
|
|
{3, 0, 2},
|
|
};
|
|
|
|
for (int i = 0; i < 2; i++) {
|
|
tri.setPos(&vecs[tri_id[i][0]], &vecs[tri_id[i][1]], &vecs[tri_id[i][2]]);
|
|
|
|
if (cM3d_CrossY_Tri(&tri, &i_pt->current.pos)) {
|
|
if (i_this->prm_get_couple() == 0 || i_this->check_ride_couple(fopAcM_GetProfName(i_pt))) {
|
|
if (fopAcM_CheckCarryType(i_pt, fopAcM_CARRY_TYPE_1)) {
|
|
i_this->mRidingMode = 2;
|
|
} else {
|
|
i_this->mRidingMode = 1;
|
|
}
|
|
|
|
bool is_player = fopAcM_GetProfName(i_pt) == PROC_ALINK;
|
|
if (is_player) {
|
|
i_this->mVibTimer = 4;
|
|
}
|
|
|
|
if (is_player) {
|
|
if (((daPy_py_c*)i_pt)->checkEquipHeavyBoots()) {
|
|
i_this->mHeavyRiding = true;
|
|
}
|
|
}
|
|
|
|
if (fopAcM_GetProfName(i_pt) == PROC_E_MM_MT) {
|
|
i_this->field_0x5c5 = 1;
|
|
break;
|
|
}
|
|
|
|
i_this->field_0x5c5 = 0;
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 804839B4-80483A5C 000D54 00A8+00 1/1 0/0 0/0 .text jnodeCB__Q211daObjSwpush5Act_cFP8J3DJointi */
|
|
int daObjSwpush::Act_c::jnodeCB(J3DJoint* i_joint, int param_2) {
|
|
if (param_2 == 0) {
|
|
J3DModel* model = (J3DModel*)j3dSys.getModel();
|
|
Act_c* i_this = (Act_c*)model->getUserArea();
|
|
int jntNo = i_joint->getJntNo();
|
|
mDoMtx_stack_c::copy(model->getAnmMtx(jntNo));
|
|
mDoMtx_stack_c::transM(i_this->field_0x5d8, 0.0f, 0.0f);
|
|
model->setAnmMtx(jntNo, mDoMtx_stack_c::get());
|
|
MTXCopy(mDoMtx_stack_c::get(), J3DSys::mCurrentMtx);
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 80483A5C-80483B70 000DFC 0114+00 1/1 0/0 0/0 .text calc_top_pos__Q211daObjSwpush5Act_cFv */
|
|
void daObjSwpush::Act_c::calc_top_pos() {
|
|
f32 fVar1 = attr().draw_resist;
|
|
mSpeed -= (mCurHFrac - mTargetHFrac) * attr().draw_spring;
|
|
mSpeed -= mSpeed * fVar1;
|
|
mCurHFrac += mSpeed;
|
|
field_0x5d8 = (1.0f - mCurHFrac) * -35.5f;
|
|
field_0x5d8 = cLib_minMaxLimit(field_0x5d8, -36.5f, 1.0f);
|
|
|
|
if (field_0x5e0 > 0) {
|
|
if (--field_0x5e0 == 0) {
|
|
field_0x5dc = field_0x5e4;
|
|
}
|
|
}
|
|
|
|
if (mMode == MODE_UPPER) {
|
|
field_0x5e8 = mCurHFrac;
|
|
} else {
|
|
field_0x5e8 = field_0x5dc;
|
|
}
|
|
|
|
mTopPos = (1.0f - field_0x5e8) * -35.5f;
|
|
|
|
if (mTopPos < field_0x5d8) {
|
|
mTopPos = field_0x5d8;
|
|
}
|
|
}
|
|
|
|
/* 80483B70-80483B7C 000F10 000C+00 3/3 0/0 0/0 .text top_bg_aim_req__Q211daObjSwpush5Act_cFfs */
|
|
void daObjSwpush::Act_c::top_bg_aim_req(f32 param_1, s16 param_2) {
|
|
field_0x5e4 = param_1;
|
|
field_0x5e0 = param_2;
|
|
}
|
|
|
|
/* 80483B7C-80483D0C 000F1C 0190+00 1/1 0/0 0/0 .text set_push_flag__Q211daObjSwpush5Act_cFv */
|
|
void daObjSwpush::Act_c::set_push_flag() {
|
|
if (mVibTimer != 0) {
|
|
mVibTimer--;
|
|
}
|
|
|
|
if (mMiniPushFlg) {
|
|
if (mRidingMode != 0) {
|
|
if (mRidingMode == 2) {
|
|
mMiniPushTimer = attr().able_ride_time_middle;
|
|
} else {
|
|
mMiniPushTimer = attr().able_push_time_any;
|
|
}
|
|
} else if (--mMiniPushTimer <= 0) {
|
|
mMiniPushFlg = false;
|
|
}
|
|
} else if (mRidingMode != 0) {
|
|
if (++mMiniPushTimer >= attr().able_push_time_any) {
|
|
mMiniPushFlg = true;
|
|
}
|
|
} else {
|
|
mMiniPushTimer = 0;
|
|
}
|
|
|
|
if (mPushFlg) {
|
|
if (mHeavyRiding) {
|
|
mPushTimer = attr().able_push_time_heavy;
|
|
} else if (--mPushTimer <= 0) {
|
|
mPushFlg = false;
|
|
}
|
|
} else if (mHeavyRiding) {
|
|
if (++mPushTimer >= attr().able_push_time_heavy) {
|
|
mPushFlg = true;
|
|
}
|
|
} else {
|
|
mPushTimer = 0;
|
|
}
|
|
}
|
|
|
|
/* 80483D0C-80483D2C 0010AC 0020+00 2/2 0/0 0/0 .text mode_upper_init__Q211daObjSwpush5Act_cFv */
|
|
void daObjSwpush::Act_c::mode_upper_init() {
|
|
mMode = MODE_UPPER;
|
|
mTargetHFrac = 1.0f;
|
|
mChangingState = false;
|
|
mDebounceTimer = 0;
|
|
}
|
|
|
|
/* 80483D2C-80483FA8 0010CC 027C+00 1/0 0/0 0/0 .text mode_upper__Q211daObjSwpush5Act_cFv */
|
|
void daObjSwpush::Act_c::mode_upper() {
|
|
bool bVar1 = false;
|
|
bool bVar2 = false;
|
|
bool pressing = false;
|
|
f32 height = 1.0f;
|
|
|
|
if (mMiniPushFlg) {
|
|
if (cLib_checkBit(attr().flags, FLAG_REQ_HEAVY)) {
|
|
if (mPushFlg) {
|
|
pressing = true;
|
|
} else {
|
|
height = 0.9f;
|
|
}
|
|
} else {
|
|
pressing = true;
|
|
}
|
|
}
|
|
|
|
if (prm_get_couple() != 0 && nr_ride_people(field_0x5f2) == 1 && nr_ride_people(field_0x5f3) != 1 && mDebounceTimer <= 0) {
|
|
mSpeed = attr().draw_pypcon_acc * 2.0f;
|
|
mDebounceTimer = 30;
|
|
bVar1 = true;
|
|
} else if (mDebounceTimer > 0) {
|
|
mDebounceTimer--;
|
|
}
|
|
|
|
if (!cLib_checkBit(attr().flags, FLAG_REQ_HEAVY) && mDebounceTimer <= 0 && mRidingMode && !mPrevRiding) {
|
|
mSpeed = attr().draw_pypcon_acc;
|
|
mDebounceTimer = 30;
|
|
bVar1 = true;
|
|
} else if (mDebounceTimer > 0) {
|
|
mDebounceTimer--;
|
|
}
|
|
|
|
bool is_sw = is_switch();
|
|
bool bVar3 = cLib_checkBit(attr().flags, FLAG_ON_IS_UP);
|
|
if (pressing ||
|
|
(cLib_checkBit(attr().flags, FLAG_OBEY_SAVE) &&
|
|
(
|
|
(is_sw && !bVar3) ||
|
|
(!is_sw && bVar3)
|
|
)
|
|
)
|
|
) {
|
|
if (pressing) {
|
|
mChangingState = true;
|
|
}
|
|
|
|
bVar2 = true;
|
|
mode_u_l_init();
|
|
} else {
|
|
mTargetHFrac = height;
|
|
top_bg_aim_req(height, 1);
|
|
}
|
|
|
|
if (bVar2) {
|
|
demo_reqSw_init();
|
|
} else if (bVar1 && !field_0x5c5) {
|
|
demo_reqPause_init();
|
|
}
|
|
}
|
|
|
|
/* 80483FA8-80484008 001348 0060+00 1/1 0/0 0/0 .text mode_u_l_init__Q211daObjSwpush5Act_cFv */
|
|
void daObjSwpush::Act_c::mode_u_l_init() {
|
|
mMode = MODE_U_L;
|
|
mTargetHFrac = 0.0f;
|
|
mSpeed = attr().draw_down_spd0;
|
|
top_bg_aim_req(0.0f, attr().bg_time_lag);
|
|
}
|
|
|
|
/* 80484008-804841D4 0013A8 01CC+00 1/0 0/0 0/0 .text mode_u_l__Q211daObjSwpush5Act_cFv */
|
|
void daObjSwpush::Act_c::mode_u_l() {
|
|
if (mCurHFrac <= 0.0f) {
|
|
if (mChangingState) {
|
|
if (cLib_checkBit(attr().flags, FLAG_IS_TOGGLE)) {
|
|
rev_switch();
|
|
} else if (cLib_checkBit(attr().flags, FLAG_ON_IS_UP)) {
|
|
off_switch();
|
|
} else {
|
|
on_switch();
|
|
}
|
|
|
|
dComIfGp_getVibration().StartShock(4, 31, cXyz(0.0f, 1.0f, 0.0f));
|
|
}
|
|
|
|
if (mType != 4) {
|
|
fopAcM_seStart(this, JA_SE_OBJ_FOOT_SW_ON, 0);
|
|
} else {
|
|
fopAcM_seStart(this, Z2SE_OBJ_LV3_FLR_SW_ON, 0);
|
|
}
|
|
|
|
mode_lower_init();
|
|
}
|
|
}
|
|
|
|
/* 804841D4-804841F4 001574 0020+00 2/2 0/0 0/0 .text mode_lower_init__Q211daObjSwpush5Act_cFv */
|
|
void daObjSwpush::Act_c::mode_lower_init() {
|
|
mMode = MODE_LOWER;
|
|
mTargetHFrac = 0.0f;
|
|
mChangingState = false;
|
|
}
|
|
|
|
/* 804841F4-80484388 001594 0194+00 1/0 0/0 0/0 .text mode_lower__Q211daObjSwpush5Act_cFv */
|
|
void daObjSwpush::Act_c::mode_lower() {
|
|
bool pressing = false;
|
|
|
|
if (mMiniPushFlg) {
|
|
if (cLib_checkBit(attr().flags, FLAG_REQ_HEAVY)) {
|
|
if (mPushFlg) {
|
|
pressing = true;
|
|
}
|
|
} else {
|
|
pressing = true;
|
|
}
|
|
}
|
|
|
|
bool is_sw = is_switch();
|
|
bool is_sw2 = is_switch2();
|
|
bool obey_save = cLib_checkBit(attr().flags, FLAG_OBEY_SAVE);
|
|
bool stay_pressed = cLib_checkBit(attr().flags, FLAG_STAY_PRESSED);
|
|
bool is_toggle = cLib_checkBit(attr().flags, FLAG_IS_TOGGLE);
|
|
bool on_is_up = cLib_checkBit(attr().flags, FLAG_ON_IS_UP);
|
|
bool flg20 = cLib_checkBit(attr().flags, FLAG_UNK20);
|
|
|
|
bool pop_back_up = !stay_pressed && !pressing;
|
|
bool match_state_up = obey_save &&
|
|
((!is_sw && !on_is_up) || (is_sw && on_is_up)) &&
|
|
!pressing;
|
|
|
|
bool bVar5 = !(flg20 && is_sw2);
|
|
if (pop_back_up || match_state_up) {
|
|
if (bVar5) {
|
|
if (pop_back_up && !is_toggle && !pressing) {
|
|
mChangingState = true;
|
|
}
|
|
|
|
demo_reqSw_init();
|
|
mode_l_u_init();
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 80484388-804843C0 001728 0038+00 1/1 0/0 0/0 .text mode_l_u_init__Q211daObjSwpush5Act_cFv */
|
|
void daObjSwpush::Act_c::mode_l_u_init() {
|
|
mMode = MODE_L_U;
|
|
mTargetHFrac = 1.0f;
|
|
top_bg_aim_req(1.0f, 1);
|
|
}
|
|
|
|
/* 804843C0-80484570 001760 01B0+00 1/0 0/0 0/0 .text mode_l_u__Q211daObjSwpush5Act_cFv */
|
|
void daObjSwpush::Act_c::mode_l_u() {
|
|
if (mCurHFrac >= 1.0f) {
|
|
if (mChangingState) {
|
|
if (cLib_checkBit(attr().flags, FLAG_ON_IS_UP)) {
|
|
on_switch();
|
|
} else {
|
|
off_switch();
|
|
}
|
|
}
|
|
|
|
if (mType == 4) {
|
|
fopAcM_seStart(this, Z2SE_OBJ_LV3_FLR_SW_OFF, 0);
|
|
} else if (strcmp(dComIfGp_getStartStageName(), "D_MN11") == 0 || strcmp(dComIfGp_getStartStageName(), "D_MN06") == 0) {
|
|
fopAcM_seStart(this, Z2SE_OBJ_LV3_FLR_SW_OFF, 0);
|
|
}
|
|
|
|
mode_upper_init();
|
|
}
|
|
}
|
|
|
|
/* 80484570-8048457C 001910 000C+00 4/4 0/0 0/0 .text demo_non_init__Q211daObjSwpush5Act_cFv */
|
|
void daObjSwpush::Act_c::demo_non_init() {
|
|
mDemoMode = DEMO_MODE_NON;
|
|
}
|
|
|
|
/* 8048457C-80484580 00191C 0004+00 1/0 0/0 0/0 .text demo_non__Q211daObjSwpush5Act_cFv */
|
|
void daObjSwpush::Act_c::demo_non() {
|
|
/* empty function */
|
|
}
|
|
|
|
/* 80484580-804845D8 001920 0058+00 1/1 0/0 0/0 .text demo_reqPause_init__Q211daObjSwpush5Act_cFv */
|
|
void daObjSwpush::Act_c::demo_reqPause_init() {
|
|
if (mDemoMode == DEMO_MODE_NON) {
|
|
mDemoMode = DEMO_MODE_REQ_PAUSE;
|
|
fopAcM_orderPotentialEvent(this, 2, 0, 0);
|
|
eventInfo.onCondition(fopAcCnd_NOEXEC_e);
|
|
}
|
|
}
|
|
|
|
/* 804845D8-8048460C 001978 0034+00 2/1 0/0 0/0 .text demo_reqPause__Q211daObjSwpush5Act_cFv */
|
|
void daObjSwpush::Act_c::demo_reqPause() {
|
|
if (eventInfo.checkCommandDemoAccrpt()) {
|
|
demo_runPause_init();
|
|
} else {
|
|
demo_non_init();
|
|
}
|
|
}
|
|
|
|
/* 8048460C-8048464C 0019AC 0040+00 1/1 0/0 0/0 .text demo_runPause_init__Q211daObjSwpush5Act_cFv */
|
|
void daObjSwpush::Act_c::demo_runPause_init() {
|
|
daPy_getPlayerActorClass()->onWolfEyeKeep();
|
|
mDemoMode = DEMO_MODE_RUN_PAUSE;
|
|
mPauseTimer = attr().demo_run_time;
|
|
}
|
|
|
|
/* 8048464C-804846B4 0019EC 0068+00 1/0 0/0 0/0 .text demo_runPause__Q211daObjSwpush5Act_cFv */
|
|
void daObjSwpush::Act_c::demo_runPause() {
|
|
daPy_getPlayerActorClass()->onWolfEyeKeep();
|
|
mPauseTimer--;
|
|
|
|
if (mPauseTimer <= 0) {
|
|
dComIfGp_event_reset();
|
|
demo_non_init();
|
|
}
|
|
}
|
|
|
|
/* 804846B4-80484708 001A54 0054+00 1/1 0/0 0/0 .text demo_stop_puase__Q211daObjSwpush5Act_cFv */
|
|
void daObjSwpush::Act_c::demo_stop_puase() {
|
|
if (mDemoMode == DEMO_MODE_REQ_PAUSE) {
|
|
demo_reqPause();
|
|
}
|
|
|
|
if (mDemoMode == DEMO_MODE_RUN_PAUSE) {
|
|
dComIfGp_event_reset();
|
|
}
|
|
}
|
|
|
|
static inline bool dComIfGp_evmng_existence(s16 eventIdx) {
|
|
return g_dComIfG_gameInfo.play.getEvtManager().getEventData(eventIdx) != NULL;
|
|
}
|
|
|
|
/* 80484708-804847B4 001AA8 00AC+00 2/2 0/0 0/0 .text demo_reqSw_init__Q211daObjSwpush5Act_cFv */
|
|
void daObjSwpush::Act_c::demo_reqSw_init() {
|
|
if (dComIfGp_evmng_existence(mEventID) && (mDemoMode == DEMO_MODE_NON || mDemoMode == DEMO_MODE_REQ_PAUSE || mDemoMode == DEMO_MODE_RUN_PAUSE)) {
|
|
demo_stop_puase();
|
|
mDemoMode = DEMO_MODE_REQ_SW;
|
|
fopAcM_orderOtherEventId(this, mEventID, prm_get_evId(), 0xFFFF, 0, 1);
|
|
eventInfo.onCondition(fopAcCnd_NOEXEC_e);
|
|
}
|
|
}
|
|
|
|
/* 804847B4-80484828 001B54 0074+00 1/0 0/0 0/0 .text demo_reqSw__Q211daObjSwpush5Act_cFv */
|
|
void daObjSwpush::Act_c::demo_reqSw() {
|
|
if (eventInfo.checkCommandDemoAccrpt()) {
|
|
demo_runSw_init();
|
|
} else {
|
|
fopAcM_orderOtherEventId(this, mEventID, prm_get_evId(), 0xFFFF, 0, 1);
|
|
eventInfo.onCondition(fopAcCnd_NOEXEC_e);
|
|
}
|
|
}
|
|
|
|
/* 80484828-80484834 001BC8 000C+00 1/1 0/0 0/0 .text demo_runSw_init__Q211daObjSwpush5Act_cFv */
|
|
void daObjSwpush::Act_c::demo_runSw_init() {
|
|
mDemoMode = DEMO_MODE_RUN_SW;
|
|
}
|
|
|
|
/* 80484834-80484890 001BD4 005C+00 1/0 0/0 0/0 .text demo_runSw__Q211daObjSwpush5Act_cFv */
|
|
void daObjSwpush::Act_c::demo_runSw() {
|
|
if (dComIfGp_evmng_endCheck(mEventID)) {
|
|
dComIfGp_event_reset();
|
|
demo_non_init();
|
|
}
|
|
}
|
|
|
|
/* 80484890-804848D8 001C30 0048+00 1/1 0/0 0/0 .text check_ride_couple__Q211daObjSwpush5Act_cFs */
|
|
bool daObjSwpush::Act_c::check_ride_couple(s16 param_1) {
|
|
if (param_1 == PROC_ALINK) {
|
|
field_0x5f2 |= 1;
|
|
} else if (param_1 == PROC_NPC_P2) {
|
|
field_0x5f2 |= 2;
|
|
}
|
|
|
|
return field_0x5f2 == 3;
|
|
}
|
|
|
|
/* 804848D8-80484908 001C78 0030+00 1/1 0/0 0/0 .text nr_ride_people__Q211daObjSwpush5Act_cFc */
|
|
int daObjSwpush::Act_c::nr_ride_people(char param_1) {
|
|
int rv = 0;
|
|
for (int i = 0; i < 8; i++) {
|
|
if (((param_1 >> i) & 1) != 0) {
|
|
rv++;
|
|
}
|
|
}
|
|
|
|
return rv;
|
|
}
|
|
|
|
/* 80484908-80484BB8 001CA8 02B0+00 2/2 0/0 0/0 .text Mthd_Execute__Q211daObjSwpush5Act_cFv */
|
|
int daObjSwpush::Act_c::Mthd_Execute() {
|
|
typedef void (daObjSwpush::Act_c::*procFunc)();
|
|
|
|
static procFunc demo_proc[] = {
|
|
&daObjSwpush::Act_c::demo_non,
|
|
&daObjSwpush::Act_c::demo_reqPause,
|
|
&daObjSwpush::Act_c::demo_runPause,
|
|
&daObjSwpush::Act_c::demo_reqSw,
|
|
&daObjSwpush::Act_c::demo_runSw,
|
|
};
|
|
(this->*demo_proc[mDemoMode])();
|
|
|
|
set_push_flag();
|
|
|
|
static procFunc mode_proc[] = {
|
|
&daObjSwpush::Act_c::mode_upper,
|
|
&daObjSwpush::Act_c::mode_u_l,
|
|
&daObjSwpush::Act_c::mode_lower,
|
|
&daObjSwpush::Act_c::mode_l_u,
|
|
};
|
|
(this->*mode_proc[mMode])();
|
|
|
|
calc_top_pos();
|
|
|
|
mPrevRiding = mRidingMode != 0;
|
|
mPrevHeavyRiding = mHeavyRiding;
|
|
mRidingMode = 0;
|
|
mHeavyRiding = false;
|
|
field_0x5f3 = field_0x5f2;
|
|
field_0x5f2 = 0;
|
|
|
|
set_mtx();
|
|
mpBgW->CopyBackVtx();
|
|
cBgD_Vtx_t* vtx_tbl = mpBgW->GetVtxTbl();
|
|
int i_max = mpBgW->GetVtxNum();
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
JUT_ASSERT(1552, M_op_vtx[i] < i_max);
|
|
|
|
vtx_tbl[M_op_vtx[i]].y = field_0x5a4 + mTopPos;
|
|
}
|
|
|
|
mpBgW->Move();
|
|
eyePos.x = current.pos.x;
|
|
eyePos.y = current.pos.y + field_0x5d8 - -35.5f;
|
|
eyePos.z = current.pos.z;
|
|
set_btp_frame();
|
|
|
|
daPy_py_c* player = daPy_getPlayerActorClass();
|
|
s16 sVar1 = cLib_targetAngleY(&player->current.pos, ¤t.pos) - player->shape_angle.y;
|
|
|
|
if (fopAcM_searchPlayerDistanceXZ(this) < KREG_F(0) + 150.0f && sVar1 < 0x4000) {
|
|
player->setForcePutPos(current.pos);
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* 80484BB8-80484C5C 001F58 00A4+00 1/1 0/0 0/0 .text Mthd_Draw__Q211daObjSwpush5Act_cFv */
|
|
int daObjSwpush::Act_c::Mthd_Draw() {
|
|
g_env_light.settingTevStruct(16, ¤t.pos, &tevStr);
|
|
g_env_light.setLightTevColorType_MAJI(mpModel, &tevStr);
|
|
dComIfGd_setListBG();
|
|
mDoExt_modelUpdateDL(mpModel);
|
|
dComIfGd_setList();
|
|
return 1;
|
|
}
|
|
|
|
namespace daObjSwpush {
|
|
namespace {
|
|
cPhs__Step Mthd_Create(void* i_this) {
|
|
return static_cast<Act_c*>(i_this)->Mthd_Create();
|
|
}
|
|
|
|
int Mthd_Delete(void* i_this) {
|
|
return static_cast<Act_c*>(i_this)->Mthd_Delete();
|
|
}
|
|
|
|
int Mthd_Execute(void* i_this) {
|
|
return static_cast<Act_c*>(i_this)->Mthd_Execute();
|
|
}
|
|
|
|
int Mthd_Draw(void* i_this) {
|
|
return static_cast<Act_c*>(i_this)->Mthd_Draw();
|
|
}
|
|
|
|
int Mthd_IsDelete(void* i_this) {
|
|
return 1;
|
|
}
|
|
|
|
/* 80484F88-80484FA8 -00001 0020+00 1/0 0/0 0/0 .data Mthd_Table__Q211daObjSwpush28@unnamed@d_a_obj_swpush_cpp@ */
|
|
static actor_method_class Mthd_Table = {
|
|
(process_method_func)Mthd_Create,
|
|
(process_method_func)Mthd_Delete,
|
|
(process_method_func)Mthd_Execute,
|
|
(process_method_func)Mthd_IsDelete,
|
|
(process_method_func)Mthd_Draw,
|
|
};
|
|
}; // namespace
|
|
}; // namespace daObjSwpush
|
|
|
|
AUDIO_INSTANCES;
|
|
|
|
/* 80484FA8-80484FD8 -00001 0030+00 0/0 0/0 1/0 .data g_profile_Obj_Swpush */
|
|
extern actor_process_profile_definition g_profile_Obj_Swpush = {
|
|
fpcLy_CURRENT_e, // mLayerID
|
|
2, // mListID
|
|
fpcPi_CURRENT_e, // mListPrio
|
|
PROC_Obj_Swpush, // mProcName
|
|
&g_fpcLf_Method.base, // sub_method
|
|
sizeof(daObjSwpush::Act_c), // mSize
|
|
0, // mSizeOther
|
|
0, // mParameters
|
|
&g_fopAc_Method.base, // sub_method
|
|
11, // mPriority
|
|
&daObjSwpush::Mthd_Table, // sub_method
|
|
0x00040100, // mStatus
|
|
fopAc_ACTOR_e, // mActorType
|
|
fopAc_CULLBOX_CUSTOM_e, // cullType
|
|
};
|