//========= Copyright Valve Corporation, All rights reserved. ============// // //============================================================================= #ifndef AI_TACTICALSERVICES_H #define AI_TACTICALSERVICES_H #include "ai_component.h" #if defined(_WIN32) #pragma once #endif class CAI_Network; class CAI_Pathfinder; enum FlankType_t { FLANKTYPE_NONE = 0, FLANKTYPE_ARC, // Stay flFlankParam degrees of arc away from vecFlankRefPos FLANKTYPE_RADIUS, // Stay flFlankParam units away from vecFlankRefPos }; //----------------------------------------------------------------------------- class CAI_TacticalServices : public CAI_Component { public: CAI_TacticalServices(CAI_BaseNPC *pOuter) : CAI_Component(pOuter), m_pNetwork(NULL) { m_bAllowFindLateralLos = true; } void Init(CAI_Network *pNetwork); bool FindLos(const Vector &threatPos, const Vector &threatEyePos, float minThreatDist, float maxThreatDist, float blockTime, Vector *pResult); bool FindLos(const Vector &threatPos, const Vector &threatEyePos, float minThreatDist, float maxThreatDist, float blockTime, FlankType_t eFlankType, const Vector &VecFlankRefPos, float flFlankParam, Vector *pResult); bool FindLateralLos(const Vector &threatPos, Vector *pResult); bool FindBackAwayPos(const Vector &vecThreat, Vector *pResult); bool FindCoverPos(const Vector &vThreatPos, const Vector &vThreatEyePos, float flMinDist, float flMaxDist, Vector *pResult); bool FindCoverPos(const Vector &vNearPos, const Vector &vThreatPos, const Vector &vThreatEyePos, float flMinDist, float flMaxDist, Vector *pResult); bool FindLateralCover(const Vector &vecThreat, float flMinDist, Vector *pResult); bool FindLateralCover(const Vector &vecThreat, float flMinDist, float distToCheck, int numChecksPerDir, Vector *pResult); bool FindLateralCover(const Vector &vNearPos, const Vector &vecThreat, float flMinDist, float distToCheck, int numChecksPerDir, Vector *pResult); void AllowFindLateralLos(bool bAllow) { m_bAllowFindLateralLos = bAllow; } private: // Checks lateral cover bool TestLateralCover(const Vector &vecCheckStart, const Vector &vecCheckEnd, float flMinDist); bool TestLateralLos(const Vector &vecCheckStart, const Vector &vecCheckEnd); int FindBackAwayNode(const Vector &vecThreat); int FindCoverNode(const Vector &vThreatPos, const Vector &vThreatEyePos, float flMinDist, float flMaxDist); int FindCoverNode(const Vector &vNearPos, const Vector &vThreatPos, const Vector &vThreatEyePos, float flMinDist, float flMaxDist); int FindLosNode(const Vector &vThreatPos, const Vector &vThreatEyePos, float flMinThreatDist, float flMaxThreatDist, float flBlockTime, FlankType_t eFlankType, const Vector &vThreatFacing, float flFlankParam); Vector GetNodePos(int); CAI_Network *GetNetwork() { return m_pNetwork; } const CAI_Network *GetNetwork() const { return m_pNetwork; } CAI_Pathfinder *GetPathfinder() { return m_pPathfinder; } const CAI_Pathfinder *GetPathfinder() const { return m_pPathfinder; } CAI_Network *m_pNetwork; CAI_Pathfinder *m_pPathfinder; bool m_bAllowFindLateralLos; // Allows us to turn Lateral LOS checking // on/off. DECLARE_SIMPLE_DATADESC(); }; //----------------------------------------------------------------------------- #endif // AI_TACTICALSERVICES_H