#define MAX_CONSOLE 10
#define MAX_CAR_CONSOLE 1024
#define TEMPS_MESSAGE_CONSOLE 3000
char (*consoleTextes)[MAX_CAR_CONSOLE]=NULL;
char (*consoleTextesBase)[MAX_CAR_CONSOLE]=NULL;
short consoleActifs[MAX_CONSOLE], consoleTailles[MAX_CONSOLE];
int nbConsoleUtil;

int LargeurTexte(char *str)		{
	int i,largeur,tmp;
	largeur=0;
	for (i=0;str[i];i++)		{
		GetCharWidth32(hdcEdit,str[i],str[i],&tmp);
		largeur+=tmp;
	}
	return largeur;
}

void Console_Init()		{
	nbConsoleUtil=0;
	if (!consoleTextes)				//Eviter l'allocation en double ;)
		consoleTextes=(char(*)[MAX_CAR_CONSOLE])malloc(MAX_CAR_CONSOLE*MAX_CONSOLE);
	if (!consoleTextesBase)
		consoleTextesBase=(char(*)[MAX_CAR_CONSOLE])malloc(MAX_CAR_CONSOLE*MAX_CONSOLE);
	memset(consoleActifs,0,sizeof(consoleActifs));
	memset(consoleTailles,0,sizeof(consoleTailles));
	memset(consoleTextes,0,MAX_CAR_CONSOLE*MAX_CONSOLE);
	memset(consoleTextesBase,0,MAX_CAR_CONSOLE*MAX_CONSOLE);
}

//n° d'élément
void Console_Supprime(int no)		{
	memmove(consoleTextes[no],consoleTextes[no+1],(MAX_CONSOLE-no-1)*MAX_CAR_CONSOLE);
	memmove(consoleTextesBase[no],consoleTextesBase[no+1],(MAX_CONSOLE-no-1)*MAX_CAR_CONSOLE);
	memmove(consoleActifs+no,consoleActifs+no+1,sizeof(consoleActifs[0])*(MAX_CONSOLE-no-1));
	memmove(consoleTailles+no,consoleTailles+no+1,sizeof(consoleTailles[0])*(MAX_CONSOLE-no-1));
	nbConsoleUtil--;
}

void Console_Print(const char *format, ...)		{
	char      vbuf[MAX_CAR_CONSOLE];
	int i;
	va_list   arg_ptr;
	va_start(arg_ptr, format);
	_vsnprintf(vbuf, sizeof(vbuf), format, arg_ptr);

	SetBkMode(hdcEdit,TRANSPARENT);
	SelectObject(hdcEdit,hFonte);
	SetTextColor(hdcEdit,RGB(255,255,255));

	for (i=0;i<nbConsoleUtil;i++)		{
		if (!strcmp(consoleTextesBase[i],format))
			Console_Supprime(i);
	}

	//Trop d'éléments? On supprime le premier...
	if (nbConsoleUtil>=MAX_CONSOLE)
		Console_Supprime(0);
	strcpy(consoleTextesBase[nbConsoleUtil],format);
	strcpy(consoleTextes[nbConsoleUtil],vbuf);
	consoleActifs[nbConsoleUtil]=TEMPS_MESSAGE_CONSOLE;
	consoleTailles[nbConsoleUtil]=LargeurTexte(vbuf);
	nbConsoleUtil++;
}


void Console_Print_Simple(const char *format, ...)		{
	char      vbuf[MAX_CAR_CONSOLE];
	va_list   arg_ptr;
	va_start(arg_ptr, format);
	_vsnprintf(vbuf, sizeof(vbuf), format, arg_ptr);

	SetBkMode(hdcEdit,TRANSPARENT);
	SelectObject(hdcEdit,hFonte);
	SetTextColor(hdcEdit,RGB(255,255,255));

	//Trop d'éléments? On supprime le premier...
	if (nbConsoleUtil>=MAX_CONSOLE)
		Console_Supprime(0);
	strcpy(consoleTextesBase[nbConsoleUtil],format);
	strcpy(consoleTextes[nbConsoleUtil],vbuf);
	consoleActifs[nbConsoleUtil]=TEMPS_MESSAGE_CONSOLE;
	consoleTailles[nbConsoleUtil]=LargeurTexte(vbuf);
	nbConsoleUtil++;
}


void Console_Affiche()		{
	int i, largeur;
	const int HAUTEUR_TEXTE=14;
	SetBkMode(hdcEdit,TRANSPARENT);
	SelectObject(hdcEdit,hFonte);
	SetTextColor(hdcEdit,RGB(255,255,255));
	largeur=0;
	for (i=0;i<nbConsoleUtil;i++)			{
		consoleActifs[i]-=diffTickCount;
		if (consoleActifs[i]<=0)		{
			Console_Supprime(i);
			i--;
			continue;
		}
		if (consoleTailles[i]>largeur)
			largeur=consoleTailles[i];
	}
	//Utilise Bits3
	TransCadre(Bits3,1,gdrYz-nbConsoleUtil*HAUTEUR_TEXTE+1,largeur+2,nbConsoleUtil*HAUTEUR_TEXTE-2,RGB(0,48,96),128);
	TransRect(Bits3,0,gdrYz-nbConsoleUtil*HAUTEUR_TEXTE+1,largeur+4,nbConsoleUtil*HAUTEUR_TEXTE,RGB(255,192,0),192);
	for (i=0;i<nbConsoleUtil;i++)			{
		TextOut(hdcEdit,2,gdrYz-(nbConsoleUtil-i)*HAUTEUR_TEXTE,consoleTextes[i],strlen(consoleTextes[i]));
	}
}

