/*****************************/
/* Inside The Machine - MKS  */
/*****************************/

#include "eGenerator.h"
#include "../WorldManager.h"
//GFX
//#include "Particle_Ball.h"

eGenerator::eGenerator()
{
	//MAJ de variables
	type = 5;
   genre = 2;
	actif = false;
	real = false;
	stat = true;
	toDelete = false;
	curImpFreq = curBootFreq = 0;
	isNewPartAccepted = true;
}
   	
eGenerator::~eGenerator()
{
   
}

void eGenerator::Load()
{
   //On initialise les particules
	for(int k = 0; k < number; k++)
   	particules[k].actif = false;	
   	
	//On charge la bonne texture en fonction du type
   ulSetTransparentColor(RGB15(31, 0, 31));
   switch(texture)
   {
      case PART_TEX_BALL:
         img.assign(worldMan->resMan->LoadImage("efs:/Particle_Ball.png", UL_IN_VRAM, UL_PF_PAL4));
      break;
      case PART_TEX_SMOKE:
         img.assign(worldMan->resMan->LoadImage("efs:/Particle_Smoke.png", UL_IN_VRAM, UL_PF_PAL4));
      break;
      case PART_TEX_BULLES:
         img.assign(worldMan->resMan->LoadImage("efs:/Particle_Bulles.png", UL_IN_VRAM, UL_PF_PAL4));
      break;
   }
   ulDisableTransparentColor();   
}
   
void eGenerator::Draw(int layer)
{
   //On affiche toute les particules
	if(actif && layer == 0)
   {
      //On parcourt toutes les particules
      for(int k = 0; k < number; k++)
      {
         if(particules[k].actif)
         {
	         //On crée les positions écran
	         int scrx = particules[k].x - FIX(worldMan->curLevel->map->scrollX);
	         int scry = particules[k].y - FIX(worldMan->curLevel->map->scrollY);
	         //ulDebug("scx:%d scy:%d\n", UNFIX(scrx), UNFIX(scry));
	         //Couleur
	         img.setColor(particules[k].color);
	         //On définit les paramètres selon la méthode de fin
	         if(endMethod == END_METHOD_FADE)
	         {
	            //On positionne la particule
	         	img.setXY(UNFIX(scrx), UNFIX(scry));
	         	//On redimensionne
	            img.scale(taille, taille);
	            //On calcule/apllique l'alpha
	            int alpha = particules[k].life>>5;
	            if(alpha < 1)
	            	alpha = 1;
	            if(alpha > 31)
	            	alpha = 31;
	            img.setAlpha(true, alpha, 2);
	            //On affiche
	         	img.draw();
	         }
	         if(endMethod == END_METHOD_SCALE)
	         {
	            //On réduit le sprite
	            taille = particules[k].life>>5;
	            //Taille
	   			img.scale(taille, taille);
	            //On positionne la particule
	         	img.setXY(UNFIX(scrx)-(taille>>1), UNFIX(scry)-(taille>>1));
	   			img.draw();
	         }
	         if(endMethod == END_METHOD_SCALEFADE)
	         {
	            //On réduit le sprite
	            taille = particules[k].life>>5;
	            //Taille
	   			img.scale(taille, taille);
	            //On positionne la particule
	         	img.setXY(UNFIX(scrx)-(taille>>1), UNFIX(scry)-(taille>>1));
	            //On calcule/apllique l'alpha
	            int alpha = particules[k].life>>5;
	            if(alpha < 1)
	            	alpha = 1;
	            if(alpha > 31)
	            	alpha = 31;
	            img.setAlpha(true, alpha);
	            //On affiche
	   			img.draw();
	         }
	   	}   
      }
   }
}
   
void eGenerator::Update()
{
   //Calcul de la position écran de l'entité
   x_screen = x - worldMan->curLevel->map->scrollX;
	y_screen = y - worldMan->curLevel->map->scrollY;
	
   //On vérifie si le générateur est à l'écran
   if(x_screen < (0-taille) || x_screen > (256+taille) || y_screen < 0 || y_screen > 256)
   	actif = false;
   else
   	actif = true;
   
   //On met à jour le générateur
   if(actif)
   {
      isNewPartAccepted = true;
      
	   //On incrémente les frequences de génération d'une particule
	   curImpFreq++;
	   curBootFreq++;
	   
	   //On vérifie leurs limites
	   if(curImpFreq > impFreq)
	   	curImpFreq = 0;
	   if(curBootFreq > bootFreq)
	   	curBootFreq = 0;
   	
      //On parcourt toutes les particules
      for(int k = 0; k < number; k++)
      {
         //On vérifie si la particule concernée est active
         if(particules[k].actif)
         {
            //Si oui, on met a jour la position de la particule
            particules[k].x += particules[k].vx;
            particules[k].y += particules[k].vy;
            //On fait baisser la vie de la particule
            particules[k].life -= particules[k].fade;
            //On ajoute une gravité sommaire
            particules[k].vy += g;
            //On vérifie si il faut désactiver la particule
            if(particules[k].life <= 0)
               particules[k].actif = false; 
         }
         else
         {
            if(curBootFreq == 0 && isNewPartAccepted)
            {
               isNewPartAccepted = false;
	            //Si non, on vérifie si il faut regénérer la particule
	            particules[k].life = 1024;
	            particules[k].actif = true;
	            particules[k].x = FIX(x); //Passage de la variable en fixpt (multiplication)
	            particules[k].y = FIX(y);
	            //On teste si la prochaine particule sera une impureté
	            if(curImpFreq == 0)
	               particules[k].color = color2;
	            else
	               particules[k].color = color;
	            //On calcule le vecteur de direction
	            particules[k].vx = vx + myRand(-rangex, rangex);
	            particules[k].vy = vy + myRand(-rangey, rangey);
	            //On calcule la vitesse de disparition
	            particules[k].fade = fade + myRand(-8, 8);
	      	}
         }   
      }   
   }
}

void eGenerator::CheckInteractions()
{
   
}

void eGenerator::Destroy()
{
   
   
}
