|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1983 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: */ ! 6: ! 7: #ifndef lint ! 8: static char sccsid[] = "@(#)assorted.c 5.1 (Berkeley) 5/29/85"; ! 9: #endif not lint ! 10: ! 11: #include "externs.h" ! 12: ! 13: table(rig, shot, hittable, on, from, roll) ! 14: struct ship *on, *from; ! 15: int rig, shot, hittable, roll; ! 16: { ! 17: register int hhits = 0, chits = 0, ghits = 0, rhits = 0; ! 18: int Ghit = 0, Hhit = 0, Rhit = 0, Chit = 0; ! 19: int guns, car, pc, hull; ! 20: int crew[3]; ! 21: register int n; ! 22: int rigg[4]; ! 23: char *message; ! 24: struct Tables *tp; ! 25: ! 26: pc = on->file->pcrew; ! 27: hull = on->specs->hull; ! 28: crew[0] = on->specs->crew1; ! 29: crew[1] = on->specs->crew2; ! 30: crew[2] = on->specs->crew3; ! 31: rigg[0] = on->specs->rig1; ! 32: rigg[1] = on->specs->rig2; ! 33: rigg[2] = on->specs->rig3; ! 34: rigg[3] = on->specs->rig4; ! 35: if (shot == L_GRAPE) ! 36: Chit = chits = hittable; ! 37: else { ! 38: tp = &(rig ? RigTable : HullTable)[hittable][roll-1]; ! 39: Chit = chits = tp->C; ! 40: Rhit = rhits = tp->R; ! 41: Hhit = hhits = tp->H; ! 42: Ghit = ghits = tp->G; ! 43: if (on->file->FS) ! 44: rhits *= 2; ! 45: if (shot == L_CHAIN) { ! 46: Ghit = ghits = 0; ! 47: Hhit = hhits = 0; ! 48: } ! 49: } ! 50: if (on->file->captured != 0) { ! 51: pc -= (chits + 1) / 2; ! 52: chits /= 2; ! 53: } ! 54: for (n = 0; n < 3; n++) ! 55: if (chits > crew[n]) { ! 56: chits -= crew[n]; ! 57: crew[n] = 0; ! 58: } else { ! 59: crew[n] -= chits; ! 60: chits = 0; ! 61: } ! 62: for (n = 0; n < 3; n++) ! 63: if (rhits > rigg[n]){ ! 64: rhits -= rigg[n]; ! 65: rigg[n] = 0; ! 66: } else { ! 67: rigg[n] -= rhits; ! 68: rhits = 0; ! 69: } ! 70: if (rigg[3] != -1 && rhits > rigg[3]) { ! 71: rhits -= rigg[3]; ! 72: rigg[3] = 0; ! 73: } else if (rigg[3] != -1) { ! 74: rigg[3] -= rhits; ! 75: } ! 76: if (rig && !rigg[2] && (!rigg[3] || rigg[3] == -1)) ! 77: makesignal(on, "dismasted!", (struct ship *)0); ! 78: if (portside(from, on, 0)) { ! 79: guns = on->specs->gunR; ! 80: car = on->specs->carR; ! 81: } else { ! 82: guns = on->specs->gunL; ! 83: car = on->specs->carL; ! 84: } ! 85: if (ghits > car) { ! 86: ghits -= car; ! 87: car = 0; ! 88: } else { ! 89: car -= ghits; ! 90: ghits = 0; ! 91: } ! 92: if (ghits > guns){ ! 93: ghits -= guns; ! 94: guns = 0; ! 95: } else { ! 96: guns -= ghits; ! 97: ghits = 0; ! 98: } ! 99: hull -= ghits; ! 100: if (Ghit) ! 101: Write(portside(from, on, 0) ? W_GUNR : W_GUNL, ! 102: on, 0, guns, car, 0, 0); ! 103: hull -= hhits; ! 104: hull = hull < 0 ? 0 : hull; ! 105: if (on->file->captured != 0 && Chit) ! 106: Write(W_PCREW, on, 0, pc, 0, 0, 0); ! 107: if (Hhit) ! 108: Write(W_HULL, on, 0, hull, 0, 0, 0); ! 109: if (Chit) ! 110: Write(W_CREW, on, 0, crew[0], crew[1], crew[2], 0); ! 111: if (Rhit) ! 112: Write(W_RIGG, on, 0, rigg[0], rigg[1], rigg[2], rigg[3]); ! 113: switch (shot) { ! 114: case L_ROUND: ! 115: message = "firing round shot on %s (%c%c)"; ! 116: break; ! 117: case L_GRAPE: ! 118: message = "firing grape shot on %s (%c%c)"; ! 119: break; ! 120: case L_CHAIN: ! 121: message = "firing chain shot on %s (%c%c)"; ! 122: break; ! 123: case L_DOUBLE: ! 124: message = "firing double shot on %s (%c%c)"; ! 125: break; ! 126: case L_EXPLODE: ! 127: message = "exploding shot on %s (%c%c)"; ! 128: } ! 129: makesignal(from, message, on); ! 130: if (roll == 6 && rig) { ! 131: switch(Rhit) { ! 132: case 0: ! 133: message = "fore topsail sheets parted"; ! 134: break; ! 135: case 1: ! 136: message = "mizzen shrouds parted"; ! 137: break; ! 138: case 2: ! 139: message = "main topsail yard shot away"; ! 140: break; ! 141: case 4: ! 142: message = "fore topmast and foremast shrouds shot away"; ! 143: break; ! 144: case 5: ! 145: message = "mizzen mast and yard shot through"; ! 146: break; ! 147: case 6: ! 148: message = "foremast and spritsail yard shattered"; ! 149: break; ! 150: case 7: ! 151: message = "main topmast and mizzen mast shattered"; ! 152: break; ! 153: } ! 154: makesignal(on, message, (struct ship *)0); ! 155: } else if (roll == 6) { ! 156: switch (Hhit) { ! 157: case 0: ! 158: message = "anchor cables severed"; ! 159: break; ! 160: case 1: ! 161: message = "two anchor stocks shot away"; ! 162: break; ! 163: case 2: ! 164: message = "quarterdeck bulwarks damaged"; ! 165: break; ! 166: case 3: ! 167: message = "three gun ports shot away"; ! 168: break; ! 169: case 4: ! 170: message = "four guns dismounted"; ! 171: break; ! 172: case 5: ! 173: message = "rudder cables shot through"; ! 174: Write(W_TA, on, 0, 0, 0, 0, 0); ! 175: break; ! 176: case 6: ! 177: message = "shot holes below the water line"; ! 178: break; ! 179: } ! 180: makesignal(on, message, (struct ship *)0); ! 181: } ! 182: /* ! 183: if (Chit > 1 && on->file->readyL&R_INITIAL && on->file->readyR&R_INITIAL) { ! 184: on->specs->qual--; ! 185: if (on->specs->qual <= 0) { ! 186: makesignal(on, "crew mutinying!", (struct ship *)0); ! 187: on->specs->qual = 5; ! 188: Write(W_CAPTURED, on, 0, on->file->index, 0, 0, 0); ! 189: } else ! 190: makesignal(on, "crew demoralized", (struct ship *)0); ! 191: Write(W_QUAL, on, 0, on->specs->qual, 0, 0, 0); ! 192: } ! 193: */ ! 194: if (!hull) ! 195: strike(on, from); ! 196: } ! 197: ! 198: Cleansnag(from, to, all, flag) ! 199: register struct ship *from, *to; ! 200: char all, flag; ! 201: { ! 202: if (flag & 1) { ! 203: Write(W_UNGRAP, from, 0, to->file->index, all, 0, 0); ! 204: Write(W_UNGRAP, to, 0, from->file->index, all, 0, 0); ! 205: } ! 206: if (flag & 2) { ! 207: Write(W_UNFOUL, from, 0, to->file->index, all, 0, 0); ! 208: Write(W_UNFOUL, to, 0, from->file->index, all, 0, 0); ! 209: } ! 210: if (!snagged2(from, to)) { ! 211: if (!snagged(from)) { ! 212: unboard(from, from, 1); /* defense */ ! 213: unboard(from, from, 0); /* defense */ ! 214: } else ! 215: unboard(from, to, 0); /* offense */ ! 216: if (!snagged(to)) { ! 217: unboard(to, to, 1); /* defense */ ! 218: unboard(to, to, 0); /* defense */ ! 219: } else ! 220: unboard(to, from, 0); /* offense */ ! 221: } ! 222: } ! 223: ! 224: strike(ship, from) ! 225: register struct ship *ship, *from; ! 226: { ! 227: int points; ! 228: ! 229: if (ship->file->struck) ! 230: return; ! 231: Write(W_STRUCK, ship, 0, 1, 0, 0, 0); ! 232: points = ship->specs->pts + from->file->points; ! 233: Write(W_POINTS, from, 0, points, 0, 0, 0); ! 234: unboard(ship, ship, 0); /* all offense */ ! 235: unboard(ship, ship, 1); /* all defense */ ! 236: switch (die()) { ! 237: case 3: ! 238: case 4: /* ship may sink */ ! 239: Write(W_SINK, ship, 0, 1, 0, 0, 0); ! 240: break; ! 241: case 5: ! 242: case 6: /* ship may explode */ ! 243: Write(W_EXPLODE, ship, 0, 1, 0, 0, 0); ! 244: break; ! 245: } ! 246: Write(W_SIGNAL, ship, 1, (int) "striking her colours!", 0, 0, 0); ! 247: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.