
1: /* $NetBSD: destruct.c,v 1.7 2003/08/07 09:37:50 agc 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. Neither the name of the University nor the names of its contributors 16: * may be used to endorse or promote products derived from this software 17: * without specific prior written permission. 18: * 19: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29: * SUCH DAMAGE. 30: */ 31: 32: #include <sys/cdefs.h> 33: #ifndef lint 34: #if 0 35: static char sccsid[] = "@(#)destruct.c 8.1 (Berkeley) 5/31/93"; 36: #else 37: __RCSID("$NetBSD: destruct.c,v 1.7 2003/08/07 09:37:50 agc Exp $"); 38: #endif 39: #endif /* not lint */ 40: 41: #include <stdio.h> 42: #include <string.h> 43: #include <unistd.h> 44: #include "trek.h" 45: #include "getpar.h" 46: 47: /* 48: ** Self Destruct Sequence 49: ** 50: ** The computer starts up the self destruct sequence. Obviously, 51: ** if the computer is out nothing can happen. You get a countdown 52: ** and a request for password. This must match the password that 53: ** you entered at the start of the game. 54: ** 55: ** You get to destroy things when you blow up; hence, it is 56: ** possible to win the game by destructing if you take the last 57: ** Klingon with you. 58: ** 59: ** By the way, the \032 in the message is a ^Z, which is because 60: ** the terminal in my office is an ADM-3, which uses that char- 61: ** acter to clear the screen. I also stick in a \014 (form feed) 62: ** because that clears some other screens. 63: ** 64: ** Uses trace flag 41 65: */ 66: 67: /*ARGSUSED*/ 68: void 69: destruct(v) 70: int v __attribute__((__unused__)); 71: { 72: char checkpass[15]; 73: int i, j; 74: double zap; 75: 76: if (damaged(COMPUTER)) { 77: out(COMPUTER); 78: return; 79: } 80: printf("\n\07 --- WORKING ---\07\n"); 81: sleep(3); 82: /* output the count 10 9 8 7 6 */ 83: for (i = 10; i > 5; i--) 84: { 85: for (j = 10; j > i; j--) 86: printf(" "); 87: printf("%d\n", i); 88: sleep(1); 89: } 90: /* check for password on new line only */ 91: skiptonl(0); 92: getstrpar("Enter password verification", checkpass, 14, 0); 93: sleep(2); 94: if (strcmp(checkpass, Game.passwd) != 0) { 95: printf("Self destruct sequence aborted\n"); 96: return; 97: } 98: printf("Password verified; self destruct sequence continues:\n"); 99: sleep(2); 100: /* output count 5 4 3 2 1 0 */ 101: for (i = 5; i >= 0; i--) 102: { 103: sleep(1); 104: for (j = 5; j > i; j--) 105: printf(" "); 106: printf("%d\n", i); 107: } 108: sleep(2); 109: printf("\032\014***** %s destroyed *****\n", Ship.shipname); 110: Game.killed = 1; 111: /* let's see what we can blow up!!!! */ 112: zap = 20.0 * Ship.energy; 113: Game.deaths += Ship.crew; 114: for (i = 0; i < Etc.nkling; ) 115: { 116: if (Etc.klingon[i].power * Etc.klingon[i].dist <= zap) 117: killk(Etc.klingon[i].x, Etc.klingon[i].y); 118: else 119: i++; 120: } 121: /* if we didn't kill the last Klingon (detected by killk), */ 122: /* then we lose.... */ 123: lose(L_DSTRCT); 124: }