#include "Joueur.h"

Arme::Arme(SDL_Surface* ecran,unsigned int IDarme,int xCalibreExpl,int yCalibreExpl, int recul) : m_ecran(ecran),m_xCalibreExpl(xCalibreExpl),m_yCalibreExpl(yCalibreExpl),m_IDarme(IDarme),m_recul(recul)
{//Constructeur

	if (IDarme==0)
	{
		//Assignation necessaire au baroudeur
		m_viseur=SDL_LoadBMP("Images/ViseurBaroudeur.bmp");
		m_arme=SDL_LoadBMP("Images/Baroudeur.bmp");
		m_tir=SDL_LoadBMP("Images/TirBaroudeur.bmp");
		m_impact=SDL_LoadBMP("Images/ImpactBaroudeur.bmp");
		m_munitionsRestantes=10;
	}
	else if (IDarme==1)
	{
		//Assignation necessaire � l'Usiane
		m_viseur=SDL_LoadBMP("Images/ViseurUsiane.bmp");
		m_arme=SDL_LoadBMP("Images/Usiane.bmp");
		m_tir=SDL_LoadBMP("Images/TirUsiane.bmp");
		m_impact=SDL_LoadBMP("Images/ImpactUsiane.bmp");
		m_munitionsRestantes=25;
	}
	else
	{
		//Assignation n�ecessaire au triphaseur
		m_viseur=SDL_LoadBMP("Images/ViseurTriphaseur.bmp");
		m_arme=SDL_LoadBMP("Images/Triphaseur.bmp");
		m_tir=SDL_LoadBMP("Images/TirTriphaseur.bmp");
		m_impact=SDL_LoadBMP("Images/ImpactTriphaseur.bmp");
		m_munitionsRestantes=125;
	}
}

Arme::~Arme()
{
	SDL_FreeSurface(m_viseur);
	SDL_FreeSurface(m_arme);
	SDL_FreeSurface(m_tir);
	SDL_FreeSurface(m_impact);
}

void Arme::afficher(bool tir, SDL_Rect* positionViseur)//Test du tir pris en charge par le joueur proprio
{
	//Traitement transparence
	SDL_SetColorKey(m_viseur,SDL_SRCCOLORKEY,SDL_MapRGB(m_viseur->format,255,255,255));//On met le fond (blanc) en invisible !
	SDL_SetColorKey(m_tir,SDL_SRCCOLORKEY,SDL_MapRGB(m_tir->format,255,255,255));
	SDL_SetColorKey(m_impact,SDL_SRCCOLORKEY,SDL_MapRGB(m_impact->format,255,255,255));
	SDL_SetColorKey(m_arme,SDL_SRCCOLORKEY,SDL_MapRGB(m_arme->format,255,255,255));
	SDL_SetAlpha(m_viseur,SDL_SRCALPHA,128);//On met le viseur en translucide !
	SDL_SetAlpha(m_impact,SDL_SRCALPHA,128);
	//R�glage de position
	SDL_Rect positionTir;
	SDL_Rect positionBrasDroit;
	positionBrasDroit.x=430+((positionViseur->x-positionViseur->x%10)/10);//420
	positionBrasDroit.y=265+((positionViseur->y-positionViseur->y%20)/20);//260
	if (tir && m_munitionsRestantes>0)
	{
		//Calculs
		SDL_Rect positionImpact;
		positionTir.x=positionBrasDroit.x+m_xCalibreExpl;//Affichage de l'impact
		positionTir.y=positionBrasDroit.y+m_yCalibreExpl;
		positionBrasDroit.x=positionBrasDroit.x+m_recul;//Recul
		positionBrasDroit.y=positionBrasDroit.y+m_recul;
		positionImpact.x=positionViseur->x+16;//Centre sur le viseur
		positionImpact.y=positionViseur->y+16;
		//Affichage de tir
		SDL_BlitSurface(m_impact,0,m_ecran,&positionImpact);
		SDL_BlitSurface(m_tir,0,m_ecran,&positionTir);//Collage tir
	}
	//Affichage d�faut
	SDL_BlitSurface(m_arme,0,m_ecran,&positionBrasDroit);
	SDL_BlitSurface(m_viseur,0,m_ecran,positionViseur);
}

void Arme::tir()
{
	//Retrait de muntion
	m_munitionsRestantes--;
}

unsigned int Arme::getTypeWeapon()
{
	return m_IDarme;
}

/*void Arme::recharger
  {
//Pleins de trucs interessants...
}*/


////////////////////////////////////////////////////////////
///////////////////////Changement de def////////////////////
////////////////////////////////////////////////////////////


Joueur::Joueur(SDL_Surface* ecran):m_ecran(ecran),m_armeCycle(0),m_tirInstant(false)
{
	m_armeOne=new Arme(ecran,0,80,85,5);
	m_armeTwo=new Arme(ecran,1,50,60,2);
	m_armeThree=new Arme(ecran,2,70,60,0);

	m_interVie=SDL_LoadBMP("Images/InterVie.bmp");
	m_positionInterVie.x=420;
	m_positionInterVie.y=403;
	for (int i(0);i<60;i++)
	{
		m_jaugeVie[i]=SDL_CreateRGBSurface(SDL_HWSURFACE,29,1,32,0,0,0,0);
		SDL_FillRect(m_jaugeVie[i],NULL,SDL_MapRGB(m_ecran->format,255,255-2*i,0));
	}
	m_variableVie=60;
}

Joueur::~Joueur()//Destructeur
{
	delete(m_armeOne);
	delete(m_armeTwo);
	delete(m_armeThree);
	SDL_FreeSurface(m_interVie);
}

void Joueur::afficher()
{

	if (m_armeCycle<4)//Si un tir vient d'�tre effectu�
	{
		m_tirInstant=true;
	}
	else
	{
		m_tirInstant=false;
	}
	m_armeCycle++;
	SDL_BlitSurface(m_interVie,0,m_ecran,&m_positionInterVie);

	SDL_Rect positionJaugeVie;
	positionJaugeVie.x=429;//420+9
	positionJaugeVie.y=412;//403+9
	for (int i(0); i<m_variableVie; i++)
	{
		positionJaugeVie.y=472-i;//412+60
		SDL_BlitSurface(m_jaugeVie[i],NULL,m_ecran,&positionJaugeVie);
	}
	m_armeSelect->afficher(m_tirInstant,&m_positionViseur);
}

void Joueur::setArme(std::string choixArme)
{
	if (choixArme=="Baroudeur")
	{
		m_armeSelect=m_armeOne;
	}
	else if (choixArme=="Usiane")
	{
		m_armeSelect=m_armeTwo;
	}
	else if (choixArme=="Triphaseur")
	{
		m_armeSelect=m_armeThree;
	}
}

void Joueur::giveMousePosition(int x, int y)
{
	m_positionViseur.x=x-32;
	m_positionViseur.y=y-32;
}

void Joueur::tir()
{
	m_armeCycle=0;
	m_armeSelect->tir();
}

void Joueur::recevoirDegats(int degats)
{
	m_variableVie=m_variableVie-degats;
	if (m_variableVie<0)
	{
		m_variableVie=0;
	}
}

bool Joueur::estVivant()
{
	if (m_variableVie>0)
	{
		return true;
	}
	else
	{
		return false;
	}
}

unsigned int Joueur::getTypeWeapon()
{
	return m_armeSelect->getTypeWeapon();
}