111595Sleres #ifndef lint 2*14020Sedward static char *sccsid = "@(#)misc.c 1.2 83/07/20"; 311595Sleres #endif 411595Sleres #include "externs.h" 511595Sleres 611595Sleres #define distance(x,y) (abs(x) >= abs(y) ? abs(x) + abs(y)/2 : abs(y) + abs(x)/2) 711595Sleres 8*14020Sedward /* XXX */ 9*14020Sedward range(from, to) 10*14020Sedward struct ship *from, *to; 1111595Sleres { 12*14020Sedward register bow1r, bow1c, bow2r, bow2c; 13*14020Sedward int stern1r, stern1c, stern2c, stern2r; 14*14020Sedward register int bb, bs, sb, ss, result; 1511595Sleres 16*14020Sedward if (!to->file->dir) 17*14020Sedward return 30000; 18*14020Sedward stern1r = bow1r = from->file->row; 19*14020Sedward stern1c = bow1c = from->file->col; 20*14020Sedward stern2r = bow2r = to->file->row; 21*14020Sedward stern2c = bow2c = to->file->col; 22*14020Sedward result = bb = distance(bow2r - bow1r, bow2c - bow1c); 23*14020Sedward if (bb < 5) { 24*14020Sedward stern2r += dr[to->file->dir]; 25*14020Sedward stern2c += dc[to->file->dir]; 26*14020Sedward stern1r += dr[from->file->dir]; 27*14020Sedward stern1c += dc[from->file->dir]; 28*14020Sedward bs = distance((bow2r - stern1r), (bow2c - stern1c)); 29*14020Sedward sb = distance((bow1r - stern2r), (bow1c - stern2c)); 30*14020Sedward ss = distance((stern2r - stern1r) ,(stern2c - stern1c)); 31*14020Sedward result = min(bb, min(bs, min(sb, ss))); 3211595Sleres } 33*14020Sedward return result; 3411595Sleres } 3511595Sleres 36*14020Sedward struct ship * 37*14020Sedward closestenemy(from, side, anyship) 38*14020Sedward register struct ship *from; 39*14020Sedward char side, anyship; 4011595Sleres { 41*14020Sedward register struct ship *sp; 42*14020Sedward register char a; 43*14020Sedward int olddist = 30000, dist; 44*14020Sedward struct ship *closest = 0; 45*14020Sedward 46*14020Sedward a = capship(from)->nationality; 47*14020Sedward foreachship(sp) { 48*14020Sedward if (sp == from) 49*14020Sedward continue; 50*14020Sedward if (sp->file->dir == 0) 51*14020Sedward continue; 52*14020Sedward if (a == capship(sp)->nationality && !anyship) 53*14020Sedward continue; 54*14020Sedward if (side && gunsbear(from, sp) != side) 55*14020Sedward continue; 56*14020Sedward dist = range(from, sp); 57*14020Sedward if (dist < olddist) { 58*14020Sedward closest = sp; 59*14020Sedward olddist = dist; 60*14020Sedward } 6111595Sleres } 62*14020Sedward return closest; 6311595Sleres } 64