From 7e226cc93013b6c1fc4b22c002b165bc36139f4f Mon Sep 17 00:00:00 2001 From: LagoLunatic Date: Tue, 10 Oct 2023 17:26:00 -0400 Subject: [PATCH] c_damagereaction 20% --- include/JSystem/JGeometry.h | 11 + include/JSystem/JParticle/JPAEmitter.h | 9 +- include/SSystem/SComponent/c_cc_d.h | 1 + include/SSystem/SComponent/c_lib.h | 2 +- include/c/c_damagereaction.h | 37 +- include/d/d_bg_s_acch.h | 3 +- include/d/d_cc_uty.h | 5 + include/d/d_s_play.h | 2 +- include/f_op/f_op_actor.h | 1 + include/f_op/f_op_actor_mng.h | 8 +- src/c/c_damagereaction.cpp | 581 ++++++++++++++++++++++++- src/d/actor/d_a_am.cpp | 4 +- src/d/actor/d_a_item.cpp | 2 +- src/d/actor/d_a_obj_mknjd.cpp | 4 +- src/d/d_bg_s_acch.cpp | 21 +- 15 files changed, 629 insertions(+), 62 deletions(-) diff --git a/include/JSystem/JGeometry.h b/include/JSystem/JGeometry.h index 9a0d87fee..f1465a9f8 100644 --- a/include/JSystem/JGeometry.h +++ b/include/JSystem/JGeometry.h @@ -88,6 +88,12 @@ struct TVec3 { z = other.z; } + void set(const Vec& vec) { + x = vec.x; + y = vec.y; + z = vec.z; + } + void set(f32 x_, f32 y_, f32 z_) { x = x_; y = y_; @@ -140,6 +146,11 @@ struct TVec3 { return *this; } + inline TVec3& operator=(const Vec& vec) { + set(vec); + return *this; + } + f32 squared() const { return C_VECSquareMag((Vec*)&x); } diff --git a/include/JSystem/JParticle/JPAEmitter.h b/include/JSystem/JParticle/JPAEmitter.h index 349593acd..f3b7f4ed1 100644 --- a/include/JSystem/JParticle/JPAEmitter.h +++ b/include/JSystem/JParticle/JPAEmitter.h @@ -93,10 +93,13 @@ public: mGlobalScale2D.set(scale); } void setGlobalParticleScale(const JGeometry::TVec3& scale) { - mGlobalScale.set(scale); + mGlobalScale2D.set(scale); } void setGlobalDynamicsScale(const JGeometry::TVec3& scale) { - mGlobalScale2D.set(scale); + mGlobalScale.set(scale); + } + void setDirection(const JGeometry::TVec3& dir) { + mEmitterDir.set(dir); } void setMaxFrame(s32 maxFrame) { mMaxFrame = maxFrame; } @@ -126,7 +129,7 @@ public: /* 0x024 */ csXyz mEmitterRot; /* 0x02A */ u8 mVolumeType; /* 0x02B */ u8 mRateStep; - /* 0x02C */ cXyz mEmitterDir; + /* 0x02C */ JGeometry::TVec3 mEmitterDir; /* 0x038 */ f32 mRate; /* 0x03C */ f32 mRateRndm; /* 0x040 */ f32 mAccel; diff --git a/include/SSystem/SComponent/c_cc_d.h b/include/SSystem/SComponent/c_cc_d.h index f770141b0..a873b74ce 100644 --- a/include/SSystem/SComponent/c_cc_d.h +++ b/include/SSystem/SComponent/c_cc_d.h @@ -40,6 +40,7 @@ enum cCcD_ObjAtType { /* 0x04000000 */ AT_TYPE_DARKNUT_SWORD = (1 << 26), /* 0x08000000 */ AT_TYPE_GRAPPLING_HOOK = (1 << 27), /* 0x10000000 */ AT_TYPE_MOBLIN_SPEAR = (1 << 28), + /* 0xFFFFFFFF */ AT_TYPE_ALL = ~0, }; class cCcD_ShapeAttr { diff --git a/include/SSystem/SComponent/c_lib.h b/include/SSystem/SComponent/c_lib.h index a6b36cfba..c963473d5 100644 --- a/include/SSystem/SComponent/c_lib.h +++ b/include/SSystem/SComponent/c_lib.h @@ -102,7 +102,7 @@ T cLib_calcTimer(T* value) { void MtxInit(void); void MtxTrans(f32, f32, f32, u8); void MtxScale(f32, f32, f32, u8); -void MtxPosition(cXyz*, cXyz*); +void MtxPosition(cXyz* src, cXyz* dest); void MtxPush(void); Mtx* MtxPull(void); diff --git a/include/c/c_damagereaction.h b/include/c/c_damagereaction.h index acb36885a..4f459b393 100644 --- a/include/c/c_damagereaction.h +++ b/include/c/c_damagereaction.h @@ -11,19 +11,19 @@ struct enemyice { public: /* 0x000 */ fopAc_ac_c* mpActor; - /* 0x004 */ s16 mTotalNumFramesToRemainFrozen; - /* 0x006 */ u8 mNumFramesDyingToLightArrowsSoFar; + /* 0x004 */ s16 mFreezeDuration; + /* 0x006 */ s8 mLightShrinkTimer; /* 0x007 */ u8 m007[0x008 - 0x007]; /* 0x008 */ f32 mYOffset; - /* 0x00C */ u8 m00C; - /* 0x00D */ u8 mState; - /* 0x00E */ s16 mNumFramesLeftToRemainFrozen; + /* 0x00C */ s8 m00C; + /* 0x00D */ s8 mState; + /* 0x00E */ s16 mFreezeTimer; /* 0x010 */ s16 m010; - /* 0x012 */ s16 m012; - /* 0x014 */ s16 m014; + /* 0x012 */ s16 mAngleY; + /* 0x014 */ s16 mAngularVelY; /* 0x016 */ u8 m016[0x018 - 0x016]; - /* 0x018 */ cXyz m018; - /* 0x024 */ f32 m024; + /* 0x018 */ cXyz mSpeed; + /* 0x024 */ f32 mSpeedF; /* 0x028 */ f32 m028; /* 0x02C */ f32 m02C; /* 0x030 */ dCcD_Stts mStts; @@ -32,7 +32,7 @@ public: /* 0x1A0 */ f32 mWallRadius; /* 0x1A4 */ f32 mScaleXZ; /* 0x1A8 */ f32 mScaleY; - /* 0x1AC */ f32 m1AC; + /* 0x1AC */ f32 mParticleScale; /* 0x1B0 */ u8 m1B0; /* 0x1B1 */ u8 mDeathSwitch; /* 0x1B2 */ u8 m1B2[0x1B4 - 0x1B2]; @@ -45,22 +45,21 @@ struct enemyfire { public: /* 0x000 */ fopAc_ac_c* mpActor; /* 0x004 */ s16 m004; - /* 0x006 */ u8 m006; + /* 0x006 */ s8 m006; /* 0x007 */ u8 m007[0x008 - 0x007]; /* 0x008 */ s16 m008; /* 0x00A */ u8 m00A[0x00C - 0x00A]; /* 0x00C */ mDoExt_McaMorf* mpMcaMorf; - /* 0x010 */ u8 m010[10]; + /* 0x010 */ s8 m010[10]; /* 0x01A */ u8 m01A[0x01C - 0x01A]; /* 0x01C */ f32 m01C[10]; - /* 0x044 */ u8 m044[0x080 - 0x044]; + /* 0x044 */ s16 m044[10]; + /* 0x058 */ JPABaseEmitter* mpFireEmitters[10]; /* 0x080 */ cXyz m080; - /* 0x08C */ f32 m08C; - /* 0x090 */ f32 m090; - /* 0x094 */ f32 m094; + /* 0x08C */ JGeometry::TVec3 m08C; /* 0x098 */ f32 m098; /* 0x09C */ u8 m09C[0x09D - 0x09C]; - /* 0x09D */ char m09D; + /* 0x09D */ u8 m09D; /* 0x09E */ u8 m09E[0x0A0 - 0x09E]; /* 0x0A0 */ dCcD_Stts mStts; /* 0x0DC */ dCcD_Sph mSph; @@ -184,12 +183,12 @@ public: }; // STATIC_ASSERT(sizeof(damagereaction) == 0x7BC); -void ice_bg_check(enemyice*); +BOOL ice_bg_check(enemyice*); BOOL enemy_ice(enemyice*); void enemy_fire(enemyfire*); void enemy_fire_remove(enemyfire*); void enemy_piyo_set(fopAc_ac_c*); -void wall_angle_get(fopAc_ac_c*, short); +void wall_angle_get(fopAc_ac_c*, s16); void dr_body_bg_check(damagereaction*); void dr_joint_bg_check(damagereaction*); void kado_check(damagereaction*); diff --git a/include/d/d_bg_s_acch.h b/include/d/d_bg_s_acch.h index 666bd3c6f..fe43c3caf 100644 --- a/include/d/d_bg_s_acch.h +++ b/include/d/d_bg_s_acch.h @@ -80,7 +80,8 @@ public: dBgS_Acch(); void Init(); void Set(fopAc_ac_c*, int, dBgS_AcchCir*); - void Set(cXyz*, cXyz*, fopAc_ac_c*, int, dBgS_AcchCir*, cXyz*, csXyz*, csXyz*); + void Set(cXyz* pos, cXyz* old_pos, fopAc_ac_c* actor, int tbl_size, dBgS_AcchCir* acchCir, cXyz* speed, + csXyz* angle, csXyz* shape_angle); void GroundCheckInit(dBgS&); void GroundCheck(dBgS&); void GroundRoofProc(dBgS&); diff --git a/include/d/d_cc_uty.h b/include/d/d_cc_uty.h index 0bff3f3ff..6757b35de 100644 --- a/include/d/d_cc_uty.h +++ b/include/d/d_cc_uty.h @@ -5,6 +5,11 @@ #include "f_op/f_op_actor.h" struct CcAtInfo { +public: + CcAtInfo() {} + ~CcAtInfo() {} + +public: /* 0x00 */ cCcD_Obj* mpObj; /* 0x04 */ fopAc_ac_c* mpActor; /* 0x08 */ u8 mDamage; diff --git a/include/d/d_s_play.h b/include/d/d_s_play.h index 8a5479c96..cc3783e20 100644 --- a/include/d/d_s_play.h +++ b/include/d/d_s_play.h @@ -13,7 +13,7 @@ public: void offReset(); static bool isPause() { return pauseTimer != 0; } - static void setPauseTimer(s8 time) { pauseTimer = time; } + static void setPauseTimer(s8 time) { nextPauseTimer = time; } static s8 pauseTimer; static s8 nextPauseTimer; diff --git a/include/f_op/f_op_actor.h b/include/f_op/f_op_actor.h index 3bad63b38..2dcd4e315 100644 --- a/include/f_op/f_op_actor.h +++ b/include/f_op/f_op_actor.h @@ -29,6 +29,7 @@ enum fopAc_Status_e { fopAcStts_UNK200000_e = 0x00200000, fopAcStts_NODRAW_e = 0x01000000, fopAcStts_BOSS_e = 0x04000000, + fopAcStts_UNK8000000_e = 0x08000000, }; enum fopAc_Condition_e { diff --git a/include/f_op/f_op_actor_mng.h b/include/f_op/f_op_actor_mng.h index b97ec0042..bfc9ebe53 100644 --- a/include/f_op/f_op_actor_mng.h +++ b/include/f_op/f_op_actor_mng.h @@ -87,7 +87,7 @@ inline bool fopAcM_checkStatus(fopAc_ac_c* pActor, u32 status) { } inline u32 fopAcM_checkCarryNow(fopAc_ac_c* pActor) { - return pActor->mStatus & 0x2000; + return pActor->mStatus & fopAcStts_CARRY_e; } enum fopAcM_CARRY { @@ -442,13 +442,13 @@ s32 fopAcM_createItemFromTable(cXyz* p_pos, int i_tableNo, int i_itemBitNo, int csXyz* p_angle, int param_5, cXyz * p_scale, f32* speedF, f32* speedY, bool createDirect); -s32 fopAcM_createShopItem(cXyz* pos, int i_itemNo, csXyz* rot, int roomNo, cXyz* scale, +s32 fopAcM_createShopItem(cXyz* p_pos, int i_itemNo, csXyz* rot, int roomNo, cXyz* scale, createFunc createFunc); -s32 fopAcM_createRaceItem(cXyz* pos, int i_itemNo, int i_itemBitNo, csXyz* rot, int roomNo, +s32 fopAcM_createRaceItem(cXyz* p_pos, int i_itemNo, int i_itemBitNo, csXyz* rot, int roomNo, cXyz* scale, int param_7); -s32 fopAcM_createIball(cXyz*, int, int, csXyz*, int); +s32 fopAcM_createIball(cXyz* p_pos, int itemTableIdx, int roomNo, csXyz* rot, int itemStealNum); s32 fopAcM_createDemoItem(cXyz* p_pos, int itemNo, int itemBitNo, csXyz* p_angle, int roomNo, cXyz* scale, u8 param_7); diff --git a/src/c/c_damagereaction.cpp b/src/c/c_damagereaction.cpp index eb6ac608d..6f8b5b35a 100644 --- a/src/c/c_damagereaction.cpp +++ b/src/c/c_damagereaction.cpp @@ -5,73 +5,618 @@ #include "c/c_damagereaction.h" #include "dolphin/types.h" +#include "d/d_com_inf_game.h" +#include "d/actor/d_a_sea.h" +#include "d/d_s_play.h" +#include "JAZelAudio/JAZelAudio_SE.h" +#include "f_op/f_op_actor_mng.h" +#include "m_Do/m_Do_mtx.h" +#include "d/d_cc_uty.h" +#include "d/d_procname.h" + +cXyz non_pos(-20000.0f, -20000.0f, 20000.0f); /* 8001BEDC-8001C0B4 .text ice_bg_check__FP8enemyice */ -void ice_bg_check(enemyice*) { - /* Nonmatching */ +BOOL ice_bg_check(enemyice* ei) { + fopAc_ac_c* ac = ei->mpActor; + BOOL ret = FALSE; + f32 speedY = ei->mSpeed.y; + + ei->mBgAcch.CrrPos(*dComIfG_Bgsp()); + + if (ei->mBgAcch.ChkWaterHit()) { + f32 waterH = ei->mBgAcch.m_wtr.GetHeight(); + if (ac->current.pos.y < waterH + 100.0f) { + if (speedY < -20.0f) { + ei->mSpeed.y = 0.0f; + } else { + ei->mSpeed.y = 0.0f; + } + if (ac->mHealth <= 0) { + ret = TRUE; + } + } + } else if (ei->mBgAcch.ChkGroundHit()) { + ei->mSpeedF *= 0.5f; + if (ac->mHealth <= 0 || speedY < -40.0f + g_regHIO.mChild[0].mFloatRegs[14]) { + ret = TRUE; + } + if (speedY < -20.0f) { + ei->mSpeed.y = 10.0f; + } else { + ei->mSpeed.y = 0.0f; + } + ei->mAngularVelY = 0; + } else if (daSea_ChkArea(ac->current.pos.x, ac->current.pos.z)) { + f32 seaH = daSea_calcWave(ac->current.pos.x, ac->current.pos.z); + if (ac->current.pos.y < seaH + 100.0f) { + if (speedY < -20.0f) { + ei->mSpeed.y = 0.0f; + } else { + ei->mSpeed.y = 0.0f; + } + if (ac->mHealth <= 0) { + ret = TRUE; + } + } + } + + if (ei->mBgAcch.ChkWallHit()) { + if (fabsf(ei->mSpeedF) > 10.0f) { + ret = TRUE; + } + ei->mSpeedF *= 0.5f; + ei->mAngleY += 0x8000; + } + + return ret; } +dCcD_SrcCyl cc_cyl_src = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ AT_TYPE_SKULL_HAMMER, + /* SrcObjAt Atp */ 0, + /* SrcObjAt SPrm */ 0x0F, + /* SrcObjTg Type */ AT_TYPE_ALL, + /* SrcObjTg SPrm */ 0x03, + /* SrcObjCo SPrm */ 0x75, + /* SrcGObjAt Se */ 0, + /* SrcGObjAt HitMark */ 0, + /* SrcGObjAt Spl */ 0, + /* SrcGObjAt Mtrl */ 0, + /* SrcGObjAt GFlag */ 0, + /* SrcGObjTg Se */ 0x05, + /* SrcGObjTg HitMark */ 0x0C, + /* SrcGObjTg Spl */ 0, + /* SrcGObjTg Mtrl */ 0, + /* SrcGObjTg GFlag */ 0x03, + /* SrcGObjCo GFlag */ 0, + }, + // cM3dGCylS + { + /* Center */ 0.0f, 0.0f, 0.0f, + /* Radius */ 250.0f, + /* Height */ 400.0f, + }, +}; + /* 8001C0B4-8001CD7C .text enemy_ice__FP8enemyice */ -BOOL enemy_ice(enemyice*) { - /* Nonmatching */ +BOOL enemy_ice(enemyice* ei) { + fopAc_ac_c* player = dComIfGp_getPlayer(0); + fopAc_ac_c* ac = ei->mpActor; + s8 temp13 = 0; + cXyz temp; + cXyz temp11; + cXyz particleScale; + cXyz pos; + + if (ei->mLightShrinkTimer != 0) { + particleScale.setAll(ei->mParticleScale); + pos = ac->current.pos; + pos.y += ei->mYOffset; + + if (ei->mLightShrinkTimer == 1) { + ei->mLightShrinkTimer++; + dComIfGp_particle_set(0x272, &pos, NULL, &particleScale, 0xFF, NULL, -1, NULL, NULL, NULL); + ac->mTevStr.mFogColor.b = 0xFF; + ac->mTevStr.mFogColor.g = 0xFF; + ac->mTevStr.mFogColor.r = 0xFF; + ac->mTevStr.mFogStartZ = 0.0f; + ac->mTevStr.mFogEndZ = 2000.0f; + fopAcM_seStart(ac, JA_SE_CM_L_ARROW_SHRINK, 0); + ac->mAttentionInfo.mFlags &= ~4; + } else { + ei->mLightShrinkTimer++; + cLib_addCalc2(&ac->mTevStr.mFogEndZ, 10.0f, 1.0f, 80.0f); + mDoMtx_stack_c::transS(ac->current.pos); + mDoMtx_stack_c::transM(0, ei->mYOffset, 0); + mDoMtx_stack_c::scaleM(ei->mScaleXZ, ei->mScaleY, ei->mScaleXZ); + mDoMtx_stack_c::transM(0, -ei->mYOffset, 0); + mDoMtx_stack_c::YrotM(ac->shape_angle.y); + mDoMtx_stack_c::XrotM(ac->shape_angle.x); + mDoMtx_stack_c::ZrotM(ac->shape_angle.z); + mDoMtx_stack_c::scaleM(ac->mScale); + + s8 temp15 = 70 + g_regHIO.mChild[14].mShortRegs[1]; + if (ei->mLightShrinkTimer < temp15) { + cLib_addCalc0(&ei->mScaleXZ, 0.1f, 0.01f + g_regHIO.mChild[14].mFloatRegs[0]); + cLib_addCalc0(&ei->mScaleY, 0.1f, 0.01f + g_regHIO.mChild[14].mFloatRegs[0]); + } else { + s8 temp16 = 70 + g_regHIO.mChild[14].mShortRegs[1]; + if (ei->mLightShrinkTimer == temp16) { + fopAcM_seStart(ac, JA_SE_CM_L_ARROW_PASS_AWAY, 0); + } + cLib_addCalc2(&ei->mScaleY, 5.0f + g_regHIO.mChild[14].mFloatRegs[1], 0.1f, 1.0f + g_regHIO.mChild[14].mFloatRegs[2]); + cLib_addCalc0(&ei->mScaleXZ, 0.1f + g_regHIO.mChild[14].mFloatRegs[3], 0.05f + g_regHIO.mChild[14].mFloatRegs[4]); + s8 temp5 = 90 + g_regHIO.mChild[14].mShortRegs[2]; + if (ei->mLightShrinkTimer > temp5) { + fopAcM_delete(ac); + fopAcM_onActor(ac); + if (fopAcM_GetName(ac) != PROC_PZ) { + // If the actor is not Princess Zelda, drop an item ball. + // TODO: Why the Zelda check? Is she coded to be able to die to Light Arrows? + fopAcM_createIball(&pos, ac->mItemTableIdx, fopAcM_GetRoomNo(ac), &ac->current.angle, ac->mItemStealNum); + } + if (ei->mDeathSwitch != 0) { + dComIfGs_onSwitch(ei->mDeathSwitch, fopAcM_GetRoomNo(ac)); + } + ac->mHealth = -0x80; + } + } + } + + return TRUE; + } + + BOOL temp12 = FALSE; + BOOL temp6 = FALSE; + switch (ei->mState) { + case 0: + ei->mStts.Init(0xFA, 0xFF, ac); + ei->mCyl.Set(cc_cyl_src); + ei->mCyl.SetStts(&ei->mStts); + ei->mCyl.SetR(ei->mWallRadius); + ei->mCyl.SetH(ei->mCylHeight); + ei->mBgAcch.Set(&ac->current.pos, &ac->next.pos, ac, 1, &ei->mBgAcchCir, &ei->mSpeed, NULL, NULL); + ei->mBgAcchCir.SetWall(40.0f, ei->mWallRadius); + if (ei->mParticleScale < 0.1f) { + ei->mParticleScale = 1.0f; + } + if (fabsf(ei->mYOffset) < 0.1f) { + ei->mYOffset = 80.0f; + } + ei->mState = 1; + ei->mScaleY = 1.0f; + ei->mScaleXZ = 1.0f; + fopAcM_OnStatus(ac, fopAcStts_UNK8000000_e); + break; + case 1: + if (ei->mFreezeDuration != 0) { + ei->mFreezeTimer = ei->mFreezeDuration; + ei->mFreezeDuration = 0; + ei->mState = 2; + if (ei->m00C == 0) { + ei->mSpeed.y = 30.0f; + ei->mAngularVelY = cM_rndFX(3000.0f); + } + ac->mHealth -= 4; + if (ac->mHealth <= 0) { + ei->m010 = 40; + ei->mSpeed.y = 0.0f; + } + fopAcM_seStart(ac, JA_SE_CM_FREEZE, 0); + + particleScale.setAll(ei->mParticleScale); + pos = ac->current.pos; + pos.y += ei->mYOffset; + dComIfGp_particle_set(0x274, &pos, NULL, &particleScale, 0xFF, NULL, -1, NULL, NULL, NULL); + } else { + return FALSE; + } + // Fall-through + case 2: + temp12 = TRUE; + temp6 = TRUE; + if (ei->m00C != 1) { + ac->mAttentionInfo.mFlags |= 0x10; + ac->mAttentionInfo.mDistances[4] = 0x12; + if (fopAcM_checkStatus(ac, fopAcStts_CARRY_e)) { + ac->mAttentionInfo.mFlags &= ~0x10; + ei->mState = 3; + if (ei->m00C == 2) { + ei->m00C = 0; + } + } + } + break; + case 3: + temp12 = TRUE; + if (!fopAcM_checkStatus(ac, fopAcStts_CARRY_e)) { + if (fopAcM_GetSpeedF(ac) > 0.0f) { + ei->mSpeedF = 25.0f + g_regHIO.mChild[0].mFloatRegs[5]; + ei->mSpeed.y = 20.0f + g_regHIO.mChild[0].mFloatRegs[6]; + } else { + ei->mSpeedF = 5.0f; + ei->mSpeed.y = -15.0; + } + ei->mAngleY = player->shape_angle.y; + ei->mState = 2; + } + break; + } + + if (temp6) { + if (ei->m010 == 0) { + cMtx_YrotS(*calc_mtx, ei->mAngleY); + temp.x = 0.0f; + temp.y = 0.0f; + temp.z = ei->mSpeedF; + MtxPosition(&temp, &temp11); + ei->mSpeed.x = temp11.x; + ei->mSpeed.z = temp11.z; + if (ei->m00C == 2) { + ei->mSpeed.y = 0.0f; + } else { + ac->current.pos += ei->mSpeed; + ei->mSpeed.y -= 5.0f; + } + ac->shape_angle.y += ei->mAngularVelY; + if (ice_bg_check(ei)) { + ei->mFreezeTimer = -1; + } + } else { + ei->m010--; + } + + cXyz* temp11 = ei->mStts.GetCCMoveP(); + if (temp11) { + ac->current.pos += *temp11; + } + + if (fabsf(ei->mSpeedF) > 5.0f) { + ei->mCyl.OnAtSetBit(); + } else { + ei->mCyl.OffAtSetBit(); + } + + ei->mCyl.SetC(ac->current.pos); + dComIfG_Ccsp()->Set(&ei->mCyl); + + if (ei->mFreezeTimer >= 23 && ei->mCyl.ChkTgHit()) { + CcAtInfo atInfo; + atInfo.mpObj = ei->mCyl.GetTgHitObj(); + if (atInfo.mpObj->ChkAtType(AT_TYPE_LIGHT_ARROW)) { + ei->mFreezeTimer = 1; + ei->mLightShrinkTimer = 1; + } else if (atInfo.mpObj->ChkAtType(AT_TYPE_FIRE)) { + ei->mFreezeTimer = 1; + } else if (atInfo.mpObj->ChkAtType(AT_TYPE_BOMB | AT_TYPE_SKULL_HAMMER | AT_TYPE_FIRE_ARROW)) { + if (atInfo.mpObj->ChkAtType(AT_TYPE_SKULL_HAMMER)) { + ei->mFreezeTimer = -2; + } else { + ei->mFreezeTimer = -1; + } + } else { + def_se_set(ac, atInfo.mpObj, 0x42); + } + } + } + + if (temp12) { + // NOTE: Usage of uninitialized variables. + f32 temp_f31; + f32 temp_f30; + + if (ei->mFreezeTimer != 0) { + if (ei->mFreezeTimer < 0) { + // Shattered. + particleScale.setAll(ei->mParticleScale); + pos = ac->current.pos; + pos.y += ei->mYOffset; + dComIfGp_particle_set(0x273, &pos, NULL, &particleScale, 0xFF, NULL, -1, NULL, NULL, NULL); + dComIfGp_particle_set(0x274, &pos, NULL, &particleScale, 0xFF, NULL, -1, NULL, NULL, NULL); + + if (ei->mFreezeTimer == -2) { + // Skull Hammer shattered. + dComIfGp_particle_set(0x10, &pos, NULL, NULL, 0xFF, NULL, -1, NULL, NULL, NULL); + csXyz temp14(0, fopAcM_searchPlayerAngleY(ac), 0); + particleScale.setAll(2.0f); + dComIfGp_particle_set(0xD, &pos, &temp14, &particleScale, 0xFF, NULL, -1, NULL, NULL, NULL); + dScnPly_ply_c::setPauseTimer(8); + } + + fopAcM_seStart(ac, JA_SE_CM_ICE_BREAK, 0); + fopAcM_createIball(&pos, ac->mItemTableIdx, fopAcM_GetRoomNo(ac), &ac->current.angle, ac->mItemStealNum); + ei->mFreezeTimer = 0; + if (ei->mDeathSwitch != 0) { + dComIfGs_onSwitch(ei->mDeathSwitch, fopAcM_GetRoomNo(ac)); + } + temp13 = 1; + } else { + ei->mFreezeTimer--; + } + + if (ei->mFreezeTimer == 0) { + ei->mState = 1; + ei->mCyl.SetC(non_pos); + dComIfG_Ccsp()->Set(&ei->mCyl); + if (fopAcM_checkCarryNow(ac)) { + fopAcM_cancelCarryNow(ac); + } + if (!temp13) { + temp12 = FALSE; + } else { + fopAcM_delete(ac); + fopAcM_onActor(ac); + ac->mHealth = -0x80; + } + } + + if (ei->mFreezeTimer < 50) { + temp_f31 = (ei->mFreezeTimer & 1)*2 - 1; + temp_f30 = (ei->mFreezeTimer+1 & 1)*2 - 1; + } else { + temp_f30 = 0.0f; + temp_f31 = 0.0f; + } + + if (ei->mFreezeTimer == 20) { + particleScale.setAll(ei->mParticleScale); + pos = ac->current.pos; + pos.y += ei->mYOffset; + dComIfGp_particle_set(0x277, &pos, NULL, &particleScale, 0xFF, NULL, -1, NULL, NULL, NULL); + fopAcM_seStart(ac, JA_SE_CM_ICE_RECOVER, 0); + } + } + + ac->current.angle = ac->shape_angle; + + cLib_addCalc2(&ei->m028, ei->m02C, 1.0f, 3.0f); + mDoMtx_stack_c::transS(ac->current.pos.x + temp_f31, ac->current.pos.y + ei->m02C, ac->current.pos.z + temp_f30); + mDoMtx_stack_c::YrotM(ac->shape_angle.y); + mDoMtx_stack_c::XrotM(ac->shape_angle.x); + mDoMtx_stack_c::ZrotM(ac->shape_angle.z); + mDoMtx_stack_c::scaleM(ac->mScale); + fopAcM_OnStatus(ac, fopAcStts_FREEZE_e); + } else { + fopAcM_OffStatus(ac, fopAcStts_FREEZE_e); + cLib_addCalc0(&ei->m028, 1.0f, 3.0f); + } + + return temp12; } +dCcD_SrcSph fire_at_sph_src = { + // dCcD_SrcGObjInf + { + /* Flags */ 0, + /* SrcObjAt Type */ AT_TYPE_FIRE, + /* SrcObjAt Atp */ 0x02, + /* SrcObjAt SPrm */ 0x0F, + /* SrcObjTg Type */ 0, + /* SrcObjTg SPrm */ 0, + /* SrcObjCo SPrm */ 0, + /* SrcGObjAt Se */ 0, + /* SrcGObjAt HitMark */ 0, + /* SrcGObjAt Spl */ 0, + /* SrcGObjAt Mtrl */ 0, + /* SrcGObjAt GFlag */ 0x01, + /* SrcGObjTg Se */ 0, + /* SrcGObjTg HitMark */ 0, + /* SrcGObjTg Spl */ 0, + /* SrcGObjTg Mtrl */ 0, + /* SrcGObjTg GFlag */ 0, + /* SrcGObjCo GFlag */ 0, + }, + // cM3dGSphS + { + /* Center */ 0.0f, 0.0f, 0.0f, + /* Radius */ 50.0f, + }, +}; + /* 8001CDB8-8001D3B0 .text enemy_fire__FP9enemyfire */ -void enemy_fire(enemyfire*) { +void enemy_fire(enemyfire* ef) { /* Nonmatching */ + fopAc_ac_c* ac = ef->mpActor; + cXyz temp; + cXyz temp4; + JGeometry::TVec3 scale; + temp.setAll(0.0f); + // scale = temp; // ?? + + switch (ef->m006) { + case 0: + if (ef->m004 == 0) { + return; + } + ef->m008 = ef->m004; + ef->m004 = 0; + + ef->m006 = 1; + + dKy_plight_set(&ef->mLight); + + for (int i = 0; i < 10; i++) { + if (ef->m010[i] < 0) { + continue; + } + if (ef->mpFireEmitters[i]) { + continue; + } + cXyz scale2; + scale2.setAll(ef->m01C[i]); + ef->mpFireEmitters[i] = dComIfGp_particle_set(0x3F1, &ac->current.pos, NULL, &scale2, 0xFF, NULL, -1, NULL, NULL, NULL); + ef->m044[i] = ef->m008 - (s16)cM_rndF(60.0f); + if (ef->m044[i] < 10) { + ef->m044[i] = 10; + } + ef->m098 = 2.0f; + } + + ef->mStts.Init(0xFA, 0xFF, ac); + ef->mSph.Set(fire_at_sph_src); + ef->mSph.SetStts(&ef->mStts); + break; + case 1: + ef->mLight.mPos = ac->current.pos; + ef->mLight.mColor.r = 600; + ef->mLight.mColor.g = 400; + ef->mLight.mColor.b = 120; + s16 power = ef->m098 * 150.0f; + ef->mLight.mPower = power; + ef->mLight.mFluctuation = 250.0f; + + JGeometry::TVec3 temp10; + temp10 = ac->current.pos - ef->m080; + + ef->m080 = ac->current.pos; + + f32 temp2x = temp10.x * (-0.02f + g_regHIO.mChild[0].mFloatRegs[4]); + f32 temp3x = 1.0f; + if (temp2x > 1.0f) { + temp2x = 1.0f; + } else if (temp2x < -1.0f) { + temp2x = -1.0f; + } + + f32 temp2z = temp10.z * (-0.02f + g_regHIO.mChild[0].mFloatRegs[4]); + if (temp2z > 1.0f) { + temp2z = 1.0f; + } else if (temp2z < -1.0f) { + temp2z = -1.0f; + } + + cLib_addCalc2(&ef->m08C.x, temp2x, 0.5f, 0.05f); + cLib_addCalc2(&ef->m08C.z, temp2z, 0.5f, 0.05f); + + ef->m08C.y = 0.2f + g_regHIO.mChild[0].mFloatRegs[11]; + + f32 temp6 = sqrtf(temp10.x * temp10.x + temp10.y * temp10.y + temp10.z * temp10.z); + temp6 = (0.03f + g_regHIO.mChild[0].mFloatRegs[12]) * temp6 + 1.0f; + if (temp6 > 1.5f + g_regHIO.mChild[0].mFloatRegs[13]) { + temp6 = 1.5f + g_regHIO.mChild[0].mFloatRegs[13]; + } + + cLib_addCalc2(&ef->m098, temp6, 0.5f, 0.05f); + + u8 temp5 = 0; + for (int i = 0; i < 10; i++) { + if (ef->m010[i] < 0) { + continue; + } + if (!ef->mpFireEmitters[i]) { + continue; + } + if (ef->m044[i] == 0) { + ef->mpFireEmitters[i]->becomeInvalidEmitter(); + ef->mpFireEmitters[i] = NULL; + } else { + ef->m044[i]--; + + cMtx_copy(ef->mpMcaMorf->getModel()->getAnmMtx(ef->m010[i]), *calc_mtx); + MtxPosition(&temp, &temp4); + + ef->mpFireEmitters[i]->setGlobalTranslation(temp4.x, temp4.y, temp4.z); + ef->mpFireEmitters[i]->setDirection(ef->m08C); + + scale.set(ef->m01C[i], ef->m098 * ef->m01C[i], ef->m01C[i]); + ef->mpFireEmitters[i]->setGlobalParticleScale(scale); + + if (ef->m09D == temp5) { + ef->mSph.SetC(temp4); + dComIfG_Ccsp()->Set(&ef->mSph); + } + + temp5++; + } + } + + ef->m09D++; + if (ef->m09D >= temp5) { + ef->m09D = 0; + } + + fopAcM_seStart(ac, JA_SE_OBJ_TORCH_BURNING, 0); + + if (ef->m008 == 0) { + ef->m006 = 0; + dKy_plight_cut(&ef->mLight); + ef->mSph.SetC(non_pos); + dComIfG_Ccsp()->Set(&ef->mSph); + } else { + fopAcM_seStart(ac, JA_SE_CM_FIRE_ARROW_BURNING, 0); + } + + if (ef->m008 != 0) { + ef->m008--; + } + break; + } } /* 8001D3B0-8001D428 .text enemy_fire_remove__FP9enemyfire */ -void enemy_fire_remove(enemyfire*) { - /* Nonmatching */ +void enemy_fire_remove(enemyfire* ef) { + ef->m006 = 0; + dKy_plight_cut(&ef->mLight); + + for (int i = 0; i < 10; i++) { + if (ef->mpFireEmitters[i]) { + ef->mpFireEmitters[i]->becomeInvalidEmitter(); + ef->mpFireEmitters[i] = NULL; + } + } } /* 8001D428-8001D48C .text enemy_piyo_set__FP10fopAc_ac_c */ -void enemy_piyo_set(fopAc_ac_c*) { - /* Nonmatching */ +void enemy_piyo_set(fopAc_ac_c* enemy) { + // Creates the rotating stars particle for when an enemy is stunned. + dComIfGp_particle_set(0x27A, &enemy->mAttentionInfo.mPosition, NULL, NULL, 0xFF, NULL, -1, NULL, NULL, NULL); } /* 8001D48C-8001D890 .text wall_angle_get__FP10fopAc_ac_cs */ -void wall_angle_get(fopAc_ac_c*, short) { +void wall_angle_get(fopAc_ac_c*, s16) { /* Nonmatching */ } /* 8001DCC8-8001E244 .text dr_body_bg_check__FP14damagereaction */ -void dr_body_bg_check(damagereaction*) { +void dr_body_bg_check(damagereaction* dr) { /* Nonmatching */ } /* 8001E684-8001F6A0 .text dr_joint_bg_check__FP14damagereaction */ -void dr_joint_bg_check(damagereaction*) { +void dr_joint_bg_check(damagereaction* dr) { /* Nonmatching */ } /* 8001F808-8001FBA8 .text kado_check__FP14damagereaction */ -void kado_check(damagereaction*) { +void kado_check(damagereaction* dr) { /* Nonmatching */ } /* 8001FBA8-8001FFEC .text hang_ang_get__FP14damagereaction */ -void hang_ang_get(damagereaction*) { +void hang_ang_get(damagereaction* dr) { /* Nonmatching */ } /* 8001FFEC-80020FD8 .text dr_damage_set__FP14damagereaction */ -void dr_damage_set(damagereaction*) { +void dr_damage_set(damagereaction* dr) { /* Nonmatching */ } /* 80020FD8-80022460 .text dr_damage_anime__FP14damagereaction */ -void dr_damage_anime(damagereaction*) { +void dr_damage_anime(damagereaction* dr) { /* Nonmatching */ } /* 80022460-800225D0 .text dr_matrix_set__FP14damagereaction */ -void dr_matrix_set(damagereaction*) { +void dr_matrix_set(damagereaction* dr) { /* Nonmatching */ } /* 800225D0-800226C8 .text damage_reaction__FP14damagereaction */ -void damage_reaction(damagereaction*) { +void damage_reaction(damagereaction* dr) { /* Nonmatching */ } diff --git a/src/d/actor/d_a_am.cpp b/src/d/actor/d_a_am.cpp index 90f4947cd..0ad98be9b 100644 --- a/src/d/actor/d_a_am.cpp +++ b/src/d/actor/d_a_am.cpp @@ -335,8 +335,8 @@ static BOOL medama_atari_check(am_class* i_this) { break; case AT_TYPE_LIGHT_ARROW: ret = true; - i_this->mEnemyIce.mNumFramesDyingToLightArrowsSoFar = 1; - i_this->mEnemyIce.m1AC = 1.0f; + i_this->mEnemyIce.mLightShrinkTimer = 1; + i_this->mEnemyIce.mParticleScale = 1.0f; i_this->mEnemyIce.mYOffset = 80.0f; i_this->mAttentionInfo.mFlags = 0; break; diff --git a/src/d/actor/d_a_item.cpp b/src/d/actor/d_a_item.cpp index 904876029..a73bdbc39 100644 --- a/src/d/actor/d_a_item.cpp +++ b/src/d/actor/d_a_item.cpp @@ -810,7 +810,7 @@ BOOL daItem_c::checkItemDisappear() { if (mCurState == 4) { disappearing = false; } - if ((mStatusFlags & 0x08) || (mStatusFlags & 0x40) || (mStatus & 0x100000)) { + if ((mStatusFlags & 0x08) || (mStatusFlags & 0x40) || (mStatus & fopAcStts_HOOK_CARRY_e)) { disappearing = false; show(); } diff --git a/src/d/actor/d_a_obj_mknjd.cpp b/src/d/actor/d_a_obj_mknjd.cpp index 759f6b1c9..cdb1684bd 100644 --- a/src/d/actor/d_a_obj_mknjd.cpp +++ b/src/d/actor/d_a_obj_mknjd.cpp @@ -758,10 +758,10 @@ bool daObjMknjD::Act_c::daObjMknjD_break() { JGeometry::TVec3 vec; vec.set(3.0f, 3.0f, 3.0f); - mEmitters[3]->setGlobalParticleScale(vec); + mEmitters[3]->setGlobalDynamicsScale(vec); vec.set(6.0f, 6.0f, 6.0f); - mEmitters[3]->setGlobalDynamicsScale(vec); + mEmitters[3]->setGlobalParticleScale(vec); } } // After 255 frames, the cutscene ends. diff --git a/src/d/d_bg_s_acch.cpp b/src/d/d_bg_s_acch.cpp index 0e63f4693..099026b53 100644 --- a/src/d/d_bg_s_acch.cpp +++ b/src/d/d_bg_s_acch.cpp @@ -81,19 +81,20 @@ void dBgS_Acch::Init() { } /* 800A2D78-800A2E80 .text Set__9dBgS_AcchFP4cXyzP4cXyzP10fopAc_ac_ciP12dBgS_AcchCirP4cXyzP5csXyzP5csXyz */ -void dBgS_Acch::Set(cXyz* param_1, cXyz* param_2, fopAc_ac_c* param_3, int param_4, dBgS_AcchCir* param_5, cXyz* param_6, csXyz* param_7, csXyz* param_8) { - pm_pos = param_1; - pm_old_pos = param_2; +void dBgS_Acch::Set(cXyz* pos, cXyz* old_pos, fopAc_ac_c* actor, int tbl_size, dBgS_AcchCir* acchCir, cXyz* speed, + csXyz* angle, csXyz* shape_angle) { + pm_pos = pos; + pm_old_pos = old_pos; JUT_ASSERT(221, pm_pos != 0); JUT_ASSERT(222, pm_old_pos != 0); - m_my_ac = param_3; - SetActorPid(fopAcM_GetID(param_3)); - pm_speed = param_6; - m_tbl_size = param_4; - pm_acch_cir = param_5; - pm_angle = param_7; - pm_shape_angle = param_8; + m_my_ac = actor; + SetActorPid(fopAcM_GetID(actor)); + pm_speed = speed; + m_tbl_size = tbl_size; + pm_acch_cir = acchCir; + pm_angle = angle; + pm_shape_angle = shape_angle; } /* 800A2E80-800A2EE8 .text GroundCheckInit__9dBgS_AcchFR4dBgS */