home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / games / volume2 / dungeon / part04 / sverbs.F < prev   
Text File  |  1987-09-01  |  13KB  |  691 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.     CHARACTER ANSSTR(78)
  19.     CHARACTER P1(6),P2(6),CH(6)
  20.     INTEGER ANSWER(28)
  21. #include "parser.h"
  22. #include "gamestate.h"
  23. #include "state.h"
  24. #include "screen.h"
  25. C
  26. C MISCELLANEOUS VARIABLES
  27. C
  28.     CHARACTER VEDIT
  29.     COMMON /VERS/ VMAJ,VMIN,VEDIT
  30. #include "io.h"
  31. #include "rooms.h"
  32. #include "rflag.h"
  33. #include "rindex.h"
  34. #include "exits.h"
  35. #include "curxt.h"
  36. #include "xpars.h"
  37. #include "xsrch.h"
  38. #include "objects.h"
  39. #include "oflags.h"
  40. #include "oindex.h"
  41. #include "clock.h"
  42.  
  43. #include "advers.h"
  44. #include "verbs.h"
  45. #include "flags.h"
  46. C
  47. C FUNCTIONS AND DATA
  48. C
  49.     QOPEN(R)=and(OFLAG2(R),OPENBT).NE.0
  50.     DATA MXNOP/39/,MXJOKE/64/
  51.     DATA JOKES/4,5,3,304,305,306,307,308,309,310,311,312,
  52. &        313,5314,5319,324,325,883,884,120,120,0,0,0,0/
  53.     DATA ANSWER/0,6,1,6,2,5,3,5,4,3,4,6,4,6,4,5,
  54. &        5,5,5,4,5,6,6,10,7,4,7,6/
  55.     DATA ANSSTR/'T','E','M','P','L','E',
  56. &        'F','O','R','E','S','T',
  57. &        '3','0','0','0','3',
  58. &        'F','L','A','S','K',
  59. &        'R','U','B',
  60. &        'F','O','N','D','L','E',
  61. &        'C','A','R','R','E','S',
  62. &        'T','O','U','C','H',
  63. &        'B','O','N','E','S',
  64. &        'B','O','D','Y',
  65. &        'S','K','E','L','E','T',
  66. &        'R','U','S','T','Y','K','N','I','F','E',
  67. &        'N','O','N','E',
  68. &        'N','O','W','H','E','R','\0'/
  69. C SVERBS, PAGE 2
  70. C
  71.     SVERBS=.TRUE.
  72. C                        !ASSUME WINS.
  73.     IF(PRSO.NE.0) ODO2=ODESC2(PRSO)
  74. C                        !SET UP DESCRIPTORS.
  75.     IF(PRSI.NE.0) ODI2=ODESC2(PRSI)
  76. C
  77.     IF(RI.EQ.0) CALL BUG(7,RI)
  78. C                        !ZERO IS VERBOTEN.
  79.     IF(RI.LE.MXNOP) RETURN
  80. C                        !NOP?
  81.     IF(RI.LE.MXJOKE) GO TO 100
  82. C                        !JOKE?
  83.     GO TO (65000,66000,67000,68000,69000,
  84. &     1000,2000,3000,4000,5000,6000,7000,8000,9000,10000,
  85. &     11000,12000,13000,14000,15000,16000,17000,18000,19000,20000,
  86. &     21000,22000,23000,24000,25000,26000,27000),
  87. &        (RI-MXJOKE)
  88.     CALL BUG(7,RI)
  89. C
  90. C ALL VERB PROCESSORS RETURN HERE TO DECLARE FAILURE.
  91. C
  92. 10    SVERBS=.FALSE.
  93. C                        !LOSE.
  94.     RETURN
  95. C
  96. C JOKE PROCESSOR.
  97. C FIND PROPER ENTRY IN JOKES, USE IT TO SELECT STRING TO PRINT.
  98. C
  99. 100    I=JOKES(RI-MXNOP)
  100. C                        !GET TABLE ENTRY.
  101.     J=I/1000
  102. C                        !ISOLATE # STRINGS.
  103.     IF(J.NE.0) I=MOD(I,1000)+RND(J)
  104. C                        !IF RANDOM, CHOOSE.
  105.     CALL RSPEAK(I)
  106. C                        !PRINT JOKE.
  107.     RETURN
  108. C SVERBS, PAGE 2A
  109. C
  110. C V65--    ROOM
  111. C
  112. 65000    SVERBS=RMDESC(2)
  113. C                        !DESCRIBE ROOM ONLY.
  114.     RETURN
  115. C
  116. C V66--    OBJECTS
  117. C
  118. 66000    SVERBS=RMDESC(1)
  119. C                        !DESCRIBE OBJ ONLY.
  120.     IF(.NOT.TELFLG) CALL RSPEAK(138)
  121. C                        !NO OBJECTS.
  122.     RETURN
  123. C
  124. C V67--    RNAME
  125. C
  126. 67000    CALL RSPEAK(RDESC2-HERE)
  127. C                        !SHORT ROOM NAME.
  128.     RETURN
  129. C
  130. C V68--    RESERVED
  131. C
  132. 68000    RETURN
  133. C
  134. C V69--    RESERVED
  135. C
  136. 69000    RETURN
  137. C SVERBS, PAGE 3
  138. C
  139. C V70--    BRIEF.  SET FLAG.
  140. C
  141. 1000    BRIEFF=.TRUE.
  142. C                        !BRIEF DESCRIPTIONS.
  143.     SUPERF=.FALSE.
  144.     CALL RSPEAK(326)
  145.     RETURN
  146. C
  147. C V71--    VERBOSE.  CLEAR FLAGS.
  148. C
  149. 2000    BRIEFF=.FALSE.
  150. C                        !LONG DESCRIPTIONS.
  151.     SUPERF=.FALSE.
  152.     CALL RSPEAK(327)
  153.     RETURN
  154. C
  155. C V72--    SUPERBRIEF.  SET FLAG.
  156. C
  157. 3000    SUPERF=.TRUE.
  158.     CALL RSPEAK(328)
  159.     RETURN
  160. C
  161. C V73-- STAY (USED IN ENDGAME).
  162. C
  163. 4000    IF(WINNER.NE.AMASTR) GO TO 4100
  164. C                        !TELL MASTER, STAY.
  165.     CALL RSPEAK(781)
  166. C                        !HE DOES.
  167.     CTICK(CEVFOL)=0
  168. C                        !NOT FOLLOWING.
  169.     RETURN
  170. C
  171. 4100    IF(WINNER.EQ.PLAYER) CALL RSPEAK(664)
  172. C                        !JOKE.
  173.     RETURN
  174. C
  175. C V74--    VERSION.  PRINT INFO.
  176. C
  177. #ifdef PDP
  178. 5000    call prvers(vmaj,vmin,vedit)
  179. #else
  180. 5000    WRITE(OUTCH,5010) VMAJ,VMIN,VEDIT
  181. 5010    FORMAT(' V',I1,'.',I2,A1)
  182. #endif PDP
  183.     TELFLG=.TRUE.
  184.     RETURN
  185. C
  186. C V75--    SWIM.  ALWAYS A JOKE.
  187. C
  188. 6000    I=330
  189. C                        !ASSUME WATER.
  190.     IF(and(RFLAG(HERE),(RWATER+RFILL)).EQ.0)
  191. &        I=331+RND(3)
  192.     CALL RSPEAK(I)
  193.     RETURN
  194. C
  195. C V76--    GERONIMO.  IF IN BARREL, FATAL, ELSE JOKE.
  196. C
  197. 7000    IF(HERE.EQ.MBARR) GO TO 7100
  198. C                        !IN BARREL?
  199.     CALL RSPEAK(334)
  200. C                        !NO, JOKE.
  201.     RETURN
  202. C
  203. 7100    CALL JIGSUP(335)
  204. C                        !OVER FALLS.
  205.     RETURN
  206. C
  207. C V77--    SINBAD ET AL.  CHASE CYCLOPS, ELSE JOKE.
  208. C
  209. 8000    IF((HERE.EQ.MCYCL).AND.QHERE(CYCLO,HERE)) GO TO 8100
  210.     CALL RSPEAK(336)
  211. C                        !NOT HERE, JOKE.
  212.     RETURN
  213. C
  214. 8100    CALL NEWSTA(CYCLO,337,0,0,0)
  215. C                        !CYCLOPS FLEES.
  216.     CYCLOF=.TRUE.
  217. C                        !SET ALL FLAGS.
  218.     MAGICF=.TRUE.
  219.     OFLAG2(CYCLO)=and(OFLAG2(CYCLO), not(FITEBT))
  220.     RETURN
  221. C
  222. C V78--    WELL.  OPEN DOOR, ELSE JOKE.
  223. C
  224. 9000    IF(RIDDLF.OR.(HERE.NE.RIDDL)) GO TO 9100
  225. C                        !IN RIDDLE ROOM?
  226.     RIDDLF=.TRUE.
  227. C                        !YES, SOLVED IT.
  228.     CALL RSPEAK(338)
  229.     RETURN
  230. C
  231. 9100    CALL RSPEAK(339)
  232. C                        !WELL, WHAT?
  233.     RETURN
  234. C
  235. C V79--    PRAY.  IF IN TEMP2, POOF
  236. C                        !
  237. C
  238. 10000    IF(HERE.NE.TEMP2) GO TO 10050
  239. C                        !IN TEMPLE?
  240.     IF(MOVETO(FORE1,WINNER)) GO TO 10100
  241. C                        !FORE1 STILL THERE?
  242. 10050    CALL RSPEAK(340)
  243. C                        !JOKE.
  244.     RETURN
  245. C
  246. 10100    F=RMDESC(3)
  247. C                        !MOVED, DESCRIBE.
  248.     RETURN
  249. C
  250. C V80--    TREASURE.  IF IN TEMP1, POOF
  251. C                        !
  252. C
  253. 11000    IF(HERE.NE.TEMP1) GO TO 11050
  254. C                        !IN TEMPLE?
  255.     IF(MOVETO(TREAS,WINNER)) GO TO 10100
  256. C                        !TREASURE ROOM THERE?
  257. 11050    CALL RSPEAK(341)
  258. C                        !NOTHING HAPPENS.
  259.     RETURN
  260. C
  261. C V81--    TEMPLE.  IF IN TREAS, POOF
  262. C                        !
  263. C
  264. 12000    IF(HERE.NE.TREAS) GO TO 12050
  265. C                        !IN TREASURE?
  266.     IF(MOVETO(TEMP1,WINNER)) GO TO 10100
  267. C                        !TEMP1 STILL THERE?
  268. 12050    CALL RSPEAK(341)
  269. C                        !NOTHING HAPPENS.
  270.     RETURN
  271. C
  272. C V82--    BLAST.  USUALLY A JOKE.
  273. C
  274. 13000    I=342
  275. C                        !DONT UNDERSTAND.
  276.     IF(PRSO.EQ.SAFE) I=252
  277. C                        !JOKE FOR SAFE.
  278.     CALL RSPEAK(I)
  279.     RETURN
  280. C
  281. C V83--    SCORE.  PRINT SCORE.
  282. C
  283. 14000    CALL SCORE(.FALSE.)
  284.     RETURN
  285. C
  286. C V84--    QUIT.  FINISH OUT THE GAME.
  287. C
  288. 15000    CALL SCORE(.TRUE.)
  289. C                        !TELLL SCORE.
  290.     IF(.NOT.YESNO(343,0,0)) RETURN
  291. C                        !ASK FOR Y/N DECISION.
  292. #ifdef PDP
  293. C    close routine moved to exit for pdp version
  294. #else
  295.     CLOSE (DBCH)
  296. #endif PDP
  297.     CALL EXIT
  298. C                        !BYE.
  299. C SVERBS, PAGE 4
  300. C
  301. C V85--    FOLLOW (USED IN ENDGAME)
  302. C
  303. 16000    IF(WINNER.NE.AMASTR) RETURN
  304. C                        !TELL MASTER, FOLLOW.
  305.     CALL RSPEAK(782)
  306.     CTICK(CEVFOL)=-1
  307. C                        !STARTS FOLLOWING.
  308.     RETURN
  309. C
  310. C V86--    WALK THROUGH
  311. C
  312. 17000    IF((SCOLRM.EQ.0).OR.((PRSO.NE.SCOL).AND.
  313. &        ((PRSO.NE.WNORT).OR.(HERE.NE.BKBOX)))) GO TO 17100
  314.     SCOLAC=SCOLRM
  315. C                        !WALKED THRU SCOL.
  316.     PRSO=0
  317. C                        !FAKE OUT FROMDR.
  318.     CTICK(CEVSCL)=6
  319. C                        !START ALARM.
  320.     CALL RSPEAK(668)
  321. C                        !DISORIENT HIM.
  322.     F=MOVETO(SCOLRM,WINNER)
  323. C                        !INTO ROOM.
  324.     F=RMDESC(3)
  325. C                        !DESCRIBE.
  326.     RETURN
  327. C
  328. 17100    IF(HERE.NE.SCOLAC) GO TO 17300
  329. C                        !ON OTHER SIDE OF SCOL?
  330.     DO 17200 I=1,12,3
  331. C                        !WALK THRU PROPER WALL?
  332.       IF((SCOLWL(I).EQ.HERE).AND.(SCOLWL(I+1).EQ.PRSO))
  333. &        GO TO 17500
  334. 17200    CONTINUE
  335. C
  336. 17300    IF(and(OFLAG1(PRSO),TAKEBT).NE.0) GO TO 17400
  337.     I=669
  338. C                        !NO, JOKE.
  339.     IF(PRSO.EQ.SCOL) I=670
  340. C                        !SPECIAL JOKE FOR SCOL.
  341.     CALL RSPSUB(I,ODO2)
  342.     RETURN
  343. C
  344. 17400    I=671
  345. C                        !JOKE.
  346.     IF(OROOM(PRSO).NE.0) I=552+RND(5)
  347. C                        !SPECIAL JOKES IF CARRY.
  348.     CALL RSPEAK(I)
  349.     RETURN
  350. C
  351. 17500    PRSO=SCOLWL(I+2)
  352. C                        !THRU SCOL WALL...
  353.     DO 17600 I=1,8,2
  354. C                        !FIND MATCHING ROOM.
  355.       IF(PRSO.EQ.SCOLDR(I)) SCOLRM=SCOLDR(I+1)
  356. 17600    CONTINUE
  357. C                        !DECLARE NEW SCOLRM.
  358.     CTICK(CEVSCL)=0
  359. C                        !CANCEL ALARM.
  360.     CALL RSPEAK(668)
  361. C                        !DISORIENT HIM.
  362.     F=MOVETO(BKBOX,WINNER)
  363. C                        !BACK IN BOX ROOM.
  364.     F=RMDESC(3)
  365.     RETURN
  366. C
  367. C V87--    RING.  A JOKE.
  368. C
  369. 18000    I=359
  370. C                        !CANT RING.
  371.     IF(PRSO.EQ.BELL) I=360
  372. C                        !DING, DONG.
  373.     CALL RSPEAK(I)
  374. C                        !JOKE.
  375.     RETURN
  376. C
  377. C V88--    BRUSH.  JOKE WITH OBSCURE TRAP.
  378. C
  379. 19000    IF(PRSO.EQ.TEETH) GO TO 19100
  380. C                        !BRUSH TEETH?
  381.     CALL RSPEAK(362)
  382. C                        !NO, JOKE.
  383.     RETURN
  384. C
  385. 19100    IF(PRSI.NE.0) GO TO 19200
  386. C                        !WITH SOMETHING?
  387.     CALL RSPEAK(363)
  388. C                        !NO, JOKE.
  389.     RETURN
  390. C
  391. 19200    IF((PRSI.EQ.PUTTY).AND.(OADV(PUTTY).EQ.WINNER))
  392. &        GO TO 19300
  393.     CALL RSPSUB(364,ODI2)
  394. C                        !NO, JOKE.
  395.     RETURN
  396. C
  397. 19300    CALL JIGSUP(365)
  398. C                        !YES, DEAD
  399. C                        !
  400. C                        !
  401. C                        !
  402. C                        !
  403. C                        !
  404.     RETURN
  405. C SVERBS, PAGE 5
  406. C
  407. C V89--    DIG.  UNLESS SHOVEL, A JOKE.
  408. C
  409. 20000    IF(PRSO.EQ.SHOVE) RETURN
  410. C                        !SHOVEL?
  411.     I=392
  412. C                        !ASSUME TOOL.
  413.     IF(and(OFLAG1(PRSO),TOOLBT).EQ.0) I=393
  414.     CALL RSPSUB(I,ODO2)
  415.     RETURN
  416. C
  417. C V90--    TIME.  PRINT OUT DURATION OF GAME.
  418. C
  419. #ifdef PDP
  420. C    no duration time available for pdp version (removed
  421. C    to make things fit)
  422. 21000    TELFLG=.TRUE.
  423.     RETURN
  424. #else
  425. 21000    CALL GTTIME(K)
  426. C                        !GET PLAY TIME.
  427.     I=K/60
  428.     J=MOD(K,60)
  429. C
  430.     WRITE(OUTCH,21010)
  431.     IF(I.NE.0) WRITE(OUTCH,21011) I
  432.     IF(I.GE.2) WRITE(OUTCH,21012)
  433.     IF(I.EQ.1) WRITE(OUTCH,21013)
  434.     IF(J.EQ.1) WRITE(OUTCH,21014) J
  435.     IF(J.NE.1) WRITE(OUTCH,21015) J
  436.     TELFLG=.TRUE.
  437.     RETURN
  438. C
  439. 21010    FORMAT(' You have been playing Dungeon for ',$)
  440. 21011    FORMAT('+',I3,' hour',$)
  441. 21012    FORMAT('+s and ',$)
  442. 21013    FORMAT('+ and ',$)
  443. 21014    FORMAT('+',I2,' minute.')
  444. 21015    FORMAT('+',I2,' minutes.')
  445. #endif PDP
  446. C
  447. C V91--    LEAP.  USUALLY A JOKE, WITH A CATCH.
  448. C
  449. 22000    IF(PRSO.EQ.0) GO TO 22200
  450. C                        !OVER SOMETHING?
  451.     IF(QHERE(PRSO,HERE)) GO TO 22100
  452. C                        !HERE?
  453.     CALL RSPEAK(447)
  454. C                        !NO, JOKE.
  455.     RETURN
  456. C
  457. 22100    IF(and(OFLAG2(PRSO),VILLBT).EQ.0) GO TO 22300
  458.     CALL RSPSUB(448,ODO2)
  459. C                        !CANT JUMP VILLAIN.
  460.     RETURN
  461. C
  462. 22200    IF(.NOT.FINDXT(XDOWN,HERE)) GO TO 22300
  463. C                        !DOWN EXIT?
  464.     IF((XTYPE.EQ.XNO).OR.((XTYPE.EQ.XCOND).AND.
  465. &        .NOT.FLAGS(XFLAG))) GO TO 22400
  466. 22300    CALL RSPEAK(314+RND(5))
  467. C                        !WHEEEE
  468. C                        !
  469.     RETURN
  470. C
  471. 22400    CALL JIGSUP(449+RND(4))
  472. C                        !FATAL LEAP.
  473.     RETURN
  474. C SVERBS, PAGE 6
  475. C
  476. C V92--    LOCK.
  477. C
  478. 23000    IF((PRSO.EQ.GRATE).AND.(HERE.EQ.MGRAT))
  479. &        GO TO 23200
  480. 23100    CALL RSPEAK(464)
  481. C                        !NOT LOCK GRATE.
  482.     RETURN
  483. C
  484. 23200    GRUNLF=.FALSE.
  485. C                        !GRATE NOW LOCKED.
  486.     CALL RSPEAK(214)
  487.     TRAVEL(REXIT(HERE)+1)=214
  488. C                        !CHANGE EXIT STATUS.
  489.     RETURN
  490. C
  491. C V93--    UNLOCK
  492. C
  493. 24000    IF((PRSO.NE.GRATE).OR.(HERE.NE.MGRAT))
  494. &        GO TO 23100
  495.     IF(PRSI.EQ.KEYS) GO TO 24200
  496. C                        !GOT KEYS?
  497.     CALL RSPSUB(465,ODI2)
  498. C                        !NO, JOKE.
  499.     RETURN
  500. C
  501. 24200    GRUNLF=.TRUE.
  502. C                        !UNLOCK GRATE.
  503.     CALL RSPEAK(217)
  504.     TRAVEL(REXIT(HERE)+1)=217
  505. C                        !CHANGE EXIT STATUS.
  506.     RETURN
  507. C
  508. C V94--    DIAGNOSE.
  509. C
  510. 25000    I=FIGHTS(WINNER,.FALSE.)
  511. C                        !GET FIGHTS STRENGTH.
  512.     J=ASTREN(WINNER)
  513. C                        !GET HEALTH.
  514.     K=MIN0(I+J,4)
  515. C                        !GET STATE.
  516.     IF(.NOT.CFLAG(CEVCUR)) J=0
  517. C                        !IF NO WOUNDS.
  518.     L=MIN0(4,IABS(J))
  519. C                        !SCALE.
  520.     CALL RSPEAK(473+L)
  521. C                        !DESCRIBE HEALTH.
  522.     I=(30*(-J-1))+CTICK(CEVCUR)
  523. C                        !COMPUTE WAIT.
  524. C
  525. #ifdef PDP
  526.     if(J .ne. 0) call cured(I)
  527. #else
  528.      IF(J.NE.0) WRITE(OUTCH,25100) I
  529. 25100    FORMAT(' You will be cured after ',I3,' moves.')
  530. #endif PDP
  531. C
  532.     CALL RSPEAK(478+K)
  533. C                        !HOW MUCH MORE?
  534.     IF(DEATHS.NE.0) CALL RSPEAK(482+DEATHS)
  535. C                        !HOW MANY DEATHS?
  536.     RETURN
  537. C SVERBS, PAGE 7
  538. C
  539. C V95--    INCANT
  540. C
  541. 26000    DO 26100 I=1,6
  542. C                        !SET UP PARSE.
  543.       P1(I)=' '
  544.       P2(I)=' '
  545. 26100    CONTINUE
  546.     WP=1
  547. C                        !WORD POINTER.
  548.     CP=1
  549. C                        !CHAR POINTER.
  550.     IF(PRSCON.LE.1) GO TO 26300
  551.     DO 26200 I=PRSCON,INLNT
  552. C                        !PARSE INPUT
  553.       IF(INBUF(I).EQ.',') GO TO 26300
  554. C                        !END OF PHRASE?
  555.       IF(INBUF(I).NE.' ') GO TO 26150
  556. C                        !SPACE?
  557.       IF(CP.NE.1) WP=WP+1
  558.       CP=1
  559.       GO TO 26200
  560. 26150      IF(WP.EQ.1) P1(CP)=INBUF(I)
  561. C                        !STUFF INTO HOLDER.
  562.       IF(WP.EQ.2) P2(CP)=INBUF(I)
  563.       CP=MIN0(CP+1,6)
  564. 26200    CONTINUE
  565. C
  566. 26300    PRSCON=1
  567. C                        !KILL REST OF LINE.
  568.     IF(P1(1).NE.' ') GO TO 26400
  569. C                        !ANY INPUT?
  570.     CALL RSPEAK(856)
  571. C                        !NO, HO HUM.
  572.     RETURN
  573. C
  574. 26400    CALL ENCRYP(P1,CH)
  575. C                        !COMPUTE RESPONSE.
  576.     IF(P2(1).NE.' ') GO TO 26600
  577. C                        !TWO PHRASES?
  578. C
  579.     IF(SPELLF) GO TO 26550
  580. C                        !HE'S TRYING TO LEARN.
  581.     IF(and(RFLAG(TSTRS),RSEEN).EQ.0) GO TO 26575
  582.     SPELLF=.TRUE.
  583. C                        !TELL HIM.
  584.     TELFLG=.TRUE.
  585. #ifdef PDP
  586.     call voice(P1,CH)
  587. #else
  588.      WRITE(OUTCH,26510) P1,CH
  589. 26510    FORMAT(' A hollow voice replies:  "',6A1,1X,6A1,'".')
  590. #endif PDP
  591. C
  592.     RETURN
  593. C
  594. 26550    CALL RSPEAK(857)
  595. C                        !HE'S GOT ONE ALREADY.
  596.     RETURN
  597. C
  598. 26575    CALL RSPEAK(858)
  599. C                        !HE'S NOT IN ENDGAME.
  600.     RETURN
  601. C
  602. 26600    IF(and(RFLAG(TSTRS),RSEEN).NE.0) GO TO 26800
  603.     DO 26700 I=1,6
  604.       IF(P2(I).NE.CH(I)) GO TO 26575
  605. C                        !WRONG.
  606. 26700    CONTINUE
  607.     SPELLF=.TRUE.
  608. C                        !IT WORKS.
  609.     CALL RSPEAK(859)
  610.     CTICK(CEVSTE)=1
  611. C                        !FORCE START.
  612.     RETURN
  613. C
  614. 26800    CALL RSPEAK(855)
  615. C                        !TOO LATE.
  616.     RETURN
  617. C SVERBS, PAGE 8
  618. C
  619. C V96--    ANSWER
  620. C
  621. 27000    IF((PRSCON.GT.1).AND.
  622. &        (HERE.EQ.FDOOR).AND.INQSTF)
  623. &        GO TO 27100
  624.     CALL RSPEAK(799)
  625. C                        !NO ONE LISTENS.
  626.     PRSCON=1
  627.     RETURN
  628. C
  629. 27100    K=1
  630. C                        !POINTER INTO ANSSTR.
  631.     DO 27300 J=1,28,2
  632. C                        !CHECK ANSWERS.
  633.       NEWK=K+ANSWER(J+1)
  634. C                        !COMPUTE NEXT K.
  635.       IF(QUESNO.NE.ANSWER(J)) GO TO 27300
  636. C                        !ONLY CHECK PROPER ANS.
  637.       I=PRSCON-1
  638. C                        !SCAN ANSWER.
  639.       DO 27200 L=K,NEWK-1
  640. 27150        I=I+1
  641. C                        !SKIP INPUT BLANKS.
  642.         IF(I.GT.INLNT) GO TO 27300
  643. C                        !END OF INPUT? LOSE.
  644.         IF(INBUF(I).EQ.' ') GO TO 27150
  645.         IF(INBUF(I).NE.ANSSTR(L)) GO TO 27300
  646. 27200      CONTINUE
  647.       GO TO 27500
  648. C                        !RIGHT ANSWER.
  649. 27300    K=NEWK
  650. C
  651.     PRSCON=1
  652. C                        !KILL REST OF LINE.
  653.     NQATT=NQATT+1
  654. C                        !WRONG, CRETIN.
  655.     IF(NQATT.GE.5) GO TO 27400
  656. C                        !TOO MANY WRONG?
  657.     CALL RSPEAK(800+NQATT)
  658. C                        !NO, TRY AGAIN.
  659.     RETURN
  660. C
  661. 27400    CALL RSPEAK(826)
  662. C                        !ALL OVER.
  663.     CFLAG(CEVINQ)=.FALSE.
  664. C                        !LOSE.
  665.     RETURN
  666. C
  667. 27500    PRSCON=1
  668. C                        !KILL REST OF LINE.
  669.     CORRCT=CORRCT+1
  670. C                        !GOT IT RIGHT.
  671.     CALL RSPEAK(800)
  672. C                        !HOORAY.
  673.     IF(CORRCT.GE.3) GO TO 27600
  674. C                        !WON TOTALLY?
  675.     CTICK(CEVINQ)=2
  676. C                        !NO, START AGAIN.
  677.     QUESNO=MOD(QUESNO+3,8)
  678.     NQATT=0
  679.     CALL RSPEAK(769)
  680. C                        !ASK NEXT QUESTION.
  681.     CALL RSPEAK(770+QUESNO)
  682.     RETURN
  683. C
  684. 27600    CALL RSPEAK(827)
  685. C                        !QUIZ OVER,
  686.     CFLAG(CEVINQ)=.FALSE.
  687.     OFLAG2(QDOOR)=or(OFLAG2(QDOOR),OPENBT)
  688.     RETURN
  689. C
  690.     END
  691.