From c1cf48eca35c6626de7510fbd7dbc682ad4a0889 Mon Sep 17 00:00:00 2001 From: SuperDude88 <82904174+SuperDude88@users.noreply.github.com> Date: Sat, 7 Oct 2023 13:50:09 -0400 Subject: [PATCH] More Matches - Match a few more functions - Offset comments --- include/SSystem/SComponent/c_bg_s_gnd_chk.h | 3 +- include/SSystem/SComponent/c_lib.h | 4 +- include/d/actor/d_a_bomb.h | 124 ++++----- include/d/actor/d_a_bomb2.h | 113 ++++---- include/d/d_bg_s_acch.h | 1 + include/d/d_bg_s_gnd_chk.h | 4 +- include/d/d_com_inf_game.h | 10 + src/d/actor/d_a_bomb.cpp | 48 +++- src/d/actor/d_a_bomb2.cpp | 294 +++++++++++++++----- src/d/d_particle.cpp | 2 +- 10 files changed, 407 insertions(+), 196 deletions(-) diff --git a/include/SSystem/SComponent/c_bg_s_gnd_chk.h b/include/SSystem/SComponent/c_bg_s_gnd_chk.h index 634c0dff6..73ba74483 100644 --- a/include/SSystem/SComponent/c_bg_s_gnd_chk.h +++ b/include/SSystem/SComponent/c_bg_s_gnd_chk.h @@ -18,7 +18,8 @@ public: f32 GetNowY() const { return mNowY; } void SetNowY(f32 y) { mNowY = y; } - cXyz& GetPointP() { return m_pos; } + cXyz* GetPointP() { return &m_pos; } + void SetPos(cXyz* pos) { m_pos.set(*pos); } u32 GetWallPrecheck() const { return mWallPrecheck; } void OffWall() { mFlags &= ~2; } diff --git a/include/SSystem/SComponent/c_lib.h b/include/SSystem/SComponent/c_lib.h index 819189e72..a6b36cfba 100644 --- a/include/SSystem/SComponent/c_lib.h +++ b/include/SSystem/SComponent/c_lib.h @@ -37,12 +37,12 @@ void cLib_offsetPos(cXyz* pDest, cXyz* pSrc, s16 angle, cXyz* vec); s32 cLib_distanceAngleS(s16 x, s16 y); template -inline void cLib_offBit(T& value, u8 bit) { +inline void cLib_offBit(T& value, T bit) { value &= ~bit; } template -inline void cLib_onBit(T& value, u8 bit) { +inline void cLib_onBit(T& value, T bit) { value |= bit; } diff --git a/include/d/actor/d_a_bomb.h b/include/d/actor/d_a_bomb.h index bcfac6154..46789792d 100644 --- a/include/d/actor/d_a_bomb.h +++ b/include/d/actor/d_a_bomb.h @@ -23,12 +23,12 @@ public: void setup(JPABaseEmitter*, cXyz const*, csXyz const*, s8); - s16 field_0x04; - const cXyz* mpPos; - cXyz* field_0x0C; - cXyz* field_0x10; - JPABaseEmitter* mpEmitter; -}; + /* 0x04 */ s16 field_0x04; + /* 0x08 */ const cXyz* mpPos; + /* 0x0C */ cXyz* field_0x0C; + /* 0x10 */ cXyz* field_0x10; + /* 0x14 */ JPABaseEmitter* mpEmitter; +}; // Size 0x18 class daBomb_fuseSparksEcallBack : public dPa_levelEcallBack { public: @@ -42,14 +42,14 @@ public: void setup(JPABaseEmitter*, cXyz const*, csXyz const*, s8); - const cXyz* mpPos; - JPABaseEmitter* mpEmitter; -}; + /* 0x04 */ const cXyz* mpPos; + /* 0x08 */ JPABaseEmitter* mpEmitter; +}; // Size 0x0C class dBgS_BombAcch : public dBgS_Acch { public: dBgS_BombAcch() { mbBombThrough = true; } -}; +}; // Size 0x1C4 class daBomb_c : public fopAc_ac_c { @@ -159,63 +159,63 @@ public: private: typedef bool(daBomb_c::*procFunc)(); - procFunc mFunc; - request_of_phase_process_class mPhs; - J3DModel* mpModel; - mDoExt_bckAnm mBck0; - mDoExt_bckAnm mBck1; - mDoExt_brkAnm mBrk0; - mDoExt_brkAnm mBrk1; - s32 mType; - dBgS_BombAcch mAcch; - dBgS_AcchCir mCir; - dBgS_ObjGndChk_Yogan mGndChk; - cXyz field_0x554; - bool field_0x560; - bool mbWaterIn; - u8 field_0x562; - dCcD_Stts mStts; - dCcD_Sph mSph; - daBomb_fuseSmokeEcallBack mSmoke; - daBomb_fuseSparksEcallBack mSparks; - u8 field_0x6F0; - u8 field_0x6F1; - u8 field_0x6F2; - u8 field_0x6F3; - u8 field_0x6F4; - u8 field_0x6F5; - u8 field_0x6F6; - u8 field_0x6F7; - s32 mInitialState; - s16 mRestTime; - s16 field_0x6FE; - s16 mNoGravityTime; - s16 field_0x702; - cXyz mFusePos; - cXyz mFusePos2; - cXyz mFusePos3; - LIGHT_INFLUENCE mPntLight; - WIND_INFLUENCE mPntWind; - u8 field_0x774; - f32 field_0x778; - u8 field_0x77C; - u8 field_0x77D; - u8 field_0x77E; - u8 field_0x77F; - u8 field_0x780; - u8 field_0x781; - u8 field_0x782; - int field_0x784; - cXyz mWindVec; - u8 field_0x794[0x7C4 - 0x794]; - int mMassCounter; - int field_0x7C8; + /* 0x290 */ procFunc mFunc; + /* 0x29C */ request_of_phase_process_class mPhs; + /* 0x2A4 */ J3DModel* mpModel; + /* 0x2A8 */ mDoExt_bckAnm mBck0; + /* 0x2B8 */ mDoExt_bckAnm mBck1; + /* 0x2C8 */ mDoExt_brkAnm mBrk0; + /* 0x2E0 */ mDoExt_brkAnm mBrk1; + /* 0x2F8 */ s32 mType; + /* 0x2FC */ dBgS_BombAcch mAcch; + /* 0x4C0 */ dBgS_AcchCir mCir; + /* 0x500 */ dBgS_ObjGndChk_Yogan mGndChk; + /* 0x554 */ cXyz field_0x554; + /* 0x560 */ bool field_0x560; + /* 0x561 */ bool mbWaterIn; + /* 0x562 */ u8 field_0x562; + /* 0x564 */ dCcD_Stts mStts; + /* 0x5A0 */ dCcD_Sph mSph; + /* 0x6CC */ daBomb_fuseSmokeEcallBack mSmoke; + /* 0x6E4 */ daBomb_fuseSparksEcallBack mSparks; + /* 0x6F0 */ u8 field_0x6F0; + /* 0x6F1 */ u8 field_0x6F1; + /* 0x6F2 */ u8 field_0x6F2; + /* 0x6F3 */ u8 field_0x6F3; + /* 0x6F4 */ u8 field_0x6F4; + /* 0x6F5 */ u8 field_0x6F5; + /* 0x6F6 */ u8 field_0x6F6; + /* 0x6F7 */ u8 field_0x6F7; + /* 0x6F8 */ s32 mInitialState; + /* 0x6FC */ s16 mRestTime; + /* 0x6FE */ s16 field_0x6FE; + /* 0x700 */ s16 mNoGravityTime; + /* 0x702 */ s16 field_0x702; + /* 0x704 */ cXyz mFusePos; //should figure out what this 3 cXyz thing really is + /* 0x710 */ cXyz mFusePos2; //seems like several particle structures use it and a couple construct it as a TVec3 array + /* 0x71C */ cXyz mFusePos3; //others have no special construction, and it gets passed to functions that take cXyz sometimes + /* 0x728 */ LIGHT_INFLUENCE mPntLight; + /* 0x748 */ WIND_INFLUENCE mPntWind; + /* 0x774 */ u8 field_0x774; + /* 0x778 */ f32 field_0x778; + /* 0x77C */ u8 field_0x77C; + /* 0x77D */ u8 field_0x77D; + /* 0x77E */ u8 field_0x77E; + /* 0x77F */ u8 field_0x77F; + /* 0x780 */ u8 field_0x780; + /* 0x781 */ u8 field_0x781; + /* 0x782 */ u8 field_0x782; + /* 0x784 */ int field_0x784; + /* 0x788 */ cXyz mWindVec; + /* 0x794 */ u8 field_0x794[0x7C4 - 0x794]; + /* 0x7C4 */ int mMassCounter; + /* 0x7C8 */ int field_0x7C8; struct AttrType { const char* resName; u32 heapSize; }; static const AttrType m_attrType[]; -}; +}; // Size 0x7CC #endif /* D_A_BOMB_H */ diff --git a/include/d/actor/d_a_bomb2.h b/include/d/actor/d_a_bomb2.h index a30022593..969b3880b 100644 --- a/include/d/actor/d_a_bomb2.h +++ b/include/d/actor/d_a_bomb2.h @@ -27,12 +27,12 @@ namespace daBomb2 { void setup(JPABaseEmitter*, cXyz const*, csXyz const*, s8); - s16 field_0x04; - const cXyz* mpPos; - const cXyz* field_0x0C; - const cXyz* field_0x10; - JPABaseEmitter* mpEmitter; - }; + /* 0x04 */ s16 field_0x04; + /* 0x08 */ const cXyz* mpPos; + /* 0x0C */ const cXyz* field_0x0C; + /* 0x10 */ const cXyz* field_0x10; + /* 0x14 */ JPABaseEmitter* mpEmitter; + }; // Size 0x18 class FuseSparksCB_c : public dPa_levelEcallBack { public: @@ -48,9 +48,9 @@ namespace daBomb2 { void setup(JPABaseEmitter*, cXyz const*, csXyz const*, s8); - const cXyz* mpPos; - JPABaseEmitter* mpEmitter; - }; + /* 0x04 */ const cXyz* mpPos; + /* 0x08 */ JPABaseEmitter* mpEmitter; + }; // Size 0x0C class Env_c { public: @@ -59,11 +59,12 @@ namespace daBomb2 { bool is_end() const; void proc(const cXyz&); - LIGHT_INFLUENCE mPntLight; - WIND_INFLUENCE mPntWind; - u8 field_0x4C; - f32 field_0x50; - }; + private: + /* 0x00 */ LIGHT_INFLUENCE mPntLight; + /* 0x20 */ WIND_INFLUENCE mPntWind; + /* 0x4C */ u8 field_0x4C; + /* 0x50 */ f32 field_0x50; + }; // Size 0x54 class Act_c : public fopAc_ac_c { public: @@ -79,8 +80,8 @@ namespace daBomb2 { bool chk_explode(); static int solidHeapCB(fopAc_ac_c*); - int create_heap_nut(); - int create_heap(); + bool create_heap_nut(); + bool create_heap(); void crr_init(); void cc_init(); void start_explode_instant(); @@ -167,44 +168,54 @@ namespace daBomb2 { }; private: - //some of these might be extra since i initially copied them from daBomb_c - request_of_phase_process_class mPhs; - J3DModel* mpModel; - mDoExt_bckAnm mBck0; - mDoExt_brkAnm mBrk0; - dBgS_BombAcch mAcch; - dBgS_AcchCir mCir; - dBgS_ObjGndChk_Yogan mGndChk; - f32 field_0x51C; - f32 field_0x520; - bool field_0x524; - bool mbWaterIn; - u8 field_0x526; - f32 field_0x528; - dCcD_Stts mStts; - dCcD_Sph mSph; - int field_0x694; - int field_0x698; + //some of these might need updating since i initially copied them from daBomb_c + /* 0x290 */ request_of_phase_process_class mPhs; + /* 0x298 */ J3DModel* mpModel; + /* 0x29C */ mDoExt_bckAnm mBck0; + /* 0x2AC */ mDoExt_brkAnm mBrk0; + /* 0x2C4 */ dBgS_BombAcch mAcch; + /* 0x488 */ dBgS_AcchCir mCir; + /* 0x4C8 */ dBgS_ObjGndChk_Yogan mGndChk; + /* 0x51C */ f32 field_0x51C; + /* 0x520 */ f32 field_0x520; + /* 0x524 */ bool field_0x524; + /* 0x525 */ bool mbWaterIn; + /* 0x526 */ u8 field_0x526; + /* 0x528 */ f32 field_0x528; + /* 0x52C */ dCcD_Stts mStts; + /* 0x568 */ dCcD_Sph mSph; + /* 0x694 */ int field_0x694; + /* 0x698 */ int field_0x698; - FuseSmokeCB_c mSmoke; - FuseSparksCB_c mSparks; - cXyz field_0x6C0; - cXyz field_0x6CC; - cXyz field_0x6D8; - Env_c mEnv; - int field_0x738; - int field_0x73C; - u8 field_0x740; - u8 field_0x741; - u8 field_0x742; - u8 field_0x743; - bool field_0x744; - bool field_0x745; - cXyz field_0x748; - Mtx field_0x754; + /* 0x69C */ FuseSmokeCB_c mSmoke; + /* 0x6B4 */ FuseSparksCB_c mSparks; + /* 0x6C0 */ cXyz field_0x6C0; + /* 0x6CC */ cXyz field_0x6CC; + /* 0x6D8 */ cXyz field_0x6D8; + /* 0x6E4 */ Env_c mEnv; + /* 0x738 */ int field_0x738; + /* 0x73C */ int field_0x73C; + /* 0x740 */ u8 field_0x740; + /* 0x741 */ u8 field_0x741; + /* 0x742 */ u8 field_0x742; + /* 0x743 */ u8 field_0x743; + /* 0x744 */ bool field_0x744; + /* 0x745 */ bool field_0x745; + /* 0x748 */ cXyz field_0x748; + /* 0x754 */ Mtx field_0x754; + /* 0x784 */ f32 field_0x784; + /* 0x788 */ f32 field_0x788; + /* 0x78C */ f32 field_0x78C; + /* 0x790 */ f32 field_0x790; + /* 0x794 */ f32 field_0x794; + /* 0x798 */ f32 field_0x798; + /* 0x79C */ f32 field_0x79C; + /* 0x7A0 */ f32 field_0x7A0; + /* 0x7A4 */ f32 field_0x7A4; + /* 0x7A8 */ s32 field_0x7A8; static dCcD_SrcSph M_sph_src; - }; + }; // Size 0x7AC } #endif /* D_A_BOMB_2_H */ diff --git a/include/d/d_bg_s_acch.h b/include/d/d_bg_s_acch.h index 214961edd..e457f1f40 100644 --- a/include/d/d_bg_s_acch.h +++ b/include/d/d_bg_s_acch.h @@ -40,6 +40,7 @@ public: f32 GetWallH() { return m_wall_h; } f32 GetWallR() { return m_wall_r; } + s16 GetWallAngleY() { return m_wall_angle_y; } void SetWallH(f32 h) { m_wall_h = h; } void ClrWallHDirect() { m_flags &= ~WALL_H_DIRECT; } bool ChkWallHit() { return m_flags & WALL_HIT; } diff --git a/include/d/d_bg_s_gnd_chk.h b/include/d/d_bg_s_gnd_chk.h index c2e436d0f..b277f033e 100644 --- a/include/d/d_bg_s_gnd_chk.h +++ b/include/d/d_bg_s_gnd_chk.h @@ -26,7 +26,7 @@ public: dBgS_ObjGndChk() { SetObj(); } virtual ~dBgS_ObjGndChk() {} -}; +}; // Size: 0x54 class dBgS_ObjGndChk_Yogan : public dBgS_ObjGndChk { public: @@ -36,7 +36,7 @@ public: } /* 806bf53c */ virtual ~dBgS_ObjGndChk_Yogan(); -}; +}; // Size: 0x54 class dBgS_ObjGndChk_Wtr : public dBgS_ObjGndChk { public: diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index 9921818e7..48d330f5d 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -1596,6 +1596,16 @@ inline JPABaseEmitter* dComIfGp_particle_setToon(u16 particleID, const cXyz* pos pPrmColor, pEnvColor, pScale2D); } +inline JPABaseEmitter* dComIfGp_particle_setToonP1(u16 particleID, const cXyz* pos, + const csXyz* angle, const cXyz* scale, u8 alpha, + dPa_levelEcallBack* pCallBack, s8 setupInfo, + const GXColor* pPrmColor, const GXColor* pEnvColor, + const cXyz* pScale2D) { + dPa_control_c* pParticle = g_dComIfG_gameInfo.play.getParticle(); + return pParticle->setToonP1(particleID, pos, angle, scale, alpha, pCallBack, setupInfo, + pPrmColor, pEnvColor, pScale2D); +} + inline JPABaseEmitter* dComIfGp_particle_setProjection(u16 particleID, const cXyz* pos, const csXyz* angle, const cXyz* scale, u8 alpha, dPa_levelEcallBack* pCallBack, s8 setupInfo, diff --git a/src/d/actor/d_a_bomb.cpp b/src/d/actor/d_a_bomb.cpp index 4f94bc832..858a8d8b1 100644 --- a/src/d/actor/d_a_bomb.cpp +++ b/src/d/actor/d_a_bomb.cpp @@ -510,7 +510,7 @@ void daBomb_c::bgCrrPos() { void daBomb_c::bgCrrPos_lava() { cXyz temp(current.pos.x, next.pos.y + 1.0f, current.pos.z); - mGndChk.GetPointP() = temp; + mGndChk.SetPos(&temp); field_0x554.x = dComIfG_Bgsp()->GroundCross(&mGndChk); } @@ -546,9 +546,33 @@ bool daBomb_c::chk_dead_zone() { return mAcch.GetGroundH() == -1.0e9f && field_0x554.y == -1.0e9f && field_0x554.x == -1.0e9f; } -/* 800DA7CC-800DA8C8 .text bound__8daBomb_cFf */ -void daBomb_c::bound(f32) { - /* Nonmatching */ +void daBomb_c::bound(f32 param_1) { + if(mAcch.ChkWallHit()) { + speedF *= 0.8f; + current.angle.y = (mCir.GetWallAngleY() * 2) - (current.angle.y - 0x8000); //+ 0x10000 - 0x8000 generates the addis but seems fake + } + + if(mAcch.ChkGroundLanding()) { + daObj::make_land_effect(this, &mAcch.m_gnd, 0.6f); + param_1 *= -0.6f; + if(param_1 < 19.5f) { + field_0x780 = 0; + } + else { + speedF *= 0.9f; + if(param_1 > 13.0f) { + speed.y = 13.0f; + } + else { + speed.y = param_1; + } + } + } + else { + if(mAcch.ChkGroundHit()) { + cLib_addCalc(&speedF, 0.0f, 0.5f, 5.5f, 1.0f); + } + } } /* 800DA8C8-800DA9DC .text set_real_shadow_flag__8daBomb_cFv */ @@ -619,23 +643,23 @@ void daBomb_c::setFuseEffect() { mFusePos2 = mFusePos; mFusePos3 = mFusePos; - dComIfGp_particle_setToon(0x11, &mFusePos, 0, &mScale, 0xFF, &mSparks, -1, 0, 0, 0); - dComIfGp_particle_setToonP1(0x2012, &mFusePos, 0, &mScale, 0xDC, &mSmoke, -1, 0, 0, 0); - mSmoke.field_0x0C = &mFusePos2; - mSmoke.field_0x10 = &mFusePos3; - mSmoke.field_0x04 = 0x14; + dComIfGp_particle_setP1(0x11, &mFusePos, 0, &mScale, 0xFF, &mSparks, -1, 0, 0, 0); + dComIfGp_particle_setToonP1(0x2012, &mFusePos, 0, &mScale, 0xDC, &mSmoke, -1, 0, 0, 0); + mSmoke.field_0x0C = &mFusePos2; + mSmoke.field_0x10 = &mFusePos3; + mSmoke.field_0x04 = 0x14; } } void daBomb_c::eff_explode_normal(const csXyz* rotation) { - dComIfGp_particle_setToon(0xB, ¤t.pos, rotation, &mScale, 0xFF, 0, -1, 0, 0, 0); + dComIfGp_particle_setP1(0xB, ¤t.pos, rotation, &mScale, 0xFF, 0, -1, 0, 0, 0); g_dComIfG_gameInfo.play.getParticle()->setBombSmoke(0x2009, ¤t.pos, 0, &mScale, 0xFF); g_dComIfG_gameInfo.play.getParticle()->setBombSmoke(0x200A, ¤t.pos, 0, &mScale, 0xFF); dComIfGp_particle_setToonP1(0x2008, ¤t.pos, 0, &mScale, 0xFF, 0, -1, 0, 0, 0); } void daBomb_c::eff_explode_cheap(const csXyz* rotation) { - JPABaseEmitter* emitter = dComIfGp_particle_setToon(0xB, ¤t.pos, rotation, &mScale, 0xFF, 0, -1, 0, 0, 0); + JPABaseEmitter* emitter = dComIfGp_particle_setP1(0xB, ¤t.pos, rotation, &mScale, 0xFF, 0, -1, 0, 0, 0); if(emitter) { emitter->mLifeTime = 0xC; emitter->mGlobalScale2D.set(0.5f, 0.67f, 1.0f); @@ -682,7 +706,7 @@ int daBomb_c::procExplode_init() { cXyz temp3; dBgS_ObjGndChk gndCheck; temp3.set(current.pos.x, current.pos.y + 1.0f, current.pos.z); - gndCheck.GetPointP().set(current.pos.x, current.pos.y + 1.0f, current.pos.z); + gndCheck.SetPos(&temp3); if(dComIfG_Bgsp()->GroundCross(&gndCheck) > temp2 || current.pos.y > temp2 + 50.0f) { temp = 0; diff --git a/src/d/actor/d_a_bomb2.cpp b/src/d/actor/d_a_bomb2.cpp index 059983e3e..0aaff5ab2 100644 --- a/src/d/actor/d_a_bomb2.cpp +++ b/src/d/actor/d_a_bomb2.cpp @@ -28,10 +28,25 @@ namespace daBomb2 { f32 field_0x24; f32 field_0x28; f32 field_0x2C; + f32 field_0x30; + f32 field_0x34; + f32 field_0x38; + f32 field_0x3C; + f32 field_0x40; + f32 field_0x44; + f32 field_0x48; + f32 field_0x4C; + f32 field_0x50; + f32 field_0x54; + f32 field_0x58; + f32 field_0x5C; + f32 field_0x60; + f32 field_0x64; + f32 field_0x68; }; const AttrType L_attr = { - "VbakH", 0x920, 0x96, 0x1E, 2.9f, -100.0f, -0.6f, 19.5f, 13.0f, 0.1f, 0.5f, 20.0f, 25.0f + "VbakH", 0x920, 0x96, 0x1E, 2.9f, -100.0f, -0.6f, 19.5f, 13.0f, 0.1f, 0.5f, 20.0f, 25.0f, 0.002f, 0.0005f, 140.0f, 100.0f, 180.0f, 50.0f, 2.0f, 0.3f, 0.03f, 0.1f, 0.4f, 0.5f, -0.005f, 1.5f, 0.6f }; } @@ -171,12 +186,11 @@ namespace daBomb2 { mpEmitter = param_1; } - /* 800DDB88-800DDBAC .text solidHeapCB__Q27daBomb25Act_cFP10fopAc_ac_c */ int Act_c::solidHeapCB(fopAc_ac_c* i_this) { return static_cast(i_this)->create_heap(); } - int Act_c::create_heap_nut() { + bool Act_c::create_heap_nut() { const char* resName = L_attr.resName; J3DModelData* mdl_data = (J3DModelData*)dComIfG_getObjectRes(resName, 0xC); @@ -191,15 +205,10 @@ namespace daBomb2 { JUT_ASSERT(0x314, brk_data != 0); int temp3 = mBrk0.init(mdl_data, brk_data, true, 0, 1.0f, 0, -1, false, 0); - int ret = 0; - if(mpModel && temp && temp3) { - ret = 1; - } - - return ret; + return mpModel && temp && temp3; } - int Act_c::create_heap() { + bool Act_c::create_heap() { return create_heap_nut(); } @@ -365,7 +374,7 @@ namespace daBomb2 { /* 800DE8A8-800DE914 .text bgCrrPos_lava__Q27daBomb25Act_cFv */ void Act_c::bgCrrPos_lava() { cXyz temp(current.pos.x, next.pos.y + 1.0f, current.pos.z); - mGndChk.GetPointP() = temp; + mGndChk.SetPos(&temp); field_0x51C = dComIfG_Bgsp()->GroundCross(&mGndChk); } @@ -402,9 +411,33 @@ namespace daBomb2 { current.roomNo = roomNo; } - /* 800DEAC4-800DEBD0 .text bound__Q27daBomb25Act_cFf */ - void Act_c::bound(float) { - /* Nonmatching */ + void Act_c::bound(f32 param_1) { + if(mAcch.ChkWallHit()) { + speedF *= 0.8f; + current.angle.y = (mCir.GetWallAngleY() * 2) - (current.angle.y - 0x8000); //+ 0x10000 - 0x8000 generates the addis but seems fake + } + + if(mAcch.ChkGroundLanding()) { + daObj::make_land_effect(this, &mAcch.m_gnd, L_attr.field_0x68); + param_1 *= L_attr.field_0x14; + if(param_1 < L_attr.field_0x18) { + field_0x741 = 0; + } + else { + speedF *= 0.9f; + if(param_1 > L_attr.field_0x1C) { + speed.y = L_attr.field_0x1C; + } + else { + speed.y = param_1; + } + } + } + else { + if(mAcch.ChkGroundHit()) { + cLib_addCalc(&speedF, 0.0f, 0.5f, 5.5f, 1.0f); + } + } } void Act_c::set_nut_exp_interval() { @@ -446,7 +479,7 @@ namespace daBomb2 { } void Act_c::eff_explode_normal(const csXyz* rotation) { - dComIfGp_particle_setToon(0xB, ¤t.pos, rotation, &mScale, 0xFF, 0, -1, 0, 0, 0); + dComIfGp_particle_setP1(0xB, ¤t.pos, rotation, &mScale, 0xFF, 0, -1, 0, 0, 0); g_dComIfG_gameInfo.play.getParticle()->setBombSmoke(0x2009, ¤t.pos, 0, &mScale, 0xFF); g_dComIfG_gameInfo.play.getParticle()->setBombSmoke(0x200A, ¤t.pos, 0, &mScale, 0xFF); dComIfGp_particle_setToonP1(0x2008, ¤t.pos, 0, &mScale, 0xFF, 0, -1, 0, 0, 0); @@ -468,14 +501,32 @@ namespace daBomb2 { field_0x744 = 0; } - /* 800DF1F0-800DF314 .text eff_fuse_start__Q27daBomb25Act_cFv */ void Act_c::eff_fuse_start() { - /* Nonmatching */ + if(!field_0x744) { + field_0x744 = 1; + + field_0x6C0.x = current.pos.x; + field_0x6C0.y = current.pos.y + 60.0f; + field_0x6C0.z = current.pos.z; + field_0x6CC = field_0x6C0; + field_0x6D8 = field_0x6C0; + + dComIfGp_particle_setP1(0x11, &field_0x6C0, 0, &mScale, 0xFF, &mSparks, -1, 0, 0, 0); + dComIfGp_particle_setToonP1(0x2012, &field_0x6C0, 0, &mScale, 0xDC, &mSmoke, -1, 0, 0, 0); + mSmoke.setOldPosP(&field_0x6CC, &field_0x6D8); + } } - /* 800DF314-800DF3DC .text eff_fuse_move__Q27daBomb25Act_cFv */ void Act_c::eff_fuse_move() { - /* Nonmatching */ + static cXyz fuse_offset(0.0f, 60.0f, 5.0f); + + field_0x6D8 = field_0x6CC; + field_0x6CC = field_0x6C0; + mDoMtx_stack_c::multVec(&fuse_offset, &field_0x6C0); + + if(field_0x744) { + se_ignition(); + } } /* 800DF3DC-800DF41C .text eff_fuse_end__Q27daBomb25Act_cFv */ @@ -630,12 +681,7 @@ namespace daBomb2 { } bool Act_c::chk_exp_pre() { - bool ret = false; - if(chk_exp_cc() || chk_exp_timer()) { - ret = true; - } - - return ret; + return chk_exp_cc() || chk_exp_timer(); } bool Act_c::chk_exp_post() { @@ -656,97 +702,197 @@ namespace daBomb2 { /* Nonmatching */ } - /* 800DFDB0-800DFDC0 .text on_carry__Q27daBomb25Act_cFv */ void Act_c::on_carry() { - /* Nonmatching */ + mAttentionInfo.setFlag(0x10); } - /* 800DFDC0-800DFDD0 .text off_carry__Q27daBomb25Act_cFv */ void Act_c::off_carry() { - /* Nonmatching */ + mAttentionInfo.mFlags &= ~0x10; } - /* 800DFDD0-800DFDF8 .text mode_wait_init__Q27daBomb25Act_cFv */ void Act_c::mode_wait_init() { - /* Nonmatching */ + field_0x694 = 0; + mGravity = L_attr.gravity; + mSph.GetObjCo().OnSPrmBit(cCcD_ObjCommonBase::CO_SPRM_SET); } - /* 800DFDF8-800DFF40 .text mode_wait__Q27daBomb25Act_cFv */ void Act_c::mode_wait() { - /* Nonmatching */ + if(chk_exp_pre()) { + mode_explode_init(); + mode_explode(); + } + else { + if(fopAcM_checkCarryNow(this)) { + mode_carry_init(); + mode_carry(); + } + else { + bool temp = daObj::PrmAbstract(this, PRM_1_W, PRM_1_S); + f32 yVel = 0.0f; + if(!temp) { + if(!field_0x745) { + posMoveF(); + } + + yVel = speed.y; + bgCrrPos(); + } + + if(chk_exp_post()) { + mode_explode_init(); + } + else { + if(chk_sink_post()) { + mode_sink_init(); + } + else { + if(!field_0x740) { + if(temp) { + off_carry(); + } + else { + bound(yVel); + if(mAcch.ChkGroundHit()) { + on_carry(); + } + else { + off_carry(); + } + } + } + } + } + } + } } - /* 800DFF40-800DFFA4 .text mode_carry_init__Q27daBomb25Act_cFv */ void Act_c::mode_carry_init() { + field_0x694 = 1; + speedF = 0.0f; + speed = cXyz::Zero; off_carry(); + mSph.GetObjCo().OffSPrmBit(cCcD_ObjCommonBase::CO_SPRM_SET); } - /* 800DFFA4-800E006C .text mode_carry__Q27daBomb25Act_cFv */ void Act_c::mode_carry() { carry_fuse_start(); - chk_exp_pre(); + if(chk_exp_pre()) { + mode_explode_init(); + mode_explode(); + } + else { + if(!fopAcM_checkCarryNow(this)) { + if(speedF > 0.0f) { + field_0x741 = 1; + field_0x7A8 = 2; + } - bgCrrPos(); + mode_wait_init(); + mode_wait(); + } + else { + cXyz temp = current.pos; + bgCrrPos(); + current.pos = temp; + } + } } - /* 800E006C-800E0150 .text mode_explode_init__Q27daBomb25Act_cFv */ void Act_c::mode_explode_init() { + field_0x694 = 2; camera_lockoff(); eff_fuse_end(); mEnv.set(current.pos); + speedF = 0.0f; + speed = cXyz::Zero; + mGravity = 0.0f; off_carry(); mSph.GetObjTg().OffSPrmBit(cCcD_ObjCommonBase::CO_SPRM_SET); mSph.GetObjCo().OffSPrmBit(cCcD_ObjCommonBase::CO_SPRM_SET); mSph.GetObjAt().OnSPrmBit(cCcD_ObjCommonBase::CO_SPRM_SET); fopAcM_cancelCarryNow(this); + field_0x738 = 0; + field_0x73C = 4; dComIfGp_getVibration().StartShock(7, -0x21, cXyz(0.0f, 1.0f, 0.0f)); } - /* 800E0150-800E01A8 .text mode_explode__Q27daBomb25Act_cFv */ void Act_c::mode_explode() { mEnv.proc(current.pos); - if(mEnv.is_end()) { - field_0x524 = 4; + if(!field_0x73C && mEnv.is_end()) { + field_0x740 = 1; } } - /* 800E01A8-800E0238 .text mode_sink_init__Q27daBomb25Act_cFv */ void Act_c::mode_sink_init() { + field_0x694 = 3; + speed.y *= 0.8f; + speedF *= 0.8f; + mSph.GetObjAt().OffSPrmBit(cCcD_ObjCommonBase::CO_SPRM_SET); + mSph.GetObjTg().OffSPrmBit(cCcD_ObjCommonBase::CO_SPRM_SET); + mSph.GetObjCo().OffSPrmBit(cCcD_ObjCommonBase::CO_SPRM_SET); off_carry(); fopAcM_cancelCarryNow(this); - field_0x524 = 4; + field_0x698 = 4; fopAcM_getWaterY(¤t.pos, &field_0x528); } - /* 800E0238-800E02D0 .text mode_sink__Q27daBomb25Act_cFv */ void Act_c::mode_sink() { - /* Nonmatching */ + f32 temp; + if(fopAcM_getWaterY(¤t.pos, &temp) && field_0x528 != -1.0e9f && --field_0x698 > 0) { + current.pos.y += temp - field_0x528; + field_0x528 = temp; + posMoveF(); + } + else { + field_0x740 = 1; + } } - /* 800E02D0-800E03C4 .text mode_proc_call__Q27daBomb25Act_cFv */ void Act_c::mode_proc_call() { - /* Nonmatching */ + typedef void(Act_c::*procFunc)(); + static procFunc mode_proc[] = { + &mode_wait, + &mode_carry, + &mode_explode, + &mode_sink, + }; + + if(fopAcM_checkCarryNow(this) && field_0x694 != 1) { + mode_carry_init(); + } + + (this->*mode_proc[field_0x694])(); + set_real_shadow_flag(); } - /* 800E03C4-800E03FC .text tensor_init__Q27daBomb25Act_cFv */ void Act_c::tensor_init() { mDoMtx_identity(field_0x754); vib_init(); } - /* 800E03FC-800E0430 .text vib_init__Q27daBomb25Act_cFv */ void Act_c::vib_init() { - /* Nonmatching */ + field_0x784 = 0.0f; + field_0x788 = 0.0f; + field_0x78C = 0.0f; + field_0x790 = 0.0f; + field_0x794 = 0.0f; + field_0x798 = 0.0f; + field_0x79C = 0.0f; + field_0x7A0 = 0.0f; + field_0x7A4 = 0.0f; + field_0x7A8 = 0.0f; } /* 800E0430-800E04FC .text vib_proc__Q27daBomb25Act_cFv */ void Act_c::vib_proc() { - /* Nonmatching */ + } - /* 800E04FC-800E0554 .text set_vib_tensor__Q27daBomb25Act_cFv */ void Act_c::set_vib_tensor() { - /* Nonmatching */ + cXyz temp(field_0x790, 1.0f, field_0x78C); + Quaternion quat; + daObj::quat_rotBaseY2(&quat, temp); + mDoMtx_quat(&field_0x754[0], &quat); } /* 800E0554-800E0588 .text tensor_wait__Q27daBomb25Act_cFv */ @@ -759,32 +905,49 @@ namespace daBomb2 { } } - /* 800E0588-800E05D8 .text tensor_wait_drop__Q27daBomb25Act_cFv */ void Act_c::tensor_wait_drop() { - /* Nonmatching */ + if(field_0x7A8 > 0) { + field_0x79C = speed.z * L_attr.field_0x60; + field_0x7A0 = speed.x * L_attr.field_0x60; + } + + field_0x784 = 0.0f; + field_0x788 = 0.0f; + field_0x7A4 = L_attr.field_0x54; } - /* 800E05D8-800E0664 .text tensor_wait_ground__Q27daBomb25Act_cFv */ void Act_c::tensor_wait_ground() { - /* Nonmatching */ + cM3dGPla* pNormal = dComIfG_Bgsp()->GetTriPla(mAcch.m_gnd.GetBgIndex(), mAcch.m_gnd.GetPolyIndex()); + if(pNormal) { + field_0x784 = pNormal->mNormal.z * L_attr.field_0x64; + field_0x788 = pNormal->mNormal.x * L_attr.field_0x64; + } + else { + field_0x784 = 0.0f; + field_0x788 = 0.0f; + } + + field_0x7A4 = L_attr.field_0x58; } - /* 800E0664-800E0684 .text tensor_carry__Q27daBomb25Act_cFv */ void Act_c::tensor_carry() { - /* Nonmatching */ + field_0x784 = 0.0f; + field_0x788 = 0.0f; + field_0x7A4 = L_attr.field_0x58; } - /* 800E0684-800E06A4 .text tensor_explode__Q27daBomb25Act_cFv */ void Act_c::tensor_explode() { - /* Nonmatching */ + field_0x784 = 0.0f; + field_0x788 = 0.0f; + field_0x7A4 = L_attr.field_0x58; } - /* 800E06A4-800E06C4 .text tensor_sink__Q27daBomb25Act_cFv */ void Act_c::tensor_sink() { - /* Nonmatching */ + field_0x784 = 0.0f; + field_0x788 = 0.0f; + field_0x7A4 = L_attr.field_0x58; } - /* 800E06C4-800E07B8 .text tensor_proc_call__Q27daBomb25Act_cFv */ void Act_c::tensor_proc_call() { typedef void(Act_c::*procFunc)(); static procFunc tensor_proc[] = { @@ -846,7 +1009,7 @@ namespace daBomb2 { } void Act_c::draw_shadow() { - static f32 mult[] = { + static const f32 mult[] = { 2.08f, 1.8f, 1.5f, @@ -900,6 +1063,7 @@ namespace daBomb2 { return true; } + //global visibility according to objdiff actor_method_class Mthd_Table = { (process_method_func)Mthd_Create, (process_method_func)Mthd_Delete, diff --git a/src/d/d_particle.cpp b/src/d/d_particle.cpp index 4653a81ed..a1fb9d378 100644 --- a/src/d/d_particle.cpp +++ b/src/d/d_particle.cpp @@ -257,7 +257,7 @@ JPABaseEmitter* dPa_control_c::set(unsigned char, unsigned short, const cXyz*, c } /* 8007D378-8007D414 .text setBombSmoke__13dPa_control_cFUsPC4cXyzPC5csXyzPC4cXyzUc */ -void dPa_control_c::setBombSmoke(unsigned short, const cXyz*, const csXyz*, const cXyz*, unsigned char) { +JPABaseEmitter* dPa_control_c::setBombSmoke(unsigned short, const cXyz*, const csXyz*, const cXyz*, unsigned char) { /* Nonmatching */ }