#include "Enterhaken.h" #include "Spieler.h" #include "Spiel.h" EnterhakenEffect::EnterhakenEffect( Spieler *zSpieler, Richtung r ) : Effect( zSpieler, 1.5f + ( 1.5f / 100.f ) * zSpieler->getAbklingZeitVerringerung() ) { this->r = r; timeLeft = 3; maxTime = timeLeft; state = 0; ehpx = zSpieler->getX() + zSpieler->getWidth() / 2; ehpy = zSpieler->getY() + zSpieler->getHeight() / 2; } EnterhakenEffect::~EnterhakenEffect() {} bool EnterhakenEffect::istSpielerBeweglich( Richtung r ) const { return 0; } void EnterhakenEffect::move( Richtung ri, double time ) { if( time < 0 || r != ri ) return; if( state == 3 || state == 4 ) { switch( r ) { case OBEN: zSpieler->setY( zSpieler->getY() - 200 * (float)time ); if( zSpieler->getY() <= ehpy - 10 ) state = 4; break; case LINKS: zSpieler->setX( zSpieler->getX() - 200 * (float)time ); if( zSpieler->getX() <= ehpx - 10 ) state = 4; break; case UNTEN: zSpieler->setY( zSpieler->getY() + 200 * (float)time ); if( zSpieler->getY() >= ehpy - 10 ) state = 4; break; case RECHTS: zSpieler->setX( zSpieler->getX() + 200 * (float)time ); if( zSpieler->getX() >= ehpx - 10 ) state = 4; break; default: break; } if( state == 4 ) { if( !target->hatStyle( Bariere::Style::Aktiv ) || !target->intersectsWith( zSpieler ) ) state = 5; } } } bool EnterhakenEffect::tick( double time, Spiel * zSpiel ) { switch( state ) { case 0: switch( r ) { case OBEN: ehpy -= 200 * (float)time; break; case LINKS: ehpx -= 200 * (float)time; break; case UNTEN: ehpy += 200 * (float)time; break; case RECHTS: ehpx += 200 * (float)time; break; default: break; } timeLeft -= (float)time; if( timeLeft <= 0 ) { state = 1; timeLeft = maxTime; } for( auto s = zSpiel->getSpieler(); s; s++ ) { if( s->zTeam() != zSpieler->zTeam() && s->getX() <= ehpx - 10 && s->getX() + s->getWidth() > ehpx + 10 && s->getY() <= ehpy - 10 && s->getY() + s->getHeight() > ehpy + 10 ) s->nimmSchaden( 150 * (float)time, zSpieler, r, zSpiel ); } for( auto b = zSpiel->getBarieren(); b; b++ ) { if( b->hatStyle( Bariere::Style::Aktiv ) && (!b->zTeam() || b->zTeam() == zSpieler->zTeam()) ) { if( b->getX() <= ehpx - 10 && b->getX() + b->getWidth() > ehpx + 10 && b->getY() <= ehpy - 10 && b->getY() + b->getHeight() > ehpy + 10 ) { target = b; state = 2; } } } break; case 1: switch( r ) { case OBEN: ehpy += 200 * (float)time; break; case LINKS: ehpx += 200 * (float)time; break; case UNTEN: ehpy -= 200 * (float)time; break; case RECHTS: ehpx -= 200 * (float)time; break; default: break; } for( auto s = zSpiel->getSpieler(); s; s++ ) { if( s->zTeam() != zSpieler->zTeam() && s->getX() <= ehpx - 10 && s->getX() + s->getWidth() > ehpx + 10 && s->getY() <= ehpy - 10 && s->getY() + s->getHeight() > ehpy + 10 ) s->nimmSchaden( 150 * (float)time, zSpieler, invert( r ), zSpiel ); } timeLeft -= (float)time; if( timeLeft <= 0 ) return 1; break; case 2: switch( r ) { case OBEN: ehpy -= 200 * (float)time; break; case LINKS: ehpx -= 200 * (float)time; break; case UNTEN: ehpy += 200 * (float)time; break; case RECHTS: ehpx += 200 * (float)time; break; default: break; } if( !target->hatStyle( Bariere::Style::Aktiv ) || target->getX() > ehpx - 10 || target->getX() + target->getWidth() <= ehpx + 10 || target->getY() > ehpy - 10 || target->getY() + target->getHeight() <= ehpy + 10 ) state = 3; } return state == 5; } bool EnterhakenEffect::istGegenstandErlaubt( GegenstandTyp typ ) const { return typ != STURM && typ != ROLLE; } bool EnterhakenEffect::istSpielerVerwundbar( Richtung r ) const { return r != MITTE; }