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

#ifndef _SPRITE_H
#define _SPRITE_H

//Includes
#include "Engine.h"
#include <vector>

struct sSpriteAnim
{
   //L'unité des positon est un multiple de la taille des frames
   u8 posy;           //Ligne de l'animation
	u8 startx;         //Colonne
	u8 lengh;          //Taille de l'animation
	u8 fps;            //Vitesse de l'animation en frames
};

class CRessourceManager;
class CSprite
{
   public:
      CSprite();
      CSprite(UL_IMAGE *img);
      ~CSprite();
      
      void assign(UL_IMAGE *img);             //Joue le même role que le constructeur
      void draw();                            //Affiche le sprite
      void play();                            //Met a jour l'animation
      void clip(u16 x, u16 y, u16 w, u16 h);  //"Clippe" l'image du sprite
		void scale(u16 w, u16 h);               //Redimensionne un sprite
		void rotate(u16 angle);                 //Met en rotation un sprite
		void free();                            //Libère l'image de la mémoire
		void freeRessource(CRessourceManager*); //Idem mais avec une img chargée depuis le resman
		
		void setRotCenter(u16 x, u16 y);        //Choisit le centre de rotation du sprite
		void setXY(u16 x, u16 y);               //Met a jour la position du sprite
		void setColor(UL_COLOR color);          //Met a jour la couleur du sprite
		void setAlpha(bool blend, u8 a, int group = 0);        //Active l'alpha blending sur le sprite
		void setFrameWH(u16 w, u16 h);          //Choisis la taille des frames de l'animation
		void mirror(bool h, bool v);
		
		int addAnim(u8 py, u8 stx, u8 len, u8 fps); //Ajoute une animation au sprite
		bool anim(u8 animation);                //Anime le sprite (une seule fois)
		void animLoop(u8 animation);            //Anime le sprite (en boucle)
		void setAnimSpeed(u8 animation, int speed);        //Set la vitesse d'une animation
		void pause();                           //Met en pause une animation
		void restart();                         //Redemarre l'animation
		void stop();                            //Stoppe l'animation du sprite
		
		void glow(bool enable, int pass);       //Active un effet de glow
		     
   public:
		UL_IMAGE *image;                        //Graphique du sprite
		bool isLoaded;                          //Si le sprite est chargé
		u16 px, py, height, width, alpha;       //Position, taille, alpha
		u16 frameW, frameH;                     //Taille d'une frame de l'animation
		bool alphaBlending;                     //Si l'alphablending est activé
		bool mirrorH, mirrorV;
		int group;                    
		
		std::vector <sSpriteAnim> animations;   //Tableau d'animations du sprite
		u8 animNbr, currentAnim, defaultAnim;   //Nombre d'animations dans le sprite
		u8 frameCounter, currentFrame;          //Compteur de frames et frame courante
		bool isStarted, isPaused, isLoop;       //Booléeins de depart et de pause pour les animations
		
		bool isGlow;
		int glowPasses, scaleFactor;
		
		//Ressource Manager		
};

bool collision(CSprite * spr1, u16 x1, u16 y1, CSprite * spr2, u16 x2, u16 y2);
#endif
