xref: /csrg-svn/games/sail/misc.c (revision 15206)
111595Sleres #ifndef lint
2*15206Sedward static	char *sccsid = "@(#)misc.c	1.3 83/10/10";
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 
814020Sedward /* XXX */
914020Sedward range(from, to)
1014020Sedward struct ship *from, *to;
1111595Sleres {
1214020Sedward 	register bow1r, bow1c, bow2r, bow2c;
1314020Sedward 	int stern1r, stern1c, stern2c, stern2r;
1414020Sedward 	register int bb, bs, sb, ss, result;
1511595Sleres 
1614020Sedward 	if (!to->file->dir)
17*15206Sedward 		return -1;
1814020Sedward 	stern1r = bow1r = from->file->row;
1914020Sedward 	stern1c = bow1c = from->file->col;
2014020Sedward 	stern2r = bow2r = to->file->row;
2114020Sedward 	stern2c = bow2c = to->file->col;
2214020Sedward 	result = bb = distance(bow2r - bow1r, bow2c - bow1c);
2314020Sedward 	if (bb < 5) {
2414020Sedward 		stern2r += dr[to->file->dir];
2514020Sedward 		stern2c += dc[to->file->dir];
2614020Sedward 		stern1r += dr[from->file->dir];
2714020Sedward 		stern1c += dc[from->file->dir];
2814020Sedward 		bs = distance((bow2r - stern1r), (bow2c - stern1c));
2914020Sedward 		sb = distance((bow1r - stern2r), (bow1c - stern2c));
3014020Sedward 		ss = distance((stern2r - stern1r) ,(stern2c - stern1c));
3114020Sedward 		result = min(bb, min(bs, min(sb, ss)));
3211595Sleres 	}
3314020Sedward 	return result;
3411595Sleres }
3511595Sleres 
3614020Sedward struct ship *
3714020Sedward closestenemy(from, side, anyship)
3814020Sedward register struct ship *from;
3914020Sedward char side, anyship;
4011595Sleres {
4114020Sedward 	register struct ship *sp;
4214020Sedward 	register char a;
4314020Sedward 	int olddist = 30000, dist;
4414020Sedward 	struct ship *closest = 0;
4514020Sedward 
4614020Sedward 	a = capship(from)->nationality;
4714020Sedward 	foreachship(sp) {
4814020Sedward 		if (sp == from)
4914020Sedward 			continue;
5014020Sedward 		if (sp->file->dir == 0)
5114020Sedward 			continue;
5214020Sedward 		if (a == capship(sp)->nationality && !anyship)
5314020Sedward 			continue;
5414020Sedward 		if (side && gunsbear(from, sp) != side)
5514020Sedward 			continue;
5614020Sedward 		dist = range(from, sp);
5714020Sedward 		if (dist < olddist) {
5814020Sedward 			closest = sp;
5914020Sedward 			olddist = dist;
6014020Sedward 		}
6111595Sleres 	}
6214020Sedward 	return closest;
6311595Sleres }
64*15206Sedward 
65*15206Sedward angle(dr, dc)
66*15206Sedward register dr, dc;
67*15206Sedward {
68*15206Sedward 	register i;
69*15206Sedward 
70*15206Sedward 	if (dc >= 0 && dr > 0)
71*15206Sedward 		i = 0;
72*15206Sedward 	else if (dr <= 0 && dc > 0)
73*15206Sedward 		i = 2;
74*15206Sedward 	else if (dc <= 0 && dr < 0)
75*15206Sedward 		i = 4;
76*15206Sedward 	else
77*15206Sedward 		i = 6;
78*15206Sedward 	dr = abs(dr);
79*15206Sedward 	dc = abs(dc);
80*15206Sedward 	if ((i == 0 || i == 4) && dc * 2.4 > dr) {
81*15206Sedward 		i++;
82*15206Sedward 		if (dc > dr * 2.4)
83*15206Sedward 			i++;
84*15206Sedward 	} else if ((i == 2 || i == 6) && dr * 2.4 > dc) {
85*15206Sedward 		i++;
86*15206Sedward 		if (dr > dc * 2.4)
87*15206Sedward 			i++;
88*15206Sedward 	}
89*15206Sedward 	return i % 8 + 1;
90*15206Sedward }
91*15206Sedward 
92*15206Sedward gunsbear(from, to)		/* checks for target bow or stern */
93*15206Sedward register struct ship *from, *to;
94*15206Sedward {
95*15206Sedward 	int Dr, Dc, i;
96*15206Sedward 	register ang;
97*15206Sedward 
98*15206Sedward 	Dr = from->file->row - to->file->row;
99*15206Sedward 	Dc = to->file->col - from->file->col;
100*15206Sedward 	for (i = 2; i; i--) {
101*15206Sedward 		if ((ang = angle(Dr, Dc) - from->file->dir + 1) < 1)
102*15206Sedward 			ang += 8;
103*15206Sedward 		if (ang >= 2 && ang <= 4)
104*15206Sedward 			return 'r';
105*15206Sedward 		if (ang >= 6 && ang <= 7)
106*15206Sedward 			return 'l';
107*15206Sedward 		Dr += dr[to->file->dir];
108*15206Sedward 		Dc += dc[to->file->dir];
109*15206Sedward 	}
110*15206Sedward 	return 0;
111*15206Sedward }
112*15206Sedward 
113*15206Sedward portside(from, on, quick)
114*15206Sedward register struct ship *from, *on;
115*15206Sedward int quick;			/* returns true if fromship is */
116*15206Sedward {				/* shooting at onship's starboard side */
117*15206Sedward 	register ang;
118*15206Sedward 	register Dr, Dc;
119*15206Sedward 
120*15206Sedward 	Dr = from->file->row - on->file->row;
121*15206Sedward 	Dc = on->file->col - from->file->col;
122*15206Sedward 	if (quick == -1) {
123*15206Sedward 		Dr += dr[on->file->dir];
124*15206Sedward 		Dc += dc[on->file->dir];
125*15206Sedward 	}
126*15206Sedward 	ang = angle(Dr, Dc);
127*15206Sedward 	if (quick != 0)
128*15206Sedward 		return ang;
129*15206Sedward 	ang = (ang + 4 - on->file->dir - 1) % 8 + 1;
130*15206Sedward 	return ang < 5;
131*15206Sedward }
132*15206Sedward 
133*15206Sedward rmend(str)
134*15206Sedward char *str;
135*15206Sedward {
136*15206Sedward 	register char *p;
137*15206Sedward 
138*15206Sedward 	for (p = str; *p; p++)
139*15206Sedward 		;
140*15206Sedward 	if (p != str)
141*15206Sedward 		*--p = 0;
142*15206Sedward }
143*15206Sedward 
144*15206Sedward colours(sp)
145*15206Sedward register struct ship *sp;
146*15206Sedward {
147*15206Sedward 	register char flag;
148*15206Sedward 
149*15206Sedward 	if (sp->file->struck)
150*15206Sedward 		flag = '!';
151*15206Sedward 	if (sp->file->explode)
152*15206Sedward 		flag = '#';
153*15206Sedward 	if (sp->file->sink)
154*15206Sedward 		flag = '~';
155*15206Sedward 	if (sp->file->struck)
156*15206Sedward 		return flag;
157*15206Sedward 	flag = *countryname[capship(sp)->nationality];
158*15206Sedward 	return sp->file->FS ? flag : tolower(flag);
159*15206Sedward }
160*15206Sedward 
161*15206Sedward #ifdef notdef
162*15206Sedward #define PI 3.1415926535
163*15206Sedward 
164*15206Sedward float contable[8] =
165*15206Sedward 	{ 1.5708, 0.7854, 0.0, -0.7854, -1.5708, -2.3562, -PI, 2.3562 };
166*15206Sedward 
167*15206Sedward int tantable[40] = {
168*15206Sedward 	0,100,197,291,381,
169*15206Sedward 	464,540,610,675,733,
170*15206Sedward 	785,833,876,915,951,
171*15206Sedward 	983,1012,1039,1064,1086,
172*15206Sedward 	1107,1126,1144,1161,1176,
173*15206Sedward 	1190,1204,1216,1227,1239,
174*15206Sedward 	1249,1259,1268,1277,1285,
175*15206Sedward 	1293,1300,1307,1313,1470
176*15206Sedward };
177*15206Sedward 
178*15206Sedward double
179*15206Sedward arctan(y,x)
180*15206Sedward int y,x;
181*15206Sedward {
182*15206Sedward 	int sx, sy;
183*15206Sedward 	register int index;
184*15206Sedward 
185*15206Sedward 	sy = y < 0 ? -1 : 1;
186*15206Sedward 	sx = x < 0 ? -1 : 1;
187*15206Sedward 	y *= sy;
188*15206Sedward 	x *= sx;
189*15206Sedward 	if (!x)
190*15206Sedward 		return (double) PI/2 * sy;
191*15206Sedward 	index = 10 * y / x + 0.5;
192*15206Sedward 	if (index > 39)
193*15206Sedward 		index = 39;
194*15206Sedward 	return (double)
195*15206Sedward 		sy * (sx < 0 ? PI : 0 + sx*((float)tantable[index]/1000));
196*15206Sedward }
197*15206Sedward #endif
198