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