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 * @(#)snova.c 8.1 (Berkeley) 5/31/93 34 * $FreeBSD: src/games/trek/snova.c,v 1.4 1999/11/30 03:49:54 billf Exp $ 35 * $DragonFly: src/games/trek/snova.c,v 1.2 2003/06/17 04:25:25 dillon Exp $ 36 */ 37 38 # include "trek.h" 39 40 /* 41 ** CAUSE SUPERNOVA TO OCCUR 42 ** 43 ** A supernova occurs. If 'ix' < 0, a random quadrant is chosen; 44 ** otherwise, the current quadrant is taken, and (ix, iy) give 45 ** the sector quadrants of the star which is blowing up. 46 ** 47 ** If the supernova turns out to be in the quadrant you are in, 48 ** you go into "emergency override mode", which tries to get you 49 ** out of the quadrant as fast as possible. However, if you 50 ** don't have enough fuel, or if you by chance run into something, 51 ** or some such thing, you blow up anyway. Oh yeh, if you are 52 ** within two sectors of the star, there is nothing that can 53 ** be done for you. 54 ** 55 ** When a star has gone supernova, the quadrant becomes uninhab- 56 ** itable for the rest of eternity, i.e., the game. If you ever 57 ** try stopping in such a quadrant, you will go into emergency 58 ** override mode. 59 */ 60 61 snova(x, y) 62 int x, y; 63 { 64 int qx, qy; 65 int ix, iy; 66 int f; 67 int dx, dy; 68 int n; 69 struct quad *q; 70 71 f = 0; 72 ix = x; 73 if (ix < 0) 74 { 75 /* choose a quadrant */ 76 while (1) 77 { 78 qx = ranf(NQUADS); 79 qy = ranf(NQUADS); 80 q = &Quad[qx][qy]; 81 if (q->stars > 0) 82 break; 83 } 84 if (Ship.quadx == qx && Ship.quady == qy) 85 { 86 /* select a particular star */ 87 n = ranf(q->stars); 88 for (ix = 0; ix < NSECTS; ix++) 89 { 90 for (iy = 0; iy < NSECTS; iy++) 91 if (Sect[ix][iy] == STAR || Sect[ix][iy] == INHABIT) 92 if ((n -= 1) <= 0) 93 break; 94 if (n <= 0) 95 break; 96 } 97 f = 1; 98 } 99 } 100 else 101 { 102 /* current quadrant */ 103 iy = y; 104 qx = Ship.quadx; 105 qy = Ship.quady; 106 q = &Quad[qx][qy]; 107 f = 1; 108 } 109 if (f) 110 { 111 /* supernova is in same quadrant as Enterprise */ 112 printf("\nRED ALERT: supernova occuring at %d,%d\n", ix, iy); 113 dx = ix - Ship.sectx; 114 dy = iy - Ship.secty; 115 if (dx * dx + dy * dy <= 2) 116 { 117 printf("*** Emergency override attem"); 118 sleep(1); 119 printf("\n"); 120 lose(L_SNOVA); 121 } 122 q->scanned = 1000; 123 } 124 else 125 { 126 if (!damaged(SSRADIO)) 127 { 128 q->scanned = 1000; 129 printf("\nUhura: Captain, Starfleet Command reports a supernova\n"); 130 printf(" in quadrant %d,%d. Caution is advised\n", qx, qy); 131 } 132 } 133 134 /* clear out the supernova'ed quadrant */ 135 dx = q->klings; 136 dy = q->stars; 137 Now.klings -= dx; 138 if (x >= 0) 139 { 140 /* Enterprise caused supernova */ 141 Game.kills += dy; 142 if (q->bases) 143 killb(qx, qy, -1); 144 Game.killk += dx; 145 } 146 else 147 if (q->bases) 148 killb(qx, qy, 0); 149 killd(qx, qy, (x >= 0)); 150 q->stars = -1; 151 q->klings = 0; 152 if (Now.klings <= 0) 153 { 154 printf("Lucky devil, that supernova destroyed the last klingon\n"); 155 win(); 156 } 157 return; 158 } 159