From 07a5a8cd1895e3b119768550f90b21c6df3da5d0 Mon Sep 17 00:00:00 2001 From: SuperDude88 <82904174+SuperDude88@users.noreply.github.com> Date: Fri, 6 Oct 2023 17:27:47 -0400 Subject: [PATCH 1/2] Bomb Work --- configure.py | 2 +- include/JSystem/JParticle/JPAEmitter.h | 2 +- include/SSystem/SComponent/c_bg_s_gnd_chk.h | 2 +- include/SSystem/SComponent/c_bg_s_poly_info.h | 4 +- include/SSystem/SComponent/c_lib.h | 5 +- include/d/actor/d_a_bomb.h | 233 ++- include/d/actor/d_a_bomb2.h | 193 ++- include/d/d_bg_s.h | 2 +- include/d/d_bg_s_gnd_chk.h | 10 + include/d/d_kankyo.h | 3 + include/d/d_particle.h | 8 +- include/d/d_stage.h | 3 +- include/f_op/f_op_actor_mng.h | 4 + include/f_op/f_op_camera.h | 11 +- include/f_op/f_op_camera_mng.h | 29 +- include/f_op/f_op_kankyo_mng.h | 2 +- include/m_Do/m_Do_audio.h | 4 + include/m_Do/m_Do_lib.h | 4 +- src/d/actor/d_a_agbsw0.cpp | 9 +- src/d/actor/d_a_bomb.cpp | 1276 +++++++++++++-- src/d/actor/d_a_bomb2.cpp | 1406 +++++++++++------ src/d/actor/d_a_bomb3.inc | 43 + src/d/d_a_bomb_static.cpp | 158 +- 23 files changed, 2516 insertions(+), 897 deletions(-) create mode 100644 src/d/actor/d_a_bomb3.inc diff --git a/configure.py b/configure.py index b2d6ef876..f9a77447a 100644 --- a/configure.py +++ b/configure.py @@ -348,7 +348,7 @@ config.libs = [ Object(NonMatching, "d/d_a_obj_tribox_static.cpp"), Object(NonMatching, "d/d_a_ship_static.cpp"), Object(NonMatching, "d/d_a_boko_static.cpp"), - Object(NonMatching, "d/d_a_bomb_static.cpp"), + Object(Matching, "d/d_a_bomb_static.cpp"), Object(NonMatching, "d/d_a_branch_static.cpp"), Object(NonMatching, "d/d_a_mgameboard_static.cpp"), Object(NonMatching, "d/d_a_itembase_static.cpp"), diff --git a/include/JSystem/JParticle/JPAEmitter.h b/include/JSystem/JParticle/JPAEmitter.h index 366b9aba1..7e42fbc35 100644 --- a/include/JSystem/JParticle/JPAEmitter.h +++ b/include/JSystem/JParticle/JPAEmitter.h @@ -63,7 +63,7 @@ public: void calc(); void calcCreatePtcls(); void createChildren(JPABaseParticle*); - void createParticle(); + JPABaseParticle* createParticle(); void calcParticle(); void calcChild(); void calcKey(); diff --git a/include/SSystem/SComponent/c_bg_s_gnd_chk.h b/include/SSystem/SComponent/c_bg_s_gnd_chk.h index 8d482dd6d..634c0dff6 100644 --- a/include/SSystem/SComponent/c_bg_s_gnd_chk.h +++ b/include/SSystem/SComponent/c_bg_s_gnd_chk.h @@ -18,7 +18,7 @@ public: f32 GetNowY() const { return mNowY; } void SetNowY(f32 y) { mNowY = y; } - const cXyz& GetPointP() { return m_pos; } + cXyz& GetPointP() { return m_pos; } u32 GetWallPrecheck() const { return mWallPrecheck; } void OffWall() { mFlags &= ~2; } diff --git a/include/SSystem/SComponent/c_bg_s_poly_info.h b/include/SSystem/SComponent/c_bg_s_poly_info.h index d5a10a646..4ac08bc4d 100644 --- a/include/SSystem/SComponent/c_bg_s_poly_info.h +++ b/include/SSystem/SComponent/c_bg_s_poly_info.h @@ -30,8 +30,8 @@ public: virtual ~cBgS_PolyInfo() {} - u16 GetPolyIndex() const { return mPolyIndex; } - u16 GetBgIndex() const { return mBgIndex; } + s32 GetPolyIndex() const { return mPolyIndex; } + s32 GetBgIndex() const { return mBgIndex; } bool ChkSetInfo() const { if (mPolyIndex == 0xFFFF || mBgIndex == 0x100) { return false; diff --git a/include/SSystem/SComponent/c_lib.h b/include/SSystem/SComponent/c_lib.h index cb88e36af..819189e72 100644 --- a/include/SSystem/SComponent/c_lib.h +++ b/include/SSystem/SComponent/c_lib.h @@ -21,6 +21,7 @@ void cLib_addCalcPos2(cXyz* o_value, cXyz const& target, f32 scale, f32 maxStep) void cLib_addCalcPosXZ2(cXyz* o_value, cXyz const& target, f32 scale, f32 maxStep); s16 cLib_addCalcAngleS(s16* o_value, s16 target, s16 scale, s16 maxStep, s16 minStep); void cLib_addCalcAngleS2(s16* o_value, s16 target, s16 scale, s16 maxStep); +s32 cLib_addCalcAngleL(s32* pValue, s32 target, s32 scale, s32 maxStep, s32 minStep); int cLib_chaseUC(u8* o_value, u8 target, u8 step); int cLib_chaseS(s16* o_value, s16 target, s16 step); @@ -46,8 +47,8 @@ inline void cLib_onBit(T& value, u8 bit) { } template -inline T cLib_checkBit(T& value, u8 bit) { - return value & bit; +inline T cLib_checkBit(T value, T bit) { + return static_cast(value & bit); } template diff --git a/include/d/actor/d_a_bomb.h b/include/d/actor/d_a_bomb.h index 9f4855baa..bcfac6154 100644 --- a/include/d/actor/d_a_bomb.h +++ b/include/d/actor/d_a_bomb.h @@ -1,75 +1,85 @@ #ifndef D_A_BOMB_H #define D_A_BOMB_H +#include "f_op/f_op_actor_mng.h" +#include "d/d_a_obj.h" #include "d/d_particle.h" #include "d/d_bg_s_acch.h" -#include "f_op/f_op_actor.h" +#include "d/d_cc_d.h" +#include "m_Do/m_Do_ext.h" +#include "m_Do/m_Do_ext.h" + + class daBomb_fuseSmokeEcallBack : public dPa_levelEcallBack { public: - void executeAfter(JPABaseEmitter*); + daBomb_fuseSmokeEcallBack() {} + ~daBomb_fuseSmokeEcallBack(); + + void init(JPABaseEmitter*); void execute(JPABaseEmitter*); + void executeAfter(JPABaseEmitter*); void draw(JPABaseEmitter*); - void setup(JPABaseEmitter*, const cXyz*, const csXyz*, signed char); + + void setup(JPABaseEmitter*, cXyz const*, csXyz const*, s8); + + s16 field_0x04; + const cXyz* mpPos; + cXyz* field_0x0C; + cXyz* field_0x10; + JPABaseEmitter* mpEmitter; }; class daBomb_fuseSparksEcallBack : public dPa_levelEcallBack { public: + daBomb_fuseSparksEcallBack() {} + ~daBomb_fuseSparksEcallBack(); + + void init(JPABaseEmitter*); void execute(JPABaseEmitter*); + void executeAfter(JPABaseEmitter*); void draw(JPABaseEmitter*); - void setup(JPABaseEmitter*, const cXyz*, const csXyz*, signed char); + + void setup(JPABaseEmitter*, cXyz const*, csXyz const*, s8); + + const cXyz* mpPos; + JPABaseEmitter* mpEmitter; }; +class dBgS_BombAcch : public dBgS_Acch { +public: + dBgS_BombAcch() { mbBombThrough = true; } +}; + + class daBomb_c : public fopAc_ac_c { public: - enum State_e { - - }; - - s16 getBombRestTime(); - s16 getBombCheck_Flag(); - void setBombCheck_Flag(); - void setBombFire_ON(); - void setBombNoHit(); - void setBombOffCoSet(); - void setBombOnCoSet(); - void setBombNoEff(); - void setBombRestTime(short); - void setNoGravityTime(short); - void prm_make(State_e, bool, bool); - void chk_state(State_e) const; - void change_state(State_e); - void prm_get_state() const; - void get_explode_instant() const; - void prm_get_cheapEff() const; - void prm_get_angXZero() const; - void prm_get_version() const; - void _prm_chk_version() const; - + daBomb_c(); + void draw_norm(); void draw_nut(); - void draw(); - void checkExplodeCc_norm(); - void checkExplodeCc_nut(); - void checkExplodeCc_cannon(); - void checkExplodeCc(); - void checkExplodeTimer(); - void checkExplode(); - void checkExplodeBg_norm(); - void checkExplodeBg_nut(); - void checkExplodeBg_cannon(); - void checkExplodeBg(); + BOOL draw(); + bool checkExplodeCc_norm(); + bool checkExplodeCc_nut(); + bool checkExplodeCc_cannon(); + bool checkExplodeCc(); + bool checkExplodeTimer(); + bool checkExplode(); + bool checkExplodeBg_norm(); + bool checkExplodeBg_nut(); + bool checkExplodeBg_cannon(); + bool checkExplodeBg(); void water_tention(); void posMoveF(); void bgCrrPos(); void bgCrrPos_lava(); void bgCrrPos_water(); - void chk_water_land(); - void chk_water_in(); - void chk_water_sink(); - void chk_lava_hit(); - void chk_dead_zone(); - void bound(float); + bool chk_water_land(); + bool chk_water_in(); + bool chk_water_sink(); + bool chk_lava_hit(); + bool chk_dead_zone(); + void bound(f32); void set_real_shadow_flag(); void setRoomInfo(); void makeFireEffect(cXyz&, csXyz&); @@ -78,16 +88,16 @@ public: void eff_explode_normal(const csXyz*); void eff_explode_cheap(const csXyz*); void eff_explode(); - void procExplode_init(); - void procExplode(); - void procCarry_init(); - void procCarry(); - void procWait_init(); - void procWait(); - void waitState_cannon(); + int procExplode_init(); + bool procExplode(); + bool procCarry_init(); + bool procCarry(); + bool procWait_init(); + bool procWait(); + bool waitState_cannon(); void waitState_bomtyu(); - void procSink(); - void execute(); + bool procSink(); + BOOL execute(); void set_wind_vec(); void anm_play_nut(); void set_mtx(); @@ -95,16 +105,117 @@ public: void se_cannon_fly_set(); void se_cannon_fly_stop(); void eff_water_splash(); - void bombDelete(); - void createHeap(); - void create(); - daBomb_c(); + bool bombDelete(); + bool createHeap(); + int create(); void create_init(); -}; -class dBgS_BombAcch : public dBgS_Acch { -public: + enum State_e { + STATE_0 = 0, + STATE_1 = 1, + STATE_2 = 2, + STATE_3 = 3, + STATE_4 = 4, + STATE_5 = 5, + STATE_6 = 6, + STATE_7 = 7, + STATE_8 = 8 + }; + + enum Prm_e { + PRM_STATE_W = 8, + PRM_STATE_S = 0x00, + + PRM_CHEAP_EFF_W = 1, + PRM_CHEAP_EFF_S = 0x10, + + PRM_ANGXZERO_W = 1, + PRM_ANGXZERO_S = 0x11, + PRM_VERSION_W = 1, + PRM_VERSION_S = 0x1F, + }; + + s16 getBombRestTime(); + s16 getBombCheck_Flag(); + void setBombCheck_Flag(); + void setBombFire_ON(); + void setBombNoHit(); + void setBombOffCoSet(); + void setBombOnCoSet(); + void setBombNoEff(); + void setBombRestTime(s16 time); + void setNoGravityTime(s16 time); + static int prm_make(daBomb_c::State_e, bool, bool); + bool chk_state(daBomb_c::State_e) const; + void change_state(daBomb_c::State_e); + int prm_get_state() const; + bool get_explode_instant() const; + bool prm_get_cheapEff() const; + bool prm_get_angXZero() const; + int prm_get_version() const; + void _prm_chk_version() const; + +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; + + struct AttrType { + const char* resName; + u32 heapSize; + }; + static const AttrType m_attrType[]; }; #endif /* D_A_BOMB_H */ diff --git a/include/d/actor/d_a_bomb2.h b/include/d/actor/d_a_bomb2.h index 98ce7734a..a30022593 100644 --- a/include/d/actor/d_a_bomb2.h +++ b/include/d/actor/d_a_bomb2.h @@ -1,57 +1,86 @@ -#ifndef D_A_BOMB2_H -#define D_A_BOMB2_H +#ifndef D_A_BOMB_2_H +#define D_A_BOMB_2_H -#include "JSystem/JParticle/JPAEmitter.h" -#include "f_op/f_op_actor.h" +#include "f_op/f_op_actor_mng.h" +#include "d/d_a_obj.h" +#include "d/d_particle.h" +#include "d/d_bg_s_acch.h" +#include "d/d_cc_d.h" +#include "d/actor/d_a_bomb.h" +#include "m_Do/m_Do_ext.h" +#include "m_Do/m_Do_ext.h" namespace daBomb2 { + class FuseSmokeCB_c : public dPa_levelEcallBack { + public: + FuseSmokeCB_c() {} + virtual ~FuseSmokeCB_c(); + + + void setOldPosP(const cXyz*, const cXyz*); + void deleteCallBack(); + + //void init(JPABaseEmitter*); + void execute(JPABaseEmitter*); + void executeAfter(JPABaseEmitter*); + void draw(JPABaseEmitter*); + + void setup(JPABaseEmitter*, cXyz const*, csXyz const*, s8); + + s16 field_0x04; + const cXyz* mpPos; + const cXyz* field_0x0C; + const cXyz* field_0x10; + JPABaseEmitter* mpEmitter; + }; + + class FuseSparksCB_c : public dPa_levelEcallBack { + public: + FuseSparksCB_c() {} + virtual ~FuseSparksCB_c(); + + void deleteCallBack(); + + //void init(JPABaseEmitter*); + void execute(JPABaseEmitter*); + //void executeAfter(JPABaseEmitter*); + void draw(JPABaseEmitter*); + + void setup(JPABaseEmitter*, cXyz const*, csXyz const*, s8); + + const cXyz* mpPos; + JPABaseEmitter* mpEmitter; + }; + class Env_c { public: void set(const cXyz&); void clean(); - void is_end() const; + bool is_end() const; void proc(const cXyz&); + + LIGHT_INFLUENCE mPntLight; + WIND_INFLUENCE mPntWind; + u8 field_0x4C; + f32 field_0x50; }; - - class FuseSmokeCB_c { + + class Act_c : public fopAc_ac_c { public: - ~FuseSmokeCB_c(); - - void setOldPosP(const cXyz*, const cXyz*); - void deleteCallBack(); - void execute(JPABaseEmitter*); - void executeAfter(JPABaseEmitter*); - void draw(JPABaseEmitter*); - void setup(JPABaseEmitter*, const cXyz*, const csXyz*, signed char); - }; - - class FuseSparksCB_c { - public: - ~FuseSparksCB_c(); - - void deleteCallBack(); - void execute(JPABaseEmitter*); - void draw(JPABaseEmitter*); - void setup(JPABaseEmitter*, const cXyz*, const csXyz*, signed char); - }; - - class Act_c : public fopAc_ac_c { - public: - enum Prm_e { - - }; + Act_c(); + //d_a_bomb_static functions void remove_fuse_effect(); void set_time(int); - s32 get_time() const; + int get_time() const; bool chk_eat() const; void set_eat(); void set_no_hit(); - void chk_explode(); - - void solidHeapCB(fopAc_ac_c*); - void create_heap_nut(); - void create_heap(); + bool chk_explode(); + + static int solidHeapCB(fopAc_ac_c*); + int create_heap_nut(); + int create_heap(); void crr_init(); void cc_init(); void start_explode_instant(); @@ -59,9 +88,8 @@ namespace daBomb2 { void start_carry(); void start_proc_call(); void create_init(); - void _create(); - Act_c(); - void _delete(); + int _create(); + bool _delete(); void set_mtx(); void init_mtx(); void cc_set(); @@ -70,8 +98,8 @@ namespace daBomb2 { void bgCrrPos(); void bgCrrPos_lava(); void bgCrrPos_water(); - void chk_water_in() const; - void chk_lava_in() const; + bool chk_water_in() const; + bool chk_lava_in() const; void setRoomInfo(); void bound(float); void set_nut_exp_interval(); @@ -90,16 +118,16 @@ namespace daBomb2 { void se_explode_water(); void se_ignition(); void set_sound_env(int, int); - void chk_exp_cc_nut(); - void chk_exp_cc(); - void chk_exp_bg_nut(); - void chk_exp_bg(); - void chk_exp_timer(); - void chk_sink_bg_nut(); - void chk_sink_bg(); - void chk_exp_pre(); - void chk_exp_post(); - void chk_sink_post(); + bool chk_exp_cc_nut(); + bool chk_exp_cc(); + bool chk_exp_bg_nut(); + bool chk_exp_bg(); + bool chk_exp_timer(); + bool chk_sink_bg_nut(); + bool chk_sink_bg(); + bool chk_exp_pre(); + bool chk_exp_post(); + bool chk_sink_post(); void set_real_shadow_flag(); void carry_fuse_start(); void on_carry(); @@ -124,12 +152,59 @@ namespace daBomb2 { void tensor_explode(); void tensor_sink(); void tensor_proc_call(); - void _execute(); - void is_draw(); + bool _execute(); + bool is_draw(); void draw_nut(); void draw_shadow(); - void _draw(); - }; -}; + bool _draw(); -#endif /* D_A_BOMB2_H */ + enum Prm_e { + PRM_1_W = 1, + PRM_1_S = 0x08, + + PRM_2_W = 2, + PRM_2_S = 0x00, + }; + + 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; + + 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; + + static dCcD_SrcSph M_sph_src; + }; +} + +#endif /* D_A_BOMB_2_H */ diff --git a/include/d/d_bg_s.h b/include/d/d_bg_s.h index 90f832aa1..2646e3f73 100644 --- a/include/d/d_bg_s.h +++ b/include/d/d_bg_s.h @@ -94,7 +94,7 @@ public: bool ChkMoveBG_NoDABg(cBgS_PolyInfo&); int GetPolyId0(int, int, int, u32, u32); int GetPolyCamId(int, int); - int GetMtrlSndId(cBgS_PolyInfo&); + u32 GetMtrlSndId(cBgS_PolyInfo&); int GetExitId(cBgS_PolyInfo&); int GetPolyColor(cBgS_PolyInfo&); int GetGrpRoomInfId(cBgS_PolyInfo&); diff --git a/include/d/d_bg_s_gnd_chk.h b/include/d/d_bg_s_gnd_chk.h index 59fc5205f..c2e436d0f 100644 --- a/include/d/d_bg_s_gnd_chk.h +++ b/include/d/d_bg_s_gnd_chk.h @@ -28,6 +28,16 @@ public: virtual ~dBgS_ObjGndChk() {} }; +class dBgS_ObjGndChk_Yogan : public dBgS_ObjGndChk { +public: + /* 806bf6a4 */ dBgS_ObjGndChk_Yogan() { + OffNormalGrp(); + OnYoganGrp(); + } + + /* 806bf53c */ virtual ~dBgS_ObjGndChk_Yogan(); +}; + class dBgS_ObjGndChk_Wtr : public dBgS_ObjGndChk { public: dBgS_ObjGndChk_Wtr(); diff --git a/include/d/d_kankyo.h b/include/d/d_kankyo.h index 947331784..fbde134c2 100644 --- a/include/d/d_kankyo.h +++ b/include/d/d_kankyo.h @@ -393,6 +393,9 @@ void dKy_set_nexttime(f32); void dKy_Sound_set(cXyz i_pos, int param_1, unsigned int i_actorID, int param_3); void dKy_itudemo_se(); void dKy_actor_addcol_set(s16, s16, s16, f32); +void dKy_actor_addcol_amb_set(s16, s16, s16, f32); +void dKy_bg_addcol_amb_set(s16, s16, s16, f32); +void dKy_bg_addcol_dif_set(s16, s16, s16, f32); void dKy_plight_set(LIGHT_INFLUENCE*); void dKy_efplight_set(LIGHT_INFLUENCE* param_0); void dKy_plight_cut(LIGHT_INFLUENCE* param_0); diff --git a/include/d/d_particle.h b/include/d/d_particle.h index 8fb51a661..c4a9aa20e 100644 --- a/include/d/d_particle.h +++ b/include/d/d_particle.h @@ -354,7 +354,7 @@ public: void draw(JPADrawInfo*, u8); JPABaseEmitter* set(u8, u16, cXyz const*, csXyz const*, cXyz const*, u8, dPa_levelEcallBack*, s8, GXColor const*, GXColor const*, cXyz const*); - void setBombSmoke(u16, cXyz const*, csXyz const*, cXyz const*, u8); + JPABaseEmitter* setBombSmoke(u16, cXyz const*, csXyz const*, cXyz const*, u8); void setSimpleLand(int, cXyz const*, csXyz const*, f32, f32, f32, dKy_tevstr_c*, int*, int); void setSimpleLand(cBgS_PolyInfo&, cXyz const*, csXyz const*, f32, f32, f32, dKy_tevstr_c*, int*, int); @@ -382,6 +382,12 @@ public: const cXyz* pScale2D) { return set(2, particleID, pos, angle, scale, alpha, pCallBack, setupInfo, pPrmColor, pEnvColor, pScale2D); } + JPABaseEmitter* 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) { + return set(3, particleID, pos, angle, scale, alpha, pCallBack, setupInfo, pPrmColor, pEnvColor, pScale2D); + } JPABaseEmitter* setProjection(u16 particleID, const cXyz* pos, const csXyz* angle, const cXyz* scale, u8 alpha, dPa_levelEcallBack* pCallBack, s8 setupInfo, const GXColor* pPrmColor, const GXColor* pEnvColor, diff --git a/include/d/d_stage.h b/include/d/d_stage.h index 2e0fb21db..eb6a51178 100644 --- a/include/d/d_stage.h +++ b/include/d/d_stage.h @@ -286,6 +286,7 @@ struct FuncTable; class dStage_dt_c { public: dStage_dt_c() {} + ~dStage_dt_c() {} /* vt[ 2] */ virtual void init() = 0; /* vt[ 3] */ virtual int getRoomNo() const = 0; @@ -831,7 +832,7 @@ public: static void setBgW(int param_0, dBgW_base* i_bgw) { mStatus[param_0].mpBgW = i_bgw; } - BOOL checkStatusFlag(int i_roomNo, u8 flag) const { + bool checkStatusFlag(int i_roomNo, u8 flag) const { return cLib_checkBit(mStatus[i_roomNo].mFlags, flag); } diff --git a/include/f_op/f_op_actor_mng.h b/include/f_op/f_op_actor_mng.h index 60f3f3c93..b8f7a4101 100644 --- a/include/f_op/f_op_actor_mng.h +++ b/include/f_op/f_op_actor_mng.h @@ -223,6 +223,10 @@ inline void fopAcM_SetModel(fopAc_ac_c* actor, J3DModel* model) { actor->model = model; } +inline J3DModel* fopAcM_GetModel(fopAc_ac_c* actor) { + return actor->model; +} + inline fopAcM_prm_class* fopAcM_GetAppend(void* actor) { return (fopAcM_prm_class*)fpcM_GetAppend(actor); } diff --git a/include/f_op/f_op_camera.h b/include/f_op/f_op_camera.h index c9504450f..73990e335 100644 --- a/include/f_op/f_op_camera.h +++ b/include/f_op/f_op_camera.h @@ -5,6 +5,13 @@ #include "SSystem/SComponent/c_sxyz.h" #include "SSystem/SComponent/c_phase.h" +class dCamera_c { + u8 m_[0x800]; + +public: + void ForceLockOff(unsigned int pcId); +}; + class camera_process_class : public view_class { public: /* 0x210 */ create_tag_class mDwTg; @@ -21,8 +28,8 @@ public: class camera_class : public camera_process_class { public: /* 0x23C */ int field_0x23c; - /* 0x240 */ request_of_phase_process_class mPhaseReq; - // /* 0x248 */ dCamera_c mCamera; + /* 0x240 */ int field_0x244; + /* 0x244 */ dCamera_c mCamera; }; struct camera_process_profile_definition { diff --git a/include/f_op/f_op_camera_mng.h b/include/f_op/f_op_camera_mng.h index e07c52131..b043aa7a6 100644 --- a/include/f_op/f_op_camera_mng.h +++ b/include/f_op/f_op_camera_mng.h @@ -3,34 +3,7 @@ #include "SSystem/SComponent/c_phase.h" #include "SSystem/SComponent/c_sxyz.h" -#include "dolphin/types.h" -#include "f_op/f_op_view.h" - -struct dCamera_c { - u8 m_[0x800]; -}; - -typedef struct leafdraw_method_class leafdraw_method_class; - -class camera_process_class : public view_class { -public: - /* 0x210 */ create_tag_class mCreateTag; - /* 0x224 */ leafdraw_method_class* mpMtd; - /* 0x228 */ u8 field_0x228[4]; - /* 0x22C */ s8 mPrm1; - /* 0x22D */ s8 mPrm2; - /* 0x22E */ s8 mPrm3; - /* 0x22F */ s8 field_0x22f; - /* 0x230 */ csXyz mAngle; - /* 0x238 */ int field_0x238; -}; - -class camera_class : public camera_process_class { -public: - /* 0x23C */ int field_0x23c; - /* 0x240 */ request_of_phase_process_class mPhaseReq; - /* 0x248 */ dCamera_c mCamera; -}; +#include "f_op/f_op_camera.h" /* void fopCamM_SetNear(camera_class* cam, f32 near) { cam->mNear = near; diff --git a/include/f_op/f_op_kankyo_mng.h b/include/f_op/f_op_kankyo_mng.h index b9bdb8917..a721af482 100644 --- a/include/f_op/f_op_kankyo_mng.h +++ b/include/f_op/f_op_kankyo_mng.h @@ -16,7 +16,7 @@ void fopKyM_Delete(void* param_1); int fopKyM_Create(s16 param_1, fopKyM_CreateFunc param_2, void* param_3); base_process_class* fopKyM_fastCreate(s16 param_0, int param_1, cXyz* param_2, cXyz* param_3, fopKyM_CreateFunc); -int fopKyM_createWpillar(cXyz const* i_pos, f32 scale, int i_param); +int fopKyM_createWpillar(cXyz const* i_pos, f32 scaleXZ, f32 scaleY, int i_param); inline void* fopKyM_GetAppend(void* param_0) { return fpcM_GetAppend(param_0); diff --git a/include/m_Do/m_Do_audio.h b/include/m_Do/m_Do_audio.h index fd4f4770e..e04edb3c2 100644 --- a/include/m_Do/m_Do_audio.h +++ b/include/m_Do/m_Do_audio.h @@ -70,6 +70,10 @@ inline void mDoAud_seStart(u32 i_sfxID, Vec* i_sePos, u32 param_2, s8 i_reverb) mDoAud_zelAudio_c::getInterface()->seStart(i_sfxID, i_sePos, param_2, i_reverb, 1.0f, 1.0f, -1.0f, -1.0f, 0); } +inline void mDoAud_seStopActor(Vec* param_1, u32 param_2) { + mDoAud_zelAudio_c::getInterface()->seStopActor(param_1, param_2); +} + inline void mDoAud_seDeleteObject(Vec* i_sePos) { mDoAud_zelAudio_c::getInterface()->seDeleteObject(i_sePos); } diff --git a/include/m_Do/m_Do_lib.h b/include/m_Do/m_Do_lib.h index 98495a187..4c5897870 100644 --- a/include/m_Do/m_Do_lib.h +++ b/include/m_Do/m_Do_lib.h @@ -16,11 +16,11 @@ struct mDoLib_clipper { mClipper.calcViewFrustum(); } - static u32 clip(const Mtx m, const Vec* param_1, const Vec* param_2) { + static s32 clip(const Mtx m, const Vec* param_1, const Vec* param_2) { return mClipper.clip(m, (Vec*)param_1, (Vec*)param_2); } - static u32 clip(const Mtx m, Vec param_1, f32 param_2) { + static s32 clip(const Mtx m, Vec param_1, f32 param_2) { return mClipper.clip(m, param_1, param_2); } diff --git a/src/d/actor/d_a_agbsw0.cpp b/src/d/actor/d_a_agbsw0.cpp index 02e1fcafa..6821e74cd 100644 --- a/src/d/actor/d_a_agbsw0.cpp +++ b/src/d/actor/d_a_agbsw0.cpp @@ -13,6 +13,7 @@ #include "d/d_kankyo_wether.h" #include "d/actor/d_a_agb.h" #include "d/actor/d_a_player_link.h" +#include "d/actor/d_a_bomb.h" #include "m_Do/m_Do_gba_com.h" // need to figure out what's putting this data in front of a bunch of rels with the compiler-generated symbol names @@ -1069,12 +1070,6 @@ BOOL daAgbsw0_c::ExeSubMW() { return true; } -class daBomb_c { -public: - enum State_e { EIGHT = 8, }; - bool chk_state(State_e) const; -}; - BOOL daAgbsw0_c::ExeSubT() { u8 sw = getSw0(); @@ -1100,7 +1095,7 @@ BOOL daAgbsw0_c::ExeSubT() { else { if(g_mDoGaC_gbaCom.mDoGaC_GbaLink()) { if(g_mDoGaC_gbaCom.mDoGaC_SendStatusCheck(0xF)) { - if(mCyl.ChkTgHit() && mCyl.GetTgHitAc() && fopAcM_GetName(mCyl.GetTgHitAc()) == PROC_BOMB && ((daBomb_c*)mCyl.GetTgHitAc())->chk_state(daBomb_c::EIGHT)) { + if(mCyl.ChkTgHit() && mCyl.GetTgHitAc() && fopAcM_GetName(mCyl.GetTgHitAc()) == PROC_BOMB && ((daBomb_c*)mCyl.GetTgHitAc())->chk_state(daBomb_c::STATE_8)) { mSE = BigLittleChange(0x12); g_mDoGaC_gbaCom.mDoGaC_SendDataSet((u32*)&mSE, 4, 0xF, 0); fopAcM_onSwitch(this, sw); diff --git a/src/d/actor/d_a_bomb.cpp b/src/d/actor/d_a_bomb.cpp index 048999042..4f94bc832 100644 --- a/src/d/actor/d_a_bomb.cpp +++ b/src/d/actor/d_a_bomb.cpp @@ -4,118 +4,515 @@ // #include "d/actor/d_a_bomb.h" -#include "dolphin/types.h" -#include "m_Do/m_Do_ext.h" +#include "JSystem/JKernel/JKRHeap.h" +#include "SSystem/SComponent/c_counter.h" +#include "d/d_com_inf_game.h" +#include "d/d_procname.h" +#include "d/actor/d_a_player_link.h" +#include "d/d_kankyo_wether.h" +#include "f_op/f_op_camera_mng.h" +#include "f_op/f_op_kankyo_mng.h" +#include "m_Do/m_Do_mtx.h" +#include "m_Do/m_Do_lib.h" namespace { enum AttrSt_e { - + ATTR_STATE_0 = 0x00, + ATTR_STATE_1 = 0x01, + ATTR_STATE_2 = 0x02, + ATTR_STATE_4 = 0x04, + ATTR_STATE_8 = 0x08, + ATTR_STATE_10 = 0x10, + ATTR_STATE_20 = 0x20, + ATTR_STATE_80 = 0x80, + ATTR_STATE_100 = 0x100, + ATTR_STATE_200 = 0x200, + + ATTR_STATE_1C = ATTR_STATE_10 | ATTR_STATE_8 | ATTR_STATE_4, + ATTR_STATE_21 = ATTR_STATE_20 | ATTR_STATE_1, + ATTR_STATE_9C = ATTR_STATE_80 | ATTR_STATE_10 | ATTR_STATE_8 | ATTR_STATE_4, + ATTR_STATE_A1 = ATTR_STATE_80 | ATTR_STATE_20 | ATTR_STATE_1, + ATTR_STATE_20C = ATTR_STATE_200 | ATTR_STATE_8 | ATTR_STATE_4, + ATTR_STATE_300 = ATTR_STATE_200 | ATTR_STATE_100 + }; + + //game has this with global visibility somehow + const AttrSt_e L_attrState[] = { + ATTR_STATE_A1, + ATTR_STATE_1C, + ATTR_STATE_9C, + ATTR_STATE_9C, + ATTR_STATE_20C, + ATTR_STATE_300, + ATTR_STATE_200, + ATTR_STATE_2, + ATTR_STATE_21, + ATTR_STATE_0 }; - /* 800D9318-800D9364 .text chk_attrState__22@unnamed@d_a_bomb_cpp@FPC8daBomb_cQ222@unnamed@d_a_bomb_cpp@8AttrSt_e */ - void chk_attrState(const daBomb_c*, AttrSt_e) { - /* Nonmatching */ + bool chk_attrState(const daBomb_c* i_this, AttrSt_e mask) { + return cLib_checkBit(L_attrState[i_this->prm_get_state()], mask); // register order is wrong in the and } } -/* 800D9364-800D977C .text executeAfter__25daBomb_fuseSmokeEcallBackFP14JPABaseEmitter */ -void daBomb_fuseSmokeEcallBack::executeAfter(JPABaseEmitter*) { - /* Nonmatching */ +const daBomb_c::AttrType daBomb_c::m_attrType[] = { + {"Link", 0x8E0}, + {"VbakH", 0x800}, + {"Link", 0x8E0}, +}; + +void daBomb_fuseSmokeEcallBack::executeAfter(JPABaseEmitter* emitter) { + cXyz pos = *mpPos; + emitter->mGlobalTranslation.set(pos.x, pos.y, pos.z); + f32 temp = mpPos->abs(*field_0x0C); + s16 temp2 = (20.0f - temp) * 0.5f + 10.0f; + if(temp2 < 10) { + temp2 = 10; + } + + //probably uses cubic__Q29JGeometry8TVec3FRCQ29JGeometry8TVec3RCQ29JGeometry8TVec3RCQ29JGeometry8TVec3RCQ29JGeometry8TVec3f + //but I don't know exactly what that would encompass + emitter->mLifeTime = temp2; + cXyz temp3 = *field_0x0C - *mpPos; + cXyz temp4((field_0x0C->x - field_0x10->x) * 0.5f, (field_0x0C->y - field_0x10->y) * 0.5f, (field_0x0C->z - field_0x10->z) * 0.5f); + f32 temp5 = mpPos->abs(*field_0x0C); + + //this is minimally-fixed ghidra stuff, no idea if its functionality is even similar + if(temp5 * 0.1f < 1.0f) { + f32 temp6 = 1.0f / (temp5 * 0.1f); + s32 temp7 = temp6; + s32 temp8 = temp2 + temp7; + + f32 step = temp6; + for(; temp6 < 1.0f; temp6 += step) { + cXyz temp9; + temp9.x = temp6 * temp6; + temp9.y = temp9.x * temp6; + temp9.z = 1.0f + (2.0f * temp9.y - 3.0f * temp9.x); + cXyz temp10; + temp10.x = -2.0f * temp9.y + 3.0f * temp9.x; + temp10.y = temp6 + (temp9.y - 2.0f * temp9.x); + temp10.z = temp9.y - temp9.x; + cXyz temp11; + temp11.x = temp10.z * temp3.x * 0.5f + temp10.y * temp4.x + temp9.z * field_0x0C->x + temp10.x * mpPos->x; + temp11.y = temp10.z * temp3.y * 0.5f + temp10.y * temp4.y + temp9.z * field_0x0C->y + temp10.x * mpPos->y; + temp11.z = temp10.z * temp3.z * 0.5f + temp10.y * temp4.z + temp9.z * field_0x0C->z + temp10.x * mpPos->z; + + emitter->mLifeTime = temp8; + JPABaseParticle* particle = emitter->createParticle(); + if(particle) { + particle->mGlobalPosition = temp11; + } + + temp8 += temp7; + } + } + + field_0x04 = temp2; } -/* 800D977C-800D97C4 .text execute__26daBomb_fuseSparksEcallBackFP14JPABaseEmitter */ -void daBomb_fuseSparksEcallBack::execute(JPABaseEmitter*) { - /* Nonmatching */ +void daBomb_fuseSparksEcallBack::execute(JPABaseEmitter* emitter) { + f32 x = mpPos->x; + f32 y = mpPos->y; + f32 z = mpPos->z; + emitter->mGlobalTranslation.set(x, y, z); + + JSUPtrLink* link = emitter->mActiveParticles.getFirstLink(); + while(link != 0) { + JSUPtrLink* next = link->getNext(); + + JPABaseParticle* ptcl = (JPABaseParticle*)link->getObjectPtr(); + ptcl->mGlobalPosition.set(x, y, z); + + link = next; + } } -/* 800D97C4-800D9950 .text draw_norm__8daBomb_cFv */ void daBomb_c::draw_norm() { - /* Nonmatching */ + J3DAnmTevRegKey* bombBrk = daPy_getPlayerLinkActorClass()->getBombBrk(); + s16 end = bombBrk->getFrameMax(); + f32 frame = end - mRestTime + 2; + if(frame < 0.0f) { + frame = 0.0f; + } + else if(frame >= end) { + frame = end - 0.001f; + } + bombBrk->setFrame(frame); + + end = mBck0.getBckAnm()->getFrameMax(); + frame = end - mRestTime; + if(frame < 0.0f) { + frame = 0.0f; + } + else if(frame >= end) { + frame = end - 0.001f; + } + + mBck0.entry(mpModel->getModelData(), frame); + dComIfGd_setListP1(); + mDoExt_modelUpdateDL(mpModel); + dComIfGd_setList(); } -/* 800D9950-800D9A48 .text draw_nut__8daBomb_cFv */ void daBomb_c::draw_nut() { - /* Nonmatching */ + //entry calls are loading params in the wrong order + if(chk_state(STATE_5) || chk_state(STATE_6)) { + mBck0.entry(mpModel->getModelData(), mBck0.getFrame()); + mBrk0.entry(mpModel->getModelData(), mBrk0.getFrame()); + } + else { + mBck1.entry(mpModel->getModelData(), mBck1.getFrame()); + mBrk1.entry(mpModel->getModelData(), mBrk1.getFrame()); + } + + dComIfGd_setListP1(); + mDoExt_modelUpdateDL(mpModel); + dComIfGd_setList(); } -/* 800D9A48-800D9BC0 .text draw__8daBomb_cFv */ -void daBomb_c::draw() { - /* Nonmatching */ +BOOL daBomb_c::draw() { + if(chk_attrState(this, ATTR_STATE_20)) { + return true; + } + if(chk_state(STATE_4) && field_0x77D == 1) { + return true; + } + + if(mDoLib_clipper::clip(j3dSys.getViewMtx(), current.pos, 80.0f)) { + return true; + } + if(field_0x7C8 > 0) { + return true; + } + + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &mTevStr); + g_env_light.setLightTevColorType(mpModel, &mTevStr); + + if(mType == 1) { + draw_nut(); + } + else { + draw_norm(); + } + + if(fopAcM_GetModel(this) == 0 && mAcch.GetGroundH() != -1.0e9f) { + cM3dGPla* pNormal = dComIfG_Bgsp()->GetTriPla(mAcch.m_gnd.GetBgIndex(), mAcch.m_gnd.GetPolyIndex()); + if(pNormal) { + dComIfGd_setSimpleShadow(¤t.pos, mAcch.GetGroundH(), 25.0f, &pNormal->mNormal, 0, 1.0f, dDlst_shadowControl_c::getSimpleTex()); + } + } + + return true; } -/* 800D9BC0-800D9BE0 .text daBomb_Draw__FP8daBomb_c */ -void daBomb_Draw(daBomb_c*) { - /* Nonmatching */ +BOOL daBomb_Draw(daBomb_c* i_this) { + return i_this->draw(); } -/* 800D9BE0-800D9C8C .text checkExplodeCc_norm__8daBomb_cFv */ -void daBomb_c::checkExplodeCc_norm() { - /* Nonmatching */ +bool daBomb_c::checkExplodeCc_norm() { + bool explode = false; + + if(mSph.ChkTgHit()) { + cCcD_Obj* obj = mSph.GetTgHitObj(); + if(obj) { + if(obj->ChkAtType(0x20)) { // bomb damage + explode = true; + } + else if(!obj->ChkAtType(0x200000)) { // not leaf wind "damage" + explode = true; + } + } + + mSph.ClrTgHit(); + } + + if(explode) { + explode = procExplode_init(); + } + else { + explode = false; + } + + return explode; } -/* 800D9C8C-800D9DBC .text checkExplodeCc_nut__8daBomb_cFv */ -void daBomb_c::checkExplodeCc_nut() { - /* Nonmatching */ +bool daBomb_c::checkExplodeCc_nut() { + bool explode = false; + bool hit = false; + + if(mSph.ChkTgHit()) { + cCcD_Obj* obj = mSph.GetTgHitObj(); + if(obj) { + if(obj->ChkAtType(0x20)) { // bomb damage + explode = true; + } + else if(!obj->ChkAtType(0x200000)) { // not leaf wind "damage" + hit = true; + } + } + + mSph.ClrTgHit(); + } + + if(mSph.ChkCoHit()) { + if(field_0x780) { + hit = true; + } + + mSph.ClrCoHit(); + } + + bool ret = false; + if(explode) { + ret = procExplode_init(); + } + else if(hit) { + change_state(STATE_1); + setFuseEffect(); + if(30 < mRestTime) { + mRestTime = 30; + mBck1.setFrame(105.0f); + mBrk1.setFrame(105.0f); + } + } + + return ret; } -/* 800D9DBC-800D9E80 .text checkExplodeCc_cannon__8daBomb_cFv */ -void daBomb_c::checkExplodeCc_cannon() { - /* Nonmatching */ +bool daBomb_c::checkExplodeCc_cannon() { + bool explode = false; + + if(mSph.ChkTgHit()) { + cCcD_Obj* obj = mSph.GetTgHitObj(); + if(obj) { + if(!obj->ChkAtType(0x200000)) { // not leaf wind "damage" + explode = true; + } + } + + mSph.ClrTgHit(); + } + + if(mSph.ChkCoHit()) { + explode = true; + mSph.ClrCoHit(); + } + + if(explode) { + explode = procExplode_init(); + } + else { + explode = false; + } + + return explode; } -/* 800D9E80-800D9F30 .text checkExplodeCc__8daBomb_cFv */ -void daBomb_c::checkExplodeCc() { - /* Nonmatching */ +bool daBomb_c::checkExplodeCc() { + if(0 < mRestTime) { + typedef bool(daBomb_c::*checkFunc)(); + static checkFunc proc[] = { + &checkExplodeCc_norm, + &checkExplodeCc_nut, + &checkExplodeCc_cannon + }; + + return (this->*proc[mType])(); + } + + return false; } -/* 800D9F30-800D9FAC .text checkExplodeTimer__8daBomb_cFv */ -void daBomb_c::checkExplodeTimer() { - /* Nonmatching */ +bool daBomb_c::checkExplodeTimer() { + bool explode = false; + if(!chk_attrState(this, ATTR_STATE_200)) { + if(0 < mRestTime) { + if(--mRestTime == 0) { + explode = procExplode_init(); + } + } + } + + return explode; } -/* 800D9FAC-800DA004 .text checkExplode__8daBomb_cFv */ -void daBomb_c::checkExplode() { - /* Nonmatching */ +bool daBomb_c::checkExplode() { + return checkExplodeCc() || checkExplodeTimer(); } -/* 800DA004-800DA098 .text checkExplodeBg_norm__8daBomb_cFv */ -void daBomb_c::checkExplodeBg_norm() { - /* Nonmatching */ +bool daBomb_c::checkExplodeBg_norm() { + bool sink = chk_water_sink(); + bool land = chk_water_land(); + bool burn = chk_lava_hit(); + + if(sink) { + field_0x781 = true; + } + if(land) { + eff_water_splash(); + } + if(burn) { + return procExplode_init(); + } + + return false; } -/* 800DA098-800DA1A4 .text checkExplodeBg_nut__8daBomb_cFv */ -void daBomb_c::checkExplodeBg_nut() { - /* Nonmatching */ +bool daBomb_c::checkExplodeBg_nut() { + bool sink = chk_water_in(); + bool burn = chk_lava_hit(); + + //these 2 ifs might be an inline? + bool temp1 = true; + bool temp2 = false; + if(mAcch.ChkWallHit() || mAcch.ChkGroundHit()) { + temp2 = true; + } + + if(!temp2 && !mAcch.ChkRoofHit()) { + temp1 = false; + } + + bool ret = false; + if(burn) { + ret = procExplode_init(); + } + else { + if(sink) { + makeWaterEffect(); + field_0x781 = true; + } + else if(temp1 && field_0x780) { + change_state(STATE_1); + setFuseEffect(); + if(30 < mRestTime) { + mRestTime = 30; + mBck1.setFrame(105.0f); + mBrk1.setFrame(105.0f); + } + } + } + + return ret; } -/* 800DA1A4-800DA284 .text checkExplodeBg_cannon__8daBomb_cFv */ -void daBomb_c::checkExplodeBg_cannon() { - /* Nonmatching */ +bool daBomb_c::checkExplodeBg_cannon() { + bool sink = chk_water_in(); + bool burn = chk_lava_hit(); + + //these 2 ifs might be an inline? + bool temp1 = true; + bool temp2 = false; + if(mAcch.ChkWallHit() || mAcch.ChkGroundHit()) { + temp2 = true; + } + if(!temp2 && !mAcch.ChkRoofHit()) { + temp1 = false; + } + + bool dead = chk_dead_zone(); + bool ret = false; + if(burn || temp1) { + ret = procExplode_init(); + } + else { + if(sink) { + makeWaterEffect(); + field_0x781 = true; + } + else if(dead) { + field_0x781 = true; + } + } + + return ret; } -/* 800DA284-800DA320 .text checkExplodeBg__8daBomb_cFv */ -void daBomb_c::checkExplodeBg() { - /* Nonmatching */ +bool daBomb_c::checkExplodeBg() { + typedef bool(daBomb_c::*checkFunc)(); + static checkFunc proc[] = { + &checkExplodeBg_norm, + &checkExplodeBg_nut, + &checkExplodeBg_cannon + }; + + return (this->*proc[mType])(); } -/* 800DA320-800DA3A0 .text water_tention__8daBomb_cFv */ void daBomb_c::water_tention() { - /* Nonmatching */ + if(chk_water_in()) { + if(field_0x554.y != -1.0e9f && field_0x554.z != -1.0e9f) { + f32 temp; + if(field_0x554.y - field_0x554.z < 0) { + temp = 0.8f * field_0x554.z; + } + else { + temp = 0.2f * field_0x554.z; + } + + current.pos.y += temp; + } + } } -/* 800DA3A0-800DA520 .text posMoveF__8daBomb_cFv */ void daBomb_c::posMoveF() { - /* Nonmatching */ + u32 temp = mNoGravityTime > 0; + f32 gravity; + if(temp) { + gravity = mGravity; + mGravity = 0.0f; + } + + if(mType == 0 && chk_water_in()) { + speed.y *= 0.9f; + speedF *= 0.9f; + } + + if(!chk_state(STATE_5) && !chk_state(STATE_6) && field_0x6F3 != 1) { + water_tention(); + cM3dGPla* tri = dComIfG_Bgsp()->GetTriPla(mAcch.m_gnd.GetBgIndex(), mAcch.m_gnd.GetPolyIndex()); + + f32 mag = mWindVec.getSquareMag(); + if(mag > 0.01f) { + f32 temp2; + cXyz* norm; + if(tri) { + norm = &tri->mNormal; + mag = 0.06f; + temp2 = cM_scos(0xA4F); + } + else { + norm = 0; + mag = 0.0f; + temp2 = 0.0f; + } + + daObj::posMoveF_grade(this, mStts.GetCCMoveP(), &mWindVec, 0.002f, 0.0005f, norm, mag, temp2, 0); + } + else { + fopAcM_posMoveF(this, mStts.GetCCMoveP()); + } + } + + if(temp) { + mGravity = gravity; + mNoGravityTime--; + } } -/* 800DA520-800DA574 .text bgCrrPos__8daBomb_cFv */ void daBomb_c::bgCrrPos() { - /* Nonmatching */ + mAcch.CrrPos(*dComIfG_Bgsp()); + bgCrrPos_lava(); + bgCrrPos_water(); + setRoomInfo(); } -/* 800DA574-800DA5E0 .text bgCrrPos_lava__8daBomb_cFv */ void daBomb_c::bgCrrPos_lava() { - /* Nonmatching */ + cXyz temp(current.pos.x, next.pos.y + 1.0f, current.pos.z); + mGndChk.GetPointP() = temp; + + field_0x554.x = dComIfG_Bgsp()->GroundCross(&mGndChk); } /* 800DA5E0-800DA700 .text bgCrrPos_water__8daBomb_cFv */ @@ -123,33 +520,34 @@ void daBomb_c::bgCrrPos_water() { /* Nonmatching */ } -/* 800DA700-800DA708 .text chk_water_land__8daBomb_cFv */ -void daBomb_c::chk_water_land() { - /* Nonmatching */ +bool daBomb_c::chk_water_land() { + return field_0x560; } -/* 800DA708-800DA710 .text chk_water_in__8daBomb_cFv */ -void daBomb_c::chk_water_in() { - /* Nonmatching */ +bool daBomb_c::chk_water_in() { + return mbWaterIn; } -/* 800DA710-800DA768 .text chk_water_sink__8daBomb_cFv */ -void daBomb_c::chk_water_sink() { - /* Nonmatching */ +bool daBomb_c::chk_water_sink() { + bool water = chk_water_in(); + + return water && field_0x554.y - current.pos.y > 30.0f; } -/* 800DA768-800DA794 .text chk_lava_hit__8daBomb_cFv */ -void daBomb_c::chk_lava_hit() { - /* Nonmatching */ +bool daBomb_c::chk_lava_hit() { + if(field_0x554.x == -1.0e9f) { + return false; + } + + return current.pos.y < field_0x554.x; } -/* 800DA794-800DA7CC .text chk_dead_zone__8daBomb_cFv */ -void daBomb_c::chk_dead_zone() { - /* Nonmatching */ +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(float) { +void daBomb_c::bound(f32) { /* Nonmatching */ } @@ -158,94 +556,469 @@ void daBomb_c::set_real_shadow_flag() { /* Nonmatching */ } -/* 800DA9DC-800DAA60 .text setRoomInfo__8daBomb_cFv */ void daBomb_c::setRoomInfo() { - /* Nonmatching */ + s32 roomNo; + if(mAcch.GetGroundH() != -1.0e9f) { + roomNo = dComIfG_Bgsp()->GetRoomId(mAcch.m_gnd); + mTevStr.mEnvrIdxOverride = dComIfG_Bgsp()->GetPolyColor(mAcch.m_gnd); + } + else { + roomNo = dComIfGp_roomControl_getStayNo(); + } + + mTevStr.mRoomNo = roomNo; + mStts.SetRoomId(roomNo); + current.roomNo = roomNo; } -/* 800DAA60-800DAB28 .text makeFireEffect__8daBomb_cFR4cXyzR5csXyz */ -void daBomb_c::makeFireEffect(cXyz&, csXyz&) { - /* Nonmatching */ +void daBomb_c::makeFireEffect(cXyz& pos, csXyz& rotation) { + camera_class* cam = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0)); + + cXyz scale; + scale.setAll(0.3f); + csXyz rot; + rot.x = -cam->mAngle.x; + rot.y = cam->mAngle.y + 0x8000; + rot.z = 0; + + rotation.x = rotation.x + 0x4000; + rotation.z = rotation.z; + g_dComIfG_gameInfo.play.getParticle()->setBombSmoke(0x200A, &pos, &rotation, &scale, 0xFF); + + dComIfGp_getVibration().StartShock(7, -0x21, cXyz(0.0f, 1.0f, 0.0f)); } -/* 800DAB28-800DAC40 .text makeWaterEffect__8daBomb_cFv */ void daBomb_c::makeWaterEffect() { - /* Nonmatching */ + if(field_0x77D == 0) { + fopAcM_seStart(this, 0x6982, 0); + fopKyM_createWpillar(¤t.pos, 1.0f, 1.0f, 1); + mSph.GetObjTg().OffSPrmBit(cCcD_ObjCommonBase::CO_SPRM_SET); + mSph.GetObjCo().OffSPrmBit(cCcD_ObjCommonBase::CO_SPRM_SET); + mSph.GetObjAt().OnSPrmBit(cCcD_ObjCommonBase::CO_SPRM_SET); + mSph.SetR(200.0f); + mSph.SetC(current.pos); + if(mMassCounter != g_Counter.mCounter0) { + dComIfG_Ccsp()->Set(&mSph); + //using inline breaks match + //dComIfG_Ccsp()->SetMass(&mSph, 3); + g_dComIfG_gameInfo.play.mCcS.SetMass(&mSph, 3); + mMassCounter = g_Counter.mCounter0; + field_0x782 = 1; + } + + field_0x77D = 1; + } } -/* 800DAC40-800DAD6C .text setFuseEffect__8daBomb_cFv */ void daBomb_c::setFuseEffect() { - /* Nonmatching */ + if(field_0x77E == 0) { + field_0x77E = 1; + mFusePos.x = current.pos.x; + mFusePos.y = current.pos.y + 60.0f; + mFusePos.z = current.pos.z; + 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; + } } -/* 800DAD6C-800DAE54 .text eff_explode_normal__8daBomb_cFPC5csXyz */ -void daBomb_c::eff_explode_normal(const csXyz*) { - /* Nonmatching */ +void daBomb_c::eff_explode_normal(const csXyz* rotation) { + dComIfGp_particle_setToon(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); } -/* 800DAE54-800DAF94 .text eff_explode_cheap__8daBomb_cFPC5csXyz */ -void daBomb_c::eff_explode_cheap(const csXyz*) { - /* Nonmatching */ +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); + if(emitter) { + emitter->mLifeTime = 0xC; + emitter->mGlobalScale2D.set(0.5f, 0.67f, 1.0f); + } + + g_dComIfG_gameInfo.play.getParticle()->setBombSmoke(0x232A, ¤t.pos, 0, &mScale, 0xFF); + emitter = g_dComIfG_gameInfo.play.getParticle()->setBombSmoke(0x200A, ¤t.pos, 0, &mScale, 0xFF); + if(emitter) { + emitter->mLifeTime = 0x46; + } + + emitter = dComIfGp_particle_setToonP1(0x2008, ¤t.pos, 0, &mScale, 0xFF, 0, -1, 0, 0, 0); + if(emitter) { + emitter->mLifeTime = 0x46; + emitter->mInitialVelAxis = 25.0f; + emitter->mInitialVelDir = 35.0f; + } } -/* 800DAF94-800DB024 .text eff_explode__8daBomb_cFv */ void daBomb_c::eff_explode() { - /* Nonmatching */ + camera_class* cam = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0)); + csXyz rot; + rot.x = -cam->mAngle.x; + rot.y = cam->mAngle.y + 0x8000; + rot.z = 0; + + if(prm_get_cheapEff()) { + eff_explode_cheap(&rot); + } + else { + eff_explode_normal(&rot); + } } -/* 800DB024-800DB630 .text procExplode_init__8daBomb_cFv */ -void daBomb_c::procExplode_init() { - /* Nonmatching */ +int daBomb_c::procExplode_init() { + camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0)); + camera->mCamera.ForceLockOff(fopAcM_GetID(this)); + + s32 temp; + if(chk_state(STATE_8)) { + f32 temp2; + temp = fopAcM_getWaterY(¤t.pos, &temp2); + if(temp) { + 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); + + if(dComIfG_Bgsp()->GroundCross(&gndCheck) > temp2 || current.pos.y > temp2 + 50.0f) { + temp = 0; + } + } + } + else { + temp = 0; + } + + if(temp == 0) { + eff_explode(); + } + else { + fopKyM_createWpillar(¤t.pos, 1.0f, 1.0f, 1); + } + + if(mSmoke.mpEmitter) { + mSmoke.mpEmitter->mpEmitterCallBack = 0; + mSmoke.mpEmitter->becomeInvalidEmitter(); + } + mSmoke.mpEmitter = 0; + + if(mSparks.mpEmitter) { + mSparks.mpEmitter->mpEmitterCallBack = 0; + mSparks.mpEmitter->becomeInvalidEmitter(); + } + mSparks.mpEmitter = 0; + + mPntLight.mPos = current.pos; + mPntLight.mPos.y += 100.0f; + mPntLight.mColor.r = 200; + mPntLight.mColor.g = 200; + mPntLight.mColor.b = 160; + mPntLight.mPower = 600.0f; + mPntLight.mFluctuation = 100.0f; + dKy_efplight_set(&mPntLight); + + mPntWind.mPos = current.pos; + mPntWind.mDir.x = 0.0f; + mPntWind.mDir.y = 1.0f; + mPntWind.mDir.z = 0.0f; + mPntWind.mRadius = 500.0f; + mPntWind.field_0x20 = 0.0f; + mPntWind.mStrength = 0.5f; + dKyw_pntwind_set(&mPntWind); + + field_0x774 = 0; + field_0x778 = 0.0f; + mFunc = &procExplode; + speedF = 0.0f; + speed = cXyz::Zero; + mGravity = 0.0f; + + if(chk_state(STATE_8)) { + change_state(STATE_0); + } + + mAttentionInfo.mFlags &= ~0x10; + + if(field_0x6F0) { + if(daPy_getPlayerLinkActorClass()->mActivePlayerBombs != 0) { + daPy_getPlayerLinkActorClass()->mActivePlayerBombs -= 1; + } + + field_0x6F0 = 0; + } + + mSph.GetObjTg().OffSPrmBit(cCcD_ObjCommonBase::CO_SPRM_SET); + mSph.GetObjCo().OffSPrmBit(cCcD_ObjCommonBase::CO_SPRM_SET); + mSph.GetObjAt().OnSPrmBit(cCcD_ObjCommonBase::CO_SPRM_SET); + mSph.SetR(200.0f); + mSph.SetC(current.pos); + if(mMassCounter != g_Counter.mCounter0) { + dComIfG_Ccsp()->Set(&mSph); + //using inline breaks match + //dComIfG_Ccsp()->SetMass(&mSph, 3); + g_dComIfG_gameInfo.play.mCcS.SetMass(&mSph, 3); + field_0x782 = 1; + mMassCounter = g_Counter.mCounter0; + } + + if(temp) { + fopAcM_seStart(this, 0x6982, 0); + } + else { + fopAcM_seStart(this, 0x6901, 0); + } + + fopAcM_cancelCarryNow(this); + dKy_Sound_set(current.pos, 0xFF, fopAcM_GetID(this), 0xA); + + mRestTime = 0; + field_0x6FE = 2; + dComIfGp_getVibration().StartShock(7, -0x21, cXyz(0.0f, 1.0f, 0.0f)); + + se_cannon_fly_stop(); + + return true; } /* 800DB630-800DB880 .text procExplode__8daBomb_cFv */ -void daBomb_c::procExplode() { - /* Nonmatching */ +bool daBomb_c::procExplode() { + camera_class* camera = dComIfGp_getCamera(0); + f32 temp2 = 0.0f; + + mPntLight.mPower = field_0x778 * 1500.0f; + mPntWind.mStrength = field_0x778; + f32 temp = current.pos.abs(camera->mLookat.mEye); + + if(temp < 1500.0f) { + temp2 = 1.0f - (temp / 1500.0f); + } + + dKy_actor_addcol_amb_set(200, 180, 100, field_0x778 * temp2); + dKy_bg_addcol_amb_set(180, 160, 60, field_0x778 * temp2); + dKy_bg_addcol_dif_set(255, 225, 120, field_0x778 * temp2); + + switch(field_0x774) { + case 0: + cLib_addCalc(&field_0x778, 0.0f, 0.05f, 0.04f, 0.001f); + if(field_0x778 >= 0.01f) { + field_0x774 += 1; + } + + break; + case 1: + cLib_addCalc(&field_0x778, 0.0f, 0.05f, 0.04f, 0.01f); + if(field_0x778 <= 0.99f) { + field_0x774 += 1; + } + + break; + } + + if(field_0x6FE) { + field_0x6FE -= 1; + mSph.SetC(current.pos); + if(mMassCounter != g_Counter.mCounter0) { + dComIfG_Ccsp()->Set(&mSph); + //using inline breaks match + //dComIfG_Ccsp()->SetMass(&mSph, 3); + g_dComIfG_gameInfo.play.mCcS.SetMass(&mSph, 3); + mMassCounter = g_Counter.mCounter0; + field_0x782 = 1; + } + } + else { + if(1 < field_0x774) { + field_0x781 = 1; + } + } + + return true; } -/* 800DB880-800DB92C .text procCarry_init__8daBomb_cFv */ -void daBomb_c::procCarry_init() { - /* Nonmatching */ +bool daBomb_c::procCarry_init() { + if(chk_attrState(this, ATTR_STATE_100)) { + setFuseEffect(); + } + + mFunc = &procCarry; + change_state(STATE_2); + speedF = 0.0f; + speed.set(cXyz::Zero); + mAttentionInfo.mFlags &= ~0x10; + mSph.GetObjCo().OffSPrmBit(cCcD_ObjCommonBase::CO_SPRM_SET); + + return true; } -/* 800DB92C-800DB9DC .text procCarry__8daBomb_cFv */ -void daBomb_c::procCarry() { - /* Nonmatching */ +bool daBomb_c::procCarry() { + if(!fopAcM_checkCarryNow(this)) { + if(speedF > 0.0f) { + field_0x780 = 1; + } + + procWait_init(); + return procWait(); + } + else { + if(checkExplode()) { + return true; + } + else { + cXyz curPos(current.pos); + bgCrrPos(); + current.pos.set(curPos); + + return true; + } + } } -/* 800DB9DC-800DBA50 .text procWait_init__8daBomb_cFv */ -void daBomb_c::procWait_init() { - /* Nonmatching */ +bool daBomb_c::procWait_init() { + mFunc = &procWait; + if(chk_attrState(this, ATTR_STATE_80)) { + change_state(STATE_1); + } + + mSph.GetObjCo().OnSPrmBit(cCcD_ObjCommonBase::CO_SPRM_SET); + return true; } -/* 800DBA50-800DBBA0 .text procWait__8daBomb_cFv */ -void daBomb_c::procWait() { - /* Nonmatching */ +bool daBomb_c::procWait() { + if(checkExplode()) { + return true; + } + else { + if(fopAcM_checkCarryNow(this)) { + return procCarry_init(); + } + else { + posMoveF(); + f32 y_vel = speed.y; + bgCrrPos(); + bool temp = false; + if(checkExplodeBg()) { + temp = true; + } + else { + if(chk_state(STATE_4)) { + if(waitState_cannon()) { + temp = true; + } + } + else { + if(chk_state(STATE_7)) { + waitState_bomtyu(); + } + } + } + + if(!temp && !field_0x781) { + bound(y_vel); + if((mAcch.ChkGroundHit() || chk_state(STATE_5)) && !mAcch.ChkGroundLanding()) { + mAttentionInfo.setFlag(0x10); + } + else { + mAttentionInfo.mFlags &= ~0x10; + } + } + + return true; + } + } } -/* 800DBBA0-800DBBC4 .text waitState_cannon__8daBomb_cFv */ -void daBomb_c::waitState_cannon() { - /* Nonmatching */ +bool daBomb_c::waitState_cannon() { + se_cannon_fly_set(); + + return false; } -/* 800DBBC4-800DBC4C .text waitState_bomtyu__8daBomb_cFv */ void daBomb_c::waitState_bomtyu() { - /* Nonmatching */ + cLib_chaseF(&mScale.x, 1.0f, 0.05f); + cLib_chaseF(&mScale.y, 1.0f, 0.05f); + cLib_chaseF(&mScale.z, 1.0f, 0.05f); + if(field_0x6F2) { + setFuseEffect(); + field_0x6F2 = 0; + field_0x6F4 = 1; + change_state(STATE_1); + } } -/* 800DBC4C-800DBC5C .text procSink__8daBomb_cFv */ -void daBomb_c::procSink() { - /* Nonmatching */ +bool daBomb_c::procSink() { + field_0x781 = 1; + + return true; } /* 800DBC5C-800DBF24 .text execute__8daBomb_cFv */ -void daBomb_c::execute() { - /* Nonmatching */ +BOOL daBomb_c::execute() { + static cXyz fuse_offset(0.0f, 60.0f, 5.0f); + + if(chk_state(STATE_4) && !field_0x77C) { + field_0x77C = 1; + cXyz pos(current.pos); + pos.y += 20.0f; + makeFireEffect(pos, shape_angle); + } + + set_wind_vec(); + if(mFunc) { + (this->*mFunc)(); + } + + if(field_0x781) { + fopAcM_delete(this); + } + else { + set_real_shadow_flag(); + if(mType == 1) { + anm_play_nut(); + } + + mStts.Move(); + mAttentionInfo.mPosition.x = current.pos.x; + mAttentionInfo.mPosition.y = current.pos.y + 50.0f; + mAttentionInfo.mPosition.z = current.pos.z; + mEyePos = mAttentionInfo.mPosition; + if(!chk_attrState(this, ATTR_STATE_20)) { + set_mtx(); + mFusePos3 = mFusePos2; + mFusePos2 = mFusePos; + mDoMtx_stack_c::multVec(&fuse_offset, &mFusePos); + cXyz pos; + pos.x = current.pos.x; + pos.y = current.pos.y + 30.0f; + pos.z = current.pos.z; + mSph.SetC(pos); + mSph.SetR(mScale.x * 30.0f); + if(mMassCounter != g_Counter.mCounter0) { + dComIfG_Ccsp()->Set(&mSph); + //using inline breaks match + //dComIfG_Ccsp()->SetMass(&mSph, 3); + g_dComIfG_gameInfo.play.mCcS.SetMass(&mSph, 3); + mMassCounter = g_Counter.mCounter0; + } + } + + if(chk_attrState(this, ATTR_STATE_10) || field_0x6F4 == 1) { + fopAcM_seStart(this, 0x6100, 0); + } + } + + if(field_0x782) { + field_0x784++; + } + + return true; } -/* 800DBF24-800DBF44 .text daBomb_Execute__FP8daBomb_c */ -void daBomb_Execute(daBomb_c*) { - /* Nonmatching */ +BOOL daBomb_Execute(daBomb_c* i_this) { + return i_this->execute(); } /* 800DBF44-800DC250 .text set_wind_vec__8daBomb_cFv */ @@ -255,62 +1028,138 @@ void daBomb_c::set_wind_vec() { /* 800DC250-800DC2D0 .text anm_play_nut__8daBomb_cFv */ void daBomb_c::anm_play_nut() { - /* Nonmatching */ + if(chk_state(STATE_5) || chk_state(STATE_6)) { + mBck0.play(); + mBrk0.play(); + } + else { + if(mRestTime + 2 <= 0x87) { + mBck1.play(); + mBrk1.play(); + } + } } -/* 800DC2D0-800DC384 .text set_mtx__8daBomb_cFv */ void daBomb_c::set_mtx() { - /* Nonmatching */ + mpModel->setBaseScale(mScale); + mDoMtx_stack_c::transS(current.pos); + if(prm_get_angXZero()) { + mDoMtx_stack_c::ZXYrotM(0, shape_angle.y, shape_angle.z); + } + else { + mDoMtx_stack_c::ZXYrotM(shape_angle.x, shape_angle.y, shape_angle.z); + } + + MTXCopy(mDoMtx_stack_c::get(), mpModel->mBaseTransformMtx); } -/* 800DC384-800DC3A4 .text init_mtx__8daBomb_cFv */ void daBomb_c::init_mtx() { - /* Nonmatching */ + set_mtx(); } -/* 800DC3A4-800DC400 .text se_cannon_fly_set__8daBomb_cFv */ void daBomb_c::se_cannon_fly_set() { - /* Nonmatching */ + mDoAud_seStart(0x381F, ¤t.pos, 0, 0); + field_0x77F = 1; } -/* 800DC400-800DC44C .text se_cannon_fly_stop__8daBomb_cFv */ void daBomb_c::se_cannon_fly_stop() { - /* Nonmatching */ + if(field_0x77F) { + mDoAud_seStopActor(¤t.pos, -1); + field_0x77F = 0; + } } -/* 800DC44C-800DC568 .text eff_water_splash__8daBomb_cFv */ void daBomb_c::eff_water_splash() { - /* Nonmatching */ + cXyz pos; + pos.z = current.pos.z; + pos.y = field_0x554.y; + pos.x = current.pos.x; + fopKyM_createWpillar(&pos, 0.5f, 0.75f, 0); + + //what + u32 soundId = 0x13; + + fopAcM_seStart(this, 0x6918, soundId); } -/* 800DC568-800DC570 .text daBomb_IsDelete__FP8daBomb_c */ -void daBomb_IsDelete(daBomb_c*) { - /* Nonmatching */ +bool daBomb_IsDelete(daBomb_c*) { + return true; } -/* 800DC570-800DC67C .text bombDelete__8daBomb_cFv */ -void daBomb_c::bombDelete() { - /* Nonmatching */ +bool daBomb_c::bombDelete() { + if(mSmoke.mpEmitter) { + mSmoke.mpEmitter->mpEmitterCallBack = 0; + mSmoke.mpEmitter->becomeInvalidEmitter(); + } + mSmoke.mpEmitter = 0; + + if(mSparks.mpEmitter) { + mSparks.mpEmitter->mpEmitterCallBack = 0; + mSparks.mpEmitter->becomeInvalidEmitter(); + } + mSparks.mpEmitter = 0; + + if(field_0x6F0) { + if(daPy_getPlayerLinkActorClass()->mActivePlayerBombs != 0) { + daPy_getPlayerLinkActorClass()->mActivePlayerBombs -= 1; + } + } + + se_cannon_fly_stop(); + if(mType == 1) { + dComIfG_resDelete(&mPhs, m_attrType[mType].resName); + } + + dKy_actor_addcol_set(0, 0, 0, 0.0f); + dKy_efplight_cut(&mPntLight); + dKyw_pntwind_cut(&mPntWind); + + return true; } -/* 800DC67C-800DC6A0 .text daBomb_Delete__FP8daBomb_c */ -void daBomb_Delete(daBomb_c*) { - /* Nonmatching */ +BOOL daBomb_Delete(daBomb_c* i_this) { + i_this->bombDelete(); + return true; } -/* 800DC6A0-800DCADC .text createHeap__8daBomb_cFv */ -void daBomb_c::createHeap() { - /* Nonmatching */ +#include "src/d/actor/d_a_bomb3.inc" + +int daBomb_createHeap(fopAc_ac_c* i_this) { + static_cast(i_this)->createHeap(); } -/* 800DCADC-800DCAFC .text daBomb_createHeap__FP10fopAc_ac_c */ -void daBomb_createHeap(fopAc_ac_c*) { - /* Nonmatching */ -} +int daBomb_c::create() { + int state = prm_get_state(); + if(state == 5 || state == 6) { + mType = 1; + } + else if(state == 4) { + mType = 2; + } + else { + mType = 0; + } -/* 800DCAFC-800DCC0C .text create__8daBomb_cFv */ -void daBomb_c::create() { - /* Nonmatching */ + fopAcM_SetupActor(this, daBomb_c); + + int status; + if(mType == 1) { + status = dComIfG_resLoad(&mPhs, m_attrType[mType].resName); + } + else { + status = cPhs_COMPLEATE_e; + } + + if(status == cPhs_COMPLEATE_e) { + if(fopAcM_entrySolidHeap(this, &daBomb_createHeap, m_attrType[mType].heapSize)) { + create_init(); + } + else { + status = cPhs_ERROR_e; + } + } + + return status; } /* 800DCC0C-800DCEBC .text __ct__8daBomb_cFv */ @@ -318,14 +1167,88 @@ daBomb_c::daBomb_c() { /* Nonmatching */ } -/* 800DCEF8-800DCF18 .text daBomb_Create__FP10fopAc_ac_c */ -void daBomb_Create(fopAc_ac_c*) { - /* Nonmatching */ +int daBomb_Create(fopAc_ac_c* i_this) { + return static_cast(i_this)->create(); } -/* 800DCF18-800DD1A4 .text create_init__8daBomb_cFv */ +dCcD_SrcSph l_sph_src = {}; + void daBomb_c::create_init() { - /* Nonmatching */ + mCir.SetWall(30.0f, 30.0f); + mAcch.Set(¤t.pos, &next.pos, this, true, &mCir, &speed, ¤t.angle, &shape_angle); + mAcch.ClrWaterNone(); + mAcch.ClrRoofNone(); + mAcch.m_roof_height = 50.0f; + mAcch.OnLineCheck(); + + field_0x554.setAll(-1.0e9f); + field_0x560 = 0; + mbWaterIn = 0; + field_0x562 = 0; + mCullMtx = mpModel->getBaseTRMtx(); + + mStts.Init(200, 0xFF, this); + mSph.Set(l_sph_src); + mSph.SetStts(&mStts); + if(chk_state(STATE_8)) { + mSph.GetObjAt().SetAtp(2); + } + + mGravity = -2.9f; + mMaxFallSpeed = -100.0f; + mRestTime = 0x96; + mInitialState = prm_get_state(); + if(!chk_state(STATE_4)) { + mAttentionInfo.setFlag(0x10); + } + + field_0x77C = 0; + field_0x77D = 0; + field_0x77E = 0; + field_0x6F4 = 0; + field_0x77F = 0; + field_0x780 = 0; + field_0x781 = 0; + field_0x782 = 0; + field_0x784 = 0; + + mWindVec.set(cXyz::Zero); + + mMassCounter = g_Counter.mCounter0 - 1; + if(chk_attrState(this, ATTR_STATE_2)) { + mScale.setAll(0.0f); + } + if(chk_attrState(this, ATTR_STATE_4)) { + setFuseEffect(); + } + if(chk_attrState(this, ATTR_STATE_8)) { + bgCrrPos(); + } + + if(chk_state(STATE_3)) { + field_0x6F0 = 1; + field_0x7C8 = 2; + } + else { + field_0x7C8 = 0; + } + + if(chk_attrState(this, ATTR_STATE_1)) { + procExplode_init(); + } + else { + procWait_init(); + } + + mCull.mBox.mMin.x = -36.0f; + mCull.mBox.mMin.y = 0.0f; + mCull.mBox.mMin.z = -36.0f; + mCull.mBox.mMax.x = 36.0f; + mCull.mBox.mMax.y = 66.0f; + mCull.mBox.mMax.z = 36.0f; + mCullSizeFar = 10.0f; + + init_mtx(); } /* 800DD348-800DD34C .text draw__26daBomb_fuseSparksEcallBackFP14JPABaseEmitter */ @@ -333,9 +1256,9 @@ void daBomb_fuseSparksEcallBack::draw(JPABaseEmitter*) { /* Nonmatching */ } -/* 800DD34C-800DD358 .text setup__26daBomb_fuseSparksEcallBackFP14JPABaseEmitterPC4cXyzPC5csXyzSc */ -void daBomb_fuseSparksEcallBack::setup(JPABaseEmitter*, const cXyz*, const csXyz*, signed char) { - /* Nonmatching */ +void daBomb_fuseSparksEcallBack::setup(JPABaseEmitter* emitter, const cXyz* pos, const csXyz*, signed char) { + mpPos = pos; + mpEmitter = emitter; } /* 800DD358-800DD35C .text execute__25daBomb_fuseSmokeEcallBackFP14JPABaseEmitter */ @@ -348,7 +1271,32 @@ void daBomb_fuseSmokeEcallBack::draw(JPABaseEmitter*) { /* Nonmatching */ } -/* 800DD360-800DD36C .text setup__25daBomb_fuseSmokeEcallBackFP14JPABaseEmitterPC4cXyzPC5csXyzSc */ -void daBomb_fuseSmokeEcallBack::setup(JPABaseEmitter*, const cXyz*, const csXyz*, signed char) { - /* Nonmatching */ +void daBomb_fuseSmokeEcallBack::setup(JPABaseEmitter* emitter, const cXyz* pos, const csXyz*, signed char) { + mpPos = pos; + mpEmitter = emitter; } + +actor_method_class l_daBomb_Method = { + (process_method_func)daBomb_Create, + (process_method_func)daBomb_Delete, + (process_method_func)daBomb_Execute, + (process_method_func)daBomb_IsDelete, + (process_method_func)daBomb_Draw, +}; + +extern actor_process_profile_definition g_profile_BOMB = { + fpcLy_CURRENT_e, + 7, + fpcPi_CURRENT_e, + PROC_BOMB, + &g_fpcLf_Method.mBase, + sizeof(daBomb_c), + 0, + 0, + &g_fopAc_Method.base, + 0x0115, + &l_daBomb_Method, + 0x00040100, + fopAc_ACTOR_e, + fopAc_CULLBOX_CUSTOM_e, +}; diff --git a/src/d/actor/d_a_bomb2.cpp b/src/d/actor/d_a_bomb2.cpp index 5d7a7109b..059983e3e 100644 --- a/src/d/actor/d_a_bomb2.cpp +++ b/src/d/actor/d_a_bomb2.cpp @@ -4,513 +4,925 @@ // #include "d/actor/d_a_bomb2.h" -#include "dolphin/types.h" - -/* 800DD37C-800DD454 .text set__Q27daBomb25Env_cFRC4cXyz */ -void daBomb2::Env_c::set(const cXyz&) { - /* Nonmatching */ -} - -/* 800DD454-800DD4A0 .text clean__Q27daBomb25Env_cFv */ -void daBomb2::Env_c::clean() { - /* Nonmatching */ -} - -/* 800DD4A0-800DD4B0 .text is_end__Q27daBomb25Env_cCFv */ -void daBomb2::Env_c::is_end() const { - /* Nonmatching */ -} - -/* 800DD4B0-800DD670 .text proc__Q27daBomb25Env_cFRC4cXyz */ -void daBomb2::Env_c::proc(const cXyz&) { - /* Nonmatching */ -} - -/* 800DD670-800DD684 .text setOldPosP__Q27daBomb213FuseSmokeCB_cFPC4cXyzPC4cXyz */ -void daBomb2::FuseSmokeCB_c::setOldPosP(const cXyz*, const cXyz*) { - /* Nonmatching */ -} - -/* 800DD684-800DD6BC .text deleteCallBack__Q27daBomb213FuseSmokeCB_cFv */ -void daBomb2::FuseSmokeCB_c::deleteCallBack() { - /* Nonmatching */ -} - -/* 800DD6BC-800DD6C0 .text execute__Q27daBomb213FuseSmokeCB_cFP14JPABaseEmitter */ -void daBomb2::FuseSmokeCB_c::execute(JPABaseEmitter*) { - /* Nonmatching */ -} - -/* 800DD6C0-800DDAE8 .text executeAfter__Q27daBomb213FuseSmokeCB_cFP14JPABaseEmitter */ -void daBomb2::FuseSmokeCB_c::executeAfter(JPABaseEmitter*) { - /* Nonmatching */ -} - -/* 800DDAE8-800DDAEC .text draw__Q27daBomb213FuseSmokeCB_cFP14JPABaseEmitter */ -void daBomb2::FuseSmokeCB_c::draw(JPABaseEmitter*) { - /* Nonmatching */ -} - -/* 800DDAEC-800DDAF8 .text setup__Q27daBomb213FuseSmokeCB_cFP14JPABaseEmitterPC4cXyzPC5csXyzSc */ -void daBomb2::FuseSmokeCB_c::setup(JPABaseEmitter*, const cXyz*, const csXyz*, signed char) { - /* Nonmatching */ -} - -/* 800DDAF8-800DDB30 .text deleteCallBack__Q27daBomb214FuseSparksCB_cFv */ -void daBomb2::FuseSparksCB_c::deleteCallBack() { - /* Nonmatching */ -} - -/* 800DDB30-800DDB78 .text execute__Q27daBomb214FuseSparksCB_cFP14JPABaseEmitter */ -void daBomb2::FuseSparksCB_c::execute(JPABaseEmitter*) { - /* Nonmatching */ -} - -/* 800DDB78-800DDB7C .text draw__Q27daBomb214FuseSparksCB_cFP14JPABaseEmitter */ -void daBomb2::FuseSparksCB_c::draw(JPABaseEmitter*) { - /* Nonmatching */ -} - -/* 800DDB7C-800DDB88 .text setup__Q27daBomb214FuseSparksCB_cFP14JPABaseEmitterPC4cXyzPC5csXyzSc */ -void daBomb2::FuseSparksCB_c::setup(JPABaseEmitter*, const cXyz*, const csXyz*, signed char) { - /* Nonmatching */ -} - -/* 800DDB88-800DDBAC .text solidHeapCB__Q27daBomb25Act_cFP10fopAc_ac_c */ -void daBomb2::Act_c::solidHeapCB(fopAc_ac_c*) { - /* Nonmatching */ -} - -/* 800DDBAC-800DDD90 .text create_heap_nut__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::create_heap_nut() { - /* Nonmatching */ -} - -/* 800DDD90-800DDDB0 .text create_heap__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::create_heap() { - /* Nonmatching */ -} - -/* 800DDDB0-800DDE60 .text crr_init__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::crr_init() { - /* Nonmatching */ -} - -/* 800DDE60-800DDEB4 .text cc_init__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::cc_init() { - /* Nonmatching */ -} - -/* 800DDEB4-800DDF04 .text start_explode_instant__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::start_explode_instant() { - /* Nonmatching */ -} - -/* 800DDF04-800DDF40 .text start_explode_interval__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::start_explode_interval() { - /* Nonmatching */ -} - -/* 800DDF40-800DDF60 .text start_carry__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::start_carry() { - /* Nonmatching */ -} - -/* 800DDF60-800DE024 .text start_proc_call__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::start_proc_call() { - /* Nonmatching */ -} - -/* 800DE024-800DE14C .text create_init__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::create_init() { - /* Nonmatching */ -} - -/* 800DE14C-800DE1F8 .text _create__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::_create() { - /* Nonmatching */ -} - -/* 800DE1F8-800DE484 .text __ct__Q27daBomb25Act_cFv */ -daBomb2::Act_c::Act_c() { - /* Nonmatching */ -} - -/* 800DE484-800DE4D0 .text _delete__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::_delete() { - /* Nonmatching */ -} - -/* 800DE4D0-800DE574 .text set_mtx__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::set_mtx() { - /* Nonmatching */ -} - -/* 800DE574-800DE5B0 .text init_mtx__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::init_mtx() { - /* Nonmatching */ -} - -/* 800DE5B0-800DE740 .text cc_set__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::cc_set() { - /* Nonmatching */ -} - -/* 800DE740-800DE794 .text camera_lockoff__Q27daBomb25Act_cCFv */ -void daBomb2::Act_c::camera_lockoff() const { - /* Nonmatching */ -} - -/* 800DE794-800DE854 .text posMoveF__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::posMoveF() { - /* Nonmatching */ -} - -/* 800DE854-800DE8A8 .text bgCrrPos__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::bgCrrPos() { - /* Nonmatching */ -} - -/* 800DE8A8-800DE914 .text bgCrrPos_lava__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::bgCrrPos_lava() { - /* Nonmatching */ -} - -/* 800DE914-800DEA0C .text bgCrrPos_water__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::bgCrrPos_water() { - /* Nonmatching */ -} - -/* 800DEA0C-800DEA14 .text chk_water_in__Q27daBomb25Act_cCFv */ -void daBomb2::Act_c::chk_water_in() const { - /* Nonmatching */ -} - -/* 800DEA14-800DEA40 .text chk_lava_in__Q27daBomb25Act_cCFv */ -void daBomb2::Act_c::chk_lava_in() const { - /* Nonmatching */ -} - -/* 800DEA40-800DEAC4 .text setRoomInfo__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::setRoomInfo() { - /* Nonmatching */ -} - -/* 800DEAC4-800DEBD0 .text bound__Q27daBomb25Act_cFf */ -void daBomb2::Act_c::bound(float) { - /* Nonmatching */ -} - -/* 800DEBD0-800DEC28 .text set_nut_exp_interval__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::set_nut_exp_interval() { - /* Nonmatching */ -} - -/* 800DEC28-800DEC70 .text anm_play__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::anm_play() { - /* Nonmatching */ -} - -/* 800DEC70-800DEFAC .text set_wind_vec__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::set_wind_vec() { - /* Nonmatching */ -} - -/* 800DEFAC-800DF048 .text eff_explode__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::eff_explode() { - /* Nonmatching */ -} - -/* 800DF048-800DF130 .text eff_explode_normal__Q27daBomb25Act_cFPC5csXyz */ -void daBomb2::Act_c::eff_explode_normal(const csXyz*) { - /* Nonmatching */ -} - -/* 800DF130-800DF198 .text eff_explode_water__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::eff_explode_water() { - /* Nonmatching */ -} - -/* 800DF198-800DF1F0 .text eff_fuse_init__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::eff_fuse_init() { - /* Nonmatching */ -} - -/* 800DF1F0-800DF314 .text eff_fuse_start__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::eff_fuse_start() { - /* Nonmatching */ -} - -/* 800DF314-800DF3DC .text eff_fuse_move__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::eff_fuse_move() { - /* Nonmatching */ -} - -/* 800DF3DC-800DF41C .text eff_fuse_end__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::eff_fuse_end() { - /* Nonmatching */ -} - -/* 800DF41C-800DF488 .text eff_water_splash__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::eff_water_splash() { - /* Nonmatching */ -} - -/* 800DF488-800DF578 .text se_fall_water__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::se_fall_water() { - /* Nonmatching */ -} - -/* 800DF578-800DF5D8 .text se_explode__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::se_explode() { - /* Nonmatching */ -} - -/* 800DF5D8-800DF638 .text se_explode_water__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::se_explode_water() { - /* Nonmatching */ -} - -/* 800DF638-800DF698 .text se_ignition__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::se_ignition() { - /* Nonmatching */ -} - -/* 800DF698-800DF6EC .text set_sound_env__Q27daBomb25Act_cFii */ -void daBomb2::Act_c::set_sound_env(int, int) { - /* Nonmatching */ -} - -/* 800DF6EC-800DF858 .text chk_exp_cc_nut__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::chk_exp_cc_nut() { - /* Nonmatching */ -} - -/* 800DF858-800DF88C .text chk_exp_cc__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::chk_exp_cc() { - /* Nonmatching */ -} - -/* 800DF88C-800DFA5C .text chk_exp_bg_nut__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::chk_exp_bg_nut() { - /* Nonmatching */ -} - -/* 800DFA5C-800DFA7C .text chk_exp_bg__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::chk_exp_bg() { - /* Nonmatching */ -} - -/* 800DFA7C-800DFAC0 .text chk_exp_timer__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::chk_exp_timer() { - /* Nonmatching */ -} - -/* 800DFAC0-800DFB94 .text chk_sink_bg_nut__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::chk_sink_bg_nut() { - /* Nonmatching */ -} - -/* 800DFB94-800DFBB4 .text chk_sink_bg__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::chk_sink_bg() { - /* Nonmatching */ -} - -/* 800DFBB4-800DFC0C .text chk_exp_pre__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::chk_exp_pre() { - /* Nonmatching */ -} - -/* 800DFC0C-800DFC30 .text chk_exp_post__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::chk_exp_post() { - /* Nonmatching */ -} - -/* 800DFC30-800DFC54 .text chk_sink_post__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::chk_sink_post() { - /* Nonmatching */ -} - -/* 800DFC54-800DFD0C .text set_real_shadow_flag__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::set_real_shadow_flag() { - /* Nonmatching */ -} - -/* 800DFD0C-800DFDB0 .text carry_fuse_start__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::carry_fuse_start() { - /* Nonmatching */ -} - -/* 800DFDB0-800DFDC0 .text on_carry__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::on_carry() { - /* Nonmatching */ -} - -/* 800DFDC0-800DFDD0 .text off_carry__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::off_carry() { - /* Nonmatching */ -} - -/* 800DFDD0-800DFDF8 .text mode_wait_init__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::mode_wait_init() { - /* Nonmatching */ -} - -/* 800DFDF8-800DFF40 .text mode_wait__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::mode_wait() { - /* Nonmatching */ -} - -/* 800DFF40-800DFFA4 .text mode_carry_init__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::mode_carry_init() { - /* Nonmatching */ -} - -/* 800DFFA4-800E006C .text mode_carry__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::mode_carry() { - /* Nonmatching */ -} - -/* 800E006C-800E0150 .text mode_explode_init__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::mode_explode_init() { - /* Nonmatching */ -} - -/* 800E0150-800E01A8 .text mode_explode__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::mode_explode() { - /* Nonmatching */ -} - -/* 800E01A8-800E0238 .text mode_sink_init__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::mode_sink_init() { - /* Nonmatching */ -} - -/* 800E0238-800E02D0 .text mode_sink__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::mode_sink() { - /* Nonmatching */ -} - -/* 800E02D0-800E03C4 .text mode_proc_call__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::mode_proc_call() { - /* Nonmatching */ -} - -/* 800E03C4-800E03FC .text tensor_init__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::tensor_init() { - /* Nonmatching */ -} - -/* 800E03FC-800E0430 .text vib_init__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::vib_init() { - /* Nonmatching */ -} - -/* 800E0430-800E04FC .text vib_proc__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::vib_proc() { - /* Nonmatching */ -} - -/* 800E04FC-800E0554 .text set_vib_tensor__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::set_vib_tensor() { - /* Nonmatching */ -} - -/* 800E0554-800E0588 .text tensor_wait__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::tensor_wait() { - /* Nonmatching */ -} - -/* 800E0588-800E05D8 .text tensor_wait_drop__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::tensor_wait_drop() { - /* Nonmatching */ -} - -/* 800E05D8-800E0664 .text tensor_wait_ground__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::tensor_wait_ground() { - /* Nonmatching */ -} - -/* 800E0664-800E0684 .text tensor_carry__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::tensor_carry() { - /* Nonmatching */ -} - -/* 800E0684-800E06A4 .text tensor_explode__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::tensor_explode() { - /* Nonmatching */ -} - -/* 800E06A4-800E06C4 .text tensor_sink__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::tensor_sink() { - /* Nonmatching */ -} - -/* 800E06C4-800E07B8 .text tensor_proc_call__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::tensor_proc_call() { - /* Nonmatching */ -} - -/* 800E07B8-800E0860 .text _execute__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::_execute() { - /* Nonmatching */ -} - -/* 800E0860-800E0894 .text is_draw__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::is_draw() { - /* Nonmatching */ -} - -/* 800E0894-800E0950 .text draw_nut__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::draw_nut() { - /* Nonmatching */ -} - -/* 800E0950-800E0A0C .text draw_shadow__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::draw_shadow() { - /* Nonmatching */ -} - -/* 800E0A0C-800E0A80 .text _draw__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::_draw() { - /* Nonmatching */ -} +#include "d/d_procname.h" +#include "JSystem/JKernel/JKRHeap.h" +#include "d/d_kankyo_wether.h" +#include "f_op/f_op_camera_mng.h" +#include "f_op/f_op_kankyo_mng.h" +#include "m_Do/m_Do_mtx.h" +#include "d/d_com_inf_game.h" namespace daBomb2 { namespace { - /* 800E0A80-800E0AA0 .text Mthd_Create__Q27daBomb223@unnamed@d_a_bomb2_cpp@FPv */ - void Mthd_Create(void*) { - /* Nonmatching */ + struct AttrType { + const char* resName; + u32 heapSize; + s16 field_0x8; + s16 field_0xA; + f32 gravity; + f32 maxFallSpeed; + f32 field_0x14; + f32 field_0x18; + f32 field_0x1C; + f32 field_0x20; + f32 field_0x24; + f32 field_0x28; + f32 field_0x2C; + }; + + 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 + }; + } + + void Env_c::set(const cXyz& pos) { + mPntLight.mPos = pos; + mPntLight.mPos.y += 100.0f; + mPntLight.mColor.r = 200; + mPntLight.mColor.g = 200; + mPntLight.mColor.b = 160; + mPntLight.mPower = 600.0f; + mPntLight.mFluctuation = 100.0f; + dKy_efplight_set(&mPntLight); + + mPntWind.mPos = pos; + mPntWind.mDir.x = 0.0f; + mPntWind.mDir.y = 1.0f; + mPntWind.mDir.z = 0.0f; + mPntWind.mRadius = 500.0f; + mPntWind.field_0x20 = 0.0f; + mPntWind.mStrength = 0.5f; + dKyw_pntwind_set(&mPntWind); + + field_0x4C = 0; + field_0x50 = 0.0f; + } + + void Env_c::clean() { + dKy_actor_addcol_set(0, 0, 0, 0.0f); + dKy_efplight_cut(&mPntLight); + dKyw_pntwind_cut(&mPntWind); + } + + bool Env_c::is_end() const { + return field_0x4C > 1; + } + + void Env_c::proc(const cXyz& param_1) { + camera_class* camera = dComIfGp_getCamera(0); + f32 temp2 = 0.0f; + + mPntLight.mPower = field_0x50 * 1500.0f; + mPntWind.mStrength = field_0x50; + f32 temp = param_1.abs(camera->mLookat.mEye); + + if(temp < 1500.0f) { + temp2 = 1.0f - (temp * (1.0f / 1500.0f)); + } + temp2 *= field_0x50; // operand swap + + dKy_actor_addcol_amb_set(200, 180, 100, temp2); + dKy_bg_addcol_amb_set(180, 160, 60, temp2); + dKy_bg_addcol_dif_set(255, 225, 120, temp2); + + switch(field_0x4C) { + case 0: + cLib_addCalc(&field_0x50, 0.0f, 0.05f, 0.04f, 0.001f); + if(field_0x50 >= 0.01f) { + field_0x4C += 1; + } + + break; + case 1: + cLib_addCalc(&field_0x50, 0.0f, 0.05f, 0.04f, 0.01f); + if(field_0x50 <= 0.99f) { + field_0x4C += 1; + } + + break; + } + } + + void FuseSmokeCB_c::setOldPosP(const cXyz* param_1, const cXyz* param_2) { + field_0x0C = param_1; + field_0x10 = param_2; + field_0x04 = 0x14; + } + + void FuseSmokeCB_c::deleteCallBack() { + if(mpEmitter) { + mpEmitter->mpEmitterCallBack = 0; + mpEmitter->becomeInvalidEmitter(); + } + mpEmitter = 0; + } + + /* 800DD6BC-800DD6C0 .text execute__Q27daBomb213FuseSmokeCB_cFP14JPABaseEmitter */ + void FuseSmokeCB_c::execute(JPABaseEmitter*) { + /* Nonmatching */ + } + + /* 800DD6C0-800DDAE8 .text executeAfter__Q27daBomb213FuseSmokeCB_cFP14JPABaseEmitter */ + void FuseSmokeCB_c::executeAfter(JPABaseEmitter*) { + /* Nonmatching */ + } + + /* 800DDAE8-800DDAEC .text draw__Q27daBomb213FuseSmokeCB_cFP14JPABaseEmitter */ + void FuseSmokeCB_c::draw(JPABaseEmitter*) { + /* Nonmatching */ + } + + void FuseSmokeCB_c::setup(JPABaseEmitter* param_1, const cXyz* param_2, const csXyz*, signed char) { + mpPos = param_2; + mpEmitter = param_1; + } + + void FuseSparksCB_c::deleteCallBack() { + if(mpEmitter) { + mpEmitter->mpEmitterCallBack = 0; + mpEmitter->becomeInvalidEmitter(); + } + mpEmitter = 0; + } + + void FuseSparksCB_c::execute(JPABaseEmitter* emitter) { + f32 x = mpPos->x; + f32 y = mpPos->y; + f32 z = mpPos->z; + emitter->mGlobalTranslation.set(x, y, z); + + JSUPtrLink* link = emitter->mActiveParticles.getFirstLink(); + while(link != 0) { + JSUPtrLink* next = link->getNext(); + + JPABaseParticle* ptcl = (JPABaseParticle*)link->getObjectPtr(); + ptcl->mGlobalPosition.set(x, y, z); + + link = next; + } + } + + void FuseSparksCB_c::draw(JPABaseEmitter*) { + return; + } + + void FuseSparksCB_c::setup(JPABaseEmitter* param_1, const cXyz* param_2, const csXyz*, signed char) { + mpPos = param_2; + 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() { + const char* resName = L_attr.resName; + + J3DModelData* mdl_data = (J3DModelData*)dComIfG_getObjectRes(resName, 0xC); + JUT_ASSERT(0x303, mdl_data != 0); + mpModel = mDoExt_J3DModel__create(mdl_data, 0x80000, 0x11000022); + + J3DAnmTransform* bck_data = (J3DAnmTransform*)dComIfG_getObjectRes(resName, 0x7); + JUT_ASSERT(0x30D, bck_data != 0); + int temp = mBck0.init(mdl_data, bck_data, true, 0, 1.0f, 0, -1, false); + + J3DAnmTevRegKey* brk_data = (J3DAnmTevRegKey*)dComIfG_getObjectRes(resName, 0x10); + 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; } - /* 800E0AA0-800E0AC4 .text Mthd_Delete__Q27daBomb223@unnamed@d_a_bomb2_cpp@FPv */ - void Mthd_Delete(void*) { - /* Nonmatching */ + return ret; + } + + int Act_c::create_heap() { + return create_heap_nut(); + } + + void Act_c::crr_init() { + mCir.SetWall(30.0f, 30.0f); + mAcch.Set(¤t.pos, &next.pos, this, true, &mCir, &speed, ¤t.angle, &shape_angle); + mAcch.ClrWaterNone(); + mAcch.ClrRoofNone(); + mAcch.m_roof_height = 50.0f; + mAcch.OnLineCheck(); + field_0x51C = -1.0e9f; + field_0x520 = -1.0e9f; + field_0x524 = 0; + mbWaterIn = 0; + field_0x526 = 0; + field_0x528 = -1.0e9f; + } + + dCcD_SrcSph Act_c::M_sph_src = {}; + + void Act_c::cc_init() { + mStts.Init(200, 0xFF, this); + mSph.Set(M_sph_src); + mSph.SetStts(&mStts); + } + + void Act_c::start_explode_instant() { + if(chk_water_in()) { + eff_explode_water(); + } + else { + eff_explode(); } - /* 800E0AC4-800E0AE8 .text Mthd_Execute__Q27daBomb223@unnamed@d_a_bomb2_cpp@FPv */ - void Mthd_Execute(void*) { - /* Nonmatching */ + mode_explode_init(); + } + + void Act_c::start_explode_interval() { + eff_fuse_start(); + set_nut_exp_interval(); + mode_wait_init(); + } + + void Act_c::start_carry() { + mode_carry_init(); + } + + /* 800DDF60-800DE024 .text start_proc_call__Q27daBomb25Act_cFv */ + void Act_c::start_proc_call() { + typedef void(Act_c::*procFunc)(); + static procFunc start_proc[] = { + &start_explode_instant, + &start_explode_interval, + &start_carry + }; + + int proc = daObj::PrmAbstract(this, PRM_2_W, PRM_2_S); + return (this->*start_proc[proc])(); + } + + /* 800DE024-800DE14C .text create_init__Q27daBomb25Act_cFv */ + void Act_c::create_init() { + crr_init(); + cc_init(); + + fopAcM_SetMtx(this, mpModel->getBaseTRMtx()); + + fopAcM_setCullSizeBox(this, -36.0f, 0.0f, -36.0f, 36.0f, 66.0f, 36.0f); + mCullSizeFar = 10.0f; + + if(daObj::PrmAbstract(this, PRM_1_W, PRM_1_S)) { + off_carry(); + } + else { + on_carry(); } - /* 800E0AE8-800E0B0C .text Mthd_Draw__Q27daBomb223@unnamed@d_a_bomb2_cpp@FPv */ - void Mthd_Draw(void*) { - /* Nonmatching */ + mGravity = L_attr.gravity; + mMaxFallSpeed = L_attr.maxFallSpeed; + bgCrrPos(); + speed.y = 0.0f; + speedF = 0.0f; + current.pos = orig.pos; + init_mtx(); + + field_0x738 = L_attr.field_0x8; + field_0x740 = 0; + field_0x741 = 0; + field_0x742 = 0; + field_0x743 = 0; + field_0x748 = cXyz::Zero; + + start_proc_call(); + } + + int Act_c::_create() { + fopAcM_SetupActor(this, Act_c); + + int status = dComIfG_resLoad(&mPhs, L_attr.resName); + + if(status == cPhs_COMPLEATE_e) { + if(fopAcM_entrySolidHeap(this, &solidHeapCB, L_attr.heapSize)) { + create_init(); + } + else { + status = cPhs_ERROR_e; + } } - /* 800E0B0C-800E0B14 .text Mthd_IsDelete__Q27daBomb223@unnamed@d_a_bomb2_cpp@FPv */ - void Mthd_IsDelete(void*) { - /* Nonmatching */ + return status; + } + + Act_c::Act_c() {} + + bool Act_c::_delete() { + eff_fuse_end(); + mEnv.clean(); + dComIfG_resDelete(&mPhs, L_attr.resName); + + return true; + } + + void Act_c::set_mtx() { + mpModel->setBaseScale(mScale); + mDoMtx_stack_c::transS(current.pos); + mDoMtx_stack_c::concat(field_0x754); + mDoMtx_stack_c::ZXYrotM(shape_angle); + MTXCopy(mDoMtx_stack_c::get(), mpModel->mBaseTransformMtx); + + eff_fuse_move(); + } + + /* 800DE574-800DE5B0 .text init_mtx__Q27daBomb25Act_cFv */ + void Act_c::init_mtx() { + tensor_init(); + eff_fuse_init(); + set_mtx(); + } + + /* 800DE5B0-800DE740 .text cc_set__Q27daBomb25Act_cFv */ + void Act_c::cc_set() { + /* Nonmatching */ + } + + void Act_c::camera_lockoff() const { + camera_class* camera = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0)); + camera->mCamera.ForceLockOff(fopAcM_GetID((Act_c*)this)); + } + + /* 800DE794-800DE854 .text posMoveF__Q27daBomb25Act_cFv */ + void Act_c::posMoveF() { + /* Nonmatching */ + } + + /* 800DE854-800DE8A8 .text bgCrrPos__Q27daBomb25Act_cFv */ + void Act_c::bgCrrPos() { + mAcch.CrrPos(*dComIfG_Bgsp()); + bgCrrPos_lava(); + bgCrrPos_water(); + setRoomInfo(); + } + + /* 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; + + field_0x51C = dComIfG_Bgsp()->GroundCross(&mGndChk); + } + + /* 800DE914-800DEA0C .text bgCrrPos_water__Q27daBomb25Act_cFv */ + void Act_c::bgCrrPos_water() { + /* Nonmatching */ + } + + bool Act_c::chk_water_in() const { + return mbWaterIn; + } + + bool Act_c::chk_lava_in() const { + if(field_0x51C == -1.0e9f) { + return false; } - }; + + return current.pos.y < field_0x51C; + } + + void Act_c::setRoomInfo() { + s32 roomNo; + if(mAcch.GetGroundH() != -1.0e9f) { + roomNo = dComIfG_Bgsp()->GetRoomId(mAcch.m_gnd); + mTevStr.mEnvrIdxOverride = dComIfG_Bgsp()->GetPolyColor(mAcch.m_gnd); + } + else { + roomNo = dComIfGp_roomControl_getStayNo(); + } + + mTevStr.mRoomNo = roomNo; + mStts.SetRoomId(roomNo); + current.roomNo = roomNo; + } + + /* 800DEAC4-800DEBD0 .text bound__Q27daBomb25Act_cFf */ + void Act_c::bound(float) { + /* Nonmatching */ + } + + void Act_c::set_nut_exp_interval() { + if(field_0x738 > L_attr.field_0xA) { + field_0x738 = L_attr.field_0xA; + + f32 frame = 0x87 - L_attr.field_0xA; + mBck0.getFrameCtrl()->setFrame(frame); + mBrk0.getFrameCtrl()->setFrame(frame); + } + } + + void Act_c::anm_play() { + if(field_0x738 + 1 <= 0x87) { + mBck0.play(); + mBrk0.play(); + } + } + + /* 800DEC70-800DEFAC .text set_wind_vec__Q27daBomb25Act_cFv */ + void Act_c::set_wind_vec() { + /* Nonmatching */ + } + + void Act_c::eff_explode() { + if(!field_0x742) { + field_0x742 = 1; + + camera_class* cam = dComIfGp_getCamera(dComIfGp_getPlayerCameraID(0)); + csXyz rot; + rot.x = -cam->mAngle.x; + rot.y = cam->mAngle.y + 0x8000; + rot.z = 0; + + eff_explode_normal(&rot); + se_explode(); + set_sound_env(0xFF, 0xA); + } + } + + void Act_c::eff_explode_normal(const csXyz* rotation) { + dComIfGp_particle_setToon(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 Act_c::eff_explode_water() { + if(!field_0x743) { + fopKyM_createWpillar(¤t.pos, 1.0f, 1.0f, 1); + field_0x743 = 1; + se_explode_water(); + set_sound_env(0xFF, 0xA); + } + } + + void Act_c::eff_fuse_init() { + field_0x6C0 = cXyz::Zero; + field_0x6CC = cXyz::Zero; + field_0x6D8 = cXyz::Zero; + field_0x744 = 0; + } + + /* 800DF1F0-800DF314 .text eff_fuse_start__Q27daBomb25Act_cFv */ + void Act_c::eff_fuse_start() { + /* Nonmatching */ + } + + /* 800DF314-800DF3DC .text eff_fuse_move__Q27daBomb25Act_cFv */ + void Act_c::eff_fuse_move() { + /* Nonmatching */ + } + + /* 800DF3DC-800DF41C .text eff_fuse_end__Q27daBomb25Act_cFv */ + void Act_c::eff_fuse_end() { + mSmoke.deleteCallBack(); + mSparks.deleteCallBack(); + + field_0x744 = 0; + } + + void Act_c::eff_water_splash() { + cXyz pos(current.pos.x, field_0x520, current.pos.z); + fopKyM_createWpillar(&pos, 0.5f, 0.75f, 0); + + se_fall_water(); + set_sound_env(0x64, 0x5); + } + + /* 800DF488-800DF578 .text se_fall_water__Q27daBomb25Act_cFv */ + void Act_c::se_fall_water() { + /* Nonmatching */ + } + + void Act_c::se_explode() { + fopAcM_seStart(this, 0x6901, 0); + } + + void Act_c::se_explode_water() { + fopAcM_seStart(this, 0x6982, 0); + } + + void Act_c::se_ignition() { + fopAcM_seStart(this, 0x6100, 0); + } + + void Act_c::set_sound_env(int param_1, int param_2) { + dKy_Sound_set(current.pos, param_1, fopAcM_GetID(this), param_2); + } + + bool Act_c::chk_exp_cc_nut() { + bool explode = false; + bool fuse = false; + + if(mSph.ChkTgHit()) { + cCcD_Obj* obj = mSph.GetTgHitObj(); + if(obj) { + if(obj->ChkAtType(0x20)) { // bomb damage + fuse = true; + } + else if(!obj->ChkAtType(0x200000)) { // not leaf wind "damage" + explode = true; + } + } + + mSph.ClrTgHit(); + } + + + if(mSph.ChkCoHit()) { + if(field_0x741 || speed.abs() > L_attr.field_0x2C) { + explode = true; + } + + mSph.ClrCoHit(); + } + + if(explode) { + eff_fuse_start(); + set_nut_exp_interval(); + } + if(fuse) { + eff_explode(); + } + + return explode; + } + + bool Act_c::chk_exp_cc() { + if(field_0x738 > 0) { + return chk_exp_cc_nut(); + } + + return false; + } + + bool Act_c::chk_exp_bg_nut() { + bool water = chk_water_in(); + bool lava = chk_lava_in(); + + bool temp1 = true; + bool temp2 = false; + if(mAcch.ChkWallHit() || mAcch.ChkGroundHit()) { + temp2 = true; + } + + if(!temp2 && !mAcch.ChkRoofHit()) { + temp1 = false; + } + + bool ret = false; + if(lava) { + eff_explode(); + ret = true; + } + else { + if(water && speed.abs() > L_attr.field_0x28) { + eff_explode_water(); + ret = true; + + } + else if(temp1) { + if(field_0x741 || speed.abs() > L_attr.field_0x2C) { + eff_fuse_start(); + set_nut_exp_interval(); + } + } + } + + return ret; + } + + bool Act_c::chk_exp_bg() { + return chk_exp_bg_nut(); + } + + bool Act_c::chk_exp_timer() { + bool ret = false; + if(field_0x738 > 0 && --field_0x738 == 0) { + eff_explode(); + ret = true; + } + + return ret; + } + + /* 800DFAC0-800DFB94 .text chk_sink_bg_nut__Q27daBomb25Act_cFv */ + bool Act_c::chk_sink_bg_nut() { + bool water = chk_water_in(); + + bool ret = false; + if(water && speed.abs() <= L_attr.field_0x28) { + eff_water_splash(); + ret = true; + + } + + return ret; + } + + bool Act_c::chk_sink_bg() { + return chk_sink_bg_nut(); + } + + bool Act_c::chk_exp_pre() { + bool ret = false; + if(chk_exp_cc() || chk_exp_timer()) { + ret = true; + } + + return ret; + } + + bool Act_c::chk_exp_post() { + return chk_exp_bg(); + } + + bool Act_c::chk_sink_post() { + return chk_sink_bg(); + } + + /* 800DFC54-800DFD0C .text set_real_shadow_flag__Q27daBomb25Act_cFv */ + void Act_c::set_real_shadow_flag() { + /* Nonmatching */ + } + + /* 800DFD0C-800DFDB0 .text carry_fuse_start__Q27daBomb25Act_cFv */ + void Act_c::carry_fuse_start() { + /* Nonmatching */ + } + + /* 800DFDB0-800DFDC0 .text on_carry__Q27daBomb25Act_cFv */ + void Act_c::on_carry() { + /* Nonmatching */ + } + + /* 800DFDC0-800DFDD0 .text off_carry__Q27daBomb25Act_cFv */ + void Act_c::off_carry() { + /* Nonmatching */ + } + + /* 800DFDD0-800DFDF8 .text mode_wait_init__Q27daBomb25Act_cFv */ + void Act_c::mode_wait_init() { + /* Nonmatching */ + } + + /* 800DFDF8-800DFF40 .text mode_wait__Q27daBomb25Act_cFv */ + void Act_c::mode_wait() { + /* Nonmatching */ + } + + /* 800DFF40-800DFFA4 .text mode_carry_init__Q27daBomb25Act_cFv */ + void Act_c::mode_carry_init() { + off_carry(); + } + + /* 800DFFA4-800E006C .text mode_carry__Q27daBomb25Act_cFv */ + void Act_c::mode_carry() { + carry_fuse_start(); + chk_exp_pre(); + + bgCrrPos(); + } + + /* 800E006C-800E0150 .text mode_explode_init__Q27daBomb25Act_cFv */ + void Act_c::mode_explode_init() { + camera_lockoff(); + eff_fuse_end(); + mEnv.set(current.pos); + 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); + 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; + } + } + + /* 800E01A8-800E0238 .text mode_sink_init__Q27daBomb25Act_cFv */ + void Act_c::mode_sink_init() { + off_carry(); + fopAcM_cancelCarryNow(this); + field_0x524 = 4; + fopAcM_getWaterY(¤t.pos, &field_0x528); + } + + /* 800E0238-800E02D0 .text mode_sink__Q27daBomb25Act_cFv */ + void Act_c::mode_sink() { + /* Nonmatching */ + } + + /* 800E02D0-800E03C4 .text mode_proc_call__Q27daBomb25Act_cFv */ + void Act_c::mode_proc_call() { + /* Nonmatching */ + } + + /* 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 */ + } + + /* 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 */ + } + + /* 800E0554-800E0588 .text tensor_wait__Q27daBomb25Act_cFv */ + void Act_c::tensor_wait() { + if(mAcch.ChkGroundHit()) { + tensor_wait_ground(); + } + else { + tensor_wait_drop(); + } + } + + /* 800E0588-800E05D8 .text tensor_wait_drop__Q27daBomb25Act_cFv */ + void Act_c::tensor_wait_drop() { + /* Nonmatching */ + } + + /* 800E05D8-800E0664 .text tensor_wait_ground__Q27daBomb25Act_cFv */ + void Act_c::tensor_wait_ground() { + /* Nonmatching */ + } + + /* 800E0664-800E0684 .text tensor_carry__Q27daBomb25Act_cFv */ + void Act_c::tensor_carry() { + /* Nonmatching */ + } + + /* 800E0684-800E06A4 .text tensor_explode__Q27daBomb25Act_cFv */ + void Act_c::tensor_explode() { + /* Nonmatching */ + } + + /* 800E06A4-800E06C4 .text tensor_sink__Q27daBomb25Act_cFv */ + void Act_c::tensor_sink() { + /* Nonmatching */ + } + + /* 800E06C4-800E07B8 .text tensor_proc_call__Q27daBomb25Act_cFv */ + void Act_c::tensor_proc_call() { + typedef void(Act_c::*procFunc)(); + static procFunc tensor_proc[] = { + &tensor_wait, + &tensor_carry, + &tensor_explode, + &tensor_sink, + }; + + if(!daObj::PrmAbstract(this, PRM_1_W, PRM_1_S)) { + (this->*tensor_proc[field_0x694])(); + vib_proc(); + set_vib_tensor(); + } + } + + bool Act_c::_execute() { + set_wind_vec(); + mode_proc_call(); + + if(field_0x740) { + fopAcM_delete(this); + } + else { + tensor_proc_call(); + anm_play(); + + mAttentionInfo.mPosition.x = current.pos.x; + mAttentionInfo.mPosition.y = current.pos.y + 50.0f; + mAttentionInfo.mPosition.z = current.pos.z; + mEyePos = mAttentionInfo.mPosition; + + set_mtx(); + cc_set(); + } + + return true; + } + + bool Act_c::is_draw() { + bool draw = false; + if(field_0x694 != 2 && !field_0x743 && ! field_0x742) { + draw = true; + } + + return draw; + } + + void Act_c::draw_nut() { + J3DModelData* mdlData = mpModel->getModelData(); + mBck0.entry(mdlData, mBck0.getFrame()); + mBrk0.entry(mdlData, mBrk0.getFrame()); + dComIfGd_setListP1(); + mDoExt_modelUpdateDL(mpModel); + dComIfGd_setList(); + + mBck0.remove(mdlData); + mBrk0.remove(mdlData); + } + + void Act_c::draw_shadow() { + static f32 mult[] = { + 2.08f, + 1.8f, + 1.5f, + 1.3f, + 1.15f, + 1.08f, + 1.04f, + 1.02f, + 1.01f, + 1.0f + }; + + if(fopAcM_GetModel(this) == 0) { + f32 frame = mBck0.getFrame(); + frame = mult[cLib_minMaxLimit(mBck0.getEndFrame() - frame, 0, 9)] * 25.0f; + + dComIfGd_setSimpleShadow2(¤t.pos, mAcch.GetGroundH(), frame, mAcch.m_gnd, 0, 1.0f, dDlst_shadowControl_c::getSimpleTex()); + } + } + + /* 800E0A0C-800E0A80 .text _draw__Q27daBomb25Act_cFv */ + bool Act_c::_draw() { + if(is_draw()) { + g_env_light.settingTevStruct(TEV_TYPE_ACTOR, ¤t.pos, &mTevStr); + g_env_light.setLightTevColorType(mpModel, &mTevStr); + draw_nut(); + draw_shadow(); + } + + return true; + } + + namespace { + int Mthd_Create(void* i_this) { + return static_cast(i_this)->_create(); + } + + BOOL Mthd_Delete(void* i_this) { + return static_cast(i_this)->_delete(); + } + + BOOL Mthd_Execute(void* i_this) { + return static_cast(i_this)->_execute(); + } + + BOOL Mthd_Draw(void* i_this) { + return static_cast(i_this)->_draw(); + } + + bool Mthd_IsDelete(void*) { + return true; + } + + actor_method_class Mthd_Table = { + (process_method_func)Mthd_Create, + (process_method_func)Mthd_Delete, + (process_method_func)Mthd_Execute, + (process_method_func)Mthd_IsDelete, + (process_method_func)Mthd_Draw, + }; + } +} + +extern actor_process_profile_definition g_profile_Bomb2 = { + fpcLy_CURRENT_e, + 7, + fpcPi_CURRENT_e, + PROC_Bomb2, + &g_fpcLf_Method.mBase, + sizeof(daBomb2::Act_c), + 0, + 0, + &g_fopAc_Method.base, + 0x0115, + &daBomb2::Mthd_Table, + 0x00040100, + fopAc_ACTOR_e, + fopAc_CULLBOX_CUSTOM_e, }; - -/* 800E0B14-800E0B80 .text __dt__Q27daBomb214FuseSparksCB_cFv */ -daBomb2::FuseSparksCB_c::~FuseSparksCB_c() { - /* Nonmatching */ -} - -/* 800E0B80-800E0BEC .text __dt__Q27daBomb213FuseSmokeCB_cFv */ -daBomb2::FuseSmokeCB_c::~FuseSmokeCB_c() { - /* Nonmatching */ -} diff --git a/src/d/actor/d_a_bomb3.inc b/src/d/actor/d_a_bomb3.inc new file mode 100644 index 000000000..989c264aa --- /dev/null +++ b/src/d/actor/d_a_bomb3.inc @@ -0,0 +1,43 @@ +// Not sure what originally went in here but createHeap needs it for assert filenames + +bool daBomb_c::createHeap() { + bool ret; + if(mType == 1) { + J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(m_attrType[mType].resName, 0xC); + JUT_ASSERT(0x9A5, modelData != 0); + mpModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000022); + + J3DAnmTransform* bck0_data = (J3DAnmTransform*)dComIfG_getObjectRes(m_attrType[mType].resName, 0x8); + JUT_ASSERT(0x9AE, bck0_data != 0); + int temp = mBck0.init(modelData, bck0_data, true, 0, 1.0f, 0, -1, false); + + J3DAnmTransform* bck1_data = (J3DAnmTransform*)dComIfG_getObjectRes(m_attrType[mType].resName, 0x7); + JUT_ASSERT(0x9B4, bck1_data != 0); + int temp2 = mBck1.init(modelData, bck1_data, true, 0, 1.0f, 0, -1, false); + + J3DAnmTevRegKey* brk0_data = (J3DAnmTevRegKey*)dComIfG_getObjectRes(m_attrType[mType].resName, 0x11); + JUT_ASSERT(0x9BB, brk0_data != 0); + int temp3 = mBrk0.init(modelData, brk0_data, true, 0, 1.0f, 0, -1, false, 0); + + J3DAnmTevRegKey* brk1_data = (J3DAnmTevRegKey*)dComIfG_getObjectRes(m_attrType[mType].resName, 0x10); + JUT_ASSERT(0x9C1, brk1_data != 0); + int temp4 = mBrk1.init(modelData, brk1_data, true, 0, 1.0f, 0, -1, false, 0); + + return mpModel && temp && temp2 && temp3 && temp4; + } + else { + J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes(m_attrType[mType].resName, 0x3C); + JUT_ASSERT(0x9CE, modelData != 0); + mpModel = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000002); + + if(!mpModel) { + return false; + } + else { + J3DAnmTransform* bck0_data = (J3DAnmTransform*)dComIfG_getObjectRes(m_attrType[mType].resName, 0xB); + int temp = mBck0.init(modelData, bck0_data, false, 2, 1.0f, 0, -1, false); + + return temp != 0; + } + } +} diff --git a/src/d/d_a_bomb_static.cpp b/src/d/d_a_bomb_static.cpp index 716453dc2..d24b93f9e 100644 --- a/src/d/d_a_bomb_static.cpp +++ b/src/d/d_a_bomb_static.cpp @@ -5,134 +5,160 @@ #include "d/actor/d_a_bomb.h" #include "d/actor/d_a_bomb2.h" -#include "dolphin/types.h" +#include "JSystem/JUtility/JUTAssert.h" + +#define L_daBomb_Version 1 -/* 80067FA0-80067FD0 .text getBombRestTime__8daBomb_cFv */ s16 daBomb_c::getBombRestTime() { - /* Nonmatching */ + _prm_chk_version(); + + return mRestTime; } -/* 80067FD0-80068000 .text getBombCheck_Flag__8daBomb_cFv */ s16 daBomb_c::getBombCheck_Flag() { - /* Nonmatching */ + _prm_chk_version(); + + return field_0x6F1; } -/* 80068000-80068034 .text setBombCheck_Flag__8daBomb_cFv */ void daBomb_c::setBombCheck_Flag() { - /* Nonmatching */ + _prm_chk_version(); + + field_0x6F1 = true; } -/* 80068034-80068068 .text setBombFire_ON__8daBomb_cFv */ void daBomb_c::setBombFire_ON() { - /* Nonmatching */ + _prm_chk_version(); + + field_0x6F2 = true; } -/* 80068068-800680CC .text setBombNoHit__8daBomb_cFv */ void daBomb_c::setBombNoHit() { - /* Nonmatching */ + _prm_chk_version(); + + mSph.GetObjTg().OffSPrmBit(cCcD_ObjCommonBase::CO_SPRM_SET); + mSph.GetObjCo().OffSPrmBit(cCcD_ObjCommonBase::CO_SPRM_SET); + mSph.GetObjAt().OffSPrmBit(cCcD_ObjCommonBase::CO_SPRM_SET); + mSph.GetObjAt().OffSPrmBit(cCcD_ObjCommonBase::CO_SPRM_SET); + + field_0x6F3 = true; } -/* 800680CC-80068104 .text setBombOffCoSet__8daBomb_cFv */ void daBomb_c::setBombOffCoSet() { - /* Nonmatching */ + _prm_chk_version(); + + mSph.GetObjCo().OffSPrmBit(cCcD_ObjCommonBase::CO_SPRM_SET); } -/* 80068104-8006813C .text setBombOnCoSet__8daBomb_cFv */ void daBomb_c::setBombOnCoSet() { - /* Nonmatching */ + _prm_chk_version(); + + mSph.GetObjCo().OnSPrmBit(cCcD_ObjCommonBase::CO_SPRM_SET); } -/* 8006813C-800681CC .text setBombNoEff__8daBomb_cFv */ void daBomb_c::setBombNoEff() { - /* Nonmatching */ + _prm_chk_version(); + + if(mSmoke.mpEmitter) { + mSmoke.mpEmitter->mpEmitterCallBack = 0; + mSmoke.mpEmitter->becomeInvalidEmitter(); + } + mSmoke.mpEmitter = 0; + + if(mSparks.mpEmitter) { + mSparks.mpEmitter->mpEmitterCallBack = 0; + mSparks.mpEmitter->becomeInvalidEmitter(); + } + mSparks.mpEmitter = 0; } -/* 800681CC-80068208 .text setBombRestTime__8daBomb_cFs */ -void daBomb_c::setBombRestTime(short) { - /* Nonmatching */ +void daBomb_c::setBombRestTime(s16 time) { + _prm_chk_version(); + + mRestTime = time; } -/* 80068208-80068244 .text setNoGravityTime__8daBomb_cFs */ -void daBomb_c::setNoGravityTime(short) { - /* Nonmatching */ +void daBomb_c::setNoGravityTime(s16 time) { + _prm_chk_version(); + + mNoGravityTime = time; } -/* 80068244-80068274 .text prm_make__8daBomb_cFQ28daBomb_c7State_ebb */ -void daBomb_c::prm_make(daBomb_c::State_e, bool, bool) { - /* Nonmatching */ +int daBomb_c::prm_make(daBomb_c::State_e state, bool param_1, bool param_2) { + return (((param_2 ? 1 : 0) << 17) | (state | ((param_1 ? 1 : 0) << 16))) | 0x80000000; } -/* 80068274-800682C0 .text chk_state__8daBomb_cCFQ28daBomb_c7State_e */ -void daBomb_c::chk_state(daBomb_c::State_e) const { - /* Nonmatching */ +bool daBomb_c::chk_state(daBomb_c::State_e state) const { + _prm_chk_version(); + + return state == prm_get_state(); } -/* 800682C0-800682F0 .text change_state__8daBomb_cFQ28daBomb_c7State_e */ -void daBomb_c::change_state(daBomb_c::State_e) { - /* Nonmatching */ +void daBomb_c::change_state(daBomb_c::State_e new_state) { + mBase.mParameters = (mBase.mParameters & ~(((1 << PRM_STATE_W) - 1) << PRM_STATE_S)) | (new_state << PRM_STATE_S); // & 0xFF000000 + + _prm_chk_version(); } -/* 800682F0-8006832C .text prm_get_state__8daBomb_cCFv */ -void daBomb_c::prm_get_state() const { - /* Nonmatching */ +int daBomb_c::prm_get_state() const { + _prm_chk_version(); + + return daObj::PrmAbstract(this, PRM_STATE_W, PRM_STATE_S); } -/* 8006832C-80068340 .text get_explode_instant__8daBomb_cCFv */ -void daBomb_c::get_explode_instant() const { - /* Nonmatching */ +bool daBomb_c::get_explode_instant() const { + return field_0x784 == true; } -/* 80068340-80068388 .text prm_get_cheapEff__8daBomb_cCFv */ -void daBomb_c::prm_get_cheapEff() const { - /* Nonmatching */ +bool daBomb_c::prm_get_cheapEff() const { + _prm_chk_version(); + + return daObj::PrmAbstract(this, PRM_CHEAP_EFF_W, PRM_CHEAP_EFF_S); } -/* 80068388-800683D0 .text prm_get_angXZero__8daBomb_cCFv */ -void daBomb_c::prm_get_angXZero() const { - /* Nonmatching */ +bool daBomb_c::prm_get_angXZero() const { + _prm_chk_version(); + + return daObj::PrmAbstract(this, PRM_ANGXZERO_W, PRM_ANGXZERO_S); } -/* 800683D0-800683F8 .text prm_get_version__8daBomb_cCFv */ -void daBomb_c::prm_get_version() const { - /* Nonmatching */ +int daBomb_c::prm_get_version() const { + return daObj::PrmAbstract(this, PRM_VERSION_W, PRM_VERSION_S); } -/* 800683F8-80068450 .text _prm_chk_version__8daBomb_cCFv */ void daBomb_c::_prm_chk_version() const { - /* Nonmatching */ + int ver = prm_get_version(); + JUT_ASSERT(0xCE, ver == L_daBomb_Version); } -/* 80068450-80068488 .text remove_fuse_effect__Q27daBomb25Act_cFv */ void daBomb2::Act_c::remove_fuse_effect() { - /* Nonmatching */ + mSmoke.deleteCallBack(); + mSparks.deleteCallBack(); } -/* 80068488-80068490 .text set_time__Q27daBomb25Act_cFi */ -void daBomb2::Act_c::set_time(int) { - /* Nonmatching */ +void daBomb2::Act_c::set_time(int time) { + field_0x738 = time; } -/* 80068490-80068498 .text get_time__Q27daBomb25Act_cCFv */ -s32 daBomb2::Act_c::get_time() const { - /* Nonmatching */ +int daBomb2::Act_c::get_time() const { + return field_0x738; } -/* 80068498-800684A0 .text chk_eat__Q27daBomb25Act_cCFv */ bool daBomb2::Act_c::chk_eat() const { - /* Nonmatching */ + return field_0x745; } -/* 800684A0-800684AC .text set_eat__Q27daBomb25Act_cFv */ void daBomb2::Act_c::set_eat() { - /* Nonmatching */ + field_0x745 = true; } -/* 800684AC-800684E0 .text set_no_hit__Q27daBomb25Act_cFv */ void daBomb2::Act_c::set_no_hit() { - /* Nonmatching */ + mSph.GetObjTg().OffSPrmBit(cCcD_ObjCommonBase::CO_SPRM_SET); + mSph.GetObjCo().OffSPrmBit(cCcD_ObjCommonBase::CO_SPRM_SET); + mSph.GetObjAt().OffSPrmBit(cCcD_ObjCommonBase::CO_SPRM_SET); + mSph.GetObjAt().OffSPrmBit(cCcD_ObjCommonBase::CO_SPRM_SET); } -/* 800684E0-800684F4 .text chk_explode__Q27daBomb25Act_cFv */ -void daBomb2::Act_c::chk_explode() { - /* Nonmatching */ +bool daBomb2::Act_c::chk_explode() { + return field_0x694 == 2; } 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 2/2] 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 */ }