|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)snova.c 4.2 (Berkeley) 5/9/83";
3: #endif not lint
4:
5: # include "trek.h"
6:
7: /*
8: ** CAUSE SUPERNOVA TO OCCUR
9: **
10: ** A supernova occurs. If 'ix' < 0, a random quadrant is chosen;
11: ** otherwise, the current quadrant is taken, and (ix, iy) give
12: ** the sector quadrants of the star which is blowing up.
13: **
14: ** If the supernova turns out to be in the quadrant you are in,
15: ** you go into "emergency override mode", which tries to get you
16: ** out of the quadrant as fast as possible. However, if you
17: ** don't have enough fuel, or if you by chance run into something,
18: ** or some such thing, you blow up anyway. Oh yeh, if you are
19: ** within two sectors of the star, there is nothing that can
20: ** be done for you.
21: **
22: ** When a star has gone supernova, the quadrant becomes uninhab-
23: ** itable for the rest of eternity, i.e., the game. If you ever
24: ** try stopping in such a quadrant, you will go into emergency
25: ** override mode.
26: */
27:
28: snova(x, y)
29: int x, y;
30: {
31: int qx, qy;
32: register int ix, iy;
33: int f;
34: int dx, dy;
35: int n;
36: register struct quad *q;
37:
38: f = 0;
39: ix = x;
40: if (ix < 0)
41: {
42: /* choose a quadrant */
43: while (1)
44: {
45: qx = ranf(NQUADS);
46: qy = ranf(NQUADS);
47: q = &Quad[qx][qy];
48: if (q->stars > 0)
49: break;
50: }
51: if (Ship.quadx == qx && Ship.quady == qy)
52: {
53: /* select a particular star */
54: n = ranf(q->stars);
55: for (ix = 0; ix < NSECTS; ix++)
56: {
57: for (iy = 0; iy < NSECTS; iy++)
58: if (Sect[ix][iy] == STAR || Sect[ix][iy] == INHABIT)
59: if ((n -= 1) <= 0)
60: break;
61: if (n <= 0)
62: break;
63: }
64: f = 1;
65: }
66: }
67: else
68: {
69: /* current quadrant */
70: iy = y;
71: qx = Ship.quadx;
72: qy = Ship.quady;
73: q = &Quad[qx][qy];
74: f = 1;
75: }
76: if (f)
77: {
78: /* supernova is in same quadrant as Enterprise */
79: printf("\nRED ALERT: supernova occuring at %d,%d\n", ix, iy);
80: dx = ix - Ship.sectx;
81: dy = iy - Ship.secty;
82: if (dx * dx + dy * dy <= 2)
83: {
84: printf("*** Emergency override attem");
85: sleep(1);
86: printf("\n");
87: lose(L_SNOVA);
88: }
89: q->scanned = 1000;
90: }
91: else
92: {
93: if (!damaged(SSRADIO))
94: {
95: q->scanned = 1000;
96: printf("\nUhura: Captain, Starfleet Command reports a supernova\n");
97: printf(" in quadrant %d,%d. Caution is advised\n", qx, qy);
98: }
99: }
100:
101: /* clear out the supernova'ed quadrant */
102: dx = q->klings;
103: dy = q->stars;
104: Now.klings -= dx;
105: if (x >= 0)
106: {
107: /* Enterprise caused supernova */
108: Game.kills += dy;
109: if (q->bases)
110: killb(qx, qy, -1);
111: Game.killk += dx;
112: }
113: else
114: if (q->bases)
115: killb(qx, qy, 0);
116: killd(qx, qy, (x >= 0));
117: q->stars = -1;
118: q->klings = 0;
119: if (Now.klings <= 0)
120: {
121: printf("Lucky devil, that supernova destroyed the last klingon\n");
122: win();
123: }
124: return;
125: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.