freebsd-dev/games/larn/object.c
Jordan K. Hubbard 554eb505f8 Bring in the 4.4 Lite games directory, modulo man page changes and segregation
of the x11 based games.  I'm not going to tag the originals with bsd_44_lite
and do this in two stages since it's just not worth it for this collection,
and I've got directory renames to deal with that way.  Bleah.
Submitted by:	jkh
1994-09-04 04:03:31 +00:00

808 lines
25 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* object.c Larn is copyrighted 1986 by Noah Morgan. */
#include "header.h"
/*
***************
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;
};
}
/*
function to say what object we found and ask if player wants to take it
*/
finditem(itm)
int itm;
{
int tmp,i;
lprintf("\n\nYou have found %s ",objectname[itm]);
tmp=iarg[playerx][playery];
switch(itm)
{
case ODIAMOND: case ORUBY: case OEMERALD:
case OSAPPHIRE: case OSPIRITSCARAB: case OORBOFDRAGON:
case OCUBEofUNDEAD: case ONOTHEFT: break;
default:
if (tmp>0) lprintf("+ %d",(long)tmp); else if (tmp<0) lprintf(" %d",(long)tmp);
}
lprcat("\nDo you want to (t) take it"); iopts();
i=0; while (i!='t' && i!='i' && i!='\33') i=getchar();
if (i == 't')
{ lprcat("take"); if (take(itm,tmp)==0) forget(); return; }
ignore();
}
/*
*******
OSTAIRS
*******
subroutine to process the stair cases
if dir > 0 the up else down
*/
ostairs(dir)
int dir;
{
register int k;
lprcat("\nDo you (s) stay here ");
if (dir > 0) lprcat("(u) go up "); else lprcat("(d) go down ");
lprcat("or (f) kick stairs? ");
while (1) switch(getchar())
{
case '\33':
case 's': case 'i': lprcat("stay here"); return;
case 'f': lprcat("kick stairs");
if (rnd(2) == 1)
lprcat("\nI hope you feel better. Showing anger rids you of frustration.");
else
{
k=rnd((level+1)<<1);
lprintf("\nYou hurt your foot dumb dumb! You suffer %d hit points",(long)k);
lastnum=276; losehp(k); bottomline();
}
return;
case 'u': lprcat("go up");
if (dir < 0) lprcat("\nThe stairs don't go up!");
else
if (level>=2 && level!=11)
{
k = level; newcavelevel(level-1);
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
if (level!=0 && level!=10 && level!=13)
{
k = level; newcavelevel(level+1);
draws(0,MAXX,0,MAXY); bot_linex();
}
else lprcat("\nThe stairs lead to a dead end!");
return;
};
}
/*
*********
OTELEPORTER
*********
subroutine to handle a teleport trap +/- 1 level maximum
*/
oteleport(err)
int err;
{
register int tmp;
if (err) if (rnd(151)<3) died(264); /* stuck in a rock */
c[TELEFLAG]=1; /* show ?? on bottomline if been teleported */
if (level==0) tmp=0;
else if (level < MAXLEVEL)
{ tmp=rnd(5)+level-3; if (tmp>=MAXLEVEL) tmp=MAXLEVEL-1;
if (tmp<1) tmp=1; }
else
{ tmp=rnd(3)+level-2; if (tmp>=MAXLEVEL+MAXVLEVEL) tmp=MAXLEVEL+MAXVLEVEL-1;
if (tmp<MAXLEVEL) tmp=MAXLEVEL; }
playerx = rnd(MAXX-2); playery = rnd(MAXY-2);
if (level != tmp) newcavelevel(tmp); positionplayer();
draws(0,MAXX,0,MAXY); bot_linex();
}
/*
*******
OPOTION
*******
function to process a potion
*/
opotion(pot)
int pot;
{
lprcat("\nDo you (d) drink it, (t) take it"); iopts();
while (1) switch(getchar())
{
case '\33':
case 'i': ignore(); return;
case 'd': lprcat("drink\n"); forget(); /* destroy potion */
quaffpotion(pot); return;
case 't': lprcat("take\n"); if (take(OPOTION,pot)==0) forget();
return;
};
}
/*
function to drink a potion
*/
quaffpotion(pot)
int pot;
{
register int i,j,k;
if (pot<0 || pot>=MAXPOTION) return; /* check for within bounds */
potionname[pot][0] = ' ';
switch(pot)
{
case 9: lprcat("\nYou feel greedy . . ."); nap(2000);
for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++)
if ((item[j][i]==OGOLDPILE) || (item[j][i]==OMAXGOLD))
{
know[j][i]=1; show1cell(j,i);
}
showplayer(); return;
case 19: lprcat("\nYou feel greedy . . ."); nap(2000);
for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++)
{
k=item[j][i];
if ((k==ODIAMOND) || (k==ORUBY) || (k==OEMERALD) || (k==OMAXGOLD)
|| (k==OSAPPHIRE) || (k==OLARNEYE) || (k==OGOLDPILE))
{
know[j][i]=1; show1cell(j,i);
}
}
showplayer(); return;
case 20: c[HP] = c[HPMAX]; break; /* instant healing */
case 1: lprcat("\nYou feel better");
if (c[HP] == c[HPMAX]) raisemhp(1);
else if ((c[HP] += rnd(20)+20+c[LEVEL]) > c[HPMAX]) c[HP]=c[HPMAX]; break;
case 2: lprcat("\nSuddenly, you feel much more skillful!");
raiselevel(); raisemhp(1); return;
case 3: lprcat("\nYou feel strange for a moment");
c[rund(6)]++; break;
case 4: lprcat("\nYou feel more self confident!");
c[WISDOM] += rnd(2); break;
case 5: lprcat("\nWow! You feel great!");
if (c[STRENGTH]<12) c[STRENGTH]=12; else c[STRENGTH]++; break;
case 6: lprcat("\nYour charm went up by one!"); c[CHARISMA]++; break;
case 8: lprcat("\nYour intelligence went up by one!");
c[INTELLIGENCE]++; break;
case 10: for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++)
if (mitem[j][i])
{
know[j][i]=1; show1cell(j,i);
}
/* monster detection */ return;
case 12: lprcat("\nThis potion has no taste to it"); return;
case 15: lprcat("\nWOW!!! You feel Super-fantastic!!!");
if (c[HERO]==0) for (i=0; i<6; i++) c[i] += 11;
c[HERO] += 250; break;
case 16: lprcat("\nYou have a greater intestinal constitude!");
c[CONSTITUTION]++; break;
case 17: lprcat("\nYou now have incredibly bulging muscles!!!");
if (c[GIANTSTR]==0) c[STREXTRA] += 21;
c[GIANTSTR] += 700; break;
case 18: lprcat("\nYou feel a chill run up your spine!");
c[FIRERESISTANCE] += 1000; break;
case 0: lprcat("\nYou fall asleep. . .");
i=rnd(11)-(c[CONSTITUTION]>>2)+2; while(--i>0) { parse2(); nap(1000); }
cursors(); lprcat("\nYou woke up!"); return;
case 7: lprcat("\nYou become dizzy!");
if (--c[STRENGTH] < 3) c[STRENGTH]=3; break;
case 11: lprcat("\nYou stagger for a moment . .");
for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++)
know[j][i]=0;
nap(2000); draws(0,MAXX,0,MAXY); /* potion of forgetfulness */ return;
case 13: lprcat("\nYou can't see anything!"); /* blindness */
c[BLINDCOUNT]+=500; return;
case 14: lprcat("\nYou feel confused"); c[CONFUSE]+= 20+rnd(9); return;
case 21: lprcat("\nYou don't seem to be affected"); return; /* cure dianthroritis */
case 22: lprcat("\nYou feel a sickness engulf you"); /* poison */
c[HALFDAM] += 200 + rnd(200); return;
case 23: lprcat("\nYou feel your vision sharpen"); /* see invisible */
c[SEEINVISIBLE] += rnd(1000)+400;
monstnamelist[INVISIBLESTALKER] = 'I'; return;
};
bottomline(); /* show new stats */ return;
}
/*
*******
OSCROLL
*******
function to process a magic scroll
*/
oscroll(typ)
int typ;
{
lprcat("\nDo you ");
if (c[BLINDCOUNT]==0) lprcat("(r) read it, "); lprcat("(t) take it"); iopts();
while (1) switch(getchar())
{
case '\33':
case 'i': ignore(); return;
case 'r': if (c[BLINDCOUNT]) break;
lprcat("read"); forget();
if (typ==2 || typ==15) { show1cell(playerx,playery); cursors(); }
/* destroy it */ read_scroll(typ); return;
case 't': lprcat("take"); if (take(OSCROLL,typ)==0) forget(); /* destroy it */
return;
};
}
/*
data for the function to read a scroll
*/
static int xh,yh,yl,xl;
static char curse[] = { BLINDCOUNT, CONFUSE, AGGRAVATE, HASTEMONST, ITCHING,
LAUGHING, DRAINSTRENGTH, CLUMSINESS, INFEEBLEMENT, HALFDAM };
static char exten[] = { PROTECTIONTIME, DEXCOUNT, STRCOUNT, CHARMCOUNT,
INVISIBILITY, CANCELLATION, HASTESELF, GLOBE, SCAREMONST, HOLDMONST, TIMESTOP };
char time_change[] = { HASTESELF,HERO,ALTPRO,PROTECTIONTIME,DEXCOUNT,
STRCOUNT,GIANTSTR,CHARMCOUNT,INVISIBILITY,CANCELLATION,
HASTESELF,AGGRAVATE,SCAREMONST,STEALTH,AWARENESS,HOLDMONST,HASTEMONST,
FIRERESISTANCE,GLOBE,SPIRITPRO,UNDEADPRO,HALFDAM,SEEINVISIBLE,
ITCHING,CLUMSINESS, WTW };
/*
* function to adjust time when time warping and taking courses in school
*/
adjtime(tim)
register long tim;
{
register int j;
for (j=0; j<26; j++) /* adjust time related parameters */
if (c[time_change[j]])
if ((c[time_change[j]] -= tim) < 1) c[time_change[j]]=1;
regen();
}
/*
function to read a scroll
*/
read_scroll(typ)
int typ;
{
register int i,j;
if (typ<0 || typ>=MAXSCROLL) return; /* be sure we are within bounds */
scrollname[typ][0] = ' ';
switch(typ)
{
case 0: lprcat("\nYour armor glows for a moment"); enchantarmor(); return;
case 1: lprcat("\nYour weapon glows for a moment"); enchweapon(); return; /* enchant weapon */
case 2: lprcat("\nYou have been granted enlightenment!");
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 3: lprcat("\nThis scroll seems to be blank"); return;
case 4: createmonster(makemonst(level+1)); return; /* this one creates a monster */
case 5: something(level); /* create artifact */ return;
case 6: c[AGGRAVATE]+=800; return; /* aggravate monsters */
case 7: gtime += (i = rnd(1000) - 850); /* time warp */
if (i>=0) lprintf("\nYou went forward in time by %d mobuls",(long)((i+99)/100));
else lprintf("\nYou went backward in time by %d mobuls",(long)(-(i+99)/100));
adjtime((long)i); /* adjust time for time warping */
return;
case 8: oteleport(0); return; /* teleportation */
case 9: c[AWARENESS] += 1800; return; /* expanded awareness */
case 10: c[HASTEMONST] += rnd(55)+12; return; /* haste monster */
case 11: for (i=0; i<MAXY; i++) for (j=0; j<MAXX; j++)
if (mitem[j][i])
hitp[j][i] = monster[mitem[j][i]].hitpoints;
return; /* monster healing */
case 12: c[SPIRITPRO] += 300 + rnd(200); bottomline(); return; /* spirit protection */
case 13: c[UNDEADPRO] += 300 + rnd(200); bottomline(); return; /* undead protection */
case 14: c[STEALTH] += 250 + rnd(250); bottomline(); return; /* stealth */
case 15: lprcat("\nYou have been granted enlightenment!"); /* magic mapping */
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 16: c[HOLDMONST] += 30; bottomline(); return; /* hold monster */
case 17: for (i=0; i<26; i++) /* gem perfection */
switch(iven[i])
{
case ODIAMOND: case ORUBY:
case OEMERALD: case OSAPPHIRE:
j = ivenarg[i]; j &= 255; j <<= 1;
if (j > 255) j=255; /* double value */
ivenarg[i] = j; break;
}
break;
case 18: for (i=0; i<11; i++) c[exten[i]] <<= 1; /* spell extension */
break;
case 19: for (i=0; i<26; i++) /* identify */
{
if (iven[i]==OPOTION) potionname[ivenarg[i]][0] = ' ';
if (iven[i]==OSCROLL) scrollname[ivenarg[i]][0] = ' ';
}
break;
case 20: for (i=0; i<10; i++) /* remove curse */
if (c[curse[i]]) c[curse[i]] = 1;
break;
case 21: annihilate(); break; /* scroll of annihilation */
case 22: godirect(22,150,"The ray hits the %s",0,' '); /* pulverization */
break;
case 23: c[LIFEPROT]++; break; /* life protection */
};
}
oorb()
{
}
opit()
{
register int i;
if (rnd(101)<81)
if (rnd(70) > 9*c[DEXTERITY]-packweight() || rnd(101)<5)
if (level==MAXLEVEL-1) obottomless(); else
if (level==MAXLEVEL+MAXVLEVEL-1) obottomless(); else
{
if (rnd(101)<20)
{
i=0; lprcat("\nYou fell into a pit! Your fall is cushioned by an unknown force\n");
}
else
{
i = rnd(level*3+3);
lprintf("\nYou fell into a pit! You suffer %d hit points damage",(long)i);
lastnum=261; /* if he dies scoreboard will say so */
}
losehp(i); nap(2000); newcavelevel(level+1); draws(0,MAXX,0,MAXY);
}
}
obottomless()
{
lprcat("\nYou fell into a bottomless pit!"); beep(); nap(3000); died(262);
}
oelevator(dir)
int dir;
{
#ifdef lint
int x;
x=dir;
dir=x;
#endif lint
}
ostatue()
{
}
omirror()
{
}
obook()
{
lprcat("\nDo you ");
if (c[BLINDCOUNT]==0) lprcat("(r) read it, "); lprcat("(t) take it"); iopts();
while (1) switch(getchar())
{
case '\33':
case 'i': ignore(); return;
case 'r': if (c[BLINDCOUNT]) break;
lprcat("read");
/* no more book */ readbook(iarg[playerx][playery]); forget(); return;
case 't': lprcat("take"); if (take(OBOOK,iarg[playerx][playery])==0) forget(); /* no more book */
return;
};
}
/*
function to read a book
*/
readbook(lev)
register int lev;
{
register int i,tmp;
if (lev<=3) i = rund((tmp=splev[lev])?tmp:1); else
i = rnd((tmp=splev[lev]-9)?tmp:1) + 9;
spelknow[i]=1;
lprintf("\nSpell \"%s\": %s\n%s",spelcode[i],spelname[i],speldescript[i]);
if (rnd(10)==4)
{ lprcat("\nYour int went up by one!"); c[INTELLIGENCE]++; bottomline(); }
}
ocookie()
{
char *p;
lprcat("\nDo you (e) eat it, (t) take it"); iopts();
while (1) switch(getchar())
{
case '\33':
case 'i': ignore(); return;
case 'e': lprcat("eat\nThe cookie tasted good.");
forget(); /* no more cookie */
if (c[BLINDCOUNT]) return;
if (!(p=fortune(fortfile))) return;
lprcat(" A message inside the cookie reads:\n"); lprcat(p);
return;
case 't': lprcat("take"); if (take(OCOOKIE,0)==0) forget(); /* no more book */
return;
};
}
/* routine to pick up some gold -- if arg==OMAXGOLD then the pile is worth 100* the argument */
ogold(arg)
int arg;
{
register long i;
i = iarg[playerx][playery];
if (arg==OMAXGOLD) i *= 100;
else if (arg==OKGOLD) i *= 1000;
else if (arg==ODGOLD) i *= 10;
lprintf("\nIt is worth %d!",(long)i); c[GOLD] += i; bottomgold();
item[playerx][playery] = know[playerx][playery] = 0; /* destroy gold */
}
ohome()
{
register int i;
nosignal = 1; /* disable signals */
for (i=0; i<26; i++) if (iven[i]==OPOTION) if (ivenarg[i]==21)
{
iven[i]=0; /* remove the potion of cure dianthroritis from inventory */
clear(); lprcat("Congratulations. You found a potion of cure dianthroritis.\n");
lprcat("\nFrankly, No one thought you could do it. Boy! Did you surprise them!\n");
if (gtime>TIMELIMIT)
{
lprcat("\nThe doctor has the sad duty to inform you that your daughter died!\n");
lprcat("You didn't make it in time. In your agony, you kill the doctor,\nyour wife, and yourself! Too bad!\n");
nap(5000); died(269);
}
else
{
lprcat("\nThe doctor is now administering the potion, and in a few moments\n");
lprcat("Your daughter should be well on her way to recovery.\n");
nap(6000);
lprcat("\nThe potion is"); nap(3000); lprcat(" working! The doctor thinks that\n");
lprcat("your daughter will recover in a few days. Congratulations!\n");
beep(); nap(5000); died(263);
}
}
while (1)
{
clear(); lprintf("Welcome home %s. Latest word from the doctor is not good.\n",logname);
if (gtime>TIMELIMIT)
{
lprcat("\nThe doctor has the sad duty to inform you that your daughter died!\n");
lprcat("You didn't make it in time. In your agony, you kill the doctor,\nyour wife, and yourself! Too bad!\n");
nap(5000); died(269);
}
lprcat("\nThe diagnosis is confirmed as dianthroritis. He guesses that\n");
lprintf("your daughter has only %d mobuls left in this world. It's up to you,\n",(long)((TIMELIMIT-gtime+99)/100));
lprintf("%s, to find the only hope for your daughter, the very rare\n",logname);
lprcat("potion of cure dianthroritis. It is rumored that only deep in the\n");
lprcat("depths of the caves can this potion be found.\n\n\n");
lprcat("\n ----- press "); standout("return");
lprcat(" to continue, "); standout("escape");
lprcat(" to leave ----- ");
i=getchar(); while (i!='\33' && i!='\n') i=getchar();
if (i=='\33') { drawscreen(); nosignal = 0; /* enable signals */ return; }
}
}
/* routine to save program space */
iopts()
{ lprcat(", or (i) ignore it? "); }
ignore()
{ lprcat("ignore\n"); }