C  ADVENTURES
	SUBROUTINE INIT
C
C MODIFIED BY KENT BLACKETT
C             ENGINEERING SYSTEMS GROUP
C             DIGITAL EQUIPMENT CORP.
C             15-JUL-77
C ORIGINAL VERSION WAS FOR DECSYSTEM-10
C THIS VERSION IS FOR FORTRAN IV-PLUS UNDER
C THE IAS OPERATING SYSTEM ON THE PDP-11/70
C NOTE THAT IT MUST BE COMPILED WITH THE
C /WF:3/I4 SWITCHES...
C

C  CURRENT LIMITS:
C	750 TRAVEL OPTIONS (TRAVEL, TRVSIZ).
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	 35 MAGIC MESSAGES (MTEXT, MAGSIZ).
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

	IMPLICIT INTEGER*4(A-Z)
C	INTEGER*2 KTAB,LTEXT,STEXT,KEY,COND,ABB,ATLOC,PLAC,PLACE,
C	1FIXD,FIXED,LINK,PTEXT,PROP,ACTSPK,RTEXT,CTEXT,CVAL,HINTLC,
C	2HINTS,MTEXT,TK,DLOC,ODLOC,ASCVAR
	LOGICAL DSEEN,BLKLIN,HINTED,YES,START
	LOGICAL TOTING,HERE,AT,BITSET,DARK,WZDARK,LMWARN,CLOSNG,PANIC,
	1       CLOSED,GAVEUP,SCORNG,DEMO,YEA

	COMMON /TXTCOM/ RTEXT,LINES,ASCVAR
	COMMON /BLKCOM/ BLKLIN
	COMMON /VOCCOM/ KTAB,ATAB,TABSIZ
	COMMON /PLACOM/ ATLOC,LINK,PLACE,FIXED,HOLDNG
	COMMON /MTXCOM/ MTEXT
	COMMON /PTXCOM/ PTEXT
	COMMON /ABBCOM/ ABB
	COMMON /WIZCOM/ WKDAY,WKEND,HOLID,HBEGIN,HEND,HNAME,
	1	SHORT,MAGIC,MAGNM,LATNCY,SAVED,SAVET,SETUP
	COMMON /MISCOM/ LINUSE,TRVS,CLSSES,OLDLOC,LOC,CVAL,TK,NEWLOC,
	1KEY,PLAC,FIXD,ACTSPK,COND,HINTS,HNTMAX,PROP,TALLY,TALLY2,
	2HINTLC,CHLOC,CHLOC2,DSEEN,DFLAG,DLOC,DALTLC,KEYS,LAMP,GRATE,
	3CAGE,ROD,ROD2,STEPS,BIRD,DOOR,PILLOW,SNAKE,FISSUR,TABLET,
	4CLAM,OYSTER,MAGZIN,DWARF,KNIFE,FOOD,BOTTLE,WATER,OIL,PLANT,
	5PLANT2,AXE,MIRROR,DRAGON,CHASM,TROLL,TROLL2,BEAR,MESSAG,VEND,
	6BATTER,NUGGET,COINS,CHEST,EGGS,TRIDNT,VASE,EMRALD,PYRAM,
	7PEARL,RUG,CHAIN,BACK,LOOK,CAVE,NULL,ENTRNC,DPRSSN,SAY,LOCK,
	8THROW,FIND,INVENT,TURNS,LMWARN,IWEST,KNFLOC,DETAIL,ABBNUM,
	9NUMDIE,MAXDIE,DKILL,FOOBAR,BONUS,CLOCK1,CLOCK2,
	1CLOSNG,PANIC,CLOSED,GAVEUP,SCORNG
	COMMON /MISC2/ I,RTXSIZ,CLSMAX,MAGSIZ,LOCSIZ,CTEXT,STEXT,LTEXT,
	1SECT,TRAVEL,TRVSIZ,TABNDX,OBJ,J,K,VERB,HNTSIZ,MAXTRS,
	2HINTED,HNTLOC,KK

	DIMENSION LINES(18)
	DIMENSION TRAVEL(750)
	DIMENSION KTAB(300),ATAB(300)
	DIMENSION LTEXT(150),STEXT(150),KEY(150),COND(150),ABB(150),
	1	ATLOC(150)
	DIMENSION PLAC(100),PLACE(100),FIXD(100),FIXED(100),LINK(200),
	1	PTEXT(100),PROP(100)
	DIMENSION ACTSPK(35)
	DIMENSION RTEXT(205)
	DIMENSION CTEXT(12),CVAL(12)
	DIMENSION HINTLC(20),HINTED(20),HINTS(20,4)
	DIMENSION MTEXT(35)
	DIMENSION TK(20),DSEEN(6),DLOC(6),ODLOC(6),HNAME(4)


C  STATEMENT FUNCTIONS
C
C
C  TOTING(OBJ)	= TRUE IF THE OBJ IS BEING CARRIED
C  HERE(OBJ)	= TRUE IF THE OBJ IS AT "LOC" (OR IS BEING CARRIED)
C  AT(OBJ)	= TRUE IF ON EITHER SIDE OF TWO-PLACED OBJECT
C  LIQ(DUMMY)	= OBJECT NUMBER OF LIQUID IN BOTTLE
C  LIQLOC(LOC)	= OBJECT NUMBER OF LIQUID (IF ANY) AT LOC
C  BITSET(L,N)	= TRUE IF COND(L) HAS BIT N SET (BIT 0 IS UNITS BIT)
C  FORCED(LOC)	= TRUE IF LOC MOVES WITHOUT ASKING FOR INPUT (COND=2)
C  DARK(DUMMY)	= TRUE IF LOCATION "LOC" IS DARK
C  PCT(N)       = TRUE N% OF THE TIME (N INTEGER FROM 0 TO 100)
C
C  WZDARK SAYS WHETHER THE LOC HE'S LEAVING WAS DARK
C  LMWARN SAYS WHETHER HE'S BEEN WARNED ABOUT LAMP GOING DIM
C  CLOSNG SAYS WHETHER ITS CLOSING TIME YET
C  PANIC SAYS WHETHER HE'S FOUND OUT HE'S TRAPPED IN THE CAVE
C  CLOSED SAYS WHETHER WE'RE ALL THE WAY CLOSED
C  GAVEUP SAYS WHETHER HE EXITED VIA "QUIT"
C  SCORNG INDICATES TO THE SCORE ROUTINE WHETHER WE'RE DOING A "SCORE" COMMAND
C  DEMO IS TRUE IF THIS IS A PRIME-TIME DEMONSTRATION GAME
C  YEA IS RANDOM YES/NO REPLY


	TOTING(OBJ)=PLACE(OBJ).EQ.-1
	HERE(OBJ)=PLACE(OBJ).EQ.LOC.OR.TOTING(OBJ)
	AT(OBJ)=PLACE(OBJ).EQ.LOC.OR.FIXED(OBJ).EQ.LOC
	LIQ2(PBOTL)=(1-PBOTL)*WATER+(PBOTL/2)*(WATER+OIL)
	LIQ(DUMMY)=LIQ2(MAX0(PROP(BOTTLE),-1-PROP(BOTTLE)))
	LIQLOC(LOC)=LIQ2((MOD(COND(LOC)/2*2,8)-5)*MOD(COND(LOC)/4,2)+1)
	BITSET(L,N)=(COND(L).AND.SHIFT(1,N)).NE.0
	FORCED(LOC)=COND(LOC).EQ.2
	DARK(DUMMY)=MOD(COND(LOC),2).EQ.0.AND.(PROP(LAMP).EQ.0.OR.
	1	.NOT.HERE(LAMP))
	PCT(N)=RAN(100).LT.N

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.
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  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).
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

	IF(SETUP.NE.0)GOTO 1100
	RTXSIZ = 205
	HNTSIZ = 20
	MAGSIZ = 35
	TRVSIZ = 750
	CLSMAX = 12
	TYPE 1000
1000	FORMAT(' HAVE PATIENCE.  IT TAKES A WHILE TO INITIALIZE...')

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.

	DO 1001 I=1,300
	IF(I.LE.100)PTEXT(I)=0
	IF(I.LE.RTXSIZ)RTEXT(I)=0
	IF(I.LE.CLSMAX)CTEXT(I)=0
	IF(I.LE.MAGSIZ)MTEXT(I)=0
	IF(I.GT.LOCSIZ)GOTO 1001
	STEXT(I)=0
	LTEXT(I)=0
	COND(I)=0
1001	CONTINUE

C	CALL ASSIGN(1,'TEXT.TXT')
	OPEN(UNIT=1,NAME='TEXT.TXT',TYPE='OLD',READONLY)
C	DEFINE FILE 2(2100,38,U,ASCVAR)
	OPEN(UNIT=2,NAME='ADVENT.DAT',TYPE='NEW',ACCESS='DIRECT'
	1,FORM='UNFORMATTED',RECORDSIZE=19,ASSOCIATEVARIABLE=ASCVAR
	2,DISPOSE='DELETE')
	ASCVAR = 1
	SETUP=1
	LINUSE=1
	TRVS=1
	CLSSES=1

C  START NEW DATA SECTION.  SECT IS THE SECTION NUMBER.

1002	READ(1,1003)SECT
1003	FORMAT(I7)
C	TYPE 10030,SECT
C10030	FORMAT(' NOW LOADING SECTION',I3)
	OLDLOC=-1
	GOTO(1100,1004,1004,1030,1040,1004,1004,1050,1060,1070,1004,
	1    1080,1004) (SECT+1)
C	      (0)  (1)  (2)  (3)  (4)  (5)  (6)  (7)  (8)  (9)  (10)
C	     (11) (12)
	CALL BUG(9)

C  SECTIONS 1, 2, 5, 6, 10, 12.  READ MESSAGES AND SET UP POINTERS.

1004	READ(1,1005) LOC,LINES
1005	FORMAT(I4,18A4)
	WRITE(2'ASCVAR) LOC,LINES
	LINUSE = ASCVAR-1
	IF(LOC .EQ. -1) GO TO 1002
	IF(LOC .EQ. OLDLOC) GO TO 1020
	IF(SECT.EQ.12)GOTO 1013
	IF(SECT.EQ.10)GOTO 1012
	IF(SECT.EQ.6)GOTO 1011
	IF(SECT.EQ.5)GOTO 1010
	IF(SECT.EQ.1)GOTO 1008

	STEXT(LOC)=LINUSE
	GOTO 1020

1008	LTEXT(LOC)=LINUSE
	GOTO 1020

1010	IF(LOC.GT.0.AND.LOC.LE.100)PTEXT(LOC)=LINUSE
	GOTO 1020

1011	IF(LOC .GT. RTXSIZ) TYPE*,LOC,RTXSIZ
	IF(LOC .GT. RTXSIZ) CALL BUG(6)
	RTEXT(LOC)=LINUSE
	GOTO 1020

1012	CTEXT(CLSSES)=LINUSE
	CVAL(CLSSES)=LOC
	CLSSES=CLSSES+1
	GOTO 1020

1013	IF(LOC.GT.MAGSIZ)CALL BUG(6)
	MTEXT(LOC)=LINUSE

1020	OLDLOC = LOC
	IF(LINUSE .GE. 2100) CALL BUG(2)
	GOTO 1004

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  NEWLOC*1000 + KEYWORD (FROM SECTION 4, MOTION VERBS), AND IS NEGATED IF
C  THIS IS THE LAST ENTRY FOR THIS LOCATION.  KEY(N) IS THE INDEX IN TRAVEL
C  OF THE FIRST OPTION AT LOCATION N.

1030	READ(1,1031)LOC,NEWLOC,TK
1031	FORMAT(99I10)
	IF(LOC.EQ.0)GOTO 1030
C  ABOVE KLUGE IS TO AVOID AFOREMENTIONED F40 BUG
	IF(LOC.EQ.-1)GOTO 1002
	IF(KEY(LOC).NE.0)GOTO 1033
	KEY(LOC)=TRVS
	GOTO 1035
1033	TRAVEL(TRVS-1)=-TRAVEL(TRVS-1)
1035	DO 1037 L=1,20
	IF(TK(L).EQ.0)GOTO 1039
	TRAVEL(TRVS)=NEWLOC*1000+TK(L)
	TRVS=TRVS+1
	IF(TRVS.EQ.TRVSIZ)CALL BUG(3)
1037	CONTINUE
1039	TRAVEL(TRVS-1)=-TRAVEL(TRVS-1)
	GOTO 1030

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.

1040	DO 1042 TABNDX=1,TABSIZ
1043	READ(1,1041)KTAB(TABNDX),ATAB(TABNDX)
1041	FORMAT(I10,A4)
	IF(KTAB(TABNDX).EQ.0)GOTO 1043
C  ABOVE KLUGE IS TO AVOID AFOREMENTIONED F40 BUG
	IF(KTAB(TABNDX).EQ.-1)GOTO 1002
1042	CONTINUE
	CALL BUG(4)

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.

1050	READ(1,1031)OBJ,J,K
	IF(OBJ.EQ.-1)GOTO 1002
	PLAC(OBJ)=J
	FIXD(OBJ)=K
	GOTO 1050

C  READ DEFAULT MESSAGE NUMBERS FOR ACTION VERBS, STORE IN ACTSPK.

1060	READ(1,1031)VERB,J
	IF(VERB.EQ.-1)GOTO 1002
	ACTSPK(VERB)=J
	GOTO 1060

C  READ INFO ABOUT AVAILABLE LIQUIDS AND OTHER CONDITIONS, STORE IN COND.

1070	READ(1,1031)K,TK
	IF(K.EQ.-1)GOTO 1002
	DO 1071 I=1,20
	LOC=TK(I)
	IF(LOC.EQ.0)GOTO 1070
	IF(BITSET(LOC,K))CALL BUG(8)
1071	COND(LOC)=COND(LOC)+SHIFT(1,K)
	GOTO 1070

C  READ DATA FOR HINTS.

1080	HNTMAX=0
1081	READ(1,1031)K,TK
	IF(K.EQ.-1)GOTO 1002
	IF(K.EQ.0)GOTO 1081
	IF(K.LT.0.OR.K.GT.HNTSIZ)CALL BUG(7)
	DO 1083 I=1,4
1083	HINTS(K,I)=TK(I)
	HNTMAX=MAX0(HNTMAX,K)
	GOTO 1081

C  FINISH CONSTRUCTING INTERNAL DATA FORMAT

C  IF SETUP=2 WE DON'T NEED TO DO THIS.  IT'S ONLY NECESSARY IF WE HAVEN'T DONE
C  IT AT ALL OR IF THE PROGRAM HAS BEEN RUN SINCE THEN.

1100	IF(SETUP.EQ.2)GOTO 1
	IF(SETUP.EQ.-1) GOTO1

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(OBJ) AS THE NEXT OBJECT AT THE SAME LOCATION
C  AS OBJ.  (OBJ>100 INDICATES THAT FIXED(OBJ-100)=LOC; LINK(OBJ) 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.

	DO 1101 I=1,100
	PLACE(I)=0
	PROP(I)=0
	LINK(I)=0
1101	LINK(I+100)=0

	DO 1102 I=1,LOCSIZ
	ABB(I)=0
	IF(LTEXT(I).EQ.0.OR.KEY(I).EQ.0)GOTO 1102
	K=KEY(I)
	IF(MOD(IABS(TRAVEL(K)),1000).EQ.1)COND(I)=2
1102	ATLOC(I)=0

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.

	DO 1106 I=1,100
	K=101-I
	IF(FIXD(K).LE.0)GOTO 1106
	CALL DROP(K+100,FIXD(K))
	CALL DROP(K,PLAC(K))
1106	CONTINUE

	DO 1107 I=1,100
	K=101-I
	FIXED(K)=FIXD(K)
1107	IF(PLAC(K).NE.0.AND.FIXD(K).LE.0)CALL DROP(K,PLAC(K))

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).

	MAXTRS=79
	TALLY=0
	TALLY2=0
	DO 1200 I=50,MAXTRS
	IF(PTEXT(I).NE.0)PROP(I)=-1
1200	TALLY=TALLY-PROP(I)

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.

	DO 1300 I=1,HNTMAX
	HINTED(I)=.FALSE.
1300	HINTLC(I)=0

C  DEFINE SOME HANDY MNEMONICS.  THESE CORRESPOND TO OBJECT NUMBERS.

	KEYS=VOCAB('KEYS',1)
	LAMP=VOCAB('LAMP',1)
	GRATE=VOCAB('GRAT',1)
	CAGE=VOCAB('CAGE',1)
	ROD=VOCAB('ROD ',1)
	ROD2=ROD+1
	STEPS=VOCAB('STEP',1)
	BIRD=VOCAB('BIRD',1)
	DOOR=VOCAB('DOOR',1)
	PILLOW=VOCAB('PILL',1)
	SNAKE=VOCAB('SNAK',1)
	FISSUR=VOCAB('FISS',1)
	TABLET=VOCAB('TABL',1)
	CLAM=VOCAB('CLAM',1)
	OYSTER=VOCAB('OYST',1)
	MAGZIN=VOCAB('MAGA',1)
	DWARF=VOCAB('DWAR',1)
	KNIFE=VOCAB('KNIF',1)
	FOOD=VOCAB('FOOD',1)
	BOTTLE=VOCAB('BOTT',1)
	WATER=VOCAB('WATE',1)
	OIL=VOCAB('OIL ',1)
	PLANT=VOCAB('PLAN',1)
	PLANT2=PLANT+1
	AXE=VOCAB('AXE ',1)
	MIRROR=VOCAB('MIRR',1)
	DRAGON=VOCAB('DRAG',1)
	CHASM=VOCAB('CHAS',1)
	TROLL=VOCAB('TROL',1)
	TROLL2=TROLL+1
	BEAR=VOCAB('BEAR',1)
	MESSAG=VOCAB('MESS',1)
	VEND=VOCAB('VEND',1)
	BATTER=VOCAB('BATT',1)

C  OBJECTS FROM 50 THROUGH WHATEVER ARE TREASURES.  HERE ARE A FEW.

	NUGGET=VOCAB('GOLD',1)
	COINS=VOCAB('COIN',1)
	CHEST=VOCAB('CHES',1)
	EGGS=VOCAB('EGGS',1)
	TRIDNT=VOCAB('TRID',1)
	VASE=VOCAB('VASE',1)
	EMRALD=VOCAB('EMER',1)
	PYRAM=VOCAB('PYRA',1)
	PEARL=VOCAB('PEAR',1)
	RUG=VOCAB('RUG ',1)
	CHAIN=VOCAB('CHAI',1)

C  THESE ARE MOTION-VERB NUMBERS.

	BACK=VOCAB('BACK',0)
	LOOK=VOCAB('LOOK',0)
	CAVE=VOCAB('CAVE',0)
	NULL=VOCAB('NULL',0)
	ENTRNC=VOCAB('ENTR',0)
	DPRSSN=VOCAB('DEPR',0)

C  AND SOME ACTION VERBS.

	SAY=VOCAB('SAY ',2)
	LOCK=VOCAB('LOCK',2)
	THROW=VOCAB('THRO',2)
	FIND=VOCAB('FIND',2)
	INVENT=VOCAB('INVE',2)

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.

	CHLOC=114
	CHLOC2=140
	DO 1700 I=1,6
1700	DSEEN(I)=.FALSE.
	DFLAG=0
	DLOC(1)=19
	DLOC(2)=27
	DLOC(3)=33
	DLOC(4)=44
	DLOC(5)=64
	DLOC(6)=CHLOC
	DALTLC=18

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	IWEST	HOW MANY TIMES HE'S SAID "WEST" INSTEAD OF "W"
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
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

	TURNS=0
	LMWARN=.FALSE.
	IWEST=0
	KNFLOC=0
	DETAIL=0
	ABBNUM=5
	DO 1800 I=0,4
1800	IF(RTEXT(2*I+81).NE.0)MAXDIE=I+1
	NUMDIE=0
	HOLDNG=0
	DKILL=0
	FOOBAR=0
	BONUS=0
	CLOCK1=30
	CLOCK2=50
	SAVED=0
	CLOSNG=.FALSE.
	PANIC=.FALSE.
	CLOSED=.FALSE.
	GAVEUP=.FALSE.
	SCORNG=.FALSE.

C  IF SETUP=1, REPORT ON AMOUNT OF ARRAYS ACTUALLY USED, TO PERMIT REDUCTIONS.

	IF(SETUP.NE.1)GOTO 1
	SETUP=2

	DO 1998 K=1,LOCSIZ
	KK=LOCSIZ+1-K
	IF(LTEXT(KK).NE.0)GOTO 1997
1998	CONTINUE

	OBJ=0
1997	DO 1996 K=1,100
1996	IF(PTEXT(K).NE.0)OBJ=OBJ+1

	DO 1995 K=1,TABNDX
1995	IF(KTAB(K)/1000.EQ.2)VERB=KTAB(K)-2000

	DO 1994 K=1,RTXSIZ
	J=RTXSIZ+1-K
	IF(RTEXT(J).NE.0)GOTO 1993
1994	CONTINUE

1993	DO 1992 K=1,MAGSIZ
	I=MAGSIZ+1-K
	IF(MTEXT(I).NE.0)GOTO 1991
1992	CONTINUE

1991	K=100
C	TYPE 1999,LINUSE,LINSIZ,TRVS,TRVSIZ,TABNDX,TABSIZ,KK
C	1	,LOCSIZ,OBJ,K,VERB,VRBSIZ,J,RTXSIZ,CLSSES,CLSMAX
C	2	,HNTMAX,HNTSIZ,I,MAGSIZ
1999	FORMAT (' TABLE SPACE USED:'/
	1	' ',I6,' OF ',I6,' WORDS OF MESSAGES'/
	2	' ',I6,' OF ',I6,' TRAVEL OPTIONS'/
	3	' ',I6,' OF ',I6,' VOCABULARY WORDS'/
	4	' ',I6,' OF ',I6,' LOCATIONS'/
	5	' ',I6,' OF ',I6,' OBJECTS'/
	6	' ',I6,' OF ',I6,' ACTION VERBS'/
	7	' ',I6,' OF ',I6,' RTEXT MESSAGES'/
	8	' ',I6,' OF ',I6,' CLASS MESSAGES'/
	9	' ',I6,' OF ',I6,' HINTS'/
	1	' ',I6,' OF ',I6,' MAGIC MESSAGES'/
	2	)

C  FINALLY, SINCE WE'RE CLEARLY SETTING THINGS UP FOR THE FIRST TIME...

	CALL POOF
	LOC = 1
C	PAUSE 'INIT DONE'
1	CLOSE( UNIT=1 )
	RETURN
	END
