AIController.h 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) 2012 GarageGames, LLC
  3. //
  4. // Permission is hereby granted, free of charge, to any person obtaining a copy
  5. // of this software and associated documentation files (the "Software"), to
  6. // deal in the Software without restriction, including without limitation the
  7. // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  8. // sell copies of the Software, and to permit persons to whom the Software is
  9. // furnished to do so, subject to the following conditions:
  10. //
  11. // The above copyright notice and this permission notice shall be included in
  12. // all copies or substantial portions of the Software.
  13. //
  14. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  19. // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  20. // IN THE SOFTWARE.
  21. //-----------------------------------------------------------------------------
  22. #ifndef _AICONTROLLER_H_
  23. #define _AICONTROLLER_H_
  24. #include "navigation/coverPoint.h"
  25. #include "AIInfo.h"
  26. #include "AIGoal.h"
  27. #include "AIAimTarget.h"
  28. #include "AICover.h"
  29. #include "AINavigation.h"
  30. class AIControllerData;
  31. //-----------------------------------------------------------------------------
  32. class AIController : public SimObject {
  33. typedef SimObject Parent;
  34. public:
  35. AIControllerData* mControllerData;
  36. protected:
  37. static bool setControllerDataProperty(void* object, const char* index, const char* data);
  38. public:
  39. enum MoveState {
  40. ModeStop, // AI has stopped moving.
  41. ModeStuck, // AI is stuck, but wants to move.
  42. ModeSlowing, // AI is slowing down as it reaches it's destination.
  43. ModeMove, // AI is currently moving.
  44. ModeReverse // AI is reversing
  45. };
  46. private:
  47. AIInfo*mAIInfo;
  48. public:
  49. void setAIInfo(SimObjectPtr<SceneObject> objIn, F32 rad = 0.0f) { delete(mAIInfo); mAIInfo = new AIInfo(this, objIn, rad); }
  50. AIInfo* getAIInfo() { return mAIInfo; }
  51. private:
  52. AIGoal* mGoal;
  53. public:
  54. void setGoal(AIInfo* targ);
  55. void setGoal(Point3F loc, F32 rad = 0.0f);
  56. void setGoal(SimObjectPtr<SceneObject> objIn, F32 rad = 0.0f);
  57. AIGoal* getGoal() { return mGoal; }
  58. void clearGoal() { SAFE_DELETE(mGoal); }
  59. private:
  60. AIAimTarget* mAimTarget;
  61. public:
  62. void setAim(Point3F loc, F32 rad = 0.0f, Point3F offset = Point3F(0.0f, 0.0f, 0.0f));
  63. void setAim(SimObjectPtr<SceneObject> objIn, F32 rad = 0.0f, Point3F offset = Point3F(0.0f, 0.0f, 0.0f));
  64. AIAimTarget* getAim() { return mAimTarget; }
  65. void clearAim() { SAFE_DELETE(mAimTarget); }
  66. private:
  67. AICover* mCover;
  68. public:
  69. void setCover(Point3F loc, F32 rad = 0.0f) { delete(mCover); mCover = new AICover(this, loc, rad); }
  70. void setCover(SimObjectPtr<SceneObject> objIn, F32 rad = 0.0f) { delete(mCover); mCover = new AICover(this, objIn, rad); }
  71. AICover* getCover() { return mCover; }
  72. bool findCover(const Point3F& from, F32 radius);
  73. void clearCover();
  74. // Utility Methods
  75. void throwCallback(const char* name);
  76. AINavigation* mNav;
  77. AINavigation* getNav() { return mNav; };
  78. struct Movement
  79. {
  80. AIController* mControllerRef;
  81. AIController* getCtrl() { return mControllerRef; };
  82. MoveState mMoveState;
  83. F32 mMoveSpeed = 1.0;
  84. void setMoveSpeed(F32 speed) { mMoveSpeed = speed; };
  85. F32 getMoveSpeed() { return mMoveSpeed; };
  86. bool mMoveSlowdown; // Slowdown as we near the destination
  87. Point3F mLastLocation; // For stuck check
  88. S32 mMoveStuckTestCountdown; // The current countdown until at AI starts to check if it is stuck
  89. Point3F mAimLocation;
  90. // move triggers
  91. bool mMoveTriggers[MaxTriggerKeys];
  92. void stopMove();
  93. void onStuck();
  94. } mMovement;
  95. struct TriggerState
  96. {
  97. AIController* mControllerRef;
  98. AIController* getCtrl() { return mControllerRef; };
  99. bool mMoveTriggers[MaxTriggerKeys];
  100. // Trigger sets/gets
  101. void setMoveTrigger(U32 slot, const bool isSet = true);
  102. bool getMoveTrigger(U32 slot) const;
  103. void clearMoveTriggers();
  104. } mTriggerState;
  105. bool getAIMove(Move* move);
  106. static void initPersistFields();
  107. AIController()
  108. {
  109. for (S32 i = 0; i < MaxTriggerKeys; i++)
  110. mTriggerState.mMoveTriggers[i] = false;
  111. mMovement.mControllerRef = this;
  112. mTriggerState.mControllerRef = this;
  113. mControllerData = NULL;
  114. mAIInfo = new AIInfo(this);
  115. mNav = new AINavigation(this);
  116. mGoal = NULL;
  117. mAimTarget = NULL;
  118. mCover = NULL;
  119. mMovement.mMoveState = ModeStop;
  120. };
  121. ~AIController()
  122. {
  123. SAFE_DELETE(mAIInfo);
  124. SAFE_DELETE(mNav);
  125. clearGoal();
  126. clearAim();
  127. clearCover();
  128. }
  129. DECLARE_CONOBJECT(AIController);
  130. };
  131. //-----------------------------------------------------------------------------
  132. class AIControllerData : public SimDataBlock {
  133. typedef SimDataBlock Parent;
  134. public:
  135. AIControllerData();
  136. AIControllerData(const AIControllerData&, bool = false);
  137. ~AIControllerData() {};
  138. void packData(BitStream* stream) override;
  139. void unpackData(BitStream* stream) override;
  140. static void initPersistFields();
  141. DECLARE_CONOBJECT(AIControllerData);
  142. F32 mMoveTolerance; // Distance from destination point before we stop
  143. F32 mFollowTolerance; // Distance from destination object before we stop
  144. F32 mAttackRadius; // Distance to trigger weaponry calcs
  145. S32 mMoveStuckTestDelay; // The number of ticks to wait before checking if the AI is stuck
  146. F32 mMoveStuckTolerance; // Distance tolerance on stuck check
  147. F32 mHeightTolerance; // how high above the navmesh are we before we stop trying to repath
  148. #ifdef TORQUE_NAVIGATION_ENABLED
  149. struct Flocking {
  150. U32 mChance; // chance of flocking
  151. F32 mMin; // min flocking separation distance
  152. F32 mMax; // max flocking clustering distance
  153. F32 mSideStep; // Distance from destination before we stop moving out of the way
  154. } mFlocking;
  155. /// Types of link we can use.
  156. LinkData mLinkTypes;
  157. dtQueryFilter mFilter;
  158. Vector<F32> mAreaCosts;
  159. AINavigation::NavSize mNavSize;
  160. #endif
  161. Delegate<void(AIController* obj, Point3F location, Move* movePtr)> resolveYawPtr;
  162. void resolveYaw(AIController* obj, Point3F location, Move* movePtr);
  163. Delegate<void(AIController* obj, Point3F location, Move* movePtr)> resolvePitchPtr;
  164. void resolvePitch(AIController* obj, Point3F location, Move* movePtr) {};
  165. Delegate<void(AIController* obj, Point3F location, Move* movePtr)> resolveRollPtr;
  166. void resolveRoll(AIController* obj, Point3F location, Move* movePtr);
  167. Delegate<void(AIController* obj, Point3F location, Move* movePtr)> resolveSpeedPtr;
  168. void resolveSpeed(AIController* obj, Point3F location, Move* movePtr);
  169. Delegate<void(AIController* obj, Move* movePtr)> resolveTriggerStatePtr;
  170. void resolveTriggerState(AIController* obj, Move* movePtr);
  171. Delegate<void(AIController* obj)> resolveStuckPtr;
  172. void resolveStuck(AIController* obj);
  173. };
  174. class AIPlayerControllerData : public AIControllerData
  175. {
  176. typedef AIControllerData Parent;
  177. public:
  178. AIPlayerControllerData()
  179. {
  180. resolvePitchPtr.bind(this, &AIPlayerControllerData::resolvePitch);
  181. resolveTriggerStatePtr.bind(this, &AIPlayerControllerData::resolveTriggerState);
  182. }
  183. void resolvePitch(AIController* obj, Point3F location, Move* movePtr);
  184. void resolveTriggerState(AIController* obj, Move* movePtr);
  185. DECLARE_CONOBJECT(AIPlayerControllerData);
  186. };
  187. class AIWheeledVehicleControllerData : public AIControllerData
  188. {
  189. typedef AIControllerData Parent;
  190. public:
  191. AIWheeledVehicleControllerData()
  192. {
  193. resolveYawPtr.bind(this, &AIWheeledVehicleControllerData::resolveYaw);
  194. resolveSpeedPtr.bind(this, &AIWheeledVehicleControllerData::resolveSpeed);
  195. mHeightTolerance = 2.0f;
  196. }
  197. void resolveYaw(AIController* obj, Point3F location, Move* movePtr);
  198. void resolveSpeed(AIController* obj, Point3F location, Move* movePtr);
  199. DECLARE_CONOBJECT(AIWheeledVehicleControllerData);
  200. };
  201. class AIFlyingVehicleControllerData : public AIControllerData
  202. {
  203. typedef AIControllerData Parent;
  204. F32 mFlightFloor;
  205. F32 mFlightCeiling;
  206. public:
  207. AIFlyingVehicleControllerData()
  208. {
  209. resolveYawPtr.bind(this, &AIFlyingVehicleControllerData::resolveYaw);
  210. resolvePitchPtr.bind(this, &AIFlyingVehicleControllerData::resolvePitch);
  211. resolveSpeedPtr.bind(this, &AIFlyingVehicleControllerData::resolveSpeed);
  212. mHeightTolerance = 200.0f;
  213. mFlightCeiling = 200.0f;
  214. mFlightFloor = 1.0;
  215. }
  216. AIFlyingVehicleControllerData(const AIFlyingVehicleControllerData&, bool = false);
  217. static void initPersistFields();
  218. void resolveYaw(AIController* obj, Point3F location, Move* movePtr);
  219. void resolveSpeed(AIController* obj, Point3F location, Move* movePtr);
  220. void resolvePitch(AIController* obj, Point3F location, Move* movePtr);
  221. DECLARE_CONOBJECT(AIFlyingVehicleControllerData);
  222. };
  223. #endif //_AICONTROLLER_H_