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