Enterhaken.cpp 4.7 KB

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