#ifndef _CSCRIPTCOVERPOINT
#define _CSCRIPTCOVERPOINT

#include "MetroidPrime/CActor.hpp"

#include "Kyoto/Animation/CharacterCommon.hpp"

class CScriptCoverPoint : public CActor {
public:
  CScriptCoverPoint(TUniqueId uid, const rstl::string& name, const CEntityInfo& info,
                    const CTransform4f& xf, bool active, uint flags, bool crouch, float horizontalAngle,
                    float verticalAngle, float coverTime);

  void Accept(IVisitor& visitor) override;
  void Think(float, CStateManager&) override;
  void AddToRenderer(const CFrustumPlanes&, const CStateManager&) const override;
  void Render(const CStateManager&) const override;
  void AcceptScriptMsg(EScriptObjectMessage, TUniqueId, CStateManager&) override;
  rstl::optional_object< CAABox > GetTouchBounds() const override;

  bool ShouldCrouch() const;
  bool ShouldStay() const;
  bool ShouldWallHang() const;
  bool ShouldLandHere() const;
  void SetInUse(bool inUse);
  bool GetInUse(TUniqueId uid) const;
  const bool Blown(const CVector3f& pos) const;
  float GetSinSqVerticalAngle() const;
  float GetCosHorizontalAngle() const;
  pas::ECoverDirection GetAttackDirection() const;
  void Reserve(TUniqueId id) { xfa_occupant = id; }

private:
  // bool xe8_26_landHere : 1;
  // bool xe8_27_wallHang : 1;
  // bool xe8_28_stay : 1;
  // bool xe8_29_ : 1;
  // bool xe8_30_attackDirection : 1;
  uint xe8_flags;
  float xec_cosHorizontalAngle;
  float xf0_sinVerticalAngle;
  float xf4_coverTime;
  bool xf8_24_crouch : 1;
  bool xf8_25_inUse : 1;
  TUniqueId xfa_occupant;
  TUniqueId xfc_retreating;
  rstl::optional_object< CAABox > x100_touchBounds;
  float x11c_timeLeft;
};

#endif // _CSCRIPTCOVERPOINT
