#ifndef _CRIPPER
#define _CRIPPER

#include "MetroidPrime/CGrappleParameters.hpp"
#include "MetroidPrime/Enemies/CPatterned.hpp"
#include "MetroidPrime/TCastTo.hpp"

class CRipper : public CPatterned {
  static const uint skNumProperties;

public:
  static uint GetNumProperties() { return skNumProperties; }
  CRipper(TUniqueId uid, const rstl::string& name, EFlavorType type, const CEntityInfo& info,
          const CTransform4f& transform, const CModelData& modelData,
          const CPatternedInfo& patternedInfo, const CActorParameters& actorParams,
          const CGrappleParameters& grappleParams);
  ~CRipper();
  void Accept(IVisitor& visitor) override;
  void Think(float dt, CStateManager& mgr) override;
  void AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId sender, CStateManager& mgr) override;
  EWeaponCollisionResponseTypes GetCollisionResponseType(const CVector3f& position, const CVector3f& direction, const CWeaponMode& mode, int projectileAtrib) const override;
  void KnockBack(const CVector3f& direction, CStateManager& mgr, const CDamageInfo& damage, EKnockBackType knockBack, bool inDeferred, float mag) override;
  bool PathOver(CStateManager& mgr, float arg) override;
  void Patrol(CStateManager& mgr, EStateMsg msg, float arg) override;

private:
  void ProcessGrapplePoint(CStateManager& mgr);
  void AddGrapplePoint(CStateManager& mgr);
  void RemoveGrapplePoint(CStateManager& mgr);
  void AddPlatform(CStateManager& mgr);
  void RemovePlatform(CStateManager& mgr);
  CGrappleParameters mGrappleParams;
  TUniqueId mGrapplePoint;
  TUniqueId mPlatform;
  bool mMuted : 1;
};

#endif // _CRIPPER
