Winmain.cpp
上传用户:jiameide
上传日期:2010-03-01
资源大小:525k
文件大小:76k
源码类别:

射击游戏

开发平台:

Visual C++

  1. //*******************************************************
  2. //* INVASION - By Maur韈io Teichmann RItter 1998        *
  3. //* Please, respect the copyright                       *
  4. //*******************************************************
  5. #include <windows.h>
  6. #include <windowsx.h>
  7. #include <stdio.h>
  8. #include <math.h>
  9. #include <ddraw.h>
  10. #include "ddutil.h"
  11. #include "dsutil.hpp"
  12. #include "ufo.hpp"
  13. #include "resource.h"
  14. // Define Weapon kinds
  15. #define WP_1_LASER      0
  16. #define WP_2_LASER      1
  17. #define WP_3_LASER      2
  18. #define WP_1_PHOTON     3
  19. #define WP_2_PHOTON     4
  20. #define WP_3_PHOTON     5
  21. // Define Ship States
  22. #define SHIP_OK         0
  23. #define SHIP_EXPLODING  1
  24. #define SHIP_DESTROYED  3
  25. // Define the application states
  26. #define APP_MAINMENU     0
  27. #define APP_GAMESCREEN   1
  28. #define APP_CREDITS      2
  29. #define APP_HELPSCREEN   3
  30. int  iAppState = APP_MAINMENU;
  31. LPDIRECTDRAW7            lpDD;
  32. LPDIRECTDRAWSURFACE7     lpFrontBuffer;
  33. LPDIRECTDRAWSURFACE7     lpBackBuffer;
  34. LPDIRECTDRAWSURFACE7     lpUfo;
  35. LPDIRECTDRAWSURFACE7     lpBkGround;
  36. LPDIRECTDRAWSURFACE7     lpShip;
  37. LPDIRECTDRAWSURFACE7     lpShoot;
  38. LPDIRECTDRAWSURFACE7     lpShoot2;
  39. LPDIRECTDRAWSURFACE7     lpUfoShoot;
  40. LPDIRECTDRAWSURFACE7     lpBoom;
  41. LPDIRECTDRAWSURFACE7     lpShipBoom;
  42. LPDIRECTDRAWSURFACE7     lpAlpha;
  43. LPDIRECTDRAWSURFACE7     lpSelect;
  44. LPDIRECTDRAWSURFACE7     lpStatusBar;
  45. LPDIRECTDRAWSURFACE7     lpExtra;
  46. LPDIRECTDRAWPALETTE     lpArtPalette;
  47. //** INITIAL POINTERS
  48. Ovni*  pUFO    = NULL;
  49. Bullet*  pBullet = NULL;
  50. Extra*  pExtra  = NULL;
  51. unsigned int score;
  52. unsigned int Lastscore;
  53. DWORD dwShipExplode;
  54. int iOption;
  55. LPDIRECTSOUND           lpDS;
  56. HSNDOBJ                 hsoEnter          = NULL;
  57. HSNDOBJ                 hsoShoot          = NULL;
  58. HSNDOBJ                 hsoStop           = NULL;
  59. HSNDOBJ                 hsoBoom           = NULL;
  60. HSNDOBJ                 hsoUfoShoot       = NULL;
  61. HSNDOBJ                 hsoSelect         = NULL;
  62. HSNDOBJ                 hsoGetExtra       = NULL;
  63. HSNDOBJ                 hsoGameOver       = NULL;
  64. BOOL                    bSoundEnabled = FALSE;
  65. BOOL bShipStop = FALSE;
  66. BOOL bShootEnable = TRUE;
  67. BOOL bShoot = FALSE;
  68. BOOL iRepaint = -1;
  69. HWND                    hWndMain;
  70. HINSTANCE               hInst;
  71. BOOL                    bIsActive;
  72. DWORD                   dwTransType;
  73. DWORD                   lastTickCount = 0;
  74. DWORD                   dwFillColor;
  75. //** SHIP VARIABLES
  76. int iShipMov;
  77. int iShipState = 0;
  78. int            iShipPos = 285;
  79. int iWeapon = 0;
  80. int iLastWeapon = -1;
  81. int iPhotonAmmo = 0;
  82. int iLaserAmmo  = 100;
  83. int iLastAmmo = -1;
  84. int iMaxWeapon = 0;
  85. int iShield = 0;
  86. int iLastShield = -1;
  87. //** LEVEL VARIABLES
  88. int        iLevel;
  89. int SHOOTCHANCE  = 1000;
  90. // Defini玢o das fun珲es
  91. int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow );
  92. BOOL RestoreSurfaces( void );
  93. void DestroyGame(void);
  94. BOOL RestoreSurfaces( void );
  95. void bltText(char*  buffer, int  x, int y);
  96. void ShowGameOver();
  97. void DrawBackGround(LPDIRECTDRAWSURFACE7 lpDest, int x, int y, int wx, int wy);
  98. BOOL LoadUfoSurface(int iFlags);
  99. BOOL CleanupAndExit( char *err);
  100. void InitLevel(BOOL bStart)
  101. {
  102. Ovni* pFirst;
  103. Bullet* auxpBullet;
  104. Extra* pAuxExtra;
  105. int i = 0;
  106. int valInc = 1;
  107. int rem;
  108. int iLastExtra = 0;
  109. DWORD tick;
  110. HRESULT hRet;
  111. DDBLTFX     ddbltfx;
  112. char buffer[10];
  113. while(pExtra !=NULL)
  114. {
  115. pAuxExtra = pExtra->GetNext();
  116. delete(pExtra);
  117. pExtra = pAuxExtra;
  118. }
  119. while(pBullet !=NULL)
  120. {
  121. auxpBullet = pBullet->GetNext();
  122. delete(pBullet);
  123. pBullet = auxpBullet;
  124. }
  125. iLevel++;
  126. if (LoadUfoSurface(iLevel) != TRUE)
  127. CleanupAndExit("General Failed loading Ufo... Restart Game !");
  128. switch(iLevel % 6)
  129. {
  130. case 0:
  131. int i;
  132. i = iLevel / 6;
  133. pUFO    = new Ovni;
  134. pFirst = pUFO;
  135. pUFO->SetXY(20,20);
  136. iLastExtra = pUFO->CreateExtra(0);
  137. pUFO->SetInc(i);
  138. pUFO->SetMov(0);
  139. pUFO->iType = 2;
  140. pUFO->SetStr((int)(iLevel /7)+1);
  141. pUFO->SetNext(NULL);
  142. pUFO->SetNext(new Ovni);
  143. pUFO = pUFO->GetNext();
  144. pUFO->SetXY(110,90);
  145. iLastExtra = pUFO->CreateExtra(iLastExtra);
  146. pUFO->SetInc(i);
  147. pUFO->SetMov(0);
  148. pUFO->iType = 2;
  149. pUFO->SetStr((int)(iLevel /7)+1);
  150. pUFO->SetNext(NULL);
  151. pUFO->SetNext(new Ovni);
  152. pUFO = pUFO->GetNext();
  153. pUFO->SetXY(20,160);
  154. iLastExtra = pUFO->CreateExtra(iLastExtra);
  155. pUFO->SetInc(i);
  156. pUFO->SetMov(0);
  157. pUFO->iType = 2;
  158. pUFO->SetStr((int)(iLevel /7)+1);
  159. pUFO->SetNext(NULL);
  160. pUFO->SetNext(new Ovni);
  161. pUFO = pUFO->GetNext();
  162. pUFO->SetXY(540,20);
  163. iLastExtra = pUFO->CreateExtra(iLastExtra);
  164. pUFO->SetInc(i);
  165. pUFO->SetMov(1);
  166. pUFO->iType = 2;
  167. pUFO->SetStr((int)(iLevel /7)+1);
  168. pUFO->SetNext(NULL);
  169. pUFO->SetNext(new Ovni);
  170. pUFO = pUFO->GetNext();
  171. pUFO->SetXY(470,90);
  172. iLastExtra = pUFO->CreateExtra(iLastExtra);
  173. pUFO->SetInc(i);
  174. pUFO->SetMov(1);
  175. pUFO->iType = 2;
  176. pUFO->SetStr((int)(iLevel /7)+1);
  177. pUFO->SetNext(NULL);
  178. pUFO->SetNext(new Ovni);
  179. pUFO = pUFO->GetNext();
  180. pUFO->SetXY(540,160);
  181. iLastExtra = pUFO->CreateExtra(iLastExtra);
  182. pUFO->SetInc(i);
  183. pUFO->SetMov(1);
  184. pUFO->iType = 2;
  185. pUFO->SetStr((int)(iLevel /7)+1);
  186. pUFO->SetNext(NULL);
  187. break;
  188. case 1:
  189. for (i=0; i<3; i++)
  190. {
  191. if (i==0)
  192. {
  193. pUFO    = new Ovni;
  194. pFirst = pUFO;
  195. }
  196. else
  197. {
  198. pUFO->SetNext(new Ovni);
  199. pUFO = pUFO->GetNext();
  200. }
  201. pUFO->SetXY(15 + (i*30),(i * 65)+10);
  202. iLastExtra = pUFO->CreateExtra(iLastExtra);
  203. pUFO->SetInc(1);
  204. pUFO->SetMov(0);
  205. pUFO->SetNext(NULL);
  206. pUFO->SetQtdeDown(1);
  207. pUFO->SetStr((int)(iLevel /7)+1);
  208. }
  209. pUFO->SetNext(new Ovni);
  210. pUFO = pUFO->GetNext();
  211. pUFO->SetXY(45,195);
  212. iLastExtra = pUFO->CreateExtra(iLastExtra);
  213. pUFO->SetInc(1);
  214. pUFO->SetMov(0);
  215. pUFO->SetNext(NULL);
  216. pUFO->SetQtdeDown(1);
  217. pUFO->SetStr((int)(iLevel /7)+1);
  218. pUFO->SetNext(new Ovni);
  219. pUFO = pUFO->GetNext();
  220. pUFO->SetXY(15,260);
  221. iLastExtra = pUFO->CreateExtra(iLastExtra);
  222. pUFO->SetInc(1);
  223. pUFO->SetMov(0);
  224. pUFO->SetNext(NULL);
  225. pUFO->SetQtdeDown(1);
  226. pUFO->SetStr((int)(iLevel /7)+1);
  227. for (i=0; i<3; i++)
  228. {
  229. pUFO->SetNext(new Ovni);
  230. pUFO = pUFO->GetNext();
  231. pUFO->SetXY(560 - (i*30),(i * 65)+10);
  232. iLastExtra = pUFO->CreateExtra(iLastExtra);
  233. pUFO->SetInc(-1);
  234. pUFO->SetMov(0);
  235. pUFO->SetNext(NULL);
  236. pUFO->SetQtdeDown(1);
  237. pUFO->SetStr((int)(iLevel /7)+1);
  238. }
  239. pUFO->SetNext(new Ovni);
  240. pUFO = pUFO->GetNext();
  241. pUFO->SetXY(530,195);
  242. iLastExtra = pUFO->CreateExtra(iLastExtra);
  243. pUFO->SetInc(-1);
  244. pUFO->SetMov(0);
  245. pUFO->SetNext(NULL);
  246. pUFO->SetQtdeDown(1);
  247. pUFO->SetStr((int)(iLevel /7)+1);
  248. pUFO->SetNext(new Ovni);
  249. pUFO = pUFO->GetNext();
  250. pUFO->SetXY(560,260);
  251. iLastExtra = pUFO->CreateExtra(iLastExtra);
  252. pUFO->SetInc(-1);
  253. pUFO->SetMov(0);
  254. pUFO->SetNext(NULL);
  255. pUFO->SetQtdeDown(1);
  256. pUFO->SetStr((int)(iLevel /7)+1);
  257. break;
  258. case 2:
  259. for (i=0; i<5; i++)
  260. {
  261. if (i==0)
  262. {
  263. pUFO    = new Ovni;
  264. pFirst = pUFO;
  265. }
  266. else
  267. {
  268. pUFO->SetNext(new Ovni);
  269. pUFO = pUFO->GetNext();
  270. }
  271. pUFO->SetXY(15 + (i*30),(i * 65)+10);
  272. iLastExtra = pUFO->CreateExtra(iLastExtra);
  273. pUFO->SetInc(1);
  274. pUFO->SetMov(0);
  275. pUFO->SetNext(NULL);
  276. pUFO->SetQtdeDown(1);
  277. pUFO->SetStr((int)(iLevel /7)+1);
  278. }
  279. for (i=0; i<5; i++)
  280. {
  281. pUFO->SetNext(new Ovni);
  282. pUFO = pUFO->GetNext();
  283. pUFO->SetXY(560 - (i*30),(i * 65)+10);
  284. iLastExtra = pUFO->CreateExtra(iLastExtra);
  285. pUFO->SetInc(-1);
  286. pUFO->SetMov(0);
  287. pUFO->SetNext(NULL);
  288. pUFO->SetQtdeDown(1);
  289. pUFO->SetStr((int)(iLevel /7)+1);
  290. }
  291. break;
  292. case 4:
  293. pUFO    = new Ovni;
  294. pFirst = pUFO;
  295. pUFO->SetXY(20,20);
  296. iLastExtra = pUFO->CreateExtra(iLastExtra);
  297. pUFO->SetInc(2);
  298. pUFO->SetMov(2);
  299. pUFO->iType = 1;
  300. pUFO->SetStr((int)(iLevel /7)+1);
  301. pUFO->SetNext(NULL);
  302. pUFO->SetNext(new Ovni);
  303. pUFO = pUFO->GetNext();
  304. pUFO->SetXY(180,180);
  305. iLastExtra = pUFO->CreateExtra(iLastExtra);
  306. pUFO->SetInc(2);
  307. pUFO->SetMov(2);
  308. pUFO->iType = 1;
  309. pUFO->SetStr((int)(iLevel /7)+1);
  310. pUFO->SetNext(NULL);
  311. pUFO->SetNext(new Ovni);
  312. pUFO = pUFO->GetNext();
  313. pUFO->SetXY(530,110);
  314. iLastExtra = pUFO->CreateExtra(iLastExtra);
  315. pUFO->SetInc(2);
  316. pUFO->SetMov(3);
  317. pUFO->iType = 1;
  318. pUFO->SetStr((int)(iLevel /7)+1);
  319. pUFO->SetNext(NULL);
  320. pUFO->SetNext(new Ovni);
  321. pUFO = pUFO->GetNext();
  322. pUFO->SetXY(100,100);
  323. iLastExtra = pUFO->CreateExtra(iLastExtra);
  324. pUFO->SetInc(2);
  325. pUFO->SetMov(1);
  326. pUFO->iType = 1;
  327. pUFO->SetStr((int)(iLevel /7)+1);
  328. pUFO->SetNext(NULL);
  329. pUFO->SetNext(new Ovni);
  330. pUFO = pUFO->GetNext();
  331. pUFO->SetXY(450,190);
  332. iLastExtra = pUFO->CreateExtra(iLastExtra);
  333. pUFO->SetInc(2);
  334. pUFO->SetMov(0);
  335. pUFO->iType = 1;
  336. pUFO->SetStr((int)(iLevel /7)+1);
  337. pUFO->SetNext(NULL);
  338. break;
  339. case 5:
  340. pUFO    = new Ovni;
  341. pFirst = pUFO;
  342. pUFO->SetXY(20,20);
  343. iLastExtra = pUFO->CreateExtra(iLastExtra);
  344. pUFO->SetInc(3);
  345. pUFO->SetMov(2);
  346. pUFO->iType = 1;
  347. pUFO->SetStr((int)(iLevel /7)+1);
  348. pUFO->SetNext(NULL);
  349. pUFO->SetNext(new Ovni);
  350. pUFO = pUFO->GetNext();
  351. pUFO->SetXY(90,90);
  352. iLastExtra = pUFO->CreateExtra(iLastExtra);
  353. pUFO->SetInc(3);
  354. pUFO->SetMov(2);
  355. pUFO->iType = 1;
  356. pUFO->SetStr((int)(iLevel /7)+1);
  357. pUFO->SetNext(NULL);
  358. pUFO->SetNext(new Ovni);
  359. pUFO = pUFO->GetNext();
  360. pUFO->SetXY(20,160);
  361. iLastExtra = pUFO->CreateExtra(iLastExtra);
  362. pUFO->SetInc(3);
  363. pUFO->SetMov(3);
  364. pUFO->iType = 1;
  365. pUFO->SetStr((int)(iLevel /7)+1);
  366. pUFO->SetNext(NULL);
  367. pUFO->SetNext(new Ovni);
  368. pUFO = pUFO->GetNext();
  369. pUFO->SetXY(540,20);
  370. iLastExtra = pUFO->CreateExtra(iLastExtra);
  371. pUFO->SetInc(3);
  372. pUFO->SetMov(3);
  373. pUFO->iType = 1;
  374. pUFO->SetStr((int)(iLevel /7)+1);
  375. pUFO->SetNext(NULL);
  376. pUFO->SetNext(new Ovni);
  377. pUFO = pUFO->GetNext();
  378. pUFO->SetXY(470,90);
  379. iLastExtra = pUFO->CreateExtra(iLastExtra);
  380. pUFO->SetInc(3);
  381. pUFO->SetMov(3);
  382. pUFO->iType = 1;
  383. pUFO->SetStr((int)(iLevel /7)+1);
  384. pUFO->SetNext(NULL);
  385. pUFO->SetNext(new Ovni);
  386. pUFO = pUFO->GetNext();
  387. pUFO->SetXY(540,160);
  388. iLastExtra = pUFO->CreateExtra(iLastExtra);
  389. pUFO->SetInc(3);
  390. pUFO->SetMov(2);
  391. pUFO->iType = 1;
  392. pUFO->SetStr((int)(iLevel /7)+1);
  393. pUFO->SetNext(NULL);
  394. break;
  395. case 3:
  396. for (int j=0;j<3;j++)
  397. {
  398. for (i=0;i<8;i++)
  399. {
  400. if (j==0 && i==0)
  401. {
  402. pUFO    = new Ovni;
  403. pFirst = pUFO;
  404. }
  405. else
  406. {
  407. pUFO->SetNext(new Ovni);
  408. pUFO = pUFO->GetNext();
  409. }
  410. pUFO->SetXY((i * 77)+15,j*80);
  411. iLastExtra = pUFO->CreateExtra(iLastExtra);
  412. pUFO->SetInc(valInc);
  413. pUFO->SetMov(0);
  414. pUFO->SetStr((int)(iLevel /7)+1);
  415. pUFO->SetNext(NULL);
  416. }
  417. //pUFO->SetMov(1);
  418. //pUFO->SetInc (abs(pUFO->GetInc()) * -1);
  419. valInc = valInc * -1;
  420. }
  421. break;
  422. }
  423. pUFO = pFirst;
  424.     ddbltfx.dwSize = sizeof( ddbltfx );
  425.     ddbltfx.dwFillColor = dwFillColor;
  426. while (1)
  427. {
  428. hRet = lpFrontBuffer->Blt(NULL, NULL, NULL, DDBLT_COLORFILL, &ddbltfx);
  429. if (hRet == DD_OK)
  430. {
  431. break;
  432. }
  433. if (hRet == DDERR_SURFACELOST)
  434. {
  435. hRet = RestoreSurfaces();
  436. if (hRet != DD_OK)
  437. break;
  438. }
  439. if (hRet != DDERR_WASSTILLDRAWING)
  440. break;
  441. }
  442. strcpy(buffer,"LEVEL");
  443. buffer[5] = ' ';
  444.     buffer[6] = iLevel/100 + '0';
  445.     rem = iLevel % 100;
  446.     buffer[7] = rem/10 + '0';
  447.     rem = iLevel % 10;
  448.     buffer[8] = rem + '0';
  449. buffer[9] = '';
  450. bltText(buffer,250,200);
  451. tick = GetTickCount();
  452. while(GetTickCount() - tick < 3000);
  453. iShipState = 0;
  454. iShipMov = 0;
  455. iShipPos = 285;
  456. iLastWeapon = -1;
  457. iLastAmmo = -1;
  458. iLastShield = -1;
  459. Lastscore = -1;
  460. SHOOTCHANCE = 180 - (40 * (int)(iLevel /7));
  461. if (SHOOTCHANCE < 50)
  462. SHOOTCHANCE = 50;
  463. }
  464. void ShowGameOver()
  465. {
  466. DWORD tick;
  467. HRESULT hRet;
  468. DDBLTFX     ddbltfx;
  469. char buffer[10];
  470.     ddbltfx.dwSize = sizeof( ddbltfx );
  471.     ddbltfx.dwFillColor = dwFillColor;
  472. while (1)
  473. {
  474. hRet = lpFrontBuffer->Blt(NULL, NULL, NULL, DDBLT_COLORFILL, &ddbltfx);
  475. if (hRet == DD_OK)
  476. {
  477. break;
  478. }
  479. if (hRet == DDERR_SURFACELOST)
  480. {
  481. hRet = RestoreSurfaces();
  482. if (hRet != DD_OK)
  483. break;
  484. }
  485. if (hRet != DDERR_WASSTILLDRAWING)
  486. break;
  487. }
  488. strcpy(buffer,"GAME OVER");
  489. buffer[9] = '';
  490. bltText(buffer,250,200);
  491. tick = GetTickCount();
  492. SndObjPlay(hsoGameOver, NULL);
  493. while(GetTickCount() - tick < 3500);
  494. }
  495. void ShowCredits()
  496. {
  497. DWORD tick;
  498. HRESULT hRet;
  499. DDBLTFX     ddbltfx;
  500. char buffer[24];
  501.     ddbltfx.dwSize = sizeof( ddbltfx );
  502.     ddbltfx.dwFillColor = dwFillColor;
  503. while (1)
  504. {
  505. hRet = lpFrontBuffer->Blt(NULL, NULL, NULL, DDBLT_COLORFILL, &ddbltfx);
  506. if (hRet == DD_OK)
  507. {
  508. break;
  509. }
  510. if (hRet == DDERR_SURFACELOST)
  511. {
  512. hRet = RestoreSurfaces();
  513. if (hRet != DD_OK)
  514. break;
  515. }
  516. if (hRet != DDERR_WASSTILLDRAWING)
  517. break;
  518. }
  519. strcpy(buffer,"THIS GAME IS FREEWARE");
  520. bltText(buffer,145,60);
  521. strcpy(buffer,"IF YOU WANT TO MAIL ME");
  522. bltText(buffer,130,130);
  523. strcpy(buffer,"OR YOU ARE FROM A GAME");
  524. bltText(buffer,120,200);
  525. strcpy(buffer,"COMPANY AND WANT TO");
  526. bltText(buffer,140,270);
  527. strcpy(buffer,"HIRE ME, MY MAIL IS");
  528. bltText(buffer,150,340);
  529. strcpy(buffer,"MAURICIORITTER@HOTMAIL.COM");
  530. bltText(buffer,120,410);
  531. tick = GetTickCount();
  532. // SndObjPlay(hsoGameOver, NULL);
  533. while(GetTickCount() - tick < 6000);
  534. }
  535. void InitializeSound( void )
  536. {
  537.     bSoundEnabled = FALSE;
  538.     if (SUCCEEDED(DirectSoundCreate(NULL, &lpDS, NULL)))
  539.     {
  540. if (SUCCEEDED(lpDS->SetCooperativeLevel(hWndMain,
  541.             DSSCL_NORMAL)))
  542.         {
  543. hsoStop     = SndObjCreate(lpDS, "Stop", 1);
  544. hsoShoot    = SndObjCreate(lpDS, "Shoot",1);
  545. hsoBoom     = SndObjCreate(lpDS, "Boom", 8);
  546. hsoUfoShoot = SndObjCreate(lpDS, "UfoShoot", 8);
  547. hsoEnter    = SndObjCreate(lpDS, "Enter", 1);
  548. hsoSelect   = SndObjCreate(lpDS, "Select", 1);
  549. hsoGetExtra = SndObjCreate(lpDS, "GetExtra", 1);
  550. hsoGameOver = SndObjCreate(lpDS, "GameOver", 1);
  551.             bSoundEnabled = TRUE;
  552.         }
  553.         else
  554.         {
  555.             lpDS->Release();
  556.             lpDS = NULL;
  557.         }
  558.     }
  559. }
  560. void DestroySound( void )
  561. {
  562. // if(!bWantSound)
  563. // return; //No work to be done
  564.     bSoundEnabled = FALSE;
  565.     if (lpDS != NULL)
  566.     {
  567.         SndObjDestroy(hsoEnter);
  568.         hsoEnter = NULL;
  569.         SndObjDestroy(hsoStop);
  570.         hsoStop = NULL;
  571.         SndObjDestroy(hsoShoot);
  572.         hsoShoot = NULL;
  573.         SndObjDestroy(hsoUfoShoot);
  574.         hsoUfoShoot = NULL;
  575.         SndObjDestroy(hsoBoom);
  576.         hsoBoom = NULL;
  577.         SndObjDestroy(hsoSelect);
  578.         hsoSelect = NULL;
  579.         SndObjDestroy(hsoGetExtra);
  580.         hsoGetExtra = NULL;
  581.         SndObjDestroy(hsoGameOver);
  582.         hsoGameOver = NULL;
  583.         lpDS->Release();
  584.         lpDS = NULL;
  585.     }
  586. }
  587. long FAR PASCAL MainWndproc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
  588. {
  589. Bullet* pNewBullet, *pFirstBullet;
  590.     switch( message )
  591.     {
  592.     case WM_TIMER:
  593. switch(wParam)
  594. {
  595. case 1:
  596. bShootEnable = TRUE;
  597. KillTimer(hWnd,1);
  598. break;
  599. }
  600. break;
  601. case WM_ACTIVATEAPP:
  602. iAppState = APP_MAINMENU;
  603.         bIsActive = (BOOL) wParam;
  604. break;
  605.     case WM_KEYDOWN:
  606. // If We are at the help screen an hit any key, go back to MainMenu
  607. if (iAppState == APP_HELPSCREEN)
  608. {
  609. lastTickCount = 0;
  610. iAppState = APP_MAINMENU;
  611. return 0L;
  612. }
  613. switch (wParam)
  614.         {
  615. case VK_RETURN:
  616. if (iAppState == APP_MAINMENU)
  617. {
  618. // if the user hit <enter> at the menu
  619. // change the app setting depending on the user selection
  620. switch(iOption)
  621. {
  622. case 0:
  623. lastTickCount = 0;
  624. SndObjPlay(hsoEnter, FALSE);
  625. // Set the app state to start the game
  626. iAppState = APP_GAMESCREEN;
  627. lastTickCount = 0;
  628. // Reset the score counter, level, ship state and ammo
  629. score = 0;
  630. iLevel = 0;
  631. iShipState = 0;
  632. iWeapon = 0;
  633. iLaserAmmo = 100;
  634. iPhotonAmmo = 0;
  635. iShield = 50;
  636. iMaxWeapon = 0;
  637. Lastscore = 99;
  638. // Initialize Level
  639. InitLevel(TRUE);
  640. break;
  641. case 1:
  642. // User selected the second option, credits
  643. iAppState = APP_CREDITS;
  644. break;
  645. case 2:
  646. // User selected the help screen
  647. iAppState = APP_HELPSCREEN;
  648. lastTickCount = 0;
  649. break;
  650. case 3:
  651. // User want磗 to quit
  652. // Cleanup up everything
  653. DestroyGame();
  654. PostQuitMessage(0);
  655. break;
  656. }
  657. }
  658. else
  659. {
  660. // If we are at the game screen, enter can be used to stop the
  661. // ship
  662. // If the ship is not ok, doen磘 need to stop it, 
  663. if (iShipState != SHIP_OK)
  664. break;
  665. // If the ship is already stopped, get out
  666. if (iShipMov == 0)
  667. break;
  668. // Stop the ship
  669. bShipStop = TRUE;
  670. iShipMov = 0;
  671. }
  672. break;
  673. case VK_CONTROL:
  674. // Control key is used to change the weapon
  675. // If not in game screen, get out
  676. if (iAppState != APP_GAMESCREEN)
  677. break;
  678. // Increment weapon type
  679. iWeapon++;
  680. // If we reached the Maximum weapon avaible for the ship
  681. // reset to the first weapon
  682. if (iWeapon > iMaxWeapon)
  683. iWeapon = 0;
  684. break;
  685. case VK_LEFT:
  686. // If not in game screen, get out
  687. if (iAppState != APP_GAMESCREEN)
  688. break;
  689. // If the ship is not ok, can磘 be moved
  690. if (iShipState != SHIP_OK)
  691. break;
  692. // Set the movement rate to -4 pixel
  693. iShipMov = -4;
  694. break;
  695. case VK_UP:
  696. // Up key is just used in the main menu screen
  697. // If not in main menu, get out
  698. if (iAppState != APP_MAINMENU)
  699. break;
  700. // User hit up key, raise up 1 menu option
  701. iOption--;
  702. // Play the select option sound
  703. SndObjStop(hsoSelect);
  704. SndObjPlay(hsoSelect,NULL);
  705. // If we reach the first option, go the last one
  706. if (iOption < 0)
  707. iOption = 3;
  708. break;
  709. case VK_RIGHT:
  710. // Right key is just used during the game
  711. // If we aren磘 in the game screen, get out
  712. if (iAppState != APP_GAMESCREEN)
  713. break;
  714. // If the ship is not ok, can磘 be moved
  715. if (iShipState != SHIP_OK)
  716. break;
  717. // Set the movement rate to +4 pixels
  718. iShipMov = 4;
  719. break;
  720. case VK_DOWN:
  721. // Down key can be used in the main screen or at the
  722. // the game screen to stp the ship
  723. switch (iAppState)
  724. {
  725. case APP_MAINMENU:
  726. // Select the down key at main menu
  727. // increment option counter
  728. iOption++;
  729. SndObjStop(hsoSelect);
  730. SndObjPlay(hsoSelect,NULL);
  731. if (iOption > 3)
  732. iOption = 0;
  733. break;
  734. case APP_GAMESCREEN:
  735. // Select down key at the game screen, stop the
  736. // ship if it磗 ok and not destroyed
  737. // If the ship is not ok, doen磘 need to stop it, 
  738. if (iShipState != SHIP_OK)
  739. break;
  740. // If the ship is already stopped, get out
  741. if (iShipMov == 0)
  742. break;
  743. bShipStop = TRUE;
  744. iShipMov = 0;
  745. break;
  746. }
  747. break;
  748. case VK_SPACE:
  749. // SPACE BAR is used to shoot during the game screen
  750. // Not at the game screen
  751. if (iAppState != APP_GAMESCREEN)
  752. break;
  753. // If ship is not ok, get out
  754. if (iShipState != SHIP_OK)
  755. break;
  756. // Check if we can shoot or we are waiting for our weapon
  757. // recharge
  758. if (bShootEnable == FALSE)
  759. break;
  760. // Start shooting flag
  761. bShoot = TRUE;
  762. // Check the weapon we are using
  763. switch (iWeapon)
  764. {
  765. case WP_1_LASER:
  766. // using single laser
  767. // if we are out of ammo, get energy from the shields
  768. if (iLaserAmmo == 0)
  769. iShield -= 1;
  770. else
  771. iLaserAmmo--;
  772. // Create a new bullet object and add it to bullet list
  773. pNewBullet = new Bullet;
  774. if (pBullet == NULL)
  775. {
  776. pBullet = pNewBullet;
  777. pNewBullet->SetXY(iShipPos+24, 380);
  778. pBullet->SetType(2);
  779. }
  780. else
  781. {
  782. pFirstBullet = pBullet;
  783. while (pBullet->GetNext() != NULL)
  784. pBullet = pBullet->GetNext();
  785. pBullet->SetNext(pNewBullet);
  786. pNewBullet->SetPrev(pBullet);
  787. pNewBullet->SetXY(iShipPos+24, 380);
  788. pNewBullet->SetType(2);
  789. pBullet = pFirstBullet;
  790. }
  791. break;
  792. case WP_2_LASER:
  793. // If we are out of ammo, not shoot
  794. if (iLaserAmmo < 2)
  795. return 0L;
  796. iLaserAmmo-=2;
  797. // Create a new bullet object and add it to bullet list
  798. pNewBullet = new Bullet;
  799. if (pBullet == NULL)
  800. {
  801. pBullet = pNewBullet;
  802. pNewBullet->SetXY(iShipPos+11, 380);
  803. pNewBullet->SetType(2);
  804. pFirstBullet = pBullet;
  805. }
  806. else
  807. {
  808. pFirstBullet = pBullet;
  809. while (pBullet->GetNext() != NULL)
  810. pBullet = pBullet->GetNext();
  811. pBullet->SetNext(pNewBullet);
  812. pNewBullet->SetPrev(pBullet);
  813. pNewBullet->SetXY(iShipPos+11, 385);
  814. pNewBullet->SetType(2);
  815. pBullet = pFirstBullet;
  816. }
  817. pNewBullet = new Bullet;
  818. pFirstBullet = pBullet;
  819. while (pBullet->GetNext() != NULL)
  820. pBullet = pBullet->GetNext();
  821. pBullet->SetNext(pNewBullet);
  822. pNewBullet->SetPrev(pBullet);
  823. pNewBullet->SetXY(iShipPos+34, 385);
  824. pNewBullet->SetType(2);
  825. pBullet = pFirstBullet;
  826. break;
  827. case WP_3_LASER:
  828. // If we are out of ammo, not shoot
  829. if (iLaserAmmo < 3)
  830. return 0L;
  831. iLaserAmmo-=3;
  832. pNewBullet = new Bullet;
  833. if (pBullet == NULL)
  834. {
  835. pBullet = pNewBullet;
  836. pNewBullet->SetXY(iShipPos+11, 380);
  837. pNewBullet->SetType(2);
  838. pFirstBullet = pBullet;
  839. }
  840. else
  841. {
  842. pFirstBullet = pBullet;
  843. while (pBullet->GetNext() != NULL)
  844. pBullet = pBullet->GetNext();
  845. pBullet->SetNext(pNewBullet);
  846. pNewBullet->SetPrev(pBullet);
  847. pNewBullet->SetXY(iShipPos+11, 385);
  848. pNewBullet->SetType(2);
  849. pBullet = pFirstBullet;
  850. }
  851. pNewBullet = new Bullet;
  852. pFirstBullet = pBullet;
  853. while (pBullet->GetNext() != NULL)
  854. pBullet = pBullet->GetNext();
  855. pBullet->SetNext(pNewBullet);
  856. pNewBullet->SetPrev(pBullet);
  857. pNewBullet->SetXY(iShipPos+35, 385);
  858. pNewBullet->SetType(2);
  859. pBullet = pFirstBullet;
  860. pNewBullet = new Bullet;
  861. pFirstBullet = pBullet;
  862. while (pBullet->GetNext() != NULL)
  863. pBullet = pBullet->GetNext();
  864. pBullet->SetNext(pNewBullet);
  865. pNewBullet->SetPrev(pBullet);
  866. pNewBullet->SetXY(iShipPos+23, 380);
  867. pNewBullet->SetType(2);
  868. pBullet = pFirstBullet;
  869. break;
  870. case  WP_1_PHOTON:
  871. if (iPhotonAmmo == 0)
  872. return 0L;
  873. iPhotonAmmo--;
  874. pNewBullet = new Bullet;
  875. if (pBullet == NULL)
  876. {
  877. pBullet = pNewBullet;
  878. pNewBullet->SetXY(iShipPos+24, 380);
  879. }
  880. else
  881. {
  882. pFirstBullet = pBullet;
  883. while (pBullet->GetNext() != NULL)
  884. pBullet = pBullet->GetNext();
  885. pBullet->SetNext(pNewBullet);
  886. pNewBullet->SetPrev(pBullet);
  887. pNewBullet->SetXY(iShipPos+24, 380);
  888. pBullet = pFirstBullet;
  889. }
  890. break;
  891. case  WP_2_PHOTON:
  892. if (iPhotonAmmo < 2)
  893. return 0L;
  894. iPhotonAmmo-=2;
  895. pNewBullet = new Bullet;
  896. if (pBullet == NULL)
  897. {
  898. pBullet = pNewBullet;
  899. pNewBullet->SetXY(iShipPos+11, 380);
  900. pFirstBullet = pBullet;
  901. }
  902. else
  903. {
  904. pFirstBullet = pBullet;
  905. while (pBullet->GetNext() != NULL)
  906. pBullet = pBullet->GetNext();
  907. pBullet->SetNext(pNewBullet);
  908. pNewBullet->SetPrev(pBullet);
  909. pNewBullet->SetXY(iShipPos+11, 385);
  910. pBullet = pFirstBullet;
  911. }
  912. pNewBullet = new Bullet;
  913. pFirstBullet = pBullet;
  914. while (pBullet->GetNext() != NULL)
  915. pBullet = pBullet->GetNext();
  916. pBullet->SetNext(pNewBullet);
  917. pNewBullet->SetPrev(pBullet);
  918. pNewBullet->SetXY(iShipPos+34, 385);
  919. pBullet = pFirstBullet;
  920. break;
  921. case  WP_3_PHOTON:
  922. if (iPhotonAmmo < 3)
  923. return 0L;
  924. iPhotonAmmo-=3;
  925. pNewBullet = new Bullet;
  926. if (pBullet == NULL)
  927. {
  928. pBullet = pNewBullet;
  929. pNewBullet->SetXY(iShipPos+11, 380);
  930. pFirstBullet = pBullet;
  931. }
  932. else
  933. {
  934. pFirstBullet = pBullet;
  935. while (pBullet->GetNext() != NULL)
  936. pBullet = pBullet->GetNext();
  937. pBullet->SetNext(pNewBullet);
  938. pNewBullet->SetPrev(pBullet);
  939. pNewBullet->SetXY(iShipPos+11, 385);
  940. pBullet = pFirstBullet;
  941. }
  942. pNewBullet = new Bullet;
  943. pFirstBullet = pBullet;
  944. while (pBullet->GetNext() != NULL)
  945. pBullet = pBullet->GetNext();
  946. pBullet->SetNext(pNewBullet);
  947. pNewBullet->SetPrev(pBullet);
  948. pNewBullet->SetXY(iShipPos+35, 385);
  949. pBullet = pFirstBullet;
  950. pNewBullet = new Bullet;
  951. pFirstBullet = pBullet;
  952. while (pBullet->GetNext() != NULL)
  953. pBullet = pBullet->GetNext();
  954. pBullet->SetNext(pNewBullet);
  955. pNewBullet->SetPrev(pBullet);
  956. pNewBullet->SetXY(iShipPos+23, 380);
  957. pBullet = pFirstBullet;
  958. break;
  959. }
  960. SndObjStop(hsoShoot);
  961. SndObjPlay(hsoShoot,0);
  962. bShootEnable = FALSE;
  963. if (iWeapon == 0)
  964. SetTimer(hWnd,1,400,NULL);
  965. else
  966. SetTimer(hWnd,1,680,NULL);
  967. break;
  968. case VK_F12:
  969. case VK_ESCAPE:
  970. // ESCAPE KEY AND F12 IS THE SAME AS QUIT
  971. // Quit if main menu, gameover if gamescreen
  972. if (iAppState == APP_MAINMENU)
  973. {
  974. DestroyGame();
  975. PostQuitMessage(0);
  976. break;
  977. }
  978. else
  979. {
  980. Ovni* auxpUFO;
  981. Bullet* auxpBullet;
  982. Extra* auxpExtra;
  983. while(pExtra !=NULL)
  984. {
  985. auxpExtra = pExtra->GetNext();
  986. delete(pExtra);
  987. pExtra = auxpExtra;
  988. }
  989. while(pUFO !=NULL)
  990. {
  991. auxpUFO = pUFO->GetNext();
  992. delete(pUFO);
  993. pUFO = auxpUFO;
  994. }
  995. while(pBullet !=NULL)
  996. {
  997. auxpBullet = pBullet->GetNext();
  998. delete(pBullet);
  999. pBullet = auxpBullet;
  1000. }
  1001. lastTickCount = 0;
  1002. iAppState = 0;
  1003. }
  1004. break;
  1005.         }
  1006.        break;
  1007. case WM_CREATE:
  1008.         break;
  1009.     case WM_DESTROY:
  1010.         DestroyGame();
  1011.         PostQuitMessage(0);
  1012.         break;
  1013.     default:
  1014.         break;
  1015.     }
  1016.     return DefWindowProc(hWnd, message, wParam, lParam);
  1017. } /* MainWndproc */
  1018. void DrawBackGround(LPDIRECTDRAWSURFACE7 lpDest, int x, int y, int wx, int wy)
  1019. {
  1020. // Blit the background to the destination surface
  1021. RECT rcRect;
  1022. HRESULT hRet;
  1023. rcRect.left = x;
  1024.     rcRect.top = y;
  1025.     rcRect.right = wx;
  1026.     rcRect.bottom = wy;
  1027. while (1)
  1028.     {
  1029.         hRet = lpDest->BltFast(x, y, lpBkGround, &rcRect, FALSE);
  1030.         if (hRet == DD_OK)
  1031.         {
  1032.             break;
  1033.         }
  1034.         if (hRet == DDERR_SURFACELOST)
  1035.         {
  1036.             hRet = RestoreSurfaces();
  1037.             if (hRet != DD_OK)
  1038.                 break;
  1039.         }
  1040.         if (hRet != DDERR_WASSTILLDRAWING)
  1041.             break;
  1042.     }
  1043. }
  1044. void DestroyBullet(Bullet* pDeadBullet)
  1045. {
  1046. HRESULT hRet;
  1047. RECT rcRect;
  1048. // Destroy a bullet in the screen
  1049. rcRect.left = pDeadBullet->GetX();
  1050.     rcRect.top = pDeadBullet->GetY()-6;
  1051.     rcRect.right = pDeadBullet->GetX()+20;
  1052.     rcRect.bottom = pDeadBullet->GetY()+32;
  1053. if (rcRect.bottom > 640)
  1054. rcRect.bottom = 640;
  1055. DrawBackGround(lpBackBuffer, pDeadBullet->GetX(),pDeadBullet->GetY(),pDeadBullet->GetX()+20,pDeadBullet->GetY()+20);
  1056. while (1)
  1057. {
  1058. hRet = lpFrontBuffer->BltFast(pDeadBullet->GetX(), pDeadBullet->GetY()-6, lpBkGround, &rcRect, FALSE);
  1059. if (hRet == DD_OK)
  1060. {
  1061. break;
  1062. }
  1063. if (hRet == DDERR_SURFACELOST)
  1064. {
  1065. hRet = RestoreSurfaces();
  1066. if (hRet != DD_OK)
  1067. break;
  1068. }
  1069. if (hRet != DDERR_WASSTILLDRAWING)
  1070. break;
  1071. }
  1072. }
  1073. void DrawInvalidBackGround()
  1074. {
  1075. // Redraw background
  1076. RECT rcRect;
  1077. HRESULT hRet;
  1078. static y = 0;
  1079. const int iFim = 455;
  1080. if (lastTickCount = 0)
  1081. {
  1082. y =0;
  1083. }
  1084. y += 1;
  1085. if (y>iFim)
  1086. y = 0;
  1087. rcRect.left = 0;
  1088.     rcRect.top = 0;
  1089.     rcRect.right = 640;
  1090.     rcRect.bottom = iFim-y;
  1091. while (1)
  1092.     {
  1093. hRet = lpBackBuffer->BltFast(0, y, lpBkGround, &rcRect, DDBLTFAST_NOCOLORKEY);
  1094.         if (hRet == DD_OK)
  1095.         {
  1096.             break;
  1097.         }
  1098.         if (hRet == DDERR_SURFACELOST)
  1099.         {
  1100.             hRet = RestoreSurfaces();
  1101.             if (hRet != DD_OK)
  1102.                 break;
  1103.         }
  1104.         if (hRet != DDERR_WASSTILLDRAWING)
  1105.             break;
  1106.     }
  1107. rcRect.left = 0;
  1108.     rcRect.top = iFim-y;
  1109.     rcRect.right = 640;
  1110.     rcRect.bottom = iFim;
  1111. while (1)
  1112.     {
  1113.         hRet = lpBackBuffer->BltFast(0, 0, lpBkGround, &rcRect, DDBLTFAST_NOCOLORKEY);
  1114.         if (hRet == DD_OK)
  1115.         {
  1116.             break;
  1117.         }
  1118.         if (hRet == DDERR_SURFACELOST)
  1119.         {
  1120.             hRet = RestoreSurfaces();
  1121.             if (hRet != DD_OK)
  1122.                 break;
  1123.         }
  1124.         if (hRet != DDERR_WASSTILLDRAWING)
  1125.             break;
  1126.     }
  1127. //DrawBackGround(lpBackBuffer,0,y,640,460);
  1128. /* Bullet* pFirstBullet;
  1129. Extra* pFirstExtra;
  1130. Ovni* pFirstUFO;
  1131. int left;
  1132. int right;
  1133. if (iRepaint == -1)
  1134. {
  1135. pFirstExtra = pExtra;
  1136. while (pExtra != NULL)
  1137. {
  1138. pExtra->Repaint(lpBackBuffer,lpBkGround,NULL);
  1139. pExtra = pExtra->GetNext();
  1140. }
  1141. pExtra = pFirstExtra;
  1142. pFirstUFO = pUFO;
  1143. while (pUFO != NULL)
  1144. {
  1145. pUFO->Repaint(lpBackBuffer, lpBkGround, NULL);
  1146. pUFO = pUFO->GetNext();
  1147. }
  1148. pUFO = pFirstUFO;
  1149. pFirstBullet = pBullet;
  1150. while (pBullet != NULL)
  1151. {
  1152. pBullet->Repaint(lpBackBuffer,lpBkGround,NULL);
  1153. //DrawBackGround(iTempX,iTempY-12, iTempX+20, iTempY+34);
  1154. pBullet = pBullet->GetNext();
  1155. }
  1156. pBullet = pFirstBullet;
  1157. left = iShipPos-25;
  1158. if (left < 0)
  1159. left=0;
  1160. right = iShipPos+95;
  1161. if (right > 640)
  1162. right=640;
  1163. DrawBackGround(lpBackBuffer,left,380,right,456);
  1164. }
  1165. else
  1166. {
  1167. DrawBackGround(lpBackBuffer,0,0,640,480);
  1168. iRepaint--;
  1169. iLastWeapon = -1;
  1170. iLastAmmo = -1;
  1171. Lastscore = -1;
  1172. iLastShield = -1;
  1173. }*/
  1174. }
  1175. void DrawExtra()
  1176. {
  1177. // Draw extra objects in the screen (ammo, bonus, etc)
  1178. Extra* pFirstExtra;
  1179. Extra* pNextExtra = NULL;
  1180. Extra* pLastExtra = NULL;
  1181. Extra* pPrevExtra = NULL;
  1182. pFirstExtra = pExtra;
  1183. //因为当前屏幕中可能有多个奖子,所以这里使用while语句就是要将所有的奖子都绘制出来,
  1184. //当前屏幕中的奖子都被保存在同一个奖子链表中,所以绘制所有奖子时要求遍历整个奖子队列
  1185. while (pExtra != NULL)
  1186. {
  1187. //传入的是-3,即每次掉落3个象素点
  1188. pExtra->Move(-3);
  1189. //绘制当前节点奖子
  1190. pExtra->Draw(lpBackBuffer,lpExtra);
  1191. //如果当前的奖子已经掉落到屏幕以外,则调整奖子列表,删除当前奖子节点
  1192. if (pExtra->GetY() > 455)
  1193. {
  1194. //调整奖子链表节点和相关指针
  1195. if (pPrevExtra != NULL)
  1196. pPrevExtra->SetNext( pExtra->GetNext() );
  1197. pNextExtra = pExtra->GetNext();
  1198. if (pNextExtra != NULL)
  1199. pNextExtra->SetPrev(pPrevExtra);
  1200. //如果当前奖子节点位于链表中的第一位置,则还需要再调整链表
  1201. if (pExtra == pFirstExtra)
  1202. pFirstExtra=pExtra->GetNext();
  1203. //删除当前奖子节点
  1204. delete(pExtra);
  1205. //重置当前奖子节点
  1206. pExtra = pNextExtra;
  1207. }
  1208. else
  1209. {
  1210. //遍历奖子链表:当前奖子节点指向链表中下一个节点
  1211. pPrevExtra = pExtra;
  1212. pExtra = pExtra->GetNext();
  1213. }
  1214. }
  1215. pExtra = pFirstExtra;
  1216. }
  1217. void DrawBullet()
  1218. {
  1219. // Draw bullets in the screen
  1220. Bullet* pFirstBullet;
  1221. Bullet* pNextBullet = NULL;
  1222. Bullet* pLastBullet = NULL;
  1223. Bullet* pPrevBullet = NULL;
  1224. pFirstBullet = pBullet;
  1225. while (pBullet != NULL)
  1226. {
  1227. switch(pBullet->GetType())
  1228. {
  1229. case 0:
  1230. pBullet->Move(6);
  1231. pBullet->Draw(lpBackBuffer,lpShoot);
  1232. break;
  1233. case 1:
  1234. pBullet->Move(-6);
  1235. pBullet->Draw(lpBackBuffer,lpUfoShoot);
  1236. break;
  1237. case 2:
  1238. pBullet->Move(10);
  1239. pBullet->Draw(lpBackBuffer,lpShoot2);
  1240. break;
  1241. }
  1242. if ((pBullet->GetY() <= -26) ||
  1243. (pBullet->GetY() > 455))
  1244. {
  1245. if (pPrevBullet != NULL)
  1246. pPrevBullet->SetNext( pBullet->GetNext() );
  1247. pNextBullet = pBullet->GetNext();
  1248. if (pNextBullet != NULL)
  1249. pNextBullet->SetPrev(pPrevBullet);
  1250. if (pBullet == pFirstBullet)
  1251. pFirstBullet=pBullet->GetNext();
  1252. //pBullet->Repaint(lpFrontBuffer,lpBkGround, NULL);
  1253. //pBullet->Repaint(lpBackBuffer,lpBkGround, 1);
  1254. delete(pBullet);
  1255. pBullet = pNextBullet;
  1256. }
  1257. else
  1258. {
  1259. pPrevBullet = pBullet;
  1260. pBullet = pBullet->GetNext();
  1261. }
  1262. }
  1263. pBullet = pFirstBullet;
  1264. }
  1265. int CheckHitExtra(void)
  1266. {
  1267. Extra *pFirstExtra, *pPrevExtra, *pNextExtra;
  1268. int iReturn = 0;
  1269. // Check if the ship get an extra
  1270. pPrevExtra = NULL;
  1271. pNextExtra = NULL;
  1272. pFirstExtra = pExtra;
  1273. while (pExtra != NULL)
  1274. {
  1275. if ((pExtra->GetX() >= iShipPos   &&
  1276. pExtra->GetX()  < iShipPos+54 &&
  1277. pExtra->GetY()  > 385         &&
  1278. pExtra->GetY()  < 425)        &&
  1279. (pExtra->GetType() != 0))
  1280. {
  1281. if (pPrevExtra != NULL)
  1282. pPrevExtra->SetNext( pExtra->GetNext() );
  1283. pNextExtra = pExtra->GetNext();
  1284. if (pNextExtra != NULL)
  1285. pNextExtra->SetPrev(pPrevExtra);
  1286. if (pExtra == pFirstExtra)
  1287. pFirstExtra=pExtra->GetNext();
  1288. iReturn = pExtra->GetType();
  1289. //pExtra->Repaint(lpFrontBuffer,lpBkGround,0);
  1290. //pExtra->Repaint(lpBackBuffer,lpBkGround,1);
  1291. delete(pExtra);
  1292. pExtra = pFirstExtra;
  1293. return iReturn;
  1294. }
  1295. pPrevExtra = pExtra;
  1296. pExtra = pExtra->GetNext();
  1297. }
  1298. pExtra = pFirstExtra;
  1299. return iReturn;
  1300. }
  1301. BOOL CheckHitShip(void)
  1302. {
  1303. Bullet *pFirstBullet, *pPrevBullet, *pNextBullet;;
  1304. // chekc if the ship was hitted
  1305. if (iShipState == 1) 
  1306. return FALSE;
  1307. pPrevBullet = NULL;
  1308. pNextBullet = NULL;
  1309. pFirstBullet = pBullet;
  1310. while (pBullet != NULL)
  1311. {
  1312. if ((pBullet->GetX() >= iShipPos   &&
  1313. pBullet->GetX()  < iShipPos+54 &&
  1314. pBullet->GetY()  > 385         &&
  1315. pBullet->GetY()  < 425)        &&
  1316. (pBullet->GetType() != 0))
  1317. {
  1318. if (pPrevBullet != NULL)
  1319. pPrevBullet->SetNext( pBullet->GetNext() );
  1320. pNextBullet = pBullet->GetNext();
  1321. if (pNextBullet != NULL)
  1322. pNextBullet->SetPrev(pPrevBullet);
  1323. if (pBullet == pFirstBullet)
  1324. pFirstBullet=pBullet->GetNext();
  1325. DestroyBullet(pBullet);
  1326. delete(pBullet);
  1327. pBullet = pFirstBullet;
  1328. return TRUE;
  1329. }
  1330. pPrevBullet = pBullet;
  1331. pBullet = pBullet->GetNext();
  1332. }
  1333. pBullet = pFirstBullet;
  1334. return FALSE;
  1335. }
  1336. void DrawShip()
  1337. {
  1338. static int ArgPosY = 0;
  1339. static int ArgPosX = 0;
  1340. static int inc = 70;
  1341. // draw the ship
  1342.     RECT                        rcRect;
  1343.     HRESULT                     hRet;
  1344.     // DrawUFO();
  1345. rcRect.left = ArgPosX;
  1346. rcRect.top = ArgPosY;
  1347. rcRect.right = ArgPosX + 70;
  1348. rcRect.bottom = ArgPosY + 70;
  1349. if (bShipStop)
  1350. {
  1351. SndObjPlay(hsoStop,0);
  1352. bShipStop = FALSE;
  1353. }
  1354. iShipPos += iShipMov;
  1355. if (iShipPos <= 1) 
  1356. {
  1357. iShipMov = 0;
  1358. iShipPos = 1;
  1359. }
  1360. if (iShipPos >= 569) 
  1361. {
  1362. iShipMov = 0;
  1363. iShipPos = 569;
  1364. }
  1365. if (iShipState == 0 && CheckHitShip() == TRUE)
  1366. {
  1367. iShield = iShield - 20;
  1368. }
  1369. /*
  1370. if (iShield <= 0 && iShipState == 0)
  1371. {
  1372. iShield = 0;
  1373. iShipState = 1;
  1374. iShipMov = 0;
  1375. ArgPosX = 0;
  1376. ArgPosY = 0;
  1377. rcRect.left = ArgPosX;
  1378. rcRect.top = ArgPosY;
  1379. rcRect.right = ArgPosX + 70;
  1380. rcRect.bottom = ArgPosY + 70;
  1381. inc = 70;
  1382. }
  1383. */
  1384. if (iShipState == SHIP_OK &&
  1385. pExtra != NULL)
  1386. {
  1387. int iType;
  1388. // check if we hit an extra
  1389. // if so, select the kinf of extra
  1390. iType = CheckHitExtra();
  1391. switch (iType)
  1392. {
  1393. case 1:
  1394. iPhotonAmmo += 25;
  1395. if (iPhotonAmmo > 999)
  1396. iPhotonAmmo = 999;
  1397. SndObjStop(hsoGetExtra);
  1398. SndObjPlay(hsoGetExtra, NULL);
  1399. break;
  1400. case 2:
  1401. iMaxWeapon++;
  1402. if (iMaxWeapon > 5)
  1403. iMaxWeapon = 5;
  1404. else
  1405. iWeapon = iMaxWeapon;
  1406. SndObjStop(hsoGetExtra);
  1407. SndObjPlay(hsoGetExtra, NULL);
  1408. break;
  1409. case 3:
  1410. score += 100;
  1411. SndObjStop(hsoGetExtra);
  1412. SndObjPlay(hsoGetExtra, NULL);
  1413. break;
  1414. case 4:
  1415. iLaserAmmo += 40;
  1416. if (iLaserAmmo > 999)
  1417. iLaserAmmo = 999;
  1418. SndObjStop(hsoGetExtra);
  1419. SndObjPlay(hsoGetExtra, NULL);
  1420. break;
  1421. case 5:
  1422. iShield += 10;
  1423. if (iShield > 50)
  1424. iShield = 50;
  1425. SndObjStop(hsoGetExtra);
  1426. SndObjPlay(hsoGetExtra, NULL);
  1427. break;
  1428. }
  1429. }
  1430. // Draw the ship sprite
  1431. while (1)
  1432. {
  1433. if (iShipState == 0)
  1434. hRet = lpBackBuffer->BltFast(iShipPos,380, lpShip, &rcRect, TRUE);
  1435. else
  1436. hRet = lpBackBuffer->BltFast(iShipPos,380, lpShipBoom, &rcRect, TRUE);
  1437. if (hRet == DD_OK)
  1438. {
  1439. break;
  1440. }
  1441. if (hRet == DDERR_SURFACELOST)
  1442. {
  1443. hRet = RestoreSurfaces();
  1444. if (hRet != DD_OK)
  1445. break;
  1446. }
  1447. if (hRet != DDERR_WASSTILLDRAWING)
  1448. break;
  1449. }
  1450. switch (iShipState)
  1451. {
  1452. case SHIP_OK:
  1453. ArgPosX += inc;
  1454. if (ArgPosX == 350 && inc > 0)
  1455. {
  1456. ArgPosX = 0;
  1457. ArgPosY += inc;
  1458. if (ArgPosY == 350)
  1459. {
  1460. ArgPosX=280;
  1461. ArgPosY=280;
  1462. inc = -70;
  1463. return;
  1464. }
  1465. }
  1466. if (ArgPosX == -70 && inc < 0)
  1467. {
  1468. ArgPosX = 280;
  1469. ArgPosY += inc;
  1470. if (ArgPosY == -70)
  1471. {
  1472. inc = 70;
  1473. ArgPosX = 0;
  1474. ArgPosY = 0;
  1475. }
  1476. }
  1477. break;
  1478. case SHIP_EXPLODING:
  1479. ArgPosX += inc;
  1480. if (ArgPosX == 490 && inc > 0)
  1481. {
  1482. ArgPosX = 0;
  1483. ArgPosY += inc;
  1484. if (ArgPosY == 210)
  1485. {
  1486. dwShipExplode = GetTickCount();
  1487. iShipState = SHIP_DESTROYED;
  1488. return;
  1489. }
  1490. }
  1491. break;
  1492. }
  1493. }
  1494. BOOL CheckHit(Ovni* pCheckUfo)
  1495. {
  1496. Bullet *pFirstBullet, *pPrevBullet, *pNextBullet;;
  1497. // Check if we have hitted and UFO
  1498. if (pCheckUfo->isExploding() == TRUE) 
  1499. return FALSE;
  1500. pPrevBullet = NULL;
  1501. pNextBullet = NULL;
  1502. pFirstBullet = pBullet;
  1503. while (pBullet != NULL)
  1504. {
  1505. if ((pBullet->GetX() > pCheckUfo->GetX()    &&
  1506. pBullet->GetX() < pCheckUfo->GetX()+64 &&
  1507. pBullet->GetY() > pCheckUfo->GetY()    &&
  1508. pBullet->GetY() < pCheckUfo->GetY()+56) &&
  1509. (pBullet->GetType() != 1))
  1510. {
  1511. pCheckUfo->LowStr(pBullet->GetPower());
  1512. if (pPrevBullet != NULL)
  1513. pPrevBullet->SetNext( pBullet->GetNext() );
  1514. pNextBullet = pBullet->GetNext();
  1515. if (pNextBullet != NULL)
  1516. pNextBullet->SetPrev(pPrevBullet);
  1517. if (pBullet == pFirstBullet)
  1518. pFirstBullet=pBullet->GetNext();
  1519. DestroyBullet(pBullet);
  1520. delete(pBullet);
  1521. pBullet = pFirstBullet;
  1522. if (pCheckUfo->GetStr() <= 0)
  1523. {
  1524. return TRUE;
  1525. }
  1526. else
  1527. {
  1528. score += 1;
  1529. SndObjStop(hsoSelect);
  1530. SndObjPlay(hsoSelect,NULL);
  1531. return FALSE;
  1532. }
  1533. }
  1534. pPrevBullet = pBullet;
  1535. pBullet = pBullet->GetNext();
  1536. }
  1537. pBullet = pFirstBullet;
  1538. return FALSE;
  1539. }
  1540. BOOL CheckCrash(Ovni* pCheck)
  1541. {
  1542. // Check if we have creashed in an UFO
  1543. Ovni *pFirst;
  1544. pFirst = pUFO;
  1545. while(pUFO != NULL)
  1546. {
  1547. if (pUFO->isExploding() == FALSE      &&
  1548. pUFO->GetY() == pCheck->GetY()    &&
  1549. pUFO != pCheck)
  1550. {
  1551. if (pCheck->GetX() < pUFO->GetX())
  1552. {
  1553. if (pUFO->GetX() - pCheck->GetX() <= 70 &&
  1554. (
  1555. (pCheck->GetInc() > 0 && pCheck->iType==0) ||
  1556. (pCheck->GetMov() == 0 && pCheck->iType==2)   )
  1557. )
  1558. return TRUE;
  1559. }
  1560. else
  1561. {
  1562. if (pCheck->GetX() - pUFO->GetX() <= 70 &&
  1563. ((pCheck->GetInc() < 0 &&
  1564. pCheck->iType == 0) ||
  1565. (pCheck->GetMov()==1 &&
  1566. pCheck->iType==2))
  1567. )
  1568. return TRUE;
  1569. }
  1570. }
  1571. pUFO = pUFO->GetNext();
  1572. }
  1573. pUFO = pFirst;
  1574. return FALSE;
  1575. }
  1576. void DrawUfo()
  1577. {
  1578. static int ArgPosY = 0;
  1579. static int ArgPosX = 0;
  1580. DWORD delayshoot;
  1581. Ovni* pFirst, *pNext, *pPrev, *pAux;
  1582. Bullet* pNewBullet, *pFirstBullet;
  1583. Extra* pNewExtra,  *pFirstExtra;
  1584.     
  1585.     pFirst = pUFO;
  1586. // draw all the ufos
  1587. pUFO = pFirst;
  1588. pPrev = NULL;
  1589. while(pUFO != NULL)
  1590. {
  1591. switch (pUFO->isExploding() )
  1592. {
  1593. case FALSE:
  1594. switch (pUFO->iType)
  1595. {
  1596. case 0:
  1597. delayshoot = 100;
  1598. break;
  1599. case 1:
  1600. delayshoot = 10;
  1601. break;
  1602. case 2:
  1603. delayshoot = 70;
  1604. break;
  1605. }
  1606. if (bShoot == TRUE)
  1607. {
  1608. pUFO->Move(iShipPos);
  1609. }
  1610. else
  1611. pUFO->Move(NULL);
  1612. pUFO->Draw(lpBackBuffer,lpUfo,NULL);
  1613. if (CheckHit(pUFO) == TRUE)
  1614. {
  1615. pUFO->SetState(1);
  1616. score += 10;
  1617. //SndObjStop(hsoBoom);
  1618. SndObjPlay(hsoBoom,0);
  1619. }
  1620. if ( (GetTickCount() - pUFO->dwLastShoot) > delayshoot)
  1621. {
  1622. if (rand()%SHOOTCHANCE == 0)
  1623. {
  1624. pUFO->dwLastShoot = GetTickCount();
  1625. pNewBullet = new Bullet;
  1626. if (pBullet == NULL)
  1627. {
  1628. pBullet = pNewBullet;
  1629. pNewBullet->SetType(1);
  1630. pNewBullet->SetXY(pUFO->GetX()+24, pUFO->GetY()+50);
  1631. }
  1632. else
  1633. {
  1634. pFirstBullet = pBullet;
  1635. while (pBullet->GetNext() != NULL)
  1636. pBullet = pBullet->GetNext();
  1637. pBullet->SetNext(pNewBullet);
  1638. pNewBullet->SetPrev(pBullet);
  1639. pNewBullet->SetXY(pUFO->GetX()+24, pUFO->GetY()+50);
  1640. pNewBullet->SetType(1);
  1641. pBullet = pFirstBullet;
  1642. }
  1643. //SndObjStop(hsoUfoShoot);
  1644. SndObjPlay(hsoUfoShoot,0);
  1645. }
  1646. }
  1647. break;
  1648. case TRUE:
  1649. if (pUFO->DestroyMe() == TRUE)
  1650. {
  1651. if (pPrev != NULL)
  1652. pPrev->SetNext(pUFO->GetNext());
  1653. pNext = pUFO->GetNext();
  1654. if (pUFO == pFirst)
  1655. pFirst=pUFO->GetNext();
  1656.  
  1657. //iRepaint = 1;
  1658. //pUFO->Repaint(lpBackBuffer, lpBkGround, 1); 
  1659. delete(pUFO);
  1660. if (pPrev != NULL)
  1661. pUFO = pPrev;
  1662. else
  1663. pUFO = pFirst;
  1664. break;
  1665. }
  1666. else
  1667. {
  1668. pUFO->Draw(lpBackBuffer,lpBoom,0);
  1669. if (pUFO->DropExtra() == TRUE)
  1670. {
  1671. pNewExtra = new Extra;
  1672. if (pExtra == NULL)
  1673. {
  1674. pExtra = pNewExtra;
  1675. pNewExtra->SetXY(pUFO->GetX()+22, pUFO->GetY()+20);
  1676. pNewExtra->SetType(pUFO->GetExtra());
  1677. }
  1678. else
  1679. {
  1680. pFirstExtra = pExtra;
  1681. while (pExtra->GetNext() != NULL)
  1682. pExtra = pExtra->GetNext();
  1683. pExtra->SetNext(pNewExtra);
  1684. pNewExtra->SetPrev(pExtra);
  1685. pNewExtra->SetXY(pUFO->GetX()+22, pUFO->GetY()+20);
  1686. pNewExtra->SetType(pUFO->GetExtra());
  1687. pExtra = pFirstExtra;
  1688. }
  1689. }
  1690. }
  1691. break;
  1692. }
  1693. pPrev = pUFO;
  1694. if (pUFO != NULL)
  1695. pUFO = pUFO->GetNext();
  1696. } //** While UFO-NEXT;
  1697. pUFO = pFirst;
  1698. pAux = pUFO;
  1699. while(pAux != NULL)
  1700. {
  1701. if (CheckCrash(pAux) == TRUE)
  1702. pAux->Crash();
  1703. pAux = pAux->GetNext();
  1704. };
  1705. pUFO = pFirst;
  1706. }
  1707. void bltText(char*  buffer, int  x, int y)
  1708. {
  1709. // Draw text to the screen
  1710. int pos;
  1711. int nextx;
  1712. RECT rcRect;
  1713. HRESULT hRet;
  1714. nextx = x;
  1715. while (*buffer != '')
  1716. {
  1717. if (*buffer != ' ')
  1718. {
  1719. if (*buffer >= 48 &&
  1720. *buffer <= 57)
  1721. pos = (int) *buffer - 48;
  1722. else
  1723. pos = (int) *buffer - 55;
  1724. if (*buffer == '@')
  1725. pos = 36;
  1726. if (*buffer == '-')
  1727. pos = 37;
  1728. if (*buffer == ',')
  1729. pos = 38;
  1730. if (*buffer == '.')
  1731. pos = 39;
  1732. rcRect.left = AA[pos].start;
  1733. rcRect.right = AA[pos].end;
  1734. rcRect.top = 0;
  1735. rcRect.bottom = 15;
  1736. while (1)
  1737. {
  1738. hRet = lpBackBuffer->BltFast(nextx, y, lpAlpha, &rcRect, TRUE);
  1739. if (hRet == DD_OK)
  1740. {
  1741. break;
  1742. }
  1743. if (hRet == DDERR_SURFACELOST)
  1744. {
  1745. hRet = RestoreSurfaces();
  1746. if (hRet != DD_OK)
  1747. break;
  1748. }
  1749. if (hRet != DDERR_WASSTILLDRAWING)
  1750. break;
  1751. }
  1752. while (1)
  1753. {
  1754. hRet = lpFrontBuffer->BltFast(nextx, y, lpAlpha, &rcRect, TRUE);
  1755. if (hRet == DD_OK)
  1756. {
  1757. break;
  1758. }
  1759. if (hRet == DDERR_SURFACELOST)
  1760. {
  1761. hRet = RestoreSurfaces();
  1762. if (hRet != DD_OK)
  1763. break;
  1764. }
  1765. if (hRet != DDERR_WASSTILLDRAWING)
  1766. break;
  1767. }
  1768. nextx += (AA[pos].end - AA[pos].start) + 1;
  1769. }
  1770. else
  1771. nextx += 15;
  1772. buffer++;
  1773. }
  1774. }
  1775. void DrawScore(int x, int y)
  1776. {
  1777. char scorebuf[9];
  1778.     unsigned int        rem;
  1779.     // blt everything in reverse order if we are doing destination transparency
  1780.     // calculate score string
  1781.     scorebuf[0] = score/10000000 + '0';
  1782.     rem = score % 10000000;
  1783.     scorebuf[1] = rem/1000000 + '0';
  1784.     rem = score % 1000000;
  1785.     scorebuf[2] = rem/100000 + '0';
  1786.     rem = score % 100000;
  1787.     scorebuf[3] = rem/10000 + '0';
  1788.     rem = score % 10000;
  1789.     scorebuf[4] = rem/1000 + '0';
  1790.     rem = score % 1000;
  1791.     scorebuf[5] = rem/100 + '0';
  1792.     rem = score % 100;
  1793.     scorebuf[6] = rem/10 + '0';
  1794.     rem = score % 10;
  1795.     scorebuf[7] = rem + '0';
  1796. scorebuf[8] = '';
  1797. bltText(scorebuf, x, y);
  1798. }
  1799. void DrawShield()
  1800. {
  1801. // Draw the shield status
  1802. HRESULT hRet;
  1803. DDBLTFX     ddbltfx;
  1804. RECT rcRect;
  1805. static int    iRed = 0;
  1806. static int    inc = 1;
  1807. static DWORD   lastBlitRed = 0;
  1808.     ddbltfx.dwSize = sizeof( ddbltfx );
  1809. ddbltfx.dwFillColor = RGB(0,0,0);
  1810. rcRect.top = 459;
  1811. rcRect.left = 370;
  1812. rcRect.bottom = 477;
  1813. rcRect.right  = 422;
  1814. if (iLastShield == iShield &&
  1815. iShield > 30)
  1816. return;
  1817. while (1)
  1818. {
  1819. hRet = lpBackBuffer->Blt(&rcRect, NULL, NULL, DDBLT_COLORFILL, &ddbltfx);
  1820. if (hRet == DD_OK)
  1821. {
  1822. break;
  1823. }
  1824. if (hRet == DDERR_SURFACELOST)
  1825. {
  1826. hRet = RestoreSurfaces();
  1827. if (hRet != DD_OK)
  1828. break;
  1829. }
  1830. if (hRet != DDERR_WASSTILLDRAWING)
  1831. break;
  1832. }
  1833. if (iLastShield != iShield &&
  1834. iShield > 30)
  1835. while (1)
  1836. {
  1837. hRet = lpFrontBuffer->Blt(&rcRect, NULL, NULL, DDBLT_COLORFILL, &ddbltfx);
  1838. if (hRet == DD_OK)
  1839. {
  1840. break;
  1841. }
  1842. if (hRet == DDERR_SURFACELOST)
  1843. {
  1844. hRet = RestoreSurfaces();
  1845. if (hRet != DD_OK)
  1846. break;
  1847. }
  1848. if (hRet != DDERR_WASSTILLDRAWING)
  1849. break;
  1850. }
  1851.     if (iShield <= 50 &&
  1852. iShield >  30)
  1853. {
  1854. iRed = -2;
  1855. lastBlitRed = 0;
  1856. ddbltfx.dwFillColor = RGB(0,15,0);
  1857. }
  1858.     if (iShield <= 30 &&
  1859. iShield >  20)
  1860. ddbltfx.dwFillColor = RGB(0,255,255);
  1861.     if (iShield <= 20 &&
  1862. iShield >= 0)
  1863. {
  1864. if (GetTickCount() - lastBlitRed > 30)
  1865. {
  1866. iRed += inc;
  1867. if (iRed < 32)
  1868. {
  1869. iRed = 32;
  1870. inc = 4;
  1871. }
  1872. if (iRed > 116)
  1873. {
  1874. iRed = 116;
  1875. inc = -4;
  1876. }
  1877. lastBlitRed = GetTickCount();
  1878. }
  1879. ddbltfx.dwFillColor = RGB(0,iRed,0);
  1880. }
  1881. rcRect.top = 460;
  1882. rcRect.left = 371;
  1883. rcRect.bottom = 477;
  1884. rcRect.right  = 371 + iShield;
  1885. while (1)
  1886. {
  1887. hRet = lpBackBuffer->Blt(&rcRect, NULL, NULL, DDBLT_COLORFILL, &ddbltfx);
  1888. if (hRet == DD_OK)
  1889. {
  1890. break;
  1891. }
  1892. if (hRet == DDERR_SURFACELOST)
  1893. {
  1894. hRet = RestoreSurfaces();
  1895. if (hRet != DD_OK)
  1896. break;
  1897. }
  1898. if (hRet != DDERR_WASSTILLDRAWING)
  1899. break;
  1900. }
  1901. if (iLastShield != iShield &&
  1902. iShield > 30)
  1903. while (1)
  1904. {
  1905. hRet = lpFrontBuffer->Blt(&rcRect, NULL, NULL, DDBLT_COLORFILL, &ddbltfx);
  1906. if (hRet == DD_OK)
  1907. {
  1908. break;
  1909. }
  1910. if (hRet == DDERR_SURFACELOST)
  1911. {
  1912. hRet = RestoreSurfaces();
  1913. if (hRet != DD_OK)
  1914. break;
  1915. }
  1916. if (hRet != DDERR_WASSTILLDRAWING)
  1917. break;
  1918. }
  1919. iLastShield = iShield;
  1920. }
  1921. void DrawAmmo()
  1922. {
  1923. char ammobuf[4];
  1924.     unsigned int        rem;
  1925. int iAmmo;
  1926.     // blt everything in reverse order if we are doing destination transparency
  1927.     // calculate score string
  1928. if (iWeapon < 3)
  1929. iAmmo = iLaserAmmo;
  1930. else
  1931. iAmmo = iPhotonAmmo;
  1932.     ammobuf[0] = iAmmo/100 + '0';
  1933.     rem = iAmmo % 100;
  1934.     ammobuf[1] = rem/10 + '0';
  1935.     rem = iAmmo % 10;
  1936.     ammobuf[2] = rem + '0';
  1937. ammobuf[3] = '';
  1938. OutputDebugString("Blit Ammo Buffn");
  1939. bltText(ammobuf, 241, 460);
  1940. }
  1941. void DrawWeapon()
  1942. {
  1943. RECT rcRect;
  1944. HRESULT hRet;
  1945. // Draw the weapon we are using
  1946. rcRect.left = iWeapon * 87;
  1947. rcRect.right = (iWeapon * 87) + 87;
  1948. rcRect.top = 0;
  1949. rcRect.bottom = 20;
  1950. while (1)
  1951. {
  1952. hRet = lpBackBuffer->BltFast(84, 458, lpStatusBar, &rcRect, TRUE);
  1953. if (hRet == DD_OK)
  1954. {
  1955. break;
  1956. }
  1957. if (hRet == DDERR_SURFACELOST)
  1958. {
  1959. hRet = RestoreSurfaces();
  1960. if (hRet != DD_OK)
  1961. break;
  1962. }
  1963. if (hRet != DDERR_WASSTILLDRAWING)
  1964. break;
  1965. }
  1966. while (1)
  1967. {
  1968. hRet = lpFrontBuffer->BltFast(84, 458, lpStatusBar, &rcRect, TRUE);
  1969. if (hRet == DD_OK)
  1970. {
  1971. break;
  1972. }
  1973. if (hRet == DDERR_SURFACELOST)
  1974. {
  1975. hRet = RestoreSurfaces();
  1976. if (hRet != DD_OK)
  1977. break;
  1978. }
  1979. if (hRet != DDERR_WASSTILLDRAWING)
  1980. break;
  1981. }
  1982. }
  1983. void UpdateFrame( void )
  1984. {
  1985.   int ddrval;
  1986.     DWORD                       thisTickCount;
  1987.     RECT                        rcRect;
  1988.     DWORD                       delay = 18;
  1989. static int frame = 0;
  1990. HBITMAP hbm;
  1991. DDBLTFX ddbltfx;
  1992. HRESULT hRet;
  1993. thisTickCount = GetTickCount();
  1994. // Main update function
  1995. if (thisTickCount - dwShipExplode > 2000 &&
  1996. iShipState == 3)
  1997. {
  1998. Ovni* auxpUFO;
  1999. Bullet* auxpBullet;
  2000. while(pUFO !=NULL)
  2001. {
  2002. auxpUFO = pUFO->GetNext();
  2003. delete(pUFO);
  2004. pUFO = auxpUFO;
  2005. }
  2006. while(pBullet !=NULL)
  2007. {
  2008. auxpBullet = pBullet->GetNext();
  2009. delete(pBullet);
  2010. pBullet = auxpBullet;
  2011. }
  2012. ShowGameOver();
  2013. lastTickCount = 0;
  2014. iAppState = 0;
  2015. iShipState = 0;
  2016. }
  2017. switch (iAppState)
  2018. {
  2019. case APP_MAINMENU:
  2020. if ((thisTickCount - lastTickCount) <= delay)
  2021. return;
  2022. if (lastTickCount == 0)
  2023. {
  2024. iOption = 0;
  2025. frame = 0;
  2026. hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_INVASION), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2027. if( NULL == hbm )
  2028. return;
  2029. ddrval = DDCopyBitmap(lpFrontBuffer, hbm, 0, 0, 640, 480 );
  2030. if( ddrval != DD_OK )
  2031. {
  2032. DeleteObject( hbm );
  2033. return;
  2034. }
  2035. ddrval = DDCopyBitmap(lpBackBuffer, hbm, 0, 0, 640, 480 );
  2036. if( ddrval != DD_OK )
  2037. {
  2038. DeleteObject( hbm );
  2039. return;
  2040. }
  2041. bltText("START GAME",190,280);
  2042. bltText("CREDITS",190,320);
  2043. bltText("HELP",190,360);
  2044. bltText("QUIT",190,400);
  2045. }
  2046. ddbltfx.dwSize = sizeof( ddbltfx );
  2047. ddbltfx.dwFillColor = dwFillColor;
  2048. rcRect.left = 130;
  2049. rcRect.top = 270;
  2050. rcRect.right = 190;
  2051. rcRect.bottom = 460;
  2052. while (1)
  2053. {
  2054. hRet = lpBackBuffer->Blt(&rcRect, NULL, NULL, DDBLT_COLORFILL, &ddbltfx);
  2055. if (hRet == DD_OK)
  2056. {
  2057. break;
  2058. }
  2059. if (hRet == DDERR_SURFACELOST)
  2060. {
  2061. hRet = RestoreSurfaces();
  2062. if (hRet != DD_OK)
  2063. break;
  2064. }
  2065. if (hRet != DDERR_WASSTILLDRAWING)
  2066. break;
  2067. }
  2068. rcRect.left   = frame * 32;
  2069. rcRect.right  = (frame * 32) + 32;
  2070. rcRect.top    = 0;
  2071. rcRect.bottom = 20;
  2072. while (1)
  2073. {
  2074. hRet = lpBackBuffer->BltFast(150 , 275+ (40 * iOption),  lpSelect, &rcRect, TRUE);
  2075. if (hRet == DD_OK)
  2076. {
  2077. break;
  2078. }
  2079. if (hRet == DDERR_SURFACELOST)
  2080. {
  2081. hRet = RestoreSurfaces();
  2082. if (hRet != DD_OK)
  2083. break;
  2084. }
  2085. if (hRet != DDERR_WASSTILLDRAWING)
  2086. break;
  2087. }
  2088. frame++;
  2089. if (frame > 19)
  2090. frame = 0;
  2091. while( 1 )
  2092. {
  2093. ddrval = lpFrontBuffer->Flip(NULL, 0 );
  2094. if( ddrval == DD_OK )
  2095. {
  2096. break;
  2097. }
  2098. if( ddrval == DDERR_SURFACELOST )
  2099. {
  2100. if( !RestoreSurfaces() )
  2101. {
  2102. return;
  2103. }
  2104. }
  2105. if( ddrval != DDERR_WASSTILLDRAWING )
  2106. {
  2107. break;
  2108. }
  2109. }
  2110. lastTickCount = thisTickCount;
  2111. return;
  2112. case APP_GAMESCREEN:
  2113. int iAmmo;
  2114. if (lastTickCount == 0)
  2115. {
  2116. bShoot = FALSE;
  2117. rcRect.left = 0;
  2118. rcRect.top = 0;
  2119. rcRect.right = 640;
  2120. rcRect.bottom = 480;
  2121. DrawBackGround(lpBackBuffer,0,455,640,480);
  2122. DrawBackGround(lpFrontBuffer,0,455,640,480);
  2123. }
  2124. DrawShield();
  2125. if (Lastscore != score)
  2126. {
  2127. DrawBackGround(lpBackBuffer,510,460,640,477);
  2128. DrawBackGround(lpFrontBuffer,510,460,640,477);
  2129. DrawScore(510,460);
  2130. Lastscore = score;
  2131. }
  2132. if (iLastWeapon != iWeapon)
  2133. {
  2134. DrawBackGround(lpBackBuffer, 84,458, 172,477);
  2135. DrawBackGround(lpFrontBuffer,84,458, 172,477);
  2136. DrawWeapon();
  2137. iLastWeapon = iWeapon;
  2138. iLastAmmo = -1;
  2139. }
  2140. if (iWeapon < 3)
  2141. iAmmo = iLaserAmmo;
  2142. else
  2143. iAmmo = iPhotonAmmo;
  2144. if (iLastAmmo != iAmmo)
  2145. {
  2146. DrawBackGround(lpBackBuffer,241,459,300,477);
  2147. DrawBackGround(lpFrontBuffer,241,459,300,477);
  2148. DrawAmmo();
  2149. iLastAmmo = iAmmo;
  2150. }
  2151. if ((thisTickCount - lastTickCount) <= delay)
  2152. return;
  2153. if (pUFO   == NULL &&
  2154. pExtra == NULL)
  2155. {
  2156. SndObjPlay(hsoEnter, NULL);
  2157. InitLevel(TRUE);
  2158. DrawBackGround(lpBackBuffer,0,0,640,480);
  2159. DrawBackGround(lpFrontBuffer,0,0,640,480);
  2160. DrawScore(510,459);
  2161. lastTickCount = 0;
  2162. return;
  2163. }
  2164. DrawInvalidBackGround();
  2165. DrawExtra();
  2166. DrawUfo();
  2167. DrawBullet();
  2168. DrawShip();
  2169. bShoot = FALSE;
  2170. while( 1 )
  2171. {
  2172. ddrval = lpFrontBuffer->Flip(NULL, 0 );
  2173. if( ddrval == DD_OK )
  2174. {
  2175. break;
  2176. }
  2177. if( ddrval == DDERR_SURFACELOST )
  2178. {
  2179. if( !RestoreSurfaces() )
  2180. {
  2181. return;
  2182. }
  2183. }
  2184. if( ddrval != DDERR_WASSTILLDRAWING )
  2185. {
  2186. break;
  2187. }
  2188. }
  2189.    lastTickCount = GetTickCount();
  2190.    break;
  2191. case APP_CREDITS:
  2192. ShowCredits();
  2193. iAppState = 0;
  2194. lastTickCount = 0;
  2195. break;
  2196. case APP_HELPSCREEN:
  2197. static BOOL  bBlink;
  2198. static DWORD dwTime;
  2199. if ((thisTickCount - lastTickCount) <= delay+20)
  2200. return;
  2201. if (lastTickCount == 0)
  2202. {
  2203. ddbltfx.dwSize = sizeof( ddbltfx );
  2204. ddbltfx.dwFillColor = RGB(0,0,0);
  2205. rcRect.left = 0;
  2206. rcRect.top = 0;
  2207. rcRect.right = 640;
  2208. rcRect.bottom = 480;
  2209. while (1)
  2210. {
  2211. hRet = lpFrontBuffer->Blt(&rcRect, NULL, NULL, DDBLT_COLORFILL, &ddbltfx);
  2212. if (hRet == DD_OK)
  2213. {
  2214. break;
  2215. }
  2216. if (hRet == DDERR_SURFACELOST)
  2217. {
  2218. hRet = RestoreSurfaces();
  2219. if (hRet != DD_OK)
  2220. break;
  2221. }
  2222. if (hRet != DDERR_WASSTILLDRAWING)
  2223. break;
  2224. }
  2225. while (1)
  2226. {
  2227. hRet = lpBackBuffer->Blt(&rcRect, NULL, NULL, DDBLT_COLORFILL, &ddbltfx);
  2228. if (hRet == DD_OK)
  2229. {
  2230. break;
  2231. }
  2232. if (hRet == DDERR_SURFACELOST)
  2233. {
  2234. hRet = RestoreSurfaces();
  2235. if (hRet != DD_OK)
  2236. break;
  2237. }
  2238. if (hRet != DDERR_WASSTILLDRAWING)
  2239. break;
  2240. }
  2241. bltText("PHOTON AMMO",90,45);
  2242. bltText("WEAPON ADVANCE",90,95);
  2243. bltText("100 POINTS BONUS",90,145);
  2244. bltText("LASER AMMO",90,195);
  2245. bltText("SHIELD CHARGE",90,245);
  2246. bltText("LEFT, RIGHT - MOVE SHIP",50,290);
  2247. bltText("DOWN OR ENTER - STOP SHIP",50,325);
  2248. bltText("CTRL - CHANGE WEAPON",50,360);
  2249. bltText("PRESS ANY KEY TO CONTINUE",140,450);
  2250. bBlink = FALSE;
  2251. dwTime = 0;
  2252. }
  2253. ddbltfx.dwSize = sizeof( ddbltfx );
  2254. ddbltfx.dwFillColor = dwFillColor;
  2255. rcRect.left = 50;
  2256. rcRect.top = 40;
  2257. rcRect.right = 75;
  2258. rcRect.bottom = 270;
  2259. while (1)
  2260. {
  2261. hRet = lpBackBuffer->Blt(&rcRect, NULL, NULL, DDBLT_COLORFILL, &ddbltfx);
  2262. if (hRet == DD_OK)
  2263. {
  2264. break;
  2265. }
  2266. if (hRet == DDERR_SURFACELOST)
  2267. {
  2268. hRet = RestoreSurfaces();
  2269. if (hRet != DD_OK)
  2270. break;
  2271. }
  2272. if (hRet != DDERR_WASSTILLDRAWING)
  2273. break;
  2274. }
  2275. if (bBlink == TRUE)
  2276. {
  2277. ddbltfx.dwSize = sizeof( ddbltfx );
  2278. ddbltfx.dwFillColor = dwFillColor;
  2279. rcRect.left = 0;
  2280. rcRect.top = 450;
  2281. rcRect.right = 640;
  2282. rcRect.bottom = 475;
  2283. while (1)
  2284. {
  2285. hRet = lpBackBuffer->Blt(&rcRect, NULL, NULL, DDBLT_COLORFILL, &ddbltfx);
  2286. if (hRet == DD_OK)
  2287. {
  2288. break;
  2289. }
  2290. if (hRet == DDERR_SURFACELOST)
  2291. {
  2292. hRet = RestoreSurfaces();
  2293. if (hRet != DD_OK)
  2294. break;
  2295. }
  2296. if (hRet != DDERR_WASSTILLDRAWING)
  2297. break;
  2298. }
  2299. dwTime = dwTime + 1;
  2300. if (dwTime == 20)
  2301. {
  2302. bltText("PRESS ANY KEY TO CONTINUE",140,450);
  2303. bBlink = FALSE;
  2304. dwTime = 0;
  2305. }
  2306. }
  2307. else
  2308. {
  2309. dwTime = dwTime + 1;
  2310. if (dwTime == 20)
  2311. {
  2312. //bltText("PRESS ANY KEY TO CONTINUE",140,450);
  2313. bBlink = TRUE;
  2314. dwTime = 0;
  2315. }
  2316. }
  2317. rcRect.left   = frame * 25;
  2318. rcRect.right  = (frame * 25) + 25;
  2319. rcRect.top    = 0;
  2320. rcRect.bottom = 25;
  2321. while (1)
  2322. {
  2323. hRet = lpBackBuffer->BltFast(50, 40,  lpExtra, &rcRect, TRUE);
  2324. if (hRet == DD_OK)
  2325. {
  2326. break;
  2327. }
  2328. if (hRet == DDERR_SURFACELOST)
  2329. {
  2330. hRet = RestoreSurfaces();
  2331. if (hRet != DD_OK)
  2332. break;
  2333. }
  2334. if (hRet != DDERR_WASSTILLDRAWING)
  2335. break;
  2336. }
  2337. rcRect.top    = 25;
  2338. rcRect.bottom = 50;
  2339. while (1)
  2340. {
  2341. hRet = lpBackBuffer->BltFast(50, 90,  lpExtra, &rcRect, TRUE);
  2342. if (hRet == DD_OK)
  2343. {
  2344. break;
  2345. }
  2346. if (hRet == DDERR_SURFACELOST)
  2347. {
  2348. hRet = RestoreSurfaces();
  2349. if (hRet != DD_OK)
  2350. break;
  2351. }
  2352. if (hRet != DDERR_WASSTILLDRAWING)
  2353. break;
  2354. }
  2355. rcRect.top    = 50;
  2356. rcRect.bottom = 75;
  2357. while (1)
  2358. {
  2359. hRet = lpBackBuffer->BltFast(50, 140,  lpExtra, &rcRect, TRUE);
  2360. if (hRet == DD_OK)
  2361. {
  2362. break;
  2363. }
  2364. if (hRet == DDERR_SURFACELOST)
  2365. {
  2366. hRet = RestoreSurfaces();
  2367. if (hRet != DD_OK)
  2368. break;
  2369. }
  2370. if (hRet != DDERR_WASSTILLDRAWING)
  2371. break;
  2372. }
  2373. rcRect.top    = 75;
  2374. rcRect.bottom = 100;
  2375. while (1)
  2376. {
  2377. hRet = lpBackBuffer->BltFast(50, 190,  lpExtra, &rcRect, TRUE);
  2378. if (hRet == DD_OK)
  2379. {
  2380. break;
  2381. }
  2382. if (hRet == DDERR_SURFACELOST)
  2383. {
  2384. hRet = RestoreSurfaces();
  2385. if (hRet != DD_OK)
  2386. break;
  2387. }
  2388. if (hRet != DDERR_WASSTILLDRAWING)
  2389. break;
  2390. }
  2391. rcRect.top    = 100;
  2392. rcRect.bottom = 125;
  2393. while (1)
  2394. {
  2395. hRet = lpBackBuffer->BltFast(50, 240,  lpExtra, &rcRect, TRUE);
  2396. if (hRet == DD_OK)
  2397. {
  2398. break;
  2399. }
  2400. if (hRet == DDERR_SURFACELOST)
  2401. {
  2402. hRet = RestoreSurfaces();
  2403. if (hRet != DD_OK)
  2404. break;
  2405. }
  2406. if (hRet != DDERR_WASSTILLDRAWING)
  2407. break;
  2408. }
  2409. frame++;
  2410. if (frame == 19)
  2411. frame = 0;
  2412. while( 1 )
  2413. {
  2414. ddrval = lpFrontBuffer->Flip(NULL, 0 );
  2415. if( ddrval == DD_OK )
  2416. {
  2417. break;
  2418. }
  2419. if( ddrval == DDERR_SURFACELOST )
  2420. {
  2421. if( !RestoreSurfaces() )
  2422. {
  2423. return;
  2424. }
  2425. }
  2426. if( ddrval != DDERR_WASSTILLDRAWING )
  2427. {
  2428. break;
  2429. }
  2430. }
  2431. lastTickCount = thisTickCount;
  2432. return;
  2433. }
  2434.    return;
  2435. }
  2436. void DestroyGame()
  2437. {
  2438. // Destroy game objects
  2439. Ovni* auxpUFO;
  2440. Bullet* auxpBullet;
  2441. Extra* pAuxExtra;
  2442. while(pExtra !=NULL)
  2443. {
  2444. pAuxExtra = pExtra->GetNext();
  2445. delete(pExtra);
  2446. pExtra = pAuxExtra;
  2447. }
  2448. while(pUFO !=NULL)
  2449. {
  2450. auxpUFO = pUFO->GetNext();
  2451. delete(pUFO);
  2452. pUFO = auxpUFO;
  2453. }
  2454. while(pBullet !=NULL)
  2455. {
  2456. auxpBullet = pBullet->GetNext();
  2457. delete(pBullet);
  2458. pBullet = auxpBullet;
  2459. }
  2460.     if( lpBkGround != NULL )
  2461.         lpBkGround->Release();
  2462.     if( lpBackBuffer != NULL )
  2463. lpBackBuffer->Release();
  2464.     if( lpFrontBuffer != NULL )
  2465.         lpFrontBuffer->Release();
  2466.     if( lpUfo != NULL )
  2467.         lpUfo->Release();
  2468.     if( lpShoot != NULL )
  2469.         lpShoot->Release();
  2470.     if( lpShoot2 != NULL )
  2471.         lpShoot2->Release();
  2472. if( lpShip != NULL )
  2473.         lpShip->Release();
  2474.     if( lpBoom != NULL )
  2475.         lpBoom->Release();
  2476.     if( lpUfoShoot != NULL )
  2477.         lpUfoShoot->Release();
  2478.     if( lpAlpha != NULL )
  2479.         lpAlpha->Release();
  2480.     if( lpShipBoom != NULL )
  2481.         lpShipBoom->Release();
  2482.     if( lpArtPalette != NULL )
  2483.         lpArtPalette->Release();
  2484.     if( lpDD != NULL )
  2485.         lpDD->Release();
  2486. DestroySound();
  2487. return;
  2488. }
  2489. BOOL CleanupAndExit( char *err)
  2490. {
  2491. #ifdef DEBUG
  2492.     wsprintf(DebugBuf, "___CleanupAndExit  err = %sn", err );
  2493.     OutputDebugString( DebugBuf );
  2494. #endif
  2495.     // make the cursor visible
  2496.     SetCursor(LoadCursor( NULL, IDC_ARROW ));
  2497. DestroyGame();
  2498.         MessageBox( hWndMain, err, "ERROR", MB_OK );
  2499.     return FALSE;
  2500. }
  2501. // Surface loading functions
  2502. BOOL LoadUfoSurface(int iFlags)
  2503. {
  2504.     HRESULT     ddrval;
  2505.     HBITMAP     hbm;
  2506. ddrval = lpUfo->Restore();
  2507.     if( ddrval != DD_OK )
  2508.         return FALSE;
  2509. ddrval = lpBoom->Restore();
  2510.     if( ddrval != DD_OK )
  2511.         return FALSE;
  2512.     switch(iLevel % 6)
  2513. {
  2514. case 0:
  2515. hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_UFO3), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2516. break;
  2517. case 4:
  2518. hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_UFO2), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2519. break;
  2520. case 5:
  2521. hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_UFO2), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2522. break;
  2523. default:
  2524. hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_UFO), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2525. break;
  2526. };
  2527.     if( NULL == hbm )
  2528.         return FALSE;
  2529.     ddrval = DDCopyBitmap(lpUfo, hbm, 0, 0, 350, 700 );
  2530.     if( ddrval != DD_OK )
  2531.     {
  2532.         DeleteObject( hbm );
  2533.         return FALSE;
  2534.     }
  2535.     switch(iLevel % 6)
  2536. {
  2537. case 0:
  2538. hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BOOM3), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2539. break;
  2540. case 4:
  2541. hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BOOM2), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2542. break;
  2543. case 5:
  2544. hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BOOM2), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2545. break;
  2546. default:
  2547. hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BOOM), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2548. break;
  2549. };
  2550.     if( NULL == hbm )
  2551.         return FALSE;
  2552.     ddrval = DDCopyBitmap(lpBoom, hbm, 0, 0, 350, 280);
  2553.     if( ddrval != DD_OK )
  2554.     {
  2555.         DeleteObject( hbm );
  2556.         return FALSE;
  2557.     }
  2558. return TRUE;
  2559. }
  2560. BOOL RestoreSurfaces( void )
  2561. {
  2562.     HRESULT     ddrval;
  2563.     HBITMAP     hbm;
  2564.     ddrval = lpShip->Restore();
  2565.     if( ddrval != DD_OK )
  2566.         return FALSE;
  2567.     ddrval = lpShipBoom->Restore();
  2568.     if( ddrval != DD_OK )
  2569.         return FALSE;
  2570.     ddrval = lpShoot->Restore();
  2571.     if( ddrval != DD_OK )
  2572.         return FALSE;
  2573.     ddrval = lpUfoShoot->Restore();
  2574.     if( ddrval != DD_OK )
  2575.         return FALSE;
  2576.     ddrval = lpBackBuffer->Restore();
  2577.     if( ddrval != DD_OK )
  2578.         return FALSE;
  2579.     ddrval = lpBkGround->Restore();
  2580.     if( ddrval != DD_OK )
  2581.         return FALSE;
  2582.     ddrval = lpFrontBuffer->Restore();
  2583.     if( ddrval != DD_OK )
  2584.         return FALSE;
  2585.     // Create and set the palette for the art bitmap
  2586.     lpArtPalette = DDLoadPalette( lpDD, MAKEINTRESOURCE(IDB_BOOM));
  2587.     if( NULL == lpArtPalette )
  2588.         return CleanupAndExit("DDLoadPalette UFO");
  2589.     // set the palette before loading the art
  2590.     lpFrontBuffer->SetPalette(lpArtPalette );
  2591. if (LoadUfoSurface(iLevel) == FALSE)
  2592. return FALSE;
  2593.     hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_FUNDO), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2594.     if( NULL == hbm )
  2595.         return FALSE;
  2596.     ddrval = DDCopyBitmap(lpBkGround, hbm, 0, 0, 640, 480 );
  2597.     if( ddrval != DD_OK )
  2598.     {
  2599.         DeleteObject( hbm );
  2600.         return FALSE;
  2601.     }
  2602.     hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_SHIP), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2603.     if( NULL == hbm )
  2604.         return FALSE;
  2605.     ddrval = DDCopyBitmap(lpShip, hbm, 0, 0, 350, 350 );
  2606.     if( ddrval != DD_OK )
  2607.     {
  2608.         DeleteObject( hbm );
  2609.         return FALSE;
  2610.     }
  2611.     hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_SHOOT), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2612.     if( NULL == hbm )
  2613.         return FALSE;
  2614.     ddrval = DDCopyBitmap(lpShoot, hbm, 0, 0, 220, 20);
  2615.     if( ddrval != DD_OK )
  2616.     {
  2617.         DeleteObject( hbm );
  2618.         return FALSE;
  2619.     }
  2620.     hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_SHOOT2), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2621.     if( NULL == hbm )
  2622.         return FALSE;
  2623.     ddrval = DDCopyBitmap(lpShoot2, hbm, 0, 0, 20, 20);
  2624.     if( ddrval != DD_OK )
  2625.     {
  2626.         DeleteObject( hbm );
  2627.         return FALSE;
  2628.     }
  2629.     hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_UFOSHOOT), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2630.     if( NULL == hbm )
  2631.         return FALSE;
  2632.     ddrval = DDCopyBitmap(lpUfoShoot, hbm, 0, 0, 400, 20);
  2633.     if( ddrval != DD_OK )
  2634.     {
  2635.         DeleteObject( hbm );
  2636.         return FALSE;
  2637.     }
  2638.     hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_SHIPEXPLODE), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2639.     if( NULL == hbm )
  2640.         return FALSE;
  2641.     ddrval = DDCopyBitmap(lpShipBoom, hbm, 0, 0, 490, 210);
  2642.     if( ddrval != DD_OK )
  2643.     {
  2644.         DeleteObject( hbm );
  2645.         return FALSE;
  2646.     }
  2647.     hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_ALPHA), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2648.     if( NULL == hbm )
  2649.         return FALSE;
  2650.     ddrval = DDCopyBitmap(lpAlpha, hbm, 0, 0, 623, 15);
  2651.     if( ddrval != DD_OK )
  2652.     {
  2653.         DeleteObject( hbm );
  2654.         return FALSE;
  2655.     }
  2656.     hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_SELECT), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2657.     if( NULL == hbm )
  2658.         return FALSE;
  2659.     ddrval = DDCopyBitmap(lpSelect, hbm, 0, 0, 640, 20);
  2660.     if( ddrval != DD_OK )
  2661.     {
  2662.         DeleteObject( hbm );
  2663.         return FALSE;
  2664.     }
  2665.     hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_STATUSBAR), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2666.     if( NULL == hbm )
  2667.         return FALSE;
  2668.     ddrval = DDCopyBitmap(lpStatusBar, hbm, 0, 0, 522, 20);
  2669.     if( ddrval != DD_OK )
  2670.     {
  2671.         DeleteObject( hbm );
  2672.         return FALSE;
  2673.     }
  2674.     hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_EXTRA), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2675.     if( NULL == hbm )
  2676.         return FALSE;
  2677.     ddrval = DDCopyBitmap(lpExtra, hbm, 0, 0, 500, 125);
  2678.     if( ddrval != DD_OK )
  2679.     {
  2680.         DeleteObject( hbm );
  2681.         return FALSE;
  2682.     }
  2683.     // set colorfill colors and color keys according to bitmap contents
  2684.     //dwFillColor = DDColorMatch( lpUfo, RGB(0,0,0) );
  2685. dwFillColor = DDColorMatch( lpBackBuffer, RGB(0,0,0) );
  2686. //Get Color Key
  2687. HDC hDC;
  2688. COLORREF rgbColor;
  2689. lpShip->GetDC(&hDC);
  2690. rgbColor = GetPixel(hDC,0,0);
  2691. lpShip->ReleaseDC(hDC);
  2692.     
  2693. DDSetColorKey(lpUfo, RGB(0,0,0));
  2694. DDSetColorKey(lpShip, rgbColor);
  2695. DDSetColorKey(lpShoot, RGB(0,0,0));
  2696. DDSetColorKey(lpShoot2, RGB(0,0,0));
  2697. DDSetColorKey(lpBoom, RGB(0,0,0));
  2698. DDSetColorKey(lpUfoShoot, RGB(0,0,0));
  2699. DDSetColorKey(lpShipBoom, RGB(19,19,19));
  2700. DDSetColorKey(lpAlpha, RGB(0,0,0));
  2701. DDSetColorKey(lpSelect, RGB(0,0,0));
  2702. DDSetColorKey(lpStatusBar, RGB(0,0,0));
  2703. DDSetColorKey(lpExtra, RGB(0,0,0));
  2704.     return TRUE;
  2705. }
  2706. BOOL initApplication( HINSTANCE hInstance, int nCmdShow )
  2707. {
  2708.     WNDCLASS    wc;
  2709.     BOOL        rc;
  2710.     wc.style = CS_DBLCLKS;
  2711.     wc.lpfnWndProc = MainWndproc;
  2712.     wc.cbClsExtra = 0;
  2713.     wc.cbWndExtra = 0;
  2714.     wc.hInstance = hInstance;
  2715.     wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_UFO));
  2716.     wc.hCursor = LoadCursor( NULL, IDC_ARROW );
  2717.     wc.hbrBackground = CreateSolidBrush(RGB(0,0,0));
  2718.     wc.lpszMenuName =  NULL;
  2719.     wc.lpszClassName = "InvasionClass";
  2720.     rc = RegisterClass( &wc );
  2721.     if( !rc )
  2722.     {
  2723.         return FALSE;
  2724.     }
  2725.     hWndMain = CreateWindowEx(0,  // WS_EX_TOPMOST,
  2726.         "InvasionClass",
  2727.         "Invasion",
  2728.         WS_VISIBLE | // so we don't have to call ShowWindow
  2729.         WS_POPUP, // |   // non-app window
  2730.         //WS_SYSMENU//so we get an icon in the tray
  2731.         0,
  2732.         0,
  2733.         GetSystemMetrics(SM_CXSCREEN),
  2734.         GetSystemMetrics(SM_CYSCREEN),
  2735.         NULL,
  2736.         NULL,
  2737.         hInstance,
  2738.         NULL );
  2739.     if( !hWndMain )
  2740.     {
  2741.         return FALSE;
  2742.     }
  2743.     UpdateWindow( hWndMain );
  2744.     return TRUE;
  2745. } /* initApplication */
  2746. BOOL InitializeGame( void )
  2747. {
  2748.     DDCAPS ddcaps;
  2749.     HRESULT ddrval;
  2750.     DDSURFACEDESC2 ddsd;
  2751.     DDSCAPS2 ddscaps;
  2752. LPDIRECTDRAW pDD;
  2753.     LPVOID  lpSurface  = NULL;
  2754.     
  2755. ShowCursor(FALSE);
  2756.     srand( GetTickCount() );
  2757. ddrval = DirectDrawCreate( NULL, &pDD, NULL );
  2758.     if( ddrval != DD_OK )
  2759.         return CleanupAndExit("DirectDrawCreate Failed!");
  2760.     // Fetch DirectDraw7 interface
  2761.     ddrval = pDD->QueryInterface(IID_IDirectDraw7, (LPVOID*)&lpDD);
  2762.     if (ddrval != DD_OK)
  2763.         return CleanupAndExit("QueryInterface Failed!");
  2764.     pDD->Release();
  2765.     
  2766. ddrval = lpDD->SetCooperativeLevel(hWndMain, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
  2767.     if( ddrval != DD_OK )
  2768.         return CleanupAndExit("SetCooperativeLevel Failed");
  2769.     // set the mode
  2770.     ddrval = lpDD->SetDisplayMode(640, 480, 16, 0, 0 );
  2771.     if( ddrval != DD_OK )
  2772.         return CleanupAndExit("SetDisplayMode Failed!");
  2773.     // check the color key hardware capabilities
  2774.     dwTransType = DDBLTFAST_SRCCOLORKEY;
  2775.     ddcaps.dwSize = sizeof( ddcaps );
  2776.     // Create surfaces
  2777.     memset( &ddsd, 0, sizeof( ddsd ) );
  2778.     ddsd.dwSize = sizeof( ddsd );
  2779.     ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
  2780.     
  2781. ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |
  2782.                           DDSCAPS_FLIP |
  2783.                           DDSCAPS_COMPLEX;
  2784.     ddsd.dwBackBufferCount = 1;
  2785.     ddrval = lpDD->CreateSurface(&ddsd, &lpFrontBuffer, NULL );
  2786.     if( ddrval != DD_OK )
  2787.         return CleanupAndExit("CreateSurface FrontBuffer Failed!");
  2788.     // get a pointer to the back buffer
  2789.     
  2790. ZeroMemory(&ddscaps, sizeof(ddscaps));
  2791. ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
  2792.     ddrval = lpFrontBuffer->GetAttachedSurface(
  2793.                 &ddscaps,
  2794.                 &lpBackBuffer);
  2795.     if( ddrval != DD_OK )
  2796. {
  2797.         return CleanupAndExit("GetAttachedSurfaceError");
  2798. }
  2799.     
  2800. // Create a surface for each one of the objects we are going to use in the game
  2801. // Then 碽lit this surfaces to the main surface
  2802. ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
  2803.     ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |
  2804.   DDSCAPS_VIDEOMEMORY;
  2805. ddsd.dwWidth = 350;
  2806.     ddsd.dwHeight = 700;
  2807.     ddrval = lpDD->CreateSurface(&ddsd, &lpUfo, NULL );
  2808.     if( ddrval != DD_OK )
  2809. {
  2810. if(ddrval == DDERR_OUTOFMEMORY)
  2811. {
  2812. ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |
  2813.   DDSCAPS_SYSTEMMEMORY;
  2814. ddrval = lpDD->CreateSurface(&ddsd, &lpUfo, NULL );
  2815. if(ddrval != DD_OK)
  2816. return CleanupAndExit("CreateSurface lpUfo Failed!");
  2817. }
  2818. else
  2819. return CleanupAndExit("CreateSurface lpUfo Failed!");
  2820. }
  2821. dwTransType = DDBLTFAST_NOCOLORKEY;
  2822.     ddsd.dwWidth = 640;
  2823.     ddsd.dwHeight = 480;
  2824.     ddrval = lpDD->CreateSurface(&ddsd, &lpBkGround, NULL );
  2825.     if( ddrval != DD_OK )
  2826. {
  2827. if(ddrval == DDERR_OUTOFMEMORY)
  2828. {
  2829. ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |
  2830.   DDSCAPS_SYSTEMMEMORY;
  2831. ddrval = lpDD->CreateSurface(&ddsd, &lpBkGround, NULL );
  2832. if(ddrval != DD_OK)
  2833. return CleanupAndExit("CreateSurface lpUfo Failed!");
  2834. }
  2835. else
  2836. return CleanupAndExit("CreateSurface Background Failed!");
  2837. }
  2838. dwTransType = DDBLTFAST_SRCCOLORKEY;
  2839.     ddsd.dwWidth = 350;
  2840.     ddsd.dwHeight = 350;
  2841.     ddrval = lpDD->CreateSurface(&ddsd, &lpShip, NULL );
  2842.     if( ddrval != DD_OK )
  2843. {
  2844. if(ddrval == DDERR_OUTOFMEMORY)
  2845. {
  2846. ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |
  2847.   DDSCAPS_SYSTEMMEMORY;
  2848. ddrval = lpDD->CreateSurface(&ddsd, &lpShip, NULL );
  2849. if(ddrval != DD_OK)
  2850. return CleanupAndExit("CreateSurface Background Failed!");
  2851. }
  2852. else
  2853. return CleanupAndExit("CreateSurface Background Failed!");
  2854. }
  2855.     ddsd.dwWidth = 220;
  2856.     ddsd.dwHeight = 20;
  2857.     ddrval = lpDD->CreateSurface(&ddsd, &lpShoot, NULL );
  2858.     if( ddrval != DD_OK )
  2859. {
  2860. if(ddrval == DDERR_OUTOFMEMORY)
  2861. {
  2862. ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |
  2863.   DDSCAPS_SYSTEMMEMORY;
  2864. ddrval = lpDD->CreateSurface(&ddsd, &lpShoot, NULL );
  2865. if(ddrval != DD_OK)
  2866. return CleanupAndExit("CreateSurface Shoot Failed!");
  2867. }
  2868. else
  2869. return CleanupAndExit("CreateSurface Shoot Failed!");
  2870. }
  2871.     ddsd.dwWidth = 20;
  2872.     ddsd.dwHeight = 20;
  2873.     ddrval = lpDD->CreateSurface(&ddsd, &lpShoot2, NULL );
  2874.     if( ddrval != DD_OK )
  2875. {
  2876. if(ddrval == DDERR_OUTOFMEMORY)
  2877. {
  2878. ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |
  2879.   DDSCAPS_SYSTEMMEMORY;
  2880. ddrval = lpDD->CreateSurface(&ddsd, &lpShoot2, NULL );
  2881. if(ddrval != DD_OK)
  2882. return CleanupAndExit("CreateSurface Shoot 2 Failed!");
  2883. }
  2884. else
  2885. return CleanupAndExit("CreateSurface  Shoot 2 Failed!");
  2886. }
  2887.     
  2888. ddsd.dwWidth = 350;
  2889.     ddsd.dwHeight = 280;
  2890.     ddrval = lpDD->CreateSurface(&ddsd, &lpBoom, NULL );
  2891.     if( ddrval != DD_OK )
  2892. {
  2893. if(ddrval == DDERR_OUTOFMEMORY)
  2894. {
  2895. ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |
  2896.   DDSCAPS_SYSTEMMEMORY;
  2897. ddrval = lpDD->CreateSurface(&ddsd, &lpBoom, NULL );
  2898. if(ddrval != DD_OK)
  2899. return CleanupAndExit("CreateSurface Boom Failed!");
  2900. }
  2901. else
  2902. return CleanupAndExit("CreateSurface  Boom Failed!");
  2903. }
  2904.     ddsd.dwWidth = 400;
  2905.     ddsd.dwHeight = 20;
  2906.     ddrval = lpDD->CreateSurface(&ddsd, &lpUfoShoot, NULL );
  2907.     if( ddrval != DD_OK )
  2908. {
  2909. if(ddrval == DDERR_OUTOFMEMORY)
  2910. {
  2911. ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |
  2912.   DDSCAPS_SYSTEMMEMORY;
  2913. ddrval = lpDD->CreateSurface(&ddsd, &lpUfoShoot, NULL );
  2914. if(ddrval != DD_OK)
  2915. return CleanupAndExit("CreateSurface UfoShoot Failed!");
  2916. }
  2917. else
  2918. return CleanupAndExit("CreateSurface  UfoShoot Failed!");
  2919. }
  2920.     ddsd.dwWidth = 490;
  2921.     ddsd.dwHeight = 210;
  2922.     ddrval = lpDD->CreateSurface(&ddsd, &lpShipBoom, NULL );
  2923.     if( ddrval != DD_OK )
  2924. {
  2925. if(ddrval == DDERR_OUTOFMEMORY)
  2926. {
  2927. ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |
  2928.   DDSCAPS_SYSTEMMEMORY;
  2929. ddrval = lpDD->CreateSurface(&ddsd, &lpShipBoom, NULL );
  2930. if(ddrval != DD_OK)
  2931. return CleanupAndExit("CreateSurface ShipExplode Failed!");
  2932. }
  2933. else
  2934. return CleanupAndExit("CreateSurface  ShipExplode Failed!");
  2935. }
  2936.     ddsd.dwWidth = 623;
  2937.     ddsd.dwHeight = 15;
  2938.     ddrval = lpDD->CreateSurface(&ddsd, &lpAlpha, NULL );
  2939.     if( ddrval != DD_OK )
  2940. {
  2941. if(ddrval == DDERR_OUTOFMEMORY)
  2942. {
  2943. ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |
  2944.   DDSCAPS_SYSTEMMEMORY;
  2945. ddrval = lpDD->CreateSurface(&ddsd, &lpAlpha, NULL );
  2946. if(ddrval != DD_OK)
  2947. return CleanupAndExit("CreateSurface Alphabet Failed!");
  2948. }
  2949. else
  2950. return CleanupAndExit("CreateSurface  Alphabet Failed!");
  2951. }
  2952.     ddsd.dwWidth = 640;
  2953.     ddsd.dwHeight = 20;
  2954.     ddrval = lpDD->CreateSurface(&ddsd, &lpSelect, NULL );
  2955.     if( ddrval != DD_OK )
  2956. {
  2957. if(ddrval == DDERR_OUTOFMEMORY)
  2958. {
  2959. ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |
  2960.   DDSCAPS_SYSTEMMEMORY;
  2961. ddrval = lpDD->CreateSurface(&ddsd, &lpSelect, NULL );
  2962. if(ddrval != DD_OK)
  2963. return CleanupAndExit("CreateSurface Selection Failed!");
  2964. }
  2965. else
  2966. return CleanupAndExit("CreateSurface  Selection Failed!");
  2967. }
  2968.     ddsd.dwWidth = 522;
  2969.     ddsd.dwHeight = 20;
  2970.     ddrval = lpDD->CreateSurface(&ddsd, &lpStatusBar, NULL );
  2971.     if( ddrval != DD_OK )
  2972. {
  2973. if(ddrval == DDERR_OUTOFMEMORY)
  2974. {
  2975. ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |
  2976.   DDSCAPS_SYSTEMMEMORY;
  2977. ddrval = lpDD->CreateSurface(&ddsd, &lpStatusBar, NULL );
  2978. if(ddrval != DD_OK)
  2979. return CleanupAndExit("CreateSurface StatusBar Failed!");
  2980. }
  2981. else
  2982. return CleanupAndExit("CreateSurface  StatusBar Failed!");
  2983. }
  2984.     ddsd.dwWidth = 500;
  2985.     ddsd.dwHeight = 125;
  2986.     ddrval = lpDD->CreateSurface(&ddsd, &lpExtra, NULL );
  2987.     if( ddrval != DD_OK )
  2988. {
  2989. if(ddrval == DDERR_OUTOFMEMORY)
  2990. {
  2991. ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |
  2992.   DDSCAPS_SYSTEMMEMORY;
  2993. ddrval = lpDD->CreateSurface(&ddsd, &lpExtra, NULL );
  2994. if(ddrval != DD_OK)
  2995. return CleanupAndExit("CreateSurface Extras Failed!");
  2996. }
  2997. else
  2998. return CleanupAndExit("CreateSurface  Extras Failed!");
  2999. }
  3000.     if( !RestoreSurfaces() )
  3001.         return CleanupAndExit("RestoreSurfaces Failed!");
  3002. return 1;
  3003. }
  3004. int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,
  3005.                         int nCmdShow )
  3006. {
  3007.     MSG     msg;
  3008.     // save off application instance
  3009.     hInst = hInstance;
  3010.     if( !initApplication(hInstance, nCmdShow) )
  3011.     {
  3012.         return FALSE;
  3013.     }
  3014.     // Call the initialization procedure
  3015. if( !InitializeGame() )
  3016.     {
  3017.         OutputDebugString("ERROR STARTING THE GAMEn");
  3018. DestroyWindow( hWndMain );
  3019.         return FALSE;
  3020.     }
  3021.     // Initialize Sound Buffer
  3022. InitializeSound();
  3023.     // Go throught the message look
  3024. // When Idle update the screen
  3025. while( 1 )
  3026.     {
  3027.         
  3028. if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) )
  3029.         {
  3030.             if( !GetMessage( &msg, NULL, 0, 0 ) )
  3031.             {
  3032.                 return msg.wParam;
  3033.             }
  3034.             TranslateMessage(&msg);
  3035.             DispatchMessage(&msg);
  3036.         }
  3037.         else if ( bIsActive )
  3038.         {
  3039.             
  3040. UpdateFrame();
  3041.         }
  3042.         else
  3043.         {
  3044.             WaitMessage();
  3045.         }
  3046.     }
  3047. }