1 /*- 2 * Copyright (c) 1983, 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 * @(#)com6.c 8.1 (Berkeley) 5/31/93 30 * $FreeBSD: src/games/battlestar/com6.c,v 1.9.2.1 2001/03/05 11:45:35 kris Exp $ 31 * $DragonFly: src/games/battlestar/com6.c,v 1.4 2006/08/08 16:47:20 pavalos Exp $ 32 */ 33 34 #include <signal.h> 35 #include <sys/time.h> 36 #include "externs.h" 37 #include "pathnames.h" 38 39 static FILE *score_fp; 40 static void post(unsigned int ch); 41 42 int 43 launch(void) 44 { 45 if (testbit(location[position].objects, VIPER) && !notes[CANTLAUNCH]) { 46 if (fuel > 4) { 47 clearbit(location[position].objects, VIPER); 48 position = location[position].up; 49 notes[LAUNCHED] = 1; 50 gtime++; 51 fuel -= 4; 52 puts("You climb into the viper and prepare for launch."); 53 puts("With a touch of your thumb the turbo engines ignite, thrusting you back into\nyour seat."); 54 return (1); 55 } else 56 puts("Not enough fuel to launch."); 57 } else 58 puts("Can't launch."); 59 return (0); 60 } 61 62 int 63 land(void) 64 { 65 if (notes[LAUNCHED] && testbit(location[position].objects, LAND) && 66 location[position].down) { 67 notes[LAUNCHED] = 0; 68 position = location[position].down; 69 setbit(location[position].objects, VIPER); 70 fuel -= 2; 71 gtime++; 72 puts("You are down."); 73 return (1); 74 } else 75 puts("You can't land here."); 76 return (0); 77 } 78 79 void 80 die(int sig __unused) /* endgame */ 81 { 82 printf("bye.\nYour rating was %s.\n", rate()); 83 post(' '); 84 exit(0); 85 } 86 87 void 88 live(void) 89 { 90 puts("\nYou win!"); 91 post('!'); 92 exit(0); 93 } 94 95 void 96 open_score_file(void) 97 { 98 if ((score_fp = fopen(_PATH_SCORE, "a")) == NULL) 99 perror(_PATH_SCORE); 100 } 101 102 static void 103 post(unsigned int ch) 104 { 105 struct timeval tv; 106 char *date; 107 time_t tvsec; 108 int s; 109 110 if (score_fp == NULL) 111 return; 112 113 s = sigblock(sigmask(SIGINT)); 114 115 gettimeofday(&tv, NULL); /* can't call time */ 116 tvsec = (time_t)tv.tv_sec; 117 date = ctime(&tvsec); 118 date[24] = '\0'; 119 120 fprintf(score_fp, "%s %8s %c%20s", date, uname, ch, rate()); 121 if (wiz) 122 fprintf(score_fp, " wizard\n"); 123 else if (tempwiz) 124 fprintf(score_fp, " WIZARD!\n"); 125 else 126 fprintf(score_fp, "\n"); 127 128 sigsetmask(s); 129 } 130 131 const char * 132 rate(void) 133 { 134 int score; 135 136 score = max(max(pleasure, power), ego); 137 if (score == pleasure) { 138 if (score < 5) 139 return ("novice"); 140 else if (score < 20) 141 return ("junior voyeur"); 142 else if (score < 35) 143 return ("Don Juan"); 144 else 145 return ("Marquis De Sade"); 146 } else if (score == power) { 147 if (score < 5) 148 return ("serf"); 149 else if (score < 8) 150 return ("Samurai"); 151 else if (score < 13) 152 return ("Klingon"); 153 else if (score < 22) 154 return ("Darth Vader"); 155 else 156 return ("Sauron the Great"); 157 } else { 158 if (score < 5) 159 return ("Polyanna"); 160 else if (score < 10) 161 return ("philanthropist"); 162 else if (score < 20) 163 return ("Tattoo"); 164 else 165 return ("Mr. Roarke"); 166 } 167 } 168 169 int 170 drive(void) 171 { 172 if (testbit(location[position].objects, CAR)) { 173 puts("You hop in the car and turn the key. There is a perceptible grating noise,"); 174 puts("and an explosion knocks you unconscious..."); 175 clearbit(location[position].objects, CAR); 176 setbit(location[position].objects, CRASH); 177 injuries[5] = injuries[6] = injuries[7] = injuries[8] = 1; 178 gtime += 15; 179 zzz(); 180 return (0); 181 } else 182 puts("There is nothing to drive here."); 183 return (-1); 184 } 185 186 int 187 ride(void) 188 { 189 if (testbit(location[position].objects, HORSE)) { 190 puts("You climb onto the stallion and kick it in the guts. The stupid steed launches"); 191 puts("forward through bush and fern. You are thrown and the horse gallups off."); 192 clearbit(location[position].objects, HORSE); 193 while (!(position = rnd(NUMOFROOMS + 1)) || !OUTSIDE || 194 !beenthere[position] || location[position].flyhere) 195 ; /* nothing */ 196 setbit(location[position].objects, HORSE); 197 if (location[position].north) 198 position = location[position].north; 199 else if (location[position].south) 200 position = location[position].south; 201 else if (location[position].east) 202 position = location[position].east; 203 else 204 position = location[position].west; 205 return (0); 206 } else 207 puts("There is no horse here."); 208 return (-1); 209 } 210 211 void 212 light(void) /* synonyms = {strike, smoke} */ 213 { /* for matches, cigars */ 214 if (testbit(inven, MATCHES) && matchcount) { 215 puts("Your match splutters to life."); 216 gtime++; 217 matchlight = 1; 218 matchcount--; 219 if (position == 217) { 220 puts("The whole bungalow explodes with an intense blast."); 221 die(0); 222 } 223 } else 224 puts("You're out of matches."); 225 } 226