Commit | Line | Data |
---|---|---|
65717166 WJ |
1 | /* |
2 | * Copyright (c) 1983 Regents of the University of California. | |
3 | * All rights reserved. | |
4 | * | |
5 | * Redistribution and use in source and binary forms, with or without | |
6 | * modification, are permitted provided that the following conditions | |
7 | * are met: | |
8 | * 1. Redistributions of source code must retain the above copyright | |
9 | * notice, this list of conditions and the following disclaimer. | |
10 | * 2. Redistributions in binary form must reproduce the above copyright | |
11 | * notice, this list of conditions and the following disclaimer in the | |
12 | * documentation and/or other materials provided with the distribution. | |
13 | * 3. All advertising materials mentioning features or use of this software | |
14 | * must display the following acknowledgement: | |
15 | * This product includes software developed by the University of | |
16 | * California, Berkeley and its contributors. | |
17 | * 4. Neither the name of the University nor the names of its contributors | |
18 | * may be used to endorse or promote products derived from this software | |
19 | * without specific prior written permission. | |
20 | * | |
21 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | |
22 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
23 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
24 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | |
25 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
26 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
27 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
28 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
29 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
30 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
31 | * SUCH DAMAGE. | |
32 | */ | |
33 | ||
34 | #ifndef lint | |
35 | static char sccsid[] = "@(#)assorted.c 5.4 (Berkeley) 6/1/90"; | |
36 | #endif /* not lint */ | |
37 | ||
38 | #include "externs.h" | |
39 | ||
40 | table(rig, shot, hittable, on, from, roll) | |
41 | struct ship *on, *from; | |
42 | int rig, shot, hittable, roll; | |
43 | { | |
44 | register int hhits = 0, chits = 0, ghits = 0, rhits = 0; | |
45 | int Ghit = 0, Hhit = 0, Rhit = 0, Chit = 0; | |
46 | int guns, car, pc, hull; | |
47 | int crew[3]; | |
48 | register int n; | |
49 | int rigg[4]; | |
50 | char *message; | |
51 | struct Tables *tp; | |
52 | ||
53 | pc = on->file->pcrew; | |
54 | hull = on->specs->hull; | |
55 | crew[0] = on->specs->crew1; | |
56 | crew[1] = on->specs->crew2; | |
57 | crew[2] = on->specs->crew3; | |
58 | rigg[0] = on->specs->rig1; | |
59 | rigg[1] = on->specs->rig2; | |
60 | rigg[2] = on->specs->rig3; | |
61 | rigg[3] = on->specs->rig4; | |
62 | if (shot == L_GRAPE) | |
63 | Chit = chits = hittable; | |
64 | else { | |
65 | tp = &(rig ? RigTable : HullTable)[hittable][roll-1]; | |
66 | Chit = chits = tp->C; | |
67 | Rhit = rhits = tp->R; | |
68 | Hhit = hhits = tp->H; | |
69 | Ghit = ghits = tp->G; | |
70 | if (on->file->FS) | |
71 | rhits *= 2; | |
72 | if (shot == L_CHAIN) { | |
73 | Ghit = ghits = 0; | |
74 | Hhit = hhits = 0; | |
75 | } | |
76 | } | |
77 | if (on->file->captured != 0) { | |
78 | pc -= (chits + 1) / 2; | |
79 | chits /= 2; | |
80 | } | |
81 | for (n = 0; n < 3; n++) | |
82 | if (chits > crew[n]) { | |
83 | chits -= crew[n]; | |
84 | crew[n] = 0; | |
85 | } else { | |
86 | crew[n] -= chits; | |
87 | chits = 0; | |
88 | } | |
89 | for (n = 0; n < 3; n++) | |
90 | if (rhits > rigg[n]){ | |
91 | rhits -= rigg[n]; | |
92 | rigg[n] = 0; | |
93 | } else { | |
94 | rigg[n] -= rhits; | |
95 | rhits = 0; | |
96 | } | |
97 | if (rigg[3] != -1 && rhits > rigg[3]) { | |
98 | rhits -= rigg[3]; | |
99 | rigg[3] = 0; | |
100 | } else if (rigg[3] != -1) { | |
101 | rigg[3] -= rhits; | |
102 | } | |
103 | if (rig && !rigg[2] && (!rigg[3] || rigg[3] == -1)) | |
104 | makesignal(on, "dismasted!", (struct ship *)0); | |
105 | if (portside(from, on, 0)) { | |
106 | guns = on->specs->gunR; | |
107 | car = on->specs->carR; | |
108 | } else { | |
109 | guns = on->specs->gunL; | |
110 | car = on->specs->carL; | |
111 | } | |
112 | if (ghits > car) { | |
113 | ghits -= car; | |
114 | car = 0; | |
115 | } else { | |
116 | car -= ghits; | |
117 | ghits = 0; | |
118 | } | |
119 | if (ghits > guns){ | |
120 | ghits -= guns; | |
121 | guns = 0; | |
122 | } else { | |
123 | guns -= ghits; | |
124 | ghits = 0; | |
125 | } | |
126 | hull -= ghits; | |
127 | if (Ghit) | |
128 | Write(portside(from, on, 0) ? W_GUNR : W_GUNL, | |
129 | on, 0, guns, car, 0, 0); | |
130 | hull -= hhits; | |
131 | hull = hull < 0 ? 0 : hull; | |
132 | if (on->file->captured != 0 && Chit) | |
133 | Write(W_PCREW, on, 0, pc, 0, 0, 0); | |
134 | if (Hhit) | |
135 | Write(W_HULL, on, 0, hull, 0, 0, 0); | |
136 | if (Chit) | |
137 | Write(W_CREW, on, 0, crew[0], crew[1], crew[2], 0); | |
138 | if (Rhit) | |
139 | Write(W_RIGG, on, 0, rigg[0], rigg[1], rigg[2], rigg[3]); | |
140 | switch (shot) { | |
141 | case L_ROUND: | |
142 | message = "firing round shot on %s (%c%c)"; | |
143 | break; | |
144 | case L_GRAPE: | |
145 | message = "firing grape shot on %s (%c%c)"; | |
146 | break; | |
147 | case L_CHAIN: | |
148 | message = "firing chain shot on %s (%c%c)"; | |
149 | break; | |
150 | case L_DOUBLE: | |
151 | message = "firing double shot on %s (%c%c)"; | |
152 | break; | |
153 | case L_EXPLODE: | |
154 | message = "exploding shot on %s (%c%c)"; | |
155 | } | |
156 | makesignal(from, message, on); | |
157 | if (roll == 6 && rig) { | |
158 | switch(Rhit) { | |
159 | case 0: | |
160 | message = "fore topsail sheets parted"; | |
161 | break; | |
162 | case 1: | |
163 | message = "mizzen shrouds parted"; | |
164 | break; | |
165 | case 2: | |
166 | message = "main topsail yard shot away"; | |
167 | break; | |
168 | case 4: | |
169 | message = "fore topmast and foremast shrouds shot away"; | |
170 | break; | |
171 | case 5: | |
172 | message = "mizzen mast and yard shot through"; | |
173 | break; | |
174 | case 6: | |
175 | message = "foremast and spritsail yard shattered"; | |
176 | break; | |
177 | case 7: | |
178 | message = "main topmast and mizzen mast shattered"; | |
179 | break; | |
180 | } | |
181 | makesignal(on, message, (struct ship *)0); | |
182 | } else if (roll == 6) { | |
183 | switch (Hhit) { | |
184 | case 0: | |
185 | message = "anchor cables severed"; | |
186 | break; | |
187 | case 1: | |
188 | message = "two anchor stocks shot away"; | |
189 | break; | |
190 | case 2: | |
191 | message = "quarterdeck bulwarks damaged"; | |
192 | break; | |
193 | case 3: | |
194 | message = "three gun ports shot away"; | |
195 | break; | |
196 | case 4: | |
197 | message = "four guns dismounted"; | |
198 | break; | |
199 | case 5: | |
200 | message = "rudder cables shot through"; | |
201 | Write(W_TA, on, 0, 0, 0, 0, 0); | |
202 | break; | |
203 | case 6: | |
204 | message = "shot holes below the water line"; | |
205 | break; | |
206 | } | |
207 | makesignal(on, message, (struct ship *)0); | |
208 | } | |
209 | /* | |
210 | if (Chit > 1 && on->file->readyL&R_INITIAL && on->file->readyR&R_INITIAL) { | |
211 | on->specs->qual--; | |
212 | if (on->specs->qual <= 0) { | |
213 | makesignal(on, "crew mutinying!", (struct ship *)0); | |
214 | on->specs->qual = 5; | |
215 | Write(W_CAPTURED, on, 0, on->file->index, 0, 0, 0); | |
216 | } else | |
217 | makesignal(on, "crew demoralized", (struct ship *)0); | |
218 | Write(W_QUAL, on, 0, on->specs->qual, 0, 0, 0); | |
219 | } | |
220 | */ | |
221 | if (!hull) | |
222 | strike(on, from); | |
223 | } | |
224 | ||
225 | Cleansnag(from, to, all, flag) | |
226 | register struct ship *from, *to; | |
227 | char all, flag; | |
228 | { | |
229 | if (flag & 1) { | |
230 | Write(W_UNGRAP, from, 0, to->file->index, all, 0, 0); | |
231 | Write(W_UNGRAP, to, 0, from->file->index, all, 0, 0); | |
232 | } | |
233 | if (flag & 2) { | |
234 | Write(W_UNFOUL, from, 0, to->file->index, all, 0, 0); | |
235 | Write(W_UNFOUL, to, 0, from->file->index, all, 0, 0); | |
236 | } | |
237 | if (!snagged2(from, to)) { | |
238 | if (!snagged(from)) { | |
239 | unboard(from, from, 1); /* defense */ | |
240 | unboard(from, from, 0); /* defense */ | |
241 | } else | |
242 | unboard(from, to, 0); /* offense */ | |
243 | if (!snagged(to)) { | |
244 | unboard(to, to, 1); /* defense */ | |
245 | unboard(to, to, 0); /* defense */ | |
246 | } else | |
247 | unboard(to, from, 0); /* offense */ | |
248 | } | |
249 | } | |
250 | ||
251 | strike(ship, from) | |
252 | register struct ship *ship, *from; | |
253 | { | |
254 | int points; | |
255 | ||
256 | if (ship->file->struck) | |
257 | return; | |
258 | Write(W_STRUCK, ship, 0, 1, 0, 0, 0); | |
259 | points = ship->specs->pts + from->file->points; | |
260 | Write(W_POINTS, from, 0, points, 0, 0, 0); | |
261 | unboard(ship, ship, 0); /* all offense */ | |
262 | unboard(ship, ship, 1); /* all defense */ | |
263 | switch (die()) { | |
264 | case 3: | |
265 | case 4: /* ship may sink */ | |
266 | Write(W_SINK, ship, 0, 1, 0, 0, 0); | |
267 | break; | |
268 | case 5: | |
269 | case 6: /* ship may explode */ | |
270 | Write(W_EXPLODE, ship, 0, 1, 0, 0, 0); | |
271 | break; | |
272 | } | |
273 | Write(W_SIGNAL, ship, 1, (int) "striking her colours!", 0, 0, 0); | |
274 | } |