home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / compsrcs / games / new / 911231.0 < prev    next >
Encoding:
Internet Message Format  |  1991-12-30  |  77.5 KB

  1. Path: uunet!comp.vuw.ac.nz!waikato.ac.nz!ccc_simon
  2. From: ccc_simon@waikato.ac.nz (Simon Travaglia)
  3. Newsgroups: vmsnet.sources.games
  4. Subject: Adventure Fortran Source
  5. Message-ID: <1991Dec31.090851.5979@waikato.ac.nz>
  6. Date: 31 Dec 91 09:08:51 +1300
  7. Organization: University of Waikato Computer Centre
  8. Lines: 2785
  9.  
  10. C  ADVENTURES
  11.  
  12. C  CURRENT LIMITS:
  13. C      9650 WORDS OF MESSAGE TEXT (LINES, LINSIZ).
  14. C    750 TRAVEL OPTIONS (TRAVEL, TRVSIZ).
  15. C    300 VOCABULARY WORDS (KTAB, ATAB, TABSIZ).
  16. C    150 LOCATIONS (LTEXT, STEXT, KEY, COND, ABB, ATLOC, LOCSIZ).
  17. C    100 OBJECTS (PLAC, PLACE, FIXD, FIXED, LINK (TWICE), PTEXT, PROP).
  18. C     35 "ACTION" VERBS (ACTSPK, VRBSIZ).
  19. C    205 RANDOM MESSAGES (RTEXT, RTXSIZ).
  20. C     12 DIFFERENT PLAYER CLASSIFICATIONS (CTEXT, CVAL, CLSMAX).
  21. C     20 HINTS, LESS 3 (HINTLC, HINTED, HINTS, HNTSIZ).
  22. C     35 MAGIC MESSAGES (MTEXT, MAGSIZ).
  23. C  THERE ARE ALSO LIMITS WHICH CANNOT BE EXCEEDED DUE TO THE STRUCTURE OF
  24. C  THE DATABASE.  (E.G., THE VOCABULARY USES N/1000 TO DETERMINE WORD TYPE,
  25. C  SO THERE CAN'T BE MORE THAN 1000 WORDS.)  THESE UPPER LIMITS ARE:
  26. C    1000 NON-SYNONYMOUS VOCABULARY WORDS
  27. C    300 LOCATIONS
  28. C    100 OBJECTS
  29. C
  30. C    *****************************************************************
  31. C    * Any comments like this pertain to the modifications made to   *
  32. C    * the source By S Travaglia, Waikato Univerity, 1985-7         *
  33. C    * won't be deleted in case someone may want to look them up.    *
  34. C    *       ----====++++**** Ralph Wuz Here ****++++====----        *
  35. C    *****************************************************************
  36. C
  37. C    *****************************************************************
  38. C    * The call to IMAGE_DIR does a $GETJPI to find the image name.  *
  39. C    * The directory spec is extracted from this and is used in data *
  40. C    * file opens etc.  This way you don't have to have a hardwired  *
  41. C    * directory spec in the program, wherever the .EXE is, put the  *
  42. C    * data file as well.  IMAGE_DIR: is a local logical that xlates *
  43. C    * to the directory the image is being run from            *
  44. C    *****************************************************************
  45.  
  46.     IMPLICIT INTEGER(A-Z)
  47.     LOGICAL DSEEN,BLKLIN,HINTED,YES,START
  48.     CHARACTER WD1*10,WD2*10,TEMPC*25
  49.     CHARACTER CLINES*100
  50.     CHARACTER ATAB(300)*5
  51.  
  52.     COMMON /TXTCOM/ RTEXT,LINES
  53.     COMMON /BLKCOM/ BLKLIN
  54.     COMMON/VOCCOM1/ ATAB
  55.     COMMON/VOCCOM2/KTAB, TABSIZ
  56.     COMMON /PLACOM/ ATLOC,LINK,PLACE,FIXED,HOLDNG
  57.     COMMON /MTXCOM/ MTEXT
  58.     COMMON /PTXCOM/ PTEXT
  59.     COMMON /ABBCOM/ ABB
  60.     COMMON /WIZCOM/ WKDAY,WKEND,HOLID,HBEGIN,HEND,HNAME,
  61.     1    SHORT,MAGNM,LATNCY,SAVED,SAVET,SETUP
  62.  
  63.     DIMENSION LINES(12000)
  64.     DIMENSION TRAVEL(750)
  65.     DIMENSION KTAB(300)
  66.     DIMENSION LTEXT(150),STEXT(150),KEY(150),COND(150),ABB(150),
  67.     1    ATLOC(150)
  68.     DIMENSION PLAC(100),PLACE(100),FIXD(100),FIXED(100),LINK(200),
  69.     1    PTEXT(100),PROP(100)
  70.     DIMENSION ACTSPK(35)
  71.     DIMENSION RTEXT(205)
  72.     DIMENSION CTEXT(12),CVAL(12)
  73.     DIMENSION HINTLC(20),HINTED(20),HINTS(20,4)
  74.     DIMENSION MTEXT(35)
  75.     DIMENSION TK(20),DSEEN(6),DLOC(6),ODLOC(6),HNAME(4)
  76.  
  77. C
  78. C AVOID MAKING THE COMPILER WORRY ABOUT MODIFYING THE DO INDEX
  79. C
  80.     INTEGER IDONDX
  81. C  STATEMENT FUNCTIONS
  82. C
  83. C
  84. C  TOTING(OBJ)    = TRUE IF THE OBJ IS BEING CARRIED
  85. C  HERE(OBJ)    = TRUE IF THE OBJ IS AT "LOC" (OR IS BEING CARRIED)
  86. C  AT(OBJ)    = TRUE IF ON EITHER SIDE OF TWO-PLACED OBJECT
  87. C  LIQ(DUMMY)    = OBJECT NUMBER OF LIQUID IN BOTTLE
  88. C  LIQLOC(LOC)    = OBJECT NUMBER OF LIQUID (IF ANY) AT LOC
  89. C  BITSET(L,N)    = TRUE IF COND(L) HAS BIT N SET (BIT 0 IS UNITS BIT)
  90. C  FORCED(LOC)    = TRUE IF LOC MOVES WITHOUT ASKING FOR INPUT (COND=2)
  91. C  DARK(DUMMY)    = TRUE IF LOCATION "LOC" IS DARK
  92. C  PCT(N)       = TRUE N% OF THE TIME (N INTEGER FROM 0 TO 100)
  93. C
  94. C  WZDARK SAYS WHETHER THE LOC HE'S LEAVING WAS DARK
  95. C  LMWARN SAYS WHETHER HE'S BEEN WARNED ABOUT LAMP GOING DIM
  96. C  CLOSNG SAYS WHETHER ITS CLOSING TIME YET
  97. C  PANIC SAYS WHETHER HE'S FOUND OUT HE'S TRAPPED IN THE CAVE
  98. C  CLOSED SAYS WHETHER WE'RE ALL THE WAY CLOSED
  99. C  GAVEUP SAYS WHETHER HE EXITED VIA "QUIT"
  100. C  SCORNG INDICATES TO THE SCORE ROUTINE WHETHER WE'RE DOING A "SCORE" COMMAND
  101. C  DEMO IS TRUE IF THIS IS A PRIME-TIME DEMONSTRATION GAME
  102. C  YEA IS RANDOM YES/NO REPLY
  103.  
  104.     LOGICAL TOTING,HERE,AT,BITSET,DARK,WZDARK,LMWARN,CLOSNG,PANIC,
  105.     1    CLOSED,GAVEUP,SCORNG,DEMO,YEA
  106.     EXTERNAL RAN
  107.  
  108.     TOTING(OBJ)=PLACE(OBJ).EQ.-1
  109.     HERE(OBJ)=PLACE(OBJ).EQ.LOC.OR.TOTING(OBJ)
  110.     AT(OBJ)=PLACE(OBJ).EQ.LOC.OR.FIXED(OBJ).EQ.LOC
  111.     LIQ2(PBOTL)=(1-PBOTL)*WATER+(PBOTL/2)*(WATER+OIL)
  112.     LIQ(DUMMY)=LIQ2(MAX0(PROP(BOTTLE),-1-PROP(BOTTLE)))
  113.     LIQLOC(LOC)=LIQ2((MOD(COND(LOC)/2*2,8)-5)*MOD(COND(LOC)/4,2)+1)
  114.     BITSET(L,N)=(COND(L).AND.SHIFT(1,N)).NE.0
  115.     FORCED(LOC)=COND(LOC).EQ.2
  116.     DARK(DUMMY)=MOD(COND(LOC),2).EQ.0.AND.(PROP(LAMP).EQ.0.OR.
  117.     1    .NOT.HERE(LAMP))
  118.     PCT(N)=RAN(100).LT.N
  119. C
  120.     DATA LINSIZ/12000/,TRVSIZ/750/,TABSIZ/300/,LOCSIZ/150/,
  121.     1  VRBSIZ/35/,RTXSIZ/205/,CLSMAX/12/,HNTSIZ/20/,MAGSIZ/35/
  122.     DATA SETUP/0/,BLKLIN/.TRUE./
  123.  
  124. C  DESCRIPTION OF THE DATABASE FORMAT
  125. C
  126. C
  127. C  THE DATA FILE CONTAINS SEVERAL SECTIONS.  EACH BEGINS WITH A LINE CONTAINING
  128. C  A NUMBER IDENTIFYING THE SECTION, AND ENDS WITH A LINE CONTAINING "-1".
  129. C
  130. C  SECTION 1: LONG FORM DESCRIPTIONS.  EACH LINE CONTAINS A LOCATION NUMBER,
  131. C    A TAB, AND A LINE OF TEXT.  THE SET OF (NECESSARILY ADJACENT) LINES
  132. C    WHOSE NUMBERS ARE X FORM THE LONG DESCRIPTION OF LOCATION X.
  133. C  SECTION 2: SHORT FORM DESCRIPTIONS.  SAME FORMAT AS LONG FORM.  NOT ALL
  134. C    PLACES HAVE SHORT DESCRIPTIONS.
  135. C  SECTION 3: TRAVEL TABLE.  EACH LINE CONTAINS A LOCATION NUMBER (X), A SECOND
  136. C    LOCATION NUMBER (Y), AND A LIST OF MOTION NUMBERS (SEE SECTION 4).
  137. C    EACH MOTION REPRESENTS A VERB WHICH WILL GO TO Y IF CURRENTLY AT X.
  138. C    Y, IN TURN, IS INTERPRETED AS FOLLOWS.  LET M=Y/1000, N=Y MOD 1000.
  139. C        IF N<=300    IT IS THE LOCATION TO GO TO.
  140. C        IF 300<N<=500    N-300 IS USED IN A COMPUTED GOTO TO
  141. C                    A SECTION OF SPECIAL CODE.
  142. C        IF N>500    MESSAGE N-500 FROM SECTION 6 IS PRINTED,
  143. C                    AND HE STAYS WHEREVER HE IS.
  144. C    MEANWHILE, M SPECIFIES THE CONDITIONS ON THE MOTION.
  145. C        IF M=0        IT'S UNCONDITIONAL.
  146. C        IF 0<M<100    IT IS DONE WITH M% PROBABILITY.
  147. C        IF M=100    UNCONDITIONAL, BUT FORBIDDEN TO DWARVES.
  148. C        IF 100<M<=200    HE MUST BE CARRYING OBJECT M-100.
  149. C        IF 200<M<=300    MUST BE CARRYING OR IN SAME ROOM AS M-200.
  150. C        IF 300<M<=400    PROP(M MOD 100) MUST *NOT* BE 0.
  151. C        IF 400<M<=500    PROP(M MOD 100) MUST *NOT* BE 1.
  152. C        IF 500<M<=600    PROP(M MOD 100) MUST *NOT* BE 2, ETC.
  153. C    IF THE CONDITION (IF ANY) IS NOT MET, THEN THE NEXT *DIFFERENT*
  154. C    "DESTINATION" VALUE IS USED (UNLESS IT FAILS TO MEET *ITS* CONDITIONS,
  155. C    IN WHICH CASE THE NEXT IS FOUND, ETC.).  TYPICALLY, THE NEXT DEST WILL
  156. C    BE FOR ONE OF THE SAME VERBS, SO THAT ITS ONLY USE IS AS THE ALTERNATE
  157. C    DESTINATION FOR THOSE VERBS.  FOR INSTANCE:
  158. C        15    110022    29    31    34    35    23    43
  159. C        15    14    29
  160. C    THIS SAYS THAT, FROM LOC 15, ANY OF THE VERBS 29, 31, ETC., WILL TAKE
  161. C    HIM TO 22 IF HE'S CARRYING OBJECT 10, AND OTHERWISE WILL GO TO 14.
  162. C        11    303008    49
  163. C        11    9    50
  164. C    THIS SAYS THAT, FROM 11, 49 TAKES HIM TO 8 UNLESS PROP(3)=0, IN WHICH
  165. C    CASE HE GOES TO 9.  VERB 50 TAKES HIM TO 9 REGARDLESS OF PROP(3).
  166. C  SECTION 4: VOCABULARY.  EACH LINE CONTAINS A NUMBER (N), A TAB, AND A
  167. C    FIVE-LETTER WORD.  CALL M=N/1000.  IF M=0, THEN THE WORD IS A MOTION
  168. C    VERB FOR USE IN TRAVELLING (SEE SECTION 3).  ELSE, IF M=1, THE WORD IS
  169. C    AN OBJECT.  ELSE, IF M=2, THE WORD IS AN ACTION VERB (SUCH AS "CARRY"
  170. C    OR "ATTACK").  ELSE, IF M=3, THE WORD IS A SPECIAL CASE VERB (SUCH AS
  171. C    "DIG") AND N MOD 1000 IS AN INDEX INTO SECTION 6.  OBJECTS FROM 50 TO
  172. C    (CURRENTLY, ANYWAY) 79 ARE CONSIDERED TREASURES (FOR PIRATE, CLOSEOUT).
  173. C  SECTION 5: OBJECT DESCRIPTIONS.  EACH LINE CONTAINS A NUMBER (N), A TAB,
  174. C    AND A MESSAGE.  IF N IS FROM 1 TO 100, THE MESSAGE IS THE "INVENTORY"
  175. C    MESSAGE FOR OBJECT N.  OTHERWISE, N SHOULD BE 000, 100, 200, ETC., AND
  176. C    THE MESSAGE SHOULD BE THE DESCRIPTION OF THE PRECEDING OBJECT WHEN ITS
  177. C    PROP VALUE IS N/100.  THE N/100 IS USED ONLY TO DISTINGUISH MULTIPLE
  178. C    MESSAGES FROM MULTI-LINE MESSAGES; THE PROP INFO ACTUALLY REQUIRES ALL
  179. C    MESSAGES FOR AN OBJECT TO BE PRESENT AND CONSECUTIVE.  PROPERTIES WHICH
  180. C    PRODUCE NO MESSAGE SHOULD BE GIVEN THE MESSAGE ">$<".
  181. C  SECTION 6: ARBITRARY MESSAGES.  SAME FORMAT AS SECTIONS 1, 2, AND 5, EXCEPT
  182. C    THE NUMBERS BEAR NO RELATION TO ANYTHING (EXCEPT FOR SPECIAL VERBS
  183. C    IN SECTION 4).
  184. C  SECTION 7: OBJECT LOCATIONS.  EACH LINE CONTAINS AN OBJECT NUMBER AND ITS
  185. C    INITIAL LOCATION (ZERO (OR OMITTED) IF NONE).  IF THE OBJECT IS
  186. C    IMMOVABLE, THE LOCATION IS FOLLOWED BY A "-1".  IF IT HAS TWO LOCATIONS
  187. C    (E.G. THE GRATE) THE FIRST LOCATION IS FOLLOWED WITH THE SECOND, AND
  188. C    THE OBJECT IS ASSUMED TO BE IMMOVABLE.
  189. C  SECTION 8: ACTION DEFAULTS.  EACH LINE CONTAINS AN "ACTION-VERB" NUMBER AND
  190. C    THE INDEX (IN SECTION 6) OF THE DEFAULT MESSAGE FOR THE VERB.
  191. C  SECTION 9: LIQUID ASSETS, ETC.  EACH LINE CONTAINS A NUMBER (N) AND UP TO 20
  192. C    LOCATION NUMBERS.  BIT N (WHERE 0 IS THE UNITS BIT) IS SET IN COND(LOC)
  193. C    FOR EACH LOC GIVEN.  THE COND BITS CURRENTLY ASSIGNED ARE:
  194. C        0    LIGHT
  195. C        1    IF BIT 2 IS ON: ON FOR OIL, OFF FOR WATER
  196. C        2    LIQUID ASSET, SEE BIT 1
  197. C        3    PIRATE DOESN'T GO HERE UNLESS FOLLOWING PLAYER
  198. C    OTHER BITS ARE USED TO INDICATE AREAS OF INTEREST TO "HINT" ROUTINES:
  199. C        4    TRYING TO GET INTO CAVE
  200. C        5    TRYING TO CATCH BIRD
  201. C        6    TRYING TO DEAL WITH SNAKE
  202. C        7    LOST IN MAZE
  203. C        8    PONDERING DARK ROOM
  204. C        9    AT WITT'S END
  205. C    COND(LOC) IS SET TO 2, OVERRIDING ALL OTHER BITS, IF LOC HAS FORCED
  206. C    MOTION.
  207. C  SECTION 10: CLASS MESSAGES.  EACH LINE CONTAINS A NUMBER (N), A TAB, AND A
  208. C    MESSAGE DESCRIBING A CLASSIFICATION OF PLAYER.  THE SCORING SECTION
  209. C    SELECTS THE APPROPRIATE MESSAGE, WHERE EACH MESSAGE IS CONSIDERED TO
  210. C    APPLY TO PLAYERS WHOSE SCORES ARE HIGHER THAN THE PREVIOUS N BUT NOT
  211. C    HIGHER THAN THIS N.  NOTE THAT THESE SCORES PROBABLY CHANGE WITH EVERY
  212. C    MODIFICATION (AND PARTICULARLY EXPANSION) OF THE PROGRAM.
  213. C  SECTION 11: HINTS.  EACH LINE CONTAINS A HINT NUMBER (CORRESPONDING TO A
  214. C    COND BIT, SEE SECTION 9), THE NUMBER OF TURNS HE MUST BE AT THE RIGHT
  215. C    LOC(S) BEFORE TRIGGERING THE HINT, THE POINTS DEDUCTED FOR TAKING THE
  216. C    HINT, THE MESSAGE NUMBER (SECTION 6) OF THE QUESTION, AND THE MESSAGE
  217. C    NUMBER OF THE HINT.  THESE VALUES ARE STASHED IN THE "HINTS" ARRAY.
  218. C    HNTMAX IS SET TO THE MAX HINT NUMBER (<= HNTSIZ).  NUMBERS 1-3 ARE
  219. C    UNUSABLE SINCE COND BITS ARE OTHERWISE ASSIGNED, SO 2 IS USED TO
  220. C    REMEMBER IF HE'S READ THE CLUE IN THE REPOSITORY, AND 3 IS USED TO
  221. C    REMEMBER WHETHER HE ASKED FOR INSTRUCTIONS (GETS MORE TURNS, BUT LOSES
  222. C    POINTS).
  223. C  SECTION 12: MAGIC MESSAGES. IDENTICAL TO SECTION 6 EXCEPT PUT IN A SEPARATE
  224. C    SECTION FOR EASIER REFERENCE.  MAGIC MESSAGES ARE USED BY THE STARTUP,
  225. C    MAINTENANCE MODE, AND RELATED ROUTINES.
  226. C  SECTION 0: END OF DATABASE.
  227.  
  228. C  READ THE DATABASE 
  229.     CALL Image_Dir
  230.  
  231.     IF(SETUP.NE.0)GOTO 1100
  232.     TYPE 1000
  233. 1000    FORMAT(' Please wait while we obtain entry to the cave...')
  234.  
  235.  
  236. C  CLEAR OUT THE VARIOUS TEXT-POINTER ARRAYS.  ALL TEXT IS STORED IN ARRAY
  237. C  LINES; EACH LINE IS PRECEDED BY A WORD POINTING TO THE NEXT POINTER (I.E.
  238. C  THE WORD FOLLOWING THE END OF THE LINE).  THE POINTER IS NEGATIVE IF THIS IS
  239. C  FIRST LINE OF A MESSAGE.  THE TEXT-POINTER ARRAYS CONTAIN INDICES OF
  240. C  POINTER-WORDS IN LINES.  STEXT(N) IS SHORT DESCRIPTION OF LOCATION N.
  241. C  LTEXT(N) IS LONG DESCRIPTION.  PTEXT(N) POINTS TO MESSAGE FOR PROP(N)=0.
  242. C  SUCCESSIVE PROP MESSAGES ARE FOUND BY CHASING POINTERS.  RTEXT CONTAINS
  243. C  SECTION 6'S STUFF.  CTEXT(N) POINTS TO A PLAYER-CLASS MESSAGE.  MTEXT IS FOR
  244. C  SECTION 12.  WE ALSO CLEAR COND.  SEE DESCRIPTION OF SECTION 9 FOR DETAILS.
  245.  
  246.     DO 1001 I=1,300
  247.     IF(I.LE.100)PTEXT(I)=0
  248.     IF(I.LE.RTXSIZ)RTEXT(I)=0
  249.     IF(I.LE.CLSMAX)CTEXT(I)=0
  250.     IF(I.LE.MAGSIZ)MTEXT(I)=0
  251.     IF(I.GT.LOCSIZ)GOTO 1001
  252.     STEXT(I)=0
  253.     LTEXT(I)=0
  254.     COND(I)=0
  255. 1001    CONTINUE
  256.  
  257.     OPEN(UNIT=1,NAME='Image_Dir:Adventure.Dat',READONLY,TYPE='OLD')
  258.     SETUP=1
  259.     LINUSE=1
  260.     TRVS=1
  261.     CLSSES=1
  262.  
  263. C  START NEW DATA SECTION.  SECT IS THE SECTION NUMBER.
  264.  
  265. 1002    READ(1,*) SECT
  266.     OLDLOC=-1
  267.     GOTO(1100,1004,1004,1030,1040,1004,1004,1050,1060,1070,1004,
  268.     1    1080,1004) (SECT+1)
  269. C          (0)  (1)  (2)  (3)  (4)  (5)  (6)  (7)  (8)  (9)  (10)
  270. C         (11) (12)
  271.     CALL BUG(9)
  272.  
  273. C  SECTIONS 1, 2, 5, 6, 10, 12.  READ MESSAGES AND SET UP POINTERS.
  274.  
  275. 1004    READ(1,1005) CLINES(1:80)
  276. 1005    FORMAT(80A)
  277.     CLINES(80:80)=' '
  278.     LOC=INTG(CLINES(1:6))
  279.     IT=LINUSE+1
  280. D    PRINT *,CLINES
  281.     CALL XFR(CLINES(9:80),LINES,IT)
  282.     IF(LOC.EQ.-1)GOTO 1002
  283.     DO 1006 K=1,18
  284.     KK=LINUSE+19-K
  285.     IF(LINES(KK).NE.' ')GOTO 1007
  286. 1006    CONTINUE
  287. 1007    LINES(LINUSE)=KK+1
  288.     IF(LOC.EQ.OLDLOC)GOTO 1020
  289.     LINES(LINUSE)=-LINES(LINUSE)
  290.     IF(SECT.EQ.12)GOTO 1013
  291.     IF(SECT.EQ.10)GOTO 1012
  292.     IF(SECT.EQ.6)GOTO 1011
  293.     IF(SECT.EQ.5)GOTO 1010
  294.     IF(SECT.EQ.1)GOTO 1008
  295.  
  296.     STEXT(LOC)=LINUSE
  297.     GOTO 1020
  298.  
  299. 1008    LTEXT(LOC)=LINUSE
  300.     GOTO 1020
  301.  
  302. 1010    IF(LOC.GT.0.AND.LOC.LE.100)PTEXT(LOC)=LINUSE
  303.     GOTO 1020
  304.  
  305. 1011    IF(LOC.GT.RTXSIZ)CALL BUG(6)
  306.     RTEXT(LOC)=LINUSE
  307.     GOTO 1020
  308.  
  309. 1012    CTEXT(CLSSES)=LINUSE
  310.     CVAL(CLSSES)=LOC
  311.     CLSSES=CLSSES+1
  312.     GOTO 1020
  313.  
  314. 1013    IF(LOC.GT.MAGSIZ)CALL BUG(6)
  315.     MTEXT(LOC)=LINUSE
  316.  
  317. 1020    LINUSE=KK+1
  318.     LINES(LINUSE)=-1
  319.     OLDLOC=LOC
  320.     IF(LINUSE+17.GT.LINSIZ)CALL BUG(2)
  321.     GOTO 1004
  322.  
  323.  
  324. C  THE STUFF FOR SECTION 3 IS ENCODED HERE.  EACH "FROM-LOCATION" GETS A
  325. C  CONTIGUOUS SECTION OF THE "TRAVEL" ARRAY.  EACH ENTRY IN TRAVEL IS
  326. C  NEWLOC*1000 + KEYWORD (FROM SECTION 4, MOTION VERBS), AND IS NEGATED IF
  327. C  THIS IS THE LAST ENTRY FOR THIS LOCATION.  KEY(N) IS THE INDEX IN TRAVEL
  328. C  OF THE FIRST OPTION AT LOCATION N.
  329.  
  330. 1030    DO 1031 I=1,20
  331. 1031    TK(I)=0
  332.     NEWLOC=0
  333.     LOC=0
  334.     READ(1,*)LOC,NEWLOC,TK
  335.     IF(LOC.EQ.0)GOTO 1030
  336. C  ABOVE KLUGE IS TO AVOID AFOREMENTIONED F40 BUG
  337.     IF(LOC.EQ.-1)GOTO 1002
  338.     IF(KEY(LOC).NE.0)GOTO 1033
  339.     KEY(LOC)=TRVS
  340.     GOTO 1035
  341. 1033    TRAVEL(TRVS-1)=-TRAVEL(TRVS-1)
  342. 1035    DO 1037 L=1,20
  343.     IF(TK(L).EQ.0)GOTO 1039
  344.     TRAVEL(TRVS)=NEWLOC*1000+TK(L)
  345.     TRVS=TRVS+1
  346.     IF(TRVS.EQ.TRVSIZ)CALL BUG(3)
  347. 1037    CONTINUE
  348. 1039    TRAVEL(TRVS-1)=-TRAVEL(TRVS-1)
  349.     GOTO 1030
  350.  
  351.  
  352. C  HERE WE READ IN THE VOCABULARY.  KTAB(N) IS THE WORD NUMBER, ATAB(N) IS
  353. C  THE CORRESPONDING WORD.  THE -1 AT THE END OF SECTION 4 IS LEFT IN KTAB
  354. C  AS AN END-MARKER.  THE WORDS ARE GIVEN A MINIMAL HASH TO MAKE READING THE
  355. C  CORE-IMAGE HARDER.  NOTE THAT '/7-08' HAD BETTER NOT BE IN THE LIST, SINCE
  356. C  IT COULD HASH TO -1.
  357.  
  358. 1040    DO 1042 TABNDX=1,TABSIZ
  359. 1043    READ(1,1041) TEMPC(1:8),ATAB(TABNDX)
  360. 1041    FORMAT(8A,5A)
  361.     KTAB(TABNDX)=INTG(TEMPC(1:8))
  362.     IF(KTAB(TABNDX).EQ.0)GOTO 1043
  363. C  ABOVE KLUGE IS TO AVOID AFOREMENTIONED F40 BUG
  364.     IF(KTAB(TABNDX).EQ.-1)GOTO 1002
  365. 1042    CONTINUE
  366.     CALL BUG(4)
  367.  
  368.  
  369. C  READ IN THE INITIAL LOCATIONS FOR EACH OBJECT.  ALSO THE IMMOVABILITY INFO.
  370. C  PLAC CONTAINS INITIAL LOCATIONS OF OBJECTS.  FIXD IS -1 FOR IMMOVABLE
  371. C  OBJECTS (INCLUDING THE SNAKE), OR = SECOND LOC FOR TWO-PLACED OBJECTS.
  372.  
  373. 1050    OBJ=0
  374.     J=0
  375.     K=0
  376.     READ(1,*)OBJ,J,K
  377.     IF(OBJ.EQ.-1)GOTO 1002
  378.     PLAC(OBJ)=J
  379.     FIXD(OBJ)=K
  380.     GOTO 1050
  381.  
  382. C  READ DEFAULT MESSAGE NUMBERS FOR ACTION VERBS, STORE IN ACTSPK.
  383.  
  384. 1060    READ(1,*)VERB,J
  385.     IF(VERB.EQ.-1)GOTO 1002
  386.     ACTSPK(VERB)=J
  387.     GOTO 1060
  388.  
  389. C  READ INFO ABOUT AVAILABLE LIQUIDS AND OTHER CONDITIONS, STORE IN COND.
  390.  
  391. 1070    DO 1072 I=1,20
  392. 1072    TK(I)=0
  393.     K=0
  394.     READ(1,*)K,TK
  395.     IF(K.EQ.-1)GOTO 1002
  396.     DO 1071 I=1,20
  397.     LOC=TK(I)
  398.     IF(LOC.EQ.0)GOTO 1070
  399.     IF(BITSET(LOC,K))CALL BUG(8)
  400. 1071    COND(LOC)=COND(LOC)+SHIFT(1,K)
  401.     GOTO 1070
  402.  
  403. C  READ DATA FOR HINTS.
  404.  
  405. 1080    HNTMAX=0
  406. 1081    DO 1084 I=1,20
  407. 1084    TK(I)=0
  408.     K=0
  409.     READ(1,*)K,TK
  410.     IF(K.EQ.-1)GOTO 1002
  411.     IF(K.EQ.0)GOTO 1081
  412.     IF(K.LT.0.OR.K.GT.HNTSIZ)CALL BUG(7)
  413.     DO 1083 I=1,4
  414. 1083    HINTS(K,I)=TK(I)
  415.     HNTMAX=MAX0(HNTMAX,K)
  416.     GOTO 1081
  417.  
  418. C  FINISH CONSTRUCTING INTERNAL DATA FORMAT
  419.  
  420. C  IF SETUP=2 WE DON'T NEED TO DO THIS.  IT'S ONLY NECESSARY IF WE HAVEN'T DONE
  421. C  IT AT ALL OR IF THE PROGRAM HAS BEEN RUN SINCE THEN.
  422.  
  423. 1100    IF(SETUP.EQ.2)GOTO 1
  424.     IF(SETUP.EQ.-1)GOTO 8305
  425.  
  426.  
  427. C  HAVING READ IN THE DATABASE, CERTAIN THINGS ARE NOW CONSTRUCTED.  PROPS ARE
  428. C  SET TO ZERO.  WE FINISH SETTING UP COND BY CHECKING FOR FORCED-MOTION TRAVEL
  429. C  ENTRIES.  THE PLAC AND FIXD ARRAYS ARE USED TO SET UP ATLOC(N) AS THE FIRST
  430. C  OBJECT AT LOCATION N, AND LINK(OBJ) AS THE NEXT OBJECT AT THE SAME LOCATION
  431. C  AS OBJ.  (OBJ>100 INDICATES THAT FIXED(OBJ-100)=LOC; LINK(OBJ) IS STILL THE
  432. C  CORRECT LINK TO USE.)  ABB IS ZEROED; IT CONTROLS WHETHER THE ABBREVIATED
  433. C  DESCRIPTION IS PRINTED.  COUNTS MOD 5 UNLESS "LOOK" IS USED.
  434.  
  435.     DO 1101 I=1,100
  436.     PLACE(I)=0
  437.     PROP(I)=0
  438.     LINK(I)=0
  439. 1101    LINK(I+100)=0
  440.  
  441.     DO 1102 I=1,LOCSIZ
  442.     ABB(I)=0
  443.     IF(LTEXT(I).EQ.0.OR.KEY(I).EQ.0)GOTO 1102
  444.     K=KEY(I)
  445.     IF(MOD(IABS(TRAVEL(K)),1000).EQ.1)COND(I)=2
  446. 1102    ATLOC(I)=0
  447.  
  448.  
  449. C  SET UP THE ATLOC AND LINK ARRAYS AS DESCRIBED ABOVE.  WE'LL USE THE DROP
  450. C  SUBROUTINE, WHICH PREFACES NEW OBJECTS ON THE LISTS.  SINCE WE WANT THINGS
  451. C  IN THE OTHER ORDER, WE'LL RUN THE LOOP BACKWARDS.  IF THE OBJECT IS IN TWO
  452. C  LOCS, WE DROP IT TWICE.  THIS ALSO SETS UP "PLACE" AND "FIXED" AS COPIES OF
  453. C  "PLAC" AND "FIXD".  ALSO, SINCE TWO-PLACED OBJECTS ARE TYPICALLY BEST
  454. C  DESCRIBED LAST, WE'LL DROP THEM FIRST.
  455.  
  456.     DO 1106 I=1,100
  457.     K=101-I
  458.     IF(FIXD(K).LE.0)GOTO 1106
  459.     CALL DROP(K+100,FIXD(K))
  460.     CALL DROP(K,PLAC(K))
  461. 1106    CONTINUE
  462.  
  463.     DO 1107 I=1,100
  464.     K=101-I
  465.     FIXED(K)=FIXD(K)
  466. 1107    IF(PLAC(K).NE.0.AND.FIXD(K).LE.0)CALL DROP(K,PLAC(K))
  467.  
  468.  
  469. C  TREASURES, AS NOTED EARLIER, ARE OBJECTS 50 THROUGH MAXTRS (CURRENTLY 79).
  470. C  THEIR PROPS ARE INITIALLY -1, AND ARE SET TO 0 THE FIRST TIME THEY ARE
  471. C  DESCRIBED.  TALLY KEEPS TRACK OF HOW MANY ARE NOT YET FOUND, SO WE KNOW
  472. C  WHEN TO CLOSE THE CAVE.  TALLY2 COUNTS HOW MANY CAN NEVER BE FOUND (E.G. IF
  473. C  LOST BIRD OR BRIDGE).
  474.  
  475.     MAXTRS=79
  476.     TALLY=0
  477.     TALLY2=0
  478.     DO 1200 I=50,MAXTRS
  479.     IF(PTEXT(I).NE.0)PROP(I)=-1
  480. 1200    TALLY=TALLY-PROP(I)
  481.  
  482. C  CLEAR THE HINT STUFF.  HINTLC(I) IS HOW LONG HE'S BEEN AT LOC WITH COND BIT
  483. C  I.  HINTED(I) IS TRUE IFF HINT I HAS BEEN USED.
  484.  
  485.     DO 1300 I=1,HNTMAX
  486.     HINTED(I)=.FALSE.
  487. 1300    HINTLC(I)=0
  488.  
  489. C  DEFINE SOME HANDY MNEMONICS.  THESE CORRESPOND TO OBJECT NUMBERS.
  490.  
  491.     KEYS=VOCAB('KEYS',1)
  492.     LAMP=VOCAB('LAMP',1)
  493.     GRATE=VOCAB('GRATE',1)
  494.     CAGE=VOCAB('CAGE',1)
  495.     ROD=VOCAB('ROD',1)
  496.     ROD2=ROD+1
  497.     STEPS=VOCAB('STEPS',1)
  498.     BIRD=VOCAB('BIRD',1)
  499.     DOOR=VOCAB('DOOR',1)
  500.     PILLOW=VOCAB('PILLO',1)
  501.     SNAKE=VOCAB('SNAKE',1)
  502.     FISSUR=VOCAB('FISSU',1)
  503.     TABLET=VOCAB('TABLE',1)
  504.     CLAM=VOCAB('CLAM',1)
  505.     OYSTER=VOCAB('OYSTE',1)
  506.     MAGZIN=VOCAB('MAGAZ',1)
  507.     DWARF=VOCAB('DWARF',1)
  508.     KNIFE=VOCAB('KNIFE',1)
  509.     FOOD=VOCAB('FOOD',1)
  510.     BOTTLE=VOCAB('BOTTL',1)
  511.     WATER=VOCAB('WATER',1)
  512.     OIL=VOCAB('OIL',1)
  513.     PLANT=VOCAB('PLANT',1)
  514.     PLANT2=PLANT+1
  515.     AXE=VOCAB('AXE',1)
  516.     MIRROR=VOCAB('MIRRO',1)
  517.     DRAGON=VOCAB('DRAGO',1)
  518.     CHASM=VOCAB('CHASM',1)
  519.     TROLL=VOCAB('TROLL',1)
  520.     TROLL2=TROLL+1
  521.     BEAR=VOCAB('BEAR',1)
  522.     MESSAG=VOCAB('MESSA',1)
  523.     VEND=VOCAB('VENDI',1)
  524.     BATTER=VOCAB('BATTE',1)
  525.  
  526. C  OBJECTS FROM 50 THROUGH WHATEVER ARE TREASURES.  HERE ARE A FEW.
  527.  
  528.     NUGGET=VOCAB('GOLD',1)
  529.     COINS=VOCAB('COINS',1)
  530.     CHEST=VOCAB('CHEST',1)
  531.     EGGS=VOCAB('EGGS',1)
  532.     TRIDNT=VOCAB('TRIDE',1)
  533.     VASE=VOCAB('VASE',1)
  534.     EMRALD=VOCAB('EMERA',1)
  535.     PYRAM=VOCAB('PYRAM',1)
  536.     PEARL=VOCAB('PEARL',1)
  537.     RUG=VOCAB('RUG',1)
  538.     CHAIN=VOCAB('CHAIN',1)
  539.  
  540. C  THESE ARE MOTION-VERB NUMBERS.
  541.  
  542.     BACK=VOCAB('BACK',0)
  543.     LOOK=VOCAB('LOOK',0)
  544.     CAVE=VOCAB('CAVE',0)
  545.     NULL=VOCAB('NULL',0)
  546.     ENTRNC=VOCAB('ENTRA',0)
  547.     DPRSSN=VOCAB('DEPRE',0)
  548.  
  549. C  AND SOME ACTION VERBS.
  550.  
  551.     SAY=VOCAB('SAY',2)
  552.     LOCK=VOCAB('LOCK',2)
  553.     THROW=VOCAB('THROW',2)
  554.     FIND=VOCAB('FIND',2)
  555.     INVENT=VOCAB('INVEN',2)
  556.  
  557. C  INITIALISE THE DWARVES.  DLOC IS LOC OF DWARVES, HARD-WIRED IN.  ODLOC IS
  558. C  PRIOR LOC OF EACH DWARF, INITIALLY GARBAGE.  DALTLC IS ALTERNATE INITIAL LOC
  559. C  FOR DWARF, IN CASE ONE OF THEM STARTS OUT ON TOP OF THE ADVENTURER.  (NO 2
  560. C  OF THE 5 INITIAL LOCS ARE ADJACENT.)  DSEEN IS TRUE IF DWARF HAS SEEN HIM.
  561. C  DFLAG CONTROLS THE LEVEL OF ACTIVATION OF ALL THIS:
  562. C    0    NO DWARF STUFF YET (WAIT UNTIL REACHES HALL OF MISTS)
  563. C    1    REACHED HALL OF MISTS, BUT HASN'T MET FIRST DWARF
  564. C    2    MET FIRST DWARF, OTHERS START MOVING, NO KNIVES THROWN YET
  565. C    3    A KNIFE HAS BEEN THROWN (FIRST SET ALWAYS MISSES)
  566. C    3+    DWARVES ARE MAD (INCREASES THEIR ACCURACY)
  567. C  SIXTH DWARF IS SPECIAL (THE PIRATE).  HE ALWAYS STARTS AT HIS CHEST'S
  568. C  EVENTUAL LOCATION INSIDE THE MAZE.  THIS LOC IS SAVED IN CHLOC FOR REF.
  569. C  THE DEAD END IN THE OTHER MAZE HAS ITS LOC STORED IN CHLOC2.
  570.  
  571.     CHLOC=114
  572.     CHLOC2=140
  573.     DO 1700 I=1,6
  574. 1700    DSEEN(I)=.FALSE.
  575.     DFLAG=0
  576.     DLOC(1)=19
  577.     DLOC(2)=27
  578.     DLOC(3)=33
  579.     DLOC(4)=44
  580.     DLOC(5)=64
  581.     DLOC(6)=CHLOC
  582.     DALTLC=18
  583.  
  584. C  OTHER RANDOM FLAGS AND COUNTERS, AS FOLLOWS:
  585. C    TURNS    TALLIES HOW MANY COMMANDS HE'S GIVEN (IGNORES YES/NO)
  586. C    LIMIT    LIFETIME OF LAMP (NOT SET HERE)
  587. C    IWEST    HOW MANY TIMES HE'S SAID "WEST" INSTEAD OF "W"
  588. C    KNFLOC    0 IF NO KNIFE HERE, LOC IF KNIFE HERE, -1 AFTER CAVEAT
  589. C    DETAIL    HOW OFTEN WE'VE SAID "NOT ALLOWED TO GIVE MORE DETAIL"
  590. C    ABBNUM    HOW OFTEN WE SHOULD PRINT NON-ABBREVIATED DESCRIPTIONS
  591. C    MAXDIE    NUMBER OF REINCARNATION MESSAGES AVAILABLE (UP TO 5)
  592. C    NUMDIE    NUMBER OF TIMES KILLED SO FAR
  593. C    HOLDNG    NUMBER OF OBJECTS BEING CARRIED
  594. C    DKILL    NUMBER OF DWARVES KILLED (UNUSED IN SCORING, NEEDED FOR MSG)
  595. C    FOOBAR    CURRENT PROGRESS IN SAYING "FEE FIE FOE FOO".
  596. C    BONUS    USED TO DETERMINE AMOUNT OF BONUS IF HE REACHES CLOSING
  597. C    CLOCK1    NUMBER OF TURNS FROM FINDING LAST TREASURE TILL CLOSING
  598. C    CLOCK2    NUMBER OF TURNS FROM FIRST WARNING TILL BLINDING FLASH
  599. C    LOGICALS WERE EXPLAINED EARLIER
  600.  
  601.     TURNS=0
  602.     LMWARN=.FALSE.
  603.     IWEST=0
  604.     KNFLOC=0
  605.     DETAIL=0
  606.     ABBNUM=5
  607.     DO 1800 I=0,4
  608. 1800    IF(RTEXT(2*I+81).NE.0)MAXDIE=I+1
  609.     NUMDIE=0
  610.     HOLDNG=0
  611.     DKILL=0
  612.     FOOBAR=0
  613.     BONUS=0
  614.     CLOCK1=30
  615.     CLOCK2=50
  616.     SAVED=-1
  617.     CLOSNG=.FALSE.
  618.     PANIC=.FALSE.
  619.     CLOSED=.FALSE.
  620.     GAVEUP=.FALSE.
  621.     SCORNG=.FALSE.
  622.  
  623. C  IF SETUP=1, REPORT ON AMOUNT OF ARRAYS ACTUALLY USED, TO PERMIT REDUCTIONS.
  624.  
  625.     IF(SETUP.NE.1)GOTO 1
  626.     SETUP=2
  627.  
  628.     DO 1998 K=1,LOCSIZ
  629.     KK=LOCSIZ+1-K
  630.     IF(LTEXT(KK).NE.0)GOTO 1997
  631. 1998    CONTINUE
  632.  
  633.     OBJ=0
  634. 1997    DO 1996 K=1,100
  635. 1996    IF(PTEXT(K).NE.0)OBJ=OBJ+1
  636.  
  637.     DO 1995 K=1,TABNDX
  638. 1995    IF(KTAB(K)/1000.EQ.2)VERB=KTAB(K)-2000
  639.  
  640.     DO 1994 K=1,RTXSIZ
  641.     J=RTXSIZ+1-K
  642.     IF(RTEXT(J).NE.0)GOTO 1993
  643. 1994    CONTINUE
  644.  
  645. 1993    DO 1992 K=1,MAGSIZ
  646.     I=MAGSIZ+1-K
  647.     IF(MTEXT(I).NE.0)GOTO 1991
  648. 1992    CONTINUE
  649.  
  650. 1991    K=100
  651. C    TYPE 1999,LINUSE,LINSIZ,TRVS,TRVSIZ,TABNDX,TABSIZ,KK
  652. C    1    ,LOCSIZ,OBJ,K,VERB,VRBSIZ,J,RTXSIZ,CLSSES,CLSMAX
  653. C    2    ,HNTMAX,HNTSIZ,I,MAGSIZ
  654. C1999    FORMAT (' Table space used:'/
  655. C    1    ' ',I6,' OF ',I6,' words of messages'/
  656. C    2    ' ',I6,' OF ',I6,' travel options'/
  657. C    3    ' ',I6,' OF ',I6,' vocabulary words'/
  658. C    4    ' ',I6,' OF ',I6,' locations'/
  659. C    5    ' ',I6,' OF ',I6,' objects'/
  660. C    6    ' ',I6,' OF ',I6,' action verbs'/
  661. C    7    ' ',I6,' OF ',I6,' RTEXT messages'/
  662. C    8    ' ',I6,' OF ',I6,' CLASS messages'/
  663. C    9    ' ',I6,' OF ',I6,' hints'/
  664. C    1    ' ',I6,' OF ',I6,' MAGIC messages'/
  665. C    2    )
  666.  
  667. C  FINALLY, SINCE WE'RE CLEARLY SETTING THINGS UP FOR THE FIRST TIME...
  668.  
  669.     CALL POOF
  670. C    TYPE *,'INIT DONE'
  671.  
  672. C  START-UP, DWARF STUFF
  673.  
  674. 1    I=RAN(1)
  675.     HINTED(3)=YES(65,1,0)
  676.     NEWLOC=1
  677.     SETUP=3
  678.     LIMIT=1000
  679.     IF(HINTED(3))LIMIT=1000
  680. CP    CALL MAXTIM(9999999)
  681.  
  682. C  CAN'T LEAVE CAVE ONCE IT'S CLOSING (EXCEPT BY MAIN OFFICE).
  683.  
  684. 2    IF(NEWLOC.GE.9.OR.NEWLOC.EQ.0.OR..NOT.CLOSNG)GOTO 71
  685.     CALL RSPEAK(130)
  686.     NEWLOC=LOC
  687.     IF(.NOT.PANIC)CLOCK2=15
  688.     PANIC=.TRUE.
  689.  
  690. C  SEE IF A DWARF HAS SEEN HIM AND HAS COME FROM WHERE HE WANTS TO GO.  IF SO,
  691. C  THE DWARF'S BLOCKING HIS WAY.  IF COMING FROM PLACE FORBIDDEN TO PIRATE
  692. C  (DWARVES ROOTED IN PLACE) LET HIM GET OUT (AND ATTACKED).
  693.  
  694. 71    IF(NEWLOC.EQ.LOC.OR.FORCED(LOC).OR.BITSET(LOC,3))GOTO 74
  695.     DO 73 I=1,5
  696.     IF(ODLOC(I).NE.NEWLOC.OR..NOT.DSEEN(I))GOTO 73
  697.     NEWLOC=LOC
  698.     CALL RSPEAK(2)
  699.     GOTO 74
  700. 73    CONTINUE
  701. 74    LOC=NEWLOC
  702.  
  703. C  DWARF STUFF.  SEE EARLIER COMMENTS FOR DESCRIPTION OF VARIABLES.  REMEMBER
  704. C  SIXTH DWARF IS PIRATE AND IS THUS VERY DIFFERENT EXCEPT FOR MOTION RULES.
  705.  
  706. C  FIRST OFF, DON'T LET THE DWARVES FOLLOW HIM INTO A PIT OR A WALL.  ACTIVATE
  707. C  THE WHOLE MESS THE FIRST TIME HE GETS AS FAR AS THE HALL OF MISTS (LOC 15).
  708. C  IF NEWLOC IS FORBIDDEN TO PIRATE (IN PARTICULAR, IF IT'S BEYOND THE TROLL
  709. C  BRIDGE), BYPASS DWARF STUFF.  THAT WAY PIRATE CAN'T STEAL RETURN TOLL, AND
  710. C  DWARVES CAN'T MEET THE BEAR.  ALSO MEANS DWARVES WON'T FOLLOW HIM INTO DEAD
  711. C  END IN MAZE, BUT C'EST LA VIE.  THEY'LL WAIT FOR HIM OUTSIDE THE DEAD END.
  712.  
  713.     IF(LOC.EQ.0.OR.FORCED(LOC).OR.BITSET(NEWLOC,3))GOTO 2000
  714.     IF(DFLAG.NE.0)GOTO 6000
  715.     IF(LOC.GE.15)DFLAG=1
  716.     GOTO 2000
  717.  
  718. C  WHEN WE ENCOUNTER THE FIRST DWARF, WE KILL 0, 1, OR 2 OF THE 5 DWARVES.  IF
  719. C  ANY OF THE SURVIVORS IS AT LOC, REPLACE HIM WITH THE ALTERNATE.
  720.  
  721. 6000    IF(DFLAG.NE.1)GOTO 6010
  722.     IF(LOC.LT.15.OR.PCT(95))GOTO 2000
  723.     DFLAG=2
  724.     DO 6001 I=1,2
  725.     J=1+RAN(5)
  726.  
  727. C  IF SAVED NOT = -1, HE BYPASSED THE "START" CALL.
  728.  
  729. 6001    IF(PCT(50).AND.SAVED.EQ.-1)DLOC(J)=0
  730.     DO 6002 I=1,5
  731.     IF(DLOC(I).EQ.LOC)DLOC(I)=DALTLC
  732. 6002    ODLOC(I)=DLOC(I)
  733.     CALL RSPEAK(3)
  734.     CALL DROP(AXE,LOC)
  735.     GOTO 2000
  736.  
  737. C  THINGS ARE IN FULL SWING.  MOVE EACH DWARF AT RANDOM, EXCEPT IF HE'S SEEN US
  738. C  HE STICKS WITH US.  DWARVES NEVER GO TO LOCS <15.  IF WANDERING AT RANDOM,
  739. C  THEY DON'T BACK UP UNLESS THERE'S NO ALTERNATIVE.  IF THEY DON'T HAVE TO
  740. C  MOVE, THEY ATTACK.  AND, OF COURSE, DEAD DWARVES DON'T DO MUCH OF ANYTHING.
  741.  
  742. 6010    DTOTAL=0
  743.     ATTACK=0
  744.     STICK=0
  745.     DO 6030 I=1,6
  746.     IF(DLOC(I).EQ.0)GOTO 6030
  747.     J=1
  748.     KK=DLOC(I)
  749.     KK=KEY(KK)
  750.     IF(KK.EQ.0)GOTO 6016
  751. 6012    NEWLOC=MOD(IABS(TRAVEL(KK))/1000,1000)
  752.     IF(NEWLOC.GT.300.OR.NEWLOC.LT.15.OR.NEWLOC.EQ.ODLOC(I)
  753.     1    .OR.(J.GT.1.AND.NEWLOC.EQ.TK(J-1)).OR.J.GE.20
  754.     2    .OR.NEWLOC.EQ.DLOC(I).OR.FORCED(NEWLOC)
  755.     3    .OR.(I.EQ.6.AND.BITSET(NEWLOC,3))
  756.     4    .OR.IABS(TRAVEL(KK))/1000000.EQ.100)GOTO 6014
  757.     TK(J)=NEWLOC
  758.     J=J+1
  759. 6014    KK=KK+1
  760.     IF(TRAVEL(KK-1).GE.0)GOTO 6012
  761. 6016    TK(J)=ODLOC(I)
  762.     IF(J.GE.2)J=J-1
  763.     J=1+RAN(J)
  764.     ODLOC(I)=DLOC(I)
  765.     DLOC(I)=TK(J)
  766.     DSEEN(I)=(DSEEN(I).AND.LOC.GE.15)
  767.     1    .OR.(DLOC(I).EQ.LOC.OR.ODLOC(I).EQ.LOC)
  768.     IF(.NOT.DSEEN(I))GOTO 6030
  769.     DLOC(I)=LOC
  770.     IF(I.NE.6)GOTO 6027
  771.  
  772. C  THE PIRATE'S SPOTTED HIM.  HE LEAVES HIM ALONE ONCE WE'VE FOUND CHEST.
  773. C  K COUNTS IF A TREASURE IS HERE.  IF NOT, AND TALLY=TALLY2 PLUS ONE FOR
  774. C  AN UNSEEN CHEST, LET THE PIRATE BE SPOTTED.
  775.  
  776.     IF(LOC.EQ.CHLOC.OR.PROP(CHEST).GE.0)GOTO 6030
  777.     K=0
  778.     DO 6020 J=50,MAXTRS
  779.  
  780. C  PIRATE WON'T TAKE PYRAMID FROM PLOVER ROOM OR DARK ROOM (TOO EASY!).
  781.  
  782.     IF(J.EQ.PYRAM.AND.(LOC.EQ.PLAC(PYRAM)
  783.     1    .OR.LOC.EQ.PLAC(EMRALD)))GOTO 6020
  784.     IDONDX=J
  785.     IF(TOTING(IDONDX))GOTO 6022
  786. 6020    IF(HERE(IDONDX))K=1
  787.     IF(TALLY.EQ.TALLY2+1.AND.K.EQ.0.AND.PLACE(CHEST).EQ.0
  788.     1    .AND.HERE(LAMP).AND.PROP(LAMP).EQ.1)GOTO 6025
  789.     IF(ODLOC(6).NE.DLOC(6).AND.PCT(20))CALL RSPEAK(127)
  790.     GOTO 6030
  791.  
  792. 6022    CALL RSPEAK(128)
  793. C  DON'T STEAL CHEST BACK FROM TROLL!
  794.     IF(PLACE(MESSAG).EQ.0)CALL MOVE(CHEST,CHLOC)
  795.     CALL MOVE(MESSAG,CHLOC2)
  796.     DO 6023 J=50,MAXTRS
  797.     IF(J.EQ.PYRAM.AND.(LOC.EQ.PLAC(PYRAM)
  798.     1    .OR.LOC.EQ.PLAC(EMRALD)))GOTO 6023
  799.     IDONDX=J
  800.     IF(AT(IDONDX).AND.FIXED(IDONDX).EQ.0)
  801.     1 CALL CARRY(IDONDX,LOC)
  802.     IF(TOTING(IDONDX))CALL DROP(IDONDX,CHLOC)
  803. 6023    CONTINUE
  804. 6024    DLOC(6)=CHLOC
  805.     ODLOC(6)=CHLOC
  806.     DSEEN(6)=.FALSE.
  807.     GOTO 6030
  808.  
  809. 6025    CALL RSPEAK(186)
  810.     CALL MOVE(CHEST,CHLOC)
  811.     CALL MOVE(MESSAG,CHLOC2)
  812.     GOTO 6024
  813.  
  814. C  THIS THREATENING LITTLE DWARF IS IN THE ROOM WITH HIM!
  815.  
  816. 6027    DTOTAL=DTOTAL+1
  817.     IF(ODLOC(I).NE.DLOC(I))GOTO 6030
  818.     ATTACK=ATTACK+1
  819.     IF(KNFLOC.GE.0)KNFLOC=LOC
  820.     IF(RAN(1000).LT.95*(DFLAG-2))STICK=STICK+1
  821. 6030    CONTINUE
  822.  
  823. C  NOW WE KNOW WHAT'S HAPPENING.  LET'S TELL THE POOR SUCKER ABOUT IT.
  824.  
  825.     IF(DTOTAL.EQ.0)GOTO 2000
  826.     IF(DTOTAL.EQ.1)GOTO 75
  827.     TYPE 67,DTOTAL
  828. 67    FORMAT(/' There are ',I1,' threatening little dwarves in the'
  829.     1    ,' room with you.')
  830.     GOTO 77
  831. 75    CALL RSPEAK(4)
  832. 77    IF(ATTACK.EQ.0)GOTO 2000
  833.     IF(DFLAG.EQ.2)DFLAG=3
  834.  
  835. C  IF SAVED NOT = -1, HE BYPASSED THE "START" CALL.  DWARVES GET *VERY* MAD!
  836.     IF(SAVED.NE.-1)DFLAG=20
  837.  
  838.     IF(ATTACK.EQ.1)GOTO 79
  839.     TYPE 78,ATTACK
  840. 78    FORMAT(/' ',I1,' of them throw knives at you!')
  841.     K=6
  842. 82    IF(STICK.GT.1)GOTO 83
  843.     CALL RSPEAK(K+STICK)
  844.     IF(STICK.EQ.0)GOTO 2000
  845.     GOTO 84
  846. 83    TYPE 68,STICK
  847. 68    FORMAT(/' ',I1,' of them get you!')
  848. 84    OLDLC2=LOC
  849.     GOTO 99
  850.  
  851. C    *** 99 You are Dead...
  852.  
  853. 79    CALL RSPEAK(5)
  854.     K=52
  855.     GOTO 82
  856.  
  857. C  DESCRIBE THE CURRENT LOCATION AND (MAYBE) GET NEXT COMMAND.
  858.  
  859. C  PRINT TEXT FOR CURRENT LOC.
  860.  
  861. 2000    IF(LOC.EQ.0)GOTO 99
  862.     KK=STEXT(LOC)
  863.     IF(MOD(ABB(LOC),ABBNUM).EQ.0.OR.KK.EQ.0)KK=LTEXT(LOC)
  864.     IF(FORCED(LOC).OR..NOT.DARK(0))GOTO 2001
  865.     IF(WZDARK.AND.PCT(35))GOTO 90
  866.     KK=RTEXT(16)
  867. 2001    IF(TOTING(BEAR))CALL RSPEAK(141)
  868.     CALL SPEAK(KK)
  869.     K=1
  870.     IF(FORCED(LOC))GOTO 8
  871.     IF(LOC.EQ.33.AND.PCT(25).AND..NOT.CLOSNG)CALL RSPEAK(8)
  872.  
  873. C  PRINT OUT DESCRIPTIONS OF OBJECTS AT THIS LOCATION.  IF NOT CLOSING AND
  874. C  PROPERTY VALUE IS NEGATIVE, TALLY OFF ANOTHER TREASURE.  RUG IS SPECIAL
  875. C  CASE; ONCE SEEN, ITS PROP IS 1 (DRAGON ON IT) TILL DRAGON IS KILLED.
  876. C  SIMILARLY FOR CHAIN; PROP IS INITIALLY 1 (LOCKED TO BEAR).  THESE HACKS
  877. C  ARE BECAUSE PROP=0 IS NEEDED TO GET FULL SCORE.
  878.  
  879.     IF(DARK(0))GOTO 2012
  880.     ABB(LOC)=ABB(LOC)+1
  881.     I=ATLOC(LOC)
  882. 2004    IF(I.EQ.0)GOTO 2012
  883.     OBJ=I
  884.     IF(OBJ.GT.100)OBJ=OBJ-100
  885.     IF(OBJ.EQ.STEPS.AND.TOTING(NUGGET))GOTO 2008
  886.     IF(PROP(OBJ).GE.0)GOTO 2006
  887.     IF(CLOSED)GOTO 2008
  888.     PROP(OBJ)=0
  889.     IF(OBJ.EQ.RUG.OR.OBJ.EQ.CHAIN)PROP(OBJ)=1
  890.     TALLY=TALLY-1
  891. C  IF REMAINING TREASURES TOO ELUSIVE, ZAP HIS LAMP.
  892.     IF(TALLY.EQ.TALLY2.AND.TALLY.NE.0)LIMIT=MIN0(35,LIMIT)
  893. 2006    KK=PROP(OBJ)
  894.     IF(OBJ.EQ.STEPS.AND.LOC.EQ.FIXED(STEPS))KK=1
  895.     CALL PSPEAK(OBJ,KK)
  896. 2008    I=LINK(I)
  897.     GOTO 2004
  898.  
  899. 2009    K=54
  900. 2010    SPK=K
  901. 2011    CALL RSPEAK(SPK)
  902.  
  903. 2012    VERB=0
  904.     OBJ=0
  905.  
  906. C  CHECK IF THIS LOC IS ELIGIBLE FOR ANY HINTS.  IF BEEN HERE LONG ENOUGH,
  907. C  BRANCH TO HELP SECTION (ON LATER PAGE).  HINTS ALL COME BACK HERE EVENTUALLY
  908. C  TO FINISH THE LOOP.  IGNORE "HINTS" < 4 (SPECIAL STUFF, SEE DATABASE NOTES).
  909.  
  910. 2600    DO 2602 HINT=4,HNTMAX
  911.     IF(HINTED(HINT))GOTO 2602
  912.     IDONDX=HINT
  913.     IF(.NOT.BITSET(LOC,IDONDX))HINTLC(HINT)=-1
  914.     HINTLC(HINT)=HINTLC(HINT)+1
  915.     IF(HINTLC(HINT).GE.HINTS(HINT,1))GOTO 40000
  916. 2602    CONTINUE
  917.  
  918. C  KICK THE RANDOM NUMBER GENERATOR JUST TO ADD VARIETY TO THE CHASE.  ALSO,
  919. C  IF CLOSING TIME, CHECK FOR ANY OBJECTS BEING TOTED WITH PROP < 0 AND SET
  920. C  THE PROP TO -1-PROP.  THIS WAY OBJECTS WON'T BE DESCRIBED UNTIL THEY'VE
  921. C  BEEN PICKED UP AND PUT DOWN SEPARATE FROM THEIR RESPECTIVE PILES.  DON'T
  922. C  TICK CLOCK1 UNLESS WELL INTO CAVE (AND NOT AT Y2).
  923.  
  924.     IF(.NOT.CLOSED)GOTO 2605
  925.     IF(PROP(OYSTER).LT.0.AND.TOTING(OYSTER))
  926.     1    CALL PSPEAK(OYSTER,1)
  927.     DO 2604 I=1,100
  928.     IDONDX=I
  929. 2604    IF(TOTING(IDONDX).AND.PROP(IDONDX).LT.0)
  930.     1 PROP(IDONDX)=-1-PROP(IDONDX)
  931. 2605    WZDARK=DARK(0)
  932.     IF(KNFLOC.GT.0.AND.KNFLOC.NE.LOC)KNFLOC=0
  933.     I=RAN(1)
  934. 2607    CALL GETIN(Wd1, Wd2 )
  935.     IF(ichar(wd1(1:1)) .eq. 0) goto 2607
  936.  
  937. C  EVERY INPUT, CHECK "FOOBAR" FLAG.  IF ZERO, NOTHING'S GOING ON.  IF POS,
  938. C  MAKE NEG.  IF NEG, HE SKIPPED A WORD, SO MAKE IT ZERO.
  939.  
  940. 2608    FOOBAR=MIN0(0,-FOOBAR)
  941.  
  942.     TURNS=TURNS+1
  943. C    IF(DEMO.AND.TURNS.GE.SHORT)GOTO 13000
  944.     IF(VERB.EQ.SAY.AND.WD2.NE.' ')VERB=0
  945.     IF(VERB.EQ.SAY)GOTO 4090
  946.     IF(TALLY.EQ.0.AND.LOC.GE.15.AND.LOC.NE.33)CLOCK1=CLOCK1-1
  947.     IF(CLOCK1.EQ.0)GOTO 10000
  948.     IF(CLOCK1.LT.0)CLOCK2=CLOCK2-1
  949.     IF(CLOCK2.EQ.0)GOTO 11000
  950.     IF(PROP(LAMP).EQ.1)LIMIT=LIMIT-1
  951.     IF(LIMIT.LE.30.AND.HERE(BATTER).AND.PROP(BATTER).EQ.0
  952.     1    .AND.HERE(LAMP))GOTO 12000
  953.     IF(LIMIT.EQ.0)GOTO 12400
  954.     IF(LIMIT.LT.0.AND.LOC.LE.8)GOTO 12600
  955.     IF(LIMIT.LE.30)GOTO 12200
  956. 19999    K=43
  957.     IF(LIQLOC(LOC).EQ.WATER)K=70
  958.     IF(WD1.EQ.'ENTER'.AND.(WD2.EQ.'STREA'.OR.WD2.EQ.'WATER'))
  959.     1    GOTO 2010
  960.     IF(WD1.EQ.'ENTER'.AND.WD2.NE.' ')GOTO 2800
  961.     IF((WD1.NE.'WATER'.AND.WD1.NE.'OIL')
  962.     1    .OR.(WD2.NE.'PLANT'.AND.WD2.NE.'DOOR'))GOTO 2610
  963.     IF(AT(VOCAB(WD2,1)))WD2='POUR'
  964. 2610    IF(WD1.NE.'WEST')GOTO 2630
  965.     IWEST=IWEST+1
  966.     IF(IWEST.EQ.10)CALL RSPEAK(17)
  967. 2630    I=VOCAB(WD1,-1)
  968.     IF(I.EQ.-1)GOTO 3000
  969.     K=MOD(I,1000)
  970.     KQ=I/1000+1
  971.     GOTO (8,5000,4000,2010)KQ
  972.     CALL BUG(22)
  973.  
  974. C  GET SECOND WORD FOR ANALYSIS.
  975.  
  976. 2800    WD1=WD2
  977.     WD2=' '
  978.     GOTO 2610
  979.  
  980. C  GEE, I DON'T UNDERSTAND.
  981.  
  982. 3000    SPK=60
  983.     IF(PCT(20))SPK=61
  984.     IF(PCT(20))SPK=13
  985.     CALL RSPEAK(SPK)
  986.     GOTO 2600
  987.  
  988. C  ANALYSE A VERB.  REMEMBER WHAT IT WAS, GO BACK FOR OBJECT IF SECOND WORD
  989. C  UNLESS VERB IS "SAY", WHICH SNARFS ARBITRARY SECOND WORD.
  990.  
  991. 4000    VERB=K
  992.     SPK=ACTSPK(VERB)
  993.     IF(WD2.NE.' '.AND.VERB.NE.SAY)GOTO 2800
  994.     IF(VERB.EQ.SAY)OBJ=VOCAB(WD2,-1)
  995.     IF(OBJ.NE.0)GOTO 4090
  996.  
  997. C  ANALYSE AN INTRANSITIVE VERB (IE, NO OBJECT GIVEN YET).
  998.  
  999. 4080    GOTO(8010,8000,8000,8040,2009,8040,9070,9080,8000,8000,
  1000.     1    2011,9120,9130,8140,9150,8000,8000,8180,8000,8200,
  1001.     2    8000,9220,9230,8240,8250,8260,8270,8000,8000,8300,
  1002.     3    8310)VERB
  1003. C         TAKE DROP  SAY OPEN NOTH LOCK   ON  OFF WAVE CALM
  1004. C         WALK KILL POUR  EAT DRNK  RUB TOSS QUIT FIND INVN
  1005. C         FEED FILL BLST SCOR  FOO  BRF READ BREK WAKE SUSP
  1006. C         HOUR
  1007.     CALL BUG(23)
  1008.  
  1009. C  ANALYSE A TRANSITIVE VERB.
  1010.  
  1011. 4090    GOTO(9010,9020,9030,9040,2009,9040,9070,9080,9090,2011,
  1012.     1    2011,9120,9130,9140,9150,9160,9170,2011,9190,9190,
  1013.     2    9210,9220,9230,2011,2011,2011,9270,9280,9290,2011,
  1014.     3    2011)VERB
  1015. C         TAKE DROP  SAY OPEN NOTH LOCK   ON  OFF WAVE CALM
  1016. C         WALK KILL POUR  EAT DRNK  RUB TOSS QUIT FIND INVN
  1017. C         FEED FILL BLST SCOR  FOO  BRF READ BREK WAKE SUSP
  1018. C         HOUR
  1019.     CALL BUG(24)
  1020.  
  1021. C  ANALYSE AN OBJECT WORD.  SEE IF THE THING IS HERE, WHETHER WE'VE GOT A VERB
  1022. C  YET, AND SO ON.  OBJECT MUST BE HERE UNLESS VERB IS "FIND" OR "INVENT(ORY)"
  1023. C  (AND NO NEW VERB YET TO BE ANALYSED).  WATER AND OIL ARE ALSO FUNNY, SINCE
  1024. C  THEY ARE NEVER ACTUALLY DROPPED AT ANY LOCATION, BUT MIGHT BE HERE INSIDE
  1025. C  THE BOTTLE OR AS A FEATURE OF THE LOCATION.
  1026.  
  1027. 5000    OBJ=K
  1028.     IF(FIXED(K).NE.LOC.AND..NOT.HERE(K))GOTO 5100
  1029. 5010    IF(WD2.NE.' ')GOTO 2800
  1030.     IF(VERB.NE.0)GOTO 4090
  1031.     CALL A5TOA1(WD1,'?',TK,K)
  1032.     TYPE 5015,(TK(I),I=1,K)
  1033. 5015    FORMAT(/' What do you want to do with the ',20A1)
  1034.     GOTO 2600
  1035.  
  1036. 5100    IF(K.NE.GRATE)GOTO 5110
  1037.     IF(LOC.EQ.1.OR.LOC.EQ.4.OR.LOC.EQ.7)K=DPRSSN
  1038.     IF(LOC.GT.9.AND.LOC.LT.15)K=ENTRNC
  1039.     IF(K.NE.GRATE)GOTO 8
  1040. 5110    IF(K.NE.DWARF)GOTO 5120
  1041.     DO 5112 I=1,5
  1042.     IF(DLOC(I).EQ.LOC.AND.DFLAG.GE.2)GOTO 5010
  1043. 5112    CONTINUE
  1044. 5120    IF((LIQ(0).EQ.K.AND.HERE(BOTTLE)).OR.K.EQ.LIQLOC(LOC))GOTO 5010
  1045.     IF(OBJ.NE.PLANT.OR..NOT.AT(PLANT2).OR.PROP(PLANT2).EQ.0)GOTO 5130
  1046.     OBJ=PLANT2
  1047.     GOTO 5010
  1048. 5130    IF(OBJ.NE.KNIFE.OR.KNFLOC.NE.LOC)GOTO 5140
  1049.     KNFLOC=-1
  1050.     SPK=116
  1051.     GOTO 2011
  1052. 5140    IF(OBJ.NE.ROD.OR..NOT.HERE(ROD2))GOTO 5190
  1053.     OBJ=ROD2
  1054.     GOTO 5010
  1055. 5190    IF((VERB.EQ.FIND.OR.VERB.EQ.INVENT).AND.WD2.EQ.' ')GOTO 5010
  1056.     CALL A5TOA1(WD1,'here.',TK,K)
  1057.     TYPE 5199,(TK(I),I=1,K)
  1058. 5199    FORMAT(/' I see no ',20A1)
  1059.     GOTO 2012
  1060.  
  1061. C  FIGURE OUT THE NEW LOCATION
  1062. C
  1063. C  GIVEN THE CURRENT LOCATION IN "LOC", AND A MOTION VERB NUMBER IN "K", PUT
  1064. C  THE NEW LOCATION IN "NEWLOC".  THE CURRENT LOC IS SAVED IN "OLDLOC" IN CASE
  1065. C  HE WANTS TO RETREAT.  THE CURRENT OLDLOC IS SAVED IN OLDLC2, IN CASE HE
  1066. C  DIES.  (IF HE DOES, NEWLOC WILL BE LIMBO, AND OLDLOC WILL BE WHAT KILLED
  1067. C  HIM, SO WE NEED OLDLC2, WHICH IS THE LAST PLACE HE WAS SAFE.)
  1068.  
  1069. 8    KK=KEY(LOC)
  1070.     NEWLOC=LOC
  1071.     IF(KK.EQ.0)CALL BUG(26)
  1072.     IF(K.EQ.NULL)GOTO 2
  1073.     IF(K.EQ.BACK)GOTO 20
  1074.     IF(K.EQ.LOOK)GOTO 30
  1075.     IF(K.EQ.CAVE)GOTO 40
  1076.     OLDLC2=OLDLOC
  1077.     OLDLOC=LOC
  1078.  
  1079. 9    LL=IABS(TRAVEL(KK))
  1080.     IF(MOD(LL,1000).EQ.1.OR.MOD(LL,1000).EQ.K)GOTO 10
  1081.     IF(TRAVEL(KK).LT.0)GOTO 50
  1082.     KK=KK+1
  1083.     GOTO 9
  1084.  
  1085. 10    LL=LL/1000
  1086. 11    NEWLOC=LL/1000
  1087.     K=MOD(NEWLOC,100)
  1088.     IF(NEWLOC.LE.300)GOTO 13
  1089.     IF(PROP(K).NE.NEWLOC/100-3)GOTO 16
  1090. 12    IF(TRAVEL(KK).LT.0)CALL BUG(25)
  1091.     KK=KK+1
  1092.     NEWLOC=IABS(TRAVEL(KK))/1000
  1093.     IF(NEWLOC.EQ.LL)GOTO 12
  1094.     LL=NEWLOC
  1095.     GOTO 11
  1096.  
  1097. 13    IF(NEWLOC.LE.100)GOTO 14
  1098.     IF(TOTING(K).OR.(NEWLOC.GT.200.AND.AT(K)))GOTO 16
  1099.     GOTO 12
  1100.  
  1101. 14    IF(NEWLOC.NE.0.AND..NOT.PCT(NEWLOC))GOTO 12
  1102. 16    NEWLOC=MOD(LL,1000)
  1103.     IF(NEWLOC.LE.300)GOTO 2
  1104.     IF(NEWLOC.LE.500)GOTO 30000
  1105.     CALL RSPEAK(NEWLOC-500)
  1106.     NEWLOC=LOC
  1107.     GOTO 2
  1108.  
  1109. C  SPECIAL MOTIONS COME HERE.  LABELLING CONVENTION: STATEMENT NUMBERS NNNXX
  1110. C  (XX=00-99) ARE USED FOR SPECIAL CASE NUMBER NNN (NNN=301-500).
  1111.  
  1112. 30000    NEWLOC=NEWLOC-300
  1113.     GOTO (30100,30200,30300)NEWLOC
  1114.     CALL BUG(20)
  1115.  
  1116. C  TRAVEL 301.  PLOVER-ALCOVE PASSAGE.  CAN CARRY ONLY EMERALD.  NOTE: TRAVEL
  1117. C  TABLE MUST INCLUDE "USELESS" ENTRIES GOING THROUGH PASSAGE, WHICH CAN NEVER
  1118. C  BE USED FOR ACTUAL MOTION, BUT CAN BE SPOTTED BY "GO BACK".
  1119.  
  1120. 30100    NEWLOC=99+100-LOC
  1121.     IF(HOLDNG.EQ.0.OR.(HOLDNG.EQ.1.AND.TOTING(EMRALD)))GOTO 2
  1122.     NEWLOC=LOC
  1123.     CALL RSPEAK(117)
  1124.     GOTO 2
  1125.  
  1126. C  TRAVEL 302.  PLOVER TRANSPORT.  DROP THE EMERALD (ONLY USE SPECIAL TRAVEL IF
  1127. C  TOTING IT), SO HE'S FORCED TO USE THE PLOVER-PASSAGE TO GET IT OUT.  HAVING
  1128. C  DROPPED IT, GO BACK AND PRETEND HE WASN'T CARRYING IT AFTER ALL.
  1129.  
  1130. 30200    CALL DROP(EMRALD,LOC)
  1131.     GOTO 12
  1132.  
  1133. C  TRAVEL 303.  TROLL BRIDGE.  MUST BE DONE ONLY AS SPECIAL MOTION SO THAT
  1134. C  DWARVES WON'T WANDER ACROSS AND ENCOUNTER THE BEAR.  (THEY WON'T FOLLOW THE
  1135. C  PLAYER THERE BECAUSE THAT REGION IS FORBIDDEN TO THE PIRATE.)  IF
  1136. C  PROP(TROLL)=1, HE'S CROSSED SINCE PAYING, SO STEP OUT AND BLOCK HIM.
  1137. C  (STANDARD TRAVEL ENTRIES CHECK FOR PROP(TROLL)=0.)  SPECIAL STUFF FOR BEAR.
  1138.  
  1139. 30300    IF(PROP(TROLL).NE.1)GOTO 30310
  1140.     CALL PSPEAK(TROLL,1)
  1141.     PROP(TROLL)=0
  1142.     CALL MOVE(TROLL2,0)
  1143.     CALL MOVE(TROLL2+100,0)
  1144.     CALL MOVE(TROLL,PLAC(TROLL))
  1145.     CALL MOVE(TROLL+100,FIXD(TROLL))
  1146.     CALL JUGGLE(CHASM)
  1147.     NEWLOC=LOC
  1148.     GOTO 2
  1149.  
  1150. 30310    NEWLOC=PLAC(TROLL)+FIXD(TROLL)-LOC
  1151.     IF(PROP(TROLL).EQ.0)PROP(TROLL)=1
  1152.     IF(.NOT.TOTING(BEAR))GOTO 2
  1153.     CALL RSPEAK(162)
  1154.     PROP(CHASM)=1
  1155.     PROP(TROLL)=2
  1156.     CALL DROP(BEAR,NEWLOC)
  1157.     FIXED(BEAR)=-1
  1158.     PROP(BEAR)=3
  1159.     IF(PROP(SPICES).LT.0)TALLY2=TALLY2+1
  1160.     OLDLC2=NEWLOC
  1161.     GOTO 99
  1162.  
  1163. C  END OF SPECIALS.
  1164.  
  1165. C  HANDLE "GO BACK".  LOOK FOR VERB WHICH GOES FROM LOC TO OLDLOC, OR TO OLDLC2
  1166. C  IF OLDLOC HAS FORCED-MOTION.  K2 SAVES ENTRY -> FORCED LOC -> PREVIOUS LOC.
  1167.  
  1168. 20    K=OLDLOC
  1169.     IF(FORCED(K))K=OLDLC2
  1170.     OLDLC2=OLDLOC
  1171.     OLDLOC=LOC
  1172.     K2=0
  1173.     IF(K.NE.LOC)GOTO 21
  1174.     CALL RSPEAK(91)
  1175.     GOTO 2
  1176.  
  1177. 21    LL=MOD((IABS(TRAVEL(KK))/1000),1000)
  1178.     IF(LL.EQ.K)GOTO 25
  1179.     IF(LL.GT.300)GOTO 22
  1180.     J=KEY(LL)
  1181.     IF(FORCED(LL).AND.MOD((IABS(TRAVEL(J))/1000),1000).EQ.K)K2=KK
  1182. 22    IF(TRAVEL(KK).LT.0)GOTO 23
  1183.     KK=KK+1
  1184.     GOTO 21
  1185.  
  1186. 23    KK=K2
  1187.     IF(KK.NE.0)GOTO 25
  1188.     CALL RSPEAK(140)
  1189.     GOTO 2
  1190.  
  1191. 25    K=MOD(IABS(TRAVEL(KK)),1000)
  1192.     KK=KEY(LOC)
  1193.     GOTO 9
  1194.  
  1195. C  LOOK.  CAN'T GIVE MORE DETAIL.  PRETEND IT WASN'T DARK (THOUGH IT MAY "NOW"
  1196. C  BE DARK) SO HE WON'T FALL INTO A PIT WHILE STARING INTO THE GLOOM.
  1197.  
  1198. 30    IF(DETAIL.LT.3)CALL RSPEAK(15)
  1199.     DETAIL=DETAIL+1
  1200.     WZDARK=.FALSE.
  1201.     ABB(LOC)=0
  1202.     GOTO 2
  1203.  
  1204. C  CAVE.  DIFFERENT MESSAGES DEPENDING ON WHETHER ABOVE GROUND.
  1205.  
  1206. 40    IF(LOC.LT.8)CALL RSPEAK(57)
  1207.     IF(LOC.GE.8)CALL RSPEAK(58)
  1208.     GOTO 2
  1209.  
  1210. C  NON-APPLICABLE MOTION.  VARIOUS MESSAGES DEPENDING ON WORD GIVEN.
  1211.  
  1212. 50    SPK=12
  1213.     IF(K.GE.43.AND.K.LE.50)SPK=9
  1214.     IF(K.EQ.29.OR.K.EQ.30)SPK=9
  1215.     IF(K.EQ.7.OR.K.EQ.36.OR.K.EQ.37)SPK=10
  1216.     IF(K.EQ.11.OR.K.EQ.19)SPK=11
  1217.     IF(VERB.EQ.FIND.OR.VERB.EQ.INVENT)SPK=59
  1218.     IF(K.EQ.62.OR.K.EQ.65)SPK=42
  1219.     IF(K.EQ.17)SPK=80
  1220.     CALL RSPEAK(SPK)
  1221.     GOTO 2
  1222.  
  1223. C  "YOU'RE DEAD, JIM."
  1224. C
  1225. C  IF THE CURRENT LOC IS ZERO, IT MEANS THE CLOWN GOT HIMSELF KILLED.  WE'LL
  1226. C  ALLOW THIS MAXDIE TIMES.  MAXDIE IS AUTOMATICALLY SET BASED ON THE NUMBER OF
  1227. C  SNIDE MESSAGES AVAILABLE.  EACH DEATH RESULTS IN A MESSAGE (81, 83, ETC.)
  1228. C  WHICH OFFERS REINCARNATION; IF ACCEPTED, THIS RESULTS IN MESSAGE 82, 84,
  1229. C  ETC.  THE LAST TIME, IF HE WANTS ANOTHER CHANCE, HE GETS A SNIDE REMARK AS
  1230. C  WE EXIT.  WHEN REINCARNATED, ALL OBJECTS BEING CARRIED GET DROPPED AT OLDLC2
  1231. C  (PRESUMABLY THE LAST PLACE PRIOR TO BEING KILLED) WITHOUT CHANGE OF PROPS.
  1232. C  THE LOOP RUNS BACKWARDS TO ASSURE THAT THE BIRD IS DROPPED BEFORE THE CAGE.
  1233. C  (THIS KLUGE COULD BE CHANGED ONCE WE'RE SURE ALL REFERENCES TO BIRD AND CAGE
  1234. C  ARE DONE BY KEYWORDS.)  THE LAMP IS A SPECIAL CASE (IT WOULDN'T DO TO LEAVE
  1235. C  IT IN THE CAVE).  IT IS TURNED OFF AND LEFT OUTSIDE THE BUILDING (ONLY IF HE
  1236. C  WAS CARRYING IT, OF COURSE).  HE HIMSELF IS LEFT INSIDE THE BUILDING (AND
  1237. C  HEAVEN HELP HIM IF HE TRIES TO XYZZY BACK INTO THE CAVE WITHOUT THE LAMP!).
  1238. C  OLDLOC IS ZAPPED SO HE CAN'T JUST "RETREAT".
  1239.  
  1240. C  THE EASIEST WAY TO GET KILLED IS TO FALL INTO A PIT IN PITCH DARKNESS.
  1241.  
  1242. 90    CALL RSPEAK(23)
  1243.     OLDLC2=LOC
  1244.  
  1245. C  OKAY, HE'S DEAD.  LET'S GET ON WITH IT.
  1246.  
  1247. 99    IF(CLOSNG)GOTO 95
  1248.     YEA=YES(81+NUMDIE*2,82+NUMDIE*2,54)
  1249.     NUMDIE=NUMDIE+1
  1250.     IF(NUMDIE.EQ.MAXDIE.OR..NOT.YEA)GOTO 20000
  1251.     PLACE(WATER)=0
  1252.     PLACE(OIL)=0
  1253.     IF(TOTING(LAMP))PROP(LAMP)=0
  1254.     DO 98 J=1,100
  1255.     I=101-J
  1256.     IF(.NOT.TOTING(I))GOTO 98
  1257.     K=OLDLC2
  1258.     IF(I.EQ.LAMP)K=1
  1259.     CALL DROP(I,K)
  1260. 98    CONTINUE
  1261.     LOC=3
  1262.     OLDLOC=LOC
  1263.     GOTO 2000
  1264.  
  1265. C  HE DIED DURING CLOSING TIME.  NO RESURRECTION.  TALLY UP A DEATH AND EXIT.
  1266.  
  1267. 95    CALL RSPEAK(131)
  1268.     NUMDIE=+1
  1269.     GOTO 20000
  1270.  
  1271. C  ROUTINES FOR PERFORMING THE VARIOUS ACTION VERBS
  1272.  
  1273. C  STATEMENT NUMBERS IN THIS SECTION ARE 8000 FOR INTRANSITIVE VERBS, 9000 FOR
  1274. C  TRANSITIVE, PLUS TEN TIMES THE VERB NUMBER.  MANY INTRANSITIVE VERBS USE THE
  1275. C  TRANSITIVE CODE, AND SOME VERBS USE CODE FOR OTHER VERBS, AS NOTED BELOW.
  1276.  
  1277. C  RANDOM INTRANSITIVE VERBS COME HERE.  CLEAR OBJ JUST IN CASE (SEE "ATTACK").
  1278.  
  1279. 8000    CALL A5TOA1(WD1,'What?',TK,K)
  1280.     TYPE 8002,(TK(I),I=1,K)
  1281. 8002    FORMAT(/' ',20A1)
  1282.     OBJ=0
  1283.     GOTO 2600
  1284.  
  1285. C  CARRY, NO OBJECT GIVEN YET.  OK IF ONLY ONE OBJECT PRESENT.
  1286.  
  1287. 8010    IF(ATLOC(LOC).EQ.0.OR.LINK(ATLOC(LOC)).NE.0)GOTO 8000
  1288.     DO 8012 I=1,5
  1289.     IF(DLOC(I).EQ.LOC.AND.DFLAG.GE.2)GOTO 8000
  1290. 8012    CONTINUE
  1291.     OBJ=ATLOC(LOC)
  1292.  
  1293. C  CARRY AN OBJECT.  SPECIAL CASES FOR BIRD AND CAGE (IF BIRD IN CAGE, CAN'T
  1294. C  TAKE ONE WITHOUT THE OTHER.  LIQUIDS ALSO SPECIAL, SINCE THEY DEPEND ON
  1295. C  STATUS OF BOTTLE.  ALSO VARIOUS SIDE EFFECTS, ETC.
  1296.  
  1297. 9010    IF(TOTING(OBJ))GOTO 2011
  1298.     SPK=25
  1299.     IF(OBJ.EQ.PLANT.AND.PROP(PLANT).LE.0)SPK=115
  1300.     IF(OBJ.EQ.BEAR.AND.PROP(BEAR).EQ.1)SPK=169
  1301.     IF(OBJ.EQ.CHAIN.AND.PROP(BEAR).NE.0)SPK=170
  1302.     IF(FIXED(OBJ).NE.0)GOTO 2011
  1303.     IF(OBJ.NE.WATER.AND.OBJ.NE.OIL)GOTO 9017
  1304.     IF(HERE(BOTTLE).AND.LIQ(0).EQ.OBJ)GOTO 9018
  1305.     OBJ=BOTTLE
  1306.     IF(TOTING(BOTTLE).AND.PROP(BOTTLE).EQ.1)GOTO 9220
  1307.     IF(PROP(BOTTLE).NE.1)SPK=105
  1308.     IF(.NOT.TOTING(BOTTLE))SPK=104
  1309.     GOTO 2011
  1310. 9018    OBJ=BOTTLE
  1311. 9017    IF(HOLDNG.LT.7)GOTO 9016
  1312.     CALL RSPEAK(92)
  1313.     GOTO 2012
  1314. 9016    IF(OBJ.NE.BIRD)GOTO 9014
  1315.     IF(PROP(BIRD).NE.0)GOTO 9014
  1316.     IF(.NOT.TOTING(ROD))GOTO 9013
  1317.     CALL RSPEAK(26)
  1318.     GOTO 2012
  1319. 9013    IF(TOTING(CAGE))GOTO 9015
  1320.     CALL RSPEAK(27)
  1321.     GOTO 2012
  1322. 9015    PROP(BIRD)=1
  1323. 9014    IF((OBJ.EQ.BIRD.OR.OBJ.EQ.CAGE).AND.PROP(BIRD).NE.0)
  1324.     1    CALL CARRY(BIRD+CAGE-OBJ,LOC)
  1325.     CALL CARRY(OBJ,LOC)
  1326.     K=LIQ(0)
  1327.     IF(OBJ.EQ.BOTTLE.AND.K.NE.0)PLACE(K)=-1
  1328.     GOTO 2009
  1329.  
  1330. C  DISCARD OBJECT.  "THROW" ALSO COMES HERE FOR MOST OBJECTS.  SPECIAL CASES FOR
  1331. C  BIRD (MIGHT ATTACK SNAKE OR DRAGON) AND CAGE (MIGHT CONTAIN BIRD) AND VASE.
  1332. C  DROP COINS AT VENDING MACHINE FOR EXTRA BATTERIES.
  1333.  
  1334. 9020    IF(TOTING(ROD2).AND.OBJ.EQ.ROD.AND..NOT.TOTING(ROD))OBJ=ROD2
  1335.     IF(.NOT.TOTING(OBJ))GOTO 2011
  1336.     IF(OBJ.NE.BIRD.OR..NOT.HERE(SNAKE))GOTO 9024
  1337.     CALL RSPEAK(30)
  1338.     IF(CLOSED)GOTO 19000
  1339.     CALL DSTROY(SNAKE)
  1340. C  SET PROP FOR USE BY TRAVEL OPTIONS
  1341.     PROP(SNAKE)=1
  1342. 9021    K=LIQ(0)
  1343.     IF(K.EQ.OBJ)OBJ=BOTTLE
  1344.     IF(OBJ.EQ.BOTTLE.AND.K.NE.0)PLACE(K)=0
  1345.     IF(OBJ.EQ.CAGE.AND.PROP(BIRD).NE.0)CALL DROP(BIRD,LOC)
  1346.     IF(OBJ.EQ.BIRD)PROP(BIRD)=0
  1347.     CALL DROP(OBJ,LOC)
  1348.     GOTO 2012
  1349.  
  1350. 9024    IF(OBJ.NE.COINS.OR..NOT.HERE(VEND))GOTO 9025
  1351.     CALL DSTROY(COINS)
  1352.     CALL DROP(BATTER,LOC)
  1353.     CALL PSPEAK(BATTER,0)
  1354.     GOTO 2012
  1355.  
  1356. 9025    IF(OBJ.NE.BIRD.OR..NOT.AT(DRAGON).OR.PROP(DRAGON).NE.0)GOTO 9026
  1357.     CALL RSPEAK(154)
  1358.     CALL DSTROY(BIRD)
  1359.     PROP(BIRD)=0
  1360.     IF(PLACE(SNAKE).EQ.PLAC(SNAKE))TALLY2=TALLY2+1
  1361.     GOTO 2012
  1362.  
  1363. 9026    IF(OBJ.NE.BEAR.OR..NOT.AT(TROLL))GOTO 9027
  1364.     CALL RSPEAK(163)
  1365.     CALL MOVE(TROLL,0)
  1366.     CALL MOVE(TROLL+100,0)
  1367.     CALL MOVE(TROLL2,PLAC(TROLL))
  1368.     CALL MOVE(TROLL2+100,FIXD(TROLL))
  1369.     CALL JUGGLE(CHASM)
  1370.     PROP(TROLL)=2
  1371.     GOTO 9021
  1372.  
  1373. 9027    IF(OBJ.EQ.VASE.AND.LOC.NE.PLAC(PILLOW))GOTO 9028
  1374.     CALL RSPEAK(54)
  1375.     GOTO 9021
  1376.  
  1377. 9028    PROP(VASE)=2
  1378.     IF(AT(PILLOW))PROP(VASE)=0
  1379.     CALL PSPEAK(VASE,PROP(VASE)+1)
  1380.     IF(PROP(VASE).NE.0)FIXED(VASE)=-1
  1381.     GOTO 9021
  1382.  
  1383. C  SAY.  ECHO WD2 (OR WD1 IF NO WD2 (SAY WHAT?, ETC.).)  MAGIC WORDS OVERRIDE.
  1384.  
  1385. 9030    CALL A5TOA1(WD2,'".',TK,K)
  1386.     IF(WD2.EQ.' ')CALL A5TOA1(WD1,'".',TK,K)
  1387.     IF(WD2.NE.' ')WD1=WD2
  1388.     I=VOCAB(WD1,-1)
  1389.     IF(I.EQ.62.OR.I.EQ.65.OR.I.EQ.71.OR.I.EQ.2025)GOTO 9035
  1390.     TYPE 9032,(TK(I),I=1,K)
  1391. 9032    FORMAT(/' Okay, "',20A1)
  1392.     GOTO 2012
  1393.  
  1394. 9035    WD2=' '
  1395.     OBJ=0
  1396.     GOTO 2630
  1397.  
  1398. C  LOCK, UNLOCK, NO OBJECT GIVEN.  ASSUME VARIOUS THINGS IF PRESENT.
  1399.  
  1400. 8040    SPK=28
  1401.     IF(HERE(CLAM))OBJ=CLAM
  1402.     IF(HERE(OYSTER))OBJ=OYSTER
  1403.     IF(AT(DOOR))OBJ=DOOR
  1404.     IF(AT(GRATE))OBJ=GRATE
  1405.     IF(OBJ.NE.0.AND.HERE(CHAIN))GOTO 8000
  1406.     IF(HERE(CHAIN))OBJ=CHAIN
  1407.     IF(OBJ.EQ.0)GOTO 2011
  1408.  
  1409. C  LOCK, UNLOCK OBJECT.  SPECIAL STUFF FOR OPENING CLAM/OYSTER AND FOR CHAIN.
  1410.  
  1411. 9040    IF(OBJ.EQ.CLAM.OR.OBJ.EQ.OYSTER)GOTO 9046
  1412.     IF(OBJ.EQ.DOOR)SPK=111
  1413.     IF(OBJ.EQ.DOOR.AND.PROP(DOOR).EQ.1)SPK=54
  1414.     IF(OBJ.EQ.CAGE)SPK=32
  1415.     IF(OBJ.EQ.KEYS)SPK=55
  1416.     IF(OBJ.EQ.GRATE.OR.OBJ.EQ.CHAIN)SPK=31
  1417.     IF(SPK.NE.31.OR..NOT.HERE(KEYS))GOTO 2011
  1418.     IF(OBJ.EQ.CHAIN)GOTO 9048
  1419.     IF(.NOT.CLOSNG)GOTO 9043
  1420.     K=130
  1421.     IF(.NOT.PANIC)CLOCK2=15
  1422.     PANIC=.TRUE.
  1423.     GOTO 2010
  1424.  
  1425. 9043    K=34+PROP(GRATE)
  1426.     PROP(GRATE)=1
  1427.     IF(VERB.EQ.LOCK)PROP(GRATE)=0
  1428.     K=K+2*PROP(GRATE)
  1429.     GOTO 2010
  1430.  
  1431. C  CLAM/OYSTER.
  1432. 9046    K=0
  1433.     IF(OBJ.EQ.OYSTER)K=1
  1434.     SPK=124+K
  1435.     IF(TOTING(OBJ))SPK=120+K
  1436.     IF(.NOT.TOTING(TRIDNT))SPK=122+K
  1437.     IF(VERB.EQ.LOCK)SPK=61
  1438.     IF(SPK.NE.124)GOTO 2011
  1439.     CALL DSTROY(CLAM)
  1440.     CALL DROP(OYSTER,LOC)
  1441.     CALL DROP(PEARL,105)
  1442.     GOTO 2011
  1443.  
  1444. C  CHAIN.
  1445. 9048    IF(VERB.EQ.LOCK)GOTO 9049
  1446.     SPK=171
  1447.     IF(PROP(BEAR).EQ.0)SPK=41
  1448.     IF(PROP(CHAIN).EQ.0)SPK=37
  1449.     IF(SPK.NE.171)GOTO 2011
  1450.     PROP(CHAIN)=0
  1451.     FIXED(CHAIN)=0
  1452.     IF(PROP(BEAR).NE.3)PROP(BEAR)=2
  1453.     FIXED(BEAR)=2-PROP(BEAR)
  1454.     GOTO 2011
  1455.  
  1456. 9049    SPK=172
  1457.     IF(PROP(CHAIN).NE.0)SPK=34
  1458.     IF(LOC.NE.PLAC(CHAIN))SPK=173
  1459.     IF(SPK.NE.172)GOTO 2011
  1460.     PROP(CHAIN)=2
  1461.     IF(TOTING(CHAIN))CALL DROP(CHAIN,LOC)
  1462.     FIXED(CHAIN)=-1
  1463.     GOTO 2011
  1464.  
  1465. C  LIGHT LAMP
  1466.  
  1467. 9070    IF(.NOT.HERE(LAMP))GOTO 2011
  1468.     SPK=184
  1469.     IF(LIMIT.LT.0)GOTO 2011
  1470.     PROP(LAMP)=1
  1471.     CALL RSPEAK(39)
  1472.     IF(WZDARK)GOTO 2000
  1473.     GOTO 2012
  1474.  
  1475. C  LAMP OFF
  1476.  
  1477. 9080    IF(.NOT.HERE(LAMP))GOTO 2011
  1478.     PROP(LAMP)=0
  1479.     CALL RSPEAK(40)
  1480.     IF(DARK(0))CALL RSPEAK(16)
  1481.     GOTO 2012
  1482.  
  1483. C  WAVE.  NO EFFECT UNLESS WAVING ROD AT FISSURE.
  1484.  
  1485. 9090    IF((.NOT.TOTING(OBJ)).AND.(OBJ.NE.ROD.OR..NOT.TOTING(ROD2)))
  1486.     1    SPK=29
  1487.     IF(OBJ.NE.ROD.OR..NOT.AT(FISSUR).OR..NOT.TOTING(OBJ)
  1488.     1    .OR.CLOSNG)GOTO 2011
  1489.     PROP(FISSUR)=1-PROP(FISSUR)
  1490.     CALL PSPEAK(FISSUR,2-PROP(FISSUR))
  1491.     GOTO 2012
  1492.  
  1493. C  ATTACK.  ASSUME TARGET IF UNAMBIGUOUS.  "THROW" ALSO LINKS HERE.  ATTACKABLE
  1494. C  OBJECTS FALL INTO TWO CATEGORIES: ENEMIES (SNAKE, DWARF, ETC.)  AND OTHERS
  1495. C  (BIRD, CLAM).  AMBIGUOUS IF TWO ENEMIES, OR IF NO ENEMIES BUT TWO OTHERS.
  1496.  
  1497. 9120    DO 9121 I=1,5
  1498.     IF(DLOC(I).EQ.LOC.AND.DFLAG.GE.2)GOTO 9122
  1499. 9121    CONTINUE
  1500.     I=0
  1501. 9122    IF(OBJ.NE.0)GOTO 9124
  1502.     IF(I.NE.0)OBJ=DWARF
  1503.     IF(HERE(SNAKE))OBJ=OBJ*100+SNAKE
  1504.     IF(AT(DRAGON).AND.PROP(DRAGON).EQ.0)OBJ=OBJ*100+DRAGON
  1505.     IF(AT(TROLL))OBJ=OBJ*100+TROLL
  1506.     IF(HERE(BEAR).AND.PROP(BEAR).EQ.0)OBJ=OBJ*100+BEAR
  1507.     IF(OBJ.GT.100)GOTO 8000
  1508.     IF(OBJ.NE.0)GOTO 9124
  1509. C  CAN'T ATTACK BIRD BY THROWING AXE.
  1510.     IF(HERE(BIRD).AND.VERB.NE.THROW)OBJ=BIRD
  1511. C  CLAM AND OYSTER BOTH TREATED AS CLAM FOR INTRANSITIVE CASE; NO HARM DONE.
  1512.     IF(HERE(CLAM).OR.HERE(OYSTER))OBJ=100*OBJ+CLAM
  1513.     IF(OBJ.GT.100)GOTO 8000
  1514. 9124    IF(OBJ.NE.BIRD)GOTO 9125
  1515.     SPK=137
  1516.     IF(CLOSED)GOTO 2011
  1517.     CALL DSTROY(BIRD)
  1518.     PROP(BIRD)=0
  1519.     IF(PLACE(SNAKE).EQ.PLAC(SNAKE))TALLY2=TALLY2+1
  1520.     SPK=45
  1521. 9125    IF(OBJ.EQ.0)SPK=44
  1522.     IF(OBJ.EQ.CLAM.OR.OBJ.EQ.OYSTER)SPK=150
  1523.     IF(OBJ.EQ.SNAKE)SPK=46
  1524.     IF(OBJ.EQ.DWARF)SPK=49
  1525.     IF(OBJ.EQ.DWARF.AND.CLOSED)GOTO 19000
  1526.     IF(OBJ.EQ.DRAGON)SPK=167
  1527.     IF(OBJ.EQ.TROLL)SPK=157
  1528.     IF(OBJ.EQ.BEAR)SPK=165+(PROP(BEAR)+1)/2
  1529.     IF(OBJ.NE.DRAGON.OR.PROP(DRAGON).NE.0)GOTO 2011
  1530. C  FUN STUFF FOR DRAGON.  IF HE INSISTS ON ATTACKING IT, WIN!  SET PROP TO DEAD,
  1531. C  MOVE DRAGON TO CENTRAL LOC (STILL FIXED), MOVE RUG THERE (NOT FIXED), AND
  1532. C  MOVE HIM THERE, TOO.  THEN DO A NULL MOTION TO GET NEW DESCRIPTION.
  1533.     CALL RSPEAK(49)
  1534.     VERB=0
  1535.     OBJ=0
  1536.     CALL GETIN( WD1,WD2)
  1537.     IF(WD1.NE.'Y'.AND.WD1.NE.'YES')GOTO 2608
  1538.     CALL PSPEAK(DRAGON,1)
  1539.     PROP(DRAGON)=2
  1540.     PROP(RUG)=0
  1541.     K=(PLAC(DRAGON)+FIXD(DRAGON))/2
  1542.     CALL MOVE(DRAGON+100,-1)
  1543.     CALL MOVE(RUG+100,0)
  1544.     CALL MOVE(DRAGON,K)
  1545.     CALL MOVE(RUG,K)
  1546.     DO 9126 OBJ=1,100
  1547.     IDONDX=OBJ
  1548.     IF(PLACE(IDONDX).EQ.PLAC(DRAGON).OR.
  1549.     1 PLACE(IDONDX).EQ.FIXD(DRAGON))
  1550.     2 CALL MOVE(IDONDX,K)
  1551. 9126    CONTINUE
  1552.     LOC=K
  1553.     K=NULL
  1554.     GOTO 8
  1555.  
  1556. C  POUR.  IF NO OBJECT, OR OBJECT IS BOTTLE, ASSUME CONTENTS OF BOTTLE.
  1557. C  SPECIAL TESTS FOR POURING WATER OR OIL ON PLANT OR RUSTY DOOR.
  1558.  
  1559. 9130    IF(OBJ.EQ.BOTTLE.OR.OBJ.EQ.0)OBJ=LIQ(0)
  1560.     IF(OBJ.EQ.0)GOTO 8000
  1561.     IF(.NOT.TOTING(OBJ))GOTO 2011
  1562.     SPK=78
  1563.     IF(OBJ.NE.OIL.AND.OBJ.NE.WATER)GOTO 2011
  1564.     PROP(BOTTLE)=1
  1565.     PLACE(OBJ)=0
  1566.     SPK=77
  1567.     IF(.NOT.(AT(PLANT).OR.AT(DOOR)))GOTO 2011
  1568.  
  1569.     IF(AT(DOOR))GOTO 9132
  1570.     SPK=112
  1571.     IF(OBJ.NE.WATER)GOTO 2011
  1572.     CALL PSPEAK(PLANT,PROP(PLANT)+1)
  1573.     PROP(PLANT)=MOD(PROP(PLANT)+2,6)
  1574.     PROP(PLANT2)=PROP(PLANT)/2
  1575.     K=NULL
  1576.     GOTO 8
  1577.  
  1578. 9132    PROP(DOOR)=0
  1579.     IF(OBJ.EQ.OIL)PROP(DOOR)=1
  1580.     SPK=113+PROP(DOOR)
  1581.     GOTO 2011
  1582.  
  1583. C  EAT.  INTRANSITIVE: ASSUME FOOD IF PRESENT, ELSE ASK WHAT.  TRANSITIVE: FOOD
  1584. C  OK, SOME THINGS LOSE APPETITE, REST ARE RIDICULOUS.
  1585.  
  1586. 8140    IF(.NOT.HERE(FOOD))GOTO 8000
  1587. 8142    CALL DSTROY(FOOD)
  1588.     SPK=72
  1589.     GOTO 2011
  1590.  
  1591. 9140    IF(OBJ.EQ.FOOD)GOTO 8142
  1592.     IF(OBJ.EQ.BIRD.OR.OBJ.EQ.SNAKE.OR.OBJ.EQ.CLAM.OR.OBJ.EQ.OYSTER
  1593.     1    .OR.OBJ.EQ.DWARF.OR.OBJ.EQ.DRAGON.OR.OBJ.EQ.TROLL
  1594.     2    .OR.OBJ.EQ.BEAR)SPK=71
  1595.     GOTO 2011
  1596.  
  1597. C  DRINK.  IF NO OBJECT, ASSUME WATER AND LOOK FOR IT HERE.  IF WATER IS IN
  1598. C  THE BOTTLE, DRINK THAT, ELSE MUST BE AT A WATER LOC, SO DRINK STREAM.
  1599.  
  1600. 9150    IF(OBJ.EQ.0.AND.LIQLOC(LOC).NE.WATER.AND.(LIQ(0).NE.WATER
  1601.     1    .OR..NOT.HERE(BOTTLE)))GOTO 8000
  1602.     IF(OBJ.NE.0.AND.OBJ.NE.WATER)SPK=110
  1603.     IF(SPK.EQ.110.OR.LIQ(0).NE.WATER.OR..NOT.HERE(BOTTLE))GOTO 2011
  1604.     PROP(BOTTLE)=1
  1605.     PLACE(WATER)=0
  1606.     SPK=74
  1607.     GOTO 2011
  1608.  
  1609. C  RUB.  YIELDS VARIOUS SNIDE REMARKS.
  1610.  
  1611. 9160    IF(OBJ.NE.LAMP)SPK=76
  1612.     GOTO 2011
  1613.  
  1614. C  THROW.  SAME AS DISCARD UNLESS AXE.  THEN SAME AS ATTACK EXCEPT IGNORE BIRD,
  1615. C  AND IF DWARF IS PRESENT THEN ONE MIGHT BE KILLED.  (ONLY WAY TO DO SO!)
  1616. C  AXE ALSO SPECIAL FOR DRAGON, BEAR, AND TROLL.  TREASURES SPECIAL FOR TROLL.
  1617.  
  1618. 9170    IF(TOTING(ROD2).AND.OBJ.EQ.ROD.AND..NOT.TOTING(ROD))OBJ=ROD2
  1619.     IF(.NOT.TOTING(OBJ))GOTO 2011
  1620.     IF(OBJ.GE.50.AND.OBJ.LE.MAXTRS.AND.AT(TROLL))GOTO 9178
  1621.     IF(OBJ.EQ.FOOD.AND.HERE(BEAR))GOTO 9177
  1622.     IF(OBJ.NE.AXE)GOTO 9020
  1623.     DO 9171 I=1,5
  1624. C  NEEDN'T CHECK DFLAG IF AXE IS HERE.
  1625.     IF(DLOC(I).EQ.LOC)GOTO 9172
  1626. 9171    CONTINUE
  1627.     SPK=152
  1628.     IF(AT(DRAGON).AND.PROP(DRAGON).EQ.0)GOTO 9175
  1629.     SPK=158
  1630.     IF(AT(TROLL))GOTO 9175
  1631.     IF(HERE(BEAR).AND.PROP(BEAR).EQ.0)GOTO 9176
  1632.     OBJ=0
  1633.     GOTO 9120
  1634.  
  1635. 9172    SPK=48
  1636. C  IF SAVED NOT = -1, HE BYPASSED THE "START" CALL.
  1637.     IF(RAN(3).EQ.0.OR.SAVED.NE.-1)GOTO 9175
  1638.     DSEEN(I)=.FALSE.
  1639.     DLOC(I)=0
  1640.     SPK=47
  1641.     DKILL=DKILL+1
  1642.     IF(DKILL.EQ.1)SPK=149
  1643. 9175    CALL RSPEAK(SPK)
  1644.     CALL DROP(AXE,LOC)
  1645.     K=NULL
  1646.     GOTO 8
  1647.  
  1648. C  THIS'LL TEACH HIM TO THROW THE AXE AT THE BEAR!
  1649. 9176    SPK=164
  1650.     CALL DROP(AXE,LOC)
  1651.     FIXED(AXE)=-1
  1652.     PROP(AXE)=1
  1653.     CALL JUGGLE(BEAR)
  1654.     GOTO 2011
  1655.  
  1656. C  BUT THROWING FOOD IS ANOTHER STORY.
  1657. 9177    OBJ=BEAR
  1658.     GOTO 9210
  1659.  
  1660. 9178    SPK=159
  1661. C  SNARF A TREASURE FOR THE TROLL.
  1662.     CALL DROP(OBJ,0)
  1663.     CALL MOVE(TROLL,0)
  1664.     CALL MOVE(TROLL+100,0)
  1665.     CALL DROP(TROLL2,PLAC(TROLL))
  1666.     CALL DROP(TROLL2+100,FIXD(TROLL))
  1667.     CALL JUGGLE(CHASM)
  1668.     GOTO 2011
  1669.  
  1670. C  QUIT.  INTRANSITIVE ONLY.  VERIFY INTENT AND EXIT IF THAT'S WHAT HE WANTS.
  1671.  
  1672. 8180    GAVEUP=YES(22,54,54)
  1673. 8185    IF(GAVEUP)GOTO 20000
  1674.     GOTO 2012
  1675.  
  1676. C  FIND.  MIGHT BE CARRYING IT, OR IT MIGHT BE HERE.  ELSE GIVE CAVEAT.
  1677.  
  1678. 9190    IF(AT(OBJ).OR.(LIQ(0).EQ.OBJ.AND.AT(BOTTLE))
  1679.     1    .OR.K.EQ.LIQLOC(LOC))SPK=94
  1680.     DO 9192 I=1,5
  1681. 9192    IF(DLOC(I).EQ.LOC.AND.DFLAG.GE.2.AND.OBJ.EQ.DWARF)SPK=94
  1682.     IF(CLOSED)SPK=138
  1683.     IF(TOTING(OBJ))SPK=24
  1684.     GOTO 2011
  1685.  
  1686. C  INVENTORY.  IF OBJECT, TREAT SAME AS FIND.  ELSE REPORT ON CURRENT BURDEN.
  1687.  
  1688. 8200    SPK=98
  1689.     DO 8201 I=1,100
  1690.     IDONDX=I
  1691.     IF(IDONDX.EQ.BEAR.OR..NOT.TOTING(IDONDX))GOTO 8201
  1692.     IF(SPK.EQ.98)CALL RSPEAK(99)
  1693.     BLKLIN=.FALSE.
  1694.     CALL PSPEAK(IDONDX,-1)
  1695.     BLKLIN=.TRUE.
  1696.     SPK=0
  1697. 8201    CONTINUE
  1698.     IF(TOTING(BEAR))SPK=141
  1699.     GOTO 2011
  1700.  
  1701. C  FEED.  IF BIRD, NO SEED.  SNAKE, DRAGON, TROLL: QUIP.  IF DWARF, MAKE HIM
  1702. C  MAD.  BEAR, SPECIAL.
  1703.  
  1704. 9210    IF(OBJ.NE.BIRD)GOTO 9212
  1705.     SPK=100
  1706.     GOTO 2011
  1707.  
  1708. 9212    IF(OBJ.NE.SNAKE.AND.OBJ.NE.DRAGON.AND.OBJ.NE.TROLL)GOTO 9213
  1709.     SPK=102
  1710.     IF(OBJ.EQ.DRAGON.AND.PROP(DRAGON).NE.0)SPK=110
  1711.     IF(OBJ.EQ.TROLL)SPK=182
  1712.     IF(OBJ.NE.SNAKE.OR.CLOSED.OR..NOT.HERE(BIRD))GOTO 2011
  1713.     SPK=101
  1714.     CALL DSTROY(BIRD)
  1715.     PROP(BIRD)=0
  1716.     TALLY2=TALLY2+1
  1717.     GOTO 2011
  1718.  
  1719. 9213    IF(OBJ.NE.DWARF)GOTO 9214
  1720.     IF(.NOT.HERE(FOOD))GOTO 2011
  1721.     SPK=103
  1722.     DFLAG=DFLAG+1
  1723.     GOTO 2011
  1724.  
  1725. 9214    IF(OBJ.NE.BEAR)GOTO 9215
  1726.     IF(PROP(BEAR).EQ.0)SPK=102
  1727.     IF(PROP(BEAR).EQ.3)SPK=110
  1728.     IF(.NOT.HERE(FOOD))GOTO 2011
  1729.     CALL DSTROY(FOOD)
  1730.     PROP(BEAR)=1
  1731.     FIXED(AXE)=0
  1732.     PROP(AXE)=0
  1733.     SPK=168
  1734.     GOTO 2011
  1735.  
  1736. 9215    SPK=14
  1737.     GOTO 2011
  1738.  
  1739. C  FILL.  BOTTLE MUST BE EMPTY, AND SOME LIQUID AVAILABLE.  (VASE IS NASTY.)
  1740.  
  1741. 9220    IF(OBJ.EQ.VASE)GOTO 9222
  1742.     IF(OBJ.NE.0.AND.OBJ.NE.BOTTLE)GOTO 2011
  1743.     IF(OBJ.EQ.0.AND..NOT.HERE(BOTTLE))GOTO 8000
  1744.     SPK=107
  1745.     IF(LIQLOC(LOC).EQ.0)SPK=106
  1746.     IF(LIQ(0).NE.0)SPK=105
  1747.     IF(SPK.NE.107)GOTO 2011
  1748.     PROP(BOTTLE)=MOD(COND(LOC),4)/2*2
  1749.     K=LIQ(0)
  1750.     IF(TOTING(BOTTLE))PLACE(K)=-1
  1751.     IF(K.EQ.OIL)SPK=108
  1752.     GOTO 2011
  1753.  
  1754. 9222    SPK=29
  1755.     IF(LIQLOC(LOC).EQ.0)SPK=144
  1756.     IF(LIQLOC(LOC).EQ.0.OR..NOT.TOTING(VASE))GOTO 2011
  1757.     CALL RSPEAK(145)
  1758.     PROP(VASE)=2
  1759.     FIXED(VASE)=-1
  1760.     GOTO 9024
  1761.  
  1762. C  BLAST.  NO EFFECT UNLESS YOU'VE GOT DYNAMITE, WHICH IS A NEAT TRICK!
  1763.  
  1764. 9230    IF(PROP(ROD2).LT.0.OR..NOT.CLOSED)GOTO 2011
  1765.     BONUS=133
  1766.     IF(LOC.EQ.115)BONUS=134
  1767.     IF(HERE(ROD2))BONUS=135
  1768.     CALL RSPEAK(BONUS)
  1769.     GOTO 20000
  1770.  
  1771. C  SCORE.  GO TO SCORING SECTION, WHICH WILL RETURN TO 8241 IF SCORNG IS TRUE.
  1772.  
  1773. 8240    SCORNG=.TRUE.
  1774.     GOTO 20000
  1775.  
  1776. 8241    SCORNG=.FALSE.
  1777.     TYPE 8243,SCORE,MXSCOR
  1778. 8243    FORMAT(/' If you were to quit now, you would score',I4
  1779.     1    ,' out of a possible',I4,'.')
  1780.     GAVEUP=YES(143,54,54)
  1781.     GOTO 8185
  1782.  
  1783. C  FEE FIE FOE FOO (AND FUM).  ADVANCE TO NEXT STATE IF GIVEN IN PROPER ORDER.
  1784. C  LOOK UP WD1 IN SECTION 3 OF VOCAB TO DETERMINE WHICH WORD WE'VE GOT.  LAST
  1785. C  WORD ZIPS THE EGGS BACK TO THE GIANT ROOM (UNLESS ALREADY THERE).
  1786.  
  1787. 8250    K=VOCAB(WD1,3)
  1788.     SPK=42
  1789.     IF(FOOBAR.EQ.1-K)GOTO 8252
  1790.     IF(FOOBAR.NE.0)SPK=151
  1791.     GOTO 2011
  1792.  
  1793. 8252    FOOBAR=K
  1794.     IF(K.NE.4)GOTO 2009
  1795.     FOOBAR=0
  1796.     IF(PLACE(EGGS).EQ.PLAC(EGGS)
  1797.     1    .OR.(TOTING(EGGS).AND.LOC.EQ.PLAC(EGGS)))GOTO 2011
  1798. C  BRING BACK TROLL IF WE STEAL THE EGGS BACK FROM HIM BEFORE CROSSING.
  1799.     IF(PLACE(EGGS).EQ.0.AND.PLACE(TROLL).EQ.0.AND.PROP(TROLL).EQ.0)
  1800.     1    PROP(TROLL)=1
  1801.     K=2
  1802.     IF(HERE(EGGS))K=1
  1803.     IF(LOC.EQ.PLAC(EGGS))K=0
  1804.     CALL MOVE(EGGS,PLAC(EGGS))
  1805.     CALL PSPEAK(EGGS,K)
  1806.     GOTO 2012
  1807.  
  1808. C  BRIEF.  INTRANSITIVE ONLY.  SUPPRESS LONG DESCRIPTIONS AFTER FIRST TIME.
  1809.  
  1810. 8260    SPK=156
  1811.     ABBNUM=10000
  1812.     DETAIL=3
  1813.     GOTO 2011
  1814.  
  1815. C  READ.  MAGAZINES IN DWARVISH, MESSAGE WE'VE SEEN, AND . . . OYSTER?
  1816.  
  1817. 8270    IF(HERE(MAGZIN))OBJ=MAGZIN
  1818.     IF(HERE(TABLET))OBJ=OBJ*100+TABLET
  1819.     IF(HERE(MESSAG))OBJ=OBJ*100+MESSAG
  1820.     IF(CLOSED.AND.TOTING(OYSTER))OBJ=OYSTER
  1821.     IF(OBJ.GT.100.OR.OBJ.EQ.0.OR.DARK(0))GOTO 8000
  1822.  
  1823. 9270    IF(DARK(0))GOTO 5190
  1824.     IF(OBJ.EQ.MAGZIN)SPK=190
  1825.     IF(OBJ.EQ.TABLET)SPK=196
  1826.     IF(OBJ.EQ.MESSAG)SPK=191
  1827.     IF(OBJ.EQ.OYSTER.AND.HINTED(2).AND.TOTING(OYSTER))SPK=194
  1828.     IF(OBJ.NE.OYSTER.OR.HINTED(2).OR..NOT.TOTING(OYSTER)
  1829.     1    .OR..NOT.CLOSED)GOTO 2011
  1830.     HINTED(2)=YES(192,193,54)
  1831.     GOTO 2012
  1832.  
  1833. C  BREAK.  ONLY WORKS FOR MIRROR IN REPOSITORY AND, OF COURSE, THE VASE.
  1834.  
  1835. 9280    IF(OBJ.EQ.MIRROR)SPK=148
  1836.     IF(OBJ.EQ.VASE.AND.PROP(VASE).EQ.0)GOTO 9282
  1837.     IF(OBJ.NE.MIRROR.OR..NOT.CLOSED)GOTO 2011
  1838.     CALL RSPEAK(197)
  1839.     GOTO 19000
  1840.  
  1841. 9282    SPK=198
  1842.     IF(TOTING(VASE))CALL DROP(VASE,LOC)
  1843.     PROP(VASE)=2
  1844.     FIXED(VASE)=-1
  1845.     GOTO 2011
  1846.  
  1847. C  WAKE.  ONLY USE IS TO DISTURB THE DWARVES.
  1848.  
  1849. 9290    IF(OBJ.NE.DWARF.OR..NOT.CLOSED)GOTO 2011
  1850.     CALL RSPEAK(199)
  1851.     GOTO 19000
  1852.  
  1853. C  SUSPEND.  OFFER TO EXIT LEAVING THINGS RESTARTABLE, BUT REQUIRING A DELAY
  1854. C  BEFORE RESTARTING (SO CAN'T SAVE THE WORLD BEFORE TRYING SOMETHING RISKY).
  1855. C  UPON RESTARTING, SETUP=-1 CAUSES RETURN TO 8305 TO PICK UP AGAIN.
  1856.  
  1857. 8300    SPK=201
  1858.     IF(DEMO)GOTO 2011
  1859.     TYPE 8302
  1860. 8302    FORMAT(/'  The Wizard and his assistants would like to apologise',
  1861.     1    ' for any inconvience'/' caused by the absence of a save',
  1862.     2    ' routine.')
  1863.     GOTO 2012
  1864.  
  1865. C    ******************************************************************
  1866. C    FORMAT(/' I can suspend your adventure for you so that you can',
  1867. C    1    ' resume later, but'/' you will have to wait at least',
  1868. C    2    I3,' minutes before continuing.')
  1869. C    IF(.NOT.YES(200,54,54))GOTO 2012
  1870. C    CALL DATIME(SAVED,SAVET)
  1871. C    SETUP=-1
  1872. C    CALL CIAO
  1873. C    ******************************************************************
  1874.  
  1875. C    *******************************************************************
  1876. C     * CIAO was removed because it is not possible for the VAX to save *
  1877. C    * core images.                                                    *
  1878. C    *******************************************************************
  1879.  
  1880. 8305    SETUP=3
  1881.     K=NULL
  1882.     GOTO 8
  1883.  
  1884. C  HOURS.  REPORT CURRENT NON-PRIME-TIME HOURS.
  1885.  
  1886. 8310    CALL MSPEAK(6)
  1887. 8311    FORMAT( 'The wizard has declared the game eternally open.')
  1888.     TYPE 8311
  1889.     GOTO 2012
  1890.  
  1891. C  HINTS
  1892.  
  1893. C  COME HERE IF HE'S BEEN LONG ENOUGH AT REQUIRED LOC(S) FOR SOME UNUSED HINT.
  1894. C  HINT NUMBER IS IN VARIABLE "HINT".  BRANCH TO QUICK TEST FOR ADDITIONAL
  1895. C  CONDITIONS, THEN COME BACK TO DO NEAT STUFF.  GOTO 40010 IF CONDITIONS ARE
  1896. C  MET AND WE WANT TO OFFER THE HINT.  GOTO 40020 TO CLEAR HINTLC BACK TO ZERO,
  1897. C  40030 TO TAKE NO ACTION YET.
  1898.  
  1899. 40000    GOTO (40400,40500,40600,40700,40800,40900)(HINT-3)
  1900. C          CAVE  BIRD  SNAKE MAZE  DARK  WITT
  1901.     CALL BUG(27)
  1902.  
  1903. 40010    HINTLC(HINT)=0
  1904.     IF(.NOT.YES(HINTS(HINT,3),0,54))GOTO 2602
  1905.     TYPE 40012,HINTS(HINT,2)
  1906. 40012 FORMAT(/' I am prepared to give you a hint, but it will cost you',
  1907.      1    I2,' points.')
  1908.     HINTED(HINT)=YES(175,HINTS(HINT,4),54)
  1909.     IF(HINTED(HINT).AND.LIMIT.GT.30)LIMIT=LIMIT+30*HINTS(HINT,2)
  1910. 40020    HINTLC(HINT)=0
  1911. 40030    GOTO 2602
  1912.  
  1913. C  NOW FOR THE QUICK TESTS.  SEE DATABASE DESCRIPTION FOR ONE-LINE NOTES.
  1914.  
  1915. 40400    IF(PROP(GRATE).EQ.0.AND..NOT.HERE(KEYS))GOTO 40010
  1916.     GOTO 40020
  1917.  
  1918. 40500    IF(HERE(BIRD).AND.TOTING(ROD).AND.OBJ.EQ.BIRD)GOTO 40010
  1919.     GOTO 40030
  1920.  
  1921. 40600    IF(HERE(SNAKE).AND..NOT.HERE(BIRD))GOTO 40010
  1922.     GOTO 40020
  1923.  
  1924. 40700    IF(ATLOC(LOC).EQ.0.AND.ATLOC(OLDLOC).EQ.0
  1925.     1    .AND.ATLOC(OLDLC2).EQ.0.AND.HOLDNG.GT.1)GOTO 40010
  1926.     GOTO 40020
  1927.  
  1928. 40800    IF(PROP(EMRALD).NE.-1.AND.PROP(PYRAM).EQ.-1)GOTO 40010
  1929.     GOTO 40020
  1930.  
  1931. 40900    GOTO 40010
  1932.  
  1933. C  CAVE CLOSING AND SCORING
  1934.  
  1935.  
  1936. C  THESE SECTIONS HANDLE THE CLOSING OF THE CAVE.  THE CAVE CLOSES "CLOCK1"
  1937. C  TURNS AFTER THE LAST TREASURE HAS BEEN LOCATED (INCLUDING THE PIRATE'S
  1938. C  CHEST, WHICH MAY OF COURSE NEVER SHOW UP).  NOTE THAT THE TREASURES NEED NOT
  1939. C  HAVE BEEN TAKEN YET, JUST LOCATED.  HENCE CLOCK1 MUST BE LARGE ENOUGH TO GET
  1940. C  OUT OF THE CAVE (IT ONLY TICKS WHILE INSIDE THE CAVE).  WHEN IT HITS ZERO,
  1941. C  WE BRANCH TO 10000 TO START CLOSING THE CAVE, AND THEN SIT BACK AND WAIT FOR
  1942. C  HIM TO TRY TO GET OUT.  IF HE DOESN'T WITHIN CLOCK2 TURNS, WE CLOSE THE
  1943. C  CAVE; IF HE DOES TRY, WE ASSUME HE PANICS, AND GIVE HIM A FEW ADDITIONAL
  1944. C  TURNS TO GET FRANTIC BEFORE WE CLOSE.  WHEN CLOCK2 HITS ZERO, WE BRANCH TO
  1945. C  11000 TO TRANSPORT HIM INTO THE FINAL PUZZLE.  NOTE THAT THE PUZZLE DEPENDS
  1946. C  UPON ALL SORTS OF RANDOM THINGS.  FOR INSTANCE, THERE MUST BE NO WATER OR
  1947. C  OIL, SINCE THERE ARE BEANSTALKS WHICH WE DON'T WANT TO BE ABLE TO WATER,
  1948. C  SINCE THE CODE CAN'T HANDLE IT.  ALSO, WE CAN HAVE NO KEYS, SINCE THERE IS A
  1949. C  GRATE (HAVING MOVED THE FIXED OBJECT!) THERE SEPARATING HIM FROM ALL THE
  1950. C  TREASURES.  MOST OF THESE PROBLEMS ARISE FROM THE USE OF NEGATIVE PROP
  1951. C  NUMBERS TO SUPPRESS THE OBJECT DESCRIPTIONS UNTIL HE'S ACTUALLY MOVED THE
  1952. C  OBJECTS.
  1953.  
  1954. C  WHEN THE FIRST WARNING COMES, WE LOCK THE GRATE, DESTROY THE BRIDGE, KILL
  1955. C  ALL THE DWARVES (AND THE PIRATE), REMOVE THE TROLL AND BEAR (UNLESS DEAD),
  1956. C  AND SET "CLOSNG" TO TRUE.  LEAVE THE DRAGON; TOO MUCH TROUBLE TO MOVE IT.
  1957. C  FROM NOW UNTIL CLOCK2 RUNS OUT, HE CANNOT UNLOCK THE GRATE, MOVE TO ANY
  1958. C  LOCATION OUTSIDE THE CAVE (LOC<9), OR CREATE THE BRIDGE.  NOR CAN HE BE
  1959. C  RESURRECTED IF HE DIES.  NOTE THAT THE SNAKE IS ALREADY GONE, SINCE HE GOT
  1960. C  TO THE TREASURE ACCESSIBLE ONLY VIA THE HALL OF THE MT. KING.  ALSO, HE'S
  1961. C  BEEN IN GIANT ROOM (TO GET EGGS), SO WE CAN REFER TO IT.  ALSO ALSO, HE'S
  1962. C  GOTTEN THE PEARL, SO WE KNOW THE BIVALVE IS AN OYSTER.  *AND*, THE DWARVES
  1963. C  MUST HAVE BEEN ACTIVATED, SINCE WE'VE FOUND CHEST.
  1964.  
  1965. 10000    PROP(GRATE)=0
  1966.     PROP(FISSUR)=0
  1967.     DO 10010 I=1,6
  1968.     DSEEN(I)=.FALSE.
  1969. 10010    DLOC(I)=0
  1970.     CALL MOVE(TROLL,0)
  1971.     CALL MOVE(TROLL+100,0)
  1972.     CALL MOVE(TROLL2,PLAC(TROLL))
  1973.     CALL MOVE(TROLL2+100,FIXD(TROLL))
  1974.     CALL JUGGLE(CHASM)
  1975.     IF(PROP(BEAR).NE.3)CALL DSTROY(BEAR)
  1976.     PROP(CHAIN)=0
  1977.     FIXED(CHAIN)=0
  1978.     PROP(AXE)=0
  1979.     FIXED(AXE)=0
  1980.     CALL RSPEAK(129)
  1981.     CLOCK1=-1
  1982.     CLOSNG=.TRUE.
  1983.     GOTO 19999
  1984.  
  1985. C  ONCE HE'S PANICKED, AND CLOCK2 HAS RUN OUT, WE COME HERE TO SET UP THE
  1986. C  STORAGE ROOM.  THE ROOM HAS TWO LOCS, HARDWIRED AS 115 (NE) AND 116 (SW).
  1987. C  AT THE NE END, WE PLACE EMPTY BOTTLES, A NURSERY OF PLANTS, A BED OF
  1988. C  OYSTERS, A PILE OF LAMPS, RODS WITH STARS, SLEEPING DWARVES, AND HIM.  AND
  1989. C  THE SW END WE PLACE GRATE OVER TREASURES, SNAKE PIT, COVEY OF CAGED BIRDS,
  1990. C  MORE RODS, AND PILLOWS.  A MIRROR STRETCHES ACROSS ONE WALL.  MANY OF THE
  1991. C  OBJECTS COME FROM KNOWN LOCATIONS AND/OR STATES (E.G. THE SNAKE IS KNOWN TO
  1992. C  HAVE BEEN DESTROYED AND NEEDN'T BE CARRIED AWAY FROM ITS OLD "PLACE"),
  1993. C  MAKING THE VARIOUS OBJECTS BE HANDLED DIFFERENTLY.  WE ALSO DROP ALL OTHER
  1994. C  OBJECTS HE MIGHT BE CARRYING (LEST HE HAVE SOME WHICH COULD CAUSE TROUBLE,
  1995. C  SUCH AS THE KEYS).  WE DESCRIBE THE FLASH OF LIGHT AND TRUNDLE BACK.
  1996.  
  1997. 11000    PROP(BOTTLE)=PUT(BOTTLE,115,1)
  1998.     PROP(PLANT)=PUT(PLANT,115,0)
  1999.     PROP(OYSTER)=PUT(OYSTER,115,0)
  2000.     PROP(LAMP)=PUT(LAMP,115,0)
  2001.     PROP(ROD)=PUT(ROD,115,0)
  2002.     PROP(DWARF)=PUT(DWARF,115,0)
  2003.     LOC=115
  2004.     OLDLOC=115
  2005.     NEWLOC=115
  2006.  
  2007. C  LEAVE THE GRATE WITH NORMAL (NON-NEGATIVE PROPERTY).
  2008.  
  2009.     FOO=PUT(GRATE,116,0)
  2010.     PROP(SNAKE)=PUT(SNAKE,116,1)
  2011.     PROP(BIRD)=PUT(BIRD,116,1)
  2012.     PROP(CAGE)=PUT(CAGE,116,0)
  2013.     PROP(ROD2)=PUT(ROD2,116,0)
  2014.     PROP(PILLOW)=PUT(PILLOW,116,0)
  2015.  
  2016.     PROP(MIRROR)=PUT(MIRROR,115,0)
  2017.     FIXED(MIRROR)=116
  2018.  
  2019.     DO 11010 I=1,100
  2020.     IDONDX=I
  2021. 11010    IF(TOTING(IDONDX))CALL DSTROY(IDONDX)
  2022.  
  2023.     CALL RSPEAK(132)
  2024.     CLOSED=.TRUE.
  2025.     GOTO 2
  2026.  
  2027. C  ANOTHER WAY WE CAN FORCE AN END TO THINGS IS BY HAVING THE LAMP GIVE OUT.
  2028. C  WHEN IT GETS CLOSE, WE COME HERE TO WARN HIM.  WE GO TO 12000 IF THE LAMP
  2029. C  AND FRESH BATTERIES ARE HERE, IN WHICH CASE WE REPLACE THE BATTERIES AND
  2030. C  CONTINUE.  12200 IS FOR OTHER CASES OF LAMP DYING.  12400 IS WHEN IT GOES
  2031. C  OUT, AND 12600 IS IF HE'S WANDERED OUTSIDE AND THE LAMP IS USED UP, IN WHICH
  2032. C  CASE WE FORCE HIM TO GIVE UP.
  2033.  
  2034. 12000    CALL RSPEAK(188)
  2035.     PROP(BATTER)=1
  2036.     IF(TOTING(BATTER))CALL DROP(BATTER,LOC)
  2037.     LIMIT=LIMIT+2500
  2038.     LMWARN=.FALSE.
  2039.     GOTO 19999
  2040.  
  2041. 12200    IF(LMWARN.OR..NOT.HERE(LAMP))GOTO 19999
  2042.     LMWARN=.TRUE.
  2043.     SPK=187
  2044.     IF(PLACE(BATTER).EQ.0)SPK=183
  2045.     IF(PROP(BATTER).EQ.1)SPK=189
  2046.     CALL RSPEAK(SPK)
  2047.     GOTO 19999
  2048.  
  2049. 12400    LIMIT=-1
  2050.     PROP(LAMP)=0
  2051.     IF(HERE(LAMP))CALL RSPEAK(184)
  2052.     GOTO 19999
  2053.  
  2054. 12600    CALL RSPEAK(185)
  2055.     GAVEUP=.TRUE.
  2056.     GOTO 20000
  2057.  
  2058. C  AND, OF COURSE, DEMO GAMES ARE ENDED BY THE WIZARD.
  2059.  
  2060. 13000    CALL MSPEAK(1)
  2061.     GOTO 20000
  2062.  
  2063. C  OH DEAR, HE'S DISTURBED THE DWARVES.
  2064.  
  2065. 19000    CALL RSPEAK(136)
  2066.  
  2067. C  EXIT CODE.  WILL EVENTUALLY INCLUDE SCORING.  FOR NOW, HOWEVER, ...
  2068.  
  2069. C  THE PRESENT SCORING ALGORITHM IS AS FOLLOWS:
  2070. C     OBJECTIVE:          POINTS:        PRESENT TOTAL POSSIBLE:
  2071. C  GETTING WELL INTO CAVE   25                    25
  2072. C  EACH TREASURE < CHEST    12                    60
  2073. C  TREASURE CHEST ITSELF    14                    14
  2074. C  EACH TREASURE > CHEST    16                   144
  2075. C  SURVIVING             (MAX-NUM)*10             30
  2076. C  NOT QUITTING              4                     4
  2077. C  REACHING "CLOSNG"        25                    25
  2078. C  "CLOSED": QUIT/KILLED    10
  2079. C            KLUTZED        25
  2080. C            WRONG WAY      30
  2081. C            SUCCESS        45                    45
  2082. C  CAME TO WITT'S END        1                     1
  2083. C  ROUND OUT THE TOTAL       2                     2
  2084. C                                       TOTAL:   350
  2085. C  (POINTS CAN ALSO BE DEDUCTED FOR USING HINTS.)
  2086.  
  2087. 20000    SCORE=0
  2088.     MXSCOR=0
  2089.  
  2090. C  FIRST TALLY UP THE TREASURES.  MUST BE IN BUILDING AND NOT BROKEN.
  2091. C  GIVE THE POOR GUY 2 POINTS JUST FOR FINDING EACH TREASURE.
  2092.  
  2093.     DO 20010 I=50,MAXTRS
  2094.     IF(PTEXT(I).EQ.0)GOTO 20010
  2095.     K=12
  2096.     IF(I.EQ.CHEST)K=14
  2097.     IF(I.GT.CHEST)K=16
  2098.     IF(PROP(I).GE.0)SCORE=SCORE+2
  2099.     IF(PLACE(I).EQ.3.AND.PROP(I).EQ.0)SCORE=SCORE+K-2
  2100.     MXSCOR=MXSCOR+K
  2101. 20010    CONTINUE
  2102.  
  2103. C  NOW LOOK AT HOW HE FINISHED AND HOW FAR HE GOT.  MAXDIE AND NUMDIE TELL US
  2104. C  HOW WELL HE SURVIVED.  GAVEUP SAYS WHETHER HE EXITED VIA QUIT.  DFLAG WILL
  2105. C  TELL US IF HE EVER GOT SUITABLY DEEP INTO THE CAVE.  CLOSNG STILL INDICATES
  2106. C  WHETHER HE REACHED THE ENDGAME.  AND IF HE GOT AS FAR AS "CAVE CLOSED"
  2107. C  (INDICATED BY "CLOSED"), THEN BONUS IS ZERO FOR MUNDANE EXITS OR 133, 134,
  2108. C  135 IF HE BLEW IT (SO TO SPEAK).
  2109.  
  2110.     SCORE=SCORE+(MAXDIE-NUMDIE)*10
  2111.     MXSCOR=MXSCOR+MAXDIE*10
  2112.     IF(.NOT.(SCORNG.OR.GAVEUP))SCORE=SCORE+4
  2113.     MXSCOR=MXSCOR+4
  2114.     IF(DFLAG.NE.0)SCORE=SCORE+25
  2115.     MXSCOR=MXSCOR+25
  2116.     IF(CLOSNG)SCORE=SCORE+25
  2117.     MXSCOR=MXSCOR+25
  2118.     IF(.NOT.CLOSED)GOTO 20020
  2119.     IF(BONUS.EQ.0)SCORE=SCORE+10
  2120.     IF(BONUS.EQ.135)SCORE=SCORE+25
  2121.     IF(BONUS.EQ.134)SCORE=SCORE+30
  2122.     IF(BONUS.EQ.133)SCORE=SCORE+45
  2123. 20020    MXSCOR=MXSCOR+45
  2124.  
  2125. C  DID HE COME TO WITT'S END AS HE SHOULD?
  2126.  
  2127.     IF(PLACE(MAGZIN).EQ.108)SCORE=SCORE+1
  2128.     MXSCOR=MXSCOR+1
  2129.  
  2130. C  ROUND IT OFF.
  2131.  
  2132.     SCORE=SCORE+2
  2133.     MXSCOR=MXSCOR+2
  2134.  
  2135. C  DEDUCT POINTS FOR HINTS.  HINTS < 4 ARE SPECIAL; SEE DATABASE DESCRIPTION.
  2136.  
  2137.     DO 20030 I=1,HNTMAX
  2138. 20030    IF(HINTED(I))SCORE=SCORE-HINTS(I,2)
  2139.  
  2140. C  RETURN TO SCORE COMMAND IF THAT'S WHERE WE CAME FROM.
  2141.  
  2142.     IF(SCORNG)GOTO 8241
  2143.  
  2144. C  THAT SHOULD BE GOOD ENOUGH.  LET'S TELL HIM ALL ABOUT IT.
  2145.  
  2146.     TYPE 20100,SCORE,MXSCOR,TURNS
  2147. 20100    FORMAT(///' You scored',I4,' out of a possible',I4,
  2148.     1    ', using',I5,' turns.')
  2149.  
  2150.     DO 20200 I=1,CLSSES
  2151.     IF(CVAL(I).GE.SCORE)GOTO 20210
  2152. 20200    CONTINUE
  2153.     TYPE 20202
  2154. 20202    FORMAT(/' You just went off my scale!!'/)
  2155.     GOTO 25000
  2156.  
  2157. 20210    CALL SPEAK(CTEXT(I))
  2158.     IF(I.EQ.CLSSES-1)GOTO 20220
  2159.     K=CVAL(I)+1-SCORE
  2160.     KK='s.'
  2161.     IF(K.EQ.1)KK='. '
  2162.     TYPE 20212,K,KK
  2163. 20212    FORMAT(/' To achieve the next higher rating, you need',I3,
  2164.     1    ' more point',A2/)
  2165.     GOTO 25000
  2166.  
  2167. 20220    TYPE 20222
  2168. 20222    FORMAT(/' To achieve the next higher rating ',
  2169.     1    'would be a neat trick!'//' Congratulations!!'/)
  2170.  
  2171. 25000    STOP
  2172.  
  2173.  
  2174.     END
  2175. C  I/O ROUTINES (SPEAK, PSPEAK, RSPEAK, GETIN, YES, A5TOA1)
  2176.  
  2177.  
  2178.     SUBROUTINE SPEAK(N)
  2179.  
  2180. C  PRINT THE MESSAGE WHICH STARTS AT LINES(N).  PRECEDE IT WITH A BLANK LINE
  2181. C  UNLESS BLKLIN IS FALSE.
  2182.  
  2183.     IMPLICIT INTEGER(A-Z)
  2184.     LOGICAL BLKLIN
  2185.     COMMON /TXTCOM/ RTEXT,LINES
  2186.     COMMON /BLKCOM/ BLKLIN
  2187.     DIMENSION RTEXT(205),LINES(22000)
  2188.  
  2189.     IF(N.EQ.0)RETURN
  2190.     IF(LINES(N+1).EQ.'>$<')RETURN
  2191.     IF(BLKLIN)TYPE 2
  2192.     K=N
  2193. 1    L=IABS(LINES(K))-1
  2194.     K=K+1
  2195.     TYPE 2,(LINES(I),I=K,L)
  2196. 2    FORMAT(' ',19A4)
  2197.     K=L+1
  2198.     IF(LINES(K).GE.0)GOTO 1
  2199.     RETURN
  2200.     END
  2201.  
  2202.  
  2203.  
  2204.     SUBROUTINE PSPEAK(MSG,SKIP)
  2205.  
  2206. C  FIND THE SKIP+1ST MESSAGE FROM MSG AND PRINT IT.  MSG SHOULD BE THE INDEX OF
  2207. C  THE INVENTORY MESSAGE FOR OBJECT.  (INVEN+N+1 MESSAGE IS PROP=N MESSAGE).
  2208.  
  2209.     IMPLICIT INTEGER(A-Z)
  2210.     COMMON /TXTCOM/ RTEXT,LINES
  2211.     COMMON /PTXCOM/ PTEXT
  2212.     DIMENSION RTEXT(205),LINES(9650),PTEXT(100)
  2213.  
  2214.     M=PTEXT(MSG)
  2215.     IF(SKIP.LT.0)GOTO 9
  2216.     DO 3 I=0,SKIP
  2217. 1    M=IABS(LINES(M))
  2218.     IF(LINES(M).GE.0)GOTO 1
  2219. 3    CONTINUE
  2220. 9    CALL SPEAK(M)
  2221.     RETURN
  2222.     END
  2223.  
  2224.  
  2225.  
  2226.     SUBROUTINE RSPEAK(I)
  2227.  
  2228. C  PRINT THE I-TH "RANDOM" MESSAGE (SECTION 6 OF DATABASE).
  2229.  
  2230.     IMPLICIT INTEGER(A-Z)
  2231.     COMMON /TXTCOM/ RTEXT
  2232.     DIMENSION RTEXT(205)
  2233.  
  2234.     IF(I.NE.0)CALL SPEAK(RTEXT(I))
  2235.     RETURN
  2236.     END
  2237.  
  2238.  
  2239.  
  2240.     SUBROUTINE MSPEAK(I)
  2241.  
  2242. C  PRINT THE I-TH "MAGIC" MESSAGE (SECTION 12 OF DATABASE).
  2243.  
  2244.     IMPLICIT INTEGER(A-Z)
  2245.     COMMON /MTXCOM/ MTEXT
  2246.     DIMENSION MTEXT(35)
  2247.  
  2248.     IF(I.NE.0)CALL SPEAK(MTEXT(I))
  2249.     RETURN
  2250.     END
  2251.  
  2252.  
  2253.  
  2254.     SUBROUTINE GETIN(WORD1 , WORD2)
  2255.  
  2256. C  GET A COMMAND FROM THE ADVENTURER.  SNARF OUT THE FIRST WORD, PAD IT WITH
  2257. C  BLANKS, AND RETURN IT IN WORD1.  CHARS 6 THRU 10 ARE RETURNED IN WORD1X, IN
  2258. C  CASE WE NEED TO PRINT OUT THE WHOLE WORD IN AN ERROR MESSAGE.  ANY NUMBER OF
  2259. C  BLANKS MAY FOLLOW THE WORD.  IF A SECOND WORD APPEARS, IT IS RETURNED IN
  2260. C  WORD2 (CHARS 6 THRU 10 IN WORD2X), ELSE WORD2 IS SET TO ZERO.
  2261.  
  2262. C    **********************************************************************
  2263. C    * CHARSLC is a possible lowercase line.  Str$Upcase is called to cnv *
  2264. C    * to Upper case to give a bit of friendliness.                 *
  2265. C       **********************************************************************
  2266.  
  2267.     CHARACTER CHARS*30,CHARSLC*30,WORD1*10,WORD2*10
  2268.         INTEGER DUMMY
  2269.     WORD1=' '
  2270.     WORD2=' '
  2271. 501    FORMAT ( ' => ', $)
  2272.         TYPE 501
  2273. 100    FORMAT( Q,30A )
  2274.     READ(*, 100, Err=432, END=432) LNGTH,CHARSLC
  2275.     Dummy = Str$Upcase(CHARS,CHARSLC)
  2276.     I=LIB$SKPC(' ',CHARS)
  2277.     J=LIB$LOCC(' ',CHARS(I:30))-1
  2278.     WORD1=CHARS(I:I+J-1)
  2279.     IF(I+J.GT.LNGTH) RETURN
  2280.     I=I+J
  2281.     I=I+LIB$SKPC(' ',CHARS(I:30))-1
  2282.     J=LIB$LOCC(' ',CHARS(I:30))-1
  2283.     WORD2=CHARS(I:I+J)
  2284. 432    RETURN
  2285.     END
  2286.  
  2287.  
  2288.  
  2289.     LOGICAL FUNCTION YES(X,Y,Z)
  2290.  
  2291. C  CALL YESX (BELOW) WITH MESSAGES FROM SECTION 6.
  2292.  
  2293.     IMPLICIT INTEGER(A-Z)
  2294.     EXTERNAL RSPEAK
  2295.     LOGICAL YESX
  2296.  
  2297.     YES=YESX(X,Y,Z,RSPEAK)
  2298.     RETURN
  2299.     END
  2300.  
  2301.  
  2302.  
  2303.     LOGICAL FUNCTION YESM(X,Y,Z)
  2304.  
  2305. C  CALL YESX (BELOW) WITH MESSAGES FROM SECTION 12.
  2306.  
  2307.     IMPLICIT INTEGER(A-Z)
  2308.     EXTERNAL MSPEAK
  2309.     LOGICAL YESX
  2310.  
  2311.     YESM=YESX(X,Y,Z,MSPEAK)
  2312.     RETURN
  2313.     END
  2314.  
  2315.  
  2316.  
  2317.     LOGICAL FUNCTION YESX(X,Y,Z,SPK)
  2318.  
  2319. C  PRINT MESSAGE X, WAIT FOR YES/NO ANSWER.  IF YES, PRINT Y AND LEAVE YEA
  2320. C  TRUE; IF NO, PRINT Z AND LEAVE YEA FALSE.  SPK IS EITHER RSPEAK OR MSPEAK.
  2321.  
  2322.     IMPLICIT INTEGER(A-Z)
  2323.  
  2324.     CHARACTER*5 REPLY,JUNK1
  2325. 1    IF(X.NE.0)CALL SPK(X)
  2326.     CALL GETIN(REPLY, JUNK1 )
  2327.     IF(REPLY.EQ.'YES'.OR.REPLY.EQ.'Y')GOTO 10
  2328.     IF(REPLY.EQ.'NO'.OR.REPLY.EQ.'N')GOTO 20
  2329.     TYPE 9
  2330. 9    FORMAT(/' Please answer the question.')
  2331.     GOTO 1
  2332. 10    YESX=.TRUE.
  2333.     IF(Y.NE.0)CALL SPK(Y)
  2334.     RETURN
  2335. 20    YESX=.FALSE.
  2336.     IF(Z.NE.0)CALL SPK(Z)
  2337.     RETURN
  2338.     END
  2339.  
  2340.  
  2341.  
  2342.     SUBROUTINE A5TOA1(A,B,CHARS,LENG)
  2343.  
  2344. C  A AND B CONTAIN A 1- TO 9-CHARACTER WORD IN A5 FORMAT, C CONTAINS ANOTHER
  2345. C  WORD AND/OR PUNCTUATION.  THEY ARE UNPACKED TO ONE CHARACTER PER WORD IN THE
  2346. C  ARRAY "CHARS", WITH EXACTLY ONE BLANK BETWEEN B AND C (OR NONE, IF C >= 0).
  2347. C  THE INDEX OF THE LAST NON-BLANK CHAR IN CHARS IS RETURNED IN LENG.
  2348.  
  2349.     IMPLICIT INTEGER(A-Z)
  2350.     DIMENSION CHARS(20)
  2351.     CHARACTER *(*) A,B
  2352.     INTEGER CHARS
  2353. C
  2354. C
  2355.     J=1
  2356.     DO 100 I=1,LIB$LEN(A)
  2357.         CHARS(J)=LIB$ICHAR(A(I:I))
  2358.         IF(A(I:I) .EQ. ' ')  GO TO 200
  2359.         J=J+1
  2360. 100    CONTINUE
  2361.     CHARS(J)=' '
  2362. 200    J=J+1
  2363.     DO 250 I=1,LIB$LEN(B)
  2364.         CHARS(J)=LIB$ICHAR(B(I:I))
  2365.         IF(B(I:I) .EQ. ' ') GO TO 300
  2366.         J=J+1
  2367. 250    CONTINUE
  2368. 300    LENG=J-1
  2369.     RETURN
  2370.     END
  2371.  
  2372. C  DATA STRUCTURE ROUTINES (VOCAB, DSTROY, JUGGLE, MOVE, PUT, CARRY, DROP)
  2373.  
  2374.  
  2375.     INTEGER FUNCTION VOCAB(ID,INIT)
  2376.  
  2377. C  LOOK UP ID IN THE VOCABULARY (ATAB) AND RETURN ITS "DEFINITION" (KTAB), OR
  2378. C  -1 IF NOT FOUND.  IF INIT IS POSITIVE, THIS IS AN INITIALISATION CALL SETTING
  2379. C  UP A KEYWORD VARIABLE, AND NOT FINDING IT CONSTITUTES A BUG.  IT ALSO MEANS
  2380. C  THAT ONLY KTAB VALUES WHICH TAKEN OVER 1000 EQUAL INIT MAY BE CONSIDERED.
  2381. C  (THUS "STEPS", WHICH IS A MOTION VERB AS WELL AS AN OBJECT, MAY BE LOCATED
  2382. C  AS AN OBJECT.)  AND IT ALSO MEANS THE KTAB VALUE IS TAKEN MOD 1000.
  2383.  
  2384.     IMPLICIT INTEGER(A-Z)
  2385.     COMMON/VOCCOM1/ ATAB
  2386.     COMMON/VOCCOM2/ KTAB,TABSIZ
  2387.     CHARACTER ATAB(300)*5
  2388.     CHARACTER*(*) ID
  2389.     CHARACTER*(5) HASH
  2390.     DIMENSION KTAB(300)
  2391.  
  2392.     HASH=ID
  2393.     DO 1 I=1,TABSIZ
  2394.     IF(KTAB(I).EQ.-1)GOTO 2
  2395.     IF(INIT.GE.0.AND.KTAB(I)/1000.NE.INIT)GOTO 1
  2396.     IF(ATAB(I).EQ.HASH)GOTO 3
  2397. 1    CONTINUE
  2398.     CALL BUG(21)
  2399.  
  2400. 2    VOCAB=-1
  2401.     IF(INIT.LT.0)RETURN
  2402.     CALL BUG(5)
  2403.  
  2404. 3    VOCAB=KTAB(I)
  2405.     IF(INIT.GE.0)VOCAB=MOD(VOCAB,1000)
  2406.     RETURN
  2407.     END
  2408.  
  2409.  
  2410.  
  2411.     SUBROUTINE DSTROY(OBJECT)
  2412.  
  2413. C  PERMANENTLY ELIMINATE "OBJECT" BY MOVING TO A NON-EXISTENT LOCATION.
  2414.  
  2415.     IMPLICIT INTEGER(A-Z)
  2416.  
  2417.     CALL MOVE(OBJECT,0)
  2418.     RETURN
  2419.     END
  2420.  
  2421.  
  2422.  
  2423.     SUBROUTINE JUGGLE(OBJECT)
  2424.  
  2425. C  JUGGLE AN OBJECT BY PICKING IT UP AND PUTTING IT DOWN AGAIN, THE PURPOSE
  2426. C  BEING TO GET THE OBJECT TO THE FRONT OF THE CHAIN OF THINGS AT ITS LOC.
  2427.  
  2428.     IMPLICIT INTEGER(A-Z)
  2429.     COMMON /PLACOM/ ATLOC,LINK,PLACE,FIXED,HOLDNG
  2430.     DIMENSION ATLOC(150),LINK(200),PLACE(100),FIXED(100)
  2431.  
  2432.     I=PLACE(OBJECT)
  2433.     J=FIXED(OBJECT)
  2434.     CALL MOVE(OBJECT,I)
  2435.     CALL MOVE(OBJECT+100,J)
  2436.     RETURN
  2437.     END
  2438.  
  2439.  
  2440.  
  2441.     SUBROUTINE MOVE(OBJECT,WHERE)
  2442.  
  2443. C  PLACE ANY OBJECT ANYWHERE BY PICKING IT UP AND DROPPING IT.  MAY ALREADY BE
  2444. C  TOTING, IN WHICH CASE THE CARRY IS A NO-OP.  MUSTN'T PICK UP OBJECTS WHICH
  2445. C  ARE NOT AT ANY LOC, SINCE CARRY WANTS TO REMOVE OBJECTS FROM ATLOC CHAINS.
  2446.  
  2447.     IMPLICIT INTEGER(A-Z)
  2448.     COMMON /PLACOM/ ATLOC,LINK,PLACE,FIXED,HOLDNG
  2449.     DIMENSION ATLOC(150),LINK(200),PLACE(100),FIXED(100)
  2450.  
  2451.     IF(OBJECT.GT.100)GOTO 1
  2452.     FROM=PLACE(OBJECT)
  2453.     GOTO 2
  2454. 1    FROM=FIXED(OBJECT-100)
  2455. 2    IF(FROM.GT.0.AND.FROM.LE.300)CALL CARRY(OBJECT,FROM)
  2456.     CALL DROP(OBJECT,WHERE)
  2457.     RETURN
  2458.     END
  2459.  
  2460.  
  2461.  
  2462.     INTEGER FUNCTION PUT(OBJECT,WHERE,PVAL)
  2463.  
  2464. C  PUT IS THE SAME AS MOVE, EXCEPT IT RETURNS A VALUE USED TO SET UP THE
  2465. C  NEGATED PROP VALUES FOR THE REPOSITORY OBJECTS.
  2466.  
  2467.     IMPLICIT INTEGER(A-Z)
  2468.  
  2469.     CALL MOVE(OBJECT,WHERE)
  2470.     PUT=(-1)-PVAL
  2471.     RETURN
  2472.     END
  2473.  
  2474.  
  2475.  
  2476.     SUBROUTINE CARRY(OBJECT,WHERE)
  2477.  
  2478. C  START TOTING AN OBJECT, REMOVING IT FROM THE LIST OF THINGS AT ITS FORMER
  2479. C  LOCATION.  INCR HOLDNG UNLESS IT WAS ALREADY BEING TOTED.  IF OBJECT>100
  2480. C  (MOVING "FIXED" SECOND LOC), DON'T CHANGE PLACE OR HOLDNG.
  2481.  
  2482.     IMPLICIT INTEGER(A-Z)
  2483.     COMMON /PLACOM/ ATLOC,LINK,PLACE,FIXED,HOLDNG
  2484.     DIMENSION ATLOC(150),LINK(200),PLACE(100),FIXED(100)
  2485.  
  2486.     IF(OBJECT.GT.100)GOTO 5
  2487.     IF(PLACE(OBJECT).EQ.-1)RETURN
  2488.     PLACE(OBJECT)=-1
  2489.     HOLDNG=HOLDNG+1
  2490. 5    IF(ATLOC(WHERE).NE.OBJECT)GOTO 6
  2491.     ATLOC(WHERE)=LINK(OBJECT)
  2492.     RETURN
  2493. 6    TEMP=ATLOC(WHERE)
  2494. 7    IF(LINK(TEMP).EQ.OBJECT)GOTO 8
  2495.     TEMP=LINK(TEMP)
  2496.     GOTO 7
  2497. 8    LINK(TEMP)=LINK(OBJECT)
  2498.     RETURN
  2499.     END
  2500.  
  2501.  
  2502.  
  2503.     SUBROUTINE DROP(OBJECT,WHERE)
  2504.  
  2505. C  PLACE AN OBJECT AT A GIVEN LOC, PREFIXING IT ONTO THE ATLOC LIST.  DECR
  2506. C  HOLDNG IF THE OBJECT WAS BEING TOTED.
  2507.  
  2508.     IMPLICIT INTEGER(A-Z)
  2509.     COMMON /PLACOM/ ATLOC,LINK,PLACE,FIXED,HOLDNG
  2510.     DIMENSION ATLOC(150),LINK(200),PLACE(100),FIXED(100)
  2511.     
  2512.     IF(OBJECT.GT.100)GOTO 1
  2513.     IF(PLACE(OBJECT).EQ.-1)HOLDNG=HOLDNG-1
  2514.     PLACE(OBJECT)=WHERE
  2515.     GOTO 2
  2516. 1    FIXED(OBJECT-100)=WHERE
  2517. 2    IF(WHERE.LE.0)RETURN
  2518.     LINK(OBJECT)=ATLOC(WHERE)
  2519.     ATLOC(WHERE)=OBJECT
  2520.     RETURN
  2521.     END
  2522.  
  2523. C  WIZARDRY ROUTINES (START, MAINT, WIZARD, NEWHRS(X),  POOF)
  2524.  
  2525.  
  2526.     LOGICAL FUNCTION START(DUMMY)
  2527.  
  2528. C  CHECK TO SEE IF THIS IS "PRIME TIME".  IF SO, ONLY WIZARDS MAY PLAY, THOUGH
  2529. C  OTHERS MAY BE ALLOWED A SHORT GAME FOR DEMONSTRATION PURPOSES.  IF SETUP<0,
  2530. C  WE'RE CONTINUING FROM A SAVED GAME, SO CHECK FOR SUITABLE LATENCY.  RETURN
  2531. C  TRUE IF THIS IS A DEMO GAME (VALUE IS IGNORED FOR RESTARTS).
  2532.  
  2533.     IMPLICIT INTEGER(A-Z)
  2534.     LOGICAL PTIME,SOON,YESM
  2535.     DIMENSION HNAME(4)
  2536.     COMMON /WIZCOM/ WKDAY,WKEND,HOLID,HBEGIN,HEND,HNAME,
  2537.     1    SHORT,MAGNM,LATNCY,SAVED,SAVET,SETUP
  2538.  
  2539. C  FIRST FIND OUT WHETHER IT IS PRIME TIME (SAVE IN PTIME) AND, IF RESTARTING,
  2540. C  WHETHER IT'S TOO SOON (SAVE IN SOON).  PRIME-TIME SPECS ARE IN WKDAY, WKEND,
  2541. C  AND HOLID; SEE MAINT ROUTINE FOR DETAILS.  LATNCY IS REQUIRED DELAY BEFORE
  2542. C  RESTARTING.  WIZARDS MAY CUT THIS TO A THIRD.
  2543.  
  2544. C    PRIMTM=WKDAY
  2545.  
  2546.     PRIMTM=HOLID
  2547.     RETURN
  2548.     END
  2549.  
  2550.     SUBROUTINE MAINT( NUMDIE )
  2551.  
  2552. C  SOMEONE SAID THE MAGIC WORD TO INVOKE MAINTENANCE MODE.  MAKE SURE HE'S A
  2553. C  WIZARD.  IF SO, LET HIM TWEAK ALL SORTS OF RANDOM THINGS, THEN EXIT SO CAN
  2554. C  SAVE TWEAKED VERSION.  SINCE MAGIC WORD was to BE FIRST COMMAND GIVEN, ONLY
  2555. C  THING WHICH NEEDS TO BE FIXED UP IS ABB(1).
  2556.  
  2557.     IMPLICIT INTEGER(A-Z)
  2558.     LOGICAL YESM,BLKLIN
  2559.     DIMENSION HNAME(4),ABB(150)
  2560.     CHARACTER X*10,XT*10,MAGIC*10
  2561.     COMMON /BLKCOM/ BLKLIN
  2562.     COMMON /ABBCOM/ ABB
  2563.     COMMON /WIZCOM/ WKDAY,WKEND,HOLID,HBEGIN,HEND,HNAME,
  2564.     1    SHORT,MAGNM,LATNCY,SAVED,SAVET,SETUP
  2565.     COMMON /WIZWRD/ MAGIC
  2566.  
  2567.     IF(.NOT.WIZARD(0))RETURN
  2568.     NUMDIE=1
  2569.     BLKLIN=.FALSE.
  2570.     RETURN
  2571.     END
  2572.  
  2573.  
  2574.  
  2575.     LOGICAL FUNCTION WIZARD(DUMMY)
  2576.  
  2577. C  ASK IF HE'S A WIZARD.  IF HE SAYS YES, MAKE HIM PROVE IT.  RETURN TRUE IF HE
  2578. C  REALLY IS A WIZARD.
  2579.  
  2580.     IMPLICIT INTEGER(A-Z)
  2581.     LOGICAL YESM
  2582.     CHARACTER WORD*10,TWORD*10,MAGIC*10
  2583.     DIMENSION HNAME(4),VAL(5)
  2584.     COMMON /WIZCOM/ WKDAY,WKEND,HOLID,HBEGIN,HEND,HNAME,
  2585.     1    SHORT,MAGNM,LATNCY,SAVED,SAVET,SETUP
  2586.     COMMON /WIZWRD/ MAGIC
  2587.  
  2588.     WIZARD=YESM(16,0,7)
  2589.     IF(.NOT.WIZARD)RETURN
  2590.  
  2591. C  HE SAYS HE IS.  FIRST STEP: DOES HE KNOW ANYTHING MAGICAL?
  2592.  
  2593.     CALL MSPEAK(17)
  2594.     CALL GETIN(WORD , TWORD)
  2595.     IF(WORD.NE.MAGIC)GOTO 99
  2596.  
  2597. C  BY GEORGE, HE REALLY *IS* A WIZARD!
  2598.  
  2599.     CALL MSPEAK(19)
  2600.     WIZARD=.TRUE.
  2601.     RETURN
  2602.  
  2603. C  AHA!  AN IMPOSTOR!
  2604.  
  2605. 99    CALL MSPEAK(20)
  2606.     WIZARD=.FALSE.
  2607.     RETURN
  2608.     END
  2609.  
  2610.  
  2611.     SUBROUTINE POOF
  2612.  
  2613. C  AS PART OF DATABASE INITIALISATION, WE CALL POOF TO SET UP SOME DUMMY
  2614. C  PRIME-TIME SPECS, MAGIC WORDS, ETC.
  2615.  
  2616.     IMPLICIT INTEGER(A-Z)
  2617.     DIMENSION HNAME(4)
  2618.     CHARACTER MAGIC*10
  2619.     COMMON /WIZCOM/ WKDAY,WKEND,HOLID,HBEGIN,HEND,HNAME,
  2620.     1    SHORT,MAGNM,LATNCY,SAVED,SAVET,SETUP
  2621.     COMMON /WIZWRD/ MAGIC
  2622.  
  2623.     WKDAY='0003FF00'X
  2624.     WKEND=0
  2625.     HOLID=0
  2626.     HBEGIN=0
  2627.     HEND=-1
  2628.     SHORT=900
  2629.  
  2630. C        *******************************************************************
  2631. C        * Have changed the Short Game to 900 Moves (If it is ever called) *
  2632. C        * (More than enuff time to get killed.  Changed Magic Word        *
  2633. C        * Magic Number does nothing as far as i can see.  The facility is *
  2634. C        * there but does not seem to be used anywhere...                  *
  2635. C        *******************************************************************
  2636.  
  2637.     MAGIC='WITCH'
  2638.     MAGNM=11111
  2639.     LATNCY=60
  2640.     RETURN
  2641.     END
  2642.  
  2643.  
  2644. C  UTILITY ROUTINES (SHIFT, RAN, DATIME, BUG)
  2645. C
  2646. C
  2647. C
  2648.     SUBROUTINE XFR(A,I,K)
  2649.     CHARACTER*(*) A
  2650.     DIMENSION ITMP(20),I(22000)
  2651.     LOGICAL*1 LTMP(80)
  2652.     EQUIVALENCE(ITMP,LTMP)
  2653.     J=LEN(A)
  2654.     DO 100 II=1,J
  2655.         LTMP(II)=LIB$ICHAR(A(II:II))
  2656. 100    CONTINUE
  2657.     J=J/4+1
  2658.     DO 200 II=1,J
  2659.         I(K+II-1)=ITMP(II)
  2660. 200    CONTINUE
  2661.     RETURN
  2662.     END
  2663.  
  2664.     FUNCTION INTG(CH)
  2665.     CHARACTER*(*) CH
  2666.     L=LEN(CH)
  2667.     I=LIB$SKPC(' ',CH)
  2668.     IS=1
  2669.     IF(CH(I:I) .EQ. '-') THEN
  2670.         I=I+1
  2671.         IS=-1
  2672.     ENDIF
  2673.     J=LIB$LOCC(' ',CH(I:L-I+1))-1
  2674.     INTG=0
  2675.     DO 100 K=I,I+J-1
  2676.         INTG=INTG*10+(LIB$ICHAR(CH(K:K))-'30'X)
  2677. 100    CONTINUE
  2678.     INTG=INTG*IS
  2679.     RETURN
  2680.     END
  2681.  
  2682.  
  2683.     INTEGER FUNCTION SHIFT(VAL,DIST)
  2684.     IMPLICIT INTEGER(A-Z)
  2685.  
  2686. C  RETURN VAL LEFT-SHIFTED (LOGICALLY) DIST BITS (RIGHT-SHIFT IF DIST<0).
  2687.  
  2688.     SHIFT=VAL
  2689.     IF(DIST)10,20,30
  2690. 10    IDIST=-DIST
  2691.     DO 11 I=1,IDIST
  2692.     J=0
  2693.     IF(SHIFT.LT.0)J='40000000'X
  2694. 11    SHIFT=((SHIFT.AND.'7FFFFFFF'X)/2)+J
  2695. 20    RETURN
  2696. 30    DO 31 I=1,DIST
  2697.     J=0
  2698.     IF((SHIFT.AND.'40000000'X).NE.0)J='80000000'X
  2699. 31    SHIFT=(SHIFT.AND.'3FFFFFFF'X)*2+J
  2700.     RETURN
  2701.     END
  2702.  
  2703.  
  2704.  
  2705.     INTEGER FUNCTION RAN(RANGE)
  2706.  
  2707. C  SINCE THE RAN FUNCTION IN LIB40 SEEMS TO BE A REAL LOSE, WE'LL USE ONE OF
  2708. C  OUR OWN.  IT'S BEEN RUN THROUGH MANY OF THE TESTS IN KNUTH VOL. 2 AND
  2709. C  SEEMS TO BE QUITE RELIABLE.  RAN RETURNS A VALUE UNIFORMLY SELECTED
  2710. C  BETWEEN 0 AND RANGE-1.  NOTE RESEMBLANCE TO ALG USED IN WIZARD.
  2711.  
  2712.     IMPLICIT INTEGER(A-Z)
  2713.     DATA R/0/
  2714.  
  2715.     D=1
  2716.     IF(R.NE.0)GOTO 1
  2717.     CALL DATIME(D,T)
  2718.     R=18*T+5
  2719.     D=1000+MOD(D,1000)
  2720. 1    DO 2 T=1,D
  2721. 2    R=MOD(R*1021,1048576)
  2722.     RAN=(RANGE*R)/1048576
  2723.     RETURN
  2724.     END
  2725.  
  2726.  
  2727.  
  2728.     SUBROUTINE DATIME(D,T)
  2729.  
  2730. C  RETURN THE DATE AND TIME IN D AND T.  D IS NUMBER OF DAYS SINCE 01-JAN-77,
  2731. C  T IS MINUTES PAST MIDNIGHT. 
  2732.     IMPLICIT INTEGER(A-Z)
  2733.     DIMENSION MONTH(12)
  2734.     DATA MONTH/0,31,59,90,120,151,181,212,243,273,304,334/
  2735.     REAL FOR$SECNDS
  2736.     CALL FOR$JDATE(MON,DAY,YEAR)
  2737.     Y=(YEAR-77)*365+(YEAR-77)/4
  2738.     IF(MOD(YEAR,4) .EQ. 3 .AND. MON .GT. 2) Y=Y+1
  2739.     D=Y+MONTH(MON)+DAY-1
  2740.     T=FOR$SECNDS(0.0)/60.
  2741.     RETURN
  2742.     END
  2743.  
  2744.  
  2745.  
  2746. C    Ex-SUBROUTINE CIAO
  2747.  
  2748. C  EXITS, AFTER ISSUING REMINDER TO SAVE NEW CORE IMAGE.  USED WHEN SUSPENDING
  2749. C  AND WHEN CREATING NEW VERSION VIA MAGIC MODE.  ON SOME SYSTEMS, THE CORE
  2750. C  IMAGE IS LOST ONCE THE PROGRAM EXITS.  IF SO, SET K=31 INSTEAD OF 32.
  2751.  
  2752.  
  2753.     SUBROUTINE BUG(NUM)
  2754.     IMPLICIT INTEGER(A-Z)
  2755.  
  2756. C  THE FOLLOWING CONDITIONS ARE CURRENTLY CONSIDERED FATAL BUGS.  NUMBERS < 20
  2757. C  ARE DETECTED WHILE READING THE DATABASE; THE OTHERS OCCUR AT "RUN TIME".
  2758. C    0    MESSAGE LINE > 70 CHARACTERS
  2759. C    1    NULL LINE IN MESSAGE
  2760. C    2    TOO MANY WORDS OF MESSAGES
  2761. C    3    TOO MANY TRAVEL OPTIONS
  2762. C    4    TOO MANY VOCABULARY WORDS
  2763. C    5    REQUIRED VOCABULARY WORD NOT FOUND
  2764. C    6    TOO MANY RTEXT OR MTEXT MESSAGES
  2765. C    7    TOO MANY HINTS
  2766. C    8    LOCATION HAS COND BIT BEING SET TWICE
  2767. C    9    INVALID SECTION NUMBER IN DATABASE
  2768. C    20    SPECIAL TRAVEL (500>L>300) EXCEEDS GOTO LIST
  2769. C    21    RAN OFF END OF VOCABULARY TABLE
  2770. C    22    VOCABULARY TYPE (N/1000) NOT BETWEEN 0 AND 3
  2771. C    23    INTRANSITIVE ACTION VERB EXCEEDS GOTO LIST
  2772. C    24    TRANSITIVE ACTION VERB EXCEEDS GOTO LIST
  2773. C    25    CONDITIONAL TRAVEL ENTRY WITH NO ALTERNATIVE
  2774. C    26    LOCATION HAS NO TRAVEL ENTRIES
  2775. C    27    HINT NUMBER EXCEEDS GOTO LIST
  2776. C    28    INVALID MONTH RETURNED BY DATE FUNCTION
  2777.  
  2778.     TYPE 1, NUM
  2779. 1    FORMAT (' Fatal error, see source code for interpretation.'/
  2780.     1    ' Probable cause: erroneous info in database.'/
  2781.     2    ' Error code =',I2/)
  2782.     STOP 'Oh dear'
  2783.     END
  2784. -- 
  2785.  
  2786.  +--------+ --+--        +         --+--                 The slowest "X" term
  2787.  | +----+ |   |          |           |                   in the west (With a 
  2788.  | |    | |   | |  | `/` +--   --    |   ,--, `/` +\ /+ twin - rinse   cycle
  2789.  | +----+ |   | |  | |   |  ) (  )   |   |--' |   | V | thrown in.
  2790.  | VT1000 |   + +--+ +   +--   --    +   `--' +   +   + Fax:  (064)-7-838-4066
  2791.  +--------+ Simon Paul Travaglia,  Computer Services,  University  of  Waikato
  2792.  [========] Private. Bag 3105,  Hamilton, New Zealand. spt@grace.waikato.ac.nz
  2793.  
  2794. Fairy Tale: A horror story to prepare children for the newspapers.
  2795.