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