Enterhaken.cpp 4.7 KB

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