xref: /original-bsd/games/sail/misc.c (revision c43e4352)
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