asteroidigc.h 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. /*
  2. ** Copyright (C) 1996, 1997 Microsoft Corporation. All Rights Reserved.
  3. **
  4. ** File: asteroidIGC.h
  5. **
  6. ** Author:
  7. **
  8. ** Description:
  9. ** Header for the CasteroidIGC class. This file was initially created by
  10. ** the ATL wizard.
  11. **
  12. ** History:
  13. */
  14. // asteroidIGC.h : Declaration of the CasteroidIGC
  15. #ifndef __ASTEROIDIGC_H_
  16. #define __ASTEROIDIGC_H_
  17. #include "modelIGC.h"
  18. class CasteroidIGC : public TmodelIGC<IasteroidIGC>
  19. {
  20. public:
  21. CasteroidIGC(void)
  22. :
  23. m_fraction(1.0f)
  24. {
  25. }
  26. // IbaseIGC
  27. virtual HRESULT Initialize(ImissionIGC* pMission, Time now, const void* data, int dataSize);
  28. virtual void Terminate(void)
  29. {
  30. if (m_pbuildingEffect)
  31. {
  32. //The building effect gets terminated along with the asteroid
  33. m_pbuildingEffect->Terminate();
  34. assert (m_pbuildingEffect == NULL);
  35. }
  36. GetMyMission()->DeleteAsteroid(this);
  37. TmodelIGC<IasteroidIGC>::Terminate();
  38. }
  39. virtual int Export(void* data) const;
  40. virtual void Update(Time now)
  41. {
  42. if (((m_asteroidDef.aabmCapabilities & c_aabmMineHe3) != 0) &&
  43. (m_asteroidDef.ore < m_asteroidDef.oreMax))
  44. {
  45. float dOre = (now - GetMyLastUpdate()) * GetMyMission()->GetFloatConstant(c_fcidHe3Regeneration);
  46. dOre *= (m_asteroidDef.oreMax - m_asteroidDef.ore);
  47. m_asteroidDef.ore += dOre;
  48. }
  49. TmodelIGC<IasteroidIGC>::Update(now);
  50. //If there is an active building effect ... call the building effect to do the
  51. //update so that ... if the building effect completes ... it is being done from
  52. //the asteroid update
  53. if (m_pbuildingEffect)
  54. m_pbuildingEffect->AsteroidUpdate(now);
  55. }
  56. virtual ObjectType GetObjectType(void) const
  57. {
  58. return OT_asteroid;
  59. }
  60. virtual ObjectID GetObjectID(void) const
  61. {
  62. return m_asteroidDef.asteroidID;
  63. }
  64. // ImodelIGC
  65. virtual void SetCluster(IclusterIGC* cluster)
  66. {
  67. AddRef();
  68. //Overrride the model's cluster method so that we can maintain the cluster's asteroid list
  69. //(as well as letting the model maintain its model list)
  70. {
  71. IclusterIGC* c = GetCluster();
  72. if (c)
  73. c->DeleteAsteroid(this);
  74. }
  75. TmodelIGC<IasteroidIGC>::SetCluster(cluster);
  76. if (cluster)
  77. cluster->AddAsteroid(this);
  78. Release();
  79. }
  80. // IdamageIGC
  81. virtual DamageResult ReceiveDamage(DamageTypeID type,
  82. float amount,
  83. Time timeCollision,
  84. const Vector& position1,
  85. const Vector& position2,
  86. ImodelIGC* launcher)
  87. {
  88. DamageResult dr = c_drHullDamage;
  89. amount *= GetMyMission()->GetDamageConstant(type, c_defidAsteroid);
  90. if (amount < 0.0f)
  91. {
  92. m_fraction -= amount / float(m_asteroidDef.hitpoints);
  93. if (m_fraction > 1.0f)
  94. m_fraction = 1.0f;
  95. }
  96. else if (amount != 0.0f)
  97. {
  98. float oldFraction = m_fraction;
  99. assert (m_asteroidDef.hitpoints != 0);
  100. m_fraction -= amount / float(m_asteroidDef.hitpoints);
  101. GetMission()->GetIgcSite()->PlaySoundEffect(rockHitSound, this,
  102. GetOrientation().TimesInverse(position2 - position1));
  103. if (m_fraction <= 0.0f)
  104. {
  105. m_fraction = 0.0f;
  106. if (oldFraction > 0.0f)
  107. {
  108. GetMyMission()->GetIgcSite()->KillAsteroidEvent(this, true);
  109. dr = c_drKilled;
  110. }
  111. }
  112. return ((type & c_dmgidNoDebris) == 0);
  113. }
  114. return dr;
  115. }
  116. virtual float GetFraction(void) const
  117. {
  118. return m_fraction;
  119. }
  120. virtual void SetFraction(float newVal)
  121. {
  122. m_fraction = newVal;
  123. }
  124. virtual float GetHitPoints(void) const
  125. {
  126. return m_fraction * float(m_asteroidDef.hitpoints);
  127. }
  128. // IasteroidIGC
  129. virtual float GetOre(void) const
  130. {
  131. return m_asteroidDef.ore;
  132. }
  133. virtual void SetOre(float newVal)
  134. {
  135. /* NYI -- re-enable if He3 does not regenerate
  136. if ((newVal == 0.0f) &&
  137. ((m_asteroidDef.aabmCapabilities & (c_aabmMineHe3 | c_aabmMineGold)) != 0))
  138. {
  139. m_asteroidDef.aabmCapabilities &= ~(c_aabmMineHe3 | c_aabmMineGold);
  140. char bfr[c_cbName];
  141. strcpy(bfr, GetName());
  142. SetSecondaryName(bfr);
  143. const AsteroidDef& ad = IasteroidIGC::GetTypeDefaults(m_asteroidDef.aabmCapabilities);
  144. SetIcon(GetMyMission()->GetIgcSite()->LoadRadarIcon(ad.iconName));
  145. }
  146. */
  147. m_asteroidDef.ore = newVal;
  148. }
  149. virtual float MineOre(float newVal)
  150. {
  151. if (m_asteroidDef.ore < newVal)
  152. {
  153. newVal = m_asteroidDef.ore;
  154. m_asteroidDef.ore = 0.0f;
  155. /* NYI -- re-enable if He3 does not regenerate
  156. GetMyMission()->GetIgcSite()->DrainAsteroidEvent(this);
  157. */
  158. }
  159. else
  160. m_asteroidDef.ore -= newVal;
  161. return newVal;
  162. }
  163. virtual AsteroidAbilityBitMask GetCapabilities(void) const
  164. {
  165. return m_pbuildingEffect ? 0 : m_asteroidDef.aabmCapabilities;
  166. }
  167. virtual bool HasCapability(AsteroidAbilityBitMask aabm) const
  168. {
  169. return m_pbuildingEffect ? false : ((m_asteroidDef.aabmCapabilities & aabm) != 0);
  170. }
  171. virtual IbuildingEffectIGC* GetBuildingEffect(void) const
  172. {
  173. return m_pbuildingEffect;
  174. }
  175. virtual void SetBuildingEffect(IbuildingEffectIGC* pbe)
  176. {
  177. if (m_pbuildingEffect)
  178. {
  179. assert (pbe == NULL);
  180. m_pbuildingEffect->MakeUnhitable();
  181. }
  182. m_pbuildingEffect = pbe;
  183. }
  184. private:
  185. AsteroidDef m_asteroidDef;
  186. float m_fraction;
  187. TRef<IbuildingEffectIGC> m_pbuildingEffect;
  188. };
  189. #endif //__ASTEROIDIGC_H_