diff options
| author | 123456789758 <205478182+123456789758@users.noreply.github.com> | 2025-05-31 17:06:01 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-05-31 17:06:01 -0400 |
| commit | f71ec718fe9c74e74267c89afd34ccfd209793a2 (patch) | |
| tree | 806b853affb9b16cfe124f54197a13060d6aa8e8 /src/d/actor/d_a_ff.cpp | |
| parent | 46f3fdddaf8a49ed6447befc57f3feecd364c733 (diff) | |
d_a_ff - 98% matching (#776)
Co-authored-by: < >
Diffstat (limited to 'src/d/actor/d_a_ff.cpp')
| -rw-r--r-- | src/d/actor/d_a_ff.cpp | 345 |
1 files changed, 324 insertions, 21 deletions
diff --git a/src/d/actor/d_a_ff.cpp b/src/d/actor/d_a_ff.cpp index ffeeb64c..c33fc0da 100644 --- a/src/d/actor/d_a_ff.cpp +++ b/src/d/actor/d_a_ff.cpp @@ -1,55 +1,358 @@ -// -// Generated by dtk -// Translation Unit: d_a_ff.cpp -// +/** + * d_a_ff.cpp + * Object - Firefly (not collectable) + */ #include "d/actor/d_a_ff.h" +#include "d/actor/d_a_player.h" +#include "d/d_bg_s_gnd_chk.h" +#include "d/d_com_inf_game.h" #include "d/d_procname.h" #include "d/d_priority.h" +#include "d/d_s_play.h" +#include "m_Do/m_Do_lib.h" +#include "d/res/res_ff.h" + +static s32 ff_count = 0; /* 00000078-000001E4 .text fire_fly_draw__FP8ff_class */ -void fire_fly_draw(ff_class*) { - /* Nonmatching */ +static void fire_fly_draw(ff_class* i_this) { + MtxTrans(i_this->current.pos.x, i_this->current.pos.y, i_this->current.pos.z, false); + MtxScale(i_this->mScale, i_this->mScale, i_this->mScale, true); + i_this->mpModel[0]->setBaseTRMtx(*calc_mtx); + if (i_this->mScale > 0.01f) { + i_this->mBrkAnm[0]->play(); + i_this->mBrkAnm[0]->entry(i_this->mpModel[0]->getModelData()); + dComIfGd_setListMaskOff(); + mDoExt_modelUpdate(i_this->mpModel[0]); + if (i_this->mGlowScale > 0.01f) { + mDoMtx_YrotM(*calc_mtx, i_this->mLiveTimer * 0x100); + MtxScale(i_this->mGlowScale, i_this->mGlowScale * i_this->mGlowScaleY, + i_this->mGlowScale, true); + i_this->mpModel[1]->setBaseTRMtx(*calc_mtx); + i_this->mBrkAnm[1]->play(); + i_this->mBrkAnm[1]->entry(i_this->mpModel[1]->getModelData()); + mDoExt_modelUpdate(i_this->mpModel[1]); + } + dComIfGd_setList(); + } } /* 000001E4-000002EC .text z_check__FP8ff_classP4cXyz */ -void z_check(ff_class*, cXyz*) { - /* Nonmatching */ +static void z_check(ff_class* i_this, cXyz* param_2) { + u32 local_28; + + if ((param_2->x < 0.0f) || (param_2->x > 638.99f) || (param_2->y < 0.0f) || + (param_2->y > 526.99f) || (param_2->z >= 0.0f)) + { + i_this->mbNotVisibleZ = 1; + } else { + GXDrawDone(); + GXPeekZ((u16)param_2->x, (u16)param_2->y, &local_28); + f32 fVar1 = 0.5f - param_2->z * -1.0f; + if (fVar1 < 0.0f) { + fVar1 = 0.0f; + } + if ((u32)(fVar1 * 33553002.0f) > local_28) { + i_this->mbNotVisibleZ = 1; + } else { + i_this->mbNotVisibleZ = 0; + } + } } /* 000002EC-0000037C .text daFf_Draw__FP8ff_class */ -static BOOL daFf_Draw(ff_class*) { - /* Nonmatching */ +static BOOL daFf_Draw(ff_class* i_this) { + cXyz cStack_18; + + mDoLib_project(&i_this->current.pos, &cStack_18); + z_check(i_this, &cStack_18); + if (i_this->mbNotVisibleZ != 0) { + cLib_addCalc0(&i_this->mGlowScale, 1.0f, 0.33333f); + } else { + cLib_addCalc2(&i_this->mGlowScale, 1.0f, 1.0f, 0.3333f); + } + fire_fly_draw(i_this); + return TRUE; } /* 0000037C-00000D18 .text fire_fly_move__FP8ff_class */ -void fire_fly_move(ff_class*) { - /* Nonmatching */ +static void fire_fly_move(ff_class* i_this) { + /* Nonmatching - regalloc */ + s8 cVar1; + f32 fVar2; + f32 fVar3; + f32 dVar7; + f32 dVar8; + f32 dVar9; + f32 fVar10; + cXyz local_cc; + + daPy_py_c* player = (daPy_py_c*)dComIfGp_getPlayer(0); + dBgS_GndChk chk; + i_this->mLiveTimer++; + if (i_this->mTimers[2] == 0) { + i_this->mTimers[1] = cM_rndF(50.0f) + 40.0f; + i_this->mTimers[2] = cM_rndF(200.0f) + 100.0f; + } + if (i_this->mTimers[1] == 0) { + i_this->mScaleTarget = cM_ssin(i_this->mLiveTimer * 1000) * 0.15f * 0.25f + 0.225f; + } else { + i_this->mScaleTarget = 0.0f; + } + cLib_addCalc2(&i_this->mScale, i_this->mScaleTarget, 0.1f, 0.05f); + cVar1 = i_this->mState; + switch (cVar1) { + case 0: + Vec pos; + pos = i_this->current.pos; + pos.y += 250.0f; + chk.SetPos(&pos); + fVar10 = dComIfG_Bgsp()->GroundCross(&chk); + i_this->mGroundY = fVar10 + 12.5f; + if (i_this->mbNoUseGroundY == 0) { + i_this->current.pos.y = i_this->mGroundY; + } + i_this->mHomePos = i_this->current.pos; + i_this->mState++; + cLib_addCalc2(&i_this->current.pos.x, i_this->mHomePos.x, 0.1f, std::abs(i_this->speed.x)); + cLib_addCalc2(&i_this->current.pos.y, i_this->mHomePos.y, 0.1f, std::abs(i_this->speed.y)); + cLib_addCalc2(&i_this->current.pos.z, i_this->mHomePos.z, 0.1f, std::abs(i_this->speed.z)); + fVar10 = player->current.pos.x - i_this->current.pos.x; + fVar2 = player->current.pos.y - i_this->current.pos.y; + fVar3 = player->current.pos.z - i_this->current.pos.z; + fVar10 = std::sqrtf(fVar3 * fVar3 + fVar10 * fVar10 + fVar2 * fVar2); + if (fVar10 < 250.0f) { + i_this->mState++; + fVar10 = cM_rndF(100.0f); + i_this->mTimers[3] = (fVar10 + 1000.0f); + i_this->current.angle.x = -0x3000; + i_this->speedF = 10.0f; + } + break; + case 2: + if (i_this->mTimers[0] == 0) { + i_this->mScatterPos.x = i_this->mHomePos.x + cM_rndFX(750.0f); + i_this->mScatterPos.z = i_this->mHomePos.z + cM_rndFX(750.0f); + i_this->mScatterPos.y = i_this->mHomePos.y + cM_rndFX(225.0f) + 137.5f; + i_this->mRotVel = 0.0f; + i_this->mVelocityFwdTarget = cM_rndF(20.0f) + 10.0f; + fVar2 = i_this->mScatterPos.x - i_this->current.pos.x; + dVar7 = i_this->mScatterPos.y - i_this->current.pos.y; + fVar3 = i_this->mScatterPos.z - i_this->current.pos.z; + dVar9 = fVar3 * fVar3; + dVar8 = fVar2 * fVar2; + fVar10 = std::sqrtf(dVar9 + (dVar8 + (dVar7 * dVar7))); + i_this->mTimers[0] = fVar10 / i_this->mVelocityFwdTarget; + i_this->mTargetRotY = cM_atan2s(fVar2, fVar3); + fVar10 = std::sqrtf(dVar8 + dVar9); + i_this->mTargetRotX = -cM_atan2s(dVar7, fVar10); + } + if (i_this->mTimers[3] == 0) { + i_this->mState++; + i_this->mScatterPos.x = i_this->mHomePos.x; + i_this->mScatterPos.y = i_this->mHomePos.y; + i_this->mScatterPos.z = i_this->mHomePos.z; + i_this->mRotVel = 0.0f; + } + break; + case 4: + /* attacked */ + fVar10 = i_this->mScatterPos.x - i_this->current.pos.x; + dVar8 = fVar10; + dVar7 = i_this->mScatterPos.y - i_this->current.pos.y; + fVar2 = i_this->mScatterPos.z - i_this->current.pos.z; + dVar9 = fVar2; + i_this->mTargetRotY = cM_atan2s(fVar10, fVar2); + dVar8 = dVar8 * dVar8; + dVar9 = dVar9 * dVar9; + fVar10 = std::sqrtf(dVar8 + dVar9); + i_this->mTargetRotX = -cM_atan2s(dVar7, fVar10); + if ((dVar9 + (dVar8 + (dVar7 * dVar7))) < 2500.0f) { + i_this->mState = 1; + } + cLib_addCalc2(&i_this->mRotVel, 10.0f, 1.0f, 0.15f); + break; + default: + if (i_this->mTimers[4] == 0) { + i_this->mState = 2; + fVar10 = cM_rndF(100.0f); + i_this->mTimers[3] = (fVar10 + 1000.0f); + } else { + i_this->mVelImpulse += i_this->m2C0; + fVar10 = cM_rndF(1.0f); + if (fVar10 < REG13_F(0) + 0.1f) { + fVar10 = cM_rndFX(REG13_F(1) + 1.0f); + i_this->m2C0.x = fVar10; + } + fVar10 = cM_rndF(1.0f); + if (fVar10 < REG13_F(0) + 0.1f) { + fVar10 = cM_rndFX(REG13_F(1) + 1.0f); + i_this->m2C0.z = fVar10; + } + i_this->m2C0.y = REG13_F(2) + 2.0f; + if (i_this->mVelImpulse.y > REG13_F(3) + 10.0f) { + i_this->mVelImpulse.y = REG13_F(3) + 10.0f; + } + } + break; + } + cLib_addCalcAngleS2(&i_this->current.angle.y, i_this->mTargetRotY, 10, + i_this->mRotVel * 500.0f); + cLib_addCalcAngleS2(&i_this->current.angle.x, i_this->mTargetRotX, 10, + i_this->mRotVel * 500.0f); + cLib_addCalc2(&i_this->mRotVel, 1.0f, 1.0f, 0.1f); + cLib_addCalc2(&i_this->speedF, i_this->mVelocityFwdTarget, 1.0f, 3.0f); + local_cc.x = 0.0f; + local_cc.y = 0.0f; + local_cc.z = i_this->speedF * 0.25f; + mDoMtx_YrotS(*calc_mtx, i_this->current.angle.y); + mDoMtx_XrotM(*calc_mtx, i_this->current.angle.x); + MtxPosition(&local_cc, &i_this->speed); + i_this->current.pos += (i_this->speed + i_this->mVelImpulse); + cLib_addCalc0(&i_this->mVelImpulse.x, 1.0f, 0.1f); + cLib_addCalc0(&i_this->mVelImpulse.y, 1.0f, 0.1f); + cLib_addCalc0(&i_this->mVelImpulse.z, 1.0f, 0.1f); + if (i_this->current.pos.y < i_this->mGroundY + 12.5f) { + if (i_this->current.pos.y < i_this->mGroundY) { + i_this->current.pos.y = i_this->mGroundY; + } + cLib_addCalc2(&i_this->mGlowScaleY, 0.5f, 0.2f, 0.1f); + } else { + cLib_addCalc2(&i_this->mGlowScaleY, 1.0f, 0.2f, 0.1f); + } } /* 00001098-00001168 .text daFf_Execute__FP8ff_class */ -static BOOL daFf_Execute(ff_class*) { - /* Nonmatching */ +static BOOL daFf_Execute(ff_class* i_this) { + s16 sVar1; + int iVar3; + + for (iVar3 = 0; iVar3 < 5; iVar3++) { + sVar1 = i_this->mTimers[iVar3]; + if (sVar1 != 0) { + i_this->mTimers[iVar3]--; + } + } + fire_fly_move(i_this); + if (i_this->mSph.ChkTgHit() != 0) { + i_this->mState = 4; + i_this->mTimers[4] = REG13_F(9) + (cM_rndF(20.0f) + 30.0f); + } + i_this->mSph.SetC(i_this->current.pos); + g_dComIfG_gameInfo.play.mCcS.Set(&i_this->mSph); + return TRUE; } /* 00001168-00001170 .text daFf_IsDelete__FP8ff_class */ static BOOL daFf_IsDelete(ff_class*) { - /* Nonmatching */ + return TRUE; } /* 00001170-000011AC .text daFf_Delete__FP8ff_class */ -static BOOL daFf_Delete(ff_class*) { - /* Nonmatching */ +static BOOL daFf_Delete(ff_class* i_this) { + dComIfG_resDelete(&i_this->mPhs, "Ff"); + ff_count = 0; + return TRUE; } /* 000011AC-0000138C .text useHeapInit__FP10fopAc_ac_c */ -static BOOL useHeapInit(fopAc_ac_c*) { - /* Nonmatching */ +static BOOL useHeapInit(fopAc_ac_c* i_this) { + static u32 ho_bmd[] = {FF_BMD_HO, FF_BMD_HOP}; + static u32 ho_brk[] = {FF_BRK_HO, FF_BRK_HOP}; + ff_class* a_this = (ff_class*)i_this; + + for (int i = 0; i < 2; i++) { + J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("Ff", ho_bmd[i]); + JUT_ASSERT(719, modelData != NULL); + if (modelData == NULL) { + return FALSE; + } + a_this->mpModel[i] = mDoExt_J3DModel__create(modelData, 0x10000, 0x11020203); + if (a_this->mpModel[i] == NULL) { + return FALSE; + } + a_this->mBrkAnm[i] = new mDoExt_brkAnm(); + if (a_this->mBrkAnm[i] == NULL) { + return FALSE; + } + J3DAnmTevRegKey* pJVar5 = (J3DAnmTevRegKey*)dComIfG_getObjectRes("Ff", ho_brk[i]); + modelData = a_this->mpModel[i]->getModelData(); + int iVar6 = a_this->mBrkAnm[i]->init(modelData, pJVar5, true, J3DFrameCtrl::EMode_LOOP, + 0.9f + cM_rndF(0.15f), 0, -1, false, 0); + if (iVar6 == 0) { + return FALSE; + } + } + return TRUE; } /* 000013D4-0000164C .text daFf_Create__FP10fopAc_ac_c */ -static cPhs_State daFf_Create(fopAc_ac_c*) { - /* Nonmatching */ +static cPhs_State daFf_Create(fopAc_ac_c* i_this) { + fopAcM_SetupActor(i_this, ff_class); + ff_class* a_this = (ff_class*)i_this; + cPhs_State phase_state = dComIfG_resLoad(&a_this->mPhs, "Ff"); + + if (phase_state == cPhs_COMPLEATE_e) { + if (fopAcM_entrySolidHeap(a_this, useHeapInit, 0x2320)) { + int uVar1 = fopAcM_GetParam(a_this) & 0xFF; + if (uVar1 != 0) { + a_this->base.mParameters = fopAcM_GetParam(a_this) & 0xFF00; + for (int iVar7 = 0; iVar7 < uVar1; iVar7 = iVar7 + 1) { + fopAcM_prm_class* pfVar4 = fopAcM_CreateAppend(); + pfVar4->base.position.x = a_this->current.pos.x + cM_rndFX(500.0f); + pfVar4->base.position.y = a_this->current.pos.y; + pfVar4->base.position.z = a_this->current.pos.z + cM_rndFX(500.0f); + pfVar4->base.angle.z = 0; + pfVar4->base.angle.y = 0; + pfVar4->base.angle.x = 0; + pfVar4->base.parameters = fopAcM_GetParam(a_this); + fopAcM_create(PROC_FF, NULL, pfVar4); + } + } + a_this->mbNoUseGroundY = fopAcM_GetParam(a_this) >> 8; + ff_count++; + a_this->cullMtx = a_this->mpModel[0]->getBaseTRMtx(); + a_this->mHomePos = a_this->current.pos; + a_this->m2EC = a_this->mHomePos; + a_this->mLiveTimer = cM_rndF(32768.0f); + a_this->mTimers[2] = cM_rndF(100.0f); + static dCcD_SrcSph cc_sph_src = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ 0, + /* SrcObjAt Atp */ 0, + /* SrcObjAt SPrm */ 0, + /* SrcObjTg Type */ AT_TYPE_WIND, + /* SrcObjTg SPrm */ cCcD_TgSPrm_Set_e | cCcD_TgSPrm_IsEnemy_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 */ 0, + /* SrcGObjCo SPrm */ 0, + }, + // cM3dGSphS + { + /* Center */ 0.0f, 0.0f, 0.0f, + /* Radius */ 60.0f, + }, + }; + a_this->mStts.Init(200, 0, a_this); + a_this->mSph.Set(cc_sph_src); + a_this->mSph.SetStts(&a_this->mStts); + } else { + return phase_state = cPhs_ERROR_e; + } + } + return phase_state; } static actor_method_class l_daFf_Method = { |
