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