]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - games/trek/snova.c
This commit was generated by cvs2svn to compensate for changes in r98675,
[FreeBSD/FreeBSD.git] / games / trek / snova.c
1 /*
2  * Copyright (c) 1980, 1993
3  *      The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *      This product includes software developed by the University of
16  *      California, Berkeley and its contributors.
17  * 4. Neither the name of the University nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  */
33
34 #ifndef lint
35 #if 0
36 static char sccsid[] = "@(#)snova.c     8.1 (Berkeley) 5/31/93";
37 #endif
38 static const char rcsid[] =
39  "$FreeBSD$";
40 #endif /* not lint */
41
42 # include       "trek.h"
43
44 /*
45 **  CAUSE SUPERNOVA TO OCCUR
46 **
47 **      A supernova occurs.  If 'ix' < 0, a random quadrant is chosen;
48 **      otherwise, the current quadrant is taken, and (ix, iy) give
49 **      the sector quadrants of the star which is blowing up.
50 **
51 **      If the supernova turns out to be in the quadrant you are in,
52 **      you go into "emergency override mode", which tries to get you
53 **      out of the quadrant as fast as possible.  However, if you
54 **      don't have enough fuel, or if you by chance run into something,
55 **      or some such thing, you blow up anyway.  Oh yeh, if you are
56 **      within two sectors of the star, there is nothing that can
57 **      be done for you.
58 **
59 **      When a star has gone supernova, the quadrant becomes uninhab-
60 **      itable for the rest of eternity, i.e., the game.  If you ever
61 **      try stopping in such a quadrant, you will go into emergency
62 **      override mode.
63 */
64
65 snova(x, y)
66 int     x, y;
67 {
68         int                     qx, qy;
69         int             ix, iy;
70         int                     f;
71         int                     dx, dy;
72         int                     n;
73         struct quad     *q;
74
75         f = 0;
76         ix = x;
77         if (ix < 0)
78         {
79                 /* choose a quadrant */
80                 while (1)
81                 {
82                         qx = ranf(NQUADS);
83                         qy = ranf(NQUADS);
84                         q = &Quad[qx][qy];
85                         if (q->stars > 0)
86                                 break;
87                 }
88                 if (Ship.quadx == qx && Ship.quady == qy)
89                 {
90                         /* select a particular star */
91                         n = ranf(q->stars);
92                         for (ix = 0; ix < NSECTS; ix++)
93                         {
94                                 for (iy = 0; iy < NSECTS; iy++)
95                                         if (Sect[ix][iy] == STAR || Sect[ix][iy] == INHABIT)
96                                                 if ((n -= 1) <= 0)
97                                                         break;
98                                 if (n <= 0)
99                                         break;
100                         }
101                         f = 1;
102                 }
103         }
104         else
105         {
106                 /* current quadrant */
107                 iy = y;
108                 qx = Ship.quadx;
109                 qy = Ship.quady;
110                 q = &Quad[qx][qy];
111                 f = 1;
112         }
113         if (f)
114         {
115                 /* supernova is in same quadrant as Enterprise */
116                 printf("\a\nRED ALERT: supernova occuring at %d,%d\n", ix, iy);
117                 dx = ix - Ship.sectx;
118                 dy = iy - Ship.secty;
119                 if (dx * dx + dy * dy <= 2)
120                 {
121                         printf("***  Emergency override attem");
122                         sleep(1);
123                         printf("\n");
124                         lose(L_SNOVA);
125                 }
126                 q->scanned = 1000;
127         }
128         else
129         {
130                 if (!damaged(SSRADIO))
131                 {
132                         q->scanned = 1000;
133                         printf("\nUhura: Captain, Starfleet Command reports a supernova\n");
134                         printf("  in quadrant %d,%d.  Caution is advised\n", qx, qy);
135                 }
136         }
137
138         /* clear out the supernova'ed quadrant */
139         dx = q->klings;
140         dy = q->stars;
141         Now.klings -= dx;
142         if (x >= 0)
143         {
144                 /* Enterprise caused supernova */
145                 Game.kills += dy;
146                 if (q->bases)
147                         killb(qx, qy, -1);
148                 Game.killk += dx;
149         }
150         else
151                 if (q->bases)
152                         killb(qx, qy, 0);
153         killd(qx, qy, (x >= 0));
154         q->stars = -1;
155         q->klings = 0;
156         if (Now.klings <= 0)
157         {
158                 printf("Lucky devil, that supernova destroyed the last klingon\n");
159                 win();
160         }
161         return;
162 }