/** * d_a_obj_mkie.cpp * Elephant statue in Earth Temple, that dissolves when hit with light. */ #include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/actor/d_a_obj_mkie.h" #include "res/Object/MkieB.h" Mtx daObjMkie::Act_c::M_tmp_mtx; const char daObjMkie::Act_c::M_arcname[] = "MkieB"; const dCcD_SrcTri daObjMkie::Act_c::M_tri_src = { // dCcD_SrcGObjInf { /* Flags */ 0, /* SrcObjAt Type */ 0, /* SrcObjAt Atp */ 0, /* SrcObjAt SPrm */ 0, /* SrcObjTg Type */ AT_TYPE_LIGHT, /* SrcObjTg SPrm */ dCcG_TgSPrm_Shield_e | dCcG_TgSPrm_ShieldFrontRange_e, /* SrcObjCo SPrm */ 0, /* SrcGObjAt Se */ 0, /* SrcGObjAt HitMark */ 0, /* SrcGObjAt Spl */ 0, /* SrcGObjAt Mtrl */ 0, /* SrcGObjAt SPrm */ 0, /* SrcGObjTg Se */ 0, /* SrcGObjTg HitMark */ 0, /* SrcGObjTg Spl */ 0, /* SrcGObjTg Mtrl */ 0, /* SrcGObjTg SPrm */ 0, /* SrcGObjCo SPrm */ 0, }, // cM3dGTriS {{ /* a */ {0.0f, 0.0f, 0.0f}, /* b */ {0.0f, 0.0f, 0.0f}, /* c */ {0.0f, 0.0f, 0.0f}, }}, }; const daObjMkie::Act_c::Attr_c daObjMkie::Act_c::M_attr[2] = { { "MkieB_die", 1.0f, { { {-30.0f, 190.0f, 40.0f}, {-65.0f, 50.0f, 75.0f}, {65.0f, 50.0f, 75.0f}, }, { {-30.0f, 190.0f, 40.0f}, {65.0f, 50.0f, 75.0f}, {30.0f, 190.0f, 40.0f}, }, { {38.0f, 190.0f, 20.0f}, {75.0f, 50.0f, 65.0f}, {75.0f, 50.0f, -65.0f}, }, { {38.0f, 190.0f, 20.0f}, {75.0f, 50.0f, -65.0f}, {38.0f, 190.0f, -40.0f}, }, { {30.0f, 190.0f, -60.0f}, {65.0f, 50.0f, -75.0f}, {-65.0f, 50.0f, -75.0f}, }, { {30.0f, 190.0f, -60.0f}, {-65.0f, 50.0f, -75.0f}, {-30.0f, 190.0f, -60.0f}, }, { {-38.0f, 190.0f, -40.0f}, {-75.0f, 50.0f, -65.0f}, {-75.0f, 50.0f, 65.0f}, }, {{-38.0f, 190.0f, -40.0f}, {-75.0f, 50.0f, 65.0f}, {-38.0f, 190.0f, 20.0f}}, }, }, {"MkieBAB_die", 3.0f, {{ {-90.0f, 570.0f, 170.0f}, {-195.0f, 150.0f, 225.0f}, {195.0f, 150.0f, 225.0f}, }, { {-90.0f, 570.0f, 170.0f}, {195.0f, 150.0f, 225.0f}, {90.0f, 570.0f, 170.0f}, }, { {120.0f, 570.0f, 60.0f}, {225.f, 150.0f, 195.0f}, {225.0f, 150.0f, -195.0f}, }, { {120.0f, 570.0f, 60.0f}, {225.0f, 150.0f, -195.0f}, {120.0f, 570.0f, -120.0f}, }, { {90.0f, 570.0f, -180.0f}, {195.0f, 150.0f, -225.0f}, {-195.0f, 150.0f, -225.0f}, }, { {90.0f, 570.0f, -180.0f}, {-195.0f, 150.0f, -225.0f}, {-90.0f, 570.0f, -180.0f}, }, { {-120.0f, 570.0f, -120.0f}, {-225.0f, 150.0f, -195.0f}, {-225.0f, 150.0f, 195.0f}, }, {{-120.0f, 570.0f, -120.0f}, {-225.0f, 150.0f, 195.0f}, {-120.0f, 570.0f, 60.0f}}}} }; /* 00000078-00000250 .text CreateHeap__Q29daObjMkie5Act_cFv */ BOOL daObjMkie::Act_c::CreateHeap() { J3DModelData* model_data = (J3DModelData*)dComIfG_getObjectRes(M_arcname, dRes_INDEX_MKIEB_BDL_MKIEB_e); JUT_ASSERT(DEMO_SELECT(395, 402), model_data != NULL); mModelBase = mDoExt_J3DModel__create(model_data, 0x80000, 0x11000022); J3DModelData* model_data_van = (J3DModelData*)dComIfG_getObjectRes(M_arcname, dRes_INDEX_MKIEB_BDL_YLSMF00_e); JUT_ASSERT(DEMO_SELECT(404, 411), model_data_van != NULL); mModelVan = mDoExt_J3DModel__create(model_data_van, 0x80000, 0x11000022); J3DAnmTevRegKey* brk_van = (J3DAnmTevRegKey*)dComIfG_getObjectRes(M_arcname, dRes_INDEX_MKIEB_BRK_YLSMF00_e); JUT_ASSERT(DEMO_SELECT(414, 421), brk_van != NULL); int init = mBrkVan.init(model_data_van, brk_van, true, J3DFrameCtrl::EMode_NONE); bool ret = false; if (mModelBase != NULL && mModelVan != NULL && init != 0) { ret = true; } return ret; } /* 00000250-000002EC .text init_cc__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::init_cc() { for (int i = 0; i < 8; i++) { mStts[i].Init(0xff, 0xff, this); mTri[i].Set(M_tri_src); mTri[i].SetStts(&mStts[i]); mTri[i].OnTgNoHitMark(); } set_cc_pos(); } /* 000002EC-00000420 .text set_cc_pos__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::set_cc_pos() { for (int i = 0; i < 8; i++) { Vec src[3]; Vec dst[3]; src[0] = attr().table[i][0]; src[1] = attr().table[i][1]; src[2] = attr().table[i][2]; mDoMtx_multVecArray(mModelBase->getBaseTRMtx(), src, dst, 3); mTri[i].setPos(&dst[0], &dst[1], &dst[2]); } } /* 00000420-00000568 .text Create__Q29daObjMkie5Act_cFv */ BOOL daObjMkie::Act_c::Create() { fopAcM_SetMtx(this, mModelBase->getBaseTRMtx()); init_mtx(); { fopAcM_setCullSizeBox( this, attr().mScale * -80.0f, attr().mScale * -1.0f, attr().mScale * -80.0f, attr().mScale * 80.0f, attr().mScale * 230.0f, attr().mScale * 80.0f ); } init_cc(); #if VERSION > VERSION_DEMO if (daObj::PrmAbstract(this, PRM_FLAG_W, PRM_FLAG_S) != 0) { actor_status &= ~0x3F; gbaName = 0; } #endif mCcInit = false; mBaseAnmPlaying = false; { attention_info.position.y = current.pos.y + attr().mScale * 130.0f; } eyePos = attention_info.position; mEvtIdx = dComIfGp_evmng_getEventIdx(attr().name, prm_get_evId()); return true; } /* 00000568-00000754 .text Mthd_Create__Q29daObjMkie5Act_cFv */ cPhs_State daObjMkie::Act_c::Mthd_Create() { cPhs_State phase_state = cPhs_ERROR_e; fopAcM_ct(this, daObjMkie::Act_c); mSwitch = !fopAcM_isSwitch(this, prm_get_swSave()); if (mSwitch && (phase_state = dComIfG_resLoad(&mPhs, M_arcname), phase_state == cPhs_COMPLEATE_e)) { mType = prm_get_type(); float initialScale = attr().mScale; scale.setall(initialScale); phase_state = MoveBGCreate(M_arcname, dRes_INDEX_MKIEB_DZB_MKIEB_e, dBgS_MoveBGProc_Trans, DEMO_SELECT(0x10000, 0x1B20)); JUT_ASSERT(DEMO_SELECT(521, 534), (phase_state == cPhs_COMPLEATE_e) || (phase_state == cPhs_ERROR_e)); } return phase_state; } /* 00000BF0-00000BF8 .text Delete__Q29daObjMkie5Act_cFv */ BOOL daObjMkie::Act_c::Delete() { return true; } /* 00000BF8-00000C54 .text Mthd_Delete__Q29daObjMkie5Act_cFv */ BOOL daObjMkie::Act_c::Mthd_Delete() { BOOL ret = true; if (mSwitch != false) { ret = MoveBGDelete(); dComIfG_resDeleteDemo(&mPhs, M_arcname); } return ret; } /* 00000C54-00000CF8 .text set_mtx__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::set_mtx() { mDoMtx_stack_c::transS(current.pos); mDoMtx_stack_c::ZXYrotM(shape_angle); mModelBase->setBaseTRMtx(mDoMtx_stack_c::get()); mModelVan->setBaseTRMtx(mDoMtx_stack_c::get()); mDoMtx_stack_c::scaleM(scale); cMtx_copy(mDoMtx_stack_c::now, M_tmp_mtx); } /* 00000CF8-00000D50 .text init_mtx__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::init_mtx() { mModelBase->setBaseScale(scale); mModelVan->setBaseScale(scale); set_mtx(); } /* 00000D50-00000DF4 .text chk_light__Q29daObjMkie5Act_cFv */ BOOL daObjMkie::Act_c::chk_light() { BOOL ret = false; if (dComIfGp_getDetect().chk_light(&eyePos)) { ret = true; } else { for (int i = 0; i < 8; i++) { if (mTri[i].ChkTgHit()) { mTri[i].ClrTgHit(); ret = true; } } } return ret; } /* 00000DF4-00000E84 .text eff_break__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::eff_break() { _GXColor envColor; envColor.r = (u8)tevStr.mColorC0.r; envColor.g = (u8)tevStr.mColorC0.g; envColor.b = (u8)tevStr.mColorC0.b; envColor.a = (u8)tevStr.mColorC0.a; dComIfGp_particle_set(dPa_name::ID_AK_SN_VANISHFIGURE00, ¤t.pos, &shape_angle, &scale, 0xff, NULL, -1, &tevStr.mColorK0, &envColor, NULL); } /* 00000E84-00000EF4 .text sound_melt__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::sound_melt() { fopAcM_seStart(this, JA_SE_OBJ_L_OBJ_BRK_TAME, 0); } /* 00000EF4-00000F7C .text sound_break__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::sound_break() { static const u32 se_break[] = { JA_SE_OBJ_L_STATUE_BREAK, JA_SE_OBJ_L_STATUE_L_BREAK, }; fopAcM_seStart(this, se_break[mType], 0); } /* 00000F7C-00000FD0 .text vib_break__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::vib_break() { dComIfGp_getVibration().StartShock(4, -0x21, cXyz(0.0f, 1.0f, 0.0f)); } /* 00000FD0-00001094 .text mode_wait__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::mode_wait() { if (chk_light() & 0xff) { mLightCnt += 1; } else { mLightCnt = 0; } if (mLightCnt > 20) { mode_demoWait_init(); } else { if (mCcInit != false) { set_cc_pos(); } if (!fopAcM_cullingCheck(this)) { for (int i = 0; i < 8; i++) { dComIfG_Ccsp()->Set(&mTri[i]); } } } } /* 00001094-000010A8 .text mode_demoWait_init__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::mode_demoWait_init() { mEvtPlaying = false; mModeProc = 1; } /* 000010A8-00001168 .text mode_demoWait__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::mode_demoWait() { bool demo = false; if (dComIfGp_evmng_existence(mEvtIdx)) { if (eventInfo.checkCommandDemoAccrpt()) { demo = true; mEvtPlaying = true; } else { fopAcM_orderOtherEventId(this, mEvtIdx, prm_get_evId()); eventInfo.onCondition(2); } } else { demo = true; } if (demo) { mode_demo_init(); } } /* 00001168-000011FC .text mode_demo_init__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::mode_demo_init() { mModeProc = 2; mTimer = 10; if (!prm_get_correct()) { mDoAud_seStart(JA_SE_READ_RIDDLE_1); } mBroken = false; mBaseAnmPlaying = false; } /* 000011FC-00001338 .text mode_demo__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::mode_demo() { if (mTimer > 0) { mTimer--; if (mTimer == 0) { eff_break(); sound_melt(); fopAcM_onSwitch(this, prm_get_swSave()); } } if (mTimer == 0) { mBaseAnmPlaying = mBrkVan.play(); if (!mBroken && mBaseAnmPlaying) { sound_break(); vib_break(); mBroken = true; } } if (mEvtPlaying && dComIfGp_evmng_endCheck(mEvtIdx)) { dComIfGp_event_reset(); mEvtPlaying = false; } if (!mEvtPlaying && mTimer == 0 && mBaseAnmPlaying) { mStatueDelete = true; } } /* 00001338-000013DC .text mode_proc_call__Q29daObjMkie5Act_cFv */ void daObjMkie::Act_c::mode_proc_call() { static void (Act_c::* mode_proc[])() = { &Act_c::mode_wait, &Act_c::mode_demoWait, &Act_c::mode_demo, }; (this->*mode_proc[mModeProc])(); } /* 000013DC-000014A0 .text Execute__Q29daObjMkie5Act_cFPPA3_A4_f */ BOOL daObjMkie::Act_c::Execute(Mtx** pMtx) { attention_info.position.x = current.pos.x; attention_info.position.y = current.pos.y + attr().mScale * 130.0f; attention_info.position.z = current.pos.z; eyePos = attention_info.position; mode_proc_call(); if (mStatueDelete) { fopAcM_delete(this); } mCcInit = false; set_mtx(); *pMtx = &M_tmp_mtx; return true; } /* 000014A0-000015B8 .text Draw__Q29daObjMkie5Act_cFv */ BOOL daObjMkie::Act_c::Draw() { if (!mBaseAnmPlaying) { bool flagVan = mModeProc == 2 && mTimer == 0; g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &tevStr); if (flagVan) { g_env_light.setLightTevColorType(mModelVan, &tevStr); J3DModelData* modelData = mModelVan->getModelData(); mBrkVan.entry(modelData, mBrkVan.getFrame()); } else { g_env_light.setLightTevColorType(mModelBase, &tevStr); } dComIfGd_setListBG(); if (flagVan) { mDoExt_modelUpdateDL(mModelVan); } else { mDoExt_modelUpdateDL(mModelBase); } dComIfGd_setList(); } return true; } namespace daObjMkie { namespace { /* 000015B8-000015D8 .text Mthd_Create__Q29daObjMkie26@unnamed@d_a_obj_mkie_cpp@FPv */ cPhs_State Mthd_Create(void* i_this) { return ((daObjMkie::Act_c*)i_this)->Mthd_Create(); } /* 000015D8-000015F8 .text Mthd_Delete__Q29daObjMkie26@unnamed@d_a_obj_mkie_cpp@FPv */ BOOL Mthd_Delete(void* i_this) { return ((daObjMkie::Act_c*)i_this)->Mthd_Delete(); } /* 000015F8-00001618 .text Mthd_Execute__Q29daObjMkie26@unnamed@d_a_obj_mkie_cpp@FPv */ BOOL Mthd_Execute(void* i_this) { return ((daObjMkie::Act_c*)i_this)->MoveBGExecute(); } /* 00001618-00001644 .text Mthd_Draw__Q29daObjMkie26@unnamed@d_a_obj_mkie_cpp@FPv */ BOOL Mthd_Draw(void* i_this) { return ((daObjMkie::Act_c*)i_this)->MoveBGDraw(); } /* 00001644-00001670 .text Mthd_IsDelete__Q29daObjMkie26@unnamed@d_a_obj_mkie_cpp@FPv */ BOOL Mthd_IsDelete(void* i_this) { return ((daObjMkie::Act_c*)i_this)->IsDelete(); } 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 daObjMkie actor_process_profile_definition g_profile_Obj_Mkie = { /* Layer ID */ fpcLy_CURRENT_e, /* List ID */ 0x0003, /* List Prio */ fpcPi_CURRENT_e, /* Proc Name */ fpcNm_Obj_Mkie_e, /* Proc SubMtd */ &g_fpcLf_Method.base, /* Size */ sizeof(daObjMkie::Act_c), /* Size Other */ 0, /* Parameters */ 0, /* Leaf SubMtd */ &g_fopAc_Method.base, /* Draw Prio */ fpcDwPi_Obj_Mkie_e, /* Actor SubMtd */ &daObjMkie::Mthd_Table, /* Status */ 0x04 | fopAcStts_SHOWMAP_e | fopAcStts_CULL_e | fopAcStts_UNK40000_e, /* Group */ fopAc_ACTOR_e, /* Cull Type */ fopAc_CULLBOX_CUSTOM_e, };