artlry.h 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. //***************************************************************************
  2. //
  3. // artillery.h -- File contains the artillery strike Object Class
  4. //
  5. // MechCommander 2
  6. //
  7. //---------------------------------------------------------------------------//
  8. // Copyright (C) Microsoft Corporation. All rights reserved. //
  9. //===========================================================================//
  10. #ifndef ARTLRY_H
  11. #define ARTLRY_H
  12. //---------------------------------------------------------------------------
  13. #ifndef DARTLRY_H
  14. #include "dartlry.h"
  15. #endif
  16. #ifndef GAMEOBJ_H
  17. #include "gameobj.h"
  18. #endif
  19. #ifndef OBJTYPE_H
  20. #include "objtype.h"
  21. #endif
  22. #ifndef CONTACT_H
  23. #include "contact.h"
  24. #endif
  25. #include <gosFX\gosfxheaders.hpp>
  26. //***************************************************************************
  27. #define NO_RAM_FOR_ARTY 0xDEFD0000
  28. #define NO_RAM_FOR_ARTY_SHAPES 0xDEFD0001
  29. #define NO_RAM_FOR_ARTILLERY 0xDEFD0002
  30. #define NO_APPEARANCE_TYPE_FOR_ARTY 0xDEFD0003
  31. #define NO_APPEARANCE_FOR_ARTY 0xDEFD0004
  32. #define APPEARANCE_NOT_VFX_APPEAR 0xDCDC0009
  33. #define CLAN_SEEN_FLAG 2
  34. #define IS_SEEN_FLAG 1
  35. #define MAX_ARTILLERY_EXPLOSIONS 32
  36. //***************************************************************************
  37. class ArtilleryChunk {
  38. public:
  39. char commanderId;
  40. char strikeType;
  41. long cellRC[2];
  42. char secondsToImpact;
  43. unsigned long data;
  44. public:
  45. void* operator new (size_t mySize);
  46. void operator delete (void* us);
  47. void init (void) {
  48. commanderId = -1;
  49. strikeType = -1;
  50. cellRC[0] = -1;
  51. cellRC[1] = -1;
  52. secondsToImpact = -1;
  53. data = 0;
  54. }
  55. void destroy (void) {
  56. }
  57. ArtilleryChunk (void) {
  58. init();
  59. }
  60. ~ArtilleryChunk (void) {
  61. destroy();
  62. }
  63. void build (long commanderId,
  64. long strikeType,
  65. Stuff::Vector3D location,
  66. long seconds);
  67. void pack (void);
  68. void unpack (void);
  69. bool equalTo (ArtilleryChunkPtr chunk);
  70. };
  71. //***************************************************************************
  72. class ArtilleryType : public ObjectType {
  73. public:
  74. MemoryPtr frameList; //Pointer to JMiles shape file binary
  75. unsigned long frameCount; //Number of frames in shape file
  76. unsigned long startFrame; //Frame in List to start with.
  77. float frameRate; //Speed at which frames playback
  78. float nominalTimeToImpact;
  79. float nominalTimeToLaunch;
  80. float nominalDamage;
  81. float nominalMajorRange;
  82. float nominalMajorHits;
  83. float nominalMinorRange;
  84. float nominalMinorHits;
  85. float nominalSensorTime;
  86. float nominalSensorRange;
  87. float fontScale;
  88. float fontXOffset;
  89. float fontYOffset;
  90. unsigned long fontColor;
  91. long numExplosions;
  92. float* explosionOffsetX;
  93. float* explosionOffsetY;
  94. float* explosionDelay;
  95. long numExplosionsPerExplosion;
  96. long explosionRandomX;
  97. long explosionRandomY;
  98. long minArtilleryHeadRange;
  99. public:
  100. void init (void);
  101. ArtilleryType (void) {
  102. init();
  103. }
  104. virtual long init (FilePtr objFile, unsigned long fileSize);
  105. long init (FitIniFilePtr objFile);
  106. ~ArtilleryType (void) {
  107. destroy();
  108. }
  109. virtual void destroy (void);
  110. virtual GameObjectPtr createInstance (void);
  111. virtual bool handleCollision (GameObjectPtr collidee, GameObjectPtr collider);
  112. virtual bool handleDestruction (GameObjectPtr collidee, GameObjectPtr collider);
  113. };
  114. //***************************************************************************
  115. typedef union _ArtilleryInfo {
  116. struct {
  117. float timeToImpact; //Time until strike goes off.
  118. float timeToLaunch; //Time until strike is launched (and unmoveable).
  119. float sensorRange; //If I am a sensor round, how big a range.
  120. float timeToBlind; //How long do I return sensor data.
  121. short sensorSystemIndex;
  122. float contactUpdate;
  123. char timeString[5];
  124. unsigned long explosionOffFlags;
  125. } strike;
  126. } ArtilleryInfo;
  127. typedef struct _ArtilleryData : public GameObjectData
  128. {
  129. char artilleryType;
  130. char teamId;
  131. char commanderId;
  132. ArtilleryInfo info;
  133. long effectId;
  134. bool bombRunStarted;
  135. bool inView;
  136. Stuff::Vector3D iFacePosition;
  137. } ArtilleryData;
  138. class Artillery : public GameObject
  139. {
  140. //-------------
  141. // Data Members
  142. public:
  143. char artilleryType;
  144. char teamId;
  145. char commanderId;
  146. ArtilleryInfo info;
  147. long effectId;
  148. gosFX::Effect *hitEffect;
  149. gosFX::Effect *rightContrail;
  150. gosFX::Effect *leftContrail;
  151. Appearance *bomber;
  152. bool bombRunStarted;
  153. bool inView;
  154. Stuff::Vector3D iFacePosition;
  155. //Member Functions
  156. //-----------------
  157. public:
  158. virtual void init (bool create);
  159. virtual void init (bool create, long _artilleryType);
  160. Artillery (void) : GameObject()
  161. {
  162. init(true);
  163. }
  164. ~Artillery (void)
  165. {
  166. destroy();
  167. }
  168. bool recalcBounds (CameraPtr myEye);
  169. void setArtilleryData (float impactTime)
  170. {
  171. info.strike.timeToImpact = impactTime;
  172. info.strike.timeToLaunch = impactTime - 10;
  173. }
  174. virtual void setSensorRange (float range);
  175. void setSensorData (TeamPtr team, float sensorTime = -1.0, float range = -1.0);
  176. void setJustCreated (void);
  177. float getTimeToImpact (void)
  178. {
  179. return(info.strike.timeToImpact);
  180. }
  181. float getTimeToLaunch (void)
  182. {
  183. return(info.strike.timeToLaunch);
  184. }
  185. bool launched (void)
  186. {
  187. return(info.strike.timeToLaunch <= 0);
  188. }
  189. bool impacted(void)
  190. {
  191. return(info.strike.timeToImpact <= 0);
  192. }
  193. void drawSelectBox (unsigned char color);
  194. bool isStrike (void)
  195. {
  196. static bool lookup[NUM_ARTILLERY_TYPES] = {true, true, false};
  197. return(lookup[artilleryType]);
  198. }
  199. bool isSensor (void)
  200. {
  201. static bool lookup[NUM_ARTILLERY_TYPES] = {false, false, true};
  202. return(lookup[artilleryType]);
  203. }
  204. virtual void destroy (void);
  205. virtual long update (void);
  206. virtual void render (void);
  207. virtual void init (bool create, ObjectTypePtr _type);
  208. virtual long kill (void)
  209. {
  210. return(NO_ERR);
  211. }
  212. virtual void setCommanderId (long _commanderId);
  213. virtual long getCommanderId (void)
  214. {
  215. return commanderId;
  216. }
  217. virtual long setTeamId (long _teamId, bool setup);
  218. virtual long getTeamId (void)
  219. {
  220. return(teamId);
  221. }
  222. virtual bool isFriendly (TeamPtr team);
  223. virtual bool isEnemy (TeamPtr team);
  224. virtual bool isNeutral (TeamPtr team);
  225. virtual TeamPtr getTeam (void);
  226. virtual long handleWeaponHit (WeaponShotInfoPtr shotInfo, bool addMultiplayChunk = false);
  227. virtual void handleStaticCollision (void);
  228. virtual void Save (PacketFilePtr file, long packetNum);
  229. void Load (ArtilleryData *data);
  230. void CopyTo (ArtilleryData *data);
  231. };
  232. //---------------------------------------------------------------------------
  233. extern void CallArtillery (long commanderId,
  234. long strikeType,
  235. Stuff::Vector3D strikeLoc,
  236. long secondsToImpact,
  237. bool randomOffset);
  238. extern void IfaceCallStrike (long strikeID,
  239. Stuff::Vector3D* strikeLoc,
  240. GameObjectPtr strikeTarget,
  241. bool playerStrike = true,
  242. bool clanStrike = false,
  243. float timeToImpact = -1.00);
  244. //---------------------------------------------------------------------------
  245. #endif