void oelevator(int dir) { if (dir==1) { if (level == 0) { lprcat(",\nunfortunately, it is out of order."); return; } playerx = rnd(MAXX-2); playery = rnd(MAXY-2); nap(2000); newcavelevel(rund(level)); } else { if (level==DBOTTOM || level==VBOTTOM) { nap(2000); lprcat("\nand it leads straight to HELL!"); beep(); lflush(); nap(3000); died(287); } playerx = rnd(MAXX-2); playery = rnd(MAXY-2); nap(2000); newcavelevel(level + rnd(DBOTTOM - level)); } positionplayer(); draws(0,MAXX,0,MAXY); bot_linex(); }
/* ********* OTELEPORT ********* subroutine to handle a teleport trap +/- 1 level maximum */ void oteleport(int err) { int tmp; if (err) if (rnd(151)<3) died(264); /* stuck in a rock */ /*show ?? on bottomline if been teleported */ if (!wizard) c[TELEFLAG]=1; if (level==0) tmp=0; else if (level <= DBOTTOM) { /* in dungeon */ tmp=rnd(5)+level-3; if (tmp>DBOTTOM) tmp=DBOTTOM; if (tmp<0) tmp=0; } else { /* in volcano */ tmp=rnd(4)+level-2; if (tmp>=VBOTTOM) tmp=VBOTTOM; if (tmp<DBOTTOM+1) tmp=0; /* back to surface */ } playerx = rnd(MAXX-2); playery = rnd(MAXY-2); if (level != tmp) newcavelevel(tmp); positionplayer(); draws(0,MAXX,0,MAXY); bot_linex(); }
void opit() { int i; if (rnd(101)>81) return; if (rnd(70) > 9*c[DEXTERITY]-packweight() || rnd(101)<5) { for (i=0;i<IVENSIZE;i++) if (iven[i]==OWWAND) { lprcat("\nYou float right over the pit."); return; } if (level==DBOTTOM || level == VBOTTOM) obottomless(); else { if (rnd(101)<20) { i=0; lprcat("\nYou fell ino a pit! " "A poor monster cushions your fall!\n"); } else { i = rnd(level*3+3); if (i > c[HP]) i = c[HP]; lprintf("\nYou fell into a pit! " "You suffer %d hit point%s damage.",(long)i, (i==1)?"":"s"); lastnum=261; /* if he dies scoreboard will say so */ } losehp(i); lflush(); nap(2000); newcavelevel(level+1); draws(0,MAXX,0,MAXY); } } }
/* assumes that cursors() has been called and that a check has been made that the user is actually standing at a set of down stairs. */ void act_down_stairs(void) { if (level != 0 && level != 10 && level != 13) { newcavelevel( level + 1 ) ; draws( 0, MAXX, 0, MAXY ); bot_linex() ; } else { lprcat("\nThe stairs lead to a dead end!"); } }
/* assumes that cursors() has been called and that a check has been made that the user is actually standing at a set of up stairs. */ void act_up_stairs(void) { if (level >= 2 && level != 11) { newcavelevel( level - 1 ) ; draws( 0, MAXX, 0, MAXY ); bot_linex() ; } else { lprcat("\nThe stairs lead to a dead end!"); } }
/* Perform the act of climbing down the volcanic shaft. Assumes cursors() has been called and that a check has been made that are actually at a down shaft. */ void act_down_shaft(void) { if (level!=0) { lprcat("\nThe shaft only extends 5 feet downward!"); return; } if (packweight() > 45+3*(c[STRENGTH]+c[STREXTRA])) { lprcat("\nYou slip and fall down the shaft"); lastnum=275; losehp(30+rnd(20)); bottomhp(); } newcavelevel(MAXLEVEL); draws(0,MAXX,0,MAXY); bot_linex(); return; }
/* Perform the action of climbing up the volcanic shaft. Assumes cursors() has been called and that a check has been made that are actually at an up shaft. */ void act_up_shaft(void) { if (level!=11) { lprcat("\nThe shaft only extends 8 feet upwards before you find a blockage!"); return; } if (packweight() > 45+5*(c[STRENGTH]+c[STREXTRA])) { lprcat("\nYou slip and fall down the shaft"); lastnum=275; losehp(15+rnd(20)); bottomhp(); return; } lflush(); newcavelevel(0); volshaft_climbed( OVOLDOWN ); return; }
void diag(void) { int i, j; if ((dfile = fopen(diagfile, "w")) == (FILE *)NULL) return; lprcat("\nDiagnosing . . .\n"); lflush(); fprintf(dfile,"\n-------- Beginning of DIAG diagnostics ---------\n\n"); fprintf(dfile, "Hit points: %2ld(%2ld)\n", c[HP], c[HPMAX]); fprintf(dfile, "gold: %ld Experience: %ld Character level: %ld Level in caverns: %d\n", (long) c[GOLD], (long) c[EXPERIENCE], (long) c[LEVEL], level); fprintf(dfile, "\nFor the c[] array:\n"); fflush(dfile); for( j=0; j<100; j++) fprintf(dfile, "c[%d]\t%-20s\t= %ld\n", j, cdef[j], c[j]); fprintf(dfile, "\n\n"); fflush(dfile); fprintf(dfile, "Inventory\n"); for (j=0; j<IVENSIZE; j++) { fprintf (dfile, "iven[%d] %-12s = %d", j, ivendef[iven[j]], iven[j] ); fprintf (dfile, "\t%s", objectname[iven[j]] ); fprintf (dfile, "\t+ %d\n", ivenarg[j] ); } fprintf(dfile, "\nHere are the maps:\n\n"); monstnamelist[DEMONLORD] = '1'; monstnamelist[DEMONLORD+1] = '2'; monstnamelist[DEMONLORD+2] = '3'; monstnamelist[DEMONLORD+3] = '4'; monstnamelist[DEMONLORD+4] = '5'; monstnamelist[DEMONLORD+5] = '6'; monstnamelist[DEMONLORD+6] = '7'; monstnamelist[DEMONPRINCE] = '9'; monstnamelist[LUCIFER] = '0'; i = level; for (j = 0; j < NLEVELS; j++) { newcavelevel(j); fprintf(dfile, "\n-------------------------------------------------------------------\n"); fprintf(dfile, "Map %s level %d\n", levelname[level], level); fprintf(dfile, "-------------------------------------------------------------------\n"); diagdrawscreen(); fflush(dfile); } level = i; getlevel(); fprintf(dfile, "\n\nNow for the monster data:\n\n"); fprintf(dfile, "\nTotal types of monsters: %d\n\n", MAXMONST + 8); fprintf(dfile, " Monster Name LEV AC DAM ATT GOLD HP EXP\n"); fprintf(dfile, "-----------------------------------------------------------------\n"); fflush(dfile); for (i = 0; i <= MAXMONST + 8; i++) { fprintf(dfile, "%19s %2d %3d ", monster[i].name, monster[i].level, monster[i].armorclass); fprintf(dfile, " %3d %3d ", monster[i].damage, monster[i].attack); fprintf(dfile, "%6d %3d %6ld\n", monster[i].gold, monster[i].hitpoints, (long) monster[i].experience); fflush(dfile); } fprintf(dfile, "\nAvailable potions:\n\n"); for (i = 0; i < MAXPOTION; i++) fprintf(dfile, "%20s\n", &potionname[i][1]); fflush(dfile); fprintf(dfile, "\nAvailable scrolls:\n\n"); for (i = 0; i < MAXSCROLL; i++) fprintf(dfile, "%20s\n", &scrollname[i][1]); fflush(dfile); fprintf(dfile, "\nSpell list:\n\n"); fprintf(dfile, "spell# name description\n"); fprintf(dfile, "-------------------------------------------------\n\n"); for (j = 0; j < SPNUM; j++) { fprintf(dfile, "%-10s", spelcode[j]); fprintf(dfile," %21s\n", spelname[j]); fprintf(dfile,"%s\n", speldescript[j]); } fflush(dfile); fprintf(dfile, "\nObject list\n\n"); fprintf(dfile, "\nj \tObject \tName\n"); fprintf(dfile, "---------------------------------\n"); for (j = 0; j < MAXOBJ; j++) fprintf(dfile, "%d \t%c \t%s\n", j, objnamelist[j], objectname[j] ); fflush(dfile); fprintf(dfile,"\n-------- End of DIAG diagnostics ---------\n"); fflush(dfile); fclose(dfile); lprcat("\nDone Diagnosing.\n"); lflush(); }
/* *************** LOOK_FOR_OBJECT *************** subroutine to look for an object and give the player his options if an object was found. */ lookforobject() { register int i,j; if (c[TIMESTOP]) return; /* can't find objects is time is stopped */ i=item[playerx][playery]; if (i==0) return; showcell(playerx,playery); cursors(); yrepcount=0; switch(i) { case OGOLDPILE: case OMAXGOLD: case OKGOLD: case ODGOLD: lprcat("\n\nYou have found some gold!"); ogold(i); break; case OPOTION: lprcat("\n\nYou have found a magic potion"); i = iarg[playerx][playery]; if (potionname[i][0]) lprintf(" of %s",&potionname[i][1]); opotion(i); break; case OSCROLL: lprcat("\n\nYou have found a magic scroll"); i = iarg[playerx][playery]; if (scrollname[i][0]) lprintf(" of %s",&scrollname[i][1]); oscroll(i); break; case OALTAR: if (nearbymonst()) return; lprcat("\n\nThere is a Holy Altar here!"); oaltar(); break; case OBOOK: lprcat("\n\nYou have found a book."); obook(); break; case OCOOKIE: lprcat("\n\nYou have found a fortune cookie."); ocookie(); break; case OTHRONE: if (nearbymonst()) return; lprintf("\n\nThere is %s here!",objectname[i]); othrone(0); break; case OTHRONE2: if (nearbymonst()) return; lprintf("\n\nThere is %s here!",objectname[i]); othrone(1); break; case ODEADTHRONE: lprintf("\n\nThere is %s here!",objectname[i]); odeadthrone(); break; case OORB: lprcat("\n\nYou have found the Orb!!!!!"); oorb(); break; case OPIT: lprcat("\n\nYou're standing at the top of a pit."); opit(); break; case OSTAIRSUP: lprcat("\n\nThere is a circular staircase here"); ostairs(1); /* up */ break; case OELEVATORUP: lprcat("\n\nYou feel heavy for a moment, but the feeling disappears"); oelevator(1); /* up */ break; case OFOUNTAIN: if (nearbymonst()) return; lprcat("\n\nThere is a fountain here"); ofountain(); break; case OSTATUE: if (nearbymonst()) return; lprcat("\n\nYou are standing in front of a statue"); ostatue(); break; case OCHEST: lprcat("\n\nThere is a chest here"); ochest(); break; case OIVTELETRAP: if (rnd(11)<6) return; item[playerx][playery] = OTELEPORTER; know[playerx][playery] = 1; case OTELEPORTER: lprcat("\nZaaaappp! You've been teleported!\n"); beep(); nap(3000); oteleport(0); break; case OSCHOOL: if (nearbymonst()) return; lprcat("\n\nYou have found the College of Larn."); lprcat("\nDo you (g) go inside, or (i) stay here? "); i=0; while ((i!='g') && (i!='i') && (i!='\33')) i=getchar(); if (i == 'g') { oschool(); /* the college of larn */ } else lprcat(" stay here"); break; case OMIRROR: if (nearbymonst()) return; lprcat("\n\nThere is a mirror here"); omirror(); break; case OBANK2: case OBANK: if (nearbymonst()) return; if (i==OBANK) lprcat("\n\nYou have found the bank of Larn."); else lprcat("\n\nYou have found a branch office of the bank of Larn."); lprcat("\nDo you (g) go inside, or (i) stay here? "); j=0; while ((j!='g') && (j!='i') && (j!='\33')) j=getchar(); if (j == 'g') { if (i==OBANK) obank(); else obank2(); /* the bank of larn */ } else lprcat(" stay here"); break; case ODEADFOUNTAIN: if (nearbymonst()) return; lprcat("\n\nThere is a dead fountain here"); break; case ODNDSTORE: if (nearbymonst()) return; lprcat("\n\nThere is a DND store here."); lprcat("\nDo you (g) go inside, or (i) stay here? "); i=0; while ((i!='g') && (i!='i') && (i!='\33')) i=getchar(); if (i == 'g') dndstore(); /* the dnd adventurers store */ else lprcat(" stay here"); break; case OSTAIRSDOWN: lprcat("\n\nThere is a circular staircase here"); ostairs(-1); /* down */ break; case OELEVATORDOWN: lprcat("\n\nYou feel light for a moment, but the feeling disappears"); oelevator(-1); /* down */ break; case OOPENDOOR: lprintf("\n\nYou have found %s",objectname[i]); lprcat("\nDo you (c) close it"); iopts(); i=0; while ((i!='c') && (i!='i') && (i!='\33')) i=getchar(); if ((i=='\33') || (i=='i')) { ignore(); break; } lprcat("close"); forget(); item[playerx][playery]=OCLOSEDDOOR; iarg[playerx][playery]=0; playerx = lastpx; playery = lastpy; break; case OCLOSEDDOOR: lprintf("\n\nYou have found %s",objectname[i]); lprcat("\nDo you (o) try to open it"); iopts(); i=0; while ((i!='o') && (i!='i') && (i!='\33')) i=getchar(); if ((i=='\33') || (i=='i')) { ignore(); playerx = lastpx; playery = lastpy; break; } else { lprcat("open"); if (rnd(11)<7) { switch(iarg[playerx][playery]) { case 6: c[AGGRAVATE] += rnd(400); break; case 7: lprcat("\nYou are jolted by an electric shock "); lastnum=274; losehp(rnd(20)); bottomline(); break; case 8: loselevel(); break; case 9: lprcat("\nYou suddenly feel weaker "); if (c[STRENGTH]>3) c[STRENGTH]--; bottomline(); break; default: break; } playerx = lastpx; playery = lastpy; } else { forget(); item[playerx][playery]=OOPENDOOR; } } break; case OENTRANCE: lprcat("\nYou have found "); lprcat(objectname[OENTRANCE]); lprcat("\nDo you (g) go inside"); iopts(); i=0; while ((i!='g') && (i!='i') && (i!='\33')) i=getchar(); if (i == 'g') { newcavelevel(1); playerx=33; playery=MAXY-2; item[33][MAXY-1]=know[33][MAXY-1]=mitem[33][MAXY-1]=0; draws(0,MAXX,0,MAXY); bot_linex(); return; } else ignore(); break; case OVOLDOWN: lprcat("\nYou have found "); lprcat(objectname[OVOLDOWN]); lprcat("\nDo you (c) climb down"); iopts(); i=0; while ((i!='c') && (i!='i') && (i!='\33')) i=getchar(); if ((i=='\33') || (i=='i')) { ignore(); break; } if (level!=0) { lprcat("\nThe shaft only extends 5 feet downward!"); return; } if (packweight() > 45+3*(c[STRENGTH]+c[STREXTRA])) { lprcat("\nYou slip and fall down the shaft"); beep(); lastnum=275; losehp(30+rnd(20)); bottomhp(); } else lprcat("climb down"); nap(3000); newcavelevel(MAXLEVEL); for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++) /* put player near volcano shaft */ if (item[j][i]==OVOLUP) { playerx=j; playery=i; j=MAXX; i=MAXY; positionplayer(); } draws(0,MAXX,0,MAXY); bot_linex(); return; case OVOLUP: lprcat("\nYou have found "); lprcat(objectname[OVOLUP]); lprcat("\nDo you (c) climb up"); iopts(); i=0; while ((i!='c') && (i!='i') && (i!='\33')) i=getchar(); if ((i=='\33') || (i=='i')) { ignore(); break; } if (level!=11) { lprcat("\nThe shaft only extends 8 feet upwards before you find a blockage!"); return; } if (packweight() > 45+5*(c[STRENGTH]+c[STREXTRA])) { lprcat("\nYou slip and fall down the shaft"); beep(); lastnum=275; losehp(15+rnd(20)); bottomhp(); return; } lprcat("climb up"); lflush(); nap(3000); newcavelevel(0); for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++) /* put player near volcano shaft */ if (item[j][i]==OVOLDOWN) { playerx=j; playery=i; j=MAXX; i=MAXY; positionplayer(); } draws(0,MAXX,0,MAXY); bot_linex(); return; case OTRAPARROWIV: if (rnd(17)<13) return; /* for an arrow trap */ item[playerx][playery] = OTRAPARROW; know[playerx][playery] = 0; case OTRAPARROW: lprcat("\nYou are hit by an arrow"); beep(); /* for an arrow trap */ lastnum=259; losehp(rnd(10)+level); bottomhp(); return; case OIVDARTRAP: if (rnd(17)<13) return; /* for a dart trap */ item[playerx][playery] = ODARTRAP; know[playerx][playery] = 0; case ODARTRAP: lprcat("\nYou are hit by a dart"); beep(); /* for a dart trap */ lastnum=260; losehp(rnd(5)); if ((--c[STRENGTH]) < 3) c[STRENGTH] = 3; bottomline(); return; case OIVTRAPDOOR: if (rnd(17)<13) return; /* for a trap door */ item[playerx][playery] = OTRAPDOOR; know[playerx][playery] = 1; case OTRAPDOOR: lastnum = 272; /* a trap door */ if ((level==MAXLEVEL-1) || (level==MAXLEVEL+MAXVLEVEL-1)) { lprcat("\nYou fell through a bottomless trap door!"); beep(); nap(3000); died(271); } lprcat("\nYou fall through a trap door!"); beep(); /* for a trap door */ losehp(rnd(5+level)); nap(2000); newcavelevel(level+1); draws(0,MAXX,0,MAXY); bot_linex(); return; case OTRADEPOST: if (nearbymonst()) return; lprcat("\nYou have found the Larn trading Post."); lprcat("\nDo you (g) go inside, or (i) stay here? "); i=0; while ((i!='g') && (i!='i') && (i!='\33')) i=getchar(); if (i == 'g') otradepost(); else lprcat("stay here"); return; case OHOME: if (nearbymonst()) return; lprcat("\nYou have found your way home."); lprcat("\nDo you (g) go inside, or (i) stay here? "); i=0; while ((i!='g') && (i!='i') && (i!='\33')) i=getchar(); if (i == 'g') ohome(); else lprcat("stay here"); return; case OWALL: break; case OANNIHILATION: died(283); return; /* annihilated by sphere of annihilation */ case OLRS: if (nearbymonst()) return; lprcat("\n\nThere is an LRS office here."); lprcat("\nDo you (g) go inside, or (i) stay here? "); i=0; while ((i!='g') && (i!='i') && (i!='\33')) i=getchar(); if (i == 'g') olrs(); /* the larn revenue service */ else lprcat(" stay here"); break; default: finditem(i); break; }; }
/* *************** LOOK_FOR_OBJECT *************** subroutine to look for an object and give the player his options if an object was found. */ lookforobject() { int i,j; /* can't find objects is time is stopped*/ if (c[TIMESTOP]) return; i=item[playerx][playery]; if (i==0) return; showcell(playerx,playery); cursors(); yrepcount=0; switch(i) { case OGOLDPILE: case OMAXGOLD: case OKGOLD: case ODGOLD: ogold(i); break; case OPOTION: lprcat("\n\nYou find a magic potion"); i = iarg[playerx][playery]; if (potionknown[i]) lprintf(" of %s",&potionname[i][1]); lprcat("."); opotion(i); break; case OSCROLL: lprcat("\n\nYou find a magic scroll"); i = iarg[playerx][playery]; if (scrollknown[i]) lprintf(" of %s",&scrollname[i][1]); lprcat("."); oscroll(i); break; case OALTAR: if (nearbymonst()) return; lprcat("\n\nThere is a holy altar here."); oaltar(); break; case OBOOK: lprcat("\n\nYou find a book."); obook(); break; case OCOOKIE: lprcat("\n\nYou find a fortune cookie."); ocookie(); break; case OTHRONE: if (nearbymonst()) return; lprintf("\n\nThere is %s here.",objectname[i]); othrone(0); break; case OTHRONE2: if (nearbymonst()) return; lprintf("\n\nThere is %s here.",objectname[i]); othrone(1); break; case ODEADTHRONE: lprintf("\n\nThere is %s here.",objectname[i]); odeadthrone(); break; case OORB: if (nearbymonst()) return; finditem(i); break; case OBRASSLAMP: lprcat("\nYou find a brass lamp."); lprcat("\nDo you want to (r) rub it, (t) take it, or (i) ignore it? "); i=0; while ((i!='r') && (i!='i') && (i!='t') && (i!=ESC)) i=getcharacter(); if (i=='r') { i=rnd(100); if (i>90) { lprcat("\nThe magic genie was very upset at being disturbed!"); lastnum = 286; losehp((int)c[HP]/2+1); beep(); } /* higher level, better chance of spell */ else if ( (rnd(100)+c[LEVEL]/2) > 80) { int a,b,d; lprcat("\nA magic genie appears!"); cursors(); lprcat("\n What spell would you like? : "); while ((a=getcharacter())=='D') { seemagic(99); cursors(); lprcat("\n What spell would you like? : "); } /* to escape casting a spell */ if (a==ESC) goto over; if ((b=getcharacter())==ESC) goto over; if ((d=getcharacter())==ESC) { over: lprcat("aborted"); return; } lprc('\n'); for (i=0; i<SPNUM; i++) if ((spelcode[i][0]==a) && (spelcode[i][1]==b) && (spelcode[i][2]==d)) { spelknow[i]=1; lprintf("\nSpell \"%s\": %s\n%s",spelcode[i], spelname[i],speldescript[i]); lprcat("\nThe genie prefers not to be disturbed " "again."); forget(); bottomline(); return; } lprcat("\nThe genie has never heard of such a spell!"); lprcat("\nThe genie prefers not to be disturbed again."); forget(); bottomline(); return; } else lprcat("\nnothing happened."); if (rnd(100) < 15) { lprcat("\nThe genie prefers not to be disturbed again!"); forget(); c[LAMP]=0; /* chance of finding lamp again */ } bottomline(); } else if (i=='t') { lprcat("take."); if (take(OBRASSLAMP,0)==0) forget(); } else lprcat("ignore."); return; case OWWAND: if (nearbymonst()) return; finditem(i); break; case OHANDofFEAR: if (nearbymonst()) return; finditem(i); break; case OPIT: lprcat("\n\nYou're standing at the top of a pit."); opit(); break; case OSTAIRSUP: lprcat("\n\nThere is a circular staircase here."); ostairs(1); /* up */ break; case OELEVATORUP: lprcat("\n\nYou have found an express elevator going up."); oelevator(1); /* up */ break; case OELEVATORDOWN: lprcat("\n\nYou have found an express elevator going down."); oelevator(-1); /* down */ break; case OFOUNTAIN: if (nearbymonst()) return; lprcat("\n\nThere is a fountain here."); ofountain(); break; case OSTATUE: if (nearbymonst()) return; lprcat("\n\nYou stand before a statue."); ostatue(); break; case OCHEST: lprcat("\n\nThere is a chest here."); ochest(); break; case OIVTELETRAP: if (rnd(11)<6) return; item[playerx][playery] = OTELEPORTER; know[playerx][playery] = 1; case OTELEPORTER: lprcat("\nZaaaappp! You've been teleported!\n"); beep(); nap(3000); oteleport(0); break; case OSCHOOL: if (nearbymonst()) return; lprcat("\n\nYou have found the College of Ularn."); lprcat("\nDo you (g) go inside, or (i) stay here? "); i=0; while ((i!='g') && (i!='i') && (i!=ESC)) i=getcharacter(); if (i == 'g') { oschool(); /* the college of larn */ } else lprcat(" stay here."); break; case OMIRROR: if (nearbymonst()) return; lprcat("\n\nThere is a mirror here."); omirror(); break; case OBANK2: case OBANK: if (nearbymonst()) return; if (i==OBANK) lprcat("\n\nYou have found the bank of Ularn."); else lprcat("\n\nYou have found a branch office of the bank of Ularn."); lprcat("\nDo you (g) go inside, or (i) stay here? "); j=0; while ((j!='g') && (j!='i') && (j!=ESC)) j=getcharacter(); if (j == 'g') { if (i==OBANK) obank(); else obank2(); /* the bank of larn */ } else lprcat(" stay here."); break; case ODEADFOUNTAIN: if (nearbymonst()) return; lprcat("\n\nThere is a dead fountain here."); break; case ODNDSTORE: if (nearbymonst()) return; lprcat("\n\nThere is a DND store here."); lprcat("\nDo you (g) go inside, or (i) stay here? "); i=0; while ((i!='g') && (i!='i') && (i!=ESC)) i=getcharacter(); if (i == 'g') dndstore(); /* the dnd adventurers store */ else lprcat(" stay here."); break; case OSTAIRSDOWN: lprcat("\n\nThere is a circular staircase here."); ostairs(-1); /* down */ break; case OOPENDOOR: lprcat("\nThere is an open door here."); break; case OCLOSEDDOOR: if (dropflag) return; lprintf("\n\nYou find %s",objectname[i]); lprcat("\nDo you (o) try to open it"); iopts(); i=0; while ((i!='o') && (i!='i') && (i!=ESC)) i=getcharacter(); if ((i==ESC) || (i=='i')) { ignore(); playerx = lastpx; playery = lastpy; break; } else { lprcat("open."); if (rnd(11)<7) { switch(iarg[playerx][playery]) { case 6: c[AGGRAVATE] += rnd(400); break; case 7: case 8: lprcat("\nYou are jolted by an electric shock!"); lastnum=274; losehp(rnd(20)); bottomline(); break; /* Losing a level is just too harsh... */ /* case 8: loselevel(); break; */ case 9: lprcat("\nYou suddenly feel weaker!"); if (c[STRENGTH]>3) c[STRENGTH]--; bottomline(); break; default: break; } playerx = lastpx; playery = lastpy; } else { forget(); item[playerx][playery]=OOPENDOOR; } } break; case OENTRANCE: lprcat("\nYou have found "); lprcat(objectname[OENTRANCE]); lprcat("\nDo you (g) go inside"); iopts(); i=0; while ((i!='g') && (i!='i') && (i!=ESC)) i=getcharacter(); if (i == 'g') { newcavelevel(1); playerx=33; playery=MAXY-2; item[33][MAXY-1]=know[33][MAXY-1]=mitem[33][MAXY-1].mon=0; draws(0,MAXX,0,MAXY); bot_linex(); return; } else ignore(); break; case OVOLDOWN: lprcat("\nYou have found "); lprcat(objectname[OVOLDOWN]); lprcat("\nDo you (c) climb down"); iopts(); i=0; while ((i!='c') && (i!='i') && (i!=ESC)) i=getcharacter(); if ((i==ESC) || (i=='i')) { ignore(); break; } if (level!=0) { lprcat("\nThe shaft only extends 5 feet downward!"); return; } if (packweight() > 45+3*(c[STRENGTH]+c[STREXTRA])) { lprcat("\nYou slip and fall down the shaft."); beep(); lastnum=275; losehp(30+rnd(20)); bottomhp(); } else lprcat("climb down."); nap(3000); newcavelevel(DBOTTOM+1); /* down to V1 */ playerx = rnd(MAXX-2); playery = rnd(MAXY-2); positionplayer(); draws(0,MAXX,0,MAXY); bot_linex(); return; case OVOLUP: lprcat("\nYou have found "); lprcat(objectname[OVOLUP]); lprcat("\nDo you (c) climb up"); iopts(); i=0; while ((i!='c') && (i!='i') && (i!=ESC)) i=getcharacter(); if ((i==ESC) || (i=='i')) { ignore(); break; } if (packweight() > 40+5*(c[DEXTERITY]+c[STRENGTH]+c[STREXTRA])) { lprcat("\nYou slip and fall down the shaft."); beep(); lastnum=275; losehp(15+rnd(20)); bottomhp(); return; } lprcat("climb up."); lflush(); nap(3000); newcavelevel(0); for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++) /* put player near volcano shaft */ if (item[j][i]==OVOLDOWN) { playerx=j; playery=i; j=MAXX; i=MAXY; positionplayer(); } draws(0,MAXX,0,MAXY); bot_linex(); return; case OTRAPARROWIV: if (rnd(17)<13) return; /* for an arrow trap */ item[playerx][playery] = OTRAPARROW; know[playerx][playery] = 0; case OTRAPARROW: lprcat("\nYou are hit by an arrow!"); beep(); /* for an arrow trap */ lastnum=259; losehp(rnd(10)+level); bottomhp(); return; case OIVDARTRAP: if (rnd(17)<13) return; /* for a dart trap */ item[playerx][playery] = ODARTRAP; know[playerx][playery] = 0; case ODARTRAP: lprcat("\nYou are hit by a dart!"); beep(); /* for a dart trap */ lastnum=260; losehp(rnd(5)); if ((--c[STRENGTH]) < 3) c[STRENGTH] = 3; bottomline(); return; case OIVTRAPDOOR: if (rnd(17)<13) return; /* for a trap door */ item[playerx][playery] = OTRAPDOOR; know[playerx][playery] = 1; case OTRAPDOOR: lastnum = 272; /* a trap door */ for (i=0;i<IVENSIZE;i++) if (iven[i]==OWWAND) { lprcat("\nYou escape a trap door."); return; } if ((level==DBOTTOM)||(level==VBOTTOM)) { lprcat("\nYou fall through a trap door leading straight to HELL!"); beep(); lflush(); nap(3000); died(271); } lprcat("\nYou fall through a trap door!"); beep(); lflush(); losehp(rnd(5+level)); nap(2000); newcavelevel(level+1); draws(0,MAXX,0,MAXY); bot_linex(); return; case OTRADEPOST: if (nearbymonst()) return; lprcat("\nYou have found the Ularn trading Post."); lprcat("\nDo you (g) go inside, or (i) stay here? "); i=0; while ((i!='g') && (i!='i') && (i!=ESC)) i=getcharacter(); if (i == 'g') otradepost(); else lprcat("stay here."); return; case OHOME: if (nearbymonst()) return; lprcat("\nYou have found your way home."); lprcat("\nDo you (g) go inside, or (i) stay here? "); i=0; while ((i!='g') && (i!='i') && (i!=ESC)) i=getcharacter(); if (i == 'g') ohome(); else lprcat("stay here."); return; case OPAD: if (nearbymonst()) return; lprcat("\nYou have found Dealer McDope's Hideout!"); lprcat("\nDo you (c) check it out, or (i) ignore it? "); i=0; while ((i!='c') && (i!='i') && (i!=ESC)) i=getcharacter(); if (i == 'c') opad(); else lprcat("forget it."); return; case OSPEED: lprcat("\nYou find some speed."); lprcat("\nDo you (s) snort it, (t) take it, or (i) ignore it? "); i=0; while ((i!='s') && (i!='i') && (i!='t') && (i!=ESC)) i=getcharacter(); if (i=='s') { lprcat("snort!"); lprcat("\nOhwowmanlikethingstotallyseemtoslowdown!"); c[HASTESELF] += 200 + c[LEVEL]; c[HALFDAM] += 300 + rnd(200); if ((c[INTELLIGENCE]-=2) < 3) c[INTELLIGENCE]=3; if ((c[WISDOM]-=2) < 3) c[WISDOM]=3; if ((c[CONSTITUTION]-=2) <3) c[CONSTITUTION]=3; if ((c[DEXTERITY]-=2) <3) c[DEXTERITY]=3; if ((c[STRENGTH]-=2) <3) c[STRENGTH]=3; forget(); bottomline(); } else if (i=='t') { lprcat("take."); if (take(OSPEED,0)==0) forget(); } else lprcat("ignore."); break; case OSHROOMS: lprcat("\nYou find some magic mushrooms."); lprcat("\nDo you (e) eat them, (t) take them, or (i) ignore them? "); i=0; while ((i!='e') && (i!='i') && (i!='t') && (i!=ESC)) i=getcharacter(); if (i=='e') { lprcat("eat!"); lprcat("\nThings start to get real spacey..."); c[HASTEMONST] += rnd(75) + 25; c[CONFUSE] += 30+rnd(10); c[WISDOM]+=2; c[CHARISMA]+=2; forget(); bottomline(); } else if (i=='t') { lprcat("take."); if (take(OSHROOMS,0)==0) forget(); } else lprcat("ignore."); break; case OACID: lprcat("\nYou find some LSD."); lprcat("\nDo you (e) eat it, (t) take it, or (i) ignore it? "); i=0; while ((i!='e') && (i!='i') && (i!='t') && (i!=ESC)) i=getcharacter(); if (i=='e') { lprcat("eat!"); lprcat("\nYou are now frying your ass off!"); c[CONFUSE]+=30+rnd(10); c[WISDOM]+=2; c[INTELLIGENCE]+=2; c[AWARENESS]+=1500; c[AGGRAVATE]+=1500; { int j,k; /* heal monsters */ for(j=0;j<MAXY;j++) for(k=0;k<MAXX;k++) if (mitem[k][j].mon) hitp[k][j]=monster[mitem[k][j].mon].hitpoints; } forget(); bottomline(); } else if (i=='t') { lprcat("take."); if (take(OACID,0)==0) forget(); } else lprcat("ignore."); break; case OHASH: lprcat("\nYou find some hashish."); lprcat("\nDo you (s) smoke it, (t) take it, or (i) ignore it? "); i=0; while ((i!='s') && (i!='i') && (i!='t') && (i!=ESC)) i=getcharacter(); if (i=='s') { lprcat("smoke!"); lprcat("\nWOW! You feel stooooooned..."); c[HASTEMONST]+=rnd(75)+25; c[INTELLIGENCE]+=2; c[WISDOM]+=2; if( (c[CONSTITUTION]-=2) < 3) c[CONSTITUTION]=3; if( (c[DEXTERITY]-=2) < 3) c[DEXTERITY]=3; c[HALFDAM]+=300+rnd(200); c[CLUMSINESS]+=rnd(1800)+200; forget(); bottomline(); } else if (i=='t') { lprcat("take."); if (take(OHASH,0)==0) forget(); } else lprcat("ignore."); break; case OCOKE: lprcat("\nYou find some cocaine."); lprcat("\nDo you want to (s) snort it, (t) take it, or (i) ignore it? "); i=0; while ((i!='s') && (i!='i') && (i!='t') && (i!=ESC)) i=getcharacter(); if (i=='s') { lprcat("snort!"); lprcat("\nYour nose begins to bleed!"); if ((c[DEXTERITY]-=2) <3) c[DEXTERITY]=3; if ((c[CONSTITUTION]-=2) <3) c[CONSTITUTION]=3; c[CHARISMA]+=3; for(i=0;i<6;i++) c[i]+=33; c[COKED]+=10; forget(); bottomline(); } else if (i=='t') { lprcat("take."); if (take(OCOKE,0)==0) forget(); } else lprcat("ignore."); break; case OWALL: break; case OANNIHILATION: for (i=0;i<IVENSIZE;i++) if (iven[i]==OSPHTALISMAN) { lprcat("\nThe Talisman of the Sphere protects you from " "annihilation!"); return; } /* annihilated by sphere of annihilation */ died(283); return; case OLRS: if (nearbymonst()) return; lprcat("\n\nThere is an LRS office here."); lprcat("\nDo you (g) go inside, or (i) stay here? "); i=0; while ((i!='g') && (i!='i') && (i!=ESC)) i=getcharacter(); if (i == 'g') olrs(); /* the larn revenue service */ else lprcat(" stay here."); break; default: finditem(i); break; }; }
void act_on_object(int ans) { int i, j; int dx, dy; /* can't find objects is time is stopped */ if (c[TIMESTOP]) return; i=item[playerx][playery]; if (i == ONOTHING) return; showcell(playerx,playery); yrepcount=0; switch (i) { case OPOTION: i = iarg[playerx][playery]; opotion(i, ans); break; case OSCROLL: i = iarg[playerx][playery]; oscroll(i, ans); break; case OALTAR: oaltar(ans); move_world(0); break; case OBOOK: obook(ans); break; case OCOOKIE: ocookie(ans); break; case OTHRONE: othrone(0, ans); break; case OTHRONE2: othrone(1, ans); break; case ODEADTHRONE: odeadthrone(ans); break; case OORB: take_item(ans); break; case OBRASSLAMP: if (ans=='r') { i=rnd(100); if (i>90) { Print("The magic genie was very upset at being disturbed!"); losehp(DIED_ANNOYED_GENIE, (int)c[HP]/2+1); UlarnBeep(); } /* higher level, better chance of spell */ else if ( (rnd(100)+c[LEVEL]/2) > 80) { j = 0; for (i = 0; i < SPELL_COUNT; i++) { if (!spelknow[i]) { add_option(i, spelname[i], ""); j++; } } if (j > 0) { print_header("A magic genie appears! What spell would you like?"); set_callback("obrasslamp"); break; } else Print("A magic genie appears! The genie has no new spells to teach you."); } else { Print("Nothing happened."); } if (rnd(100) < 15) { Print("The genie prefers not to be disturbed again!"); forget(); c[LAMP]=0; /* chance of finding lamp again */ } UpdateStatus(); } else if (ans=='t') { if (take(OBRASSLAMP,0)==0) forget(); } return; case OWWAND: take_item(ans); break; case OHANDofFEAR: take_item(ans); break; case OSTAIRSUP: ostairs(1, ans); /* up */ break; case OFOUNTAIN: ofountain(ans); break; case OCHEST: ochest(ans); break; case OSCHOOL: if (ans == 'g') { oschool(); } break; case OBANK2: case OBANK: if (ans == 'g') { if (i==OBANK) obank(); else obank2(); } break; case ODNDSTORE: if (ans == 'g') dndstore(); break; case OSTAIRSDOWN: ostairs(-1, ans); /* down */ break; case OCLOSEDDOOR: /* can't move objects if time is stopped */ if (c[TIMESTOP]) return; dx = playerx; dy = playery; if (dropflag) return; if ((ans==ESC) || (ans=='i')) { playerx = lastpx; playery = lastpy; lastpx = (char) dx; lastpy = (char) dy; break; } else { /* Try and open the door that is here */ oopendoor(playerx, playery); if (item[playerx][playery] == OCLOSEDDOOR) { /* * Door didn't open. * Move the player back where they came from. */ playerx = lastpx; playery = lastpy; lastpx = (char) dx; lastpy = (char) dy; } move_world(0); } break; case OENTRANCE: if (ans == 'g') { newcavelevel(1); playerx = 33; playery = MAXY - 2; /* Make sure the entrance to the dungeon is clear */ item[33][MAXY-1] = ONOTHING; mitem[33][MAXY-1].mon = MONST_NONE; draws(0,MAXX,0,MAXY); UpdateStatusAndEffects(); return; } break; case OVOLDOWN: if ((ans==ESC) || (ans=='i')) { break; } if (level!=0) { Print("The shaft only extends 5 feet downward!"); return; } if (packweight() > 45+3*(c[STRENGTH]+c[STREXTRA])) { Print("You slip and fall down the shaft."); UlarnBeep(); losehp(DIED_SLIPPED_VOLCANO_SHAFT, 30+rnd(20)); UpdateStatus(); } nap(3000); newcavelevel(DBOTTOM+1); /* down to V1 */ playerx = (char) rnd(MAXX-2); playery = (char) rnd(MAXY-2); positionplayer(); draws(0,MAXX,0,MAXY); UpdateStatusAndEffects(); return; case OVOLUP: if ((ans==ESC) || (ans=='i')) { break; } if (packweight() > 40+5*(c[DEXTERITY]+c[STRENGTH]+c[STREXTRA])) { Print("You slip and fall down the shaft."); UlarnBeep(); losehp(DIED_SLIPPED_VOLCANO_SHAFT, 15+rnd(20)); UpdateStatus(); return; } nap(3000); newcavelevel(0); for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++) { /* put player near volcano shaft */ if (item[j][i]==OVOLDOWN) { playerx = (char) j; playery = (char) i; j=MAXX; i=MAXY; positionplayer(); } } draws(0,MAXX,0,MAXY); UpdateStatusAndEffects(); return; case OTRADEPOST: if (ans == 'g') { otradepost(); } return; case OHOME: if (ans == 'g') { ohome(); } return; case OPAD: if (ans == 'c') { opad(); } return; case OSPEED: if (ans=='s') { Print("Ohwowmanlikethingstotallyseemtoslowdown!"); c[HASTESELF] += 200 + c[LEVEL]; c[HALFDAM] += 300 + rnd(200); adjust_ability(INTELLIGENCE, -2); adjust_ability(WISDOM, -2); adjust_ability(CONSTITUTION, -2); adjust_ability(DEXTERITY, -2); adjust_ability(STRENGTH, -2); forget(); UpdateStatus(); } else if (ans=='t') { if (take(OSPEED,0)==0) forget(); } break; case OSHROOMS: if (ans=='e') { Print("Things start to get real spacey..."); c[HASTEMONST] += rnd(75) + 25; c[CONFUSE] += 30+rnd(10); adjust_ability(WISDOM, 2); adjust_ability(CHARISMA, 2); forget(); UpdateStatus(); } else if (ans=='t') { if (take(OSHROOMS,0)==0) forget(); } break; case OACID: if (ans=='e') { Print("You are now frying your ass off!"); c[CONFUSE] += 30 + rnd(10); adjust_ability(WISDOM, 2); adjust_ability(INTELLIGENCE, 2); c[AWARENESS] += 1500; c[AGGRAVATE] += 1500; { int j, k; /* heal monsters */ for(j = 0 ; j < MAXY ; j++) { for(k = 0 ; k < MAXX ; k++) { if (mitem[k][j].mon) { hitp[k][j] = monster[(int) mitem[k][j].mon].hitpoints; } } } } forget(); UpdateStatus(); } else if (ans=='t') { if (take(OACID,0)==0) forget(); } break; case OHASH: if (ans=='s') { Print("WOW! You feel stooooooned..."); c[HASTEMONST] += rnd(75)+25; adjust_ability(INTELLIGENCE, 2); adjust_ability(WISDOM, 2); adjust_ability(CONSTITUTION, -2); adjust_ability(DEXTERITY, -2); c[HALFDAM] += 300+rnd(200); c[CLUMSINESS] += rnd(1800)+200; forget(); UpdateStatus(); } else if (ans=='t') { if (take(OHASH,0)==0) forget(); } break; case OCOKE: if (ans=='s') { Print("Your nose begins to bleed!"); adjust_ability(DEXTERITY, -2); adjust_ability(CONSTITUTION, -2); adjust_ability(CHARISMA, 3); for(i = ABILITY_FIRST ; i <= ABILITY_LAST ; i++) { adjust_ability(i, 33); } c[COKED] += 10; forget(); UpdateStatus(); } else if (ans=='t') { if (take(OCOKE, 0) == 0) forget(); } break; case OWALL: break; case OANNIHILATION: if (player_has_item(OSPHTALISMAN)) { Print("The Talisman of the Sphere protects you from annihilation!"); return; } /* annihilated by sphere of annihilation */ died(DIED_SPHERE_ANNIHILATION, 0); return; case OLRS: if (nearbymonst()) return; if (ans == 'g') { olrs(); } break; default: if (ans == 't') { if (take(i, iarg[playerx][playery]) == 0) forget(); } break; } }
/* ============================================================================= * FUNCTION: lookforobject */ void lookforobject(void) { int i; int dx, dy; /* can't find objects is time is stopped */ if (c[TIMESTOP]) return; i=item[playerx][playery]; if (i == ONOTHING) return; showcell(playerx,playery); yrepcount=0; switch (i) { case OGOLDPILE: case OMAXGOLD: case OKGOLD: case ODGOLD: ogold(i); break; case OPOTION: Print("You find a magic potion"); i = iarg[playerx][playery]; if (potionknown[i]) Printf(" of %s",&potionname[i][1]); Print("."); add_option('d', "Drink", ""); add_option('t', "Take", ""); break; case OSCROLL: Print("You find a magic scroll"); i = iarg[playerx][playery]; if (scrollknown[i]) Printf(" of %s",&scrollname[i][1]); Print("."); if (c[BLINDCOUNT] == 0) add_option('r', "Read", ""); add_option('t', "Take", ""); break; case OALTAR: if (nearbymonst()) return; Print("There is a holy altar here."); set_callback("act_on_object"); add_option('p', "Pray", ""); add_option('d', "Desecrate", ""); add_option('i', "Ignore", ""); break; case OBOOK: Print("You find a book."); if (c[BLINDCOUNT] == 0) add_option('r', "Read", ""); add_option('t', "Take", ""); break; case OCOOKIE: Print("You find a fortune cookie."); add_option('e', "Eat", ""); add_option('t', "Take", ""); break; case OTHRONE: case OTHRONE2: if (nearbymonst()) return; Printf("There is %s here.", objectname[i]); add_option('p', "Pry Jewels", ""); add_option('s', "Sit", ""); break; case ODEADTHRONE: Printf("There is %s here.", objectname[i]); add_option('s', "Sit", ""); break; case OORB: if (nearbymonst()) return; finditem(i); break; case OBRASSLAMP: Print("You find a brass lamp."); add_option('r', "Rub", ""); add_option('t', "Take", ""); return; case OWWAND: if (nearbymonst()) return; finditem(i); break; case OHANDofFEAR: if (nearbymonst()) return; finditem(i); break; case OPIT: Print("You're standing at the top of a pit."); opit(); break; case OSTAIRSUP: Print("There is a circular staircase here."); add_option('u', "Up", ""); break; case OELEVATORUP: Print("You have found an express elevator going up."); oelevator(1); /* up */ break; case OELEVATORDOWN: Print("You have found an express elevator going down."); oelevator(-1); /* down */ break; case OFOUNTAIN: if (nearbymonst()) return; Print("There is a fountain here."); add_option('d', "Drink", ""); add_option('w', "Wash Yourself", ""); break; case OSTATUE: if (nearbymonst()) return; Print("You stand before a statue."); ostatue(); break; case OCHEST: Print("There is a chest here."); add_option('t', "Take", ""); add_option('o', "Open", ""); break; case OIVTELETRAP: if (rnd(11)<6) return; item[playerx][playery] = OTELEPORTER; case OTELEPORTER: /* * The player is being teleported, so obviously the player gets * to know that a teleport trap is here. * oteleport forces a screen redraw, so don't bother display anything * here. */ know[playerx][playery] = item[playerx][playery]; Print("Zaaaappp! You've been teleported!"); UlarnBeep(); nap(3000); oteleport(0); break; case OSCHOOL: if (nearbymonst()) return; Print("You have found the College of Ularn."); add_option('g', "Go in", ""); break; case OMIRROR: if (nearbymonst()) return; Print("There is a mirror here."); omirror(); break; case OBANK2: case OBANK: if (nearbymonst()) return; if (i==OBANK) { Print("You have found the bank of Ularn."); } else { Print("You have found a branch office of the bank of Ularn."); } add_option('g', "Go in", ""); break; case ODEADFOUNTAIN: if (nearbymonst()) return; Print("There is a dead fountain here."); break; case ODNDSTORE: if (nearbymonst()) return; Print("There is a DND store here."); add_option('g', "Go in", ""); break; case OSTAIRSDOWN: Print("There is a circular staircase here."); add_option('d', "Down", ""); break; case OOPENDOOR: Print("There is an open door here."); break; case OCLOSEDDOOR: /* can't move objects if time is stopped */ if (c[TIMESTOP]) return; dx = playerx; dy = playery; if (dropflag) return; Printf("You find %s",objectname[i]); set_callback("act_on_object"); add_option('o', "Open", ""); add_option('i', "Ignore", ""); break; case OENTRANCE: Print("You have found "); Print(objectname[OENTRANCE]); add_option('g', "Go in", ""); break; case OVOLDOWN: Print("You have found "); Print(objectname[OVOLDOWN]); add_option('c', "Climb down", ""); return; case OVOLUP: Print("You have found "); Print(objectname[OVOLUP]); add_option('c', "Climb up", ""); return; case OTRAPARROWIV: if (rnd(17)<13) return; /* for an arrow trap */ item[playerx][playery] = OTRAPARROW; case OTRAPARROW: Print("You are hit by an arrow!"); UlarnBeep(); /* for an arrow trap */ losehp(DIED_SHOT_BY_ARROW, rnd(10)+level); UpdateStatus(); return; case OIVDARTRAP: if (rnd(17)<13) return; /* for a dart trap */ item[playerx][playery] = ODARTRAP; case ODARTRAP: Print("You are hit by a dart!"); UlarnBeep(); /* for a dart trap */ losehp(DIED_HIT_BY_DART, rnd(5)); if ((--c[STRENGTH]) < 3) c[STRENGTH] = 3; UpdateStatus(); return; case OIVTRAPDOOR: if (rnd(17)<13) return; /* for a trap door */ item[playerx][playery] = OTRAPDOOR; case OTRAPDOOR: for (i=0;i<IVENSIZE;i++) { if (iven[i]==OWWAND) { Print("You escape a trap door."); return; } } if ((level==DBOTTOM)||(level==VBOTTOM)) { Print("You fall through a trap door leading straight to HELL!"); UlarnBeep(); nap(3000); died(DIED_FELL_THROUGH_BOTTOMLESS_TRAPDOOR, 0); } Print("You fall through a trap door!"); UlarnBeep(); losehp(DIED_FELL_THROUGH_TRAPDOOR, rnd(5+level)); nap(2000); newcavelevel(level+1); draws(0,MAXX,0,MAXY); UpdateStatusAndEffects(); return; case OTRADEPOST: if (nearbymonst()) return; Print("You have found the Ularn trading Post."); add_option('g', "Go in", ""); return; case OHOME: if (nearbymonst()) return; Print("You have found your way home."); add_option('g', "Go in", ""); return; case OPAD: if (nearbymonst()) return; Print("You have found Dealer McDope's Hideout!"); add_option('g', "Go in", ""); return; case OSPEED: Print("You find some speed."); add_option('s', "Snort", ""); add_option('t', "Take", ""); break; case OSHROOMS: Print("You find some magic mushrooms."); add_option('e', "Eat", ""); add_option('t', "Take", ""); break; case OACID: Print("You find some LSD."); add_option('e', "Eat", ""); add_option('t', "Take", ""); break; case OHASH: Print("You find some hashish."); add_option('s', "Smoke", ""); add_option('t', "Take", ""); break; case OCOKE: Print("You find some cocaine."); add_option('s', "Snort", ""); add_option('t', "Take", ""); break; case OWALL: break; case OANNIHILATION: if (player_has_item(OSPHTALISMAN)) { Print("The Talisman of the Sphere protects you from annihilation!"); return; } /* annihilated by sphere of annihilation */ died(DIED_SPHERE_ANNIHILATION, 0); return; case OLRS: if (nearbymonst()) return; Print("There is an LRS office here."); add_option('g', "Go in", ""); break; default: finditem(i); break; } }
/* ******* OSTAIRS ******* subroutine to process the stair cases if dir > 0 then up else down */ void ostairs(int dir) { int x, y; lprcat("\nDo you (s) stay here or "); if (dir > 0) lprcat("(u) go up? "); else lprcat("(d) go down? "); while (1) switch(getcharacter()) { case ESC: case 's': case 'i': lprcat("stay here."); return; case 'u': lprcat("go up."); if (dir < 0) lprcat("\nThe stairs don't go up!"); else /* not on V1 */ if (level>=2 && level!=DBOTTOM+1) { newcavelevel(level-1); for (x=0;x<MAXX;x++) for (y=0;y<MAXY;y++) if (item[x][y] == OSTAIRSDOWN){ playerx=x; playery=y; x=MAXX; y=MAXY; } draws(0,MAXX,0,MAXY); bot_linex(); } else lprcat("\nThe stairs lead to a dead end!"); return; case 'd': lprcat("go down."); if (dir > 0) lprcat("\nThe stairs don't go down!"); else /* not on dungeon botto or V5 */ if ((level!=0) && (level!=DBOTTOM) && (level!=VBOTTOM)) { newcavelevel(level+1); for (x=0;x<MAXX;x++) for (y=0;y<MAXY;y++) if (item[x][y] == OSTAIRSUP){ playerx=x; playery=y; x=MAXX; y=MAXY; } draws(0,MAXX,0,MAXY); bot_linex(); } else lprcat("\nThe stairs lead to a dead end!"); return; }; }