xref: /csrg-svn/games/sail/misc.c (revision 14020)
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