|
|
1.1 ! root 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 are permitted ! 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. ! 16: */ ! 17: ! 18: #ifndef lint ! 19: static char sccsid[] = "@(#)dr_1.c 5.3 (Berkeley) 6/18/88"; ! 20: #endif /* not lint */ ! 21: ! 22: #include "driver.h" ! 23: ! 24: unfoul() ! 25: { ! 26: register struct ship *sp; ! 27: struct ship *to; ! 28: register int nat; ! 29: register i; ! 30: ! 31: foreachship(sp) { ! 32: if (sp->file->captain[0]) ! 33: continue; ! 34: nat = capship(sp)->nationality; ! 35: foreachship(to) { ! 36: if (nat != capship(to)->nationality && ! 37: !toughmelee(sp, to, 0, 0)) ! 38: continue; ! 39: for (i = fouled2(sp, to); --i >= 0;) ! 40: if (die() <= 2) ! 41: cleanfoul(sp, to, 0); ! 42: } ! 43: } ! 44: } ! 45: ! 46: boardcomp() ! 47: { ! 48: int crew[3]; ! 49: register struct ship *sp, *sq; ! 50: ! 51: foreachship(sp) { ! 52: if (*sp->file->captain) ! 53: continue; ! 54: if (sp->file->dir == 0) ! 55: continue; ! 56: if (sp->file->struck || sp->file->captured != 0) ! 57: continue; ! 58: if (!snagged(sp)) ! 59: continue; ! 60: crew[0] = sp->specs->crew1 != 0; ! 61: crew[1] = sp->specs->crew2 != 0; ! 62: crew[2] = sp->specs->crew3 != 0; ! 63: foreachship(sq) { ! 64: if (!Xsnagged2(sp, sq)) ! 65: continue; ! 66: if (meleeing(sp, sq)) ! 67: continue; ! 68: if (!sq->file->dir ! 69: || sp->nationality == capship(sq)->nationality) ! 70: continue; ! 71: switch (sp->specs->class - sq->specs->class) { ! 72: case -3: case -4: case -5: ! 73: if (crew[0]) { ! 74: /* OBP */ ! 75: sendbp(sp, sq, crew[0]*100, 0); ! 76: crew[0] = 0; ! 77: } else if (crew[1]){ ! 78: /* OBP */ ! 79: sendbp(sp, sq, crew[1]*10, 0); ! 80: crew[1] = 0; ! 81: } ! 82: break; ! 83: case -2: ! 84: if (crew[0] || crew[1]) { ! 85: /* OBP */ ! 86: sendbp(sp, sq, crew[0]*100+crew[1]*10, ! 87: 0); ! 88: crew[0] = crew[1] = 0; ! 89: } ! 90: break; ! 91: case -1: case 0: case 1: ! 92: if (crew[0]) { ! 93: /* OBP */ ! 94: sendbp(sp, sq, crew[0]*100+crew[1]*10, ! 95: 0); ! 96: crew[0] = crew[1] = 0; ! 97: } ! 98: break; ! 99: case 2: case 3: case 4: case 5: ! 100: /* OBP */ ! 101: sendbp(sp, sq, crew[0]*100+crew[1]*10+crew[2], ! 102: 0); ! 103: crew[0] = crew[1] = crew[2] = 0; ! 104: break; ! 105: } ! 106: } ! 107: } ! 108: } ! 109: ! 110: fightitout(from, to, key) ! 111: struct ship *from, *to; ! 112: int key; ! 113: { ! 114: struct ship *fromcap, *tocap; ! 115: int crewfrom[3], crewto[3], menfrom, mento; ! 116: int pcto, pcfrom, fromstrength, strengthto, frominjured, toinjured; ! 117: int topoints; ! 118: int index, totalfrom = 0, totalto = 0; ! 119: int count; ! 120: char message[60]; ! 121: ! 122: menfrom = mensent(from, to, crewfrom, &fromcap, &pcfrom, key); ! 123: mento = mensent(to, from, crewto, &tocap, &pcto, 0); ! 124: if (fromcap == 0) ! 125: fromcap = from; ! 126: if (tocap == 0) ! 127: tocap = to; ! 128: if (key) { ! 129: if (!menfrom) { /* if crew surprised */ ! 130: if (fromcap == from) ! 131: menfrom = from->specs->crew1 ! 132: + from->specs->crew2 ! 133: + from->specs->crew3; ! 134: else ! 135: menfrom = from->file->pcrew; ! 136: } else { ! 137: menfrom *= 2; /* DBP's fight at an advantage */ ! 138: } ! 139: } ! 140: fromstrength = menfrom * fromcap->specs->qual; ! 141: strengthto = mento * tocap->specs->qual; ! 142: for (count = 0; ! 143: (fromstrength < strengthto * 3 && strengthto < fromstrength * 3 ! 144: || fromstrength == -1) && count < 4; ! 145: count++) { ! 146: index = fromstrength/10; ! 147: if (index > 8) ! 148: index = 8; ! 149: toinjured = MT[index][2 - die() / 3]; ! 150: totalto += toinjured; ! 151: index = strengthto/10; ! 152: if (index > 8) ! 153: index = 8; ! 154: frominjured = MT[index][2 - die() / 3]; ! 155: totalfrom += frominjured; ! 156: menfrom -= frominjured; ! 157: mento -= toinjured; ! 158: fromstrength = menfrom * fromcap->specs->qual; ! 159: strengthto = mento * tocap->specs->qual; ! 160: } ! 161: if (fromstrength >= strengthto * 3 || count == 4) { ! 162: unboard(to, from, 0); ! 163: subtract(from, totalfrom, crewfrom, fromcap, pcfrom); ! 164: subtract(to, totalto, crewto, tocap, pcto); ! 165: makesignal(from, "boarders from %s repelled", to); ! 166: (void) sprintf(message, "killed in melee: %d. %s: %d", ! 167: totalto, from->shipname, totalfrom); ! 168: Write(W_SIGNAL, to, 1, (int) message, 0, 0, 0); ! 169: if (key) ! 170: return 1; ! 171: } else if (strengthto >= fromstrength * 3) { ! 172: unboard(from, to, 0); ! 173: subtract(from, totalfrom, crewfrom, fromcap, pcfrom); ! 174: subtract(to, totalto, crewto, tocap, pcto); ! 175: if (key) { ! 176: if (fromcap != from) ! 177: Write(W_POINTS, fromcap, 0, ! 178: fromcap->file->points - ! 179: from->file->struck ! 180: ? from->specs->pts ! 181: : 2 * from->specs->pts, ! 182: 0, 0, 0); ! 183: ! 184: /* ptr1 points to the shipspec for the ship that was just unboarded. ! 185: I guess that what is going on here is that the pointer is multiplied ! 186: or something. */ ! 187: ! 188: Write(W_CAPTURED, from, 0, to->file->index, 0, 0, 0); ! 189: topoints = 2 * from->specs->pts + to->file->points; ! 190: if (from->file->struck) ! 191: topoints -= from->specs->pts; ! 192: Write(W_POINTS, to, 0, topoints, 0, 0, 0); ! 193: mento = crewto[0] ? crewto[0] : crewto[1]; ! 194: if (mento) { ! 195: subtract(to, mento, crewto, tocap, pcto); ! 196: subtract(from, - mento, crewfrom, to, 0); ! 197: } ! 198: (void) sprintf(message, "captured by the %s!", ! 199: to->shipname); ! 200: Write(W_SIGNAL, from, 1, (int) message, 0, 0, 0); ! 201: (void) sprintf(message, "killed in melee: %d. %s: %d", ! 202: totalto, from->shipname, totalfrom); ! 203: Write(W_SIGNAL, to, 1, (int) message, 0, 0, 0); ! 204: mento = 0; ! 205: return 0; ! 206: } ! 207: } ! 208: return 0; ! 209: } ! 210: ! 211: resolve() ! 212: { ! 213: int thwart; ! 214: register struct ship *sp, *sq; ! 215: ! 216: foreachship(sp) { ! 217: if (sp->file->dir == 0) ! 218: continue; ! 219: for (sq = sp + 1; sq < ls; sq++) ! 220: if (sq->file->dir && meleeing(sp, sq) && meleeing(sq, sp)) ! 221: (void) fightitout(sp, sq, 0); ! 222: thwart = 2; ! 223: foreachship(sq) { ! 224: if (sq->file->dir && meleeing(sq, sp)) ! 225: thwart = fightitout(sp, sq, 1); ! 226: if (!thwart) ! 227: break; ! 228: } ! 229: if (!thwart) { ! 230: foreachship(sq) { ! 231: if (sq->file->dir && meleeing(sq, sp)) ! 232: unboard(sq, sp, 0); ! 233: unboard(sp, sq, 0); ! 234: } ! 235: unboard(sp, sp, 1); ! 236: } else if (thwart == 2) ! 237: unboard(sp, sp, 1); ! 238: } ! 239: } ! 240: ! 241: compcombat() ! 242: { ! 243: register n; ! 244: register struct ship *sp; ! 245: struct ship *closest; ! 246: int crew[3], men = 0, target, temp; ! 247: int r, guns, ready, load, car; ! 248: int index, rakehim, sternrake; ! 249: int shootat, hit; ! 250: ! 251: foreachship(sp) { ! 252: if (sp->file->captain[0] || sp->file->dir == 0) ! 253: continue; ! 254: crew[0] = sp->specs->crew1; ! 255: crew[1] = sp->specs->crew2; ! 256: crew[2] = sp->specs->crew3; ! 257: for (n = 0; n < 3; n++) { ! 258: if (sp->file->OBP[n].turnsent) ! 259: men += sp->file->OBP[n].mensent; ! 260: } ! 261: for (n = 0; n < 3; n++) { ! 262: if (sp->file->DBP[n].turnsent) ! 263: men += sp->file->DBP[n].mensent; ! 264: } ! 265: if (men){ ! 266: crew[0] = men/100 ? 0 : crew[0] != 0; ! 267: crew[1] = (men%100)/10 ? 0 : crew[1] != 0; ! 268: crew[2] = men%10 ? 0 : crew[2] != 0; ! 269: } ! 270: for (r = 0; r < 2; r++) { ! 271: if (!crew[2]) ! 272: continue; ! 273: if (sp->file->struck) ! 274: continue; ! 275: if (r) { ! 276: ready = sp->file->readyR; ! 277: guns = sp->specs->gunR; ! 278: car = sp->specs->carR; ! 279: } else { ! 280: ready = sp->file->readyL; ! 281: guns = sp->specs->gunL; ! 282: car = sp->specs->carL; ! 283: } ! 284: if (!guns && !car) ! 285: continue; ! 286: if ((ready & R_LOADED) == 0) ! 287: continue; ! 288: closest = closestenemy(sp, r ? 'r' : 'l', 0); ! 289: if (closest == 0) ! 290: continue; ! 291: if (range(closest, sp) > range(sp, closestenemy(sp, r ? 'r' : 'l', 1))) ! 292: continue; ! 293: if (closest->file->struck) ! 294: continue; ! 295: target = range(sp, closest); ! 296: if (target > 10) ! 297: continue; ! 298: if (!guns && target >= 3) ! 299: continue; ! 300: load = L_ROUND; ! 301: if (target == 1 && sp->file->loadwith == L_GRAPE) ! 302: load = L_GRAPE; ! 303: if (target <= 3 && closest->file->FS) ! 304: load = L_CHAIN; ! 305: if (target == 1 && load != L_GRAPE) ! 306: load = L_DOUBLE; ! 307: if (load > L_CHAIN && target < 6) ! 308: shootat = HULL; ! 309: else ! 310: shootat = RIGGING; ! 311: rakehim = gunsbear(sp, closest) ! 312: && !gunsbear(closest, sp); ! 313: temp = portside(closest, sp, 1) ! 314: - closest->file->dir + 1; ! 315: if (temp < 1) ! 316: temp += 8; ! 317: if (temp > 8) ! 318: temp -= 8; ! 319: sternrake = temp > 4 && temp < 6; ! 320: index = guns; ! 321: if (target < 3) ! 322: index += car; ! 323: index = (index - 1) / 3; ! 324: index = index > 8 ? 8 : index; ! 325: if (!rakehim) ! 326: hit = HDT[index][target-1]; ! 327: else ! 328: hit = HDTrake[index][target-1]; ! 329: if (rakehim && sternrake) ! 330: hit++; ! 331: hit += QUAL[index][capship(sp)->specs->qual - 1]; ! 332: for (n = 0; n < 3 && sp->file->captured == 0; n++) ! 333: if (!crew[n]) ! 334: if (index <= 5) ! 335: hit--; ! 336: else ! 337: hit -= 2; ! 338: if (ready & R_INITIAL) { ! 339: if (!r) ! 340: sp->file->readyL &= ~R_INITIAL; ! 341: else ! 342: sp->file->readyR &= ~R_INITIAL; ! 343: if (index <= 3) ! 344: hit++; ! 345: else ! 346: hit += 2; ! 347: } ! 348: if (sp->file->captured != 0) ! 349: if (index <= 1) ! 350: hit--; ! 351: else ! 352: hit -= 2; ! 353: hit += AMMO[index][load - 1]; ! 354: temp = sp->specs->class; ! 355: if ((temp >= 5 || temp == 1) && windspeed == 5) ! 356: hit--; ! 357: if (windspeed == 6 && temp == 4) ! 358: hit -= 2; ! 359: if (windspeed == 6 && temp <= 3) ! 360: hit--; ! 361: if (hit >= 0) { ! 362: if (load != L_GRAPE) ! 363: hit = hit > 10 ? 10 : hit; ! 364: table(shootat, load, hit, closest, sp, die()); ! 365: } ! 366: } ! 367: } ! 368: } ! 369: ! 370: next() ! 371: { ! 372: if (++turn % 55 == 0) ! 373: if (alive) ! 374: alive = 0; ! 375: else ! 376: people = 0; ! 377: if (people <= 0 || windspeed == 7) { ! 378: register struct ship *s; ! 379: struct ship *bestship; ! 380: float net, best = 0.0; ! 381: foreachship(s) { ! 382: if (*s->file->captain) ! 383: continue; ! 384: net = (float)s->file->points / s->specs->pts; ! 385: if (net > best) { ! 386: best = net; ! 387: bestship = s; ! 388: } ! 389: } ! 390: if (best > 0.0) { ! 391: char *p = getenv("WOTD"); ! 392: if (p == 0) ! 393: p = "Driver"; ! 394: if (islower(*p)) ! 395: *p = toupper(*p); ! 396: (void) strncpy(bestship->file->captain, p, ! 397: sizeof bestship->file->captain); ! 398: bestship->file->captain ! 399: [sizeof bestship->file->captain - 1] = 0; ! 400: log(bestship); ! 401: } ! 402: return -1; ! 403: } ! 404: Write(W_TURN, SHIP(0), 0, turn, 0, 0, 0); ! 405: if (turn % 7 == 0 && (die() >= cc->windchange || !windspeed)) { ! 406: switch (die()) { ! 407: case 1: ! 408: winddir = 1; ! 409: break; ! 410: case 2: ! 411: break; ! 412: case 3: ! 413: winddir++; ! 414: break; ! 415: case 4: ! 416: winddir--; ! 417: break; ! 418: case 5: ! 419: winddir += 2; ! 420: break; ! 421: case 6: ! 422: winddir -= 2; ! 423: break; ! 424: } ! 425: if (winddir > 8) ! 426: winddir -= 8; ! 427: if (winddir < 1) ! 428: winddir += 8; ! 429: if (windspeed) ! 430: switch (die()) { ! 431: case 1: ! 432: case 2: ! 433: windspeed--; ! 434: break; ! 435: case 5: ! 436: case 6: ! 437: windspeed++; ! 438: break; ! 439: } ! 440: else ! 441: windspeed++; ! 442: Write(W_WIND, SHIP(0), 0, winddir, windspeed, 0, 0); ! 443: } ! 444: return 0; ! 445: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.