xref: /openbsd-src/games/trek/snova.c (revision 11da2480c68e9717c510fd663096c44c53785231)
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