|
|
1.1 root 1: # include "trek.h"
2:
3: /**
4: ** on-board computer
5: **/
6:
7: CVNTAB Cputab[]
8: {
9: "r", "ecord",
10: "m", "ove",
11: "t", "rajectory",
12: "c", "ourse",
13: "s", "core",
14: "p", "heff",
15: "w", "arpcost",
16: "i", "mpcost",
17: "d", "istresslist",
18: "b", "ase",
19: "k", "alculator",
20: "x", "",
21: "y", "",
22: 0
23: };
24:
25: computer()
26: {
27: char c;
28: int ix, iy;
29: register int i, j;
30: int tqx, tqy, tsx, tsy;
31: int cost, course;
32: float dist, time;
33: float warpfac;
34: EVENT *e;
35:
36: if (Damage[COMPUTER])
37: {
38: printf("Computer disabled.\n");
39: return;
40: }
41: do{
42: if((i=getcodpar("Request", Cputab))<0) return;
43: switch(c = *(Cputab[i].abrev)) {
44:
45: case 'r': /* star chart */
46: printf("Computer record of galaxy for all L.R. scans\n",
47: Status.shipname, Quadx, Quady);
48: scanall(0);
49: break;
50:
51: case 't': /* trajectory */
52: if (chksrs()==0)
53: break;
54: if (Nkling <= 0)
55: {
56: printf("No Klingons in this quadrant.\n");
57: break;
58: }
59: for (i = 0; i < Nkling; i++)
60: {
61: printf("Klingon at %d,%d", Kling[i].x, Kling[i].y);
62: course=dokalc(Quadx, Quady, Kling[i].x, Kling[i].y, &dist);
63: prkalc(course,dist);
64: }
65: break;
66:
67: case 'c': /* course */
68: case 'm': /* move */
69: if(readsep("/")) {
70: tqx = Quadx;
71: tqy = Quady;
72: } else {
73: if(getintpar("Quadrant", &ix)==0) break;
74: readsep(",");
75: if(getintpar("quadrant y-coordinate", &iy)==0) break;
76: tqx = ix;
77: tqy = iy;
78: readsep("/");
79: }
80: if(getsect(&ix,&iy)==0)
81: break;
82: tsx = ix;
83: tsy = iy;
84: if(chkquad(tqx,tqy)) {
85: course=dokalc(tqx, tqy, tsx, tsy, &dist);
86: if(c=='m') {
87: if(Status.cond!=DOCKED)
88: warp(0,course,dist);
89: else
90: printf("%s is docked.\n", Status.shipname);
91: } else {
92: printf("%d,%d/%d,%d to %d,%d/%d,%d",
93: Quadx, Quady, Sectx, Secty, tqx, tqy, tsx, tsy);
94: prkalc(course, dist);
95: }
96: }
97: break;
98:
99: case 's': /* score */
100: score();
101: break;
102:
103: case 'p': /* phasers effective */
104: if(getfltpar("Range", &dist)==0 ||
105: chkdist(dist)==0) break;
106: dist =* 10.0;
107: cost = pow(0.90, dist) * 100 + 0.5;
108: printf("Phasers are %d%% effective at that range.\n", cost);
109: break;
110:
111: case 'w': /* warp cost */
112: if(getfltpar("Distance", &dist)==0 ||
113: chkdist(dist)==0 ||
114: getfltpar("Warp factor", &warpfac)==0) break;
115: cost = (dist + 0.05) * warpfac * warpfac * warpfac;
116: if(Status.shldup)
117: cost =* 2;
118: time = Param.warptime * dist / (warpfac * warpfac);
119: if(Status.cloaked)
120: cost =+ Param.cloakenergy*time;
121: printf("Distance %.2f cost %.2f stardates %d units",
122: dist, time, cost);
123: if(Status.shldup)
124: printf(" (shields up)");
125: if(Status.cloaked)
126: printf(" (CLOAKED)");
127: printf("\n");
128: break;
129:
130: case 'i': /* impulse cost */
131: if(getfltpar("Distance", &dist)==0) break;
132: cost = 20 + 100 * dist;
133: time = dist / 0.095;
134: printf("Distance %.2f cost %.2f stardates %d units\n",
135: dist, time, cost);
136: break;
137:
138:
139: case 'd': /* distresslist */
140: j = 0;
141: for (i = 0; i < MAXEVENTS; i++)
142: {
143: e = &Event[i];
144: if ((e->systemname&E_NREPORT)==0)
145: j =| report(e);
146: }
147: if (j==0)
148: printf("No known distress calls are active.\n");
149: break;
150:
151: case 'b': /* star base */
152: {double d; int dx, dy, b;
153: if((b=findbase(&d))<0 && Damage[SRSCAN]) {
154: printf("S.R. scanners damaged\n");
155: } else {
156: printf("nearest star base is ");
157: if(b>=0) {
158: dx=Base[b].x; dy=Base[b].y;
159: printf("in quadrant %d,%d\n", dx, dy);
160: } else {
161: dx=Starbase.x; dy=Starbase.y;
162: printf("at sector %d,%d\n", dx, dy);
163: }
164: }
165: }
166: break;
167:
168: case 'x': /* x scan */
169: case 'y':
170: {int x_axis;
171: if(Damage[SRSCAN]) {
172: printf("S.R. scanners damaged\n");
173: break;
174: }
175: if(getintpar("coordinate",&ix)==0) break;
176: if(ix<0 || ix>NSECTS) {
177: printf("Out of range\n");
178: break;
179: }
180: x_axis=(c=='x');
181: printf("%d,%d ", (x_axis?ix:0), (x_axis?0:ix));
182: for(i=0;i<NSECTS;i++) {
183: printf(" %c", (x_axis ? Sect[ix][i] : Sect[i][ix]));
184: }
185: printf(" %d,%d\n", (x_axis?ix:NSECTS-1), (x_axis?NSECTS-1:ix));
186: }
187: break;
188:
189: case 'k': /* calculator */
190: printf("The calculator is broken.\n");
191: break;
192: }
193: } while(readsep(";"));
194: }
195:
196:
197: dokalc(tqx, tqy, tsx, tsy, dist)
198: float *dist;
199: {
200: double dx, dy;
201: float quadsize;
202: double angle;
203: int course;
204:
205: quadsize = NSECTS;
206: dx = (Quadx + Sectx / quadsize) - (tqx + tsx / quadsize);
207: dy = (tqy + tsy / quadsize) - (Quady + Secty / quadsize);
208: angle = atan2(dy, dx);
209: if (angle < 0.0)
210: angle =+ 6.283185307;
211: course = angle * 57.29577951 + 0.5;
212: dx = sqrt(dx*dx + dy*dy);
213: *dist=dx;
214: return(course);
215: }
216:
217: prkalc(course,dist)
218: float dist;
219: {
220: printf(": course %3d, distance %.3f\n", course, dist);
221: }
222:
223: chkdist(d)
224: float d;
225: {
226: register int b;
227:
228: if (b=(d < 0.0 || d > 15.0))
229: printf("Distances must be positive.\n");
230: return(!b);
231: }
232:
233: chksect(sx,sy)
234: {
235: register int b;
236:
237: if(b = (sx<0 || sy<0 || sx>=NSECTS || sy>=NSECTS))
238: printf("%d,%d bad sector coordinates\n", sx, sy);
239: return(!b);
240: }
241:
242: chkquad(qx,qy)
243: {
244: register int b;
245:
246: if(b = (qx<0 || qy<0 || qx>=NQUADS || qy>=NQUADS))
247: printf("%d,%d bad quadrant coordinates\n", qx, qy);
248: return(!b);
249: }
250:
251: prsect(flg,i,j)
252: {
253: register int k, b, n;
254: char c;
255: QUAD *q;
256:
257: q = &Quad[i][j];
258: if(flg) {
259: q->scanned=((q->stars>=0)
260: ? (q->qkling * 100 + q->bases * 10 + q->stars)
261: : 1000
262: );
263: }
264: n=q->scanned;
265: if (n >= 1000)
266: printf(((n==1000)?" ///":" .#."));
267: else {
268: if (n < 0)
269: printf(" ...");
270: else {
271: k=n/100; b=(n =% 100)/10; n =% 10;
272: if(i==Quadx && j==Quady)
273: b=Status.ship;
274: else if(b) b='#';
275: c=(k?'0':' ');
276: printf(" %c%c%c", (k?k+'0':' '), (b?b:c), n+'0');
277: }
278: }
279: }
280:
281: getsect(ax,ay)
282: int *ax, *ay;
283: {
284: if(getintpar("Sector", ax)==0 ||
285: (readsep(","), getintpar("sector y-coordinate", ay)==0) ||
286: chksect(*ax,*ay)==0)
287: return(0);
288: return(1);
289: }
290:
291: scanall(flg)
292: {
293: register int i, j;
294:
295: printf(" ");
296: for (i = 0; i < NQUADS; i++)
297: printf("-%d- ", i);
298: printf("\n");
299: for (i = 0; i < NQUADS; i++)
300: {
301: if(mkfault) break;
302: printf("%d", i);
303: for (j = 0; j < NQUADS; j++)
304: {
305: prsect(flg,i,j);
306: }
307: printf(" %d\n", i);
308: }
309: printf(" ");
310: for (i = 0; i < NQUADS; i++)
311: printf("-%d- ", i);
312: printf("\n");
313: }
314:
315:
316: chksrs()
317: {
318: if(Damage[SRSCAN]) {
319: printf("S.R. scanners damaged");
320: if(Status.cond==DOCKED) {
321: printf("; using starbase scanners.\n");
322: return(1);
323: } else
324: printf("\n");
325: return(0);
326: } else return(1);
327: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.