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