mirror of https://github.com/sean-m/zork
206 lines
3.9 KiB
C
206 lines
3.9 KiB
C
/* FINDXT- FIND EXIT FROM ROOM */
|
|
|
|
/*COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142*/
|
|
/* ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED */
|
|
/* WRITTEN BY R. M. SUPNIK */
|
|
|
|
#include <stdio.h>
|
|
#include "funcs.h"
|
|
#include "vars.h"
|
|
|
|
logical findxt_(dir, rm)
|
|
integer dir;
|
|
integer rm;
|
|
{
|
|
/* System generated locals */
|
|
logical ret_val;
|
|
|
|
/* Local variables */
|
|
integer i, xi;
|
|
integer xxxflg;
|
|
|
|
ret_val = TRUE_;
|
|
/* !ASSUME WINS. */
|
|
xi = rooms_1.rexit[rm - 1];
|
|
/* !FIND FIRST ENTRY. */
|
|
if (xi == 0) {
|
|
goto L1000;
|
|
}
|
|
/* !NO EXITS? */
|
|
|
|
L100:
|
|
i = exits_1.travel[xi - 1];
|
|
/* !GET ENTRY. */
|
|
curxt_1.xroom1 = i & xpars_1.xrmask;
|
|
/* mask to 16-bits to get rid of sign extension problems with 32-bit ints
|
|
*/
|
|
xxxflg = ~ xpars_1.xlflag & 65535;
|
|
curxt_1.xtype = ((i & xxxflg) / xpars_1.xfshft & xpars_1.xfmask) + 1;
|
|
switch (curxt_1.xtype) {
|
|
case 1: goto L110;
|
|
case 2: goto L120;
|
|
case 3: goto L130;
|
|
case 4: goto L130;
|
|
}
|
|
/* !BRANCH ON ENTRY. */
|
|
bug_(10, curxt_1.xtype);
|
|
|
|
L130:
|
|
curxt_1.xobj = exits_1.travel[xi + 1] & xpars_1.xrmask;
|
|
curxt_1.xactio = exits_1.travel[xi + 1] / xpars_1.xashft;
|
|
L120:
|
|
curxt_1.xstrng = exits_1.travel[xi];
|
|
/* !DOOR/CEXIT/NEXIT - STRING. */
|
|
L110:
|
|
xi += xpars_1.xelnt[curxt_1.xtype - 1];
|
|
/* !ADVANCE TO NEXT ENTRY. */
|
|
if ((i & xpars_1.xdmask) == dir) {
|
|
return ret_val;
|
|
}
|
|
if ((i & xpars_1.xlflag) == 0) {
|
|
goto L100;
|
|
}
|
|
L1000:
|
|
ret_val = FALSE_;
|
|
/* !YES, LOSE. */
|
|
return ret_val;
|
|
} /* findxt_ */
|
|
|
|
/* FWIM- FIND WHAT I MEAN */
|
|
|
|
/* DECLARATIONS */
|
|
|
|
integer fwim_(f1, f2, rm, con, adv, nocare)
|
|
integer f1;
|
|
integer f2;
|
|
integer rm;
|
|
integer con;
|
|
integer adv;
|
|
logical nocare;
|
|
{
|
|
/* System generated locals */
|
|
integer ret_val, i__1, i__2;
|
|
|
|
/* Local variables */
|
|
integer i, j;
|
|
|
|
|
|
/* OBJECTS */
|
|
|
|
|
|
|
|
|
|
ret_val = 0;
|
|
/* !ASSUME NOTHING. */
|
|
i__1 = objcts_1.olnt;
|
|
for (i = 1; i <= i__1; ++i) {
|
|
/* !LOOP */
|
|
if ((rm == 0 || objcts_1.oroom[i - 1] != rm) && (adv == 0 ||
|
|
objcts_1.oadv[i - 1] != adv) && (con == 0 || objcts_1.ocan[
|
|
i - 1] != con)) {
|
|
goto L1000;
|
|
}
|
|
|
|
/* OBJECT IS ON LIST... IS IT A MATCH? */
|
|
|
|
if ((objcts_1.oflag1[i - 1] & VISIBT) == 0) {
|
|
goto L1000;
|
|
}
|
|
if (~ (nocare) & (objcts_1.oflag1[i - 1] & TAKEBT) == 0 || (
|
|
objcts_1.oflag1[i - 1] & f1) == 0 && (objcts_1.oflag2[i - 1]
|
|
& f2) == 0) {
|
|
goto L500;
|
|
}
|
|
if (ret_val == 0) {
|
|
goto L400;
|
|
}
|
|
/* !ALREADY GOT SOMETHING? */
|
|
ret_val = -ret_val;
|
|
/* !YES, AMBIGUOUS. */
|
|
return ret_val;
|
|
|
|
L400:
|
|
ret_val = i;
|
|
/* !NOTE MATCH. */
|
|
|
|
/* DOES OBJECT CONTAIN A MATCH? */
|
|
|
|
L500:
|
|
if ((objcts_1.oflag2[i - 1] & OPENBT) == 0) {
|
|
goto L1000;
|
|
}
|
|
i__2 = objcts_1.olnt;
|
|
for (j = 1; j <= i__2; ++j) {
|
|
/* !NO, SEARCH CONTENTS. */
|
|
if (objcts_1.ocan[j - 1] != i || (objcts_1.oflag1[j - 1] &
|
|
VISIBT) == 0 || (objcts_1.oflag1[j - 1] & f1) ==
|
|
0 && (objcts_1.oflag2[j - 1] & f2) == 0) {
|
|
goto L700;
|
|
}
|
|
if (ret_val == 0) {
|
|
goto L600;
|
|
}
|
|
ret_val = -ret_val;
|
|
return ret_val;
|
|
|
|
L600:
|
|
ret_val = j;
|
|
L700:
|
|
;
|
|
}
|
|
L1000:
|
|
;
|
|
}
|
|
return ret_val;
|
|
} /* fwim_ */
|
|
|
|
/* YESNO- OBTAIN YES/NO ANSWER */
|
|
|
|
/* CALLED BY- */
|
|
|
|
/* YES-IS-TRUE=YESNO(QUESTION,YES-STRING,NO-STRING) */
|
|
|
|
logical yesno_(q, y, n)
|
|
integer q;
|
|
integer y;
|
|
integer n;
|
|
{
|
|
/* System generated locals */
|
|
logical ret_val;
|
|
|
|
/* Local variables */
|
|
char ans[100];
|
|
|
|
L100:
|
|
rspeak_(q);
|
|
/* !ASK */
|
|
(void) fflush(stdout);
|
|
(void) fgets(ans, sizeof ans, stdin);
|
|
more_input();
|
|
/* !GET ANSWER */
|
|
if (*ans == 'Y' || *ans == 'y') {
|
|
goto L200;
|
|
}
|
|
if (*ans == 'N' || *ans == 'n') {
|
|
goto L300;
|
|
}
|
|
rspeak_(6);
|
|
/* !SCOLD. */
|
|
goto L100;
|
|
|
|
L200:
|
|
ret_val = TRUE_;
|
|
/* !YES, */
|
|
rspeak_(y);
|
|
/* !OUT WITH IT. */
|
|
return ret_val;
|
|
|
|
L300:
|
|
ret_val = FALSE_;
|
|
/* !NO, */
|
|
rspeak_(n);
|
|
/* !LIKEWISE. */
|
|
return ret_val;
|
|
|
|
} /* yesno_ */
|