/* SVERBS- SIMPLE VERBS PROCESSOR */ /* ALL VERBS IN THIS ROUTINE MUST BE INDEPENDANT */ /* OF OBJECT ACTIONS */ /*COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142*/ /* ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED */ /* WRITTEN BY R. M. SUPNIK */ #include #include "funcs.h" #include "vars.h" logical sverbs_(ri) integer ri; { /* Initialized data */ const integer mxnop = 39; const integer mxjoke = 64; static const integer jokes[25] = { 4,5,3,304,305,306,307,308,309,310,311, 312,313,5314,5319,324,325,883,884,120,120,0,0,0,0 }; static const integer answer[14] = { 0,1,2,3,4,4,4,4,5,5,5,6,7,7}; static const char * const ansstr[14] = { "TEMPLE", "FOREST", "30003", "FLASK", "RUB", "FONDLE", "CARRES", "TOUCH", "BONES", "BODY", "SKELE", "RUSTYKNIFE", "NONE", "NOWHER" }; /* System generated locals */ integer i__1, i__2; logical ret_val; /* Local variables */ logical f; const char *z, *z2; integer i, j; integer k; integer l; char ch[1*6]; integer cp, wp; char pp1[1*6], pp2[1*6]; integer odi2 = 0, odo2 = 0; ret_val = TRUE_; /* !ASSUME WINS. */ if (prsvec_1.prso != 0) { odo2 = objcts_1.odesc2[prsvec_1.prso - 1]; } /* !SET UP DESCRIPTORS. */ if (prsvec_1.prsi != 0) { odi2 = objcts_1.odesc2[prsvec_1.prsi - 1]; } if (ri == 0) { bug_(7, ri); } /* !ZERO IS VERBOTEN. */ if (ri <= mxnop) { return ret_val; } /* !NOP? */ if (ri <= mxjoke) { goto L100; } /* !JOKE? */ switch (ri - mxjoke) { case 1: goto L65000; case 2: goto L66000; case 3: goto L67000; case 4: goto L68000; case 5: goto L69000; case 6: goto L1000; case 7: goto L2000; case 8: goto L3000; case 9: goto L4000; case 10: goto L5000; case 11: goto L6000; case 12: goto L7000; case 13: goto L8000; case 14: goto L9000; case 15: goto L10000; case 16: goto L11000; case 17: goto L12000; case 18: goto L13000; case 19: goto L14000; case 20: goto L15000; case 21: goto L16000; case 22: goto L17000; case 23: goto L18000; case 24: goto L19000; case 25: goto L20000; case 26: goto L21000; case 27: goto L22000; case 28: goto L23000; case 29: goto L24000; case 30: goto L25000; case 31: goto L26000; case 32: goto L27000; } bug_(7, ri); /* ALL VERB PROCESSORS RETURN HERE TO DECLARE FAILURE. */ /* L10: */ ret_val = FALSE_; /* !LOSE. */ return ret_val; /* JOKE PROCESSOR. */ /* FIND PROPER ENTRY IN JOKES, USE IT TO SELECT STRING TO PRINT. */ L100: i = jokes[ri - mxnop - 1]; /* !GET TABLE ENTRY. */ j = i / 1000; /* !ISOLATE # STRINGS. */ if (j != 0) { i = i % 1000 + rnd_(j); } /* !IF RANDOM, CHOOSE. */ rspeak_(i); /* !PRINT JOKE. */ return ret_val; /* SVERBS, PAGE 2A */ /* V65-- ROOM */ L65000: ret_val = rmdesc_(2); /* !DESCRIBE ROOM ONLY. */ return ret_val; /* V66-- OBJECTS */ L66000: ret_val = rmdesc_(1); /* !DESCRIBE OBJ ONLY. */ if (! play_1.telflg) { rspeak_(138); } /* !NO OBJECTS. */ return ret_val; /* V67-- RNAME */ L67000: i__1 = rooms_1.rdesc2[play_1.here - 1]; rspeak_(i__1); /* !SHORT ROOM NAME. */ return ret_val; /* V68-- RESERVED */ L68000: return ret_val; /* V69-- RESERVED */ L69000: return ret_val; /* SVERBS, PAGE 3 */ /* V70-- BRIEF. SET FLAG. */ L1000: findex_1.brieff = TRUE_; /* !BRIEF DESCRIPTIONS. */ findex_1.superf = FALSE_; rspeak_(326); return ret_val; /* V71-- VERBOSE. CLEAR FLAGS. */ L2000: findex_1.brieff = FALSE_; /* !LONG DESCRIPTIONS. */ findex_1.superf = FALSE_; rspeak_(327); return ret_val; /* V72-- SUPERBRIEF. SET FLAG. */ L3000: findex_1.superf = TRUE_; rspeak_(328); return ret_val; /* V73-- STAY (USED IN ENDGAME). */ L4000: if (play_1.winner != aindex_1.amastr) { goto L4100; } /* !TELL MASTER, STAY. */ rspeak_(781); /* !HE DOES. */ cevent_1.ctick[cindex_1.cevfol - 1] = 0; /* !NOT FOLLOWING. */ return ret_val; L4100: if (play_1.winner == aindex_1.player) { rspeak_(664); } /* !JOKE. */ return ret_val; /* V74-- VERSION. PRINT INFO. */ L5000: more_output(NULL); printf("V%1d.%1d%c\n", vers_1.vmaj, vers_1.vmin, vers_1.vedit); play_1.telflg = TRUE_; return ret_val; /* V75-- SWIM. ALWAYS A JOKE. */ L6000: i = 330; /* !ASSUME WATER. */ if ((rooms_1.rflag[play_1.here - 1] & RWATER + RFILL) == 0) { i = rnd_(3) + 331; } rspeak_(i); return ret_val; /* V76-- GERONIMO. IF IN BARREL, FATAL, ELSE JOKE. */ L7000: if (play_1.here == rindex_1.mbarr) { goto L7100; } /* !IN BARREL? */ rspeak_(334); /* !NO, JOKE. */ return ret_val; L7100: jigsup_(335); /* !OVER FALLS. */ return ret_val; /* V77-- SINBAD ET AL. CHASE CYCLOPS, ELSE JOKE. */ L8000: if (play_1.here == rindex_1.mcycl && qhere_(oindex_1.cyclo, play_1.here) ) { goto L8100; } rspeak_(336); /* !NOT HERE, JOKE. */ return ret_val; L8100: newsta_(oindex_1.cyclo, 337, 0, 0, 0); /* !CYCLOPS FLEES. */ findex_1.cyclof = TRUE_; /* !SET ALL FLAGS. */ findex_1.magicf = TRUE_; objcts_1.oflag2[oindex_1.cyclo - 1] &= ~ FITEBT; return ret_val; /* V78-- WELL. OPEN DOOR, ELSE JOKE. */ L9000: if (findex_1.riddlf || play_1.here != rindex_1.riddl) { goto L9100; } /* !IN RIDDLE ROOM? */ findex_1.riddlf = TRUE_; /* !YES, SOLVED IT. */ rspeak_(338); return ret_val; L9100: rspeak_(339); /* !WELL, WHAT? */ return ret_val; /* V79-- PRAY. IF IN TEMP2, POOF */ /* ! */ L10000: if (play_1.here != rindex_1.temp2) { goto L10050; } /* !IN TEMPLE? */ if (moveto_(rindex_1.fore1, play_1.winner)) { goto L10100; } /* !FORE1 STILL THERE? */ L10050: rspeak_(340); /* !JOKE. */ return ret_val; L10100: f = rmdesc_(3); /* !MOVED, DESCRIBE. */ return ret_val; /* V80-- TREASURE. IF IN TEMP1, POOF */ /* ! */ L11000: if (play_1.here != rindex_1.temp1) { goto L11050; } /* !IN TEMPLE? */ if (moveto_(rindex_1.treas, play_1.winner)) { goto L10100; } /* !TREASURE ROOM THERE? */ L11050: rspeak_(341); /* !NOTHING HAPPENS. */ return ret_val; /* V81-- TEMPLE. IF IN TREAS, POOF */ /* ! */ L12000: if (play_1.here != rindex_1.treas) { goto L12050; } /* !IN TREASURE? */ if (moveto_(rindex_1.temp1, play_1.winner)) { goto L10100; } /* !TEMP1 STILL THERE? */ L12050: rspeak_(341); /* !NOTHING HAPPENS. */ return ret_val; /* V82-- BLAST. USUALLY A JOKE. */ L13000: i = 342; /* !DONT UNDERSTAND. */ if (prsvec_1.prso == oindex_1.safe) { i = 252; } /* !JOKE FOR SAFE. */ rspeak_(i); return ret_val; /* V83-- SCORE. PRINT SCORE. */ L14000: score_(0); return ret_val; /* V84-- QUIT. FINISH OUT THE GAME. */ L15000: score_(1); /* !TELLL SCORE. */ if (! yesno_(343, 0, 0)) { return ret_val; } /* !ASK FOR Y/N DECISION. */ exit_(); /* !BYE. */ /* SVERBS, PAGE 4 */ /* V85-- FOLLOW (USED IN ENDGAME) */ L16000: if (play_1.winner != aindex_1.amastr) { return ret_val; } /* !TELL MASTER, FOLLOW. */ rspeak_(782); cevent_1.ctick[cindex_1.cevfol - 1] = -1; /* !STARTS FOLLOWING. */ return ret_val; /* V86-- WALK THROUGH */ L17000: if (screen_1.scolrm == 0 || prsvec_1.prso != oindex_1.scol && ( prsvec_1.prso != oindex_1.wnort || play_1.here != rindex_1.bkbox)) { goto L17100; } screen_1.scolac = screen_1.scolrm; /* !WALKED THRU SCOL. */ prsvec_1.prso = 0; /* !FAKE OUT FROMDR. */ cevent_1.ctick[cindex_1.cevscl - 1] = 6; /* !START ALARM. */ rspeak_(668); /* !DISORIENT HIM. */ f = moveto_(screen_1.scolrm, play_1.winner); /* !INTO ROOM. */ f = rmdesc_(3); /* !DESCRIBE. */ return ret_val; L17100: if (play_1.here != screen_1.scolac) { goto L17300; } /* !ON OTHER SIDE OF SCOL? */ for (i = 1; i <= 12; i += 3) { /* !WALK THRU PROPER WALL? */ if (screen_1.scolwl[i - 1] == play_1.here && screen_1.scolwl[i] == prsvec_1.prso) { goto L17500; } /* L17200: */ } L17300: if ((objcts_1.oflag1[prsvec_1.prso - 1] & TAKEBT) != 0) { goto L17400; } i = 669; /* !NO, JOKE. */ if (prsvec_1.prso == oindex_1.scol) { i = 670; } /* !SPECIAL JOKE FOR SCOL. */ rspsub_(i, odo2); return ret_val; L17400: i = 671; /* !JOKE. */ if (objcts_1.oroom[prsvec_1.prso - 1] != 0) { i = rnd_(5) + 552; } /* !SPECIAL JOKES IF CARRY. */ rspeak_(i); return ret_val; L17500: prsvec_1.prso = screen_1.scolwl[i + 1]; /* !THRU SCOL WALL... */ for (i = 1; i <= 8; i += 2) { /* !FIND MATCHING ROOM. */ if (prsvec_1.prso == screen_1.scoldr[i - 1]) { screen_1.scolrm = screen_1.scoldr[i]; } /* L17600: */ } /* !DECLARE NEW SCOLRM. */ cevent_1.ctick[cindex_1.cevscl - 1] = 0; /* !CANCEL ALARM. */ rspeak_(668); /* !DISORIENT HIM. */ f = moveto_(rindex_1.bkbox, play_1.winner); /* !BACK IN BOX ROOM. */ f = rmdesc_(3); return ret_val; /* V87-- RING. A JOKE. */ L18000: i = 359; /* !CANT RING. */ if (prsvec_1.prso == oindex_1.bell) { i = 360; } /* !DING, DONG. */ rspeak_(i); /* !JOKE. */ return ret_val; /* V88-- BRUSH. JOKE WITH OBSCURE TRAP. */ L19000: if (prsvec_1.prso == oindex_1.teeth) { goto L19100; } /* !BRUSH TEETH? */ rspeak_(362); /* !NO, JOKE. */ return ret_val; L19100: if (prsvec_1.prsi != 0) { goto L19200; } /* !WITH SOMETHING? */ rspeak_(363); /* !NO, JOKE. */ return ret_val; L19200: if (prsvec_1.prsi == oindex_1.putty && objcts_1.oadv[oindex_1.putty - 1] == play_1.winner) { goto L19300; } rspsub_(364, odi2); /* !NO, JOKE. */ return ret_val; L19300: jigsup_(365); /* !YES, DEAD */ /* ! */ /* ! */ /* ! */ /* ! */ /* ! */ return ret_val; /* SVERBS, PAGE 5 */ /* V89-- DIG. UNLESS SHOVEL, A JOKE. */ L20000: if (prsvec_1.prso == oindex_1.shove) { return ret_val; } /* !SHOVEL? */ i = 392; /* !ASSUME TOOL. */ if ((objcts_1.oflag1[prsvec_1.prso - 1] & TOOLBT) == 0) { i = 393; } rspsub_(i, odo2); return ret_val; /* V90-- TIME. PRINT OUT DURATION OF GAME. */ L21000: gttime_(&k); /* !GET PLAY TIME. */ i = k / 60; j = k % 60; more_output(NULL); printf("You have been playing Dungeon for "); if (i >= 1) { printf("%d hour", i); if (i >= 2) printf("s"); printf(" and "); } printf("%d minute", j); if (j != 1) printf("s"); printf(".\n"); play_1.telflg = TRUE_; return ret_val; /* V91-- LEAP. USUALLY A JOKE, WITH A CATCH. */ L22000: if (prsvec_1.prso == 0) { goto L22200; } /* !OVER SOMETHING? */ if (qhere_(prsvec_1.prso, play_1.here)) { goto L22100; } /* !HERE? */ rspeak_(447); /* !NO, JOKE. */ return ret_val; L22100: if ((objcts_1.oflag2[prsvec_1.prso - 1] & VILLBT) == 0) { goto L22300; } rspsub_(448, odo2); /* !CANT JUMP VILLAIN. */ return ret_val; L22200: if (! findxt_(xsrch_1.xdown, play_1.here)) { goto L22300; } /* !DOWN EXIT? */ if (curxt_1.xtype == xpars_1.xno || curxt_1.xtype == xpars_1.xcond && ! flags[*xflag - 1]) { goto L22400; } L22300: i__1 = rnd_(5) + 314; rspeak_(i__1); /* !WHEEEE */ /* ! */ return ret_val; L22400: i__1 = rnd_(4) + 449; jigsup_(i__1); /* !FATAL LEAP. */ return ret_val; /* SVERBS, PAGE 6 */ /* V92-- LOCK. */ L23000: if (prsvec_1.prso == oindex_1.grate && play_1.here == rindex_1.mgrat) { goto L23200; } L23100: rspeak_(464); /* !NOT LOCK GRATE. */ return ret_val; L23200: findex_1.grunlf = FALSE_; /* !GRATE NOW LOCKED. */ rspeak_(214); exits_1.travel[rooms_1.rexit[play_1.here - 1]] = 214; /* !CHANGE EXIT STATUS. */ return ret_val; /* V93-- UNLOCK */ L24000: if (prsvec_1.prso != oindex_1.grate || play_1.here != rindex_1.mgrat) { goto L23100; } if (prsvec_1.prsi == oindex_1.keys) { goto L24200; } /* !GOT KEYS? */ rspsub_(465, odi2); /* !NO, JOKE. */ return ret_val; L24200: findex_1.grunlf = TRUE_; /* !UNLOCK GRATE. */ rspeak_(217); exits_1.travel[rooms_1.rexit[play_1.here - 1]] = 217; /* !CHANGE EXIT STATUS. */ return ret_val; /* V94-- DIAGNOSE. */ L25000: i = fights_(play_1.winner, 0); /* !GET FIGHTS STRENGTH. */ j = advs_1.astren[play_1.winner - 1]; /* !GET HEALTH. */ /* Computing MIN */ i__1 = i + j; k = min(i__1,4); /* !GET STATE. */ if (! cevent_1.cflag[cindex_1.cevcur - 1]) { j = 0; } /* !IF NO WOUNDS. */ /* Computing MIN */ i__1 = 4, i__2 = abs(j); l = min(i__1,i__2); /* !SCALE. */ i__1 = l + 473; rspeak_(i__1); /* !DESCRIBE HEALTH. */ i = (-j - 1) * 30 + cevent_1.ctick[cindex_1.cevcur - 1]; /* !COMPUTE WAIT. */ if (j != 0) { more_output(NULL); printf("You will be cured after %d moves.\n", i); } i__1 = k + 478; rspeak_(i__1); /* !HOW MUCH MORE? */ if (state_1.deaths != 0) { i__1 = state_1.deaths + 482; rspeak_(i__1); } /* !HOW MANY DEATHS? */ return ret_val; /* SVERBS, PAGE 7 */ /* V95-- INCANT */ L26000: for (i = 1; i <= 6; ++i) { /* !SET UP PARSE. */ pp1[i - 1] = ' '; pp2[i - 1] = ' '; /* L26100: */ } wp = 1; /* !WORD POINTER. */ cp = 1; /* !CHAR POINTER. */ if (prsvec_1.prscon <= 1) { goto L26300; } for (z = input_1.inbuf + prsvec_1.prscon - 1; *z != '\0'; ++z) { /* !PARSE INPUT */ if (*z == ',') goto L26300; /* !END OF PHRASE? */ if (*z != ' ') goto L26150; /* !SPACE? */ if (cp != 1) { ++wp; } cp = 1; goto L26200; L26150: if (wp == 1) { pp1[cp - 1] = *z; } /* !STUFF INTO HOLDER. */ if (wp == 2) { pp2[cp - 1] = *z; } /* Computing MIN */ i__2 = cp + 1; cp = min(i__2,6); L26200: ; } L26300: prsvec_1.prscon = 1; /* !KILL REST OF LINE. */ if (pp1[0] != ' ') { goto L26400; } /* !ANY INPUT? */ rspeak_(856); /* !NO, HO HUM. */ return ret_val; L26400: encryp_(pp1, ch); /* !COMPUTE RESPONSE. */ if (pp2[0] != ' ') { goto L26600; } /* !TWO PHRASES? */ if (findex_1.spellf) { goto L26550; } /* !HE'S TRYING TO LEARN. */ if ((rooms_1.rflag[rindex_1.tstrs - 1] & RSEEN) == 0) { goto L26575; } findex_1.spellf = TRUE_; /* !TELL HIM. */ play_1.telflg = TRUE_; more_output(NULL); printf("A hollow voice replies: \"%.6s %.6s\".\n", pp1, ch); return ret_val; L26550: rspeak_(857); /* !HE'S GOT ONE ALREADY. */ return ret_val; L26575: rspeak_(858); /* !HE'S NOT IN ENDGAME. */ return ret_val; L26600: if ((rooms_1.rflag[rindex_1.tstrs - 1] & RSEEN) != 0) { goto L26800; } for (i = 1; i <= 6; ++i) { if (pp2[i - 1] != ch[i - 1]) { goto L26575; } /* !WRONG. */ /* L26700: */ } findex_1.spellf = TRUE_; /* !IT WORKS. */ rspeak_(859); cevent_1.ctick[cindex_1.cevste - 1] = 1; /* !FORCE START. */ return ret_val; L26800: rspeak_(855); /* !TOO LATE. */ return ret_val; /* SVERBS, PAGE 8 */ /* V96-- ANSWER */ L27000: if (prsvec_1.prscon > 1 && play_1.here == rindex_1.fdoor && findex_1.inqstf) { goto L27100; } rspeak_(799); /* !NO ONE LISTENS. */ prsvec_1.prscon = 1; return ret_val; L27100: for (j = 1; j <= 14; j ++) { /* !CHECK ANSWERS. */ if (findex_1.quesno != answer[j - 1]) goto L27300; /* !ONLY CHECK PROPER ANS. */ z = ansstr[j - 1]; z2 = input_1.inbuf + prsvec_1.prscon - 1; while (*z != '\0') { while (*z2 == ' ') z2++; /* !STRIP INPUT BLANKS. */ if (*z++ != *z2++) goto L27300; } goto L27500; /* !RIGHT ANSWER. */ L27300: ; } prsvec_1.prscon = 1; /* !KILL REST OF LINE. */ ++findex_1.nqatt; /* !WRONG, CRETIN. */ if (findex_1.nqatt >= 5) { goto L27400; } /* !TOO MANY WRONG? */ i__1 = findex_1.nqatt + 800; rspeak_(i__1); /* !NO, TRY AGAIN. */ return ret_val; L27400: rspeak_(826); /* !ALL OVER. */ cevent_1.cflag[cindex_1.cevinq - 1] = FALSE_; /* !LOSE. */ return ret_val; L27500: prsvec_1.prscon = 1; /* !KILL REST OF LINE. */ ++findex_1.corrct; /* !GOT IT RIGHT. */ rspeak_(800); /* !HOORAY. */ if (findex_1.corrct >= 3) { goto L27600; } /* !WON TOTALLY? */ cevent_1.ctick[cindex_1.cevinq - 1] = 2; /* !NO, START AGAIN. */ findex_1.quesno = (findex_1.quesno + 3) % 8; findex_1.nqatt = 0; rspeak_(769); /* !ASK NEXT QUESTION. */ i__1 = findex_1.quesno + 770; rspeak_(i__1); return ret_val; L27600: rspeak_(827); /* !QUIZ OVER, */ cevent_1.cflag[cindex_1.cevinq - 1] = FALSE_; objcts_1.oflag2[oindex_1.qdoor - 1] |= OPENBT; return ret_val; } /* sverbs_ */