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