1 /* SVERBS- SIMPLE VERBS PROCESSOR */
2 /* ALL VERBS IN THIS ROUTINE MUST BE INDEPENDANT */
3 /* OF OBJECT ACTIONS */
4
5 /*COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142*/
6 /* ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED */
7 /* WRITTEN BY R. M. SUPNIK */
8
9 #include <stdio.h>
10 #include "funcs.h"
11 #include "vars.h"
12
sverbs_(ri)13 logical sverbs_(ri)
14 integer ri;
15 {
16 /* Initialized data */
17
18 const integer mxnop = 39;
19 const integer mxjoke = 64;
20 static const integer jokes[25] = { 4,5,3,304,305,306,307,308,309,310,311,
21 312,313,5314,5319,324,325,883,884,120,120,0,0,0,0 };
22 static const integer answer[14] = { 0,1,2,3,4,4,4,4,5,5,5,6,7,7};
23 static const char * const ansstr[14] =
24 { "TEMPLE", "FOREST", "30003", "FLASK", "RUB", "FONDLE",
25 "CARRES", "TOUCH", "BONES", "BODY", "SKELE", "RUSTYKNIFE",
26 "NONE", "NOWHER" };
27
28 /* System generated locals */
29 integer i__1, i__2;
30 logical ret_val;
31
32 /* Local variables */
33 logical f;
34 const char *z, *z2;
35 integer i, j;
36 integer k;
37 integer l;
38 char ch[1*6];
39 integer cp, wp;
40 char pp1[1*6], pp2[1*6];
41 integer odi2 = 0, odo2 = 0;
42
43 ret_val = TRUE_;
44 /* !ASSUME WINS. */
45 if (prsvec_1.prso != 0) {
46 odo2 = objcts_1.odesc2[prsvec_1.prso - 1];
47 }
48 /* !SET UP DESCRIPTORS. */
49 if (prsvec_1.prsi != 0) {
50 odi2 = objcts_1.odesc2[prsvec_1.prsi - 1];
51 }
52
53 if (ri == 0) {
54 bug_(7, ri);
55 }
56 /* !ZERO IS VERBOTEN. */
57 if (ri <= mxnop) {
58 return ret_val;
59 }
60 /* !NOP? */
61 if (ri <= mxjoke) {
62 goto L100;
63 }
64 /* !JOKE? */
65 switch (ri - mxjoke) {
66 case 1: goto L65000;
67 case 2: goto L66000;
68 case 3: goto L67000;
69 case 4: goto L68000;
70 case 5: goto L69000;
71 case 6: goto L1000;
72 case 7: goto L2000;
73 case 8: goto L3000;
74 case 9: goto L4000;
75 case 10: goto L5000;
76 case 11: goto L6000;
77 case 12: goto L7000;
78 case 13: goto L8000;
79 case 14: goto L9000;
80 case 15: goto L10000;
81 case 16: goto L11000;
82 case 17: goto L12000;
83 case 18: goto L13000;
84 case 19: goto L14000;
85 case 20: goto L15000;
86 case 21: goto L16000;
87 case 22: goto L17000;
88 case 23: goto L18000;
89 case 24: goto L19000;
90 case 25: goto L20000;
91 case 26: goto L21000;
92 case 27: goto L22000;
93 case 28: goto L23000;
94 case 29: goto L24000;
95 case 30: goto L25000;
96 case 31: goto L26000;
97 case 32: goto L27000;
98 }
99 bug_(7, ri);
100
101 /* ALL VERB PROCESSORS RETURN HERE TO DECLARE FAILURE. */
102
103 /* L10: */
104 ret_val = FALSE_;
105 /* !LOSE. */
106 return ret_val;
107
108 /* JOKE PROCESSOR. */
109 /* FIND PROPER ENTRY IN JOKES, USE IT TO SELECT STRING TO PRINT. */
110
111 L100:
112 i = jokes[ri - mxnop - 1];
113 /* !GET TABLE ENTRY. */
114 j = i / 1000;
115 /* !ISOLATE # STRINGS. */
116 if (j != 0) {
117 i = i % 1000 + rnd_(j);
118 }
119 /* !IF RANDOM, CHOOSE. */
120 rspeak_(i);
121 /* !PRINT JOKE. */
122 return ret_val;
123 /* SVERBS, PAGE 2A */
124
125 /* V65-- ROOM */
126
127 L65000:
128 ret_val = rmdesc_(2);
129 /* !DESCRIBE ROOM ONLY. */
130 return ret_val;
131
132 /* V66-- OBJECTS */
133
134 L66000:
135 ret_val = rmdesc_(1);
136 /* !DESCRIBE OBJ ONLY. */
137 if (! play_1.telflg) {
138 rspeak_(138);
139 }
140 /* !NO OBJECTS. */
141 return ret_val;
142
143 /* V67-- RNAME */
144
145 L67000:
146 i__1 = rooms_1.rdesc2[play_1.here - 1];
147 rspeak_(i__1);
148 /* !SHORT ROOM NAME. */
149 return ret_val;
150
151 /* V68-- RESERVED */
152
153 L68000:
154 return ret_val;
155
156 /* V69-- RESERVED */
157
158 L69000:
159 return ret_val;
160 /* SVERBS, PAGE 3 */
161
162 /* V70-- BRIEF. SET FLAG. */
163
164 L1000:
165 findex_1.brieff = TRUE_;
166 /* !BRIEF DESCRIPTIONS. */
167 findex_1.superf = FALSE_;
168 rspeak_(326);
169 return ret_val;
170
171 /* V71-- VERBOSE. CLEAR FLAGS. */
172
173 L2000:
174 findex_1.brieff = FALSE_;
175 /* !LONG DESCRIPTIONS. */
176 findex_1.superf = FALSE_;
177 rspeak_(327);
178 return ret_val;
179
180 /* V72-- SUPERBRIEF. SET FLAG. */
181
182 L3000:
183 findex_1.superf = TRUE_;
184 rspeak_(328);
185 return ret_val;
186
187 /* V73-- STAY (USED IN ENDGAME). */
188
189 L4000:
190 if (play_1.winner != aindex_1.amastr) {
191 goto L4100;
192 }
193 /* !TELL MASTER, STAY. */
194 rspeak_(781);
195 /* !HE DOES. */
196 cevent_1.ctick[cindex_1.cevfol - 1] = 0;
197 /* !NOT FOLLOWING. */
198 return ret_val;
199
200 L4100:
201 if (play_1.winner == aindex_1.player) {
202 rspeak_(664);
203 }
204 /* !JOKE. */
205 return ret_val;
206
207 /* V74-- VERSION. PRINT INFO. */
208
209 L5000:
210 more_output(NULL);
211 printf("V%1d.%1d%c\n", vers_1.vmaj, vers_1.vmin, vers_1.vedit);
212 play_1.telflg = TRUE_;
213 return ret_val;
214
215 /* V75-- SWIM. ALWAYS A JOKE. */
216
217 L6000:
218 i = 330;
219 /* !ASSUME WATER. */
220 if ((rooms_1.rflag[play_1.here - 1] & RWATER + RFILL) ==
221 0) {
222 i = rnd_(3) + 331;
223 }
224 rspeak_(i);
225 return ret_val;
226
227 /* V76-- GERONIMO. IF IN BARREL, FATAL, ELSE JOKE. */
228
229 L7000:
230 if (play_1.here == rindex_1.mbarr) {
231 goto L7100;
232 }
233 /* !IN BARREL? */
234 rspeak_(334);
235 /* !NO, JOKE. */
236 return ret_val;
237
238 L7100:
239 jigsup_(335);
240 /* !OVER FALLS. */
241 return ret_val;
242
243 /* V77-- SINBAD ET AL. CHASE CYCLOPS, ELSE JOKE. */
244
245 L8000:
246 if (play_1.here == rindex_1.mcycl && qhere_(oindex_1.cyclo, play_1.here)
247 ) {
248 goto L8100;
249 }
250 rspeak_(336);
251 /* !NOT HERE, JOKE. */
252 return ret_val;
253
254 L8100:
255 newsta_(oindex_1.cyclo, 337, 0, 0, 0);
256 /* !CYCLOPS FLEES. */
257 findex_1.cyclof = TRUE_;
258 /* !SET ALL FLAGS. */
259 findex_1.magicf = TRUE_;
260 objcts_1.oflag2[oindex_1.cyclo - 1] &= ~ FITEBT;
261 return ret_val;
262
263 /* V78-- WELL. OPEN DOOR, ELSE JOKE. */
264
265 L9000:
266 if (findex_1.riddlf || play_1.here != rindex_1.riddl) {
267 goto L9100;
268 }
269 /* !IN RIDDLE ROOM? */
270 findex_1.riddlf = TRUE_;
271 /* !YES, SOLVED IT. */
272 rspeak_(338);
273 return ret_val;
274
275 L9100:
276 rspeak_(339);
277 /* !WELL, WHAT? */
278 return ret_val;
279
280 /* V79-- PRAY. IF IN TEMP2, POOF */
281 /* ! */
282
283 L10000:
284 if (play_1.here != rindex_1.temp2) {
285 goto L10050;
286 }
287 /* !IN TEMPLE? */
288 if (moveto_(rindex_1.fore1, play_1.winner)) {
289 goto L10100;
290 }
291 /* !FORE1 STILL THERE? */
292 L10050:
293 rspeak_(340);
294 /* !JOKE. */
295 return ret_val;
296
297 L10100:
298 f = rmdesc_(3);
299 /* !MOVED, DESCRIBE. */
300 return ret_val;
301
302 /* V80-- TREASURE. IF IN TEMP1, POOF */
303 /* ! */
304
305 L11000:
306 if (play_1.here != rindex_1.temp1) {
307 goto L11050;
308 }
309 /* !IN TEMPLE? */
310 if (moveto_(rindex_1.treas, play_1.winner)) {
311 goto L10100;
312 }
313 /* !TREASURE ROOM THERE? */
314 L11050:
315 rspeak_(341);
316 /* !NOTHING HAPPENS. */
317 return ret_val;
318
319 /* V81-- TEMPLE. IF IN TREAS, POOF */
320 /* ! */
321
322 L12000:
323 if (play_1.here != rindex_1.treas) {
324 goto L12050;
325 }
326 /* !IN TREASURE? */
327 if (moveto_(rindex_1.temp1, play_1.winner)) {
328 goto L10100;
329 }
330 /* !TEMP1 STILL THERE? */
331 L12050:
332 rspeak_(341);
333 /* !NOTHING HAPPENS. */
334 return ret_val;
335
336 /* V82-- BLAST. USUALLY A JOKE. */
337
338 L13000:
339 i = 342;
340 /* !DONT UNDERSTAND. */
341 if (prsvec_1.prso == oindex_1.safe) {
342 i = 252;
343 }
344 /* !JOKE FOR SAFE. */
345 rspeak_(i);
346 return ret_val;
347
348 /* V83-- SCORE. PRINT SCORE. */
349
350 L14000:
351 score_(0);
352 return ret_val;
353
354 /* V84-- QUIT. FINISH OUT THE GAME. */
355
356 L15000:
357 score_(1);
358 /* !TELLL SCORE. */
359 if (! yesno_(343, 0, 0)) {
360 return ret_val;
361 }
362 /* !ASK FOR Y/N DECISION. */
363 exit_();
364 /* !BYE. */
365 /* SVERBS, PAGE 4 */
366
367 /* V85-- FOLLOW (USED IN ENDGAME) */
368
369 L16000:
370 if (play_1.winner != aindex_1.amastr) {
371 return ret_val;
372 }
373 /* !TELL MASTER, FOLLOW. */
374 rspeak_(782);
375 cevent_1.ctick[cindex_1.cevfol - 1] = -1;
376 /* !STARTS FOLLOWING. */
377 return ret_val;
378
379 /* V86-- WALK THROUGH */
380
381 L17000:
382 if (screen_1.scolrm == 0 || prsvec_1.prso != oindex_1.scol && (
383 prsvec_1.prso != oindex_1.wnort || play_1.here != rindex_1.bkbox))
384 {
385 goto L17100;
386 }
387 screen_1.scolac = screen_1.scolrm;
388 /* !WALKED THRU SCOL. */
389 prsvec_1.prso = 0;
390 /* !FAKE OUT FROMDR. */
391 cevent_1.ctick[cindex_1.cevscl - 1] = 6;
392 /* !START ALARM. */
393 rspeak_(668);
394 /* !DISORIENT HIM. */
395 f = moveto_(screen_1.scolrm, play_1.winner);
396 /* !INTO ROOM. */
397 f = rmdesc_(3);
398 /* !DESCRIBE. */
399 return ret_val;
400
401 L17100:
402 if (play_1.here != screen_1.scolac) {
403 goto L17300;
404 }
405 /* !ON OTHER SIDE OF SCOL? */
406 for (i = 1; i <= 12; i += 3) {
407 /* !WALK THRU PROPER WALL? */
408 if (screen_1.scolwl[i - 1] == play_1.here && screen_1.scolwl[i] ==
409 prsvec_1.prso) {
410 goto L17500;
411 }
412 /* L17200: */
413 }
414
415 L17300:
416 if ((objcts_1.oflag1[prsvec_1.prso - 1] & TAKEBT) != 0) {
417 goto L17400;
418 }
419 i = 669;
420 /* !NO, JOKE. */
421 if (prsvec_1.prso == oindex_1.scol) {
422 i = 670;
423 }
424 /* !SPECIAL JOKE FOR SCOL. */
425 rspsub_(i, odo2);
426 return ret_val;
427
428 L17400:
429 i = 671;
430 /* !JOKE. */
431 if (objcts_1.oroom[prsvec_1.prso - 1] != 0) {
432 i = rnd_(5) + 552;
433 }
434 /* !SPECIAL JOKES IF CARRY. */
435 rspeak_(i);
436 return ret_val;
437
438 L17500:
439 prsvec_1.prso = screen_1.scolwl[i + 1];
440 /* !THRU SCOL WALL... */
441 for (i = 1; i <= 8; i += 2) {
442 /* !FIND MATCHING ROOM. */
443 if (prsvec_1.prso == screen_1.scoldr[i - 1]) {
444 screen_1.scolrm = screen_1.scoldr[i];
445 }
446 /* L17600: */
447 }
448 /* !DECLARE NEW SCOLRM. */
449 cevent_1.ctick[cindex_1.cevscl - 1] = 0;
450 /* !CANCEL ALARM. */
451 rspeak_(668);
452 /* !DISORIENT HIM. */
453 f = moveto_(rindex_1.bkbox, play_1.winner);
454 /* !BACK IN BOX ROOM. */
455 f = rmdesc_(3);
456 return ret_val;
457
458 /* V87-- RING. A JOKE. */
459
460 L18000:
461 i = 359;
462 /* !CANT RING. */
463 if (prsvec_1.prso == oindex_1.bell) {
464 i = 360;
465 }
466 /* !DING, DONG. */
467 rspeak_(i);
468 /* !JOKE. */
469 return ret_val;
470
471 /* V88-- BRUSH. JOKE WITH OBSCURE TRAP. */
472
473 L19000:
474 if (prsvec_1.prso == oindex_1.teeth) {
475 goto L19100;
476 }
477 /* !BRUSH TEETH? */
478 rspeak_(362);
479 /* !NO, JOKE. */
480 return ret_val;
481
482 L19100:
483 if (prsvec_1.prsi != 0) {
484 goto L19200;
485 }
486 /* !WITH SOMETHING? */
487 rspeak_(363);
488 /* !NO, JOKE. */
489 return ret_val;
490
491 L19200:
492 if (prsvec_1.prsi == oindex_1.putty && objcts_1.oadv[oindex_1.putty - 1]
493 == play_1.winner) {
494 goto L19300;
495 }
496 rspsub_(364, odi2);
497 /* !NO, JOKE. */
498 return ret_val;
499
500 L19300:
501 jigsup_(365);
502 /* !YES, DEAD */
503 /* ! */
504 /* ! */
505 /* ! */
506 /* ! */
507 /* ! */
508 return ret_val;
509 /* SVERBS, PAGE 5 */
510
511 /* V89-- DIG. UNLESS SHOVEL, A JOKE. */
512
513 L20000:
514 if (prsvec_1.prso == oindex_1.shove) {
515 return ret_val;
516 }
517 /* !SHOVEL? */
518 i = 392;
519 /* !ASSUME TOOL. */
520 if ((objcts_1.oflag1[prsvec_1.prso - 1] & TOOLBT) == 0) {
521 i = 393;
522 }
523 rspsub_(i, odo2);
524 return ret_val;
525
526 /* V90-- TIME. PRINT OUT DURATION OF GAME. */
527
528 L21000:
529 gttime_(&k);
530 /* !GET PLAY TIME. */
531 i = k / 60;
532 j = k % 60;
533
534 more_output(NULL);
535 printf("You have been playing Dungeon for ");
536 if (i >= 1) {
537 printf("%d hour", i);
538 if (i >= 2)
539 printf("s");
540 printf(" and ");
541 }
542 printf("%d minute", j);
543 if (j != 1)
544 printf("s");
545 printf(".\n");
546 play_1.telflg = TRUE_;
547 return ret_val;
548
549
550 /* V91-- LEAP. USUALLY A JOKE, WITH A CATCH. */
551
552 L22000:
553 if (prsvec_1.prso == 0) {
554 goto L22200;
555 }
556 /* !OVER SOMETHING? */
557 if (qhere_(prsvec_1.prso, play_1.here)) {
558 goto L22100;
559 }
560 /* !HERE? */
561 rspeak_(447);
562 /* !NO, JOKE. */
563 return ret_val;
564
565 L22100:
566 if ((objcts_1.oflag2[prsvec_1.prso - 1] & VILLBT) == 0) {
567 goto L22300;
568 }
569 rspsub_(448, odo2);
570 /* !CANT JUMP VILLAIN. */
571 return ret_val;
572
573 L22200:
574 if (! findxt_(xsrch_1.xdown, play_1.here)) {
575 goto L22300;
576 }
577 /* !DOWN EXIT? */
578 if (curxt_1.xtype == xpars_1.xno || curxt_1.xtype == xpars_1.xcond && !
579 flags[*xflag - 1]) {
580 goto L22400;
581 }
582 L22300:
583 i__1 = rnd_(5) + 314;
584 rspeak_(i__1);
585 /* !WHEEEE */
586 /* ! */
587 return ret_val;
588
589 L22400:
590 i__1 = rnd_(4) + 449;
591 jigsup_(i__1);
592 /* !FATAL LEAP. */
593 return ret_val;
594 /* SVERBS, PAGE 6 */
595
596 /* V92-- LOCK. */
597
598 L23000:
599 if (prsvec_1.prso == oindex_1.grate && play_1.here == rindex_1.mgrat) {
600 goto L23200;
601 }
602 L23100:
603 rspeak_(464);
604 /* !NOT LOCK GRATE. */
605 return ret_val;
606
607 L23200:
608 findex_1.grunlf = FALSE_;
609 /* !GRATE NOW LOCKED. */
610 rspeak_(214);
611 exits_1.travel[rooms_1.rexit[play_1.here - 1]] = 214;
612 /* !CHANGE EXIT STATUS. */
613 return ret_val;
614
615 /* V93-- UNLOCK */
616
617 L24000:
618 if (prsvec_1.prso != oindex_1.grate || play_1.here != rindex_1.mgrat) {
619 goto L23100;
620 }
621 if (prsvec_1.prsi == oindex_1.keys) {
622 goto L24200;
623 }
624 /* !GOT KEYS? */
625 rspsub_(465, odi2);
626 /* !NO, JOKE. */
627 return ret_val;
628
629 L24200:
630 findex_1.grunlf = TRUE_;
631 /* !UNLOCK GRATE. */
632 rspeak_(217);
633 exits_1.travel[rooms_1.rexit[play_1.here - 1]] = 217;
634 /* !CHANGE EXIT STATUS. */
635 return ret_val;
636
637 /* V94-- DIAGNOSE. */
638
639 L25000:
640 i = fights_(play_1.winner, 0);
641 /* !GET FIGHTS STRENGTH. */
642 j = advs_1.astren[play_1.winner - 1];
643 /* !GET HEALTH. */
644 /* Computing MIN */
645 i__1 = i + j;
646 k = min(i__1,4);
647 /* !GET STATE. */
648 if (! cevent_1.cflag[cindex_1.cevcur - 1]) {
649 j = 0;
650 }
651 /* !IF NO WOUNDS. */
652 /* Computing MIN */
653 i__1 = 4, i__2 = abs(j);
654 l = min(i__1,i__2);
655 /* !SCALE. */
656 i__1 = l + 473;
657 rspeak_(i__1);
658 /* !DESCRIBE HEALTH. */
659 i = (-j - 1) * 30 + cevent_1.ctick[cindex_1.cevcur - 1];
660 /* !COMPUTE WAIT. */
661
662 if (j != 0) {
663 more_output(NULL);
664 printf("You will be cured after %d moves.\n", i);
665 }
666
667 i__1 = k + 478;
668 rspeak_(i__1);
669 /* !HOW MUCH MORE? */
670 if (state_1.deaths != 0) {
671 i__1 = state_1.deaths + 482;
672 rspeak_(i__1);
673 }
674 /* !HOW MANY DEATHS? */
675 return ret_val;
676 /* SVERBS, PAGE 7 */
677
678 /* V95-- INCANT */
679
680 L26000:
681 for (i = 1; i <= 6; ++i) {
682 /* !SET UP PARSE. */
683 pp1[i - 1] = ' ';
684 pp2[i - 1] = ' ';
685 /* L26100: */
686 }
687 wp = 1;
688 /* !WORD POINTER. */
689 cp = 1;
690 /* !CHAR POINTER. */
691 if (prsvec_1.prscon <= 1) {
692 goto L26300;
693 }
694 for (z = input_1.inbuf + prsvec_1.prscon - 1; *z != '\0'; ++z) {
695 /* !PARSE INPUT */
696 if (*z == ',')
697 goto L26300;
698 /* !END OF PHRASE? */
699 if (*z != ' ')
700 goto L26150;
701 /* !SPACE? */
702 if (cp != 1) {
703 ++wp;
704 }
705 cp = 1;
706 goto L26200;
707 L26150:
708 if (wp == 1) {
709 pp1[cp - 1] = *z;
710 }
711 /* !STUFF INTO HOLDER. */
712 if (wp == 2) {
713 pp2[cp - 1] = *z;
714 }
715 /* Computing MIN */
716 i__2 = cp + 1;
717 cp = min(i__2,6);
718 L26200:
719 ;
720 }
721
722 L26300:
723 prsvec_1.prscon = 1;
724 /* !KILL REST OF LINE. */
725 if (pp1[0] != ' ') {
726 goto L26400;
727 }
728 /* !ANY INPUT? */
729 rspeak_(856);
730 /* !NO, HO HUM. */
731 return ret_val;
732
733 L26400:
734 encryp_(pp1, ch);
735 /* !COMPUTE RESPONSE. */
736 if (pp2[0] != ' ') {
737 goto L26600;
738 }
739 /* !TWO PHRASES? */
740
741 if (findex_1.spellf) {
742 goto L26550;
743 }
744 /* !HE'S TRYING TO LEARN. */
745 if ((rooms_1.rflag[rindex_1.tstrs - 1] & RSEEN) == 0) {
746 goto L26575;
747 }
748 findex_1.spellf = TRUE_;
749 /* !TELL HIM. */
750 play_1.telflg = TRUE_;
751 more_output(NULL);
752 printf("A hollow voice replies: \"%.6s %.6s\".\n", pp1, ch);
753
754 return ret_val;
755
756 L26550:
757 rspeak_(857);
758 /* !HE'S GOT ONE ALREADY. */
759 return ret_val;
760
761 L26575:
762 rspeak_(858);
763 /* !HE'S NOT IN ENDGAME. */
764 return ret_val;
765
766 L26600:
767 if ((rooms_1.rflag[rindex_1.tstrs - 1] & RSEEN) != 0) {
768 goto L26800;
769 }
770 for (i = 1; i <= 6; ++i) {
771 if (pp2[i - 1] != ch[i - 1]) {
772 goto L26575;
773 }
774 /* !WRONG. */
775 /* L26700: */
776 }
777 findex_1.spellf = TRUE_;
778 /* !IT WORKS. */
779 rspeak_(859);
780 cevent_1.ctick[cindex_1.cevste - 1] = 1;
781 /* !FORCE START. */
782 return ret_val;
783
784 L26800:
785 rspeak_(855);
786 /* !TOO LATE. */
787 return ret_val;
788 /* SVERBS, PAGE 8 */
789
790 /* V96-- ANSWER */
791
792 L27000:
793 if (prsvec_1.prscon > 1 && play_1.here == rindex_1.fdoor &&
794 findex_1.inqstf) {
795 goto L27100;
796 }
797 rspeak_(799);
798 /* !NO ONE LISTENS. */
799 prsvec_1.prscon = 1;
800 return ret_val;
801
802 L27100:
803 for (j = 1; j <= 14; j ++) {
804 /* !CHECK ANSWERS. */
805 if (findex_1.quesno != answer[j - 1])
806 goto L27300;
807 /* !ONLY CHECK PROPER ANS. */
808 z = ansstr[j - 1];
809 z2 = input_1.inbuf + prsvec_1.prscon - 1;
810 while (*z != '\0') {
811 while (*z2 == ' ')
812 z2++;
813 /* !STRIP INPUT BLANKS. */
814 if (*z++ != *z2++)
815 goto L27300;
816 }
817 goto L27500;
818 /* !RIGHT ANSWER. */
819 L27300:
820 ;
821 }
822
823 prsvec_1.prscon = 1;
824 /* !KILL REST OF LINE. */
825 ++findex_1.nqatt;
826 /* !WRONG, CRETIN. */
827 if (findex_1.nqatt >= 5) {
828 goto L27400;
829 }
830 /* !TOO MANY WRONG? */
831 i__1 = findex_1.nqatt + 800;
832 rspeak_(i__1);
833 /* !NO, TRY AGAIN. */
834 return ret_val;
835
836 L27400:
837 rspeak_(826);
838 /* !ALL OVER. */
839 cevent_1.cflag[cindex_1.cevinq - 1] = FALSE_;
840 /* !LOSE. */
841 return ret_val;
842
843 L27500:
844 prsvec_1.prscon = 1;
845 /* !KILL REST OF LINE. */
846 ++findex_1.corrct;
847 /* !GOT IT RIGHT. */
848 rspeak_(800);
849 /* !HOORAY. */
850 if (findex_1.corrct >= 3) {
851 goto L27600;
852 }
853 /* !WON TOTALLY? */
854 cevent_1.ctick[cindex_1.cevinq - 1] = 2;
855 /* !NO, START AGAIN. */
856 findex_1.quesno = (findex_1.quesno + 3) % 8;
857 findex_1.nqatt = 0;
858 rspeak_(769);
859 /* !ASK NEXT QUESTION. */
860 i__1 = findex_1.quesno + 770;
861 rspeak_(i__1);
862 return ret_val;
863
864 L27600:
865 rspeak_(827);
866 /* !QUIZ OVER, */
867 cevent_1.cflag[cindex_1.cevinq - 1] = FALSE_;
868 objcts_1.oflag2[oindex_1.qdoor - 1] |= OPENBT;
869 return ret_val;
870
871 } /* sverbs_ */
872