[comp.sources.games] v01i102: world - sci-fi adventure game, Part03/07

games-request@tekred.TEK.COM (07/24/87)

Submitted by: "J.D. McDonald " <mcdonald@uxe.cso.uiuc.edu>
Comp.sources.games: Volume 1, Issue 102
Archive-name: world/Part03



#! /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 3 (of 7)."
# Contents:  parser.c verbs2.c
# Wrapped by billr@tekred on Thu Jul 23 17:17:56 1987
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f parser.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"parser.c\"
else
echo shar: Extracting \"parser.c\" \(17928 characters\)
sed "s/^X//" >parser.c <<'END_OF_parser.c'
X#include "parame.inc"
X#include "variab.h"
X#include "arrays.h"
X#include "vocab.inc"
X#include "verbtb.inc"
X
X/* World C Version 1.00 copyright 1987 J.D.McDonald 
X   Use as you like for non-commercial purposes, but please
X   leave this note, and document any changes you make as yours */
X
X/* No apologies for all the goto's. If you can get rid of them, well,
X   I guess some persons are just naturally masochists */
X
Xstatic int      typlst[4] = {VRBMIN, ADJMIN, NUNMIN, PRPMIN};
Xstatic int      index[5], indx;
X
Xscan()
X/*
X * this function scans the input line for gross syntax errors it also expands
X * special direction commands such as "ne" into their full form. it also
X * works on adverbs, removes such expressions as "ask frog," etc. finally it
X * puts the word numbers and types in the wrdnum and wrdtyp arrays the input
X * is inbuf ,the output is wrdnum,wrdtyp,actor,adverb 
X *
X */
X{
X    int             result, offlg, askx, lptr0, wptr, i, lxx, errno;
X
X    result = 0;
X    offlg = 0;
X    chgact = 0;
X    askx = 0;
X
Xlab5:
X    adverb = 0;
X    for (i = 0; i < 30; i++) {
X	wrdnum[i] = 0;
X	wrdtyp[i] = 0;
X    }
X    /*
X     * wordtyp is -1 for a period,-2 comma 1 for adverb,2 verb,3 adjective,4
X     * noun,5 preposition numbers are type 4,and wrdnum=number+10000 
X     */
X
X    wptr = 0;
Xlab10:
X    lptr0 = lptr;
X    wscan();
X    /*
X     * on return from wscan punct contains: 0 for a word 1 for a period 2 for
X     * a comma 3 for a number 4 if an illegal character 5 if a number follows
X     * a letter directly 6 if a letter follows a number directly 
X     */
X
X    if (punct == 1)
X	return (result);
X    else if (punct == 4)
X	goto lab9000;
X    else if (punct == 2)
X	goto lab9010;
X    else if (punct == 3)
X	goto lab9019;
X    else if (punct == 5)
X	goto lab9020;
X    else if (punct == 6)
X	goto lab9140;
X    else;
X    /* it's a real word, so find out what it is */
X
X    find(VOCMAX);
X
X    /* discard buzzword  */
X
X    if (indx > 0 && indx <= BUZMAX)
X	goto lab10;
X    if (indx == 0)
X	goto lab9040;
X
X    if ((indx >= NORTH && indx <= NORTHW) || indx == UP
X	|| indx == DOWN) {
X	/* yes,it's a special word  */
X
X	lptr0 = lptr;
X	wscan();
X	/* check if it's all that's on the line  */
X
X	if (punct != 1)
X	    goto lab9030;
X	/* expand a direction word into full form */
X
X	wrdtyp[1] = 4;
X	wrdnum[1] = indx;
X	wrdnum[0] = GO;
X	wrdtyp[0] = 2;
X	wrdtyp[2] = -1;
X	goto lab9999;
X    }
X    if (index[0] != 0) {
X	if (adverb != 0)
X	    goto lab9070;
X	/* adverbs are removed from the wrdtyp list and handled separately */
X
X	adverb = index[0];
X	if (adverb != WHERE && adverb != WHAT)
X	    goto lab10;
X	if (actor == 1 || askx != ASK)
X	    goto lab9130;
X	goto lab10;
X    }
X    if (index[1] == 0)
X	goto lab9050;
X    wrdtyp[wptr] = 2;
X    wrdnum[wptr] = index[1];
X    /*
X     * we've found the verb check for legal question  
X     */
X
X    if ((adverb == WHAT || adverb == WHERE) - (wrdnum[0] == IS))
X	goto lab9130;
X    if (wrdnum[0] == YELL) {
X	/* the player is told to use "ask" or "tell" */
X
Xlab131:
X	wscan();
X	if (punct != 1)
X	    goto lab131;
X	wrdtyp[0] = 2;
X	wrdnum[0] = YELL;
X	result = 1;
X	return (result);
X    }
X    if (wrdnum[0] < SHIT)
X	goto lab200;
X    /*
X     * special handling for words which take no objects or modifiers they
X     * should be alone on a line. they are verbs >= shit  
X     */
X
X    lptr0 = lptr;
X    wscan();
X    {
X	if (punct == 1)
X	    goto lab9998;
X	else if (punct == 5)
X	    goto lab9120;
X	else
X	    goto lab9150;
X    }
X    /* inner loop for all words after verb  */
X
Xlab200:
X    wptr += 1;
X    if (wptr > 27)
X	goto lab9180;
X
Xlab201:
X    lptr0 = lptr;
X    wscan();
X    if (punct != 0)
X	goto lab210;
X    find(BUZMAX);
X    /* special code for "noun1 of noun2" construct  */
X
X    if (indx == 4 && wrdtyp[wptr - 1] == 4)
X	offlg = 1;
X    if (indx != 0)
X	goto lab201;
X    goto lab215;
Xlab210:
X    if (punct == 4)
X	goto lab9000;
X    if (punct == 5)
X	goto lab9020;
X    if (punct == 6)
X	goto lab9140;
X    if (punct != 2)
X	goto lab215;
X    if (wrdtyp[wptr - 1] != 4)
X	goto lab9010;
X    wrdtyp[wptr] = -2;
X    goto lab200;
X
Xlab215:
X    if (wrdtyp[wptr - 1] != 2 || (wrdnum[wptr - 1] != ASK
X				  && wrdnum[wptr - 1] != TELL))
X	goto lab220;
X    if (punct == 3)
X	goto lab9019;
X    if (punct != 0)
X	goto lab9010;
X    if (actor != 1)
X	goto lab9100;
X    /*
X     * this code is to set up addressing a second "person" the phrases "ask
X     * frog" or "tell frog" etc are discarded and the variable "actor" tells
X     * us who is addressed  
X     */
X
X    askx = wrdnum[wptr - 1];
X    find(VOCMAX);
X    if ((index[3] != 0) &&
X	(index[3] < ROBOT || index[3] > FERRET))
X	goto lab9090;
X    if (index[3] == 0)
X	goto lab9160;
X    actor = index[3];
X    lptr0 = lptr;
X    chgact = 1;
X    wscan();
X    if (punct != 2)
X	goto lab9110;
X    goto lab5;
X    /* code for numbers inputted in a statement */
X
Xlab220:
X    if (punct != 3)
X	goto lab240;
X    wrdtyp[wptr] = 4;
X    wrdnum[wptr] = three[0] + 10000;
X    goto lab200;
X    /* all regular words go here */
X
Xlab240:
X
X    if (punct != 1)
X	goto lab250;
X    wrdtyp[wptr] = -1;
X    goto lab9999;
Xlab250:
X    find(VOCMAX);
X    if (indx == 0)
X	goto lab9040;
X    /* special code for "of" handler */
X
X    if (offlg) {
X	offlg = 0;
X	if (index[3] != 0 && wrdtyp[wptr - 2] != 3) {
X	    /* exchange two nouns and tell parser the first is an adjective */
X
X	    wrdtyp[wptr] = wrdtyp[wptr - 1];
X	    wrdnum[wptr] = wrdnum[wptr - 1];
X	    wrdtyp[wptr - 1] = 3;
X	    wrdnum[wptr - 1] = index[3];
X	    if (wrdnum[wptr] == PHOTOG && wrdnum[wptr - 1] == FERRET) {
X		wrdnum[wptr - 1] = FAMILY;
X            }
X            goto lab200;
X        }
X	else
X            goto lab9200;
X    }
X    if (indx != AND)
X	goto lab270;
X    if (wrdtyp[wptr - 1] == -2)
X	goto lab201;
X    if (wrdtyp[wptr - 1] != 4)
X	goto lab9120;
X    wrdtyp[wptr] = -2;
X    goto lab200;
Xlab270:
X    if (index[1] != 0 && index[0] == 0 && index[2] == 0
X	&& index[3] == 0 && index[4] == 0)
X	goto lab9080;
X    if (index[0] == 0)
X	goto lab280;
X    if (adverb != 0)
X	goto lab9070;
X    adverb = indx;
X    if (adverb == WHERE || adverb == WHAT)
X	goto lab9130;
X    goto lab201;
X    /* at this point the word must be an adjectine, noun or preposition */
X
Xlab280:
X    if (wrdtyp[wptr - 1] == 3 && index[2] != 0)
X	goto lab9170;
X    if (index[2] != 0) {
X	wrdtyp[wptr] = 3;
X	wrdnum[wptr] = index[2];
X    } else if (index[3] != 0) {
X	wrdtyp[wptr] = 4;
X	wrdnum[wptr] = index[3];
X    } else {
X	wrdtyp[wptr] = 5;
X	wrdnum[wptr] = index[4];
X    }
X    if ((wrdtyp[wptr] == 4 && wrdtyp[wptr - 1] == 3) &&
X	wrdnum[wptr] < SAPPHI)
X	goto lab9190;
X    goto lab200;
X
X
X    /***********       error processing  */
X
Xlab9000:
X    lxx = lptr;
X    errno = 1;
X    goto lab9900;
Xlab9010:
X    lxx = lptr;
X    errno = 2;
X    goto lab9900;
Xlab9019:
X    lptr -= 1;
Xlab9020:
X    lptr += 1;
X    lxx = lptr;
X    errno = 3;
X    goto lab9900;
Xlab9030:
X    lxx = lptr;
X    errno = 4;
X    goto lab9900;
Xlab9040:
X    lxx = lptr;
X    errno = 5;
X    goto lab9900;
Xlab9050:
X    lxx = lptr;
X    errno = 6;
X    goto lab9900;
Xlab9070:
X    lxx = lptr;
X    errno = 8;
X    goto lab9900;
Xlab9080:
X    lxx = lptr;
X    errno = 9;
X    goto lab9900;
Xlab9090:
X    lxx = 0;
X    errno = 10;
X    goto lab9900;
Xlab9100:
X    lxx = 0;
X    errno = 11;
X    goto lab9900;
Xlab9110:
X    lxx = lptr0 + 1;
X    errno = 12;
X    goto lab9900;
Xlab9120:
X    lxx = lptr;
X    errno = 13;
X    goto lab9900;
Xlab9130:
X    lxx = 0;
X    errno = 14;
X    goto lab9900;
Xlab9140:
X    lxx = lptr;
X    errno = 15;
X    goto lab9900;
Xlab9150:
X    lxx = lptr0;
X    errno = 16;
X    goto lab9900;
Xlab9160:
X    lxx = 0;
X    errno = 17;
X    goto lab9900;
Xlab9170:
X    lxx = lptr;
X    errno = 18;
X    goto lab9900;
Xlab9180:
X    lxx = 0;
X    errno = 25;
X    goto lab9900;
Xlab9190:
X    lxx = lptr;
X    errno = 107;
X    goto lab9900;
Xlab9200:
X    lxx = lptr;
X    errno = 112;
Xlab9900:
X    carerr(lxx, errno);
X    return (result);
Xlab9998:
X    wrdtyp[1] = -1;
Xlab9999:
X    if ((askx == TELL && (adverb == WHERE || adverb == WHAT))
X	|| (askx == ASK && (adverb != WHERE && adverb != WHAT)))
X	goto lab9130;
X    if (adverb == WHERE || adverb == WHAT)
X	dotflg = 1;
X    result = 1;
X    return (result);
X
X}
X
Xwscan()
X/*
X * this routine reads the input ascii code and scans for punctuation or
X * numbers and then converts the first 9 letters of a word to three integer*2
X * words of radix 32 form  
X */
X
X{
X    char            m;
X    static int      pow32[] = {1, 32, 1024, 32768};
X    int             plcpnt, wpnt, kchar;
X
X    if (dotflg) {
X	actor = 1;
X	dotflg = 0;
X    }
X    plcpnt = 1;
X    punct = 0;
X    wpnt = 1;
X    three[0] = 0;
X    three[1] = 0;
X    three[2] = 0;
X    while (inbuf[lptr] == ' ')
X	lptr++;
X    /*
X     * punct =1 is period, 2 is comma, 3 is number,4 is illegal character and
X     * 5 means a number directly follows a word 6 means letter follows a
X     * number 
X     */
X
X    if (inbuf[lptr] == '.' || inbuf[lptr] == '?') {
X	dotflg = 1;
X	punct = 1;
X	lptr += 1;
X	return (0);
X    }
X    if (inbuf[lptr] == ',') {
X	punct = 2;
X	lptr += 1;
X	return (0);
X    }
X    while (inbuf[lptr] >= '0' && inbuf[lptr] <= '9') {
X	/* number handling */
X
X	punct = 3;
X	if (three[0] < 3200)
X	    three[0] = three[0] * 10 + inbuf[lptr] - '0';
X	lptr += 1;
X    }
X    if (punct == 3 && (inbuf[lptr] != '.' &&
X		       inbuf[lptr] != ',' && inbuf[lptr] != '?' &&
X		       inbuf[lptr] != ' '))
X	punct = 6;
X    if (punct == 3 || punct == 6)
X	return (0);
X    do {
X	if (!((inbuf[lptr] >= 'a' && inbuf[lptr] <= 'z') ||
X	      (inbuf[lptr] >= 'A' && inbuf[lptr] <= 'Z'))) {
X	    lptr += 1;
X	    punct = 4;
X	    return (0);
X	    /* the actual letter packing is done here  */
X
X	}
X	kchar = inbuf[lptr];
X	if (kchar >= 'a' && kchar <= 'z')
X	    kchar -= ' ';
X	if (wpnt < 4)
X	    three[wpnt - 1] = three[wpnt - 1] +
X                                (kchar - '@') * pow32[3 - plcpnt];
X	plcpnt += 1;
X	if (plcpnt >= 4) {
X	    wpnt += 1;
X	    plcpnt = 1;
X	}
X	lptr += 1;
X	m = inbuf[lptr];
X	if (m == ' ' || m == ',' || m == '.' || m == '?') {
X	    if (three[0] != 20741 || three[1] != 14336 ||
X		three[2] != 0)
X		return (0);
X	    punct = 1;
X	    return (0);
X	}
X    }
X    while (m < '0' || m > '9');
X    punct = 5;
X    return (0);
X}
X
X
Xfind(m)
X    int             m;
X{
X    /*
X     * this routine searches a vocabulary to find a word. index, on output,
X     * gives the position of the word in the list. synonyms do not increment
X     * the counter, so index*3-2 is **not** the actual pointer to the word in
X     * the list 
X     */
X
X    int             i, t, k, type;
X
X    for (i = 0; i < 5; i++)
X	index[i] = 0;
X    t = 0;
X    indx = 0;
X
X    for (i = 1; i <= m * 3 - 2; i += 3) {
X
X	if (vocab[i] > 0)
X	    indx += 1;
X	if (abs(vocab[i]) != three[0])
X	    continue;
X	if (vocab[i + 1] != three[1])
X	    continue;
X	if (vocab[i + 2] == three[2]) {
X	    t = indx;
X	    type = 1;
X	    for (k = 1; k <= 4; k++)
X		if (indx >= typlst[k - 1])
X		    type = type + 1;
X	    index[type - 1] = indx;
X	}
X    }
X    indx = t;
X}
X
Xlbit(arg, pow)
X    int             arg, pow;
X{
X    return ((arg & (1 << pow)) != 0);
X}
X
Xparse()
X{
X    /*
X     * subroutine parse this mess deciphers the various direct and indirect
X     * (i.e. second, usually, but in 'give frog cup' the frog is the i.o.)
X     * objects. it associates them with their respective adjectives (dobjs(i)
X     * and doadjs(i) correspond) butflg is set if the "all but" construct is
X     * encountered allflg is set if the "all" construct is enconntered the
X     * d.o. and i.o prepositions are put in prepdo and prepio 
X     */
X
X    int             result, wptr, thevrb, vrbind, vdo, vio, vobj, i;
X    int             frstaj, frstnn, errno, tprp;
X    result = 0;
X    thevrb = wrdnum[0];
X    vrbind = thevrb - VRBMIN + 1;
X
X    vdo = 0;
X    vio = 0;
X    vobj = 0;
X    if (thevrb < SHIT) {
X	vdo = vrbpdo[vrbind];
X	vio = vrbpio[vrbind];
X	vobj = vrbobj[vrbind];
X    }
X    butflg = 0;
X    allflg = 0;
X    numdo = 0;
X    prepdo = 0;
X    prepio = 0;
X    iobj = 0;
X    ioadj = 0;
X    for (i = 0; i < 12; i++) {
X	dobjs[i] = 0;
X	doadjs[i] = 0;
X    }
X    /* this block is a test for "sit down" or "get up" or "look up" etc */
X
X    if (((lbit(vobj, 1) && wrdnum[1] == DOWN) ||
X	 (lbit(vobj, 2) && wrdnum[1] == UP)) && wrdtyp[2] == -1) {
X	prepdo = wrdnum[1];
X	result = 1;
X	goto finalout;
X    }
X    /* yell allows anything after it */
X
X    if (thevrb == YELL)
X	goto testout;
X    wptr = 1;
X    frstaj = 0;
X    frstnn = 0;
X    /* a preposition immediately follows verb */
X
X    if (wrdtyp[wptr] == 5) {
X	prepdo = wrdnum[wptr];
X	if (prepdo == BUT) {
X	    errno = 21;
X	    goto errorout;
X	}
X	if (!lbit(vdo, (prepdo - PRPMIN))) {
X	    errno = 21;
X	    goto errorout;
X	}
X	wptr += 1;
X    }
X    /*
X     * adjective follows verb *** special case of "terran" and "cygnan" as
X     * nouns 
X     */
X
X    if (wrdtyp[wptr] == 3) {
X	if ((wrdnum[wptr] == TERRAN || wrdnum[wptr] == CYGNAN)
X	    && wrdnum[0] == TRANSL)
X	    wrdtyp[wptr] = 4;
X	else {
X	    frstaj = wrdnum[wptr];
X	    doadjs[0] = frstaj;
X	    wptr += 1;
X	}
X    }
X    /* this takes care of the case of a verb alone on a line */
X
X    if (wrdtyp[wptr] != 4) {
X	if (wrdtyp[wptr] != -1) {
X	    errno = 28;
X	    goto errorout;
X	} else {
X	    {
X		if (thevrb >= SHIT) {
X		    result = 1;
X		    goto finalout;
X		}
X		if (!lbit(vobj, 7)) {
X		    result = 1;
X		    goto finalout;
X		}
X	    }
X	    errno = 27;
X	    goto errorout;
X	}
X    }
X    frstnn = wrdnum[wptr];
X    /* look at first set of objects (not always d.o.) */
X
X    dobjs[0] = frstnn;
X    numdo += 1;
X    if (numdo == 9) {
X	errno = 25;
X	goto errorout;
X    }
X    wptr += 1;
X
X
X    /* the following takes care of multiple objects */
X
X    if (frstnn == ALL) {
X	if (!lbit(vobj, 5)) {
X	    errno = 22;
X	    goto errorout;
X	}
X	if (frstaj != 0) {
X	    errno = 26;
X	    goto errorout;
X	}
X	allflg = 1;
X	if (wrdnum[wptr] == BUT) {
X	    butflg = 1;
X	    /* check for adjective before noun */
X
X	    if (!(wrdtyp[wptr + 1] == 4 || (wrdtyp[wptr + 1] == 3
X					    && wrdtyp[wptr + 2] == 4))) {
X		errno = 23;
X		goto errorout;
X	    }
X	    wptr += 1;
X	}
X    }
X    if (butflg || (wrdtyp[wptr] == -2)) {
X	if (!lbit(vobj, 5)) {
X	    errno = 22;
X	    goto errorout;
X	}
X	mulobj(&wptr);
X	if (numdo > 9) {
X	    errno = 25;
X	    goto errorout;
X	}
X    }
X    /********** end multiple obj processor  */
X
X
X    if (wrdtyp[wptr] == -1)
X	goto testout;
X
X    /* if the verb is "is" we may have a final adjective  */
X
X    if (thevrb == IS && wrdtyp[wptr] == 3) {
X	doadjs[1] = wrdnum[wptr];
X	if (wrdtyp[wptr + 1] == -1)
X	    goto testout;
X	errno = 20;
X	goto errorout;
X    }
X    /*
X     * if the next word is a noun or adjective, and verb is not "is" we have
X     * a non-prep indirect object such as the frog in "give frog water" 
X     */
X
X    if (wrdtyp[wptr] == 4 || (wrdtyp[wptr] == 3 && wrdtyp[wptr + 1]
X			      == 4)) {
X	if (numdo > 1 || prepdo != 0) {
X	    errno = 22;
X	    goto errorout;
X	}
X	if (!lbit(vobj, 3)) {
X	    errno = 24;
X	    goto errorout;
X	}
X	prepio = TO;
X	ioadj = frstaj;
X	iobj = frstnn;
X	doadjs[0] = 0;
X	if (wrdtyp[wptr] == 3) {
X	    doadjs[0] = wrdnum[wptr];
X	    wptr += 1;
X	}
X	dobjs[0] = wrdnum[wptr];
X	numdo = 1;
X	wptr += 1;
X	/****** repeat the multiple obj processor */
X
X	if (dobjs[0] == ALL) {
X	    if (!lbit(vobj, 5)) {
X		errno = 22;
X		goto errorout;
X	    }
X	    if (doadjs[0] != 0) {
X		errno = 26;
X		goto errorout;
X	    }
X	    allflg = 1;
X	    if (wrdtyp[wptr] == 5 && wrdnum[wptr] == BUT) {
X		butflg = 1;
X		if (!(wrdtyp[wptr + 1] == 4 || (wrdtyp[wptr + 1] == 3
X						&& wrdtyp[wptr + 2] == 4))) {
X		    errno = 23;
X		    goto errorout;
X		}
X	    }
X	}
X	if (butflg || wrdtyp[wptr] == -2) {
X	    if (!lbit(vobj, 5)) {
X		errno = 22;
X		goto errorout;
X	    }
X	    mulobj(&wptr);
X	    if (numdo > 9) {
X		errno = 25;
X		goto errorout;
X	    }
X	}
X	/***** end multiple object processor */
X
X	if (wrdtyp[wptr] != -1) {
X	    errno = 20;
X	    goto errorout;
X	}
X	goto testout;
X    }
X    /* the only thing left that is legal is a perpositional construct */
X
X    if (wrdtyp[wptr] != 5 || wrdnum[wptr] == BUT || (
X			wrdtyp[wptr + 1] == 5 && wrdnum[wptr + 1] == BUT)) {
X	errno = 20;
X	goto errorout;
X    }
X    tprp = wrdnum[wptr];
X    wptr += 1;
X    /*
X     * check for end of line or two preps in a row (e.g. fill the bottle up
X     * with water) 
X     */
X
X    if (wrdtyp[wptr] == -1 || wrdtyp[wptr] == 5) {
X	if (prepdo != 0 || (!lbit(vdo, (tprp - PRPMIN)))
X	    || (!lbit(vobj, 0))) {
X	    errno = 20;
X	    goto errorout;
X	}
X	prepdo = tprp;
X	if (wrdtyp[wptr] == -1)
X	    goto testout;
X	wptr += 1;
X    }
X    if (!lbit(vio, (wrdnum[wptr - 1] - PRPMIN))) {
X	errno = 20;
X	goto errorout;
X    }
X    prepio = wrdnum[wptr - 1];
X    if (wrdtyp[wptr] == 3) {
X	ioadj = wrdnum[wptr];
X	wptr += 1;
X    }
X    if (wrdtyp[wptr] != 4) {
X	errno = 20;
X	goto errorout;
X    }
X    iobj = wrdnum[wptr];
X    wptr += 1;
X    if (wrdtyp[wptr] != -1) {
X	errno = 20;
X	goto errorout;
X    }
Xtestout:
X    if ((dobjs[0] == 0 && lbit(vobj, 7)) || (iobj == 0 &&
X					     lbit(vobj, 6))) {
X	errno = 20;
X	goto errorout;
X    }
X    if (!lbit(vobj, 4) && dobjs[0] != 0 && prepdo == 0) {
X	errno = 19;
X	goto errorout;
X    }
X    result = 1;
Xfinalout:
X
X    if (wrdnum[0] == AGAIN) {
X	for (i = 0; i < 12; i++) {
X	    doadjs[i] = zadjs[i];
X	    dobjs[i] = zobjs[i];
X	}
X	ioadj = ziadj;
X	iobj = ziobj;
X	prepdo = zpdo;
X	prepio = zpio;
X	actor = zactor;
X	adverb = zadvrb;
X	wrdnum[0] = zverb;
X	numdo = znumb;
X	allflg = zall;
X	butflg = zbut;
X    } else {
X	for (i = 0; i < 12; i++) {
X	    zadjs[i] = doadjs[i];
X	    zobjs[i] = dobjs[i];
X	}
X	ziadj = ioadj;
X	ziobj = iobj;
X	zpdo = prepdo;
X	zpio = prepio;
X	zactor = actor;
X	zadvrb = adverb;
X	zverb = wrdnum[0];
X	zall = allflg;
X	zbut = butflg;
X    }
X    return (result);
Xerrorout:
X    carerr(0, errno);
X    return (result);
X}
X
Xmulobj(wptr)
X    int            *wptr;
X{
X    /****   multiple opject subroutine from "parse" */
X
X    while (1) {
X	if (wrdtyp[*wptr] == 3) {
X	    doadjs[numdo] = wrdnum[*wptr];
X	    *wptr += 1;
X	}
X	if (wrdtyp[*wptr] == 4) {
X	    numdo += 1;
X	    if (numdo > 10)
X		return (1);
X	    dobjs[numdo - 1] = wrdnum[*wptr];
X	    *wptr += 1;
X	    if (wrdtyp[*wptr] != -2)
X		return (1);
X	}
X	*wptr += 1;
X    }
X}
END_OF_parser.c
if test 17928 -ne `wc -c <parser.c`; then
    echo shar: \"parser.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f verbs2.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"verbs2.c\"
else
echo shar: Extracting \"verbs2.c\" \(32951 characters\)
sed "s/^X//" >verbs2.c <<'END_OF_verbs2.c'
X#include "parame.inc"
X#include "variab.h"
X#include "arrays.h"
X
X/* World C Version 1.00 copyright 1987 J.D.McDonald 
X   Use as you like for non-commercial purposes, but please
X   leave this note, and document any changes you make as yours */
X
Xvpunch()
X{
X    int             result, spk;
X    result = 0;
X    if (dobjs[0] == SEED || dobjs[0] == SPHERE) {
X	result = 1;
X	return (result);
X    }
X    spk = 286;
X    if (dobjs[0] == LOUVER) {
X	if (loc == 98 || loc == 142) {
X	    spk = 282;
X	    obimpr[ZLOUVE] = 9;
X	} else
X            spk = 66;
X    } else if (dobjs[0] == GUARD) {
X	if (loc == guardl || loc == 171 || (chaset != 0 && chaset <= 9))
X	    spk = 562;
X	else
X	    spk = 561;
X    } else if (dobjs[0] == ROBOT || dobjs[0] == FERRET)
X	spk = 285;
X    else if (dobjs[0] == MARTIA && loc >= 27 && loc <= 51)
X	spk = 307;
X    else if (dobjs[0] == VINE && loc == 74 && (obimpr[ZVINE] & 56) == 8) {
X	spk = 306;
X	if (pct(33))
X	    spk = 302;
X	else if (pct(50))
X	    spk = 305;
X	else;
X    }
X    speak(spk);
X    return (result);
X}
X
Xvput()
X{
X    int             result, plce, zplce, spk, obj, cplce, xiobj, ioplce, ambig;
X    int             csize, cinsid, i, ncarrd, nweigh, kcarrd, kweigh;
X    int             z, size, weigh, plural;
X
X    result = 0;
X    if ((prepdo == ON && prepio == 0) || (prepio == ON && iobj == ME)) {
X	prepio = 0;
X	prepdo = 0;
X	result = 1;
X	/* this results in calling vwear  */
X
X	return (result);
X    }
X    if ((prepio == IN && iobj == BOWL) || prepdo == DOWN) {
X	/* call drop to put things in bowl  */
X
X	if (prepdo == DOWN)
X	    prepdo = 0;
X	result = 2;
X	return (result);
X    }
X    if (dobjs[0] == WATER && dobjs[1] == 0 && iobj == FUNNEL) {
X	result = 3;
X	return (result);
X    }
X    /* code for put latex on pole   */
X
X    if (dobjs[0] == LATEX && (doadjs[0] == 0 || doadjs[0] == GOOEY)
X	&& loc == 76 && prepio == ON && iobj == POLE &&
X	(obimpr[ZLATEX] & 56) == 8) {
X	if (allflg || dobjs[1] != 0) {
X	    speak(48);
X	    return (result);
X	}
X	itsher(ZLATEX, &plce);
X	if (plce == 0)
X	    speak(66);
X	else {
X	    obloc[ZLATEX] = 76;
X	    obimpr[ZLATEX] = 25 + 320;
X	    speak(75);
X	}
X	return (result);
X    }
X    /* putting things in machines   */
X
X    if ((iobj == MACHIN || iobj == OPENIN || iobj == SLOT) &&
X	loc != 146) {
X	if (loc != 143 && loc != 156 && loc != 158 &&
X	    loc != 160 && loc != 162)
X	    speak(90);
X	else if (loc == 143) {
X	    if (prepio != IN || allflg || dobjs[1] != 0
X		|| dobjs[0] != CASSET || (doadjs[0] != 0 &&
X					  doadjs[0] != HUGE))
X		speak(48);
X	    else {
X		itsher(ZCASSE, &zplce);
X		if (zplce <= 0)
X		    speak(66);
X		else {
X		    obloc[ZCASSE] = 0;
X		    machst |= 16;
X		    if (obimpr[RLIGHT] == 73 && (machst & 1) == 0 &&
X			(machst & 2) != 0) {
X			speak(399);
X			obimpr[RLIGHT] = 145;
X			obimpr[GLIGHT] = 145;
X		    }
X		}
X	    }
X	} else {
X	    spk = 0;
X	    if (prepio != IN || allflg || dobjs[1] != 0
X		|| dobjs[0] != COIN)
X		spk = 48;
X	    else {
X		obj = getobj(COIN, doadjs[0]);
X		if (obj < 0) {
X		    speak(70);
X		    return (result);
X		}
X		itsher(obj, &cplce);
X		if (cplce == 0)
X		    spk = 66;
X		else if (loc == 156) {
X		    if (obj != PCOIN)
X			spk = 93;
X		    else {
X			spk = 512;
X			obloc[PCOIN] = 0;
X			obloc[BBALL] = 156;
X		    }
X		} else if (loc == 158) {
X		    if (obj != NCOIN)
X			spk = 93;
X		    else {
X			spk = 513;
X			obloc[NCOIN] = 0;
X			obloc[NNEWS] = 158;
X		    }
X		} else if (loc == 162) {
X		    if (obj != CCOIN)
X			spk = 93;
X		    else {
X			spk = 514;
X			obloc[CCOIN] = 0;
X			obloc[MMAP] = 162;
X		    }
X		} else if (loc == 160)
X		    gamble(obj);
X		else;
X		if (spk != 0)
X		    speak(spk);
X	    }
X	}
X	return (result);
X    }
X    spk = 0;
X    if ((prepio != IN || (prepio == IN && prepdo != 0)) && !
X	(prepio == ON &&
X	 (iobj == ENLARG || iobj == TRAY) && loc == 143))
X	spk = 273;
X    else {
X	/* check on status of indirect object  */
X
X	xiobj = getobj(iobj, ioadj);
X	if (xiobj <= 0)
X	    spk = 90;
X	else if (obpprp[xiobj] / 2048 == 0 && xiobj != ZENLAR)
X	    spk = 77;
X	else if (iobj == BUCKET && (obimpr[ZBUCKE] == 1033 || (
X		   obloc[ZLATEX] == (2000 + ZBUCKE) && (obimpr[ZLATEX] & 56)
X							       == 8)))
X	    spk = 276;
X	else {
X	    itsher(xiobj, &ioplce);
X	    if (ioplce != 1 && ioplce != 2 && ioplce != 4)
X		spk = 91;
X	}
X    }
X    if (spk != 0) {
X	speak(spk);
X	return (result);
X    }
X    /* convert dobjs(i) (noun) to list of objects (pointers) */
X
X    ambig = !cnvobj();
X    if (allflg)
X	getall();
X    csize = obpprp[xiobj] / 2048;
X    if (csize == 15)
X	csize = 70;
X    cinsid = 0;
X    for (i = 1; i <= MOVMAX; i++)
X	if (obloc[i] == 2000 + xiobj)
X	    cinsid += (obw3[i] % 256);
X    burden(&ncarrd, &nweigh, &kcarrd, &kweigh);
X    if (obloc[ZKNAPS] == 1000 || obloc[ZKNAPS] == 3000)
X	nweigh += kweigh;
X    for (i = 0; i <= 29; i++) {
X	z = dobjs[i];
X	if (z == 0)
X	    return (result);
X	if (obloc[z] == z + 2000)
X	    continue;
X	itsher(z, &plce);
X	size = (obw3[z] % 256);
X	weigh = obw3[z] / 256;
X	plural = (obpprp[z] & 256) == 256;
X	if (allflg && (z > MOVMAX || obloc[z] == (2000 + xiobj)))
X	    continue;
X	if (allflg || dobjs[1] != 0)
X	    speak(odistb[z]);
X	if (z > MOVMAX) {
X	    spk = odistb[z + 1] - 1;
X	    if (plce != 4)
X		spk = 113;
X	} else if (obloc[z] == 2000 + xiobj) {
X	    spk = 92;
X	    if (plural)
X		spk = 191;
X	} else if (plce == 2) {
X	    spk = 88;
X	    if (plural)
X		spk = 194;
X	} else if (plce == 0) {
X	    spk = 66;
X	    if (plural)
X		spk = 185;
X	} else if ((plce == 4 || plce == 5) && z == ZWIRE && wirelc[0] != 0)
X	    spk = 89;
X	else if ((plce == 4 || plce == 5) && z == ZCART &&
X		 obloc[ZCART] == 2000 + RSLOT)
X	    spk = 311;
X	else if (size + cinsid > csize) {
X	    spk = 93;
X	    if (plural)
X		spk = 192;
X	} else if ((nweigh + weigh > 125) && (xiobj == ZKNAPS &&
X					      obloc[z] != 1000 &&
X			(obloc[ZKNAPS] == 1000 || obloc[ZKNAPS] == 3000))) {
X	    spk = 79;
X	    if (plural)
X		spk = 188;
X	} else if (z == CFISH && obloc[z] ==
X		   (2000 + PLBAG) && (obimpr[PLBAG] / 512 == 5))
X	    spk = 76;
X	else if (z == ZLATEX && (obimpr[ZLATEX] & 56) == 8)
X	    spk = 277;
X	else if (xiobj == RSLOT && !(z == ZCART || z == CCART))
X	    spk = 351;
X	else if (iobj == FUNNEL) {
X	    spk = 396;
X	    if (xiobj == LFUNNE && z == ZMETOL)
X		machst |= 8;
X	    if (xiobj == RFUNNE && z == ZHYPO)
X		machst |= 4;
X	    obloc[z] = 0;
X	} else if (loc == 99 && z == ZSTATU
X		   && obimpr[ZSEED] != 2 && obimpr[ZSEED] != 1)
X	    spk = 405;
X	else if (loc == 86 && obloc[ZSEED] == 86 && !
X		 (obloc[RPANT] == 3000 && obloc[RSHIRT] == 3000)) {
X	    if (obloc[LPANT] == 3000 || obloc[GSHIRT] == 3000) {
X		if (daytim == 1)
X		    speak(424);
X		else
X		    speak(425);
X	    } else {
X		if (daytim == 1)
X		    speak(426);
X		else
X		    speak(427);
X	    }
X	    if (obloc[LPANT] == 3000)
X		obloc[LPANT] = 0;
X	    if (obloc[GSHIRT] == 3000)
X		obloc[GSHIRT] = 0;
X	    vdead();
X	    return (result);
X	} else {
X	    if (obloc[z] == 2000 + RSLOT)
X		obimpr[ZSCREE] = 9;
X	    obloc[z] = 2000 + xiobj;
X	    nweigh += weigh;
X	    cinsid += size;
X	    /* special increment of descriptor pointer if obimpr has 4096 set */
X
X	    if (obimpr[z] / 4096 == 1)
X		obimpr[z] = (obimpr[z] & ~4096) + 8;
X	    /* ~4096=167777 octal  */
X
X	    spk = 75;
X	    if (z == ZLATEX && (obimpr[ZLATEX] & 56) == 24)
X		obimpr[ZLATEX] = 337;
X	    if ((z == CCART || z == ZCART) && xiobj == RSLOT) {
X		obimpr[RSLOT] += 8192;
X		obimpr[ZSCREE] = 145;
X	    } else if (iobj == RECESS && z == GDISC)
X		spk = 412;
X	    else if (loc == 86 && z == ZSEED) {
X		if (daytim == 1)
X		    spk = 428;
X		else
X		    spk = 429;
X	    } else if (xiobj == OCLIP && z == YROD)
X		spk = 526;
X	    else if (xiobj == VCLIP && z == LMINER)
X		spk = 527;
X	    else if (xiobj == YCLIP && z == YROD)
X		spk = 528;
X	    else if (xiobj == BCLIP && z == BSAPPH)
X		spk = 529;
X	    else;
X	    if ((xiobj == YCLIP || xiobj == BCLIP) &&
X	     obloc[YROD] == 2000 + YCLIP && obloc[BSAPPH] == 2000 + BCLIP) {
X		speak(spk);
X		spk = 531;
X	    }
X	}
X	xindnt += 2;
X	speak(spk);
X	xindnt -= 2;
X    }
X    return (result);
X}
X
Xgamble(c)
X    int             c;
X{
X    int             rann, spk, x;
X    rann = qrand();
X    if (jackpo == 1) {
X	obloc[c] = 0;
X	spk = 515;
X    } else if (c != PCOIN) {
X	if (rann > 3750) {
X	    spk = 516;
X	    x = PCOIN;
X	} else if (rann > 3317) {
X	    x = SCOIN;
X	    spk = 517;
X	} else if (rann > 2212) {
X	    x = CCOIN;
X	    spk = 518;
X	} else if (rann > 1105) {
X	    x = BCOIN;
X	    spk = 519;
X	} else {
X	    x = NCOIN;
X	    spk = 520;
X	}
X    } else {
X	if (rann > 3276) {
X	    spk = 521;
X	    jackpo = 1;
X	} else if (rann > 2048) {
X	    x = PCOIN;
X	    spk = 516;
X	} else {
X	    x = SCOIN;
X	    spk = 517;
X	}
X    }
X    if (spk == 521) {
X	obloc[PCOIN] = 160;
X	obloc[SCOIN] = 160;
X	obloc[CCOIN] = 160;
X	obloc[BCOIN] = 160;
X	obloc[NCOIN] = 160;
X	bonus += 5;
X    } else {
X	obloc[c] = 0;
X	obloc[x] = 160;
X    }
X    speak(spk);
X}
X
Xvscrat()
X{
X    int             spk, plce;
X    if ((iobj != DIAMON && iobj != SAPPHI && iobj != KNIFE) || prepio != WITH)
X	spk = 196;
X    /* sapphire has no edge */
X
X    else if (iobj == SAPPHI) {
X	itsher(BSAPPH, &plce);
X	if (plce == 0)
X	    spk = 197;
X	else
X	    spk = 198;
X    }
X    /*
X     * diamond cuts glass window but not vine names of window and glass plate
X     * are all mixed up  
X     */
X
X    else if (iobj == DIAMON) {
X	itsher(ZDIAMO, &plce);
X	if (plce == 0)
X	    spk = 199;
X	else if (dobjs[0] == WINDOW || dobjs[0] == GLASS) {
X	    if (loc != 30 && loc != 42)
X		spk = 200;
X	    else if (((obimpr[ZWINDO] / 8) % 8) != 0)
X		spk = 201;
X	    else {
X		spk = 202;
X		obimpr[ZWINDO] = 145;
X		obloc[ZDIAMO] = 1000;
X		if (loc == 30)
X		    obloc[PGLASS] = 42;
X		else
X		    obloc[PGLASS] = 30;
X	    }
X	} else if (dobjs[0] == VINE && loc == 74 && (obimpr[ZVINE] & 56) == 8)
X	    spk = 306;
X	else
X	    spk = 203;
X    } else {
X	itsher(ZKNIFE, &plce);
X	if (plce == 0)
X	    spk = 89;
X	else if (dobjs[0] == WINDOW || dobjs[0] == GLASS)
X	    spk = 309;
X	else if (dobjs[0] == VINE && loc == 74 && (obimpr[ZVINE] & 56) == 8)
X	    spk = 305;
X	else
X	    spk = 286;
X    }
X    speak(spk);
X}
X
Xvread()
X{
X    int             m, plce, n;
X    /* if it's light, read whatever is written on  */
X
X    if (daytim == 0) {
X	speak(121);
X	return;
X    }
X    m = getobj(dobjs[0], doadjs[0]);
X    if (prepio == TO || m < 1 || (obpprp[m] & 16) != 16) {
X	speak(71);
X	return;
X    }
X    itsher(m, &plce);
X    n = (obimpr[m] / 64) % 8;
X    if (n == 0 || plce == 0)
X	speak(98);
X    else {
X	if (loc >= 153 && lpill == 1 && (m == MMAP || m ==
X					 NNEWS || m == NNOTE || m == TMACH))
X	    n += 1;
X	speak(odistb[m] + n);
X	if (m == NNOTE && lpill == 1)
X	    nreadx();
X    }
X}
X
X    static   char   string[] = "  Large ship XX XX XX";
X
Xnreadx()
X{
X    int             l, n, m;
X    char            cnum[4];
X    l = dcombi;
X    n = (l & 31);
X    l = l / 32;
X    m = (l & 31);
X    l = l / 32;
X    numcvt(n, cnum);
X    string[19] = cnum[2];
X    string[20] = cnum[3];
X    numcvt(m, cnum);
X    string[16] = cnum[2];
X    string[17] = cnum[3];
X    numcvt(l, cnum);
X    string[13] = cnum[2];
X    string[14] = cnum[3];
X    linout(string, 21);
X}
X
X
X
Xvrobot()
X{
X    int             spk, vspk, dj, empty, i, bplce, gplce, tloc, iplce, ij, plce;
X    spk = 0;
X    vspk = 0;
X    if (dobjs[0] != 0)
X	dj = getrob(dobjs[0], doadjs[0]);
X    if (iobj != 0)
X	ij = getrob(iobj, ioadj);
X    empty = 1;
X    for (i = 1; i <= MOVMAX; i++)
X	if (obloc[i] == 2000 + ZROBOT)
X	    empty = 0;
X    if (dobjs[1] != 0)
X	spk = 343;
X    else if (wrdnum[0] == TAKE || wrdnum[0] == HOLD) {
X	if (dobjs[0] == DISC && dj < 0) {
X	    tloc = loc;
X	    loc = obloc[ZROBOT];
X	    itsher(GDISC, &gplce);
X	    itsher(BDISC, &bplce);
X	    loc = tloc;
X	    if (gplce == 4)
X		gplce = 5;
X	    if (bplce == 4)
X		bplce = 5;
X	    if (loc == obloc[ZROBOT]) {
X		if (gplce == 1)
X		    gplce = 5;
X		if (bplce == 1)
X		    bplce = 5;
X	    }
X	    if (gplce != 5 && bplce != 5)
X		dj = 0;
X	    else if (gplce == 5)
X		dj = GDISC;
X	    else
X		dj = BDISC;
X	}
X	if (prepdo != 0 || prepio != 0 || allflg)
X	    spk = 342;
X	else if (empty == 0)
X	    spk = 343;
X	else if (dj < 0)
X	    spk = 70;
X	else if (dj > MOVMAX || dj == 0)
X	    spk = 344;
X	else {
X	    tloc = loc;
X	    loc = obloc[ZROBOT];
X	    itsher(dj, &plce);
X	    loc = tloc;
X	    if (!(plce == 4 || plce == 5 || (plce == 1
X                                        && obloc[ZROBOT] == loc)))
X		spk = 420;
X	    else if (obw3[dj] / 256 > 1 || (obw3[dj] & 255) > 2)
X		spk = 352;
X	    else {
X		spk = 345;
X		obloc[dj] = 2000 + ZROBOT;
X		if (dj == ZINSEC && obimpr[ZINSEC] == 201)
X		    obimpr[ZINSEC] = 209;
X	    }
X	}
X    } else if (wrdnum[0] == DROP) {
X	if (dj < 0) {
X	    if (dobjs[0] == DISC && obloc[GDISC] == 2000 + ZROBOT)
X		dj = GDISC;
X	    else if (dobjs[0] == DISC && obloc[BDISC] == 2000 + ZROBOT)
X		dj = BDISC;
X	    else;
X	}
X	if (prepdo != 0 || prepio != 0 || allflg)
X	    spk = 342;
X	else if (dj < 0)
X	    spk = 70;
X	else if (dj == 0)
X	    spk = 344;
X	else if (obloc[dj] != 2000 + ZROBOT)
X	    spk = 347;
X	else {
X	    spk = 346;
X	    obloc[dj] = obloc[ZROBOT];
X	}
X    } else if (wrdnum[0] == GIVE) {
X	if (dj < 0) {
X	    if (dobjs[0] == DISC && obloc[GDISC] == 2000 + ZROBOT)
X		dj = GDISC;
X	    else if (dobjs[0] == DISC && obloc[BDISC] == 2000 + ZROBOT)
X		dj = BDISC;
X	    else;
X	}
X	if (obloc[ZROBOT] != loc)
X	    spk = 443;
X	else if (prepdo != 0 || prepio != TO || allflg)
X	    spk = 342;
X	else if (dj < 0)
X	    spk = 70;
X	else if (dj == 0)
X	    spk = 344;
X	else if (obloc[dj] != 2000 + ZROBOT)
X	    spk = 347;
X	else {
X	    spk = 444;
X	    obloc[dj] = 1000;
X	}
X    } else if (wrdnum[0] == WASH || wrdnum[0] == QWATER) {
X	if (dobjs[0] == DISC && obloc[GDISC] == 2000 + ZROBOT)
X	    dj = GDISC;
X	else if (dobjs[0] == DISC && obloc[BDISC] == 2000 + ZROBOT)
X	    dj = BDISC;
X	else;
X	if (dj <= 0 || !((dj <= MOVMAX && (obloc[dj] == 2000 +
X		      ZROBOT || obloc[dj] == obloc[ZROBOT])) || (dj > MOVMAX
X	      && (obw3[dj] == obloc[ZROBOT] || obw4[dj] == obloc[ZROBOT]))))
X	    spk = 344;
X	else {
X	    if (wrdnum[0] == WASH) {
X		if (dj == GDISC && rvtim == 0)
X		    spk = 414;
X		else if (dj == GDISC && rvtim == 1) {
X		    spk = 410;
X		    rvtim = 2;
X		} else
X		    spk = 348;
X	    } else
X		spk = 349;
X	    if (loc == 74 && (obimpr[ZVINE] & 56) == 8 &&
X		dj == ZVINE) {
X		vspk = 1;
X		obimpr[ZVINE] = obimpr[ZVINE] + 8;
X	    }
X	}
X    } else if (wrdnum[0] == TRANSL) {
X	if (dobjs[0] >= DEET && dobjs[0] <= STORAG)
X	    spk = 354 - DEET + dobjs[0];
X	else if (dobjs[0] == CYGNAN || dobjs[0] == TERRAN)
X	    spk = 362 - TERRAN + dobjs[0];
X	else
X	    spk = 364;
X    } else if (wrdnum[0] == PUT) {
X	if (dobjs[0] == DISC && obloc[GDISC] == 2000 + ZROBOT)
X	    dj = GDISC;
X	else if (dobjs[0] == DISC && obloc[BDISC] == 2000 + ZROBOT)
X	    dj = BDISC;
X	else;
X	if (dobjs[0] == DISC && obloc[GDISC] != 2000 + ZROBOT &&
X	    obloc[BDISC] != ZROBOT)
X	    spk = 347;
X	else if (prepdo != 0 || prepio != IN || allflg)
X	    spk = 342;
X	else if (dj < 0 || ij < 0)
X	    spk = 70;
X	else if (dj == 0 || ij == 0)
X	    spk = 344;
X	else if (obloc[dj] != 2000 + ZROBOT)
X	    spk = 347;
X	else {
X	    tloc = loc;
X	    loc = obloc[ZROBOT];
X	    itsher(ij, &iplce);
X	    loc = tloc;
X	    if (obloc[ZROBOT] == loc && obloc[ij] == 1000)
X		iplce = 6;
X	    if (iplce < 4 || iplce > 6)
X		spk = 344;
X	    else {
X		spk = 75;
X		obloc[dj] = 2000 + ij;
X		if (ij == ZMUD) {
X		    spk = 407;
X		    obloc[dj] = 0;
X		} else if (ij == FPIT) {
X		    spk = 408;
X		    obloc[dj] = 0;
X		} else if (ij == ZACID && (dj == GDISC || dj == BDISC)) {
X		    spk = 413;
X		    obloc[dj] = 0;
X		} else if (ij == GVAPOR && gvtim == 0 && dj == GDISC) {
X		    spk = 409;
X		    gvtim = 1;
X		} else if (ij == RVAPOR && dj == GDISC && rvtim == 0) {
X		    spk = 409;
X		    if (gvtim == 1)
X			rvtim = 1;
X		}
X	    }
X	}
X    } else if (wrdnum[0] == IS && adverb == WHERE)
X	spk = 477;
X    else if (wrdnum[0] == IS && adverb == WHAT) {
X	if (dobjs[0] == COMBIN && (doadjs[0] == 0 || doadjs[0] == BOX))
X	    spk = 476;
X	else if (doadjs[0] != 0)
X	    spk = 342;
X	else if (dobjs[0] == DEET)
X	    spk = 473;
X	else if (dobjs[0] == METOL)
X	    spk = 474;
X	else if (dobjs[0] == HYPO)
X	    spk = 475;
X	else
X	    spk = 477;
X    } else
X	spk = 251;
X    if (spk != 0 && (obloc[ZROBOT] == loc || loc == 146)) {
X	speak(spk);
X	if (vspk != 0)
X	    speak(301);
X    }
X}
X
Xvshit()
X{
X    dirty += 1;
X    {
X	if (loc == 74 && (obimpr[ZVINE] & 56) == 8)
X	    speak(303);
X	else if (dirty >= 5 && dirty < 10)
X	    speak(40);
X	else if (dirty >= 10)
X	    if (obloc[LPANT] == 3000 || obloc[RPANT] == 3000)
X		speak(43);
X	    else
X		speak(42);
X    }
X}
X
Xvshoot()
X{
X    int             spk, plce;
X    spk = 0;
X    itsher(ICAMER, &plce);
X    /* camera isn't here  */
X
X    if (plce != 1 && plce != 4)
X	spk = 114;
X    /* see if film is fogged   */
X
X    else if (oextim == 8192)
X	spk = 237;
X    else if (oextim >= 45) {
X	spk = 320;
X	obloc[OPHOTO] = loc;
X	obimpr[OPHOTO] += 64;
X	oextim = 8192;
X    }
X    /* shot the pterodactyls */
X
X    else if (loc == 89 || loc == 68 || loc == 62)
X	spk = 382;
X    else if (loc == 24) {
X	if (obloc[PPHOTO] != 0)
X	    spk = 115;
X	else {
X	    spk = 116;
X	    obloc[PPHOTO] = loc;
X	}
X    }
X    /* phograph the martians at the bar  */
X
X    else if (loc == 30 && marflg[0]) {
X	if (obloc[MPHOTO] != 0)
X	    spk = 135;
X	else {
X	    spk = 134;
X	    obloc[MPHOTO] = loc;
X	}
X    }
X    /* shoot the hockey game  */
X
X    else if (((loc >= 31 && loc <= 38) || loc == 29) && marflg[1]) {
X	if (obloc[MPHOTO] != 0)
X	    spk = 135;
X	else {
X	    spk = 134;
X	    obloc[MPHOTO] = loc;
X	    obimpr[MPHOTO] += 64;
X	}
X    }
X    /* martians, alone aren't too interesting */
X
X    else if ((loc == 28 && marflg[3]) ||
X	     (loc == 40 && marflg[2]) ||
X	     (loc >= 43 && loc <= 45 && marflg[4]))
X	spk = 140;
X    else if (loc == 131) {
X	if (obloc[FPHOTO] != 0)
X	    spk = 115;
X	else {
X	    spk = 318;
X	    obloc[FPHOTO] = loc;
X	    obimpr[FPHOTO] += 64;
X	}
X    } else if (loc == 100) {
X	if (obloc[APHOTO] != 0)
X	    spk = 115;
X	else {
X	    spk = 319;
X	    obloc[APHOTO] = loc;
X	    obimpr[APHOTO] += 64;
X	}
X    } else
X	spk = 117;
X    if (spk != 0)
X	speak(spk);
X}
X
Xvshut()
X{
X    int             spk, n, plce;
X    if (prepdo != 0 && prepio != 0)
X	spk = 21;
X    /* the door to the bar is always open  */
X
X    else if ((loc == 30 || loc == 42) && dobjs[0] == DOOR)
X	spk = 224;
X    /* doors or containers must be openable, and not already shut  */
X
X    else {
X	n = getobj(dobjs[0], doadjs[0]);
X	if (dobjs[0] == DOOR && (loc == 184 || loc == 187 ||
X				 (loc >= 176 && loc <= 181)))
X	    n = BDOOR;
X	if (n < 0)
X	    spk = 70;
X	else if (n == 0)
X	    spk = 66;
X	else if ((obpprp[n] % 2) != 1) {
X	    if (obpprp[n] / 2048 != 0)
X		spk = 254;
X	    else
X		spk = 230;
X	} else {
X	    itsher(n, &plce);
X	    if (dobjs[0] == DOOR && (loc == 184 || loc == 187 ||
X				     (loc >= 176 && loc <= 181)))
X		plce = 5;
X	    if (plce <= 0) {
X		if (dobjs[0] == DOOR)
X		    spk = 225;
X		else
X		    spk = 66;
X	    } else if ((obimpr[n] & 2) == 2) {
X		if (dobjs[0] == DOOR)
X		    spk = 227;
X		else
X		    spk = 390;
X	    } else {
X		spk = 232;
X		obimpr[n] |= 2;
X		if (n == RDOOR || n == MDOOR || n == GDOOR || n == ODOOR
X		    || n == BDOOR)
X		    obimpr[n] -= 8;
X		if (n == ZBOX) {
X		    obimpr[ZBOX] |= 4;
X		    dial1 = 0;
X		    dial2 = 0;
X		}
X	    }
X	}
X    }
X    speak(spk);
X}
X
Xvsit()
X{
X    int             spk;
X    /* sit is usually a joke */
X
X    if (dobjs[0] == 0 && prepdo == DOWN) {
X	if (loc == 166 || loc == 184 || loc == 187 ||
X                                         (loc <= 181 && loc >= 175)) {
X	    spcloc = 2;
X	    spk = 510;
X	} else
X	    spk = 220;
X    } else if (prepdo != IN && prepdo != ON)
X	spk = 21;
X    else if (prepdo == IN && dobjs[0] == CHAIR && (loc == 166
X			      || loc == 184 || (loc <= 181 && loc >= 175) ||
X						   loc == 187)) {
X	spcloc = 2;
X	spk = 510;
X    } else if ((dobjs[0] == TREE || dobjs[0] == LOG || dobjs[0] ==
X		BOULDE) && prepdo == ON)
X	spk = 220;
X    else if ((prepdo == ON || prepdo == IN) && (dobjs[0] == STOOL
X			       || dobjs[0] == STOOLS || dobjs[0] == BOWL)) {
X	/* except the case of sitting on electric seat  */
X
X	if (loc == 42)
X	    spk = 221;
X	else if (loc == 28)
X	    spk = 222;
X	/* sit in bowl, when at hockey rink, slides him in it */
X
X	else if (dobjs[0] == BOWL && (loc >= 32 && loc <= 38)) {
X	    loc = 38;
X	    spk = 75;
X	    oldloc = 0;
X	    oldlc2 = 0;
X	} else if (dobjs[0] == BOWL)
X	    spk = 156;
X	else
X	    spk = 71;
X    } else
X	spk = 48;
X    speak(spk);
X}
Xvstand()
X{
X    int             spk;
X    if (dobjs[0] == 0 && prepdo == UP) {
X	if (spcloc == 2) {
X	    spcloc = 0;
X	    spk = 511;
X	} else
X	    spk = 208;
X    } else if (prepdo != ON)
X	spk = 94;
X    else if (dobjs[0] == TREE || dobjs[0] == LOG && (loc >= 4 &&
X			  loc <= 19 && loc != 16 && loc != 13 && loc != 14))
X	spk = 209;
X    /* stand on glass plate  */
X
X    else if (dobjs[0] == GLASS) {
X	if (obloc[PGLASS] == 1000 || obloc[PGLASS] == 3000)
X	    spk = 211;
X	else if (obloc[PGLASS] != loc)
X	    spk = 66;
X	else {
X	    spk = 75;
X	    spcloc = 1;
X	}
X    } else
X	spk = 210;
X    speak(spk);
X}
X
X
Xvtake()
X{
X    int             i, spk, xiobj, qq, xplce, kplce, ncarrd, kcarrd;
X    int             nweigh, kweigh, ambig, z, plce, plural, t, kkwr;
X    spk = 0;
X    if (prepdo != 0 && prepio != 0)
X	spk = 48;
X
X    /* remove clothing means take off  */
X
X    if (wrdnum[0] == REMOVE && prepdo == 0) {
X	qq = getobj(dobjs[0], doadjs[0]);
X	if (qq > 0 && obloc[qq] == 3000)
X	    prepdo = OFF;
X    }
X    xiobj = getobj(iobj, ioadj);
X    if (xiobj == ZKNAPS)
X	itsher(ZKNAPS, &kplce);
X    /* handle remove something from container */
X
X    if (prepio == FROM) {
X	if (obpprp[xiobj] / 2048 == 0)
X	    spk = 77;
X	else {
X	    itsher(xiobj, &xplce);
X	    if (xplce == 0)
X		spk = 78;
X	}
X    }
X    if (spk != 0) {
X	speak(spk);
X	return;
X    }
X    /* handle multiple objects   */
X
X    ambig = !cnvobj();
X    if (butflg && ambig)
X	return;
X    if (allflg)
X	getall();
X
X    /* check weight  */
X
X    burden(&ncarrd, &nweigh, &kcarrd, &kweigh);
X    if (obloc[ZKNAPS] == 1000 || obloc[ZKNAPS] == 3000)
X	nweigh = nweigh + kweigh;
X    for (i = 0; i < 30; i++) {
X	z = dobjs[i];
X	if (z == 0)
X	    return;
X	plural = (obpprp[z] & 256) == 256;
X	if (z > MOVMAX) {
X	    if (!allflg) {
X		speak(odistb[z]);
X		itsher(z, &plce);
X		if (plce == 4)
X		    spk = odistb[z + 1] - 1;
X		else {
X		    if (plural)
X			spk = 185;
X		    else
X			spk = 66;
X		}
X		xindnt += 2;
X		speak(spk);
X		xindnt -= 2;
X	    }
X	    continue;
X	}
X	itsher(z, &plce);
X	if (allflg && (plce == 0 || plce == 1 || (prepdo ==
X			    OFF && plce != 2) || (prepio == FROM && xiobj ==
X				   ZKNAPS && (obloc[z] != (2000 + ZKNAPS) ||
X		kplce == 0)) || (prepio == 0 && obloc[z] == (2000 + ZKNAPS))
X		       || (plce == 2 && prepdo != OFF)))
X	    continue;
X	/* emit name of object if "all" or multiple */
X
X	if (dobjs[1] != 0 || allflg || ambig)
X	    speak(odistb[z]);
X	if (prepdo == 0) {
X	    /*
X	     * the wire is very,very special... don't even try to figure it
X	     * out!!! *************************************************** 
X             */
X
X
X	    if (plce == 1 || (z == ZWIRE && wirelc[5] == 1000
X			      && wirelc[0] != 1000)) {
X		spk = 67;
X		if (plural)
X		    spk = 186;
X	    } else if (plce == 0 && !(z == ZWIRE && (wirelc[4]
X			      == loc || wirelc[3] == loc || wirelc[2] == loc
X				|| wirelc[1] == loc || wirelc[0] == loc))) {
X		spk = 66;
X		if (plural)
X		    spk = 185;
X		if (z == RBOULD && loc == 27)
X		    spk = 153;
X		if (z == GMOSS && loc == 19)
X		    spk = 243;
X		if (z == PGLASS && (loc == 30 || loc == 42))
X		    spk = 247;
X		if ((z == PPHOTO && loc == 24) || (z == MPHOTO &&
X						   loc >= 26 && loc <= 50))
X		    spk = 249;
X	    } else if (plce == 2) {
X		spk = 68;
X		if (plural)
X		    spk = 187;
X	    } else if (prepio == WITH && (z != CFISH ||
X					  xiobj != BNET))
X		spk = 48;
X	    else if (prepio == FROM && !((z == CKEY &&
X				iobj == SPIRE && ioadj == 0) || (obloc[z] ==
X			(2000 + xiobj)) || (z == ZWIRE && ((iobj == ZKNOB &&
X				    (obimpr[ZWIRE] & ~56) == 32) || (iobj ==
X				  ZTOWER && (obimpr[ZWIRE] & -57) == 24)))))
X		/* ~56=177707 octal  */
X
X		spk = 71;
X	    else if (ncarrd > 5)
X		spk = 72;
X	    else if (nweigh + obw3[z] / 256 > 125) {
X		spk = 79;
X		if (plural)
X		    spk = 188;
X	    }
X	    /* take fish (from sea) with net.  */
X
X	    else if (z == CFISH && loc == 16 &&
X		     (prepio != WITH || xiobj != BNET))
X		spk = 80;
X	    /* prevent him from killing wish in watery bag  */
X
X	    else if (z == CFISH && obloc[z] ==
X		     (2000 + PLBAG) && (obimpr[PLBAG] / 512 == 5))
X		spk = 76;
X	    /* cannot take latex if still liquid   */
X
X	    else if (z == ZLATEX && (obimpr[z] & 56) == 8)
X		spk = 268;
X	    /* cant remove cartridge from slot  */
X
X	    else if (z == ZCART && obloc[ZCART] == 2000 + RSLOT)
X		spk = 311;
X	    /* cant take statue unless ferrets blinded  */
X
X	    else if (loc == 99 && z == ZSTATU
X		     && obimpr[ZSEED] != 2 && obimpr[ZSEED] != 1)
X		spk = 405;
X	    /* diamond must land on moss to be safe   */
X
X	    else if (z == ZDIAMO && loc == 49) {
X		if (obloc[GMOSS] == 48) {
X		    spk = 165;
X		    obloc[z] = 48;
X		    obimpr[z] += 8;
X		} else {
X		    spk = 164;
X		    obloc[z] = 0;
X		}
X	    } else if (z == ZSEED && loc == 86 && obloc[ZSEED] == 86 &&
X		       !(obloc[RPANT] == 3000 && obloc[RSHIRT] == 3000)) {
X		if (obloc[LPANT] == 3000 || obloc[GSHIRT] == 3000) {
X		    if (daytim == 1)
X			speak(424);
X		    else
X			speak(425);
X		} else {
X		    if (daytim == 1)
X			speak(426);
X		    else
X			speak(427);
X		}
X		if (obloc[LPANT] == 3000)
X		    obloc[LPANT] = 0;
X		if (obloc[GSHIRT] == 3000)
X		    obloc[GSHIRT] = 0;
X		vdead();
X		return;
X	    } else {
X		nweigh = nweigh + obw3[z] / 256;
X		ncarrd += 1;
X		if (z == ZKNAPS) {
X		    spk = 87;
X		    obloc[z] = 3000;
X		}
X		/* specail code for wire  */
X
X		else {
X		    spk = 81;
X		    if (z == ZWIRE) {
X			if (obloc[ZWIRE] == loc) {
X			    obimpr[ZWIRE] = (obimpr[ZWIRE] & ~56) + 8;
X			    if (wirelc[0] == 0)
X				obloc[z] = 1000;
X			    /*
X			     * if he takes fastened end, all the pointers must
X			     * have their order reversed  
X                             */
X
X			    else {
X				t = obloc[z];
X				obloc[z] = wirelc[4];
X				wirelc[4] = t;
X				t = wirelc[3];
X				wirelc[3] = wirelc[0];
X				wirelc[0] = t;
X				t = wirelc[2];
X				wirelc[2] = wirelc[1];
X				wirelc[1] = t;
X				wirelc[5] = 1000;
X				if (obloc[ZWIRE] == 1000)
X				    goto lab240;
X			lab239:
X				if (obloc[z] != wirelc[0])
X				    goto lab240;
X				obloc[ZWIRE] = wirelc[0];
X				for (kkwr = 0; kkwr < 5; kkwr++)
X				    wirelc[kkwr] = wirelc[kkwr + 1];
X				goto lab239;
X				/*
X				 * if it's all coiled up, i.e. all the
X				 * wirelc's are 1000, clear wirelc   
X                                 */
X
X			lab240:
X				if (wirelc[0] == 1000) {
X				    for (kkwr = 0; kkwr < 6; kkwr++)
X					wirelc[kkwr] = 0;
X				}
X			    }
X			} else if (wirelc[5] == loc) {
X			    /*
X			     * if pick up far end of wire, 1000(held by him)
X			     * propagates back from end of wirelc  
X                             */
X
X			    for (kkwr = 1; kkwr <= 5; kkwr++) {
X				if (wirelc[6 - kkwr] == loc &&
X                                             wirelc[5 - kkwr] == loc)
X                                                       wirelc[6 - kkwr] = 1000;
X			    }
X			    if (wirelc[0] == loc && obloc[ZWIRE] == loc)
X				wirelc[0] = 1000;
X			} else
X			    spk = 214;
X			if (wirelc[0] == 1000 && obloc[ZWIRE] == 1000) {
X			    for (kkwr = 0; kkwr < 6; kkwr++)
X				wirelc[kkwr] = 0;
X			}
X		    } else {
X			/*******    the actual taking occurs here  */
X
X			if (obloc[z] == 2000 + RSLOT)
X			    obimpr[ZSCREE] = 9;
X			obloc[z] = 1000;
X			if (z == ZLATEX)
X			    obimpr[z] = 337;
X		    }
X		}
X		/* special message for seed  */
X
X		if (loc == 86 && z == ZSEED) {
X		    if (daytim == 1)
X			spk = 428;
X		    else
X			spk = 429;
X		}
X		/* actual fish taking from sea occurs here  */
X
X		if (dobjs[i] == CFISH && loc == 16) {
X		    if (obloc[BNET] == 1000)
X			obloc[CFISH] = 2000 + BNET;
X		    else
X			spk = 91;
X		}
X		/*
X		 * special increment of descriptor pointer if obimpr has 4096
X		 * set 
X                 */
X
X		if (obimpr[z] / 4096 == 1)
X		    obimpr[z] = (obimpr[z] & ~4096) + 8;
X		/* ~4096=167777 octal  */
X
X	    }
X	} else {
X	    /*
X	     * the prepdo is off take off clothes only  
X             */
X
X	    if (plce == 2) {
X		obloc[z] = loc;
X		spk = 82;
X	    } else if ((obpprp[z] & 64) != 64)
X		spk = 71;
X	    else {
X		spk = 83;
X		if (plural)
X		    spk = 189;
X	    }
X	}
X	xindnt += 2;
X	speak(spk);
X	xindnt -= 2;
X    }
X}
X
X
Xvthrow()
X{
X    int             xobj, result, plce, kobj;
X    result = 0;
X    /* if vthrow remains false, must call vdrop  */
X
X    xobj = getobj(dobjs[0], doadjs[0]);
X    if (xobj <= 0 || xobj > MOVMAX) {
X	speak(71);
X	result = 0;
X	return (result);
X    }
X    itsher(xobj, &plce);
X    if (plce == 0) {
X	if ((obpprp[xobj] & 256) == 256)
X	    speak(185);
X	else
X	    speak(66);
X	result = 1;
X	return (result);
X    }
X    /* throw things at the shimmering barrier  */
X
X    if ((loc == 26 || loc == 27) && prepio != OUT &&
X	iobj == BARRIE && dobjs[0] != WIRE && dobjs[0] != FISH) {
X	speak(172);
X	obloc[xobj] = loc;
X	result = 1;
X    }
X    /* throwing things at martians is not allowed  */
X
X    else if ((loc >= 27 && loc <= 51) && daytim == 0 &&
X	     (prepio == AT || prepio == TO) && iobj == MARTIA) {
X	speak(178);
X	result = 1;
X	/*
X	 * the window, or the glass, can't be broken by throwing things at it 
X         */
X
X    } else if ((prepio == THROUG || prepio == AT) && (iobj == WINDOW
X						      || iobj == GLASS)) {
X	if (loc != 30 && loc != 42)
X	    speak(200);
X	else if (xobj == ZSEED) {
X	    speak(337);
X	    obloc[xobj] = 0;
X	    obimpr[ZSEED] = 0;
X	} else if (obloc[PGLASS] != 0) {
X	    speak(240);
X	    obloc[xobj] = 42;
X	    if (loc == 42)
X		obloc[xobj] = 30;
X	} else if (xobj == RBOULD) {
X	    speak(241);
X	    obloc[xobj] = loc;
X	} else {
X	    speak(242);
X	    obloc[xobj] = loc;
X	}
X	result = 1;
X	/*
X	 * throwing other things results in a joke (usually)  
X         */
X
X    } else if (prepio == AT && ((iobj == FERRET && (loc == 99 || loc ==
X		      100 || loc == 131)) || (iobj == BEES && loc == 87))) {
X	prepio = 0;
X	iobj = 0;
X	ioadj = 0;
X    } else if (prepio == AT) {
X	if (iobj == ROBOT || iobj == FERRET)
X	    speak(285);
X	else if (iobj == GUARD) {
X	    if (loc == guardl || loc == 171 || (chaset != 0 &&
X						chaset <= 9))
X		speak(562);
X	    else
X		speak(561);
X	} else if (iobj == VINE && loc == 74) {
X	    speak(308);
X	    obloc[xobj] = loc;
X	} else {
X	    kobj = getobj(iobj, ioadj);
X	    if (kobj <= 0)
X		speak(71);
X	    else;
X	    speak(48);
X	}
X	return (1);
X    }
X    return (result);
X}
X
Xvturn()
X{
X    int             numbr;
X    if ((dobjs[0] == RA || dobjs[0] == DECLIN) && ((loc >= 175
X				 && loc <= 181) || loc == 184 || loc == 187)
X	&& prepio == TO && iobj > 9999) {
X	numbr = iobj - 10000;
X	if (dobjs[0] == RA)
X	    raset = numbr;
X	if (dobjs[0] == DECLIN)
X	    decset = numbr;
X	if (lpill == 1)
X	    speak(533);
X	return;
X    }
X    if ((dobjs[0] == LIGHT || dobjs[0] == MACHIN) && (prepdo ==
X						      ON || prepdo == OFF)) {
X	speak(391);
X	return;
X    } else if (dobjs[0] != DIAL)
X	speak(387);
X    else {
X	if (doadjs[0] != LEFT && doadjs[0] != RIGHT)
X	    speak(392);
X	else if (prepio == 0 && iobj == 0)
X	    speak(393);
X	else if (prepio != TO || iobj < 9999)
X	    speak(28);
X	else if (iobj < 10000 || iobj > 10999)
X	    speak(394);
X	else if (doadjs[0] == LEFT)
X	    dial1 = iobj - 10000;
X	else
X	    dial2 = iobj - 10000;
X    }
X    if (dial1 == dial1x && dial2 == dial2x && (obimpr[ZBOX] & 6) == 6) {
X	speak(395);
X	obimpr[ZBOX] -= 6;
X    }
X}
Xvwash()
X{
X    int             bplce, n, nplce;
X    itsher(ZBUCKE, &bplce);
X    if ((locdat[loc] & 1024) == 0 && (bplce == 0 || obimpr[ZBUCKE] != 1033)) {
X	speak(74);
X	return;
X    }
X    n = getobj(dobjs[0], doadjs[0]);
X    if (n < 0)
X	speak(70);
X    else if (n == 0)
X	speak(28);
X    else {
X	itsher(n, &nplce);
X	if (nplce == 0) {
X	    if ((obimpr[n] & 256) != 0)
X		speak(185);
X	    else
X		speak(89);
X	} else if (n == GDISC && rvtim == 0)
X	    speak(414);
X	else if (n == GDISC && rvtim == 1) {
X	    speak(410);
X	    rvtim = 2;
X	} else
X	    speak(336);
X    }
X}
X
Xvwear()
X{
X    int             ambig, i, d, plural, plce, spk;
X    /* wear clothes  */
X
X    ambig = !cnvobj();
X    if (allflg || ambig) {
X	speak(84);
X	return;
X    }
X    for (i = 0; i < 30; i++) {
X	d = dobjs[i];
X	if (d == 0)
X	    continue;
X	plural = (obpprp[d] & 256) == 256;
X	if (d != ZDEET)
X	    speak(odistb[d]);
X	itsher(d, &plce);
X	if (plce == 0) {
X	    spk = 66;
X	    if (plural)
X		spk = 185;
X	} else if (plce == 2) {
X	    spk = 68;
X	    if (plural)
X		spk = 147;
X	} else if ((obpprp[d] & 64) != 64 && d != ZDEET)
X	    spk = 85;
X	else if ((d == RPANT && obloc[LPANT] == 3000) ||
X		 (d == LPANT && obloc[RPANT] == 3000) ||
X		 (d == RSHIRT && obloc[GSHIRT] == 3000) ||
X		 (d == GSHIRT && obloc[RSHIRT] == 3000) ||
X		 (d == HBOOTS && obloc[CSHOES] == 3000) ||
X		 (d == CSHOES && obloc[HBOOTS] == 3000))
X	    spk = 86;
X	else {
X	    if (d == ZDEET) {
X		spk = 75;
X		obimpr[ZDEET] = 28672;
X		obloc[ZDEET] = 0;
X	    } else {
X		spk = 87;
X		if (plural)
X		    spk = 190;
X		obloc[d] = 3000;
X		/*
X		 * taking key changes descriptor ~4152=167707 octal  
X                 */
X
X		if (d == CKEY)
X		    obimpr[d] = (obimpr[d] & ~4152) + 16;
X	    }
X	}
X	xindnt += 2;
X	speak(spk);
X	xindnt -= 2;
X    }
X}
X
END_OF_verbs2.c
if test 32951 -ne `wc -c <verbs2.c`; then
    echo shar: \"verbs2.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of archive 3 \(of 7\).
cp /dev/null ark3isdone
MISSING=""
for I in 1 2 3 4 5 6 7 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 7 archives.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0