123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- #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<Resource *>( spieler->getThis() );
- }
|