C:/Documents and Settings/jegan/Desktop/projectX/Player.cpp

Go to the documentation of this file.
00001 #include "Player.h"
00002 #include "List.h"
00003 #include "Command.h"
00004 #include "CommandManager.h"
00005 #include "glfuncs.h"
00006 #include "Control.h"
00007 #include "Screen.h"
00008 #include "Weapon.h"
00009 #include "Level.h"
00010 
00011 #include <sstream>
00012 
00013 using namespace std;
00014 
00015 Player::Player(List * playerInfo, int x, int y)
00016 :Person(playerInfo,x,y), _secondaryWeapon(NULL),_cDWait(30),_cDTime(30)
00017 {
00018         //_secondaryWeapon = new Weapon("weapons/shotGun.txt",this);
00019 
00020         _depth = 2;
00021         _type = PLAYER;
00022 }
00023 
00024 Player::~Player()
00025 {
00026         delete _secondaryWeapon;
00027 }
00028 
00029 void Player::collide(Object *o)
00030 {
00031         Person::collide(o);
00032         if(o->getType() == BOSS && _cDTime > _cDWait) {
00033                 AddHealthCommand(this,-2).execute();
00034                 _cDTime = 0;
00035         }
00036 }
00037 
00038 void Player::die()
00039 {
00040         Person::die();
00041         Level::instance()->setScore(Level::instance()->getScore()/2);
00042 }
00043 
00044 Object *Player::copy()
00045 {
00046         Player *copy = new Player(*this);
00047         if(_primaryWeapon)
00048                 copy->_primaryWeapon = _primaryWeapon->copy(copy);
00049         if(_punchWeapon)
00050                 copy->_punchWeapon = _punchWeapon->copy(copy);
00051         if(_secondaryWeapon)
00052                 copy->_secondaryWeapon = _secondaryWeapon->copy(copy);
00053         return copy;
00054 }
00055 
00056 void Player::addSecondary(std::string filename)
00057 {
00058         Weapon* newSecondary = new Weapon(filename, this);
00059         if(_secondaryWeapon) {
00060 
00061                 if(_secondaryWeapon->id() == newSecondary->id()) {
00062                         _secondaryWeapon->addAmmo(newSecondary->getAmmo());
00063                         delete newSecondary;
00064                 }
00065                 else {
00066                         delete _secondaryWeapon;
00067                         _secondaryWeapon = newSecondary;
00068                 }
00069         }
00070         else
00071                 _secondaryWeapon = newSecondary;
00072 }
00073 
00074 void Player::shootSecondary()
00075 {
00076         if(_secondaryWeapon)
00077                 _secondaryWeapon->shoot();
00078 }
00079 
00080 SDL_Rect Player::drawSecondaryAmmo(SDL_Rect raster)
00081 {
00082         if(_secondaryWeapon)
00083                 return _secondaryWeapon->drawAmmo(raster);
00084 
00085         return raster;
00086 }
00087 
00088 // FIXME: Take this out.
00089 int saveTimer = 20;
00090 
00091 void Player::update()
00092 {
00093         Person::update();
00094 
00095         if(_secondaryWeapon) {
00096                 _secondaryWeapon->update();
00097 
00098                 if(_secondaryWeapon->getAmmo() == 0) {
00099                         delete _secondaryWeapon;
00100                         _secondaryWeapon = NULL;
00101                 }
00102         }
00103         saveTimer++;
00104         _cDTime++;
00105 }
00106 
00107 void Player::control()
00108 {
00109         Uint8 *keystates = SDL_GetKeyState( NULL );
00110 
00111         //SAVE DEMO BUTTON
00112         //if(keystates[SDLK_s])
00113         //{
00114         //      CommandManager::instance()->saveRecording("scripts/newDemo.txt");
00115         //}
00116         if(keystates[Control::leftKey])
00117         {
00118                 CommandManager::instance()->execute(new MoveCommand(this,LEFT));
00119         }
00120         if(keystates[Control::rightKey])
00121         {
00122                 CommandManager::instance()->execute(new MoveCommand(this,RIGHT));
00123         }
00124 
00125         // Jumping
00126         if(keystates[Control::jumpKey])
00127         {
00128                 CommandManager::instance()->execute(new JumpCommand(this,_xDirection));
00129         
00130                 //Keep the jump key state around so you can't jump by just holding the key
00131                 
00132                 //CommandManager::instance()->execute(new PlaySoundCommand("beat.wav"));
00133         }
00134         if(!keystates[Control::jumpKey])
00135                 //Reset the jump keystate as soon as we poll and see that the key is no longer held.
00136                 CommandManager::instance()->execute(new JumpResetCommand(this));
00137                 
00138         
00139         //if neither are pressed, or we're crouching, we should be shooting left and right
00140         if( ((!keystates[Control::upKey])&&(!keystates[Control::downKey]))||
00141                 ( _crouching ))
00142                 
00143                 CommandManager::instance()->execute(new AimCommand(this,MIDDLE));
00144 
00145         //if up only, shoot up, or if you're holding both up and down, since you'll
00146         // be crouched soon and thats the only thing that makes any sense if you press
00147         // both up and down at the same time
00148         if(  keystates[Control::upKey] || 
00149                 (keystates[Control::downKey] && keystates[Control::upKey]) )
00150                 CommandManager::instance()->execute(new AimCommand(this,UP));
00151 
00152         //if down only, shoot down, unless crouching
00153         if(!_crouching && keystates[Control::downKey])
00154                 CommandManager::instance()->execute(new AimCommand(this,DOWN));
00155 
00156         // Shooting
00157         if( keystates[Control::shoot2Key ] || keystates[ Control::shoot1Key] )
00158         {
00159                 //CommandManager::instance()->execute(new AimCommand(this,DOWN));
00160                 CommandManager::instance()->execute(new ShootCommand(this));
00161         }
00162 
00163         else if( keystates[ Control::altShoot1Key ] || keystates[ Control::altShoot2Key ] )
00164         {
00165                 CommandManager::instance()->execute(new SecondaryShootCommand(this));
00166         }
00167 
00168         // Crouching
00169         if( _crouching && !keystates[ Control::downKey ] )
00170         {
00171                 CommandManager::instance()->execute( new CrouchCommand( this, false ) );
00172         }
00173         if( keystates[ Control::downKey ] && !_crouching )
00174         {
00175                 CommandManager::instance()->execute( new CrouchCommand( this, true ) );
00176         }
00177 
00178         if( keystates[ SDLK_q ] && saveTimer > 20 ) {
00179                 CommandManager::instance()->startRecording();
00180                 CommandManager::instance()->execute(new StopPersonCommand(this));
00181                 CommandManager::instance()->execute(new SetPositionCommand(this,29*32, 31*32));
00182                 saveTimer = 0;
00183         }
00184         if( keystates[ SDLK_w ] && saveTimer > 20 ) {
00185                 CommandManager::instance()->saveRecording("demo.txt");
00186                 CommandManager::instance()->stopRecording();
00187                 saveTimer = 0;
00188         }
00189 }
00190 
00191 void Player::addHealth(int dHealth)
00192 {
00193         if( _health >= MAXHEALTH && dHealth > 0 )
00194                 return;
00195         else
00196                 Person::addHealth( dHealth );
00197 }

Generated on Fri May 5 00:20:19 2006 for ProjectX by  doxygen 1.4.6-NO