/*************************************************************************** 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. ***************************************************************************/ #ifndef RACER_HH #define RACER_HH #include "SDL.h" #include "geometry.h" #include #include "global.h" #include "settings.h" class SurfaceDB; class Gate; class Track; class Shot; class Shots; class Items; class Font; class BoundingBox; class ShieldGlow; /* The Racer is the vehicle, that the player can steer. */ class Racer { SdlCompat_AcceleratedSurface *spriteRacerBase; SDL_Rect drawRectBase; SdlCompat_AcceleratedSurface *spriteShadow; SdlCompat_AcceleratedSurface *spriteDeflector; SDL_Rect drawRectDeflector; SdlCompat_AcceleratedSurface *spriteHPStat; SdlCompat_AcceleratedSurface *spriteFighterIcon; // for collision with other racers or shots. // A rectangle with racersize * 0.9 is used. BoundingBox *boundingBox; int playerNr; int shipType; Font *font; // font used for displaying ammo and lapcnt int fontSize; SdlCompat_AcceleratedSurface *spriteSecondaryWeapons; SdlCompat_AcceleratedSurface *spriteSpecials; int sndShotPrimary; int sndShotSecondary; float points; // Movement-System Vector2D pos; // absolute position float shipAngle; // the orientation Vector2D vel; // the velocity vector // the boundary of the world (i.e. the reachable section of the screen) RectangleGeo *boundaryRect; // Weapon-System ShotTypes primaryShotType; Uint32 timeLastShotPrimary; ShotTypes activeSecondary; Uint32 timeLastShotSecondary; bool secondaryWeaponsAvailability[ NR_SECONDARY_WEAPONS ]; bool lastDumbfireWasLeft; SpecialTypes activeSpecial; int specialsAvailability[ NR_SPECIALS ]; Uint32 timeLastNukeUsed; Uint32 timeLastHeatseekerUsed; bool lastHeatseekerWasLeft; bool deflectorActive; int deflectorTimeLeft; // Damage-System float shield; float damage; float pixPerHP; float maxShield; float maxDamage; // not used at the moment: // returns the maximum reachable velocity. // if damage < 100 the reachable velocity will be reduced linearly float getActVelMax(); float maxVel; // needed for displaying the shield glow, when hit Uint32 shieldDamageEndTime; bool shieldDamageActive; ShieldGlow *shieldGlow; Uint32 timeLastMove; void repair( float amount ); bool thrust; bool backwards; bool left; bool right; bool fireWeapons; bool useSpecial; void addBannerItemCollected( BannerTexts text ); public: // Input-System - which keys are pressed at the moment void handlePlayerEvent( PlayerEvent pEvent, bool keyDown ); Racer( string fnSprite, int whichPlayer, Vector2D startpos, int newShipType ); ~Racer(); bool isDeflectorSpecialActive() { return deflectorActive; } inline int getPlayerNr() { return playerNr; } inline int getShipType() { return shipType; } void setPos( const Vector2D &newPos ); inline Vector2D getPos() { return pos; } inline Vector2D getVel() { return vel; } Vector2D setVel( const Vector2D &newVel ); // returns old vel // moves the racer according to his velocity and the pressed keys. // Already collides with the boundaryRect (the border of the world) Vector2D move( int dT ); void clipWorld(); // move the boundingBox accordingly to the movement void updateBoundingBox(); // fire the Guns! void shootPrimary(); void shootSecondary(); void shootSpecial(); // switch to the next available weapon // void switchPrimary(); void switchSecondary(); void switchSpecials(); // use the active special, if it should be used _once_ when keyDown-Event occurs void specialKeyDown(); // switch special, if the activespecial is out of ammo void specialKeyUp(); void drawRacer( SdlCompat_AcceleratedSurface *screen ); void drawShadow( SdlCompat_AcceleratedSurface *screen ); void drawStats( SdlCompat_AcceleratedSurface *screen ); // collision system // return if the line between the two points collides with the boundingBox bool collidesWith( const Vector2D &shotPosOld, const Vector2D &shotPosNew ); // return if the racers boundingBox overlaps with box bool collidesWith( BoundingBox *box ); // return if the racers boundingBox overlaps with circle bool collidesWith( const Circle &circle ); // returns if a inner circle around the racer overlaps with circle bool collidesWithAsCircle( const Circle &circle ); // returns if a inner circle around the racer overlaps with circle bool collidesWithAsCircle( BoundingBox *box ); // returns the boundingBox of the racer BoundingBox *getBoundingBox(); // the racer got hit -> do the damage according to the shotType void doDamage( ShotTypes shotType ); // recharge the shield void rechargeShield( int dT ); // the racer was hit void receiveDamage( float amount ); bool isDead(); void receivePoints( float amount ); // picks up items, if flown over void pickUpItems(); // returns the number of laps completed by the racer int getPoints() { return (int)(points + 0.5); } }; #endif