#include "Umlenkung.h"
#include "Spiel.h"


Umlenkung::Umlenkung( ResourceRegistry *zResources, int id, int x, int y, int breite, int height, Richtung richtung, int maxAbklingzeit, bool drehend, bool aktiv )
    : GameObject( UMLENKUNG, x, y, breite, height )
{
    this->id = id;
    this->richtung = richtung;
    this->maxAbklingzeit = maxAbklingzeit;
    this->drehend = drehend;
    this->aktiv = aktiv;
    benutzt = 0;
    abklingzeitVerbleibend = 0;
    this->resources = zResources->getThis();
}

Umlenkung::~Umlenkung()
{
    resources->release();
}

void Umlenkung::setMaxAbklingzeit( int sekunden )
{
    this->maxAbklingzeit = sekunden;
}

void Umlenkung::setAktiv( bool aktiv )
{
    this->aktiv = aktiv;
}

void Umlenkung::setDrehend( bool drehend )
{
    this->drehend = drehend;
}

void Umlenkung::setRichtung( Richtung r )
{
    this->richtung = r;
    if( textur )
        textur->release();
    if( richtung == RECHTS )
        textur = resources->zResource( R_UMLENKUNG, 0 )->getImages()->getThis();
    else if( richtung == LINKS )
    {
        Bild *r = resources->zResource( R_UMLENKUNG, 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_UMLENKUNG, 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 );
    }
}

void Umlenkung::addBenutzt( Spiel *zSpiel )
{
    benutzt++;
    if( drehend )
    {
        switch( richtung )
        {
        case OBEN:
            setRichtung( RECHTS );
            break;
        case RECHTS:
            setRichtung( UNTEN );
            break;
        case UNTEN:
            setRichtung( LINKS );
            break;
        case LINKS:
            setRichtung( OBEN );
            break;
        default:
            break;
        }
    }
    abklingzeitVerbleibend = (float)maxAbklingzeit;
    zSpiel->setUmlenkungZuletztBenutzt( (Umlenkung *)getThis() );
}

void Umlenkung::tick( double time )
{
    if( abklingzeitVerbleibend > 0 )
    {
        abklingzeitVerbleibend -= (float)time;
        if( abklingzeitVerbleibend < 0 )
            abklingzeitVerbleibend = 0;
    }
}

void Umlenkung::render( Bild &rObj )
{
    if( !aktiv )
        rObj.setAlpha( 0x77 );
    GameObject::render( rObj );
    if( !aktiv )
        rObj.releaseAlpha();
}

bool Umlenkung::isAktive() const
{
    return aktiv;
}

bool Umlenkung::hatAbklingzeit() const
{
    return abklingzeitVerbleibend > 0;
}

bool Umlenkung::istDrehend() const
{
    return drehend;
}

int Umlenkung::getMaxAbklingzeit() const
{
    return maxAbklingzeit;
}

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

int Umlenkung::getBenutzungen() const
{
    return benutzt;
}

int Umlenkung::getId() const
{
    return id;
}