#include "commun.h"

u32 prioDefaut;

void IWRAM_CODE GerePersos(SONIC *sonic, ECRAN *ecr)
{
	u32 i;
	int x, y, j;
	unsigned int msg;
	PERSO *p;

	nSpritesSup = 0;

	//Prend beaucoup de temps car gère des persos inutiles.
	//Optimisable, en ne gérant que le nombre d'objets actifs.
	if (nbrePersos <= 0)
		return;
	for (j = nbrePersos - 1; j >= 0; j--)
	{
		i = id_perso[j];

		//        if (persos[i].noObjet==135)
		//            Debug("%i %i %i",i,j,nbrePersos);
		if (i < 0 || i >= 576)
		{
			ErreurFatale("persos.iwram.c :: GerePersos #01",
				"Objets corrompus! (id_perso invalide)\nno objet: %i, no perso: %i, no table: %i\nobjets: %i",
				persos[i].noObjet,
				i,
				j,
				objetsUtilises);
		}

		p = &persos[i];
		x = p->x - ecr->scrlX;
		y = p->y - ecr->scrlY;
		if (x <= -p->largeur || y <= -p->hauteur || x >= 240 || y >= 160)
		{
			if (x < -1600 || x >= 1600 + 240 || y < -1600 || y >= 1600 + 160)
			{
				if (!(p->instructions & INSTR_PAS_EFFACER))
				{
					EffacePerso(j);
					continue;
				}
			}

			if (p->instructions & INSTR_SEULEMENT_ECRAN)
				continue;
			msg = 0;
		}
		else
			msg = MSG_AFFICHER;

		/*        if (p->instructions&INSTR_SEULEMENT_ECRAN)          {
		if (x<=-p->largeur || y<=-p->hauteur || x>=240 || y>=160)           {
		continue;
		}
		msg=MSG_AFFICHER;
		}
		else    {
		if (x<-p->largeur || y<-p->hauteur || x>=240 || y>=160)         {
		if (x<-1600 || x>=1600+240 || y<-1600 || y>=1600+160)           {
		if (!(p->instructions&INSTR_PAS_EFFACER))       {
		Exec(EffacePerso,j);
		continue;
		}
		}
		msg=0;
		}
		else
		msg=MSG_AFFICHER;
		}*/

		/*        if (x<-64 || y<-64 || x>=240 || y>=160)         {
		if (x<-1600 || x>=1600+240 || y<-1600 || y>=1600+160)           {
		if (!(persos[i].instructions&INSTR_PAS_EFFACER))
		Exec(EffacePerso,j);
		continue;
		}
		if (persos[i].instructions&INSTR_SEULEMENT_ECRAN)
		continue;
		dehors_ecran=TRUE;
		}
		else
		dehors_ecran=FALSE;*/
		gblJ = j;
		if (p->fHandler == NULL)
		{
			ErreurFatale("persos.iwram.c :: GerePersos #02",
				"Objets corrompus! (handler de perso NULL)\nno objet: %i, no perso: %i, no table: %i, objets: %i, coord: %i,%i",
				p->noObjet,
				i,
				j,
				objetsUtilises,
				p->x,
				p->y);

			//            while(1);
		}
		else
			p->fHandler(sonic, p, msg); //Exécute le handler qui retournera le numéro d'un nouveau sprite
		/*        if (perso_ancienX!=-1)      {
		//Peut signaler un problème grave aléatoire, comme un appel de InitCollisions sans le hCollision fait après
		ErreurFatale("persos.iwram.c :: GerePersos #01","InitCollisions appele mais pas hCollision. Signale un probleme de structure de l'objet. (%i)",persos[i].noObjet);
		}*/
	}
}

