home *** CD-ROM | disk | FTP | other *** search
- C CEVAPP- CLOCK EVENT APPLICABLES
- 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
- SUBROUTINE CEVAPP(RI)
- IMPLICIT INTEGER (A-Z)
- INTEGER CNDTCK(10),LMPTCK(12)
- LOGICAL FINDXT,LIT,RMDESC,QOPEN,MOVETO
- LOGICAL F,QLEDGE,QVAIR,QHERE,PROB
- 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 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 EXITS
- C
- COMMON /CURXT/ XTYPE,XROOM1,XSTRNG,XACTIO,XOBJ
- EQUIVALENCE (XFLAG,XOBJ)
- C
- COMMON /XSRCH/ XMIN,XMAX,XDOWN,XUP,
- 1 XNORTH,XSOUTH,XENTER,XEXIT,XEAST,XWEST
- 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 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
- QLEDGE(R)=(R.EQ.LEDG2).OR.(R.EQ.LEDG3).OR.(R.EQ.LEDG4).OR.
- 1 (R.EQ.VLBOT)
- QVAIR(R)=(R.EQ.VAIR1).OR.(R.EQ.VAIR2).OR.(R.EQ.VAIR3).OR.
- 1 (R.EQ.VAIR4)
- DATA CNDTCK/50,20,10,5,0,156,156,156,157,0/
- DATA LMPTCK/50,30,20,10,4,0,154,154,154,154,155,0/
- C CEVAPP, PAGE 2
- C
- IF(RI.EQ.0) RETURN !IGNORE DISABLED.
- GO TO (1000,2000,3000,4000,5000,6000,7000,8000,9000,10000,
- 1 11000,12000,13000,14000,15000,16000,17000,18000,19000,
- 2 20000,21000,22000,23000,24000),RI
- CALL BUG(3,RI)
- C
- C CEV1-- CURE CLOCK. LET PLAYER SLOWLY RECOVER.
- C
- 1000 ASTREN(PLAYER)=MIN0(0,ASTREN(PLAYER)+1) !RECOVER.
- IF(ASTREN(PLAYER).GE.0) RETURN !FULLY RECOVERED?
- CTICK(CEVCUR)=30 !NO, WAIT SOME MORE.
- RETURN
- C
- C CEV2-- MAINT-ROOM WITH LEAK. RAISE THE WATER LEVEL.
- C
- 2000 IF(HERE.EQ.MAINT) CALL RSPEAK(71+(RVMNT/2)) !DESCRIBE.
- RVMNT=RVMNT+1 !RAISE WATER LEVEL.
- IF(RVMNT.LE.16) RETURN !IF NOT FULL, EXIT.
- CTICK(CEVMNT)=0 !FULL, DISABLE CLOCK.
- RFLAG(MAINT)=RFLAG(MAINT).OR.RMUNG !MUNG ROOM.
- RRAND(MAINT)=80 !SAY IT IS FULL OF WATER.
- IF(HERE.EQ.MAINT) CALL JIGSUP(81) !DROWN HIM IF PRESENT.
- RETURN
- C
- C CEV3-- LANTERN. DESCRIBE GROWING DIMNESS.
- C
- 3000 CALL LITINT(LAMP,ORLAMP,CEVLNT,LMPTCK,12) !DO LIGHT INTERRUPT.
- RETURN
- C
- C CEV4-- MATCH. OUT IT GOES.
- C
- 4000 CALL RSPEAK(153) !MATCH IS OUT.
- OFLAG1(MATCH)=OFLAG1(MATCH).AND. .NOT.ONBT
- RETURN
- C
- C CEV5-- CANDLE. DESCRIBE GROWING DIMNESS.
- C
- 5000 CALL LITINT(CANDL,ORCAND,CEVCND,CNDTCK,10) !DO CANDLE INTERRUPT.
- RETURN
- C CEVAPP, PAGE 3
- C
- C CEV6-- BALLOON
- C
- 6000 CTICK(CEVBAL)=3 !RESCHEDULE INTERRUPT.
- F=AVEHIC(WINNER).EQ.BALLO !SEE IF IN BALLOON.
- IF(BLOC.EQ.VLBOT) GO TO 6800 !AT BOTTOM?
- IF(QLEDGE(BLOC)) GO TO 6700 !ON LEDGE?
- IF(QOPEN(RECEP).AND.(BINFF.NE.0))
- 1 GO TO 6500 !INFLATED AND RECEP OPEN?.
- C
- C BALLOON IS IN MIDAIR AND IS DEFLATED (OR HAS RECEPTACLE CLOSED).
- C FALL TO NEXT ROOM.
- C
- IF(BLOC.NE.VAIR1) GO TO 6300 !IN VAIR1?
- BLOC=VLBOT !YES, NOW AT VLBOT.
- CALL NEWSTA(BALLO,0,BLOC,0,0)
- IF(F) GO TO 6200 !IN BALLOON?
- IF(QLEDGE(HERE)) CALL RSPEAK(530) !ON LEDGE, DESCRIBE.
- RETURN
- C
- 6200 F=MOVETO(BLOC,WINNER) !MOVE HIM.
- IF(BINFF.EQ.0) GO TO 6250 !IN BALLOON. INFLATED?
- CALL RSPEAK(531) !YES, LANDED.
- F=RMDESC(0) !DESCRIBE.
- RETURN
- C
- 6250 CALL NEWSTA(BALLO,532,0,0,0) !NO, BALLOON & CONTENTS DIE.
- CALL NEWSTA(DBALL,0,BLOC,0,0) !INSERT DEAD BALLOON.
- AVEHIC(WINNER)=0 !NOT IN VEHICLE.
- CFLAG(CEVBAL)=.FALSE. !DISABLE INTERRUPTS.
- CFLAG(CEVBRN)=.FALSE.
- BINFF=0
- BTIEF=0
- RETURN
- C
- 6300 BLOC=BLOC-1 !NOT IN VAIR1, DESCEND.
- CALL NEWSTA(BALLO,0,BLOC,0,0)
- IF(F) GO TO 6400 !IS HE IN BALLOON?
- IF(QLEDGE(HERE)) CALL RSPEAK(533) !IF ON LEDGE, DESCRIBE.
- RETURN
- C
- 6400 F=MOVETO(BLOC,WINNER) !IN BALLOON, MOVE HIM.
- CALL RSPEAK(534) !DESCRIBE.
- F=RMDESC(0)
- RETURN
- C
- C BALLOON IS IN MIDAIR AND IS INFLATED, UP-UP-AND-AWAY!
- C
- 6500 IF(BLOC.NE.VAIR4) GO TO 6600 !AT VAIR4?
- CTICK(CEVBRN)=.FALSE. !DISABLE INTERRUPTS.
- CTICK(CEVBAL)=.FALSE.
- BINFF=0
- BTIEF=0
- BLOC=VLBOT !FALL TO BOTTOM.
- CALL NEWSTA(BALLO,0,0,0,0) !BALLOON & CONTENTS DIE.
- CALL NEWSTA(DBALL,0,BLOC,0,0) !SUBSTITUTE DEAD BALLOON.
- IF(F) GO TO 6550 !WAS HE IN IT?
- IF(QLEDGE(HERE)) CALL RSPEAK(535) !IF HE CAN SEE, DESCRIBE.
- RETURN
- C
- 6550 CALL JIGSUP(536) !IN BALLOON AT CRASH, DIE.
- RETURN
- C
- 6600 BLOC=BLOC+1 !NOT AT VAIR4, GO UP.
- CALL NEWSTA(BALLO,0,BLOC,0,0)
- IF(F) GO TO 6650 !IN BALLOON?
- IF(QLEDGE(HERE)) CALL RSPEAK(537) !CAN HE SEE IT?
- RETURN
- C
- 6650 F=MOVETO(BLOC,WINNER) !MOVE PLAYER.
- CALL RSPEAK(538) !DESCRIBE.
- F=RMDESC(0)
- RETURN
- C
- C ON LEDGE, GOES TO MIDAIR ROOM WHETHER INFLATED OR NOT.
- C
- 6700 BLOC=BLOC+(VAIR2-LEDG2) !MOVE TO MIDAIR.
- CALL NEWSTA(BALLO,0,BLOC,0,0)
- IF(F) GO TO 6750 !IN BALLOON?
- IF(QLEDGE(HERE)) CALL RSPEAK(539) !NO, STRANDED.
- CTICK(CEVVLG)=10 !MATERIALIZE GNOME.
- RETURN
- C
- 6750 F=MOVETO(BLOC,WINNER) !MOVE TO NEW ROOM.
- CALL RSPEAK(540) !DESCRIBE.
- F=RMDESC(0)
- RETURN
- C
- C AT BOTTOM, GO UP IF INFLATED, DO NOTHING IF DEFLATED.
- C
- 6800 IF((BINFF.EQ.0).OR..NOT.QOPEN(RECEP)) RETURN
- BLOC=VAIR1 !INFLATED AND OPEN,
- CALL NEWSTA(BALLO,0,BLOC,0,0) !GO UP TO VAIR1.
- IF(F) GO TO 6850 !IN BALLOON?
- IF(QLEDGE(HERE)) CALL RSPEAK(541) !IF CAN SEE, DESCRIBE.
- RETURN
- C
- 6850 F=MOVETO(BLOC,WINNER) !MOVE PLAYER.
- CALL RSPEAK(542)
- F=RMDESC(0)
- RETURN
- C CEVAPP, PAGE 4
- C
- C CEV7-- BALLOON BURNUP
- C
- 7000 DO 7100 I=1,OLNT !FIND BURNING OBJECT
- IF((RECEP.EQ.OCAN(I)).AND.((OFLAG1(I).AND.FLAMBT).NE.0))
- 1 GO TO 7200 !IN RECEPTACLE.
- 7100 CONTINUE
- CALL BUG(4,0)
- C
- 7200 CALL NEWSTA(I,0,0,0,0) !VANISH OBJECT.
- BINFF=0 !UNINFLATED.
- IF(HERE.EQ.BLOC) CALL RSPSUB(292,ODESC2(I)) !DESCRIBE.
- RETURN
- C
- C CEV8-- FUSE FUNCTION
- C
- 8000 IF(OCAN(FUSE).NE.BRICK) GO TO 8500 !IGNITED BRICK?
- BR=OROOM(BRICK) !GET BRICK ROOM.
- BC=OCAN(BRICK) !GET CONTAINER.
- IF((BR.EQ.0).AND.(BC.NE.0)) BR=OROOM(BC)
- CALL NEWSTA(FUSE,0,0,0,0) !KILL FUSE.
- CALL NEWSTA(BRICK,0,0,0,0) !KILL BRICK.
- IF((BR.NE.0).AND.(BR.NE.HERE)) GO TO 8100 !BRICK ELSEWHERE?
- C
- RFLAG(HERE)=RFLAG(HERE).OR.RMUNG !BLEW SELF.
- RRAND(HERE)=114 !MUNG ROOM.
- CALL JIGSUP(150) !DEAD.
- RETURN
- C
- 8100 CALL RSPEAK(151) !BOOM.
- MUNGRM=BR !SAVE ROOM THAT BLEW.
- CTICK(CEVSAF)=5 !SET SAFE INTERRUPT.
- IF(BR.NE.MSAFE) GO TO 8200 !BLEW SAFE ROOM?
- IF(BC.NE.SSLOT) RETURN !WAS BRICK IN SAFE?
- CALL NEWSTA(SSLOT,0,0,0,0) !KILL SLOT.
- OFLAG2(SAFE)=OFLAG2(SAFE).OR.OPENBT !OPEN SAFE.
- SAFEF=.TRUE. !INDICATE SAFE BLOWN.
- RETURN
- C
- 8200 DO 8250 I=1,OLNT !BLEW WRONG ROOM.
- IF(QHERE(I,BR) .AND. ((OFLAG1(I).AND.TAKEBT).NE.0))
- 1 CALL NEWSTA(I,0,0,0,0) !VANISH CONTENTS.
- 8250 CONTINUE
- IF(BR.NE.LROOM) RETURN !BLEW LIVING ROOM?
- DO 8300 I=1,OLNT
- IF(OCAN(I).EQ.TCASE) CALL NEWSTA(I,0,0,0,0) !KILL TROPHY CASE.
- 8300 CONTINUE
- RETURN
- C
- 8500 IF(QHERE(FUSE,HERE).OR.(OADV(FUSE).EQ.WINNER))
- 1 CALL RSPEAK(152)
- CALL NEWSTA(FUSE,0,0,0,0) !KILL FUSE.
- RETURN
- C CEVAPP, PAGE 5
- C
- C CEV9-- LEDGE MUNGE.
- C
- 9000 RFLAG(LEDG4)=RFLAG(LEDG4).OR.RMUNG !LEDGE COLLAPSES.
- RRAND(LEDG4)=109
- IF(HERE.EQ.LEDG4) GO TO 9100 !WAS HE THERE?
- CALL RSPEAK(110) !NO, NARROW ESCAPE.
- RETURN
- C
- 9100 IF(AVEHIC(WINNER).NE.0) GO TO 9200 !IN VEHICLE?
- CALL JIGSUP(111) !NO, DEAD.
- RETURN
- C
- 9200 IF(BTIEF.NE.0) GO TO 9300 !TIED TO LEDGE?
- CALL RSPEAK(112) !NO, NO PLACE TO LAND.
- RETURN
- C
- 9300 BLOC=VLBOT !YES, CRASH BALLOON.
- CALL NEWSTA(BALLO,0,0,0,0) !BALLOON & CONTENTS DIE.
- CALL NEWSTA(DBALL,0,BLOC,0,0) !INSERT DEAD BALLOON.
- BTIEF=0
- BINFF=0
- CFLAG(CEVBAL)=.FALSE.
- CFLAG(CEVBRN)=.FALSE.
- CALL JIGSUP(113) !DEAD
- RETURN
- C
- C CEV10-- SAFE MUNG.
- C
- 10000 RFLAG(MUNGRM)=RFLAG(MUNGRM).OR.RMUNG !MUNG TARGET.
- RRAND(MUNGRM)=114
- IF(HERE.EQ.MUNGRM) GO TO 10100 !IS HE PRESENT?
- CALL RSPEAK(115) !LET HIM KNOW.
- IF(MUNGRM.EQ.MSAFE) CTICK(CEVLED)=8 !START LEDGE CLOCK.
- RETURN
- C
- 10100 I=116 !HE'S DEAD,
- IF((RFLAG(HERE).AND.RHOUSE).NE.0) I=117 !ONE WAY OR ANOTHER.
- CALL JIGSUP(I) !LET HIM KNOW.
- RETURN
- C CEVAPP, PAGE 6
- C
- C CEV11-- VOLCANO GNOME
- C
- 11000 IF(QLEDGE(HERE)) GO TO 11100 !IS HE ON LEDGE?
- CTICK(CEVVLG)=1 !NO, WAIT A WHILE.
- RETURN
- C
- 11100 CALL NEWSTA(GNOME,118,HERE,0,0) !YES, MATERIALIZE GNOME.
- RETURN
- C
- C CEV12-- VOLCANO GNOME DISAPPEARS
- C
- 12000 CALL NEWSTA(GNOME,149,0,0,0) !DISAPPEAR THE GNOME.
- RETURN
- C
- C CEV13-- BUCKET.
- C
- 13000 IF(OCAN(WATER).EQ.BUCKE)
- 1 CALL NEWSTA(WATER,0,0,0,0) !WATER LEAKS OUT.
- RETURN
- C
- C CEV14-- SPHERE. IF EXPIRES, HE'S TRAPPED.
- C
- 14000 RFLAG(CAGER)=RFLAG(CAGER).OR.RMUNG !MUNG ROOM.
- RRAND(CAGER)=147
- CALL JIGSUP(148) !MUNG PLAYER.
- RETURN
- C
- C CEV15-- END GAME HERALD.
- C
- 15000 ENDGMF=.TRUE. !WE'RE IN ENDGAME.
- CALL RSPEAK(119) !INFORM OF ENDGAME.
- RETURN
- C CEVAPP, PAGE 7
- C
- C CEV16-- FOREST MURMURS
- C
- 16000 CFLAG(CEVFOR)=(HERE.EQ.MTREE).OR.
- 1 ((HERE.GE.FORE1).AND.(HERE.LT.CLEAR))
- IF(CFLAG(CEVFOR).AND.PROB(10,10)) CALL RSPEAK(635)
- RETURN
- C
- C CEV17-- SCOL ALARM
- C
- 17000 IF(HERE.EQ.BKTWI) CFLAG(CEVZGI)=.TRUE. !IF IN TWI, GNOME.
- IF(HERE.EQ.BKVAU) CALL JIGSUP(636) !IF IN VAU, DEAD.
- RETURN
- C
- C CEV18-- ENTER GNOME OF ZURICH
- C
- 18000 CFLAG(CEVZGO)=.TRUE. !EXITS, TOO.
- CALL NEWSTA(ZGNOM,0,BKTWI,0,0) !PLACE IN TWI.
- IF(HERE.EQ.BKTWI) CALL RSPEAK(637) !ANNOUNCE.
- RETURN
- C
- C CEV19-- EXIT GNOME
- C
- 19000 CALL NEWSTA(ZGNOM,0,0,0,0) !VANISH.
- IF(HERE.EQ.BKTWI) CALL RSPEAK(638) !ANNOUNCE.
- RETURN
- C CEVAPP, PAGE 8
- C
- C CEV20-- START OF ENDGAME
- C
- 20000 IF(SPELLF) GO TO 20200 !SPELL HIS WAY IN?
- IF(HERE.NE.CRYPT) RETURN !NO, STILL IN TOMB?
- IF(.NOT.LIT(HERE)) GO TO 20100 !LIGHTS OFF?
- CTICK(CEVSTE)=3 !RESCHEDULE.
- RETURN
- C
- 20100 CALL RSPEAK(727) !ANNOUNCE.
- 20200 DO 20300 I=1,OLNT !STRIP HIM OF OBJS.
- CALL NEWSTA(I,0,OROOM(I),OCAN(I),0)
- 20300 CONTINUE
- CALL NEWSTA(LAMP,0,0,0,PLAYER) !GIVE HIM LAMP.
- CALL NEWSTA(SWORD,0,0,0,PLAYER) !GIVE HIM SWORD.
- C
- OFLAG1(LAMP)=(OFLAG1(LAMP).OR.LITEBT).AND. .NOT.ONBT
- OFLAG2(LAMP)=OFLAG2(LAMP).OR.TCHBT
- CFLAG(CEVLNT)=.FALSE. !LAMP IS GOOD AS NEW.
- CTICK(CEVLNT)=350
- ORLAMP=0
- OFLAG2(SWORD)=OFLAG2(SWORD).OR.TCHBT !RECREATE SWORD.
- SWDACT=.TRUE.
- SWDSTA=0
- C
- THFACT=.FALSE. !THIEF GONE.
- ENDGMF=.TRUE. !ENDGAME RUNNING.
- CFLAG(CEVMAT)=.FALSE. !MATCHES GONE,
- CFLAG(CEVCND)=.FALSE. !CANDLES GONE.
- C
- CALL SCRUPD(RVAL(CRYPT)) !SCORE CRYPT,
- RVAL(CRYPT)=0 !BUT ONLY ONCE.
- F=MOVETO(TSTRS,WINNER) !TO TOP OF STAIRS,
- F=RMDESC(3) !AND DESCRIBE.
- RETURN !BAM!
- C
- C CEV21-- MIRROR CLOSES.
- C
- 21000 MRPSHF=.FALSE. !BUTTON IS OUT.
- MROPNF=.FALSE. !MIRROR IS CLOSED.
- IF(HERE.EQ.MRANT) CALL RSPEAK(728) !DESCRIBE BUTTON.
- IF((HERE.EQ.INMIR).OR.(MRHERE(HERE).EQ.1))
- 1 CALL RSPEAK(729) !DESCRIBE MIRROR.
- RETURN
- C CEVAPP, PAGE 9
- C
- C CEV22-- DOOR CLOSES.
- C
- 22000 IF(WDOPNF) CALL RSPEAK(730) !DESCRIBE.
- WDOPNF=.FALSE. !CLOSED.
- RETURN
- C
- C CEV23-- INQUISITOR'S QUESTION
- C
- 23000 IF(AROOM(PLAYER).NE.FDOOR) RETURN !IF PLAYER LEFT, DIE.
- CALL RSPEAK(769)
- CALL RSPEAK(770+QUESNO)
- CTICK(CEVINQ)=2
- RETURN
- C
- C CEV24-- MASTER FOLLOWS
- C
- 24000 IF(AROOM(AMASTR).EQ.HERE) RETURN !NO MOVEMENT, DONE.
- IF((HERE.NE.CELL).AND.(HERE.NE.PCELL)) GO TO 24100
- IF(FOLLWF) CALL RSPEAK(811) !WONT GO TO CELLS.
- FOLLWF=.FALSE.
- RETURN
- C
- 24100 FOLLWF=.TRUE. !FOLLOWING.
- I=812 !ASSUME CATCHES UP.
- DO 24200 J=XMIN,XMAX,XMIN
- IF(FINDXT(J,AROOM(AMASTR)).AND.(XROOM1.EQ.HERE))
- 1 I=813 !ASSUME FOLLOWS.
- 24200 CONTINUE
- CALL RSPEAK(I)
- CALL NEWSTA(MASTER,0,HERE,0,0) !MOVE MASTER OBJECT.
- AROOM(AMASTR)=HERE !MOVE MASTER PLAYER.
- RETURN
- C
- END
- C LITINT- LIGHT INTERRUPT PROCESSOR
- C
- C DECLARATIONS
- C
- SUBROUTINE LITINT(OBJ,CTR,CEV,TICKS,TICKLN)
- IMPLICIT INTEGER (A-Z)
- INTEGER TICKS(TICKLN)
- 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
- C CLOCK INTERRUPTS
- C
- LOGICAL*1 CFLAG
- COMMON /CEVENT/ CLNT,CTICK(25),CACTIO(25),CFLAG(25)
- C
- CTR=CTR+1 !ADVANCE STATE CNTR.
- CTICK(CEV)=TICKS(CTR) !RESET INTERRUPT.
- IF(CTICK(CEV).NE.0) GO TO 100 !EXPIRED?
- OFLAG1(OBJ)=OFLAG1(OBJ).AND. .NOT.(LITEBT+FLAMBT+ONBT)
- IF((OROOM(OBJ).EQ.HERE).OR.(OADV(OBJ).EQ.WINNER))
- 1 CALL RSPSUB(293,ODESC2(OBJ))
- RETURN
- C
- 100 IF((OROOM(OBJ).EQ.HERE).OR.(OADV(OBJ).EQ.WINNER))
- 1 CALL RSPEAK(TICKS(CTR+(TICKLN/2)))
- RETURN
- C
- END
-