#include "public.h"
/* ----------------------------------- */
void
GameEngine_Init (GameEngine * ge)
{
Uint32 VideoFlags;
int SVolume = 128;
/* Video stuff */
if (!Video_Init (ge))
{
fprintf (stderr, "Can't init video!\n");
exit (1);
}
SDL_WM_SetCaption ("Tank Battle", "Tank");
SDL_ShowCursor (1);
ge->swapscreen =
SDL_CreateRGBSurface (SDL_SRCALPHA | SDL_HWSURFACE, WIDTH, HEIGHT, BPP,
ge->screen->format->Rmask,
ge->screen->format->Gmask,
ge->screen->format->Bmask,
ge->screen->format->Amask);
if (ge->swapscreen == NULL)
fprintf (stderr, "Can't allocate SwapScreen!\n");
ge->swapscreen = SDL_DisplayFormat (ge->swapscreen);
SDL_EnableKeyRepeat (0, 0);
/* Audio stuff */
////////////////////////////////////////////////////////////
///-----------------------------------------------
if (Sound)
{
if (Mix_OpenAudio (22050, AUDIO_S16, 1, 256) < 0)
{
fprintf (stderr, "Couldn't set 22050 Hz 16-bit audio :%s\n",
SDL_GetError ());
Sound = 0;
}
}
if (Sound)
{
/* Allocate 4 channels for mixing */
//Mix_AllocateChannels (2);
Mix_Volume (-1, SVolume);
Snd_bom = Mix_LoadWAV ("./snd/bom.wav");
Snd_ding = Mix_LoadWAV ("./snd/ding.wav");
Snd_dow = Mix_LoadWAV ("./snd/dow.wav");
}
/* More data init */
ge->bg1 =
SDL_CreateRGBSurface (SDL_SRCALPHA | SDL_HWSURFACE, WIDTH, HEIGHT, BPP,
ge->screen->format->Rmask,
ge->screen->format->Gmask,
ge->screen->format->Bmask,
ge->screen->format->Amask);
ge->bg2 =
SDL_CreateRGBSurface (SDL_SRCALPHA | SDL_HWSURFACE, WIDTH, HEIGHT, BPP,
ge->screen->format->Rmask,
ge->screen->format->Gmask,
ge->screen->format->Bmask,
ge->screen->format->Amask);
if (ge->bg1 == NULL || ge->bg2 == NULL)
{
fprintf (stderr, "Can't allocate SwapScreen!\n");
Video_Close (ge);
}
ge->bg1 = SDL_DisplayFormat (ge->bg1);
ge->bg2 = SDL_DisplayFormat (ge->bg2);
ge->tiles = IMG_Load ("pics/tiles.png");
SDL_SetColorKey (ge->tiles, SDL_SRCCOLORKEY,
SDL_MapRGB (ge->tiles->format, 255, 0, 255));
ge->tiles = SDL_DisplayFormat (ge->tiles);
ge->player1 = IMG_Load ("pics/player1.png");
SDL_SetColorKey (ge->player1, SDL_SRCCOLORKEY,
SDL_MapRGB (ge->player1->format, 255, 0, 255));
ge->player1 = SDL_DisplayFormat (ge->player1);
ge->player2 = IMG_Load ("pics/player2.png");
SDL_SetColorKey (ge->player2, SDL_SRCCOLORKEY,
SDL_MapRGB (ge->player2->format, 255, 0, 255));
ge->player2 = SDL_DisplayFormat (ge->player2);
ge->enemys = IMG_Load ("pics/enemys.png");
SDL_SetColorKey (ge->enemys, SDL_SRCCOLORKEY,
SDL_MapRGB (ge->enemys->format, 255, 0, 255));
ge->enemys = SDL_DisplayFormat (ge->enemys);
ge->bullets = IMG_Load ("pics/bullets.png");
SDL_SetColorKey (ge->bullets, SDL_SRCCOLORKEY,
SDL_MapRGB (ge->bullets->format, 255, 0, 255));
ge->bullets = SDL_DisplayFormat (ge->bullets);
ge->explodes = IMG_Load ("pics/explodes.png");
SDL_SetColorKey (ge->explodes, SDL_SRCCOLORKEY,
SDL_MapRGB (ge->explodes->format, 255, 0, 255));
ge->explodes = SDL_DisplayFormat (ge->explodes);
ge->level = 0;
ge->score[0] = 0;
ge->score[1] = 0;
}
/* ----------------------------------- */
void
GameEngine_Close (GameEngine * ge)
{
if (ge->swapscreen != NULL)
SDL_FreeSurface (ge->swapscreen);
if (ge->bg1 != NULL)
SDL_FreeSurface (ge->bg1);
if (ge->bg2 != NULL)
SDL_FreeSurface (ge->bg2);
if (ge->tiles != NULL)
SDL_FreeSurface (ge->tiles);
if (ge->player1 != NULL)
SDL_FreeSurface (ge->player1);
if (ge->player2 != NULL)
SDL_FreeSurface (ge->player2);
if (ge->enemys != NULL)
SDL_FreeSurface (ge->enemys);
if (ge->bullets != NULL)
SDL_FreeSurface (ge->bullets);
if (ge->explodes != NULL)
SDL_FreeSurface (ge->explodes);
if (ge->bigtank != NULL)
SDL_FreeSurface (ge->bigtank);
if (Sound)
{
Mix_FreeChunk (Snd_bom);
Mix_FreeChunk (Snd_ding);
Mix_FreeChunk (Snd_dow);
Mix_CloseAudio ();
}
}
/* ----------------------------------- */
int
Video_Init (GameEngine * ge)
{
Uint32 InitFlags;
InitFlags = SDL_INIT_VIDEO;
if (!Sound)
InitFlags |= SDL_INIT_AUDIO;
if (SDL_Init (InitFlags) < 0)
{
fprintf (stderr, "Can't init SDL:%s\n", SDL_GetError ());
return FALSE;
}
atexit (SDL_Quit);
Video_Set (ge);
return TRUE;
}
/* ----------------------------------- */
void
Video_Set (GameEngine * ge)
{
Uint32 VideoFlags;
if (ge->FULLSCREEN)
{
VideoFlags = SDL_SRCALPHA | SDL_SWSURFACE | SDL_FULLSCREEN;
}
else
VideoFlags = SDL_SRCALPHA | SDL_SWSURFACE;
if ((ge->screen =
SDL_SetVideoMode (WIDTH, HEIGHT, BPP, VideoFlags)) == NULL)
{
fprintf (stderr, "Couldn't set %ix%i video mode: %s\n",
WIDTH, HEIGHT, SDL_GetError ());
Video_Close (ge);
exit (2);
}
}
/* ----------------------------------- */
void
Video_Reset (GameEngine * ge)
{
SDL_BlitSurface (ge->screen, NULL, ge->swapscreen, NULL);
ge->FULLSCREEN = !ge->FULLSCREEN;
Video_Init (ge);
SDL_BlitSurface (ge->swapscreen, NULL, ge->screen, NULL);
SDL_UpdateRect (ge->screen, 0, 0, 0, 0);
}
/* ----------------------------------- */
void
Video_Close (GameEngine * ge)
{
SDL_Quit ();
}
/* ----------------------------------- */
void
PlaySound (Mix_Chunk * snd)
{
int Ch;
if (Sound)
{
if (Mix_PlayChannel (-1, snd, 0) < 0)
{
Ch = Mix_GroupOldest (-1);
Mix_HaltChannel (Ch);
Mix_PlayChannel (Ch, snd, 0);
}
}
}
/* ----------------------------------- */
void
ClearUp (GameEngine * ge)
{
if (ge->swapscreen != NULL)
SDL_FreeSurface (ge->swapscreen);
if (ge->bg1 != NULL)
SDL_FreeSurface (ge->bg1);
if (ge->tiles != NULL)
SDL_FreeSurface (ge->tiles);
if (ge->player1 != NULL)
SDL_FreeSurface (ge->player1);
if (ge->player2 != NULL)
SDL_FreeSurface (ge->player2);
if (ge->enemys != NULL)
SDL_FreeSurface (ge->enemys);
if (ge->bullets != NULL)
SDL_FreeSurface (ge->bullets);
if (ge->explodes != NULL)
SDL_FreeSurface (ge->explodes);
}
/* ----------------------------------- */
void
Load_Data (GameEngine * ge)
{
int i, j;
SDL_Surface *tmp, *tiles;
SDL_Rect res_rect, des_rect;
//ge->level=3;
if (ge->level == 0)
{
tiles = IMG_Load ("pics/tiles.png");
SDL_BlitSurface (tiles, NULL, ge->tiles, NULL);
SDL_FreeSurface (tiles);
tmp = IMG_Load ("pics/map01.png");
ge->bore_enemy = 16;
ge->enemy_left = 16;
ge->max_enemys = 4;
ge->player_left[0] = 4;
if(players==1)
ge->player_left[1] = 4;
else //single player
ge->player_left[1] = -10;
int tmpbg[][34] =
{
OO, OO, OO, OO, OO, OO, OO, OO, OO, OO, OO, OO, OO, OO, OO, OO, OO,
OO, OO, OO, OO, OO, OO, OO, OO, OO, OO, OO, OO, OO, OO, OO, OO, OO,
OO, OO, OO, OO, OO, OO, OO, OO, OO, OO, OO, OO, OO, OO, OO, OO, OO,
OO, OO, OO, OO, OO, OO, OO, OO, OO, OO, OO, OO, OO, OO, OO, OO, OO,
OO, OO, A1, A2, OO, OO, A1, A2, OO, OO, B1, B2, B2, B2, B2, B3, OO,
OO, C1, C2, C2, C2, C2, C3, OO, OO, A1, A2, OO, OO, A1, A2, OO, OO,
OO, OO, A3, A4, OO, OO, A3, A4, OO, OO, B4, B5, B5, B5, B5, B6, OO,
OO, C4, C5, C5, C5, C5, C6, OO, OO, A3, A4, OO, OO, A3, A4, OO, OO,
OO, OO, A3, A4, OO, OO, A3, A4, OO, OO, B1, B2, B2, B2, B2, B3, OO,
OO, C1, C2, C2, C2, C2, C3, OO, OO, A3, A4, OO, OO, A3, A4, OO, OO,
OO, OO, A5, A6, OO, OO, A5, A6, OO, OO, B4, B5, B5, B5, B5, B6, OO,
OO, C4, C5, C5, C5, C5, C6, OO, OO, A5, A6, OO, OO, A5, A6, OO, OO,
OO, OO, OO, OO, OO, OO, OO, OO, OO, OO, HH, B1, B2, B2, B2, B3, OO,
OO, C1, C2, C2, C2, C3, HH, OO, OO, OO, OO, OO, OO, OO, OO, OO, OO,
OO, OO, OO, OO, OO, OO, OO, OO, OO, OO, HH, B4, B5, B5, B5, B6, OO,