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