C SAVE- SAVE GAME STATE 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 SAVEGM IMPLICIT INTEGER (A-Z) 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 COMMON /STATE/ MOVES,DEATHS,RWSCOR,MXSCOR,MXLOAD, 1 LTSHFT,BLOC,MUNGRM,HS,EGSCOR,EGMXSC C C SCREEN OF LIGHT C COMMON /SCREEN/ FROMDR,SCOLRM,SCOLAC C C PUZZLE ROOM C COMMON /PUZZLE/ CPDR(16),CPWL(8),CPVEC(64) C C MISCELLANEOUS VARIABLES C COMMON /VERS/ VMAJ,VMIN,VEDIT COMMON /TIME/ PLTIME,SHOUR,SMIN,SSEC 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 C EXITS C COMMON /EXITS/ XLNT,TRAVEL(900) 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 C C CLOCK INTERRUPTS C LOGICAL*1 CFLAG COMMON /CEVENT/ CLNT,CTICK(25),CACTIO(25),CFLAG(25) C C C VILLAINS AND DEMONS C LOGICAL THFFLG,SWDACT,THFACT COMMON /HACK/ THFPOS,THFFLG,THFACT,SWDACT,SWDSTA COMMON /VILL/ VLNT,VILLNS(4),VPROB(4),VOPPS(4),VBEST(4),VMELEE(4) C C ADVENTURERS C COMMON /ADVS/ ALNT,AROOM(4),ASCORE(4),AVEHIC(4), 1 AOBJ(4),AACTIO(4),ASTREN(4),AFLAG(4) C C FLAGS C LOGICAL*1 FLAGS(46) INTEGER SWITCH(22) COMMON /FINDEX/ FLAGS,SWITCH C PRSWON=.FALSE. !DISABLE GAME. OPEN (UNIT=1,NAME='DSAVE.DAT',ACCESS='SEQUENTIAL', 1 TYPE='UNKNOWN',FORM='UNFORMATTED',ERR=100) C CALL GTTIME(I) !GET TIME. WRITE(1) VMAJ,VMIN,VEDIT WRITE(1) WINNER,HERE,THFPOS,TELFLG,THFFLG,THFACT, 1 SWDACT,SWDSTA,CPVEC WRITE(1) I,MOVES,DEATHS,RWSCOR,EGSCOR,MXLOAD, 1 LTSHFT,BLOC,MUNGRM,HS,FROMDR,SCOLRM,SCOLAC WRITE(1) ODESC1,ODESC2,OFLAG1,OFLAG2,OFVAL,OTVAL, 1 OSIZE,OCAPAC,OROOM,OADV,OCAN WRITE(1) RVAL,RFLAG WRITE(1) AROOM,ASCORE,AVEHIC,ASTREN,AFLAG WRITE(1) FLAGS,SWITCH,VPROB,CFLAG,CTICK C CLOSE(UNIT=1) CALL RSPEAK(597) RETURN C 100 CALL RSPEAK(598) !CANT DO IT. RETURN END C RESTORE- RESTORE GAME STATE C C DECLARATIONS C SUBROUTINE RSTRGM IMPLICIT INTEGER (A-Z) 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 COMMON /STATE/ MOVES,DEATHS,RWSCOR,MXSCOR,MXLOAD, 1 LTSHFT,BLOC,MUNGRM,HS,EGSCOR,EGMXSC C C SCREEN OF LIGHT C COMMON /SCREEN/ FROMDR,SCOLRM,SCOLAC C C PUZZLE ROOM C COMMON /PUZZLE/ CPDR(16),CPWL(8),CPVEC(64) C C MISCELLANEOUS VARIABLES C COMMON /VERS/ VMAJ,VMIN,VEDIT COMMON /TIME/ PLTIME,SHOUR,SMIN,SSEC 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 C EXITS C COMMON /EXITS/ XLNT,TRAVEL(900) 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 C C CLOCK INTERRUPTS C LOGICAL*1 CFLAG COMMON /CEVENT/ CLNT,CTICK(25),CACTIO(25),CFLAG(25) C C C VILLAINS AND DEMONS C LOGICAL THFFLG,SWDACT,THFACT COMMON /HACK/ THFPOS,THFFLG,THFACT,SWDACT,SWDSTA COMMON /VILL/ VLNT,VILLNS(4),VPROB(4),VOPPS(4),VBEST(4),VMELEE(4) C C ADVENTURERS C COMMON /ADVS/ ALNT,AROOM(4),ASCORE(4),AVEHIC(4), 1 AOBJ(4),AACTIO(4),ASTREN(4),AFLAG(4) C C FLAGS C LOGICAL*1 FLAGS(46) INTEGER SWITCH(22) COMMON /FINDEX/ FLAGS,SWITCH C PRSWON=.FALSE. !DISABLE GAME. OPEN (UNIT=1,NAME='DSAVE.DAT',ACCESS='SEQUENTIAL', 1 TYPE='OLD',READONLY,FORM='UNFORMATTED',ERR=100) C READ(1) I,J,K IF((I.NE.VMAJ).OR.(J.NE.VMIN)) GO TO 200 C READ(1) WINNER,HERE,THFPOS,TELFLG,THFFLG,THFACT, 1 SWDACT,SWDSTA,CPVEC READ(1) PLTIME,MOVES,DEATHS,RWSCOR,EGSCOR,MXLOAD, 1 LTSHFT,BLOC,MUNGRM,HS,FROMDR,SCOLRM,SCOLAC READ(1) ODESC1,ODESC2,OFLAG1,OFLAG2,OFVAL,OTVAL, 1 OSIZE,OCAPAC,OROOM,OADV,OCAN READ(1) RVAL,RFLAG READ(1) AROOM,ASCORE,AVEHIC,ASTREN,AFLAG READ(1) FLAGS,SWITCH,VPROB,CFLAG,CTICK C CLOSE(UNIT=1) CALL RSPEAK(599) RETURN C 100 CALL RSPEAK(598) !CANT DO IT. RETURN C 200 CALL RSPEAK(600) !OBSOLETE VERSION CLOSE (UNIT=1) RETURN END C WALK- MOVE IN SPECIFIED DIRECTION C C DECLARATIONS C LOGICAL FUNCTION WALK(X) IMPLICIT INTEGER(A-Z) LOGICAL FINDXT,QOPEN,LIT,PROB,MOVETO,RMDESC 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 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 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 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 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 VILLAINS AND DEMONS C LOGICAL THFFLG,SWDACT,THFACT COMMON /HACK/ THFPOS,THFFLG,THFACT,SWDACT COMMON /VILL/ VLNT,VILLNS(4),VPROB(4),VOPPS(4),VBEST(4),VMELEE(4) C C ADVENTURERS C COMMON /AINDEX/ PLAYER,AROBOT,AMASTR C C FLAGS C LOGICAL*1 FLAGS(46) EQUIVALENCE (FLAGS(1),TROLLF) 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(O)=(OFLAG2(O).AND.OPENBT).NE.0 C WALK, PAGE 2 C WALK=.TRUE. !ASSUME WINS. IF((WINNER.NE.PLAYER).OR.LIT(HERE).OR.PROB(25,25)) 1 GO TO 500 IF(.NOT.FINDXT(PRSO,HERE)) GO TO 450 !INVALID EXIT? GRUE! GO TO (400,200,100,300),XTYPE !DECODE EXIT TYPE. CALL BUG(9,XTYPE) C 100 IF(CXAPPL(XACTIO).NE.0) GO TO 400 !CEXIT... RETURNED ROOM? IF(FLAGS(XFLAG)) GO TO 400 !NO, FLAG ON? 200 CALL JIGSUP(523) !BAD EXIT, GRUE! RETURN C 300 IF(CXAPPL(XACTIO).NE.0) GO TO 400 !DOOR... RETURNED ROOM? IF(QOPEN(XOBJ)) GO TO 400 !NO, DOOR OPEN? CALL JIGSUP(523) !BAD EXIT, GRUE! RETURN C 400 IF(LIT(XROOM1)) GO TO 900 !VALID ROOM, IS IT LIT? 450 CALL JIGSUP(522) !NO, GRUE! RETURN C C ROOM IS LIT, OR WINNER IS NOT PLAYER (NO GRUE). C 500 IF(FINDXT(PRSO,HERE)) GO TO 550 !EXIT EXIST? 525 XSTRNG=678 !ASSUME WALL. IF(PRSO.EQ.XUP) XSTRNG=679 !IF UP, CANT. IF(PRSO.EQ.XDOWN) XSTRNG=680 !IF DOWN, CANT. IF((RFLAG(HERE).AND.RNWALL).NE.0) XSTRNG=524 CALL RSPEAK(XSTRNG) PRSCON=1 !STOP CMD STREAM. RETURN C 550 GO TO (900,600,700,800),XTYPE !BRANCH ON EXIT TYPE. CALL BUG(9,XTYPE) C 700 IF(CXAPPL(XACTIO).NE.0) GO TO 900 !CEXIT... RETURNED ROOM? IF(FLAGS(XFLAG)) GO TO 900 !NO, FLAG ON? 600 IF(XSTRNG.EQ.0) GO TO 525 !IF NO REASON, USE STD. CALL RSPEAK(XSTRNG) !DENY EXIT. PRSCON=1 !STOP CMD STREAM. RETURN C 800 IF(CXAPPL(XACTIO).NE.0) GO TO 900 !DOOR... RETURNED ROOM? IF(QOPEN(XOBJ)) GO TO 900 !NO, DOOR OPEN? IF(XSTRNG.EQ.0) XSTRNG=525 !IF NO REASON, USE STD. CALL RSPSUB(XSTRNG,ODESC2(XOBJ)) PRSCON=1 !STOP CMD STREAM. RETURN C 900 WALK=MOVETO(XROOM1,WINNER) !MOVE TO ROOM. IF(WALK) WALK=RMDESC(0) !DESCRIBE ROOM. RETURN END C CXAPPL- CONDITIONAL EXIT PROCESSORS C C DECLARATIONS C INTEGER FUNCTION CXAPPL(RI) IMPLICIT INTEGER (A-Z) C C GAME STATE C LOGICAL TELFLG COMMON /PLAY/ WINNER,HERE,TELFLG C C PARSER OUTPUT C LOGICAL PRSWON COMMON /PRSVEC/ PRSA,PRSI,PRSO,PRSWON,PRSCON C C PUZZLE ROOM C COMMON /PUZZLE/ CPDR(16),CPWL(8),CPVEC(64) 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 /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 EXITS C COMMON /EXITS/ XLNT,TRAVEL(900) C COMMON /CURXT/ XTYPE,XROOM1,XSTRNG,XACTIO,XOBJ EQUIVALENCE (XFLAG,XOBJ) C COMMON /XPARS/ XRMASK,XDMASK,XFMASK,XFSHFT,XASHFT, 1 XELNT(4),XNORM,XNO,XCOND,XDOOR,XLFLAG C COMMON /XSRCH/ XMIN,XMAX,XDOWN,XUP, 1 XNORTH,XSOUTH,XENTER,XEXIT,XEAST,XWEST 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 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 CXAPPL, PAGE 2 C CXAPPL=0 !NO RETURN. IF(RI.EQ.0) RETURN !IF NO ACTION, DONE. GO TO (1000,2000,3000,4000,5000,6000,7000, 1 8000,9000,10000,11000,12000,13000,14000),RI CALL BUG(5,RI) C C C1- COFFIN-CURE C 1000 EGYPTF=OADV(COFFI).NE.WINNER !T IF NO COFFIN. RETURN C C C2- CAROUSEL EXIT C C5- CAROUSEL OUT C 2000 IF(CAROFF) RETURN !IF FLIPPED, NOTHING. 2500 CALL RSPEAK(121) !SPIN THE COMPASS. 5000 I=XELNT(XCOND)*RND(8) !CHOOSE RANDOM EXIT. XROOM1=(TRAVEL(REXIT(HERE)+I)).AND.XRMASK CXAPPL=XROOM1 !RETURN EXIT. RETURN C C C3- CHIMNEY FUNCTION C 3000 LITLDF=.FALSE. !ASSUME HEAVY LOAD. J=0 DO 3100 I=1,OLNT !COUNT OBJECTS. IF(OADV(I).EQ.WINNER) J=J+1 3100 CONTINUE C IF(J.GT.2) RETURN !CARRYING TOO MUCH? XSTRNG=446 !ASSUME NO LAMP. IF(OADV(LAMP).NE.WINNER) RETURN !NO LAMP? LITLDF=.TRUE. !HE CAN DO IT. IF((OFLAG2(DOOR).AND.OPENBT).EQ.0) 1 OFLAG2(DOOR)=OFLAG2(DOOR).AND. .NOT.TCHBT RETURN C C C4- FROBOZZ FLAG (MAGNET ROOM, FAKE EXIT) C C6- FROBOZZ FLAG (MAGNET ROOM, REAL EXIT) C 4000 IF(CAROFF) GO TO 2500 !IF FLIPPED, GO SPIN. FROBZF=.FALSE. !OTHERWISE, NOT AN EXIT. RETURN C 6000 IF(CAROFF) GO TO 2500 !IF FLIPPED, GO SPIN. FROBZF=.TRUE. !OTHERWISE, AN EXIT. RETURN C C C7- FROBOZZ FLAG (BANK ALARM) C 7000 FROBZF=(OROOM(BILLS).NE.0).AND.(OROOM(PORTR).NE.0) RETURN C CXAPPL, PAGE 3 C C C8- FROBOZZ FLAG (MRGO) C 8000 FROBZF=.FALSE. !ASSUME CANT MOVE. IF(MLOC.NE.XROOM1) GO TO 8100 !MIRROR IN WAY? IF((PRSO.EQ.XNORTH).OR.(PRSO.EQ.XSOUTH)) GO TO 8200 IF(MOD(MDIR,180).NE.0) GO TO 8300 !MIRROR MUST BE N-S. XROOM1=((XROOM1-MRA)*2)+MRAE !CALC EAST ROOM. IF(PRSO.GT.XSOUTH) XROOM1=XROOM1+1 !IF SW/NW, CALC WEST. 8100 CXAPPL=XROOM1 RETURN C 8200 XSTRNG=814 !ASSUME STRUC BLOCKS. IF(MOD(MDIR,180).EQ.0) RETURN !IF MIRROR N-S, DONE. 8300 LDIR=MDIR !SEE WHICH MIRROR. IF(PRSO.EQ.XSOUTH) LDIR=180 XSTRNG=815 !MIRROR BLOCKS. IF(((LDIR.GT.180).AND..NOT.MR1F).OR. 1 ((LDIR.LT.180).AND..NOT.MR2F)) XSTRNG=816 !MIRROR BROKEN. RETURN C C C9- FROBOZZ FLAG (MIRIN) C 9000 IF(MRHERE(HERE).NE.1) GO TO 9100 !MIRROR 1 HERE? IF(MR1F) XSTRNG=805 !SEE IF BROKEN. FROBZF=MROPNF !ENTER IF OPEN. RETURN C 9100 FROBZF=.FALSE. !NOT HERE, XSTRNG=817 !LOSE. RETURN C CXAPPL, PAGE 4 C C C10- FROBOZZ FLAG (MIRROR EXIT) C 10000 FROBZF=.FALSE. !ASSUME CANT. LDIR=((PRSO-XNORTH)/XNORTH)*45 !XLATE DIR TO DEGREES. IF(.NOT.MROPNF .OR. 1 ((MOD(MDIR+270,360).NE.LDIR).AND.(PRSO.NE.XEXIT))) 2 GO TO 10200 !EXIT VIA MIRROR? XROOM1=((MLOC-MRA)*2)+MRAE+1-(MDIR/180) !ASSUME E-W EXIT. IF(MOD(MDIR,180).EQ.0) GO TO 10100 !IF N-S, OK. XROOM1=MLOC+1 !ASSUME N EXIT. IF(MDIR.GT.180) XROOM1=MLOC-1 !IF SOUTH. 10100 CXAPPL=XROOM1 RETURN C 10200 IF(.NOT.WDOPNF .OR. 1 ((MOD(MDIR+180,360).NE.LDIR).AND.(PRSO.NE.XEXIT))) 2 RETURN !EXIT VIA OPEN DOOR? XROOM1=MLOC+1 !ASSUME N. IF(MDIR.EQ.0) XROOM1=MLOC-1 !IF S. CALL RSPEAK(818) !CLOSE DOOR. WDOPNF=.FALSE. CXAPPL=XROOM1 RETURN C C C11- MAYBE DOOR. NORMAL MESSAGE IS THAT DOOR IS CLOSED. C BUT IF LCELL.NE.4, DOOR ISNT THERE. C 11000 IF(LCELL.NE.4) XSTRNG=678 !SET UP MSG. RETURN C C C12- FROBZF (PUZZLE ROOM MAIN ENTRANCE) C 12000 FROBZF=.TRUE. !ALWAYS ENTER. CPHERE=10 !SET SUBSTATE. RETURN C C C13- CPOUTF (PUZZLE ROOM SIZE ENTRANCE) C 13000 CPHERE=52 !SET SUBSTATE. RETURN C CXAPPL, PAGE 5 C C C14- FROBZF (PUZZLE ROOM TRANSITIONS) C 14000 FROBZF=.FALSE. !ASSSUME LOSE. IF(PRSO.NE.XUP) GO TO 14100 !UP? IF(CPHERE.NE.10) RETURN !AT EXIT? XSTRNG=881 !ASSUME NO LADDER. IF(CPVEC(CPHERE+1).NE.-2) RETURN !LADDER HERE? CALL RSPEAK(882) !YOU WIN. FROBZF=.TRUE. !LET HIM OUT. RETURN C 14100 IF((CPHERE.NE.52).OR.(PRSO.NE.XWEST).OR..NOT.CPOUTF) 1 GO TO 14200 !W EXIT AT DOOR? FROBZF=.TRUE. !YES, LET HIM OUT. RETURN C 14200 DO 14300 I=1,16,2 !LOCATE EXIT. IF(PRSO.EQ.CPDR(I)) GO TO 14400 14300 CONTINUE RETURN !NO SUCH EXIT. C 14400 J=CPDR(I+1) !GET DIRECTIONAL OFFSET. NXT=CPHERE+J !GET NEXT STATE. K=8 !GET ORTHOGONAL DIR. IF(J.LT.0) K=-8 IF((((IABS(J).EQ.1).OR.(IABS(J).EQ.8)).OR. 1 ((CPVEC(CPHERE+K).EQ.0).OR.(CPVEC(NXT-K).EQ.0))).AND. 2 (CPVEC(NXT).EQ.0)) GO TO 14500 !CANT DO IT? RETURN C 14500 CALL CPGOTO(NXT) !MOVE TO STATE. XROOM1=CPUZZ !STAY IN ROOM. CXAPPL=XROOM1 RETURN C END