/** * @file d_a_obj_lv4chandelier.cpp * */ #include "d/dolzel_rel.h" #include "d/actor/d_a_obj_lv4chandelier.h" #include "d/d_com_inf_game.h" #include "d/actor/d_a_obj_swchain.h" #include "d/d_bg_w.h" #include "d/d_cc_d.h" #include "d/d_cc_uty.h" #include "dol2asm.h" #ifdef DEBUG class daObjLv4Chan_HIO_c : public mDoHIO_entry_c { public: daObjLv4Chan_HIO_c(); void genMessage(JORMContext*); }; daObjLv4Chan_HIO_c::daObjLv4Chan_HIO_c() { } void daObjLv4Chan_HIO_c::genMessage(JORMContext* ctx) { } static daObjLv4Chan_HIO_c l_HIO; #endif /* 80C63338-80C63360 000078 0028+00 1/1 0/0 0/0 .text * rideCallBack__FP4dBgWP10fopAc_ac_cP10fopAc_ac_c */ static void rideCallBack(dBgW* i_bgw, fopAc_ac_c* param_2, fopAc_ac_c* param_3) { ((daObjLv4Chan_c*)param_2)->rideActor(param_3); } /* 80C66990-80C66994 -00001 0004+00 3/3 0/0 0/0 .data l_arcName */ static char* l_arcName = "P_Lv4Chan"; /* 80C63360-80C634CC 0000A0 016C+00 1/1 0/0 0/0 .text create1st__14daObjLv4Chan_cFv */ int daObjLv4Chan_c::create1st() { int rv = dComIfG_resLoad(this, l_arcName); if (rv == cPhs_COMPLEATE_e) { for (int i = 0; i < 3; i++) { if (getArg0() == 0xf) { mMdlLengths[i] = 18; } else { mMdlLengths[i] = 35; } } if (getAddChain0() != 0xf) { mAddChain0 = getAddChain0(); mMdlLengths[0] += mAddChain0; } else { mAddChain0 = 0; } field_0x2484 = (mMdlLengths[0] - mAddChain0) - 17; if (getAddChain1() != 0xf) { mMdlLengths[1] += getAddChain1(); } if (getAddChain2() != 0xf) { mMdlLengths[2] += getAddChain2(); } for (int i = 0; i < 3; i++) { mChainLengths[i] = mMdlLengths[i] + 1; } rv = MoveBGCreate(l_arcName, 8, dBgS_MoveBGProc_TypicalRotY, 0xf500, NULL); if (rv == cPhs_ERROR_e) { return rv; } #ifdef DEBUG // “Chandelier (Lv4)” l_HIO.entryHIO("シャンデリア(Lv4)"); #endif } return rv; } /* 80C66860-80C66868 000000 0008+00 10/10 0/0 0/0 .rodata l_bmdidx */ static u32 const l_bmdidx[2] = { 4, 5, }; /* 80C634CC-80C636B4 00020C 01E8+00 1/1 0/0 0/0 .text * setMtxChain__14daObjLv4Chan_cFPQ214daObjLv4Chan_c8ChainPosP10dMdl_obj_ci */ void daObjLv4Chan_c::setMtxChain(daObjLv4Chan_c::ChainPos* i_chains, dMdl_obj_c* i_mdls, int param_3) { s16 sVar8 = 0; for (int i = 0; i < param_3; i++) { Mtx afStack_70; cXyz cStack_7c = i_chains[i + 1].field_0xc - i_chains[i].field_0xc; cXyz cStack_88; VECCrossProduct(&::cXyz::BaseZ, &cStack_7c, &cStack_88); if (!cM3d_IsZero(cStack_7c.getSquareMag())) { cStack_7c.normalize(); f32 dVar10 = VECDotProduct(&cStack_7c, &::cXyz::BaseZ); if (!cM3d_IsZero(cStack_88.getSquareMag()) && -1.0f <= dVar10 && dVar10 <= 1.0f) { cStack_88.normalize(); f32 fVar11 = i_acosf(dVar10); i_chains[i].field_0x24 = fVar11 - M_PI / 2; MTXRotAxisRad(afStack_70, &cStack_88, fVar11); } else { MTXIdentity(afStack_70); } } else { MTXIdentity(afStack_70); } sVar8 += 0x4000; mDoMtx_stack_c::transS(i_chains[i].field_0xc); mDoMtx_stack_c::concat(afStack_70); mDoMtx_stack_c::ZrotM(sVar8); i_mdls[i].setMtx(mDoMtx_stack_c::get()); } } /* 80C636B4-80C639B4 0003F4 0300+00 2/2 0/0 0/0 .text setMtx__14daObjLv4Chan_cFv */ void daObjLv4Chan_c::setMtx() { mDoMtx_stack_c::transS(current.pos.x, current.pos.y, current.pos.z); mDoMtx_stack_c::YrotM(shape_angle.y); MTXCopy(mDoMtx_stack_c::get(), field_0x5d8); setMtxChain(mChains[0], mMdls[0], mMdlLengths[0]); setMtxChain(mChains[1], mMdls[1], mMdlLengths[1]); setMtxChain(mChains[2], mMdls[2], mMdlLengths[2]); Mtx afStack_68; cXyz local_78; cM3d_VectorProduct(&mChains[0][mMdlLengths[0]].field_0xc, &mChains[1][mMdlLengths[1]].field_0xc, &mChains[2][mMdlLengths[2]].field_0xc, &local_78); if (!cM3d_IsZero(local_78.getSquareMag())) { local_78.normalize(); cXyz cStack_84; VECCrossProduct(&::cXyz::BaseY, &local_78, &cStack_84); f32 dVar9 = VECDotProduct(&local_78, &::cXyz::BaseY); if (!cM3d_IsZero(cStack_84.getSquareMag()) && -1.0f <= dVar9 && dVar9 <= 1.0f) { cStack_84.normalize(); MTXRotAxisRad(afStack_68, &cStack_84, i_acosf(dVar9)); local_78 *= -150.0f; } else { MTXIdentity(afStack_68); local_78.x = 0.0f; local_78.y = -150.0f; local_78.z = 0.0f; } } else { MTXIdentity(afStack_68); local_78.x = 0.0f; local_78.y = -150.0f; local_78.z = 0.0f; } field_0x23bc = mChains[0][mMdlLengths[0]].field_0xc * (1 / 3.0f) + mChains[1][mMdlLengths[1]].field_0xc * (1 / 3.0f) + mChains[2][mMdlLengths[2]].field_0xc * (1 / 3.0f); field_0x23bc += local_78; mDoMtx_stack_c::transS(field_0x23bc); mDoMtx_stack_c::concat(afStack_68); mModel->setBaseTRMtx(mDoMtx_stack_c::get()); mDoMtx_stack_c::scaleM(scale.x, scale.y, scale.z); MTXCopy(mDoMtx_stack_c::get(), field_0x5a8); } /* 80C639B4-80C63CFC 0006F4 0348+00 1/1 0/0 0/0 .text rideActor__14daObjLv4Chan_cFP10fopAc_ac_c */ void daObjLv4Chan_c::rideActor(fopAc_ac_c* param_1) { field_0x2498 = 1; f32 dVar8 = 1.0f; if (field_0x23d4 >= 8) { if (cM_rndF(1.0f) > 0.01f) { return; } dVar8 = cM_rndF(0.1f); } field_0x23d8[field_0x23d4] = param_1; field_0x23d4++; bool bVar3 = false; for (int i = 0; i < 8; i++) { if (param_1 == field_0x23f8[i]) { bVar3 = true; } } if (bVar3) { if (cM_rndF(1.0f) > 0.01f) { if (cM3d_IsZero(param_1->speed.getSquareMag())) { return; } } dVar8 = cM_rndF(0.1f); } cXyz local_3c; local_3c = param_1->current.pos - mChains[0][mChainLengths[0] - 1].field_0xc; mChains[0][mChainLengths[0] - 1].field_0x0.x -= dVar8 * (local_3c.x * 0.0075f * (cM_rndFX(0.025f) + 1.0f)); mChains[0][mChainLengths[0] - 1].field_0x0.z -= dVar8 * (local_3c.z * 0.0075f * (cM_rndFX(0.025f) + 1.0f)); cXyz local_48; local_48 = param_1->current.pos - mChains[1][mChainLengths[1] - 1].field_0xc; mChains[1][mChainLengths[1] - 1].field_0x0.x -= dVar8 * (local_48.x * 0.0075f * (cM_rndFX(0.025f) + 1.0f)); mChains[1][mChainLengths[1] - 1].field_0x0.z -= dVar8 * (local_48.z * 0.0075f * (cM_rndFX(0.025f) + 1.0f)); cXyz local_54; local_54 = param_1->current.pos - mChains[2][mChainLengths[2] - 1].field_0xc; mChains[2][mChainLengths[2] - 1].field_0x0.x -= dVar8 * (local_54.x * 0.0075f * (cM_rndFX(0.025f) + 1.0f)); mChains[2][mChainLengths[2] - 1].field_0x0.z -= dVar8 * (local_54.z * 0.0075f * (cM_rndFX(0.025f) + 1.0f)); } /* 80C63CFC-80C63F34 000A3C 0238+00 1/0 0/0 0/0 .text CreateHeap__14daObjLv4Chan_cFv */ int daObjLv4Chan_c::CreateHeap() { J3DModelData* model_data = (J3DModelData*)dComIfG_getObjectRes(l_arcName, l_bmdidx[0]); JUT_ASSERT(478, model_data != 0); mModel = mDoExt_J3DModel__create(model_data, 0x80000, 0x11000084); if (mModel == NULL) { return 0; } mChains[0] = new ChainPos[mChainLengths[0]]; if (mChains[0] == NULL) { return 0; } mChains[1] = new ChainPos[mChainLengths[1]]; if (mChains[1] == NULL) { return 0; } mChains[2] = new ChainPos[mChainLengths[2]]; if (mChains[2] == NULL) { return 0; } mChainModelData = (J3DModelData*)dComIfG_getObjectRes(l_arcName, l_bmdidx[1]); JUT_ASSERT(500, mChainModelData != 0); mMdls[0] = new dMdl_obj_c[mMdlLengths[0]]; if (mMdls[0] == NULL) { return 0; } mMdls[1] = new dMdl_obj_c[mMdlLengths[1]]; if (mMdls[1] == NULL) { return 0; } mMdls[2] = new dMdl_obj_c[mMdlLengths[2]]; if (mMdls[2] == NULL) { return 0; } return 1; } /* 80C63F34-80C63FA8 000C74 0074+00 1/1 0/0 0/0 .text searchSwChain__FPvPv */ static void* searchSwChain(void* i_actor, void* i_this) { if (i_actor != NULL && fopAcM_IsActor(i_actor) && fopAcM_GetProfName(i_actor) == PROC_Obj_SwChain) { if (((daObjSwChain_c*)i_actor)->getChainID() == ((daObjLv4Chan_c*)i_this)->getArg0()) { return i_actor; } } return NULL; } /* 80C66994-80C669D4 000004 0040+00 1/1 0/0 0/0 .data cc_sph_src */ static dCcD_SrcSph cc_sph_src = { { {0x0, {{0x0, 0x0, 0x0}, {0xd8fbfdff, 0x11}, 0x79}}, // mObj {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x0}, // mGObjAt {dCcD_SE_NONE, 0x5, 0x0, 0x0, 0x2}, // mGObjTg {0x0}, // mGObjCo }, // mObjInf { {{0.0f, 0.0f, 0.0f}, 40.0f} // mSph } // mSphAttr }; /* 80C63FA8-80C6449C 000CE8 04F4+00 1/0 0/0 0/0 .text Create__14daObjLv4Chan_cFv */ int daObjLv4Chan_c::Create() { mModel->setBaseScale(scale); field_0x23d4 = 0; for (int i = 0; i < 8; i++) { field_0x23d8[i] = NULL; field_0x23f8[i] = NULL; } field_0x2418 = 1; field_0x241c = 0; for (int i = 0; i < field_0x2418; i = i + 1) { mChains[0][i].field_0xc = current.pos; mChains[0][i].field_0xc.x += -163.12f; mChains[0][i].field_0xc.z += -282.54f; mChains[0][i].field_0x0 = cXyz::Zero; mChains[0][i].field_0x24 = 0; mChains[1][i].field_0xc = current.pos; mChains[1][i].field_0xc.x += -163.12f; mChains[1][i].field_0xc.z += 282.54f; mChains[1][i].field_0x0 = cXyz::Zero; mChains[1][i].field_0x24 = 0; mChains[2][i].field_0xc = current.pos; mChains[2][i].field_0xc.x += 326.25f; mChains[2][i].field_0x0 = cXyz::Zero; mChains[2][i].field_0x24 = 0; } for (int i = field_0x2418; i < mChainLengths[0]; i++) { mChains[0][i].field_0x0 = cXyz::Zero; mChains[0][i].field_0xc.x = mChains[0][0].field_0xc.x; mChains[0][i].field_0xc.y = mChains[0][i - 1].field_0xc.y - 35.0f; mChains[0][i].field_0xc.z = mChains[0][0].field_0xc.z; mChains[0][i].field_0x24 = 0; } for (int i = field_0x2418; i < mChainLengths[1]; i++) { mChains[1][i].field_0x0 = cXyz::Zero; mChains[1][i].field_0xc.x = mChains[1][0].field_0xc.x; mChains[1][i].field_0xc.y = mChains[1][i - 1].field_0xc.y - 35.0f; mChains[1][i].field_0xc.z = mChains[1][0].field_0xc.z; mChains[1][i].field_0x24 = 0; } for (int i = field_0x2418; i < mChainLengths[2]; i++) { mChains[2][i].field_0x0 = cXyz::Zero; mChains[2][i].field_0xc.x = mChains[2][0].field_0xc.x; mChains[2][i].field_0xc.y = mChains[2][i - 1].field_0xc.y - 35.0f; mChains[2][i].field_0xc.z = mChains[2][0].field_0xc.z; mChains[2][i].field_0x24 = 0; } setMtx(); field_0x23c8 = field_0x23bc; fopAcM_SetMtx(this, field_0x5d8); chkGnd(); fopAcM_setCullSizeBox(this, -800.0f, (-mMdlLengths[0] * 40.0f) - 1700.0f, -600.0f, 800.0f, 10.0f, 600.0f); mpBgW->SetRideCallback(rideCallBack); mStts.Init(0xff, 0, this); for (int i = 0; i < 8; i = i + 1) { mSphs1[i].Set(cc_sph_src); mSphs1[i].SetStts(&mStts); mSphs2[i].Set(cc_sph_src); mSphs2[i].SetStts(&mStts); mSphs3[i].Set(cc_sph_src); mSphs3[i].SetStts(&mStts); } field_0x2488 = 0; field_0x2489 = 1; field_0x248a = 0; field_0x248b = 0; field_0x248c = 0; field_0x248d = 0; field_0x2490 = 1.0f; field_0x2494 = 0.0f; field_0x249c = 1.0f; field_0x24a0 = 0.0f; field_0x2498 = 0; field_0x2499 = 0; return 1; } /* 80C6449C-80C64668 0011DC 01CC+00 1/1 0/0 0/0 .text * constraintChain__14daObjLv4Chan_cFPQ214daObjLv4Chan_c8ChainPosi */ void daObjLv4Chan_c::constraintChain(daObjLv4Chan_c::ChainPos* i_chains, int param_2) { bool iVar4 = field_0x2418 == field_0x2484; for (int i = field_0x2418; i < param_2; i++) { cXyz local_3c = i_chains[i].field_0xc - i_chains[i - 1].field_0xc; if (local_3c.y >= -0.7071f) { local_3c.y = -0.7071f; } if (!iVar4) { local_3c.z = 0.0f; local_3c.x = 0.0f; } f32 uVar6 = local_3c.getSquareMag(); if (i == field_0x2418) { if (!cM3d_IsZero(uVar6)) { if (uVar6 >= 1225.0f) { local_3c.normalize(); local_3c *= 35.0f; } } else { local_3c.x = 0.0f; local_3c.y = -1.0f; local_3c.z = 0.0f; } } else { if (!cM3d_IsZero(uVar6)) { local_3c.normalize(); } else { local_3c.x = 0.0f; local_3c.y = -1.0f; local_3c.z = 0.0f; } local_3c *= 35.0f; } i_chains[i].field_0xc = local_3c + i_chains[i - 1].field_0xc; } } /* 80C668D0-80C668DC 000070 000C+00 0/1 0/0 0/0 .rodata l_pos0 */ static Vec const l_pos0 = { -163.12f, 150.0f, -282.54f, }; /* 80C668DC-80C668E8 00007C 000C+00 0/1 0/0 0/0 .rodata l_pos1 */ static Vec const l_pos1 = { -163.12f, 150.0f, 282.54f, }; /* 80C668E8-80C668F4 000088 000C+00 0/1 0/0 0/0 .rodata l_pos2 */ static Vec const l_pos2 = { 326.25f, 150.0f, 0.0f, }; /* 80C64668-80C647FC 0013A8 0194+00 1/1 0/0 0/0 .text constraintBase__14daObjLv4Chan_cFv */ void daObjLv4Chan_c::constraintBase() { cXyz acStack_20; MTXMultVec(field_0x5a8, &l_pos0, &acStack_20); mChains[0][mChainLengths[0] - 1].field_0xc = (acStack_20 + mChains[0][mChainLengths[0] - 1].field_0xc) * 0.5f; MTXMultVec(field_0x5a8, &l_pos1, &acStack_20); mChains[1][mChainLengths[1] - 1].field_0xc = (acStack_20 + mChains[1][mChainLengths[1] - 1].field_0xc) * 0.5f; MTXMultVec(field_0x5a8, &l_pos2, &acStack_20); mChains[2][mChainLengths[2] - 1].field_0xc = (acStack_20 + mChains[2][mChainLengths[2] - 1].field_0xc) * 0.5f; } /* 80C647FC-80C64878 00153C 007C+00 1/1 0/0 0/0 .text * calcVec__14daObjLv4Chan_cFPQ214daObjLv4Chan_c8ChainPosi */ void daObjLv4Chan_c::calcVec(daObjLv4Chan_c::ChainPos* i_chains, int param_2) { for (int i = 0; i < param_2; i++) { i_chains[i].field_0x0 = i_chains[i].field_0xc - i_chains[i].field_0x18; } } /* 80C64878-80C648F4 0015B8 007C+00 2/2 0/0 0/0 .text chkGnd__14daObjLv4Chan_cFv */ void daObjLv4Chan_c::chkGnd() { cXyz cStack_18; cStack_18 = field_0x23bc; cStack_18.y += 300.0f; mGndChk.SetPos(&cStack_18); mGndChk.SetActorPid(base.base.id); field_0x247c = dComIfG_Bgsp().GroundCross(&mGndChk); } /* 80C668FC-80C66924 00009C 0028+00 0/1 0/0 0/0 .rodata l_curve */ static int const l_curve[10] = { 0, 0, 0, 0, 0, 1, 1, 2, 2, 4, }; /* 80C648F4-80C65F04 001634 1610+00 1/0 0/0 0/0 .text Execute__14daObjLv4Chan_cFPPA3_A4_f */ int daObjLv4Chan_c::Execute(Mtx** i_mtx) { daPy_py_c* player = daPy_getPlayerActorClass(); int local_1f0 = 0; field_0x2420 = 0; if (getArg0() != 0xf) { daObjSwChain_c* swChain = (daObjSwChain_c*)fopAcM_Search( searchSwChain, this); if ((swChain != NULL)) { local_1f0 = swChain->checkTight(); if (local_1f0) { field_0x248b = 0; if (field_0x2418 < field_0x2484) { if (player->getBaseAnimeFrame() < 10.0f) { int local_1f8 = player->getBaseAnimeFrame(); if (local_1f8 < 0) { local_1f8 = 0; } if (9 < local_1f8) { local_1f8 = 9; } field_0x241c += l_curve[local_1f8]; if (field_0x241c >= 10) { field_0x241c = field_0x241c - 10; if (field_0x2418 == 1 && getSw() != 0xff) { fopAcM_onSwitch(this, getSw()); } field_0x2418 = field_0x2418 + 1; Z2GetAudioMgr()->seStart(Z2SE_OBJ_CHANDELIER_UP, &field_0x23bc, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); } } } else { if (field_0x2489 != 0) { ; dComIfGp_getVibration().StartShock(3, 0x1f, cXyz(0.0f, 1.0f, 0.0f)); mDoAud_seStart(Z2SE_OBJ_CHAND_TOP, &field_0x23bc, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); field_0x2489 = 0; } field_0x241c = 0; } if (field_0x241c > 10) { field_0x241c = 10 - 1; } field_0x2420 = (f32)(field_0x241c - 2) / (f32)(10 - 2); if (field_0x2420 < 0.0f) { field_0x2420 = 0.0f; } if (field_0x2418 > 0.7f * field_0x2484) { field_0x2488 = 1; } if (field_0x2488 == 1) { field_0x248a = 0; } else { field_0x248a = 1; } } else { if (!swChain->checkCarry()) { if (field_0x2418 == field_0x2484) { if (field_0x248b == 0) { field_0x248b = 1; Z2GetAudioMgr()->seStart(Z2SE_OBJ_CHANDELIER_DW_TRG, &field_0x23bc, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); } field_0x241c++; if (field_0x241c < 120) { field_0x2420 = 0; } else { field_0x2420 = (f32)(field_0x241c - 120) / (f32)3; if (field_0x241c - 120 > 3) { field_0x241c = 0; field_0x2418--; field_0x2420 = 0; } Z2GetAudioMgr()->seStartLevel(Z2SE_OBJ_CHANDELIER_DW_LV, &field_0x23bc, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); } } else if (field_0x2418 > 1) { field_0x241c++; if (field_0x241c >= 3) { field_0x241c = 0; field_0x2418--; } field_0x2420 = (f32)field_0x241c / (f32)3; Z2GetAudioMgr()->seStartLevel(Z2SE_OBJ_CHANDELIER_DW_LV, &field_0x23bc, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); } if (field_0x2418 == 1 && field_0x248a != 0) { field_0x248a = 0; dComIfGp_getVibration().StartShock(4, 0x1f, cXyz(0.0f, 1.0f, 0.0f)); mDoAud_seStart(Z2SE_OBJ_CHAND_FALLDOWN_S, &field_0x23bc, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); } } } if (field_0x2418 == 1 && field_0x2488 != 0) { field_0x2488 = 0; dComIfGp_getVibration().StartShock(8, 0x1f, cXyz(0.0f, 1.0f, 0.0f)); mDoAud_seStart(Z2SE_OBJ_CHAND_FALLDOWN, &field_0x23bc, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(this))); } if (field_0x2418 <= 1) { field_0x2418 = 1; field_0x2489 = 1; } if (field_0x2418 > field_0x2484) { field_0x2418 = field_0x2484; } swChain->setRatioForChandelier((f32)(field_0x2484 - field_0x2418) / (f32)field_0x2484); } } if (field_0x2420 > 1.0f) { field_0x2420 = 1.0f; } f32 dVar19 = field_0x2420 * 35.0f; if (local_1f0 == 0) { dVar19 *= -1.0f; } for (int i = 0; i < 8; i++) { field_0x23f8[i] = field_0x23d8[i]; field_0x23d8[i] = NULL; } field_0x23d4 = 0; if (cM_rndF(1.0f) < 0.05f) { cXyz cStack_8c = dKyw_get_wind_vecpow(); cStack_8c *= cM_rndF(0.4f); for (int i = field_0x2418; i < mChainLengths[0]; i++) { mChains[0][i].field_0x0 += cStack_8c; } for (int i = field_0x2418; i < mChainLengths[1]; i++) { mChains[1][i].field_0x0 += cStack_8c; } for (int i = field_0x2418; i < mChainLengths[2]; i++) { mChains[2][i].field_0x0 += cStack_8c; } cStack_8c *= cM_rndF(6.0f); mChains[0][mChainLengths[0] - 1].field_0x0 += cStack_8c; mChains[1][mChainLengths[1] - 1].field_0x0 += cStack_8c; mChains[2][mChainLengths[2] - 1].field_0x0 += cStack_8c; } bool bVar5 = false; for (int i = 0; i < 8; i++) { int local_210 = mChainLengths[0] - 1 - 2 * i; if (local_210 >= 0 && mSphs1[i].ChkTgHit()) { cCcD_Obj* hitObj = mSphs1[i].GetTgHitObj(); fopAc_ac_c* hitActor = dCc_GetAc(hitObj->GetAc()); cXyz cStack_98; cStack_98 = mChains[0][local_210].field_0xc - hitActor->current.pos; if (!cM3d_IsZero(cStack_98.getSquareMag())) { cStack_98.normalize(); cStack_98 *= 15.0f; mChains[0][local_210].field_0x0 += cStack_98; } if (!bVar5) { bVar5 = true; u8 atSe = ((dCcD_GObjInf*)hitObj)->GetAtSe(); Z2GetAudioMgr()->seStart(dCcD_GObjInf::getHitSeID(atSe, 0), mSphs1[i].GetCP(), 0x35, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); } } int local_224 = mChainLengths[1] - 1 - 2 * i; if (local_224 >= 0 && mSphs2[i].ChkTgHit()) { cCcD_Obj* hitObj = mSphs2[i].GetTgHitObj(); fopAc_ac_c* hitActor = dCc_GetAc(hitObj->GetAc()); cXyz cStack_a4; cStack_a4 = mChains[1][local_224].field_0xc - hitActor->current.pos; if (!cM3d_IsZero(cStack_a4.getSquareMag())) { cStack_a4.normalize(); cStack_a4 *= 15.0f; mChains[1][local_224].field_0x0 += cStack_a4; } if (!bVar5) { bVar5 = true; u8 atSe = ((dCcD_GObjInf*)hitObj)->GetAtSe(); Z2GetAudioMgr()->seStart(dCcD_GObjInf::getHitSeID(atSe, 0), mSphs2[i].GetCP(), 0x35, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); } } int local_238 = mChainLengths[2] - 1 - 2 * i; if (local_238 >= 0 && mSphs3[i].ChkTgHit()) { cCcD_Obj* hitObj = mSphs3[i].GetTgHitObj(); fopAc_ac_c* hitActor = dCc_GetAc(hitObj->GetAc()); cXyz cStack_b0; cStack_b0 = mChains[2][local_238].field_0xc - hitActor->current.pos; if (!cM3d_IsZero(cStack_b0.getSquareMag())) { cStack_b0.normalize(); cStack_b0 *= 15.0f; mChains[2][local_238].field_0x0 += cStack_b0; } if (!bVar5) { bVar5 = true; u8 atSe = ((dCcD_GObjInf*)hitObj)->GetAtSe(); Z2GetAudioMgr()->seStart(dCcD_GObjInf::getHitSeID(atSe, 0), mSphs3[i].GetCP(), 0x35, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); } } } for (int i = field_0x2418; i < mChainLengths[0]; i++) { mChains[0][i].field_0x18 = mChains[0][i].field_0xc; mChains[0][i].field_0x0.y += -4.0f; mChains[0][i].field_0xc += mChains[0][i].field_0x0; } for (int i = field_0x2418; i < mChainLengths[1]; i++) { mChains[1][i].field_0x18 = mChains[1][i].field_0xc; mChains[1][i].field_0x0.y += -4.0f; mChains[1][i].field_0xc += mChains[1][i].field_0x0; } for (int i = field_0x2418; i < mChainLengths[2]; i++) { mChains[2][i].field_0x18 = mChains[2][i].field_0xc; mChains[2][i].field_0x0.y += -4.0f; mChains[2][i].field_0xc += mChains[2][i].field_0x0; } for (int i = 0; i < 2; i++) { for (int j = field_0x2418; j < mChainLengths[0] - 1; j++) { if (j != mChainLengths[0] - 1) { mChains[0][j].field_0xc = (mChains[0][j - 1].field_0xc + mChains[0][j].field_0xc + mChains[0][j + 1].field_0xc) * (1.0f / 3.0f); } else { mChains[0][j].field_0xc = (mChains[0][j - 1].field_0xc + mChains[0][j].field_0xc) * 0.5f; } } for (int j = field_0x2418; j < mChainLengths[1] - 1; j++) { if (j != mChainLengths[1] - 1) { mChains[1][j].field_0xc = (mChains[1][j - 1].field_0xc + mChains[1][j].field_0xc + mChains[1][j + 1].field_0xc) * (1.0f / 3.0f); } else { mChains[1][j].field_0xc = (mChains[1][j - 1].field_0xc + mChains[1][j].field_0xc) * 0.5f; } } for (int j = field_0x2418; j < mChainLengths[2] - 1; j++) { if (j != mChainLengths[2] - 1) { mChains[2][j].field_0xc = (mChains[2][j - 1].field_0xc + mChains[2][j].field_0xc + mChains[2][j + 1].field_0xc) * (1.0f / 3.0f); } else { mChains[2][j].field_0xc = (mChains[2][j - 1].field_0xc + mChains[2][j].field_0xc) * 0.5f; } } setMtx(); constraintBase(); for (int j = 0; j < field_0x2418; j++) { mChains[0][j].field_0xc = current.pos; mChains[0][j].field_0xc.x += -163.12f; mChains[0][j].field_0xc.y += dVar19; mChains[0][j].field_0xc.z += -282.54f; mChains[0][j].field_0x0 = ::cXyz::Zero; mChains[1][j].field_0xc = current.pos; mChains[1][j].field_0xc.x += -163.12f; mChains[1][j].field_0xc.y += dVar19; mChains[1][j].field_0xc.z += 282.54f; mChains[1][j].field_0x0 = ::cXyz::Zero; mChains[2][j].field_0xc = current.pos; mChains[2][j].field_0xc.x += 326.25f; mChains[2][j].field_0xc.y += dVar19; mChains[2][j].field_0x0 = ::cXyz::Zero; } constraintChain(mChains[0], mChainLengths[0]); constraintChain(mChains[1], mChainLengths[1]); constraintChain(mChains[2], mChainLengths[2]); } calcVec(mChains[0], mChainLengths[0]); calcVec(mChains[1], mChainLengths[1]); calcVec(mChains[2], mChainLengths[2]); setMtx(); u8 local_2a8 = 0; for (int i = 0; i < mChainLengths[0]; i++) { if (!cM3d_IsZero(mChains[0][i].field_0x24)) { local_2a8 = 1; } } for (int i = 0; i < mChainLengths[1]; i++) { if (!cM3d_IsZero(mChains[1][i].field_0x24)) { local_2a8 = 1; } } for (int i = 0; i < mChainLengths[2]; i++) { if (!cM3d_IsZero(mChains[2][i].field_0x24)) { local_2a8 = 1; } } field_0x23c8.abs2XZ(field_0x23bc); cXyz local_bc = field_0x23bc - field_0x23c8; local_bc.y = 0.0f; if (!cM3d_IsZero(local_bc.getSquareMag())) { local_bc.normalize(); f32 dVar20 = local_bc.x * field_0x2490 + local_bc.z * field_0x2494; f32 dVar19 = local_bc.x * field_0x249c + local_bc.z * field_0x24a0; if (field_0x248c == 0 && ((local_2a8 == 1 && field_0x248d == 0) || ((local_2a8 == 1 && (dVar20 < -0.866f || cM_rndF(1.0f) < 0.003f || dVar19 <= 0.0f || (field_0x2499 == 0 && field_0x2498 != 0)) && cM_rndF(1.0f) < 0.5f)))) { Z2GetAudioMgr()->seStart(Z2SE_OBJ_CHANDELIER_SWING, &field_0x23bc, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); field_0x2490 = local_bc.x; field_0x2494 = local_bc.z; field_0x248c = 1; } else { field_0x248c = 0; } field_0x249c = local_bc.x; field_0x24a0 = local_bc.z; } else { field_0x248c = 0; } field_0x23c8 = field_0x23bc; field_0x248d = local_2a8; field_0x2499 = field_0x2498; field_0x2498 = 0; for (int i = 0; i < 8; i++) { int local_27c = mChainLengths[0] - 1 - 2 * i; if (local_27c >= 0) { mSphs1[i].SetC(mChains[0][local_27c].field_0xc); dComIfG_Ccsp()->Set(&mSphs1[i]); } int local_280 = mChainLengths[1] - 1 - 2 * i; if (local_280 >= 0) { mSphs2[i].SetC(mChains[1][local_280].field_0xc); dComIfG_Ccsp()->Set(&mSphs2[i]); } int local_284 = mChainLengths[2] - 1 - 2 * i; if (local_284 >= 0) { mSphs3[i].SetC(mChains[2][local_284].field_0xc); dComIfG_Ccsp()->Set(&mSphs3[i]); } } mStts.Move(); *i_mtx = &field_0x5a8; chkGnd(); return 1; } /* 80C65F04-80C66114 002C44 0210+00 1/0 0/0 0/0 .text Draw__14daObjLv4Chan_cFv */ int daObjLv4Chan_c::Draw() { g_env_light.settingTevStruct(0x10, ¤t.pos, &tevStr); g_env_light.setLightTevColorType_MAJI(mModel, &tevStr); dComIfGd_setListBG(); mDoExt_modelUpdateDL(mModel); dMdl_c* mdl = dMdl_mng_c::entry(mChainModelData, 0, current.roomNo); if (mdl != NULL) { for (int i = 0; i < mMdlLengths[0]; i++) { mdl->entryObj(&mMdls[0][i]); } for (int i = 0; i < mMdlLengths[1]; i++) { mdl->entryObj(&mMdls[1][i]); } for (int i = 0; i < mMdlLengths[2]; i++) { mdl->entryObj(&mMdls[2][i]); } } dComIfGd_setList(); if (field_0x247c != -1e9f) { f32 fVar4 = 0.4f + ((field_0x23bc.y - field_0x247c) * -0.2f) / 500.0f; if (fVar4 > 0.4f) { fVar4 = 0.4f; } if (fVar4 < 0.2f) { fVar4 = 0.2f; } tevStr.mLightPosWorld.x = field_0x23bc.x; tevStr.mLightPosWorld.y = field_0x247c + 2000.0f; tevStr.mLightPosWorld.z = field_0x23bc.z; tevStr.field_0x344 = fVar4; mShadowId = dComIfGd_setShadow( mShadowId, 0, mModel, &field_0x23bc, 1600.0f, 0.0f, field_0x23bc.y, field_0x247c + 160.0f, mGndChk, &tevStr, 0, 1.0f, dDlst_shadowControl_c::getSimpleTex()); } return 1; } /* 80C66114-80C66150 002E54 003C+00 1/0 0/0 0/0 .text Delete__14daObjLv4Chan_cFv */ int daObjLv4Chan_c::Delete() { dComIfG_resDelete(this, l_arcName); #if DEBUG l_HIO.removeHIO(); #endif return 1; } /* 80C66150-80C6627C 002E90 012C+00 1/0 0/0 0/0 .text daObjLv4Chan_create1st__FP14daObjLv4Chan_c */ static int daObjLv4Chan_create1st(daObjLv4Chan_c* i_this) { fopAcM_SetupActor(i_this, daObjLv4Chan_c); return i_this->create1st(); } /* 80C664D4-80C664F4 003214 0020+00 1/0 0/0 0/0 .text * daObjLv4Chan_MoveBGDelete__FP14daObjLv4Chan_c */ static int daObjLv4Chan_MoveBGDelete(daObjLv4Chan_c* i_this) { return i_this->MoveBGDelete(); } /* 80C664F4-80C66514 003234 0020+00 1/0 0/0 0/0 .text * daObjLv4Chan_MoveBGExecute__FP14daObjLv4Chan_c */ static int daObjLv4Chan_MoveBGExecute(daObjLv4Chan_c* i_this) { return i_this->MoveBGExecute(); } /* 80C66514-80C66540 003254 002C+00 1/0 0/0 0/0 .text daObjLv4Chan_MoveBGDraw__FP14daObjLv4Chan_c */ static int daObjLv4Chan_MoveBGDraw(daObjLv4Chan_c* i_this) { return i_this->MoveBGDraw(); } /* 80C669D4-80C669F4 -00001 0020+00 1/0 0/0 0/0 .data daObjLv4Chan_METHODS */ static actor_method_class daObjLv4Chan_METHODS = { (process_method_func)daObjLv4Chan_create1st, (process_method_func)daObjLv4Chan_MoveBGDelete, (process_method_func)daObjLv4Chan_MoveBGExecute, NULL, (process_method_func)daObjLv4Chan_MoveBGDraw, }; /* 80C669F4-80C66A24 -00001 0030+00 0/0 0/0 1/0 .data g_profile_Obj_Lv4Chan */ extern actor_process_profile_definition g_profile_Obj_Lv4Chan = { fpcLy_CURRENT_e, // mLayerID 3, // mListID fpcPi_CURRENT_e, // mListPrio PROC_Obj_Lv4Chan, // mProcName &g_fpcLf_Method.base, // sub_method sizeof(daObjLv4Chan_c), // mSize 0, // mSizeOther 0, // mParameters &g_fopAc_Method.base, // sub_method 674, // mPriority &daObjLv4Chan_METHODS, // sub_method 0x00040100, // mStatus fopAc_ACTOR_e, // mActorType fopAc_CULLBOX_CUSTOM_e, // cullType }; /* 80C66984-80C66984 000124 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */