|
|
1.1 root 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 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"
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: #ifdef NOCC
182: 5010 FORMAT('V',I1,'.',I2,A1)
183: #else NOCC
184: 5010 FORMAT(' V',I1,'.',I2,A1)
185: #endif NOCC
186: #endif PDP
187: TELFLG=.TRUE.
188: RETURN
189: C
190: C V75-- SWIM. ALWAYS A JOKE.
191: C
192: 6000 I=330
193: C !ASSUME WATER.
194: IF(and(RFLAG(HERE),(RWATER+RFILL)).EQ.0)
195: & I=331+RND(3)
196: CALL RSPEAK(I)
197: RETURN
198: C
199: C V76-- GERONIMO. IF IN BARREL, FATAL, ELSE JOKE.
200: C
201: 7000 IF(HERE.EQ.MBARR) GO TO 7100
202: C !IN BARREL?
203: CALL RSPEAK(334)
204: C !NO, JOKE.
205: RETURN
206: C
207: 7100 CALL JIGSUP(335)
208: C !OVER FALLS.
209: RETURN
210: C
211: C V77-- SINBAD ET AL. CHASE CYCLOPS, ELSE JOKE.
212: C
213: 8000 IF((HERE.EQ.MCYCL).AND.QHERE(CYCLO,HERE)) GO TO 8100
214: CALL RSPEAK(336)
215: C !NOT HERE, JOKE.
216: RETURN
217: C
218: 8100 CALL NEWSTA(CYCLO,337,0,0,0)
219: C !CYCLOPS FLEES.
220: CYCLOF=.TRUE.
221: C !SET ALL FLAGS.
222: MAGICF=.TRUE.
223: OFLAG2(CYCLO)=and(OFLAG2(CYCLO), not(FITEBT))
224: RETURN
225: C
226: C V78-- WELL. OPEN DOOR, ELSE JOKE.
227: C
228: 9000 IF(RIDDLF.OR.(HERE.NE.RIDDL)) GO TO 9100
229: C !IN RIDDLE ROOM?
230: RIDDLF=.TRUE.
231: C !YES, SOLVED IT.
232: CALL RSPEAK(338)
233: RETURN
234: C
235: 9100 CALL RSPEAK(339)
236: C !WELL, WHAT?
237: RETURN
238: C
239: C V79-- PRAY. IF IN TEMP2, POOF
240: C !
241: C
242: 10000 IF(HERE.NE.TEMP2) GO TO 10050
243: C !IN TEMPLE?
244: IF(MOVETO(FORE1,WINNER)) GO TO 10100
245: C !FORE1 STILL THERE?
246: 10050 CALL RSPEAK(340)
247: C !JOKE.
248: RETURN
249: C
250: 10100 F=RMDESC(3)
251: C !MOVED, DESCRIBE.
252: RETURN
253: C
254: C V80-- TREASURE. IF IN TEMP1, POOF
255: C !
256: C
257: 11000 IF(HERE.NE.TEMP1) GO TO 11050
258: C !IN TEMPLE?
259: IF(MOVETO(TREAS,WINNER)) GO TO 10100
260: C !TREASURE ROOM THERE?
261: 11050 CALL RSPEAK(341)
262: C !NOTHING HAPPENS.
263: RETURN
264: C
265: C V81-- TEMPLE. IF IN TREAS, POOF
266: C !
267: C
268: 12000 IF(HERE.NE.TREAS) GO TO 12050
269: C !IN TREASURE?
270: IF(MOVETO(TEMP1,WINNER)) GO TO 10100
271: C !TEMP1 STILL THERE?
272: 12050 CALL RSPEAK(341)
273: C !NOTHING HAPPENS.
274: RETURN
275: C
276: C V82-- BLAST. USUALLY A JOKE.
277: C
278: 13000 I=342
279: C !DONT UNDERSTAND.
280: IF(PRSO.EQ.SAFE) I=252
281: C !JOKE FOR SAFE.
282: CALL RSPEAK(I)
283: RETURN
284: C
285: C V83-- SCORE. PRINT SCORE.
286: C
287: 14000 CALL SCORE(.FALSE.)
288: RETURN
289: C
290: C V84-- QUIT. FINISH OUT THE GAME.
291: C
292: 15000 CALL SCORE(.TRUE.)
293: C !TELLL SCORE.
294: IF(.NOT.YESNO(343,0,0)) RETURN
295: C !ASK FOR Y/N DECISION.
296: #ifdef PDP
297: C close routine moved to exit for pdp version
298: #else
299: CLOSE (DBCH)
300: #endif PDP
301: CALL EXIT
302: C !BYE.
303: C SVERBS, PAGE 4
304: C
305: C V85-- FOLLOW (USED IN ENDGAME)
306: C
307: 16000 IF(WINNER.NE.AMASTR) RETURN
308: C !TELL MASTER, FOLLOW.
309: CALL RSPEAK(782)
310: CTICK(CEVFOL)=-1
311: C !STARTS FOLLOWING.
312: RETURN
313: C
314: C V86-- WALK THROUGH
315: C
316: 17000 IF((SCOLRM.EQ.0).OR.((PRSO.NE.SCOL).AND.
317: & ((PRSO.NE.WNORT).OR.(HERE.NE.BKBOX)))) GO TO 17100
318: SCOLAC=SCOLRM
319: C !WALKED THRU SCOL.
320: PRSO=0
321: C !FAKE OUT FROMDR.
322: CTICK(CEVSCL)=6
323: C !START ALARM.
324: CALL RSPEAK(668)
325: C !DISORIENT HIM.
326: F=MOVETO(SCOLRM,WINNER)
327: C !INTO ROOM.
328: F=RMDESC(3)
329: C !DESCRIBE.
330: RETURN
331: C
332: 17100 IF(HERE.NE.SCOLAC) GO TO 17300
333: C !ON OTHER SIDE OF SCOL?
334: DO 17200 I=1,12,3
335: C !WALK THRU PROPER WALL?
336: IF((SCOLWL(I).EQ.HERE).AND.(SCOLWL(I+1).EQ.PRSO))
337: & GO TO 17500
338: 17200 CONTINUE
339: C
340: 17300 IF(and(OFLAG1(PRSO),TAKEBT).NE.0) GO TO 17400
341: I=669
342: C !NO, JOKE.
343: IF(PRSO.EQ.SCOL) I=670
344: C !SPECIAL JOKE FOR SCOL.
345: CALL RSPSUB(I,ODO2)
346: RETURN
347: C
348: 17400 I=671
349: C !JOKE.
350: IF(OROOM(PRSO).NE.0) I=552+RND(5)
351: C !SPECIAL JOKES IF CARRY.
352: CALL RSPEAK(I)
353: RETURN
354: C
355: 17500 PRSO=SCOLWL(I+2)
356: C !THRU SCOL WALL...
357: DO 17600 I=1,8,2
358: C !FIND MATCHING ROOM.
359: IF(PRSO.EQ.SCOLDR(I)) SCOLRM=SCOLDR(I+1)
360: 17600 CONTINUE
361: C !DECLARE NEW SCOLRM.
362: CTICK(CEVSCL)=0
363: C !CANCEL ALARM.
364: CALL RSPEAK(668)
365: C !DISORIENT HIM.
366: F=MOVETO(BKBOX,WINNER)
367: C !BACK IN BOX ROOM.
368: F=RMDESC(3)
369: RETURN
370: C
371: C V87-- RING. A JOKE.
372: C
373: 18000 I=359
374: C !CANT RING.
375: IF(PRSO.EQ.BELL) I=360
376: C !DING, DONG.
377: CALL RSPEAK(I)
378: C !JOKE.
379: RETURN
380: C
381: C V88-- BRUSH. JOKE WITH OBSCURE TRAP.
382: C
383: 19000 IF(PRSO.EQ.TEETH) GO TO 19100
384: C !BRUSH TEETH?
385: CALL RSPEAK(362)
386: C !NO, JOKE.
387: RETURN
388: C
389: 19100 IF(PRSI.NE.0) GO TO 19200
390: C !WITH SOMETHING?
391: CALL RSPEAK(363)
392: C !NO, JOKE.
393: RETURN
394: C
395: 19200 IF((PRSI.EQ.PUTTY).AND.(OADV(PUTTY).EQ.WINNER))
396: & GO TO 19300
397: CALL RSPSUB(364,ODI2)
398: C !NO, JOKE.
399: RETURN
400: C
401: 19300 CALL JIGSUP(365)
402: C !YES, DEAD
403: C !
404: C !
405: C !
406: C !
407: C !
408: RETURN
409: C SVERBS, PAGE 5
410: C
411: C V89-- DIG. UNLESS SHOVEL, A JOKE.
412: C
413: 20000 IF(PRSO.EQ.SHOVE) RETURN
414: C !SHOVEL?
415: I=392
416: C !ASSUME TOOL.
417: IF(and(OFLAG1(PRSO),TOOLBT).EQ.0) I=393
418: CALL RSPSUB(I,ODO2)
419: RETURN
420: C
421: C V90-- TIME. PRINT OUT DURATION OF GAME.
422: C
423: #ifdef PDP
424: C no duration time available for pdp version (removed
425: C to make things fit)
426: 21000 TELFLG=.TRUE.
427: RETURN
428: #else
429: 21000 CALL GTTIME(K)
430: C !GET PLAY TIME.
431: I=K/60
432: J=MOD(K,60)
433: C
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
443: C
444: 21010 FORMAT('You have been playing Dungeon for ',I2,' minute.')
445: 21011 FORMAT('You have been playing Dungeon for ',I2,' minutes.')
446: 21012 FORMAT('You have been playing Dungeon for ',I3,' hour and ',
447: & I2,' minute.')
448: 21013 FORMAT('You have been playing Dungeon for ',I3,' hour and ',
449: & I2,' minutes.')
450: 21014 FORMAT('You have been playing Dungeon for ',I3,' hours and ',
451: & I2,' minute.')
452: 21015 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
463: C
464: 21010 FORMAT(' You have been playing Dungeon for ',$)
465: 21011 FORMAT('+',I3,' hour',$)
466: 21012 FORMAT('+s and ',$)
467: 21013 FORMAT('+ and ',$)
468: 21014 FORMAT('+',I2,' minute.')
469: 21015 FORMAT('+',I2,' minutes.')
470: #endif NOCC
471: #endif PDP
472: C
473: C V91-- LEAP. USUALLY A JOKE, WITH A CATCH.
474: C
475: 22000 IF(PRSO.EQ.0) GO TO 22200
476: C !OVER SOMETHING?
477: IF(QHERE(PRSO,HERE)) GO TO 22100
478: C !HERE?
479: CALL RSPEAK(447)
480: C !NO, JOKE.
481: RETURN
482: C
483: 22100 IF(and(OFLAG2(PRSO),VILLBT).EQ.0) GO TO 22300
484: CALL RSPSUB(448,ODO2)
485: C !CANT JUMP VILLAIN.
486: RETURN
487: C
488: 22200 IF(.NOT.FINDXT(XDOWN,HERE)) GO TO 22300
489: C !DOWN EXIT?
490: IF((XTYPE.EQ.XNO).OR.((XTYPE.EQ.XCOND).AND.
491: & .NOT.FLAGS(XFLAG))) GO TO 22400
492: 22300 CALL RSPEAK(314+RND(5))
493: C !WHEEEE
494: C !
495: RETURN
496: C
497: 22400 CALL JIGSUP(449+RND(4))
498: C !FATAL LEAP.
499: RETURN
500: C SVERBS, PAGE 6
501: C
502: C V92-- LOCK.
503: C
504: 23000 IF((PRSO.EQ.GRATE).AND.(HERE.EQ.MGRAT))
505: & GO TO 23200
506: 23100 CALL RSPEAK(464)
507: C !NOT LOCK GRATE.
508: RETURN
509: C
510: 23200 GRUNLF=.FALSE.
511: C !GRATE NOW LOCKED.
512: CALL RSPEAK(214)
513: TRAVEL(REXIT(HERE)+1)=214
514: C !CHANGE EXIT STATUS.
515: RETURN
516: C
517: C V93-- UNLOCK
518: C
519: 24000 IF((PRSO.NE.GRATE).OR.(HERE.NE.MGRAT))
520: & GO TO 23100
521: IF(PRSI.EQ.KEYS) GO TO 24200
522: C !GOT KEYS?
523: CALL RSPSUB(465,ODI2)
524: C !NO, JOKE.
525: RETURN
526: C
527: 24200 GRUNLF=.TRUE.
528: C !UNLOCK GRATE.
529: CALL RSPEAK(217)
530: TRAVEL(REXIT(HERE)+1)=217
531: C !CHANGE EXIT STATUS.
532: RETURN
533: C
534: C V94-- DIAGNOSE.
535: C
536: 25000 I=FIGHTS(WINNER,.FALSE.)
537: C !GET FIGHTS STRENGTH.
538: J=ASTREN(WINNER)
539: C !GET HEALTH.
540: K=MIN0(I+J,4)
541: C !GET STATE.
542: IF(.NOT.CFLAG(CEVCUR)) J=0
543: C !IF NO WOUNDS.
544: L=MIN0(4,IABS(J))
545: C !SCALE.
546: CALL RSPEAK(473+L)
547: C !DESCRIBE HEALTH.
548: I=(30*(-J-1))+CTICK(CEVCUR)
549: C !COMPUTE WAIT.
550: C
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
556: 25100 FORMAT('You will be cured after ',I3,' moves.')
557: #else NOCC
558: 25100 FORMAT(' You will be cured after ',I3,' moves.')
559: #endif NOCC
560: #endif PDP
561: C
562: CALL RSPEAK(478+K)
563: C !HOW MUCH MORE?
564: IF(DEATHS.NE.0) CALL RSPEAK(482+DEATHS)
565: C !HOW MANY DEATHS?
566: RETURN
567: C SVERBS, PAGE 7
568: C
569: C V95-- INCANT
570: C
571: 26000 DO 26100 I=1,6
572: C !SET UP PARSE.
573: PP1(I)=' '
574: PP2(I)=' '
575: 26100 CONTINUE
576: WP=1
577: C !WORD POINTER.
578: CP=1
579: C !CHAR POINTER.
580: IF(PRSCON.LE.1) GO TO 26300
581: DO 26200 I=PRSCON,INLNT
582: C !PARSE INPUT
583: IF(INBUF(I).EQ.',') GO TO 26300
584: C !END OF PHRASE?
585: IF(INBUF(I).NE.' ') GO TO 26150
586: C !SPACE?
587: IF(CP.NE.1) WP=WP+1
588: CP=1
589: GO TO 26200
590: 26150 IF(WP.EQ.1) PP1(CP)=INBUF(I)
591: C !STUFF INTO HOLDER.
592: IF(WP.EQ.2) PP2(CP)=INBUF(I)
593: CP=MIN0(CP+1,6)
594: 26200 CONTINUE
595: C
596: 26300 PRSCON=1
597: C !KILL REST OF LINE.
598: IF(PP1(1).NE.' ') GO TO 26400
599: C !ANY INPUT?
600: CALL RSPEAK(856)
601: C !NO, HO HUM.
602: RETURN
603: C
604: 26400 CALL ENCRYP(PP1,CH)
605: C !COMPUTE RESPONSE.
606: IF(PP2(1).NE.' ') GO TO 26600
607: C !TWO PHRASES?
608: C
609: IF(SPELLF) GO TO 26550
610: C !HE'S TRYING TO LEARN.
611: IF(and(RFLAG(TSTRS),RSEEN).EQ.0) GO TO 26575
612: SPELLF=.TRUE.
613: C !TELL HIM.
614: TELFLG=.TRUE.
615: #ifdef PDP
616: call voice(PP1,CH)
617: #else
618: WRITE(OUTCH,26510) PP1,CH
619: #ifdef NOCC
620: 26510 FORMAT('A hollow voice replies: "',6A1,1X,6A1,'".')
621: #else NOCC
622: 26510 FORMAT(' A hollow voice replies: "',6A1,1X,6A1,'".')
623: #endif NOCC
624: #endif PDP
625: C
626: RETURN
627: C
628: 26550 CALL RSPEAK(857)
629: C !HE'S GOT ONE ALREADY.
630: RETURN
631: C
632: 26575 CALL RSPEAK(858)
633: C !HE'S NOT IN ENDGAME.
634: RETURN
635: C
636: 26600 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
639: C !WRONG.
640: 26700 CONTINUE
641: SPELLF=.TRUE.
642: C !IT WORKS.
643: CALL RSPEAK(859)
644: CTICK(CEVSTE)=1
645: C !FORCE START.
646: RETURN
647: C
648: 26800 CALL RSPEAK(855)
649: C !TOO LATE.
650: RETURN
651: C SVERBS, PAGE 8
652: C
653: C V96-- ANSWER
654: C
655: 27000 IF((PRSCON.GT.1).AND.
656: & (HERE.EQ.FDOOR).AND.INQSTF)
657: & GO TO 27100
658: CALL RSPEAK(799)
659: C !NO ONE LISTENS.
660: PRSCON=1
661: RETURN
662: C
663: 27100 K=1
664: C !POINTER INTO ANSSTR.
665: DO 27300 J=1,28,2
666: C !CHECK ANSWERS.
667: NEWK=K+ANSWER(J+1)
668: C !COMPUTE NEXT K.
669: IF(QUESNO.NE.ANSWER(J)) GO TO 27300
670: C !ONLY CHECK PROPER ANS.
671: I=PRSCON-1
672: C !SCAN ANSWER.
673: DO 27200 L=K,NEWK-1
674: 27150 I=I+1
675: C !SKIP INPUT BLANKS.
676: IF(I.GT.INLNT) GO TO 27300
677: C !END OF INPUT? LOSE.
678: IF(INBUF(I).EQ.' ') GO TO 27150
679: IF(INBUF(I).NE.ANSSTR(L)) GO TO 27300
680: 27200 CONTINUE
681: GO TO 27500
682: C !RIGHT ANSWER.
683: 27300 K=NEWK
684: C
685: PRSCON=1
686: C !KILL REST OF LINE.
687: NQATT=NQATT+1
688: C !WRONG, CRETIN.
689: IF(NQATT.GE.5) GO TO 27400
690: C !TOO MANY WRONG?
691: CALL RSPEAK(800+NQATT)
692: C !NO, TRY AGAIN.
693: RETURN
694: C
695: 27400 CALL RSPEAK(826)
696: C !ALL OVER.
697: CFLAG(CEVINQ)=.FALSE.
698: C !LOSE.
699: RETURN
700: C
701: 27500 PRSCON=1
702: C !KILL REST OF LINE.
703: CORRCT=CORRCT+1
704: C !GOT IT RIGHT.
705: CALL RSPEAK(800)
706: C !HOORAY.
707: IF(CORRCT.GE.3) GO TO 27600
708: C !WON TOTALLY?
709: CTICK(CEVINQ)=2
710: C !NO, START AGAIN.
711: QUESNO=MOD(QUESNO+3,8)
712: NQATT=0
713: CALL RSPEAK(769)
714: C !ASK NEXT QUESTION.
715: CALL RSPEAK(770+QUESNO)
716: RETURN
717: C
718: 27600 CALL RSPEAK(827)
719: C !QUIZ OVER,
720: CFLAG(CEVINQ)=.FALSE.
721: OFLAG2(QDOOR)=or(OFLAG2(QDOOR),OPENBT)
722: RETURN
723: C
724: END
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.