|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1980 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[] = "@(#)computer.c 4.3 (Berkeley) 1/29/86"; ! 9: #endif not lint ! 10: ! 11: # include "trek.h" ! 12: # include "getpar.h" ! 13: # include <stdio.h> ! 14: /* ! 15: ** On-Board Computer ! 16: ** ! 17: ** A computer request is fetched from the captain. The requests ! 18: ** are: ! 19: ** ! 20: ** chart -- print a star chart of the known galaxy. This includes ! 21: ** every quadrant that has ever had a long range or ! 22: ** a short range scan done of it, plus the location of ! 23: ** all starbases. This is of course updated by any sub- ! 24: ** space radio broadcasts (unless the radio is out). ! 25: ** The format is the same as that of a long range scan ! 26: ** except that ".1." indicates that a starbase exists ! 27: ** but we know nothing else. ! 28: ** ! 29: ** trajectory -- gives the course and distance to every know ! 30: ** Klingon in the quadrant. Obviously this fails if the ! 31: ** short range scanners are out. ! 32: ** ! 33: ** course -- gives a course computation from whereever you are ! 34: ** to any specified location. If the course begins ! 35: ** with a slash, the current quadrant is taken. ! 36: ** Otherwise the input is quadrant and sector coordi- ! 37: ** nates of the target sector. ! 38: ** ! 39: ** move -- identical to course, except that the move is performed. ! 40: ** ! 41: ** score -- prints out the current score. ! 42: ** ! 43: ** pheff -- "PHaser EFFectiveness" at a given distance. Tells ! 44: ** you how much stuff you need to make it work. ! 45: ** ! 46: ** warpcost -- Gives you the cost in time and units to move for ! 47: ** a given distance under a given warp speed. ! 48: ** ! 49: ** impcost -- Same for the impulse engines. ! 50: ** ! 51: ** distresslist -- Gives a list of the currently known starsystems ! 52: ** or starbases which are distressed, together with their ! 53: ** quadrant coordinates. ! 54: ** ! 55: ** If a command is terminated with a semicolon, you remain in ! 56: ** the computer; otherwise, you escape immediately to the main ! 57: ** command processor. ! 58: */ ! 59: ! 60: struct cvntab Cputab[] = ! 61: { ! 62: "ch", "art", (int (*)())1, 0, ! 63: "t", "rajectory", (int (*)())2, 0, ! 64: "c", "ourse", (int (*)())3, 0, ! 65: "m", "ove", (int (*)())3, 1, ! 66: "s", "core", (int (*)())4, 0, ! 67: "p", "heff", (int (*)())5, 0, ! 68: "w", "arpcost", (int (*)())6, 0, ! 69: "i", "mpcost", (int (*)())7, 0, ! 70: "d", "istresslist", (int (*)())8, 0, ! 71: 0 ! 72: }; ! 73: ! 74: computer() ! 75: { ! 76: int ix, iy; ! 77: register int i, j; ! 78: int numout; ! 79: int tqx, tqy; ! 80: struct cvntab *r; ! 81: int cost; ! 82: int course; ! 83: double dist, time; ! 84: double warpfact; ! 85: struct quad *q; ! 86: register struct event *e; ! 87: ! 88: if (check_out(COMPUTER)) ! 89: return; ! 90: while (1) ! 91: { ! 92: r = getcodpar("\nRequest", Cputab); ! 93: switch (r->value) ! 94: { ! 95: ! 96: case 1: /* star chart */ ! 97: printf("Computer record of galaxy for all long range sensor scans\n\n"); ! 98: printf(" "); ! 99: /* print top header */ ! 100: for (i = 0; i < NQUADS; i++) ! 101: printf("-%d- ", i); ! 102: printf("\n"); ! 103: for (i = 0; i < NQUADS; i++) ! 104: { ! 105: printf("%d ", i); ! 106: for (j = 0; j < NQUADS; j++) ! 107: { ! 108: if (i == Ship.quadx && j == Ship.quady) ! 109: { ! 110: printf("$$$ "); ! 111: continue; ! 112: } ! 113: q = &Quad[i][j]; ! 114: /* 1000 or 1001 is special case */ ! 115: if (q->scanned >= 1000) ! 116: if (q->scanned > 1000) ! 117: printf(".1. "); ! 118: else ! 119: printf("/// "); ! 120: else ! 121: if (q->scanned < 0) ! 122: printf("... "); ! 123: else ! 124: printf("%3d ", q->scanned); ! 125: } ! 126: printf("%d\n", i); ! 127: } ! 128: printf(" "); ! 129: /* print bottom footer */ ! 130: for (i = 0; i < NQUADS; i++) ! 131: printf("-%d- ", i); ! 132: printf("\n"); ! 133: break; ! 134: ! 135: case 2: /* trajectory */ ! 136: if (check_out(SRSCAN)) ! 137: { ! 138: break; ! 139: } ! 140: if (Etc.nkling <= 0) ! 141: { ! 142: printf("No Klingons in this quadrant\n"); ! 143: break; ! 144: } ! 145: /* for each Klingon, give the course & distance */ ! 146: for (i = 0; i < Etc.nkling; i++) ! 147: { ! 148: printf("Klingon at %d,%d", Etc.klingon[i].x, Etc.klingon[i].y); ! 149: course = kalc(Ship.quadx, Ship.quady, Etc.klingon[i].x, Etc.klingon[i].y, &dist); ! 150: prkalc(course, dist); ! 151: } ! 152: break; ! 153: ! 154: case 3: /* course calculation */ ! 155: if (readdelim('/')) ! 156: { ! 157: tqx = Ship.quadx; ! 158: tqy = Ship.quady; ! 159: } ! 160: else ! 161: { ! 162: ix = getintpar("Quadrant"); ! 163: if (ix < 0 || ix >= NSECTS) ! 164: break; ! 165: iy = getintpar("q-y"); ! 166: if (iy < 0 || iy >= NSECTS) ! 167: break; ! 168: tqx = ix; ! 169: tqy = iy; ! 170: } ! 171: ix = getintpar("Sector"); ! 172: if (ix < 0 || ix >= NSECTS) ! 173: break; ! 174: iy = getintpar("s-y"); ! 175: if (iy < 0 || iy >= NSECTS) ! 176: break; ! 177: course = kalc(tqx, tqy, ix, iy, &dist); ! 178: if (r->value2) ! 179: { ! 180: warp(-1, course, dist); ! 181: break; ! 182: } ! 183: printf("%d,%d/%d,%d to %d,%d/%d,%d", ! 184: Ship.quadx, Ship.quady, Ship.sectx, Ship.secty, tqx, tqy, ix, iy); ! 185: prkalc(course, dist); ! 186: break; ! 187: ! 188: case 4: /* score */ ! 189: score(); ! 190: break; ! 191: ! 192: case 5: /* phaser effectiveness */ ! 193: dist = getfltpar("range"); ! 194: if (dist < 0.0) ! 195: break; ! 196: dist *= 10.0; ! 197: cost = pow(0.90, dist) * 98.0 + 0.5; ! 198: printf("Phasers are %d%% effective at that range\n", cost); ! 199: break; ! 200: ! 201: case 6: /* warp cost (time/energy) */ ! 202: dist = getfltpar("distance"); ! 203: if (dist < 0.0) ! 204: break; ! 205: warpfact = getfltpar("warp factor"); ! 206: if (warpfact <= 0.0) ! 207: warpfact = Ship.warp; ! 208: cost = (dist + 0.05) * warpfact * warpfact * warpfact; ! 209: time = Param.warptime * dist / (warpfact * warpfact); ! 210: printf("Warp %.2f distance %.2f cost %.2f stardates %d (%d w/ shlds up) units\n", ! 211: warpfact, dist, time, cost, cost + cost); ! 212: break; ! 213: ! 214: case 7: /* impulse cost */ ! 215: dist = getfltpar("distance"); ! 216: if (dist < 0.0) ! 217: break; ! 218: cost = 20 + 100 * dist; ! 219: time = dist / 0.095; ! 220: printf("Distance %.2f cost %.2f stardates %d units\n", ! 221: dist, time, cost); ! 222: break; ! 223: ! 224: case 8: /* distresslist */ ! 225: j = 1; ! 226: printf("\n"); ! 227: /* scan the event list */ ! 228: for (i = 0; i < MAXEVENTS; i++) ! 229: { ! 230: e = &Event[i]; ! 231: /* ignore hidden entries */ ! 232: if (e->evcode & E_HIDDEN) ! 233: continue; ! 234: switch (e->evcode & E_EVENT) ! 235: { ! 236: ! 237: case E_KDESB: ! 238: printf("Klingon is attacking starbase in quadrant %d,%d\n", ! 239: e->x, e->y); ! 240: j = 0; ! 241: break; ! 242: ! 243: case E_ENSLV: ! 244: case E_REPRO: ! 245: printf("Starsystem %s in quadrant %d,%d is distressed\n", ! 246: systemname(e), e->x, e->y); ! 247: j = 0; ! 248: break; ! 249: } ! 250: } ! 251: if (j) ! 252: printf("No known distress calls are active\n"); ! 253: break; ! 254: ! 255: } ! 256: ! 257: /* skip to next semicolon or newline. Semicolon ! 258: * means get new computer request; newline means ! 259: * exit computer mode. */ ! 260: while ((i = cgetc(0)) != ';') ! 261: { ! 262: if (i == '\0') ! 263: exit(1); ! 264: if (i == '\n') ! 265: { ! 266: ungetc(i, stdin); ! 267: return; ! 268: } ! 269: } ! 270: } ! 271: } ! 272: ! 273: ! 274: /* ! 275: ** Course Calculation ! 276: ** ! 277: ** Computes and outputs the course and distance from position ! 278: ** sqx,sqy/ssx,ssy to tqx,tqy/tsx,tsy. ! 279: */ ! 280: ! 281: kalc(tqx, tqy, tsx, tsy, dist) ! 282: int tqx; ! 283: int tqy; ! 284: int tsx; ! 285: int tsy; ! 286: double *dist; ! 287: { ! 288: double dx, dy; ! 289: double quadsize; ! 290: double angle; ! 291: register int course; ! 292: ! 293: /* normalize to quadrant distances */ ! 294: quadsize = NSECTS; ! 295: dx = (Ship.quadx + Ship.sectx / quadsize) - (tqx + tsx / quadsize); ! 296: dy = (tqy + tsy / quadsize) - (Ship.quady + Ship.secty / quadsize); ! 297: ! 298: /* get the angle */ ! 299: angle = atan2(dy, dx); ! 300: /* make it 0 -> 2 pi */ ! 301: if (angle < 0.0) ! 302: angle += 6.283185307; ! 303: /* convert from radians to degrees */ ! 304: course = angle * 57.29577951 + 0.5; ! 305: dx = dx * dx + dy * dy; ! 306: *dist = sqrt(dx); ! 307: return (course); ! 308: } ! 309: ! 310: ! 311: prkalc(course, dist) ! 312: int course; ! 313: double dist; ! 314: { ! 315: printf(": course %d dist %.3f\n", course, dist); ! 316: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.