diff --git a/configure.py b/configure.py index 1c3fd0231..65b0c3fd0 100755 --- a/configure.py +++ b/configure.py @@ -1756,7 +1756,7 @@ config.libs = [ ActorRel(Matching, "d_a_obj_vmc"), ActorRel(MatchingFor("GZLJ01", "GZLE01", "GZLP01"), "d_a_obj_vmsdz"), ActorRel(Matching, "d_a_obj_vmsms"), - ActorRel(NonMatching, "d_a_obj_volcano"), + ActorRel(Matching, "d_a_obj_volcano"), ActorRel(NonMatching, "d_a_obj_vtil"), ActorRel(NonMatching, "d_a_obj_vyasi"), ActorRel(Matching, "d_a_obj_xfuta"), diff --git a/include/d/actor/d_a_obj_volcano.h b/include/d/actor/d_a_obj_volcano.h index cb06b61c1..94095d7cd 100644 --- a/include/d/actor/d_a_obj_volcano.h +++ b/include/d/actor/d_a_obj_volcano.h @@ -1,14 +1,22 @@ #ifndef D_A_OBJ_VOLCANO_H #define D_A_OBJ_VOLCANO_H +#include "JSystem/JParticle/JPAEmitter.h" #include "d/d_bg_s_movebg_actor.h" +#include "m_Do/m_Do_ext.h" class J3DMaterial; namespace daObjVolcano { class Act_c : public dBgS_MoveBgActor { public: - void prm_get_swSave() const {} + + enum Prm_e { + PRM_SWSAVE_W = 0x08, + PRM_SWSAVE_S = 0x08, + }; + + int prm_get_swSave() const {return daObj::PrmAbstract(this, PRM_SWSAVE_W, PRM_SWSAVE_S);} void StartFire(); void StopFire(); @@ -28,12 +36,38 @@ namespace daObjVolcano { void daObjVolcano_fail_demo_wait(); void daObjVolcano_fail_demo_main(); virtual BOOL Execute(Mtx**); - void set_material(J3DMaterial*, unsigned char); + static void set_material(J3DMaterial*, unsigned char); virtual BOOL Draw(); + + static Mtx M_tmp_mtx; + static const char M_arcname[]; + static const char M_evname[]; public: /* Place member variables here */ - }; + /* 0x2C8 */ JPABaseEmitter* field_0x2C8[10]; + /* 0x2F0 */ request_of_phase_process_class field_0x2F0; + /* 0x2F8 */ J3DModel* field_0x2F8; + /* 0x2FC */ mDoExt_btkAnm field_0x2FC; + /* 0x310 */ J3DModel* field_0x310; + /* 0x314 */ mDoExt_btkAnm field_0x314; + /* 0x328 */ mDoExt_brkAnm field_0x328; + /* 0x340 */ dCcD_Stts field_0x340; + /* 0x37C */ dCcD_Cyl field_0x37C; + /* 0x4AC */ cXyz field_0x4AC; + /* 0x4B8 */ cXyz field_0x4B8; + /* 0x4C4 */ cXyz field_0x4C4; + /* 0x4D0 */ cXyz field_0x4D0; + /* 0x4DC */ cXyz field_0x4DC; + /* 0x4E8 */ s32 field_0x4E8; + /* 0x4EC */ f32 field_0x4EC; + /* 0x4F0 */ f32 field_0x4F0; + /* 0x4F4 */ u8 field_0x4F4; + /* 0x4F8 */ f32 field_0x4F8; + /* 0x4FC */ s16 field_0x4FC; + /* 0x4FE */ s16 field_0x4FE; + /* 0x500 */ s32 field_0x500; + }; // Size: 0x504 }; #endif /* D_A_OBJ_VOLCANO_H */ diff --git a/src/d/actor/d_a_obj_volcano.cpp b/src/d/actor/d_a_obj_volcano.cpp index 84bf15c17..dfaffc046 100644 --- a/src/d/actor/d_a_obj_volcano.cpp +++ b/src/d/actor/d_a_obj_volcano.cpp @@ -7,6 +7,8 @@ #include "d/actor/d_a_obj_volcano.h" #include "d/d_procname.h" #include "d/d_priority.h" +#include "d/d_particle_name.h" +#include "d/res/res_ykzyg.h" #include "d/d_cc_d.h" static dCcD_SrcCyl cyl_check_src = { @@ -39,105 +41,435 @@ static dCcD_SrcCyl cyl_check_src = { }}, }; +Mtx daObjVolcano::Act_c::M_tmp_mtx; +const char daObjVolcano::Act_c::M_arcname[] = "Ykzyg"; +const char daObjVolcano::Act_c::M_evname[] = "volcano"; + /* 00000078-000003CC .text StartFire__Q212daObjVolcano5Act_cFv */ void daObjVolcano::Act_c::StartFire() { - /* Nonmatching */ + this->field_0x4E8 = 0; + this->field_0x4F4 = 1; + field_0x328.setFrame(0.0f); + field_0x328.setPlaySpeed(1.0f); + if (mpBgW != NULL) { + if (!mpBgW->ChkUsed()) { + dComIfG_Bgsp()->Regist(mpBgW, this); + } + } + this->field_0x2C8[0] = dComIfGp_particle_set( + dPa_name::ID_SCENE_805A, &this->field_0x4C4, + &this->current.angle, + &this->field_0x4AC); + this->field_0x2C8[1] = dComIfGp_particle_set( + dPa_name::ID_SCENE_805B, &this->field_0x4D0, + &this->current.angle, + &this->field_0x4AC); + this->field_0x2C8[2] = dComIfGp_particle_set( + dPa_name::ID_SCENE_805C, &this->field_0x4DC, + &this->current.angle, + &this->field_0x4AC); + this->field_0x2C8[3] = dComIfGp_particle_set( + dPa_name::ID_SCENE_8194, &this->current.pos, + &this->current.angle, + NULL); + this->field_0x2C8[4] = dComIfGp_particle_set( + dPa_name::ID_SCENE_8195, &this->current.pos, + &this->current.angle, + NULL); + this->field_0x2C8[5] = dComIfGp_particle_set( + dPa_name::ID_SCENE_8196, &this->current.pos, + &this->current.angle, + NULL); + this->field_0x2C8[6] = dComIfGp_particle_set( + dPa_name::ID_SCENE_8197, &this->current.pos, + &this->current.angle, + NULL); + this->field_0x2C8[7] = dComIfGp_particle_set( + dPa_name::ID_SCENE_8198, &this->current.pos, + &this->current.angle, + NULL); + this->field_0x2C8[8] = dComIfGp_particle_set( + dPa_name::ID_SCENE_8199, &this->current.pos, + &this->current.angle, + NULL); + this->field_0x2C8[9] = dComIfGp_particle_set( + dPa_name::ID_SCENE_819A, &this->current.pos, + &this->current.angle, + NULL); } /* 000003CC-00000470 .text StopFire__Q212daObjVolcano5Act_cFv */ void daObjVolcano::Act_c::StopFire() { - /* Nonmatching */ + if (mpBgW != NULL) { + if (mpBgW->ChkUsed()) { + dComIfG_Bgsp()->Release(mpBgW); + } + } + + for (int i = 0; i < 10; i++) { + if (this->field_0x2C8[i] != NULL) { + this->field_0x2C8[i]->becomeInvalidEmitter(); + } + } } /* 00000470-00000758 .text CreateHeap__Q212daObjVolcano5Act_cFv */ BOOL daObjVolcano::Act_c::CreateHeap() { - /* Nonmatching */ + J3DModelData * model_data = (J3DModelData*)(dComIfG_getObjectRes(M_arcname, YKZYG_BDL_QKZYG)); + JUT_ASSERT(0xbf, model_data != NULL); + + field_0x2F8 = mDoExt_J3DModel__create(model_data, 0x80000, 0x11000222); + J3DAnmTextureSRTKey * btk = static_cast(dComIfG_getObjectRes(M_arcname, YKZYG_BTK_QKZYG)); + JUT_ASSERT(0xca, btk != NULL); + + s32 btkRet = field_0x2FC.init(model_data, btk, TRUE, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, false, FALSE); + J3DModelData * model_data_fire = static_cast(dComIfG_getObjectRes(M_arcname, YKZYG_BDL_YMNKZ00)); + JUT_ASSERT(0xe1, model_data_fire != NULL); + + field_0x310 = mDoExt_J3DModel__create(model_data_fire, 0x80000, 0x11000222); + J3DAnmTextureSRTKey * btk_f = static_cast(dComIfG_getObjectRes(M_arcname, YKZYG_BTK_YMNKZ00)); + JUT_ASSERT(0xec, btk_f != NULL); + + s32 btkFRet = field_0x314.init(model_data_fire, btk_f, TRUE, J3DFrameCtrl::EMode_LOOP, 1.0f, 0, -1, false, FALSE); + + J3DAnmTevRegKey * brk_f = static_cast(dComIfG_getObjectRes(M_arcname, YKZYG_BRK_YMNKZ00)); + JUT_ASSERT(0xf3, brk_f != NULL); + s32 brkRet = field_0x328.init(model_data_fire, brk_f, TRUE, J3DFrameCtrl::EMode_NONE, 1.0f, 0, -1, false, FALSE); + + field_0x4F4 = 1; + return field_0x2F8 != NULL && field_0x310 != NULL && btkRet != 0 && btkFRet != 0 && brkRet != 0; } /* 00000758-000009C8 .text Create__Q212daObjVolcano5Act_cFv */ BOOL daObjVolcano::Act_c::Create() { - /* Nonmatching */ + cullMtx = field_0x2F8->getBaseTRMtx(); + init_mtx(); + fopAcM_setCullSizeBox + (this, -1600.0f,-500.0f,-1800.0f,1700.0f,2500.0f,1900.0f); + field_0x340.Init(0xff, 0xff, this); + field_0x37C.Set(cyl_check_src); + field_0x4B8 = current.pos; + field_0x37C.SetC(field_0x4B8); + field_0x4EC = field_0x37C.GetH(); + field_0x4F0 = field_0x37C.GetR(); + field_0x37C.SetStts(&field_0x340); + + field_0x4C4 = current.pos; + field_0x4C4.y += 5000.0f; + field_0x4D0 = current.pos; + field_0x4D0.y += 5000.0f; + field_0x4DC = current.pos; + field_0x4DC.y += 2400.0f; + field_0x4AC.x = 2.0f; + field_0x4AC.y = 2.0f; + field_0x4AC.z = 2.0f; + + for (int i = 0; i < 10; i++) { + this->field_0x2C8[i] = NULL; + } + int switchIndex = prm_get_swSave(); + if (fopAcM_isSwitch(this, switchIndex)) { + field_0x4B8.y = home.pos.y - 2000.0f; + StopFire(); + field_0x4F8 = 0.0f; + if (dComIfGs_getStartPoint() == 2 +#if VERSION > VERSION_DEMO + && current.roomNo == dComIfGs_getRestartRoomNo() +#endif + ) { + field_0x500 = 6; + } else { + field_0x500 = 3; + } + } else { + field_0x4B8.y = home.pos.y + 2000.0f; + StartFire(); + field_0x4F8 = 1.0f; + field_0x500 = 0; + } + field_0x4FC = dComIfGp_evmng_getEventIdx("FREEZE_VOLCANO"); + field_0x4FE = dComIfGp_evmng_getEventIdx("FIRE_VOLCANO"); + return TRUE; } /* 000009C8-00000BA0 .text Mthd_Create__Q212daObjVolcano5Act_cFv */ cPhs_State daObjVolcano::Act_c::Mthd_Create() { - /* Nonmatching */ + fopAcM_SetupActor(this, daObjVolcano::Act_c); + cPhs_State phase_state = dComIfG_resLoad(&field_0x2F0, M_arcname); + if (phase_state == cPhs_COMPLEATE_e) { + phase_state = MoveBGCreate(M_arcname, 0x11, NULL, 0xaed0); + JUT_ASSERT(DEMO_SELECT(0x144, 0x143), (phase_state == cPhs_COMPLEATE_e) || (phase_state == cPhs_ERROR_e)); + } + return phase_state; } /* 00000E58-00000E60 .text Delete__Q212daObjVolcano5Act_cFv */ BOOL daObjVolcano::Act_c::Delete() { - /* Nonmatching */ + return TRUE; } /* 00000E60-00000EC0 .text Mthd_Delete__Q212daObjVolcano5Act_cFv */ BOOL daObjVolcano::Act_c::Mthd_Delete() { - /* Nonmatching */ + u32 result = MoveBGDelete(); + mDoAud_seDeleteObject(&field_0x4B8); + dComIfG_resDeleteDemo(&field_0x2F0, M_arcname); + return result; } /* 00000EC0-00000F84 .text set_mtx__Q212daObjVolcano5Act_cFv */ void daObjVolcano::Act_c::set_mtx() { - /* Nonmatching */ + mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z); + mDoMtx_stack_c::ZXYrotM(shape_angle); + field_0x2F8->setBaseTRMtx(mDoMtx_stack_c::get()); + cMtx_copy(mDoMtx_stack_c::get(), M_tmp_mtx); + mDoMtx_stack_c::transS(field_0x4B8.x, field_0x4B8.y, field_0x4B8.z); + mDoMtx_stack_c::ZXYrotM(shape_angle); + field_0x310->setBaseTRMtx(mDoMtx_stack_c::get()); } /* 00000F84-00000FDC .text init_mtx__Q212daObjVolcano5Act_cFv */ void daObjVolcano::Act_c::init_mtx() { - /* Nonmatching */ + field_0x2F8->setBaseScale(scale); + field_0x310->setBaseScale(scale); + set_mtx(); } /* 00000FDC-0000103C .text daObjVolcano_fire_demo_wait__Q212daObjVolcano5Act_cFv */ void daObjVolcano::Act_c::daObjVolcano_fire_demo_wait() { - /* Nonmatching */ + if (eventInfo.mCommand == dEvtCmd_INDEMO_e) { + StartFire(); + field_0x500 = 5; + } else { + fopAcM_orderOtherEventId(this, field_0x4FE); + } } /* 0000103C-00001160 .text daObjVolcano_fire_demo_main__Q212daObjVolcano5Act_cFv */ void daObjVolcano::Act_c::daObjVolcano_fire_demo_main() { - /* Nonmatching */ + mDoAud_seStart(JA_SE_OBJ_VOLCANO_ERUPTION, &field_0x4B8, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + mDoAud_seStart(JA_SE_ATM_VOLCANO_MAGMA, ¤t.pos, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + + if (field_0x4B8.y < current.pos.y + 2300.0f) { + field_0x4B8.y += 100.0f; + } + + if (dComIfGp_evmng_endCheck(field_0x4FE)) { + dComIfGp_event_reset(); + field_0x500 = 0; + } + field_0x314.play(); + cLib_chaseF(&field_0x4F8, 1.0f, 0.016666667f); } /* 00001160-00001284 .text daObjVolcano_fire_main__Q212daObjVolcano5Act_cFv */ void daObjVolcano::Act_c::daObjVolcano_fire_main() { - /* Nonmatching */ + mDoAud_seStart(JA_SE_OBJ_VOLCANO_ERUPTION, &field_0x4B8, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + mDoAud_seStart(JA_SE_ATM_VOLCANO_MAGMA, ¤t.pos, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + if (field_0x37C.ChkTgHit()) { + cCcD_Obj* tgObj = field_0x37C.GetTgHitObj(); + if (tgObj != NULL && tgObj->ChkAtType(AT_TYPE_ICE_ARROW)){ + fopAcM_orderOtherEventId(this, field_0x4FC); + field_0x500 = 1; + } + } + field_0x314.play(); + cLib_chaseF(&field_0x4F8, 1.0f, 0.016666667f); } /* 00001284-000013E4 .text daObjVolcano_freeze_demo_wait__Q212daObjVolcano5Act_cFv */ void daObjVolcano::Act_c::daObjVolcano_freeze_demo_wait() { - /* Nonmatching */ + if (eventInfo.mCommand == dEvtCmd_INDEMO_e) { + int switchIndex = prm_get_swSave(); + fopAcM_onSwitch(this, switchIndex); + field_0x4E8 = 0; + StopFire(); + dComIfGp_particle_set( + 0x8191, &this->field_0x4B8, + &this->current.angle, + &scale, 0xff, + NULL, -1, + NULL, NULL, + NULL); + dComIfGp_particle_set( + 0x8192, &this->field_0x4B8, + &this->current.angle, + &scale, 0xff, + NULL, -1, + NULL, NULL, + NULL); + dComIfGp_particle_set( + 0x8193, &this->field_0x4B8, + &this->current.angle, + &scale, 0xff, + NULL, -1, + NULL, NULL, + NULL); + field_0x500 = 2; + } else { + fopAcM_orderOtherEventId(this, field_0x4FC); + } } /* 000013E4-00001558 .text daObjVolcano_freeze_demo_main__Q212daObjVolcano5Act_cFv */ void daObjVolcano::Act_c::daObjVolcano_freeze_demo_main() { - /* Nonmatching */ + field_0x4E8++; + cLib_chaseF(&field_0x4F8, 0.0f, 0.016666667f); + if (field_0x4E8 == 10) { + mDoAud_seStart(JA_SE_OBJ_VOLCANO_CHILL, &field_0x4B8, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + } else if (field_0x4E8 == 0x96) { + mDoAud_seStart(JA_SE_OBJ_VOLCANO_ICE_BRK, &field_0x4B8, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + mDoAud_seStart(JA_SE_READ_RIDDLE_1); + field_0x4F4 = 0; + } else if (field_0x4E8 <= 0xa) { + field_0x314.play(); + } + field_0x328.play(); + if (dComIfGp_evmng_endCheck(field_0x4FC)) { + dComIfGp_event_reset(); + field_0x500 = 3; + } } /* 00001558-000015E8 .text daObjVolcano_freeze_main__Q212daObjVolcano5Act_cFv */ void daObjVolcano::Act_c::daObjVolcano_freeze_main() { - /* Nonmatching */ + int switchIndex = prm_get_swSave(); + if (!fopAcM_isSwitch(this, switchIndex)) { + fopAcM_orderOtherEventId(this, field_0x4FE); + field_0x4B8.y = home.pos.y - 2000.0f; + field_0x500 = 4; + } } /* 000015E8-0000164C .text daObjVolcano_fail_demo_wait__Q212daObjVolcano5Act_cFv */ void daObjVolcano::Act_c::daObjVolcano_fail_demo_wait() { - /* Nonmatching */ + int switchIndex = prm_get_swSave(); + if (!fopAcM_isSwitch(this, switchIndex)) { + StartFire(); + field_0x500 = 7; + } + } /* 0000164C-00001740 .text daObjVolcano_fail_demo_main__Q212daObjVolcano5Act_cFv */ void daObjVolcano::Act_c::daObjVolcano_fail_demo_main() { - /* Nonmatching */ + mDoAud_seStart(JA_SE_OBJ_VOLCANO_ERUPTION, &field_0x4B8, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + mDoAud_seStart(JA_SE_ATM_VOLCANO_MAGMA, ¤t.pos, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); + if (field_0x4B8.y < current.pos.y + 2300.0f) { + field_0x4B8.y += 100.0f; + } + field_0x314.play(); + cLib_chaseF(&field_0x4F8, 1.0f, 0.016666667f); } /* 00001740-0000199C .text Execute__Q212daObjVolcano5Act_cFPPA3_A4_f */ -BOOL daObjVolcano::Act_c::Execute(Mtx**) { - /* Nonmatching */ +BOOL daObjVolcano::Act_c::Execute(Mtx** o_mtx) { + field_0x37C.SetC(field_0x4B8); + field_0x37C.SetH(field_0x4EC); + field_0x37C.SetR(field_0x4F0); + dComIfG_Ccsp()->Set(&field_0x37C); + switch (field_0x500) { + case 0: + daObjVolcano_fire_main(); + break; + case 1: + daObjVolcano_freeze_demo_wait(); + break; + case 2: + daObjVolcano_freeze_demo_main(); + break; + case 3: + daObjVolcano_freeze_main(); + break; + case 4: + daObjVolcano_fire_demo_wait(); + break; + case 5: + daObjVolcano_fire_demo_main(); + break; + case 6: + daObjVolcano_fail_demo_wait(); + break; + case 7: + daObjVolcano_fail_demo_main(); + break; + default: + break; + } + field_0x2FC.play(); + u8 r1 = dKy_getEnvlight().mBG2_C0.r; + u8 g1 = dKy_getEnvlight().mBG2_C0.g; + u8 b1 = dKy_getEnvlight().mBG2_C0.b; + u8 r2 = dKy_getEnvlight().mBG2_K0.r; + u8 g2 = dKy_getEnvlight().mBG2_K0.g; + u8 b2 = dKy_getEnvlight().mBG2_K0.b; + if (field_0x2C8[3] != NULL) { + field_0x2C8[3]->setGlobalEnvColor(r1, g1, b1); + field_0x2C8[3]->setGlobalPrmColor(r2, g2, b2); + } + if (field_0x2C8[4] != NULL) { + field_0x2C8[4]->setGlobalEnvColor(r1, g1, b1); + field_0x2C8[4]->setGlobalPrmColor(r2, g2, b2); + } + if (field_0x2C8[5] != NULL) { + field_0x2C8[5]->setGlobalEnvColor(r1, g1, b1); + field_0x2C8[5]->setGlobalPrmColor(r2, g2, b2); + } + if (field_0x2C8[6] != NULL) { + field_0x2C8[6]->setGlobalEnvColor(r1, g1, b1); + field_0x2C8[6]->setGlobalPrmColor(r2, g2, b2); + } + if (field_0x2C8[7] != NULL) { + field_0x2C8[7]->setGlobalEnvColor(r1, g1, b1); + field_0x2C8[7]->setGlobalPrmColor(r2, g2, b2); + } + if (field_0x2C8[8] != NULL) { + field_0x2C8[8]->setGlobalEnvColor(r1, g1, b1); + field_0x2C8[8]->setGlobalPrmColor(r2, g2, b2); + } + if (field_0x2C8[9] != NULL) { + field_0x2C8[9]->setGlobalEnvColor(r1, g1, b1); + field_0x2C8[9]->setGlobalPrmColor(r2, g2, b2); + } + set_mtx(); + *o_mtx = &M_tmp_mtx; + return TRUE; } /* 0000199C-00001A2C .text set_material__Q212daObjVolcano5Act_cFP11J3DMaterialUc */ -void daObjVolcano::Act_c::set_material(J3DMaterial*, unsigned char) { - /* Nonmatching */ +void daObjVolcano::Act_c::set_material(J3DMaterial* i_material, unsigned char i_alpha) { + while (i_material != NULL) { + if (i_alpha == 0) { + i_material->getShape()->hide(); + } else { + i_material->getShape()->show(); + i_material->getTevKColor(3)->mColor.a = i_alpha; + } + i_material = i_material->getNext(); + } } /* 00001A2C-00001B8C .text Draw__Q212daObjVolcano5Act_cFv */ BOOL daObjVolcano::Act_c::Draw() { - /* Nonmatching */ + g_env_light.settingTevStruct(TEV_TYPE_BG1, ¤t.pos, &tevStr); + g_env_light.setLightTevColorType(field_0x2F8, &tevStr); + g_env_light.setLightTevColorType(field_0x310, &tevStr); + + field_0x2FC.entry(field_0x2F8->getModelData()); + dComIfGd_setListBG(); + u8 tmp = (s8)(field_0x4F8 * 255.5f); + J3DModelData* model_data = field_0x2F8->getModelData(); + set_material(model_data->getJointNodePointer(2)->getMesh(), tmp); + set_material(model_data->getJointNodePointer(1)->getMesh(), tmp); + + mDoExt_modelUpdateDL(field_0x2F8); + if (field_0x4F4 != 0) { + field_0x314.entry(field_0x310->getModelData()); + field_0x328.entry(field_0x310->getModelData()); + mDoExt_modelUpdateDL(field_0x310); + } + dComIfGd_setList(); + return TRUE; } namespace daObjVolcano {