Enterhaken.cpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. #include "Enterhaken.h"
  2. #include "Spieler.h"
  3. #include "Spiel.h"
  4. EnterhakenEffect::EnterhakenEffect( ResourceRegistry *zResources, 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. ehSchnur = zResources->zResource( R_ENTERHAKEN_SEIL, 0 )->getImage( 0 );
  14. ehSpitze = zResources->zResource( R_ENTERHAKEN_SPITZE, 0 )->getImage( 0 );
  15. spieler = zResources->getResource( R_SPIELER, zSpieler->getFarbe() );
  16. }
  17. EnterhakenEffect::~EnterhakenEffect()
  18. {
  19. ehSchnur->release();
  20. ehSpitze->release();
  21. spieler->release();
  22. }
  23. bool EnterhakenEffect::istSpielerBeweglich( Richtung r )
  24. {
  25. return 0;
  26. }
  27. void EnterhakenEffect::move( double time )
  28. {
  29. if( time < 0 )
  30. return;
  31. if( state == 3 || state == 4 )
  32. {
  33. switch( r )
  34. {
  35. case OBEN:
  36. zSpieler->setY( zSpieler->getY() - 200 * (float)time );
  37. if( zSpieler->getY() <= ehpy - 7 )
  38. state = 4;
  39. break;
  40. case LINKS:
  41. zSpieler->setX( zSpieler->getX() - 200 * (float)time );
  42. if( zSpieler->getX() <= ehpx - 7 )
  43. state = 4;
  44. break;
  45. case UNTEN:
  46. zSpieler->setY( zSpieler->getY() + 200 * (float)time );
  47. if( zSpieler->getY() >= ehpy - 7 )
  48. state = 4;
  49. break;
  50. case RECHTS:
  51. zSpieler->setX( zSpieler->getX() + 200 * (float)time );
  52. if( zSpieler->getX() >= ehpx - 7 )
  53. state = 4;
  54. break;
  55. default:
  56. break;
  57. }
  58. if( state == 4 )
  59. {
  60. if( !target->hatStyle( Bariere::Style::Aktiv ) || !target->intersectsWith( zSpieler ) )
  61. state = 5;
  62. }
  63. }
  64. }
  65. bool EnterhakenEffect::tick( double time, Spiel *zSpiel )
  66. {
  67. switch( state )
  68. {
  69. case 0:
  70. switch( r )
  71. {
  72. case OBEN:
  73. ehpy -= 200 * (float)time;
  74. break;
  75. case LINKS:
  76. ehpx -= 200 * (float)time;
  77. break;
  78. case UNTEN:
  79. ehpy += 200 * (float)time;
  80. break;
  81. case RECHTS:
  82. ehpx += 200 * (float)time;
  83. break;
  84. default:
  85. break;
  86. }
  87. timeLeft -= (float)time;
  88. if( timeLeft <= 0 )
  89. {
  90. state = 1;
  91. timeLeft = maxTime;
  92. }
  93. for( auto s = zSpiel->getSpieler(); s; s++ )
  94. {
  95. if( s->zTeam() != zSpieler->zTeam() && s->getX() <= ehpx - 7 && s->getX() + s->getWidth() > ehpx + 7 && s->getY() <= ehpy - 7 && s->getY() + s->getWidth() > ehpy + 7 )
  96. s->nimmSchaden( 150 * (float)time, zSpieler, r, zSpiel );
  97. }
  98. for( auto b = zSpiel->getBarieren(); b; b++ )
  99. {
  100. if( b->hatStyle( Bariere::Style::Aktiv ) && ( !b->zTeam() || b->zTeam() == zSpieler->zTeam() ) )
  101. {
  102. if( b->getX() <= ehpx - 7 && b->getX() + b->getWidth() > ehpx + 7 && b->getY() <= ehpy - 7 && b->getY() + b->getWidth() > ehpy + 7 )
  103. {
  104. target = b;
  105. state = 2;
  106. }
  107. }
  108. }
  109. break;
  110. case 1:
  111. switch( r )
  112. {
  113. case OBEN:
  114. ehpy += 200 * (float)time;
  115. break;
  116. case LINKS:
  117. ehpx += 200 * (float)time;
  118. break;
  119. case UNTEN:
  120. ehpy -= 200 * (float)time;
  121. break;
  122. case RECHTS:
  123. ehpx -= 200 * (float)time;
  124. break;
  125. default:
  126. break;
  127. }
  128. for( auto s = zSpiel->getSpieler(); s; s++ )
  129. {
  130. if( s->zTeam() != zSpieler->zTeam() && s->getX() <= ehpx - 7 && s->getX() + s->getWidth() > ehpx + 7 && s->getY() <= ehpy - 7 && s->getY() + s->getWidth() > ehpy + 7 )
  131. s->nimmSchaden( 150 * (float)time, zSpieler, invert( r ), zSpiel );
  132. }
  133. timeLeft -= (float)time;
  134. if( timeLeft <= 0 )
  135. return 1;
  136. break;
  137. case 2:
  138. switch( r )
  139. {
  140. case OBEN:
  141. ehpy -= 200 * (float)time;
  142. break;
  143. case LINKS:
  144. ehpx -= 200 * (float)time;
  145. break;
  146. case UNTEN:
  147. ehpy += 200 * (float)time;
  148. break;
  149. case RECHTS:
  150. ehpx += 200 * (float)time;
  151. break;
  152. default:
  153. break;
  154. }
  155. if( !target->hatStyle( Bariere::Style::Aktiv ) || target->getX() > ehpx - 7 || target->getX() + target->getWidth() <= ehpx + 7 || target->getY() > ehpy - 7 || target->getY() + target->getWidth() <= ehpy + 7 )
  156. state = 3;
  157. }
  158. return state == 5;
  159. }
  160. bool EnterhakenEffect::istGegenstandErlaubt( GegenstandTyp typ )
  161. {
  162. return typ != STURM && typ != ROLLE;
  163. }
  164. bool EnterhakenEffect::istSpielerVerwundbar( Richtung r )
  165. {
  166. return r != MITTE;
  167. }
  168. void EnterhakenEffect::renderSpieler( Bild &rObj )
  169. {
  170. switch( r )
  171. {
  172. case RECHTS:
  173. for( int x = (int)ehpx - 7 - 4; x > zSpieler->getX() + zSpieler->getWidth() / 2; x -= 4 )
  174. rObj.alphaBild( x, (int)zSpieler->getY() + (int)zSpieler->getHeight() / 2 - 2, 4, 4, *ehSchnur );
  175. rObj.alphaBild( (int)ehpx - 7, (int)ehpy - 7, 14, 14, *ehSpitze );
  176. break;
  177. case LINKS:
  178. for( int x = (int)ehpx + 7; x < zSpieler->getX() + zSpieler->getWidth() / 2; x += 4 )
  179. rObj.alphaBild180( x, (int)zSpieler->getY() + (int)zSpieler->getHeight() / 2 - 2, 4, 4, *ehSchnur );
  180. rObj.alphaBild180( (int)ehpx - 7, (int)ehpy - 7, 14, 14, *ehSpitze );
  181. break;
  182. case OBEN:
  183. for( int y = (int)ehpy + 7; y < zSpieler->getY() + zSpieler->getHeight() / 2; y += 4 )
  184. rObj.alphaBild270( (int)zSpieler->getX() + (int)zSpieler->getWidth() / 2 - 2, y, 4, 4, *ehSchnur );
  185. rObj.alphaBild270( (int)ehpx - 7, (int)ehpy - 7, 14, 14, *ehSpitze );
  186. break;
  187. case UNTEN:
  188. for( int y = (int)ehpy - 7 - 4; y > zSpieler->getY() + zSpieler->getHeight() / 2; y -= 4 )
  189. rObj.alphaBild90( (int)zSpieler->getX() + (int)zSpieler->getWidth() / 2 - 2, y, 4, 4, *ehSchnur );
  190. rObj.alphaBild90( (int)ehpx - 7, (int)ehpy - 7, 14, 14, *ehSpitze );
  191. break;
  192. default:
  193. break;
  194. }
  195. }
  196. Resource *EnterhakenEffect::getCurrentResource()
  197. {
  198. return spieler->getThis();
  199. }