#include <SDL/SDL.h>
#include <SDL/SDL_opengl.h>
#include <GL/gl.h>
#include <GL/glu.h>

#include <stdlib.h>
#include <string>
#include <vector>
#include <math.h>

using namespace std;

#include "Moteur.h"
#include "PersoPrincipal.h"
#include "Map.h"

extern CMainPerso* PersoPrincipal;

#include "MoteurDepl.h"
#include "CSpritesPerso.h"

extern bool JeuEnPause;

CPerso::CPerso()
{
	Etat = IMMOBILE;
	DebutAnimDegat = FinAnimDegat = DebutAnim = SDL_GetTicks();
	LastSaut = SDL_GetTicks();
	Vie = VieMax = 1000;
	Mana = ManaMax = 1000;
	VitX = VitY = 0;
	Principal = false;
	
	for(int i = 0; i < 5; ++i)
		TouchesAppuyee[i] = false;
}

CPerso::~CPerso()
{
	
}

void CPerso::DessinePerso()
{
	static int nbanim;
	
	if(Map.DiedAcces(PosX + 32, PosY + 32) || Vie <= 0) Etat = MORT;
	
	if(Etat != MORT)
	{
		while(SDL_GetTicks() > LastCalcDepl + 5)
		{
			if(!JeuEnPause)
			{
				if(!Principal) CalcIA();
				CalcDepl();
			}
			
			LastCalcDepl += 5;
		}
	}

	if(!JeuEnPause)
	{

		//Debut du dessin, fin du calcul

		int temps = SDL_GetTicks();

		while(temps > DebutAnim + 1000) DebutAnim += 1000;

		int anim = temps - DebutAnim;
	
		if(anim < 100) nbanim = 0;
		else if(anim < 200) nbanim = 1;
		else if(anim < 300) nbanim = 2;
		else if(anim < 400) nbanim = 3;
		else if(anim < 500) nbanim = 4;
		else if(anim < 600) nbanim = 5;
		else if(anim < 700) nbanim = 6;
		else if(anim < 800) nbanim = 7;
		else if(anim < 900) nbanim = 8;
		else nbanim = 9;
	}
	unsigned char alpha = 255;
	
	if(SDL_GetTicks() < FinAnimDegat)
	{
		int i = ((SDL_GetTicks() - DebutAnimDegat) % 200);
		alpha = (i > 100) ? (int)((i - 100) * 2.55) : (int)((100 - i) * 2.55);
	}
	
	RenderPerso->DessinePerso(Etat, nbanim, PosX, PosY, 64, 64, VersLaDroite, 255, 255, 255, alpha);
	
	switch(Map.ReturnBonus(PosX, PosY))
	{
		case BONUS_ERREUR:
			 break;

		case BONUS_VIE_25P:
			Vie += (int)(VieMax * 0.25);
			break;

		case BONUS_VIE_50P:
			Vie += (int)(VieMax * 0.5);
			break;

		case BONUS_VIE_75P:
			Vie += (int)(VieMax * 0.75);
			break;

		case BONUS_VIE_100P:
			Vie = VieMax;
			break;

		case BONUS_MANA_25P:
			Mana += (int)(ManaMax * 0.25);
			break;

		case BONUS_MANA_50P:
			Mana += (int)(ManaMax * 0.5);
			break;

		case BONUS_MANA_75P:
			Mana += (int)(ManaMax * 0.75);
			break;

		case BONUS_MANA_100P:
			Mana = ManaMax;
			break;

		default:
			break;

	}

	if(Vie > VieMax) Vie = VieMax;
	if(Mana > ManaMax) Mana = ManaMax;
	

	glMatrixMode(GL_MODELVIEW);
	//glLoadIdentity();

}

void CPerso::ModifPos(int X, int Y)
{
	PosX = X;
	PosY = Y;
	HauteurMax = PosY;

	LastCalcDepl = SDL_GetTicks() - 10;
}

void CPerso::ModifTouche(int Touche, bool Appuyee)
{
	TouchesAppuyee[Touche] = Appuyee;
} 

int CPerso::ReturnPosX()
{
	return PosX;
}

int CPerso::ReturnPosY()
{
	return PosY;
}

int CPerso::ReturnVie()
{
	return Vie;
}

int CPerso::ReturnVieMax()
{
	return VieMax;
}

int CPerso::ReturnMana()
{
	return Mana;
}

int CPerso::ReturnManaMax()
{
	return ManaMax;
}
void CPerso::TexPerso(const char *nom)
{
	string str = nom;
	RenderPerso = ImgsPerso[str];
	
	if(RenderPerso == NULL)
	{
		CSpritesPerso* tmpsp = new CSpritesPerso();
		tmpsp->LoadTexPerso(nom);
		ImgsPerso[str] = tmpsp;
		RenderPerso = ImgsPerso[str];
	}
}

void CPerso::SetIA(int newIA)
{
	TypeIA = newIA;
}

void CPerso::SetIA(string stria)
{
	if(stria == "Aucune") TypeIA = IA_AUCUNE;
	else if(stria == "Ami") TypeIA = IA_AMI;
	else if(stria == "Ennemi") TypeIA = IA_ENNEMI;
	
}

int CPerso::ReturnIA()
{
	return TypeIA;
}

void CPerso::PerteVie(int vieenmoin)
{
	Vie -= vieenmoin;
	if(Vie <= 0)
	{
		Vie = 0;
		Etat = MORT;
		DebutAnim = SDL_GetTicks();
		if(Principal)
		{
			DebutAnim += 2000;
			Moteur.RajoutFondu(SDL_GetTicks() + 1000, SDL_GetTicks() + 2000, 0, 0, 0, 255, 0, 0, 0, 0);
		}
	}
	
}

bool CPerso::CampAllie()
{
	return ((TypeIA == IA_AMI) || (TypeIA == IA_AUCUNE));
}

void CPerso::AnimDegat()
{
	if(SDL_GetTicks() > FinAnimDegat) DebutAnimDegat = SDL_GetTicks();
	FinAnimDegat = SDL_GetTicks() + 200;
}



//Spécifique au perso principal ...

CMainPerso::CMainPerso()
{
	//Constructeur de MainPerso ...
	Principal = true;
	TypeIA = IA_AUCUNE;
	
}

CMainPerso::~CMainPerso()
{
	//destructeur ...
	
}

void CMainPerso::DessinePerso()
{
	CPerso::DessinePerso();
	
	
	if((Etat != MORT) && ((Map.DiedAcces(PosX + 32, PosY + 32) || Vie <= 0)))
	{
		Vie = 0;
		Etat = MORT;
		DebutAnim = SDL_GetTicks();
		DebutAnim += 2000;
		Moteur.RajoutFondu(SDL_GetTicks() + 1000, SDL_GetTicks() + 2000, 0, 0, 0, 255, 0, 0, 0, 0);
	}
	
	if((Etat == MORT) && (DebutAnim < SDL_GetTicks()))
	{		
		Vie = VieMax;
		Etat = IMMOBILE;
		DebutAnim = SDL_GetTicks();
		PosX = Map.ReturnPosDebutX();
		PosY = Map.ReturnPosDebutY();
		VitY = VitX = 0.0;
		Moteur.RajoutFondu(SDL_GetTicks(), SDL_GetTicks() + 1000, 0, 0, 0, 0, 0, 0, 0, 255);
	}
}


