📄 winmain.cpp
字号:
//*******************************************************
//* INVASION - By Maur韈io Teichmann RItter 1998 *
//* Please, respect the copyright *
//*******************************************************
#include <windows.h>
#include <windowsx.h>
#include <stdio.h>
#include <math.h>
#include <ddraw.h>
#include "ddutil.h"
#include "dsutil.hpp"
#include "ufo.hpp"
#include "resource.h"
// Define Weapon kinds
#define WP_1_LASER 0
#define WP_2_LASER 1
#define WP_3_LASER 2
#define WP_1_PHOTON 3
#define WP_2_PHOTON 4
#define WP_3_PHOTON 5
// Define Ship States
#define SHIP_OK 0
#define SHIP_EXPLODING 1
#define SHIP_DESTROYED 3
// Define the application states
#define APP_MAINMENU 0
#define APP_GAMESCREEN 1
#define APP_CREDITS 2
#define APP_HELPSCREEN 3
int iAppState = APP_MAINMENU;
LPDIRECTDRAW7 lpDD;
LPDIRECTDRAWSURFACE7 lpFrontBuffer;
LPDIRECTDRAWSURFACE7 lpBackBuffer;
LPDIRECTDRAWSURFACE7 lpUfo;
LPDIRECTDRAWSURFACE7 lpBkGround;
LPDIRECTDRAWSURFACE7 lpShip;
LPDIRECTDRAWSURFACE7 lpShoot;
LPDIRECTDRAWSURFACE7 lpShoot2;
LPDIRECTDRAWSURFACE7 lpUfoShoot;
LPDIRECTDRAWSURFACE7 lpBoom;
LPDIRECTDRAWSURFACE7 lpShipBoom;
LPDIRECTDRAWSURFACE7 lpAlpha;
LPDIRECTDRAWSURFACE7 lpSelect;
LPDIRECTDRAWSURFACE7 lpStatusBar;
LPDIRECTDRAWSURFACE7 lpExtra;
LPDIRECTDRAWPALETTE lpArtPalette;
//** INITIAL POINTERS
Ovni* pUFO = NULL;
Bullet* pBullet = NULL;
Extra* pExtra = NULL;
unsigned int score;
unsigned int Lastscore;
DWORD dwShipExplode;
int iOption;
LPDIRECTSOUND lpDS;
HSNDOBJ hsoEnter = NULL;
HSNDOBJ hsoShoot = NULL;
HSNDOBJ hsoStop = NULL;
HSNDOBJ hsoBoom = NULL;
HSNDOBJ hsoUfoShoot = NULL;
HSNDOBJ hsoSelect = NULL;
HSNDOBJ hsoGetExtra = NULL;
HSNDOBJ hsoGameOver = NULL;
BOOL bSoundEnabled = FALSE;
BOOL bShipStop = FALSE;
BOOL bShootEnable = TRUE;
BOOL bShoot = FALSE;
BOOL iRepaint = -1;
HWND hWndMain;
HINSTANCE hInst;
BOOL bIsActive;
DWORD dwTransType;
DWORD lastTickCount = 0;
DWORD dwFillColor;
//** SHIP VARIABLES
int iShipMov;
int iShipState = 0;
int iShipPos = 285;
int iWeapon = 0;
int iLastWeapon = -1;
int iPhotonAmmo = 0;
int iLaserAmmo = 100;
int iLastAmmo = -1;
int iMaxWeapon = 0;
int iShield = 0;
int iLastShield = -1;
//** LEVEL VARIABLES
int iLevel;
int SHOOTCHANCE = 1000;
// Defini玢o das fun珲es
int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow );
BOOL RestoreSurfaces( void );
void DestroyGame(void);
BOOL RestoreSurfaces( void );
void bltText(char* buffer, int x, int y);
void ShowGameOver();
void DrawBackGround(LPDIRECTDRAWSURFACE7 lpDest, int x, int y, int wx, int wy);
BOOL LoadUfoSurface(int iFlags);
BOOL CleanupAndExit( char *err);
void InitLevel(BOOL bStart)
{
Ovni* pFirst;
Bullet* auxpBullet;
Extra* pAuxExtra;
int i = 0;
int valInc = 1;
int rem;
int iLastExtra = 0;
DWORD tick;
HRESULT hRet;
DDBLTFX ddbltfx;
char buffer[10];
while(pExtra !=NULL)
{
pAuxExtra = pExtra->GetNext();
delete(pExtra);
pExtra = pAuxExtra;
}
while(pBullet !=NULL)
{
auxpBullet = pBullet->GetNext();
delete(pBullet);
pBullet = auxpBullet;
}
iLevel++;
if (LoadUfoSurface(iLevel) != TRUE)
CleanupAndExit("General Failed loading Ufo... Restart Game !");
switch(iLevel % 6)
{
case 0:
int i;
i = iLevel / 6;
pUFO = new Ovni;
pFirst = pUFO;
pUFO->SetXY(20,20);
iLastExtra = pUFO->CreateExtra(0);
pUFO->SetInc(i);
pUFO->SetMov(0);
pUFO->iType = 2;
pUFO->SetStr((int)(iLevel /7)+1);
pUFO->SetNext(NULL);
pUFO->SetNext(new Ovni);
pUFO = pUFO->GetNext();
pUFO->SetXY(110,90);
iLastExtra = pUFO->CreateExtra(iLastExtra);
pUFO->SetInc(i);
pUFO->SetMov(0);
pUFO->iType = 2;
pUFO->SetStr((int)(iLevel /7)+1);
pUFO->SetNext(NULL);
pUFO->SetNext(new Ovni);
pUFO = pUFO->GetNext();
pUFO->SetXY(20,160);
iLastExtra = pUFO->CreateExtra(iLastExtra);
pUFO->SetInc(i);
pUFO->SetMov(0);
pUFO->iType = 2;
pUFO->SetStr((int)(iLevel /7)+1);
pUFO->SetNext(NULL);
pUFO->SetNext(new Ovni);
pUFO = pUFO->GetNext();
pUFO->SetXY(540,20);
iLastExtra = pUFO->CreateExtra(iLastExtra);
pUFO->SetInc(i);
pUFO->SetMov(1);
pUFO->iType = 2;
pUFO->SetStr((int)(iLevel /7)+1);
pUFO->SetNext(NULL);
pUFO->SetNext(new Ovni);
pUFO = pUFO->GetNext();
pUFO->SetXY(470,90);
iLastExtra = pUFO->CreateExtra(iLastExtra);
pUFO->SetInc(i);
pUFO->SetMov(1);
pUFO->iType = 2;
pUFO->SetStr((int)(iLevel /7)+1);
pUFO->SetNext(NULL);
pUFO->SetNext(new Ovni);
pUFO = pUFO->GetNext();
pUFO->SetXY(540,160);
iLastExtra = pUFO->CreateExtra(iLastExtra);
pUFO->SetInc(i);
pUFO->SetMov(1);
pUFO->iType = 2;
pUFO->SetStr((int)(iLevel /7)+1);
pUFO->SetNext(NULL);
break;
case 1:
for (i=0; i<3; i++)
{
if (i==0)
{
pUFO = new Ovni;
pFirst = pUFO;
}
else
{
pUFO->SetNext(new Ovni);
pUFO = pUFO->GetNext();
}
pUFO->SetXY(15 + (i*30),(i * 65)+10);
iLastExtra = pUFO->CreateExtra(iLastExtra);
pUFO->SetInc(1);
pUFO->SetMov(0);
pUFO->SetNext(NULL);
pUFO->SetQtdeDown(1);
pUFO->SetStr((int)(iLevel /7)+1);
}
pUFO->SetNext(new Ovni);
pUFO = pUFO->GetNext();
pUFO->SetXY(45,195);
iLastExtra = pUFO->CreateExtra(iLastExtra);
pUFO->SetInc(1);
pUFO->SetMov(0);
pUFO->SetNext(NULL);
pUFO->SetQtdeDown(1);
pUFO->SetStr((int)(iLevel /7)+1);
pUFO->SetNext(new Ovni);
pUFO = pUFO->GetNext();
pUFO->SetXY(15,260);
iLastExtra = pUFO->CreateExtra(iLastExtra);
pUFO->SetInc(1);
pUFO->SetMov(0);
pUFO->SetNext(NULL);
pUFO->SetQtdeDown(1);
pUFO->SetStr((int)(iLevel /7)+1);
for (i=0; i<3; i++)
{
pUFO->SetNext(new Ovni);
pUFO = pUFO->GetNext();
pUFO->SetXY(560 - (i*30),(i * 65)+10);
iLastExtra = pUFO->CreateExtra(iLastExtra);
pUFO->SetInc(-1);
pUFO->SetMov(0);
pUFO->SetNext(NULL);
pUFO->SetQtdeDown(1);
pUFO->SetStr((int)(iLevel /7)+1);
}
pUFO->SetNext(new Ovni);
pUFO = pUFO->GetNext();
pUFO->SetXY(530,195);
iLastExtra = pUFO->CreateExtra(iLastExtra);
pUFO->SetInc(-1);
pUFO->SetMov(0);
pUFO->SetNext(NULL);
pUFO->SetQtdeDown(1);
pUFO->SetStr((int)(iLevel /7)+1);
pUFO->SetNext(new Ovni);
pUFO = pUFO->GetNext();
pUFO->SetXY(560,260);
iLastExtra = pUFO->CreateExtra(iLastExtra);
pUFO->SetInc(-1);
pUFO->SetMov(0);
pUFO->SetNext(NULL);
pUFO->SetQtdeDown(1);
pUFO->SetStr((int)(iLevel /7)+1);
break;
case 2:
for (i=0; i<5; i++)
{
if (i==0)
{
pUFO = new Ovni;
pFirst = pUFO;
}
else
{
pUFO->SetNext(new Ovni);
pUFO = pUFO->GetNext();
}
pUFO->SetXY(15 + (i*30),(i * 65)+10);
iLastExtra = pUFO->CreateExtra(iLastExtra);
pUFO->SetInc(1);
pUFO->SetMov(0);
pUFO->SetNext(NULL);
pUFO->SetQtdeDown(1);
pUFO->SetStr((int)(iLevel /7)+1);
}
for (i=0; i<5; i++)
{
pUFO->SetNext(new Ovni);
pUFO = pUFO->GetNext();
pUFO->SetXY(560 - (i*30),(i * 65)+10);
iLastExtra = pUFO->CreateExtra(iLastExtra);
pUFO->SetInc(-1);
pUFO->SetMov(0);
pUFO->SetNext(NULL);
pUFO->SetQtdeDown(1);
pUFO->SetStr((int)(iLevel /7)+1);
}
break;
case 4:
pUFO = new Ovni;
pFirst = pUFO;
pUFO->SetXY(20,20);
iLastExtra = pUFO->CreateExtra(iLastExtra);
pUFO->SetInc(2);
pUFO->SetMov(2);
pUFO->iType = 1;
pUFO->SetStr((int)(iLevel /7)+1);
pUFO->SetNext(NULL);
pUFO->SetNext(new Ovni);
pUFO = pUFO->GetNext();
pUFO->SetXY(180,180);
iLastExtra = pUFO->CreateExtra(iLastExtra);
pUFO->SetInc(2);
pUFO->SetMov(2);
pUFO->iType = 1;
pUFO->SetStr((int)(iLevel /7)+1);
pUFO->SetNext(NULL);
pUFO->SetNext(new Ovni);
pUFO = pUFO->GetNext();
pUFO->SetXY(530,110);
iLastExtra = pUFO->CreateExtra(iLastExtra);
pUFO->SetInc(2);
pUFO->SetMov(3);
pUFO->iType = 1;
pUFO->SetStr((int)(iLevel /7)+1);
pUFO->SetNext(NULL);
pUFO->SetNext(new Ovni);
pUFO = pUFO->GetNext();
pUFO->SetXY(100,100);
iLastExtra = pUFO->CreateExtra(iLastExtra);
pUFO->SetInc(2);
pUFO->SetMov(1);
pUFO->iType = 1;
pUFO->SetStr((int)(iLevel /7)+1);
pUFO->SetNext(NULL);
pUFO->SetNext(new Ovni);
pUFO = pUFO->GetNext();
pUFO->SetXY(450,190);
iLastExtra = pUFO->CreateExtra(iLastExtra);
pUFO->SetInc(2);
pUFO->SetMov(0);
pUFO->iType = 1;
pUFO->SetStr((int)(iLevel /7)+1);
pUFO->SetNext(NULL);
break;
case 5:
pUFO = new Ovni;
pFirst = pUFO;
pUFO->SetXY(20,20);
iLastExtra = pUFO->CreateExtra(iLastExtra);
pUFO->SetInc(3);
pUFO->SetMov(2);
pUFO->iType = 1;
pUFO->SetStr((int)(iLevel /7)+1);
pUFO->SetNext(NULL);
pUFO->SetNext(new Ovni);
pUFO = pUFO->GetNext();
pUFO->SetXY(90,90);
iLastExtra = pUFO->CreateExtra(iLastExtra);
pUFO->SetInc(3);
pUFO->SetMov(2);
pUFO->iType = 1;
pUFO->SetStr((int)(iLevel /7)+1);
pUFO->SetNext(NULL);
pUFO->SetNext(new Ovni);
pUFO = pUFO->GetNext();
pUFO->SetXY(20,160);
iLastExtra = pUFO->CreateExtra(iLastExtra);
pUFO->SetInc(3);
pUFO->SetMov(3);
pUFO->iType = 1;
pUFO->SetStr((int)(iLevel /7)+1);
pUFO->SetNext(NULL);
pUFO->SetNext(new Ovni);
pUFO = pUFO->GetNext();
pUFO->SetXY(540,20);
iLastExtra = pUFO->CreateExtra(iLastExtra);
pUFO->SetInc(3);
pUFO->SetMov(3);
pUFO->iType = 1;
pUFO->SetStr((int)(iLevel /7)+1);
pUFO->SetNext(NULL);
pUFO->SetNext(new Ovni);
pUFO = pUFO->GetNext();
pUFO->SetXY(470,90);
iLastExtra = pUFO->CreateExtra(iLastExtra);
pUFO->SetInc(3);
pUFO->SetMov(3);
pUFO->iType = 1;
pUFO->SetStr((int)(iLevel /7)+1);
pUFO->SetNext(NULL);
pUFO->SetNext(new Ovni);
pUFO = pUFO->GetNext();
pUFO->SetXY(540,160);
iLastExtra = pUFO->CreateExtra(iLastExtra);
pUFO->SetInc(3);
pUFO->SetMov(2);
pUFO->iType = 1;
pUFO->SetStr((int)(iLevel /7)+1);
pUFO->SetNext(NULL);
break;
case 3:
for (int j=0;j<3;j++)
{
for (i=0;i<8;i++)
{
if (j==0 && i==0)
{
pUFO = new Ovni;
pFirst = pUFO;
}
else
{
pUFO->SetNext(new Ovni);
pUFO = pUFO->GetNext();
}
pUFO->SetXY((i * 77)+15,j*80);
iLastExtra = pUFO->CreateExtra(iLastExtra);
pUFO->SetInc(valInc);
pUFO->SetMov(0);
pUFO->SetStr((int)(iLevel /7)+1);
pUFO->SetNext(NULL);
}
//pUFO->SetMov(1);
//pUFO->SetInc (abs(pUFO->GetInc()) * -1);
valInc = valInc * -1;
}
break;
}
pUFO = pFirst;
ddbltfx.dwSize = sizeof( ddbltfx );
ddbltfx.dwFillColor = dwFillColor;
while (1)
{
hRet = lpFrontBuffer->Blt(NULL, NULL, NULL, DDBLT_COLORFILL, &ddbltfx);
if (hRet == DD_OK)
{
break;
}
if (hRet == DDERR_SURFACELOST)
{
hRet = RestoreSurfaces();
if (hRet != DD_OK)
break;
}
if (hRet != DDERR_WASSTILLDRAWING)
break;
}
strcpy(buffer,"LEVEL");
buffer[5] = ' ';
buffer[6] = iLevel/100 + '0';
rem = iLevel % 100;
buffer[7] = rem/10 + '0';
rem = iLevel % 10;
buffer[8] = rem + '0';
buffer[9] = '\0';
bltText(buffer,250,200);
tick = GetTickCount();
while(GetTickCount() - tick < 3000);
iShipState = 0;
iShipMov = 0;
iShipPos = 285;
iLastWeapon = -1;
iLastAmmo = -1;
iLastShield = -1;
Lastscore = -1;
SHOOTCHANCE = 180 - (40 * (int)(iLevel /7));
if (SHOOTCHANCE < 50)
SHOOTCHANCE = 50;
}
void ShowGameOver()
{
DWORD tick;
HRESULT hRet;
DDBLTFX ddbltfx;
char buffer[10];
ddbltfx.dwSize = sizeof( ddbltfx );
ddbltfx.dwFillColor = dwFillColor;
while (1)
{
hRet = lpFrontBuffer->Blt(NULL, NULL, NULL, DDBLT_COLORFILL, &ddbltfx);
if (hRet == DD_OK)
{
break;
}
if (hRet == DDERR_SURFACELOST)
{
hRet = RestoreSurfaces();
if (hRet != DD_OK)
break;
}
if (hRet != DDERR_WASSTILLDRAWING)
break;
}
strcpy(buffer,"GAME OVER");
buffer[9] = '\0';
bltText(buffer,250,200);
tick = GetTickCount();
SndObjPlay(hsoGameOver, NULL);
while(GetTickCount() - tick < 3500);
}
void ShowCredits()
{
DWORD tick;
HRESULT hRet;
DDBLTFX ddbltfx;
char buffer[24];
ddbltfx.dwSize = sizeof( ddbltfx );
ddbltfx.dwFillColor = dwFillColor;
while (1)
{
hRet = lpFrontBuffer->Blt(NULL, NULL, NULL, DDBLT_COLORFILL, &ddbltfx);
if (hRet == DD_OK)
{
break;
}
if (hRet == DDERR_SURFACELOST)
{
hRet = RestoreSurfaces();
if (hRet != DD_OK)
break;
}
if (hRet != DDERR_WASSTILLDRAWING)
break;
}
strcpy(buffer,"THIS GAME IS FREEWARE\0");
bltText(buffer,145,60);
strcpy(buffer,"IF YOU WANT TO MAIL ME\0");
bltText(buffer,130,130);
strcpy(buffer,"OR YOU ARE FROM A GAME\0");
bltText(buffer,120,200);
strcpy(buffer,"COMPANY AND WANT TO\0");
bltText(buffer,140,270);
strcpy(buffer,"HIRE ME, MY MAIL IS\0");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -