mirror of https://github.com/sean-m/zork
872 lines
17 KiB
C
872 lines
17 KiB
C
/* 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 <stdio.h>
|
|
#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_ */
|