comndr.cpp 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. //******************************************************************************************
  2. //
  3. // comndr.cpp - This file contains the Commander Class header
  4. //
  5. // MechCommander 2
  6. //
  7. //---------------------------------------------------------------------------//
  8. // Copyright (C) Microsoft Corporation. All rights reserved. //
  9. //===========================================================================//
  10. #ifndef MCLIB_H
  11. #include "mclib.h"
  12. #endif
  13. #ifndef GROUP_H
  14. #include "group.h"
  15. #endif
  16. #ifndef COMNDR_H
  17. #include "comndr.h"
  18. #endif
  19. #ifndef MOVER_H
  20. #include "mover.h"
  21. #endif
  22. #ifndef MULTPLYR_H
  23. #include "multplyr.h"
  24. #endif
  25. #ifndef UNITDESG_H
  26. #include "unitdesg.h"
  27. #endif
  28. #include "team.h"
  29. #include <stdio.h>
  30. //---------------------------------------------------------------------------
  31. long Commander::numCommanders = 0;
  32. CommanderPtr Commander::commanders[MAX_COMMANDERS] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
  33. CommanderPtr Commander::home = NULL;
  34. //***************************************************************************
  35. // COMMANDER class
  36. //***************************************************************************
  37. void* Commander::operator new (size_t ourSize) {
  38. void* result = systemHeap->Malloc(ourSize);
  39. return(result);
  40. }
  41. //---------------------------------------------------------------------------
  42. void Commander::operator delete (void* us) {
  43. systemHeap->Free(us);
  44. }
  45. //---------------------------------------------------------------------------
  46. void Commander::init (void) {
  47. id = -1;
  48. team = NULL;
  49. for (long i = 0; i < MAX_MOVERGROUPS; i++) {
  50. groups[i] = new MoverGroup;
  51. groups[i]->setId(i);
  52. }
  53. numCommanders++;
  54. }
  55. //---------------------------------------------------------------------------
  56. void Commander::destroy (void) {
  57. for (long i = 0; i < MAX_MOVERGROUPS; i++) {
  58. delete groups[i];
  59. groups[i] = NULL;
  60. }
  61. numCommanders--;
  62. Assert(numCommanders >= 0, numCommanders, " Commander.destroy: numCommanders is neg ");
  63. }
  64. //---------------------------------------------------------------------------
  65. long Commander::setGroup (long id, long numMates, MoverPtr* moverList, long point) {
  66. // First, does the unit currently have objects set up there already?
  67. // If so, we need to determine
  68. Assert((id >= 0) && (id < MAX_MOVERGROUPS), 0, " Commander::bad id in setGroup ");
  69. MoverGroupPtr curGroup = groups[id];
  70. Assert(curGroup != NULL, 0, " Commander::setGroup has null group ");
  71. //-----------------------------------------------
  72. // The current group in this slot must disband...
  73. curGroup->disband();
  74. //-----------------------------------------------
  75. // Now, slip the new group into this unit slot...
  76. for (long i = 0; i < numMates; i++) {
  77. MoverPtr mover = moverList[i];
  78. //-----------------------------------------
  79. // Pull the mover from its current group...
  80. MoverGroupPtr oldGroup = mover->getGroup();
  81. if (oldGroup)
  82. oldGroup->remove(mover);
  83. //----------------------------
  84. // Add 'em to the new group...
  85. curGroup->add(mover);
  86. }
  87. //-----------------------------------
  88. // Set the point for the new group...
  89. //
  90. // The MoverList passed in is INVALID passed
  91. // the numMates count. If you select a point
  92. // which is dead, it invariably points to a
  93. // MUCH higher location in the moverList then is valid.
  94. // We now guard against this...
  95. if ((point < numMates) && (point >= 0))
  96. curGroup->setPoint(moverList[point]);
  97. return(NO_ERR);
  98. }
  99. //---------------------------------------------------------------------------
  100. void Commander::setLocalMoverId (long localMoverId)
  101. {
  102. if (getTeam())
  103. {
  104. for (long j = 0; j < getTeam()->getRosterSize(); j++)
  105. getTeam()->getMover(j)->setLocalMoverId(localMoverId);
  106. }
  107. }
  108. //---------------------------------------------------------------------------
  109. void Commander::eject (void) {
  110. for (long i = 0; i < ObjectManager->getNumMovers(); i++) {
  111. MoverPtr mover = ObjectManager->getMover(i);
  112. if (mover && (mover->getCommanderId() == id)) {
  113. if (mover->getObjectClass() == BATTLEMECH) {
  114. if (mover->getPilot())
  115. mover->getPilot()->orderEject(false, true, ORDER_ORIGIN_COMMANDER);
  116. }
  117. else {
  118. WeaponShotInfo shot;
  119. shot.init(NULL, -3, 254.0, 0, 0);
  120. mover->handleWeaponHit(&shot, (MPlayer != NULL));
  121. }
  122. }
  123. }
  124. }
  125. //---------------------------------------------------------------------------
  126. void Commander::addToGUI (bool visible) {
  127. //----------------------------------
  128. // The GUI only supports 4 groups...
  129. for (long i = 0; i < 4; i++)
  130. groups[i]->addToGUI(visible);
  131. }
  132. //---------------------------------------------------------------------------
  133. long Commander::Save (PacketFilePtr file, long packetNum)
  134. {
  135. StaticCommanderData staticData;
  136. staticData.numCommanders = numCommanders;
  137. staticData.homeCommanderId = home->getId();
  138. file->writePacket(packetNum,(MemoryPtr)&staticData,sizeof(StaticCommanderData),STORAGE_TYPE_RAW);
  139. packetNum++;
  140. for (long i=0;i<numCommanders;i++)
  141. {
  142. CommanderData data;
  143. data.id = commanders[i]->getId();
  144. //Allied commanders have NO team!!??!
  145. // Just save the home team with them then.
  146. if (commanders[i]->getTeam())
  147. data.teamId = commanders[i]->getTeam()->getId();
  148. else
  149. data.teamId = Team::home->getId();
  150. for (long j=0;j<MAX_MOVERGROUPS;j++)
  151. commanders[i]->groups[j]->copyTo(data.groups[j]);
  152. file->writePacket(packetNum,(MemoryPtr)&data,sizeof(CommanderData),STORAGE_TYPE_RAW);
  153. packetNum++;
  154. }
  155. return packetNum;
  156. }
  157. //---------------------------------------------------------------------------
  158. long Commander::Load (PacketFilePtr file, long packetNum)
  159. {
  160. StaticCommanderData staticData;
  161. file->readPacket(packetNum,(MemoryPtr)&staticData);
  162. packetNum++;
  163. numCommanders = staticData.numCommanders;
  164. for (long i=0;i<numCommanders;i++)
  165. {
  166. CommanderData data;
  167. file->readPacket(packetNum,(MemoryPtr)&data);
  168. packetNum++;
  169. commanders[i] = new Commander;
  170. //Same drill as all the others. HACK!
  171. // We increment numCommanders in the INIT.
  172. // Decrement here to maintain sanity.
  173. numCommanders--;
  174. commanders[i]->setId(data.id);
  175. for (long k=0;k<MAX_TEAMS;k++)
  176. {
  177. if (Team::teams[k] && (Team::teams[k]->getId() == data.teamId))
  178. commanders[i]->team = Team::teams[k];
  179. }
  180. for (long j=0;j<MAX_MOVERGROUPS;j++)
  181. {
  182. // commanders[i]->groups[j] = new MoverGroup;
  183. commanders[i]->groups[j]->init(data.groups[j]);
  184. }
  185. if (staticData.homeCommanderId == commanders[i]->getId())
  186. home = commanders[i];
  187. }
  188. return packetNum;
  189. }
  190. //***************************************************************************