home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol045 / sverbs.ftn < prev    next >
Encoding:
Text File  |  1984-04-29  |  17.5 KB  |  655 lines

  1. C SVERBS-    SIMPLE VERBS PROCESSOR
  2. C    ALL VERBS IN THIS ROUTINE MUST BE INDEPENDANT
  3. C    OF OBJECT ACTIONS
  4. C
  5. C COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
  6. C ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
  7. C WRITTEN BY R. M. SUPNIK
  8. C
  9. C DECLARATIONS
  10. C
  11.     LOGICAL FUNCTION SVERBS(RI)
  12.     IMPLICIT INTEGER (A-Z)
  13.     LOGICAL MOVETO,YESNO
  14.     LOGICAL RMDESC
  15.     LOGICAL QOPEN
  16.     LOGICAL FINDXT,QHERE,F
  17.     INTEGER JOKES(25)
  18.     LOGICAL*1 ANSSTR(78)
  19.     LOGICAL*1 P1(6),P2(6),CH(6)
  20.     INTEGER ANSWER(28)
  21. C
  22. C PARSER OUTPUT
  23. C
  24.     LOGICAL PRSWON
  25.     COMMON /PRSVEC/ PRSA,PRSI,PRSO,PRSWON,PRSCON
  26. C
  27. C GAME STATE
  28. C
  29.     LOGICAL TELFLG
  30.     COMMON /PLAY/ WINNER,HERE,TELFLG
  31.     COMMON /STATE/ MOVES,DEATHS,RWSCOR,MXSCOR,MXLOAD,
  32.     1    LTSHFT,BLOC,MUNGRM,HS,EGSCOR,EGMXSC
  33. C
  34. C SCREEN OF LIGHT
  35. C
  36.     COMMON /SCREEN/ FROMDR,SCOLRM,SCOLAC
  37.     COMMON /SCREEN/ SCOLDR(8),SCOLWL(12)
  38. C
  39. C MISCELLANEOUS VARIABLES
  40. C
  41.     LOGICAL*1 INBUF
  42.     COMMON /INPUT/ INLNT,INBUF(78)
  43.     COMMON /VERS/ VMAJ,VMIN,VEDIT
  44.     COMMON /CHAN/ INPCH,OUTCH,DBCH
  45. C
  46. C ROOMS
  47. C
  48.     COMMON /ROOMS/ RLNT,RDESC2,RDESC1(200),REXIT(200),
  49.     1    RACTIO(200),RVAL(200),RFLAG(200)
  50.     INTEGER RRAND(200)
  51.     EQUIVALENCE (RVAL,RRAND)
  52. C
  53.     COMMON /RFLAG/ RSEEN,RLIGHT,RLAND,RWATER,RAIR,
  54.     1    RSACRD,RFILL,RMUNG,RBUCK,RHOUSE,RNWALL,REND
  55. C
  56.     COMMON /RINDEX/ WHOUS,LROOM,CELLA
  57.     COMMON /RINDEX/ MTROL,MAZE1    
  58.     COMMON /RINDEX/ MGRAT,MAZ15    
  59.     COMMON /RINDEX/ FORE1,FORE3,CLEAR,RESER
  60.     COMMON /RINDEX/ STREA,EGYPT,ECHOR
  61.     COMMON /RINDEX/ TSHAF    
  62.     COMMON /RINDEX/ BSHAF,MMACH,DOME,MTORC
  63.     COMMON /RINDEX/ CAROU    
  64.     COMMON /RINDEX/ RIDDL,LLD2,TEMP1,TEMP2,MAINT
  65.     COMMON /RINDEX/ BLROO,TREAS,RIVR1,RIVR2,RIVR3,MCYCL
  66.     COMMON /RINDEX/ RIVR4,RIVR5,FCHMP,FALLS,MBARR
  67.     COMMON /RINDEX/ MRAIN,POG,VLBOT,VAIR1,VAIR2,VAIR3,VAIR4
  68.     COMMON /RINDEX/ LEDG2,LEDG3,LEDG4,MSAFE,CAGER
  69.     COMMON /RINDEX/ CAGED,TWELL,BWELL,ALICE,ALISM,ALITR
  70.     COMMON /RINDEX/ MTREE,BKENT,BKVW,BKTWI,BKVAU,BKBOX
  71.     COMMON /RINDEX/ CRYPT,TSTRS,MRANT,MREYE
  72.     COMMON /RINDEX/ MRA,MRB,MRC,MRG,MRD,FDOOR
  73.     COMMON /RINDEX/ MRAE,MRCE,MRCW,MRGE,MRGW,MRDW,INMIR
  74.     COMMON /RINDEX/ SCORR,NCORR,PARAP,CELL,PCELL,NCELL
  75.     COMMON /RINDEX/ CPANT,CPOUT,CPUZZ
  76. C
  77. C EXITS
  78. C
  79.     COMMON /EXITS/ XLNT,TRAVEL(900)
  80. C
  81.     COMMON /CURXT/ XTYPE,XROOM1,XSTRNG,XACTIO,XOBJ
  82.     EQUIVALENCE (XFLAG,XOBJ)
  83. C
  84.     COMMON /XPARS/ XRMASK,XDMASK,XFMASK,XFSHFT,XASHFT,
  85.     1    XELNT(4),XNORM,XNO,XCOND,XDOOR,XLFLAG
  86. C
  87.     COMMON /XSRCH/ XMIN,XMAX,XDOWN,XUP,
  88.     1    XNORTH,XSOUTH,XENTER,XEXIT,XEAST,XWEST
  89. C
  90. C OBJECTS
  91. C
  92.     COMMON /OBJCTS/ OLNT,ODESC1(220),ODESC2(220),ODESCO(220),
  93.     1    OACTIO(220),OFLAG1(220),OFLAG2(220),OFVAL(220),
  94.     2    OTVAL(220),OSIZE(220),OCAPAC(220),OROOM(220),
  95.     3    OADV(220),OCAN(220),OREAD(220)
  96. C
  97.     COMMON /OFLAGS/ VISIBT,READBT,TAKEBT,DOORBT,TRANBT,FOODBT,
  98.     1    NDSCBT,DRNKBT,CONTBT,LITEBT,VICTBT,BURNBT,FLAMBT,
  99.     2    TOOLBT,TURNBT,ONBT
  100.     COMMON /OFLAGS/ FINDBT,SLEPBT,SCRDBT,TIEBT,CLMBBT,ACTRBT,
  101.     1    WEAPBT,FITEBT,VILLBT,STAGBT,TRYBT,NOCHBT,OPENBT,
  102.     2    TCHBT,VEHBT,SCHBT
  103. C
  104.     COMMON /OINDEX/ GARLI,FOOD,GUNK,COAL,MACHI,DIAMO,TCASE,BOTTL
  105.     COMMON /OINDEX/ WATER,ROPE,KNIFE,SWORD,LAMP,BLAMP,RUG
  106.     COMMON /OINDEX/    LEAVE,TROLL,AXE
  107.     COMMON /OINDEX/ RKNIF,KEYS,ICE,BAR
  108.     COMMON /OINDEX/ COFFI,TORCH,TBASK,FBASK,IRBOX
  109.     COMMON /OINDEX/ GHOST,TRUNK,BELL,BOOK,CANDL
  110.     COMMON /OINDEX/ MATCH,TUBE,PUTTY,WRENC,SCREW,CYCLO,CHALI
  111.     COMMON /OINDEX/ THIEF,STILL,WINDO,GRATE,DOOR
  112.     COMMON /OINDEX/ HPOLE,LEAK,RBUTT,RAILI
  113.     COMMON /OINDEX/ POT,STATU,IBOAT,DBOAT,PUMP,RBOAT
  114.     COMMON /OINDEX/ STICK,BUOY,SHOVE,BALLO,RECEP,GUANO
  115.     COMMON /OINDEX/ BROPE,HOOK1,HOOK2,SAFE,SSLOT,BRICK,FUSE
  116.     COMMON /OINDEX/ GNOME,BLABE,DBALL,TOMB
  117.     COMMON /OINDEX/ LCASE,CAGE,RCAGE,SPHER,SQBUT
  118.     COMMON /OINDEX/ FLASK,POOL,SAFFR,BUCKE,ECAKE,ORICE,RDICE,BLICE
  119.     COMMON /OINDEX/ ROBOT,FTREE,BILLS,PORTR,SCOL,ZGNOM
  120.     COMMON /OINDEX/ EGG,BEGG,BAUBL,CANAR,BCANA
  121.     COMMON /OINDEX/ YLWAL,RDWAL,PINDR,RBEAM
  122.     COMMON /OINDEX/ ODOOR,QDOOR,CDOOR,NUM1,NUM8
  123.     COMMON /OINDEX/ WARNI,CSLIT,GCARD,STLDR
  124.     COMMON /OINDEX/ HANDS,WALL,LUNGS,SAILO,AVIAT,TEETH
  125.     COMMON /OINDEX/ ITOBJ,EVERY,VALUA,OPLAY,WNORT,GWATE,MASTER
  126. C
  127. C CLOCK INTERRUPTS
  128. C
  129.     LOGICAL*1 CFLAG
  130.     COMMON /CEVENT/ CLNT,CTICK(25),CACTIO(25),CFLAG(25)
  131. C
  132.     COMMON /CINDEX/ CEVCUR,CEVMNT,CEVLNT,CEVMAT,CEVCND,
  133.     1    CEVBAL,CEVBRN,CEVFUS,CEVLED,CEVSAF,CEVVLG,
  134.     2    CEVGNO,CEVBUC,CEVSPH,CEVEGH,
  135.     3    CEVFOR,CEVSCL,CEVZGI,CEVZGO,CEVSTE,
  136.     5    CEVMRS,CEVPIN,CEVINQ,CEVFOL
  137.  
  138. C
  139. C ADVENTURERS
  140. C
  141.     COMMON /ADVS/ ALNT,AROOM(4),ASCORE(4),AVEHIC(4),
  142.     1    AOBJ(4),AACTIO(4),ASTREN(4),AFLAG(4)
  143. C
  144.     COMMON /AINDEX/ PLAYER,AROBOT,AMASTR
  145. C
  146. C VERBS
  147. C
  148.     COMMON /VINDEX/ CINTW,DEADXW,FRSTQW,INXW,OUTXW
  149.     COMMON /VINDEX/ WALKIW,FIGHTW,FOOW
  150.     COMMON /VINDEX/ MELTW,READW,INFLAW,DEFLAW,ALARMW,EXORCW
  151.     COMMON /VINDEX/ PLUGW,KICKW,WAVEW,RAISEW,LOWERW,RUBW
  152.     COMMON /VINDEX/ PUSHW,UNTIEW,TIEW,TIEUPW,TURNW,BREATW
  153.     COMMON /VINDEX/ KNOCKW,LOOKW,EXAMIW,SHAKEW,MOVEW,TRNONW,TRNOFW
  154.     COMMON /VINDEX/ OPENW,CLOSEW,FINDW,WAITW,SPINW,BOARDW,UNBOAW,TAKEW
  155.     COMMON /VINDEX/ INVENW,FILLW,EATW,DRINKW,BURNW
  156.     COMMON /VINDEX/ MUNGW,KILLW,ATTACW,SWINGW
  157.     COMMON /VINDEX/ WALKW,TELLW,PUTW,DROPW,GIVEW,POURW,THROWW
  158.     COMMON /VINDEX/ DIGW,LEAPW,STAYW,FOLLOW
  159.     COMMON /VINDEX/ HELLOW,LOOKIW,LOOKUW,PUMPW,WINDW
  160.     COMMON /VINDEX/ CLMBW,CLMBUW,CLMBDW,TRNTOW
  161. C
  162. C FLAGS
  163. C
  164.     LOGICAL*1 FLAGS(46)
  165.     EQUIVALENCE (FLAGS(1),TROLLF)
  166.     LOGICAL*1 TROLLF,CAGESF,BUCKTF,CAROFF,CAROZF,LWTIDF
  167.     LOGICAL*1 DOMEF,GLACRF,ECHOF,RIDDLF,LLDF,CYCLOF
  168.     LOGICAL*1 MAGICF,LITLDF,SAFEF,GNOMEF,GNODRF,MIRRMF
  169.     LOGICAL*1 EGYPTF,ONPOLF,BLABF,BRIEFF,SUPERF,BUOYF
  170.     LOGICAL*1 GRUNLF,GATEF,RAINBF,CAGETF,EMPTHF,DEFLAF
  171.     LOGICAL*1 GLACMF,FROBZF,ENDGMF,BADLKF,THFENF,SINGSF
  172.     LOGICAL*1 MRPSHF,MROPNF,WDOPNF,MR1F,MR2F,INQSTF
  173.     LOGICAL*1 FOLLWF,SPELLF,CPOUTF,CPUSHF
  174.     COMMON /FINDEX/ TROLLF,CAGESF,BUCKTF,CAROFF,CAROZF,LWTIDF,
  175.     1    DOMEF,GLACRF,ECHOF,RIDDLF,LLDF,CYCLOF,
  176.     2    MAGICF,LITLDF,SAFEF,GNOMEF,GNODRF,MIRRMF,
  177.     3    EGYPTF,ONPOLF,BLABF,BRIEFF,SUPERF,BUOYF,
  178.     4    GRUNLF,GATEF,RAINBF,CAGETF,EMPTHF,DEFLAF,
  179.     5    GLACMF,FROBZF,ENDGMF,BADLKF,THFENF,SINGSF,
  180.     6    MRPSHF,MROPNF,WDOPNF,MR1F,MR2F,INQSTF,
  181.     7    FOLLWF,SPELLF,CPOUTF,CPUSHF
  182.     COMMON /FINDEX/ BTIEF,BINFF
  183.     COMMON /FINDEX/ RVMNT,RVCLR,RVCYC,RVSND,RVGUA
  184.     COMMON /FINDEX/ ORRUG,ORCAND,ORMTCH,ORLAMP
  185.     COMMON /FINDEX/ MDIR,MLOC,POLEUF
  186.     COMMON /FINDEX/ QUESNO,NQATT,CORRCT
  187.     COMMON /FINDEX/ LCELL,PNUMB,ACELL,DCELL,CPHERE
  188. C
  189. C FUNCTIONS AND DATA
  190. C
  191.     QOPEN(R)=(OFLAG2(R).AND.OPENBT).NE.0
  192.     DATA MXNOP/39/,MXJOKE/64/
  193.     DATA JOKES/4,5,3,304,305,306,307,308,309,310,311,312,
  194.     1    313,5314,5319,324,325,883,884,120,120,0,0,0,0/
  195.     DATA ANSWER/0,6,1,6,2,5,3,5,4,3,4,6,4,6,4,5,
  196.     1    5,5,5,4,5,6,6,10,7,4,7,6/
  197.     DATA ANSSTR/'T','E','M','P','L','E',
  198.     1    'F','O','R','E','S','T',
  199.     2    '3','0','0','0','3',
  200.     3    'F','L','A','S','K',
  201.     4    'R','U','B',
  202.     5    'F','O','N','D','L','E',
  203.     6    'C','A','R','R','E','S',
  204.     7    'T','O','U','C','H',
  205.     8    'B','O','N','E','S',
  206.     9    'B','O','D','Y',
  207.     1    'S','K','E','L','E','T',
  208.     2    'R','U','S','T','Y','K','N','I','F','E',
  209.     3    'N','O','N','E',
  210.     4    'N','O','W','H','E','R',0/
  211. C SVERBS, PAGE 2
  212. C
  213.     SVERBS=.TRUE.                !ASSUME WINS.
  214.     IF(PRSO.NE.0) ODO2=ODESC2(PRSO)        !SET UP DESCRIPTORS.
  215.     IF(PRSI.NE.0) ODI2=ODESC2(PRSI)
  216. C
  217.     IF(RI.EQ.0) CALL BUG(7,RI)        !ZERO IS VERBOTEN.
  218.     IF(RI.LE.MXNOP) RETURN            !NOP?
  219.     IF(RI.LE.MXJOKE) GO TO 100        !JOKE?
  220.     GO TO (65000,66000,67000,68000,69000,
  221.     1 1000,2000,3000,4000,5000,6000,7000,8000,9000,10000,
  222.     2 11000,12000,13000,14000,15000,16000,17000,18000,19000,20000,
  223.     3 21000,22000,23000,24000,25000,26000,27000),
  224.     8    (RI-MXJOKE)
  225.     CALL BUG(7,RI)
  226. C
  227. C ALL VERB PROCESSORS RETURN HERE TO DECLARE FAILURE.
  228. C
  229. 10    SVERBS=.FALSE.                !LOSE.
  230.     RETURN
  231. C
  232. C JOKE PROCESSOR.
  233. C FIND PROPER ENTRY IN JOKES, USE IT TO SELECT STRING TO PRINT.
  234. C
  235. 100    I=JOKES(RI-MXNOP)            !GET TABLE ENTRY.
  236.     J=I/1000                !ISOLATE # STRINGS.
  237.     IF(J.NE.0) I=MOD(I,1000)+RND(J)        !IF RANDOM, CHOOSE.
  238.     CALL RSPEAK(I)                !PRINT JOKE.
  239.     RETURN
  240. C SVERBS, PAGE 2A
  241. C
  242. C V65--    ROOM
  243. C
  244. 65000    SVERBS=RMDESC(2)            !DESCRIBE ROOM ONLY.
  245.     RETURN
  246. C
  247. C V66--    OBJECTS
  248. C
  249. 66000    SVERBS=RMDESC(1)            !DESCRIBE OBJ ONLY.
  250.     IF(.NOT.TELFLG) CALL RSPEAK(138)    !NO OBJECTS.
  251.     RETURN
  252. C
  253. C V67--    RNAME
  254. C
  255. 67000    CALL RSPEAK(RDESC2-HERE)        !SHORT ROOM NAME.
  256.     RETURN
  257. C
  258. C V68--    RESERVED
  259. C
  260. 68000    RETURN
  261. C
  262. C V69--    RESERVED
  263. C
  264. 69000    RETURN
  265. C SVERBS, PAGE 3
  266. C
  267. C V70--    BRIEF.  SET FLAG.
  268. C
  269. 1000    BRIEFF=.TRUE.                !BRIEF DESCRIPTIONS.
  270.     SUPERF=.FALSE.
  271.     CALL RSPEAK(326)
  272.     RETURN
  273. C
  274. C V71--    VERBOSE.  CLEAR FLAGS.
  275. C
  276. 2000    BRIEFF=.FALSE.                !LONG DESCRIPTIONS.
  277.     SUPERF=.FALSE.
  278.     CALL RSPEAK(327)
  279.     RETURN
  280. C
  281. C V72--    SUPERBRIEF.  SET FLAG.
  282. C
  283. 3000    SUPERF=.TRUE.
  284.     CALL RSPEAK(328)
  285.     RETURN
  286. C
  287. C V73-- STAY (USED IN ENDGAME).
  288. C
  289. 4000    IF(WINNER.NE.AMASTR) GO TO 4100        !TELL MASTER, STAY.
  290.     CALL RSPEAK(781)            !HE DOES.
  291.     CTICK(CEVFOL)=0                !NOT FOLLOWING.
  292.     RETURN
  293. C
  294. 4100    IF(WINNER.EQ.PLAYER) CALL RSPEAK(664)    !JOKE.
  295.     RETURN
  296. C
  297. C V74--    VERSION.  PRINT INFO.
  298. C
  299. 5000    WRITE(OUTCH,5010) VMAJ,VMIN,VEDIT
  300. 5010    FORMAT(' V',I1,'.',I2,A1)
  301.     TELFLG=.TRUE.
  302.     RETURN
  303. C
  304. C V75--    SWIM.  ALWAYS A JOKE.
  305. C
  306. 6000    I=330                    !ASSUME WATER.
  307.     IF((RFLAG(HERE).AND.(RWATER+RFILL)).EQ.0)
  308.     1    I=331+RND(3)            !IF NO WATER, JOKE.
  309.     CALL RSPEAK(I)
  310.     RETURN
  311. C
  312. C V76--    GERONIMO.  IF IN BARREL, FATAL, ELSE JOKE.
  313. C
  314. 7000    IF(HERE.EQ.MBARR) GO TO 7100        !IN BARREL?
  315.     CALL RSPEAK(334)            !NO, JOKE.
  316.     RETURN
  317. C
  318. 7100    CALL JIGSUP(335)            !OVER FALLS.
  319.     RETURN
  320. C
  321. C V77--    SINBAD ET AL.  CHASE CYCLOPS, ELSE JOKE.
  322. C
  323. 8000    IF((HERE.EQ.MCYCL).AND.QHERE(CYCLO,HERE)) GO TO 8100
  324.     CALL RSPEAK(336)            !NOT HERE, JOKE.
  325.     RETURN
  326. C
  327. 8100    CALL NEWSTA(CYCLO,337,0,0,0)        !CYCLOPS FLEES.
  328.     CYCLOF=.TRUE.                !SET ALL FLAGS.
  329.     MAGICF=.TRUE.
  330.     OFLAG2(CYCLO)=OFLAG2(CYCLO).AND. .NOT.FITEBT
  331.     RETURN
  332. C
  333. C V78--    WELL.  OPEN DOOR, ELSE JOKE.
  334. C
  335. 9000    IF(RIDDLF.OR.(HERE.NE.RIDDL)) GO TO 9100 !IN RIDDLE ROOM?
  336.     RIDDLF=.TRUE.                !YES, SOLVED IT.
  337.     CALL RSPEAK(338)
  338.     RETURN
  339. C
  340. 9100    CALL RSPEAK(339)            !WELL, WHAT?
  341.     RETURN
  342. C
  343. C V79--    PRAY.  IF IN TEMP2, POOF!
  344. C
  345. 10000    IF(HERE.NE.TEMP2) GO TO 10050        !IN TEMPLE?
  346.     IF(MOVETO(FORE1,WINNER)) GO TO 10100    !FORE1 STILL THERE?
  347. 10050    CALL RSPEAK(340)            !JOKE.
  348.     RETURN
  349. C
  350. 10100    F=RMDESC(3)                !MOVED, DESCRIBE.
  351.     RETURN
  352. C
  353. C V80--    TREASURE.  IF IN TEMP1, POOF!
  354. C
  355. 11000    IF(HERE.NE.TEMP1) GO TO 11050    !IN TEMPLE?
  356.     IF(MOVETO(TREAS,WINNER)) GO TO 10100    !TREASURE ROOM THERE?
  357. 11050    CALL RSPEAK(341)            !NOTHING HAPPENS.
  358.     RETURN
  359. C
  360. C V81--    TEMPLE.  IF IN TREAS, POOF!
  361. C
  362. 12000    IF(HERE.NE.TREAS) GO TO 12050        !IN TREASURE?
  363.     IF(MOVETO(TEMP1,WINNER)) GO TO 10100    !TEMP1 STILL THERE?
  364. 12050    CALL RSPEAK(341)            !NOTHING HAPPENS.
  365.     RETURN
  366. C
  367. C V82--    BLAST.  USUALLY A JOKE.
  368. C
  369. 13000    I=342                    !DONT UNDERSTAND.
  370.     IF(PRSO.EQ.SAFE) I=252            !JOKE FOR SAFE.
  371.     CALL RSPEAK(I)
  372.     RETURN
  373. C
  374. C V83--    SCORE.  PRINT SCORE.
  375. C
  376. 14000    CALL SCORE(.FALSE.)
  377.     RETURN
  378. C
  379. C V84--    QUIT.  FINISH OUT THE GAME.
  380. C
  381. 15000    CALL SCORE(.TRUE.)            !TELLL SCORE.
  382.     IF(.NOT.YESNO(343,0,0)) RETURN        !ASK FOR Y/N DECISION.
  383.     CLOSE (UNIT=DBCH)            !CLEAN UP.
  384.     CALL EXIT                !BYE.
  385. C SVERBS, PAGE 4
  386. C
  387. C V85--    FOLLOW (USED IN ENDGAME)
  388. C
  389. 16000    IF(WINNER.NE.AMASTR) RETURN        !TELL MASTER, FOLLOW.
  390.     CALL RSPEAK(782)
  391.     CTICK(CEVFOL)=-1            !STARTS FOLLOWING.
  392.     RETURN
  393. C
  394. C V86--    WALK THROUGH
  395. C
  396. 17000    IF((SCOLRM.EQ.0).OR.((PRSO.NE.SCOL).AND.
  397.     1    ((PRSO.NE.WNORT).OR.(HERE.NE.BKBOX)))) GO TO 17100
  398.     SCOLAC=SCOLRM                !WALKED THRU SCOL.
  399.     PRSO=0                    !FAKE OUT FROMDR.
  400.     CTICK(CEVSCL)=6                !START ALARM.
  401.     CALL RSPEAK(668)            !DISORIENT HIM.
  402.     F=MOVETO(SCOLRM,WINNER)            !INTO ROOM.
  403.     F=RMDESC(3)                !DESCRIBE.
  404.     RETURN
  405. C
  406. 17100    IF(HERE.NE.SCOLAC) GO TO 17300        !ON OTHER SIDE OF SCOL?
  407.     DO 17200 I=1,12,3            !WALK THRU PROPER WALL?
  408.       IF((SCOLWL(I).EQ.HERE).AND.(SCOLWL(I+1).EQ.PRSO))
  409.     1    GO TO 17500            !IN SPECIFIED ROOM?
  410. 17200    CONTINUE
  411. C
  412. 17300    IF((OFLAG1(PRSO).AND.TAKEBT).NE.0) GO TO 17400    !TKBLE?
  413.     I=669                    !NO, JOKE.
  414.     IF(PRSO.EQ.SCOL) I=670            !SPECIAL JOKE FOR SCOL.
  415.     CALL RSPSUB(I,ODO2)
  416.     RETURN
  417. C
  418. 17400    I=671                    !JOKE.
  419.     IF(OROOM(PRSO).NE.0) I=552+RND(5)    !SPECIAL JOKES IF CARRY.
  420.     CALL RSPEAK(I)
  421.     RETURN
  422. C
  423. 17500    PRSO=SCOLWL(I+2)            !THRU SCOL WALL...
  424.     DO 17600 I=1,8,2            !FIND MATCHING ROOM.
  425.       IF(PRSO.EQ.SCOLDR(I)) SCOLRM=SCOLDR(I+1)
  426. 17600    CONTINUE                !DECLARE NEW SCOLRM.
  427.     CTICK(CEVSCL)=0                !CANCEL ALARM.
  428.     CALL RSPEAK(668)            !DISORIENT HIM.
  429.     F=MOVETO(BKBOX,WINNER)            !BACK IN BOX ROOM.
  430.     F=RMDESC(3)
  431.     RETURN
  432. C
  433. C V87--    RING.  A JOKE.
  434. C
  435. 18000    I=359                    !CANT RING.
  436.     IF(PRSO.EQ.BELL) I=360            !DING, DONG.
  437.     CALL RSPEAK(I)                !JOKE.
  438.     RETURN
  439. C
  440. C V88--    BRUSH.  JOKE WITH OBSCURE TRAP.
  441. C
  442. 19000    IF(PRSO.EQ.TEETH) GO TO 19100        !BRUSH TEETH?
  443.     CALL RSPEAK(362)            !NO, JOKE.
  444.     RETURN
  445. C
  446. 19100    IF(PRSI.NE.0) GO TO 19200        !WITH SOMETHING?
  447.     CALL RSPEAK(363)            !NO, JOKE.
  448.     RETURN
  449. C
  450. 19200    IF((PRSI.EQ.PUTTY).AND.(OADV(PUTTY).EQ.WINNER))
  451.     1    GO TO 19300            !WITH PUTTY?
  452.     CALL RSPSUB(364,ODI2)            !NO, JOKE.
  453.     RETURN
  454. C
  455. 19300    CALL JIGSUP(365)            !YES, DEAD!!!!!
  456.     RETURN
  457. C SVERBS, PAGE 5
  458. C
  459. C V89--    DIG.  UNLESS SHOVEL, A JOKE.
  460. C
  461. 20000    IF(PRSO.EQ.SHOVE) RETURN        !SHOVEL?
  462.     I=392                    !ASSUME TOOL.
  463.     IF((OFLAG1(PRSO).AND.TOOLBT).EQ.0) I=393
  464.     CALL RSPSUB(I,ODO2)
  465.     RETURN
  466. C
  467. C V90--    TIME.  PRINT OUT DURATION OF GAME.
  468. C
  469. 21000    CALL GTTIME(K)            !GET PLAY TIME.
  470.     I=K/60
  471.     J=MOD(K,60)
  472.     WRITE(OUTCH,21010)
  473.     IF(I.NE.0) WRITE(OUTCH,21011) I
  474.     IF(I.GE.2) WRITE(OUTCH,21012)
  475.     IF(I.EQ.1) WRITE(OUTCH,21013)
  476.     IF(J.EQ.1) WRITE(OUTCH,21014) J
  477.     IF(J.NE.1) WRITE(OUTCH,21015) J
  478.     TELFLG=.TRUE.
  479.     RETURN
  480. C
  481. 21010    FORMAT(' You have been playing Dungeon for ',$)
  482. 21011    FORMAT('+',I3,' hour',$)
  483. 21012    FORMAT('+s and ',$)
  484. 21013    FORMAT('+ and ',$)
  485. 21014    FORMAT('+',I2,' minute.')
  486. 21015    FORMAT('+',I2,' minutes.')
  487. C
  488. C V91--    LEAP.  USUALLY A JOKE, WITH A CATCH.
  489. C
  490. 22000    IF(PRSO.EQ.0) GO TO 22200        !OVER SOMETHING?
  491.     IF(QHERE(PRSO,HERE)) GO TO 22100    !HERE?
  492.     CALL RSPEAK(447)            !NO, JOKE.
  493.     RETURN
  494. C
  495. 22100    IF((OFLAG2(PRSO).AND.VILLBT).EQ.0) GO TO 22300
  496.     CALL RSPSUB(448,ODO2)            !CANT JUMP VILLAIN.
  497.     RETURN
  498. C
  499. 22200    IF(.NOT.FINDXT(XDOWN,HERE)) GO TO 22300    !DOWN EXIT?
  500.     IF((XTYPE.EQ.XNO).OR.((XTYPE.EQ.XCOND).AND.
  501.     1    .NOT.FLAGS(XFLAG))) GO TO 22400    !BLOCKED OFF?
  502. 22300    CALL RSPEAK(314+RND(5))            !WHEEEE!
  503.     RETURN
  504. C
  505. 22400    CALL JIGSUP(449+RND(4))            !FATAL LEAP.
  506.     RETURN
  507. C SVERBS, PAGE 6
  508. C
  509. C V92--    LOCK.
  510. C
  511. 23000    IF((PRSO.EQ.GRATE).AND.(HERE.EQ.MGRAT))
  512.     1    GO TO 23200
  513. 23100    CALL RSPEAK(464)            !NOT LOCK GRATE.
  514.     RETURN
  515. C
  516. 23200    GRUNLF=.FALSE.                !GRATE NOW LOCKED.
  517.     CALL RSPEAK(214)
  518.     TRAVEL(REXIT(HERE)+1)=214        !CHANGE EXIT STATUS.
  519.     RETURN
  520. C
  521. C V93--    UNLOCK
  522. C
  523. 24000    IF((PRSO.NE.GRATE).OR.(HERE.NE.MGRAT))
  524.     1    GO TO 23100            !NOT UNLOCK GRATE.
  525.     IF(PRSI.EQ.KEYS) GO TO 24200        !GOT KEYS?
  526.     CALL RSPSUB(465,ODI2)            !NO, JOKE.
  527.     RETURN
  528. C
  529. 24200    GRUNLF=.TRUE.                !UNLOCK GRATE.
  530.     CALL RSPEAK(217)
  531.     TRAVEL(REXIT(HERE)+1)=217        !CHANGE EXIT STATUS.
  532.     RETURN
  533. C
  534. C V94--    DIAGNOSE.
  535. C
  536. 25000    I=FIGHTS(WINNER,.FALSE.)        !GET FIGHTS STRENGTH.
  537.     J=ASTREN(WINNER)            !GET HEALTH.
  538.     K=MIN0(I+J,4)                !GET STATE.
  539.     IF(.NOT.CFLAG(CEVCUR)) J=0        !IF NO WOUNDS.
  540.     L=MIN0(4,IABS(J))            !SCALE.
  541.     CALL RSPEAK(473+L)            !DESCRIBE HEALTH.
  542.     I=(30*(-J-1))+CTICK(CEVCUR)        !COMPUTE WAIT.
  543.     IF(J.NE.0) WRITE(OUTCH,25100) I
  544. 25100    FORMAT(' You will be cured after ',I3,' moves.')
  545.     CALL RSPEAK(478+K)            !HOW MUCH MORE?
  546.     IF(DEATHS.NE.0) CALL RSPEAK(482+DEATHS)    !HOW MANY DEATHS?
  547.     RETURN
  548. C SVERBS, PAGE 7
  549. C
  550. C V95--    INCANT
  551. C
  552. 26000    DO 26100 I=1,6                !SET UP PARSE.
  553.       P1(I)=' '
  554.       P2(I)=' '
  555. 26100    CONTINUE
  556.     WP=1                    !WORD POINTER.
  557.     CP=1                    !CHAR POINTER.
  558.     IF(PRSCON.LE.1) GO TO 26300
  559.     DO 26200 I=PRSCON,INLNT            !PARSE INPUT
  560.       IF(INBUF(I).EQ.',') GO TO 26300    !END OF PHRASE?
  561.       IF(INBUF(I).NE.' ') GO TO 26150    !SPACE?
  562.       IF(CP.NE.1) WP=WP+1
  563.       CP=1
  564.       GO TO 26200
  565. 26150      IF(WP.EQ.1) P1(CP)=INBUF(I)        !STUFF INTO HOLDER.
  566.       IF(WP.EQ.2) P2(CP)=INBUF(I)
  567.       CP=MIN0(CP+1,6)
  568. 26200    CONTINUE
  569. C
  570. 26300    PRSCON=1                !KILL REST OF LINE.
  571.     IF(P1(1).NE.' ') GO TO 26400        !ANY INPUT?
  572.     CALL RSPEAK(856)            !NO, HO HUM.
  573.     RETURN
  574. C
  575. 26400    CALL ENCRYP(P1,CH)            !COMPUTE RESPONSE.
  576.     IF(P2(1).NE.' ') GO TO 26600    !TWO PHRASES?
  577. C
  578.     IF(SPELLF) GO TO 26550            !HE'S TRYING TO LEARN.
  579.     IF((RFLAG(TSTRS).AND.RSEEN).EQ.0) GO TO 26575
  580.     SPELLF=.TRUE.                !TELL HIM.
  581.     TELFLG=.TRUE.
  582.     WRITE(OUTCH,26510) P1,CH
  583. 26510    FORMAT(' A hollow voice replies:  "',6A1,1X,6A1,'".')
  584.     RETURN
  585. C
  586. 26550    CALL RSPEAK(857)            !HE'S GOT ONE ALREADY.
  587.     RETURN
  588. C
  589. 26575    CALL RSPEAK(858)            !HE'S NOT IN ENDGAME.
  590.     RETURN
  591. C
  592. 26600    IF((RFLAG(TSTRS).AND.RSEEN).NE.0) GO TO 26800
  593.     DO 26700 I=1,6
  594.       IF(P2(I).NE.CH(I)) GO TO 26575    !WRONG.
  595. 26700    CONTINUE
  596.     SPELLF=.TRUE.                !IT WORKS.
  597.     CALL RSPEAK(859)
  598.     CTICK(CEVSTE)=1                !FORCE START.
  599.     RETURN
  600. C
  601. 26800    CALL RSPEAK(855)            !TOO LATE.
  602.     RETURN
  603. C SVERBS, PAGE 8
  604. C
  605. C V96--    ANSWER
  606. C
  607. 27000    IF((PRSCON.GT.1).AND.
  608.     1    (HERE.EQ.FDOOR).AND.INQSTF)
  609.     2    GO TO 27100
  610.     CALL RSPEAK(799)            !NO ONE LISTENS.
  611.     PRSCON=1
  612.     RETURN
  613. C
  614. 27100    K=1                    !POINTER INTO ANSSTR.
  615.     DO 27300 J=1,28,2            !CHECK ANSWERS.
  616.       NEWK=K+ANSWER(J+1)            !COMPUTE NEXT K.
  617.       IF(QUESNO.NE.ANSWER(J)) GO TO 27300    !ONLY CHECK PROPER ANS.
  618.       I=PRSCON-1                !SCAN ANSWER.
  619.       DO 27200 L=K,NEWK-1
  620. 27150        I=I+1                !SKIP INPUT BLANKS.
  621.         IF(I.GT.INLNT) GO TO 27300        !END OF INPUT? LOSE.
  622.         IF(INBUF(I).EQ.' ') GO TO 27150
  623.         IF(INBUF(I).NE.ANSSTR(L)) GO TO 27300
  624. 27200      CONTINUE
  625.       GO TO 27500                !RIGHT ANSWER.
  626. 27300    K=NEWK
  627. C
  628.     PRSCON=1                !KILL REST OF LINE.
  629.     NQATT=NQATT+1                !WRONG, CRETIN.
  630.     IF(NQATT.GE.5) GO TO 27400        !TOO MANY WRONG?
  631.     CALL RSPEAK(800+NQATT)            !NO, TRY AGAIN.
  632.     RETURN
  633. C
  634. 27400    CALL RSPEAK(826)            !ALL OVER.
  635.     CFLAG(CEVINQ)=.FALSE.            !LOSE.
  636.     RETURN
  637. C
  638. 27500    PRSCON=1                !KILL REST OF LINE.
  639.     CORRCT=CORRCT+1                !GOT IT RIGHT.
  640.     CALL RSPEAK(800)            !HOORAY.
  641.     IF(CORRCT.GE.3) GO TO 27600        !WON TOTALLY?
  642.     CTICK(CEVINQ)=2                !NO, START AGAIN.
  643.     QUESNO=MOD(QUESNO+3,8)
  644.     NQATT=0
  645.     CALL RSPEAK(769)            !ASK NEXT QUESTION.
  646.     CALL RSPEAK(770+QUESNO)
  647.     RETURN
  648. C
  649. 27600    CALL RSPEAK(827)            !QUIZ OVER,
  650.     CFLAG(CEVINQ)=.FALSE.
  651.     OFLAG2(QDOOR)=OFLAG2(QDOOR).OR.OPENBT    !OPEN DOOR.
  652.     RETURN
  653. C
  654.     END
  655.