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.1 < prev    next >
Encoding:
Internet Message Format  |  1991-12-30  |  78.0 KB

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