home *** CD-ROM | disk | FTP | other *** search
/ Collection of Hack-Phreak Scene Programs / cleanhpvac.zip / cleanhpvac / TANK11.ZIP / SOURCE.ZIP / SHOTS.C < prev    next >
C/C++ Source or Header  |  1993-01-16  |  3KB  |  135 lines

  1. /* SHOTS contains routines to create/move tank shots */
  2.  
  3. #include <stdlib.h>
  4. #include "stk.h"
  5. #include "tankdefs.h"
  6. #include "types.h"
  7. #include "extern.h"
  8.  
  9. void ShotHit(int i, int color)
  10. /* requires: i = number of a shot (and tank) that hit something of color
  11.  * ensures:  shot hit handled correctly
  12.  */
  13. {    int treenum, os, sn;
  14.     char temp[30];
  15.  
  16.     switch (color) {
  17.         case TREECOLOR : /* Hit a tree */
  18.               treenum=field[HitX][HitY];
  19.               drawit(tree[treenum].x,tree[treenum].y,
  20.                      TREEXDIM,TREEYDIM,TreeEraseBM);
  21.               tank[i].treeshit++;
  22.               break;
  23.         case T0COLOR : TankHit(0,i); break;
  24.         case T1COLOR : TankHit(1,i); break;
  25.         case T2COLOR : TankHit(2,i); break;
  26.         case T3COLOR : TankHit(3,i); break;
  27.         case SHOTCOLOR : /* hit a shot */
  28.             for (sn=0; sn<NumTanks; sn++)
  29.                     if ((sn!=i)&&
  30.                          (abs(shotdata[sn].x-shotdata[i].x)<=SXDIM+1)&&
  31.                          (abs(shotdata[sn].y-shotdata[i].y)<=SYDIM+1)) {
  32.                           os=sn;
  33.                           continue;
  34.                      }
  35.             drawit(shotdata[os].x,shotdata[os].y,SXDIM,SYDIM,ShotEraseBM);
  36.             shotdata[os].range=0;
  37.             break;
  38.         }
  39. }
  40.  
  41.  
  42. void shots()
  43. {
  44.  
  45.   static int dx[]={-1,1,0,0};
  46.   static int dy[]={0,0,-1,1};
  47.   int color,i;
  48.  
  49.   shotrec *s;
  50.   tankRec *t;
  51.  
  52.   for (i=0;i<NumTanks;i++) {
  53.   s=&shotdata[i];
  54.   t=&tank[i];
  55.     /* check range */
  56.     if (s->range) {
  57.         s->speed--;
  58.         if (!s->speed) {
  59.             s->speed=ShotSpeed;
  60.             s->range--;
  61.             if (s->range) {
  62.                 if (GuidedShots) {
  63.                     s->dir = t->dir;
  64.                     s->dx  = dx[s->dir];
  65.                     s->dy  = dy[s->dir];
  66.                 }
  67.                   drawit(s->x,s->y,SXDIM,SYDIM,ShotEraseBM);
  68.                 if (color=hit(s->x+s->dx,s->y+s->dy,SXDIM,SYDIM,s->dir)) {
  69.                     s->range=0;
  70.                     ShotHit(i, color);
  71.                 }
  72.                 else {  /* no hit */
  73.                     s->x+=s->dx;
  74.                     s->y+=s->dy;
  75.                     drawit(s->x,s->y,SXDIM,SYDIM,ShotBM);
  76.                 }
  77.             }
  78.             else {
  79.                 /* it's dead */
  80.                 drawit(s->x,s->y,SXDIM,SYDIM,ShotEraseBM);
  81.             }
  82.         }
  83.     }
  84.     if (gr_keys[t->firek] && !s->range) {
  85.         s=&shotdata[i];
  86.         s->speed=ShotSpeed;
  87.         switch (t->dir) {
  88.                 case UP: s->x = t->x + TXDIM /2;
  89.                             s->y = t->y - SYDIM;
  90.                             s->dx=0;
  91.                             s->dy=-1;
  92.                             s->dir = UP;
  93.                      if ( (color=hit(s->x, s->y, SXDIM, SYDIM, UP))||
  94.                                   (color=hit(s->x, s->y+1, SXDIM, SYDIM, UP))) {
  95.                                 ShotHit(i, color);
  96.                             }
  97.                      else  s->range=ShotRange;
  98.                             break;
  99.                 case DOWN:     s->x = t->x + TXDIM/2;
  100.                                 s->y = t->y + TYDIM;
  101.                          if ((color=hit(s->x, s->y, SXDIM, SYDIM, DOWN)) ||
  102.                                      (color=hit(s->x, s->y-1, SXDIM,SYDIM,DOWN))) {
  103.                                     ShotHit(i, color);
  104.                                 }
  105.                          else  s->range=ShotRange;
  106.                                 s->dx=0;
  107.                                 s->dy=1;
  108.                                 s->dir = DOWN;
  109.                                 break;
  110.                 case LEFT:     s->x = t->x - SYDIM;
  111.                                 s->y = t->y +(TYDIM-1)/2;
  112.                          if (color=hit(s->x, s->y, SXDIM, SYDIM, LEFT)) {
  113.                                     ShotHit(i, color);
  114.                                 }
  115.                          else  s->range=ShotRange;
  116.                                 s->dx=-1;
  117.                                 s->dy=0;
  118.                                 s->dir = LEFT;
  119.                                 break;
  120.                 case RIGHT: s->x = t->x+TXDIM;
  121.                                 s->y = t->y + (TYDIM-1)/2;
  122.                          if (color=hit(s->x, s->y, SXDIM, SYDIM, RIGHT)) {
  123.                                     ShotHit(i, color);
  124.                                 }
  125.                          else  s->range=ShotRange;
  126.                                 s->dx=1;
  127.                                 s->dy=0;
  128.                                 s->dir = RIGHT;
  129.                                 break;
  130.             } /* SWITCH */
  131.           }
  132.  
  133.  
  134.   } /* for */
  135. }