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