1 /* SAVE- SAVE GAME STATE */
2 
3 /*COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142*/
4 /* ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED */
5 /* WRITTEN BY R. M. SUPNIK */
6 
7 #include <stdio.h>
8 #include "funcs.h"
9 #include "vars.h"
10 
11 /* DECLARATIONS */
12 
13 static integer cxappl_ P((integer));
14 
savegm_()15 void savegm_()
16 {
17     /* Local variables */
18     integer i;
19     FILE *e;
20 
21     prsvec_1.prswon = FALSE_;
22 /* 						!DISABLE GAME. */
23 /* Note: save file format is different for PDP vs. non-PDP versions */
24 
25     if ((e = fopen("dsave.dat", BINWRITE)) == NULL)
26 	goto L100;
27 
28     gttime_(&i);
29 /* 						!GET TIME. */
30 
31 #define do_uio(i, zbuf, cbytes) \
32 	(void) fwrite((const char *)(zbuf), (cbytes), (i), e)
33 
34     do_uio(1, &vers_1.vmaj, sizeof(integer));
35     do_uio(1, &vers_1.vmin, sizeof(integer));
36     do_uio(1, &vers_1.vedit, sizeof(integer));
37 
38     do_uio(1, &play_1.winner, sizeof(integer));
39     do_uio(1, &play_1.here, sizeof(integer));
40     do_uio(1, &hack_1.thfpos, sizeof(integer));
41     do_uio(1, &play_1.telflg, sizeof(logical));
42     do_uio(1, &hack_1.thfflg, sizeof(logical));
43     do_uio(1, &hack_1.thfact, sizeof(logical));
44     do_uio(1, &hack_1.swdact, sizeof(logical));
45     do_uio(1, &hack_1.swdsta, sizeof(integer));
46     do_uio(64, &puzzle_1.cpvec[0], sizeof(integer));
47 
48     do_uio(1, &i, sizeof(integer));
49     do_uio(1, &state_1.moves, sizeof(integer));
50     do_uio(1, &state_1.deaths, sizeof(integer));
51     do_uio(1, &state_1.rwscor, sizeof(integer));
52     do_uio(1, &state_1.egscor, sizeof(integer));
53     do_uio(1, &state_1.mxload, sizeof(integer));
54     do_uio(1, &state_1.ltshft, sizeof(integer));
55     do_uio(1, &state_1.bloc, sizeof(integer));
56     do_uio(1, &state_1.mungrm, sizeof(integer));
57     do_uio(1, &state_1.hs, sizeof(integer));
58     do_uio(1, &screen_1.fromdr, sizeof(integer));
59     do_uio(1, &screen_1.scolrm, sizeof(integer));
60     do_uio(1, &screen_1.scolac, sizeof(integer));
61 
62     do_uio(220, &objcts_1.odesc1[0], sizeof(integer));
63     do_uio(220, &objcts_1.odesc2[0], sizeof(integer));
64     do_uio(220, &objcts_1.oflag1[0], sizeof(integer));
65     do_uio(220, &objcts_1.oflag2[0], sizeof(integer));
66     do_uio(220, &objcts_1.ofval[0], sizeof(integer));
67     do_uio(220, &objcts_1.otval[0], sizeof(integer));
68     do_uio(220, &objcts_1.osize[0], sizeof(integer));
69     do_uio(220, &objcts_1.ocapac[0], sizeof(integer));
70     do_uio(220, &objcts_1.oroom[0], sizeof(integer));
71     do_uio(220, &objcts_1.oadv[0], sizeof(integer));
72     do_uio(220, &objcts_1.ocan[0], sizeof(integer));
73 
74     do_uio(200, &rooms_1.rval[0], sizeof(integer));
75     do_uio(200, &rooms_1.rflag[0], sizeof(integer));
76 
77     do_uio(4, &advs_1.aroom[0], sizeof(integer));
78     do_uio(4, &advs_1.ascore[0], sizeof(integer));
79     do_uio(4, &advs_1.avehic[0], sizeof(integer));
80     do_uio(4, &advs_1.astren[0], sizeof(integer));
81     do_uio(4, &advs_1.aflag[0], sizeof(integer));
82 
83     do_uio(46, &flags[0], sizeof(logical));
84     do_uio(22, &switch_[0], sizeof(integer));
85     do_uio(4, &vill_1.vprob[0], sizeof(integer));
86     do_uio(25, &cevent_1.cflag[0], sizeof(logical));
87     do_uio(25, &cevent_1.ctick[0], sizeof(integer));
88 
89 #undef do_uio
90 
91     if (fclose(e) == EOF)
92 	goto L100;
93 
94     rspeak_(597);
95     return;
96 
97 L100:
98     rspeak_(598);
99 /* 						!CANT DO IT. */
100 } /* savegm_ */
101 
102 /* RESTORE- RESTORE GAME STATE */
103 
104 /* DECLARATIONS */
105 
rstrgm_()106 void rstrgm_()
107 {
108     /* Local variables */
109     integer i, j, k;
110     FILE *e;
111 
112     prsvec_1.prswon = FALSE_;
113 /* 						!DISABLE GAME. */
114 /* Note: save file format is different for PDP vs. non-PDP versions */
115 
116     if ((e = fopen("dsave.dat", BINREAD)) == NULL)
117 	goto L100;
118 
119 #define do_uio(i, zbuf, cbytes) \
120 	(void)fread((char *)(zbuf), (cbytes), (i), e)
121 
122     do_uio(1, &i, sizeof(integer));
123     do_uio(1, &j, sizeof(integer));
124     do_uio(1, &k, sizeof(integer));
125 
126     if (i != vers_1.vmaj | j != vers_1.vmin) {
127 	goto L200;
128     }
129 
130     do_uio(1, &play_1.winner, sizeof(integer));
131     do_uio(1, &play_1.here, sizeof(integer));
132     do_uio(1, &hack_1.thfpos, sizeof(integer));
133     do_uio(1, &play_1.telflg, sizeof(logical));
134     do_uio(1, &hack_1.thfflg, sizeof(logical));
135     do_uio(1, &hack_1.thfact, sizeof(logical));
136     do_uio(1, &hack_1.swdact, sizeof(logical));
137     do_uio(1, &hack_1.swdsta, sizeof(integer));
138     do_uio(64, &puzzle_1.cpvec[0], sizeof(integer));
139 
140     do_uio(1, &time_1.pltime, sizeof(integer));
141     do_uio(1, &state_1.moves, sizeof(integer));
142     do_uio(1, &state_1.deaths, sizeof(integer));
143     do_uio(1, &state_1.rwscor, sizeof(integer));
144     do_uio(1, &state_1.egscor, sizeof(integer));
145     do_uio(1, &state_1.mxload, sizeof(integer));
146     do_uio(1, &state_1.ltshft, sizeof(integer));
147     do_uio(1, &state_1.bloc, sizeof(integer));
148     do_uio(1, &state_1.mungrm, sizeof(integer));
149     do_uio(1, &state_1.hs, sizeof(integer));
150     do_uio(1, &screen_1.fromdr, sizeof(integer));
151     do_uio(1, &screen_1.scolrm, sizeof(integer));
152     do_uio(1, &screen_1.scolac, sizeof(integer));
153 
154     do_uio(220, &objcts_1.odesc1[0], sizeof(integer));
155     do_uio(220, &objcts_1.odesc2[0], sizeof(integer));
156     do_uio(220, &objcts_1.oflag1[0], sizeof(integer));
157     do_uio(220, &objcts_1.oflag2[0], sizeof(integer));
158     do_uio(220, &objcts_1.ofval[0], sizeof(integer));
159     do_uio(220, &objcts_1.otval[0], sizeof(integer));
160     do_uio(220, &objcts_1.osize[0], sizeof(integer));
161     do_uio(220, &objcts_1.ocapac[0], sizeof(integer));
162     do_uio(220, &objcts_1.oroom[0], sizeof(integer));
163     do_uio(220, &objcts_1.oadv[0], sizeof(integer));
164     do_uio(220, &objcts_1.ocan[0], sizeof(integer));
165 
166     do_uio(200, &rooms_1.rval[0], sizeof(integer));
167     do_uio(200, &rooms_1.rflag[0], sizeof(integer));
168 
169     do_uio(4, &advs_1.aroom[0], sizeof(integer));
170     do_uio(4, &advs_1.ascore[0], sizeof(integer));
171     do_uio(4, &advs_1.avehic[0], sizeof(integer));
172     do_uio(4, &advs_1.astren[0], sizeof(integer));
173     do_uio(4, &advs_1.aflag[0], sizeof(integer));
174 
175     do_uio(46, &flags[0], sizeof(logical));
176     do_uio(22, &switch_[0], sizeof(integer));
177     do_uio(4, &vill_1.vprob[0], sizeof(integer));
178     do_uio(25, &cevent_1.cflag[0], sizeof(logical));
179     do_uio(25, &cevent_1.ctick[0], sizeof(integer));
180 
181     (void)fclose(e);
182 
183     rspeak_(599);
184     return;
185 
186 L100:
187     rspeak_(598);
188 /* 						!CANT DO IT. */
189     return;
190 
191 L200:
192     rspeak_(600);
193 /* 						!OBSOLETE VERSION */
194     (void)fclose(e);
195 } /* rstrgm_ */
196 
197 /* WALK- MOVE IN SPECIFIED DIRECTION */
198 
199 /* DECLARATIONS */
200 
walk_()201 logical walk_()
202 {
203     /* System generated locals */
204     logical ret_val;
205 
206     ret_val = TRUE_;
207 /* 						!ASSUME WINS. */
208     if (play_1.winner != aindex_1.player || lit_(play_1.here) || prob_(25,
209 	    25)) {
210 	goto L500;
211     }
212     if (! findxt_(prsvec_1.prso, play_1.here)) {
213 	goto L450;
214     }
215 /* 						!INVALID EXIT? GRUE */
216 /* 						! */
217     switch (curxt_1.xtype) {
218 	case 1:  goto L400;
219 	case 2:  goto L200;
220 	case 3:  goto L100;
221 	case 4:  goto L300;
222     }
223 /* 						!DECODE EXIT TYPE. */
224     bug_(9, curxt_1.xtype);
225 
226 L100:
227     if (cxappl_(curxt_1.xactio) != 0) {
228 	goto L400;
229     }
230 /* 						!CEXIT... RETURNED ROOM? */
231     if (flags[*xflag - 1]) {
232 	goto L400;
233     }
234 /* 						!NO, FLAG ON? */
235 L200:
236     jigsup_(523);
237 /* 						!BAD EXIT, GRUE */
238 /* 						! */
239     return ret_val;
240 
241 L300:
242     if (cxappl_(curxt_1.xactio) != 0) {
243 	goto L400;
244     }
245 /* 						!DOOR... RETURNED ROOM? */
246     if ((objcts_1.oflag2[curxt_1.xobj - 1] & OPENBT) != 0) {
247 	goto L400;
248     }
249 /* 						!NO, DOOR OPEN? */
250     jigsup_(523);
251 /* 						!BAD EXIT, GRUE */
252 /* 						! */
253     return ret_val;
254 
255 L400:
256     if (lit_(curxt_1.xroom1)) {
257 	goto L900;
258     }
259 /* 						!VALID ROOM, IS IT LIT? */
260 L450:
261     jigsup_(522);
262 /* 						!NO, GRUE */
263 /* 						! */
264     return ret_val;
265 
266 /* ROOM IS LIT, OR WINNER IS NOT PLAYER (NO GRUE). */
267 
268 L500:
269     if (findxt_(prsvec_1.prso, play_1.here)) {
270 	goto L550;
271     }
272 /* 						!EXIT EXIST? */
273 L525:
274     curxt_1.xstrng = 678;
275 /* 						!ASSUME WALL. */
276     if (prsvec_1.prso == xsrch_1.xup) {
277 	curxt_1.xstrng = 679;
278     }
279 /* 						!IF UP, CANT. */
280     if (prsvec_1.prso == xsrch_1.xdown) {
281 	curxt_1.xstrng = 680;
282     }
283 /* 						!IF DOWN, CANT. */
284     if ((rooms_1.rflag[play_1.here - 1] & RNWALL) != 0) {
285 	curxt_1.xstrng = 524;
286     }
287     rspeak_(curxt_1.xstrng);
288     prsvec_1.prscon = 1;
289 /* 						!STOP CMD STREAM. */
290     return ret_val;
291 
292 L550:
293     switch (curxt_1.xtype) {
294 	case 1:  goto L900;
295 	case 2:  goto L600;
296 	case 3:  goto L700;
297 	case 4:  goto L800;
298     }
299 /* 						!BRANCH ON EXIT TYPE. */
300     bug_(9, curxt_1.xtype);
301 
302 L700:
303     if (cxappl_(curxt_1.xactio) != 0) {
304 	goto L900;
305     }
306 /* 						!CEXIT... RETURNED ROOM? */
307     if (flags[*xflag - 1]) {
308 	goto L900;
309     }
310 /* 						!NO, FLAG ON? */
311 L600:
312     if (curxt_1.xstrng == 0) {
313 	goto L525;
314     }
315 /* 						!IF NO REASON, USE STD. */
316     rspeak_(curxt_1.xstrng);
317 /* 						!DENY EXIT. */
318     prsvec_1.prscon = 1;
319 /* 						!STOP CMD STREAM. */
320     return ret_val;
321 
322 L800:
323     if (cxappl_(curxt_1.xactio) != 0) {
324 	goto L900;
325     }
326 /* 						!DOOR... RETURNED ROOM? */
327     if ((objcts_1.oflag2[curxt_1.xobj - 1] & OPENBT) != 0) {
328 	goto L900;
329     }
330 /* 						!NO, DOOR OPEN? */
331     if (curxt_1.xstrng == 0) {
332 	curxt_1.xstrng = 525;
333     }
334 /* 						!IF NO REASON, USE STD. */
335     rspsub_(curxt_1.xstrng, objcts_1.odesc2[curxt_1.xobj - 1]);
336     prsvec_1.prscon = 1;
337 /* 						!STOP CMD STREAM. */
338     return ret_val;
339 
340 L900:
341     ret_val = moveto_(curxt_1.xroom1, play_1.winner);
342 /* 						!MOVE TO ROOM. */
343     if (ret_val) {
344 	ret_val = rmdesc_(0);
345     }
346 /* 						!DESCRIBE ROOM. */
347     return ret_val;
348 } /* walk_ */
349 
350 /* CXAPPL- CONDITIONAL EXIT PROCESSORS */
351 
352 /* DECLARATIONS */
353 
cxappl_(ri)354 static integer cxappl_(ri)
355 integer ri;
356 {
357     /* System generated locals */
358     integer ret_val, i__1;
359 
360     /* Local variables */
361     integer i, j, k;
362     integer nxt;
363     integer ldir;
364 
365     ret_val = 0;
366 /* 						!NO RETURN. */
367     if (ri == 0) {
368 	return ret_val;
369     }
370 /* 						!IF NO ACTION, DONE. */
371     switch (ri) {
372 	case 1:  goto L1000;
373 	case 2:  goto L2000;
374 	case 3:  goto L3000;
375 	case 4:  goto L4000;
376 	case 5:  goto L5000;
377 	case 6:  goto L6000;
378 	case 7:  goto L7000;
379 	case 8:  goto L8000;
380 	case 9:  goto L9000;
381 	case 10:  goto L10000;
382 	case 11:  goto L11000;
383 	case 12:  goto L12000;
384 	case 13:  goto L13000;
385 	case 14:  goto L14000;
386     }
387     bug_(5, ri);
388 
389 /* C1- COFFIN-CURE */
390 
391 L1000:
392     findex_1.egyptf = objcts_1.oadv[oindex_1.coffi - 1] != play_1.winner;
393 /* 						!T IF NO COFFIN. */
394     return ret_val;
395 
396 /* C2- CAROUSEL EXIT */
397 /* C5- CAROUSEL OUT */
398 
399 L2000:
400     if (findex_1.caroff) {
401 	return ret_val;
402     }
403 /* 						!IF FLIPPED, NOTHING. */
404 L2500:
405     rspeak_(121);
406 /* 						!SPIN THE COMPASS. */
407 L5000:
408     i = xpars_1.xelnt[xpars_1.xcond - 1] * rnd_(8);
409 /* 						!CHOOSE RANDOM EXIT. */
410     curxt_1.xroom1 = exits_1.travel[rooms_1.rexit[play_1.here - 1] + i - 1] &
411 	    xpars_1.xrmask;
412     ret_val = curxt_1.xroom1;
413 /* 						!RETURN EXIT. */
414     return ret_val;
415 
416 /* C3- CHIMNEY FUNCTION */
417 
418 L3000:
419     findex_1.litldf = FALSE_;
420 /* 						!ASSUME HEAVY LOAD. */
421     j = 0;
422     i__1 = objcts_1.olnt;
423     for (i = 1; i <= i__1; ++i) {
424 /* 						!COUNT OBJECTS. */
425 	if (objcts_1.oadv[i - 1] == play_1.winner) {
426 	    ++j;
427 	}
428 /* L3100: */
429     }
430 
431     if (j > 2) {
432 	return ret_val;
433     }
434 /* 						!CARRYING TOO MUCH? */
435     curxt_1.xstrng = 446;
436 /* 						!ASSUME NO LAMP. */
437     if (objcts_1.oadv[oindex_1.lamp - 1] != play_1.winner) {
438 	return ret_val;
439     }
440 /* 						!NO LAMP? */
441     findex_1.litldf = TRUE_;
442 /* 						!HE CAN DO IT. */
443     if ((objcts_1.oflag2[oindex_1.door - 1] & OPENBT) == 0) {
444 	objcts_1.oflag2[oindex_1.door - 1] &= ~ TCHBT;
445     }
446     return ret_val;
447 
448 /* C4-	FROBOZZ FLAG (MAGNET ROOM, FAKE EXIT) */
449 /* C6-	FROBOZZ FLAG (MAGNET ROOM, REAL EXIT) */
450 
451 L4000:
452     if (findex_1.caroff) {
453 	goto L2500;
454     }
455 /* 						!IF FLIPPED, GO SPIN. */
456     findex_1.frobzf = FALSE_;
457 /* 						!OTHERWISE, NOT AN EXIT. */
458     return ret_val;
459 
460 L6000:
461     if (findex_1.caroff) {
462 	goto L2500;
463     }
464 /* 						!IF FLIPPED, GO SPIN. */
465     findex_1.frobzf = TRUE_;
466 /* 						!OTHERWISE, AN EXIT. */
467     return ret_val;
468 
469 /* C7-	FROBOZZ FLAG (BANK ALARM) */
470 
471 L7000:
472     findex_1.frobzf = objcts_1.oroom[oindex_1.bills - 1] != 0 &
473 	    objcts_1.oroom[oindex_1.portr - 1] != 0;
474     return ret_val;
475 /* CXAPPL, PAGE 3 */
476 
477 /* C8-	FROBOZZ FLAG (MRGO) */
478 
479 L8000:
480     findex_1.frobzf = FALSE_;
481 /* 						!ASSUME CANT MOVE. */
482     if (findex_1.mloc != curxt_1.xroom1) {
483 	goto L8100;
484     }
485 /* 						!MIRROR IN WAY? */
486     if (prsvec_1.prso == xsrch_1.xnorth || prsvec_1.prso == xsrch_1.xsouth) {
487 	goto L8200;
488     }
489     if (findex_1.mdir % 180 != 0) {
490 	goto L8300;
491     }
492 /* 						!MIRROR MUST BE N-S. */
493     curxt_1.xroom1 = (curxt_1.xroom1 - rindex_1.mra << 1) + rindex_1.mrae;
494 /* 						!CALC EAST ROOM. */
495     if (prsvec_1.prso > xsrch_1.xsouth) {
496 	++curxt_1.xroom1;
497     }
498 /* 						!IF SW/NW, CALC WEST. */
499 L8100:
500     ret_val = curxt_1.xroom1;
501     return ret_val;
502 
503 L8200:
504     curxt_1.xstrng = 814;
505 /* 						!ASSUME STRUC BLOCKS. */
506     if (findex_1.mdir % 180 == 0) {
507 	return ret_val;
508     }
509 /* 						!IF MIRROR N-S, DONE. */
510 L8300:
511     ldir = findex_1.mdir;
512 /* 						!SEE WHICH MIRROR. */
513     if (prsvec_1.prso == xsrch_1.xsouth) {
514 	ldir = 180;
515     }
516     curxt_1.xstrng = 815;
517 /* 						!MIRROR BLOCKS. */
518     if (ldir > 180 && ! findex_1.mr1f || ldir < 180 && ! findex_1.mr2f) {
519 	curxt_1.xstrng = 816;
520     }
521     return ret_val;
522 
523 /* C9-	FROBOZZ FLAG (MIRIN) */
524 
525 L9000:
526     if (mrhere_(play_1.here) != 1) {
527 	goto L9100;
528     }
529 /* 						!MIRROR 1 HERE? */
530     if (findex_1.mr1f) {
531 	curxt_1.xstrng = 805;
532     }
533 /* 						!SEE IF BROKEN. */
534     findex_1.frobzf = findex_1.mropnf;
535 /* 						!ENTER IF OPEN. */
536     return ret_val;
537 
538 L9100:
539     findex_1.frobzf = FALSE_;
540 /* 						!NOT HERE, */
541     curxt_1.xstrng = 817;
542 /* 						!LOSE. */
543     return ret_val;
544 /* CXAPPL, PAGE 4 */
545 
546 /* C10-	FROBOZZ FLAG (MIRROR EXIT) */
547 
548 L10000:
549     findex_1.frobzf = FALSE_;
550 /* 						!ASSUME CANT. */
551     ldir = (prsvec_1.prso - xsrch_1.xnorth) / xsrch_1.xnorth * 45;
552 /* 						!XLATE DIR TO DEGREES. */
553     if (! findex_1.mropnf || (findex_1.mdir + 270) % 360 != ldir &&
554 	    prsvec_1.prso != xsrch_1.xexit) {
555 	goto L10200;
556     }
557     curxt_1.xroom1 = (findex_1.mloc - rindex_1.mra << 1) + rindex_1.mrae + 1
558 	    - findex_1.mdir / 180;
559 /* 						!ASSUME E-W EXIT. */
560     if (findex_1.mdir % 180 == 0) {
561 	goto L10100;
562     }
563 /* 						!IF N-S, OK. */
564     curxt_1.xroom1 = findex_1.mloc + 1;
565 /* 						!ASSUME N EXIT. */
566     if (findex_1.mdir > 180) {
567 	curxt_1.xroom1 = findex_1.mloc - 1;
568     }
569 /* 						!IF SOUTH. */
570 L10100:
571     ret_val = curxt_1.xroom1;
572     return ret_val;
573 
574 L10200:
575     if (! findex_1.wdopnf || (findex_1.mdir + 180) % 360 != ldir &&
576 	    prsvec_1.prso != xsrch_1.xexit) {
577 	return ret_val;
578     }
579     curxt_1.xroom1 = findex_1.mloc + 1;
580 /* 						!ASSUME N. */
581     if (findex_1.mdir == 0) {
582 	curxt_1.xroom1 = findex_1.mloc - 1;
583     }
584 /* 						!IF S. */
585     rspeak_(818);
586 /* 						!CLOSE DOOR. */
587     findex_1.wdopnf = FALSE_;
588     ret_val = curxt_1.xroom1;
589     return ret_val;
590 
591 /* C11-	MAYBE DOOR.  NORMAL MESSAGE IS THAT DOOR IS CLOSED. */
592 /* 	BUT IF LCELL.NE.4, DOOR ISNT THERE. */
593 
594 L11000:
595     if (findex_1.lcell != 4) {
596 	curxt_1.xstrng = 678;
597     }
598 /* 						!SET UP MSG. */
599     return ret_val;
600 
601 /* C12-	FROBZF (PUZZLE ROOM MAIN ENTRANCE) */
602 
603 L12000:
604     findex_1.frobzf = TRUE_;
605 /* 						!ALWAYS ENTER. */
606     findex_1.cphere = 10;
607 /* 						!SET SUBSTATE. */
608     return ret_val;
609 
610 /* C13-	CPOUTF (PUZZLE ROOM SIZE ENTRANCE) */
611 
612 L13000:
613     findex_1.cphere = 52;
614 /* 						!SET SUBSTATE. */
615     return ret_val;
616 /* CXAPPL, PAGE 5 */
617 
618 /* C14-	FROBZF (PUZZLE ROOM TRANSITIONS) */
619 
620 L14000:
621     findex_1.frobzf = FALSE_;
622 /* 						!ASSSUME LOSE. */
623     if (prsvec_1.prso != xsrch_1.xup) {
624 	goto L14100;
625     }
626 /* 						!UP? */
627     if (findex_1.cphere != 10) {
628 	return ret_val;
629     }
630 /* 						!AT EXIT? */
631     curxt_1.xstrng = 881;
632 /* 						!ASSUME NO LADDER. */
633     if (puzzle_1.cpvec[findex_1.cphere] != -2) {
634 	return ret_val;
635     }
636 /* 						!LADDER HERE? */
637     rspeak_(882);
638 /* 						!YOU WIN. */
639     findex_1.frobzf = TRUE_;
640 /* 						!LET HIM OUT. */
641     return ret_val;
642 
643 L14100:
644     if (findex_1.cphere != 52 || prsvec_1.prso != xsrch_1.xwest || !
645 	    findex_1.cpoutf) {
646 	goto L14200;
647     }
648     findex_1.frobzf = TRUE_;
649 /* 						!YES, LET HIM OUT. */
650     return ret_val;
651 
652 L14200:
653     for (i = 1; i <= 16; i += 2) {
654 /* 						!LOCATE EXIT. */
655 	if (prsvec_1.prso == puzzle_1.cpdr[i - 1]) {
656 	    goto L14400;
657 	}
658 /* L14300: */
659     }
660     return ret_val;
661 /* 						!NO SUCH EXIT. */
662 
663 L14400:
664     j = puzzle_1.cpdr[i];
665 /* 						!GET DIRECTIONAL OFFSET. */
666     nxt = findex_1.cphere + j;
667 /* 						!GET NEXT STATE. */
668     k = 8;
669 /* 						!GET ORTHOGONAL DIR. */
670     if (j < 0) {
671 	k = -8;
672     }
673     if ((abs(j) == 1 || abs(j) == 8 || (puzzle_1.cpvec[findex_1.cphere + k -
674 	    1] == 0 || puzzle_1.cpvec[nxt - k - 1] == 0)) && puzzle_1.cpvec[
675 	    nxt - 1] == 0) {
676 	goto L14500;
677     }
678     return ret_val;
679 
680 L14500:
681     cpgoto_(nxt);
682 /* 						!MOVE TO STATE. */
683     curxt_1.xroom1 = rindex_1.cpuzz;
684 /* 						!STAY IN ROOM. */
685     ret_val = curxt_1.xroom1;
686     return ret_val;
687 
688 } /* cxappl_ */
689