mirror of
https://github.com/zeldaret/ss
synced 2026-06-01 01:39:17 -04:00
133 lines
3.8 KiB
C++
133 lines
3.8 KiB
C++
#ifndef D_A_OBJ_ARROW_H
|
|
#define D_A_OBJ_ARROW_H
|
|
|
|
#include "d/a/obj/d_a_obj_base.h"
|
|
#include "d/col/c/c_bg_s_poly_info.h"
|
|
#include "d/col/c/c_cc_d.h"
|
|
#include "d/col/cc/d_cc_d.h"
|
|
#include "m/m3d/m_smdl.h"
|
|
#include "m/m_vec.h"
|
|
#include "nw4r/g3d/res/g3d_resfile.h"
|
|
#include "s/s_State.hpp"
|
|
#include "toBeSorted/d_emitter.h"
|
|
|
|
class dAcArrow_c : public dAcObjBase_c {
|
|
public:
|
|
dAcArrow_c() : mPolyInfo(), mStateMgr(*this), mEffects(this) {}
|
|
virtual ~dAcArrow_c();
|
|
|
|
virtual bool createHeap() override;
|
|
virtual int create() override;
|
|
virtual int actorExecute() override;
|
|
virtual int draw() override;
|
|
|
|
STATE_FUNC_DECLARE(dAcArrow_c, Wait);
|
|
STATE_FUNC_DECLARE(dAcArrow_c, Move);
|
|
STATE_FUNC_DECLARE(dAcArrow_c, ActorStop);
|
|
STATE_FUNC_DECLARE(dAcArrow_c, BgStop);
|
|
STATE_FUNC_DECLARE(dAcArrow_c, Bound);
|
|
|
|
void hitCallback(cCcD_Obj *i_objInfA, dAcObjBase_c *i_actorB, cCcD_Obj *i_objInfB);
|
|
|
|
private:
|
|
static cCcD_SrcGObj sCcSrcInf;
|
|
static dCcD_SrcCps sCc1;
|
|
static const dCcD_SrcSph sCc2;
|
|
|
|
static const u8 sDamageArrMaybe[];
|
|
static u16 sCounter;
|
|
|
|
bool checkWaterHit(const mVec3_c &v1, mVec3_c &v2, bool noEffect);
|
|
void fn_8025DED0(f32 f);
|
|
void fn_8025E160();
|
|
void updateRoomId();
|
|
s16 fn_8025E640();
|
|
void fn_8025E720(dAcObjBase_c *obj, const mVec3_c &v);
|
|
void updateMtx();
|
|
void setInitialPosition();
|
|
dAcObjBase_c *fn_8025E960();
|
|
void initPickupCc();
|
|
bool checkPickup();
|
|
void onSlingshotHit(const mVec3_c &v, bool);
|
|
void fn_802600D0(bool);
|
|
void fn_802601C0();
|
|
bool fn_80260250(dAcObjBase_c *o1, dAcObjBase_c *o2);
|
|
|
|
enum ArrowFlag_e {
|
|
ARROW_0x1 = 1 << 0,
|
|
ARROW_SHOULD_DESPAWN = 1 << 1,
|
|
ARROW_INITIAL_SPAWN = 1 << 2,
|
|
ARROW_0x8 = 1 << 3,
|
|
ARROW_OLD = 1 << 4,
|
|
ARROW_WATER_HIT = 1 << 5,
|
|
ARROW_0x40 = 1 << 6,
|
|
ARROW_FULLY_CHARGED = 1 << 7,
|
|
ARROW_0x100 = 1 << 8,
|
|
ARROW_0x200 = 1 << 9,
|
|
ARROW_0x400 = 1 << 10,
|
|
ARROW_0x800 = 1 << 11,
|
|
ARROW_0x1000 = 1 << 12,
|
|
ARROW_0x2000 = 1 << 13,
|
|
ARROW_0x4000 = 1 << 14,
|
|
ARROW_0x8000 = 1 << 15,
|
|
ARROW_0x10000 = 1 << 16,
|
|
};
|
|
|
|
void setArrowFlag(u32 f) {
|
|
mArrowFlags |= f;
|
|
}
|
|
|
|
void unsetArrowFlag(u32 f) {
|
|
mArrowFlags &= ~f;
|
|
}
|
|
|
|
bool checkArrowFlag (u32 f) const {
|
|
return (mArrowFlags & f) != 0;
|
|
}
|
|
|
|
enum ArrowType_e {
|
|
TYPE_MSK_SLINGSHOT = 0x10,
|
|
};
|
|
|
|
bool isSlingshotProjectile() const {
|
|
return (mArrowType & TYPE_MSK_SLINGSHOT) != 0;
|
|
}
|
|
|
|
/* 0x330 */ nw4r::g3d::ResFile mResFile;
|
|
/* 0x334 */ m3d::smdl_c mModel;
|
|
/* 0x350 */ dAcRef_c<dAcObjBase_c> mRef1;
|
|
/* 0x35C */ dCcD_Cps mCcCps;
|
|
/* 0x4CC */ dCcD_Sph mCcSph;
|
|
/* 0x61C */ cBgS_PolyInfo mPolyInfo;
|
|
/* 0x648 */ dEmitter_c mEffects;
|
|
/* 0x67C */ u32 mArrowFlags;
|
|
/* 0x680 */ u8 mArrowType;
|
|
/* 0x681 */ u8 mHiddenTimer;
|
|
/* 0x682 */ u8 mDespawnTimer;
|
|
/* 0x683 */ u8 field_0x683;
|
|
/* 0x684 */ s16 mCounterIdx;
|
|
/* 0x686 */ u8 field_0x686[0x688 - 0x686];
|
|
/* 0x688 */ s16 field_0x688;
|
|
/* 0x68A */ s16 field_0x68A;
|
|
/* 0x68C */ u16 mEffectId;
|
|
/* 0x68E */ mAng mEffectRotationZ;
|
|
/* 0x690 */ mAng field_0x690;
|
|
/* 0x692 */ mAng3_c mEffectRotation;
|
|
/* 0x698 */ s32 mBoundJntIdx;
|
|
/* 0x69C */ f32 field_0x69C;
|
|
/* 0x6A0 */ f32 field_0x6A0;
|
|
/* 0x6A4 */ f32 field_0x6A4;
|
|
/* 0x6A8 */ f32 field_0x6A8;
|
|
/* 0x6AC */ f32 field_0x6AC;
|
|
/* 0x6B0 */ mVec3_c field_0x6B0;
|
|
/* 0x6BC */ mVec3_c field_0x6BC;
|
|
/* 0x6C8 */ mVec3_c field_0x6C8;
|
|
/* 0x6D4 */ mVec3_c field_0x6D4;
|
|
/* 0x6E0 */ mVec3_c mEffectTranslation;
|
|
/* 0x6EC */ mVec3_c field_0x6EC;
|
|
/* 0x6F8 */ dAcRef_c<dAcObjBase_c> mRef2;
|
|
/* 0x704 */ STATE_MGR_DECLARE(dAcArrow_c);
|
|
};
|
|
|
|
#endif
|