|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1980 Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted provided ! 6: * that: (1) source distributions retain this entire copyright notice and ! 7: * comment, and (2) distributions including binaries display the following ! 8: * acknowledgement: ``This product includes software developed by the ! 9: * University of California, Berkeley and its contributors'' in the ! 10: * documentation or other materials provided with the distribution and in ! 11: * all advertising materials mentioning features or use of this software. ! 12: * Neither the name of the University nor the names of its contributors may ! 13: * be used to endorse or promote products derived from this software without ! 14: * specific prior written permission. ! 15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED ! 16: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF ! 17: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 18: */ ! 19: ! 20: #ifndef lint ! 21: static char sccsid[] = "@(#)torped.c 5.4 (Berkeley) 6/1/90"; ! 22: #endif /* not lint */ ! 23: ! 24: # include <stdio.h> ! 25: # include "trek.h" ! 26: ! 27: /* ! 28: ** PHOTON TORPEDO CONTROL ! 29: ** ! 30: ** Either one or three photon torpedoes are fired. If three ! 31: ** are fired, it is called a "burst" and you also specify ! 32: ** a spread angle. ! 33: ** ! 34: ** Torpedoes are never 100% accurate. There is always a random ! 35: ** cludge factor in their course which is increased if you have ! 36: ** your shields up. Hence, you will find that they are more ! 37: ** accurate at close range. However, they have the advantage that ! 38: ** at long range they don't lose any of their power as phasers ! 39: ** do, i.e., a hit is a hit is a hit, by any other name. ! 40: ** ! 41: ** When the course spreads too much, you get a misfire, and the ! 42: ** course is randomized even more. You also have the chance that ! 43: ** the misfire damages your torpedo tubes. ! 44: */ ! 45: ! 46: ! 47: torped() ! 48: { ! 49: register int ix, iy; ! 50: double x, y, dx, dy; ! 51: double angle; ! 52: int course, course2; ! 53: register int k; ! 54: double bigger; ! 55: double sectsize; ! 56: int burst; ! 57: int n; ! 58: ! 59: if (Ship.cloaked) ! 60: { ! 61: return (printf("Federation regulations do not permit attack while cloaked.\n")); ! 62: } ! 63: if (check_out(TORPED)) ! 64: return; ! 65: if (Ship.torped <= 0) ! 66: { ! 67: return (printf("All photon torpedos expended\n")); ! 68: } ! 69: ! 70: /* get the course */ ! 71: course = getintpar("Torpedo course"); ! 72: if (course < 0 || course > 360) ! 73: return; ! 74: burst = -1; ! 75: ! 76: /* need at least three torpedoes for a burst */ ! 77: if (Ship.torped < 3) ! 78: { ! 79: printf("No-burst mode selected\n"); ! 80: burst = 0; ! 81: } ! 82: else ! 83: { ! 84: /* see if the user wants one */ ! 85: if (!testnl()) ! 86: { ! 87: k = ungetc(cgetc(0), stdin); ! 88: if (k >= '0' && k <= '9') ! 89: burst = 1; ! 90: } ! 91: } ! 92: if (burst < 0) ! 93: { ! 94: burst = getynpar("Do you want a burst"); ! 95: } ! 96: if (burst) ! 97: { ! 98: burst = getintpar("burst angle"); ! 99: if (burst <= 0) ! 100: return; ! 101: if (burst > 15) ! 102: return (printf("Maximum burst angle is 15 degrees\n")); ! 103: } ! 104: sectsize = NSECTS; ! 105: n = -1; ! 106: if (burst) ! 107: { ! 108: n = 1; ! 109: course -= burst; ! 110: } ! 111: for (; n && n <= 3; n++) ! 112: { ! 113: /* select a nice random course */ ! 114: course2 = course + randcourse(n); ! 115: angle = course2 * 0.0174532925; /* convert to radians */ ! 116: dx = -cos(angle); ! 117: dy = sin(angle); ! 118: bigger = fabs(dx); ! 119: x = fabs(dy); ! 120: if (x > bigger) ! 121: bigger = x; ! 122: dx /= bigger; ! 123: dy /= bigger; ! 124: x = Ship.sectx + 0.5; ! 125: y = Ship.secty + 0.5; ! 126: if (Ship.cond != DOCKED) ! 127: Ship.torped -= 1; ! 128: printf("Torpedo track"); ! 129: if (n > 0) ! 130: printf(", torpedo number %d", n); ! 131: printf(":\n%6.1f\t%4.1f\n", x, y); ! 132: while (1) ! 133: { ! 134: ix = x += dx; ! 135: iy = y += dy; ! 136: if (x < 0.0 || x >= sectsize || y < 0.0 || y >= sectsize) ! 137: { ! 138: printf("Torpedo missed\n"); ! 139: break; ! 140: } ! 141: printf("%6.1f\t%4.1f\n", x, y); ! 142: switch (Sect[ix][iy]) ! 143: { ! 144: case EMPTY: ! 145: continue; ! 146: ! 147: case HOLE: ! 148: printf("Torpedo disappears into a black hole\n"); ! 149: break; ! 150: ! 151: case KLINGON: ! 152: for (k = 0; k < Etc.nkling; k++) ! 153: { ! 154: if (Etc.klingon[k].x != ix || Etc.klingon[k].y != iy) ! 155: continue; ! 156: Etc.klingon[k].power -= 500 + ranf(501); ! 157: if (Etc.klingon[k].power > 0) ! 158: { ! 159: printf("*** Hit on Klingon at %d,%d: extensive damages\n", ! 160: ix, iy); ! 161: break; ! 162: } ! 163: killk(ix, iy); ! 164: break; ! 165: } ! 166: break; ! 167: ! 168: case STAR: ! 169: nova(ix, iy); ! 170: break; ! 171: ! 172: case INHABIT: ! 173: kills(ix, iy, -1); ! 174: break; ! 175: ! 176: case BASE: ! 177: killb(Ship.quadx, Ship.quady); ! 178: Game.killb += 1; ! 179: break; ! 180: default: ! 181: printf("Unknown object %c at %d,%d destroyed\n", ! 182: Sect[ix][iy], ix, iy); ! 183: Sect[ix][iy] = EMPTY; ! 184: break; ! 185: } ! 186: break; ! 187: } ! 188: if (damaged(TORPED) || Quad[Ship.quadx][Ship.quady].stars < 0) ! 189: break; ! 190: course += burst; ! 191: } ! 192: Move.free = 0; ! 193: } ! 194: ! 195: ! 196: /* ! 197: ** RANDOMIZE COURSE ! 198: ** ! 199: ** This routine randomizes the course for torpedo number 'n'. ! 200: ** Other things handled by this routine are misfires, damages ! 201: ** to the tubes, etc. ! 202: */ ! 203: ! 204: randcourse(n) ! 205: int n; ! 206: { ! 207: double r; ! 208: register int d; ! 209: ! 210: d = ((franf() + franf()) - 1.0) * 20; ! 211: if (abs(d) > 12) ! 212: { ! 213: printf("Photon tubes misfire"); ! 214: if (n < 0) ! 215: printf("\n"); ! 216: else ! 217: printf(" on torpedo %d\n", n); ! 218: if (ranf(2)) ! 219: { ! 220: damage(TORPED, 0.2 * abs(d) * (franf() + 1.0)); ! 221: } ! 222: d *= 1.0 + 2.0 * franf(); ! 223: } ! 224: if (Ship.shldup || Ship.cond == DOCKED) ! 225: { ! 226: r = Ship.shield; ! 227: r = 1.0 + r / Param.shield; ! 228: if (Ship.cond == DOCKED) ! 229: r = 2.0; ! 230: d *= r; ! 231: } ! 232: return (d); ! 233: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.