File: INITAD.LS of Disk: V50/Source/Source-Listing-FORTRAN-2
(Source file text) 

        FORTRAN IV  V50-A (A6)  24-JUL-20 

	C  ADVENTURES
0002	        SUBROUTINE INIT
	C
	C MODIFIED BY	KENT BLACKETT
	C       	ENGINEERING SYSTEMS GROUP
	C       	DIGITAL EQUIPMENT CORP.
	C       	15-JUL-77
	C MODIFIED BY	BOB SUPNIK
	C       	DISK ENGINEERING
	C       	21-OCT-77
	C MODIFIED BY	BOB SUPNIK
	C       	DISK ENGINEERING
	C       	25-AUG-78
	C MODIFIED BY	BOB SUPNIK
	C       	SMALL SYSTEMS
	C       	12-NOV-78
	C ORIGINAL VERSION WAS FOR DECSYSTEM-10
	C NEXT VERSION WAS FOR FORTRAN IV-PLUS UNDER
	C THE IAS OPERATING SYSTEM ON THE PDP-11/70
	C THIS VERSION IS FOR FORTRAN IV (V01C OR LATER)
	C UNDER RT-11 ON *ANY* PDP-11
	C
	C
	C  CURRENT LIMITS:
	C       300 VOCABULARY WORDS (KTAB, ATAB, TABSIZ).
	C       150 LOCATIONS (LTEXT, STEXT, KEY, COND, ABB, ATLOC, LOCSIZ).
	C       100 OBJECTS (PLAC, PLACE, FIXD, FIXED, LINK (TWICE), PTEXT, PROP).
	C        35 "ACTION" VERBS (ACTSPK, VRBSIZ).
	C       205 RANDOM MESSAGES (RTEXT, RTXSIZ).
	C        12 DIFFERENT PLAYER CLASSIFICATIONS (CTEXT, CVAL, CLSMAX).
	C        20 HINTS, LESS 3 (HINTLC, HINTED, HINTS, HNTSIZ).
	C  THERE ARE ALSO LIMITS WHICH CANNOT BE EXCEEDED DUE TO THE STRUCTURE OF
	C  THE DATABASE.  (E.G., THE VOCABULARY USES N/1000 TO DETERMINE WORD TYPE,
	C  SO THERE CAN'T BE MORE THAN 1000 WORDS.)  THESE UPPER LIMITS ARE:
	C       1000 NON-SYNONYMOUS VOCABULARY WORDS
	C       300 LOCATIONS
	C       100 OBJECTS
	C
	C       IMPLICIT INTEGER (A-Z)
0003	        LOGICAL LMWARN,CLOSNG,PANIC,HINTED,
	     1		CLOSED,GAVEUP,SCORNG,DSEEN,BITSET
	C
0004	        LOGICAL WRITN
0005	        COMMON /VERSN/ VMAJ, VMIN, VEDIT
0006	        COMMON /FILES/ INDXNM, TEXTNM, SAVENM, INPTNM
0007	        COMMON /TXTCOM/ RTEXT,LINES,ASCVAR,TXTLOC,DATA
0010	        COMMON /VOCCOM/ KTAB,ATAB,TABSIZ
0011	        COMMON /PLACOM/ ATLOC,LINK,PLACE,FIXED,HOLDNG
0012	        COMMON /PTXCOM/ PTEXT
0013	        COMMON /ABBCOM/ ABB
0014	        COMMON /MISCOM/ LINUSE,TRVS,CLSSES,OLDLOC,LOC,CVAL,TK,NEWLOC,
	     1	KEY,PLAC,FIXD,ACTSPK,COND,HINTS,HNTMAX,PROP,TALLY,TALLY2,
	     2	HINTLC,CHLOC,CHLOC2,DSEEN,DFLAG,DLOC,DALTLC,KEYS,LAMP,GRATE
0015	        COMMON /MISCOM/
	     3	CAGE,ROD,ROD2,STEPS,BIRD,DOOR,PILLOW,SNAKE,FISSUR,TABLET,
        FORTRAN IV  V50-A (A6)  24-JUL-20 

	     4	CLAM,OYSTER,MAGZIN,DWARF,KNIFE,FOOD,BOTTLE,WATER,OIL,PLANT,
	     5	PLANT2,AXE,MIRROR,DRAGON,CHASM,TROLL,TROLL2,BEAR,MESSAG,VEND,
	     6	BATTER,NUGGET,COINS,CHEST,EGGS,TRIDNT,VASE,EMRALD,PYRAM
0016	        COMMON /MISCOM/
	     7	PEARL,RUG,CHAIN,BACK,LOOK,CAVE,NULL,ENTRNC,DPRSSN,SAY,LOCK,
	     8	THROW,FIND,INVENT,TURNS,LMWARN,KNFLOC,DETAIL,ABBNUM,
	     9	NUMDIE,MAXDIE,DKILL,FOOBAR,BONUS,CLOCK1,CLOCK2,
	     1	CLOSNG,PANIC,CLOSED,GAVEUP,SCORNG,ODLOC,STREAM,SPICES
0017	        COMMON /MISC2/ I,RTXSIZ,CLSMAX,LOCSIZ,CTEXT,STEXT,LTEXT,
	     1	SECT,TRAVEL,TRVCON,TRVLOC,TRVSIZ,TABNDX,OBJ,J,K,VERB,HNTSIZ,
	     2	MAXTRS,HINTED,HNTLOC,KK
	C
0020	        INTEGER LINES(12),DATA(78)
	C       The TRAVEL, TRVCON, and TRVLOC arrays are
	C       Packed with words 0,1,2 holding the data. Saves lots
	C       of wasted space at the expense of some complexity.
0021	        INTEGER TRAVEL(250), TRVCON(250), TRVLOC(250), TRVSIZ
0022	        INTEGER KTAB(300),ATAB(300),TABSIZ
0023	        INTEGER LTEXT(150),STEXT(150),KEY(150),COND(150),ABB(150),
	     1	ATLOC(150)
0024	        INTEGER PLAC(100),PLACE(100),FIXD(100),FIXED(100),LINK(200),
	     1	PTEXT(100),PROP(100),HOLDNG
0025	        INTEGER ACTSPK(35)
0026	        INTEGER RTEXT(205)
0027	        INTEGER CTEXT(12),CVAL(12)
0030	        INTEGER HINTLC(20),HINTS(20,4)
0031	        DIMENSION HINTED(20)
0032	        INTEGER TK(20),DLOC(6),ODLOC(6)
0033	        DIMENSION DSEEN(6)
0034	        INTEGER ASCVAR, TXTLOC, TRVS, CLSSES, OLDLOC
0035	        INTEGER HNTSIZ, HNTMAX, TALLY, TALLY2, CHLOC, CHLOC2, DFLAG
0036	        INTEGER DALTLC,GRATE,CAGE,ROD,ROD2,STEPS,BIRD,DOOR,PILLOW,SNAKE
0037	        INTEGER FISSUR,TABLET,CLAM,OYSTER,MAGZIN,DWARF,KNIFE,FOOD,BOTTLE
0040	        INTEGER WATER,OIL,PLANT,PLANT2,AXE,MIRROR,DRAGON,CHASM
0041	        INTEGER BEAR,MESSAG,VEND,BATTER,COINS,CHEST,EGGS,TRIDNT,VASE,EMRALD
0042	        INTEGER PYRAM,PEARL,RUG,CHAIN,BACK,LOOK,CAVE,NULL,ENTRNC,DPRSSN,SAY
0043	        INTEGER LOCK,THROW,FIND,INVENT,TURNS,KNFLOC,DETAIL,ABBNUM
0044	        INTEGER NUMDIE,MAXDIE,DKILL,FOOBAR,BONUS,CLOCK1,CLOCK2
0045	        INTEGER	TROLL,TROLL2,STREAM,SPICES
0046	        INTEGER RTXSIZ,CLSMAX,LOCSIZ,SECT,TABNDX,OBJ
0047	        INTEGER VERB,HNTLOC,KK
0050	        INTEGER INDXNM(3),TEXTNM(3),SAVENM(3),INPTNM(3),CODE,NAME(3)
	C
	C
	C       ISHFT(NUMBER,IPOSIT)=NUMBER*(2**IPOSIT)
	C       BITSET(L,N)=(COND(L).AND.ISHFT(1,N)).NE.0
	C  DESCRIPTION OF THE DATABASE FORMAT
	C
	C
	C  THE DATA FILE CONTAINS SEVERAL SECTIONS.  EACH BEGINS WITH A LINE CONTAINING
	C  A NUMBER IDENTIFYING THE SECTION, AND ENDS WITH A LINE CONTAINING "-1".
	C
	C  SECTION 1: LONG FORM DESCRIPTIONS.  EACH LINE CONTAINS A LOCATION NUMBER,
	C       A COMMA, AND A LINE OF TEXT.  THE SET OF (NECESSARILY ADJACENT) LINES
	C       WHOSE NUMBERS ARE X FORM THE LONG DESCRIPTION OF LOCATION X.
        FORTRAN IV  V50-A (A6)  24-JUL-20 

	C  SECTION 2: SHORT FORM DESCRIPTIONS.  SAME FORMAT AS LONG FORM.  NOT ALL
	C       PLACES HAVE SHORT DESCRIPTIONS.
	C  SECTION 3: TRAVEL TABLE.  EACH LINE CONTAINS A LOCATION NUMBER (X), A SECOND
	C       LOCATION NUMBER (Y), AND A LIST OF MOTION NUMBERS (SEE SECTION 4).
	C       EACH MOTION REPRESENTS A VERB WHICH WILL GO TO Y IF CURRENTLY AT X.
	C       Y, IN TURN, IS INTERPRETED AS FOLLOWS.  LET M=Y/1000, N=Y MOD 1000.
	C       	IF N<=300	IT IS THE LOCATION TO GO TO.
	C       	IF 300<N<=500	N-300 IS USED IN A COMPUTED GOTO TO
	C       				A SECTION OF SPECIAL CODE.
	C       	IF N>500	MESSAGE N-500 FROM SECTION 6 IS PRINTED,
	C       				AND HE STAYS WHEREVER HE IS.
	C       MEANWHILE, M SPECIFIES THE CONDITIONS ON THE MOTION.
	C       	IF M=0		IT'S UNCONDITIONAL.
	C       	IF 0<M<100	IT IS DONE WITH M% PROBABILITY.
	C       	IF M=100	UNCONDITIONAL, BUT FORBIDDEN TO DWARVES.
	C       	IF 100<M<=200	HE MUST BE CARRYING OBJECT M-100.
	C       	IF 200<M<=300	MUST BE CARRYING OR IN SAME ROOM AS M-200.
	C       	IF 300<M<=400	PROP(M MOD 100) MUST *NOT* BE 0.
	C       	IF 400<M<=500	PROP(M MOD 100) MUST *NOT* BE 1.
	C       	IF 500<M<=600	PROP(M MOD 100) MUST *NOT* BE 2, ETC.
	C       IF THE CONDITION (IF ANY) IS NOT MET, THEN THE NEXT *DIFFERENT*
	C       "DESTINATION" VALUE IS USED (UNLESS IT FAILS TO MEET *ITS* CONDITIONS,
	C       IN WHICH CASE THE NEXT IS FOUND, ETC.).  TYPICALLY, THE NEXT DEST WILL
	C       BE FOR ONE OF THE SAME VERBS, SO THAT ITS ONLY USE IS AS THE ALTERNATE
	C       DESTINATION FOR THOSE VERBS.  FOR INSTANCE:
	C       	15	110022	29	31	34	35	23	43
	C       	15	14	29
	C       THIS SAYS THAT, FROM LOC 15, ANY OF THE VERBS 29, 31, ETC., WILL TAKE
	C       HIM TO 22 IF HE'S CARRYING OBJECT 10, AND OTHERWISE WILL GO TO 14.
	C       	11	303008	49
	C       	11	9	50
	C       THIS SAYS THAT, FROM 11, 49 TAKES HIM TO 8 UNLESS PROP(3)=0, IN WHICH
	C       CASE HE GOES TO 9.  VERB 50 TAKES HIM TO 9 REGARDLESS OF PROP(3).
	C
	C       IN THIS IMPLEMENTATION, THE SECOND LOCATION NUMBER Y HAS BEEN
	C       SPLIT INTO M, CONDITIONS, AND N, LOCATION.
	C
	C  SECTION 4: VOCABULARY.  EACH LINE CONTAINS A NUMBER (N), A TAB, AND A
	C       FIVE-LETTER WORD.  CALL M=N/1000.  IF M=0, THEN THE WORD IS A MOTION
	C       VERB FOR USE IN TRAVELLING (SEE SECTION 3).  ELSE, IF M=1, THE WORD IS
	C       AN OBJECT.  ELSE, IF M=2, THE WORD IS AN ACTION VERB (SUCH AS "CARRY"
	C       OR "ATTACK").  ELSE, IF M=3, THE WORD IS A SPECIAL CASE VERB (SUCH AS
	C       "DIG") AND N MOD 1000 IS AN INDEX INTO SECTION 6.  OBJECTS FROM 50 TO
	C       (CURRENTLY, ANYWAY) 79 ARE CONSIDERED TREASURES (FOR PIRATE, CLOSEOUT).
	C  SECTION 5: OBJECT DESCRIPTIONS.  EACH LINE CONTAINS A NUMBER (N), A TAB,
	C       AND A MESSAGE.  IF N IS FROM 1 TO 100, THE MESSAGE IS THE "INVENTORY"
	C       MESSAGE FOR OBJECT N.  OTHERWISE, N SHOULD BE 000, 100, 200, ETC., AND
	C       THE MESSAGE SHOULD BE THE DESCRIPTION OF THE PRECEDING OBJECT WHEN ITS
	C       PROP VALUE IS N/100.  THE N/100 IS USED ONLY TO DISTINGUISH MULTIPLE
	C       MESSAGES FROM MULTI-LINE MESSAGES; THE PROP INFO ACTUALLY REQUIRES ALL
	C       MESSAGES FOR AN OBJECT TO BE PRESENT AND CONSECUTIVE.  PROPERTIES WHICH
	C       PRODUCE NO MESSAGE SHOULD BE GIVEN THE MESSAGE ">$<".
	C  SECTION 6: ARBITRARY MESSAGES.  SAME FORMAT AS SECTIONS 1, 2, AND 5, EXCEPT
	C       THE NUMBERS BEAR NO RELATION TO ANYTHING (EXCEPT FOR SPECIAL VERBS
	C       IN SECTION 4).
        FORTRAN IV  V50-A (A6)  24-JUL-20 

	C  SECTION 7: OBJECT LOCATIONS.  EACH LINE CONTAINS AN OBJECT NUMBER AND ITS
	C       INITIAL LOCATION (ZERO (OR OMITTED) IF NONE).  IF THE OBJECT IS
	C       IMMOVABLE, THE LOCATION IS FOLLOWED BY A "-1".  IF IT HAS TWO LOCATIONS
	C       (E.G. THE GRATE) THE FIRST LOCATION IS FOLLOWED WITH THE SECOND, AND
	C       THE OBJECT IS ASSUMED TO BE IMMOVABLE.
	C  SECTION 8: ACTION DEFAULTS.  EACH LINE CONTAINS AN "ACTION-VERB" NUMBER AND
	C       THE INDEX (IN SECTION 6) OF THE DEFAULT MESSAGE FOR THE VERB.
	C  SECTION 9: LIQUID ASSETS, ETC.  EACH LINE CONTAINS A NUMBER (N) AND UP TO 20
	C       LOCATION NUMBERS.  BIT N (WHERE 0 IS THE UNITS BIT) IS SET IN COND(LOC)
	C       FOR EACH LOC GIVEN.  THE COND BITS CURRENTLY ASSIGNED ARE:
	C       	0	LIGHT
	C       	1	IF BIT 2 IS ON: ON FOR OIL, OFF FOR WATER
	C       	2	LIQUID ASSET, SEE BIT 1
	C       	3	PIRATE DOESN'T GO HERE UNLESS FOLLOWING PLAYER
	C       OTHER BITS ARE USED TO INDICATE AREAS OF INTEREST TO "HINT" ROUTINES:
	C       	4	TRYING TO GET INTO CAVE
	C       	5	TRYING TO CATCH BIRD
	C       	6	TRYING TO DEAL WITH SNAKE
	C       	7	LOST IN MAZE
	C       	8	PONDERING DARK ROOM
	C       	9	AT WITT'S END
	C       COND(LOC) IS SET TO 2, OVERRIDING ALL OTHER BITS, IF LOC HAS FORCED
	C       MOTION.
	C  SECTION 10: CLASS MESSAGES.  EACH LINE CONTAINS A NUMBER (N), A TAB, AND A
	C       MESSAGE DESCRIBING A CLASSIFICATION OF PLAYER.  THE SCORING SECTION
	C       SELECTS THE APPROPRIATE MESSAGE, WHERE EACH MESSAGE IS CONSIDERED TO
	C       APPLY TO PLAYERS WHOSE SCORES ARE HIGHER THAN THE PREVIOUS N BUT NOT
	C       HIGHER THAN THIS N.  NOTE THAT THESE SCORES PROBABLY CHANGE WITH EVERY
	C       MODIFICATION (AND PARTICULARLY EXPANSION) OF THE PROGRAM.
	C  SECTION 11: HINTS.  EACH LINE CONTAINS A HINT NUMBER (CORRESPONDING TO A
	C       COND BIT, SEE SECTION 9), THE NUMBER OF TURNS HE MUST BE AT THE RIGHT
	C       LOC(S) BEFORE TRIGGERING THE HINT, THE POINTS DEDUCTED FOR TAKING THE
	C       HINT, THE MESSAGE NUMBER (SECTION 6) OF THE QUESTION, AND THE MESSAGE
	C       NUMBER OF THE HINT.  THESE VALUES ARE STASHED IN THE "HINTS" ARRAY.
	C       HNTMAX IS SET TO THE MAX HINT NUMBER (<= HNTSIZ).  NUMBERS 1-3 ARE
	C       UNUSABLE SINCE COND BITS ARE OTHERWISE ASSIGNED, SO 2 IS USED TO
	C       REMEMBER IF HE'S READ THE CLUE IN THE REPOSITORY, AND 3 IS USED TO
	C       REMEMBER WHETHER HE ASKED FOR INSTRUCTIONS (GETS MORE TURNS, BUT LOSES
	C       POINTS).
	C  SECTION 12: MAGIC MESSAGES. IDENTICAL TO SECTION 6 EXCEPT PUT IN A SEPARATE
	C       SECTION FOR EASIER REFERENCE.  MAGIC MESSAGES ARE USED BY THE STARTUP,
	C       MAINTENANCE MODE, AND RELATED ROUTINES.
	C  SECTION 0: END OF DATABASE.
	C  READ THE DATABASE IF WE HAVE NOT YET DONE SO
	C
0051	        ISEED=0
	C
	C FILSIZ Was 900 for RT-11 but we pack 6 records per.
	C
0052	        FILSIZ=150
0053	        TABSIZ=300
0054	        LOCSIZ=150
0055	        VRBSIZ=35
0056	        RTXSIZ = 205
0057	        HNTSIZ = 20
        FORTRAN IV  V50-A (A6)  24-JUL-20 

0060	        MAGSIZ = 35
0061	        TRVSIZ = 750
0062	        CLSMAX = 12
	C       VCNT = 0
	CDEBUG	WRITE(4,1000)
	CDEBUG1000	FORMAT(' INITIALIZING...')
	C
	C FIRST, TRY TO RESTORE PRE-EXISTING COPY OF DATA BASE
	C
0063	        CALL USR(6,'ADVENT.IN',2,ERR)
0064	        IF (ERR .EQ. 0) GOTO 30
0065	20      CALL SIXOUT('L]OCATION OF TEXT DATABASE ([ATEXT.DA]) >',21,2)
0066	        WRITE(4,121)
0067	121     FORMAT('+',$)
0070	        READ(4,21) TEXTNM
0071	21      FORMAT(3A6)
0072	        IF (TEXTNM(1) .NE. ' ') GOTO 22
0073	        TEXTNM(1) = 'ATEXT.'
0074	        TEXTNM(2) = 'DA'
0075	        TEXTNM(3) = ' '
0076	22      CALL SIXOUT('L]OCATION OF TEXT INDEX    ([AINDX.DA]) >',21,2)
0077	        WRITE(4,121)
0100	        READ(4,21) INDXNM
0101	        IF (INDXNM(1) .NE. ' ') GOTO 23
0102	        INDXNM(1) = 'AINDX.'
0103	        INDXNM(2) = 'DA'
0104	        INDXNM(3) = ' '
0105	23      CALL SIXOUT('L]OCATION OF SAVED GAMES   ([ASAVE.DA]) >',21,2)
0106	        WRITE(4,121)
0107	        READ(4,21) SAVENM
0110	        IF (SAVENM(1) .NE. ' ') GOTO 24
0111	        SAVENM(1) = 'ASAVE.'
0112	        SAVENM(2) = 'DA'
0113	        SAVENM(3) = ' '
0114	24      CALL SIXOUT('L]OCATION OF TEXT INPUT   ([ADVENT.TX]) >',21,2)
0115	        WRITE(4,121)
0116	        READ(4,21)INPTNM
0117	        IF (INPTNM(1) .NE. ' ') GOTO 25
0120	        INPTNM(1) = 'ADVENT'
0121	        INPTNM(2) = '.TX'
0122	        INPTNM(3) = ' '
0123	25      CONTINUE
	
0124	        CALL USR(6, 'ADVENT.IN',3,ERR)
0125	        IF (ERR .NE. 0) WRITE(4,28)
	
0126	28      FORMAT(' CAN''T SAVE SETTINGS IN ADVENT.IN')
0127	        IF (ERR.NE.0) GOTO 40
	
0130	        WRITE(6, 29)INDXNM,TEXTNM,SAVENM,INPTNM
0131	29      FORMAT(' ADVENTURE SETUP FILE',/,
	     1		'INDX=',3A6,/,'TEXT=',3A6,/,'SAVE=',3A6,/,'INPT=',3A6)
0132	        CALL USR(6, 'ADVENT.IN',4,ERR)
0133	        GOTO 40
	
        FORTRAN IV  V50-A (A6)  24-JUL-20 

0134	30      INDXNM(1) = 'AINDX.'
0135	        INDXNM(2) = 'DA'
0136	        INDXNM(3) = ' '
0137	        TEXTNM(1) = 'ATEXT.'
0140	        TEXTNM(2) = 'DA'
0141	        TEXTNM(3) = ' '
0142	        SAVENM(1) = 'ASAVE.'
0143	        SAVENM(2) = 'DA'
0144	        SAVENM(3) = ' '
0145	        INPTNM(1) = 'ADVENT'
0146	        INPTNM(2) = '.TX'
0147	        INPTNM(3) = ' '
0150	31      CALL CHKEOF(EOF)
0151	        READ(6, 32) CODE, NAME
0152	        IF (EOF .NE. 0) GOTO 34
0153	32      FORMAT(A4,1X,3A6)
0154	        DO 33 I = 1, 3
0155	        IF (CODE .EQ. 'INDX') INDXNM(I) = NAME(I)
0156	        IF (CODE .EQ. 'TEXT') TEXTNM(I) = NAME(I)
0157	        IF (CODE .EQ. 'SAVE') SAVENM(I) = NAME(I)
0160	        IF (CODE .EQ. 'INPT') INPTNM(I) = NAME(I)
0161	33      CONTINUE
0162	        GO TO 31
	
0163	34      CONTINUE
0164	40      CALL RSTRGM(.FALSE.,I)
0165	        IF(I.NE.0) GO TO 10
0166	        CALL USR(8, TEXTNM, 2, ERR)
	C
	C If that can't be opened for input, gotta rebuild
	C
0167	        IF (ERR.NE.0) GOTO 10
	C
	C Hack to set the DEFINE FILE stuff up
	C
0170	        CALL SETIDL
	C       CALL USR(6, 'ADVENT.TX', 2, ERR)
	C       IF (ERR.EQ.0) GOTO 1235
	C       CALL SIXOUT('C]AN''T OPEN [ADVENT.TX] FOR INPUT, QUITTING!',23,0)
	C       STOP
	
0171	1235    WRITN = .FALSE.
0172	        GO TO 5000
	C
	C  CLEAR OUT THE VARIOUS TEXT-POINTER ARRAYS.  ALL TEXT IS STORED IN DISK
	C  FILE (RANDOM ACCESS ON UNIT 2).  THE TEXT-POINTER ARRAYS CONTAIN RECORD
	C  NUMBERS IN THE FILE.  STEXT(N) IS SHORT DESCRIPTION OF LOCATION N.
	C  LTEXT(N) IS LONG DESCRIPTION.  PTEXT(N) POINTS TO MESSAGE FOR PROP(N)=0.
	C  SUCCESSIVE PROP MESSAGES ARE FOUND BY CHASING POINTERS.  RTEXT CONTAINS
	C  SECTION 6'S STUFF.  CTEXT(N) POINTS TO A PLAYER-CLASS MESSAGE.  MTEXT IS FOR
	C  SECTION 12.  WE ALSO CLEAR COND.  SEE DESCRIPTION OF SECTION 9 FOR DETAILS.
	C
0173	        WRITN = .TRUE.
0174	10      DO 1001 I=1,TABSIZ
0175	        KTAB(I)=0
        FORTRAN IV  V50-A (A6)  24-JUL-20 

0176	        ATAB(I)=0
	C
	C A2TAB not used on the '8
	C       A2TAB(I)=0
0177	        IF(I.GT.100) GO TO 1990
0200	        PTEXT(I)=0
0201	        PROP(I)=0
0202	        PLAC(I)=0
0203	        PLACE(I)=0
0204	        FIXD(I)=0
0205	        FIXED(I)=0
0206	        LINK(I)=0
0207	        LINK(I+100)=0
0210	1990    IF(I.LE.RTXSIZ)RTEXT(I)=0
0211	        IF(I.LE.CLSMAX)CTEXT(I)=0
	C       IF(I.LE.MAGSIZ)MTEXT(I)=0
0212	        IF(I.LE.VRBSIZ)ACTSPK(I)=0
0213	        IF(I.GT.LOCSIZ)GOTO 1001
0214	        KEY(I)=0
0215	        ABB(I)=0
0216	        ATLOC(I)=0
0217	        STEXT(I)=0
0220	        LTEXT(I)=0
0221	        COND(I)=0
0222	1001    CONTINUE
	C
0223	        CALL USR(6, INPTNM, 2, ERR)
0224	        IF(ERR.EQ.0)GOTO 1236
0225	        CALL SIXOUT('C]AN''T OPEN ',6,2)
0226	        CALL SIXOUT(INPTNM, 9, 3)
0227	        CALL SIXOUT(' ]FOR INPUT!',6,1)
0230	        STOP
0231	1236    CALL USR(8, TEXTNM, 3, ERR)
0232	        IF (ERR.EQ.0) GOTO 1237
0233	        CALL SIXOUT('C]AN''T OPEN ',6,2)
0234	        CALL SIXOUT(TEXTNM, 9, 3)
0235	        CALL SIXOUT(' ]FOR OUTPUT',6,1)
0236	        STOP
	C Below uses FILSIZ/3 for OS/8
0237	1237    DEFINE FILE 8(FILSIZ/3,78,U,RECORD)
0240	        RECORD = 1
0241	        ASCVAR = 1
0242	        LINUSE=1
0243	        TRVS=1
0244	        CLSSES=1
	C
	C  START NEW DATA SECTION.  ISECT IS THE SECTION NUMBER.
	C
0245	1002    READ(6,1003)ISECT
0246	1003    FORMAT(I5)
	CDEBUG	WRITE(4,930)ISECT
	CDEBUG930	FORMAT(' NOW LOADING SECTION',I3)
0247	        OLDLOC=-1
0250	        GOTO(1100,1004,1004,1030,1040,1004,1004,1050,1060,1070,1004,
	     1	    1080,1004) (ISECT+1)
        FORTRAN IV  V50-A (A6)  24-JUL-20 

	C             (0)  (1)  (2)  (3)  (4)  (5)  (6)  (7)  (8)  (9)  (10)
	C            (11) (12)
0251	        CALL BUG(9)
	C
	C  SECTIONS 1, 2, 5, 6, 10, 12.  READ MESSAGES AND SET UP POINTERS.
	C
0252	1004    READ(6,1005) LOC,LINES
0253	1005    FORMAT(I4,12A6)
	C       WRITE(8'ASCVAR) LOC,LINES
0254	        MULT = 13 * MOD(ASCVAR-1,6)+1
0255	        DATA(MULT) = LOC
0256	        DO 1006 I = 1,12
0257	1006    DATA(I+MULT) = LINES(I)
0260	        ASCVAR = ASCVAR + 1
0261	        IF (MOD(ASCVAR,6) .EQ. 0) WRITE(8'RECORD)DATA
0262	1007    LINUSE = ASCVAR-1
0263	        IF(LOC .EQ. -1) GO TO 1002
0264	        IF(LOC .EQ. OLDLOC) GO TO 1020
0265	        IF(ISECT.EQ.12)GOTO 1020
0266	        IF(ISECT.EQ.10)GOTO 1012
0267	        IF(ISECT.EQ.6)GOTO 1011
0270	        IF(ISECT.EQ.5)GOTO 1010
0271	        IF(ISECT.EQ.1)GOTO 1008
	C
0272	        IF(LOC.GT.LOCSIZ) CALL BUG(11)
0273	        STEXT(LOC)=LINUSE
0274	        GOTO 1020
	C
0275	1008    IF(LOC.GT.LOCSIZ) CALL BUG(11)
0276	        LTEXT(LOC)=LINUSE
0277	        GOTO 1020
	C
0300	1010    IF(LOC.GT.0.AND.LOC.LE.100)PTEXT(LOC)=LINUSE
0301	        GOTO 1020
	C
0302	1011    IF(LOC .GT. RTXSIZ) CALL BUG(6)
0303	        RTEXT(LOC)=LINUSE
0304	        GOTO 1020
	C
0305	1012    IF(CLSSES.GT.CLSMAX) CALL BUG(12)
0306	        CTEXT(CLSSES)=LINUSE
0307	        CVAL(CLSSES)=LOC
0310	        CLSSES=CLSSES+1
	C       GOTO 1020
	C1013
	C       IF(LOC.GT.MAGSIZ)CALL BUG(6)
	C       MTEXT(LOC)=LINUSE
	C
0311	1020    OLDLOC = LOC
0312	        IF(RECORD .GE. FILSIZ) CALL BUG(2)
0313	        GOTO 1004
	C
	C  THE STUFF FOR SECTION 3 IS ENCODED HERE.  EACH "FROM-LOCATION" GETS A
	C  CONTIGUOUS SECTION OF THE "TRAVEL" ARRAY.  EACH ENTRY IN TRAVEL IS
	C  KEYWORD (FROM SECTION 4, MOTION VERBS), AND IS NEGATED IF
        FORTRAN IV  V50-A (A6)  24-JUL-20 

	C  THIS IS THE LAST ENTRY FOR THIS LOCATION.  KEY(N) IS THE INDEX IN TRAVEL
	C  OF THE FIRST OPTION AT LOCATION N.
	C
	C  SPECIAL CONDITIONS ON TRAVEL ARE ENCODED IN THE CORRESPONDING
	C  ENTRIES OF TRVCON.  THE NEW LOCATION IS IN TRVLOC.
	C
	C
0314	1030    READ(6,1031)LOC,J,NEWLOC,TK
0315	1031    FORMAT(99I6)
0316	        IF(LOC.EQ.-1)GOTO 1002
0317	        IF(KEY(LOC).NE.0)GOTO 1033
0320	        KEY(LOC)=TRVS
0321	        GOTO 1035
	C1033   TRAVEL(TRVS-1)=-TRAVEL(TRVS-1)
0322	1033    ITEMP = GETWRD(TRAVEL, TRVS-1, 0)
0323	        ITEMP=-ITEMP
0324	        CALL PUTWRD(TRAVEL, TRVS-1, ITEMP)
0325	1035    DO 1037 L=1,20
0326	        IF(TK(L).EQ.0)GOTO 1039
	C       TRAVEL(TRVS)=TK(L)
0327	        CALL PUTWRD(TRAVEL, TRVS, TK(L))
	C       TRVLOC(TRVS)=NEWLOC
0330	        CALL PUTWRD(TRVLOC, TRVS, NEWLOC)
	C       TRVCON(TRVS)=J
0331	        CALL PUTWRD(TRVCON, TRVS, J)
0332	        TRVS=TRVS+1
0333	        IF(TRVS.EQ.TRVSIZ)CALL BUG(3)
0334	1037    CONTINUE
	C1039   TRAVEL(TRVS-1)=-TRAVEL(TRVS-1)
0335	1039    ITEMP = GETWRD(TRAVEL, TRVS-1, 0)
0336	        ITEMP=-ITEMP
0337	        CALL PUTWRD(TRAVEL, TRVS-1, ITEMP)
0340	        GOTO 1030
	C
	C  HERE WE READ IN THE VOCABULARY.  KTAB(N) IS THE WORD NUMBER, ATAB(N) IS
	C  THE CORRESPONDING WORD.  THE -1 AT THE END OF SECTION 4 IS LEFT IN KTAB
	C  AS AN END-MARKER.
	C  OS/8 note: only reading first four characters as that's what's matched
	C  for vocabulary.
	C
0341	1040    DO 1042 TABNDX=1,TABSIZ
0342	1043    READ(6,1041)KTAB(TABNDX),ATAB(TABNDX)
0343	1041    FORMAT(I6,A4)
0344	        IF(KTAB(TABNDX).EQ.-1)GOTO 1002
0345	1042    CONTINUE
0346	        CALL BUG(4)
	C
	C  READ IN THE INITIAL LOCATIONS FOR EACH OBJECT.  ALSO THE IMMOVABILITY INFO.
	C  PLAC CONTAINS INITIAL LOCATIONS OF OBJECTS.  FIXD IS -1 FOR IMMOVABLE
	C  OBJECTS (INCLUDING THE SNAKE), OR = SECOND LOC FOR TWO-PLACED OBJECTS.
	C
0347	1050    READ(6,1031)IOBJ,J,K
0350	        IF(IOBJ.EQ.-1)GOTO 1002
0351	        IF(IOBJ.GT.100) CALL BUG(13)
0352	        PLAC(IOBJ)=J
        FORTRAN IV  V50-A (A6)  24-JUL-20 

0353	        FIXD(IOBJ)=K
0354	        GOTO 1050
	C
	C  READ DEFAULT MESSAGE NUMBERS FOR ACTION VERBS, STORE IN ACTSPK.
	C
0355	1060    READ(6,1031)VERB,J
0356	        IF(VERB.EQ.-1)GOTO 1002
0357	        IF(VERB.GT.VRBSIZ) CALL BUG(10)
0360	        ACTSPK(VERB)=J
0361	        VCNT=MAX0(VERB,VCNT)
0362	        GOTO 1060
	C
	C  READ INFO ABOUT AVAILABLE LIQUIDS AND OTHER CONDITIONS, STORE IN COND.
	C
0363	1070    READ(6,1031)K,TK
0364	        IF(K.EQ.-1)GOTO 1002
0365	        DO 1071 I=1,20
0366	        LOC=TK(I)
0367	        IF(LOC.EQ.0)GOTO 1070
0370	        IF (BITSET(LOC,K)) CALL BUG(8)
0371	1071    COND(LOC)=COND(LOC)+ISHFT(1,K)
0372	        GOTO 1070
	C
	C  READ DATA FOR HINTS.
	C
0373	1080    HNTMAX=0
0374	1081    READ(6,1031)K,TK
0375	        IF(K.EQ.-1)GOTO 1002
0376	        IF(K.LT.0.OR.K.GT.HNTSIZ)CALL BUG(7)
0377	        DO 1083 I=1,4
0400	1083    HINTS(K,I)=TK(I)
0401	        HNTMAX=MAX0(HNTMAX,K)
0402	        GOTO 1081
	C  FINISH CONSTRUCTING INTERNAL DATA FORMAT
	C       THEN SAVE THE RESULTS
	C
0403	1100    IF (MOD(ASCVAR,6) .NE. 0) WRITE(8'RECORD)DATA
0404	        CALL USR(8,TEXTNM,4,IERR)
0405	        CALL USR(8,TEXTNM,2,IERR)
	C
	C Restore the "DEFINE FILE" settings
	C
0406	        CALL SETIDL
	C1100   CALL CLOSE(1)
0407	        CALL SAVEGM(.FALSE.,I)
0410	        CONTINUE
	C
	C  HAVING READ IN THE DATABASE, CERTAIN THINGS ARE NOW CONSTRUCTED.  PROPS ARE
	C  SET TO ZERO.  WE FINISH SETTING UP COND BY CHECKING FOR FORCED-MOTION TRAVEL
	C  ENTRIES.  THE PLAC AND FIXD ARRAYS ARE USED TO SET UP ATLOC(N) AS THE FIRST
	C  OBJECT AT LOCATION N, AND LINK(IOBJ) AS THE NEXT OBJECT AT THE SAME LOCATION
	C  AS IOBJ.  (IOBJ>100 INDICATES THAT FIXED(IOBJ-100)=LOC; LINK(IOBJ) IS STILL THE
	C  CORRECT LINK TO USE.)  ABB IS ZEROED; IT CONTROLS WHETHER THE ABBREVIATED
	C  DESCRIPTION IS PRINTED.  COUNTS MOD 5 UNLESS "LOOK" IS USED.
	C
        FORTRAN IV  V50-A (A6)  24-JUL-20 

	C
	C  IF THE FIRST MOTION VERB IS 1 (ILLEGAL), THEN THIS IS A FORCED
	C  MOTION ENTRY.
	C
0411	5000    DO 1102 I=1,LOCSIZ
0412	        IF(LTEXT(I).EQ.0.OR.KEY(I).EQ.0)GOTO 1102
0413	        K=KEY(I)
	C       IF(IABS(TRAVEL(K)).EQ.1)COND(I)=2
0414	        ITEMP = GETWRD(TRAVEL, K, 0)
0415	        IF (IABS(ITEMP).EQ.1)COND(I)=2
0416	1102    CONTINUE
	C
	C  SET UP THE ATLOC AND LINK ARRAYS AS DESCRIBED ABOVE.  WE'LL USE THE DROP
	C  SUBROUTINE, WHICH PREFACES NEW OBJECTS ON THE LISTS.  SINCE WE WANT THINGS
	C  IN THE OTHER ORDER, WE'LL RUN THE LOOP BACKWARDS.  IF THE OBJECT IS IN TWO
	C  LOCS, WE DROP IT TWICE.  THIS ALSO SETS UP "PLACE" AND "FIXED" AS COPIES OF
	C  "PLAC" AND "FIXD".  ALSO, SINCE TWO-PLACED OBJECTS ARE TYPICALLY BEST
	C  DESCRIBED LAST, WE'LL DROP THEM FIRST.
	C
0417	        DO 1106 I=1,100
0420	        K=101-I
0421	        IF(FIXD(K).LE.0)GOTO 1106
0422	        CALL DROP(K+100,FIXD(K))
0423	        CALL DROP(K,PLAC(K))
0424	1106    CONTINUE
	C
0425	        DO 1107 I=1,100
0426	        K=101-I
0427	        FIXED(K)=FIXD(K)
0430	1107    IF(PLAC(K).NE.0.AND.FIXD(K).LE.0)CALL DROP(K,PLAC(K))
	C
	C  TREASURES, AS NOTED EARLIER, ARE OBJECTS 50 THROUGH MAXTRS (CURRENTLY 79).
	C  THEIR PROPS ARE INITIALLY -1, AND ARE SET TO 0 THE FIRST TIME THEY ARE
	C  DESCRIBED.  TALLY KEEPS TRACK OF HOW MANY ARE NOT YET FOUND, SO WE KNOW
	C  WHEN TO CLOSE THE CAVE.  TALLY2 COUNTS HOW MANY CAN NEVER BE FOUND (E.G. IF
	C  LOST BIRD OR BRIDGE).
	C
0431	        MAXTRS=79
0432	        TALLY=0
0433	        TALLY2=0
0434	        DO 1200 I=50,MAXTRS
0435	        IF(PTEXT(I).NE.0)PROP(I)=-1
0436	1200    TALLY=TALLY-PROP(I)
	C
	C  CLEAR THE HINT STUFF.  HINTLC(I) IS HOW LONG HE'S BEEN AT LOC WITH COND BIT
	C  I.  HINTED(I) IS TRUE IFF HINT I HAS BEEN USED.
	C
0437	        DO 1300 I=1,HNTMAX
0440	        HINTED(I)=.FALSE.
0441	1300    HINTLC(I)=0
	C
	CDEBUG	WRITE(4,931)TABNDX,TABSIZ,VCNT,VRBSIZ,CLSSES,CLSMAX,
	CDEBUG     1	HNTMAX,HNTSIZ,TRVS,TRVSIZ,LINUSE,FILSIZ
	CDEBUG931	FORMAT(' USED VS MAX TABLE VALUES:'/
	CDEBUG     1	1X,I5,' OF ',I5,' VOCAB ENTRIES'/
        FORTRAN IV  V50-A (A6)  24-JUL-20 

	CDEBUG     2	1X,I5,' OF ',I5,' VERB ENTRIES'/
	CDEBUG     3	1X,I5,' OF ',I5,' CLASS ENTRIES'/
	CDEBUG     4	1X,I5,' OF ',I5,' HINT ENTRIES'/
	CDEBUG     5	1X,I5,' OF ',I5,' TRAVEL ENTRIES'/
	CDEBUG     6	1X,I5,' OF ',I5,' FILE RECORDS'/)
	C
	C  DEFINE SOME HANDY MNEMONICS.  THESE CORRESPOND TO OBJECT NUMBERS.
	C
0442	        KEYS=VOCAB('KEYS',1)
0443	        LAMP=VOCAB('LAMP',1)
0444	        GRATE=VOCAB('GRAT',1)
0445	        CAGE=VOCAB('CAGE',1)
0446	        ROD=VOCAB('ROD ',1)
0447	        ROD2=ROD+1
0450	        STEPS=VOCAB('STEP',1)
0451	        BIRD=VOCAB('BIRD',1)
0452	        DOOR=VOCAB('DOOR',1)
0453	        PILLOW=VOCAB('PILL',1)
0454	        SNAKE=VOCAB('SNAK',1)
0455	        FISSUR=VOCAB('FISS',1)
0456	        TABLET=VOCAB('TABL',1)
0457	        CLAM=VOCAB('CLAM',1)
0460	        OYSTER=VOCAB('OYST',1)
0461	        MAGZIN=VOCAB('MAGA',1)
0462	        DWARF=VOCAB('DWAR',1)
0463	        KNIFE=VOCAB('KNIF',1)
0464	        FOOD=VOCAB('FOOD',1)
0465	        BOTTLE=VOCAB('BOTT',1)
0466	        WATER=VOCAB('WATE',1)
0467	        OIL=VOCAB('OIL ',1)
0470	        PLANT=VOCAB('PLAN',1)
0471	        PLANT2=PLANT+1
0472	        AXE=VOCAB('AXE ',1)
0473	        MIRROR=VOCAB('MIRR',1)
0474	        DRAGON=VOCAB('DRAG',1)
0475	        CHASM=VOCAB('CHAS',1)
0476	        TROLL=VOCAB('TROL',1)
0477	        TROLL2=TROLL+1
0500	        BEAR=VOCAB('BEAR',1)
0501	        MESSAG=VOCAB('MESS',1)
0502	        VEND=VOCAB('VEND',1)
0503	        BATTER=VOCAB('BATT',1)
	C
	C  OBJECTS FROM 50 THROUGH WHATEVER ARE TREASURES.  HERE ARE A FEW.
	C
0504	        NUGGET=VOCAB('GOLD',1)
0505	        COINS=VOCAB('COIN',1)
0506	        CHEST=VOCAB('CHES',1)
0507	        EGGS=VOCAB('EGGS',1)
0510	        TRIDNT=VOCAB('TRID',1)
0511	        VASE=VOCAB('VASE',1)
0512	        EMRALD=VOCAB('EMER',1)
0513	        PYRAM=VOCAB('PYRA',1)
0514	        PEARL=VOCAB('PEAR',1)
0515	        RUG=VOCAB('RUG ',1)
        FORTRAN IV  V50-A (A6)  24-JUL-20 

0516	        CHAIN=VOCAB('CHAI',1)
	C
	C  THESE ARE MOTION-VERB NUMBERS.
	C
0517	        BACK=VOCAB('BACK',0)
0520	        LOOK=VOCAB('LOOK',0)
0521	        CAVE=VOCAB('CAVE',0)
0522	        NULL=VOCAB('NULL',0)
0523	        ENTRNC=VOCAB('ENTR',0)
0524	        DPRSSN=VOCAB('DEPR',0)
0525	        STREAM=VOCAB('STRE',0)
	C
	C  AND SOME ACTION VERBS.
	C
0526	        SAY=VOCAB('SAY ',2)
0527	        LOCK=VOCAB('LOCK',2)
0530	        THROW=VOCAB('THRO',2)
0531	        FIND=VOCAB('FIND',2)
0532	        INVENT=VOCAB('INVE',2)
	C
	C  INITIALISE THE DWARVES.  DLOC IS LOC OF DWARVES, HARD-WIRED IN.  ODLOC IS
	C  PRIOR LOC OF EACH DWARF, INITIALLY GARBAGE.  DALTLC IS ALTERNATE INITIAL LOC
	C  FOR DWARF, IN CASE ONE OF THEM STARTS OUT ON TOP OF THE ADVENTURER.  (NO 2
	C  OF THE 5 INITIAL LOCS ARE ADJACENT.)  DSEEN IS TRUE IF DWARF HAS SEEN HIM.
	C  DFLAG CONTROLS THE LEVEL OF ACTIVATION OF ALL THIS:
	C       0	NO DWARF STUFF YET (WAIT UNTIL REACHES HALL OF MISTS)
	C       1	REACHED HALL OF MISTS, BUT HASN'T MET FIRST DWARF
	C       2	MET FIRST DWARF, OTHERS START MOVING, NO KNIVES THROWN YET
	C       3	A KNIFE HAS BEEN THROWN (FIRST SET ALWAYS MISSES)
	C       3+	DWARVES ARE MAD (INCREASES THEIR ACCURACY)
	C  SIXTH DWARF IS SPECIAL (THE PIRATE).  HE ALWAYS STARTS AT HIS CHEST'S
	C  EVENTUAL LOCATION INSIDE THE MAZE.  THIS LOC IS SAVED IN CHLOC FOR REF.
	C  THE DEAD END IN THE OTHER MAZE HAS ITS LOC STORED IN CHLOC2.
	C
0533	        CHLOC=114
0534	        CHLOC2=140
0535	        DO 1700 I=1,6
0536	1700    DSEEN(I)=.FALSE.
0537	        DFLAG=0
0540	        DLOC(1)=19
0541	        DLOC(2)=27
0542	        DLOC(3)=33
0543	        DLOC(4)=44
0544	        DLOC(5)=64
0545	        DLOC(6)=CHLOC
0546	        DALTLC=18
	C
	C  OTHER RANDOM FLAGS AND COUNTERS, AS FOLLOWS:
	C       TURNS	TALLIES HOW MANY COMMANDS HE'S GIVEN (IGNORES YES/NO)
	C       LIMIT	LIFETIME OF LAMP (NOT SET HERE)
	C       KNFLOC	0 IF NO KNIFE HERE, LOC IF KNIFE HERE, -1 AFTER CAVEAT
	C       DETAIL	HOW OFTEN WE'VE SAID "NOT ALLOWED TO GIVE MORE DETAIL"
	C       ABBNUM	HOW OFTEN WE SHOULD PRINT NON-ABBREVIATED DESCRIPTIONS
	C       MAXDIE	NUMBER OF REINCARNATION MESSAGES AVAILABLE (UP TO 5)
	C       NUMDIE	NUMBER OF TIMES KILLED SO FAR
        FORTRAN IV  V50-A (A6)  24-JUL-20 

	C       HOLDNG	NUMBER OF OBJECTS BEING CARRIED
	C       DKILL	NUMBER OF DWARVES KILLED (UNUSED IN SCORING, NEEDED FOR MSG)
	C       FOOBAR	CURRENT PROGRESS IN SAYING "FEE FIE FOE FOO".
	C       BONUS	USED TO DETERMINE AMOUNT OF BONUS IF HE REACHES CLOSING
	C       CLOCK1	NUMBER OF TURNS FROM FINDING LAST TREASURE TILL CLOSING
	C       CLOCK2	NUMBER OF TURNS FROM FIRST WARNING TILL BLINDING FLASH
	C       LOGICALS WERE EXPLAINED EARLIER
	C
0547	        TURNS=0
0550	        LMWARN=.FALSE.
0551	        KNFLOC=0
0552	        DETAIL=0
0553	        ABBNUM=5
0554	        DO 1800 I=0,4
0555	1800    IF(RTEXT(2*I+81).NE.0)MAXDIE=I+1
0556	        NUMDIE=0
0557	        HOLDNG=0
0560	        DKILL=0
0561	        FOOBAR=0
0562	        BONUS=0
0563	        CLOCK1=30
0564	        CLOCK2=50
0565	        CLOSNG=.FALSE.
0566	        PANIC=.FALSE.
0567	        CLOSED=.FALSE.
0570	        GAVEUP=.FALSE.
0571	        SCORNG=.FALSE.
	C
	C
	C
	C  FINALLY, SINCE WE'RE CLEARLY SETTING THINGS UP FOR THE FIRST TIME...
	C
	C       PAUSE	'INIT DONE'
0572	        RETURN
0573	        END