123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- #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() )
- {
- 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 )
- {
- 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;
- }
|