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