[comp.sources.games] v11i092: larn - dungeon type adventure game, Part09/11

billr@saab.CNA.TEK.COM (Bill Randle) (12/19/90)

Submitted-by: routley@tle.ENET.DEC.COM (Kevin Routley)
Posting-number: Volume 11, Issue 92
Archive-name: larn/Part09
Environment: Unix, VMS, MS-DOS, 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 9 (of 11)."
# Contents:  action.c larn_hlp.uue moreobj.c regen.c tgetent.c
# Wrapped by billr@saab on Tue Dec 18 10:14:22 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'action.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'action.c'\"
else
echo shar: Extracting \"'action.c'\" \(13238 characters\)
sed "s/^X//" >'action.c' <<'END_OF_FILE'
X/*
X    action.c
X
X    Routines to perform the actual actions associated with various
X    player entered commands.
X
X    act_remove_gems         remove gems from a throne
X    act_sit_throne          sit on a throne
X    act_kick_stairs         kick the stairs
X    act_up_stairs           go up stairs
X    act_down_stairs         go down stairs
X    act_drink_fountain      drink from a fountain
X    act_wash_fountain       wash at a fountain
X    act_up_shaft            up volcanic shaft
X    act_down_shaft          down volcanic shaft
X    volshaft_climbed        place player near volcanic shaft
X    act_desecrate_altar     desecrate an altar
X    act_donation_pray       pray, donating money
X    act_just_pray           pray, not donating money
X    act_prayer_heard        prayer was heard
X    act_ignore_altar        ignore an altar
X    act_open_chest          open a chest
X    act_open_door           open a door
X*/
X
X#include "header.h"
X
X/*
X    act_remove_gems
X
X    Remove gems from a throne.
X
X    arg is zero if there is a gnome king associated with the throne
X
X    Assumes that cursors() has been called previously, and that a check
X    has been made that the throne actually has gems.
X*/
Xact_remove_gems( arg )
Xint arg ;
X    {
X    int i, k ;
X
X    k=rnd(101);
X    if (k<25)
X        {
X        for (i=0; i<rnd(4); i++) 
X            creategem(); /* gems pop off the throne */
X        item[playerx][playery]=ODEADTHRONE;
X        know[playerx][playery]=0;
X        }
X    else if (k<40 && arg==0)
X        {
X        createmonster(GNOMEKING);
X        item[playerx][playery]=OTHRONE2;
X        know[playerx][playery]=0;
X        }
X    else 
X        lprcat("\nNothing happens");
X
X    return ;
X    }
X
X/*
X    act_sit_throne
X
X    Sit on a throne.
X
X    arg is zero if there is a gnome king associated with the throne
X
X    Assumes that cursors() has been called previously.
X*/
Xact_sit_throne( arg )
Xint arg ;
X    {
X    int k ;
X
X    k=rnd(101);
X    if (k<30 && arg==0)
X        {
X        createmonster(GNOMEKING);
X        item[playerx][playery]=OTHRONE2;
X        know[playerx][playery]=0;
X        }
X    else if (k<35) 
X        { 
X        lprcat("\nZaaaappp!  You've been teleported!\n"); 
X        beep(); 
X        oteleport(0); 
X        }
X    else 
X        lprcat("\nNothing happens");
X
X    return ;
X    }
X
X/*
X    assumes that cursors() has been called, and that a check has been made
X    that the player is actually standing at a set of stairs.
X*/
Xact_kick_stairs()
X    {
X    int k ;
X
X    if (rnd(2) == 1)
X        lprcat("\nI hope you feel better. Showing anger rids you of frustration.");
X    else
X        {
X        k = rnd((level + 1) << 1) ;
X        lprintf("\nYou hurt your foot dumb dumb!  You suffer %d hit points", (long)k );
X        lastnum = 276 ;
X        losehp(k) ;
X        bottomline();
X        }
X    return ;
X}
X
X/*
X    assumes that cursors() has been called and that a check has been made that
X    the user is actually standing at a set of up stairs.
X*/
Xact_up_stairs()
X    {
X    if (level >= 2 && level != 11)
X        {
X        newcavelevel( level - 1 )  ;
X        draws( 0, MAXX, 0, MAXY );
X        bot_linex() ;
X        }
X    else
X        lprcat("\nThe stairs lead to a dead end!") ;
X    return ;
X    }
X
X/*
X    assumes that cursors() has been called and that a check has been made that
X    the user is actually standing at a set of down stairs.
X*/
Xact_down_stairs()
X    {
X    if (level != 0 && level != 10 && level != 13)
X        {
X        newcavelevel( level + 1 )  ;
X        draws( 0, MAXX, 0, MAXY );
X        bot_linex() ;
X        }
X    else
X        lprcat("\nThe stairs lead to a dead end!") ;
X    return ;
X    }
X
X/*
X    Code to perform the action of drinking at a fountian.  Assumes that
X    cursors() has already been called, and that a check has been made that
X    the player is actually standing at a live fountain.
X*/
Xact_drink_fountain()
X    {
X    int x ;
X
X    if (rnd(1501)<2)
X        {
X        lprcat("\nOops!  You seem to have caught the dreadful sleep!");
X        beep(); 
X        lflush();  
X        sleep(3);  
X        died(280); 
X        return;
X        }
X
X    x = rnd(100);
X    if (x<7)
X        {
X        c[HALFDAM] += 200 + rnd(200);
X        lprcat("\nYou feel a sickness coming on");
X        }
X
X    else if (x < 13)
X        quaffpotion(23, FALSE ); /* see invisible,but don't know the potion */
X
X    else if (x < 45)
X        lprcat("\nnothing seems to have happened");
X
X    else if (rnd(3) != 2)
X        fntchange(1);   /*  change char levels upward   */
X
X    else
X        fntchange(-1);  /*  change char levels downward */
X
X    if (rnd(12)<3)
X        {
X        lprcat("\nThe fountains bubbling slowly quiets");
X        item[playerx][playery]=ODEADFOUNTAIN; /* dead fountain */
X        know[playerx][playery]=0;
X        }
X    return;
X    }
X
X/*
X    Code to perform the action of washing at a fountain.  Assumes that
X    cursors() has already been called and that a check has been made that
X    the player is actually standing at a live fountain.
X*/
Xact_wash_fountain()
X    {
X    int x ;
X
X    if (rnd(100) < 11)
X        {
X        x=rnd((level<<2)+2);
X        lprintf("\nOh no!  The water was foul!  You suffer %d hit points!",(long)x);
X        lastnum=273;
X        losehp(x); 
X        bottomline();  
X        cursors();
X        }
X
X    else if (rnd(100) < 29)
X        lprcat("\nYou got the dirt off!");
X
X    else if (rnd(100) < 31)
X        lprcat("\nThis water seems to be hard water!  The dirt didn't come off!");
X
X    else if (rnd(100) < 34)
X        createmonster(WATERLORD); /*    make water lord     */
X
X    else
X        lprcat("\nnothing seems to have happened");
X
X    return;
X    }
X
X/*
X    Perform the act of climbing down the volcanic shaft.  Assumes
X    cursors() has been called and that a check has been made that
X    are actually at a down shaft.
X*/
Xact_down_shaft()
X    {
X    if (level!=0) 
X        { 
X        lprcat("\nThe shaft only extends 5 feet downward!"); 
X        return; 
X        }
X
X    if (packweight() > 45+3*(c[STRENGTH]+c[STREXTRA])) 
X        { 
X        lprcat("\nYou slip and fall down the shaft"); 
X        beep();
X        lastnum=275;  
X        losehp(30+rnd(20)); 
X        bottomhp(); 
X        }
X    else if (prompt_mode) 
X        lprcat("climb down");  
X
X    nap(3000);  
X    newcavelevel(MAXLEVEL);
X    volshaft_climbed( OVOLUP );
X    return;
X    }
X
X/*
X    Perform the action of climbing up the volcanic shaft. Assumes
X    cursors() has been called and that a check has been made that
X    are actually at an up shaft.
X
X*/
Xact_up_shaft()
X    {
X    if (level!=11) 
X        { 
X        lprcat("\nThe shaft only extends 8 feet upwards before you find a blockage!"); 
X        return; 
X        }
X
X    if (packweight() > 45+5*(c[STRENGTH]+c[STREXTRA])) 
X        { 
X        lprcat("\nYou slip and fall down the shaft"); 
X        beep();
X        lastnum=275; 
X        losehp(15+rnd(20)); 
X        bottomhp(); 
X        return; 
X        }
X
X    if (prompt_mode)
X        lprcat("climb up"); 
X    lflush(); 
X    nap(3000); 
X    newcavelevel(0);
X    volshaft_climbed( OVOLDOWN );
X    return;
X    }
X
X/*
X    Perform the action of placing the player near the volcanic shaft
X    after it has been climbed.
X
X    Takes one parameter:  the volcanic shaft object to be found.  If have
X    climbed up, search for OVOLDOWN, otherwise search for OVOLUP.
X*/
Xstatic volshaft_climbed(object)
Xint object;
X    {
X    int i,j ;
X
X    /* place player near the volcanic shaft */
X    for (i=0; i<MAXY; i++)
X        for (j=0; j<MAXX; j++)
X            if (item[j][i] == object)
X                {
X                playerx=j;
X                playery=i;
X                positionplayer();
X                i=MAXY;
X                break;
X                }
X    draws(0,MAXX,0,MAXY);
X    bot_linex();
X    return ;
X    }
X
X/*
X    Perform the actions associated with Altar desecration.
X*/
Xact_desecrate_altar()
X    {
X    if (rnd(100)<60)
X	{ 
X	createmonster(makemonst(level+2)+8); 
X	c[AGGRAVATE] += 2500; 
X	}
X    else if (rnd(101)<30)
X	{
X	lprcat("\nThe altar crumbles into a pile of dust before your eyes");
X	forget();   /*  remember to destroy the altar   */
X	}
X    else
X	lprcat("\nnothing happens");
X    return ;
X    }
X
X/*
X    Perform the actions associated with praying at an altar and giving a 
X    donation.
X*/
Xact_donation_pray()
X    {
X    unsigned long k,temp ;
X
X    lprcat("\n\n");  
X    cursor(1,24);  
X    cltoeoln();
X    cursor(1,23);  
X    cltoeoln();
X    lprcat("how much do you donate? ");
X    k = readnum((long)c[GOLD]);
X
X/* VMS has a problem with echo mode input (used in readnum()) such that the
X   next carriage return will shift the screen up one line.  To get around
X   this, if we are VMS, don't print the next carriage return.  Otherwise,
X   print the carriage return needed by all following messages.
X*/
X#ifndef VMS
X#ifndef ultrix
X    lprcat("\n");
X#endif
X#endif
X
X    /* make giving zero gold equivalent to 'just pray'ing.  Allows player to
X       'just pray' in command mode, without having to add yet another command.
X    */
X    if (k == 0)
X	{
X        act_just_pray();
X	return;
X	}
X
X    if (c[GOLD]<k)
X	{
X        lprcat("You don't have that much!");	
X	return;
X	}
X    temp = c[GOLD] / 10 ;
X    c[GOLD] -= k;
X    /* if player gave less than 10% of _original_ gold, make a monster
X    */
X    if (k < temp || k<rnd(50))
X	{ 
X	createmonster(makemonst(level+1)); 
X	c[AGGRAVATE] += 200; 
X	}
X    else if (rnd(101) > 50) 
X	{ 
X	act_prayer_heard(); 
X	return; 
X	}
X    else if (rnd(43) == 5)
X	{
X	if (c[WEAR]) 
X	    lprcat("You feel your armor vibrate for a moment");
X	enchantarmor(); 
X	return;
X	}
X    else if (rnd(43) == 8)
X	{
X	if (c[WIELD]) 
X	    lprcat("You feel your weapon vibrate for a moment");
X	enchweapon(); 
X	return;
X	}
X    else    
X	lprcat("Thank You.");
X    bottomline();
X    return ;
X    }
X
X/*
X    Performs the actions associated with 'just praying' at the altar.  Called
X    when the user responds 'just pray' when in prompt mode, or enters 0 to
X    the money prompt when praying.
X
X    Assumes cursors(), and that any leading \n have been printed (to get
X    around VMS echo mode problem.
X*/
Xact_just_pray()
X    {
X    if (rnd(100)<75) 
X	lprcat("nothing happens");
X    else if (rnd(43) == 10)
X	{
X	if (c[WEAR]) 
X	    lprcat("You feel your armor vibrate for a moment");
X	enchantarmor(); 
X	return;
X	}
X    else if (rnd(43) == 10)
X	{
X	if (c[WIELD]) 
X	    lprcat("You feel your weapon vibrate for a moment");
X	enchweapon(); 
X	return;
X	}
X    else 
X	createmonster(makemonst(level+1));
X    return;
X    }
X
X/*
X    function to cast a +3 protection on the player
X */
Xstatic act_prayer_heard()
X    {
X    lprcat("You have been heard!");
X    if (c[ALTPRO]==0) 
X        c[MOREDEFENSES]+=3;
X    c[ALTPRO] += 500;   /* protection field */
X    bottomline();
X    }
X
X/*
X    Performs the act of ignoring an altar.
X
X    Assumptions:  cursors() has been called.
X*/
Xact_ignore_altar()
X    {
X    if (rnd(100)<30)    
X        {
X        createmonster(makemonst(level+1)); 
X        c[AGGRAVATE] += rnd(450); 
X        }
X    else    
X        lprcat("\nNothing happens");
X    return;
X    }
X
X/*
X    Performs the act of opening a chest.  
X
X    Parameters:   x,y location of the chest to open.
X    Assumptions:  cursors() has been called previously
X*/
Xact_open_chest(x,y)
Xint x,y ;
X    {
X    int i,k;
X
X    k=rnd(101);
X    if (k<40)
X        {
X        lprcat("\nThe chest explodes as you open it"); beep();
X        i = rnd(10);  lastnum=281;  /* in case he dies */
X        lprintf("\nYou suffer %d hit points damage!",(long)i);
X        checkloss(i);
X        switch(rnd(10)) /* see if he gets a curse */
X            {
X            case 1: c[ITCHING]+= rnd(1000)+100;
X                    lprcat("\nYou feel an irritation spread over your skin!");
X                    beep();
X                    break;
X
X            case 2: c[CLUMSINESS]+= rnd(1600)+200;
X                    lprcat("\nYou begin to lose hand to eye coordination!");
X                    beep();
X                    break;
X
X            case 3: c[HALFDAM]+= rnd(1600)+200;
X                    beep();
X                    lprcat("\nA sickness engulfs you!");    break;
X            };
X	item[x][y]=know[x][y]=0;    /* destroy the chest */
X        if (rnd(100)<69) creategem(); /* gems from the chest */
X	dropgold(rnd(110*iarg[playerx][playery]+200));
X        for (i=0; i<rnd(4); i++) something(iarg[playerx][playery]+2);
X        }
X    else
X        lprcat("\nNothing happens");
X    return;
X    }
X
X/*
X    Perform the actions common to command and prompt mode when opening a
X    door.  Assumes cursors().
X
X    Parameters:     the X,Y location of the door to open.
X    Return value:   TRUE if successful in opening the door, false if not.
X*/
Xact_open_door( x, y )
Xint x ;
Xint y ;
X    {
X    if (rnd(11)<7)
X        {
X        switch(iarg[x][y])
X            {
X            case 6: c[AGGRAVATE] += rnd(400);   break;
X
X            case 7: lprcat("\nYou are jolted by an electric shock ");
X                    lastnum=274; losehp(rnd(20));  bottomline();  break;
X
X            case 8: loselevel();  break;
X
X            case 9: lprcat("\nYou suddenly feel weaker ");
X                    if (c[STRENGTH]>3) c[STRENGTH]--;
X                    bottomline();  break;
X
X            default:    break;
X            }
X	return( 0 );
X        }
X    else
X        {
X	know[x][y]=0;
X	item[x][y]=OOPENDOOR;
X	return( 1 );
X        }
X    }
END_OF_FILE
if test 13238 -ne `wc -c <'action.c'`; then
    echo shar: \"'action.c'\" unpacked with wrong size!
fi
# end of 'action.c'
fi
if test -f 'larn_hlp.uue' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'larn_hlp.uue'\"
else
echo shar: Extracting \"'larn_hlp.uue'\" \(11215 characters\)
sed "s/^X//" >'larn_hlp.uue' <<'END_OF_FILE'
Xbegin 644 larn.hlp
XM-R`@("!796QC;VUE('1O('1H92!G86UE(&]F($QA<FXN("!!="!T:&ES(&UO
XM;65N="P@>6]U(&9A8V4@82!G<F5A="!P<F]B;&5M+@I9;W5R(&1A=6=H=&5R
XM(&AA<R!C;VYT<F%C=&5D(&$@<W1R86YG92!D:7-E87-E+"!A;F0@;F]N92!O
XM9B!Y;W5R(&AO;64@<F5M961I97,*<V5E;2!T;R!H879E(&%N>2!E9F9E8W0N
XM("!9;W4@<V5N<V4@=&AA="!S:&4@:7,@:6X@;6]R=&%L(&1A;F=E<BP@86YD
XM('EO=2!M=7-T"G1R>2!T;R!S879E(&AE<BX@(%1I;64@86=O('EO=2!H96%R
XM9"!O9B!A(&QA;F0@;V8@9W)E870@9&%N9V5R(&%N9"!O<'!O<G1U;FET>2X*
XM4&5R:&%P<R!H97)E(&ES('1H92!S;VQU=&EO;B!Y;W4@;F5E9"X*"B`@("!)
XM="!H87,@8F5E;B!S86ED('1H870@=&AE<F4@;VYC92!W87,@82!G<F5A="!M
XM86=I8VEA;B!W:&\@8V%L;&5D(&AI;7-E;&8*4&]L:6YN96%U<RX@($UA;GD@
XM>65A<G,@86=O+"!A9G1E<B!H879I;F<@;6%N>2!M:7)A8W5L;W5S('-U8V-E
XM<W-E<RP@4&]L:6YN96%U<PIR971I<F5D('1O('1H92!C879E<FYS(&]F($QA
XM<FXL('=H97)E(&AE(&1E=F]T960@;6]S="!O9B!H:7,@=&EM92!T;R!T:&4*
XM8W)E871I;VX@;V8@;6%G:6,N("`@4G5M;W)S(&AA=F4@:70@=&AA="!O;F4@
XM9&%Y(%!O;&EN;F5A=7,@<V5T(&]U="!T;R!D:7-P96P*86X@871T86-K:6YG
XM(&%R;7D@:6X@82!F;W)E<W0@<V]M92!D:7-T86YC92!T;R!T:&4@;F]R=&@N
XM("!)="!I<R!B96QI979E9"!T:&%T"FAE<F4@:&4@;65T(&AI<R!D96UI<V4N
XM"@H@("`@5&AE(&-A=F5R;G,@;V8@3&%R;BP@:70@:7,@=&AO=6=H="P@;75S
XM="!B92!M86=N:69I8V5N="!I;B!D97-I9VXL"F%N9"!C;VYT86EN(&UU8V@@
XM;6%G:6,@86YD('1R96%S=7)E+B`@3VYE(&]P=&EO;B!Y;W4@:&%V92!I<R!T
XM;R!U;F1E<G1A:V4@80IJ;W5R;F5Y(&EN=&\@=&AE<V4@8V%V97)N<RX*"@H@
XM("`@1V]O9"!,=6-K(2`@66]U)W)E(&=O:6YG('1O(&YE960@:70A"@H*"@H@
XM("`@("`@("`@("`@("`@&ULT;4AE;'`@1FEL92!F;W(@5&AE($-A=F5R;G,@
XM;V8@3&%R;BP@4')O;7!T($UO9&4;6VT*"F(@(&UO=F4@<V]U=&AW97-T("`@
XM("`@("`@($(@(')U;B!S;W5T:'=E<W0@("`@("`@("`@("!3("!S879E('1H
XM92!G86UE"F@@(&UO=F4@;&5F="`@("`@("`@("`@("`@($@@(')U;B!L969T
XM("`@("`@("`@("`@("`@("`N("!S=&%Y(&AE<F4*:B`@;6]V92!D;W=N("`@
XM("`@("`@("`@("`@2B`@<G5N(&1O=VX@("`@("`@("`@("`@("`@(%X@(&ED
XM96YT:69Y(&$@=')A<`IK("!M;W9E('5P("`@("`@("`@("`@("`@("!+("!R
XM=6X@=7`@("`@("`@("`@("`@("`@("`@5"`@=&%K92!O9F8@87)M;W(*;"`@
XM;6]V92!R:6=H="`@("`@("`@("`@("`@3"`@<G5N(')I9VAT"FX@(&UO=F4@
XM<V]U=&AE87-T("`@("`@("`@($X@(')U;B!S;W5T:&5A<W0*=2`@;6]V92!N
XM;W)T:&5A<W0@("`@("`@("`@52`@<G5N(&YO<G1H96%S=`IY("!M;W9E(&YO
XM<G1H=V5S="`@("`@("`@("!9("!R=6X@;F]R=&AW97-T("`@("`@("`@("`@
XM7DP@<F5D<F%W('1H92!S8W)E96X*8R`@8V%S="!A('-P96QL("`@("`@("`@
XM("`@6B`@=&5L97!O<G0@>6]U<G-E;&8*9"`@9')O<"!A;B!I=&5M("`@("`@
XM("`@("`@92`@96%T('-O;65T:&EN9PIG("!G970@<')E<V5N="!P86-K('=E
XM:6=H="!0("!G:79E('1A>"!S=&%T=7,*:2`@:6YV96YT;W)Y('EO=7(@<&]C
XM:V5T<R`@22`@;&ES="!A;&P@:71E;7,@9F]U;F0@("`@(#\@('1H:7,@:&5L
XM<"!S8W)E96X*<2`@<75A9F8@82!P;W1I;VX@("`@("`@("`@42`@<75I="!T
XM:&4@9V%M90IR("!R96%D(&$@<V-R;VQL("`@("`@("`@("!V("!P<FEN="!P
XM<F]G<F%M('9E<G-I;VX*=R`@=V5I;&0@82!W96%P;VX@("`@("`@("`@5R`@
XM=V5A<B!A<FUO<B`@("`@("`@("`@("`@(%Y,(')E9')A=R!T:&4@<V-R965N
XM"@H*"@H*"B`@("`@("`@("`@("`@("`;6S1M2&5L<"!&:6QE(&9O<B!4:&4@
XM0V%V97)N<R!O9B!,87)N+"!#;VUM86YD($UO9&4;6VT*"F(@(&UO=F4@<V]U
XM=&AW97-T("`@("`@("`@($(@(')U;B!S;W5T:'=E<W0@("`@("`@("`@("!!
XM("!D97-E8W)A=&4@86X@86QT87(*8R`@8V%S="!A('-P96QL("`@("`@("`@
XM("`@0R`@8VQO<V4@82!D;V]R("`@("`@("`@("`@(%H@('1E;&5P;W)T('EO
XM=7)S96QF"F0@(&1R;W`@86X@:71E;2`@("`@("`@("`@($0@(&1R:6YK(&%T
XM(&$@9F]U;G1A:6X@("`@("`\("!G;R!U<"!S=&%I<G,@;W(*92`@96%T('-O
XM;65T:&EN9R`@("`@("`@("`@12`@96YT97(@82!S=&]R92P@9'5N9V5O;B`@
XM("`@('9O;&-A;FEC('-H869T"F<@(&=E="!P<F5S96YT('!A8VL@=V5I9VAT
XM($<@(&=I=F4@=&AE('-T86ER<R!A(&MI8VL@("`^("!G;R!D;W=N('-T86ER
XM<R!O<@IH("!M;W9E(&QE9G0@("`@("`@("`@("`@("!(("!R=6X@;&5F="`@
XM("`@("`@("`@("`@("`@("`@=F]L8V%N:6,@<VAA9G0*:2`@:6YV96YT;W)Y
XM('EO=7(@<&]C:V5T<R`@22`@;&ES="!A;&P@:71E;7,@9F]U;F0@("`@(#\@
XM('1H:7,@:&5L<"!S8W)E96X*:B`@;6]V92!D;W=N("`@("`@("`@("`@("`@
XM2B`@<G5N(&1O=VX@("`@("`@("`@("`@("`@(%X@(&ED96YT:69Y(&$@=')A
XM<`IK("!M;W9E('5P("`@("`@("`@("`@("`@("!+("!R=6X@=7`@("`@("`@
XM("`@("`@("`@("`@+"`@<&EC:R!U<"!I=&5M"FP@(&UO=F4@<FEG:'0@("`@
XM("`@("`@("`@($P@(')U;B!R:6=H="`@("`@("`@("`@("`@("`Z("!L;V]K
XM(&%T(&]B:F5C=`IN("!M;W9E('-O=71H96%S="`@("`@("`@("!.("!R=6X@
XM<V]U=&AE87-T"B`@("`@("`@("`@("`@("`@("`@("`@("`@($\@(&]P96X@
XM82!D;V]R(&]R(&-H97-T("`@("`N("!S=&%Y(&AE<F4*<"`@<')A>2!A="!A
XM;B!A;'1A<B`@("`@("`@4"`@9VEV92!T87@@<W1A='5S"G$@('%U869F(&$@
XM<&]T:6]N("`@("`@("`@(%$@('%U:70@=&AE(&=A;64*<B`@<F5A9"!A('-C
XM<F]L;"`@("`@("`@("`@4B`@<F5M;W9E(&=E;7,@9G)O;2!T:')O;F4*<R`@
XM<VET(&]N(&$@=&AR;VYE("`@("`@("`@4R`@<V%V92!T:&4@9V%M90IT("!T
XM:61Y('5P(&%T(&$@9F]U;G1A:6X@("!4("!T86ME(&]F9B!A<FUO<@IU("!M
XM;W9E(&YO<G1H96%S="`@("`@("`@("!5("!R=6X@;F]R=&AE87-T"G8@('!R
XM:6YT('!R;V=R86T@=F5R<VEO;@IW("!W96EL9"!A('=E87!O;B`@("`@("`@
XM("!7("!W96%R(&%R;6]R"GD@(&UO=F4@;F]R=&AW97-T("`@("`@("`@(%D@
XM(')U;B!N;W)T:'=E<W0@("`@("`@("`@("!>3"!R961R87<@=&AE('-C<F5E
XM;@H@("`@("`@("`@("`@("`@&ULW;5-P96-I86P@3F]T97,;6VT*"E=H96X@
XM&ULW;61R;W!P:6YG(&=O;&0;6VTL(&EF('EO=2!T>7!E("<J)R!A<R!Y;W5R
XM(&%M;W5N="P@86QL('EO=7(@9V]L9"!G971S(&1R;W!P960N"DEN(&=E;F5R
XM86PL('1Y<&EN9R!I;B`G*B<@;65A;G,@86QL(&]F('=H870@>6]U<B!I;G1E
XM<F5S=&5D(&EN+B`@5&AI<R!I<R!T<G5E"G=H96X@=FES:71I;F<@=&AE(&)A
XM;FLL(&]R('=H96X@8V]N=')I8G5T:6YG(&%T(&%L=&%R<RX*"DQA<FX@;F5E
XM9',@=&AE($%.4TDN4UE3("AO<B!P<F5F97)A8FQY+"!T:&4@3D%.4TDN4UE3
XM*2!D979I8V4@9')I=F5R(&EN<W1A;&QE9`II;B!Y;W5R($-/3D9)1RY365,@
XM9FEL92X@(%1H92!S=7!P;&EE9"`B=&5R;6-A<"(@9FEL92!D97-C<FEB97,@
XM=&AE(&5S8V%P90IS97%U96YC97,@=&\@8VAA;F=E('9I9&5O(&UO9&5S("AS
XM964@8V@@,3,@;V8@=&AE($1/4R`R+C`@;6%N=6%L*2X@(%-E92!T:&4*(E1%
XM4DU#05`B('-E8W1I;VX@:6X@3$%23BY$3T,@9F]R(&9U<G1H97(@9&5T86EL
XM<RX*"E=H96X@:6X@=&AE('-T;W)E+"!T<F%D:6YG('!O<W0L('-C:&]O;"P@
XM;W(@:&]M92P@86X@&ULW;3QE<V-A<&4^&UMM('=I;&P@9V5T('EO=2!O=70N
XM"@I7:&5N(&-A<W1I;F<@82!S<&5L;"P@:68@>6]U(&YE960@82!L:7-T(&]F
XM('-P96QL<R!Y;W4@8V%N(&-A<W0L('1Y<&4@)QM;-VU$&UMM)R!A<PIT:&4@
XM9FER<W0@;&5T=&5R(&]F('EO=7(@<W!E;&PN("!4:&4@879A:6QA8FQE(&QI
XM<W0@;V8@<W!E;&QS('=I;&P@8F4@<VAO=VXL"F%F=&5R('=H:6-H('EO=2!M
XM87D@96YT97(@=&AE('-P96QL(&-O9&4N("!4:&ES(&]N;'D@=V]R:W,@;VX@
XM=&AE(#%S="!L971T97(*;V8@=&AE('-P96QL('EO=2!A<F4@8V%S=&EN9RX*
XM"E1H92!!=71H;W(@;V8@3&%R;B!I<R!.;V%H($UO<F=A;B`H,3DX,BTS*2P@
XM0V]P>6EN9R!F;W(@4')O9FET(&ES(%!R;VAI8FET960*0V]P>7)I9VAT(#$Y
XM.#8@8GD@3F]A:"!-;W)G86XL($%L;"!2:6=H=',@4F5S97)V960N"@H*"B`@
XM("`@("`@("`@("`@("`@("`@("`@(!M;-VU,87)N($-O;6UA;F0@3&EN92!/
XM<'1I;VYS&UMM"@IL87)N("LK("`@("`@("`@("`@("`@("!R97-T;W)E(&-H
XM96-K<&]I;G1E9"!G86UE"FQA<FX@+7,@("`@("`@("`@("`@("`@(&QI<W0@
XM=&AE('-C;W)E8F]A<F0*;&%R;B`M:2`@("`@("`@("`@("`@("`@;&ES="!S
XM8V]R97,@=VET:"!I;G9E;G1O<FEE<PIL87)N("UN("`@("`@("`@("`@("`@
XM("!S=7!P<F5S<R!W96QC;VUE(&UE<W-A9V4@=VAE;B!B96=I;FYI;F<@82!G
XM86UE"FQA<FX@+6@@("`@("`@("`@("`@("`@('!R:6YT(&]U="!A;&P@=&AE
XM(&-O;6UA;F0@;&EN92!O<'1I;VYS"FQA<FX@+3QN=6UB97(^("`@("`@("`@
XM('-P96-I9GD@9&EF9FEC=6QT>2!O9B!T:&4@9V%M92`H;6%Y(&)E('5S960@
XM=VET:"`M;BD*;&%R;B`M;SQO<'1S9FEL93X@("`@("`@<W!E8VEF>2!T:&4@
XM;W!T:6]N(&9I;&4@=&\@8F4@=7-E9`IL87)N("UC("`@("`@("`@("`@("`@
XM("!C<F5A=&4@;F5W('-C;W)E8F]A<F1S("TM('!R;VUP=',@9F]R(&$@<&%S
XM<W=O<F0*;&%R;B`M;"`@("`@("`@("`@("`@("`@<')I;G0@;W5T('1H92!L
XM87)N(&QO9R!F:6QE(`IL87)N("UP("`@("`@("`@("`@("`@("!P;&%Y(&EN
XM('!R;VUP="!M;V1E"@H*"@H*"@H*"@H*("`@("`@("`@("`@&ULW;4)A8VMG
XM<F]U;F0@26YF;W)M871I;VX@9F]R($QA<FX;6VT*"B`@("!796QC;VUE('1O
XM('1H92!G86UE(&]F($QA<FXN("!!="!T:&ES(&UO;65N="P@>6]U(&9A8V4@
XM82!G<F5A="!P<F]B;&5M+@I9;W5R(&1A=6=H=&5R(&AA<R!C;VYT<F%C=&5D
XM(&$@<W1R86YG92!D:7-E87-E+"!A;F0@;F]N92!O9B!Y;W5R(&AO;64@<F5M
XM961I97,*<V5E;2!T;R!H879E(&%N>2!E9F9E8W0N("!9;W4@<V5N<V4@=&AA
XM="!S:&4@:7,@:6X@;6]R=&%L(&1A;F=E<BP@86YD('EO=2!M=7-T"G1R>2!T
XM;R!S879E(&AE<BX@(%1I;64@86=O('EO=2!H96%R9"!O9B!A(&QA;F0@;V8@
XM9W)E870@9&%N9V5R(&%N9"!O<'!O<G1U;FET>2X*4&5R:&%P<R!H97)E(&ES
XM('1H92!S;VQU=&EO;B!Y;W4@;F5E9"X*"B`@("!)="!H87,@8F5E;B!S86ED
XM('1H870@=&AE<F4@;VYC92!W87,@82!G<F5A="!M86=I8VEA;B!W:&\@8V%L
XM;&5D(&AI;7-E;&8*4&]L:6YN96%U<RX@($UA;GD@>65A<G,@86=O+"!A9G1E
XM<B!H879I;F<@;6%N>2!M:7)A8W5L;W5S('-U8V-E<W-E<RP@4&]L:6YN96%U
XM<PIR971I<F5D('1O('1H92!C879E<FYS(&]F($QA<FXL('=H97)E(&AE(&1E
XM=F]T960@;6]S="!O9B!H:7,@=&EM92!T;R!T:&4*8W)E871I;VX@;V8@;6%G
XM:6,N("`@4G5M;W)S(&AA=F4@:70@=&AA="!O;F4@9&%Y(%!O;&EN;F5A=7,@
XM<V5T(&]U="!T;R!D:7-P96P*86X@871T86-K:6YG(&%R;7D@:6X@82!F;W)E
XM<W0@<V]M92!D:7-T86YC92!T;R!T:&4@;F]R=&@N("!)="!I<R!B96QI979E
XM9"!T:&%T"FAE<F4@:&4@;65T(&AI<R!D96UI<V4N"@H@("`@5&AE(&-A=F5R
XM;G,@;V8@3&%R;BP@:70@:7,@=&AO=6=H="P@;75S="!B92!M86=N:69I8V5N
XM="!I;B!D97-I9VXL"F%N9"!C;VYT86EN(&UU8V@@;6%G:6,@86YD('1R96%S
XM=7)E+B`@3VYE(&]P=&EO;B!Y;W4@:&%V92!I<R!T;R!U;F1E<G1A:V4@80IJ
XM;W5R;F5Y(&EN=&\@=&AE<V4@8V%V97)N<RX*"B`@("!';V]D($QU8VLA("!9
XM;W4G<F4@9V]I;F<@=&\@;F5E9"!I="$*"@H*("`@("`@("`@("`@&ULW;4AO
XM=R!T;R!U<V4@=&AE(&QA<FXN;W!T(&]P=&EO;B!F:6QE&UMM"@I4:&4@9FEL
XM92`B;&%R;BYO<'0B+"!I9B!U<V5D+"!S:&]U;&0@8F4@:6X@82!D:7)E8W1O
XM<GD@86QO;F<@>6]U<B!0051(+@I!('-E<75E;F-E(&]F('=O<F1S('1E<FUI
XM;F%T960@8GD@=VAI=&5S<&%C92!I<R!U<V5D('1O('-P96-I9GD@;W!T:6]N
XM<RX*"B`@("!7;W)D("`@("`@("`@("`@("`@("`@("`@365A;FEN9PH@("`@
XM8W5R<V]R.B`@(&QO=W-C86X@:&EG:'-C86X@(&-H86YG92!T:&4@<VAA<&4@
XM;V8@=&AE(&-U<G-O<@H@("`@1$5#4F%I;F)O=R`@("`@("`@("!T96QL($Q!
XM4DX@>6]U(&AA=F4@=&AA="!C;VUP=71E<@H@("`@96YA8FQE+6-H96-K<&]I
XM;G1I;F<@("`@='5R;B!O;B!P97)I;V1I8R!C:&5C:W!O:6YT:6YG"B`@("!G
XM<F%P:&EC<SH@=V%L;&,@9FQO;W)C("!S96QE8W0@9W)A<&AI8W,@;6%Z92!C
XM:&%R86-T97)S"B`@("!K97EP860@("`@("`@("`@96YA8FQE('1H92!N=6UE
XM<FEC(&ME>7!A9"!F;W(@;6]V:6YG"B`@("!L87)N9&ER.B`@9&ER96-T;W)Y
XM("`@("!T:&4@9&ER96-T;W)Y('1O('5S92!F;W(@;&%R;B!F:6QE<PH@("`@
XM;6]N<W1E<CH@(")M;VYS="!N86UE(B`@8VAO;W-E(&$@;F%M92!F;W(@82!M
XM;VYS=&5R"B`@("!N86UE.B`@("`@(GEO=7(@;F%M92(@("!C:&]O<V4@>6]U
XM<B!P;&%Y:6YG(&YA;64*("`@(&YO+6)E97`@("`@("`@("!D:7-A8FQE(&)E
XM97!I;F<@;V8@=&AE('1E<FUI;F%L"B`@("!N;RUI;G1R;V1U8W1I;VX@("`@
XM(&1O(&YO="!D:7-P;&%Y(&EN=')O(&UE<W-A9V4*("`@('-A=F5F:6QE.B!S
XM879E+69I;&4M;F%M92`@("!D969I;F4@=VAA="!T:&4@<V%V96=A;64@9FEL
XM96YA;64@=VEL;"!B90H@("`@<W=A<&9I;&4Z('-W87`M9FEL92UN86UE("`@
XM(&1E9FEN92!T:&4@;F%M92!O9B!T:&4@<W=A<&9I;&4*"EEO=7(@;F%M92!A
XM;F0@;6]N<W1E<B!N86UE<R!M=7-T(&)E(&5N8VQO<V5D(&EN(&1O=6)L92!Q
XM=6]T871I;VX@;6%R:W,@86YD(&UA>0IB92!U<"!T;R`S-"!C:&%R86-T97)S
XM(&QO;F<N("!,;VYG97(@;F%M97,@87)E('1R=6YC871E9"X@($%N>71H:6YG
XM(&5N8VQO<V5D(&EN"G%U;W1A=&EO;B!M87)K<R!I<R!C;VYS:61E<F5D(&]N
XM92!W;W)D+"!A;F0@;75S="!B92!S97!A<F%T960@9G)O;2!O=&AE<B!W;W)D
XM<PIB>2!W:&ET97-P86-E+@H@("`@("`@("`@(!M;-VU%>'!L86YA=&EO;B!O
XM9B!T:&4@3&%R;B!S8V]R96)O87)D(&9A8VEL:71Y&UMM"@H@("`@3&%R;B!S
XM=7!P;W)T<R!45T\@<V-O<F5B;V%R9',L(&]N92!F;W(@=VEN;F5R<RP@86YD
XM(&]N92!F;W(@9&5C96%S960*8VAA<F%C=&5R<RX@($5A8V@@<&QA>65R("AB
XM>2!U<V5R:60@;W(@<&QA>65R:60L('-E92!524130T]212!I;B!-86ME9FEL
XM92D*:7,@86QL;W=E9"!O;F4@<VQO="!O;B!E86-H('-C;W)E8F]A<F0L(&EF
XM('1H92!S8V]R92!I<R!I;B!T:&4@=&]P('1E;B!F;W(*=&AA="!S8V]R96)O
XM87)D+B`@5&AI<R!D97-I9VX@:&5L<',@:6YS=7)E('1H870@9G)E<75E;G0@
XM<&QA>65R<R!O9B!,87)N"F1O(&YO="!H;V<@=&AE('-C;W)E8F]A<F0L(&%N
XM9"!G:79E<R!M;W)E('!L87EE<G,@82!C:&%N8V4@9F]R(&=L;W)Y+B`@3&5V
XM96P*;V8@9&EF9FEC=6QT>2!I<R!A;'-O(&YO=&5D(&]N('1H92!S8V]R96)O
XM87)D<RP@86YD('1H:7,@=&%K97,@<')E8V5D96YC90IO=F5R('-C;W)E(&9O
XM<B!D971E<FUI;FEN9R!W:&%T(&5N=')Y(&ES(&]N('1H92!S8V]R96)O87)D
XM+B`@1F]R(&5X86UP;&4Z"FEF(")987(L('1H92!"=6<@4VQA>65R(B!H87,@
XM82!S8V]R92!O9B`Q,C@P,#,@;VX@=&AE('-C;W)E8F]A<F0@870@9&EF9B`P
XM+`IT:&5N(&$@9V%M92!A="!D:69F(#$@86YD(&$@<V-O<F4@;V8@-#$Q,B!W
XM;W5L9"!R97!L86-E('1H92!P<F5V:6]U<PIE;G1R>2!O;B!T:&4@<V-O<F5B
XM;V%R9"X@($YO=&4@=&AA="!W:&5N(&$@<&QA>65R(&1I97,L('1H92!I;G9E
XM;G1O<GD@:7,*<W1O<F5D(&EN('1H92!S8V]R96)O87)D('-O('1H870@979E
XM<GEO;F4@8V%N('-E92!W:&%T(&ET96US('1H92!P;&%Y97(@:&%D"F%T('1H
X592!T:6UE(&]F(&1E871H+@H*"@H*
X`
Xend
END_OF_FILE
if test 11215 -ne `wc -c <'larn_hlp.uue'`; then
    echo shar: \"'larn_hlp.uue'\" unpacked with wrong size!
fi
# end of 'larn_hlp.uue'
fi
if test -f 'moreobj.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'moreobj.c'\"
else
echo shar: Extracting \"'moreobj.c'\" \(12276 characters\)
sed "s/^X//" >'moreobj.c' <<'END_OF_FILE'
X/* moreobj.c        Larn is copyrighted 1986 by Noah Morgan.
X 
X   Routines in this file:
X 
X   oaltar()
X   othrone()
X   odeadthrone()
X   ochest()
X   ofountain()
X   fntchange()
X   fch()
X   drink_fountain()
X   wash_fountain()
X   enter()
X   remove_gems()
X   sit_on_throne()
X   kick_stairs()
X   up_stairs()
X   down_stairs()
X   open_something()
X   close_something()
X   desecrate_altar()
X   pray_at_altar()
X*/
X#include "header.h"
X
X/*
X    subroutine to process an altar object
X*/
Xoaltar()
X    {
X    unsigned long k;
X
X    lprcat("\nDo you (p) pray  (d) desecrate"); iopts();
X    while (1) switch(ttgetch())
X        {
X        case 'p':   
X	    lprcat(" pray\nDo you (m) give money or (j) just pray? ");
X            while (1) switch(ttgetch())
X                {
X                case 'j': 
X		    lprcat("\n");
X		    act_just_pray();
X		    return;
X
X                case 'm': 
X		    act_donation_pray();
X		    return;
X
X                case '\33':   
X		    return;
X                };
X
X        case 'd': 
X	    lprcat(" desecrate");
X	    act_desecrate_altar();
X	    return;
X
X        case 'i':
X        case '\33': 
X	    ignore();
X	    act_ignore_altar();
X            return;
X        };
X    }
X
X/*
X    subroutine to process a throne object
X*/
Xothrone(arg)
X    int arg;
X    {
X
X    lprcat("\nDo you (p) pry off jewels, (s) sit down"); iopts();
X    while (1)
X      {
X      while (1) switch(ttgetch())
X        {
X        case 'p':   
X            lprcat(" pry off");  
X            act_remove_gems( arg );
X            return;
X
X        case 's':   
X            lprcat(" sit down");  
X            act_sit_throne( arg );
X            return;
X
X        case 'i':
X        case '\33': ignore(); return;
X        };
X      }
X    }
X
Xodeadthrone()
X    {
X
X    lprcat("\nDo you (s) sit down"); iopts();
X    while (1)
X      {
X      while (1) switch(ttgetch())
X        {
X        case 's':   
X            lprcat(" sit down");  
X            act_sit_throne(1);
X            return;
X
X        case 'i':
X        case '\33': ignore(); return;
X        };
X      }
X    }
X
X/*
X    subroutine to process a chest object
X*/
Xochest()
X    {
X    lprcat("\nDo you (t) take it, (o) try to open it"); iopts();
X    while (1)
X      {
X      switch(ttgetch())
X        {
X	case 'o':
X	    lprcat(" open it");
X	    act_open_chest( playerx, playery );
X	    return;
X
X	case 't':
X	    lprcat(" take");
X	    if (take(OCHEST,iarg[playerx][playery])==0)
X		item[playerx][playery]=know[playerx][playery]=0;
X	    return;
X
X        case 'i':
X        case '\33': ignore(); return;
X        };
X      }
X    }
X
X/*
X    process a fountain object
X*/
Xofountain()
X    {
X    cursors();
X    lprcat("\nDo you (d) drink, (w) wash yourself"); iopts();
X    while (1) switch(ttgetch())
X        {
X        case 'd':
X            act_drink_fountain();
X            return;
X
X        case '\33':
X        case 'i':   
X            ignore();  
X            return;
X
X        case 'w':   
X            act_wash_fountain();
X            return;
X        }
X    }
X
X/*
X    a subroutine to raise or lower character levels
X    if x > 0 they are raised   if x < 0 they are lowered
X*/
Xfntchange(how)
X    int how;
X    {
X    register long j;
X    lprc('\n');
X    switch(rnd(9))
X        {
X        case 1: 
X            lprcat("Your strength");        
X            fch(how,&c[STRENGTH]);     break;
X        case 2:
X            lprcat("Your intelligence");    
X            fch(how,&c[INTELLIGENCE]);     break;
X        case 3:
X            lprcat("Your wisdom");          
X            fch(how,&c[WISDOM]);     break;
X        case 4: 
X            lprcat("Your constitution");    
X            fch(how,&c[CONSTITUTION]);     break;
X        case 5:
X            lprcat("Your dexterity");
X            fch(how,&c[DEXTERITY]);     break;
X        case 6:
X            lprcat("Your charm");
X            fch(how,&c[CHARISMA]);     break;
X        case 7: 
X            j=rnd(level+1);
X            if (how < 0)
X                {
X                lprintf("You lose %d hit point",(long)j);
X                if (j>1) lprcat("s!"); else lprc('!');
X                losemhp((int)j);
X                }
X            else
X                { lprintf("You gain %d hit point",(long)j);  if (j>1) lprcat("s!"); else lprc('!'); raisemhp((int)j); }
X            bottomline();       break;
X
X        case 8: j=rnd(level+1);
X                if (how > 0)
X                    {
X                    lprintf("You just gained %d spell",(long)j);  raisemspells((int)j);
X                    if (j>1) lprcat("s!"); else lprc('!');
X                    }
X                else
X                    {
X                    lprintf("You just lost %d spell",(long)j);  losemspells((int)j);
X                    if (j>1) lprcat("s!"); else lprc('!');
X                    }
X                bottomline();       break;
X
X        case 9: j = 5*rnd((level+1)*(level+1));
X                if (how < 0)
X                    {
X                    lprintf("You just lost %d experience point",(long)j);
X                    if (j>1) lprcat("s!"); else lprc('!'); loseexperience((long)j);
X                    }
X                else
X                    {
X                    lprintf("You just gained %d experience point",(long)j);
X                    if (j>1) lprcat("s!"); else lprc('!'); raiseexperience((long)j);
X                    }
X                break;
X        }
X    cursors();
X    }
X
X/*
X    subroutine to process an up/down of a character attribute for ofountain
X*/
Xstatic fch(how,x)
X    int how;
X    long *x;
X    {
X    if (how < 0)     { lprcat(" went down by one!");    --(*x); }
X        else         { lprcat(" went up by one!");  (*x)++; }
X    bottomline();
X    }
X
X/*
X    For command mode.  Perform drinking at a fountain.
X*/
Xdrink_fountain()
X    {
X    cursors() ;
X    if (item[playerx][playery] == ODEADFOUNTAIN)
X        lprcat("\nThere is no water to drink!") ;
X
X    else if (item[playerx][playery] != OFOUNTAIN)
X        lprcat("\nI see no fountain to drink from here!") ;
X
X    else 
X        act_drink_fountain();
X    return;
X    }
X
X/*
X    For command mode.  Perform washing (tidying up) at a fountain.
X*/
Xwash_fountain()
X    {
X    cursors() ;
X    if (item[playerx][playery] == ODEADFOUNTAIN)
X        lprcat("\nThere is no water to wash in!") ;
X
X    else if (item[playerx][playery] != OFOUNTAIN)
X        lprcat("\nI see no fountain to wash at here!") ;
X
X    else
X        act_wash_fountain();
X    return;
X    }
X
X/*
X    For command mode.  Perform entering a building.
X*/
Xenter()
X    {
X    cursors() ;
X    switch ( item[playerx][playery] )
X        {
X        case OSCHOOL:
X            oschool();
X            break ;
X
X        case OBANK:
X            obank() ;
X            break ;
X
X        case OBANK2:
X            obank2() ;
X            break ;
X
X        case ODNDSTORE:
X            dndstore() ;
X            break ;
X
X        case OENTRANCE:
X            newcavelevel( 1 );
X            playerx = 33 ;
X            playery = MAXY - 2 ;
X            item[33][MAXY - 1] = know[33][MAXY - 1] = mitem[33][MAXY - 1] = 0 ;
X            draws( 0, MAXX, 0, MAXY ); 
X            showcell(playerx, playery);         /* to show around player */
X            bot_linex() ;
X            break ;
X
X        case OTRADEPOST:
X            otradepost();
X            break;
X
X        case OLRS:
X            olrs();
X            break;
X
X        case OHOME:
X            ohome();
X            break;
X
X        default :
X            lprcat("\nThere is no place to enter here!\n");
X            break;
X        }
X    }
X
X/*
X    For command mode.  Perform removal of gems from a jeweled throne.
X*/
Xremove_gems ( )
X    {
X    
X    cursors();
X    if (item[playerx][playery] == ODEADTHRONE)
X        lprcat("\nThere are no gems to remove!");
X    
X    else if (item[playerx][playery] == OTHRONE)
X        act_remove_gems(0);
X
X    else if (item[playerx][playery] == OTHRONE2)
X        act_remove_gems(1);
X
X    else
X        lprcat("\nI see no throne here to remove gems from!");
X    return;
X    }
X
X/*
X    For command mode.  Perform sitting on a throne.
X*/
Xsit_on_throne( )
X    {
X
X    cursors();
X    if (item[playerx][playery] == OTHRONE)
X        act_sit_throne(0);
X    
X    else if ((item[playerx][playery] == OTHRONE2) ||
X             (item[playerx][playery] == ODEADTHRONE))
X        act_sit_throne(1);
X    
X    else
X        lprcat("\nI see no throne to sit on here!");
X
X    return;
X    }
X
X/*
X    For command mode.  Checks that the player is actually standing at a set
X    of stairs before letting him kick them.
X*/
Xkick_stairs()
X    {
X    cursors();
X    if (item[playerx][playery] != OSTAIRSUP &&
X	item[playerx][playery] != OSTAIRSDOWN)
X	lprcat("\nI see no stairs to kick here!");
X
X    else
X	act_kick_stairs();
X    }
X
X/*
X    For command mode.  Checks that player is actually standing at a set up
X    up stairs or volcanic shaft.  
X*/
Xup_stairs()
X    {
X    cursors();
X    if (item[playerx][playery] == OSTAIRSDOWN)
X	lprcat("\nThe stairs don't go up!");
X
X    else if (item[playerx][playery] == OVOLUP)
X	act_up_shaft();
X
X    else if (item[playerx][playery] != OSTAIRSUP)
X	lprcat("\nI see no way to go up here!");
X
X    else
X	act_up_stairs();
X    }
X
X/*
X    For command mode.  Checks that player is actually standing at a set of
X    down stairs or volcanic shaft.
X*/
Xdown_stairs()
X    {
X    cursors();
X    if (item[playerx][playery] == OSTAIRSUP)
X	lprcat("\nThe stairs don't go down!");
X
X    else if (item[playerx][playery] == OVOLDOWN)
X	act_down_shaft();
X
X    else if (item[playerx][playery] != OSTAIRSDOWN)
X	lprcat("\nI see no way to go down here!");
X
X    else
X	act_down_stairs();
X    }
X
X/*
X    For command mode.  Perform opening an object (door, chest).
X*/
Xopen_something( )
X    {
X    int x,y;    /* direction to open */
X    char tempc; /* result of prompting to open a chest */
X
X    cursors();
X    /* check for confusion.
X    */
X    if (c[CONFUSE])
X        {
X        lprcat("You're too confused!");
X        beep();
X        return;
X        }
X
X    /* check for player standing on a chest.  If he is, prompt for and
X       let him open it.  If player ESCs from prompt, quit the Open
X       command.
X    */
X    if (item[playerx][playery] == OCHEST)
X        {
X        lprcat("There is a chest here.  Open it?");
X        if ((tempc = getyn()) == 'y')
X            {
X            act_open_chest( playerx, playery );
X            return;
X            }
X        else if (tempc != 'n' )
X            return;
X        }
X
X    /* get direction of object to open.  test 'openability' of object
X       indicated, call common command/prompt mode routines to actually open.
X    */
X    dirsub( &x, &y );
X    switch( item[x][y] )
X        {
X        case OOPENDOOR:
X            lprcat("The door is already open!");
X            beep();
X            break;
X
X        case OCHEST:
X            act_open_chest( x, y );
X            break;
X
X        case OCLOSEDDOOR:
X            act_open_door( x, y );
X            break;
X
X        default:
X            lprcat("You can't open that!");
X            beep();
X            break;
X        }
X    }
X
X/*
X    For command mode.  Perform the action of closing something (door).
X*/
Xclose_something()
X    {
X    int x,y;
X
X    cursors();
X    /* check for confusion.
X    */
X    if (c[CONFUSE])
X        {
X        lprcat("You're too confused!");
X        beep();
X        return;
X        }
X
X    /* get direction of object to close.  test 'closeability' of object
X       indicated.
X    */
X    dirsub( &x, &y );
X    switch( item[x][y] )
X        {
X        case OCLOSEDDOOR:
X            lprcat("The door is already closed!");
X            beep();
X            break;
X
X        case OOPENDOOR:
X	    if (mitem[x][y])
X		{
X	        lprcat("Theres a monster in the way!");
X	        return;
X		}
X            item[x][y] = OCLOSEDDOOR;
X            know[x][y] = 0 ;
X            iarg[x][y] = 0 ;
X            break;
X
X        default:
X            lprcat("You can't close that!");
X            beep();
X            break;
X        }
X    }
X
X/*
X    For command mode.  Perform the act of descecrating an altar.
X*/
Xdesecrate_altar()
X    {
X    cursors();
X    if (item[playerx][playery] == OALTAR)
X	act_desecrate_altar();
X    else
X	lprcat("\nI see no altar to desecrate here!");
X    }
X
X/*
X    For command mode.  Perform the act of praying at an altar.
X*/
Xpray_at_altar()
X    {
X    extern char prayed ;
X
X    cursors();
X    if (item[playerx][playery] != OALTAR)
X        lprcat("\nI see no altar to pray at here!");
X    else
X	act_donation_pray();
X    prayed = 1 ;
X    }
END_OF_FILE
if test 12276 -ne `wc -c <'moreobj.c'`; then
    echo shar: \"'moreobj.c'\" unpacked with wrong size!
fi
# end of 'moreobj.c'
fi
if test -f 'regen.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'regen.c'\"
else
echo shar: Extracting \"'regen.c'\" \(3513 characters\)
sed "s/^X//" >'regen.c' <<'END_OF_FILE'
X/* regen.c 			Larn is copyrighted 1986 by Noah Morgan. */
X#include "header.h"
X/*
X	*******
X	REGEN()
X	*******
X	regen()
X
X	subroutine to regenerate player hp and spells
X */
Xregen()
X	{
X	register int i,flag;
X	register long *d;
X	d = c;
X#ifdef EXTRA
X	d[MOVESMADE]++;
X#endif
X	if (d[TIMESTOP])  { if(--d[TIMESTOP]<=0) bottomline();  return; }	/* for stop time spell */
X	flag=0;
X
X	if (d[STRENGTH]<3)	{ d[STRENGTH]=3; flag=1; }
X	if ((d[HASTESELF]==0) || ((d[HASTESELF] & 1) == 0))
X		gtime++;
X
X	if (d[HP] != d[HPMAX])
X		if (d[REGENCOUNTER]-- <= 0)		/*	regenerate hit points	*/
X			{
X			d[REGENCOUNTER] = 22 + (d[HARDGAME]<<1) - d[LEVEL];
X			if ((d[HP] += d[REGEN]) > d[HPMAX])  d[HP] = d[HPMAX];
X			bottomhp();
X			}
X
X	if (d[SPELLS] < d[SPELLMAX])		/*	regenerate spells	*/
X		if (d[ECOUNTER]-- <= 0)
X			{
X			d[ECOUNTER] = 100+4*(d[HARDGAME]-d[LEVEL]-d[ENERGY]);
X			d[SPELLS]++;	bottomspell();
X			}
X
X	if (d[HERO])			if (--d[HERO]<=0) { for (i=0; i<6; i++) d[i] -= 10; flag=1; }
X	if (d[ALTPRO])			if (--d[ALTPRO]<=0)			{ d[MOREDEFENSES]-=3; flag=1; }
X	if (d[PROTECTIONTIME])	if (--d[PROTECTIONTIME]<=0)	{ d[MOREDEFENSES]-=2; flag=1; }
X	if (d[DEXCOUNT])		if (--d[DEXCOUNT]<=0)		{ d[DEXTERITY]-=3; flag=1; }
X	if (d[STRCOUNT])		if (--d[STRCOUNT]<=0)		{ d[STREXTRA]-=3; flag=1; }
X	if (d[BLINDCOUNT])		if (--d[BLINDCOUNT]<=0)		{ cursors();  lprcat("\nThe blindness lifts  "); beep(); }
X	if (d[CONFUSE])			if (--d[CONFUSE]<=0) { cursors();  lprcat("\nYou regain your senses"); beep(); }
X	if (d[GIANTSTR])		if (--d[GIANTSTR]<=0) { d[STREXTRA] -= 20; flag=1; }
X	if (d[CHARMCOUNT])		if ((--d[CHARMCOUNT]) <= 0) flag=1;
X	if (d[INVISIBILITY])	if ((--d[INVISIBILITY]) <= 0) flag=1;
X	if (d[CANCELLATION])	if ((--d[CANCELLATION]) <= 0) flag=1;
X	if (d[WTW])				if ((--d[WTW]) <= 0) flag=1;
X	if (d[HASTESELF])		if ((--d[HASTESELF]) <= 0) flag=1;
X	if (d[AGGRAVATE])		--d[AGGRAVATE]; 
X	if (d[SCAREMONST])		if ((--d[SCAREMONST]) <= 0) flag=1; 
X	if (d[STEALTH])			if ((--d[STEALTH]) <= 0) flag=1; 
X	if (d[AWARENESS])		--d[AWARENESS];
X	if (d[HOLDMONST])		if ((--d[HOLDMONST]) <= 0) flag=1;
X	if (d[HASTEMONST])		--d[HASTEMONST];
X	if (d[FIRERESISTANCE])	if ((--d[FIRERESISTANCE]) <= 0) flag=1;
X	if (d[GLOBE])			if (--d[GLOBE]<=0) { d[MOREDEFENSES]-=10; flag=1; }
X	if (d[SPIRITPRO])		if (--d[SPIRITPRO] <= 0) flag=1;
X	if (d[UNDEADPRO])		if (--d[UNDEADPRO] <= 0) flag=1;
X	if (d[HALFDAM])			if (--d[HALFDAM]<=0)  { cursors();  lprcat("\nYou now feel better "); beep(); }
X	if (d[SEEINVISIBLE])
X	  if (--d[SEEINVISIBLE]<=0)
X# ifdef DGK
X		{ monstnamelist[INVISIBLESTALKER] = floorc;
X		  if (!d[BLINDCOUNT]) {
X		  	cursors();
X			lprcat("\nYou feel your vision return to normal");
X			beep();
X		  }
X		}
X# else
X		{ monstnamelist[INVISIBLESTALKER] = ' ';
X		  cursors();  lprcat("\nYou feel your vision return to normal"); beep(); }
X# endif
X	if (d[ITCHING])
X		{
X		if (d[ITCHING]>1)
X			if ((d[WEAR]!= -1) || (d[SHIELD]!= -1))
X				if (rnd(100)<50)
X					{
X					d[WEAR]=d[SHIELD]= -1; cursors();
X					lprcat("\nThe hysteria of itching forces you to remove your armor!"); 
X					beep(); recalc();  bottomline();
X					}
X		if (--d[ITCHING]<=0) { cursors();  lprcat("\nYou now feel the irritation subside!"); beep(); }
X		}
X	if (d[CLUMSINESS])
X		{
X		if (d[WIELD] != -1)
X			if (d[CLUMSINESS]>1)
X			  if (item[playerx][playery]==0)	/* only if nothing there */
X				if (rnd(100)<33) /* drop your weapon due to clumsiness */
X					drop_object((int)d[WIELD]);
X		if (--d[CLUMSINESS]<=0) { cursors();  lprcat("\nYou now feel less awkward!"); beep(); }
X		}
X	if (flag) bottomline();
X	}
X
END_OF_FILE
if test 3513 -ne `wc -c <'regen.c'`; then
    echo shar: \"'regen.c'\" unpacked with wrong size!
fi
# end of 'regen.c'
fi
if test -f 'tgetent.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'tgetent.c'\"
else
echo shar: Extracting \"'tgetent.c'\" \(9420 characters\)
sed "s/^X//" >'tgetent.c' <<'END_OF_FILE'
X/************************************************************************
X *									*
X *			Copyright (c) 1982, Fred Fish			*
X *			    All Rights Reserved				*
X *									*
X *	This software and/or documentation is released for public	*
X *	distribution for personal, non-commercial use only.		*
X *	Limited rights to use, modify, and redistribute are hereby	*
X *	granted for non-commercial purposes, provided that all		*
X *	copyright notices remain intact and all changes are clearly	*
X *	documented.  The author makes no warranty of any kind with	*
X *	respect to this product and explicitly disclaims any implied	*
X *	warranties of merchantability or fitness for any particular	*
X *	purpose.							*
X *									*
X ************************************************************************
X */
X
X/*
X *  LIBRARY FUNCTION
X *
X *	tgetent   load buffer with entry for specified terminal
X *
X *  KEY WORDS
X *
X *	termcap functions
X *	utility routines
X *
X *  SYNOPSIS
X *
X *	int tgetent(bp,name)
X *	char *bp;
X *	char *name;
X *
X *  DESCRIPTION
X *
X *	Extracts the entry for terminal <name> from the termcap file
X *	and places it in the character buffer <bp>.   It is currently
X *	assumed that bp is at least 1024 characters.  If the entry in
X *	the termcap file is larger than 1023 characters the excess
X *	characters will be discarded and appropriate status will
X *	be returned.
X *
X *	Also note that since bp is used by other termcap
X *	routines, the storage associated with the termcap entry
X *	cannot be freed until all termcap calls are completed.
X *
X *	Tgetent can be directed to look in a file other than
X *	the default (/etc/termcap) by defining an environment
X *	variable called TERMCAP to be the pathname of the desired
X *	termcap file.  This is useful for debugging new entries.
X#ifndef VMS
X *	NOTE: the pathname MUST begin with a '/' character.
X *
X *	Also, if the string assigned to TERMCAP does not begin with
X *	a '/' and if the environment variable TERM matches <name> then
X *	the string assigned to TERMCAP is copied to buffer <bp> 
X *	instead of reading a termcap file.
X#endif
X *	
X *	If the termcap entry contains a "tc" string then the termcap
X *	entry named in the string is appended to the buffer (minus the
X *	names).
X *
X *  RETURNS
X *
X *	-1  if the termcap file cannot be opened
X *	 0  if no entry in termcap file matches <name>
X *	 1  if extraction is successful with no errors
X *	 2  if extraction is successful but entry truncated
X *
X *  SEE ALSO
X *
X *	tgetnum   extract numeric type capability
X *	tgetflag  test boolean type capability
X *	tgetstr   get string value of capability
X *
X *  AUTHOR
X *
X *	Fred Fish
X *
X */
X
X#include <stdio.h>
X
X#define TRUE 1
X#define FALSE 0
X#define BUFSIZE 1024			/* Assumed size of external buffer */
X
X#define NO_FILE	 -1			/* Returned if can't open file */
X#define NO_ENTRY  0			/* Returned if can't find entry */
X#define SUCCESS   1			/* Returned if entry found ok */
X#define TRUNCATED 2			/* Returned if entry found but trunc */
X
X#ifdef DGK_MSDOS
XFILE *fopenp();
X#endif
X
X#define DEFAULT_ROOT "termcap"		/* name without path component */
X#ifdef VMS
X#define DEFAULT_FILE "sys$library:termcap"
X#else
X#define DEFAULT_FILE "/etc/termcap"	/* default termcap filename */
X#endif VMS
X
Xchar *_tcpbuf;				/* Place to remember buffer pointer */
X
X/*
X *  PSEUDO CODE
X *
X *	Begin tgetent
X *	    Erase any previous buffer contents.
X *	    Remember the buffer pointer.
X *	    If termcap file is not found then
X *		If buffer was filled anyway then
X *		    Return SUCCESS.
X *		Else
X *		    Return NO_FILE.
X *		End if
X *	    Else
X *		While records left to process
X *		    If this is entry is what we want then
X *			Close the termcap file.
X *			If entry was truncated then
X *			    Return TRUNCATED status
X *			Else
X *			    Return SUCCESS status.
X *			End if
X *		    End if
X *		End while
X *		Return NO_ENTRY status.
X *	    End if
X *	End tgetent
X *			
X */
X
Xint tgetent(bp,name)
Xchar *bp;				/* Pointer to buffer (1024 char min) */
Xchar *name;				/* Pointer to terminal entry to find */
X{
X    FILE *fp, *find_file();
X    char *nbp, tc[80];
X
X    *bp = (char)NULL;
X    _tcpbuf = bp;
X    if ((fp = find_file(bp)) == NULL) {
X	if (*bp != NULL) {
X	    return(SUCCESS);
X	} else {
X	    return(NO_FILE);
X	}
X    } else {
X	while (fgetlr(bp,BUFSIZE,fp)) {
X	    if (gotcha(bp,name)) {
X		fclose(fp);
X		nbp = &bp[strlen(bp)-1];
X		if (*nbp != '\n') {
X		    return(TRUNCATED);
X		} else {
X		    /* check for a recursive call (i.e. :tc=vt100:)
X		     * added 18-dec-86 RDE (single recursion...)
X		     */
X		    char *area;
X		    area = &tc[0];
X		    if (tgetstr("tc", &area) == NULL)		
X			return(SUCCESS);
X		    else {
X			fp = find_file(0);	/* know it works and is file */
X			while (fgetlr(nbp, BUFSIZE-(nbp-bp), fp)) {
X			    if (gotcha(nbp,tc)) {
X				char *cp1, *cp2;	/* scrunch out names */
X				fclose(fp);
X				cp1 = nbp;
X				while (*cp1++ != ':')	/* search for first  */
X					;
X				cp2 = nbp;
X				while (*cp2++ = *cp1++) /* move the chars.   */
X					;
X				if (bp[strlen(bp)-1] != '\n') {
X				    return(TRUNCATED);
X				} else {
X				    return(SUCCESS);
X				}
X			    }
X			}
X			return (NO_ENTRY);
X		    }
X		}
X	    }
X	}
X	return(NO_ENTRY);
X    }
X}
X
X/*
X *  INTERNAL FUNCTION
X *
X *	find_file    find the termcap file and open it if possible
X *
X *  KEY WORDS
X *
X *	internal functions
X *	find_file
X *
X *  SYNOPSIS
X *
X *	static FILE *find_file(bp)
X *	char *bp;
X *
X *  DESCRIPTION
X *
X *	Attempts to locate and open the termcap file.  Also handles
X *	using the environment TERMCAP string as the actual buffer
X *	(that's why bp has to be an input parameter).
X *
X#ifdef VMS
X *	If TERMCAP is defined as a valid filespec then it will be
X *	opened.  If this fails then the default termcap file will
X *	be used.
X#else
X *	If TERMCAP is defined an begins with a '/' character then
X *	it is taken to be the pathname of the termcap file and
X *	an attempt is made to open it.  If this fails then
X *	the default termcap file is used instead.
X *
X *	If TERMCAP is defined but does not begin with a '/' then
X *	it is assumed to be the actual buffer contents provided
X *	that <name> matches the environment variable TERM.
X#endif
X *
X *  BUGS
X *
X *	There is currently no way to be sure which termcap
X *	file was opened since the default will always be
X *	tried.
X *
X */
X
X/*
X *  PSEUDO CODE
X *
X *	Begin find_file
X *	    If there is a TERMCAP environment string then
X *		If the string is not null then
X *		    If the string is a pathname then
X *			If that file is opened successfully then
X *			    Return its pointer.
X *			End if
X *		    Else
X *			If there is a TERM environment string then
X *			    If TERM matches <name> then
X *				Copy TERMCAP string to buffer.
X *				Return NULL for no file.
X *			    End if
X *			End if
X *		    End if
X *		End if
X *	    End if
X *	    Open default termcap file and return results.
X *	End find_file
X *
X */
X
Xstatic FILE *find_file(bp)
Xchar *bp;
X{
X    FILE *fp, *fopen();
X    char *cp, *ncp, *getenv();
X
X    if ((cp = getenv("TERMCAP")) != NULL) {
X	if (*cp != NULL) {
X#ifdef VMS
X	    if ((fp = fopen(cp, "r")) != NULL)
X		return(fp);
X#else
X	    if (*cp == '/' || *cp == '\\') {
X		if ((fp = fopen(cp,"r")) != NULL) {
X		    return(fp);
X		}
X	    } else {
X		if ((ncp = getenv("TERM")) != NULL) {
X		    if (strcmp(cp,ncp) == 0) {
X			strcpy(bp,cp);
X			return((FILE *)NULL);
X		    }
X		}
X	    }
X#endif
X	}
X    }
X    /*
X     * Try current directory, then /etc/termcap
X     */
X	if (fp = fopen(DEFAULT_ROOT, "r"))
X		return fp;
X	else 
X#ifdef DGK_MSDOS
X        if (fp = fopen(DEFAULT_FILE, "r") )
X            return fp;
X        else	/* try along the PATH */
X            return( fopenp(DEFAULT_ROOT, "r", NULL));
X#else
X		return (fopen(DEFAULT_FILE, "r"));
X#endif
X}
X
X
X/*
X *  INTERNAL FUNCTION
X *
X *	gotcha   test to see if entry is for specified terminal
X *
X *  SYNOPSIS
X *
X *	gotcha(bp,name)
X *	char *bp;
X *	char *name;
X *
X *  DESCRIPTION
X *
X *	Tests to see if the entry in buffer bp matches the terminal
X *	specified by name.  Returns TRUE if match is detected, FALSE
X *	otherwise.
X *
X */
X
X/*
X *  PSEUDO CODE
X *
X *	Begin gotcha
X *	    If buffer character is comment character then
X *		Return FALSE since remainder is comment
X *	    Else
X *		Initialize name scan pointer.
X *		Compare name and buffer until end or mismatch.
X *		If valid terminators for both name and buffer strings
X *		    Return TRUE since a match was found.
X *		Else
X *		    Find next non-name character in buffer.
X *		    If not an alternate name separater character
X *			Return FALSE since no more names to check.
X *		    Else
X *			Test next name and return results.
X *		    End if
X *		End if
X *	    End if
X *	End gotcha
X *
X */
X
Xgotcha(bp,name)
Xchar *bp;
Xchar *name;
X{
X    char *np;
X 
X    if (*bp == '#') {
X	return(FALSE);
X    } else {
X	np = name;
X	while (*np == *bp && *np != NULL) {np++; bp++;}
X	if (*np == NULL && (*bp == NULL || *bp == '|' || *bp == ':')) {
X	    return(TRUE);
X	} else {
X	    while (*bp != NULL && *bp != ':' && *bp != '|') {bp++;}
X	    if (*bp != '|') {
X		return(FALSE);
X	    } else {
X		return(gotcha(++bp,name));
X	    }
X	}
X    }
X}
X
X#ifdef MSDOS
X/*
X * index(buffer, char)
X * Find character in buffer.  Return the pointer
X * to it. Shouldn't be necessary to write this
X * myself but VMS didn't.  Oh Well...
X * Used by lots of files in the termcap library.
X * Rich Ellison, 16-DEC-1986
X */
Xchar
X*index(buf, ch)
Xchar	*buf;
Xchar	ch;
X{
X	register int	c;
X	while ((c= *buf++) != '\0')
X		if (c == ch)
X			return (buf-1);
X	return (NULL);
X}
X#endif
END_OF_FILE
if test 9420 -ne `wc -c <'tgetent.c'`; then
    echo shar: \"'tgetent.c'\" unpacked with wrong size!
fi
# end of 'tgetent.c'
fi
echo shar: End of archive 9 \(of 11\).
cp /dev/null ark9isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 11 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