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. Neither the name of the University nor the names of its contributors 14 * may be used to endorse or promote products derived from this software 15 * without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 * 29 * @(#)snova.c 8.1 (Berkeley) 5/31/93 30 * $FreeBSD: src/games/trek/snova.c,v 1.4 1999/11/30 03:49:54 billf Exp $ 31 * $DragonFly: src/games/trek/snova.c,v 1.4 2007/05/13 22:25:41 swildner Exp $ 32 */ 33 34 #include "trek.h" 35 36 /* 37 ** CAUSE SUPERNOVA TO OCCUR 38 ** 39 ** A supernova occurs. If 'ix' < 0, a random quadrant is chosen; 40 ** otherwise, the current quadrant is taken, and (ix, iy) give 41 ** the sector quadrants of the star which is blowing up. 42 ** 43 ** If the supernova turns out to be in the quadrant you are in, 44 ** you go into "emergency override mode", which tries to get you 45 ** out of the quadrant as fast as possible. However, if you 46 ** don't have enough fuel, or if you by chance run into something, 47 ** or some such thing, you blow up anyway. Oh yeh, if you are 48 ** within two sectors of the star, there is nothing that can 49 ** be done for you. 50 ** 51 ** When a star has gone supernova, the quadrant becomes uninhab- 52 ** itable for the rest of eternity, i.e., the game. If you ever 53 ** try stopping in such a quadrant, you will go into emergency 54 ** override mode. 55 */ 56 57 void 58 snova(int x, int y) 59 { 60 int qx, qy; 61 int ix, iy = 0; 62 int f; 63 int dx, dy; 64 int n; 65 struct quad *q; 66 67 f = 0; 68 ix = x; 69 if (ix < 0) { 70 /* choose a quadrant */ 71 while (1) { 72 qx = ranf(NQUADS); 73 qy = ranf(NQUADS); 74 q = &Quad[qx][qy]; 75 if (q->stars > 0) 76 break; 77 } 78 if (Ship.quadx == qx && Ship.quady == qy) { 79 /* select a particular star */ 80 n = ranf(q->stars); 81 for (ix = 0; ix < NSECTS; ix++) { 82 for (iy = 0; iy < NSECTS; iy++) 83 if (Sect[ix][iy] == STAR || 84 Sect[ix][iy] == INHABIT) 85 if ((n -= 1) <= 0) 86 break; 87 if (n <= 0) 88 break; 89 } 90 f = 1; 91 } 92 } else { 93 /* current quadrant */ 94 iy = y; 95 qx = Ship.quadx; 96 qy = Ship.quady; 97 q = &Quad[qx][qy]; 98 f = 1; 99 } 100 if (f) { 101 /* supernova is in same quadrant as Enterprise */ 102 printf("\a\nRED ALERT: supernova occurring at %d,%d\n", ix, iy); 103 dx = ix - Ship.sectx; 104 dy = iy - Ship.secty; 105 if (dx * dx + dy * dy <= 2) { 106 printf("*** Emergency override attem"); 107 sleep(1); 108 printf("\n"); 109 lose(L_SNOVA); 110 } 111 q->scanned = 1000; 112 } else { 113 if (!damaged(SSRADIO)) { 114 q->scanned = 1000; 115 printf("\nUhura: Captain, Starfleet Command reports a supernova\n"); 116 printf(" in quadrant %d,%d. Caution is advised\n", qx, qy); 117 } 118 } 119 120 /* clear out the supernova'ed quadrant */ 121 dx = q->klings; 122 dy = q->stars; 123 Now.klings -= dx; 124 if (x >= 0) { 125 /* Enterprise caused supernova */ 126 Game.kills += dy; 127 if (q->bases) 128 killb(qx, qy); 129 Game.killk += dx; 130 } else { 131 if (q->bases) 132 killb(qx, qy); 133 } 134 killd(qx, qy, (x >= 0)); 135 q->stars = -1; 136 q->klings = 0; 137 if (Now.klings <= 0) { 138 printf("Lucky devil, that supernova destroyed the last klingon\n"); 139 win(); 140 } 141 return; 142 } 143