objmgr.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588
  1. //***************************************************************************
  2. //
  3. // objmgr.h - This file contains the GameObject Manager class
  4. //
  5. // MechCommander 2
  6. //
  7. //---------------------------------------------------------------------------//
  8. // Copyright (C) Microsoft Corporation. All rights reserved. //
  9. //===========================================================================//
  10. #ifndef OBJMGR_H
  11. #define OBJMGR_H
  12. //---------------------------------------------------------------------------
  13. #ifndef DOBJMGR_H
  14. #include "dobjmgr.h"
  15. #endif
  16. #ifndef GAMEOBJ_H
  17. #include "gameobj.h"
  18. #endif
  19. #ifndef MOVER_H
  20. #include "mover.h"
  21. #endif
  22. #ifndef DMECH_H
  23. #include "dmech.h"
  24. #endif
  25. #ifndef DGVEHICL_H
  26. #include "dgvehicl.h"
  27. #endif
  28. #ifndef DELEMNTL_H
  29. #include "delemntl.h"
  30. #endif
  31. #ifndef DTERROBJ_H
  32. #include "dterrobj.h"
  33. #endif
  34. #ifndef DBLDNG_H
  35. #include "dbldng.h"
  36. #endif
  37. #ifndef DWEAPONBOLT_H
  38. #include "dweaponbolt.h"
  39. #endif
  40. #ifndef DCARNAGE_H
  41. #include "dcarnage.h"
  42. #endif
  43. #ifndef DARTLRY_H
  44. #include "dartlry.h"
  45. #endif
  46. #ifndef DOBJBLCK_H
  47. #include "dobjblck.h"
  48. #endif
  49. #ifndef DTURRET_H
  50. #include "dturret.h"
  51. #endif
  52. #ifndef DGATE_H
  53. #include "dgate.h"
  54. #endif
  55. #ifndef DCOLLSN_H
  56. #include "dcollsn.h"
  57. #endif
  58. class PacketFile;
  59. //---------------------------------------------------------------------------
  60. #define MOVERLIST_DELETE 0
  61. #define MOVERLIST_ADD 1
  62. #define MOVERLIST_TRADE 2
  63. #define NO_RAM_FOR_TERRAIN_OBJECT_FILE 0xBAAA0014
  64. #define NO_RAM_FOR_TERRAIN_OBJECT_HEAP 0xBAAA0015
  65. #define NO_RAM_FOR_OBJECT_BLOCK_NUM 0xBAAA0016
  66. #define NO_RAM_FOR_OBJECT_LISTS 0xBAAA0017
  67. #define NO_RAM_FOR_OBJECT_DATA_BLOCK 0xBAAA0018
  68. #define NO_RAM_FOR_OBJECT_BLOCK_USER 0xBAAA0019
  69. #define NO_RAM_FOR_LAST_BLOCK 0xBAAA001A
  70. #define NO_RAM_FOR_CENTER_BLOCK 0xBAAA001B
  71. #define OBJECTBLOCK_OUTOFRANGE 0xBAAA001C
  72. #define NO_AVAILABLE_OBJQUEUE 0xBAAA001D
  73. #define COULDNT_MAKE_TERRAIN_OBJECT 0xBAAA001E
  74. #define OBJECTBLOCK_NULL 0xBAAA001F
  75. #define BLOCK_NOT_CACHED 0xBAAA0020
  76. #define COULDNT_CREATE_OBJECT 0xBAAA0021
  77. #define OBJECT_NOT_FOUND 0xBAAA0022
  78. #pragma pack(1)
  79. struct ObjData {
  80. short objTypeNum; //Type number of object
  81. unsigned short vertexNumber; //Vertex Number in Block.
  82. unsigned short blockNumber; //Which terrain Block.
  83. unsigned char damage; //Damage
  84. long teamId;
  85. unsigned long parentId; //hOW AM i LINKED.
  86. };
  87. struct MiscObjectData {
  88. long blockNumber; //Terrain Block I occupy
  89. long vertexNumber; //Terrain Vertex I occupy
  90. long objectTypeNum; //ObjectTypeNumber for this overlay tile
  91. long damaged; //Is this overlay tile damaged or not
  92. };
  93. struct ObjDataLoader {
  94. long objTypeNum;
  95. Stuff::Vector3D vector;
  96. float rotation;
  97. long damage;
  98. long teamId;
  99. long parentId;
  100. // convert to block and vertex
  101. long tileCol;
  102. long tileRow;
  103. long blockNumber;
  104. long vertexNumber;
  105. };
  106. #pragma pack()
  107. typedef ObjData *ObjDataPtr;
  108. //---------------------------------------------------------------------------
  109. #define MAX_REINFORCEMENTS_PER_TEAM 16
  110. #define MAX_GATE_CONTROLS 50
  111. #define MAX_TURRET_CONTROLS 50
  112. #define MAX_POWER_GENERATORS 50
  113. #define MAX_SPECIAL_BUILDINGS 200
  114. #pragma pack(1)
  115. typedef struct _TeamObjectInfo {
  116. short numMechs;
  117. short numVehicles;
  118. short numElementals;
  119. short mechHandleIndex;
  120. short vehicleHandleIndex;
  121. short elementalHandleIndex;
  122. } TeamObjectInfo;
  123. #pragma pack()
  124. #define MAX_REMOVED 20
  125. #define MAX_WATCHES 4000
  126. #define MAX_CAPTURES_PER_TEAM 30
  127. typedef struct _RemovedMoverRec {
  128. unsigned long turn;
  129. long partID;
  130. } RemovedMoverRec;
  131. typedef struct _ObjectManagerData
  132. {
  133. long maxObjects;
  134. long numElementals;
  135. long numTerrainObjects;
  136. long numBuildings;
  137. long numTurrets;
  138. long numWeapons;
  139. long numCarnage;
  140. long numLights;
  141. long numArtillery;
  142. long numGates;
  143. long maxMechs;
  144. long maxVehicles;
  145. long numMechs;
  146. long numVehicles;
  147. long nextWatchId;
  148. } ObjectManagerData;
  149. class GameObjectManager {
  150. public:
  151. ObjectTypeManagerPtr objTypeManager;
  152. long numMechs;
  153. long numVehicles;
  154. long numElementals;
  155. long numTerrainObjects;
  156. long numBuildings;
  157. long numTurrets;
  158. long numWeapons;
  159. long numCarnage;
  160. long numLights;
  161. long numArtillery;
  162. long numGates;
  163. long maxMechs;
  164. long maxVehicles;
  165. long maxMovers;
  166. BattleMechPtr* mechs;
  167. GroundVehiclePtr* vehicles;
  168. ElementalPtr* elementals;
  169. TerrainObjectPtr* terrainObjects;
  170. BuildingPtr* buildings;
  171. WeaponBoltPtr* weapons;
  172. LightPtr* lights;
  173. CarnagePtr* carnage;
  174. ArtilleryPtr* artillery;
  175. TurretPtr* turrets;
  176. GatePtr* gates;
  177. BuildingPtr gateControls[MAX_GATE_CONTROLS];
  178. BuildingPtr turretControls[MAX_TURRET_CONTROLS];
  179. BuildingPtr powerGenerators[MAX_POWER_GENERATORS];
  180. BuildingPtr specialBuildings[MAX_SPECIAL_BUILDINGS]; //These must be updated EVERY FRAME. Perimeter alarms, etc.
  181. long numGateControls;
  182. long numTurretControls;
  183. long numPowerGenerators;
  184. long numSpecialBuildings;
  185. char* moverLineOfSightTable;
  186. bool useMoverLineOfSightTable;
  187. GameObjectPtr* objList;
  188. GameObjectPtr* collidableList;
  189. MoverPtr moverList[MAX_MOVERS];
  190. MoverPtr goodMoverList[MAX_MOVERS];
  191. MoverPtr badMoverList[MAX_MOVERS];
  192. long numCollidables;
  193. long numGoodMovers;
  194. long numBadMovers;
  195. long numMovers;
  196. long nextReinforcementPartId;
  197. long numRemoved;
  198. RemovedMoverRec moversRemoved[MAX_REMOVED];
  199. unsigned long nextWatchID;
  200. GameObjectPtr *watchList;
  201. long currentWeaponsIndex; //points to next entry in rotating weapon array.
  202. long currentCarnageIndex; //points to next entry in rotating carnage list
  203. long currentLightIndex;
  204. long currentArtilleryIndex;
  205. bool rebuildCollidableList;
  206. long numCaptures[MAX_TEAMS];
  207. GameObjectWatchID captureList[MAX_TEAMS][MAX_CAPTURES_PER_TEAM];
  208. long totalObjCount;
  209. ObjDataLoader *objData; //Used to keep from loading twice!!
  210. CollisionSystemPtr collisionSystem;
  211. private:
  212. GameObjectPtr findObjectByMouse (long mouseX,
  213. long mouseY,
  214. GameObjectPtr* searchList,
  215. long listSize,
  216. bool skipDisabled = false);
  217. GameObjectPtr findMoverByMouse (long mouseX,
  218. long mouseY,
  219. long teamId,
  220. bool skipDisabled = false);
  221. GameObjectPtr findTerrainObjectByMouse (long mouseX,
  222. long mouseY,
  223. bool skipDisabled = false);
  224. void addObject(ObjDataLoader *objData, long& objIndex, long& buildIndex,
  225. long &turretIndex, long &gateIndex, long& curCollideHandle, long& curNonCollideHandle);
  226. void countObject( ObjDataLoader* objType);
  227. public:
  228. void* operator new (size_t mySize);
  229. void operator delete (void* us);
  230. void init (void);
  231. GameObjectManager (void) {
  232. init();
  233. }
  234. void destroy (void);
  235. ~GameObjectManager (void) {
  236. destroy();
  237. }
  238. void init (char* objTypeDataFile, long objTypeCacheSize, long objCacheSize);
  239. void setNumObjects (long nMechs,
  240. long nVehicles,
  241. long nElementals,
  242. long nTerrainObjects,
  243. long nBuildings,
  244. long nTurrets,
  245. long nWeapons,
  246. long nCarnage,
  247. long nLights,
  248. long nArtillery,
  249. long nGates);
  250. long getNumObjects (void) {
  251. return(numMechs +
  252. numVehicles +
  253. numElementals +
  254. numTerrainObjects +
  255. numBuildings +
  256. numTurrets +
  257. numWeapons +
  258. numCarnage +
  259. numLights +
  260. numArtillery +
  261. numGates);
  262. }
  263. long getMaxObjects (void) {
  264. return(maxMechs +
  265. maxVehicles +
  266. numElementals +
  267. numTerrainObjects +
  268. numBuildings +
  269. numTurrets +
  270. numWeapons +
  271. numCarnage +
  272. numLights +
  273. numArtillery +
  274. numGates);
  275. }
  276. long load (File* gameFile);
  277. long save (File* gameFile);
  278. BattleMechPtr newMech (void);
  279. GroundVehiclePtr newVehicle (void);
  280. void freeMover (MoverPtr mover);
  281. void tradeMover (MoverPtr mover, long newTeamID, long newCommanderID);
  282. #ifdef USE_ELEMENTAL
  283. BattleMechPtr addElemental (void);
  284. #endif
  285. BattleMechPtr getMech (long mechIndex);
  286. GroundVehiclePtr getVehicle (long vehicleIndex);
  287. GroundVehiclePtr getOpenVehicle (void);
  288. ElementalPtr getElemental (long elementalIndex);
  289. TerrainObjectPtr getTerrainObject (long terrainObjectIndex);
  290. BuildingPtr getBuilding (long buildingIndex);
  291. TurretPtr getTurret (long turretIndex);
  292. GatePtr getGate (long gateIndex);
  293. WeaponBoltPtr getWeapon (void); //gets next available weapon.
  294. CarnagePtr getCarnage (CarnageEnumType carnageType);
  295. void releaseCarnage (CarnagePtr obj);
  296. LightPtr getLight (void);
  297. void releaseLight (LightPtr obj);
  298. ArtilleryPtr getArtillery (void);
  299. long getNumArtillery (void) {
  300. return(numArtillery);
  301. }
  302. ArtilleryPtr getArtillery (long artilleryIndex) {
  303. return(artillery[artilleryIndex]);
  304. }
  305. long getNumGateControls (void) {
  306. return(numGateControls);
  307. }
  308. long getNumTurretControls (void) {
  309. return(numTurretControls);
  310. }
  311. BuildingPtr getGateControl (long index) {
  312. return(gateControls[index]);
  313. }
  314. BuildingPtr getTurretControl (long index) {
  315. return(turretControls[index]);
  316. }
  317. void countTerrainObjects (PacketFile* pFile, long firstHandle);
  318. void loadTerrainObjects ( PacketFile* pFile, volatile float& progress, float progressRange );
  319. long getSpecificObjects (long objClass, long objSubType, GameObjectPtr* objects, long maxObjects);
  320. GameObjectPtr getObjBlockObject (long blockNumber, long objLocalIndex) {
  321. return(objList[Terrain::objBlockInfo[blockNumber].firstHandle + objLocalIndex]);
  322. }
  323. long getObjBlockNumObjects (long blockNumber) {
  324. return(Terrain::objBlockInfo[blockNumber].numObjects);
  325. }
  326. long getObjBlockNumCollidables (long blockNumber) {
  327. return(Terrain::objBlockInfo[blockNumber].numCollidableObjects);
  328. }
  329. long getObjBlockFirstHandle (long blockNumber) {
  330. return(Terrain::objBlockInfo[blockNumber].firstHandle);
  331. }
  332. long getNumMechs (void) {
  333. return(numMechs);
  334. }
  335. long getNumVehicles (void) {
  336. return(numVehicles);
  337. }
  338. long getNumMovers (void) {
  339. return(numMovers);
  340. }
  341. long getMaxMovers (void) {
  342. return(maxMovers);
  343. }
  344. long getNumGoodMovers (void) {
  345. return(numGoodMovers);
  346. }
  347. long getNumBadMovers (void) {
  348. return(numBadMovers);
  349. }
  350. long getNumTerrainObjects (void) {
  351. return(numTerrainObjects);
  352. }
  353. long getNumBuildings (void) {
  354. return(numBuildings);
  355. }
  356. long getNumTurrets (void) {
  357. return(numTurrets);
  358. }
  359. long getNumGates (void) {
  360. return(numGates);
  361. }
  362. void render (bool terrain, bool movers, bool other);
  363. void renderShadows (bool terrain, bool movers, bool other);
  364. void update (bool terrain, bool movers, bool other);
  365. void updateAppearancesOnly( bool terrain, bool mover, bool other);
  366. GameObjectPtr get (long handle);
  367. GameObjectPtr getByWatchID (unsigned long watchID) {
  368. if ((watchID > 0) && (watchID < nextWatchID))
  369. return(watchList[watchID]);
  370. return(NULL);
  371. }
  372. long buildMoverLists (void);
  373. bool modifyMoverLists (MoverPtr mover, long action);
  374. MoverPtr getMover (long index) {
  375. return(moverList[index]);
  376. }
  377. MoverPtr getGoodMover (long index) {
  378. return(goodMoverList[index]);
  379. }
  380. MoverPtr getBadMover (long index) {
  381. return(badMoverList[index]);
  382. }
  383. GameObjectPtr findObject (Stuff::Vector3D position);
  384. GameObjectPtr findByPartId (long partId);
  385. GameObjectPtr findByBlockVertex (long blockNum, long vertex);
  386. GameObjectPtr findByCellPosition (long row, long col);
  387. GameObjectPtr findByUnitInfo (long commander, long group, long mate);
  388. GameObjectPtr findObjectByTypeHandle (long typeHandle);
  389. GameObjectPtr findObjectByMouse (long mouseX, long mouseY);
  390. bool moverInRect(long index, Stuff::Vector3D &dStart, Stuff::Vector3D &dEnd);
  391. ObjectTypePtr loadObjectType (ObjectTypeNumber typeHandle);
  392. ObjectTypePtr getObjectType (ObjectTypeNumber typeHandle);
  393. void removeObjectType (ObjectTypeNumber typeHandle);
  394. GameObjectHandle getHandle (GameObjectPtr obj);
  395. long calcPartId (long objectClass, long param1 = 0, long param2 = 0, long param3 = 0);
  396. void setPartId (GameObjectPtr obj, long param1 = 0, long param2 = 0, long param3 = 0);
  397. long buildCollidableList (void);
  398. long initCollisionSystem (FitIniFile* missionFile);
  399. long getCollidableList (GameObjectPtr*& objList);
  400. long updateCollisions (void);
  401. void detectStaticCollision (GameObjectPtr obj1, GameObjectPtr obj2);
  402. void updateCaptureList (void);
  403. bool GameObjectManager::isTeamCapturing (TeamPtr team, GameObjectWatchID targetWID);
  404. CarnagePtr createFire (ObjectTypeNumber fireObjTypeHandle,
  405. GameObjectPtr owner,
  406. Stuff::Vector3D& position,
  407. float tonnage);
  408. CarnagePtr createExplosion (long effectId,
  409. GameObjectPtr owner,
  410. Stuff::Vector3D& position,
  411. float dmg = 0.0,
  412. float radius = 0.0);
  413. LightPtr createLight (ObjectTypeNumber lightObjTypeHandle);
  414. WeaponBoltPtr createWeaponBolt (long effectId);
  415. ArtilleryPtr createArtillery (long artilleryType, Stuff::Vector3D& position);
  416. RemovedMoverRec* getRemovedMovers (long& numRemovedMovers) {
  417. numRemovedMovers = numRemoved;
  418. return(moversRemoved);
  419. }
  420. bool isRemoved (MoverPtr mover);
  421. void setWatchID (GameObjectPtr obj);
  422. void CopyTo (ObjectManagerData *data);
  423. void CopyFrom (ObjectManagerData *data);
  424. long Save (PacketFilePtr file, long packetNum);
  425. long Load (PacketFilePtr file, long packetNum);
  426. };
  427. extern GameObjectManagerPtr ObjectManager;
  428. //***************************************************************************
  429. #endif