xref: /original-bsd/contrib/dungeon/objcts.F (revision 9a77813a)
1C OAPPLI- OBJECT SPECIAL ACTION ROUTINES
2C
3C COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
4C ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
5C WRITTEN BY R. M. SUPNIK
6C
7C DECLARATIONS
8C
9	LOGICAL FUNCTION OAPPLI(RI,ARG)
10	IMPLICIT INTEGER (A-Z)
11	LOGICAL SOBJS,NOBJS
12	LOGICAL QOPEN,QON,LIT
13	LOGICAL MOVETO,RMDESC,CLOCKD
14	LOGICAL THIEFP,CYCLOP,TROLLP,BALLOP,LIGHTP
15	LOGICAL QEMPTY,QHERE,F,OPNCLS
16#include "parser.h"
17#include "gamestate.h"
18#include "state.h"
19C
20	COMMON /BATS/ BATDRP(9)
21C
22C PUZZLE ROOM
23C
24	COMMON /PUZZLE/ CPDR(16),CPWL(8),CPVEC(64)
25#include "rooms.h"
26#include "rflag.h"
27#include "rindex.h"
28#include "objects.h"
29#include "oflags.h"
30#include "oindex.h"
31#include "clock.h"
32
33#include "advers.h"
34#include "verbs.h"
35#include "flags.h"
36C
37C FUNCTIONS AND DATA
38C
39	QOPEN(R)=and(OFLAG2(R),OPENBT).NE.0
40	QON(R)=and(OFLAG1(R),ONBT).NE.0
41	DATA MXSMP/99/
42C OAPPLI, PAGE 2
43C
44	IF(RI.EQ.0) GO TO 10
45C						!ZERO IS FALSE APP.
46	IF(RI.LE.MXSMP) GO TO 100
47C						!SIMPLE OBJECT?
48	IF(PRSO.GT.220) GO TO 5
49	IF(PRSO.NE.0) ODO2=ODESC2(PRSO)
505	IF(PRSI.NE.0) ODI2=ODESC2(PRSI)
51	AV=AVEHIC(WINNER)
52	FLOBTS=FLAMBT+LITEBT+ONBT
53	OAPPLI=.TRUE.
54C
55	GO TO (2000,5000,10000,11000,12000,15000,18000,
56&	 19000,20000,22000,25000,26000,32000,35000,39000,40000,
57&	 45000,47000,48000,49000,50000,51000,52000,54000,55000,
58&	 56000,57000,58000,59000,60000,61000,62000),
59&		(RI-MXSMP)
60	CALL BUG(6,RI)
61C
62C RETURN HERE TO DECLARE FALSE RESULT
63C
6410	OAPPLI=.FALSE.
65	RETURN
66C
67C SIMPLE OBJECTS, PROCESSED EXTERNALLY.
68C
69100	IF(RI.LT.32) OAPPLI=SOBJS(RI,ARG)
70	IF(RI.GE.32) OAPPLI=NOBJS(RI,ARG)
71	RETURN
72C OAPPLI, PAGE 3
73C
74C O100--	MACHINE FUNCTION
75C
762000	IF(HERE.NE.MMACH) GO TO 10
77C						!NOT HERE? F
78	OAPPLI=OPNCLS(MACHI,123,124)
79C						!HANDLE OPN/CLS.
80	RETURN
81C
82C O101--	WATER FUNCTION
83C
845000	IF(PRSA.NE.FILLW) GO TO 5050
85C						!FILL X WITH Y IS
86	PRSA=PUTW
87C						!MADE INTO
88	I=PRSI
89	PRSI=PRSO
90	PRSO=I
91C						!PUT Y IN X.
92	I=ODI2
93	ODI2=ODO2
94	ODO2=I
955050	IF((PRSO.EQ.WATER).OR.(PRSO.EQ.GWATE)) GO TO 5100
96	CALL RSPEAK(561)
97C						!WATER IS IND OBJ,
98	RETURN
99C						!PUNT.
100C
1015100	IF(PRSA.NE.TAKEW) GO TO 5400
102C						!TAKE WATER?
103	IF((OADV(BOTTL).EQ.WINNER).AND.(OCAN(PRSO).NE.BOTTL))
104&		GO TO 5500
105	IF(OCAN(PRSO).EQ.0) GO TO 5200
106C						!INSIDE ANYTHING?
107	IF(QOPEN(OCAN(PRSO))) GO TO 5200
108C						!YES, OPEN?
109	CALL RSPEAK(525,ODESC2(OCAN(PRSO)))
110C						!INSIDE, CLOSED, PUNT.
111	RETURN
112C
1135200	CALL RSPEAK(615)
114C						!NOT INSIDE OR OPEN,
115	RETURN
116C						!SLIPS THRU FINGERS.
117C
1185400	IF(PRSA.NE.PUTW) GO TO 5700
119C						!PUT WATER IN X?
120	IF((AV.NE.0).AND.(PRSI.EQ.AV)) GO TO 5800
121C						!IN VEH?
122	IF(PRSI.EQ.BOTTL) GO TO 5500
123C						!IN BOTTLE?
124	CALL RSPSUB(297,ODI2)
125C						!WONT GO ELSEWHERE.
126	CALL NEWSTA(PRSO,0,0,0,0)
127C						!VANISH WATER.
128	RETURN
129C
1305500	IF(QOPEN(BOTTL)) GO TO 5550
131C						!BOTTLE OPEN?
132	CALL RSPEAK(612)
133C						!NO, LOSE.
134	RETURN
135C
1365550	IF(QEMPTY(BOTTL)) GO TO 5600
137C						!OPEN, EMPTY?
138	CALL RSPEAK(613)
139C						!NO, ALREADY FULL.
140	RETURN
141C
1425600	CALL NEWSTA(WATER,614,0,BOTTL,0)
143C						!TAKE WATER TO BOTTLE.
144	RETURN
145C
1465700	IF((PRSA.NE.DROPW).AND.(PRSA.NE.POURW).AND.
147&		(PRSA.NE.GIVEW)) GO TO 5900
148	IF(AV.NE.0) GO TO 5800
149C						!INTO VEHICLE?
150	CALL NEWSTA(PRSO,133,0,0,0)
151C						!NO, VANISHES.
152	RETURN
153C
1545800	CALL NEWSTA(WATER,0,0,AV,0)
155C						!WATER INTO VEHICLE.
156	CALL RSPSUB(296,ODESC2(AV))
157C						!DESCRIBE.
158	RETURN
159C
1605900	IF(PRSA.NE.THROWW) GO TO 10
161C						!LAST CHANCE, THROW?
162	CALL NEWSTA(PRSO,132,0,0,0)
163C						!VANISHES.
164	RETURN
165C OAPPLI, PAGE 4
166C
167C O102--	LEAF PILE
168C
16910000	IF(PRSA.NE.BURNW) GO TO 10500
170C						!BURN?
171	IF(OROOM(PRSO).EQ.0) GO TO 10100
172C						!WAS HE CARRYING?
173	CALL NEWSTA(PRSO,158,0,0,0)
174C						!NO, BURN IT.
175	RETURN
176C
17710100	CALL NEWSTA(PRSO,0,HERE,0,0)
178C						!DROP LEAVES.
179	CALL JIGSUP(159)
180C						!BURN HIM.
181	RETURN
182C
18310500	IF(PRSA.NE.MOVEW) GO TO 10600
184C						!MOVE?
185	CALL RSPEAK(2)
186C						!DONE.
187	RETURN
188C
18910600	IF((PRSA.NE.LOOKUW).OR.(RVCLR.NE.0)) GO TO 10
190	CALL RSPEAK(344)
191C						!LOOK UNDER?
192	RETURN
193C
194C O103--	TROLL, DONE EXTERNALLY.
195C
19611000	OAPPLI=TROLLP(ARG)
197C						!TROLL PROCESSOR.
198	RETURN
199C
200C O104--	RUSTY KNIFE.
201C
20212000	IF(PRSA.NE.TAKEW) GO TO 12100
203C						!TAKE?
204	IF(OADV(SWORD).EQ.WINNER) CALL RSPEAK(160)
205C						!PULSE SWORD.
206	GO TO 10
207C
20812100	IF((((PRSA.NE.ATTACW).AND.(PRSA.NE.KILLW)).OR.
209&		(PRSI.NE.RKNIF)).AND.
210&	  (((PRSA.NE.SWINGW).AND.(PRSA.NE.THROWW)).OR.
211&		(PRSO.NE.RKNIF))) GO TO 10
212	CALL NEWSTA(RKNIF,0,0,0,0)
213C						!KILL KNIFE.
214	CALL JIGSUP(161)
215C						!KILL HIM.
216	RETURN
217C OAPPLI, PAGE 5
218C
219C O105--	GLACIER
220C
22115000	IF(PRSA.NE.THROWW) GO TO 15500
222C						!THROW?
223	IF(PRSO.NE.TORCH) GO TO 15400
224C						!TORCH?
225	CALL NEWSTA(ICE,169,0,0,0)
226C						!MELT ICE.
227	ODESC1(TORCH)=174
228C						!MUNG TORCH.
229	ODESC2(TORCH)=173
230	OFLAG1(TORCH)=and(OFLAG1(TORCH), not(FLOBTS))
231	CALL NEWSTA(TORCH,0,STREA,0,0)
232C						!MOVE TORCH.
233	GLACRF=.TRUE.
234C						!GLACIER GONE.
235	IF(.NOT.LIT(HERE)) CALL RSPEAK(170)
236C						!IN DARK?
237	RETURN
238C
23915400	CALL RSPEAK(171)
240C						!JOKE IF NOT TORCH.
241	RETURN
242C
24315500	IF((PRSA.NE.MELTW).OR.(PRSO.NE.ICE)) GO TO 10
244	IF(and(OFLAG1(PRSI),FLOBTS).EQ.FLOBTS) GO TO 15600
245	CALL RSPSUB(298,ODI2)
246C						!CANT MELT WITH THAT.
247	RETURN
248C
24915600	GLACMF=.TRUE.
250C						!PARTIAL MELT.
251	IF(PRSI.NE.TORCH) GO TO 15700
252C						!MELT WITH TORCH?
253	ODESC1(TORCH)=174
254C						!MUNG TORCH.
255	ODESC2(TORCH)=173
256	OFLAG1(TORCH)=and(OFLAG1(TORCH), not(FLOBTS))
25715700	CALL JIGSUP(172)
258C						!DROWN.
259	RETURN
260C
261C O106--	BLACK BOOK
262C
26318000	IF(PRSA.NE.OPENW) GO TO 18100
264C						!OPEN?
265	CALL RSPEAK(180)
266C						!JOKE.
267	RETURN
268C
26918100	IF(PRSA.NE.CLOSEW) GO TO 18200
270C						!CLOSE?
271	CALL RSPEAK(181)
272	RETURN
273C
27418200	IF(PRSA.NE.BURNW) GO TO 10
275C						!BURN?
276	CALL NEWSTA(PRSO,0,0,0,0)
277C						!FATAL JOKE.
278	CALL JIGSUP(182)
279	RETURN
280C OAPPLI, PAGE 6
281C
282C O107--	CANDLES, PROCESSED EXTERNALLY
283C
28419000	OAPPLI=LIGHTP(CANDL)
285	RETURN
286C
287C O108--	MATCHES, PROCESSED EXTERNALLY
288C
28920000	OAPPLI=LIGHTP(MATCH)
290	RETURN
291C
292C O109--	CYCLOPS, PROCESSED EXTERNALLY.
293C
29422000	OAPPLI=CYCLOP(ARG)
295C						!CYCLOPS
296	RETURN
297C
298C O110--	THIEF, PROCESSED EXTERNALLY
299C
30025000	OAPPLI=THIEFP(ARG)
301	RETURN
302C
303C O111--	WINDOW
304C
30526000	OAPPLI=OPNCLS(WINDO,208,209)
306C						!OPEN/CLS WINDOW.
307	RETURN
308C
309C O112--	PILE OF BODIES
310C
31132000	IF(PRSA.NE.TAKEW) GO TO 32500
312C						!TAKE?
313	CALL RSPEAK(228)
314C						!CANT.
315	RETURN
316C
31732500	IF((PRSA.NE.BURNW).AND.(PRSA.NE.MUNGW)) GO TO 10
318	IF(ONPOLF) RETURN
319C						!BURN OR MUNG?
320	ONPOLF=.TRUE.
321C						!SET HEAD ON POLE.
322	CALL NEWSTA(HPOLE,0,LLD2,0,0)
323	CALL JIGSUP(229)
324C						!BEHEADED.
325	RETURN
326C
327C O113--	VAMPIRE BAT
328C
32935000	CALL RSPEAK(50)
330C						!TIME TO FLY, JACK.
331	F=MOVETO(BATDRP(RND(9)+1),WINNER)
332C						!SELECT RANDOM DEST.
333	F=RMDESC(0)
334	RETURN
335C OAPPLI, PAGE 7
336C
337C O114--	STICK
338C
33939000	IF(PRSA.NE.WAVEW) GO TO 10
340C						!WAVE?
341	IF(HERE.EQ.MRAIN) GO TO 39500
342C						!ON RAINBOW?
343	IF((HERE.EQ.POG).OR.(HERE.EQ.FALLS)) GO TO 39200
344	CALL RSPEAK(244)
345C						!NOTHING HAPPENS.
346	RETURN
347C
34839200	OFLAG1(POT)=or(OFLAG1(POT),VISIBT)
349	RAINBF=.NOT. RAINBF
350C						!COMPLEMENT RAINBOW.
351	I=245
352C						!ASSUME OFF.
353	IF(RAINBF) I=246
354C						!IF ON, SOLID.
355	CALL RSPEAK(I)
356C						!DESCRIBE.
357	RETURN
358C
35939500	RAINBF=.FALSE.
360C						!ON RAINBOW,
361	CALL JIGSUP(247)
362C						!TAKE A FALL.
363	RETURN
364C
365C O115--	BALLOON, HANDLED EXTERNALLY
366C
36740000	OAPPLI=BALLOP(ARG)
368	RETURN
369C
370C O116--	HEADS
371C
37245000	IF(PRSA.NE.HELLOW) GO TO 45100
373C						!HELLO HEADS?
374	CALL RSPEAK(633)
375C						!TRULY BIZARRE.
376	RETURN
377C
37845100	IF(PRSA.EQ.READW) GO TO 10
379C						!READ IS OK.
380	CALL NEWSTA(LCASE,260,LROOM,0,0)
381C						!MAKE LARGE CASE.
382	I=ROBADV(WINNER,0,LCASE,0)+ROBRM(HERE,100,0,LCASE,0)
383	CALL JIGSUP(261)
384C						!KILL HIM.
385	RETURN
386C OAPPLI, PAGE 8
387C
388C O117--	SPHERE
389C
39047000	IF(CAGESF.OR.(PRSA.NE.TAKEW)) GO TO 10
391C						!TAKE?
392	IF(WINNER.NE.PLAYER) GO TO 47500
393C						!ROBOT TAKE?
394	CALL RSPEAK(263)
395C						!NO, DROP CAGE.
396	IF(OROOM(ROBOT).NE.HERE) GO TO 47200
397C						!ROBOT HERE?
398	F=MOVETO(CAGED,WINNER)
399C						!YES, MOVE INTO CAGE.
400	CALL NEWSTA(ROBOT,0,CAGED,0,0)
401C						!MOVE ROBOT.
402	AROOM(AROBOT)=CAGED
403	OFLAG1(ROBOT)=or(OFLAG1(ROBOT),NDSCBT)
404	CTICK(CEVSPH)=10
405C						!GET OUT IN 10 OR ELSE.
406	RETURN
407C
40847200	CALL NEWSTA(SPHER,0,0,0,0)
409C						!YOURE DEAD.
410	RFLAG(CAGER)=or(RFLAG(CAGER),RMUNG)
411	RRAND(CAGER)=147
412	CALL JIGSUP(148)
413C						!MUNG PLAYER.
414	RETURN
415C
41647500	CALL NEWSTA(SPHER,0,0,0,0)
417C						!ROBOT TRIED,
418	CALL NEWSTA(ROBOT,264,0,0,0)
419C						!KILL HIM.
420	CALL NEWSTA(CAGE,0,HERE,0,0)
421C						!INSERT MANGLED CAGE.
422	RETURN
423C
424C O118--	GEOMETRICAL BUTTONS
425C
42648000	IF(PRSA.NE.PUSHW) GO TO 10
427C						!PUSH?
428	I=PRSO-SQBUT+1
429C						!GET BUTTON INDEX.
430	IF((I.LE.0).OR.(I.GE.4)) GO TO 10
431C						!A BUTTON?
432	IF(WINNER.NE.PLAYER) GO TO (48100,48200,48300),I
433	CALL JIGSUP(265)
434C						!YOU PUSHED, YOU DIE.
435	RETURN
436C
43748100	I=267
438	IF(CAROZF) I=266
439C						!SPEED UP?
440	CAROZF=.TRUE.
441	CALL RSPEAK(I)
442	RETURN
443C
44448200	I=266
445C						!ASSUME NO CHANGE.
446	IF(CAROZF) I=268
447	CAROZF=.FALSE.
448	CALL RSPEAK(I)
449	RETURN
450C
45148300	CAROFF=.NOT.CAROFF
452C						!FLIP CAROUSEL.
453	IF(.NOT.QHERE(IRBOX,CAROU)) RETURN
454C						!IRON BOX IN CAROUSEL?
455	CALL RSPEAK(269)
456C						!YES, THUMP.
457	OFLAG1(IRBOX)=xor(OFLAG1(IRBOX),VISIBT)
458	IF(CAROFF) RFLAG(CAROU)=and(RFLAG(CAROU), not(RSEEN))
459	RETURN
460C
461C O119--	FLASK FUNCTION
462C
46349000	IF(PRSA.EQ.OPENW) GO TO 49100
464C						!OPEN?
465	IF((PRSA.NE.MUNGW).AND.(PRSA.NE.THROWW)) GO TO 10
466	CALL NEWSTA(FLASK,270,0,0,0)
467C						!KILL FLASK.
46849100	RFLAG(HERE)=or(RFLAG(HERE),RMUNG)
469	RRAND(HERE)=271
470	CALL JIGSUP(272)
471C						!POISONED.
472	RETURN
473C
474C O120--	BUCKET FUNCTION
475C
47650000	IF(ARG.NE.2) GO TO 10
477C						!READOUT?
478	IF((OCAN(WATER).NE.BUCKE).OR.BUCKTF) GO TO 50500
479	BUCKTF=.TRUE.
480C						!BUCKET AT TOP.
481	CTICK(CEVBUC)=100
482C						!START COUNTDOWN.
483	CALL NEWSTA(BUCKE,290,TWELL,0,0)
484C						!REPOSITION BUCKET.
485	GO TO 50900
486C						!FINISH UP.
487C
48850500	IF((OCAN(WATER).EQ.BUCKE).OR..NOT.BUCKTF) GO TO 10
489	BUCKTF=.FALSE.
490	CALL NEWSTA(BUCKE,291,BWELL,0,0)
491C						!BUCKET AT BOTTOM.
49250900	IF(AV.NE.BUCKE) RETURN
493C						!IN BUCKET?
494	F=MOVETO(OROOM(BUCKE),WINNER)
495C						!MOVE ADVENTURER.
496	F=RMDESC(0)
497C						!DESCRIBE ROOM.
498	RETURN
499C OAPPLI, PAGE 9
500C
501C O121--	EATME CAKE
502C
50351000	IF((PRSA.NE.EATW).OR.(PRSO.NE.ECAKE).OR.
504&		(HERE.NE.ALICE)) GO TO 10
505	CALL NEWSTA(ECAKE,273,0,0,0)
506C						!VANISH CAKE.
507	OFLAG1(ROBOT)=and(OFLAG1(ROBOT), not(VISIBT))
508	OAPPLI=MOVETO(ALISM,WINNER)
509C						!MOVE TO ALICE SMALL.
510	IZ=64
511	IR=ALISM
512	IO=ALICE
513	GO TO 52405
514C
515C O122--	ICINGS
516C
51752000	IF(PRSA.NE.READW) GO TO 52200
518C						!READ?
519	I=274
520C						!CANT READ.
521	IF(PRSI.NE.0) I=275
522C						!THROUGH SOMETHING?
523	IF(PRSI.EQ.BOTTL) I=276
524C						!THROUGH BOTTLE?
525	IF(PRSI.EQ.FLASK) I=277+(PRSO-ORICE)
526C						!THROUGH FLASK?
527	CALL RSPEAK(I)
528C						!READ FLASK.
529	RETURN
530C
53152200	IF((PRSA.NE.THROWW).OR.(PRSO.NE.RDICE).OR.(PRSI.NE.POOL))
532&		GO TO 52300
533	CALL NEWSTA(POOL,280,0,0,0)
534C						!VANISH POOL.
535	OFLAG1(SAFFR)=or(OFLAG1(SAFFR),VISIBT)
536	RETURN
537C
53852300	IF((HERE.NE.ALICE).AND.(HERE.NE.ALISM).AND.(HERE.NE.ALITR))
539&		GO TO 10
540	IF(((PRSA.NE.EATW).AND.(PRSA.NE.THROWW)).OR.
541&		(PRSO.NE.ORICE)) GO TO 52400
542	CALL NEWSTA(ORICE,0,0,0,0)
543C						!VANISH ORANGE ICE.
544	RFLAG(HERE)=or(RFLAG(HERE),RMUNG)
545	RRAND(HERE)=281
546	CALL JIGSUP(282)
547C						!VANISH ADVENTURER.
548	RETURN
549C
55052400	IF((PRSA.NE.EATW).OR.(PRSO.NE.BLICE))
551&		GO TO 10
552	CALL NEWSTA(BLICE,283,0,0,0)
553C						!VANISH BLUE ICE.
554	IF(HERE.NE.ALISM) GO TO 52500
555C						!IN REDUCED ROOM?
556	OFLAG1(ROBOT)=or(OFLAG1(ROBOT),VISIBT)
557	IO=HERE
558	OAPPLI=MOVETO(ALICE,WINNER)
559	IZ=1/64
560	IR=ALICE
561C
562C  Do a size change, common loop used also by code at 51000
563C
56452405	DO 52450 I=1,OLNT
565C						!ENLARGE WORLD.
566	  IF((OROOM(I).NE.IO).OR.(OSIZE(I).EQ.10000))
567&		GO TO 52450
568	  OROOM(I)=IR
569	  OSIZE(I)=OSIZE(I)*IZ
57052450	CONTINUE
571	RETURN
572C
57352500	CALL JIGSUP(284)
574C						!ENLARGED IN WRONG ROOM.
575	RETURN
576C
577C O123--	BRICK
578C
57954000	IF(PRSA.NE.BURNW) GO TO 10
580C						!BURN?
581	CALL JIGSUP(150)
582C						!BOOM
583C						!
584	RETURN
585C
586C O124--	MYSELF
587C
58855000	IF(PRSA.NE.GIVEW) GO TO 55100
589C						!GIVE?
590	CALL NEWSTA(PRSO,2,0,0,PLAYER)
591C						!DONE.
592	RETURN
593C
59455100	IF(PRSA.NE.TAKEW) GO TO 55200
595C						!TAKE?
596	CALL RSPEAK(286)
597C						!JOKE.
598	RETURN
599C
60055200	IF((PRSA.NE.KILLW).AND.(PRSA.NE.MUNGW)) GO TO 10
601	CALL JIGSUP(287)
602C						!KILL, NO JOKE.
603	RETURN
604C OAPPLI, PAGE 10
605C
606C O125--	PANELS INSIDE MIRROR
607C
60856000	IF(PRSA.NE.PUSHW) GO TO 10
609C						!PUSH?
610	IF(POLEUF.NE.0) GO TO 56100
611C						!SHORT POLE UP?
612	I=731
613C						!NO, WONT BUDGE.
614	IF(MOD(MDIR,180).EQ.0) I=732
615C						!DIFF MSG IF N-S.
616	CALL RSPEAK(I)
617C						!TELL WONT MOVE.
618	RETURN
619C
62056100	IF(MLOC.NE.MRG) GO TO 56200
621C						!IN GDN ROOM?
622	CALL RSPEAK(733)
623C						!YOU LOSE.
624	CALL JIGSUP(685)
625	RETURN
626C
62756200	I=831
628C						!ROTATE L OR R.
629	IF((PRSO.EQ.RDWAL).OR.(PRSO.EQ.YLWAL)) I=830
630	CALL RSPEAK(I)
631C						!TELL DIRECTION.
632	MDIR=MOD(MDIR+45+(270*(I-830)),360)
633C						!CALCULATE NEW DIR.
634	CALL RSPSUB(734,695+(MDIR/45))
635C						!TELL NEW DIR.
636	IF(WDOPNF) CALL RSPEAK(730)
637C						!IF PANEL OPEN, CLOSE.
638	WDOPNF=.FALSE.
639	RETURN
640C						!DONE.
641C
642C O126--	ENDS INSIDE MIRROR
643C
64457000	IF(PRSA.NE.PUSHW) GO TO 10
645C						!PUSH?
646	IF(MOD(MDIR,180).EQ.0) GO TO 57100
647C						!MIRROR N-S?
648	CALL RSPEAK(735)
649C						!NO, WONT BUDGE.
650	RETURN
651C
65257100	IF(PRSO.NE.PINDR) GO TO 57300
653C						!PUSH PINE WALL?
654	IF(((MLOC.EQ.MRC).AND.(MDIR.EQ.180)).OR.
655&	  ((MLOC.EQ.MRD).AND.(MDIR.EQ.0)).OR.
656&	   (MLOC.EQ.MRG)) GO TO 57200
657	CALL RSPEAK(736)
658C						!NO, OPENS.
659	WDOPNF=.TRUE.
660C						!INDICATE OPEN.
661	CFLAG(CEVPIN)=.TRUE.
662C						!TIME OPENING.
663	CTICK(CEVPIN)=5
664	RETURN
665C
66657200	CALL RSPEAK(737)
667C						!GDN SEES YOU, DIE.
668	CALL JIGSUP(685)
669	RETURN
670C
67157300	NLOC=MLOC-1
672C						!NEW LOC IF SOUTH.
673	IF(MDIR.EQ.0) NLOC=MLOC+1
674C						!NEW LOC IF NORTH.
675	IF((NLOC.GE.MRA).AND.(NLOC.LE.MRD)) GO TO 57400
676	CALL RSPEAK(738)
677C						!HAVE REACHED END.
678	RETURN
679C
68057400	I=699
681C						!ASSUME SOUTH.
682	IF(MDIR.EQ.0) I=695
683C						!NORTH.
684	J=739
685C						!ASSUME SMOOTH.
686	IF(POLEUF.NE.0) J=740
687C						!POLE UP, WOBBLES.
688	CALL RSPSUB(J,I)
689C						!DESCRIBE.
690	MLOC=NLOC
691	IF(MLOC.NE.MRG) RETURN
692C						!NOW IN GDN ROOM?
693C
694	IF(POLEUF.NE.0) GO TO 57500
695C						!POLE UP, GDN SEES.
696	IF(MROPNF.OR.WDOPNF) GO TO 57600
697C						!DOOR OPEN, GDN SEES.
698	IF(MR1F.AND.MR2F) RETURN
699C						!MIRRORS INTACT, OK.
700	CALL RSPEAK(742)
701C						!MIRRORS BROKEN, DIE.
702	CALL JIGSUP(743)
703	RETURN
704C
70557500	CALL RSPEAK(741)
706C						!POLE UP, DIE.
707	CALL JIGSUP(743)
708	RETURN
709C
71057600	CALL RSPEAK(744)
711C						!DOOR OPEN, DIE.
712	CALL JIGSUP(743)
713	RETURN
714C OAPPLI, PAGE 11
715C
716C O127--	GLOBAL GUARDIANS
717C
71858000	IF((PRSA.NE.ATTACW).AND.(PRSA.NE.KILLW).AND.
719&	  (PRSA.NE.MUNGW)) GO TO 58100
720	CALL JIGSUP(745)
721C						!LOSE.
722	RETURN
723C
72458100	IF(PRSA.NE.HELLOW) GO TO 10
725C						!HELLO?
726	CALL RSPEAK(746)
727C						!NO REPLY.
728	RETURN
729C
730C O128--	GLOBAL MASTER
731C
73259000	IF((PRSA.NE.ATTACW).AND.(PRSA.NE.KILLW).AND.
733&	  (PRSA.NE.MUNGW)) GO TO 59100
734	CALL JIGSUP(747)
735C						!BAD IDEA.
736	RETURN
737C
73859100	IF(PRSA.NE.TAKEW) GO TO 10
739C						!TAKE?
740	CALL RSPEAK(748)
741C						!JOKE.
742	RETURN
743C
744C O129--	NUMERAL FIVE (FOR JOKE)
745C
74660000	IF(PRSA.NE.TAKEW) GO TO 10
747C						!TAKE FIVE?
748	CALL RSPEAK(419)
749C						!TIME PASSES.
750	DO 60100 I=1,3
751C						!WAIT A WHILE.
752	  IF(CLOCKD(X)) RETURN
75360100	CONTINUE
754	RETURN
755C
756C O130--	CRYPT FUNCTION
757C
75861000	IF(.NOT.ENDGMF) GO TO 45000
759C						!IF NOT EG, DIE.
760	IF(PRSA.NE.OPENW) GO TO 61100
761C						!OPEN?
762	I=793
763	IF(QOPEN(TOMB)) I=794
764	CALL RSPEAK(I)
765	OFLAG2(TOMB)=or(OFLAG2(TOMB),OPENBT)
766	RETURN
767C
76861100	IF(PRSA.NE.CLOSEW) GO TO 45000
769C						!CLOSE?
770	I=795
771	IF(QOPEN(TOMB)) I=796
772	CALL RSPEAK(I)
773	OFLAG2(TOMB)=and(OFLAG2(TOMB),not(OPENBT))
774	IF(HERE.EQ.CRYPT) CTICK(CEVSTE)=3
775C						!IF IN CRYPT, START EG.
776	RETURN
777C OAPPLI, PAGE 12
778C
779C O131--	GLOBAL LADDER
780C
78162000	IF((CPVEC(CPHERE+1).EQ.-2).OR.(CPVEC(CPHERE-1).EQ.-3))
782&		GO TO 62100
783	CALL RSPEAK(865)
784C						!NO, LOSE.
785	RETURN
786C
78762100	IF((PRSA.EQ.CLMBW).OR.(PRSA.EQ.CLMBUW)) GO TO 62200
788	CALL RSPEAK(866)
789C						!CLIMB IT?
790	RETURN
791C
79262200	IF((CPHERE.EQ.10).AND.(CPVEC(CPHERE+1).EQ.-2))
793&		GO TO 62300
794	CALL RSPEAK(867)
795C						!NO, HIT YOUR HEAD.
796	RETURN
797C
79862300	F=MOVETO(CPANT,WINNER)
799C						!TO ANTEROOM.
800	F=RMDESC(3)
801C						!DESCRIBE.
802	RETURN
803C
804	END
805