1 #ifndef lint 2 static char *sccsid = "@(#)misc.c 1.1 83/03/17"; 3 #endif 4 #include "externs.h" 5 6 #define distance(x,y) (abs(x) >= abs(y) ? abs(x) + abs(y)/2 : abs(y) + abs(x)/2) 7 8 range(fromship, toship) 9 register int fromship, toship; 10 { 11 int bow1r, bow1c, bow2r, bow2c; 12 int stern1r, stern1c, stern2c, stern2r; 13 register int bb, bs, sb, ss, result; 14 15 if (fromship > scene[game].vessels 16 || toship > scene[game].vessels) /* just in case */ 17 return(30000); 18 if (!pos[toship].dir) 19 return(30000); 20 stern1r = bow1r = pos[fromship].row; 21 stern1c = bow1c = pos[fromship].col; 22 stern2r = bow2r = pos[toship].row; 23 stern2c = bow2c = pos[toship].col; 24 result = bb = distance((bow2r - bow1r), (bow2c - bow1c)); 25 if (bb < 5) 26 { 27 drdc(&stern2r, &stern2c, pos[toship].dir); 28 drdc(&stern1r, &stern1c, pos[fromship].dir); 29 bs = distance((bow2r - stern1r) ,(bow2c - stern1c)); 30 sb = distance((bow1r - stern2r) ,(bow1c - stern2c)); 31 ss = distance((stern2r - stern1r) ,(stern2c - stern1c)); 32 result = min(bb, min(bs, min(sb, ss))); 33 } 34 return(result); 35 } 36 37 drdc(dr, dc, dir) 38 register int *dr, *dc; 39 int dir; 40 { 41 switch (dir) 42 { 43 case 1: 44 (*dr)++; 45 break; 46 case 2: 47 (*dr)++; 48 (*dc)--; 49 break; 50 case 3: 51 (*dc)--; 52 break; 53 case 4: 54 (*dr)--; 55 (*dc)--; 56 break; 57 case 5: 58 (*dr)--; 59 break; 60 case 6: 61 (*dr)--; 62 (*dc)++; 63 break; 64 case 7: 65 (*dc)++; 66 break; 67 case 8: 68 (*dr)++; 69 (*dc)++; 70 break; 71 } 72 } 73