#include ".\fireball.h"

Fireball::Fireball(Character* caster, CharacterManager* characterManager, CollisionManager* collisionManager, TextManager* textManager, DialogueManager* dialogueManager, int tileX, int tileY, GameCore::DIRECTION direction, int dialogue ) : Character( characterManager, collisionManager, textManager, dialogueManager, tileX, tileY, dialogue){
	init(caster, tileX, tileY, direction);
}
Fireball::Fireball(Character* caster, CharacterManager* characterManager, CollisionManager* collisionManager, TextManager* textManager, DialogueManager* dialogueManager, int tileX, int tileY, GameCore::DIRECTION direction, int trigger, int dialogue ) : Character( characterManager, collisionManager, textManager, dialogueManager, tileX, tileY, trigger, dialogue ){
	init(caster, tileX, tileY, direction);
}

Fireball::~Fireball(void){
}

void Fireball::collide( Character* moveChar ){
    pushState(Character::STATE::DEAD);
}

Character::TYPE Fireball::getType(){
	return Character::TYPE::PROJECTILE;
}

void Fireball::init(Character* _caster, int tileX, int tileY, GameCore::DIRECTION newDirection){
    caster = _caster;
    direction = newDirection;
	// Fill in states
	RECT* boundingBox = new RECT();
	boundingBox->left   = 0;
	boundingBox->top    = 0;
	boundingBox->right  = 27;
	boundingBox->bottom = 27;
    addSpriteState(280, 0, 2, boundingBox, 28, 28, Character::STATE::CREATION);

	boundingBox = new RECT();
	boundingBox->left   = 23;
	boundingBox->top    = 33;
	boundingBox->right  = 46;
	boundingBox->bottom = 56;
    addSpriteState(0, 0, 5, boundingBox, 68, 68, Character::STATE::WALKING);

    pushState(Character::STATE::CREATION);
    setHeadTextureId( 0 );
	setClip( direction );
	setTextureId( 22, tileX, tileY, 512, 512, boundingBox );

	HP = 1;
	HP_MAX = HP;
    strength = 10;

	setPosition( tileX, tileY, boundingBox );
	color = rand()%3;
	switch( color ) {
		case 1:
			characterSprite->setModulationColor( D3DCOLOR_RGBA( 255, 0, 0, alpha ) );
			break;
		case 2:
			characterSprite->setModulationColor( D3DCOLOR_RGBA( 0, 255, 0, alpha ) );
			break;
		case 3:
			characterSprite->setModulationColor( D3DCOLOR_RGBA( 0, 0, 255, alpha ) );
			break;
	}
}

void Fireball::setSpriteState( Character::STATE state ){
    switch(state){
        case Character::STATE::ATTACK:
            currentSpriteState = getSpriteState(Character::STATE::WALKING);
            break;
        case Character::STATE::ATTACK_READY:
            currentSpriteState = getSpriteState(Character::STATE::WALKING);
            break;
        case Character::STATE::ATTACKED:
            currentSpriteState = getSpriteState(Character::STATE::WALKING);
            break;
        case Character::STATE::CREATION:
            currentSpriteState = getSpriteState(Character::STATE::CREATION);
            break;
        case Character::STATE::DEAD:
            currentSpriteState = getSpriteState(Character::STATE::WALKING);
            break;
        case Character::STATE::DYING:
            currentSpriteState = getSpriteState(Character::STATE::WALKING);
            break;
        case Character::STATE::IDLE:
            currentSpriteState = getSpriteState(Character::STATE::WALKING);
            break;
        case Character::STATE::WALKING:
            currentSpriteState = getSpriteState(Character::STATE::WALKING);
            break;
    }
}

void Fireball::creation(){
	if( alpha < 256 ) {
		alpha += 32;
	    switch( color ) {
		    case 1:
			    characterSprite->setModulationColor( D3DCOLOR_RGBA( 255, 0, 0, alpha ) );
			    break;
		    case 2:
			    characterSprite->setModulationColor( D3DCOLOR_RGBA( 0, 255, 0, alpha ) );
			    break;
		    case 3:
			    characterSprite->setModulationColor( D3DCOLOR_RGBA( 0, 0, 255, alpha ) );
			    break;
	    }
        if( alpha < 192 ) {
            animateSprite(Character::SPEED::NORMAL);
        }
	} else {
	    switch( color ) {
		    case 1:
			    characterSprite->setModulationColor( D3DCOLOR_RGBA( 255, 0, 0, 255 ) );
			    break;
		    case 2:
			    characterSprite->setModulationColor( D3DCOLOR_RGBA( 0, 255, 0, 255 ) );
			    break;
		    case 3:
			    characterSprite->setModulationColor( D3DCOLOR_RGBA( 0, 0, 255, 255 ) );
			    break;
	    }
        pushState(Character::STATE::WALKING);
        caster->setDoneCasting(true);
	}
}

void Fireball::idle(){
    pushState(Character::STATE::DEAD);
}

void Fireball::walking(){
	switch( direction ) {
		case GameCore::DIRECTION::RIGHT:
			//setX( getX() + X_INCREMENT*3);
			characterManager->moveCharacter( this, GameCore::DIRECTION::RIGHT );
            characterManager->moveCharacter( this, GameCore::DIRECTION::RIGHT );
            characterManager->moveCharacter( this, GameCore::DIRECTION::RIGHT );
			break;
		case GameCore::DIRECTION::LEFT:
			//setX( getX() - X_INCREMENT*3);
			characterManager->moveCharacter( this, GameCore::DIRECTION::LEFT );
            characterManager->moveCharacter( this, GameCore::DIRECTION::LEFT );
            characterManager->moveCharacter( this, GameCore::DIRECTION::LEFT );
			break;
		case GameCore::DIRECTION::UP:
			//setY( getY() - Y_INCREMENT*3);
			characterManager->moveCharacter( this, GameCore::DIRECTION::UP );
            characterManager->moveCharacter( this, GameCore::DIRECTION::UP );
            characterManager->moveCharacter( this, GameCore::DIRECTION::UP );
			break;
		case GameCore::DIRECTION::DOWN:
			//setY( getY() + Y_INCREMENT*3);
			characterManager->moveCharacter( this, GameCore::DIRECTION::DOWN );
            characterManager->moveCharacter( this, GameCore::DIRECTION::DOWN );
            characterManager->moveCharacter( this, GameCore::DIRECTION::DOWN );
			break;
	}
    if(ticksPassed > 40){
        pushState(Character::STATE::DEAD);
    }
    animateSprite(Character::SPEED::THIRD);
}

void Fireball::dying(){
    pushState(Character::STATE::DEAD);
}

void Fireball::attacked(){
    popState();
}

void Fireball::attack(){
    if(attackee != caster){
        pushState(Character::STATE::DYING);
    }
}

void Fireball::attackReady(){
}

void Fireball::dead(){
}

void Fireball::magic(){
}

void Fireball::casting() {
}

Character* Fireball::getCaster() {
    return caster;
}
