home *** CD-ROM | disk | FTP | other *** search
- 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
-