Files

165 lines
4.2 KiB
C++

#ifndef D_WOOD_H
#define D_WOOD_H
#include "JSystem/J3DGraphBase/J3DPacket.h"
#include "SSystem/SComponent/c_xyz.h"
#include "dolphin/mtx/mtx.h"
#include "d/d_kankyo.h"
class dCcMassS_HitInf;
class cCcD_Obj;
class fopAc_ac_c;
namespace dWood {
enum AnmID_e {
AnmID_Norm0,
AnmID_Norm1,
AnmID_Norm2,
AnmID_Norm3,
AnmID_Norm4,
AnmID_Norm5,
AnmID_Norm6,
AnmID_Norm7,
AnmID_Norm_Max = 8,
AnmID_Norm_Invalid = -1
};
class Anm_c;
class Packet_c;
class Unit_c {
public:
Unit_c();
enum State_e {
STATE_ACTIVE = 1 << 0,
STATE_FRUSTUM_CULLED = 1 << 1,
STATE_CUT = 1 << 2,
};
bool set_ground();
void set_mtx(Anm_c*);
void clear();
void cc_hit_before_cut(Packet_c*);
void cc_hit_after_cut(Packet_c*);
void proc(Packet_c*);
/* 0x000 */ cXyz mPos;
/* 0x00C */ s16 mAnimCooldown; // In frames. Animations will not change unless this is 0.
/* 0x010 */ State_e mFlags;
/* 0x014 */ AnmID_e mAnmIdx;
/* 0x018 */ Mtx mModelViewMtx;
/* 0x048 */ Mtx mTrunkModelViewMtx;
/* 0x078 */ Mtx mShadowModelMtx;
/* 0x0A8 */ Mtx mShadowModelViewMtx;
/* 0x0D8 */ Unit_c* mpNext;
/* 0x0DC */ dKy_tevstr_c mTevStr;
}; // Size: 0x18C
STATIC_ASSERT(sizeof(Unit_c) == 0x18C);
class Anm_c {
public:
enum Mode_e {
Mode_Cut = 0, // Chopping down
Mode_PushInto = 1, // Attacked or collided with, but not chopped
Mode_PushBack = 2, // Second half of PushInto, returning to normal
Mode_Fan = 3, // When hit with fan (does nothing)
Mode_Norm = 4, // Idle animation
Mode_ToNorm = 5, // Transition to idle from any other animation
Mode_Max
};
Anm_c();
void play(Packet_c*);
// Copies the "angle" and "amplitude" from another animation
void copy_angamp(const Anm_c*);
// Animations are assigned from the Packet to specific Wood instances (Bushes) when a new animation starts
// Each animation mode has an mode_*_init() function which is called when the animation is started
// The mode_*() function is called to update the animation each frame, until finished
// Their are 8 pre-allocated "normal" animations. When not animating, each unit is assigned one of the 8.
void mode_cut_init(const Anm_c*, s16);
void mode_cut(Packet_c*);
void mode_push_into_init(const Anm_c*, s16);
void mode_push_into(Packet_c*);
void mode_push_back_init();
void mode_push_back(Packet_c*);
void mode_fan(Packet_c*);
void mode_norm_init();
void mode_norm(Packet_c*);
void mode_norm_set_wind(f32, s16);
void mode_to_norm_init(AnmID_e);
void mode_to_norm(Packet_c*);
inline AnmID_e mode_to_norm_get_AnmID() { return (AnmID_e)mNormAnimIdx; }
inline void mode_to_norm_set_AnmID(AnmID_e anmID) { mNormAnimIdx = anmID; }
Mode_e get_mode() { return mMode; }
/* 0x00 */ Mtx mModelMtx;
/* 0x30 */ Mtx mTrunkModelMtx;
/* 0x60 */ Mode_e mMode;
/* 0x64 */ s16 mCountdown;
/* 0x66 */ s16 mForceDir; // The direction from the wind or actor who instigated this animation
/* 0x68 */ f32 mWindPow; // 0.0 - 1.0
/* 0x6c */ f32 mPosOffsetY;
/* 0x70 */ f32 mPosOffsetZ;
/* 0x74 */ f32 mVelY;
/* 0x78 */ s16 mPhaseY[2];
/* 0x7c */ s16 mPhaseX[2];
/* 0x80 */ s16 mAmpY[2];
/* 0x84 */ s16 mAmpX[2];
/* 0x88 */ s16 mNormAnimIdx;
/* 0x8A */ u8 mAlphaScale;
static s32 M_init_num;
};
STATIC_ASSERT(sizeof(Anm_c) == 0x8C);
class Room_c {
public:
Room_c();
void entry_unit(Unit_c*);
void delete_all_unit();
/* 0x0 */ Unit_c* mpUnit;
};
class Packet_c : public J3DPacket {
public:
Packet_c();
void delete_room(int room_no);
s32 put_unit(const cXyz& pos, int room_no);
void calc_cc();
void calc();
void update();
s32 search_empty_UnitID() const;
AnmID_e search_anm(Anm_c::Mode_e mode);
inline Anm_c* get_anm_p(AnmID_e idx) { return &mAnm[idx]; }
virtual void draw();
virtual ~Packet_c();
/* 0x00010 */ Unit_c mUnit[200];
/* 0x13570 */ Anm_c mAnm[72];
/* 0x15CD0 */ Room_c mRoom[64];
};
STATIC_ASSERT(sizeof(Packet_c) == 0x15DD0);
}; // namespace dWood
#endif /* D_WOOD_H */