[comp.sources.amiga] v89i013: world - text adventure, Part06/07

page@swan.ulowell.edu (Bob Page) (02/02/89)

Submitted-by: ejkst@unix.cis.pittsburgh.edu (Eric J. Kennedy)
Posting-number: Volume 89, Issue 13
Archive-name: fun/world.6

#	This is a shell archive.
#	Remove everything above and including the cut line.
#	Then run the rest of the file through sh.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar:    Shell Archiver
#	Run the following text with /bin/sh to create:
#	motion.c
#	verbs2.c
# This archive created: Mon Jan 30 18:06:53 1989
cat << \SHAR_EOF > motion.c
#include "parame.inc"
#include "variab.h"
#include "arrays.h"
#include "trvtbl.inc"

/* World C Version 1.00 copyright 1987 J.D.McDonald 
   Use as you like for non-commercial purposes, but please
   leave this note, and document any changes you make as yours */

    static  int     rax[] = {556, 2445, 7552, 1105, 3111};
    static  int     dx[] = {2331, 4293, 2204, 6339, 3325};
    static  int     locx[] = {176, 177, 178, 179, 180};

vship()
{
    int             locy, i;

    if (wrdnum[0] == ACTIVA) {
	if ((loc < 175 || loc > 181) && loc != 184 && loc != 187)
	    speak(71);
	else if (lpill == 0)
	    speak(237);
	else if (obloc[YROD] != 2000 + YCLIP || obloc[BSAPPH] != BCLIP + 2000)
	    speak(539);
	else if ((obimpr[BDOOR] & 2) == 0)
	    speak(544);
	else if (spcloc != 2)
	    speak(542);
	else if (loc == 181 || loc == 184 || loc == 187) {
	    speak(536);
	    oldloc = 0;
	    oldlc2 = 0;
	    if (loc == 181)
		loc = 177;
	    else if (loc == 184)
		loc = 180;
	    else
		loc = 179;
	} else {
	    locy = 0;
	    for (i = 0; i < 5; i++) {
		if (rax[i] == raset && dx[i] == decset)
		    locy = locx[i];
	    }
	    if (locy == 0)
		speak(537);
	    else if (loc == locy)
		speak(500);
	    else {
		speak(538);
		if (loc == 175)
		    speak(545);
		for (i = 1; i <= MOVMAX; i++)
		    if (obloc[i] == loc)
			obloc[i] = locy;
		loc = locy;
		oldloc = 0;
		oldlc2 = 0;
	    }
	}
    } else if (loc < 176 || loc > 180)
	speak(71);
    else if (lpill == 0)
	speak(237);
    else if (obloc[YROD] != YCLIP + 2000 || obloc[BSAPPH]
	     != BCLIP + 2000)
	speak(539);
    else if ((obimpr[BDOOR] & 2) == 0)
	speak(544);
    else if (spcloc != 2)
	speak(542);
    else if (loc == 176)
	speak(540);
    else if (loc == 178)
	speak(541);
    else if (spcloc != 2)
	speak(543);
    else {
	oldloc = 0;
	oldlc2 = 0;
	speak(543);
	if (loc == 177)
	    locy = 181;
	else if (loc == 179)
	    locy = 187;
	else
	    locy = 184;
	for (i = 1; i <= MOVMAX; i++)
	    if (obloc[i] == loc)
		obloc[i] = locy;
	loc = locy;
    }
}


vcross()
{
    int             result;

    result = 0;
    /* the tree over the chasm */

    if ((loc == 19 || loc == 21) && (dobjs[0] == TREE ||
		       dobjs[0] == LOG || dobjs[0] == CHASM) && (prepdo == 0
			      || prepdo == OVER) && (iobj == TREE || iobj ==
						     LOG || iobj == 0)) {
	result = 1;
	prepdo = 0;
	dobjs[0] = NORTHE;
	if (loc == 21)
	    dobjs[0] = SOUTHW;
    }
    /* you can't "cross" the lake  */

    else if ((loc == 5 || loc == 6 || loc == 15 || loc == 17) && (
							 dobjs[0] == WATER))
	speak(47);
    else
	speak(94);
    return (result);
}


vcrawl()
{
    int             result;
    result = 0;
    /* you can crawl over the log   */

    if ((loc == 19 || loc == 21) && (dobjs[0] == TREE ||
				     dobjs[0] == LOG || dobjs[0] == CHASM) &&
	prepdo == OVER) {
	adverb = CAREFU;
	prepdo = 0;
	oldlc2 = oldloc;
	oldloc = loc;
	if (loc == 19)
	    loc = 21;
	else
	    loc = 19;
    }
    /* if "crawl direction" but not u or d, then call go  */

    else if (dobjs[0] <= NORTHW && prepdo == 0) {
	if (loc == 19 || loc == 21)
	    adverb = CAREFU;
	result = 1;
	speak(109);
    }
    /* otherwise, don't understand  */

    else
	speak(94);
    return (result);

}







vjump()
{
    int             result, ncarrd, nweigh, kcarrd, kweigh;
    result = 0;
    /* can't jump if dead */

    if (deadf) {
	speak(46);
	return (result);
    }
    /* jumping off the spire is fatal  */

    if ((loc == 13 || loc == 14) && ((dobjs[0] == SPIRE &&
				      prepdo == OFF) || dobjs[0] == 0)) {
	speak(49);
	speak(37);
	oldlc2 = 0;
	oldloc = 0;
	loc = 12;
	vdead();
	return (result);
    }
    /* trying to jump the chasm isn't too smart either  */

    if ((loc == 21 || loc == 19) && (dobjs[0] == 0 || ((dobjs[0] ==
		 CHASM || dobjs[0] == TREE || dobjs[0] == LOG) && (prepdo ==
						   0 || prepdo == OVER)))) {
	speak(49);
	speak(38);
	oldlc2 = 0;
	oldloc = 0;
	loc = 22;
	locdat[22] |= 16384;
	vdead();
	return (result);
    }
    /* but you can jump onto the tower  */

    if (loc == 48 && (dobjs[0] == 0 || dobjs[0] == TOWER) &&
	(prepdo == ON || prepdo == 0)) {
	/* if you're not carrying too much  */

	burden(&ncarrd, &nweigh, &kcarrd, &kweigh);
	if (ncarrd == 0 && (obloc[ZKNAPS] != 1000 && obloc[ZKNAPS]
			    != 3000) && wirelc[5] != 1000) {
	    speak(136);
	    oldlc2 = oldloc;
	    oldloc = loc;
	    loc = 49;
	} else
	    speak(139);

	return (result);
    }
    /* but not off the tower  */

    if ((loc == 49) && ((dobjs[0] == TOWER &&
			 prepdo == OFF) || dobjs[0] == 0)) {
	speak(49);
	speak(137);
	oldlc2 = 0;
	oldloc = 0;
	loc = 48;
	vdead();
	return (result);
    }
    /* jumping at the barrier   */

    if ((loc == 26 || loc == 27) && dobjs[0] == BARRIE) {
	if (prepdo == OVER || prepdo == 0) {
	    speak(170);
	    return (result);
	} else if (prepdo == THROUG) {
	    oldloc = 0;
	    oldlc2 = 0;
	    if (loc == 26)
		loc = 27;
	    else
		loc = 26;
	}
    }
    /* bottomless pit   */

    if (loc == 96) {
	oldloc = 0;
	oldlc2 = 0;
	if (dobjs[0] == TUNNEL)
	    loc = 102;
	else {
	    speak(266);
	    vdead();
	    loc = 97;
	}
    }
    /* wheeeeeee!!!  */

    speak(49);
    return (result);
}


vgo()
{
    int             aloc, xretr, dir, errno, nloc, k, kkk, indx1, ix;
    int             m, n, xgox, kk, indx2, s;


    /* the entrance to the cave at the waterfall */

    rmove = 0;
    if (prepdo == BEHIND && loc == 24 && dobjs[0] == HORSET) {
	horflg = 1;
	oldlc2 = oldloc;
	oldloc = loc;
	loc = 25;
	return;
    }
    aloc = loc;
    if (actor == ROBOT)
	aloc = obloc[ZROBOT];
    /* translate go through barrier to direction  */

    if (dobjs[0] == BARRIE && prepdo == THROUG) {
	prepdo = 0;
	if (aloc == 26)
	    dobjs[0] = NORTHE;
	else if (aloc == 19)
	    dobjs[0] = SOUTHW;
	else if (aloc == 62 || aloc == 50)
	    dobjs[0] = NORTH;
	else if (aloc == 86 || aloc == 63)
	    dobjs[0] = SOUTH;
	else if (aloc == 68)
	    dobjs[0] = WEST;
	else if (aloc == 90)
	    dobjs[0] = EAST;
	else
	    prepdo = THROUG;
    }
    /*

     * all prepositional expressions must be handled by special code above

     * this point  

     
*/

    if (prepdo > DOWN) {
	speak(94);
	return;
    }
    xretr = 0;
    dir = 0;
    errno = 0;
    if (prepdo == UP || prepdo == DOWN) {
	if (dobjs[0] == 0)
	    dir = prepdo + 9 - PRPMIN;
	else if (dobjs[0] > 0 && dobjs[0] <= NORTHW)
	    errno = 57;
	else if (dobjs[0] == SPIRE && (aloc >= 12 && aloc <= 14))
	    dobjs[0] = 0;
	else
	    errno = 28;
    } else if (dobjs[0] > 0 && dobjs[0] <= NORTHW)
	dir = dobjs[0] + 1 - NUNMIN;
    else
	errno = 28;
    if (errno != 0)
	goto lab9000;
    /****** we have reached the point where we use the travel table  */
    xgox = 0;
    k = dir;
    kkk = k;
    if (adverb == QUICKL)
	k = k + 64;
    if (adverb == SLOWLY)
	k = k + 32;
    if (adverb == CAREFU)
	k = k + 16;
    /*
     * if he says "go quickly" that will match "go quickly" or just "go" but
     * "go" will not match "go quickly" . same for other adverbs 
     */

    if (deadf)
	k = kkk;
    indx1 = dispat[aloc];
    indx2 = dispat[aloc + 1];
    for (ix = indx1; ix <= indx2 - 2; ix += 2)
	if (trvtbl[ix] == k || kkk == trvtbl[ix])
	    goto lab200;
    errno = 58;
    goto lab9000;
lab200:
    indx1 = ix + 1;
    m = trvtbl[indx1] / 512;
    n = trvtbl[indx1] - m * 512;
    if (actor != 1 && actor != ROBOT)
	return;
    else if (actor == ROBOT) {
	if (m == 1) {
	    xgox = 1;
	    nloc = n;
	} else if (m == 3 && n == 13 && aloc == 68) {
	    xgox = 1;
	    nloc = 90;
	} else if (m == 3 && n == 6 && aloc == 74) {
	    xgox = 1;
	    nloc = 70;
	} else;
    }
    /* unconditional motion */

    else if (m == 1) {
	xgox = 1;
	nloc = n;
	xretr = 1;
	/* unconditional stay where is */

    } else if (m == 2) {
	errno = n;
	/* forced to get out of chair */

	if (aloc == 184 || aloc == 187 || aloc == 166 ||
	    (aloc >= 175 && aloc <= 181))
	    spcloc = 0;
	else;
    } else if (m == 3) {
	/***    special conditions */

	if (n == 1) {
	    /*
	     * to climb the spire you must wear shoes, but nothing else, and
	     * it must be daytime  
             */

	    if (daytim == 0 || (turns % 100) > 73) {
		speak(123);
		return;
	    }
	    if (obloc[CSHOES] == 3000) {
		for (kk = 1; kk <= MOVMAX; kk++) {
		    if (kk == CSHOES)
			continue;
		    if (obloc[kk] == 1000 || (obloc[kk] == 3000 && kk != CKEY))
			errno = 60;
		}
		if (errno != 60) {
		    xgox = 1;
		    nloc = 13;
		}
	    }
	}
	/* to get behind the horsetails */

	else if (n == 2) {
	    if (horflg || (locdat[25] & 16384) != 0) {
		xgox = 1;
		nloc = 25;
	    }
	}
	/* into the bar  */

	else if (n == 3) {
	    if (daytim == 1 || deadf) {
		xgox = 1;
		xretr = 1;
		nloc = 42;
	    } else if (marflg[0]) {
		speak(128);
		return;
	    }
	}
	/* underground from mars */

	else if (n == 4 || n == 11) {
	    if ((obimpr[MDOOR] & 2) == 0) {
		xgox = 1;
		xretr = 1;
		nloc = 135;
		if (n == 11)
		    nloc = 41;
	    }
	} else if (n == 5) {
	    /* warehouse  */

	    if ((obimpr[RDOOR] & 2) != 2) {
		xgox = 1;
		xretr = 0;
		nloc = 47;
		if (aloc == 47)
		    nloc = 51;
	    }
	} else if (n == 6) {
	    if ((obimpr[ZVINE] & 56) == 16) {
		xgox = 1;
		nloc = 70;
		xretr = 1;
	    }
	} else if (n == 7) {
	    /* rabbit hole  */

	    if (obimpr[RHOLE] == 17) {
		xgox = 1;
		nloc = 96;
	    }
	} else if (n == 8) {
	    /* going down the pole c */

	    if ((obimpr[ZLATEX] & 56) == 24) {
		xgox = 1;
		nloc = 80;
	    }
	} else if (n == 9 || n == 12) {
	    /* glass door  */

	    if ((obimpr[GDOOR] & 2) == 0) {
		xgox = 1;
		xretr = 1;
		nloc = 136;
		if (aloc == 136)
		    nloc = 85;
	    }
	}
	/* beehive  */

	else if (n == 10) {
	    if (obimpr[ZDEET] >= 4096) {
		xgox = 1;
		nloc = 88;
		if (aloc == 88)
		    nloc = 87;
	    }
	} else if (n == 13);
	else if (n == 14) {
	    if (obimpr[ZLOUVE] == 9) {
		xgox = 1;
		xretr = 1;
		nloc = 142;
		if (aloc == 142)
		    nloc = 98;
	    }
	}
	/* the scree slope  */

	else if (n == 15) {
	    if (screef > 0) {
		xgox = 1;
		xretr = 1;
		nloc = 151;
	    }
	} else if (n == 16) {
	    if ((obimpr[ODOOR] & 2) == 0) {
		xgox = 1;
		xretr = 1;
		nloc = 166;
		if (aloc == 166)
		    nloc = 165;
	    }
	} else if (n == 17) {
	    if ((obimpr[BDOOR] & 2) == 0) {
		xgox = 1;
		xretr = 1;
		if (aloc == 174)
		    nloc = 175;
		else if (aloc == 175)
		    nloc = 174;
		else if (aloc == 181)
		    nloc = 182;
		else if (aloc == 184)
		    nloc = 185;
		else if (aloc == 187)
		    nloc = 188;
		else;
	    }
	} else if (n == 18) {
	    if (obimpr[HMURAL] == 209) {
		xgox = 1;
		xretr = 1;
		nloc = 170;
	    }
	} else {
	    linout("bug in travel table", 19);
	    return;
	}
    }
    /***    end special conditions

            he dies. code give his final location */

    else if (m == 4) {
	if (deadf)
	    errno = 46;
	else {
	    oldlc2 = 0;
	    oldloc = 0;
	    if (loc == 13 || loc == 14)
		loc = 12;
	    if (loc == 19 || loc == 21)
		loc = 22;
	    if (loc == 76)
		loc = 79;
	    /* if he moved when he dies, special code goes here  */

	    locdat[loc] |= 16384;
	    vdead();
	    if (loc == 96) {
		loc = 97;
		locdat[97] |= 16384;
	    }
	    errno = n;
	}
    }
    /* goes to newloc if he is dead and has been there before */

    else if (m == 5) {
	if (deadf && (locdat[n] & 16384) != 0) {
	    xgox = 1;
	    nloc = n;
	}
    }
    /* motion with some probability */

    else if (m >= 16 && m <= 31) {
	s = (m - 15) * 6;
	if (pct(s)) {
	    xgox = 1;
	    nloc = n;
	}
    } else {
	speak(252);
	return;
    }


    if (errno != 0)
	goto lab9000;
    if (xgox && actor == 1) {
	if ((locdat[nloc] & 25) == 0 && obloc[25] != 1000 && !deadf)
	    errno = 258;
	else if ((locdat[nloc] & 32) != 0) {
	    oldlc2 = oldloc;
	    oldloc = loc;
	    loc = nloc;
	    if (!xretr || loc == 38 || loc == 97 || loc == 127
		|| loc == 88 || loc == 74 || loc == 96) {
		oldloc = 0;
		oldlc2 = 0;
	    }
	} else
	    errno = 59;
    } else if (xgox && actor == ROBOT) {
	if ((locdat[nloc] & 64) != 0) {
	    obloc[ZROBOT] = nloc;
	    rmove = 1;
	} else
	    errno = 299;
    } else {
	ix = indx1 + 1;
	if (trvtbl[ix] == kkk || trvtbl[ix] == k)
	    goto lab200;
	errno = 58;
	if (actor == 1)
	    errno = 299;
    }
    /***   all errors and "you are dead" or "impossibility" messages go here */

lab9000:
    if (errno != 0)
	speak(errno);
}



vretre()
/* retreat or back */

{
    if (oldloc == 0)
	speak(65);
    else {
	loc = oldloc;
	oldloc = oldlc2;
	oldlc2 = 0;
    }
}

vclimb()
{
    int             result;

    result = 0;
    /*

     * if result is 1 call vgo rubber tree jungle trees 

     
*/

    if ((loc == 64 || loc == 67) && (dobjs[0] == TREE || dobjs[0]
				     == 0))
	speak(430);
    else if ((loc == 78 || loc == 79) && (dobjs[0] == TREE || dobjs[0]
					  == 0))
	speak(431);
    else if (loc == 65 && (prepdo == 0 || prepdo == UP) && (dobjs[0]
						== TREE || dobjs[0] == 0)) {
	oldlc2 = oldloc;
	oldloc = loc;
	loc = 66;
    } else if (loc == 66 && (prepdo == DOWN || prepdo == 0) && (dobjs[0]
						== 0 || dobjs[0] == TREE)) {
	oldlc2 = oldloc;
	oldloc = loc;
	loc = 65;
    }
    /* pole  */

    else if ((loc == 80 || loc == 79 || loc == 76) && (dobjs[0] == POLE
						       || dobjs[0] == 0)) {
	result = 1;
	wrdnum[0] = GO;
	dobjs[0] = 0;
	if (prepdo == 0)
	    prepdo = UP;
    }
    /*

     * you can climb the spire if you are careful but the actual motion is

     * done by "vgo" 

     
*/

    else if ((loc >= 12 && loc <= 14) && (dobjs[0] == 0 || dobjs[0]
					  == SPIRE)) {
	wrdnum[0] = GO;
	dobjs[0] = 0;
	result = 1;
	if ((loc == 12 && (prepdo == 0 || prepdo == UP)) ||
	    (loc == 13 && (prepdo == 0 || prepdo == UP)))
	    prepdo = UP;
	else if (((loc == 13 || loc == 14) && prepdo == DOWN) ||
		 (loc == 14 && prepdo == 0))
	    prepdo = DOWN;
	else;
    }
    /* you can climb over the log but not up a tree!  */

    else if (loc == 19 || loc == 21) {
	if ((dobjs[0] == TREE || dobjs[0] == LOG) && prepdo == OVER) {
	    prepdo = 0;
	    result = 1;
	    dobjs[0] = NORTHE;
	    {
		if (loc == 21)
		    dobjs[0] = SOUTHW;
	    }
	} else if (dobjs[0] == TREE && (prepdo == UP || prepdo == 0))
	    speak(108);
	else
	    speak(94);
    }
    /* you can't climb the tower  */

    else if (loc == 48 && (prepdo == 0 || prepdo == UP) &&
	     (dobjs[0] == 0 || dobjs[0] == TOWER))
	speak(138);
    /* but you can climb down the tower */

    else if (loc == 49 && (prepdo == 0 || prepdo == DOWN) &&
	     (dobjs[0] == TOWER || dobjs[0] == 0)) {
	oldlc2 = oldloc;
	oldloc = loc;
	loc = 48;
    }
    /* you can't climb the barrier  */

    else if ((loc == 26 || loc == 27) && dobjs[0] == BARRIE)
	speak(170);
    else if (dobjs[0] == TREE) {
	if ((locdat[loc] & 2048) == 2048)
	    speak(244);
	else
	    speak(245);
    } else if (loc == 20 || (loc >= 52 && loc <= 56)) {
	wrdnum[0] = GO;
	{
	    if (prepdo == 0)
		prepdo = UP;
	}
	result = 1;
    } else
	speak(50);
    return (result);
}


vrun()
{
    int             result;
    result = 0;
    /* ru translates to "go quickly"  */

    if (adverb == SLOWLY)
	speak(51);
    else {
	result = 1;
	adverb = QUICKL;
	wrdnum[0] = GO;
    }
    return (result);
}


vswim()
{
    int             spk, m, i, xloc;
    spk = 0;
    /* he can't swim at night (for no real reason)  */

    if (daytim == 0 && (loc == 5 || loc == 6 || loc == 15 || loc
			== 17))
	spk = 122;
    /* he can't swim while dead */

    else if (deadf)
	spk = 46;
    /* you must swim in the lake or poool  */

    else if ((loc < 5 || loc > 17 || (loc > 6 && loc < 15))
	     && loc != 122)
	spk = 52;
    else;
    if (spk != 0) {
	speak(spk);
	return (0);
    }
    m = dobjs[0];
    if ((m == WATER && prepdo != IN) || ((m == ISLAND || m == SHORE)
			    && prepdo != TO) || (m == POOL && prepdo != IN))
	spk = 28;
    else if ((loc == 5 && (m == WEST || m == ISLAND)) ||
	     (loc == 15 && m == EAST) ||
	     (loc == 16 && m == SOUTH))
	xloc = 6;
    else if (loc == 6 && (m == EAST || m == SHORE))
	xloc = 5;
    else if ((loc == 6 && m == NORTH) ||
	     (loc == 17 && (m == SOUTH || m == ISLAND)) ||
	     (loc == 16 && m == WEST))
	xloc = 15;
    else if ((loc == 6 && m == SOUTH) || (loc == 15 && m == WEST))
	xloc = 16;
    else if (loc == 15 && (m == NORTH || m == SHORE))
	xloc = 17;
    else if ((loc == 5 || loc == 6 || (loc <= 17 && loc >= 15))
	     && (m == WATER)) {
	if (dirty < 10)
	    spk = 110;
	else
	    spk = 111;
    } else if (loc == 122 && m == POOL)
	xloc = 123;
    else
	spk = 54;
    if (spk == 0) {
	/* but not if you are wearing too much  */

	for (i = 1; i <= MOVMAX; i++) {
	    if (i == CSHOES || i == CKEY || i == CFISH || i == DFISH
		|| i == BNET || i == GSPHER)
		continue;
            if(obloc[i] == 1000 || obloc[i] == 3000) {
        	speak(53);
	        return (0);
            }
	}
	oldlc2 = 0;
	oldloc = 0;
	loc = xloc;
	return (0);
    }
    speak(spk);
    return (0);
}
SHAR_EOF
cat << \SHAR_EOF > verbs2.c
#include "parame.inc"
#include "variab.h"
#include "arrays.h"

/* World C Version 1.00 copyright 1987 J.D.McDonald 
   Use as you like for non-commercial purposes, but please
   leave this note, and document any changes you make as yours */

vpunch()
{
    int             result, spk;
    result = 0;
    if (dobjs[0] == SEED || dobjs[0] == SPHERE) {
	result = 1;
	return (result);
    }
    spk = 286;
    if (dobjs[0] == LOUVER) {
	if (loc == 98 || loc == 142) {
	    spk = 282;
	    obimpr[ZLOUVE] = 9;
	} else
            spk = 66;
    } else if (dobjs[0] == GUARD) {
	if (loc == guardl || loc == 171 || (chaset != 0 && chaset <= 9))
	    spk = 562;
	else
	    spk = 561;
    } else if (dobjs[0] == ROBOT || dobjs[0] == FERRET)
	spk = 285;
    else if (dobjs[0] == MARTIA && loc >= 27 && loc <= 51)
	spk = 307;
    else if (dobjs[0] == VINE && loc == 74 && (obimpr[ZVINE] & 56) == 8) {
	spk = 306;
	if (pct(33))
	    spk = 302;
	else if (pct(50))
	    spk = 305;
	else;
    }
    speak(spk);
    return (result);
}

vput()
{
    int             result, plce, zplce, spk, obj, cplce, xiobj, ioplce, ambig;
    int             csize, cinsid, i, ncarrd, nweigh, kcarrd, kweigh;
    int             z, size, weigh, plural;

    result = 0;
    if ((prepdo == ON && prepio == 0) || (prepio == ON && iobj == ME)) {
	prepio = 0;
	prepdo = 0;
	result = 1;
	/* this results in calling vwear  */

	return (result);
    }
    if ((prepio == IN && iobj == BOWL) || prepdo == DOWN) {
	/* call drop to put things in bowl  */

	if (prepdo == DOWN)
	    prepdo = 0;
	result = 2;
	return (result);
    }
    if (dobjs[0] == WATER && dobjs[1] == 0 && iobj == FUNNEL) {
	result = 3;
	return (result);
    }
    /* code for put latex on pole   */

    if (dobjs[0] == LATEX && (doadjs[0] == 0 || doadjs[0] == GOOEY)
	&& loc == 76 && prepio == ON && iobj == POLE &&
	(obimpr[ZLATEX] & 56) == 8) {
	if (allflg || dobjs[1] != 0) {
	    speak(48);
	    return (result);
	}
	itsher(ZLATEX, &plce);
	if (plce == 0)
	    speak(66);
	else {
	    obloc[ZLATEX] = 76;
	    obimpr[ZLATEX] = 25 + 320;
	    speak(75);
	}
	return (result);
    }
    /* putting things in machines   */

    if ((iobj == MACHIN || iobj == OPENIN || iobj == SLOT) &&
	loc != 146) {
	if (loc != 143 && loc != 156 && loc != 158 &&
	    loc != 160 && loc != 162)
	    speak(90);
	else if (loc == 143) {
	    if (prepio != IN || allflg || dobjs[1] != 0
		|| dobjs[0] != CASSET || (doadjs[0] != 0 &&
					  doadjs[0] != HUGE))
		speak(48);
	    else {
		itsher(ZCASSE, &zplce);
		if (zplce <= 0)
		    speak(66);
		else {
		    obloc[ZCASSE] = 0;
		    machst |= 16;
		    if (obimpr[RLIGHT] == 73 && (machst & 1) == 0 &&
			(machst & 2) != 0) {
			speak(399);
			obimpr[RLIGHT] = 145;
			obimpr[GLIGHT] = 145;
		    }
		}
	    }
	} else {
	    spk = 0;
	    if (prepio != IN || allflg || dobjs[1] != 0
		|| dobjs[0] != COIN)
		spk = 48;
	    else {
		obj = getobj(COIN, doadjs[0]);
		if (obj < 0) {
		    speak(70);
		    return (result);
		}
		itsher(obj, &cplce);
		if (cplce == 0)
		    spk = 66;
		else if (loc == 156) {
		    if (obj != PCOIN)
			spk = 93;
		    else {
			spk = 512;
			obloc[PCOIN] = 0;
			obloc[BBALL] = 156;
		    }
		} else if (loc == 158) {
		    if (obj != NCOIN)
			spk = 93;
		    else {
			spk = 513;
			obloc[NCOIN] = 0;
			obloc[NNEWS] = 158;
		    }
		} else if (loc == 162) {
		    if (obj != CCOIN)
			spk = 93;
		    else {
			spk = 514;
			obloc[CCOIN] = 0;
			obloc[MMAP] = 162;
		    }
		} else if (loc == 160)
		    gamble(obj);
		else;
		if (spk != 0)
		    speak(spk);
	    }
	}
	return (result);
    }
    spk = 0;
    if ((prepio != IN || (prepio == IN && prepdo != 0)) && !
	(prepio == ON &&
	 (iobj == ENLARG || iobj == TRAY) && loc == 143))
	spk = 273;
    else {
	/* check on status of indirect object  */

	xiobj = getobj(iobj, ioadj);
	if (xiobj <= 0)
	    spk = 90;
	else if (obpprp[xiobj] / 2048 == 0 && xiobj != ZENLAR)
	    spk = 77;
	else if (iobj == BUCKET && (obimpr[ZBUCKE] == 1033 || (
		   obloc[ZLATEX] == (2000 + ZBUCKE) && (obimpr[ZLATEX] & 56)
							       == 8)))
	    spk = 276;
	else {
	    itsher(xiobj, &ioplce);
	    if (ioplce != 1 && ioplce != 2 && ioplce != 4)
		spk = 91;
	}
    }
    if (spk != 0) {
	speak(spk);
	return (result);
    }
    /* convert dobjs(i) (noun) to list of objects (pointers) */

    ambig = !cnvobj();
    if (allflg)
	getall();
    csize = obpprp[xiobj] / 2048;
    if (csize == 15)
	csize = 70;
    cinsid = 0;
    for (i = 1; i <= MOVMAX; i++)
	if (obloc[i] == 2000 + xiobj)
	    cinsid += (obw3[i] % 256);
    burden(&ncarrd, &nweigh, &kcarrd, &kweigh);
    if (obloc[ZKNAPS] == 1000 || obloc[ZKNAPS] == 3000)
	nweigh += kweigh;
    for (i = 0; i <= 29; i++) {
	z = dobjs[i];
	if (z == 0)
	    return (result);
	if (obloc[z] == z + 2000)
	    continue;
	itsher(z, &plce);
	size = (obw3[z] % 256);
	weigh = obw3[z] / 256;
	plural = (obpprp[z] & 256) == 256;
	if (allflg && (z > MOVMAX || obloc[z] == (2000 + xiobj)))
	    continue;
	if (allflg || dobjs[1] != 0)
	    speak(odistb[z]);
	if (z > MOVMAX) {
	    spk = odistb[z + 1] - 1;
	    if (plce != 4)
		spk = 113;
	} else if (obloc[z] == 2000 + xiobj) {
	    spk = 92;
	    if (plural)
		spk = 191;
	} else if (plce == 2) {
	    spk = 88;
	    if (plural)
		spk = 194;
	} else if (plce == 0) {
	    spk = 66;
	    if (plural)
		spk = 185;
	} else if ((plce == 4 || plce == 5) && z == ZWIRE && wirelc[0] != 0)
	    spk = 89;
	else if ((plce == 4 || plce == 5) && z == ZCART &&
		 obloc[ZCART] == 2000 + RSLOT)
	    spk = 311;
	else if (size + cinsid > csize) {
	    spk = 93;
	    if (plural)
		spk = 192;
	} else if ((nweigh + weigh > 125) && (xiobj == ZKNAPS &&
					      obloc[z] != 1000 &&
			(obloc[ZKNAPS] == 1000 || obloc[ZKNAPS] == 3000))) {
	    spk = 79;
	    if (plural)
		spk = 188;
	} else if (z == CFISH && obloc[z] ==
		   (2000 + PLBAG) && (obimpr[PLBAG] / 512 == 5))
	    spk = 76;
	else if (z == ZLATEX && (obimpr[ZLATEX] & 56) == 8)
	    spk = 277;
	else if (xiobj == RSLOT && !(z == ZCART || z == CCART))
	    spk = 351;
	else if (iobj == FUNNEL) {
	    spk = 396;
	    if (xiobj == LFUNNE && z == ZMETOL)
		machst |= 8;
	    if (xiobj == RFUNNE && z == ZHYPO)
		machst |= 4;
	    obloc[z] = 0;
	} else if (loc == 99 && z == ZSTATU
		   && obimpr[ZSEED] != 2 && obimpr[ZSEED] != 1)
	    spk = 405;
	else if (loc == 86 && obloc[ZSEED] == 86 && !
		 (obloc[RPANT] == 3000 && obloc[RSHIRT] == 3000)) {
	    if (obloc[LPANT] == 3000 || obloc[GSHIRT] == 3000) {
		if (daytim == 1)
		    speak(424);
		else
		    speak(425);
	    } else {
		if (daytim == 1)
		    speak(426);
		else
		    speak(427);
	    }
	    if (obloc[LPANT] == 3000)
		obloc[LPANT] = 0;
	    if (obloc[GSHIRT] == 3000)
		obloc[GSHIRT] = 0;
	    vdead();
	    return (result);
	} else {
	    if (obloc[z] == 2000 + RSLOT)
		obimpr[ZSCREE] = 9;
	    obloc[z] = 2000 + xiobj;
	    nweigh += weigh;
	    cinsid += size;
	    /* special increment of descriptor pointer if obimpr has 4096 set */

	    if (obimpr[z] / 4096 == 1)
		obimpr[z] = (obimpr[z] & ~4096) + 8;
	    /* ~4096=167777 octal  */

	    spk = 75;
	    if (z == ZLATEX && (obimpr[ZLATEX] & 56) == 24)
		obimpr[ZLATEX] = 337;
	    if ((z == CCART || z == ZCART) && xiobj == RSLOT) {
		obimpr[RSLOT] += 8192;
		obimpr[ZSCREE] = 145;
	    } else if (iobj == RECESS && z == GDISC)
		spk = 412;
	    else if (loc == 86 && z == ZSEED) {
		if (daytim == 1)
		    spk = 428;
		else
		    spk = 429;
	    } else if (xiobj == OCLIP && z == YROD)
		spk = 526;
	    else if (xiobj == VCLIP && z == LMINER)
		spk = 527;
	    else if (xiobj == YCLIP && z == YROD)
		spk = 528;
	    else if (xiobj == BCLIP && z == BSAPPH)
		spk = 529;
	    else;
	    if ((xiobj == YCLIP || xiobj == BCLIP) &&
	     obloc[YROD] == 2000 + YCLIP && obloc[BSAPPH] == 2000 + BCLIP) {
		speak(spk);
		spk = 531;
	    }
	}
	xindnt += 2;
	speak(spk);
	xindnt -= 2;
    }
    return (result);
}

gamble(c)
    int             c;
{
    int             rann, spk, x;
    rann = qrand();
    if (jackpo == 1) {
	obloc[c] = 0;
	spk = 515;
    } else if (c != PCOIN) {
	if (rann > 3750) {
	    spk = 516;
	    x = PCOIN;
	} else if (rann > 3317) {
	    x = SCOIN;
	    spk = 517;
	} else if (rann > 2212) {
	    x = CCOIN;
	    spk = 518;
	} else if (rann > 1105) {
	    x = BCOIN;
	    spk = 519;
	} else {
	    x = NCOIN;
	    spk = 520;
	}
    } else {
	if (rann > 3276) {
	    spk = 521;
	    jackpo = 1;
	} else if (rann > 2048) {
	    x = PCOIN;
	    spk = 516;
	} else {
	    x = SCOIN;
	    spk = 517;
	}
    }
    if (spk == 521) {
	obloc[PCOIN] = 160;
	obloc[SCOIN] = 160;
	obloc[CCOIN] = 160;
	obloc[BCOIN] = 160;
	obloc[NCOIN] = 160;
	bonus += 5;
    } else {
	obloc[c] = 0;
	obloc[x] = 160;
    }
    speak(spk);
}

vscrat()
{
    int             spk, plce;
    if ((iobj != DIAMON && iobj != SAPPHI && iobj != KNIFE) || prepio != WITH)
	spk = 196;
    /* sapphire has no edge */

    else if (iobj == SAPPHI) {
	itsher(BSAPPH, &plce);
	if (plce == 0)
	    spk = 197;
	else
	    spk = 198;
    }
    /*
     * diamond cuts glass window but not vine names of window and glass plate
     * are all mixed up  
     */

    else if (iobj == DIAMON) {
	itsher(ZDIAMO, &plce);
	if (plce == 0)
	    spk = 199;
	else if (dobjs[0] == WINDOW || dobjs[0] == GLASS) {
	    if (loc != 30 && loc != 42)
		spk = 200;
	    else if (((obimpr[ZWINDO] / 8) % 8) != 0)
		spk = 201;
	    else {
		spk = 202;
		obimpr[ZWINDO] = 145;
		obloc[ZDIAMO] = 1000;
		if (loc == 30)
		    obloc[PGLASS] = 42;
		else
		    obloc[PGLASS] = 30;
	    }
	} else if (dobjs[0] == VINE && loc == 74 && (obimpr[ZVINE] & 56) == 8)
	    spk = 306;
	else
	    spk = 203;
    } else {
	itsher(ZKNIFE, &plce);
	if (plce == 0)
	    spk = 89;
	else if (dobjs[0] == WINDOW || dobjs[0] == GLASS)
	    spk = 309;
	else if (dobjs[0] == VINE && loc == 74 && (obimpr[ZVINE] & 56) == 8)
	    spk = 305;
	else
	    spk = 286;
    }
    speak(spk);
}

vread()
{
    int             m, plce, n;
    /* if it's light, read whatever is written on  */

    if (daytim == 0) {
	speak(121);
	return;
    }
    m = getobj(dobjs[0], doadjs[0]);
    if (prepio == TO || m < 1 || (obpprp[m] & 16) != 16) {
	speak(71);
	return;
    }
    itsher(m, &plce);
    n = (obimpr[m] / 64) % 8;
    if (n == 0 || plce == 0)
	speak(98);
    else {
	if (loc >= 153 && lpill == 1 && (m == MMAP || m ==
					 NNEWS || m == NNOTE || m == TMACH))
	    n += 1;
	speak(odistb[m] + n);
	if (m == NNOTE && lpill == 1)
	    nreadx();
    }
}

    static   char   string[] = "  Large ship XX XX XX";

nreadx()
{
    int             l, n, m;
    char            cnum[4];
    l = dcombi;
    n = (l & 31);
    l = l / 32;
    m = (l & 31);
    l = l / 32;
    numcvt(n, cnum);
    string[19] = cnum[2];
    string[20] = cnum[3];
    numcvt(m, cnum);
    string[16] = cnum[2];
    string[17] = cnum[3];
    numcvt(l, cnum);
    string[13] = cnum[2];
    string[14] = cnum[3];
    linout(string, 21);
}



vrobot()
{
    int             spk, vspk, dj, empty, i, bplce, gplce, tloc, iplce, ij, plce;
    spk = 0;
    vspk = 0;
    if (dobjs[0] != 0)
	dj = getrob(dobjs[0], doadjs[0]);
    if (iobj != 0)
	ij = getrob(iobj, ioadj);
    empty = 1;
    for (i = 1; i <= MOVMAX; i++)
	if (obloc[i] == 2000 + ZROBOT)
	    empty = 0;
    if (dobjs[1] != 0)
	spk = 343;
    else if (wrdnum[0] == TAKE || wrdnum[0] == HOLD) {
	if (dobjs[0] == DISC && dj < 0) {
	    tloc = loc;
	    loc = obloc[ZROBOT];
	    itsher(GDISC, &gplce);
	    itsher(BDISC, &bplce);
	    loc = tloc;
	    if (gplce == 4)
		gplce = 5;
	    if (bplce == 4)
		bplce = 5;
	    if (loc == obloc[ZROBOT]) {
		if (gplce == 1)
		    gplce = 5;
		if (bplce == 1)
		    bplce = 5;
	    }
	    if (gplce != 5 && bplce != 5)
		dj = 0;
	    else if (gplce == 5)
		dj = GDISC;
	    else
		dj = BDISC;
	}
	if (prepdo != 0 || prepio != 0 || allflg)
	    spk = 342;
	else if (empty == 0)
	    spk = 343;
	else if (dj < 0)
	    spk = 70;
	else if (dj > MOVMAX || dj == 0)
	    spk = 344;
	else {
	    tloc = loc;
	    loc = obloc[ZROBOT];
	    itsher(dj, &plce);
	    loc = tloc;
	    if (!(plce == 4 || plce == 5 || (plce == 1
                                        && obloc[ZROBOT] == loc)))
		spk = 420;
	    else if (obw3[dj] / 256 > 1 || (obw3[dj] & 255) > 2)
		spk = 352;
	    else {
		spk = 345;
		obloc[dj] = 2000 + ZROBOT;
		if (dj == ZINSEC && obimpr[ZINSEC] == 201)
		    obimpr[ZINSEC] = 209;
	    }
	}
    } else if (wrdnum[0] == DROP) {
	if (dj < 0) {
	    if (dobjs[0] == DISC && obloc[GDISC] == 2000 + ZROBOT)
		dj = GDISC;
	    else if (dobjs[0] == DISC && obloc[BDISC] == 2000 + ZROBOT)
		dj = BDISC;
	    else;
	}
	if (prepdo != 0 || prepio != 0 || allflg)
	    spk = 342;
	else if (dj < 0)
	    spk = 70;
	else if (dj == 0)
	    spk = 344;
	else if (obloc[dj] != 2000 + ZROBOT)
	    spk = 347;
	else {
	    spk = 346;
	    obloc[dj] = obloc[ZROBOT];
	}
    } else if (wrdnum[0] == GIVE) {
	if (dj < 0) {
	    if (dobjs[0] == DISC && obloc[GDISC] == 2000 + ZROBOT)
		dj = GDISC;
	    else if (dobjs[0] == DISC && obloc[BDISC] == 2000 + ZROBOT)
		dj = BDISC;
	    else;
	}
	if (obloc[ZROBOT] != loc)
	    spk = 443;
	else if (prepdo != 0 || prepio != TO || allflg)
	    spk = 342;
	else if (dj < 0)
	    spk = 70;
	else if (dj == 0)
	    spk = 344;
	else if (obloc[dj] != 2000 + ZROBOT)
	    spk = 347;
	else {
	    spk = 444;
	    obloc[dj] = 1000;
	}
    } else if (wrdnum[0] == WASH || wrdnum[0] == QWATER) {
	if (dobjs[0] == DISC && obloc[GDISC] == 2000 + ZROBOT)
	    dj = GDISC;
	else if (dobjs[0] == DISC && obloc[BDISC] == 2000 + ZROBOT)
	    dj = BDISC;
	else;
	if (dj <= 0 || !((dj <= MOVMAX && (obloc[dj] == 2000 +
		      ZROBOT || obloc[dj] == obloc[ZROBOT])) || (dj > MOVMAX
	      && (obw3[dj] == obloc[ZROBOT] || obw4[dj] == obloc[ZROBOT]))))
	    spk = 344;
	else {
	    if (wrdnum[0] == WASH) {
		if (dj == GDISC && rvtim == 0)
		    spk = 414;
		else if (dj == GDISC && rvtim == 1) {
		    spk = 410;
		    rvtim = 2;
		} else
		    spk = 348;
	    } else
		spk = 349;
	    if (loc == 74 && (obimpr[ZVINE] & 56) == 8 &&
		dj == ZVINE) {
		vspk = 1;
		obimpr[ZVINE] = obimpr[ZVINE] + 8;
	    }
	}
    } else if (wrdnum[0] == TRANSL) {
	if (dobjs[0] >= DEET && dobjs[0] <= STORAG)
	    spk = 354 - DEET + dobjs[0];
	else if (dobjs[0] == CYGNAN || dobjs[0] == TERRAN)
	    spk = 362 - TERRAN + dobjs[0];
	else
	    spk = 364;
    } else if (wrdnum[0] == PUT) {
	if (dobjs[0] == DISC && obloc[GDISC] == 2000 + ZROBOT)
	    dj = GDISC;
	else if (dobjs[0] == DISC && obloc[BDISC] == 2000 + ZROBOT)
	    dj = BDISC;
	else;
	if (dobjs[0] == DISC && obloc[GDISC] != 2000 + ZROBOT &&
	    obloc[BDISC] != ZROBOT)
	    spk = 347;
	else if (prepdo != 0 || prepio != IN || allflg)
	    spk = 342;
	else if (dj < 0 || ij < 0)
	    spk = 70;
	else if (dj == 0 || ij == 0)
	    spk = 344;
	else if (obloc[dj] != 2000 + ZROBOT)
	    spk = 347;
	else {
	    tloc = loc;
	    loc = obloc[ZROBOT];
	    itsher(ij, &iplce);
	    loc = tloc;
	    if (obloc[ZROBOT] == loc && obloc[ij] == 1000)
		iplce = 6;
	    if (iplce < 4 || iplce > 6)
		spk = 344;
	    else {
		spk = 75;
		obloc[dj] = 2000 + ij;
		if (ij == ZMUD) {
		    spk = 407;
		    obloc[dj] = 0;
		} else if (ij == FPIT) {
		    spk = 408;
		    obloc[dj] = 0;
		} else if (ij == ZACID && (dj == GDISC || dj == BDISC)) {
		    spk = 413;
		    obloc[dj] = 0;
		} else if (ij == GVAPOR && gvtim == 0 && dj == GDISC) {
		    spk = 409;
		    gvtim = 1;
		} else if (ij == RVAPOR && dj == GDISC && rvtim == 0) {
		    spk = 409;
		    if (gvtim == 1)
			rvtim = 1;
		}
	    }
	}
    } else if (wrdnum[0] == IS && adverb == WHERE)
	spk = 477;
    else if (wrdnum[0] == IS && adverb == WHAT) {
	if (dobjs[0] == COMBIN && (doadjs[0] == 0 || doadjs[0] == BOX))
	    spk = 476;
	else if (doadjs[0] != 0)
	    spk = 342;
	else if (dobjs[0] == DEET)
	    spk = 473;
	else if (dobjs[0] == METOL)
	    spk = 474;
	else if (dobjs[0] == HYPO)
	    spk = 475;
	else
	    spk = 477;
    } else
	spk = 251;
    if (spk != 0 && (obloc[ZROBOT] == loc || loc == 146)) {
	speak(spk);
	if (vspk != 0)
	    speak(301);
    }
}

vshit()
{
    dirty += 1;
    {
	if (loc == 74 && (obimpr[ZVINE] & 56) == 8)
	    speak(303);
	else if (dirty >= 5 && dirty < 10)
	    speak(40);
	else if (dirty >= 10)
	    if (obloc[LPANT] == 3000 || obloc[RPANT] == 3000)
		speak(43);
	    else
		speak(42);
    }
}

vshoot()
{
    int             spk, plce;
    spk = 0;
    itsher(ICAMER, &plce);
    /* camera isn't here  */

    if (plce != 1 && plce != 4)
	spk = 114;
    /* see if film is fogged   */

    else if (oextim == 8192)
	spk = 237;
    else if (oextim >= 45) {
	spk = 320;
	obloc[OPHOTO] = loc;
	obimpr[OPHOTO] += 64;
	oextim = 8192;
    }
    /* shot the pterodactyls */

    else if (loc == 89 || loc == 68 || loc == 62)
	spk = 382;
    else if (loc == 24) {
	if (obloc[PPHOTO] != 0)
	    spk = 115;
	else {
	    spk = 116;
	    obloc[PPHOTO] = loc;
	}
    }
    /* phograph the martians at the bar  */

    else if (loc == 30 && marflg[0]) {
	if (obloc[MPHOTO] != 0)
	    spk = 135;
	else {
	    spk = 134;
	    obloc[MPHOTO] = loc;
	}
    }
    /* shoot the hockey game  */

    else if (((loc >= 31 && loc <= 38) || loc == 29) && marflg[1]) {
	if (obloc[MPHOTO] != 0)
	    spk = 135;
	else {
	    spk = 134;
	    obloc[MPHOTO] = loc;
	    obimpr[MPHOTO] += 64;
	}
    }
    /* martians, alone aren't too interesting */

    else if ((loc == 28 && marflg[3]) ||
	     (loc == 40 && marflg[2]) ||
	     (loc >= 43 && loc <= 45 && marflg[4]))
	spk = 140;
    else if (loc == 131) {
	if (obloc[FPHOTO] != 0)
	    spk = 115;
	else {
	    spk = 318;
	    obloc[FPHOTO] = loc;
	    obimpr[FPHOTO] += 64;
	}
    } else if (loc == 100) {
	if (obloc[APHOTO] != 0)
	    spk = 115;
	else {
	    spk = 319;
	    obloc[APHOTO] = loc;
	    obimpr[APHOTO] += 64;
	}
    } else
	spk = 117;
    if (spk != 0)
	speak(spk);
}

vshut()
{
    int             spk, n, plce;
    if (prepdo != 0 && prepio != 0)
	spk = 21;
    /* the door to the bar is always open  */

    else if ((loc == 30 || loc == 42) && dobjs[0] == DOOR)
	spk = 224;
    /* doors or containers must be openable, and not already shut  */

    else {
	n = getobj(dobjs[0], doadjs[0]);
	if (dobjs[0] == DOOR && (loc == 184 || loc == 187 ||
				 (loc >= 176 && loc <= 181)))
	    n = BDOOR;
	if (n < 0)
	    spk = 70;
	else if (n == 0)
	    spk = 66;
	else if ((obpprp[n] % 2) != 1) {
	    if (obpprp[n] / 2048 != 0)
		spk = 254;
	    else
		spk = 230;
	} else {
	    itsher(n, &plce);
	    if (dobjs[0] == DOOR && (loc == 184 || loc == 187 ||
				     (loc >= 176 && loc <= 181)))
		plce = 5;
	    if (plce <= 0) {
		if (dobjs[0] == DOOR)
		    spk = 225;
		else
		    spk = 66;
	    } else if ((obimpr[n] & 2) == 2) {
		if (dobjs[0] == DOOR)
		    spk = 227;
		else
		    spk = 390;
	    } else {
		spk = 232;
		obimpr[n] |= 2;
		if (n == RDOOR || n == MDOOR || n == GDOOR || n == ODOOR
		    || n == BDOOR)
		    obimpr[n] -= 8;
		if (n == ZBOX) {
		    obimpr[ZBOX] |= 4;
		    dial1 = 0;
		    dial2 = 0;
		}
	    }
	}
    }
    speak(spk);
}

vsit()
{
    int             spk;
    /* sit is usually a joke */

    if (dobjs[0] == 0 && prepdo == DOWN) {
	if (loc == 166 || loc == 184 || loc == 187 ||
                                         (loc <= 181 && loc >= 175)) {
	    spcloc = 2;
	    spk = 510;
	} else
	    spk = 220;
    } else if (prepdo != IN && prepdo != ON)
	spk = 21;
    else if (prepdo == IN && dobjs[0] == CHAIR && (loc == 166
			      || loc == 184 || (loc <= 181 && loc >= 175) ||
						   loc == 187)) {
	spcloc = 2;
	spk = 510;
    } else if ((dobjs[0] == TREE || dobjs[0] == LOG || dobjs[0] ==
		BOULDE) && prepdo == ON)
	spk = 220;
    else if ((prepdo == ON || prepdo == IN) && (dobjs[0] == STOOL
			       || dobjs[0] == STOOLS || dobjs[0] == BOWL)) {
	/* except the case of sitting on electric seat  */

	if (loc == 42)
	    spk = 221;
	else if (loc == 28)
	    spk = 222;
	/* sit in bowl, when at hockey rink, slides him in it */

	else if (dobjs[0] == BOWL && (loc >= 32 && loc <= 38)) {
	    loc = 38;
	    spk = 75;
	    oldloc = 0;
	    oldlc2 = 0;
	} else if (dobjs[0] == BOWL)
	    spk = 156;
	else
	    spk = 71;
    } else
	spk = 48;
    speak(spk);
}
vstand()
{
    int             spk;
    if (dobjs[0] == 0 && prepdo == UP) {
	if (spcloc == 2) {
	    spcloc = 0;
	    spk = 511;
	} else
	    spk = 208;
    } else if (prepdo != ON)
	spk = 94;
    else if (dobjs[0] == TREE || dobjs[0] == LOG && (loc >= 4 &&
			  loc <= 19 && loc != 16 && loc != 13 && loc != 14))
	spk = 209;
    /* stand on glass plate  */

    else if (dobjs[0] == GLASS) {
	if (obloc[PGLASS] == 1000 || obloc[PGLASS] == 3000)
	    spk = 211;
	else if (obloc[PGLASS] != loc)
	    spk = 66;
	else {
	    spk = 75;
	    spcloc = 1;
	}
    } else
	spk = 210;
    speak(spk);
}


vtake()
{
    int             i, spk, xiobj, qq, xplce, kplce, ncarrd, kcarrd;
    int             nweigh, kweigh, ambig, z, plce, plural, t, kkwr;
    spk = 0;
    if (prepdo != 0 && prepio != 0)
	spk = 48;

    /* remove clothing means take off  */

    if (wrdnum[0] == REMOVE && prepdo == 0) {
	qq = getobj(dobjs[0], doadjs[0]);
	if (qq > 0 && obloc[qq] == 3000)
	    prepdo = OFF;
    }
    xiobj = getobj(iobj, ioadj);
    if (xiobj == ZKNAPS)
	itsher(ZKNAPS, &kplce);
    /* handle remove something from container */

    if (prepio == FROM) {
	if (obpprp[xiobj] / 2048 == 0)
	    spk = 77;
	else {
	    itsher(xiobj, &xplce);
	    if (xplce == 0)
		spk = 78;
	}
    }
    if (spk != 0) {
	speak(spk);
	return;
    }
    /* handle multiple objects   */

    ambig = !cnvobj();
    if (butflg && ambig)
	return;
    if (allflg)
	getall();

    /* check weight  */

    burden(&ncarrd, &nweigh, &kcarrd, &kweigh);
    if (obloc[ZKNAPS] == 1000 || obloc[ZKNAPS] == 3000)
	nweigh = nweigh + kweigh;
    for (i = 0; i < 30; i++) {
	z = dobjs[i];
	if (z == 0)
	    return;
	plural = (obpprp[z] & 256) == 256;
	if (z > MOVMAX) {
	    if (!allflg) {
		speak(odistb[z]);
		itsher(z, &plce);
		if (plce == 4)
		    spk = odistb[z + 1] - 1;
		else {
		    if (plural)
			spk = 185;
		    else
			spk = 66;
		}
		xindnt += 2;
		speak(spk);
		xindnt -= 2;
	    }
	    continue;
	}
	itsher(z, &plce);
	if (allflg && (plce == 0 || plce == 1 || (prepdo ==
			    OFF && plce != 2) || (prepio == FROM && xiobj ==
				   ZKNAPS && (obloc[z] != (2000 + ZKNAPS) ||
		kplce == 0)) || (prepio == 0 && obloc[z] == (2000 + ZKNAPS))
		       || (plce == 2 && prepdo != OFF)))
	    continue;
	/* emit name of object if "all" or multiple */

	if (dobjs[1] != 0 || allflg || ambig)
	    speak(odistb[z]);
	if (prepdo == 0) {
	    /*
	     * the wire is very,very special... don't even try to figure it
	     * out!!! *************************************************** 
             */


	    if (plce == 1 || (z == ZWIRE && wirelc[5] == 1000
			      && wirelc[0] != 1000)) {
		spk = 67;
		if (plural)
		    spk = 186;
	    } else if (plce == 0 && !(z == ZWIRE && (wirelc[4]
			      == loc || wirelc[3] == loc || wirelc[2] == loc
				|| wirelc[1] == loc || wirelc[0] == loc))) {
		spk = 66;
		if (plural)
		    spk = 185;
		if (z == RBOULD && loc == 27)
		    spk = 153;
		if (z == GMOSS && loc == 19)
		    spk = 243;
		if (z == PGLASS && (loc == 30 || loc == 42))
		    spk = 247;
		if ((z == PPHOTO && loc == 24) || (z == MPHOTO &&
						   loc >= 26 && loc <= 50))
		    spk = 249;
	    } else if (plce == 2) {
		spk = 68;
		if (plural)
		    spk = 187;
	    } else if (prepio == WITH && (z != CFISH ||
					  xiobj != BNET))
		spk = 48;
	    else if (prepio == FROM && !((z == CKEY &&
				iobj == SPIRE && ioadj == 0) || (obloc[z] ==
			(2000 + xiobj)) || (z == ZWIRE && ((iobj == ZKNOB &&
				    (obimpr[ZWIRE] & ~56) == 32) || (iobj ==
				  ZTOWER && (obimpr[ZWIRE] & -57) == 24)))))
		/* ~56=177707 octal  */

		spk = 71;
	    else if (ncarrd > 5)
		spk = 72;
	    else if (nweigh + obw3[z] / 256 > 125) {
		spk = 79;
		if (plural)
		    spk = 188;
	    }
	    /* take fish (from sea) with net.  */

	    else if (z == CFISH && loc == 16 &&
		     (prepio != WITH || xiobj != BNET))
		spk = 80;
	    /* prevent him from killing wish in watery bag  */

	    else if (z == CFISH && obloc[z] ==
		     (2000 + PLBAG) && (obimpr[PLBAG] / 512 == 5))
		spk = 76;
	    /* cannot take latex if still liquid   */

	    else if (z == ZLATEX && (obimpr[z] & 56) == 8)
		spk = 268;
	    /* cant remove cartridge from slot  */

	    else if (z == ZCART && obloc[ZCART] == 2000 + RSLOT)
		spk = 311;
	    /* cant take statue unless ferrets blinded  */

	    else if (loc == 99 && z == ZSTATU
		     && obimpr[ZSEED] != 2 && obimpr[ZSEED] != 1)
		spk = 405;
	    /* diamond must land on moss to be safe   */

	    else if (z == ZDIAMO && loc == 49) {
		if (obloc[GMOSS] == 48) {
		    spk = 165;
		    obloc[z] = 48;
		    obimpr[z] += 8;
		} else {
		    spk = 164;
		    obloc[z] = 0;
		}
	    } else if (z == ZSEED && loc == 86 && obloc[ZSEED] == 86 &&
		       !(obloc[RPANT] == 3000 && obloc[RSHIRT] == 3000)) {
		if (obloc[LPANT] == 3000 || obloc[GSHIRT] == 3000) {
		    if (daytim == 1)
			speak(424);
		    else
			speak(425);
		} else {
		    if (daytim == 1)
			speak(426);
		    else
			speak(427);
		}
		if (obloc[LPANT] == 3000)
		    obloc[LPANT] = 0;
		if (obloc[GSHIRT] == 3000)
		    obloc[GSHIRT] = 0;
		vdead();
		return;
	    } else {
		nweigh = nweigh + obw3[z] / 256;
		ncarrd += 1;
		if (z == ZKNAPS) {
		    spk = 87;
		    obloc[z] = 3000;
		}
		/* specail code for wire  */

		else {
		    spk = 81;
		    if (z == ZWIRE) {
			if (obloc[ZWIRE] == loc) {
			    obimpr[ZWIRE] = (obimpr[ZWIRE] & ~56) + 8;
			    if (wirelc[0] == 0)
				obloc[z] = 1000;
			    /*
			     * if he takes fastened end, all the pointers must
			     * have their order reversed  
                             */

			    else {
				t = obloc[z];
				obloc[z] = wirelc[4];
				wirelc[4] = t;
				t = wirelc[3];
				wirelc[3] = wirelc[0];
				wirelc[0] = t;
				t = wirelc[2];
				wirelc[2] = wirelc[1];
				wirelc[1] = t;
				wirelc[5] = 1000;
				if (obloc[ZWIRE] == 1000)
				    goto lab240;
			lab239:
				if (obloc[z] != wirelc[0])
				    goto lab240;
				obloc[ZWIRE] = wirelc[0];
				for (kkwr = 0; kkwr < 5; kkwr++)
				    wirelc[kkwr] = wirelc[kkwr + 1];
				goto lab239;
				/*
				 * if it's all coiled up, i.e. all the
				 * wirelc's are 1000, clear wirelc   
                                 */

			lab240:
				if (wirelc[0] == 1000) {
				    for (kkwr = 0; kkwr < 6; kkwr++)
					wirelc[kkwr] = 0;
				}
			    }
			} else if (wirelc[5] == loc) {
			    /*
			     * if pick up far end of wire, 1000(held by him)
			     * propagates back from end of wirelc  
                             */

			    for (kkwr = 1; kkwr <= 5; kkwr++) {
				if (wirelc[6 - kkwr] == loc &&
                                             wirelc[5 - kkwr] == loc)
                                                       wirelc[6 - kkwr] = 1000;
			    }
			    if (wirelc[0] == loc && obloc[ZWIRE] == loc)
				wirelc[0] = 1000;
			} else
			    spk = 214;
			if (wirelc[0] == 1000 && obloc[ZWIRE] == 1000) {
			    for (kkwr = 0; kkwr < 6; kkwr++)
				wirelc[kkwr] = 0;
			}
		    } else {
			/*******    the actual taking occurs here  */

			if (obloc[z] == 2000 + RSLOT)
			    obimpr[ZSCREE] = 9;
			obloc[z] = 1000;
			if (z == ZLATEX)
			    obimpr[z] = 337;
		    }
		}
		/* special message for seed  */

		if (loc == 86 && z == ZSEED) {
		    if (daytim == 1)
			spk = 428;
		    else
			spk = 429;
		}
		/* actual fish taking from sea occurs here  */

		if (dobjs[i] == CFISH && loc == 16) {
		    if (obloc[BNET] == 1000)
			obloc[CFISH] = 2000 + BNET;
		    else
			spk = 91;
		}
		/*
		 * special increment of descriptor pointer if obimpr has 4096
		 * set 
                 */

		if (obimpr[z] / 4096 == 1)
		    obimpr[z] = (obimpr[z] & ~4096) + 8;
		/* ~4096=167777 octal  */

	    }
	} else {
	    /*
	     * the prepdo is off take off clothes only  
             */

	    if (plce == 2) {
		obloc[z] = loc;
		spk = 82;
	    } else if ((obpprp[z] & 64) != 64)
		spk = 71;
	    else {
		spk = 83;
		if (plural)
		    spk = 189;
	    }
	}
	xindnt += 2;
	speak(spk);
	xindnt -= 2;
    }
}


vthrow()
{
    int             xobj, result, plce, kobj;
    result = 0;
    /* if vthrow remains false, must call vdrop  */

    xobj = getobj(dobjs[0], doadjs[0]);
    if (xobj <= 0 || xobj > MOVMAX) {
	speak(71);
	result = 0;
	return (result);
    }
    itsher(xobj, &plce);
    if (plce == 0) {
	if ((obpprp[xobj] & 256) == 256)
	    speak(185);
	else
	    speak(66);
	result = 1;
	return (result);
    }
    /* throw things at the shimmering barrier  */

    if ((loc == 26 || loc == 27) && prepio != OUT &&
	iobj == BARRIE && dobjs[0] != WIRE && dobjs[0] != FISH) {
	speak(172);
	obloc[xobj] = loc;
	result = 1;
    }
    /* throwing things at martians is not allowed  */

    else if ((loc >= 27 && loc <= 51) && daytim == 0 &&
	     (prepio == AT || prepio == TO) && iobj == MARTIA) {
	speak(178);
	result = 1;
	/*
	 * the window, or the glass, can't be broken by throwing things at it 
         */

    } else if ((prepio == THROUG || prepio == AT) && (iobj == WINDOW
						      || iobj == GLASS)) {
	if (loc != 30 && loc != 42)
	    speak(200);
	else if (xobj == ZSEED) {
	    speak(337);
	    obloc[xobj] = 0;
	    obimpr[ZSEED] = 0;
	} else if (obloc[PGLASS] != 0) {
	    speak(240);
	    obloc[xobj] = 42;
	    if (loc == 42)
		obloc[xobj] = 30;
	} else if (xobj == RBOULD) {
	    speak(241);
	    obloc[xobj] = loc;
	} else {
	    speak(242);
	    obloc[xobj] = loc;
	}
	result = 1;
	/*
	 * throwing other things results in a joke (usually)  
         */

    } else if (prepio == AT && ((iobj == FERRET && (loc == 99 || loc ==
		      100 || loc == 131)) || (iobj == BEES && loc == 87))) {
	prepio = 0;
	iobj = 0;
	ioadj = 0;
    } else if (prepio == AT) {
	if (iobj == ROBOT || iobj == FERRET)
	    speak(285);
	else if (iobj == GUARD) {
	    if (loc == guardl || loc == 171 || (chaset != 0 &&
						chaset <= 9))
		speak(562);
	    else
		speak(561);
	} else if (iobj == VINE && loc == 74) {
	    speak(308);
	    obloc[xobj] = loc;
	} else {
	    kobj = getobj(iobj, ioadj);
	    if (kobj <= 0)
		speak(71);
	    else;
	    speak(48);
	}
	return (1);
    }
    return (result);
}

vturn()
{
    int             numbr;
    if ((dobjs[0] == RA || dobjs[0] == DECLIN) && ((loc >= 175
				 && loc <= 181) || loc == 184 || loc == 187)
	&& prepio == TO && iobj > 9999) {
	numbr = iobj - 10000;
	if (dobjs[0] == RA)
	    raset = numbr;
	if (dobjs[0] == DECLIN)
	    decset = numbr;
	if (lpill == 1)
	    speak(533);
	return;
    }
    if ((dobjs[0] == LIGHT || dobjs[0] == MACHIN) && (prepdo ==
						      ON || prepdo == OFF)) {
	speak(391);
	return;
    } else if (dobjs[0] != DIAL)
	speak(387);
    else {
	if (doadjs[0] != LEFT && doadjs[0] != RIGHT)
	    speak(392);
	else if (prepio == 0 && iobj == 0)
	    speak(393);
	else if (prepio != TO || iobj < 9999)
	    speak(28);
	else if (iobj < 10000 || iobj > 10999)
	    speak(394);
	else if (doadjs[0] == LEFT)
	    dial1 = iobj - 10000;
	else
	    dial2 = iobj - 10000;
    }
    if (dial1 == dial1x && dial2 == dial2x && (obimpr[ZBOX] & 6) == 6) {
	speak(395);
	obimpr[ZBOX] -= 6;
    }
}
vwash()
{
    int             bplce, n, nplce;
    itsher(ZBUCKE, &bplce);
    if ((locdat[loc] & 1024) == 0 && (bplce == 0 || obimpr[ZBUCKE] != 1033)) {
	speak(74);
	return;
    }
    n = getobj(dobjs[0], doadjs[0]);
    if (n < 0)
	speak(70);
    else if (n == 0)
	speak(28);
    else {
	itsher(n, &nplce);
	if (nplce == 0) {
	    if ((obimpr[n] & 256) != 0)
		speak(185);
	    else
		speak(89);
	} else if (n == GDISC && rvtim == 0)
	    speak(414);
	else if (n == GDISC && rvtim == 1) {
	    speak(410);
	    rvtim = 2;
	} else
	    speak(336);
    }
}

vwear()
{
    int             ambig, i, d, plural, plce, spk;
    /* wear clothes  */

    ambig = !cnvobj();
    if (allflg || ambig) {
	speak(84);
	return;
    }
    for (i = 0; i < 30; i++) {
	d = dobjs[i];
	if (d == 0)
	    continue;
	plural = (obpprp[d] & 256) == 256;
	if (d != ZDEET)
	    speak(odistb[d]);
	itsher(d, &plce);
	if (plce == 0) {
	    spk = 66;
	    if (plural)
		spk = 185;
	} else if (plce == 2) {
	    spk = 68;
	    if (plural)
		spk = 147;
	} else if ((obpprp[d] & 64) != 64 && d != ZDEET)
	    spk = 85;
	else if ((d == RPANT && obloc[LPANT] == 3000) ||
		 (d == LPANT && obloc[RPANT] == 3000) ||
		 (d == RSHIRT && obloc[GSHIRT] == 3000) ||
		 (d == GSHIRT && obloc[RSHIRT] == 3000) ||
		 (d == HBOOTS && obloc[CSHOES] == 3000) ||
		 (d == CSHOES && obloc[HBOOTS] == 3000))
	    spk = 86;
	else {
	    if (d == ZDEET) {
		spk = 75;
		obimpr[ZDEET] = 28672;
		obloc[ZDEET] = 0;
	    } else {
		spk = 87;
		if (plural)
		    spk = 190;
		obloc[d] = 3000;
		/*
		 * taking key changes descriptor ~4152=167707 octal  
                 */

		if (d == CKEY)
		    obimpr[d] = (obimpr[d] & ~4152) + 16;
	    }
	}
	xindnt += 2;
	speak(spk);
	xindnt -= 2;
    }
}

SHAR_EOF
#	End of shell archive
exit 0
-- 
Bob Page, U of Lowell CS Dept.  page@swan.ulowell.edu  ulowell!page
Have five nice days.