4.4BSD/usr/src/contrib/dungeon/objcts.F

C OAPPLI- OBJECT SPECIAL ACTION ROUTINES
C
C COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
C ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
C WRITTEN BY R. M. SUPNIK
C
C DECLARATIONS
C
	LOGICAL FUNCTION OAPPLI(RI,ARG)
	IMPLICIT INTEGER (A-Z)
	LOGICAL SOBJS,NOBJS
	LOGICAL QOPEN,QON,LIT
	LOGICAL MOVETO,RMDESC,CLOCKD
	LOGICAL THIEFP,CYCLOP,TROLLP,BALLOP,LIGHTP
	LOGICAL QEMPTY,QHERE,F,OPNCLS
#include "parser.h"
#include "gamestate.h"
#include "state.h"
C
	COMMON /BATS/ BATDRP(9)
C
C PUZZLE ROOM
C
	COMMON /PUZZLE/ CPDR(16),CPWL(8),CPVEC(64)
#include "rooms.h"
#include "rflag.h"
#include "rindex.h"
#include "objects.h"
#include "oflags.h"
#include "oindex.h"
#include "clock.h"

#include "advers.h"
#include "verbs.h"
#include "flags.h"
C
C FUNCTIONS AND DATA
C
	QOPEN(R)=and(OFLAG2(R),OPENBT).NE.0
	QON(R)=and(OFLAG1(R),ONBT).NE.0
	DATA MXSMP/99/
C OAPPLI, PAGE 2
C
	IF(RI.EQ.0) GO TO 10
C						!ZERO IS FALSE APP.
	IF(RI.LE.MXSMP) GO TO 100
C						!SIMPLE OBJECT?
	IF(PRSO.GT.220) GO TO 5
	IF(PRSO.NE.0) ODO2=ODESC2(PRSO)
5	IF(PRSI.NE.0) ODI2=ODESC2(PRSI)
	AV=AVEHIC(WINNER)
	FLOBTS=FLAMBT+LITEBT+ONBT
	OAPPLI=.TRUE.
C
	GO TO (2000,5000,10000,11000,12000,15000,18000,
&	 19000,20000,22000,25000,26000,32000,35000,39000,40000,
&	 45000,47000,48000,49000,50000,51000,52000,54000,55000,
&	 56000,57000,58000,59000,60000,61000,62000),
&		(RI-MXSMP)
	CALL BUG(6,RI)
C
C RETURN HERE TO DECLARE FALSE RESULT
C
10	OAPPLI=.FALSE.
	RETURN
C
C SIMPLE OBJECTS, PROCESSED EXTERNALLY.
C
100	IF(RI.LT.32) OAPPLI=SOBJS(RI,ARG)
	IF(RI.GE.32) OAPPLI=NOBJS(RI,ARG)
	RETURN
C OAPPLI, PAGE 3
C
C O100--	MACHINE FUNCTION
C
2000	IF(HERE.NE.MMACH) GO TO 10
C						!NOT HERE? F
	OAPPLI=OPNCLS(MACHI,123,124)
C						!HANDLE OPN/CLS.
	RETURN
C
C O101--	WATER FUNCTION
C
5000	IF(PRSA.NE.FILLW) GO TO 5050
C						!FILL X WITH Y IS
	PRSA=PUTW
C						!MADE INTO
	I=PRSI
	PRSI=PRSO
	PRSO=I
C						!PUT Y IN X.
	I=ODI2
	ODI2=ODO2
	ODO2=I
5050	IF((PRSO.EQ.WATER).OR.(PRSO.EQ.GWATE)) GO TO 5100
	CALL RSPEAK(561)
C						!WATER IS IND OBJ,
	RETURN
C						!PUNT.
C
5100	IF(PRSA.NE.TAKEW) GO TO 5400
C						!TAKE WATER?
	IF((OADV(BOTTL).EQ.WINNER).AND.(OCAN(PRSO).NE.BOTTL))
&		GO TO 5500
	IF(OCAN(PRSO).EQ.0) GO TO 5200
C						!INSIDE ANYTHING?
	IF(QOPEN(OCAN(PRSO))) GO TO 5200
C						!YES, OPEN?
	CALL RSPEAK(525,ODESC2(OCAN(PRSO)))
C						!INSIDE, CLOSED, PUNT.
	RETURN
C
5200	CALL RSPEAK(615)
C						!NOT INSIDE OR OPEN,
	RETURN
C						!SLIPS THRU FINGERS.
C
5400	IF(PRSA.NE.PUTW) GO TO 5700
C						!PUT WATER IN X?
	IF((AV.NE.0).AND.(PRSI.EQ.AV)) GO TO 5800
C						!IN VEH?
	IF(PRSI.EQ.BOTTL) GO TO 5500
C						!IN BOTTLE?
	CALL RSPSUB(297,ODI2)
C						!WONT GO ELSEWHERE.
	CALL NEWSTA(PRSO,0,0,0,0)
C						!VANISH WATER.
	RETURN
C
5500	IF(QOPEN(BOTTL)) GO TO 5550
C						!BOTTLE OPEN?
	CALL RSPEAK(612)
C						!NO, LOSE.
	RETURN
C
5550	IF(QEMPTY(BOTTL)) GO TO 5600
C						!OPEN, EMPTY?
	CALL RSPEAK(613)
C						!NO, ALREADY FULL.
	RETURN
C
5600	CALL NEWSTA(WATER,614,0,BOTTL,0)
C						!TAKE WATER TO BOTTLE.
	RETURN
C
5700	IF((PRSA.NE.DROPW).AND.(PRSA.NE.POURW).AND.
&		(PRSA.NE.GIVEW)) GO TO 5900
	IF(AV.NE.0) GO TO 5800
C						!INTO VEHICLE?
	CALL NEWSTA(PRSO,133,0,0,0)
C						!NO, VANISHES.
	RETURN
C
5800	CALL NEWSTA(WATER,0,0,AV,0)
C						!WATER INTO VEHICLE.
	CALL RSPSUB(296,ODESC2(AV))
C						!DESCRIBE.
	RETURN
C
5900	IF(PRSA.NE.THROWW) GO TO 10
C						!LAST CHANCE, THROW?
	CALL NEWSTA(PRSO,132,0,0,0)
C						!VANISHES.
	RETURN
C OAPPLI, PAGE 4
C
C O102--	LEAF PILE
C
10000	IF(PRSA.NE.BURNW) GO TO 10500
C						!BURN?
	IF(OROOM(PRSO).EQ.0) GO TO 10100
C						!WAS HE CARRYING?
	CALL NEWSTA(PRSO,158,0,0,0)
C						!NO, BURN IT.
	RETURN
C
10100	CALL NEWSTA(PRSO,0,HERE,0,0)
C						!DROP LEAVES.
	CALL JIGSUP(159)
C						!BURN HIM.
	RETURN
C
10500	IF(PRSA.NE.MOVEW) GO TO 10600
C						!MOVE?
	CALL RSPEAK(2)
C						!DONE.
	RETURN
C
10600	IF((PRSA.NE.LOOKUW).OR.(RVCLR.NE.0)) GO TO 10
	CALL RSPEAK(344)
C						!LOOK UNDER?
	RETURN
C
C O103--	TROLL, DONE EXTERNALLY.
C
11000	OAPPLI=TROLLP(ARG)
C						!TROLL PROCESSOR.
	RETURN
C
C O104--	RUSTY KNIFE.
C
12000	IF(PRSA.NE.TAKEW) GO TO 12100
C						!TAKE?
	IF(OADV(SWORD).EQ.WINNER) CALL RSPEAK(160)
C						!PULSE SWORD.
	GO TO 10
C
12100	IF((((PRSA.NE.ATTACW).AND.(PRSA.NE.KILLW)).OR.
&		(PRSI.NE.RKNIF)).AND.
&	  (((PRSA.NE.SWINGW).AND.(PRSA.NE.THROWW)).OR.
&		(PRSO.NE.RKNIF))) GO TO 10
	CALL NEWSTA(RKNIF,0,0,0,0)
C						!KILL KNIFE.
	CALL JIGSUP(161)
C						!KILL HIM.
	RETURN
C OAPPLI, PAGE 5
C
C O105--	GLACIER
C
15000	IF(PRSA.NE.THROWW) GO TO 15500
C						!THROW?
	IF(PRSO.NE.TORCH) GO TO 15400
C						!TORCH?
	CALL NEWSTA(ICE,169,0,0,0)
C						!MELT ICE.
	ODESC1(TORCH)=174
C						!MUNG TORCH.
	ODESC2(TORCH)=173
	OFLAG1(TORCH)=and(OFLAG1(TORCH), not(FLOBTS))
	CALL NEWSTA(TORCH,0,STREA,0,0)
C						!MOVE TORCH.
	GLACRF=.TRUE.
C						!GLACIER GONE.
	IF(.NOT.LIT(HERE)) CALL RSPEAK(170)
C						!IN DARK?
	RETURN
C
15400	CALL RSPEAK(171)
C						!JOKE IF NOT TORCH.
	RETURN
C
15500	IF((PRSA.NE.MELTW).OR.(PRSO.NE.ICE)) GO TO 10
	IF(and(OFLAG1(PRSI),FLOBTS).EQ.FLOBTS) GO TO 15600
	CALL RSPSUB(298,ODI2)
C						!CANT MELT WITH THAT.
	RETURN
C
15600	GLACMF=.TRUE.
C						!PARTIAL MELT.
	IF(PRSI.NE.TORCH) GO TO 15700
C						!MELT WITH TORCH?
	ODESC1(TORCH)=174
C						!MUNG TORCH.
	ODESC2(TORCH)=173
	OFLAG1(TORCH)=and(OFLAG1(TORCH), not(FLOBTS))
15700	CALL JIGSUP(172)
C						!DROWN.
	RETURN
C
C O106--	BLACK BOOK
C
18000	IF(PRSA.NE.OPENW) GO TO 18100
C						!OPEN?
	CALL RSPEAK(180)
C						!JOKE.
	RETURN
C
18100	IF(PRSA.NE.CLOSEW) GO TO 18200
C						!CLOSE?
	CALL RSPEAK(181)
	RETURN
C
18200	IF(PRSA.NE.BURNW) GO TO 10
C						!BURN?
	CALL NEWSTA(PRSO,0,0,0,0)
C						!FATAL JOKE.
	CALL JIGSUP(182)
	RETURN
C OAPPLI, PAGE 6
C
C O107--	CANDLES, PROCESSED EXTERNALLY
C
19000	OAPPLI=LIGHTP(CANDL)
	RETURN
C
C O108--	MATCHES, PROCESSED EXTERNALLY
C
20000	OAPPLI=LIGHTP(MATCH)
	RETURN
C
C O109--	CYCLOPS, PROCESSED EXTERNALLY.
C
22000	OAPPLI=CYCLOP(ARG)
C						!CYCLOPS
	RETURN
C
C O110--	THIEF, PROCESSED EXTERNALLY
C
25000	OAPPLI=THIEFP(ARG)
	RETURN
C
C O111--	WINDOW
C
26000	OAPPLI=OPNCLS(WINDO,208,209)
C						!OPEN/CLS WINDOW.
	RETURN
C
C O112--	PILE OF BODIES
C
32000	IF(PRSA.NE.TAKEW) GO TO 32500
C						!TAKE?
	CALL RSPEAK(228)
C						!CANT.
	RETURN
C
32500	IF((PRSA.NE.BURNW).AND.(PRSA.NE.MUNGW)) GO TO 10
	IF(ONPOLF) RETURN
C						!BURN OR MUNG?
	ONPOLF=.TRUE.
C						!SET HEAD ON POLE.
	CALL NEWSTA(HPOLE,0,LLD2,0,0)
	CALL JIGSUP(229)
C						!BEHEADED.
	RETURN
C
C O113--	VAMPIRE BAT
C
35000	CALL RSPEAK(50)
C						!TIME TO FLY, JACK.
	F=MOVETO(BATDRP(RND(9)+1),WINNER)
C						!SELECT RANDOM DEST.
	F=RMDESC(0)
	RETURN
C OAPPLI, PAGE 7
C
C O114--	STICK
C
39000	IF(PRSA.NE.WAVEW) GO TO 10
C						!WAVE?
	IF(HERE.EQ.MRAIN) GO TO 39500
C						!ON RAINBOW?
	IF((HERE.EQ.POG).OR.(HERE.EQ.FALLS)) GO TO 39200
	CALL RSPEAK(244)
C						!NOTHING HAPPENS.
	RETURN
C
39200	OFLAG1(POT)=or(OFLAG1(POT),VISIBT)
	RAINBF=.NOT. RAINBF
C						!COMPLEMENT RAINBOW.
	I=245
C						!ASSUME OFF.
	IF(RAINBF) I=246
C						!IF ON, SOLID.
	CALL RSPEAK(I)
C						!DESCRIBE.
	RETURN
C
39500	RAINBF=.FALSE.
C						!ON RAINBOW,
	CALL JIGSUP(247)
C						!TAKE A FALL.
	RETURN
C
C O115--	BALLOON, HANDLED EXTERNALLY
C
40000	OAPPLI=BALLOP(ARG)
	RETURN
C
C O116--	HEADS
C
45000	IF(PRSA.NE.HELLOW) GO TO 45100
C						!HELLO HEADS?
	CALL RSPEAK(633)
C						!TRULY BIZARRE.
	RETURN
C
45100	IF(PRSA.EQ.READW) GO TO 10
C						!READ IS OK.
	CALL NEWSTA(LCASE,260,LROOM,0,0)
C						!MAKE LARGE CASE.
	I=ROBADV(WINNER,0,LCASE,0)+ROBRM(HERE,100,0,LCASE,0)
	CALL JIGSUP(261)
C						!KILL HIM.
	RETURN
C OAPPLI, PAGE 8
C
C O117--	SPHERE
C
47000	IF(CAGESF.OR.(PRSA.NE.TAKEW)) GO TO 10
C						!TAKE?
	IF(WINNER.NE.PLAYER) GO TO 47500
C						!ROBOT TAKE?
	CALL RSPEAK(263)
C						!NO, DROP CAGE.
	IF(OROOM(ROBOT).NE.HERE) GO TO 47200
C						!ROBOT HERE?
	F=MOVETO(CAGED,WINNER)
C						!YES, MOVE INTO CAGE.
	CALL NEWSTA(ROBOT,0,CAGED,0,0)
C						!MOVE ROBOT.
	AROOM(AROBOT)=CAGED
	OFLAG1(ROBOT)=or(OFLAG1(ROBOT),NDSCBT)
	CTICK(CEVSPH)=10
C						!GET OUT IN 10 OR ELSE.
	RETURN
C
47200	CALL NEWSTA(SPHER,0,0,0,0)
C						!YOURE DEAD.
	RFLAG(CAGER)=or(RFLAG(CAGER),RMUNG)
	RRAND(CAGER)=147
	CALL JIGSUP(148)
C						!MUNG PLAYER.
	RETURN
C
47500	CALL NEWSTA(SPHER,0,0,0,0)
C						!ROBOT TRIED,
	CALL NEWSTA(ROBOT,264,0,0,0)
C						!KILL HIM.
	CALL NEWSTA(CAGE,0,HERE,0,0)
C						!INSERT MANGLED CAGE.
	RETURN
C
C O118--	GEOMETRICAL BUTTONS
C
48000	IF(PRSA.NE.PUSHW) GO TO 10
C						!PUSH?
	I=PRSO-SQBUT+1
C						!GET BUTTON INDEX.
	IF((I.LE.0).OR.(I.GE.4)) GO TO 10
C						!A BUTTON?
	IF(WINNER.NE.PLAYER) GO TO (48100,48200,48300),I
	CALL JIGSUP(265)
C						!YOU PUSHED, YOU DIE.
	RETURN
C
48100	I=267
	IF(CAROZF) I=266
C						!SPEED UP?
	CAROZF=.TRUE.
	CALL RSPEAK(I)
	RETURN
C
48200	I=266
C						!ASSUME NO CHANGE.
	IF(CAROZF) I=268
	CAROZF=.FALSE.
	CALL RSPEAK(I)
	RETURN
C
48300	CAROFF=.NOT.CAROFF
C						!FLIP CAROUSEL.
	IF(.NOT.QHERE(IRBOX,CAROU)) RETURN
C						!IRON BOX IN CAROUSEL?
	CALL RSPEAK(269)
C						!YES, THUMP.
	OFLAG1(IRBOX)=xor(OFLAG1(IRBOX),VISIBT)
	IF(CAROFF) RFLAG(CAROU)=and(RFLAG(CAROU), not(RSEEN))
	RETURN
C
C O119--	FLASK FUNCTION
C
49000	IF(PRSA.EQ.OPENW) GO TO 49100
C						!OPEN?
	IF((PRSA.NE.MUNGW).AND.(PRSA.NE.THROWW)) GO TO 10
	CALL NEWSTA(FLASK,270,0,0,0)
C						!KILL FLASK.
49100	RFLAG(HERE)=or(RFLAG(HERE),RMUNG)
	RRAND(HERE)=271
	CALL JIGSUP(272)
C						!POISONED.
	RETURN
C
C O120--	BUCKET FUNCTION
C
50000	IF(ARG.NE.2) GO TO 10
C						!READOUT?
	IF((OCAN(WATER).NE.BUCKE).OR.BUCKTF) GO TO 50500
	BUCKTF=.TRUE.
C						!BUCKET AT TOP.
	CTICK(CEVBUC)=100
C						!START COUNTDOWN.
	CALL NEWSTA(BUCKE,290,TWELL,0,0)
C						!REPOSITION BUCKET.
	GO TO 50900
C						!FINISH UP.
C
50500	IF((OCAN(WATER).EQ.BUCKE).OR..NOT.BUCKTF) GO TO 10
	BUCKTF=.FALSE.
	CALL NEWSTA(BUCKE,291,BWELL,0,0)
C						!BUCKET AT BOTTOM.
50900	IF(AV.NE.BUCKE) RETURN
C						!IN BUCKET?
	F=MOVETO(OROOM(BUCKE),WINNER)
C						!MOVE ADVENTURER.
	F=RMDESC(0)
C						!DESCRIBE ROOM.
	RETURN
C OAPPLI, PAGE 9
C
C O121--	EATME CAKE
C
51000	IF((PRSA.NE.EATW).OR.(PRSO.NE.ECAKE).OR.
&		(HERE.NE.ALICE)) GO TO 10
	CALL NEWSTA(ECAKE,273,0,0,0)
C						!VANISH CAKE.
	OFLAG1(ROBOT)=and(OFLAG1(ROBOT), not(VISIBT))
	OAPPLI=MOVETO(ALISM,WINNER)
C						!MOVE TO ALICE SMALL.
	IZ=64
	IR=ALISM
	IO=ALICE
	GO TO 52405
C
C O122--	ICINGS
C
52000	IF(PRSA.NE.READW) GO TO 52200
C						!READ?
	I=274
C						!CANT READ.
	IF(PRSI.NE.0) I=275
C						!THROUGH SOMETHING?
	IF(PRSI.EQ.BOTTL) I=276
C						!THROUGH BOTTLE?
	IF(PRSI.EQ.FLASK) I=277+(PRSO-ORICE)
C						!THROUGH FLASK?
	CALL RSPEAK(I)
C						!READ FLASK.
	RETURN
C
52200	IF((PRSA.NE.THROWW).OR.(PRSO.NE.RDICE).OR.(PRSI.NE.POOL))
&		GO TO 52300
	CALL NEWSTA(POOL,280,0,0,0)
C						!VANISH POOL.
	OFLAG1(SAFFR)=or(OFLAG1(SAFFR),VISIBT)
	RETURN
C
52300	IF((HERE.NE.ALICE).AND.(HERE.NE.ALISM).AND.(HERE.NE.ALITR))
&		GO TO 10
	IF(((PRSA.NE.EATW).AND.(PRSA.NE.THROWW)).OR.
&		(PRSO.NE.ORICE)) GO TO 52400
	CALL NEWSTA(ORICE,0,0,0,0)
C						!VANISH ORANGE ICE.
	RFLAG(HERE)=or(RFLAG(HERE),RMUNG)
	RRAND(HERE)=281
	CALL JIGSUP(282)
C						!VANISH ADVENTURER.
	RETURN
C
52400	IF((PRSA.NE.EATW).OR.(PRSO.NE.BLICE))
&		GO TO 10
	CALL NEWSTA(BLICE,283,0,0,0)
C						!VANISH BLUE ICE.
	IF(HERE.NE.ALISM) GO TO 52500
C						!IN REDUCED ROOM?
	OFLAG1(ROBOT)=or(OFLAG1(ROBOT),VISIBT)
	IO=HERE
	OAPPLI=MOVETO(ALICE,WINNER)
	IZ=1/64
	IR=ALICE
C
C  Do a size change, common loop used also by code at 51000
C
52405	DO 52450 I=1,OLNT
C						!ENLARGE WORLD.
	  IF((OROOM(I).NE.IO).OR.(OSIZE(I).EQ.10000))
&		GO TO 52450
	  OROOM(I)=IR
	  OSIZE(I)=OSIZE(I)*IZ
52450	CONTINUE
	RETURN
C
52500	CALL JIGSUP(284)
C						!ENLARGED IN WRONG ROOM.
	RETURN
C
C O123--	BRICK
C
54000	IF(PRSA.NE.BURNW) GO TO 10
C						!BURN?
	CALL JIGSUP(150)
C						!BOOM
C						!
	RETURN
C
C O124--	MYSELF
C
55000	IF(PRSA.NE.GIVEW) GO TO 55100
C						!GIVE?
	CALL NEWSTA(PRSO,2,0,0,PLAYER)
C						!DONE.
	RETURN
C
55100	IF(PRSA.NE.TAKEW) GO TO 55200
C						!TAKE?
	CALL RSPEAK(286)
C						!JOKE.
	RETURN
C
55200	IF((PRSA.NE.KILLW).AND.(PRSA.NE.MUNGW)) GO TO 10
	CALL JIGSUP(287)
C						!KILL, NO JOKE.
	RETURN
C OAPPLI, PAGE 10
C
C O125--	PANELS INSIDE MIRROR
C
56000	IF(PRSA.NE.PUSHW) GO TO 10
C						!PUSH?
	IF(POLEUF.NE.0) GO TO 56100
C						!SHORT POLE UP?
	I=731
C						!NO, WONT BUDGE.
	IF(MOD(MDIR,180).EQ.0) I=732
C						!DIFF MSG IF N-S.
	CALL RSPEAK(I)
C						!TELL WONT MOVE.
	RETURN
C
56100	IF(MLOC.NE.MRG) GO TO 56200
C						!IN GDN ROOM?
	CALL RSPEAK(733)
C						!YOU LOSE.
	CALL JIGSUP(685)
	RETURN
C
56200	I=831
C						!ROTATE L OR R.
	IF((PRSO.EQ.RDWAL).OR.(PRSO.EQ.YLWAL)) I=830
	CALL RSPEAK(I)
C						!TELL DIRECTION.
	MDIR=MOD(MDIR+45+(270*(I-830)),360)
C						!CALCULATE NEW DIR.
	CALL RSPSUB(734,695+(MDIR/45))
C						!TELL NEW DIR.
	IF(WDOPNF) CALL RSPEAK(730)
C						!IF PANEL OPEN, CLOSE.
	WDOPNF=.FALSE.
	RETURN
C						!DONE.
C
C O126--	ENDS INSIDE MIRROR
C
57000	IF(PRSA.NE.PUSHW) GO TO 10
C						!PUSH?
	IF(MOD(MDIR,180).EQ.0) GO TO 57100
C						!MIRROR N-S?
	CALL RSPEAK(735)
C						!NO, WONT BUDGE.
	RETURN
C
57100	IF(PRSO.NE.PINDR) GO TO 57300
C						!PUSH PINE WALL?
	IF(((MLOC.EQ.MRC).AND.(MDIR.EQ.180)).OR.
&	  ((MLOC.EQ.MRD).AND.(MDIR.EQ.0)).OR.
&	   (MLOC.EQ.MRG)) GO TO 57200
	CALL RSPEAK(736)
C						!NO, OPENS.
	WDOPNF=.TRUE.
C						!INDICATE OPEN.
	CFLAG(CEVPIN)=.TRUE.
C						!TIME OPENING.
	CTICK(CEVPIN)=5
	RETURN
C
57200	CALL RSPEAK(737)
C						!GDN SEES YOU, DIE.
	CALL JIGSUP(685)
	RETURN
C
57300	NLOC=MLOC-1
C						!NEW LOC IF SOUTH.
	IF(MDIR.EQ.0) NLOC=MLOC+1
C						!NEW LOC IF NORTH.
	IF((NLOC.GE.MRA).AND.(NLOC.LE.MRD)) GO TO 57400
	CALL RSPEAK(738)
C						!HAVE REACHED END.
	RETURN
C
57400	I=699
C						!ASSUME SOUTH.
	IF(MDIR.EQ.0) I=695
C						!NORTH.
	J=739
C						!ASSUME SMOOTH.
	IF(POLEUF.NE.0) J=740
C						!POLE UP, WOBBLES.
	CALL RSPSUB(J,I)
C						!DESCRIBE.
	MLOC=NLOC
	IF(MLOC.NE.MRG) RETURN
C						!NOW IN GDN ROOM?
C
	IF(POLEUF.NE.0) GO TO 57500
C						!POLE UP, GDN SEES.
	IF(MROPNF.OR.WDOPNF) GO TO 57600
C						!DOOR OPEN, GDN SEES.
	IF(MR1F.AND.MR2F) RETURN
C						!MIRRORS INTACT, OK.
	CALL RSPEAK(742)
C						!MIRRORS BROKEN, DIE.
	CALL JIGSUP(743)
	RETURN
C
57500	CALL RSPEAK(741)
C						!POLE UP, DIE.
	CALL JIGSUP(743)
	RETURN
C
57600	CALL RSPEAK(744)
C						!DOOR OPEN, DIE.
	CALL JIGSUP(743)
	RETURN
C OAPPLI, PAGE 11
C
C O127--	GLOBAL GUARDIANS
C
58000	IF((PRSA.NE.ATTACW).AND.(PRSA.NE.KILLW).AND.
&	  (PRSA.NE.MUNGW)) GO TO 58100
	CALL JIGSUP(745)
C						!LOSE.
	RETURN
C
58100	IF(PRSA.NE.HELLOW) GO TO 10
C						!HELLO?
	CALL RSPEAK(746)
C						!NO REPLY.
	RETURN
C
C O128--	GLOBAL MASTER
C
59000	IF((PRSA.NE.ATTACW).AND.(PRSA.NE.KILLW).AND.
&	  (PRSA.NE.MUNGW)) GO TO 59100
	CALL JIGSUP(747)
C						!BAD IDEA.
	RETURN
C
59100	IF(PRSA.NE.TAKEW) GO TO 10
C						!TAKE?
	CALL RSPEAK(748)
C						!JOKE.
	RETURN
C
C O129--	NUMERAL FIVE (FOR JOKE)
C
60000	IF(PRSA.NE.TAKEW) GO TO 10
C						!TAKE FIVE?
	CALL RSPEAK(419)
C						!TIME PASSES.
	DO 60100 I=1,3
C						!WAIT A WHILE.
	  IF(CLOCKD(X)) RETURN
60100	CONTINUE
	RETURN
C
C O130--	CRYPT FUNCTION
C
61000	IF(.NOT.ENDGMF) GO TO 45000
C						!IF NOT EG, DIE.
	IF(PRSA.NE.OPENW) GO TO 61100
C						!OPEN?
	I=793
	IF(QOPEN(TOMB)) I=794
	CALL RSPEAK(I)
	OFLAG2(TOMB)=or(OFLAG2(TOMB),OPENBT)
	RETURN
C
61100	IF(PRSA.NE.CLOSEW) GO TO 45000
C						!CLOSE?
	I=795
	IF(QOPEN(TOMB)) I=796
	CALL RSPEAK(I)
	OFLAG2(TOMB)=and(OFLAG2(TOMB),not(OPENBT))
	IF(HERE.EQ.CRYPT) CTICK(CEVSTE)=3
C						!IF IN CRYPT, START EG.
	RETURN
C OAPPLI, PAGE 12
C
C O131--	GLOBAL LADDER
C
62000	IF((CPVEC(CPHERE+1).EQ.-2).OR.(CPVEC(CPHERE-1).EQ.-3))
&		GO TO 62100
	CALL RSPEAK(865)
C						!NO, LOSE.
	RETURN
C
62100	IF((PRSA.EQ.CLMBW).OR.(PRSA.EQ.CLMBUW)) GO TO 62200
	CALL RSPEAK(866)
C						!CLIMB IT?
	RETURN
C
62200	IF((CPHERE.EQ.10).AND.(CPVEC(CPHERE+1).EQ.-2))
&		GO TO 62300
	CALL RSPEAK(867)
C						!NO, HIT YOUR HEAD.
	RETURN
C
62300	F=MOVETO(CPANT,WINNER)
C						!TO ANTEROOM.
	F=RMDESC(3)
C						!DESCRIBE.
	RETURN
C
	END