C LIGHTP-       LIGHT PROCESSOR
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 LIGHTP(OBJ)
       IMPLICIT INTEGER (A-Z)
       LOGICAL QON
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
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 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
       QON(R)=(OFLAG1(R).AND.ONBT).NE.0
C LIGHTP, PAGE 2
C
       LIGHTP=.TRUE.                           !ASSUME WINS
       FLOBTS=FLAMBT+LITEBT+ONBT
       IF(OBJ.NE.CANDL) GO TO 20000            !CANDLE?
       IF(ORCAND.NE.0) GO TO 19100             !FIRST REF?
       ORCAND=1                                !YES, CANDLES ARE
       CTICK(CEVCND)=50                        !BURNING WHEN SEEN.
C
19100   IF(PRSI.EQ.CANDL) GO TO 10              !IGNORE IND REFS.
       IF(PRSA.NE.TRNOFW) GO TO 19200          !TURN OFF?
       I=513                                   !ASSUME OFF.
       IF(QON(CANDL)) I=514                    !IF ON, DIFFERENT.
       CFLAG(CEVCND)=.FALSE.                   !DISABLE COUNTDOWN.
       OFLAG1(CANDL)=OFLAG1(CANDL).AND. .NOT.ONBT
       CALL RSPEAK(I)
       RETURN
C
19200   IF((PRSA.NE.BURNW).AND.(PRSA.NE.TRNONW)) GO TO 10
       IF((OFLAG1(CANDL).AND.LITEBT).NE.0) GO TO 19300
       CALL RSPEAK(515)                        !CANDLES TOO SHORT.
       RETURN
C
19300   IF(PRSI.NE.0) GO TO 19400               !ANY FLAME?
       CALL RSPEAK(516)                        !NO, LOSE.
       PRSWON=.FALSE.
       RETURN
C
19400   IF((PRSI.NE.MATCH).OR. .NOT.QON(MATCH)) GO TO 19500
       I=517                                   !ASSUME OFF.
       IF(QON(CANDL)) I=518                    !IF ON, JOKE.
       OFLAG1(CANDL)=OFLAG1(CANDL).OR.ONBT     !LITE CANDLES.
       CFLAG(CEVCND)=.TRUE.                    !RESUME COUNTDOWN.
       CALL RSPEAK(I)
       RETURN
C
19500   IF((PRSI.NE.TORCH).OR. .NOT.QON(TORCH)) GO TO 19600
       IF(QON(CANDL)) GO TO 19700              !ALREADY ON?
       CALL NEWSTA(CANDL,521,0,0,0)            !NO, VAPORIZE.
       RETURN
C
19600   CALL RSPEAK(519)                        !CANT LIGHT WITH THAT.
       RETURN
C
19700   CALL RSPEAK(520)                        !ALREADY ON.
       RETURN
C
20000   IF(OBJ.NE.MATCH) CALL BUG(6,OBJ)
       IF((PRSA.NE.TRNONW).OR.(PRSO.NE.MATCH)) GO TO 20500
       IF(ORMTCH.NE.0) GO TO 20100             !ANY MATCHES LEFT?
       CALL RSPEAK(183)                        !NO, LOSE.
       RETURN
C
20100   ORMTCH=ORMTCH-1                         !DECREMENT NO MATCHES.
       OFLAG1(MATCH)=OFLAG1(MATCH).OR.FLOBTS
       CTICK(CEVMAT)=2                         !COUNTDOWN.
       CALL RSPEAK(184)
       RETURN
C
20500   IF((PRSA.NE.TRNOFW).OR.((OFLAG1(MATCH).AND.ONBT).EQ.0))
       1       GO TO 10                        !EXTINGUISH?
       OFLAG1(MATCH)=OFLAG1(MATCH).AND. .NOT.FLOBTS
       CTICK(CEVMAT)=0
       CALL RSPEAK(185)
       RETURN
C
C HERE FOR FALSE RETURN
C
10      LIGHTP=.FALSE.
       RETURN
       END