1 /* FINDXT- FIND EXIT FROM ROOM */
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 
findxt_(dir,rm)11 logical findxt_(dir, rm)
12 integer dir;
13 integer rm;
14 {
15     /* System generated locals */
16     logical ret_val;
17 
18     /* Local variables */
19     integer i, xi;
20     integer xxxflg;
21 
22     ret_val = TRUE_;
23 /* 						!ASSUME WINS. */
24     xi = rooms_1.rexit[rm - 1];
25 /* 						!FIND FIRST ENTRY. */
26     if (xi == 0) {
27 	goto L1000;
28     }
29 /* 						!NO EXITS? */
30 
31 L100:
32     i = exits_1.travel[xi - 1];
33 /* 						!GET ENTRY. */
34     curxt_1.xroom1 = i & xpars_1.xrmask;
35 /* mask to 16-bits to get rid of sign extension problems with 32-bit ints
36 */
37     xxxflg = ~ xpars_1.xlflag & 65535;
38     curxt_1.xtype = ((i & xxxflg) / xpars_1.xfshft & xpars_1.xfmask) + 1;
39     switch (curxt_1.xtype) {
40 	case 1:  goto L110;
41 	case 2:  goto L120;
42 	case 3:  goto L130;
43 	case 4:  goto L130;
44     }
45 /* 						!BRANCH ON ENTRY. */
46     bug_(10, curxt_1.xtype);
47 
48 L130:
49     curxt_1.xobj = exits_1.travel[xi + 1] & xpars_1.xrmask;
50     curxt_1.xactio = exits_1.travel[xi + 1] / xpars_1.xashft;
51 L120:
52     curxt_1.xstrng = exits_1.travel[xi];
53 /* 						!DOOR/CEXIT/NEXIT - STRING. */
54 L110:
55     xi += xpars_1.xelnt[curxt_1.xtype - 1];
56 /* 						!ADVANCE TO NEXT ENTRY. */
57     if ((i & xpars_1.xdmask) == dir) {
58 	return ret_val;
59     }
60     if ((i & xpars_1.xlflag) == 0) {
61 	goto L100;
62     }
63 L1000:
64     ret_val = FALSE_;
65 /* 						!YES, LOSE. */
66     return ret_val;
67 } /* findxt_ */
68 
69 /* FWIM- FIND WHAT I MEAN */
70 
71 /* DECLARATIONS */
72 
fwim_(f1,f2,rm,con,adv,nocare)73 integer fwim_(f1, f2, rm, con, adv, nocare)
74 integer f1;
75 integer f2;
76 integer rm;
77 integer con;
78 integer adv;
79 logical nocare;
80 {
81     /* System generated locals */
82     integer ret_val, i__1, i__2;
83 
84     /* Local variables */
85     integer i, j;
86 
87 
88 /* OBJECTS */
89 
90 
91 
92 
93     ret_val = 0;
94 /* 						!ASSUME NOTHING. */
95     i__1 = objcts_1.olnt;
96     for (i = 1; i <= i__1; ++i) {
97 /* 						!LOOP */
98 	if ((rm == 0 || objcts_1.oroom[i - 1] != rm) && (adv == 0 ||
99 		objcts_1.oadv[i - 1] != adv) && (con == 0 || objcts_1.ocan[
100 		i - 1] != con)) {
101 	    goto L1000;
102 	}
103 
104 /* OBJECT IS ON LIST... IS IT A MATCH? */
105 
106 	if ((objcts_1.oflag1[i - 1] & VISIBT) == 0) {
107 	    goto L1000;
108 	}
109 	if (~ (nocare) & (objcts_1.oflag1[i - 1] & TAKEBT) == 0 || (
110 		objcts_1.oflag1[i - 1] & f1) == 0 && (objcts_1.oflag2[i - 1]
111 		& f2) == 0) {
112 	    goto L500;
113 	}
114 	if (ret_val == 0) {
115 	    goto L400;
116 	}
117 /* 						!ALREADY GOT SOMETHING? */
118 	ret_val = -ret_val;
119 /* 						!YES, AMBIGUOUS. */
120 	return ret_val;
121 
122 L400:
123 	ret_val = i;
124 /* 						!NOTE MATCH. */
125 
126 /* DOES OBJECT CONTAIN A MATCH? */
127 
128 L500:
129 	if ((objcts_1.oflag2[i - 1] & OPENBT) == 0) {
130 	    goto L1000;
131 	}
132 	i__2 = objcts_1.olnt;
133 	for (j = 1; j <= i__2; ++j) {
134 /* 						!NO, SEARCH CONTENTS. */
135 	    if (objcts_1.ocan[j - 1] != i || (objcts_1.oflag1[j - 1] &
136 		    VISIBT) == 0 || (objcts_1.oflag1[j - 1] & f1) ==
137 		     0 && (objcts_1.oflag2[j - 1] & f2) == 0) {
138 		goto L700;
139 	    }
140 	    if (ret_val == 0) {
141 		goto L600;
142 	    }
143 	    ret_val = -ret_val;
144 	    return ret_val;
145 
146 L600:
147 	    ret_val = j;
148 L700:
149 	    ;
150 	}
151 L1000:
152 	;
153     }
154     return ret_val;
155 } /* fwim_ */
156 
157 /* YESNO- OBTAIN YES/NO ANSWER */
158 
159 /* CALLED BY- */
160 
161 /* 	YES-IS-TRUE=YESNO(QUESTION,YES-STRING,NO-STRING) */
162 
yesno_(q,y,n)163 logical yesno_(q, y, n)
164 integer q;
165 integer y;
166 integer n;
167 {
168     /* System generated locals */
169     logical ret_val;
170 
171     /* Local variables */
172     char ans[100];
173 
174 L100:
175     rspeak_(q);
176 /* 						!ASK */
177     (void) fflush(stdout);
178     (void) fgets(ans, sizeof ans, stdin);
179     more_input();
180 /* 						!GET ANSWER */
181     if (*ans == 'Y' || *ans == 'y') {
182 	goto L200;
183     }
184     if (*ans == 'N' || *ans == 'n') {
185 	goto L300;
186     }
187     rspeak_(6);
188 /* 						!SCOLD. */
189     goto L100;
190 
191 L200:
192     ret_val = TRUE_;
193 /* 						!YES, */
194     rspeak_(y);
195 /* 						!OUT WITH IT. */
196     return ret_val;
197 
198 L300:
199     ret_val = FALSE_;
200 /* 						!NO, */
201     rspeak_(n);
202 /* 						!LIKEWISE. */
203     return ret_val;
204 
205 } /* yesno_ */
206