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