MissionBegin.cpp 29 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226
  1. /*************************************************************************************************\
  2. MissionBegin.cpp : Implementation of the MissionBegin component.
  3. //---------------------------------------------------------------------------//
  4. // Copyright (C) Microsoft Corporation. All rights reserved. //
  5. //===========================================================================//
  6. \*************************************************************************************************/
  7. #include "MissionBegin.h"
  8. #include "McLib.h"
  9. #include "objMgr.h"
  10. #include "Mech.h"
  11. #include "LogisticsVariant.h"
  12. #include "MechIcon.h"
  13. #include "LogisticsData.h"
  14. #include "MissionSelectionScreen.h"
  15. #include "MechBayScreen.h"
  16. #include "PilotReadyScreen.h"
  17. #include "MechPurchaseScreen.h"
  18. #include "MechLabScreen.h"
  19. #include "MissionBriefingScreen.h"
  20. #include "MPConnectionType.h"
  21. #include "MPParameterScreen.h"
  22. #include "MPGameBrowser.h"
  23. #include "MPLoadMap.h"
  24. #include "MainMenu.h"
  25. #include "mission.h"
  26. #include "gameSound.h"
  27. #include "LoadScreen.h"
  28. #include "MPPrefs.h"
  29. #include "ChatWindow.h"
  30. #include "LogisticsMechIcon.h"
  31. #include "prefs.h"
  32. extern CPrefs prefs;
  33. class MechLabScreen;
  34. extern long renderer;
  35. void initABL (void);
  36. void closeABL (void);
  37. //Tutorial
  38. // Please save these two flags with the saveGames!!
  39. bool MissionBegin::FirstTimePurchase = true;
  40. bool MissionBegin::FirstTimeMechLab = true;
  41. MissionBegin::MissionBegin()
  42. {
  43. memset( screens, 0, sizeof( LogisticsScreen* ) * 5/*dim screen X*/ * 3/*dim screen Y*/ );
  44. memset( singlePlayerScreens, 0, sizeof( LogisticsScreen* ) * 5/*dim screen X*/ * 3/*dim screen Y*/ );
  45. memset( multiplayerScreens, 0, sizeof( LogisticsScreen* ) * 5/*dim screen X*/ * 3/*dim screen Y*/ );
  46. curScreenX = -1;
  47. curScreenY = 1;
  48. mainMenu = NULL;
  49. bSplash = 0;
  50. bMultiplayer = 0;
  51. animJustBegun = 0;
  52. placeHolderScreen = NULL;
  53. }
  54. MissionBegin::~MissionBegin()
  55. {
  56. for ( int i = 0; i < 5; i++ )
  57. {
  58. for ( int j = 0; j < 3; j++ )
  59. {
  60. if ( singlePlayerScreens[i][j] )
  61. {
  62. delete singlePlayerScreens[i][j];
  63. singlePlayerScreens[i][j] = NULL;
  64. }
  65. if ( multiplayerScreens[i][j] )
  66. {
  67. delete multiplayerScreens[i][j];
  68. multiplayerScreens[i][j] = NULL;
  69. }
  70. }
  71. }
  72. delete LogisticsMechIcon::s_pTemplateIcon;
  73. LogisticsMechIcon::s_pTemplateIcon = NULL;
  74. delete placeHolderScreen;
  75. placeHolderScreen = NULL;
  76. if (mainMenu)
  77. {
  78. delete mainMenu;
  79. mainMenu = NULL;
  80. }
  81. }
  82. bool MissionBegin::startAnimation (long bId, bool isButton, float scrollTime, long nFlashes)
  83. {
  84. if (animationRunning)
  85. return false;
  86. else
  87. {
  88. animationRunning = true;
  89. timeLeftToScroll = scrollTime;
  90. targetButtonId = bId;
  91. targetIsButton = isButton;
  92. buttonNumFlashes = nFlashes;
  93. buttonFlashTime = 0.0f;
  94. }
  95. return true;
  96. }
  97. void MissionBegin::begin()
  98. {
  99. bReadyToLoad = 0;
  100. initABL();
  101. //-----------------------------------------------
  102. // Tutorial Data
  103. animationRunning = false;
  104. timeLeftToScroll = 0.0f;
  105. targetButtonId = 0;
  106. buttonNumFlashes = 0;
  107. buttonFlashTime = 0.0f;
  108. //---------------------------------------------
  109. //Load up the Logistics Brain for Tutorials.
  110. // OK if brain file is NOT there!!
  111. FullPathFileName brainFileName;
  112. const char * brainfile = LogisticsData::instance->getCurrentABLScript();
  113. if ( brainfile )
  114. brainFileName.init(missionPath, brainfile, ".abl");
  115. if (brainfile && fileExists(brainFileName))
  116. {
  117. long numErrors, numLinesProcessed;
  118. logisticsScriptHandle = ABLi_preProcess(brainFileName, &numErrors, &numLinesProcessed);
  119. gosASSERT(logisticsScriptHandle >= 0);
  120. logisticsBrain = new ABLModule;
  121. gosASSERT(logisticsBrain != NULL);
  122. #ifdef _DEBUG
  123. long brainErr =
  124. #endif
  125. logisticsBrain->init(logisticsScriptHandle);
  126. gosASSERT(brainErr == NO_ERR);
  127. logisticsBrain->setName("Logistics");
  128. }
  129. else
  130. {
  131. logisticsScriptHandle = 0;
  132. logisticsBrain = NULL;
  133. }
  134. //---------------------------------------------
  135. DWORD localRenderer = prefs.renderer;
  136. if (prefs.renderer != 0 && prefs.renderer != 3)
  137. localRenderer = 0;
  138. bool localFullScreen = prefs.fullScreen;
  139. bool localWindow = !prefs.fullScreen;
  140. if (Environment.fullScreen && prefs.fullScreen)
  141. localFullScreen = false;
  142. if (prefs.renderer == 3)
  143. gos_SetScreenMode(800,600,16,0,0,0,true,localFullScreen,0,localWindow,0,localRenderer);
  144. else if (prefs.bitDepth)
  145. gos_SetScreenMode(800,600,32,prefs.renderer,0,0,0,localFullScreen,0,localWindow,0,localRenderer);
  146. else
  147. gos_SetScreenMode(800,600,16,prefs.renderer,0,0,0,localFullScreen,0,localWindow,0,localRenderer);
  148. if ( mainMenu ) // already initialized
  149. {
  150. curScreenX = 0;
  151. curScreenY = 1;
  152. if ( LogisticsData::instance->skipLogistics() )
  153. {
  154. if ( LogisticsData::instance->showChooseMission() )
  155. {
  156. curScreenX = 3;
  157. curScreenY = 1;
  158. screens[3][1] = singlePlayerScreens[0][1];
  159. }
  160. }
  161. if ( screens[curScreenX][curScreenY] )
  162. {
  163. screens[curScreenX][curScreenY]->beginFadeIn( 1.0 );
  164. screens[curScreenX][curScreenY]->begin();
  165. }
  166. Mission::initTGLForLogistics();
  167. bDone = 0;
  168. return;
  169. }
  170. MissionSelectionScreen* pMissionSelectionScreen;
  171. MechBayScreen* pMechBayScreen;
  172. PilotReadyScreen* pPilotSelectionScreen;
  173. MechLabScreen* pMechLabScreen;
  174. MechPurchaseScreen* pPurchaseMechScreen;
  175. MissionBriefingScreen* pBriefingScreen;
  176. LoadScreenWrapper* pLoadScreen;
  177. pMissionSelectionScreen = NULL;
  178. pMechBayScreen = NULL;
  179. pPilotSelectionScreen = NULL;
  180. pMechLabScreen = NULL;
  181. pPurchaseMechScreen = NULL;
  182. pBriefingScreen = NULL;
  183. pLoadScreen = NULL;
  184. bDone = 0;
  185. // initialize the main menu
  186. mainMenu = new MainMenu;
  187. char path[256];
  188. strcpy( path, artPath );
  189. strcat( path, "mcl_mm.fit" );
  190. FitIniFile file;
  191. if ( NO_ERR != file.open( path ) )
  192. {
  193. char error[256];
  194. sprintf( error, "couldn't open file %s", path );
  195. Assert( 0, 0, error );
  196. return;
  197. }
  198. mainMenu->init( file );
  199. mainMenu->setDrawBackground( true );
  200. mainMenu->begin();
  201. file.close();
  202. // initialize mission selection
  203. pMissionSelectionScreen = new MissionSelectionScreen();
  204. strcpy( path, artPath );
  205. strcat( path, "mcl_cm_layout.fit" );
  206. if ( NO_ERR != file.open( path ) )
  207. {
  208. char error[256];
  209. sprintf( error, "couldn't open file %s", path );
  210. Assert( 0, 0, error );
  211. return;
  212. }
  213. pMissionSelectionScreen->init( &file );
  214. file.close();
  215. // initialize mission briefing
  216. pBriefingScreen = new MissionBriefingScreen();
  217. strcpy( path, artPath );
  218. strcat( path, "mcl_mn.fit" );
  219. if ( NO_ERR != file.open( path ) )
  220. {
  221. char error[256];
  222. sprintf( error, "couldn't open file %s", path );
  223. Assert( 0, 0, error );
  224. return;
  225. }
  226. pBriefingScreen->init( &file );
  227. file.close();
  228. // initialize mech bay
  229. strcpy( path, artPath );
  230. strcat( path, "mcl_mb_layout.fit" );
  231. pMechBayScreen = new MechBayScreen();
  232. if ( NO_ERR != file.open( path ) )
  233. {
  234. char error[256];
  235. sprintf( error, "couldn't open file %s", path );
  236. Assert( 0, 0, error );
  237. return;
  238. }
  239. // initialize animations, these are held in the mech bay file
  240. pMechBayScreen->init( &file );
  241. file.seekBlock( "DownAnim" );
  242. downAnim.init(&file, "");
  243. file.seekBlock("UpAnim");
  244. upAnim.init( &file, "" );
  245. file.seekBlock( "NextAnim" );
  246. leftAnim.init( &file, "" );
  247. file.seekBlock( "BackAnim" );
  248. rightAnim.init( &file, "" );
  249. file.close();
  250. // initialize pilot ready
  251. strcpy( path, artPath );
  252. strcat( path, "mcl_pr_layout.fit" );
  253. if ( NO_ERR != file.open( path ) )
  254. {
  255. char error[256];
  256. sprintf( error, "couldn't open file %s", path );
  257. Assert( 0, 0, error );
  258. return;
  259. }
  260. // initialize pilot ready
  261. pPilotSelectionScreen = new PilotReadyScreen;
  262. pPilotSelectionScreen->init( &file );
  263. file.close();
  264. // initalize purchase pilot
  265. pPurchaseMechScreen = new MechPurchaseScreen;
  266. strcpy( path, artPath );
  267. strcat( path, "mcl_m$.fit" );
  268. if ( NO_ERR != file.open( path ) )
  269. {
  270. char error[256];
  271. sprintf( error, "couldn't open file %s", path );
  272. Assert( 0, 0, error );
  273. return;
  274. }
  275. pPurchaseMechScreen->init( file );
  276. file.close();
  277. // initialize mech lab
  278. pMechLabScreen = new MechLabScreen;
  279. strcpy( path, artPath );
  280. strcat( path, "mcl_mc.fit" );
  281. if ( NO_ERR != file.open( path ) )
  282. {
  283. char error[256];
  284. sprintf( error, "couldn't open file %s", path );
  285. Assert( 0, 0, error );
  286. return;
  287. }
  288. pMechLabScreen->init( file );
  289. file.close();
  290. // initialize mech lab
  291. pLoadScreen = new LoadScreenWrapper;
  292. strcpy( path, artPath );
  293. strcat( path, "mcl_loadingscreen.fit" );
  294. if ( NO_ERR != file.open( path ) )
  295. {
  296. char error[256];
  297. sprintf( error, "couldn't open file %s", path );
  298. Assert( 0, 0, error );
  299. return;
  300. }
  301. pLoadScreen->init( file );
  302. file.close();
  303. singlePlayerScreens[0][1] = pMissionSelectionScreen;
  304. singlePlayerScreens[1][1] = pBriefingScreen;
  305. singlePlayerScreens[2][1] = pMechBayScreen;
  306. singlePlayerScreens[3][1] = pPilotSelectionScreen;
  307. singlePlayerScreens[2][0] = pPurchaseMechScreen;
  308. singlePlayerScreens[2][2] = pMechLabScreen;
  309. singlePlayerScreens[4][1] = pLoadScreen;
  310. for ( int i = 0; i < 4; i++ )
  311. {
  312. for ( int j = 0; j < 4; j++ )
  313. {
  314. if ( singlePlayerScreens[i][j] )
  315. {
  316. /*if ( singlePlayerScreens[i][j]->getButton(MB_MSG_NEXT) )
  317. singlePlayerScreens[i][j]->getButton(MB_MSG_NEXT)->setPressFX( -1 );
  318. if ( singlePlayerScreens[i][j]->getButton(MB_MSG_PREV) )
  319. singlePlayerScreens[i][j]->getButton(MB_MSG_PREV)->setPressFX( -1 );*/
  320. if ( singlePlayerScreens[i][j]->getButton(MB_MSG_MAINMENU) )
  321. singlePlayerScreens[i][j]->getButton(MB_MSG_MAINMENU)->setPressFX( LOG_MAINMENUBUTTON );
  322. }
  323. }
  324. }
  325. for (i = 0; i < 5/*dim screen X*/; i+=1)
  326. {
  327. int j;
  328. for (j = 0; j < 3/*dim screen Y*/; j += 1)
  329. {
  330. screens[i][j] = singlePlayerScreens[i][j];
  331. }
  332. }
  333. pMissionSelectionScreen->begin();
  334. }
  335. void MissionBegin::init()
  336. {
  337. begin();
  338. }
  339. void MissionBegin::end()
  340. {
  341. logisticsBrain = NULL;
  342. closeABL();
  343. }
  344. bool inPurchase = false;
  345. bool inMechLab = false;
  346. //Returns screen ID as a function of curScreenX and curScreenY
  347. long MissionBegin::getCurrentScreenId()
  348. {
  349. //singlePlayerScreens[0][1] = pMissionSelectionScreen; ID 1
  350. //singlePlayerScreens[1][1] = pBriefingScreen; ID 11
  351. //singlePlayerScreens[2][1] = pMechBayScreen; ID 21
  352. //singlePlayerScreens[3][1] = pPilotSelectionScreen; ID 31
  353. //singlePlayerScreens[2][0] = pPurchaseMechScreen; ID 20
  354. //singlePlayerScreens[2][2] = pMechLabScreen; ID 22
  355. //singlePlayerScreens[4][1] = pLoadScreen; ID 41
  356. long screenId = 10 * curScreenX + curScreenY;
  357. if ((screenId == 20) && FirstTimePurchase && !MPlayer )
  358. inPurchase = true;
  359. else if ((screenId == 22) && FirstTimeMechLab && !MPlayer )
  360. inMechLab = true;
  361. if ((screenId != 20) && inPurchase)
  362. FirstTimePurchase = false;
  363. else if ((screenId != 22) && inMechLab)
  364. FirstTimeMechLab = false;
  365. if ((screenId == 20) && !FirstTimePurchase)
  366. screenId = 0;
  367. else if ((screenId == 22) && !FirstTimeMechLab)
  368. screenId = 0;
  369. return (screenId);
  370. }
  371. const char* MissionBegin::update()
  372. {
  373. if ( bSplash )
  374. {
  375. mainMenu->update();
  376. if ( LogisticsScreen::RUNNING != mainMenu->getStatus() )
  377. {
  378. bSplash = 0;
  379. if ( LogisticsScreen::RESTART == mainMenu->getStatus() )
  380. {
  381. LogisticsScreen* pCurScreen = screens[curScreenX][curScreenY];
  382. if ( pCurScreen )
  383. pCurScreen->end();
  384. int i;
  385. for (i = 0; i < 5/*dim screen X*/; i+=1)
  386. {
  387. int j;
  388. for (j = 0; j < 3/*dim screen Y*/; j += 1)
  389. {
  390. screens[i][j] = singlePlayerScreens[i][j];
  391. }
  392. }
  393. if ( LogisticsData::instance->skipLogistics() )
  394. {
  395. if ( LogisticsData::instance->showChooseMission() )
  396. {
  397. curScreenX = 3;
  398. curScreenY = 1;
  399. screens[3][1] = singlePlayerScreens[0][1];
  400. screens[curScreenX][curScreenY]->begin();
  401. }
  402. else
  403. {
  404. curScreenX = 4;
  405. curScreenY = 1;
  406. screens[curScreenX][curScreenY]->begin();
  407. }
  408. }
  409. else
  410. {
  411. curScreenX = 0;
  412. curScreenY = 1;
  413. screens[curScreenX][curScreenY]->beginFadeIn( 1.0 );
  414. screens[curScreenX][curScreenY]->begin();
  415. }
  416. return LogisticsData::instance->getCurrentBigVideo();
  417. }
  418. else if ( LogisticsScreen::MULTIPLAYERRESTART == mainMenu->getStatus() )
  419. {
  420. LogisticsScreen* pCurScreen = screens[curScreenX][curScreenY];
  421. if ( pCurScreen )
  422. pCurScreen->end();
  423. beginMPlayer();
  424. int i;
  425. for (i = 0; i < 5/*dim screen X*/; i+=1)
  426. {
  427. int j;
  428. for (j = 0; j < 3/*dim screen Y*/; j += 1)
  429. {
  430. screens[i][j] = multiplayerScreens[i][j];
  431. }
  432. }
  433. curScreenX = 0;
  434. curScreenY = 1;
  435. screens[curScreenX][curScreenY]->beginFadeIn( 1.0 );
  436. }
  437. else if ( LogisticsScreen::SKIPONENEXT == mainMenu->getStatus() )
  438. {
  439. LogisticsScreen* pCurScreen = screens[curScreenX][curScreenY];
  440. if ( pCurScreen )
  441. pCurScreen->end();
  442. int i;
  443. for (i = 0; i < 5/*dim screen X*/; i+=1)
  444. {
  445. int j;
  446. for (j = 0; j < 3/*dim screen Y*/; j += 1)
  447. {
  448. screens[i][j] = singlePlayerScreens[i][j];
  449. }
  450. }
  451. curScreenX = 1;
  452. curScreenY = 1;
  453. screens[curScreenX][curScreenY]->beginFadeIn( 1.0 );
  454. screens[curScreenX][curScreenY]->begin();
  455. }
  456. if ( screens[curScreenX][curScreenY] && curScreenX != -1 )
  457. {
  458. screens[curScreenX][curScreenY]->begin();
  459. }
  460. else // no screen? stay on main menu
  461. {
  462. bSplash = true;
  463. mainMenu->begin();
  464. }
  465. }
  466. return NULL;
  467. }
  468. leftAnim.update();
  469. rightAnim.update();
  470. downAnim.update();
  471. upAnim.update();
  472. LogisticsScreen* pCurScreen = screens[curScreenX][curScreenY];
  473. if ( pCurScreen )
  474. {
  475. if (logisticsBrain && !MPlayer)
  476. logisticsBrain->execute();
  477. //--------------------
  478. //For Tutorial
  479. if (animationRunning)
  480. {
  481. //Move mouse to correct position.
  482. if (targetIsButton)
  483. {
  484. aButton *targetButton = pCurScreen->getButton(targetButtonId);
  485. if (!targetButton)
  486. {
  487. animationRunning = false;
  488. }
  489. else
  490. {
  491. userInput->setMouseCursor(mState_TUTORIALS);
  492. //Get button position.
  493. float buttonPosX = (targetButton->left() + targetButton->right()) * 0.5f;
  494. float buttonPosY = (targetButton->top() + targetButton->bottom()) * 0.5f;
  495. //-------------------
  496. // Mouse Checks Next
  497. float realMouseX = userInput->realMouseX();
  498. float realMouseY = userInput->realMouseY();
  499. if (timeLeftToScroll > 0.0f)
  500. {
  501. float xDistLeft = buttonPosX - realMouseX;
  502. float yDistLeft = buttonPosY - realMouseY;
  503. float xDistThisFrame = xDistLeft / timeLeftToScroll * frameLength;
  504. float yDistThisFrame = yDistLeft / timeLeftToScroll * frameLength;
  505. userInput->setMousePos(realMouseX + xDistThisFrame, realMouseY+yDistThisFrame);
  506. timeLeftToScroll -= frameLength;
  507. }
  508. else
  509. {
  510. userInput->setMousePos(buttonPosX,buttonPosY);
  511. //We are there. Start flashing.
  512. if (buttonNumFlashes)
  513. {
  514. buttonFlashTime += frameLength;
  515. if ( buttonFlashTime > .5f )
  516. {
  517. pCurScreen->getButton( targetButtonId )->setColor( 0xffffffff );
  518. buttonFlashTime = 0.0f;
  519. buttonNumFlashes--;
  520. }
  521. else if ( buttonFlashTime > .25f )
  522. {
  523. pCurScreen->getButton( targetButtonId )->setColor( 0xff7f7f7f );
  524. }
  525. }
  526. else
  527. {
  528. //Flashing is done. We now return you to your regularly scheduled program.
  529. animationRunning = false;
  530. pCurScreen->getButton( targetButtonId )->setColor( 0xffffffff );
  531. }
  532. }
  533. }
  534. }
  535. else
  536. {
  537. aRect *targetButton = pCurScreen->getRect(targetButtonId);
  538. if (!targetButton)
  539. {
  540. animationRunning = false;
  541. }
  542. else
  543. {
  544. userInput->setMouseCursor(mState_TUTORIALS);
  545. //Get button position.
  546. float buttonPosX = (targetButton->left() + targetButton->right()) * 0.5f;
  547. float buttonPosY = (targetButton->top() + targetButton->bottom()) * 0.5f;
  548. //-------------------
  549. // Mouse Checks Next
  550. float realMouseX = userInput->realMouseX();
  551. float realMouseY = userInput->realMouseY();
  552. if (timeLeftToScroll > 0.0f)
  553. {
  554. float xDistLeft = buttonPosX - realMouseX;
  555. float yDistLeft = buttonPosY - realMouseY;
  556. float xDistThisFrame = xDistLeft / timeLeftToScroll * frameLength;
  557. float yDistThisFrame = yDistLeft / timeLeftToScroll * frameLength;
  558. userInput->setMousePos(realMouseX + xDistThisFrame, realMouseY+yDistThisFrame);
  559. timeLeftToScroll -= frameLength;
  560. }
  561. else
  562. {
  563. userInput->setMousePos(buttonPosX,buttonPosY);
  564. //We are there. Start flashing.
  565. if (buttonNumFlashes)
  566. {
  567. buttonFlashTime += frameLength;
  568. if ( buttonFlashTime > .5f )
  569. {
  570. pCurScreen->getRect( targetButtonId )->setColor( 0xff000000 );
  571. buttonFlashTime = 0.0f;
  572. buttonNumFlashes--;
  573. }
  574. else if ( buttonFlashTime > .25f )
  575. {
  576. pCurScreen->getRect( targetButtonId )->setColor( 0xffffffff );
  577. }
  578. }
  579. else
  580. {
  581. //Flashing is done. We now return you to your regularly scheduled program.
  582. animationRunning = false;
  583. pCurScreen->getRect( targetButtonId )->setColor( 0xff000000 );
  584. }
  585. }
  586. }
  587. }
  588. }
  589. pCurScreen->update();
  590. if ( pCurScreen->getStatus() == LogisticsScreen::GOTOSPLASH || ( MPlayer && MPlayer->hostLeft ) )
  591. {
  592. pCurScreen->end();
  593. beginSplash();
  594. if ( MPlayer && MPlayer->hostLeft )
  595. {
  596. MPlayer->closeSession();
  597. delete MPlayer;
  598. MPlayer = NULL;
  599. }
  600. return NULL;
  601. }
  602. if ( pCurScreen->getStatus() == LogisticsScreen::READYTOLOAD &&
  603. (curScreenX == 4 ||( MPlayer && curScreenX == 3 )) )
  604. bReadyToLoad = true;
  605. if ( pCurScreen->getStatus() != LogisticsScreen::RUNNING )
  606. {
  607. soundSystem->stopBettySample(); // don't want to carry droning on to next screen
  608. soundSystem->stopSupportSample();
  609. if ( pCurScreen->getStatus() == LogisticsScreen::NEXT )
  610. {
  611. pCurScreen->end();
  612. if ( curScreenX < 4 )
  613. {
  614. if ( MPlayer )// different rules for multiplayer
  615. {
  616. if ( dynamic_cast<MPParameterScreen*>( screens[curScreenX][curScreenY] ) )
  617. {
  618. if ( curScreenX == 2 )
  619. {
  620. if ( !MPlayer->missionSettings.quickStart)
  621. {
  622. setUpMultiplayerLogisticsScreens();
  623. }
  624. }
  625. else if ( curScreenX == 3 )
  626. {
  627. bDone = true;
  628. }
  629. }
  630. }
  631. if ( screens[curScreenX+1][curScreenY] )
  632. {
  633. if ( screens[curScreenX+1][curScreenY] == placeHolderScreen )
  634. curScreenX++;
  635. screens[curScreenX+1][curScreenY]->begin();
  636. }
  637. leftAnim.begin();
  638. curScreenX++;
  639. soundSystem->playDigitalSample( LOG_NEXTBACKBUTTONS );
  640. animJustBegun = true;
  641. }
  642. else
  643. {
  644. bDone = true;
  645. }
  646. }
  647. else if ( pCurScreen->getStatus() == LogisticsScreen::PREVIOUS )
  648. {
  649. pCurScreen->end();
  650. if (screens[curScreenX-1][curScreenY] )
  651. {
  652. if ( screens[curScreenX-1][curScreenY] == placeHolderScreen )
  653. curScreenX--;
  654. screens[curScreenX-1][curScreenY]->begin();
  655. }
  656. rightAnim.begin();
  657. curScreenX--;
  658. soundSystem->playDigitalSample( LOG_NEXTBACKBUTTONS );
  659. animJustBegun = true;
  660. }
  661. else if ( pCurScreen->getStatus() == LogisticsScreen::DOWN )
  662. {
  663. pCurScreen->end();
  664. if ( screens[curScreenX][curScreenY+1] )
  665. screens[curScreenX][curScreenY+1]->begin();
  666. upAnim.begin();
  667. curScreenY++;
  668. soundSystem->playDigitalSample( LOG_NEXTBACKBUTTONS );
  669. animJustBegun = true;
  670. }
  671. else if ( pCurScreen->getStatus() == LogisticsScreen::UP )
  672. {
  673. pCurScreen->end();
  674. if (screens[curScreenX][curScreenY-1])
  675. screens[curScreenX][curScreenY-1]->begin();
  676. downAnim.begin();
  677. curScreenY--;
  678. soundSystem->playDigitalSample( LOG_NEXTBACKBUTTONS );
  679. animJustBegun = true;
  680. }
  681. else if ( pCurScreen->getStatus() == LogisticsScreen::MAINMENU )
  682. {
  683. bSplash = true;
  684. mainMenu->setDrawBackground( false );
  685. mainMenu->begin();
  686. animJustBegun = true;
  687. }
  688. else if ( pCurScreen->getStatus() == LogisticsScreen::SKIPONENEXT )
  689. {
  690. pCurScreen->end();
  691. if ( curScreenX < 3 - 1 )
  692. {
  693. if ( screens[curScreenX+1+1][curScreenY] )
  694. screens[curScreenX+1+1][curScreenY]->begin();
  695. leftAnim.begin();
  696. curScreenX++;
  697. curScreenX++;
  698. soundSystem->playDigitalSample( LOG_NEXTBACKBUTTONS );
  699. animJustBegun = true;
  700. }
  701. else
  702. {
  703. bDone = true;
  704. }
  705. }
  706. else if ( pCurScreen->getStatus() == LogisticsScreen::SKIPONEPREVIOUS )
  707. {
  708. pCurScreen->end();
  709. if (screens[curScreenX-1-1][curScreenY] )
  710. screens[curScreenX-1-1][curScreenY]->begin();
  711. rightAnim.begin();
  712. curScreenX--;
  713. curScreenX--;
  714. soundSystem->playDigitalSample( LOG_NEXTBACKBUTTONS );
  715. animJustBegun = true;
  716. }
  717. }
  718. }
  719. else
  720. bDone = true;
  721. return NULL;
  722. }
  723. void MissionBegin::render()
  724. {
  725. long xOffset = 0;
  726. long yOffset = 0;
  727. LogisticsScreen* pOtherScreen = 0;
  728. LogisticsScreen* pCurScreen = 0;
  729. if ( curScreenX > -1 && curScreenY > -1 )
  730. {
  731. pCurScreen = screens[curScreenX][curScreenY];
  732. }
  733. long xOtherOffset = 0;
  734. long yOtherOffset = 0;
  735. if ( bSplash )
  736. {
  737. if ( pCurScreen )
  738. {
  739. if ( !MainMenu::bDrawMechlopedia)
  740. pCurScreen->render();
  741. else
  742. pCurScreen->beginFadeIn(1.0);
  743. }
  744. mainMenu->render();
  745. return;
  746. }
  747. if ( pCurScreen /*&& pCurScreen->getStatus() == LogisticsScreen::RUNNING*/ )
  748. {
  749. if ( leftAnim.isAnimating() && !leftAnim.isDone() )
  750. {
  751. if ( animJustBegun )
  752. leftAnim.begin(); // restart to compensate for LONG begins
  753. xOffset = leftAnim.getXDelta() + 800;
  754. yOffset = leftAnim.getYDelta();
  755. xOtherOffset = xOffset - 800;
  756. yOtherOffset = yOffset;
  757. pOtherScreen = screens[curScreenX-1][curScreenY];
  758. if ( pOtherScreen == placeHolderScreen )
  759. pOtherScreen = screens[curScreenX-2][curScreenY];
  760. }
  761. else if ( downAnim.isAnimating() && !downAnim.isDone() )
  762. {
  763. if ( animJustBegun )
  764. downAnim.begin(); // restart to compensate for LONG begins
  765. xOffset = downAnim.getXDelta();
  766. yOffset = downAnim.getYDelta();
  767. xOtherOffset = xOffset;
  768. yOtherOffset = yOffset + 600;
  769. pOtherScreen = screens[curScreenX][curScreenY + 1];
  770. }
  771. else if ( upAnim.isAnimating() && !upAnim.isDone() )
  772. {
  773. if ( animJustBegun )
  774. upAnim.begin(); // restart to compensate for LONG begins
  775. xOffset = upAnim.getXDelta();
  776. yOffset = upAnim.getYDelta();
  777. xOtherOffset = xOffset;
  778. yOtherOffset = yOffset - 600;
  779. pOtherScreen = screens[curScreenX][curScreenY - 1];
  780. }
  781. else if ( rightAnim.isAnimating() && !rightAnim.isDone() )
  782. {
  783. if ( animJustBegun )
  784. rightAnim.begin(); // restart to compensate for LONG begins
  785. xOffset = rightAnim.getXDelta() - 800;
  786. yOffset = rightAnim.getYDelta();
  787. xOtherOffset = xOffset + 800;
  788. yOtherOffset = yOffset;
  789. pOtherScreen = screens[curScreenX+1][curScreenY];
  790. if ( pOtherScreen == placeHolderScreen )
  791. pOtherScreen = screens[curScreenX+2][curScreenY];
  792. }
  793. if ( curScreenX == 4 ) // don't scroll last screen
  794. {
  795. if ( pOtherScreen )
  796. pOtherScreen->render( 0, 0 );
  797. pCurScreen->render( 0, 0 );
  798. }
  799. else
  800. {
  801. if ( pOtherScreen )
  802. pOtherScreen->render( xOtherOffset, yOtherOffset );
  803. pCurScreen->render( xOffset, yOffset );
  804. }
  805. }
  806. animJustBegun = false;
  807. }
  808. void MissionBegin::beginSplash( const char* playerName)
  809. {
  810. // check for old screen and end that
  811. if ( curScreenX > -1 && curScreenY > -1 )
  812. {
  813. LogisticsScreen* pCurScreen = screens[curScreenX][curScreenY];
  814. if ( pCurScreen )
  815. pCurScreen->end();
  816. }
  817. bSplash = true;
  818. curScreenX = 0;
  819. curScreenY = 1;
  820. bReadyToLoad = 0;
  821. bDone = 0;
  822. if ( mainMenu )
  823. {
  824. if ( MPlayer && MPlayer->launchedFromLobby )
  825. mainMenu->skipIntro();
  826. mainMenu->setDrawBackground( true );
  827. mainMenu->begin();
  828. soundSystem->playDigitalSample( LOG_MAINMENUBUTTON );
  829. if (playerName)
  830. mainMenu->setHostLeftDlg(playerName);
  831. }
  832. }
  833. void MissionBegin::beginMPlayer()
  834. {
  835. // already set up
  836. if ( multiplayerScreens[0][1] )
  837. return;
  838. //multiplayer setup screens
  839. MPConnectionType* pMPConnectionType = NULL;
  840. placeHolderScreen = NULL;
  841. MPGameBrowser* pMPGameBrowser = NULL;
  842. MPParameterScreen* pMPParameterScreen = NULL;
  843. char path[512];
  844. FitIniFile file;
  845. // initalize MPConnectionType
  846. pMPConnectionType = new MPConnectionType;
  847. strcpy( path, artPath );
  848. strcat( path, "mcl_mp_connectiontype.fit" );
  849. if ( NO_ERR != file.open( path ) )
  850. {
  851. char error[256];
  852. sprintf( error, "couldn't open file %s", path );
  853. Assert( 0, 0, error );
  854. return;
  855. }
  856. pMPConnectionType->init( &file );
  857. file.close();
  858. // initalize MPPlaceHolderScreen
  859. placeHolderScreen = new MPPlaceHolderScreen;
  860. // initalize MPParameterScreen
  861. pMPParameterScreen = new MPParameterScreen;
  862. strcpy( path, artPath );
  863. strcat( path, "mcl_mp_param.fit" );
  864. if ( NO_ERR != file.open( path ) )
  865. {
  866. char error[256];
  867. sprintf( error, "couldn't open file %s", path );
  868. Assert( 0, 0, error );
  869. return;
  870. }
  871. pMPParameterScreen->init( &file );
  872. file.close();
  873. // initalize MPGameBrowser
  874. pMPGameBrowser = new MPGameBrowser;
  875. strcpy( path, artPath );
  876. strcat( path, "mcl_mp_lanbrowser.fit" );
  877. if ( NO_ERR != file.open( path ) )
  878. {
  879. char error[256];
  880. sprintf( error, "couldn't open file %s", path );
  881. Assert( 0, 0, error );
  882. return;
  883. }
  884. pMPGameBrowser->init( &file );
  885. file.close();
  886. // initalize MP prefs
  887. MPPrefs* pMPPrefs = new MPPrefs;
  888. strcpy( path, artPath );
  889. strcat( path, "mcl_mp_playerprefs.fit" );
  890. if ( NO_ERR != file.open( path ) )
  891. {
  892. char error[256];
  893. sprintf( error, "couldn't open file %s", path );
  894. Assert( 0, 0, error );
  895. return;
  896. }
  897. pMPPrefs->init( file );
  898. file.close();
  899. LoadScreenWrapper* pMLoadScreen = new LoadScreenWrapper;
  900. strcpy( path, artPath );
  901. strcat( path, "mcl_loadingscreen.fit" );
  902. if ( NO_ERR != file.open( path ) )
  903. {
  904. char error[256];
  905. sprintf( error, "couldn't open file %s", path );
  906. Assert( 0, 0, error );
  907. return;
  908. }
  909. pMLoadScreen->init( file );
  910. file.close();
  911. pMPConnectionType->ppConnectionScreen = (void **)(&(screens[1][1]));
  912. pMPConnectionType->pLocalBrowserScreen = pMPGameBrowser;
  913. pMPConnectionType->pDirectTcpipScreen = pMPGameBrowser;
  914. pMPConnectionType->pMPPlaceHolderScreen = placeHolderScreen;
  915. multiplayerScreens[0][1] = pMPConnectionType;
  916. multiplayerScreens[1][1] = pMPGameBrowser;
  917. multiplayerScreens[2][1] = pMPParameterScreen;
  918. multiplayerScreens[3][1] = pMLoadScreen;
  919. multiplayerScreens[2][0] = pMPPrefs;
  920. pMPPrefs->initColors();
  921. {
  922. for ( int i = 0; i < 4; i++ )
  923. {
  924. for ( int j = 0; j < 4; j++ )
  925. {
  926. if ( multiplayerScreens[i][j] )
  927. {
  928. if ( multiplayerScreens[i][j]->getButton(MB_MSG_NEXT) )
  929. multiplayerScreens[i][j]->getButton(MB_MSG_NEXT)->setPressFX( -1 );
  930. if ( multiplayerScreens[i][j]->getButton(MB_MSG_PREV) )
  931. multiplayerScreens[i][j]->getButton(MB_MSG_PREV)->setPressFX( -1 );
  932. if ( multiplayerScreens[i][j]->getButton(MB_MSG_MAINMENU) )
  933. multiplayerScreens[i][j]->getButton(MB_MSG_MAINMENU)->setPressFX( LOG_MAINMENUBUTTON );
  934. }
  935. }
  936. }
  937. }
  938. }
  939. void MissionBegin::setUpMultiplayerLogisticsScreens()
  940. {
  941. for (int i = 0; i < 5/*dim screen X*/; i+=1)
  942. {
  943. int j;
  944. for (j = 0; j < 3/*dim screen Y*/; j += 1)
  945. {
  946. screens[i][j] = singlePlayerScreens[i][j];
  947. }
  948. }
  949. curScreenX = 0;
  950. curScreenY = 1;
  951. }
  952. void MissionBegin::setToMissionBriefing()
  953. {
  954. bReadyToLoad = 0;
  955. if ( screens[curScreenX][curScreenY] )
  956. screens[curScreenX][curScreenY]->end();
  957. {
  958. curScreenX = 1;
  959. curScreenY = 1;
  960. if ( screens[curScreenX][curScreenY] )
  961. screens[curScreenX][curScreenY]->begin();
  962. }
  963. }
  964. void MissionBegin::restartMPlayer( const char* playerName )
  965. {
  966. bReadyToLoad = 0;
  967. bDone = 0;
  968. if ( screens[curScreenX][curScreenY] )
  969. screens[curScreenX][curScreenY]->end();
  970. for (int i = 0; i < 5/*dim screen X*/; i+=1)
  971. {
  972. int j;
  973. for (j = 0; j < 3/*dim screen Y*/; j += 1)
  974. {
  975. screens[i][j] = this->multiplayerScreens[i][j];
  976. }
  977. }
  978. curScreenX = 2;
  979. curScreenY = 1;
  980. if ( screens[curScreenX][curScreenY] )
  981. {
  982. screens[curScreenX][curScreenY]->begin();
  983. if ( playerName )
  984. {
  985. ((MPParameterScreen*)screens[curScreenX][curScreenY])->setHostLeftDlg(playerName);
  986. }
  987. }
  988. }
  989. void MissionBegin::beginZone()
  990. {
  991. beginMPlayer();
  992. restartMPlayer(NULL);
  993. bReadyToLoad = 0;
  994. bDone = 0;
  995. LogisticsData::instance->startMultiPlayer();
  996. mainMenu->skipIntro();
  997. ChatWindow::init();
  998. }
  999. void MissionBegin::beginAtConnectionScreen()
  1000. {
  1001. beginMPlayer();
  1002. int i;
  1003. for (i = 0; i < 5/*dim screen X*/; i+=1)
  1004. {
  1005. int j;
  1006. for (j = 0; j < 3/*dim screen Y*/; j += 1)
  1007. {
  1008. screens[i][j] = multiplayerScreens[i][j];
  1009. }
  1010. }
  1011. curScreenX = 0;
  1012. curScreenY = 1;
  1013. screens[curScreenX][curScreenY]->beginFadeIn( 1.0 );
  1014. bReadyToLoad = 0;
  1015. bDone = 0;
  1016. LogisticsData::instance->startMultiPlayer();
  1017. ChatWindow::init();
  1018. }