1 #ifndef lint 2 static char *sccsid = "@(#)misc.c 1.2 83/07/20"; 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 /* XXX */ 9 range(from, to) 10 struct ship *from, *to; 11 { 12 register bow1r, bow1c, bow2r, bow2c; 13 int stern1r, stern1c, stern2c, stern2r; 14 register int bb, bs, sb, ss, result; 15 16 if (!to->file->dir) 17 return 30000; 18 stern1r = bow1r = from->file->row; 19 stern1c = bow1c = from->file->col; 20 stern2r = bow2r = to->file->row; 21 stern2c = bow2c = to->file->col; 22 result = bb = distance(bow2r - bow1r, bow2c - bow1c); 23 if (bb < 5) { 24 stern2r += dr[to->file->dir]; 25 stern2c += dc[to->file->dir]; 26 stern1r += dr[from->file->dir]; 27 stern1c += dc[from->file->dir]; 28 bs = distance((bow2r - stern1r), (bow2c - stern1c)); 29 sb = distance((bow1r - stern2r), (bow1c - stern2c)); 30 ss = distance((stern2r - stern1r) ,(stern2c - stern1c)); 31 result = min(bb, min(bs, min(sb, ss))); 32 } 33 return result; 34 } 35 36 struct ship * 37 closestenemy(from, side, anyship) 38 register struct ship *from; 39 char side, anyship; 40 { 41 register struct ship *sp; 42 register char a; 43 int olddist = 30000, dist; 44 struct ship *closest = 0; 45 46 a = capship(from)->nationality; 47 foreachship(sp) { 48 if (sp == from) 49 continue; 50 if (sp->file->dir == 0) 51 continue; 52 if (a == capship(sp)->nationality && !anyship) 53 continue; 54 if (side && gunsbear(from, sp) != side) 55 continue; 56 dist = range(from, sp); 57 if (dist < olddist) { 58 closest = sp; 59 olddist = dist; 60 } 61 } 62 return closest; 63 } 64