#include "const.h"
#include "animatedsprite.h"

// Constructor
AnimatedSprite::AnimatedSprite(LTexture *texture, SDL_Renderer *renderer)
{
	// Copia los punteros
	setTexture(texture);
	setRenderer(renderer);

	init();
}

// Destructor
AnimatedSprite::~AnimatedSprite()
{
}

// Iniciador
void AnimatedSprite::init()
{
	for (int i = 0; i < 20; i++)
	{
		mAnimation[i].numFrames = 0;
		mAnimation[i].speed = 0;
		mAnimation[i].loop = true;
		mAnimation[i].completed = false;
		for (int j = 0; i < 20; i++)
		{
			mAnimation[i].frames[j].x = 0;
			mAnimation[i].frames[j].y = 0;
			mAnimation[i].frames[j].w = 0;
			mAnimation[i].frames[j].h = 0;
		}
	}
	mCurrentFrame = 0;
	mAnimationCounter = 0;
}

// Calcula el frame correspondiente a la animación
void AnimatedSprite::animate(int index)
{
	if (mEnabled)
	{
		// Calculamos el frame actual a partir del contador
		mCurrentFrame = mAnimationCounter / mAnimation[index].speed;

		// Si alcanzamos el final de la animación, reiniciamos el contador de la animación
		// en función de la variable loop
		if (mCurrentFrame >= mAnimation[index].numFrames)
		{
			if (mAnimation[index].loop)
				mAnimationCounter = 0;
			else
				mCurrentFrame = mAnimation[index].numFrames;
		}
		// En caso contrario
		else
		{
			// Escogemos el frame correspondiente de la animación
			setSpriteClip(mAnimation[index].frames[mCurrentFrame]);

			// Incrementamos el contador de la animacion
			mAnimationCounter++;
		}
	}
}

// Establece el frame actual de la animación
void AnimatedSprite::setCurrentFrame(Uint8 num)
{
	mCurrentFrame = num;
}

// Establece el valor del contador
void AnimatedSprite::setAnimationCounter(Uint16 num)
{
	mAnimationCounter = num;
}

// Establece el rectangulo para un frame de una animación
void AnimatedSprite::setAnimationFrames(Uint8 index_animation, Uint8 index_frame, int x, int y, int w, int h)
{
	mAnimation[index_animation].frames[index_frame].x = x;
	mAnimation[index_animation].frames[index_frame].y = y;
	mAnimation[index_animation].frames[index_frame].w = w;
	mAnimation[index_animation].frames[index_frame].h = h;
}

// Establece la velocidad de una animación
void AnimatedSprite::setAnimationSpeed(Uint8 index, Uint8 speed)
{
	mAnimation[index].speed = speed;
}

// Establece el numero de frames de una animación
void AnimatedSprite::setAnimationNumFrames(Uint8 index, Uint8 num)
{
	mAnimation[index].numFrames = num;
}

// Establece si la animación se reproduce en bucle
void AnimatedSprite::setAnimationLoop(Uint8 index, bool loop)
{
	mAnimation[index].loop = loop;
}

// Establece el valor de la variable
void AnimatedSprite::setCompleted(Uint8 index, bool value)
{
	mAnimation[index].completed = value;
}

// Comprueba si ha terminado la animación
bool AnimatedSprite::isCompleted(Uint8 index)
{
	return mAnimation[index].completed;
}

// Devuelve el rectangulo de una animación y frame concreto
SDL_Rect AnimatedSprite::getAnimationClip(Uint8 index_animation, Uint8 index_frame)
{
	return mAnimation[index_animation].frames[index_frame];
}