4.4BSD/usr/src/contrib/dungeon/clockr.F

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