1109e8aa7Sedward /* 2*3f0b606cSbostic * Copyright (c) 1983, 1993 3*3f0b606cSbostic * The Regents of the University of California. All rights reserved. 41f2fb9e6Sbostic * 526fc2bc9Sbostic * %sccs.include.redist.c% 6109e8aa7Sedward */ 7109e8aa7Sedward 8849ca828Sedward #ifndef lint 9*3f0b606cSbostic static char sccsid[] = "@(#)com4.c 8.1 (Berkeley) 05/31/93"; 101f2fb9e6Sbostic #endif /* not lint */ 11849ca828Sedward 12849ca828Sedward #include "externs.h" 13849ca828Sedward 14849ca828Sedward take(from) 15849ca828Sedward unsigned int from[]; 16849ca828Sedward { 17849ca828Sedward int firstnumber, heavy, bulky, value; 18849ca828Sedward register int n; 19849ca828Sedward 20849ca828Sedward firstnumber = wordnumber; 21849ca828Sedward if (wordnumber < wordcount && wordvalue[wordnumber+1] == OFF){ 22849ca828Sedward wordnumber++; 23849ca828Sedward wordvalue[wordnumber] = TAKEOFF; 24849ca828Sedward return(cypher()); 25849ca828Sedward } 26849ca828Sedward else { 27849ca828Sedward while(wordtype[++wordnumber] == ADJS); 28849ca828Sedward while(wordnumber<=wordcount && wordtype[wordnumber] == OBJECT){ 29849ca828Sedward value = wordvalue[wordnumber]; 30849ca828Sedward printf("%s:\n", objsht[value]); 31849ca828Sedward for (n=0; objsht[value][n]; n++); 32849ca828Sedward heavy = (carrying + objwt[value]) <= WEIGHT; 33849ca828Sedward bulky = (encumber + objcumber[value]) <= CUMBER; 34849ca828Sedward if ((testbit(from,value) || wiz || tempwiz) && heavy && bulky && !testbit(inven,value)){ 35849ca828Sedward setbit(inven,value); 36849ca828Sedward carrying += objwt[value]; 37849ca828Sedward encumber += objcumber[value]; 38849ca828Sedward time++; 39849ca828Sedward if (testbit(from,value)) 40849ca828Sedward printf("Taken.\n"); 41849ca828Sedward else 42849ca828Sedward printf("Zap! Taken from thin air.\n"); 43849ca828Sedward clearbit(from,value); 44849ca828Sedward if (value == MEDALION) 45849ca828Sedward win--; 46849ca828Sedward } 47849ca828Sedward else if (testbit(inven,value)) 48849ca828Sedward printf("You're already holding%s%s.\n", (objsht[value][n-1] == 's' ? " " : " a "),objsht[value]); 49849ca828Sedward else if (!heavy) 50849ca828Sedward printf("The %s %s too heavy.\n", objsht[value],(objsht[value][n-1] == 's' ? "are" : "is")); 51849ca828Sedward else if (!bulky) 52849ca828Sedward printf("The %s %s too cumbersome to hold.\n", objsht[value],(objsht[value][n-1] == 's' ? "are" : "is")); 53849ca828Sedward else 54849ca828Sedward printf("I dont see any %s around here.\n", objsht[value]); 55849ca828Sedward if (wordnumber < wordcount -1 && wordvalue[++wordnumber] == AND) 56849ca828Sedward wordnumber++; 57849ca828Sedward else 58849ca828Sedward return(firstnumber); 59849ca828Sedward } 60849ca828Sedward } 61849ca828Sedward /* special cases with their own return()'s */ 62849ca828Sedward 63849ca828Sedward if (wordnumber <= wordcount && wordtype[wordnumber] == NOUNS) 64849ca828Sedward switch(wordvalue[wordnumber]){ 65849ca828Sedward 66849ca828Sedward case SWORD: 67849ca828Sedward if (testbit(from, SWORD)){ 68849ca828Sedward wordtype[wordnumber--] = OBJECT; 69849ca828Sedward return(take(from)); 70849ca828Sedward } 71849ca828Sedward if (testbit(from, TWO_HANDED)){ 72849ca828Sedward wordvalue[wordnumber] = TWO_HANDED; 73849ca828Sedward wordtype[wordnumber--] = OBJECT; 74849ca828Sedward return(take(from)); 75849ca828Sedward } 76849ca828Sedward wordvalue[wordnumber] = BROAD; 77849ca828Sedward wordtype[wordnumber--] = OBJECT; 78849ca828Sedward return(take(from)); 79849ca828Sedward 80849ca828Sedward case BODY: 81849ca828Sedward if (testbit(from,MAID)){ 82849ca828Sedward wordvalue[wordnumber] = MAID; 83849ca828Sedward wordtype[wordnumber--] = OBJECT; 84849ca828Sedward return(take(from)); 85849ca828Sedward } 86849ca828Sedward else if (testbit(from,DEADWOOD)){ 87849ca828Sedward wordvalue[wordnumber] = DEADWOOD; 88849ca828Sedward wordtype[wordnumber--] = OBJECT; 89849ca828Sedward return(take(from)); 90849ca828Sedward } 91849ca828Sedward else if (testbit(from,DEADNATIVE)){ 92849ca828Sedward wordvalue[wordnumber] = DEADNATIVE; 93849ca828Sedward wordtype[wordnumber--] = OBJECT; 94849ca828Sedward return(take(from)); 95849ca828Sedward } 96849ca828Sedward else if (testbit(from,DEADGOD)){ 97849ca828Sedward wordvalue[wordnumber] = DEADGOD; 98849ca828Sedward wordtype[wordnumber--] = OBJECT; 99849ca828Sedward return(take(from)); 100849ca828Sedward } 101849ca828Sedward else { 102849ca828Sedward wordvalue[wordnumber] = DEADTIME; 103849ca828Sedward wordtype[wordnumber--] = OBJECT; 104849ca828Sedward return(take(from)); 105849ca828Sedward } 106849ca828Sedward break; 107849ca828Sedward 108849ca828Sedward case AMULET: 109849ca828Sedward if (testbit(location[position].objects,AMULET)){ 1107f30157aSedward puts("The amulet is warm to the touch, and its beauty catches your breath."); 1117f30157aSedward puts("A mist falls over your eyes, but then it is gone. Sounds seem clearer"); 112849ca828Sedward puts("and sharper but far away as if in a dream. The sound of purling water reaches"); 1137f30157aSedward puts("you from afar. The mist falls again, and your heart leaps in horror. The gold"); 114849ca828Sedward puts("freezes your hands and fathomless darkness engulfs your soul."); 115849ca828Sedward } 116849ca828Sedward wordtype[wordnumber--] = OBJECT; 117849ca828Sedward return(take(from)); 118849ca828Sedward 119849ca828Sedward case MEDALION: 120849ca828Sedward if (testbit(location[position].objects, MEDALION)){ 1217f30157aSedward puts("The medallion is warm, and it rekindles your spirit with the warmth of life."); 122849ca828Sedward puts("Your amulet begins to glow as the medallion is brought near to it, and together\nthey radiate."); 123849ca828Sedward } 124849ca828Sedward wordtype[wordnumber--] = OBJECT; 125849ca828Sedward return(take(from)); 126849ca828Sedward 127849ca828Sedward case TALISMAN: 128849ca828Sedward if (testbit(location[position].objects,TALISMAN)){ 1297f30157aSedward puts("The talisman is cold to the touch, and it sends a chill down your spine."); 130849ca828Sedward } 131849ca828Sedward wordtype[wordnumber--] = OBJECT; 132849ca828Sedward return(take(from)); 133849ca828Sedward 134849ca828Sedward case NORMGOD: 135849ca828Sedward if (testbit(location[position].objects,BATHGOD) && (testbit(wear,AMULET) || testbit(inven,AMULET))){ 1367f30157aSedward puts("She offers a delicate hand, and you help her out of the sparkling springs."); 137849ca828Sedward puts("Water droplets like liquid silver bedew her golden skin, but when they part"); 138849ca828Sedward puts("from her, they fall as teardrops. She wraps a single cloth around her and"); 139849ca828Sedward puts("ties it at the waist. Around her neck hangs a golden amulet."); 140849ca828Sedward puts("She bids you to follow her."); 141849ca828Sedward pleasure++; 142849ca828Sedward followgod = time; 143849ca828Sedward clearbit(location[position].objects,BATHGOD); 144849ca828Sedward } else if (!testbit(location[position].objects,BATHGOD)) 145849ca828Sedward puts("You're in no position to take her."); 146849ca828Sedward else 147849ca828Sedward puts("She moves away from you."); 148849ca828Sedward break; 149849ca828Sedward 150849ca828Sedward default: 151849ca828Sedward puts("It doesn't seem to work."); 152849ca828Sedward } 153849ca828Sedward else 154849ca828Sedward puts("You've got to be kidding."); 155849ca828Sedward return(firstnumber); 156849ca828Sedward } 157849ca828Sedward 1587f30157aSedward throw(name) 1597f30157aSedward char *name; 160849ca828Sedward { 161849ca828Sedward int n; 162849ca828Sedward int deposit = 0; 163849ca828Sedward int first, value; 164849ca828Sedward 165849ca828Sedward first = wordnumber; 1667f30157aSedward if (drop(name) != -1){ 167849ca828Sedward switch(wordvalue[wordnumber]){ 168849ca828Sedward 169849ca828Sedward case AHEAD: 170849ca828Sedward deposit = ahead; 171849ca828Sedward break; 172849ca828Sedward 173849ca828Sedward case BACK: 174849ca828Sedward deposit = back; 175849ca828Sedward break; 176849ca828Sedward 177849ca828Sedward case LEFT: 178849ca828Sedward deposit = left; 179849ca828Sedward break; 180849ca828Sedward 181849ca828Sedward case RIGHT: 182849ca828Sedward deposit = right; 183849ca828Sedward break; 184849ca828Sedward 185849ca828Sedward case UP: 186849ca828Sedward deposit = location[position].up * (location[position].access || position == FINAL); 187849ca828Sedward break; 188849ca828Sedward 189849ca828Sedward case DOWN: 190849ca828Sedward deposit = location[position].down; 191849ca828Sedward break; 192849ca828Sedward } 193849ca828Sedward wordnumber = first; 194849ca828Sedward while (wordtype[++wordnumber] == ADJS); 195849ca828Sedward while (wordnumber <= wordcount){ 196849ca828Sedward value = wordvalue[wordnumber]; 197849ca828Sedward if (deposit && testbit(location[position].objects,value)){ 198849ca828Sedward clearbit(location[position].objects,value); 199849ca828Sedward if (value != GRENADE) 200849ca828Sedward setbit(location[deposit].objects,value); 201849ca828Sedward else{ 202849ca828Sedward puts("A thundering explosion nearby sends up a cloud of smoke and shrapnel."); 203849ca828Sedward for (n = 0; n < NUMOFWORDS; n ++) 204849ca828Sedward location[deposit].objects[n] = 0; 205849ca828Sedward setbit(location[deposit].objects,CHAR); 206849ca828Sedward } 207849ca828Sedward if (value == ROPE && position == FINAL) 208849ca828Sedward location[position].access = 1; 209849ca828Sedward switch(deposit){ 210849ca828Sedward case 189: 211849ca828Sedward case 231: 212849ca828Sedward puts("The stone door is unhinged."); 213849ca828Sedward location[189].north = 231; 214849ca828Sedward location[231].south = 189; 215849ca828Sedward break; 216849ca828Sedward case 30: 217849ca828Sedward puts("The wooden door is blown open."); 218849ca828Sedward location[30].west = 25; 219849ca828Sedward break; 220849ca828Sedward case 31: 221849ca828Sedward puts("The door is not damaged."); 222849ca828Sedward } 223849ca828Sedward } 224849ca828Sedward else if (value == GRENADE && testbit(location[position].objects,value)){ 225849ca828Sedward puts("You are blown into shreds when your grenade explodes."); 226849ca828Sedward die(); 227849ca828Sedward } 228849ca828Sedward if (wordnumber < wordcount - 1 && wordvalue[++wordnumber] == AND) 229849ca828Sedward wordnumber++; 230849ca828Sedward else 231849ca828Sedward return(first); 232849ca828Sedward } 233849ca828Sedward return(first); 234849ca828Sedward } 235849ca828Sedward return(first); 236849ca828Sedward } 237849ca828Sedward 238849ca828Sedward drop(name) 239849ca828Sedward char *name; 240849ca828Sedward { 241849ca828Sedward 242849ca828Sedward int firstnumber, value; 243849ca828Sedward 244849ca828Sedward firstnumber = wordnumber; 2457f30157aSedward while (wordtype[++wordnumber] == ADJS) 2467f30157aSedward ; 247849ca828Sedward while (wordnumber<=wordcount && (wordtype[wordnumber] == OBJECT || wordtype[wordnumber] == NOUNS)) { 248849ca828Sedward value = wordvalue[wordnumber]; 249849ca828Sedward printf("%s:\n", objsht[value]); 250849ca828Sedward if (testbit(inven,value)){ 251849ca828Sedward clearbit(inven,value); 252849ca828Sedward carrying -= objwt[value]; 253849ca828Sedward encumber -= objcumber[value]; 254849ca828Sedward if (value == BOMB){ 255849ca828Sedward puts("The bomb explodes. A blinding white light and immense concussion obliterate us."); 256849ca828Sedward die(); 257849ca828Sedward } 258849ca828Sedward if (value != AMULET && value != MEDALION && value != TALISMAN) 259849ca828Sedward setbit(location[position].objects,value); 260849ca828Sedward else 261849ca828Sedward tempwiz = 0; 262849ca828Sedward time++; 2637f30157aSedward if (*name == 'K') 2647f30157aSedward puts("Drop kicked."); 2657f30157aSedward else 266849ca828Sedward printf("%s.\n", name); 267849ca828Sedward } 268849ca828Sedward else { 2697f30157aSedward if (*name != 'K') { 270849ca828Sedward printf("You aren't holding the %s.\n", objsht[value]); 271849ca828Sedward if (testbit(location[position].objects,value)) { 272849ca828Sedward if (*name == 'T') 273849ca828Sedward puts("Kicked instead."); 2747f30157aSedward else if (*name == 'G') 275849ca828Sedward puts("Given anyway."); 276849ca828Sedward } 2777f30157aSedward } else 2787f30157aSedward puts("Kicked."); 279849ca828Sedward } 280849ca828Sedward if (wordnumber < wordcount - 1 && wordvalue[++wordnumber] == AND) 281849ca828Sedward wordnumber++; 282849ca828Sedward else 283849ca828Sedward return(firstnumber); 284849ca828Sedward } 285849ca828Sedward puts("Do what?"); 286849ca828Sedward return(-1); 287849ca828Sedward } 288849ca828Sedward 289849ca828Sedward takeoff() 290849ca828Sedward { 291849ca828Sedward wordnumber = take(wear); 292849ca828Sedward return(drop("Dropped")); 293849ca828Sedward } 294849ca828Sedward 295849ca828Sedward puton() 296849ca828Sedward { 297849ca828Sedward wordnumber = take(location[position].objects); 298849ca828Sedward return(wearit()); 299849ca828Sedward } 300849ca828Sedward 301849ca828Sedward eat() 302849ca828Sedward { 303849ca828Sedward int firstnumber, value; 304849ca828Sedward 305849ca828Sedward firstnumber = wordnumber; 306849ca828Sedward while(wordtype[++wordnumber] == ADJS); 307849ca828Sedward while(wordnumber <= wordcount){ 308849ca828Sedward value = wordvalue[wordnumber]; 309849ca828Sedward switch(value){ 310849ca828Sedward 311849ca828Sedward case -1: 312849ca828Sedward puts("Eat what?"); 313849ca828Sedward return(firstnumber); 314849ca828Sedward 315849ca828Sedward default: 31643ded9bfSedward printf("You can't eat%s%s!\n", 31743ded9bfSedward wordtype[wordnumber] == OBJECT && 31843ded9bfSedward objsht[value] 31943ded9bfSedward [strlen(objsht[value]) - 1] == 's' ? 32043ded9bfSedward " " : " a ", 32143ded9bfSedward words[wordnumber]); 322849ca828Sedward return(firstnumber); 323849ca828Sedward 324849ca828Sedward case PAPAYAS: 325849ca828Sedward case PINEAPPLE: 326849ca828Sedward case KIWI: 327849ca828Sedward case COCONUTS: /* eatable things */ 328849ca828Sedward case MANGO: 329849ca828Sedward 330849ca828Sedward printf("%s:\n",objsht[value]); 331849ca828Sedward if (testbit(inven,value) && time > ate - CYCLE && testbit(inven,KNIFE)){ 332849ca828Sedward clearbit(inven,value); 333849ca828Sedward carrying -= objwt[value]; 334849ca828Sedward encumber -= objcumber[value]; 335849ca828Sedward ate = max(time,ate) + CYCLE/3; 336849ca828Sedward snooze += CYCLE/10; 337849ca828Sedward time++; 3387f30157aSedward puts("Eaten. You can explore a little longer now."); 339849ca828Sedward } 340849ca828Sedward else if (time < ate - CYCLE) 3417f30157aSedward puts("You're stuffed."); 342849ca828Sedward else if (!testbit(inven,KNIFE)) 343849ca828Sedward puts("You need a knife."); 344849ca828Sedward else 345849ca828Sedward printf("You aren't holding the %s.\n", objsht[value]); 346849ca828Sedward if (wordnumber < wordcount - 1 && wordvalue[++wordnumber] == AND) 347849ca828Sedward wordnumber++; 348849ca828Sedward else 349849ca828Sedward return(firstnumber); 350849ca828Sedward } /* end switch */ 351849ca828Sedward } /* end while */ 352849ca828Sedward return(firstnumber); 353849ca828Sedward } 354