#include "Sturm.h"
#include "Spieler.h"
#include "Spiel.h"

SturmEffect::SturmEffect( ResourceRegistry *zResources, Spieler *zSpieler, Richtung r )
    : Effect( zSpieler, 2.f + ( 2.f / 100.f ) * zSpieler->getAbklingZeitVerringerung() )
{
    this->r = r;
    annimation = 0;
    if( r == LINKS )
        annimation = zResources->getResource( R_STURM_LINKS, zSpieler->getFarbe() );
    if( r == RECHTS )
        annimation = zResources->getResource( R_STURM_RECHTS, zSpieler->getFarbe() );
    if( r == OBEN )
        annimation = zResources->getResource( R_STURM_OBEN, zSpieler->getFarbe() );
    if( r == UNTEN )
        annimation = zResources->getResource( R_STURM_UNTEN, zSpieler->getFarbe() );
}

SturmEffect::~SturmEffect()
{
    if( annimation )
        annimation->release();
}

bool SturmEffect::istSpielerBeweglich( Richtung r )
{
    return false;
}

bool SturmEffect::istSpielerVerwundbar( Richtung r )
{
    return r != this->r;
}

void SturmEffect::move( double time )
{
    switch( r )
    {
    case OBEN:
        zSpieler->setY( zSpieler->getY() - ( 75 + zSpieler->getLaufTempo() ) * (float)time );
        break;
    case RECHTS:
        zSpieler->setX( zSpieler->getX() + ( 75 + zSpieler->getLaufTempo() ) * (float)time );
        break;
    case UNTEN:
        zSpieler->setY( zSpieler->getY() + ( 75 + zSpieler->getLaufTempo() ) * (float)time );
        break;
    case LINKS:
        zSpieler->setX( zSpieler->getX() - ( 75 + zSpieler->getLaufTempo() ) * (float)time );
        break;
    default:
        break;
    }
}

bool SturmEffect::tick( double time, Spiel *zSpiel )
{
    for( auto s = zSpiel->getSpieler(); s; s++ )
    {
        if( s->zTeam() != zSpieler->zTeam() )
        {
            if( s->intersectsWith( zSpieler ) )
                s->nimmSchaden( 100 * (float)time, zSpieler, r, zSpiel );
        }
    }
    return Effect::tick( time, zSpiel );
}

bool SturmEffect::istGegenstandErlaubt( GegenstandTyp typ )
{
    return typ != ROLLE && typ != ENTERHAKEN;
}

Resource *SturmEffect::getCurrentResource()
{
    return annimation ? annimation->getThis() : 0;
}