|
|
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[] = "@(#)pl_3.c 5.1 (Berkeley) 5/29/85"; ! 9: #endif not lint ! 10: ! 11: #include "player.h" ! 12: ! 13: acceptcombat() ! 14: { ! 15: int men = 0; ! 16: int target, temp; ! 17: int n, r; ! 18: int index, rakehim, sternrake; ! 19: int hhits = 0, ghits = 0, rhits = 0, chits = 0; ! 20: int crew[3]; ! 21: int load; ! 22: int guns, car, ready, shootat, hit; ! 23: int roll; ! 24: struct ship *closest; ! 25: ! 26: crew[0] = mc->crew1; ! 27: crew[1] = mc->crew2; ! 28: crew[2] = mc->crew3; ! 29: for (n = 0; n < 3; n++) { ! 30: if (mf->OBP[n].turnsent) ! 31: men += mf->OBP[n].mensent; ! 32: } ! 33: for (n = 0; n < 3; n++) { ! 34: if (mf->DBP[n].turnsent) ! 35: men += mf->DBP[n].mensent; ! 36: } ! 37: if (men) { ! 38: crew[0] = men/100 ? 0 : crew[0] != 0; ! 39: crew[1] = (men%100)/10 ? 0 : crew[1] != 0; ! 40: crew[2] = men%10 ? 0 : crew[2] != 0; ! 41: } ! 42: for (r = 0; r < 2; r++) { ! 43: if (r) { ! 44: ready = mf->readyR; ! 45: load = mf->loadR; ! 46: guns = mc->gunR; ! 47: car = mc->carR; ! 48: } else { ! 49: ready = mf->readyL; ! 50: load = mf->loadL; ! 51: guns = mc->gunL; ! 52: car = mc->carL; ! 53: } ! 54: if (!guns && !car || load == L_EMPTY || (ready & R_LOADED) == 0) ! 55: goto cant; ! 56: if (mf->struck || !crew[2]) ! 57: goto cant; ! 58: closest = closestenemy(ms, (r ? 'r' : 'l'), 1); ! 59: if (closest == 0) ! 60: goto cant; ! 61: if (closest->file->struck) ! 62: goto cant; ! 63: target = range(ms, closest); ! 64: if (target > rangeofshot[load] || !guns && target >= 3) ! 65: goto cant; ! 66: Signal("%s (%c%c) within range of %s broadside.", ! 67: closest, r ? "right" : "left"); ! 68: if (load > L_CHAIN && target < 6) { ! 69: switch (sgetch("Aim for hull or rigging? ", ! 70: (struct ship *)0, 1)) { ! 71: case 'r': ! 72: shootat = RIGGING; ! 73: break; ! 74: case 'h': ! 75: shootat = HULL; ! 76: break; ! 77: default: ! 78: shootat = -1; ! 79: Signal("'Avast there! Hold your fire.'", ! 80: (struct ship *)0); ! 81: } ! 82: } else { ! 83: if (sgetch("Fire? ", (struct ship *)0, 1) == 'n') { ! 84: shootat = -1; ! 85: Signal("Belay that! Hold your fire.", ! 86: (struct ship *)0); ! 87: } else ! 88: shootat = RIGGING; ! 89: } ! 90: if (shootat == -1) ! 91: continue; ! 92: fired = 1; ! 93: rakehim = gunsbear(ms, closest) && !gunsbear(closest, ms); ! 94: temp = portside(closest, ms, 1) - closest->file->dir + 1; ! 95: if (temp < 1) ! 96: temp += 8; ! 97: else if (temp > 8) ! 98: temp -= 8; ! 99: sternrake = temp > 4 && temp < 6; ! 100: if (rakehim) ! 101: if (!sternrake) ! 102: Signal("Raking the %s!", closest); ! 103: else ! 104: Signal("Stern Rake! %s splintering!", closest); ! 105: index = guns; ! 106: if (target < 3) ! 107: index += car; ! 108: index = (index - 1)/3; ! 109: index = index > 8 ? 8 : index; ! 110: if (!rakehim) ! 111: hit = HDT[index][target-1]; ! 112: else ! 113: hit = HDTrake[index][target-1]; ! 114: if (rakehim && sternrake) ! 115: hit++; ! 116: hit += QUAL[index][mc->qual-1]; ! 117: for (n = 0; n < 3 && mf->captured == 0; n++) ! 118: if (!crew[n]) ! 119: if (index <= 5) ! 120: hit--; ! 121: else ! 122: hit -= 2; ! 123: if (ready & R_INITIAL) ! 124: if (index <= 3) ! 125: hit++; ! 126: else ! 127: hit += 2; ! 128: if (mf->captured != 0) ! 129: if (index <= 1) ! 130: hit--; ! 131: else ! 132: hit -= 2; ! 133: hit += AMMO[index][load - 1]; ! 134: if (((temp = mc->class) >= 5 || temp == 1) && windspeed == 5) ! 135: hit--; ! 136: if (windspeed == 6 && temp == 4) ! 137: hit -= 2; ! 138: if (windspeed == 6 && temp <= 3) ! 139: hit--; ! 140: if (hit >= 0) { ! 141: roll = die(); ! 142: if (load == L_GRAPE) ! 143: chits = hit; ! 144: else { ! 145: struct Tables *t; ! 146: if (hit > 10) ! 147: hit = 10; ! 148: t = &(shootat == RIGGING ? RigTable : HullTable) ! 149: [hit][roll-1]; ! 150: chits = t->C; ! 151: rhits = t->R; ! 152: hhits = t->H; ! 153: ghits = t->G; ! 154: if (closest->file->FS) ! 155: rhits *= 2; ! 156: if (load == L_CHAIN) { ! 157: ghits = 0; ! 158: hhits = 0; ! 159: } ! 160: } ! 161: table(shootat, load, hit, closest, ms, roll); ! 162: } ! 163: Signal("Damage inflicted on the %s:", ! 164: (struct ship *)0, closest->shipname); ! 165: Signal("\t%d HULL, %d GUNS, %d CREW, %d RIGGING", ! 166: (struct ship *)0, hhits, ghits, chits, rhits); ! 167: if (!r) { ! 168: mf->loadL = L_EMPTY; ! 169: mf->readyL = R_EMPTY; ! 170: } else { ! 171: mf->loadR = L_EMPTY; ! 172: mf->readyR = R_EMPTY; ! 173: } ! 174: continue; ! 175: cant: ! 176: Signal("Unable to fire %s broadside", ! 177: (struct ship *)0, r ? "right" : "left"); ! 178: } ! 179: blockalarm(); ! 180: draw_stat(); ! 181: unblockalarm(); ! 182: } ! 183: ! 184: grapungrap() ! 185: { ! 186: register struct ship *sp; ! 187: register int i; ! 188: ! 189: foreachship(sp) { ! 190: if (sp == ms || sp->file->dir == 0) ! 191: continue; ! 192: if (range(ms, sp) > 1 && !grappled2(ms, sp)) ! 193: continue; ! 194: switch (sgetch("Attempt to grapple or ungrapple %s (%c%c): ", ! 195: sp, 1)) { ! 196: case 'g': ! 197: if (die() < 3 ! 198: || ms->nationality == capship(sp)->nationality) { ! 199: Write(W_GRAP, ms, 0, sp->file->index, 0, 0, 0); ! 200: Write(W_GRAP, sp, 0, player, 0, 0, 0); ! 201: Signal("Attempt succeeds!", (struct ship *)0); ! 202: makesignal(ms, "grappled with %s (%c%c)", sp); ! 203: } else ! 204: Signal("Attempt fails.", (struct ship *)0); ! 205: break; ! 206: case 'u': ! 207: for (i = grappled2(ms, sp); --i >= 0;) { ! 208: if (ms->nationality ! 209: == capship(sp)->nationality ! 210: || die() < 3) { ! 211: cleangrapple(ms, sp, 0); ! 212: Signal("Attempt succeeds!", ! 213: (struct ship *)0); ! 214: makesignal(ms, ! 215: "ungrappling with %s (%c%c)", ! 216: sp); ! 217: } else ! 218: Signal("Attempt fails.", ! 219: (struct ship *)0); ! 220: } ! 221: break; ! 222: } ! 223: } ! 224: } ! 225: ! 226: unfoulplayer() ! 227: { ! 228: register struct ship *to; ! 229: register i; ! 230: ! 231: foreachship(to) { ! 232: if (fouled2(ms, to) == 0) ! 233: continue; ! 234: if (sgetch("Attempt to unfoul with the %s (%c%c)? ", to, 1) != 'y') ! 235: continue; ! 236: for (i = fouled2(ms, to); --i >= 0;) { ! 237: if (die() <= 2) { ! 238: cleanfoul(ms, to, 0); ! 239: Signal("Attempt succeeds!", (struct ship *)0); ! 240: makesignal(ms, "Unfouling %s (%c%c)", to); ! 241: } else ! 242: Signal("Attempt fails.", (struct ship *)0); ! 243: } ! 244: } ! 245: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.