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.
 
 
 
 
 

136 lines
2.9 KiB

  1. #include <stdlib.h>
  2. #include "common.h"
  3. static void draw_nuke( int x, int y, int frame );
  4. static void draw_circle( int x, int y, int r );
  5. void init_weapons( game *g, weapons *wp )
  6. {
  7. int i;
  8. for( i = 0; i < WEAPONS; i++ )
  9. {
  10. wp->x[i] = -1;
  11. wp->y[i] = -1;
  12. wp->v[i] = 0;
  13. wp->n[i] = 0;
  14. wp->type[i] = 0;
  15. }
  16. }
  17. void draw_weapons( game *g, weapons *wp )
  18. {
  19. int i;
  20. for( i = 0; i < WEAPONS; i++ )
  21. {
  22. if( wp->x[i] >= 0 )
  23. {
  24. switch( wp->type[i] )
  25. {
  26. case 2:
  27. draw_nuke( wp->x[i], wp->y[i], wp->n[i] );
  28. break;
  29. case 1:
  30. default:
  31. GFX_COLOR( WHITE );
  32. GFX_GOTO( wp->x[i], wp->y[i] );
  33. GFX_WRITE( '|' );
  34. GFX_COLOR( CYAN );
  35. GFX_GOTO( wp->x[i], wp->y[i] + 1 );
  36. GFX_WRITE( '|' );
  37. break;
  38. }
  39. }
  40. }
  41. }
  42. void update_weapons( game *g, weapons *wp )
  43. {
  44. int i;
  45. for( i = 0; i < WEAPONS; i++ )
  46. {
  47. if( wp->y[i] < 0 )
  48. {
  49. wp->x[i] = -1;
  50. wp->y[i] = -1;
  51. }
  52. else
  53. {
  54. switch( wp->type[i] )
  55. {
  56. case 2:
  57. wp->n[i]--;
  58. if( wp->n[i]-- < 0 )
  59. {
  60. wp->y[i] = -1;
  61. }
  62. break;
  63. case 1:
  64. default:
  65. wp->y[i] += wp->v[i];
  66. break;
  67. }
  68. /* Check collisions */
  69. }
  70. }
  71. }
  72. void add_weapon( game *g, weapons *wp, int x, int y, int type )
  73. {
  74. int i;
  75. for( i = 0; i < WEAPONS; i++ )
  76. {
  77. if( wp->y[i] < 0 )
  78. {
  79. wp->x[i] = x;
  80. wp->y[i] = y;
  81. wp->type[i] = type;
  82. wp->v[i] = -2;
  83. wp->n[i] = 30;
  84. break;
  85. }
  86. }
  87. }
  88. static void draw_nuke( int x, int y, int frame )
  89. {
  90. int r = (34 - frame) * (34 - frame) / 10;
  91. /* Lots of duplicate pixels, but we don't care */
  92. GFX_COLOR( BLUE );
  93. draw_circle( x, y, r++ );
  94. GFX_COLOR( CYAN );
  95. draw_circle( x, y, r++ );
  96. GFX_COLOR( WHITE );
  97. draw_circle( x, y, r++ );
  98. draw_circle( x, y, r++ );
  99. }
  100. static void draw_circle( int x, int y, int r )
  101. {
  102. int test, dx, dy;
  103. /* Optimized Bresenham. Kick ass. */
  104. for( test = 0, dx = 0, dy = r ; dx <= dy ; dx++ )
  105. {
  106. GFX_WRITETO( x + dx, y + dy / 2, '#' );
  107. GFX_WRITETO( x - dx, y + dy / 2, '#' );
  108. GFX_WRITETO( x + dx, y - dy / 2, '#' );
  109. GFX_WRITETO( x - dx, y - dy / 2, '#' );
  110. GFX_WRITETO( x + dy, y + dx / 2, '#' );
  111. GFX_WRITETO( x - dy, y + dx / 2, '#' );
  112. GFX_WRITETO( x + dy, y - dx / 2, '#' );
  113. GFX_WRITETO( x - dy, y - dx / 2, '#' );
  114. test += test > 0 ? dx - dy-- : dx;
  115. }
  116. }