stationIGC.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744
  1. /*
  2. ** Copyright (C) 1996, 1997 Microsoft Corporation. All Rights Reserved.
  3. **
  4. ** File: stationIGC.cpp
  5. **
  6. ** Author:
  7. **
  8. ** Description:
  9. ** Implementation of the CstationIGC class. This file was initially created by
  10. ** the ATL wizard for the core object.
  11. **
  12. ** History:
  13. */
  14. // stationIGC.cpp : Implementation of CstationIGC
  15. #include "pch.h"
  16. #include "stationIGC.h"
  17. #include <math.h>
  18. /////////////////////////////////////////////////////////////////////////////
  19. // CstationIGC
  20. HRESULT CstationIGC::Initialize(ImissionIGC* pMission, Time now, const void* data, int dataSize)
  21. {
  22. TmodelIGC<IstationIGC>::Initialize(pMission, now, data, dataSize);
  23. HRESULT rc = S_OK;
  24. debugf("Station initialize %d\n", ((DataStationIGC*)data)->stationID);
  25. ZRetailAssert (data && (dataSize == sizeof(DataStationIGC)));
  26. {
  27. DataStationIGC* dataStation = (DataStationIGC*)data;
  28. //Does this station already exist
  29. IstationIGC* pstation = pMission->GetStation(dataStation->stationID);
  30. if (pstation)
  31. {
  32. //Uh-oh ... black magic time.
  33. //The station already exists, so modify it by changing (the pre-existing) station's hull type and name.
  34. pstation->SetBaseStationType(pMission->GetStationType(dataStation->stationTypeID));
  35. pstation->SetName(dataStation->name);
  36. pstation->SetFraction(dataStation->bpHull);
  37. pstation->SetShieldFraction(dataStation->bpShield);
  38. //Certain things should not be changed by the export
  39. assert (pstation->GetSide()->GetObjectID() == dataStation->sideID);
  40. assert (pstation->GetCluster()->GetObjectID() == dataStation->clusterID);
  41. //Set the return code so the existing object is not terminated
  42. rc = E_ABORT;
  43. }
  44. else
  45. {
  46. m_stationID = dataStation->stationID;
  47. SetBaseStationType(pMission->GetStationType(dataStation->stationTypeID));
  48. assert (m_myStationType.GetStationType());
  49. SetPosition(dataStation->position);
  50. {
  51. Orientation o(dataStation->forward, dataStation->up);
  52. SetOrientation(o);
  53. }
  54. SetRotation(dataStation->rotation);
  55. SetName(dataStation->name);
  56. SetSide(pMission->GetSide(dataStation->sideID));
  57. IclusterIGC* cluster = pMission->GetCluster(dataStation->clusterID);
  58. assert (cluster);
  59. SetCluster(cluster);
  60. pMission->AddStation(this);
  61. //Let the IGC site know about the new station
  62. GetMyMission()->GetIgcSite()->StationTypeChange(this);
  63. m_hullFraction = dataStation->bpHull;
  64. SetShieldFraction(dataStation->bpShield);
  65. }
  66. m_timeLastDamageReport = now;
  67. }
  68. return rc;
  69. }
  70. int CstationIGC::Export(void* data) const
  71. {
  72. if (data)
  73. {
  74. DataStationIGC* dataStation = (DataStationIGC*)data;
  75. dataStation->stationTypeID = m_myStationType.GetObjectID();
  76. dataStation->stationID = m_stationID;
  77. dataStation->position = GetPosition();
  78. {
  79. const Orientation& o = GetOrientation();
  80. dataStation->forward = o.GetForward();
  81. dataStation->up = o.GetUp();
  82. }
  83. dataStation->rotation = GetRotation();
  84. assert (GetCluster());
  85. dataStation->clusterID = GetCluster()->GetObjectID();
  86. UTL::putName(dataStation->name, GetName());
  87. dataStation->sideID = GetSide()->GetObjectID();
  88. dataStation->bpHull = m_hullFraction;
  89. dataStation->bpShield = m_shieldFraction;
  90. }
  91. return sizeof(DataStationIGC);
  92. }
  93. DamageResult CstationIGC::ReceiveDamage(DamageTypeID type,
  94. float amount,
  95. Time timeCollision,
  96. const Vector& position1,
  97. const Vector& position2,
  98. ImodelIGC* launcher)
  99. {
  100. IsideIGC* pside = GetSide();
  101. const MissionParams* pmp = GetMyMission()->GetMissionParams();
  102. if (pmp->bInvulnerableStations ||
  103. (m_myStationType.HasCapability(c_sabmPedestal)) ||
  104. (launcher && (amount >= 0.0f) &&
  105. (!GetMyMission()->GetMissionParams()->bAllowFriendlyFire) &&
  106. (pside == launcher->GetSide())))
  107. {
  108. return c_drNoDamage;
  109. }
  110. DamageResult dr;
  111. float maxArmor = (float)m_myStationType.GetMaxArmorHitPoints();
  112. float dtmArmor = GetMyMission()->GetDamageConstant(type, m_myStationType.GetArmorDefenseType());
  113. assert (dtmArmor >= 0.0f);
  114. if (amount < 0.0f)
  115. {
  116. m_hullFraction -= amount * dtmArmor / maxArmor;
  117. if (m_hullFraction > 1.0f)
  118. m_hullFraction = 1.0f;
  119. else
  120. GetThingSite ()->RemoveDamage (m_hullFraction);
  121. dr = c_drNoDamage;
  122. }
  123. else
  124. {
  125. float dtmShield = GetMyMission()->GetDamageConstant(type, m_myStationType.GetShieldDefenseType());
  126. if (dtmShield != 0.0f)
  127. {
  128. dr = c_drShieldDamage;
  129. if (launcher && (launcher->GetObjectType() == OT_ship))
  130. amount *= ((IshipIGC*)launcher)->GetExperienceMultiplier();
  131. IIgcSite* pigc = GetMyMission()->GetIgcSite();
  132. pigc->DamageStationEvent(this, launcher, type, amount);
  133. float maxShield = (float)m_myStationType.GetMaxShieldHitPoints();
  134. float absorbed = amount * dtmShield / maxShield;
  135. if (m_shieldFraction >= absorbed)
  136. {
  137. SetShieldFraction(m_shieldFraction - absorbed);
  138. }
  139. else
  140. {
  141. if (dtmArmor != 0.0f)
  142. {
  143. dr = c_drHullDamage;
  144. absorbed -= m_shieldFraction;
  145. if (m_hullFraction > 0.0f)
  146. {
  147. float dmg = (absorbed * maxShield * dtmArmor) / (maxArmor * dtmShield);
  148. m_hullFraction -= dmg;
  149. if (m_hullFraction <= 0.0f)
  150. {
  151. m_hullFraction = 0.0f;
  152. pigc->KillStationEvent(this, launcher, amount);
  153. dr = c_drKilled;
  154. }
  155. else if ((type & c_dmgidNoDebris) == 0)
  156. GetThingSite ()->AddDamage (position2 - position1, m_hullFraction);
  157. }
  158. }
  159. SetShieldFraction(0.0f);
  160. }
  161. }
  162. else
  163. dr = c_drNoDamage;
  164. }
  165. return dr;
  166. }
  167. void CstationIGC::SetBaseStationType(IstationTypeIGC* pst)
  168. {
  169. assert (pst);
  170. IclusterIGC* pclusterOld;
  171. Vector positionOld;
  172. Orientation orientationOld;
  173. Rotation rotationOld;
  174. if (m_myStationType.GetStationType())
  175. {
  176. assert (GetSide());
  177. pclusterOld = GetCluster();
  178. positionOld = GetPosition();
  179. orientationOld = GetOrientation();
  180. rotationOld = GetRotation();
  181. //Move the station to the null cluster while all the black magic happens
  182. SetCluster(NULL);
  183. FreeThingSite();
  184. }
  185. else
  186. assert (!GetSide());
  187. m_myStationType.SetStationType(pst);
  188. {
  189. HRESULT rc = Load(0,
  190. m_myStationType.GetModelName(),
  191. m_myStationType.GetTextureName(),
  192. m_myStationType.GetIconName(),
  193. c_mtStatic | c_mtDamagable | c_mtHitable | c_mtSeenBySide | c_mtPredictable | c_mtScanner);
  194. assert (SUCCEEDED(rc));
  195. }
  196. SetRadius(m_myStationType.GetRadius());
  197. SetMass(0.0f);
  198. SetSignature(m_myStationType.GetSignature());
  199. m_undockPosition = 0;
  200. IsideIGC* pside = GetSide();
  201. if (pside)
  202. {
  203. //Set the station hit test to allow ships of its own side to enter its shields
  204. HitTest* pht = GetHitTest();
  205. pht->SetUseTrueShapeSelf(pside);
  206. pht->SetShape(c_htsConvexHullMax);
  207. //We have a side, which means we had a station type before (see above) and the following
  208. //data is valid:
  209. SetPosition(positionOld);
  210. SetOrientation(orientationOld);
  211. SetRotation(rotationOld);
  212. SetCluster(pclusterOld);
  213. //The upgrade really should not be less capable than its predecessor but let's be paranoid
  214. pside->ResetBuildingTechs();
  215. //Let the IGC site know
  216. GetMyMission()->GetIgcSite()->StationTypeChange(this);
  217. }
  218. }
  219. void CstationIGC::AddShip(IshipIGC* pship)
  220. {
  221. AddIbaseIGC((BaseListIGC*)&m_shipsDocked, pship);
  222. //At a station implies not in a cluster
  223. pship->SetCluster(NULL);
  224. }
  225. void CstationIGC::DeleteShip(IshipIGC* s)
  226. {
  227. DeleteIbaseIGC((BaseListIGC*)&m_shipsDocked, s);
  228. }
  229. IshipIGC* CstationIGC::GetShip(ShipID id) const
  230. {
  231. return (IshipIGC*)GetIbaseIGC((BaseListIGC*)&m_shipsDocked, id);
  232. }
  233. const ShipListIGC* CstationIGC::GetShips(void) const
  234. {
  235. return &m_shipsDocked;
  236. }
  237. void CstationIGC::Launch(IshipIGC* pship)
  238. {
  239. Orientation orientation;
  240. Vector position;
  241. position.x = random(-0.5f, 0.5f);
  242. position.y = random(-0.5f, 0.5f);
  243. position.z = random(-0.5f, 0.5f);
  244. Vector forward;
  245. const Orientation& o = GetOrientation();
  246. float vLaunch = GetMyMission()->GetFloatConstant(c_fcidExitStationSpeed);
  247. int nLaunchSlots = m_myStationType.GetLaunchSlots();
  248. if (nLaunchSlots == 0)
  249. {
  250. switch (m_undockPosition++)
  251. {
  252. case 4:
  253. {
  254. m_undockPosition = 0;
  255. }
  256. //No break
  257. case 0:
  258. {
  259. forward = o.GetRight();
  260. }
  261. break;
  262. case 1:
  263. {
  264. forward = o.GetUp();
  265. }
  266. break;
  267. case 2:
  268. {
  269. forward = -o.GetRight();
  270. }
  271. break;
  272. case 3:
  273. {
  274. forward = -o.GetUp();
  275. }
  276. break;
  277. }
  278. position += forward * (GetRadius() + pship->GetRadius() + vLaunch * 0.5f);
  279. }
  280. else
  281. {
  282. position += m_myStationType.GetLaunchPosition(m_undockPosition) * o;
  283. forward = m_myStationType.GetLaunchDirection(m_undockPosition) * o;
  284. position += forward * (pship->GetRadius() + vLaunch * 0.5f);
  285. m_undockPosition = (m_undockPosition + 1) % nLaunchSlots;
  286. }
  287. orientation.Set(forward, o.GetForward());
  288. IclusterIGC* pcluster = GetCluster();
  289. Time lastUpdate = pcluster->GetLastUpdate();
  290. pship->SetPosition(position + GetPosition());
  291. pship->SetOrientation(orientation);
  292. pship->SetVelocity(forward * vLaunch);
  293. pship->SetCurrentTurnRate(c_axisYaw, 0.0f);
  294. pship->SetCurrentTurnRate(c_axisPitch, 0.0f);
  295. pship->SetCurrentTurnRate(c_axisRoll, 0.0f);
  296. pship->SetCluster(pcluster);
  297. }
  298. bool CstationIGC::InGarage(IshipIGC* pship, const Vector& position)
  299. {
  300. bool bInside = false;
  301. int i = (pship->GetBaseHullType()->HasCapability(c_habmFighter)
  302. ? m_myStationType.GetLandSlots()
  303. : m_myStationType.GetCapLandSlots()) - 1;
  304. if (i >= 0)
  305. {
  306. HitTest* pht = pship->GetHitTest();
  307. HitTestShape kMax = pht->GetTrueShape();
  308. HitTestShape kMin;
  309. if (kMax > 0)
  310. {
  311. assert (kMax != 0);
  312. kMin = 0;
  313. }
  314. else
  315. {
  316. kMin = kMax++;
  317. }
  318. const Orientation& orientationStation = GetOrientation();
  319. const Orientation& orientationShip = pship->GetOrientation();
  320. Vector dp = position - GetPosition();
  321. do
  322. {
  323. int j = m_myStationType.GetLandPlanes(i) - 1;
  324. assert (j >= 0);
  325. do
  326. {
  327. Vector direction = m_myStationType.GetLandDirection(i, j) * orientationStation;
  328. Vector point = m_myStationType.GetLandPosition(i, j) * orientationStation;
  329. int k = kMin;
  330. do
  331. {
  332. Vector pMin = pht->GetMinExtreme(k, dp, orientationShip, direction);
  333. if ((pMin - point) * direction < 0.0f)
  334. break;
  335. }
  336. while (++k < kMax);
  337. if (k < kMax)
  338. break;
  339. }
  340. while (j-- > 0);
  341. if (j == -1)
  342. {
  343. //Found a place to land
  344. bInside = true;
  345. break;
  346. }
  347. }
  348. while (i-- > 0);
  349. }
  350. return bInside;
  351. }
  352. void CstationIGC::RepairAndRefuel(IshipIGC* pship) const
  353. {
  354. assert ((pship->GetParentShip() == NULL) && (pship->GetBaseHullType() != NULL));
  355. //Fully mount all parts
  356. {
  357. for (PartLinkIGC* ppl = pship->GetParts()->first();
  358. (ppl != NULL);
  359. ppl = ppl->next())
  360. {
  361. ppl->data()->SetMountedFraction(1.0f);
  362. }
  363. }
  364. if (m_myStationType.HasCapability(c_sabmRepair))
  365. {
  366. pship->SetFraction(1.0f);
  367. }
  368. {
  369. IafterburnerIGC* a = (IafterburnerIGC*)(pship->GetMountedPart(ET_Afterburner, 0));
  370. if (a)
  371. a->Deactivate();
  372. }
  373. {
  374. IshieldIGC* s = (IshieldIGC*)(pship->GetMountedPart(ET_Shield, 0));
  375. if (s)
  376. s->SetFraction(1.0f);
  377. }
  378. {
  379. IafterburnerIGC* pafter = (IafterburnerIGC*)(pship->GetMountedPart(ET_Afterburner, 0));
  380. if (pafter)
  381. pafter->Deactivate();
  382. }
  383. //Give a full load of fuel and ammo
  384. const IhullTypeIGC* pht = pship->GetHullType();
  385. if (m_myStationType.HasCapability(c_sabmReload))
  386. {
  387. short maxAmmo = pht->GetMaxAmmo();
  388. short maxFuel = short(pht->GetMaxFuel());
  389. pship->SetAmmo(maxAmmo);
  390. pship->SetFuel(maxFuel);
  391. for (PartLinkIGC* ppl = pship->GetParts()->first();
  392. (ppl != NULL);
  393. ppl = ppl->next())
  394. {
  395. IpartIGC* ppart = ppl->data();
  396. if (ppart->GetObjectType() == OT_pack)
  397. {
  398. IpackIGC* ppack = (IpackIGC*)ppart;
  399. ppack->SetAmount(ppack->GetPackType() == c_packAmmo ? maxAmmo : maxFuel);
  400. }
  401. }
  402. }
  403. pship->SetEnergy(pht->GetMaxEnergy());
  404. }
  405. //Ibase
  406. HRESULT MyStationType::Initialize(ImissionIGC* pMission, Time now, const void* data, int length)
  407. {
  408. assert (false);
  409. return E_FAIL;
  410. }
  411. void MyStationType::Terminate(void)
  412. {
  413. assert (false);
  414. }
  415. void MyStationType::Update(Time now)
  416. {
  417. assert (false);
  418. }
  419. ObjectType MyStationType::GetObjectType(void) const
  420. {
  421. return OT_stationType;
  422. }
  423. ObjectID MyStationType::GetObjectID(void) const
  424. {
  425. return m_pStationData->stationTypeID;
  426. }
  427. // ItypeIGC
  428. const void* MyStationType::GetData(void) const
  429. {
  430. return m_pStationData;
  431. }
  432. // IbuyableIGC
  433. const char* MyStationType::GetModelName(void) const
  434. {
  435. return m_pStationData->modelName;
  436. }
  437. const char* MyStationType::GetName(void) const
  438. {
  439. return m_pStationData->name;
  440. }
  441. const char* MyStationType::GetDescription(void) const
  442. {
  443. return m_pStationData->description;
  444. }
  445. Money MyStationType::GetPrice(void) const
  446. {
  447. return m_pStationData->price;
  448. }
  449. DWORD MyStationType::GetTimeToBuild(void) const
  450. {
  451. return m_pStationData->timeToBuild;
  452. }
  453. BuyableGroupID MyStationType::GetGroupID(void) const
  454. {
  455. return m_pStationData->groupID;
  456. }
  457. const TechTreeBitMask& MyStationType::GetRequiredTechs(void) const
  458. {
  459. return m_pStationData->ttbmRequired;
  460. }
  461. const TechTreeBitMask& MyStationType::GetEffectTechs(void) const
  462. {
  463. return m_pStationData->ttbmEffects;
  464. }
  465. // IstationTypeIGC
  466. float MyStationType::GetSignature(void) const
  467. {
  468. return m_pStationData->signature;
  469. }
  470. float MyStationType::GetRadius(void) const
  471. {
  472. return m_pStationData->radius;
  473. }
  474. float MyStationType::GetScannerRange(void) const
  475. {
  476. return m_pStationData->scannerRange * m_pstation->GetSide()->GetGlobalAttributeSet().GetAttribute(c_gaScanRange);
  477. }
  478. HitPoints MyStationType::GetMaxArmorHitPoints(void) const
  479. {
  480. return m_pStationData->maxArmorHitPoints * m_pstation->GetSide()->GetGlobalAttributeSet().GetAttribute(c_gaMaxArmorStation);
  481. }
  482. DefenseTypeID MyStationType::GetArmorDefenseType(void) const
  483. {
  484. return m_pStationData->defenseTypeArmor;
  485. }
  486. HitPoints MyStationType::GetMaxShieldHitPoints(void) const
  487. {
  488. return m_pStationData->maxShieldHitPoints * m_pstation->GetSide()->GetGlobalAttributeSet().GetAttribute(c_gaMaxShieldStation);
  489. }
  490. DefenseTypeID MyStationType::GetShieldDefenseType(void) const
  491. {
  492. return m_pStationData->defenseTypeShield;
  493. }
  494. float MyStationType::GetArmorRegeneration(void) const
  495. {
  496. return m_pStationData->armorRegeneration * m_pstation->GetSide()->GetGlobalAttributeSet().GetAttribute(c_gaArmorRegenerationStation);
  497. }
  498. float MyStationType::GetShieldRegeneration(void) const
  499. {
  500. return m_pStationData->shieldRegeneration * m_pstation->GetSide()->GetGlobalAttributeSet().GetAttribute(c_gaShieldRegenerationStation);
  501. }
  502. Money MyStationType::GetIncome(void) const
  503. {
  504. return m_pStationData->income;
  505. }
  506. const TechTreeBitMask& MyStationType::GetLocalTechs(void) const
  507. {
  508. return m_pStationData->ttbmLocal;
  509. }
  510. StationAbilityBitMask MyStationType::GetCapabilities(void) const
  511. {
  512. return m_pStationData->sabmCapabilities;
  513. }
  514. bool MyStationType::HasCapability(StationAbilityBitMask sabm) const
  515. {
  516. return (m_pStationData->sabmCapabilities & sabm) != 0;
  517. }
  518. const char* MyStationType::GetTextureName(void) const
  519. {
  520. return m_pStationData->textureName;
  521. }
  522. const char* MyStationType::GetBuilderName(void) const
  523. {
  524. return m_pStationData->builderName;
  525. }
  526. const char* MyStationType::GetIconName(void) const
  527. {
  528. return m_pStationData->iconName;
  529. }
  530. IstationTypeIGC* MyStationType::GetSuccessorStationType(const IsideIGC* pside)
  531. {
  532. return m_pStationType->GetSuccessorStationType(pside);
  533. }
  534. AsteroidAbilityBitMask MyStationType::GetBuildAABM(void) const
  535. {
  536. return m_pStationData->aabmBuild;
  537. }
  538. int MyStationType::GetLaunchSlots(void) const
  539. {
  540. return m_pStationType->GetLaunchSlots();
  541. }
  542. const Vector& MyStationType::GetLaunchPosition(int slotID) const
  543. {
  544. return m_pStationType->GetLaunchPosition(slotID);
  545. }
  546. const Vector& MyStationType::GetLaunchDirection(int slotID) const
  547. {
  548. return m_pStationType->GetLaunchDirection(slotID);
  549. }
  550. int MyStationType::GetLandSlots(void) const
  551. {
  552. return m_pStationType->GetLandSlots();
  553. }
  554. int MyStationType::GetCapLandSlots(void) const
  555. {
  556. return m_pStationType->GetCapLandSlots();
  557. }
  558. int MyStationType::GetLandPlanes(int slotID) const
  559. {
  560. return m_pStationType->GetLandPlanes(slotID);
  561. }
  562. const Vector& MyStationType::GetLandPosition(int slotID, int planeID) const
  563. {
  564. return m_pStationType->GetLandPosition(slotID, planeID);
  565. }
  566. const Vector& MyStationType::GetLandDirection(int slotID, int planeID) const
  567. {
  568. return m_pStationType->GetLandDirection(slotID, planeID);
  569. }
  570. SoundID MyStationType::GetInteriorSound() const
  571. {
  572. return m_pStationType->GetInteriorSound();
  573. }
  574. SoundID MyStationType::GetInteriorAlertSound() const
  575. {
  576. return m_pStationType->GetInteriorAlertSound();
  577. }
  578. SoundID MyStationType::GetExteriorSound() const
  579. {
  580. return m_pStationType->GetExteriorSound();
  581. }
  582. SoundID MyStationType::GetConstructorNeedRockSound() const
  583. {
  584. return m_pStationType->GetConstructorNeedRockSound();
  585. }
  586. SoundID MyStationType::GetConstructorUnderAttackSound() const
  587. {
  588. return m_pStationType->GetConstructorUnderAttackSound();
  589. }
  590. SoundID MyStationType::GetConstructorDestroyedSound() const
  591. {
  592. return m_pStationType->GetConstructorDestroyedSound();
  593. }
  594. SoundID MyStationType::GetCompletionSound() const
  595. {
  596. return m_pStationType->GetCompletionSound();
  597. }
  598. SoundID MyStationType::GetUnderAttackSound() const
  599. {
  600. return m_pStationType->GetUnderAttackSound();
  601. }
  602. SoundID MyStationType::GetCriticalSound() const
  603. {
  604. return m_pStationType->GetCriticalSound();
  605. }
  606. SoundID MyStationType::GetDestroyedSound() const
  607. {
  608. return m_pStationType->GetDestroyedSound();
  609. }
  610. SoundID MyStationType::GetCapturedSound() const
  611. {
  612. return m_pStationType->GetCapturedSound();
  613. }
  614. SoundID MyStationType::GetEnemyCapturedSound() const
  615. {
  616. return m_pStationType->GetEnemyCapturedSound();
  617. }
  618. SoundID MyStationType::GetEnemyDestroyedSound() const
  619. {
  620. return m_pStationType->GetEnemyDestroyedSound();
  621. }
  622. StationClassID MyStationType::GetClassID() const
  623. {
  624. return m_pStationType->GetClassID();
  625. }
  626. IdroneTypeIGC* MyStationType::GetConstructionDroneType(void) const
  627. {
  628. return m_pStationType->GetConstructionDroneType();
  629. }