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