Files
tww/include/d/actor/d_a_obj_movebox.h
2026-05-09 18:42:01 -04:00

288 lines
9.9 KiB
C++

#ifndef D_A_OBJ_MOVEBOX_H
#define D_A_OBJ_MOVEBOX_H
#include "d/d_bg_s_movebg_actor.h"
#include "d/d_bg_s_gnd_chk.h"
#include "d/d_bg_s_wtr_chk.h"
#include "d/d_bg_s_lin_chk.h"
#include "d/d_bg_w.h"
#include "d/d_particle.h"
struct dPath;
namespace daObjMovebox {
class Act_c;
struct Attr_c {
/* 0x00 */ s16 m00;
/* 0x02 */ s16 m02;
/* 0x04 */ s16 m04;
/* 0x06 */ s16 m06;
/* 0x08 */ s16 m08;
/* 0x0A */ s16 m0A;
/* 0x0C */ f32 m0C;
/* 0x10 */ f32 m10;
/* 0x14 */ f32 m14;
/* 0x18 */ f32 m18;
/* 0x1C */ f32 m1C;
/* 0x20 */ f32 m20;
/* 0x24 */ f32 mLandSmokeScale;
/* 0x28 */ f32 m28;
/* 0x2C */ f32 m2C;
/* 0x30 */ f32 m30;
/* 0x34 */ f32 m34;
/* 0x38 */ s16 m38;
/* 0x3C */ f32 m3C;
/* 0x40 */ f32 m40;
/* 0x44 */ f32 m44;
/* 0x48 */ f32 m48;
/* 0x4C */ f32 m4C;
/* 0x50 */ f32 m50;
/* 0x54 */ f32 m54;
/* 0x58 */ int mModelFileIndex;
/* 0x5C */ int mDZBFileIndex;
/* 0x60 */ int mDZBHeapSize;
/* 0x64 */ f32 mScaleY;
/* 0x68 */ f32 m68;
/* 0x6C */ f32 m6C;
/* 0x70 */ f32 mScaleXZ;
/* 0x74 */ f32 m74;
/* 0x78 */ u32 mMoveSE;
/* 0x7C */ u32 mCantMoveSE;
/* 0x80 */ u32 mNormalFallSE;
/* 0x84 */ u32 mWaterFallSE;
/* 0x88 */ u32 mMagmaFallSE;
/* 0x8C */ s16 mCullMinX;
/* 0x8E */ s16 mCullMinY;
/* 0x90 */ s16 mCullMinZ;
/* 0x92 */ s16 mCullMaxX;
/* 0x94 */ s16 mCullMaxY;
/* 0x96 */ s16 mCullMaxZ;
/* 0x98 */ bool mbUseBGTevType;
/* 0x99 */ bool mbCastsShadow;
/* 0x9A */ bool m9A;
}; // Size: 0x9C
struct BgcSrc_c {
/* 0x00 */ f32 m00; // z
/* 0x04 */ f32 m04; // x
/* 0x08 */ f32 m08; // z
/* 0x0C */ f32 m0C; // x
};
struct Bgc_c {
public:
enum State_e {
BgcState_ON_GROUND_e = 0x01,
BgcState_JUST_LEFT_GROUND_e = 0x02,
BgcState_JUST_HIT_GROUND_e = 0x04,
BgcState_ABOVE_WATER_e = 0x08,
BgcState_IN_WATER_e = 0x10,
BgcState_JUST_HIT_WATER_e = 0x20,
};
Bgc_c();
~Bgc_c();
void gnd_pos(const Act_c*, const BgcSrc_c*, int, f32);
void wrt_pos(const cXyz&);
void wall_pos(const Act_c*, const BgcSrc_c*, int, s16, f32);
void proc_vertical(Act_c*);
bool chk_wall_pre(const Act_c*, const BgcSrc_c*, int, s16);
bool chk_wall_touch(const Act_c*, const BgcSrc_c*, s16);
bool chk_wall_touch2(const Act_c*, const BgcSrc_c*, int, s16);
public:
/* 0x000 */ f32 mGroundY[23];
/* 0x05C */ int mMaxGroundIdx;
/* 0x060 */ f32 mWaterY;
/* 0x064 */ cXyz mWallPos[23];
/* 0x178 */ int mWallIdx;
/* 0x17C */ f32 mNearestWallDist;
/* 0x180 */ State_e mStateFlags;
static dBgS_ObjGndChk M_gnd_work[23];
static dBgS_WtrChk M_wrt_work;
static dBgS_ObjLinChk M_wall_work[23];
static const BgcSrc_c M_lin5[5];
static const BgcSrc_c M_lin20[23];
}; // Size: 0x184
class EffSmokeCB : public dPa_smokeEcallBack {
public:
EffSmokeCB() {}
virtual ~EffSmokeCB() {}
public:
/* 0x20 */ cXyz field_0x20;
/* 0x2C */ csXyz field_0x2C;
}; // Size: 0x34
class Act_c : public dBgS_MoveBgActor {
public:
enum Type {
TYPE_BREAKABLE_WOODEN_CRATE = 0x0, // Actor names: Kkiba or DKkiba
TYPE_BLACK_BOX = 0x1, // Actor names: osiBLK0 or DBLK0
TYPE_BLACK_BOX_WITH_STATUE = 0x2, // Actor names: osiBLK1 or DBLK1
TYPE_BIG_BLACK_BOX = 0x3, // Actor names: MpwrB
TYPE_WOODEN_CRATE = 0x4, // Actor names: (N/A)
TYPE_GOLDEN_CRATE = 0x5, // Actor names: Hbox2
TYPE_METAL_BOX = 0x6, // Actor names: Hbox1
TYPE_METAL_BOX_WITH_SPRING = 0x7, // Actor names: Hjump1
TYPE_WOODEN_CRATE_2 = 0x8, // Actor names: Hseki2
TYPE_WOODEN_CRATE_3 = 0x9, // Actor names: Hseki7
TYPE_MIRROR = 0xA, // Actor names: Mmrr
TYPE_BLACK_BOX_WITH_MKIE = 0xB, // Actor names: MkieBB
TYPE_MOSSY_BLACK_BOX = 0xC, // Actor names: Ecube
};
enum Mode {
MODE_WAIT = 0x0,
MODE_WALK = 0x1,
MODE_AFLOAT = 0x2,
};
enum Prm_e {
PRM_TYPE_W = 0x04,
PRM_TYPE_S = 0x18,
PRM_SWSAVE_W = 0x08,
PRM_SWSAVE_S = 0x08,
PRM_ITEMNO_W = 0x06,
PRM_ITEMNO_S = 0x00,
PRM_ITEMSAVE_W = 0x07,
PRM_ITEMSAVE_S = 0x10,
PRM_DMY_W = 0x01,
PRM_DMY_S = 0x1E,
PRM_BUOY_W = 0x01,
PRM_BUOY_S = 0x1F,
};
typedef void (Act_c::*ModeFunc)();
inline cPhs_State Mthd_Create();
inline BOOL Mthd_Delete();
int prm_get_type() const { return daObj::PrmAbstract(this, PRM_TYPE_W, PRM_TYPE_S); }
int prm_get_swSave() const { return daObj::PrmAbstract(this, PRM_SWSAVE_W, PRM_SWSAVE_S); }
int prm_get_swSave1() const;
int prmZ_get_swSave2() const { return mType == TYPE_BLACK_BOX_WITH_MKIE ? 0xFF : (u8)(mPrmZ >> 8); }
int prmZ_get_swSave2_MkieB() const { return mType == TYPE_BLACK_BOX_WITH_MKIE ? (u8)(mPrmZ >> 8) : 0xFF; }
int prmZ_get_pathId() const { return mType == TYPE_BLACK_BOX_WITH_MKIE ? 0xFF : (mPrmZ & 0x00FF) >> 0; }
int prmX_get_evId() const { return (mPrmX & 0x00FF) >> 0; }
int prm_get_itemNo() const { return daObj::PrmAbstract(this, PRM_ITEMNO_W, PRM_ITEMNO_S); }
int prm_get_itemSave() const { return daObj::PrmAbstract(this, PRM_ITEMSAVE_W, PRM_ITEMSAVE_S); }
int prm_get_dmy() const { return daObj::PrmAbstract(this, PRM_DMY_W, PRM_DMY_S); }
int prm_get_buoy() const { return daObj::PrmAbstract(this, PRM_BUOY_W, PRM_BUOY_S); }
BOOL is_switch1() const { return fopAcM_isSwitch(const_cast<Act_c*>(this), prm_get_swSave1()); };
BOOL is_switch2() const { return fopAcM_isSwitch(const_cast<Act_c*>(this), prmZ_get_swSave2()); };
void on_switch1() const { fopAcM_onSwitch(const_cast<Act_c*>(this), prm_get_swSave1()); };
void on_switch2() const { fopAcM_onSwitch(const_cast<Act_c*>(this), prmZ_get_swSave2()); };
void off_switch1() const { fopAcM_offSwitch(const_cast<Act_c*>(this), prm_get_swSave1()); };
void off_switch2() const { fopAcM_offSwitch(const_cast<Act_c*>(this), prmZ_get_swSave2()); };
inline void mode_proc_call();
void chk_walk(cXyz*) { /* TODO */ }
void set_rollCrash() {
if (
mType == daObjMovebox::Act_c::TYPE_BREAKABLE_WOODEN_CRATE ||
mType == daObjMovebox::Act_c::TYPE_GOLDEN_CRATE
) {
mbRollCrash = TRUE;
}
}
void prmZ_init();
void prmX_init();
inline const Attr_c* attr() const;
void set_mtx();
void init_mtx();
void path_init();
void path_save();
virtual BOOL CreateHeap();
static void RideCallBack(dBgW*, fopAc_ac_c*, fopAc_ac_c*);
static fopAc_ac_c* PPCallBack(fopAc_ac_c*, fopAc_ac_c*, s16, dBgW::PushPullLabel);
virtual BOOL Create();
void afl_sway();
int check_to_walk();
void clr_moment_cnt();
bool chk_appear() const;
void eff_set_slip_smoke_pos();
void eff_smoke_slip_start();
void eff_smoke_slip_end();
void eff_smoke_slip_remove();
void mode_wait_init();
void mode_wait();
void mode_walk_init();
void mode_walk();
void mode_afl_init();
void mode_afl();
void make_item();
void eff_break();
void sound_break();
void sound_slip();
void sound_limit();
void sound_land();
void vib_land();
void eff_land_smoke();
virtual BOOL Execute(Mtx**);
virtual BOOL Draw();
virtual BOOL Delete();
static const s16 M_dir_base[4];
public:
/* 0x2C8 */ request_of_phase_process_class mPhs;
/* 0x2D0 */ Mtx mMtx;
/* 0x300 */ J3DModel* mpModel;
/* 0x304 */ int mMode;
/* 0x308 */ dCcD_Stts mStts;
/* 0x344 */ dCcD_Cyl mCyl;
/* 0x474 */ Bgc_c mBgc;
/* 0x5F8 */ int mType;
/* 0x5FC */ u16 mPrmZ;
/* 0x5FE */ u16 mPrmX;
/* 0x600 */ dPath* mpPath;
/* 0x604 */ s16 m604;
/* 0x606 */ u8 m606[0x608 - 0x606];
/* 0x608 */ f32 m608;
/* 0x60C */ f32 m60C;
/* 0x610 */ f32 m610;
/* 0x614 */ f32 m614;
/* 0x618 */ f32 m618;
/* 0x61C */ f32 m61C;
/* 0x620 */ f32 m620;
/* 0x624 */ f32 m624;
/* 0x628 */ int m628;
/* 0x62C */ int m62C;
/* 0x630 */ f32 m630;
/* 0x634 */ int m634;
/* 0x638 */ dBgW::PushPullLabel mPPLabel;
/* 0x63C */ s16 mMomentCnt[4];
/* 0x644 */ s16 m644;
/* 0x646 */ s16 m646;
/* 0x648 */ s16 m648;
/* 0x64A */ bool m64A;
/* 0x64B */ s8 mReverb;
/* 0x64C */ bool mbShouldAppear;
/* 0x64D */ bool mbPrmZInitialized;
/* 0x64E */ bool mbPrmXInitialized;
/* 0x64F */ bool m64F;
/* 0x650 */ EffSmokeCB mSmokeCbs[2];
/* 0x6B8 */ fpc_ProcID mChildPID;
/* 0x6BC */ BOOL mbRollCrash;
static const char* const M_arcname[];
static const dCcD_SrcCyl M_cyl_src;
static const Attr_c M_attr[];
};
STATIC_ASSERT(sizeof(Act_c) == 0x6C0);
}
#endif /* D_A_OBJ_MOVEBOX_H */