C NOBJS-	NEW OBJECTS PROCESSOR
C	OBJECTS IN THIS MODULE CANNOT CALL RMINFO, JIGSUP,
C	MAJOR VERBS, OR OTHER NON-RESIDENT SUBROUTINES
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 NOBJS(RI,ARG)
	IMPLICIT INTEGER (A-Z)
	LOGICAL QOPEN,MOVETO,F
	LOGICAL QHERE,OPNCLS,MIRPAN
C
C PARSER OUTPUT
C
	LOGICAL PRSWON
	COMMON /PRSVEC/ PRSA,PRSI,PRSO,PRSWON,PRSCON
C
C GAME STATE
C
	LOGICAL TELFLG
	COMMON /PLAY/ WINNER,HERE,TELFLG
	COMMON /STATE/ MOVES,DEATHS,RWSCOR,MXSCOR,MXLOAD,
	1	LTSHFT,BLOC,MUNGRM,HS,EGSCOR,EGMXSC
C
C SCREEN OF LIGHT
C
	COMMON /SCREEN/ FROMDR,SCOLRM,SCOLAC
	COMMON /SCREEN/ SCOLDR(8),SCOLWL(12)
C
C PUZZLE ROOM
C
	COMMON /PUZZLE/ CPDR(16),CPWL(8),CPVEC(64)
C
C MISCELLANEOUS VARIABLES
C
	COMMON /HYPER/ HFACTR
C
C ROOMS
C
	COMMON /ROOMS/ RLNT,RDESC2,RDESC1(200),REXIT(200),
	1	RACTIO(200),RVAL(200),RFLAG(200)
	INTEGER RRAND(200)
	EQUIVALENCE (RVAL,RRAND)
C
	COMMON /RFLAG/ RSEEN,RLIGHT,RLAND,RWATER,RAIR,
	1	RSACRD,RFILL,RMUNG,RBUCK,RHOUSE,RNWALL,REND
C
	COMMON /RINDEX/ WHOUS,LROOM,CELLA
	COMMON /RINDEX/ MTROL,MAZE1	
	COMMON /RINDEX/ MGRAT,MAZ15	
	COMMON /RINDEX/ FORE1,FORE3,CLEAR,RESER
	COMMON /RINDEX/ STREA,EGYPT,ECHOR
	COMMON /RINDEX/ TSHAF	
	COMMON /RINDEX/ BSHAF,MMACH,DOME,MTORC
	COMMON /RINDEX/ CAROU	
	COMMON /RINDEX/ RIDDL,LLD2,TEMP1,TEMP2,MAINT
	COMMON /RINDEX/ BLROO,TREAS,RIVR1,RIVR2,RIVR3,MCYCL
	COMMON /RINDEX/ RIVR4,RIVR5,FCHMP,FALLS,MBARR
	COMMON /RINDEX/ MRAIN,POG,VLBOT,VAIR1,VAIR2,VAIR3,VAIR4
	COMMON /RINDEX/ LEDG2,LEDG3,LEDG4,MSAFE,CAGER
	COMMON /RINDEX/ CAGED,TWELL,BWELL,ALICE,ALISM,ALITR
	COMMON /RINDEX/ MTREE,BKENT,BKVW,BKTWI,BKVAU,BKBOX
	COMMON /RINDEX/ CRYPT,TSTRS,MRANT,MREYE
	COMMON /RINDEX/ MRA,MRB,MRC,MRG,MRD,FDOOR
	COMMON /RINDEX/ MRAE,MRCE,MRCW,MRGE,MRGW,MRDW,INMIR
	COMMON /RINDEX/ SCORR,NCORR,PARAP,CELL,PCELL,NCELL
	COMMON /RINDEX/ CPANT,CPOUT,CPUZZ
C
C OBJECTS
C
	COMMON /OBJCTS/ OLNT,ODESC1(220),ODESC2(220),ODESCO(220),
	1	OACTIO(220),OFLAG1(220),OFLAG2(220),OFVAL(220),
	2	OTVAL(220),OSIZE(220),OCAPAC(220),OROOM(220),
	3	OADV(220),OCAN(220),OREAD(220)
C
	COMMON /OFLAGS/ VISIBT,READBT,TAKEBT,DOORBT,TRANBT,FOODBT,
	1	NDSCBT,DRNKBT,CONTBT,LITEBT,VICTBT,BURNBT,FLAMBT,
	2	TOOLBT,TURNBT,ONBT
	COMMON /OFLAGS/ FINDBT,SLEPBT,SCRDBT,TIEBT,CLMBBT,ACTRBT,
	1	WEAPBT,FITEBT,VILLBT,STAGBT,TRYBT,NOCHBT,OPENBT,
	2	TCHBT,VEHBT,SCHBT
C
	COMMON /OINDEX/ GARLI,FOOD,GUNK,COAL,MACHI,DIAMO,TCASE,BOTTL
	COMMON /OINDEX/ WATER,ROPE,KNIFE,SWORD,LAMP,BLAMP,RUG
	COMMON /OINDEX/	LEAVE,TROLL,AXE
	COMMON /OINDEX/ RKNIF,KEYS,ICE,BAR
	COMMON /OINDEX/ COFFI,TORCH,TBASK,FBASK,IRBOX
	COMMON /OINDEX/ GHOST,TRUNK,BELL,BOOK,CANDL
	COMMON /OINDEX/ MATCH,TUBE,PUTTY,WRENC,SCREW,CYCLO,CHALI
	COMMON /OINDEX/ THIEF,STILL,WINDO,GRATE,DOOR
	COMMON /OINDEX/ HPOLE,LEAK,RBUTT,RAILI
	COMMON /OINDEX/ POT,STATU,IBOAT,DBOAT,PUMP,RBOAT
	COMMON /OINDEX/ STICK,BUOY,SHOVE,BALLO,RECEP,GUANO
	COMMON /OINDEX/ BROPE,HOOK1,HOOK2,SAFE,SSLOT,BRICK,FUSE
	COMMON /OINDEX/ GNOME,BLABE,DBALL,TOMB
	COMMON /OINDEX/ LCASE,CAGE,RCAGE,SPHER,SQBUT
	COMMON /OINDEX/ FLASK,POOL,SAFFR,BUCKE,ECAKE,ORICE,RDICE,BLICE
	COMMON /OINDEX/ ROBOT,FTREE,BILLS,PORTR,SCOL,ZGNOM
	COMMON /OINDEX/ EGG,BEGG,BAUBL,CANAR,BCANA
	COMMON /OINDEX/ YLWAL,RDWAL,PINDR,RBEAM
	COMMON /OINDEX/ ODOOR,QDOOR,CDOOR,NUM1,NUM8
	COMMON /OINDEX/ WARNI,CSLIT,GCARD,STLDR
	COMMON /OINDEX/ HANDS,WALL,LUNGS,SAILO,AVIAT,TEETH
	COMMON /OINDEX/ ITOBJ,EVERY,VALUA,OPLAY,WNORT,GWATE,MASTER
C
C CLOCK INTERRUPTS
C
	LOGICAL*1 CFLAG
	COMMON /CEVENT/ CLNT,CTICK(25),CACTIO(25),CFLAG(25)
C
	COMMON /CINDEX/ CEVCUR,CEVMNT,CEVLNT,CEVMAT,CEVCND,
	1	CEVBAL,CEVBRN,CEVFUS,CEVLED,CEVSAF,CEVVLG,
	2	CEVGNO,CEVBUC,CEVSPH,CEVEGH,
	3	CEVFOR,CEVSCL,CEVZGI,CEVZGO,CEVSTE,
	5	CEVMRS,CEVPIN,CEVINQ,CEVFOL

C
C VILLAINS AND DEMONS
C
	LOGICAL THFFLG,SWDACT,THFACT
	COMMON /HACK/ THFPOS,THFFLG,THFACT,SWDACT,SWDSTA
C
C ADVENTURERS
C
	COMMON /ADVS/ ALNT,AROOM(4),ASCORE(4),AVEHIC(4),
	1	AOBJ(4),AACTIO(4),ASTREN(4),AFLAG(4)
C
	COMMON /AINDEX/ PLAYER,AROBOT,AMASTR
C
C VERBS
C
	COMMON /VINDEX/ CINTW,DEADXW,FRSTQW,INXW,OUTXW
	COMMON /VINDEX/ WALKIW,FIGHTW,FOOW
	COMMON /VINDEX/ MELTW,READW,INFLAW,DEFLAW,ALARMW,EXORCW
	COMMON /VINDEX/ PLUGW,KICKW,WAVEW,RAISEW,LOWERW,RUBW
	COMMON /VINDEX/ PUSHW,UNTIEW,TIEW,TIEUPW,TURNW,BREATW
	COMMON /VINDEX/ KNOCKW,LOOKW,EXAMIW,SHAKEW,MOVEW,TRNONW,TRNOFW
	COMMON /VINDEX/ OPENW,CLOSEW,FINDW,WAITW,SPINW,BOARDW,UNBOAW,TAKEW
	COMMON /VINDEX/ INVENW,FILLW,EATW,DRINKW,BURNW
	COMMON /VINDEX/ MUNGW,KILLW,ATTACW,SWINGW
	COMMON /VINDEX/ WALKW,TELLW,PUTW,DROPW,GIVEW,POURW,THROWW
	COMMON /VINDEX/ DIGW,LEAPW,STAYW,FOLLOW
	COMMON /VINDEX/ HELLOW,LOOKIW,LOOKUW,PUMPW,WINDW
	COMMON /VINDEX/ CLMBW,CLMBUW,CLMBDW,TRNTOW
C
C FLAGS
C
	LOGICAL*1 TROLLF,CAGESF,BUCKTF,CAROFF,CAROZF,LWTIDF
	LOGICAL*1 DOMEF,GLACRF,ECHOF,RIDDLF,LLDF,CYCLOF
	LOGICAL*1 MAGICF,LITLDF,SAFEF,GNOMEF,GNODRF,MIRRMF
	LOGICAL*1 EGYPTF,ONPOLF,BLABF,BRIEFF,SUPERF,BUOYF
	LOGICAL*1 GRUNLF,GATEF,RAINBF,CAGETF,EMPTHF,DEFLAF
	LOGICAL*1 GLACMF,FROBZF,ENDGMF,BADLKF,THFENF,SINGSF
	LOGICAL*1 MRPSHF,MROPNF,WDOPNF,MR1F,MR2F,INQSTF
	LOGICAL*1 FOLLWF,SPELLF,CPOUTF,CPUSHF
	COMMON /FINDEX/ TROLLF,CAGESF,BUCKTF,CAROFF,CAROZF,LWTIDF,
	1	DOMEF,GLACRF,ECHOF,RIDDLF,LLDF,CYCLOF,
	2	MAGICF,LITLDF,SAFEF,GNOMEF,GNODRF,MIRRMF,
	3	EGYPTF,ONPOLF,BLABF,BRIEFF,SUPERF,BUOYF,
	4	GRUNLF,GATEF,RAINBF,CAGETF,EMPTHF,DEFLAF,
	5	GLACMF,FROBZF,ENDGMF,BADLKF,THFENF,SINGSF,
	6	MRPSHF,MROPNF,WDOPNF,MR1F,MR2F,INQSTF,
	7	FOLLWF,SPELLF,CPOUTF,CPUSHF
	COMMON /FINDEX/ BTIEF,BINFF
	COMMON /FINDEX/ RVMNT,RVCLR,RVCYC,RVSND,RVGUA
	COMMON /FINDEX/ ORRUG,ORCAND,ORMTCH,ORLAMP
	COMMON /FINDEX/ MDIR,MLOC,POLEUF
	COMMON /FINDEX/ QUESNO,NQATT,CORRCT
	COMMON /FINDEX/ LCELL,PNUMB,ACELL,DCELL,CPHERE
C
C FUNCTIONS AND DATA
C
	QOPEN(R)=(OFLAG2(R).AND.OPENBT).NE.0
C NOBJS, PAGE 2
C
	IF(PRSO.NE.0) ODO2=ODESC2(PRSO)
	IF(PRSI.NE.0) ODI2=ODESC2(PRSI)
	AV=AVEHIC(WINNER)
	NOBJS=.TRUE.
C
	GO TO (1000,2000,3000,4000,5000,6000,7000,8000,9000,
	1 10000,11000,12000,13000,14000,15000,16000,17000,
	2 18000,19000,20000,21000),
	3	(RI-31)
	CALL BUG(6,RI)
C
C RETURN HERE TO DECLARE FALSE RESULT
C
10	NOBJS=.FALSE.
	RETURN
C
C O32--	BILLS
C
1000	IF(PRSA.NE.EATW) GO TO 1100		!EAT?
	CALL RSPEAK(639)			!JOKE.
	RETURN
C
1100	IF(PRSA.EQ.BURNW) CALL RSPEAK(640)	!BURN?  JOKE.
	GO TO 10				!LET IT BE HANDLED.
C NOBJS, PAGE 3
C
C O33--	SCREEN OF LIGHT
C
2000	TARGET=SCOL				!TARGET IS SCOL.
2100	IF(PRSO.NE.TARGET) GO TO 2400		!PRSO EQ TARGET?
	IF((PRSA.NE.PUSHW).AND.(PRSA.NE.MOVEW).AND.
	1	(PRSA.NE.TAKEW).AND.(PRSA.NE.RUBW)) GO TO 2200
	CALL RSPEAK(673)			!HAND PASSES THRU.
	RETURN
C
2200	IF((PRSA.NE.KILLW).AND.(PRSA.NE.ATTACW).AND.
	1	(PRSA.NE.MUNGW)) GO TO 2400	!AGGRESSIVE?
	CALL RSPSUB(674,ODI2)			!PASSES THRU.
	RETURN
C
2400	IF((PRSA.NE.THROWW).OR.(PRSI.NE.TARGET)) GO TO 10
	IF(HERE.EQ.BKBOX) GO TO 2600		!THRU SCOL?
	CALL NEWSTA(PRSO,0,BKBOX,0,0)		!NO, THRU WALL.
	CALL RSPSUB(675,ODO2)			!ENDS UP IN BOX ROOM.
	CTICK(CEVSCL)=0				!CANCEL ALARM.
	SCOLRM=0				!RESET SCOL ROOM.
	RETURN
C
2600	IF(SCOLRM.EQ.0) GO TO 2900		!TRIED TO GO THRU?
	CALL NEWSTA(PRSO,0,SCOLRM,0,0)		!SUCCESS.
	CALL RSPSUB(676,ODO2)			!ENDS UP SOMEWHERE.
	CTICK(CEVSCL)=0			!CANCEL ALARM.
	SCOLRM=0				!RESET SCOL ROOM.
	RETURN
C
2900	CALL RSPEAK(213)			!CANT DO IT.
	RETURN
C NOBJS, PAGE 4
C
C O34--	GNOME OF ZURICH
C
3000	IF((PRSA.NE.GIVEW).AND.(PRSA.NE.THROWW)) GO TO 3200
	IF(OTVAL(PRSO).NE.0) GO TO 3100		!THROW A TREASURE?
	CALL NEWSTA(PRSO,641,0,0,0)		!NO, GO POP.
	RETURN
C
3100	CALL NEWSTA(PRSO,0,0,0,0)		!YES, BYE BYE TREASURE.
	CALL RSPSUB(642,ODO2)
	CALL NEWSTA(ZGNOM,0,0,0,0)		!BYE BYE GNOME.
	CTICK(CEVZGO)=0				!CANCEL EXIT.
	F=MOVETO(BKENT,WINNER)			!NOW IN BANK ENTRANCE.
	RETURN
C
3200	IF((PRSA.NE.ATTACW).AND.(PRSA.NE.KILLW).AND.
	1	(PRSA.NE.MUNGW)) GO TO 3300	!AGGRESSIVE?
	CALL NEWSTA(ZGNOM,643,0,0,0)		!VANISH GNOME.
	CTICK(CEVZGO)=0				!CANCEL EXIT.
	RETURN
C
3300	CALL RSPEAK(644)			!GNOME IS IMPATIENT.
	RETURN
C
C O35--	EGG
C
4000	IF((PRSA.NE.OPENW).OR.(PRSO.NE.EGG)) GO TO 4500
	IF(.NOT.QOPEN(EGG)) GO TO 4100		!OPEN ALREADY?
	CALL RSPEAK(649)			!YES.
	RETURN
C
4100	IF(PRSI.NE.0) GO TO 4200		!WITH SOMETHING?
	CALL RSPEAK(650)			!NO, CANT.
	RETURN
C
4200	IF(PRSI.NE.HANDS) GO TO 4300		!WITH HANDS?
	CALL RSPEAK(651)			!NOT RECOMMENDED.
	RETURN
C
4300	I=652					!MUNG MESSAGE.
	IF(((OFLAG1(PRSI).AND.TOOLBT).NE.0).OR.
	1	((OFLAG2(PRSI).AND.WEAPBT).NE.0)) GO TO 4600
	I=653					!NOVELTY 1.
	IF((OFLAG2(PRSO).AND.FITEBT).NE.0) I=654 !NOVELTY 2.
	OFLAG2(PRSO)=OFLAG2(PRSO).OR.FITEBT
	CALL RSPSUB(I,ODI2)
	RETURN
C
4500	IF((PRSA.NE.OPENW).AND.(PRSA.NE.MUNGW)) GO TO 4800
	I=655					!YOU BLEW IT.
4600	CALL NEWSTA(BEGG,I,OROOM(EGG),OCAN(EGG),OADV(EGG))
	CALL NEWSTA(EGG,0,0,0,0)		!VANISH EGG.
	OTVAL(BEGG)=2				!BAD EGG HAS VALUE.
	IF(OCAN(CANAR).NE.EGG) GO TO 4700	!WAS CANARY INSIDE?
	CALL RSPEAK(ODESCO(BCANA))		!YES, DESCRIBE RESULT.
	OTVAL(BCANA)=1
	RETURN
C
4700	CALL NEWSTA(BCANA,0,0,0,0)		!NO, VANISH IT.
	RETURN
C
4800	IF((PRSA.NE.DROPW).OR.(HERE.NE.MTREE)) GO TO 10
	CALL NEWSTA(BEGG,658,FORE3,0,0)	!DROPPED EGG.
	CALL NEWSTA(EGG,0,0,0,0)
	OTVAL(BEGG)=2
	IF(OCAN(CANAR).NE.EGG) GO TO 4700
	OTVAL(BCANA)=1			!BAD CANARY.
	RETURN
C NOBJS, PAGE 5
C
C O36--	CANARIES, GOOD AND BAD
C
5000	IF(PRSA.NE.WINDW) GO TO 10		!WIND EM UP?
	IF(PRSO.EQ.CANAR) GO TO 5100		!RIGHT ONE?
	CALL RSPEAK(645)			!NO, BAD NEWS.
	RETURN
C
5100	IF(.NOT.SINGSF.AND.((HERE.EQ.MTREE).OR.
	1	((HERE.GE.FORE1).AND.(HERE.LT.CLEAR))))
	2	GO TO 5200			!FIRST SONG IN FOR?
	CALL RSPEAK(646)			!NO, MEDIOCRE NEWS.
	RETURN
C
5200	SINGSF=.TRUE.				!SANG SONG.
	I=HERE
	IF(I.EQ.MTREE) I=FORE3			!PLACE BAUBLE.
	CALL NEWSTA(BAUBL,647,I,0,0)
	RETURN
C
C O37--	WHITE CLIFFS
C
6000	IF((PRSA.NE.CLMBW).AND.(PRSA.NE.CLMBUW).AND.
	1	(PRSA.NE.CLMBDW)) GO TO 10	!CLIMB?
	CALL RSPEAK(648)			!OH YEAH?
	RETURN
C
C O38--	WALL 
C
7000	IF((IABS(HERE-MLOC).NE.1).OR.(MRHERE(HERE).NE.0).OR.
	1	(PRSA.NE.PUSHW)) GO TO 7100
	CALL RSPEAK(860)			!PUSHED MIRROR WALL.
	RETURN
C
7100	IF((RFLAG(HERE).AND.RNWALL).EQ.0) GO TO 10
	CALL RSPEAK(662)			!NO WALL.
	RETURN
C NOBJS, PAGE 6
C
C O39--	SONG BIRD GLOBAL
C
8000	IF(PRSA.NE.FINDW) GO TO 8100		!FIND?
	CALL RSPEAK(666)
	RETURN
C
8100	IF(PRSA.NE.EXAMIW) GO TO 10		!EXAMINE?
	CALL RSPEAK(667)
	RETURN
C
C O40--	PUZZLE/SCOL WALLS
C
9000	IF(HERE.NE.CPUZZ) GO TO 9500		!PUZZLE WALLS?
	IF(PRSA.NE.PUSHW) GO TO 10		!PUSH?
	DO 9100 I=1,8,2				!LOCATE WALL.
	  IF(PRSO.EQ.CPWL(I)) GO TO 9200
9100	CONTINUE
	CALL BUG(80,PRSO)			!WHAT?
C
9200	J=CPWL(I+1)				!GET DIRECTIONAL OFFSET.
	NXT=CPHERE+J				!GET NEXT STATE.
	WL=CPVEC(NXT)				!GET C(NEXT STATE).
	GO TO (9300,9300,9300,9250,9350),(WL+4)	!PROCESS.
C
9250	CALL RSPEAK(876)			!CLEAR CORRIDOR.
	RETURN
C
9300	IF(CPVEC(NXT+J).EQ.0) GO TO 9400	!MOVABLE, ROOM TO MOVE?
9350	CALL RSPEAK(877)			!IMMOVABLE, NO ROOM.
	RETURN
C
9400	I=878					!ASSUME FIRST PUSH.
	IF(CPUSHF) I=879			!NOT?
	CPUSHF=.TRUE.
	CPVEC(NXT+J)=WL				!MOVE WALL.
	CPVEC(NXT)=0				!VACATE NEXT STATE.
	CALL CPGOTO(NXT)			!ONWARD.
	CALL CPINFO(I,NXT)			!DESCRIBE.
	CALL PRINCR(.TRUE.,HERE)		!PRINT ROOMS CONTENTS.
	RFLAG(HERE)=RFLAG(HERE).OR.RSEEN
	RETURN
C
9500	IF(HERE.NE.SCOLAC) GO TO 9700		!IN SCOL ACTIVE ROOM?
	DO 9600 I=1,12,3
	  TARGET=SCOLWL(I+1)			!ASSUME TARGET.
	  IF(SCOLWL(I).EQ.HERE) GO TO 2100	!TREAT IF FOUND.
9600	CONTINUE
C
9700	IF(HERE.NE.BKBOX) GO TO 10		!IN BOX ROOM?
	TARGET=WNORT
	GO TO 2100
C NOBJS, PAGE 7
C
C O41--	SHORT POLE
C
10000	IF(PRSA.NE.RAISEW) GO TO 10100		!LIFT?
	I=749					!ASSUME UP.
	IF(POLEUF.EQ.2) I=750			!ALREADY UP?
	CALL RSPEAK(I)
	POLEUF=2				!POLE IS RAISED.
	RETURN
C
10100	IF((PRSA.NE.LOWERW).AND.(PRSA.NE.PUSHW)) GO TO 10
	IF(POLEUF.NE.0) GO TO 10200		!ALREADY LOWERED?
	CALL RSPEAK(751)			!CANT DO IT.
	RETURN
C
10200	IF(MOD(MDIR,180).NE.0) GO TO 10300	!MIRROR N-S?
	POLEUF=0				!YES, LOWER INTO
	CALL RSPEAK(752)			!CHANNEL.
	RETURN
C
10300	IF((MDIR.NE.270).OR.(MLOC.NE.MRB)) GO TO 10400
	POLEUF=0				!LOWER INTO HOLE.
	CALL RSPEAK(753)
	RETURN
C
10400	CALL RSPEAK(753+POLEUF)			!POLEUF = 1 OR 2.
	POLEUF=1				!NOW ON FLOOR.
	RETURN
C
C O42--	MIRROR SWITCH
C
11000	IF(PRSA.NE.PUSHW) GO TO 10		!PUSH?
	IF(MRPSHF) GO TO 11300			!ALREADY PUSHED?
	CALL RSPEAK(756)			!BUTTON GOES IN.
	DO 11100 I=1,OLNT			!BLOCKED?
	  IF(QHERE(I,MREYE).AND.(I.NE.RBEAM)) GO TO 11200
11100	CONTINUE
	CALL RSPEAK(757)			!NOTHING IN BEAM.
	RETURN
C
11200	CFLAG(CEVMRS)=.TRUE.			!MIRROR OPENS.
	CTICK(CEVMRS)=7
	MRPSHF=.TRUE.
	MROPNF=.TRUE.
	RETURN
C
11300	CALL RSPEAK(758)			!MIRROR ALREADYOPEN.
	RETURN
C NOBJS, PAGE 8
C
C O43--	BEAM FUNCTION
C
12000	IF((PRSA.NE.TAKEW).OR.(PRSO.NE.RBEAM)) GO TO 12100
	CALL RSPEAK(759)			!TAKE BEAM, JOKE.
	RETURN
C
12100	I=PRSO					!ASSUME BLK WITH DIROBJ.
	IF((PRSA.EQ.PUTW).AND.(PRSI.EQ.RBEAM)) GO TO 12200
	IF((PRSA.NE.MUNGW).OR.(PRSO.NE.RBEAM).OR.
	1	(PRSI.EQ.0)) GO TO 10		!BREAK BEAM WITH X?
	I=PRSI
12200	IF(OADV(I).NE.WINNER) GO TO 12300	!CARRYING?
	CALL NEWSTA(I,0,HERE,0,0)		!DROP OBJ.
	CALL RSPSUB(760,ODESC2(I))
	RETURN
C
12300	J=761					!ASSUME NOT IN ROOM.
	IF(QHERE(J,HERE)) I=762			!IN ROOM?
	CALL RSPSUB(J,ODESC2(I))		!DESCRIBE.
	RETURN
C
C O44--	BRONZE DOOR
C
13000	IF((HERE.EQ.NCELL).OR.((LCELL.EQ.4).AND.
	1	((HERE.EQ.CELL).OR.(HERE.EQ.SCORR))))
	2	GO TO 13100
	CALL RSPEAK(763)			!DOOR NOT THERE.
	RETURN
C
13100	IF(.NOT.OPNCLS(ODOOR,764,765)) GO TO 10	!OPEN/CLOSE?
	IF((HERE.EQ.NCELL).AND.QOPEN(ODOOR))
	1	CALL RSPEAK(766)		!DESCR VIEW.
	RETURN
C
C O45--	QUIZ DOOR
C
14000	IF((PRSA.NE.OPENW).AND.(PRSA.NE.CLOSEW)) GO TO 14100
	CALL RSPEAK(767)			!DOOR WONT MOVE.
	RETURN
C
14100	IF(PRSA.NE.KNOCKW) GO TO 10		!KNOCK?
	IF(INQSTF) GO TO 14200		!TRIED IT ALREADY?
	INQSTF=.TRUE.				!START INQUISITION.
	CFLAG(CEVINQ)=.TRUE.
	CTICK(CEVINQ)=2
	QUESNO=RND(8)				!SELECT QUESTION.
	NQATT=0
	CORRCT=0
	CALL RSPEAK(768)			!ANNOUNCE RULES.
	CALL RSPEAK(769)
	CALL RSPEAK(770+QUESNO)			!ASK QUESTION.
	RETURN
C
14200	CALL RSPEAK(798)			!NO REPLY.
	RETURN
C
C O46--	LOCKED DOOR
C
15000	IF(PRSA.NE.OPENW) GO TO 10		!OPEN?
	CALL RSPEAK(778)			!CANT.
	RETURN
C
C O47--	CELL DOOR
C
16000	NOBJS=OPNCLS(CDOOR,779,780)		!OPEN/CLOSE?
	RETURN
C NOBJS, PAGE 9
C
C O48--	DIALBUTTON
C
17000	IF(PRSA.NE.PUSHW) GO TO 10		!PUSH?
	CALL RSPEAK(809)			!CLICK.
	IF(QOPEN(CDOOR)) CALL RSPEAK(810)	!CLOSE CELL DOOR.
C
	DO 17100 I=1,OLNT			!RELOCATE OLD TO HYPER.
	  IF((OROOM(I).EQ.CELL).AND.((OFLAG1(I).AND.DOORBT).EQ.0))
	1	CALL NEWSTA(I,0,LCELL*HFACTR,0,0)
	  IF(OROOM(I).EQ.(PNUMB*HFACTR))
	1	CALL NEWSTA(I,0,CELL,0,0)	!MOVE IN NEW HYPER.
17100	CONTINUE
C
	OFLAG2(ODOOR)=OFLAG2(ODOOR).AND. .NOT.OPENBT
	OFLAG2(CDOOR)=OFLAG2(CDOOR).AND. .NOT.OPENBT
	OFLAG1(ODOOR)=OFLAG1(ODOOR).AND. .NOT.VISIBT
	IF(PNUMB.EQ.4) OFLAG1(ODOOR)=OFLAG1(ODOOR).OR.VISIBT
C
	IF(AROOM(PLAYER).NE.CELL) GO TO 17400	!PLAYER IN CELL?
	IF(LCELL.NE.4) GO TO 17200		!IN RIGHT CELL?
	OFLAG1(ODOOR)=OFLAG1(ODOOR).OR. VISIBT
	F=MOVETO(NCELL,PLAYER)			!YES, MOVETO NCELL.
	GO TO 17400
17200	F=MOVETO(PCELL,PLAYER)			!NO, MOVETO PCELL.
C
17400	LCELL=PNUMB
	RETURN
C NOBJS, PAGE 10
C
C O49--	DIAL INDICATOR
C
18000	IF(PRSA.NE.SPINW) GO TO 18100		!SPIN?
	PNUMB=RND(8)+1				!WHEE!
	CALL RSPSUB(797,712+PNUMB)
	RETURN
C
18100	IF((PRSA.NE.MOVEW).AND.(PRSA.NE.PUTW).AND.
	1	(PRSA.NE.TRNTOW)) GO TO 10
	IF(PRSI.NE.0) GO TO 18200		!TURN DIAL TO X?
	CALL RSPEAK(806)			!MUST SPECIFY.
	RETURN
C
18200	IF((PRSI.GE.NUM1).AND.(PRSI.LE.NUM8)) GO TO 18300
	CALL RSPEAK(807)			!MUST BE DIGIT.
	RETURN
C
18300	PNUMB=PRSI-NUM1+1			!SET UP NEW.
	CALL RSPSUB(808,712+PNUMB)
	RETURN
C
C O50--	GLOBAL MIRROR
C
19000	NOBJS=MIRPAN(832,.FALSE.)
	RETURN
C
C O51--	GLOBAL PANEL
C
20000	IF(HERE.NE.FDOOR) GO TO 20100		!AT FRONT DOOR?
	IF((PRSA.NE.OPENW).AND.(PRSA.NE.CLOSEW)) GO TO 10
	CALL RSPEAK(843)			!PANEL IN DOOR, NOGO.
	RETURN
C
20100	NOBJS=MIRPAN(838,.TRUE.)
	RETURN
C
C O52--	PUZZLE ROOM SLIT
C
21000	IF((PRSA.NE.PUTW).OR.(PRSI.NE.CSLIT)) GO TO 10
	IF(PRSO.NE.GCARD) GO TO 21100		!PUT CARD IN SLIT?
	CALL NEWSTA(PRSO,863,0,0,0)		!KILL CARD.
	CPOUTF=.TRUE.				!OPEN DOOR.
	OFLAG1(STLDR)=OFLAG1(STLDR).AND..NOT.VISIBT	!VANISH DOOR.
	RETURN
C
21100	IF(((OFLAG1(PRSO).AND.VICTBT).EQ.0).AND.
	1  ((OFLAG2(PRSO).AND.VILLBT).EQ.0)) GO TO 21200
	CALL RSPEAK(RND(5)+552)			!JOKE FOR VILL, VICT.
	RETURN
C
21200	CALL NEWSTA(PRSO,0,0,0,0)		!KILL OBJECT.
	CALL RSPSUB(864,ODO2)			!DESCRIBE.
	RETURN
C
	END
C MIRPAN--	PROCESSOR FOR GLOBAL MIRROR/PANEL
C
C DECLARATIONS
C
	LOGICAL FUNCTION MIRPAN(ST,PNF)
	IMPLICIT INTEGER(A-Z)
	LOGICAL PNF
C
C GAME STATE
C
	LOGICAL TELFLG
	COMMON /PLAY/ WINNER,HERE,TELFLG
C
C PARSER OUTPUT
C
	LOGICAL PRSWON
	COMMON /PRSVEC/ PRSA,PRSI,PRSO,PRSWON,PRSCON
C
C VERBS
C
	COMMON /VINDEX/ CINTW,DEADXW,FRSTQW,INXW,OUTXW
	COMMON /VINDEX/ WALKIW,FIGHTW,FOOW
	COMMON /VINDEX/ MELTW,READW,INFLAW,DEFLAW,ALARMW,EXORCW
	COMMON /VINDEX/ PLUGW,KICKW,WAVEW,RAISEW,LOWERW,RUBW
	COMMON /VINDEX/ PUSHW,UNTIEW,TIEW,TIEUPW,TURNW,BREATW
	COMMON /VINDEX/ KNOCKW,LOOKW,EXAMIW,SHAKEW,MOVEW,TRNONW,TRNOFW
	COMMON /VINDEX/ OPENW,CLOSEW,FINDW,WAITW,SPINW,BOARDW,UNBOAW,TAKEW
	COMMON /VINDEX/ INVENW,FILLW,EATW,DRINKW,BURNW
	COMMON /VINDEX/ MUNGW,KILLW,ATTACW,SWINGW
	COMMON /VINDEX/ WALKW,TELLW,PUTW,DROPW,GIVEW,POURW,THROWW
	COMMON /VINDEX/ DIGW,LEAPW,STAYW,FOLLOW
	COMMON /VINDEX/ HELLOW,LOOKIW,LOOKUW,PUMPW,WINDW
	COMMON /VINDEX/ CLMBW,CLMBUW,CLMBDW,TRNTOW
C
C FLAGS
C
	LOGICAL*1 TROLLF,CAGESF,BUCKTF,CAROFF,CAROZF,LWTIDF
	LOGICAL*1 DOMEF,GLACRF,ECHOF,RIDDLF,LLDF,CYCLOF
	LOGICAL*1 MAGICF,LITLDF,SAFEF,GNOMEF,GNODRF,MIRRMF
	LOGICAL*1 EGYPTF,ONPOLF,BLABF,BRIEFF,SUPERF,BUOYF
	LOGICAL*1 GRUNLF,GATEF,RAINBF,CAGETF,EMPTHF,DEFLAF
	LOGICAL*1 GLACMF,FROBZF,ENDGMF,BADLKF,THFENF,SINGSF
	LOGICAL*1 MRPSHF,MROPNF,WDOPNF,MR1F,MR2F,INQSTF
	LOGICAL*1 FOLLWF,SPELLF,CPOUTF,CPUSHF
	COMMON /FINDEX/ TROLLF,CAGESF,BUCKTF,CAROFF,CAROZF,LWTIDF,
	1	DOMEF,GLACRF,ECHOF,RIDDLF,LLDF,CYCLOF,
	2	MAGICF,LITLDF,SAFEF,GNOMEF,GNODRF,MIRRMF,
	3	EGYPTF,ONPOLF,BLABF,BRIEFF,SUPERF,BUOYF,
	4	GRUNLF,GATEF,RAINBF,CAGETF,EMPTHF,DEFLAF,
	5	GLACMF,FROBZF,ENDGMF,BADLKF,THFENF,SINGSF,
	6	MRPSHF,MROPNF,WDOPNF,MR1F,MR2F,INQSTF,
	7	FOLLWF,SPELLF,CPOUTF,CPUSHF
	COMMON /FINDEX/ BTIEF,BINFF
	COMMON /FINDEX/ RVMNT,RVCLR,RVCYC,RVSND,RVGUA
	COMMON /FINDEX/ ORRUG,ORCAND,ORMTCH,ORLAMP
	COMMON /FINDEX/ MDIR,MLOC,POLEUF
	COMMON /FINDEX/ QUESNO,NQATT,CORRCT
	COMMON /FINDEX/ LCELL,PNUMB,ACELL,DCELL,CPHERE
C MIRPAN, PAGE 2
C
	MIRPAN=.TRUE.
	NUM=MRHERE(HERE)			!GET MIRROR NUM.
	IF(NUM.NE.0) GO TO 100			!ANY HERE?
	CALL RSPEAK(ST)				!NO, LOSE.
	RETURN
C
100	MRBF=0					!ASSUME MIRROR OK.
	IF(((NUM.EQ.1).AND..NOT.MR1F).OR.
	1  ((NUM.EQ.2).AND..NOT.MR2F)) MRBF=1
	IF((PRSA.NE.MOVEW).AND.(PRSA.NE.OPENW)) GO TO 200
	CALL RSPEAK(ST+1)			!CANT OPEN OR MOVE.
	RETURN
C
200	IF(PNF.OR.((PRSA.NE.LOOKIW).AND.(PRSA.NE.EXAMIW).AND.
	1	(PRSA.NE.LOOKW))) GO TO 300
	CALL RSPEAK(844+MRBF)			!LOOK IN MIRROR.
	RETURN
C
300	IF(PRSA.NE.MUNGW) GO TO 400		!BREAK?
	CALL RSPEAK(ST+2+MRBF)			!DO IT.
	IF((NUM.EQ.1).AND..NOT.PNF) MR1F=.FALSE.
	IF((NUM.EQ.2).AND..NOT.PNF) MR2F=.FALSE.
	RETURN
C
400	IF(PNF.OR.(MRBF.EQ.0)) GO TO 500	!BROKEN MIRROR?
	CALL RSPEAK(846)
	RETURN
C
500	IF(PRSA.NE.PUSHW) GO TO 600		!PUSH?
	CALL RSPEAK(ST+3+NUM)
	RETURN
C
600	MIRPAN=.FALSE.			!CANT HANDLE IT.
	RETURN
C
	END

