#include "Enterhaken.h" #include "Spieler.h" #include "Spiel.h" EnterhakenEffect::EnterhakenEffect( ResourceRegistry *zResources, Spieler *zSpieler, Richtung r ) : Effect( zSpieler, 1.5f + ( 1.5f / 100.f ) * zSpieler->getAbklingZeitVerringerung() ) { this->r = r; maxTime = timeLeft; state = 0; ehpx = zSpieler->getX() + zSpieler->getWidth() / 2; ehpy = zSpieler->getY() + zSpieler->getHeight() / 2; ehSchnur = zResources->zResource( R_ENTERHAKEN_SEIL, 0 )->getImage( 0 ); ehSpitze = zResources->zResource( R_ENTERHAKEN_SPITZE, 0 )->getImage( 0 ); spieler = zResources->getResource( R_SPIELER, zSpieler->getFarbe() ); } EnterhakenEffect::~EnterhakenEffect() { ehSchnur->release(); ehSpitze->release(); spieler->release(); } bool EnterhakenEffect::istSpielerBeweglich( Richtung r ) const { return 0; } void EnterhakenEffect::move( Richtung ri, double time ) { if( time < 0 || ri != r ) return; if( state == 3 || state == 4 ) { switch( r ) { case OBEN: zSpieler->setY( zSpieler->getY() - 200 * (float)time ); if( zSpieler->getY() <= ehpy - 7 ) state = 4; break; case LINKS: zSpieler->setX( zSpieler->getX() - 200 * (float)time ); if( zSpieler->getX() <= ehpx - 7 ) state = 4; break; case UNTEN: zSpieler->setY( zSpieler->getY() + 200 * (float)time ); if( zSpieler->getY() >= ehpy - 7 ) state = 4; break; case RECHTS: zSpieler->setX( zSpieler->getX() + 200 * (float)time ); if( zSpieler->getX() >= ehpx - 7 ) 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 - 7 && s->getX() + s->getWidth() > ehpx + 7 && s->getY() <= ehpy - 7 && s->getY() + s->getHeight() > ehpy + 7 ) 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 - 7 && b->getX() + b->getWidth() > ehpx + 7 && b->getY() <= ehpy - 7 && b->getY() + b->getHeight() > ehpy + 7 ) { 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 - 7 && s->getX() + s->getWidth() > ehpx + 7 && s->getY() <= ehpy - 7 && s->getY() + s->getHeight() > ehpy + 7 ) 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 - 7 || target->getX() + target->getWidth() <= ehpx + 7 || target->getY() > ehpy - 7 || target->getY() + target->getHeight() <= ehpy + 7 ) 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; } void EnterhakenEffect::renderSpieler( Bild &rObj ) { switch( r ) { case RECHTS: for( int x = (int)ehpx - 7 - 4; x > zSpieler->getX() + zSpieler->getWidth() / 2; x -= 4 ) rObj.alphaBild( x, (int)zSpieler->getY() + (int)zSpieler->getHeight() / 2 - 2, 4, 4, *ehSchnur ); rObj.alphaBild( (int)ehpx - 7, (int)ehpy - 7, 14, 14, *ehSpitze ); break; case LINKS: for( int x = (int)ehpx + 7; x < zSpieler->getX() + zSpieler->getWidth() / 2; x += 4 ) rObj.alphaBild180( x, (int)zSpieler->getY() + (int)zSpieler->getHeight() / 2 - 2, 4, 4, *ehSchnur ); rObj.alphaBild180( (int)ehpx - 7, (int)ehpy - 7, 14, 14, *ehSpitze ); break; case OBEN: for( int y = (int)ehpy + 7; y < zSpieler->getY() + zSpieler->getHeight() / 2; y += 4 ) rObj.alphaBild270( (int)zSpieler->getX() + (int)zSpieler->getWidth() / 2 - 2, y, 4, 4, *ehSchnur ); rObj.alphaBild270( (int)ehpx - 7, (int)ehpy - 7, 14, 14, *ehSpitze ); break; case UNTEN: for( int y = (int)ehpy - 7 - 4; y > zSpieler->getY() + zSpieler->getHeight() / 2; y -= 4 ) rObj.alphaBild90( (int)zSpieler->getX() + (int)zSpieler->getWidth() / 2 - 2, y, 4, 4, *ehSchnur ); rObj.alphaBild90( (int)ehpx - 7, (int)ehpy - 7, 14, 14, *ehSpitze ); break; default: break; } } Resource *EnterhakenEffect::getCurrentResource() { return dynamic_cast( spieler->getThis() ); }