xref: /csrg-svn/contrib/dungeon/clockr.F (revision 35973)
1*35973SbosticC CEVAPP- CLOCK EVENT APPLICABLES
2*35973SbosticC
3*35973SbosticC COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
4*35973SbosticC ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
5*35973SbosticC WRITTEN BY R. M. SUPNIK
6*35973SbosticC
7*35973SbosticC DECLARATIONS
8*35973SbosticC
9*35973Sbostic	SUBROUTINE CEVAPP(RI)
10*35973Sbostic	IMPLICIT INTEGER (A-Z)
11*35973Sbostic	INTEGER CNDTCK(10),LMPTCK(12)
12*35973Sbostic	LOGICAL FINDXT,LIT,RMDESC,QOPEN,MOVETO
13*35973Sbostic	LOGICAL F,QLEDGE,QVAIR,QHERE,PROB
14*35973Sbostic#include "gamestate.h"
15*35973Sbostic#include "state.h"
16*35973Sbostic#include "rooms.h"
17*35973Sbostic#include "rflag.h"
18*35973Sbostic#include "rindex.h"
19*35973Sbostic#include "objects.h"
20*35973Sbostic#include "oflags.h"
21*35973Sbostic#include "oindex.h"
22*35973Sbostic#include "clock.h"
23*35973Sbostic#include "curxt.h"
24*35973Sbostic#include "xsrch.h"
25*35973Sbostic#include "villians.h"
26*35973Sbostic#include "advers.h"
27*35973Sbostic#include "flags.h"
28*35973SbosticC
29*35973SbosticC FUNCTIONS AND DATA
30*35973SbosticC
31*35973Sbostic	QOPEN(R)=(and(OFLAG2(R),OPENBT)).NE.0
32*35973Sbostic	QLEDGE(R)=(R.EQ.LEDG2).OR.(R.EQ.LEDG3).OR.(R.EQ.LEDG4).OR.
33*35973Sbostic&		(R.EQ.VLBOT)
34*35973Sbostic	QVAIR(R)=(R.EQ.VAIR1).OR.(R.EQ.VAIR2).OR.(R.EQ.VAIR3).OR.
35*35973Sbostic&		 (R.EQ.VAIR4)
36*35973Sbostic	DATA CNDTCK/50,20,10,5,0,156,156,156,157,0/
37*35973Sbostic	DATA LMPTCK/50,30,20,10,4,0,154,154,154,154,155,0/
38*35973SbosticC CEVAPP, PAGE 2
39*35973SbosticC
40*35973Sbostic	IF(RI.EQ.0) RETURN
41*35973SbosticC						!IGNORE DISABLED.
42*35973Sbostic	GO TO (1000,2000,3000,4000,5000,6000,7000,8000,9000,10000,
43*35973Sbostic&	 11000,12000,13000,14000,15000,16000,17000,18000,19000,
44*35973Sbostic&	 20000,21000,22000,23000,24000),RI
45*35973Sbostic	CALL BUG(3,RI)
46*35973SbosticC
47*35973SbosticC CEV1--	CURE CLOCK.  LET PLAYER SLOWLY RECOVER.
48*35973SbosticC
49*35973Sbostic1000	ASTREN(PLAYER)=MIN0(0,ASTREN(PLAYER)+1)
50*35973SbosticC						!RECOVER.
51*35973Sbostic	IF(ASTREN(PLAYER).GE.0) RETURN
52*35973SbosticC						!FULLY RECOVERED?
53*35973Sbostic	CTICK(CEVCUR)=30
54*35973SbosticC						!NO, WAIT SOME MORE.
55*35973Sbostic	RETURN
56*35973SbosticC
57*35973SbosticC CEV2--	MAINT-ROOM WITH LEAK.  RAISE THE WATER LEVEL.
58*35973SbosticC
59*35973Sbostic2000	IF(HERE.EQ.MAINT) CALL RSPEAK(71+(RVMNT/2))
60*35973SbosticC						!DESCRIBE.
61*35973Sbostic	RVMNT=RVMNT+1
62*35973SbosticC						!RAISE WATER LEVEL.
63*35973Sbostic	IF(RVMNT.LE.16) RETURN
64*35973SbosticC						!IF NOT FULL, EXIT.
65*35973Sbostic	CTICK(CEVMNT)=0
66*35973SbosticC						!FULL, DISABLE CLOCK.
67*35973Sbostic	RFLAG(MAINT)=or(RFLAG(MAINT),RMUNG)
68*35973Sbostic	RRAND(MAINT)=80
69*35973SbosticC						!SAY IT IS FULL OF WATER.
70*35973Sbostic	IF(HERE.EQ.MAINT) CALL JIGSUP(81)
71*35973SbosticC						!DROWN HIM IF PRESENT.
72*35973Sbostic	RETURN
73*35973SbosticC
74*35973SbosticC CEV3--	LANTERN.  DESCRIBE GROWING DIMNESS.
75*35973SbosticC
76*35973Sbostic3000	CALL LITINT(LAMP,ORLAMP,CEVLNT,LMPTCK,12)
77*35973SbosticC						!DO LIGHT INTERRUPT.
78*35973Sbostic	RETURN
79*35973SbosticC
80*35973SbosticC CEV4--	MATCH.  OUT IT GOES.
81*35973SbosticC
82*35973Sbostic4000	CALL RSPEAK(153)
83*35973SbosticC						!MATCH IS OUT.
84*35973Sbostic	OFLAG1(MATCH)=and(OFLAG1(MATCH), not(ONBT))
85*35973Sbostic	RETURN
86*35973SbosticC
87*35973SbosticC CEV5--	CANDLE.  DESCRIBE GROWING DIMNESS.
88*35973SbosticC
89*35973Sbostic5000	CALL LITINT(CANDL,ORCAND,CEVCND,CNDTCK,10)
90*35973SbosticC						!DO CANDLE INTERRUPT.
91*35973Sbostic	RETURN
92*35973SbosticC CEVAPP, PAGE 3
93*35973SbosticC
94*35973SbosticC CEV6--	BALLOON
95*35973SbosticC
96*35973Sbostic6000	CTICK(CEVBAL)=3
97*35973SbosticC						!RESCHEDULE INTERRUPT.
98*35973Sbostic	F=AVEHIC(WINNER).EQ.BALLO
99*35973SbosticC						!SEE IF IN BALLOON.
100*35973Sbostic	IF(BLOC.EQ.VLBOT) GO TO 6800
101*35973SbosticC						!AT BOTTOM?
102*35973Sbostic	IF(QLEDGE(BLOC)) GO TO 6700
103*35973SbosticC						!ON LEDGE?
104*35973Sbostic	IF(QOPEN(RECEP).AND.(BINFF.NE.0))
105*35973Sbostic&		GO TO 6500
106*35973SbosticC
107*35973SbosticC BALLOON IS IN MIDAIR AND IS DEFLATED (OR HAS RECEPTACLE CLOSED).
108*35973SbosticC FALL TO NEXT ROOM.
109*35973SbosticC
110*35973Sbostic	IF(BLOC.NE.VAIR1) GO TO 6300
111*35973SbosticC						!IN VAIR1?
112*35973Sbostic	BLOC=VLBOT
113*35973SbosticC						!YES, NOW AT VLBOT.
114*35973Sbostic	CALL NEWSTA(BALLO,0,BLOC,0,0)
115*35973Sbostic	IF(F) GO TO 6200
116*35973SbosticC						!IN BALLOON?
117*35973Sbostic	IF(QLEDGE(HERE)) CALL RSPEAK(530)
118*35973SbosticC						!ON LEDGE, DESCRIBE.
119*35973Sbostic	RETURN
120*35973SbosticC
121*35973Sbostic6200	F=MOVETO(BLOC,WINNER)
122*35973SbosticC						!MOVE HIM.
123*35973Sbostic	IF(BINFF.EQ.0) GO TO 6250
124*35973SbosticC						!IN BALLOON.  INFLATED?
125*35973Sbostic	CALL RSPEAK(531)
126*35973SbosticC						!YES, LANDED.
127*35973Sbostic	F=RMDESC(0)
128*35973SbosticC						!DESCRIBE.
129*35973Sbostic	RETURN
130*35973SbosticC
131*35973Sbostic6250	CALL NEWSTA(BALLO,532,0,0,0)
132*35973SbosticC						!NO, BALLOON & CONTENTS DIE.
133*35973Sbostic	CALL NEWSTA(DBALL,0,BLOC,0,0)
134*35973SbosticC						!INSERT DEAD BALLOON.
135*35973Sbostic	AVEHIC(WINNER)=0
136*35973SbosticC						!NOT IN VEHICLE.
137*35973Sbostic	CFLAG(CEVBAL)=.FALSE.
138*35973SbosticC						!DISABLE INTERRUPTS.
139*35973Sbostic	CFLAG(CEVBRN)=.FALSE.
140*35973Sbostic	BINFF=0
141*35973Sbostic	BTIEF=0
142*35973Sbostic	RETURN
143*35973SbosticC
144*35973Sbostic6300	BLOC=BLOC-1
145*35973SbosticC						!NOT IN VAIR1, DESCEND.
146*35973Sbostic	CALL NEWSTA(BALLO,0,BLOC,0,0)
147*35973Sbostic	IF(F) GO TO 6400
148*35973SbosticC						!IS HE IN BALLOON?
149*35973Sbostic	IF(QLEDGE(HERE)) CALL RSPEAK(533)
150*35973SbosticC						!IF ON LEDGE, DESCRIBE.
151*35973Sbostic	RETURN
152*35973SbosticC
153*35973Sbostic6400	F=MOVETO(BLOC,WINNER)
154*35973SbosticC						!IN BALLOON, MOVE HIM.
155*35973Sbostic	CALL RSPEAK(534)
156*35973SbosticC						!DESCRIBE.
157*35973Sbostic	F=RMDESC(0)
158*35973Sbostic	RETURN
159*35973SbosticC
160*35973SbosticC BALLOON IS IN MIDAIR AND IS INFLATED, UP-UP-AND-AWAY
161*35973SbosticC						!
162*35973SbosticC
163*35973Sbostic6500	IF(BLOC.NE.VAIR4) GO TO 6600
164*35973SbosticC						!AT VAIR4?
165*35973Sbostic	CTICK(CEVBRN)=0
166*35973Sbostic	CTICK(CEVBAL)=0
167*35973Sbostic	BINFF=0
168*35973Sbostic	BTIEF=0
169*35973Sbostic	BLOC=VLBOT
170*35973SbosticC						!FALL TO BOTTOM.
171*35973Sbostic	CALL NEWSTA(BALLO,0,0,0,0)
172*35973SbosticC						!BALLOON & CONTENTS DIE.
173*35973Sbostic	CALL NEWSTA(DBALL,0,BLOC,0,0)
174*35973SbosticC						!SUBSTITUTE DEAD BALLOON.
175*35973Sbostic	IF(F) GO TO 6550
176*35973SbosticC						!WAS HE IN IT?
177*35973Sbostic	IF(QLEDGE(HERE)) CALL RSPEAK(535)
178*35973SbosticC						!IF HE CAN SEE, DESCRIBE.
179*35973Sbostic	RETURN
180*35973SbosticC
181*35973Sbostic6550	CALL JIGSUP(536)
182*35973SbosticC						!IN BALLOON AT CRASH, DIE.
183*35973Sbostic	RETURN
184*35973SbosticC
185*35973Sbostic6600	BLOC=BLOC+1
186*35973SbosticC						!NOT AT VAIR4, GO UP.
187*35973Sbostic	CALL NEWSTA(BALLO,0,BLOC,0,0)
188*35973Sbostic	IF(F) GO TO 6650
189*35973SbosticC						!IN BALLOON?
190*35973Sbostic	IF(QLEDGE(HERE)) CALL RSPEAK(537)
191*35973SbosticC						!CAN HE SEE IT?
192*35973Sbostic	RETURN
193*35973SbosticC
194*35973Sbostic6650	F=MOVETO(BLOC,WINNER)
195*35973SbosticC						!MOVE PLAYER.
196*35973Sbostic	CALL RSPEAK(538)
197*35973SbosticC						!DESCRIBE.
198*35973Sbostic	F=RMDESC(0)
199*35973Sbostic	RETURN
200*35973SbosticC
201*35973SbosticC ON LEDGE, GOES TO MIDAIR ROOM WHETHER INFLATED OR NOT.
202*35973SbosticC
203*35973Sbostic6700	BLOC=BLOC+(VAIR2-LEDG2)
204*35973SbosticC						!MOVE TO MIDAIR.
205*35973Sbostic	CALL NEWSTA(BALLO,0,BLOC,0,0)
206*35973Sbostic	IF(F) GO TO 6750
207*35973SbosticC						!IN BALLOON?
208*35973Sbostic	IF(QLEDGE(HERE)) CALL RSPEAK(539)
209*35973SbosticC						!NO, STRANDED.
210*35973Sbostic	CTICK(CEVVLG)=10
211*35973SbosticC						!MATERIALIZE GNOME.
212*35973Sbostic	RETURN
213*35973SbosticC
214*35973Sbostic6750	F=MOVETO(BLOC,WINNER)
215*35973SbosticC						!MOVE TO NEW ROOM.
216*35973Sbostic	CALL RSPEAK(540)
217*35973SbosticC						!DESCRIBE.
218*35973Sbostic	F=RMDESC(0)
219*35973Sbostic	RETURN
220*35973SbosticC
221*35973SbosticC AT BOTTOM, GO UP IF INFLATED, DO NOTHING IF DEFLATED.
222*35973SbosticC
223*35973Sbostic6800	IF((BINFF.EQ.0).OR..NOT.QOPEN(RECEP)) RETURN
224*35973Sbostic	BLOC=VAIR1
225*35973SbosticC						!INFLATED AND OPEN,
226*35973Sbostic	CALL NEWSTA(BALLO,0,BLOC,0,0)
227*35973SbosticC						!GO UP TO VAIR1.
228*35973Sbostic	IF(F) GO TO 6850
229*35973SbosticC						!IN BALLOON?
230*35973Sbostic	IF(QLEDGE(HERE)) CALL RSPEAK(541)
231*35973SbosticC						!IF CAN SEE, DESCRIBE.
232*35973Sbostic	RETURN
233*35973SbosticC
234*35973Sbostic6850	F=MOVETO(BLOC,WINNER)
235*35973SbosticC						!MOVE PLAYER.
236*35973Sbostic	CALL RSPEAK(542)
237*35973Sbostic	F=RMDESC(0)
238*35973Sbostic	RETURN
239*35973SbosticC CEVAPP, PAGE 4
240*35973SbosticC
241*35973SbosticC CEV7--	BALLOON BURNUP
242*35973SbosticC
243*35973Sbostic7000	DO 7100 I=1,OLNT
244*35973SbosticC						!FIND BURNING OBJECT
245*35973Sbostic	  IF((RECEP.EQ.OCAN(I)).AND.((and(OFLAG1(I),FLAMBT)).NE.0))
246*35973Sbostic&		GO TO 7200
247*35973Sbostic7100	CONTINUE
248*35973Sbostic	CALL BUG(4,0)
249*35973SbosticC
250*35973Sbostic7200	CALL NEWSTA(I,0,0,0,0)
251*35973SbosticC						!VANISH OBJECT.
252*35973Sbostic	BINFF=0
253*35973SbosticC						!UNINFLATED.
254*35973Sbostic	IF(HERE.EQ.BLOC) CALL RSPSUB(292,ODESC2(I))
255*35973SbosticC						!DESCRIBE.
256*35973Sbostic	RETURN
257*35973SbosticC
258*35973SbosticC CEV8--	FUSE FUNCTION
259*35973SbosticC
260*35973Sbostic8000	IF(OCAN(FUSE).NE.BRICK) GO TO 8500
261*35973SbosticC						!IGNITED BRICK?
262*35973Sbostic	BR=OROOM(BRICK)
263*35973SbosticC						!GET BRICK ROOM.
264*35973Sbostic	BC=OCAN(BRICK)
265*35973SbosticC						!GET CONTAINER.
266*35973Sbostic	IF((BR.EQ.0).AND.(BC.NE.0)) BR=OROOM(BC)
267*35973Sbostic	CALL NEWSTA(FUSE,0,0,0,0)
268*35973SbosticC						!KILL FUSE.
269*35973Sbostic	CALL NEWSTA(BRICK,0,0,0,0)
270*35973SbosticC						!KILL BRICK.
271*35973Sbostic	IF((BR.NE.0).AND.(BR.NE.HERE)) GO TO 8100
272*35973SbosticC						!BRICK ELSEWHERE?
273*35973SbosticC
274*35973Sbostic	RFLAG(HERE)=or(RFLAG(HERE),RMUNG)
275*35973Sbostic	RRAND(HERE)=114
276*35973SbosticC						!MUNG ROOM.
277*35973Sbostic	CALL JIGSUP(150)
278*35973SbosticC						!DEAD.
279*35973Sbostic	RETURN
280*35973SbosticC
281*35973Sbostic8100	CALL RSPEAK(151)
282*35973SbosticC						!BOOM.
283*35973Sbostic	MUNGRM=BR
284*35973SbosticC						!SAVE ROOM THAT BLEW.
285*35973Sbostic	CTICK(CEVSAF)=5
286*35973SbosticC						!SET SAFE INTERRUPT.
287*35973Sbostic	IF(BR.NE.MSAFE) GO TO 8200
288*35973SbosticC						!BLEW SAFE ROOM?
289*35973Sbostic	IF(BC.NE.SSLOT) RETURN
290*35973SbosticC						!WAS BRICK IN SAFE?
291*35973Sbostic	CALL NEWSTA(SSLOT,0,0,0,0)
292*35973SbosticC						!KILL SLOT.
293*35973Sbostic	OFLAG2(SAFE)=or(OFLAG2(SAFE),OPENBT)
294*35973Sbostic	SAFEF=.TRUE.
295*35973SbosticC						!INDICATE SAFE BLOWN.
296*35973Sbostic	RETURN
297*35973SbosticC
298*35973Sbostic8200	DO 8250 I=1,OLNT
299*35973SbosticC						!BLEW WRONG ROOM.
300*35973Sbostic	  IF(QHERE(I,BR) .AND. ((and(OFLAG1(I),TAKEBT)).NE.0))
301*35973Sbostic&		CALL NEWSTA(I,0,0,0,0)
302*35973Sbostic8250	CONTINUE
303*35973Sbostic	IF(BR.NE.LROOM) RETURN
304*35973SbosticC						!BLEW LIVING ROOM?
305*35973Sbostic	DO 8300 I=1,OLNT
306*35973Sbostic	  IF(OCAN(I).EQ.TCASE) CALL NEWSTA(I,0,0,0,0)
307*35973SbosticC						!KILL TROPHY CASE.
308*35973Sbostic8300	CONTINUE
309*35973Sbostic	RETURN
310*35973SbosticC
311*35973Sbostic8500	IF(QHERE(FUSE,HERE).OR.(OADV(FUSE).EQ.WINNER))
312*35973Sbostic&		CALL RSPEAK(152)
313*35973Sbostic	CALL NEWSTA(FUSE,0,0,0,0)
314*35973SbosticC						!KILL FUSE.
315*35973Sbostic	RETURN
316*35973SbosticC CEVAPP, PAGE 5
317*35973SbosticC
318*35973SbosticC CEV9--	LEDGE MUNGE.
319*35973SbosticC
320*35973Sbostic9000	RFLAG(LEDG4)=or(RFLAG(LEDG4),RMUNG)
321*35973Sbostic	RRAND(LEDG4)=109
322*35973Sbostic	IF(HERE.EQ.LEDG4) GO TO 9100
323*35973SbosticC						!WAS HE THERE?
324*35973Sbostic	CALL RSPEAK(110)
325*35973SbosticC						!NO, NARROW ESCAPE.
326*35973Sbostic	RETURN
327*35973SbosticC
328*35973Sbostic9100	IF(AVEHIC(WINNER).NE.0) GO TO 9200
329*35973SbosticC						!IN VEHICLE?
330*35973Sbostic	CALL JIGSUP(111)
331*35973SbosticC						!NO, DEAD.
332*35973Sbostic	RETURN
333*35973SbosticC
334*35973Sbostic9200	IF(BTIEF.NE.0) GO TO 9300
335*35973SbosticC						!TIED TO LEDGE?
336*35973Sbostic	CALL RSPEAK(112)
337*35973SbosticC						!NO, NO PLACE TO LAND.
338*35973Sbostic	RETURN
339*35973SbosticC
340*35973Sbostic9300	BLOC=VLBOT
341*35973SbosticC						!YES, CRASH BALLOON.
342*35973Sbostic	CALL NEWSTA(BALLO,0,0,0,0)
343*35973SbosticC						!BALLOON & CONTENTS DIE.
344*35973Sbostic	CALL NEWSTA(DBALL,0,BLOC,0,0)
345*35973SbosticC						!INSERT DEAD BALLOON.
346*35973Sbostic	BTIEF=0
347*35973Sbostic	BINFF=0
348*35973Sbostic	CFLAG(CEVBAL)=.FALSE.
349*35973Sbostic	CFLAG(CEVBRN)=.FALSE.
350*35973Sbostic	CALL JIGSUP(113)
351*35973SbosticC						!DEAD
352*35973Sbostic	RETURN
353*35973SbosticC
354*35973SbosticC CEV10--	SAFE MUNG.
355*35973SbosticC
356*35973Sbostic10000	RFLAG(MUNGRM)=or(RFLAG(MUNGRM),RMUNG)
357*35973Sbostic	RRAND(MUNGRM)=114
358*35973Sbostic	IF(HERE.EQ.MUNGRM) GO TO 10100
359*35973SbosticC						!IS HE PRESENT?
360*35973Sbostic	CALL RSPEAK(115)
361*35973SbosticC						!LET HIM KNOW.
362*35973Sbostic	IF(MUNGRM.EQ.MSAFE) CTICK(CEVLED)=8
363*35973SbosticC						!START LEDGE CLOCK.
364*35973Sbostic	RETURN
365*35973SbosticC
366*35973Sbostic10100	I=116
367*35973SbosticC						!HE'S DEAD,
368*35973Sbostic	IF((and(RFLAG(HERE),RHOUSE)).NE.0) I=117
369*35973Sbostic	CALL JIGSUP(I)
370*35973SbosticC						!LET HIM KNOW.
371*35973Sbostic	RETURN
372*35973SbosticC CEVAPP, PAGE 6
373*35973SbosticC
374*35973SbosticC CEV11--	VOLCANO GNOME
375*35973SbosticC
376*35973Sbostic11000	IF(QLEDGE(HERE)) GO TO 11100
377*35973SbosticC						!IS HE ON LEDGE?
378*35973Sbostic	CTICK(CEVVLG)=1
379*35973SbosticC						!NO, WAIT A WHILE.
380*35973Sbostic	RETURN
381*35973SbosticC
382*35973Sbostic11100	CALL NEWSTA(GNOME,118,HERE,0,0)
383*35973SbosticC						!YES, MATERIALIZE GNOME.
384*35973Sbostic	RETURN
385*35973SbosticC
386*35973SbosticC CEV12--	VOLCANO GNOME DISAPPEARS
387*35973SbosticC
388*35973Sbostic12000	CALL NEWSTA(GNOME,149,0,0,0)
389*35973SbosticC						!DISAPPEAR THE GNOME.
390*35973Sbostic	RETURN
391*35973SbosticC
392*35973SbosticC CEV13--	BUCKET.
393*35973SbosticC
394*35973Sbostic13000	IF(OCAN(WATER).EQ.BUCKE)
395*35973Sbostic&		CALL NEWSTA(WATER,0,0,0,0)
396*35973Sbostic	RETURN
397*35973SbosticC
398*35973SbosticC CEV14--	SPHERE.  IF EXPIRES, HE'S TRAPPED.
399*35973SbosticC
400*35973Sbostic14000	RFLAG(CAGER)=or(RFLAG(CAGER),RMUNG)
401*35973Sbostic	RRAND(CAGER)=147
402*35973Sbostic	CALL JIGSUP(148)
403*35973SbosticC						!MUNG PLAYER.
404*35973Sbostic	RETURN
405*35973SbosticC
406*35973SbosticC CEV15--	END GAME HERALD.
407*35973SbosticC
408*35973Sbostic15000	ENDGMF=.TRUE.
409*35973SbosticC						!WE'RE IN ENDGAME.
410*35973Sbostic	CALL RSPEAK(119)
411*35973SbosticC						!INFORM OF ENDGAME.
412*35973Sbostic	RETURN
413*35973SbosticC CEVAPP, PAGE 7
414*35973SbosticC
415*35973SbosticC CEV16--	FOREST MURMURS
416*35973SbosticC
417*35973Sbostic16000	CFLAG(CEVFOR)=(HERE.EQ.MTREE).OR.
418*35973Sbostic&		((HERE.GE.FORE1).AND.(HERE.LT.CLEAR))
419*35973Sbostic	IF(CFLAG(CEVFOR).AND.PROB(10,10)) CALL RSPEAK(635)
420*35973Sbostic	RETURN
421*35973SbosticC
422*35973SbosticC CEV17--	SCOL ALARM
423*35973SbosticC
424*35973Sbostic17000	IF(HERE.EQ.BKTWI) CFLAG(CEVZGI)=.TRUE.
425*35973SbosticC						!IF IN TWI, GNOME.
426*35973Sbostic	IF(HERE.EQ.BKVAU) CALL JIGSUP(636)
427*35973SbosticC						!IF IN VAU, DEAD.
428*35973Sbostic	RETURN
429*35973SbosticC
430*35973SbosticC CEV18--	ENTER GNOME OF ZURICH
431*35973SbosticC
432*35973Sbostic18000	CFLAG(CEVZGO)=.TRUE.
433*35973SbosticC						!EXITS, TOO.
434*35973Sbostic	CALL NEWSTA(ZGNOM,0,BKTWI,0,0)
435*35973SbosticC						!PLACE IN TWI.
436*35973Sbostic	IF(HERE.EQ.BKTWI) CALL RSPEAK(637)
437*35973SbosticC						!ANNOUNCE.
438*35973Sbostic	RETURN
439*35973SbosticC
440*35973SbosticC CEV19--	EXIT GNOME
441*35973SbosticC
442*35973Sbostic19000	CALL NEWSTA(ZGNOM,0,0,0,0)
443*35973SbosticC						!VANISH.
444*35973Sbostic	IF(HERE.EQ.BKTWI) CALL RSPEAK(638)
445*35973SbosticC						!ANNOUNCE.
446*35973Sbostic	RETURN
447*35973SbosticC CEVAPP, PAGE 8
448*35973SbosticC
449*35973SbosticC CEV20--	START OF ENDGAME
450*35973SbosticC
451*35973Sbostic20000	IF(SPELLF) GO TO 20200
452*35973SbosticC						!SPELL HIS WAY IN?
453*35973Sbostic	IF(HERE.NE.CRYPT) RETURN
454*35973SbosticC						!NO, STILL IN TOMB?
455*35973Sbostic	IF(.NOT.LIT(HERE)) GO TO 20100
456*35973SbosticC						!LIGHTS OFF?
457*35973Sbostic	CTICK(CEVSTE)=3
458*35973SbosticC						!RESCHEDULE.
459*35973Sbostic	RETURN
460*35973SbosticC
461*35973Sbostic20100	CALL RSPEAK(727)
462*35973SbosticC						!ANNOUNCE.
463*35973Sbostic20200	DO 20300 I=1,OLNT
464*35973SbosticC						!STRIP HIM OF OBJS.
465*35973Sbostic	  CALL NEWSTA(I,0,OROOM(I),OCAN(I),0)
466*35973Sbostic20300	CONTINUE
467*35973Sbostic	CALL NEWSTA(LAMP,0,0,0,PLAYER)
468*35973SbosticC						!GIVE HIM LAMP.
469*35973Sbostic	CALL NEWSTA(SWORD,0,0,0,PLAYER)
470*35973SbosticC						!GIVE HIM SWORD.
471*35973SbosticC
472*35973Sbostic	OFLAG1(LAMP)=and((or(OFLAG1(LAMP),LITEBT)), not(ONBT))
473*35973Sbostic	OFLAG2(LAMP)=or(OFLAG2(LAMP),TCHBT)
474*35973Sbostic	CFLAG(CEVLNT)=.FALSE.
475*35973SbosticC						!LAMP IS GOOD AS NEW.
476*35973Sbostic	CTICK(CEVLNT)=350
477*35973Sbostic	ORLAMP=0
478*35973Sbostic	OFLAG2(SWORD)=or(OFLAG2(SWORD),TCHBT)
479*35973Sbostic	SWDACT=.TRUE.
480*35973Sbostic	SWDSTA=0
481*35973SbosticC
482*35973Sbostic	THFACT=.FALSE.
483*35973SbosticC						!THIEF GONE.
484*35973Sbostic	ENDGMF=.TRUE.
485*35973SbosticC						!ENDGAME RUNNING.
486*35973Sbostic	CFLAG(CEVMAT)=.FALSE.
487*35973SbosticC						!MATCHES GONE,
488*35973Sbostic	CFLAG(CEVCND)=.FALSE.
489*35973SbosticC						!CANDLES GONE.
490*35973SbosticC
491*35973Sbostic	CALL SCRUPD(RVAL(CRYPT))
492*35973SbosticC						!SCORE CRYPT,
493*35973Sbostic	RVAL(CRYPT)=0
494*35973SbosticC						!BUT ONLY ONCE.
495*35973Sbostic	F=MOVETO(TSTRS,WINNER)
496*35973SbosticC						!TO TOP OF STAIRS,
497*35973Sbostic	F=RMDESC(3)
498*35973SbosticC						!AND DESCRIBE.
499*35973Sbostic	RETURN
500*35973SbosticC						!BAM
501*35973SbosticC						!
502*35973SbosticC
503*35973SbosticC CEV21--	MIRROR CLOSES.
504*35973SbosticC
505*35973Sbostic21000	MRPSHF=.FALSE.
506*35973SbosticC						!BUTTON IS OUT.
507*35973Sbostic	MROPNF=.FALSE.
508*35973SbosticC						!MIRROR IS CLOSED.
509*35973Sbostic	IF(HERE.EQ.MRANT) CALL RSPEAK(728)
510*35973SbosticC						!DESCRIBE BUTTON.
511*35973Sbostic	IF((HERE.EQ.INMIR).OR.(MRHERE(HERE).EQ.1))
512*35973Sbostic&		CALL RSPEAK(729)
513*35973Sbostic	RETURN
514*35973SbosticC CEVAPP, PAGE 9
515*35973SbosticC
516*35973SbosticC CEV22--	DOOR CLOSES.
517*35973SbosticC
518*35973Sbostic22000	IF(WDOPNF) CALL RSPEAK(730)
519*35973SbosticC						!DESCRIBE.
520*35973Sbostic	WDOPNF=.FALSE.
521*35973SbosticC						!CLOSED.
522*35973Sbostic	RETURN
523*35973SbosticC
524*35973SbosticC CEV23--	INQUISITOR'S QUESTION
525*35973SbosticC
526*35973Sbostic23000	IF(AROOM(PLAYER).NE.FDOOR) RETURN
527*35973SbosticC						!IF PLAYER LEFT, DIE.
528*35973Sbostic	CALL RSPEAK(769)
529*35973Sbostic	CALL RSPEAK(770+QUESNO)
530*35973Sbostic	CTICK(CEVINQ)=2
531*35973Sbostic	RETURN
532*35973SbosticC
533*35973SbosticC CEV24--	MASTER FOLLOWS
534*35973SbosticC
535*35973Sbostic24000	IF(AROOM(AMASTR).EQ.HERE) RETURN
536*35973SbosticC						!NO MOVEMENT, DONE.
537*35973Sbostic	IF((HERE.NE.CELL).AND.(HERE.NE.PCELL)) GO TO 24100
538*35973Sbostic	IF(FOLLWF) CALL RSPEAK(811)
539*35973SbosticC						!WONT GO TO CELLS.
540*35973Sbostic	FOLLWF=.FALSE.
541*35973Sbostic	RETURN
542*35973SbosticC
543*35973Sbostic24100	FOLLWF=.TRUE.
544*35973SbosticC						!FOLLOWING.
545*35973Sbostic	I=812
546*35973SbosticC						!ASSUME CATCHES UP.
547*35973Sbostic	DO 24200 J=XMIN,XMAX,XMIN
548*35973Sbostic	  IF(FINDXT(J,AROOM(AMASTR)).AND.(XROOM1.EQ.HERE))
549*35973Sbostic&		I=813
550*35973Sbostic24200	CONTINUE
551*35973Sbostic	CALL RSPEAK(I)
552*35973Sbostic	CALL NEWSTA(MASTER,0,HERE,0,0)
553*35973SbosticC						!MOVE MASTER OBJECT.
554*35973Sbostic	AROOM(AMASTR)=HERE
555*35973SbosticC						!MOVE MASTER PLAYER.
556*35973Sbostic	RETURN
557*35973SbosticC
558*35973Sbostic	END
559*35973SbosticC LITINT-	LIGHT INTERRUPT PROCESSOR
560*35973SbosticC
561*35973SbosticC DECLARATIONS
562*35973SbosticC
563*35973Sbostic	SUBROUTINE LITINT(OBJ,CTR,CEV,TICKS,TICKLN)
564*35973Sbostic	IMPLICIT INTEGER (A-Z)
565*35973Sbostic	INTEGER TICKS(TICKLN)
566*35973Sbostic#include "gamestate.h"
567*35973Sbostic#include "objects.h"
568*35973Sbostic#include "oflags.h"
569*35973Sbostic#include "clock.h"
570*35973SbosticC
571*35973Sbostic	CTR=CTR+1
572*35973SbosticC						!ADVANCE STATE CNTR.
573*35973Sbostic	CTICK(CEV)=TICKS(CTR)
574*35973SbosticC						!RESET INTERRUPT.
575*35973Sbostic	IF(CTICK(CEV).NE.0) GO TO 100
576*35973SbosticC						!EXPIRED?
577*35973Sbostic	OFLAG1(OBJ)=and(OFLAG1(OBJ), not(LITEBT+FLAMBT+ONBT))
578*35973Sbostic	IF((OROOM(OBJ).EQ.HERE).OR.(OADV(OBJ).EQ.WINNER))
579*35973Sbostic&		CALL RSPSUB(293,ODESC2(OBJ))
580*35973Sbostic	RETURN
581*35973SbosticC
582*35973Sbostic100	IF((OROOM(OBJ).EQ.HERE).OR.(OADV(OBJ).EQ.WINNER))
583*35973Sbostic&		CALL RSPEAK(TICKS(CTR+(TICKLN/2)))
584*35973Sbostic	RETURN
585*35973SbosticC
586*35973Sbostic	END
587