|
@@ -0,0 +1,165 @@
|
|
|
|
+#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() )
|
|
|
|
+{
|
|
|
|
+ maxTime = timeLeft;
|
|
|
|
+ state = 0;
|
|
|
|
+ ehpx = zSpieler->getX() + zSpieler->getWidth() / 2;
|
|
|
|
+ ehpy = zSpieler->getY() + zSpieler->getHeight() / 2;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+EnterhakenEffect::~EnterhakenEffect()
|
|
|
|
+{}
|
|
|
|
+
|
|
|
|
+bool EnterhakenEffect::istSpielerBeweglich( Richtung r )
|
|
|
|
+{
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void EnterhakenEffect::move( double time )
|
|
|
|
+{
|
|
|
|
+ if( time < 0 )
|
|
|
|
+ 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->getWidth() > 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->getWidth() > 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->getWidth() > 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->getWidth() <= ehpy + 10 )
|
|
|
|
+ state = 3;
|
|
|
|
+ }
|
|
|
|
+ return state != 5;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+bool EnterhakenEffect::istGegenstandErlaubt( GegenstandTyp typ )
|
|
|
|
+{
|
|
|
|
+ return typ != STURM && typ != ROLLE;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+bool EnterhakenEffect::istSpielerVerwundbar( Richtung r )
|
|
|
|
+{
|
|
|
|
+ return r != MITTE;
|
|
|
|
+}
|