contact.h 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437
  1. //***************************************************************************
  2. //
  3. // contact.h - This file contains the Contact Class header definitions
  4. //
  5. // MechCommander 2 -- FASA Interactive Technologies
  6. //
  7. //---------------------------------------------------------------------------//
  8. // Copyright (C) Microsoft Corporation. All rights reserved. //
  9. //===========================================================================//
  10. #ifndef CONTACT_H
  11. #define CONTACT_H
  12. //---------------------------------------------------------------------------
  13. #ifndef MCLIB_H
  14. #include "mclib.h"
  15. #endif
  16. #ifndef DCONTACT_H
  17. #include "dcontact.h"
  18. #endif
  19. #ifndef DGAMEOBJ_H
  20. #include "dgameobj.h"
  21. #endif
  22. #ifndef DMOVER_H
  23. #include "dmover.h"
  24. #endif
  25. #ifndef DOBJTYPE_H
  26. #include "dobjtype.h"
  27. #endif
  28. #ifndef DWARRIOR_H
  29. #include "dwarrior.h"
  30. #endif
  31. #ifndef DTEAM_H
  32. #include "dteam.h"
  33. #endif
  34. #ifndef OBJMGR_H
  35. #include "objmgr.h"
  36. #endif
  37. //***************************************************************************
  38. class ContactInfo {
  39. public:
  40. unsigned char contactStatus[MAX_TEAMS];
  41. //unsigned char allContactStatus[MAX_TEAMS];
  42. unsigned char contactCount[MAX_TEAMS]; //How many mechs/vehicles have me on sensors?
  43. unsigned char sensors[MAX_SENSORS]; //index into sensor's contact list
  44. unsigned short teams[MAX_TEAMS]; //index into team's contact list
  45. unsigned char teamSpotter[MAX_TEAMS];
  46. public:
  47. void* operator new (size_t mySize);
  48. void operator delete (void* us);
  49. void destroy (void) {
  50. }
  51. void init (void) {
  52. for (long i = 0; i < MAX_TEAMS; i++) {
  53. contactStatus[i] = CONTACT_NONE;
  54. //allContactStatus[i] = CONTACT_NONE;
  55. contactCount[i] = 0;
  56. teams[i] = 0;
  57. teamSpotter[i] = 0;
  58. }
  59. for (i = 0; i < MAX_SENSORS; i++)
  60. sensors[i] = 255;
  61. }
  62. ContactInfo (void) {
  63. init ();
  64. }
  65. ~ContactInfo (void) {
  66. destroy();
  67. }
  68. long getContactStatus (long teamId, bool includingAllies) {
  69. if (teamId == -1)
  70. return(CONTACT_NONE);
  71. return(contactStatus[teamId]);
  72. }
  73. void incContactCount (long teamId) {
  74. contactCount[teamId]++;
  75. }
  76. void decContactCount (long teamId) {
  77. contactCount[teamId]--;
  78. }
  79. long getContactCount (long teamId) {
  80. return(contactCount[teamId]);
  81. }
  82. void setSensor (long sensor, long contactIndex) {
  83. sensors[sensor] = contactIndex;
  84. }
  85. long getSensor (long sensor) {
  86. return(sensors[sensor]);
  87. }
  88. void setTeam (long teamId, long contactIndex) {
  89. teams[teamId] = contactIndex;
  90. }
  91. long getTeam (long teamId) {
  92. return(teams[teamId]);
  93. }
  94. };
  95. //---------------------------------------------------------------------------
  96. typedef struct _ECMInfo {
  97. GameObjectPtr owner;
  98. float range;
  99. } ECMInfo;
  100. //---------------------------------------------------------------------------
  101. class SensorSystem {
  102. public:
  103. long id;
  104. TeamSensorSystemPtr master;
  105. long masterIndex;
  106. GameObjectPtr owner;
  107. float range;
  108. long skill;
  109. bool broken;
  110. bool notShutdown;
  111. bool hasLOSCapability;
  112. float ecmEffect;
  113. float nextScanUpdate;
  114. float lastScanUpdate;
  115. unsigned short contacts[MAX_CONTACTS_PER_SENSOR];
  116. long numContacts;
  117. long numExclusives;
  118. long totalContacts;
  119. SensorSystemPtr prev;
  120. SensorSystemPtr next;
  121. static long numSensors;
  122. static float scanFrequency;
  123. static SortListPtr sortList;
  124. public:
  125. void* operator new (size_t ourSize);
  126. void operator delete (void* us);
  127. void init (void);
  128. void destroy (void);
  129. void setMaster (TeamSensorSystemPtr newMaster);
  130. void setOwner (GameObjectPtr newOwner);
  131. void disable (void);
  132. bool enabled (void);
  133. void setShutdown (bool setting);
  134. void setMasterIndex (long index) {
  135. masterIndex = index;
  136. }
  137. long getMasterIndex (void) {
  138. return(masterIndex);
  139. }
  140. void setRange (float newRange);
  141. float getRange (void);
  142. float getEffectiveRange (void);
  143. void setSkill (long newSkill);
  144. long getSkill (void) {
  145. return(skill);
  146. }
  147. long getTotalContacts (void) {
  148. return(totalContacts);
  149. }
  150. void setNextScanUpdate (float when) {
  151. nextScanUpdate = when;
  152. }
  153. void setScanFrequency (float seconds) {
  154. scanFrequency = seconds;
  155. }
  156. SensorSystem (void) {
  157. init();
  158. }
  159. ~SensorSystem (void) {
  160. destroy();
  161. }
  162. long getSensorQuality (void);
  163. long calcContactStatus (MoverPtr mover);
  164. bool isContact (MoverPtr mover);
  165. void addContact (MoverPtr mover, bool visual);
  166. void modifyContact (MoverPtr mover, bool visual);
  167. void removeContact (long contactIndex);
  168. void removeContact (MoverPtr mover);
  169. void clearContacts (void);
  170. long scanBattlefield (void);
  171. long scanMover (Mover* mover);
  172. void updateContacts (void);
  173. void updateScan (bool forceUpdate = false);
  174. long getTeamContacts (long* contactList, long contactCriteria, long sortType);
  175. void setLOSCapability (bool flag)
  176. {
  177. hasLOSCapability = flag;
  178. }
  179. };
  180. //---------------------------------------------------------------------------
  181. #define MAX_SENSORS_PER_TEAM MAX_MOVERS
  182. class TeamSensorSystem {
  183. public:
  184. long teamId;
  185. long nextContactId;
  186. long numContactUpdatesPerPass;
  187. long curContactUpdate;
  188. long contacts[MAX_MOVERS];
  189. //long allContacts[MAX_MOVERS];
  190. long numContacts;
  191. //long numAllContacts;
  192. long numEnemyContacts;
  193. SensorSystemPtr sensors[MAX_SENSORS_PER_TEAM];
  194. long numSensors;
  195. SystemTrackerPtr ecms;
  196. long numEcms;
  197. SystemTrackerPtr jammers;
  198. long numJammers;
  199. static bool homeTeamInContact;
  200. public:
  201. void* operator new (size_t ourSize);
  202. void operator delete (void* us);
  203. void init (void);
  204. void destroy (void);
  205. TeamSensorSystem (void) {
  206. init();
  207. }
  208. ~TeamSensorSystem (void) {
  209. destroy();
  210. }
  211. void update (void);
  212. void setTeam (TeamPtr newTeam);
  213. void incNumEnemyContacts (void);
  214. void decNumEnemyContacts (void);
  215. void addContact (SensorSystemPtr sensor, MoverPtr contact, long contactIndex, long contactStatus);
  216. SensorSystemPtr findBestSpotter (MoverPtr contact, long* status);
  217. void modifyContact (SensorSystemPtr sensor, MoverPtr contact, long contactStatus);
  218. void removeContact (SensorSystemPtr sensor, MoverPtr contact);
  219. void addSensor (SensorSystemPtr sensor);
  220. void removeSensor (SensorSystemPtr sensor);
  221. long getVisualContacts (MoverPtr* moverList);
  222. long getSensorContacts (MoverPtr* moverList);
  223. bool hasSensorContact (long teamID);
  224. long getContacts (GameObjectPtr looker, long* contactList, long contactCriteria, long sortType);
  225. long getContactStatus (MoverPtr mover, bool includingAllies);
  226. bool meetsCriteria (GameObjectPtr looker, MoverPtr mover, long contactCriteria);
  227. void scanBattlefield (void);
  228. void scanMover (Mover* mover);
  229. void addEcm (GameObjectPtr owner, float range);
  230. void updateEcmEffects (void);
  231. //void updateContactList (void);
  232. };
  233. //---------------------------------------------------------------------------
  234. class SensorSystemManager {
  235. //-------------
  236. // Data Members
  237. protected:
  238. long freeSensors; //How many sensors are currently free
  239. SensorSystemPtr* sensorPool; //Pool of ALL sensors
  240. SensorSystemPtr freeList; //List of available sensors
  241. TeamSensorSystemPtr teamSensors[MAX_TEAMS];
  242. ECMInfo ecms[MAX_ECMS];
  243. long numEcms;
  244. long teamToUpdate;
  245. static float updateFrequency;
  246. public:
  247. static bool enemyInLOS; //Flag is set every frame that I can see someone on sensors or visually.
  248. //-----------------
  249. // Member Functions
  250. public:
  251. void* operator new (size_t ourSize);
  252. void operator delete (void* us);
  253. SensorSystemManager (void) {
  254. init();
  255. }
  256. ~SensorSystemManager (void) {
  257. destroy();
  258. }
  259. void destroy (void);
  260. void init (void) {
  261. freeSensors = 0;
  262. sensorPool = NULL;
  263. freeList = NULL;
  264. for (long i = 0; i < MAX_TEAMS; i++)
  265. teamSensors[i] = NULL;
  266. numEcms = 0;
  267. teamToUpdate = 0;
  268. }
  269. long init (bool debug);
  270. TeamSensorSystemPtr getTeamSensor (long teamId) {
  271. return(teamSensors[teamId]);
  272. }
  273. SensorSystemPtr newSensor (void);
  274. void freeSensor (SensorSystemPtr sensor);
  275. SensorSystemPtr getSensor (long id)
  276. {
  277. if ((id < 0) || (id >= MAX_SENSORS))
  278. STOP(("Tried to access Sensor outside of range. Tried to access: %d",id));
  279. return(sensorPool[id]);
  280. }
  281. long checkIntegrity (void);
  282. void addTeamSensor (long teamId, SensorSystemPtr sensor);
  283. void removeTeamSensor (long teamId, SensorSystemPtr sensor);
  284. void addEcm (GameObjectPtr owner, float range);
  285. float getEcmEffect (GameObjectPtr victim);
  286. void updateEcmEffects (void);
  287. void updateSensors (void);
  288. //void updateTeamContactLists (void);
  289. void update (void);
  290. };
  291. //---------------------------------------------------------------------------
  292. extern SensorSystemManagerPtr SensorManager;
  293. //***************************************************************************
  294. #endif