// // Generated by dtk // Translation Unit: d_a_pedestal.cpp // #include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/actor/d_a_pedestal.h" #include "d/d_com_inf_game.h" #include "res/Object/Hdai1.h" namespace daPedestal { const char daPds_c::m_arcname[] = "Hdai1"; /* 00000078-000000DC .text _delete__Q210daPedestal7daPds_cFv */ bool daPds_c::_delete() { if (heap != NULL) { dComIfG_Bgsp()->Release(mpBgW); } mOctagonGlowCb.end(); dComIfG_resDelete(&mPhase, m_arcname); return TRUE; } /* 000000DC-000000FC .text CheckCreateHeap__10daPedestalFP10fopAc_ac_c */ static BOOL CheckCreateHeap(fopAc_ac_c* i_this) { return static_cast(i_this)->CreateHeap(); } /* 000000FC-00000244 .text CreateHeap__Q210daPedestal7daPds_cFv */ BOOL daPds_c::CreateHeap() { J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(m_arcname, dRes_INDEX_HDAI1_BDL_HDAI1_e); JUT_ASSERT(0xC1, modelData != NULL); mpModel = mDoExt_J3DModel__create(modelData, 0, 0x11020203U); if (!mpModel) { return FALSE; } if(!initBrkAnm(3, false)) { return FALSE; } mpBgW = new dBgW(); if (mpBgW != NULL) { if (mpBgW->Set((cBgD_t*)dComIfG_getObjectRes(m_arcname, dRes_INDEX_HDAI1_DZB_HDAI_e), cBgW::MOVE_BG_e, &mMtx) == true) { return FALSE; } else { return TRUE; } } return FALSE; } /* 00000244-00000380 .text CreateInit__Q210daPedestal7daPds_cFv */ void daPds_c::CreateInit() { static char* l_os_name[] = { "Os", "Os1", "Os2" }; mType = fopAcM_GetParam(this) & 0xFF; fopAcM_SetMtx(this, mpModel->getBaseTRMtx()); fopAcM_setCullSizeBox(this, -150.0f, -20.0f, -150.0f, 150.0f, 250.0f, 150.0f); if (mType == 0) { // Type 0: A pedestal that a npc_os starts on in its original room. if (wakeupCheck()) { if (argument <= 2) { fopAc_ac_c* pActor = fopAcM_searchFromName(l_os_name[argument], 0, 0); if (pActor != NULL && fopAcM_searchActorDistanceXZ(this, pActor) < 100.0f) { pActor->current.pos.y = current.pos.y; } } current.pos.y -= 240.0f; } } else if (mType == 1 && finishCheck()) { // Type 1: A pedestal that a npc_os ends on in the central room. current.pos.y += 240.0f; } set_mtx(); dComIfG_Bgsp()->Regist(mpBgW, this); mpBgW->Move(); } /* 00000380-00000474 .text _create__Q210daPedestal7daPds_cFv */ cPhs_State daPds_c::_create() { fopAcM_ct(this, daPds_c); cPhs_State phase_state = dComIfG_resLoad(&mPhase, m_arcname); if (phase_state == cPhs_COMPLEATE_e) { if (!fopAcM_entrySolidHeap(this, CheckCreateHeap, 0x2000)) { mpBgW = NULL; return cPhs_ERROR_e; } CreateInit(); } return phase_state; } /* 00000474-0000052C .text getMyStaffId__Q210daPedestal7daPds_cFv */ int daPds_c::getMyStaffId() { if (argument == 0) { return dComIfGp_evmng_getMyStaffId("Hdai1"); } else if (argument == 1) { return dComIfGp_evmng_getMyStaffId("Hdai2"); } else if (argument == 2) { return dComIfGp_evmng_getMyStaffId("Hdai3"); } return -1; } /* 0000052C-000005D8 .text wakeupCheck__Q210daPedestal7daPds_cFv */ BOOL daPds_c::wakeupCheck() { if (argument == 0) { if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_1780)) { return TRUE; } } else if (argument == 1) { if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_1740)) { return TRUE; } } else if (argument == 2) { if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_1720)) { return TRUE; } } return FALSE; } /* 000005D8-00000684 .text finishCheck__Q210daPedestal7daPds_cFv */ BOOL daPds_c::finishCheck() { if (argument == 0) { if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_1710)) { return TRUE; } } else if (argument == 1) { if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_1704)) { return TRUE; } } else if (argument == 2) { if (dComIfGs_isEventBit(dSv_event_flag_c::UNK_1B01)) { return TRUE; } } return FALSE; } /* 00000684-0000073C .text setAction__Q210daPedestal7daPds_cFMQ210daPedestal7daPds_cFPCvPvPv_iPv */ BOOL daPds_c::setAction(ActionFunc_t action, void* param_1) { if (mAction != NULL) { mActionStatus = ACTION_ENDING; (this->*mAction)(param_1); } mAction = action; mActionStatus = ACTION_STARTING; unk310 = 0; unk312 = 0; unk314 = 0; unk316 = 0; unk31C = 0.0f; (this->*mAction)(param_1); return TRUE; } /* 0000073C-000007C4 .text action__Q210daPedestal7daPds_cFPv */ void daPds_c::action(void* param_1) { if (!mAction) { setAction(&daPds_c::waitAction, NULL); } (this->*mAction)(param_1); } /* 000007C4-000007E0 .text waitAction__Q210daPedestal7daPds_cFPv */ BOOL daPds_c::waitAction(void*) { if (mActionStatus == ACTION_STARTING) { mActionStatus += 1; // ACTION_ONGOING } return TRUE; } typedef void (daPds_c::* eventInitFunc)(int); static eventInitFunc event_init_tbl[] = { &daPds_c::initialDefault, &daPds_c::initialMoveEvent, &daPds_c::initialEffectSet, &daPds_c::initialEffectEnd, }; typedef BOOL (daPds_c::* eventActionFunc)(int); static eventActionFunc event_action_tbl[] = { &daPds_c::actionDefault, &daPds_c::actionMoveEvent, &daPds_c::actionDefault, &daPds_c::actionDefault, }; static char* cut_name_tbl[] = { "WAIT", "MOVE", "EFFSET", "EFFEND" }; /* 000007E0-000008E4 .text eventProc__Q210daPedestal7daPds_cFv */ BOOL daPds_c::eventProc() { int staffIdx = getMyStaffId(); if (dComIfGp_event_runCheck()) { if (staffIdx != -1) { int actIdx = dComIfGp_evmng_getMyActIdx(staffIdx, cut_name_tbl, ARRAY_SIZE(cut_name_tbl), TRUE, 0); if (actIdx == -1) { dComIfGp_evmng_cutEnd(staffIdx); } else { if(dComIfGp_evmng_getIsAddvance(staffIdx)) { (this->*event_init_tbl[actIdx])(staffIdx); } if((this->*event_action_tbl[actIdx])(staffIdx)) { dComIfGp_evmng_cutEnd(staffIdx); } } } return TRUE; } return FALSE; } /* 000008E4-000008E8 .text initialDefault__Q210daPedestal7daPds_cFi */ void daPds_c::initialDefault(int) {} /* 000008E8-000008F0 .text actionDefault__Q210daPedestal7daPds_cFi */ BOOL daPds_c::actionDefault(int) { return TRUE; } /* 000008F0-000009A8 .text initialMoveEvent__Q210daPedestal7daPds_cFi */ void daPds_c::initialMoveEvent(int staffIdx) { f32* pSpeed = dComIfGp_evmng_getMyFloatP(staffIdx, "Speed"); if (pSpeed) { speed.y = *pSpeed; } else { speed.y = 1.0f; } f32* pDist = dComIfGp_evmng_getMyFloatP(staffIdx, "Dist"); if (pDist) { mTargetYPos = current.pos.y + *pDist; } else { mTargetYPos = current.pos.y; } } /* 000009A8-00000AEC .text actionMoveEvent__Q210daPedestal7daPds_cFi */ BOOL daPds_c::actionMoveEvent(int) { current.pos.y += speed.y; BOOL ret = FALSE; if (speed.y < 0.0f) { if (current.pos.y <= mTargetYPos) { current.pos.y = mTargetYPos; speed.y = 0.0f; ret = TRUE; } } else if (speed.y > 0.0f) { if (current.pos.y >= mTargetYPos) { current.pos.y = mTargetYPos; speed.y = 0.0f; ret = TRUE; } } else { current.pos.y = mTargetYPos; ret = TRUE; } if (ret) { fopAcM_seStartCurrent(this, JA_SE_OBJ_ST_DAI_STOP, 0); } else { fopAcM_seStartCurrent(this, JA_SE_OBJ_ST_DAI_MOVE, 0); } return ret; } /* 00000AEC-00000B40 .text initialEffectSet__Q210daPedestal7daPds_cFi */ void daPds_c::initialEffectSet(int) { mOctagonGlowCb.makeEmitter(dPa_name::ID_AK_SN_OTOMOBASELIGHT00, ¤t.pos, &shape_angle, NULL); initBrkAnm(0, true); } /* 00000B40-00000B80 .text initialEffectEnd__Q210daPedestal7daPds_cFi */ void daPds_c::initialEffectEnd(int) { mOctagonGlowCb.end(); initBrkAnm(2, true); } /* 00000B80-00000C10 .text set_mtx__Q210daPedestal7daPds_cFv */ void daPds_c::set_mtx() { mpModel->setBaseScale(scale); mDoMtx_stack_c::transS(current.pos); mDoMtx_stack_c::YrotM(current.angle.y); mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); mDoMtx_copy(mDoMtx_stack_c::get(), mMtx); } /* 00000C10-00000D58 .text initBrkAnm__Q210daPedestal7daPds_cFUcb */ BOOL daPds_c::initBrkAnm(u8 param_1, bool param_2) { struct AnmTableEntry { /* 0x00 */ int loopMode; /* 0x04 */ f32 speed; /* 0x08 */ s32 unk_4; }; // Size: 0x0C static AnmTableEntry brkAnmTbl[] = { {J3DFrameCtrl::EMode_LOOP, 1.0f, 0}, {J3DFrameCtrl::EMode_NONE, 0.0f, 0}, {J3DFrameCtrl::EMode_NONE, 0.0f, 0}, {J3DFrameCtrl::EMode_NONE, 0.0f, -1}, }; J3DModelData* modelData = mpModel->getModelData(); bool ret = false; J3DAnmTevRegKey* a_brk = (J3DAnmTevRegKey*)dComIfG_getObjectRes(m_arcname, dRes_INDEX_HDAI1_BRK_HDAI1_e); JUT_ASSERT(0x28C, a_brk != NULL); if (mBrk.init(modelData, a_brk, TRUE, brkAnmTbl[param_1].loopMode, brkAnmTbl[param_1].speed, 0, -1, param_2, 0)) { unk30E = param_1; if (brkAnmTbl[param_1].unk_4 < 0) { mBrk.setFrame(mBrk.getEndFrame()); } unk308 = mBrk.getFrame(); ret = true; } return ret; } /* 00000D58-00000D98 .text playBrkAnm__Q210daPedestal7daPds_cFv */ void daPds_c::playBrkAnm() { unk30F = mBrk.play(); unk308 = mBrk.getFrame(); } /* 00000D98-00000E48 .text _execute__Q210daPedestal7daPds_cFv */ bool daPds_c::_execute() { playBrkAnm(); if (!eventProc()) { action(NULL); } set_mtx(); mpBgW->Move(); if (mOctagonGlowCb.getEmitter() != NULL) { fopAcM_seStartCurrent(this, JA_SE_OBJ_ST_DAI_LIGHT, 0); } return TRUE; } /* 00000E48-00000F10 .text _draw__Q210daPedestal7daPds_cFv */ bool daPds_c::_draw() { g_env_light.settingTevStruct(TEV_TYPE_BG0, ¤t.pos, &tevStr); g_env_light.setLightTevColorType(mpModel, &tevStr); dComIfGd_setListBG(); J3DModelData* modelData = mpModel->getModelData(); mBrk.entry(modelData); mDoExt_modelUpdateDL(mpModel); mBrk.remove(modelData); dComIfGd_setList(); return TRUE; } /* 00000F10-00000F30 .text daPds_Create__10daPedestalFPv */ static cPhs_State daPds_Create(void* i_this) { return static_cast(i_this)->_create(); } /* 00000F30-00000F54 .text daPds_Delete__10daPedestalFPv */ static BOOL daPds_Delete(void* i_this) { return static_cast(i_this)->_delete(); } /* 00000F54-00000F78 .text daPds_Draw__10daPedestalFPv */ static BOOL daPds_Draw(void* i_this) { return static_cast(i_this)->_draw(); } /* 00000F78-00000F9C .text daPds_Execute__10daPedestalFPv */ static BOOL daPds_Execute(void* i_this) { return static_cast(i_this)->_execute(); } /* 00000F9C-00000FA4 .text daPds_IsDelete__10daPedestalFPv */ static BOOL daPds_IsDelete(void*) { return TRUE; } /* 00000FA4-00001008 .text execute__Q210daPedestal25daPds_infiniteEcallBack_cFP14JPABaseEmitter */ void daPds_infiniteEcallBack_c::execute(JPABaseEmitter* emitter) { if (mpPos != NULL) { emitter->setGlobalTranslation(mpPos->x, mpPos->y, mpPos->z); } if (mpAngle != NULL) { JGeometry::TVec3 rot(mpAngle->x, mpAngle->y, mpAngle->z); emitter->setGlobalRotation(rot); } } /* 00001008-00001044 .text end__Q210daPedestal25daPds_infiniteEcallBack_cFv */ void daPds_infiniteEcallBack_c::end() { if (mpEmitter != NULL) { mpEmitter->becomeInvalidEmitter(); mpEmitter->setEmitterCallBackPtr(NULL); mpEmitter = NULL; setPos(NULL); setAngle(NULL); } } /* 00001044-000010D4 .text makeEmitter__Q210daPedestal25daPds_infiniteEcallBack_cFUsPC4cXyzPC5csXyzPC4cXyz */ void daPds_infiniteEcallBack_c::makeEmitter(u16 particleID, const cXyz* pos, const csXyz* angle, const cXyz* scale) { end(); dComIfGp_particle_set(particleID, pos, angle, scale, 0xFF, this); setPos(pos); setAngle(angle); } static actor_method_class daActMethodTable = { (process_method_func)daPds_Create, (process_method_func)daPds_Delete, (process_method_func)daPds_Execute, (process_method_func)daPds_IsDelete, (process_method_func)daPds_Draw, }; }; // namespace daPedestal actor_process_profile_definition g_profile_PEDESTAL = { /* Layer ID */ fpcLy_CURRENT_e, /* List ID */ 0x0003, /* List Prio */ fpcPi_CURRENT_e, /* Proc Name */ fpcNm_PEDESTAL_e, /* Proc SubMtd */ &g_fpcLf_Method.base, /* Size */ sizeof(daPedestal::daPds_c), /* Size Other */ 0, /* Parameters */ 0, /* Leaf SubMtd */ &g_fopAc_Method.base, /* Draw Prio */ fpcDwPi_PEDESTAL_e, /* Actor SubMtd */ &daPedestal::daActMethodTable, /* Status */ fopAcStts_NOCULLEXEC_e | fopAcStts_CULL_e | fopAcStts_UNK40000_e, /* Group */ fopAc_ACTOR_e, /* Cull Type */ fopAc_CULLBOX_CUSTOM_e, };