1 /* 2 * Copyright (c) 1983, 1993 3 * The Regents of the University of California. 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 * @(#)assorted.c 8.1 (Berkeley) 5/31/93 34 * $FreeBSD: src/games/sail/assorted.c,v 1.5 1999/11/30 03:49:31 billf Exp $ 35 * $DragonFly: src/games/sail/assorted.c,v 1.2 2003/06/17 04:25:25 dillon Exp $ 36 */ 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 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 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 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 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 } 275