add primes
[unix-history] / usr / src / games / sail / pl_3.c
CommitLineData
b5f0675e 1/*
1e008c14 2 * Copyright (c) 1983 Regents of the University of California.
c0ca48ec
KB
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms are permitted
65c7d3b6
KB
6 * provided that the above copyright notice and this paragraph are
7 * duplicated in all such forms and that any documentation,
8 * advertising materials, and other materials related to such
9 * distribution and use acknowledge that the software was developed
10 * by the University of California, Berkeley. The name of the
11 * University may not be used to endorse or promote products derived
12 * from this software without specific prior written permission.
13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
b5f0675e
EW
16 */
17
b1823ffa 18#ifndef lint
65c7d3b6 19static char sccsid[] = "@(#)pl_3.c 5.3 (Berkeley) %G%";
c0ca48ec 20#endif /* not lint */
b1823ffa
EW
21
22#include "player.h"
23
24acceptcombat()
25{
26 int men = 0;
27 int target, temp;
28 int n, r;
29 int index, rakehim, sternrake;
30 int hhits = 0, ghits = 0, rhits = 0, chits = 0;
31 int crew[3];
32 int load;
33 int guns, car, ready, shootat, hit;
34 int roll;
35 struct ship *closest;
36
37 crew[0] = mc->crew1;
38 crew[1] = mc->crew2;
39 crew[2] = mc->crew3;
40 for (n = 0; n < 3; n++) {
41 if (mf->OBP[n].turnsent)
42 men += mf->OBP[n].mensent;
43 }
44 for (n = 0; n < 3; n++) {
45 if (mf->DBP[n].turnsent)
46 men += mf->DBP[n].mensent;
47 }
48 if (men) {
49 crew[0] = men/100 ? 0 : crew[0] != 0;
50 crew[1] = (men%100)/10 ? 0 : crew[1] != 0;
51 crew[2] = men%10 ? 0 : crew[2] != 0;
52 }
53 for (r = 0; r < 2; r++) {
54 if (r) {
55 ready = mf->readyR;
56 load = mf->loadR;
57 guns = mc->gunR;
58 car = mc->carR;
59 } else {
60 ready = mf->readyL;
61 load = mf->loadL;
62 guns = mc->gunL;
63 car = mc->carL;
64 }
65 if (!guns && !car || load == L_EMPTY || (ready & R_LOADED) == 0)
66 goto cant;
67 if (mf->struck || !crew[2])
68 goto cant;
69 closest = closestenemy(ms, (r ? 'r' : 'l'), 1);
70 if (closest == 0)
71 goto cant;
72 if (closest->file->struck)
73 goto cant;
74 target = range(ms, closest);
75 if (target > rangeofshot[load] || !guns && target >= 3)
76 goto cant;
77 Signal("%s (%c%c) within range of %s broadside.",
78 closest, r ? "right" : "left");
79 if (load > L_CHAIN && target < 6) {
789d5e82
EW
80 switch (sgetch("Aim for hull or rigging? ",
81 (struct ship *)0, 1)) {
b1823ffa
EW
82 case 'r':
83 shootat = RIGGING;
84 break;
85 case 'h':
86 shootat = HULL;
87 break;
88 default:
89 shootat = -1;
90 Signal("'Avast there! Hold your fire.'",
91 (struct ship *)0);
92 }
93 } else {
789d5e82 94 if (sgetch("Fire? ", (struct ship *)0, 1) == 'n') {
b1823ffa
EW
95 shootat = -1;
96 Signal("Belay that! Hold your fire.",
97 (struct ship *)0);
98 } else
99 shootat = RIGGING;
100 }
101 if (shootat == -1)
102 continue;
103 fired = 1;
104 rakehim = gunsbear(ms, closest) && !gunsbear(closest, ms);
105 temp = portside(closest, ms, 1) - closest->file->dir + 1;
106 if (temp < 1)
107 temp += 8;
108 else if (temp > 8)
109 temp -= 8;
110 sternrake = temp > 4 && temp < 6;
111 if (rakehim)
112 if (!sternrake)
113 Signal("Raking the %s!", closest);
114 else
115 Signal("Stern Rake! %s splintering!", closest);
116 index = guns;
117 if (target < 3)
118 index += car;
119 index = (index - 1)/3;
120 index = index > 8 ? 8 : index;
121 if (!rakehim)
122 hit = HDT[index][target-1];
123 else
124 hit = HDTrake[index][target-1];
125 if (rakehim && sternrake)
126 hit++;
127 hit += QUAL[index][mc->qual-1];
128 for (n = 0; n < 3 && mf->captured == 0; n++)
129 if (!crew[n])
130 if (index <= 5)
131 hit--;
132 else
133 hit -= 2;
134 if (ready & R_INITIAL)
135 if (index <= 3)
136 hit++;
137 else
138 hit += 2;
139 if (mf->captured != 0)
140 if (index <= 1)
141 hit--;
142 else
143 hit -= 2;
144 hit += AMMO[index][load - 1];
145 if (((temp = mc->class) >= 5 || temp == 1) && windspeed == 5)
146 hit--;
147 if (windspeed == 6 && temp == 4)
148 hit -= 2;
149 if (windspeed == 6 && temp <= 3)
150 hit--;
151 if (hit >= 0) {
152 roll = die();
153 if (load == L_GRAPE)
154 chits = hit;
155 else {
156 struct Tables *t;
157 if (hit > 10)
158 hit = 10;
159 t = &(shootat == RIGGING ? RigTable : HullTable)
160 [hit][roll-1];
161 chits = t->C;
162 rhits = t->R;
163 hhits = t->H;
164 ghits = t->G;
165 if (closest->file->FS)
166 rhits *= 2;
167 if (load == L_CHAIN) {
168 ghits = 0;
169 hhits = 0;
170 }
171 }
172 table(shootat, load, hit, closest, ms, roll);
173 }
789d5e82
EW
174 Signal("Damage inflicted on the %s:",
175 (struct ship *)0, closest->shipname);
176 Signal("\t%d HULL, %d GUNS, %d CREW, %d RIGGING",
177 (struct ship *)0, hhits, ghits, chits, rhits);
b1823ffa
EW
178 if (!r) {
179 mf->loadL = L_EMPTY;
180 mf->readyL = R_EMPTY;
181 } else {
182 mf->loadR = L_EMPTY;
183 mf->readyR = R_EMPTY;
184 }
185 continue;
186 cant:
187 Signal("Unable to fire %s broadside",
188 (struct ship *)0, r ? "right" : "left");
189 }
490c485f 190 blockalarm();
fcc6b1db 191 draw_stat();
490c485f 192 unblockalarm();
b1823ffa
EW
193}
194
195grapungrap()
196{
197 register struct ship *sp;
6ca45914 198 register int i;
b1823ffa 199
b1823ffa 200 foreachship(sp) {
6ca45914 201 if (sp == ms || sp->file->dir == 0)
b1823ffa 202 continue;
6ca45914 203 if (range(ms, sp) > 1 && !grappled2(ms, sp))
b1823ffa 204 continue;
789d5e82
EW
205 switch (sgetch("Attempt to grapple or ungrapple %s (%c%c): ",
206 sp, 1)) {
b1823ffa
EW
207 case 'g':
208 if (die() < 3
209 || ms->nationality == capship(sp)->nationality) {
6ca45914
EW
210 Write(W_GRAP, ms, 0, sp->file->index, 0, 0, 0);
211 Write(W_GRAP, sp, 0, player, 0, 0, 0);
b1823ffa
EW
212 Signal("Attempt succeeds!", (struct ship *)0);
213 makesignal(ms, "grappled with %s (%c%c)", sp);
214 } else
215 Signal("Attempt fails.", (struct ship *)0);
216 break;
217 case 'u':
6ca45914
EW
218 for (i = grappled2(ms, sp); --i >= 0;) {
219 if (ms->nationality
220 == capship(sp)->nationality
221 || die() < 3) {
222 cleangrapple(ms, sp, 0);
b1823ffa
EW
223 Signal("Attempt succeeds!",
224 (struct ship *)0);
225 makesignal(ms,
226 "ungrappling with %s (%c%c)",
227 sp);
228 } else
229 Signal("Attempt fails.",
230 (struct ship *)0);
231 }
6ca45914 232 break;
b1823ffa
EW
233 }
234 }
235}
236
237unfoulplayer()
238{
b1823ffa 239 register struct ship *to;
6ca45914 240 register i;
b1823ffa 241
6ca45914
EW
242 foreachship(to) {
243 if (fouled2(ms, to) == 0)
244 continue;
245 if (sgetch("Attempt to unfoul with the %s (%c%c)? ", to, 1) != 'y')
b1823ffa 246 continue;
6ca45914
EW
247 for (i = fouled2(ms, to); --i >= 0;) {
248 if (die() <= 2) {
249 cleanfoul(ms, to, 0);
789d5e82 250 Signal("Attempt succeeds!", (struct ship *)0);
b1823ffa
EW
251 makesignal(ms, "Unfouling %s (%c%c)", to);
252 } else
253 Signal("Attempt fails.", (struct ship *)0);
254 }
255 }
256}