#include "Geschoss.h"
#include "Spiel.h"


Geschoss::Geschoss( ResourceRegistry *zResources, int id, float speed, GeschossTyp typ, Richtung r, int x, int y, Spieler *besitzer )
    : GameObject( GESCHOSS, x, y, 15, 15 )
{
    this->speed = speed;
    this->richtung = richtung;
    this->besitzer = besitzer;
    resources = zResources->getThis();
    tunnelBenutzt = 0;
    umgelenkt = 0;
    geschosseGetroffen = 0;
    schalter = 0;
    texturScale = 1;
    this->id = id;
    setTyp( typ );
}

Geschoss::~Geschoss()
{
    if( besitzer )
        besitzer->release();
    resources->release();
}

void Geschoss::invertDirection()
{
    richtung = invert( richtung );
}

void Geschoss::addUmlenkung( Spiel *zSpiel )
{
    zSpiel->setGeschossZuletztUmgelenkt( (Geschoss *)getThis() );
    umgelenkt++;
}

void Geschoss::addGeschossTreffer( Spiel *zSpiel )
{
    zSpiel->setGeschossZuletztGeschossGetroffen( (Geschoss *)getThis() );
    geschosseGetroffen++;
}

void Geschoss::addTunnel( Spiel *zSpiel )
{
    zSpiel->setGeschossZuletztTunnelBenutzt( (Geschoss *)getThis() );
    schalter++;
}

void Geschoss::addSchalter()
{
    id++;
}

void Geschoss::setSpeed( float speed )
{
    this->speed = speed;
}

void Geschoss::setBesitzer( Spieler *besitzer )
{
    if( this->besitzer )
        this->besitzer->release();
    this->besitzer = besitzer;
}

void Geschoss::setTyp( GeschossTyp typ )
{
    if( textur )
        textur->release();
    this->typ = typ;
    if( typ == GESCHOSS_PFEIL )
    {
        if( richtung == RECHTS )
            textur = resources->zResource( R_PFEIL_GESCHOSS, 0 )->getImages()->getThis();
        else if( richtung == LINKS )
        {
            Bild *r = resources->zResource( R_PFEIL_GESCHOSS, 0 )->getImages();
            this->textur = new Bild();
            this->textur->neuBild( r->getBreite(), r->getHeight(), 0 );
            this->textur->drawBild180( 0, 0, r->getBreite(), r->getHeight(), *r );
        }
        else
        {
            Bild *r = resources->zResource( R_PFEIL_GESCHOSS, 0 )->getImages();
            this->textur = new Bild();
            this->textur->neuBild( r->getHeight(), r->getBreite(), 0 );
            if( richtung == UNTEN )
                this->textur->drawBild90( 0, 0, r->getHeight(), r->getBreite(), *r );
            else
                this->textur->drawBild270( 0, 0, r->getHeight(), r->getBreite(), *r );
        }
        if( richtung == OBEN || richtung == UNTEN )
        {
            setWidth( 7 );
            setHeight( 30 );
        }
        else
        {
            setWidth( 30 );
            setHeight( 7 );
        }
    }
    else if( typ == GESCHOSS_FEUERBALL )
    {
        setWidth( 20 );
        setHeight( 20 );
        currentImage = 0;
        nextImage = 0.075;
        textur = resources->zResource( R_FEUERBALL_GESCHOSS, 0 )->getImages()->getThis();
    }
    else
    {
        setWidth( 15 );
        setHeight( 15 );
        if( typ == GESCHOSS_DRACHENAUGE )
        {
            currentImage = 0;
            nextImage = 0.075;
            textur = resources->zResource( R_DRACHENAUGE_GESCHOSS, 0 )->getImages()->getThis();
        }
        if( typ == GESCHOSS_KUGEL )
            textur = resources->zResource( R_KUGEL_GESCHOSS, 0 )->getImages()->getThis();
        if( typ == GESCHOSS_MINE )
            textur = resources->zResource( R_MINE_GESCHOSS, 0 )->getImages()->getThis();
    }
}

void Geschoss::setRichtung( Richtung r )
{
    richtung = r;
}

void Geschoss::tick( double zeit )
{
    switch( richtung )
    {
    case OBEN:
        y -= (float)zeit * speed;
        break;
    case UNTEN:
        y += (float)zeit * speed;
        break;
    case RECHTS:
        x += (float)zeit * speed;
        break;
    case LINKS:
        x -= (float)zeit * speed;
        break;
    default:
        break;
    }
    if( typ == GESCHOSS_FEUERBALL )
    {
        nextImage -= zeit;
        if( nextImage <= 0 )
        {
            nextImage += 0.075;
            currentImage++;
            if( resources->zResource( R_FEUERBALL_GESCHOSS, 0 )->getImageCount() >= currentImage )
                currentImage = 0;
            textur->release();
            textur = resources->zResource( R_FEUERBALL_GESCHOSS, 0 )->getImage( currentImage );
        }
    }
    if( typ == GESCHOSS_DRACHENAUGE )
    {
        nextImage -= zeit;
        if( nextImage <= 0 )
        {
            nextImage += 0.075;
            currentImage++;
            if( resources->zResource( R_DRACHENAUGE_GESCHOSS, 0 )->getImageCount() >= currentImage )
                currentImage = 0;
            textur->release();
            textur = resources->zResource( R_DRACHENAUGE_GESCHOSS, 0 )->getImage( currentImage );
        }
    }
}

GeschossTyp Geschoss::getTyp() const
{
    return typ;
}

Spieler *Geschoss::zBesitzer() const
{
    return besitzer;
}

Spieler *Geschoss::getBesitzer() const
{
    return besitzer ? (Spieler *)besitzer->getThis() : 0;
}

Richtung Geschoss::getRichtung() const
{
    return richtung;
}


FeuerballTreffer::FeuerballTreffer( ResourceRegistry *zResources, int id, int x, int y, Spieler *besitzer, int maxZeit )
    : GameObject( FEUERBALL_TREFFER, x - 75, y - 75, 150, 150 )
{
    this->id = id;
    this->besitzer = besitzer;
    this->timeLeft = (float)maxZeit;
    count = 0;
    animation = zResources->getResource( R_FEUERBALL_TREFFER, 0 );
    currentImage = 0;
    texturScale = 1;
    nextImage = 0.075;
    textur = animation->getImage( currentImage );
}

FeuerballTreffer::~FeuerballTreffer()
{
    besitzer->release();
    animation->release();
}

void FeuerballTreffer::tick( double zeit )
{
    timeLeft -= (float)zeit;
    count++;
    nextImage -= zeit;
    if( nextImage <= 0 )
    {
        nextImage += 0.075;
        currentImage++;
        if( currentImage >= animation->getImageCount() )
            currentImage = 0;
        textur->release();
        textur = animation->getImage( currentImage );
    }
}

bool FeuerballTreffer::isOver() const
{
    return timeLeft <= 0;
}

bool FeuerballTreffer::makeDamage() const
{
    return count % 2;
}

Spieler *FeuerballTreffer::zVerursacher() const
{
    return besitzer;
}