/** * d_a_obj_auzu.cpp * Object - Big Octo/Jabun's cave whirlpool */ #include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/actor/d_a_obj_auzu.h" #include "d/actor/d_a_kytag01.h" #include "d/actor/d_a_player_main.h" #include "d/actor/d_a_ship.h" #include "d/d_procname.h" #include "d/d_priority.h" #include "d/res/res_auzu.h" namespace daObjAuzu { namespace { f32 L_radius = 2500.0f; }; const char Act_c::M_arcname[] = "Auzu"; const Attr_c Act_c::M_attr[2] = { { /* mRadiusMult */ 1.5f, /* mOuterActivationMult */ 1.5f, /* mInnerActivationMult */ 1.3f, /* mAnmSpeed */ 0.5f }, { /* mRadiusMult */ 2.0f, /* mOuterActivationMult */ 2.0f, /* mInnerActivationMult */ 2.0f, /* mAnmSpeed */ 1.0f } }; }; /* 00000078-0000009C .text solidHeapCB__Q29daObjAuzu5Act_cFP10fopAc_ac_c */ BOOL daObjAuzu::Act_c::solidHeapCB(fopAc_ac_c* i_this) { return ((Act_c*)i_this)->create_heap(); } /* 0000009C-000001F8 .text create_heap__Q29daObjAuzu5Act_cFv */ bool daObjAuzu::Act_c::create_heap() { bool create_result = false; J3DModelData* mdl_data = static_cast(dComIfG_getObjectRes(M_arcname, AUZU_BDL_AUZU)); JUT_ASSERT(226, mdl_data != NULL); mpModel = mDoExt_J3DModel__create(mdl_data, 0x80000, 0x11000222); J3DAnmTextureSRTKey* btk_data = static_cast(dComIfG_getObjectRes(M_arcname, AUZU_BTK_AUZU)); JUT_ASSERT(236, btk_data != NULL); int init_result = mBtkAnm.init( mdl_data, btk_data, TRUE, J3DFrameCtrl::EMode_LOOP, attr().mAnmSpeed, 0, -1, false, FALSE ); if (mpModel && init_result != 0) { create_result = true; } return create_result; } /* 000001F8-000003B8 .text _create__Q29daObjAuzu5Act_cFv */ cPhs_State daObjAuzu::Act_c::_create() { cPhs_State state = cPhs_ERROR_e; mType = prm_get_type(); fopAcM_SetupActor(this, daObjAuzu::Act_c); mbIsExist = is_exist(); if (mbIsExist != 0) { state = dComIfG_resLoad(&mPhs, M_arcname); if (state == cPhs_COMPLEATE_e) { if (fopAcM_entrySolidHeap(this, solidHeapCB, 3456)) { fopAcM_SetMtx(this, mpModel->getBaseTRMtx()); init_mtx(); f32 cull_xz = attr().mRadiusMult * 3000.0f; fopAcM_setCullSizeBox(this, -cull_xz, -30.0f, -cull_xz, cull_xz, 30.0f, cull_xz ); mbToAppear = false; if (prm_get_appear() == 1) { mScaleAnimFactor = 0.0f; } else { if (fopAcM_isSwitch(this, prm_get_swSave())) { mScaleAnimFactor = 0.0f; } else { mScaleAnimFactor = 1.0f; } } mbBgmStarted = false; mKytagPcId = fpcM_ERROR_PROCESS_ID_e; set_state_map(); } else { state = cPhs_ERROR_e; } } } return state; } /* 0000045C-00000498 .text _delete__Q29daObjAuzu5Act_cFv */ bool daObjAuzu::Act_c::_delete() { if (mbIsExist != 0) { dComIfG_resDeleteDemo(&mPhs, M_arcname); } return true; } /* 00000498-000004E8 .text is_exist__Q29daObjAuzu5Act_cCFv */ bool daObjAuzu::Act_c::is_exist() const { if (mType == 0) { return dComIfGs_isEventBit(dSv_event_flag_c::ENDLESS_NIGHT); } return true; } /* 000004E8-00000554 .text set_mtx__Q29daObjAuzu5Act_cFv */ void daObjAuzu::Act_c::set_mtx() { mDoMtx_stack_c::transS(current.pos); mDoMtx_stack_c::ZXYrotM(shape_angle); mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 00000554-000005B8 .text init_mtx__Q29daObjAuzu5Act_cFv */ void daObjAuzu::Act_c::init_mtx() { mpModel->setBaseScale( cXyz( scale.x * attr().mRadiusMult, scale.y, scale.z * attr().mRadiusMult ) ); set_mtx(); } /* 000005B8-00000624 .text set_state_map__Q29daObjAuzu5Act_cFv */ void daObjAuzu::Act_c::set_state_map() { if (prm_get_appear() != 1) { if (is_appear()) { fopAcM_OnStatus(this, fopAcStts_SHOWMAP_e); } else { fopAcM_OffStatus(this, fopAcStts_SHOWMAP_e); } } } /* 00000624-00000788 .text ship_whirl__Q29daObjAuzu5Act_cFv */ void daObjAuzu::Act_c::ship_whirl() { daShip_c* ship_p = dComIfGp_getShipActor(); if (ship_p && fopAcM_GetName(ship_p) == PROC_SHIP) { f32 sqr_mag_xz = fopAcM_searchActorDistanceXZ2(this, ship_p); #if VERSION > VERSION_DEMO f32 inner_activation = (daObjAuzu::L_radius * attr().mInnerActivationMult) * (daObjAuzu::L_radius * attr().mInnerActivationMult); f32 outer_activation = (daObjAuzu::L_radius * attr().mOuterActivationMult) * (daObjAuzu::L_radius * attr().mOuterActivationMult); #else f32 outer_activation = (daObjAuzu::L_radius * attr().mOuterActivationMult) * (daObjAuzu::L_radius * attr().mOuterActivationMult); f32 inner_activation = (daObjAuzu::L_radius * attr().mInnerActivationMult) * (daObjAuzu::L_radius * attr().mInnerActivationMult); #endif if (sqr_mag_xz < outer_activation) { if (mScaleAnimFactor > 0.01f) { bgm_start(); if (sqr_mag_xz < inner_activation) { ship_p->onWhirlFlg(fopAcM_GetID(this), prm_get_linkID()); } else { ship_p->onWhirlFlgDirect(fopAcM_GetID(this), prm_get_linkID()); } } else { ship_p->offWhirlFlg(); } } } } /* 00000788-000007DC .text bgm_start__Q29daObjAuzu5Act_cFv */ void daObjAuzu::Act_c::bgm_start() { if (mType == 0 && !mbBgmStarted) { mbBgmStarted = true; mDoAud_subBgmStart(JA_BGM_DIOCTA_BATTLE); } } /* 000007DC-00000AF8 .text _execute__Q29daObjAuzu5Act_cFv */ bool daObjAuzu::Act_c::_execute() { f32 scale_target; #if VERSION > VERSION_JPN set_mtx(); #endif if (dComIfGp_checkPlayerStatus0(0, daPyStts0_SHIP_RIDE_e)) { ship_whirl(); } else { if (DEMO_SELECT(true, mScaleAnimFactor > 0.01f)) { daPy_lk_c* link_p = daPy_getPlayerLinkActorClass(); fopAcM_searchActorDistanceXZ2(this, daPy_getPlayerLinkActorClass()); if ( fopAcM_searchActorDistanceXZ2(this, link_p) < ((daObjAuzu::L_radius * attr().mOuterActivationMult) * (daObjAuzu::L_radius * attr().mOuterActivationMult)) ) { link_p->setWhirlId(fopAcM_GetID(this)); } } } mBtkAnm.play(); if (prm_get_appear() == 1) { if (mbToAppear) { scale_target = 1.0f; } else { scale_target = 0.0f; } } else { if (fopAcM_isSwitch(this, prm_get_swSave())) { scale_target = 0.0f; } else { scale_target = 1.0f; } } cLib_chaseF(&mScaleAnimFactor, scale_target, 0.02f); s8 param = s8(100.0f * mScaleAnimFactor); fopAcM_seStart(this, JA_SE_ATM_SWIRL, param); if (mScaleAnimFactor > 0.0f && fpcM_IsErrorID(mKytagPcId)) { cXyz scaleXZ; scaleXZ.x = (mScaleAnimFactor * (daObjAuzu::L_radius * attr().mRadiusMult)) / 5000.0f; scaleXZ.z = (mScaleAnimFactor * ((daObjAuzu::L_radius + 500.0f) * attr().mRadiusMult)) / 5000.0f; mKytagPcId = fopAcM_create( PROC_KYTAG01, -1, ¤t.pos, tevStr.mRoomNo, ¤t.angle, &scaleXZ ); } else if (mScaleAnimFactor > 0.0f && fpcM_IsErrorID(mKytagPcId) == FALSE) { kytag01_class* kytag01_p = (kytag01_class *) fopAcM_SearchByID(mKytagPcId); if (kytag01_p){ kytag01_p->mWaveInfo.mInnerRadius = mScaleAnimFactor * (daObjAuzu::L_radius * attr().mRadiusMult); kytag01_p->mWaveInfo.mOuterRadius = mScaleAnimFactor * ((daObjAuzu::L_radius + 500.0f) * attr().mRadiusMult); } } else if (mScaleAnimFactor == 0.0f && fpcM_IsErrorID(mKytagPcId) == FALSE) { kytag01_class* kytag01_p = (kytag01_class *) fopAcM_SearchByID(mKytagPcId); if (kytag01_p){ fopAcM_delete(kytag01_p); } } set_state_map(); return true; } /* 00000AF8-00000B88 .text set_material__Q29daObjAuzu5Act_cFP11J3DMaterialUc */ void daObjAuzu::Act_c::set_material(J3DMaterial* i_materialP, u8 i_alphaVal) { while (i_materialP != NULL) { if (i_alphaVal == 0) { i_materialP->getShape()->hide(); } else { i_materialP->getShape()->show(); i_materialP->getTevKColor(3)->mColor.a = i_alphaVal; } i_materialP = i_materialP->getNext(); } } /* 00000B88-00000C38 .text _draw__Q29daObjAuzu5Act_cFv */ bool daObjAuzu::Act_c::_draw() { g_env_light.settingTevStruct(TEV_TYPE_BG1, ¤t.pos, &tevStr); g_env_light.setLightTevColorType(mpModel, &tevStr); mBtkAnm.entry(mpModel->getModelData()); J3DModelData* model_data_p = mpModel->getModelData(); u8 alpha = u8(mScaleAnimFactor * 255.5f) & 0xFF; set_material( model_data_p->getJointNodePointer(0)->getMesh(), alpha ); mDoExt_modelUpdateDL(mpModel); return true; } namespace daObjAuzu { namespace { /* 00000C38-00000C58 .text Mthd_Create__Q29daObjAuzu26@unnamed@d_a_obj_auzu_cpp@FPv */ cPhs_State Mthd_Create(void* i_this) { return ((daObjAuzu::Act_c*)i_this)->_create(); } /* 00000C58-00000C7C .text Mthd_Delete__Q29daObjAuzu26@unnamed@d_a_obj_auzu_cpp@FPv */ BOOL Mthd_Delete(void* i_this) { return ((daObjAuzu::Act_c*)i_this)->_delete(); } /* 00000C7C-00000CA0 .text Mthd_Execute__Q29daObjAuzu26@unnamed@d_a_obj_auzu_cpp@FPv */ BOOL Mthd_Execute(void* i_this) { return ((daObjAuzu::Act_c*)i_this)->_execute(); } /* 00000CA0-00000CC4 .text Mthd_Draw__Q29daObjAuzu26@unnamed@d_a_obj_auzu_cpp@FPv */ BOOL Mthd_Draw(void* i_this) { return ((daObjAuzu::Act_c*)i_this)->_draw(); } /* 00000CC4-00000CCC .text Mthd_IsDelete__Q29daObjAuzu26@unnamed@d_a_obj_auzu_cpp@FPv */ BOOL Mthd_IsDelete(void*) { return TRUE; } 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 daObjAuzu actor_process_profile_definition g_profile_Obj_Auzu = { /* LayerID */ fpcLy_CURRENT_e, /* ListID */ 0x0007, /* ListPrio */ fpcPi_CURRENT_e, /* ProcName */ PROC_Obj_Auzu, /* Proc SubMtd */ &g_fpcLf_Method.base, /* Size */ sizeof(daObjAuzu::Act_c), /* SizeOther */ 0, /* Parameters */ 0, /* Leaf SubMtd */ &g_fopAc_Method.base, /* Priority */ PRIO_Obj_Auzu, /* Actor SubMtd */ &daObjAuzu::Mthd_Table, /* Status */ 0x06 | fopAcStts_CULL_e | fopAcStts_UNK40000_e, /* Group */ fopAc_ACTOR_e, /* CullType */ fopAc_CULLBOX_CUSTOM_e, };