// Ryzom - MMORPG Framework
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
#ifndef AI_PROFILE_NPC_H
#define AI_PROFILE_NPC_H
#include "profile.h"
#include "ai_bot_npc.h"
#include "ai_grp_npc.h"
#include "ai_generic_fight.h"
extern bool simulateBug(int bugId);
// Forard declarations
class CSpawnGroupNpc;
//////////////////////////////////////////////////////////////////////////////
// Free variables and functions //
//////////////////////////////////////////////////////////////////////////////
extern bool ai_profile_npc_VerboseLog;
//////////////////////////////////////////////////////////////////////////////
// CBotProfileMoveTo //
//////////////////////////////////////////////////////////////////////////////
class CBotProfileMoveTo
: public CAIBaseProfile
, public NLMISC::IDbgPtrData
{
public:
CBotProfileMoveTo(AITYPES::TVerticalPos verticalPos, RYAI_MAP_CRUNCH::CWorldPosition const& dest, CProfileOwner* owner);
/// @name IAIProfile implementation
//@{
virtual void beginProfile();
virtual void endProfile();
virtual void updateProfile(uint ticksSinceLastUpdate);
virtual AITYPES::TProfiles getAIProfileType () const { return AITYPES::BOT_MOVE_TO; }
virtual std::string getOneLineInfoString() const;
//@}
bool destinationReach() const;
CFollowPath::TFollowStatus _Status;
AITYPES::TVerticalPos _VerticalPos;
RYAI_MAP_CRUNCH::CWorldPosition _Dest;
CPathCont _PathCont;
CPathPosition _PathPos;
CAIVector _LastPos;
protected:
NLMISC::CDbgPtr _Bot;
};
//////////////////////////////////////////////////////////////////////////////
// CBotProfileFollowPos //
//////////////////////////////////////////////////////////////////////////////
class CBotProfileFollowPos
: public CAIBaseProfile
, public NLMISC::IDbgPtrData
{
public:
CBotProfileFollowPos(CPathCont* pathCont, CProfileOwner* owner);
CBotProfileFollowPos(CBotProfileFollowPos const& other);
/// @name IAIProfile implementation
//@{
virtual void beginProfile();
virtual void endProfile();
virtual void updateProfile(uint ticksSinceLastUpdate);
virtual AITYPES::TProfiles getAIProfileType() const { return AITYPES::BOT_FOLLOW_POS; }
virtual std::string getOneLineInfoString() const;
//@}
void setMaxSpeeds(float walkSpeed, float runSpeed);
void setStop(bool stop);
CFollowPath::TFollowStatus _Status;
CPathPosition _PathPos;
protected:
NLMISC::CDbgPtr _Bot;
private:
NLMISC::CDbgPtr _PathCont;
// maximum speed to use (for group with different creatures)
float _MaxWalkSpeed;
float _MaxRunSpeed;
// flag to stop temporary stop the movement
bool _Stop;
};
//////////////////////////////////////////////////////////////////////////////
// CBotProfileWanderBase //
//////////////////////////////////////////////////////////////////////////////
class CBotProfileWanderBase
: public CAIBaseProfile
{
public:
CBotProfileWanderBase();
void setTimer(uint32 ticks);
bool testTimer() const;
protected:
CAITimer _Timer;
};
//////////////////////////////////////////////////////////////////////////////
// CBotProfileStandAtPos //
//////////////////////////////////////////////////////////////////////////////
class CBotProfileStandAtPos
: public CBotProfileWanderBase
, public NLMISC::IDbgPtrData
{
public:
CBotProfileStandAtPos(CProfileOwner* owner);
/// @name IAIProfile implementation
//@{
virtual void beginProfile();
virtual void endProfile();
virtual void updateProfile(uint ticksSinceLastUpdate);
virtual AITYPES::TProfiles getAIProfileType() const { return AITYPES::BOT_STAND_AT_POS; }
virtual std::string getOneLineInfoString() const;
//@}
protected:
NLMISC::CDbgPtr _Bot;
};
//////////////////////////////////////////////////////////////////////////////
// CBotProfileForage //
//////////////////////////////////////////////////////////////////////////////
class CBotProfileForage
: public CBotProfileWanderBase
, public NLMISC::IDbgPtrData
{
public:
CBotProfileForage(CProfileOwner* owner);
virtual ~CBotProfileForage();
/// @name IAIProfile implementation
//@{
virtual void beginProfile();
virtual void endProfile();
virtual void updateProfile(uint ticksSinceLastUpdate);
virtual AITYPES::TProfiles getAIProfileType () const { return AITYPES::BOT_FORAGE; }
virtual std::string getOneLineInfoString() const;
//@}
void setOldSheet();
protected:
NLMISC::CDbgPtr _Bot;
CAITimer _ForageTimer;
AISHEETS::ICreatureCPtr _OldSheet;
bool _TemporarySheetUsed;
};
//////////////////////////////////////////////////////////////////////////////
// CActivityProfile //
//////////////////////////////////////////////////////////////////////////////
class CActivityProfile
: public CAIBaseProfile
{
};
//////////////////////////////////////////////////////////////////////////////
// CGrpProfileNormal //
//////////////////////////////////////////////////////////////////////////////
class CGrpProfileNormal
: public CActivityProfile
{
public:
CGrpProfileNormal(CProfileOwner* owner);
/// @name IAIProfile implementation
//@{
virtual void beginProfile();
virtual void endProfile();
virtual void updateProfile(uint ticksSinceLastUpdate);
virtual AITYPES::TProfiles getAIProfileType () const { return AITYPES::ACTIVITY_NORMAL; }
virtual std::string getOneLineInfoString() const;
//@}
bool isGroupFighting() const;
void setGroupFighting(bool groupFighting);
protected:
NLMISC::CDbgPtr _Grp;
bool _GroupFighting;
};
//////////////////////////////////////////////////////////////////////////////
// CSlaveProfile //
//////////////////////////////////////////////////////////////////////////////
// :TODO: Understand following comment, and act accordingly
// every bot add or remove must be done from a spawn/despawn/die event (and not this way!)
class CSlaveProfile
: public CAIBaseProfile
{
public:
CSlaveProfile(CProfileOwner* owner);
/// @name IAIProfile partial implementation
//@{
virtual void beginProfile();
virtual void updateProfile(uint ticksSinceLastUpdate);
//@}
virtual void addBot(CBot* bot) = 0;
virtual void removeBot(CBot* bot) = 0;
protected:
NLMISC::CDbgPtr _Grp;
};
//////////////////////////////////////////////////////////////////////////////
// CMoveProfile //
//////////////////////////////////////////////////////////////////////////////
class CMoveProfile
: public CSlaveProfile
{
public:
CMoveProfile(CProfileOwner* owner) ;
virtual CPathCont* getPathCont(CBot const* bot) = 0;
virtual void resumeBot(CBot const* bot);
protected:
float _MaxRunSpeed;
float _MaxWalkSpeed;
};
//////////////////////////////////////////////////////////////////////////////
// CFightProfile //
//////////////////////////////////////////////////////////////////////////////
class CFightProfile
: public CSlaveProfile
{
public:
CFightProfile(CProfileOwner* owner);
virtual std::vector& npcList() = 0;
virtual bool stillHaveEnnemy() const = 0;
};
//////////////////////////////////////////////////////////////////////////////
// CGrpProfileGoToPoint //
//////////////////////////////////////////////////////////////////////////////
class CGrpProfileGoToPoint
: public CMoveProfile
{
public:
/// @name Constructors, destructor
//@{
CGrpProfileGoToPoint(CProfileOwner* owner, RYAI_MAP_CRUNCH::CWorldPosition const& startPos, RYAI_MAP_CRUNCH::CWorldPosition const& endPos, bool dontSendEvent = false);
virtual ~CGrpProfileGoToPoint();
//@}
enum TShapeType
{
SHAPE_NOTHING,
SHAPE_RECTANGLE,
};
class CBotFollower
{
public:
CBotFollower();
virtual ~CBotFollower();
void setBotAtDest(bool atDest = true);
const bool& isBotAtDest() const;
private:
bool _BotAtDest;
};
/// @name CMoveProfile implementation
//@{
virtual CPathCont* getPathCont(CBot const* bot);
//@}
/// @name CSlaveProfile implementation
//@{
virtual void addBot(CBot* bot);
virtual void removeBot(CBot* bot);
//@}
/// @name IAIProfile implementation
//@{
virtual void beginProfile();
virtual void updateProfile(uint ticksSinceLastUpdate);
virtual void endProfile();
virtual AITYPES::TProfiles getAIProfileType() const { return AITYPES::MOVE_GOTO_POINT; }
virtual std::string getOneLineInfoString() const;
virtual void stateChangeProfile();
virtual void resumeProfile();
//@}
bool profileTerminated() const;
protected:
void setDirection(bool forward);
bool getDirection();
void setCurrentDestination(RYAI_MAP_CRUNCH::CWorldPosition const& dest);
void calcRatios();
void stopNpc(bool stop);
private:
void assignGeometryFromState();
typedef std::map TBotFollowerMap;
TBotFollowerMap _NpcList;
bool _ValidPosInit;
bool _FollowForward;
bool _ProfileTerminated;
bool _MustCalcRatios;
TShapeType _Shape;
RYAI_MAP_CRUNCH::CWorldPosition _StartPos;
RYAI_MAP_CRUNCH::CWorldPosition _EndPos;
/// flag to temporary stop the bots
bool _StopNpc;
// rectangle shape related vars.
float _XSize;
float _YSize;
float _Ratio;
double _Cx, _Cy;
uint32 _NbRange;
uint32 _NbLines;
uint32 _NbBotInNormalShape;
uint32 _Rest;
uint32 _GeomIndex;
CPathCont _PathCont;
CAIVector _GlobalOrient;
AITYPES::TVerticalPos _VerticalPos;
bool _DontSendEvent;
};
//////////////////////////////////////////////////////////////////////////////
// CGrpProfileFollowRoute //
//////////////////////////////////////////////////////////////////////////////
class CGrpProfileFollowRoute
: public CMoveProfile
{
public:
CGrpProfileFollowRoute(CProfileOwner* owner, std::vector const& geometry, AITYPES::TVerticalPos const& verticalPos, bool dontSendEvent = false);
CGrpProfileFollowRoute(CProfileOwner* owner);
virtual ~CGrpProfileFollowRoute();
enum TShapeType
{
SHAPE_NOTHING,
SHAPE_RECTANGLE,
};
class CBotFollower
{
public:
CBotFollower();
virtual ~CBotFollower();
void setBotAtDest(bool atDest = true);
const bool& isBotAtDest() const;
private:
bool _BotAtDest;
};
void setDirection(bool forward);
bool getDirection();
void resumeProfile();
CPathCont* getPathCont(CBot const* bot);
void addBot(CBot* bot);
void removeBot(CBot* bot);
/// @name IAIProfile implementation
//@{
virtual void beginProfile();
virtual void updateProfile(uint ticksSinceLastUpdate);
virtual void endProfile();
virtual AITYPES::TProfiles getAIProfileType() const { return AITYPES::MOVE_FOLLOW_ROUTE; }
virtual std::string getOneLineInfoString() const;
//@}
bool profileTerminated() const;
void setCurrentValidPos(AITYPES::TVerticalPos verticalPos);
void calcRatios();
virtual void stateChangeProfile();
void stopNpc(bool stop);
private:
void assignGeometryFromState();
typedef std::map TBotFollowerMap;
TBotFollowerMap _NpcList;
bool _ValidPosInit;
bool _FollowForward;
bool _ProfileTerminated;
bool _MustCalcRatios;
TShapeType _Shape;
/// flag to temporary stop the bots
bool _StopNpc;
// rectangle shape related vars.
float _XSize;
float _YSize;
float _Ratio;
double _Cx, _Cy;
uint32 _NbRange;
uint32 _NbLines;
uint32 _NbBotInNormalShape;
uint32 _Rest;
uint32 _GeomIndex;
CPathCont _PathCont;
CAIVector _GlobalOrient;
bool _GeometryComeFromState;
std::vector const* _Geometry;
AITYPES::TVerticalPos _VerticalPos;
bool _DontSendEvent;
};
//////////////////////////////////////////////////////////////////////////////
// CGrpProfileStandOnVertices //
//////////////////////////////////////////////////////////////////////////////
class CGrpProfileStandOnVertices
: public CMoveProfile
{
public:
// utility class
class CBotPositionner : public NLMISC::CRefCount
{
public:
CBotPositionner(RYAI_MAP_CRUNCH::TAStarFlag flags);
CBotPositionner(uint32 geomIndex, RYAI_MAP_CRUNCH::TAStarFlag flags);
void setBotAtDest(bool atDest = true);
bool isBotAtDest() const;
CPathCont _PathCont;
uint32 _GeomIndex;
private:
bool _BotAtDest;
};
CGrpProfileStandOnVertices(CProfileOwner* owner);
~CGrpProfileStandOnVertices();
CPathCont *getPathCont (const CBot *bot);
/// @name IAIProfile implementation
//@{
virtual void beginProfile();
virtual void updateProfile(uint ticksSinceLastUpdate);
virtual void endProfile();
virtual AITYPES::TProfiles getAIProfileType() const { return AITYPES::MOVE_STAND_ON_VERTICES; }
virtual std::string getOneLineInfoString() const;
//@}
void resumeProfile();
void setCurrentValidPos (CAIStatePositional *grpState);
void addBot(CBot* bot);
void removeBot(CBot* bot);
private:
typedef std::map > TNpcBotPositionnerMap;
TNpcBotPositionnerMap _NpcList;
bool _Finished;
RYAI_MAP_CRUNCH::TAStarFlag _DenyFlags;
};
//////////////////////////////////////////////////////////////////////////////
// CGrpProfileWander //
//////////////////////////////////////////////////////////////////////////////
class CGrpProfileWander
: public CMoveProfile
{
public:
CGrpProfileWander(CProfileOwner* owner);
CGrpProfileWander(CProfileOwner* owner, CNpcZone const* const npcZone);
virtual ~CGrpProfileWander();
void setBotStandProfile(AITYPES::TProfiles botStandProfileType, IAIProfileFactory* botStandProfileFactory);
/// @name IAIProfile implementation
//@{
virtual void beginProfile();
virtual void updateProfile(uint ticksSinceLastUpdate);
virtual void endProfile();
virtual AITYPES::TProfiles getAIProfileType() const { return AITYPES::MOVE_WANDER; }
virtual std::string getOneLineInfoString() const;
//@}
void addBot (CBot* bot);
void removeBot (CBot* bot);
CPathCont* getPathCont (CBot const* bot);
void stateChangeProfile();
void affectZoneFromStateMachine();
void resetDestinationReachedData();
void setTimer(uint32 ticks) { _Timer.set(ticks); }
bool testTimer() const { return _Timer.test(); }
CNpcZone const* currentZone() const { return _NpcZone; }
private:
/// the profile type to apply to bot standing between two deplacement
AITYPES::TProfiles _BotStandProfileType;
/// the profile factory to apply to bot standing between two deplacement
IAIProfileFactory*_BotStandProfileFactory;
/// a flag to force social interaction for the bots
bool _Social;
NLMISC::CstCDbgPtr _RandomPos;
NLMISC::CSmartPtr _NpcZone;
std::vector _NpcDestinationReached;
bool _DestinationReachedAll;
bool _DestinationReachedFirst;
CAITimer _Timer;
};
//////////////////////////////////////////////////////////////////////////////
// CGrpProfileWanderNoPrim //
//////////////////////////////////////////////////////////////////////////////
/// This profile shouldn't require data primitive for wander zone
class CGrpProfileWanderNoPrim
: public CMoveProfile
{
public:
// CGrpProfileWanderNoPrim(CProfileOwner* owner);
CGrpProfileWanderNoPrim(CProfileOwner* owner, NLMISC::CSmartPtr const& npcZone);
virtual ~CGrpProfileWanderNoPrim();
void setBotStandProfile(AITYPES::TProfiles botStandProfileType, IAIProfileFactory* botStandProfileFactory);
/// @name IAIProfile implementation
//@{
virtual void beginProfile();
virtual void updateProfile(uint ticksSinceLastUpdate);
virtual void endProfile();
virtual AITYPES::TProfiles getAIProfileType() const { return AITYPES::MOVE_WANDER; }
virtual std::string getOneLineInfoString() const;
//@}
void addBot (CBot* bot);
void removeBot (CBot* bot);
CPathCont* getPathCont (CBot const* bot);
void stateChangeProfile();
// void affectZoneFromStateMachine();
void setTimer(uint32 ticks) { _Timer.set(ticks); }
bool testTimer() const { return _Timer.test(); }
// CNpcZone const* currentZone() const { return _NpcZone; }
private:
/// the profile type to apply to bot standing between two deplacement
AITYPES::TProfiles _BotStandProfileType;
/// the profile factory to apply to bot standing between two deplacement
IAIProfileFactory*_BotStandProfileFactory;
/// a flag to force social interaction for the bots
bool _Social;
// NLMISC::CstCDbgPtr _RandomPos;
NLMISC::CSmartPtr _NpcZone;
CAITimer _Timer;
};
class CGrpProfileFollowPlayer :
public CMoveProfile
{
public:
CGrpProfileFollowPlayer(CProfileOwner* owner, TDataSetRow const& playerRow, uint32 dispersionRadius);
virtual ~CGrpProfileFollowPlayer() {}
void setBotStandProfile(AITYPES::TProfiles botStandProfileType, IAIProfileFactory* botStandProfileFactory);
/// @name IAIProfile implementation
//@{
virtual void beginProfile();
virtual void updateProfile(uint ticksSinceLastUpdate);
virtual void endProfile() {}
virtual AITYPES::TProfiles getAIProfileType() const { return AITYPES::BOT_FOLLOW_POS; }
virtual std::string getOneLineInfoString() const { return std::string("follow_player group profile"); }
//@}
void stateChangeProfile() {}
bool destinationReach() const;
void addBot (CBot* bot) {}
void removeBot (CBot* bot) {}
CPathCont* getPathCont (CBot const* bot) { return NULL; };
protected:
private:
/// the profile type to apply to bot standing between two deplacement
AITYPES::TProfiles _BotStandProfileType;
/// the profile factory to apply to bot standing between two deplacement
IAIProfileFactory*_BotStandProfileFactory;
CFollowPath::TFollowStatus _Status;
CPathPosition _PathPos;
CPathCont _PathCont;
CAIVector _LastPos;
TDataSetRow _PlayerRow;
uint32 _DispersionRadius;
};
//////////////////////////////////////////////////////////////////////////////
// CGrpProfileIdle //
//////////////////////////////////////////////////////////////////////////////
class CGrpProfileIdle
: public CMoveProfile
{
public:
CGrpProfileIdle(CProfileOwner* owner);
virtual ~CGrpProfileIdle();
class CBotPositionner
{
public:
CBotPositionner();
virtual ~CBotPositionner();
};
CPathCont* getPathCont(CBot const* bot);
virtual void beginProfile();
void resumeProfile();
virtual void endProfile();
virtual void updateProfile(uint ticksSinceLastUpdate);
void addBot(CBot* bot);
void removeBot(CBot* bot);
virtual std::string getOneLineInfoString() const;
virtual AITYPES::TProfiles getAIProfileType() const { return AITYPES::MOVE_IDLE; }
private:
typedef std::map TNpcBotPositionnerMap;
TNpcBotPositionnerMap _NpcList;
};
//////////////////////////////////////////////////////////////////////////////
// CGrpProfileBandit //
//////////////////////////////////////////////////////////////////////////////
class CGrpProfileBandit
: public CGrpProfileNormal
{
public:
CGrpProfileBandit(CProfileOwner* owner);
virtual ~CGrpProfileBandit();
/// @name IAIProfile implementation
//@{
virtual void beginProfile();
virtual void updateProfile(uint ticksSinceLastUpdate);
virtual void endProfile();
virtual AITYPES::TProfiles getAIProfileType () const { return AITYPES::ACTIVITY_BANDIT; }
virtual std::string getOneLineInfoString() const;
//@}
private:
uint32 _AggroRange;
};
//////////////////////////////////////////////////////////////////////////////
// CGrpProfileEscorted //
//////////////////////////////////////////////////////////////////////////////
class CGrpProfileEscorted
: public CGrpProfileNormal
{
public:
CGrpProfileEscorted(CProfileOwner* owner);
virtual ~CGrpProfileEscorted();
/// @name IAIProfile implementation
//@{
virtual void beginProfile();
virtual void updateProfile(uint ticksSinceLastUpdate);
virtual void endProfile();
virtual AITYPES::TProfiles getAIProfileType () const { return AITYPES::ACTIVITY_ESCORTED; }
virtual std::string getOneLineInfoString() const;
//@}
void stateChangeProfile();
protected:
bool _EscortTeamInRange;
};
//////////////////////////////////////////////////////////////////////////////
// CGrpProfileGuard //
//////////////////////////////////////////////////////////////////////////////
class CGrpProfileGuard
: public CGrpProfileNormal
{
public:
CGrpProfileGuard(CProfileOwner* owner);
virtual ~CGrpProfileGuard();
/// @name IAIProfile implementation
//@{
virtual void beginProfile();
virtual void updateProfile(uint ticksSinceLastUpdate);
virtual void endProfile();
virtual AITYPES::TProfiles getAIProfileType() const { return AITYPES::ACTIVITY_GUARD; }
virtual std::string getOneLineInfoString() const;
//@}
private:
CAIVector _CenterPos;
uint32 _AggroRange;
};
//////////////////////////////////////////////////////////////////////////////
// CGrpProfileGuardEscorted //
//////////////////////////////////////////////////////////////////////////////
class CGrpProfileGuardEscorted
: public CGrpProfileNormal
{
public:
CGrpProfileGuardEscorted(CProfileOwner* owner);
virtual ~CGrpProfileGuardEscorted();
/// @name IAIProfile implementation
//@{
virtual void beginProfile();
virtual void updateProfile(uint ticksSinceLastUpdate);
virtual void endProfile();
virtual AITYPES::TProfiles getAIProfileType() const { return AITYPES::ACTIVITY_GUARD_ESCORTED; }
virtual std::string getOneLineInfoString() const;
//@}
void stateChangeProfile();
protected:
NLMISC::CSmartPtr _GuardProfile;
NLMISC::CSmartPtr _EscortedProfile;
};
//////////////////////////////////////////////////////////////////////////////
// CGrpProfileFaction //
//////////////////////////////////////////////////////////////////////////////
class CGrpProfileFaction
: public CGrpProfileNormal
{
public:
CGrpProfileFaction(CProfileOwner* owner);
virtual ~CGrpProfileFaction();
/// @name IAIProfile implementation
//@{
virtual void beginProfile();
virtual void updateProfile(uint ticksSinceLastUpdate);
virtual void endProfile();
virtual AITYPES::TProfiles getAIProfileType() const { return AITYPES::ACTIVITY_FACTION; }
virtual std::string getOneLineInfoString() const;
//@}
virtual void aggroEntity(CAIEntityPhysical const* entity);
void checkTargetsAround();
void noAssist() { bNoAssist = true; }
static std::string scriptFactionToFameFaction(std::string name);
static std::string fameFactionToScriptFaction(std::string name);
static bool scriptFactionToFameFactionGreaterThan(std::string name);
static sint32 scriptFactionToFameFactionValue(std::string name);
private:
CAITimer _checkTargetTimer;
bool bNoAssist;
private:
static AITYPES::CPropertySet _FameFactions;
static void initFameFactions();
static bool entityHavePartOfFactions(CAIEntityPhysical const* entity, AITYPES::CPropertySetWithExtraList const& factions);
};
//////////////////////////////////////////////////////////////////////////////
// CGrpProfileSquad //
// The Manager Parent of the Manager of this Grp class is COutpost //
//////////////////////////////////////////////////////////////////////////////
class CGrpProfileSquad
: public CGrpProfileFaction
{
public:
CGrpProfileSquad(CProfileOwner* owner);
virtual ~CGrpProfileSquad();
/// @name IAIProfile implementation
//@{
virtual void beginProfile();
virtual AITYPES::TProfiles getAIProfileType() const { return AITYPES::ACTIVITY_SQUAD; }
virtual std::string getOneLineInfoString() const;
//@}
virtual void aggroEntity(CAIEntityPhysical const* entity);
NLMISC::CSmartPtr buildFirstHitPlace(TDataSetRow const& aggroBot);
protected:
/// Return the outpost to which the squad belongs, or NULL if not found
COutpost* getDefendedOutpost() { return dynamic_cast(_Grp->getPersistent().getOwner()->getOwner()); }
};
//////////////////////////////////////////////////////////////////////////////
// CGrpProfileFight //
//////////////////////////////////////////////////////////////////////////////
class CGrpProfileFight
: public CFightProfile
, public CFightOrganizer
{
// TODO : set this parameters thrue the group, no hardcode them
enum
{
CHECK_AROUND_PERIOD = 50, ///< Check every 5s
CHECK_AROUND_RADIUS = 60, ///< Check 60 meters around
};
public:
CGrpProfileFight(CProfileOwner *owner);
virtual ~CGrpProfileFight();
virtual void beginProfile();
void endProfile();
void addBot (CBot *bot);
void removeBot (CBot *bot);
//////////////////////////////////////////////////////////////////////////
/// @name CFightOrganizer
//@{
virtual void setFight(CSpawnBot* bot, CAIEntityPhysical* ennemy);
virtual void setHeal(CSpawnBot* bot, CAIEntityPhysical* target);
virtual void setNoFight(CSpawnBot* bot);
virtual void setFlee(CSpawnBot* bot, CAIVector& fleeVect);
virtual void setReturnAfterFight(CSpawnBot* bot);
//@}
bool stillHaveEnnemy () const;
virtual void updateProfile(uint ticksSinceLastUpdate);
virtual std::string getOneLineInfoString() const;
virtual AITYPES::TProfiles getAIProfileType() const { return AITYPES::FIGHT_NORMAL; }
std::vector &npcList();
private:
std::vector _NpcList;
/// A timer to check the friend groups around and set their aggro list if they are not fighting
CAITimer _CheckAround;
bool _WasRunning;
};
/****************************************************************************/
/* Profile factories */
/****************************************************************************/
//- Simple profile factories (based on generic factory) ----------------------
// CBotProfileStandAtPos
typedef CAIGenericProfileFactory CBotProfileStandAtPosFactory;
// CBotProfileForage
typedef CAIGenericProfileFactory CBotProfileForageFactory;
// CGrpProfileNormal
typedef CAIGenericProfileFactory CGrpProfileNormalFactory;
// CGrpProfileFollowRoute
typedef CAIGenericProfileFactory CGrpProfileFollowRouteFactory;
// CGrpProfileWander
typedef CAIGenericProfileFactory CGrpProfileWanderFactory;
// CGrpProfileGuardFactory
typedef CAIGenericProfileFactory CGrpProfileGuardFactory;
// CGrpProfileEscortedFactory
typedef CAIGenericProfileFactory CGrpProfileEscortedFactory;
// CGrpProfileGuardEscortedFactory
typedef CAIGenericProfileFactory CGrpProfileGuardEscortedFactory;
// CGrpProfileFactionFactory
typedef CAIGenericProfileFactory CGrpProfileFactionFactory;
// CGrpProfileSquadFactory
typedef CAIGenericProfileFactory CGrpProfileSquadFactory;
// CGrpProfileStandOnVerticesFactory
typedef CAIGenericProfileFactory CGrpProfileStandOnVerticesFactory;
//////////////////////////////////////////////////////////////////////////////
// CGrpProfileNoChange //
//////////////////////////////////////////////////////////////////////////////
/// No change special profile
class CGrpProfileNoChangeFactory
: public IAIProfileFactory
{
public:
NLMISC::CSmartPtr createAIProfile(CProfileOwner* owner)
{
return NULL;
}
};
RYAI_DECLARE_PROFILE_FACTORY(CGrpProfileNoChangeFactory);
//////////////////////////////////////////////////////////////////////////////
// CGrpProfileBanditFactory //
//////////////////////////////////////////////////////////////////////////////
class CGrpProfileBanditFactory
: public IAIProfileFactory
{
public:
NLMISC::CSmartPtr createAIProfile(CProfileOwner* owner);
static float getDefaultBanditAggroRange();
private:
static float _DefaultAggroRange;
};
//- Singleton profiles (stateless ones) --------------------------------------
extern CBotProfileStandAtPosFactory BotProfileStandAtPosFactory;
extern CBotProfileForageFactory BotProfileForageFactory;
#endif