1 /* object.c Larn is copyrighted 1986 by Noah Morgan. */ 2 #include "header.h" 3 4 /* 5 *************** 6 LOOK_FOR_OBJECT 7 *************** 8 9 subroutine to look for an object and give the player his options 10 if an object was found. 11 */ 12 lookforobject() 13 { 14 register int i,j; 15 if (c[TIMESTOP]) return; /* can't find objects is time is stopped */ 16 i=item[playerx][playery]; if (i==0) return; 17 showcell(playerx,playery); cursors(); yrepcount=0; 18 switch(i) 19 { 20 case OGOLDPILE: case OMAXGOLD: 21 case OKGOLD: case ODGOLD: lprcat("\n\nYou have found some gold!"); ogold(i); break; 22 23 case OPOTION: lprcat("\n\nYou have found a magic potion"); 24 i = iarg[playerx][playery]; 25 if (potionname[i][0]) lprintf(" of %s",&potionname[i][1]); opotion(i); break; 26 27 case OSCROLL: lprcat("\n\nYou have found a magic scroll"); 28 i = iarg[playerx][playery]; 29 if (scrollname[i][0]) lprintf(" of %s",&scrollname[i][1]); 30 oscroll(i); break; 31 32 case OALTAR: if (nearbymonst()) return; 33 lprcat("\n\nThere is a Holy Altar here!"); oaltar(); break; 34 35 case OBOOK: lprcat("\n\nYou have found a book."); obook(); break; 36 37 case OCOOKIE: lprcat("\n\nYou have found a fortune cookie."); ocookie(); break; 38 39 case OTHRONE: if (nearbymonst()) return; 40 lprintf("\n\nThere is %s here!",objectname[i]); othrone(0); break; 41 42 case OTHRONE2: if (nearbymonst()) return; 43 lprintf("\n\nThere is %s here!",objectname[i]); othrone(1); break; 44 45 case ODEADTHRONE: lprintf("\n\nThere is %s here!",objectname[i]); odeadthrone(); break; 46 47 case OORB: lprcat("\n\nYou have found the Orb!!!!!"); oorb(); break; 48 49 case OPIT: lprcat("\n\nYou're standing at the top of a pit."); opit(); break; 50 51 case OSTAIRSUP: lprcat("\n\nThere is a circular staircase here"); ostairs(1); /* up */ break; 52 53 case OELEVATORUP: lprcat("\n\nYou feel heavy for a moment, but the feeling disappears"); 54 oelevator(1); /* up */ break; 55 56 case OFOUNTAIN: if (nearbymonst()) return; 57 lprcat("\n\nThere is a fountain here"); ofountain(); break; 58 59 case OSTATUE: if (nearbymonst()) return; 60 lprcat("\n\nYou are standing in front of a statue"); ostatue(); break; 61 62 case OCHEST: lprcat("\n\nThere is a chest here"); ochest(); break; 63 64 case OIVTELETRAP: if (rnd(11)<6) return; 65 item[playerx][playery] = OTELEPORTER; 66 know[playerx][playery] = 1; 67 68 case OTELEPORTER: lprcat("\nZaaaappp! You've been teleported!\n"); 69 beep(); nap(3000); oteleport(0); 70 break; 71 72 case OSCHOOL: if (nearbymonst()) return; 73 lprcat("\n\nYou have found the College of Larn."); 74 lprcat("\nDo you (g) go inside, or (i) stay here? "); 75 i=0; while ((i!='g') && (i!='i') && (i!='\33')) i=getchar(); 76 if (i == 'g') { oschool(); /* the college of larn */ } 77 else lprcat(" stay here"); 78 break; 79 80 case OMIRROR: if (nearbymonst()) return; 81 lprcat("\n\nThere is a mirror here"); omirror(); break; 82 83 case OBANK2: 84 case OBANK: if (nearbymonst()) return; 85 if (i==OBANK) lprcat("\n\nYou have found the bank of Larn."); 86 else lprcat("\n\nYou have found a branch office of the bank of Larn."); 87 lprcat("\nDo you (g) go inside, or (i) stay here? "); 88 j=0; while ((j!='g') && (j!='i') && (j!='\33')) j=getchar(); 89 if (j == 'g') { if (i==OBANK) obank(); else obank2(); /* the bank of larn */ } 90 else lprcat(" stay here"); 91 break; 92 93 case ODEADFOUNTAIN: if (nearbymonst()) return; 94 lprcat("\n\nThere is a dead fountain here"); break; 95 96 case ODNDSTORE: if (nearbymonst()) return; 97 lprcat("\n\nThere is a DND store here."); 98 lprcat("\nDo you (g) go inside, or (i) stay here? "); 99 i=0; while ((i!='g') && (i!='i') && (i!='\33')) i=getchar(); 100 if (i == 'g') 101 dndstore(); /* the dnd adventurers store */ 102 else lprcat(" stay here"); 103 break; 104 105 case OSTAIRSDOWN: lprcat("\n\nThere is a circular staircase here"); ostairs(-1); /* down */ break; 106 107 case OELEVATORDOWN: lprcat("\n\nYou feel light for a moment, but the feeling disappears"); 108 oelevator(-1); /* down */ 109 break; 110 111 case OOPENDOOR: lprintf("\n\nYou have found %s",objectname[i]); 112 lprcat("\nDo you (c) close it"); iopts(); 113 i=0; while ((i!='c') && (i!='i') && (i!='\33')) i=getchar(); 114 if ((i=='\33') || (i=='i')) { ignore(); break; } 115 lprcat("close"); forget(); 116 item[playerx][playery]=OCLOSEDDOOR; 117 iarg[playerx][playery]=0; 118 playerx = lastpx; playery = lastpy; 119 break; 120 121 case OCLOSEDDOOR: lprintf("\n\nYou have found %s",objectname[i]); 122 lprcat("\nDo you (o) try to open it"); iopts(); 123 i=0; while ((i!='o') && (i!='i') && (i!='\33')) i=getchar(); 124 if ((i=='\33') || (i=='i')) 125 { ignore(); playerx = lastpx; 126 playery = lastpy; break; } 127 else 128 { 129 lprcat("open"); 130 if (rnd(11)<7) 131 { 132 switch(iarg[playerx][playery]) 133 { 134 case 6: c[AGGRAVATE] += rnd(400); break; 135 136 case 7: lprcat("\nYou are jolted by an electric shock "); 137 lastnum=274; losehp(rnd(20)); bottomline(); break; 138 139 case 8: loselevel(); break; 140 141 case 9: lprcat("\nYou suddenly feel weaker "); 142 if (c[STRENGTH]>3) c[STRENGTH]--; 143 bottomline(); break; 144 145 default: break; 146 } 147 playerx = lastpx; playery = lastpy; 148 } 149 else 150 { 151 forget(); item[playerx][playery]=OOPENDOOR; 152 } 153 } 154 break; 155 156 case OENTRANCE: lprcat("\nYou have found "); lprcat(objectname[OENTRANCE]); 157 lprcat("\nDo you (g) go inside"); iopts(); 158 i=0; while ((i!='g') && (i!='i') && (i!='\33')) i=getchar(); 159 if (i == 'g') 160 { 161 newcavelevel(1); playerx=33; playery=MAXY-2; 162 item[33][MAXY-1]=know[33][MAXY-1]=mitem[33][MAXY-1]=0; 163 draws(0,MAXX,0,MAXY); bot_linex(); return; 164 } 165 else ignore(); 166 break; 167 168 case OVOLDOWN: lprcat("\nYou have found "); lprcat(objectname[OVOLDOWN]); 169 lprcat("\nDo you (c) climb down"); iopts(); 170 i=0; while ((i!='c') && (i!='i') && (i!='\33')) i=getchar(); 171 if ((i=='\33') || (i=='i')) { ignore(); break; } 172 if (level!=0) { lprcat("\nThe shaft only extends 5 feet downward!"); return; } 173 if (packweight() > 45+3*(c[STRENGTH]+c[STREXTRA])) { lprcat("\nYou slip and fall down the shaft"); beep(); 174 lastnum=275; losehp(30+rnd(20)); bottomhp(); } 175 176 else lprcat("climb down"); nap(3000); newcavelevel(MAXLEVEL); 177 for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++) /* put player near volcano shaft */ 178 if (item[j][i]==OVOLUP) { playerx=j; playery=i; j=MAXX; i=MAXY; positionplayer(); } 179 draws(0,MAXX,0,MAXY); bot_linex(); return; 180 181 case OVOLUP: lprcat("\nYou have found "); lprcat(objectname[OVOLUP]); 182 lprcat("\nDo you (c) climb up"); iopts(); 183 i=0; while ((i!='c') && (i!='i') && (i!='\33')) i=getchar(); 184 if ((i=='\33') || (i=='i')) { ignore(); break; } 185 if (level!=11) { lprcat("\nThe shaft only extends 8 feet upwards before you find a blockage!"); return; } 186 if (packweight() > 45+5*(c[STRENGTH]+c[STREXTRA])) { lprcat("\nYou slip and fall down the shaft"); beep(); 187 lastnum=275; losehp(15+rnd(20)); bottomhp(); return; } 188 lprcat("climb up"); lflush(); nap(3000); newcavelevel(0); 189 for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++) /* put player near volcano shaft */ 190 if (item[j][i]==OVOLDOWN) { playerx=j; playery=i; j=MAXX; i=MAXY; positionplayer(); } 191 draws(0,MAXX,0,MAXY); bot_linex(); return; 192 193 case OTRAPARROWIV: if (rnd(17)<13) return; /* for an arrow trap */ 194 item[playerx][playery] = OTRAPARROW; 195 know[playerx][playery] = 0; 196 197 case OTRAPARROW: lprcat("\nYou are hit by an arrow"); beep(); /* for an arrow trap */ 198 lastnum=259; losehp(rnd(10)+level); 199 bottomhp(); return; 200 201 case OIVDARTRAP: if (rnd(17)<13) return; /* for a dart trap */ 202 item[playerx][playery] = ODARTRAP; 203 know[playerx][playery] = 0; 204 205 case ODARTRAP: lprcat("\nYou are hit by a dart"); beep(); /* for a dart trap */ 206 lastnum=260; losehp(rnd(5)); 207 if ((--c[STRENGTH]) < 3) c[STRENGTH] = 3; 208 bottomline(); return; 209 210 case OIVTRAPDOOR: if (rnd(17)<13) return; /* for a trap door */ 211 item[playerx][playery] = OTRAPDOOR; 212 know[playerx][playery] = 1; 213 214 case OTRAPDOOR: lastnum = 272; /* a trap door */ 215 if ((level==MAXLEVEL-1) || (level==MAXLEVEL+MAXVLEVEL-1)) 216 { lprcat("\nYou fell through a bottomless trap door!"); beep(); nap(3000); died(271); } 217 lprcat("\nYou fall through a trap door!"); beep(); /* for a trap door */ 218 losehp(rnd(5+level)); 219 nap(2000); newcavelevel(level+1); draws(0,MAXX,0,MAXY); bot_linex(); 220 return; 221 222 223 case OTRADEPOST: if (nearbymonst()) return; 224 lprcat("\nYou have found the Larn trading Post."); 225 lprcat("\nDo you (g) go inside, or (i) stay here? "); 226 i=0; while ((i!='g') && (i!='i') && (i!='\33')) i=getchar(); 227 if (i == 'g') otradepost(); else lprcat("stay here"); 228 return; 229 230 case OHOME: if (nearbymonst()) return; 231 lprcat("\nYou have found your way home."); 232 lprcat("\nDo you (g) go inside, or (i) stay here? "); 233 i=0; while ((i!='g') && (i!='i') && (i!='\33')) i=getchar(); 234 if (i == 'g') ohome(); else lprcat("stay here"); 235 return; 236 237 case OWALL: break; 238 239 case OANNIHILATION: died(283); return; /* annihilated by sphere of annihilation */ 240 241 case OLRS: if (nearbymonst()) return; 242 lprcat("\n\nThere is an LRS office here."); 243 lprcat("\nDo you (g) go inside, or (i) stay here? "); 244 i=0; while ((i!='g') && (i!='i') && (i!='\33')) i=getchar(); 245 if (i == 'g') 246 olrs(); /* the larn revenue service */ 247 else lprcat(" stay here"); 248 break; 249 250 default: finditem(i); break; 251 }; 252 } 253 254 /* 255 function to say what object we found and ask if player wants to take it 256 */ 257 finditem(itm) 258 int itm; 259 { 260 int tmp,i; 261 lprintf("\n\nYou have found %s ",objectname[itm]); 262 tmp=iarg[playerx][playery]; 263 switch(itm) 264 { 265 case ODIAMOND: case ORUBY: case OEMERALD: 266 case OSAPPHIRE: case OSPIRITSCARAB: case OORBOFDRAGON: 267 case OCUBEofUNDEAD: case ONOTHEFT: break; 268 269 default: 270 if (tmp>0) lprintf("+ %d",(long)tmp); else if (tmp<0) lprintf(" %d",(long)tmp); 271 } 272 lprcat("\nDo you want to (t) take it"); iopts(); 273 i=0; while (i!='t' && i!='i' && i!='\33') i=getchar(); 274 if (i == 't') 275 { lprcat("take"); if (take(itm,tmp)==0) forget(); return; } 276 ignore(); 277 } 278 279 280 /* 281 ******* 282 OSTAIRS 283 ******* 284 285 subroutine to process the stair cases 286 if dir > 0 the up else down 287 */ 288 ostairs(dir) 289 int dir; 290 { 291 register int k; 292 lprcat("\nDo you (s) stay here "); 293 if (dir > 0) lprcat("(u) go up "); else lprcat("(d) go down "); 294 lprcat("or (f) kick stairs? "); 295 296 while (1) switch(getchar()) 297 { 298 case '\33': 299 case 's': case 'i': lprcat("stay here"); return; 300 301 case 'f': lprcat("kick stairs"); 302 if (rnd(2) == 1) 303 lprcat("\nI hope you feel better. Showing anger rids you of frustration."); 304 else 305 { 306 k=rnd((level+1)<<1); 307 lprintf("\nYou hurt your foot dumb dumb! You suffer %d hit points",(long)k); 308 lastnum=276; losehp(k); bottomline(); 309 } 310 return; 311 312 case 'u': lprcat("go up"); 313 if (dir < 0) lprcat("\nThe stairs don't go up!"); 314 else 315 if (level>=2 && level!=11) 316 { 317 k = level; newcavelevel(level-1); 318 draws(0,MAXX,0,MAXY); bot_linex(); 319 } 320 else lprcat("\nThe stairs lead to a dead end!"); 321 return; 322 323 case 'd': lprcat("go down"); 324 if (dir > 0) lprcat("\nThe stairs don't go down!"); 325 else 326 if (level!=0 && level!=10 && level!=13) 327 { 328 k = level; newcavelevel(level+1); 329 draws(0,MAXX,0,MAXY); bot_linex(); 330 } 331 else lprcat("\nThe stairs lead to a dead end!"); 332 return; 333 }; 334 } 335 336 337 /* 338 ********* 339 OTELEPORTER 340 ********* 341 342 subroutine to handle a teleport trap +/- 1 level maximum 343 */ 344 oteleport(err) 345 int err; 346 { 347 register int tmp; 348 if (err) if (rnd(151)<3) died(264); /* stuck in a rock */ 349 c[TELEFLAG]=1; /* show ?? on bottomline if been teleported */ 350 if (level==0) tmp=0; 351 else if (level < MAXLEVEL) 352 { tmp=rnd(5)+level-3; if (tmp>=MAXLEVEL) tmp=MAXLEVEL-1; 353 if (tmp<1) tmp=1; } 354 else 355 { tmp=rnd(3)+level-2; if (tmp>=MAXLEVEL+MAXVLEVEL) tmp=MAXLEVEL+MAXVLEVEL-1; 356 if (tmp<MAXLEVEL) tmp=MAXLEVEL; } 357 playerx = rnd(MAXX-2); playery = rnd(MAXY-2); 358 if (level != tmp) newcavelevel(tmp); positionplayer(); 359 draws(0,MAXX,0,MAXY); bot_linex(); 360 } 361 362 /* 363 ******* 364 OPOTION 365 ******* 366 367 function to process a potion 368 */ 369 opotion(pot) 370 int pot; 371 { 372 lprcat("\nDo you (d) drink it, (t) take it"); iopts(); 373 while (1) switch(getchar()) 374 { 375 case '\33': 376 case 'i': ignore(); return; 377 378 case 'd': lprcat("drink\n"); forget(); /* destroy potion */ 379 quaffpotion(pot); return; 380 381 case 't': lprcat("take\n"); if (take(OPOTION,pot)==0) forget(); 382 return; 383 }; 384 } 385 386 /* 387 function to drink a potion 388 */ 389 quaffpotion(pot) 390 int pot; 391 { 392 register int i,j,k; 393 if (pot<0 || pot>=MAXPOTION) return; /* check for within bounds */ 394 potionname[pot][0] = ' '; 395 switch(pot) 396 { 397 case 9: lprcat("\nYou feel greedy . . ."); nap(2000); 398 for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++) 399 if ((item[j][i]==OGOLDPILE) || (item[j][i]==OMAXGOLD)) 400 { 401 know[j][i]=1; show1cell(j,i); 402 } 403 showplayer(); return; 404 405 case 19: lprcat("\nYou feel greedy . . ."); nap(2000); 406 for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++) 407 { 408 k=item[j][i]; 409 if ((k==ODIAMOND) || (k==ORUBY) || (k==OEMERALD) || (k==OMAXGOLD) 410 || (k==OSAPPHIRE) || (k==OLARNEYE) || (k==OGOLDPILE)) 411 { 412 know[j][i]=1; show1cell(j,i); 413 } 414 } 415 showplayer(); return; 416 417 case 20: c[HP] = c[HPMAX]; break; /* instant healing */ 418 419 case 1: lprcat("\nYou feel better"); 420 if (c[HP] == c[HPMAX]) raisemhp(1); 421 else if ((c[HP] += rnd(20)+20+c[LEVEL]) > c[HPMAX]) c[HP]=c[HPMAX]; break; 422 423 case 2: lprcat("\nSuddenly, you feel much more skillful!"); 424 raiselevel(); raisemhp(1); return; 425 426 case 3: lprcat("\nYou feel strange for a moment"); 427 c[rund(6)]++; break; 428 429 case 4: lprcat("\nYou feel more self confident!"); 430 c[WISDOM] += rnd(2); break; 431 432 case 5: lprcat("\nWow! You feel great!"); 433 if (c[STRENGTH]<12) c[STRENGTH]=12; else c[STRENGTH]++; break; 434 435 case 6: lprcat("\nYour charm went up by one!"); c[CHARISMA]++; break; 436 437 case 8: lprcat("\nYour intelligence went up by one!"); 438 c[INTELLIGENCE]++; break; 439 440 case 10: for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++) 441 if (mitem[j][i]) 442 { 443 know[j][i]=1; show1cell(j,i); 444 } 445 /* monster detection */ return; 446 447 case 12: lprcat("\nThis potion has no taste to it"); return; 448 449 case 15: lprcat("\nWOW!!! You feel Super-fantastic!!!"); 450 if (c[HERO]==0) for (i=0; i<6; i++) c[i] += 11; 451 c[HERO] += 250; break; 452 453 case 16: lprcat("\nYou have a greater intestinal constitude!"); 454 c[CONSTITUTION]++; break; 455 456 case 17: lprcat("\nYou now have incredibly bulging muscles!!!"); 457 if (c[GIANTSTR]==0) c[STREXTRA] += 21; 458 c[GIANTSTR] += 700; break; 459 460 case 18: lprcat("\nYou feel a chill run up your spine!"); 461 c[FIRERESISTANCE] += 1000; break; 462 463 case 0: lprcat("\nYou fall asleep. . ."); 464 i=rnd(11)-(c[CONSTITUTION]>>2)+2; while(--i>0) { parse2(); nap(1000); } 465 cursors(); lprcat("\nYou woke up!"); return; 466 467 case 7: lprcat("\nYou become dizzy!"); 468 if (--c[STRENGTH] < 3) c[STRENGTH]=3; break; 469 470 case 11: lprcat("\nYou stagger for a moment . ."); 471 for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++) 472 know[j][i]=0; 473 nap(2000); draws(0,MAXX,0,MAXY); /* potion of forgetfulness */ return; 474 475 case 13: lprcat("\nYou can't see anything!"); /* blindness */ 476 c[BLINDCOUNT]+=500; return; 477 478 case 14: lprcat("\nYou feel confused"); c[CONFUSE]+= 20+rnd(9); return; 479 480 case 21: lprcat("\nYou don't seem to be affected"); return; /* cure dianthroritis */ 481 482 case 22: lprcat("\nYou feel a sickness engulf you"); /* poison */ 483 c[HALFDAM] += 200 + rnd(200); return; 484 485 case 23: lprcat("\nYou feel your vision sharpen"); /* see invisible */ 486 c[SEEINVISIBLE] += rnd(1000)+400; 487 monstnamelist[INVISIBLESTALKER] = 'I'; return; 488 }; 489 bottomline(); /* show new stats */ return; 490 } 491 492 /* 493 ******* 494 OSCROLL 495 ******* 496 497 function to process a magic scroll 498 */ 499 oscroll(typ) 500 int typ; 501 { 502 lprcat("\nDo you "); 503 if (c[BLINDCOUNT]==0) lprcat("(r) read it, "); lprcat("(t) take it"); iopts(); 504 while (1) switch(getchar()) 505 { 506 case '\33': 507 case 'i': ignore(); return; 508 509 case 'r': if (c[BLINDCOUNT]) break; 510 lprcat("read"); forget(); 511 if (typ==2 || typ==15) { show1cell(playerx,playery); cursors(); } 512 /* destroy it */ read_scroll(typ); return; 513 514 case 't': lprcat("take"); if (take(OSCROLL,typ)==0) forget(); /* destroy it */ 515 return; 516 }; 517 } 518 519 /* 520 data for the function to read a scroll 521 */ 522 static int xh,yh,yl,xl; 523 static char curse[] = { BLINDCOUNT, CONFUSE, AGGRAVATE, HASTEMONST, ITCHING, 524 LAUGHING, DRAINSTRENGTH, CLUMSINESS, INFEEBLEMENT, HALFDAM }; 525 static char exten[] = { PROTECTIONTIME, DEXCOUNT, STRCOUNT, CHARMCOUNT, 526 INVISIBILITY, CANCELLATION, HASTESELF, GLOBE, SCAREMONST, HOLDMONST, TIMESTOP }; 527 char time_change[] = { HASTESELF,HERO,ALTPRO,PROTECTIONTIME,DEXCOUNT, 528 STRCOUNT,GIANTSTR,CHARMCOUNT,INVISIBILITY,CANCELLATION, 529 HASTESELF,AGGRAVATE,SCAREMONST,STEALTH,AWARENESS,HOLDMONST,HASTEMONST, 530 FIRERESISTANCE,GLOBE,SPIRITPRO,UNDEADPRO,HALFDAM,SEEINVISIBLE, 531 ITCHING,CLUMSINESS, WTW }; 532 /* 533 * function to adjust time when time warping and taking courses in school 534 */ 535 adjtime(tim) 536 register long tim; 537 { 538 register int j; 539 for (j=0; j<26; j++) /* adjust time related parameters */ 540 if (c[time_change[j]]) 541 if ((c[time_change[j]] -= tim) < 1) c[time_change[j]]=1; 542 regen(); 543 } 544 545 /* 546 function to read a scroll 547 */ 548 read_scroll(typ) 549 int typ; 550 { 551 register int i,j; 552 if (typ<0 || typ>=MAXSCROLL) return; /* be sure we are within bounds */ 553 scrollname[typ][0] = ' '; 554 switch(typ) 555 { 556 case 0: lprcat("\nYour armor glows for a moment"); enchantarmor(); return; 557 558 case 1: lprcat("\nYour weapon glows for a moment"); enchweapon(); return; /* enchant weapon */ 559 560 case 2: lprcat("\nYou have been granted enlightenment!"); 561 yh = min(playery+7,MAXY); xh = min(playerx+25,MAXX); 562 yl = max(playery-7,0); xl = max(playerx-25,0); 563 for (i=yl; i<yh; i++) for (j=xl; j<xh; j++) know[j][i]=1; 564 nap(2000); draws(xl,xh,yl,yh); return; 565 566 case 3: lprcat("\nThis scroll seems to be blank"); return; 567 568 case 4: createmonster(makemonst(level+1)); return; /* this one creates a monster */ 569 570 case 5: something(level); /* create artifact */ return; 571 572 case 6: c[AGGRAVATE]+=800; return; /* aggravate monsters */ 573 574 case 7: gtime += (i = rnd(1000) - 850); /* time warp */ 575 if (i>=0) lprintf("\nYou went forward in time by %d mobuls",(long)((i+99)/100)); 576 else lprintf("\nYou went backward in time by %d mobuls",(long)(-(i+99)/100)); 577 adjtime((long)i); /* adjust time for time warping */ 578 return; 579 580 case 8: oteleport(0); return; /* teleportation */ 581 582 case 9: c[AWARENESS] += 1800; return; /* expanded awareness */ 583 584 case 10: c[HASTEMONST] += rnd(55)+12; return; /* haste monster */ 585 586 case 11: for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++) 587 if (mitem[j][i]) 588 hitp[j][i] = monster[mitem[j][i]].hitpoints; 589 return; /* monster healing */ 590 case 12: c[SPIRITPRO] += 300 + rnd(200); bottomline(); return; /* spirit protection */ 591 592 case 13: c[UNDEADPRO] += 300 + rnd(200); bottomline(); return; /* undead protection */ 593 594 case 14: c[STEALTH] += 250 + rnd(250); bottomline(); return; /* stealth */ 595 596 case 15: lprcat("\nYou have been granted enlightenment!"); /* magic mapping */ 597 for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++) know[j][i]=1; 598 nap(2000); draws(0,MAXX,0,MAXY); return; 599 600 case 16: c[HOLDMONST] += 30; bottomline(); return; /* hold monster */ 601 602 case 17: for (i=0; i<26; i++) /* gem perfection */ 603 switch(iven[i]) 604 { 605 case ODIAMOND: case ORUBY: 606 case OEMERALD: case OSAPPHIRE: 607 j = ivenarg[i]; j &= 255; j <<= 1; 608 if (j > 255) j=255; /* double value */ 609 ivenarg[i] = j; break; 610 } 611 break; 612 613 case 18: for (i=0; i<11; i++) c[exten[i]] <<= 1; /* spell extension */ 614 break; 615 616 case 19: for (i=0; i<26; i++) /* identify */ 617 { 618 if (iven[i]==OPOTION) potionname[ivenarg[i]][0] = ' '; 619 if (iven[i]==OSCROLL) scrollname[ivenarg[i]][0] = ' '; 620 } 621 break; 622 623 case 20: for (i=0; i<10; i++) /* remove curse */ 624 if (c[curse[i]]) c[curse[i]] = 1; 625 break; 626 627 case 21: annihilate(); break; /* scroll of annihilation */ 628 629 case 22: godirect(22,150,"The ray hits the %s",0,' '); /* pulverization */ 630 break; 631 case 23: c[LIFEPROT]++; break; /* life protection */ 632 }; 633 } 634 635 636 oorb() 637 { 638 } 639 640 opit() 641 { 642 register int i; 643 if (rnd(101)<81) 644 if (rnd(70) > 9*c[DEXTERITY]-packweight() || rnd(101)<5) 645 if (level==MAXLEVEL-1) obottomless(); else 646 if (level==MAXLEVEL+MAXVLEVEL-1) obottomless(); else 647 { 648 if (rnd(101)<20) 649 { 650 i=0; lprcat("\nYou fell into a pit! Your fall is cushioned by an unknown force\n"); 651 } 652 else 653 { 654 i = rnd(level*3+3); 655 lprintf("\nYou fell into a pit! You suffer %d hit points damage",(long)i); 656 lastnum=261; /* if he dies scoreboard will say so */ 657 } 658 losehp(i); nap(2000); newcavelevel(level+1); draws(0,MAXX,0,MAXY); 659 } 660 } 661 662 obottomless() 663 { 664 lprcat("\nYou fell into a bottomless pit!"); beep(); nap(3000); died(262); 665 } 666 oelevator(dir) 667 int dir; 668 { 669 #ifdef lint 670 int x; 671 x=dir; 672 dir=x; 673 #endif lint 674 } 675 676 ostatue() 677 { 678 } 679 680 omirror() 681 { 682 } 683 684 obook() 685 { 686 lprcat("\nDo you "); 687 if (c[BLINDCOUNT]==0) lprcat("(r) read it, "); lprcat("(t) take it"); iopts(); 688 while (1) switch(getchar()) 689 { 690 case '\33': 691 case 'i': ignore(); return; 692 693 case 'r': if (c[BLINDCOUNT]) break; 694 lprcat("read"); 695 /* no more book */ readbook(iarg[playerx][playery]); forget(); return; 696 697 case 't': lprcat("take"); if (take(OBOOK,iarg[playerx][playery])==0) forget(); /* no more book */ 698 return; 699 }; 700 } 701 702 /* 703 function to read a book 704 */ 705 readbook(lev) 706 register int lev; 707 { 708 register int i,tmp; 709 if (lev<=3) i = rund((tmp=splev[lev])?tmp:1); else 710 i = rnd((tmp=splev[lev]-9)?tmp:1) + 9; 711 spelknow[i]=1; 712 lprintf("\nSpell \"%s\": %s\n%s",spelcode[i],spelname[i],speldescript[i]); 713 if (rnd(10)==4) 714 { lprcat("\nYour int went up by one!"); c[INTELLIGENCE]++; bottomline(); } 715 } 716 717 ocookie() 718 { 719 char *p; 720 lprcat("\nDo you (e) eat it, (t) take it"); iopts(); 721 while (1) switch(getchar()) 722 { 723 case '\33': 724 case 'i': ignore(); return; 725 726 case 'e': lprcat("eat\nThe cookie tasted good."); 727 forget(); /* no more cookie */ 728 if (c[BLINDCOUNT]) return; 729 if (!(p=fortune(fortfile))) return; 730 lprcat(" A message inside the cookie reads:\n"); lprcat(p); 731 return; 732 733 case 't': lprcat("take"); if (take(OCOOKIE,0)==0) forget(); /* no more book */ 734 return; 735 }; 736 } 737 738 739 /* routine to pick up some gold -- if arg==OMAXGOLD then the pile is worth 100* the argument */ 740 ogold(arg) 741 int arg; 742 { 743 register long i; 744 i = iarg[playerx][playery]; 745 if (arg==OMAXGOLD) i *= 100; 746 else if (arg==OKGOLD) i *= 1000; 747 else if (arg==ODGOLD) i *= 10; 748 lprintf("\nIt is worth %d!",(long)i); c[GOLD] += i; bottomgold(); 749 item[playerx][playery] = know[playerx][playery] = 0; /* destroy gold */ 750 } 751 752 ohome() 753 { 754 register int i; 755 nosignal = 1; /* disable signals */ 756 for (i=0; i<26; i++) if (iven[i]==OPOTION) if (ivenarg[i]==21) 757 { 758 iven[i]=0; /* remove the potion of cure dianthroritis from inventory */ 759 clear(); lprcat("Congratulations. You found a potion of cure dianthroritis.\n"); 760 lprcat("\nFrankly, No one thought you could do it. Boy! Did you surprise them!\n"); 761 if (gtime>TIMELIMIT) 762 { 763 lprcat("\nThe doctor has the sad duty to inform you that your daughter died!\n"); 764 lprcat("You didn't make it in time. In your agony, you kill the doctor,\nyour wife, and yourself! Too bad!\n"); 765 nap(5000); died(269); 766 } 767 else 768 { 769 lprcat("\nThe doctor is now administering the potion, and in a few moments\n"); 770 lprcat("Your daughter should be well on her way to recovery.\n"); 771 nap(6000); 772 lprcat("\nThe potion is"); nap(3000); lprcat(" working! The doctor thinks that\n"); 773 lprcat("your daughter will recover in a few days. Congratulations!\n"); 774 beep(); nap(5000); died(263); 775 } 776 } 777 778 while (1) 779 { 780 clear(); lprintf("Welcome home %s. Latest word from the doctor is not good.\n",logname); 781 782 if (gtime>TIMELIMIT) 783 { 784 lprcat("\nThe doctor has the sad duty to inform you that your daughter died!\n"); 785 lprcat("You didn't make it in time. In your agony, you kill the doctor,\nyour wife, and yourself! Too bad!\n"); 786 nap(5000); died(269); 787 } 788 789 lprcat("\nThe diagnosis is confirmed as dianthroritis. He guesses that\n"); 790 lprintf("your daughter has only %d mobuls left in this world. It's up to you,\n",(long)((TIMELIMIT-gtime+99)/100)); 791 lprintf("%s, to find the only hope for your daughter, the very rare\n",logname); 792 lprcat("potion of cure dianthroritis. It is rumored that only deep in the\n"); 793 lprcat("depths of the caves can this potion be found.\n\n\n"); 794 lprcat("\n ----- press "); standout("return"); 795 lprcat(" to continue, "); standout("escape"); 796 lprcat(" to leave ----- "); 797 i=getchar(); while (i!='\33' && i!='\n') i=getchar(); 798 if (i=='\33') { drawscreen(); nosignal = 0; /* enable signals */ return; } 799 } 800 } 801 802 /* routine to save program space */ 803 iopts() 804 { lprcat(", or (i) ignore it? "); } 805 ignore() 806 { lprcat("ignore\n"); } 807 808