/** * d_ky_thunder.cpp * Environment - Thunder */ #include "d/dolzel.h" // IWYU pragma: keep #include "d/d_ky_thunder.h" #include "JSystem/JKernel/JKRSolidHeap.h" #include "SSystem/SComponent/c_counter.h" #include "SSystem/SComponent/c_math.h" #include "d/d_com_inf_game.h" #include "d/d_kankyo_rain.h" #include "f_op/f_op_camera_mng.h" #include "f_op/f_op_kankyo_mng.h" #define EF_THUNDER01_BMD 0x1E #define EF_THUNDER02_BMD 0x1F #define EF_THUNDER_BRK 0x2F int dThunder_c::createHeap() { if (mpHeap == NULL) { mpHeap = mDoExt_createSolidHeapFromGameToCurrent(0, 0x20); if (mpHeap == NULL) { return 0; } } return 1; } void dThunder_c::adjustHeap() { mDoExt_restoreCurrentHeap(); if ((s32)mDoExt_adjustSolidHeap(mpHeap) >= 0) { DCStoreRangeNoSync(mpHeap->getStartAddr(), mpHeap->getHeapSize()); } } int dThunder_c::draw() { static cXyz l_offsetPos(0.0f, 40.0f, -250.0f); static cXyz l_scale(1.0f, 1.0f, 1.0f); camera_class* camera_p = dComIfGp_getCamera(0); mDoMtx_stack_c::transS(mThunderPos.x, mThunderPos.y, mThunderPos.z); mDoMtx_stack_c::YrotM(field_0x168); mDoMtx_stack_c::ZrotM(field_0x15c); mDoMtx_stack_c::XrotM(field_0x15c); Mtx m; MTXCopy(mDoMtx_stack_c::get(), m); mModelInfo.mpModel->setBaseScale(field_0x138); mModelInfo.mpModel->setBaseTRMtx(m); mModelInfo.mBrk.entry(mModelInfo.mpModel->getModelData()); dComIfGd_setList(); mDoExt_modelUpdateDL(mModelInfo.mpModel); mModelInfo.mBrk.remove(mModelInfo.mpModel->getModelData()); return 1; } static int dThunder_Draw(dThunder_c* i_this) { return i_this->draw(); } int dThunder_c::execute(dThunder_c* i_thunder) { dScnKy_env_light_c* env_light = dKy_getEnvlight(); if (env_light->mThunderEff.mState < 10) { cLib_addCalc(&mBrkSpeed, 0.1f, 0.05f, 0.017f, 9.999999747378752e-06f); } mModelInfo.mBrk.setPlaySpeed(mBrkSpeed); if (mModelInfo.mBrk.play()) { mDoAud_mEnvSe_startFarThunderSe(&mThunderPos); fopKyM_Delete(i_thunder); } f32 fvar7; if (dComIfGd_getView() != NULL) { fvar7 = dComIfGd_getView()->fovy / 60.0f; if (fvar7 >= 1.0f) { fvar7 = 1.0f; } fvar7 = fvar7 * fvar7 * fvar7; } else { fvar7 = 1.0f; } fvar7 *= mBrkSpeed; if (env_light->mThunderEff.mState < 10) { field_0x138.x += fvar7 * field_0x138.x * 0.01f * cM_ssin(field_0x16a); field_0x138.y += fvar7 * field_0x138.y * 0.01f * cM_scos(field_0x16c); field_0x16a += -25000; field_0x16c += 28900; } else { field_0x138.x += fvar7 * field_0x138.x * 0.02f * cM_ssin(field_0x16a); field_0x138.y += fvar7 * field_0x138.y * 0.02f * cM_scos(field_0x16c); field_0x16a += -35000; field_0x16c += 38900; } return 1; } static int dThunder_Execute(dThunder_c* i_this) { return i_this->execute(i_this); } static int dThunder_IsDelete(dThunder_c* i_this) { return 1; } int dThunder_c::thunder_delete(dThunder_c* i_thunder) { i_thunder->~dThunder_c(); return 1; } static int dThunder_Delete(dThunder_c* i_this) { return i_this->thunder_delete(i_this); } static int dThunder_Create(kankyo_class* i_this) { dThunder_c* this_ = (dThunder_c*)i_this; if (!this_->createHeap()) { return cPhs_ERROR_e; } int ret = this_->create(); this_->adjustHeap(); return ret; } int dThunder_c::create() { dScnKy_env_light_c* env_light = dKy_getEnvlight(); camera_class* camera_p = dComIfGp_getCamera(0); cXyz spB8; cXyz spC4; cXyz spD0; f32 var_f31; f32 var_f30; f32 var_f29; f32 var_f29_2; f32 var_r28; f32 var_r27; new (this) dThunder_c(); J3DModelData* modelData; if (cM_rndF(1.0f) < 0.5f) { modelData = (J3DModelData*)dComIfG_getObjectRes("Always", EF_THUNDER01_BMD); } else { modelData = (J3DModelData*)dComIfG_getObjectRes("Always", EF_THUNDER02_BMD); } mModelInfo.mpModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x1000000); if (mModelInfo.mpModel == NULL) { return cPhs_ERROR_e; } J3DAnmTevRegKey* canm = (J3DAnmTevRegKey*)dComIfG_getObjectRes("Always", EF_THUNDER_BRK); if (!mModelInfo.mBrk.init(modelData, canm, TRUE, 0, 1.0f, 0, -1)) { return cPhs_ERROR_e; } mBrkSpeed = 1.0f; mModelInfo.mBrk.setPlaySpeed(mBrkSpeed); if (env_light->mThunderEff.mState < 10) { var_f29 = 1.0f; } else { var_f29 = 0.25f; } field_0x168 = cLib_targetAngleY(&camera_p->lookat.eye, &camera_p->lookat.center); if (!(g_Counter.mCounter0 & 1)) { field_0x168 += 0x7FFF; } var_r28 = 14.0f; var_r27 = 20.0f; var_f31 = var_r28; var_f30 = var_r27; spC4.set(60000.0f, -5000.0f, 0.0f); field_0x15c = 2000.0f; if (env_light->mThunderEff.mState >= 10) { var_f31 = var_r27; var_f30 = 24.0f; field_0x15c = 2500.0f; spC4.y = 6000.0f; } if (!strcmp(dComIfGp_getStartStageName(), "R_SP30") && dComIfGp_roomControl_getStayNo() == 4) { var_r28 = 0.1f; var_r27 = 0.25f; var_f31 = 0.15f; var_f30 = 0.2f; } field_0x15c = var_f29 * cM_rndFX(field_0x15c); field_0x138.x = var_f29 * (var_r28 + cM_rndF(var_r27 - var_r28)); if (cM_rndFX(1.0f) >= 0.5) { field_0x138.x *= -1.0f; } field_0x138.y = var_f29 * (var_f31 + cM_rndF(var_f30 - var_f31)); field_0x138.z = 1.0f; dKyr_get_vectle_calc(&camera_p->lookat.eye, &camera_p->lookat.center, &spB8); // JMAFastSqrt doesn't match here when it should, probably needs to be fixed // var_f29_2 = JMAFastSqrt(spB8.x * spB8.x + spB8.z * spB8.z); var_f29_2 = spB8.x * spB8.x + spB8.z * spB8.z; if (var_f29_2 > 0.0f) { // fakematch? #ifdef __MWERKS__ f32 tmp = __frsqrtes(var_f29_2); var_f29_2 = tmp * var_f29_2; #endif } s16 temp_r28 = cM_atan2s(spB8.x, spB8.z); s16 temp_r31 = cM_atan2s(spB8.y, var_f29_2); if (cM_rndFX(1.0f) >= 0.0f) { temp_r28 += 0x4000; } else { temp_r28 -= 0x4000; } spD0.x = cM_scos(temp_r31) * cM_ssin(temp_r28); spD0.z = cM_scos(temp_r31) * cM_scos(temp_r28); f32 temp_f1_3 = cM_rndF(spC4.x); mThunderPos.x = camera_p->lookat.eye.x + (spB8.x * 100000.0f) + (spD0.x * temp_f1_3); mThunderPos.y = camera_p->lookat.eye.y + 2000.0f + cM_rndF(spC4.y); mThunderPos.z = camera_p->lookat.eye.z + (spB8.z * 100000.0f) + (spD0.z * temp_f1_3); if (!strcmp(dComIfGp_getStartStageName(), "R_SP30") && dComIfGp_roomControl_getStayNo() == 4) { mThunderPos.x = cM_rndFX(260.0f) + 19635.0f; mThunderPos.y = 4592.0f; mThunderPos.z = cM_rndFX(100.0f) + 1507.0f; } if (cM_rndF(1.0f) < 0.3f) { field_0x150.x = -mThunderPos.x; field_0x150.y = -mThunderPos.y; field_0x150.z = -mThunderPos.z; mDoAud_mEnvSe_startFarThunderSe(&field_0x150); } return cPhs_COMPLEATE_e; } static leafdraw_method_class l_dThunder_Method = { (process_method_func)dThunder_Create, (process_method_func)dThunder_Delete, (process_method_func)dThunder_Execute, (process_method_func)dThunder_IsDelete, (process_method_func)dThunder_Draw, }; extern kankyo_process_profile_definition g_profile_KY_THUNDER = { fpcLy_CURRENT_e, 7, fpcPi_CURRENT_e, PROC_KY_THUNDER, &g_fpcLf_Method.base, sizeof(dThunder_c), 0, 0, &g_fopKy_Method, 6, &l_dThunder_Method, };