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(PRS
O.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