page@swan.ulowell.edu (Bob Page) (02/02/89)
Submitted-by: ejkst@unix.cis.pittsburgh.edu (Eric J. Kennedy) Posting-number: Volume 89, Issue 14 Archive-name: fun/world.7 # 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: # arrays.h # demons.c # makefile # makefile.old # variab.h # vcnvrt.c # vtxtcn.c # wbstuff.c # world.c # This archive created: Mon Jan 30 18:12:28 1989 cat << \SHAR_EOF > arrays.h /* The arrays declared elsewhere are used starting with index 0; those declared below starting with index 1 */ int gtext[5]; short locdat[LOCNUM+1], odistb[OBJMX2+1]; short obnoun[OBJMAX+1], obadjv[OBJMAX+1], obw3[OBJMAX+1]; short obw4[OBJMAX+1], obpprp[OBJMAX+1], obimpr[OBJMAX+1], obloc[MOVMAX+1]; SHAR_EOF cat << \SHAR_EOF > demons.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 */ mdemon() { int qtim, z, i, kkwr; /* * subroutine to care for comings and goings of martians */ qtim = (turns % 100) < 75; /* * the player must have entered mars once in the day and once at night, * and then wait 4 turns before they come close */ if (martim < 7) { if (loc == 27 || loc == 50 || loc == 41) { oldloc = 0; speak(152); } if (loc >= 26 && loc <= 50) { if (qtim && (martim == 0 || martim == 2)) martim |= 1; if (!qtim && (martim == 0 || martim == 1)) martim |= 2; if (martim >= 3) martim += 1; } } if (qtim) return; /* * they will appear at once if he falls in their hockey rink */ if (loc == 38 && !marflg[5]) { marflg[5] = 1; martim = 7; speak(169); return; } for (i = 0; i < 5; i++) marflg[i] = 0; z = (turns % 100); /* wont come close if martim < 7 */ if (martim < 7) { if (loc != 51) speak(141); goto lab60; } if (z > 75 && z < 99) marflg[4] = 1; if (z > 76 && z < 98) marflg[0] = 1; if (z > 78 && z < 95) marflg[3] = 1; if (z > 78 && z < 96) marflg[2] = 1; if (z > 77 && z < 97 && obloc[HPUCK] == 38) marflg[1] = 1; /* announce the goings on of the martians */ if (marflg[5] && z == 75 && loc != 38) speak(154); if (marflg[5] && z == 99 && loc != 38) speak(155); /* the first time they come close */ if (!marflg[5] && loc < 51) { marflg[5] = 1; speak(142); } if (loc == 28) { if (marflg[3]) speak(143); } else if (loc >= 43 && loc <= 45) { if (marflg[4]) speak(144); } /* at home */ else if (loc == 42 || loc == 30) { if (marflg[0]) { if (!marflg[6] || pct(20)) { speak(145); marflg[6] = 1; } else speak(146); } } /* the hockey game */ else if (loc == 29 || (loc >= 31 && loc <= 38)) { if (marflg[1]) { if (!marflg[7] || pct(20)) { speak(147); marflg[7] = 1; } else speak(148); } } else if (loc == 40) { if (marflg[2]) speak(149); } else; if (((loc == 42 && marflg[0]) || (loc == 38)) && !deadf) { /* oops! he ran inot one and got fried */ if (loc == 42) speak(150); if (loc == 38) { if (marflg[1]) speak(151); else speak(171); for (i = 32; i <= 37; i++) locdat[i] |= 16384; } vdead(); oldlc2 = 0; oldloc = 0; } /* move his belongings to the dump */ lab60: for (i = 1; i <= MOVMAX; i++) { if (obloc[i] == loc || (obloc[i] == 48 && loc == 49) || obloc[i] < 27 || obloc[i] > 50) continue; if (i == ZWIRE) { if (obloc[i] == 1000 || wirelc[0] == 1000 || wirelc[5] == 1000 || wirelc[0] == loc || wirelc[1] == loc || wirelc[2] == loc || wirelc[3] == loc || wirelc[4] == loc || wirelc[5] == loc) continue; obimpr[ZWIRE] = (obimpr[ZWIRE] & ~56) + 8; /* ~56=177707 octal */ for (kkwr = 0; kkwr < 6; kkwr++) wirelc[kkwr] = 0; } if (obloc[i] >= 27 && obloc[i] <= 50) obloc[i] = 40; if (i == HPUCK) obloc[i] = 38; if (i == ZDIAMO) { obimpr[i] = (obimpr[i] & ~56) + 8; obloc[i] = 49; } if (i == RBOULD) obloc[i] = 27; } return; } wdemon() { int i, n, i2, vloc; /* * take care of playing out and taking in the wire take it in */ if (wirelc[5] == 1000) { for (i = 1; i <= 4; i++) { n = 5 - i; if (wirelc[n] == oldloc && wirelc[n - 1] == loc) { wirelc[n] = 1000; speak(216); if (wirelc[1] == 1000 && obloc[ZWIRE] == 1000 && wirelc[0] == loc) { for (i2 = 0; i2 < 5; i2++) wirelc[i2] = 0; speak(219); } return; } } if (wirelc[1] == 1000 && wirelc[0] == oldloc && obloc[ZWIRE] == loc) { wirelc[0] = 1000; speak(216); return; } /* play it out */ if (loc >= 32 && loc <= 38) { speak(257); if (oldloc == 31 || oldloc == 32) vloc = 32; else vloc = 37; for (i = 0; i < 6; i++) if (wirelc[i] == 1000) wirelc[i] = vloc; return; } for (i = 0; i < 4; i++) { if (wirelc[i] == oldloc && wirelc[i + 1] == 1000) { wirelc[i + 1] = loc; speak(217); return; } } if (wirelc[0] == 1000 && obloc[ZWIRE] == oldloc) { wirelc[0] = loc; speak(217); return; } /* out of wire */ if (wirelc[4] == oldloc) { speak(218); wirelc[5] = wirelc[4]; return; } } else; } timer(xloc) int xloc; { int bplce, cplce, gplce, iplce, objen, qq, i; /* prevent him from being outside the valley at sunset */ if (loc <= 3 && loc * 15 < turns) { speak(255); oldlc2 = oldloc; oldloc = loc; loc += 1; } /* * daytim=1 if it is intrinsically light here (i.e. lights are always on * or it is outside and the sun is up or he is carrying sphere or bead */ if ((locdat[loc] & 17) != 0 || ((locdat[loc] & 8) != 0 && (turns % 100) < 75) || obloc[GSPHER] == 1000 || obloc[GSPHER] == loc || obloc[ZBEAD] == 1000 || obloc[ZBEAD] == loc) daytim = 1; else daytim = 0; /* he is killed if on tower in daytime */ if (loc == 49 && daytim == 1 && !deadf) { speak(166); oldlc2 = 0; oldloc = 0; loc = 48; vdead(); } /* announce rising and setting of both suns */ if ((locdat[loc] & 8) != 0) { if (daytim == 0) speak(124); else if ((turns % 100) >= 72 && (turns % 100) < 75) speak(125); else if ((turns % 100) < 3 && turns > 4) speak(126); else; } /* * check to see if he is not wearing shoes or boots if too long without * them, he dies */ if ((obloc[CSHOES] != 3000 && obloc[HBOOTS] != 3000) && !deadf && (loc != 16 && loc < 153)) { noshoe -= 1; if (noshoe == 0) speak(99); else if (noshoe < -6 && pct(10 * (-6 - noshoe))) { speak(100); vdead(); } } /* fish need water to live! */ if (obloc[DFISH] == 0) { if (obloc[CFISH] != 16 && !(obloc[CFISH] == (2000 + PLBAG) && (((obimpr[PLBAG] / 512) % 8) == 5))) { fshlif -= 1; if (fshlif == 0) { obloc[DFISH] = obloc[CFISH]; obloc[CFISH] = 0; obimpr[CFISH] = 0; obimpr[DFISH] = 137; } } } /* check on status of bug repellent */ if (obimpr[ZDEET] >= 4096) obimpr[ZDEET] -= 4096; /* check on radioactive exposure of film in camera */ itsher(ZBEAD, &bplce); itsher(GSPHER, &gplce); if (oextim < 8000) { itsher(ICAMER, &iplce); if (obloc[GSPHER] == obloc[ICAMER]) oextim += 1; else { if (iplce != 0 && gplce != 0) oextim += 1; } if (obloc[ZBEAD] == obloc[ICAMER]) oextim += 7; else { if (iplce != 0 && bplce != 0) oextim += 4; } } /* check on radiation poisoning */ if (!deadf && bplce != 0 && obloc[ZBEAD] != 2000 + ZSINK) { rdietm = (rdietm / 5) * 5; rdietm += 5; if (rdietm > 0 && (rdietm % 10) == 0) speak(rdietm / 10 + 320); } else { rdietm -= 1; if (rdietm <= 0) rdietm = 0; if (rdietm == 36) speak(326); if (rdietm == 24) speak(327); if (rdietm == 12) speak(328); } /* check on changing of loc 89 */ if (easttm == 1) speak(376); if (easttm == 15) speak(377); if (easttm == 50) speak(378); if (easttm >= 1 && easttm <= 50) easttm += 1; if (!deadf) eattim += 1; if (eattim == 170) speak(367); if (eattim == 240) speak(368); if (eattim == 270) speak(369); if (eattim == 300) { speak(384); vdead(); } /* exposing the x-ray film */ itsher(ZCASSE, &cplce); if (obloc[ZCASSE] == 2000 + ZRACK && obloc[ZBEAD] == 2000 + ZTRAY) { objen = 0; for (i = 0; i <= MOVMAX; i++) { if (obloc[i] == ZENLAR + 2000) { if (fimage != 0 && fimage != i) filmst = 1; qq = i; objen += 1; } } if (objen > 1) filmst = 1; if (objen == 0) filmtm += 10; if (objen >= 1) { filmtm += 1; fimage = qq; } } else if (obloc[ZBEAD] == obloc[ZCASSE] || (obloc[ZBEAD] != ZSINK + 2000 && bplce != 0 && cplce != 0)) filmtm += 1000; else; if (filmtm > 3000) filmtm = 3000; /* * dispersing of the cloud from the seed we are using obimpr(zseed) as a * clock; this is ok since it no longer exists ( o.e. obloc(zseed)=0 ) * despite this being stupid */ if (obloc[ZSEED] == 0 && obimpr[ZSEED] > 0) { if ((loc == 99 || loc == 131) && obimpr[ZSEED] == 1) speak(406); obimpr[ZSEED] -= 1; } if (screef > 0) screef -= 1; /* the chase is on!!!! */ if (chaset != 0) { if (adverb == QUICKL) chaser += 1; if (chaset <= 8) { if (xloc == loc || loc == oldlc2 || loc == 174 || loc == 166) { if (chaset != 1) { speak(557); vdead(); } else speak(554); } else if (chaset >= 5 && chaser < 3) speak(556); else speak(555); } else if (chaset == 9) { if (chaser >= 3) { speak(558); guardl = loc; } else { speak(557); vdead(); } } else if ((chaset > 9 && chaset < 18) && loc == guardl) { speak(563); vdead(); } else if (loc < 176 && chaset == 18) { if (!(loc == 175 && (obimpr[BDOOR] & 2) != 0)) { speak(560); vdead(); } } chaset += 1; if (chaset == 19) chaset = 0; } } SHAR_EOF cat << \SHAR_EOF > makefile # Makefile for world and support programs for Amiga # # Compiled with Manx 3.4a # # The program has been tested and compiles and runs properly on the # following systems: # # 1) VAX/VMS Digital CC compiler. No particular tricks are needed. # 2) IBM PC-AT Xenix 1.00. It eems to be necessary to use the large # memory model, although I'm not sure why since it runs on the # same machine under DOS in the small model. # 3) IBM PC under Microsoft C version 4.00. It works in the default # small memory model if you compile with the -Os switch. Note # that on this setup you MUST link the main program World with # binmode.obj, provided by Microsoft, for it to work right. # Vtxtcn and vcnvrt must NOT be lined with binmode.obj. # This compiler generates a few harmless warning messages. # You may need to use EXEMOD to increase the stack size. # 4) VAX/4.3bsd Unix. No particular tricks needed. # # NOTE: Edit helper.c to adjust the pathname for q1text.dat for # your particular system. # WHEADERS = arrays.h variab.h WOBJS = demons.o helper.o motion.o parser.o verbs1.o verbs2.o world.o wbstuff.o CSRC = demons.c helper.c motion.c parser.c verbs1.c verbs2.c world.c wbstuff.c LNFLAGS = -o world -lm -lc CFLAGS = +fi -DAMIGA DEST = dh0:rec/world all: world $(WOBJS): $(WHEADERS) convert vtext.dat: join vtext.dat.aa vtext.dat.ab vtext.dat.ac AS vtext.dat convert: vcnvrt vtxtcn vtext.dat @echo "creating data files..." vtxtcn vcnvrt @type nil: TO convert # the 'type nil: to convert' stuff is a kludge. Manx 'touch' won't create a # file if it doesn't exist. vtxtcn: vtxtcn.o ln vtxtcn.o -lc vcnvrt: vcnvrt.o ln vcnvrt.o -lc zoo: readme world world.info q1text.dat q1text.dat.info readme.info -delete world.zoo zoo a world world world.info q1text.dat README q1text.dat.info readme.info zoosrc: readme $(CSRC) $(WHEADERS) vtext.dat.aa vtext.dat.ab vtext.dat.ac\ vocab.dat vtxtcn.c vcnvrt.c -delete worldsrc.zoo zoo a worldsrc $(CSRC) $(WHEADERS) vtext.dat.aa vtext.dat.ab vtext.dat.ac\ data.dat vocab.dat vtxtcn.c vcnvrt.c makefile.old makefile readme clean: delete #?.o install: world q1text.dat copy world $(DEST) copy q1text.dat $(DEST) copy world.info $(DEST) copy q1text.dat.info $(DEST) world: $(WOBJS) convert ln $(WOBJS) $(LNFLAGS) SHAR_EOF cat << \SHAR_EOF > makefile.old # Makefile for world and support programs for Unix # # The program has been tested and compiles and runs properly on the # following systems: # # 1) VAX/VMS Digital CC compiler. No particular tricks are needed. # 2) IBM PC-AT Xenix 1.00. It seems to be necessary to use the large # memory model, although I'm not sure why since it runs on the # same machine under DOS in the small model. # 3) IBM PC under Microsoft C version 4.00. It works in the default # small memory model if you compile with the -Os switch. Note # that on this setup you MUST link the main program World with # binmode.obj, provided by Microsoft, for it to work right. # Vtxtcn and vcnvrt must NOT be linked with binmode.obj. # This compiler generates a few harmless warning messages. # You may need to use EXEMOD to increase the stack size. # 4) VAX/4.3bsd Unix. No particular tricks needed. # # NOTE: Edit helper.c to adjust the pathname for q1text.dat for # your particular system. # WHEADERS = arrays.h variab.h WOBJS = demons.o helper.o motion.o parser.o verbs1.o verbs2.o world.o CFLAGS = -O all: world install: world cp world /usr/games/world cp q1text.dat /usr/games/lib/q1text.dat convert: vcnvrt vtxtcn vtext.dat @echo "creating data files..." ./vtxtcn ./vcnvrt touch convert vtext.dat: cat vtext.dat.aa vtext.dat.ab vtext.dat.ac >vtext.dat vcnvrt: vcnvrt.c cc $(CFLAGS) -o vcnvrt vcnvrt.c vtxtcn: vtxtcn.c cc $(CFLAGS) -o vtxtcn vtxtcn.c world: convert $(WOBJS) $(WHEADERS) cc -s -o world $(WOBJS) SHAR_EOF cat << \SHAR_EOF > variab.h int horflg, wirelc[6], punct, three[3] ,eolflg ,lptr ,dotflg ,clause; int zadjs[12], zobjs[12], ziadj, ziobj, zpdo, zpio, zactor, zadvrb; int zverb, znumb, zall, zbut; int wrdnum[30], wrdtyp[30], adverb, actor; int dobjs[30], iobj, doadjs[12], ioadj, prepdo, prepio; int numdo, butflg, allflg, turns, loc, oldloc, oldlc2, brfflg; int deadf, dirty, nonext ,spcloc; int fshlif, noshoe, daytim, martim ,marflg[9] ,oextim, rdietm; int rvtim, gvtim, eattim, easttm, filmtm, screef; int filmst, machst, fimage, dial1, dial2, dial1x, dial2x; int wwflag, kmax, xindnt, slflag, more, nomor, rmove, chgact; int eastsc, cactsc, diesc, bonus, jackpo, lpill, pbstat, decset; int raset, dcombi, chaset, chaser, guardl; char outst2[66]; char inbuf[128]; SHAR_EOF cat << \SHAR_EOF > vcnvrt.c #include <stdio.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 */ int three[3], vrbpdo[100], vrbpio[100], vrbobj[100]; int pp1[15], pp2[15], pp3[8]; int obloc[200], obw3[200]; int obw4[200], obpprp[200], obimpr[200]; int dispat[300]; char chrbuf[81]; char astr[2], bstr[2], cstr[3], dstr[7]; char outstr[81], estr[8], fstr[7]; char obnoun[1200], obadjv[1400]; char *nounptr, *adjptr; int pnum, number, i, q, numx, vocdim, nvrbob, vocsz, m, q1; int loxx, loxxx, ppq1, ppq2, zz1, zz2, ttabsz, locat, qq1, qq2; int objmax, movmax, z, wt, size, value, floc, pprp, imprp; int iloc, cval, qqqq, ib; FILE *vocab_dat, *vocab_inc, *parame_inc, *verbtb_inc; FILE *data_dat, *trvtbl_inc, *locdat_inc, *objdat_inc; main() { astr[1] = 0; bstr[1] = 0; cstr[2] = 0; dstr[6] = 0; estr[7] = 0; fstr[6] = 0; obloc[0] = 0; obnoun[0] = 0; obadjv[0] = 0; obw3[0] = 0; obw4[0] = 0; obpprp[0] = 0; obimpr[0] = 0; dispat[0] = 0; vocab_dat = fopen("vocab.dat", "r"); vocab_inc = fopen("vocab.inc", "w"); parame_inc = fopen("parame.inc", "w"); verbtb_inc = fopen("verbtb.inc", "w"); fprintf(parame_inc, "#define ACTMAX 1\n"); number = 0; pnum = 0; lab110: for (i = 0; i < 81; i++) chrbuf[i] = ' '; if (fgets(chrbuf, 80, vocab_dat) == NULL) goto lab500; q = strlen(chrbuf) - 1; for (i = q; i < 80; i++) chrbuf[i] = ' '; if (chrbuf[0] == '*') goto lab110; if (chrbuf[0] < '0' || chrbuf[0] >= '9') goto lab111; numx = pnum + 1; if (chrbuf[0] == '1') { fprintf(parame_inc, "#define BUZMAX %5d\n", pnum); fprintf(parame_inc, "#define ADVMIN %5d\n", numx); } else if (chrbuf[0] == '2') { fprintf(parame_inc, "#define ADVMAX %5d\n", pnum); fprintf(parame_inc, "#define VRBMIN %5d\n", numx); } else if (chrbuf[0] == '3') { fprintf(parame_inc, "#define VRBMAX %5d\n", pnum); fprintf(parame_inc, "#define ADJMIN %5d\n", numx); } else if (chrbuf[0] == '4') { fprintf(parame_inc, "#define ADJMAX %5d\n", pnum); fprintf(parame_inc, "#define NUNMIN %5d\n", numx); } else if (chrbuf[0] == '5') { fprintf(parame_inc, "#define NUNMAX %5d\n", pnum); fprintf(parame_inc, "#define PRPMIN %5d\n", numx); } else if (chrbuf[0] == '6') { fprintf(parame_inc, "#define PRPMAX %5d\n", pnum); } else; if (chrbuf[0] != '6') goto lab110; goto lab500; lab111: number += 1; if (chrbuf[0] == '+') goto lab110; pnum += 1; for (i = 0; i < 6; i++) outstr[i] = chrbuf[i]; if (chrbuf[59] >= 'A' && chrbuf[59] <= 'Z') { for (i = 0; i < 6; i++) outstr[i] = chrbuf[59 + i]; } fprintf(parame_inc, "#define %6s %5d\n", outstr, pnum); goto lab110; lab500: fprintf(parame_inc, "#define VOCMAX %5d\n", number); vocdim = number * 3; fseek(vocab_dat, 0l, 0); fprintf(vocab_inc, " short vocab[%5d] = { 0 \n", vocdim + 1); nvrbob = 0; lab600: fgets(chrbuf, 80, vocab_dat); q = strlen(chrbuf) - 1; for (i = q; i < 80; i++) chrbuf[i] = ' '; if (chrbuf[0] == '*') goto lab600; vocsz = 0; lab820: if (fgets(chrbuf, 80, vocab_dat) == NULL) goto lab6000; q = strlen(chrbuf) - 1; for (i = q; i < 80; i++) chrbuf[i] = ' '; if (chrbuf[0] == '*') goto lab820; if (chrbuf[0] > '0' && chrbuf[0] < '9') goto lab820; m = 0; if (chrbuf[0] == '+') m = 1; cvt(&chrbuf[m]); if (m == 1) three[0] = -three[0]; vocsz += 3; q1 = (q < 9) ? q : 9; /* q1 = min (q,9) */ fprintf(vocab_inc, " , %6d, %6d, %6d /* %12.13s */\n", three[0], three[1], three[2], chrbuf); if (chrbuf[15] == ' ') goto lab820; for (i = 0; i < 15; i++) { pp1[i] = chrbuf[i + 14] - '0'; pp2[i] = chrbuf[i + 31] - '0'; } for (i = 0; i < 8; i++) pp3[i] = chrbuf[i + 49] - '0'; nvrbob += 1; vrbpdo[nvrbob] = 0; vrbpio[nvrbob] = 0; vrbobj[nvrbob] = 0; for (i = 0; i < 15; i++) { vrbpdo[nvrbob] = vrbpdo[nvrbob] * 2 + pp1[i]; vrbpio[nvrbob] = vrbpio[nvrbob] * 2 + pp2[i]; } for (i = 0; i < 8; i++) vrbobj[nvrbob] = vrbobj[nvrbob] * 2 + pp3[i]; goto lab820; lab6000: fprintf(verbtb_inc, " short vrbpdo[ %3d ] = { 0 \n", nvrbob + 1); for (i = 1; i <= nvrbob; i++) fprintf(verbtb_inc, " , %7d \n", vrbpdo[i]); fprintf(verbtb_inc, " } ; \n"); fprintf(verbtb_inc, " short vrbpio[ %3d ] = { 0 \n", nvrbob + 1); for (i = 1; i <= nvrbob; i++) fprintf(verbtb_inc, " , %7d \n", vrbpio[i]); fprintf(verbtb_inc, " } ; \n"); fprintf(verbtb_inc, " short vrbobj[ %3d ] = { 0 \n", nvrbob + 1); for (i = 1; i <= nvrbob; i++) fprintf(verbtb_inc, " , %7d \n", vrbobj[i]); fprintf(verbtb_inc, " } ; \n"); fprintf(vocab_inc, " } ; \n"); fclose(vocab_dat); fclose(vocab_inc); fclose(verbtb_inc); data_dat = fopen("data.dat", "r"); trvtbl_inc = fopen("trvtbl.inc", "w"); locdat_inc = fopen("locdat.inc", "w"); objdat_inc = fopen("objdat.inc", "w"); ttabsz = 0; fprintf(trvtbl_inc, " short trvtbl[] = { 0 \n"); lab1000: fgets(chrbuf, 80, data_dat); if (chrbuf[0] == '*') goto lab1000; locat = atoi(&chrbuf[1]); qq1 = atoi(&chrbuf[13]); qq2 = atoi(&chrbuf[16]); astr[0] = chrbuf[0]; cstr[0] = chrbuf[8]; cstr[1] = chrbuf[9]; bstr[0] = chrbuf[11]; if (locat == 9999) goto lab1200; ttabsz += 1; if (strcmp(cstr, "N ") == 0) ppq1 = 1; else if (strcmp(cstr, "NE") == 0) ppq1 = 2; else if (strcmp(cstr, "E ") == 0) ppq1 = 3; else if (strcmp(cstr, "SE") == 0) ppq1 = 4; else if (strcmp(cstr, "S ") == 0) ppq1 = 5; else if (strcmp(cstr, "SW") == 0) ppq1 = 6; else if (strcmp(cstr, "W ") == 0) ppq1 = 7; else if (strcmp(cstr, "NW") == 0) ppq1 = 8; else if (strcmp(cstr, "U ") == 0) ppq1 = 9; else if (strcmp(cstr, "D ") == 0) ppq1 = 10; else printf(" error in travel table\n"); if (bstr[0] == 'C') ppq1 += 16; if (bstr[0] == 'S') ppq1 += 32; if (bstr[0] == 'Q') ppq1 += 64; ppq2 = 512 * qq1 + qq2; zz2 = ttabsz * 2; zz1 = zz2 - 1; { if (locat != 0) { dispat[locat] = zz1; loxx = locat; } } fprintf(trvtbl_inc, " , %7d , %7d \n", ppq1, ppq2); goto lab1000; lab1200: loxxx = loxx + 1; fprintf(trvtbl_inc, " } ;\n"); fprintf(trvtbl_inc, " short dispat[] = { 0 \n"); for (i = 1; i < loxxx; i++) fprintf(trvtbl_inc, " , %5d \n", dispat[i]); fprintf(trvtbl_inc, " , %5d }; \n", zz2 + 1); fprintf(parame_inc, "#define LOCNUM %5d \n", loxx); fprintf(parame_inc, "#define TTABSZ %5d \n", zz2); fclose(trvtbl_inc); fprintf(locdat_inc, " short locdat[] = { 0 \n"); while (1) { do fgets(chrbuf, 80, data_dat); while (chrbuf[0] == '*'); locat = atoi(&chrbuf[1]); if (locat == 9999) break; ppq1 = atoi(&chrbuf[6]); fprintf(locdat_inc, " , %6d \n", ppq1); } fprintf(locdat_inc, " } ; \n"); fclose(locdat_inc); objmax = 0; movmax = 0; nounptr = obnoun; adjptr = obadjv; while (1) { do fgets(chrbuf, 80, data_dat); while (chrbuf[0] == '*'); z = atoi(&chrbuf[1]); if (z == 9999) break; for (i = 0; i < 6; i++) *nounptr++ = chrbuf[i + 7]; for (i = 0; i < 7; i++) *adjptr++ = chrbuf[i + 16]; wt = atoi(&chrbuf[24]); size = atoi(&chrbuf[30]); value = atoi(&chrbuf[36]); floc = atoi(&chrbuf[42]); pprp = atoi(&chrbuf[48]); imprp = atoi(&chrbuf[54]); iloc = atoi(&chrbuf[60]); cval = atoi(&chrbuf[66]); for (i = 0; i < 6; i++) fstr[i] = chrbuf[i + 72]; objmax += 1; movmax += 1; obw3[z] = wt * 256 + size; obw4[z] = value * 4096 + floc; obpprp[z] = pprp + 2048 * cval; obloc[z] = iloc; obimpr[z] = imprp; for (i = 0; i < 6; i++) if (fstr[i] == '\n') fstr[i] = ' '; fprintf(parame_inc, "#define %7.6s %5d\n", fstr, z); } while (1) { do fgets(chrbuf, 80, data_dat); while (chrbuf[0] == '*'); z = atoi(&chrbuf[1]); if (z == 9999) break; for (i = 0; i < 6; i++) *nounptr++ = chrbuf[i + 7]; for (i = 0; i < 7; i++) *adjptr++ = chrbuf[i + 16]; objmax += 1; obw3[objmax] = atoi(&chrbuf[30]); obw4[objmax] = atoi(&chrbuf[42]); pprp = atoi(&chrbuf[48]); obimpr[objmax] = atoi(&chrbuf[54]); cval = atoi(&chrbuf[66]); for (i = 0; i < 6; i++) fstr[i] = chrbuf[i + 72]; for (i = 0; i < 6; i++) if (fstr[i] == '\n') fstr[i] = ' '; obpprp[objmax] = pprp + 2048 * cval; fprintf(parame_inc, "#define %7.6s %5d\n", fstr, objmax); } fclose(data_dat); fprintf(parame_inc, "#define OBJMAX %5d\n", objmax); fprintf(parame_inc, "#define MOVMAX %5d\n", movmax); fprintf(parame_inc, "#define OBJMX2 %5d\n", objmax + 1); fclose(parame_inc); fprintf(objdat_inc, " short obloc[] = { 0 \n"); for (i = 1; i <= movmax; i++) { qqqq = obloc[i]; if (qqqq > 6000) qqqq += movmax - 4000; fprintf(objdat_inc, " , %7d \n", qqqq); } fprintf(objdat_inc, " } ;\n"); fprintf(objdat_inc, " short obw3[] = { 0 \n"); for (i = 1; i <= objmax; i++) { fprintf(objdat_inc, " , %7d \n", obw3[i]); } fprintf(objdat_inc, " } ;\n"); fprintf(objdat_inc, " short obw4[] = { 0 \n"); for (i = 1; i <= objmax; i++) { fprintf(objdat_inc, " , %7d \n", obw4[i]); } fprintf(objdat_inc, " } ;\n"); fprintf(objdat_inc, " short obpprp[] = { 0 \n"); for (i = 1; i <= objmax; i++) { fprintf(objdat_inc, " , %7d \n", obpprp[i]); } fprintf(objdat_inc, " } ;\n"); fprintf(objdat_inc, " short obimpr[] = { 0 \n"); for (i = 1; i <= objmax; i++) { fprintf(objdat_inc, " , %7d \n", obimpr[i]); } fprintf(objdat_inc, " } ;\n"); nounptr = obnoun; fprintf(objdat_inc, " short obnoun[] = { 0 \n"); for (i = 1; i <= objmax; i++) { for (ib = 0; ib < 6; ib++) dstr[ib] = *nounptr++; fprintf(objdat_inc, " , %7s \n", dstr); } fprintf(objdat_inc, " } ;\n"); adjptr = obadjv; fprintf(objdat_inc, " short obadjv[] = { 0 \n"); for (i = 1; i <= objmax; i++) { for (ib = 0; ib < 7; ib++) estr[ib] = *adjptr++; fprintf(objdat_inc, " , %8s \n", estr); } fprintf(objdat_inc, " } ;\n"); fclose(objdat_inc); } cvt(strptr) char *strptr; { int ii, ij, k; for (ii = 0; ii < 3; ii++) { three[ii] = 0; for (ij = 0; ij < 3; ij++) { k = *strptr++; if (k == 45) k = 91; k -= 64; if (k < 1 || k > 27) k = 0; three[ii] = three[ii] * 32 + k; } } } SHAR_EOF cat << \SHAR_EOF > vtxtcn.c #include <stdio.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 */ long z, zbig, zsmall; long htext[2000]; int gtext[5]; char chrbuf[90]; FILE *vtext_dat, *qtext_inc, *objdes_inc; FILE *gtext_inc; int q1text_dat; short packch; int i, u, kk, nold, size, number, nnmax, kq; short buffer[512]; int bi; main() { vtext_dat = fopen("vtext.dat", "r"); q1text_dat = creat("q1text.dat", 0600); qtext_inc = fopen("qtext.inc", "w"); objdes_inc = fopen("objdes.inc", "w"); fprintf(objdes_inc, " short odistb[] = { 0 \n"); for (i = 0; i < 2000; i++) htext[i] = 0; z = 0; zbig = 0; zsmall = 0; u = 0; nold = 0; bi = 0; do { fgets(chrbuf, 80, vtext_dat); for (i = 0; i < 85; i++) { if (chrbuf[i] == '\012' || chrbuf[i] == '\015' || chrbuf[i] == '\0') break; } size = i; for (i = size - 1; i > 3; i--) { if (chrbuf[i] != ' ') break; } size = i + 1; if (size < 9) { chrbuf[8] = ' '; size = 9; } number = atoi(chrbuf); if (number != nold) u += 1; if (number < 1001) gtext[1] = u; if (number < 2001) gtext[2] = u; if (number < 3001) gtext[3] = u; if (number < 9999) gtext[4] = u; if (number > 3000 && number < 3999) { fprintf(objdes_inc, " , %6d \n", u); nnmax = number - 3000; } else if (number > 5000 && number < 5999) { fprintf(objdes_inc, " , %6d \n", u); } else; if (number != nold) htext[u] = z; nold = number; chrbuf[size] = '{'; for (i = size + 1; i < 90; i++) chrbuf[i] = '}'; for (i = 8; i < size; i++) { if (chrbuf[i] == ' ') chrbuf[i] = '`'; if (chrbuf[i] == '.') chrbuf[i] = '|'; } kk = 8; while (1) { if (bi == 512) dump_buf(); if (chrbuf[kk] < '`' || chrbuf[kk + 1] < '`' || chrbuf[kk + 2] < '`') { packch = -(chrbuf[kk] + (chrbuf[kk + 1] << 8)); buffer[bi] = packch; kk += 2; zbig++; bi++; z++; if (chrbuf[kk - 1] == '{' || chrbuf[kk - 2] == '{') break; } else { packch = (chrbuf[kk + 2] - 96) * 1024 + (chrbuf[kk + 1] - 96) * 32 + chrbuf[kk] - 96; if ((packch & 0377) == 10 || ((packch >> 8) & 0377) == 10) { packch = -(chrbuf[kk] + (chrbuf[kk + 1] << 8)); buffer[bi] = packch; kk += 2; zbig++; bi++; z++; if (chrbuf[kk - 1] == '{' || chrbuf[kk - 2] == '{') break; } else { buffer[bi] = packch; kk += 3; zsmall++; bi++; z++; if (chrbuf[kk - 1] == '{' || chrbuf[kk - 2] == '{' || chrbuf[kk - 3] == '{') break; } } } } while (number != 9999); dump_buf(); fprintf(objdes_inc, " } ; \n"); u = ((u + 2) / 3) * 3; fprintf(qtext_inc, "#define RTSIZE %6d \n", u + 1); fprintf(qtext_inc, " unsigned short rtext[] = { 0 \n"); for (kk = 1; kk <= u / 3; kk++) { kq = (kk - 1) * 3; fprintf(qtext_inc, " , %5ld, %5ld, %5ld \n", htext[kq + 1], htext[kq + 2], htext[kq + 3]); } fprintf(qtext_inc, " }; \n"); fclose(vtext_dat); close(q1text_dat); fclose(qtext_inc); fclose(objdes_inc); gtext_inc = fopen("gtext.inc", "w"); fprintf(gtext_inc, " int gtext[5] = { 0, %6d, %6d, %6d, %6d };\n" ,gtext[1], gtext[2], gtext[3], gtext[4]); fclose(gtext_inc); printf(" packed: %8ld unpacked: %8ld \n", zsmall, zbig); } dump_buf() { write(q1text_dat, buffer, 512*sizeof(short)); bi = 0; } SHAR_EOF cat << \SHAR_EOF > wbstuff.c #include "exec/types.h" #include "exec/memory.h" #include "exec/io.h" #include "exec/libraries.h" #include "exec/execbase.h" #include "libraries/dos.h" #include "libraries/dosextens.h" #include "workbench/startup.h" #include "workbench/workbench.h" #include <ctype.h> #include <functions.h> #define NOBUF 512 char Q1TEXT[80] = "q1text.dat"; extern int q1text_dat; struct FileHandle *tty; char obuf[NOBUF]; /* Output buffer */ static char *ob = obuf; int nobuf; /* # of bytes in above */ extern struct WBStartup *WBenchMsg; struct Library *IconBase = NULL; char WindowName[256] = "NEWCON:0/0/640/200/ World "; AmigaInit(argc,argv) char *argv[]; { if(argc==0) getWbArgs(WBenchMsg); else getCLIargs(argc,argv); } getWbArgs(wbMsg) struct WBStartup *wbMsg; { struct WBArg *wbArg; struct DiskObject *diskobj; char **toolarray; char *s; struct Lock *olddir; /* Defaults */ wbArg = wbMsg->sm_ArgList; if((IconBase = OpenLibrary("icon.library", 0L))) { diskobj=(struct DiskObject *)GetDiskObject(wbArg->wa_Name); if(diskobj) { toolarray = (char **)diskobj->do_ToolTypes; if(s=(char *)FindToolType(toolarray,"WIN")) strcpy(WindowName,s); FreeDiskObject(diskobj); } CloseLibrary(IconBase); } ttopen(); if(wbMsg->sm_NumArgs > 1L) /* use second arg as file instead */ { /* of "q1text.dat" */ wbArg++; if(wbArg->wa_Lock==NULL) { printf("Could not open file %s!\n",Q1TEXT); ttclose(); _exit(20L); } olddir=CurrentDir(wbArg->wa_Lock); q1text_dat = open(Q1TEXT,0); /* open data file */ if(q1text_dat<0) { printf("Could not open file %s!\n",Q1TEXT); ttclose(); _exit(20L); } CurrentDir(olddir); } else { q1text_dat = open(Q1TEXT,0); /* open data file */ if(q1text_dat<0) { printf("Could not open file %s!\n",Q1TEXT); ttclose(); _exit(20L); } } } getCLIargs(argc,argv) int argc; char *argv[]; { int arg; int lace, newcon; lace=FALSE; newcon=TRUE; for(arg=1;arg<argc;arg++) { if(argv[arg][0]=='-') { switch(argv[arg][1]) { case 'n': /* use NEWCON: window */ newcon=TRUE; break; case 'c': /* use CON: window */ newcon=FALSE; break; case 'i': /* use 400 line interlaced window */ lace=TRUE; break; case 'N': /* use 200 line (non-interlaced) window */ lace=FALSE; break; default: /* ignore */ ; } } else { strcpy(Q1TEXT,argv[arg]); /* alternate name for data file */ } } if(newcon && lace) strcpy(WindowName,"NEWCON:0/0/640/400/ WORLD "); if(newcon && !lace) strcpy(WindowName,"NEWCON:0/0/640/200/ WORLD "); if(!newcon && lace) strcpy(WindowName,"CON:0/0/640/400/ WORLD "); if(!newcon && !lace) strcpy(WindowName,"CON:0/0/640/200/ WORLD "); ttopen(); q1text_dat = open(Q1TEXT,0); /* open data file */ if(q1text_dat<0) { printf("Could not open file %s!\n",Q1TEXT); ttclose(); _exit(20L); } } ttopen() { nobuf=0; tty = Open(WindowName, MODE_NEWFILE); if (tty == NULL) exit(20); } ttclose() { char t[256]; printf("Press Return..."); gets(t); if (tty != NULL) { ttflush(); Close(tty); } tty = NULL; } getc() { char c; int result; do { flush(); result = Read(tty, &c, 1L); } while (result != 1); return (c & 0177); } flush() { ttflush(); Write(tty, obuf, (long) ob-obuf); ob = obuf; } /* * This function does the real work of * flushing out buffered I/O on the Amiga. All * we do is blast out the block with a write call. */ ttflush() { if (nobuf > 0) { Write(tty, obuf, (long) nobuf); nobuf = 0; } } /* * Output a character. */ putc(c) int c; { if (ob >= &obuf[sizeof(obuf)]) flush(); if(c=='\n') { *ob++ = c; flush(); } else *ob++ = c; } SHAR_EOF cat << \SHAR_EOF > world.c #include "parame.inc" #include "variab.h" #include "locdat.inc" #include "objdat.inc" #include "objdes.inc" #include "gtext.inc" /* World C Version 1.00 copyright 1987 J.D.McDonald Use as you like for non-commercial purposes, but please leave this note, and document any changes you make as yours */ static int i, xloc, mxscor, succes, mloc, ikk, verb, vretrn; static int scor, xretn, yretn, h, errflg; main(argc,argv) char *argv[]; { #ifdef AMIGA AmigaInit(argc,argv); #endif rdinit(); wwflag = 0; nomor = 0; speak(29); linout(" ", 1); slflag = 0; speak(gtext[1] + 1); xindnt = 0; for (i = 0; i < 9; i++) marflg[i] = 0; for (i = 0; i < 6; i++) wirelc[i] = 0; brfflg = 1; deadf = 0; dirty = 0; turns = 0; more = 0; diesc = 0; horflg = 0; nonext = 0; screef = 0; spcloc = 0; oldloc = 1; oldlc2 = 1; loc = 1; xloc = 0; oextim = 0; rdietm = 0; rvtim = 0; gvtim = 0; eattim = 0; easttm = 0; filmtm = 0; filmst = 0; machst = 0; fimage = 0; dial1x = -1; dial2x = -1; dial1 = 0; dial2 = 0; eastsc = 0; cactsc = 0; mxscor = 450; bonus = 0; jackpo = 0; lpill = 0; pbstat = 0; dcombi = -1; chaset = 0; chaser = 0; fshlif = 8; noshoe = 8; guardl = 0; eolflg = 1; linout(" ", 1); /* the main command loop!!!!! */ lab1: if (eolflg) { getln(); dotflg = 0; clause = 1; actor = 1; lptr = 0; } succes = scan(); if (!succes) eolflg = 1; if (!succes) goto lab1; succes = parse(); clause += 1; if (!succes) eolflg = 1; if (!succes) goto lab1; errflg = 0; /****** for "tell someone" or "ask someone" */ if (actor != 1) { otheract(); /* perform verbs for other than player */ timer(xloc); /* this goto is for permanent death due to radiation poisoning */ { if (rdietm == 50) goto lab9000; nonext = 1; goto lab3000; } } /******/ verb = wrdnum[0]; playerv(); /* this does all the verbs for player */ if (errflg == 1) goto lab9000; if (errflg == 2) goto lab9990; { if (deadf && loc >= 153) goto lab9000; } timer(xloc); /* * this goto is for permanent death due to radiation poisoning or death * in endgame */ { if (rdietm == 50 || (loc >= 153 && deadf)) goto lab9000; } h = 0; { if (loc != xloc) { /* get out of any special locations (like on glass) */ if (!(loc == 187 || loc == 184 || (loc >= 175 && loc <= 181))) spcloc = 0; if (wirelc[5] == 1000 || obloc[ZWIRE] == 1000) wdemon(); h = 1; } } /* announce new location */ { if (!nonext || (loc >= 7 && loc <= 11) || (loc >= 100 && loc <= 116)) { linout(" ", 1); if (loc >= 7 && loc <= 11) h = 1; vlocat(0, h); } if (loc >= 26 && loc <= 51) { linout(" ", 1); mdemon(); } } /* cat function */ lab3000: { if (obloc[ZCAT] == 1000 || (obloc[ZCAT] == (2000 + ZKNAPS) && (obloc[ZKNAPS] == 3000 || obloc[ZKNAPS] == loc))) { if (loc == 149 && obloc[ZCART] == 0) { speak(290); obloc[ZCAT] = loc; obloc[ZCART] = loc; } else if (obloc[ZCAT] == 2000 + ZKNAPS && obloc[ZKNAPS] == 3000 && pct(5)) { speak(287); obloc[ZCAT] = 1000; } else if (pct(3)) speak(288); else if (pct(3)) speak(289); } } /* robot activation */ { if ((obimpr[RSLOT] & 8192) == 8192) { obimpr[RSLOT] -= 8192; if (obloc[ZCART] == 2000 + RSLOT) speak(310); else speak(365); } } /* give bonus for reaching cygnus or deneb */ { if (loc == 183) { if ((locdat[183] & 16384) == 0) { speak(549); bonus += 5; } else if (xloc != loc) speak(550); } else if (loc == 186) { if ((locdat[186] & 16384) == 0) speak(547); else if (xloc != loc) speak(548); } else if (loc == 190) { speak(551); bonus += 5; goto lab9000; } } { if (loc == xloc && loc == 171) { speak(557); vdead(); goto lab9000; } } xloc = loc; turns += 1; nonext = 0; /* we have visited this location */ locdat[loc] |= 16384; linout(" ", 1); goto lab1; lab9000: linout(" ", 1); scor = scorng() + bonus * 5; scorpt(scor, mxscor); goto lab9999; lab9990: endsl(); lab9999: #ifdef AMIGA ttclose(); #endif } /* end of main program */ otheract() { static int actok; if (actor == MARTIA) { if (martim == 7 && loc >= 27 && loc <= 51) speak(167); else speak(168); } else if (actor == ROBOT) { { if (chgact == 1) actok = 1; } /* test to see if robot can "hear" */ if (chgact == 1 && obloc[CCART] == (2000 + RSLOT) && (loc == 146 || obloc[ZROBOT] == loc)) { speak(366); actok = 0; } else if (chgact == 1 && !((loc == obloc[ZROBOT] || loc == 146) && obloc[ZCART] == (2000 + RSLOT))) { speak(314); actok = 0; } else if (chgact == 0 && actok == 0); else if (wrdnum[0] == GO) { mloc = obloc[ZROBOT]; vgo(); { if (obloc[ZROBOT] == 90) obimpr[ZROBOT] = 2257; } { if (rmove == 1 && (loc == mloc)) speak(316); else if (rmove == 1 && mloc != loc && obloc[ZROBOT] == loc) speak(317); else if (rmove == 1 && loc == 146) robdsc(); } { if (obloc[ZROBOT] == 90) { if (obloc[ZORCHI] == 2000 + ZROBOT) obloc[ZORCHI] = 0; else if (obloc[ZFLYTR] == 2000 + ZROBOT) obloc[ZFLYTR] = 0; } } } else if (wrdnum[0] == TAKE || wrdnum[0] == DROP || wrdnum[0] == PUT || wrdnum[0] == IS || wrdnum[0] == TRANSL || wrdnum[0] == WASH || wrdnum[0] == QWATER || wrdnum[0] == HOLD || wrdnum[0] == GIVE) vrobot(); else speak(315); } else if (actor == FERRET) { if (loc != 131 && loc != 99 && loc != 100) speak(435); else speak(436); } else if (actor == CACTUS) { if (loc != 82) speak(437); else if (cactsc != 3) speak(438); /* cactus freezing scree sclope */ else if ((wrdnum[0] == HOLD || wrdnum[0] == FREEZE) && dobjs[0] == GRAVEL) { screef = 4; speak(441); } else speak(237); } else if (actor == GUARD) { if (loc == guardl || loc == 171 || (chaset != 0 && chaset <= 9)) speak(562); else speak(561); } else speak(251); } playerv() { if (verb < TAKE) { vretrn = 1; { if (verb == RUN) vretrn = vrun(); else if (verb == CRAWL) vretrn = vcrawl(); else if (verb == CROSS) vretrn = vcross(); else if (verb == JUMP) vretrn = vjump(); else if (verb == ASCEND) { prepdo = UP; vretrn = vclimb(); } else if (verb == DESCEN) { prepdo = DOWN; vretrn = vclimb(); } else if (verb == CLIMB) vretrn = vclimb(); else if (verb == SWIM) vretrn = vswim(); } /* * if vretrn=0, then the action is complete if vretrn=1, then a * translation to "go" occured or the verb was actually "go" */ { if (vretrn == 1) vgo(); } } else if (verb == QUIT) { if (yesx(101)) errflg = 1; /* out after scoring */ } else if (verb == DAMN) dirty += 1; else if (verb == SUSPEN) if (chaset == 0) vsuspe(0); else speak(559); else if (verb == RESTOR) { if (vsuspe(1)) { eolflg = 1; nonext = 0; actor = 1; xloc = loc; } } else if (verb == BRIEF) brfflg = 1; else if (verb == VERBOS) brfflg = 2; else if (verb == SUPERB) brfflg = 0; else if (verb == QMORE) nomor = 0; else if (verb == NOMORE) nomor = 1; else if (verb == SCORE) { scor = scorng() + bonus * 5; scorpt(scor, mxscor); } else if (verb == HELP) vhelp(); else if (verb == RETREA) vretre(); else if (verb == PRAY) { if (!deadf || loc != 61) speak(44); else { deadf = 0; speak(45); nonext = 1; noshoe = 8; } } else if (verb == DEBUG) dbg(); else if (verb == LOCATE) { vlocat(1, 1); nonext = 1; } else if (!deadf) { if (verb == TAKE || verb == REMOVE || verb == CARRY || verb == HOLD) vtake(); else if (verb == DROP) vdrop(); else if (verb == THROW) { if (!vthrow()) vdrop(); } else if (verb == SIT) vsit(); else if (verb == STAND) vstand(); else if (verb == GET) { xretn = vget(); { if (xretn == 1) vtake(); } } else if (verb == SHOOT) vshoot(); else if (verb == OPEN) vopen(); else if (verb == SHUT) vshut(); else if (verb == LAND || verb == ACTIVA) vship(); else if (verb == SCRATC) vscrat(); else if (verb == TRANSL) speak(71); else if (verb == ATTACH) vattac(); else if (verb == POUR || verb == QWATER) { if (vpour() == 1) vput(); } else if (verb == WASH) vwash(); else if (verb == EAT) veat(); else if (verb == DRINK) vdrink(); else if (verb == FILL) { if (vfill() == 1) vpour(); } else if (verb == IGNITE) speak(39); else if (verb == TURN) vturn(); else if (verb == READ) vread(); else if (verb == BREAK) vbreak(); else if (verb == FREEZE) speak(442); else if (verb == PICK) { xretn = vpick(); { if (xretn == 1) vtake(); } } else if (verb == WEAR) vwear(); else if (verb == PUT) { xretn = vput(); { if (xretn == 1) vwear(); if (xretn == 2) vdrop(); if (xretn == 3) vpour(); } } else if (verb == LOCK || verb == UNLOCK) vlocks(); else if (verb == LOOK || verb == EXAMIN) vlooks(); else if (verb == PUSH || verb == KISS) { { if (verb == KISS) yretn = vkiss(); } if (yretn == 1 || verb == PUSH) { xretn = vpush(); /* oops! the nova button */ if (xretn == 1) errflg = 2; /* instant out */ else if (xretn > 1) { bonus = xretn * 2; { if (xretn < 5) errflg = 1; /* out after scoring */ } /* change to the "endgame" */ scor = scorng(); bonus += scor / 5; loc = 153; oldloc = 0; oldlc2 = 0; { for (ikk = 1; ikk <= SCOIN; ikk++) if (obloc[ikk] != 1000 && obloc[ikk] != 3000) obloc[ikk] = 0; } obloc[ZKNAPS] = 0; } } } else if (verb == PUNCH) { if (vpunch() == 1) vbreak(); } else if (verb == ATTACK) vattak(); else if (verb == DIG) vdig(); else if (verb == GIVE || verb == FEED) vgive(); else if (verb == IS) speak(467); else if (verb == FUCK) { dirty += 1; vfuck(); } else if (loc == 127 && (verb == SHIT || verb == EXHALE || verb == PISS)) { loc = 126; oldloc = 0; oldlc2 = 0; speak(312); } else if (verb == EXHALE) speak(313); else if (verb == PISS) vpiss(); else if (verb == SHIT) vshit(); else if (verb == INVENT) vinven(); else; } else speak(46); } 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.