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 MISCELLANEOUS VARIABLES
COMMON /VERS/ VMAJ,VMIN,VEDIT
COMMON /TIME/ PLTIME,SHOUR,SMIN,SSEC
C Note: save file format is different for PDP vs. non-PDP versions
C send restore data flag down pipe
C write out necessary common blocks
C send end of data flag down pipe
OPEN (UNIT=1,file='dsave.dat',ACCESS='SEQUENTIAL',
& status='UNKNOWN',FORM='UNFORMATTED',ERR=100)
WRITE(1) WINNER,HERE,THFPOS,TELFLG,THFFLG,THFACT,
WRITE(1) I,MOVES,DEATHS,RWSCOR,EGSCOR,MXLOAD,
& LTSHFT,BLOC,MUNGRM,HS,FROMDR,SCOLRM,SCOLAC
WRITE(1) ODESC1,ODESC2,OFLAG1,OFLAG2,OFVAL,OTVAL,
& OSIZE,OCAPAC,OROOM,OADV,OCAN
WRITE(1) AROOM,ASCORE,AVEHIC,ASTREN,AFLAG
WRITE(1) FLAGS,SWITCH,VPROB,CFLAG,CTICK
C RESTORE- RESTORE GAME STATE
C MISCELLANEOUS VARIABLES
COMMON /VERS/ VMAJ,VMIN,VEDIT
COMMON /TIME/ PLTIME,SHOUR,SMIN,SSEC
C Note: save file format is different for PDP vs. non-PDP versions
C read in necessary common blocks
IF(or((I.NE.VMAJ),(J.NE.VMIN))) GO TO 200
OPEN (UNIT=1,file='dsave.dat',ACCESS='SEQUENTIAL',
& status='OLD',FORM='UNFORMATTED',ERR=100,recl=1)
& status='OLD',FORM='UNFORMATTED',ERR=100)
IF(or((I.NE.VMAJ),(J.NE.VMIN))) GO TO 200
READ(1) WINNER,HERE,THFPOS,TELFLG,THFFLG,THFACT,
READ(1) PLTIME,MOVES,DEATHS,RWSCOR,EGSCOR,MXLOAD,
& LTSHFT,BLOC,MUNGRM,HS,FROMDR,SCOLRM,SCOLAC
READ(1) ODESC1,ODESC2,OFLAG1,OFLAG2,OFVAL,OTVAL,
& OSIZE,OCAPAC,OROOM,OADV,OCAN
READ(1) AROOM,ASCORE,AVEHIC,ASTREN,AFLAG
READ(1) FLAGS,SWITCH,VPROB,CFLAG,CTICK
C WALK- MOVE IN SPECIFIED DIRECTION
LOGICAL FINDXT,QOPEN,LIT,PROB,MOVETO,RMDESC
QOPEN(O)=and(OFLAG2(O),OPENBT).NE.0
IF((WINNER.NE.PLAYER).OR.LIT(HERE).OR.PROB(25,25))
IF(.NOT.FINDXT(PRSO,HERE)) GO TO 450
GO TO (400,200,100,300),XTYPE
100 IF(CXAPPL(XACTIO).NE.0) GO TO 400
C !CEXIT... RETURNED ROOM?
IF(FLAGS(XFLAG)) GO TO 400
300 IF(CXAPPL(XACTIO).NE.0) GO TO 400
C !DOOR... RETURNED ROOM?
IF(QOPEN(XOBJ)) GO TO 400
400 IF(LIT(XROOM1)) GO TO 900
C !VALID ROOM, IS IT LIT?
C ROOM IS LIT, OR WINNER IS NOT PLAYER (NO GRUE).
500 IF(FINDXT(PRSO,HERE)) GO TO 550
IF(PRSO.EQ.XUP) XSTRNG=679
IF(PRSO.EQ.XDOWN) XSTRNG=680
IF(and(RFLAG(HERE),RNWALL).NE.0) XSTRNG=524
550 GO TO (900,600,700,800),XTYPE
700 IF(CXAPPL(XACTIO).NE.0) GO TO 900
C !CEXIT... RETURNED ROOM?
IF(FLAGS(XFLAG)) GO TO 900
600 IF(XSTRNG.EQ.0) GO TO 525
C !IF NO REASON, USE STD.
800 IF(CXAPPL(XACTIO).NE.0) GO TO 900
C !DOOR... RETURNED ROOM?
IF(QOPEN(XOBJ)) GO TO 900
IF(XSTRNG.EQ.0) XSTRNG=525
C !IF NO REASON, USE STD.
CALL RSPSUB(XSTRNG,ODESC2(XOBJ))
900 WALK=MOVETO(XROOM1,WINNER)
C CXAPPL- CONDITIONAL EXIT PROCESSORS
INTEGER FUNCTION CXAPPL(RI)
GO TO (1000,2000,3000,4000,5000,6000,7000,
& 8000,9000,10000,11000,12000,13000,14000),RI
1000 EGYPTF=OADV(COFFI).NE.WINNER
5000 I=XELNT(XCOND)*RND(8)
XROOM1=and(TRAVEL(REXIT(HERE)+I),XRMASK)
IF(OADV(I).EQ.WINNER) J=J+1
IF(OADV(LAMP).NE.WINNER) RETURN
IF(and(OFLAG2(DOOR),OPENBT).EQ.0)
& OFLAG2(DOOR)=and(OFLAG2(DOOR), not(TCHBT))
C C4- FROBOZZ FLAG (MAGNET ROOM, FAKE EXIT)
C C6- FROBOZZ FLAG (MAGNET ROOM, REAL EXIT)
4000 IF(CAROFF) GO TO 2500
C !OTHERWISE, NOT AN EXIT.
6000 IF(CAROFF) GO TO 2500
C C7- FROBOZZ FLAG (BANK ALARM)
7000 FROBZF=and((OROOM(BILLS).NE.0),(OROOM(PORTR).NE.0))
C C8- FROBOZZ FLAG (MRGO)
IF(MLOC.NE.XROOM1) GO TO 8100
IF((PRSO.EQ.XNORTH).OR.(PRSO.EQ.XSOUTH)) GO TO 8200
IF(MOD(MDIR,180).NE.0) GO TO 8300
XROOM1=((XROOM1-MRA)*2)+MRAE
IF(PRSO.GT.XSOUTH) XROOM1=XROOM1+1
IF(MOD(MDIR,180).EQ.0) RETURN
IF(PRSO.EQ.XSOUTH) LDIR=180
IF(((LDIR.GT.180).AND..NOT.MR1F).OR.
& ((LDIR.LT.180).AND..NOT.MR2F)) XSTRNG=816
C C9- FROBOZZ FLAG (MIRIN)
9000 IF(MRHERE(HERE).NE.1) GO TO 9100
C C10- FROBOZZ FLAG (MIRROR EXIT)
LDIR=((PRSO-XNORTH)/XNORTH)*45
& ((MOD(MDIR+270,360).NE.LDIR).AND.(PRSO.NE.XEXIT)))
XROOM1=((MLOC-MRA)*2)+MRAE+1-(MDIR/180)
IF(MOD(MDIR,180).EQ.0) GO TO 10100
IF(MDIR.GT.180) XROOM1=MLOC-1
10200 IF(.NOT.WDOPNF .OR.
& ((MOD(MDIR+180,360).NE.LDIR).AND.(PRSO.NE.XEXIT)))
IF(MDIR.EQ.0) XROOM1=MLOC-1
C C11- MAYBE DOOR. NORMAL MESSAGE IS THAT DOOR IS CLOSED.
C BUT IF LCELL.NE.4, DOOR ISNT THERE.
11000 IF(LCELL.NE.4) XSTRNG=678
C C12- FROBZF (PUZZLE ROOM MAIN ENTRANCE)
C C13- CPOUTF (PUZZLE ROOM SIZE ENTRANCE)
C C14- FROBZF (PUZZLE ROOM TRANSITIONS)
IF(PRSO.NE.XUP) GO TO 14100
IF(CPVEC(CPHERE+1).NE.-2) RETURN
14100 IF((CPHERE.NE.52).OR.(PRSO.NE.XWEST).OR..NOT.CPOUTF)
IF(PRSO.EQ.CPDR(I)) GO TO 14400
C !GET DIRECTIONAL OFFSET.
IF((((IABS(J).EQ.1).OR.(IABS(J).EQ.8)).OR.
& ((CPVEC(CPHERE+K).EQ.0).OR.(CPVEC(NXT-K).EQ.0))).AND.
& (CPVEC(NXT).EQ.0)) GO TO 14500