maindec: Added the usual collection, with intact symlinks
[pdp8.git] / sw / adventure / INITAD.FT
1 C ADVENTURES
2 SUBROUTINE INIT
3 C
4 C MODIFIED BY KENT BLACKETT
5 C ENGINEERING SYSTEMS GROUP
6 C DIGITAL EQUIPMENT CORP.
7 C 15-JUL-77
8 C MODIFIED BY BOB SUPNIK
9 C DISK ENGINEERING
10 C 21-OCT-77
11 C MODIFIED BY BOB SUPNIK
12 C DISK ENGINEERING
13 C 25-AUG-78
14 C MODIFIED BY BOB SUPNIK
15 C SMALL SYSTEMS
16 C 12-NOV-78
17 C ORIGINAL VERSION WAS FOR DECSYSTEM-10
18 C NEXT VERSION WAS FOR FORTRAN IV-PLUS UNDER
19 C THE IAS OPERATING SYSTEM ON THE PDP-11/70
20 C THIS VERSION IS FOR FORTRAN IV (V01C OR LATER)
21 C UNDER RT-11 ON *ANY* PDP-11
22 C
23 C
24 C CURRENT LIMITS:
25 C 300 VOCABULARY WORDS (KTAB, ATAB, TABSIZ).
26 C 150 LOCATIONS (LTEXT, STEXT, KEY, COND, ABB, ATLOC, LOCSIZ).
27 C 100 OBJECTS (PLAC, PLACE, FIXD, FIXED, LINK (TWICE), PTEXT, PROP).
28 C 35 "ACTION" VERBS (ACTSPK, VRBSIZ).
29 C 205 RANDOM MESSAGES (RTEXT, RTXSIZ).
30 C 12 DIFFERENT PLAYER CLASSIFICATIONS (CTEXT, CVAL, CLSMAX).
31 C 20 HINTS, LESS 3 (HINTLC, HINTED, HINTS, HNTSIZ).
32 C THERE ARE ALSO LIMITS WHICH CANNOT BE EXCEEDED DUE TO THE STRUCTURE OF
33 C THE DATABASE. (E.G., THE VOCABULARY USES N/1000 TO DETERMINE WORD TYPE,
34 C SO THERE CAN'T BE MORE THAN 1000 WORDS.) THESE UPPER LIMITS ARE:
35 C 1000 NON-SYNONYMOUS VOCABULARY WORDS
36 C 300 LOCATIONS
37 C 100 OBJECTS
38 C
39 C IMPLICIT INTEGER (A-Z)
40 LOGICAL LMWARN,CLOSNG,PANIC,HINTED,
41 1 CLOSED,GAVEUP,SCORNG,DSEEN,BITSET
42 C
43 LOGICAL WRITN
44 COMMON /VERSN/ VMAJ, VMIN, VEDIT
45 COMMON /FILES/ INDXNM, TEXTNM, SAVENM, INPTNM
46 COMMON /TXTCOM/ RTEXT,LINES,ASCVAR,TXTLOC,DATA
47 COMMON /VOCCOM/ KTAB,ATAB,TABSIZ
48 COMMON /PLACOM/ ATLOC,LINK,PLACE,FIXED,HOLDNG
49 COMMON /PTXCOM/ PTEXT
50 COMMON /ABBCOM/ ABB
51 COMMON /MISCOM/ LINUSE,TRVS,CLSSES,OLDLOC,LOC,CVAL,TK,NEWLOC,
52 1 KEY,PLAC,FIXD,ACTSPK,COND,HINTS,HNTMAX,PROP,TALLY,TALLY2,
53 2 HINTLC,CHLOC,CHLOC2,DSEEN,DFLAG,DLOC,DALTLC,KEYS,LAMP,GRATE
54 COMMON /MISCOM/
55 3 CAGE,ROD,ROD2,STEPS,BIRD,DOOR,PILLOW,SNAKE,FISSUR,TABLET,
56 4 CLAM,OYSTER,MAGZIN,DWARF,KNIFE,FOOD,BOTTLE,WATER,OIL,PLANT,
57 5 PLANT2,AXE,MIRROR,DRAGON,CHASM,TROLL,TROLL2,BEAR,MESSAG,VEND,
58 6 BATTER,NUGGET,COINS,CHEST,EGGS,TRIDNT,VASE,EMRALD,PYRAM
59 COMMON /MISCOM/
60 7 PEARL,RUG,CHAIN,BACK,LOOK,CAVE,NULL,ENTRNC,DPRSSN,SAY,LOCK,
61 8 THROW,FIND,INVENT,TURNS,LMWARN,KNFLOC,DETAIL,ABBNUM,
62 9 NUMDIE,MAXDIE,DKILL,FOOBAR,BONUS,CLOCK1,CLOCK2,
63 1 CLOSNG,PANIC,CLOSED,GAVEUP,SCORNG,ODLOC,STREAM,SPICES
64 COMMON /MISC2/ I,RTXSIZ,CLSMAX,LOCSIZ,CTEXT,STEXT,LTEXT,
65 1 SECT,TRAVEL,TRVCON,TRVLOC,TRVSIZ,TABNDX,OBJ,J,K,VERB,HNTSIZ,
66 2 MAXTRS,HINTED,HNTLOC,KK
67 C
68 INTEGER LINES(12),DATA(78)
69 C The TRAVEL, TRVCON, and TRVLOC arrays are
70 C Packed with words 0,1,2 holding the data. Saves lots
71 C of wasted space at the expense of some complexity.
72 INTEGER TRAVEL(250), TRVCON(250), TRVLOC(250), TRVSIZ
73 INTEGER KTAB(300),ATAB(300),TABSIZ
74 INTEGER LTEXT(150),STEXT(150),KEY(150),COND(150),ABB(150),
75 1 ATLOC(150)
76 INTEGER PLAC(100),PLACE(100),FIXD(100),FIXED(100),LINK(200),
77 1 PTEXT(100),PROP(100),HOLDNG
78 INTEGER ACTSPK(35)
79 INTEGER RTEXT(205)
80 INTEGER CTEXT(12),CVAL(12)
81 INTEGER HINTLC(20),HINTS(20,4)
82 DIMENSION HINTED(20)
83 INTEGER TK(20),DLOC(6),ODLOC(6)
84 DIMENSION DSEEN(6)
85 INTEGER ASCVAR, TXTLOC, TRVS, CLSSES, OLDLOC
86 INTEGER HNTSIZ, HNTMAX, TALLY, TALLY2, CHLOC, CHLOC2, DFLAG
87 INTEGER DALTLC,GRATE,CAGE,ROD,ROD2,STEPS,BIRD,DOOR,PILLOW,SNAKE
88 INTEGER FISSUR,TABLET,CLAM,OYSTER,MAGZIN,DWARF,KNIFE,FOOD,BOTTLE
89 INTEGER WATER,OIL,PLANT,PLANT2,AXE,MIRROR,DRAGON,CHASM
90 INTEGER BEAR,MESSAG,VEND,BATTER,COINS,CHEST,EGGS,TRIDNT,VASE,EMRALD
91 INTEGER PYRAM,PEARL,RUG,CHAIN,BACK,LOOK,CAVE,NULL,ENTRNC,DPRSSN,SAY
92 INTEGER LOCK,THROW,FIND,INVENT,TURNS,KNFLOC,DETAIL,ABBNUM
93 INTEGER NUMDIE,MAXDIE,DKILL,FOOBAR,BONUS,CLOCK1,CLOCK2
94 INTEGER TROLL,TROLL2,STREAM,SPICES
95 INTEGER RTXSIZ,CLSMAX,LOCSIZ,SECT,TABNDX,OBJ
96 INTEGER VERB,HNTLOC,KK
97 INTEGER INDXNM(3),TEXTNM(3),SAVENM(3),INPTNM(3),CODE,NAME(3)
98 C
99 C
100 C ISHFT(NUMBER,IPOSIT)=NUMBER*(2**IPOSIT)
101 C BITSET(L,N)=(COND(L).AND.ISHFT(1,N)).NE.0
102 \fC DESCRIPTION OF THE DATABASE FORMAT
103 C
104 C
105 C THE DATA FILE CONTAINS SEVERAL SECTIONS. EACH BEGINS WITH A LINE CONTAINING
106 C A NUMBER IDENTIFYING THE SECTION, AND ENDS WITH A LINE CONTAINING "-1".
107 C
108 C SECTION 1: LONG FORM DESCRIPTIONS. EACH LINE CONTAINS A LOCATION NUMBER,
109 C A COMMA, AND A LINE OF TEXT. THE SET OF (NECESSARILY ADJACENT) LINES
110 C WHOSE NUMBERS ARE X FORM THE LONG DESCRIPTION OF LOCATION X.
111 C SECTION 2: SHORT FORM DESCRIPTIONS. SAME FORMAT AS LONG FORM. NOT ALL
112 C PLACES HAVE SHORT DESCRIPTIONS.
113 C SECTION 3: TRAVEL TABLE. EACH LINE CONTAINS A LOCATION NUMBER (X), A SECOND
114 C LOCATION NUMBER (Y), AND A LIST OF MOTION NUMBERS (SEE SECTION 4).
115 C EACH MOTION REPRESENTS A VERB WHICH WILL GO TO Y IF CURRENTLY AT X.
116 C Y, IN TURN, IS INTERPRETED AS FOLLOWS. LET M=Y/1000, N=Y MOD 1000.
117 C IF N<=300 IT IS THE LOCATION TO GO TO.
118 C IF 300<N<=500 N-300 IS USED IN A COMPUTED GOTO TO
119 C A SECTION OF SPECIAL CODE.
120 C IF N>500 MESSAGE N-500 FROM SECTION 6 IS PRINTED,
121 C AND HE STAYS WHEREVER HE IS.
122 C MEANWHILE, M SPECIFIES THE CONDITIONS ON THE MOTION.
123 C IF M=0 IT'S UNCONDITIONAL.
124 C IF 0<M<100 IT IS DONE WITH M% PROBABILITY.
125 C IF M=100 UNCONDITIONAL, BUT FORBIDDEN TO DWARVES.
126 C IF 100<M<=200 HE MUST BE CARRYING OBJECT M-100.
127 C IF 200<M<=300 MUST BE CARRYING OR IN SAME ROOM AS M-200.
128 C IF 300<M<=400 PROP(M MOD 100) MUST *NOT* BE 0.
129 C IF 400<M<=500 PROP(M MOD 100) MUST *NOT* BE 1.
130 C IF 500<M<=600 PROP(M MOD 100) MUST *NOT* BE 2, ETC.
131 C IF THE CONDITION (IF ANY) IS NOT MET, THEN THE NEXT *DIFFERENT*
132 C "DESTINATION" VALUE IS USED (UNLESS IT FAILS TO MEET *ITS* CONDITIONS,
133 C IN WHICH CASE THE NEXT IS FOUND, ETC.). TYPICALLY, THE NEXT DEST WILL
134 C BE FOR ONE OF THE SAME VERBS, SO THAT ITS ONLY USE IS AS THE ALTERNATE
135 C DESTINATION FOR THOSE VERBS. FOR INSTANCE:
136 C 15 110022 29 31 34 35 23 43
137 C 15 14 29
138 C THIS SAYS THAT, FROM LOC 15, ANY OF THE VERBS 29, 31, ETC., WILL TAKE
139 C HIM TO 22 IF HE'S CARRYING OBJECT 10, AND OTHERWISE WILL GO TO 14.
140 C 11 303008 49
141 C 11 9 50
142 C THIS SAYS THAT, FROM 11, 49 TAKES HIM TO 8 UNLESS PROP(3)=0, IN WHICH
143 C CASE HE GOES TO 9. VERB 50 TAKES HIM TO 9 REGARDLESS OF PROP(3).
144 C
145 C IN THIS IMPLEMENTATION, THE SECOND LOCATION NUMBER Y HAS BEEN
146 C SPLIT INTO M, CONDITIONS, AND N, LOCATION.
147 C
148 C SECTION 4: VOCABULARY. EACH LINE CONTAINS A NUMBER (N), A TAB, AND A
149 C FIVE-LETTER WORD. CALL M=N/1000. IF M=0, THEN THE WORD IS A MOTION
150 C VERB FOR USE IN TRAVELLING (SEE SECTION 3). ELSE, IF M=1, THE WORD IS
151 C AN OBJECT. ELSE, IF M=2, THE WORD IS AN ACTION VERB (SUCH AS "CARRY"
152 C OR "ATTACK"). ELSE, IF M=3, THE WORD IS A SPECIAL CASE VERB (SUCH AS
153 C "DIG") AND N MOD 1000 IS AN INDEX INTO SECTION 6. OBJECTS FROM 50 TO
154 C (CURRENTLY, ANYWAY) 79 ARE CONSIDERED TREASURES (FOR PIRATE, CLOSEOUT).
155 C SECTION 5: OBJECT DESCRIPTIONS. EACH LINE CONTAINS A NUMBER (N), A TAB,
156 C AND A MESSAGE. IF N IS FROM 1 TO 100, THE MESSAGE IS THE "INVENTORY"
157 C MESSAGE FOR OBJECT N. OTHERWISE, N SHOULD BE 000, 100, 200, ETC., AND
158 C THE MESSAGE SHOULD BE THE DESCRIPTION OF THE PRECEDING OBJECT WHEN ITS
159 C PROP VALUE IS N/100. THE N/100 IS USED ONLY TO DISTINGUISH MULTIPLE
160 C MESSAGES FROM MULTI-LINE MESSAGES; THE PROP INFO ACTUALLY REQUIRES ALL
161 C MESSAGES FOR AN OBJECT TO BE PRESENT AND CONSECUTIVE. PROPERTIES WHICH
162 C PRODUCE NO MESSAGE SHOULD BE GIVEN THE MESSAGE ">$<".
163 C SECTION 6: ARBITRARY MESSAGES. SAME FORMAT AS SECTIONS 1, 2, AND 5, EXCEPT
164 C THE NUMBERS BEAR NO RELATION TO ANYTHING (EXCEPT FOR SPECIAL VERBS
165 C IN SECTION 4).
166 C SECTION 7: OBJECT LOCATIONS. EACH LINE CONTAINS AN OBJECT NUMBER AND ITS
167 C INITIAL LOCATION (ZERO (OR OMITTED) IF NONE). IF THE OBJECT IS
168 C IMMOVABLE, THE LOCATION IS FOLLOWED BY A "-1". IF IT HAS TWO LOCATIONS
169 C (E.G. THE GRATE) THE FIRST LOCATION IS FOLLOWED WITH THE SECOND, AND
170 C THE OBJECT IS ASSUMED TO BE IMMOVABLE.
171 C SECTION 8: ACTION DEFAULTS. EACH LINE CONTAINS AN "ACTION-VERB" NUMBER AND
172 C THE INDEX (IN SECTION 6) OF THE DEFAULT MESSAGE FOR THE VERB.
173 C SECTION 9: LIQUID ASSETS, ETC. EACH LINE CONTAINS A NUMBER (N) AND UP TO 20
174 C LOCATION NUMBERS. BIT N (WHERE 0 IS THE UNITS BIT) IS SET IN COND(LOC)
175 C FOR EACH LOC GIVEN. THE COND BITS CURRENTLY ASSIGNED ARE:
176 C 0 LIGHT
177 C 1 IF BIT 2 IS ON: ON FOR OIL, OFF FOR WATER
178 C 2 LIQUID ASSET, SEE BIT 1
179 C 3 PIRATE DOESN'T GO HERE UNLESS FOLLOWING PLAYER
180 C OTHER BITS ARE USED TO INDICATE AREAS OF INTEREST TO "HINT" ROUTINES:
181 C 4 TRYING TO GET INTO CAVE
182 C 5 TRYING TO CATCH BIRD
183 C 6 TRYING TO DEAL WITH SNAKE
184 C 7 LOST IN MAZE
185 C 8 PONDERING DARK ROOM
186 C 9 AT WITT'S END
187 C COND(LOC) IS SET TO 2, OVERRIDING ALL OTHER BITS, IF LOC HAS FORCED
188 C MOTION.
189 C SECTION 10: CLASS MESSAGES. EACH LINE CONTAINS A NUMBER (N), A TAB, AND A
190 C MESSAGE DESCRIBING A CLASSIFICATION OF PLAYER. THE SCORING SECTION
191 C SELECTS THE APPROPRIATE MESSAGE, WHERE EACH MESSAGE IS CONSIDERED TO
192 C APPLY TO PLAYERS WHOSE SCORES ARE HIGHER THAN THE PREVIOUS N BUT NOT
193 C HIGHER THAN THIS N. NOTE THAT THESE SCORES PROBABLY CHANGE WITH EVERY
194 C MODIFICATION (AND PARTICULARLY EXPANSION) OF THE PROGRAM.
195 C SECTION 11: HINTS. EACH LINE CONTAINS A HINT NUMBER (CORRESPONDING TO A
196 C COND BIT, SEE SECTION 9), THE NUMBER OF TURNS HE MUST BE AT THE RIGHT
197 C LOC(S) BEFORE TRIGGERING THE HINT, THE POINTS DEDUCTED FOR TAKING THE
198 C HINT, THE MESSAGE NUMBER (SECTION 6) OF THE QUESTION, AND THE MESSAGE
199 C NUMBER OF THE HINT. THESE VALUES ARE STASHED IN THE "HINTS" ARRAY.
200 C HNTMAX IS SET TO THE MAX HINT NUMBER (<= HNTSIZ). NUMBERS 1-3 ARE
201 C UNUSABLE SINCE COND BITS ARE OTHERWISE ASSIGNED, SO 2 IS USED TO
202 C REMEMBER IF HE'S READ THE CLUE IN THE REPOSITORY, AND 3 IS USED TO
203 C REMEMBER WHETHER HE ASKED FOR INSTRUCTIONS (GETS MORE TURNS, BUT LOSES
204 C POINTS).
205 C SECTION 12: MAGIC MESSAGES. IDENTICAL TO SECTION 6 EXCEPT PUT IN A SEPARATE
206 C SECTION FOR EASIER REFERENCE. MAGIC MESSAGES ARE USED BY THE STARTUP,
207 C MAINTENANCE MODE, AND RELATED ROUTINES.
208 C SECTION 0: END OF DATABASE.
209 \fC READ THE DATABASE IF WE HAVE NOT YET DONE SO
210 C
211 ISEED=0
212 C
213 C FILSIZ Was 900 for RT-11 but we pack 6 records per.
214 C
215 FILSIZ=150
216 TABSIZ=300
217 LOCSIZ=150
218 VRBSIZ=35
219 RTXSIZ = 205
220 HNTSIZ = 20
221 MAGSIZ = 35
222 TRVSIZ = 750
223 CLSMAX = 12
224 C VCNT = 0
225 CDEBUG WRITE(4,1000)
226 CDEBUG1000 FORMAT(' INITIALIZING...')
227 C
228 C FIRST, TRY TO RESTORE PRE-EXISTING COPY OF DATA BASE
229 C
230 CALL USR(6,'ADVENT.IN',2,ERR)
231 IF (ERR .EQ. 0) GOTO 30
232 20 CALL SIXOUT('L]OCATION OF TEXT DATABASE ([ATEXT.DA]) >',21,2)
233 WRITE(4,121)
234 121 FORMAT('+',$)
235 READ(4,21) TEXTNM
236 21 FORMAT(3A6)
237 IF (TEXTNM(1) .NE. ' ') GOTO 22
238 TEXTNM(1) = 'ATEXT.'
239 TEXTNM(2) = 'DA'
240 TEXTNM(3) = ' '
241 22 CALL SIXOUT('L]OCATION OF TEXT INDEX ([AINDX.DA]) >',21,2)
242 WRITE(4,121)
243 READ(4,21) INDXNM
244 IF (INDXNM(1) .NE. ' ') GOTO 23
245 INDXNM(1) = 'AINDX.'
246 INDXNM(2) = 'DA'
247 INDXNM(3) = ' '
248 23 CALL SIXOUT('L]OCATION OF SAVED GAMES ([ASAVE.DA]) >',21,2)
249 WRITE(4,121)
250 READ(4,21) SAVENM
251 IF (SAVENM(1) .NE. ' ') GOTO 24
252 SAVENM(1) = 'ASAVE.'
253 SAVENM(2) = 'DA'
254 SAVENM(3) = ' '
255 24 CALL SIXOUT('L]OCATION OF TEXT INPUT ([ADVENT.TX]) >',21,2)
256 WRITE(4,121)
257 READ(4,21)INPTNM
258 IF (INPTNM(1) .NE. ' ') GOTO 25
259 INPTNM(1) = 'ADVENT'
260 INPTNM(2) = '.TX'
261 INPTNM(3) = ' '
262 25 CONTINUE
263
264 CALL USR(6, 'ADVENT.IN',3,ERR)
265 IF (ERR .NE. 0) WRITE(4,28)
266
267 28 FORMAT(' CAN''T SAVE SETTINGS IN ADVENT.IN')
268 IF (ERR.NE.0) GOTO 40
269
270 WRITE(6, 29)INDXNM,TEXTNM,SAVENM,INPTNM
271 29 FORMAT(' ADVENTURE SETUP FILE',/,
272 1 'INDX=',3A6,/,'TEXT=',3A6,/,'SAVE=',3A6,/,'INPT=',3A6)
273 CALL USR(6, 'ADVENT.IN',4,ERR)
274 GOTO 40
275
276 30 INDXNM(1) = 'AINDX.'
277 INDXNM(2) = 'DA'
278 INDXNM(3) = ' '
279 TEXTNM(1) = 'ATEXT.'
280 TEXTNM(2) = 'DA'
281 TEXTNM(3) = ' '
282 SAVENM(1) = 'ASAVE.'
283 SAVENM(2) = 'DA'
284 SAVENM(3) = ' '
285 INPTNM(1) = 'ADVENT'
286 INPTNM(2) = '.TX'
287 INPTNM(3) = ' '
288 31 CALL CHKEOF(EOF)
289 READ(6, 32) CODE, NAME
290 IF (EOF .NE. 0) GOTO 34
291 32 FORMAT(A4,1X,3A6)
292 DO 33 I = 1, 3
293 IF (CODE .EQ. 'INDX') INDXNM(I) = NAME(I)
294 IF (CODE .EQ. 'TEXT') TEXTNM(I) = NAME(I)
295 IF (CODE .EQ. 'SAVE') SAVENM(I) = NAME(I)
296 IF (CODE .EQ. 'INPT') INPTNM(I) = NAME(I)
297 33 CONTINUE
298 GO TO 31
299
300 34 CONTINUE
301 40 CALL RSTRGM(.FALSE.,I)
302 IF(I.NE.0) GO TO 10
303 CALL USR(8, TEXTNM, 2, ERR)
304 C
305 C If that can't be opened for input, gotta rebuild
306 C
307 IF (ERR.NE.0) GOTO 10
308 C
309 C Hack to set the DEFINE FILE stuff up
310 C
311 CALL SETIDL
312 C CALL USR(6, 'ADVENT.TX', 2, ERR)
313 C IF (ERR.EQ.0) GOTO 1235
314 C CALL SIXOUT('C]AN''T OPEN [ADVENT.TX] FOR INPUT, QUITTING!',23,0)
315 C STOP
316
317 1235 WRITN = .FALSE.
318 GO TO 5000
319 C
320 C CLEAR OUT THE VARIOUS TEXT-POINTER ARRAYS. ALL TEXT IS STORED IN DISK
321 C FILE (RANDOM ACCESS ON UNIT 2). THE TEXT-POINTER ARRAYS CONTAIN RECORD
322 C NUMBERS IN THE FILE. STEXT(N) IS SHORT DESCRIPTION OF LOCATION N.
323 C LTEXT(N) IS LONG DESCRIPTION. PTEXT(N) POINTS TO MESSAGE FOR PROP(N)=0.
324 C SUCCESSIVE PROP MESSAGES ARE FOUND BY CHASING POINTERS. RTEXT CONTAINS
325 C SECTION 6'S STUFF. CTEXT(N) POINTS TO A PLAYER-CLASS MESSAGE. MTEXT IS FOR
326 C SECTION 12. WE ALSO CLEAR COND. SEE DESCRIPTION OF SECTION 9 FOR DETAILS.
327 C
328 WRITN = .TRUE.
329 10 DO 1001 I=1,TABSIZ
330 KTAB(I)=0
331 ATAB(I)=0
332 C
333 C A2TAB not used on the '8
334 C A2TAB(I)=0
335 IF(I.GT.100) GO TO 1990
336 PTEXT(I)=0
337 PROP(I)=0
338 PLAC(I)=0
339 PLACE(I)=0
340 FIXD(I)=0
341 FIXED(I)=0
342 LINK(I)=0
343 LINK(I+100)=0
344 1990 IF(I.LE.RTXSIZ)RTEXT(I)=0
345 IF(I.LE.CLSMAX)CTEXT(I)=0
346 C IF(I.LE.MAGSIZ)MTEXT(I)=0
347 IF(I.LE.VRBSIZ)ACTSPK(I)=0
348 IF(I.GT.LOCSIZ)GOTO 1001
349 KEY(I)=0
350 ABB(I)=0
351 ATLOC(I)=0
352 STEXT(I)=0
353 LTEXT(I)=0
354 COND(I)=0
355 1001 CONTINUE
356 C
357 CALL USR(6, INPTNM, 2, ERR)
358 IF(ERR.EQ.0)GOTO 1236
359 CALL SIXOUT('C]AN''T OPEN ',6,2)
360 CALL SIXOUT(INPTNM, 9, 3)
361 CALL SIXOUT(' ]FOR INPUT!',6,1)
362 STOP
363 1236 CALL USR(8, TEXTNM, 3, ERR)
364 IF (ERR.EQ.0) GOTO 1237
365 CALL SIXOUT('C]AN''T OPEN ',6,2)
366 CALL SIXOUT(TEXTNM, 9, 3)
367 CALL SIXOUT(' ]FOR OUTPUT',6,1)
368 STOP
369 1237 DEFINE FILE 8(FILSIZ,78,U,RECORD)
370 RECORD = 1
371 ASCVAR = 1
372 LINUSE=1
373 TRVS=1
374 CLSSES=1
375 C
376 C START NEW DATA SECTION. ISECT IS THE SECTION NUMBER.
377 C
378 1002 READ(6,1003)ISECT
379 1003 FORMAT(I5)
380 CDEBUG WRITE(4,930)ISECT
381 CDEBUG930 FORMAT(' NOW LOADING SECTION',I3)
382 OLDLOC=-1
383 GOTO(1100,1004,1004,1030,1040,1004,1004,1050,1060,1070,1004,
384 1 1080,1004) (ISECT+1)
385 C (0) (1) (2) (3) (4) (5) (6) (7) (8) (9) (10)
386 C (11) (12)
387 CALL BUG(9)
388 C
389 C SECTIONS 1, 2, 5, 6, 10, 12. READ MESSAGES AND SET UP POINTERS.
390 C
391 1004 READ(6,1005) LOC,LINES
392 1005 FORMAT(I4,12A6)
393 C WRITE(8'ASCVAR) LOC,LINES
394 MULT = 13 * MOD(ASCVAR-1,6)+1
395 DATA(MULT) = LOC
396 DO 1006 I = 1,12
397 1006 DATA(I+MULT) = LINES(I)
398 ASCVAR = ASCVAR + 1
399 IF (MOD(ASCVAR,6) .EQ. 0) WRITE(8'RECORD)DATA
400 1007 LINUSE = ASCVAR-1
401 IF(LOC .EQ. -1) GO TO 1002
402 IF(LOC .EQ. OLDLOC) GO TO 1020
403 IF(ISECT.EQ.12)GOTO 1020
404 IF(ISECT.EQ.10)GOTO 1012
405 IF(ISECT.EQ.6)GOTO 1011
406 IF(ISECT.EQ.5)GOTO 1010
407 IF(ISECT.EQ.1)GOTO 1008
408 C
409 IF(LOC.GT.LOCSIZ) CALL BUG(11)
410 STEXT(LOC)=LINUSE
411 GOTO 1020
412 C
413 1008 IF(LOC.GT.LOCSIZ) CALL BUG(11)
414 LTEXT(LOC)=LINUSE
415 GOTO 1020
416 C
417 1010 IF(LOC.GT.0.AND.LOC.LE.100)PTEXT(LOC)=LINUSE
418 GOTO 1020
419 C
420 1011 IF(LOC .GT. RTXSIZ) CALL BUG(6)
421 RTEXT(LOC)=LINUSE
422 GOTO 1020
423 C
424 1012 IF(CLSSES.GT.CLSMAX) CALL BUG(12)
425 CTEXT(CLSSES)=LINUSE
426 CVAL(CLSSES)=LOC
427 CLSSES=CLSSES+1
428 C GOTO 1020
429 C1013
430 C IF(LOC.GT.MAGSIZ)CALL BUG(6)
431 C MTEXT(LOC)=LINUSE
432 C
433 1020 OLDLOC = LOC
434 IF(RECORD .GE. FILSIZ) CALL BUG(2)
435 GOTO 1004
436 C
437 C THE STUFF FOR SECTION 3 IS ENCODED HERE. EACH "FROM-LOCATION" GETS A
438 C CONTIGUOUS SECTION OF THE "TRAVEL" ARRAY. EACH ENTRY IN TRAVEL IS
439 C KEYWORD (FROM SECTION 4, MOTION VERBS), AND IS NEGATED IF
440 C THIS IS THE LAST ENTRY FOR THIS LOCATION. KEY(N) IS THE INDEX IN TRAVEL
441 C OF THE FIRST OPTION AT LOCATION N.
442 C
443 C SPECIAL CONDITIONS ON TRAVEL ARE ENCODED IN THE CORRESPONDING
444 C ENTRIES OF TRVCON. THE NEW LOCATION IS IN TRVLOC.
445 C
446 C
447 1030 READ(6,1031)LOC,J,NEWLOC,TK
448 1031 FORMAT(99I6)
449 IF(LOC.EQ.-1)GOTO 1002
450 IF(KEY(LOC).NE.0)GOTO 1033
451 KEY(LOC)=TRVS
452 GOTO 1035
453 C1033 TRAVEL(TRVS-1)=-TRAVEL(TRVS-1)
454 1033 ITEMP = GETWRD(TRAVEL, TRVS-1, 0)
455 ITEMP=-ITEMP
456 CALL PUTWRD(TRAVEL, TRVS-1, ITEMP)
457 1035 DO 1037 L=1,20
458 IF(TK(L).EQ.0)GOTO 1039
459 C TRAVEL(TRVS)=TK(L)
460 CALL PUTWRD(TRAVEL, TRVS, TK(L))
461 C TRVLOC(TRVS)=NEWLOC
462 CALL PUTWRD(TRVLOC, TRVS, NEWLOC)
463 C TRVCON(TRVS)=J
464 CALL PUTWRD(TRVCON, TRVS, J)
465 TRVS=TRVS+1
466 IF(TRVS.EQ.TRVSIZ)CALL BUG(3)
467 1037 CONTINUE
468 C1039 TRAVEL(TRVS-1)=-TRAVEL(TRVS-1)
469 1039 ITEMP = GETWRD(TRAVEL, TRVS-1, 0)
470 ITEMP=-ITEMP
471 CALL PUTWRD(TRAVEL, TRVS-1, ITEMP)
472 GOTO 1030
473 C
474 C HERE WE READ IN THE VOCABULARY. KTAB(N) IS THE WORD NUMBER, ATAB(N) IS
475 C THE CORRESPONDING WORD. THE -1 AT THE END OF SECTION 4 IS LEFT IN KTAB
476 C AS AN END-MARKER.
477 C OS/8 note: only reading first four characters as that's what's matched
478 C for vocabulary.
479 C
480 1040 DO 1042 TABNDX=1,TABSIZ
481 1043 READ(6,1041)KTAB(TABNDX),ATAB(TABNDX)
482 1041 FORMAT(I6,A4)
483 IF(KTAB(TABNDX).EQ.-1)GOTO 1002
484 1042 CONTINUE
485 CALL BUG(4)
486 C
487 C READ IN THE INITIAL LOCATIONS FOR EACH OBJECT. ALSO THE IMMOVABILITY INFO.
488 C PLAC CONTAINS INITIAL LOCATIONS OF OBJECTS. FIXD IS -1 FOR IMMOVABLE
489 C OBJECTS (INCLUDING THE SNAKE), OR = SECOND LOC FOR TWO-PLACED OBJECTS.
490 C
491 1050 READ(6,1031)IOBJ,J,K
492 IF(IOBJ.EQ.-1)GOTO 1002
493 IF(IOBJ.GT.100) CALL BUG(13)
494 PLAC(IOBJ)=J
495 FIXD(IOBJ)=K
496 GOTO 1050
497 C
498 C READ DEFAULT MESSAGE NUMBERS FOR ACTION VERBS, STORE IN ACTSPK.
499 C
500 1060 READ(6,1031)VERB,J
501 IF(VERB.EQ.-1)GOTO 1002
502 IF(VERB.GT.VRBSIZ) CALL BUG(10)
503 ACTSPK(VERB)=J
504 VCNT=MAX0(VERB,VCNT)
505 GOTO 1060
506 C
507 C READ INFO ABOUT AVAILABLE LIQUIDS AND OTHER CONDITIONS, STORE IN COND.
508 C
509 1070 READ(6,1031)K,TK
510 IF(K.EQ.-1)GOTO 1002
511 DO 1071 I=1,20
512 LOC=TK(I)
513 IF(LOC.EQ.0)GOTO 1070
514 IF (BITSET(LOC,K)) CALL BUG(8)
515 1071 COND(LOC)=COND(LOC)+ISHFT(1,K)
516 GOTO 1070
517 C
518 C READ DATA FOR HINTS.
519 C
520 1080 HNTMAX=0
521 1081 READ(6,1031)K,TK
522 IF(K.EQ.-1)GOTO 1002
523 IF(K.LT.0.OR.K.GT.HNTSIZ)CALL BUG(7)
524 DO 1083 I=1,4
525 1083 HINTS(K,I)=TK(I)
526 HNTMAX=MAX0(HNTMAX,K)
527 GOTO 1081
528 \fC FINISH CONSTRUCTING INTERNAL DATA FORMAT
529 C THEN SAVE THE RESULTS
530 C
531 1100 IF (MOD(ASCVAR,6) .NE. 0) WRITE(8'RECORD)DATA
532 CALL USR(8,TEXTNM,4,IERR)
533 CALL USR(8,TEXTNM,2,IERR)
534 C
535 C Restore the "DEFINE FILE" settings
536 C
537 CALL SETIDL
538 C1100 CALL CLOSE(1)
539 CALL SAVEGM(.FALSE.,I)
540 CONTINUE
541 C
542 C HAVING READ IN THE DATABASE, CERTAIN THINGS ARE NOW CONSTRUCTED. PROPS ARE
543 C SET TO ZERO. WE FINISH SETTING UP COND BY CHECKING FOR FORCED-MOTION TRAVEL
544 C ENTRIES. THE PLAC AND FIXD ARRAYS ARE USED TO SET UP ATLOC(N) AS THE FIRST
545 C OBJECT AT LOCATION N, AND LINK(IOBJ) AS THE NEXT OBJECT AT THE SAME LOCATION
546 C AS IOBJ. (IOBJ>100 INDICATES THAT FIXED(IOBJ-100)=LOC; LINK(IOBJ) IS STILL THE
547 C CORRECT LINK TO USE.) ABB IS ZEROED; IT CONTROLS WHETHER THE ABBREVIATED
548 C DESCRIPTION IS PRINTED. COUNTS MOD 5 UNLESS "LOOK" IS USED.
549 C
550 C
551 C IF THE FIRST MOTION VERB IS 1 (ILLEGAL), THEN THIS IS A FORCED
552 C MOTION ENTRY.
553 C
554 5000 DO 1102 I=1,LOCSIZ
555 IF(LTEXT(I).EQ.0.OR.KEY(I).EQ.0)GOTO 1102
556 K=KEY(I)
557 C IF(IABS(TRAVEL(K)).EQ.1)COND(I)=2
558 ITEMP = GETWRD(TRAVEL, K, 0)
559 IF (IABS(ITEMP).EQ.1)COND(I)=2
560 1102 CONTINUE
561 C
562 C SET UP THE ATLOC AND LINK ARRAYS AS DESCRIBED ABOVE. WE'LL USE THE DROP
563 C SUBROUTINE, WHICH PREFACES NEW OBJECTS ON THE LISTS. SINCE WE WANT THINGS
564 C IN THE OTHER ORDER, WE'LL RUN THE LOOP BACKWARDS. IF THE OBJECT IS IN TWO
565 C LOCS, WE DROP IT TWICE. THIS ALSO SETS UP "PLACE" AND "FIXED" AS COPIES OF
566 C "PLAC" AND "FIXD". ALSO, SINCE TWO-PLACED OBJECTS ARE TYPICALLY BEST
567 C DESCRIBED LAST, WE'LL DROP THEM FIRST.
568 C
569 DO 1106 I=1,100
570 K=101-I
571 IF(FIXD(K).LE.0)GOTO 1106
572 CALL DROP(K+100,FIXD(K))
573 CALL DROP(K,PLAC(K))
574 1106 CONTINUE
575 C
576 DO 1107 I=1,100
577 K=101-I
578 FIXED(K)=FIXD(K)
579 1107 IF(PLAC(K).NE.0.AND.FIXD(K).LE.0)CALL DROP(K,PLAC(K))
580 C
581 C TREASURES, AS NOTED EARLIER, ARE OBJECTS 50 THROUGH MAXTRS (CURRENTLY 79).
582 C THEIR PROPS ARE INITIALLY -1, AND ARE SET TO 0 THE FIRST TIME THEY ARE
583 C DESCRIBED. TALLY KEEPS TRACK OF HOW MANY ARE NOT YET FOUND, SO WE KNOW
584 C WHEN TO CLOSE THE CAVE. TALLY2 COUNTS HOW MANY CAN NEVER BE FOUND (E.G. IF
585 C LOST BIRD OR BRIDGE).
586 C
587 MAXTRS=79
588 TALLY=0
589 TALLY2=0
590 DO 1200 I=50,MAXTRS
591 IF(PTEXT(I).NE.0)PROP(I)=-1
592 1200 TALLY=TALLY-PROP(I)
593 C
594 C CLEAR THE HINT STUFF. HINTLC(I) IS HOW LONG HE'S BEEN AT LOC WITH COND BIT
595 C I. HINTED(I) IS TRUE IFF HINT I HAS BEEN USED.
596 C
597 DO 1300 I=1,HNTMAX
598 HINTED(I)=.FALSE.
599 1300 HINTLC(I)=0
600 C
601 CDEBUG WRITE(4,931)TABNDX,TABSIZ,VCNT,VRBSIZ,CLSSES,CLSMAX,
602 CDEBUG 1 HNTMAX,HNTSIZ,TRVS,TRVSIZ,LINUSE,FILSIZ
603 CDEBUG931 FORMAT(' USED VS MAX TABLE VALUES:'/
604 CDEBUG 1 1X,I5,' OF ',I5,' VOCAB ENTRIES'/
605 CDEBUG 2 1X,I5,' OF ',I5,' VERB ENTRIES'/
606 CDEBUG 3 1X,I5,' OF ',I5,' CLASS ENTRIES'/
607 CDEBUG 4 1X,I5,' OF ',I5,' HINT ENTRIES'/
608 CDEBUG 5 1X,I5,' OF ',I5,' TRAVEL ENTRIES'/
609 CDEBUG 6 1X,I5,' OF ',I5,' FILE RECORDS'/)
610 C
611 C DEFINE SOME HANDY MNEMONICS. THESE CORRESPOND TO OBJECT NUMBERS.
612 C
613 KEYS=VOCAB('KEYS',1)
614 LAMP=VOCAB('LAMP',1)
615 GRATE=VOCAB('GRAT',1)
616 CAGE=VOCAB('CAGE',1)
617 ROD=VOCAB('ROD ',1)
618 ROD2=ROD+1
619 STEPS=VOCAB('STEP',1)
620 BIRD=VOCAB('BIRD',1)
621 DOOR=VOCAB('DOOR',1)
622 PILLOW=VOCAB('PILL',1)
623 SNAKE=VOCAB('SNAK',1)
624 FISSUR=VOCAB('FISS',1)
625 TABLET=VOCAB('TABL',1)
626 CLAM=VOCAB('CLAM',1)
627 OYSTER=VOCAB('OYST',1)
628 MAGZIN=VOCAB('MAGA',1)
629 DWARF=VOCAB('DWAR',1)
630 KNIFE=VOCAB('KNIF',1)
631 FOOD=VOCAB('FOOD',1)
632 BOTTLE=VOCAB('BOTT',1)
633 WATER=VOCAB('WATE',1)
634 OIL=VOCAB('OIL ',1)
635 PLANT=VOCAB('PLAN',1)
636 PLANT2=PLANT+1
637 AXE=VOCAB('AXE ',1)
638 MIRROR=VOCAB('MIRR',1)
639 DRAGON=VOCAB('DRAG',1)
640 CHASM=VOCAB('CHAS',1)
641 TROLL=VOCAB('TROL',1)
642 TROLL2=TROLL+1
643 BEAR=VOCAB('BEAR',1)
644 MESSAG=VOCAB('MESS',1)
645 VEND=VOCAB('VEND',1)
646 BATTER=VOCAB('BATT',1)
647 C
648 C OBJECTS FROM 50 THROUGH WHATEVER ARE TREASURES. HERE ARE A FEW.
649 C
650 NUGGET=VOCAB('GOLD',1)
651 COINS=VOCAB('COIN',1)
652 CHEST=VOCAB('CHES',1)
653 EGGS=VOCAB('EGGS',1)
654 TRIDNT=VOCAB('TRID',1)
655 VASE=VOCAB('VASE',1)
656 EMRALD=VOCAB('EMER',1)
657 PYRAM=VOCAB('PYRA',1)
658 PEARL=VOCAB('PEAR',1)
659 RUG=VOCAB('RUG ',1)
660 CHAIN=VOCAB('CHAI',1)
661 C
662 C THESE ARE MOTION-VERB NUMBERS.
663 C
664 BACK=VOCAB('BACK',0)
665 LOOK=VOCAB('LOOK',0)
666 CAVE=VOCAB('CAVE',0)
667 NULL=VOCAB('NULL',0)
668 ENTRNC=VOCAB('ENTR',0)
669 DPRSSN=VOCAB('DEPR',0)
670 STREAM=VOCAB('STRE',0)
671 C
672 C AND SOME ACTION VERBS.
673 C
674 SAY=VOCAB('SAY ',2)
675 LOCK=VOCAB('LOCK',2)
676 THROW=VOCAB('THRO',2)
677 FIND=VOCAB('FIND',2)
678 INVENT=VOCAB('INVE',2)
679 C
680 C INITIALISE THE DWARVES. DLOC IS LOC OF DWARVES, HARD-WIRED IN. ODLOC IS
681 C PRIOR LOC OF EACH DWARF, INITIALLY GARBAGE. DALTLC IS ALTERNATE INITIAL LOC
682 C FOR DWARF, IN CASE ONE OF THEM STARTS OUT ON TOP OF THE ADVENTURER. (NO 2
683 C OF THE 5 INITIAL LOCS ARE ADJACENT.) DSEEN IS TRUE IF DWARF HAS SEEN HIM.
684 C DFLAG CONTROLS THE LEVEL OF ACTIVATION OF ALL THIS:
685 C 0 NO DWARF STUFF YET (WAIT UNTIL REACHES HALL OF MISTS)
686 C 1 REACHED HALL OF MISTS, BUT HASN'T MET FIRST DWARF
687 C 2 MET FIRST DWARF, OTHERS START MOVING, NO KNIVES THROWN YET
688 C 3 A KNIFE HAS BEEN THROWN (FIRST SET ALWAYS MISSES)
689 C 3+ DWARVES ARE MAD (INCREASES THEIR ACCURACY)
690 C SIXTH DWARF IS SPECIAL (THE PIRATE). HE ALWAYS STARTS AT HIS CHEST'S
691 C EVENTUAL LOCATION INSIDE THE MAZE. THIS LOC IS SAVED IN CHLOC FOR REF.
692 C THE DEAD END IN THE OTHER MAZE HAS ITS LOC STORED IN CHLOC2.
693 C
694 CHLOC=114
695 CHLOC2=140
696 DO 1700 I=1,6
697 1700 DSEEN(I)=.FALSE.
698 DFLAG=0
699 DLOC(1)=19
700 DLOC(2)=27
701 DLOC(3)=33
702 DLOC(4)=44
703 DLOC(5)=64
704 DLOC(6)=CHLOC
705 DALTLC=18
706 C
707 C OTHER RANDOM FLAGS AND COUNTERS, AS FOLLOWS:
708 C TURNS TALLIES HOW MANY COMMANDS HE'S GIVEN (IGNORES YES/NO)
709 C LIMIT LIFETIME OF LAMP (NOT SET HERE)
710 C KNFLOC 0 IF NO KNIFE HERE, LOC IF KNIFE HERE, -1 AFTER CAVEAT
711 C DETAIL HOW OFTEN WE'VE SAID "NOT ALLOWED TO GIVE MORE DETAIL"
712 C ABBNUM HOW OFTEN WE SHOULD PRINT NON-ABBREVIATED DESCRIPTIONS
713 C MAXDIE NUMBER OF REINCARNATION MESSAGES AVAILABLE (UP TO 5)
714 C NUMDIE NUMBER OF TIMES KILLED SO FAR
715 C HOLDNG NUMBER OF OBJECTS BEING CARRIED
716 C DKILL NUMBER OF DWARVES KILLED (UNUSED IN SCORING, NEEDED FOR MSG)
717 C FOOBAR CURRENT PROGRESS IN SAYING "FEE FIE FOE FOO".
718 C BONUS USED TO DETERMINE AMOUNT OF BONUS IF HE REACHES CLOSING
719 C CLOCK1 NUMBER OF TURNS FROM FINDING LAST TREASURE TILL CLOSING
720 C CLOCK2 NUMBER OF TURNS FROM FIRST WARNING TILL BLINDING FLASH
721 C LOGICALS WERE EXPLAINED EARLIER
722 C
723 TURNS=0
724 LMWARN=.FALSE.
725 KNFLOC=0
726 DETAIL=0
727 ABBNUM=5
728 DO 1800 I=0,4
729 1800 IF(RTEXT(2*I+81).NE.0)MAXDIE=I+1
730 NUMDIE=0
731 HOLDNG=0
732 DKILL=0
733 FOOBAR=0
734 BONUS=0
735 CLOCK1=30
736 CLOCK2=50
737 CLOSNG=.FALSE.
738 PANIC=.FALSE.
739 CLOSED=.FALSE.
740 GAVEUP=.FALSE.
741 SCORNG=.FALSE.
742 C
743 C
744 C
745 C FINALLY, SINCE WE'RE CLEARLY SETTING THINGS UP FOR THE FIRST TIME...
746 C
747 C PAUSE 'INIT DONE'
748 RETURN
749 END