Enterhaken.cpp 6.5 KB

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