C SVERBS- SIMPLE VERBS PROCESSOR
C ALL VERBS IN THIS ROUTINE MUST BE INDEPENDANT
C COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
C ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
C WRITTEN BY R. M. SUPNIK
LOGICAL FUNCTION SVERBS(RI)
CHARACTER PP1(6),PP2(6),CH(6)
C MISCELLANEOUS VARIABLES
COMMON /VERS/ VMAJ,VMIN,VEDIT
QOPEN(R)=and(OFLAG2(R),OPENBT).NE.0
DATA MXNOP/39/,MXJOKE/64/
DATA JOKES/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/
DATA ANSWER/0,6,1,6,2,5,3,5,4,3,4,6,4,6,4,5,
& 5,5,5,4,5,6,6,10,7,4,7,6/
DATA ANSSTR/'T','E','M','P','L','E',
& 'F','O','R','E','S','T',
& 'F','O','N','D','L','E',
& 'C','A','R','R','E','S',
& 'S','K','E','L','E','T',
& 'R','U','S','T','Y','K','N','I','F','E',
& 'N','O','W','H','E','R','\0'/
IF(PRSO.NE.0) ODO2=ODESC2(PRSO)
IF(PRSI.NE.0) ODI2=ODESC2(PRSI)
IF(RI.EQ.0) CALL BUG(7,RI)
IF(RI.LE.MXJOKE) GO TO 100
GO TO (65000,66000,67000,68000,69000,
& 1000,2000,3000,4000,5000,6000,7000,8000,9000,10000,
& 11000,12000,13000,14000,15000,16000,17000,18000,19000,20000,
& 21000,22000,23000,24000,25000,26000,27000),
C ALL VERB PROCESSORS RETURN HERE TO DECLARE FAILURE.
C FIND PROPER ENTRY IN JOKES, USE IT TO SELECT STRING TO PRINT.
IF(J.NE.0) I=MOD(I,1000)+RND(J)
IF(.NOT.TELFLG) CALL RSPEAK(138)
67000 CALL RSPEAK(RDESC2-HERE)
C V71-- VERBOSE. CLEAR FLAGS.
C V72-- SUPERBRIEF. SET FLAG.
C V73-- STAY (USED IN ENDGAME).
4000 IF(WINNER.NE.AMASTR) GO TO 4100
4100 IF(WINNER.EQ.PLAYER) CALL RSPEAK(664)
C V74-- VERSION. PRINT INFO.
5000 call prvers(vmaj,vmin,vedit)
5000 WRITE(OUTCH,5010) VMAJ,VMIN,VEDIT
5010 FORMAT('V',I1,'.',I2,A1)
5010 FORMAT(' V',I1,'.',I2,A1)
C V75-- SWIM. ALWAYS A JOKE.
IF(and(RFLAG(HERE),(RWATER+RFILL)).EQ.0)
C V76-- GERONIMO. IF IN BARREL, FATAL, ELSE JOKE.
7000 IF(HERE.EQ.MBARR) GO TO 7100
C V77-- SINBAD ET AL. CHASE CYCLOPS, ELSE JOKE.
8000 IF((HERE.EQ.MCYCL).AND.QHERE(CYCLO,HERE)) GO TO 8100
8100 CALL NEWSTA(CYCLO,337,0,0,0)
OFLAG2(CYCLO)=and(OFLAG2(CYCLO), not(FITEBT))
C V78-- WELL. OPEN DOOR, ELSE JOKE.
9000 IF(RIDDLF.OR.(HERE.NE.RIDDL)) GO TO 9100
C V79-- PRAY. IF IN TEMP2, POOF
10000 IF(HERE.NE.TEMP2) GO TO 10050
IF(MOVETO(FORE1,WINNER)) GO TO 10100
C V80-- TREASURE. IF IN TEMP1, POOF
11000 IF(HERE.NE.TEMP1) GO TO 11050
IF(MOVETO(TREAS,WINNER)) GO TO 10100
C V81-- TEMPLE. IF IN TREAS, POOF
12000 IF(HERE.NE.TREAS) GO TO 12050
IF(MOVETO(TEMP1,WINNER)) GO TO 10100
C V82-- BLAST. USUALLY A JOKE.
C V83-- SCORE. PRINT SCORE.
14000 CALL SCORE(.FALSE.)
C V84-- QUIT. FINISH OUT THE GAME.
IF(.NOT.YESNO(343,0,0)) RETURN
C close routine moved to exit for pdp version
C V85-- FOLLOW (USED IN ENDGAME)
16000 IF(WINNER.NE.AMASTR) RETURN
17000 IF((SCOLRM.EQ.0).OR.((PRSO.NE.SCOL).AND.
& ((PRSO.NE.WNORT).OR.(HERE.NE.BKBOX)))) GO TO 17100
17100 IF(HERE.NE.SCOLAC) GO TO 17300
C !ON OTHER SIDE OF SCOL?
C !WALK THRU PROPER WALL?
IF((SCOLWL(I).EQ.HERE).AND.(SCOLWL(I+1).EQ.PRSO))
17300 IF(and(OFLAG1(PRSO),TAKEBT).NE.0) GO TO 17400
C !SPECIAL JOKE FOR SCOL.
IF(OROOM(PRSO).NE.0) I=552+RND(5)
C !SPECIAL JOKES IF CARRY.
IF(PRSO.EQ.SCOLDR(I)) SCOLRM=SCOLDR(I+1)
C V88-- BRUSH. JOKE WITH OBSCURE TRAP.
19000 IF(PRSO.EQ.TEETH) GO TO 19100
19100 IF(PRSI.NE.0) GO TO 19200
19200 IF((PRSI.EQ.PUTTY).AND.(OADV(PUTTY).EQ.WINNER))
C V89-- DIG. UNLESS SHOVEL, A JOKE.
20000 IF(PRSO.EQ.SHOVE) RETURN
IF(and(OFLAG1(PRSO),TOOLBT).EQ.0) I=393
C V90-- TIME. PRINT OUT DURATION OF GAME.
C no duration time available for pdp version (removed
IF(I.EQ.0.AND.J.EQ.1) WRITE(OUTCH,21010) J
IF(I.EQ.0.AND.J.NE.1) WRITE(OUTCH,21011) J
IF(I.EQ.1.AND.J.EQ.1) WRITE(OUTCH,21012) I,J
IF(I.EQ.1.AND.J.NE.1) WRITE(OUTCH,21013) I,J
IF(I.GE.2.AND.J.EQ.1) WRITE(OUTCH,21014) I,J
IF(I.GE.2.AND.J.NE.1) WRITE(OUTCH,21015) I,J
21010 FORMAT('You have been playing Dungeon for ',I2,' minute.')
21011 FORMAT('You have been playing Dungeon for ',I2,' minutes.')
21012 FORMAT('You have been playing Dungeon for ',I3,' hour and ',
21013 FORMAT('You have been playing Dungeon for ',I3,' hour and ',
21014 FORMAT('You have been playing Dungeon for ',I3,' hours and ',
21015 FORMAT('You have been playing Dungeon for ',I3,' hours and ',
IF(I.NE.0) WRITE(OUTCH,21011) I
IF(I.GE.2) WRITE(OUTCH,21012)
IF(I.EQ.1) WRITE(OUTCH,21013)
IF(J.EQ.1) WRITE(OUTCH,21014) J
IF(J.NE.1) WRITE(OUTCH,21015) J
21010 FORMAT(' You have been playing Dungeon for ',$)
21011 FORMAT('+',I3,' hour',$)
21012 FORMAT('+s and ',$)
21014 FORMAT('+',I2,' minute.')
21015 FORMAT('+',I2,' minutes.')
C V91-- LEAP. USUALLY A JOKE, WITH A CATCH.
22000 IF(PRSO.EQ.0) GO TO 22200
IF(QHERE(PRSO,HERE)) GO TO 22100
22100 IF(and(OFLAG2(PRSO),VILLBT).EQ.0) GO TO 22300
22200 IF(.NOT.FINDXT(XDOWN,HERE)) GO TO 22300
IF((XTYPE.EQ.XNO).OR.((XTYPE.EQ.XCOND).AND.
& .NOT.FLAGS(XFLAG))) GO TO 22400
22300 CALL RSPEAK(314+RND(5))
22400 CALL JIGSUP(449+RND(4))
23000 IF((PRSO.EQ.GRATE).AND.(HERE.EQ.MGRAT))
TRAVEL(REXIT(HERE)+1)=214
24000 IF((PRSO.NE.GRATE).OR.(HERE.NE.MGRAT))
IF(PRSI.EQ.KEYS) GO TO 24200
TRAVEL(REXIT(HERE)+1)=217
25000 I=FIGHTS(WINNER,.FALSE.)
IF(.NOT.CFLAG(CEVCUR)) J=0
I=(30*(-J-1))+CTICK(CEVCUR)
if(J .ne. 0) call cured(I)
IF(J.NE.0) WRITE(OUTCH,25100) I
25100 FORMAT('You will be cured after ',I3,' moves.')
25100 FORMAT(' You will be cured after ',I3,' moves.')
IF(DEATHS.NE.0) CALL RSPEAK(482+DEATHS)
IF(PRSCON.LE.1) GO TO 26300
IF(INBUF(I).EQ.',') GO TO 26300
IF(INBUF(I).NE.' ') GO TO 26150
26150 IF(WP.EQ.1) PP1(CP)=INBUF(I)
IF(WP.EQ.2) PP2(CP)=INBUF(I)
IF(PP1(1).NE.' ') GO TO 26400
26400 CALL ENCRYP(PP1,CH)
IF(PP2(1).NE.' ') GO TO 26600
IF(and(RFLAG(TSTRS),RSEEN).EQ.0) GO TO 26575
WRITE(OUTCH,26510) PP1,CH
26510 FORMAT('A hollow voice replies: "',6A1,1X,6A1,'".')
26510 FORMAT(' A hollow voice replies: "',6A1,1X,6A1,'".')
26600 IF(and(RFLAG(TSTRS),RSEEN).NE.0) GO TO 26800
IF(PP2(I).NE.CH(I)) GO TO 26575
27000 IF((PRSCON.GT.1).AND.
& (HERE.EQ.FDOOR).AND.INQSTF)
IF(QUESNO.NE.ANSWER(J)) GO TO 27300
C !ONLY CHECK PROPER ANS.
IF(I.GT.INLNT) GO TO 27300
IF(INBUF(I).EQ.' ') GO TO 27150
IF(INBUF(I).NE.ANSSTR(L)) GO TO 27300
IF(NQATT.GE.5) GO TO 27400
IF(CORRCT.GE.3) GO TO 27600
OFLAG2(QDOOR)=or(OFLAG2(QDOOR),OPENBT)