[comp.sources.games] v12i055: larn2 - dungeon type adventure game

billr@saab.CNA.TEK.COM (Bill Randle) (04/24/91)

Submitted-by: routley@tle.ENET.DEC.COM (Kevin Routley)
Posting-number: Volume 12, Issue 55
Archive-name: larn2/Part02
Supersedes: larn: Volume 11, Issue 84-94
Environment: Unix, VMS, MS-DOS, OS/2, termcap



#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 2 (of 12)."
# Contents:  Makefile.unix global.c object.c
# Wrapped by billr@saab on Tue Apr 23 13:50:28 1991
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'Makefile.unix' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Makefile.unix'\"
else
echo shar: Extracting \"'Makefile.unix'\" \(589 characters\)
sed "s/^X//" >'Makefile.unix' <<'END_OF_FILE'
X#
XOBJ=	action.o bill.o config.o create.o data.o diag.o display.o \
X	fortune.o global.o help.o io.o iventory.o main.o monster.o \
X	moreobj.o movem.o msdos.o nap.o object.o regen.o savelev.o \
X	scores.o signal.o spells.o spheres.o store.o \
X	tok.o vms.o
X#
X#
X
X# Add -DSIG_RTNS_INT to the CFLAGS line for older Unixes that return
X# int ptr rather than void ptr from the call to signal().
X#
XCFLAGS= -DBSD -D'LARNHOME="/usr/users/routley/larncc/"'
X
Xlarn123: $(OBJ)
X	cc -o larn123 $(OBJ) -ltermcap
X
X.c.o: 
X	cc $(CFLAGS) -c $*.c 
X
X.c: header.h larndefs.h player.h monsters.h objects.h patchlev.h
X
END_OF_FILE
if test 589 -ne `wc -c <'Makefile.unix'`; then
    echo shar: \"'Makefile.unix'\" unpacked with wrong size!
fi
# end of 'Makefile.unix'
fi
if test -f 'global.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'global.c'\"
else
echo shar: Extracting \"'global.c'\" \(16992 characters\)
sed "s/^X//" >'global.c' <<'END_OF_FILE'
X/*  global.c
X *
X *  raiselevel()        subroutine to raise the player one level
X *  loselevel()         subroutine to lower the player by one level
X *  raiseexperience(x)  subroutine to increase experience points
X *  loseexperience(x)   subroutine to lose experience points
X *  losehp(x)           subroutine to remove hit points from the player
X *  losemhp(x)          subroutine to remove max # hit points from the player
X *  raisehp(x)          subroutine to gain hit points
X *  raisemhp(x)         subroutine to gain maximum hit points
X *  losemspells(x)      subroutine to lose maximum spells
X *  raisemspells(x)     subroutine to gain maximum spells
X *  makemonst(lev)      function to return monster number for a randomly selected monster
X *  positionplayer()    function to be sure player is not in a wall
X *  recalc()            function to recalculate the armor class of the player
X *  quit()              subroutine to ask if the player really wants to quit
X *  more()
X *  take()
X *  drop_object()
X *  enchantarmor()
X *  enchweapon()
X *  pocketfull()
X *  nearbymonst()
X *  stealsomething()
X *  emptyhanded()
X *  creategem()
X *  adjustcvalues()
X *  gettokstr()
X *  getpassword()
X *  getyn()
X *  packweight()
X */
X
X#include <ctype.h>
X#include "header.h"
X#include "larndefs.h"
X#include "monsters.h"
X#include "objects.h"
X#include "player.h"
X
Xextern int score[],dropflag;
Xextern short playerx,playery,lastnum;
Xextern char cheat,level,monstnamelist[];
Xextern char lastmonst[],*what[],*who[]; 
Xextern char winner[];
Xextern char logname[],monstlevel[];
Xextern char sciv[SCORESIZE+1][26][2],*potionname[],*scrollname[];
X
X#ifdef __STDC__
Xextern void show3( int );
X#else
Xextern void show3();
X#endif
X
X/*
X    raiselevel()
X
X    subroutine to raise the player one level
X    uses the skill[] array to find level boundarys
X    uses c[EXPERIENCE]  c[LEVEL]
X */
Xraiselevel()
X    {
X    if (c[LEVEL] < MAXPLEVEL) raiseexperience((long)(skill[c[LEVEL]]-c[EXPERIENCE]));
X    }
X
X/*
X    loselevel()
X
X    subroutine to lower the players character level by one
X */
Xloselevel()
X    {
X    if (c[LEVEL] > 1) loseexperience((long)(c[EXPERIENCE] - skill[c[LEVEL]-1] + 1));
X    }
X
X/*
X    raiseexperience(x)
X
X    subroutine to increase experience points
X */
Xraiseexperience(x)
X    register long x;
X    {
X    register int i,tmp;
X    i=c[LEVEL]; c[EXPERIENCE]+=x;
X    while (c[EXPERIENCE] >= skill[c[LEVEL]] && (c[LEVEL] < MAXPLEVEL))
X        {
X        tmp = (c[CONSTITUTION]-c[HARDGAME])>>1;
X        c[LEVEL]++; raisemhp((int)(rnd(3)+rnd((tmp>0)?tmp:1)));
X        raisemspells((int)rund(3));
X        if (c[LEVEL] < 7-c[HARDGAME]) raisemhp((int)(c[CONSTITUTION]>>2));
X        }
X    if (c[LEVEL] != i)
X        {
X        cursors();
X        beep(); lprintf("\nWelcome to level %d",(long)c[LEVEL]);    /* if we changed levels */
X        }
X    bottomline();
X    }
X
X/*
X    loseexperience(x)
X
X    subroutine to lose experience points
X */
Xloseexperience(x)
X    register long x;
X    {
X    register int i,tmp;
X    i=c[LEVEL];     c[EXPERIENCE]-=x;
X    if (c[EXPERIENCE] < 0) c[EXPERIENCE]=0;
X    while (c[EXPERIENCE] < skill[c[LEVEL]-1])
X        {
X        if (--c[LEVEL] <= 1) c[LEVEL]=1;    /*  down one level      */
X        tmp = (c[CONSTITUTION]-c[HARDGAME])>>1; /* lose hpoints */
X        losemhp((int)rnd((tmp>0)?tmp:1));   /* lose hpoints */
X        if (c[LEVEL] < 7-c[HARDGAME]) losemhp((int)(c[CONSTITUTION]>>2));
X        losemspells((int)rund(3));              /*  lose spells     */
X        }
X    if (i!=c[LEVEL])
X        {
X        cursors();
X        beep(); lprintf("\nYou went down to level %d!",(long)c[LEVEL]);
X        }
X    bottomline();
X    }
X
X/*
X    losehp(x)
X    losemhp(x)
X
X    subroutine to remove hit points from the player
X    warning -- will kill player if hp goes to zero
X */
Xlosehp(x)
X    register int x;
X    {
X    if ((c[HP] -= x) <= 0)
X        {
X        beep(); lprcat("\n");  nap(3000);  died(lastnum);
X        }
X    }
X
Xlosemhp(x)
X    register int x;
X    {
X    c[HP] -= x;     if (c[HP] < 1)      c[HP]=1;
X    c[HPMAX] -= x;  if (c[HPMAX] < 1)   c[HPMAX]=1;
X    }
X
X/*
X    raisehp(x)
X    raisemhp(x)
X
X    subroutine to gain maximum hit points
X */
Xraisehp(x)
X    register int x;
X    {
X    if ((c[HP] += x) > c[HPMAX]) c[HP] = c[HPMAX];
X    }
X
Xraisemhp(x)
X    register int x;
X    {
X    c[HPMAX] += x;  c[HP] += x;
X    }
X
X/*
X    raisemspells(x)
X
X    subroutine to gain maximum spells
X*/
Xraisemspells(x)
X    register int x;
X    {
X    c[SPELLMAX]+=x; c[SPELLS]+=x;
X    }
X
X/*
X    losemspells(x)
X
X    subroutine to lose maximum spells
X*/
Xlosemspells(x)
X    register int x;
X    {
X    if ((c[SPELLMAX] -= x) < 0) c[SPELLMAX]=0;
X    if ((c[SPELLS] -= x) < 0) c[SPELLS]=0;
X    }
X
X/*
X    makemonst(lev)
X        int lev;
X
X    function to return monster number for a randomly selected monster
X        for the given cave level    
X */
Xmakemonst(lev)
X    register int lev;
X    {
X    register int tmp,x;
X    if (lev < 1)
X    lev = 1;
X    if (lev > 12)
X    lev = 12;
X    if (lev < 5)
X    tmp=rnd((x=monstlevel[lev-1])?x:1);
X    else
X        tmp=rnd((x=monstlevel[lev-1]-monstlevel[lev-4])?x:1)+monstlevel[lev-4];
X
X    while (monster[tmp].genocided && tmp<MAXMONST)
X    tmp++; /* genocided? */
X    return(tmp);
X    }
X
X/*
X    positionplayer()
X
X    Insure player is not in a wall or on top of a monster.  Could be more
X    intelligent about what kinds of objects the player can land on.
X */
Xpositionplayer()
X    {
X    int z, try = 2;
X
X    /* set the previous player x,y position to the new one, so that
X       clearing the player indicator from the previous location will
X       not do the wrong thing.
X    */
X    oldx = playerx ;
X    oldy = playery ;
X
X    /* short-circuit the testing if current position empty
X    */
X    if (!item[playerx][playery] &&
X        !mitem[playerx][playery])
X        return;
X
X    /* make at most two complete passes across the dungeon, looking
X       for a clear space.  In most situations, should find a clear
X       spot right around the current player position.
X    */
X    do
X        {
X
X        /* check all around the player position for a clear space.
X        */
X        for (z=1; z<9 ; z++)
X            {
X            int tmpx = playerx + diroffx[z];
X            int tmpy = playery + diroffy[z];
X            if (!item[tmpx][tmpy] &&
X                !mitem[tmpx][tmpy])
X                {
X                playerx = tmpx ;
X                playery = tmpy ;
X                return;
X                }
X            }
X
X        /* no clear spots around the player. try another position,
X           wrapping around the dungeon.
X        */
X        if (++playerx >= MAXX-1)
X            {
X            playerx = 1;
X            if (++playery >= MAXY-1)
X                {
X                playery = 1;
X                try--;
X                }
X            }
X        }
X    while (try);
X
X    /* no spot found.
X    */
X    lprcat("Failure in positionplayer\n");
X    }
X
X/*
X    recalc()    function to recalculate the armor class of the player
X */
Xrecalc()
X    {
X    register int i,j,k;
X    c[AC] = c[MOREDEFENSES];
X    if (c[WEAR] >= 0)  
X        switch(iven[c[WEAR]])
X            {
X            case OSHIELD:       c[AC] += 2 + ivenarg[c[WEAR]]; break;
X            case OLEATHER:      c[AC] += 2 + ivenarg[c[WEAR]]; break;
X            case OSTUDLEATHER:  c[AC] += 3 + ivenarg[c[WEAR]]; break;
X            case ORING:         c[AC] += 5 + ivenarg[c[WEAR]]; break;
X            case OCHAIN:        c[AC] += 6 + ivenarg[c[WEAR]]; break;
X            case OSPLINT:       c[AC] += 7 + ivenarg[c[WEAR]]; break;
X            case OPLATE:        c[AC] += 9 + ivenarg[c[WEAR]]; break;
X            case OPLATEARMOR:   c[AC] += 10 + ivenarg[c[WEAR]]; break;
X            case OSSPLATE:      c[AC] += 12 + ivenarg[c[WEAR]]; break;
X            }
X
X    if (c[SHIELD] >= 0) if (iven[c[SHIELD]] == OSHIELD) c[AC] += 2 + ivenarg[c[SHIELD]];
X    if (c[WIELD] < 0)  c[WCLASS] = 0;  else
X        {
X        i = ivenarg[c[WIELD]];
X        switch(iven[c[WIELD]])
X            {
X            case ODAGGER:    c[WCLASS] =  3 + i;  break;
X            case OBELT:      c[WCLASS] =  7 + i;  break;
X            case OSHIELD:    c[WCLASS] =  8 + i;  break;
X            case OSPEAR:     c[WCLASS] = 10 + i;  break;
X            case OFLAIL:     c[WCLASS] = 14 + i;  break;
X            case OBATTLEAXE: c[WCLASS] = 17 + i;  break;
X            case OLANCE:     c[WCLASS] = 19 + i;  break;
X            case OLONGSWORD: c[WCLASS] = 22 + i;  break;
X            case O2SWORD:    c[WCLASS] = 26 + i;  break;
X            case OSWORD:     c[WCLASS] = 32 + i;  break;
X            case OSWORDofSLASHING: c[WCLASS] = 30 + i; break;
X            case OHAMMER:    c[WCLASS] = 35 + i;  break;
X            default:         c[WCLASS] = 0;
X            }
X        }
X    c[WCLASS] += c[MOREDAM];
X
X/*  now for regeneration abilities based on rings   */
X    c[REGEN]=1;     c[ENERGY]=0;
X    j=0;  for (k=25; k>0; k--)  if (iven[k]) {j=k; k=0; }
X    for (i=0; i<=j; i++)
X        {
X        switch(iven[i])
X            {
X            case OPROTRING: c[AC]     += ivenarg[i] + 1;    break;
X            case ODAMRING:  c[WCLASS] += ivenarg[i] + 1;    break;
X            case OBELT:     c[WCLASS] += ((ivenarg[i]<<1)) + 2; break;
X
X            case OREGENRING:    c[REGEN]  += ivenarg[i] + 1;    break;
X            case ORINGOFEXTRA:  c[REGEN]  += 5 * (ivenarg[i]+1); break;
X            case OENERGYRING:   c[ENERGY] += ivenarg[i] + 1;    break;
X            }
X        }
X    }
X
X
X/*
X    quit()
X
X    subroutine to ask if the player really wants to quit
X */
Xquit()
X    {
X    register int i;
X    cursors();  strcpy(lastmonst,"");
X    lprcat("\n\nDo you really want to quit?");
X    while (1)
X        {
X        i=ttgetch();
X        if ((i == 'y') || (i == 'Y'))   
X            { 
X            died(300); 
X            return; 
X            }
X        if ((i == 'n') || (i == 'N') || (i == '\33')) 
X            { 
X            lprcat(" no"); 
X            lflush(); 
X            return; 
X            }
X        lprcat("\n");  
X        setbold();  lprcat("Yes");  resetbold();  
X        lprcat(" or ");
X        setbold();  lprcat("No");   resetbold();  
X        lprcat(" please?   Do you want to quit? ");
X        }   
X    }
X
X/*
X    function to ask --more--. If the user enters a space, returns 0.  If user
X    enters Escape, returns 1.  If user enters alphabetic, then returns that
X    value.
X */
Xmore(select_allowed)
Xchar select_allowed;
X    {
X    register int i;
X
X    lprcat("\n  --- press ");  standout("space");  lprcat(" to continue --- ");
X    if (select_allowed)
X        lprcat("letter to select --- ");
X
X    while (TRUE)
X        {
X        if ((i=ttgetch()) == ' ' || i == '\n')
X            return 0 ;
X        if (i== '\x1B')
X            return 1 ;
X	if (select_allowed)
X	    {
X	    if (isupper(i))
X		i = tolower(i);
X	    if ( i >= 'a' && i <= 'z' || i == '.' )
X		return i;
X	    }
X        }
X    }
X
X/*
X    function to enchant armor player is currently wearing
X */
Xenchantarmor()
X    {
X    register int tmp;
X    if (c[WEAR]<0) { if (c[SHIELD] < 0)
X        { cursors(); beep(); lprcat("\nYou feel a sense of loss"); return; }
X                    else { tmp=iven[c[SHIELD]]; if (tmp != OSCROLL) if (tmp != OPOTION) { ivenarg[c[SHIELD]]++; bottomline(); } } }
X    tmp = iven[c[WEAR]];
X    if (tmp!=OSCROLL) if (tmp!=OPOTION)  { ivenarg[c[WEAR]]++;  bottomline(); }
X    }
X
X/*
X    function to enchant a weapon presently being wielded
X */
Xenchweapon()
X    {
X    register int tmp;
X    if (c[WIELD]<0)
X        { cursors(); beep(); lprcat("\nYou feel a sense of loss"); return; }
X    tmp = iven[c[WIELD]];
X    if (tmp!=OSCROLL) if (tmp!=OPOTION)
X        { ivenarg[c[WIELD]]++;
X          if (tmp==OCLEVERRING) c[INTELLIGENCE]++;  else
X          if (tmp==OSTRRING)    c[STREXTRA]++;  else
X          if (tmp==ODEXRING)    c[DEXTERITY]++;       bottomline(); }
X    }
X
X/*
X    function to return 1 if a monster is next to the player else returns 0
X */
Xnearbymonst()
X    {
X    register int tmp,tmp2;
X    for (tmp=playerx-1; tmp<playerx+2; tmp++)
X        for (tmp2=playery-1; tmp2<playery+2; tmp2++)
X            if (mitem[tmp][tmp2]) return(1); /* if monster nearby */
X    return(0);
X    }
X
X/*
X    function to steal an item from the players pockets
X    returns 1 if steals something else returns 0
X */
Xstealsomething()
X    {
X    register int i,j;
X    j=100;
X    while (1)
X        {
X        i=rund(26);
X        if (iven[i]) if (c[WEAR]!=i) if (c[WIELD]!=i) if (c[SHIELD]!=i)
X            {
X            show3(i);
X            adjustcvalues(iven[i],ivenarg[i]);  iven[i]=0; return(1);
X            }
X        if (--j <= 0) return(0);
X        }
X    }
X
X/*
X    function to return 1 is player carrys nothing else return 0
X */
Xemptyhanded()
X    {
X    register int i;
X    for (i=0; i<26; i++)
X        if (iven[i]) if (i!=c[WIELD]) if (i!=c[WEAR]) if (i!=c[SHIELD]) return(0);
X    return(1);
X    }
X
X/*
X    function to create a gem on a square near the player
X */
Xcreategem()
X    {
X    register int i,j;
X    switch(rnd(4))
X        {
X        case 1:  i=ODIAMOND;    j=50;   break;
X        case 2:  i=ORUBY;       j=40;   break;
X        case 3:  i=OEMERALD;    j=30;   break;
X        default: i=OSAPPHIRE;   j=20;   break;
X        };
X    createitem(i,rnd(j)+j/10);
X    }
X
X/*
X    function to change character levels as needed when dropping an object
X    that affects these characteristics
X */
Xadjustcvalues(itm,arg)
X    int itm,arg;
X    {
X    register int flag;
X    flag=0;
X    switch(itm)
X        {
X        case ODEXRING:  c[DEXTERITY] -= arg+1;  flag=1; break;
X        case OSTRRING:  c[STREXTRA]  -= arg+1;  flag=1; break;
X        case OCLEVERRING: c[INTELLIGENCE] -= arg+1;  flag=1; break;
X        case OHAMMER:   c[DEXTERITY] -= 10; c[STREXTRA] -= 10;
X                        c[INTELLIGENCE] += 10; flag=1; break;
X        case OSWORDofSLASHING:  c[DEXTERITY] -= 5;  flag=1; break;
X        case OORBOFDRAGON:      --c[SLAYING];       return;
X        case OSPIRITSCARAB:     --c[NEGATESPIRIT];  return;
X        case OCUBEofUNDEAD:     --c[CUBEofUNDEAD];  return;
X        case ONOTHEFT:          --c[NOTHEFT];       return;
X        case OLANCE:        c[LANCEDEATH]=0;    return;
X        case OPOTION:   case OSCROLL:   return;
X
X        default:    flag=1;
X        };
X    if (flag) bottomline();
X    }
X
X/*
X    function to ask user for a password (no echo)
X    returns 1 if entered correctly, 0 if not
X */
Xstatic char gpwbuf[33];
Xgetpassword()
X    {
X    register int i,j;
X    register char *gpwp;
X    extern char *password;
X    scbr(); /*  system("stty -echo cbreak"); */
X    gpwp = gpwbuf;  lprcat("\nEnter Password: "); lflush();
X    i = strlen(password);
X    for (j=0; j<i; j++) 
X        *gpwp++ = ttgetch();
X    gpwbuf[i]=0;
X    sncbr(); /* system("stty echo -cbreak"); */
X    if (strcmp(gpwbuf,password) != 0)
X        {   lprcat("\nSorry\n");  lflush(); return(0);  }
X    else  return(1);
X    }
X
X/*
X    subroutine to get a yes or no response from the user
X    returns y or n
X */
Xgetyn()
X    {
X    register int i=0;
X    while (i!='y' && i!='n' && i!='\33')
X    i=ttgetch();
X    return(i);
X    }
X
X/*
X    function to calculate the pack weight of the player
X    returns the number of pounds the player is carrying
X */
Xpackweight()
X    {
X    register int i, j=25, k;
X
X    k=c[GOLD]/1000;
X    while ((iven[j]==0) && (j>0))
X    --j;
X    for (i=0; i<=j; i++)
X        switch(iven[i])
X            {
X        case 0:
X        break;
X        case OSSPLATE:
X        case OPLATEARMOR:
X        k += 40;
X        break;
X        case OPLATE:
X        k += 35;
X        break;
X        case OHAMMER:
X        k += 30;
X        break;
X        case OSPLINT:
X        k += 26;
X        break;
X        case OSWORDofSLASHING:
X        case OCHAIN:
X        case OBATTLEAXE:
X        case O2SWORD:
X        k += 23;
X        break;
X        case OLONGSWORD:
X        case OSWORD:
X        case ORING:
X        case OFLAIL:
X        k += 20;
X        break;
X        case OLANCE:
X        case OSTUDLEATHER:
X        k += 15;
X        break;
X        case OLEATHER:
X        case OSPEAR:
X        k += 8;
X        break;
X        case OORBOFDRAGON:
X        case OBELT:
X        k += 4;
X        break;
X        case OSHIELD:
X        k += 7;
X        break;
X        case OCHEST:
X        k += 30 + ivenarg[i];
X        break;
X        default:
X        k++;
X        break;
X            };
X    return(k);
X    }
X
X#ifndef MACRORND
X    /* macros to generate random numbers   1<=rnd(N)<=N   0<=rund(N)<=N-1 */
Xrnd(x)
X    int x;
X    {
X    return((((lrandx=lrandx*1103515245+12345)>>7)%(x))+1);
X    }
X
Xrund(x)
X    int x;
X    {
X    return((((lrandx=lrandx*1103515245+12345)>>7)%(x))  );
X    }
X#endif MACRORND
X
X#if 0
X/*
X    function to read a string from token input "string"
X    returns a pointer to the string
X */
Xgettokstr(str)
X    register char *str;
X    {
X    register int i,j;
X    i=50;
X    while ((ttgetch() != '"') && (--i > 0));
X    i=36;
X    while (--i > 0)
X        {
X        if ((j=ttgetch()) != '"') *str++ = j;  else i=0;
X        }
X    *str = 0;
X    i=50;
X    if (j != '"') while ((ttgetch() != '"') && (--i > 0)); /* if end due to too long, then find closing quote */
X    }
X#endif
END_OF_FILE
if test 16992 -ne `wc -c <'global.c'`; then
    echo shar: \"'global.c'\" unpacked with wrong size!
fi
# end of 'global.c'
fi
if test -f 'object.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'object.c'\"
else
echo shar: Extracting \"'object.c'\" \(33382 characters\)
sed "s/^X//" >'object.c' <<'END_OF_FILE'
X/* object.c */
X#include "header.h"
X#include "larndefs.h"
X#include "monsters.h"
X#include "objects.h"
X#include "player.h"
X
X#define min(x,y) (((x)>(y))?(y):(x))
X#define max(x,y) (((x)>(y))?(x):(y))
X
X/* LOOK_FOR_OBJECT
X subroutine to look for an object and give the player his options if an object
X was found.
X*/
Xlookforobject(do_ident, do_pickup, do_action)
X    char            do_ident;   /* identify item: T/F */
X    char            do_pickup;  /* pickup item:   T/F */
X    char            do_action;  /* prompt for actions on object: T/F */
X{
X    register int    i, j;
X
X    /* can't find objects if time is stopped    */
X    if (c[TIMESTOP])
X        return;
X    i = item[playerx][playery];
X    if (i == 0)
X        return;
X    j = iarg[playerx][playery];
X    showcell(playerx, playery);
X    cursors();
X    yrepcount = 0;
X    switch (i)
X    {
X    case OGOLDPILE:
X    case OMAXGOLD:
X    case OKGOLD:
X    case ODGOLD:
X        lprcat("\n\nYou have found some gold!");
X        ogold(i);
X        break;
X
X    case OPOTION:
X        if (do_ident)
X        {
X            lprcat("\n\nYou have found a magic potion");
X            if (potionname[j][0])
X                lprintf(" of %s", &potionname[j][1]);
X        }
X        if (do_pickup)
X            if (take(OPOTION, j) == 0)
X                forget();
X        if (do_action)
X            opotion(j);
X        break;
X
X    case OSCROLL:
X        if (do_ident)
X        {
X            lprcat("\n\nYou have found a magic scroll");
X            if (scrollname[j][0])
X                lprintf(" of %s", &scrollname[j][1]);
X        }
X        if (do_pickup)
X            if (take(OSCROLL, j) == 0)
X                forget();
X        if (do_action)
X            oscroll(j);
X        break;
X
X    case OALTAR:
X        if (nearbymonst())
X            return;
X        if (do_ident)
X            lprcat("\n\nThere is a Holy Altar here!");
X        if (do_action)
X            oaltar();
X        break;
X
X    case OBOOK:
X        if (do_ident)
X            lprcat("\n\nYou have found a book.");
X        if (do_pickup)
X            if (take(OBOOK, j) == 0)
X                forget();
X        if (do_action)
X            obook();
X        break;
X
X    case OCOOKIE:
X        if (do_ident)
X            lprcat("\n\nYou have found a fortune cookie.");
X        if (do_pickup)
X            if (take(OCOOKIE, 0) == 0)
X                forget();
X        if (do_action)
X            ocookie();
X        break;
X
X    case OTHRONE:
X        if (nearbymonst())
X            return;
X        if (do_ident)
X            lprintf("\n\nThere is %s here!", objectname[i]);
X        if (do_action)
X            othrone(0);
X        break;
X
X    case OTHRONE2:
X        if (nearbymonst())
X            return;
X        if (do_ident)
X            lprintf("\n\nThere is %s here!", objectname[i]);
X        if (do_action)
X            othrone(1);
X        break;
X
X    case ODEADTHRONE:
X        if (do_ident)
X            lprintf("\n\nThere is %s here!", objectname[i]);
X        if (do_action)
X            odeadthrone();
X        break;
X
X    case OPIT:
X        /* always perform these actions. */
X        lprcat("\n\nYou're standing at the top of a pit.");
X        opit();
X        break;
X
X    case OSTAIRSUP: /* up */
X        if (do_ident)
X            lprcat("\n\nThere is a circular staircase here");
X        if (do_action)
X            ostairs(1);
X        break;
X
X    case OFOUNTAIN:
X        if (nearbymonst())
X            return;
X        if (do_ident)
X            lprcat("\n\nThere is a fountain here");
X        if (do_action)
X            ofountain();
X        break;
X
X    case OSTATUE:
X        if (nearbymonst())
X            return;
X        if (do_ident)
X            lprcat("\n\nYou are standing in front of a statue");
X        if (do_action)
X            ostatue();
X        break;
X
X    case OCHEST:
X        if (do_ident)
X            lprcat("\n\nThere is a chest here");
X        if (do_pickup)
X            if (take(OCHEST, j) == 0)
X                forget();
X        if (do_action)
X            ochest();
X        break;
X
X    case OSCHOOL:
X        if (nearbymonst())
X            return;
X        if (do_ident)
X            lprcat("\n\nYou have found the College of Larn.");
X        if (do_action)
X            prompt_enter();
X        break;
X
X    case OMIRROR:
X        if (nearbymonst())
X            return;
X        if (do_ident)
X            lprcat("\n\nThere is a mirror here");
X        if (do_action)
X            omirror();
X        break;
X
X    case OBANK2:
X        if (nearbymonst())
X            return;
X        if (do_ident)
X            lprcat("\n\nYou have found a branch office of the bank of Larn.");
X        if (do_action)
X            prompt_enter();
X        break;
X
X    case OBANK:
X        if (nearbymonst())
X            return;
X        if (do_ident)
X            lprcat("\n\nYou have found the bank of Larn.");
X        if (do_action)
X            prompt_enter();
X        break;
X
X    case ODEADFOUNTAIN:
X        if (nearbymonst())
X            return;
X        if (do_ident)
X            lprcat("\n\nThere is a dead fountain here");
X        break;
X
X    case ODNDSTORE:
X        if (nearbymonst())
X            return;
X        if (do_ident)
X            lprcat("\n\nThere is a DND store here.");
X        if (do_action)
X            prompt_enter();
X        break;
X
X    case OSTAIRSDOWN:   /* down */
X        if (do_ident)
X            lprcat("\n\nThere is a circular staircase here");
X        if (do_action)
X            ostairs(-1);
X        break;
X
X    case OOPENDOOR:
X        if (do_ident)
X            lprintf("\n\nYou have found %s", objectname[i]);
X        if (do_action)
X            o_open_door();
X        break;
X
X    case OCLOSEDDOOR:
X        if (do_ident)
X            lprintf("\n\nYou have found %s", objectname[i]);
X        if (do_action)
X            o_closed_door();
X        break;
X
X    case OENTRANCE:
X        if (do_ident)
X            lprcat("\nYou have found ");
X        lprcat(objectname[i]);
X        if (do_action)
X            prompt_enter();
X        break;
X
X    case OVOLDOWN:
X        if (do_ident)
X            lprcat("\nYou have found ");
X        lprcat(objectname[i]);
X        if (do_action)
X            prompt_volshaft(-1);
X        break;
X
X    case OVOLUP:
X        if (do_ident)
X            lprcat("\nYou have found ");
X        lprcat(objectname[i]);
X        if (do_action)
X            prompt_volshaft(1);
X        break;
X
X    case OIVTELETRAP:
X        if (rnd(11) < 6)
X            return;
X        item[playerx][playery] = OTELEPORTER;
X        know[playerx][playery] = KNOWALL;
X        /* fall through to OTELEPORTER case below!!! */
X
X    case OTELEPORTER:
X        lprcat("\nZaaaappp!  You've been teleported!\n");
X        beep();
X        nap(3000);
X        oteleport(0);
X        break;
X
X    case OTRAPARROWIV:  /* for an arrow trap */
X        if (rnd(17) < 13)
X            return;
X        item[playerx][playery] = OTRAPARROW;
X        know[playerx][playery] = 0;
X        /* fall through to OTRAPARROW case below!!! */
X
X    case OTRAPARROW:
X        lprcat("\nYou are hit by an arrow");
X        beep();
X        lastnum = 259;
X        losehp(rnd(10) + level);
X        bottomhp();
X        return;
X
X    case OIVDARTRAP:    /* for a dart trap */
X        if (rnd(17) < 13)
X            return;
X        item[playerx][playery] = ODARTRAP;
X        know[playerx][playery] = 0;
X        /* fall through to ODARTTRAP case below!!! */
X
X    case ODARTRAP:
X        lprcat("\nYou are hit by a dart");
X        beep();     /* for a dart trap */
X        lastnum = 260;
X        losehp(rnd(5));
X        if ((--c[STRENGTH]) < 3)
X            c[STRENGTH] = 3;
X        bottomline();
X        return;
X
X    case OIVTRAPDOOR:   /* for a trap door */
X        if (rnd(17) < 13)
X            return;
X        item[playerx][playery] = OTRAPDOOR;
X        know[playerx][playery] = KNOWALL;
X        /* fall through to OTRAPDOOR case below!!! */
X
X    case OTRAPDOOR:
X        lastnum = 272;  /* a trap door */
X        if ((level == MAXLEVEL - 1) || (level == MAXLEVEL + MAXVLEVEL - 1))
X        {
X            lprcat("\nYou fell through a bottomless trap door!");
X            beep();
X            nap(3000);
X            died(271);
X        }
X        i = rnd(5 + level);
X        lprintf("\nYou fall through a trap door!  You lose %d hit points.", (long) i);
X        beep();
X        losehp(i);
X        nap(2000);
X        newcavelevel(level + 1);
X        draws(0, MAXX, 0, MAXY);
X        bot_linex();
X        return;
X
X    case OTRADEPOST:
X        if (nearbymonst())
X            return;
X        if (do_ident)
X            lprcat("\nYou have found the Larn trading Post.");
X        if (do_action)
X            prompt_enter();
X        return;
X
X    case OHOME:
X        if (nearbymonst())
X            return;
X        if (do_ident)
X            lprcat("\nYou have found your way home.");
X        if (do_action)
X            prompt_enter();
X        return;
X
X    case OWALL:
X        break;
X
X    case OANNIHILATION:
X        died(283);  /* annihilated by sphere of annihilation */
X        return;
X
X    case OLRS:
X        if (nearbymonst())
X            return;
X        if (do_ident)
X            lprcat("\n\nThere is an LRS office here.");
X        if (do_action)
X            prompt_enter();
X        break;
X
X    default:
X        if (do_ident)
X        {
X            lprintf("\n\nYou have found %s ", objectname[i]);
X            switch (i)
X            {
X            case ODIAMOND:
X            case ORUBY:
X            case OEMERALD:
X            case OSAPPHIRE:
X            case OSPIRITSCARAB:
X            case OORBOFDRAGON:
X            case OCUBEofUNDEAD:
X            case ONOTHEFT:
X                break;
X
X            default:
X                if (j > 0)
X                    lprintf("+ %d", (long) j);
X                else
X                if (j < 0)
X                    lprintf(" %d", (long) j);
X                break;
X            }
X        }
X        if (do_pickup)
X            if (take(i, j) == 0)
X                forget();
X        if (do_action)
X        {
X            char            tempc = 0;
X
X            lprcat("\nDo you want to (t) take it");
X            iopts();
X            while (tempc != 't' && tempc != 'i' && tempc != '\33')
X                tempc = ttgetch();
X            if (tempc == 't')
X            {
X                lprcat("take");
X                if (take(i, j) == 0)
X                    forget();
X                return;
X            }
X            ignore();
X        }
X        break;
X    };
X}
X
X
X/*
X * subroutine to process the stair cases if dir > 0 the up else down 
X */
Xstatic ostairs(dir)
X    int             dir;
X{
X    register int    k;
X    lprcat("\nDo you (s) stay here ");
X    if (dir > 0)
X        lprcat("or (u) go up? ");
X    else
X        lprcat("or (d) go down? ");
X
X    while (1)
X        switch (ttgetch())
X        {
X        case '\33':
X        case 's':
X        case 'i':
X            lprcat("stay here");
X            return;
X
X        case 'u':
X            lprcat("go up");
X            act_up_stairs();
X            return;
X
X        case 'd':
X            lprcat("go down");
X            act_down_stairs();
X            return;
X        };
X}
X
X
X
X/*
X * subroutine to handle a teleport trap +/- 1 level maximum 
X */
Xoteleport(err)
X    int             err;
X{
X    register int    tmp;
X    if (err)
X        if (rnd(151) < 3)
X            died(264);  /* stuck in a rock */
X    c[TELEFLAG] = 1;    /* show ?? on bottomline if been teleported    */
X    if (level == 0)
X        tmp = 0;
X    else
X    if (level < MAXLEVEL)
X    {
X        tmp = rnd(5) + level - 3;
X        if (tmp >= MAXLEVEL)
X            tmp = MAXLEVEL - 1;
X        if (tmp < 1)
X            tmp = 1;
X    } else
X    {
X        tmp = rnd(3) + level - 2;
X        if (tmp >= MAXLEVEL + MAXVLEVEL)
X            tmp = MAXLEVEL + MAXVLEVEL - 1;
X        if (tmp < MAXLEVEL)
X            tmp = MAXLEVEL;
X    }
X    playerx = rnd(MAXX - 2);
X    playery = rnd(MAXY - 2);
X    if (level != tmp)
X        newcavelevel(tmp);
X    positionplayer();
X    draws(0, MAXX, 0, MAXY);
X    bot_linex();
X}
X
X
X/*
X * function to process a potion 
X */
Xstatic opotion(pot)
X    int             pot;
X{
X    lprcat("\nDo you (d) drink it, (t) take it");
X    iopts();
X    while (1)
X        switch (ttgetch())
X        {
X        case '\33':
X        case 'i':
X            ignore();
X            return;
X
X        case 'd':
X            lprcat("drink\n");
X            forget();   /* destroy potion  */
X            quaffpotion(pot, TRUE);
X            return;
X
X        case 't':
X            lprcat("take\n");
X            if (take(OPOTION, pot) == 0)
X                forget();
X            return;
X        };
X}
X
X/*
X * function to drink a potion 
X *
X * Also used to perform the action of a potion without quaffing a potion (see
X * invisible capability when drinking from a fountain). 
X */
Xquaffpotion(pot, set_known)
X    int             pot;
X    int             set_known;
X{
X    register int    i, j, k;
X
X    /* check for within bounds */
X    if (pot < 0 || pot >= MAXPOTION)
X        return;
X
X    /*
X     * if player is to know this potion (really quaffing one), make it
X     * known 
X     */
X    if (set_known)
X        potionname[pot][0] = ' ';
X
X    switch (pot)
X    {
X    case 0:
X        lprcat("\nYou fall asleep. . .");
X        i = rnd(11) - (c[CONSTITUTION] >> 2) + 2;
X        while (--i > 0)
X        {
X            parse2();
X            nap(1000);
X        }
X        cursors();
X        lprcat("\nYou woke up!");
X        return;
X
X    case 1:
X        lprcat("\nYou feel better");
X        if (c[HP] == c[HPMAX])
X            raisemhp(1);
X        else
X        if ((c[HP] += rnd(20) + 20 + c[LEVEL]) > c[HPMAX])
X            c[HP] = c[HPMAX];
X        break;
X
X    case 2:
X        lprcat("\nSuddenly, you feel much more skillful!");
X        raiselevel();
X        raisemhp(1);
X        return;
X
X    case 3:
X        lprcat("\nYou feel strange for a moment");
X        c[rund(6)]++;
X        break;
X
X    case 4:
X        lprcat("\nYou feel more self confident!");
X        c[WISDOM] += rnd(2);
X        break;
X
X    case 5:
X        lprcat("\nWow!  You feel great!");
X        if (c[STRENGTH] < 12)
X            c[STRENGTH] = 12;
X        else
X            c[STRENGTH]++;
X        break;
X
X    case 6:
X        lprcat("\nYour charm went up by one!");
X        c[CHARISMA]++;
X        break;
X
X    case 7:
X        lprcat("\nYou become dizzy!");
X        if (--c[STRENGTH] < 3)
X            c[STRENGTH] = 3;
X        break;
X
X    case 8:
X        lprcat("\nYour intelligence went up by one!");
X        c[INTELLIGENCE]++;
X        break;
X
X    case 9:
X        lprcat("\nYou sense the presence of objects!");
X        nap(1000);
X        if (c[BLINDCOUNT])
X            return;
X        for (i = 0; i < MAXY; i++)
X            for (j = 0; j < MAXX; j++)
X                switch (item[j][i])
X                    {
X                    case OPLATE:
X                    case OCHAIN:
X                    case OLEATHER:
X                    case ORING:
X                    case OSTUDLEATHER:
X                    case OSPLINT:
X                    case OPLATEARMOR:
X                    case OSSPLATE:
X                    case OSHIELD:
X                    case OSWORDofSLASHING:
X                    case OHAMMER:
X                    case OSWORD:
X                    case O2SWORD:
X                    case OSPEAR:
X                    case ODAGGER:
X                    case OBATTLEAXE:
X                    case OLONGSWORD:
X                    case OFLAIL:
X                    case OLANCE:
X                    case ORINGOFEXTRA:
X                    case OREGENRING:
X                    case OPROTRING:
X                    case OENERGYRING:
X                    case ODEXRING:
X                    case OSTRRING:
X                    case OCLEVERRING:
X                    case ODAMRING:
X                    case OBELT:
X                    case OSCROLL:
X                    case OPOTION:
X                    case OBOOK:
X                    case OCHEST:
X                    case OAMULET:
X                    case OORBOFDRAGON:
X                    case OSPIRITSCARAB:
X                    case OCUBEofUNDEAD:
X                    case ONOTHEFT:
X                    case OCOOKIE:
X                        know[j][i] = HAVESEEN;
X                        show1cell(j, i);
X                        break;
X                    }
X        showplayer();
X        return;
X
X    case 10:        /* monster detection */
X        lprcat("\nYou detect the presence of monsters!");
X        nap(1000);
X        if (c[BLINDCOUNT])
X            return;
X        for (i = 0; i < MAXY; i++)
X            for (j = 0; j < MAXX; j++)
X                if (mitem[j][i] && (monstnamelist[mitem[j][i]] != floorc))
X                {
X                    know[j][i] = HAVESEEN;
X                    show1cell(j, i);
X                }
X        return;
X
X    case 11:
X        lprcat("\nYou stagger for a moment . .");
X        for (i = 0; i < MAXY; i++)
X            for (j = 0; j < MAXX; j++)
X                know[j][i] = 0;
X        nap(1000);
X        draws(0, MAXX, 0, MAXY);    /* potion of forgetfulness */
X        return;
X
X    case 12:
X        lprcat("\nThis potion has no taste to it");
X        return;
X
X    case 13:
X        lprcat("\nYou can't see anything!");    /* blindness */
X        c[BLINDCOUNT] += 500;
X        return;
X
X    case 14:
X        lprcat("\nYou feel confused");
X        c[CONFUSE] += 20 + rnd(9);
X        return;
X
X    case 15:
X        lprcat("\nWOW!!!  You feel Super-fantastic!!!");
X        if (c[HERO] == 0)
X            for (i = 0; i < 6; i++)
X                c[i] += 11;
X        c[HERO] += 250;
X        break;
X
X    case 16:
X        lprcat("\nYou have a greater intestinal constitude!");
X        c[CONSTITUTION]++;
X        break;
X
X    case 17:
X        lprcat("\nYou now have incredibly bulging muscles!!!");
X        if (c[GIANTSTR] == 0)
X            c[STREXTRA] += 21;
X        c[GIANTSTR] += 700;
X        break;
X
X    case 18:
X        lprcat("\nYou feel a chill run up your spine!");
X        c[FIRERESISTANCE] += 1000;
X        break;
X
X    case 19:
X        lprcat("\nYou feel greedy . . .");
X        nap(1000);
X        if (c[BLINDCOUNT])
X            return;
X        for (i = 0; i < MAXY; i++)
X            for (j = 0; j < MAXX; j++)
X            {
X                k = item[j][i];
X                if ((k == ODIAMOND)  ||
X                    (k == ORUBY)     ||
X                    (k == OEMERALD)  ||
X                    (k == OMAXGOLD)  ||
X                    (k == OSAPPHIRE) ||
X                    (k == OLARNEYE)  ||
X                    (k == OGOLDPILE))
X                {
X                    know[j][i] = HAVESEEN;
X                    show1cell(j, i);
X                }
X            }
X        showplayer();
X        return;
X
X    case 20:
X        c[HP] = c[HPMAX];
X        break;      /* instant healing */
X
X    case 21:
X        lprcat("\nYou don't seem to be affected");
X        return;     /* cure dianthroritis */
X
X    case 22:
X        lprcat("\nYou feel a sickness engulf you"); /* poison */
X        c[HALFDAM] += 200 + rnd(200);
X        return;
X
X    case 23:
X        lprcat("\nYou feel your vision sharpen");   /* see invisible */
X        c[SEEINVISIBLE] += rnd(1000) + 400;
X        monstnamelist[INVISIBLESTALKER] = 'I';
X        return;
X    };
X    bottomline();       /* show new stats      */
X    return;
X}
X
X
X/*
X * function to process a magic scroll 
X */
Xstatic oscroll(typ)
X    int             typ;
X{
X    lprcat("\nDo you ");
X    if (c[BLINDCOUNT] == 0)
X        lprcat("(r) read it, ");
X    lprcat("(t) take it");
X    iopts();
X    while (1)
X        switch (ttgetch())
X        {
X        case '\33':
X        case 'i':
X            ignore();
X            return;
X
X        case 'r':
X            if (c[BLINDCOUNT])
X                break;
X            lprcat("read");
X            forget();
X            if (typ == 2 || typ == 15)
X            {
X                show1cell(playerx, playery);
X                cursors();
X            }
X             /* destroy it  */ read_scroll(typ);
X            return;
X
X        case 't':
X            lprcat("take");
X            if (take(OSCROLL, typ) == 0)
X                forget();   /* destroy it  */
X            return;
X        };
X}
X
X/*
X * data for the function to read a scroll 
X */
Xstatic int   xh, yh, yl, xl;
Xstatic char  curse[] = {BLINDCOUNT, CONFUSE, AGGRAVATE, HASTEMONST, ITCHING,
X                        LAUGHING, DRAINSTRENGTH, CLUMSINESS, INFEEBLEMENT, 
X                        HALFDAM};
Xstatic char  exten[] = {PROTECTIONTIME, DEXCOUNT, STRCOUNT, CHARMCOUNT,
X                        INVISIBILITY, CANCELLATION, HASTESELF, GLOBE,
X                        SCAREMONST, HOLDMONST, TIMESTOP};
Xstatic char  time_change[] = {HASTESELF, HERO, ALTPRO, PROTECTIONTIME, DEXCOUNT,
X                              STRCOUNT, GIANTSTR, CHARMCOUNT, INVISIBILITY,
X                              CANCELLATION,HASTESELF, AGGRAVATE, SCAREMONST,
X                              STEALTH, AWARENESS, HOLDMONST, HASTEMONST,
X                              FIRERESISTANCE, GLOBE, SPIRITPRO, UNDEADPRO,
X                              HALFDAM, SEEINVISIBLE, ITCHING, CLUMSINESS, WTW};
X/*
X * function to adjust time when time warping and taking courses in school
X */
Xadjtime(tim)
X    register long   tim;
X{
X    register int    j;
X    for (j = 0; j < 26; j++)/* adjust time related parameters */
X        if (c[time_change[j]])
X            if ((c[time_change[j]] -= tim) < 1)
X                c[time_change[j]] = 1;
X    regen();
X}
X
X/*
X * function to read a scroll 
X */
Xread_scroll(typ)
X    int             typ;
X{
X    register int    i, j;
X    if (typ < 0 || typ >= MAXSCROLL)
X        return;     /* be sure we are within bounds */
X    scrollname[typ][0] = ' ';
X    switch (typ)
X    {
X    case 0:
X        lprcat("\nYour armor glows for a moment");
X        enchantarmor();
X        return;
X
X    case 1:
X        lprcat("\nYour weapon glows for a moment");
X        enchweapon();
X        return;     /* enchant weapon */
X
X    case 2:
X        lprcat("\nYou have been granted enlightenment!");
X        yh = min(playery + 7, MAXY);
X        xh = min(playerx + 25, MAXX);
X        yl = max(playery - 7, 0);
X        xl = max(playerx - 25, 0);
X        for (i = yl; i < yh; i++)
X            for (j = xl; j < xh; j++)
X                know[j][i] = KNOWALL;
X        draws(xl, xh, yl, yh);
X        return;
X
X    case 3:
X        lprcat("\nThis scroll seems to be blank");
X        return;
X
X    case 4:
X        createmonster(makemonst(level + 1));
X        return;     /* this one creates a monster  */
X
X    case 5:
X        something(level);   /* create artifact     */
X        return;
X
X    case 6:
X        c[AGGRAVATE] += 800;
X        return;     /* aggravate monsters */
X
X    case 7:
X        gtime += (i = rnd(1000) - 850); /* time warp */
X        if (i >= 0)
X            lprintf("\nYou went forward in time by %d mobuls", (long) ((i + 99) / 100));
X        else
X            lprintf("\nYou went backward in time by %d mobuls", (long) (-(i + 99) / 100));
X        adjtime((long) i);  /* adjust time for time warping */
X        return;
X
X    case 8:
X        oteleport(0);
X        return;     /* teleportation */
X
X    case 9:
X        c[AWARENESS] += 1800;
X        return;     /* expanded awareness   */
X
X    case 10:
X        c[HASTEMONST] += rnd(55) + 12;
X        return;     /* haste monster */
X
X    case 11:
X        for (i = 0; i < MAXY; i++)
X            for (j = 0; j < MAXX; j++)
X                if (mitem[j][i])
X                    hitp[j][i] = monster[mitem[j][i]].hitpoints;
X        return;     /* monster healing */
X    case 12:
X        c[SPIRITPRO] += 300 + rnd(200);
X        bottomline();
X        return;     /* spirit protection */
X
X    case 13:
X        c[UNDEADPRO] += 300 + rnd(200);
X        bottomline();
X        return;     /* undead protection */
X
X    case 14:
X        c[STEALTH] += 250 + rnd(250);
X        bottomline();
X        return;     /* stealth */
X
X    case 15:
X        lprcat("\nYou have been granted enlightenment!");   /* magic mapping */
X        for (i = 0; i < MAXY; i++)
X            for (j = 0; j < MAXX; j++)
X                know[j][i] = KNOWALL;
X        draws(0, MAXX, 0, MAXY);
X        return;
X
X    case 16:
X        c[HOLDMONST] += 30;
X        bottomline();
X        return;     /* hold monster */
X
X    case 17:
X        for (i = 0; i < 26; i++)    /* gem perfection */
X            switch (iven[i])
X            {
X            case ODIAMOND:
X            case ORUBY:
X            case OEMERALD:
X            case OSAPPHIRE:
X                j = ivenarg[i];
X                j &= 255;
X                j <<= 1;
X                if (j > 255)
X                    j = 255;    /* double value */
X                ivenarg[i] = j;
X                break;
X            }
X        break;
X
X    case 18:
X        for (i = 0; i < 11; i++)
X            c[exten[i]] <<= 1;  /* spell extension */
X        break;
X
X    case 19:
X        for (i = 0; i < 26; i++)    /* identify */
X        {
X            if (iven[i] == OPOTION)
X                potionname[ivenarg[i]][0] = ' ';
X            if (iven[i] == OSCROLL)
X                scrollname[ivenarg[i]][0] = ' ';
X        }
X        break;
X
X    case 20:
X        for (i = 0; i < 10; i++)    /* remove curse */
X            if (c[curse[i]])
X                c[curse[i]] = 1;
X        break;
X
X    case 21:
X        annihilate();
X        break;      /* scroll of annihilation */
X
X    case 22:
X        godirect(22, 150, "The ray hits the %s", 0, ' ');   /* pulverization */
X        break;
X    case 23:
X        c[LIFEPROT]++;
X        break;      /* life protection */
X    };
X}
X
Xstatic opit()
X{
X    register int    i;
X    if (rnd(101) < 81)
X        if (rnd(70) > 9 * c[DEXTERITY] - packweight() || rnd(101) < 5)
X            if (level == MAXLEVEL - 1)
X                obottomless();
X            else
X            if (level == MAXLEVEL + MAXVLEVEL - 1)
X                obottomless();
X            else
X            {
X                if (rnd(101) < 20)
X                {
X                    i = 0;
X                    lprcat("\nYou fell into a pit!  Your fall is cushioned by an unknown force\n");
X                } else
X                {
X                    i = rnd(level * 3 + 3);
X                    lprintf("\nYou fell into a pit!  You suffer %d hit points damage", (long) i);
X                    lastnum = 261;  /* if he dies scoreboard
X                             * will say so */
X                }
X                losehp(i);
X                nap(2000);
X                newcavelevel(level + 1);
X                draws(0, MAXX, 0, MAXY);
X            }
X}
X
Xstatic obottomless()
X{
X    lprcat("\nYou fell into a bottomless pit!");
X    beep();
X    nap(3000);
X    died(262);
X}
X
Xstatic ostatue()
X{
X}
X
Xstatic omirror()
X{
X}
X
Xstatic obook()
X{
X    lprcat("\nDo you ");
X    if (c[BLINDCOUNT] == 0)
X        lprcat("(r) read it, ");
X    lprcat("(t) take it");
X    iopts();
X    while (1)
X        switch (ttgetch())
X        {
X        case '\33':
X        case 'i':
X            ignore();
X            return;
X
X        case 'r':
X            if (c[BLINDCOUNT])
X                break;
X            lprcat("read");
X             /* no more book */ readbook(iarg[playerx][playery]);
X            forget();
X            return;
X
X        case 't':
X            lprcat("take");
X            if (take(OBOOK, iarg[playerx][playery]) == 0)
X                forget();   /* no more book */
X            return;
X        };
X}
X
X/*
X * function to read a book 
X */
Xreadbook(lev)
X    register int    lev;
X{
X    register int    i, tmp;
X    if (lev <= 3)
X        i = rund((tmp = splev[lev]) ? tmp : 1);
X    else
X        i = rnd((tmp = splev[lev] - 9) ? tmp : 1) + 9;
X    spelknow[i] = 1;
X    lprintf("\nSpell \"%s\":  %s\n%s", spelcode[i], spelname[i], speldescript[i]);
X    if (rnd(10) == 4)
X    {
X        lprcat("\nYour int went up by one!");
X        c[INTELLIGENCE]++;
X        bottomline();
X    }
X}
X
Xstatic ocookie()
X{
X    char           *p;
X    lprcat("\nDo you (e) eat it, (t) take it");
X    iopts();
X    while (1)
X        switch (ttgetch())
X        {
X        case '\33':
X        case 'i':
X            ignore();
X            return;
X
X        case 'e':
X            lprcat("eat");
X            forget();   /* no more cookie */
X            outfortune();
X            return;
X
X        case 't':
X            lprcat("take");
X            if (take(OCOOKIE, 0) == 0)
X                forget();   /* no more book */
X            return;
X        };
X}
X
X/*
X * routine to pick up some gold -- if arg==OMAXGOLD then the pile is worth
X * 100* the argument
X */
Xstatic ogold(arg)
X    int             arg;
X{
X    register long   i;
X    i = iarg[playerx][playery];
X    if (arg == OMAXGOLD)
X        i *= 100;
X    else
X    if (arg == OKGOLD)
X        i *= 1000;
X    else
X    if (arg == ODGOLD)
X        i *= 10;
X    lprintf("\nIt is worth %d!", (long) i);
X    c[GOLD] += i;
X    bottomgold();
X    item[playerx][playery] = know[playerx][playery] = 0;    /* destroy gold    */
X}
X
Xohome()
X{
X    register int    i;
X    nosignal = 1;       /* disable signals */
X    for (i = 0; i < 26; i++)
X        if (iven[i] == OPOTION)
X            if (ivenarg[i] == 21)
X            {
X                iven[i] = 0;    /* remove the potion of cure
X                         * dianthroritis from
X                         * inventory */
X                clear();
X                lprcat("Congratulations.  You found a potion of cure dianthroritis.\n");
X                lprcat("\nFrankly, No one thought you could do it.  Boy!  Did you surprise them!\n");
X                if (gtime > TIMELIMIT)
X                {
X                    lprcat("\nThe doctor has the sad duty to inform you that your daughter died");
X                    lprcat("\nbefore your return.  There was nothing he could do without the potion.\n");
X                    nap(5000);
X                    died(269);
X                } else
X                {
X                    lprcat("\nThe doctor is now administering the potion, and in a few moments\n");
X                    lprcat("your daughter should be well on her way to recovery.\n");
X                    nap(6000);
X                    lprcat("\nThe potion is");
X                    nap(3000);
X                    lprcat(" working!  The doctor thinks that\n");
X                    lprcat("your daughter will recover in a few days.  Congratulations!\n");
X                    beep();
X                    nap(5000);
X                    died(263);
X                }
X            }
X    while (1)
X    {
X        clear();
X        lprintf("Welcome home %s.  Latest word from the doctor is not good.\n", logname);
X
X        if (gtime > TIMELIMIT)
X        {
X            lprcat("\nThe doctor has the sad duty to inform you that your daughter died!\n");
X            lprcat("You didn't make it in time.  There was nothing he could do without the potion.\n");
X            nap(5000);
X            died(269);
X        }
X        lprcat("\nThe diagnosis is confirmed as dianthroritis.  He guesses that\n");
X        lprintf("your daughter has only %d mobuls left in this world.  It's up to you,\n", (long) ((TIMELIMIT - gtime + 99) / 100));
X        lprintf("%s, to find the only hope for your daughter, the very rare\n", logname);
X        lprcat("potion of cure dianthroritis.  It is rumored that only deep in the\n");
X        lprcat("depths of the caves can this potion be found.\n\n\n");
X        lprcat("\n     ----- press ");
X        standout("return");
X        lprcat(" to continue, ");
X        standout("escape");
X        lprcat(" to leave ----- ");
X        i = ttgetch();
X        while (i != '\33' && i != '\n')
X            i = ttgetch();
X        if (i == '\33')
X        {
X            drawscreen();
X            nosignal = 0;   /* enable signals */
X            return;
X        }
X    }
X}
X
X/* routine to save program space   */
Xiopts()
X{
X    lprcat(", or (i) ignore it? ");
X}
Xignore()
X{
X    lprcat("ignore\n");
X}
X
X/*
X * For prompt mode, prompt for entering a building.
X */
Xstatic prompt_enter()
X{
X    char            i;
X
X    lprcat("\nDo you (g) go inside, or (i) stay here? ");
X    i = 0;
X    while ((i != 'g') && (i != 'i') && (i != '\33'))
X        i = ttgetch();
X    if (i == 'g')
X        enter();
X    else
X        lprcat(" stay here");
X}
X
X/*
X * For prompt mode, prompt for climbing up/down the volcanic shaft. 
X *
X * Takes one parameter: if it is negative, going down the shaft, otherwise,
X * going up the shaft. 
X */
Xstatic prompt_volshaft(dir)
X    int             dir;
X{
X    char            i;
X
X    lprcat("\nDo you (c) climb ");
X    if (dir > 0)
X        lprcat("up");
X    else
X        lprcat("down");
X    iopts();
X
X    i = 0;
X    while ((i != 'c') && (i != 'i') && (i != '\33'))
X        i = ttgetch();
X
X    if ((i == '\33') || (i == 'i'))
X    {
X        ignore();
X        return;
X    }
X    if (dir > 0)
X        act_up_shaft();
X    else
X        act_down_shaft();
X}
X
Xstatic o_open_door()
X{
X    char            i;
X    lprcat("\nDo you (c) close it");
X    iopts();
X    i = 0;
X    while ((i != 'c') && (i != 'i') && (i != '\33'))
X        i = ttgetch();
X    if ((i == '\33') || (i == 'i'))
X    {
X        ignore();
X        return;
X    }
X    lprcat("close");
X    forget();
X    item[playerx][playery] = OCLOSEDDOOR;
X    iarg[playerx][playery] = 0;
X    playerx = lastpx;
X    playery = lastpy;
X}
X
Xstatic o_closed_door()
X{
X    char            i;
X    lprcat("\nDo you (o) try to open it");
X    iopts();
X    i = 0;
X    while ((i != 'o') && (i != 'i') && (i != '\33'))
X        i = ttgetch();
X    if ((i == '\33') || (i == 'i'))
X    {
X        ignore();
X        playerx = lastpx;
X        playery = lastpy;
X        return;
X    } else
X    {
X        lprcat("open");
X        /*
X         * if he failed to open the door ... 
X         */
X        if (!act_open_door(playerx, playery))
X        {
X            playerx = lastpx;
X            playery = lastpy;
X        }
X    }
X}
END_OF_FILE
if test 33382 -ne `wc -c <'object.c'`; then
    echo shar: \"'object.c'\" unpacked with wrong size!
fi
# end of 'object.c'
fi
echo shar: End of archive 2 \(of 12\).
cp /dev/null ark2isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 12 archives.
    rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0