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