/*************************************************************************** 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; } } }