xref: /openbsd-src/games/sail/dr_1.c (revision 747bd222030b875dd230fbd8422f9826a993d133)
1*747bd222Smestre /*	$OpenBSD: dr_1.c,v 1.9 2016/01/08 20:26:33 mestre Exp $	*/
2df930be7Sderaadt /*	$NetBSD: dr_1.c,v 1.4 1995/04/24 12:25:10 cgd Exp $	*/
3df930be7Sderaadt 
4df930be7Sderaadt /*
5df930be7Sderaadt  * Copyright (c) 1983, 1993
6df930be7Sderaadt  *	The Regents of the University of California.  All rights reserved.
7df930be7Sderaadt  *
8df930be7Sderaadt  * Redistribution and use in source and binary forms, with or without
9df930be7Sderaadt  * modification, are permitted provided that the following conditions
10df930be7Sderaadt  * are met:
11df930be7Sderaadt  * 1. Redistributions of source code must retain the above copyright
12df930be7Sderaadt  *    notice, this list of conditions and the following disclaimer.
13df930be7Sderaadt  * 2. Redistributions in binary form must reproduce the above copyright
14df930be7Sderaadt  *    notice, this list of conditions and the following disclaimer in the
15df930be7Sderaadt  *    documentation and/or other materials provided with the distribution.
167a09557bSmillert  * 3. Neither the name of the University nor the names of its contributors
17df930be7Sderaadt  *    may be used to endorse or promote products derived from this software
18df930be7Sderaadt  *    without specific prior written permission.
19df930be7Sderaadt  *
20df930be7Sderaadt  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21df930be7Sderaadt  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22df930be7Sderaadt  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23df930be7Sderaadt  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24df930be7Sderaadt  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25df930be7Sderaadt  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26df930be7Sderaadt  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27df930be7Sderaadt  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28df930be7Sderaadt  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29df930be7Sderaadt  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30df930be7Sderaadt  * SUCH DAMAGE.
31df930be7Sderaadt  */
32df930be7Sderaadt 
3339ac0be5Smestre #include <ctype.h>
344f095801Spjanzen #include <stdlib.h>
3539ac0be5Smestre #include <string.h>
3639ac0be5Smestre 
3739ac0be5Smestre #include "driver.h"
3839ac0be5Smestre #include "extern.h"
3939ac0be5Smestre #include "player.h"
40df930be7Sderaadt 
414f095801Spjanzen void
unfoul(void)42*747bd222Smestre unfoul(void)
43df930be7Sderaadt {
444f095801Spjanzen 	struct ship *sp;
45df930be7Sderaadt 	struct ship *to;
464f095801Spjanzen 	int nat;
474f095801Spjanzen 	int i;
48df930be7Sderaadt 
49df930be7Sderaadt 	foreachship(sp) {
50df930be7Sderaadt 		if (sp->file->captain[0])
51df930be7Sderaadt 			continue;
52df930be7Sderaadt 		nat = capship(sp)->nationality;
53df930be7Sderaadt 		foreachship(to) {
54df930be7Sderaadt 			if (nat != capship(to)->nationality &&
554f095801Spjanzen 			    !is_toughmelee(sp, to, 0, 0))
56df930be7Sderaadt 				continue;
57df930be7Sderaadt 			for (i = fouled2(sp, to); --i >= 0;)
58df930be7Sderaadt 				if (die() <= 2)
59df930be7Sderaadt 					cleanfoul(sp, to, 0);
60df930be7Sderaadt 		}
61df930be7Sderaadt 	}
62df930be7Sderaadt }
63df930be7Sderaadt 
644f095801Spjanzen void
boardcomp(void)65*747bd222Smestre boardcomp(void)
66df930be7Sderaadt {
67df930be7Sderaadt 	int crew[3];
684f095801Spjanzen 	struct ship *sp, *sq;
69df930be7Sderaadt 
70df930be7Sderaadt 	foreachship(sp) {
71df930be7Sderaadt 		if (*sp->file->captain)
72df930be7Sderaadt 			continue;
73df930be7Sderaadt 		if (sp->file->dir == 0)
74df930be7Sderaadt 			continue;
75df930be7Sderaadt 		if (sp->file->struck || sp->file->captured != 0)
76df930be7Sderaadt 			continue;
77df930be7Sderaadt 		if (!snagged(sp))
78df930be7Sderaadt 			continue;
79df930be7Sderaadt 		crew[0] = sp->specs->crew1 != 0;
80df930be7Sderaadt 		crew[1] = sp->specs->crew2 != 0;
81df930be7Sderaadt 		crew[2] = sp->specs->crew3 != 0;
82df930be7Sderaadt 		foreachship(sq) {
83df930be7Sderaadt 			if (!Xsnagged2(sp, sq))
84df930be7Sderaadt 				continue;
85df930be7Sderaadt 			if (meleeing(sp, sq))
86df930be7Sderaadt 				continue;
87df930be7Sderaadt 			if (!sq->file->dir
88df930be7Sderaadt 				|| sp->nationality == capship(sq)->nationality)
89df930be7Sderaadt 				continue;
90df930be7Sderaadt 			switch (sp->specs->class - sq->specs->class) {
91df930be7Sderaadt 			case -3: case -4: case -5:
92df930be7Sderaadt 				if (crew[0]) {
93df930be7Sderaadt 					/* OBP */
94df930be7Sderaadt 					sendbp(sp, sq, crew[0]*100, 0);
95df930be7Sderaadt 					crew[0] = 0;
96df930be7Sderaadt 				} else if (crew[1]){
97df930be7Sderaadt 					/* OBP */
98df930be7Sderaadt 					sendbp(sp, sq, crew[1]*10, 0);
99df930be7Sderaadt 					crew[1] = 0;
100df930be7Sderaadt 				}
101df930be7Sderaadt 				break;
102df930be7Sderaadt 			case -2:
103df930be7Sderaadt 				if (crew[0] || crew[1]) {
104df930be7Sderaadt 					/* OBP */
105df930be7Sderaadt 					sendbp(sp, sq, crew[0]*100+crew[1]*10,
106df930be7Sderaadt 						0);
107df930be7Sderaadt 					crew[0] = crew[1] = 0;
108df930be7Sderaadt 				}
109df930be7Sderaadt 				break;
110df930be7Sderaadt 			case -1: case 0: case 1:
111df930be7Sderaadt 				if (crew[0]) {
112df930be7Sderaadt 					/* OBP */
113df930be7Sderaadt 					sendbp(sp, sq, crew[0]*100+crew[1]*10,
114df930be7Sderaadt 						0);
115df930be7Sderaadt 					crew[0] = crew[1] = 0;
116df930be7Sderaadt 				}
117df930be7Sderaadt 				break;
118df930be7Sderaadt 			case 2: case 3: case 4: case 5:
119df930be7Sderaadt 				/* OBP */
120df930be7Sderaadt 				sendbp(sp, sq, crew[0]*100+crew[1]*10+crew[2],
121df930be7Sderaadt 					0);
122df930be7Sderaadt 				crew[0] = crew[1] = crew[2] = 0;
123df930be7Sderaadt 				break;
124df930be7Sderaadt 			}
125df930be7Sderaadt 		}
126df930be7Sderaadt 	}
127df930be7Sderaadt }
128df930be7Sderaadt 
1294f095801Spjanzen int
fightitout(struct ship * from,struct ship * to,int key)130*747bd222Smestre fightitout(struct ship *from, struct ship *to, int key)
131df930be7Sderaadt {
132df930be7Sderaadt 	struct ship *fromcap, *tocap;
133df930be7Sderaadt 	int crewfrom[3], crewto[3], menfrom, mento;
134df930be7Sderaadt 	int pcto, pcfrom, fromstrength, strengthto, frominjured, toinjured;
135df930be7Sderaadt 	int topoints;
136df930be7Sderaadt 	int index, totalfrom = 0, totalto = 0;
137df930be7Sderaadt 	int count;
138df930be7Sderaadt 	char message[60];
139df930be7Sderaadt 
140df930be7Sderaadt 	menfrom = mensent(from, to, crewfrom, &fromcap, &pcfrom, key);
141df930be7Sderaadt 	mento = mensent(to, from, crewto, &tocap, &pcto, 0);
142df930be7Sderaadt 	if (fromcap == 0)
143df930be7Sderaadt 		fromcap = from;
144df930be7Sderaadt 	if (tocap == 0)
145df930be7Sderaadt 		tocap = to;
146df930be7Sderaadt 	if (key) {
147df930be7Sderaadt 		if (!menfrom) {		 /* if crew surprised */
148df930be7Sderaadt 			if (fromcap == from)
149df930be7Sderaadt 				menfrom = from->specs->crew1
150df930be7Sderaadt 					+ from->specs->crew2
151df930be7Sderaadt 					+ from->specs->crew3;
152df930be7Sderaadt 			else
153df930be7Sderaadt 				menfrom = from->file->pcrew;
154df930be7Sderaadt 		} else {
155df930be7Sderaadt 			menfrom *= 2;	/* DBP's fight at an advantage */
156df930be7Sderaadt 		}
157df930be7Sderaadt 	}
158df930be7Sderaadt 	fromstrength = menfrom * fromcap->specs->qual;
159df930be7Sderaadt 	strengthto = mento * tocap->specs->qual;
160df930be7Sderaadt 	for (count = 0;
1614f095801Spjanzen 	     ((fromstrength < strengthto * 3 && strengthto < fromstrength * 3)
162df930be7Sderaadt 	      || fromstrength == -1) && count < 4;
163df930be7Sderaadt 	     count++) {
164df930be7Sderaadt 		index = fromstrength/10;
165df930be7Sderaadt 		if (index > 8)
166df930be7Sderaadt 			index = 8;
167df930be7Sderaadt 		toinjured = MT[index][2 - die() / 3];
168df930be7Sderaadt 		totalto += toinjured;
169df930be7Sderaadt 		index = strengthto/10;
170df930be7Sderaadt 		if (index > 8)
171df930be7Sderaadt 			index = 8;
172df930be7Sderaadt 		frominjured = MT[index][2 - die() / 3];
173df930be7Sderaadt 		totalfrom += frominjured;
174df930be7Sderaadt 		menfrom -= frominjured;
175df930be7Sderaadt 		mento -= toinjured;
176df930be7Sderaadt 		fromstrength = menfrom * fromcap->specs->qual;
177df930be7Sderaadt 		strengthto = mento * tocap->specs->qual;
178df930be7Sderaadt 	}
179df930be7Sderaadt 	if (fromstrength >= strengthto * 3 || count == 4) {
180df930be7Sderaadt 		unboard(to, from, 0);
181df930be7Sderaadt 		subtract(from, totalfrom, crewfrom, fromcap, pcfrom);
182df930be7Sderaadt 		subtract(to, totalto, crewto, tocap, pcto);
1834f095801Spjanzen 		makemsg(from, "boarders from %s repelled", to->shipname);
18442ceebb3Sderaadt 		(void) snprintf(message, sizeof message,
18542ceebb3Sderaadt 			"killed in melee: %d.  %s: %d",
186df930be7Sderaadt 			totalto, from->shipname, totalfrom);
1874f095801Spjanzen 		Writestr(W_SIGNAL, to, message);
188df930be7Sderaadt 		if (key)
189df930be7Sderaadt 			return 1;
190df930be7Sderaadt 	} else if (strengthto >= fromstrength * 3) {
191df930be7Sderaadt 		unboard(from, to, 0);
192df930be7Sderaadt 		subtract(from, totalfrom, crewfrom, fromcap, pcfrom);
193df930be7Sderaadt 		subtract(to, totalto, crewto, tocap, pcto);
194df930be7Sderaadt 		if (key) {
195df930be7Sderaadt 			if (fromcap != from)
1964f095801Spjanzen 				Write(W_POINTS, fromcap,
197df930be7Sderaadt 					fromcap->file->points -
198df930be7Sderaadt 						from->file->struck
199df930be7Sderaadt 						? from->specs->pts
200df930be7Sderaadt 						: 2 * from->specs->pts,
201df930be7Sderaadt 					0, 0, 0);
202df930be7Sderaadt 
203df930be7Sderaadt /* ptr1 points to the shipspec for the ship that was just unboarded.
204df930be7Sderaadt    I guess that what is going on here is that the pointer is multiplied
205df930be7Sderaadt    or something. */
206df930be7Sderaadt 
2074f095801Spjanzen 			Write(W_CAPTURED, from, to->file->index, 0, 0, 0);
208df930be7Sderaadt 			topoints = 2 * from->specs->pts + to->file->points;
209df930be7Sderaadt 			if (from->file->struck)
210df930be7Sderaadt 				topoints -= from->specs->pts;
2114f095801Spjanzen 			Write(W_POINTS, to, topoints, 0, 0, 0);
212df930be7Sderaadt 			mento = crewto[0] ? crewto[0] : crewto[1];
213df930be7Sderaadt 			if (mento) {
214df930be7Sderaadt 				subtract(to, mento, crewto, tocap, pcto);
215df930be7Sderaadt 				subtract(from, - mento, crewfrom, to, 0);
216df930be7Sderaadt 			}
21742ceebb3Sderaadt 			(void) snprintf(message, sizeof message,
21842ceebb3Sderaadt 				"captured by the %s!",
219df930be7Sderaadt 				to->shipname);
2204f095801Spjanzen 			Writestr(W_SIGNAL, from, message);
22142ceebb3Sderaadt 			(void) snprintf(message, sizeof message,
22242ceebb3Sderaadt 				"killed in melee: %d.  %s: %d",
223df930be7Sderaadt 				totalto, from->shipname, totalfrom);
2244f095801Spjanzen 			Writestr(W_SIGNAL, to, message);
225df930be7Sderaadt 			mento = 0;
226df930be7Sderaadt 			return 0;
227df930be7Sderaadt 		}
228df930be7Sderaadt 	}
229df930be7Sderaadt 	return 0;
230df930be7Sderaadt }
231df930be7Sderaadt 
2324f095801Spjanzen void
resolve(void)233*747bd222Smestre resolve(void)
234df930be7Sderaadt {
235df930be7Sderaadt 	int thwart;
2364f095801Spjanzen 	struct ship *sp, *sq;
237df930be7Sderaadt 
238df930be7Sderaadt 	foreachship(sp) {
239df930be7Sderaadt 		if (sp->file->dir == 0)
240df930be7Sderaadt 			continue;
241df930be7Sderaadt 		for (sq = sp + 1; sq < ls; sq++)
242df930be7Sderaadt 			if (sq->file->dir && meleeing(sp, sq) && meleeing(sq, sp))
243df930be7Sderaadt 				(void) fightitout(sp, sq, 0);
244df930be7Sderaadt 		thwart = 2;
245df930be7Sderaadt 		foreachship(sq) {
246df930be7Sderaadt 			if (sq->file->dir && meleeing(sq, sp))
247df930be7Sderaadt 				thwart = fightitout(sp, sq, 1);
248df930be7Sderaadt 			if (!thwart)
249df930be7Sderaadt 				break;
250df930be7Sderaadt 		}
251df930be7Sderaadt 		if (!thwart) {
252df930be7Sderaadt 			foreachship(sq) {
253df930be7Sderaadt 				if (sq->file->dir && meleeing(sq, sp))
254df930be7Sderaadt 					unboard(sq, sp, 0);
255df930be7Sderaadt 				unboard(sp, sq, 0);
256df930be7Sderaadt 			}
257df930be7Sderaadt 			unboard(sp, sp, 1);
258df930be7Sderaadt 		} else if (thwart == 2)
259df930be7Sderaadt 			unboard(sp, sp, 1);
260df930be7Sderaadt 	}
261df930be7Sderaadt }
262df930be7Sderaadt 
2634f095801Spjanzen void
compcombat(void)264*747bd222Smestre compcombat(void)
265df930be7Sderaadt {
2664f095801Spjanzen 	int n;
2674f095801Spjanzen 	struct ship *sp;
268df930be7Sderaadt 	struct ship *closest;
269df930be7Sderaadt 	int crew[3], men = 0, target, temp;
270df930be7Sderaadt 	int r, guns, ready, load, car;
271df930be7Sderaadt 	int index, rakehim, sternrake;
272df930be7Sderaadt 	int shootat, hit;
273df930be7Sderaadt 
274df930be7Sderaadt 	foreachship(sp) {
275df930be7Sderaadt 		if (sp->file->captain[0] || sp->file->dir == 0)
276df930be7Sderaadt 			continue;
277df930be7Sderaadt 		crew[0] = sp->specs->crew1;
278df930be7Sderaadt 		crew[1] = sp->specs->crew2;
279df930be7Sderaadt 		crew[2] = sp->specs->crew3;
280df930be7Sderaadt 		for (n = 0; n < 3; n++) {
281df930be7Sderaadt 			if (sp->file->OBP[n].turnsent)
282df930be7Sderaadt 				men += sp->file->OBP[n].mensent;
283df930be7Sderaadt 		}
284df930be7Sderaadt 		for (n = 0; n < 3; n++) {
285df930be7Sderaadt 			if (sp->file->DBP[n].turnsent)
286df930be7Sderaadt 				men += sp->file->DBP[n].mensent;
287df930be7Sderaadt 		}
288df930be7Sderaadt 		if (men){
289df930be7Sderaadt 			crew[0] = men/100 ? 0 : crew[0] != 0;
290df930be7Sderaadt 			crew[1] = (men%100)/10 ? 0 : crew[1] != 0;
291df930be7Sderaadt 			crew[2] = men%10 ? 0 : crew[2] != 0;
292df930be7Sderaadt 		}
293df930be7Sderaadt 		for (r = 0; r < 2; r++) {
294df930be7Sderaadt 			if (!crew[2])
295df930be7Sderaadt 				continue;
296df930be7Sderaadt 			if (sp->file->struck)
297df930be7Sderaadt 				continue;
298df930be7Sderaadt 			if (r) {
299df930be7Sderaadt 				ready = sp->file->readyR;
300df930be7Sderaadt 				guns = sp->specs->gunR;
301df930be7Sderaadt 				car = sp->specs->carR;
302df930be7Sderaadt 			} else {
303df930be7Sderaadt 				ready = sp->file->readyL;
304df930be7Sderaadt 				guns = sp->specs->gunL;
305df930be7Sderaadt 				car = sp->specs->carL;
306df930be7Sderaadt 			}
307df930be7Sderaadt 			if (!guns && !car)
308df930be7Sderaadt 				continue;
309df930be7Sderaadt 			if ((ready & R_LOADED) == 0)
310df930be7Sderaadt 				continue;
311df930be7Sderaadt 			closest = closestenemy(sp, r ? 'r' : 'l', 0);
312df930be7Sderaadt 			if (closest == 0)
313df930be7Sderaadt 				continue;
314df930be7Sderaadt 			if (range(closest, sp) > range(sp, closestenemy(sp, r ? 'r' : 'l', 1)))
315df930be7Sderaadt 				continue;
316df930be7Sderaadt 			if (closest->file->struck)
317df930be7Sderaadt 				continue;
318df930be7Sderaadt 			target = range(sp, closest);
319df930be7Sderaadt 			if (target > 10)
320df930be7Sderaadt 				continue;
321df930be7Sderaadt 			if (!guns && target >= 3)
322df930be7Sderaadt 				continue;
323df930be7Sderaadt 			load = L_ROUND;
324df930be7Sderaadt 			if (target == 1 && sp->file->loadwith == L_GRAPE)
325df930be7Sderaadt 				load = L_GRAPE;
326df930be7Sderaadt 			if (target <= 3 && closest->file->FS)
327df930be7Sderaadt 				load = L_CHAIN;
328df930be7Sderaadt 			if (target == 1 && load != L_GRAPE)
329df930be7Sderaadt 				load = L_DOUBLE;
330df930be7Sderaadt 			if (load > L_CHAIN && target < 6)
331df930be7Sderaadt 				shootat = HULL;
332df930be7Sderaadt 			else
333df930be7Sderaadt 				shootat = RIGGING;
334df930be7Sderaadt 			rakehim = gunsbear(sp, closest)
335df930be7Sderaadt 				&& !gunsbear(closest, sp);
336df930be7Sderaadt 			temp = portside(closest, sp, 1)
337df930be7Sderaadt 				- closest->file->dir + 1;
338df930be7Sderaadt 			if (temp < 1)
339df930be7Sderaadt 				temp += 8;
340df930be7Sderaadt 			if (temp > 8)
341df930be7Sderaadt 				temp -= 8;
342df930be7Sderaadt 			sternrake = temp > 4 && temp < 6;
343df930be7Sderaadt 			index = guns;
344df930be7Sderaadt 			if (target < 3)
345df930be7Sderaadt 				index += car;
346df930be7Sderaadt 			index = (index - 1) / 3;
347df930be7Sderaadt 			index = index > 8 ? 8 : index;
348df930be7Sderaadt 			if (!rakehim)
349df930be7Sderaadt 				hit = HDT[index][target-1];
350df930be7Sderaadt 			else
351df930be7Sderaadt 				hit = HDTrake[index][target-1];
352df930be7Sderaadt 			if (rakehim && sternrake)
353df930be7Sderaadt 				hit++;
354df930be7Sderaadt 			hit += QUAL[index][capship(sp)->specs->qual - 1];
355df930be7Sderaadt 			for (n = 0; n < 3 && sp->file->captured == 0; n++)
3564f095801Spjanzen 				if (!crew[n]) {
357df930be7Sderaadt 					if (index <= 5)
358df930be7Sderaadt 						hit--;
359df930be7Sderaadt 					else
360df930be7Sderaadt 						hit -= 2;
3614f095801Spjanzen 				}
362df930be7Sderaadt 			if (ready & R_INITIAL) {
363df930be7Sderaadt 				if (!r)
364df930be7Sderaadt 					sp->file->readyL &= ~R_INITIAL;
365df930be7Sderaadt 				else
366df930be7Sderaadt 					sp->file->readyR &= ~R_INITIAL;
367df930be7Sderaadt 				if (index <= 3)
368df930be7Sderaadt 					hit++;
369df930be7Sderaadt 				else
370df930be7Sderaadt 					hit += 2;
371df930be7Sderaadt 			}
3724f095801Spjanzen 			if (sp->file->captured != 0) {
373df930be7Sderaadt 				if (index <= 1)
374df930be7Sderaadt 					hit--;
375df930be7Sderaadt 				else
376df930be7Sderaadt 					hit -= 2;
3774f095801Spjanzen 			}
378df930be7Sderaadt 			hit += AMMO[index][load - 1];
379df930be7Sderaadt 			temp = sp->specs->class;
380df930be7Sderaadt 			if ((temp >= 5 || temp == 1) && windspeed == 5)
381df930be7Sderaadt 				hit--;
382df930be7Sderaadt 			if (windspeed == 6 && temp == 4)
383df930be7Sderaadt 				hit -= 2;
384df930be7Sderaadt 			if (windspeed == 6 && temp <= 3)
385df930be7Sderaadt 				hit--;
386df930be7Sderaadt 			if (hit >= 0) {
387df930be7Sderaadt 				if (load != L_GRAPE)
388df930be7Sderaadt 					hit = hit > 10 ? 10 : hit;
389df930be7Sderaadt 				table(shootat, load, hit, closest, sp, die());
390df930be7Sderaadt 			}
391df930be7Sderaadt 		}
392df930be7Sderaadt 	}
393df930be7Sderaadt }
394df930be7Sderaadt 
3954f095801Spjanzen int
next(void)396*747bd222Smestre next(void)
397df930be7Sderaadt {
3984f095801Spjanzen 	if (++turn % 55 == 0) {
399df930be7Sderaadt 		if (alive)
400df930be7Sderaadt 			alive = 0;
401df930be7Sderaadt 		else
402df930be7Sderaadt 			people = 0;
4034f095801Spjanzen 	}
404df930be7Sderaadt 	if (people <= 0 || windspeed == 7) {
4054f095801Spjanzen 		struct ship *s;
4064f095801Spjanzen 		struct ship *bestship = NULL;
407df930be7Sderaadt 		float net, best = 0.0;
408df930be7Sderaadt 		foreachship(s) {
409df930be7Sderaadt 			if (*s->file->captain)
410df930be7Sderaadt 				continue;
411df930be7Sderaadt 			net = (float)s->file->points / s->specs->pts;
412df930be7Sderaadt 			if (net > best) {
413df930be7Sderaadt 				best = net;
414df930be7Sderaadt 				bestship = s;
415df930be7Sderaadt 			}
416df930be7Sderaadt 		}
41734944f90Stedu 		if (bestship) {
4184f095801Spjanzen 			char *tp = getenv("WOTD");
4194f095801Spjanzen 			const char *p;
4204f095801Spjanzen 			if (tp == 0)
421df930be7Sderaadt 				p = "Driver";
4224f095801Spjanzen 			else {
4234f56e6a4Smmcc 				if (islower((unsigned char)*tp))
4244f56e6a4Smmcc 					*tp = toupper((unsigned char)*tp);
4254f095801Spjanzen 				p = tp;
4264f095801Spjanzen 			}
427df930be7Sderaadt 			(void) strncpy(bestship->file->captain, p,
428df930be7Sderaadt 				sizeof bestship->file->captain);
429df930be7Sderaadt 			bestship->file->captain
430df930be7Sderaadt 				[sizeof bestship->file->captain - 1] = 0;
4314f095801Spjanzen 			logger(bestship);
432df930be7Sderaadt 		}
433df930be7Sderaadt 		return -1;
434df930be7Sderaadt 	}
4354f095801Spjanzen 	Write(W_TURN, SHIP(0), turn, 0, 0, 0);
436df930be7Sderaadt 	if (turn % 7 == 0 && (die() >= cc->windchange || !windspeed)) {
437df930be7Sderaadt 		switch (die()) {
438df930be7Sderaadt 		case 1:
439df930be7Sderaadt 			winddir = 1;
440df930be7Sderaadt 			break;
441df930be7Sderaadt 		case 2:
442df930be7Sderaadt 			break;
443df930be7Sderaadt 		case 3:
444df930be7Sderaadt 			winddir++;
445df930be7Sderaadt 			break;
446df930be7Sderaadt 		case 4:
447df930be7Sderaadt 			winddir--;
448df930be7Sderaadt 			break;
449df930be7Sderaadt 		case 5:
450df930be7Sderaadt 			winddir += 2;
451df930be7Sderaadt 			break;
452df930be7Sderaadt 		case 6:
453df930be7Sderaadt 			winddir -= 2;
454df930be7Sderaadt 			break;
455df930be7Sderaadt 		}
456df930be7Sderaadt 		if (winddir > 8)
457df930be7Sderaadt 			winddir -= 8;
458df930be7Sderaadt 		if (winddir < 1)
459df930be7Sderaadt 			winddir += 8;
460df930be7Sderaadt 		if (windspeed)
461df930be7Sderaadt 			switch (die()) {
462df930be7Sderaadt 			case 1:
463df930be7Sderaadt 			case 2:
464df930be7Sderaadt 				windspeed--;
465df930be7Sderaadt 				break;
466df930be7Sderaadt 			case 5:
467df930be7Sderaadt 			case 6:
468df930be7Sderaadt 				windspeed++;
469df930be7Sderaadt 				break;
470df930be7Sderaadt 			}
471df930be7Sderaadt 		else
472df930be7Sderaadt 			windspeed++;
4734f095801Spjanzen 		Write(W_WIND, SHIP(0), winddir, windspeed, 0, 0);
474df930be7Sderaadt 	}
475df930be7Sderaadt 	return 0;
476df930be7Sderaadt }
477