date and time created 90/10/11 11:35:49 by bostic
[unix-history] / usr / src / contrib / dungeon / objcts.F
CommitLineData
8b22683c
KB
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