RaceX.cpp
上传用户:sycq158
上传日期:2008-10-22
资源大小:15361k
文件大小:70k
源码类别:

游戏

开发平台:

Visual C++

  1. // RACE X
  2. //
  3. // Written by Mauricio Teichmann Ritter
  4. //
  5. // Copyright (C) 2002, Brazil. All rights reserved.
  6. // 
  7. //
  8. #include "stdafx.h"
  9. #include "racex.h"
  10. #include <algorithm>
  11. // This GUID value is used by DirectPlay. Each direct play game needs a GUID
  12. // so that we can find sessions of a game in the network
  13. #ifndef APP_GUID
  14. #define APP_GUID
  15. static const GUID g_guidApp = 
  16. { 0xce1aeec6, 0x8291, 0x4b9e, { 0xa1, 0x2, 0x16, 0xd4, 0x19, 0xc1, 0x87, 0x48 } };
  17. #endif
  18. cRaceXApp* GetRaceXApp()
  19. {
  20. return (cRaceXApp*)GetMainApp();
  21. }
  22. int string_compare(string s1, string s2)
  23. {
  24.     //return strcmp(s1,s2);
  25. return s1 < s2 ? 1 : 0;
  26. }
  27. cApplication* CreateApplication()
  28. {
  29. cRaceXApp* theApp;
  30. theApp = new cRaceXApp();
  31. return  (cApplication*)theApp;
  32. }
  33. void cRaceXApp::DoIdle()
  34. {
  35. // In this function is where the game logic starts
  36. // Each time we don磘 have a system message to process, the cApplication base
  37. // class will call the DoIdle virtual function
  38. DDBLTFX ddbltfx;
  39. char buffer[255];
  40.     
  41. // This static variables are used to control some game timings
  42. static long lLastIdle = 0;
  43. static long lLastOption = 0;
  44. static long lLastSprite = 0;
  45. static long lLastCaret = 0;
  46. static BOOL bShowCaret = FALSE;
  47. int iCaretPos;
  48. cRaceCar* pTmpCar;
  49. string sTmp;
  50. long lStart;
  51. int i = 0, j = 0;
  52. // The frames are processed in a 30 miliseconds rate
  53. // If we didn磘 reach the 30 milisecond mark, we磍l not flip 
  54. // the primary surface
  55. if(GetTickCount() - lLastIdle < 30)
  56. {
  57. PreventFlip();
  58. return;
  59. }
  60. // Update the LastIdle variable
  61. lLastIdle = GetTickCount();
  62. // Clear the BackBuffer with black color
  63. ddbltfx.dwSize      = sizeof(ddbltfx);
  64.     ddbltfx.dwFillColor = RGB(0,0,0);
  65. GetMainApp()->m_pBackBuffer->Blt(NULL, NULL, NULL, DDBLT_COLORFILL,  &ddbltfx );
  66. // Based on the game state we磍l show each game screen
  67. switch(m_iState)
  68. {
  69. case GS_HELP:
  70. // Help screen
  71. m_txDigital.WriteText(m_pBackBuffer, "RACING WITH RACEX", 200, 40);
  72. m_txDigital.WriteText(m_pBackBuffer, "UP ARROW", 50, 140);
  73. m_txDigital.WriteText(m_pBackBuffer, "ACCELERATE THE CAR", 270, 140);
  74. m_txDigital.WriteText(m_pBackBuffer, "RIGHT ARROW", 50, 180);
  75. m_txDigital.WriteText(m_pBackBuffer, "TURN THE CAR CLOCKWISE", 270, 180);
  76. m_txDigital.WriteText(m_pBackBuffer, "LEFT ARROW", 50, 220);
  77. m_txDigital.WriteText(m_pBackBuffer, "TURN THE CAR UNCLOCKIWISE", 270, 220);
  78. m_txDigital.WriteText(m_pBackBuffer, "DOWN ARROW", 50, 260);
  79. m_txDigital.WriteText(m_pBackBuffer, "BREAK THE CAR", 270, 260);
  80. m_txDigital.WriteText(m_pBackBuffer, "PRESS ENTER TO CONTINUE", 160, 360);
  81. // If the user hit enter os space or escape, go back to the main screen
  82. m_Keyboard.Process();
  83. if(GetTickCount() - lLastOption > 200)
  84. {
  85. if(m_Keyboard.CheckKey(DIK_RETURN) ||
  86.    m_Keyboard.CheckKey(DIK_NUMPADENTER) ||
  87.    m_Keyboard.CheckKey(DIK_SPACE) ||
  88.    m_Keyboard.CheckKey(DIK_ESCAPE))
  89. {
  90. m_iState = GS_MAINSCREEN;
  91. iStart = 0;
  92. lLastOption = GetTickCount();
  93. }
  94. }
  95. break;
  96. case GS_WAITCOMPETITION:
  97. // This game state is used the multiplayer game.
  98. // When we磖e in the competiton mode, we磍l show this screen
  99. // when we already saw the competition status screen but the
  100. // other network player didn磘 saw it yet.
  101. if(iStart = 0)
  102. {
  103. lLastSprite = 0;
  104. }
  105. if(GetTickCount() - lLastSprite > 500)
  106. {
  107. bShowCaret = !bShowCaret;
  108. lLastSprite = GetTickCount();
  109. }
  110. if(bShowCaret)
  111. {
  112. m_txDigital.WriteText(m_pBackBuffer, "WAITING OTHER PLAYERS", 180, 120);
  113. m_txDigital.WriteText(m_pBackBuffer, "LOOK AT COMPETITION RESULTS", 125, 180);
  114. m_txDigital.WriteText(m_pBackBuffer, "PLEASE WAIT...", 225, 240);
  115. }
  116. // Check if all the players are ready (saw the competition status)
  117. // If so, go to the next race
  118. if(m_pCompetition.AllPlayersReady() && m_pMultiPlayer.IsHosting())
  119. {
  120. strcpy(buffer, pRaceTrack.GetFileName());
  121. i = strlen(buffer);
  122. m_pMultiPlayer.SendTo(0, MSG_START_RACE, (unsigned char *) &buffer[0], i, DPNSEND_SYNC | DPNSEND_NOLOOPBACK | DPNSEND_GUARANTEED);
  123. m_iState = GS_RACE;
  124. iStart = 0;
  125. lLastOption = GetTickCount();
  126. }
  127. break;
  128. case GS_WAIT:
  129. // This state is used in the multiplayer game
  130. // If we need to start a race and the other players didn磘 finish their
  131. // configuration yet (doesn磘 inform the name and car color) we
  132. // need to wait.
  133. if(iStart = 0)
  134. {
  135. lLastSprite = 0;
  136. }
  137. if(GetTickCount() - lLastSprite > 500)
  138. {
  139. bShowCaret = !bShowCaret;
  140. lLastSprite = GetTickCount();
  141. }
  142. if(bShowCaret)
  143. {
  144. m_txDigital.WriteText(m_pBackBuffer, "WAITING OTHER PLAYERS", 180, 150);
  145. m_txDigital.WriteText(m_pBackBuffer, "PLEASE WAIT...", 240, 200);
  146. }
  147. // Check if all the players are ready
  148. if(m_pCompetition.AllPlayersReady() && m_pMultiPlayer.IsHosting())
  149. {
  150. // If we磖e in the competition mode, we go to the competition status
  151. // screen. If we磖e in single track mode, start the race
  152. if(m_pCompetition.GetCompetitionMode() == TRUE)
  153. {
  154. m_pCompetition.ResetReadyState();
  155. m_iState = GS_COMPETITIONSTATUS;
  156. iStart = 0;
  157. m_sndSelect.Play();
  158. lLastOption = GetTickCount();
  159. m_pMultiPlayer.SendTo(0, MSG_COMPETITIONSTATUS, NULL, 0, DPNSEND_SYNC | DPNSEND_NOLOOPBACK | DPNSEND_GUARANTEED);
  160. }
  161. else
  162. {
  163. strcpy(buffer, pRaceTrack.GetFileName());
  164. i = strlen(buffer);
  165. m_pMultiPlayer.SendTo(0, MSG_START_RACE, (unsigned char *) &buffer[0], i, DPNSEND_SYNC | DPNSEND_NOLOOPBACK | DPNSEND_GUARANTEED);
  166. m_iState = GS_RACE;
  167. iStart = 0;
  168. lLastOption = GetTickCount();
  169. }
  170. }
  171. break;
  172. case GS_CREDITS:
  173. // This state show the credits of the game
  174. // **********************************************************
  175. // *                                                        *
  176. // * PLEASE !! RESPECT THE COPYRIGHTS AND DON碩 CHANGE IT ! *
  177. // *                                                        *
  178. // **********************************************************
  179. #define LINE_STEP 40
  180. lStart = 480;
  181. iStart+=1;
  182. if(lStart-iStart > 15 && lStart-iStart < 465)
  183. {
  184. m_txDigital.WriteText(m_pBackBuffer, "GAME DESIGN", 120, lStart-iStart);
  185. m_txDigital.WriteText(m_pBackBuffer, "MAURICIO RITTER", 340, lStart-iStart);
  186. }
  187. lStart+=40;
  188. if(lStart-iStart > 15 && lStart-iStart < 465)
  189. {
  190. m_txDigital.WriteText(m_pBackBuffer, "3D MODELING", 120, lStart-iStart);
  191. m_txDigital.WriteText(m_pBackBuffer, "MAURICIO RITTER", 340, lStart-iStart);
  192. }
  193. lStart+=40;
  194. if(lStart-iStart > 15 && lStart-iStart < 465)
  195. {
  196. m_txDigital.WriteText(m_pBackBuffer, "TEXTURES", 120, lStart-iStart);
  197. m_txDigital.WriteText(m_pBackBuffer, "MAURICIO RITTER", 340, lStart-iStart);
  198. }
  199. lStart+=40;
  200. if(lStart-iStart > 15 && lStart-iStart < 465)
  201. {
  202. m_txDigital.WriteText(m_pBackBuffer, "2D ART", 120, lStart-iStart);
  203. m_txDigital.WriteText(m_pBackBuffer, "MAURICIO RITTER", 340, lStart-iStart);
  204. }
  205. lStart+=40;
  206. if(lStart-iStart > 15 && lStart-iStart < 465)
  207. {
  208. m_txDigital.WriteText(m_pBackBuffer, "LEVEL DESIGN", 120, lStart-iStart);
  209. m_txDigital.WriteText(m_pBackBuffer, "MAURICIO RITTER", 340, lStart-iStart);
  210. }
  211. lStart+=40;
  212. if(lStart-iStart > 15 && lStart-iStart < 465)
  213. {
  214. m_txDigital.WriteText(m_pBackBuffer, "PROGRAMMING", 120, lStart-iStart);
  215. m_txDigital.WriteText(m_pBackBuffer, "MAURICIO RITTER", 340, lStart-iStart);
  216. }
  217. lStart+=40;
  218. if(lStart-iStart > 15 && lStart-iStart < 465)
  219. {
  220. m_txDigital.WriteText(m_pBackBuffer, "SOUND EDITING", 120, lStart-iStart);
  221. m_txDigital.WriteText(m_pBackBuffer, "MAURICIO RITTER", 340, lStart-iStart);
  222. }
  223. lStart+=40;
  224. if(lStart-iStart > 15 && lStart-iStart < 465)
  225. {
  226. m_txDigital.WriteText(m_pBackBuffer, "MUSIC", 120, lStart-iStart);
  227. m_txDigital.WriteText(m_pBackBuffer, "MAURICIO RITTER", 340, lStart-iStart);
  228. }
  229. lStart+=40;
  230. if(lStart-iStart > 15 && lStart-iStart < 465)
  231. {
  232. m_txDigital.WriteText(m_pBackBuffer, "SPECIAL THANKS TO ALL MY BETA TESTERS", 50, lStart-iStart);
  233. }
  234. lStart+=30;
  235. if(lStart-iStart > 15 && lStart-iStart < 465)
  236. {
  237. m_txDigital.WriteText(m_pBackBuffer, "IN SPECIAL TO", 120, lStart-iStart);
  238. m_txDigital.WriteText(m_pBackBuffer, "COLIN DAVIES", 340, lStart-iStart);
  239. }
  240. lStart+=20;
  241. if(lStart-iStart > 15 && lStart-iStart < 465)
  242. {
  243. m_txDigital.WriteText(m_pBackBuffer, "ISAAC SASSON", 340, lStart-iStart);
  244. }
  245. lStart+=20;
  246. if(lStart-iStart > 15 && lStart-iStart < 465)
  247. {
  248. m_txDigital.WriteText(m_pBackBuffer, "JAMES T JOHNSON", 340, lStart-iStart);
  249. }
  250. lStart+=20;
  251. if(lStart-iStart > 15 && lStart-iStart < 465)
  252. {
  253. m_txDigital.WriteText(m_pBackBuffer, "NISHANT SIVAKUMAR", 340, lStart-iStart);
  254. }
  255. lStart+=20;
  256. if(lStart-iStart > 15 && lStart-iStart < 465)
  257. {
  258. m_txDigital.WriteText(m_pBackBuffer, "NNAMDI ONYEYIRI", 340, lStart-iStart);
  259. }
  260. lStart+=20;
  261. if(lStart-iStart > 15 && lStart-iStart < 465)
  262. {
  263. m_txDigital.WriteText(m_pBackBuffer, "SMITHA", 340, lStart-iStart);
  264. }
  265. lStart+=40;
  266. if(lStart-iStart > 15 && lStart-iStart < 465)
  267. {
  268. m_txDigital.WriteText(m_pBackBuffer, "THIS GAME IS TOTALLY FREEWARE", 120, lStart-iStart);
  269. }
  270. lStart+=40;
  271. if(lStart-iStart > 15 && lStart-iStart < 465)
  272. {
  273. m_txDigital.WriteText(m_pBackBuffer, "IF YOU WANT TO CONTACT ME ABOUT THE GAME", 20, lStart-iStart);
  274. }
  275. lStart+=40;
  276. if(lStart-iStart > 15 && lStart-iStart < 465)
  277. {
  278. m_txDigital.WriteText(m_pBackBuffer, "JUST SEND AN EMAIL TO", 160, lStart-iStart);
  279. }
  280. lStart+=40;
  281. if(lStart-iStart > 15 && lStart-iStart < 465)
  282. {
  283. m_txDigital.WriteText(m_pBackBuffer, "MAURICIORITTER@HOTMAIL.COM", 130, lStart-iStart);
  284. }
  285. //lStart+=480;
  286. if(iStart > lStart)
  287. {
  288. iStart = 0;
  289. }
  290. // If the user hit enter os space or escape, go back to the main screen
  291. m_Keyboard.Process();
  292. if(GetTickCount() - lLastOption > 200)
  293. {
  294. if(m_Keyboard.CheckKey(DIK_RETURN) ||
  295.    m_Keyboard.CheckKey(DIK_NUMPADENTER) ||
  296.    m_Keyboard.CheckKey(DIK_SPACE) ||
  297.    m_Keyboard.CheckKey(DIK_ESCAPE))
  298. {
  299. m_iState = GS_MAINSCREEN;
  300. iStart = 0;
  301. lLastOption = GetTickCount();
  302. }
  303. }
  304. break;
  305. case GS_NETWORKSTATUS:
  306. // This state is used the multiplayer game
  307. // It shows the current multiplayer game status (number of connected,
  308. // players, their name and car color)
  309. if(iStart == 0)
  310. {
  311. iStart = 1;
  312. m_surfTitle.Destroy();
  313. for(i=0;i<4;i++)
  314. {
  315. m_surfBigCars[i].Create(150, 140, RGB(0,0,0));
  316. m_surfBigCars[i].LoadBitmap(GetInstHandle(), IDB_BIGCAR_BLUE + i);
  317. }
  318. m_surfCarPannel.Create(320,110, RGB(0,0,0));
  319. m_surfCarPannel.LoadBitmap(GetInstHandle(), IDB_CAR_PANNEL);
  320. m_surfHelmet.Create(640,60, RGB(0,0,0));
  321. m_surfHelmet.LoadBitmap(GetInstHandle(), IDB_CURRENTCONNECTED_PANEL);
  322. m_surfTitle.Create(520,40, RGB(0,0,0));
  323. m_surfTitle.LoadBitmap(GetInstHandle(), IDB_MULTIPLAYERSTATUS_TITLE);
  324. m_surfPositions.Create(120,40, RGB(0,0,0));
  325. m_surfPositions.LoadBitmap(GetInstHandle(), IDB_POSITIONS);
  326. }
  327. // If the number of players is different from the last iteration,
  328. // a new player connected to the game session. Add this player to the
  329. // competition or race.
  330. if(m_pMultiPlayer.GetNumConnected() != m_pCompetition.GetNumberOfCars()-1)
  331. {
  332. for(i=0;i<m_pMultiPlayer.GetNumConnected();i++)
  333. {
  334. if(m_pCompetition.DPNIDExists(m_pMultiPlayer.GetPlayerInfo(i)->dpnidPlayer) == FALSE)
  335. {
  336. m_pCompetition.AddPlayer("UNKNOWN", -1, CTRL_NETWORK_REMOTE, i+1, m_pMultiPlayer.GetPlayerInfo(i)->dpnidPlayer);
  337. }
  338. }
  339. }
  340. m_surfTitle.Draw(m_pBackBuffer, 60,0);
  341. m_surfHelmet.Draw(m_pBackBuffer, 0,80);
  342. // Show each one of the connected players
  343. for(i=0;i<m_pCompetition.GetNumberOfCars();i++)
  344. {
  345. switch(i)
  346. {
  347. case 0:
  348. if(m_pCompetition.GetColor(i) != -1)
  349. m_surfBigCars[m_pCompetition.GetColor(i) - IDB_CAR_BLUE].Draw(m_pBackBuffer, 10, 140, 20, 14, 130, 106);
  350. m_surfCarPannel.Draw(m_pBackBuffer, 0, 140);
  351. m_surfPositions.Draw(m_pBackBuffer, 130, 2 + 140, 0, 0, 30, 40);
  352. sTmp = m_pCompetition.GetPlayerName(m_pCompetition.GetPlayerID(0));
  353. m_txDigitalSmall.WriteText(m_pBackBuffer, &sTmp[0], 145, 78 + 140);
  354. break;
  355. case 1:
  356. if(m_pCompetition.GetColor(i) != -1)
  357. m_surfBigCars[m_pCompetition.GetColor(i) - IDB_CAR_BLUE].Draw(m_pBackBuffer, 330, 140, 20, 14, 130, 106);
  358. m_surfCarPannel.Draw(m_pBackBuffer, 320, 140);
  359. m_surfPositions.Draw(m_pBackBuffer, 450, 2 + 140, 30, 0, 30, 40);
  360. sTmp = m_pCompetition.GetPlayerName(m_pCompetition.GetPlayerID(1));
  361. m_txDigitalSmall.WriteText(m_pBackBuffer, &sTmp[0], 145 + 310, 78 + 140);
  362. break;
  363. case 2:
  364. if(m_pCompetition.GetColor(i) != -1)
  365. m_surfBigCars[m_pCompetition.GetColor(i) - IDB_CAR_BLUE].Draw(m_pBackBuffer, 10, 250, 20, 14, 130, 106);
  366. m_surfCarPannel.Draw(m_pBackBuffer, 0, 250);
  367. m_surfPositions.Draw(m_pBackBuffer, 130, 2 + 250, 60, 0, 30, 40);
  368. sTmp = m_pCompetition.GetPlayerName(m_pCompetition.GetPlayerID(0));
  369. m_txDigitalSmall.WriteText(m_pBackBuffer, &sTmp[0], 145, 78 + 250);
  370. break;
  371. case 3:
  372. if(m_pCompetition.GetColor(i) != -1)
  373. m_surfBigCars[m_pCompetition.GetColor(i) - IDB_CAR_BLUE].Draw(m_pBackBuffer, 330, 250, 20, 14, 130, 106);
  374. m_surfCarPannel.Draw(m_pBackBuffer, 320, 250);
  375. m_surfPositions.Draw(m_pBackBuffer, 450, 2 + 250, 90, 0, 30, 40);
  376. sTmp = m_pCompetition.GetPlayerName(m_pCompetition.GetPlayerID(1));
  377. m_txDigitalSmall.WriteText(m_pBackBuffer, &sTmp[0], 145 + 310, 78 + 250);
  378. break;
  379. }
  380. }
  381. // If the user is hosting the session, he need to press enter to start
  382. // the race with the currently connected players
  383. // If its a peer, he need to wait the Start command from the host
  384. if(m_pMultiPlayer.IsHosting())
  385. {
  386. m_txVerdana.WriteText(m_pBackBuffer, "PRESS ENTER TO START THE RACE", 140, 420);
  387. }
  388. else
  389. {
  390. m_txVerdana.WriteText(m_pBackBuffer, "WAITING START MESSAGE FROM GAME CREATOR", 40, 420);
  391. }
  392. // Process the keyboard for input
  393. m_Keyboard.Process();
  394. if(GetTickCount() - lLastOption > 200)
  395. {
  396. if(m_pMultiPlayer.IsHosting())
  397. {
  398. if(m_Keyboard.CheckKey(DIK_RETURN) || 
  399. m_Keyboard.CheckKey(DIK_NUMPADENTER) )
  400. {
  401. for(i=0;i<4;i++)
  402. {
  403. m_surfBigCars[i].Destroy();
  404. }
  405. m_sptrCar.Destroy();
  406. if(m_pCompetition.GetCompetitionMode() == TRUE)
  407. {
  408. if(m_pCompetition.AllPlayersReady())
  409. {
  410. // Multiplayer Player - Competition
  411. // Go to the Competition Status Screen
  412. m_pCompetition.ResetReadyState();
  413. m_iState = GS_COMPETITIONSTATUS;
  414. iStart = 0;
  415. m_sndSelect.Play();
  416. lLastOption = GetTickCount();
  417. m_pMultiPlayer.SendTo(0, MSG_COMPETITIONSTATUS, NULL, 0, DPNSEND_SYNC | DPNSEND_NOLOOPBACK | DPNSEND_GUARANTEED);
  418. }
  419. else
  420. {
  421. // Players are not ready (some are without name and car color)
  422. // Go to the wait screen
  423. m_iState = GS_WAIT;
  424. iStart = 0;
  425. lLastOption = GetTickCount();
  426. }
  427. }
  428. else
  429. {
  430. if(m_pCompetition.AllPlayersReady())
  431. {
  432. // All the players are ready !
  433. // LET THE RACE BEGIN !
  434. strcpy(buffer, pRaceTrack.GetFileName());
  435. i = strlen(buffer);
  436. // Send a STARTRACE message to all the peers
  437. m_pMultiPlayer.SendTo(0, MSG_START_RACE, (unsigned char *) &buffer[0], i, DPNSEND_SYNC | DPNSEND_NOLOOPBACK | DPNSEND_GUARANTEED);
  438. m_iState = GS_RACE;
  439. iStart = 0;
  440. lLastOption = GetTickCount();
  441. }
  442. else
  443. {
  444. // Players are not ready (some are without name and car color)
  445. // Go to the wait screen
  446. m_iState = GS_WAIT;
  447. iStart = 0;
  448. lLastOption = GetTickCount();
  449. }
  450. }
  451. break;
  452. }
  453. }
  454. }
  455. break;
  456. case GS_CREATEGAME:
  457. // This is used in the multiplayer game
  458. // When a user is creating a new gaming session, show the
  459. // new game panel so that he can enter the game name
  460. if(iStart == 0)
  461. {
  462. m_iOption = 1;
  463. m_surfTitle.Create(370,160);
  464. m_surfTitle.LoadBitmap(GetInstHandle(), IDB_BACKGROUND3);
  465. m_surfCaret.Create(2,15);
  466. m_surfCaret.LoadBitmap(GetInstHandle(), IDB_CARET);
  467. m_surfCursor.Create(32, 32, RGB(0,0,0));
  468. m_surfCursor.LoadBitmap(GetInstHandle(), IDB_CURSOR);
  469. m_sndSelect.Create(MAKEINTRESOURCE(IDR_SELECT), DSBCAPS_CTRL3D, DS3DALG_NO_VIRTUALIZATION);
  470. m_sndChangeOption.Create(MAKEINTRESOURCE(IDR_CHANGEOPTION), DSBCAPS_CTRL3D, DS3DALG_NO_VIRTUALIZATION);
  471. m_sndType.Create(MAKEINTRESOURCE(IDR_TYPE), DSBCAPS_CTRL3D, DS3DALG_NO_VIRTUALIZATION);
  472. m_sGameName = "";
  473. iStart = 1;
  474. }
  475. iCaretPos = 172;
  476. if(GetTickCount() - lLastCaret > 100)
  477. {
  478. bShowCaret = !bShowCaret;
  479. lLastCaret = GetTickCount();
  480. }
  481. m_surfTitle.Draw(m_pBackBuffer, 135, 140);
  482. if(m_sGameName.length() > 0)
  483. {
  484. iCaretPos = m_txDigital.WriteText(m_pBackBuffer, &m_sGameName[0], 170, 220);
  485. }
  486. if(bShowCaret)
  487. {
  488. m_surfCaret.Draw(m_pBackBuffer, iCaretPos+2, 221);
  489. }
  490. m_Keyboard.Process();
  491. m_Mouse.Process();
  492. m_surfCursor.Draw(m_pBackBuffer, m_Mouse.GetX(), m_Mouse.GetY(), 0, 0, m_Mouse.GetX() > 640-32 ? 640-m_Mouse.GetX() : 0, m_Mouse.GetY() > 480-32 ? 480-m_Mouse.GetY() : 0 );
  493. CheckInput(&m_sGameName, 20);
  494. if(GetTickCount() - lLastOption > 200)
  495. {
  496. if(m_Keyboard.CheckKey(DIK_ESCAPE))
  497. {
  498. m_iState = GS_MAINSCREEN;
  499. iStart = 0;
  500. m_surfHelmet.Destroy();
  501. pRaceTrack.Destroy();
  502. m_sptrCar.Destroy();
  503. lLastOption = GetTickCount();
  504. }
  505. if(m_Keyboard.CheckKey(DIK_RETURN) ||
  506.    m_Keyboard.CheckKey(DIK_NUMPADENTER) )
  507. {
  508. lLastOption = GetTickCount();
  509. if(m_sGameName.size() == 0)
  510. {
  511. m_sGameName = "NEW GAME";
  512. }
  513. else
  514. {
  515. m_pMultiPlayer.Host(&m_sGameName[0]);
  516. m_iState = GS_SELECTTRACK_AND_CAR;
  517. iStart = 0;
  518. m_sndSelect.Play();
  519. }
  520. }
  521. }
  522. break;
  523. case GS_JOINGAME:
  524. // The user is trying to join a multiplayer game
  525. if(iStart == 0)
  526. {
  527. m_iOption = 1;
  528. m_surfTitle.Create(450,300);
  529. m_surfTitle.LoadBitmap(GetInstHandle(), IDB_BACKGROUND4);
  530. m_surfCursor.Create(32, 32, RGB(0,0,0));
  531. m_surfCursor.LoadBitmap(GetInstHandle(), IDB_CURSOR);
  532. m_sndSelect.Create(MAKEINTRESOURCE(IDR_SELECT), DSBCAPS_CTRL3D, DS3DALG_NO_VIRTUALIZATION);
  533. m_sndChangeOption.Create(MAKEINTRESOURCE(IDR_CHANGEOPTION), DSBCAPS_CTRL3D, DS3DALG_NO_VIRTUALIZATION);
  534. m_sndType.Create(MAKEINTRESOURCE(IDR_TYPE), DSBCAPS_CTRL3D, DS3DALG_NO_VIRTUALIZATION);
  535. m_iOption = -1;
  536. iStart = 1;
  537. lLastSprite = 70;
  538. lLastCaret = 3;
  539. }
  540. else
  541. {
  542. if(iStart == 1)
  543. {
  544. iStart = 2;
  545. m_pMultiPlayer.EnumSessions();
  546. }
  547. }
  548. if(iStart == 1)
  549. {
  550. // We磖e still searching for sessions...
  551. // Wait ultil we have finished
  552. m_txVerdana.WriteText(m_pBackBuffer, "SEARCHING FOR RACEX SESSIONS", 150, 150);
  553. m_txVerdana.WriteText(m_pBackBuffer, "PLEASE WAIT...", 250, 200);
  554. m_iOption = 0;
  555. }
  556. else
  557. {
  558. // Show the avaible games to the user
  559. m_surfTitle.Draw(m_pBackBuffer, 95, 90);
  560. if(m_pMultiPlayer.GetNumSessions() == 0)
  561. {
  562. // No games wore found in the network
  563. m_txVerdana.WriteText(m_pBackBuffer, "NO NETWORK GAMES FOUND", 165, 190);
  564. m_txVerdana.WriteText(m_pBackBuffer, "USE THE SEARCH BUTTON", 175, 230);
  565. m_txVerdana.WriteText(m_pBackBuffer, "TO TRY AGAIN.", 230, 250);
  566. }
  567. else
  568. {
  569. // Show all the games
  570. HDC hdc;
  571. m_pBackBuffer->GetDC(&hdc);
  572. SelectObject(hdc, GetStockObject(HOLLOW_BRUSH));
  573. HPEN hPen = CreatePen(PS_SOLID,1,RGB(0,(int) lLastSprite,0));
  574. lLastSprite+=lLastCaret;
  575. if(lLastSprite > 170 || lLastSprite < 70)
  576. {
  577. lLastCaret = lLastCaret * -1;
  578. lLastSprite+=lLastCaret;
  579. }
  580. HPEN hOldPen = (HPEN) SelectObject(hdc, hPen);
  581. Rectangle(hdc, 120, 163 + (m_iOption * 24), 520, 182 + (m_iOption * 24));
  582. SelectObject(hdc, hOldPen);
  583. DeleteObject(hPen);
  584. m_pBackBuffer->ReleaseDC(hdc);
  585. for(i=0;i< (m_pMultiPlayer.GetNumSessions() < 7 ? m_pMultiPlayer.GetNumSessions() : 7);i++)
  586. {
  587. m_pMultiPlayer.GetSessionName(i, buffer, 255);
  588. m_txDigital.WriteText(m_pBackBuffer, buffer, 122, 165 + (i * 24));
  589. }
  590. }
  591. }
  592. if(iStart > 1)
  593. m_surfCursor.Draw(m_pBackBuffer, m_Mouse.GetX(), m_Mouse.GetY(), 0, 0, m_Mouse.GetX() > 640-32 ? 640-m_Mouse.GetX() : 0, m_Mouse.GetY() > 480-32 ? 480-m_Mouse.GetY() : 0 );
  594. // Process the keyboard and mouse for input
  595. m_Keyboard.Process();
  596. m_Mouse.Process();
  597. if(GetTickCount() - lLastOption > 200)
  598. {
  599. int iX, iY;
  600. iX = m_Mouse.GetX();
  601. iY = m_Mouse.GetY();
  602. // Check if the user hit the Search Button
  603. if( iX > 233+95 && iY > 251+90 &&
  604. iX < 357+95 && iY < 277+90 &&
  605. m_Mouse.GetLeftButton() == FALSE)
  606. {
  607. iStart = 0;
  608. }
  609. // Check if the user hit the Join Button
  610. if( iX > 87+95 && iY > 251+90 &&
  611. iX < 211+95 && iY < 277+90 &&
  612. m_Mouse.GetLeftButton() == FALSE)
  613. {
  614. m_iState = GS_SELECTTRACK_AND_CAR;
  615. iStart = 0;
  616. m_sndSelect.Play();
  617. lLastOption = GetTickCount();
  618. m_pMultiPlayer.Connect(m_iOption);
  619. }
  620. if( iX > 120 && iY > 163  &&
  621. iX < 520 && iY < 327 &&
  622. m_Mouse.GetLeftButton() == FALSE)
  623. {
  624. if( (iY - 163) / 24 < m_pMultiPlayer.GetNumSessions() )
  625. m_iOption = (iY - 163) / 24;
  626. }
  627. if(m_Keyboard.CheckKey(DIK_RETURN) ||
  628.    m_Keyboard.CheckKey(DIK_NUMPADENTER) )
  629. {
  630. m_sndSelect.Play();
  631. m_surfHelmet.Destroy();
  632. m_sptrCar.Destroy();
  633. }
  634. if(m_Keyboard.CheckKey(DIK_ESCAPE))
  635. {
  636. m_iState = GS_MAINSCREEN;
  637. iStart = 0;
  638. m_surfHelmet.Destroy();
  639. pRaceTrack.Destroy();
  640. m_sptrCar.Destroy();
  641. lLastOption = GetTickCount();
  642. }
  643. }
  644. break;
  645. case GS_MAINSCREEN:
  646. // The iStart is set to 0 when we are starting the program 
  647. // or we are coming from another screen, so that we can
  648. // initialize the objects necessary to create the screen
  649. if(iStart == 0)
  650. {
  651. m_iOption = 1;
  652. m_txVerdana.Create(2);
  653. m_txDigitalSmall.Create(3);
  654. m_surfTitle.Create(450,260);
  655. m_surfTitle.LoadBitmap(GetInstHandle(), IDB_TITLE);
  656. m_surfHelmet.Create(28,26);
  657. m_surfHelmet.LoadBitmap(GetInstHandle(), IDB_HELMET);
  658. m_sndSelect.Create(MAKEINTRESOURCE(IDR_SELECT), DSBCAPS_CTRL3D, DS3DALG_NO_VIRTUALIZATION);
  659. m_sndChangeOption.Create(MAKEINTRESOURCE(IDR_CHANGEOPTION), DSBCAPS_CTRL3D, DS3DALG_NO_VIRTUALIZATION);
  660. m_pCompetition.Reset();
  661. iStart = 1;
  662. }
  663. // Draw the Title in the middle of the screen
  664. m_surfTitle.Draw(m_pBackBuffer, 104, 20);
  665. j = 280;
  666. // If we are in the menu (option less then 6), draw the top-level menu
  667. if(m_iOption <= 6)
  668. {
  669. m_txVerdana.WriteText(m_pBackBuffer, "SINGLE PLAYER GAME", 200, j);
  670. j+= 26;
  671. m_txVerdana.WriteText(m_pBackBuffer, "MULTIPLAYER GAME", 200, j);
  672. j+= 26;
  673. m_txVerdana.WriteText(m_pBackBuffer, "HELP", 200, j);
  674. j+= 26;
  675. m_txVerdana.WriteText(m_pBackBuffer, "OPTIONS", 200, j);
  676. j+= 26;
  677. m_txVerdana.WriteText(m_pBackBuffer, "CREDITS", 200, j);
  678. j+= 26;
  679. m_txVerdana.WriteText(m_pBackBuffer, "QUIT", 200, j);
  680. }
  681. // option is greater than 6, states the we are in the submenu
  682. else if (m_iOption > 10 && m_iOption < 21)
  683. {
  684. m_txVerdana.WriteText(m_pBackBuffer, "SINGLE TRACK MODE", 200, j);
  685. j+= 26;
  686. m_txVerdana.WriteText(m_pBackBuffer, "COMPETITION MODE", 200, j);
  687. j+= 26;
  688. m_txVerdana.WriteText(m_pBackBuffer, "BACK", 200, j);
  689. j+= 26;
  690. }
  691. else if (m_iOption > 20 && m_iOption < 31)
  692. {
  693. m_txVerdana.WriteText(m_pBackBuffer, "CREATE A NEW GAME", 200, j);
  694. j+= 26;
  695. m_txVerdana.WriteText(m_pBackBuffer, "JOIN A GAME", 200, j);
  696. j+= 26;
  697. m_txVerdana.WriteText(m_pBackBuffer, "BACK", 200, j);
  698. }
  699. else if (m_iOption > 30 && m_iOption < 41)
  700. {
  701. m_txVerdana.WriteText(m_pBackBuffer, "SINGLE TRACK MODE", 200, j);
  702. j+= 26;
  703. m_txVerdana.WriteText(m_pBackBuffer, "COMPETITION MODE", 200, j);
  704. j+= 26;
  705. m_txVerdana.WriteText(m_pBackBuffer, "BACK", 200, j);
  706. }
  707. else if (m_iOption > 40 && m_iOption < 51)
  708. {
  709. m_txVerdana.WriteText(m_pBackBuffer, "MUTIPLAYER PROVIDER - ", 100, j);
  710. m_txVerdana.WriteText(m_pBackBuffer, m_pMultiPlayer.GetSPName(m_pMultiPlayer.GetSPIndex()), 384, j);
  711. j+= 26;
  712. i = 0;
  713. while(i < m_pMultiPlayer.GetNumSPOptions())
  714. {
  715. m_txVerdana.WriteText(m_pBackBuffer, m_pMultiPlayer.GetSPOptionName(i), 100, j);
  716. m_pMultiPlayer.GetSPOption(i, buffer, 255);
  717. m_txVerdana.WriteText(m_pBackBuffer, buffer, 384, j);
  718. i++;
  719. j+= 26;
  720. }
  721. //m_txVerdana.WriteText(m_pBackBuffer, "COMPETITION MODE", 200, 310);
  722. m_txVerdana.WriteText(m_pBackBuffer, "BACK", 100, j);
  723. }
  724. else if (m_iOption > 50 && m_iOption < 61)
  725. {
  726. m_txVerdana.WriteText(m_pBackBuffer, "MULTIPLAYER OPTIONS", 200, j);
  727. j+= 26;
  728. m_txVerdana.WriteText(m_pBackBuffer, "DIFFICULTY LEVEL- ", 200, j);
  729. switch(m_iDifficultyLevel)
  730. {
  731. case 0:
  732. m_txVerdana.WriteText(m_pBackBuffer, "EASY", 420, j);
  733. break;
  734. case 20:
  735. m_txVerdana.WriteText(m_pBackBuffer, "NORMAL", 420, j);
  736. break;
  737. case 40:
  738. m_txVerdana.WriteText(m_pBackBuffer, "PRETTY HARD", 420, j);
  739. break;
  740. case 60:
  741. m_txVerdana.WriteText(m_pBackBuffer, "HARD", 420, j);
  742. break;
  743. case 80:
  744. m_txVerdana.WriteText(m_pBackBuffer, "HELL HARD", 420, j);
  745. break;
  746. }
  747. j+= 26;
  748. m_txVerdana.WriteText(m_pBackBuffer, "BACK", 200, j);
  749. }
  750. // Process the keyboard for input
  751. m_Keyboard.Process();
  752. // Draw the helmet icon according to the selected option
  753. if (m_iOption > 40 && m_iOption < 51)
  754. m_surfHelmet.Draw(m_pBackBuffer, 63, 277 + ( ( (m_iOption%10) -1) * 26));
  755. else
  756. m_surfHelmet.Draw(m_pBackBuffer, 163, 277 + ( ( (m_iOption%10) -1) * 26));
  757. if(GetTickCount() - lLastOption > 200)
  758. {
  759. // If user hit the down key, change the option
  760. if(m_Keyboard.CheckKey(DIK_DOWN))
  761. {
  762. m_iOption++;
  763. if(m_iOption > 6 && m_iOption < 11) m_iOption = 1;
  764. if(m_iOption > 13 && m_iOption < 21) m_iOption = 11;
  765. if(m_iOption > 23 && m_iOption < 31) m_iOption = 21;
  766. if(m_iOption > 33 && m_iOption < 41) m_iOption = 31;
  767. if(m_iOption > 42 + m_pMultiPlayer.GetNumSPOptions() && m_iOption < 51) m_iOption = 41;
  768. if(m_iOption > 53 && m_iOption < 61) m_iOption = 51;
  769. lLastOption = GetTickCount();
  770. m_sndChangeOption.Play();
  771. }
  772. // If user hit the up key, change the option
  773. if(m_Keyboard.CheckKey(DIK_UP))
  774. {
  775. m_iOption--;
  776. if(m_iOption < 1) m_iOption = 6;
  777. if(m_iOption == 10) m_iOption = 13;
  778. if(m_iOption == 20) m_iOption = 23;
  779. if(m_iOption == 30) m_iOption = 33;
  780. if(m_iOption == 40) m_iOption = 42 + m_pMultiPlayer.GetNumSPOptions();
  781. if(m_iOption == 50) m_iOption = 53;
  782. lLastOption = GetTickCount();
  783. m_sndChangeOption.Play();
  784. }
  785. // If user hit the enter, space or numpadenter
  786. // Select the next screen or menu depending on the option
  787. // the user selected
  788. if(m_Keyboard.CheckKey(DIK_RETURN) ||
  789.    m_Keyboard.CheckKey(DIK_NUMPADENTER) ||
  790.    m_Keyboard.CheckKey(DIK_SPACE) )
  791. {
  792. lLastOption = GetTickCount();
  793. switch(m_iOption)
  794. {
  795. case 1:
  796. // Single Player
  797. // Set the option to 11 to go to the next menu
  798. m_iOption = 11;
  799. m_bIsMultiplayer = FALSE;
  800. m_sndSelect.Play();
  801. break;
  802. case 2:
  803. // Multiplayer Player
  804. // Set the option to 21 to go to the next menu
  805. m_iOption = 21;
  806. m_bIsMultiplayer = TRUE;
  807. m_sndSelect.Play();
  808. break;
  809. case 3:
  810. m_iState = GS_HELP;
  811. iStart = 0;
  812. m_sndSelect.Play();
  813. break;
  814. case 4:
  815. // Options Menu
  816. m_iOption = 51;
  817. break;
  818. case 5:
  819. m_iState = GS_CREDITS;
  820. iStart = 0;
  821. m_sndSelect.Play();
  822. break;
  823. case 13:
  824. case 23:
  825. case 33:
  826. case 53:
  827. // Selected the "BACK" option, go back to the top-level menu
  828. m_iOption = 1;
  829. m_sndSelect.Play();
  830. break;
  831. case 12:
  832. // Single Player - Competition Mode
  833. // Go to the Car Selection Screen
  834. m_pCompetition.SetCompetitionMode(TRUE);
  835. m_surfHelmet.Destroy();
  836. m_surfTitle.Destroy();
  837. m_iState = GS_SELECTTRACK_AND_CAR;
  838. iStart = 0;
  839. m_sndSelect.Play();
  840. break;
  841. case 11:
  842. // Single Player - Single Track
  843. // Go to the Track selection Screen
  844. m_pCompetition.SetCompetitionMode(FALSE);
  845. m_surfHelmet.Destroy();
  846. m_surfTitle.Destroy();
  847. m_iState = GS_SELECTTRACK_AND_CAR;
  848. iStart = 0;
  849. m_sndSelect.Play();
  850. break;
  851. case 21:
  852. // Create a new multiplayer game
  853. m_iOption = 31;
  854. m_sndSelect.Play();
  855. break;
  856. case 22:
  857. // Join a Multiplayer Session
  858. m_pCompetition.SetCompetitionMode(FALSE);
  859. m_surfHelmet.Destroy();
  860. m_surfTitle.Destroy();
  861. m_iState = GS_JOINGAME;
  862. iStart = 0;
  863. m_sndSelect.Play();
  864. break;
  865. case 32:
  866. // New MultiPlayer - Competition Mode
  867. // Go to the Car Selection Screen
  868. m_pCompetition.SetCompetitionMode(TRUE);
  869. m_surfHelmet.Destroy();
  870. m_surfTitle.Destroy();
  871. m_iState = GS_CREATEGAME;
  872. iStart = 0;
  873. m_sndSelect.Play();
  874. break;
  875. case 31:
  876. // New MultiPlayer - Single Track
  877. // Go to the Track selection Screen
  878. m_pCompetition.SetCompetitionMode(FALSE);
  879. m_surfHelmet.Destroy();
  880. m_surfTitle.Destroy();
  881. m_iState = GS_CREATEGAME;
  882. iStart = 0;
  883. m_sndSelect.Play();
  884. break;
  885. case 51:
  886. // Multiplayer Options Menu
  887. m_iOption = 41;
  888. break;
  889. case 52:
  890. // Set the difficulty level
  891. m_iDifficultyLevel+=20;
  892. if(m_iDifficultyLevel > 80)
  893. m_iDifficultyLevel = 0;
  894. m_pMultiPlayer.SetRegDWValue("DifficultyLevel", (DWORD) m_iDifficultyLevel);
  895. break;
  896. case 6:
  897. // Quit
  898. PostQuitMessage(0);
  899. break;
  900. case 41:
  901. // Change the Network Service Provider (Modem, LAN, Serial, etc.)
  902. m_pMultiPlayer.NextSP();
  903. m_sndChangeOption.Play();
  904. break;
  905. }
  906. if(m_iOption == 42 + m_pMultiPlayer.GetNumSPOptions())
  907. {
  908. m_iOption = 51;
  909. m_sndSelect.Play();
  910. }
  911. if(m_iOption > 41 &&
  912.    m_iOption < 42 + m_pMultiPlayer.GetNumSPOptions())
  913. {
  914. if(m_pMultiPlayer.GetSPOptionType(m_iOption-42) == 0)
  915. {
  916. m_pMultiPlayer.AdvanceSPOption(m_iOption-42);
  917. }
  918. }
  919. }
  920. }
  921. break;
  922. case GS_SELECTTRACK_AND_CAR:
  923. // This screen let the user select the track for a single track 
  924. // game
  925. #define PANEL_POSITION 220
  926. BOOL bHalfScreen, bShowTitle;
  927. if(m_pCompetition.GetCompetitionMode() == TRUE)
  928. {
  929. bShowTitle = TRUE;
  930. bHalfScreen = TRUE;
  931. }
  932. else
  933. {
  934. bShowTitle = FALSE;
  935. if(m_bIsMultiplayer == TRUE && m_pMultiPlayer.IsHosting() == FALSE)
  936. bHalfScreen = TRUE;
  937. else
  938. bHalfScreen = FALSE;
  939. }
  940. if(iStart == 0)
  941. {
  942. // First create a list of Track files avaible
  943. m_iOption = 0;
  944. m_iTrack = 0;
  945. sort(pTrackNames.begin(), pTrackNames.end(), string_compare);
  946. m_surfTitle.Destroy();
  947. m_sptrCar.Create(GetInstHandle(), IDB_BIGCAR_BLUE + m_iOption, 750, 560, 0, 150, 140);
  948. m_surfCaret.Create(2,15);
  949. m_surfCaret.LoadBitmap(GetInstHandle(), IDB_CARET);
  950. m_surfCursor.Create(32, 32, RGB(0,0,0));
  951. m_surfCursor.LoadBitmap(GetInstHandle(), IDB_CURSOR);
  952. if(bShowTitle)
  953. {
  954. m_surfTitle.Create(600,198);
  955. m_surfTitle.LoadBitmap(GetInstHandle(), IDB_TITLE_COMPETITION);
  956. }
  957. iStart = 1;
  958. m_sPlayerName = "";
  959. m_sndType.Create(MAKEINTRESOURCE(IDR_TYPE), DSBCAPS_CTRL3D, DS3DALG_NO_VIRTUALIZATION);
  960. if(bHalfScreen == FALSE)
  961. {
  962. pRaceTrack.Destroy();
  963. pRaceTrack.ReadFromFile(pTrackNames[m_iOption]);
  964. // I磍l reuse the helmet surface object FOR THE BACKGROUND
  965. m_surfHelmet.Create(640, 480, RGB(0,0,0));
  966. m_surfHelmet.LoadBitmap(GetInstHandle(), IDB_BACKGROUND);
  967. }
  968. else
  969. {
  970. // I磍l reuse the helmet surface object FOR THE BACKGROUND
  971. m_surfHelmet.Create(640, 220, RGB(0,0,0));
  972. m_surfHelmet.LoadBitmap(GetInstHandle(), IDB_BACKGROUND2);
  973. }
  974. m_iX = 0; m_iY = 0;
  975. m_iIncrX = 5;
  976. m_iIncrY = 0;
  977. }
  978. //sprintf(buffer, "X:%.2d Y:%.2d B0: %d B1: %d", m_Mouse.GetX(), m_Mouse.GetY(), m_Mouse.GetRightButton(), m_Mouse.GetLeftButton());
  979. //m_sPlayerName = buffer;
  980. iCaretPos = 132;
  981. if(GetTickCount() - lLastCaret > 100)
  982. {
  983. bShowCaret = !bShowCaret;
  984. lLastCaret = GetTickCount();
  985. }
  986. if(m_sPlayerName.length() > 0)
  987. {
  988. if(bHalfScreen == FALSE)
  989. {
  990. iCaretPos = m_txDigital.WriteText(m_pBackBuffer, &m_sPlayerName[0], 130, 20);
  991. }
  992. else
  993. {
  994. iCaretPos = m_txDigital.WriteText(m_pBackBuffer, &m_sPlayerName[0], 130, 20+PANEL_POSITION);
  995. }
  996. }
  997. if(bShowCaret)
  998. {
  999. if(bHalfScreen == FALSE)
  1000. m_surfCaret.Draw(m_pBackBuffer, iCaretPos+2, 21);
  1001. else
  1002. m_surfCaret.Draw(m_pBackBuffer, iCaretPos+2, 21+PANEL_POSITION);
  1003. }
  1004. if(bHalfScreen == FALSE)
  1005. {
  1006. sprintf(buffer, "%.2d", pRaceTrack.GetNumberOfLaps());
  1007. m_txDigital.WriteText(m_pBackBuffer, pRaceTrack.GetTrackName(), 402, 268);
  1008. m_txDigital.WriteText(m_pBackBuffer, buffer, 402, 322);
  1009. RECT rcDest, rcSrc;
  1010. rcDest.top = 110; rcDest.left = 60;
  1011. rcDest.bottom = 440; rcDest.right = 390;//585;
  1012. rcSrc.left = 0; rcSrc.top = 0;
  1013. rcSrc.right = pRaceTrack.GetWidth();
  1014. rcSrc.bottom = pRaceTrack.GetHeight();
  1015. pRaceTrack.Draw(16, 69, m_iX, m_iY, 370, 370); 
  1016. }
  1017. // Draw the big car sprite
  1018. #define CARX 440
  1019. #define CARY 40
  1020. if(GetTickCount() - lLastSprite > 60)
  1021. {
  1022. if(bHalfScreen == FALSE)
  1023. m_sptrCar.Draw(m_pBackBuffer, CARX, CARY);
  1024. else
  1025. m_sptrCar.Draw(m_pBackBuffer, CARX, CARY+PANEL_POSITION);
  1026. lLastSprite = GetTickCount();
  1027. }
  1028. else
  1029. {
  1030. if(bHalfScreen == FALSE)
  1031. m_sptrCar.Draw(m_pBackBuffer, CARX, CARY, FALSE);
  1032. else
  1033. m_sptrCar.Draw(m_pBackBuffer, CARX, CARY+PANEL_POSITION, FALSE);
  1034. }
  1035. m_iX += m_iIncrX;
  1036. m_iY += m_iIncrY;
  1037. if(m_iX + 370 >= pRaceTrack.GetWidth())
  1038. {
  1039. if(m_iY % 370 == 0 && m_iIncrY != 0)
  1040. {
  1041. m_iIncrX = -5;
  1042. m_iIncrY = 0;
  1043. }
  1044. else
  1045. {
  1046. m_iIncrX = 0;
  1047. m_iIncrY = 5;
  1048. }
  1049. if(m_iY + 370 >= pRaceTrack.GetWidth())
  1050. {
  1051. m_iIncrY = 0;
  1052. m_iIncrX = 5;
  1053. m_iX = 0;
  1054. m_iY = 0;
  1055. }
  1056. }
  1057. if(m_iX <= 0)
  1058. {
  1059. if(m_iY % 370 == 0 && m_iIncrY != 0)
  1060. {
  1061. m_iIncrX = 5;
  1062. m_iIncrY = 0;
  1063. }
  1064. else
  1065. {
  1066. m_iIncrX = 0;
  1067. m_iIncrY = 5;
  1068. }
  1069. if(m_iY + 370 >= pRaceTrack.GetWidth())
  1070. {
  1071. m_iIncrY = 0;
  1072. m_iIncrX = 5;
  1073. }
  1074. }
  1075. // Draw the bounding box
  1076. if(bHalfScreen == FALSE)
  1077. m_surfHelmet.Draw(m_pBackBuffer, 0, 0);
  1078. else
  1079. {
  1080. if(bShowTitle)
  1081. m_surfTitle.Draw(m_pBackBuffer, 20, 5);
  1082. m_surfHelmet.Draw(m_pBackBuffer, 0, PANEL_POSITION+4);
  1083. }
  1084. m_Keyboard.Process();
  1085. m_Mouse.Process();
  1086. CheckInput(&m_sPlayerName, 20);
  1087. m_surfCursor.Draw(m_pBackBuffer, m_Mouse.GetX(), m_Mouse.GetY(), 0, 0, m_Mouse.GetX() > 640-32 ? 640-m_Mouse.GetX() : 0, m_Mouse.GetY() > 480-32 ? 480-m_Mouse.GetY() : 0 );
  1088. if(GetTickCount() - lLastOption > 200)
  1089. {
  1090. int iTmpPos;
  1091. int iX, iY;
  1092. iX = m_Mouse.GetX();
  1093. iY = m_Mouse.GetY();
  1094. if(bHalfScreen == TRUE)
  1095. iY -= PANEL_POSITION;
  1096. // Check if the user hit the Car selection buttons
  1097. if( iX > 448 &&    iY > 14    &&
  1098. iX < 448+68 && iY < 14+16 &&
  1099. m_Mouse.GetLeftButton() == FALSE)
  1100. {
  1101. m_iOption++;
  1102. if(m_iOption == 4)
  1103. m_iOption = 0;
  1104. iTmpPos = m_sptrCar.m_iAbsolutePosition;
  1105. m_sptrCar.Create(GetInstHandle(), IDB_BIGCAR_BLUE + m_iOption, 750, 560, 0, 150, 140);
  1106. m_sptrCar.m_iAbsolutePosition = iTmpPos;
  1107. lLastOption = GetTickCount();
  1108. m_sndChangeOption.Play();
  1109. }
  1110. if( iX > 522 &&    iY > 14    &&
  1111. iX < 522+68 && iY < 14+16 &&
  1112. m_Mouse.GetLeftButton() == FALSE)
  1113. {
  1114. m_iOption--;
  1115. if(m_iOption == -1)
  1116. m_iOption = 3;
  1117. iTmpPos = m_sptrCar.m_iAbsolutePosition;
  1118. m_sptrCar.Create(GetInstHandle(), IDB_BIGCAR_BLUE + m_iOption, 750, 560, 0, 150, 140);
  1119. m_sptrCar.m_iAbsolutePosition = iTmpPos;
  1120. lLastOption = GetTickCount();
  1121. m_sndChangeOption.Play();
  1122. }
  1123. // Check if the user hit the Track Selection Buttons
  1124. if( iX > 211 &&     iY > 431    &&
  1125. iX < 211+125 && iY < 431+25 &&
  1126. m_Mouse.GetLeftButton() == FALSE &&
  1127. bHalfScreen == FALSE)
  1128. {
  1129. m_iTrack++;
  1130. if(m_iTrack == pTrackNames.size())
  1131. m_iTrack = 0;
  1132. pRaceTrack.Destroy();
  1133. pRaceTrack.ReadFromFile(pTrackNames[m_iTrack]);
  1134. lLastOption = GetTickCount();
  1135. m_sndChangeOption.Play();
  1136. m_iX = 0; m_iY = 0;
  1137. m_iIncrX = 5;m_iIncrY = 0;
  1138. }
  1139. if( iX > 73 &&     iY > 431    &&
  1140. iX < 73+125 && iY < 431+25 &&
  1141. m_Mouse.GetLeftButton() == FALSE &&
  1142. bHalfScreen == FALSE)
  1143. {
  1144. m_iTrack--;
  1145. if(m_iTrack < 0)
  1146. m_iTrack = pTrackNames.size()-1;
  1147. pRaceTrack.Destroy();
  1148. pRaceTrack.ReadFromFile(pTrackNames[m_iTrack]);
  1149. lLastOption = GetTickCount();
  1150. m_sndChangeOption.Play();
  1151. m_iX = 0; m_iY = 0;
  1152. m_iIncrX = 5;m_iIncrY = 0;
  1153. }
  1154. if(m_Keyboard.CheckKey(DIK_RETURN) ||
  1155.    m_Keyboard.CheckKey(DIK_NUMPADENTER) )
  1156. {
  1157. m_sndSelect.Play();
  1158. m_surfHelmet.Destroy();
  1159. m_sptrCar.Destroy();
  1160. if(m_bIsMultiplayer)
  1161. {
  1162. // Regardless if its competition or single track,
  1163. // go to the wait screen
  1164. m_iState = GS_NETWORKSTATUS;
  1165. iStart = 0;
  1166. m_sndSelect.Play();
  1167. lLastOption = GetTickCount();
  1168. if(m_pMultiPlayer.IsHosting())
  1169. {
  1170. m_pCompetition.AddPlayer(m_sPlayerName, IDB_CAR_BLUE + m_iOption, CTRL_USER, 0, 0);
  1171. m_pCompetition.SetReadyState(0, TRUE);
  1172. }
  1173. else
  1174. {
  1175. DWORD dwTemp = IDB_CAR_BLUE + m_iOption;
  1176. memcpy(&buffer[0], &dwTemp, sizeof(DWORD));
  1177. memcpy(&buffer[4],(char*) &m_sPlayerName[0], m_sPlayerName.size());
  1178. m_pMultiPlayer.SendTo(m_pMultiPlayer.GetHost(), MSG_PLAYER_INFO, (LPBYTE) buffer, m_sPlayerName.size() + sizeof(DWORD), DPNSEND_SYNC | DPNSEND_NOLOOPBACK | DPNSEND_GUARANTEED);
  1179. }
  1180. }
  1181. else
  1182. {
  1183. m_pCompetition.AddPlayer("COMPUTER 1", m_iOption == 0 ? IDB_CAR_YEALLOW : IDB_CAR_BLUE, CTRL_COMPUTER, 1, 1);
  1184. m_pCompetition.AddPlayer("COMPUTER 2", m_iOption == 1 ? IDB_CAR_YEALLOW : IDB_CAR_GREEN, CTRL_COMPUTER,2, 2);
  1185. m_pCompetition.AddPlayer("COMPUTER 3", m_iOption == 2 ? IDB_CAR_YEALLOW : IDB_CAR_RED, CTRL_COMPUTER,3, 3);
  1186. m_pCompetition.AddPlayer(m_sPlayerName, IDB_CAR_BLUE + m_iOption, CTRL_USER, 0, 0);
  1187. if(m_pCompetition.GetCompetitionMode() == TRUE)
  1188. {
  1189. // Single Player - Competition
  1190. // Go to the Competition Status Screen
  1191. m_iState = GS_COMPETITIONSTATUS;
  1192. iStart = 0;
  1193. m_sndSelect.Play();
  1194. lLastOption = GetTickCount();
  1195. }
  1196. else
  1197. {
  1198. // Single Player - Single Track
  1199. // Go to the Track selection Screen
  1200. m_iState = GS_RACE;
  1201. iStart = 0;
  1202. m_sndSelect.Play();
  1203. lLastOption = GetTickCount();
  1204. }
  1205. }
  1206. }
  1207. if(m_Keyboard.CheckKey(DIK_ESCAPE))
  1208. {
  1209. m_iState = GS_MAINSCREEN;
  1210. iStart = 0;
  1211. m_surfHelmet.Destroy();
  1212. pRaceTrack.Destroy();
  1213. m_sptrCar.Destroy();
  1214. lLastOption = GetTickCount();
  1215. }
  1216. }
  1217. break;
  1218. case GS_RACE:
  1219. // Draw the Race Track on the screen
  1220. pRaceTrack.Draw(0,0, -1, -1, 640, 460);
  1221. if(iStart == 0)
  1222. {
  1223. m_surfTitle.Destroy();
  1224. // We haven磘 create the cars yet
  1225. // Create the cars based on the cCompetition class information
  1226. for(i=0;i<m_pCompetition.GetNumberOfCars();i++)
  1227. {
  1228. pCar = new cRaceCar;
  1229. pCar->Create(m_pCompetition.GetColor(i));
  1230. pCar->SetControlType(m_pCompetition.GetControlType(i));
  1231. pCar->SetID(m_pCompetition.GetPlayerID(i));
  1232. pRaceTrack.AddCar(pCar);
  1233. }
  1234. iStart = 1;
  1235. }
  1236. // Process the keyboard input
  1237. m_Keyboard.Process();
  1238. if(m_Keyboard.CheckKey(DIK_ESCAPE))
  1239. {
  1240. m_iState = GS_MAINSCREEN;
  1241. iStart = 0;
  1242. m_surfHelmet.Destroy();
  1243. pRaceTrack.Destroy();
  1244. lLastOption = GetTickCount();
  1245. break;
  1246. }
  1247. // Process the Race Track
  1248. pRaceTrack.Process();
  1249. for(i=0;i<m_pCompetition.GetNumberOfCars();i++)
  1250. {
  1251. if(pRaceTrack.m_pRaceCars[i]->GetControlType() == CTRL_USER || pRaceTrack.m_pRaceCars[i]->GetControlType() == CTRL_NETWORK_LOCAL)
  1252. {
  1253. pCar = pRaceTrack.m_pRaceCars[i];
  1254. DWORD dwFreq = 0;
  1255. }
  1256. }
  1257. // Write the race stats on the screen
  1258. sprintf(buffer, "LAPS %02d", pCar->m_iLaps);
  1259. m_txDigital.WriteText(m_pBackBuffer, buffer, 2, 463);
  1260. sprintf(buffer, "SPEED %003dKM", pCar->GetSpeed());
  1261. m_txDigital.WriteText(m_pBackBuffer, buffer, 125, 463);
  1262. sprintf(buffer, "POSITION %d", pCar->GetPosition());
  1263. m_txDigital.WriteText(m_pBackBuffer, buffer, 315, 463);
  1264. lStart = 0;
  1265. m_txDigitalSmall.WriteText(m_pBackBuffer, "ELAPSE TIME -", 472, 461);
  1266. m_txDigitalSmall.WriteText(m_pBackBuffer, "LAST LAP TIME -", 460, 471);
  1267. if(pCar->GetCarState() != CARSTATE_RACECOMPLETED)
  1268. lStart = pCar->GetLapElapseTime();
  1269. sprintf(buffer,"%02d:%02d:%003d", (lStart / 60000), (lStart / 1000) % 60, lStart % 1000);
  1270. m_txDigitalSmall.WriteText(m_pBackBuffer, buffer, 575, 461, true);
  1271. lStart = pCar->GetLastLapTime();
  1272. sprintf(buffer,"%02d:%02d:%003d", (lStart / 60000), (lStart / 1000) % 60, lStart % 1000);
  1273. m_txDigitalSmall.WriteText(m_pBackBuffer, buffer, 575, 471, true);
  1274. if( pCar->GetCarState() == CARSTATE_RACECOMPLETED &&
  1275. pCar->GetLapElapseTime() > 4000)
  1276. {
  1277. if(m_bIsMultiplayer == TRUE)
  1278. {
  1279. int iNumCompleted = 0;
  1280. for(i=0;i<pRaceTrack.GetNumberOfCars();i++)
  1281. {
  1282. if(pRaceTrack.m_pRaceCars[i]->GetCarState() == CARSTATE_RACECOMPLETED)
  1283. iNumCompleted++;
  1284. }
  1285. if(iNumCompleted == pRaceTrack.GetNumberOfCars())
  1286. {
  1287. m_iState = GS_RACECOMPLETED;
  1288. iStart = 0;
  1289. lLastOption = GetTickCount();
  1290. }
  1291. }
  1292. else
  1293. {
  1294. m_iState = GS_RACECOMPLETED;
  1295. iStart = 0;
  1296. lLastOption = GetTickCount();
  1297. }
  1298. }
  1299. break;
  1300. case GS_RACECOMPLETED:
  1301. // When the user completes the race, this screen is showed
  1302. // It shows the position of each player in the race and
  1303. // the elapse time of each lap
  1304. long lBestLapTime, lAvarageLapTime;
  1305. lBestLapTime = 999999999;
  1306. lAvarageLapTime = 0;
  1307. if(iStart == 0)
  1308. {
  1309. iStart = 1;
  1310. for(i=0;i<4;i++)
  1311. {
  1312. m_surfBigCars[i].Create(150, 140, RGB(0,0,0));
  1313. m_surfBigCars[i].LoadBitmap(GetInstHandle(), IDB_BIGCAR_BLUE + i);
  1314. }
  1315. m_sndSelect.Create(MAKEINTRESOURCE(IDR_FINISHEDRACE), DSBCAPS_STATIC , DS3DALG_DEFAULT);
  1316. //m_sndSelect.SetPosition(0.0f,0.0f,0.0f);
  1317. m_sndSelect.Play(0, DSBPLAY_LOOPING);
  1318. for(i=0;i<pRaceTrack.GetNumberOfCars();i++)
  1319. {
  1320. pTmpCar = pRaceTrack.GetCar(i);
  1321. m_pCompetition.AddPointToPlayer(pTmpCar->GetID(), 3-i);
  1322. }
  1323. m_surfCarPannel.Create(320,110, RGB(0,0,0));
  1324. m_surfCarPannel.LoadBitmap(GetInstHandle(), IDB_CAR_PANNEL);
  1325. m_surfHelmet.Create(320,280, RGB(0,0,0));
  1326. m_surfHelmet.LoadBitmap(GetInstHandle(), IDB_LAP_RESULTS_PANNEL);
  1327. m_surfPanel.Create(320,160, RGB(0,0,0));
  1328. m_surfPanel.LoadBitmap(GetInstHandle(), IDB_RACE_STATS);
  1329. m_surfTitle.Create(400,40, RGB(0,0,0));
  1330. m_surfTitle.LoadBitmap(GetInstHandle(), IDB_RACERESULTS_TITLE);
  1331. m_surfPositions.Create(120,40, RGB(0,0,0));
  1332. m_surfPositions.LoadBitmap(GetInstHandle(), IDB_POSITIONS);
  1333. }
  1334. m_surfTitle.Draw(m_pBackBuffer, 120, 0);
  1335. for(i=0;i<pRaceTrack.GetNumberOfCars();i++)
  1336. {
  1337. pTmpCar = pRaceTrack.GetCar(i);
  1338. //m_txVerdana.WriteText(m_pBackBuffer, "RACE RESULTS", 20, 5);
  1339. m_surfBigCars[pTmpCar->GetCarColor() - IDB_CAR_BLUE].Draw(m_pBackBuffer, 10, 40 + (i * 110), 20, 14, 130, 106);
  1340. m_surfCarPannel.Draw(m_pBackBuffer, 0, 40 + (i * 110));
  1341. m_surfPositions.Draw(m_pBackBuffer, 130, 42 + (i*110), i*30, 0, 30, 40);
  1342. //sprintf(buffer,"%d", i+1);
  1343. //m_txVerdana.WriteText(m_pBackBuffer, buffer, 160, 30 + (i * 110));
  1344. sTmp = m_pCompetition.GetPlayerName(pTmpCar->GetID());
  1345. m_txDigitalSmall.WriteText(m_pBackBuffer, &sTmp[0], 145, 118 + (i*110));
  1346. if(pTmpCar->GetControlType() == CTRL_USER || pTmpCar->GetControlType() == CTRL_NETWORK_LOCAL)
  1347. {
  1348. //m_txVerdana.WriteText(m_pBackBuffer, "YOU FINISHED THE RACE", 320, 300);
  1349. //sprintf(buffer, "IN THE %dTH POSITION", pTmpCar->GetPosition());
  1350. //m_txVerdana.WriteText(m_pBackBuffer, buffer, 320, 320);
  1351. int j;
  1352. for(j=0;j<pRaceTrack.GetNumberOfLaps();j++)
  1353. {
  1354. sprintf(buffer,"LAP %d", j+1);
  1355. m_txDigitalSmall.WriteText(m_pBackBuffer, buffer, 340, 90 + (j * 12), false);
  1356. lStart = pTmpCar->GetLapElapseTime(j);
  1357. if(lStart < lBestLapTime)
  1358. lBestLapTime = lStart;
  1359. lAvarageLapTime+= lStart;
  1360. sprintf(buffer,"%02d:%02d:%003d", (lStart / 60000), (lStart / 1000) % 60, lStart % 1000);
  1361. m_txDigitalSmall.WriteText(m_pBackBuffer, buffer, 400, 90 + (j * 12), true);
  1362. }
  1363. }
  1364. }
  1365. m_surfHelmet.Draw(m_pBackBuffer, 320, 40);
  1366. m_surfPanel.Draw(m_pBackBuffer, 320, 320);
  1367. lAvarageLapTime /= pRaceTrack.GetNumberOfLaps(); 
  1368. sprintf(buffer,"%02d:%02d:%003d", (lAvarageLapTime / 60000), (lAvarageLapTime / 1000) % 60, lAvarageLapTime % 1000);
  1369. m_txDigitalSmall.WriteText(m_pBackBuffer, buffer, 544, 350, true);
  1370. sprintf(buffer,"%02d:%02d:%003d", (lBestLapTime / 60000), (lBestLapTime / 1000) % 60, lBestLapTime % 1000);
  1371. m_txDigitalSmall.WriteText(m_pBackBuffer, buffer, 544, 382 , true);
  1372. // Process the keyboard for input
  1373. m_Keyboard.Process();
  1374. if(GetTickCount() - lLastOption > 200)
  1375. {
  1376. if(m_Keyboard.CheckKey(DIK_RETURN) ||
  1377.    m_Keyboard.CheckKey(DIK_NUMPADENTER))
  1378. {
  1379. if(m_pCompetition.GetCompetitionMode() == TRUE)
  1380. {
  1381. for(i=0;i<4;i++)
  1382. {
  1383. m_surfBigCars[i].Destroy();
  1384. }
  1385. m_sndSelect.Stop(TRUE);
  1386. pRaceTrack.Destroy();
  1387. m_sptrCar.Destroy();
  1388. m_surfTitle.Destroy();
  1389. m_surfCarPannel.Destroy();
  1390. m_surfHelmet.Destroy();
  1391. m_surfPositions.Destroy();
  1392. m_pCompetition.NextRace();
  1393. m_pCompetition.ResetReadyState();
  1394. m_iState = GS_COMPETITIONSTATUS;
  1395. iStart = 0;
  1396. //m_sndSelect.Play();
  1397. lLastOption = GetTickCount();
  1398. }
  1399. else
  1400. {
  1401. for(i=0;i<4;i++)
  1402. {
  1403. m_surfBigCars[i].Destroy();
  1404. }
  1405. m_surfTitle.Destroy();
  1406. m_surfCarPannel.Destroy();
  1407. m_surfHelmet.Destroy();
  1408. m_surfPositions.Destroy();
  1409. m_sndSelect.Stop(TRUE);
  1410. //m_sndSelect.Destroy();
  1411. pRaceTrack.Destroy();
  1412. m_sptrCar.Destroy();
  1413. m_iState = GS_MAINSCREEN;
  1414. iStart = 0;
  1415. //m_sndSelect.Play();
  1416. lLastOption = GetTickCount();
  1417. }
  1418. break;
  1419. }
  1420. }
  1421. break;
  1422. case GS_COMPETITIONSTATUS:
  1423. // Shows the competition status
  1424. // It shows the position of each player in the competition and
  1425. // the next race information
  1426. // If the competition is finished, show the tophy for the player
  1427. BOOL bFinished;
  1428. int iPosition;
  1429. iPosition = 4;
  1430. for(i=0;i<4;i++)
  1431. {
  1432. if(m_pCompetition.GetControlType(i) == CTRL_USER || m_pCompetition.GetControlType(i) == CTRL_NETWORK_LOCAL)
  1433. {
  1434. iPosition = i+1;
  1435. break;
  1436. }
  1437. }
  1438. if(m_pCompetition.GetNextRace() == "")
  1439. bFinished = TRUE;
  1440. else
  1441. bFinished = FALSE;
  1442. if(iStart == 0)
  1443. {
  1444. iStart = 1;
  1445. m_surfTitle.Destroy();
  1446. for(i=0;i<4;i++)
  1447. {
  1448. m_surfBigCars[i].Create(750, 560, RGB(0,0,0));
  1449. m_surfBigCars[i].LoadBitmap(GetInstHandle(), IDB_BIGCAR_BLUE + i);
  1450. }
  1451. m_surfCarPannel.Create(320,110, RGB(0,0,0));
  1452. m_surfCarPannel.LoadBitmap(GetInstHandle(), IDB_CAR_PANNEL_COMPETITION);
  1453. m_surfTitle.Create(600,40, RGB(0,0,0));
  1454. m_surfTitle.LoadBitmap(GetInstHandle(), IDB_COMPETITIONSTATUS_TITLE);
  1455. m_surfPositions.Create(120,40, RGB(0,0,0));
  1456. m_surfPositions.LoadBitmap(GetInstHandle(), IDB_POSITIONS);
  1457. m_surfHelmet.Create(320,440, RGB(0,0,0));
  1458. if(bFinished)
  1459. {
  1460. m_surfHelmet.LoadBitmap(GetInstHandle(), IDB_FINISHCOMPETITION_PANEL);
  1461. m_surfTophy.Create(280,300);
  1462. switch(iPosition)
  1463. {
  1464. case 1:
  1465. m_surfTophy.LoadBitmap(GetInstHandle(), IDB_TOPHY_GOLD);
  1466. break;
  1467. case 2:
  1468. m_surfTophy.LoadBitmap(GetInstHandle(), IDB_TOPHY_SILVER);
  1469. break;
  1470. case 3:
  1471. m_surfTophy.LoadBitmap(GetInstHandle(), IDB_TOPHY_COOPER);
  1472. break;
  1473. case 4:
  1474. m_surfTophy.LoadBitmap(GetInstHandle(), IDB_TOPHY_NONE);
  1475. break;
  1476. }
  1477. }
  1478. else
  1479. m_surfHelmet.LoadBitmap(GetInstHandle(), IDB_NEXTRACEINFO_PANEL);
  1480. pRaceTrack.Destroy();
  1481. if(!bFinished)
  1482. pRaceTrack.ReadFromFile(&m_pCompetition.GetNextRace()[0]);
  1483. }
  1484. if(bFinished)
  1485. {
  1486. m_surfTophy.Draw(m_pBackBuffer, 340, 60);
  1487. }
  1488. m_surfTitle.Draw(m_pBackBuffer, 20, 0);
  1489. m_surfHelmet.Draw(m_pBackBuffer, 320, 40);
  1490. for(i=0;i<m_pCompetition.GetNumberOfCars();i++)
  1491. {
  1492. m_surfBigCars[m_pCompetition.GetColor(i) - IDB_CAR_BLUE].Draw(m_pBackBuffer, 10, 40 + (i * 110), 20, 14, 130, 106);
  1493. m_surfCarPannel.Draw(m_pBackBuffer, 0, 40 + (i * 110));
  1494. m_surfPositions.Draw(m_pBackBuffer, 130, 42 + (i*110), i*30, 0, 30, 40);
  1495. sTmp = m_pCompetition.GetPlayerName(m_pCompetition.GetPlayerID(i));
  1496. m_txDigitalSmall.WriteText(m_pBackBuffer, &sTmp[0], 145, 110 + (i*110));
  1497. sprintf(buffer,"%d", m_pCompetition.GetPlayerPointsByPosition(i));
  1498. m_txDigitalSmall.WriteText(m_pBackBuffer, buffer, 285, 130 + (i*110));
  1499. }
  1500. if(bFinished)
  1501. {
  1502. sprintf(buffer, "YOU FINISHED THE COMPETITION", iPosition);
  1503. m_txDigitalSmall.WriteText(m_pBackBuffer, buffer, 375, 380);
  1504. sprintf(buffer, "IN THE %dTH POSITION.", iPosition);
  1505. m_txDigitalSmall.WriteText(m_pBackBuffer, buffer, 405, 395);
  1506. switch(iPosition)
  1507. {
  1508. case 1:
  1509. sprintf(buffer, "CONGRATS, YOU GOT THE GOLDEN TOPHY");
  1510. break;
  1511. case 2:
  1512. sprintf(buffer, "CONGRATS, YOU GOT THE SILVER TOPHY");
  1513. break;
  1514. case 3:
  1515. sprintf(buffer, "CONGRATS, YOU GOT THE COOPER TOPHY");
  1516. break;
  1517. case 4:
  1518. sprintf(buffer, "SORRY, NO TOPHY FOR SLOW DRIVERS.");
  1519. break;
  1520. }
  1521. m_txDigitalSmall.WriteText(m_pBackBuffer, buffer, 354, 410);
  1522. }
  1523. else
  1524. {
  1525. sprintf(buffer, "%.2d", pRaceTrack.GetNumberOfLaps());
  1526. m_txDigital.WriteText(m_pBackBuffer, pRaceTrack.GetTrackName(), 350, 144);
  1527. m_txDigital.WriteText(m_pBackBuffer, buffer, 582, 194);
  1528. }
  1529. // Process the keyboard for input
  1530. m_Keyboard.Process();
  1531. if(GetTickCount() - lLastOption > 200)
  1532. {
  1533. if(m_Keyboard.CheckKey(DIK_RETURN) ||
  1534.    m_Keyboard.CheckKey(DIK_NUMPADENTER))
  1535. {
  1536. for(i=0;i<4;i++)
  1537. {
  1538. m_surfBigCars[i].Destroy();
  1539. }
  1540. m_surfTitle.Destroy();
  1541. m_surfCarPannel.Destroy();
  1542. m_surfHelmet.Destroy();
  1543. m_surfPositions.Destroy();
  1544. m_surfTophy.Destroy();
  1545. m_sptrCar.Destroy();
  1546. if(bFinished)
  1547. {
  1548. m_iState = GS_MAINSCREEN;
  1549. }
  1550. else
  1551. {
  1552. if(m_bIsMultiplayer == TRUE)
  1553. {
  1554. if(m_pMultiPlayer.IsHosting())
  1555. {
  1556. m_pCompetition.SetReadyState(0,TRUE);
  1557. if(m_pCompetition.AllPlayersReady())
  1558. {
  1559. m_iState = GS_RACE;
  1560. strcpy(buffer, pRaceTrack.GetFileName());
  1561. i = strlen(buffer);
  1562. m_pMultiPlayer.SendTo(0, MSG_START_RACE, (unsigned char *) &buffer[0], i, DPNSEND_SYNC | DPNSEND_NOLOOPBACK | DPNSEND_GUARANTEED);
  1563. m_iState = GS_RACE;
  1564. iStart = 0;
  1565. lLastOption = GetTickCount();
  1566. }
  1567. else
  1568. {
  1569. m_iState = GS_WAITCOMPETITION;
  1570. iStart = 0;
  1571. lLastOption = GetTickCount();
  1572. }
  1573. }
  1574. else
  1575. {
  1576. m_pMultiPlayer.SendTo(0, MSG_PLAYER_READY, NULL, 0, DPNSEND_SYNC | DPNSEND_NOLOOPBACK | DPNSEND_GUARANTEED);
  1577. if(m_iState != GS_RACE)
  1578. m_iState = GS_WAITCOMPETITION;
  1579. iStart = 0;
  1580. lLastOption = GetTickCount();
  1581. }
  1582. }
  1583. else
  1584. {
  1585. m_iState = GS_RACE;
  1586. iStart = 0;
  1587. lLastOption = GetTickCount();
  1588. }
  1589. }
  1590. iStart = 0;
  1591. lLastOption = GetTickCount();
  1592. break;
  1593. }
  1594. }
  1595. break;
  1596. }
  1597. }
  1598. void cRaceXApp::IncomingMessage(DWORD dwType, int idSender, BYTE* pBuffer, DWORD dwBufferSize)
  1599. {
  1600. LPBYTE pTmpBuffer;
  1601. DWORD dwTmp;
  1602. BYTE bTmp;
  1603. string sTmp;
  1604. char buffer[1024];
  1605. int iOffset, i;
  1606. // This is a virtual function of the cMessageHandler class
  1607. // and is used on multiplayer games
  1608. // Here we receive all the messages from the network, and process them
  1609. // based on theier type.
  1610. switch(dwType)
  1611. {
  1612. case MSG_PLAYER_READY:
  1613. if(m_pMultiPlayer.IsHosting())
  1614. {
  1615. m_pCompetition.SetReadyState(m_pCompetition.GetPlayerIDbyDPNID(idSender), TRUE);
  1616. }
  1617. break;
  1618. case MSG_PLAYER_INFO:
  1619. memcpy(&dwTmp, pBuffer, sizeof(DWORD));
  1620. memcpy(buffer, (pBuffer+sizeof(DWORD)), dwBufferSize-sizeof(DWORD));
  1621. buffer[dwBufferSize-sizeof(DWORD)] = '';
  1622. m_pCompetition.SetPlayerColor(m_pCompetition.GetPlayerIDbyDPNID(idSender), dwTmp);
  1623. m_pCompetition.SetPlayerName(m_pCompetition.GetPlayerIDbyDPNID(idSender), buffer);
  1624. m_pCompetition.SetReadyState(m_pCompetition.GetPlayerIDbyDPNID(idSender), TRUE);
  1625. iOffset = 0;
  1626. dwTmp = m_pCompetition.GetNumberOfCars();
  1627. memcpy(&buffer[iOffset], &dwTmp , sizeof(DWORD));
  1628. iOffset += sizeof(int);
  1629. for(i=0;i<m_pCompetition.GetNumberOfCars();i++)
  1630. {
  1631. bTmp = m_pCompetition.GetPlayerID(i);
  1632. memcpy(&buffer[iOffset], &bTmp , sizeof(BYTE));
  1633. iOffset += sizeof(BYTE);
  1634. dwTmp = m_pCompetition.GetPlayerDPNID(m_pCompetition.GetPlayerID(i));
  1635. memcpy(&buffer[iOffset], &dwTmp , sizeof(DWORD));
  1636. iOffset += sizeof(DWORD);
  1637. dwTmp = m_pCompetition.GetPlayerColor(m_pCompetition.GetPlayerID(i));
  1638. memcpy(&buffer[iOffset], &dwTmp , sizeof(DWORD));
  1639. iOffset += sizeof(DWORD);
  1640. sTmp = m_pCompetition.GetPlayerName(m_pCompetition.GetPlayerID(i));
  1641. dwTmp = sTmp.size();
  1642. memcpy(&buffer[iOffset], &dwTmp , sizeof(DWORD));
  1643. iOffset += sizeof(DWORD);
  1644. memcpy(&buffer[iOffset], &sTmp[0] , dwTmp);
  1645. iOffset += dwTmp;
  1646. }
  1647. m_pMultiPlayer.SendTo(DPNID_ALL_PLAYERS_GROUP, MSG_RACECARS_INFO, (unsigned char *) &buffer[0], iOffset+1, DPNSEND_SYNC | DPNSEND_NOLOOPBACK | DPNSEND_GUARANTEED);
  1648. break;
  1649. case MSG_RACECARS_INFO:
  1650. if(!m_pMultiPlayer.IsHosting())
  1651. {
  1652. DWORD dwNumCars;
  1653. BYTE bPlayerId;
  1654. int iPlayerDPNID;
  1655. int iCarColor;
  1656. m_pCompetition.Reset();
  1657. pTmpBuffer = pBuffer;
  1658. memcpy(&dwNumCars, pTmpBuffer, sizeof(DWORD));
  1659. pTmpBuffer+=sizeof(DWORD);
  1660. for(i=0;i<dwNumCars;i++)
  1661. {
  1662. memcpy(&bPlayerId, pTmpBuffer, sizeof(BYTE));
  1663. pTmpBuffer+=sizeof(BYTE);
  1664. memcpy(&iPlayerDPNID, pTmpBuffer, sizeof(DWORD));
  1665. pTmpBuffer+=sizeof(DWORD);
  1666. memcpy(&iCarColor, pTmpBuffer, sizeof(DWORD));
  1667. pTmpBuffer+=sizeof(DWORD);
  1668. memcpy(&dwTmp, pTmpBuffer, sizeof(DWORD));
  1669. pTmpBuffer+=sizeof(DWORD);
  1670. memcpy(&buffer[0], pTmpBuffer ,dwTmp);
  1671. buffer[dwTmp] = '';
  1672. pTmpBuffer+=dwTmp;
  1673. sTmp = buffer;
  1674. #ifdef _DEBUG
  1675. Log("CAR: PID: %d, DPNID: %d, NAME: %s, MYID: %dn",bPlayerId, iPlayerDPNID,  &buffer[0], m_pMultiPlayer.GetMyId());
  1676. #endif
  1677. m_pCompetition.AddPlayer(sTmp, iCarColor,m_pMultiPlayer.GetMyId()==iPlayerDPNID ? CTRL_NETWORK_LOCAL : CTRL_NETWORK_REMOTE, bPlayerId, iPlayerDPNID); 
  1678. }
  1679. }
  1680. break;
  1681. case MSG_START_RACE:
  1682. if(!m_pMultiPlayer.IsHosting())
  1683. {
  1684. if(m_iState == GS_NETWORKSTATUS)
  1685. {
  1686. for(i=0;i<4;i++)
  1687. {
  1688. m_surfBigCars[i].Destroy();
  1689. }
  1690. m_sptrCar.Destroy();
  1691. }
  1692. memcpy(&buffer[0], pBuffer, dwBufferSize);
  1693. buffer[dwBufferSize] = '';
  1694. pRaceTrack.ReadFromFile(buffer);
  1695. m_bSendKeyboard = TRUE;
  1696. m_iState = GS_RACE;
  1697. iStart = 0;
  1698. }
  1699. break;
  1700. case MSG_KEYBOARD_STATUS:
  1701. if(m_pMultiPlayer.IsHosting())
  1702. {
  1703. BYTE bStatus;
  1704. BYTE bInformation = 0;
  1705. BYTE buffer[200];
  1706. int iOffset = 0;
  1707. BYTE bID, bSpeed, bPosition, bLaps, bMask, bAngle, bState;
  1708. DWORD dwElapseTime, dwLastLapTime;
  1709. unsigned short iCarX, iCarY;
  1710. int iX, iY;
  1711. memcpy(&bStatus, pBuffer, sizeof(BYTE));
  1712. pRaceTrack.SetRemoteKeyboardStatus(m_pCompetition.GetPlayerIDbyDPNID(idSender), bStatus);
  1713. for(i=0;i<(int)pRaceTrack.GetNumberOfCars();i++)
  1714. {
  1715. iOffset = 0;
  1716. bID = pRaceTrack.m_pRaceCars[i]->GetID();
  1717. memcpy(&buffer[iOffset], &bID, sizeof(BYTE));
  1718. iOffset+=sizeof(BYTE);
  1719. if(idSender == m_pCompetition.GetPlayerDPNID(bID))
  1720. {
  1721. bMask = 0;
  1722. dwElapseTime = pRaceTrack.m_pRaceCars[i]->GetLapElapseTime();
  1723. memcpy(&buffer[iOffset], &dwElapseTime, sizeof(DWORD));
  1724. iOffset+=sizeof(DWORD);
  1725. int iMaskOffset = iOffset;
  1726. iOffset++;
  1727. if(pRaceTrack.m_pRaceCars[i]->m_iLaps != pRaceTrack.m_pRaceCars[i]->m_bLastSent_Laps)
  1728. {
  1729. bMask |= 0x01;
  1730. bLaps = pRaceTrack.m_pRaceCars[i]->m_iLaps;
  1731. memcpy(&buffer[iOffset], &bLaps, sizeof(BYTE));
  1732. iOffset+=sizeof(BYTE);
  1733. pRaceTrack.m_pRaceCars[i]->m_bLastSent_Laps = pRaceTrack.m_pRaceCars[i]->m_iLaps;
  1734. }
  1735. if((pRaceTrack.m_pRaceCars[i]->GetSpeed()/10) != pRaceTrack.m_pRaceCars[i]->m_bLastSent_Speed)
  1736. {
  1737. bMask |= 0x02;
  1738. bSpeed = (pRaceTrack.m_pRaceCars[i]->GetSpeed() / 10);
  1739. memcpy(&buffer[iOffset], &bSpeed, sizeof(BYTE));
  1740. iOffset+=sizeof(BYTE);
  1741. pRaceTrack.m_pRaceCars[i]->m_bLastSent_Speed = (pRaceTrack.m_pRaceCars[i]->GetSpeed()/10);
  1742. }
  1743. if(pRaceTrack.m_pRaceCars[i]->GetPosition() != pRaceTrack.m_pRaceCars[i]->m_bLastSent_Position)
  1744. {
  1745. bMask |= 0x04;
  1746. bPosition = pRaceTrack.m_pRaceCars[i]->GetPosition();
  1747. memcpy(&buffer[iOffset], &bPosition, sizeof(BYTE));
  1748. iOffset+=sizeof(BYTE);
  1749. pRaceTrack.m_pRaceCars[i]->m_bLastSent_Position = pRaceTrack.m_pRaceCars[i]->GetPosition();
  1750. }
  1751. if(pRaceTrack.m_pRaceCars[i]->GetLastLapTime() != pRaceTrack.m_pRaceCars[i]->m_dwLastSent_LastLapTime)
  1752. {
  1753. bMask |= 0x08;
  1754. dwLastLapTime = pRaceTrack.m_pRaceCars[i]->GetLastLapTime();
  1755. memcpy(&buffer[iOffset], &dwLastLapTime, sizeof(DWORD));
  1756. iOffset+=sizeof(DWORD);
  1757. pRaceTrack.m_pRaceCars[i]->m_dwLastSent_LastLapTime = pRaceTrack.m_pRaceCars[i]->GetLastLapTime();
  1758. }
  1759. pRaceTrack.m_pRaceCars[i]->GetPos(&iX, &iY);
  1760. iCarX = (unsigned short) iX;
  1761. iCarY = (unsigned short) iY;
  1762. if(iCarX != pRaceTrack.m_pRaceCars[i]->m_nLastSent_PosX)
  1763. {
  1764. bMask |= 0x10;
  1765. memcpy(&buffer[iOffset], &iCarX, sizeof(unsigned short));
  1766. iOffset+=sizeof(unsigned short);
  1767. pRaceTrack.m_pRaceCars[i]->m_nLastSent_PosX = iCarX;
  1768. }
  1769. if(iCarY != pRaceTrack.m_pRaceCars[i]->m_nLastSent_PosY)
  1770. {
  1771. bMask |= 0x20;
  1772. memcpy(&buffer[iOffset], &iCarY, sizeof(unsigned short));
  1773. iOffset+=sizeof(unsigned short);
  1774. pRaceTrack.m_pRaceCars[i]->m_nLastSent_PosY = iCarY;
  1775. }
  1776. if(pRaceTrack.m_pRaceCars[i]->m_iAngle != pRaceTrack.m_pRaceCars[i]->m_bLastSent_Angle)
  1777. {
  1778. bMask |= 0x40;
  1779. bAngle = (BYTE) (pRaceTrack.m_pRaceCars[i]->m_iAngle / 10);
  1780. memcpy(&buffer[iOffset], &bAngle, sizeof(BYTE));
  1781. iOffset+=sizeof(BYTE);
  1782. pRaceTrack.m_pRaceCars[i]->m_bLastSent_Angle = (BYTE) pRaceTrack.m_pRaceCars[i]->m_iAngle;
  1783. }
  1784. if(pRaceTrack.m_pRaceCars[i]->GetCarState() != pRaceTrack.m_pRaceCars[i]->m_bLastSent_CarState)
  1785. {
  1786. bMask |= 0x80;
  1787. bState = (BYTE) pRaceTrack.m_pRaceCars[i]->GetCarState();
  1788. memcpy(&buffer[iOffset], &bState, sizeof(BYTE));
  1789. iOffset+=sizeof(BYTE);
  1790. pRaceTrack.m_pRaceCars[i]->m_bLastSent_CarState = pRaceTrack.m_pRaceCars[i]->GetCarState();
  1791. }
  1792. memcpy(&buffer[iMaskOffset], &bMask, sizeof(BYTE));
  1793. m_pMultiPlayer.SendTo(idSender, MSG_RACECARS_STATUS, (unsigned char *) &buffer[0], iOffset, 0 /*DPNSEND_SYNC*/);
  1794. }
  1795. else
  1796. {
  1797. pRaceTrack.m_pRaceCars[i]->GetPos(&iX, &iY);
  1798. iCarX = (unsigned short) iX;
  1799. iCarY = (unsigned short) iY;
  1800. memcpy(&buffer[iOffset], &iCarX, sizeof(unsigned short));
  1801. iOffset+=sizeof(unsigned short);
  1802. memcpy(&buffer[iOffset], &iCarY, sizeof(unsigned short));
  1803. iOffset+=sizeof(unsigned short);
  1804. bState = (BYTE) pRaceTrack.m_pRaceCars[i]->GetCarState();
  1805. memcpy(&buffer[iOffset], &bState, sizeof(BYTE));
  1806. iOffset+=sizeof(BYTE);
  1807. if(bState == CARSTATE_RACECOMPLETED)
  1808. {
  1809. bPosition = (BYTE) (pRaceTrack.m_pRaceCars[i]->GetPosition());
  1810. memcpy(&buffer[iOffset], &bPosition, sizeof(BYTE));
  1811. iOffset+=sizeof(BYTE);
  1812. }
  1813. else
  1814. {
  1815. bAngle = (BYTE) (pRaceTrack.m_pRaceCars[i]->m_iAngle / 10);
  1816. memcpy(&buffer[iOffset], &bAngle, sizeof(BYTE));
  1817. iOffset+=sizeof(BYTE);
  1818. }
  1819. m_pMultiPlayer.SendTo(idSender, MSG_RACECARS_STATUS, (unsigned char *) &buffer[0], iOffset, 0 /*DPNSEND_SYNC*/);
  1820. } /* IF SENDER*/
  1821. } /* FOR */
  1822. } /* IF IS HOSTING */
  1823. break;
  1824. case MSG_COMPETITIONSTATUS:
  1825. m_pCompetition.SetCompetitionMode(TRUE);
  1826. m_iState = GS_COMPETITIONSTATUS;
  1827. iStart = 0;
  1828. m_sndSelect.Play();
  1829. break;
  1830. case MSG_RACECARS_STATUS:
  1831. if(!m_pMultiPlayer.IsHosting())
  1832. {
  1833. BYTE bCarId;
  1834. unsigned short iCarX = -1, iCarY = -1;
  1835. BYTE bCarPosition = -1;
  1836. BYTE bCarState = -1;
  1837. BYTE bAngle = -1;
  1838. BYTE bSpeed = -1;
  1839. BYTE bPosition = -1;
  1840. BYTE bLaps = -1;
  1841. BYTE bMask = -1;
  1842. DWORD dwLastLapTime = -1;
  1843. DWORD dwElapseTime = -1;
  1844. pTmpBuffer = pBuffer;
  1845. memcpy(&bCarId, pTmpBuffer, sizeof(BYTE));
  1846. pTmpBuffer+=sizeof(BYTE);
  1847. if(bCarId == pRaceTrack.GetLocalCarID())
  1848. {
  1849. memcpy(&dwElapseTime, pTmpBuffer, sizeof(DWORD));
  1850. pTmpBuffer+=sizeof(DWORD);
  1851. memcpy(&bMask, pTmpBuffer, sizeof(BYTE));
  1852. pTmpBuffer+=sizeof(BYTE);
  1853. if(bMask & 0x01)
  1854. {
  1855. memcpy(&bLaps, pTmpBuffer, sizeof(BYTE));
  1856. pTmpBuffer+=sizeof(BYTE);
  1857. }
  1858. if(bMask & 0x02)
  1859. {
  1860. memcpy(&bSpeed, pTmpBuffer, sizeof(BYTE));
  1861. pTmpBuffer+=sizeof(BYTE);
  1862. }
  1863. if(bMask & 0x04)
  1864. {
  1865. memcpy(&bPosition, pTmpBuffer, sizeof(BYTE));
  1866. pTmpBuffer+=sizeof(BYTE);
  1867. }
  1868. if(bMask & 0x08)
  1869. {
  1870. memcpy(&dwLastLapTime, pTmpBuffer, sizeof(DWORD));
  1871. pTmpBuffer+=sizeof(DWORD);
  1872. }
  1873. if(bMask & 0x10)
  1874. {
  1875. memcpy(&iCarX, pTmpBuffer, sizeof(unsigned short));
  1876. pTmpBuffer+=sizeof(unsigned short);
  1877. }
  1878. if(bMask & 0x20)
  1879. {
  1880. memcpy(&iCarY, pTmpBuffer, sizeof(unsigned short));
  1881. pTmpBuffer+=sizeof(unsigned short);
  1882. }
  1883. if(bMask & 0x40)
  1884. {
  1885. memcpy(&bAngle, pTmpBuffer, sizeof(BYTE));
  1886. pTmpBuffer+=sizeof(BYTE);
  1887. }
  1888. if(bMask & 0x80)
  1889. {
  1890. memcpy(&bCarState, pTmpBuffer, sizeof(BYTE));
  1891. pTmpBuffer+=sizeof(BYTE);
  1892. }
  1893. m_bSendKeyboard = TRUE;
  1894. }
  1895. else
  1896. {
  1897. bMask = 0;
  1898. bMask |= 0x10;
  1899. bMask |= 0x20;
  1900. bMask |= 0x80;
  1901. memcpy(&iCarX, pTmpBuffer, sizeof(unsigned short));
  1902. pTmpBuffer+=sizeof(unsigned short);
  1903. memcpy(&iCarY, pTmpBuffer, sizeof(unsigned short));
  1904. pTmpBuffer+=sizeof(unsigned short);
  1905. memcpy(&bCarState, pTmpBuffer, sizeof(BYTE));
  1906. pTmpBuffer+=sizeof(BYTE);
  1907. if(bCarState == CARSTATE_RACECOMPLETED)
  1908. {
  1909. bMask |= 0x04;
  1910. memcpy(&bPosition, pTmpBuffer, sizeof(BYTE));
  1911. pTmpBuffer+=sizeof(BYTE);
  1912. }
  1913. else
  1914. {
  1915. bMask |= 0x40;
  1916. memcpy(&bAngle, pTmpBuffer, sizeof(BYTE));
  1917. pTmpBuffer+=sizeof(BYTE);
  1918. }
  1919. }
  1920. pRaceTrack.SetCarInfo(bCarId, bMask, dwElapseTime,
  1921. bLaps,
  1922. bSpeed,
  1923. bPosition,
  1924. dwLastLapTime,
  1925. iCarX,
  1926. iCarY,
  1927. bAngle,
  1928. bCarState);
  1929. }
  1930. break;
  1931. }
  1932. return;
  1933. }
  1934. void cRaceXApp::AppInitialized()
  1935. {
  1936. // Hide the mouse cursor
  1937. ShowCursor(FALSE);
  1938. m_pSoundInterface.Initialize(GetMainWnd(), DSSCL_PRIORITY );
  1939. if(m_Keyboard.Create() == FALSE)
  1940. {
  1941. DXTRACE_MSG("Failed To Initialize Keyboard Input");
  1942. PostQuitMessage(0);
  1943. }
  1944. if(m_Mouse.Create() == FALSE)
  1945. {
  1946. DXTRACE_MSG("Failed To Initialize Keyboard Input");
  1947. PostQuitMessage(0);
  1948. }
  1949. if(m_pMultiPlayer.Initialize() == FALSE)
  1950. {
  1951. DXTRACE_MSG("Failed To Initialize Multiplayer Support.");
  1952. PostQuitMessage(0);
  1953. }
  1954. else
  1955. {
  1956. m_pMultiPlayer.SetHandler(this);
  1957. m_pMultiPlayer.EnumServiceProviders();
  1958. }
  1959. m_iDifficultyLevel = m_pMultiPlayer.GetRegDWValue("DifficultyLevel");
  1960. if(m_iDifficultyLevel == NULL)
  1961. {
  1962. m_iDifficultyLevel = 20;
  1963. m_pMultiPlayer.SetRegDWValue("DifficultyLevel", (DWORD) m_iDifficultyLevel);
  1964. }
  1965. m_txDigital.Create();
  1966. }
  1967. void cRaceXApp::ExitApp()
  1968. {
  1969. m_surfCursor.Destroy();
  1970. m_surfHelmet.Destroy();
  1971. m_surfTitle.Destroy();
  1972. m_surfCaret.Destroy();
  1973. m_surfCarPannel.Destroy();
  1974. m_surfTophy.Destroy();
  1975. m_surfBigCars[0].Destroy();
  1976. m_surfBigCars[1].Destroy();
  1977. m_surfBigCars[2].Destroy();
  1978. m_surfBigCars[3].Destroy();
  1979. m_surfPanel.Destroy();
  1980. m_surfPositions.Destroy();
  1981. m_sptrCar.Destroy();
  1982. pRaceTrack.Destroy(TRUE);
  1983. m_Mouse.Destroy();
  1984. m_Keyboard.Destroy();
  1985. m_hcHit.Destroy();
  1986. m_txDigital.Destroy();
  1987. m_txDigitalSmall.Destroy();
  1988. m_txVerdana.Destroy();
  1989. STRVECTOR::iterator theIterator;
  1990.     for (theIterator = pTrackNames.begin(); theIterator != pTrackNames.end();
  1991.          theIterator++)
  1992.     {
  1993.         free((void*)*theIterator);
  1994.     }
  1995. m_sndType.Destroy();
  1996. m_sndChangeOption.Destroy();
  1997. m_sndSelect.Destroy();
  1998. m_pSoundInterface.Destroy();
  1999. m_pMultiPlayer.Destroy();
  2000. }
  2001. BOOL cRaceXApp::CheckInput(string* sValue, int iMax)
  2002. {
  2003. // This is used to get text input from the screen
  2004. static long lLastInput = 0;
  2005. static long lLastKey = DIK_RETURN;
  2006. if(GetTickCount() - lLastInput > 200 ||
  2007.    !m_Keyboard.CheckKey(lLastKey))
  2008. {
  2009. if(m_Keyboard.CheckKey(DIK_A))
  2010. {
  2011. *sValue += "A";
  2012. lLastKey = DIK_A;
  2013. lLastInput = GetTickCount();
  2014. m_sndType.Play();
  2015. return TRUE;
  2016. }
  2017. if(m_Keyboard.CheckKey(DIK_B))
  2018. {
  2019. *sValue += "B";
  2020. lLastKey = DIK_B;
  2021. lLastInput = GetTickCount();
  2022. m_sndType.Play();
  2023. return TRUE;
  2024. }
  2025. if(m_Keyboard.CheckKey(DIK_C))
  2026. {
  2027. *sValue += "C";
  2028. lLastKey = DIK_C;
  2029. lLastInput = GetTickCount();
  2030. m_sndType.Play();
  2031. return TRUE;
  2032. }
  2033. if(m_Keyboard.CheckKey(DIK_D))
  2034. {
  2035. *sValue += "D";
  2036. lLastKey = DIK_D;
  2037. lLastInput = GetTickCount();
  2038. m_sndType.Play();
  2039. return TRUE;
  2040. }
  2041. if(m_Keyboard.CheckKey(DIK_E))
  2042. {
  2043. *sValue += "E";
  2044. lLastKey = DIK_E;
  2045. lLastInput = GetTickCount();
  2046. m_sndType.Play();
  2047. return TRUE;
  2048. }
  2049. if(m_Keyboard.CheckKey(DIK_F))
  2050. {
  2051. *sValue += "F";
  2052. lLastKey = DIK_F;
  2053. lLastInput = GetTickCount();
  2054. m_sndType.Play();
  2055. return TRUE;
  2056. }
  2057. if(m_Keyboard.CheckKey(DIK_G))
  2058. {
  2059. *sValue += "G";
  2060. lLastKey = DIK_G;
  2061. lLastInput = GetTickCount();
  2062. m_sndType.Play();
  2063. return TRUE;
  2064. }
  2065. if(m_Keyboard.CheckKey(DIK_H))
  2066. {
  2067. *sValue += "H";
  2068. lLastKey = DIK_H;
  2069. lLastInput = GetTickCount();
  2070. m_sndType.Play();
  2071. return TRUE;
  2072. }
  2073. if(m_Keyboard.CheckKey(DIK_I))
  2074. {
  2075. *sValue += "I";
  2076. lLastKey = DIK_I;
  2077. lLastInput = GetTickCount();
  2078. m_sndType.Play();
  2079. return TRUE;
  2080. }
  2081. if(m_Keyboard.CheckKey(DIK_J))
  2082. {
  2083. *sValue += "J";
  2084. lLastKey = DIK_J;
  2085. lLastInput = GetTickCount();
  2086. m_sndType.Play();
  2087. return TRUE;
  2088. }
  2089. if(m_Keyboard.CheckKey(DIK_K))
  2090. {
  2091. *sValue += "K";
  2092. lLastKey = DIK_K;
  2093. lLastInput = GetTickCount();
  2094. m_sndType.Play();
  2095. return TRUE;
  2096. }
  2097. if(m_Keyboard.CheckKey(DIK_L))
  2098. {
  2099. *sValue += "L";
  2100. lLastKey = DIK_L;
  2101. lLastInput = GetTickCount();
  2102. m_sndType.Play();
  2103. return TRUE;
  2104. }
  2105. if(m_Keyboard.CheckKey(DIK_M))
  2106. {
  2107. *sValue += "M";
  2108. lLastKey = DIK_M;
  2109. lLastInput = GetTickCount();
  2110. m_sndType.Play();
  2111. return TRUE;
  2112. }
  2113. if(m_Keyboard.CheckKey(DIK_N))
  2114. {
  2115. *sValue += "N";
  2116. lLastKey = DIK_N;
  2117. lLastInput = GetTickCount();
  2118. m_sndType.Play();
  2119. return TRUE;
  2120. }
  2121. if(m_Keyboard.CheckKey(DIK_O))
  2122. {
  2123. *sValue += "O";
  2124. lLastKey = DIK_O;
  2125. lLastInput = GetTickCount();
  2126. m_sndType.Play();
  2127. return TRUE;
  2128. }
  2129. if(m_Keyboard.CheckKey(DIK_P))
  2130. {
  2131. *sValue += "P";
  2132. lLastKey = DIK_P;
  2133. lLastInput = GetTickCount();
  2134. m_sndType.Play();
  2135. return TRUE;
  2136. }
  2137. if(m_Keyboard.CheckKey(DIK_Q))
  2138. {
  2139. *sValue += "Q";
  2140. lLastKey = DIK_Q;
  2141. lLastInput = GetTickCount();
  2142. m_sndType.Play();
  2143. return TRUE;
  2144. }
  2145. if(m_Keyboard.CheckKey(DIK_R))
  2146. {
  2147. *sValue += "R";
  2148. lLastKey = DIK_R;
  2149. lLastInput = GetTickCount();
  2150. m_sndType.Play();
  2151. return TRUE;
  2152. }
  2153. if(m_Keyboard.CheckKey(DIK_S))
  2154. {
  2155. *sValue += "S";
  2156. lLastKey = DIK_S;
  2157. lLastInput = GetTickCount();
  2158. m_sndType.Play();
  2159. return TRUE;
  2160. }
  2161. if(m_Keyboard.CheckKey(DIK_T))
  2162. {
  2163. *sValue += "T";
  2164. lLastKey = DIK_T;
  2165. lLastInput = GetTickCount();
  2166. m_sndType.Play();
  2167. return TRUE;
  2168. }
  2169. if(m_Keyboard.CheckKey(DIK_U))
  2170. {
  2171. *sValue += "U";
  2172. lLastKey = DIK_U;
  2173. lLastInput = GetTickCount();
  2174. m_sndType.Play();
  2175. return TRUE;
  2176. }
  2177. if(m_Keyboard.CheckKey(DIK_V))
  2178. {
  2179. *sValue += "V";
  2180. lLastKey = DIK_V;
  2181. lLastInput = GetTickCount();
  2182. m_sndType.Play();
  2183. return TRUE;
  2184. }
  2185. if(m_Keyboard.CheckKey(DIK_X))
  2186. {
  2187. *sValue += "X";
  2188. lLastKey = DIK_X;
  2189. lLastInput = GetTickCount();
  2190. m_sndType.Play();
  2191. return TRUE;
  2192. }
  2193. if(m_Keyboard.CheckKey(DIK_Y))
  2194. {
  2195. *sValue += "Y";
  2196. lLastKey = DIK_Y;
  2197. lLastInput = GetTickCount();
  2198. m_sndType.Play();
  2199. return TRUE;
  2200. }
  2201. if(m_Keyboard.CheckKey(DIK_W))
  2202. {
  2203. *sValue += "W";
  2204. lLastKey = DIK_W;
  2205. lLastInput = GetTickCount();
  2206. m_sndType.Play();
  2207. return TRUE;
  2208. }
  2209. if(m_Keyboard.CheckKey(DIK_Z))
  2210. {
  2211. *sValue += "Z";
  2212. lLastKey = DIK_Z;
  2213. lLastInput = GetTickCount();
  2214. m_sndType.Play();
  2215. return TRUE;
  2216. }
  2217. if(m_Keyboard.CheckKey(DIK_SPACE))
  2218. {
  2219. *sValue += " ";
  2220. lLastKey = DIK_SPACE;
  2221. lLastInput = GetTickCount();
  2222. m_sndType.Play();
  2223. return TRUE;
  2224. }
  2225. if(m_Keyboard.CheckKey(DIK_BACK))
  2226. {
  2227. if(sValue->length() > 0)
  2228. {
  2229. sValue->resize(sValue->size()-1);
  2230. lLastKey = DIK_BACK;
  2231. lLastInput = GetTickCount();
  2232. m_sndType.Play();
  2233. return TRUE;
  2234. }
  2235. }
  2236. }
  2237. return FALSE;
  2238. }
  2239. cMultiplayer* cRaceXApp::GetMultiplayer()
  2240. {
  2241. return &m_pMultiPlayer;
  2242. }
  2243. int cRaceXApp::GetDifficultyLevel()
  2244. {
  2245. return m_iDifficultyLevel;
  2246. }