#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"
#include "Sorts.h"
#include "Define.h"

extern CMainPerso* PersoPrincipal;

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

extern bool JeuEnPause;

CPerso::CPerso()
{
	Etat = INDEFINI;
	DebutAnimDegat = FinAnimDegat = DebutAnim = SDL_GetTicks();
	LastSaut = SDL_GetTicks();
	Vie = VieMax = 1000;
	Mana = ManaMax = 1000;
	VitX = VitY = 0;
	Principal = false;
	DejaPasser = -1;
	
	for(int i = 0; i < 6; ++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;
		}
	}
	
	static int temps;
	
	if(!JeuEnPause)
	{
		temps = SDL_GetTicks();
	}
	unsigned char alpha = 255;
	
	if(SDL_GetTicks() < FinAnimDegat) alpha = (((SDL_GetTicks() - DebutAnimDegat) % 100) > 50) ? 255 : 0;
	
	RenderPerso->DessinePerso(Etat, (temps - DebutAnim) % 1000, PosX - 64, PosY - 64, 192, 128, 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 = PosXLastDepl = X;
	PosY = PosYLastDepl = Y;
	HauteurMax = PosY;
	
	TimeLastDepl = SDL_GetTicks();
	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)
{
	TypeIA = IA_AUCUNE;
	if(stria == "Polyvalent") TypeIA = IA_POLYVALENT;
	else if(stria == "Ennemi") TypeIA = IA_ENNEMI;
	else if(stria == "Soigneur") TypeIA = IA_SOIGNEUR;
	
}

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);
		}
	}
	
}

void CPerso::GainVie(int VieEnPlus)
{
	Vie += VieEnPlus;
	if(Vie > VieMax)
	{
		Vie = VieMax;
	}
}

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

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

int CPerso::ReturnEtat()
{
	return Etat;
}

bool CPerso::ReturnVersLaDroite()
{
	return VersLaDroite;
}

bool CPerso::ReturnTouche(int touche)
{
	return TouchesAppuyee[touche];
}

void CPerso::DeintDejaPasser()
{
	--DejaPasser;
}



//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;
		LastCalcDepl = SDL_GetTicks();
		Moteur.RajoutFondu(SDL_GetTicks(), SDL_GetTicks() + 1000, 0, 0, 0, 0, 0, 0, 0, 255);
	}
}


