#include ".\PinkOctopus.h"

PinkOctopus::PinkOctopus( CharacterManager* characterManager, CollisionManager* collisionManager, TextManager* newText, DialogueManager* newDialogue, int tileX, int tileY, int dialogue ) : Character( characterManager, collisionManager, newText, newDialogue, tileX, tileY, dialogue ){
	init(tileX, tileY);
}

PinkOctopus::PinkOctopus( CharacterManager* characterManager, CollisionManager* collisionManager, TextManager* newText, DialogueManager* newDialogue, int tileX, int tileY, int triggerId, int dialogue ) : Character( characterManager, collisionManager, newText, newDialogue, tileX, tileY, triggerId, dialogue ){
	init(tileX, tileY);
}

PinkOctopus::~PinkOctopus(void){
}

void PinkOctopus::init(int tileX, int tileY){
	RECT* boundingBox = new RECT();
	boundingBox->left =	16;
	boundingBox->top = 28;
	boundingBox->right = 40;
	boundingBox->bottom = 46;
    addSpriteState(0, 0, 2, boundingBox, 64, 64, Character::STATE::WALKING);

	setHeadTextureId( 21 );
    pushState(Character::STATE::CREATION);
    setClip( GameCore::DIRECTION::DOWN );
	setTextureId( 90, tileX, tileY, 256, 128, boundingBox );

	HP = 20;
	HP_MAX = HP;
    strength = 3;
    expEarnedForKilling = 6;

	setPosition( tileX, tileY, boundingBox );
	
	characterSprite->setModulationColor( D3DCOLOR_RGBA( 255, 255, 255, 0 ) );
}

void PinkOctopus::collide(Character* moveChar ) {
    if( moveChar->getType() == Character::MAIN && dialogue >= 0 ) {
        dialogueManager->addDialogue(dialogue, characterHeadSprite);
    }
}

Character::TYPE PinkOctopus::getType() {
    return Character::TYPE::ENEMY;
}

void PinkOctopus::setSpriteState( Character::STATE aState ) {
    switch(aState){
        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::WALKING);
            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 PinkOctopus::creation(){
//GameError("PinkOctopus: creation");
	if( alpha < 256 ) {
		alpha += 64;
	    characterSprite->setModulationColor( D3DCOLOR_RGBA( 255, 255, 255, alpha ) );
	} else {
        Character* main = characterManager->getMainCharacter();
        // give initial path to target
	    POINT* p = new POINT();
        TILE*  t = new TILE();
        p->x = main->getX() + (main->getBoundingBox()->right + main->getBoundingBox()->left   )/2;
        p->y = main->getY() + (main->getBoundingBox()->top   + main->getBoundingBox()->bottom )/2;

        t = characterManager->getScreenManager()->getTileFromWorldPoint(p);
    	getPathTo(t);
		characterSprite->setModulationColor( D3DCOLOR_RGBA( 255, 255, 255, 255 ) );
        pushState(Character::STATE::IDLE);

        delete p;
	}
}

void PinkOctopus::idle(){
//GameError("PinkOctopus: idle");
    Character* main = characterManager->getMainCharacter();
    faceMainCharacter();
    int diffX = getX() - main->getX();
    int diffY = getY() - main->getY();

    if(ticksPassed > 120){
        ticksPassed = 0;
        Character* main = characterManager->getMainCharacter();
        // give initial path to target
	    POINT* p = new POINT();
        TILE*  t = new TILE();
        p->x = main->getX() + (main->getBoundingBox()->right + main->getBoundingBox()->left   )/2;
        p->y = main->getY() + (main->getBoundingBox()->top   + main->getBoundingBox()->bottom )/2;

        t = characterManager->getScreenManager()->getTileFromWorldPoint(p);
    	getPathTo(t);
    }
    if ( path->size() > 25){
        pushState(Character::STATE::DEAD);
    } else if( abs(diffX) < 50 && abs(diffY) < 50 ){
        pushState(Character::STATE::ATTACK);
    } else if(path->size() > 0){
        pushState(Character::STATE::WALKING);
    } else {
        animateSprite(Character::SPEED::FIFTH);
    }
}

void PinkOctopus::walking(){
//GameError("PinkOctopus: walking");
    if ( yOffset > currentSpriteState->numFrames ){
        popState();
    } else {
        moveToNextPointInPath();
        animateSprite(Character::SPEED::FOURTH);
    }
}

void PinkOctopus::dying(){
//GameError("PinkOctopus: dying");
	if( alpha > 0 ) {
		alpha -= 32;
	    characterSprite->setModulationColor( D3DCOLOR_RGBA( 255, 255, 255, alpha ) );
        move( GameCore::DIRECTION::UP, GameCore::DIRECTION::DOWN );
        move( GameCore::DIRECTION::UP, GameCore::DIRECTION::DOWN );
	} else {
        pushState(Character::STATE::DEAD);
	}
}

void PinkOctopus::attacked(){
//GameError("PinkOctopus: attacked");
	bool damaged = true;

    if (!attacker ){//|| attacker->getType() == Character::TYPE::PROJECTILE){
		damaged = false;
	}else if(attacker->getType() == Character::TYPE::PROJECTILE){
        if(this == ((Fireball*)attacker)->getCaster()){
            damaged = false;
        } else {
            attacker = ((Fireball*)attacker)->getCaster();
        }
    }
	if(damaged){
		takeDamage();

		GameCore::DIRECTION move;
		if(attackedFrom == GameCore::DIRECTION::DOWN){
			move = GameCore::DIRECTION::UP;
		} else if(attackedFrom == GameCore::DIRECTION::UP){
			move = GameCore::DIRECTION::DOWN;
		} else if(attackedFrom == GameCore::DIRECTION::LEFT){
			move = GameCore::DIRECTION::RIGHT;
		} else if(attackedFrom == GameCore::DIRECTION::RIGHT){
			move = GameCore::DIRECTION::LEFT;
		}
		characterManager->moveCharacter( this, attackedFrom );
		characterManager->moveCharacter( this, attackedFrom );
		if( (attackedFrom == GameCore::DOWN) || (attackedFrom == GameCore::UP)){
			characterManager->moveCharacter( this, attackedFrom );
			characterManager->moveCharacter( this, attackedFrom );
		} 
		setClip( move );
	}
    if( getHP() <= 0 ) {
        if( attacker == characterManager->getMainCharacter() ){
            characterManager->addToMainCharacterExperience(expEarnedForKilling);
        }
	    pushState( Character::DYING );
	} else {
		popState();

	}
    attacker = 0;
}

void PinkOctopus::attack(){
//GameError("PinkOctopus: attack");
    if ( yOffset == 1 ){
    	characterManager->checkAttack(this);
    }
	if ( yOffset > currentSpriteState->numFrames ){
        GameCore::DIRECTION move;
        switch (facing){
            case GameCore::DIRECTION::UP :
                move = GameCore::DIRECTION::DOWN;
            break;
            case GameCore::DIRECTION::DOWN :
                move = GameCore::DIRECTION::UP;
            break;
            case GameCore::DIRECTION::LEFT :
                move = GameCore::DIRECTION::RIGHT;
            break;
            case GameCore::DIRECTION::RIGHT :
                move = GameCore::DIRECTION::LEFT;
            break;
        }
        characterManager->moveCharacter(this, move);
		popState(); // one for attack
    } else {
        animateSprite(Character::SPEED::NORMAL);
    }
}

void PinkOctopus::attackReady(){
//GameError("PinkOctopus: attack ready");
}

void PinkOctopus::dead(){
//GameError("PinkOctopus: me dead");
}

void PinkOctopus::magic() {
}

void PinkOctopus::casting() {
}
