home *** CD-ROM | disk | FTP | other *** search
- C RESIDENT SUBROUTINES FOR DUNGEON
- 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 RSPEAK-- OUTPUT RANDOM MESSAGE ROUTINE
- C
- C CALLED BY--
- C
- C CALL RSPEAK(MSGNUM)
- C
- SUBROUTINE RSPEAK(N)
- IMPLICIT INTEGER(A-Z)
- C
- CALL RSPSB2(N,0,0)
- RETURN
- END
- C RSPSUB-- OUTPUT RANDOM MESSAGE WITH SUBSTITUTABLE ARGUMENT
- C
- C CALLED BY--
- C
- C CALL RSPSUB(MSGNUM,SUBNUM)
- C
- SUBROUTINE RSPSUB(N,S1)
- IMPLICIT INTEGER(A-Z)
- C
- CALL RSPSB2(N,S1,0)
- RETURN
- END
- C RSPSB2-- OUTPUT RANDOM MESSAGE WITH SUBSTITUTABLE ARGUMENTS
- C
- C CALLED BY--
- C
- C CALL RSPSB2(MSGNUM,S1,S2)
- C
- SUBROUTINE RSPSB2(A,B,C)
- IMPLICIT INTEGER(A-Z)
- LOGICAL*1 B1(74),B2(74),X1
- C
- C DECLARATIONS
- C
- LOGICAL TELFLG
- COMMON /PLAY/ WINNER,HERE,TELFLG
- C
- COMMON /RMSG/ MLNT,RTEXT(1050)
- COMMON /CHAN/ INPCH,OUTCH,DBCH
- C
- C CONVERT ALL ARGUMENTS FROM DICTIONARY NUMBERS (IF POSITIVE)
- C TO ABSOLUTE RECORD NUMBERS.
- C
- X=A !SET UP WORK VARIABLES.
- Y=B
- Z=C
- IF(X.GT.0) X=RTEXT(X) !IF >0, LOOK UP IN RTEXT.
- IF(Y.GT.0) Y=RTEXT(Y)
- IF(Z.GT.0) Z=RTEXT(Z)
- X=IABS(X) !TAKE ABS VALUE.
- Y=IABS(Y)
- Z=IABS(Z)
- IF(X.EQ.0) RETURN !ANYTHING TO DO?
- TELFLG=.TRUE. !SAID SOMETHING.
- C
- READ(DBCH'X) OLDREC,B1 !READ FIRST LINE.
- 100 DO 150 I=1,74
- X1=(X.AND.31)+I
- B1(I)=B1(I).XOR.X1
- 150 CONTINUE
- C
- 200 IF(Y.EQ.0) GO TO 400 !ANY SUBSTITUTABLE?
- DO 300 I=1,74 !YES, LOOK FOR #.
- IF(B1(I).EQ.'#') GO TO 1000
- 300 CONTINUE
- C
- 400 DO 500 I=74,1,-1 !BACKSCAN FOR BLANKS.
- IF(B1(I).NE.' ') GO TO 600
- 500 CONTINUE
- C
- 600 WRITE(OUTCH,650) (B1(J),J=1,I) !OUTPUT LINE.
- 650 FORMAT(1X,74A1)
- X=X+1 !ON TO NEXT RECORD.
- READ(DBCH'X) NEWREC,B1 !READ NEXT RECORD.
- IF(OLDREC.EQ.NEWREC) GO TO 100 !CONTINUATION?
- RETURN !NO, EXIT.
- C
- C SUBSTITUTION WITH SUBSTITUTABLE AVAILABLE.
- C I IS INDEX OF # IN B1.
- C Y IS NUMBER OF RECORD TO SUBSTITUTE.
- C
- C PROCEDURE:
- C 1) COPY REST OF B1 TO B2
- C 2) READ SUBSTITUTABLE OVER B1
- C 3) RESTORE TAIL OF ORIGINAL B1
- C
- C THE IMPLICIT ASSUMPTION HERE IS THAT THE SUBSTITUTABLE STRING
- C IS VERY SHORT.
- C
- 1000 K2=1 !TO
- DO 1100 K1=I+1,74 !COPY REST OF B1.
- B2(K2)=B1(K1)
- K2=K2+1
- 1100 CONTINUE
- C
- READ(DBCH'Y) J,(B1(K1),K1=I,74) !READ SUB RECORD.
- DO 1150 K1=I,74
- X1=(Y.AND.31)+K1-I+1
- B1(K1)=B1(K1).XOR.X1
- 1150 CONTINUE
- C
- DO 1200 J=74,1,-1 !ELIM TRAILING BLANKS.
- IF(B1(J).NE.' ') GO TO 1300
- 1200 CONTINUE
- C
- 1300 K1=1 !FROM
- DO 1400 K2=J+1,74 !COPY REST OF B1 BACK.
- B1(K2)=B2(K1)
- K1=K1+1
- 1400 CONTINUE
- C
- Y=Z !SET UP FOR NEXT
- Z=0 !SUBSTITUTION AND
- GO TO 200 !RECHECK LINE.
- C
- END
- C OBJACT-- APPLY OBJECTS FROM PARSE VECTOR
- C
- C DECLARATIONS
- C
- LOGICAL FUNCTION OBJACT(X)
- IMPLICIT INTEGER (A-Z)
- LOGICAL OAPPLI
- C
- C PARSER OUTPUT
- C
- LOGICAL PRSWON
- COMMON /PRSVEC/ PRSA,PRSI,PRSO,PRSWON,PRSCON
- 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
- OBJACT=.TRUE. !ASSUME WINS.
- IF(PRSI.EQ.0) GO TO 100 !IND OBJECT?
- IF(OAPPLI(OACTIO(PRSI),0)) RETURN !YES, LET IT HANDLE.
- C
- 100 IF(PRSO.EQ.0) GO TO 200 !DIR OBJECT?
- IF(OAPPLI(OACTIO(PRSO),0)) RETURN !YES, LET IT HANDLE.
- C
- 200 OBJACT=.FALSE. !LOSES.
- RETURN
- END
- C BUG-- REPORT FATAL SYSTEM ERROR
- C
- C CALLED BY--
- C
- C CALL BUG(NO,PAR)
- C
- SUBROUTINE BUG(A,B)
- IMPLICIT INTEGER(A-Z)
- C
- COMMON /DEBUG/ DBGFLG
- C
- TYPE 100,A,B
- IF(DBGFLG.NE.0) RETURN
- CALL EXIT
- C
- 100 FORMAT(' PROGRAM ERROR ',I2,', PARAMETER=',I6)
- END
- C NEWSTA-- SET NEW STATUS FOR OBJECT
- C
- C CALLED BY--
- C
- C CALL NEWSTA(OBJECT,STRING,NEWROOM,NEWCON,NEWADV)
- C
- SUBROUTINE NEWSTA(O,R,RM,CN,AD)
- IMPLICIT INTEGER(A-Z)
- 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
- CALL RSPEAK(R)
- OROOM(O)=RM
- OCAN(O)=CN
- OADV(O)=AD
- RETURN
- END
- C QHERE-- TEST FOR OBJECT IN ROOM
- C
- C DECLARATIONS
- C
- LOGICAL FUNCTION QHERE(OBJ,RM)
- IMPLICIT INTEGER (A-Z)
- 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 /OROOM2/ R2LNT,O2(20),R2(20)
- C
- QHERE=.TRUE.
- IF(OROOM(OBJ).EQ.RM) RETURN !IN ROOM?
- DO 100 I=1,R2LNT !NO, SCH ROOM2.
- IF((O2(I).EQ.OBJ).AND.(R2(I).EQ.RM)) RETURN
- 100 CONTINUE
- QHERE=.FALSE. !NOT PRESENT.
- RETURN
- END
- C QEMPTY-- TEST FOR OBJECT EMPTY
- C
- C DECLARATIONS
- C
- LOGICAL FUNCTION QEMPTY(OBJ)
- IMPLICIT INTEGER (A-Z)
- 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
- QEMPTY=.FALSE. !ASSUME LOSE.
- DO 100 I=1,OLNT
- IF(OCAN(I).EQ.OBJ) RETURN !INSIDE TARGET?
- 100 CONTINUE
- QEMPTY=.TRUE.
- RETURN
- END
- C JIGSUP- YOU ARE DEAD
- C
- C DECLARATIONS
- C
- SUBROUTINE JIGSUP(DESC)
- IMPLICIT INTEGER (A-Z)
- LOGICAL YESNO,MOVETO,QHERE,F
- INTEGER RLIST(9)
- 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
- COMMON /CHAN/ INPCH,OUTCH,DBCH
- COMMON /DEBUG/ DBGFLG
- 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
- 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 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
- C ADVENTURERS
- C
- COMMON /ADVS/ ALNT,AROOM(4),ASCORE(4),AVEHIC(4),
- 1 AOBJ(4),AACTIO(4),ASTREN(4),AFLAG(4)
- 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
- C FUNCTIONS AND DATA
- C
- DATA RLIST/8,6,36,35,34,4,34,6,5/
- C JIGSUP, PAGE 2
- C
- CALL RSPEAK(DESC) !DESCRIBE SAD STATE.
- PRSCON=1 !STOP PARSER.
- IF(DBGFLG.NE.0) RETURN !IF DBG, EXIT.
- AVEHIC(WINNER)=0 !GET RID OF VEHICLE.
- IF(WINNER.EQ.PLAYER) GO TO 100 !HIMSELF?
- CALL RSPSUB(432,ODESC2(AOBJ(WINNER))) !NO, SAY WHO DIED.
- CALL NEWSTA(AOBJ(WINNER),0,0,0,0) !SEND TO HYPER SPACE.
- RETURN
- C
- 100 IF(ENDGMF) GO TO 900 !NO RECOVERY IN END GAME.
- IF(DEATHS.GE.2) GO TO 1000 !DEAD TWICE? KICK HIM OFF.
- IF(.NOT.YESNO(10,9,8)) GO TO 1100 !CONTINUE?
- C
- DO 50 J=1,OLNT !TURN OFF FIGHTING.
- IF(QHERE(J,HERE)) OFLAG2(J)=OFLAG2(J).AND. .NOT.FITEBT
- 50 CONTINUE
- C
- DEATHS=DEATHS+1
- CALL SCRUPD(-10) !CHARGE TEN POINTS.
- F=MOVETO(FORE1,WINNER) !REPOSITION HIM.
- EGYPTF=.TRUE. !RESTORE COFFIN.
- IF(OADV(COFFI).EQ.WINNER) CALL NEWSTA(COFFI,0,EGYPT,0,0)
- OFLAG2(DOOR)=OFLAG2(DOOR).AND. .NOT.TCHBT !RESTORE DOOR.
- OFLAG1(ROBOT)=(OFLAG1(ROBOT).OR.VISIBT) .AND. .NOT.NDSCBT
- IF((OROOM(LAMP).NE.0).OR.(OADV(LAMP).EQ.WINNER))
- 1 CALL NEWSTA(LAMP,0,LROOM,0,0) !RESTORE LAMP.
- C
- C NOW REDISTRIBUTE HIS VALUABLES AND OTHER BELONGINGS.
- C
- C THE LAMP HAS BEEN PLACED IN THE LIVING ROOM.
- C THE FIRST 8 NON-VALUABLES ARE PLACED IN LOCATIONS AROUND THE HOUSE.
- C HIS VALUABLES ARE PLACED AT THE END OF THE MAZE.
- C REMAINING NON-VALUABLES ARE PLACED AT THE END OF THE MAZE.
- C
- I=1
- DO 200 J=1,OLNT !LOOP THRU OBJECTS.
- IF((OADV(J).NE.WINNER).OR.(OTVAL(J).NE.0))
- 1 GO TO 200 !GET HIS NON-VAL OBJS.
- I=I+1
- IF(I.GT.9) GO TO 400 !MOVE TO RANDOM LOCATIONS.
- CALL NEWSTA(J,0,RLIST(I),0,0)
- 200 CONTINUE
- C
- 400 I=RLNT+1 !NOW MOVE VALUABLES.
- NONOFL=RAIR+RWATER+RSACRD+REND !DONT MOVE HERE.
- DO 300 J=1,OLNT
- IF((OADV(J).NE.WINNER).OR.(OTVAL(J).EQ.0))
- 1 GO TO 300 !ON ADV AND VALUABLE?
- 250 I=I-1 !FIND NEXT ROOM.
- IF((RFLAG(I).AND.NONOFL).NE.0) GO TO 250 !SKIP IF NONO.
- CALL NEWSTA(J,0,I,0,0) !YES, MOVE.
- 300 CONTINUE
- C
- DO 500 J=1,OLNT !NOW GET RID OF REMAINDER.
- IF(OADV(J).NE.WINNER) GO TO 500
- 450 I=I-1 !FIND NEXT ROOM.
- IF((RFLAG(I).AND.NONOFL).NE.0) GO TO 450 !SKIP IF NONO.
- CALL NEWSTA(J,0,I,0,0)
- 500 CONTINUE
- RETURN
- C
- C CANT OR WONT CONTINUE, CLEAN UP AND EXIT.
- C
- 900 CALL RSPEAK(625) !IN ENDGAME, LOSE.
- GO TO 1100
- C
- 1000 CALL RSPEAK(7) !INVOLUNTARY EXIT.
- 1100 CALL SCORE(.FALSE.) !TELL SCORE.
- CLOSE (UNIT=DBCH)
- CALL EXIT
- C
- END
- C OACTOR- GET ACTOR ASSOCIATED WITH OBJECT
- C
- C DECLARATIONS
- C
- INTEGER FUNCTION OACTOR(OBJ)
- IMPLICIT INTEGER(A-Z)
- C
- C ADVENTURERS
- C
- COMMON /ADVS/ ALNT,AROOM(4),ASCORE(4),AVEHIC(4),
- 1 AOBJ(4),AACTIO(4),ASTREN(4),AFLAG(4)
- C
- DO 100 I=1,ALNT !LOOP THRU ACTORS.
- OACTOR=I !ASSUME FOUND.
- IF(AOBJ(I).EQ.OBJ) RETURN !FOUND IT?
- 100 CONTINUE
- CALL BUG(40,OBJ) !NO, DIE.
- RETURN
- END
- C PROB- COMPUTE PROBABILITY
- C
- C DECLARATIONS
- C
- LOGICAL FUNCTION PROB(G,B)
- IMPLICIT INTEGER(A-Z)
- 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
- I=G !ASSUME GOOD LUCK.
- IF(BADLKF) I=B !IF BAD, TOO BAD.
- PROB=RND(100).LT.I !COMPUTE.
- RETURN
- END
- C RMDESC-- PRINT ROOM DESCRIPTION
- C
- C RMDESC PRINTS A DESCRIPTION OF THE CURRENT ROOM.
- C IT IS ALSO THE PROCESSOR FOR VERBS 'LOOK' AND 'EXAMINE'.
- C
- LOGICAL FUNCTION RMDESC(FULL)
- C
- C FULL= 0/1/2/3= SHORT/OBJ/ROOM/FULL
- C
- C DECLARATIONS
- C
- IMPLICIT INTEGER (A-Z)
- LOGICAL PROB,LIT,RAPPLI
- 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 SCREEN OF LIGHT
- C
- COMMON /SCREEN/ FROMDR,SCOLRM,SCOLAC
- 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
- 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
- C ADVENTURERS
- C
- COMMON /ADVS/ ALNT,AROOM(4),ASCORE(4),AVEHIC(4),
- 1 AOBJ(4),AACTIO(4),ASTREN(4),AFLAG(4)
- C
- COMMON /AINDEX/ PLAYER,AROBOT,AMASTR
- C
- C VERBS
- C
- COMMON /VINDEX/ CINTW,DEADXW,FRSTQW,INXW,OUTXW
- COMMON /VINDEX/ WALKIW,FIGHTW,FOOW
- COMMON /VINDEX/ MELTW,READW,INFLAW,DEFLAW,ALARMW,EXORCW
- COMMON /VINDEX/ PLUGW,KICKW,WAVEW,RAISEW,LOWERW,RUBW
- COMMON /VINDEX/ PUSHW,UNTIEW,TIEW,TIEUPW,TURNW,BREATW
- COMMON /VINDEX/ KNOCKW,LOOKW,EXAMIW,SHAKEW,MOVEW,TRNONW,TRNOFW
- COMMON /VINDEX/ OPENW,CLOSEW,FINDW,WAITW,SPINW,BOARDW,UNBOAW,TAKEW
- COMMON /VINDEX/ INVENW,FILLW,EATW,DRINKW,BURNW
- COMMON /VINDEX/ MUNGW,KILLW,ATTACW,SWINGW
- COMMON /VINDEX/ WALKW,TELLW,PUTW,DROPW,GIVEW,POURW,THROWW
- COMMON /VINDEX/ DIGW,LEAPW,STAYW,FOLLOW
- COMMON /VINDEX/ HELLOW,LOOKIW,LOOKUW,PUMPW,WINDW
- COMMON /VINDEX/ CLMBW,CLMBUW,CLMBDW,TRNTOW
- 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 RMDESC, PAGE 2
- C
- RMDESC=.TRUE. !ASSUME WINS.
- IF(PRSO.LT.XMIN) GO TO 50 !IF DIRECTION,
- FROMDR=PRSO !SAVE AND
- PRSO=0 !CLEAR.
- 50 IF(HERE.EQ.AROOM(PLAYER)) GO TO 100 !PLAYER JUST MOVE?
- CALL RSPEAK(2) !NO, JUST SAY DONE.
- PRSA=WALKIW !SET UP WALK IN ACTION.
- RETURN
- C
- 100 IF(LIT(HERE)) GO TO 300 !LIT?
- CALL RSPEAK(430) !WARN OF GRUE.
- RMDESC=.FALSE.
- RETURN
- C
- 300 RA=RACTIO(HERE) !GET ROOM ACTION.
- IF(FULL.EQ.1) GO TO 600 !OBJ ONLY?
- I=RDESC2-HERE !ASSUME SHORT DESC.
- IF((FULL.EQ.0)
- 1 .AND. (SUPERF.OR.(((RFLAG(HERE).AND.RSEEN).NE.0)
- 1 .AND. (BRIEFF.OR.PROB(80,80))))) GO TO 400
- I=RDESC1(HERE) !USE LONG.
- IF((I.NE.0).OR.(RA.EQ.0)) GO TO 400 !IF GOT DESC, SKIP.
- PRSA=LOOKW !PRETEND LOOK AROUND.
- IF(.NOT.RAPPLI(RA)) GO TO 100 !ROOM HANDLES, NEW DESC?
- PRSA=FOOW !NOP PARSER.
- GO TO 500
- C
- 400 CALL RSPEAK(I) !OUTPUT DESCRIPTION.
- 500 IF(AVEHIC(WINNER).NE.0) CALL RSPSUB(431,ODESC2(AVEHIC(WINNER)))
- C
- 600 IF(FULL.NE.2) CALL PRINCR(FULL.NE.0,HERE)
- RFLAG(HERE)=RFLAG(HERE).OR.RSEEN !INDICATE ROOM SEEN.
- IF((FULL.NE.0).OR.(RA.EQ.0)) RETURN !ANYTHING MORE?
- PRSA=WALKIW !GIVE HIM A SURPISE.
- IF(.NOT.RAPPLI(RA)) GO TO 100 !ROOM HANDLES, NEW DESC?
- PRSA=FOOW
- RETURN
- C
- END
- C RAPPLI- ROUTING ROUTINE FOR ROOM APPLICABLES
- C
- C DECLARATIONS
- C
- LOGICAL FUNCTION RAPPLI(RI)
- IMPLICIT INTEGER(A-Z)
- LOGICAL RAPPL1,RAPPL2
- DATA NEWRMS/38/
- C
- RAPPLI=.TRUE. !ASSUME WINS.
- IF(RI.EQ.0) RETURN !IF ZERO, WIN.
- IF(RI.LT.NEWRMS) RAPPLI=RAPPL1(RI) !IF OLD, PROCESSOR 1.
- IF(RI.GE.NEWRMS) RAPPLI=RAPPL2(RI) !IF NEW, PROCESSOR 2.
- RETURN
- END
-