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