C
C *********************************************************************
C ****************************** SUBROUTINE RKB ***********************
C *********************************************************************
C
C
      SUBROUTINE RKB
C
C
      IMPLICIT INTEGER*4 (A-Z)
      LOGICAL BLKLIN,NOINPT
      LOGICAL DSEEN,HINTED,YES,DARK,BITSET,CLOSED,GAVEUP,SCORNG,YEA
      LOGICAL TOTING,HERE,AT,WZDARK,LMWARN,CLOSNG,PANIC,FORCED,PCT
C
      INTEGER*4 LINES,EOF
C
      COMMON /TXTCOM/ RTEXT,LINES,ASCVAR
      COMMON /RKSHRD/ YEA,WZDARK,OLDLC2,HINT,WD1,WD1X,WD2
     &,WD2X,LIMIT,SPK
      COMMON /BLKCOM/ BLKLIN,NOINPT
      COMMON /ALPHAS/ CYES,CY,CNO,CN,CPOUR,CWEST,CENTE
      COMMON /BLANKS/ BLANK4,EOF
      COMMON /VOCCOM/ KTAB,ATAB,A2TAB,TABSIZ
      COMMON /PLACOM/ ATLOC,LINK,PLACE,FIXED,HOLDNG
      COMMON /MTXCOM/ MTEXT
      COMMON /PTXCOM/ PTEXT
      COMMON /ABBCOM/ ABB
      COMMON /CONCOM/ COND(150)
      COMMON /PROCOM/ PROP(100),BOTTLE,LAMP,WATER,OIL
      COMMON /LOCCOM/ OLDLOC,LOC
      COMMON /MISCOM/ LINUSE,TRVS,CLSSES,CVAL,TK,NEWLOC,
     &KEY,PLAC,FIXD,ACTSPK,HINTS,HNTMAX,TALLY,TALLY2,
     &HINTLC,CHLOC,CHLOC2,DSEEN,DFLAG,DLOC,DALTLC,KEYS,GRATE,
     &CAGE,ROD,ROD2,STEPS,BIRD,DOOR,PILLOW,SNAKE,FISSUR,TABLET,
     &CLAM,OYSTER,MAGZIN,DWARF,KNIFE,FOOD,PLANT,
     &PLANT2,AXE,MIRROR,DRAGON,CHASM,TROLL,TROLL2,BEAR,MESSAG,VEND,
     &BATTER,NUGGET,COINS,CHEST,EGGS,TRIDNT,VASE,EMRALD,PYRAM,
     &PEARL,RUG,CHAIN,BACK,LOOK,CAVE,NULL,ENTRNC,DPRSSN,SAY,LOCK,
     &THROW,FIND,INVENT,TURNS,LMWARN,KNFLOC,DETAIL,ABBNUM,
     &NUMDIE,MAXDIE,DKILL,FOOBAR,BONUS,CLOCK1,CLOCK2,
     &CLOSNG,PANIC,CLOSED,GAVEUP,SCORNG,ODLOC,STREAM,SPICES
      COMMON /MISC2/ I,RTXSIZ,CLSMAX,MAGSIZ,LOCSIZ,CTEXT,STEXT,LTEXT,
     &SECT,TRAVEL,TRVCON,TRVLOC,TRVSIZ,TABNDX,OBJ,J,K,VERB,HNTSIZ,
     &MAXTRS,HINTED,HNTLOC,KK
C
      COMMON /SAVEIT/ATTACK,DEST2,DTOTAL,K2,KENT,KQ,LL,MXSCOR,SCORE,
     *               STICK
      DIMENSION LINES(18)
      DIMENSION TRAVEL(750),TRVCON(750),TRVLOC(750)
      DIMENSION KTAB(300),ATAB(300),A2TAB(300)
      DIMENSION LTEXT(150),STEXT(150),KEY(150),ABB(150),ATLOC(150)
      DIMENSION PLAC(100),PLACE(100),FIXD(100),FIXED(100),LINK(200),
     & PTEXT(100)
      DIMENSION ACTSPK(35)
      DIMENSION RTEXT(205)
      DIMENSION CTEXT(12),CVAL(12)
      DIMENSION HINTLC(20),HINTED(20),HINTS(20,4)
        DIMENSION MTEXT(35)
      DIMENSION TK(20),DSEEN(6),DLOC(6),ODLOC(6)
C
C  STATEMENT FUNCTIONS
C
C
C  TOTING(OBJ)  = TRUE IF THE OBJ IS BEING CARRIED
C  HERE(OBJ)    = TRUE IF THE OBJ IS AT "LOC" (OR IS BEING CARRIED)
C  AT(OBJ)      = TRUE IF ON EITHER SIDE OF TWO-PLACED OBJECT
C  LIQ(DUMMY)   = OBJECT NUMBER OF LIQUID IN BOTTLE
C  LIQLOC(LOC)  = OBJECT NUMBER OF LIQUID (IF ANY) AT LOC
C  BITSET(L,N)  = TRUE IF COND(L) HAS BIT N SET (BIT 0 IS UNITS BIT)
C  FORCED(LOC)  = TRUE IF LOC MOVES WITHOUT ASKING FOR INPUT (COND=2)
C  DARK(DUMMY)  = TRUE IF LOCATION "LOC" IS DARK
C  PCT(N)       = TRUE N% OF THE TIME (N INTEGER FROM 0 TO 100)
C
C  WZDARK SAYS WHETHER THE LOC HE'S LEAVING WAS DARK
C  LMWARN SAYS WHETHER HE'S BEEN WARNED ABOUT LAMP GOING DIM
C  CLOSNG SAYS WHETHER ITS CLOSING TIME YET
C  PANIC SAYS WHETHER HE'S FOUND OUT HE'S TRAPPED IN THE CAVE
C  CLOSED SAYS WHETHER WE'RE ALL THE WAY CLOSED
C  GAVEUP SAYS WHETHER HE EXITED VIA "QUIT"
C  SCORNG INDICATES TO THE SCORE ROUTINE WHETHER WE'RE DOING A "SCORE" C
C  DEMO IS TRUE IF THIS IS A PRIME-TIME DEMONSTRATION GAME
C  YEA IS RANDOM YES/NO REPLY
C
C
      TOTING(OBJ)=PLACE(OBJ).EQ.-1
      HERE(OBJ)=PLACE(OBJ).EQ.LOC.OR.TOTING(OBJ)
      AT(OBJ)=PLACE(OBJ).EQ.LOC.OR.FIXED(OBJ).EQ.LOC
C     LIQ2(PBOTL)=(1-PBOTL)*WATER+(PBOTL/2)*(WATER+OIL)
      LIQLOC(LOC)=LIQ2((MOD(COND(LOC)/2*2,8)-5)*MOD(COND(LOC)/4,2)+1)
      FORCED(LOC)=COND(LOC).EQ.2
      PCT(N)=RND(100).LT.N
C
C
C  START-UP, DWARF STUFF
C
    1 I=RND(1)
      HINTED(3)=YES(65,1,0)
      NEWLOC=1
      LOC = NEWLOC
      LIMIT=330
      IF(HINTED(3))LIMIT=1000
C
C  CAN'T LEAVE CAVE ONCE IT'S CLOSING (EXCEPT BY MAIN OFFICE).
C
    2 IF(NEWLOC.GE.9.OR.NEWLOC.EQ.0.OR..NOT.CLOSNG)GOTO 71
      CALL RSPEAK(130)
      NEWLOC=LOC
      IF(.NOT.PANIC)CLOCK2=15
      PANIC=.TRUE.
C
C  SEE IF A DWARF HAS SEEN HIM AND HAS COME FROM WHERE HE WANTS TO GO.
C  THE DWARF'S BLOCKING HIS WAY.  IF COMING FROM PLACE FORBIDDEN TO PIRA
C  (DWARVES ROOTED IN PLACE) LET HIM GET OUT (AND ATTACKED).
C
   71 IF(NEWLOC.EQ.LOC.OR.FORCED(LOC).OR.BITSET(LOC,3))GOTO 74
      DO 73 I=1,5
      IF(ODLOC(I).NE.NEWLOC.OR..NOT.DSEEN(I))GOTO 73
      NEWLOC=LOC
      CALL RSPEAK(2)
      GOTO 74
   73 CONTINUE
   74 LOC=NEWLOC
C
C  DWARF STUFF.  SEE EARLIER COMMENTS FOR DESCRIPTION OF VARIABLES.  REM
C  SIXTH DWARF IS PIRATE AND IS THUS VERY DIFFERENT EXCEPT FOR MOTION RU
C
C  FIRST OFF, DON'T LET THE DWARVES FOLLOW HIM INTO A PIT OR A WALL.  AC
C  THE WHOLE MESS THE FIRST TIME HE GETS AS FAR AS THE HALL OF MISTS (LO
C  IF NEWLOC IS FORBIDDEN TO PIRATE (IN PARTICULAR, IF IT'S BEYOND THE T
C  BRIDGE), BYPASS DWARF STUFF.  THAT WAY PIRATE CAN'T STEAL RETURN TOLL
C  DWARVES CAN'T MEET THE BEAR.  ALSO MEANS DWARVES WON'T FOLLOW HIM INT
C  END IN MAZE, BUT C'EST LA VIE.  THEY'LL WAIT FOR HIM OUTSIDE THE DEAD
C
      IF(LOC.EQ.0.OR.FORCED(LOC).OR.BITSET(NEWLOC,3))GOTO 2000
      IF(DFLAG.NE.0)GOTO 6000
      IF(LOC.GE.15)DFLAG=1
      GOTO 2000
C
C  WHEN WE ENCOUNTER THE FIRST DWARF, WE KILL 0, 1, OR 2 OF THE 5 DWARVE
C  ANY OF THE SURVIVORS IS AT LOC, REPLACE HIM WITH THE ALTERNATE.
C
 6000 IF(DFLAG.NE.1)GOTO 6010
      IF(LOC.LT.15.OR.PCT(95))GOTO 2000
      DFLAG=2
      DO 6001 I=1,2
      J=1+RND(5)
 6001 IF(PCT(50))DLOC(J)=0
      DO 6002 I=1,5
      IF(DLOC(I).EQ.LOC)DLOC(I)=DALTLC
 6002 ODLOC(I)=DLOC(I)
      CALL RSPEAK(3)
      CALL DROP(AXE,LOC)
      GOTO 2000
C
C  THINGS ARE IN FULL SWING.  MOVE EACH DWARF AT RANDOM, EXCEPT IF HE'S
C  HE STICKS WITH US.  DWARVES NEVER GO TO LOCS <15.  IF WANDERING AT RA
C  THEY DON'T BACK UP UNLESS THERE'S NO ALTERNATIVE.  IF THEY DON'T HAVE
C  MOVE, THEY ATTACK.  AND, OF COURSE, DEAD DWARVES DON'T DO MUCH OF ANY
C
 6010 DTOTAL=0
      ATTACK=0
      STICK=0
      DO 6030 I=1,6
      IF(DLOC(I).EQ.0)GOTO 6030
      J=1
      KK=DLOC(I)
      KK=KEY(KK)
      IF(KK.EQ.0)GOTO 6016
 6012 NEWLOC=TRVLOC(KK)
      IF(NEWLOC.GT.300.OR.NEWLOC.LT.15.OR.NEWLOC.EQ.ODLOC(I)
     &.OR.(J.GT.1.AND.NEWLOC.EQ.TK(J-1)).OR.J.GE.20
     &.OR.NEWLOC.EQ.DLOC(I).OR.FORCED(NEWLOC)
     &.OR.(I.EQ.6.AND.BITSET(NEWLOC,3))
     &.OR.TRVCON(KK).EQ.100)GOTO 6014
      TK(J)=NEWLOC
      J=J+1
 6014 KK=KK+1
      IF(TRAVEL(KK-1).GE.0)GOTO 6012
 6016 TK(J)=ODLOC(I)
      IF(J.GE.2)J=J-1
      J=1+RND(J)
      ODLOC(I)=DLOC(I)
      DLOC(I)=TK(J)
      DSEEN(I)=(DSEEN(I).AND.LOC.GE.15)
     &.OR.(DLOC(I).EQ.LOC.OR.ODLOC(I).EQ.LOC)
      IF(.NOT.DSEEN(I))GOTO 6030
      DLOC(I)=LOC
      IF(I.NE.6)GOTO 6027
C
C  THE PIRATE'S SPOTTED HIM.  HE LEAVES HIM ALONE ONCE WE'VE FOUND CHEST
C  K COUNTS IF A TREASURE IS HERE.  IF NOT, AND TALLY=TALLY2 PLUS ONE FO
C  AN UNSEEN CHEST, LET THE PIRATE BE SPOTTED.
C
      IF(LOC.EQ.CHLOC.OR.PROP(CHEST).GE.0)GOTO 6030
      K=0
      DO 6020 J=50,MAXTRS
C  PIRATE WON'T TAKE PYRAMID FROM PLOVER ROOM OR DARK ROOM (TOO EASY!).
      IF(J.EQ.PYRAM.AND.(LOC.EQ.PLAC(PYRAM)
     &.OR.LOC.EQ.PLAC(EMRALD)))GOTO 6020
      IF(TOTING(J))GOTO 6022
 6020 IF(HERE(J))K=1
      IF(TALLY.EQ.TALLY2+1.AND.K.EQ.0.AND.PLACE(CHEST).EQ.0
     &.AND.HERE(LAMP).AND.PROP(LAMP).EQ.1)GOTO 6025
      IF(ODLOC(6).NE.DLOC(6).AND.PCT(20))CALL RSPEAK(127)
      GOTO 6030
C
 6022 CALL RSPEAK(128)
C  DON'T STEAL CHEST BACK FROM TROLL!
      IF(PLACE(MESSAG).EQ.0)CALL MOVE(CHEST,CHLOC)
      CALL MOVE(MESSAG,CHLOC2)
      DO 6023 J=50,MAXTRS
      IF(J.EQ.PYRAM.AND.(LOC.EQ.PLAC(PYRAM)
     &.OR.LOC.EQ.PLAC(EMRALD)))GOTO 6023
      IF(AT(J).AND.FIXED(J).EQ.0)CALL CARRY(J,LOC)
      IF(TOTING(J))CALL DROP(J,CHLOC)
 6023 CONTINUE
 6024 DLOC(6)=CHLOC
      ODLOC(6)=CHLOC
      DSEEN(6)=.FALSE.
      GOTO 6030
C
 6025 CALL RSPEAK(186)
      CALL MOVE(CHEST,CHLOC)
      CALL MOVE(MESSAG,CHLOC2)
      GOTO 6024
C
C  THIS THREATENING LITTLE DWARF IS IN THE ROOM WITH HIM!
C
 6027 DTOTAL=DTOTAL+1
      IF(ODLOC(I).NE.DLOC(I))GOTO 6030
      ATTACK=ATTACK+1
      IF(KNFLOC.GE.0)KNFLOC=LOC
      IF(RND(1000).LT.95*(DFLAG-2))STICK=STICK+1
 6030 CONTINUE
C
C  NOW WE KNOW WHAT'S HAPPENING.  LET'S TELL THE POOR SUCKER ABOUT IT.
C
      IF(DTOTAL.EQ.0)GOTO 2000
      IF(DTOTAL.EQ.1)GOTO 75
      WRITE(*,67) DTOTAL
   67 FORMAT(/,' There are ',I1,' threatening little dwarves in the'
     &,' room with you.')
      GOTO 77
   75 CALL RSPEAK(4)
   77 IF(ATTACK.EQ.0)GOTO 2000
      IF(DFLAG.EQ.2)DFLAG=3
      IF(ATTACK.EQ.1)GOTO 79
      WRITE(*,78) ATTACK
   78 FORMAT(/,' ',I1,' of them throw knives at you!')
      K=6
   82 IF(STICK.GT.1)GOTO 83
      CALL RSPEAK(K+STICK)
      IF(STICK.EQ.0)GOTO 2000
      GOTO 84
   83 WRITE(*,68) STICK
   68 FORMAT(/,' ',I1,' of them get you!')
   84 OLDLC2=LOC
      GOTO 99
C
   79 CALL RSPEAK(5)
      K=52
      GOTO 82
C  DESCRIBE THE CURRENT LOCATION AND (MAYBE) GET NEXT COMMAND.
C
C  PRINT TEXT FOR CURRENT LOC.
C
 2000 IF(LOC.EQ.0)GOTO 99
      KK=STEXT(LOC)
      KENT=0
      IF (ABBNUM.NE.0) KENT=MOD(ABB(LOC),ABBNUM)
      IF (KENT.EQ.0.OR.KK.EQ.0) KK=LTEXT(LOC)
      IF(FORCED(LOC).OR..NOT.DARK(HERE(LAMP)))GOTO 2001
      IF(WZDARK.AND.PCT(35))GOTO 90
      KK=RTEXT(16)
 2001 IF(TOTING(BEAR))CALL RSPEAK(141)
      CALL SPEAK(KK)
      K=1
      IF(FORCED(LOC))GOTO 8
      IF(LOC.EQ.33.AND.PCT(25).AND..NOT.CLOSNG)CALL RSPEAK(8)
C
C  PRINT OUT DESCRIPTIONS OF OBJECTS AT THIS LOCATION.  IF NOT CLOSING A
C  PROPERTY VALUE IS NEGATIVE, TALLY OFF ANOTHER TREASURE.  RUG IS SPECI
C  CASE; ONCE SEEN, ITS PROP IS 1 (DRAGON ON IT) TILL DRAGON IS KILLED.
C  SIMILARLY FOR CHAIN; PROP IS INITIALLY 1 (LOCKED TO BEAR).  THESE HAC
C  ARE BECAUSE PROP=0 IS NEEDED TO GET FULL SCORE.
C
      IF(DARK(HERE(LAMP)))GOTO 2012
      ABB(LOC)=ABB(LOC)+1
      I=ATLOC(LOC)
 2004 IF(I.EQ.0)GOTO 2012
      OBJ=I
      IF(OBJ.GT.100)OBJ=OBJ-100
      IF(OBJ.EQ.STEPS.AND.TOTING(NUGGET))GOTO 2008
      IF(PROP(OBJ).GE.0)GOTO 2006
      IF(CLOSED)GOTO 2008
      PROP(OBJ)=0
      IF(OBJ.EQ.RUG.OR.OBJ.EQ.CHAIN)PROP(OBJ)=1
      TALLY=TALLY-1
C  IF REMAINING TREASURES TOO ELUSIVE, ZAP HIS LAMP.
      IF(TALLY.EQ.TALLY2.AND.TALLY.NE.0)LIMIT=MIN0(35,LIMIT)
 2006 KK=PROP(OBJ)
      IF(OBJ.EQ.STEPS.AND.LOC.EQ.FIXED(STEPS))KK=1
      BLKLIN=.FALSE.
      CALL PSPEAK(OBJ,KK)
      BLKLIN=.TRUE.
 2008 I=LINK(I)
      GOTO 2004
C
 2009 K=54
 2010 SPK=K
 2011 CALL RSPEAK(SPK)
C
 2012 VERB=0
      OBJ=0
C
C  CHECK IF THIS LOC IS ELIGIBLE FOR ANY HINTS.  IF BEEN HERE LONG ENOUG
C  BRANCH TO HELP SECTION (ON LATER PAGE).  HINTS ALL COME BACK HERE EVE
C  TO FINISH THE LOOP.  IGNORE "HINTS" < 4 (SPECIAL STUFF, SEE DATABASE
C
 2600 DO 2602 HINT=4,HNTMAX
      IF(HINTED(HINT))GOTO 2602
      IF(.NOT.BITSET(LOC,HINT))HINTLC(HINT)=-1
      HINTLC(HINT)=HINTLC(HINT)+1
      IF(HINTLC(HINT).GE.HINTS(HINT,1))GOTO 40000
 2602 CONTINUE
 2603 CONTINUE
C
C  KICK THE RANDOM NUMBER GENERATOR JUST TO ADD VARIETY TO THE CHASE.  A
C  IF CLOSING TIME, CHECK FOR ANY OBJECTS BEING TOTED WITH PROP < 0 AND
C  THE PROP TO -1-PROP.  THIS WAY OBJECTS WON'T BE DESCRIBED UNTIL THEY'
C  BEEN PICKED UP AND PUT DOWN SEPARATE FROM THEIR RESPECTIVE PILES.  DO
C  TICK CLOCK1 UNLESS WELL INTO CAVE (AND NOT AT Y2).
C
      IF(.NOT.CLOSED)GOTO 2605
      IF(PROP(OYSTER).LT.0.AND.TOTING(OYSTER))
     &CALL PSPEAK(OYSTER,1)
      DO 2604 I=1,100
 2604 IF(TOTING(I).AND.PROP(I).LT.0)PROP(I)=-1-PROP(I)
 2605 WZDARK=DARK(HERE(LAMP))
      IF(KNFLOC.GT.0.AND.KNFLOC.NE.LOC)KNFLOC=0
      I=RND(1)
      CALL GETIN(WD1,WD1X,WD2,WD2X)
C
C  EVERY INPUT, CHECK "FOOBAR" FLAG.  IF ZERO, NOTHING'S GOING ON.  IF P
C  MAKE NEG.  IF NEG, HE SKIPPED A WORD, SO MAKE IT ZERO.
C
 2608 FOOBAR=MIN0(0,-FOOBAR)
      TURNS=TURNS+1
C     IF(VERB.EQ.SAY.AND.WD2.NE.0)VERB=0
C     IF(VERB.EQ.SAY)GOTO 4090
      IF(TALLY.EQ.0.AND.LOC.GE.15.AND.LOC.NE.33)CLOCK1=CLOCK1-1
      IF(CLOCK1.EQ.0)GOTO 10000
      IF(CLOCK1.LT.0)CLOCK2=CLOCK2-1
      IF(CLOCK2.EQ.0)GOTO 11000
      IF(PROP(LAMP).EQ.1)LIMIT=LIMIT-1
      IF(LIMIT.LE.30.AND.HERE(BATTER).AND.PROP(BATTER).EQ.0
     &.AND.HERE(LAMP))GOTO 12000
      IF(LIMIT.EQ.0)GOTO 12400
      IF(LIMIT.LT.0.AND.LOC.LE.8)GOTO 12600
      IF(LIMIT.LE.30)GOTO 12200
19999 K=43
      IF(LIQLOC(LOC).EQ.WATER)K=70
C
C  DO PRELIMINARY ANALYSIS OF SENTENCE TO FIND CERTAIN SPECIAL
C  CASES, VIZ,
C
C  ENTER <WATER,STREAM>
C  ENTER <LOCATION>
C  <WATER,OIL> <PLANT,DOOR>
C
      CALL VOCAB(WD1,-1,I)
      CALL VOCAB(WD2,-1,J)
      IF(WD1.NE.CENTE ) GO TO 2609
      IF(J .EQ. (WATER+1000)
     &.OR. J .EQ. STREAM) GO TO 2010
      IF(WD2 .NE. 0) GO TO 2800
 2609 IF((I .NE. (WATER+1000) .AND. I .NE. (OIL+1000))
     &.OR. (J .NE. (PLANT+1000) .AND. J .NE. (DOOR+1000)))
     &GO TO 2610
      WD2=CPOUR
 2610 IF(WD1 .EQ. CWEST .AND. PCT(10))
     &CALL RSPEAK(17)
 2630 CALL VOCAB(WD1,-1,I)
      IF(I.EQ.-1)GOTO 3000
      K=MOD(I,1000)
      KQ=I/1000+1
      GOTO (8,5000,4000,2010),KQ
      CALL BUG(22)
C
C  GET SECOND WORD FOR ANALYSIS.
C
 2800 WD1=WD2
      WD1X=WD2X
      WD2=0
      GOTO 2610
C
C  GEE, I DON'T UNDERSTAND.
C
 3000 SPK=60
      IF(PCT(20))SPK=61
      IF(PCT(20))SPK=13
      CALL RSPEAK(SPK)
      GOTO 2600
C
C  ANALYSE A VERB.  REMEMBER WHAT IT WAS, GO BACK FOR OBJECT IF SECOND W
C  UNLESS VERB IS "SAY", WHICH SNARFS ARBITRARY SECOND WORD.
C
4000  VERB=K
      SPK=ACTSPK(VERB)
      IF(WD2.NE.0.AND.VERB.NE.SAY)GOTO 2800
      IF(VERB.EQ.SAY)OBJ=WD2
      IF(OBJ.NE.0)GOTO 4090
C 
C  ANALYSE AN INTRANSITIVE VERB (IE, NO OBJECT GIVEN YET).
C 
 4080  GOTO(8010,8000,8000,8040,2009,8040,9070,9080,8000,8000,
     &     2011,9120,9130,8140,9150,8000,8000,8180,8000,8200,
     &     8000,9220,9230,8240,8250,8260,8270,8000,8000,8300,
     &     8310,8320),VERB
C          TAKE DROP  SAY OPEN NOTH LOCK   ON  OFF WAVE CALM
C          WALK KILL POUR  EAT DRNK  RUB TOSS QUIT FIND INVN
C          FEED FILL BLST SCOR  FOO  BRF READ BREK WAKE SUSP
C          HOUR RESU
      CALL BUG(23)
C 
C  ANALYSE A TRANSITIVE VERB.
C 
 4090  GOTO(9010,9020,9030,9040,2009,9040,9070,9080,9090,2011, 
     &     2011,9120,9130,9140,9150,9160,9170,2011,9190,9190,
     &     9210,9220,9230,2011,2011,2011,9270,9280,9290,2011,
     &     2011),VERB
C          TAKE DROP  SAY OPEN NOTH LOCK   ON  OFF WAVE CALM
C          WALK KILL POUR  EAT DRNK  RUB TOSS QUIT FIND INVN
C          FEED FILL BLST SCOR  FOO  BRF READ BREK WAKE SUSP
C          HOUR
      CALL BUG(24)
C
C  ANALYSE AN OBJECT WORD.  SEE IF THE THING IS HERE, WHETHER WE'VE GOT
C  YET, AND SO ON.  OBJECT MUST BE HERE UNLESS VERB IS "FIND" OR "INVENT
C  (AND NO NEW VERB YET TO BE ANALYSED).  WATER AND OIL ARE ALSO FUNNY,
C  THEY ARE NEVER ACTUALLY DROPPED AT ANY LOCATION, BUT MIGHT BE HERE IN
C  THE BOTTLE OR AS A FEATURE OF THE LOCATION.
C
 5000 OBJ=K
      IF(FIXED(K).NE.LOC.AND..NOT.HERE(K))GOTO 5100
 5010 IF(WD2.NE.0)GOTO 2800
      IF(VERB.NE.0)GOTO 4090
      WRITE (*,1113)
 1113 FORMAT (' What do you want to do with the ',\)
      CALL A5TOA1(WD1,WD1X,'?')
      GOTO 2600
C
 5100 IF(K.NE.GRATE)GOTO 5110
      IF(LOC.EQ.1.OR.LOC.EQ.4.OR.LOC.EQ.7)K=DPRSSN
      IF(LOC.GT.9.AND.LOC.LT.15)K=ENTRNC
      IF(K.NE.GRATE)GOTO 8
 5110 IF(K.NE.DWARF)GOTO 5120
      DO 5112 I=1,5
      IF(DLOC(I).EQ.LOC.AND.DFLAG.GE.2)GOTO 5010
 5112 CONTINUE
 5120 IF((LIQ(0).EQ.K.AND.HERE(BOTTLE)).OR.K.EQ.LIQLOC(LOC))GOTO 501
     &0
      IF(OBJ.NE.PLANT.OR..NOT.AT(PLANT2).OR.PROP(PLANT2).EQ.0)GOTO 5
     &130
      OBJ=PLANT2
      GOTO 5010
 5130 IF(OBJ.NE.KNIFE.OR.KNFLOC.NE.LOC)GOTO 5140
      KNFLOC=-1
      SPK=116
      GOTO 2011
 5140 IF(OBJ.NE.ROD.OR..NOT.HERE(ROD2))GOTO 5190
      OBJ=ROD2
      GOTO 5010
 5190 IF((VERB.EQ.FIND.OR.VERB.EQ.INVENT).AND.WD2.EQ.0)GOTO 5010
      WRITE (*,1114)
 1114 FORMAT (' I do not see any ',\)
      CALL A5TOA1(WD1,WD1X,'.')
      GOTO 2012
C  FIGURE OUT THE NEW LOCATION
C
C  GIVEN THE CURRENT LOCATION IN "LOC", AND A MOTION VERB NUMBER IN "K",
C  THE NEW LOCATION IN "NEWLOC".  THE CURRENT LOC IS SAVED IN "OLDLOC" I
C  HE WANTS TO RETREAT.  THE CURRENT OLDLOC IS SAVED IN OLDLC2, IN CASE
C  DIES.  (IF HE DOES, NEWLOC WILL BE LIMBO, AND OLDLOC WILL BE WHAT KIL
C  HIM, SO WE NEED OLDLC2, WHICH IS THE LAST PLACE HE WAS SAFE.)
C
    8 KK=KEY(LOC)
      NEWLOC=LOC
      IF(KK.EQ.0)CALL BUG(26)
      IF(K.EQ.NULL)GOTO 2
      IF(K.EQ.BACK)GOTO 20
      IF(K.EQ.LOOK)GOTO 30
      IF(K.EQ.CAVE)GOTO 40
      OLDLC2=OLDLOC
      OLDLOC=LOC
C
    9 LL=IABS(TRAVEL(KK))
      IF(LL.EQ.1 .OR. LL.EQ.K)GOTO 10
      IF(TRAVEL(KK).LT.0)GOTO 50
      KK=KK+1
      GOTO 9
C
   10 NEWLOC=TRVCON(KK)
      K=MOD(NEWLOC,100)
      IF(NEWLOC.LE.300)GOTO 13
      IF(PROP(K).NE.NEWLOC/100-3)GOTO 16
   12 IF(TRAVEL(KK).LT.0)CALL BUG(25)
      KK=KK+1
      GO TO 10
C
   13 IF(NEWLOC.LE.100)GOTO 14
      IF(TOTING(K).OR.(NEWLOC.GT.200.AND.AT(K)))GOTO 16
      GOTO 12
C
   14 IF(NEWLOC.NE.0.AND..NOT.PCT(NEWLOC))GOTO 12
   16 NEWLOC=TRVLOC(KK)
      IF(NEWLOC.LE.300)GOTO 2
      IF(NEWLOC.LE.500)GOTO 30000
      CALL RSPEAK(NEWLOC-500)
      NEWLOC=LOC
      GOTO 2
C
C  SPECIAL MOTIONS COME HERE.  LABELLING CONVENTION: STATEMENT NUMBERS N
C  (XX=00-99) ARE USED FOR SPECIAL CASE NUMBER NNN (NNN=301-500).
C
30000 NEWLOC=NEWLOC-300
      GOTO (30100,30200,30300),NEWLOC
      CALL BUG(20)
C
C  TRAVEL 301.  PLOVER-ALCOVE PASSAGE.  CAN CARRY ONLY EMERALD.  NOTE: T
C  TABLE MUST INCLUDE "USELESS" ENTRIES GOING THROUGH PASSAGE, WHICH CAN
C  BE USED FOR ACTUAL MOTION, BUT CAN BE SPOTTED BY "GO BACK".
C
30100 NEWLOC=99+100-LOC
      IF(HOLDNG.EQ.0.OR.(HOLDNG.EQ.1.AND.TOTING(EMRALD)))GOTO 2
      NEWLOC=LOC
      CALL RSPEAK(117)
      GOTO 2
C
C  TRAVEL 302.  PLOVER TRANSPORT.  DROP THE EMERALD (ONLY USE SPECIAL TR
C  TOTING IT), SO HE'S FORCED TO USE THE PLOVER-PASSAGE TO GET IT OUT.
C  DROPPED IT, GO BACK AND PRETEND HE WASN'T CARRYING IT AFTER ALL.
C
30200 CALL DROP(EMRALD,LOC)
      GOTO 12
C
C  TRAVEL 303.  TROLL BRIDGE.  MUST BE DONE ONLY AS SPECIAL MOTION SO TH
C  DWARVES WON'T WANDER ACROSS AND ENCOUNTER THE BEAR.  (THEY WON'T FOLL
C  PLAYER THERE BECAUSE THAT REGION IS FORBIDDEN TO THE PIRATE.)  IF
C  PROP(TROLL)=1, HE'S CROSSED SINCE PAYING, SO STEP OUT AND BLOCK HIM.
C  (STANDARD TRAVEL ENTRIES CHECK FOR PROP(TROLL)=0.)  SPECIAL STUFF FOR
C
30300 IF(PROP(TROLL).NE.1)GOTO 30310
      CALL PSPEAK(TROLL,1)
      PROP(TROLL)=0
      CALL MOVE(TROLL2,0)
      CALL MOVE(TROLL2+100,0)
      CALL MOVE(TROLL,PLAC(TROLL))
      CALL MOVE(TROLL+100,FIXD(TROLL))
      CALL JUGGLE(CHASM)
      NEWLOC=LOC
      GOTO 2
C
30310 NEWLOC=PLAC(TROLL)+FIXD(TROLL)-LOC
      IF(PROP(TROLL).EQ.0)PROP(TROLL)=1
      IF(.NOT.TOTING(BEAR))GOTO 2
      CALL RSPEAK(162)
      PROP(CHASM)=1
      PROP(TROLL)=2
      CALL DROP(BEAR,NEWLOC)
      FIXED(BEAR)=-1
      PROP(BEAR)=3
      IF(PROP(SPICES).LT.0)TALLY2=TALLY2+1
      OLDLC2=NEWLOC
      GOTO 99
C
C  END OF SPECIALS.
C
C  HANDLE "GO BACK".  LOOK FOR VERB WHICH GOES FROM LOC TO OLDLOC, OR TO
C  IF OLDLOC HAS FORCED-MOTION.  K2 SAVES ENTRY -> FORCED LOC -> PREVIOU
C
   20 K=OLDLOC
      IF(FORCED(K))K=OLDLC2
      OLDLC2=OLDLOC
      OLDLOC=LOC
      K2=0
      IF(K.NE.LOC)GOTO 21
      CALL RSPEAK(91)
      GOTO 2
C
   21 LL=TRVLOC(KK)
      IF(LL.EQ.K)GOTO 25
      IF(LL.GT.300)GOTO 22
      J=KEY(LL)
      IF(FORCED(LL).AND.TRVLOC(KK).EQ.K)K2=KK
   22 IF(TRAVEL(KK).LT.0)GOTO 23
      KK=KK+1
      GOTO 21
C
   23 KK=K2
      IF(KK.NE.0)GOTO 25
      CALL RSPEAK(140)
      GOTO 2
C
   25 K=IABS(TRAVEL(KK))
      KK=KEY(LOC)
      GOTO 9
C
C  LOOK.  CAN'T GIVE MORE DETAIL.  PRETEND IT WASN'T DARK (THOUGH IT MAY
C  BE DARK) SO HE WON'T FALL INTO A PIT WHILE STARING INTO THE GLOOM.
C
   30 IF(DETAIL.LT.3)CALL RSPEAK(15)
      DETAIL=DETAIL+1
      WZDARK=.FALSE.
      ABB(LOC)=0
      GOTO 2
C
C  CAVE.  DIFFERENT MESSAGES DEPENDING ON WHETHER ABOVE GROUND.
C
   40 IF(LOC.LT.8)CALL RSPEAK(57)
      IF(LOC.GE.8)CALL RSPEAK(58)
      GOTO 2
C
C  NON-APPLICABLE MOTION.  VARIOUS MESSAGES DEPENDING ON WORD GIVEN.
C
   50 SPK=12
      IF(K.GE.43.AND.K.LE.50)SPK=9
      IF(K.EQ.29.OR.K.EQ.30)SPK=9
      IF(K.EQ.7.OR.K.EQ.36.OR.K.EQ.37)SPK=10
      IF(K.EQ.11.OR.K.EQ.19)SPK=11
      IF(VERB.EQ.FIND.OR.VERB.EQ.INVENT)SPK=59
      IF(K.EQ.62.OR.K.EQ.65)SPK=42
      IF(K.EQ.17)SPK=80
      CALL RSPEAK(SPK)
      GOTO 2
C  "YOU'RE DEAD, JIM."
C
C  IF THE CURRENT LOC IS ZERO, IT MEANS THE CLOWN GOT HIMSELF KILLED.  W
C  ALLOW THIS MAXDIE TIMES.  MAXDIE IS AUTOMATICALLY SET BASED ON THE NU
C  SNIDE MESSAGES AVAILABLE.  EACH DEATH RESULTS IN A MESSAGE (81, 83, E
C  WHICH OFFERS REINCARNATION; IF ACCEPTED, THIS RESULTS IN MESSAGE 82,
C  ETC.  THE LAST TIME, IF HE WANTS ANOTHER CHANCE, HE GETS A SNIDE REMA
C  WE EXIT.  WHEN REINCARNATED, ALL OBJECTS BEING CARRIED GET DROPPED AT
C  (PRESUMABLY THE LAST PLACE PRIOR TO BEING KILLED) WITHOUT CHANGE OF P
C  THE LOOP RUNS BACKWARDS TO ASSURE THAT THE BIRD IS DROPPED BEFORE THE
C  (THIS KLUGE COULD BE CHANGED ONCE WE'RE SURE ALL REFERENCES TO BIRD A
C  ARE DONE BY KEYWORDS.)  THE LAMP IS A SPECIAL CASE (IT WOULDN'T DO TO
C  IT IN THE CAVE).  IT IS TURNED OFF AND LEFT OUTSIDE THE BUILDING (ONL
C  WAS CARRYING IT, OF COURSE).  HE HIMSELF IS LEFT INSIDE THE BUILDING
C  HEAVEN HELP HIM IF HE TRIES TO XYZZY BACK INTO THE CAVE WITHOUT THE L
C  OLDLOC IS ZAPPED SO HE CAN'T JUST "RETREAT".
C
C  THE EASIEST WAY TO GET KILLED IS TO FALL INTO A PIT IN PITCH DARKNESS
C
   90 CALL RSPEAK(23)
      OLDLC2=LOC
C
C  OKAY, HE'S DEAD.  LET'S GET ON WITH IT.
C
   99 IF(CLOSNG)GOTO 95
      YEA=YES(81+NUMDIE*2,82+NUMDIE*2,54)
      NUMDIE=NUMDIE+1
      IF(NUMDIE.EQ.MAXDIE.OR..NOT.YEA)GOTO 20000
      PLACE(WATER)=0
      PLACE(OIL)=0
      IF(TOTING(LAMP))PROP(LAMP)=0
      DO 98 J=1,100
      I=101-J
      IF(.NOT.TOTING(I))GOTO 98
      K=OLDLC2
      IF(I.EQ.LAMP)K=1
      CALL DROP(I,K)
   98 CONTINUE
      LOC=3
      OLDLOC=LOC
      GOTO 2000
C
C  HE DIED DURING CLOSING TIME.  NO RESURRECTION.  TALLY UP A DEATH AND
C
   95 CALL RSPEAK(131)
      NUMDIE=NUMDIE+1
      GOTO 20000
C
C
C 
C  ROUTINES FOR PERFORMING THE VARIOUS ACTION VERBS
C 
C  STATEMENT NUMBERS IN THIS SECTION ARE 8000 FOR INTRANSITIVE VERBS, 90
C  TRANSITIVE, PLUS TEN TIMES THE VERB NUMBER.  MANY INTRANSITIVE VERBS
C  TRANSITIVE CODE, AND SOME VERBS USE CODE FOR OTHER VERBS, AS NOTED BE
C 
C  RANDOM INTRANSITIVE VERBS COME HERE.  CLEAR OBJ JUST IN CASE (SEE "AT
C 
 8000  WRITE (*,1115)
 1115 FORMAT (' I do not understand that "',\)
      CALL A5TOA1(WD1,WD1X,'".')
      OBJ=0
      GOTO 2600
C 
C  CARRY, NO OBJECT GIVEN YET.  OK IF ONLY ONE OBJECT PRESENT.
C 
 8010  IF(ATLOC(LOC).EQ.0.OR.LINK(ATLOC(LOC)).NE.0)GOTO 8000
      DO 8012 I=1,5
      IF(DLOC(I).EQ.LOC.AND.DFLAG.GE.2)GOTO 8000
 8012  CONTINUE
      OBJ=ATLOC(LOC)
C 
C  CARRY AN OBJECT.  SPECIAL CASES FOR BIRD AND CAGE (IF BIRD IN CAGE, C
C  TAKE ONE WITHOUT THE OTHER.  LIQUIDS ALSO SPECIAL, SINCE THEY DEPEND
C  STATUS OF BOTTLE.  ALSO VARIOUS SIDE EFFECTS, ETC.
C 
 9010  IF(TOTING(OBJ))GOTO 2011
      SPK=25
      IF(OBJ.EQ.PLANT.AND.PROP(PLANT).LE.0)SPK=115
      IF(OBJ.EQ.BEAR.AND.PROP(BEAR).EQ.1)SPK=169
      IF(OBJ.EQ.CHAIN.AND.PROP(BEAR).NE.0)SPK=170
      IF(FIXED(OBJ).NE.0)GOTO 2011
      IF(OBJ.NE.WATER.AND.OBJ.NE.OIL)GOTO 9017
      IF(HERE(BOTTLE).AND.LIQ(0).EQ.OBJ)GOTO 9018
      OBJ=BOTTLE
      IF(TOTING(BOTTLE).AND.PROP(BOTTLE).EQ.1)GOTO 9220
      IF(PROP(BOTTLE).NE.1)SPK=105
      IF(.NOT.TOTING(BOTTLE))SPK=104
      GOTO 2011
 9018  OBJ=BOTTLE
 9017  IF(HOLDNG.LT.7)GOTO 9016
      CALL RSPEAK(92)
      GOTO 2012
 9016  IF(OBJ.NE.BIRD)GOTO 9014
      IF(PROP(BIRD).NE.0)GOTO 9014
      IF(.NOT.TOTING(ROD))GOTO 9013
      CALL RSPEAK(26)
      GOTO 2012
 9013  IF(TOTING(CAGE))GOTO 9015
      CALL RSPEAK(27)
      GOTO 2012
 9015  PROP(BIRD)=1
 9014  IF((OBJ.EQ.BIRD.OR.OBJ.EQ.CAGE).AND.PROP(BIRD).NE.0)
     &       CALL CARRY(BIRD+CAGE-OBJ,LOC)
      CALL CARRY(OBJ,LOC)
      K=LIQ(0)
      IF(OBJ.EQ.BOTTLE.AND.K.NE.0)PLACE(K)=-1
      GOTO 2009
C 
C  DISCARD OBJECT.  "THROW" ALSO COMES HERE FOR MOST OBJECTS.  SPECIAL C
C  BIRD (MIGHT ATTACK SNAKE OR DRAGON) AND CAGE (MIGHT CONTAIN BIRD) AND
C  DROP COINS AT VENDING MACHINE FOR EXTRA BATTERIES.
C 
 9020  IF(TOTING(ROD2).AND.OBJ.EQ.ROD.AND..NOT.TOTING(ROD))OBJ=ROD2
      IF(.NOT.TOTING(OBJ))GOTO 2011
      IF(OBJ.NE.BIRD.OR..NOT.HERE(SNAKE))GOTO 9024
      CALL RSPEAK(30)
      IF(CLOSED)GOTO 19000
      CALL DSTROY(SNAKE)
C  SET PROP FOR USE BY TRAVEL OPTIONS
      PROP(SNAKE)=1
 9021  K=LIQ(0)
      IF(K.EQ.OBJ)OBJ=BOTTLE
      IF(OBJ.EQ.BOTTLE.AND.K.NE.0)PLACE(K)=0
      IF(OBJ.EQ.CAGE.AND.PROP(BIRD).NE.0)CALL DROP(BIRD,LOC)
      IF(OBJ.EQ.BIRD)PROP(BIRD)=0
      CALL DROP(OBJ,LOC)
      GOTO 2012
C 
 9024  IF(OBJ.NE.COINS.OR..NOT.HERE(VEND))GOTO 9025
      CALL DSTROY(COINS)
      CALL DROP(BATTER,LOC)
      CALL PSPEAK(BATTER,0)
      GOTO 2012
C 
 9025  IF(OBJ.NE.BIRD.OR..NOT.AT(DRAGON).OR.PROP(DRAGON).NE.0)GOTO 9026
      CALL RSPEAK(154)
      CALL DSTROY(BIRD)
      PROP(BIRD)=0
      IF(PLACE(SNAKE).EQ.PLAC(SNAKE))TALLY2=TALLY2+1
      GOTO 2012
C 
 9026  IF(OBJ.NE.BEAR.OR..NOT.AT(TROLL))GOTO 9027
      CALL RSPEAK(163)
      CALL MOVE(TROLL,0)
      CALL MOVE(TROLL+100,0)
      CALL MOVE(TROLL2,PLAC(TROLL))
      CALL MOVE(TROLL2+100,FIXD(TROLL))
      CALL JUGGLE(CHASM)
      PROP(TROLL)=2
      GOTO 9021
C 
 9027  IF(OBJ.EQ.VASE.AND.LOC.NE.PLAC(PILLOW))GOTO 9028
      CALL RSPEAK(54)
      GOTO 9021
C 
 9028  PROP(VASE)=2
      IF(AT(PILLOW))PROP(VASE)=0
      CALL PSPEAK(VASE,PROP(VASE)+1)
      IF(PROP(VASE).NE.0)FIXED(VASE)=-1
      GOTO 9021
C 
C  SAY.  ECHO WD2 (OR WD1 IF NO WD2 (SAY WHAT?, ETC.).)  MAGIC WORDS OVE
C 
 9030  IF(WD2.EQ.0)GOTO 9031
      WD1=WD2
      WD1X=WD2X
 9031  CALL VOCAB(WD1,-1,I)
      IF(I.EQ.62.OR.I.EQ.65.OR.I.EQ.71.OR.I.EQ.2025)GOTO 9035
      WRITE (*,1116)
 1116 FORMAT (' Okay "',\)
      CALL A5TOA1(WD1,WD1X,'".')
      GOTO 2012
C 
 9035  WD2=0
      OBJ=0
      GOTO 2630 
C 
C  LOCK, UNLOCK, NO OBJECT GIVEN.  ASSUME VARIOUS THINGS IF PRESENT.
C 
 8040  SPK=28
      IF(HERE(CLAM))OBJ=CLAM
      IF(HERE(OYSTER))OBJ=OYSTER
      IF(AT(DOOR))OBJ=DOOR
      IF(AT(GRATE))OBJ=GRATE
      IF(OBJ.NE.0.AND.HERE(CHAIN))GOTO 8000
      IF(HERE(CHAIN))OBJ=CHAIN
      IF(OBJ.EQ.0)GOTO 2011
C 
C  LOCK, UNLOCK OBJECT.  SPECIAL STUFF FOR OPENING CLAM/OYSTER AND FOR C
C 
 9040  IF(OBJ.EQ.CLAM.OR.OBJ.EQ.OYSTER)GOTO 9046
      IF(OBJ.EQ.DOOR)SPK=111
      IF(OBJ.EQ.DOOR.AND.PROP(DOOR).EQ.1)SPK=54
      IF(OBJ.EQ.CAGE)SPK=32
      IF(OBJ.EQ.KEYS)SPK=55
      IF(OBJ.EQ.GRATE.OR.OBJ.EQ.CHAIN)SPK=31
      IF(SPK.NE.31.OR..NOT.HERE(KEYS))GOTO 2011
      IF(OBJ.EQ.CHAIN)GOTO 9048
      IF(.NOT.CLOSNG)GOTO 9043
      K=130
      IF(.NOT.PANIC)CLOCK2=15
      PANIC=.TRUE.
      GOTO 2010
C 
 9043  K=34+PROP(GRATE)
      PROP(GRATE)=1 
      IF(VERB.EQ.LOCK)PROP(GRATE)=0
      K=K+2*PROP(GRATE)
      GOTO 2010
C 
C  CLAM/OYSTER.
 9046  K=0
      IF(OBJ.EQ.OYSTER)K=1
      SPK=124+K
      IF(TOTING(OBJ))SPK=120+K
      IF(.NOT.TOTING(TRIDNT))SPK=122+K
      IF(VERB.EQ.LOCK)SPK=61
      IF(SPK.NE.124)GOTO 2011
      CALL DSTROY(CLAM)
      CALL DROP(OYSTER,LOC)
      CALL DROP(PEARL,105)
      GOTO 2011
C 
C  CHAIN.
 9048  IF(VERB.EQ.LOCK)GOTO 9049
      SPK=171
      IF(PROP(BEAR).EQ.0)SPK=41
      IF(PROP(CHAIN).EQ.0)SPK=37
      IF(SPK.NE.171)GOTO 2011
      PROP(CHAIN)=0
      FIXED(CHAIN)=0
      IF(PROP(BEAR).NE.3)PROP(BEAR)=2
      FIXED(BEAR)=2-PROP(BEAR)
      GOTO 2011
C 
 9049  SPK=172
      IF(PROP(CHAIN).NE.0)SPK=34
      IF(LOC.NE.PLAC(CHAIN))SPK=173
      IF(SPK.NE.172)GOTO 2011
      PROP(CHAIN)=2
      IF(TOTING(CHAIN))CALL DROP(CHAIN,LOC) 
      FIXED(CHAIN)=-1
      GOTO 2011
C 
C  LIGHT LAMP
C 
 9070  IF(.NOT.HERE(LAMP))GOTO 2011
      SPK=184
      IF(LIMIT.LT.0)GOTO 2011
      PROP(LAMP)=1
      CALL RSPEAK(39)
      IF(WZDARK)GOTO 2000
      GOTO 2012
C 
C  LAMP OFF
C 
 9080  IF(.NOT.HERE(LAMP))GOTO 2011
      PROP(LAMP)=0
      CALL RSPEAK(40)
      IF(DARK(HERE(LAMP)))CALL RSPEAK(16)
      GOTO 2012
C 
C  WAVE.  NO EFFECT UNLESS WAVING ROD AT FISSURE.
C 
 9090  IF((.NOT.TOTING(OBJ)).AND.(OBJ.NE.ROD.OR..NOT.TOTING(ROD2)))
     &       SPK=29
      IF(OBJ.NE.ROD.OR..NOT.AT(FISSUR).OR..NOT.TOTING(OBJ)
     &       .OR.CLOSNG)GOTO 2011
      PROP(FISSUR)=1-PROP(FISSUR)
      CALL PSPEAK(FISSUR,2-PROP(FISSUR))
      GOTO 2012
C 
C  ATTACK.  ASSUME TARGET IF UNAMBIGUOUS.  "THROW" ALSO LINKS HERE.  ATT
C  OBJECTS FALL INTO TWO CATEGORIES: ENEMIES (SNAKE, DWARF, ETC.)  AND O
C  (BIRD, CLAM).  AMBIGUOUS IF TWO ENEMIES, OR IF NO ENEMIES BUT TWO OTH
C 
 9120  DO 9121 I=1,5
      IF(DLOC(I).EQ.LOC.AND.DFLAG.GE.2)GOTO 9122
 9121  CONTINUE
      I=0
 9122  IF(OBJ.NE.0)GOTO 9124
      IF(I.NE.0)OBJ=DWARF
      IF(HERE(SNAKE))OBJ=OBJ*100+SNAKE
      IF(AT(DRAGON).AND.PROP(DRAGON).EQ.0)OBJ=OBJ*100+DRAGON
      IF(AT(TROLL))OBJ=OBJ*100+TROLL
      IF(HERE(BEAR).AND.PROP(BEAR).EQ.0)OBJ=OBJ*100+BEAR
      IF(OBJ.GT.100)GOTO 8000
      IF(OBJ.NE.0)GOTO 9124
C  CAN'T ATTACK BIRD BY THROWING AXE.
      IF(HERE(BIRD).AND.VERB.NE.THROW)OBJ=BIRD
C  CLAM AND OYSTER BOTH TREATED AS CLAM FOR INTRANSITIVE CASE; NO HARM D
      IF(HERE(CLAM).OR.HERE(OYSTER))OBJ=100*OBJ+CLAM
      IF(OBJ.GT.100)GOTO 8000
 9124  IF(OBJ.NE.BIRD)GOTO 9125
      SPK=137
      IF(CLOSED)GOTO 2011
      CALL DSTROY(BIRD)
      PROP(BIRD)=0
      IF(PLACE(SNAKE).EQ.PLAC(SNAKE))TALLY2=TALLY2+1
      SPK=45
 9125  IF(OBJ.EQ.0)SPK=44
      IF(OBJ.EQ.CLAM.OR.OBJ.EQ.OYSTER)SPK=150
      IF(OBJ.EQ.SNAKE)SPK=46
      IF(OBJ.EQ.DWARF)SPK=49
      IF(OBJ.EQ.DWARF.AND.CLOSED)GOTO 19000
      IF(OBJ.EQ.DRAGON)SPK=167
      IF(OBJ.EQ.TROLL)SPK=157
      IF(OBJ.EQ.BEAR)SPK=165+(PROP(BEAR)+1)/2
      IF(OBJ.NE.DRAGON.OR.PROP(DRAGON).NE.0)GOTO 2011
C  FUN STUFF FOR DRAGON.  IF HE INSISTS ON ATTACKING IT, WIN!  SET PROP
C  MOVE DRAGON TO CENTRAL LOC (STILL FIXED), MOVE RUG THERE (NOT FIXED),
C  MOVE HIM THERE, TOO.  THEN DO A NULL MOTION TO GET NEW DESCRIPTION.
      CALL RSPEAK(49)
      VERB=0
      OBJ=0
      CALL GETIN(WD1,WD1X,WD2,WD2X)
      IF(WD1.NE.CYES.AND.WD1.NE.CY)GOTO 2608
      CALL PSPEAK(DRAGON,1)
      PROP(DRAGON)=2
      PROP(RUG)=0
      K=(PLAC(DRAGON)+FIXD(DRAGON))/2
      CALL MOVE(DRAGON+100,-1)
      CALL MOVE(RUG+100,0)
      CALL MOVE(DRAGON,K) 
      CALL MOVE(RUG,K)
      DO 9126 OBJ=1,100
      IF(PLACE(OBJ).EQ.PLAC(DRAGON).OR.PLACE(OBJ).EQ.FIXD(DRAGON))
     &       CALL MOVE(OBJ,K)
 9126  CONTINUE
      LOC=K
      K=NULL
      GOTO 8
C 
C  POUR.  IF NO OBJECT, OR OBJECT IS BOTTLE, ASSUME CONTENTS OF BOTTLE.
C  SPECIAL TESTS FOR POURING WATER OR OIL ON PLANT OR RUSTY DOOR.
C 
 9130  IF(OBJ.EQ.BOTTLE.OR.OBJ.EQ.0)OBJ=LIQ(0)
      IF(OBJ.EQ.0)GOTO 8000
      IF(.NOT.TOTING(OBJ))GOTO 2011
      SPK=78
      IF(OBJ.NE.OIL.AND.OBJ.NE.WATER)GOTO 2011
      PROP(BOTTLE)=1
      PLACE(OBJ)=0
      SPK=77
      IF(.NOT.(AT(PLANT).OR.AT(DOOR)))GOTO 2011
C 
      IF(AT(DOOR))GOTO 9132
      SPK=112
      IF(OBJ.NE.WATER)GOTO 2011
      CALL PSPEAK(PLANT,PROP(PLANT)+1)
      PROP(PLANT)=MOD(PROP(PLANT)+2,6)
      PROP(PLANT2)=PROP(PLANT)/2
      K=NULL
      GOTO 8 
C 
 9132  PROP(DOOR)=0
      IF(OBJ.EQ.OIL)PROP(DOOR)=1
      SPK=113+PROP(DOOR)
      GOTO 2011
C 
C  EAT.  INTRANSITIVE: ASSUME FOOD IF PRESENT, ELSE ASK WHAT.  TRANSITIV
C  OK, SOME THINGS LOSE APPETITE, REST ARE RIDICULOUS.
C 
 8140  IF(.NOT.HERE(FOOD))GOTO 8000
 8142  CALL DSTROY(FOOD)
      SPK=72
      GOTO 2011
C 
 9140  IF(OBJ.EQ.FOOD)GOTO 8142
      IF(OBJ.EQ.BIRD.OR.OBJ.EQ.SNAKE.OR.OBJ.EQ.CLAM.OR.OBJ.EQ.OYSTER
     &       .OR.OBJ.EQ.DWARF.OR.OBJ.EQ.DRAGON.OR.OBJ.EQ.TROLL
     &       .OR.OBJ.EQ.BEAR)SPK=71
      GOTO 2011
C 
C  DRINK.  IF NO OBJECT, ASSUME WATER AND LOOK FOR IT HERE.  IF WATER IS
C  THE BOTTLE, DRINK THAT, ELSE MUST BE AT A WATER LOC, SO DRINK STREAM.
C 
 9150  IF(OBJ.EQ.0.AND.LIQLOC(LOC).NE.WATER.AND.(LIQ(0).NE.WATER
     &       .OR..NOT.HERE(BOTTLE)))GOTO 8000
      IF(OBJ.NE.0.AND.OBJ.NE.WATER)SPK=110
      IF(SPK.EQ.110.OR.LIQ(0).NE.WATER.OR..NOT.HERE(BOTTLE))GOTO 2011
      PROP(BOTTLE)=1
      PLACE(WATER)=0
      SPK=74
      GOTO 2011
C 
C  RUB.  YIELDS VARIOUS SNIDE REMARKS.
C 
 9160  IF(OBJ.NE.LAMP)SPK=76
      GOTO 2011
C 
C  THROW.  SAME AS DISCARD UNLESS AXE.  THEN SAME AS ATTACK EXCEPT IGNOR
C  AND IF DWARF IS PRESENT THEN ONE MIGHT BE KILLED.  (ONLY WAY TO DO SO
C  AXE ALSO SPECIAL FOR DRAGON, BEAR, AND TROLL.  TREASURES SPECIAL FOR
C 
 9170  IF(TOTING(ROD2).AND.OBJ.EQ.ROD.AND..NOT.TOTING(ROD))OBJ=ROD2
      IF(.NOT.TOTING(OBJ))GOTO 2011
      IF(OBJ.GE.50.AND.OBJ.LE.MAXTRS.AND.AT(TROLL))GOTO 9178
      IF(OBJ.EQ.FOOD.AND.HERE(BEAR))GOTO 9177
      IF(OBJ.NE.AXE)GOTO 9020
      DO 9171 I=1,5
C  NEEDN'T CHECK DFLAG IF AXE IS HERE.
      IF(DLOC(I).EQ.LOC)GOTO 9172
 9171  CONTINUE
      SPK=152
      IF(AT(DRAGON).AND.PROP(DRAGON).EQ.0)GOTO 9175
      SPK=158
      IF(AT(TROLL))GOTO 9175
      IF(HERE(BEAR).AND.PROP(BEAR).EQ.0)GOTO 9176 
      OBJ=0
      GOTO 9120
C 
 9172  SPK=48
      IF(RND(3).EQ.0)GOTO 9175
      DSEEN(I)=.FALSE.
      DLOC(I)=0
      SPK=47
      DKILL=DKILL+1
      IF(DKILL.EQ.1)SPK=149
 9175  CALL RSPEAK(SPK)
      CALL DROP(AXE,LOC)
      K=NULL
      GOTO 8
C 
C  THIS'LL TEACH HIM TO THROW THE AXE AT THE BEAR!
 9176  SPK=164
      CALL DROP(AXE,LOC)
      FIXED(AXE)=-1
      PROP(AXE)=1
      CALL JUGGLE(BEAR)
      GOTO 2011
C 
C  BUT THROWING FOOD IS ANOTHER STORY.
 9177  OBJ=BEAR
      GOTO 9210
C 
 9178  SPK=159
C  SNARF A TREASURE FOR THE TROLL.
      CALL DROP(OBJ,0)
      CALL MOVE(TROLL,0)
      CALL MOVE(TROLL+100,0)
      CALL DROP(TROLL2,PLAC(TROLL))
      CALL DROP(TROLL2+100,FIXD(TROLL))
      CALL JUGGLE(CHASM)
      GOTO 2011
C 
C  QUIT.  INTRANSITIVE ONLY.  VERIFY INTENT AND EXIT IF THAT'S WHAT HE W
C 
 8180  GAVEUP=YES(22,54,54)
 8185  IF(GAVEUP)GOTO 20000
      GOTO 2012
C 
C  FIND.  MIGHT BE CARRYING IT, OR IT MIGHT BE HERE.  ELSE GIVE CAVEAT.
C 
 9190  IF(AT(OBJ).OR.(LIQ(0).EQ.OBJ.AND.AT(BOTTLE))
     &       .OR.K.EQ.LIQLOC(LOC))SPK=94
      DO 9192 I=1,5
 9192  IF(DLOC(I).EQ.LOC.AND.DFLAG.GE.2.AND.OBJ.EQ.DWARF)SPK=94
      IF(CLOSED)SPK=138
      IF(TOTING(OBJ))SPK=24
      GOTO 2011
C 
C  INVENTORY.  IF OBJECT, TREAT SAME AS FIND.  ELSE REPORT ON CURRENT BU
C 
 8200  SPK=98
      DO 8201 I=1,100
      IF(I.EQ.BEAR.OR..NOT.TOTING(I))GOTO 8201
      IF(SPK.EQ.98)CALL RSPEAK(99)
      BLKLIN=.FALSE.
      CALL PSPEAK(I,-1)
      BLKLIN=.TRUE.
      SPK=0
 8201  CONTINUE
      IF(TOTING(BEAR))SPK=141
      GOTO 2011
C 
C  FEED.  IF BIRD, NO SEED.  SNAKE, DRAGON, TROLL: QUIP.  IF DWARF, MAKE
C  MAD.  BEAR, SPECIAL. 
C 
 9210  IF(OBJ.NE.BIRD)GOTO 9212
      SPK=100
      GOTO 2011
C 
 9212  IF(OBJ.NE.SNAKE.AND.OBJ.NE.DRAGON.AND.OBJ.NE.TROLL)GOTO 9213
      SPK=102
      IF(OBJ.EQ.DRAGON.AND.PROP(DRAGON).NE.0)SPK=110
      IF(OBJ.EQ.TROLL)SPK=182
      IF(OBJ.NE.SNAKE.OR.CLOSED.OR..NOT.HERE(BIRD))GOTO 2011
      SPK=101
      CALL DSTROY(BIRD)
      PROP(BIRD)=0
      TALLY2=TALLY2+1
      GOTO 2011
C 
 9213  IF(OBJ.NE.DWARF)GOTO 9214
      IF(.NOT.HERE(FOOD))GOTO 2011
      SPK=103
      DFLAG=DFLAG+1
      GOTO 2011
C 
 9214  IF(OBJ.NE.BEAR)GOTO 9215
      IF(PROP(BEAR).EQ.0)SPK=102
      IF(PROP(BEAR).EQ.3)SPK=110
      IF(.NOT.HERE(FOOD))GOTO 2011
      CALL DSTROY(FOOD)
      PROP(BEAR)=1
      FIXED(AXE)=0
      PROP(AXE)=0
      SPK=168
      GOTO 2011
C 
 9215  SPK=14
      GOTO 2011
C 
C  FILL.  BOTTLE MUST BE EMPTY, AND SOME LIQUID AVAILABLE.  (VASE IS NAS
C 
 9220  IF(OBJ.EQ.VASE)GOTO 9222
      IF(OBJ.NE.0.AND.OBJ.NE.BOTTLE)GOTO 2011
      IF(OBJ.EQ.0.AND..NOT.HERE(BOTTLE))GOTO 8000
      SPK=107
      IF(LIQLOC(LOC).EQ.0)SPK=106
      IF(LIQ(0).NE.0)SPK=105
      IF(SPK.NE.107)GOTO 2011
      PROP(BOTTLE)=MOD(COND(LOC),4)/2*2
      K=LIQ(0)
      IF(TOTING(BOTTLE))PLACE(K)=-1
      IF(K.EQ.OIL)SPK=108
      GOTO 2011
C 
 9222  SPK=29
      IF(LIQLOC(LOC).EQ.0)SPK=144
      IF(LIQLOC(LOC).EQ.0.OR..NOT.TOTING(VASE))GOTO 2011
      CALL RSPEAK(145)
      PROP(VASE)=2
      FIXED(VASE)=-1
      GOTO 9024
C 
C  BLAST.  NO EFFECT UNLESS YOU'VE GOT DYNAMITE, WHICH IS A NEAT TRICK!
C 
 9230  IF(PROP(ROD2).LT.0.OR..NOT.CLOSED)GOTO 2011
      BONUS=133
      IF(LOC.EQ.115)BONUS=134
      IF(HERE(ROD2))BONUS=135
      CALL RSPEAK(BONUS)
      GOTO 20000
C 
C  SCORE.  GO TO SCORING SECTION, WHICH WILL RETURN TO 8241 IF SCORNG IS
C 
 8240  SCORNG=.TRUE.
      GOTO 20000
C 
 8241  SCORNG=.FALSE.
      WRITE(*,8243) SCORE,MXSCOR
 8243  FORMAT(' If you were to quit now you would score',I4
     &       ,' out of a possible',I4,'.')
      GOTO 2012
C 
C  FEE FIE FOE FOO (AND FUM).  ADVANCE TO NEXT STATE IF GIVEN IN PROPER
C  LOOK UP WD1 IN SECTION 3 OF VOCAB TO DETERMINE WHICH WORD WE'VE GOT.
C  WORD ZIPS THE EGGS BACK TO THE GIANT ROOM (UNLESS ALREADY THERE).
C 
 8250  CALL VOCAB(WD1,3,K)
      SPK=42
      IF(FOOBAR.EQ.1-K)GOTO 8252
      IF(FOOBAR.NE.0)SPK=151
      GOTO 2011
C 
 8252  FOOBAR=K
      IF(K.NE.4)GOTO 2009
      FOOBAR=0
      IF(PLACE(EGGS).EQ.PLAC(EGGS)
     &       .OR.(TOTING(EGGS).AND.LOC.EQ.PLAC(EGGS)))GOTO 2011
C  BRING BACK TROLL IF WE STEAL THE EGGS BACK FROM HIM BEFORE CROSSING. 
      IF(PLACE(EGGS).EQ.0.AND.PLACE(TROLL).EQ.0.AND.PROP(TROLL).EQ.0)
     &       PROP(TROLL)=1
      K=2
      IF(HERE(EGGS))K=1
      IF(LOC.EQ.PLAC(EGGS))K=0
      CALL MOVE(EGGS,PLAC(EGGS))
      CALL PSPEAK(EGGS,K)
      GOTO 2012
C 
C  BRIEF.  INTRANSITIVE ONLY.  SUPPRESS LONG DESCRIPTIONS AFTER FIRST TI
C 
 8260  SPK=156
      ABBNUM=10000
      DETAIL=3
      GOTO 2011
C 
C  READ.  MAGAZINES IN DWARVISH, MESSAGE WE'VE SEEN, AND . . . OYSTER?
C 
 8270  IF(HERE(MAGZIN))OBJ=MAGZIN
      IF(HERE(TABLET))OBJ=OBJ*100+TABLET
      IF(HERE(MESSAG))OBJ=OBJ*100+MESSAG
      IF(CLOSED.AND.TOTING(OYSTER))OBJ=OYSTER
      IF(OBJ.GT.100.OR.OBJ.EQ.0.OR.DARK(HERE(LAMP)))GOTO 8000
C 
 9270  IF(DARK(HERE(LAMP)))GOTO 5190
      IF(OBJ.EQ.MAGZIN)SPK=190
      IF(OBJ.EQ.TABLET)SPK=196
      IF(OBJ.EQ.MESSAG)SPK=191
      IF(OBJ.EQ.OYSTER.AND.HINTED(2).AND.TOTING(OYSTER))SPK=194 
      IF(OBJ.NE.OYSTER.OR.HINTED(2).OR..NOT.TOTING(OYSTER)
     &       .OR..NOT.CLOSED)GOTO 2011
      HINTED(2)=YES(192,193,54)
      GOTO 2012
C 
C  BREAK.  ONLY WORKS FOR MIRROR IN REPOSITORY AND, OF COURSE, THE VASE.
C 
 9280  IF(OBJ.EQ.MIRROR)SPK=148
      IF(OBJ.EQ.VASE.AND.PROP(VASE).EQ.0)GOTO 9282
      IF(OBJ.NE.MIRROR.OR..NOT.CLOSED)GOTO 2011
      CALL RSPEAK(197)
      GOTO 19000
C 
 9282  SPK=198
      IF(TOTING(VASE))CALL DROP(VASE,LOC)
      PROP(VASE)=2
      FIXED(VASE)=-1
      GOTO 2011
C 
C  WAKE.  ONLY USE IS TO DISTURB THE DWARVES.
C 
 9290  IF(OBJ.NE.DWARF.OR..NOT.CLOSED)GOTO 2011
      CALL RSPEAK(199)
      GOTO 19000
C 
C SUSPEND.  CANT IN THIS VERSION. OH YES WE CAN, KEVIN!!!!!!!!!
C NOTE WE DECREMENT TURNS BEFORE THE SAVE SO THAT THE SAVE AND THE
C RESTORE DO NOT GET COUNTED AS A "GO"
C
C 8300  CALL RSPEAK(201)
8300  TURNS=TURNS-1
      CALL SAVE
      GOTO 2012
C
C RESUME, RESTART A SAVED GAME, AND HERE IS THE COUNTER PART TO SAVE,
C KEVIN!!!!!!!
C
8320  CALL RESUME
      DETAIL=DETAIL+1
      WZDARK=.FALSE.
      ABB(LOC)=0
      GOTO 2
C 
C HOURS.  NONE IN THIS VERSION
C 
 8310  CALL RSPEAK(202)
      GOTO 2012
C  HINTS
C 
C  COME HERE IF HE'S BEEN LONG ENOUGH AT REQUIRED LOC(S) FOR SOME UNUSED
C  HINT NUMBER IS IN VARIABLE "HINT".  BRANCH TO QUICK TEST FOR ADDITION
C  CONDITIONS, THEN COME BACK TO DO NEAT STUFF.  GOTO 40010 IF CONDITION
C  MET AND WE WANT TO OFFER THE HINT.  GOTO 40020 TO CLEAR HINTLC BACK T
C  40030 TO TAKE NO ACTION YET.
C 
40000 DEST2=HINT-3
      GOTO (40400,40500,40600,40700,40800,40900),DEST2
C           CAVE  BIRD  SNAKE MAZE  DARK  WITT
      CALL BUG(27)
C 
40010 HINTLC(HINT)=0
      IF(.NOT.YES(HINTS(HINT,3),0,54))GOTO 2603
      WRITE(*,40012) HINTS(HINT,2)
40012 FORMAT(/,
     *' I am prepared to give you a hint, but it will cost you',
     &       I2,' points.')
      HINTED(HINT)=YES(175,HINTS(HINT,4),54)
      IF(HINTED(HINT).AND.LIMIT.GT.30)LIMIT=LIMIT+30*HINTS(HINT,2)
40020 HINTLC(HINT)=0
40030 GOTO 2603
C 
C  NOW FOR THE QUICK TESTS.  SEE DATABASE DESCRIPTION FOR ONE-LINE NOTES
C 
40400 IF(PROP(GRATE).EQ.0.AND..NOT.HERE(KEYS))GOTO 40010
      GOTO 40020
C 
40500 IF(HERE(BIRD).AND.TOTING(ROD).AND.OBJ.EQ.BIRD)GOTO 40010
      GOTO 40030
C 
40600 IF(HERE(SNAKE).AND..NOT.HERE(BIRD))GOTO 40010
      GOTO 40020
C 
40700 IF(ATLOC(LOC).EQ.0.AND.ATLOC(OLDLOC).EQ.0
     &       .AND.ATLOC(OLDLC2).EQ.0.AND.HOLDNG.GT.1)GOTO 40010
      GOTO 40020
C 
40800 IF(PROP(EMRALD).NE.-1.AND.PROP(PYRAM).EQ.-1)GOTO 40010
      GOTO 40020
C 
40900 GOTO 40010
C  CAVE CLOSING AND SCORING
C 
C 
C  THESE SECTIONS HANDLE THE CLOSING OF THE CAVE.  THE CAVE CLOSES "CLOC
C  TURNS AFTER THE LAST TREASURE HAS BEEN LOCATED (INCLUDING THE PIRATE'
C  CHEST, WHICH MAY OF COURSE NEVER SHOW UP).  NOTE THAT THE TREASURES N
C  HAVE BEEN TAKEN YET, JUST LOCATED.  HENCE CLOCK1 MUST BE LARGE ENOUGH
C  OUT OF THE CAVE (IT ONLY TICKS WHILE INSIDE THE CAVE).  WHEN IT HITS
C  WE BRANCH TO 10000 TO START CLOSING THE CAVE, AND THEN SIT BACK AND W
C  HIM TO TRY TO GET OUT.  IF HE DOESN'T WITHIN CLOCK2 TURNS, WE CLOSE T
C  CAVE; IF HE DOES TRY, WE ASSUME HE PANICS, AND GIVE HIM A FEW ADDITIO
C  TURNS TO GET FRANTIC BEFORE WE CLOSE.  WHEN CLOCK2 HITS ZERO, WE BRAN
C  11000 TO TRANSPORT HIM INTO THE FINAL PUZZLE.  NOTE THAT THE PUZZLE D
C  UPON ALL SORTS OF RANDOM THINGS.  FOR INSTANCE, THERE MUST BE NO WATE
C  OIL, SINCE THERE ARE BEANSTALKS WHICH WE DON'T WANT TO BE ABLE TO WAT
C  SINCE THE CODE CAN'T HANDLE IT.  ALSO, WE CAN HAVE NO KEYS, SINCE THE
C  GRATE (HAVING MOVED THE FIXED OBJECT!) THERE SEPARATING HIM FROM ALL
C  TREASURES.  MOST OF THESE PROBLEMS ARISE FROM THE USE OF NEGATIVE PRO
C  NUMBERS TO SUPPRESS THE OBJECT DESCRIPTIONS UNTIL HE'S ACTUALLY MOVED
C  OBJECTS.
C 
C  WHEN THE FIRST WARNING COMES, WE LOCK THE GRATE, DESTROY THE BRIDGE,
C  ALL THE DWARVES (AND THE PIRATE), REMOVE THE TROLL AND BEAR (UNLESS D
C  AND SET "CLOSNG" TO TRUE.  LEAVE THE DRAGON; TOO MUCH TROUBLE TO MOVE
C  FROM NOW UNTIL CLOCK2 RUNS OUT, HE CANNOT UNLOCK THE GRATE, MOVE TO A
C  LOCATION OUTSIDE THE CAVE (LOC<9), OR CREATE THE BRIDGE.  NOR CAN HE
C  RESURRECTED IF HE DIES.  NOTE THAT THE SNAKE IS ALREADY GONE, SINCE H
C  TO THE TREASURE ACCESSIBLE ONLY VIA THE HALL OF THE MT. KING.  ALSO,
C  BEEN IN GIANT ROOM (TO GET EGGS), SO WE CAN REFER TO IT.  ALSO ALSO,
C  GOTTEN THE PEARL, SO WE KNOW THE BIVALVE IS AN OYSTER.  *AND*, THE DW
C  MUST HAVE BEEN ACTIVATED, SINCE WE'VE FOUND CHEST.
C 
10000 PROP(GRATE)=0
      PROP(FISSUR)=0
      DO 10010 I=1,6
      DSEEN(I)=.FALSE.
10010 DLOC(I)=0
      CALL MOVE(TROLL,0)
      CALL MOVE(TROLL+100,0)
      CALL MOVE(TROLL2,PLAC(TROLL))
      CALL MOVE(TROLL2+100,FIXD(TROLL))
      CALL JUGGLE(CHASM)
      IF(PROP(BEAR).NE.3)CALL DSTROY(BEAR)
      PROP(CHAIN)=0
      FIXED(CHAIN)=0
      PROP(AXE)=0
      FIXED(AXE)=0
      CALL RSPEAK(129)
      CLOCK1=-1
      CLOSNG=.TRUE.
      GOTO 19999
C 
C  ONCE HE'S PANICKED, AND CLOCK2 HAS RUN OUT, WE COME HERE TO SET UP TH
C  STORAGE ROOM.  THE ROOM HAS TWO LOCS, HARDWIRED AS 115 (NE) AND 116 (
C  AT THE NE END, WE PLACE EMPTY BOTTLES, A NURSERY OF PLANTS, A BED OF
C  OYSTERS, A PILE OF LAMPS, RODS WITH STARS, SLEEPING DWARVES, AND HIM.
C  THE SW END WE PLACE GRATE OVER TREASURES, SNAKE PIT, COVEY OF CAGED B
C  MORE RODS, AND PILLOWS.  A MIRROR STRETCHES ACROSS ONE WALL.  MANY OF
C  OBJECTS COME FROM KNOWN LOCATIONS AND/OR STATES (E.G. THE SNAKE IS KN
C  HAVE BEEN DESTROYED AND NEEDN'T BE CARRIED AWAY FROM ITS OLD "PLACE")
C  MAKING THE VARIOUS OBJECTS BE HANDLED DIFFERENTLY.  WE ALSO DROP ALL
C  OBJECTS HE MIGHT BE CARRYING (LEST HE HAVE SOME WHICH COULD CAUSE TRO
C  SUCH AS THE KEYS).  WE DESCRIBE THE FLASH OF LIGHT AND TRUNDLE BACK.
C 
11000 PROP(BOTTLE)=PUTTER(BOTTLE,115,1)
      PROP(PLANT)=PUTTER(PLANT,115,0) 
      PROP(OYSTER)=PUTTER(OYSTER,115,0)
      PROP(LAMP)=PUTTER(LAMP,115,0)
      PROP(ROD)=PUTTER(ROD,115,0)
      PROP(DWARF)=PUTTER(DWARF,115,0)
      LOC=115
      OLDLOC=115
      NEWLOC=115
C 
C  LEAVE THE GRATE WITH NORMAL (NON-NEGATIVE PROPERTY).
C 
      I=PUTTER(GRATE,116,0)
      PROP(SNAKE)=PUTTER(SNAKE,116,1)
      PROP(BIRD)=PUTTER(BIRD,116,1)
      PROP(CAGE)=PUTTER(CAGE,116,0)
      PROP(ROD2)=PUTTER(ROD2,116,0)
      PROP(PILLOW)=PUTTER(PILLOW,116,0)
C 
      PROP(MIRROR)=PUTTER(MIRROR,115,0)
      FIXED(MIRROR)=116
C 
      DO 11010 I=1,100
11010 IF(TOTING(I))CALL DSTROY(I)
C 
      CALL RSPEAK(132)
      CLOSED=.TRUE.
      GOTO 2
C 
C  ANOTHER WAY WE CAN FORCE AN END TO THINGS IS BY HAVING THE LAMP GIVE
C  WHEN IT GETS CLOSE, WE COME HERE TO WARN HIM.  WE GO TO 12000 IF THE
C  AND FRESH BATTERIES ARE HERE, IN WHICH CASE WE REPLACE THE BATTERIES 
C  CONTINUE.  12200 IS FOR OTHER CASES OF LAMP DYING.  12400 IS WHEN IT
C  OUT, AND 12600 IS IF HE'S WANDERED OUTSIDE AND THE LAMP IS USED UP, I
C  CASE WE FORCE HIM TO GIVE UP.
C 
12000 CALL RSPEAK(188)
      PROP(BATTER)=1
      IF(TOTING(BATTER))CALL DROP(BATTER,LOC)
      LIMIT=LIMIT+2500
      LMWARN=.FALSE.
      GOTO 19999
C 
12200 IF(LMWARN.OR..NOT.HERE(LAMP))GOTO 19999
      LMWARN=.TRUE.
      SPK=187
      IF(PLACE(BATTER).EQ.0)SPK=183
      IF(PROP(BATTER).EQ.1)SPK=189
      CALL RSPEAK(SPK)
      GOTO 19999
C 
12400 LIMIT=-1
      PROP(LAMP)=0
      IF(HERE(LAMP))CALL RSPEAK(184)
      GOTO 19999
C 
12600 CALL RSPEAK(185)
      GAVEUP=.TRUE.
      GOTO 20000
C 
C 
C  OH DEAR, HE'S DISTURBED THE DWARVES.
C 
19000 CALL RSPEAK(136)
C 
C  EXIT CODE.  WILL EVENTUALLY INCLUDE SCORING.  FOR NOW, HOWEVER, ...
C 
C  THE PRESENT SCORING ALGORITHM IS AS FOLLOWS:
C     OBJECTIVE:          POINTS:        PRESENT TOTAL POSSIBLE:
C  GETTING WELL INTO CAVE   25                    25
C  EACH TREASURE < CHEST    12                    60
C  TREASURE CHEST ITSELF    14                    14
C  EACH TREASURE > CHEST    16                   144
C  SURVIVING             (MAX-NUM)*10             30
C  NOT QUITTING              4                     4
C  REACHING "CLOSNG"        25                    25
C  "CLOSED": QUIT/KILLED    10
C            KLUTZED        25
C            WRONG WAY      30
C            SUCCESS        45                    45
C  CAME TO WITT'S END        1                     1
C  ROUND OUT THE TOTAL       2                     2
C                                       TOTAL:   350
C  (POINTS CAN ALSO BE DEDUCTED FOR USING HINTS.)
C 
20000 SCORE=0
      MXSCOR=0
C 
C  FIRST TALLY UP THE TREASURES.  MUST BE IN BUILDING AND NOT BROKEN. 
C  GIVE THE POOR GUY 2 POINTS JUST FOR FINDING EACH TREASURE.
C 
      DO 20010 I=50,MAXTRS
      IF(PTEXT(I).EQ.0)GOTO 20010
      K=12
      IF(I.EQ.CHEST)K=14
      IF(I.GT.CHEST)K=16
      IF(PROP(I).GE.0)SCORE=SCORE+2
      IF(PLACE(I).EQ.3.AND.PROP(I).EQ.0)SCORE=SCORE+K-2
      MXSCOR=MXSCOR+K
20010 CONTINUE
C 
C  NOW LOOK AT HOW HE FINISHED AND HOW FAR HE GOT.  MAXDIE AND NUMDIE TE
C  HOW WELL HE SURVIVED.  GAVEUP SAYS WHETHER HE EXITED VIA QUIT.  DFLAG
C  TELL US IF HE EVER GOT SUITABLY DEEP INTO THE CAVE.  CLOSNG STILL IND
C  WHETHER HE REACHED THE ENDGAME.  AND IF HE GOT AS FAR AS "CAVE CLOSED
C  (INDICATED BY "CLOSED"), THEN BONUS IS ZERO FOR MUNDANE EXITS OR 133,
C  135 IF HE BLEW IT (SO TO SPEAK).
C 
      SCORE=SCORE+(MAXDIE-NUMDIE)*10
      MXSCOR=MXSCOR+MAXDIE*10
      IF(.NOT.(SCORNG.OR.GAVEUP))SCORE=SCORE+4
      MXSCOR=MXSCOR+4
      IF(DFLAG.NE.0)SCORE=SCORE+25
      MXSCOR=MXSCOR+25
      IF(CLOSNG)SCORE=SCORE+25
      MXSCOR=MXSCOR+25
      IF(.NOT.CLOSED)GOTO 20020
      IF(BONUS.EQ.0)SCORE=SCORE+10
      IF(BONUS.EQ.135)SCORE=SCORE+25
      IF(BONUS.EQ.134)SCORE=SCORE+30
      IF(BONUS.EQ.133)SCORE=SCORE+45
20020 MXSCOR=MXSCOR+45
C 
C  DID HE COME TO WITT'S END AS HE SHOULD?
C 
      IF(PLACE(MAGZIN).EQ.108)SCORE=SCORE+1
      MXSCOR=MXSCOR+1
C 
C  ROUND IT OFF.
C 
      SCORE=SCORE+2
      MXSCOR=MXSCOR+2
C 
C  DEDUCT POINTS FOR HINTS.  HINTS < 4 ARE SPECIAL; SEE DATABASE DESCRIP
C 
      DO 20030 I=1,HNTMAX
20030 IF(HINTED(I))SCORE=SCORE-HINTS(I,2)
C 
C  RETURN TO SCORE COMMAND IF THAT'S WHERE WE CAME FROM.
C 
      IF(SCORNG)GOTO 8241
C 
C  THAT SHOULD BE GOOD ENOUGH.  LET'S TELL HIM ALL ABOUT IT.
C 
      WRITE(*,20100) SCORE,MXSCOR,TURNS
20100 FORMAT(/,' You scored',I4,' out of a possible',I4, 
     &       ', using',I6,' turns.')
C 
      DO 20200 I=1,CLSSES
      IF(CVAL(I).GE.SCORE)GOTO 20210
20200 CONTINUE
      WRITE(6,20202)
20202 FORMAT(/,' You just went off may scale!!',/)
      GOTO 25000
C 
20210 BLKLIN=.FALSE.
      CALL SPEAK(CTEXT(I))
      BLKLIN=.TRUE.
      IF(I.EQ.CLSSES-1)GOTO 20220
      K=CVAL(I)+1-SCORE
      IF(K.EQ.1)THEN
         WRITE(6,20215)
20215 FORMAT(' To achieve the next higher rating, you need only',
     *' one more point!')
      ELSE
         WRITE(6,20216) K
20216 FORMAT(' To achieve the next higher rating, you need',I3,
     &' more points.')
      ENDIF
      GOTO 25000
C 
20220 WRITE(6,20222)
20222 FORMAT(' To acheive the next higher rating ',
     &       'would be a neat trick!',/,/,' Congratulations!!',/)
C
C25000 CALL DELETE ('&ADVENTR')
25000 CONTINUE
      RETURN
C 
C 
      END
