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