xref: /original-bsd/contrib/dungeon/sverbs.F (revision a76afa45)
1C SVERBS-	SIMPLE VERBS PROCESSOR
2C	ALL VERBS IN THIS ROUTINE MUST BE INDEPENDANT
3C	OF OBJECT ACTIONS
4C
5C COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
6C ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
7C WRITTEN BY R. M. SUPNIK
8C
9C DECLARATIONS
10C
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 PP1(6),PP2(6),CH(6)
20	INTEGER ANSWER(28)
21#include "parser.h"
22#include "gamestate.h"
23#include "state.h"
24#include "screen.h"
25C
26C MISCELLANEOUS VARIABLES
27C
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"
46C
47C FUNCTIONS AND DATA
48C
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'/
69C SVERBS, PAGE 2
70C
71	SVERBS=.TRUE.
72C						!ASSUME WINS.
73	IF(PRSO.NE.0) ODO2=ODESC2(PRSO)
74C						!SET UP DESCRIPTORS.
75	IF(PRSI.NE.0) ODI2=ODESC2(PRSI)
76C
77	IF(RI.EQ.0) CALL BUG(7,RI)
78C						!ZERO IS VERBOTEN.
79	IF(RI.LE.MXNOP) RETURN
80C						!NOP?
81	IF(RI.LE.MXJOKE) GO TO 100
82C						!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)
89C
90C ALL VERB PROCESSORS RETURN HERE TO DECLARE FAILURE.
91C
9210	SVERBS=.FALSE.
93C						!LOSE.
94	RETURN
95C
96C JOKE PROCESSOR.
97C FIND PROPER ENTRY IN JOKES, USE IT TO SELECT STRING TO PRINT.
98C
99100	I=JOKES(RI-MXNOP)
100C						!GET TABLE ENTRY.
101	J=I/1000
102C						!ISOLATE # STRINGS.
103	IF(J.NE.0) I=MOD(I,1000)+RND(J)
104C						!IF RANDOM, CHOOSE.
105	CALL RSPEAK(I)
106C						!PRINT JOKE.
107	RETURN
108C SVERBS, PAGE 2A
109C
110C V65--	ROOM
111C
11265000	SVERBS=RMDESC(2)
113C						!DESCRIBE ROOM ONLY.
114	RETURN
115C
116C V66--	OBJECTS
117C
11866000	SVERBS=RMDESC(1)
119C						!DESCRIBE OBJ ONLY.
120	IF(.NOT.TELFLG) CALL RSPEAK(138)
121C						!NO OBJECTS.
122	RETURN
123C
124C V67--	RNAME
125C
12667000	CALL RSPEAK(RDESC2-HERE)
127C						!SHORT ROOM NAME.
128	RETURN
129C
130C V68--	RESERVED
131C
13268000	RETURN
133C
134C V69--	RESERVED
135C
13669000	RETURN
137C SVERBS, PAGE 3
138C
139C V70--	BRIEF.  SET FLAG.
140C
1411000	BRIEFF=.TRUE.
142C						!BRIEF DESCRIPTIONS.
143	SUPERF=.FALSE.
144	CALL RSPEAK(326)
145	RETURN
146C
147C V71--	VERBOSE.  CLEAR FLAGS.
148C
1492000	BRIEFF=.FALSE.
150C						!LONG DESCRIPTIONS.
151	SUPERF=.FALSE.
152	CALL RSPEAK(327)
153	RETURN
154C
155C V72--	SUPERBRIEF.  SET FLAG.
156C
1573000	SUPERF=.TRUE.
158	CALL RSPEAK(328)
159	RETURN
160C
161C V73-- STAY (USED IN ENDGAME).
162C
1634000	IF(WINNER.NE.AMASTR) GO TO 4100
164C						!TELL MASTER, STAY.
165	CALL RSPEAK(781)
166C						!HE DOES.
167	CTICK(CEVFOL)=0
168C						!NOT FOLLOWING.
169	RETURN
170C
1714100	IF(WINNER.EQ.PLAYER) CALL RSPEAK(664)
172C						!JOKE.
173	RETURN
174C
175C V74--	VERSION.  PRINT INFO.
176C
177#ifdef PDP
1785000	call prvers(vmaj,vmin,vedit)
179#else
1805000	WRITE(OUTCH,5010) VMAJ,VMIN,VEDIT
181#ifdef NOCC
1825010	FORMAT('V',I1,'.',I2,A1)
183#else NOCC
1845010	FORMAT(' V',I1,'.',I2,A1)
185#endif NOCC
186#endif PDP
187	TELFLG=.TRUE.
188	RETURN
189C
190C V75--	SWIM.  ALWAYS A JOKE.
191C
1926000	I=330
193C						!ASSUME WATER.
194	IF(and(RFLAG(HERE),(RWATER+RFILL)).EQ.0)
195&		I=331+RND(3)
196	CALL RSPEAK(I)
197	RETURN
198C
199C V76--	GERONIMO.  IF IN BARREL, FATAL, ELSE JOKE.
200C
2017000	IF(HERE.EQ.MBARR) GO TO 7100
202C						!IN BARREL?
203	CALL RSPEAK(334)
204C						!NO, JOKE.
205	RETURN
206C
2077100	CALL JIGSUP(335)
208C						!OVER FALLS.
209	RETURN
210C
211C V77--	SINBAD ET AL.  CHASE CYCLOPS, ELSE JOKE.
212C
2138000	IF((HERE.EQ.MCYCL).AND.QHERE(CYCLO,HERE)) GO TO 8100
214	CALL RSPEAK(336)
215C						!NOT HERE, JOKE.
216	RETURN
217C
2188100	CALL NEWSTA(CYCLO,337,0,0,0)
219C						!CYCLOPS FLEES.
220	CYCLOF=.TRUE.
221C						!SET ALL FLAGS.
222	MAGICF=.TRUE.
223	OFLAG2(CYCLO)=and(OFLAG2(CYCLO), not(FITEBT))
224	RETURN
225C
226C V78--	WELL.  OPEN DOOR, ELSE JOKE.
227C
2289000	IF(RIDDLF.OR.(HERE.NE.RIDDL)) GO TO 9100
229C						!IN RIDDLE ROOM?
230	RIDDLF=.TRUE.
231C						!YES, SOLVED IT.
232	CALL RSPEAK(338)
233	RETURN
234C
2359100	CALL RSPEAK(339)
236C						!WELL, WHAT?
237	RETURN
238C
239C V79--	PRAY.  IF IN TEMP2, POOF
240C						!
241C
24210000	IF(HERE.NE.TEMP2) GO TO 10050
243C						!IN TEMPLE?
244	IF(MOVETO(FORE1,WINNER)) GO TO 10100
245C						!FORE1 STILL THERE?
24610050	CALL RSPEAK(340)
247C						!JOKE.
248	RETURN
249C
25010100	F=RMDESC(3)
251C						!MOVED, DESCRIBE.
252	RETURN
253C
254C V80--	TREASURE.  IF IN TEMP1, POOF
255C						!
256C
25711000	IF(HERE.NE.TEMP1) GO TO 11050
258C						!IN TEMPLE?
259	IF(MOVETO(TREAS,WINNER)) GO TO 10100
260C						!TREASURE ROOM THERE?
26111050	CALL RSPEAK(341)
262C						!NOTHING HAPPENS.
263	RETURN
264C
265C V81--	TEMPLE.  IF IN TREAS, POOF
266C						!
267C
26812000	IF(HERE.NE.TREAS) GO TO 12050
269C						!IN TREASURE?
270	IF(MOVETO(TEMP1,WINNER)) GO TO 10100
271C						!TEMP1 STILL THERE?
27212050	CALL RSPEAK(341)
273C						!NOTHING HAPPENS.
274	RETURN
275C
276C V82--	BLAST.  USUALLY A JOKE.
277C
27813000	I=342
279C						!DONT UNDERSTAND.
280	IF(PRSO.EQ.SAFE) I=252
281C						!JOKE FOR SAFE.
282	CALL RSPEAK(I)
283	RETURN
284C
285C V83--	SCORE.  PRINT SCORE.
286C
28714000	CALL SCORE(.FALSE.)
288	RETURN
289C
290C V84--	QUIT.  FINISH OUT THE GAME.
291C
29215000	CALL SCORE(.TRUE.)
293C						!TELLL SCORE.
294	IF(.NOT.YESNO(343,0,0)) RETURN
295C						!ASK FOR Y/N DECISION.
296#ifdef PDP
297C	close routine moved to exit for pdp version
298#else
299	CLOSE (DBCH)
300#endif PDP
301	CALL EXIT
302C						!BYE.
303C SVERBS, PAGE 4
304C
305C V85--	FOLLOW (USED IN ENDGAME)
306C
30716000	IF(WINNER.NE.AMASTR) RETURN
308C						!TELL MASTER, FOLLOW.
309	CALL RSPEAK(782)
310	CTICK(CEVFOL)=-1
311C						!STARTS FOLLOWING.
312	RETURN
313C
314C V86--	WALK THROUGH
315C
31617000	IF((SCOLRM.EQ.0).OR.((PRSO.NE.SCOL).AND.
317&		((PRSO.NE.WNORT).OR.(HERE.NE.BKBOX)))) GO TO 17100
318	SCOLAC=SCOLRM
319C						!WALKED THRU SCOL.
320	PRSO=0
321C						!FAKE OUT FROMDR.
322	CTICK(CEVSCL)=6
323C						!START ALARM.
324	CALL RSPEAK(668)
325C						!DISORIENT HIM.
326	F=MOVETO(SCOLRM,WINNER)
327C						!INTO ROOM.
328	F=RMDESC(3)
329C						!DESCRIBE.
330	RETURN
331C
33217100	IF(HERE.NE.SCOLAC) GO TO 17300
333C						!ON OTHER SIDE OF SCOL?
334	DO 17200 I=1,12,3
335C						!WALK THRU PROPER WALL?
336	  IF((SCOLWL(I).EQ.HERE).AND.(SCOLWL(I+1).EQ.PRSO))
337&		GO TO 17500
33817200	CONTINUE
339C
34017300	IF(and(OFLAG1(PRSO),TAKEBT).NE.0) GO TO 17400
341	I=669
342C						!NO, JOKE.
343	IF(PRSO.EQ.SCOL) I=670
344C						!SPECIAL JOKE FOR SCOL.
345	CALL RSPSUB(I,ODO2)
346	RETURN
347C
34817400	I=671
349C						!JOKE.
350	IF(OROOM(PRSO).NE.0) I=552+RND(5)
351C						!SPECIAL JOKES IF CARRY.
352	CALL RSPEAK(I)
353	RETURN
354C
35517500	PRSO=SCOLWL(I+2)
356C						!THRU SCOL WALL...
357	DO 17600 I=1,8,2
358C						!FIND MATCHING ROOM.
359	  IF(PRSO.EQ.SCOLDR(I)) SCOLRM=SCOLDR(I+1)
36017600	CONTINUE
361C						!DECLARE NEW SCOLRM.
362	CTICK(CEVSCL)=0
363C						!CANCEL ALARM.
364	CALL RSPEAK(668)
365C						!DISORIENT HIM.
366	F=MOVETO(BKBOX,WINNER)
367C						!BACK IN BOX ROOM.
368	F=RMDESC(3)
369	RETURN
370C
371C V87--	RING.  A JOKE.
372C
37318000	I=359
374C						!CANT RING.
375	IF(PRSO.EQ.BELL) I=360
376C						!DING, DONG.
377	CALL RSPEAK(I)
378C						!JOKE.
379	RETURN
380C
381C V88--	BRUSH.  JOKE WITH OBSCURE TRAP.
382C
38319000	IF(PRSO.EQ.TEETH) GO TO 19100
384C						!BRUSH TEETH?
385	CALL RSPEAK(362)
386C						!NO, JOKE.
387	RETURN
388C
38919100	IF(PRSI.NE.0) GO TO 19200
390C						!WITH SOMETHING?
391	CALL RSPEAK(363)
392C						!NO, JOKE.
393	RETURN
394C
39519200	IF((PRSI.EQ.PUTTY).AND.(OADV(PUTTY).EQ.WINNER))
396&		GO TO 19300
397	CALL RSPSUB(364,ODI2)
398C						!NO, JOKE.
399	RETURN
400C
40119300	CALL JIGSUP(365)
402C						!YES, DEAD
403C						!
404C						!
405C						!
406C						!
407C						!
408	RETURN
409C SVERBS, PAGE 5
410C
411C V89--	DIG.  UNLESS SHOVEL, A JOKE.
412C
41320000	IF(PRSO.EQ.SHOVE) RETURN
414C						!SHOVEL?
415	I=392
416C						!ASSUME TOOL.
417	IF(and(OFLAG1(PRSO),TOOLBT).EQ.0) I=393
418	CALL RSPSUB(I,ODO2)
419	RETURN
420C
421C V90--	TIME.  PRINT OUT DURATION OF GAME.
422C
423#ifdef PDP
424C	no duration time available for pdp version (removed
425C	to make things fit)
42621000	TELFLG=.TRUE.
427	RETURN
428#else
42921000	CALL GTTIME(K)
430C						!GET PLAY TIME.
431	I=K/60
432	J=MOD(K,60)
433C
434#ifdef NOCC
435	IF(I.EQ.0.AND.J.EQ.1) WRITE(OUTCH,21010) J
436	IF(I.EQ.0.AND.J.NE.1) WRITE(OUTCH,21011) J
437	IF(I.EQ.1.AND.J.EQ.1) WRITE(OUTCH,21012) I,J
438	IF(I.EQ.1.AND.J.NE.1) WRITE(OUTCH,21013) I,J
439	IF(I.GE.2.AND.J.EQ.1) WRITE(OUTCH,21014) I,J
440	IF(I.GE.2.AND.J.NE.1) WRITE(OUTCH,21015) I,J
441	TELFLG=.TRUE.
442	RETURN
443C
44421010	FORMAT('You have been playing Dungeon for ',I2,' minute.')
44521011	FORMAT('You have been playing Dungeon for ',I2,' minutes.')
44621012	FORMAT('You have been playing Dungeon for ',I3,' hour and ',
447&		I2,' minute.')
44821013	FORMAT('You have been playing Dungeon for ',I3,' hour and ',
449&		I2,' minutes.')
45021014	FORMAT('You have been playing Dungeon for ',I3,' hours and ',
451&		I2,' minute.')
45221015	FORMAT('You have been playing Dungeon for ',I3,' hours and ',
453&		I2,' minutes.')
454#else NOCC
455	WRITE(OUTCH,21010)
456	IF(I.NE.0) WRITE(OUTCH,21011) I
457	IF(I.GE.2) WRITE(OUTCH,21012)
458	IF(I.EQ.1) WRITE(OUTCH,21013)
459	IF(J.EQ.1) WRITE(OUTCH,21014) J
460	IF(J.NE.1) WRITE(OUTCH,21015) J
461	TELFLG=.TRUE.
462	RETURN
463C
46421010	FORMAT(' You have been playing Dungeon for ',$)
46521011	FORMAT('+',I3,' hour',$)
46621012	FORMAT('+s and ',$)
46721013	FORMAT('+ and ',$)
46821014	FORMAT('+',I2,' minute.')
46921015	FORMAT('+',I2,' minutes.')
470#endif NOCC
471#endif PDP
472C
473C V91--	LEAP.  USUALLY A JOKE, WITH A CATCH.
474C
47522000	IF(PRSO.EQ.0) GO TO 22200
476C						!OVER SOMETHING?
477	IF(QHERE(PRSO,HERE)) GO TO 22100
478C						!HERE?
479	CALL RSPEAK(447)
480C						!NO, JOKE.
481	RETURN
482C
48322100	IF(and(OFLAG2(PRSO),VILLBT).EQ.0) GO TO 22300
484	CALL RSPSUB(448,ODO2)
485C						!CANT JUMP VILLAIN.
486	RETURN
487C
48822200	IF(.NOT.FINDXT(XDOWN,HERE)) GO TO 22300
489C						!DOWN EXIT?
490	IF((XTYPE.EQ.XNO).OR.((XTYPE.EQ.XCOND).AND.
491&		.NOT.FLAGS(XFLAG))) GO TO 22400
49222300	CALL RSPEAK(314+RND(5))
493C						!WHEEEE
494C						!
495	RETURN
496C
49722400	CALL JIGSUP(449+RND(4))
498C						!FATAL LEAP.
499	RETURN
500C SVERBS, PAGE 6
501C
502C V92--	LOCK.
503C
50423000	IF((PRSO.EQ.GRATE).AND.(HERE.EQ.MGRAT))
505&		GO TO 23200
50623100	CALL RSPEAK(464)
507C						!NOT LOCK GRATE.
508	RETURN
509C
51023200	GRUNLF=.FALSE.
511C						!GRATE NOW LOCKED.
512	CALL RSPEAK(214)
513	TRAVEL(REXIT(HERE)+1)=214
514C						!CHANGE EXIT STATUS.
515	RETURN
516C
517C V93--	UNLOCK
518C
51924000	IF((PRSO.NE.GRATE).OR.(HERE.NE.MGRAT))
520&		GO TO 23100
521	IF(PRSI.EQ.KEYS) GO TO 24200
522C						!GOT KEYS?
523	CALL RSPSUB(465,ODI2)
524C						!NO, JOKE.
525	RETURN
526C
52724200	GRUNLF=.TRUE.
528C						!UNLOCK GRATE.
529	CALL RSPEAK(217)
530	TRAVEL(REXIT(HERE)+1)=217
531C						!CHANGE EXIT STATUS.
532	RETURN
533C
534C V94--	DIAGNOSE.
535C
53625000	I=FIGHTS(WINNER,.FALSE.)
537C						!GET FIGHTS STRENGTH.
538	J=ASTREN(WINNER)
539C						!GET HEALTH.
540	K=MIN0(I+J,4)
541C						!GET STATE.
542	IF(.NOT.CFLAG(CEVCUR)) J=0
543C						!IF NO WOUNDS.
544	L=MIN0(4,IABS(J))
545C						!SCALE.
546	CALL RSPEAK(473+L)
547C						!DESCRIBE HEALTH.
548	I=(30*(-J-1))+CTICK(CEVCUR)
549C						!COMPUTE WAIT.
550C
551#ifdef PDP
552	if(J .ne. 0) call cured(I)
553#else
554 	IF(J.NE.0) WRITE(OUTCH,25100) I
555#ifdef NOCC
55625100	FORMAT('You will be cured after ',I3,' moves.')
557#else NOCC
55825100	FORMAT(' You will be cured after ',I3,' moves.')
559#endif NOCC
560#endif PDP
561C
562	CALL RSPEAK(478+K)
563C						!HOW MUCH MORE?
564	IF(DEATHS.NE.0) CALL RSPEAK(482+DEATHS)
565C						!HOW MANY DEATHS?
566	RETURN
567C SVERBS, PAGE 7
568C
569C V95--	INCANT
570C
57126000	DO 26100 I=1,6
572C						!SET UP PARSE.
573	  PP1(I)=' '
574	  PP2(I)=' '
57526100	CONTINUE
576	WP=1
577C						!WORD POINTER.
578	CP=1
579C						!CHAR POINTER.
580	IF(PRSCON.LE.1) GO TO 26300
581	DO 26200 I=PRSCON,INLNT
582C						!PARSE INPUT
583	  IF(INBUF(I).EQ.',') GO TO 26300
584C						!END OF PHRASE?
585	  IF(INBUF(I).NE.' ') GO TO 26150
586C						!SPACE?
587	  IF(CP.NE.1) WP=WP+1
588	  CP=1
589	  GO TO 26200
59026150	  IF(WP.EQ.1) PP1(CP)=INBUF(I)
591C						!STUFF INTO HOLDER.
592	  IF(WP.EQ.2) PP2(CP)=INBUF(I)
593	  CP=MIN0(CP+1,6)
59426200	CONTINUE
595C
59626300	PRSCON=1
597C						!KILL REST OF LINE.
598	IF(PP1(1).NE.' ') GO TO 26400
599C						!ANY INPUT?
600	CALL RSPEAK(856)
601C						!NO, HO HUM.
602	RETURN
603C
60426400	CALL ENCRYP(PP1,CH)
605C						!COMPUTE RESPONSE.
606	IF(PP2(1).NE.' ') GO TO 26600
607C						!TWO PHRASES?
608C
609	IF(SPELLF) GO TO 26550
610C						!HE'S TRYING TO LEARN.
611	IF(and(RFLAG(TSTRS),RSEEN).EQ.0) GO TO 26575
612	SPELLF=.TRUE.
613C						!TELL HIM.
614	TELFLG=.TRUE.
615#ifdef PDP
616	call voice(PP1,CH)
617#else
618  	WRITE(OUTCH,26510) PP1,CH
619#ifdef NOCC
62026510	FORMAT('A hollow voice replies:  "',6A1,1X,6A1,'".')
621#else NOCC
62226510	FORMAT(' A hollow voice replies:  "',6A1,1X,6A1,'".')
623#endif NOCC
624#endif PDP
625C
626	RETURN
627C
62826550	CALL RSPEAK(857)
629C						!HE'S GOT ONE ALREADY.
630	RETURN
631C
63226575	CALL RSPEAK(858)
633C						!HE'S NOT IN ENDGAME.
634	RETURN
635C
63626600	IF(and(RFLAG(TSTRS),RSEEN).NE.0) GO TO 26800
637	DO 26700 I=1,6
638	  IF(PP2(I).NE.CH(I)) GO TO 26575
639C						!WRONG.
64026700	CONTINUE
641	SPELLF=.TRUE.
642C						!IT WORKS.
643	CALL RSPEAK(859)
644	CTICK(CEVSTE)=1
645C						!FORCE START.
646	RETURN
647C
64826800	CALL RSPEAK(855)
649C						!TOO LATE.
650	RETURN
651C SVERBS, PAGE 8
652C
653C V96--	ANSWER
654C
65527000	IF((PRSCON.GT.1).AND.
656&		(HERE.EQ.FDOOR).AND.INQSTF)
657&		GO TO 27100
658	CALL RSPEAK(799)
659C						!NO ONE LISTENS.
660	PRSCON=1
661	RETURN
662C
66327100	K=1
664C						!POINTER INTO ANSSTR.
665	DO 27300 J=1,28,2
666C						!CHECK ANSWERS.
667	  NEWK=K+ANSWER(J+1)
668C						!COMPUTE NEXT K.
669	  IF(QUESNO.NE.ANSWER(J)) GO TO 27300
670C						!ONLY CHECK PROPER ANS.
671	  I=PRSCON-1
672C						!SCAN ANSWER.
673	  DO 27200 L=K,NEWK-1
67427150	    I=I+1
675C						!SKIP INPUT BLANKS.
676	    IF(I.GT.INLNT) GO TO 27300
677C						!END OF INPUT? LOSE.
678	    IF(INBUF(I).EQ.' ') GO TO 27150
679	    IF(INBUF(I).NE.ANSSTR(L)) GO TO 27300
68027200	  CONTINUE
681	  GO TO 27500
682C						!RIGHT ANSWER.
68327300	K=NEWK
684C
685	PRSCON=1
686C						!KILL REST OF LINE.
687	NQATT=NQATT+1
688C						!WRONG, CRETIN.
689	IF(NQATT.GE.5) GO TO 27400
690C						!TOO MANY WRONG?
691	CALL RSPEAK(800+NQATT)
692C						!NO, TRY AGAIN.
693	RETURN
694C
69527400	CALL RSPEAK(826)
696C						!ALL OVER.
697	CFLAG(CEVINQ)=.FALSE.
698C						!LOSE.
699	RETURN
700C
70127500	PRSCON=1
702C						!KILL REST OF LINE.
703	CORRCT=CORRCT+1
704C						!GOT IT RIGHT.
705	CALL RSPEAK(800)
706C						!HOORAY.
707	IF(CORRCT.GE.3) GO TO 27600
708C						!WON TOTALLY?
709	CTICK(CEVINQ)=2
710C						!NO, START AGAIN.
711	QUESNO=MOD(QUESNO+3,8)
712	NQATT=0
713	CALL RSPEAK(769)
714C						!ASK NEXT QUESTION.
715	CALL RSPEAK(770+QUESNO)
716	RETURN
717C
71827600	CALL RSPEAK(827)
719C						!QUIZ OVER,
720	CFLAG(CEVINQ)=.FALSE.
721	OFLAG2(QDOOR)=or(OFLAG2(QDOOR),OPENBT)
722	RETURN
723C
724	END
725