1 /* 2 * Copyright (c) 1983 Regents of the University of California. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms are permitted 6 * provided that the above copyright notice and this paragraph are 7 * duplicated in all such forms and that any documentation, 8 * advertising materials, and other materials related to such 9 * distribution and use acknowledge that the software was developed 10 * by the University of California, Berkeley. The name of the 11 * University may not be used to endorse or promote products derived 12 * from this software without specific prior written permission. 13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 15 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 16 */ 17 18 #ifndef lint 19 static char sccsid[] = "@(#)com4.c 5.2 (Berkeley) 06/19/88"; 20 #endif /* not lint */ 21 22 #include "externs.h" 23 24 take(from) 25 unsigned int from[]; 26 { 27 int firstnumber, heavy, bulky, value; 28 register int n; 29 30 firstnumber = wordnumber; 31 if (wordnumber < wordcount && wordvalue[wordnumber+1] == OFF){ 32 wordnumber++; 33 wordvalue[wordnumber] = TAKEOFF; 34 return(cypher()); 35 } 36 else { 37 while(wordtype[++wordnumber] == ADJS); 38 while(wordnumber<=wordcount && wordtype[wordnumber] == OBJECT){ 39 value = wordvalue[wordnumber]; 40 printf("%s:\n", objsht[value]); 41 for (n=0; objsht[value][n]; n++); 42 heavy = (carrying + objwt[value]) <= WEIGHT; 43 bulky = (encumber + objcumber[value]) <= CUMBER; 44 if ((testbit(from,value) || wiz || tempwiz) && heavy && bulky && !testbit(inven,value)){ 45 setbit(inven,value); 46 carrying += objwt[value]; 47 encumber += objcumber[value]; 48 time++; 49 if (testbit(from,value)) 50 printf("Taken.\n"); 51 else 52 printf("Zap! Taken from thin air.\n"); 53 clearbit(from,value); 54 if (value == MEDALION) 55 win--; 56 } 57 else if (testbit(inven,value)) 58 printf("You're already holding%s%s.\n", (objsht[value][n-1] == 's' ? " " : " a "),objsht[value]); 59 else if (!heavy) 60 printf("The %s %s too heavy.\n", objsht[value],(objsht[value][n-1] == 's' ? "are" : "is")); 61 else if (!bulky) 62 printf("The %s %s too cumbersome to hold.\n", objsht[value],(objsht[value][n-1] == 's' ? "are" : "is")); 63 else 64 printf("I dont see any %s around here.\n", objsht[value]); 65 if (wordnumber < wordcount -1 && wordvalue[++wordnumber] == AND) 66 wordnumber++; 67 else 68 return(firstnumber); 69 } 70 } 71 /* special cases with their own return()'s */ 72 73 if (wordnumber <= wordcount && wordtype[wordnumber] == NOUNS) 74 switch(wordvalue[wordnumber]){ 75 76 case SWORD: 77 if (testbit(from, SWORD)){ 78 wordtype[wordnumber--] = OBJECT; 79 return(take(from)); 80 } 81 if (testbit(from, TWO_HANDED)){ 82 wordvalue[wordnumber] = TWO_HANDED; 83 wordtype[wordnumber--] = OBJECT; 84 return(take(from)); 85 } 86 wordvalue[wordnumber] = BROAD; 87 wordtype[wordnumber--] = OBJECT; 88 return(take(from)); 89 90 case BODY: 91 if (testbit(from,MAID)){ 92 wordvalue[wordnumber] = MAID; 93 wordtype[wordnumber--] = OBJECT; 94 return(take(from)); 95 } 96 else if (testbit(from,DEADWOOD)){ 97 wordvalue[wordnumber] = DEADWOOD; 98 wordtype[wordnumber--] = OBJECT; 99 return(take(from)); 100 } 101 else if (testbit(from,DEADNATIVE)){ 102 wordvalue[wordnumber] = DEADNATIVE; 103 wordtype[wordnumber--] = OBJECT; 104 return(take(from)); 105 } 106 else if (testbit(from,DEADGOD)){ 107 wordvalue[wordnumber] = DEADGOD; 108 wordtype[wordnumber--] = OBJECT; 109 return(take(from)); 110 } 111 else { 112 wordvalue[wordnumber] = DEADTIME; 113 wordtype[wordnumber--] = OBJECT; 114 return(take(from)); 115 } 116 break; 117 118 case AMULET: 119 if (testbit(location[position].objects,AMULET)){ 120 puts("The amulet is warm to the touch, and its beauty catches your breath."); 121 puts("A mist falls over your eyes, but then it is gone. Sounds seem clearer"); 122 puts("and sharper but far away as if in a dream. The sound of purling water reaches"); 123 puts("you from afar. The mist falls again, and your heart leaps in horror. The gold"); 124 puts("freezes your hands and fathomless darkness engulfs your soul."); 125 } 126 wordtype[wordnumber--] = OBJECT; 127 return(take(from)); 128 129 case MEDALION: 130 if (testbit(location[position].objects, MEDALION)){ 131 puts("The medallion is warm, and it rekindles your spirit with the warmth of life."); 132 puts("Your amulet begins to glow as the medallion is brought near to it, and together\nthey radiate."); 133 } 134 wordtype[wordnumber--] = OBJECT; 135 return(take(from)); 136 137 case TALISMAN: 138 if (testbit(location[position].objects,TALISMAN)){ 139 puts("The talisman is cold to the touch, and it sends a chill down your spine."); 140 } 141 wordtype[wordnumber--] = OBJECT; 142 return(take(from)); 143 144 case NORMGOD: 145 if (testbit(location[position].objects,BATHGOD) && (testbit(wear,AMULET) || testbit(inven,AMULET))){ 146 puts("She offers a delicate hand, and you help her out of the sparkling springs."); 147 puts("Water droplets like liquid silver bedew her golden skin, but when they part"); 148 puts("from her, they fall as teardrops. She wraps a single cloth around her and"); 149 puts("ties it at the waist. Around her neck hangs a golden amulet."); 150 puts("She bids you to follow her."); 151 pleasure++; 152 followgod = time; 153 clearbit(location[position].objects,BATHGOD); 154 } else if (!testbit(location[position].objects,BATHGOD)) 155 puts("You're in no position to take her."); 156 else 157 puts("She moves away from you."); 158 break; 159 160 default: 161 puts("It doesn't seem to work."); 162 } 163 else 164 puts("You've got to be kidding."); 165 return(firstnumber); 166 } 167 168 throw(name) 169 char *name; 170 { 171 int n; 172 int deposit = 0; 173 int first, value; 174 175 first = wordnumber; 176 if (drop(name) != -1){ 177 switch(wordvalue[wordnumber]){ 178 179 case AHEAD: 180 deposit = ahead; 181 break; 182 183 case BACK: 184 deposit = back; 185 break; 186 187 case LEFT: 188 deposit = left; 189 break; 190 191 case RIGHT: 192 deposit = right; 193 break; 194 195 case UP: 196 deposit = location[position].up * (location[position].access || position == FINAL); 197 break; 198 199 case DOWN: 200 deposit = location[position].down; 201 break; 202 } 203 wordnumber = first; 204 while (wordtype[++wordnumber] == ADJS); 205 while (wordnumber <= wordcount){ 206 value = wordvalue[wordnumber]; 207 if (deposit && testbit(location[position].objects,value)){ 208 clearbit(location[position].objects,value); 209 if (value != GRENADE) 210 setbit(location[deposit].objects,value); 211 else{ 212 puts("A thundering explosion nearby sends up a cloud of smoke and shrapnel."); 213 for (n = 0; n < NUMOFWORDS; n ++) 214 location[deposit].objects[n] = 0; 215 setbit(location[deposit].objects,CHAR); 216 } 217 if (value == ROPE && position == FINAL) 218 location[position].access = 1; 219 switch(deposit){ 220 case 189: 221 case 231: 222 puts("The stone door is unhinged."); 223 location[189].north = 231; 224 location[231].south = 189; 225 break; 226 case 30: 227 puts("The wooden door is blown open."); 228 location[30].west = 25; 229 break; 230 case 31: 231 puts("The door is not damaged."); 232 } 233 } 234 else if (value == GRENADE && testbit(location[position].objects,value)){ 235 puts("You are blown into shreds when your grenade explodes."); 236 die(); 237 } 238 if (wordnumber < wordcount - 1 && wordvalue[++wordnumber] == AND) 239 wordnumber++; 240 else 241 return(first); 242 } 243 return(first); 244 } 245 return(first); 246 } 247 248 drop(name) 249 char *name; 250 { 251 252 int firstnumber, value; 253 254 firstnumber = wordnumber; 255 while (wordtype[++wordnumber] == ADJS) 256 ; 257 while (wordnumber<=wordcount && (wordtype[wordnumber] == OBJECT || wordtype[wordnumber] == NOUNS)) { 258 value = wordvalue[wordnumber]; 259 printf("%s:\n", objsht[value]); 260 if (testbit(inven,value)){ 261 clearbit(inven,value); 262 carrying -= objwt[value]; 263 encumber -= objcumber[value]; 264 if (value == BOMB){ 265 puts("The bomb explodes. A blinding white light and immense concussion obliterate us."); 266 die(); 267 } 268 if (value != AMULET && value != MEDALION && value != TALISMAN) 269 setbit(location[position].objects,value); 270 else 271 tempwiz = 0; 272 time++; 273 if (*name == 'K') 274 puts("Drop kicked."); 275 else 276 printf("%s.\n", name); 277 } 278 else { 279 if (*name != 'K') { 280 printf("You aren't holding the %s.\n", objsht[value]); 281 if (testbit(location[position].objects,value)) { 282 if (*name == 'T') 283 puts("Kicked instead."); 284 else if (*name == 'G') 285 puts("Given anyway."); 286 } 287 } else 288 puts("Kicked."); 289 } 290 if (wordnumber < wordcount - 1 && wordvalue[++wordnumber] == AND) 291 wordnumber++; 292 else 293 return(firstnumber); 294 } 295 puts("Do what?"); 296 return(-1); 297 } 298 299 takeoff() 300 { 301 wordnumber = take(wear); 302 return(drop("Dropped")); 303 } 304 305 puton() 306 { 307 wordnumber = take(location[position].objects); 308 return(wearit()); 309 } 310 311 eat() 312 { 313 register int n; 314 int firstnumber, value; 315 316 firstnumber = wordnumber; 317 while(wordtype[++wordnumber] == ADJS); 318 while(wordnumber <= wordcount){ 319 value = wordvalue[wordnumber]; 320 for (n=0; objsht[value][n]; n++); 321 switch(value){ 322 323 case -1: 324 puts("Eat what?"); 325 return(firstnumber); 326 327 default: 328 printf("You can't eat%s%s!\n",(objsht[value][n-1] == 's' ? " " : " a "),objsht[value]); 329 return(firstnumber); 330 331 case PAPAYAS: 332 case PINEAPPLE: 333 case KIWI: 334 case COCONUTS: /* eatable things */ 335 case MANGO: 336 337 printf("%s:\n",objsht[value]); 338 if (testbit(inven,value) && time > ate - CYCLE && testbit(inven,KNIFE)){ 339 clearbit(inven,value); 340 carrying -= objwt[value]; 341 encumber -= objcumber[value]; 342 ate = max(time,ate) + CYCLE/3; 343 snooze += CYCLE/10; 344 time++; 345 puts("Eaten. You can explore a little longer now."); 346 } 347 else if (time < ate - CYCLE) 348 puts("You're stuffed."); 349 else if (!testbit(inven,KNIFE)) 350 puts("You need a knife."); 351 else 352 printf("You aren't holding the %s.\n", objsht[value]); 353 if (wordnumber < wordcount - 1 && wordvalue[++wordnumber] == AND) 354 wordnumber++; 355 else 356 return(firstnumber); 357 } /* end switch */ 358 } /* end while */ 359 return(firstnumber); 360 } 361