// // Generated by dtk // Translation Unit: d_a_bridge.cpp // #include "d/dolzel.h" // IWYU pragma: keep #include "d/actor/d_a_bridge.h" #include "d/d_bg_w.h" #include "d/d_procname.h" #include "d/d_priority.h" #include "d/d_cc_d.h" #include "d/d_path.h" #include "d/d_com_inf_game.h" #include "d/res/res_bridge.h" #include "d/d_bg_w_sv.h" #include "d/d_s_play.h" #include "d/d_cc_uty.h" #include "d/actor/d_a_bk.h" #include "d/actor/d_a_bomb.h" #include "d/actor/d_a_player.h" #include "d/d_kankyo_wether.h" #include "f_op/f_op_camera.h" static cXyz* wind_vec; static s16 wy; static f32* wp; static f32 ita_z_p[] = { 0.1f, 0.3f, 0.5f, 0.75f, 0.9f, 1.0f, 0.9f, 0.75f, 0.5f, 0.3f, 0.1f }; /* 00000078-00000504 .text ride_call_back__FP4dBgWP10fopAc_ac_cP10fopAc_ac_c */ void ride_call_back(dBgW* bgw, fopAc_ac_c* i_ac, fopAc_ac_c* i_pt) { bridge_class* i_this = (bridge_class*)i_ac; cXyz pos = i_this->mBr[0].mPosition - i_pt->current.pos; s32 brIdx = std::sqrtf(pos.x * pos.x + pos.z * pos.z) / 76.5f - -0.5f; if (brIdx > i_this->mBrCount - 1) { brIdx = i_this->mBrCount - 1; } else if (brIdx < 0) { brIdx = 0; } br_s* pBr = &i_this->mBr[brIdx]; f32 fVar2 = ((i_this->mTypeBits & 5) != 0) ? 0.85f : 1.0f; cMtx_YrotS(*calc_mtx, -pBr->mRotation.y); cXyz posDiff = i_pt->current.pos - pBr->mPosition; cXyz sp4C; MtxPosition(&posDiff, &sp4C); posDiff = i_pt->old.pos - pBr->mPosition; cXyz sp40; MtxPosition(&posDiff, &sp40); i_pt->speed.y = -5.0f; f32 fVar7; if (fpcM_GetName(i_pt) == PROC_PLAYER) { fVar7 = 100.0f; pBr->m3F4 = -31.0f; i_this->m033C = 5; } else if (fpcM_GetName(i_pt) == PROC_MO2) { fVar7 = 150.0f; pBr->m3F4 = -40.0f; i_pt->speed.y = -20.0f; } else if (fpcM_GetName(i_pt) == PROC_BK) { bk_class* bk = (bk_class*)i_pt; bk->speed.y = -20.0f; fVar7 = 100.0f; pBr->m3F4 = -25.0f; bk->dr.m7B8 = fpcM_GetID(i_ac); bk->dr.m7B2 = 8; bk->dr.m7AC = pBr->mRotation; if (sp4C.x > 0.0f) { bk->dr.m79C = pBr->m11C + 1; bk->dr.m7AC.y -= 0x4000; bk->dr.m7B4 = -0x2000; } else { bk->dr.m79C = pBr->m0F8 + 1; bk->dr.m7AC.y += 0x4000; bk->dr.m7B4 = 0x2000; } bk->m0B2C = pBr; } else { fVar7 = 50.0f; pBr->m3F4 = -10.0f; if (fpcM_GetName(i_pt) == PROC_BOMB) { daBomb_c* bomb = (daBomb_c*)i_pt; if (bomb->getBombRestTime() <= 1) { pBr->m3F4 = -300.0f; i_this->m02E0 = 20.0f; return; } } } fVar7 *= fVar2; pBr->m3F4 *= fVar2; pBr->m3F4 = pBr->m3F4 + i_this->m02FC * cM_ssin(i_this->m0300) * 0.03f * fVar7; pBr->m400 = -sp4C.x * fVar7; pBr->m406 = 2; pos = sp4C - sp40; f32 fVar3 = pos.abs() * 0.3f * fVar2; if (fVar3 > 20.0f) { fVar3 = 20.0f; } if (i_this->m02E0 <= fVar3) { i_this->m02E0 = fVar3; } f32 tmp = fVar2 * std::fabsf(pos.x); if (tmp > 50.0f) { tmp = 50.0f; } if (i_this->m02E4 <= tmp) { i_this->m02E4 += 0.5f; } } /* 00000540-00000614 .text kikuzu_set__FP12bridge_classP4cXyz */ void kikuzu_set(bridge_class* i_this, cXyz* pPos) { daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0); csXyz shapeAngle = player->shape_angle; shapeAngle.y -= -0x8000; JPABaseEmitter* emitter = dComIfGp_particle_set(dPa_name::ID_COMMON_002B, pPos, &shapeAngle, NULL, 0xFF, NULL, -1, &i_this->actor.tevStr.mColorK0, &i_this->actor.tevStr.mColorK0, NULL); if (emitter != NULL) { emitter->setRate(10.0f); emitter->setMaxFrame(1); emitter->setSpread(0.2f); emitter->setVolumeSweep(0.15f); JGeometry::TVec3 scale(0.7f, 0.7f, 0.7f); emitter->setGlobalParticleScale(scale); } } /* 00000614-000011EC .text daBridge_Draw__FP12bridge_class */ static BOOL daBridge_Draw(bridge_class* i_this) { s16 atan; s32 atan2; s16 sVar7; s16 sVar8; if (i_this->mbStopDraw) { return TRUE; } br_s* pBr = &i_this->mBr[0]; for (s32 i = 0; i < i_this->mBrCount; i++, pBr++) { g_env_light.setLightTevColorType(pBr->mpModel, &i_this->actor.tevStr); dComIfGd_setListBG(); mDoExt_modelUpdateDL(pBr->mpModel); dComIfGd_setList(); if ((pBr->m408 & 4) == 0) { continue; } cMtx_YrotS(*calc_mtx, i_this->m0300); cXyz sp84(0.0f, 0.0f, 1.0f); cXyz sp78; MtxPosition(&sp84, &sp78); cXyz sp6C = pBr->m11C[0] - pBr->m11C[1]; cXyz sp60 = pBr->m0F8[0] - pBr->m0F8[1]; if ((i_this->mTypeBits & 1) == 0) { s32 uVar16 = (i_this->mTypeBits & 8) ? 5 : 3; cXyz* segment0; cXyz* segment1; u8* size0 = pBr->mLineMat1.getSize(0); u8* size1 = pBr->mLineMat1.getSize(2); if ((pBr->m408 & 1) == 0) { for (s32 j = 0; j < 5; j++) { *size0++ = *size1++ = uVar16; } } else { segment0 = pBr->mLineMat1.getPos(0); segment1 = pBr->mLineMat1.getPos(2); sp6C.x /= 4.0f; sp6C.y /= 4.0f; sp6C.z /= 4.0f; f32 fVar3 = pBr->m3A0[0] * cM_ssin(i_this->m0300 * 5); for (s32 j = 0; j < 5; j++, segment0++, segment1++, size0++, size1++) { *size0 = uVar16; f32 fVar2; if (j == 2) { fVar2 = 1.0f; if (pBr->m3A4 <= 1) { *size0 = 0; } else if (pBr->m3A4 == 2) { *size0 = 1; } pBr->m3A8[0] = *segment0; } else if (j == 1 || j == 3) { fVar2 = 0.7f; } else { fVar2 = 0.0f; } sp84.x = sp6C.x * j + fVar3 * (fVar2 * sp78.x); sp84.y = sp6C.y * j; sp84.z = sp6C.z * j + fVar3 * (fVar2 * sp78.z); *segment0 = pBr->m11C[1] + sp84; *segment1 = pBr->m11C[0]; *size1 = 0; } } size0 = pBr->mLineMat1.getSize(1); size1 = pBr->mLineMat1.getSize(3); if ((pBr->m408 & 2) == 0) { for (s32 j = 0; j < 5; j++) { *size0++ = *size1++ = uVar16; } } else { segment0 = pBr->mLineMat1.getPos(1); segment1 = pBr->mLineMat1.getPos(3); sp60.x /= 4.0f; sp60.y /= 4.0f; sp60.z /= 4.0f; f32 fVar3 = pBr->m3A0[1] * cM_ssin(i_this->m0300 * 5); for (s32 j = 0; j < 5; j++, segment0++, segment1++, size0++, size1++) { *size0 = uVar16; f32 fVar2; if (j == 2) { fVar2 = 1.0f; if (pBr->m3A5 <= 1) { *size0 = 0; } else if (pBr->m3A5 == 2) { *size0 = 1; } pBr->m3A8[1] = *segment0; } else if (j == 1 || j == 3) { fVar2 = 0.7f; } else { fVar2 = 0.0f; } sp84.x = sp60.x * j + fVar3 * (fVar2 * sp78.x); sp84.y = sp60.y * j; sp84.z = sp60.z * j + fVar3 * (fVar2 * sp78.z); *segment0 = pBr->m0F8[1] + sp84; *segment1 = pBr->m0F8[0]; *size1 = 0; } } #ifdef __MWERKS__ pBr->mLineMat1.update(5, (GXColor){150, 150, 150, 255}, &i_this->actor.tevStr); #else GXColor color = (GXColor){150, 150, 150, 255}; pBr->mLineMat1.update(5, color, &i_this->actor.tevStr); #endif dComIfGd_set3DlineMat(&pBr->mLineMat1); continue; } if ((pBr->m408 & 1) != 0) { atan = -cM_atan2s(sp6C.y, sp6C.z); atan2 = cM_atan2s(sp6C.x, std::sqrtf(sp6C.y * sp6C.y + sp6C.z * sp6C.z)); MtxTrans(pBr->m11C[1].x, pBr->m11C[1].y, pBr->m11C[1].z, false); s16 sVar8; if (pBr->m3A0[0] != 0) { sVar8 = pBr->m3A0[0] * cM_ssin(i_this->m0300 * 6) * 100.0f; sVar7 = i_this->m0300; } else { sVar8 = sVar7 = 0; } cMtx_YrotM(*calc_mtx, sVar7); cMtx_XrotM(*calc_mtx, atan + sVar8); cMtx_YrotM(*calc_mtx, atan2); pBr->mpModelRope0->setBaseTRMtx(*calc_mtx); g_env_light.setLightTevColorType(pBr->mpModelRope0,&i_this->actor.tevStr); mDoExt_modelUpdateDL(pBr->mpModelRope0); } if ((pBr->m408 & 2) != 0) { atan = cM_atan2s(sp60.y, sp60.z); atan = -atan; atan2 = cM_atan2s(sp60.x, std::sqrtf(sp60.y * sp60.y + sp60.z * sp60.z)); MtxTrans(pBr->m0F8[1].x, pBr->m0F8[1].y, pBr->m0F8[1].z, false); if (pBr->m3A0[1] != 0) { sVar8 = pBr->m3A0[1] * cM_ssin(i_this->m0300 * 6) * 100.0f; sVar7 = i_this->m0300; } else { sVar8 = sVar7 = 0; } cMtx_YrotM(*calc_mtx, sVar7); cMtx_XrotM(*calc_mtx, atan + sVar8); cMtx_YrotM(*calc_mtx, atan2); pBr->mpModelRope1->setBaseTRMtx(*calc_mtx); g_env_light.setLightTevColorType(pBr->mpModelRope1,&i_this->actor.tevStr); mDoExt_modelUpdateDL(pBr->mpModelRope1); } } if ((i_this->mTypeBits & 5) == 0) { cXyz sp54(-120.0f, 350.0f, -40.0f); cXyz sp48; cMtx_YrotS(*calc_mtx, i_this->actor.home.angle.y); MtxPosition(&sp54, &sp48); cXyz* segment1 = i_this->mLineMat.getPos(0); segment1->x = i_this->actor.home.pos.x + sp48.x; segment1->y = i_this->actor.home.pos.y + sp48.y; segment1->z = i_this->actor.home.pos.z + sp48.z; sp54.z *= -1.0f; segment1 = &i_this->mLineMat.getPos(0)[i_this->m030C] + 1; if ((i_this->mTypeBits & 2) != 0) { bridge_class * aite = i_this->mpAite; if (aite != NULL) { segment1->x = aite->m032C.x; segment1->y = aite->m032C.y; segment1->z = aite->m032C.z; } } else { MtxPosition(&sp54, &sp48); segment1->x = i_this->mEndPos.x + sp48.x; segment1->y = i_this->mEndPos.y + sp48.y; segment1->z = i_this->mEndPos.z + sp48.z; } sp54.x *= -1.0f; sp54.z *= -1.0f; MtxPosition(&sp54, &sp48); segment1 = i_this->mLineMat.getPos(1); segment1->x = i_this->actor.home.pos.x + sp48.x; segment1->y = i_this->actor.home.pos.y + sp48.y; segment1->z = i_this->actor.home.pos.z + sp48.z; sp54.z *= -1.0f; segment1 = &i_this->mLineMat.getPos(1)[i_this->m030C] + 1; if ((i_this->mTypeBits & 2) != 0) { bridge_class * aite = i_this->mpAite; if (aite != NULL) { segment1->x = aite->m0320.x; segment1->y = aite->m0320.y; segment1->z = aite->m0320.z; } } else { MtxPosition(&sp54, &sp48); segment1->x = i_this->mEndPos.x + sp48.x; segment1->y = i_this->mEndPos.y + sp48.y; segment1->z = i_this->mEndPos.z + sp48.z; } f32 tmp; if ((i_this->mTypeBits & 8) != 0) { tmp = 6.5f; } else { tmp = 4.0f; } #ifdef __MWERKS__ i_this->mLineMat.update(i_this->m030C + 2, tmp, (GXColor){150, 150, 150, 255}, 0, &i_this->actor.tevStr); #else GXColor color = (GXColor){150, 150, 150, 255}; i_this->mLineMat.update(i_this->m030C + 2, tmp, color, 0, &i_this->actor.tevStr); #endif dComIfGd_set3DlineMat(&i_this->mLineMat); } return TRUE; } /* 000011EC-00001580 .text control1__FP12bridge_classP4br_s */ void control1(bridge_class* i_this, br_s* pBr) { cXyz sp3C; cXyz sp30; cXyz sp24; cXyz sp18; cXyz sp0C; pBr++; i_this->m02EC += i_this->m02F0; i_this->m02EE += i_this->m02F2; s16 sVar13; if (i_this->mBrCount > 10) { sVar13 = 4000; } else { sVar13 = 8000; } sp3C.x = i_this->m02F8 * cM_scos(i_this->m02EC); sp3C.y = 0.0f; sp3C.z = 0.0f; cMtx_YrotS(*calc_mtx, i_this->actor.home.angle.y); MtxPosition(&sp3C, &sp24); sp3C.x = 1.0f; MtxPosition(&sp3C, &sp18); sp3C.x = 0.0f; sp3C.z = *wp * 5.0f; cMtx_YrotS(*calc_mtx, wy); MtxPosition(&sp3C, &sp0C); sp3C.x = 0.0f; sp3C.z = 75.0f; for (s32 i = 1; i < i_this->mBrCount; i++, pBr++) { f32 x; f32 y; f32 z; f32 tmp = pBr->m3F8 * 0.5f + (pBr->m3FC * pBr->m3F0 * 0.5f + pBr->m3CC.y); f32 fVar8 = i_this->m02F4 * cM_ssin(i_this->m02EC + i * sVar13) * pBr->m3F0; f32 fVar7 = i_this->m02FC * cM_ssin(i_this->m02EE + i * (sVar13 + 1000)) * pBr->m3F0; x = (pBr->m3CC.x - pBr[-1].m3CC.x) + fVar8 * sp18.x + sp24.x * pBr->m3F0 + sp0C.x; y = fVar7 + (tmp - pBr[-1].m3CC.y); z = (pBr->m3CC.z - pBr[-1].m3CC.z) + fVar8 * sp18.z + sp24.z * pBr->m3F0 + sp0C.z; s16 atan2; s16 atan; atan = (s16)cM_atan2s(x, z); atan2 = -cM_atan2s(y, std::sqrtf(x * x + z * z)); cMtx_YrotS(*calc_mtx, atan); cMtx_XrotM(*calc_mtx, atan2); MtxPosition(&sp3C, &sp30); pBr->m3CC.x = pBr[-1].m3CC.x + sp30.x; pBr->m3CC.y = pBr[-1].m3CC.y + sp30.y; pBr->m3CC.z = pBr[-1].m3CC.z + sp30.z; } } /* 00001580-0000178C .text control2__FP12bridge_classP4br_s */ void control2(bridge_class* i_this, br_s* pBr) { cXyz sp18; cXyz sp0C; pBr += i_this->mBrCount - 2; sp18.x = 0.0f; sp18.y = 0.0f; sp18.z = 75.0f; for (s32 i = 0; i < i_this->mBrCount - 1; i++, pBr--) { f32 tmp = pBr->m3F8 * 0.5f + (pBr->m3FC * pBr->m3F0 * 0.5f + pBr->m3CC.y); f32 y = tmp - pBr[1].m3CC.y; f32 x = pBr->m3CC.x - pBr[1].m3CC.x; f32 z = pBr->m3CC.z - pBr[1].m3CC.z; s16 atan2; s16 atan; atan = (s16)cM_atan2s(x, z); atan2 = -cM_atan2s(y, std::sqrtf(x * x + z * z)); pBr[1].mRotation.y = atan; pBr[1].mRotation.x = atan2; cMtx_YrotS(*calc_mtx, atan); cMtx_XrotM(*calc_mtx, atan2); MtxPosition(&sp18, &sp0C); pBr->m3CC.x = pBr[1].m3CC.x + sp0C.x; pBr->m3CC.y = pBr[1].m3CC.y + sp0C.y; pBr->m3CC.z = pBr[1].m3CC.z + sp0C.z; } } /* 0000178C-000018A8 .text control3__FP12bridge_classP4br_s */ void control3(bridge_class* i_this, br_s* pBr) { f32 x = pBr->m3CC.x - pBr[1].m3CC.x; f32 y = pBr->m3CC.y - pBr[1].m3CC.y; f32 z = pBr->m3CC.z - pBr[1].m3CC.z; pBr->mRotation.y = cM_atan2s(x, z); pBr->mRotation.x = -cM_atan2s(y, std::sqrtf(x * x + z * z)); } /* 000018A8-00001B08 .text cut_control1__FP12bridge_classP4br_s */ void cut_control1(bridge_class* i_this, br_s* pBr) { cXyz sp24; cXyz sp18; cXyz spC; pBr++; cMtx_YrotS(*calc_mtx, i_this->actor.home.angle.y); sp24.x = 0.0f; sp24.y = 0.0f; sp24.z = 1.0f; MtxPosition(&sp24, &spC); sp24.z = 75.0f; for (s32 i = 1; i < i_this->m0304; i++, pBr++) { f32 fVar2 = pBr->m3CC.y + pBr->m3FC; f32 fVar1 = pBr->m3EC + 30.0f; if (fVar2 < fVar1) { fVar2 = fVar1; pBr->m407++; } f32 y = fVar2 - pBr[-1].m3CC.y; f32 x = spC.x + (pBr->m3CC.x - pBr[-1].m3CC.x); f32 z = spC.z + (pBr->m3CC.z - pBr[-1].m3CC.z); s16 atan2; s16 atan; atan = (s16)cM_atan2s(x, z); atan2 = -cM_atan2s(y, std::sqrtf(x * x + z * z)); pBr[-1].mRotation.y = atan + 0x8000; pBr[-1].mRotation.x = -atan2; if (i == i_this->m0304 - 1) { pBr[0].mRotation.y = atan + 0x8000; pBr[0].mRotation.x = -atan2; } cMtx_YrotS(*calc_mtx, atan); cMtx_XrotM(*calc_mtx, atan2); MtxPosition(&sp24, &sp18); pBr[0].m3CC.x = pBr[-1].m3CC.x + sp18.x; pBr[0].m3CC.y = pBr[-1].m3CC.y + sp18.y; pBr[0].m3CC.z = pBr[-1].m3CC.z + sp18.z; } } /* 00001B08-00001D84 .text cut_control2__FP12bridge_classP4br_s */ void cut_control2(bridge_class* i_this, br_s* pBr) { cXyz sp24; cXyz sp18; cXyz spC; pBr += i_this->mBrCount - 2; cMtx_YrotS(*calc_mtx, i_this->actor.home.angle.y); sp24.x = 0.0f; sp24.y = 0.0f; sp24.z = -1.0f; MtxPosition(&sp24, &spC); sp24.z = 75.0f; for (s32 i = 0; i < (i_this->mBrCount - 1) - i_this->m0304; i++, pBr--) { f32 fVar2 = pBr->m3CC.y + pBr->m3FC; f32 fVar1 = pBr->m3EC + 30.0f; if (fVar2 < fVar1) { fVar2 = fVar1; pBr->m407++; } f32 y = fVar2 - pBr[1].m3CC.y; f32 x = spC.x + (pBr->m3CC.x - pBr[1].m3CC.x); f32 z = spC.z + (pBr->m3CC.z - pBr[1].m3CC.z); s16 atan2; s32 atan; atan = cM_atan2s(x, z); atan2 = -cM_atan2s(y, std::sqrtf(x * x + z * z)); pBr[1].mRotation.y = atan; pBr[1].mRotation.x = atan2; if (i == (i_this->mBrCount - 2) - i_this->m0304) { pBr[0].mRotation.y = atan; pBr[0].mRotation.x = atan2; } cMtx_YrotS(*calc_mtx, atan); cMtx_XrotM(*calc_mtx, atan2); MtxPosition(&sp24, &sp18); pBr[0].m3CC.x = pBr[1].m3CC.x + sp18.x; pBr[0].m3CC.y = pBr[1].m3CC.y + sp18.y; pBr[0].m3CC.z = pBr[1].m3CC.z + sp18.z; } } /* 00001D84-00001FAC .text himo_cut_control1__FP4cXyz */ void himo_cut_control1(cXyz* pPos) { cXyz pos; cXyz sp18; cXyz transformedPos; pos.x = 0.0f; pos.y = 0.0f; pos.z = *wp * 7.0f; cMtx_YrotS(*calc_mtx, wy); MtxPosition(&pos, &transformedPos); pos.x = 0.0f; pos.y = 0.0f; pos.z = 23.0f; pPos++; for (s32 i = 1; i < 5; i++, pPos++) { f32 x = transformedPos.x + (pPos[0].x - pPos[-1].x); f32 y = (pPos[0].y - pPos[-1].y) - 10.0f; f32 z = transformedPos.z + (pPos[0].z - pPos[-1].z); s16 atan2; s32 atan; atan = cM_atan2s(x, z); atan2 = -cM_atan2s(y, std::sqrtf(x * x + z * z)); cMtx_YrotS(*calc_mtx, atan); cMtx_XrotM(*calc_mtx, atan2); MtxPosition(&pos, &sp18); pPos[0].x = pPos[-1].x + sp18.x; pPos[0].y = pPos[-1].y + sp18.y; pPos[0].z = pPos[-1].z + sp18.z; } } /* 00001FAC-00002A1C .text bridge_move__FP12bridge_class */ void bridge_move(bridge_class* i_this) { /* Nonmatching */ daPy_py_c* player = static_cast(dComIfGp_getPlayer(0)); s32 i; s32 j; br_s* pBr = &i_this->mBr[0]; cXyz sp38; cXyz sp2C; cXyz sp14; s16 my_tgt; f32 fVar14; f32 fVar2; f32 tmpf; s32 iVar11; switch (i_this->mMoveProcMode) { case 1: break; case 0: i_this->m02D9 = 0; i_this->mMoveProcMode = 2; fopAcM_OffStatus(&i_this->actor, fopAcStts_CULL_e); case 2: for (i = 0; i < i_this->mBrCount; i++) { if ((i_this->mTypeBits & 1) == 1) { i_this->mBr[i].m3F0 = 1.0f; } else { tmpf = ((f32)i / (i_this->mBrCount - 1)) * M_PI; i_this->mBr[i].m3F0 = std::fabsf(std::sinf(tmpf)); } i_this->mBr[i].m3A4 = i_this->mBr[i].m3A5 = 3; } i_this->mMoveProcMode = 3; case 3: i_this->m0300 += 3000; pBr->m3CC = i_this->actor.home.pos; if ((i_this->mTypeBits & 1) == 1) { cMtx_YrotS(*calc_mtx, i_this->actor.home.angle.y); sp38.x = i_this->m02F8 * cM_scos(i_this->m02EC) * -2.0f; sp38.y = sp38.z = 0.0f; MtxPosition(&sp38, &sp2C); pBr->m3CC += sp2C; } control1(i_this, pBr); (pBr + i_this->mBrCount - 1)->m3CC = i_this->mEndPos; if ((i_this->mTypeBits & 1) == 1) { (pBr + i_this->mBrCount - 1)->m3CC -= sp2C; } control2(i_this, pBr); control3(i_this, pBr); sp14 = i_this->actor.home.pos - pBr->m3CC; i_this->actor.current.pos = pBr->m3CC; i_this->actor.current.angle = pBr->mRotation; for (i = 0; i < i_this->mBrCount; i++, pBr++) { pBr->mPosition = pBr->m3CC; tmpf = (((f32)(i_this->mBrCount - i) / (f32)i_this->mBrCount) * 0.75f); pBr->mPosition.x += sp14.x * tmpf; pBr->mPosition.y += sp14.y * tmpf; pBr->mPosition.z += sp14.z * tmpf; if (pBr->m406 != 0) { for (j = -5; j <= 5; j++) { iVar11 = i + j; if ((iVar11 < 0) || (iVar11 >= i_this->mBrCount)) { continue; } my_tgt = (f32)pBr->m400 * ita_z_p[5 + j] * pBr[j].m3F0; cLib_addCalcAngleS2(&pBr[j].m402, my_tgt, 4, 0x800); cLib_addCalc2(&pBr[j].m3F8, pBr->m3F4 * ita_z_p[5 + j], 1.0f, 10.0f); } } if (((pBr->m408 & 4) != 0) && (pBr->m408 & 3) != 3) { fVar14 = 0.0f; fVar2 = -80.0f; if ((pBr->m408 & 3) == 1) { fVar14 = 7000.0f; fVar2 = -30.0f; } else if ((pBr->m408 & 3) == 2) { fVar14 = -7000.0f; fVar2 = -30.0f; } for (j = -5; j <= 5; j++) { iVar11 = i + j; if ((iVar11 < 0) || (iVar11 >= i_this->mBrCount)) { continue; } my_tgt = fVar14 * ita_z_p[5 + j] * pBr[j].m3F0; cLib_addCalcAngleS2(&pBr[j].m404, my_tgt, 4, 0x800); cLib_addCalc2(&pBr[j].m3F8, fVar2 * ita_z_p[5 + j], 1.0f, 15.0f); if (((pBr->m408 & 3) == 0) && ((i_this->mTypeBits & 4) == 0 && (j >= -2) && (j <= 2) && (pBr[j].m406 != 0))) { if (dComIfGp_event_runCheck()) { i_this->m0308 = 0; } else { i_this->m0308 += 2; } if (i_this->m0308 > 100) { i_this->mMoveProcMode = 4; i_this->m0304 = iVar11; if (i_this->m033C != 0) { dComIfGp_getVibration().StartShock(REG0_S(2) + 5, -0x21, cXyz(0.0f, 1.0f, 0.0f)); } break; } } if (pBr[j].m3F4 < -200.0f) { i_this->mMoveProcMode = 4; i_this->m0304 = iVar11; break; } } } if (((pBr->m408 & 4) != 0) && (pBr->m3A0[0] != 0 || (pBr->m3A0[1] != 0))) { f32 fVar141 = (pBr->m3A0[0] | pBr->m3A0[1]) * 150.0f; fVar14 = fVar141 * cM_ssin(i_this->m0300 * 4); for (j = -5; j <= 5; j++) { iVar11 = i + j; if (iVar11 < 0 || iVar11 >= i_this->mBrCount) { continue; } my_tgt = fVar14 * ita_z_p[5 + j] * pBr[j].m3F0; pBr[j].m404 += my_tgt; } } if (pBr->m406 != 0) { pBr->m406--; } pBr->m400 = 0; pBr->mRotation.z = pBr->m402 + pBr->m404; cLib_addCalcAngleS2(&pBr->m402, 0, 4, 0x400); cLib_addCalcAngleS2(&pBr->m404, 0, 4, 0x400); cLib_addCalc2(&pBr->m3FC, -15.0f, 1.0f, 5.0f); cLib_addCalc0(&pBr->m3F8, 1.0f, 5.0f); } if (i_this->m0308 != 0) { i_this->m0308--; } i_this->m02FC = i_this->m02E0; i_this->m02F4 = i_this->m02E0; i_this->m02F8 = i_this->m02E4; i_this->m02F2 = 3000; i_this->m02F0 = 0x578; if (*wp > 0.1f) { tmpf = 2.0f; } else { tmpf = 0.0f; } cLib_addCalc2(&i_this->m02E0, tmpf, 0.1f, 0.1f); cLib_addCalc2(&i_this->m02E4, tmpf * 0.3f, 0.1f, 0.05f); break; case 4: for (i = 0; i < i_this->mBrCount; i++, pBr++) { pBr->m3FC = 0.0f; if ((i == i_this->m0304) || (i == i_this->m0304 + -1) || (i == i_this->m0304 + 1)) { sp38 = pBr->mPosition; sp38.x += cM_rndFX(50.0f); sp38.z += cM_rndFX(50.0f); kikuzu_set(i_this, &sp38); sp38 = pBr->mPosition; sp38.x += cM_rndFX(50.0f); sp38.z += cM_rndFX(50.0f); kikuzu_set(i_this, &sp38); } } i_this->mMoveProcMode = 5; i_this->m0312 = 50; fopAcM_seStart(player, JA_SE_OBJ_SBRIDGE_BREAK, 0); case 5: pBr = &i_this->mBr[0]; if (i_this->m0312 != 0) { i_this->m0312--; } i_this->m0300 += 4000; pBr->m3CC = i_this->actor.home.pos; cut_control1(i_this, pBr); (pBr + i_this->mBrCount - 1)->m3CC = i_this->mEndPos; cut_control2(i_this, pBr); for (i = 0; i < i_this->mBrCount; i++, pBr++) { pBr->mPosition = pBr->m3CC; cLib_addCalc2(&pBr->m3FC, -50.0f, 1.0f, 5.0f); pBr->m3EC = -10000.0f; } break; } } /* 00002A1C-00002A8C .text s_a_b_sub__FPvPv */ void* s_a_b_sub(void* ac1, void* ac2) { if (fopAc_IsActor(ac1) && fpcM_GetName(ac1) == PROC_BRIDGE && ac1 != ac2) { bridge_class* bridge = (bridge_class*)ac1; if ((bridge->mTypeBits & 0x82) == 2) { return ac1; } } return NULL; } /* 00002A8C-00002AB8 .text search_aite__FP12bridge_class */ bridge_class* search_aite(bridge_class* i_this) { return (bridge_class*)fpcEx_Search(s_a_b_sub, &i_this->actor); } /* 00002AB8-00003C68 .text daBridge_Execute__FP12bridge_class */ static BOOL daBridge_Execute(bridge_class* i_this) { /* Nonmatching */ fopAc_ac_c* a_player = static_cast(dComIfGp_getPlayer(0)); daPy_py_c* player = static_cast(dComIfGp_getPlayer(0)); camera_class* pCam = dComIfGp_getCamera(0); s32 i; cXyz eyeDir = i_this->actor.current.pos - pCam->mLookat.mEye; cXyz spCC; if (i_this->m033C != 0) { i_this->m033C--; } if (eyeDir.abs() > 5000.0f) { spCC = pCam->mLookat.mCenter - pCam->mLookat.mEye; s16 atan = cM_atan2s(spCC.x, spCC.z); cMtx_YrotS(*calc_mtx, -atan); MtxPosition(&eyeDir, &spCC); if (spCC.z < 0.0f) { i_this->mbStopDraw = 1; return 1; } } i_this->mbStopDraw = 0; wind_vec = dKyw_get_wind_vec(); wy = cM_atan2s(wind_vec->x, wind_vec->z); wp = dKyw_get_wind_power(); i_this->m0302++; if (((i_this->mTypeBits & 2) != 0) && (i_this->mpAite == NULL)) { i_this->mpAite = search_aite(i_this); } bridge_move(i_this); i_this->m030C = 0; cXyz spC0; br_s* pBr = &i_this->mBr[0]; bool bGotFlamePos = false; if (player->getBokoFlamePos(&spC0) != FALSE) { bGotFlamePos = true; } for (i = 0; i < i_this->mBrCount; i++, pBr++) { MtxTrans(pBr->mPosition.x, pBr->mPosition.y, pBr->mPosition.z, false); cMtx_YrotM(*calc_mtx, pBr->mRotation.y); cMtx_XrotM(*calc_mtx, pBr->mRotation.x); cMtx_ZrotM(*calc_mtx, pBr->mRotation.z); if (i_this->m0304 != 0) { MtxTrans(0.0f, 0.0f, (i > i_this->m0304) ? 30.0f : -30.0f, true); } eyeDir.x = pBr->mScale.x * 99.0f; eyeDir.y = 0.0f; eyeDir.z = 0.0f; MtxPosition(&eyeDir, &pBr->m11C[1]); eyeDir.x *= -1.0f; MtxPosition(&eyeDir, &pBr->m0F8[1]); eyeDir.y = REG0_F(4) + -30.0f; MtxPosition(&eyeDir, &pBr->m0F8[2]); eyeDir.x *= -1.0f; MtxPosition(&eyeDir, &pBr->m11C[2]); if ((pBr->m408 & 4) != 0) { if (pBr->m418 != 0) { if (pBr->m418 > 0) { pBr->m418--; } f32 fVar19 = (i_this->mTypeBits & 1) ? 1000.0f : 200.0f; pBr->m11C[0] = pBr->m11C[1]; pBr->m11C[0].y += fVar19; pBr->m0F8[0] = pBr->m0F8[1]; pBr->m0F8[0].y += fVar19; if (((i_this->mTypeBits & 2) != 0) && (i == i_this->m02DD - 1)) { i_this->m0320 = pBr->m11C[0]; i_this->m032C = pBr->m0F8[0]; } } u32 soundId = 0; bool bVar1 = false; if ((i_this->mTypeBits & 9) == 0) { if (i_this->mBrCount - i < 3) { pBr->m408 = 0; } if (i_this->m0304 != 0) { pBr->m408 = pBr->m408 & 0xc; } CcAtInfo atInfo; if (pBr->mCyl[0].ChkTgHit() && (pBr->m3A0[0] < 10)) { pBr->mCyl[0].OnTgNoConHit(); pBr->m3A0[0] = 20; soundId = JA_SE_LK_CUT_SBRIDGE_ROPE; atInfo.mpObj = pBr->mCyl[0].GetTgHitObj(); at_power_check(&atInfo); if (atInfo.mDamage > 1) { atInfo.mDamage = 4; } pBr->m3A4 -= atInfo.mDamage; if (pBr->m3A4 <= 0) { pBr->m408 &= 0xE; } else { bVar1 = true; } dComIfGp_particle_set(dPa_name::ID_COMMON_NORMAL_HIT, &pBr->m3A8[0], &a_player->shape_angle); kikuzu_set(i_this, &pBr->m3A8[0]); } if (pBr->mCyl[1].ChkTgHit() && (pBr->m3A0[1] < 10)) { pBr->mCyl[1].OnTgNoConHit(); pBr->m3A0[1] = 20; soundId = JA_SE_LK_CUT_SBRIDGE_ROPE; atInfo.mpObj = pBr->mCyl[1].GetTgHitObj(); at_power_check(&atInfo); if (atInfo.mDamage > 1) { atInfo.mDamage = 4; } pBr->m3A5 -= atInfo.mDamage; if (pBr->m3A5 <= 0) { pBr->m408 &= 0xD; } else { bVar1 = true; } dComIfGp_particle_set(dPa_name::ID_COMMON_NORMAL_HIT, &pBr->m3A8[1], &a_player->shape_angle); kikuzu_set(i_this, &pBr->m3A8[1]); } } else { cXyz spB4; spB4.x = spB4.y = spB4.z = 2.0f; if (pBr->mCyl[0].ChkTgHit() && (pBr->m3A0[0] < 10)) { pBr->mCyl[0].OnTgNoConHit(); pBr->m3A0[0] = 15; soundId = JA_SE_LK_HIT_SBRIDGE_CHAIN; dComIfGp_particle_set(dPa_name::ID_COMMON_PURPLE_HIT, pBr->mCyl[0].GetTgHitPosP(), &a_player->shape_angle, &spB4); } if (pBr->mCyl[1].ChkTgHit() && (pBr->m3A0[1] < 10)) { pBr->mCyl[1].OnTgNoConHit(); pBr->m3A0[1] = 15; soundId = JA_SE_LK_HIT_SBRIDGE_CHAIN; dComIfGp_particle_set(dPa_name::ID_COMMON_PURPLE_HIT, pBr->mCyl[1].GetTgHitPosP(), &a_player->shape_angle, &spB4); } } if (soundId != 0) { if (((i_this->mTypeBits & 8) != 0) || bVar1) { soundId = JA_SE_LK_HIT_SBRIDGE_ROPE; } mDoAud_seStart(soundId, &pBr->m3CC, 0, dComIfGp_getReverb(fopAcM_GetRoomNo(&i_this->actor))); } cXyz spA8 = pBr->m11C[1]; if ((pBr->m408 & 1) == 0) { spA8.y -= 10000.0f; } pBr->mCyl[0].SetC(spA8); if (pBr->m3C0 != 0) { pBr->m3C0--; if (pBr->m3C4 != NULL) { mDoMtx_stack_c::transS(pBr->m11C[1].x, pBr->m11C[1].y + 100.0f, pBr->m11C[1].z); pBr->m3C4->setGlobalRTMatrix(mDoMtx_stack_c::get()); if (pBr->m3C0 == 0) { JPABaseEmitter* emitter = pBr->m3C4; emitter->becomeInvalidEmitter(); pBr->m3C4 = NULL; } } if (pBr->m3C0 == 0) { pBr->m408 &= 0xE; } } else if ((bGotFlamePos != 0) && ((i_this->mTypeBits & 9) == 0)) { spA8.y += 100.0f; cXyz sp48 = spA8 - spC0; sp48.y *= 0.4f; if (sp48.abs() < 50.0f) { pBr->m3C0 = 30; pBr->m3C4 = dComIfGp_particle_set(dPa_name::ID_SCENE_80EA, &spA8); } } spA8 = pBr->m0F8[1]; if ((pBr->m408 & 2) == 0) { spA8.y -= 10000.0f; } pBr->mCyl[1].SetC(spA8); if (pBr->m3C2 != 0) { pBr->m3C2--; if (pBr->m3C8 != NULL) { mDoMtx_stack_c::transS(pBr->m0F8[1].x, pBr->m0F8[1].y + 100.0f, pBr->m0F8[1].z); pBr->m3C8->setGlobalRTMatrix(mDoMtx_stack_c::get()); if (pBr->m3C2 == 0) { JPABaseEmitter* emitter = pBr->m3C8; emitter->becomeInvalidEmitter(); pBr->m3C8 = NULL; } } if (pBr->m3C2 == 0) { pBr->m408 &= 0xD; } } else if ((bGotFlamePos != 0) && ((i_this->mTypeBits & 9) == 0)) { spA8.y += 100.0f; cXyz sp48 = spA8 - spC0; sp48.y *= 0.4f; if (sp48.abs() < 50.0f) { pBr->m3C2 = 30; pBr->m3C8 = dComIfGp_particle_set(dPa_name::ID_SCENE_80EA, &spA8); } } dComIfG_Ccsp()->Set(&pBr->mCyl[0]); dComIfG_Ccsp()->Set(&pBr->mCyl[1]); } for (s32 i = 0; i < 2; i++) { if (pBr->m3A0[i] != 0) { pBr->m3A0[i]--; } } cMtx_YrotM(*calc_mtx, pBr->mRotationYExtra); if (i >= i_this->m02DD) { pBr->mScale.z = 0.0f; pBr->mScale.y = 0.0f; pBr->mScale.x = 0.0f; pBr->mpModel->setBaseScale(pBr->mScale); pBr->m408 = 0; } pBr->mpModel->setBaseTRMtx(*calc_mtx); if (((i_this->mTypeBits & 1) == 0) && ((pBr->m408 & 4) != 0)) { s32 idx; cXyz* segment0 = i_this->mLineMat.getPos(0); cXyz* segment1 = i_this->mLineMat.getPos(1); cXyz* segment00; cXyz* segment01; idx = i_this->m030C + 1; cXyz sp84; eyeDir.x = 0.0f; s16 tmpS = i_this->m02D9 * 0x5DC; eyeDir.z = *wp + 0.3f; eyeDir.z *= cM_ssin(tmpS + i_this->m0302 * 0x578) * 2.0f + 5.0f; cMtx_YrotS(*calc_mtx, wy); MtxPosition(&eyeDir, &sp84); if (pBr->m408 & 1) { segment0[idx] = pBr->m11C[0]; } else { cXyz sp30 = *(segment0 + idx - 1) - *(segment0 + idx + 1); f32 tmpF = pBr->m3A0[0] * cM_ssin(i_this->m0300 * 6); segment0[idx].x = sp84.x + (sp30.x * 0.5f + (*(segment0 + idx + 1)).x); segment0[idx].y = (tmpF + (sp30.y * 0.5f + (*(segment0 + idx + 1)).y)) - 10.0f; segment0[idx].z = sp84.z + (sp30.z * 0.5f + (*(segment0 + idx + 1)).z); segment00 = pBr->mLineMat1.getPos(0); segment01 = pBr->mLineMat1.getPos(2); *segment00 = segment0[idx]; himo_cut_control1(segment00); *segment01 = pBr->m11C[1]; himo_cut_control1(segment01); } if (pBr->m408 & 2) { segment1[idx] = pBr->m0F8[0]; } else { cXyz sp30 = *(segment1 + idx - 1) - *(segment1 + idx + 1); f32 tmpF = pBr->m3A0[1] * cM_ssin(i_this->m0300 * 6); segment1[idx].x = sp84.x + (sp30.x * 0.5f + (*(segment1 + idx + 1)).x); segment1[idx].y = (tmpF + (sp30.y * 0.5f + (*(segment1 + idx + 1)).y)) - 10.0f; segment1[idx].z = sp84.z + (sp30.z * 0.5f + (*(segment1 + idx + 1)).z); segment00 = pBr->mLineMat1.getPos(1); segment01 = pBr->mLineMat1.getPos(3); *segment00 = segment1[idx]; himo_cut_control1(segment00); *segment01 = pBr->m0F8[1]; himo_cut_control1(segment01); } i_this->m030C++; } } i_this->mpBgW->CopyBackVtx(); cBgD_Vtx_t* vtxTbl = i_this->mpBgW->GetVtxTbl(); s32 idx; s32 sw; s32 other_i = 0; for (i = 0; i < i_this->mpBgW->GetVtxNum(); i++, pBr++) { sw = i & 3; idx = i; idx >>= 2; if (idx < i_this->m02DD) { br_s* pBr = &i_this->mBr[idx]; switch (sw) { case 0: vtxTbl[i].x = pBr->m11C[2].x; vtxTbl[i].y = pBr->m11C[2].y; vtxTbl[i].z = pBr->m11C[2].z; break; case 1: vtxTbl[i].x = pBr->m0F8[2].x; vtxTbl[i].y = pBr->m0F8[2].y; vtxTbl[i].z = pBr->m0F8[2].z; break; case 2: vtxTbl[i].x = pBr->m11C[1].x; vtxTbl[i].y = pBr->m11C[1].y; vtxTbl[i].z = pBr->m11C[1].z; break; case 3: vtxTbl[i].x = pBr->m0F8[1].x; vtxTbl[i].y = pBr->m0F8[1].y; vtxTbl[i].z = pBr->m0F8[1].z; break; } if ((idx == 0) || (idx == i_this->m02DD - 1)) { cMtx_YrotS(*calc_mtx, pBr->mRotation.y); cMtx_XrotM(*calc_mtx, pBr->mRotation.x); eyeDir.y = 0.0f; eyeDir.x = 0.0f; if (idx == 0) { eyeDir.z = 50.0f; } else if (i_this->m02DD == i_this->mBrCount) { eyeDir.z = -50.0f; } else { eyeDir.z = -40.0f; } MtxPosition(&eyeDir, &spCC); vtxTbl[i].x += spCC.x; vtxTbl[i].y += spCC.y; vtxTbl[i].z += spCC.z; } other_i = i; } else { vtxTbl[i].x = vtxTbl[other_i].x; vtxTbl[i].y = vtxTbl[other_i].y; vtxTbl[i].z = vtxTbl[other_i].z; } if (i_this->mMoveProcMode >= 4) { vtxTbl[i].y = 10000.0f; } } i_this->mpBgW->Move(); g_env_light.settingTevStruct(TEV_TYPE_BG0, &i_this->actor.current.pos, &i_this->actor.tevStr); return TRUE; } /* 00003C68-00003CD4 .text daBridge_IsDelete__FP12bridge_class */ static BOOL daBridge_IsDelete(bridge_class* i_this) { br_s* pBr = &i_this->mBr[0]; for (s32 i = 0; i < i_this->mBrCount; i++, pBr++) { mDoAud_seDeleteObject(&pBr->m3CC); } return TRUE; } /* 00003CD4-00003D2C .text daBridge_Delete__FP12bridge_class */ static BOOL daBridge_Delete(bridge_class* i_this) { dComIfG_resDeleteDemo(&i_this->mPhase, "Bridge"); if (i_this->mpBgW != NULL) { dComIfG_Bgsp()->Release(i_this->mpBgW); } return TRUE; } /* 00003D2C-00003E00 .text CreateInit__FP10fopAc_ac_c */ void CreateInit(fopAc_ac_c* a_this) { static dCcD_SrcCyl himo_cyl_src = { // dCcD_SrcGObjInf { /* Flags */ 0, /* SrcObjAt Type */ 0, /* SrcObjAt Atp */ 0, /* SrcObjAt SPrm */ 0, /* SrcObjTg Type */ AT_TYPE_ALL & ~AT_TYPE_BOOMERANG & ~AT_TYPE_WATER & ~AT_TYPE_UNK20000 & ~AT_TYPE_WIND & ~AT_TYPE_UNK400000 & ~AT_TYPE_LIGHT, /* SrcObjTg SPrm */ cCcD_TgSPrm_Set_e | cCcD_TgSPrm_IsEnemy_e, /* SrcObjCo SPrm */ cCcD_CoSPrm_Set_e | cCcD_CoSPrm_IsPlayer_e | cCcD_CoSPrm_VsGrpAll_e, /* SrcGObjAt Se */ 0, /* SrcGObjAt HitMark */ dCcG_AtHitMark_None_e, /* SrcGObjAt Spl */ dCcG_At_Spl_UNK0, /* SrcGObjAt Mtrl */ 0, /* SrcGObjAt SPrm */ 0, /* SrcGObjTg Se */ 0, /* SrcGObjTg HitMark */ dCcG_TgHitMark_Unk255_e, /* SrcGObjTg Spl */ dCcG_Tg_Spl_UNK0, /* SrcGObjTg Mtrl */ 0, /* SrcGObjTg SPrm */ dCcG_TgSPrm_Shield_e, /* SrcGObjCo SPrm */ 0, }, // cM3dGCylS {{ /* Center */ {0.0f, 0.0f, 0.0f}, /* Radius */ 5.0f, /* Height */ 1000.0f, }}, }; bridge_class* i_this = (bridge_class*)a_this; i_this->mStts.Init(0xFF, 0xFF, a_this); br_s* pBr = i_this->mBr; for (s32 i = 0; i < i_this->mBrCount; i++, pBr++) { for (s32 j = 0; j < 2; j++) { pBr->mCyl[j].Set(himo_cyl_src); pBr->mCyl[j].SetStts(&i_this->mStts); if ((i_this->mTypeBits & 1) == 0) { pBr->mCyl[j].SetH(200.0f); pBr->mCyl[j].OffTgShield(); } } } } /* 00003E00-00004310 .text CallbackCreateHeap__FP10fopAc_ac_c */ static BOOL CallbackCreateHeap(fopAc_ac_c* a_this) { static const s32 bridge_bmd[] = { BRIDGE_BDL_OBM_BRIDGE, BRIDGE_BDL_OBM_BRIDGE2 }; bridge_class* i_this = (bridge_class*)a_this; s32 modelNum = i_this->mTypeBits & 1; if (i_this->mTypeBits & 4) { modelNum = 1; } J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("Bridge", bridge_bmd[modelNum]); JUT_ASSERT(DEMO_SELECT(2334, 2336), modelData != NULL); J3DModelData* modelData2; if (modelNum == 1) { modelData2 = (J3DModelData*)dComIfG_getObjectRes("Bridge", BRIDGE_BDL_OBM_CHAIN1); JUT_ASSERT(DEMO_SELECT(2340, 2342), modelData2 != NULL); } br_s* pBr = i_this->mBr; s32 iVar8 = 2; if (i_this->mTypeBits & 1) { iVar8 = 0; } for (s32 i = 0; i < i_this->mBrCount; i++, pBr++) { pBr->mpModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11020002); if (pBr->mpModel == NULL) { return FALSE; } if ((i_this->mTypeBits & 4) == 0) { if (((i + iVar8) & 3) == 0) { pBr->m408 = 7; if ((i_this->mTypeBits & 1) == 1) { pBr->m418 = 0x32; pBr->mpModelRope0 = mDoExt_J3DModel__create(modelData2, 0x80000, 0x11020002); pBr->mpModelRope1 = mDoExt_J3DModel__create(modelData2, 0x80000, 0x11020002); if ((pBr->mpModelRope0 == NULL) || (pBr->mpModelRope1 == NULL)) { return FALSE; } } else { pBr->m418 = -1; BOOL res; if (i_this->mTypeBits & 8) { res = pBr->mLineMat1.init(4, 5, (ResTIMG*)dComIfG_getObjectRes("Always", ALWAYS_BTI_TXM_ROPE1), 1); } else { res = pBr->mLineMat1.init(4, 5, (ResTIMG*)dComIfG_getObjectRes("Always", ALWAYS_BTI_ROPE), 1); } if (!res) { return FALSE; } } } if (i == 0) { BOOL res; if (i_this->mTypeBits & 8) { res = i_this->mLineMat.init(2, 14, (ResTIMG*)dComIfG_getObjectRes("Always", ALWAYS_BTI_TXM_ROPE1), 0); } else { res = i_this->mLineMat.init(2, 14, (ResTIMG*)dComIfG_getObjectRes("Always", ALWAYS_BTI_ROPE), 0); } if (!res) { return FALSE; } } } if ((i_this->mTypeBits & 1) == 0) { pBr->mScale.y = cM_rndF(0.3f) + 1.0f; if (((i + iVar8) & 3) == 0) { pBr->mScale.x = 1.05f; } else { pBr->mScale.x = cM_rndF(0.1f) + 1.0f; } } else { pBr->mScale.y = 1.0f; pBr->mScale.x = 1.0f; } pBr->mScale.z = 1.5f; pBr->mpModel->setBaseScale(pBr->mScale); if (cM_rndF(1.0f) < 0.5f) { pBr->mRotationYExtra = -0x8000; } } i_this->mpBgW = new dBgWSv(); if (i_this->mpBgW == NULL) { return FALSE; } if ((i_this->mTypeBits & 1) == 1) { cBgD_t* cBgD = (cBgD_t*)dComIfG_getObjectRes("Bridge", BRIDGE_DZB_MBRDG2); #if VERSION == VERSION_DEMO i_this->mpBgW->Set(cBgD, 0); #else if (i_this->mpBgW->Set(cBgD, 0)) { return FALSE; } #endif } else { cBgD_t* cBgD = (cBgD_t*)dComIfG_getObjectRes("Bridge", BRIDGE_DZB_MBRDG); #if VERSION == VERSION_DEMO i_this->mpBgW->Set(cBgD, 0); #else if (i_this->mpBgW->Set(cBgD, 0)) { return FALSE; } #endif } i_this->mpBgW->SetRideCallback(ride_call_back); i_this->mpBgW->CopyBackVtx(); cBgD_Vtx_t* vtxTbl = i_this->mpBgW->GetVtxTbl(); for (s32 i = 0; i < i_this->mpBgW->GetVtxNum(); i++) { vtxTbl[i].x = i_this->actor.current.pos.x; vtxTbl[i].y = i_this->actor.current.pos.y; vtxTbl[i].z = i_this->actor.current.pos.z; } i_this->mpBgW->Move(); return TRUE; } /* 00004310-00004770 .text daBridge_Create__FP10fopAc_ac_c */ static cPhs_State daBridge_Create(fopAc_ac_c* a_this) { bridge_class* i_this = (bridge_class*)a_this; #if VERSION == VERSION_DEMO cPhs_State ret = dComIfG_resLoad(&i_this->mPhase, "Bridge"); if (ret == cPhs_COMPLEATE_e) { fopAcM_SetupActor(&i_this->actor, bridge_class); #else fopAcM_SetupActor(&i_this->actor, bridge_class); cPhs_State ret = dComIfG_resLoad(&i_this->mPhase, "Bridge"); if (ret == cPhs_COMPLEATE_e) { #endif i_this->mTypeBits = fopAcM_GetParam(a_this); if (i_this->mTypeBits == 0xFF) { i_this->mTypeBits = 0; } i_this->m02D9 = (fopAcM_GetParam(a_this) >> 8) & 0xFF; i_this->mPathId = (fopAcM_GetParam(a_this) >> 0x10) & 0xFF; if (i_this->mPathId == 0xFF) { return cPhs_ERROR_e; } dPath* dPath = dPath_GetRoomPath(i_this->mPathId, fopAcM_GetRoomNo(a_this)); if (dPath != NULL) { dPnt* point = &dPath->m_points[0]; a_this->home.pos = point->m_position; point++; i_this->mEndPos = point->m_position; cXyz delta = i_this->mEndPos - a_this->home.pos; a_this->home.angle.y = cM_atan2s(delta.x, delta.z); a_this->home.angle.x = -cM_atan2s(delta.y, std::sqrtf(delta.x * delta.x + delta.z * delta.z)); f32 fVar1 = 0.0f; if (delta.abs() > 1300.0f) { fVar1 = 3.0f; } i_this->mBrCount = delta.abs() / ((fVar1 + 47.0f) * 1.5f); i_this->mPathIdP = i_this->mPathId + 1; } else { return cPhs_ERROR_e; } if (i_this->mBrCount >= 50) { return cPhs_ERROR_e; } if (!fopAcM_entrySolidHeap(a_this, CallbackCreateHeap, 0x2FB60)) { return cPhs_ERROR_e; } CreateInit(a_this); if (i_this->mpBgW != NULL && dComIfG_Bgsp()->Regist(i_this->mpBgW, a_this)) { return cPhs_ERROR_e; } fopAcM_SetMtx(a_this, i_this->mBr[0].mpModel->getBaseTRMtx()); fopAcM_setCullSizeBox(a_this, -120.0f, -30.0f, -60.0f, 120.0f, 30.0f, 60.0f); fopAcM_setCullSizeFar(a_this, 10.0f); if ((i_this->mTypeBits & 2) != 0) { if (i_this->mBrCount >= 16) { i_this->m02DD = 15; } else if (i_this->mBrCount >= 12) { i_this->m02DD = 11; } else { i_this->m02DD = 7; } } else { i_this->m02DD = i_this->mBrCount; } } return ret; } static actor_method_class l_daBridge_Method = { (process_method_func)daBridge_Create, (process_method_func)daBridge_Delete, (process_method_func)daBridge_Execute, (process_method_func)daBridge_IsDelete, (process_method_func)daBridge_Draw, }; actor_process_profile_definition g_profile_BRIDGE = { /* LayerID */ fpcLy_CURRENT_e, /* ListID */ 0x0003, /* ListPrio */ fpcPi_CURRENT_e, /* ProcName */ PROC_BRIDGE, /* Proc SubMtd */ &g_fpcLf_Method.base, /* Size */ sizeof(bridge_class), /* SizeOther */ 0, /* Parameters */ 0, /* Leaf SubMtd */ &g_fopAc_Method.base, /* Priority */ PRIO_BRIDGE, /* Actor SubMtd */ &l_daBridge_Method, /* Status */ fopAcStts_CULL_e | fopAcStts_UNK4000_e | fopAcStts_UNK40000_e, /* Group */ fopAc_ACTOR_e, /* CullType */ fopAc_CULLBOX_CUSTOM_e, };