home *** CD-ROM | disk | FTP | other *** search
/ Fatal Distractions! / fataldistractions.bin / chap01 / adventur / search.for < prev    next >
Text File  |  1990-11-18  |  31KB  |  985 lines

  1.       SUBROUTINE SEARCH(IRET)
  2. C
  3. C MODIFIED BY KENT BLACKETT
  4. C             ENGINEERING SYSTEMS GROUP
  5. C             DIGITAL EQUIPMENT CORP.
  6. C             15-JUL-77
  7. C ORIGINAL VERSION WAS FOR DECSYSTEM-10
  8. C THIS VERSION IS FOR FORTRAN IV-PLUS UNDER
  9. C THE IAS OPERATING SYSTEM ON THE PDP-11/70
  10. C NOTE THAT IT MUST BE COMPILED WITH THE
  11. C /WF:3/I4 SWITCHES...
  12. C
  13. C
  14. C  CURRENT LIMITS
  15. C       750 TRAVEL OPTIONS (TRAVEL, TRVSIZ).
  16. C       300 VOCABULARY WORDS (KTAB, ATAB, TABSIZ).
  17. C       150 LOCATIONS (LTEXT, STEXT, KEY, COND, ABB, ATLOC, LOCSIZ)
  18. C       100 OBJECTS (PLAC, PLACE, FIXD, FIXED, LINK (TWICE), PTEXT, PROP).
  19. C        35 "ACTION" VERBS (ACTSPK, VRBSIZ).
  20. C       205 RANDOM MESSAGES (RTEXT, TRXSIZ).
  21. C        12 DIFFERENT PLAYER CLASSIFICATIONS (CTEXT, CVAL, CLSMAX).
  22. C        20 HINTS, LESS 3 (HINTLC, HINTED, HINTS, HNTSIZ).
  23. C        35 MAGIC MESSAGES (MTEXT, MAGSIZ).
  24. C  THERE ARE ALSO LIMITS WHICH CANNOT BE EXCEEDED DUE TO THE STRUCTURE OF
  25. C  THE DATABASE.  (E.G., THE VOCABULARY USES N/1000 TO DETERMINE WORD TYPE,
  26. C  SO THERE CAN'T BE MORE THAN 1000 WORDS.)  THESE UPPER LIMITS ARE:
  27. C       1000 NON-SYNONYMOUS VOCABULARY WORDS
  28. C        300 LOCATIONS
  29. C        100 OBJECTS
  30. C
  31. C  INCLUDE DEFINED COMMONS
  32.       INCLUDE 'ADVCOM.COM'
  33.       INCLUDE 'NEWCOM.COM'
  34.       
  35. C
  36.       CHARACTER*1 TEXT(20)
  37.       LOGICAL PTIME
  38.       
  39.  
  40.       INCLUDE 'FUNCT.H'
  41.  
  42. C
  43. C
  44.       INCLUDE 'DATAB.H'
  45.       
  46. C
  47. C  DETERMINE PROCESSING TO BE PERFORMED.
  48. C
  49.       GOTO(2000,99)IRET
  50.       
  51. C
  52. C  DESCRIBE THE CURRENT LOCATION AND (MAYBE) GET NEXT COMMAND.
  53.  
  54. C  PRINT TEXT FOR CURRENT LOC.
  55.  
  56.  2000 IF(LOC.EQ.0) GOTO 99
  57.       KK=STEXT(LOC)
  58.       IF(ABBNUM.EQ.0) KENT=0
  59.       IF(ABBNUM.NE.0) KENT=MOD(ABB(LOC),ABBNUM)
  60.       IF(KENT.EQ.0.OR.KK.EQ.0) KK=LTEXT(LOC)
  61.       IF(FORCED(LOC).OR..NOT.DARK(0)) GOTO 2001
  62.       IF(WZDARK.AND.PCT(35)) GOTO 90
  63.       KK=RTEXT(16)
  64.  2001 IF(TOTING(BEAR)) CALL RSPEAK(141)
  65.       CALL SPEAK(KK)
  66.       K=1
  67.       IF(FORCED(LOC)) GOTO 8
  68.       IF(LOC.EQ.33.AND.PCT(25).AND..NOT.CLOSNG) CALL RSPEAK(8)
  69.       
  70. C  PRINT OUT DESCRIPTIONS OF OBJECTS AT THIS LOCATION.  IF NOT CLOSING AND
  71. C  PROPERTY VALUE IS NEGATIVE, TALLY OFF ANOTHER TREASURE.  RUG IS SPECIAL
  72. C  CASE; ONCE SEEN, ITS PROP IS 1 (DRAGON ON IT) TILL DRAGON IS KILLED.
  73. C  SIMILARLY FOR CHAIN; PROP IS INTIALLY 1 (LOCKED TO BEAR).  THESE HACKS
  74. C  ARE BECAUSE PROP=0 IS NEEDED TO GET FULL SCORE.
  75.  
  76.       IF(DARK(0)) GOTO 2012
  77.       ABB(LOC)=ABB(LOC)+1
  78.       I=ATLOC(LOC)
  79.  2004 IF(I.EQ.0) GOTO 2012
  80.       BLKLIN=.FALSE.
  81.       OBJ=I
  82.       IF(OBJ.GT.100) OBJ=OBJ-100
  83.       IF(OBJ.EQ.STEPS.AND.TOTING(NUGGET)) GOTO 2008
  84.       IF(PROP(OBJ).GE.0) GOTO 2006
  85.       IF(CLOSED) GOTO 2008
  86.       PROP(OBJ)=0
  87.       IF(OBJ.EQ.RUG.OR.OBJ.EQ.CHAIN) PROP(OBJ)=1
  88.       TALLY=TALLY-1
  89. C  IF REMAINING TREASURES TOO ELUSIVE, ZAP HIS LAMP.
  90.       IF(TALLY.EQ.TALLY2.AND.TALLY.NE.0) LIMIT=MIN0(35,LIMIT)
  91.  2006 KK=PROP(OBJ)
  92.       IF(OBJ.EQ.STEPS.AND.LOC.EQ.FIXED(STEPS)) KK=1
  93.       CALL PSPEAK(OBJ,KK)
  94.  2008 I=LINK(I)
  95.       GOTO 2004
  96.       
  97.  2009 K=54
  98.  2010 SPK=K
  99.  2011 CALL RSPEAK(SPK)
  100.  
  101.  2012 VERB=0
  102.       OBJ=0
  103.       BLKLIN=.TRUE.
  104.       
  105. C  CHECK IF THIS LOC IS ELIGIBLE FOR ANY HINTS.  IF BEEN HERE LONG ENOUGH,
  106. C  BRANCH TO HELP SECTION (ON LATER PAGE).  HINTS ALL COME BACK HERE EVENTUALLY
  107. C  TO FINISH THE LOOP.  IGNORE "HINTS" < 4 (SPECIAL STUFF, SEE DATABASE NOTES).
  108.  
  109.  2600 CONTINUE
  110.       CALL HELPME
  111.       
  112. C  KICK THE RANDOM NUMBER GENERATOR JUST TO ADD VARIETY TO THE CHASE.  ALSO,
  113. C  IF CLOSING TIME, CHECK FOR ANY OBJECTS BEING TOTED WITH PROP < 0 AND SET
  114. C  THE PROP TO -1-PROP.  THIS WAY OBJECTS WON'T BE DESCRIBED UNTIL THEY'VE
  115. C  BEEN PICKED UP AND PUT DOWN SEPARATE FROM THEIR RESPECTIVE PILES.  DON'T
  116. C  TICK CLOCK1 UNLESS WELL INTO CAVE (AND NOT AT Y2).
  117.  
  118.       IF(.NOT.CLOSED) GOTO 2605
  119.       IF(PROP(OYSTER).LT.0.AND.TOTING(OYSTER))
  120.      1   CALL PSPEAK(OYSTER,1)
  121.       DO 2604 I=1,100
  122.  2604 IF(TOTING(I).AND.PROP(I).LT.0) PROP(I)=-1-PROP(I)
  123.  2605 WZDARK=DARK(0)
  124.       IF(KNFLOC.GT.0.AND.KNFLOC.NE.LOC) KNFLOC=0
  125.       I=RAN(1)
  126.       CALL GETIN(WD1,WD1X,WD2,WD2X)
  127.       
  128. C  EVERY INPUT, CHECK "FOOBAR" FLAG.  IF ZERO, NOTHING'S GOING ON.  IF POS,
  129. C  MAKE NEG.  IF NEG, HE SKIPPED A WORD, SO MAKE IT ZERO.
  130.  
  131.  2608 FOOBAR=MIN0(0,-FOOBAR)
  132.       IF(TURNS.EQ.0.AND.WD1.EQ.'MAGI'.AND.WD2.EQ.'MODE') GOTO 26000
  133.       TURNS=TURNS+1
  134.       CALL DATIME(D,T)
  135.       PRIMTM=WKDAY
  136.       IF(MOD(D,7).LE.1) PRIMTM=WKEND
  137.       IF(D.GE.HBEGIN.AND.D.LE.HEND) PRIMTM=HOLID
  138.       PTIME=(PRIMTM.AND.SHIFT(1,T/60)).NE.0
  139.       IF((.NOT.(DEMO.OR.WIZ)).AND.PTIME) GOTO 13000
  140.       IF(DEMO.AND.TURNS.GE.SHORT) GOTO 13000
  141.       IF(VERB.EQ.SAY.AND.WD2.NE.0) VERB=0
  142.       IF(VERB.EQ.SAY) GOTO 4090
  143.       IF(TALLY.EQ.0.AND.LOC.GE.15.AND.LOC.NE.33) CLOCK1=CLOCK1-1
  144.       IF(CLOCK1.EQ.0) GOTO 10000
  145.       IF(CLOCK1.LT.0) CLOCK2=CLOCK2-1
  146.       IF(CLOCK2.EQ.0) GOTO 11000
  147.       IF(PROP(LAMP).EQ.1) LIMIT=LIMIT-1
  148.       IF(LIMIT.LE.30.AND.HERE(BATTER).AND.PROP(BATTER).EQ.0
  149.      1   .AND.HERE(LAMP)) GOTO 12000
  150.       IF(LIMIT.EQ.0) GOTO 12400
  151.       IF(LIMIT.LT.0.AND.LOC.LE.8) GOTO 12600
  152.       IF(LIMIT.LE.30) GOTO 12200
  153. 19999 K=43
  154.       IF(LIQLOC(LOC).EQ.WATER) K=70
  155.       IF(WD1.EQ.'ENTE'.AND.(WD2.EQ.'STRE'.OR.WD2.EQ.'WATE')) GOTO 2010
  156.       IF(WD1.EQ.'ENTE'.AND.WD2.NE.0) GOTO 2800
  157.       IF((WD1.NE.'WATE'.AND.WD1.NE.'OIL')
  158.      1   .OR.(WD2.NE.'PLAN'.AND.WD2.NE.'DOOR')) GOTO 2610
  159.       IF(AT(VOCAB(WD2,1)))WD2='POUR'
  160.  2610 IF(WD1.NE.'WEST') GOTO 2630
  161.       IWEST=IWEST+1
  162.       IF(IWEST.EQ.10) CALL RSPEAK(17)
  163.  2630 I=VOCAB(WD1,-1)
  164.       IF(I.EQ.-1) GOTO 3000
  165.       K=MOD(I,1000)
  166.       KQ=I/1000+1
  167.       GOTO (8,5000,4000,2010) KQ
  168.       CALL BUG(22)
  169.       
  170. C  GET SECOND WORD FOR ANALYSIS.
  171.  
  172.  2800 WD1=WD2
  173.       WD1X=WD2X
  174.       WD2=0
  175.       GOTO 2610
  176.       
  177. C  GEE, I DON'T UNDERSTAND.
  178.  
  179.  3000 SPK=60
  180.       IF(PCT(20)) SPK=61
  181.       IF(PCT(20)) SPK=13
  182.       CALL RSPEAK(SPK)
  183.       GOTO 2600
  184.       
  185. C  ANALYSE A VERB.  REMEMBER WHAT IT WAS, GO BACK FOR OBJECT IF SECOND WORD
  186. C  UNLESS VERB IS "SAY", WHICH SNARFS ARBITRARY SECOND WORD.
  187.  
  188.  4000 VERB=K
  189.       SPK=ACTSPK(VERB)
  190.       IF(WD2.NE.0.AND.VERB.NE.SAY) GOTO 2800
  191.       IF(VERB.EQ.SAY) OBJ=WD2
  192.       IF(OBJ.NE.0) GOTO 4090
  193.       
  194. C  ANALYSE AN INTRANSITIVE VERB (I.E., NO OBJECT GIVEN YET).
  195.  
  196.  4080 GOTO(8010,8000,8000,8040,2009,8040,9070,9080,8000,8000,
  197.      1     2011,9120,9130,8140,9150,8000,8000,8180,8000,8200,
  198.      2     8000,9220,9230,8240,8250,8260,8270,8000,8000,8300,
  199.      3     8310) VERB
  200. C          TAKE DROP  SAY OPEN NOTH LOCK   ON  OFF WAVE CALM
  201. C          WALK KILL POUR  EAT DRNK  RUB TOSS QUIT FIND INVN
  202. C          FEED FILL BLST SCOR  FOO  BRF READ BREK WAKE SUSP
  203. C          HOUR
  204.       CALL BUG(23)
  205.       
  206. C  ANALYSE A TRANSITIVE VERB.
  207.  
  208.  4090 GOTO(9010,9020,9030,9040,2009,9040,9070,9080,9090,2011,
  209.      1     2011,9120,9130,9140,9150,9160,9170,2011,9190,9190,
  210.      2     9210,9220,9230,2011,2011,2011,9270,9280,9290,2011,
  211.      3     2011) VERB
  212. C          TAKE DROP  SAY OPEN NOTH LOCK   ON  OFF WAVE CALM
  213. C          WALK KILL POUR  EAT DRNK  RUB TOSS QUIT FIND INVN
  214. C          FEED FILL BLST SCOR  FOO  BRF READ BREK WAKE SUSP
  215. C          HOUR
  216.       CALL BUG(24)
  217.       
  218. C  ANALYSE AN OBJECT WORD.  SEE IF THE THING IS HERE, WHETHER WE'VE GOT A VERB
  219. C  YET, AND SO ON.  OBJECT MUST BE HERE UNLESS VERB IS "FIND" OR "INVENT(ORY)"
  220. C  (AND NO NEW VERB YET TO BE ANALYSED).  WATER AND OIL ARE ALSO FUNNY, SINCE
  221. C  THEY ARE NEVER ACTUALLY DROPPED AT ANY LOCATION, BUT MIGHT BE HERE INSIDE
  222. C  THE BOTTLE OR AS A FEATURE OF THE LOCATION.
  223.  
  224.  5000 OBJ=K
  225.       IF(FIXED(K).NE.LOC.AND..NOT.HERE(K)) GOTO 5100
  226.  5010 IF(WD2.NE.0) GOTO 2800
  227.       IF(VERB.NE.0) GOTO 4090
  228.       CALL A5TOA1(WD1,WD1X,'?   ',TEXT,K)
  229.       WRITE(*,5015) (TEXT(I),I=1,K)
  230.  5015 FORMAT(/' WHAT DO YOU WANT TO DO WITH THE ',20A1)
  231.       GOTO 2600
  232.       
  233.  5100 IF(K.NE.GRATE) GOTO 5110
  234.       IF(LOC.EQ.1.OR.LOC.EQ.4.OR.LOC.EQ.7) K=DPRSSN
  235.       IF(LOC.GT.9.AND.LOC.LT.15) K=ENTRNC
  236.       IF(K.NE.GRATE) GOTO 8
  237.  5110 IF(K.NE.DWARF) GOTO 5120
  238.       DO 5112 I=1,5
  239.       IF(DLOC(I).EQ.LOC.AND.DFLAG.GE.2) GOTO 5010
  240.  5112 CONTINUE
  241.  5120 IF((LIQ(0).EQ.K.AND.HERE(BOTTLE)).OR.K.EQ.LIQLOC(LOC)) GOTO 5010
  242.       IF(OBJ.NE.PLANT.OR..NOT.AT(PLANT2).OR.PROP(PLANT2).EQ.0) GOTO 5130
  243.       OBJ=PLANT2
  244.       GOTO 5010
  245.  5130 IF(OBJ.NE.KNIFE.OR.KNFLOC.NE.LOC) GOTO 5140
  246.       KNFLOC=-1
  247.       SPK=116
  248.       GOTO 2011
  249.  5140 IF(OBJ.NE.ROD.OR..NOT.HERE(ROD2)) GOTO 5190
  250.       OBJ=ROD2
  251.       GOTO 5010
  252.  5190 IF((VERB.EQ.FIND.OR.VERB.EQ.INVENT).AND.WD2.EQ.0) GOTO 5010
  253.       CALL A5TOA1(WD1,WD1X,'HERE',TEXT,K)
  254.       WRITE(*,5199) (TEXT(I),I=1,K)
  255.  5199 FORMAT(/' I SEE NO '20A1)
  256.       GOTO 2012
  257.       
  258. C  FIGURE OUT THE NEW LOCATION
  259. C
  260. C  GIVEN THE CURRENT LOCATION IN "LOC", AND A MOTION VERB NUMBER IN "K", PUT
  261. C  THE NEW LOCATION IN "NEWLOC".   THE CURRENT LOC IS SAVED IN "OLDLOC" IN CASE
  262. C  HE WANTS TO RETREAT.  THE CURRENT OLDLOC IS SAVED IN OLDLC2, IN CASE HE
  263. C  DIES.  (IF HE DOES, NEWLOC WILL BE LIMBO, AND OLDLOC WILL BE WHAT KILLED
  264. C  HIM, SO WE NEED OLDLC2, WHICH IS THE LAST PLACE HE WAS SAFE.)
  265. C
  266.     8 CONTINUE
  267.       CALL NEW1(IRET)
  268.       GOTO (2,99),IRET
  269.       
  270. C  "YOU'RE DEAD, JIM."
  271. C
  272. C  IF THE CURRENT LOC IS ZERO, IT MEANS THE CLOWN GOT HIMSELF KILLED.  WE'LL
  273. C  ALLOW THIS MAXDIE TIMES.  MAXDIE IS AUTOMATICALLY SET BASED ON THE NUMBER OF
  274. C  SNIDE MESSAGES AVAILABLE.  EACH DEATH RESULTS IN A MESSAGE (81, 83, ETC.)
  275. C  WHICH OFFERS REINCARNATION; IF ACCEPTED, THIS RESULTS IN MESSAGE 82, 84,
  276. C  ETC.  THE LAST TIME, IF HE WANTS ANOTHER CHANCE, HE GETS A SNIDE REMARK AS
  277. C  WE EXIT.  WHEN REINCRNATED, ALL OBJECTS BEING CARRIED GET DROPPED AT OLDLC2
  278. C  (PRESUMABLY THE LAST PLACE PRIOR TO BEING KILLED) WITHOUT CHANGE OF PROPS.
  279. C  THE LOOP RUNS BACKWARDS TO ASSURE THAT THE BIRD IS DROPPED BEFORE THE CAGE.
  280. C  (THIS KLUGE COULD BE CHANGED ONCE WE'RE SURE ALL REFERENCES TO BIRD AND CAGE
  281. C  ARE DONE BY KEYWORDS.)  THE LAMP IS A SPECIAL CASE (IT WOULDN'T DO TO LEAVE
  282. C  IT IN THE CAVE).  IT IS TURNED OFF AND LEFT OUTSIDE THE BUILDING (ONLY IF HE
  283. C  WAS CARRYING IT, OF COURSE).  HE HIMSELF IS LEFT INSIDE THE BUILDING (AND
  284. C  HEAVEN HELP HIM IF HE TRIES TO XYZZY BACK INTO THE CAVE WITHOUT THE LAMP!).
  285. C  OLDLOC IS ZAPPED SO HE CAN'T JUST "RETREAT".
  286.  
  287. C  THE EASIEST WAY TO GET KILLED IS TO FALL INTO A PIT IN PITCH DARKNESS.
  288.  
  289.    90 CALL RSPEAK(23)
  290.       OLDLC2=LOC
  291.       
  292. C  OKAY, HE'S DEAD.  LET'S GET ON WITH IT.
  293.  
  294.    99 IF(CLOSNG) GOTO 95
  295.       YEA=YES(81+NUMDIE*2,82+NUMDIE*2,54)
  296.       NUMDIE=NUMDIE+1
  297.       IF(NUMDIE.EQ.MAXDIE.OR..NOT.YEA) GOTO 20000
  298.       PLACE(WATER)=0
  299.       PLACE(OIL)=0
  300.       IF(TOTING(LAMP)) PROP(LAMP)=0
  301.       DO 98 J=1,100
  302.       I=101-J
  303.       IF(.NOT.TOTING(I)) GOTO 98
  304.       K=OLDLC2
  305.       IF(I.EQ.LAMP) K=1
  306.       CALL DROP(I,K)
  307.    98 CONTINUE
  308.       LOC=3
  309.       OLDLOC=LOC
  310.       GOTO 2000
  311.       
  312. C  HE DIED DURING CLOSING TIME.  NO RESURRECTION.  TALLY UP A DEATH AND EXIT.
  313.  
  314.    95 CALL RSPEAK(131)
  315.       NUMDIE=NUMDIE+1
  316.       GOTO 20000
  317.       
  318. C  ROUTINES FOR PERFORMING THE VARIOUS ACTION VERBS
  319.  
  320. C  STATEMENT NUMBERS IN THIS SECTION ARE 8000 FOR INTRANSITIVE VERBS, 9000 FOR
  321. C  TRANSITIVE, PLUS TEN TIMES THE VERB NUMBER.  MANY INTRANSITIVE VERBS USE THE
  322. C  TRANSITIVE CODE, AND SOME VERBS USE CODE FOR OTHER VERBS, AS NOTED BELOW.
  323.  
  324. C  RANDOM INTRANSITIVE VERBS COME HERE.  CLEAR OBJ JUST IN CASE (SEE "ATTACK").
  325.  
  326.  8000 CALL A5TOA1(WD1,WD1X,'HUH?',TEXT,K)
  327.       WRITE(*,8002) (TEXT(I),I=1,K)
  328.  8002 FORMAT(/' ',20A1)
  329.       OBJ=0
  330.       GOTO 2600
  331.       
  332. C CARRY, NO OBJECT GIVEN YET.  OK IF ONLY ONE OBJECT PRESENT.
  333.  
  334.  8010 IF(ATLOC(LOC).EQ.0.OR.LINK(ATLOC(LOC)).NE.0) GOTO 8000
  335.       DO 8012 I=1,5
  336.       IF(DLOC(I).EQ.LOC.AND.DFLAG.GE.2) GOTO 8000
  337.  8012 CONTINUE
  338.       OBJ=ATLOC(LOC)
  339.       
  340. C  CARRY AN OBJECT.  SPECIAL CASES FOR BIRD AND CAGE (F BIRD IN CAGE, CAN'T
  341. C  TAKE ONE WITHOUT THE OTHER.  LIQUIDS ALSO SPECIAL, SINCE THEY DEPEND ON
  342. C  STATUS OF BOTTLE.  ALSO VARIOUIS SIDE EFFECTS, ETC.
  343.  
  344.  9010 IF(TOTING(OBJ)) GOTO 2011
  345.       SPK=25
  346.       IF(OBJ.EQ.PLANT.AND.PROP(PLANT).LE.0) SPK=115
  347.       IF(OBJ.EQ.BEAR.AND.PROP(BEAR).EQ.1) SPK=169
  348.       IF(OBJ.EQ.CHAIN.AND.PROP(BEAR).NE.0) SPK=170
  349.       IF(FIXED(OBJ).NE.0) GOTO 2011
  350.       IF(OBJ.NE.WATER.AND.OBJ.NE.OIL) GOTO 9017
  351.       IF(HERE(BOTTLE).AND.LIQ(0).EQ.OBJ) GOTO 9018
  352.       OBJ=BOTTLE
  353.       IF(TOTING(BOTTLE).AND.PROP(BOTTLE).EQ.1) GOTO 9220
  354.       IF(PROP(BOTTLE).NE.1) SPK=105
  355.       IF(.NOT.TOTING(BOTTLE)) SPK=104
  356.       GOTO 2011
  357.  9018 OBJ=BOTTLE
  358.  9017 IF(HOLDNG.LT.7) GOTO 9016
  359.       CALL RSPEAK(92)
  360.       GOTO 2012
  361.  9016 IF(OBJ.NE.BIRD) GOTO 9014
  362.       IF(PROP(BIRD).NE.0) GOTO 9014
  363.       IF(.NOT.TOTING(ROD)) GOTO 9013
  364.       CALL RSPEAK(26)
  365.       GOTO 2012
  366.  9013 IF(TOTING(CAGE)) GOTO 9015
  367.       CALL RSPEAK(27)
  368.       GOTO 2012
  369.  9015 PROP(BIRD)=1
  370.  9014 IF((OBJ.EQ.BIRD.OR.OBJ.EQ.CAGE).AND.PROP(BIRD).NE.0)
  371.      1    CALL CARRY(BIRD+CAGE-OBJ,LOC)
  372.       CALL CARRY(OBJ,LOC)
  373.       K=LIQ(0)
  374.       IF(OBJ.EQ.BOTTLE.AND.K.NE.0) PLACE(K)=-1
  375.       GOTO 2009
  376.       
  377. C  DISCARD OBJECT.  "THROW" ALSO COMES HERE FOR MOST OBJECTS.  SPECIAL CASES FOR
  378. C  BIRD (MIGHT ATTACK SNAKE OR DRAGON) AND CAGE (MIGHT CONTAIN BIRD) AND VASE.
  379. C  DROP COINS AT VENDING MACHINE FOR EXTRA BATTERIES.
  380.  
  381.  9020 IF(TOTING(ROD2).AND.OBJ.EQ.ROD.AND..NOT.TOTING(ROD)) OBJ=ROD2
  382.       IF(.NOT.TOTING(OBJ)) GOTO 2011
  383.       IF(OBJ.NE.BIRD.OR..NOT.HERE(SNAKE)) GOTO 9024
  384.       CALL RSPEAK(30)
  385.       IF(CLOSED) GOTO 19000
  386.       CALL DSTROY(SNAKE)
  387. C  SET PROP FOR USE BY TRAVEL OPTIONS
  388.       PROP(SNAKE)=1
  389.  9021 K=LIQ(0)
  390.       IF(K.EQ.OBJ) OBJ=BOTTLE
  391.       IF(OBJ.EQ.BOTTLE.AND.K.NE.0) PLACE(K)=0
  392.       IF(OBJ.EQ.CAGE.AND.PROP(BIRD).NE.0) CALL DROP(BIRD,LOC)
  393.       IF(OBJ.EQ.BIRD)PROP(BIRD)=0
  394.       CALL DROP(OBJ,LOC)
  395.       GOTO 2012
  396.       
  397.  9024 IF(OBJ.NE.COINS.OR..NOT.HERE(VEND)) GOTO 9025
  398.       CALL DSTROY(COINS)
  399.       CALL DROP(BATTER,LOC)
  400.       CALL PSPEAK(BATTER,0)
  401.       GOTO 2012
  402.       
  403.  9025 IF(OBJ.NE.BIRD.OR..NOT.AT(DRAGON).OR.PROP(DRAGON).NE.0) GOTO 9026
  404.       CALL RSPEAK(154)
  405.       CALL DSTROY(BIRD)
  406.       PROP(BIRD)=0
  407.       IF(PLACE(SNAKE).EQ.PLAC(SNAKE)) TALLY2=TALLY2+1
  408.       GOTO 2012
  409.       
  410.  9026 IF(OBJ.NE.BEAR.OR..NOT.AT(TROLL)) GOTO 9027
  411.       CALL RSPEAK(163)
  412.       CALL MOVE(TROLL,0)
  413.       CALL MOVE(TROLL+100,0)
  414.       CALL MOVE(TROLL2,PLAC(TROLL))
  415.       CALL MOVE(TROLL2+100,FIXD(TROLL))
  416.       CALL JUGGLE(CHASM)
  417.       PROP(TROLL)=2
  418.       GOTO 9021
  419.       
  420.  9027 IF(OBJ.EQ.VASE.AND.LOC.NE.PLAC(PILLOW)) GOTO 9028
  421.       CALL RSPEAK(54)
  422.       GOTO 9021
  423.       
  424.  9028 PROP(VASE)=2
  425.       IF(AT(PILLOW)) PROP(VASE)=0
  426.       CALL PSPEAK(VASE,PROP(VASE)+1)
  427.       IF(PROP(VASE).NE.0) FIXED(VASE)=-1
  428.       GOTO 9021
  429.       
  430. C  SAY.  ECHO WD2 (OR WD1 IF NO WD2 (SAY WHAT?, ETC.).)  MAGIC WORDS OVERRIDE.
  431.  
  432.  9030 CALL A5TOA1(WD2,WD2X,'".  ',TEXT,K)
  433.       IF(WD2.EQ.0) CALL A5TOA1(WD1,WD1X,'".  ',TEXT,K)
  434.       IF(WD2.NE.0) WD1=WD2
  435.       I=VOCAB(WD1,-1)
  436.       IF(I.EQ.62.OR.I.EQ.65.OR.I.EQ.71.OR.I.EQ.2025) GOTO 9035
  437.       WRITE(*,9032) (TEXT(I),I=1,K)
  438.  9032 FORMAT(/' OKAY, "',20A1)
  439.       GOTO 2012
  440.       
  441.  9035 WD2=0
  442.       OBJ=0
  443.       GOTO 2630
  444.       
  445. C  LOCK, UNLOCK, NO OBJECT GIVEN.  ASSUME VARIOUS THINGS IF PRESENT.
  446.  
  447.  8040 SPK=28
  448.       IF(HERE(CLAM)) OBJ=CLAM
  449.       IF(HERE(OYSTER)) OBJ=OYSTER
  450.       IF(AT(DOOR)) OBJ=DOOR
  451.       IF(AT(GRATE)) OBJ=GRATE
  452.       IF(OBJ.NE.0.AND.HERE(CHAIN)) GOTO 8000
  453.       IF(HERE(CHAIN)) OBJ=CHAIN
  454.       IF(OBJ.EQ.0) GOTO 2011
  455.       
  456. C  LOCK, UNLOCK OBJECT.  SPECIAL STUFF FOR OPENING CLAM/OYSTER AND FOR CHAIN.
  457.  
  458.  9040 IF(OBJ.EQ.CLAM.OR.OBJ.EQ.OYSTER) GOTO 9046
  459.       IF(OBJ.EQ.DOOR) SPK=111
  460.       IF(OBJ.EQ.DOOR.AND.PROP(DOOR).EQ.1) SPK=54
  461.       IF(OBJ.EQ.CAGE) SPK=32
  462.       IF(OBJ.EQ.KEYS) SPK=55
  463.       IF(OBJ.EQ.GRATE.OR.OBJ.EQ.CHAIN) SPK=31
  464.       IF(SPK.NE.31.OR..NOT.HERE(KEYS)) GOTO 2011
  465.       IF(OBJ.EQ.CHAIN) GOTO 9048
  466.       IF(.NOT.CLOSNG) GOTO 9043
  467.       K=130
  468.       IF(.NOT.PANIC) CLOCK2=15
  469.       PANIC=.TRUE.
  470.       GOTO 2010
  471.       
  472.  9043 K=34+PROP(GRATE)
  473.       PROP(GRATE)=1
  474.       IF(VERB.EQ.LOCK) PROP(GRATE)=0
  475.       K=K+2*PROP(GRATE)
  476.       GOTO 2010
  477.       
  478. C  CLAM/OYSTER.
  479.  9046 K=0
  480.       IF(OBJ.EQ.OYSTER) K=1
  481.       SPK=124+K
  482.       IF(TOTING(OBJ)) SPK=120+K
  483.       IF(.NOT.TOTING(TRIDNT)) SPK=122+K
  484.       IF(VERB.EQ.LOCK) SPK=61
  485.       IF(SPK.NE.124) GOTO 2011
  486.       CALL DSTROY(CLAM)
  487.       CALL DROP(OYSTER,LOC)
  488.       CALL DROP(PEARL,105)
  489.       GOTO 2011
  490.       
  491. C  CHAIN.
  492.  9048 IF(VERB.EQ.LOCK) GOTO 9049
  493.       SPK=171
  494.       IF(PROP(BEAR).EQ.0) SPK=41
  495.       IF(PROP(CHAIN).EQ.0) SPK=37
  496.       IF(SPK.NE.171) GOTO 2011
  497.       PROP(CHAIN)=0
  498.       FIXED(CHAIN)=0
  499.       IF(PROP(BEAR).NE.3) PROP(BEAR)=2
  500.       FIXED(BEAR)=2-PROP(BEAR)
  501.       GOTO 2011
  502.       
  503.  9049 SPK=172
  504.       IF(PROP(CHAIN).NE.0) SPK=34
  505.       IF(LOC.NE.PLAC(CHAIN)) SPK=173
  506.       IF(SPK.NE.172) GOTO 2011
  507.       PROP(CHAIN)=2
  508.       IF(TOTING(CHAIN)) CALL DROP(CHAIN,LOC)
  509.       FIXED(CHAIN) =-1
  510.       GOTO 2011
  511.       
  512. C  LIGHT LAMP
  513.  
  514.  9070 IF(.NOT.HERE(LAMP)) GOTO 2011
  515.       SPK=184
  516.       IF(LIMIT.LT.0) GOTO 2011
  517.       PROP(LAMP)=1
  518.       CALL RSPEAK(39)
  519.       IF(WZDARK) GOTO 2000
  520.       GOTO 2012
  521.       
  522. C  LAMP OFF
  523.  
  524.  9080 IF(.NOT.HERE(LAMP)) GOTO 2011
  525.       PROP(LAMP)=0
  526.       CALL RSPEAK(40)
  527.       IF(DARK(0)) CALL RSPEAK(16)
  528.       GOTO 2012
  529.       
  530. C  WAVE.  NO EFFECT UNLESS WAVING ROD AT FISSURE.
  531.  
  532.  9090 IF((.NOT.TOTING(OBJ)).AND.(OBJ.NE.ROD.OR..NOT.TOTING(ROD2)))
  533.      1     SPK=29
  534.       IF(OBJ.NE.ROD.OR..NOT.AT(FISSUR).OR..NOT.TOTING(OBJ)
  535.      1   .OR.CLOSNG) GOTO 2011
  536.       PROP(FISSUR)=1-PROP(FISSUR)
  537.       CALL PSPEAK(FISSUR,2-PROP(FISSUR))
  538.       GOTO 2012
  539.       
  540. C  ATTACK.  ASSUME TARGET IF UNAMBIGUOUS.  "THROW" ALSO LINKS HERE.  ATTACKABLE
  541. C  OBJECTS FALL INTO TWO CATEGORIES: ENEMIES (SNAKE, DWARF, ETC.) AND OTHERS
  542. C  (BIRD, CLAM).  AMBIGUOUS IF TWO ENEMIES, OR IF NO ENEMIES BUT TWO OTHERS.
  543.  
  544.  9120 DO 9121 I=1,5
  545.       IF(DLOC(I).EQ.LOC.AND.DFLAG.GE.2)  GOTO 9122
  546.  9121 CONTINUE
  547.       I=0
  548.  9122 IF(OBJ.NE.0) GOTO 9124
  549.       IF(I.NE.0) OBJ=DWARF
  550.       IF(HERE(SNAKE)) OBJ=OBJ*100+SNAKE
  551.       IF(AT(DRAGON).AND.PROP(DRAGON).EQ.0) OBJ=OBJ*100+DRAGON
  552.       IF(AT(TROLL)) OBJ=OBJ*100+TROLL
  553.       IF(HERE(BEAR).AND.PROP(BEAR).EQ.0) OBJ=OBJ*100+BEAR
  554.       IF(OBJ.GT.100) GOTO 8000
  555.       IF(OBJ.NE.0) GOTO 9124
  556. C  CAN'T ATTACK BIRD BY THROWING AXE.
  557.       IF(HERE(BIRD).AND.VERB.NE.THROW) OBJ=BIRD
  558. C  CLAM AND OYSTER BOTH TREATED AS CLAM FOR INTRANSITIVE CASE; NO HARM DONE.
  559.       IF(HERE(CLAM).OR.HERE(OYSTER)) OBJ=100*OBJ+CLAM
  560.       IF(OBJ.GT.100) GOTO 8000
  561.  9124 IF(OBJ.NE.BIRD) GOTO 9125
  562.       SPK=137
  563.       IF(CLOSED) GOTO 2011
  564.       CALL DSTROY(BIRD)
  565.       PROP(BIRD)=0
  566.       IF(PLACE(SNAKE).EQ.PLAC(SNAKE)) TALLY2=TALLY2+1
  567.       SPK=45
  568.  9125 IF(OBJ.EQ.0) SPK=44
  569.       IF(OBJ.EQ.CLAM.OR.OBJ.EQ.OYSTER) SPK=150
  570.       IF(OBJ.EQ.SNAKE) SPK=46
  571.       IF(OBJ.EQ.DWARF) SPK=49
  572.       IF(OBJ.EQ.DWARF.AND.CLOSED) GOTO 19000
  573.       IF(OBJ.EQ.DRAGON) SPK=167
  574.       IF(OBJ.EQ.TROLL) SPK=157
  575.       IF(OBJ.EQ.BEAR) SPK=165+(PROP(BEAR)+1)/2
  576.       IF(OBJ.NE.DRAGON.OR.PROP(DRAGON).NE.0) GOTO 2011
  577.       
  578. C  FUN STUFF FOR DRAGON.  IF HE INSISTS IN ATTACKING IT, WIN!  SET PROP TO DEAD,
  579. C  MOVE DRAGON TO CENTRAL LOC (STILL FIXED), MOVE RUG THERE (NOT FIXED), AND
  580. C  MOVE HIM THERE, TOO.  THEN DO A NULL MOTION TO GET NEW DESCRIPTION.
  581.  
  582.       CALL RSPEAK(49)
  583.       VERB=0
  584.       OBJ=0
  585.       CALL GETIN(WD1,WD1X,WD2,WD2X)
  586.       IF(WD1.NE.'Y'.AND.WD1.NE.'YES') GOTO 2608
  587.       CALL PSPEAK(DRAGON,1)
  588.       PROP(DRAGON)=2
  589.       PROP(RUG)=0
  590.       K=(PLAC(DRAGON)+FIXD(DRAGON))/2
  591.       CALL MOVE(DRAGON+100,-1)
  592.       CALL MOVE(RUG+100,0)
  593.       CALL MOVE(DRAGON,K)
  594.       CALL MOVE(RUG,K)
  595.       DO 9126 OBJ=1,100
  596.       IF(PLACE(OBJ).EQ.PLAC(DRAGON).OR.PLACE(OBJ).EQ.FIXD(DRAGON))
  597.      1   CALL MOVE(OBJ,K)
  598.  9126 CONTINUE
  599.       LOC=K
  600.       K=NULL
  601.       GOTO 8
  602.       
  603. C  POUR.  IF NO OBJECT, OR OBJECT IS BOTTLE, ASSUME CONTENTS OF BOTTLE.
  604. C  SPECIAL TESTS FOR POURING WATER OR OIL ON PLANT OR RUSTY DOOR.
  605.  
  606.  9130 IF(OBJ.EQ.BOTTLE.OR.OBJ.EQ.0) OBJ=LIQ(0)
  607.       IF(OBJ.EQ.0) GOTO 8000
  608.       IF(.NOT.TOTING(OBJ)) GOTO 2011
  609.       SPK=78
  610.       IF(OBJ.NE.OIL.AND.OBJ.NE.WATER) GOTO 2011
  611.       PROP(BOTTLE)=1
  612.       PLACE(OBJ)=0
  613.       SPK=77
  614.       IF(.NOT.(AT(PLANT).OR.AT(DOOR))) GOTO 2011
  615.       IF(AT(DOOR)) GOTO 9132
  616.       SPK=112
  617.       IF(OBJ.NE.WATER) GOTO 2011
  618.       CALL PSPEAK(PLANT,PROP(PLANT)+1)
  619.       PROP(PLANT)=MOD(PROP(PLANT)+2,6)
  620.       PROP(PLANT2)=PROP(PLANT)/2
  621.       K=NULL
  622.       GOTO 8
  623.       
  624.  9132 PROP(DOOR)=0
  625.       IF(OBJ.EQ.OIL) PROP(DOOR)=1
  626.       SPK=113+PROP(DOOR)
  627.       GOTO 2011
  628.       
  629. C  EAT.  INTRANSITIVE:  ASSUME FOOD IF PRESENT, ELSE ASK WHAT.  TRANSITIVE: FOOD
  630. C  OK, SOME THINGS LOSE APPETITE, REST ARE RIDICULOUS.
  631.  
  632.  8140 IF(.NOT.HERE(FOOD)) GOTO 8000
  633.  8142 CALL DSTROY(FOOD)
  634.       SPK=72
  635.       GOTO 2011
  636.       
  637.  9140 IF(OBJ.EQ.FOOD) GOTO 8142
  638.       IF(OBJ.EQ.BIRD.OR.OBJ.EQ.SNAKE.OR.OBJ.EQ.CLAM.OR.OBJ.EQ.OYSTER
  639.      1   .OR.OBJ.EQ.DWARF.OR.OBJ.EQ.DRAGON.OR.OBJ.EQ.TROLL
  640.      2   .OR.OBJ.EQ.BEAR) SPK=71
  641.       GOTO 2011
  642.       
  643. C  DRINK.  IF NO OBJECT, ASSUME WATER AND LOOK FOR IT HERE.  IF WATER IS IN
  644. C  THE BOTTLE, DRINK THAT, ELSE MUST BE AT WATER LOC, SO DRINK STREAM.
  645.  
  646.  9150 IF(OBJ.EQ.0.AND.LIQLOC(LOC).NE.WATER.AND.(LIQ(0).NE.WATER
  647.      1   .OR..NOT.HERE(BOTTLE))) GOTO 8000
  648.       IF(OBJ.NE.0.AND.OBJ.NE.WATER) SPK=110
  649.       IF(SPK.EQ.110.OR.LIQ(0).NE.WATER.OR..NOT.HERE(BOTTLE)) GOTO 2011
  650.       PROP(BOTTLE)=1
  651.       PLACE(WATER)=0
  652.       SPK=74
  653.       GOTO 2011
  654.       
  655. C  RUB.  YIELDS VARIOUS SNIDE REMARKS.
  656.  
  657.  9160 IF(OBJ.NE.LAMP) SPK=76
  658.       GOTO 2011
  659.       
  660. C  THROW.  SAME AS DISCARD UNLESS AXE.  THEN SAME AS ATTACK EXCEPT IGNORE BIRD,
  661. C  AND IF DWARF IS PRESENT THEN ONE MIGHT BE KILLED.  (ONLY WAY TO DO SO!)
  662. C  AXE ALSO SPECIAL FOR DRAGON, BEAR, AND TROLL.  TREASURES SPECIAL FOR TROLL.
  663.  
  664.  9170 IF(TOTING(ROD2).AND.OBJ.EQ.ROD.AND..NOT.TOTING(ROD)) OBJ=ROD2
  665.       IF(.NOT.TOTING(OBJ)) GOTO 2011
  666.       IF(OBJ.GE.50.AND.OBJ.LE.MAXTRS.AND.AT(TROLL)) GOTO 9178
  667.       IF(OBJ.EQ.FOOD.AND.HERE(BEAR)) GOTO 9177
  668.       IF(OBJ.NE.AXE) GOTO 9020
  669.       DO 9171 I=1,5
  670. C  NEEDN'T CHECK DFLAG IF AXE IS HERE.
  671.       IF(DLOC(I).EQ.LOC) GOTO 9172
  672.  9171 CONTINUE
  673.       SPK=152
  674.       IF(AT(DRAGON).AND.PROP(DRAGON).EQ.0) GOTO 9175
  675.       SPK=158
  676.       IF(AT(TROLL)) GOTO 9175
  677.       IF(HERE(BEAR).AND.PROP(BEAR).EQ.0) GOTO 9176
  678.       OBJ=0
  679.       GOTO 9120
  680.       
  681.  9172 SPK=48
  682. C  IF SAVED NOT = -1, HE BYPASSED THE "START" CALL.
  683.       IF(RAN(3).EQ.0.OR.SAVED.NE.-1) GOTO 9175
  684.       DSEEN(I)=.FALSE.
  685.       DLOC(I)=0
  686.       SPK=47
  687.       DKILL=DKILL+1
  688.       IF(DKILL.EQ.1) SPK=149
  689.  9175 CALL RSPEAK(SPK)
  690.       CALL DROP(AXE,LOC)
  691.       K=NULL
  692.       GOTO 8
  693.       
  694. C  THIS'LL TEACH HIM TO THROW THE AXE AT THE BEAR!
  695.  9176 SPK=164
  696.       CALL DROP(AXE,LOC)
  697.       FIXED(AXE)=-1
  698.       PROP(AXE)=1
  699.       CALL JUGGLE(BEAR)
  700.       GOTO 2011
  701.       
  702. C  BUT THROWING FOOD IS ANOTHER STORY.
  703.  9177 OBJ=BEAR
  704.       GOTO 9210
  705.       
  706.  9178 SPK=159
  707. C  SNARF A TREASURE FOR THE TROLL.
  708.       CALL DROP(OBJ,0)
  709.       CALL MOVE(TROLL,0)
  710.       CALL MOVE(TROLL+100,0)
  711.       CALL DROP(TROLL2,PLAC(TROLL))
  712.       CALL DROP(TROLL2+100,FIXD(TROLL))
  713.       CALL JUGGLE(CHASM)
  714.       GOTO 2011
  715.       
  716. C  QUIT.  INTRANSITIVE ONLY.  VERIFY INTENT AND EXIT IF THAT'S WHAT HE WANTS.
  717.  
  718.  8180 GAVEUP=YES(22,54,54)
  719.  8185 IF(GAVEUP) GOTO 20000
  720.       GOTO 2012
  721.       
  722. C  FIND.  MIGHT BE CARRYING IT, OR IT MIGHT BE HERE.  ELSE GIVE CAVEAT.
  723.  
  724.  9190 IF(AT(OBJ).OR.(LIQ(0).EQ.OBJ.AND.AT(BOTTLE))
  725.      1   .OR.K.EQ.LIQLOC(LOC)) SPK=94
  726.       DO 9192 I=1,5
  727.  9192 IF(DLOC(I).EQ.LOC.AND.DFLAG.GE.2.AND.OBJ.EQ.DWARF) SPK=94
  728.       IF(CLOSED) SPK=138
  729.       IF(TOTING(BIRD)) SPK=24
  730.       GOTO 2011
  731.       
  732. C  INVENTORY.  IF OBJECT, TREAT SAME AS FIND.  ELSE REPORT ON CURRENT BURDEN.
  733.  
  734.  8200 SPK=98
  735.       DO 8201 I=1,100
  736.       IF(I.EQ.BEAR.OR..NOT.TOTING(I)) GOTO 8201
  737.       IF(SPK.EQ.98) CALL RSPEAK(99)
  738.       BLKLIN=.FALSE.
  739.       CALL PSPEAK(I,-1)
  740.       BLKLIN=.TRUE.
  741.       SPK=0
  742.  8201 CONTINUE
  743.       IF(TOTING(BEAR)) SPK=141
  744.       GOTO 2011
  745.       
  746. C  FEED.  IF BIRD, NO SEED.  SNAKE, DRAGON, TROLL: QUIP. IF DWARF, MAKE HIM
  747. C  MAD.  BEAR, SPECIAL.
  748.  
  749.  9210 IF(OBJ.NE.BIRD) GOTO 9212
  750.       SPK=100
  751.       GOTO 2011
  752.       
  753.  9212 IF(OBJ.NE.SNAKE.AND.OBJ.NE.DRAGON.AND.OBJ.NE.TROLL) GOTO 9213
  754.       SPK=102
  755.       IF(OBJ.EQ.DRAGON.AND.PROP(DRAGON).NE.0) SPK=110
  756.       IF(OBJ.EQ.TROLL) SPK=182
  757.       IF(OBJ.NE.SNAKE.OR.CLOSED.OR..NOT.HERE(BIRD)) GOTO 2011
  758.       SPK=101
  759.       CALL DSTROY(BIRD)
  760.       PROP(BIRD)=0
  761.       TALLY2=TALLY2+1
  762.       GOTO 2011
  763.       
  764.  9213 IF(OBJ.NE.DWARF) GOTO 9214
  765.       IF(.NOT.HERE(FOOD)) GOTO 2011
  766.       SPK=103
  767.       DFLAG=DFLAG+1
  768.       GOTO 2011
  769.       
  770.  9214 IF(OBJ.NE.BEAR) GOTO 9215
  771.       IF(PROP(BEAR).EQ.0) SPK=102
  772.       IF(PROP(BEAR).EQ.3) SPK=110
  773.       IF(.NOT.HERE(FOOD)) GOTO 2011
  774.       CALL DSTROY(FOOD)
  775.       PROP(BEAR)=1
  776.       FIXED(AXE)=0
  777.       PROP(AXE)=0
  778.       SPK=168
  779.       GOTO 2011
  780.       
  781.  9215 SPK=14
  782.       GOTO 2011
  783.       
  784. C  FILL.  BOTTLE MUST BE EMPTY, AND SOME LIQUID AVAILABLE.  (VASE IS NASTY.)
  785.  
  786.  9220 IF(OBJ.EQ.VASE) GOTO 9222
  787.       IF(OBJ.NE.0.AND.OBJ.NE.BOTTLE) GOTO 2011
  788.       IF(OBJ.EQ.0.AND..NOT.HERE(BOTTLE)) GOTO 8000
  789.       SPK=107
  790.       IF(LIQLOC(LOC).EQ.0) SPK=106
  791.       IF(LIQ(0).NE.0) SPK=105
  792.       IF(SPK.NE.107) GOTO 2011
  793.       PROP(BOTTLE)=MOD(COND(LOC),4)/2*2
  794.       K=LIQ(0)
  795.       IF(TOTING(BOTTLE)) PLACE(K)=-1
  796.       IF(K.EQ.OIL) SPK=108
  797.       GOTO 2011
  798.       
  799.  9222 SPK=29
  800.       IF(LIQLOC(LOC).EQ.0) SPK=144
  801.       IF(LIQLOC(LOC).EQ.0.OR..NOT.TOTING(VASE)) GOTO 2011
  802.       CALL RSPEAK(145)
  803.       PROP(VASE)=2
  804.       FIXED(VASE)=-1
  805.       GOTO 9024
  806.       
  807. C  BLAST.  NO EFFECT UNLESS YOU'VE GOT DYNAMITE, WHICH IS A NEAT TRICK!
  808.  
  809.  9230 IF(PROP(ROD2).LT.0.OR..NOT.CLOSED) GOTO 2011
  810.       BONUS=133
  811.       IF(LOC.EQ.115) BONUS=134
  812.       IF(HERE(ROD2)) BONUS=135
  813.       CALL RSPEAK(BONUS)
  814.       GOTO 20000
  815.       
  816. C  SCORE.  GO TO SCORING SECTION, WHICH WILL RETURN TO 8241 IF SCORNG IS TRUE.
  817.  
  818.  8240 SCORNG=.TRUE.
  819.       GOTO 20000
  820.       
  821.  8241 SCORNG=.FALSE.
  822.       WRITE(*,8243) SCORE, MXSCOR
  823.  8243 FORMAT(/' IF YOU WERE TO QUIT NOW, YOU WOULD SCORE',I4,
  824.      1        ' OUT OF A POSSIBLE',I4,'.')
  825.       GAVEUP=YES(143,54,54)
  826.       GOTO 8185
  827.       
  828. C  FEE FIE FOE FOO (AND FUM).  ADVANCE TO NEXT STATE IF GIVEN IN PROPER ORDER.
  829. C  LOOK UP WD1 IN SECTION 3 OF VOCAB TO DETERMINE WHICH WORD WE'VE GOT.  LAST
  830. C  WORD ZIPS THE EGGS BACK TO THE GIANT ROOM (UNLESS ALREADY THERE).
  831.  
  832.  8250 K=VOCAB(WD1,3)
  833.       SPK=42
  834.       IF(FOOBAR.EQ.1-K) GOTO 8252
  835.       IF(FOOBAR.NE.0) SPK=151
  836.       GOTO 2011
  837.       
  838.  8252 FOOBAR=K
  839.       IF(K.NE.4) GOTO 2009
  840.       FOOBAR=0
  841.       IF(PLACE(EGGS).EQ.PLAC(EGGS)
  842.      1   .OR.(TOTING(EGGS).AND.LOC.EQ.PLAC(EGGS))) GOTO 2011
  843. C  BRING BACK TROLL IF WE STEAL THE EGGS BACK FROM HIM BEFORE CROSSING.
  844.       IF(PLACE(EGGS).EQ.0.AND.PLACE(TROLL).EQ.0.AND.PROP(TROLL).EQ.0)
  845.      1   PROP(TROLL)=1
  846.       K=2
  847.       IF(HERE(EGGS)) K=1
  848.       IF(LOC.EQ.PLAC(EGGS)) K=0
  849.       CALL MOVE(EGGS,PLAC(EGGS))
  850.       CALL PSPEAK(EGGS,K)
  851.       GOTO 2012
  852.       
  853. C  BRIEF.  INTRANSITIVE ONLY.  SUPPRESS LONG DESCRIPTIONS AFTER FIRST TIME.
  854.  
  855.  8260 SPK=156
  856.       ABBNUM=10000
  857.       DETAIL=3
  858.       GOTO 2011
  859.       
  860. C  READ.  MAGAZINES IN DWARVISH, MESSAGE WE'VE SEEN, AND ... OYSTER?
  861.  
  862.  8270 IF(HERE(MAGZIN)) OBJ=MAGZIN
  863.       IF(HERE(TABLET)) OBJ=OBJ*100+TABLET
  864.       IF(HERE(MESSAG)) OBJ=OBJ*100+MESSAG
  865.       IF(CLOSED.AND.TOTING(OYSTER)) OBJ=OYSTER
  866.       IF(OBJ.GT.100.OR.OBJ.EQ.0.OR.DARK(0)) GOTO 8000
  867.       
  868.  9270 IF(DARK(0)) GOTO 5190
  869.       IF(OBJ.EQ.MAGZIN) SPK=190
  870.       IF(OBJ.EQ.TABLET) SPK=196
  871.       IF(OBJ.EQ.MESSAG) SPK=191
  872.       IF(OBJ.EQ.OYSTER.AND.HINTED(2).AND.TOTING(OYSTER)) SPK=194
  873.       IF(OBJ.NE.OYSTER.OR.HINTED(2).OR..NOT.TOTING(OYSTER)
  874.      1   .OR..NOT.CLOSED) GOTO 2011
  875.       HINTED(2)=YES(192,193,54)
  876.       GOTO 2012
  877.       
  878. C  BREAK.  ONLY WORKS FOR MIRROR IN REPOSITORY AND, OF COURSE, THE VASE.
  879.  
  880.  9280 IF(OBJ.EQ.MIRROR) SPK=148
  881.       IF(OBJ.EQ.VASE.AND.PROP(VASE).EQ.0) GOTO 9282
  882.       IF(OBJ.NE.MIRROR.OR..NOT.CLOSED) GOTO 2011
  883.       CALL RSPEAK(197)
  884.       GOTO 19000
  885.       
  886.  9282 SPK=198
  887.       IF(TOTING(VASE)) CALL DROP(VASE,LOC)
  888.       PROP(VASE)=2
  889.       FIXED(VASE)=-1
  890.       GOTO 2011
  891.       
  892. C  WAKE.  ONLY USE IS TO DISTURB THE DWARVES.
  893.  
  894.  9290 IF(OBJ.NE.DWARF.OR..NOT.CLOSED) GOTO 2011
  895.       CALL RSPEAK(199)
  896.       GOTO 19000
  897.       
  898. C  SUSPEND.  OFFER TO EXIT LEAVING THINGS RESTARTABLE BUT REQUIRING A DELAY
  899. C  BEFORE RESTARTING (SO CAN'T SAVE THE WORLD BEFORE TRYING SOMETHING RISKY).
  900. C  UPON RESTARTING, SETUP=-1 CAUSES RETURN TO 8305 TO PICK UP AGAIN.
  901.  
  902.  8300 SPK=201
  903.       IF(DEMO) GOTO 2011
  904.       WRITE(*,8302) LATNCY
  905.  8302 FORMAT(/' I CAN SUSPEND YOUR ADVENTURE FOR YOU SO THAT YOU CAN',
  906.      1        ' RESUME LATER, BUT'/' YOU WILL HAVE TO WAIT AT LEAST',
  907.      2        I3,' MINUTES BEFORE CONTINUING')
  908.       IF(.NOT.YES(200,54,54)) GOTO 2012
  909.       K=NULL
  910.       GOTO 8
  911. C     CALL DATIME(SAVED,SAVET)
  912. C     SETUP=-1
  913. C     CALL CIAO
  914.  
  915. C8305 YEA=START(0)
  916. C     SETUP=3
  917. C     K=NULL
  918. C     GOTO 8
  919.  
  920. C  HOURS.  REPORT CURRENT NON-PRIME-TIME HOURS.
  921.  
  922.  8310 CALL MSPEAK(6)
  923.       CALL HOURS
  924.       GOTO 2012
  925.       
  926. C  CAVE CLOSING AND SCORING
  927. C  SET PROCESSING PARAMETER TO APPROPRIATE VALUE AND CALL CLOSEX.
  928.  
  929. 10000 CONTINUE
  930.       IRET=1
  931.       GOTO 24000
  932. C
  933. 11000 CONTINUE
  934.       IRET=2
  935.       GOTO 24000
  936. C
  937. 12000 CONTINUE
  938.       IRET=3
  939.       GOTO 24000
  940. C
  941. 12200 CONTINUE
  942.       IRET=4
  943.       GOTO 24000
  944. C
  945. 12400 CONTINUE
  946.       IRET=5
  947.       GOTO 24000
  948. C
  949. 12600 CONTINUE
  950.       IRET=6
  951.       GOTO 24000
  952. C
  953. 13000 CONTINUE
  954.       IRET=7
  955.       GOTO 24000
  956. C
  957. 19000 CONTINUE
  958.       IRET=8
  959.       GOTO 24000
  960. C
  961. 20000 CONTINUE
  962.       IRET=9
  963. C
  964. C  CALL THE CLOSE ROUTINE (CLOSEX)
  965. 24000 CONTINUE
  966.       CALL CLOSEX(IRET)
  967. C
  968. C  PERFORM REQUIRED PROCESSING ACCORDING TO RETURNED VALUE OF IRET.
  969.       GO TO(19999,2,8241,25000),IRET
  970. C
  971.     2 CONTINUE
  972.       IRET=1
  973.       RETURN
  974. C
  975. C  THE ADVENTURE HAS BEEN COMPLETED - RETURN TO THE CALLING ROUTINE.
  976. 25000 CONTINUE
  977.       IRET=2
  978.       RETURN
  979. C
  980. C  MAINTENANCE MODE.  SET RETURN FLAG AND GET OUT
  981. 26000 CONTINUE
  982.       IRET=3
  983.       RETURN
  984.       END
  985.