home *** CD-ROM | disk | FTP | other *** search
- Path: uunet!paladin.american.edu!gatech!nntp.msstate.edu!emory!dragon.com!cts
- From: cts@dragon.com
- Newsgroups: vmsnet.sources.games
- Subject: Dungeon Part 23/30
- Message-ID: <1992Feb24.013437.816@dragon.com>
- Date: 24 Feb 92 06:34:37 GMT
- Organization: Computer Projects Unlimited
- Lines: 1508
-
- -+-+-+-+-+-+-+-+ START OF PART 23 -+-+-+-+-+-+-+-+
- X DATA RVECTR/0,0,0,0,5,5,1,1,2,2,2,2,
- X & 0,0,0,0,0,5,5,3,3,1,
- X & 0,0,0,5,5,3,3,3,1,2,2,2,
- X & 0,0,0,0,0,5,5,3,3,4,4,
- X & 0,0,0,5,5,3,3,3,4,4,4,
- X & 0,5,5,3,3,3,3,4,4,4/
- X DATA RSTATE/5000,3005,3008,4011,3015,3018,1021,0,0,
- X & 5022,3027,3030,4033,3037,3040,1043,0,0,
- X & 4044,2048,4050,4054,5058,4063,4067,3071,1074,
- X & 4075,1079,4080,4084,4088,4092,4096,4100,1104,
- X & 4105,2109,4111,4115,4119,4123,4127,3131,3134/
- X`0C
- XC BLOW, PAGE 3
- XC
- X RA=OACTIO(V)
- XC !GET VILLAIN ACTION,
- X DV=ODESC2(V)
- XC !DESCRIPTION.
- X BLOW=RMISS
- XC !ASSUME NO RESULT.
- X IF(DFLAG) PRINT 10,H,V,RMK,HFLG,OUT
- X10 FORMAT(' BLOW 10-- ',3I7,L7,I7)
- X IF(.NOT.HFLG) GO TO 1000
- XC !HERO STRIKING BLOW?
- XC
- XC HERO IS ATTACKER, VILLAIN IS DEFENDER.
- XC
- X PBLOSE=10
- XC !BAD LK PROB.
- X OFLAG2(V)=or(OFLAG2(V),FITEBT)
- X IF(and(AFLAG(H),ASTAG).EQ.0) GO TO 100
- X CALL RSPEAK(591)
- XC !YES, CANT FIGHT.
- X AFLAG(H)=and(AFLAG(H), not(ASTAG))
- X RETURN
- XC
- X100 ATT=FIGHTS(H,.TRUE.)
- XC !GET HIS STRENGTH.
- X OA=ATT
- X DEF=VILSTR(V)
- XC !GET VILL STRENGTH.
- X OD=DEF
- X DWEAP=0
- XC !ASSUME NO WEAPON.
- X DO 200 I=1,OLNT
- XC !SEARCH VILLAIN.
- X IF((OCAN(I).EQ.V).AND.(and(OFLAG2(I),WEAPBT).NE.0))
- X & DWEAP=I
- X200 CONTINUE
- X IF(V.EQ.AOBJ(PLAYER)) GO TO 300
- XC !KILLING SELF?
- X IF(DEF.NE.0) GO TO 2000
- XC !DEFENDER ALIVE?
- X CALL RSPSUB(592,DV)
- XC !VILLAIN DEAD.
- X RETURN
- XC
- X300 CALL JIGSUP(593)
- XC !KILLING SELF.
- X RETURN
- XC
- XC VILLAIN IS ATTACKER, HERO IS DEFENDER.
- XC
- X1000 PBLOSE=50
- XC !BAD LK PROB.
- X AFLAG(H)=and(AFLAG(H),not(ASTAG))
- X IF(and(OFLAG2(V),STAGBT).EQ.0) GO TO 1200
- X OFLAG2(V)=and(OFLAG2(V), not(STAGBT))
- X CALL RSPSUB(594,DV)
- XC !DESCRIBE.
- X RETURN
- XC
- X1200 ATT=VILSTR(V)
- XC !SET UP ATT, DEF.
- X OA=ATT
- X DEF=FIGHTS(H,.TRUE.)
- X IF(DEF.LE.0) RETURN
- XC !DONT ALLOW DEAD DEF.
- X OD=FIGHTS(H,.FALSE.)
- X DWEAP=IABS(FWIM(0,WEAPBT,0,0,H,.TRUE.))
- XC !FIND A WEAPON.
- X`0C
- XC BLOW, PAGE 4
- XC
- XC PARTIES ARE NOW EQUIPPED. DEF CANNOT BE ZERO.
- XC ATT MUST BE > 0.
- XC
- X2000 CONTINUE
- X IF(DFLAG) PRINT 2050,ATT,OA,DEF,OD,DWEAP
- X2050 FORMAT(' BLOW 2050-- ',5I7)
- X IF(DEF.GT.0) GO TO 2100
- XC !DEF ALIVE?
- X RES=RKILL
- X IF(HFLG) CALL RSPSUB(595,DV)
- XC !DEADER.
- X GO TO 3000
- XC
- X2100 IF(DEF-2) 2200,2300,2400
- XC !DEF <2,=2,>2
- X2200 ATT=MIN0(ATT,3)
- XC !SCALE ATT.
- X TBL=DEF1R(ATT)
- XC !CHOOSE TABLE.
- X GO TO 2500
- XC
- X2300 ATT=MIN0(ATT,4)
- XC !SCALE ATT.
- X TBL=DEF2R(ATT)
- XC !CHOOSE TABLE.
- X GO TO 2500
- XC
- X2400 ATT=ATT-DEF
- XC !SCALE ATT.
- X ATT=MIN0(2,MAX0(-2,ATT))+3
- X TBL=DEF3R(ATT)
- XC
- X2500 RES=RVECTR(TBL+RND(10))
- XC !GET RESULT.
- X IF(OUT.EQ.0) GO TO 2600
- XC !WAS HE OUT?
- X IF(RES.EQ.RSTAG) GO TO 2550
- XC !YES, STAG--> HES.
- X RES=RSIT
- XC !OTHERWISE, SITTING.
- X GO TO 2600
- X2550 RES=RHES
- X2600 IF((RES.EQ.RSTAG).AND.(DWEAP.NE.0).AND.PROB(25,PBLOSE))
- X & RES=RLOSE
- XC
- X MI=RSTATE(((RMK-1)*9)+RES+1)
- XC !CHOOSE TABLE ENTRY.
- X IF(MI.EQ.0) GO TO 3000
- X I=(MOD(MI,1000)+RND(MI/1000))+MBASE+1
- X J=DV
- X IF(.NOT.HFLG .AND.(DWEAP.NE.0)) J=ODESC2(DWEAP)
- X IF(DFLAG) PRINT 2650,RES,MI,I,J,MBASE
- X2650 FORMAT(' BLOW 2650-- ',5I7)
- X CALL RSPSUB(I,J)
- XC !PRESENT RESULT.
- X`0C
- XC BLOW, PAGE 5
- XC
- XC NOW APPLY RESULT
- XC
- X3000 GO TO (4000,3100,3200,3300,3400,3500,3600,4000,3200),RES+1
- XC
- X3100 IF(HFLG) DEF=-DEF
- XC !UNCONSCIOUS.
- X GO TO 4000
- XC
- X3200 DEF=0
- XC !KILLED OR SITTING DUCK.
- X GO TO 4000
- XC
- X3300 DEF=MAX0(0,DEF-1)
- XC !LIGHT WOUND.
- X GO TO 4000
- XC
- X3400 DEF=MAX0(0,DEF-2)
- XC !SERIOUS WOUND.
- X GO TO 4000
- XC
- X3500 IF(HFLG) GO TO 3550
- XC !STAGGERED.
- X AFLAG(H)=or(AFLAG(H),ASTAG)
- X GO TO 4000
- XC
- X3550 OFLAG2(V)=or(OFLAG2(V),STAGBT)
- X GO TO 4000
- XC
- X3600 CALL NEWSTA(DWEAP,0,HERE,0,0)
- XC !LOSE WEAPON.
- X DWEAP=0
- X IF(HFLG) GO TO 4000
- XC !IF HERO, DONE.
- X DWEAP=IABS(FWIM(0,WEAPBT,0,0,H,.TRUE.))
- XC !GET NEW.
- X IF(DWEAP.NE.0) CALL RSPSUB(605,ODESC2(DWEAP))
- X`0C
- XC BLOW, PAGE 6
- XC
- X4000 BLOW=RES
- XC !RETURN RESULT.
- X IF(.NOT.HFLG) GO TO 4500
- XC !HERO?
- X OCAPAC(V)=DEF
- XC !STORE NEW CAPACITY.
- X IF(DEF.NE.0) GO TO 4100
- XC !DEAD?
- X OFLAG2(V)=and(OFLAG2(V), not(FITEBT))
- X CALL RSPSUB(572,DV)
- XC !HE DIES.
- X CALL NEWSTA(V,0,0,0,0)
- XC !MAKE HIM DISAPPEAR.
- X IF(RA.EQ.0) RETURN
- XC !IF NX TO DO, EXIT.
- X PRSA=DEADXW
- XC !LET HIM KNOW.
- X F=OAPPLI(RA,0)
- X RETURN
- XC
- X4100 IF((RES.NE.ROUT).OR.(RA.EQ.0)) RETURN
- X PRSA=OUTXW
- XC !LET HIM BE OUT.
- X F=OAPPLI(RA,0)
- X RETURN
- XC
- X4500 ASTREN(H)=-10000
- XC !ASSUME DEAD.
- X IF(DEF.NE.0) ASTREN(H)=DEF-OD
- X IF(DEF.GE.OD) GO TO 4600
- X CTICK(CEVCUR)=30
- X CFLAG(CEVCUR)=.TRUE.
- X4600 IF(FIGHTS(H,.TRUE.).GT.0) RETURN
- X ASTREN(H)=1-FIGHTS(H,.FALSE.)
- XC !HE'S DEAD.
- X CALL JIGSUP(596)
- X BLOW=-1
- X RETURN
- XC
- X END
- X`0C
- XC SWORDD- SWORD INTERMOVE DEMON
- XC
- XC DECLARATIONS
- XC
- X SUBROUTINE SWORDD
- X IMPLICIT INTEGER(A-Z)
- X LOGICAL INFEST,FINDXT
- X
- X INCLUDE 'GAMESTATE.LIB'
- X INCLUDE 'CURXT.LIB'
- X INCLUDE 'XSRCH.LIB'
- X INCLUDE 'OBJECTS.LIB'
- X INCLUDE 'OINDEX.LIB'
- X INCLUDE 'VILLIANS.LIB'
- X INCLUDE 'ADVERS.LIB'
- X`0C
- XC SWORDD, PAGE 2
- XC
- X IF(OADV(SWORD).NE.PLAYER) GO TO 500
- XC !HOLDING SWORD?
- X NG=2
- XC !ASSUME VILL CLOSE.
- X IF(INFEST(HERE)) GO TO 300
- XC !VILL HERE?
- X NG=1
- X DO 200 I=XMIN,XMAX,XMIN
- XC !NO, SEARCH ROOMS.
- X IF(.NOT.FINDXT(I,HERE)) GO TO 200
- XC !ROOM THAT WAY?
- X GO TO (50,200,50,50),XTYPE
- XC !SEE IF ROOM AT ALL.
- X50 IF(INFEST(XROOM1)) GO TO 300
- XC !CHECK ROOM.
- X200 CONTINUE
- X NG=0
- XC !NO GLOW.
- XC
- X300 IF(NG.EQ.SWDSTA) RETURN
- XC !ANY STATE CHANGE?
- X CALL RSPEAK(NG+495)
- XC !YES, TELL NEW STATE.
- X SWDSTA=NG
- X RETURN
- XC
- X500 SWDACT=.FALSE.
- XC !DROPPED SWORD,
- X RETURN
- XC !DISABLE DEMON.
- X END
- X`0C
- XC INFEST- SUBROUTINE TO TEST FOR INFESTED ROOM
- XC
- XC DECLARATIONS
- XC
- X LOGICAL FUNCTION INFEST(R)
- X IMPLICIT INTEGER(A-Z)
- XC
- XC ROOMS
- X
- X INCLUDE 'RINDEX.LIB'
- X INCLUDE 'OBJECTS.LIB'
- X INCLUDE 'OINDEX.LIB'
- X INCLUDE 'VILLIANS.LIB'
- X INCLUDE 'FLAGS.LIB'
- XC
- X IF (.NOT.ENDGMF) INFEST=(OROOM(CYCLO).EQ.R).OR.
- X & (OROOM(TROLL).EQ.R).OR.
- X & ((OROOM(THIEF).EQ.R).AND.THFACT)
- X IF (ENDGMF) INFEST=(R.EQ.MRG).OR.(R.EQ.MRGE).OR.
- X & (R.EQ.MRGW).OR.
- X & ((R.EQ.INMIR).AND.(MLOC.EQ.MRG))
- X RETURN
- X END
- $ CALL UNPACK [.SRC]DEMONS.FOR;1 1414959697
- $ create 'f'
- XC GAME- MAIN COMMAND LOOP FOR DUNGEON
- XC
- XC COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
- XC ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
- XC WRITTEN BY R. M. SUPNIK
- XC
- XC DECLARATIONS
- XC
- X SUBROUTINE GAME
- X IMPLICIT INTEGER (A-Z)
- X LOGICAL RMDESC,VAPPLI,RAPPLI,AAPPLI
- X LOGICAL F,PARSE,FINDXT,XVEHIC,LIT
- X CHARACTER SECHO(4)
- X CHARACTER GDTSTR(3)
- X
- X INCLUDE 'PARSER.LIB'
- X INCLUDE 'GAMESTATE.LIB'
- X INCLUDE 'STATE.LIB'
- X INCLUDE 'IO.LIB'
- X INCLUDE 'ROOMS.LIB'
- X INCLUDE 'RINDEX.LIB'
- X INCLUDE 'OBJECTS.LIB'
- X INCLUDE 'OFLAGS.LIB'
- X INCLUDE 'OINDEX.LIB'
- X INCLUDE 'ADVERS.LIB'
- X INCLUDE 'VERBS.LIB'
- X INCLUDE 'FLAGS.LIB'
- XC
- XC FUNCTIONS AND DATA
- XC
- X DATA SECHO/'E','C','H','O'/
- X DATA GDTSTR/'G','D','T'/
- X`0C
- XC GAME, PAGE 2
- XC
- XC START UP, DESCRIBE CURRENT LOCATION.
- XC
- X CALL RSPEAK(1)
- XC !WELCOME ABOARD.
- X F=RMDESC(3)
- XC !START GAME.
- XC
- XC NOW LOOP, READING AND EXECUTING COMMANDS.
- XC
- X100 WINNER=PLAYER
- XC !PLAYER MOVING.
- X TELFLG=.FALSE.
- XC !ASSUME NOTHING TOLD.
- X IF(PRSCON.LE.1) CALL RDLINE(INBUF,INLNT,1)
- XC
- X DO 150 I=1,3
- XC !CALL ON GDT?
- X IF(INBUF(I+PRSCON-1).NE.GDTSTR(I)) GO TO 200
- X150 CONTINUE
- X CALL GDT
- XC !YES, INVOKE.
- X GO TO 100
- XC !ONWARD.
- XC
- X200 MOVES=MOVES+1
- X PRSWON=PARSE(INBUF,INLNT,.TRUE.)
- X IF(.NOT.PRSWON) GO TO 400
- XC !PARSE LOSES?
- X IF(XVEHIC(1)) GO TO 400
- XC !VEHICLE HANDLE?
- XC
- X IF(PRSA.EQ.TELLW) GO TO 2000
- XC !TELL?
- X300 IF((PRSO.EQ.VALUA).OR.(PRSO.EQ.EVERY)) GO TO 900
- X IF(.NOT.VAPPLI(PRSA)) GO TO 400
- XC !VERB OK?
- X350 IF(.NOT.ECHOF.AND.(HERE.EQ.ECHOR)) GO TO 1000
- X F=RAPPLI(RACTIO(HERE))
- XC
- X400 CALL XENDMV(TELFLG)
- XC !DO END OF MOVE.
- X IF(.NOT.LIT(HERE)) PRSCON=1
- X GO TO 100
- XC
- X900 CALL VALUAC(VALUA)
- X GO TO 350
- X`0C
- XC GAME, PAGE 3
- XC
- XC SPECIAL CASE-- ECHO ROOM.
- XC IF INPUT IS NOT 'ECHO' OR A DIRECTION, JUST ECHO.
- XC
- X1000 CALL RDLINE(INBUF,INLNT,0)
- X MOVES=MOVES+1
- XC !CHARGE FOR MOVES.
- X DO 1100 I=1,4
- XC !INPUT = ECHO?
- X IF(INBUF(I).NE.SECHO(I)) GO TO 1300
- X1100 CONTINUE
- XC
- XC Note: the following DO loop was changed from DO 1200 I=5,78
- XC The change was necessary because the RDLINE function was changed,
- XC and no longer provides a 78 character buffer padded with blanks.
- XC
- X DO 1200 I=5,INLNT
- X IF(INBUF(I).NE.' ') GO TO 1300
- X1200 CONTINUE
- XC
- X CALL RSPEAK(571)
- XC !KILL THE ECHO.
- X ECHOF=.TRUE.
- X OFLAG2(BAR)=and(OFLAG2(BAR), not(SCRDBT))
- X PRSWON=.TRUE.
- XC !FAKE OUT PARSER.
- X PRSCON=1
- XC !FORCE NEW INPUT.
- X GO TO 400
- XC
- X1300 PRSWON=PARSE(INBUF,INLNT,.FALSE.)
- X IF(.NOT.PRSWON .OR. (PRSA.NE.WALKW))
- X & GO TO 1400
- X IF(FINDXT(PRSO,HERE)) GO TO 300
- XC !VALID EXIT?
- XC
- X1400 WRITE(OUTCH,1410) (INBUF(J),J=1,INLNT)
- X1410 FORMAT(1X,78A1)
- X TELFLG=.TRUE.
- XC !INDICATE OUTPUT.
- X GO TO 1000
- X`0C
- XC !MORE ECHO ROOM.
- XC GAME, PAGE 4
- XC
- XC SPECIAL CASE-- TELL <ACTOR>, NEW COMMAND
- XC NOTE THAT WE CANNOT BE IN THE ECHO ROOM.
- XC
- X2000 IF(and(OFLAG2(PRSO),ACTRBT).NE.0) GO TO 2100
- X CALL RSPEAK(602)
- XC !CANT DO IT.
- X GO TO 350
- XC !VAPPLI SUCCEEDS.
- XC
- X2100 WINNER=OACTOR(PRSO)
- XC !NEW PLAYER.
- X HERE=AROOM(WINNER)
- XC !NEW LOCATION.
- X IF(PRSCON.LE.1) GO TO 2700
- XC !ANY INPUT?
- X IF(PARSE(INBUF,INLNT,.TRUE.)) GO TO 2150
- X2700 I=341
- XC !FAILS.
- X IF(TELFLG) I=604
- XC !GIVE RESPONSE.
- X CALL RSPEAK(I)
- X2600 WINNER=PLAYER
- XC !RESTORE STATE.
- X HERE=AROOM(WINNER)
- X GO TO 350
- XC
- X2150 IF(AAPPLI(AACTIO(WINNER))) GO TO 2400
- XC !ACTOR HANDLE?
- X IF(XVEHIC(1)) GO TO 2400
- XC !VEHICLE HANDLE?
- X IF((PRSO.EQ.VALUA).OR.(PRSO.EQ.EVERY)) GO TO 2900
- X IF(.NOT.VAPPLI(PRSA)) GO TO 2400
- XC !VERB HANDLE?
- X2350 F=RAPPLI(RACTIO(HERE))
- XC
- X2400 CALL XENDMV(TELFLG)
- XC !DO END OF MOVE.
- X GO TO 2600
- XC !DONE.
- XC
- X2900 CALL VALUAC(VALUA)
- XC !ALL OR VALUABLES.
- X GO TO 350
- XC
- X END
- X`0C
- XC XENDMV- EXECUTE END OF MOVE FUNCTIONS.
- XC
- XC DECLARATIONS
- XC
- X SUBROUTINE XENDMV(FLAG)
- X IMPLICIT INTEGER(A-Z)
- X LOGICAL F,CLOCKD,FLAG,XVEHIC
- X
- X INCLUDE 'PARSER.LIB'
- X INCLUDE 'VILLIANS.LIB'
- XC
- X IF(.NOT.FLAG) CALL RSPEAK(341)
- XC !DEFAULT REMARK.
- X IF(THFACT) CALL THIEFD
- XC !THIEF DEMON.
- X IF(PRSWON) CALL FIGHTD
- XC !FIGHT DEMON.
- X IF(SWDACT) CALL SWORDD
- XC !SWORD DEMON.
- X IF(PRSWON) F=CLOCKD(X)
- XC !CLOCK DEMON.
- X IF(PRSWON) F=XVEHIC(2)
- XC !VEHICLE READOUT.
- X RETURN
- X END
- X`0C
- XC XVEHIC- EXECUTE VEHICLE FUNCTION
- XC
- XC DECLARATIONS
- XC
- X LOGICAL FUNCTION XVEHIC(N)
- X IMPLICIT INTEGER(A-Z)
- X LOGICAL OAPPLI
- X
- X INCLUDE 'GAMESTATE.LIB'
- X INCLUDE 'OBJECTS.LIB'
- X INCLUDE 'ADVERS.LIB'
- XC
- X XVEHIC=.FALSE.
- XC !ASSUME LOSES.
- X AV=AVEHIC(WINNER)
- XC !GET VEHICLE.
- X IF(AV.NE.0) XVEHIC=OAPPLI(OACTIO(AV),N)
- X RETURN
- X END
- $ CALL UNPACK [.SRC]DGAME.FOR;1 1347247650
- $ create 'f'
- XC INIT-- DUNGEON INITIALIZATION SUBROUTINE
- XC
- XC COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
- XC ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
- XC WRITTEN BY R. M. SUPNIK
- XC
- XC DECLARATIONS
- XC
- X LOGICAL FUNCTION INIT(X)
- X IMPLICIT INTEGER (A-Z)
- X LOGICAL PROTCT
- X LOGICAL WIZMODE
- X INTEGER DATARR(3)
- X
- X INCLUDE 'FILES.LIB/LIST'
- X INCLUDE 'PARSER.LIB/LIST'
- X INCLUDE 'GAMESTATE.LIB/LIST'
- X INCLUDE 'STATE.LIB/LIST'
- X INCLUDE 'SCREEN.LIB/LIST'
- X INCLUDE 'MINDEX.LIB/LIST'
- Xc
- XC MISCELLANEOUS VARIABLES
- XC
- X COMMON /STAR/ MBASE,STRBIT
- X COMMON /VERS/ VMAJ,VMIN,VEDIT
- X COMMON /TIME/ PLTIME,SHOUR,SMIN,SSEC
- X INCLUDE 'IO.LIB/LIST'
- X INCLUDE 'DEBUG.LIB/LIST'
- X COMMON /HYPER/ HFACTR
- X INCLUDE 'ROOMS.LIB/LIST'
- X INCLUDE 'RFLAG.LIB/LIST'
- X INCLUDE 'RINDEX.LIB/LIST'
- X INCLUDE 'EXITS.LIB/LIST'
- X INCLUDE 'CURXT.LIB/LIST'
- X INCLUDE 'XPARS.LIB/LIST'
- X INCLUDE 'OBJECTS.LIB/LIST'
- X INCLUDE 'OINDEX.LIB/LIST'
- X INCLUDE 'CLOCK.LIB/LIST'
- X INCLUDE 'VILLIANS.LIB/LIST'
- X INCLUDE 'ADVERS.LIB/LIST'
- X INCLUDE 'FLAGS.LIB/LIST'
- X`0C
- XC INIT, PAGE 2
- XC
- XC
- XC FIRST CHECK FOR PROTECTION VIOLATION
- XC
- X IF(PROTCT(X)) GO TO 10000
- XC !PROTECTION VIOLATION?
- X PRINT 10100
- X10100 FORMAT(' There appears before you a threatening figure clad '
- X &'all over'/' in heavy black armor. His legs seem like the '
- X &'massive trunk'/' of the oak tree. His broad shoulders and '
- X &'helmeted head loom'/' high over your own puny frame, and '
- X &'you realize that his powerful'/' arms could easily crush the '
- X &'very life from your body. There'/' hangs from his belt a '
- X &'veritable arsenal of deadly weapons:'/' sword, mace, ball '
- X &'and chain, dagger, lance, and trident.'/' He speaks with a '
- X &'commanding voice:'//20X,'"You shall not pass."'//' As '
- X &'he grabs you by the neck all grows dim about you.')
- X CALL EXIT
- XC
- XC NOW START INITIALIZATION PROPER
- XC
- X10000 INIT=.FALSE.
- XC !ASSUME INIT FAILS.
- X MMAX=1050
- XC !SET UP ARRAY LIMITS.
- X OMAX=220
- X RMAX=200
- X VMAX=4
- X AMAX=4
- X CMAX=25
- X FMAX=46
- X SMAX=22
- X XMAX=900
- X R2MAX=20
- X DIRMAX=15
- XC
- X MLNT=0
- XC !INIT ARRAY COUNTERS.
- X OLNT=0
- X RLNT=0
- X VLNT=0
- X ALNT=0
- X CLNT=0
- X XLNT=1
- X R2LNT=0
- XC
- X LTSHFT=10
- XC !SET UP STATE VARIABLES.
- X MXSCOR=LTSHFT
- X EGSCOR=0
- X EGMXSC=0
- X MXLOAD=100
- X RWSCOR=0
- X DEATHS=0
- X MOVES=0
- X PLTIME=0
- X MUNGRM=0
- X HS=0
- X PRSA=0
- XC !CLEAR PARSE VECTOR.
- X PRSI=0
- X PRSO=0
- X PRSCON=1
- X OFLAG=0
- XC !CLEAR ORPHANS.
- X OACT=0
- X OSLOT=0
- X OPREP=0
- X ONAME=0
- X THFFLG=.FALSE.
- XC !THIEF NOT INTRODUCED BUT
- X THFACT=.TRUE.
- XC !IS ACTIVE.
- X SWDACT=.FALSE.
- XC !SWORD IS INACTIVE.
- X SWDSTA=0
- XC !SWORD IS OFF.
- XC
- X RECNO=1
- XC !INIT DB FILE POINTER.
- X MBASE=0
- XC !INIT MELEE BASE.
- XC LOGICAL UNIT NRS: 5=STDIN, 6=STDOUT
- X INPCH=5
- XC !TTY INPUT
- X OUTCH=6
- X DBCH=2
- X`0C
- XC !DATA BASE.
- XC INIT, PAGE 3
- XC
- XC INIT ALL ARRAYS.
- XC
- X DO 5 I=1,CMAX
- XC !CLEAR CLOCK EVENTS
- X CFLAG(I)=.FALSE.
- X CTICK(I)=0
- X CACTIO(I)=0
- X5 CONTINUE
- XC
- X DO 10 I=1,FMAX
- XC !CLEAR FLAGS.
- X FLAGS(I)=.FALSE.
- X10 CONTINUE
- X BUOYF=.TRUE.
- XC !SOME START AS TRUE.
- X EGYPTF=.TRUE.
- X CAGETF=.TRUE.
- X MR1F=.TRUE.
- X MR2F=.TRUE.
- X FOLLWF=.TRUE.
- X DO 12 I=1,SMAX
- XC !CLEAR SWITCHES.
- X SWITCH(I)=0
- X12 CONTINUE
- X ORMTCH=4
- XC !NUMBER OF MATCHES.
- X LCELL=1
- X PNUMB=1
- X MDIR=270
- X MLOC=MRB
- X CPHERE=10
- XC
- X DO 15 I=1,R2MAX
- XC !CLEAR ROOM 2 ARRAY.
- X RROOM2(I)=0
- X OROOM2(I)=0
- X15 CONTINUE
- XC
- X DO 20 I=1,XMAX
- XC !CLEAR TRAVEL ARRAY.
- X TRAVEL(I)=0
- X20 CONTINUE
- XC
- X DO 30 I=1,VMAX
- XC !CLEAR VILLAINS ARRAYS.
- X VOPPS(I)=0
- X VPROB(I)=0
- X VILLNS(I)=0
- X VBEST(I)=0
- X VMELEE(I)=0
- X30 CONTINUE
- XC
- X DO 40 I=1,OMAX
- XC !CLEAR OBJECT ARRAYS.
- X ODESC1(I)=0
- X ODESC2(I)=0
- X ODESCO(I)=0
- X OREAD(I)=0
- X OACTIO(I)=0
- X OFLAG1(I)=0
- X OFLAG2(I)=0
- X OFVAL(I)=0
- X OTVAL(I)=0
- X OSIZE(I)=0
- X OCAPAC(I)=0
- X OCAN(I)=0
- X OADV(I)=0
- X OROOM(I)=0
- X40 CONTINUE
- XC
- X RDESC2=0
- XC !CLEAR DESC BASE PTR.
- X DO 50 I=1,RMAX
- XC !CLEAR ROOM ARRAYS.
- X RDESC1(I)=0
- X RACTIO(I)=0
- X RFLAG(I)=0
- X RVAL(I)=0
- X REXIT(I)=0
- X50 CONTINUE
- XC
- X DO 60 I=1,MMAX
- XC !CLEAR MESSAGE DIRECTORY.
- X RTEXT(I)=0
- X60 CONTINUE
- XC
- X DO 70 I=1,AMAX
- XC !CLEAR ADVENTURER'S ARRAYS.
- X AROOM(I)=0
- X ASCORE(I)=0
- X AVEHIC(I)=0
- X AOBJ(I)=0
- X AACTIO(I)=0
- X ASTREN(I)=0
- X AFLAG(I)=0
- X70 CONTINUE
- XC
- X DBGFLG=0
- X PRSFLG=0
- X GDTFLG=0
- XC
- XC allow setting gdtflg true if wizard function returns true
- XC this way, the wizard doesn't have to recompile to use gdt
- XC
- X WIZMODE = WIZARD()
- X IF (WIZMODE) GDTFLG = 1
- XC
- X FROMDR=0
- XC !INIT SCOL GOODIES.
- X SCOLRM=0
- X SCOLAC=0
- X`0C
- XC INIT, PAGE 4
- XC
- XC NOW RESTORE FROM EXISTING INDEX FILE.
- XC
- X call image_dir (filedir)
- X OPEN(UNIT=1,file=filedir//INDXFILE,status='OLD',
- X & FORM='FORMATTED',ACCESS='SEQUENTIAL',ERR=1900)
- X READ(1,130) I,J,K
- XC !GET VERSION.
- X IF((I.NE.VMAJ).OR.(J.NE.VMIN))
- X & GO TO 1925
- X
- X OPEN(UNIT=DBCH,file=filedir//TEXTFILE,status='OLD',
- X & FORM='UNFORMATTED',ACCESS='DIRECT',
- X & ERR=1950)
- X
- X IF (WIZMODE) PRINT 150`20
- X150 FORMAT(' RESTORING FROM "dindx.dat"')
- X READ(1,130) MXSCOR,STRBIT,EGMXSC
- X READ(1,130) RLNT,RDESC2,RDESC1,REXIT,RACTIO,RVAL,RFLAG
- X READ(1,130) XLNT,TRAVEL
- X READ(1,130) OLNT,ODESC1,ODESC2,ODESCO,OACTIO,OFLAG1,OFLAG2,
- X & OFVAL,OTVAL,OSIZE,OCAPAC,OROOM,OADV,OCAN,
- X & OREAD
- X READ(1,130) R2LNT,OROOM2,RROOM2
- X READ(1,130) CLNT,CTICK,CACTIO
- X READ(1,135) CFLAG
- X READ(1,130) VLNT,VILLNS,VPROB,VOPPS,VBEST,VMELEE
- X READ(1,130) ALNT,AROOM,ASCORE,AVEHIC,AOBJ,AACTIO,ASTREN,AFLAG
- X READ(1,130) MBASE,MLNT,RTEXT
- XC
- X CLOSE(1)
- X GO TO 1025
- XC !INIT DONE.
- XC
- XC 130 FORMAT(I8)
- X130 FORMAT(I6)
- X135 FORMAT(L4)
- XC INIT, PAGE 5
- XC
- XC THE INTERNAL DATA BASE IS NOW ESTABLISHED.
- XC SET UP TO PLAY THE GAME.
- XC
- X1025 CALL ITIME(SHOUR,SMIN,SSEC)
- XC !GET TIME AND DATE.
- X CALL IDATE(I,J,K)
- X CALL INIRND(or(I,or(J,K)),or(SHOUR,or(SMIN,SSEC)))
- XC
- X WINNER=PLAYER
- X LASTIT=AOBJ(PLAYER)
- X HERE=AROOM(WINNER)
- X THFPOS=OROOM(THIEF)
- X BLOC=OROOM(BALLO)
- X INIT=.TRUE.
- XC
- X IF (WIZMODE) PRINT 1050,RLNT,RMAX,XLNT,XMAX,OLNT,OMAX,MLNT,MMAX,
- X & VLNT,VMAX,ALNT,AMAX,CLNT,CMAX,R2LNT,R2MAX
- X1050 FORMAT(' USED:'/1X,I5,' OF',I5,' ROOMS'/
- X & 1X,I5,' OF',I5,' EXITS'/
- X & 1X,I5,' OF',I5,' OBJECTS'/
- X & 1X,I5,' OF',I5,' MESSAGES'/
- X & 1X,I5,' OF',I5,' VILLAINS'/
- X & 1X,I5,' OF',I5,' ADVENTURERS'/
- X & 1X,I5,' OF',I5,' CLOCK EVENTS'/
- X & 1X,I5,' OF',I5,' ROOM2 SLOTS')
- X IF (WIZMODE) PRINT 1150,MXSCOR,EGMXSC,RECNO,RDESC2,MBASE,STRBIT
- X1150 FORMAT(' MAX SCORE=',I5/' EG SCORE=',I5/
- X & ' MAX RECNO=',I5/' RDESC2 BASE=',I5/
- X & ' MELEE START=',I5/' STAR MASK=',I7)
- X** IF (WIZMODE) PAUSE 1
- XC
- X RETURN
- XC INIT, PAGE 6
- XC
- XC ERRORS-- INIT FAILS.
- XC
- X1900 PRINT 910
- X PRINT 980
- X RETURN
- X1925 PRINT 920,I,J,K,VMAJ,VMIN,VEDIT
- X PRINT 980
- X RETURN
- X1950 PRINT 960
- X PRINT 980
- X RETURN
- X910 FORMAT(' I can''t open INDXFILE.')
- X920 FORMAT(' "dindx.dat" is version ',I1,'.',I1,A1,'.'/
- X & ' I require version ',I1,'.',I1,A1,'.')
- X960 FORMAT(' I can''t open TEXTFILE.')
- X980 FORMAT(' Suddenly a sinister, wraithlike figure appears before '
- X &'you,'/' seeming to float in the air. In a low, sorrowful voice'
- X &' he says,'/' "Alas, the very nature of the world has changed, '
- X &'and the dungeon'/' cannot be found. All must now pass away."'
- X &' Raising his oaken staff'/' in farewell, he fades into the '
- X &'spreading darkness. In his place'/' appears a tastefully '
- X &'lettered sign reading:'//23X,'INITIALIZATION FAILURE'//
- X &' The darkness becomes all encompassing, and your vision fails.')
- XC
- X END
- XC PROTCT-- CHECK FOR USER VIOLATION
- XC
- XC THIS ROUTINE SHOULD BE MODIFIED IF YOU WISH TO ADD SYSTEM
- XC DEPENDANT PROTECTION AGAINST ABUSE.
- XC
- XC AT THE MOMENT, PLAY IS PERMITTED UNDER ALL CIRCUMSTANCES.
- XC
- X LOGICAL FUNCTION PROTCT(X)
- X IMPLICIT INTEGER(A-Z)
- XC
- X PROTCT=.TRUE.
- X RETURN
- X END
- $ CALL UNPACK [.SRC]DINIT.FOR;4 392504658
- $ create 'f'
- XC DUNGEON-- MAIN PROGRAM
- XC
- XC COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
- XC ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
- XC WRITTEN BY R. M. SUPNIK
- XC
- X PROGRAM DUNGEON
- XC
- XC DECLARATIONS
- XC
- X IMPLICIT INTEGER (A-Z)
- X LOGICAL INIT
- X
- X INCLUDE 'PARSER.LIB/LIST'
- X INCLUDE 'GAMESTATE.LIB/LIST'
- X INCLUDE 'STATE.LIB/LIST'
- X INCLUDE 'SCREEN.LIB/LIST'
- X INCLUDE 'PUZZLE.LIB/LIST'
- XC
- XC MISCELLANEOUS VARIABLES
- XC
- X CHARACTER VEDIT
- X COMMON /STAR/ MBASE,STRBIT
- X COMMON /VERS/ VMAJ,VMIN,VEDIT
- X COMMON /BATS/ BATDRP(9)
- X INCLUDE 'IO.LIB/LIST'
- X INCLUDE 'DEBUG.LIB/LIST'
- X COMMON /HYPER/ HFACTR
- X INCLUDE 'ROOMS.LIB/LIST'
- X INCLUDE 'RFLAG.LIB/LIST'
- X INCLUDE 'RINDEX.LIB/LIST'
- X INCLUDE 'EXITS.LIB/LIST'
- X INCLUDE 'CURXT.LIB/LIST'
- X INCLUDE 'XPARS.LIB/LIST'
- X INCLUDE 'XSRCH.LIB/LIST'
- X INCLUDE 'OBJECTS.LIB/LIST'
- X INCLUDE 'OFLAGS.LIB/LIST'
- X INCLUDE 'OINDEX.LIB/LIST'
- X INCLUDE 'CLOCK.LIB/LIST'
- X
- X INCLUDE 'VILLIANS.LIB/LIST'
- X INCLUDE 'ADVERS.LIB/LIST'
- X INCLUDE 'VERBS.LIB/LIST'
- X INCLUDE 'FLAGS.LIB/LIST'
- X
- X INCLUDE 'FILES.LIB/LIST'
- X INCLUDE 'MINDEX.LIB/LIST'
- X INCLUDE 'RANDOM.LIB/LIST'
- X INCLUDE 'VOCAB.LIB/LIST'
- X INCLUDE 'WIZARD.LIB/LIST'
- X`0C
- XC DUNGEON, PAGE 2
- XC
- XC DATA STATEMENTS FOR CONSTANT ARRAYS
- XC
- X DATA VMAJ/2/,VMIN/6/,VEDIT/'C'/
- XC
- X DATA SDIR/'40000'O/,SIND/'20000'O/,SSTD/'10000'O/,
- X & SFLIP/'4000'O/,SDRIV/'2000'O/,SVMASK/'777'O/
- X DATA VABIT/'40000'O/,VRBIT/'20000'O/,VTBIT/'10000'O/,
- X & VCBIT/'4000'O/,VEBIT/'2000'O/,VFBIT/'1000'O/,
- X & VPMASK/'777'O/
- XC
- X DATA BATDRP/66,67,68,69,70,71,72,65,73/
- XC
- X DATA SCOLDR/'2000'O,153,'12000'O,154,'6000'O,152,'16000'O,151/
- X DATA SCOLWL/151,207,'6000'O,152,208,'16000'O,
- X & 153,206,'12000'O,154,205,'2000'O/
- XC
- X DATA HFACTR/500/
- XC
- X DATA CPDR/'2000'O,-8,'4000'O,-7,'6000'O,1,'10000'O,9,
- X & '12000'O,8,'14000'O,7,'16000'O,-1,'20000'O,-9/
- X DATA CPWL/205,-8,206,8,207,1,208,-1/
- X DATA CPVEC/ 1, 1, 1, 1, 1, 1, 1, 1,
- X & 1, 0,-1, 0, 0,-1, 0, 1,
- X & 1,-1, 0, 1, 0,-2, 0, 1,
- X & 1, 0, 0, 0, 0, 1, 0, 1,
- X & 1,-3, 0, 0,-1,-1, 0, 1,
- X & 1, 0, 0,-1, 0, 0, 0, 1,
- X & 1, 1, 1, 0, 0, 0, 1, 1,
- X & 1, 1, 1, 1, 1, 1, 1, 1/
- XC
- X DATA CEVCUR/1/,CEVMNT/2/,CEVLNT/3/,CEVMAT/4/,
- X & CEVCND/5/,CEVBAL/6/,CEVBRN/7/,CEVFUS/8/,
- X & CEVLED/9/,CEVSAF/10/,CEVVLG/11/,CEVGNO/12/,
- X & CEVBUC/13/,CEVSPH/14/,CEVEGH/15/,
- X & CEVFOR/16/,CEVSCL/17/,CEVZGI/18/,CEVZGO/19/,
- X & CEVSTE/20/,CEVMRS/21/,CEVPIN/22/,CEVINQ/23/,
- X & CEVFOL/24/
- XC
- X DATA XRMASK/'377'O/,XDMASK/'76000'O/,XFMASK/3/
- X DATA XFSHFT/256/,XASHFT/256/
- X DATA XNORM/1/,XNO/2/,XCOND/3/,XDOOR/4/
- X DATA XELNT/1,2,3,3/,XLFLAG/'100000'O/
- X DATA XMIN/'2000'O/,XMAX/'40000'O/,XUP/'22000'O/,XDOWN/'24000'O/
- X DATA XNORTH/'2000'O/,XSOUTH/'12000'O/,XENTER/'32000'O/,
- X & XEXIT/'34000'O/
- X DATA XEAST/'6000'O/,XWEST/'16000'O/
- XC
- X DATA PLAYER/1/,AROBOT/2/,AMASTR/3/
- X DATA ASTAG/'100000'O/
- XC
- X DATA RSEEN/'100000'O/,RLIGHT/'40000'O/,RLAND/'20000'O/
- X DATA RWATER/'10000'O/,RAIR/'4000'O/,RSACRD/'2000'O/,
- X & RFILL/'1000'O/
- X DATA RMUNG/'400'O/,RBUCK/'200'O/,RHOUSE/'100'O/,
- X & RNWALL/'40'O/,REND/'20'O/
- XC
- X DATA WHOUS/2/,LROOM/8/,CELLA/9/
- X DATA MTROL/10/,MAZE1/11/
- X DATA MGRAT/25/,MAZ15/30/
- X DATA FORE1/31/,FORE3/33/,CLEAR/36/,RESER/40/
- X DATA STREA/42/,EGYPT/44/,ECHOR/49/
- X DATA TSHAF/61/
- X DATA BSHAF/76/,MMACH/77/,DOME/79/,MTORC/80/
- X DATA CAROU/83/
- X DATA RIDDL/91/,LLD2/94/,TEMP1/96/,TEMP2/97/,MAINT/100/
- X DATA MCYCL/101/,BLROO/102/,TREAS/103/,RIVR1/107/,RIVR2/108/
- X DATA RIVR3/109/
- X DATA RIVR4/112/,RIVR5/113/,FCHMP/114/,MBARR/119/,FALLS/120/
- X DATA MRAIN/121/,POG/122/,VLBOT/126/,VAIR1/127/,VAIR2/128/
- X DATA VAIR3/129/,VAIR4/130/
- X DATA LEDG2/131/,LEDG3/132/,LEDG4/133/,MSAFE/135/,CAGER/140/
- X DATA CAGED/141/,TWELL/142/,BWELL/143/,ALICE/144/,ALISM/145/
- X DATA ALITR/146/,MTREE/147/,BKENT/148/
- X DATA BKVW/151/,BKTWI/153/,BKVAU/154/,BKBOX/155/
- X DATA CRYPT/157/,TSTRS/158/,MRANT/159/
- X DATA MREYE/160/,MRA/161/,MRB/162/,MRC/163/,MRG/164/
- X DATA MRD/165/,FDOOR/166/,MRAE/167/
- X DATA MRCE/171/,MRCW/172/,MRGE/173/,MRGW/174/,MRDW/176/
- X DATA INMIR/177/,SCORR/179/
- X DATA NCORR/182/,PARAP/183/,CELL/184/,PCELL/185/,NCELL/186/
- X DATA CPANT/188/,CPOUT/189/
- X DATA CPUZZ/190/
- XC
- X DATA CINTW/1/,DEADXW/2/,FRSTQW/3/,INXW/4/
- X DATA OUTXW/5/,WALKIW/6/,FIGHTW/7/,FOOW/8/
- XC
- X DATA READW/100/,MELTW/101/
- X DATA INFLAW/102/,DEFLAW/103/,ALARMW/104/,EXORCW/105/
- X DATA PLUGW/106/,KICKW/107/,WAVEW/108/,RAISEW/109/,LOWERW/110/
- X DATA RUBW/111/,PUSHW/112/,UNTIEW/113/,TIEW/114/,TIEUPW/115/
- X DATA TURNW/116/,BREATW/117/,KNOCKW/118/,LOOKW/119/
- X DATA EXAMIW/120/,SHAKEW/121/,MOVEW/122/,TRNONW/123/,TRNOFW/124/
- X DATA OPENW/125/,CLOSEW/126/,FINDW/127/,WAITW/128/,SPINW/129/
- X DATA BOARDW/130/,UNBOAW/131/,TAKEW/132/,INVENW/133/
- X DATA FILLW/134/,EATW/135/,DRINKW/136/,BURNW/137/
- X DATA MUNGW/138/,KILLW/139/,ATTACW/141/
- X DATA SWINGW/140/,WALKW/142/,TELLW/143/,PUTW/144/
- X DATA DROPW/145/,GIVEW/146/,POURW/147/,THROWW/148/
- XC
- X DATA DIGW/89/,LEAPW/91/,STAYW/73/,FOLLOW/85/
- X DATA HELLOW/151/,LOOKIW/152/,LOOKUW/153/,PUMPW/154/
- X DATA WINDW/155/,CLMBW/156/,CLMBUW/157/,CLMBDW/158/,TRNTOW/159/
- XC
- X DATA VISIBT/'100000'O/,READBT/'40000'O/,TAKEBT/'20000'O/,
- X & DOORBT/'10000'O/,TRANBT/'4000'O/,FOODBT/'2000'O/,
- X & NDSCBT/'1000'O/,DRNKBT/'400'O/, CONTBT/'200'O/,
- X & LITEBT/'100'O/,VICTBT/'40'O/,BURNBT/'20'O/,
- X & FLAMBT/'10'O/,TOOLBT/'4'O/,TURNBT/'2'O/,ONBT/'1'O/
- XC
- X DATA FINDBT/'100000'O/,SLEPBT/'40000'O/,SCRDBT/'20000'O/,
- X & TIEBT/'10000'O/, CLMBBT/'4000'O/,ACTRBT/'2000'O/,
- X & WEAPBT/'1000'O/,FITEBT/'400'O/, VILLBT/'200'O/,
- X & STAGBT/'100'O/,TRYBT/'40'O/,NOCHBT/'20'O/,
- X & OPENBT/'10'O/,TCHBT/'4'O/,VEHBT/'2'O/,SCHBT/'1'O/
- XC
- X DATA GARLI/2/,FOOD/3/,GUNK/4/,COAL/5/,MACHI/7/,DIAMO/8/
- X DATA TCASE/9/,BOTTL/10/
- X DATA WATER/11/,ROPE/12/,KNIFE/13/,SWORD/14/,LAMP/15/,BLAMP/16/
- X DATA RUG/17/,LEAVE/18/,TROLL/19/,AXE/20/
- X DATA RKNIF/21/,KEYS/23/,BAR/26/,ICE/30/
- X DATA COFFI/33/,TORCH/34/,TBASK/35/,FBASK/36/,IRBOX/39/
- X DATA GHOST/42/,TRUNK/45/,BELL/46/,BOOK/47/,CANDL/48/
- X DATA MATCH/51/,TUBE/54/,PUTTY/55/,WRENC/56/,SCREW/57/
- X DATA CYCLO/58/,CHALI/59/
- X DATA THIEF/61/,STILL/62/,WINDO/63/,GRATE/65/,DOOR/66/
- X DATA HPOLE/71/,RBUTT/79/,LEAK/78/,RAILI/75/
- X DATA POT/85/,STATU/86/,IBOAT/87/,DBOAT/88/,PUMP/89/,RBOAT/90/
- X DATA STICK/92/,BUOY/94/,SHOVE/96/,GUANO/97/,BALLO/98/,RECEP/99/
- X DATA BROPE/101/,HOOK1/102/,HOOK2/103/,SAFE/105/,SSLOT/107/
- X DATA BRICK/109/,FUSE/110/
- X DATA GNOME/111/,BLABE/112/,DBALL/113/,TOMB/119/
- X DATA LCASE/123/,CAGE/124/,RCAGE/125/,SPHER/126/,SQBUT/127/
- X DATA FLASK/132/,POOL/133/,SAFFR/134/,BUCKE/137/,ORICE/139/
- X DATA ECAKE/138/,RDICE/140/
- X DATA BLICE/141/,ROBOT/142/,FTREE/145/,BILLS/148/,PORTR/149/
- X DATA SCOL/151/,ZGNOM/152/,EGG/154/,BEGG/155/,BAUBL/156/
- X DATA CANAR/157/,BCANA/158/,YLWAL/159/
- X DATA RDWAL/161/,PINDR/164/
- X DATA RBEAM/171/,ODOOR/172/,QDOOR/173/,CDOOR/175/
- X DATA NUM1/178/
- X DATA NUM8/185/,WARNI/186/,CSLIT/187/,GCARD/188/,STLDR/189/
- X DATA ITOBJ/192/,OPLAY/193/,EVERY/194/
- X DATA VALUA/195/,SAILO/196/,TEETH/197/,WALL/198/
- X DATA HANDS/200/,LUNGS/201/,AVIAT/202/
- X DATA WNORT/205/,GWATE/209/,MASTER/215/
- X`0C
- XC DUNGEON, PAGE 3
- XC
- XC 1) INITIALIZE DATA STRUCTURES
- XC 2) PLAY GAME
- XC
- X IF(INIT(X)) CALL GAME
- XC !IF INIT, PLAY GAME.
- X CALL EXIT
- XC !DONE
- X END
- $ CALL UNPACK [.SRC]DMAIN.FOR;1 1753057966
- $ create 'f'
- XC PRINCR- PRINT CONTENTS OF ROOM
- XC
- XC COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
- XC ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
- XC WRITTEN BY R. M. SUPNIK
- XC
- XC DECLARATIONS
- XC
- X SUBROUTINE PRINCR(FULL,RM)
- X IMPLICIT INTEGER (A-Z)
- X LOGICAL QEMPTY,QHERE,FULL
- X
- X INCLUDE 'GAMESTATE.LIB/LIST'
- X INCLUDE 'ROOMS.LIB/LIST'
- X INCLUDE 'RFLAG.LIB/LIST'
- XC
- X INCLUDE 'OBJECTS.LIB/LIST'
- X INCLUDE 'OFLAGS.LIB/LIST'
- X INCLUDE 'OINDEX.LIB/LIST'
- X INCLUDE 'ADVERS.LIB/LIST'
- X INCLUDE 'FLAGS.LIB/LIST'
- X`0C
- XC PRINCR, PAGE 2
- XC
- X J=329
- XC !ASSUME SUPERBRIEF FORMAT.
- X DO 500 I=1,OLNT
- XC !LOOP ON OBJECTS
- X IF(.NOT.QHERE(I,RM).OR.(and(OFLAG1(I),(VISIBT+NDSCBT)).NE.
- X & VISIBT).OR.(I.EQ.AVEHIC(WINNER))) GO TO 500
- X IF(.NOT.FULL.AND.(SUPERF.OR.(BRIEFF.AND.
- X & (and(RFLAG(HERE),RSEEN).NE.0)))) GO TO 200
- XC
- XC DO LONG DESCRIPTION OF OBJECT.
- XC
- X K=ODESCO(I)
- XC !GET UNTOUCHED.
- X IF((K.EQ.0).OR.(and(OFLAG2(I),TCHBT).NE.0)) K=ODESC1(I)
- X CALL RSPEAK(K)
- XC !DESCRIBE.
- X GO TO 500
- XC DO SHORT DESCRIPTION OF OBJECT.
- XC
- X200 CALL RSPSUB(J,ODESC2(I))
- XC !YOU CAN SEE IT.
- X J=502
- XC
- X500 CONTINUE
- XC
- XC NOW LOOP TO PRINT CONTENTS OF OBJECTS IN ROOM.
- XC
- X DO 1000 I=1,OLNT
- XC !LOOP ON OBJECTS.
- X IF(.NOT.QHERE(I,RM).OR.(and(OFLAG1(I),(VISIBT+NDSCBT)).NE.
- X & VISIBT)) GO TO 1000
- X IF(and(OFLAG2(I),ACTRBT).NE.0) CALL INVENT(OACTOR(I))
- X IF(((and(OFLAG1(I),TRANBT).EQ.0)
- X & .AND.(and(OFLAG2(I),OPENBT).EQ.0))
- X & .OR.QEMPTY(I)) GO TO 1000
- XC
- XC OBJECT IS NOT EMPTY AND IS OPEN OR TRANSPARENT.
- XC
- X J=573
- X IF(I.NE.TCASE) GO TO 600
- XC !TROPHY CASE?
- X J=574
- X IF((BRIEFF.OR.SUPERF).AND. .NOT.FULL) GO TO 1000
- X600 CALL PRINCO(I,J)
- XC !PRINT CONTENTS.
- XC
- X1000 CONTINUE
- X RETURN
- XC
- X END
- X`0C
- XC INVENT- PRINT CONTENTS OF ADVENTURER
- XC
- XC DECLARATIONS
- XC
- X SUBROUTINE INVENT(ADV)
- X IMPLICIT INTEGER (A-Z)
- X LOGICAL QEMPTY
- X
- X INCLUDE 'GAMESTATE.LIB/LIST'
- X INCLUDE 'OBJECTS.LIB/LIST'
- X INCLUDE 'OFLAGS.LIB/LIST'
- XC
- X INCLUDE 'ADVERS.LIB/LIST'
- X`0C
- XC INVENT, PAGE 2
- XC
- X I=575
- XC !FIRST LINE.
- X IF(ADV.NE.PLAYER) I=576
- XC !IF NOT ME.
- X DO 10 J=1,OLNT
- XC !LOOP
- X IF((OADV(J).NE.ADV).OR.(and(OFLAG1(J),VISIBT).EQ.0))
- X & GO TO 10
- X CALL RSPSUB(I,ODESC2(AOBJ(ADV)))
- X I=0
- X CALL RSPSUB(502,ODESC2(J))
- X10 CONTINUE
- XC
- X IF(I.EQ.0) GO TO 25
- XC !ANY OBJECTS?
- X IF(ADV.EQ.PLAYER) CALL RSPEAK(578)
- XC !NO, TELL HIM.
- X RETURN
- XC
- X25 DO 100 J=1,OLNT
- XC !LOOP.
- X IF((OADV(J).NE.ADV).OR.(and(OFLAG1(J),VISIBT).EQ.0).OR.
- X & ((and(OFLAG1(J),TRANBT).EQ.0).AND.
- X & (and(OFLAG2(J),OPENBT).EQ.0))) GO TO 100
- X IF(.NOT.QEMPTY(J)) CALL PRINCO(J,573)
- XC !IF NOT EMPTY, LIST.
- X100 CONTINUE
- X RETURN
- XC
- X END
- X`0C
- XC PRINCO- PRINT CONTENTS OF OBJECT
- XC
- XC DECLARATIONS
- XC
- X SUBROUTINE PRINCO(OBJ,DESC)
- X IMPLICIT INTEGER(A-Z)
- X INCLUDE 'OBJECTS.LIB/LIST'
- XC
- X CALL RSPSUB(DESC,ODESC2(OBJ))
- XC !PRINT HEADER.
- X DO 100 I=1,OLNT
- XC !LOOP THRU.
- X IF(OCAN(I).EQ.OBJ) CALL RSPSUB(502,ODESC2(I))
- X100 CONTINUE
- X RETURN
- XC
- X END
- $ CALL UNPACK [.SRC]DSO1.FOR;1 1296852279
- $ create 'f'
- XC MOVETO- MOVE PLAYER TO NEW ROOM
- XC
- XC COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
- XC ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
- XC WRITTEN BY R. M. SUPNIK
- XC
- XC DECLARATIONS
- XC
- X LOGICAL FUNCTION MOVETO(NR,WHO)
- X IMPLICIT INTEGER (A-Z)
- X LOGICAL NLV,LHR,LNR
- X
- X INCLUDE 'GAMESTATE.LIB'
- X INCLUDE 'ROOMS.LIB'
- X INCLUDE 'RFLAG.LIB'
- X INCLUDE 'OBJECTS.LIB'
- X INCLUDE 'OINDEX.LIB'
- X INCLUDE 'ADVERS.LIB'
- X`0C
- XC MOVETO, PAGE 2
- XC
- X MOVETO=.FALSE.
- XC !ASSUME FAILS.
- X LHR=and(RFLAG(HERE),RLAND).NE.0
- X LNR=and(RFLAG(NR),RLAND).NE.0
- X J=AVEHIC(WHO)
- XC !HIS VEHICLE
- XC
- X IF(J.NE.0) GO TO 100
- XC !IN VEHICLE?
- X IF(LNR) GO TO 500
- XC !NO, GOING TO LAND?
- X CALL RSPEAK(427)
- XC !CAN'T GO WITHOUT VEHICLE.
- X RETURN
- XC
- X100 BITS=0
- XC !ASSUME NOWHERE.
- X IF(J.EQ.RBOAT) BITS=RWATER
- XC !IN BOAT?
- X IF(J.EQ.BALLO) BITS=RAIR
- XC !IN BALLOON?
- X IF(J.EQ.BUCKE) BITS=RBUCK
- XC !IN BUCKET?
- X NLV=and(RFLAG(NR),BITS).EQ.0
- X IF((.NOT.LNR .AND.NLV) .OR.
- X & (LNR.AND.LHR.AND.NLV.AND.(BITS.NE.RLAND)))
- X &GO TO 800
- XC
- X500 MOVETO=.TRUE.
- XC !MOVE SHOULD SUCCEED.
- X IF(and(RFLAG(NR),RMUNG).EQ.0) GO TO 600
- X CALL RSPEAK(RRAND(NR))
- XC !YES, TELL HOW.
- X RETURN
- XC
- X600 IF(WHO.NE.PLAYER) CALL NEWSTA(AOBJ(WHO),0,NR,0,0)
- X IF(J.NE.0) CALL NEWSTA(J,0,NR,0,0)
- X HERE=NR
- X AROOM(WHO)=HERE
- X CALL SCRUPD(RVAL(NR))
- XC !SCORE ROOM
- X RVAL(NR)=0
- X RETURN
- XC
- X800 CALL RSPSUB(428,ODESC2(J))
- XC !WRONG VEHICLE.
- X RETURN
- X END
- X`0C
- XC SCORE-- PRINT OUT CURRENT SCORE
- XC
- XC DECLARATIONS
- XC
- X SUBROUTINE SCORE(FLG)
- X IMPLICIT INTEGER (A-Z)
- X LOGICAL FLG
- X INTEGER RANK(10),ERANK(5)
- X include 'gamestate.LIB'
- X include 'state.LIB'
- XC
- X COMMON /CHAN/ INPCH,OUTCH,DBCH
- X
- X INCLUDE 'ADVERS.LIB'
- X INCLUDE 'FLAGS.LIB'
- XC
- XC FUNCTIONS AND DATA
- XC
- X DATA RANK/20,19,18,16,12,8,4,2,1,0/
- X DATA ERANK/20,15,10,5,0/
- X`0C
- XC SCORE, PAGE 2
- XC
- X AS=ASCORE(WINNER)
- XC
- X IF(ENDGMF) GO TO 60
- XC !ENDGAME?
- X IF(FLG) WRITE(OUTCH,100)
- X IF(.NOT.FLG) WRITE(OUTCH,110)
- X IF(MOVES.NE.1) WRITE(OUTCH,120) AS,MXSCOR,MOVES
- X IF(MOVES.EQ.1) WRITE(OUTCH,130) AS,MXSCOR,MOVES
- XC
- X DO 10 I=1,10
- X IF((AS*20/MXSCOR).GE.RANK(I)) GO TO 50
- X10 CONTINUE
- X50 CALL RSPEAK(484+I)
- X RETURN
- XC
- X60 IF(FLG) WRITE(OUTCH,140)
- X IF(.NOT.FLG) WRITE(OUTCH,150)
- X WRITE(OUTCH,120) EGSCOR,EGMXSC,MOVES
- X DO 70 I=1,5
- X IF((EGSCOR*20/EGMXSC).GE.ERANK(I)) GO TO 80
- X70 CONTINUE
- X80 CALL RSPEAK(786+I)
- X RETURN
- X
- X100 FORMAT(' Your score would be',$)
- X110 FORMAT(' Your score is',$)
- X120 FORMAT('+',I4,' `5Btotal of',I4,' points`5D, in',I5,' moves.')
- X130 FORMAT('+',I4,' `5Btotal of',I4,' points`5D, in',I5,' move.')
- X140 FORMAT(' Your score in the endgame would be',$)
- X150 FORMAT(' Your score in the endgame is',$)
- XC
- X END
- X`0C
- XC SCRUPD- UPDATE WINNER'S SCORE
- XC
- XC DECLARATIONS
- XC
- X SUBROUTINE SCRUPD(N)
- X IMPLICIT INTEGER (A-Z)
- X
- X INCLUDE 'GAMESTATE.LIB'
- X INCLUDE 'STATE.LIB'
- X INCLUDE 'CLOCK.LIB'
- X INCLUDE 'ADVERS.LIB'
- X INCLUDE 'FLAGS.LIB'
- XC
- X IF(ENDGMF) GO TO 100
- XC !ENDGAME?
- X ASCORE(WINNER)=ASCORE(WINNER)+N
- XC !UPDATE SCORE
- X RWSCOR=RWSCOR+N
- XC !UPDATE RAW SCORE
- X IF(ASCORE(WINNER).LT.(MXSCOR-(10*DEATHS))) RETURN
- X CFLAG(CEVEGH)=.TRUE.
- XC !TURN ON END GAME
- X CTICK(CEVEGH)=15
- X RETURN
- XC
- X100 EGSCOR=EGSCOR+N
- XC !UPDATE EG SCORE.
- X RETURN
- X END
- $ CALL UNPACK [.SRC]DSO2.FOR;1 812531101
- $ create 'f'
- XC FINDXT- FIND EXIT FROM ROOM
- XC
- XC COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142
- XC ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED
- XC WRITTEN BY R. M. SUPNIK
- XC
- XC DECLARATIONS
- XC
- X LOGICAL FUNCTION FINDXT(DIR,RM)
- X IMPLICIT INTEGER (A-Z)
- X
- X INCLUDE 'ROOMS.LIB'
- X INCLUDE 'EXITS.LIB'
- X INCLUDE 'CURXT.LIB'
- X INCLUDE 'XPARS.LIB'
- XC
- X FINDXT=.TRUE.
- XC !ASSUME WINS.
- X XI=REXIT(RM)
- XC !FIND FIRST ENTRY.
- X IF(XI.EQ.0) GO TO 1000
- XC !NO EXITS?
- XC
- X100 I=TRAVEL(XI)
- XC !GET ENTRY.
- X XROOM1=and(I,XRMASK)
- XC
- XC mask to 16-bits to get rid of sign extension problems with 32-bit ints
- XC
- X XXXFLG = and(not(XLFLAG), 65535)
- X XTYPE=and((and(I,XXXFLG)/XFSHFT),XFMASK)+1
- X GO TO (110,120,130,130),XTYPE
- XC !BRANCH ON ENTRY.
- X CALL BUG(10,XTYPE)
- XC
- X130 XOBJ=and(TRAVEL(XI+2),XRMASK)
- X XACTIO=TRAVEL(XI+2)/XASHFT
- X120 XSTRNG=TRAVEL(XI+1)
- XC !DOOR/CEXIT/NEXIT - STRING.
- X110 XI=XI+XELNT(XTYPE)
- XC !ADVANCE TO NEXT ENTRY.
- X IF(and(I,XDMASK).EQ.DIR) RETURN
- X IF(and(I,XLFLAG).EQ.0) GO TO 100
- X1000 FINDXT=.FALSE.
- XC !YES, LOSE.
- X RETURN
- X END
- X`0C
- XC FWIM- FIND WHAT I MEAN
- XC
- XC DECLARATIONS
- XC
- X INTEGER FUNCTION FWIM(F1,F2,RM,CON,ADV,NOCARE)
- X IMPLICIT INTEGER (A-Z)
- X LOGICAL NOCARE
- X
- X INCLUDE 'OBJECTS.LIB'
- X INCLUDE 'OFLAGS.LIB'
- XC
- X FWIM=0
- XC !ASSUME NOTHING.
- X DO 1000 I=1,OLNT
- XC !LOOP
- X IF(((RM.EQ.0).OR.(OROOM(I).NE.RM)) .AND.
- X & ((ADV.EQ.0).OR.(OADV(I).NE.ADV)) .AND.
- X & ((CON.EQ.0).OR.(OCAN(I).NE.CON)))
- X & GO TO 1000
- XC
- XC OBJECT IS ON LIST... IS IT A MATCH?
- XC
- X IF(and(OFLAG1(I),VISIBT).EQ.0) GO TO 1000
- X IF(and(not(NOCARE),(and(OFLAG1(I),TAKEBT).EQ.0)) .OR.
- X & ((and(OFLAG1(I),F1).EQ.0).AND.
- X & (and(OFLAG2(I),F2).EQ.0))) GO TO 500
- X IF(FWIM.EQ.0) GO TO 400
- XC !ALREADY GOT SOMETHING?
- X FWIM=-FWIM
- XC !YES, AMBIGUOUS.
- X RETURN
- XC
- X400 FWIM=I
- XC !NOTE MATCH.
- XC
- XC DOES OBJECT CONTAIN A MATCH?
- XC
- X500 IF(and(OFLAG2(I),OPENBT).EQ.0) GO TO 1000
- X DO 700 J=1,OLNT
- XC !NO, SEARCH CONTENTS.
- X IF((OCAN(J).NE.I).OR.(and(OFLAG1(J),VISIBT).EQ.0) .OR.
- X & ((and(OFLAG1(J),F1).EQ.0).AND.
- X & (and(OFLAG2(J),F2).EQ.0))) GO TO 700
- X IF(FWIM.EQ.0) GO TO 600
- X FWIM=-FWIM
- X RETURN
- XC
- X600 FWIM=J
- X700 CONTINUE
- X1000 CONTINUE
- X RETURN
- X END
- X`0C
- XC YESNO- OBTAIN YES/NO ANSWER
- XC
- XC CALLED BY-
- XC
- XC YES-IS-TRUE=YESNO(QUESTION,YES-STRING,NO-STRING)
- XC
- X LOGICAL FUNCTION YESNO(Q,Y,N)
- X IMPLICIT INTEGER(A-Z)
- X COMMON /CHAN/ INPCH,OUTCH,DBCH
- X CHARACTER ANS
- XC
- X100 CALL RSPEAK(Q)
- XC !ASK
- X READ(INPCH,110) ANS
- XC !GET ANSWER
- X110 FORMAT(A1)
- X IF((ANS.EQ.'Y').OR.(ANS.EQ.'y')) GO TO 200
- X IF((ANS.EQ.'N').OR.(ANS.EQ.'n')) GO TO 300
- +-+-+-+-+-+-+-+- END OF PART 23 +-+-+-+-+-+-+-+-
-