You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

152 lines
4.2 KiB

  1. #include <stdlib.h>
  2. #include "common.h"
  3. void collide_weapons_tunnel( game *g, weapons *wp, tunnel *t, explosions *ex )
  4. {
  5. int i;
  6. for( i = 0; i < WEAPONS; i++ )
  7. {
  8. if( wp->y[i] >= 0 )
  9. {
  10. if( wp->x[i] <= t->left[wp->y[i]+1]
  11. || wp->x[i] >= t->right[wp->y[i]+1] )
  12. {
  13. add_explosion( g, ex, wp->x[i], wp->y[i]+1, 0, 1, 0 );
  14. if( wp->x[i] <= t->left[wp->y[i]+1] )
  15. {
  16. t->left[wp->y[i]]--;
  17. t->left[wp->y[i]+1]-=2;
  18. t->left[wp->y[i]+2]--;
  19. }
  20. else
  21. {
  22. t->right[wp->y[i]]++;
  23. t->right[wp->y[i]+1]+=2;
  24. t->right[wp->y[i]+2]++;
  25. }
  26. wp->y[i] = -1;
  27. }
  28. else if( wp->x[i] <= t->left[wp->y[i]]
  29. || wp->x[i] >= t->right[wp->y[i]] )
  30. {
  31. add_explosion( g, ex, wp->x[i], wp->y[i], 0, 1, 0 );
  32. if( wp->x[i] <= t->left[wp->y[i]] )
  33. {
  34. t->left[wp->y[i]-1]--;
  35. t->left[wp->y[i]]-=2;
  36. t->left[wp->y[i]+1]--;
  37. }
  38. else
  39. {
  40. t->right[wp->y[i]-1]++;
  41. t->right[wp->y[i]]+=2;
  42. t->right[wp->y[i]+1]++;
  43. }
  44. wp->y[i] = -1;
  45. }
  46. }
  47. }
  48. }
  49. void collide_weapons_aliens( game *g, weapons *wp, aliens *al, explosions *ex )
  50. {
  51. int i, j;
  52. for( i = 0; i < WEAPONS; i++ )
  53. {
  54. if( wp->y[i] >= 0 )
  55. {
  56. int ok = 0;
  57. int r;
  58. switch( wp->type[i] )
  59. {
  60. case 2:
  61. /* Big nuke */
  62. r = (34 - wp->n[i]) * (34 - wp->n[i]) / 10;
  63. for( j = 0; j < ALIENS; j++ )
  64. {
  65. if( al->x[j] < 0 )
  66. {
  67. continue;
  68. }
  69. if( (al->x[j] - wp->x[i]) * (al->x[j] - wp->x[i])
  70. + 4 * (al->y[j] - wp->y[i]) * (al->y[j] - wp->y[i])
  71. <= r * r )
  72. {
  73. /* Kill alien, not nuke */
  74. add_explosion( g, ex, al->x[j], al->y[j], 0, 0, 1 );
  75. al->x[j] = -1;
  76. al->y[j] = -1;
  77. }
  78. }
  79. break;
  80. case 1:
  81. default:
  82. for( j = 0; j < ALIENS; j++ )
  83. {
  84. if( wp->x[i] >= al->x[j]
  85. && wp->x[i] <= al->x[j] + 4
  86. && wp->y[i] >= al->y[j]
  87. && wp->y[i] <= al->y[j] + 2 )
  88. {
  89. al->life[j]--;
  90. if( al->life[j] == 0 )
  91. {
  92. al->x[j] = -1;
  93. al->y[j] = -1;
  94. add_explosion( g, ex, wp->x[i], wp->y[i], 0, 0, 1 );
  95. }
  96. ok = 1;
  97. }
  98. else if( wp->x[i] >= al->x[j]
  99. && wp->x[i] <= al->x[j] + 4
  100. && wp->y[i]+1 >= al->y[j]
  101. && wp->y[i]+1 <= al->y[j] + 2 )
  102. {
  103. al->life[j]--;
  104. if( al->life[j] == 0 )
  105. {
  106. al->x[j] = -1;
  107. al->y[j] = -1;
  108. add_explosion( g, ex, wp->x[i], wp->y[i]+1, 0, 0, 1 );
  109. }
  110. ok = 1;
  111. }
  112. }
  113. if( ok )
  114. {
  115. wp->y[i] = -1;
  116. }
  117. break;
  118. }
  119. }
  120. }
  121. }
  122. void collide_player_tunnel( game *g, player *p, tunnel *t, explosions *ex )
  123. {
  124. if( p->x <= t->left[p->y] )
  125. {
  126. p->x += 3;
  127. //add_explosion( g, ex, x+1, y-2, 0, 1, 0 );
  128. }
  129. else if( p->x + 5 >= t->right[p->y] )
  130. {
  131. p->x -= 3;
  132. //add_explosion( g, ex, x+4, y-2, 0, 1, 0 );
  133. }
  134. }