page@swan.ulowell.edu (Bob Page) (02/02/89)
Submitted-by: ejkst@unix.cis.pittsburgh.edu (Eric J. Kennedy) Posting-number: Volume 89, Issue 12 Archive-name: fun/world.5 # This is a shell archive. # Remove everything above and including the cut line. # Then run the rest of the file through sh. #----cut here-----cut here-----cut here-----cut here----# #!/bin/sh # shar: Shell Archiver # Run the following text with /bin/sh to create: # helper.c # verbs1.c # This archive created: Mon Jan 30 18:06:46 1989 cat << \SHAR_EOF > helper.c #include <stdio.h> #include "parame.inc" #include "variab.h" #include "arrays.h" #include "qtext.inc" #define abs(A) ((A < 0) ? -A : A) #ifndef AMIGA # define Q1TEXT "/usr/games/lib/q1text.dat" #endif /* World C Version 1.00 copyright 1987 J.D.McDonald Use as you like for non-commercial purposes, but please leave this note, and document any changes you make as yours */ static int start = 0; int q1text_dat; static int debugflg = 1; static char filenm[] = "world.sav"; static short buffer[512]; static long filepos, oldpos; speak(point) int point; { /* * this is the main routine to output text from the data file the word * rtext(point) points to the proper record in the file */ int i, bi, t, kk; long z; if (start == 0) { start += 1; oldpos = -1; #ifndef AMIGA /* q1text.dat already opened in wbstuff.c */ q1text_dat = open(Q1TEXT, 0); #endif } z = (long) ((unsigned long) rtext[point]); filepos = z * 2 & ~1023l; if (filepos != oldpos) { oldpos = filepos; lseek(q1text_dat, filepos, 0); read(q1text_dat, buffer, 512*sizeof(short)); } bi = z & 511; do { kk = 0; while (1) { if (bi == 512) { oldpos += 1024; lseek(q1text_dat, oldpos, 0); read(q1text_dat, buffer, 512*sizeof(short)); bi = 0; } t = buffer[bi]; z++; bi++; if (t < 0) { t = -t; outst2[kk++] = t & 127; outst2[kk++] = t >> 8; } else { outst2[kk++] = (t % 32) + 96; outst2[kk++] = ((t >> 5) % 32) + 96; outst2[kk++] = t / 1024 + 96; if (outst2[kk - 3] == '{') { kmax = kk - 4; break; } } if (outst2[kk - 2] == '{') { kmax = kk - 3; break; } else if (outst2[kk - 1] == '{') { kmax = kk - 2; break; } } for (i = 0; i <= kmax; i++) { if (outst2[i] == '`') outst2[i] = ' '; if (outst2[i] == '|') outst2[i] = '.'; } if (wwflag == 0) linout(outst2, kmax + 1); } while (z < rtext[point + 1]); } vlocat(i, h) int i, h; { int k, p, r, nowir, xloc, xturn; /* * code for "l" or "locate" but NOT "look" gtext(2) points to short * descriptions in the location area of the text file, while gtext(1) * points to the long ones */ if (brfflg == 2 || i == 1 || ((locdat[loc] & 16384) == 0 && brfflg != 0) || (loc >= 101 && loc <= 116)) xloc = loc + gtext[1]; else xloc = loc + gtext[2]; speak(xloc); if (loc == 89) { if (easttm == 0) { speak(372); eastsc |= 1; } else if (easttm > 0 && easttm <= 50) { speak(373); eastsc |= 2; } else if (easttm == 51) speak(374); else { speak(375); eastsc |= 4; } } xturn = turns % 100; if (turns < 8) xturn = 8; if (h == 0) return; /* this section prints out the objects at "loc" */ for (k = 1; k <= OBJMAX; k++) { p = obimpr[k]; if (!((k <= MOVMAX && obloc[k] != loc) || (k > MOVMAX && (obw3[k] != loc && obw4[k] != loc)) || (k == HPUCK && loc == 38 && marflg[1]))) { r = (p / 8) % 8; if (r >= 1) { if ((p & 1) == 1) speak(odistb[k] + r); } if (!(obpprp[k] / 2048 == 0 && k != ZROBOT)) xcontn(k); } continue; } /* standing on something? */ if (spcloc == 1) speak(212); if (spcloc == 2) { if (dirty == 0) speak(509); else speak(510); } /* is the wire lying on the ground */ nowir = 1; for (i = 0; i < 6; i++) { if (wirelc[i] == loc) nowir = 0; } if (nowir == 0) speak(215); if ((loc == 76 || loc == 77 || loc == 79) && obloc[ZCAT] == 80) speak(280); /* flowers following sun */ if (loc == 86 && xturn > 6 && xturn < 69 && obimpr[ZSEED] > 4000) speak(341); /* vine describe */ if (loc == 74 && obimpr[ZVINE] == 9) { speak(339); obimpr[ZVINE] = 8201; } else if (loc == 74 && obimpr[ZVINE] == 8201) speak(259); } vinven() /* "inventory" */ { int carryn, wearn, i, k; carryn = 0; wearn = 0; if (wirelc[5] == 1000) carryn = 1; for (i = 1; i <= MOVMAX; i++) { if (obloc[i] == 1000) carryn = 1; if (obloc[i] == 3000) wearn = 1; } if (carryn == 1) { speak(62); xindnt += 2; if (wirelc[5] == 1000) speak(256); for (k = 1; k <= MOVMAX; k++) { if (obloc[k] != 1000) continue; speak(odistb[k]); if (obpprp[k] / 2048 != 0) xcontn(k); } xindnt -= 2; } if (wearn == 1) { speak(63); xindnt += 2; for (k = 1; k <= MOVMAX; k++) { if (obloc[k] != 3000) continue; speak(odistb[k]); if (obpprp[k] / 2048 != 0) xcontn(k); } xindnt -= 2; } if (carryn == 0 && wearn == 0) speak(64); nonext = 1; } xcontn(k) /* RECURSIVE FUNCTION */ int k; { int p, empty, k1; /* * list contents of a container * calls itself recursively to list things inside other containers */ /* RECURSIVE FUNCTION */ if (k == LFUNNE || k == MFUNNE || k == RFUNNE) return; p = obimpr[k]; if ((p & 2) == 0 || (obpprp[k] & 128) == 0) { empty = 1; for (k1 = 1; k1 <= MOVMAX; k1++) if (obloc[k1] == k + 2000) empty = 0; if (empty) { xindnt += 2; speak(odistb[k] + ((p / 512) % 8)); xindnt -= 2; } else { xindnt += 2; speak(odistb[k] + ((p / 512) % 8) + 1); xindnt += 2; for (k1 = 1; k1 <= MOVMAX; k1++) { if (obloc[k1] == k + 2000) { speak(odistb[k1]); if (obpprp[k1] / 2048 != 0) xcontn(k1); } } xindnt -= 4; } } else if ((p & 2) != 0 && (obpprp[k] & 128) != 0 && prepdo == IN) speak(386); } dbg() { char tmpstrq[80]; if(debugflg == 0) return; debugflg = 2; printf(" loc is %5d \n", loc); printf(" enter new loc "); gets(tmpstrq); sscanf(tmpstrq,"%d", &loc); } scorng() { int result, i, q, v, l, n, plce, xplc; result = 0; if (loc >= 153) return (0); result = (diesc - 3) * 2; if (result < 0) result = 0; if (cactsc == 1 || cactsc == 2) result += 2; if (cactsc == 3) result += 4; if ((eastsc & 1) != 0) result += 2; if ((eastsc & 2) != 0) result += 2; if ((eastsc & 4) != 0) result += 2; if(debugflg == 2) printf(" east+cact %5d out of 10\n",result); for (i = 1; i <= MOVMAX; i++) { q = obw4[i]; v = q / 4096; l = q - v * 4096; if (v == 0) continue; n = 0; itsher(i, &plce); if (i == GDISC) { if (plce != 0 && rvtim == 2) n = v; } else if (l >= 4000 && l - 4000 != obloc[i]) n = v; else if (l == 3000 && obloc[i] == 3000) n = v; else if (l == 1000 && (plce == 1 || plce == 3)) n = v; else if (l == 3000 && (plce == 1 || plce == 3)) n = v / 2; else if (l < 1000 && l == obloc[i]) n = v; else if (l > 2000 && l < 3000 && obloc[i] == l) { itsher((l - 2000), &xplc); if (xplc > 0 && xplc <= 3) n = v; } result += n; if(debugflg == 2)printf("obj %5d %5d points out of %5d\n",i,n,v); } if (deadf) result -= 5; if (result < 0) result = 0; result *= 5; return (result); } getrob(don, doa) int don, doa; { int result, i; /* * search table for object return object number if found and unambiguous * return 0 if not found return -1 if ambiguous */ for (i = 1; i <= OBJMAX; i++) { if (don != obnoun[i]) continue; if ((doa == abs(obadjv[i])) || (doa == 0 && obadjv[i] < 0)) return (i); else if (doa == 0 && obadjv[i] > 0) result = -1; else result = 0; } return (result); } static char sstring[] = "Your score is out of a total of in turns."; static int breakp[] = {0, 35, 70, 90, 130, 170, 210, 260, 330, 380, 450, 900}; scorpt(scor, mxsc) int scor, mxsc; { char cnum[4]; int i; numcvt(scor, cnum); sstring[14] = cnum[1]; sstring[15] = cnum[2]; sstring[16] = cnum[3]; numcvt(mxsc, cnum); sstring[36] = cnum[1]; sstring[37] = cnum[2]; sstring[38] = cnum[3]; numcvt(turns, cnum); sstring[43] = cnum[0]; sstring[44] = cnum[1]; sstring[45] = cnum[2]; sstring[46] = cnum[3]; linout(sstring, 54); for (i = 0; i < 10; i++) { if (scor >= breakp[i] && scor < breakp[i + 1]) break; } speak(481 + i); } numcvt(num, cnum) int num; char *cnum; { int lx, m; m = num / 1000; lx = (m) ? '0' + m : ' '; *cnum++ = lx; m = (num / 100) % 10; lx = (m == 0 && lx == ' ') ? ' ' : '0' + m; *cnum++ = lx; m = (num / 10) % 10; lx = (m == 0 && lx == ' ') ? ' ' : '0' + m; *cnum++ = lx; m = num % 10; *cnum = '0' + m; } robdsc() { int rempty, lempty, k; if (obloc[ZROBOT] >= 90 && obloc[ZROBOT] <= 95) speak(gtext[1] + obloc[ZROBOT]); else speak(226 + obloc[ZROBOT]); rempty = 1; lempty = 1; for (k = 1; k <= MOVMAX; k++) { if (obloc[k] == 2000 + ZROBOT) rempty = 0; if (obloc[k] == obloc[ZROBOT] && k != ZROBOT) lempty = 0; } if (rempty == 0) { speak(odistb[ZROBOT] + 5); for (k = 1; k <= MOVMAX; k++) { xindnt += 2; if (obloc[k] == 2000 + ZROBOT) speak(odistb[k]); xindnt -= 2; } } if (lempty == 0) { speak(350); for (k = 1; k <= MOVMAX; k++) { xindnt += 2; if (k != ZROBOT && obloc[k] == obloc[ZROBOT]) speak(odistb[k]); xindnt -= 2; } } if (obloc[ZROBOT] == 90 && (obloc[ZORCHI] == 2000 + ZROBOT || obloc[ZFLYTR] == 2000 + ZROBOT)) speak(353); } endsl() { #ifdef AMIGA ttclose(); /* dummy routine to maybe clear screen? */ #endif } vdead() { int i; /* * "you're dead,fred" it is incumbent on the calling routine to get to * where the body is supposed to lie, and to set oldloc and oldlc2 to * ,usually, 0 this routine sets deadf to .true. and drops all his * possessions where he is now */ eattim = 0; rdietm = 0; deadf = 1; for (i = 1; i <= MOVMAX; i++) if (obloc[i] == 1000 || obloc[i] == 3000) obloc[i] = loc; if (loc < 153) speak(55); else speak(552); nonext = 1; eolflg = 1; spcloc = 0; for (i = 0; i < 6; i++) if (wirelc[i] == 1000) wirelc[i] = loc; if (wirelc[0] != obloc[ZWIRE]) return; for (i = 0; i < 6; i++) wirelc[i] = 0; diesc += 1; } itsher(objt, plce) int objt; int *plce; { int n1; /* * this subroutine tells if an object is either: being carried plce=1 * being worn plce=2 inside something being carried,and not hidden * from view (3) at "loc" and not hidden (4) inside something at loc (5) */ *plce = 0; if (objt <= MOVMAX) { if (obloc[objt] == 1000) *plce = 1; else if (obloc[objt] == 3000) *plce = 2; else if (obloc[objt] == loc && (obimpr[objt] & 1) == 1) *plce = 4; else if (obloc[objt] > 2000 && obloc[objt] < 3000) { n1 = obloc[objt] - 2000; if (n1 <= MOVMAX) { if ((obloc[n1] == 1000 || obloc[n1] == 3000) && (obimpr[n1] & 2) == 0) *plce = 3; else if (obloc[n1] == loc && ((obimpr[n1] & 1) == 1) && ((obimpr[n1] & 2) == 0)) *plce = 5; else; } else if ((obw3[n1] == loc || obw4[n1] == loc) && ((obimpr[n1] & 1) == 1) && ((obimpr[n1] & 2) == 0)) *plce = 5; else; } else; } else if ((obw3[objt] == loc || obw4[objt] == loc) && ((obimpr[objt] & 1) == 1)) *plce = 4; } burden(ncarrd, nweigh, kcarrd, kweigh) int *ncarrd, *nweigh, *kcarrd, *kweigh; { int i; /* * calculate weight and number of objects on adventurer and in knapsack */ *ncarrd = 0; *nweigh = 0; for (i = 1; i <= MOVMAX; i++) { if (obloc[i] != 1000) continue; *ncarrd += 1; *nweigh += obw3[i] / 256; } *kcarrd = 0; *kweigh = 0; for (i = 1; i <= MOVMAX; i++) { if (i == ZKNAPS || obloc[i] != (2000 + ZKNAPS)) continue; *kcarrd += 1; *kweigh += obw3[i] / 256; } } getobj(don, doa) int don, doa; { /* * search table for object return object number if found and unambiguous * return 0 if not found return -1 if ambiguous */ int result, i, g1, g2, ggg, ddd, sum; int aplce, bplce, cplce, dplce, fplce, gplce, mplce, nplce, oplce, pplce; int splce, tplce; result = 0; for (i = 1; i <= OBJMAX; i++) { if (don != obnoun[i]) continue; if ((doa == abs(obadjv[i]) && doa != BEAUTI && doa != VENDIN) || (doa == 0 && obadjv[i] < 0)) { result = i; return (result); } else if ((doa == 0 && obadjv[i] > 0) || (doa == VENDIN && don == MACHIN) || (doa == BEAUTI && don == BIRD)) { if (don == FISH) { if (obloc[CFISH] != 0) result = CFISH; else result = DFISH; } else if (don == PANTS) { itsher(RPANT, &g1); itsher(LPANT, &g2); if (g1 != 0 && g2 == 0) result = RPANT; else if (g1 == 0 && g2 != 0) result = LPANT; else if ((wrdnum[0] == TAKE && prepdo == OFF) || wrdnum[0] == REMOVE) { if (g1 == 2) result = RPANT; else result = LPANT; } else if (wrdnum[0] == DROP) if (((g1 == 1) || (g1 == 3)) && g2 != 1 && g2 != 3) result = RPANT; if (((g2 == 1) || (g2 == 3)) && g1 != 1 && g1 != 3) result = LPANT; else result = -1; } else if (don == SHIRT) { itsher(RSHIRT, &g1); itsher(GSHIRT, &g2); if (g1 != 0 && g2 == 0) result = RSHIRT; else if (g1 == 0 && g2 != 0) result = GSHIRT; else if ((wrdnum[0] == TAKE && prepdo == OFF) || wrdnum[0] == REMOVE) { if (g1 == 2) result = RSHIRT; else result = GSHIRT; } else if (wrdnum[0] == DROP) { if (((g1 == 1) || (g1 == 3)) && g2 != 1 && g2 != 3) result = RSHIRT; if (((g2 == 1) || (g2 == 3)) && g1 != 1 && g1 != 3) result = GSHIRT; } else result = -1; } else if (don == DOOR) { if (loc == 41 || loc == 135) result = MDOOR; else if (loc == 85 || loc == 136) result = GDOOR; else if (loc == 47 || loc == 51) result = RDOOR; else if (loc == 165 || loc == 166) result = ODOOR; else if (loc == 173) result = PDOOR; else if (loc == 175) result = BDOOR; else result = -1; } else if (don == CARTRI) { itsher(ZCART, &tplce); itsher(CCART, &cplce); if (tplce > 0 && cplce <= 0) result = ZCART; else if (tplce <= 0 && cplce > 0) result = CCART; else result = -1; } else if (don == PHOTOG) { itsher(PPHOTO, &pplce); itsher(MPHOTO, &mplce); itsher(OPHOTO, &oplce); itsher(APHOTO, &aplce); itsher(FPHOTO, &fplce); pplce = (pplce < 1) ? pplce : 1; mplce = (mplce < 1) ? mplce : 1; oplce = (oplce < 1) ? oplce : 1; aplce = (aplce < 1) ? aplce : 1; fplce = (fplce < 1) ? fplce : 1; sum = pplce + mplce + oplce + aplce + fplce; { if (sum == 0) result = 0; else if (sum > 1) result = -1; else { if (pplce != 0) result = PPHOTO; if (mplce != 0) result = MPHOTO; if (oplce != 0) result = OPHOTO; if (aplce != 0) result = APHOTO; if (fplce != 0) result = FPHOTO; } } } else if (don == BIRD) { if (loc == 65 || loc == 66) result = RBIRD; else if (loc == 78 || loc == 79) result = XBIRD; else if (loc == 77 || loc == 80) result = YBIRD; else if (loc == 75 || loc == 76) result = ZBIRD; else result = 0; } else if (don == BUTTON) { if (loc == 146 || loc == 134) result = -1; else if (loc == 143) result = RDBUTT; else if (loc == 169) result = GBUTTO; else result = 0; } else if (don == CABLE || don == DISC) { if (don == CABLE) { ddd = DCABLE; ggg = GCABLE; } else { ddd = BDISC; ggg = GDISC; } itsher(ddd, &dplce); itsher(ggg, &gplce); if (dplce == 0 && gplce == 0) result = 0; else { if (wrdnum[0] == DROP) { if ((dplce == 1 || dplce == 3) && (gplce != 1 && gplce != 3)) result = ddd; else if ((gplce == 1 || gplce == 3) && (dplce != 1 && dplce != 3)) result = ggg; else result = -1; } else if (wrdnum[0] == TAKE) { if ((dplce == 4 || dplce == 5) && (gplce != 4 && gplce != 5)) result = ddd; else if ((gplce == 4 || gplce == 5) && (dplce != 4 && dplce != 5)) result = ggg; else result = -1; } else { if (gplce == 0 && dplce != 0) result = ddd; else if (dplce == 0 && gplce != 0) result = ggg; else result = -1; } } } else if (don == MACHIN) { if (loc == 153) result = PMACH; else if (loc == 156) result = TMACH; else if (loc == 158) result = NMACH; else if (loc == 160) result = SMACH; else if (loc == 162) result = MMACH; } else if (don == SLOT) { if (loc == 146) result = RSLOT; else if (loc == 156) result = TSLOT; else if (loc == 158) result = NSLOT; else if (loc == 160) result = SSLOT; else if (loc == 162) result = MSLOT; } else if (don == COIN) { if (loc < 153) result = SCOIN; else { itsher(SCOIN, &splce); itsher(BCOIN, &bplce); itsher(CCOIN, &cplce); itsher(NCOIN, &nplce); itsher(PCOIN, &pplce); pplce = (pplce < 1) ? pplce : 1; nplce = (nplce < 1) ? nplce : 1; cplce = (cplce < 1) ? cplce : 1; bplce = (bplce < 1) ? bplce : 1; splce = (splce < 1) ? splce : 1; sum = pplce + nplce + cplce + bplce + splce; if (sum == 0) result = 0; else if (sum > 1) result = -1; else { if (splce != 0) result = SCOIN; if (bplce != 0) result = BCOIN; if (cplce != 0) result = CCOIN; if (nplce != 0) result = NCOIN; if (pplce != 0) result = PCOIN; } } } else result = -1; return (result); } } return (result); } static char strng1[] = " I can't do that to item on your list."; static char strng2[] = " Item number on your list is ambiguous"; cnvobj() { char cnum[4]; int result, many, i, k, n, p, z; /* * this routine searches the list of objects and compares with the list * of d.o.'s if an object exists and is unambiguous it's entry in dobjs * is replaced by its object number otherwise its entry in dobjs is set * to zero the entries in dobsj are then squeezed up if the result was * totally unambiguous cnvobj is .true. */ result = 1; n = 0; if (allflg) n = 1; many = 0; if ((butflg && dobjs[2] != 0) || ((!butflg) && dobjs[1] != 0)) many = 1; k = 0; z = -1; for (i = n; i < 12; i++) { k += 1; if (dobjs[i] == 0) break; p = getobj(dobjs[i], doadjs[i]); if (p > 0) { z += 1; dobjs[z] = p; } else if (p == 0) { if (many == 1) { numcvt(k, cnum); strng1[28] = cnum[2]; strng1[29] = cnum[3]; linout(strng1, 44); } else speak(422); } else { result = 0; if (many == 1) { numcvt(k, cnum); strng2[16] = cnum[2]; strng2[17] = cnum[3]; linout(strng2, 44); } else speak(70); speak(250); } } while (++z < 30) dobjs[z] = 0; return (result); } getall() { int temp[30], i, k, d, m; /* * routine to get "all" or "all but" objects it only works on moveable * objects because the only verbs which call it work only on those * objects (drop,take, put) */ for (i = 0; i < 30; i++) { temp[i] = dobjs[i]; dobjs[i] = 0; } k = 0; for (i = 1; i <= MOVMAX; i++) { itsher(i, &d); if (d == 0) continue; for (m = 0; m < 30; m++) if (temp[m] == i) goto endloop; if (k == 29) { speak(106); return; } dobjs[k++] = i; endloop: ; } } rdinit() { long t; long tloc; long time(); int ti; t = time(&tloc); ti =( (int) t) & 32767; srand(ti); } qrand() { return ((rand() & 16383) / 4); } pct(q) int q; { int j; j = rand(); return ((q * 327) > (j & 32767)); } yesx(spk) int spk; { char ans[90]; /* ask question, and wait for reply from him */ speak(spk); more = 0; while (1) { linout("?", 2001); gets(ans); more = 1; if (strcmp(ans, "Y") == 0 || strcmp(ans, "YES") == 0 || strcmp(ans, "y") == 0 || strcmp(ans, "yes") == 0) return (1); else if (strcmp(ans, "N") == 0 || strcmp(ans, "NO") == 0 || strcmp(ans, "n") == 0 || strcmp(ans, "no") == 0) return (0); else speak(102); } } getln() { /* write a prompt, then read a line from the terminal */ int i, lastpos; linout("> ", 7001); gets(inbuf); eolflg = 0; lastpos = strlen(inbuf); lastpos = (lastpos > 78) ? 78 : lastpos; for (i = lastpos; i < 83; i++) inbuf[i] = '.'; more = 1; inbuf[127] = (char)lastpos; } carerr(x, z) int x, z; { /* * this nifty routine put a caret on the terminal at the indicated * position of a line and then outputs a message */ /* if not the first sentence on a line, rewrite line. */ if (clause != 1) { linout(" ", 1001); linout(inbuf, inbuf[127]); } if (x > 0) { xindnt = x; linout("^", 1); xindnt = 0; } else { if (clause != 1) { xindnt = lptr - 1; linout("*", 1); xindnt = 0; speak(423); } } speak(z); } linout(ustring, num) char *ustring; int num; { int num1, i; char buff[80]; char *cptr; cptr = buff; num1 = num % 1000; for (i = 0; i < xindnt; i++) *cptr++ = ' '; for (i = 0; i < num1; i++) *cptr++ = *ustring++; *cptr++ = '\0'; if (num < 1000) { if(more == 19 && nomor == 0) { i = strlen(buff); for( ; i < 73; i++) buff[i] = ' '; strcpy(&buff[73],"MORE"); printf("%1s", buff); gets(buff); more = 0; } else { printf("%1s\n", buff); more += 1; } } else printf("%1s", buff); } vsuspe(inout) int inout; { short sbuffer[256]; int result, filedes, i, iret; short *sbptr, *iptr; result = 0; if (inout != 1) { /* "suspend" or "save" */ filedes = creat(filenm, 0600); if (filedes == -1) { linout("I failed to create your save file.", 34); return (result); } sbptr = sbuffer; *sbptr++ = horflg; for (i = 0; i < 6; i++) *sbptr++ = wirelc[i]; *sbptr++ = turns; *sbptr++ = loc; *sbptr++ = oldloc; *sbptr++ = oldlc2; *sbptr++ = brfflg; *sbptr++ = deadf; *sbptr++ = dirty; *sbptr++ = nonext; *sbptr++ = spcloc; *sbptr++ = fshlif; *sbptr++ = noshoe; *sbptr++ = daytim; *sbptr++ = martim; for (i = 0; i < 9; i++) *sbptr++ = marflg[i]; *sbptr++ = oextim; *sbptr++ = rdietm; *sbptr++ = rvtim; *sbptr++ = gvtim; *sbptr++ = eattim; *sbptr++ = easttm; *sbptr++ = filmtm; *sbptr++ = screef; *sbptr++ = eastsc; *sbptr++ = cactsc; *sbptr++ = diesc; *sbptr++ = filmst; *sbptr++ = machst; *sbptr++ = dial1; *sbptr++ = dial2; *sbptr++ = dial1x; *sbptr++ = dial2x; *sbptr++ = bonus; *sbptr++ = jackpo; *sbptr++ = lpill; *sbptr++ = pbstat; *sbptr++ = decset; *sbptr++ = raset; *sbptr++ = dcombi; *sbptr++ = chaset; *sbptr++ = guardl; *sbptr++ = fimage; write(filedes, sbuffer, 64*sizeof(short)); sbptr = sbuffer; iptr = locdat; for (i = 0; i <= LOCNUM; i++) *sbptr++ = *iptr++; write(filedes, sbuffer, 256*sizeof(short)); sbptr = sbuffer; iptr = obimpr; for (i = 0; i <= OBJMAX; i++) *sbptr++ = *iptr++; write(filedes, sbuffer, 256*sizeof(short)); sbptr = sbuffer; iptr = obloc; for (i = 0; i <= OBJMAX; i++) *sbptr++ = *iptr++; write(filedes, sbuffer, 256*sizeof(short)); close(filedes); return (result); } else { /* "restore" */ filedes = open(filenm, 0); if (filedes == -1) goto lab1; iret = read(filedes, sbuffer, 64*sizeof(short)); if (iret != 64*sizeof(short)) goto lab1; sbptr = sbuffer; horflg = *sbptr++; for (i = 0; i < 6; i++) wirelc[i] = *sbptr++; turns = *sbptr++; loc = *sbptr++; oldloc = *sbptr++; oldlc2 = *sbptr++; brfflg = *sbptr++; deadf = *sbptr++; dirty = *sbptr++; nonext = *sbptr++; spcloc = *sbptr++; fshlif = *sbptr++; noshoe = *sbptr++; daytim = *sbptr++; martim = *sbptr++; for (i = 0; i < 9; i++) marflg[i] = *sbptr++; oextim = *sbptr++; rdietm = *sbptr++; rvtim = *sbptr++; gvtim = *sbptr++; eattim = *sbptr++; easttm = *sbptr++; filmtm = *sbptr++; screef = *sbptr++; eastsc = *sbptr++; cactsc = *sbptr++; diesc = *sbptr++; filmst = *sbptr++; machst = *sbptr++; dial1 = *sbptr++; dial2 = *sbptr++; dial1x = *sbptr++; dial2x = *sbptr++; bonus = *sbptr++; jackpo = *sbptr++; lpill = *sbptr++; pbstat = *sbptr++; decset = *sbptr++; raset = *sbptr++; dcombi = *sbptr++; chaset = *sbptr++; guardl = *sbptr++; fimage = *sbptr++; iret = read(filedes, sbuffer, 256*sizeof(short)); if (iret != 256*sizeof(short)) goto lab1; sbptr = sbuffer; iptr = locdat; for (i = 0; i <= LOCNUM; i++) *iptr++ = *sbptr++; iret = read(filedes, sbuffer, 256*sizeof(short)); if (iret != 256*sizeof(short)) goto lab1; sbptr = sbuffer; iptr = obimpr; for (i = 0; i <= OBJMAX; i++) *iptr++ = *sbptr++; iret = read(filedes, sbuffer, 256*sizeof(short)); if (iret != 256*sizeof(short)) goto lab1; sbptr = sbuffer; iptr = obloc; for (i = 0; i <= OBJMAX; i++) *iptr++ = *sbptr++; close(filedes); result = 1; chaser = 0; linout(" ", 1); return (result); } lab1: linout("Restore failed.", 15); return (result); } SHAR_EOF cat << \SHAR_EOF > verbs1.c #include "parame.inc" #include "variab.h" #include "arrays.h" /* World C Version 1.00 copyright 1987 J.D.McDonald Use as you like for non-commercial purposes, but please leave this note, and document any changes you make as yours */ vattac() { int i, spk, cplce, n, plce; /* * "attach" or "tie" not "attack" a mess since it involves the wire */ if (dobjs[0] == CABLE && iobj == ANTENN) { if (loc != 69) spk = 379; else if (obloc[GCABLE] == 2000 + ZANTEN || obloc[DCABLE] == 2000 + ZANTEN) spk = 381; else { n = getobj(dobjs[0], doadjs[0]); if (n <= 0) spk = 70; else { itsher(n, &cplce); if (cplce != 1 && cplce != 3 && cplce != 4) spk = 380; else { obloc[n] = 2000 + ZANTEN; spk = 75; } } } } else if (dobjs[0] != WIRE) spk = 48; else if (iobj == TREE || iobj == LOG || iobj == STOOL) spk = 204; else if (iobj != KNOB && iobj != TOWER) spk = 48; else { itsher(ZWIRE, &plce); if (plce == 0) spk = 213; else if (iobj == TOWER) { if (loc != 48) spk = 205; else { spk = 75; obloc[ZWIRE] = loc; /* -57=177707 octal */ obimpr[ZWIRE] = (obimpr[ZWIRE] & -57) + 24; for (i = 0; i < 6; i++) wirelc[i] = 1000; } } else { if (loc != 42) spk = 206; else if (spcloc == 1) { spk = 75; obloc[ZWIRE] = loc; /* ~56=177707 octal */ obimpr[ZWIRE] = (obimpr[ZWIRE] & ~56) + 32; for (i = 0; i < 6; i++) wirelc[i] = 1000; } else spk = 207; } } speak(spk); } vattak() { int spk; spk = 286; if (dobjs[0] == VINE && loc == 74 && (obimpr[ZVINE] & 56) == 8) { spk = 306; if (pct(33)) spk = 302; else if (pct(50)) spk = 305; } else if (dobjs[0] == GUARD) { if (loc == guardl || loc == 171 || (chaset != 0 && chaset <= 9)) spk = 562; else spk = 561; } else if (dobjs[0] == MARTIA && loc >= 27 && loc <= 51) spk = 307; else if (dobjs[0] == ROBOT || dobjs[0] == FERRET) spk = 285; speak(spk); } vbreak() { int j, hplce, xplce; if (iobj != 0 && iobj != HAMMER && iobj != BOULDE) { speak(48); return; } if (iobj == HAMMER) { itsher(ZHAMME, &hplce); if (hplce == 0) { speak(329); return; } } if (iobj == BOULDE) { speak(330); return; } if (dobjs[0] == LOUVER && (loc == 98 || loc == 142)) { speak(282); obimpr[ZLOUVE] = 9; if (iobj == HAMMER) obloc[ZHAMME] = 1000; return; } if (dobjs[0] == FERRET || dobjs[0] == ROBOT || dobjs[0] == MARTIA || dobjs[0] == CAT || dobjs[0] == FISH) { speak(286); return; } if (dobjs[0] == GUARD) { if (loc == guardl || loc == 171 || (chaset != 0 && chaset <= 9)) speak(562); else speak(561); return; } j = getobj(dobjs[0], doadjs[0]); if (j == -1) { speak(70); return; } else { itsher(j, &xplce); if (xplce == 0) speak(66); else if (j > MOVMAX) speak(332); else if (dobjs[0] == WIRE || dobjs[0] == KNAPSA || dobjs[0] == SHIRT || dobjs[0] == PANTS || dobjs[0] == BOULDE || dobjs[0] == PUCK || dobjs[0] == LATEX || dobjs[0] == NUGGET || dobjs[0] == KNIFE || dobjs[0] == BEAD) { speak(48); return; } else if ((dobjs[0] == KEY || dobjs[0] == SAPPHI || dobjs[0] == DIAMON || dobjs[0] == SPHERE) && iobj != HAMMER) speak(385); else if (j == ZSEED) { if (loc != 131 && loc != 99 && loc != 100) { speak(337); obimpr[ZSEED] = 0; } else if (loc != 100) { speak(338); obimpr[ZSEED] = 0; } else { speak(340); obimpr[ZSEED] = 3; /* seed function here */ } obloc[ZSEED] = 0; } else if (j == ZSTATU && loc == 99 && obloc[j] == 99) speak(89); else if (j == CEGG) { speak(480); obloc[CEGG] = 0; obloc[SCOIN] = loc; } else { speak(331); if (j == GSPHER) { speak(333); obloc[ZBEAD] = obloc[j]; } if (obloc[j] == 2000 + RSLOT) obimpr[RSLOT] = 9; obloc[j] = 0; } } } vdig() { int splce, pplce; if (dobjs[0] != 0 && dobjs[0] != SHOVEL && dobjs[0] != PITCHF) speak(48); else if (loc != 73) speak(284); else { itsher(ZSHOVE, &splce); itsher(ZPITCH, &pplce); if ((dobjs[0] == SHOVEL && splce != 0) || (dobjs[0] == PITCHF && pplce != 0) || (dobjs[0] == 0 && (splce > 0 || pplce > 0))) { if (obimpr[RHOLE] != 17) speak(283); else speak(434); obimpr[RHOLE] = 17; } else if ((dobjs[0] == SHOVEL && splce == 0) || (dobjs[0] == PITCHF && pplce == 0)) speak(89); else speak(234); } } vdrink() { int spk; /* pervert!!!! */ if (dobjs[0] == NPISS) { dirty += 1; spk = 183; } /* water is o.k. */ else if (dobjs[0] == WATER) { if ((locdat[loc] & 1024) == 1024) spk = 184; else spk = 74; } else spk = 48; speak(spk); } vdrop() { int d, i, ambig, ddflg, empty, plce, plural, kkwr, kk, spk; /* special code for "drop something into bowl" */ if (prepio != 0 && !(prepio == IN && iobj == BOWL)) { speak(28); return; } /* convert dobjs(1) (noun) list into list of objects (pointers) */ ambig = !cnvobj(); if (allflg) getall(); for (i = 0; i < 30; i++) { ddflg = 0; empty = 1; d = dobjs[i]; if (d == 0) continue; /* see if it is here */ itsher(d, &plce); if (allflg && ((plce != 1 && plce != 2) || d > MOVMAX)) continue; if (dobjs[1] != 0 || allflg) speak(odistb[d]); plural = (obpprp[d] & 256) == 256; if (d > MOVMAX) spk = 48; else if (plce == 2) { spk = 88; if (plural) spk = 194; } else if (d == ZWIRE && plce != 1) { for (kkwr = 0; kkwr < 6; kkwr++) if (wirelc[kkwr] == 1000) wirelc[kkwr] = loc; if (obloc[d] == loc && wirelc[5] == loc) { for (kkwr = 0; kkwr < 6; kkwr++) wirelc[kkwr] = 0; } spk = 82; } else if (plce == 0 || plce == 4 || plce == 5) { spk = 89; if (plural) spk = 195; } else if (d == ZSEED && (wrdnum[0] == DROP || wrdnum[0] == THROW)) { if (loc == 100) { spk = 340; obimpr[ZSEED] = 0; } else if (loc == 131 || loc == 99) { spk = 338; obimpr[ZSEED] = 3; } else { obimpr[ZSEED] = 0; spk = 337; } obloc[ZSEED] = 0; } else if (d == CFISH && obloc[d] == (2000 + PLBAG) && (obimpr[PLBAG] / 512 == 5)) spk = 76; /* * code for knocking the puck out of the arena loc38 is center of * bowl, 23-37 are the rim */ else if (iobj == BOWL) { if (loc < 32 || loc > 38) spk = 156; else { if (d == RBOULD && loc != 38) { itsher(RBOULD, &plce); /* marflg[1] tells if martians are there */ if (marflg[1]) { speak(157); vdead(); oldloc = 0; oldlc2 = 0; return; } else { if (obloc[HPUCK] == 38) { /* * the next line tells if other rim is low or * high */ if ((loc & 1) == 1) { /* we shoot the puck out */ spk = 158; obloc[RBOULD] = 38; obloc[HPUCK] = loc + 3; if (obloc[HPUCK] > 37) obloc[HPUCK] -= 6; } else { spk = 159; obloc[RBOULD] = 38; } } else { /* in this case it settles back in */ if ((loc & 1) == 1) { spk = 160; obloc[RBOULD] = loc + 3; if (obloc[RBOULD] > 37) obloc[RBOULD] -= 6; } else { spk = 161; obloc[RBOULD] = 38; } } /* smash the other items in the bowl */ for (kk = 1; kk <= MOVMAX; kk++) { if (kk == RBOULD || kk == HPUCK) continue; if (obloc[kk] == 38) { obloc[kk] = 0; empty = 0; } } } } else { spk = 75; obloc[d] = 38; ddflg = 1; } } } else { if (d == ZCAT) spk = 334; else if (d == RBOULD) spk = 335; else if (d == ZORCHI && loc == 87) spk = 432; else if (d == ZFLYTR && loc == 87) spk = 433; else spk = 82; obloc[d] = loc; ddflg = 1; } if (d == ZLATEX && ddflg == 1) obimpr[d] = 337; xindnt += 2; speak(spk); xindnt -= 2; if (empty != 1) { xindnt += 4; speak(162); xindnt -= 4; } } } veat() { int d, l, spk, plce; /* don't eat shit */ if (dobjs[0] == NSHIT) { dirty += 1; spk = 179; } /* id love for you to do it, but please don't make mama mad */ else if (dobjs[0] == ME) { dirty += 1; spk = 183; } else { d = getobj(dobjs[0], doadjs[0]); /* see if its here */ if (d <= 0) { speak(48); return; } itsher(d, &plce); if (plce <= 0) { spk = 66; if ((obpprp[d] & 256) == 256) spk = 185; } else { /* poison! */ if ((obpprp[d] & 8) == 8) { if (d == CFISH && obloc[d] == (2000 + PLBAG) && (obimpr[PLBAG] / 512 == 5)) { speak(76); return; } speak(181); oldloc = 0; oldlc2 = 0; if (d <= MOVMAX) obloc[d] = 0; vdead(); return; } /* it's edible, and delicious */ else if ((obpprp[d] & 4) == 4) { spk = 180; if (d <= MOVMAX) obloc[d] = 0; if (d != BBALL) eattim = 0; if (d == CEGG) { spk = 478; obloc[SCOIN] = 1000; } if (d == LETTUC) eattim = 150; if (d == BBALL) { lpill = 1; spk = 522; bonus += 5; dcombi = (qrand() % 31); if (dcombi == 0) dcombi = 1; l = (qrand() % 31); if (l == 0) l = 22; dcombi = dcombi * 32 + l; l = (qrand() % 31); if (l == 0) l = 3; dcombi = dcombi * 32 + l; } /* inedible */ } else spk = 182; } } speak(spk); } vfill() { int result, z, z2, spk, i, empty, plce; result = 0; z = dobjs[0]; spk = 48; if (dobjs[0] == FUNNEL && iobj == WATER) { result = 1; dobjs[0] = WATER; iobj = FUNNEL; ioadj = doadjs[0]; doadjs[0] = 0; prepio = IN; return (result); } if (dobjs[0] == TUBE) { speak(494); return (result); } /* fill the bag or bucket with water or latex */ empty = 1; if (z == BUCKET) { for (i = 1; i <= OBJMAX; i++) if (obloc[i] == 2039) empty = 0; } if (z == BUCKET && iobj == LATEX && obloc[ZLATEX] == 66 && prepio == WITH && loc == 66) { if (obimpr[ZBUCKE] == 1033) spk = 274; else if (empty == 0) spk = 275; else { obloc[ZLATEX] = 2000 + ZBUCKE; obimpr[ZBUCKE] = 1545; obimpr[ZLATEX] = 265; spk = 75; } } else if ((z == BAG && (doadjs[0] == 0 || doadjs[0] == PLASTI)) || (z == BUCKET && doadjs[0] == 0)) { if ((prepio == WITH && iobj == WATER) || (((locdat[loc] & 1024) == 1024) && prepio == 0 && iobj == 0)) { z2 = ZBUCKE; if (z == BAG) z2 = PLBAG; itsher(z2, &plce); if (plce == 0) spk = 73; else if ((locdat[loc] & 1024) != 1024 && ((obloc[ZBUCKE] != loc && obloc[ZBUCKE] != 1000) || obimpr[ZBUCKE] != 1033)) spk = 74; else if (empty == 1) { if (z2 == PLBAG) obimpr[z2] = 2697; else obimpr[z2] = 1033; spk = 75; obloc[z2] = 1000; } else spk = 275; } else if (iobj == 0) spk = 278; } speak(spk); return (result); } vfuck() { if (dirty < 10) speak(495); else if (dirty > 20) speak(497); else speak(496); } vget() { int spk, result; result = 0; spk = 0; if (prepdo == IN && dobjs[0] == CHAIR && (loc == 166 || loc == 175)) { spcloc = 2; spk = 510; } /* get up is a joke */ else if (prepdo == UP) { if (dobjs[0] == 0 && spcloc == 2) { spk = 511; spcloc = 0; } else spk = 208; } /* get on or off glass plate */ else if (dobjs[0] == GLASS && (doadjs[0] == 0 || doadjs[0] == GLASS) && dobjs[1] == 0) { if (prepdo == OFF && spcloc == 1) { spcloc = 0; spk = 75; } else if (prepdo == ON && spcloc == 0) { spcloc = 1; spk = 75; } } /* get something means take it */ else if (prepdo == ON || prepdo == OFF) spk = 71; else result = 1; /* this results in calling vtake */ if (spk != 0) speak(spk); return (result); } vgive() { int spk, ij, iplce, dj, dplce; spk = 0; if (iobj == ME) spk = 445; else if (iobj == GUARD) { if (loc == guardl || loc == 171 || (chaset != 0 && chaset <= 9)) spk = 562; else spk = 561; } else if (iobj == MARTIA) { if (martim == 7 && loc >= 27 && loc <= 51) spk = 446; else spk = 168; } else if (iobj == FERRET && !(loc == 131 || loc == 99 || loc == 100)) spk = 447; else if (iobj != CAT && iobj != BIRD && iobj != BEES && iobj != FROG && iobj != ROBOT) spk = 448; else { ij = getobj(iobj, ioadj); if (iobj == BIRD && ij < 0) ij = YBIRD; itsher(ij, &iplce); if (iplce == 0) { if (iobj == CAT) spk = 449; else if (iobj == BEES) spk = 450; else if (iobj == FROG) spk = 451; else if (iobj == ROBOT) spk = 452; else if (iobj == BIRD) spk = 453; } else { if (iobj == FROG) spk = 454; else if (iobj == BIRD) spk = 455; } } if (spk != 0) { speak(spk); return; } dj = getobj(dobjs[0], doadjs[0]); if (dj < 0) spk = 70; else if (dj == 0) spk = 28; else { itsher(dj, &dplce); if (dplce == 0) { if ((obimpr[dj] & 256) != 0) spk = 185; else spk = 89; } else if (obloc[dj] == 2000 + ij) spk = 456; else if (dj > MOVMAX) spk = odistb[dj + 1] - 1; else if (dplce > 3) spk = 458; else; } if (spk != 0) { speak(spk); return; } /* at this point you have it, and someone is here to take it. */ if (iobj == CAT) { if (dobjs[0] == FISH) { spk = 459; obloc[dj] = 0; } else if ((obpprp[dj] & 12) != 0) spk = 460; else spk = 461; } else if (iobj == FERRET) { if (dobjs[0] == EGG || dobjs[0] == FISH || dobjs[0] == CAT) { spk = 462; obloc[dj] = 0; } else if ((obpprp[dj] & 12) != 0) spk = 464; else { spk = 463; obloc[dj] = 0; } } else if (iobj == BEES) { if (iobj != ORCHID && iobj != FLYTRA) spk = 465; else if (iobj == ORCHID) { spk = 432; obloc[dj] = loc; } else { spk = 433; obloc[dj] = loc; } } else if (iobj == ROBOT) { if (obloc[ZCART] != RSLOT + 2000 && obloc[CCART] != RSLOT + 2000) spk = 466; else if (obw3[dj] / 256 > 1 || (obw3[dj] & 255) > 2) spk = 352; else { spk = 345; obloc[dj] = 2000 + ZROBOT; } } speak(spk); } vhelp() { speak(105); } vkiss() { int result, spk, cplce; /* if vkiss ends up 1, call vpush */ result = 0; if (dobjs[0] == FROG && loc == 67) spk = 468; else if (dobjs[0] == GUARD) { if (loc == guardl || loc == 171 || (chaset != 0 && chaset <= 9)) spk = 562; else spk = 561; } else if (dobjs[0] == FERRET && (loc == 131 || loc == 100 || loc == 99)) spk = 469; else if (dobjs[0] == CAT) { itsher(ZCAT, &cplce); if (cplce != 0) spk = 470; else spk = 449; } else if (dobjs[0] == ME) spk = 471; else if (dobjs[0] == BIRD || dobjs[0] == BEES || dobjs[0] == ROBOT) spk = 472; else result = 1; if (result == 0) speak(spk); return (result); } vlocks() { int n, plce, spk; n = getobj(dobjs[0], doadjs[0]); if (n < 0) spk = 70; else if (n == 0) spk = 28; else if ((obpprp[n] & 512) != 512 && n != ZBOX) spk = 233; else { itsher(n, &plce); if (plce <= 0) { if (dobjs[0] == DOOR) spk = 225; else spk = 66; } else if (n == ZBOX) spk = 389; else if (n == ODOOR || n == PDOOR) spk = 524; else if (prepio == WITH && iobj == KEY) { if (n == RDOOR || (n == MDOOR && loc == 41)) spk = 235; else if (n == MDOOR || n == GDOOR) { if (wrdnum[0] == LOCK) obimpr[n] |= 4; else obimpr[n] = (obimpr[n] & ~4); /* ~4=177773 octal */ spk = 75; } else spk = 48; } else spk = 234; } speak(spk); } static char strng3[] = "The left dial is set to and the right to ."; static char strng4[] = "are for the left and for the right."; vlooks() /* * look or examine */ { char cnum[4]; int kk, zplce, spk, kkwr, lwire, n, plce, u, empty; if ((prepdo == THROUG && dobjs[0] == TELESC && wrdnum[0] == LOOK) || (wrdnum[0] == EXAMIN && dobjs[0] == PLANET && prepio == WITH && iobj == TELESC)) { if (loc >= 175 && loc <= 181) spk = loc + 326; else if (loc == 184 || loc == 187) spk = 507; else spk = 48; speak(spk); return; } if ((loc >= 43 && loc <= 45) && (dobjs[0] == HOLE || dobjs[0] == DOOR)) { if (daytim == 1) speak(173); else speak(174); return; } if (dobjs[0] == HOUSE && (doadjs[0] == 0 || doadjs[0] == DOLL) && prepdo == IN) { if (loc != 132) speak(481); else if (obimpr[CEGG] > 4096) { speak(479); obloc[CEGG] = 132; } else speak(480); return; } /* you can't examine things at night unless they glow */ if (daytim == 0 && dobjs[0] != SPHERE) { speak(120); return; } if (wrdnum[0] == EXAMIN) prepdo = AT; if (dobjs[0] == TELESC) { if ((loc >= 175 && loc <= 181) || loc == 184 || loc == 187) speak(534); else speak(535); return; } /* if you look behind horsetails, there is a cave */ if (prepio == 0 && prepdo == BEHIND && loc == 169 && dobjs[0] == CABINE) { speak(523); return; } if (prepio == 0 && prepdo == BEHIND && loc == 24) { if (dobjs[0] == HORSET) { speak(119); horflg = 1; return; } else if (dobjs[0] == WATERF) { speak(493); horflg = 1; return; } } /* * in the (hockey) bowl you can only see if something is there, not what * it is */ if (prepdo == IN && dobjs[0] == BOWL && (loc >= 32 && loc <= 37)) { empty = 1; for (kk = 1; kk <= MOVMAX; kk++) if (obloc[kk] == 38) empty = 0; if (empty == 1) speak(7); else speak(163); return; } if ((loc == 28) && (dobjs[0] == STOOLS || dobjs[0] == STOOL || dobjs[0] == BOWL) && (doadjs[0] == 0 || doadjs[0] == CERAMI)) { speak(176); return; } /* various martian things */ if (loc == 42 && (dobjs[0] == STOOLS || dobjs[0] == BOWL)) { speak(177); spcloc = 0; return; } if (loc == 30 && (dobjs[0] == BUILDI || dobjs[0] == WINDOW) && prepdo == IN) { speak(174); return; } if (dobjs[0] == CACTUS && loc == 82 && wrdnum[0] == EXAMIN) { if (pct(25) && (cactsc & 2) == 0) { speak(371); cactsc += 2; if (cactsc == 3) speak(439); } else if ((cactsc & 1) == 0) { speak(370); cactsc += 1; if (cactsc == 3) speak(439); } else speak(237); return; } if (dobjs[0] == DIAL) { itsher(ZBOX, &zplce); if (zplce == 0) speak(388); else { numcvt(dial1, cnum); strng3[24] = cnum[1]; strng3[25] = cnum[2]; strng3[26] = cnum[3]; numcvt(dial2, cnum); strng3[45] = cnum[1]; strng3[46] = cnum[2]; strng3[47] = cnum[3]; linout(strng3, 49); } return; } /* * special code for anything other than "look at object" or "look in * container" gotes above here */ n = getobj(dobjs[0], doadjs[0]); if (prepio != 0 || (prepdo != AT && prepdo != IN)) { speak(94); return; } if (n == 0) { speak(95); return; } else if (n < 0) { speak(70); return; } itsher(n, &plce); lwire = 0; /* special code for wire in several places at once */ if (n == ZWIRE) { for (kkwr = 0; kkwr < 6; kkwr++) if (wirelc[kkwr] == loc) lwire = 1; } if (plce < 1 && !lwire) { if ((obpprp[n] & 256) == 256) speak(185); else speak(66); return; } if (plce < 1 && n == ZWIRE && lwire) { speak(215); return; } /* the generic "look at" processor */ if (prepdo == AT) { u = (obimpr[n] / 64 % 8); if (u == 0) { if ((obpprp[n] & 256) == 256) speak(193); else speak(96); } /* zzzzzzap if not standing on glass while looking at knob */ else if ((n == ZSTOOL || n == ZKNOB) && spcloc == 1) speak(237); else if (n == ZANTEN) { if (obloc[DCABLE] == 2000 + ZANTEN) { speak(odistb[n] + 1); obimpr[DCABLE] = 137; } else if (obloc[GCABLE] == 2000 + ZANTEN) speak(odistb[n] + 2); else speak(odistb[n] + 3); } else { if ((n == MMAP || n == NNEWS || n == TMACH || n == NNOTE ) && loc >= 153 && lpill == 1) u += 1; speak(odistb[n] + u); if (n == NNOTE && lpill == 1) nreadx(); if (n == ZSCREE && obimpr[n] == 145 && loc == 146) robdsc(); if (dobjs[0] == BOX) { numcvt(dial1, cnum); strng3[24] = cnum[1]; strng3[25] = cnum[2]; strng3[26] = cnum[3]; numcvt(dial2, cnum); strng3[45] = cnum[1]; strng3[46] = cnum[2]; strng3[47] = cnum[3]; linout(strng3, 49); } if (dobjs[0] == FILM && obimpr[ZFILM] == 201) { wwflag = 1; speak(odistb[fimage]); wwflag = 0; outst2[0] |= 32; outst2[kmax] = '.'; outst2[kmax+1] = '\0'; linout(outst2, kmax+1); if (fimage == ZBOX) { speak(404); numcvt(dial1x, cnum); strng4[4] = cnum[1]; strng4[5] = cnum[2]; strng4[6] = cnum[3]; numcvt(dial2x, cnum); strng4[25] = cnum[1]; strng4[26] = cnum[2]; strng4[27] = cnum[3]; linout(strng4, 49); } } /* * special code for flags set by looking at or in object goes * below here */ if (n == PPHOTO) horflg = 1; } } if (obpprp[n] / 2048 != 0) xcontn(n); else if (prepdo == IN) speak(97); return; } vopen() { int spk, n, plce; if (prepdo != 0 && prepio != 0) spk = 21; /* there is no door on the bar to open or close */ else if ((loc == 30 || loc == 42) && dobjs[0] == DOOR) spk = 224; /* open doors or containers */ else { n = getobj(dobjs[0], doadjs[0]); if (dobjs[0] == DOOR && (loc == 184 || loc == 187 || (loc >= 176 && loc <= 181))) n = BDOOR; if (n < 0) spk = 70; else if (n == 0) spk = 66; /* if they can be opened */ else if ((obpprp[n] % 2) != 1) { if (obpprp[n] / 2048 != 0) spk = 254; else spk = 230; } else { itsher(n, &plce); if (dobjs[0] == DOOR && (loc == 184 || loc == 187 || (loc >= 176 && loc <= 181))) plce = 5; if (plce <= 0) { if (dobjs[0] == DOOR) spk = 225; else spk = 66; } /* and aren't locked ,but are closed */ else if ((obimpr[n] & 4) == 4) { if (n == ZBOX) spk = 389; else spk = 228; } else if ((obimpr[n] & 2) == 0) spk = 226; else if (dobjs[0] == DOOR && (loc <= 180 && loc >= 176)) spk = 546; else if (dobjs[0] == CABINE && adverb != CAREFU && adverb != QUIETL) spk = 553; else { spk = 231; obimpr[n] = (obimpr[n] & ~2); /* ~2=177775 octal */ if (n == RDOOR || n == MDOOR || n == GDOOR || n == ODOOR || n == BDOOR) obimpr[n] += 8; if (n == ZDESK && dial1x == -1) { /* * establish the proper setting of the dials when the box * is first seen */ dial1x = (qrand() % 999) + 1; dial2x = (qrand() % 999) + 1; } } } } speak(spk); if (spk == 553) vdead(); } vpick() { int result; result = 0; /* pick up means take */ if (prepdo == UP) { prepdo = 0; result = 1; } /* this results in calling take */ else if (dobjs[0] == NLOCK && loc == 47) speak(235); else speak(95); return(result); } vpiss() { dirty += 1; { if (loc == 74 && (obimpr[ZVINE] & 56) == 8 && (dobjs[0] == 0 || dobjs[0] == VINE)) { speak(301); obimpr[ZVINE] += 8; } else if (dirty >= 5 && dirty < 10) speak(40); else if (dirty >= 10) { if (obloc[LPANT] == 3000 || obloc[RPANT] == 3000) speak(41); else speak(42); } } } vpour() { int result, bplce, pplce, n, plce; result = 0; /* if result set = 1, then call vput */ if (wrdnum[0] == QWATER) { prepio = ON; iobj = dobjs[0]; ioadj = doadjs[0]; dobjs[0] = WATER; doadjs[0] = 0; } if (dobjs[0] == DEET && prepio == ON && (iobj == ME || (iobj == VINE && loc == 74))) { itsher(ZDEET, &plce); if (plce == 0) speak(66); else { speak(75); obimpr[ZDEET] = 28762; obloc[ZDEET] = 0; } return (result); } if ((dobjs[0] == DEET || dobjs[0] == METOL || dobjs[0] == HYPO) && iobj == FUNNEL) { wrdnum[0] = PUT; prepio = IN; result = 1; return (result); } if (iobj != 0 && iobj != POLE) { n = getobj(iobj, ioadj); if (n >= 0) { itsher(n, &plce); } if (iobj == FUNNEL && n < 0) { speak(70); return (result); } if (n <= 0 || plce == 0) { speak(48); return (result); } } itsher(ZBUCKE, &bplce); itsher(PLBAG, &pplce); if (dobjs[0] == WATER) { if (bplce != 0 && obimpr[ZBUCKE] == 1033) { if (iobj == FUNNEL) { if (n == LFUNNE || n == RFUNNE) { speak(402); if (obimpr[RLIGHT] != 73) { speak(400); obimpr[RLIGHT] = 73; obimpr[GLIGHT] = 73; } machst |= machst; return(result); } else { if ((machst & 2) == 0) speak(397); machst |= 2; obimpr[ZINDIC] = 145; if ((machst & 16) != 0 && (machst & 1) == 0 && obimpr[RLIGHT] == 73) { speak(399); obimpr[RLIGHT] = 145; obimpr[GLIGHT] = 145; } } } else if (loc != 74 || (obimpr[ZVINE] & 56) != 8) speak(247); else { speak(301); obimpr[ZVINE] = obimpr[ZVINE] + 8; } obimpr[ZBUCKE] = 1545; } else if (pplce != 0 && obimpr[PLBAG] == 2697) speak(248); else speak(48); } else if (dobjs[0] == LATEX && obloc[ZLATEX] == 2000 + ZBUCKE && bplce != 0 && (obimpr[ZLATEX] & 56) == 8) { if (loc != 76 || iobj != POLE) { speak(279); obimpr[ZLATEX] = obimpr[ZLATEX] + 72; } else { speak(75); obimpr[ZLATEX] = obimpr[ZLATEX] + 80; } obloc[ZLATEX] = loc; } else speak(48); return (result); } vpush() { int result, numbr, ndo, nio, spk, xfilm; result = 0; /* push is also touch */ if ((loc == 165 || loc == 173) && dobjs[0] > 9999) { numbr = dobjs[0] - 10000; if ((loc == 165 && numbr > 30) || (loc == 173 && numbr > 99)) speak(532); else if (loc == 165) { pbstat = (pbstat & 1023) * 32 + numbr; if (pbstat == dcombi) { speak(530); /* ~4=177773 octal */ obimpr[ODOOR] = (obimpr[ODOOR] & ~4); } else speak(238); } else speak(238); return (result); } if (dobjs[0] == CACTUS && loc == 82) { if (pct(25) && (cactsc & 2) == 0) { speak(371); cactsc = cactsc + 2; if (cactsc == 3) speak(439); } else if ((cactsc & 1) == 0) { speak(370); cactsc = cactsc + 1; if (cactsc == 3) speak(439); } else speak(237); return (result); } if (dobjs[0] == GUARD) { if (loc == guardl || loc == 171 || (chaset != 0 && chaset <= 9)) speak(562); else speak(561); return (result); } ndo = 0; nio = 0; if (dobjs[0] != 0) ndo = getobj(dobjs[0], doadjs[0]); if (iobj != 0) nio = getobj(iobj, ioadj); /* * unlocking the door to warehouse by touching wire to it if wire is * connected to knob in bar */ if ((ndo == MDIMPL && nio == ZWIRE && prepio == WITH) || (ndo == ZWIRE && nio == MDIMPL && prepio == TO) && loc == 47) { if (obloc[ZWIRE] != loc && wirelc[0] != loc && wirelc[1] != loc && wirelc[2] != loc && wirelc[3] != loc && wirelc[4] != loc && wirelc[5] != 1000 && obloc[ZWIRE] != 1000) spk = 213; /* first test is for connection to knob */ else if (((obimpr[ZWIRE] / 8) % 8) == 4 && (wirelc[5] == 1000 || wirelc[5] == loc)) { spk = 238; /* ~4=177773 octal */ obimpr[RDOOR] = (obimpr[RDOOR] & ~4); } else spk = 237; } else if ((ndo == ZKNOB || nio == ZKNOB) && loc == 42 && spcloc != 1) spk = 207; else if (ndo == ZLOUVE && (loc == 98 || loc == 142) && obimpr[ZLOUVE] == 1) { spk = 282; obimpr[ZLOUVE] = 9; } else if (dobjs[0] == BUTTON) { if (ndo == -1) spk = 70; else if (ndo == SBUTTO && loc == 146) { locdat[144] |= 16; locdat[145] |= 16; locdat[147] |= 16; locdat[148] |= 16; locdat[150] |= 16; spk = 238; } else if (ndo == RBUTTO && loc == 146) { speak(383); result = 1; return(result); } else if (ndo == HBUTTO && loc == 146) { if (easttm == 0) easttm = 1; spk = 238; } else if (ndo == TBUTTO && loc == 146) { if (easttm == 51) easttm = 52; spk = 238; } else if (ndo == GBUTTO && loc == 169) { if (adverb == TWICE) { spk = 525; obimpr[HMURAL] = 209; bonus = bonus + 5; chaset = 1; oldlc2 = 0; oldloc = 0; } else spk = 238; } else if (ndo == RDBUTT && loc == 143) { if ((machst & 51) != 18) spk = 237; else { speak(398); xfilm = (filmtm % 1000); if (xfilm >= 3 && xfilm <= 6 && filmtm < 2000 && machst == 30) { if (filmst == 0) obimpr[ZFILM] = obimpr[ZFILM] + 64; else obimpr[ZFILM] = obimpr[ZFILM] + 128; } else if ((machst & 12) != 12) obimpr[ZFILM] = obimpr[ZFILM] + 192; else; obloc[ZFILM] = 2000 + ZHOPPE; machst = 33; return (result); } } else if (loc == 134 && (ndo == VBUTTO || ndo == OBUTTO || ndo == WBUTTO || ndo == BBUTTO)) { if (obloc[GDISC] == 2000 + ZRECES && rvtim != 2) spk = 411; else if (obloc[GDISC] == 2000 + ZRECES && rvtim == 2 && obloc[GCABLE] != 2000 + ZANTEN) spk = 421; else if (obloc[GDISC] == 2000 + ZRECES && rvtim == 2) { if (ndo == VBUTTO) { spk = 415; result = 2; } else if (ndo == OBUTTO) { spk = 416; result = 3; } else if (ndo == BBUTTO) { spk = 417; result = 4; } else { spk = 418; result = 5; } } else spk = 238; } else spk = 419; } else spk = 236; speak(spk); return (result); } SHAR_EOF # End of shell archive exit 0 -- Bob Page, U of Lowell CS Dept. page@swan.ulowell.edu ulowell!page Have five nice days.