LogisticsMissionInfo.cpp 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239
  1. #define LOGISTICSMISSIONINFO_CPP
  2. /*************************************************************************************************\
  3. LogisticsMissionInfo.cpp : Implementation of the LogisticsMissionInfo component.
  4. //---------------------------------------------------------------------------//
  5. // Copyright (C) Microsoft Corporation. All rights reserved. //
  6. //===========================================================================//
  7. \*************************************************************************************************/
  8. #include "McLib.h"
  9. #include "LogisticsMissionInfo.h"
  10. #ifndef FITINIFILE_H
  11. #include "IniFile.h"
  12. #endif
  13. #include "LogisticsErrors.h"
  14. #include "Multplyr.h"
  15. extern char missionName[1024];
  16. LogisticsMissionInfo::LogisticsMissionInfo()
  17. {
  18. currentMission = -1;
  19. currentStage = 0;
  20. groups = 0;
  21. currentMissionName = missionName;
  22. groupCount = 0;
  23. CBills = 0;
  24. if ( currentMissionName.Length() < 2 )
  25. currentMissionName = "m0101";
  26. bMultiplayer = 0;
  27. // maxTeams = maxPlayers = 2;
  28. }
  29. LogisticsMissionInfo::~LogisticsMissionInfo()
  30. {
  31. clear();
  32. }
  33. void LogisticsMissionInfo::clear()
  34. {
  35. if ( groups )
  36. {
  37. for ( int i = 0; i < groupCount; i++ )
  38. {
  39. for ( MISSION_LIST::EIterator iter = groups[i].infos.Begin();
  40. !iter.IsDone(); iter++ )
  41. {
  42. delete (*iter);
  43. }
  44. }
  45. delete [] groups;
  46. }
  47. for ( FILE_LIST::EIterator iter = additionalPurchaseFiles.Begin();
  48. !iter.IsDone(); iter++ )
  49. {
  50. delete *iter;
  51. }
  52. additionalPurchaseFiles.Clear();
  53. currentMission = -1;
  54. currentStage = 0;
  55. groups = 0;
  56. currentMissionName = missionName;
  57. groupCount = 0;
  58. CBills = 0;
  59. }
  60. long LogisticsMissionInfo::init( FitIniFile& file )
  61. {
  62. clear();
  63. bMultiplayer = 0;
  64. campaignName= file.getFilename();
  65. // read the number of mission groups
  66. file.seekBlock("Campaign" );
  67. char resultName[256];
  68. resultName[0] = 0;
  69. long lName = 0;
  70. long result = file.readIdLong( "NameID", lName );
  71. if ( result == NO_ERR )
  72. {
  73. cLoadString( lName, resultName, 255 );
  74. }
  75. else
  76. {
  77. result = file.readIdString( "CampaignName", resultName, 255 );
  78. Assert( result == NO_ERR, 0, "couldn't find the missionName" );
  79. }
  80. campaignDisplayName = resultName;
  81. result = file.readIdLong( "GroupCount", groupCount );
  82. if ( result != NO_ERR )
  83. {
  84. Assert( 0, 0, "No group count in campaign file" );
  85. return -1;
  86. }
  87. result = file.readIdLong( "CBills", CBills );
  88. char tmp[256];
  89. if ( NO_ERR == file.readIdString( "FinalVideo", tmp, 255 ) )
  90. {
  91. finalVideoName = tmp;
  92. }
  93. // create storage for 'em
  94. groups = new MissionGroup[groupCount];
  95. currentStage = 0;
  96. char blockName[32];
  97. for ( int i = 0; i < groupCount; i++ )
  98. {
  99. groups[i].numberToBeCompleted = -1; // initialize
  100. sprintf( blockName, "Group%ld", i );
  101. if ( NO_ERR != file.seekBlock( blockName ) )
  102. {
  103. Assert( 0, i, "couldn't find this group in the campaign file" );
  104. continue;
  105. }
  106. file.readIdLong( "NumberToComplete", groups[i].numberToBeCompleted );
  107. file.readIdLong( "Tune", groups[i].logisticsTuneId);
  108. if ( NO_ERR != file.readIdString( "ABLScript", tmp, 255 ) )
  109. {
  110. //Perfectly valid to have no ABL brain for this group!
  111. groups[i].ablBrainName = "NONE";
  112. }
  113. else
  114. {
  115. groups[i].ablBrainName = tmp;
  116. }
  117. if ( NO_ERR != file.readIdString( "Video", tmp, 255 ) )
  118. {
  119. char errorStr[256];
  120. sprintf( errorStr, "couldn't find the video for operation %ld", i );
  121. Assert( 0, 0, errorStr );
  122. }
  123. groups[i].videoFileName = tmp;
  124. groups[i].videoShown = 0;
  125. if ( NO_ERR == file.readIdString( "PreVideo", tmp, 255 ) )
  126. {
  127. groups[i].bigVideoName = tmp;
  128. groups[i].bigVideoShown = 0;
  129. }
  130. if ( NO_ERR != file.readIdString( "OperationFile", tmp, 255 )
  131. || !strlen( tmp ) )
  132. {
  133. strcpy( tmp, "mcl_cm_opplayer.fit" );
  134. }
  135. groups[i].operationFileName = tmp;
  136. long missionCount;
  137. // read the number of missions in the group
  138. file.readIdLong( "MissionCount", missionCount );
  139. for ( int j = 0; j < missionCount; j++ )
  140. {
  141. MissionInfo* pInfo = new MissionInfo;
  142. sprintf( blockName, "Group%ldMission%ld", i, j );
  143. if ( NO_ERR == file.seekBlock( blockName ) )
  144. {
  145. char fileName[1024];
  146. if ( NO_ERR != file.readIdString( "FileName", fileName, 1023 ) )
  147. {
  148. Assert( 0, j, "couldn't find a mission file name in the campaign file" );
  149. continue;
  150. }
  151. groups[i].infos.Append( pInfo );
  152. EString path = missionPath;
  153. path += fileName;
  154. path += ".fit";
  155. pInfo->fileName = fileName;
  156. pInfo->completed = 0;
  157. FitIniFile missionFile;
  158. if ( NO_ERR != missionFile.open( (char*)(const char*)path ) )
  159. {
  160. char errorStr[256];
  161. sprintf( errorStr, "couldn't open file %s", fileName );
  162. Assert( 0, 0, errorStr );
  163. continue;
  164. }
  165. readMissionInfo( missionFile, pInfo );
  166. char videoFileName[255];
  167. if ( NO_ERR == file.readIdString( "VideoOverride", videoFileName, 255 ) )
  168. pInfo->videoName = videoFileName;
  169. file.readIdBoolean( "Mandatory", pInfo->mandatory );
  170. file.readIdBoolean( "CompletePrevious", pInfo->completePrevious );
  171. long result = file.readIdString( "PurchaseFile", fileName, 1023 );
  172. if ((NO_ERR != result) || (0 == strcmp("", fileName)))
  173. {
  174. strcpy(fileName, "purchase_All");
  175. }
  176. file.readIdBoolean( "Hidden", pInfo->hidden );
  177. if ( NO_ERR != file.readIdBoolean( "PlayLogistics", pInfo->playLogistics ) )
  178. pInfo->playLogistics = true;
  179. if ( NO_ERR != file.readIdBoolean( "PlaySalvage", pInfo->playSalvage ) )
  180. pInfo->playSalvage = true;
  181. if ( NO_ERR != file.readIdBoolean( "PlayPilotPromotion", pInfo->playPilotPromotion ) )
  182. pInfo->playPilotPromotion = true;
  183. if ( NO_ERR != file.readIdBoolean( "PlayPurchasing", pInfo->playPurchasing ) )
  184. pInfo->playPurchasing = true;
  185. if ( NO_ERR != file.readIdBoolean( "PlaySelection", pInfo->playMissionSelection ) )
  186. {
  187. pInfo->playMissionSelection = false;
  188. }
  189. pInfo->purchaseFileName = missionPath;
  190. pInfo->purchaseFileName += fileName;
  191. pInfo->purchaseFileName += ".fit";
  192. }
  193. }
  194. }
  195. return 0;
  196. }
  197. void LogisticsMissionInfo::readMissionInfo( FitIniFile& file, LogisticsMissionInfo::MissionInfo* pInfo )
  198. {
  199. long result = file.seekBlock( "MissionSettings" );
  200. Assert( result == NO_ERR, 0, "Coudln't find the mission settings block in the mission file" );
  201. char missionName[256];
  202. missionName[0] = 0;
  203. bool bRes = 0;
  204. result = file.readIdBoolean( "MissionNameUseResourceString", bRes );
  205. //Assert( result == NO_ERR, 0, "couldn't find the MissionNameUseResourceString" );
  206. if ( bRes )
  207. {
  208. unsigned long lRes;
  209. result = file.readIdULong( "MissionNameResourceStringID", lRes );
  210. Assert( result == NO_ERR, 0, "couldn't find the MissionNameResourceStringID" );
  211. cLoadString( lRes, missionName, 255 );
  212. }
  213. else
  214. {
  215. result = file.readIdString( "MissionName", missionName, 255 );
  216. Assert( result == NO_ERR, 0, "couldn't find the missionName" );
  217. }
  218. pInfo->missionDescriptiveName = missionName;
  219. char blurb[4096];
  220. result = file.readIdString( "Blurb2", blurb, 4095 );
  221. Assert( result == NO_ERR, 0, "couldn't find the mission blurb" );
  222. bool tmpBool = false;
  223. result = file.readIdBoolean("Blurb2UseResourceString", tmpBool);
  224. if (NO_ERR == result && tmpBool )
  225. {
  226. unsigned long tmpInt = 0;
  227. result = file.readIdULong("Blurb2ResourceStringID", tmpInt);
  228. if (NO_ERR == result)
  229. {
  230. cLoadString( tmpInt, blurb, 2047 );
  231. }
  232. }
  233. pInfo->description = blurb;
  234. result = file.readIdLong( "ResourcePoints", pInfo->resourcePoints );
  235. result = file.readIdLong("AdditionalCBills", pInfo->additionalCBills );
  236. float fTmp;
  237. result = file.readIdFloat( "DropWeightLimit", fTmp );
  238. if ( result != NO_ERR )
  239. pInfo->dropWeight = 300;
  240. else
  241. pInfo->dropWeight = fTmp;
  242. if ( NO_ERR != file.readIdBoolean( "AirStrikesEnabledDefault", pInfo->enableAirStrike) )
  243. pInfo->enableAirStrike = 1;
  244. if ( NO_ERR != file.readIdBoolean( "MineLayersEnabledDefault", pInfo->enableMineLayer) )
  245. pInfo->enableMineLayer = 1;
  246. if ( NO_ERR != file.readIdBoolean("ScoutCoptersEnabledDefault", pInfo->enableScoutCopter) )
  247. pInfo->enableScoutCopter = 1;
  248. if ( NO_ERR != file.readIdBoolean("SalvageCraftEnabledDefault", pInfo->enableSalavageCraft) )
  249. pInfo->enableSalavageCraft = 1;
  250. if ( NO_ERR != file.readIdBoolean( "SensorProbesEnabledDefault", pInfo->enableSensorStrike) )
  251. pInfo->enableSensorStrike = true;
  252. if ( NO_ERR != file.readIdBoolean( "RepairVehicleEnabledDefault", pInfo->enableRepairTruck ) )
  253. pInfo->enableRepairTruck = true;
  254. if ( NO_ERR != file.readIdBoolean("ArtilleryPieceEnabledDefault", pInfo->enableArtilleryPiece) )
  255. pInfo->enableArtilleryPiece = 0;
  256. }
  257. long LogisticsMissionInfo::load( FitIniFile& file )
  258. {
  259. // read the campaign file name
  260. char path[1024];
  261. char fileName[64];
  262. long result = file.seekBlock( "General" );
  263. Assert( result == NO_ERR, 0, "couldn't find general block in campaign file" );
  264. result = file.readIdString( "CampaignFile", fileName, 63);
  265. FitIniFile campaignFile;
  266. if ( NO_ERR != campaignFile.open( fileName ) )
  267. {
  268. char errorStr[256];
  269. sprintf( errorStr, "couldn't find file %s", path );
  270. return -1;
  271. }
  272. campaignName = fileName;
  273. // initialize this with campaign info
  274. if ( NO_ERR != init( campaignFile ) )
  275. {
  276. Assert( 0, 0, "couldn't initialize the campaign" );
  277. return -1;
  278. }
  279. currentMission = 0;
  280. // reset rp
  281. file.readIdLong( "CBills", CBills );
  282. // set the current mission group
  283. file.readIdLong( "Group", currentStage );
  284. if ( currentStage >= groupCount )
  285. currentStage = groupCount-1;
  286. // set completed missions
  287. long count;
  288. file.readIdLong( "CompletedMissions", count );
  289. char header[32];
  290. MissionGroup* pGroup = &groups[currentStage];
  291. file.readIdBoolean( "BigMoviePlayed", pGroup->bigVideoShown);
  292. long numberCompleted = 0;
  293. for ( int i = 0; i < count; i++ )
  294. {
  295. long cnt = 0;
  296. sprintf( header, "Mission%ld", i );
  297. file.readIdLong( header, cnt );
  298. MissionInfo* pInfo = pGroup->infos[(unsigned long)cnt];
  299. pInfo->completed = 1;
  300. numberCompleted ++;
  301. }
  302. if ( numberCompleted >= pGroup->numberToBeCompleted ) // unhide necessary missions
  303. {
  304. MISSION_LIST::EIterator iter = pGroup->infos.Begin();
  305. while( !iter.IsDone() )
  306. {
  307. if ( (*iter)->hidden ) // use the hidden video file name for this
  308. {
  309. if ( (*iter)->videoName.Length() )
  310. {
  311. pGroup->videoFileName = (*iter)->videoName;
  312. pGroup->videoShown = 0;
  313. }
  314. }
  315. (*iter)->hidden = 0;
  316. iter++;
  317. }
  318. }
  319. if ( count < pGroup->infos.Count() )
  320. setNextMission( pGroup->infos[count]->fileName );
  321. char tmpPlayerName[64];
  322. file.readIdString( "PlayerName", tmpPlayerName, 63 );
  323. playerName = tmpPlayerName;
  324. if ( NO_ERR == file.seekBlock( "AdditionalPurchaseFiles" ) )
  325. {
  326. i = 0;
  327. while( true )
  328. {
  329. sprintf( header, "File%ld", i );
  330. char tmp[256];
  331. if ( NO_ERR == file.readIdString( header, tmp, 255 ) )
  332. {
  333. char* pfName = new char[strlen( tmp )+1 ];
  334. strcpy( pfName, tmp );
  335. additionalPurchaseFiles.Append( pfName );
  336. i++;
  337. }
  338. else
  339. break;
  340. }
  341. }
  342. return 0;
  343. }
  344. void LogisticsMissionInfo::save( FitIniFile& file )
  345. {
  346. // save the campaign file name
  347. file.writeIdString( "CampaignFile", campaignName );
  348. file.writeIdString( "CampaignName", campaignDisplayName );
  349. // save the player name
  350. if ( playerName.Length() )
  351. file.writeIdString( "PlayerName", playerName );
  352. else
  353. file.writeIdString( "PlayerName", "" );
  354. // save the rp
  355. file.writeIdLong( "CBills", CBills );
  356. // save the current mission group
  357. file.writeIdLong( "Group", currentStage );
  358. int count = 0;
  359. char header[32];
  360. if ( currentStage < groupCount )
  361. {
  362. // save the missions completed thus far in the mission group
  363. MissionGroup* pGroup = &groups[currentStage];
  364. file.writeIdBoolean( "BigMoviePlayed", pGroup->bigVideoShown);
  365. // write out the name of the mission, for ease of filling dialog
  366. MissionInfo* pInfo = pGroup->infos[currentMission];
  367. file.writeIdString( "MissionName", pInfo->missionDescriptiveName );
  368. file.writeIdString( "MissionFileName", pInfo->fileName );
  369. int curMission = 0;
  370. for ( MISSION_LIST::EIterator iter = pGroup->infos.Begin(); !iter.IsDone(); iter++, curMission++ )
  371. {
  372. if ( (*iter)->completed )
  373. {
  374. sprintf( header, "Mission%ld", count );
  375. file.writeIdLong( header, curMission );
  376. count++;
  377. }
  378. }
  379. }
  380. file.writeIdLong( "CompletedMissions", count );
  381. file.writeBlock( "AdditionalPurchaseFiles" );
  382. int i = 0;
  383. for ( FILE_LIST::EIterator fIter = additionalPurchaseFiles.Begin(); !fIter.IsDone(); fIter++ )
  384. {
  385. sprintf( header, "File%ld", i );
  386. file.writeIdString( header, (*fIter) );
  387. i++;
  388. }
  389. }
  390. long LogisticsMissionInfo::getAvailableMissions( const char** missions, int& numberOfEm )
  391. {
  392. MissionGroup* pGroup = &groups[currentStage];
  393. int count = 0;
  394. int maxOut = numberOfEm;
  395. MISSION_LIST::EIterator iter = pGroup->infos.Begin();
  396. while( !iter.IsDone() )
  397. {
  398. if ( !(*iter)->completed )
  399. {
  400. if ( count < maxOut )
  401. {
  402. missions[count] = (*iter)->fileName;
  403. }
  404. count++;
  405. }
  406. iter++;
  407. }
  408. numberOfEm = count;
  409. if ( count > maxOut )
  410. {
  411. return NEED_BIGGER_ARRAY;
  412. }
  413. return 0;
  414. }
  415. long LogisticsMissionInfo::getCurrentMissions( const char** missions, int& numberOfEm )
  416. {
  417. MissionGroup* pGroup = &groups[currentStage];
  418. int count = 0;
  419. int maxOut = numberOfEm;
  420. MISSION_LIST::EIterator iter = pGroup->infos.Begin();
  421. while( !iter.IsDone() )
  422. {
  423. if ( !(*iter)->hidden )
  424. {
  425. if ( count < maxOut )
  426. {
  427. missions[count] = (*iter)->fileName;
  428. }
  429. count++;
  430. }
  431. iter++;
  432. }
  433. numberOfEm = count;
  434. if ( count > maxOut )
  435. {
  436. return NEED_BIGGER_ARRAY;
  437. }
  438. return 0;
  439. }
  440. long LogisticsMissionInfo::setNextMission( const char* missionName )
  441. {
  442. if ( !missionName || !strlen( missionName ) )
  443. return -1;
  444. if ( bMultiplayer )
  445. {
  446. EString path = missionPath;
  447. path += missionName;
  448. path += ".fit";
  449. currentMission = 0;
  450. currentStage = 0;
  451. MissionInfo* pInfo = groups[0].infos[0];
  452. pInfo->fileName = missionName;
  453. pInfo->completed = 0;
  454. pInfo->playPurchasing = true;
  455. currentMissionName = missionName;
  456. FitIniFile missionFile;
  457. if ( NO_ERR != missionFile.open( (char*)(const char*)path ) )
  458. {
  459. char errorStr[256];
  460. sprintf( errorStr, "couldn't open file %s", missionName );
  461. Assert( 0, 0, errorStr );
  462. return -1;
  463. }
  464. readMissionInfo( missionFile, pInfo );
  465. // result = missionFile.readIdLong( "MaximumNumberOfTeams", maxTeams );
  466. // result = missionFile.readIdLong( "MaximumNumberOfPlayers", maxPlayers );
  467. MC2Player* pPlayerInfo =MPlayer->getPlayerInfo( MPlayer->commanderID );;
  468. if ( pPlayerInfo )
  469. {
  470. pInfo->resourcePoints = MPlayer->missionSettings.resourcePoints;
  471. pInfo->additionalCBills = pPlayerInfo->cBills;
  472. // need to put dropweight in here as sooon as we have it
  473. }
  474. pInfo->dropWeight = MPlayer->missionSettings.dropWeight;
  475. missionFile.close();
  476. CBills = pInfo->additionalCBills;
  477. pInfo->enableAirStrike = MPlayer->missionSettings.airStrike;
  478. pInfo->enableArtilleryPiece = MPlayer->missionSettings.guardTower;
  479. pInfo->enableRepairTruck = MPlayer->missionSettings.repairVehicle;
  480. pInfo->enableSensorStrike = MPlayer->missionSettings.sensorProbe;
  481. pInfo->enableScoutCopter = MPlayer->missionSettings.scoutCopter;
  482. pInfo->enableMineLayer = MPlayer->missionSettings.mineLayer;
  483. pInfo->enableSalavageCraft = MPlayer->missionSettings.recoveryTeam;
  484. }
  485. else
  486. {
  487. MissionGroup* pGroup = &groups[currentStage];
  488. int count = 0;
  489. bool bFound = 0;
  490. MISSION_LIST::EIterator iter = pGroup->infos.Begin();
  491. while( !iter.IsDone() )
  492. {
  493. if ( stricmp( (*iter)->fileName, missionName ) == 0 )
  494. {
  495. bFound = 1;
  496. if ( (*iter)->completed )
  497. {
  498. return MISSION_ALREADY_DONE;
  499. }
  500. else
  501. {
  502. if ( currentMission != -1 )
  503. {
  504. MissionInfo* pInfo = pGroup->infos[currentMission];
  505. if ( !(pInfo)->completed )
  506. CBills -= pInfo->additionalCBills;
  507. }
  508. currentMission = count;
  509. currentMissionName = (*iter)->fileName;
  510. currentMissionName.Remove( EString(".fit") );
  511. CBills += (*iter)->additionalCBills;
  512. }
  513. break;
  514. }
  515. count++;
  516. iter++;
  517. }
  518. if ( !bFound )
  519. return INVALID_MISSION;
  520. }
  521. return 0;
  522. }
  523. void LogisticsMissionInfo::setSingleMission( const char* missionFileName )
  524. {
  525. clear();
  526. bMultiplayer = true;
  527. groups = new MissionGroup[1];
  528. currentStage = 0;
  529. MissionInfo* pInfo = new MissionInfo;
  530. groups[0].infos.Append( pInfo );
  531. groups[0].operationFileName = "MCL_CM_Op1_1.fit";
  532. groups[0].ablBrainName = "";
  533. groups[0].bigVideoName = "";
  534. groups[0].bigVideoShown = true;
  535. groups[0].logisticsTuneId = 0;
  536. groups[0].numberToBeCompleted = 1;
  537. groups[0].videoFileName = "";
  538. groupCount = 1;
  539. EString path = missionPath;
  540. path += missionFileName;
  541. path += ".fit";
  542. currentMission = 0;
  543. currentStage = 0;
  544. pInfo->fileName = missionName;
  545. pInfo->completed = 0;
  546. pInfo->playMissionSelection = 0;
  547. pInfo->playPurchasing = true;
  548. pInfo->playSalvage = 0;
  549. pInfo->playPilotPromotion = 0;
  550. currentMissionName = missionFileName;
  551. FitIniFile missionFile;
  552. if ( NO_ERR != missionFile.open( (char*)(const char*)path ) )
  553. {
  554. char errorStr[256];
  555. sprintf( errorStr, "couldn't open file %s", missionName );
  556. Assert( 0, 0, errorStr );
  557. return;
  558. }
  559. readMissionInfo( missionFile, pInfo );
  560. float fTmp;
  561. long result = missionFile.readIdFloat( "DropWeightLimit", fTmp );
  562. pInfo->dropWeight = fTmp;
  563. result = missionFile.readIdLong("AdditionalCBills", pInfo->additionalCBills );
  564. if ( result != NO_ERR || !pInfo->additionalCBills )
  565. pInfo->additionalCBills = 1200 * fTmp + 100000;
  566. CBills = pInfo->additionalCBills;
  567. }
  568. long LogisticsMissionInfo::getCurrentMissionId( )
  569. {
  570. long missionId = 0;
  571. for (long i=0;i<=lastStage;i++)
  572. {
  573. MissionGroup* pGroup = &groups[i];
  574. if (i == lastStage)
  575. {
  576. missionId += lastMission;
  577. }
  578. else
  579. {
  580. long count = 0;
  581. MISSION_LIST::EIterator iter = pGroup->infos.Begin();
  582. while( !iter.IsDone() )
  583. {
  584. count++;
  585. iter++;
  586. }
  587. missionId += count;
  588. }
  589. }
  590. return missionId;
  591. }
  592. void LogisticsMissionInfo::setMissionComplete( )
  593. {
  594. if ( currentStage >= groupCount )
  595. {
  596. return;
  597. }
  598. //Needed to tell pilots which mission they just completed.
  599. lastStage = currentStage;
  600. lastMission = currentMission;
  601. lastMissionName = currentMissionName;
  602. MissionGroup* pGroup = &groups[currentStage];
  603. if ( pGroup && currentMission > -1 )
  604. {
  605. CBills += pGroup->infos[currentMission]->additionalCBills;
  606. }
  607. int count = 0;
  608. int numberCompleted = 0;
  609. bool bAllMandatoryCompleted = 1;
  610. int nextAvailableMission = -1;
  611. // figure out whether to go to the next stage orn not
  612. MISSION_LIST::EIterator iter = pGroup->infos.Begin();
  613. while( !iter.IsDone() )
  614. {
  615. if ( currentMission == count )
  616. {
  617. (*iter)->completed = 1;
  618. }
  619. if ( (*iter)->completed )
  620. {
  621. numberCompleted ++;
  622. }
  623. else
  624. {
  625. if ( nextAvailableMission == -1 )
  626. nextAvailableMission = count;
  627. if ( (*iter)->mandatory )
  628. bAllMandatoryCompleted = 0;
  629. }
  630. count++;
  631. iter++;
  632. }
  633. if ( numberCompleted >= pGroup->numberToBeCompleted )
  634. {
  635. if ( bAllMandatoryCompleted )
  636. {
  637. currentStage++;
  638. currentMission = 0;
  639. }
  640. else
  641. {
  642. MISSION_LIST::EIterator iter = pGroup->infos.Begin();
  643. while( !iter.IsDone() )
  644. {
  645. if ( (*iter)->hidden ) // use the hidden video file name for this
  646. {
  647. if ( (*iter)->videoName.Length() )
  648. {
  649. pGroup->videoFileName = (*iter)->videoName;
  650. pGroup->videoShown = 0;
  651. }
  652. }
  653. (*iter)->hidden = 0;
  654. iter++;
  655. }
  656. currentMission = nextAvailableMission;
  657. }
  658. }
  659. else
  660. {
  661. gosASSERT( nextAvailableMission != -1 );
  662. currentMission = nextAvailableMission;
  663. }
  664. if ( currentStage < groupCount )
  665. {
  666. currentMissionName = groups[currentStage].infos[currentMission]->fileName;
  667. }
  668. }
  669. LogisticsMissionInfo::MissionInfo::~MissionInfo()
  670. {
  671. }
  672. const EString& LogisticsMissionInfo::getCurrentPurchaseFile() const
  673. {
  674. MissionGroup* pGroup = &groups[currentStage];
  675. return pGroup->infos[currentMission]->purchaseFileName;
  676. }
  677. long LogisticsMissionInfo::getCurrentDropWeight() const
  678. {
  679. MissionGroup* pGroup = &groups[currentStage];
  680. if ( currentMission != -1 )
  681. return pGroup->infos[currentMission]->dropWeight;
  682. else
  683. return 10000;
  684. }
  685. const char* LogisticsMissionInfo::getCurrentOperationFile() const
  686. {
  687. MissionGroup* pGroup = &groups[currentStage];
  688. if ( pGroup )
  689. return pGroup->operationFileName;
  690. return NULL;
  691. }
  692. const char* LogisticsMissionInfo::getCurrentVideo() const
  693. {
  694. MissionGroup* pGroup = &groups[currentStage];
  695. if ( pGroup )
  696. {
  697. MissionInfo* pInfo = pGroup->infos[currentMission];
  698. if ( pInfo )
  699. {
  700. if ( pInfo->videoName.Length() )
  701. return pInfo->videoName;
  702. }
  703. return pGroup->videoFileName;
  704. }
  705. return NULL;
  706. }
  707. long LogisticsMissionInfo::getCurrentLogisticsTuneId()
  708. {
  709. MissionGroup* pGroup = &groups[currentStage];
  710. if ( pGroup )
  711. return pGroup->logisticsTuneId;
  712. return -1;
  713. }
  714. const char* LogisticsMissionInfo::getCurrentMissionDescription() const
  715. {
  716. MissionGroup* pGroup = &groups[currentStage];
  717. if ( pGroup )
  718. return pGroup->infos[currentMission]->description;
  719. return NULL;
  720. }
  721. bool LogisticsMissionInfo::getMissionAvailable( const char* missionName )
  722. {
  723. MissionGroup* pGroup = &groups[currentStage];
  724. for ( int i = 0; i < pGroup->infos.Count(); i++ )
  725. {
  726. if ( pGroup->infos[i]->fileName.Compare( missionName ) == 0 )
  727. {
  728. return !pGroup->infos[i]->completed;
  729. }
  730. }
  731. return NULL;
  732. }
  733. const char* LogisticsMissionInfo::getCurrentMissionFriendlyName() const
  734. {
  735. if ( currentStage >= groupCount )
  736. return NULL;
  737. MissionGroup* pGroup = &groups[currentStage];
  738. if ( pGroup )
  739. return pGroup->infos[currentMission]->missionDescriptiveName;
  740. return NULL;
  741. }
  742. const char* LogisticsMissionInfo::getCurrentABLScriptName() const
  743. {
  744. if ( currentStage >= groupCount )
  745. return NULL;
  746. MissionGroup* pGroup = &groups[currentStage];
  747. if ( pGroup )
  748. return pGroup->ablBrainName;
  749. return NULL;
  750. }
  751. const char* LogisticsMissionInfo::getMissionFriendlyName( const char* missionName ) const
  752. {
  753. if ( currentStage >= groupCount )
  754. return NULL;
  755. MissionGroup* pGroup = &groups[currentStage];
  756. for ( int i = 0; i < pGroup->infos.Count(); i++ )
  757. {
  758. if ( pGroup->infos[i]->fileName.Compare( missionName ) == 0 )
  759. {
  760. return pGroup->infos[i]->missionDescriptiveName;
  761. }
  762. }
  763. return NULL;
  764. }
  765. int LogisticsMissionInfo::getCurrentRP() const
  766. {
  767. if ( currentMission == -1 )
  768. return 0;
  769. MissionGroup* pGroup = &groups[currentStage];
  770. return pGroup->infos[currentMission]->resourcePoints;
  771. }
  772. const char* LogisticsMissionInfo::getCurrentBigVideo() const
  773. {
  774. if ( currentStage == -1 )
  775. return NULL;
  776. MissionGroup* pGroup = &groups[currentStage];
  777. if ( pGroup->bigVideoShown )
  778. return NULL;
  779. pGroup->bigVideoShown = true;
  780. return pGroup->bigVideoName;
  781. }
  782. const char* LogisticsMissionInfo::getFinalVideo() const
  783. {
  784. return finalVideoName;
  785. }
  786. bool LogisticsMissionInfo::campaignOver() const
  787. {
  788. return currentStage == groupCount;
  789. }
  790. void LogisticsMissionInfo::setMultiplayer()
  791. {
  792. clear();
  793. bMultiplayer = true;
  794. groups = new MissionGroup[1];
  795. currentStage = 0;
  796. MissionInfo* pInfo = new MissionInfo;
  797. groups[0].infos.Append( pInfo );
  798. currentMission = 0;
  799. groupCount = 1;
  800. }
  801. void LogisticsMissionInfo::setPurchaseFile( const char* fileName )
  802. {
  803. gosASSERT( bMultiplayer) ;
  804. MissionInfo* pInfo = groups[0].infos[0];
  805. pInfo->purchaseFileName = missionPath;
  806. pInfo->purchaseFileName += fileName;
  807. pInfo->purchaseFileName += ".fit";
  808. }
  809. int LogisticsMissionInfo::getAdditionalPurachaseFiles( const char** list, long& maxCount )
  810. {
  811. if ( maxCount >= additionalPurchaseFiles.Count() )
  812. {
  813. long i = 0;
  814. for ( FILE_LIST::EIterator iter = additionalPurchaseFiles.Begin(); !iter.IsDone(); iter++ )
  815. {
  816. list[i++] = *iter;
  817. }
  818. }
  819. maxCount = additionalPurchaseFiles.Count();
  820. return additionalPurchaseFiles.Count();
  821. }
  822. void LogisticsMissionInfo::addBonusPurchaseFile( const char* fileName )
  823. {
  824. if ( !fileName )
  825. return;
  826. char* pNewFile = new char[strlen( fileName )+1];
  827. strcpy( pNewFile, fileName );
  828. additionalPurchaseFiles.Append( pNewFile );
  829. }
  830. bool LogisticsMissionInfo::skipLogistics()
  831. {
  832. if ( MPlayer )
  833. return 0;
  834. if (currentStage >= groupCount)
  835. return false;
  836. MissionGroup* pGroup = &groups[currentStage];
  837. return !pGroup->infos[currentMission]->playLogistics;
  838. }
  839. bool LogisticsMissionInfo::skipPilotReview()
  840. {
  841. // need to subtract a mission, since we already set this one complete if we
  842. // got here
  843. MissionInfo* pInfo = getPreviousMission();
  844. if ( !pInfo )
  845. return 0;
  846. return !pInfo->playPilotPromotion;
  847. }
  848. bool LogisticsMissionInfo::skipSalvageScreen()
  849. {
  850. // need to subtract a mission, since we already set this one complete if we
  851. // got here
  852. MissionInfo* pInfo = getPreviousMission();
  853. if ( !pInfo )
  854. return 0;
  855. return !pInfo->playSalvage;
  856. }
  857. bool LogisticsMissionInfo::skipPurchasing()
  858. {
  859. if ( MPlayer )
  860. return 0;
  861. MissionGroup* pGroup = &groups[currentStage];
  862. return !pGroup->infos[currentMission]->playPurchasing;
  863. }
  864. LogisticsMissionInfo::MissionInfo* LogisticsMissionInfo::getPreviousMission()
  865. {
  866. if ( currentMission > 0 )
  867. {
  868. MissionGroup* pGroup = &groups[currentStage];
  869. return pGroup->infos[currentMission-1];
  870. }
  871. else if ( currentStage > 0 )
  872. {
  873. MissionGroup* pGroup = &groups[currentStage]-1;
  874. int Count = pGroup->infos.Count();
  875. if ( Count )
  876. return pGroup->infos[Count-1];
  877. else
  878. return NULL;
  879. }
  880. else if ( currentStage == 0 ) //There may be only one stage. I.e. Tutorials!
  881. {
  882. MissionGroup* pGroup = &groups[currentStage];
  883. int Count = pGroup->infos.Count();
  884. if ( Count )
  885. return pGroup->infos[Count-1];
  886. else
  887. return NULL;
  888. }
  889. return NULL;
  890. }
  891. bool LogisticsMissionInfo::isSingleMission() const
  892. {
  893. if ( groupCount == 1 )
  894. {
  895. if ( groups[0].infos.Count() == 1 )
  896. return 1;
  897. }
  898. return 0;
  899. }
  900. bool LogisticsMissionInfo:: showChooseMission()
  901. {
  902. if ( MPlayer )
  903. return 0;
  904. MissionGroup* pGroup = &groups[currentStage];
  905. return pGroup->infos[currentMission]->playMissionSelection;
  906. }
  907. bool LogisticsMissionInfo::canHaveSalavageCraft()
  908. {
  909. MissionGroup* pGroup = &groups[currentStage];
  910. return pGroup->infos[currentMission]->enableSalavageCraft;
  911. }
  912. bool LogisticsMissionInfo::canHaveRepairTruck()
  913. {
  914. MissionGroup* pGroup = &groups[currentStage];
  915. return pGroup->infos[currentMission]->enableRepairTruck;
  916. }
  917. bool LogisticsMissionInfo::canHaveScoutCopter()
  918. {
  919. MissionGroup* pGroup = &groups[currentStage];
  920. return pGroup->infos[currentMission]->enableScoutCopter;
  921. }
  922. bool LogisticsMissionInfo::canHaveArtilleryPiece()
  923. {
  924. MissionGroup* pGroup = &groups[currentStage];
  925. return pGroup->infos[currentMission]->enableArtilleryPiece;
  926. }
  927. bool LogisticsMissionInfo::canHaveAirStrike()
  928. {
  929. MissionGroup* pGroup = &groups[currentStage];
  930. return pGroup->infos[currentMission]->enableAirStrike;
  931. }
  932. bool LogisticsMissionInfo::canHaveSensorStrike()
  933. {
  934. MissionGroup* pGroup = &groups[currentStage];
  935. return pGroup->infos[currentMission]->enableSensorStrike;
  936. }
  937. bool LogisticsMissionInfo::canHaveMineLayer()
  938. {
  939. MissionGroup* pGroup = &groups[currentStage];
  940. return pGroup->infos[currentMission]->enableMineLayer;
  941. }
  942. bool LogisticsMissionInfo::getVideoShown()
  943. {
  944. MissionGroup* pGroup = &groups[currentStage];
  945. return pGroup->videoShown;
  946. }
  947. void LogisticsMissionInfo::setVideoShown()
  948. {
  949. MissionGroup* pGroup = &groups[currentStage];
  950. pGroup->videoShown = true;
  951. }
  952. //*************************************************************************************************
  953. // end of file ( LogisticsMissionInfo.cpp )