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