1 /* Verb processors for DUNGEON */
2 
3 /* COPYRIGHT 1980, 1990, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. */
4 /* ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED */
5 /* WRITTEN BY R. M. SUPNIK */
6 /* Translated from Fortran to C by Andrew Plotkin <erkyrath@netcom.com>
7    on 10/4/98. */
8 
9 /* 1-Oct-94      RMS     Fixed bugs in ANSWER, INCANT, UNTIE FROM, FILL, */
10 /*                       GIVE, SHAKE, PLAY, POUR, POUR ON, TAKE, SPIN, BURN, */
11 /*                       ALARM, collectives, subcripting. */
12 /*                       Added COUNT, Puzzle Room entrance test. */
13 /* 11-Feb-94     RMS     Fixed bug in chimney load calculation. */
14 /* 30-Jan-94     RMS     Fixed bugs from MS DOS port. */
15 /* 27-Jan-94     RMS     Fixed portability problem in answer array. */
16 /* 25-Jan-94     RMS     Fixed bug in DIG not with shovel. */
17 /* 09-Jul-92     RMS     Fixed subscript range error. */
18 /* 01-Jul-92     RMS     Removed extraneous function from TAKE. */
19 /* 30-Jun-92     RMS     Changed file names to lower case. */
20 
21 #include "glk.h"
22 #include "miscfort.h"
23 #include "funcs.h"
24 #include "commons.h"
25 
26 /* VAPPLI- Main verb processing routine */
27 
28 /* Declarations */
29 
vappli_(integer * ri)30 logical vappli_(integer *ri)
31 {
32     /* Initialized data */
33 
34     static integer jokes[25] = { 4,5,3,304,305,306,307,308,309,310,311,312,
35         313,5314,5319,324,325,883,884,120,120,0,0,0,0 };
36     static integer answer[16] = { 0,1,2,2,3,4,4,4,4,4,5,5,5,6,7,7 };
37     static char ansstr[12*16] = "TEMPLE      " "FOREST      " "30003       "
38         "30,003      " "FLASK       " "RUB         " "FONDLE      " "CAR"
39         "ESS      " "FEEL        " "TOUCH       " "BONES       " "BODY   "
40         "     " "SKELETON    " "RUSTY KNIFE " "NONE        " "NOWHERE     "
41         ;
42 
43     /* System generated locals */
44     integer i__1, i__2, i__3;
45     logical ret_val;
46 
47     /* Local variables */
48     logical waslit;
49     logical f;
50     char pw[8*2], ch[8], ch2[8];
51     integer av, i__, j;
52     integer x;
53     integer rmk;
54     integer melee;
55     integer k;
56     integer l, wp, cp;
57     integer odo2, odi2;
58 
59 /* Functions and data */
60 
61 /* VAPPLI, PAGE 2 */
62 
63     ret_val = TRUE_;
64 /* assume wins. */
65     odo2 = 0;
66     odi2 = 0;
67     if (prsvec_1.prso != 0 && prsvec_1.prso <= 300) {
68         odo2 = objcts_1.odesc2[prsvec_1.prso - 1];
69     }
70     if (prsvec_1.prsi != 0) {
71         odi2 = objcts_1.odesc2[prsvec_1.prsi - 1];
72     }
73 /* set up descriptors. */
74     av = advs_1.avehic[play_1.winner - 1];
75 /* (PRSO can be direction */
76     rmk = rnd_(&c__6) + 372;
77 /* remark for hack-hacks. */
78     if (*ri == 0) {
79         goto L10;
80     }
81 /* zero is false. */
82     if (*ri <= 39) {
83         return ret_val;
84     }
85 /* nop? */
86     if (*ri <= 64) {
87         goto L20;
88     }
89 /* joke? */
90     if (*ri <= 99) {
91         goto L30;
92     }
93 /* simple verb? */
94     waslit = lit_(&play_1.here);
95     switch (*ri - 99) {
96         case 1:  goto L500;
97         case 2:  goto L1000;
98         case 3:  goto L2000;
99         case 4:  goto L3000;
100         case 5:  goto L4000;
101         case 6:  goto L5000;
102         case 7:  goto L6000;
103         case 8:  goto L7000;
104         case 9:  goto L8000;
105         case 10:  goto L9000;
106         case 11:  goto L10000;
107         case 12:  goto L11000;
108         case 13:  goto L12000;
109         case 14:  goto L13000;
110         case 15:  goto L14000;
111         case 16:  goto L15000;
112         case 17:  goto L16000;
113         case 18:  goto L17000;
114         case 19:  goto L18000;
115         case 20:  goto L19000;
116         case 21:  goto L20000;
117         case 22:  goto L21000;
118         case 23:  goto L22000;
119         case 24:  goto L23000;
120         case 25:  goto L24000;
121         case 26:  goto L25000;
122         case 27:  goto L26000;
123         case 28:  goto L27000;
124         case 29:  goto L28000;
125         case 30:  goto L29000;
126         case 31:  goto L30000;
127         case 32:  goto L31000;
128         case 33:  goto L32000;
129         case 34:  goto L33000;
130         case 35:  goto L34000;
131         case 36:  goto L35000;
132         case 37:  goto L36000;
133         case 38:  goto L37000;
134         case 39:  goto L38000;
135         case 40:  goto L39000;
136         case 41:  goto L40000;
137         case 42:  goto L41000;
138         case 43:  goto L42000;
139         case 44:  goto L43000;
140         case 45:  goto L44000;
141         case 46:  goto L45000;
142         case 47:  goto L46000;
143         case 48:  goto L47000;
144         case 49:  goto L48000;
145         case 50:  goto L49000;
146         case 51:  goto L50000;
147         case 52:  goto L51000;
148         case 53:  goto L52000;
149         case 54:  goto L53000;
150         case 55:  goto L54000;
151         case 56:  goto L55000;
152         case 57:  goto L56000;
153         case 58:  goto L57000;
154         case 59:  goto L58000;
155         case 60:  goto L59000;
156         case 61:  goto L60000;
157         case 62:  goto L61000;
158         case 63:  goto L62000;
159         case 64:  goto L63000;
160         case 65:  goto L64000;
161         case 66:  goto L65000;
162         case 67:  goto L66000;
163         case 68:  goto L67000;
164         case 69:  goto L68000;
165         case 70:  goto L69000;
166     }
167     bug_(&c__7, ri);
168 
169 /* All verb processors return here to declare failure. */
170 
171 L10:
172     ret_val = FALSE_;
173 /* lose. */
174     return ret_val;
175 
176 /* Joke processor. */
177 /* Find proper entry in jokes, use it to select string to print. */
178 
179 L20:
180     i__ = jokes[*ri - 40];
181 /* get table entry. */
182     j = i__ / 1000;
183 /* isolate # strings. */
184     if (j != 0) {
185         i__ = i__ % 1000 + rnd_(&j);
186     }
187 /* if random, choose. */
188     rspeak_(&i__);
189 /* print joke. */
190     return ret_val;
191 
192 /* 'Simple' verbs. */
193 
194 L30:
195     switch (*ri - 64) {
196         case 1:  goto L65001;
197         case 2:  goto L66001;
198         case 3:  goto L67001;
199         case 4:  goto L68001;
200         case 5:  goto L69001;
201         case 6:  goto L70000;
202         case 7:  goto L71000;
203         case 8:  goto L72000;
204         case 9:  goto L73000;
205         case 10:  goto L74000;
206         case 11:  goto L75000;
207         case 12:  goto L76000;
208         case 13:  goto L77000;
209         case 14:  goto L78000;
210         case 15:  goto L79000;
211         case 16:  goto L80000;
212         case 17:  goto L81000;
213         case 18:  goto L82000;
214         case 19:  goto L83000;
215         case 20:  goto L84000;
216         case 21:  goto L85000;
217         case 22:  goto L86000;
218         case 23:  goto L87000;
219         case 24:  goto L88000;
220         case 25:  goto L89000;
221         case 26:  goto L90000;
222         case 27:  goto L91000;
223         case 28:  goto L92000;
224         case 29:  goto L93000;
225         case 30:  goto L94000;
226         case 31:  goto L95000;
227         case 32:  goto L96000;
228         case 33:  goto L97000;
229     }
230     bug_(&c__7, ri);
231 
232 /* Here to test for change in light. */
233 
234 L50:
235     if (waslit && ! lit_(&play_1.here)) {
236         rspeak_(&c__406);
237     }
238     return ret_val;
239 /* VAPPLI, PAGE 3 */
240 
241 /* V100--        Read */
242 
243 L500:
244     if (lit_(&play_1.here)) {
245         goto L600;
246     }
247 /* room lit? */
248     rspeak_(&c__356);
249 /* no, cant read. */
250     return ret_val;
251 
252 L600:
253     if (prsvec_1.prsi == 0) {
254         goto L700;
255     }
256 /* read through obj? */
257     if ((objcts_1.oflag1[prsvec_1.prsi - 1] & 2048) != 0) {
258         goto L700;
259     }
260     rspsub_(&c__357, &odi2);
261 /* not transparent. */
262     return ret_val;
263 
264 L700:
265     if (objact_(&x)) {
266         return ret_val;
267     }
268 /* object handle? */
269     if ((objcts_1.oflag1[prsvec_1.prso - 1] & 16384) != 0) {
270         goto L800;
271     }
272     rspsub_(&c__358, &odo2);
273 /* not readable. */
274     return ret_val;
275 
276 L800:
277     rspeak_(&objcts_1.oread[prsvec_1.prso - 1]);
278 /* print reading material */
279     return ret_val;
280 
281 /* V101--        Melt */
282 
283 L1000:
284     if (! objact_(&x)) {
285         rspsub_(&c__361, &odo2);
286     }
287     return ret_val;
288 
289 /* V102--        Inflate */
290 
291 L2000:
292     if ((objcts_1.oflag1[prsvec_1.prsi - 1] & 4) != 0) {
293         goto L2100;
294     }
295 /* tool? */
296     rspsub_(&c__301, &odi2);
297 /* no, joke. */
298     return ret_val;
299 
300 L2100:
301     if (! objact_(&x)) {
302         rspeak_(&c__368);
303     }
304 /* obj handle? */
305     return ret_val;
306 
307 /* V103--        Deflate. */
308 
309 L3000:
310     if (! objact_(&x)) {
311         rspeak_(&c__369);
312     }
313 /* obj handle? */
314     return ret_val;
315 /* VAPPLI, PAGE 4 */
316 
317 /* V104--        Alarm */
318 
319 L4000:
320     if ((objcts_1.oflag2[prsvec_1.prso - 1] & 128) != 0) {
321         goto L4100;
322     }
323 /* villain? */
324     i__1 = rnd_(&c__6) + 552;
325     rspeak_(&i__1);
326 /* no, joke. */
327     return ret_val;
328 
329 L4100:
330     if (! objact_(&x)) {
331         rspsub_(&c__370, &odo2);
332     }
333     return ret_val;
334 
335 /* V105--        Exorcise */
336 
337 L5000:
338     f = objact_(&x);
339 /* objects handle. */
340     return ret_val;
341 
342 /* V106--        Plug */
343 
344 L6000:
345     if (! objact_(&x)) {
346         rspeak_(&c__371);
347     }
348     return ret_val;
349 
350 /* V107--        Kick */
351 
352 L7000:
353     if (! objact_(&x)) {
354         rspsb2_(&c__378, &odo2, &rmk);
355     }
356     return ret_val;
357 
358 /* V108--        Wave */
359 
360 L8000:
361     if (! objact_(&x)) {
362         rspsb2_(&c__379, &odo2, &rmk);
363     }
364     return ret_val;
365 
366 /* V109,V110--   Raise, lower */
367 
368 L9000:
369 L10000:
370     if (! objact_(&x)) {
371         rspsb2_(&c__380, &odo2, &rmk);
372     }
373     return ret_val;
374 
375 /* V111--        Rub */
376 
377 L11000:
378     if (! objact_(&x)) {
379         rspsb2_(&c__381, &odo2, &rmk);
380     }
381     return ret_val;
382 
383 /* V112--        Push */
384 
385 L12000:
386     if (! objact_(&x)) {
387         rspsb2_(&c__382, &odo2, &rmk);
388     }
389     return ret_val;
390 /* VAPPLI, PAGE 5 */
391 
392 /* V113--        Untie */
393 
394 L13000:
395     if (objact_(&x)) {
396         return ret_val;
397     }
398 /* object handle? */
399     i__ = 383;
400 /* no, not tied. */
401     if ((objcts_1.oflag2[prsvec_1.prso - 1] & 4096) == 0) {
402         i__ = 384;
403     }
404 /* not tieable. */
405     rspeak_(&i__);
406     return ret_val;
407 
408 /* V114--        Tie */
409 
410 L14000:
411     if ((objcts_1.oflag2[prsvec_1.prso - 1] & 4096) != 0) {
412         goto L14100;
413     }
414     rspeak_(&c__385);
415 /* not tieable. */
416     return ret_val;
417 
418 L14100:
419     if (objact_(&x)) {
420         return ret_val;
421     }
422 /* object handle? */
423     i__ = 386;
424 /* joke 1. */
425     if (prsvec_1.prsi == 251) {
426         i__ = 919;
427     }
428 /* if player, joke 2. */
429     rspsub_(&c__386, &odo2);
430 /* print remark. */
431     return ret_val;
432 
433 /* V115--        Tie up */
434 
435 L15000:
436     if ((objcts_1.oflag2[prsvec_1.prsi - 1] & 4096) != 0) {
437         goto L15100;
438     }
439     rspsub_(&c__387, &odo2);
440 /* not tieable. */
441     return ret_val;
442 
443 L15100:
444     i__ = 388;
445 /* assume villain. */
446     if ((objcts_1.oflag2[prsvec_1.prso - 1] & 128) == 0) {
447         i__ = 389;
448     }
449     rspsub_(&i__, &odo2);
450 /* joke. */
451     return ret_val;
452 
453 /* V116--        Turn */
454 
455 L16000:
456     if ((objcts_1.oflag1[prsvec_1.prso - 1] & 2) != 0) {
457         goto L16100;
458     }
459     rspeak_(&c__390);
460 /* not turnable. */
461     return ret_val;
462 
463 L16100:
464     if ((objcts_1.oflag1[prsvec_1.prsi - 1] & 4) != 0) {
465         goto L16200;
466     }
467     rspsub_(&c__391, &odi2);
468 /* not a tool. */
469     return ret_val;
470 
471 L16200:
472     ret_val = objact_(&x);
473 /* let object handle. */
474     return ret_val;
475 
476 /* V117--        Breathe */
477 
478 L17000:
479     prsvec_1.prsa = 102;
480     prsvec_1.prsi = 260;
481     goto L2000;
482 /* VAPPLI, PAGE 5A. */
483 
484 /* V118--        Knock */
485 
486 /* handle like inflate. */
487 L18000:
488     if (objact_(&x)) {
489         return ret_val;
490     }
491 /* obj handle? */
492     i__ = 394;
493 /* joke for door. */
494     if ((objcts_1.oflag1[prsvec_1.prso - 1] & 4096) == 0) {
495         i__ = 395;
496     }
497     rspsub_(&i__, &odo2);
498 /* joke for nondoors too. */
499     return ret_val;
500 
501 /* V119--        Look */
502 
503 L19000:
504     if (prsvec_1.prso != 0) {
505         goto L20500;
506     }
507 /* something to look at? */
508     ret_val = rmdesc_(&c__3);
509 /* handled by rmdesc. */
510     return ret_val;
511 
512 /* V120--        Examine */
513 
514 L20000:
515     if (prsvec_1.prso != 0) {
516         goto L20500;
517     }
518 /* something to examine? */
519     ret_val = rmdesc_(&c__0);
520 /* handled by rmdesc. */
521     return ret_val;
522 
523 L20500:
524     if (objact_(&x)) {
525         return ret_val;
526     }
527 /* obj handle? */
528     i__ = objcts_1.oread[prsvec_1.prso - 1];
529 /* get reading material. */
530     if (i__ != 0) {
531         rspeak_(&i__);
532     }
533 /* output if there, */
534     if (i__ == 0) {
535         rspsub_(&c__429, &odo2);
536     }
537 /* otherwise default. */
538     prsvec_1.prsa = 8;
539 /* defuse room processors */
540     return ret_val;
541 
542 /* V121--        Shake */
543 
544 L21000:
545     if (objact_(&x)) {
546         return ret_val;
547     }
548 /* object handle? */
549     if (prsvec_1.prso == 273) {
550         goto L10;
551     }
552 /* global water? fails. */
553     if ((objcts_1.oflag2[prsvec_1.prso - 1] & 128) == 0) {
554         goto L21100;
555     }
556     rspeak_(&c__371);
557 /* joke for villains. */
558     return ret_val;
559 
560 L21100:
561     if (prsvec_1.prso != av) {
562         goto L21150;
563     }
564 /* vehicle? */
565     rspeak_(&c__672);
566 /* yes, joke. */
567     return ret_val;
568 
569 L21150:
570     if ((objcts_1.oflag1[prsvec_1.prso - 1] & 8192) != 0) {
571         goto L21200;
572     }
573 /* takeable? */
574     rspeak_(&c__923);
575 /* no, joke. */
576     return ret_val;
577 
578 L21200:
579     if (objcts_1.oadv[prsvec_1.prso - 1] == play_1.winner) {
580         goto L21250;
581     }
582 /* carrying? */
583     rspeak_(&c__527);
584 /* no, joke. */
585     return ret_val;
586 
587 L21250:
588     if (qempty_(&prsvec_1.prso)) {
589         goto L10;
590     }
591 /* empty?  fails. */
592     if ((objcts_1.oflag2[prsvec_1.prso - 1] & 8) != 0) {
593         goto L21300;
594     }
595 /* open?  spill. */
596     rspsub_(&c__396, &odo2);
597 /* no, describe noise. */
598     return ret_val;
599 
600 L21300:
601     rspsub_(&c__397, &odo2);
602 /* spill the works. */
603     i__1 = objcts_1.olnt;
604     for (i__ = 1; i__ <= i__1; ++i__) {
605 /* spill contents. */
606         if (objcts_1.ocan[i__ - 1] != prsvec_1.prso) {
607             goto L21500;
608         }
609 /* inside? */
610         objcts_1.oflag2[i__ - 1] = objcts_1.oflag2[i__ - 1] | 4;
611 /* touch object. */
612         if (av == 0) {
613             goto L21400;
614         }
615 /* in vehicle? */
616         newsta_(&i__, &c__0, &c__0, &av, &c__0);
617 /* yes, spill in there. */
618         goto L21500;
619 
620 L21400:
621         newsta_(&i__, &c__0, &play_1.here, &c__0, &c__0);
622 /* no, spill on floor, */
623         if (i__ == 11) {
624             newsta_(&i__, &c__133, &c__0, &c__0, &c__0);
625         }
626 /* but water disappears. */
627 L21500:
628         ;
629     }
630     return ret_val;
631 /* VAPPLI, PAGE 6 */
632 
633 /* V122--        Move */
634 
635 L22000:
636     if (! qhere_(&prsvec_1.prso, &play_1.here)) {
637         goto L22100;
638     }
639 /* is it here? */
640     if (objact_(&x)) {
641         return ret_val;
642     }
643 /* obj handle? */
644     i__ = 399;
645 /* assume not takeable. */
646     if ((objcts_1.oflag1[prsvec_1.prso - 1] & 8192) != 0) {
647         i__ = 887;
648     }
649     rspsub_(&i__, &odo2);
650 /* joke. */
651     return ret_val;
652 
653 L22100:
654     rspeak_(&c__398);
655 /* not here. */
656     return ret_val;
657 
658 /* V123--        Turn on */
659 
660 L23000:
661     if (objact_(&x)) {
662         return ret_val;
663     }
664 /* object handle? */
665     if ((objcts_1.oflag1[prsvec_1.prso - 1] & 64) != 0 && objcts_1.oadv[
666             prsvec_1.prso - 1] == play_1.winner) {
667         goto L23100;
668     }
669     rspeak_(&c__400);
670 /* cant do it. */
671     return ret_val;
672 
673 L23100:
674     if ((objcts_1.oflag1[prsvec_1.prso - 1] & 1) == 0) {
675         goto L23200;
676     }
677     rspeak_(&c__401);
678 /* already on. */
679     return ret_val;
680 
681 L23200:
682     objcts_1.oflag1[prsvec_1.prso - 1] = objcts_1.oflag1[prsvec_1.prso - 1] |
683             1;
684 /* turn it on. */
685     rspsub_(&c__404, &odo2);
686     return ret_val;
687 
688 /* V124--        Turn off */
689 
690 L24000:
691     if (objact_(&x)) {
692         return ret_val;
693     }
694 /* obj handle? */
695     if ((objcts_1.oflag1[prsvec_1.prso - 1] & 64) != 0 && objcts_1.oadv[
696             prsvec_1.prso - 1] == play_1.winner) {
697         goto L24100;
698     }
699     rspeak_(&c__402);
700 /* cant do it. */
701     return ret_val;
702 
703 L24100:
704     if ((objcts_1.oflag1[prsvec_1.prso - 1] & 1) != 0) {
705         goto L24200;
706     }
707     rspeak_(&c__403);
708 /* already off. */
709     return ret_val;
710 
711 L24200:
712     objcts_1.oflag1[prsvec_1.prso - 1] = objcts_1.oflag1[prsvec_1.prso - 1] &
713             -2;
714     rspsub_(&c__405, &odo2);
715     goto L50;
716 
717 /* V125--        Open */
718 
719 /* go see if now dark. */
720 L25000:
721     if (objact_(&x)) {
722         return ret_val;
723     }
724 /* obj handle? */
725     if ((objcts_1.oflag1[prsvec_1.prso - 1] & 4096) != 0) {
726         goto L25150;
727     }
728 /* door? */
729     if ((objcts_1.oflag1[prsvec_1.prso - 1] & 128) != 0) {
730         goto L25100;
731     }
732 /* container? */
733 L25050:
734     rspsub_(&c__407, &odo2);
735 /* not door or container. */
736     return ret_val;
737 
738 L25100:
739     if (objcts_1.ocapac[prsvec_1.prso - 1] != 0) {
740         goto L25200;
741     }
742 /* openable container? */
743 L25150:
744     rspsub_(&c__408, &odo2);
745 /* door or not openable. */
746     return ret_val;
747 
748 L25200:
749     if (! ((objcts_1.oflag2[prsvec_1.prso - 1] & 8) != 0)) {
750         goto L25225;
751     }
752     rspeak_(&c__412);
753 /* already open. */
754     return ret_val;
755 
756 L25225:
757     objcts_1.oflag2[prsvec_1.prso - 1] = objcts_1.oflag2[prsvec_1.prso - 1] |
758             8;
759 /* open it. */
760     if ((objcts_1.oflag1[prsvec_1.prso - 1] & 2048) != 0 || qempty_(&
761             prsvec_1.prso)) {
762         goto L25300;
763     }
764     princo_(&prsvec_1.prso, &c__410, &c_false);
765 /* print contents. */
766     return ret_val;
767 
768 L25300:
769     rspeak_(&c__409);
770 /* done */
771     return ret_val;
772 
773 /* V126--        Close */
774 
775 L26000:
776     if (objact_(&x)) {
777         return ret_val;
778     }
779 /* obj handle? */
780     if ((objcts_1.oflag1[prsvec_1.prso - 1] & 4096) != 0) {
781         goto L26050;
782     }
783 /* door? */
784     if ((objcts_1.oflag1[prsvec_1.prso - 1] & 128) == 0) {
785         goto L25050;
786     }
787 /* container? */
788     if (objcts_1.ocapac[prsvec_1.prso - 1] != 0) {
789         goto L26100;
790     }
791 /* closable container? */
792 L26050:
793     rspsub_(&c__411, &odo2);
794 /* door or not closable. */
795     return ret_val;
796 
797 L26100:
798     if ((objcts_1.oflag2[prsvec_1.prso - 1] & 8) != 0) {
799         goto L26200;
800     }
801 /* open? */
802     rspeak_(&c__413);
803 /* no, joke. */
804     return ret_val;
805 
806 L26200:
807     objcts_1.oflag2[prsvec_1.prso - 1] = objcts_1.oflag2[prsvec_1.prso - 1] &
808             -9;
809     rspeak_(&c__414);
810 /* done. */
811     goto L50;
812 /* VAPPLI, PAGE 7 */
813 
814 /* V127--        Find */
815 
816 /* go see if now dark. */
817 L27000:
818     if (objact_(&x)) {
819         return ret_val;
820     }
821 /* obj handle? */
822     i__ = 415;
823 /* room string. */
824     if (qhere_(&prsvec_1.prso, &play_1.here)) {
825         goto L27200;
826     }
827 /* in room? */
828     i__ = 416;
829 /* winner string. */
830     if (objcts_1.oadv[prsvec_1.prso - 1] == play_1.winner) {
831         goto L27200;
832     }
833 /* on winner? */
834     j = objcts_1.ocan[prsvec_1.prso - 1];
835 /* down one level. */
836     if (j == 0) {
837         goto L10;
838     }
839     if ((objcts_1.oflag1[j - 1] & 2048) == 0 && (! ((objcts_1.oflag2[j - 1] &
840             8) != 0) || (objcts_1.oflag1[j - 1] & 4224) == 0)) {
841         goto L10;
842     }
843 /* if not visible, punt. */
844     i__ = 417;
845 /* assume in room. */
846     if (qhere_(&j, &play_1.here)) {
847         goto L27100;
848     }
849     i__ = 418;
850 /* assume on winner. */
851     if (objcts_1.oadv[j - 1] != play_1.winner) {
852         goto L10;
853     }
854 /* not here or on person. */
855 L27100:
856     rspsub_(&i__, &objcts_1.odesc2[j - 1]);
857 /* describe findings. */
858     return ret_val;
859 
860 L27200:
861     rspsub_(&i__, &odo2);
862 /* describe findings. */
863     return ret_val;
864 
865 /* V128--        Wait */
866 
867 L28000:
868     rspeak_(&c__419);
869 /* time passes. */
870     for (i__ = 1; i__ <= 3; ++i__) {
871         if (clockd_(&x)) {
872             return ret_val;
873         }
874         if (! findex_1.deadf) {
875             fightd_();
876         }
877         if (prsvec_1.prscon == 0) {
878             return ret_val;
879         }
880 /* fighting happened. */
881 /* L28100: */
882     }
883     return ret_val;
884 
885 /* V129--        Spin */
886 /* V159--        Turn to */
887 
888 L29000:
889 L59000:
890     if (objact_(&x)) {
891         return ret_val;
892     }
893 /* object handle? */
894     if ((objcts_1.oflag1[prsvec_1.prso - 1] & 2) != 0) {
895         goto L59100;
896     }
897     rspeak_(&c__390);
898 /* can't turn? */
899     return ret_val;
900 
901 L59100:
902     rspsub_(&c__663, &odo2);
903 /* won't budge. */
904     return ret_val;
905 
906 /* V130--        Board */
907 
908 L30000:
909     if ((objcts_1.oflag2[prsvec_1.prso - 1] & 2) != 0) {
910         goto L30100;
911     }
912     rspsub_(&c__421, &odo2);
913 /* not vehicle, joke. */
914     prsvec_1.prscon = 0;
915 /* kill cmd stream. */
916     return ret_val;
917 
918 L30100:
919     if (qhere_(&prsvec_1.prso, &play_1.here)) {
920         goto L30200;
921     }
922 /* here? */
923     rspsub_(&c__420, &odo2);
924 /* no, joke. */
925     prsvec_1.prscon = 0;
926 /* kill cmd stream. */
927     return ret_val;
928 
929 L30200:
930     if (av == 0) {
931         goto L30300;
932     }
933 /* already got one? */
934     rspsub_(&c__422, &odo2);
935 /* yes, joke. */
936     prsvec_1.prscon = 0;
937 /* kill cmd stream. */
938     return ret_val;
939 
940 L30300:
941     if (objact_(&x)) {
942         return ret_val;
943     }
944 /* obj handle? */
945     rspsub_(&c__423, &odo2);
946 /* describe. */
947     advs_1.avehic[play_1.winner - 1] = prsvec_1.prso;
948     if (play_1.winner != 1) {
949         newsta_(&advs_1.aobj[play_1.winner - 1], &c__0, &c__0, &prsvec_1.prso,
950                  &c__0);
951     }
952     return ret_val;
953 
954 /* V131--        Disembark */
955 
956 L31000:
957     if (av == prsvec_1.prso) {
958         goto L31100;
959     }
960 /* from vehicle? */
961     rspeak_(&c__424);
962 /* no, joke. */
963     prsvec_1.prscon = 0;
964 /* kill cmd stream. */
965     return ret_val;
966 
967 L31100:
968     if (objact_(&x)) {
969         return ret_val;
970     }
971 /* obj handle? */
972     if ((rooms_1.rflag[play_1.here - 1] & 8192) != 0) {
973         goto L31200;
974     }
975     rspeak_(&c__425);
976 /* not on land. */
977     prsvec_1.prscon = 0;
978 /* kill cmd stream. */
979     return ret_val;
980 
981 L31200:
982     advs_1.avehic[play_1.winner - 1] = 0;
983     rspeak_(&c__426);
984     if (play_1.winner != 1) {
985         newsta_(&advs_1.aobj[play_1.winner - 1], &c__0, &play_1.here, &c__0, &
986                 c__0);
987     }
988     return ret_val;
989 
990 /* V132--        Take */
991 
992 L32000:
993     ret_val = take_(&c_true);
994     return ret_val;
995 
996 /* V133--        Inventory */
997 
998 L33000:
999     invent_(&play_1.winner);
1000     return ret_val;
1001 /* VAPPLI, PAGE 8 */
1002 
1003 /* V134--        Fill */
1004 
1005 L34000:
1006     if (prsvec_1.prsi != 0) {
1007         goto L34050;
1008     }
1009 /* any obj specified? */
1010     if ((rooms_1.rflag[play_1.here - 1] & 4608) != 0) {
1011         goto L34025;
1012     }
1013     rspeak_(&c__516);
1014 /* nothing to fill with. */
1015     prsvec_1.prswon = FALSE_;
1016 /* you lose. */
1017     orphan_(&c_n1, &prssta_1.act, &prssta_1.prep1, &prsvec_1.prso, &c__2,
1018             " ", &c__0, &c__0, 1L);
1019 /* orphan "fill obj with" */
1020     goto L10;
1021 
1022 /* return false. */
1023 L34025:
1024     prsvec_1.prsi = 273;
1025 /* use global water. */
1026 L34050:
1027     prsvec_1.prsa = 144;
1028     i__ = prsvec_1.prso;
1029 /* fill x with y becomes */
1030     prsvec_1.prso = prsvec_1.prsi;
1031 /* put y in x */
1032     prsvec_1.prsi = i__;
1033     ret_val = put_(&c_true);
1034     return ret_val;
1035 
1036 /* V135,V136--   Eat/Drink */
1037 
1038 L35000:
1039 L36000:
1040     if (objact_(&x)) {
1041         return ret_val;
1042     }
1043 /* obj handle? */
1044     if (prsvec_1.prso == 273) {
1045         goto L36500;
1046     }
1047 /* drink global water? */
1048     if (! ((objcts_1.oflag1[prsvec_1.prso - 1] & 1024) != 0)) {
1049         goto L36400;
1050     }
1051 /* edible? */
1052     if (objcts_1.oadv[prsvec_1.prso - 1] == play_1.winner) {
1053         goto L36200;
1054     }
1055 /* yes, on winner? */
1056 L36100:
1057     rspsub_(&c__454, &odo2);
1058 /* not accessible. */
1059     return ret_val;
1060 
1061 L36200:
1062     if (prsvec_1.prsa == 136) {
1063         goto L36300;
1064     }
1065 /* drink food? */
1066     newsta_(&prsvec_1.prso, &c__455, &c__0, &c__0, &c__0);
1067 /* no, it disappears. */
1068     return ret_val;
1069 
1070 L36300:
1071     rspeak_(&c__456);
1072 /* yes, joke. */
1073     return ret_val;
1074 
1075 L36400:
1076     if (! ((objcts_1.oflag1[prsvec_1.prso - 1] & 256) != 0)) {
1077         goto L36600;
1078     }
1079 /* drinkable? */
1080     if (objcts_1.ocan[prsvec_1.prso - 1] == 0) {
1081         goto L36100;
1082     }
1083 /* yes, in something? */
1084     if (objcts_1.oadv[objcts_1.ocan[prsvec_1.prso - 1] - 1] != play_1.winner)
1085             {
1086         goto L36100;
1087     }
1088     if ((objcts_1.oflag2[objcts_1.ocan[prsvec_1.prso - 1] - 1] & 8) != 0) {
1089         goto L36500;
1090     }
1091 /* cont open? */
1092     rspeak_(&c__457);
1093 /* no, joke. */
1094     return ret_val;
1095 
1096 L36500:
1097     newsta_(&prsvec_1.prso, &c__458, &c__0, &c__0, &c__0);
1098 /* gone. */
1099     return ret_val;
1100 
1101 L36600:
1102     rspsub_(&c__453, &odo2);
1103 /* not food or drink. */
1104     return ret_val;
1105 
1106 /* V137--        Burn */
1107 
1108 L37000:
1109     if ((objcts_1.oflag1[prsvec_1.prsi - 1] & 73) != 73) {
1110         goto L37600;
1111     }
1112 /* with flame? */
1113     if (objact_(&x)) {
1114         return ret_val;
1115     }
1116 /* obj handle? */
1117     if ((objcts_1.oflag1[prsvec_1.prso - 1] & 16) == 0) {
1118         goto L37500;
1119     }
1120 /* burnable? */
1121     if (objcts_1.oadv[prsvec_1.prso - 1] == play_1.winner) {
1122         goto L37400;
1123     }
1124 /* carrying it? */
1125     if (qhere_(&prsvec_1.prso, &play_1.here)) {
1126         goto L37200;
1127     }
1128 /* here? */
1129     j = objcts_1.ocan[prsvec_1.prso - 1];
1130 /* get container. */
1131     if (j == 0) {
1132         goto L37100;
1133     }
1134 /* is there one? */
1135     if (! ((objcts_1.oflag2[j - 1] & 8) != 0)) {
1136         goto L37100;
1137     }
1138 /* open? */
1139     if (j == 99) {
1140         goto L37300;
1141     }
1142 /* in balloon receptacle? */
1143     if (objcts_1.oadv[j - 1] == play_1.winner) {
1144         goto L37400;
1145     }
1146 /* carrying? */
1147     if (qhere_(&j, &play_1.here)) {
1148         goto L37200;
1149     }
1150 /* here? */
1151 L37100:
1152     rspeak_(&c__461);
1153 /* cant reach it. */
1154     return ret_val;
1155 
1156 L37200:
1157     rspsub_(&c__462, &odo2);
1158 /* burn it. */
1159     newsta_(&prsvec_1.prso, &c__0, &c__0, &c__0, &c__0);
1160     return ret_val;
1161 
1162 L37300:
1163     ret_val = oappli_(&objcts_1.oactio[97], &c__0);
1164 /* fire in receptacle. */
1165     return ret_val;
1166 
1167 L37400:
1168     rspsub_(&c__459, &odo2);
1169 /* burnable on player. */
1170     jigsup_(&c__460);
1171     return ret_val;
1172 
1173 L37500:
1174     rspsub_(&c__463, &odo2);
1175 /* cant burn it. */
1176     return ret_val;
1177 
1178 L37600:
1179     rspsub_(&c__301, &odi2);
1180 /* cant burn it with that */
1181     return ret_val;
1182 /* VAPPLI, PAGE 9 */
1183 
1184 /* V138--        Mung */
1185 
1186 L38000:
1187     i__ = 466;
1188 /* choose phrase. */
1189     if ((objcts_1.oflag2[prsvec_1.prso - 1] & 128) != 0) {
1190         goto L41100;
1191     }
1192     if (! objact_(&x)) {
1193         rspsb2_(&c__466, &odo2, &rmk);
1194     }
1195     return ret_val;
1196 
1197 /* V139--        Kill */
1198 
1199 L39000:
1200     i__ = 467;
1201 /* choose phrase. */
1202     goto L41100;
1203 
1204 /* V140--        Swing */
1205 
1206 L40000:
1207     j = prsvec_1.prso;
1208 /* invert. */
1209     prsvec_1.prso = prsvec_1.prsi;
1210     prsvec_1.prsi = j;
1211     j = odo2;
1212     odo2 = odi2;
1213     odi2 = j;
1214     prsvec_1.prsa = 141;
1215 
1216 /* V141--        Attack */
1217 
1218 /* for objact. */
1219 L41000:
1220     i__ = 468;
1221 
1222 /* Common mung/attack/swing/kill code. */
1223 
1224 L41100:
1225     if (prsvec_1.prso != 0) {
1226         goto L41200;
1227     }
1228 /* anything? */
1229     rspeak_(&c__469);
1230 /* no, joke. */
1231     return ret_val;
1232 
1233 L41200:
1234     if (objact_(&x)) {
1235         return ret_val;
1236     }
1237 /* obj handle? */
1238     if ((objcts_1.oflag2[prsvec_1.prso - 1] & 128) != 0) {
1239         goto L41300;
1240     }
1241     if ((objcts_1.oflag1[prsvec_1.prso - 1] & 32) == 0) {
1242         rspsub_(&c__470, &odo2);
1243     }
1244 /* not a villain. */
1245     return ret_val;
1246 
1247 L41300:
1248     j = 471;
1249 /* assume no weapon. */
1250     if (prsvec_1.prsi == 0) {
1251         goto L41500;
1252     }
1253     if ((objcts_1.oflag2[prsvec_1.prsi - 1] & 512) == 0) {
1254         goto L41400;
1255     }
1256     melee = 1;
1257 /* assume sword. */
1258     if (prsvec_1.prsi != 14) {
1259         melee = 2;
1260     }
1261 /* must be knife. */
1262     i__ = blow_(&c__1, &prsvec_1.prso, &melee, &c_true, &c__0);
1263 /* strike blow. */
1264     return ret_val;
1265 
1266 L41400:
1267     j = 472;
1268 /* not a weapon. */
1269 L41500:
1270     rspsb2_(&i__, &odo2, &j);
1271 /* joke. */
1272     return ret_val;
1273 /* VAPPLI, PAGE 10 */
1274 
1275 /* V142--        Walk */
1276 
1277 L42000:
1278     ret_val = walk_(&x);
1279     return ret_val;
1280 
1281 /* V143--        Tell */
1282 
1283 L43000:
1284     rspeak_(&c__603);
1285     prsvec_1.prscon = 0;
1286 /* kill cmd stream. */
1287     return ret_val;
1288 
1289 /* V144--        Put */
1290 
1291 L44000:
1292     ret_val = put_(&c_true);
1293     return ret_val;
1294 
1295 /* V145,V148--   Drop/Throw */
1296 
1297 L45000:
1298 /* throw. */
1299 L48000:
1300     ret_val = drop_(&c_true);
1301 /* drop. */
1302     return ret_val;
1303 
1304 /* V146--        Give */
1305 
1306 L46000:
1307     if (objcts_1.oadv[prsvec_1.prso - 1] == play_1.winner) {
1308         goto L46100;
1309     }
1310 /* is he carrying obj? */
1311     x = objcts_1.ocan[prsvec_1.prso - 1];
1312 /* get container. */
1313     if (x == 0) {
1314         goto L46200;
1315     }
1316 /* container? */
1317     if (! ((objcts_1.oflag2[x - 1] & 8) != 0)) {
1318         goto L46200;
1319     }
1320 /* open? */
1321     if (objcts_1.oadv[x - 1] != play_1.winner) {
1322         goto L46200;
1323     }
1324 /* carrying? */
1325 L46100:
1326     ret_val = objact_(&x);
1327 /* iobject must handle. */
1328     return ret_val;
1329 
1330 L46200:
1331     rspeak_(&c__527);
1332 /* don't have it. */
1333     return ret_val;
1334 
1335 /* V147--        Pour */
1336 
1337 L47000:
1338     if (prsvec_1.prso == 11) {
1339         goto L47100;
1340     }
1341 /* pour? must be water. */
1342     rspeak_(&c__1075);
1343 /* otherwise, joke. */
1344     return ret_val;
1345 
1346 L47100:
1347     if (prsvec_1.prsi == 0) {
1348         goto L48000;
1349     }
1350 /* pour x, treat like dro */
1351     prsvec_1.prsa = 144;
1352 /* else, treat like put. */
1353     ret_val = put_(&c_true);
1354     return ret_val;
1355 
1356 /* V149--        Save */
1357 
1358 L49000:
1359     if ((rooms_1.rflag[157] & 32768) == 0) {
1360         goto L49100;
1361     }
1362     rspeak_(&c__828);
1363 /* no saves in endgame. */
1364     return ret_val;
1365 
1366 L49100:
1367     savegm_();
1368 /* save game. */
1369     prsvec_1.prswon = FALSE_;
1370 /* disable rest of move. */
1371     prsvec_1.prscon = 0;
1372     return ret_val;
1373 
1374 /* V150--        Restore */
1375 
1376 L50000:
1377     if ((rooms_1.rflag[157] & 32768) == 0) {
1378         goto L50100;
1379     }
1380     rspeak_(&c__829);
1381 /* no restores in endgame */
1382     return ret_val;
1383 
1384 L50100:
1385     rstrgm_();
1386 /* restore game. */
1387     prsvec_1.prswon = FALSE_;
1388 /* disable rest of move. */
1389     prsvec_1.prscon = 0;
1390     return ret_val;
1391 /* VAPPLI, PAGE 11 */
1392 
1393 /* V151--        Hello */
1394 
1395 L51000:
1396     if (prsvec_1.prso != 0) {
1397         goto L51100;
1398     }
1399 /* any obj? */
1400     i__1 = rnd_(&c__4) + 346;
1401     rspeak_(&i__1);
1402 /* no, vanilla hello. */
1403     return ret_val;
1404 
1405 L51100:
1406     if (prsvec_1.prso != 261) {
1407         goto L51200;
1408     }
1409 /* hello aviator? */
1410     rspeak_(&c__350);
1411 /* nothing happens. */
1412     return ret_val;
1413 
1414 L51200:
1415     if (prsvec_1.prso != 255) {
1416         goto L51300;
1417     }
1418 /* hello sailor? */
1419     ++play_1.hs;
1420 /* count. */
1421     i__ = 351;
1422 /* give normal or */
1423     if (play_1.hs % 10 == 0) {
1424         i__ = 352;
1425     }
1426 /* random message. */
1427     if (play_1.hs % 20 == 0) {
1428         i__ = 353;
1429     }
1430     rspeak_(&i__);
1431 /* speak up. */
1432     return ret_val;
1433 
1434 L51300:
1435     if (objact_(&x)) {
1436         return ret_val;
1437     }
1438 /* obj handle? */
1439     i__ = 354;
1440 /* assume villain. */
1441     if ((objcts_1.oflag2[prsvec_1.prso - 1] & 1152) == 0) {
1442         i__ = 355;
1443     }
1444     rspsub_(&i__, &odo2);
1445 /* hello there! */
1446     return ret_val;
1447 
1448 /* V152--        Look into */
1449 
1450 L52000:
1451     if (objact_(&x)) {
1452         return ret_val;
1453     }
1454 /* obj handle? */
1455     if ((objcts_1.oflag1[prsvec_1.prso - 1] & 4096) == 0) {
1456         goto L52300;
1457     }
1458 /* door? */
1459     if (! ((objcts_1.oflag2[prsvec_1.prso - 1] & 8) != 0)) {
1460         goto L52200;
1461     }
1462 /* open? */
1463     rspsub_(&c__628, &odo2);
1464 /* open door- uninteresti */
1465     return ret_val;
1466 
1467 L52200:
1468     rspsub_(&c__525, &odo2);
1469 /* closed door- cant see. */
1470     return ret_val;
1471 
1472 L52300:
1473     if ((objcts_1.oflag1[prsvec_1.prso - 1] & 128) != 0) {
1474         goto L52500;
1475     }
1476 /* container? */
1477     if ((objcts_1.oflag2[prsvec_1.prso - 1] & 8) != 0) {
1478         goto L52400;
1479     }
1480 /* open anyway? */
1481     rspsub_(&c__630, &odo2);
1482 /* cant look inside. */
1483     return ret_val;
1484 
1485 L52400:
1486     if (! qempty_(&prsvec_1.prso)) {
1487         goto L52700;
1488     }
1489 /* not empty? */
1490     rspsub_(&c__1054, &odo2);
1491 /* doesn't contain anythi */
1492     return ret_val;
1493 
1494 L52500:
1495     if ((objcts_1.oflag2[prsvec_1.prso - 1] & 8) != 0 || (objcts_1.oflag1[
1496             prsvec_1.prso - 1] & 2048) != 0) {
1497         goto L52600;
1498     }
1499 /* open or see inside? */
1500     rspsub_(&c__525, &odo2);
1501 /* closed. */
1502     return ret_val;
1503 
1504 L52600:
1505     if (qempty_(&prsvec_1.prso)) {
1506         goto L52800;
1507     }
1508 /* see in.  empty? */
1509 L52700:
1510     princo_(&prsvec_1.prso, &c__573, &c_true);
1511 /* no, list contents. */
1512     return ret_val;
1513 
1514 L52800:
1515     rspsub_(&c__629, &odo2);
1516 /* empty. */
1517     return ret_val;
1518 /* VAPPLI, PAGE 12 */
1519 
1520 /* V153--        Look under */
1521 
1522 L53000:
1523     if (! objact_(&x)) {
1524         rspeak_(&c__631);
1525     }
1526 /* object handle? */
1527     return ret_val;
1528 
1529 /* V154--        Pump */
1530 
1531 L54000:
1532     if (objcts_1.oroom[88] == play_1.here || objcts_1.oadv[88] ==
1533             play_1.winner) {
1534         goto L54100;
1535     }
1536 /* pump here? */
1537     rspeak_(&c__632);
1538 /* no. */
1539     return ret_val;
1540 
1541 L54100:
1542     prsvec_1.prsi = 89;
1543 /* becomes inflate */
1544     prsvec_1.prsa = 102;
1545 /* x with pump. */
1546     goto L2000;
1547 
1548 /* V155--        Wind */
1549 
1550 /* done. */
1551 L55000:
1552     if (! objact_(&x)) {
1553         rspsub_(&c__634, &odo2);
1554     }
1555 /* obj handle? */
1556     return ret_val;
1557 
1558 /* V156--        Climb */
1559 /* V157--        Climb up */
1560 /* V158--        Climb down */
1561 
1562 L56000:
1563 L57000:
1564 L58000:
1565     if (objact_(&x)) {
1566         return ret_val;
1567     }
1568 /* object handle? */
1569     i__ = 9216;
1570 /* assume up. */
1571     if (prsvec_1.prsa == 158) {
1572         i__ = 10240;
1573     }
1574 /* unless climb dn. */
1575     f = (objcts_1.oflag2[prsvec_1.prso - 1] & 2048) != 0;
1576     if (f && findxt_(&i__, &play_1.here)) {
1577         goto L58500;
1578     }
1579 /* anything to climb? */
1580     i__ = 657;
1581     if (f) {
1582         i__ = 524;
1583     }
1584 /* variety of jokes. */
1585     if (! f && (prsvec_1.prso == 257 || prsvec_1.prso == 265 || (
1586             prsvec_1.prso >= 269 && prsvec_1.prso <= 272))) {
1587         i__ = 656;
1588     }
1589 /* if walls. */
1590     rspeak_(&i__);
1591 /* joke. */
1592     return ret_val;
1593 
1594 L58500:
1595     prsvec_1.prsa = 142;
1596 /* walk */
1597     prsvec_1.prso = i__;
1598 /* in specified dir. */
1599     goto L42000;
1600 /* VAPPLI, PAGE 13 */
1601 
1602 /* V160--        Pour on */
1603 
1604 /* treat as walk. */
1605 L60000:
1606     if (prsvec_1.prso != 11) {
1607         goto L60500;
1608     }
1609 /* pour water? */
1610     if (objact_(&x)) {
1611         return ret_val;
1612     }
1613 /* object handle? */
1614     newsta_(&c__11, &c__0, &c__0, &c__0, &c__0);
1615 /* vanish water. */
1616     if (objcts_1.ocan[prsvec_1.prsi - 1] != 99) {
1617         goto L60100;
1618     }
1619 /* onto obj in receptacle */
1620     rspsub_(&c__977, &odi2);
1621 /* doesn't work. */
1622     return ret_val;
1623 
1624 L60100:
1625     if ((objcts_1.oflag1[prsvec_1.prsi - 1] & 73) != 73) {
1626         goto L60300;
1627     }
1628 /* on flame? */
1629     if (prsvec_1.prsi != 34) {
1630         goto L60200;
1631     }
1632 /* on torch? */
1633     rspeak_(&c__978);
1634 /* doesn't work. */
1635     return ret_val;
1636 
1637 L60200:
1638     objcts_1.oflag1[prsvec_1.prsi - 1] = objcts_1.oflag1[prsvec_1.prsi - 1] &
1639             -2;
1640 /* extinguish. */
1641     rspsub_(&c__979, &odi2);
1642 /* describe. */
1643     if (prsvec_1.prsi == 48) {
1644         cevent_1.cflag[4] = FALSE_;
1645     }
1646 /* if candle, disable tim */
1647     if (prsvec_1.prsi == 51) {
1648         cevent_1.ctick[3] = 0;
1649     }
1650 /* if match, gone. */
1651     goto L50;
1652 
1653 /* go see if now dark. */
1654 L60300:
1655     rspsub_(&c__980, &odi2);
1656 /* doesn't work. */
1657     return ret_val;
1658 
1659 L60500:
1660     rspeak_(&c__981);
1661 /* not water, joke. */
1662     return ret_val;
1663 
1664 /* V161--        Put under */
1665 
1666 L61000:
1667     if (objact_(&x)) {
1668         return ret_val;
1669     }
1670 /* object handle. */
1671     i__ = 1037;
1672 /* can't do. */
1673     if ((objcts_1.oflag1[prsvec_1.prso - 1] & 4096) != 0) {
1674         i__ = 982;
1675     }
1676 /* if door, won't fit. */
1677     rspeak_(&i__);
1678     return ret_val;
1679 
1680 /* V162--        Untie from */
1681 
1682 L62000:
1683     if ((prsvec_1.prso == 101 && findex_1.btief != 0) || (prsvec_1.prso == 12
1684             && findex_1.ttie == prsvec_1.prsi) || (prsvec_1.prso == 12 &&
1685             prsvec_1.prsi == 75 && findex_1.domef)) {
1686         goto L62100;
1687     }
1688 /* untie rope? */
1689     rspeak_(&c__1070);
1690 /* not attached to that. */
1691     return ret_val;
1692 
1693 L62100:
1694     prsvec_1.prsa = 113;
1695 /* treat as normal untie. */
1696     goto L13000;
1697 /* VAPPLI, PAGE 14 */
1698 
1699 /* V163--        Make */
1700 /* V169--        Wish */
1701 
1702 L63000:
1703     if (prsvec_1.prso != 263) {
1704         goto L10;
1705     }
1706 /* make a wish? */
1707 L69000:
1708     if (play_1.here != 143) {
1709         goto L63100;
1710     }
1711 /* at well? */
1712     if (objcts_1.oroom[24] == play_1.here) {
1713         goto L63200;
1714     }
1715 /* coins here? */
1716     if (objcts_1.oroom[103] == play_1.here) {
1717         goto L63300;
1718     }
1719 /* zorkmid here? */
1720 L63100:
1721     rspeak_(&c__937);
1722 /* doesn't work. */
1723     return ret_val;
1724 
1725 L63200:
1726     newsta_(&c__25, &c__938, &c__0, &c__0, &c__0);
1727 /* vanish coins */
1728     return ret_val;
1729 
1730 L63300:
1731     newsta_(&c__104, &c__938, &c__0, &c__0, &c__0);
1732 /* vanish zorkmid. */
1733     return ret_val;
1734 
1735 /* V164--        Oil */
1736 
1737 L64000:
1738     if (prsvec_1.prsi != 55) {
1739         goto L64100;
1740     }
1741 /* with putty? */
1742     if (objact_(&x)) {
1743         return ret_val;
1744     }
1745 /* object handle? */
1746     rspeak_(&c__904);
1747 /* doesn't work. */
1748     return ret_val;
1749 
1750 L64100:
1751     rspeak_(&c__905);
1752 /* joke. */
1753     return ret_val;
1754 
1755 /* V165--        Play */
1756 
1757 L65000:
1758     if (prsvec_1.prso != 40) {
1759         goto L65200;
1760     }
1761 /* play violin? */
1762     if (prsvec_1.prsi == 0) {
1763         goto L65100;
1764     }
1765 /* with anything? */
1766     if ((objcts_1.oflag2[prsvec_1.prsi - 1] & 512) == 0) {
1767         goto L65100;
1768     }
1769     objcts_1.otval[39] = 0;
1770 /* with weapon, ruined. */
1771     rspeak_(&c__933);
1772     return ret_val;
1773 
1774 L65100:
1775     rspeak_(&c__934);
1776 /* offensive noise. */
1777     return ret_val;
1778 
1779 L65200:
1780     if ((objcts_1.oflag2[prsvec_1.prso - 1] & 128) == 0) {
1781         goto L10;
1782     }
1783 /* play villain? */
1784     rspsub_(&c__935, &odo2);
1785 /* you're dead. */
1786     jigsup_(&c__0);
1787     return ret_val;
1788 
1789 /* V166--        Send */
1790 
1791 L66000:
1792     if (objact_(&x)) {
1793         return ret_val;
1794     }
1795 /* object handle? */
1796     i__ = 940;
1797 /* can't do it. */
1798     if ((objcts_1.oflag2[prsvec_1.prso - 1] & 128) != 0) {
1799         i__ = 941;
1800     }
1801 /* why do it? */
1802     rspsub_(&i__, &odo2);
1803     return ret_val;
1804 /* VAPPLI, PAGE 15 */
1805 
1806 /* V167--        Enter */
1807 
1808 L67000:
1809     prsvec_1.prsa = 142;
1810 /* treat as walk. */
1811     prsvec_1.prso = 13312;
1812     goto L42000;
1813 
1814 /* V168--        Leave */
1815 
1816 L68000:
1817     prsvec_1.prsa = 142;
1818 /* treat as walk. */
1819     prsvec_1.prso = 14336;
1820     goto L42000;
1821 
1822 /* V65-- Room */
1823 
1824 L65001:
1825     ret_val = rmdesc_(&c__2);
1826 /* describe room only. */
1827     return ret_val;
1828 
1829 /* V66-- Objects */
1830 
1831 L66001:
1832     ret_val = rmdesc_(&c__1);
1833 /* describe obj only. */
1834     if (! play_1.telflg) {
1835         rspeak_(&c__138);
1836     }
1837 /* no objects. */
1838     return ret_val;
1839 
1840 /* V67-- Rname */
1841 
1842 L67001:
1843     i__1 = rooms_1.rdesc2 - play_1.here;
1844     rspeak_(&i__1);
1845 /* short room name. */
1846     return ret_val;
1847 
1848 /* V68-- Squeeze */
1849 
1850 L68001:
1851     if (objact_(&x)) {
1852         return ret_val;
1853     }
1854 /* object handle? */
1855     i__ = 901;
1856 /* can't. */
1857     if ((objcts_1.oflag2[prsvec_1.prso - 1] & 128) != 0) {
1858         i__ = 902;
1859     }
1860 /* don't understand. */
1861     rspsub_(&i__, &odo2);
1862     return ret_val;
1863 
1864 /* V69-- Smell */
1865 
1866 L69001:
1867     rspsub_(&c__903, &odo2);
1868 /* joke. */
1869     return ret_val;
1870 /* VAPPLI, PAGE 16 */
1871 
1872 /* V70-- Brief */
1873 
1874 L70000:
1875     findex_1.brieff = TRUE_;
1876 /* brief descriptions. */
1877     findex_1.superf = FALSE_;
1878     rspeak_(&c__326);
1879     return ret_val;
1880 
1881 /* V71-- Verbose */
1882 
1883 L71000:
1884     findex_1.brieff = FALSE_;
1885 /* long descriptions. */
1886     findex_1.superf = FALSE_;
1887     rspeak_(&c__327);
1888     return ret_val;
1889 
1890 /* V72-- Superbrief */
1891 
1892 L72000:
1893     findex_1.superf = TRUE_;
1894     rspeak_(&c__328);
1895     return ret_val;
1896 
1897 /* V73-- Stay (used in endgame) */
1898 
1899 L73000:
1900     if (play_1.winner != 3) {
1901         goto L73100;
1902     }
1903 /* tell master, stay. */
1904     rspeak_(&c__781);
1905 /* he does. */
1906     cevent_1.ctick[23] = 0;
1907 /* not following. */
1908     return ret_val;
1909 
1910 L73100:
1911     if (play_1.winner == 1) {
1912         rspeak_(&c__664);
1913     }
1914 /* joke. */
1915     return ret_val;
1916 
1917 /* V74-- Version */
1918 
1919 L74000:
1920     weeprintf("V%d.%d%c\n",
1921       misc_1.vmaj, misc_1.vmin, misc_1.vedit[0]);
1922     play_1.telflg = TRUE_;
1923     return ret_val;
1924 
1925 /* V75-- Swim */
1926 
1927 L75000:
1928     i__ = 330;
1929 /* assume water. */
1930     if ((rooms_1.rflag[play_1.here - 1] & 4608) == 0) {
1931         i__ = rnd_(&c__3) + 331;
1932     }
1933 /* if no water, joke. */
1934     rspeak_(&i__);
1935     return ret_val;
1936 
1937 /* V76-- Geronimo */
1938 
1939 L76000:
1940     if (advs_1.avehic[play_1.winner - 1] == 93) {
1941         goto L76100;
1942     }
1943 /* in barrel? */
1944     rspeak_(&c__334);
1945 /* no, joke. */
1946     return ret_val;
1947 
1948 L76100:
1949     jigsup_(&c__335);
1950 /* over falls. */
1951     return ret_val;
1952 
1953 /* V77-- Sinbad et al */
1954 
1955 L77000:
1956     if (play_1.here == 101 && objcts_1.oroom[57] == play_1.here) {
1957         goto L77100;
1958     }
1959     rspeak_(&c__336);
1960 /* not here, joke. */
1961     return ret_val;
1962 
1963 L77100:
1964     newsta_(&c__58, &c__337, &c__0, &c__0, &c__0);
1965 /* cyclops flees. */
1966     findex_1.cyclof = TRUE_;
1967 /* set all flags. */
1968     findex_1.magicf = TRUE_;
1969     objcts_1.oflag2[57] = objcts_1.oflag2[57] & -257;
1970     return ret_val;
1971 
1972 /* V78-- unused */
1973 
1974 L78000:
1975     goto L10;
1976 
1977 /* V79-- Pray */
1978 
1979 L79000:
1980     if (play_1.here != 97) {
1981         goto L79050;
1982     }
1983 /* in temple? */
1984     if (moveto_(&c__31, &play_1.winner)) {
1985         goto L79100;
1986     }
1987 /* fore1 still there? */
1988 L79050:
1989     rspeak_(&c__340);
1990 /* joke. */
1991     return ret_val;
1992 
1993 L79100:
1994     f = rmdesc_(&c__3);
1995 /* moved, describe. */
1996     return ret_val;
1997 
1998 /* V80-- Treasure */
1999 
2000 L80000:
2001     if (play_1.here != 96) {
2002         goto L80050;
2003     }
2004 /* in temple? */
2005     if (moveto_(&c__103, &play_1.winner)) {
2006         goto L79100;
2007     }
2008 /* treasure room there? */
2009 L80050:
2010     rspeak_(&c__341);
2011 /* nothing happens. */
2012     return ret_val;
2013 
2014 /* V81-- Temple */
2015 
2016 L81000:
2017     if (play_1.here != 103) {
2018         goto L81050;
2019     }
2020 /* in treasure? */
2021     if (moveto_(&c__96, &play_1.winner)) {
2022         goto L79100;
2023     }
2024 /* temp1 still there? */
2025 L81050:
2026     rspeak_(&c__341);
2027 /* nothing happens. */
2028     return ret_val;
2029 
2030 /* V82-- Blast */
2031 
2032 L82000:
2033     i__ = 342;
2034 /* dont understand. */
2035     if (prsvec_1.prso == 105) {
2036         i__ = 252;
2037     }
2038 /* joke for safe. */
2039     rspeak_(&i__);
2040     return ret_val;
2041 
2042 /* V83-- Score */
2043 
2044 L83000:
2045     score_(&c_false);
2046     return ret_val;
2047 
2048 /* V84-- Quit */
2049 
2050 L84000:
2051     score_(&c_true);
2052 /* tell score. */
2053     if (! yesno_(&c__343, &c__10, &c__0)) {
2054         return ret_val;
2055     }
2056 /* ask for y/n decision. */
2057     s_stop(" ", 1L);
2058 /* VAPPLI, PAGE 17 */
2059 
2060 /* V85-- Follow (used in endgame) */
2061 
2062 /* bye. */
2063 L85000:
2064     if (play_1.winner != 3) {
2065         goto L85100;
2066     }
2067 /* tell master, follow. */
2068     rspeak_(&c__782);
2069     cevent_1.cflag[23] = TRUE_;
2070     cevent_1.ctick[23] = -1;
2071 /* starts following. */
2072     return ret_val;
2073 
2074 L85100:
2075     i__ = 10;
2076 /* assume ok. */
2077     if (prsvec_1.prso == 0) {
2078         goto L85200;
2079     }
2080 /* any object? */
2081     i__ = 964;
2082 /* joke 1 */
2083     if ((objcts_1.oflag2[prsvec_1.prso - 1] & 128) != 0) {
2084         i__ = 965;
2085     }
2086 /* joke 2. */
2087 L85200:
2088     rspeak_(&i__);
2089     return ret_val;
2090 
2091 /* V86-- Walk through */
2092 
2093 L86000:
2094     if (objact_(&x)) {
2095         return ret_val;
2096     }
2097 /* object handle? */
2098     if (screen_1.scolrm == 0 || (prsvec_1.prso != 151 && (prsvec_1.prso !=
2099             269 || play_1.here != 155))) {
2100         goto L86100;
2101     }
2102     screen_1.scolac = screen_1.scolrm;
2103 /* walked thru scol. */
2104     prsvec_1.prso = 0;
2105 /* fake out fromdr. */
2106     cevent_1.cflag[16] = TRUE_;
2107     cevent_1.ctick[16] = 6;
2108 /* start alarm. */
2109     rspeak_(&c__668);
2110 /* disorient him. */
2111     f = moveto_(&screen_1.scolrm, &play_1.winner);
2112 /* into room. */
2113     f = rmdesc_(&c__0);
2114 /* describe. */
2115     return ret_val;
2116 
2117 L86100:
2118     if (play_1.here != screen_1.scolac) {
2119         goto L86300;
2120     }
2121 /* on other side of scol? */
2122     for (i__ = 1; i__ <= 12; i__ += 3) {
2123 /* walk thru proper wall? */
2124         if (screen_1.scolwl[i__ - 1] == play_1.here && screen_1.scolwl[i__] ==
2125                  prsvec_1.prso) {
2126             goto L86500;
2127         }
2128 /* in specified room? */
2129 /* L86200: */
2130     }
2131 
2132 L86300:
2133     if ((objcts_1.oflag1[prsvec_1.prso - 1] & 8192) != 0) {
2134         goto L86400;
2135     }
2136 /* tkble? */
2137     i__ = 669;
2138 /* no, joke. */
2139     if (prsvec_1.prso == 151) {
2140         i__ = 670;
2141     }
2142 /* special joke for scol. */
2143     rspsub_(&i__, &odo2);
2144     return ret_val;
2145 
2146 L86400:
2147     i__ = 671;
2148 /* joke. */
2149     if (objcts_1.oroom[prsvec_1.prso - 1] != 0) {
2150         i__ = rnd_(&c__6) + 552;
2151     }
2152 /* special jokes if carry */
2153     rspeak_(&i__);
2154     return ret_val;
2155 
2156 L86500:
2157     prsvec_1.prso = screen_1.scolwl[i__ + 1];
2158 /* thru scol wall... */
2159     for (i__ = 1; i__ <= 8; i__ += 2) {
2160 /* find matching room. */
2161         if (prsvec_1.prso == screen_1.scoldr[i__ - 1]) {
2162             screen_1.scolrm = screen_1.scoldr[i__];
2163         }
2164 /* L86600: */
2165     }
2166 /* declare new scolrm. */
2167     cevent_1.ctick[16] = 0;
2168 /* cancel alarm. */
2169     rspeak_(&c__668);
2170 /* disorient him. */
2171     f = moveto_(&c__155, &play_1.winner);
2172 /* back in box room. */
2173     f = rmdesc_(&c__0);
2174     return ret_val;
2175 
2176 /* V87-- Ring */
2177 
2178 L87000:
2179     if (objact_(&x)) {
2180         return ret_val;
2181     }
2182 /* object handle? */
2183     i__ = 359;
2184 /* cant ring. */
2185     if (prsvec_1.prso == 46) {
2186         i__ = 360;
2187     }
2188 /* ding, dong. */
2189     rspeak_(&i__);
2190 /* joke. */
2191     return ret_val;
2192 
2193 /* V88-- Brush */
2194 
2195 L88000:
2196     if (prsvec_1.prso == 256) {
2197         goto L88100;
2198     }
2199 /* brush teeth? */
2200     rspeak_(&c__362);
2201 /* no, joke. */
2202     return ret_val;
2203 
2204 L88100:
2205     if (prsvec_1.prsi != 0) {
2206         goto L88200;
2207     }
2208 /* with something? */
2209     rspeak_(&c__363);
2210 /* no, joke. */
2211     return ret_val;
2212 
2213 L88200:
2214     if (prsvec_1.prsi == 55 && objcts_1.oadv[54] == play_1.winner) {
2215         goto L88300;
2216     }
2217 /* with putty? */
2218     rspsub_(&c__364, &odi2);
2219 /* no, joke. */
2220     return ret_val;
2221 
2222 L88300:
2223     jigsup_(&c__365);
2224 /* yes, dead!!!!! */
2225     return ret_val;
2226 /* VAPPLI, PAGE 18 */
2227 
2228 /* V89-- Dig */
2229 
2230 L89000:
2231     if (prsvec_1.prsi != 96) {
2232         goto L89100;
2233     }
2234 /* shovel? */
2235     ret_val = objact_(&x);
2236 /* must handle. */
2237     return ret_val;
2238 
2239 L89100:
2240     i__ = 392;
2241 /* assume tool. */
2242     if ((objcts_1.oflag1[prsvec_1.prsi - 1] & 4) == 0) {
2243         i__ = 393;
2244     }
2245     rspsub_(&i__, &odi2);
2246     return ret_val;
2247 
2248 /* V90-- Time */
2249 
2250 L90000:
2251     gttime_(&k);
2252 /* get play time. */
2253     i__ = k / 60;
2254     j = k % 60;
2255     glk_put_string("You have been playing Dungeon for ");
2256     if (k == 0) {
2257         glk_put_string("longer than you think.\n");
2258     }
2259     else {
2260         if (i__ != 0) {
2261             weeprintf("%d hour", i__);
2262         }
2263         if (i__ >= 2) {
2264             glk_put_string("s and ");
2265         }
2266         if (i__ == 1) {
2267             glk_put_string(" and ");
2268         }
2269         if (j == 1) {
2270             weeprintf("%d minute.\n", j);
2271         }
2272         if (j != 1) {
2273             weeprintf("%d minutes.\n", j);
2274         }
2275     }
2276     play_1.telflg = TRUE_;
2277     return ret_val;
2278 
2279 
2280 /* V91-- Leap */
2281 
2282 L91000:
2283     if (prsvec_1.prso == 0) {
2284         goto L91200;
2285     }
2286 /* over something? */
2287     if (qhere_(&prsvec_1.prso, &play_1.here)) {
2288         goto L91100;
2289     }
2290 /* here? */
2291     rspeak_(&c__447);
2292 /* no, joke. */
2293     return ret_val;
2294 
2295 L91100:
2296     if ((objcts_1.oflag2[prsvec_1.prso - 1] & 128) == 0) {
2297         goto L91300;
2298     }
2299     rspsub_(&c__448, &odo2);
2300 /* cant jump villain. */
2301     return ret_val;
2302 
2303 L91200:
2304     if (! findxt_(&c__10240, &play_1.here)) {
2305         goto L91300;
2306     }
2307 /* down exit? */
2308     if (curxt_1.xtype == 2) {
2309         goto L91400;
2310     }
2311 /* invalid? */
2312     if (curxt_1.xtype != 3) {
2313         goto L91300;
2314     }
2315 /* conditional? */
2316     if (! findex_flags[(curxt_1.xobj) - 1]) {
2317         goto L91400;
2318     }
2319 /* blocked off? */
2320 L91300:
2321     i__1 = rnd_(&c__5) + 314;
2322     rspeak_(&i__1);
2323 /* wheeee! */
2324     return ret_val;
2325 
2326 L91400:
2327     if (play_1.winner == 1) {
2328         goto L91500;
2329     }
2330 /* tell x, jump? */
2331     jigsup_(&c__452);
2332 /* Geronimo! */
2333     return ret_val;
2334 
2335 L91500:
2336     i__1 = rnd_(&c__4) + 449;
2337     jigsup_(&i__1);
2338 /* fatal leap. */
2339     return ret_val;
2340 /* VAPPLI, PAGE 19 */
2341 
2342 /* V92-- Lock */
2343 
2344 L92000:
2345     if (objact_(&x)) {
2346         return ret_val;
2347     }
2348 /* object handle? */
2349     if (prsvec_1.prso == 65 && ! ((objcts_1.oflag2[c__65 - 1] & 8) != 0) &&
2350             play_1.here == 25) {
2351         goto L92200;
2352     }
2353 /* lock closed grate? */
2354 L92100:
2355     rspeak_(&c__464);
2356 /* not lock grate. */
2357     return ret_val;
2358 
2359 L92200:
2360     findex_1.grunlf = FALSE_;
2361 /* grate now locked. */
2362     rspeak_(&c__214);
2363     exits_1.travel[rooms_1.rexit[play_1.here - 1]] = 214;
2364 /* change exit status. */
2365     return ret_val;
2366 
2367 /* V93-- Unlock */
2368 
2369 L93000:
2370     if (objact_(&x)) {
2371         return ret_val;
2372     }
2373 /* object handle? */
2374     if (prsvec_1.prso != 65 || play_1.here != 25) {
2375         goto L92100;
2376     }
2377 /* not unlock grate. */
2378     if (prsvec_1.prsi == 23) {
2379         goto L93200;
2380     }
2381 /* got keys? */
2382     rspsub_(&c__465, &odi2);
2383 /* no, joke. */
2384     return ret_val;
2385 
2386 L93200:
2387     findex_1.grunlf = TRUE_;
2388 /* unlock grate. */
2389     rspeak_(&c__217);
2390     exits_1.travel[rooms_1.rexit[play_1.here - 1]] = 1041;
2391 /* change exit status. */
2392     return ret_val;
2393 
2394 /* V94-- Diagnose */
2395 
2396 L94000:
2397     i__ = fights_(&play_1.winner, &c_false);
2398 /* get fights strength. */
2399     j = advs_1.astren[play_1.winner - 1];
2400 /* get health. */
2401 /* Computing MIN */
2402     i__1 = i__ + j;
2403     k = min(i__1,4);
2404 /* get state. */
2405     if (! cevent_1.cflag[0]) {
2406         j = 0;
2407     }
2408 /* if no wounds. */
2409 /* Computing MIN */
2410     i__1 = 4, i__2 = abs(j);
2411     l = min(i__1,i__2);
2412 /* scale. */
2413     i__1 = l + 473;
2414     rspeak_(&i__1);
2415 /* describe health. */
2416     i__ = (-j - 1) * 30 + cevent_1.ctick[0];
2417 /* compute wait. */
2418     if (j != 0) {
2419         weeprintf("You will be cured after %d moves.\n", i__);
2420     }
2421     i__1 = k + 478;
2422     rspeak_(&i__1);
2423 /* how much more? */
2424     if (play_1.deaths != 0) {
2425         i__1 = play_1.deaths + 482;
2426         rspeak_(&i__1);
2427     }
2428 /* how many deaths? */
2429     return ret_val;
2430 /* VAPPLI, PAGE 20 */
2431 
2432 /* V95-- Incant */
2433 
2434 L95000:
2435     if (play_1.winner != 1) {
2436         goto L10;
2437     }
2438 /* must do yourself. */
2439     if ((rooms_1.rflag[159] & 32768) != 0) {
2440         goto L95800;
2441     }
2442 /* too late? */
2443     if (input_1.sublnt == 0) {
2444         goto L95350;
2445     }
2446 /* any input? */
2447     s_copy(pw, " ", 8L, 1L);
2448 /* set up parse. */
2449     s_copy(pw + 8, " ", 8L, 1L);
2450     wp = 1;
2451     cp = 1;
2452     i__1 = input_1.sublnt;
2453     for (i__ = 1; i__ <= i__1; ++i__) {
2454 /* scan substring */
2455         if (*(unsigned char *)&input_1.subbuf[i__ - 1] != ' ') {
2456             goto L95150;
2457         }
2458 /* blank? */
2459         if (cp == 1) {
2460             goto L95200;
2461         }
2462 /* anything in word yet? */
2463 /* Computing MIN */
2464         i__2 = 2, i__3 = wp + 1;
2465         wp = min(i__2,i__3);
2466 /* advance word pointer. */
2467         cp = 1;
2468 /* reset char pointer. */
2469         goto L95200;
2470 L95150:
2471         if (cp <= 8) {
2472             *(unsigned char *)&pw[((wp - 1) << 3) + (cp - 1)] = *(unsigned
2473                     char *)&input_1.subbuf[i__ - 1];
2474         }
2475 /* add char to word. */
2476         ++cp;
2477 L95200:
2478         ;
2479     }
2480 
2481     if (s_cmp(pw, " ", 8L, 1L) != 0) {
2482         goto L95400;
2483     }
2484 /* any input? */
2485 L95350:
2486     rspeak_(&c__856);
2487 /* no, ho hum. */
2488 L95375:
2489     prsvec_1.prscon = 0;
2490 /* kill cmd stream. */
2491     return ret_val;
2492 
2493 L95400:
2494     encryp_(pw, ch, 8L, 8L);
2495 /* compute response. */
2496     if (s_cmp(pw + 8, " ", 8L, 1L) != 0) {
2497         goto L95600;
2498     }
2499 
2500 /* two phrases? */
2501     if (findex_1.spellf) {
2502         goto L95550;
2503     }
2504 /* he's trying to learn. */
2505     if ((rooms_1.rflag[157] & 32768) == 0) {
2506         goto L95575;
2507     }
2508 /* really in end game */
2509     findex_1.spellf = TRUE_;
2510 /* tell him. */
2511     play_1.telflg = TRUE_;
2512     glk_put_string("A hollow voice replies: \"");
2513     glk_put_buffer(pw, nblen_(pw, 8L));
2514     glk_put_string(" ");
2515     glk_put_buffer(ch, 8L);
2516     glk_put_string("\".\n");
2517     return ret_val;
2518 
2519 L95550:
2520     rspeak_(&c__857);
2521 /* he's got one already. */
2522     goto L95375;
2523 
2524 L95575:
2525     rspeak_(&c__858);
2526 /* he's not in endgame. */
2527     goto L95375;
2528 
2529 L95600:
2530     encryp_(pw + 8, ch2, 8L, 8L);
2531 /* try both ways. */
2532     if (findex_1.spellf || (s_cmp(pw, ch2, 8L, 8L) != 0 && s_cmp(pw + 8, ch,
2533             8L, 8L) != 0)) {
2534         goto L95900;
2535     }
2536 /* wrong or second use. */
2537     findex_1.spellf = TRUE_;
2538 /* it works. */
2539     rspeak_(&c__859);
2540     cevent_1.cflag[19] = TRUE_;
2541     cevent_1.ctick[19] = 1;
2542 /* force start. */
2543     return ret_val;
2544 
2545 L95800:
2546     rspeak_(&c__855);
2547 /* too late. */
2548     goto L95375;
2549 
2550 L95900:
2551     rspeak_(&c__1052);
2552 /* got it wrong. */
2553     goto L95375;
2554 /* VAPPLI, PAGE 21 */
2555 
2556 /* V96-- Answer */
2557 
2558 L96000:
2559     if (play_1.winner != 1) {
2560         goto L10;
2561     }
2562 /* must answer for himsel */
2563     if (input_1.sublnt == 0) {
2564         goto L96050;
2565     }
2566 /* any substring? */
2567     if (play_1.here == 91 && ! findex_1.riddlf) {
2568         goto L96700;
2569     }
2570 /* riddle room? */
2571     if (play_1.here == 166) {
2572         goto L96100;
2573     }
2574 /* end game front door? */
2575 L96050:
2576     rspeak_(&c__799);
2577 /* no one listens. */
2578     prsvec_1.prscon = 0;
2579 /* kill cmd stream. */
2580     return ret_val;
2581 
2582 L96100:
2583     if (findex_1.inqstf && findex_1.nqatt < 5 && findex_1.corrct < 3) {
2584         goto L96200;
2585     }
2586 /* knocked, didn't lose o */
2587     rspeak_(&c__783);
2588 /* no reply. */
2589     prsvec_1.prscon = 0;
2590 /* kill cmd stream. */
2591     return ret_val;
2592 
2593 L96200:
2594     for (j = 1; j <= 16; ++j) {
2595 /* check answers. */
2596         if (findex_1.quesno != answer[j - 1]) {
2597             goto L96300;
2598         }
2599 /* only check proper ans. */
2600         if (s_cmp(input_1.subbuf, ansstr + (j - 1) * 12, 76L, nblen_(ansstr +
2601                 (j - 1) * 12, 12L)) == 0) {
2602             goto L96500;
2603         }
2604 L96300:
2605         ;
2606     }
2607 
2608     prsvec_1.prscon = 0;
2609 /* kill cmd stream. */
2610     ++findex_1.nqatt;
2611 /* wrong, cretin. */
2612     if (findex_1.nqatt >= 5) {
2613         goto L96400;
2614     }
2615 /* too many wrong? */
2616     i__1 = findex_1.nqatt + 800;
2617     rspeak_(&i__1);
2618 /* no, try again. */
2619     return ret_val;
2620 
2621 L96400:
2622     rspeak_(&c__826);
2623 /* all over. */
2624     cevent_1.cflag[22] = FALSE_;
2625 /* lose. */
2626     return ret_val;
2627 
2628 L96500:
2629     ++findex_1.corrct;
2630 /* got it right. */
2631     rspeak_(&c__800);
2632 /* hooray. */
2633     if (findex_1.corrct >= 3) {
2634         goto L96600;
2635     }
2636 /* won totally? */
2637     cevent_1.cflag[22] = TRUE_;
2638     cevent_1.ctick[22] = 2;
2639 /* no, start again. */
2640     findex_1.quesno = (findex_1.quesno + 3) % 8;
2641     findex_1.nqatt = 0;
2642     rspeak_(&c__769);
2643 /* ask next question. */
2644     i__1 = findex_1.quesno + 770;
2645     rspeak_(&i__1);
2646     return ret_val;
2647 
2648 L96600:
2649     rspeak_(&c__827);
2650 /* quiz over, */
2651     cevent_1.cflag[22] = FALSE_;
2652     objcts_1.oflag2[172] = objcts_1.oflag2[172] | 8;
2653 /* open door. */
2654     return ret_val;
2655 
2656 L96700:
2657     if (s_cmp(input_1.subbuf, "WELL", 76L, 4L) != 0) {
2658         goto L96050;
2659     }
2660 /* right answer? */
2661     findex_1.riddlf = TRUE_;
2662 /* solved riddle. */
2663     rspeak_(&c__338);
2664     return ret_val;
2665 /* V97-- Count (valuables, possessions in VALUAC) */
2666 
2667 L97000:
2668     if (prsvec_1.prso != 51) {
2669         goto L97100;
2670     }
2671 /* matches? */
2672     if (findex_1.ormtch == 1) {
2673         weeprintf("You have %d match.\n", findex_1.ormtch);
2674         /* number of matches */
2675     }
2676 /* print number. */
2677     if (findex_1.ormtch != 1) {
2678         weeprintf("You have %d matches.\n", findex_1.ormtch);
2679         /* number of matches */
2680     }
2681     play_1.telflg = TRUE_;
2682     return ret_val;
2683 
2684 L97100:
2685     i__ = 1062;
2686 /* default. */
2687     if (prsvec_1.prso == 25) {
2688         i__ = 561;
2689     }
2690 /* bag of coins. */
2691     if (prsvec_1.prso == 48) {
2692         i__ = 1058;
2693     }
2694 /* candles. */
2695     if (prsvec_1.prso == 148) {
2696         i__ = 1059;
2697     }
2698 /* stack of bills. */
2699     if (prsvec_1.prso == 18) {
2700         i__ = 1060;
2701     }
2702 /* pile of leaves. */
2703     if (prsvec_1.prso == 263) {
2704         i__ = 1061;
2705     }
2706 /* blessings. */
2707     if (prsvec_1.prso == 120) {
2708         i__ = 1084;
2709     }
2710 /* heads. */
2711     rspeak_(&i__);
2712 /* print response. */
2713     return ret_val;
2714 
2715 } /* vappli_ */
2716 
2717 
2718 
2719 /* TAKE-- Basic take sequence */
2720 
2721 /* Take an object (for verbs take, put, drop, read, etc.) */
2722 
take_(logical * flg)2723 logical take_(logical *flg)
2724 {
2725     /* System generated locals */
2726     integer i__1;
2727     logical ret_val;
2728 
2729     /* Local variables */
2730     integer x;
2731     integer i__;
2732 
2733 
2734 /* Declarations */
2735 
2736 /* TAKE, PAGE 2 */
2737 
2738     if (prsvec_1.prso <= misc_1.strbit && (objcts_1.oflag2[prsvec_1.prso - 1]
2739             & 16) == 0) {
2740         goto L100;
2741     }
2742 /* star or nocheck? */
2743     ret_val = objact_(&x);
2744 /* yes, let it handle. */
2745     return ret_val;
2746 
2747 L100:
2748     ret_val = FALSE_;
2749 /* assume loses. */
2750     x = objcts_1.ocan[prsvec_1.prso - 1];
2751 /* inside? */
2752     if (prsvec_1.prsi == 0 || prsvec_1.prsi == x) {
2753         goto L200;
2754     }
2755 /* take x from ocan(x)? */
2756     rspeak_(&c__1038);
2757 /* not in that. */
2758     return ret_val;
2759 
2760 L200:
2761     if (prsvec_1.prso != advs_1.avehic[play_1.winner - 1]) {
2762         goto L400;
2763     }
2764 /* his vehicle? */
2765     rspeak_(&c__672);
2766 /* dummy. */
2767     return ret_val;
2768 
2769 L400:
2770     if ((objcts_1.oflag1[prsvec_1.prso - 1] & 8192) != 0) {
2771         goto L500;
2772     }
2773 /* takeable? */
2774     if (! oappli_(&objcts_1.oactio[prsvec_1.prso - 1], &c__0)) {
2775         i__1 = rnd_(&c__6) + 552;
2776         rspeak_(&i__1);
2777     }
2778     return ret_val;
2779 
2780 /* Object is takeable and in position to be taken. */
2781 
2782 L500:
2783     if (x != 0 || qhere_(&prsvec_1.prso, &play_1.here)) {
2784         goto L600;
2785     }
2786     i__ = 103;
2787 /* assume player. */
2788     if (play_1.winner != 1) {
2789         i__ = 1080;
2790     }
2791     if (objcts_1.oadv[prsvec_1.prso - 1] == play_1.winner) {
2792         rspeak_(&i__);
2793     }
2794 /* already got it? */
2795     return ret_val;
2796 
2797 L600:
2798     if (x == 0) {
2799         goto L650;
2800     }
2801 /* contained? */
2802     if (objcts_1.oadv[x - 1] == play_1.winner) {
2803         goto L700;
2804     }
2805 /* already carrying cont? */
2806 L650:
2807     if (weighr_(&prsvec_1.prso, &play_1.winner) + objcts_1.osize[
2808             prsvec_1.prso - 1] <= play_1.mxload) {
2809         goto L700;
2810     }
2811 /* can he carry? */
2812     i__ = 558;
2813 /* assume player. */
2814     if (play_1.winner != 1) {
2815         i__ = 1079;
2816     }
2817     rspeak_(&i__);
2818 /* too much weight. */
2819     prsvec_1.prscon = 0;
2820 /* kill cmd stream. */
2821     return ret_val;
2822 
2823 L700:
2824     ret_val = TRUE_;
2825 /* at last. */
2826     if (oappli_(&objcts_1.oactio[prsvec_1.prso - 1], &c__0)) {
2827         return ret_val;
2828     }
2829 /* did it handle? */
2830     newsta_(&prsvec_1.prso, &c__0, &c__0, &c__0, &play_1.winner);
2831 /* take object for winner */
2832     objcts_1.oflag2[prsvec_1.prso - 1] = objcts_1.oflag2[prsvec_1.prso - 1] |
2833             4;
2834 /* has been touched. */
2835     scrupd_(&objcts_1.ofval[prsvec_1.prso - 1]);
2836 /* update score. */
2837     objcts_1.ofval[prsvec_1.prso - 1] = 0;
2838 /* cant be scored again. */
2839     if (*flg) {
2840         rspeak_(&c__559);
2841     }
2842 /* tell taken. */
2843     return ret_val;
2844 
2845 } /* take_ */
2846 
2847 
2848 
2849 /* DROP- Drop verb processor (also throw, pour water) */
2850 
2851 /* Declarations */
2852 
drop_(logical * flg)2853 logical drop_(logical *flg)
2854 {
2855     /* System generated locals */
2856     logical ret_val;
2857 
2858     /* Local variables */
2859     logical f;
2860     integer x;
2861     integer i__;
2862 
2863 
2864     if ((objcts_1.oflag2[prsvec_1.prso - 1] & 16) == 0) {
2865         goto L100;
2866     }
2867     ret_val = objact_(&x);
2868 /* no check, let obj hand */
2869     return ret_val;
2870 
2871 L100:
2872     ret_val = TRUE_;
2873 /* assume wins. */
2874     x = objcts_1.ocan[prsvec_1.prso - 1];
2875 /* get container. */
2876     if (x == 0) {
2877         goto L200;
2878     }
2879 /* is it inside? */
2880     if (objcts_1.oadv[x - 1] != play_1.winner) {
2881         goto L1000;
2882     }
2883 /* is he carrying con? */
2884     if ((objcts_1.oflag2[x - 1] & 8) != 0) {
2885         goto L300;
2886     }
2887 /* is it open? */
2888     rspsub_(&c__525, &objcts_1.odesc2[x - 1]);
2889 /* cant reach. */
2890     return ret_val;
2891 
2892 L200:
2893     if (objcts_1.oadv[prsvec_1.prso - 1] != play_1.winner) {
2894         goto L1000;
2895     }
2896 /* is he carrying obj? */
2897 L300:
2898     if (advs_1.avehic[play_1.winner - 1] == 0) {
2899         goto L400;
2900     }
2901 /* is he in vehicle? */
2902     prsvec_1.prsi = advs_1.avehic[play_1.winner - 1];
2903 /* yes, */
2904     f = put_(&c_true);
2905 /* drop into vehicle. */
2906     prsvec_1.prsi = 0;
2907 /* disarm parser. */
2908     return ret_val;
2909 
2910 /* done. */
2911 L400:
2912     newsta_(&prsvec_1.prso, &c__0, &play_1.here, &c__0, &c__0);
2913 /* drop into room. */
2914     scrupd_(&objcts_1.ofval[prsvec_1.prso - 1]);
2915 /* score object. */
2916     objcts_1.ofval[prsvec_1.prso - 1] = 0;
2917 /* cant be scored again. */
2918     objcts_1.oflag2[prsvec_1.prso - 1] = objcts_1.oflag2[prsvec_1.prso - 1] |
2919             4;
2920 
2921 /* has been touched. */
2922     if (objact_(&x)) {
2923         return ret_val;
2924     }
2925 /* did it handle? */
2926     if (prsvec_1.prsa == 145) {
2927         rspeak_(&c__528);
2928     }
2929     if (prsvec_1.prsa == 148) {
2930         rspeak_(&c__529);
2931     }
2932     return ret_val;
2933 
2934 L1000:
2935     i__ = 527;
2936 /* assume player. */
2937     if (play_1.winner != 1) {
2938         i__ = 1078;
2939     }
2940     rspeak_(&i__);
2941 /* dont have it. */
2942     return ret_val;
2943 
2944 } /* drop_ */
2945 
2946 
2947 
2948 /* PUT- Put verb processor */
2949 
2950 /* Declarations */
2951 
put_(logical * flg)2952 logical put_(logical *flg)
2953 {
2954     /* System generated locals */
2955     logical ret_val;
2956 
2957     /* Local variables */
2958     integer x;
2959     integer j;
2960     integer svi, svo;
2961 
2962 
2963 /* Functions and data */
2964 
2965 /* PUT, PAGE 2 */
2966 
2967     if ((objcts_1.oflag2[prsvec_1.prso - 1] & 16) == 0) {
2968         goto L100;
2969     }
2970     ret_val = objact_(&x);
2971 /* no check, let obj hand */
2972     return ret_val;
2973 
2974 L100:
2975     ret_val = FALSE_;
2976     if (prsvec_1.prso <= misc_1.strbit && prsvec_1.prsi <= misc_1.strbit) {
2977         goto L200;
2978     }
2979     if (! objact_(&x)) {
2980         rspeak_(&c__560);
2981     }
2982 /* star */
2983     ret_val = TRUE_;
2984     return ret_val;
2985 
2986 L200:
2987     if ((objcts_1.oflag2[prsvec_1.prsi - 1] & 8) != 0 || (objcts_1.oflag1[
2988             prsvec_1.prsi - 1] & 4224) != 0 || (objcts_1.oflag2[prsvec_1.prsi
2989             - 1] & 2) != 0) {
2990         goto L300;
2991     }
2992     rspeak_(&c__561);
2993 /* cant put in that. */
2994     return ret_val;
2995 
2996 L300:
2997     if ((objcts_1.oflag2[prsvec_1.prsi - 1] & 8) != 0) {
2998         goto L400;
2999     }
3000 /* is it open? */
3001     rspeak_(&c__562);
3002 /* no, joke */
3003     return ret_val;
3004 
3005 L400:
3006     if (prsvec_1.prso != prsvec_1.prsi) {
3007         goto L500;
3008     }
3009 /* into itself? */
3010     rspeak_(&c__563);
3011 /* yes, joke. */
3012     return ret_val;
3013 
3014 L500:
3015     if (objcts_1.ocan[prsvec_1.prso - 1] != prsvec_1.prsi) {
3016         goto L600;
3017     }
3018 /* already inside. */
3019     rspsb2_(&c__564, &objcts_1.odesc2[prsvec_1.prso - 1], &objcts_1.odesc2[
3020             prsvec_1.prsi - 1]);
3021     ret_val = TRUE_;
3022     return ret_val;
3023 
3024 L600:
3025     if (weighr_(&prsvec_1.prso, &c__0) + weighr_(&prsvec_1.prsi, &c__0) +
3026             objcts_1.osize[prsvec_1.prso - 1] <= objcts_1.ocapac[
3027             prsvec_1.prsi - 1]) {
3028         goto L700;
3029     }
3030 /* not too full? */
3031     if (prsvec_1.prsi != advs_1.avehic[play_1.winner - 1]) {
3032         goto L650;
3033     }
3034 /* into vehicle? */
3035     rspsub_(&c__889, &objcts_1.odesc2[prsvec_1.prsi - 1]);
3036 /* too full. */
3037     return ret_val;
3038 
3039 L650:
3040     rspeak_(&c__565);
3041 /* then cant do it. */
3042     return ret_val;
3043 
3044 /* Now see if object (or its container) is in room */
3045 
3046 L700:
3047     j = prsvec_1.prso;
3048 /* start search. */
3049 L725:
3050     if (qhere_(&j, &play_1.here)) {
3051         goto L750;
3052     }
3053 /* is it here? */
3054     j = objcts_1.ocan[j - 1];
3055     if (j != 0) {
3056         goto L725;
3057     }
3058 /* more to do? */
3059     goto L800;
3060 
3061 /* no, sch fails. */
3062 L750:
3063     if (prsvec_1.prso == 11 || prsvec_1.prso == 273) {
3064         goto L800;
3065     }
3066     svo = prsvec_1.prso;
3067 /* save parser. */
3068     svi = prsvec_1.prsi;
3069     prsvec_1.prsa = 132;
3070     prsvec_1.prsi = 0;
3071     if (! take_(&c_false)) {
3072         return ret_val;
3073     }
3074 /* take object. */
3075     prsvec_1.prsa = 144;
3076     prsvec_1.prso = svo;
3077     prsvec_1.prsi = svi;
3078     goto L1000;
3079 
3080 /* Now see if object is on person. */
3081 
3082 L800:
3083     if (objcts_1.ocan[prsvec_1.prso - 1] == 0) {
3084         goto L1000;
3085     }
3086 /* inside? */
3087     if ((objcts_1.oflag2[objcts_1.ocan[prsvec_1.prso - 1] - 1] & 8) != 0) {
3088         goto L900;
3089     }
3090 /* open? */
3091     rspsub_(&c__566, &objcts_1.odesc2[prsvec_1.prso - 1]);
3092 /* lose. */
3093     return ret_val;
3094 
3095 L900:
3096     scrupd_(&objcts_1.ofval[prsvec_1.prso - 1]);
3097 /* score object. */
3098     objcts_1.ofval[prsvec_1.prso - 1] = 0;
3099     objcts_1.oflag2[prsvec_1.prso - 1] = objcts_1.oflag2[prsvec_1.prso - 1] |
3100             4;
3101 /* has been touched. */
3102     newsta_(&prsvec_1.prso, &c__0, &c__0, &c__0, &play_1.winner);
3103 
3104 /* temporarily on winner. */
3105 L1000:
3106     if (objact_(&x)) {
3107         return ret_val;
3108     }
3109 /* no, give object a shot */
3110     newsta_(&prsvec_1.prso, &c__2, &c__0, &prsvec_1.prsi, &c__0);
3111 /* contained inside. */
3112     ret_val = TRUE_;
3113     return ret_val;
3114 
3115 } /* put_ */
3116 
3117 
3118 
3119 /* VALUAC- Handles valuables/everything/possessions/bunch object */
3120 /*         for take, put, drop, count */
3121 
3122 /* Declarations */
3123 
valuac_(integer * v)3124 /* Subroutine */ int valuac_(integer *v)
3125 {
3126     /* System generated locals */
3127     integer i__1;
3128 
3129     /* Local variables */
3130     logical f, f1;
3131     integer savep, av, k, j, l, saveh, i__;
3132 
3133 /* Functions and data */
3134 
3135 /* VALUAC, PAGE 2 */
3136 /* Count */
3137 
3138     if (prsvec_1.prsa != 97 || prsvec_1.prso != 254) {
3139         goto L100;
3140     }
3141     k = 0;
3142     i__1 = objcts_1.olnt;
3143     for (j = 1; j <= i__1; ++j) {
3144 /* count possessions. */
3145         if (objcts_1.oadv[j - 1] == play_1.winner) {
3146             ++k;
3147         }
3148 /* L50: */
3149     }
3150     if (k == 1) {
3151         weeprintf("You have %d possession.\n", k);
3152     }
3153     if (k != 1) {
3154         weeprintf("You have %d possessions.\n", k);
3155     }
3156     play_1.telflg = TRUE_;
3157     return 0;
3158 
3159 L100:
3160     if (prsvec_1.prsa != 97 || prsvec_1.prso != 253) {
3161         goto L200;
3162     }
3163     k = 0;
3164     l = 0;
3165     i__1 = objcts_1.olnt;
3166     for (j = 1; j <= i__1; ++j) {
3167 /* count treasures. */
3168         if (objcts_1.oadv[j - 1] == play_1.winner && objcts_1.otval[j - 1] >
3169                 0) {
3170             ++k;
3171         }
3172         if (objcts_1.ocan[j - 1] == 9 && objcts_1.otval[j - 1] > 0) {
3173             ++l;
3174         }
3175 /* L150: */
3176     }
3177     if (k == 1) {
3178         weeprintf("You have %d valuable.\n", k);
3179     }
3180     if (k != 1) {
3181         weeprintf("You have %d valuables.\n", k);
3182     }
3183     play_1.telflg = TRUE_;
3184     if (play_1.here != 8) {
3185         return 0;
3186     }
3187     if (l == 1) {
3188         weeprintf("Your adventure has netted %d treasure.\n", l);
3189     }
3190     if (l != 1) {
3191         weeprintf("Your adventure has netted %d treasures.\n", l);
3192     }
3193     return 0;
3194 /* VALUAC, PAGE 3 */
3195 /* Take */
3196 
3197 L200:
3198     savep = prsvec_1.prso;
3199 /* save prso. */
3200     saveh = play_1.here;
3201 /* save here. */
3202     f = TRUE_;
3203 /* assume no actions. */
3204     i__ = 579;
3205 /* assume not lit. */
3206     av = advs_1.avehic[play_1.winner - 1];
3207 
3208 /* get vehicle. */
3209     if (prsvec_1.prsa != 132) {
3210         goto L1000;
3211     }
3212 /* take? */
3213     if (! lit_(&play_1.here)) {
3214         goto L4500;
3215     }
3216 /* if not lit, punt. */
3217     if (prsvec_1.prso != 284 || prssta_1.bunsub != 0) {
3218         goto L400;
3219     }
3220 /* bunch, no except */
3221     i__1 = prssta_1.bunlnt;
3222     for (i__ = 1; i__ <= i__1; ++i__) {
3223 /* loop through bunch. */
3224         prsvec_1.prso = prssta_1.bunvec[i__ - 1];
3225 /* get next item. */
3226         f = FALSE_;
3227         rspsub_(&c__580, &objcts_1.odesc2[prsvec_1.prso - 1]);
3228         f1 = take_(&c_true);
3229         if (saveh != play_1.here) {
3230             goto L4500;
3231         }
3232 /* L300: */
3233     }
3234     goto L4000;
3235 
3236 /* go clean up. */
3237 L400:
3238     i__1 = objcts_1.olnt;
3239     for (prsvec_1.prso = 1; prsvec_1.prso <= i__1; ++prsvec_1.prso) {
3240 /* loop thru objects. */
3241         if (((objcts_1.oflag1[prsvec_1.prso - 1] & 8192) == 0 && (
3242                 objcts_1.oflag2[prsvec_1.prso - 1] & 32) == 0) || (
3243                 objcts_1.oflag1[prsvec_1.prso - 1] & 32768) == 0 || (
3244                 objcts_1.oflag2[prsvec_1.prso - 1] & 1024) != 0 || ((savep ==
3245                 284 && qbunch_(&prsvec_1.prso)) || (objcts_1.otval[
3246                 prsvec_1.prso - 1] <= 0 && (savep == 253 || (savep == 284 &&
3247                 prssta_1.bunsub == 253))) || (objcts_1.oadv[prsvec_1.prso - 1]
3248                  != play_1.winner && (savep == 254 || (savep == 284 &&
3249                 prssta_1.bunsub == 254))))) {
3250             goto L500;
3251         }
3252         if (! ((av == 0 && ! qhere_(&prsvec_1.prso, &play_1.here)) || (av !=
3253                 0 && objcts_1.ocan[prsvec_1.prso - 1] != av))) {
3254             goto L450;
3255         }
3256 /* is it here? */
3257         j = objcts_1.ocan[prsvec_1.prso - 1];
3258 /* get container. */
3259         if (j == 0 || prsvec_1.prso == 11) {
3260             goto L500;
3261         }
3262 /* in a cont? */
3263         if ((objcts_1.oflag2[j - 1] & 8) == 0 || (((av == 0 && ! qhere_(&j, &
3264                 play_1.here)) || (av != 0 && objcts_1.ocan[j - 1] != av)) &&
3265                 objcts_1.oadv[j - 1] != play_1.winner)) {
3266             goto L500;
3267         }
3268 
3269 /* in open cont here? */
3270 L450:
3271         f = FALSE_;
3272         rspsub_(&c__580, &objcts_1.odesc2[prsvec_1.prso - 1]);
3273         f1 = take_(&c_true);
3274         if (saveh != play_1.here) {
3275             goto L4500;
3276         }
3277 L500:
3278         ;
3279     }
3280     goto L4000;
3281 /* VALUAC, PAGE 4 */
3282 /* Drop */
3283 
3284 /* go clean up. */
3285 L1000:
3286     if (prsvec_1.prsa != 145) {
3287         goto L2000;
3288     }
3289 /* drop? */
3290     if (prsvec_1.prso != 284 || prssta_1.bunsub != 0) {
3291         goto L1400;
3292     }
3293 /* bunch, no excep */
3294     i__1 = prssta_1.bunlnt;
3295     for (i__ = 1; i__ <= i__1; ++i__) {
3296 /* loop through bunch. */
3297         prsvec_1.prso = prssta_1.bunvec[i__ - 1];
3298 /* get next item. */
3299         f = FALSE_;
3300         rspsub_(&c__580, &objcts_1.odesc2[prsvec_1.prso - 1]);
3301         f1 = drop_(&c_true);
3302         if (saveh != play_1.here) {
3303             goto L4500;
3304         }
3305 /* L1300: */
3306     }
3307     goto L4000;
3308 
3309 /* go clean up. */
3310 L1400:
3311     i__1 = objcts_1.olnt;
3312     for (prsvec_1.prso = 1; prsvec_1.prso <= i__1; ++prsvec_1.prso) {
3313 /* loop through inventory */
3314         if (objcts_1.oadv[prsvec_1.prso - 1] != play_1.winner || ((savep ==
3315                 284 && qbunch_(&prsvec_1.prso)) || (objcts_1.otval[
3316                 prsvec_1.prso - 1] <= 0 && (savep == 253 || (savep == 284 &&
3317                 prssta_1.bunsub == 253))) || (objcts_1.oadv[prsvec_1.prso - 1]
3318                  != play_1.winner && (savep == 254 || (savep == 284 &&
3319                 prssta_1.bunsub == 254))))) {
3320             goto L1500;
3321         }
3322         f = FALSE_;
3323         rspsub_(&c__580, &objcts_1.odesc2[prsvec_1.prso - 1]);
3324         f1 = drop_(&c_true);
3325         if (saveh != play_1.here) {
3326             goto L4500;
3327         }
3328 L1500:
3329         ;
3330     }
3331     goto L4000;
3332 /* VALUAC, PAGE 5 */
3333 /* Put */
3334 
3335 /* go clean up. */
3336 L2000:
3337     if (prsvec_1.prsa != 144) {
3338         goto L3000;
3339     }
3340 /* put? */
3341     if (! lit_(&play_1.here)) {
3342         goto L4500;
3343     }
3344 /* if not lit, punt. */
3345     if (prsvec_1.prso != 284 || prssta_1.bunsub != 0) {
3346         goto L2400;
3347     }
3348 /* bunch, no excep */
3349     i__1 = prssta_1.bunlnt;
3350     for (i__ = 1; i__ <= i__1; ++i__) {
3351 /* loop through bunch. */
3352         prsvec_1.prso = prssta_1.bunvec[i__ - 1];
3353 /* get next item. */
3354         f = FALSE_;
3355         rspsub_(&c__580, &objcts_1.odesc2[prsvec_1.prso - 1]);
3356         f1 = put_(&c_true);
3357         if (saveh != play_1.here) {
3358             goto L4500;
3359         }
3360 /* L2300: */
3361     }
3362     goto L4000;
3363 
3364 /* go clean up. */
3365 L2400:
3366     i__1 = objcts_1.olnt;
3367     for (prsvec_1.prso = 1; prsvec_1.prso <= i__1; ++prsvec_1.prso) {
3368 /* loop thru objects. */
3369         if ((objcts_1.oadv[prsvec_1.prso - 1] != play_1.winner && ((av == 0 &&
3370                  ! qhere_(&prsvec_1.prso, &play_1.here)) || (av != 0 &&
3371                 objcts_1.ocan[prsvec_1.prso - 1] != av) || ((objcts_1.oflag1[
3372                 prsvec_1.prso - 1] & 8192) == 0 && (objcts_1.oflag2[
3373                 prsvec_1.prso - 1] & 32) == 0))) || prsvec_1.prso ==
3374                 prsvec_1.prsi || ((savep == 284 && qbunch_(&prsvec_1.prso)) ||
3375                  (objcts_1.otval[prsvec_1.prso - 1] <= 0 && (savep == 253 || (
3376                 savep == 284 && prssta_1.bunsub == 253))) || (objcts_1.oadv[
3377                 prsvec_1.prso - 1] != play_1.winner && (savep == 254 || (
3378                 savep == 284 && prssta_1.bunsub == 254)))) || (
3379                 objcts_1.oflag1[prsvec_1.prso - 1] & 32768) == 0) {
3380             goto L2500;
3381         }
3382         f = FALSE_;
3383         rspsub_(&c__580, &objcts_1.odesc2[prsvec_1.prso - 1]);
3384         f1 = put_(&c_true);
3385         if (saveh != play_1.here) {
3386             goto L4500;
3387         }
3388 L2500:
3389         ;
3390     }
3391     goto L4000;
3392 
3393 /* Wrong verb. */
3394 
3395 /* go clean up. */
3396 L3000:
3397     i__ = 677;
3398 /* wrong verb. */
3399     goto L4500;
3400 
3401 /* Clean up. */
3402 
3403 L4000:
3404     i__ = 581;
3405 /* right verb, choose */
3406     if (savep == 253) {
3407         i__ = 582;
3408     }
3409 /* nothing happened messa */
3410 L4500:
3411     if (f) {
3412         rspeak_(&i__);
3413     }
3414 /* not lit, nothing, wron */
3415     prsvec_1.prso = savep;
3416 /* restore PRSO. */
3417     prssta_1.bunsub = 0;
3418 /* cancel EXCEPT/BUT. */
3419     return 0;
3420 } /* valuac_ */
3421 
3422 
3423 
3424 /* QBUNCH-       Is object in bunch vector? */
3425 
3426 /* Declarations */
3427 
qbunch_(integer * obj)3428 logical qbunch_(integer *obj)
3429 {
3430     /* System generated locals */
3431     integer i__1;
3432     logical ret_val;
3433 
3434     /* Local variables */
3435     integer i__;
3436 
3437 
3438     if (prssta_1.bunlnt == 0) {
3439         goto L200;
3440     }
3441 /* bunch vector empty? */
3442     ret_val = TRUE_;
3443 /* assume found. */
3444     i__1 = prssta_1.bunlnt;
3445     for (i__ = 1; i__ <= i__1; ++i__) {
3446 /* search bunch vector. */
3447         if (*obj == prssta_1.bunvec[i__ - 1]) {
3448             return ret_val;
3449         }
3450 /* got one. */
3451 /* L100: */
3452     }
3453 L200:
3454     ret_val = FALSE_;
3455 /* not found. */
3456     return ret_val;
3457 
3458 } /* qbunch_ */
3459 
3460 
3461 
3462 /* SAVE- Save game state */
3463 
3464 /* Declarations */
3465 
savegm_(void)3466 /* Subroutine */ int savegm_(void)
3467 {
3468     /* System generated locals */
3469     integer i__1;
3470     frefid_t savefileref;
3471     strid_t savefile;
3472 
3473     /* Local variables */
3474     integer i__;
3475 
3476     if (input_1.sublnt == 0) {
3477         savefileref = glk_fileref_create_by_prompt(fileusage_SavedGame|fileusage_BinaryMode,
3478             filemode_Write, 0);
3479     }
3480     else {
3481         char namebuf[128];
3482         for (i__ = 0; i__ < input_1.sublnt; i__++)
3483             namebuf[i__] = input_1.subbuf[i__];
3484         namebuf[input_1.sublnt] = '\0';
3485         savefileref = glk_fileref_create_by_name(fileusage_SavedGame|fileusage_BinaryMode,
3486             namebuf, 0);
3487     }
3488     if (!savefileref) {
3489         goto L100;
3490     }
3491     savefile = glk_stream_open_file(savefileref, filemode_Write, 0);
3492     glk_fileref_destroy(savefileref);
3493     if (!savefile) {
3494         goto L100;
3495     }
3496 
3497     gttime_(&i__); /* get amount of play time. */
3498 
3499     f_put_ints(savefile, &misc_1.vmaj, 1);
3500     f_put_ints(savefile, &misc_1.vmin, 1);
3501 
3502     f_put_ints(savefile, &play_1.winner, 1);
3503     f_put_ints(savefile, &play_1.here, 1);
3504     f_put_ints(savefile, &hack_1.thfpos, 1);
3505     f_put_logicals(savefile, &play_1.telflg, 1);
3506     f_put_logicals(savefile, &hack_1.thfflg, 1);
3507     f_put_logicals(savefile, &hack_1.thfact, 1);
3508     f_put_logicals(savefile, &hack_1.swdact, 1);
3509     f_put_ints(savefile, &hack_1.swdsta, 1);
3510     f_put_ints(savefile, &puzzle_1.cpvec[0], 64);
3511 
3512     f_put_ints(savefile, &i__, 1);
3513     f_put_ints(savefile, &play_1.moves, 1);
3514     f_put_ints(savefile, &play_1.deaths, 1);
3515     f_put_ints(savefile, &play_1.rwscor, 1);
3516     f_put_ints(savefile, &play_1.egscor, 1);
3517     f_put_ints(savefile, &play_1.mxload, 1);
3518     f_put_ints(savefile, &play_1.ltshft, 1);
3519     f_put_ints(savefile, &play_1.bloc, 1);
3520     f_put_ints(savefile, &play_1.mungrm, 1);
3521     f_put_ints(savefile, &play_1.hs, 1);
3522     f_put_ints(savefile, &screen_1.fromdr, 1);
3523     f_put_ints(savefile, &screen_1.scolrm, 1);
3524     f_put_ints(savefile, &screen_1.scolac, 1);
3525 
3526     f_put_ints(savefile, &objcts_1.odesc1[0], 300);
3527     f_put_ints(savefile, &objcts_1.odesc2[0], 300);
3528     f_put_ints(savefile, &objcts_1.oflag1[0], 300);
3529     f_put_ints(savefile, &objcts_1.oflag2[0], 300);
3530     f_put_ints(savefile, &objcts_1.ofval[0], 300);
3531     f_put_ints(savefile, &objcts_1.otval[0], 300);
3532     f_put_ints(savefile, &objcts_1.osize[0], 300);
3533     f_put_ints(savefile, &objcts_1.ocapac[0], 300);
3534     f_put_ints(savefile, &objcts_1.oroom[0], 300);
3535     f_put_ints(savefile, &objcts_1.oadv[0], 300);
3536     f_put_ints(savefile, &objcts_1.ocan[0], 300);
3537 
3538     f_put_ints(savefile, &rooms_1.rdesc1[0], 200);
3539     f_put_ints(savefile, &rooms_1.rval[0], 200);
3540     f_put_ints(savefile, &rooms_1.rflag[0], 200);
3541     f_put_ints(savefile, &exits_1.travel[0], 1000);
3542 
3543     f_put_ints(savefile, &advs_1.aroom[0], 4);
3544     f_put_ints(savefile, &advs_1.ascore[0], 4);
3545     f_put_ints(savefile, &advs_1.avehic[0], 4);
3546     f_put_ints(savefile, &advs_1.astren[0], 4);
3547     f_put_ints(savefile, &advs_1.aflag[0], 4);
3548 
3549     f_put_logicals(savefile, findex_flags, 56);
3550     f_put_ints(savefile, findex_switches, 24);
3551     f_put_ints(savefile, &vill_1.vprob[0], 4);
3552     f_put_logicals(savefile, &cevent_1.cflag[0], 30);
3553     f_put_ints(savefile, &cevent_1.ctick[0], 30);
3554     f_put_logicals(savefile, &cevent_1.ccncel[0], 30);
3555 
3556     rspeak_(&c__597);
3557 
3558     glk_stream_close(savefile, NULL);
3559     return 0;
3560 
3561 L100:
3562     rspeak_(&c__598);
3563 /* cant do it. */
3564     return 0;
3565 } /* savegm_ */
3566 
3567 
3568 
3569 /* RESTORE- Restore game state */
3570 
3571 /* Declarations */
3572 
rstrgm_(void)3573 /* Subroutine */ int rstrgm_(void)
3574 {
3575     /* System generated locals */
3576     integer i__1;
3577     frefid_t savefileref;
3578     strid_t savefile;
3579 
3580     /* Local variables */
3581     integer i__, j;
3582 
3583 
3584     if (input_1.sublnt == 0) {
3585         savefileref = glk_fileref_create_by_prompt(fileusage_SavedGame|fileusage_BinaryMode,
3586             filemode_Read, 0);
3587     }
3588     else {
3589         char namebuf[128];
3590         for (i__ = 0; i__ < input_1.sublnt; i__++)
3591             namebuf[i__] = input_1.subbuf[i__];
3592         namebuf[input_1.sublnt] = '\0';
3593         savefileref = glk_fileref_create_by_name(fileusage_SavedGame|fileusage_BinaryMode,
3594             namebuf, 0);
3595     }
3596     if (!savefileref) {
3597         goto L100;
3598     }
3599     savefile = glk_stream_open_file(savefileref, filemode_Read, 0);
3600     glk_fileref_destroy(savefileref);
3601     if (!savefile) {
3602         goto L100;
3603     }
3604 
3605     f_get_ints(savefile, &i__, 1);
3606     f_get_ints(savefile, &j, 1);
3607     if (i__ != misc_1.vmaj || j != misc_1.vmin) {
3608         goto L200;
3609     }
3610 
3611     f_get_ints(savefile, &play_1.winner, 1);
3612     f_get_ints(savefile, &play_1.here, 1);
3613     f_get_ints(savefile, &hack_1.thfpos, 1);
3614     f_get_logicals(savefile, &play_1.telflg, 1);
3615     f_get_logicals(savefile, &hack_1.thfflg, 1);
3616     f_get_logicals(savefile, &hack_1.thfact, 1);
3617     f_get_logicals(savefile, &hack_1.swdact, 1);
3618     f_get_ints(savefile, &hack_1.swdsta, 1);
3619     f_get_ints(savefile, &puzzle_1.cpvec[0], 64);
3620 
3621     f_get_ints(savefile, &misc_1.pltime, 1);
3622     f_get_ints(savefile, &play_1.moves, 1);
3623     f_get_ints(savefile, &play_1.deaths, 1);
3624     f_get_ints(savefile, &play_1.rwscor, 1);
3625     f_get_ints(savefile, &play_1.egscor, 1);
3626     f_get_ints(savefile, &play_1.mxload, 1);
3627     f_get_ints(savefile, &play_1.ltshft, 1);
3628     f_get_ints(savefile, &play_1.bloc, 1);
3629     f_get_ints(savefile, &play_1.mungrm, 1);
3630     f_get_ints(savefile, &play_1.hs, 1);
3631     f_get_ints(savefile, &screen_1.fromdr, 1);
3632     f_get_ints(savefile, &screen_1.scolrm, 1);
3633     f_get_ints(savefile, &screen_1.scolac, 1);
3634 
3635     f_get_ints(savefile, &objcts_1.odesc1[0], 300);
3636     f_get_ints(savefile, &objcts_1.odesc2[0], 300);
3637     f_get_ints(savefile, &objcts_1.oflag1[0], 300);
3638     f_get_ints(savefile, &objcts_1.oflag2[0], 300);
3639     f_get_ints(savefile, &objcts_1.ofval[0], 300);
3640     f_get_ints(savefile, &objcts_1.otval[0], 300);
3641     f_get_ints(savefile, &objcts_1.osize[0], 300);
3642     f_get_ints(savefile, &objcts_1.ocapac[0], 300);
3643     f_get_ints(savefile, &objcts_1.oroom[0], 300);
3644     f_get_ints(savefile, &objcts_1.oadv[0], 300);
3645     f_get_ints(savefile, &objcts_1.ocan[0], 300);
3646 
3647     f_get_ints(savefile, &rooms_1.rdesc1[0], 200);
3648     f_get_ints(savefile, &rooms_1.rval[0], 200);
3649     f_get_ints(savefile, &rooms_1.rflag[0], 200);
3650     f_get_ints(savefile, &exits_1.travel[0], 1000);
3651 
3652     f_get_ints(savefile, &advs_1.aroom[0], 4);
3653     f_get_ints(savefile, &advs_1.ascore[0], 4);
3654     f_get_ints(savefile, &advs_1.avehic[0], 4);
3655     f_get_ints(savefile, &advs_1.astren[0], 4);
3656     f_get_ints(savefile, &advs_1.aflag[0], 4);
3657 
3658     f_get_logicals(savefile, findex_flags, 56);
3659     f_get_ints(savefile, findex_switches, 24);
3660     f_get_ints(savefile, &vill_1.vprob[0], 4);
3661     f_get_logicals(savefile, &cevent_1.cflag[0], 30);
3662     f_get_ints(savefile, &cevent_1.ctick[0], 30);
3663     f_get_logicals(savefile, &cevent_1.ccncel[0], 30);
3664 
3665     advs_1.aactio[0] = 0;
3666 
3667     rspeak_(&c__599);
3668 
3669     glk_stream_close(savefile, NULL);
3670     return 0;
3671 
3672 L100:
3673     rspeak_(&c__598);
3674 /* cant do it. */
3675     return 0;
3676 
3677 L200:
3678     rspeak_(&c__600); /* obsolete version */
3679 
3680     glk_stream_close(savefile, NULL);
3681     return 0;
3682 } /* rstrgm_ */
3683 
3684 
3685 
3686 /* WALK- Move in specified direction */
3687 
3688 /* Declarations */
3689 
walk_(integer * x)3690 logical walk_(integer *x)
3691 {
3692     /* System generated locals */
3693     logical ret_val;
3694 
3695     /* Local variables */
3696 
3697 
3698 /* Functions and data */
3699 
3700 /* WALK, PAGE 2 */
3701 
3702     ret_val = TRUE_;
3703 /* assume wins. */
3704     if (play_1.winner != 1 || lit_(&play_1.here) || prob_(&c__25, &c__25)) {
3705         goto L500;
3706     }
3707     if (! findxt_(&prsvec_1.prso, &play_1.here)) {
3708         goto L450;
3709     }
3710 /* invalid exit? grue! */
3711     switch (curxt_1.xtype) {
3712         case 1:  goto L400;
3713         case 2:  goto L200;
3714         case 3:  goto L100;
3715         case 4:  goto L300;
3716     }
3717 /* decode exit type. */
3718     bug_(&c__9, &curxt_1.xtype);
3719 
3720 L100:
3721     if (cxappl_(&curxt_1.xactio) != 0) {
3722         goto L400;
3723     }
3724 /* cexit... returned room */
3725     if (findex_flags[(curxt_1.xobj) - 1]) {
3726         goto L400;
3727     }
3728 /* no, flag on? */
3729 L200:
3730     jigsup_(&c__523);
3731 /* bad exit, grue! */
3732     return ret_val;
3733 
3734 L300:
3735     if (cxappl_(&curxt_1.xactio) != 0) {
3736         goto L400;
3737     }
3738 /* door... returned room? */
3739     if ((objcts_1.oflag2[curxt_1.xobj - 1] & 8) != 0) {
3740         goto L400;
3741     }
3742 /* no, door open? */
3743     jigsup_(&c__523);
3744 /* bad exit, grue! */
3745     return ret_val;
3746 
3747 L400:
3748     if (lit_(&curxt_1.xroom1)) {
3749         goto L900;
3750     }
3751 /* valid room, is it lit? */
3752 L450:
3753     jigsup_(&c__522);
3754 /* no, grue! */
3755     return ret_val;
3756 
3757 /* Room is lit, or winner is not player (no grue). */
3758 
3759 L500:
3760     if (findxt_(&prsvec_1.prso, &play_1.here)) {
3761         goto L550;
3762     }
3763 /* exit exist? */
3764 L525:
3765     curxt_1.xstrng = 678;
3766 /* assume wall. */
3767     if (prsvec_1.prso == 9216) {
3768         curxt_1.xstrng = 679;
3769     }
3770 /* if up, cant. */
3771     if (prsvec_1.prso == 10240) {
3772         curxt_1.xstrng = 680;
3773     }
3774 /* if down, cant. */
3775     if ((rooms_1.rflag[play_1.here - 1] & 32) != 0 && play_1.winner == 1) {
3776         curxt_1.xstrng = 524;
3777     }
3778 /* no wall for player. */
3779     rspeak_(&curxt_1.xstrng);
3780     prsvec_1.prscon = 0;
3781 /* stop cmd stream. */
3782     return ret_val;
3783 
3784 L550:
3785     switch (curxt_1.xtype) {
3786         case 1:  goto L900;
3787         case 2:  goto L600;
3788         case 3:  goto L700;
3789         case 4:  goto L800;
3790     }
3791 /* branch on exit type. */
3792     bug_(&c__9, &curxt_1.xtype);
3793 
3794 L700:
3795     if (cxappl_(&curxt_1.xactio) != 0) {
3796         goto L900;
3797     }
3798 /* cexit... returned room */
3799     if (findex_flags[(curxt_1.xobj) - 1]) {
3800         goto L900;
3801     }
3802 /* no, flag on? */
3803 L600:
3804     if (curxt_1.xstrng == 0) {
3805         goto L525;
3806     }
3807 /* if no reason, use std. */
3808     rspeak_(&curxt_1.xstrng);
3809 /* deny exit. */
3810     prsvec_1.prscon = 0;
3811 /* stop cmd stream. */
3812     return ret_val;
3813 
3814 L800:
3815     if (cxappl_(&curxt_1.xactio) != 0) {
3816         goto L900;
3817     }
3818 /* door... returned room? */
3819     if ((objcts_1.oflag2[curxt_1.xobj - 1] & 8) != 0) {
3820         goto L900;
3821     }
3822 /* no, door open? */
3823     if (curxt_1.xstrng == 0) {
3824         curxt_1.xstrng = 525;
3825     }
3826 /* if no reason, use std. */
3827     rspsub_(&curxt_1.xstrng, &objcts_1.odesc2[curxt_1.xobj - 1]);
3828     prsvec_1.prscon = 0;
3829 /* stop cmd stream. */
3830     return ret_val;
3831 
3832 L900:
3833     ret_val = moveto_(&curxt_1.xroom1, &play_1.winner);
3834 /* move to room. */
3835     if (ret_val) {
3836         ret_val = rmdesc_(&c__0);
3837     }
3838 /* describe room. */
3839     return ret_val;
3840 } /* walk_ */
3841 
3842 
3843 
3844 /* CXAPPL- Conditional exit processors */
3845 
3846 /* Declarations */
3847 
cxappl_(integer * ri)3848 integer cxappl_(integer *ri)
3849 {
3850     /* System generated locals */
3851     integer ret_val, i__1, i__2;
3852 
3853     /* Local variables */
3854     integer i__, j, ldir;
3855     integer k;
3856     integer nxt;
3857 
3858 
3859     ret_val = 0;
3860 /* no return. */
3861     if (*ri == 0) {
3862         return ret_val;
3863     }
3864 /* if no action, done. */
3865     switch (*ri) {
3866         case 1:  goto L1000;
3867         case 2:  goto L2000;
3868         case 3:  goto L3000;
3869         case 4:  goto L4000;
3870         case 5:  goto L5000;
3871         case 6:  goto L6000;
3872         case 7:  goto L7000;
3873         case 8:  goto L8000;
3874         case 9:  goto L9000;
3875         case 10:  goto L10000;
3876         case 11:  goto L11000;
3877         case 12:  goto L12000;
3878         case 13:  goto L13000;
3879         case 14:  goto L14000;
3880         case 15:  goto L15000;
3881     }
3882     bug_(&c__5, ri);
3883 /* CXAPPL, PAGE 2 */
3884 
3885 /* C1-   Coffin-cure */
3886 
3887 L1000:
3888     findex_1.egyptf = objcts_1.oadv[32] != play_1.winner;
3889 /* t if no coffin. */
3890     return ret_val;
3891 
3892 /* C2-   Carousel exit */
3893 /* C5-   Carousel out */
3894 
3895 L2000:
3896     if (findex_1.caroff) {
3897         return ret_val;
3898     }
3899 /* if flipped, nothing. */
3900 L2500:
3901     rspeak_(&c__121);
3902 /* can't tell directions. */
3903 L5000:
3904     i__ = curxt_1.xelnt[2] * rnd_(&c__8);
3905 /* choose random exit. */
3906     curxt_1.xroom1 = exits_1.travel[rooms_1.rexit[play_1.here - 1] + i__ - 1]
3907             & 255;
3908     ret_val = curxt_1.xroom1;
3909 /* return exit. */
3910     return ret_val;
3911 
3912 /* C3-   Chimney function */
3913 
3914 L3000:
3915     findex_1.litldf = FALSE_;
3916 /* assume heavy load. */
3917     if (findex_1.deadf) {
3918         goto L3300;
3919     }
3920 /* if dead, always ok. */
3921     j = 0;
3922     i__1 = objcts_1.olnt;
3923     for (i__ = 1; i__ <= i__1; ++i__) {
3924 /* count objects. */
3925         if (objcts_1.oadv[i__ - 1] == play_1.winner) {
3926             ++j;
3927         }
3928 /* L3100: */
3929     }
3930 
3931     if (j > 2) {
3932         return ret_val;
3933     }
3934 /* carrying too much? */
3935     if (j != 0) {
3936         goto L3200;
3937     }
3938 /* carrying too little? */
3939     curxt_1.xstrng = 890;
3940 /* bad idea. */
3941     return ret_val;
3942 
3943 L3200:
3944     if (objcts_1.oadv[14] == play_1.winner) {
3945         goto L3300;
3946     }
3947 /* no lamp? */
3948     curxt_1.xstrng = 446;
3949 /* bad idea. */
3950     return ret_val;
3951 
3952 L3300:
3953     findex_1.litldf = TRUE_;
3954 /* he can do it. */
3955     if ((objcts_1.oflag2[65] & 8) == 0) {
3956         objcts_1.oflag2[65] = objcts_1.oflag2[65] & -5;
3957     }
3958     return ret_val;
3959 
3960 /* C4-   Frobozz flag (Magnet Room, fake exit) */
3961 /* C6-   Frobozz flag (Magnet Room, real exit) */
3962 
3963 L4000:
3964     if (findex_1.caroff) {
3965         goto L2500;
3966     }
3967 /* if flipped, go spin. */
3968     findex_1.frobzf = FALSE_;
3969 /* otherwise, not an exit */
3970     return ret_val;
3971 
3972 L6000:
3973     if (findex_1.caroff) {
3974         goto L2500;
3975     }
3976 /* if flipped, go spin. */
3977     findex_1.frobzf = TRUE_;
3978 /* otherwise, an exit. */
3979     return ret_val;
3980 /* CXAPPL, PAGE 3 */
3981 
3982 /* C7-   Frobozz flag (bank alarm) */
3983 
3984 L7000:
3985     findex_1.frobzf = FALSE_;
3986 /* assume fails. */
3987     j = 148;
3988 /* check for bills. */
3989 L7100:
3990     if (objcts_1.oadv[j - 1] == play_1.winner) {
3991         return ret_val;
3992     }
3993 /* winner's got it, fail. */
3994     j = objcts_1.ocan[j - 1];
3995 /* get container. */
3996     if (j != 0) {
3997         goto L7100;
3998     }
3999 /* if inside, loop */
4000     j = 149;
4001 /* check for portrait. */
4002 L7200:
4003     if (objcts_1.oadv[j - 1] == play_1.winner) {
4004         return ret_val;
4005     }
4006 /* winner's got it, fail. */
4007     j = objcts_1.ocan[j - 1];
4008 /* get container. */
4009     if (j != 0) {
4010         goto L7200;
4011     }
4012 /* if inside, loop */
4013     findex_1.frobzf = TRUE_;
4014 /* wins. */
4015     return ret_val;
4016 
4017 /* C8-   Frobozz flag (MRGO) */
4018 
4019 L8000:
4020     findex_1.frobzf = FALSE_;
4021 /* assume cant move. */
4022     if (findex_1.mloc != curxt_1.xroom1) {
4023         goto L8100;
4024     }
4025 /* mirror in way? */
4026     if (prsvec_1.prso == 1024 || prsvec_1.prso == 5120) {
4027         goto L8200;
4028     }
4029     if (findex_1.mdir % 180 != 0) {
4030         goto L8300;
4031     }
4032 /* mirror must be n-s. */
4033     curxt_1.xroom1 = ((curxt_1.xroom1 - 161) << 1) + 167;
4034 /* calc east room. */
4035     if (prsvec_1.prso > 5120) {
4036         ++curxt_1.xroom1;
4037     }
4038 /* if sw/nw, calc west. */
4039 L8100:
4040     ret_val = curxt_1.xroom1;
4041     return ret_val;
4042 
4043 L8200:
4044     curxt_1.xstrng = 814;
4045 /* assume struc blocks. */
4046     if (findex_1.mdir % 180 == 0) {
4047         return ret_val;
4048     }
4049 /* if mirror n-s, done. */
4050 L8300:
4051     ldir = findex_1.mdir;
4052 /* see which mirror. */
4053     if (prsvec_1.prso == 5120) {
4054         ldir = 180;
4055     }
4056     curxt_1.xstrng = 815;
4057 /* mirror blocks. */
4058     if ((ldir > 180 && ! findex_1.mr1f) || (ldir < 180 && ! findex_1.mr2f)) {
4059         curxt_1.xstrng = 816;
4060     }
4061 /* mirror broken. */
4062     return ret_val;
4063 
4064 /* C9-   Frobozz flag (MIRIN) */
4065 
4066 L9000:
4067     if (mrhere_(&play_1.here) != 1) {
4068         goto L9100;
4069     }
4070 /* mirror 1 here? */
4071     if (findex_1.mr1f) {
4072         curxt_1.xstrng = 805;
4073     }
4074 /* see if broken. */
4075     findex_1.frobzf = findex_1.mropnf;
4076 /* enter if open. */
4077     return ret_val;
4078 
4079 L9100:
4080     findex_1.frobzf = FALSE_;
4081 /* not here, */
4082     curxt_1.xstrng = 817;
4083 /* lose. */
4084     return ret_val;
4085 /* CXAPPL, PAGE 4 */
4086 
4087 /* C10-  Frobozz flag (mirror exit) */
4088 
4089 L10000:
4090     findex_1.frobzf = FALSE_;
4091 /* assume cant. */
4092     ldir = (prsvec_1.prso - 1024) / 1024 * 45;
4093 /* xlate dir to degrees. */
4094     if (! findex_1.mropnf || ((findex_1.mdir + 270) % 360 != ldir &&
4095             prsvec_1.prso != 14336)) {
4096         goto L10200;
4097     }
4098 /* exit via mirror? */
4099     curxt_1.xroom1 = ((findex_1.mloc - 161) << 1) + 168 - findex_1.mdir / 180;
4100 /* assume e-w exit. */
4101     if (findex_1.mdir % 180 == 0) {
4102         goto L10100;
4103     }
4104 /* if n-s, ok. */
4105     curxt_1.xroom1 = findex_1.mloc + 1;
4106 /* assume n exit. */
4107     if (findex_1.mdir > 180) {
4108         curxt_1.xroom1 = findex_1.mloc - 1;
4109     }
4110 /* if south. */
4111 L10100:
4112     ret_val = curxt_1.xroom1;
4113     return ret_val;
4114 
4115 L10200:
4116     if (! findex_1.wdopnf || ((findex_1.mdir + 180) % 360 != ldir &&
4117             prsvec_1.prso != 14336)) {
4118         return ret_val;
4119     }
4120 /* exit via open door? */
4121     curxt_1.xroom1 = findex_1.mloc + 1;
4122 /* assume n. */
4123     if (findex_1.mdir == 0) {
4124         curxt_1.xroom1 = findex_1.mloc - 1;
4125     }
4126 /* if s. */
4127     rspeak_(&c__818);
4128 /* close door. */
4129     findex_1.wdopnf = FALSE_;
4130     ret_val = curxt_1.xroom1;
4131     return ret_val;
4132 
4133 /* C11-  Maybe door.  Normal message is that door is closed. */
4134 /*       But if LCELL.NE.4, door isn't there. */
4135 
4136 L11000:
4137     if (findex_1.lcell != 4) {
4138         curxt_1.xstrng = 678;
4139     }
4140 /* set up msg. */
4141     return ret_val;
4142 
4143 /* C12-  Frobozz flag (Puzzle Room main entrance) */
4144 
4145 L12000:
4146     findex_1.cphere = 10;
4147 /* set substate. */
4148     findex_1.frobzf = puzzle_1.cpvec[findex_1.cphere - 1] == 0;
4149 /* enter if not blocked. */
4150     return ret_val;
4151 
4152 /* C13-  CPOUTF (Puzzle Room size entrance) */
4153 
4154 L13000:
4155     findex_1.cphere = 52;
4156 /* set substate. */
4157     return ret_val;
4158 /* CXAPPL, PAGE 5 */
4159 
4160 /* C14-  Frobozz flag (Puzzle Room transitions) */
4161 
4162 L14000:
4163     findex_1.frobzf = FALSE_;
4164 /* asssume lose. */
4165     if (prsvec_1.prso != 9216) {
4166         goto L14100;
4167     }
4168 /* up? */
4169     if (findex_1.cphere != 10) {
4170         return ret_val;
4171     }
4172 /* at exit? */
4173     curxt_1.xstrng = 881;
4174 /* assume no ladder. */
4175     if (puzzle_1.cpvec[findex_1.cphere] != -2) {
4176         return ret_val;
4177     }
4178 /* ladder here? */
4179     rspeak_(&c__882);
4180 /* you win. */
4181     rooms_1.rflag[189] = rooms_1.rflag[189] & -32769;
4182 /* reset seen. */
4183     findex_1.frobzf = TRUE_;
4184 /* let him out. */
4185     return ret_val;
4186 
4187 L14100:
4188     if (findex_1.cphere != 52 || prsvec_1.prso != 7168 || ! findex_1.cpoutf) {
4189         goto L14200;
4190     }
4191 /* w exit at door? */
4192     rooms_1.rflag[189] = rooms_1.rflag[189] & -32769;
4193 /* reset seen. */
4194     findex_1.frobzf = TRUE_;
4195 /* yes, let him out. */
4196     return ret_val;
4197 
4198 L14200:
4199     if (findex_1.cphere != 52 || prsvec_1.prso != 7168) {
4200         goto L14250;
4201     }
4202     curxt_1.xstrng = 932;
4203 /* door in way. */
4204     return ret_val;
4205 
4206 L14250:
4207     for (i__ = 1; i__ <= 16; i__ += 2) {
4208 /* locate exit. */
4209         if (prsvec_1.prso == puzzle_1.cpdr[i__ - 1]) {
4210             goto L14400;
4211         }
4212 /* L14300: */
4213     }
4214     return ret_val;
4215 
4216 /* no such exit. */
4217 L14400:
4218     j = puzzle_1.cpdr[i__];
4219 /* get directional offset */
4220     nxt = findex_1.cphere + j;
4221 /* get next state. */
4222     k = 8;
4223 /* get orthogonal dir. */
4224     if (j < 0) {
4225         k = -8;
4226     }
4227     if ((abs(j) == 1 || abs(j) == 8 || (puzzle_1.cpvec[findex_1.cphere + k -
4228             1] == 0 || puzzle_1.cpvec[nxt - k - 1] == 0)) && puzzle_1.cpvec[
4229             nxt - 1] == 0) {
4230         goto L14500;
4231     }
4232 /* cant do it? */
4233     return ret_val;
4234 
4235 L14500:
4236     cpgoto_(&nxt);
4237 /* move to state. */
4238     curxt_1.xroom1 = 190;
4239 /* stay in room. */
4240     ret_val = curxt_1.xroom1;
4241     return ret_val;
4242 
4243 /* C15-  Frobozz flag (slide exit) */
4244 
4245 L15000:
4246     findex_1.frobzf = TRUE_;
4247 /* works. */
4248     if (findex_1.ttie == 0 || findex_1.deadf) {
4249         return ret_val;
4250     }
4251 /* if no rope or dead, ce */
4252     if (objcts_1.oroom[findex_1.ttie - 1] != play_1.here) {
4253         return ret_val;
4254     }
4255 /* if rope elsewhere, cel */
4256     rspeak_(&c__1014);
4257 /* slippery. */
4258     cevent_1.cflag[26] = TRUE_;
4259 /* turn on slide clock. */
4260 /* Computing MAX */
4261     i__1 = 2, i__2 = 100 / weighr_(&c__0, &play_1.winner);
4262     cevent_1.ctick[26] = max(i__1,i__2);
4263     curxt_1.xroom1 = 194;
4264 /* on the ropes. */
4265     ret_val = curxt_1.xroom1;
4266     return ret_val;
4267 
4268 } /* cxappl_ */
4269 
4270 
4271