#ifndef ACT3AMMO_H
#define ACT3AMMO_H

#include "legopathactor.h"
#include "mxgeometry/mxgeometry3d.h"

class Act3;

// VTABLE: LEGO1 0x100d8460
// SIZE 0x1a0
class Act3Ammo : public LegoPathActor {
public:
	enum {
		c_pizza = 0x01,
		c_donut = 0x02,
		c_valid = 0x04,
		c_bit4 = 0x08,
		c_bit5 = 0x10
	};

	Act3Ammo();
	~Act3Ammo() override;

	void Destroy(MxBool p_fromDestructor) override; // vtable+0x1c
	void Animate(float p_time) override;            // vtable+0x70

	// FUNCTION: BETA10 0x10017750
	MxU32 IsValid() { return m_ammoFlag & c_valid; }

	// FUNCTION: BETA10 0x100177b0
	Mx3DPointFloat* GetUnknown0x160() { return m_eq; }

	// FUNCTION: BETA10 0x100177e0
	MxFloat* GetUnknown0x19c() { return &m_unk0x19c; }

	// FUNCTION: BETA10 0x1001fbd0
	void SetValid(MxBool p_valid)
	{
		if (p_valid) {
			m_ammoFlag |= c_valid;
		}
		else {
			m_ammoFlag &= ~c_valid;
		}
	}

	// FUNCTION: BETA10 0x1001fc80
	MxU32 IsPizza() { return m_ammoFlag & c_pizza; }

	// FUNCTION: BETA10 0x10021d60
	MxU32 IsDonut() { return m_ammoFlag & c_donut; }

	// FUNCTION: BETA10 0x1001fcb0
	void SetBit4(MxBool p_bit4)
	{
		if (p_bit4) {
			m_ammoFlag |= c_bit4;
		}
		else {
			m_ammoFlag &= ~c_bit4;
		}
	}

	// FUNCTION: BETA10 0x10021d90
	MxU32 IsBit4() { return m_ammoFlag & c_bit4; }

	void SetBit5(MxBool p_bit5)
	{
		if (p_bit5) {
			m_ammoFlag |= c_bit5;
		}
		else {
			m_ammoFlag &= ~c_bit5;
		}
	}

	MxU32 IsBit5() { return m_ammoFlag & c_bit5; }

	MxFloat GetUnknown0x158() { return m_unk0x158; }

	void SetUnknown0x158(MxFloat p_unk0x158) { m_unk0x158 = p_unk0x158; }

	MxResult Remove();
	MxResult Create(Act3* p_world, MxU32 p_isPizza, MxS32 p_index);
	MxResult FUN_10053b40(Vector3& p_srcLoc, Vector3& p_srcDir, Vector3& p_srcUp);
	MxResult FUN_10053cb0(LegoPathController* p_p, LegoPathBoundary* p_boundary, MxFloat p_unk0x19c);
	MxResult FUN_10053d30(LegoPathController* p_p, MxFloat p_unk0x19c);

	// SYNTHETIC: LEGO1 0x10053880
	// Act3Ammo::`scalar deleting destructor'

private:
	MxResult FUN_10053db0(float p_param1, const Matrix4& p_param2);

	static Mx3DPointFloat g_unk0x10104f08;

	MxU16 m_ammoFlag;       // 0x154
	MxFloat m_unk0x158;     // 0x158
	Act3* m_world;          // 0x15c
	Mx3DPointFloat m_eq[3]; // 0x160
	MxFloat m_unk0x19c;     // 0x19c
};

#endif // ACT3AMMO_H