From 77e3814f0c0e3dea4d0032e25666f77e6f83bfff Mon Sep 17 00:00:00 2001 From: cgd Date: Sun, 21 Mar 1993 09:45:37 +0000 Subject: initial import of 386bsd-0.1 sources --- trek/snova.c | 158 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 trek/snova.c (limited to 'trek/snova.c') diff --git a/trek/snova.c b/trek/snova.c new file mode 100644 index 00000000..94426153 --- /dev/null +++ b/trek/snova.c @@ -0,0 +1,158 @@ +/* + * Copyright (c) 1980 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)snova.c 5.4 (Berkeley) 6/1/90"; +#endif /* not lint */ + +# include "trek.h" + +/* +** CAUSE SUPERNOVA TO OCCUR +** +** A supernova occurs. If 'ix' < 0, a random quadrant is chosen; +** otherwise, the current quadrant is taken, and (ix, iy) give +** the sector quadrants of the star which is blowing up. +** +** If the supernova turns out to be in the quadrant you are in, +** you go into "emergency override mode", which tries to get you +** out of the quadrant as fast as possible. However, if you +** don't have enough fuel, or if you by chance run into something, +** or some such thing, you blow up anyway. Oh yeh, if you are +** within two sectors of the star, there is nothing that can +** be done for you. +** +** When a star has gone supernova, the quadrant becomes uninhab- +** itable for the rest of eternity, i.e., the game. If you ever +** try stopping in such a quadrant, you will go into emergency +** override mode. +*/ + +snova(x, y) +int x, y; +{ + int qx, qy; + register int ix, iy; + int f; + int dx, dy; + int n; + register struct quad *q; + + f = 0; + ix = x; + if (ix < 0) + { + /* choose a quadrant */ + while (1) + { + qx = ranf(NQUADS); + qy = ranf(NQUADS); + q = &Quad[qx][qy]; + if (q->stars > 0) + break; + } + if (Ship.quadx == qx && Ship.quady == qy) + { + /* select a particular star */ + n = ranf(q->stars); + for (ix = 0; ix < NSECTS; ix++) + { + for (iy = 0; iy < NSECTS; iy++) + if (Sect[ix][iy] == STAR || Sect[ix][iy] == INHABIT) + if ((n -= 1) <= 0) + break; + if (n <= 0) + break; + } + f = 1; + } + } + else + { + /* current quadrant */ + iy = y; + qx = Ship.quadx; + qy = Ship.quady; + q = &Quad[qx][qy]; + f = 1; + } + if (f) + { + /* supernova is in same quadrant as Enterprise */ + printf("\nRED ALERT: supernova occuring at %d,%d\n", ix, iy); + dx = ix - Ship.sectx; + dy = iy - Ship.secty; + if (dx * dx + dy * dy <= 2) + { + printf("*** Emergency override attem"); + sleep(1); + printf("\n"); + lose(L_SNOVA); + } + q->scanned = 1000; + } + else + { + if (!damaged(SSRADIO)) + { + q->scanned = 1000; + printf("\nUhura: Captain, Starfleet Command reports a supernova\n"); + printf(" in quadrant %d,%d. Caution is advised\n", qx, qy); + } + } + + /* clear out the supernova'ed quadrant */ + dx = q->klings; + dy = q->stars; + Now.klings -= dx; + if (x >= 0) + { + /* Enterprise caused supernova */ + Game.kills += dy; + if (q->bases) + killb(qx, qy, -1); + Game.killk += dx; + } + else + if (q->bases) + killb(qx, qy, 0); + killd(qx, qy, (x >= 0)); + q->stars = -1; + q->klings = 0; + if (Now.klings <= 0) + { + printf("Lucky devil, that supernova destroyed the last klingon\n"); + win(); + } + return; +} -- cgit v1.2.3-56-ge451