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