void odeadthrone(void) { int k; lprcat("\nDo you (s) sit down"); iopts(); while (1) { while (1) switch (ttgetch()) { case 's': lprcat(" sit down"); k = rnd(101); if (k < 35) { lprcat("\nZaaaappp! You've been teleported!\n"); beep(); oteleport(0); } else lprcat("\nnothing happens"); return; case 'i': case '\33': ignore(); return; }; } }
void odeadthrone() { int k; lprcat("\nDo you (s) sit down"); iopts(); while (1) { while (1) switch(getcharacter()) { case 's': lprcat(" sit down"); k=rnd(101); if (k<5) raiselevel(); else if (k<25) { lprcat("\nZaaaappp! You've been teleported!\n"); beep(); oteleport(0); } else lprcat("\nNothing happens."); return; case 'i': case ESC: ignore(); return; }; } /* NOTREACHED */ }
/* * ******* * OTHRONE * ******* * */ void othrone(int arg) { int i,k; lprcat("\nDo you (p) pry off jewels, (s) sit down"); iopts(); while (1) { while (1) switch(getcharacter()) { case 'p': lprcat(" pry off"); k=rnd(101); if (k<25) { for (i=0; i<rnd(4); i++) creategem(); /*gems pop off the throne*/ item[playerx][playery]=ODEADTHRONE; know[playerx][playery]=0; } else if (k<40 && arg==0) { createmonster(GNOMEKING); item[playerx][playery]=OTHRONE2; know[playerx][playery]=0; } else lprcat("\nNothing happens."); return; case 's': lprcat(" sit down"); k=rnd(101); if (k<30 && arg==0) { createmonster(GNOMEKING); item[playerx][playery]=OTHRONE2; know[playerx][playery]=0; } else if (k<35) { lprcat("\nZaaaappp! You've been teleported!\n"); beep(); oteleport(0); } else lprcat("\nNothing happens."); return; case 'i': case ESC: ignore(); return; }; } /* NOTREACHED */ }
/* act_sit_throne Sit on a throne. arg is zero if there is a gnome king associated with the throne Assumes that cursors() has been called previously. */ void act_sit_throne(int arg) { int k; k = rnd(101); if (k < 30 && arg == 0) { createmonster(GNOMEKING); item[playerx][playery]=OTHRONE2; know[playerx][playery]=0; } else if (k < 35) { lprcat("\nZaaaappp! You've been teleported!\n"); oteleport(0); } else { lprcat("\nNothing happens"); } }
/* *************** 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; }; }
/* * parse() * * get and execute a command */ static void parse(void) { int i, j, k, flag; while (1) { k = yylex(); switch(k) /* get the token from the input and switch on it */ { case 'h': moveplayer(4); return; /* west */ case 'H': run(4); return; /* west */ case 'l': moveplayer(2); return; /* east */ case 'L': run(2); return; /* east */ case 'j': moveplayer(1); return; /* south */ case 'J': run(1); return; /* south */ case 'k': moveplayer(3); return; /* north */ case 'K': run(3); return; /* north */ case 'u': moveplayer(5); return; /* northeast */ case 'U': run(5); return; /* northeast */ case 'y': moveplayer(6); return; /* northwest */ case 'Y': run(6); return; /* northwest */ case 'n': moveplayer(7); return; /* southeast */ case 'N': run(7); return; /* southeast */ case 'b': moveplayer(8); return; /* southwest */ case 'B': run(8); return; /* southwest */ case '.': /* stay here */ if (yrepcount) viewflag=1; return; case 'c': yrepcount=0; cast(); return; /* cast a spell */ case 'd': yrepcount=0; if (c[TIMESTOP]==0) dropobj(); return; /* to drop an object */ case 'e': yrepcount=0; if (c[TIMESTOP]==0) if (!floor_consume( OCOOKIE, "eat" )) consume( OCOOKIE, "eat", showeat ); return; /* to eat a fortune cookie */ case 'g': yrepcount = 0 ; cursors(); lprintf("\nThe stuff you are carrying presently weighs %d pounds",(long)packweight()); break ; case 'i': /* inventory */ yrepcount=0; nomove=1; showstr(FALSE); return; case 'p': /* pray at an altar */ yrepcount = 0; pray_at_altar(); return; case 'q': /* quaff a potion */ yrepcount=0; if (c[TIMESTOP]==0) if (!floor_consume( OPOTION, "quaff")) consume( OPOTION, "quaff", showquaff ); return; case 'r': yrepcount=0; if (c[BLINDCOUNT]) { cursors(); lprcat("\nYou can't read anything when you're blind!"); } else if (c[TIMESTOP]==0) if (!floor_consume( OSCROLL, "read" )) if (!floor_consume( OBOOK, "read" )) consume( OSCROLL, "read", showread ); return; /* to read a scroll */ case 's': yrepcount = 0 ; sit_on_throne(); return ; case 't': /* Tidy up at fountain */ yrepcount = 0 ; wash_fountain() ; return ; case 'v': yrepcount=0; nomove = 1; cursors(); lprintf("\nLarn, Version %d.%d.%d, Diff=%d",(long)VERSION,(long)SUBVERSION,(long)PATCHLEVEL,(long)c[HARDGAME]); if (wizard) lprcat(" Wizard"); if (cheat) lprcat(" Cheater"); return; case 'w': /* wield a weapon */ yrepcount=0; wield(); return; case 'A': yrepcount = 0; desecrate_altar(); return; case 'C': /* Close something */ yrepcount = 0 ; close_something(); return; case 'D': /* Drink at fountain */ yrepcount = 0 ; drink_fountain() ; return ; case 'E': /* Enter a building */ yrepcount = 0 ; enter() ; break ; case 'I': /* list spells and scrolls */ yrepcount=0; seemagic(0); nomove=1; return; case 'O': /* Open something */ yrepcount = 0 ; open_something(); return; case 'P': cursors(); yrepcount = 0; nomove = 1; if (outstanding_taxes>0) lprintf("\nYou presently owe %d gp in taxes.",(long)outstanding_taxes); else lprcat("\nYou do not owe any taxes."); return; case 'Q': /* quit */ yrepcount=0; quit(); nomove=1; return; case 'R' : /* remove gems from a throne */ yrepcount = 0 ; remove_gems( ); return ; case 'S': /* And do the save. */ cursors(); lprintf("\nSaving to `%s' . . . ", savefilename); lflush(); save_mode = 1; savegame(savefilename); clear(); lflush(); wizard=1; died(-257); /* doesn't return */ break; case 'T': yrepcount=0; cursors(); if (c[SHIELD] != -1) { c[SHIELD] = -1; lprcat("\nYour shield is off"); bottomline(); } else if (c[WEAR] != -1) { c[WEAR] = -1; lprcat("\nYour armor is off"); bottomline(); } else lprcat("\nYou aren't wearing anything"); return; case 'W': yrepcount=0; wear(); return; /* wear armor */ case 'Z': yrepcount=0; if (c[LEVEL]>9) { oteleport(1); return; } cursors(); lprcat("\nAs yet, you don't have enough experience to use teleportation"); return; /* teleport yourself */ case ' ': yrepcount=0; nomove=1; return; case 'L'-64: yrepcount=0; drawscreen(); nomove=1; return; /* look */ #if WIZID #ifdef EXTRA case 'A'-64: yrepcount=0; nomove=1; if (wizard) { diag(); return; } /* create diagnostic file */ return; #endif #endif case '<': /* Go up stairs or vol shaft */ yrepcount = 0; up_stairs(); return ; case '>': /* Go down stairs or vol shaft*/ yrepcount = 0 ; down_stairs(); return ; case '?': /* give the help screen */ yrepcount=0; help(); nomove=1; return; case ',': /* pick up an item */ yrepcount = 0 ; /* pickup, don't identify or prompt for action */ lookforobject( FALSE, TRUE, FALSE ); return; case ':': /* look at object */ yrepcount = 0 ; /* identify, don't pick up or prompt for action */ lookforobject( TRUE, FALSE, FALSE ); nomove = 1; /* assumes look takes no time */ return; case '/': /* identify object/monster */ specify_object(); nomove = 1 ; yrepcount = 0 ; return; case '^': /* identify traps */ flag = yrepcount = 0; cursors(); lprc('\n'); for (j=playery-1; j<playery+2; j++) { if (j < 0) j=0; if (j >= MAXY) break; for (i=playerx-1; i<playerx+2; i++) { if (i < 0) i=0; if (i >= MAXX) break; switch(item[i][j]) { case OTRAPDOOR: case ODARTRAP: case OTRAPARROW: case OTELEPORTER: case OPIT: lprcat("\nIts "); lprcat(objectname[item[i][j]]); flag++; }; } } if (flag==0) lprcat("\nNo traps are visible"); return; #if WIZID case '_': /* this is the fudge player password for wizard mode*/ yrepcount=0; cursors(); nomove=1; if (getpassword()==0) { scbr(); /* system("stty -echo cbreak"); */ return; } wizard=1; scbr(); /* system("stty -echo cbreak"); */ for (i=0; i<6; i++) c[i]=70; iven[0]=iven[1]=0; take(OPROTRING,50); take(OLANCE,25); c[WIELD]=1; c[LANCEDEATH]=1; c[WEAR] = c[SHIELD] = -1; raiseexperience(6000000L); c[AWARENESS] += 25000; { int i,j; for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++) know[j][i]=KNOWALL; for (i=0; i<SPNUM; i++) spelknow[i]=1; for (i=0; i<MAXSCROLL; i++) scrollname[i][0]=' '; for (i=0; i<MAXPOTION; i++) potionname[i][0]=' '; } for (i=0; i<MAXSCROLL; i++) if (strlen(scrollname[i])>2) /* no null items */ { item[i][0]=OSCROLL; iarg[i][0]=i; } for (i=MAXX-1; i>MAXX-1-MAXPOTION; i--) if (strlen(potionname[i-MAXX+MAXPOTION])>2) /* no null items */ { item[i][0]=OPOTION; iarg[i][0]=i-MAXX+MAXPOTION; } for (i=1; i<MAXY; i++) { item[0][i]=i; iarg[0][i]=0; } for (i=MAXY; i<MAXY+MAXX; i++) { item[i-MAXY][MAXY-1]=i; iarg[i-MAXY][MAXY-1]=0; } for (i=MAXX+MAXY; i<MAXOBJECT; i++) { item[MAXX-1][i-MAXX-MAXY]=i; iarg[MAXX-1][i-MAXX-MAXY]=0; } c[GOLD]+=250000; drawscreen(); return; #endif }; } }
/* parse() get and execute a command */ static void parse(void) { int i, j, k, flag; while (1) { k = yylex(); switch (k) { /* get the token from the input and switch on * it */ case 'h': moveplayer(4); return; /* west */ case 'H': run(4); return; /* west */ case 'l': moveplayer(2); return; /* east */ case 'L': run(2); return; /* east */ case 'j': moveplayer(1); return; /* south */ case 'J': run(1); return; /* south */ case 'k': moveplayer(3); return; /* north */ case 'K': run(3); return; /* north */ case 'u': moveplayer(5); return; /* northeast */ case 'U': run(5); return; /* northeast */ case 'y': moveplayer(6); return; /* northwest */ case 'Y': run(6); return; /* northwest */ case 'n': moveplayer(7); return; /* southeast */ case 'N': run(7); return; /* southeast */ case 'b': moveplayer(8); return; /* southwest */ case 'B': run(8); return; /* southwest */ case '.': if (yrepcount) viewflag = 1; return; /* stay here */ case 'w': yrepcount = 0; wield(); return; /* wield a weapon */ case 'W': yrepcount = 0; wear(); return; /* wear armor */ case 'r': yrepcount = 0; if (c[BLINDCOUNT]) { cursors(); lprcat("\nYou can't read anything when you're blind!"); } else if (c[TIMESTOP] == 0) readscr(); return; /* to read a scroll */ case 'q': yrepcount = 0; if (c[TIMESTOP] == 0) quaff(); return; /* quaff a potion */ case 'd': yrepcount = 0; if (c[TIMESTOP] == 0) dropobj(); return; /* to drop an object */ case 'c': yrepcount = 0; cast(); return; /* cast a spell */ case 'i': yrepcount = 0; nomove = 1; showstr(); return; /* status */ case 'e': yrepcount = 0; if (c[TIMESTOP] == 0) eatcookie(); return; /* to eat a fortune cookie */ case 'D': yrepcount = 0; seemagic(0); nomove = 1; return; /* list spells and scrolls */ case '?': yrepcount = 0; help(); nomove = 1; return; /* give the help screen */ case 'S': clear(); lprcat("Saving . . ."); lflush(); savegame(savefilename); wizard = 1; died(-257); /* save the game - doesn't return */ case 'Z': yrepcount = 0; if (c[LEVEL] > 9) { oteleport(1); return; } cursors(); lprcat("\nAs yet, you don't have enough experience to use teleportation"); return; /* teleport yourself */ case '^': /* identify traps */ flag = yrepcount = 0; cursors(); lprc('\n'); for (j = playery - 1; j < playery + 2; j++) { if (j < 0) j = 0; if (j >= MAXY) break; for (i = playerx - 1; i < playerx + 2; i++) { if (i < 0) i = 0; if (i >= MAXX) break; switch (item[i][j]) { case OTRAPDOOR: case ODARTRAP: case OTRAPARROW: case OTELEPORTER: lprcat("\nIt's "); lprcat(objectname[item[i][j]]); flag++; }; } } if (flag == 0) lprcat("\nNo traps are visible"); return; #if WIZID case '_': /* this is the fudge player password for * wizard mode */ yrepcount = 0; cursors(); nomove = 1; if (userid != wisid) { lprcat("Sorry, you are not empowered to be a wizard.\n"); scbr(); /* system("stty -echo cbreak"); */ lflush(); return; } if (getpassword() == 0) { scbr(); /* system("stty -echo cbreak"); */ return; } wizard = 1; scbr(); /* system("stty -echo cbreak"); */ for (i = 0; i < 6; i++) c[i] = 70; iven[0] = iven[1] = 0; take(OPROTRING, 50); take(OLANCE, 25); c[WIELD] = 1; c[LANCEDEATH] = 1; c[WEAR] = c[SHIELD] = -1; raiseexperience(6000000L); c[AWARENESS] += 25000; { int i, j; for (i = 0; i < MAXY; i++) for (j = 0; j < MAXX; j++) know[j][i] = 1; for (i = 0; i < SPNUM; i++) spelknow[i] = 1; for (i = 0; i < MAXSCROLL; i++) scrollname[i] = scrollhide[i]; for (i = 0; i < MAXPOTION; i++) potionname[i] = potionhide[i]; } for (i = 0; i < MAXSCROLL; i++) if (strlen(scrollname[i]) > 2) { /* no null items */ item[i][0] = OSCROLL; iarg[i][0] = i; } for (i = MAXX - 1; i > MAXX - 1 - MAXPOTION; i--) if (strlen(potionname[i - MAXX + MAXPOTION]) > 2) { /* no null items */ item[i][0] = OPOTION; iarg[i][0] = i - MAXX + MAXPOTION; } for (i = 1; i < MAXY; i++) { item[0][i] = i; iarg[0][i] = 0; } for (i = MAXY; i < MAXY + MAXX; i++) { item[i - MAXY][MAXY - 1] = i; iarg[i - MAXY][MAXY - 1] = 0; } for (i = MAXX + MAXY; i < MAXX + MAXY + MAXY; i++) { item[MAXX - 1][i - MAXX - MAXY] = i; iarg[MAXX - 1][i - MAXX - MAXY] = 0; } c[GOLD] += 25000; drawscreen(); return; #endif case 'T': yrepcount = 0; cursors(); if (c[SHIELD] != -1) { c[SHIELD] = -1; lprcat("\nYour shield is off"); bottomline(); } else if (c[WEAR] != -1) { c[WEAR] = -1; lprcat("\nYour armor is off"); bottomline(); } else lprcat("\nYou aren't wearing anything"); return; case 'g': cursors(); lprintf("\nThe stuff you are carrying presently weighs %ld pounds", (long) packweight()); case ' ': yrepcount = 0; nomove = 1; return; case 'v': yrepcount = 0; cursors(); lprintf("\nCaverns of Larn, Version %ld.%ld, Diff=%ld", (long) VERSION, (long) SUBVERSION, (long) c[HARDGAME]); if (wizard) lprcat(" Wizard"); nomove = 1; if (cheat) lprcat(" Cheater"); lprcat(copyright); return; case 'Q': yrepcount = 0; quit(); nomove = 1; return; /* quit */ case 'L' - 64: yrepcount = 0; drawscreen(); nomove = 1; return; /* look */ #if WIZID #ifdef EXTRA case 'A': yrepcount = 0; nomove = 1; if (wizard) { diag(); return; } /* create diagnostic file */ return; #endif #endif case 'P': cursors(); if (outstanding_taxes > 0) lprintf("\nYou presently owe %ld gp in taxes.", (long) outstanding_taxes); else lprcat("\nYou do not owe any taxes."); return; }; } }
/* ============================================================================= * 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; } }
/* function to read a scroll */ void read_scroll(int typ) { int i,j; if (typ<0 || typ>=MAXSCROLL) return; /* be sure we are within bounds */ if (scrollknown[typ] == 0) scrollknown[typ] = 1; lprintf("\nYou read a scroll of %s.", &(scrollname[typ][1])); switch(typ) { case SENCHANTARM: enchantarmor(ENCH_SCROLL); return; case SENCHANTWEAP: enchweapon(ENCH_SCROLL); return; case SENLIGHTEN: lflush(); yh = min(playery+7,MAXY); xh = min(playerx+25,MAXX); yl = max(playery-7,0); xl = max(playerx-25,0); for (i=yl; i<yh; i++) for (j=xl; j<xh; j++) know[j][i]=1; nap(2000); draws(xl,xh,yl,yh); return; case SBLANK: return; case SCREATEMONST: createmonster(makemonst(level+1)); return; case SCREATEITEM: something(playerx, playery, level); return; case SAGGMONST: c[AGGRAVATE]+=800; return; case STIMEWARP: /* * This code is slightly wrong in that, if gtime is small and * we can't go back by the required number of mobuls, it's * still reported that we did. I don't think this is * critical -- dmr */ i = (rnd(1000) - 850)/100; if (i==0) i=1; gtime += 100*i; if (gtime < 0) gtime = 0; lprintf("\nYou go %sward in time by %d mobul%s", (i<0)?"back":"for", (i<0)?-i:i, i==1?"":"s"); adjusttime((long)(i*100));/* adjust time for time warping */ return; case STELEPORT: oteleport(0); return; case SAWARENESS: c[AWARENESS] += 1800; return; case SHASTEMONST: c[HASTEMONST] += rnd(55)+12; lprintf(" You feel nervous."); return; case SMONSTHEAL: for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++) if (mitem[j][i].mon) hitp[j][i] = monster[mitem[j][i].mon].hitpoints; lprintf(" You feel uneasy."); return; case SSPIRITPROT: c[SPIRITPRO] += 300 + rnd(200); bottomline(); return; case SUNDEADPROT: c[UNDEADPRO] += 300 + rnd(200); bottomline(); return; case SSTEALTH: c[STEALTH] += 250 + rnd(250); bottomline(); return; case SMAGICMAP: lflush(); for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++) know[j][i]=1; nap(2000); draws(0,MAXX,0,MAXY); return; case SHOLDMONST: c[HOLDMONST] += 30; bottomline(); return; case SGEMPERFECT: for (i=0; i<IVENSIZE; i++) switch(iven[i]) { case ODIAMOND: case ORUBY: case OEMERALD: case OSAPPHIRE: j = ivenarg[i]; j *= 2; if (j <= 0 && ivenarg[i]) j=2550; ivenarg[i] = j; break; } break; case SSPELLEXT: for (i=0; i<11; i++) c[exten[i]] <<= 1; break; case SIDENTIFY: for (i=0; i<IVENSIZE; i++) { if (iven[i]==OPOTION) potionknown[ivenarg[i]] = 1; if (iven[i]==OSCROLL) scrollknown[ivenarg[i]] = 1; } break; case SREMCURSE: removecurse(); break; case SANNIHILATE: annihilate(); break; case SPULVERIZE: godirect(22,150,"The ray hits the %s.",0,' '); break; case SLIFEPROT: c[LIFEPROT]++; break; }; }