123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437 |
- //***************************************************************************
- //
- // contact.h - This file contains the Contact Class header definitions
- //
- // MechCommander 2 -- FASA Interactive Technologies
- //
- //---------------------------------------------------------------------------//
- // Copyright (C) Microsoft Corporation. All rights reserved. //
- //===========================================================================//
- #ifndef CONTACT_H
- #define CONTACT_H
- //---------------------------------------------------------------------------
- #ifndef MCLIB_H
- #include "mclib.h"
- #endif
- #ifndef DCONTACT_H
- #include "dcontact.h"
- #endif
- #ifndef DGAMEOBJ_H
- #include "dgameobj.h"
- #endif
- #ifndef DMOVER_H
- #include "dmover.h"
- #endif
- #ifndef DOBJTYPE_H
- #include "dobjtype.h"
- #endif
- #ifndef DWARRIOR_H
- #include "dwarrior.h"
- #endif
- #ifndef DTEAM_H
- #include "dteam.h"
- #endif
- #ifndef OBJMGR_H
- #include "objmgr.h"
- #endif
- //***************************************************************************
- class ContactInfo {
- public:
- unsigned char contactStatus[MAX_TEAMS];
- //unsigned char allContactStatus[MAX_TEAMS];
- unsigned char contactCount[MAX_TEAMS]; //How many mechs/vehicles have me on sensors?
- unsigned char sensors[MAX_SENSORS]; //index into sensor's contact list
- unsigned short teams[MAX_TEAMS]; //index into team's contact list
- unsigned char teamSpotter[MAX_TEAMS];
- public:
- void* operator new (size_t mySize);
- void operator delete (void* us);
- void destroy (void) {
- }
- void init (void) {
- for (long i = 0; i < MAX_TEAMS; i++) {
- contactStatus[i] = CONTACT_NONE;
- //allContactStatus[i] = CONTACT_NONE;
- contactCount[i] = 0;
- teams[i] = 0;
- teamSpotter[i] = 0;
- }
- for (i = 0; i < MAX_SENSORS; i++)
- sensors[i] = 255;
- }
- ContactInfo (void) {
- init ();
- }
- ~ContactInfo (void) {
- destroy();
- }
- long getContactStatus (long teamId, bool includingAllies) {
- if (teamId == -1)
- return(CONTACT_NONE);
- return(contactStatus[teamId]);
- }
- void incContactCount (long teamId) {
- contactCount[teamId]++;
- }
- void decContactCount (long teamId) {
- contactCount[teamId]--;
- }
- long getContactCount (long teamId) {
- return(contactCount[teamId]);
- }
- void setSensor (long sensor, long contactIndex) {
- sensors[sensor] = contactIndex;
- }
- long getSensor (long sensor) {
- return(sensors[sensor]);
- }
- void setTeam (long teamId, long contactIndex) {
- teams[teamId] = contactIndex;
- }
- long getTeam (long teamId) {
- return(teams[teamId]);
- }
- };
- //---------------------------------------------------------------------------
- typedef struct _ECMInfo {
- GameObjectPtr owner;
- float range;
- } ECMInfo;
- //---------------------------------------------------------------------------
- class SensorSystem {
- public:
- long id;
- TeamSensorSystemPtr master;
- long masterIndex;
- GameObjectPtr owner;
- float range;
- long skill;
- bool broken;
- bool notShutdown;
- bool hasLOSCapability;
- float ecmEffect;
- float nextScanUpdate;
- float lastScanUpdate;
- unsigned short contacts[MAX_CONTACTS_PER_SENSOR];
- long numContacts;
- long numExclusives;
- long totalContacts;
- SensorSystemPtr prev;
- SensorSystemPtr next;
- static long numSensors;
- static float scanFrequency;
- static SortListPtr sortList;
- public:
- void* operator new (size_t ourSize);
-
- void operator delete (void* us);
-
- void init (void);
- void destroy (void);
- void setMaster (TeamSensorSystemPtr newMaster);
- void setOwner (GameObjectPtr newOwner);
- void disable (void);
- bool enabled (void);
- void setShutdown (bool setting);
- void setMasterIndex (long index) {
- masterIndex = index;
- }
- long getMasterIndex (void) {
- return(masterIndex);
- }
- void setRange (float newRange);
- float getRange (void);
- float getEffectiveRange (void);
- void setSkill (long newSkill);
- long getSkill (void) {
- return(skill);
- }
- long getTotalContacts (void) {
- return(totalContacts);
- }
- void setNextScanUpdate (float when) {
- nextScanUpdate = when;
- }
- void setScanFrequency (float seconds) {
- scanFrequency = seconds;
- }
- SensorSystem (void) {
- init();
- }
- ~SensorSystem (void) {
- destroy();
- }
- long getSensorQuality (void);
- long calcContactStatus (MoverPtr mover);
- bool isContact (MoverPtr mover);
- void addContact (MoverPtr mover, bool visual);
- void modifyContact (MoverPtr mover, bool visual);
- void removeContact (long contactIndex);
- void removeContact (MoverPtr mover);
- void clearContacts (void);
- long scanBattlefield (void);
- long scanMover (Mover* mover);
- void updateContacts (void);
- void updateScan (bool forceUpdate = false);
- long getTeamContacts (long* contactList, long contactCriteria, long sortType);
-
- void setLOSCapability (bool flag)
- {
- hasLOSCapability = flag;
- }
- };
- //---------------------------------------------------------------------------
- #define MAX_SENSORS_PER_TEAM MAX_MOVERS
- class TeamSensorSystem {
- public:
- long teamId;
- long nextContactId;
- long numContactUpdatesPerPass;
- long curContactUpdate;
- long contacts[MAX_MOVERS];
- //long allContacts[MAX_MOVERS];
- long numContacts;
- //long numAllContacts;
- long numEnemyContacts;
- SensorSystemPtr sensors[MAX_SENSORS_PER_TEAM];
- long numSensors;
- SystemTrackerPtr ecms;
- long numEcms;
- SystemTrackerPtr jammers;
- long numJammers;
- static bool homeTeamInContact;
- public:
- void* operator new (size_t ourSize);
-
- void operator delete (void* us);
-
- void init (void);
- void destroy (void);
- TeamSensorSystem (void) {
- init();
- }
-
- ~TeamSensorSystem (void) {
- destroy();
- }
- void update (void);
- void setTeam (TeamPtr newTeam);
- void incNumEnemyContacts (void);
- void decNumEnemyContacts (void);
- void addContact (SensorSystemPtr sensor, MoverPtr contact, long contactIndex, long contactStatus);
- SensorSystemPtr findBestSpotter (MoverPtr contact, long* status);
- void modifyContact (SensorSystemPtr sensor, MoverPtr contact, long contactStatus);
- void removeContact (SensorSystemPtr sensor, MoverPtr contact);
- void addSensor (SensorSystemPtr sensor);
- void removeSensor (SensorSystemPtr sensor);
- long getVisualContacts (MoverPtr* moverList);
- long getSensorContacts (MoverPtr* moverList);
- bool hasSensorContact (long teamID);
- long getContacts (GameObjectPtr looker, long* contactList, long contactCriteria, long sortType);
- long getContactStatus (MoverPtr mover, bool includingAllies);
- bool meetsCriteria (GameObjectPtr looker, MoverPtr mover, long contactCriteria);
- void scanBattlefield (void);
- void scanMover (Mover* mover);
- void addEcm (GameObjectPtr owner, float range);
- void updateEcmEffects (void);
- //void updateContactList (void);
- };
- //---------------------------------------------------------------------------
- class SensorSystemManager {
- //-------------
- // Data Members
-
- protected:
-
- long freeSensors; //How many sensors are currently free
- SensorSystemPtr* sensorPool; //Pool of ALL sensors
- SensorSystemPtr freeList; //List of available sensors
- TeamSensorSystemPtr teamSensors[MAX_TEAMS];
- ECMInfo ecms[MAX_ECMS];
- long numEcms;
- long teamToUpdate;
- static float updateFrequency;
-
- public:
- static bool enemyInLOS; //Flag is set every frame that I can see someone on sensors or visually.
- //-----------------
- // Member Functions
-
- public:
- void* operator new (size_t ourSize);
- void operator delete (void* us);
-
- SensorSystemManager (void) {
- init();
- }
-
- ~SensorSystemManager (void) {
- destroy();
- }
-
- void destroy (void);
-
- void init (void) {
- freeSensors = 0;
- sensorPool = NULL;
- freeList = NULL;
- for (long i = 0; i < MAX_TEAMS; i++)
- teamSensors[i] = NULL;
- numEcms = 0;
- teamToUpdate = 0;
- }
-
- long init (bool debug);
- TeamSensorSystemPtr getTeamSensor (long teamId) {
- return(teamSensors[teamId]);
- }
-
- SensorSystemPtr newSensor (void);
- void freeSensor (SensorSystemPtr sensor);
- SensorSystemPtr getSensor (long id)
- {
- if ((id < 0) || (id >= MAX_SENSORS))
- STOP(("Tried to access Sensor outside of range. Tried to access: %d",id));
-
- return(sensorPool[id]);
- }
- long checkIntegrity (void);
- void addTeamSensor (long teamId, SensorSystemPtr sensor);
- void removeTeamSensor (long teamId, SensorSystemPtr sensor);
- void addEcm (GameObjectPtr owner, float range);
- float getEcmEffect (GameObjectPtr victim);
- void updateEcmEffects (void);
- void updateSensors (void);
- //void updateTeamContactLists (void);
- void update (void);
- };
- //---------------------------------------------------------------------------
- extern SensorSystemManagerPtr SensorManager;
- //***************************************************************************
- #endif
|