1 /* @(#)com6.c 8.2 (Berkeley) 4/28/95 */ 2 /* $NetBSD: command6.c,v 1.8 2010/04/24 00:38:30 dholland Exp $ */ 3 4 /* 5 * Copyright (c) 1983, 1993 6 * The Regents of the University of California. All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 3. Neither the name of the University nor the names of its contributors 17 * may be used to endorse or promote products derived from this software 18 * without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30 * SUCH DAMAGE. 31 */ 32 33 #include "extern.h" 34 #include "pathnames.h" 35 36 static void post(int); 37 38 int 39 launch(void) 40 { 41 if (testbit(location[position].objects, VIPER) && !notes[CANTLAUNCH]) { 42 if (fuel > 4) { 43 clearbit(location[position].objects, VIPER); 44 position = location[position].up; 45 notes[LAUNCHED] = 1; 46 ourtime++; 47 fuel -= 4; 48 printf("You climb into the viper and prepare for "); 49 puts("launch."); 50 printf("With a touch of your thumb the turbo engines "); 51 printf("ignite, thrusting you back into\nyour seat.\n"); 52 return (1); 53 } else 54 puts("Not enough fuel to launch."); 55 } else 56 puts("Can't launch."); 57 return (0); 58 } 59 60 int 61 land(void) 62 { 63 if (notes[LAUNCHED] && testbit(location[position].objects, LAND) && 64 location[position].down) { 65 notes[LAUNCHED] = 0; 66 position = location[position].down; 67 setbit(location[position].objects, VIPER); 68 fuel -= 2; 69 ourtime++; 70 puts("You are down."); 71 return (1); 72 } else 73 puts("You can't land here."); 74 return (0); 75 } 76 77 void 78 die(void) 79 { /* endgame */ 80 printf("bye.\nYour rating was %s.\n", rate()); 81 post(' '); 82 exit(0); 83 } 84 85 void 86 diesig(int dummy __unused) 87 { 88 die(); 89 } 90 91 void 92 live(void) 93 { 94 puts("\nYou win!"); 95 post('!'); 96 exit(0); 97 } 98 99 static FILE *score_fp; 100 101 void 102 open_score_file(void) 103 { 104 score_fp = fopen(_PATH_SCORE, "a"); 105 if (score_fp == NULL) 106 warn("open %s for append", _PATH_SCORE); 107 if (score_fp != NULL && fileno(score_fp) < 3) 108 exit(1); 109 } 110 111 static void 112 post(int ch) 113 { 114 time_t tv; 115 sigset_t isigset, osigset; 116 117 sigemptyset(&isigset); 118 sigaddset(&isigset, SIGINT); 119 sigprocmask(SIG_BLOCK, &isigset, &osigset); 120 tv = time(NULL); 121 if (score_fp != NULL) { 122 fprintf(score_fp, "%24.24s %8s %c%20s", ctime(&tv), username, 123 ch, rate()); 124 if (wiz) 125 fprintf(score_fp, " wizard\n"); 126 else 127 if (tempwiz) 128 fprintf(score_fp, " WIZARD!\n"); 129 else 130 fprintf(score_fp, "\n"); 131 } 132 fflush(score_fp); 133 sigprocmask(SIG_SETMASK, &osigset, (sigset_t *) 0); 134 } 135 136 const char * 137 rate(void) 138 { 139 int score; 140 141 score = max(max(pleasure, power), ego); 142 if (score == pleasure) { 143 if (score < 5) 144 return ("novice"); 145 else if (score < 20) 146 return ("junior voyeur"); 147 else if (score < 35) 148 return ("Don Juan"); 149 else 150 return ("Marquis De Sade"); 151 } else if (score == power) { 152 if (score < 5) 153 return ("serf"); 154 else if (score < 8) 155 return ("Samurai"); 156 else if (score < 13) 157 return ("Klingon"); 158 else if (score < 22) 159 return ("Darth Vader"); 160 else 161 return ("Sauron the Great"); 162 } else { 163 if (score < 5) 164 return ("Polyanna"); 165 else if (score < 10) 166 return ("philanthropist"); 167 else if (score < 20) 168 return ("Tattoo"); 169 else 170 return ("Mr. Roarke"); 171 } 172 } 173 174 int 175 drive(void) 176 { 177 if (testbit(location[position].objects, CAR)) { 178 printf("You hop in the car and turn the key. There is "); 179 puts("a perceptible grating noise,"); 180 puts("and an explosion knocks you unconscious..."); 181 clearbit(location[position].objects, CAR); 182 setbit(location[position].objects, CRASH); 183 injuries[5] = injuries[6] = injuries[7] = injuries[8] = 1; 184 ourtime += 15; 185 zzz(); 186 return (0); 187 } else 188 puts("There is nothing to drive here."); 189 return (-1); 190 } 191 192 int 193 ride(void) 194 { 195 if (testbit(location[position].objects, HORSE)) { 196 printf("You climb onto the stallion and kick it in the guts."); 197 puts(" The stupid steed launches"); 198 printf("forward through bush and fern. You are thrown and "); 199 puts("the horse gallops off."); 200 clearbit(location[position].objects, HORSE); 201 while (!(position = rnd(NUMOFROOMS + 1)) || !OUTSIDE || 202 !beenthere[position] || location[position].flyhere) 203 continue; 204 setbit(location[position].objects, HORSE); 205 if (location[position].north) 206 position = location[position].north; 207 else if (location[position].south) 208 position = location[position].south; 209 else if (location[position].east) 210 position = location[position].east; 211 else 212 position = location[position].west; 213 return (0); 214 } else 215 puts("There is no horse here."); 216 return (-1); 217 } 218 219 void 220 light(void) 221 { /* synonyms = {strike, smoke} *//* for 222 * matches, cigars */ 223 if (testbit(inven, MATCHES) && matchcount) { 224 puts("Your match splutters to life."); 225 ourtime++; 226 matchlight = 1; 227 matchcount--; 228 if (position == 217) { 229 printf("The whole bungalow explodes with an "); 230 puts("intense blast."); 231 die(); 232 } 233 } else 234 puts("You're out of matches."); 235 } 236 237 void 238 dooropen(void) 239 { /* synonyms = {open, unlock} */ 240 wordnumber++; 241 if (wordnumber <= wordcount && wordtype[wordnumber] == NOUNS 242 && wordvalue[wordnumber] == DOOR) { 243 switch(position) { 244 case 189: 245 case 231: 246 if (location[189].north == 231) 247 puts("The door is already open."); 248 else 249 puts("The door does not budge."); 250 break; 251 case 30: 252 if (location[30].west == 25) 253 puts("The door is gone."); 254 else 255 puts("The door is locked tight."); 256 break; 257 case 31: 258 puts("That's one immovable door."); 259 break; 260 case 20: 261 puts("The door is already ajar."); 262 break; 263 default: 264 puts("What door?"); 265 } 266 } else 267 puts("That doesn't open."); 268 } 269