/** * d_a_obj_ajav.cpp * Object - Stone wall blocking the entrance to Jabun's cave */ #include "d/dolzel_rel.h" // IWYU pragma: keep #include "d/actor/d_a_obj_ajav.h" #include "res/Object/Ajav.h" static cXyz l_daObjAjav_co_offset[3] = { cXyz(0.0f, 2550.0f, 200.0f), cXyz(250.0f, 1270.0f, 200.0f), cXyz(-290.0f, 740.0f, 200.0f) }; static cXyz l_daObjAjav_offset[6] = { cXyz(0.0f, 3000.0f, 0.0f), cXyz(500.0f, 2400.0f, 0.0f), cXyz(-300.0f, 1900.0f, 0.0f), cXyz(500.0f, 1400.0f, 0.0f), cXyz(-550.0f, 650.0f, 0.0f), cXyz(250.0f, 400.0f, 0.0f) }; static cXyz l_daObjAjav_cyl_offset[6] = { cXyz(33.0f, 2541.0f, 220.0f), cXyz(465.0f, 2083.0f, 220.0f), cXyz(-137.7f, 1297.0f, 220.0f), cXyz(530.0f, 511.0f, 220.0f), cXyz(-124.5f, 118.0f, 220.0f), cXyz(530.0f, 118.0f, 220.0f) }; static cXyz l_daObjAjav_rock_pos_table[6] = { cXyz(-170.0f, 3087.0f, 222.0f), cXyz(563.0f, 2384.0f, 222.0f), cXyz(-371.0f, 1880.0f, 222.0f), cXyz(615.0f, 1391.0f, 222.0f), cXyz(-494.0f, 748.0f, 222.0f), cXyz(249.0f, 535.0f, 222.0f) }; static dCcD_SrcSph l_daObjAjav_sph_data = { // dCcD_SrcGObjInf { /* Flags */ 0, /* SrcObjAt Type */ 0, /* SrcObjAt Atp */ 0, /* SrcObjAt SPrm */ 0, /* SrcObjTg Type */ AT_TYPE_BOMB, /* SrcObjTg SPrm */ dCcG_TgSPrm_Shield_e | dCcG_TgSPrm_NoConHit_e | dCcG_TgSPrm_NoHitMark_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 */ dCcG_TgSPrm_NoHitMark_e, /* SrcGObjCo SPrm */ 0, }, // cM3dGSphS {{ /* Center */ {0.0f, 0.0f, 0.0f}, /* Radius */ 280.0f, }}, }; static dCcD_SrcCyl l_daObjAjav_cyl_data = { // dCcD_SrcGObjInf { /* Flags */ 0, /* SrcObjAt Type */ 0, /* SrcObjAt Atp */ 0, /* SrcObjAt SPrm */ 0, /* SrcObjTg Type */ AT_TYPE_BOMB, /* 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 */ dCcG_TgSPrm_NoHitMark_e | dCcG_TgSPrm_NoConHit_e, /* SrcGObjCo SPrm */ 0 }, // cM3dGCylS {{ /* Center */ {0.0f, -40.0f, 0.0f}, /* Radius */ 780.0f, /* Height */ 3300.0f, }}, }; static dCcD_SrcCyl l_daObjAjav_hint_cyl_data = { // dCcD_SrcGObjInf { /* Flags */ 0, /* SrcObjAt Type */ 0, /* SrcObjAt Atp */ 0, /* SrcObjAt SPrm */ 0, /* SrcObjTg Type */ AT_TYPE_BOMB, /* 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 */ dCcG_TgSPrm_NoHitMark_e | dCcG_TgSPrm_NoConHit_e, /* SrcGObjCo SPrm */ 0 }, // cM3dGCylS {{ /* Center */ {0.0f, -40.0f, 0.0f}, /* Radius */ 780.0f, /* Height */ 3300.0f, }}, }; static f32 l_daObjAjav_hint_cyl_h_talbe[] = {3300.0f, 2360.0f, 1050.0f}; static f32 l_daObjAjav_cyl_r[6] = { 629.0f, 294.8f, 491.0f, 216.0f, 563.0f, 85.3f }; static f32 l_daObjAjav_cyl_h[6] = { 773.0f, 458.5f, 1100.5f, 1401.9f, 1133.0f, 451.9 }; static const s32 l_daObjAjav_idx_table[6] = { dRes_INDEX_AJAV_BDL_AJAVA_e, dRes_INDEX_AJAV_BDL_AJAVB_e, dRes_INDEX_AJAV_BDL_AJAVC_e, dRes_INDEX_AJAV_BDL_AJAVD_e, dRes_INDEX_AJAV_BDL_AJAVE_e, dRes_INDEX_AJAV_BDL_AJAVF_e }; static const char* const l_daObjAjav_ev_name[] = { "ajav_destroy0", "ajav_destroy1", "ajav_uzu" }; /* 000000EC-00000170 .text daObjAjav_make_splash__9daObjAjavF4cXyzf */ void daObjAjav::daObjAjav_make_splash(cXyz i_splashPos, f32 i_scale) { cXyz scale; i_scale /= 2000.0f; i_scale = 4.0f + i_scale; scale.x = i_scale; scale.y = 4.0f; scale.z = scale.x; dComIfGp_particle_set(dPa_name::ID_IT_JN_MIZUSHIBUKI_A, &i_splashPos, NULL, &scale); } /* 000001AC-00000268 .text make_hamon__Q29daObjAjav6Part_cF4cXyzf */ void daObjAjav::Part_c::make_hamon(cXyz i_hamonPos, f32 i_scale) { cXyz scale; i_scale /= 2000.0f; scale.x = 2.0f + i_scale; scale.y = scale.x; scale.z = scale.x; i_hamonPos.y += 10.0f; f32 water_height; if (fopAcM_getWaterY(&i_hamonPos, &water_height) == TRUE) { i_hamonPos.y = water_height; } dComIfGp_particle_set(dPa_name::ID_IT_JN_WP_HAMON03, &i_hamonPos, NULL, &scale); } /* 00000268-0000026C .text no_proc__Q29daObjAjav6Part_cFPQ29daObjAjav5Act_c */ void daObjAjav::Part_c::no_proc(daObjAjav::Act_c*) { return; } /* 0000026C-000003A8 .text init_data__Q29daObjAjav6Part_cF4cXyz4cXyzP12dKy_tevstr_cP4cXyz */ void daObjAjav::Part_c::init_data(cXyz i_actorPos, cXyz i_rockOffset, dKy_tevstr_c* i_tevStr, cXyz* i_rockPos) { mCenterPos = i_rockOffset; mCenterToOriginTrans = cXyz::Zero - mCenterPos; mAccumulatedRotation = csXyz::Zero; mRockDisplacement = cXyz::Zero; mRockDisplacementRate = cXyz::Zero; mpTevStr = i_tevStr; mRockParticlePos = *i_rockPos + i_actorPos; mExeProc = &Part_c::no_proc; mDrawProc = &Part_c::draw_normal; } /* 000003A8-00000464 .text set_mdl_area__Q29daObjAjav6Part_cFPCciUl */ BOOL daObjAjav::Part_c::set_mdl_area(const char* i_arcName, int i_index, u32 i_differedDlistFlag) { J3DModelData* mdl_data; BOOL res = FALSE; mdl_data = (J3DModelData*) dComIfG_getObjectRes(i_arcName, i_index); JUT_ASSERT(600, mdl_data != NULL); if (mdl_data != NULL) { mpModel = mDoExt_J3DModel__create(mdl_data, 0x80000, i_differedDlistFlag); res = TRUE; } return res; } /* 00000464-0000050C .text init_mtx__Q29daObjAjav6Part_cF4cXyz5csXyz4cXyz */ void daObjAjav::Part_c::init_mtx(cXyz i_pos, csXyz i_angle, cXyz i_scale) { mpModel->setBaseScale(i_scale); mDoMtx_stack_c::transS(i_pos); mDoMtx_stack_c::ZXYrotM(i_angle); mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); mpModel->calc(); } /* 0000050C-000005A8 .text set_flaw_mtx__Q29daObjAjav6Part_cF4cXyz5csXyz */ void daObjAjav::Part_c::set_flaw_mtx(cXyz i_pos, csXyz i_angle) { mDoMtx_stack_c::transS(i_pos); mDoMtx_stack_c::ZXYrotM(i_angle); mDoMtx_stack_c::transM(mRockDisplacement); mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); mpModel->calc(); } /* 000005A8-0000067C .text set_fall_mtx__Q29daObjAjav6Part_cF4cXyz5csXyz */ void daObjAjav::Part_c::set_fall_mtx(cXyz i_pos, csXyz i_angle) { mDoMtx_stack_c::transS(i_pos); mDoMtx_stack_c::ZXYrotM(i_angle); mDoMtx_stack_c::transM(mRockDisplacement); mDoMtx_stack_c::transM(mCenterPos); mDoMtx_stack_c::ZXYrotM(mAccumulatedRotation); mDoMtx_stack_c::transM(mCenterToOriginTrans); mpModel->setBaseTRMtx(mDoMtx_stack_c::get()); mpModel->calc(); } /* 0000067C-000006E4 .text fall_init__Q29daObjAjav6Part_cF4cXyz5csXyzsUs */ void daObjAjav::Part_c::fall_init(cXyz i_initDispRate, csXyz i_initRotSpeed, s16 i_angleLimit, u16 i_timerTrigger) { mRockDisplacementRate = i_initDispRate; mRotationSpeed = i_initRotSpeed; mAngleLimit = i_angleLimit; mTimerTrigger = i_timerTrigger; mTimer = 0; mbHasSplashed = 0; setExeProc(&Part_c::fall_0); } /* 000006E4-0000076C .text check_angle__9daObjAjavFPss */ BOOL daObjAjav::check_angle(s16* i_anglePtr, s16 i_angleLimit) { BOOL rt = FALSE; if (abs(*i_anglePtr) >= i_angleLimit) { s16 temp = abs(*i_anglePtr) - i_angleLimit; if (*i_anglePtr > 0) { *i_anglePtr = i_angleLimit - temp; } else { *i_anglePtr = -(i_angleLimit - temp); } rt = TRUE; } return rt; } /* 0000076C-0000095C .text fall_0__Q29daObjAjav6Part_cFPQ29daObjAjav5Act_c */ void daObjAjav::Part_c::fall_0(daObjAjav::Act_c* i_actor) { cXyz temp(0.0f, -10.0f, 0.0f); mAccumulatedRotation += mRotationSpeed; if (check_angle(&mAccumulatedRotation.x, mAngleLimit)) { mRotationSpeed.x *= -1; } if (check_angle(&mAccumulatedRotation.y, mAngleLimit)) { mRotationSpeed.y *= -1; } mRockDisplacement += mRockDisplacementRate; mRockDisplacementRate.z *= 0.8f + (0.2f * cM_rnd()); mTimer++; if (mTimer == mTimerTrigger) { temp = mRockDisplacementRate * 0.4f; temp.y = 5.0f; mRockDisplacementRate = temp; setExeProc(&Part_c::fall_1); mTimer = 0; mRotationSpeed = csXyz(mRotationSpeed * 0.3f); mRotationSpeed.z = static_cast(cM_rnd() * -2.0f) * s16(cM_rnd() * 511.0f); } set_fall_mtx(i_actor->current.pos, i_actor->shape_angle); } /* 0000095C-00000B8C .text fall_1__Q29daObjAjav6Part_cFPQ29daObjAjav5Act_c */ void daObjAjav::Part_c::fall_1(daObjAjav::Act_c* i_actor) { mRockDisplacement += mRockDisplacementRate; mRockDisplacement.y -= mTimer * 2.0f; mAccumulatedRotation += mRotationSpeed; mTimer++; if (!mbHasSplashed) { if (mRockDisplacement.y <= (mCenterToOriginTrans.y - 100.0f)) { cXyz splash_pos = (i_actor->current.pos + mRockDisplacement) + mCenterPos; splash_pos.y = 0.0f; daObjAjav_make_splash(splash_pos, mCenterPos.y); mbHasSplashed = true; make_hamon(splash_pos, mCenterPos.y); mSePos = splash_pos; mDoAud_seStart(JA_SE_OBJ_JB_STONE_FALL, &mSePos, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(i_actor))); } } if (mRockDisplacement.y <= (mCenterToOriginTrans.y - 1000.0f)) { setExeProc(&Part_c::no_proc); setDrawProc(&Part_c::no_proc); } set_fall_mtx(i_actor->current.pos, i_actor->shape_angle); } /* 00000B8C-00000C28 .text flaw__Q29daObjAjav6Part_cFPQ29daObjAjav5Act_c */ void daObjAjav::Part_c::flaw(daObjAjav::Act_c* i_actor) { mRockDisplacement += mFlawPos; set_flaw_mtx(i_actor->current.pos, i_actor->shape_angle); mExeProc = &Part_c::no_proc; } /* 00000C28-00000C6C .text draw_normal__Q29daObjAjav6Part_cFPQ29daObjAjav5Act_c */ void daObjAjav::Part_c::draw_normal(daObjAjav::Act_c*) { g_env_light.setLightTevColorType(mpModel, mpTevStr); mDoExt_modelUpdateDL(mpModel); } /* 00000C6C-00000EA8 .text draw_flashing__Q29daObjAjav6Part_cFPQ29daObjAjav5Act_c */ void daObjAjav::Part_c::draw_flashing(daObjAjav::Act_c*) { u8 r, g, b; if (mpTevStr) { g_env_light.setLightTevColorType(mpModel, mpTevStr); J3DMaterial* mesh = mpModel->getModelData()->getJointNodePointer(0)->getMesh(); if (mesh) { s16 theta = (s16)(((f32)mTimer / mTimerTrigger) * 20479.0f) + 0x3000; f32 abs_sin_theta = std::abs(JMASSin(theta)); r = mesh->getTevKColor(1)->mColor.r; g = mesh->getTevKColor(1)->mColor.g; b = mesh->getTevKColor(1)->mColor.b; mesh->getTevKColor(1)->mColor.r = abs_sin_theta * 85.0f; mesh->getTevKColor(1)->mColor.g = abs_sin_theta * 11.0f; mesh->getTevKColor(1)->mColor.b = abs_sin_theta * 9.0f; } mDoExt_modelUpdateDL(mpModel); if (mesh) { mesh->getTevKColor(1)->mColor.r = r; mesh->getTevKColor(1)->mColor.g = g; mesh->getTevKColor(1)->mColor.b = b; } } } // Unused member function void daObjAjav::Part_c::draw_flashing_shy(daObjAjav::Act_c*) { (void)&daObjAjav::Part_c::draw_shy; } /* 00000EA8-00000F10 .text draw_flashing_normal__Q29daObjAjav6Part_cFPQ29daObjAjav5Act_c */ void daObjAjav::Part_c::draw_flashing_normal(daObjAjav::Act_c* i_actor) { draw_flashing(i_actor); mTimer++; if (mTimer == mTimerTrigger) { setDrawProc(&Part_c::draw_normal); } } /* 00000F10-00001090 .text draw_shy__Q29daObjAjav6Part_cFPQ29daObjAjav5Act_c */ void daObjAjav::Part_c::draw_shy(daObjAjav::Act_c*) { u8 r, g, b; if (mpTevStr) { g_env_light.setLightTevColorType(mpModel, mpTevStr); J3DMaterial* mesh = mpModel->getModelData()->getJointNodePointer(0)->getMesh(); if (mesh) { r = mesh->getTevKColor(1)->mColor.r; g = mesh->getTevKColor(1)->mColor.g; b = mesh->getTevKColor(1)->mColor.b; mesh->getTevKColor(1)->mColor.r = 0x55; mesh->getTevKColor(1)->mColor.g = 0x0B; mesh->getTevKColor(1)->mColor.b = 0x09; } mDoExt_modelUpdateDL(mpModel); if (mesh) { mesh->getTevKColor(1)->mColor.r = r; mesh->getTevKColor(1)->mColor.g = g; mesh->getTevKColor(1)->mColor.b = b; } } } /* 00001090-00001168 .text make_fall_rock__Q29daObjAjav6Part_cFi */ void daObjAjav::Part_c::make_fall_rock(BOOL i_increasedRate) { JPABaseEmitter* particle_emitter = dComIfGp_particle_set(dPa_name::ID_AK_SN_JBROCKGATE01, &mRockParticlePos); if (particle_emitter && mpTevStr) { if (i_increasedRate != FALSE) { particle_emitter->setRate(20.0f); } g_env_light.settingTevStruct(TEV_TYPE_BG0, &mRockParticlePos, mpTevStr); particle_emitter->setGlobalPrmColor(mpTevStr->mColorK0.r, mpTevStr->mColorK0.g, mpTevStr->mColorK0.b); } } const char daObjAjav::Act_c::M_arcname[] = "Ajav"; /* 00001168-00001188 .text solidHeapCB__Q29daObjAjav5Act_cFP10fopAc_ac_c */ BOOL daObjAjav::Act_c::solidHeapCB(fopAc_ac_c* i_this) { return ((daObjAjav::Act_c*)i_this)->create_heap(); } /* 00001188-00001288 .text create_heap__Q29daObjAjav5Act_cFv */ BOOL daObjAjav::Act_c::create_heap() { int i; BOOL res = mRockParts[0].set_mdl_area(M_arcname, l_daObjAjav_idx_table[0], 0x11000002); if (res != FALSE) { for (i = 1; i < ARRAY_SSIZE(mRockParts); i++) { res = mRockParts[i].set_mdl_area(M_arcname, l_daObjAjav_idx_table[i], 0x15021202); if (res == FALSE) break; } } if (res != FALSE) { cBgD_t* cbgd_res = (cBgD_t*)dComIfG_getObjectRes(M_arcname, dRes_INDEX_AJAV_DZB_AJAV_e); mpBgW = dBgW_NewSet(cbgd_res, cBgW::MOVE_BG_e, &mMtx); if (mpBgW == NULL) { res = FALSE; } } return res; } /* 00001288-0000166C .text _create__Q29daObjAjav5Act_cFv */ cPhs_State daObjAjav::Act_c::_create() { cPhs_State rt = cPhs_ERROR_e; fopAcM_ct(this, daObjAjav::Act_c); mSwNo = fopAcM_GetParam(this) & 0xFF; mbResLoaded = false; if (check_ev() && !check_sw(mSwNo)) { rt = dComIfG_resLoad(&mPhs, M_arcname); if (rt == cPhs_COMPLEATE_e) { if (fopAcM_entrySolidHeap(this, Act_c::solidHeapCB, 0)) { int i; for (i = 0; i < ARRAY_SSIZE(mRockParts); i++) { mRockParts[i].init_data(current.pos, l_daObjAjav_offset[i], &tevStr, &l_daObjAjav_rock_pos_table[i]); } init_mtx(); MTXCopy(mRockParts[5].mpModel->getBaseTRMtx(), mMtx); set_tex(); mSphStts.Init(0, 0xFF, this); mSph.SetStts(&mSphStts); mSph.Set(l_daObjAjav_sph_data); mCylStts.Init(0, 0xFF, this); mCyl.SetStts(&mCylStts); mCyl.Set(l_daObjAjav_cyl_data); mCyl.SetC(current.pos); for (i = 0; i < ARRAY_SSIZE(mHintCylStts); i++) { mHintCylStts[i].Init(0, 0xFF, this); mHintCyls[i].SetStts(&mHintCylStts[i]); mHintCyls[i].Set(l_daObjAjav_hint_cyl_data); } set_co_offset(); dComIfG_Bgsp()->Regist(mpBgW, this); mbResLoaded = true; mActionIdx = 0; mHintCylHits = 0; } else { rt = cPhs_ERROR_e; } } } return rt; } /* 00001B3C-00001C08 .text _delete__Q29daObjAjav5Act_cFv */ bool daObjAjav::Act_c::_delete() { if (DEMO_SELECT(true, heap != NULL) && mpBgW != NULL) { if (mpBgW->ChkUsed()) { dComIfG_Bgsp()->Release(mpBgW); #if VERSION > VERSION_DEMO mpBgW = NULL; #endif } } if (DEMO_SELECT(mbResLoaded == 1, true)) { dComIfG_resDelete(&mPhs, M_arcname); } for (int i = 0; i < ARRAY_SSIZE(mRockParts); i++) { mDoAud_seDeleteObject(&mRockParts[i].mSePos); } return TRUE; } /* 00001C08-00001CA8 .text init_mtx__Q29daObjAjav5Act_cFv */ void daObjAjav::Act_c::init_mtx() { for (int i = 0; i < ARRAY_SSIZE(mRockParts); i++) { mRockParts[i].init_mtx(current.pos, shape_angle, scale); } } /* 00001CA8-00001CE4 .text set_tex__Q29daObjAjav5Act_cFv */ void daObjAjav::Act_c::set_tex() { J3DModelData* model_data = mRockParts[0].mpModel->getModelData(); J3DTexture* model_texture = model_data->getTexture(); JUTNameTab* name_table = model_data->getTextureName(); for (int i = 1; i < ARRAY_SSIZE(mRockParts); i++) { J3DModelData* model_data_i = mRockParts[i].mpModel->getModelData(); model_data_i->setTexture(model_texture); model_data_i->setTextureName(name_table); } } /* 00001CE4-00001E3C .text set_co_offset__Q29daObjAjav5Act_cFv */ void daObjAjav::Act_c::set_co_offset() { s32 i, j; JUT_ASSERT(DEMO_SELECT(1173, 1172), (M_status >= 0) && (M_status < STATUS_MAX - 1)); mSphCoOffset = l_daObjAjav_co_offset[M_status]; mSph.SetC(current.pos + mSphCoOffset); mCyl.SetH(l_daObjAjav_hint_cyl_h_talbe[M_status]); for (i = get_rock_row(), j = 0; j < ARRAY_SSIZE(mHintCyls); i++, j++) { mHintCyls[j].SetC(current.pos + l_daObjAjav_cyl_offset[i]); mHintCyls[j].SetR(l_daObjAjav_cyl_r[i]); mHintCyls[j].SetH(l_daObjAjav_cyl_h[i]); } } /* 00001E3C-00001EA0 .text daObjAjav_limit_angle__9daObjAjavFPss */ void daObjAjav::daObjAjav_limit_angle(s16* i_anglePtr, s16 i_angleLimit) { if (abs(*i_anglePtr) > i_angleLimit) { if (*i_anglePtr > 0) { *i_anglePtr = i_angleLimit; } else { *i_anglePtr = -i_angleLimit; } } } /* 00001EA0-00001F54 .text daObjAjav_get_rot_speed__9daObjAjavF4cXyz4cXyzs */ csXyz daObjAjav::daObjAjav_get_rot_speed(cXyz i_param1, cXyz i_param2, s16 i_angleLimit) { cXyz diff = i_param1 - i_param2; csXyz o_rot_speed = csXyz::Zero; o_rot_speed.x = diff.y; o_rot_speed.y = diff.x; daObjAjav_limit_angle(&o_rot_speed.x, i_angleLimit); daObjAjav_limit_angle(&o_rot_speed.y, i_angleLimit); return o_rot_speed; } /* 00001F54-00001FE4 .text check_all_wait__Q29daObjAjav5Act_cFv */ BOOL daObjAjav::Act_c::check_all_wait() { int i; BOOL res = TRUE; for (i = 0; i < ARRAY_SSIZE(mRockParts); i++) { if (!mRockParts[i].checkExeProc(&Part_c::no_proc)) { res = FALSE; break; } } return res; } /* 00001FE4-0000201C .text check_end__Q29daObjAjav5Act_cFv */ BOOL daObjAjav::Act_c::check_end() { BOOL rt = FALSE; if (M_status == (STATUS_MAX - 1)) { rt = check_all_wait(); } return rt; } /* 0000201C-000020B0 .text to_broken__Q29daObjAjav5Act_cFv */ void daObjAjav::Act_c::to_broken() { mEventIdx = dComIfGp_evmng_getEventIdx(l_daObjAjav_ev_name[M_status]); mActionIdx = 1; if (!eventInfo.checkCommandDemoAccrpt()) { fopAcM_orderOtherEventId(this, mEventIdx); eventInfo.onCondition(dEvtCnd_UNK2_e); } } /* 000020B0-00002124 .text damage_part__Q29daObjAjav5Act_cFv */ BOOL daObjAjav::Act_c::damage_part() { BOOL rt = FALSE; if (M_status < STATUS_MAX - 1 && mSph.ChkTgHit()) { to_broken(); mSph.ClrTgHit(); rt = TRUE; } return rt; } /* 00002124-000021EC .text make_shot_rock__Q29daObjAjav5Act_cFv */ void daObjAjav::Act_c::make_shot_rock() { cXyz sph_center = mSph.GetC(); JPABaseEmitter* emitter = dComIfGp_particle_set(dPa_name::ID_AK_SN_JBROCKGATE00, &sph_center); if (emitter) { g_env_light.settingTevStruct(TEV_TYPE_BG0, &sph_center, &tevStr); emitter->setGlobalPrmColor( tevStr.mColorK0.r, tevStr.mColorK0.g, tevStr.mColorK0.b ); } } /* 000021EC-000022F0 .text make_hamon2__Q29daObjAjav5Act_cF4cXyzf */ void daObjAjav::Act_c::make_hamon2(cXyz i_hamonPos, f32 i_scale) { cXyz scale; i_scale /= 3000.0f; scale.x = 1.0f + i_scale; scale.y = scale.x; scale.z = scale.x; i_hamonPos.y += 10.0f; f32 water_height; if (fopAcM_getWaterY(&i_hamonPos, &water_height) == TRUE) { i_hamonPos.y = water_height; } JPABaseEmitter* emitter = dComIfGp_particle_set(dPa_name::ID_AK_SN_JBROCKGATEHAMON00, &i_hamonPos, NULL, &scale); if (emitter) { g_env_light.settingTevStruct(TEV_TYPE_BG1, ¤t.pos, &tevStr); emitter->setGlobalPrmColor( tevStr.mColorC0.r, tevStr.mColorC0.g, tevStr.mColorC0.b ); } } /* 000022F0-000024A4 .text set_hamon__Q29daObjAjav5Act_cFf */ void daObjAjav::Act_c::set_hamon(f32 i_scale) { cXyz current_pos; cXyz base_z; cXyz base_x; cXyz temp_base_x; mDoMtx_stack_c::YrotS(current.angle.y); mDoMtx_stack_c::multVec(&cXyz::BaseZ, &base_z); base_z *= 1300.0f; mDoMtx_stack_c::YrotS(current.angle.y); mDoMtx_stack_c::multVec(&cXyz::BaseX, &base_x); for (int i = 0; i < 2; i++) { current_pos = current.pos; temp_base_x = base_x; temp_base_x *= (i * -2.0f + 1.0f) * 400.0f; current_pos += base_z; current_pos += temp_base_x; make_hamon2(current_pos, i_scale); } } /* 000024A4-00002CF4 .text _execute__Q29daObjAjav5Act_cFv */ bool daObjAjav::Act_c::_execute() { static cXyz flaw_pos[] = { cXyz(0.0f, 0.0f, 0.0f), cXyz(0.0f, 0.0f, 0.0f), cXyz(0.0f, 40.0f, 0.0f), cXyz(30.0f, 30.0f, 0.0f), cXyz(-20.0f, 0.0f, 0.0f), cXyz(20.0f, 0.0f, 0.0f) }; cXyz init_disp_rate(12.0f, -10.0f, 55.0f); bool stone_broken = false; // this bool is checked for falsehood once, set to true and then never read from again bool useless_bool = false; csXyz rotation_speed; int i, cond; for (i = 0; i < ARRAY_SSIZE(mRockParts); i++) { mRockParts[i].set_se_pos(current.pos); } switch (mActionIdx) { case 0: if (!damage_part()) { for (i = 0; i < 2; i++) { mHintCylStts[i].Move(); if (mHintCyls[i].ChkTgHit()) { if (!useless_bool) { mHintCylHits++; if (mHintCylHits >= STATUS_MAX - 1) { to_broken(); mHintCylHits = 0; stone_broken = true; } useless_bool = true; } mHintCyls[i].ClrTgHit(); } } if (stone_broken != true) { mCylStts.Move(); if (mCyl.ChkTgHit()) { cond = get_rock_row(); for (int j = get_rock_row(); j < (cond + 2); j++) { mRockParts[j].make_fall_rock(TRUE); mRockParts[j].mTimer = 0; mRockParts[j].mTimerTrigger = 30; mRockParts[j].setDrawProc(&Part_c::draw_flashing_normal); } mCyl.ClrTgHit(); } } } break; case 1: if (eventInfo.checkCommandDemoAccrpt()) { cond = get_rock_row(); for (i = get_rock_row(); i < (cond + 2); i++) { init_disp_rate.x = 12.0f; if ((i & 1) == 0) { init_disp_rate.x *= -1.0f; } rotation_speed = daObjAjav_get_rot_speed(mSphCoOffset, mRockParts[i].mCenterPos, 0x1FF); mRockParts[i].fall_init(init_disp_rate, rotation_speed, 0x1FF, (s16)(cM_rnd() * 9.0f) + 7); mDoAud_seStart(JA_SE_OBJ_JB_STONE_BRK, &mRockParts[i].mSePos,0, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); mRockParts[i].setDrawProc(&Part_c::draw_normal); mRockParts[i].make_fall_rock(FALSE); } make_shot_rock(); int row = get_rock_row(); set_hamon(mRockParts[row].mRockDisplacement.y); M_status++; if (M_status < STATUS_MAX - 1) { cond = get_rock_row(); for (i = get_rock_row(); i < (cond + 2); i++) { mRockParts[i].mFlawPos = flaw_pos[i]; mRockParts[i].setExeProc(&Part_c::flaw); } set_co_offset(); mActionIdx = 2; } else { mActionIdx = 3; mCutsceneEndDelay = 60; } } else { fopAcM_orderOtherEventId(this, mEventIdx); eventInfo.onCondition(dEvtCnd_UNK2_e); } break; case 2: if (dComIfGp_evmng_endCheck(mEventIdx)) { dComIfGp_event_reset(); if (M_status < STATUS_MAX - 1) { mActionIdx = 0; } else { mActionIdx = 4; } } break; case 3: if (check_end()) { if (mCutsceneEndDelay == 0) { dComIfGp_evmng_cutEnd(dComIfGp_evmng_getMyStaffId("Ajav")); if (DEMO_SELECT(true, heap != NULL) && mpBgW != NULL) { if (mpBgW->ChkUsed()) { dComIfG_Bgsp()->Release(mpBgW); #if VERSION > VERSION_DEMO mpBgW = NULL; #endif } } on_sw(mSwNo); mDoAud_seStart(JA_SE_READ_RIDDLE_1); mDoAud_subBgmStop(); mActionIdx = 2; M_status++; } else { mCutsceneEndDelay--; } } break; case 4: break; default: mActionIdx = 0; break; } if (M_status < STATUS_MAX - 1) { dComIfG_Ccsp()->Set(&mSph); dComIfG_Ccsp()->Set(&mCyl); for (i = 0; i < 2; i++) { dComIfG_Ccsp()->Set(&mHintCyls[i]); } } for (i = 0; i < ARRAY_SSIZE(mRockParts); i++) { mRockParts[i].execute(this); } if (mpBgW && mpBgW->ChkUsed()) { mpBgW->Move(); } return true; } /* 00002CF4-00002D50 .text set_se_pos__Q29daObjAjav6Part_cF4cXyz */ void daObjAjav::Part_c::set_se_pos(cXyz i_pos) { mSePos = i_pos + mCenterPos; mSePos += mRockDisplacement; } /* 00002D50-00002DCC .text _draw__Q29daObjAjav5Act_cFv */ bool daObjAjav::Act_c::_draw() { g_env_light.settingTevStruct(TEV_TYPE_BG0, ¤t.pos, &tevStr); for (int i = 0; i < ARRAY_SSIZE(mRockParts); i++) { mRockParts[i].draw(this); } return true; } namespace daObjAjav { namespace { /* 00002DCC-00002DEC .text Mthd_Create__Q29daObjAjav26@unnamed@d_a_obj_ajav_cpp@FPv */ cPhs_State Mthd_Create(void* i_this) { return ((daObjAjav::Act_c*)i_this)->_create(); } /* 00002DEC-00002E10 .text Mthd_Delete__Q29daObjAjav26@unnamed@d_a_obj_ajav_cpp@FPv */ BOOL Mthd_Delete(void* i_this) { return ((daObjAjav::Act_c*)i_this)->_delete(); } /* 00002E10-00002E34 .text Mthd_Execute__Q29daObjAjav26@unnamed@d_a_obj_ajav_cpp@FPv */ BOOL Mthd_Execute(void* i_this) { return ((daObjAjav::Act_c*)i_this)->_execute(); } /* 00002E34-00002E58 .text Mthd_Draw__Q29daObjAjav26@unnamed@d_a_obj_ajav_cpp@FPv */ BOOL Mthd_Draw(void* i_this) { return ((daObjAjav::Act_c*)i_this)->_draw(); } /* 00002E58-00002E60 .text Mthd_IsDelete__Q29daObjAjav26@unnamed@d_a_obj_ajav_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 daObjAjav actor_process_profile_definition g_profile_Obj_Ajav = { /* Layer ID */ fpcLy_CURRENT_e, /* List ID */ 0x0003, /* List Prio */ fpcPi_CURRENT_e, /* Proc Name */ fpcNm_Obj_Ajav_e, /* Proc SubMtd */ &g_fpcLf_Method.base, /* Size */ sizeof(daObjAjav::Act_c), /* Size Other */ 0, /* Parameters */ 0, /* Leaf SubMtd */ &g_fopAc_Method.base, /* Draw Prio */ fpcDwPi_Obj_Ajav_e, /* Actor SubMtd */ &daObjAjav::Mthd_Table, /* Status */ fopAcStts_UNK40000_e, /* Group */ fopAc_ACTOR_e, /* Cull Type */ fopAc_CULLBOX_CUSTOM_e, };