1: /* 2: * Copyright (c) 1983 Regents of the University of California, 3: * All rights reserved. Redistribution permitted subject to 4: * the terms of the Berkeley Software License Agreement. 5: */ 6: 7: #if !defined(lint) && !defined(pdp11) 8: static char sccsid[] = "@(#)cypher.c 1.3.1 1996/10/26"; 9: #endif 10: 11: #include "externs.h" 12: 13: cypher() 14: { 15: register int n; 16: int junk; 17: int lflag = -1; 18: char buffer[10]; 19: 20: while (wordtype[wordnumber] == ADJS) 21: wordnumber++; 22: while (wordnumber <= wordcount) { 23: switch(wordvalue[wordnumber]) { 24: 25: case UP: 26: if (location[position].access || wiz || tempwiz) { 27: if (!location[position].access) 28: puts("Zap! A gust of wind lifts you up."); 29: if (!move(location[position].up, AHEAD)) 30: return(-1); 31: } else { 32: puts("There is no way up"); 33: return(-1); 34: } 35: lflag = 0; 36: break; 37: 38: case DOWN: 39: if (!move(location[position].down, AHEAD)) 40: return(-1); 41: lflag = 0; 42: break; 43: 44: case LEFT: 45: if (!move(left, LEFT)) 46: return(-1); 47: lflag = 0; 48: break; 49: 50: case RIGHT: 51: if (!move(right, RIGHT)) 52: return(-1); 53: lflag = 0; 54: break; 55: 56: case AHEAD: 57: if (!move(ahead, AHEAD)) 58: return(-1); 59: lflag = 0; 60: break; 61: 62: case BACK: 63: if (!move(back, BACK)) 64: return(-1); 65: lflag = 0; 66: break; 67: 68: case SHOOT: 69: if (wordnumber < wordcount && wordvalue[wordnumber+1] == EVERYTHING){ 70: for (n=0; n < NUMOFOBJECTS; n++) 71: if (testbit(location[position].objects,n) && *objsht[n]){ 72: wordvalue[wordnumber+1] = n; 73: wordnumber = shoot(); 74: } 75: wordnumber++; 76: wordnumber++; 77: } 78: else 79: shoot(); 80: break; 81: 82: case TAKE: 83: if (wordnumber < wordcount && wordvalue[wordnumber+1] == EVERYTHING){ 84: for (n=0; n < NUMOFOBJECTS; n++) 85: if (testbit(location[position].objects,n) && *objsht[n]){ 86: wordvalue[wordnumber+1] = n; 87: wordnumber = take(location[position].objects); 88: } 89: wordnumber++; 90: wordnumber++; 91: } 92: else 93: take(location[position].objects); 94: break; 95: 96: case DROP: 97: 98: if (wordnumber < wordcount && wordvalue[wordnumber+1] == EVERYTHING){ 99: for (n=0; n < NUMOFOBJECTS; n++) 100: if (testbit(inven,n)){ 101: wordvalue[wordnumber+1] = n; 102: wordnumber = drop("Dropped"); 103: } 104: wordnumber++; 105: wordnumber++; 106: } 107: else 108: drop("Dropped"); 109: break; 110: 111: 112: case KICK: 113: case THROW: 114: if (wordnumber < wordcount && wordvalue[wordnumber+1] == EVERYTHING){ 115: for (n=0; n < NUMOFOBJECTS; n++) 116: if (testbit(inven,n) || 117: testbit(location[position].objects, n) && *objsht[n]){ 118: wordvalue[wordnumber+1] = n; 119: wordnumber = throw(wordvalue[wordnumber] == KICK ? "Kicked" : "Thrown"); 120: } 121: wordnumber += 2; 122: } else 123: throw(wordvalue[wordnumber] == KICK ? "Kicked" : "Thrown"); 124: break; 125: 126: case TAKEOFF: 127: if (wordnumber < wordcount && wordvalue[wordnumber+1] == EVERYTHING){ 128: for (n=0; n < NUMOFOBJECTS; n++) 129: if (testbit(wear,n)){ 130: wordvalue[wordnumber+1] = n; 131: wordnumber = takeoff(); 132: } 133: wordnumber += 2; 134: } 135: else 136: takeoff(); 137: break; 138: 139: 140: case DRAW: 141: 142: if (wordnumber < wordcount && wordvalue[wordnumber+1] == EVERYTHING){ 143: for (n=0; n < NUMOFOBJECTS; n++) 144: if (testbit(wear,n)){ 145: wordvalue[wordnumber+1] = n; 146: wordnumber = draw(); 147: } 148: wordnumber += 2; 149: } 150: else 151: draw(); 152: break; 153: 154: 155: case PUTON: 156: 157: if (wordnumber < wordcount && wordvalue[wordnumber+1] == EVERYTHING){ 158: for (n=0; n < NUMOFOBJECTS; n++) 159: if (testbit(location[position].objects,n) && *objsht[n]){ 160: wordvalue[wordnumber+1] = n; 161: wordnumber = puton(); 162: } 163: wordnumber += 2; 164: } 165: else 166: puton(); 167: break; 168: 169: case WEARIT: 170: 171: if (wordnumber < wordcount && wordvalue[wordnumber+1] == EVERYTHING){ 172: for (n=0; n < NUMOFOBJECTS; n++) 173: if (testbit(inven,n)){ 174: wordvalue[wordnumber+1] = n; 175: wordnumber = wearit(); 176: } 177: wordnumber += 2; 178: } 179: else 180: wearit(); 181: break; 182: 183: 184: case EAT: 185: 186: if (wordnumber < wordcount && wordvalue[wordnumber+1] == EVERYTHING){ 187: for (n=0; n < NUMOFOBJECTS; n++) 188: if (testbit(inven,n)){ 189: wordvalue[wordnumber+1] = n; 190: wordnumber = eat(); 191: } 192: wordnumber += 2; 193: } 194: else 195: eat(); 196: break; 197: 198: 199: case PUT: 200: put(); 201: break; 202: 203: 204: case INVEN: 205: if (ucard(inven)){ 206: puts("You are holding:\n"); 207: for (n=0; n < NUMOFOBJECTS; n++) 208: if (testbit(inven,n)) 209: printf("\t%s\n", objsht[n]); 210: printf("\n= %d kilogram%s (%d%%)\n", carrying, (carrying == 1 ? "." : "s."),(WEIGHT ? carrying*100/WEIGHT : -1)); 211: printf("Your arms are %d%% full.\n",encumber*100/CUMBER); 212: } 213: else 214: puts("You aren't carrying anything."); 215: 216: if (ucard(wear)){ 217: puts("\nYou are wearing:\n"); 218: for (n=0; n < NUMOFOBJECTS; n++) 219: if (testbit(wear,n)) 220: printf("\t%s\n", objsht[n]); 221: } 222: else 223: puts("\nYou are stark naked."); 224: if (card(injuries,NUMOFINJURIES)){ 225: puts("\nYou have suffered:\n"); 226: for (n=0; n < NUMOFINJURIES; n++) 227: if (injuries[n]) 228: printf("\t%s\n",ouch[n]); 229: printf("\nYou can still carry up to %d kilogram%s\n",WEIGHT,(WEIGHT == 1 ? "." : "s.")); 230: } 231: else 232: puts("\nYou are in perfect health."); 233: break; 234: 235: case USE: 236: lflag = use(); 237: break; 238: 239: case LOOK: 240: if (!notes[CANTSEE] || testbit(inven,LAMPON) || testbit(location[position].objects,LAMPON) || matchlight){ 241: beenthere[position] = 2; 242: writedes(); 243: printobjs(); 244: if (matchlight){ 245: puts("\nYour match splutters out."); 246: matchlight = 0; 247: } 248: } else 249: puts("I can't see anything."); 250: return(-1); 251: break; 252: 253: case SU: 254: if (wiz || tempwiz){ 255: printf("\nRoom (was %d) = ", position); 256: fgets(buffer,10,stdin); 257: if (*buffer != '\n') 258: sscanf(buffer,"%d", &position); 259: printf("Time (was %d) = ",Time); 260: fgets(buffer,10,stdin); 261: if (*buffer != '\n') 262: sscanf(buffer,"%d", &Time); 263: printf("Fuel (was %d) = ",fuel); 264: fgets(buffer,10,stdin); 265: if (*buffer != '\n') 266: sscanf(buffer,"%d", &fuel); 267: printf("Torps (was %d) = ",torps); 268: fgets(buffer,10,stdin); 269: if (*buffer != '\n') 270: sscanf(buffer,"%d", &torps); 271: printf("CUMBER (was %d) = ",CUMBER); 272: fgets(buffer,10,stdin); 273: if (*buffer != '\n') 274: sscanf(buffer,"%d", &CUMBER); 275: printf("WEIGHT (was %d) = ",WEIGHT); 276: fgets(buffer,10,stdin); 277: if (*buffer != '\n') 278: sscanf(buffer,"%d",&WEIGHT); 279: printf("Clock (was %d) = ",clock); 280: fgets(buffer,10,stdin); 281: if (*buffer != '\n') 282: sscanf(buffer,"%d",&clock); 283: printf("Wizard (was %d, %d) = ",wiz, tempwiz); 284: fgets(buffer,10,stdin); 285: if (*buffer != '\n'){ 286: sscanf(buffer,"%d",&junk); 287: if (!junk) 288: tempwiz = wiz = 0; 289: } 290: printf("\nDONE.\n"); 291: return(0); 292: } 293: else 294: puts("You aren't a wizard."); 295: break; 296: 297: case SCORE: 298: printf("\tPLEASURE\tPOWER\t\tEGO\n"); 299: printf("\t%3d\t\t%3d\t\t%3d\n\n",pleasure,power,ego); 300: printf("This gives you the rating of %s in %d turns.\n",rate(),Time); 301: printf("You have visited %d out of %d rooms this run (%d%%).\n",card(beenthere,NUMOFROOMS),NUMOFROOMS,card(beenthere,NUMOFROOMS)*100/NUMOFROOMS); 302: break; 303: 304: case KNIFE: 305: case KILL: 306: murder(); 307: break; 308: 309: case UNDRESS: 310: case RAVAGE: 311: ravage(); 312: break; 313: 314: case SAVE: 315: save(); 316: break; 317: 318: case FOLLOW: 319: lflag = follow(); 320: break; 321: 322: case GIVE: 323: give(); 324: break; 325: 326: case KISS: 327: kiss(); 328: break; 329: 330: case LOVE: 331: love(); 332: break; 333: 334: case RIDE: 335: lflag = ride(); 336: break; 337: 338: case DRIVE: 339: lflag = drive(); 340: break; 341: 342: case LIGHT: 343: light(); 344: break; 345: 346: case LAUNCH: 347: if (!launch()) 348: return(-1); 349: else 350: lflag = 0; 351: break; 352: 353: case LANDIT: 354: if (!land()) 355: return(-1); 356: else 357: lflag = 0; 358: break; 359: 360: case TIME: 361: chime(); 362: break; 363: 364: case SLEEP: 365: zzz(); 366: break; 367: 368: case DIG: 369: dig(); 370: break; 371: 372: case JUMP: 373: lflag = jump(); 374: break; 375: 376: case BURY: 377: bury(); 378: break; 379: 380: case SWIM: 381: puts("Surf's up!"); 382: break; 383: 384: case DRINK: 385: drink(); 386: break; 387: 388: case QUIT: 389: die(); 390: 391: default: 392: puts("How's that?"); 393: return(-1); 394: break; 395: 396: 397: } 398: if (wordnumber < wordcount && *words[wordnumber++] == ',') 399: continue; 400: else return(lflag); 401: } 402: return(lflag); 403: }