/*
  DRINK.  If no object, assume water or wine and look for them here.
  If potable is in bottle or cask, drink that.  If not, see if there
  is something drinkable nearby (stream, lake, wine fountain, etc.),
  and drink that.  If he has stuff in both containers, ask which.
*/
void ivdrink()
{
    int ll;

    previous_obj = FALSE;
    ll = liqloc(g.loc);
    if ((ll == WATER) || (ll == WINE)) {
	object = ll;
	iobj = -1;
    }
    ll = liq(BOTTLE);
    if ((athand(BOTTLE)) && ((ll == WATER) || (ll == WINE))) {
	object = ll;
	iobj = BOTTLE;
    }
    ll = liq(CASK);
    if ((athand(CASK)) && ((ll == WATER) || (ll == WINE))
	&& iobj != BOTTLE) {
	object = ll;
	iobj = CASK;
    } else
	object = 0;

    if (object == 0)
	needobj();
    else
	trverb();
}
Beispiel #2
0
/*
	FILL
*/
vfill()
{
	int msg;
	int i;

	switch(object) {
	case BOTTLE:
		if (liq() != 0)
			msg = 105;
		else if (liqloc(loc) == 0)
			msg = 106;
		else {
			prop[BOTTLE] = cond[loc] & WATOIL;
			i = liq();
			if (toting(BOTTLE))
				place[i] = -1;
			msg = (i == OIL ? 108 : 107);
		}
		break;
	case VASE:
		if (liqloc(loc) == 0) {
			msg = 144;
			break;
		}
		if (!toting(VASE)) {
			msg = 29;
			break;
		}
		rspeak(145);
		vdrop();
		return;
	default:
		msg = 29;
	}
	rspeak(msg);
}
Beispiel #3
0
/*
	INVENTORY, FIND etc.
*/
vfind()
{
	int msg;
	if (toting(object))
		msg = 24;
	else if (closed)
		msg = 138;
	else if (dcheck() && dflag >= 2 && object == DWARF)
		msg = 94;
	else if (at(object) ||
		(liq() == object && here(BOTTLE)) ||
		object == liqloc(loc))
		msg = 94;
	else {
		actspk(verb);
		return;
	}
	rspeak(msg);
}
Beispiel #4
0
int
main(int argc, char *argv[])
{
    int     i;
    int     rval, ll;
    struct text *kk;

    init();		/* Initialize everything */
    signal(SIGINT, trapdel);

    if (argc > 1) {	/* Restore file specified */
        /* Restart is label 8305 (Fortran) */
        i = restore(argv[1]);	/* See what we've got */
        switch (i) {
        case 0:			/* The restore worked fine */
            yea = Start();
            k = null;
            unlink(argv[1]);/* Don't re-use the save */
            goto l8;	/* Get where we're going */
        case 1:		/* Couldn't open it */
            errx(1, "can't open file");	/* So give up */
        case 2:		/* Oops -- file was altered */
            rspeak(202);	/* You dissolve */
            exit(2);	/* File could be non-adventure */
        }			/* So don't unlink it. */
    }

    startup();		/* prepare for a user		*/

    for (;;) {		/* main command loop (label 2)	*/
        if (newloc < 9 && newloc != 0 && closng) {
            rspeak(130);	/* if closing leave only by	*/
            newloc = loc;	/*	main office		*/
            if (!panic)
                clock2 = 15;
            panic = TRUE;
        }

        rval = fdwarf();		/* dwarf stuff			*/
        if (rval == 99)
            die(99);

l2000:
        if (loc == 0)
            die(99);	/* label 2000			*/
        kk = &stext[loc];
        if ((abb[loc] % abbnum) ==0 || kk->seekadr == 0)
            kk = &ltext[loc];
        if (!forced(loc) && dark()) {
            if (wzdark && pct(35)) {
                die(90);
                goto l2000;
            }
            kk = &rtext[16];
        }
l2001:
        if (toting(bear))
            rspeak(141);	/* 2001			*/
        speak(kk);
        k = 1;
        if (forced(loc))
            goto l8;
        if (loc == 33 && pct(25) && !closng)
            rspeak(8);
        if (!dark()) {
            abb[loc]++;
            for (i = atloc[loc]; i != 0; i = linkx[i]) {	/*2004*/
                obj = i;
                if (obj > 100)
                    obj -= 100;
                if (obj == steps && toting(nugget))
                    continue;
                if (prop[obj] < 0) {
                    if (closed)
                        continue;
                    prop[obj] = 0;
                    if (obj == rug || obj == chain)
                        prop[obj] = 1;
                    tally--;
                    if (tally == tally2 && tally != 0)
                        if (limit > 35)
                            limit = 35;
                }
                ll = prop[obj];	/* 2006	*/
                if (obj == steps && loc == fixed[steps])
                    ll = 1;
                pspeak(obj, ll);
            }		/* 2008 */
            goto l2012;
l2009:
            k = 54;			/* 2009			*/
l2010:
            spk = k;
l2011:
            rspeak(spk);
        }
l2012:
        verb = 0;		/* 2012			*/
        obj = 0;
l2600:
        checkhints();		/* to 2600-2602		*/
        if (closed) {
            if (prop[oyster] < 0 && toting(oyster))
                pspeak(oyster, 1);
            for (i = 1; i < 100; i++)
                if (toting(i) && prop[i] < 0)	/* 2604 */
                    prop[i] = -1 - prop[i];
        }
        wzdark = dark();	/* 2605			*/
        if (knfloc > 0 && knfloc != loc)
            knfloc = 1;
        getin(wd1, sizeof(wd1), wd2, sizeof(wd2));
        if (delhit) {		/* user typed a DEL	*/
            delhit = 0;	/* reset counter	*/
            /* pretend he's quitting */
            strlcpy(wd1, "quit", sizeof(wd1));
            wd2[0] = 0;
        }
l2608:
        if ((foobar = -foobar) > 0)
            foobar = 0;	/* 2608		*/
        /* should check here for "magic mode"		*/
        turns++;
        if (demo && turns >= SHORT)
            done(1);	/* to 13000	*/

        if (verb == say && wd2[0] != 0)
            verb = 0;
        if (verb == say)
            goto l4090;
        if (tally == 0 && loc >= 15 && loc != 33)
            clock1--;
        if (clock1 == 0) {
            closing();			/* to 10000	*/
            goto l19999;
        }
        if (clock1 < 0)
            clock2--;
        if (clock2 == 0) {
            caveclose();		/* to 11000		*/
            continue;		/* back to 2		*/
        }
        if (prop[lamp] == 1)
            limit--;
        if (limit <= 30 && here(batter) && prop[batter] == 0
                && here(lamp)) {
            rspeak(188);		/* 12000		*/
            prop[batter] = 1;
            if (toting(batter))
                drop(batter, loc);
            limit += 2500;
            lmwarn = FALSE;
            goto l19999;
        }
        if (limit == 0) {
            limit = -1;		/* 12400		*/
            prop[lamp] = 0;
            rspeak(184);
            goto l19999;
        }
        if (limit < 0 && loc <= 8) {
            rspeak(185);		/* 12600		*/
            gaveup = TRUE;
            done(2);		/* to 20000		*/
        }
        if (limit <= 30) {
            if (lmwarn || !here(lamp))
                goto l19999;	/*12200*/
            lmwarn = TRUE;
            spk = 187;
            if (place[batter] == 0)
                spk = 183;
            if (prop[batter] == 1)
                spk = 189;
            rspeak(spk);
        }
l19999:
        k = 43;
        if (liqloc(loc) == water)
            k = 70;
        if (weq(wd1, "enter") &&
                (weq(wd2, "strea") || weq(wd2, "water")))
            goto l2010;
        if (weq(wd1, "enter") && *wd2 != 0)
            goto l2800;
        if ((!weq(wd1, "water") && !weq(wd1, "oil"))
                || (!weq(wd2, "plant") && !weq(wd2, "door")))
            goto l2610;
        if (at(vocab(wd2, 1, 0)))
            strlcpy(wd2, "pour", sizeof(wd2));

l2610:
        if (weq(wd1, "west"))
            if (++iwest == 10)
                rspeak(17);
l2630:
        i = vocab(wd1, -1, 0);
        if (i== -1) {
            spk = 60;			/* 3000		*/
            if (pct(20))
                spk = 61;
            if (pct(20))
                spk = 13;
            rspeak(spk);
            goto l2600;
        }
        k = i % 1000;
        kq = i / 1000 + 1;
        switch (kq) {
        case 1:
            goto l8;
        case 2:
            goto l5000;
        case 3:
            goto l4000;
        case 4:
            goto l2010;
        default:
            bug(22);
        }

l8:
        switch (march()) {
        case 2:
            continue;		/* i.e. goto l2		*/
        case 99:
            die(99);
            goto l2000;
        default:
            bug(110);
        }

l2800:
        strlcpy(wd1, wd2, sizeof(wd1));
        wd2[0] = 0;
        goto l2610;

l4000:
        verb = k;
        spk = actspk[verb];
        if (wd2[0] != 0 && verb != say)
            goto l2800;
        if (verb == say)
            obj = wd2[0];
        if (obj != 0)
            goto l4090;
l4080:
        switch (verb) {
        case 1:			/* take = 8010		*/
            if (atloc[loc] == 0 || linkx[atloc[loc]] != 0)
                goto l8000;
            for (i = 1; i <= 5; i++)
                if (dloc[i] == loc && dflag >= 2)
                    goto l8000;
            obj = atloc[loc];
            goto l9010;
        case 2:
        case 3:
        case 9:		/* 8000 : drop, say, wave */
        case 10:
        case 16:
        case 17:	/* calm, rub, toss	*/
        case 19:
        case 21:
        case 28:	/* find, feed, break	*/
        case 29:			/* wake			*/
l8000:
            printf("%s what?\n", wd1);
            obj = 0;
            goto l2600;
        case 4:
        case 6:		/* 8040 open, lock	*/
            spk = 28;
            if (here(clam))
                obj = clam;
            if (here(oyster))
                obj = oyster;
            if (at(door))
                obj = door;
            if (at(grate))
                obj = grate;
            if (obj != 0 && here(chain))
                goto l8000;
            if (here(chain))
                obj = chain;
            if (obj == 0)
                goto l2011;
            goto l9040;
        case 5:
            goto l2009;		/* nothing		*/
        case 7:
            goto l9070;		/* on			*/
        case 8:
            goto l9080;		/* off			*/
        case 11:
            goto l8000;	/* walk			*/
        case 12:
            goto l9120;	/* kill			*/
        case 13:
            goto l9130;	/* pour			*/
        case 14:			/* eat: 8140		*/
            if (!here(food))
                goto l8000;
l8142:
            dstroy(food);
            spk = 72;
            goto l2011;
        case 15:
            goto l9150;	/* drink		*/
        case 18:			/* quit: 8180		*/
            gaveup = yes(22, 54, 54);
            if (gaveup)
                done(2);	/* 8185			*/
            goto l2012;
        case 20:			/* invent = 8200	*/
            spk = 98;
            for (i = 1; i <= 100; i++) {
                if (i != bear && toting(i)) {
                    if (spk == 98)
                        rspeak(99);
                    blklin = FALSE;
                    pspeak(i, -1);
                    blklin = TRUE;
                    spk = 0;
                }
            }
            if (toting(bear))
                spk = 141;
            goto l2011;
        case 22:
            goto l9220;	/* fill			*/
        case 23:
            goto l9230;	/* blast		*/
        case 24:			/* score: 8240		*/
            scorng = TRUE;
            printf("If you were to quit now, you would score");
            printf(" %d out of a possible ", score());
            printf("%d.", mxscor);
            scorng = FALSE;
            gaveup = yes(143, 54, 54);
            if (gaveup)
                done(2);
            goto l2012;
        case 25:			/* foo: 8250		*/
            k = vocab(wd1, 3, 0);
            spk = 42;
            if (foobar == 1 - k)
                goto l8252;
            if (foobar != 0)
                spk = 151;
            goto l2011;
l8252:
            foobar = k;
            if (k != 4)
                goto l2009;
            foobar = 0;
            if (place[eggs] == plac[eggs]
                    || (toting(eggs) && loc == plac[eggs])) goto l2011;
            if (place[eggs] == 0 && place[troll] == 0 && prop[troll] == 0)
                prop[troll] = 1;
            k = 2;
            if (here(eggs))
                k = 1;
            if (loc == plac[eggs])
                k = 0;
            move(eggs, plac[eggs]);
            pspeak(eggs, k);
            goto l2012;
        case 26:			/* brief = 8260		*/
            spk = 156;
            abbnum = 10000;
            detail = 3;
            goto l2011;
        case 27:			/* read = 8270		*/
            if (here(magzin))
                obj = magzin;
            if (here(tablet))
                obj = obj * 100 + tablet;
            if (here(messag))
                obj = obj * 100 + messag;
            if (closed && toting(oyster))
                obj = oyster;
            if (obj > 100 || obj == 0 || dark())
                goto l8000;
            goto l9270;
        case 30:			/* suspend = 8300	*/
            spk = 201;
            if (demo)
                goto l2011;
            printf("I can suspend your adventure for you so");
            printf(" you can resume later, but\n");
            printf("you will have to wait at least");
            printf(" %d minutes before continuing.", latncy);
            if (!yes(200, 54, 54))
                goto l2012;
            time(&savet);
            ciao();		/* Do we quit? */
            continue;		/* Maybe not */
        case 31:			/* hours = 8310		*/
            printf("Colossal cave is closed 9am-5pm Mon ");
            printf("through Fri except holidays.\n");
            goto l2012;
        default:
            bug(23);
        }

l4090:
        switch (verb) {
        case 1:			/* take = 9010		*/
l9010:
            switch (trtake()) {
            case 2011:
                goto l2011;
            case 9220:
                goto l9220;
            case 2009:
                goto l2009;
            case 2012:
                goto l2012;
            default:
                bug(102);
            }
l9020:
        case 2:			/* drop = 9020		*/
            switch (trdrop()) {
            case 2011:
                goto l2011;
            case 19000:
                done(3);
            case 2012:
                goto l2012;
            default:
                bug(105);
            }
l9030:
        case 3:
            switch (trsay()) {
            case 2012:
                goto l2012;
            case 2630:
                goto l2630;
            default:
                bug(107);
            }
l9040:
        case 4:
        case 6:		/* open, close		*/
            switch (tropen()) {
            case 2011:
                goto l2011;
            case 2010:
                goto l2010;
            default:
                bug(106);
            }
        case 5:
            goto l2009;	/* nothing		*/
        case 7:			/* on	9070		*/
l9070:
            if (!here(lamp))
                goto l2011;
            spk = 184;
            if (limit < 0)
                goto l2011;
            prop[lamp] = 1;
            rspeak(39);
            if (wzdark)
                goto l2000;
            goto l2012;

        case 8:			/* off			*/
l9080:
            if (!here(lamp))
                goto l2011;
            prop[lamp] = 0;
            rspeak(40);
            if (dark())
                rspeak(16);
            goto l2012;

        case 9:			/* wave			*/
            if ((!toting(obj)) && (obj != rod || !toting(rod2)))
                spk = 29;
            if (obj != rod || !at(fissur)||!toting(obj) || closng)
                goto l2011;
            prop[fissur] = 1-prop[fissur];
            pspeak(fissur, 2-prop[fissur]);
            goto l2012;
        case 10:
        case 11:
        case 18:	/* calm, walk, quit	*/
        case 24:
        case 25:
        case 26:	/* score, foo, brief	*/
        case 30:
        case 31:		/* suspend, hours	*/
            goto l2011;
l9120:
        case 12:			/* kill			*/
            switch (trkill()) {
            case 8000:
                goto l8000;
            case 8:
                goto l8;
            case 2011:
                goto l2011;
            case 2608:
                goto l2608;
            case 19000:
                done(3);
            default:
                bug(112);
            }
l9130:
        case 13:			/* pour			*/
            if (obj == bottle || obj == 0)
                obj = liq();
            if (obj == 0)
                goto l8000;
            if (!toting(obj))
                goto l2011;
            spk = 78;
            if (obj != oil && obj != water)
                goto l2011;
            prop[bottle] = 1;
            place[obj] = 0;
            spk = 77;
            if (!(at(plant) || at(door)))
                goto l2011;
            if (at(door)) {
                prop[door] = 0;	/* 9132			*/
                if (obj == oil)
                    prop[door] = 1;
                spk = 113 + prop[door];
                goto l2011;
            }
            spk = 112;
            if (obj != water)
                goto l2011;
            pspeak(plant, prop[plant] + 1);
            prop[plant] = (prop[plant] + 2) % 6;
            prop[plant2] = prop[plant] / 2;
            k = null;
            goto l8;
        case 14:			/* 9140 - eat		*/
            if (obj == food)
                goto l8142;
            if (obj == bird || obj == snake || obj == clam || obj == oyster
                    || obj == dwarf || obj == dragon || obj == troll
                    || obj == bear) spk = 71;
            goto l2011;
l9150:
        case 15:			/* 9150 - drink		*/
            if (obj == 0 && liqloc(loc) != water && (liq() != water
                    || !here(bottle)))
                goto l8000;
            if (obj != 0 && obj != water)
                spk = 110;
            if (spk == 110 || liq() != water || !here(bottle))
                goto l2011;
            prop[bottle] = 1;
            place[water] = 0;
            spk = 74;
            goto l2011;
        case 16:			/* 9160: rub		*/
            if (obj != lamp)
                spk = 76;
            goto l2011;
        case 17:			/* 9170: throw		*/
            switch (trtoss()) {
            case 2011:
                goto l2011;
            case 9020:
                goto l9020;
            case 9120:
                goto l9120;
            case 8:
                goto l8;
            case 9210:
                goto l9210;
            default:
                bug(113);
            }
        case 19:
        case 20:		/* 9190: find, invent	*/
            if (at(obj) || (liq() == obj && at(bottle))
                    || k == liqloc(loc))
                spk = 94;
            for (i = 1; i <= 5; i++)
                if (dloc[i] == loc && dflag >= 2 && obj == dwarf)
                    spk = 94;
            if (closed)
                spk = 138;
            if (toting(obj))
                spk = 24;
            goto l2011;
l9210:
        case 21:			/* feed			*/
            switch (trfeed()) {
            case 2011:
                goto l2011;
            default:
                bug(114);
            }
l9220:
        case 22:			/* fill			*/
            switch (trfill()) {
            case 2011:
                goto l2011;
            case 8000:
                goto l8000;
            case 9020:
                goto l9020;
            default:
                bug(115);
            }
l9230:
        case 23:			/* blast		*/
            if (prop[rod2] < 0 || !closed)
                goto l2011;
            bonus = 133;
            if (loc == 115)
                bonus = 134;
            if (here(rod2))
                bonus = 135;
            rspeak(bonus);
            done(2);
l9270:
        case 27:			/* read			*/
            if (dark())
                goto l5190;
            if (obj == magzin)
                spk = 190;
            if (obj == tablet)
                spk = 196;
            if (obj == messag)
                spk = 191;
            if (obj == oyster && hinted[2] && toting(oyster))
                spk = 194;
            if (obj != oyster || hinted[2] || !toting(oyster)
                    || !closed) goto l2011;
            hinted[2] = yes(192, 193, 54);
            goto l2012;
l9280:
        case 28:			/* break		*/
            if (obj == mirror)
                spk = 148;
            if (obj == vase && prop[vase] == 0) {
                spk = 198;
                if (toting(vase))
                    drop(vase, loc);
                prop[vase] = 2;
                fixed[vase] = -1;
                goto l2011;
            }
            if (obj != mirror||!closed)
                goto l2011;
            rspeak(197);
            done(3);
l9290:
        case 29:			/* wake			*/
            if (obj != dwarf||!closed)
                goto l2011;
            rspeak(199);
            done(3);

        default:
            bug(24);
        }

l5000:
        obj = k;
        if (fixed[k] != loc && !here(k))
            goto l5100;
l5010:
        if (wd2[0] != 0)
            goto l2800;
        if (verb != 0)
            goto l4090;
        printf("What do you want to do with the %s?\n", wd1);
        goto l2600;
l5100:
        if (k != grate)
            goto l5110;
        if (loc == 1 || loc == 4 || loc == 7)
            k = dprssn;
        if (loc > 9 && loc < 15)
            k = entrnc;
        if (k != grate)
            goto l8;
l5110:
        if (k != dwarf)
            goto l5120;
        for (i = 1; i <= 5; i++)
            if (dloc[i] == loc && dflag >= 2)
                goto l5010;
l5120:
        if ((liq() == k && here(bottle)) || k == liqloc(loc))
            goto l5010;
        if (obj != plant || !at(plant2) || prop[plant2] == 0)
            goto l5130;
        obj = plant2;
        goto l5010;
l5130:
        if (obj != knife || knfloc != loc)
            goto l5140;
        knfloc = -1;
        spk = 116;
        goto l2011;
l5140:
        if (obj != rod || !here(rod2))
            goto l5190;
        obj = rod2;
        goto l5010;
l5190:
        if ((verb == find || verb == invent) && wd2[0] == 0)
            goto l5010;
        printf("I see no %s here\n", wd1);
        goto l2012;
    }
}
/*
  Analyze a two word sentence
*/
int english()
{

    char *ch_ptr, *word1, *word2;
    int type, val, type2, val2, adj, k, kk;
    static int iwest = 0;

    if (!(words[++wdx])) {
	getwords();
	wdx = 0;
    }
    pflag = FALSE;
    word = words[wdx];
    if (word < 0) {			/* check first word	 */
	printf("I didn't understand the word \"%s\"\n", txt[wdx]);
	words[wdx+1] = 0;
	return (FALSE);			/* didn't know it	 */
    }
    type2 = val2 = -1;
    type = CLASS(word);
    clrlin();
    val = VAL(word);
    if (words[wdx + 1] && CLASS(words[wdx + 1]) != CONJUNCTION) {

	/* 'SAY' or 'CALL'.  If no next word, pass on to higher powers. */
	if (type == ACTION && (val == SAY || val == YELL)) {
	    word = words[++wdx];
	    if (!(word == XYZZY || word == PLUGH
		  || word == PLOVER || word == PHUCE)) {
		if (val == SAY)
		    printf("Okay, \"%s\".\n", txt[wdx]);
		else {
		    for (ch_ptr = txt[wdx]; *ch_ptr; ch_ptr++)
			if (islower(*ch_ptr))
			    *ch_ptr = toupper(*ch_ptr);
		    printf("Okay, \"%s\"!!!!!\n", txt[wdx]);
		}
		return (FALSE);
	    }
	} else {
	    word1 = txt[wdx];
	    word2 = txt[wdx + 1];

	    /* Special stuff for 'ENTER'.  Can't go into water. 'ENTER
	       BOAT' means 'TAKE BOAT' */
	    if (word == ENTER) {
		if (CLASS(words[wdx + 1]) == NOUN && VAL(words[wdx + 1]) == BOAT)
		    word = TAKE + 2000;
		else if ((strcmp(word2, "stream") == 0)
			 || (strcmp(word2, "water") == 0)
			 || (strcmp(word2, "reservoir") == 0)
			 || (strcmp(word2, "ocean") == 0)
			 || (strcmp(word2, "sea") == 0)
			 || (strcmp(word2, "pool") == 0)) {
		    rspeak(liqloc(g.loc) == WATER ? 70 : 43);
		    wdx++;
		    return (FALSE);
		}
	    } else {
		type2 = CLASS(words[wdx + 1]);
		val2 = VAL(words[wdx + 1]);

		/* 'LEAVE' is motion verb, unsless leaving an object.
		   E.G., 'LEAVE BOAT' or 'LEAVE BOTTLE'.  BUt make sure
		   to leave ('DROP') only totable objects. */
		if (strcmp(word1, "leave") == 0 && type2 == NOUN) {
		    if (!hinged(val2) || g.fixed[val2])
			word = LEAVE + 2000;

		    /* IF 'LIGHT LAMP', Light must be taken as an
		       action verb, not a noun. */
		} else if (strcmp(word1, "light") == 0
			   && VAL(words[wdx + 1]) == LAMP) {
		    word = ON + 2000;

		    /* 'WATER PLANT' becomes 'POUR WATER', If we are at
		       plant. 'OIL DOOR' becomes 'POUR OIL', etc., etc. */
		} else if ((strcmp(word1, "water") == 0 || strcmp(word1, "oil") == 0)
			   && (strcmp(word2, "plant") == 0 || strcmp(word2, "door") == 0
			       || strcmp(word2, "sword") == 0 || strcmp(word2, "anvil") == 0)
			   && at(val2)) {
		    words[wdx + 1] = word;
		    txt[wdx + 1] = txt[wdx];
		    word = POUR + 2000;
		}
	    }
	}

    }
    /* This is the 'inner' loop.  Dispatching of all word in a clause
       after the first comes through here. */
    do {
	switch (CLASS(word)) {
	case MOTION:
	    {
		boolean do_part2;
		int i;

		do_part2 = FALSE;
		type = CLASS(verbs[vrbx]);
		val = VAL(verbs[vrbx]);
		if (!vrbx)
		    do_part2 = TRUE;
		else {
		    if (type > ACTION) {
			rspeak(confuz());
			return (FALSE);
		    }
		}
		if (type == ACTION) {
		    if (val == GO)
			do_part2 = TRUE;
		    else {
			if (val == TAKE) {
			    for (i = 0; i < 20; i++)
				if (takdir[i] == val)
				    do_part2 = TRUE;
			}
			if (!do_part2) {
			    word = vocab(txt[wdx], 1);
			    if (word)
				words[wdx--] = word;
			}
		    }
		} else if (type != CRAWL && type != JUMP
			   && type != CLIMB)
		    do_part2 = TRUE;
		if (do_part2) {
		    verbs[1] = word;
		    vrbx = 1;
		    if (strcmp(txt[wdx], "west") == 0) {
			iwest++;
			if (iwest == 10)
			    rspeak(17);
		    }
		}
		break;
	    }
	case NOUN:
	    if (pflag) {
		if (!doiobj())
		    return (FALSE);
	    } else {
		word = VAL(word);
		if (word == ALL) {
		    if (!do_scoop_up())
			return (FALSE);
		} else {
		    doobj(&word);
		    if (word > 0) {
			objs[++objx] = word;
			otxt[objx] = txt[wdx];
		    } else {
			clrlin();
			pflag = FALSE;
			wdx++;
			while (words[wdx]) {
			    if (CLASS(words[wdx]) == CONJUNCTION)
				break;
			    wdx++;
			}
			if (words[wdx] == 0)
			    return (FALSE);
		    }
		}
	    }
	    break;
	case ACTION:
	    if (vrbx == 0)
		vrbx++;
	    else {
		if (VAL(verbs[vrbx]) == TAKE) {
		    val = VAL(word);
		    if (val == DRINK || val == INVENTORY
			|| val == SCORE || val == NOTHING
			|| val == LOOK);
		    else if (val == GO && (
					 strcmp(txt[wdx], "walk") == 0
				       || strcmp(txt[wdx], "run") == 0
				   || strcmp(txt[wdx], "hike") == 0));
		    else {
			rspeak(confuz());
			return (FALSE);
		    }
		} else if (objx || CLASS(words[wdx - 1]) == CONJUNCTION) {
		    rspeak(confuz());
		    return (FALSE);
		}
	    }
	    verbs[vrbx] = word;
	    vtxt[vrbx] = txt[wdx];
	    break;
	case MISC:
	    if (vrbx) {
		rspeak(confuz());
		return (FALSE);
	    }
	    verbs[1] = word;
	    vrbx = 1;
	    break;
	case PREPOSITION:
	    if (CLASS(verbs[vrbx]) != ACTION || iobx) {
		rspeak(confuz());
		return (FALSE);
	    }
	    vrbkey = vkey[VAL(verbs[vrbx])];
	    if (!vrbkey) {
		rspeak(confuz());
		return (FALSE);
	    }
	    prep = VAL(word);
	    pflag = TRUE;
	    break;
	case ADJACTIVE:
	    /* Adjective handler. Scarf the next word, make sure it is
	       a valid object for this object.  Then call getobj to see
	       if it is really there, Then link into object code. */
	    adj = VAL(word);
	    if (!check_next())
		return (FALSE);
	    else if (CLASS(word) == CONJUNCTION) {
		printf("%s what?\n", txt[wdx - 1]);
		return (FALSE);
	    } else {
		if (CLASS(word) != NOUN)
		    word = vocab(txt[wdx], NOUN);
		if (word == -1 || CLASS(word) != NOUN || VAL(word) == ALL) {
		    rspeak(confuz());
		    return (FALSE);
		}
		words[wdx] = word;
		kk = VAL(word);
		for (k = adjkey[adj]; adjtab[k] >= 0; k++) {
		    if (kk == abs(adjtab[k]))
			break;
		}
		if (adjtab[k] < 0) {
		    rspeak(confuz());
		    return (FALSE);
		}
	    }
	    break;
	case CONJUNCTION:
	    if (!check_next())
		return (FALSE);
	    switch (CLASS(word)) {
	    case MOTION:
	    case ACTION:
	    case MISC:
		words[wdx--] = 0;
		break;
	    case NOUN:
	    case ADJACTIVE:
		break;
	    case PREPOSITION:
	    case CONJUNCTION:
		rspeak(confuz());
		return (FALSE);
	    default:
		bug(33);
	    }
	    break;
	default:
	    bug(33);
	}
	word = words[++wdx];
	if (word < 0) {
	    if (pct(50))
		printf("I don't understand the word %s?\n", txt[wdx]);
	    else
		printf("Mumble ?  %s\n", txt[wdx]);

	    words[wdx+1] = 0;
	    return (FALSE);
	}
	type = CLASS(word);
	if (type == NOUN) {
	    /* It's not the first:  Make sure he included a comma or
	       'and'. Differenctiate between direct & indirect objects.
	       Check for special case of multiple ofjects: 'feed bear
	       honey' or 'throw troll nugget'. */
	    if ((pflag ? iobx : objx)
		&& CLASS(words[wdx - 1]) != CONJUNCTION) {
		val = VAL(verbs[vrbx]);
		if (!living(objs[objx]) || (val != THROW && val != FEED)) {
		    rspeak(confuz());
		    return (FALSE);
		}
		iobx++;
		iobjs[iobx] = objs[objx];
		objs[objx] = 0;
		objx++;
	    }
	}
    } while (word);

    if (verbs[1] == 0) {
	if (objs[1] == 0) {
	    rspeak(confuz());
	    clrlin();
	} else if (objs[2])
	    printf("What do you want to do with them?\n");
	else
	    printf("What do you want to do with %s?\n", otxt[1]);
	return (FALSE);
    } else if (objx > 1 && iobx > 1) {
	rspeak(confuz());
	return (FALSE);
    }
    return (TRUE);

}