1 /* RAPPL2- SPECIAL PURPOSE ROOM ROUTINES, PART 2 */
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 "funcs.h"
8 #include "vars.h"
9 
10 static void ewtell_ P((integer, integer));
11 static void lookto_ P((integer, integer, integer, integer, integer));
12 
rappl2_(ri)13 logical rappl2_(ri)
14 integer ri;
15 {
16     /* Initialized data */
17 
18     const integer newrms = 38;
19 
20     /* System generated locals */
21     integer i__1;
22     logical ret_val;
23 
24     /* Local variables */
25     integer i;
26     integer j;
27 
28     ret_val = TRUE_;
29     switch (ri - newrms + 1) {
30 	case 1:  goto L38000;
31 	case 2:  goto L39000;
32 	case 3:  goto L40000;
33 	case 4:  goto L41000;
34 	case 5:  goto L42000;
35 	case 6:  goto L43000;
36 	case 7:  goto L44000;
37 	case 8:  goto L45000;
38 	case 9:  goto L46000;
39 	case 10:  goto L47000;
40 	case 11:  goto L48000;
41 	case 12:  goto L49000;
42 	case 13:  goto L50000;
43 	case 14:  goto L51000;
44 	case 15:  goto L52000;
45 	case 16:  goto L53000;
46 	case 17:  goto L54000;
47 	case 18:  goto L55000;
48 	case 19:  goto L56000;
49 	case 20:  goto L57000;
50 	case 21:  goto L58000;
51 	case 22:  goto L59000;
52 	case 23:  goto L60000;
53     }
54     bug_(70, ri);
55     return ret_val;
56 
57 /* R38--	MIRROR D ROOM */
58 
59 L38000:
60     if (prsvec_1.prsa == vindex_1.lookw) {
61 	lookto_(rindex_1.fdoor, rindex_1.mrg, 0, 682, 681);
62     }
63     return ret_val;
64 
65 /* R39--	MIRROR G ROOM */
66 
67 L39000:
68     if (prsvec_1.prsa == vindex_1.walkiw) {
69 	jigsup_(685);
70     }
71     return ret_val;
72 
73 /* R40--	MIRROR C ROOM */
74 
75 L40000:
76     if (prsvec_1.prsa == vindex_1.lookw) {
77 	lookto_(rindex_1.mrg, rindex_1.mrb, 683, 0, 681);
78     }
79     return ret_val;
80 
81 /* R41--	MIRROR B ROOM */
82 
83 L41000:
84     if (prsvec_1.prsa == vindex_1.lookw) {
85 	lookto_(rindex_1.mrc, rindex_1.mra, 0, 0, 681);
86     }
87     return ret_val;
88 
89 /* R42--	MIRROR A ROOM */
90 
91 L42000:
92     if (prsvec_1.prsa == vindex_1.lookw) {
93 	lookto_(rindex_1.mrb, 0, 0, 684, 681);
94     }
95     return ret_val;
96 /* RAPPL2, PAGE 3 */
97 
98 /* R43--	MIRROR C EAST/WEST */
99 
100 L43000:
101     if (prsvec_1.prsa == vindex_1.lookw) {
102 	ewtell_(play_1.here, 683);
103     }
104     return ret_val;
105 
106 /* R44--	MIRROR B EAST/WEST */
107 
108 L44000:
109     if (prsvec_1.prsa == vindex_1.lookw) {
110 	ewtell_(play_1.here, 686);
111     }
112     return ret_val;
113 
114 /* R45--	MIRROR A EAST/WEST */
115 
116 L45000:
117     if (prsvec_1.prsa == vindex_1.lookw) {
118 	ewtell_(play_1.here, 687);
119     }
120     return ret_val;
121 
122 /* R46--	INSIDE MIRROR */
123 
124 L46000:
125     if (prsvec_1.prsa != vindex_1.lookw) {
126 	return ret_val;
127     }
128 /* 						!LOOK? */
129     rspeak_(688);
130 /* 						!DESCRIBE */
131 
132 /* NOW DESCRIBE POLE STATE. */
133 
134 /* CASES 1,2--	MDIR=270 & MLOC=MRB, POLE IS UP OR IN HOLE */
135 /* CASES 3,4--	MDIR=0 V MDIR=180, POLE IS UP OR IN CHANNEL */
136 /* CASE 5--	POLE IS UP */
137 
138     i = 689;
139 /* 						!ASSUME CASE 5. */
140     if (findex_1.mdir == 270 && findex_1.mloc == rindex_1.mrb) {
141 	i = min(findex_1.poleuf,1) + 690;
142     }
143     if (findex_1.mdir % 180 == 0) {
144 	i = min(findex_1.poleuf,1) + 692;
145     }
146     rspeak_(i);
147 /* 						!DESCRIBE POLE. */
148     i__1 = findex_1.mdir / 45 + 695;
149     rspsub_(694, i__1);
150 /* 						!DESCRIBE ARROW. */
151     return ret_val;
152 /* RAPPL2, PAGE 4 */
153 
154 /* R47--	MIRROR EYE ROOM */
155 
156 L47000:
157     if (prsvec_1.prsa != vindex_1.lookw) {
158 	return ret_val;
159     }
160 /* 						!LOOK? */
161     i = 704;
162 /* 						!ASSUME BEAM STOP. */
163     i__1 = objcts_1.olnt;
164     for (j = 1; j <= i__1; ++j) {
165 	if (qhere_(j, play_1.here) && j != oindex_1.rbeam) {
166 	    goto L47200;
167 	}
168 /* L47100: */
169     }
170     i = 703;
171 L47200:
172     rspsub_(i, objcts_1.odesc2[j - 1]);
173 /* 						!DESCRIBE BEAM. */
174     lookto_(rindex_1.mra, 0, 0, 0, 0);
175 /* 						!LOOK NORTH. */
176     return ret_val;
177 
178 /* R48--	INSIDE CRYPT */
179 
180 L48000:
181     if (prsvec_1.prsa != vindex_1.lookw) {
182 	return ret_val;
183     }
184 /* 						!LOOK? */
185     i = 46;
186 /* 						!CRYPT IS OPEN/CLOSED. */
187     if ((objcts_1.oflag2[oindex_1.tomb - 1] & OPENBT) != 0) {
188 	i = 12;
189     }
190     rspsub_(705, i);
191     return ret_val;
192 
193 /* R49--	SOUTH CORRIDOR */
194 
195 L49000:
196     if (prsvec_1.prsa != vindex_1.lookw) {
197 	return ret_val;
198     }
199 /* 						!LOOK? */
200     rspeak_(706);
201 /* 						!DESCRIBE. */
202     i = 46;
203 /* 						!ODOOR IS OPEN/CLOSED. */
204     if ((objcts_1.oflag2[oindex_1.odoor - 1] & OPENBT) != 0) {
205 	i = 12;
206     }
207     if (findex_1.lcell == 4) {
208 	rspsub_(707, i);
209     }
210 /* 						!DESCRIBE ODOOR IF THERE. */
211     return ret_val;
212 
213 /* R50--	BEHIND DOOR */
214 
215 L50000:
216     if (prsvec_1.prsa != vindex_1.walkiw) {
217 	goto L50100;
218     }
219 /* 						!WALK IN? */
220     cevent_1.cflag[cindex_1.cevfol - 1] = TRUE_;
221 /* 						!MASTER FOLLOWS. */
222     cevent_1.ctick[cindex_1.cevfol - 1] = -1;
223     return ret_val;
224 
225 L50100:
226     if (prsvec_1.prsa != vindex_1.lookw) {
227 	return ret_val;
228     }
229 /* 						!LOOK? */
230     i = 46;
231 /* 						!QDOOR IS OPEN/CLOSED. */
232     if ((objcts_1.oflag2[oindex_1.qdoor - 1] & OPENBT) != 0) {
233 	i = 12;
234     }
235     rspsub_(708, i);
236     return ret_val;
237 /* RAPPL2, PAGE 5 */
238 
239 /* R51--	FRONT DOOR */
240 
241 L51000:
242     if (prsvec_1.prsa == vindex_1.walkiw) {
243 	cevent_1.ctick[cindex_1.cevfol - 1] = 0;
244     }
245 /* 						!IF EXITS, KILL FOLLOW. */
246     if (prsvec_1.prsa != vindex_1.lookw) {
247 	return ret_val;
248     }
249 /* 						!LOOK? */
250     lookto_(0, rindex_1.mrd, 709, 0, 0);
251 /* 						!DESCRIBE SOUTH. */
252     i = 46;
253 /* 						!PANEL IS OPEN/CLOSED. */
254     if (findex_1.inqstf) {
255 	i = 12;
256     }
257 /* 						!OPEN IF INQ STARTED. */
258     j = 46;
259 /* 						!QDOOR IS OPEN/CLOSED. */
260     if ((objcts_1.oflag2[oindex_1.qdoor - 1] & OPENBT) != 0) {
261 	j = 12;
262     }
263     rspsb2_(710, i, j);
264     return ret_val;
265 
266 /* R52--	NORTH CORRIDOR */
267 
268 L52000:
269     if (prsvec_1.prsa != vindex_1.lookw) {
270 	return ret_val;
271     }
272 /* 						!LOOK? */
273     i = 46;
274     if ((objcts_1.oflag2[oindex_1.cdoor - 1] & OPENBT) != 0) {
275 	i = 12;
276     }
277 /* 						!CDOOR IS OPEN/CLOSED. */
278     rspsub_(711, i);
279     return ret_val;
280 
281 /* R53--	PARAPET */
282 
283 L53000:
284     if (prsvec_1.prsa == vindex_1.lookw) {
285 	i__1 = findex_1.pnumb + 712;
286 	rspsub_(712, i__1);
287     }
288     return ret_val;
289 
290 /* R54--	CELL */
291 
292 L54000:
293     if (prsvec_1.prsa != vindex_1.lookw) {
294 	return ret_val;
295     }
296 /* 						!LOOK? */
297     i = 721;
298 /* 						!CDOOR IS OPEN/CLOSED. */
299     if ((objcts_1.oflag2[oindex_1.cdoor - 1] & OPENBT) != 0) {
300 	i = 722;
301     }
302     rspeak_(i);
303     i = 46;
304 /* 						!ODOOR IS OPEN/CLOSED. */
305     if ((objcts_1.oflag2[oindex_1.odoor - 1] & OPENBT) != 0) {
306 	i = 12;
307     }
308     if (findex_1.lcell == 4) {
309 	rspsub_(723, i);
310     }
311 /*						!DESCRIBE. */
312     return ret_val;
313 
314 /* R55--	PRISON CELL */
315 
316 L55000:
317     if (prsvec_1.prsa == vindex_1.lookw) {
318 	rspeak_(724);
319     }
320 /* 						!LOOK? */
321     return ret_val;
322 
323 /* R56--	NIRVANA CELL */
324 
325 L56000:
326     if (prsvec_1.prsa != vindex_1.lookw) {
327 	return ret_val;
328     }
329 /* 						!LOOK? */
330     i = 46;
331 /* 						!ODOOR IS OPEN/CLOSED. */
332     if ((objcts_1.oflag2[oindex_1.odoor - 1] & OPENBT) != 0) {
333 	i = 12;
334     }
335     rspsub_(725, i);
336     return ret_val;
337 /* RAPPL2, PAGE 6 */
338 
339 /* R57--	NIRVANA AND END OF GAME */
340 
341 L57000:
342     if (prsvec_1.prsa != vindex_1.walkiw) {
343 	return ret_val;
344     }
345 /* 						!WALKIN? */
346     rspeak_(726);
347     score_(0);
348 /* moved to exit routine	CLOSE(DBCH) */
349     exit_();
350 
351 /* R58--	TOMB ROOM */
352 
353 L58000:
354     if (prsvec_1.prsa != vindex_1.lookw) {
355 	return ret_val;
356     }
357 /* 						!LOOK? */
358     i = 46;
359 /* 						!TOMB IS OPEN/CLOSED. */
360     if ((objcts_1.oflag2[oindex_1.tomb - 1] & OPENBT) != 0) {
361 	i = 12;
362     }
363     rspsub_(792, i);
364     return ret_val;
365 
366 /* R59--	PUZZLE SIDE ROOM */
367 
368 L59000:
369     if (prsvec_1.prsa != vindex_1.lookw) {
370 	return ret_val;
371     }
372 /* 						!LOOK? */
373     i = 861;
374 /* 						!ASSUME DOOR CLOSED. */
375     if (findex_1.cpoutf) {
376 	i = 862;
377     }
378 /* 						!OPEN? */
379     rspeak_(i);
380 /* 						!DESCRIBE. */
381     return ret_val;
382 
383 /* R60--	PUZZLE ROOM */
384 
385 L60000:
386     if (prsvec_1.prsa != vindex_1.lookw) {
387 	return ret_val;
388     }
389 /* 						!LOOK? */
390     if (findex_1.cpushf) {
391 	goto L60100;
392     }
393 /* 						!STARTED PUZZLE? */
394     rspeak_(868);
395 /* 						!NO, DESCRIBE. */
396     if ((objcts_1.oflag2[oindex_1.warni - 1] & TCHBT) != 0) {
397 	rspeak_(869);
398     }
399     return ret_val;
400 
401 L60100:
402     cpinfo_(880, findex_1.cphere);
403 /* 						!DESCRIBE ROOM. */
404     return ret_val;
405 
406 } /* rappl2_ */
407 
408 /* LOOKTO--	DESCRIBE VIEW IN MIRROR HALLWAY */
409 
410 /* DECLARATIONS */
411 
lookto_(nrm,srm,nt,st,ht)412 static void lookto_(nrm, srm, nt, st, ht)
413 integer nrm;
414 integer srm;
415 integer nt;
416 integer st;
417 integer ht;
418 {
419     /* System generated locals */
420     integer i__1;
421 
422     /* Local variables */
423     integer i, m1, dir, mrbf;
424 
425     rspeak_(ht);
426 /* 						!DESCRIBE HALL. */
427     rspeak_(nt);
428 /* 						!DESCRIBE NORTH VIEW. */
429     rspeak_(st);
430 /* 						!DESCRIBE SOUTH VIEW. */
431     dir = 0;
432 /* 						!ASSUME NO DIRECTION. */
433     if ((i__1 = findex_1.mloc - play_1.here, abs(i__1)) != 1) {
434 	goto L200;
435     }
436 /* 						!MIRROR TO N OR S? */
437     if (findex_1.mloc == nrm) {
438 	dir = 695;
439     }
440     if (findex_1.mloc == srm) {
441 	dir = 699;
442     }
443 /* 						!DIR=N/S. */
444     if (findex_1.mdir % 180 != 0) {
445 	goto L100;
446     }
447 /* 						!MIRROR N-S? */
448     rspsub_(847, dir);
449 /* 						!YES, HE SEES PANEL */
450     rspsb2_(848, dir, dir);
451 /* 						!AND NARROW ROOMS. */
452     goto L200;
453 
454 L100:
455     m1 = mrhere_(play_1.here);
456 /* 						!WHICH MIRROR? */
457     mrbf = 0;
458 /* 						!ASSUME INTACT. */
459     if (m1 == 1 && ! findex_1.mr1f || m1 == 2 && ! findex_1.mr2f) {
460 	mrbf = 1;
461     }
462     i__1 = mrbf + 849;
463     rspsub_(i__1, dir);
464 /* 						!DESCRIBE. */
465     if (m1 == 1 && findex_1.mropnf) {
466 	i__1 = mrbf + 823;
467 	rspeak_(i__1);
468     }
469     if (mrbf != 0) {
470 	rspeak_(851);
471     }
472 
473 L200:
474     i = 0;
475 /* 						!ASSUME NO MORE TO DO. */
476     if (nt == 0 && (dir == 0 || dir == 699)) {
477 	i = 852;
478     }
479     if (st == 0 && (dir == 0 || dir == 695)) {
480 	i = 853;
481     }
482     if (nt + st + dir == 0) {
483 	i = 854;
484     }
485     if (ht != 0) {
486 	rspeak_(i);
487     }
488 /* 						!DESCRIBE HALLS. */
489 } /* lookto_ */
490 
491 /* EWTELL--	DESCRIBE E/W NARROW ROOMS */
492 
493 /* DECLARATIONS */
494 
ewtell_(rm,st)495 static void ewtell_(rm, st)
496 integer rm;
497 integer st;
498 {
499     /* System generated locals */
500     integer i__1;
501 
502     /* Local variables */
503     integer i;
504     logical m1;
505 
506 /* NOTE THAT WE ARE EAST OR WEST OF MIRROR, AND */
507 /* MIRROR MUST BE N-S. */
508 
509     m1 = findex_1.mdir + (rm - rindex_1.mrae) % 2 * 180 == 180;
510     i = (rm - rindex_1.mrae) % 2 + 819;
511 /* 						!GET BASIC E/W STRING. */
512     if (m1 && ! findex_1.mr1f || ! m1 && ! findex_1.mr2f) {
513 	i += 2;
514     }
515     rspeak_(i);
516     if (m1 && findex_1.mropnf) {
517 	i__1 = (i - 819) / 2 + 823;
518 	rspeak_(i__1);
519     }
520     rspeak_(825);
521     rspeak_(st);
522 } /* ewtell_ */
523