#include "const.h"
#include "globals.h"
#include "bullet.h"

//Constructor
Bullet::Bullet()
{
	init(0, 0, NO_KIND);
}

//Iniciador
void Bullet::init(int x, int y, int kind)
{
	//Posición inicial del objeto
	mPosX = x;
	mPosY = y;

	//Alto y ancho del objeto
	mWidth = 8;
	mHeight = mWidth;

	//Velocidad inicial en el eje Y
	mVelY = -3;

	//Tipo de bala
	mKind = kind;

	//Textura con los gráficos del objeto
	mSprite.setTexture(gBulletTexture);

	//Alto y ancho del sprite
	mSprite.setWidth(mWidth);
	mSprite.setHeight(mHeight);

	//Posición inicial del sprite
	mSprite.setPosX(mPosX);
	mSprite.setPosY(mPosY);

	//Valores especificos según el tipo
	switch (kind)
	{
	case BULLET_UP:
		//Establece la velocidad inicial
		mVelX = 0;

		//Rectangulo con los gráficos del objeto
		mSprite.setSpriteClip(0 * mWidth, 0, mSprite.getWidth(), mSprite.getHeight());
		break;

	case BULLET_LEFT:
		//Establece la velocidad inicial
		mVelX = -2;

		//Rectangulo con los gráficos del objeto
		mSprite.setSpriteClip(1 * mWidth, 0, mSprite.getWidth(), mSprite.getHeight());
		break;

	case BULLET_RIGHT:
		//Establece la velocidad inicial
		mVelX = 2;

		//Rectangulo con los gráficos del objeto
		mSprite.setSpriteClip(2 * mWidth, 0, mSprite.getWidth(), mSprite.getHeight());
		break;

	default:
		break;
	}

	//Establece el tamaño del circulo de colisión
	mCollider.r = mWidth / 2;

	//Alinea el circulo de colisión con el objeto
	shiftColliders();
}

//Pinta el objeto en pantalla
void Bullet::render()
{
	mSprite.render();
}

//Actualiza la posición y estado del objeto en horizontal
void Bullet::move()
{
	//Mueve el objeto a su nueva posición
	mPosX += mVelX;

	//Si el objeto se sale del area de juego por los laterales
	if ((mPosX < PLAY_AREA_LEFT) || (mPosX + mWidth > PLAY_AREA_RIGHT))
	{
		//Se deshabilita
		mKind = NO_KIND;
	}

	//Mueve el objeto a su nueva posición en vertical
	mPosY += int(mVelY);

	//Si el objeto se sale del area de juego por la parte superior o inferior
	if ((mPosY < PLAY_AREA_TOP) || (mPosY + mHeight > PLAY_AREA_BOTTOM))
	{
		//Se deshabilita
		mKind = NO_KIND;
	}

	//Actualiza la posición del sprite
	mSprite.setPosX(mPosX);
	mSprite.setPosY(mPosY);

	//Alinea el circulo de colisión con el objeto
	shiftColliders();
}

#ifdef TEST
void Bullet::testMove()
{
	//Update sprite position
	mSprite.setPosX(mPosX);
	mSprite.setPosY(mPosY);

	//Update circle colliders
	shiftColliders();
}
#endif

//Deshabilita el objeto
void Bullet::erase()
{
	mKind = NO_KIND;
}

//Comprueba si el objeto está activo
bool Bullet::isActive()
{
	if (mKind == NO_KIND)
	{
		return false;
	}
	else
	{
		return true;
	}
}

//Obtiene el valor de la variable
int Bullet::getPosX()
{
	return mPosX;
}

//Obtiene el valor de la variable
int Bullet::getPosY()
{
	return mPosY;
}

//Establece el valor de la variable
void Bullet::setPosX(int x)
{
	mPosX = x;
}

//Establece el valor de la variable
void Bullet::setPosY(int y)
{
	mPosY = y;
}

//Obtiene el valor de la variable
float Bullet::getVelY()
{
	return mVelY;
}

//Obtiene el valor de la variable
int Bullet::getKind()
{
	return mKind;
}

//Obtiene el circulo de colisión
Circle &Bullet::getCollider()
{
	return mCollider;
}

//Alinea el circulo de colisión con el objeto
void Bullet::shiftColliders()
{
	mCollider.x = mPosX + mCollider.r;
	mCollider.y = mPosY + mCollider.r;
}
