Enterhaken.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. #include "Enterhaken.h"
  2. #include "Spieler.h"
  3. #include "Spiel.h"
  4. EnterhakenEffect::EnterhakenEffect( Spieler *zSpieler, Richtung r )
  5. : Effect( zSpieler, 1.5f + ( 1.5f / 100.f ) * zSpieler->getAbklingZeitVerringerung() )
  6. {
  7. maxTime = timeLeft;
  8. state = 0;
  9. ehpx = zSpieler->getX() + zSpieler->getWidth() / 2;
  10. ehpy = zSpieler->getY() + zSpieler->getHeight() / 2;
  11. }
  12. EnterhakenEffect::~EnterhakenEffect()
  13. {}
  14. bool EnterhakenEffect::istSpielerBeweglich( Richtung r )
  15. {
  16. return 0;
  17. }
  18. void EnterhakenEffect::move( double time )
  19. {
  20. if( time < 0 )
  21. return;
  22. if( state == 3 || state == 4 )
  23. {
  24. switch( r )
  25. {
  26. case OBEN:
  27. zSpieler->setY( zSpieler->getY() - 200 * (float)time );
  28. if( zSpieler->getY() <= ehpy - 10 )
  29. state = 4;
  30. break;
  31. case LINKS:
  32. zSpieler->setX( zSpieler->getX() - 200 * (float)time );
  33. if( zSpieler->getX() <= ehpx - 10 )
  34. state = 4;
  35. break;
  36. case UNTEN:
  37. zSpieler->setY( zSpieler->getY() + 200 * (float)time );
  38. if( zSpieler->getY() >= ehpy - 10 )
  39. state = 4;
  40. break;
  41. case RECHTS:
  42. zSpieler->setX( zSpieler->getX() + 200 * (float)time );
  43. if( zSpieler->getX() >= ehpx - 10 )
  44. state = 4;
  45. break;
  46. default:
  47. break;
  48. }
  49. if( state == 4 )
  50. {
  51. if( !target->hatStyle( Bariere::Style::Aktiv ) || !target->intersectsWith( zSpieler ) )
  52. state = 5;
  53. }
  54. }
  55. }
  56. bool EnterhakenEffect::tick( double time, Spiel *zSpiel )
  57. {
  58. switch( state )
  59. {
  60. case 0:
  61. switch( r )
  62. {
  63. case OBEN:
  64. ehpy -= 200 * (float)time;
  65. break;
  66. case LINKS:
  67. ehpx -= 200 * (float)time;
  68. break;
  69. case UNTEN:
  70. ehpy += 200 * (float)time;
  71. break;
  72. case RECHTS:
  73. ehpx += 200 * (float)time;
  74. break;
  75. default:
  76. break;
  77. }
  78. timeLeft -= (float)time;
  79. if( timeLeft <= 0 )
  80. {
  81. state = 1;
  82. timeLeft = maxTime;
  83. }
  84. for( auto s = zSpiel->getSpieler(); s; s++ )
  85. {
  86. 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 )
  87. s->nimmSchaden( 150 * (float)time, zSpieler, r, zSpiel );
  88. }
  89. for( auto b = zSpiel->getBarieren(); b; b++ )
  90. {
  91. if( b->hatStyle( Bariere::Style::Aktiv ) && ( !b->zTeam() || b->zTeam() == zSpieler->zTeam() ) )
  92. {
  93. if( b->getX() <= ehpx - 10 && b->getX() + b->getWidth() > ehpx + 10 && b->getY() <= ehpy - 10 && b->getY() + b->getWidth() > ehpy + 10 )
  94. {
  95. target = b;
  96. state = 2;
  97. }
  98. }
  99. }
  100. break;
  101. case 1:
  102. switch( r )
  103. {
  104. case OBEN:
  105. ehpy += 200 * (float)time;
  106. break;
  107. case LINKS:
  108. ehpx += 200 * (float)time;
  109. break;
  110. case UNTEN:
  111. ehpy -= 200 * (float)time;
  112. break;
  113. case RECHTS:
  114. ehpx -= 200 * (float)time;
  115. break;
  116. default:
  117. break;
  118. }
  119. for( auto s = zSpiel->getSpieler(); s; s++ )
  120. {
  121. 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 )
  122. s->nimmSchaden( 150 * (float)time, zSpieler, invert( r ), zSpiel );
  123. }
  124. timeLeft -= (float)time;
  125. if( timeLeft <= 0 )
  126. return 1;
  127. break;
  128. case 2:
  129. switch( r )
  130. {
  131. case OBEN:
  132. ehpy -= 200 * (float)time;
  133. break;
  134. case LINKS:
  135. ehpx -= 200 * (float)time;
  136. break;
  137. case UNTEN:
  138. ehpy += 200 * (float)time;
  139. break;
  140. case RECHTS:
  141. ehpx += 200 * (float)time;
  142. break;
  143. default:
  144. break;
  145. }
  146. 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 )
  147. state = 3;
  148. }
  149. return state != 5;
  150. }
  151. bool EnterhakenEffect::istGegenstandErlaubt( GegenstandTyp typ )
  152. {
  153. return typ != STURM && typ != ROLLE;
  154. }
  155. bool EnterhakenEffect::istSpielerVerwundbar( Richtung r )
  156. {
  157. return r != MITTE;
  158. }