390 lines
16 KiB
C++
390 lines
16 KiB
C++
/***************************************************************************
|
|
alienBlaster
|
|
Copyright (C) 2004
|
|
Paul Grathwohl, Arne Hormann, Daniel Kuehn, Soenke Schwardt
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2, or (at your option)
|
|
any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
***************************************************************************/
|
|
using namespace std;
|
|
|
|
#include "infoscreen.h"
|
|
#include "global.h"
|
|
#include "surfaceDB.h"
|
|
#include "mixer.h"
|
|
#include "video.h"
|
|
#include "font.h"
|
|
#include "items.h"
|
|
#include "item.h"
|
|
|
|
Items *infoscreenItems;
|
|
|
|
Infoscreen::Infoscreen( SdlCompat_AcceleratedSurface *scr ) {
|
|
screen = scr;
|
|
font = new Font( FN_FONT_INTRO );
|
|
fontHighlighted = new Font( FN_FONT_INTRO_HIGHLIGHTED );
|
|
activeChoiceSprite = surfaceDB.loadSurface( FN_INTRO_SHOW_CHOICE );
|
|
lightFighterIcon1 = surfaceDB.loadSurface( FN_LIGHT_FIGHTER_1_ICON );
|
|
lightFighterIcon2 = surfaceDB.loadSurface( FN_LIGHT_FIGHTER_2_ICON );
|
|
heavyFighterIcon1 = surfaceDB.loadSurface( FN_HEAVY_FIGHTER_1_ICON );
|
|
heavyFighterIcon2 = surfaceDB.loadSurface( FN_HEAVY_FIGHTER_2_ICON );
|
|
choose = Mixer::mixer().loadSample( FN_SOUND_INTRO_CHOOSE, 100 );
|
|
confirm = Mixer::mixer().loadSample( FN_SOUND_INTRO_CONFIRM, 100 );
|
|
if (infoscreenItems) delete infoscreenItems;
|
|
infoscreenItems = new Items();
|
|
activeChoice = 0;
|
|
}
|
|
|
|
Infoscreen::~Infoscreen() {
|
|
if (infoscreenItems) delete infoscreenItems;
|
|
}
|
|
|
|
void Infoscreen::run() {
|
|
draw();
|
|
quitInfoscreen = false;
|
|
activeChoice = 0;
|
|
while ( !quitInfoscreen ) {
|
|
handleEvents();
|
|
draw();
|
|
SDL_Delay( 50 );
|
|
}
|
|
}
|
|
|
|
void Infoscreen::putBitmapAtPosition( int x, int y, SdlCompat_AcceleratedSurface* bitmap ) {
|
|
SDL_Rect d;
|
|
d.x = x - bitmap->w / 2;
|
|
d.y = y - bitmap->h / 2;
|
|
d.w = bitmap->w;
|
|
d.h = bitmap->h;
|
|
SDL_BlitSurface( bitmap, 0, screen, &d );
|
|
}
|
|
|
|
void Infoscreen::draw() {
|
|
// clear the screen
|
|
videoserver->clearScreen();
|
|
// draw vertical green line
|
|
SDL_Rect r;
|
|
r.x = 250;
|
|
r.y = 0;
|
|
r.w = 2;
|
|
r.h = screen->h;
|
|
SDL_FillRect(screen, &r, SDL_MapRGB(screen->format, 0, 255, 0) );
|
|
|
|
for ( int i = 0; i < NR_INFOSCREEN_CHOICES; i++ ) {
|
|
int ypos = 30 + i * 25;
|
|
if ( i == INFO_CREDITS ) ypos += 15;
|
|
if ( i == INFO_BACK_TO_MAIN_MENU ) ypos += 30;
|
|
if( activeChoice == i ) {
|
|
putBitmapAtPosition( 15, ypos + 8, activeChoiceSprite );
|
|
fontHighlighted->drawStr( screen, 30, ypos, SET_INFOSCREEN_CHOICES[ i ] );
|
|
} else {
|
|
font->drawStr( screen, 30, ypos, SET_INFOSCREEN_CHOICES[ i ] );
|
|
}
|
|
}
|
|
switch ( activeChoice ) {
|
|
case INFO_LIGHT_FIGHTER:
|
|
{
|
|
putBitmapAtPosition( 386, 50, lightFighterIcon1 );
|
|
putBitmapAtPosition( 502, 50, lightFighterIcon2 );
|
|
font->drawStr( screen, 270, 100, "The Light Fighter is more");
|
|
font->drawStr( screen, 270, 130, "vulnerable but smaller and");
|
|
font->drawStr( screen, 270, 160, "faster than the Heavy Fighter.");
|
|
font->drawStr( screen, 270, 200, "Possible Updates:");
|
|
newItem = new Item( Vector2D ( 270, 240 ) , Vector2D(0,0), ITEM_PRIMARY_UPGRADE );
|
|
infoscreenItems->addItem( newItem );
|
|
font->drawStr( screen, 300, 230, "Primary Weapon Upgrade");
|
|
newItem = new Item( Vector2D ( 270, 270 ) , Vector2D(0,0), ITEM_MACHINE_GUN );
|
|
infoscreenItems->addItem( newItem );
|
|
font->drawStr( screen, 300, 260, "Machinegun");
|
|
newItem = new Item( Vector2D ( 270, 300 ) , Vector2D(0,0), ITEM_DUMBFIRE_DOUBLE );
|
|
infoscreenItems->addItem( newItem );
|
|
font->drawStr( screen, 300, 290, "Double Dumbfire");
|
|
newItem = new Item( Vector2D ( 270, 330 ) , Vector2D(0,0), ITEM_KICK_ASS_ROCKET );
|
|
infoscreenItems->addItem( newItem );
|
|
font->drawStr( screen, 300, 320, "Kick-Ass Rocket");
|
|
newItem = new Item( Vector2D ( 270, 360 ) , Vector2D(0,0), ITEM_HELLFIRE );
|
|
infoscreenItems->addItem( newItem );
|
|
font->drawStr( screen, 300, 350, "Hellfire Rocket");
|
|
newItem = new Item( Vector2D ( 270, 390 ) , Vector2D(0,0), ITEM_HEATSEEKER );
|
|
infoscreenItems->addItem( newItem );
|
|
font->drawStr( screen, 300, 380, "Heatseeker");
|
|
newItem = new Item( Vector2D ( 270, 420 ) , Vector2D(0,0), ITEM_NUKE );
|
|
infoscreenItems->addItem( newItem );
|
|
font->drawStr( screen, 300, 410, "The Great Nuke");
|
|
newItem = new Item( Vector2D ( 270, 450 ) , Vector2D(0,0), ITEM_ENERGY_BEAM );
|
|
infoscreenItems->addItem( newItem );
|
|
font->drawStr( screen, 300, 440, "Energy Beam");
|
|
infoscreenItems->draw( screen );
|
|
break;
|
|
}
|
|
case INFO_HEAVY_FIGHTER:
|
|
{
|
|
putBitmapAtPosition( 386, 50, heavyFighterIcon1 );
|
|
putBitmapAtPosition( 502, 50, heavyFighterIcon2 );
|
|
font->drawStr( screen, 270, 100, "The Heavy Fighter has superior");
|
|
font->drawStr( screen, 270, 130, "firepower and an energyweapon");
|
|
font->drawStr( screen, 270, 160, "deflector. He lacks agility.");
|
|
font->drawStr( screen, 270, 200, "Possible Updates:");
|
|
newItem = new Item( Vector2D ( 270, 240 ) , Vector2D(0,0), ITEM_PRIMARY_UPGRADE );
|
|
infoscreenItems->addItem( newItem );
|
|
font->drawStr( screen, 300, 230, "Primary Weapon Upgrade");
|
|
newItem = new Item( Vector2D ( 270, 270 ) , Vector2D(0,0), ITEM_KICK_ASS_ROCKET );
|
|
infoscreenItems->addItem( newItem );
|
|
font->drawStr( screen, 300, 260, "Kick-Ass Rocket");
|
|
newItem = new Item( Vector2D ( 270, 300 ) , Vector2D(0,0), ITEM_HEATSEEKER );
|
|
infoscreenItems->addItem( newItem );
|
|
font->drawStr( screen, 300, 290, "Heatseeker");
|
|
newItem = new Item( Vector2D ( 270, 330 ) , Vector2D(0,0), ITEM_NUKE );
|
|
infoscreenItems->addItem( newItem );
|
|
font->drawStr( screen, 300, 320, "The Great Nuke");
|
|
newItem = new Item( Vector2D ( 270, 360 ) , Vector2D(0,0), ITEM_DEFLECTOR );
|
|
infoscreenItems->addItem( newItem );
|
|
font->drawStr( screen, 300, 350, "Energyweapon Deflector");
|
|
newItem = new Item( Vector2D ( 270, 390 ) , Vector2D(0,0), ITEM_LASER );
|
|
infoscreenItems->addItem( newItem );
|
|
font->drawStr( screen, 300, 380, "Heavy Laser");
|
|
infoscreenItems->draw( screen );
|
|
break;
|
|
}
|
|
case INFO_PRIMARY_WEAPON:
|
|
{
|
|
newItem = new Item( Vector2D ( 270, 50 ) , Vector2D(0,0), ITEM_PRIMARY_UPGRADE );
|
|
infoscreenItems->addItem( newItem );
|
|
font->drawStr( screen, 300, 40, "Primary Weapon Upgrade");
|
|
font->drawStr( screen, 270, 100, "The Primary Weapon Upgrade can");
|
|
font->drawStr( screen, 270, 130, "be used multiple times and each");
|
|
font->drawStr( screen, 270, 160, "time the primary weapon will");
|
|
font->drawStr( screen, 270, 190, "gain one extra shot or improve");
|
|
font->drawStr( screen, 270, 220, "its damage. The maximum for the");
|
|
font->drawStr( screen, 270, 250, "light fighter are three heavy");
|
|
font->drawStr( screen, 270, 280, "shots and for the heavy figher");
|
|
font->drawStr( screen, 270, 310, "five shots.");
|
|
infoscreenItems->draw( screen );
|
|
break;
|
|
}
|
|
case INFO_MACHINE_GUN:
|
|
{
|
|
newItem = new Item( Vector2D ( 270, 50 ) , Vector2D(0,0), ITEM_MACHINE_GUN );
|
|
infoscreenItems->addItem( newItem );
|
|
font->drawStr( screen, 300, 40, "Machine Gun");
|
|
font->drawStr( screen, 270, 100, "The Machine Gun fires a");
|
|
font->drawStr( screen, 270, 130, "massive amount of steel per");
|
|
font->drawStr( screen, 270, 160, "minute at the enemy on the");
|
|
font->drawStr( screen, 270, 190, "ground and in the air.");
|
|
font->drawStr( screen, 270, 220, "It has the ability to aim in a");
|
|
font->drawStr( screen, 270, 250, "small angle at nearby enemys.");
|
|
font->drawStr( screen, 270, 280, "This makes it useful to");
|
|
font->drawStr( screen, 270, 310, "attack formations from the");
|
|
font->drawStr( screen, 270, 340, "side.");
|
|
infoscreenItems->draw( screen );
|
|
break;
|
|
}
|
|
case INFO_DUMBFIRE_DOUBLE:
|
|
{
|
|
newItem = new Item( Vector2D ( 270, 50 ) , Vector2D(0,0), ITEM_DUMBFIRE_DOUBLE );
|
|
infoscreenItems->addItem( newItem );
|
|
font->drawStr( screen, 300, 40, "Double Dumbfire Rocket");
|
|
font->drawStr( screen, 270, 100, "With this upgrade, you get one");
|
|
font->drawStr( screen, 270, 130, "extra dumbfire missile for the");
|
|
font->drawStr( screen, 270, 160, "light fighter. These rockets");
|
|
font->drawStr( screen, 270, 190, "hit targets on the ground and");
|
|
font->drawStr( screen, 270, 220, "in the air.");
|
|
infoscreenItems->draw( screen );
|
|
break;
|
|
}
|
|
case INFO_KICK_ASS_ROCKET:
|
|
{
|
|
newItem = new Item( Vector2D ( 270, 50 ) , Vector2D(0,0), ITEM_KICK_ASS_ROCKET );
|
|
infoscreenItems->addItem( newItem );
|
|
font->drawStr( screen, 300, 40, "Kick-Ass Rocket");
|
|
font->drawStr( screen, 270, 100, "This is the strongest air to");
|
|
font->drawStr( screen, 270, 130, "ground rocket. It takes only");
|
|
font->drawStr( screen, 270, 160, "one shot to let a turret");
|
|
font->drawStr( screen, 270, 190, "explode but reloading takes");
|
|
font->drawStr( screen, 270, 220, "longer.");
|
|
infoscreenItems->draw( screen );
|
|
break;
|
|
}
|
|
case INFO_HELLFIRE:
|
|
{
|
|
newItem = new Item( Vector2D ( 270, 50 ) , Vector2D(0,0), ITEM_HELLFIRE );
|
|
infoscreenItems->addItem( newItem );
|
|
font->drawStr( screen, 300, 40, "Hellfire Rocket");
|
|
font->drawStr( screen, 270, 100, "Medium air to ground missiles");
|
|
font->drawStr( screen, 270, 130, "that are fired in pairs and");
|
|
font->drawStr( screen, 270, 160, "look much better than the");
|
|
font->drawStr( screen, 270, 190, "fat clumsy Kick-Ass-Rocket.");
|
|
infoscreenItems->draw( screen );
|
|
break;
|
|
}
|
|
// heatseaker (für Paul :-)
|
|
case INFO_HEATSEEKER:
|
|
{
|
|
newItem = new Item( Vector2D ( 270, 50 ) , Vector2D(0,0), ITEM_HEATSEEKER );
|
|
infoscreenItems->addItem( newItem );
|
|
font->drawStr( screen, 300, 40, "Heatseaker Rocket");
|
|
font->drawStr( screen, 270, 100, "Just hit the trigger and this");
|
|
font->drawStr( screen, 270, 130, "missile will find the enemy");
|
|
font->drawStr( screen, 270, 160, "itself. Ground targets as well");
|
|
font->drawStr( screen, 270, 190, "as air targets will be hit.");
|
|
font->drawStr( screen, 270, 220, "Each item gives 70 of these.");
|
|
infoscreenItems->draw( screen );
|
|
break;
|
|
}
|
|
case INFO_NUKE:
|
|
{
|
|
newItem = new Item( Vector2D ( 270, 50 ) , Vector2D(0,0), ITEM_NUKE );
|
|
infoscreenItems->addItem( newItem );
|
|
font->drawStr( screen, 300, 40, "The Great Nuke");
|
|
font->drawStr( screen, 270, 100, "Not much is known about this");
|
|
font->drawStr( screen, 270, 130, "weapon because everyone who");
|
|
font->drawStr( screen, 270, 160, "saw it exploding was dead in");
|
|
font->drawStr( screen, 270, 190, "just that moment.");
|
|
infoscreenItems->draw( screen );
|
|
break;
|
|
}
|
|
case INFO_DEFLECTOR:
|
|
{
|
|
newItem = new Item( Vector2D ( 270, 50 ) , Vector2D(0,0), ITEM_DEFLECTOR );
|
|
infoscreenItems->addItem( newItem );
|
|
font->drawStr( screen, 300, 40, "Energyweapon Deflector");
|
|
font->drawStr( screen, 270, 100, "This is a very useful");
|
|
font->drawStr( screen, 270, 130, "equipment for the heavy");
|
|
font->drawStr( screen, 270, 160, "fighter. It amplifies the");
|
|
font->drawStr( screen, 270, 190, "builtin deflector, so that");
|
|
font->drawStr( screen, 270, 220, "it is very hard to be hit");
|
|
font->drawStr( screen, 270, 250, "by an energy weapon.");
|
|
infoscreenItems->draw( screen );
|
|
break;
|
|
}
|
|
case INFO_ENERGY_BEAM:
|
|
{
|
|
newItem = new Item( Vector2D ( 270, 50 ) , Vector2D(0,0), ITEM_ENERGY_BEAM );
|
|
infoscreenItems->addItem( newItem );
|
|
font->drawStr( screen, 300, 40, "Energy Beam");
|
|
font->drawStr( screen, 270, 100, "The Energy Beam was built");
|
|
font->drawStr( screen, 270, 130, "for the light fighter and");
|
|
font->drawStr( screen, 270, 160, "its devastating power");
|
|
font->drawStr( screen, 270, 190, "makes it the best choice");
|
|
font->drawStr( screen, 270, 220, "against air targets. In");
|
|
font->drawStr( screen, 270, 250, "addition its really hard");
|
|
font->drawStr( screen, 270, 280, "to evade this weapon.");
|
|
infoscreenItems->draw( screen );
|
|
break;
|
|
}
|
|
case INFO_LASER:
|
|
{
|
|
newItem = new Item( Vector2D ( 270, 50 ) , Vector2D(0,0), ITEM_LASER );
|
|
infoscreenItems->addItem( newItem );
|
|
font->drawStr( screen, 300, 40, "Heavy Laser");
|
|
font->drawStr( screen, 270, 100, "This is the newest type");
|
|
font->drawStr( screen, 270, 130, "of equipment for the heavy");
|
|
font->drawStr( screen, 270, 160, "fighter. A skilled pilot");
|
|
font->drawStr( screen, 270, 190, "can take down two air");
|
|
font->drawStr( screen, 270, 220, "enemies at once with this");
|
|
font->drawStr( screen, 270, 250, "heavy laser.");
|
|
infoscreenItems->draw( screen );
|
|
break;
|
|
}
|
|
case INFO_SHIELD_UP:
|
|
{
|
|
newItem = new Item( Vector2D ( 270, 50 ) , Vector2D(0,0), ITEM_HEALTH );
|
|
infoscreenItems->addItem( newItem );
|
|
font->drawStr( screen, 300, 40, "Health Powerup");
|
|
font->drawStr( screen, 270, 100, "If your shield goes down");
|
|
font->drawStr( screen, 270, 130, "this powerup is especially");
|
|
font->drawStr( screen, 270, 160, "useful for instant repairs.");
|
|
font->drawStr( screen, 270, 190, "Try to get it as often as");
|
|
font->drawStr( screen, 270, 220, "you can.");
|
|
infoscreenItems->draw( screen );
|
|
break;
|
|
}
|
|
case INFO_CREDITS:
|
|
{
|
|
font->drawStr( screen, 445, 40, "Alien Blaster", FONT_ALIGN_CENTERED );
|
|
font->drawStr( screen, 270, 100, "Programming:");
|
|
font->drawStr( screen, 280, 130, "Arne Hormann, Daniel Kühn,");
|
|
font->drawStr( screen, 280, 160, "Paul Grathwohl, Sönke Schwardt");
|
|
font->drawStr( screen, 270, 210, "Art Work: Arne Hormann", FONT_MONOSPACE);
|
|
font->drawStr( screen, 270, 240, "Music: Paul Grathwohl", FONT_MONOSPACE);
|
|
font->drawStr( screen, 620, 440, "Contact: AlienBlaster@gmx.de", FONT_ALIGN_RIGHT);
|
|
break;
|
|
}
|
|
case INFO_BACK_TO_MAIN_MENU:
|
|
{
|
|
font->drawStr( screen, 445, 220, "GO AND FIGHT !", FONT_ALIGN_CENTERED );
|
|
break;
|
|
}
|
|
}
|
|
SDL_Flip( screen );
|
|
}
|
|
|
|
void Infoscreen::handleEvents() {
|
|
SDL_Event event;
|
|
|
|
while ( SDL_PollEvent(&event) ) {
|
|
switch(event.type) {
|
|
case SDL_KEYDOWN: {
|
|
switch ( event.key.keysym.sym ) {
|
|
case SDLK_F5: {
|
|
videoserver->toggleFullscreen();
|
|
break;
|
|
}
|
|
case SDLK_F7: {
|
|
if ( playMusicOn ) {
|
|
playMusicOn = false;
|
|
Mixer::mixer().stopMusic();
|
|
} else {
|
|
playMusicOn = true;
|
|
Mixer::mixer().playMusic( MUSIC_INTRO, -1, 1000 );
|
|
}
|
|
break;
|
|
}
|
|
case SDLK_UP: {
|
|
Mixer::mixer().playSample( choose, 0 );
|
|
infoscreenItems->deleteAllItems();
|
|
activeChoice--;
|
|
if ( activeChoice < 0 ) activeChoice = NR_INFOSCREEN_CHOICES - 1;
|
|
break;
|
|
}
|
|
case SDLK_DOWN: {
|
|
Mixer::mixer().playSample( choose, 0 );
|
|
infoscreenItems->deleteAllItems();
|
|
activeChoice = (activeChoice + 1) % NR_INFOSCREEN_CHOICES;
|
|
break;
|
|
}
|
|
case SDLK_ESCAPE: {
|
|
quitInfoscreen = true;
|
|
break;
|
|
}
|
|
case SDLK_RETURN: {
|
|
Mixer::mixer().playSample( confirm, 0 );
|
|
switch (activeChoice) {
|
|
case INFO_BACK_TO_MAIN_MENU: {
|
|
quitInfoscreen = true;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
default: break;
|
|
}
|
|
break;
|
|
}
|
|
default: break;
|
|
}
|
|
}
|
|
}
|
|
|