1 /* @(#)com3.c 8.2 (Berkeley) 4/28/95 */ 2 /* $NetBSD: command3.c,v 1.5 2019/02/03 03:19:25 mrg 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 35 void 36 dig(void) 37 { 38 if (testbit(inven, SHOVEL)) { 39 puts("OK"); 40 ourtime++; 41 switch (position) { 42 case 144: /* copse near beach */ 43 if (!notes[DUG]) { 44 setbit(location[position].objects, DEADWOOD); 45 setbit(location[position].objects, COMPASS); 46 setbit(location[position].objects, KNIFE); 47 setbit(location[position].objects, MACE); 48 notes[DUG] = 1; 49 } 50 break; 51 52 default: 53 puts("Nothing happens."); 54 } 55 } else 56 puts("You don't have a shovel."); 57 } 58 59 int 60 jump(void) 61 { 62 int n; 63 64 switch (position) { 65 default: 66 puts("Nothing happens."); 67 return (-1); 68 69 case 242: 70 position = 133; 71 break; 72 case 214: 73 case 215: 74 case 162: 75 case 159: 76 position = 145; 77 break; 78 case 232: 79 position = FINAL; 80 break; 81 case 3: 82 position = 1; 83 break; 84 case 172: 85 position = 201; 86 } 87 puts("Ahhhhhhh..."); 88 injuries[12] = injuries[8] = injuries[7] = injuries[6] = 1; 89 for (n = 0; n < NUMOFOBJECTS; n++) 90 if (testbit(inven, n)) { 91 clearbit(inven, n); 92 setbit(location[position].objects, n); 93 } 94 carrying = 0; 95 encumber = 0; 96 return (0); 97 } 98 99 void 100 bury(void) 101 { 102 int value; 103 104 if (testbit(inven, SHOVEL)) { 105 while (wordtype[++wordnumber] != OBJECT && 106 wordtype[wordnumber] != NOUNS && wordnumber < wordcount) 107 continue; 108 value = wordvalue[wordnumber]; 109 if (wordtype[wordnumber] == NOUNS && 110 (testbit(location[position].objects, value) || 111 value == BODY)) 112 switch (value) { 113 case BODY: 114 wordtype[wordnumber] = OBJECT; 115 if (testbit(inven, MAID) || 116 testbit(location[position].objects, MAID)) 117 value = MAID; 118 if (testbit(inven, DEADWOOD) || 119 testbit(location[position].objects, 120 DEADWOOD)) 121 value = DEADWOOD; 122 if (testbit(inven, DEADGOD) || 123 testbit(location[position].objects, 124 DEADGOD)) 125 value = DEADGOD; 126 if (testbit(inven, DEADTIME) || 127 testbit(location[position].objects, 128 DEADTIME)) 129 value = DEADTIME; 130 if (testbit(inven, DEADNATIVE) || 131 testbit(location[position].objects, 132 DEADNATIVE)) 133 value = DEADNATIVE; 134 break; 135 136 case NATIVE: 137 case NORMGOD: 138 printf("She screams as you wrestle her into "); 139 puts("the hole."); 140 /* FALLTHROUGH */ 141 case TIMER: 142 power += 7; 143 ego -= 10; 144 /* FALLTHROUGH */ 145 case AMULET: 146 case MEDALION: 147 case TALISMAN: 148 wordtype[wordnumber] = OBJECT; 149 break; 150 151 default: 152 puts("Wha..?"); 153 } 154 if (wordtype[wordnumber] == OBJECT && position > 88 && 155 (testbit(inven, value) || 156 testbit(location[position].objects, value))) { 157 puts("Buried."); 158 if (testbit(inven, value)) { 159 clearbit(inven, value); 160 carrying -= objwt[value]; 161 encumber -= objcumber[value]; 162 } 163 clearbit(location[position].objects, value); 164 switch (value) { 165 case MAID: 166 case DEADWOOD: 167 case DEADNATIVE: 168 case DEADTIME: 169 case DEADGOD: 170 ego += 2; 171 printf("The %s should rest easier now.\n", 172 objsht[value]); 173 } 174 } else 175 puts("It doesn't seem to work."); 176 } else 177 puts("You aren't holding a shovel."); 178 } 179 180 void 181 drink(void) 182 { 183 int n; 184 185 if (testbit(inven, POTION)) { 186 printf("The cool liquid runs down your throat but turns to "); 187 puts("fire and you choke."); 188 printf("The heat reaches your limbs and tingles your spirit."); 189 puts(" You feel like falling"); 190 puts("asleep."); 191 clearbit(inven, POTION); 192 WEIGHT = MAXWEIGHT; 193 CUMBER = MAXCUMBER; 194 for (n = 0; n < NUMOFINJURIES; n++) 195 injuries[n] = 0; 196 ourtime++; 197 zzz(); 198 } else 199 puts("I'm not thirsty."); 200 } 201 202 int 203 shoot(void) 204 { 205 int firstnumber, value; 206 207 firstnumber = wordnumber; 208 if (!testbit(inven, LASER)) 209 puts("You aren't holding a blaster."); 210 else { 211 wordnumber++; 212 while (wordnumber <= wordcount && 213 wordtype[wordnumber] == OBJECT) { 214 value = wordvalue[wordnumber]; 215 printf("%s:\n", objsht[value]); 216 if (testbit(location[position].objects, value)) { 217 clearbit(location[position].objects, value); 218 ourtime++; 219 printf("The %s explode%s\n", objsht[value], 220 (is_plural_object(value) ? "." : "s.")); 221 if (value == BOMB) 222 die(); 223 } else 224 printf("I don't see any %s around here.\n", 225 objsht[value]); 226 if (wordnumber < wordcount - 1 && 227 wordvalue[++wordnumber] == AND) 228 wordnumber++; 229 else 230 return (firstnumber); 231 } 232 /* special cases with their own return()'s */ 233 234 if (wordnumber <= wordcount && wordtype[wordnumber] == NOUNS) { 235 ourtime++; 236 switch (wordvalue[wordnumber]) { 237 238 case DOOR: 239 switch (position) { 240 case 189: 241 case 231: 242 puts("The door is unhinged."); 243 location[189].north = 231; 244 location[231].south = 189; 245 whichway(location[position]); 246 break; 247 case 30: 248 puts("The wooden door splinters."); 249 location[30].west = 25; 250 whichway(location[position]); 251 break; 252 case 31: 253 printf("The laser blast has no "); 254 puts("effect on the door."); 255 break; 256 case 20: 257 printf("The blast hits the door and "); 258 printf("it explodes into flame. The "); 259 puts("magnesium burns"); 260 printf("so rapidly that we have no "); 261 puts("chance to escape."); 262 die(); 263 default: 264 puts("Nothing happens."); 265 } 266 break; 267 268 case NORMGOD: 269 if (testbit(location[position].objects, 270 BATHGOD)) { 271 printf("The goddess is hit in the "); 272 printf("chest and splashes back "); 273 puts("against the rocks."); 274 printf("Dark blood oozes from the "); 275 printf("charred blast hole. Her "); 276 puts("naked body floats in the"); 277 puts("pools and then off downstream."); 278 clearbit(location[position].objects, 279 BATHGOD); 280 setbit(location[180].objects, DEADGOD); 281 power += 5; 282 ego -= 10; 283 notes[JINXED]++; 284 } else 285 if (testbit(location[position].objects, 286 NORMGOD)) { 287 printf("The blast catches "); 288 printf("the goddess in the "); 289 printf("stomach, knocking "); 290 puts("her to the ground."); 291 printf("She writhes in the "); 292 printf("dirt as the agony of "); 293 puts("death taunts her."); 294 puts("She has stopped moving."); 295 clearbit(location[position].objects, NORMGOD); 296 setbit(location[position].objects, DEADGOD); 297 power += 5; 298 ego -= 10; 299 notes[JINXED]++; 300 if (wintime) 301 live(); 302 break; 303 } else { 304 printf("I don't see any "); 305 puts("goddess around here."); 306 } 307 break; 308 309 case TIMER: 310 if (testbit(location[position].objects, 311 TIMER)) { 312 printf("The old man slumps over "); 313 puts("the bar."); 314 power++; 315 ego -= 2; 316 notes[JINXED]++; 317 clearbit(location[position].objects, 318 TIMER); 319 setbit(location[position].objects, 320 DEADTIME); 321 } else 322 puts("What old-timer?"); 323 break; 324 case MAN: 325 if (testbit(location[position].objects, MAN)) { 326 printf("The man falls to the ground "); 327 printf("with blood pouring all over "); 328 puts("his white suit."); 329 puts("Your fantasy is over."); 330 die(); 331 } else 332 puts("What man?"); 333 break; 334 case NATIVE: 335 if (testbit(location[position].objects, 336 NATIVE)) { 337 printf("The girl is blown backwards "); 338 printf("several feet and lies in a "); 339 puts("pool of blood."); 340 clearbit(location[position].objects, 341 NATIVE); 342 setbit(location[position].objects, 343 DEADNATIVE); 344 power += 5; 345 ego -= 2; 346 notes[JINXED]++; 347 } else 348 puts("There is no girl here."); 349 break; 350 case -1: 351 puts("Shoot what?"); 352 break; 353 354 default: 355 printf("You can't shoot the %s.\n", 356 objsht[wordvalue[wordnumber]]); 357 } 358 } else 359 puts("You must be a looney."); 360 } 361 return (firstnumber); 362 } 363