1 /*- 2 * Copyright (c) 1983, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. Neither the name of the University nor the names of its contributors 14 * may be used to endorse or promote products derived from this software 15 * without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 * 29 * @(#)cypher.c 8.1 (Berkeley) 5/31/93 30 * $FreeBSD: src/games/battlestar/cypher.c,v 1.7.2.1 2001/03/05 11:45:36 kris Exp $ 31 * $DragonFly: src/games/battlestar/cypher.c,v 1.3 2006/08/08 16:47:20 pavalos Exp $ 32 */ 33 34 #include "externs.h" 35 36 int 37 cypher(void) 38 { 39 int n; 40 int junk; 41 int lflag; 42 char buffer[10]; 43 44 lflag = -1; 45 while (wordtype[wordnumber] == ADJS) 46 wordnumber++; 47 while (wordnumber <= wordcount) { 48 switch (wordvalue[wordnumber]) { 49 case UP: 50 if (location[position].access || wiz || tempwiz) { 51 if (!location[position].access) 52 puts("Zap! A gust of wind lifts you up."); 53 if (!battlestar_move(location[position].up, AHEAD)) 54 return (-1); 55 } else { 56 puts("There is no way up"); 57 return (-1); 58 } 59 lflag = 0; 60 break; 61 62 case DOWN: 63 if (!battlestar_move(location[position].down, AHEAD)) 64 return (-1); 65 lflag = 0; 66 break; 67 68 case LEFT: 69 if (!battlestar_move(left, LEFT)) 70 return (-1); 71 lflag = 0; 72 break; 73 74 case RIGHT: 75 if (!battlestar_move(right, RIGHT)) 76 return (-1); 77 lflag = 0; 78 break; 79 80 case AHEAD: 81 if (!battlestar_move(ahead, AHEAD)) 82 return (-1); 83 lflag = 0; 84 break; 85 86 case BACK: 87 if (!battlestar_move(back, BACK)) 88 return (-1); 89 lflag = 0; 90 break; 91 92 case SHOOT: 93 if (wordnumber < wordcount && 94 wordvalue[wordnumber + 1] == EVERYTHING) { 95 for (n = 0; n < NUMOFOBJECTS; n++) 96 if (testbit(location[position].objects, 97 n) && objsht[n]) { 98 wordvalue[wordnumber + 1] = n; 99 wordnumber = shoot(); 100 } 101 wordnumber++; 102 wordnumber++; 103 } else 104 shoot(); 105 break; 106 107 case TAKE: 108 if (wordnumber < wordcount && 109 wordvalue[wordnumber + 1] == EVERYTHING) { 110 for (n = 0; n < NUMOFOBJECTS; n++) 111 if (testbit(location[position].objects, 112 n) && objsht[n]) { 113 wordvalue[wordnumber + 1] = n; 114 wordnumber = 115 take(location[position].objects); 116 } 117 wordnumber++; 118 wordnumber++; 119 } else 120 take(location[position].objects); 121 break; 122 123 case DROP: 124 if (wordnumber < wordcount && 125 wordvalue[wordnumber + 1] == EVERYTHING) { 126 for (n = 0; n < NUMOFOBJECTS; n++) 127 if (testbit(inven, n)) { 128 wordvalue[wordnumber + 1] = n; 129 wordnumber = drop("Dropped"); 130 } 131 wordnumber++; 132 wordnumber++; 133 } else 134 drop("Dropped"); 135 break; 136 137 case KICK: 138 case THROW: 139 if (wordnumber < wordcount && 140 wordvalue[wordnumber + 1] == EVERYTHING) { 141 for (n = 0; n < NUMOFOBJECTS; n++) { 142 if ((testbit(inven, n) || 143 testbit(location[position].objects, n)) && objsht[n]) { 144 wordvalue[wordnumber + 1] = n; 145 wordnumber = throw(wordvalue[wordnumber] == 146 KICK ? "Kicked" : "Thrown"); 147 } 148 } 149 wordnumber += 2; 150 } else 151 throw(wordvalue[wordnumber] == KICK ? "Kicked" : "Thrown"); 152 break; 153 154 case TAKEOFF: 155 if (wordnumber < wordcount && 156 wordvalue[wordnumber + 1] == EVERYTHING) { 157 for (n = 0; n < NUMOFOBJECTS; n++) 158 if (testbit(wear, n)) { 159 wordvalue[wordnumber + 1] = n; 160 wordnumber = takeoff(); 161 } 162 wordnumber += 2; 163 } else 164 takeoff(); 165 break; 166 167 case DRAW: 168 if (wordnumber < wordcount && 169 wordvalue[wordnumber + 1] == EVERYTHING) { 170 for (n = 0; n < NUMOFOBJECTS; n++) 171 if (testbit(wear, n)) { 172 wordvalue[wordnumber + 1] = n; 173 wordnumber = draw(); 174 } 175 wordnumber += 2; 176 } else 177 draw(); 178 break; 179 180 case PUTON: 181 if (wordnumber < wordcount && 182 wordvalue[wordnumber + 1] == EVERYTHING) { 183 for (n = 0; n < NUMOFOBJECTS; n++) 184 if (testbit(location[position].objects, 185 n) && objsht[n]) { 186 wordvalue[wordnumber + 1] = n; 187 wordnumber = puton(); 188 } 189 wordnumber += 2; 190 } else 191 puton(); 192 break; 193 194 case WEARIT: 195 if (wordnumber < wordcount && 196 wordvalue[wordnumber + 1] == EVERYTHING) { 197 for (n = 0; n < NUMOFOBJECTS; n++) 198 if (testbit(inven, n)) { 199 wordvalue[wordnumber + 1] = n; 200 wordnumber = wearit(); 201 } 202 wordnumber += 2; 203 } else 204 wearit(); 205 break; 206 207 case EAT: 208 if (wordnumber < wordcount && 209 wordvalue[wordnumber + 1] == EVERYTHING) { 210 for (n = 0; n < NUMOFOBJECTS; n++) 211 if (testbit(inven, n)) { 212 wordvalue[wordnumber + 1] = n; 213 wordnumber = eat(); 214 } 215 wordnumber += 2; 216 } else 217 eat(); 218 break; 219 220 case PUT: 221 put(); 222 break; 223 224 case INVEN: 225 if (ucard(inven)) { 226 puts("You are holding:\n"); 227 for (n = 0; n < NUMOFOBJECTS; n++) 228 if (testbit(inven, n)) 229 printf("\t%s\n", objsht[n]); 230 printf("\n= %d kilogram%s (%d%%)\n", carrying, 231 (carrying == 1 ? "." : "s."), 232 (WEIGHT ? carrying * 100 / WEIGHT : -1)); 233 printf("Your arms are %d%% full.\n", 234 encumber * 100 / CUMBER); 235 } else 236 puts("You aren't carrying anything."); 237 238 if (ucard(wear)) { 239 puts("\nYou are wearing:\n"); 240 for (n = 0; n < NUMOFOBJECTS; n++) 241 if (testbit(wear, n)) 242 printf("\t%s\n", objsht[n]); 243 } else 244 puts("\nYou are stark naked."); 245 if (card(injuries, NUMOFINJURIES)) { 246 puts("\nYou have suffered:\n"); 247 for (n = 0; n < NUMOFINJURIES; n++) 248 if (injuries[n]) 249 printf("\t%s\n", ouch[n]); 250 printf("\nYou can still carry up to %d kilogram%s\n", 251 WEIGHT, (WEIGHT == 1 ? "." : "s.")); 252 } else 253 puts("\nYou are in perfect health."); 254 break; 255 256 case USE: 257 lflag = use(); 258 break; 259 260 case LOOK: 261 if (!notes[CANTSEE] || testbit(inven, LAMPON) || 262 testbit(location[position].objects, LAMPON) || 263 matchlight) { 264 beenthere[position] = 2; 265 writedes(); 266 printobjs(); 267 if (matchlight) { 268 puts("\nYour match splutters out."); 269 matchlight = 0; 270 } 271 } else 272 puts("I can't see anything."); 273 return (-1); 274 break; 275 276 case SU: 277 if (wiz || tempwiz) { 278 printf("\nRoom (was %d) = ", position); 279 fgets(buffer, 10, stdin); 280 if (*buffer != '\n') 281 sscanf(buffer, "%d", &position); 282 printf("Time (was %d) = ", gtime); 283 fgets(buffer, 10, stdin); 284 if (*buffer != '\n') 285 sscanf(buffer, "%d", >ime); 286 printf("Fuel (was %d) = ", fuel); 287 fgets(buffer, 10, stdin); 288 if (*buffer != '\n') 289 sscanf(buffer, "%d", &fuel); 290 printf("Torps (was %d) = ", torps); 291 fgets(buffer, 10, stdin); 292 if (*buffer != '\n') 293 sscanf(buffer, "%d", &torps); 294 printf("CUMBER (was %d) = ", CUMBER); 295 fgets(buffer, 10, stdin); 296 if (*buffer != '\n') 297 sscanf(buffer, "%d", &CUMBER); 298 printf("WEIGHT (was %d) = ", WEIGHT); 299 fgets(buffer, 10, stdin); 300 if (*buffer != '\n') 301 sscanf(buffer, "%d", &WEIGHT); 302 printf("Clock (was %d) = ", gclock); 303 fgets(buffer, 10, stdin); 304 if (*buffer != '\n') 305 sscanf(buffer, "%d", &gclock); 306 printf("Wizard (was %d, %d) = ", wiz, tempwiz); 307 fgets(buffer, 10, stdin); 308 if (*buffer != '\n') { 309 sscanf(buffer, "%d", &junk); 310 if (!junk) 311 tempwiz = wiz = 0; 312 } 313 printf("\nDONE.\n"); 314 return (0); 315 } else 316 puts("You aren't a wizard."); 317 break; 318 319 case SCORE: 320 printf("\tPLEASURE\tPOWER\t\tEGO\n"); 321 printf("\t%3d\t\t%3d\t\t%3d\n\n", pleasure, power, ego); 322 printf("This gives you the rating of %s in %d turns.\n", 323 rate(), gtime); 324 printf("You have visited %d out of %d rooms this run (%d%%).\n", 325 card(beenthere, NUMOFROOMS), NUMOFROOMS, 326 card(beenthere, NUMOFROOMS) * 100 / NUMOFROOMS); 327 break; 328 329 case KNIFE: 330 case KILL: 331 murder(); 332 break; 333 334 case UNDRESS: 335 case RAVAGE: 336 ravage(); 337 break; 338 339 case SAVE: 340 save(); 341 break; 342 343 case FOLLOW: 344 lflag = follow(); 345 break; 346 347 case GIVE: 348 give(); 349 break; 350 351 case KISS: 352 kiss(); 353 break; 354 355 case LOVE: 356 love(); 357 break; 358 359 case RIDE: 360 lflag = ride(); 361 break; 362 363 case DRIVE: 364 lflag = drive(); 365 break; 366 367 case LIGHT: 368 light(); 369 break; 370 371 case LAUNCH: 372 if (!launch()) 373 return (-1); 374 else 375 lflag = 0; 376 break; 377 378 case LANDIT: 379 if (!land()) 380 return (-1); 381 else 382 lflag = 0; 383 break; 384 385 case TIME: 386 chime(); 387 break; 388 389 case SLEEP: 390 zzz(); 391 break; 392 393 case DIG: 394 dig(); 395 break; 396 397 case JUMP: 398 lflag = jump(); 399 break; 400 401 case BURY: 402 bury(); 403 break; 404 405 case SWIM: 406 puts("Surf's up!"); 407 break; 408 409 case DRINK: 410 drink(); 411 break; 412 413 case QUIT: 414 die(0); 415 416 default: 417 puts("How's that?"); 418 return (-1); 419 break; 420 } 421 if (wordnumber < wordcount && *words[wordnumber++] == ',') 422 continue; 423 else 424 return (lflag); 425 } 426 return (lflag); 427 } 428