Winmain.cpp
上传用户:sycq158
上传日期:2008-10-22
资源大小:15361k
文件大小: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. if (iShield <= 0 && iShipState == 0)
  1370. {
  1371. iShield = 0;
  1372. iShipState = 1;
  1373. iShipMov = 0;
  1374. ArgPosX = 0;
  1375. ArgPosY = 0;
  1376. rcRect.left = ArgPosX;
  1377. rcRect.top = ArgPosY;
  1378. rcRect.right = ArgPosX + 70;
  1379. rcRect.bottom = ArgPosY + 70;
  1380. inc = 70;
  1381. }
  1382. if (iShipState == SHIP_OK &&
  1383. pExtra != NULL)
  1384. {
  1385. int iType;
  1386. // check if we hit an extra
  1387. // if so, select the kinf of extra
  1388. iType = CheckHitExtra();
  1389. switch (iType)
  1390. {
  1391. case 1:
  1392. iPhotonAmmo += 25;
  1393. if (iPhotonAmmo > 999)
  1394. iPhotonAmmo = 999;
  1395. SndObjStop(hsoGetExtra);
  1396. SndObjPlay(hsoGetExtra, NULL);
  1397. break;
  1398. case 2:
  1399. iMaxWeapon++;
  1400. if (iMaxWeapon > 5)
  1401. iMaxWeapon = 5;
  1402. else
  1403. iWeapon = iMaxWeapon;
  1404. SndObjStop(hsoGetExtra);
  1405. SndObjPlay(hsoGetExtra, NULL);
  1406. break;
  1407. case 3:
  1408. score += 100;
  1409. SndObjStop(hsoGetExtra);
  1410. SndObjPlay(hsoGetExtra, NULL);
  1411. break;
  1412. case 4:
  1413. iLaserAmmo += 40;
  1414. if (iLaserAmmo > 999)
  1415. iLaserAmmo = 999;
  1416. SndObjStop(hsoGetExtra);
  1417. SndObjPlay(hsoGetExtra, NULL);
  1418. break;
  1419. case 5:
  1420. iShield += 10;
  1421. if (iShield > 50)
  1422. iShield = 50;
  1423. SndObjStop(hsoGetExtra);
  1424. SndObjPlay(hsoGetExtra, NULL);
  1425. break;
  1426. }
  1427. }
  1428. // Draw the ship sprite
  1429. while (1)
  1430. {
  1431. if (iShipState == 0)
  1432. hRet = lpBackBuffer->BltFast(iShipPos,380, lpShip, &rcRect, TRUE);
  1433. else
  1434. hRet = lpBackBuffer->BltFast(iShipPos,380, lpShipBoom, &rcRect, TRUE);
  1435. if (hRet == DD_OK)
  1436. {
  1437. break;
  1438. }
  1439. if (hRet == DDERR_SURFACELOST)
  1440. {
  1441. hRet = RestoreSurfaces();
  1442. if (hRet != DD_OK)
  1443. break;
  1444. }
  1445. if (hRet != DDERR_WASSTILLDRAWING)
  1446. break;
  1447. }
  1448. switch (iShipState)
  1449. {
  1450. case SHIP_OK:
  1451. ArgPosX += inc;
  1452. if (ArgPosX == 350 && inc > 0)
  1453. {
  1454. ArgPosX = 0;
  1455. ArgPosY += inc;
  1456. if (ArgPosY == 350)
  1457. {
  1458. ArgPosX=280;
  1459. ArgPosY=280;
  1460. inc = -70;
  1461. return;
  1462. }
  1463. }
  1464. if (ArgPosX == -70 && inc < 0)
  1465. {
  1466. ArgPosX = 280;
  1467. ArgPosY += inc;
  1468. if (ArgPosY == -70)
  1469. {
  1470. inc = 70;
  1471. ArgPosX = 0;
  1472. ArgPosY = 0;
  1473. }
  1474. }
  1475. break;
  1476. case SHIP_EXPLODING:
  1477. ArgPosX += inc;
  1478. if (ArgPosX == 490 && inc > 0)
  1479. {
  1480. ArgPosX = 0;
  1481. ArgPosY += inc;
  1482. if (ArgPosY == 210)
  1483. {
  1484. dwShipExplode = GetTickCount();
  1485. iShipState = SHIP_DESTROYED;
  1486. return;
  1487. }
  1488. }
  1489. break;
  1490. }
  1491. }
  1492. BOOL CheckHit(Ovni* pCheckUfo)
  1493. {
  1494. Bullet *pFirstBullet, *pPrevBullet, *pNextBullet;;
  1495. // Check if we have hitted and UFO
  1496. if (pCheckUfo->isExploding() == TRUE) 
  1497. return FALSE;
  1498. pPrevBullet = NULL;
  1499. pNextBullet = NULL;
  1500. pFirstBullet = pBullet;
  1501. while (pBullet != NULL)
  1502. {
  1503. if ((pBullet->GetX() > pCheckUfo->GetX()    &&
  1504. pBullet->GetX() < pCheckUfo->GetX()+64 &&
  1505. pBullet->GetY() > pCheckUfo->GetY()    &&
  1506. pBullet->GetY() < pCheckUfo->GetY()+56) &&
  1507. (pBullet->GetType() != 1))
  1508. {
  1509. pCheckUfo->LowStr(pBullet->GetPower());
  1510. if (pPrevBullet != NULL)
  1511. pPrevBullet->SetNext( pBullet->GetNext() );
  1512. pNextBullet = pBullet->GetNext();
  1513. if (pNextBullet != NULL)
  1514. pNextBullet->SetPrev(pPrevBullet);
  1515. if (pBullet == pFirstBullet)
  1516. pFirstBullet=pBullet->GetNext();
  1517. DestroyBullet(pBullet);
  1518. delete(pBullet);
  1519. pBullet = pFirstBullet;
  1520. if (pCheckUfo->GetStr() <= 0)
  1521. {
  1522. return TRUE;
  1523. }
  1524. else
  1525. {
  1526. score += 1;
  1527. SndObjStop(hsoSelect);
  1528. SndObjPlay(hsoSelect,NULL);
  1529. return FALSE;
  1530. }
  1531. }
  1532. pPrevBullet = pBullet;
  1533. pBullet = pBullet->GetNext();
  1534. }
  1535. pBullet = pFirstBullet;
  1536. return FALSE;
  1537. }
  1538. BOOL CheckCrash(Ovni* pCheck)
  1539. {
  1540. // Check if we have creashed in an UFO
  1541. Ovni *pFirst;
  1542. pFirst = pUFO;
  1543. while(pUFO != NULL)
  1544. {
  1545. if (pUFO->isExploding() == FALSE      &&
  1546. pUFO->GetY() == pCheck->GetY()    &&
  1547. pUFO != pCheck)
  1548. {
  1549. if (pCheck->GetX() < pUFO->GetX())
  1550. {
  1551. if (pUFO->GetX() - pCheck->GetX() <= 70 &&
  1552. (
  1553. (pCheck->GetInc() > 0 && pCheck->iType==0) ||
  1554. (pCheck->GetMov() == 0 && pCheck->iType==2)   )
  1555. )
  1556. return TRUE;
  1557. }
  1558. else
  1559. {
  1560. if (pCheck->GetX() - pUFO->GetX() <= 70 &&
  1561. ((pCheck->GetInc() < 0 &&
  1562. pCheck->iType == 0) ||
  1563. (pCheck->GetMov()==1 &&
  1564. pCheck->iType==2))
  1565. )
  1566. return TRUE;
  1567. }
  1568. }
  1569. pUFO = pUFO->GetNext();
  1570. }
  1571. pUFO = pFirst;
  1572. return FALSE;
  1573. }
  1574. void DrawUfo()
  1575. {
  1576. static int ArgPosY = 0;
  1577. static int ArgPosX = 0;
  1578. DWORD delayshoot;
  1579. Ovni* pFirst, *pNext, *pPrev, *pAux;
  1580. Bullet* pNewBullet, *pFirstBullet;
  1581. Extra* pNewExtra,  *pFirstExtra;
  1582.     
  1583.     pFirst = pUFO;
  1584. // draw all the ufos
  1585. pUFO = pFirst;
  1586. pPrev = NULL;
  1587. while(pUFO != NULL)
  1588. {
  1589. switch (pUFO->isExploding() )
  1590. {
  1591. case FALSE:
  1592. switch (pUFO->iType)
  1593. {
  1594. case 0:
  1595. delayshoot = 100;
  1596. break;
  1597. case 1:
  1598. delayshoot = 10;
  1599. break;
  1600. case 2:
  1601. delayshoot = 70;
  1602. break;
  1603. }
  1604. if (bShoot == TRUE)
  1605. {
  1606. pUFO->Move(iShipPos);
  1607. }
  1608. else
  1609. pUFO->Move(NULL);
  1610. pUFO->Draw(lpBackBuffer,lpUfo,NULL);
  1611. if (CheckHit(pUFO) == TRUE)
  1612. {
  1613. pUFO->SetState(1);
  1614. score += 10;
  1615. //SndObjStop(hsoBoom);
  1616. SndObjPlay(hsoBoom,0);
  1617. }
  1618. if ( (GetTickCount() - pUFO->dwLastShoot) > delayshoot)
  1619. {
  1620. if (rand()%SHOOTCHANCE == 0)
  1621. {
  1622. pUFO->dwLastShoot = GetTickCount();
  1623. pNewBullet = new Bullet;
  1624. if (pBullet == NULL)
  1625. {
  1626. pBullet = pNewBullet;
  1627. pNewBullet->SetType(1);
  1628. pNewBullet->SetXY(pUFO->GetX()+24, pUFO->GetY()+50);
  1629. }
  1630. else
  1631. {
  1632. pFirstBullet = pBullet;
  1633. while (pBullet->GetNext() != NULL)
  1634. pBullet = pBullet->GetNext();
  1635. pBullet->SetNext(pNewBullet);
  1636. pNewBullet->SetPrev(pBullet);
  1637. pNewBullet->SetXY(pUFO->GetX()+24, pUFO->GetY()+50);
  1638. pNewBullet->SetType(1);
  1639. pBullet = pFirstBullet;
  1640. }
  1641. //SndObjStop(hsoUfoShoot);
  1642. SndObjPlay(hsoUfoShoot,0);
  1643. }
  1644. }
  1645. break;
  1646. case TRUE:
  1647. if (pUFO->DestroyMe() == TRUE)
  1648. {
  1649. if (pPrev != NULL)
  1650. pPrev->SetNext(pUFO->GetNext());
  1651. pNext = pUFO->GetNext();
  1652. if (pUFO == pFirst)
  1653. pFirst=pUFO->GetNext();
  1654.  
  1655. //iRepaint = 1;
  1656. //pUFO->Repaint(lpBackBuffer, lpBkGround, 1); 
  1657. delete(pUFO);
  1658. if (pPrev != NULL)
  1659. pUFO = pPrev;
  1660. else
  1661. pUFO = pFirst;
  1662. break;
  1663. }
  1664. else
  1665. {
  1666. pUFO->Draw(lpBackBuffer,lpBoom,0);
  1667. if (pUFO->DropExtra() == TRUE)
  1668. {
  1669. pNewExtra = new Extra;
  1670. if (pExtra == NULL)
  1671. {
  1672. pExtra = pNewExtra;
  1673. pNewExtra->SetXY(pUFO->GetX()+22, pUFO->GetY()+20);
  1674. pNewExtra->SetType(pUFO->GetExtra());
  1675. }
  1676. else
  1677. {
  1678. pFirstExtra = pExtra;
  1679. while (pExtra->GetNext() != NULL)
  1680. pExtra = pExtra->GetNext();
  1681. pExtra->SetNext(pNewExtra);
  1682. pNewExtra->SetPrev(pExtra);
  1683. pNewExtra->SetXY(pUFO->GetX()+22, pUFO->GetY()+20);
  1684. pNewExtra->SetType(pUFO->GetExtra());
  1685. pExtra = pFirstExtra;
  1686. }
  1687. }
  1688. }
  1689. break;
  1690. }
  1691. pPrev = pUFO;
  1692. if (pUFO != NULL)
  1693. pUFO = pUFO->GetNext();
  1694. } //** While UFO-NEXT;
  1695. pUFO = pFirst;
  1696. pAux = pUFO;
  1697. while(pAux != NULL)
  1698. {
  1699. if (CheckCrash(pAux) == TRUE)
  1700. pAux->Crash();
  1701. pAux = pAux->GetNext();
  1702. };
  1703. pUFO = pFirst;
  1704. }
  1705. void bltText(char*  buffer, int  x, int y)
  1706. {
  1707. // Draw text to the screen
  1708. int pos;
  1709. int nextx;
  1710. RECT rcRect;
  1711. HRESULT hRet;
  1712. nextx = x;
  1713. while (*buffer != '')
  1714. {
  1715. if (*buffer != ' ')
  1716. {
  1717. if (*buffer >= 48 &&
  1718. *buffer <= 57)
  1719. pos = (int) *buffer - 48;
  1720. else
  1721. pos = (int) *buffer - 55;
  1722. if (*buffer == '@')
  1723. pos = 36;
  1724. if (*buffer == '-')
  1725. pos = 37;
  1726. if (*buffer == ',')
  1727. pos = 38;
  1728. if (*buffer == '.')
  1729. pos = 39;
  1730. rcRect.left = AA[pos].start;
  1731. rcRect.right = AA[pos].end;
  1732. rcRect.top = 0;
  1733. rcRect.bottom = 15;
  1734. while (1)
  1735. {
  1736. hRet = lpBackBuffer->BltFast(nextx, y, lpAlpha, &rcRect, TRUE);
  1737. if (hRet == DD_OK)
  1738. {
  1739. break;
  1740. }
  1741. if (hRet == DDERR_SURFACELOST)
  1742. {
  1743. hRet = RestoreSurfaces();
  1744. if (hRet != DD_OK)
  1745. break;
  1746. }
  1747. if (hRet != DDERR_WASSTILLDRAWING)
  1748. break;
  1749. }
  1750. while (1)
  1751. {
  1752. hRet = lpFrontBuffer->BltFast(nextx, y, lpAlpha, &rcRect, TRUE);
  1753. if (hRet == DD_OK)
  1754. {
  1755. break;
  1756. }
  1757. if (hRet == DDERR_SURFACELOST)
  1758. {
  1759. hRet = RestoreSurfaces();
  1760. if (hRet != DD_OK)
  1761. break;
  1762. }
  1763. if (hRet != DDERR_WASSTILLDRAWING)
  1764. break;
  1765. }
  1766. nextx += (AA[pos].end - AA[pos].start) + 1;
  1767. }
  1768. else
  1769. nextx += 15;
  1770. buffer++;
  1771. }
  1772. }
  1773. void DrawScore(int x, int y)
  1774. {
  1775. char scorebuf[9];
  1776.     unsigned int        rem;
  1777.     // blt everything in reverse order if we are doing destination transparency
  1778.     // calculate score string
  1779.     scorebuf[0] = score/10000000 + '0';
  1780.     rem = score % 10000000;
  1781.     scorebuf[1] = rem/1000000 + '0';
  1782.     rem = score % 1000000;
  1783.     scorebuf[2] = rem/100000 + '0';
  1784.     rem = score % 100000;
  1785.     scorebuf[3] = rem/10000 + '0';
  1786.     rem = score % 10000;
  1787.     scorebuf[4] = rem/1000 + '0';
  1788.     rem = score % 1000;
  1789.     scorebuf[5] = rem/100 + '0';
  1790.     rem = score % 100;
  1791.     scorebuf[6] = rem/10 + '0';
  1792.     rem = score % 10;
  1793.     scorebuf[7] = rem + '0';
  1794. scorebuf[8] = '';
  1795. bltText(scorebuf, x, y);
  1796. }
  1797. void DrawShield()
  1798. {
  1799. // Draw the shield status
  1800. HRESULT hRet;
  1801. DDBLTFX     ddbltfx;
  1802. RECT rcRect;
  1803. static int    iRed = 0;
  1804. static int    inc = 1;
  1805. static DWORD   lastBlitRed = 0;
  1806.     ddbltfx.dwSize = sizeof( ddbltfx );
  1807. ddbltfx.dwFillColor = RGB(0,0,0);
  1808. rcRect.top = 459;
  1809. rcRect.left = 370;
  1810. rcRect.bottom = 477;
  1811. rcRect.right  = 422;
  1812. if (iLastShield == iShield &&
  1813. iShield > 30)
  1814. return;
  1815. while (1)
  1816. {
  1817. hRet = lpBackBuffer->Blt(&rcRect, NULL, NULL, DDBLT_COLORFILL, &ddbltfx);
  1818. if (hRet == DD_OK)
  1819. {
  1820. break;
  1821. }
  1822. if (hRet == DDERR_SURFACELOST)
  1823. {
  1824. hRet = RestoreSurfaces();
  1825. if (hRet != DD_OK)
  1826. break;
  1827. }
  1828. if (hRet != DDERR_WASSTILLDRAWING)
  1829. break;
  1830. }
  1831. if (iLastShield != iShield &&
  1832. iShield > 30)
  1833. while (1)
  1834. {
  1835. hRet = lpFrontBuffer->Blt(&rcRect, NULL, NULL, DDBLT_COLORFILL, &ddbltfx);
  1836. if (hRet == DD_OK)
  1837. {
  1838. break;
  1839. }
  1840. if (hRet == DDERR_SURFACELOST)
  1841. {
  1842. hRet = RestoreSurfaces();
  1843. if (hRet != DD_OK)
  1844. break;
  1845. }
  1846. if (hRet != DDERR_WASSTILLDRAWING)
  1847. break;
  1848. }
  1849.     if (iShield <= 50 &&
  1850. iShield >  30)
  1851. {
  1852. iRed = -2;
  1853. lastBlitRed = 0;
  1854. ddbltfx.dwFillColor = RGB(0,15,0);
  1855. }
  1856.     if (iShield <= 30 &&
  1857. iShield >  20)
  1858. ddbltfx.dwFillColor = RGB(0,255,255);
  1859.     if (iShield <= 20 &&
  1860. iShield >= 0)
  1861. {
  1862. if (GetTickCount() - lastBlitRed > 30)
  1863. {
  1864. iRed += inc;
  1865. if (iRed < 32)
  1866. {
  1867. iRed = 32;
  1868. inc = 4;
  1869. }
  1870. if (iRed > 116)
  1871. {
  1872. iRed = 116;
  1873. inc = -4;
  1874. }
  1875. lastBlitRed = GetTickCount();
  1876. }
  1877. ddbltfx.dwFillColor = RGB(0,iRed,0);
  1878. }
  1879. rcRect.top = 460;
  1880. rcRect.left = 371;
  1881. rcRect.bottom = 477;
  1882. rcRect.right  = 371 + iShield;
  1883. while (1)
  1884. {
  1885. hRet = lpBackBuffer->Blt(&rcRect, NULL, NULL, DDBLT_COLORFILL, &ddbltfx);
  1886. if (hRet == DD_OK)
  1887. {
  1888. break;
  1889. }
  1890. if (hRet == DDERR_SURFACELOST)
  1891. {
  1892. hRet = RestoreSurfaces();
  1893. if (hRet != DD_OK)
  1894. break;
  1895. }
  1896. if (hRet != DDERR_WASSTILLDRAWING)
  1897. break;
  1898. }
  1899. if (iLastShield != iShield &&
  1900. iShield > 30)
  1901. while (1)
  1902. {
  1903. hRet = lpFrontBuffer->Blt(&rcRect, NULL, NULL, DDBLT_COLORFILL, &ddbltfx);
  1904. if (hRet == DD_OK)
  1905. {
  1906. break;
  1907. }
  1908. if (hRet == DDERR_SURFACELOST)
  1909. {
  1910. hRet = RestoreSurfaces();
  1911. if (hRet != DD_OK)
  1912. break;
  1913. }
  1914. if (hRet != DDERR_WASSTILLDRAWING)
  1915. break;
  1916. }
  1917. iLastShield = iShield;
  1918. }
  1919. void DrawAmmo()
  1920. {
  1921. char ammobuf[4];
  1922.     unsigned int        rem;
  1923. int iAmmo;
  1924.     // blt everything in reverse order if we are doing destination transparency
  1925.     // calculate score string
  1926. if (iWeapon < 3)
  1927. iAmmo = iLaserAmmo;
  1928. else
  1929. iAmmo = iPhotonAmmo;
  1930.     ammobuf[0] = iAmmo/100 + '0';
  1931.     rem = iAmmo % 100;
  1932.     ammobuf[1] = rem/10 + '0';
  1933.     rem = iAmmo % 10;
  1934.     ammobuf[2] = rem + '0';
  1935. ammobuf[3] = '';
  1936. OutputDebugString("Blit Ammo Buffn");
  1937. bltText(ammobuf, 241, 460);
  1938. }
  1939. void DrawWeapon()
  1940. {
  1941. RECT rcRect;
  1942. HRESULT hRet;
  1943. // Draw the weapon we are using
  1944. rcRect.left = iWeapon * 87;
  1945. rcRect.right = (iWeapon * 87) + 87;
  1946. rcRect.top = 0;
  1947. rcRect.bottom = 20;
  1948. while (1)
  1949. {
  1950. hRet = lpBackBuffer->BltFast(84, 458, lpStatusBar, &rcRect, TRUE);
  1951. if (hRet == DD_OK)
  1952. {
  1953. break;
  1954. }
  1955. if (hRet == DDERR_SURFACELOST)
  1956. {
  1957. hRet = RestoreSurfaces();
  1958. if (hRet != DD_OK)
  1959. break;
  1960. }
  1961. if (hRet != DDERR_WASSTILLDRAWING)
  1962. break;
  1963. }
  1964. while (1)
  1965. {
  1966. hRet = lpFrontBuffer->BltFast(84, 458, lpStatusBar, &rcRect, TRUE);
  1967. if (hRet == DD_OK)
  1968. {
  1969. break;
  1970. }
  1971. if (hRet == DDERR_SURFACELOST)
  1972. {
  1973. hRet = RestoreSurfaces();
  1974. if (hRet != DD_OK)
  1975. break;
  1976. }
  1977. if (hRet != DDERR_WASSTILLDRAWING)
  1978. break;
  1979. }
  1980. }
  1981. void UpdateFrame( void )
  1982. {
  1983.   int ddrval;
  1984.     DWORD                       thisTickCount;
  1985.     RECT                        rcRect;
  1986.     DWORD                       delay = 18;
  1987. static int frame = 0;
  1988. HBITMAP hbm;
  1989. DDBLTFX ddbltfx;
  1990. HRESULT hRet;
  1991. thisTickCount = GetTickCount();
  1992. // Main update function
  1993. if (thisTickCount - dwShipExplode > 2000 &&
  1994. iShipState == 3)
  1995. {
  1996. Ovni* auxpUFO;
  1997. Bullet* auxpBullet;
  1998. while(pUFO !=NULL)
  1999. {
  2000. auxpUFO = pUFO->GetNext();
  2001. delete(pUFO);
  2002. pUFO = auxpUFO;
  2003. }
  2004. while(pBullet !=NULL)
  2005. {
  2006. auxpBullet = pBullet->GetNext();
  2007. delete(pBullet);
  2008. pBullet = auxpBullet;
  2009. }
  2010. ShowGameOver();
  2011. lastTickCount = 0;
  2012. iAppState = 0;
  2013. iShipState = 0;
  2014. }
  2015. switch (iAppState)
  2016. {
  2017. case APP_MAINMENU:
  2018. if ((thisTickCount - lastTickCount) <= delay)
  2019. return;
  2020. if (lastTickCount == 0)
  2021. {
  2022. iOption = 0;
  2023. frame = 0;
  2024. hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_INVASION), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2025. if( NULL == hbm )
  2026. return;
  2027. ddrval = DDCopyBitmap(lpFrontBuffer, hbm, 0, 0, 640, 480 );
  2028. if( ddrval != DD_OK )
  2029. {
  2030. DeleteObject( hbm );
  2031. return;
  2032. }
  2033. ddrval = DDCopyBitmap(lpBackBuffer, hbm, 0, 0, 640, 480 );
  2034. if( ddrval != DD_OK )
  2035. {
  2036. DeleteObject( hbm );
  2037. return;
  2038. }
  2039. bltText("START GAME",190,280);
  2040. bltText("CREDITS",190,320);
  2041. bltText("HELP",190,360);
  2042. bltText("QUIT",190,400);
  2043. }
  2044. ddbltfx.dwSize = sizeof( ddbltfx );
  2045. ddbltfx.dwFillColor = dwFillColor;
  2046. rcRect.left = 130;
  2047. rcRect.top = 270;
  2048. rcRect.right = 190;
  2049. rcRect.bottom = 460;
  2050. while (1)
  2051. {
  2052. hRet = lpBackBuffer->Blt(&rcRect, NULL, NULL, DDBLT_COLORFILL, &ddbltfx);
  2053. if (hRet == DD_OK)
  2054. {
  2055. break;
  2056. }
  2057. if (hRet == DDERR_SURFACELOST)
  2058. {
  2059. hRet = RestoreSurfaces();
  2060. if (hRet != DD_OK)
  2061. break;
  2062. }
  2063. if (hRet != DDERR_WASSTILLDRAWING)
  2064. break;
  2065. }
  2066. rcRect.left   = frame * 32;
  2067. rcRect.right  = (frame * 32) + 32;
  2068. rcRect.top    = 0;
  2069. rcRect.bottom = 20;
  2070. while (1)
  2071. {
  2072. hRet = lpBackBuffer->BltFast(150 , 275+ (40 * iOption),  lpSelect, &rcRect, TRUE);
  2073. if (hRet == DD_OK)
  2074. {
  2075. break;
  2076. }
  2077. if (hRet == DDERR_SURFACELOST)
  2078. {
  2079. hRet = RestoreSurfaces();
  2080. if (hRet != DD_OK)
  2081. break;
  2082. }
  2083. if (hRet != DDERR_WASSTILLDRAWING)
  2084. break;
  2085. }
  2086. frame++;
  2087. if (frame > 19)
  2088. frame = 0;
  2089. while( 1 )
  2090. {
  2091. ddrval = lpFrontBuffer->Flip(NULL, 0 );
  2092. if( ddrval == DD_OK )
  2093. {
  2094. break;
  2095. }
  2096. if( ddrval == DDERR_SURFACELOST )
  2097. {
  2098. if( !RestoreSurfaces() )
  2099. {
  2100. return;
  2101. }
  2102. }
  2103. if( ddrval != DDERR_WASSTILLDRAWING )
  2104. {
  2105. break;
  2106. }
  2107. }
  2108. lastTickCount = thisTickCount;
  2109. return;
  2110. case APP_GAMESCREEN:
  2111. int iAmmo;
  2112. if (lastTickCount == 0)
  2113. {
  2114. bShoot = FALSE;
  2115. rcRect.left = 0;
  2116. rcRect.top = 0;
  2117. rcRect.right = 640;
  2118. rcRect.bottom = 480;
  2119. DrawBackGround(lpBackBuffer,0,455,640,480);
  2120. DrawBackGround(lpFrontBuffer,0,455,640,480);
  2121. }
  2122. DrawShield();
  2123. if (Lastscore != score)
  2124. {
  2125. DrawBackGround(lpBackBuffer,510,460,640,477);
  2126. DrawBackGround(lpFrontBuffer,510,460,640,477);
  2127. DrawScore(510,460);
  2128. Lastscore = score;
  2129. }
  2130. if (iLastWeapon != iWeapon)
  2131. {
  2132. DrawBackGround(lpBackBuffer, 84,458, 172,477);
  2133. DrawBackGround(lpFrontBuffer,84,458, 172,477);
  2134. DrawWeapon();
  2135. iLastWeapon = iWeapon;
  2136. iLastAmmo = -1;
  2137. }
  2138. if (iWeapon < 3)
  2139. iAmmo = iLaserAmmo;
  2140. else
  2141. iAmmo = iPhotonAmmo;
  2142. if (iLastAmmo != iAmmo)
  2143. {
  2144. DrawBackGround(lpBackBuffer,241,459,300,477);
  2145. DrawBackGround(lpFrontBuffer,241,459,300,477);
  2146. DrawAmmo();
  2147. iLastAmmo = iAmmo;
  2148. }
  2149. if ((thisTickCount - lastTickCount) <= delay)
  2150. return;
  2151. if (pUFO   == NULL &&
  2152. pExtra == NULL)
  2153. {
  2154. SndObjPlay(hsoEnter, NULL);
  2155. InitLevel(TRUE);
  2156. DrawBackGround(lpBackBuffer,0,0,640,480);
  2157. DrawBackGround(lpFrontBuffer,0,0,640,480);
  2158. DrawScore(510,459);
  2159. lastTickCount = 0;
  2160. return;
  2161. }
  2162. DrawInvalidBackGround();
  2163. DrawExtra();
  2164. DrawUfo();
  2165. DrawBullet();
  2166. DrawShip();
  2167. bShoot = FALSE;
  2168. while( 1 )
  2169. {
  2170. ddrval = lpFrontBuffer->Flip(NULL, 0 );
  2171. if( ddrval == DD_OK )
  2172. {
  2173. break;
  2174. }
  2175. if( ddrval == DDERR_SURFACELOST )
  2176. {
  2177. if( !RestoreSurfaces() )
  2178. {
  2179. return;
  2180. }
  2181. }
  2182. if( ddrval != DDERR_WASSTILLDRAWING )
  2183. {
  2184. break;
  2185. }
  2186. }
  2187.    lastTickCount = GetTickCount();
  2188.    break;
  2189. case APP_CREDITS:
  2190. ShowCredits();
  2191. iAppState = 0;
  2192. lastTickCount = 0;
  2193. break;
  2194. case APP_HELPSCREEN:
  2195. static BOOL  bBlink;
  2196. static DWORD dwTime;
  2197. if ((thisTickCount - lastTickCount) <= delay+20)
  2198. return;
  2199. if (lastTickCount == 0)
  2200. {
  2201. ddbltfx.dwSize = sizeof( ddbltfx );
  2202. ddbltfx.dwFillColor = RGB(0,0,0);
  2203. rcRect.left = 0;
  2204. rcRect.top = 0;
  2205. rcRect.right = 640;
  2206. rcRect.bottom = 480;
  2207. while (1)
  2208. {
  2209. hRet = lpFrontBuffer->Blt(&rcRect, NULL, NULL, DDBLT_COLORFILL, &ddbltfx);
  2210. if (hRet == DD_OK)
  2211. {
  2212. break;
  2213. }
  2214. if (hRet == DDERR_SURFACELOST)
  2215. {
  2216. hRet = RestoreSurfaces();
  2217. if (hRet != DD_OK)
  2218. break;
  2219. }
  2220. if (hRet != DDERR_WASSTILLDRAWING)
  2221. break;
  2222. }
  2223. while (1)
  2224. {
  2225. hRet = lpBackBuffer->Blt(&rcRect, NULL, NULL, DDBLT_COLORFILL, &ddbltfx);
  2226. if (hRet == DD_OK)
  2227. {
  2228. break;
  2229. }
  2230. if (hRet == DDERR_SURFACELOST)
  2231. {
  2232. hRet = RestoreSurfaces();
  2233. if (hRet != DD_OK)
  2234. break;
  2235. }
  2236. if (hRet != DDERR_WASSTILLDRAWING)
  2237. break;
  2238. }
  2239. bltText("PHOTON AMMO",90,45);
  2240. bltText("WEAPON ADVANCE",90,95);
  2241. bltText("100 POINTS BONUS",90,145);
  2242. bltText("LASER AMMO",90,195);
  2243. bltText("SHIELD CHARGE",90,245);
  2244. bltText("LEFT, RIGHT - MOVE SHIP",50,290);
  2245. bltText("DOWN OR ENTER - STOP SHIP",50,325);
  2246. bltText("CTRL - CHANGE WEAPON",50,360);
  2247. bltText("PRESS ANY KEY TO CONTINUE",140,450);
  2248. bBlink = FALSE;
  2249. dwTime = 0;
  2250. }
  2251. ddbltfx.dwSize = sizeof( ddbltfx );
  2252. ddbltfx.dwFillColor = dwFillColor;
  2253. rcRect.left = 50;
  2254. rcRect.top = 40;
  2255. rcRect.right = 75;
  2256. rcRect.bottom = 270;
  2257. while (1)
  2258. {
  2259. hRet = lpBackBuffer->Blt(&rcRect, NULL, NULL, DDBLT_COLORFILL, &ddbltfx);
  2260. if (hRet == DD_OK)
  2261. {
  2262. break;
  2263. }
  2264. if (hRet == DDERR_SURFACELOST)
  2265. {
  2266. hRet = RestoreSurfaces();
  2267. if (hRet != DD_OK)
  2268. break;
  2269. }
  2270. if (hRet != DDERR_WASSTILLDRAWING)
  2271. break;
  2272. }
  2273. if (bBlink == TRUE)
  2274. {
  2275. ddbltfx.dwSize = sizeof( ddbltfx );
  2276. ddbltfx.dwFillColor = dwFillColor;
  2277. rcRect.left = 0;
  2278. rcRect.top = 450;
  2279. rcRect.right = 640;
  2280. rcRect.bottom = 475;
  2281. while (1)
  2282. {
  2283. hRet = lpBackBuffer->Blt(&rcRect, NULL, NULL, DDBLT_COLORFILL, &ddbltfx);
  2284. if (hRet == DD_OK)
  2285. {
  2286. break;
  2287. }
  2288. if (hRet == DDERR_SURFACELOST)
  2289. {
  2290. hRet = RestoreSurfaces();
  2291. if (hRet != DD_OK)
  2292. break;
  2293. }
  2294. if (hRet != DDERR_WASSTILLDRAWING)
  2295. break;
  2296. }
  2297. dwTime = dwTime + 1;
  2298. if (dwTime == 20)
  2299. {
  2300. bltText("PRESS ANY KEY TO CONTINUE",140,450);
  2301. bBlink = FALSE;
  2302. dwTime = 0;
  2303. }
  2304. }
  2305. else
  2306. {
  2307. dwTime = dwTime + 1;
  2308. if (dwTime == 20)
  2309. {
  2310. //bltText("PRESS ANY KEY TO CONTINUE",140,450);
  2311. bBlink = TRUE;
  2312. dwTime = 0;
  2313. }
  2314. }
  2315. rcRect.left   = frame * 25;
  2316. rcRect.right  = (frame * 25) + 25;
  2317. rcRect.top    = 0;
  2318. rcRect.bottom = 25;
  2319. while (1)
  2320. {
  2321. hRet = lpBackBuffer->BltFast(50, 40,  lpExtra, &rcRect, TRUE);
  2322. if (hRet == DD_OK)
  2323. {
  2324. break;
  2325. }
  2326. if (hRet == DDERR_SURFACELOST)
  2327. {
  2328. hRet = RestoreSurfaces();
  2329. if (hRet != DD_OK)
  2330. break;
  2331. }
  2332. if (hRet != DDERR_WASSTILLDRAWING)
  2333. break;
  2334. }
  2335. rcRect.top    = 25;
  2336. rcRect.bottom = 50;
  2337. while (1)
  2338. {
  2339. hRet = lpBackBuffer->BltFast(50, 90,  lpExtra, &rcRect, TRUE);
  2340. if (hRet == DD_OK)
  2341. {
  2342. break;
  2343. }
  2344. if (hRet == DDERR_SURFACELOST)
  2345. {
  2346. hRet = RestoreSurfaces();
  2347. if (hRet != DD_OK)
  2348. break;
  2349. }
  2350. if (hRet != DDERR_WASSTILLDRAWING)
  2351. break;
  2352. }
  2353. rcRect.top    = 50;
  2354. rcRect.bottom = 75;
  2355. while (1)
  2356. {
  2357. hRet = lpBackBuffer->BltFast(50, 140,  lpExtra, &rcRect, TRUE);
  2358. if (hRet == DD_OK)
  2359. {
  2360. break;
  2361. }
  2362. if (hRet == DDERR_SURFACELOST)
  2363. {
  2364. hRet = RestoreSurfaces();
  2365. if (hRet != DD_OK)
  2366. break;
  2367. }
  2368. if (hRet != DDERR_WASSTILLDRAWING)
  2369. break;
  2370. }
  2371. rcRect.top    = 75;
  2372. rcRect.bottom = 100;
  2373. while (1)
  2374. {
  2375. hRet = lpBackBuffer->BltFast(50, 190,  lpExtra, &rcRect, TRUE);
  2376. if (hRet == DD_OK)
  2377. {
  2378. break;
  2379. }
  2380. if (hRet == DDERR_SURFACELOST)
  2381. {
  2382. hRet = RestoreSurfaces();
  2383. if (hRet != DD_OK)
  2384. break;
  2385. }
  2386. if (hRet != DDERR_WASSTILLDRAWING)
  2387. break;
  2388. }
  2389. rcRect.top    = 100;
  2390. rcRect.bottom = 125;
  2391. while (1)
  2392. {
  2393. hRet = lpBackBuffer->BltFast(50, 240,  lpExtra, &rcRect, TRUE);
  2394. if (hRet == DD_OK)
  2395. {
  2396. break;
  2397. }
  2398. if (hRet == DDERR_SURFACELOST)
  2399. {
  2400. hRet = RestoreSurfaces();
  2401. if (hRet != DD_OK)
  2402. break;
  2403. }
  2404. if (hRet != DDERR_WASSTILLDRAWING)
  2405. break;
  2406. }
  2407. frame++;
  2408. if (frame == 19)
  2409. frame = 0;
  2410. while( 1 )
  2411. {
  2412. ddrval = lpFrontBuffer->Flip(NULL, 0 );
  2413. if( ddrval == DD_OK )
  2414. {
  2415. break;
  2416. }
  2417. if( ddrval == DDERR_SURFACELOST )
  2418. {
  2419. if( !RestoreSurfaces() )
  2420. {
  2421. return;
  2422. }
  2423. }
  2424. if( ddrval != DDERR_WASSTILLDRAWING )
  2425. {
  2426. break;
  2427. }
  2428. }
  2429. lastTickCount = thisTickCount;
  2430. return;
  2431. }
  2432.    return;
  2433. }
  2434. void DestroyGame()
  2435. {
  2436. // Destroy game objects
  2437. Ovni* auxpUFO;
  2438. Bullet* auxpBullet;
  2439. Extra* pAuxExtra;
  2440. while(pExtra !=NULL)
  2441. {
  2442. pAuxExtra = pExtra->GetNext();
  2443. delete(pExtra);
  2444. pExtra = pAuxExtra;
  2445. }
  2446. while(pUFO !=NULL)
  2447. {
  2448. auxpUFO = pUFO->GetNext();
  2449. delete(pUFO);
  2450. pUFO = auxpUFO;
  2451. }
  2452. while(pBullet !=NULL)
  2453. {
  2454. auxpBullet = pBullet->GetNext();
  2455. delete(pBullet);
  2456. pBullet = auxpBullet;
  2457. }
  2458.     if( lpBkGround != NULL )
  2459.         lpBkGround->Release();
  2460.     if( lpBackBuffer != NULL )
  2461. lpBackBuffer->Release();
  2462.     if( lpFrontBuffer != NULL )
  2463.         lpFrontBuffer->Release();
  2464.     if( lpUfo != NULL )
  2465.         lpUfo->Release();
  2466.     if( lpShoot != NULL )
  2467.         lpShoot->Release();
  2468.     if( lpShoot2 != NULL )
  2469.         lpShoot2->Release();
  2470. if( lpShip != NULL )
  2471.         lpShip->Release();
  2472.     if( lpBoom != NULL )
  2473.         lpBoom->Release();
  2474.     if( lpUfoShoot != NULL )
  2475.         lpUfoShoot->Release();
  2476.     if( lpAlpha != NULL )
  2477.         lpAlpha->Release();
  2478.     if( lpShipBoom != NULL )
  2479.         lpShipBoom->Release();
  2480.     if( lpArtPalette != NULL )
  2481.         lpArtPalette->Release();
  2482.     if( lpDD != NULL )
  2483.         lpDD->Release();
  2484. DestroySound();
  2485. return;
  2486. }
  2487. BOOL CleanupAndExit( char *err)
  2488. {
  2489. #ifdef DEBUG
  2490.     wsprintf(DebugBuf, "___CleanupAndExit  err = %sn", err );
  2491.     OutputDebugString( DebugBuf );
  2492. #endif
  2493.     // make the cursor visible
  2494.     SetCursor(LoadCursor( NULL, IDC_ARROW ));
  2495. DestroyGame();
  2496.         MessageBox( hWndMain, err, "ERROR", MB_OK );
  2497.     return FALSE;
  2498. }
  2499. // Surface loading functions
  2500. BOOL LoadUfoSurface(int iFlags)
  2501. {
  2502.     HRESULT     ddrval;
  2503.     HBITMAP     hbm;
  2504. ddrval = lpUfo->Restore();
  2505.     if( ddrval != DD_OK )
  2506.         return FALSE;
  2507. ddrval = lpBoom->Restore();
  2508.     if( ddrval != DD_OK )
  2509.         return FALSE;
  2510.     switch(iLevel % 6)
  2511. {
  2512. case 0:
  2513. hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_UFO3), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2514. break;
  2515. case 4:
  2516. hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_UFO2), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2517. break;
  2518. case 5:
  2519. hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_UFO2), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2520. break;
  2521. default:
  2522. hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_UFO), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2523. break;
  2524. };
  2525.     if( NULL == hbm )
  2526.         return FALSE;
  2527.     ddrval = DDCopyBitmap(lpUfo, hbm, 0, 0, 350, 700 );
  2528.     if( ddrval != DD_OK )
  2529.     {
  2530.         DeleteObject( hbm );
  2531.         return FALSE;
  2532.     }
  2533.     switch(iLevel % 6)
  2534. {
  2535. case 0:
  2536. hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BOOM3), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2537. break;
  2538. case 4:
  2539. hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BOOM2), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2540. break;
  2541. case 5:
  2542. hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BOOM2), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2543. break;
  2544. default:
  2545. hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BOOM), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2546. break;
  2547. };
  2548.     if( NULL == hbm )
  2549.         return FALSE;
  2550.     ddrval = DDCopyBitmap(lpBoom, hbm, 0, 0, 350, 280);
  2551.     if( ddrval != DD_OK )
  2552.     {
  2553.         DeleteObject( hbm );
  2554.         return FALSE;
  2555.     }
  2556. return TRUE;
  2557. }
  2558. BOOL RestoreSurfaces( void )
  2559. {
  2560.     HRESULT     ddrval;
  2561.     HBITMAP     hbm;
  2562.     ddrval = lpShip->Restore();
  2563.     if( ddrval != DD_OK )
  2564.         return FALSE;
  2565.     ddrval = lpShipBoom->Restore();
  2566.     if( ddrval != DD_OK )
  2567.         return FALSE;
  2568.     ddrval = lpShoot->Restore();
  2569.     if( ddrval != DD_OK )
  2570.         return FALSE;
  2571.     ddrval = lpUfoShoot->Restore();
  2572.     if( ddrval != DD_OK )
  2573.         return FALSE;
  2574.     ddrval = lpBackBuffer->Restore();
  2575.     if( ddrval != DD_OK )
  2576.         return FALSE;
  2577.     ddrval = lpBkGround->Restore();
  2578.     if( ddrval != DD_OK )
  2579.         return FALSE;
  2580.     ddrval = lpFrontBuffer->Restore();
  2581.     if( ddrval != DD_OK )
  2582.         return FALSE;
  2583.     // Create and set the palette for the art bitmap
  2584.     lpArtPalette = DDLoadPalette( lpDD, MAKEINTRESOURCE(IDB_BOOM));
  2585.     if( NULL == lpArtPalette )
  2586.         return CleanupAndExit("DDLoadPalette UFO");
  2587.     // set the palette before loading the art
  2588.     lpFrontBuffer->SetPalette(lpArtPalette );
  2589. if (LoadUfoSurface(iLevel) == FALSE)
  2590. return FALSE;
  2591.     hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_FUNDO), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2592.     if( NULL == hbm )
  2593.         return FALSE;
  2594.     ddrval = DDCopyBitmap(lpBkGround, hbm, 0, 0, 640, 480 );
  2595.     if( ddrval != DD_OK )
  2596.     {
  2597.         DeleteObject( hbm );
  2598.         return FALSE;
  2599.     }
  2600.     hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_SHIP), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2601.     if( NULL == hbm )
  2602.         return FALSE;
  2603.     ddrval = DDCopyBitmap(lpShip, hbm, 0, 0, 350, 350 );
  2604.     if( ddrval != DD_OK )
  2605.     {
  2606.         DeleteObject( hbm );
  2607.         return FALSE;
  2608.     }
  2609.     hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_SHOOT), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2610.     if( NULL == hbm )
  2611.         return FALSE;
  2612.     ddrval = DDCopyBitmap(lpShoot, hbm, 0, 0, 220, 20);
  2613.     if( ddrval != DD_OK )
  2614.     {
  2615.         DeleteObject( hbm );
  2616.         return FALSE;
  2617.     }
  2618.     hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_SHOOT2), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2619.     if( NULL == hbm )
  2620.         return FALSE;
  2621.     ddrval = DDCopyBitmap(lpShoot2, hbm, 0, 0, 20, 20);
  2622.     if( ddrval != DD_OK )
  2623.     {
  2624.         DeleteObject( hbm );
  2625.         return FALSE;
  2626.     }
  2627.     hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_UFOSHOOT), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2628.     if( NULL == hbm )
  2629.         return FALSE;
  2630.     ddrval = DDCopyBitmap(lpUfoShoot, hbm, 0, 0, 400, 20);
  2631.     if( ddrval != DD_OK )
  2632.     {
  2633.         DeleteObject( hbm );
  2634.         return FALSE;
  2635.     }
  2636.     hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_SHIPEXPLODE), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2637.     if( NULL == hbm )
  2638.         return FALSE;
  2639.     ddrval = DDCopyBitmap(lpShipBoom, hbm, 0, 0, 490, 210);
  2640.     if( ddrval != DD_OK )
  2641.     {
  2642.         DeleteObject( hbm );
  2643.         return FALSE;
  2644.     }
  2645.     hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_ALPHA), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2646.     if( NULL == hbm )
  2647.         return FALSE;
  2648.     ddrval = DDCopyBitmap(lpAlpha, hbm, 0, 0, 623, 15);
  2649.     if( ddrval != DD_OK )
  2650.     {
  2651.         DeleteObject( hbm );
  2652.         return FALSE;
  2653.     }
  2654.     hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_SELECT), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2655.     if( NULL == hbm )
  2656.         return FALSE;
  2657.     ddrval = DDCopyBitmap(lpSelect, hbm, 0, 0, 640, 20);
  2658.     if( ddrval != DD_OK )
  2659.     {
  2660.         DeleteObject( hbm );
  2661.         return FALSE;
  2662.     }
  2663.     hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_STATUSBAR), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2664.     if( NULL == hbm )
  2665.         return FALSE;
  2666.     ddrval = DDCopyBitmap(lpStatusBar, hbm, 0, 0, 522, 20);
  2667.     if( ddrval != DD_OK )
  2668.     {
  2669.         DeleteObject( hbm );
  2670.         return FALSE;
  2671.     }
  2672.     hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_EXTRA), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION );
  2673.     if( NULL == hbm )
  2674.         return FALSE;
  2675.     ddrval = DDCopyBitmap(lpExtra, hbm, 0, 0, 500, 125);
  2676.     if( ddrval != DD_OK )
  2677.     {
  2678.         DeleteObject( hbm );
  2679.         return FALSE;
  2680.     }
  2681.     // set colorfill colors and color keys according to bitmap contents
  2682.     //dwFillColor = DDColorMatch( lpUfo, RGB(0,0,0) );
  2683. dwFillColor = DDColorMatch( lpBackBuffer, RGB(0,0,0) );
  2684. //Get Color Key
  2685. HDC hDC;
  2686. COLORREF rgbColor;
  2687. lpShip->GetDC(&hDC);
  2688. rgbColor = GetPixel(hDC,0,0);
  2689. lpShip->ReleaseDC(hDC);
  2690.     
  2691. DDSetColorKey(lpUfo, RGB(0,0,0));
  2692. DDSetColorKey(lpShip, rgbColor);
  2693. DDSetColorKey(lpShoot, RGB(0,0,0));
  2694. DDSetColorKey(lpShoot2, RGB(0,0,0));
  2695. DDSetColorKey(lpBoom, RGB(0,0,0));
  2696. DDSetColorKey(lpUfoShoot, RGB(0,0,0));
  2697. DDSetColorKey(lpShipBoom, RGB(19,19,19));
  2698. DDSetColorKey(lpAlpha, RGB(0,0,0));
  2699. DDSetColorKey(lpSelect, RGB(0,0,0));
  2700. DDSetColorKey(lpStatusBar, RGB(0,0,0));
  2701. DDSetColorKey(lpExtra, RGB(0,0,0));
  2702.     return TRUE;
  2703. }
  2704. BOOL initApplication( HINSTANCE hInstance, int nCmdShow )
  2705. {
  2706.     WNDCLASS    wc;
  2707.     BOOL        rc;
  2708.     wc.style = CS_DBLCLKS;
  2709.     wc.lpfnWndProc = MainWndproc;
  2710.     wc.cbClsExtra = 0;
  2711.     wc.cbWndExtra = 0;
  2712.     wc.hInstance = hInstance;
  2713.     wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_UFO));
  2714.     wc.hCursor = LoadCursor( NULL, IDC_ARROW );
  2715.     wc.hbrBackground = CreateSolidBrush(RGB(0,0,0));
  2716.     wc.lpszMenuName =  NULL;
  2717.     wc.lpszClassName = "InvasionClass";
  2718.     rc = RegisterClass( &wc );
  2719.     if( !rc )
  2720.     {
  2721.         return FALSE;
  2722.     }
  2723.     hWndMain = CreateWindowEx(0,  // WS_EX_TOPMOST,
  2724.         "InvasionClass",
  2725.         "Invasion",
  2726.         WS_VISIBLE | // so we don't have to call ShowWindow
  2727.         WS_POPUP, // |   // non-app window
  2728.         //WS_SYSMENU//so we get an icon in the tray
  2729.         0,
  2730.         0,
  2731.         GetSystemMetrics(SM_CXSCREEN),
  2732.         GetSystemMetrics(SM_CYSCREEN),
  2733.         NULL,
  2734.         NULL,
  2735.         hInstance,
  2736.         NULL );
  2737.     if( !hWndMain )
  2738.     {
  2739.         return FALSE;
  2740.     }
  2741.     UpdateWindow( hWndMain );
  2742.     return TRUE;
  2743. } /* initApplication */
  2744. BOOL InitializeGame( void )
  2745. {
  2746.     DDCAPS ddcaps;
  2747.     HRESULT ddrval;
  2748.     DDSURFACEDESC2 ddsd;
  2749.     DDSCAPS2 ddscaps;
  2750. LPDIRECTDRAW pDD;
  2751.     LPVOID  lpSurface  = NULL;
  2752.     
  2753. ShowCursor(FALSE);
  2754.     srand( GetTickCount() );
  2755. ddrval = DirectDrawCreate( NULL, &pDD, NULL );
  2756.     if( ddrval != DD_OK )
  2757.         return CleanupAndExit("DirectDrawCreate Failed!");
  2758.     // Fetch DirectDraw7 interface
  2759.     ddrval = pDD->QueryInterface(IID_IDirectDraw7, (LPVOID*)&lpDD);
  2760.     if (ddrval != DD_OK)
  2761.         return CleanupAndExit("QueryInterface Failed!");
  2762.     pDD->Release();
  2763.     
  2764. ddrval = lpDD->SetCooperativeLevel(hWndMain, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
  2765.     if( ddrval != DD_OK )
  2766.         return CleanupAndExit("SetCooperativeLevel Failed");
  2767.     // set the mode
  2768.     ddrval = lpDD->SetDisplayMode(640, 480, 16, 0, 0 );
  2769.     if( ddrval != DD_OK )
  2770.         return CleanupAndExit("SetDisplayMode Failed!");
  2771.     // check the color key hardware capabilities
  2772.     dwTransType = DDBLTFAST_SRCCOLORKEY;
  2773.     ddcaps.dwSize = sizeof( ddcaps );
  2774.     // Create surfaces
  2775.     memset( &ddsd, 0, sizeof( ddsd ) );
  2776.     ddsd.dwSize = sizeof( ddsd );
  2777.     ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
  2778.     
  2779. ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |
  2780.                           DDSCAPS_FLIP |
  2781.                           DDSCAPS_COMPLEX;
  2782.     ddsd.dwBackBufferCount = 1;
  2783.     ddrval = lpDD->CreateSurface(&ddsd, &lpFrontBuffer, NULL );
  2784.     if( ddrval != DD_OK )
  2785.         return CleanupAndExit("CreateSurface FrontBuffer Failed!");
  2786.     // get a pointer to the back buffer
  2787.     
  2788. ZeroMemory(&ddscaps, sizeof(ddscaps));
  2789. ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
  2790.     ddrval = lpFrontBuffer->GetAttachedSurface(
  2791.                 &ddscaps,
  2792.                 &lpBackBuffer);
  2793.     if( ddrval != DD_OK )
  2794. {
  2795.         return CleanupAndExit("GetAttachedSurfaceError");
  2796. }
  2797.     
  2798. // Create a surface for each one of the objects we are going to use in the game
  2799. // Then 碽lit this surfaces to the main surface
  2800. ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
  2801.     ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |
  2802.   DDSCAPS_VIDEOMEMORY;
  2803. ddsd.dwWidth = 350;
  2804.     ddsd.dwHeight = 700;
  2805.     ddrval = lpDD->CreateSurface(&ddsd, &lpUfo, NULL );
  2806.     if( ddrval != DD_OK )
  2807. {
  2808. if(ddrval == DDERR_OUTOFMEMORY)
  2809. {
  2810. ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |
  2811.   DDSCAPS_SYSTEMMEMORY;
  2812. ddrval = lpDD->CreateSurface(&ddsd, &lpUfo, NULL );
  2813. if(ddrval != DD_OK)
  2814. return CleanupAndExit("CreateSurface lpUfo Failed!");
  2815. }
  2816. else
  2817. return CleanupAndExit("CreateSurface lpUfo Failed!");
  2818. }
  2819. dwTransType = DDBLTFAST_NOCOLORKEY;
  2820.     ddsd.dwWidth = 640;
  2821.     ddsd.dwHeight = 480;
  2822.     ddrval = lpDD->CreateSurface(&ddsd, &lpBkGround, NULL );
  2823.     if( ddrval != DD_OK )
  2824. {
  2825. if(ddrval == DDERR_OUTOFMEMORY)
  2826. {
  2827. ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |
  2828.   DDSCAPS_SYSTEMMEMORY;
  2829. ddrval = lpDD->CreateSurface(&ddsd, &lpBkGround, NULL );
  2830. if(ddrval != DD_OK)
  2831. return CleanupAndExit("CreateSurface lpUfo Failed!");
  2832. }
  2833. else
  2834. return CleanupAndExit("CreateSurface Background Failed!");
  2835. }
  2836. dwTransType = DDBLTFAST_SRCCOLORKEY;
  2837.     ddsd.dwWidth = 350;
  2838.     ddsd.dwHeight = 350;
  2839.     ddrval = lpDD->CreateSurface(&ddsd, &lpShip, NULL );
  2840.     if( ddrval != DD_OK )
  2841. {
  2842. if(ddrval == DDERR_OUTOFMEMORY)
  2843. {
  2844. ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |
  2845.   DDSCAPS_SYSTEMMEMORY;
  2846. ddrval = lpDD->CreateSurface(&ddsd, &lpShip, NULL );
  2847. if(ddrval != DD_OK)
  2848. return CleanupAndExit("CreateSurface Background Failed!");
  2849. }
  2850. else
  2851. return CleanupAndExit("CreateSurface Background Failed!");
  2852. }
  2853.     ddsd.dwWidth = 220;
  2854.     ddsd.dwHeight = 20;
  2855.     ddrval = lpDD->CreateSurface(&ddsd, &lpShoot, NULL );
  2856.     if( ddrval != DD_OK )
  2857. {
  2858. if(ddrval == DDERR_OUTOFMEMORY)
  2859. {
  2860. ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |
  2861.   DDSCAPS_SYSTEMMEMORY;
  2862. ddrval = lpDD->CreateSurface(&ddsd, &lpShoot, NULL );
  2863. if(ddrval != DD_OK)
  2864. return CleanupAndExit("CreateSurface Shoot Failed!");
  2865. }
  2866. else
  2867. return CleanupAndExit("CreateSurface Shoot Failed!");
  2868. }
  2869.     ddsd.dwWidth = 20;
  2870.     ddsd.dwHeight = 20;
  2871.     ddrval = lpDD->CreateSurface(&ddsd, &lpShoot2, NULL );
  2872.     if( ddrval != DD_OK )
  2873. {
  2874. if(ddrval == DDERR_OUTOFMEMORY)
  2875. {
  2876. ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |
  2877.   DDSCAPS_SYSTEMMEMORY;
  2878. ddrval = lpDD->CreateSurface(&ddsd, &lpShoot2, NULL );
  2879. if(ddrval != DD_OK)
  2880. return CleanupAndExit("CreateSurface Shoot 2 Failed!");
  2881. }
  2882. else
  2883. return CleanupAndExit("CreateSurface  Shoot 2 Failed!");
  2884. }
  2885.     
  2886. ddsd.dwWidth = 350;
  2887.     ddsd.dwHeight = 280;
  2888.     ddrval = lpDD->CreateSurface(&ddsd, &lpBoom, NULL );
  2889.     if( ddrval != DD_OK )
  2890. {
  2891. if(ddrval == DDERR_OUTOFMEMORY)
  2892. {
  2893. ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |
  2894.   DDSCAPS_SYSTEMMEMORY;
  2895. ddrval = lpDD->CreateSurface(&ddsd, &lpBoom, NULL );
  2896. if(ddrval != DD_OK)
  2897. return CleanupAndExit("CreateSurface Boom Failed!");
  2898. }
  2899. else
  2900. return CleanupAndExit("CreateSurface  Boom Failed!");
  2901. }
  2902.     ddsd.dwWidth = 400;
  2903.     ddsd.dwHeight = 20;
  2904.     ddrval = lpDD->CreateSurface(&ddsd, &lpUfoShoot, NULL );
  2905.     if( ddrval != DD_OK )
  2906. {
  2907. if(ddrval == DDERR_OUTOFMEMORY)
  2908. {
  2909. ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |
  2910.   DDSCAPS_SYSTEMMEMORY;
  2911. ddrval = lpDD->CreateSurface(&ddsd, &lpUfoShoot, NULL );
  2912. if(ddrval != DD_OK)
  2913. return CleanupAndExit("CreateSurface UfoShoot Failed!");
  2914. }
  2915. else
  2916. return CleanupAndExit("CreateSurface  UfoShoot Failed!");
  2917. }
  2918.     ddsd.dwWidth = 490;
  2919.     ddsd.dwHeight = 210;
  2920.     ddrval = lpDD->CreateSurface(&ddsd, &lpShipBoom, NULL );
  2921.     if( ddrval != DD_OK )
  2922. {
  2923. if(ddrval == DDERR_OUTOFMEMORY)
  2924. {
  2925. ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |
  2926.   DDSCAPS_SYSTEMMEMORY;
  2927. ddrval = lpDD->CreateSurface(&ddsd, &lpShipBoom, NULL );
  2928. if(ddrval != DD_OK)
  2929. return CleanupAndExit("CreateSurface ShipExplode Failed!");
  2930. }
  2931. else
  2932. return CleanupAndExit("CreateSurface  ShipExplode Failed!");
  2933. }
  2934.     ddsd.dwWidth = 623;
  2935.     ddsd.dwHeight = 15;
  2936.     ddrval = lpDD->CreateSurface(&ddsd, &lpAlpha, NULL );
  2937.     if( ddrval != DD_OK )
  2938. {
  2939. if(ddrval == DDERR_OUTOFMEMORY)
  2940. {
  2941. ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |
  2942.   DDSCAPS_SYSTEMMEMORY;
  2943. ddrval = lpDD->CreateSurface(&ddsd, &lpAlpha, NULL );
  2944. if(ddrval != DD_OK)
  2945. return CleanupAndExit("CreateSurface Alphabet Failed!");
  2946. }
  2947. else
  2948. return CleanupAndExit("CreateSurface  Alphabet Failed!");
  2949. }
  2950.     ddsd.dwWidth = 640;
  2951.     ddsd.dwHeight = 20;
  2952.     ddrval = lpDD->CreateSurface(&ddsd, &lpSelect, NULL );
  2953.     if( ddrval != DD_OK )
  2954. {
  2955. if(ddrval == DDERR_OUTOFMEMORY)
  2956. {
  2957. ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |
  2958.   DDSCAPS_SYSTEMMEMORY;
  2959. ddrval = lpDD->CreateSurface(&ddsd, &lpSelect, NULL );
  2960. if(ddrval != DD_OK)
  2961. return CleanupAndExit("CreateSurface Selection Failed!");
  2962. }
  2963. else
  2964. return CleanupAndExit("CreateSurface  Selection Failed!");
  2965. }
  2966.     ddsd.dwWidth = 522;
  2967.     ddsd.dwHeight = 20;
  2968.     ddrval = lpDD->CreateSurface(&ddsd, &lpStatusBar, NULL );
  2969.     if( ddrval != DD_OK )
  2970. {
  2971. if(ddrval == DDERR_OUTOFMEMORY)
  2972. {
  2973. ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |
  2974.   DDSCAPS_SYSTEMMEMORY;
  2975. ddrval = lpDD->CreateSurface(&ddsd, &lpStatusBar, NULL );
  2976. if(ddrval != DD_OK)
  2977. return CleanupAndExit("CreateSurface StatusBar Failed!");
  2978. }
  2979. else
  2980. return CleanupAndExit("CreateSurface  StatusBar Failed!");
  2981. }
  2982.     ddsd.dwWidth = 500;
  2983.     ddsd.dwHeight = 125;
  2984.     ddrval = lpDD->CreateSurface(&ddsd, &lpExtra, NULL );
  2985.     if( ddrval != DD_OK )
  2986. {
  2987. if(ddrval == DDERR_OUTOFMEMORY)
  2988. {
  2989. ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |
  2990.   DDSCAPS_SYSTEMMEMORY;
  2991. ddrval = lpDD->CreateSurface(&ddsd, &lpExtra, NULL );
  2992. if(ddrval != DD_OK)
  2993. return CleanupAndExit("CreateSurface Extras Failed!");
  2994. }
  2995. else
  2996. return CleanupAndExit("CreateSurface  Extras Failed!");
  2997. }
  2998.     if( !RestoreSurfaces() )
  2999.         return CleanupAndExit("RestoreSurfaces Failed!");
  3000. return 1;
  3001. }
  3002. int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,
  3003.                         int nCmdShow )
  3004. {
  3005.     MSG     msg;
  3006.     // save off application instance
  3007.     hInst = hInstance;
  3008.     if( !initApplication(hInstance, nCmdShow) )
  3009.     {
  3010.         return FALSE;
  3011.     }
  3012.     // Call the initialization procedure
  3013. if( !InitializeGame() )
  3014.     {
  3015.         OutputDebugString("ERROR STARTING THE GAMEn");
  3016. DestroyWindow( hWndMain );
  3017.         return FALSE;
  3018.     }
  3019.     // Initialize Sound Buffer
  3020. InitializeSound();
  3021.     // Go throught the message look
  3022. // When Idle update the screen
  3023. while( 1 )
  3024.     {
  3025.         
  3026. if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) )
  3027.         {
  3028.             if( !GetMessage( &msg, NULL, 0, 0 ) )
  3029.             {
  3030.                 return msg.wParam;
  3031.             }
  3032.             TranslateMessage(&msg);
  3033.             DispatchMessage(&msg);
  3034.         }
  3035.         else if ( bIsActive )
  3036.         {
  3037.             
  3038. UpdateFrame();
  3039.         }
  3040.         else
  3041.         {
  3042.             WaitMessage();
  3043.         }
  3044.     }
  3045. }