Enterhaken.cpp 6.4 KB

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