#include "DarkGDK.h"
#include "NewPlayer.h"
#include "New_Enemies.h"
#include "NewInput.h"
#include "NewText.h"
#include "NewTimer.h"
#include <iostream>
#include <vector>
#include <math.h>






// Timer Time Timer Class
float vx = 0; 
float vy = 0;
float vz = 0;
float gravity = - 0.5f;
float radius = 7.0f;




int BulletSpeedTimer = dbTimer();

int timeDelta;
int playerBullet = 300;
int TrackFire = 400;
int FireNumber = 400;
int rounds_LoadN = 300;
int TrackImage = 300;
int numberOfenemies = 0;
int BulletSpeed = 50;
int roundsLoad = 250;
int bulletSetPosition = 0;

// player variables
// Player X position
int bullets[50][5];
int iPlayerX = 448;
int ground = 1; 
int JumpTimer = 0;
int m4Click = 2;
int bulletYPosition = 0;
int bulletYPositionTracker = 0;



// player Y position
int iPlayerY = 650;
// speed the player should move
int iPlayerSpeed = 5;
// current frame the player is on
int character = 2; 
int sphereCam = 3;
int MainWeapon = 4;
int yCoordinateUpdate = 0;

int iPlayerFrame = 7;
int FireRate = 15;
int currentAmmo = 50;
int MaxM4Ammo = 50;
int reloadTimer = dbTimer();
int bulletCounter = 0;
int M4Click = 2;
int gunShot = 1;
int crosshair = 3;// might need to change this to correct image number
int remainingAmmo = 40;
int shootingTimer = dbTimer();
// player directions
const int STRAIGHT = 0 , LEFT = 1 , RIGHT = 2;
int iPlayerDirection = STRAIGHT;
//int character = 2;
//-------------------------------------------------------------------------------
// the y position of the player bullet
int iPlayerBulletY = 0;



// we increment this to form a delay for out animation
int iFrameAnimateDelay = 0;
float slope = 0.5;
// set true if the player is currently firing a bullet
bool bPlayerIsFiring = false;

// set true if the player is currently firing a bullet
bool bIsBulletFiring = false;
// player has cleared the level if this is true
bool g_bPlayerWin = false;
// player has lost a life if this is true (or game over if no lives)
bool g_bPlayerHit = false;
bool reloading = false; 
bool Moving = false;
bool Running = false; 
bool NoClip = false;
bool SpaceBarClicked = false;
bool addEnemy = false;
bool g_bWeaponsFire[5][50];
bool g_BulletsCreated = false;


// what frame of animation the dead player is showing of the explosion frames
int g_iPlayerDieFrame = 1;
// the delay for the player explosion frames
int g_iPlayerExplosionDelay = 0;
// how many lives the player has
int g_iPlayerLives = 5;
// the players score
int g_iPlayerScore = 0;
/*struct {             // Structure declaration
  int myNum;         // Member (int variable)
  string myString;   // Member (string variable)
} myStructure;  */     // Structure variable

const int FIRE_DELAY = 1000;
int g_timer = 0;
bool g_canFire = true;





// set up the animated sprite for the player and load in the explosion images as well as lazer bolt and the icon for a lives display
void playerSetup ( void )
{
	// the player animated sprite
	dbCreateAnimatedSprite ( 1 , "NewObjects\\ship_anim.png" , 3 , 3 , 1 );
	dbSprite ( 1 , iPlayerX , iPlayerY , 1 );
	dbSetSpriteFrame ( 1 , iPlayerFrame );
	dbSetSpritePriority ( 1 , 2 );

	//load crosshair image here and dbSprite for it
	// dbLoadImage("Images//crosshair.dds", crosshair);
    // dbSprite(crosshair, 0, 0, crosshair);
	// dbScaleSprite(crosshair, 120);

	// the images for explosions
	dbLoadImage ( "NewObjects\\boom0001.png" , 11 );
	dbLoadImage ( "NewObjects\\boom0002.png" , 12 );
	dbLoadImage ( "NewObjects\\boom0003.png" , 13 );
	dbLoadImage ( "NewObjects\\boom0004.png" , 14 );
	dbLoadImage ( "NewObjects\\boom0005.png" , 15 );
	dbLoadImage ( "NewObjects\\boom0006.png" , 16 );
	dbLoadImage ( "NewObjects\\boom0007.png" , 17 );
	dbLoadImage ( "NewObjects\\boom0008.png" , 18 );
	dbLoadImage ( "NewObjects\\boom0009.png" , 19 );
	dbLoadImage ( "NewObjects\\boom0010.png" , 20 );
	dbLoadImage ( "NewObjects\\boom0011.png" , 21 );
	dbLoadImage ( "NewObjects\\boom0012.png" , 22 );

	// player bullet
	dbLoadImage ( "NewObjects\\bolt.png" , 2 );
	dbLoadImage ( "NewObjects\\bolt3.png" , 250 );
	int LoadBullets = 150;

	for(int roundsLoadB = 0; roundsLoadB <= 50 ; roundsLoadB++)
	{ 
        dbLoadImage ( "NewObjects\\bolt3.png" , 250 + roundsLoad);
		roundsLoad++;
		
	}
	// ship icon to use for showing how many lives we have left
	dbLoadImage ( "NewObjects\\shipicon.png" , 40 );
}

// update the player in game
void playerUpdate ( void )
{



	// see if the player ship needs to try and go left
	if ( checkLeft() )
	{
		iPlayerX -= iPlayerSpeed;
		if ( iPlayerX < 0 )
			iPlayerX = 0;
		iPlayerDirection = LEFT;
	}
	// see if the player ship needs to try and go right
	else if ( checkRight() )
	{
		iPlayerX += iPlayerSpeed ;
		if ( iPlayerX > 1024 - 128 )
			iPlayerX = 1024 - 128;
		iPlayerDirection = RIGHT;
	}
	// not left or right, so lets face straight
	else
		iPlayerDirection = STRAIGHT;

	// animate the player
	playerAnimate();
	// check for player firing and update firing if a bullet is already in action
    playerUpdateFire();
	
  	
 
	            if(FireNumber < 400  )
   {   

	       moveBullet();

   }
          
	
	// place the player sprite at it's correct location
	dbSprite ( 1 , iPlayerX , iPlayerY , 1 );
	// set the frame the player sprite should show
	dbSetSpriteFrame ( 1 , iPlayerFrame );
}

// animate the player ship dependant on which direction we are going
void playerAnimate ( void )
{
	// firstly increment the animation delay
	iFrameAnimateDelay++;
		if ( iFrameAnimateDelay > 2 )
		{
			// reset the delay and lets go animate
			iFrameAnimateDelay = 0;
			switch ( iPlayerDirection )
			{
			case STRAIGHT:
				{
					// if we were heading left
					if ( iPlayerFrame < 3 )
						iPlayerFrame++;
					// if we were heading right
					else if ( iPlayerFrame > 4 && iPlayerFrame < 7 )
						iPlayerFrame--;
					else iPlayerFrame = 7;

				} break;
			case LEFT:
				{
					// lets animate to lean to the left
					if ( iPlayerFrame == 7 )
						iPlayerFrame = 3;
					else if ( iPlayerFrame > 1 )
						iPlayerFrame--;
				} break;
			case RIGHT:
				{
					// lean the ship to the right
					if ( iPlayerFrame == 7 )
						iPlayerFrame = 4;
					else if ( iPlayerFrame < 6 )
						iPlayerFrame++;
				} break;
			}
		}
}

// reset all the players variables back to default and place the player sprite there
void playerReset ( void )
{
	iPlayerX = 448;
	iPlayerY = 650;
	iPlayerSpeed = 5;
	iPlayerFrame = 7;
	iFrameAnimateDelay = 0;
	dbSprite ( 1 , iPlayerX , iPlayerY , 1 );
	dbSetSpriteFrame ( 1 , iPlayerFrame );
	g_bPlayerHit = false;
}

// move player ship past the top of the screen
bool playerLevelStart ( void )
{
	dbMoveSprite ( 1 , 8 );

	if ( dbSpriteY( 1 ) <= 0 )
	{
		dbSprite ( 1 , iPlayerX , 768 , 1 );
		return true;
	}
	else
		return false;

}

// move player ship from beneath the bottom back to its usual spot
bool playerLevelStart2 ( void )
{
	dbMoveSprite ( 1 , 8 );

	if ( dbSpriteY( 1 ) < iPlayerY )
	{
		dbSprite ( 1 , iPlayerX , iPlayerY , 1 );
		return true;
	}
	else
		return false;

}

void updateReloading()
{

     if(dbKeyState(19) && reloading == false && remainingAmmo > 0 && currentAmmo != MaxM4Ammo)
    {
		reloading = true;
		reloadTimer = dbTimer(); 



    }
	 if(reloading == true && dbTimer() - reloadTimer > 3000 )
	 {
       if(remainingAmmo >=MaxM4Ammo)
	   {
		   remainingAmmo -= (MaxM4Ammo - currentAmmo);
            currentAmmo = MaxM4Ammo;
	   }
	   else
	   {
		   if(currentAmmo + remainingAmmo >= MaxM4Ammo)
		   {
			   remainingAmmo = (currentAmmo + remainingAmmo) - MaxM4Ammo;
			   currentAmmo = MaxM4Ammo; 
		   }
		   else
		   {
			   currentAmmo  = currentAmmo + remainingAmmo;
			   remainingAmmo = 0;
		   }


	   }
       reloading = false; 
	 }
}







void updateBullets()
{
	//dbMoveSprite(FireNumber, 8);
	  int loadAmmoColumnB = 0;
	 int  loadAmmoB = 0;
	  // yCoordinateUpdate =  ;
	 //int yCoordinateBullet =  dbSpriteY ( (FireNumber) != (TrackFire)  )  ;  
 	for(int loadAmmoR = 0; loadAmmoR <= 50; loadAmmoR++)
	{    
		 loadAmmoColumnB++;
		
		  if(loadAmmoR == 50 && loadAmmoColumnB <= 5 )
		  {
		     loadAmmoR = 0;
             loadAmmoB = 0;
             loadAmmoColumnB++;

		  }
         if(g_bWeaponsFire[loadAmmoColumnB][loadAmmoB] == true && dbTimer() - BulletSpeedTimer > 2 && dbSpriteExist(FireNumber) != (TrackFire) )// This works Don't change it
		 {//Above if statement is if we have moved on from the current sprite to create a new one this is the sprite that needs to be moved
			 
			 if (dbSpriteExist(FireNumber) != (TrackFire)  && bulletYPosition > 1 && g_bWeaponsFire[loadAmmoColumnB][loadAmmoB] == true )// This works Don't change it
			 {
               
		       // Is a bullet active? That this code don't change it works fine
               // have we hit anything?
 		       playerCheckHitEnemiesM4();
		       //Bullet boundary check--------------------------------------//
               bulletHitOffUpScreen();
               //Bullet boundary check--------------------------------------//
			 }
			
		 } 

		
		  
         


 	}
	

 


}



void moveBullet( void )
{


	if (dbSpriteExist(FireNumber) != (TrackFire)  && bulletYPosition > 1 )// This works Don't change it
			 { 
				 //Something is wrong here-----------------------------------------------------------
				               dbMoveSprite ( FireNumber , 8 ); 	
			     //Something is wrong here---------------------------------------------------------------
			 }
}



void bulletHitOffUpScreen ( void )
{
	int loadAmmoColumnF = 0;
  
	for( int loadAmmoF = 0 ; loadAmmoF <= 50; loadAmmoF++)
	   {
		 if( loadAmmoF == 50 && loadAmmoColumnF <= 5 )
				  {
                      loadAmmoF = 0;
                      loadAmmoColumnF++;
				  }
		         if( dbSpriteExist(FireNumber) == (TrackFire))// Is this the current created bullet?
				   {
				 
				   }
		  
			   if(dbSpriteExist(FireNumber) != (TrackFire) && g_bWeaponsFire[loadAmmoColumnF][loadAmmoF] == true )
			   {
				   
	//Bullet boundary check--------------------------------------//
                 if (dbSpriteExist(FireNumber) != (TrackFire) && bulletYPosition < 1 && g_bWeaponsFire[loadAmmoColumnF][loadAmmoF]  == true )
		              {
						  dbDeleteSprite ( (FireNumber) != (TrackFire) );

						  g_bWeaponsFire[loadAmmoColumnF][loadAmmoF] = false;
		                 	
			
			              
			              //FireNumber--;
			              //rounds++;
			              //dbDeleteSprite ( 2 );
		   
		               }
//Bullet boundary check--------------------------------------//
			   }

		   
	    }


}












// update player bullets and check for fire
void playerUpdateFire ( void )
{
	           //Amount in the clip
	           int loadAmmo = 0 ;  
			   //How many clips?
               int loadAmmoColumn = 0;
   
	


	if(reloading == false && currentAmmo > 0  )
	{
		
          

 

        //bulletYPosition -= 8;
		if(dbSpaceKey() == 1 && playerBullet >= 250  )
		{  
			
			
			
		
           if(dbTimer() - shootingTimer  >  160 )
		   {

			   if(bulletCounter >= 50 )
			   {
				   bulletCounter = 0;//How many bullets you used in a clip?

			   }

              

             //  iPlayerBulletY = iPlayerY-32; //Bullet Position
			   
			   
			   
			   // Later on the if loop will need to be updated from 50 to 50 * 5 for Image and correspoding loopa
			   
		     	   playerBullet--;
		           currentAmmo--;
				   FireNumber--;
		           dbPlaySound ( 2 );
				   // updateBullets();//For intial bullet placement
				   bulletYPosition = iPlayerY-32;
                   dbSprite ( (FireNumber) - 1, iPlayerX + 48 , bulletYPosition, 250 );
	               dbSetSpritePriority ( FireNumber, 1 ); 
				  
		          
                   loadAmmo++;
				  
				   
				  if( loadAmmo == 50 && loadAmmoColumn <= 5 )
				  {
                      loadAmmo = 0;
                      loadAmmoColumn++;
				  }
				  bulletCounter++;
				  currentAmmo -= 1;
				  
				g_bWeaponsFire[loadAmmoColumn][loadAmmo]  = true;   
//----------------------------ammo is loaded ready to fire--------------------------------------------------------------------//
		 //--------------------------------------Live Code Here-----------------------------------------------------------------------------------------------//

    // are we already rapid firing? if so lets update
    
   	   if (dbSpriteExist(FireNumber) == TrackFire)
	     {
	        
			/*for(int roundsLoadN = 300; roundsLoadN <= 250 ; roundsLoadN--)
			{*/
		   
	       //bulletYPosition -= 8;
		//bulletYPosition -= bulletSetPosition;
       	   dbSprite (  (FireNumber) - 1, dbSpriteX (FireNumber) ,  bulletYPosition  , 250 );
           dbSetSpritePriority (FireNumber , 1 );
		   

		   
		   //dbRotateSprite  Should angle according to mouse cursor position
		   
		   TrackFire--;
		   rounds_LoadN--;
		   TrackImage--;
		   FireNumber--;
		   // have we hit anything?
 		   playerCheckHitEnemiesM4();
		   
		 
        /*  } *///For Loop comment out until I figure out why I need it
			

	

		

	   }
	 
	 shootingTimer = dbTimer();
	
	 
//-------------------------------------End of For Loop-----------------------------------------------------------------------------------------------//

//--------------------------------------Live Code Here-----------------------------------------------------------------------------------------------//	
//----------------------------ammo is loaded ready to fire--------------------------------------------------------------------//
		   }//DBTimerCode
     
		     if(dbSpriteExist(FireNumber) != (TrackFire) && g_bWeaponsFire[loadAmmoColumn][loadAmmo]  == true )// This works don't change it here
   {
	  // Check The Ammo  
     updateReloading();
	 // Check The Bullets
	 updateBullets();
	 
   }
		}//SpaceCode

	}//ReloadCode
	else if(currentAmmo <= 0 && reloading == false && SpaceBarClicked == false)
	{
		if(reloading == false && currentAmmo > 0 )
	{
		if(dbSpaceKey() == 1 )
		{
           if(dbTimer() - shootingTimer > 160 )
		   {
			   SpaceBarClicked = true; 
			   //play sound here out of ammo
			   shootingTimer = dbTimer();


		   }
		}
		if(dbSpaceKey() == 0 && SpaceBarClicked == true )
		{
			SpaceBarClicked = false;
		}
	}

	}

   
 


 





	


	
//--------------This is the ran out of ammo code from before-------------------------------------------//
if ( checkFire() == true && bPlayerIsFiring == false && playerBullet == (249))
	{
		// Uh oh ran out of big ammo
		bPlayerIsFiring = true;
		dbPlaySound ( 2 );
		iPlayerBulletY = iPlayerY-32;
		dbSprite ( 2 , iPlayerX + 48 , iPlayerBulletY , 2 );
		dbSetSpritePriority ( 2 , 1 );
	}
		

	// are we already firing? if so lets update
	if ( bPlayerIsFiring == true )
	{
		iPlayerBulletY -= 8;
		dbSprite ( 2 , dbSpriteX ( 2 ) , iPlayerBulletY , 2 );
        
		// have we hit anything?
		playerCheckHitEnemies();
		if ( iPlayerBulletY < 1 )
		{
			
			dbDeleteSprite ( 2 );
			bPlayerIsFiring = false;
		}
	}

//--------------This is the ran out of ammo code from before the 1st one-------------------------------------------//




	// if we arent currently shooting and have pressed fire - lets shoot a bullet
	/*if ( checkFire() == true && bPlayerIsFiring == false )
	{
		bPlayerIsFiring = true;
		dbPlaySound ( 2 );
		iPlayerBulletY = iPlayerY-32;
		dbSprite ( 2 , iPlayerX + 48 , iPlayerBulletY , 2 );
		dbSetSpritePriority ( 2 , 1 );
	}*/ //This code is commented out firing rapidly now

//---------------------------End of function update fire --------------------------------------------------------------------//

}

/*
void playerHop()
{
	if(vy == 0 && jumptimer == 0;)
	{
		vy == y * gravity;
	}
	else 
	{
          vy = vy + gravity;

	}

	if(ground == 1 && jumptimer > 0)jumptimer--;
	{
	    	if(dbUpKey() == 1 && jumptimer ==0)
			{
               vy= vy+ 3.3f;
			   jumptimer = 20;
			}

	}

} */
// has out bullet hit any enemies?











void playerCheckHitEnemiesM4 ( void )
{
	int playerBulletNew = 300;
	
	int rBulletX = dbSpriteX ( FireNumber ) + 12;
	int rBulletY = dbSpriteY ( FireNumber );
	
	
	
	

	int iEnemyX;
	int iEnemyY;
	int iEnemySprite = 9;

	// check bullet against all enemies-----------Rapid Fire------//
	for ( int iY = 0 ; iY < 5 ; iY++ )
	{
		for ( int iX = 0; iX < 5 ; iX++ )
		{
			iEnemySprite++;
			if ( g_bEnemiesAlive[iX][iY] == false )
				continue;
			iEnemyX = dbSpriteX ( iEnemySprite );
			iEnemyY = dbSpriteY ( iEnemySprite );

			// have we scored a hit?
			if ( ( rBulletX > iEnemyX && rBulletX < iEnemyX + dbSpriteWidth ( iEnemySprite ) ) || ( rBulletX + 8 > iEnemyX && rBulletX + 8 < iEnemyX + dbSpriteWidth ( iEnemySprite ) ) )
			{
				if ( ( rBulletY > iEnemyY && rBulletY < iEnemyY + dbSpriteHeight ( iEnemySprite ) ) || ( rBulletY + 32 > iEnemyY && rBulletY + 32 < iEnemyY + dbSpriteHeight ( iEnemySprite ) ) )
				{
					// yes! we have hit an enemy, lets increase the score and blow that enemy up
					dbPlaySound ( 3 );
					// delete the sprite
					dbDeleteSprite ( iEnemySprite );
					// make a new sprite to show the explosion
					dbSprite ( iEnemySprite , iEnemyX , iEnemyY , 11 );
					iPlayerBulletY = -1;
					g_bEnemiesAlive[iX][iY] = false;
					// add and display the new score
					g_iPlayerScore += 100;
					playerUpdateScore();
					return;
				}
			}
		}
	}

	// lastly check if we hit the saucer if it's flying past
	if ( dbSpriteVisible ( 60 ) == 1 )
	{
		iEnemySprite = 60;
		iEnemyX = dbSpriteX ( iEnemySprite );
		iEnemyY = dbSpriteY ( iEnemySprite );

		// have we hit the saucer?
		if ( ( rBulletX > iEnemyX && rBulletX < iEnemyX + dbSpriteWidth ( iEnemySprite ) ) || ( rBulletX + 8 > iEnemyX && rBulletX + 8 < iEnemyX + dbSpriteWidth ( iEnemySprite ) ) )
		{
			if ( ( rBulletY > iEnemyY && rBulletY < iEnemyY + dbSpriteHeight ( iEnemySprite ) ) || ( rBulletY + 32 > iEnemyY && rBulletY + 32 < iEnemyY + dbSpriteHeight ( iEnemySprite ) ) )
			{
				// yes to lets blow it up and update score
				dbPlaySound ( 3 );
				dbHideSprite ( iEnemySprite );
				dbSprite ( iEnemySprite+1 , iEnemyX , iEnemyY , 11 );
				iPlayerBulletY = -1;
				// update and display the new score
				g_iPlayerScore += 2000;
				playerUpdateScore();
				return;
			}
		}
	}


}

void playerCheckHitEnemies ( void )
{

int iBulletX = dbSpriteX ( 2 ) + 12;
	int iBulletY = dbSpriteY ( 2 );
	int iEnemyX;
	int iEnemyY;
	int iEnemySprite = 9;

//------------------This is regular hit check---------------------------------------------//
		// check bullet against all enemies
	for ( int iY = 0 ; iY < 5 ; iY++ )
	{
		for ( int iX = 0; iX < 5 ; iX++ )
		{
			iEnemySprite++;
			if ( g_bEnemiesAlive[iX][iY] == false )
				continue;
			iEnemyX = dbSpriteX ( iEnemySprite );
			iEnemyY = dbSpriteY ( iEnemySprite );

			// have we scored a hit?
			if ( ( iBulletX > iEnemyX && iBulletX < iEnemyX + dbSpriteWidth ( iEnemySprite ) ) || ( iBulletX + 8 > iEnemyX && iBulletX + 8 < iEnemyX + dbSpriteWidth ( iEnemySprite ) ) )
			{
				if ( ( iBulletY > iEnemyY && iBulletY < iEnemyY + dbSpriteHeight ( iEnemySprite ) ) || ( iBulletY + 32 > iEnemyY && iBulletY + 32 < iEnemyY + dbSpriteHeight ( iEnemySprite ) ) )
				{
					// yes! we have hit an enemy, lets increase the score and blow that enemy up
					dbPlaySound ( 3 );
					// delete the sprite
					dbDeleteSprite ( iEnemySprite );
					// make a new sprite to show the explosion
					dbSprite ( iEnemySprite , iEnemyX , iEnemyY , 11 );
					iPlayerBulletY = -1;
					g_bEnemiesAlive[iX][iY] = false;
					// add and display the new score
					g_iPlayerScore += 100;
					playerUpdateScore();
					return;
				}
			}
		}
	}

	// lastly check if we hit the saucer if it's flying past
	if ( dbSpriteVisible ( 60 ) == 1 )
	{
		iEnemySprite = 60;
		iEnemyX = dbSpriteX ( iEnemySprite );
		iEnemyY = dbSpriteY ( iEnemySprite );

		// have we hit the saucer?
		if ( ( iBulletX > iEnemyX && iBulletX < iEnemyX + dbSpriteWidth ( iEnemySprite ) ) || ( iBulletX + 8 > iEnemyX && iBulletX + 8 < iEnemyX + dbSpriteWidth ( iEnemySprite ) ) )
		{
			if ( ( iBulletY > iEnemyY && iBulletY < iEnemyY + dbSpriteHeight ( iEnemySprite ) ) || ( iBulletY + 32 > iEnemyY && iBulletY + 32 < iEnemyY + dbSpriteHeight ( iEnemySprite ) ) )
			{
				// yes to lets blow it up and update score
				dbPlaySound ( 3 );
				dbHideSprite ( iEnemySprite );
				dbSprite ( iEnemySprite+1 , iEnemyX , iEnemyY , 11 );
				iPlayerBulletY = -1;
				// update and display the new score
				g_iPlayerScore += 2000;
				playerUpdateScore();
				return;
			}
		}
	}






}

// player has died, play back the explosion animation
bool playerDie ( void )
{

	// if the sprite doesnt exist we havent started the animation yet
	if ( dbSpriteExist ( 6 ) == 0 )
	{
		// lets set the frame to the correct one
		g_iPlayerDieFrame = 11;
		// set up the explosion sprite (player sprite is currently hidden)
		dbSprite ( 6 , dbSpriteX ( 1 ) , dbSpriteY ( 1 ) , g_iPlayerDieFrame );
		return false;
	}
	else
	{
		// carry on the animation we started previously
		// increment the explosion delay
		g_iPlayerExplosionDelay++;
		if ( g_iPlayerExplosionDelay > 2 )
		{
			// increment the next frame to show
			g_iPlayerDieFrame++;
			g_iPlayerExplosionDelay = 0;
		}
		// show the explosion if we havent finished it yet
		if ( g_iPlayerDieFrame < 23 )
		{
			dbSprite ( 6 , dbSpriteX ( 1 ) , dbSpriteY ( 1 ) , g_iPlayerDieFrame );
			return false;
		}
		else
		{
			// we have finished the explosion
			g_iPlayerExplosionDelay = 0;
			// delete the explosion sprite and return true
			dbDeleteSprite ( 6 );
			return true;
		}

	}
}

// display how many lives the player has remaining on screen
void playerShowLives ( void )
{
	// firstly clean up any sprites we have already used for this
	for ( int i = 0 ; i < 5 ; i++ )
	{
		if ( dbSpriteExist ( 40 + i ) )
			dbDeleteSprite ( 40 + i );
	}

	// now make the right amount of sprites for how many lives we have
	int iX = 1024-70;
	for ( int iLife = 0 ; iLife < g_iPlayerLives-1 ; iLife++ )
	{
		dbSprite ( iLife + 40 , iX , 768-35 , 40 );
		iX -= 54;
	}
}

// update the players score on screen
void playerUpdateScore ( void )
{
	// first clear up any text shown
	newTextClear();
	char czScore[20];
	sprintf_s ( czScore , "%d" , g_iPlayerScore );
	// display the score
	newText( 0 , 730 , 32 , czScore , false , false );
}