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