#include "z_en_ny.h" #include "objects/object_ny/object_ny.h" #define FLAGS (ACTOR_FLAG_0 | ACTOR_FLAG_2) void EnNy_Init(Actor* thisx, GlobalContext* globalCtx); void EnNy_Destroy(Actor* thisx, GlobalContext* globalCtx); void EnNy_Update(Actor* thisx, GlobalContext* globalCtx); void EnNy_Draw(Actor* thisx, GlobalContext* globalCtx); void EnNy_UpdateUnused(Actor* thisx, GlobalContext* globalCtx); void EnNy_Move(EnNy* this, GlobalContext* globalCtx); void EnNy_Die(EnNy* this, GlobalContext* globalCtx); void func_80ABCD40(EnNy* this); void func_80ABCDBC(EnNy* this); void EnNy_TurnToStone(EnNy* this, GlobalContext* globalCtx); void func_80ABD11C(EnNy* this, GlobalContext* globalCtx); void func_80ABCE50(EnNy* this, GlobalContext* globalCtx); void func_80ABCE90(EnNy* this, GlobalContext* globalCtx); void func_80ABCEEC(EnNy* this, GlobalContext* globalCtx); void EnNy_UpdateDeath(Actor* thisx, GlobalContext* GlobalContext); void EnNy_SetupDie(EnNy* this, GlobalContext* globalCtx); void EnNy_DrawDeathEffect(Actor* thisx, GlobalContext* GlobalContext); void func_80ABD3B8(EnNy* this, f32, f32); const ActorInit En_Ny_InitVars = { ACTOR_EN_NY, ACTORCAT_ENEMY, FLAGS, OBJECT_NY, sizeof(EnNy), (ActorFunc)EnNy_Init, (ActorFunc)EnNy_Destroy, (ActorFunc)EnNy_Update, (ActorFunc)EnNy_Draw, NULL, }; static ColliderJntSphElementInit sJntSphElementsInit[1] = { { { ELEMTYPE_UNK0, { 0xFFCFFFFF, 0x04, 0x08 }, { 0xFFCFFFFF, 0x00, 0x00 }, TOUCH_ON | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_ON, }, { 0, { { 0, 0, 0 }, 15 }, 100 }, }, }; static ColliderJntSphInit sColliderInit = { { COLTYPE_NONE, AT_ON | AT_TYPE_ENEMY, AC_ON | AC_TYPE_PLAYER, OC1_ON | OC1_TYPE_ALL, OC2_TYPE_1, COLSHAPE_JNTSPH, }, 1, sJntSphElementsInit, }; static DamageTable sDamageTable = { /* Deku nut */ DMG_ENTRY(0, 0x0), /* Deku stick */ DMG_ENTRY(0, 0x0), /* Slingshot */ DMG_ENTRY(0, 0x0), /* Explosive */ DMG_ENTRY(2, 0xF), /* Boomerang */ DMG_ENTRY(0, 0x0), /* Normal arrow */ DMG_ENTRY(2, 0xF), /* Hammer swing */ DMG_ENTRY(2, 0xF), /* Hookshot */ DMG_ENTRY(2, 0x1), /* Kokiri sword */ DMG_ENTRY(0, 0x0), /* Master sword */ DMG_ENTRY(2, 0xF), /* Giant's Knife */ DMG_ENTRY(4, 0xF), /* Fire arrow */ DMG_ENTRY(4, 0x2), /* Ice arrow */ DMG_ENTRY(2, 0xF), /* Light arrow */ DMG_ENTRY(2, 0xF), /* Unk arrow 1 */ DMG_ENTRY(4, 0xE), /* Unk arrow 2 */ DMG_ENTRY(0, 0x0), /* Unk arrow 3 */ DMG_ENTRY(0, 0x0), /* Fire magic */ DMG_ENTRY(4, 0x2), /* Ice magic */ DMG_ENTRY(0, 0x0), /* Light magic */ DMG_ENTRY(0, 0x0), /* Shield */ DMG_ENTRY(0, 0x0), /* Mirror Ray */ DMG_ENTRY(0, 0x0), /* Kokiri spin */ DMG_ENTRY(0, 0x0), /* Giant spin */ DMG_ENTRY(4, 0xF), /* Master spin */ DMG_ENTRY(2, 0xF), /* Kokiri jump */ DMG_ENTRY(0, 0x0), /* Giant jump */ DMG_ENTRY(8, 0xF), /* Master jump */ DMG_ENTRY(4, 0xF), /* Unknown 1 */ DMG_ENTRY(0, 0x0), /* Unblockable */ DMG_ENTRY(0, 0x0), /* Hammer jump */ DMG_ENTRY(0, 0x0), /* Unknown 2 */ DMG_ENTRY(0, 0x0), }; static InitChainEntry sInitChain[] = { ICHAIN_S8(naviEnemyId, 0x28, ICHAIN_CONTINUE), ICHAIN_U8(targetMode, 2, ICHAIN_CONTINUE), ICHAIN_F32(targetArrowOffset, 30, ICHAIN_STOP), }; void EnNy_Init(Actor* thisx, GlobalContext* globalCtx) { EnNy* this = (EnNy*)thisx; Actor_ProcessInitChain(&this->actor, sInitChain); this->actor.colChkInfo.damageTable = &sDamageTable; this->actor.colChkInfo.health = 2; Collider_InitJntSph(globalCtx, &this->collider); Collider_SetJntSph(globalCtx, &this->collider, &this->actor, &sColliderInit, this->elements); ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 20.0f); this->unk_1CA = 0; this->unk_1D0 = 0; Actor_SetScale(&this->actor, 0.01f); this->actor.speedXZ = 0.0f; this->actor.shape.rot.y = 0; this->actor.gravity = -0.4f; this->hitPlayer = 0; this->unk_1CE = 2; this->actor.velocity.y = 0.0f; this->unk_1D4 = 0xFF; this->unk_1D8 = 0; this->unk_1E8 = 0.0f; this->unk_1E0 = 0.25f; if (this->actor.params == 0) { // "New initials" osSyncPrintf("ニュウ イニシャル[ %d ] !!\n", this->actor.params); this->actor.colChkInfo.mass = 0; this->unk_1D4 = 0; this->unk_1D8 = 0xFF; this->unk_1E0 = 1.0f; func_80ABCDBC(this); } else { // This mode is unused in the final game // "Dummy new initials" osSyncPrintf("ダミーニュウ イニシャル[ %d ] !!\n", this->actor.params); osSyncPrintf("En_Ny_actor_move2[ %x ] !!\n", EnNy_UpdateUnused); this->actor.colChkInfo.mass = 0xFF; this->collider.base.colType = COLTYPE_METAL; this->actor.update = EnNy_UpdateUnused; } } void EnNy_Destroy(Actor* thisx, GlobalContext* globalCtx) { EnNy* this = (EnNy*)thisx; Collider_DestroyJntSph(globalCtx, &this->collider); } void func_80ABCD40(EnNy* this) { f32 temp; temp = (this->actor.yDistToWater > 0.0f) ? 0.7f : 1.0f; this->unk_1E8 = 2.8f * temp; } void func_80ABCD84(EnNy* this) { this->actionFunc = func_80ABCE50; } void func_80ABCD94(EnNy* this) { this->stoneTimer = 0x14; this->actionFunc = func_80ABCE90; } void func_80ABCDAC(EnNy* this) { this->actionFunc = func_80ABCEEC; } void func_80ABCDBC(EnNy* this) { this->unk_1F4 = 0.0f; func_80ABCD40(this); this->stoneTimer = 180; this->actionFunc = EnNy_Move; } void EnNy_SetupTurnToStone(EnNy* this) { Audio_PlayActorSound2(&this->actor, NA_SE_EN_NYU_HIT_STOP); this->actionFunc = EnNy_TurnToStone; this->unk_1E8 = 0.0f; } void func_80ABCE38(EnNy* this) { this->stoneTimer = 0x3C; this->actionFunc = func_80ABD11C; } void func_80ABCE50(EnNy* this, GlobalContext* globalCtx) { if (this->actor.xyzDistToPlayerSq <= 25600.0f) { func_80ABCD94(this); } } void func_80ABCE90(EnNy* this, GlobalContext* globalCtx) { s32 phi_v1; s32 phi_v0; phi_v1 = this->unk_1D4 - 0x40; phi_v0 = this->unk_1D8 + 0x40; if (phi_v0 >= 0xFF) { phi_v1 = 0; phi_v0 = 0xFF; func_80ABCDAC(this); } this->unk_1D4 = phi_v1; this->unk_1D8 = phi_v0; } void func_80ABCEEC(EnNy* this, GlobalContext* globalCtx) { f32 phi_f0; phi_f0 = this->unk_1E0; phi_f0 += 2.0f; if (phi_f0 >= 1.0f) { phi_f0 = 1.0f; func_80ABCDBC(this); } this->unk_1E0 = phi_f0; } void EnNy_Move(EnNy* this, GlobalContext* globalCtx) { f32 yawDiff; s32 stoneTimer; if (!(this->unk_1F0 < this->actor.yDistToWater)) { func_8002F974(&this->actor, NA_SE_EN_NYU_MOVE - SFX_FLAG); } func_80ABCD40(this); stoneTimer = this->stoneTimer; this->stoneTimer--; if ((stoneTimer <= 0) || (this->hitPlayer != false)) { EnNy_SetupTurnToStone(this); } else { Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 0xA, this->unk_1F4, 0); Math_ApproachF(&this->unk_1F4, 2000.0f, 1.0f, 100.0f); this->actor.world.rot.y = this->actor.shape.rot.y; yawDiff = Math_FAtan2F(this->actor.yDistToPlayer, this->actor.xzDistToPlayer); this->actor.speedXZ = fabsf(cosf(yawDiff) * this->unk_1E8); if (this->unk_1F0 < this->actor.yDistToWater) { this->unk_1EC = sinf(yawDiff) * this->unk_1E8; } } } void EnNy_TurnToStone(EnNy* this, GlobalContext* globalCtx) { f32 phi_f0; phi_f0 = this->unk_1E0; phi_f0 -= 2.0f; if (phi_f0 <= 0.25f) { phi_f0 = 0.25f; if (this->actor.bgCheckFlags & 2) { if (!(this->unk_1F0 < this->actor.yDistToWater)) { Audio_PlayActorSound2(&this->actor, NA_SE_EN_DODO_M_GND); } this->actor.bgCheckFlags &= ~2; this->actor.speedXZ = 0.0f; this->actor.world.rot.y = this->actor.shape.rot.y; func_80ABCE38(this); } } this->unk_1E0 = phi_f0; } void func_80ABD11C(EnNy* this, GlobalContext* globalCtx) { s32 phi_v0; s32 phi_v1; phi_v0 = this->unk_1D4; phi_v0 += 0x40; phi_v1 = this->unk_1D8; phi_v1 -= 0x40; if (phi_v0 >= 0xFF) { phi_v0 = 0xFF; phi_v1 = 0; if (this->stoneTimer != 0) { this->stoneTimer--; } else { func_80ABCD84(this); } } this->unk_1D4 = phi_v0; this->unk_1D8 = phi_v1; } s32 EnNy_CollisionCheck(EnNy* this, GlobalContext* globalCtx) { u8 sp3F; Vec3f effectPos; sp3F = 0; this->hitPlayer = 0; if (this->collider.base.atFlags & 4) { this->collider.base.atFlags &= ~4; this->hitPlayer = 1; this->actor.world.rot.y = this->actor.yawTowardsPlayer; this->actor.speedXZ = -4.0f; return 0; } if (this->collider.base.atFlags & 2) { this->collider.base.atFlags &= ~2; this->hitPlayer = 1; return 0; } else { if (this->collider.base.acFlags & 2) { this->collider.base.acFlags &= ~2; effectPos.x = this->collider.elements[0].info.bumper.hitPos.x; effectPos.y = this->collider.elements[0].info.bumper.hitPos.y; effectPos.z = this->collider.elements[0].info.bumper.hitPos.z; if ((this->unk_1E0 == 0.25f) && (this->unk_1D4 == 0xFF)) { switch (this->actor.colChkInfo.damageEffect) { case 0xE: sp3F = 1; case 0xF: Actor_ApplyDamage(&this->actor); Actor_SetColorFilter(&this->actor, 0x4000, 0xFF, 0x2000, 0x50); break; case 1: Actor_ApplyDamage(&this->actor); Actor_SetColorFilter(&this->actor, 0x4000, 0xFF, 0x2000, 0x50); break; case 2: this->unk_1CA = 4; Actor_ApplyDamage(&this->actor); Actor_SetColorFilter(&this->actor, 0x4000, 0xFF, 0x2000, 0x50); break; } } this->stoneTimer = 0; if (this->actor.colChkInfo.health == 0) { this->actor.shape.shadowAlpha = 0; this->actor.flags &= ~ACTOR_FLAG_0; this->unk_1D0 = sp3F; Enemy_StartFinishingBlow(globalCtx, &this->actor); return 1; } EffectSsHitMark_SpawnFixedScale(globalCtx, 0, &effectPos); return 0; } } return 0; } void func_80ABD3B8(EnNy* this, f32 arg1, f32 arg2) { if (this->unk_1E8 == 0.0f) { this->actor.gravity = -0.4f; } else if (!(arg1 < this->actor.yDistToWater)) { this->actor.gravity = -0.4f; } else if (arg2 < this->actor.yDistToWater) { this->actor.gravity = 0.0; if (this->unk_1EC < this->actor.velocity.y) { this->actor.velocity.y -= 0.4f; if (this->actor.velocity.y < this->unk_1EC) { this->actor.velocity.y = this->unk_1EC; } } else if (this->actor.velocity.y < this->unk_1EC) { this->actor.velocity.y += 0.4f; if (this->unk_1EC < this->actor.velocity.y) { this->actor.velocity.y = this->unk_1EC; } } } } void EnNy_Update(Actor* thisx, GlobalContext* globalCtx) { EnNy* this = (EnNy*)thisx; f32 temp_f20; f32 temp_f22; s32 i; this->timer++; temp_f20 = this->unk_1E0 - 0.25f; if (this->unk_1CA != 0) { this->unk_1CA--; } Actor_SetFocus(&this->actor, 0.0f); Actor_SetScale(&this->actor, 0.01f); this->collider.elements[0].dim.scale = 1.33f * temp_f20 + 1.0f; temp_f22 = (24.0f * temp_f20) + 12.0f; this->actor.shape.rot.x += (s16)(this->unk_1E8 * 1000.0f); func_80ABD3B8(this, temp_f22 + 10.0f, temp_f22 - 10.0f); Actor_MoveForward(&this->actor); Math_StepToF(&this->unk_1E4, this->unk_1E8, 0.1f); this->actionFunc(this, globalCtx); this->actor.prevPos.y -= temp_f22; this->actor.world.pos.y -= temp_f22; Actor_UpdateBgCheckInfo(globalCtx, &this->actor, 20.0f, 20.0f, 60.0f, 7); this->unk_1F0 = temp_f22; this->actor.world.pos.y += temp_f22; if (EnNy_CollisionCheck(this, globalCtx) != 0) { for (i = 0; i < 8; i++) { this->unk_1F8[i].x = (Rand_CenteredFloat(20.0f) + this->actor.world.pos.x); this->unk_1F8[i].y = (Rand_CenteredFloat(20.0f) + this->actor.world.pos.y); this->unk_1F8[i].z = (Rand_CenteredFloat(20.0f) + this->actor.world.pos.z); } this->timer = 0; this->actor.update = EnNy_UpdateDeath; this->actor.draw = EnNy_DrawDeathEffect; this->actionFunc = EnNy_SetupDie; return; } if (this->unk_1E0 > 0.25f) { CollisionCheck_SetAT(globalCtx, &globalCtx->colChkCtx, &this->collider.base); } CollisionCheck_SetAC(globalCtx, &globalCtx->colChkCtx, &this->collider.base); CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &this->collider.base); } void EnNy_SetupDie(EnNy* this, GlobalContext* globalCtx) { s32 effectScale; s32 i; Vec3f effectPos; Vec3f effectVelocity = { 0.0f, 0.0f, 0.0f }; Vec3f effectAccel = { 0.0f, 0.1f, 0.0f }; if (this->timer >= 2) { if (this->actor.yDistToWater > 0.0f) { for (i = 0; i < 10; i++) { effectPos.x = Rand_CenteredFloat(30.0f) + this->actor.world.pos.x; effectPos.y = Rand_CenteredFloat(30.0f) + this->actor.world.pos.y; effectPos.z = Rand_CenteredFloat(30.0f) + this->actor.world.pos.z; effectScale = Rand_S16Offset(0x50, 0x64); EffectSsDtBubble_SpawnColorProfile(globalCtx, &effectPos, &effectVelocity, &effectAccel, effectScale, 25, 0, 1); } for (i = 0; i < 0x14; i++) { effectPos.x = Rand_CenteredFloat(30.0f) + this->actor.world.pos.x; effectPos.y = Rand_CenteredFloat(30.0f) + this->actor.world.pos.y; effectPos.z = Rand_CenteredFloat(30.0f) + this->actor.world.pos.z; EffectSsBubble_Spawn(globalCtx, &effectPos, 10.0f, 10.0f, 30.0f, 0.25f); } } for (i = 0; i < 8; i++) { this->unk_1F8[i + 8].x = Rand_CenteredFloat(10.0f); this->unk_1F8[i + 8].z = Rand_CenteredFloat(10.0f); this->unk_1F8[i + 8].y = Rand_ZeroFloat(4.0f) + 4.0f; } this->timer = 0; if (this->unk_1D0 == 0) { Item_DropCollectibleRandom(globalCtx, &this->actor, &this->actor.world.pos, 0xA0); } else { Item_DropCollectible(globalCtx, &this->actor.world.pos, 8); } Audio_PlayActorSound2(&this->actor, NA_SE_EN_NYU_DEAD); this->actionFunc = EnNy_Die; } } void EnNy_Die(EnNy* this, GlobalContext* globalCtx) { s32 i; if (this->actor.yDistToWater > 0.0f) { for (i = 0; i < 8; i += 1) { this->unk_1F8[i].x += this->unk_1F8[i + 8].x; this->unk_1F8[i].y += this->unk_1F8[i + 8].y; this->unk_1F8[i].z += this->unk_1F8[i + 8].z; Math_StepToF(&this->unk_1F8[i + 8].x, 0.0f, 0.1f); Math_StepToF(&this->unk_1F8[i + 8].y, -1.0f, 0.4f); Math_StepToF(&this->unk_1F8[i + 8].z, 0.0f, 0.1f); } if (this->timer >= 0x1F) { Actor_Kill(&this->actor); return; } } else { for (i = 0; i < 8; i += 1) { this->unk_1F8[i].x += this->unk_1F8[i + 8].x; this->unk_1F8[i].y += this->unk_1F8[i + 8].y; this->unk_1F8[i].z += this->unk_1F8[i + 8].z; Math_StepToF(&this->unk_1F8[i + 8].x, 0.0f, 0.15f); Math_StepToF(&this->unk_1F8[i + 8].y, -1.0f, 0.6f); Math_StepToF(&this->unk_1F8[i + 8].z, 0.0f, 0.15f); } if (this->timer >= 0x10) { Actor_Kill(&this->actor); return; } } } void EnNy_UpdateDeath(Actor* thisx, GlobalContext* globalCtx) { EnNy* this = (EnNy*)thisx; this->timer++; if (this->unk_1CA != 0) { this->unk_1CA--; } this->actionFunc(this, globalCtx); } void EnNy_UpdateUnused(Actor* thisx, GlobalContext* globalCtx2) { EnNy* this = (EnNy*)thisx; GlobalContext* globalCtx = globalCtx2; f32 sp3C; f32 temp_f0; sp3C = this->unk_1E0 - 0.25f; this->timer++; Actor_SetFocus(&this->actor, 0.0f); Actor_SetScale(&this->actor, 0.01f); temp_f0 = (24.0f * sp3C) + 12.0f; this->actor.prevPos.y -= temp_f0; this->actor.world.pos.y -= temp_f0; Actor_UpdateBgCheckInfo(globalCtx, &this->actor, 20.0f, 20.0f, 60.0f, 7); this->unk_1F0 = temp_f0; this->actor.world.pos.y += temp_f0; CollisionCheck_SetAC(globalCtx, &globalCtx->colChkCtx, &this->collider.base); CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &this->collider.base); Actor_MoveForward(&this->actor); Math_StepToF(&this->unk_1E4, this->unk_1E8, 0.1f); } static Vec3f sFireOffsets[] = { { 5.0f, 0.0f, 0.0f }, { -5.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 5.0f }, { 0.0f, 0.0f, -5.0f }, }; void EnNy_Draw(Actor* thisx, GlobalContext* globalCtx) { s32 pad; EnNy* this = (EnNy*)thisx; OPEN_DISPS(globalCtx->state.gfxCtx); Collider_UpdateSpheres(0, &this->collider); func_8002ED80(&this->actor, globalCtx, 1); func_80093D84(globalCtx->state.gfxCtx); gSPMatrix(POLY_XLU_DISP++, MATRIX_NEWMTX(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gDPPipeSync(POLY_XLU_DISP++); gDPSetRenderMode(POLY_XLU_DISP++, G_RM_PASS, G_RM_AA_ZB_XLU_SURF2); gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, this->unk_1D8); gSPDisplayList(POLY_XLU_DISP++, gEnNyMetalBodyDL); gDPPipeSync(POLY_XLU_DISP++); gDPSetRenderMode(POLY_XLU_DISP++, G_RM_FOG_SHADE_A, G_RM_AA_ZB_XLU_SURF2); gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, this->unk_1D4); gSPDisplayList(POLY_XLU_DISP++, gEnNyRockBodyDL); if (this->unk_1E0 > 0.25f) { Matrix_Scale(this->unk_1E0, this->unk_1E0, this->unk_1E0, MTXMODE_APPLY); func_8002EBCC(&this->actor, globalCtx, 1); func_80093D18(globalCtx->state.gfxCtx); gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gSPDisplayList(POLY_OPA_DISP++, gEnNySpikeDL); } CLOSE_DISPS(globalCtx->state.gfxCtx); if (this->unk_1CA != 0) { Vec3f tempVec; Vec3f* fireOffset; s16 temp; temp = this->unk_1CA - 1; this->actor.colorFilterTimer++; if (temp == 0) { fireOffset = &sFireOffsets[temp & 3]; tempVec.x = Rand_CenteredFloat(5.0f) + (this->actor.world.pos.x + fireOffset->x); tempVec.y = Rand_CenteredFloat(5.0f) + (this->actor.world.pos.y + fireOffset->y); tempVec.z = Rand_CenteredFloat(5.0f) + (this->actor.world.pos.z + fireOffset->z); EffectSsEnFire_SpawnVec3f(globalCtx, &this->actor, &tempVec, 100, 0, 0, -1); } } } void EnNy_DrawDeathEffect(Actor* thisx, GlobalContext* globalCtx) { EnNy* this = (EnNy*)thisx; Vec3f* temp; f32 scale; s32 i; OPEN_DISPS(globalCtx->state.gfxCtx); func_80093D18(globalCtx->state.gfxCtx); gDPSetEnvColor(POLY_OPA_DISP++, 0x00, 0x00, 0x00, 0xFF); gDPSetRenderMode(POLY_OPA_DISP++, G_RM_FOG_SHADE_A, G_RM_AA_ZB_OPA_SURF2); gDPPipeSync(POLY_OPA_DISP++); for (i = 0; i < 8; i++) { if (this->timer < (i + 22)) { temp = &this->unk_1F8[i]; Matrix_Translate(temp->x, temp->y, temp->z, MTXMODE_NEW); scale = this->actor.scale.x * 0.4f * (1.0f + (i * 0.04f)); Matrix_Scale(scale, scale, scale, MTXMODE_APPLY); gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gSPDisplayList(POLY_OPA_DISP++, gEnNyRockBodyDL); } } CLOSE_DISPS(globalCtx->state.gfxCtx); if (this->unk_1CA != 0) { Vec3f tempVec; Vec3f* fireOffset; s16 fireOffsetIndex; fireOffsetIndex = this->unk_1CA - 1; this->actor.colorFilterTimer++; if ((fireOffsetIndex & 1) == 0) { fireOffset = &sFireOffsets[fireOffsetIndex & 3]; tempVec.x = Rand_CenteredFloat(5.0f) + (this->actor.world.pos.x + fireOffset->x); tempVec.y = Rand_CenteredFloat(5.0f) + (this->actor.world.pos.y + fireOffset->y); tempVec.z = Rand_CenteredFloat(5.0f) + (this->actor.world.pos.z + fireOffset->z); EffectSsEnFire_SpawnVec3f(globalCtx, &this->actor, &tempVec, 100, 0, 0, -1); } } }