Revision 9 (Original Source)
authorhistoricalsource <historicalsoftware@textfiles.com>
Sun, 14 Apr 2019 17:36:31 +0000 (13:36 -0400)
committerhistoricalsource <historicalsoftware@textfiles.com>
Sun, 14 Apr 2019 17:36:31 +0000 (13:36 -0400)
README.md [new file with mode: 0644]
colors.zil [new file with mode: 0644]
goal.zil [new file with mode: 0644]
m5.errors [new file with mode: 0644]
m5.record [new file with mode: 0644]
m5.zip [new file with mode: 0644]
macros.zil [new file with mode: 0644]
parser.zil [new file with mode: 0644]
people.zil [new file with mode: 0644]
syntax.zil [new file with mode: 0644]
verbs.zil [new file with mode: 0644]

diff --git a/README.md b/README.md
new file mode 100644 (file)
index 0000000..741e1e1
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+# moonmist
diff --git a/colors.zil b/colors.zil
new file mode 100644 (file)
index 0000000..23377f5
--- /dev/null
@@ -0,0 +1,912 @@
+"COLORS for MOONMIST
+Copyright (C) 1986 Infocom, Inc.  All rights reserved."    
+
+<GLOBAL HERE:OBJECT DRIVEWAY ;CAR>
+<GLOBAL OHERE:OBJECT 0>
+
+;<ROUTINE START-MOVEMENT ()
+       <QUEUE I-LIONEL-SPEAKS %<- ,LIONEL-TIME ,PRESENT-TIME-ATOM>>>
+
+<ROUTINE INTRO ()
+       <TELL "|
+You drove west from London all day in your new little British " 'CAR ". Now at
+last you've arrived in the storied land of Cornwall.|
+|
+Dusk has fallen as you pull up in front of " D ,CASTLE ". A ghostly "
+'MOON " is rising, and a tall iron gate between two pillars bars the way
+into the " 'COURTYARD ".|">>
+
+<OBJECT YOUR-COLOR
+       (DESC "your favorite color")
+       (IN GLOBAL-OBJECTS)
+       (ADJECTIVE MY FAVORITE F.C F.C)
+       (SYNONYM COLOR)
+       (FLAGS NARTICLEBIT)
+       (ACTION YOUR-COLOR-F)>
+
+<ROUTINE YOUR-COLOR-F ()
+ <COND (<REMOTE-VERB?>
+       <RFALSE>)
+       (<AND <NOT <EQUAL? ,HERE ,YOUR-ROOM>>
+            <NOT <VISIBLE? ,CAR>>
+            <NOT <VISIBLE? ,EXERCISE-OUTFIT>>
+            <NOT <VISIBLE? ,DINNER-OUTFIT>>
+            <NOT <VISIBLE? ,SLEEP-OUTFIT>>>
+       <NOT-HERE ,YOUR-COLOR>)
+       (T <TELL "It's " 'YOUR-COLOR "!" CR>)>>
+
+<ROUTINE GET-COLOR ("AUX" NUM N WD (SUM 0) X)
+  <PUTB ,P-INBUF 0 30> ;"for CoCo"
+  <REPEAT ()
+       <TELL !\>>
+       <READ ,P-INBUF ,P-LEXV>
+       <SET NUM <GETB ,P-LEXV ,P-LEXWORDS>>
+       <COND (<0? .NUM>
+              <TELL !\" ,BEG-PARDON "\" ">
+              <AGAIN>)>
+       <SET N ,P-LEXSTART>
+       <REPEAT ()
+               <SET WD <GET ,P-LEXV .N>>
+               ;<COND (<EQUAL? .WD ,W?PURPLE>
+                      <SET WD ,W?VIOLET>)>
+               <COND (<SET X <ZMEMQ .WD ,COLOR-WORDS>>
+                      <SETG VARIATION .X>
+                      <RETURN>)
+                     (<DLESS? NUM 1>
+                      <RETURN>)
+                     (T <SET N <+ .N ,P-LEXELEN>>)>>
+       <SET WD <+ ,P-LEXSTART
+                  <* ,P-LEXELEN <- <GETB ,P-LEXV ,P-LEXWORDS> 1>>>>
+       <COND (<EQUAL? <GET ,P-LEXV .WD> ,W?PERIOD ,W?\! ,W??>
+              <SET WD <- .WD ,P-LEXELEN>>)>
+       <SET N <* 2 <+ .WD 1>>>
+       <SET WD <+ -1 <+ <GETB ,P-LEXV .N> <GETB ,P-LEXV <+ 1 .N>>>>>
+       ;<COND (<G? .WD ,NAME-LENGTH>
+              <SET WD ,NAME-LENGTH>)>
+       <NON-BLANK-STUFF ,FAVE-COLOR <REST ,P-INBUF 1> .WD>
+       <TELL "\"Did you say " 'YOUR-COLOR " is ">
+       <PRINT-COLOR T>
+       <TELL "?\"">
+       <COND (<YES?>
+              <COND (<0? ,VARIATION>
+                     <SET SUM <GETB ,P-INBUF   ;"1st char in 1st word"
+                                    <GETB ,P-LEXV <+ 3 <* 2 ,P-LEXSTART>>>>>
+                     ;<SET NUM
+                          <* 2 <+ ,P-LEXSTART
+                                  <* ,P-LEXELEN
+                                     <GETB ,P-LEXV ,P-LEXWORDS>>>>>
+                     ;<SET NUM <+ <GETB ,P-LEXV <- .NUM 1>>    ;"last+1 char"
+                                 <GETB ,P-LEXV <- .NUM 2>>>>
+                     ;<REPEAT ()
+                          <COND (<DLESS? NUM 1> <RETURN>)
+                                (T <SET SUM <+ .SUM <GETB ,P-INBUF .NUM>>>)>>
+                     <COND (<SET X <ZMEMQ .SUM ,COLOR-LETTERS>>
+                            <SETG VARIATION .X>)
+                           (T <SETG VARIATION <+ 1 <MOD .SUM ,MAX-VARS>>>)>
+                     <SETG COLOR-FORCED <GET ,COLOR-WORDS ,VARIATION>>)>
+              <DO-VARIATION>
+              <PUTB ,P-INBUF 0 80>
+              <RETURN>)
+             (T
+              ;<PUTB ,FAVE-COLOR 1 0>
+              <TELL "\"What, then?\"" CR>
+              <SETG VARIATION 0>)>>>
+
+<GLOBAL VILLAIN-PER:OBJECT 0>
+<GLOBAL TREASURE:OBJECT 0>
+<GLOBAL HIDING-PLACE:OBJECT 0>
+<GLOBAL COLOR-FORCED:FLAG 0>
+<CONSTANT MAX-VARS 4>
+
+<GLOBAL COLOR-WORDS
+       <PLTABLE        <VOC "YELLOW" ADJ>      ;FRIEND-C
+               <VOC "RED" ADJ>         ;LORD-C
+               <VOC "BLUE" ADJ>        ;PAINTER-C
+               <VOC "GREEN" ADJ>       ;DOCTOR-C
+               ;<VOC "VIOLET" BUZZ>    ;OFFICER-C
+               ;<VOC "ORANGE" BUZZ>    ;DEALER-C>>
+
+<GLOBAL COLOR-ADJS
+       <PLTABLE        A?YELLOW        ;FRIEND-C
+               A?RED           ;LORD-C
+               A?BLUE          ;PAINTER-C
+               A?GREEN         ;DOCTOR-C
+               ;A?VIOLET       ;OFFICER-C
+               ;A?ORANGE       ;DEALER-C>>
+
+<GLOBAL COLOR-LETTERS
+       <PLTABLE        %<ASCII !\y>
+               %<ASCII !\r>
+               %<ASCII !\b>
+               %<ASCII !\g>
+               ;%<ASCII !\v>
+               ;%<ASCII !\o>>>
+
+<ROUTINE FIX-COLOR-ADJ (OBJ "AUX" PT N)
+ <COND (<AND <SET PT <GETPT .OBJ ,P?ADJECTIVE>>
+            <SET N <ZMEMQB ,A?F.C .PT <RMGL-SIZE .PT>>>>
+       <PUTB .PT .N <GET ,COLOR-ADJS ,VARIATION>>)>>
+
+<ROUTINE DO-VARIATION ("AUX" C)
+       <FIX-COLOR-ADJ ,YOUR-COLOR>
+       <FIX-COLOR-ADJ ,YOUR-ROOM>
+       <FIX-COLOR-ADJ ,CAR>
+       <FIX-COLOR-ADJ ,SLEEP-OUTFIT>
+       <FIX-COLOR-ADJ ,EXERCISE-OUTFIT>
+       <FIX-COLOR-ADJ ,DINNER-OUTFIT>
+       <COND (<EQUAL? ,VARIATION ,LORD-C>
+              <SET C <LOC ,LOVER>>)
+             (<EQUAL? ,VARIATION ,FRIEND-C>
+              <SET C ,IRIS-CLOSET>)
+             (<EQUAL? ,VARIATION ,PAINTER-C>
+              <SET C ,VIVIEN-BOX>)
+             (T <SET C ,WENDISH-KIT>)>
+       <SETG HIDING-PLACE .C>
+       <MOVE ,COSTUME .C>
+       <MOVE ,BLOWGUN .C>
+       <COND (<EQUAL? ,VARIATION ,LORD-C>      ;"RED"
+              <SETG VILLAIN-PER ,LOVER ;,LORD>
+              <MOVE ,NECKLACE-OF-D ,JACK-ROOM>
+              ;<FSET ,NECKLACE-OF-D ,SECRETBIT>
+              <MOVE ,JEWEL ,LOCAL-GLOBALS>
+              ;<MOVE ,JOURNAL ,DESK>
+              <SETG TREASURE ,WAR-CLUB>
+              <MOVE ,CLUE-2 ,PAINTER>
+              <FSET ,STAINED-WINDOW ,CONTBIT>
+              <MOVE ,CLUE-3 ,STAINED-WINDOW>
+              <MOVE ,CLUE-4 ,GARDEN>
+              <COND ;(<FSET? ,PLAYER ,FEMALE>
+                     <MOVE ,CURTAIN-ROD ,JACK-ROOM>)
+                    (T <MOVE ,CANE ,UMBRELLA-STAND>)>)
+             (<EQUAL? ,VARIATION ,FRIEND-C>    ;"YELLOW"
+              <SETG VILLAIN-PER ,FRIEND>
+              <MOVE ,TAMARA-EVIDENCE ,TAMARA-BED ;,TAMARA-ROOM>
+              <PUT <GETPT ,FRIEND ,P?WEST> ,NEXITSTR "ignoring you">
+              <MOVE ,JOURNAL ,TAMARA-BED>
+              <FSET ,JOURNAL ,NDESCBIT>
+              <MOVE ,EARRING ,JEWELRY-CASE>
+              <MOVE ,JEWEL ,LOCAL-GLOBALS>
+              <SETG TREASURE ,NECKLACE>
+              <MOVE ,NECKLACE ,SKELETON>
+              <MOVE ,CLUE-4 ,COFFIN>
+              <FCLEAR ,CLUE-4 ,NDESCBIT>
+              <FSET ,CLUE-4 ,TAKEBIT>
+              <MOVE ,CLUE-3 ,BELL>
+              <MOVE ,BRICKS ,BASEMENT>
+              ;<COND ;(<FSET? ,PLAYER ,FEMALE>
+                     <MOVE ,NECKLACE ,POND>)
+                    (T
+                     ;<FSET ,NECKLACE ,NDESCBIT>
+                     <MOVE ,NECKLACE ,SKELETON>)>)
+             (<EQUAL? ,VARIATION ,DOCTOR-C>    ;"GREEN"
+              <SETG VILLAIN-PER ,DOCTOR>
+              <MOVE ,WENDISH-BOOK ,BOOKCASE ;,LIBRARY>
+              <MOVE ,LENS-BOX ,WENDISH-KIT>
+              <FCLEAR ,LENS-BOX ,NDESCBIT>
+              <FSET ,LENS-BOX ,TAKEBIT>
+              <MOVE ,JOURNAL ,DESK>
+              <MOVE ,LETTER-DEE ,STUDY>
+              <SETG TREASURE ,MOONMIST>
+              <FSET ,MOONMIST ,SECRETBIT>
+              ;<REMOVE ,GAME>
+              ;<FSET ,RHINO-HEAD ,CONTBIT>
+              ;<FSET ,RHINO-HEAD ,OPENBIT>
+              <MOVE ,CLUE-3 ,RHINO-HEAD>
+              <MOVE ,CLUE-4 ,GALLERY-CORNER ;,FRONT-GATE>
+              <FCLEAR ,CLUE-4 ,NDESCBIT>
+              <FSET ,CLUE-4 ,TAKEBIT>
+              ;<PUTP ,CLUE-4 ,P?FDESC
+                 "A shaft of light from the peephole lands on a fourth clue.">
+              <COND ;(<FSET? ,PLAYER ,FEMALE>
+                     <MOVE ,MOONMIST ,BOTTLE>)
+                    (T <MOVE ,MOONMIST ,INKWELL>)>)
+             (<EQUAL? ,VARIATION ,PAINTER-C>   ;"BLUE"
+              <SETG VILLAIN-PER ,PAINTER>
+              <MOVE ,VIVIEN-DIARY ,VIVIEN-BOX>
+              <MOVE ,LENS-BOX ,VIVIEN-BOX>
+              <FCLEAR ,LENS-BOX ,NDESCBIT>
+              <FSET ,LENS-BOX ,TAKEBIT>
+              ;<REMOVE ,JOURNAL>
+              ;<MOVE ,MAGAZINE ,LUMBER-ROOM>
+              <SETG TREASURE ,SKULL>
+              <MOVE ,SKULL ,BELL>
+              <FSET ,MUSIC ,SECRETBIT>
+              <COND ;(<FSET? ,PLAYER ,FEMALE>
+                     <MOVE ,SKULL ,COFFIN>)
+                    (T <MOVE ,CLUE-3 ,ARMOR>)>)
+             ;(<EQUAL? ,VARIATION ,DEALER-C>
+              <SETG VILLAIN-PER ,DEALER>
+              <MOVE ,HYDE-IOU ,HYDE-ROOM>
+              <MOVE ,LENS-BOX ,HYDE-ROOM>
+              <SETG TREASURE ,HEADDRESS>
+              <COND ;(<FSET? ,PLAYER ,FEMALE>
+                     <MOVE ,HEADDRESS ,BRITANNIA>)
+                    (T <MOVE ,HEADDRESS ,ARMOR>)>)
+             ;(<EQUAL? ,VARIATION ,OFFICER-C>
+              <SETG VILLAIN-PER ,OFFICER>
+              <MOVE ,IAN-EVIDENCE ,IAN-ROOM>
+              <SETG TREASURE ,RUBY>
+              <COND (<FSET? ,PLAYER ,FEMALE>
+                     <FSET ,STAINED-WINDOW ,CONTBIT>
+                     <MOVE ,RUBY ,STAINED-WINDOW>)
+                    (T
+                     <FSET ,RHINO-HEAD ,CONTBIT>
+                     <MOVE ,RUBY ,RHINO-HEAD>)>)>
+       <COND (<==? ,VILLAIN-PER ,LOVER>
+              <SETG SEARCHER ,LORD>)
+             (T <SETG SEARCHER ,VILLAIN-PER>)>
+       <COND (<FSET? ,VILLAIN-PER ,FEMALE>
+              <FSET ,GHOST-NEW ,FEMALE>)>
+       ;<SET C <GETP ,VILLAIN-PER ,P?CHARACTER>>
+       ;<PUTP ,GHOST-NEW ,P?CHARACTER .C>      ;"in DRESS-GHOST">
+[
+<OBJECT CANE
+       ;(IN LOCAL-GLOBALS)
+       (DESC "cane")
+       (SYNONYM CANE HANDLE)
+       (FLAGS TAKEBIT NDESCBIT SURFACEBIT OPENBIT SEARCHBIT SECRETBIT)
+       (ACTION CANE-F)>
+
+<ROUTINE CANE-F ("AUX" P)
+ <COND (<ATTACK-VERB?>
+       <NO-VIOLENCE? ,CANE>
+       <RTRUE>)
+       (T <DISCOVER-WAR-CLUB ,CANE>)>>
+
+<OBJECT PAINT
+       (IN CANE)
+       (DESC "coat of paint")
+       (ADJECTIVE NEW)
+       (SYNONYM PAINT COAT)
+       (FLAGS NDESCBIT TRYTAKEBIT SEENBIT SECRETBIT)
+       (ACTION PAINT-F)>
+
+<ROUTINE PAINT-F ()
+ <COND (<VERB? EXAMINE>
+       <TELL "It seems to be hiding something." CR>)
+       (<OR <VERB? BRUSH LOOK-UNDER REMOVE RUB TAKE-OFF>
+           <AND <VERB? TAKE> <T? ,PRSI>>>
+       <DISCOVER-WAR-CLUB ,CANE ;<LOC ,PAINT> T>
+       <RTRUE>)
+       (<DIVESTMENT? ,PAINT>
+       <HAR-HAR>)>>
+
+;<OBJECT CURTAIN-ROD
+       ;(IN LOCAL-GLOBALS)
+       (DESC "curtain rod")
+       (ADJECTIVE CURTAIN)
+       (SYNONYM ROD)
+       (FLAGS NDESCBIT)
+       (ACTION CURTAIN-ROD-F)>
+
+;<ROUTINE CURTAIN-ROD-F () <DISCOVER-WAR-CLUB ,CURTAIN-ROD>>
+
+<ROUTINE DISCOVER-WAR-CLUB (OBJ "OPTIONAL" (DO-IT <>) "AUX" PER)
+ <COND (<OR <VERB? BRUSH RUB> <T? .DO-IT>>
+       <COND (<FSET? ,WAR-CLUB ,SECRETBIT>
+              <DISCOVER ,WAR-CLUB ,PAINT>
+              <MOVE ,WAR-CLUB <LOC .OBJ>>
+              <ROB .OBJ <LOC .OBJ>>
+              <MOVE .OBJ ,LOCAL-GLOBALS>
+              <MOVE ,PAINT ,LOCAL-GLOBALS>
+              <RTRUE>)>)
+       (<VERB? EXAMINE SEARCH>
+       <COND (<FSET? ,WAR-CLUB ,SECRETBIT>
+              <FCLEAR ,PAINT ,SECRETBIT>
+              <TELL
+"There's something strange about this " D .OBJ ".
+It's shaped like a baseball bat, but with hard, faceted bumps all over it.
+It has a new " 'PAINT "." CR>)
+             ;(T <DESCRIBE-WAR-CLUB>)>)>>
+
+<ROUTINE ATTACK-VERB? ("OPT" (SHOOT <>))
+ <COND (<VERB? ATTACK KILL SLAP>
+       <COND (<FSET? ,PRSO ,PERSONBIT>
+              <RTRUE>)>)
+       (<VERB? SHOOT>
+       <COND (<AND <T? .SHOOT>
+                   <FSET? ,PRSO ,PERSONBIT>>
+              <RTRUE>)>)
+       (<VERB? RING PUT>
+       <COND (<AND <T? .SHOOT>
+                   <OR <ZERO? ,PRSI>
+                       <FSET? ,PRSI ,PERSONBIT>>>
+              <RTRUE>)>)
+       (<VERB? USE>
+       <COND (<OR <ZERO? ,PRSI>
+                  <FSET? ,PRSI ,PERSONBIT>>
+              <RTRUE>)>)>>
+
+<OBJECT WAR-CLUB
+       ;(IN LOCAL-GLOBALS)
+       (DESC "war club")
+       (ADJECTIVE WAR ;" ZULU DINGAAN KING\'S DIAMOND")
+       (SYNONYM CLUB HANDLE CANE ;KNOBKERRIE ;SCEPTER SCEPTRE)
+       (FLAGS NDESCBIT SECRETBIT SEENBIT)
+       (ACTION WAR-CLUB-F)>
+
+<ROUTINE WAR-CLUB-F ()
+ <COND (<VERB? COMPARE>
+       <COND (<EQUAL? ,JEWEL ,PRSO ,PRSI>
+              <TELL
+CTHE ,WAR-CLUB " has no " 'JEWEL " like this one." CR>)>)
+       (<VERB? EXAMINE>
+       <DESCRIBE-WAR-CLUB>)
+       (<ATTACK-VERB?>
+       <NO-VIOLENCE? ,WAR-CLUB>
+       <RTRUE>)
+       ;(T <SHOOTING ,WAR-CLUB>)>>
+
+<ROUTINE DESCRIBE-WAR-CLUB ()
+       <TELL
+"It's a " 'WAR-CLUB " that once belonged to the Zulu king
+Dingaan -- and it's studded with large diamonds!"
+;"the brilliant diamond-studded knobkerrie, or war club, of Dingaan the
+Vulture, the Zulu king who fought the Boers!" CR>>
+
+<OBJECT SKULL
+       ;(IN LOCAL-GLOBALS)
+       (DESC "fossil skull")
+       (ADJECTIVE FOSSIL)
+       (SYNONYM SKULL)
+       (FLAGS NDESCBIT SECRETBIT)
+       (SIZE 9)
+       (ACTION SKULL-F)>
+
+<ROUTINE SKULL-F ()
+ <COND (<VERB? EXAMINE LOOK-INSIDE SEARCH>
+       <TELL
+"This staring skull is frightfully old -- even older than the castle." CR>)>>
+
+<OBJECT NECKLACE
+       ;(IN SKELETON)
+       (DESC "black pearl necklace")
+       (ADJECTIVE BLACK PEARL)
+       (SYNONYM PEARLS NECKLACE STRING)
+       (FLAGS TAKEBIT NDESCBIT SECRETBIT WEARBIT ;WORNBIT)
+       (SIZE 5)
+       (TEXT
+"It's a strand of shiny black pearls, the rarest and most precious kind
+in the world!")>
+
+;<OBJECT GAME
+       (IN GLOBAL-OBJECTS)
+       (DESC "MOONMIST")
+       (ADJECTIVE MOON)
+       (SYNONYM GAME MOONMIST MIST)
+       (FLAGS NARTICLEBIT)
+       (ACTION GAME-F)>
+
+;<ROUTINE GAME-F ()
+        <COND (<VERB? EXAMINE FIND LAMP-ON PLAY READ THROUGH>
+               <SETG CLOCK-WAIT T>
+               <TELL "[You're playing it now!]" CR>)>>
+
+<OBJECT MOONMIST
+       (IN GLOBAL-OBJECTS)
+       (DESC "Moonmist")
+       (ADJECTIVE MOON GREEN)
+       (SYNONYM MOONMIST MIST INK ;DRUG LIQUID ;GAME)
+       (FLAGS NARTICLEBIT ;SECRETBIT)
+       (ACTION MOONMIST-F)>
+
+<ROUTINE MOONMIST-F ()
+ <COND (<OR <VERB? PLAY READ>
+           <AND <VERB? EXAMINE FIND>
+                <IN? ,MOONMIST ,GLOBAL-OBJECTS>>>
+       <SETG CLOCK-WAIT T>
+       <TELL "[You're playing it now!]" CR>)
+       (<REMOTE-VERB?>
+       <RFALSE>)
+       (<VERB? TAKE>
+       <COND (<AND <NOT <IN? ,MOONMIST ,GLOBAL-OBJECTS>>
+                   <VISIBLE? ,MOONMIST>>
+              <PERFORM ,PRSA <LOC ,MOONMIST> ,PRSI>
+              <RTRUE>)
+             (T <YOU-CANT>)>)
+       (<NOT-HOLDING? ,PRSO>
+       <RTRUE>)
+       (<VERB? POUR PUT>
+       <COND (<AND <T? ,PRSI>
+                   <FSET? ,PRSI ,PERSONBIT>
+                   <SHOOTING ,MOONMIST>>
+              <RFATAL>)>
+       <MOVE ,MOONMIST ,LOCAL-GLOBALS ;,GLOBAL-OBJECTS>
+       <TELL CTHE ,MOONMIST " dribbles ">
+       <COND (<ZERO? ,PRSI> <TELL <GROUND-DESC>>)
+             (<NOT <FSET? ,PRSI ,SURFACEBIT>>
+              <TELL "into" THE ,PRSI>)
+             (T <TELL "on" THE ,PRSI>)>
+       <TELL ", sizzles, and evaporates." CR>)
+       (<AND <DIVESTMENT? ,MOONMIST>
+            ;<OR <NOT <VERB? PUT>>
+                <ZERO? ,PRSI>
+                <NOT <FSET? ,PRSI ,PERSONBIT>>>>
+       <PERFORM ,PRSA ,INKWELL ,PRSI>
+       <RTRUE>)
+       (<VERB? DRINK EAT>
+       <COND (<==? ,WINNER ,PLAYER>
+              <TELL
+"First it puts your tongue to sleep. Then your tummy. Then your brain.">
+              <FINISH>)>)
+       (<VERB? EXAMINE SMELL>
+       <TELL "It's a greenish liquid with a strong odor." CR>)
+       (T <SHOOTING ,MOONMIST>)>>
+][
+<OBJECT GENERIC-CLUE
+       (IN GLOBAL-OBJECTS)
+       (DESC "clue")>
+
+<OBJECT CLUE-1
+       (IN SIDEBOARD ;"BUTLER ;LOCAL-GLOBALS")
+       (DESC "first clue")
+       (ADJECTIVE FIRST 1ST ;IDENTITY CLUE PICTURE)
+       (SYNONYM CLUE CLUES CARD)
+       (GENERIC GENERIC-CLUE-FCN)
+       (FLAGS NDESCBIT ;TAKEBIT SEENBIT SECRETBIT READBIT)
+       (SIZE 1)
+       (ACTION CLUE-1-F)>
+
+;<GLOBAL CLUE-1-SHOWN:FLAG <>>
+<ROUTINE CLUE-1-F ()
+ <COND ;(<VERB? SHOW>
+       <COND (<FSET? ,PRSO ,PERSONBIT>
+              <PUT ,CLUE-1-KNOWN <GETP ,PRSO ,P?CHARACTER> T>
+              <RFALSE>)>)
+       (<VERB? COMPARE>
+       <COND (<EQUAL? ,TREASURE ,PRSO ,PRSI>
+              <TELL CTHE ,TREASURE>
+              <COND (<AND <EQUAL? ,VARIATION ,LORD-C>
+                          <NOT <FSET? ,PLAYER ,FEMALE>>>
+                     <TELL " looks just like the one on">)
+                    (T <TELL " seems to match">)>
+              <TELL " the " 'CLUE-1 "!" CR>)>)
+       (<VERB? EXAMINE READ>
+       <COND (<NOT <FSET? ,CLUE-1 ,TOUCHBIT>>
+              <TELL "You can't see its face." CR>
+              <RTRUE>)>
+       <COND (<NOT-HOLDING? ,PRSO>
+              <RTRUE>)>
+       ;<PUT ,CLUE-1-KNOWN ,PLAYER-C T>
+       <TELL "The " D ,CLUE-1 " shows ">
+       <COND (<EQUAL? ,VARIATION ,LORD-C>
+              <TELL "the King of ">
+              <COND (<FSET? ,PLAYER ,FEMALE>
+                     <TELL "Spades, holding a sceptre." CR>)
+                    (T <TELL
+"Clubs in one corner, with a picture of an African
+chief holding a " 'WAR-CLUB "; in the other corner is the King of Diamonds,
+with a picture of a crowned vulture clutching a diamond." CR>)>)
+             (<EQUAL? ,VARIATION ,FRIEND-C>
+              <COND (<FSET? ,PLAYER ,FEMALE>
+                     <TELL
+"a Polynesian diver, holding a knife and plunging
+through black water." CR>)
+                    (T <TELL "a photo of singer Pearl Bailey." CR>)>)
+             (<EQUAL? ,VARIATION ,DOCTOR-C>
+              <COND (<FSET? ,PLAYER ,FEMALE>
+                     <TELL
+D ,CASTLE ", with a cloud of mist hiding the " 'MOON "." CR>)
+                    (T <TELL
+"an Amazon hunter, aiming a " 'BLOWGUN " at the tree tops." CR>)>)
+             ;(<EQUAL? ,VARIATION ,DEALER-C>
+              <COND (<FSET? ,PLAYER ,FEMALE>
+                     <TELL
+"a coiled cobra weaving its head in time to a snake charmer's flute music."
+CR>)
+                    (T <TELL
+"a woman with yellow headband standing in front of the Sphinx." CR>)>)
+             (<EQUAL? ,VARIATION ,PAINTER-C>
+              <COND ;(<FSET? ,PLAYER ,FEMALE>
+                     <TELL
+"a man, who looks rather Chinese, peeking around a curtain." CR>)
+                    (T <TELL
+"a " 'SKELETON " in Chinese mandarin costume." CR>)>)
+             ;(<EQUAL? ,VARIATION ,OFFICER-C>
+              <COND (<FSET? ,PLAYER ,FEMALE>
+                     <TELL
+"a pigeon in flight, shot by an arrow and dripping blood." CR>)
+                    (T <TELL
+"a wintry park scene, with a thinly clad mother holding her baby and
+shivering violently. A voice balloon from her mouth says, \"BR-R-R-R!\"
+A reddish pigeon is perched on a frozen fountain nearby." CR>)>)>)>>
+
+<OBJECT CLUE-2
+       (IN LORD ;LOCAL-GLOBALS)
+       (DESC "second clue")
+       (ADJECTIVE SECOND 2ND ;LOCATION JACK\'S ;JACK HIS VIV\'S ;VIVIEN HER)
+       (SYNONYM CLUE CLUES CARD POEM)
+       (GENERIC GENERIC-CLUE-FCN)
+       (FLAGS NDESCBIT TAKEBIT SEENBIT SECRETBIT READBIT)
+       (SIZE 1)
+       (ACTION CLUE-2-F)>
+
+<ROUTINE CLUE-2-F ()
+ <COND (<VERB? EXAMINE READ>
+       <COND (<NOT-HOLDING? ,PRSO>
+              <RTRUE>)>
+       <FSET ,CLUE-2 ,TOUCHBIT>
+       <TELL CHE ,CLUE-2 " says," CR>
+       <COND (<EQUAL? ,VARIATION ,LORD-C>
+              <COND ;(<FSET? ,PLAYER ,FEMALE>
+                     <TELL
+"\"It's curtains for anyone whose head gets in the way of this!\"" CR>)
+                    (T
+                     <SETG CLUE-LOC ,CHAPEL>
+                     <TELL
+"\"Forbidden fruit tempted the very first lass.|
+'Twas once in a garden but now in a glass.\""
+;"\"Look here, friend!\"
+on an inscribed photo of British Prime Minister Neville Chamberlain
+with his famous umbrella, returning from his meeting with Hitler at
+Munich. The last stroke of the pen points to the umbrella." CR>)>)
+             (<EQUAL? ,VARIATION ,PAINTER-C>
+              <COND (<NOT <FSET? ,MUSIC ,TOUCHBIT>>
+                     <SETG CLUE-LOC ,SITTING-ROOM>)
+                    (<NOT <FSET? ,BOTTLE ,TOUCHBIT>>
+                     <SETG CLUE-LOC ,BASEMENT>)
+                    (T <SETG CLUE-LOC ,DRAWING-ROOM>)>
+              <TELL
+"\"Three fellows argued about life:|
+1. 'Using this motto, no chap can go wrong:|
+    Leave the wench and the grape, but go with a ____!'|
+2. 'On the seas of my life sails a ship that is laden|
+    Not with bottles or tunes, but with innocent ______s!'|
+3. 'Women and singing are both very fine,|
+    But for me there is nothing to equal good ____!'\"" CR>
+              ;<COND (<FSET? ,PLAYER ,FEMALE>
+                     <TELL
+"\"The Road to Mandalay is now underwater, and the only way
+to communicate is by submarine cable.\"" CR>)
+                    (T <TELL "\"Get to the root of it!\"" CR>)>)
+             (<EQUAL? ,VARIATION ,DOCTOR-C>
+              <SETG CLUE-LOC ,GAME-ROOM>
+              <TELL
+"\"My first is an 'I,' but find an 'eye' that sees not.\"" CR>)
+             (T ;<EQUAL? ,VARIATION ,FRIEND-C>
+              <COND ;(<FSET? ,PLAYER ,FEMALE>
+                     <TELL
+"\"A woman knows the secret, but to get inside her mind is difficult
+and often dangerous.\"" CR>)
+                    (T
+                     <SETG CLUE-LOC ,DECK>
+                     <TELL
+"\"... Yet the ear distinctly tells,...|
+How the danger sinks and swells,|
+By the sinking or the swelling in the anger of the ____s...\"" CR>)>)
+             ;(<EQUAL? ,VARIATION ,DEALER-C>
+              <COND (<FSET? ,PLAYER ,FEMALE>
+                     <TELL
+"\"If Cleopatra ruled the Nile, who ruled the waves -- and what did
+they have in common?\"" CR>)
+                    (T <TELL
+"\"Know ye that a woman may proudly flaunt her
+crowning glory, but the wise man keeps his under his hat.\"" CR>)>)
+             ;(<EQUAL? ,VARIATION ,OFFICER-C>
+              <COND (<FSET? ,PLAYER ,FEMALE>
+                     <TELL "[to be supplied]" CR>)
+                    (T <TELL
+"\"Too much card-playing again!\"
+It's a " 'CARTOON " of a red-eyed woozy rhino, clad in rumpled evening
+clothes and holding both front hoofs painfully to its head, obviously
+\"coming to\" after a night's hard drinking with glasses and bottles
+nearby." CR>)>)>)>>
+
+<OBJECT CLUE-3
+       (DESC "third clue")
+       (ADJECTIVE THIRD 3RD)
+       (SYNONYM CLUE CLUES CARD POEM)
+       (GENERIC GENERIC-CLUE-FCN)
+       (FLAGS NDESCBIT SECRETBIT ;TAKEBIT READBIT)
+       (SIZE 1)
+       (ACTION CLUE-3-F)>
+
+<ROUTINE CLUE-3-F ()
+ <COND (<VERB? EXAMINE READ>
+       <COND (<NOT-HOLDING? ,PRSO>
+              <RTRUE>)>
+       <FSET ,CLUE-3 ,TOUCHBIT>
+       <FSET ,CLUE-3 ,TAKEBIT>
+       <TELL CHE ,CLUE-3 " says,|">
+       <COND (<EQUAL? ,VARIATION ,LORD-C>
+              <SETG CLUE-LOC ,GARDEN>
+              <TELL
+"\"Despite its appearance, the fruit was quite sour.|
+One bite of the apple drove Eve from her bower.\"" CR>)
+             (<EQUAL? ,VARIATION ,FRIEND-C>
+              <SETG CLUE-LOC 0>
+              <TELL
+"\"... And so, all the night-tide, I lie down by the side|
+Of my darling -- my darling -- my life and my bride,...|
+In her tomb by the sounding sea.\"" CR>)
+             (<EQUAL? ,VARIATION ,DOCTOR-C>
+              <SETG CLUE-LOC ,GALLERY>
+              <TELL
+"\"My second is in never but not in ever, and lies in a hidden 'end'.\""
+;"but find" CR>)
+             (T ;<EQUAL? ,VARIATION ,PAINTER-C>
+              <SETG CLUE-LOC ,DECK>
+              <TELL
+"\"My al___ has no glamour;|
+Its '____e' tones do clam___.|
+Can you find me?\"" CR>)>)>>
+
+<OBJECT CLUE-4
+       (DESC "fourth clue")
+       (ADJECTIVE FOURTH 4TH LAST)
+       (SYNONYM CLUE CLUES CARD POEM)
+       (GENERIC GENERIC-CLUE-FCN)
+       (FLAGS NDESCBIT SECRETBIT ;TAKEBIT READBIT)
+       (SIZE 1)
+       ;(FDESC 0)
+       (ACTION CLUE-4-F)>
+
+<ROUTINE CLUE-4-F ()
+ <COND (<VERB? EXAMINE READ>
+       <COND (<NOT-HOLDING? ,PRSO>
+              <RTRUE>)>
+       <FSET ,CLUE-4 ,TOUCHBIT>
+       <FSET ,CLUE-4 ,TAKEBIT>
+       <TELL CHE ,CLUE-4 " says,|">
+       <COND (<EQUAL? ,VARIATION ,LORD-C>
+              <SETG CLUE-LOC ,FOYER>
+              <TELL
+"\"Out of the sunshine, into the rain...|
+The end of the story is... Abel and CAIN.\"|
+The last word is underlined." CR>)
+             (<EQUAL? ,VARIATION ,FRIEND-C>
+              <SETG CLUE-LOC ,BASEMENT>
+              <TELL
+"\"If you search for 'A Cask of Amontillado,' don't get
+trapped!\"" CR>)
+             (T ;<EQUAL? ,VARIATION ,DOCTOR-C>
+              <SETG CLUE-LOC ,OFFICE>
+              <TELL
+"\"My third is the silent side of knight.|
+All together I am
+what you could use for poison-pen letters.\"" CR>)>)>>
+]
+
+<ROUTINE PRINT-COLOR ("OPTIONAL" (X <>))
+ <COND (<OR <NOT <0? ,VARIATION>> .X>
+       <WORD-PRINT <GETB ,FAVE-COLOR 0> 1 ,FAVE-COLOR>
+       <COND (<T? ,COLOR-FORCED>
+              <TELL " and ">
+              <PRINTB ,COLOR-FORCED>)>
+       <RTRUE>)>>
+
+;<CONSTANT NAME-LENGTH <SETG NAME-LENGTH 39>>
+<GLOBAL FAVE-COLOR <TABLE #BYTE 3 #BYTE 114 #BYTE 101 #BYTE 100
+                               0 0 0 0 0 0 0 0 0 0 0 0 0 0>> "red"
+<GLOBAL FIRST-NAME <TABLE #BYTE 0 #BYTE 120
+                               0 0 0 0 0 0 0 0 0 0 0 0 0 0 0>> "x"
+<GLOBAL LAST-NAME  <TABLE #BYTE 0 #BYTE 116 #BYTE 101 #BYTE 115
+                                 #BYTE 116 #BYTE 101 #BYTE 114
+                               0 0 0 0 0 0 0 0 0 0 0 0>> "tester"
+
+<GLOBAL SUFFIX <TABLE #BYTE 0 #BYTE 0 0 0>>
+<CONSTANT JUNIOR-C 8>
+<CONSTANT SENIOR-C 9>
+<BUZZ JUNIOR JR SENIOR SR>
+
+<ROUTINE TELL-SUFFIX ("AUX" I (J 1))
+ <SET I <GETB ,SUFFIX 0>>
+ <COND (<0? .I>
+       <RFALSE>)>
+ <TELL ", ">
+ <COND (<==? ,JUNIOR-C .I>
+       <TELL "Junior">
+       <RTRUE>)
+       (<==? ,SENIOR-C .I>
+       <TELL "Senior">
+       <RTRUE>)>
+ <REPEAT ()
+        <PRINTC <GETB ,SUFFIX .J>>
+        <COND (<DLESS? I 1> <RTRUE>)>
+        <INC J>>>
+
+<ROUTINE TITLE-NAME ()
+       <TITLE>
+       <COND (<OR <EQUAL? ,TITLE-WORD ,W?MRS ,W?MS ,W?MISS>
+                  <EQUAL? ,TITLE-WORD ,W?MISTER ,W?MR>
+                  <EQUAL? ,TITLE-WORD ,W?DOCTOR ,W?DR>>
+              <TELL LN>)
+             (T <TELL FN>)>>
+
+<ROUTINE TITLE ()
+       <COND (<EQUAL? ,TITLE-WORD ,W?MRS>      <TELL "Mrs. ">)
+             (<EQUAL? ,TITLE-WORD ,W?MS>       <TELL "Ms. ">)
+             (<EQUAL? ,TITLE-WORD ,W?MISS>     <TELL "Miss ">)
+             (<EQUAL? ,TITLE-WORD ,W?LADY>     <TELL "Lady ">)
+             (<EQUAL? ,TITLE-WORD ,W?DAME>     <TELL "Dame ">)
+             (<EQUAL? ,TITLE-WORD ,W?MADAME ,W?MADAM>  <TELL "Madame ">)
+             (<EQUAL? ,TITLE-WORD ,W?DOCTOR ,W?DR>     <TELL "Dr. ">)
+             (<EQUAL? ,TITLE-WORD ,W?LORD>     <TELL "Lord ">)
+             (<EQUAL? ,TITLE-WORD ,W?SIR>      <TELL "Sir ">)
+             (<EQUAL? ,TITLE-WORD ,W?MISTER ,W?MR>     <TELL "Mr. ">)
+             (<EQUAL? ,TITLE-WORD ,W?MASTER>           <TELL "Master ">)>>
+
+<ROUTINE NON-BLANK-STUFF (DEST SRC CNT "AUX" (ND 1) (NS 0) B (OB 32))
+ <DEC CNT>
+ <REPEAT ()
+       <SET B <GETB .SRC .NS>>
+       <COND (<NOT <AND <==? .B 32>
+                        <OR <==? .NS .CNT> <==? .OB 32>>>>
+              <PUTB .DEST .ND .B>
+              <INC ND>
+              <SET OB .B>)>
+       <COND (<IGRTR? NS .CNT> <RETURN>)>>
+ <PUTB .DEST 0 <- .ND 1>>>
+
+<GLOBAL GENDER-KNOWN:FLAG <>>
+
+<ROUTINE FULL-NAME ("OPT" (NO-TELL <>))
+       <PUTB ,SUFFIX 0 0>
+       <PUTB ,LAST-NAME 0 0>
+       <SETG MIDDLE-WORD 0>
+       <SETG TITLE-WORD 0>
+       <COND (<ZERO? .NO-TELL>
+              <TELL "\"I said: Please state your full name.\"" CR>)>
+       <RTRUE>>
+
+<GLOBAL MIDDLE-WORD 0>
+
+<ROUTINE GET-NAME ("AUX" NUM N M I BEG END)
+  <PUTB ,P-INBUF 0 30> ;"for CoCo"
+  <REPEAT ()
+       <TELL !\>>
+       <READ ,P-INBUF ,P-LEXV>
+       <SET NUM <GETB ,P-LEXV ,P-LEXWORDS>>
+       <COND (<0? .NUM>
+              <TELL !\" ,BEG-PARDON "\" ">
+              <AGAIN>)>
+       <SET N ,P-LEXSTART>
+       <SET BEG <GET ,P-LEXV .N>>
+       <COND (<TITLE-NOUN? .BEG>
+              <DEC NUM>        ;"We found a title!"
+              <SET N <+ .N ,P-LEXELEN>>
+              <SETG TITLE-WORD .BEG>
+              <COND (<AND ;<NOT <EQUAL? .BEG ,W?LT>>
+                          <NOT <EQUAL? .BEG ,W?DOCTOR ,W?DR ,W?DETECT>>>
+                     <SETG GENDER-KNOWN T>)>   ;"And a gender!"
+              <COND (<OR <EQUAL? .BEG ,W?MR ,W?MISTER ,W?MASTER>
+                         <EQUAL? .BEG ,W?LORD ,W?SIR>>
+                     ;<TAILOR-OUTFITS ,P?EAST>
+                     <FCLEAR ,PLAYER ,FEMALE>)
+                    ;(T
+                     <TAILOR-OUTFITS ,P?WEST>)>
+              <REPEAT ()       ;"Skip over period(s) after title."
+                      <COND (<EQUAL? <GET ,P-LEXV .N> ,W?PERIOD>
+                             <DEC NUM>
+                             <SET N <+ .N ,P-LEXELEN>>)
+                            (T <RETURN>)>>)>
+       <COND (<L? .NUM 2>      ;"Too few words?"
+              <COND (<EQUAL? .BEG ,W?QUIT ,W?Q>
+                     <V-QUIT>)
+                    (<EQUAL? .BEG ,W?RESTART>
+                     <V-RESTART>)
+                    (<EQUAL? .BEG ,W?RESTORE>
+                     <V-RESTORE>)>
+              <FULL-NAME>
+              <AGAIN>)>
+       ;%<DEBUG-CODE <COND (,DBUG <TELL !\{ N .NUM " tokens}" CR>)>>
+       <SET BEG .N>                                    ;"1st word"
+       <SET END <+ .N <* ,P-LEXELEN <- .NUM 1>>>>      ;"last word"
+       <REPEAT ()      ;"Ignore final punctuation."
+               <COND (<EQUAL? <GET ,P-LEXV .END> ,W?PERIOD ,W?\! ,W??>
+                      ;<DEC NUM>
+                      <SET END <- .END ,P-LEXELEN>>)
+                     (T <RETURN>)>>
+       <COND (<G=? .BEG .END>  ;"Too few words?"
+              <FULL-NAME>
+              <AGAIN>)>
+       <COND (<EQUAL? <GET ,P-LEXV .END> ,W?SR ,W?SENIOR>
+              <SET END <- .END ,P-LEXELEN>>
+              <PUTB ,SUFFIX 0 ,SENIOR-C>)
+             (<EQUAL? <GET ,P-LEXV .END> ,W?JR ,W?JUNIOR>
+              <SET END <- .END ,P-LEXELEN>>
+              <PUTB ,SUFFIX 0 ,JUNIOR-C>)
+             (<L? <SET NUM <GETB ,P-LEXV <SET N <* 2 <+ .END 1>>>>> 6>
+                       ;"no. chars in last word"
+              <SET M <GETB ,P-LEXV <+ 1 .N>>>  ;"start of last word"
+              <SET I 0>
+              <REPEAT ()
+                      <COND (<NOT <DLESS? NUM 0>>
+                             <COND (<NOT <EQUAL? <GETB ,P-INBUF .M>
+                                                 %<ASCII !\i>
+                                                 %<ASCII !\v>
+                                                 %<ASCII !\x>>>
+                                    <RETURN>)>
+                             <INC I>
+                             <PUTB ,SUFFIX .I <- <GETB ,P-INBUF .M> 32>>
+                             <INC M>)
+                            (T
+                             <PUTB ,SUFFIX 0 .I>
+                             <SET END <- .END ,P-LEXELEN>> ;"back over suffix"
+                             <RETURN>)>>)>
+       <REPEAT ()      ;"Ignore pre-suffix punctuation."
+               <COND (<EQUAL? <GET ,P-LEXV .END> ,W?PERIOD ,W?COMMA ,W?THE>
+                      <SET END <- .END ,P-LEXELEN>>)
+                     (T <RETURN>)>>
+       <COND (<G=? .BEG .END>  ;"Too few words?"
+              <FULL-NAME>
+              <AGAIN>)>
+       <SET N <* 2 <+ .END 1>>>
+       <SET NUM <GETB ,P-LEXV .N>>     ;"no. chars in last word"
+       <SET END <- .END ,P-LEXELEN>>   ;"penultimate word"
+       <COND (<EQUAL? <GET ,P-LEXV .END> ,W?APOSTROPHE>
+              <SET END <- .END ,P-LEXELEN>>    ;"antepenultimate word"
+              <SET N <* 2 <+ .END 1>>>         ;"update"
+              <SET NUM <+ .NUM <GETB ,P-LEXV .N>>>
+              <INC NUM>                ;"for apostrophe")>
+       <COND (<G? .BEG .END>   ;"Too few words?"
+              <FULL-NAME>
+              <AGAIN>)>
+       <SET I <+ .BEG ,P-LEXELEN>>     ;"second word"
+       <REPEAT ()
+               <COND (<G? .I .END>
+                      <SETG MIDDLE-WORD 0>
+                      <RETURN>)
+                     (<NOT <EQUAL? <SET M <GET ,P-LEXV .I>>
+                                   ,W?THE ,W?OF ,W?COMMA>>
+                      <SET I <+ .I ,P-LEXELEN>>)
+                     (T
+                      <SETG MIDDLE-WORD .M>
+                      <SET M <* 2 <+ 1 <+ .I ,P-LEXELEN>>>>;"1st wd last name"
+                      <SET NUM <+ .NUM <- <GETB ,P-LEXV <+ 1 .N>>
+                                          <GETB ,P-LEXV <+ 1 .M>>>>>
+                      <SET N .M>
+                      <RETURN>)>>
+       ;<COND (<G? .NUM ,NAME-LENGTH>
+              <SET NUM ,NAME-LENGTH>)>
+       <NON-BLANK-STUFF ,LAST-NAME     ;"Copy last name"
+                        <REST ,P-INBUF <GETB ,P-LEXV <+ 1 .N>>>
+                        .NUM>
+       <SET N <- .N ,P-WORDLEN>>               ;"last token in 1st name"
+       ;<SET END <- <GETB ,P-LEXV <+ 1 .N>> 2>>;"last char in 1st name"
+       <COND (<T? ,MIDDLE-WORD>
+              <SET N <- .N ,P-WORDLEN>>
+              ;<SET END <- .END <+ 1 <GETB ,P-LEXV <- .M ,P-WORDLEN>>>>>)>
+       <SET BEG <GETB ,P-LEXV <+ 3 <* 2 .BEG>>>>;"1st char in 1st name"
+       <SET END <+ -1 <+ <GETB ,P-LEXV .N> <GETB ,P-LEXV <+ 1 .N>>>>>
+                                               ;"last char in 1st name"
+       <SET N <+ 1 <- .END .BEG>>>             ;"no. chars in 1st name"
+       ;<COND (<G? .N ,NAME-LENGTH>
+              <SET N ,NAME-LENGTH>)>
+       <NON-BLANK-STUFF ,FIRST-NAME    ;"Copy 1st name"
+                        <REST ,P-INBUF .BEG ;<GETB ,P-LEXV <- .N 1>>>
+                        .N>
+       <TELL "\"Did you say your name is ">
+       <TELL-FULL-NAME>
+       <TELL "?\"">
+       <COND (<YES?>
+              <PUTB ,P-INBUF 0 80>
+              <RETURN>)
+             (T
+              <TELL "\"Then please speak up.\"|">
+              <FULL-NAME T>)>>>
+
+<BUZZ ;"DUKE DUCHESS" DAME MADAME ;MASTER>
+<GLOBAL TITLE-WORD 0>
+
+<ROUTINE PRINT-NAME (TBL "AUX" (PTR 0) LEN CH OCH (SP? T))
+        <SET LEN <GETB .TBL 0>>
+        <REPEAT ()
+               <COND (<IGRTR? PTR .LEN> <RETURN>)>
+               <SET OCH .CH>
+               <SET CH <GETB .TBL .PTR>>
+               <COND (<OR <L? .CH 97> <G? .CH 122>>
+                      <PRINTC .CH>)
+                     (<T? .SP?>
+                      <PRINTC <- .CH 32>>)
+                     (<OR <NOT <EQUAL? .OCH 39>>       ;"'"
+                          <EQUAL? .PTR .LEN>
+                          <EQUAL? 32 <GETB .TBL <+ 1 .PTR>>>>
+                      <PRINTC .CH>)
+                     (T <PRINTC <- .CH 32>>)>
+               <COND (<OR <EQUAL? .CH 32 46>   ;" ."
+                          <EQUAL? .CH 45 38>>  ;"-&"
+                      <SET SP? T>)
+                     (T <SET SP? <>>)>>
+        <COND (<EQUAL? .CH 46> <RFALSE>)       ;"Don't TELL period next."
+              (T <RTRUE>)>>
diff --git a/goal.zil b/goal.zil
new file mode 100644 (file)
index 0000000..ae8b5f9
--- /dev/null
+++ b/goal.zil
@@ -0,0 +1,2017 @@
+"GOAL for MOONMIST
+Copyright (C) 1986 Infocom, Inc.  All rights reserved."
+
+"Rapid Transit Line Definitions and Identifiers"
+
+<CONSTANT MAIN-LINE-C 1>
+<CONSTANT BED-LINE-C 2>
+<CONSTANT TOWER-LINE-C 3>
+<CONSTANT PASS-LINE-C 4>
+<CONSTANT GOAL-I-MULTIPLIER 8> "<* 2 ,NUMBER-OF-LINES>"
+
+<GLOBAL MAIN-LINE
+       <PTABLE 0       GARDEN          P?OUT
+               P?IN    MAZE            P?OUT
+               P?EAST  COURTYARD       P?SOUTH
+               P?NORTH FOYER           P?SOUTH
+               P?NORTH GREAT-HALL      P?WEST
+               P?EAST  CORR-1          P?NORTH
+               P?SOUTH DINING-ROOM     P?IN
+               P?OUT   BACKSTAIRS      P?DOWN
+               P?UP    KITCHEN         0>>
+
+<GLOBAL BED-LINE
+       <PTABLE 0       WEST-HALL       P?SOUTH
+               P?NW    GALLERY         P?NE
+               P?SOUTH EAST-HALL       0>>
+
+<GLOBAL TOWER-LINE
+       <PTABLE 0       LOVER-PATH      P?IN
+               P?NW    DUNGEON         P?EAST
+               P?WEST  BASEMENT        P?UP
+               P?DOWN  JUNCTION        P?WEST
+               P?EAST  OLD-GREAT-HALL  P?UP
+               P?DOWN  CORR-2          P?UP
+               P?DOWN  CORR-3          P?UP
+               P?DOWN  DECK            0>>
+
+<GLOBAL PASS-LINE
+       <PTABLE 0       SECRET-LANDING-JACK     P?DOWN
+               P?WEST  PASSAGE-1               P?UP
+               P?DOWN  SECRET-LANDING-TAM      P?NORTH
+               P?SOUTH SECRET-LANDING-LIB      P?EAST
+               P?WEST  SECRET-IAN-PASSAGE      P?EAST
+               P?WEST  HYDE-CLOSET             P?EAST
+               P?WEST  MIDPOINT                P?EAST
+               P?WEST  WENDISH-CORNER          P?EAST
+               P?NORTH IRIS-CLOSET             P?SOUTH
+               P?NORTH YOUR-CLOSET             P?DOWN
+               P?UP    DRAWING-CLOSET          0>>
+
+<GLOBAL TRANSFER-TABLE
+       <PTABLE 0               0               ;"transfers from MAIN-LINE"
+               GREAT-HALL      GALLERY
+               CORR-1          JUNCTION
+               GREAT-HALL      GALLERY
+
+               GALLERY         GREAT-HALL      ;"transfers from BED-LINE"
+               0               0
+               GALLERY         GREAT-HALL
+               YOUR-ROOM       YOUR-CLOSET
+
+               JUNCTION        CORR-1          ;"transfers from TOWER-LINE"
+               JUNCTION        CORR-1
+               0               0
+               LIBRARY         SECRET-LANDING-LIB
+
+               YOUR-CLOSET     YOUR-ROOM       ;"transfers from PASS-LINE"
+               YOUR-CLOSET     YOUR-ROOM
+               SECRET-LANDING-LIB      LIBRARY
+               0               0>>
+\f
+"CODE"
+
+<ROUTINE FOLLOW-GOAL (PERSON
+                     "AUX" (HEER <LOC .PERSON>) GT GOAL FLG (IGOAL <>) X)
+        <COND (<NOT <IN? .HEER ,ROOMS>>
+               <SET HEER <META-LOC .HEER>>
+               <MOVE .PERSON .HEER>)>
+        <SET GT <GT-O .PERSON>>
+        <COND (<==? .HEER <GET .GT ,GOAL-F>>
+               <RETURN <GOAL-REACHED .PERSON>>)
+              (<ZERO? <GET .GT ,GOAL-ENABLE>>
+               <RFALSE>)>
+        <SET IGOAL <GET .GT ,GOAL-I>>
+        <SET GOAL <GET ,TRANSFER-TABLE .IGOAL>>
+        <COND (<ZERO? .GOAL>
+               <SET IGOAL <>>
+               <SET GOAL <GET .GT ,GOAL-S>>)>
+        <SET X <GETP .HEER ,P?STATION>>
+        <COND (<NOT <EQUAL? .HEER .GOAL .X>>
+               %<DEBUG-CODE <COND (<ZERO? .X>
+                                   <SET X .HEER>
+                                   <TELL "{!! NO STATION AT " D .HEER "}|">)>>
+               <RETURN <MOVE-PERSON .PERSON .X>>)
+              (<NOT .GOAL>
+               <RFALSE>)
+              (<==? .HEER .GOAL>
+               <COND (.IGOAL
+                      <SET FLG <GET ,TRANSFER-TABLE <+ .IGOAL 1>>>
+                      %<DEBUG-CODE
+                        <COND (<ZERO? .FLG>
+                               <SET FLG .HEER>
+                               <TELL "{!! NO TRANSFER #" N .IGOAL "}|">)>>
+                      <SET FLG <MOVE-PERSON .PERSON .FLG>>
+                      <ESTABLISH-GOAL .PERSON <GET .GT ,GOAL-F>>
+                      <RETURN .FLG>)
+                     (<NOT <==? .HEER <SET FLG <GET .GT ,GOAL-F>>>>
+                      <RETURN <MOVE-PERSON .PERSON .FLG>>)
+                     (T
+                      <RETURN <GOAL-REACHED .PERSON>>)>)
+              (<==? .HEER <GETP .GOAL ,P?STATION>>
+               <RETURN <MOVE-PERSON .PERSON .GOAL>>)>
+        <SET FLG <FOLLOW-GOAL-NEXT .HEER .GOAL ;.PERSON>>
+        <MOVE-PERSON .PERSON .FLG>>
+
+<ROUTINE FOLLOW-GOAL-NEXT (HEER GOAL
+                          "AUX" LINE (CNT 1) RM (GOAL-FLAG <>) LOC G)
+        <SET LINE <GET-LINE <GETP .GOAL ,P?LINE>>>
+        <SET G <GETP .GOAL ,P?STATION>>
+        <REPEAT ()
+                <SET RM <GET .LINE .CNT>>
+                <COND (<==? .RM .HEER>
+                       <COND (.GOAL-FLAG
+                              <SET LOC <GET .LINE <- .CNT 3>>>)
+                             (T
+                              <SET LOC <GET .LINE <+ .CNT 3>>>)>
+                       <RETURN .LOC>)
+                      (<==? .RM .G>
+                       <SET GOAL-FLAG T>)>
+                <SET CNT <+ .CNT 3>>>>
+
+<ROUTINE GET-LINE (LN)
+        <COND (<==? .LN ,MAIN-LINE-C>  ,MAIN-LINE)
+              (<==? .LN ,BED-LINE-C>   ,BED-LINE)
+              (<==? .LN ,TOWER-LINE-C> ,TOWER-LINE)
+              (<==? .LN ,PASS-LINE-C>  ,PASS-LINE)>>
+
+<ROUTINE IN-MOTION? (PERSON "OPTIONAL" (DISABLED-OK <>) "AUX" GT L F C)
+       <SET C <GETP .PERSON ,P?CHARACTER>>
+       <SET GT <GET ,GOAL-TABLES .C>>
+       <COND (<AND <EQUAL? .PERSON ,BUTLER>
+                   <BTST ,PRESENT-TIME 1>
+                   <ZERO? .DISABLED-OK>>
+              <RFALSE>)
+             (<AND <GET .GT ,GOAL-S>
+                   <NOT <==? <SET L <LOC .PERSON>>
+                             <SET F <GET .GT ,GOAL-F>>>>>
+              <COND (.DISABLED-OK <RTRUE>)
+                    (<NOT <ZERO? <GET .GT ,GOAL-ENABLE>>>
+                     <RTRUE>
+                     ;<FOLLOW-GOAL-DIR .L .F .PERSON>)>)>>
+\f
+"Movement etc."
+
+<ROUTINE ESTABLISH-GOAL (PERSON GOAL "OPTIONAL" (SPEED 1) "AUX" LOCN GT)
+        ;%<DEBUG-CODE
+          <COND (<ZERO? .PERSON>
+                 <TELL "{!! E-G: PERSON=0, GOAL=" D .GOAL ".}|">)>>
+        <SET LOCN <LOC .PERSON>>
+        <COND (<==? .LOCN .GOAL>
+               <RETURN <GOAL-REACHED .PERSON>>)>
+        <COND (<EQUAL? .PERSON ,CONFESSED ,CAPTOR>
+               <RETURN .LOCN>)>
+        ;%<DEBUG-CODE
+          <COND (<ZERO? <GETP .LOCN ,P?LINE>>
+                 <TELL
+"{!! E-G: PERSON=" D .PERSON ", LOCN=" D .LOCN ", GOAL=" D .GOAL ".}|">)>>
+        ;%<DEBUG-CODE
+          <COND (<ZERO? <GETP .GOAL ,P?LINE>>
+                 <TELL
+"{!! E-G: PERSON=" D .PERSON", GOAL=" D .GOAL ".}|">)>>
+        <SET GT <GT-O .PERSON>>
+        <PUT .GT ,GOAL-I <+ <* <- <GETP .LOCN ,P?LINE> 1> ,GOAL-I-MULTIPLIER>
+                            <* <- <GETP .GOAL ,P?LINE> 1> 2>>>
+        <PUT .GT ,GOAL-S <GETP .GOAL ,P?STATION>>
+        <PUT .GT ,GOAL-F .GOAL>
+        <PUT .GT ,GOAL-ENABLE .SPEED>
+        .LOCN>
+
+<GLOBAL GOAL-PERSON:OBJECT <>>
+<ROUTINE GOAL-REACHED (PERSON "AUX" GT (VAL <>))
+       <SET GT <GT-O .PERSON>>
+       ;<COND (<ZERO? <GET .GT ,GOAL-S>> <RFALSE>)>
+       <PUT .GT ,GOAL-S <>>
+       <PUTP .PERSON ,P?LDESC 0> ;"default desc"
+       <COND (<NOT <CREEPY? <SET VAL <META-LOC .PERSON>>>>
+              <FSET .VAL ,ONBIT>)>
+       <SETG GOAL-PERSON .PERSON>
+       <SET VAL <D-APPLY "Reached" <GET .GT ,GOAL-FUNCTION> ,G-REACHED>>
+       <COND (<T? .VAL> <RETURN .VAL>)
+             (<AND <IN? .PERSON ,HERE>
+                   <NOT <FSET? .PERSON ,TOUCHBIT>>>
+              <APPLY <GETP .PERSON ,P?DESCFCN> ,M-OBJDESC>)>>
+
+<ROUTINE ENTERS? (DIR WHERE)
+ <COND (<==? .DIR ,P?IN>
+       <RTRUE>)
+       (<FSET? .WHERE ,TOUCHBIT>
+       <RTRUE>)>>
+
+<ROUTINE TELL-OPEN-DOOR () <TELL " opens the door for a moment and">>
+
+<ROUTINE TELL-HIS-HER-BEDROOM (CHR WHERE)
+       <COND (<==? .CHR ,BUTLER-C>
+              <TELL THE .WHERE>
+              <RTRUE>)>
+       <INC CHR>
+       <COND (<NOT <EQUAL? .WHERE <GET ,CHAR-ROOM-TABLE .CHR>
+                                  <GET ,CHAR-CLOSET-TABLE .CHR>>>
+              <TELL THE .WHERE>
+              <RTRUE>)>
+       <TELL " h">
+       <COND (<FSET? <GET ,CHARACTER-TABLE <- .CHR 1>> ,FEMALE>
+              <TELL "er ">)
+             (T <TELL "is ">)>
+       <COND (<FSET? .WHERE ,SECRETBIT>
+              <TELL "entrance">)
+             (T <TELL "bedroom">)>>
+
+<ROUTINE TELL-LOCKING-THE-DOOR (DOOR)
+       <COND (<AND <T? .DOOR> <FSET? .DOOR ,LOCKED>>
+              <TELL ", locking the door">)>>
+
+<ROUTINE MOVE-PERSON (PERSON WHERE
+                 "AUX" DIR EDIR (GT <>) OL COR PCOR CHR (DOOR <>) (VAL <>) X)
+        <COND (<FSET? .PERSON ,MUNGBIT>
+               <RFALSE>)
+              (<EQUAL? .PERSON ,CONFESSED ,CAPTOR ,FOLLOWER>
+               <RFALSE>)
+              (<AND <EQUAL? .PERSON ,BUTLER>
+                    <OR <EQUAL? ,AWAITING-REPLY ,BUTLER-1-R ,BUTLER-2-R>
+                        <EQUAL? ,AWAITING-REPLY ,BUTLER-3-R ,BUTLER-4-R>>>
+               <RFALSE>)>
+        <PUTP .PERSON ,P?LDESC 6 ;"walking along">
+        <COND (<AND <EQUAL? .PERSON ,BUTLER>
+                    <BTST ,PRESENT-TIME 1>>
+               <RFALSE>)>
+        <SET CHR <GETP .PERSON ,P?CHARACTER>>
+        <SET GT <GET ,GOAL-TABLES .CHR>>
+        <SET OL <LOC .PERSON>>
+        <SET DIR <DIR-FROM .OL .WHERE>>
+        <SET EDIR <COMPASS-EQV .OL .DIR>>
+        <SETG GOAL-PERSON .PERSON>
+        <COND (<AND <NOT <ZERO? .DIR>>
+                    <SET X <GETPT .OL .DIR>>
+                    <==? <PTSIZE .X> ,DEXIT>>
+               <SET DOOR <GET-DOOR-OBJ .X>>)>
+        <SET PCOR <CORRIDOR-LOOK .PERSON>>
+        <COND (<==? ,M-FATAL <D-APPLY "Enroute" <GET .GT ,GOAL-FUNCTION>
+                                                ,G-ENROUTE>>
+               <THIS-IS-IT .PERSON>
+               <RFATAL>)
+              (<EQUAL? .PERSON ,PLAYER>
+               <COND (.DOOR
+                      <FSET .DOOR ,SEENBIT>
+                      <COND (<NOT <WALK-THRU-DOOR? .X>>
+                             <RFATAL>)>)>)
+              (<AND <T? ,NOW-WEARING>
+                    <OR <ZERO? ,LIT>
+                        <FSET? .PERSON ,NDESCBIT>>>
+               T)
+              (<==? .OL ,HERE>
+               <SET VAL T>
+               <TELL CHE .PERSON>
+               <COND (<AND <T? .DOOR>
+                           <NOT <FSET? .DOOR ,OPENBIT>>>
+                      <FSET .DOOR ,TOUCHBIT ;,SEENBIT>
+                      <TELL-OPEN-DOOR>)>
+               <COND (<==? .DIR ,P?OUT>
+                      <TELL " leaves.|">)
+                     (<ENTERS? .DIR .WHERE>
+                      <TELL " enters">
+                      <TELL-HIS-HER-BEDROOM .CHR .WHERE>
+                      <TELL-LOCKING-THE-DOOR .DOOR>
+                      <TELL ".|">)
+                     (T
+                      <TELL " walks ">
+                      <COND (<EQUAL? .DIR ,P?UP ,P?DOWN>
+                             <DIR-PRINT .DIR>)
+                            (<FSET? .WHERE ,TOUCHBIT>
+                             <TELL "to">
+                             <TELL-HIS-HER-BEDROOM .CHR .WHERE>)
+                            (T
+                             <DIR-PRINT .EDIR>)>
+                      <TELL-LOCKING-THE-DOOR .DOOR>
+                      <TELL ".|">)>)
+              (<==? .WHERE ,HERE>
+               <COND (<ZERO? ,NOW-WEARING>
+                      <TELL
+"When you hear the door begin to open, you" ,REMEMBER-NOT-DRESSED " and
+hop into " 'YOUR-BATHROOM ".|">
+                      <GOTO ,YOUR-BATHROOM>
+                      <SET VAL ,M-FATAL>)
+                     (<OR <NOT .GT>
+                          <NOT <==? ,HERE <GET .GT ,GOAL-F>>>>
+                      <SET VAL T>
+                      <START-SENTENCE .PERSON>
+                      <COND (<AND <T? .DOOR>
+                                  <NOT <FSET? .DOOR ,OPENBIT>>>
+                             <FSET .DOOR ,TOUCHBIT ;,SEENBIT>
+                             <TELL-OPEN-DOOR>)>
+                      <COND (<AND <VERB? WALK>
+                                  <==? .OL ,OHERE>>
+                             <TELL " follows you">)
+                            (T
+                             <TELL " walks past you from">
+                             <COND (<EQUAL? .DIR ,P?UP ,P?DOWN>
+                                    <TELL !\ >
+                                    <DIR-PRINT <OPP-DIR .DIR>>)
+                                   (T
+                                    <TELL-HIS-HER-BEDROOM .CHR .OL>)>)>
+                      <TELL ".|">)>)
+              (<SET COR <GETP ,HERE ,P?CORRIDOR>>
+               <COND (<NOT <ZERO? .PCOR>>
+                      <COND (<ZERO? <CORRIDOR-LOOK .WHERE>>
+                             <SET VAL T>
+                             <COND (<AND <EQUAL? .PERSON ,P-HER-OBJECT>
+                                         <FSET? ,HER ,TOUCHBIT>>
+                                    <TELL "She">)
+                                   (<AND <EQUAL? .PERSON ,P-HIM-OBJECT>
+                                         <FSET? ,HIM ,TOUCHBIT>>
+                                    <TELL "He">)
+                                   (T
+                                    <START-SENTENCE .PERSON>
+                                    <TELL !\,>
+                                    <WHERE? .PERSON .PCOR>
+                                    <TELL !\,>)>
+                             <COND (<AND <T? .DOOR>
+                                         <NOT <FSET? .DOOR ,OPENBIT>>>
+                                    <FSET .DOOR ,TOUCHBIT ;,SEENBIT>
+                                    <TELL-OPEN-DOOR>)>
+                             <COND (<ENTERS? .DIR .WHERE>
+                                    <TELL " enters">
+                                    <TELL-HIS-HER-BEDROOM .CHR .WHERE>)
+                                   (T
+                                    <TELL " disappears ">
+                                    <COND (<NOT <EQUAL? .DIR ,P?UP ,P?DOWN>>
+                                           <TELL "to the ">)>
+                                    <DIR-PRINT .EDIR>)>
+                             <TELL-LOCKING-THE-DOOR .DOOR>
+                             <TELL ".|">)
+                            (T
+                             <SET VAL T>
+                             <START-SENTENCE .PERSON>
+                             <TELL " is">
+                             <WHERE? .PERSON .PCOR>
+                             <TELL ", heading ">
+                             <COND (<==? .PCOR .DIR>
+                                    <TELL "away from you">)
+                                   (<==? .PCOR <OPP-DIR .DIR>>
+                                    <TELL "toward you">)
+                                   (T
+                                    <COND (<NOT <EQUAL? .DIR ,P?UP ,P?DOWN>>
+                                           <TELL "toward the ">)>
+                                    <DIR-PRINT .EDIR>)>
+                             <TELL ".|">)>)
+                     (<T? <SET PCOR <CORRIDOR-LOOK .WHERE>>>
+                      <SET VAL T>
+                      <WHERE? .PERSON .PCOR T>
+                      <TELL HE .PERSON appear>
+                      <SET DIR <COMPASS-EQV ,HERE <DIR-FROM .WHERE .OL>>>
+                      <COND (<NOT <EQUAL? .DIR ,P?IN>>
+                             <TELL " from">
+                             <TELL-HIS-HER-BEDROOM .CHR .OL>)>
+                      <TELL ".|">)>)>
+       <COND (<AND .VAL
+                   <IN? ,LUGGAGE .PERSON>
+                   <T? ,NOW-WEARING>
+                   ;<==? ,HERE .WHERE>>
+              <TELL CHE .PERSON is " carrying " D ,LUGGAGE ".|">)>
+       <COND (<T? .PERSON> <MOVE .PERSON .WHERE>)>
+       <COND (.GT
+              <COND (<==? <GET .GT ,GOAL-F> .WHERE>
+                     <SET X <GOAL-REACHED .PERSON>>
+                     <COND (<AND <ZERO? .X>
+                                 <==? ,HERE .WHERE>
+                                 <NOT <FSET? .PERSON ,NDESCBIT>>>
+                            <SET VAL T>
+                            <TELL CHE .PERSON " enters and nods to you." CR>)
+                           (<AND <T? .X>
+                                 <NOT <==? .VAL ,M-FATAL>>>
+                            <SET VAL .X>)>)
+                    (T
+                     <SET X <D-APPLY "Enroute" <GET .GT ,GOAL-FUNCTION>
+                                               ,G-ENROUTE>>
+                     <COND (<AND <ZERO? .X>
+                                 <IN? .PERSON ,HERE>
+                                 <NOT <FSET? .PERSON ,TOUCHBIT>>>
+                            <COND (<SET X <APPLY <GETP .PERSON ,P?DESCFCN>
+                                                 ,M-OBJDESC>>
+                                   <SET VAL T>)>)
+                           (<AND <T? .X>
+                                 <NOT <==? .VAL ,M-FATAL>>>
+                            <SET VAL .X>)>)>)>
+       ;%<DEBUG-CODE <COND (,DBUG
+                           <TELL !\{>
+                           <TELL-$WHERE .PERSON .WHERE>
+                           <TELL "}|">)>>
+       <COND (<T? .VAL>
+              <THIS-IS-IT .PERSON>
+              <COND (<NOT <==? .VAL ,M-FATAL>>
+                     <FSET .WHERE ,SEENBIT>    ;"so FOLLOW CHR works"
+                     <PUT ,FOLLOW-LOC .CHR .WHERE>)>
+              <RETURN .VAL>)>>
+
+"? combine next two routines?"
+
+<ROUTINE COMPASS-EQV (RM DIR "AUX" DIRTBL DIRL P L TBL (VAL <>))
+ <COND ;(<ZERO? .DIR> <RFALSE>)
+       (<AND <NOT <EQUAL? .DIR ,P?UP ,P?DOWN>>
+            <NOT <EQUAL? .DIR ,P?IN ,P?OUT>>>
+       <RETURN .DIR>)>
+ <SET DIRTBL <GETPT .RM .DIR>>
+ <SET DIRL <PTSIZE .DIRTBL>>
+ <SET P 0>
+ <REPEAT ()
+        <COND (.VAL <RETURN .VAL>)
+              (<0? <SET P <NEXTP .RM .P>>> <RFALSE>)
+              (<NOT <L? .P ,LOW-DIRECTION>>
+               <SET TBL <GETPT .RM .P>>
+               <SET L <PTSIZE .TBL>>
+               <COND (<NOT <==? .L .DIRL>> <AGAIN>)>
+               <DEC L>
+               <REPEAT ()
+                       <COND (<NOT <==? <GETB .TBL .L> <GETB .DIRTBL .L>>>
+                              <RETURN>)
+                             (<DLESS? L 0>
+                              <SET VAL .P>
+                              <RETURN>)>>)>>>
+
+<ROUTINE DIR-EQV? (RM DIR1 DIR2 "AUX" DIR1TBL DIR2TBL L)
+       <COND (<==? .DIR1 .DIR2>
+              <RTRUE>)
+             (<ZERO? <SET DIR1TBL <GETPT .RM .DIR1>>>
+              <RFALSE>)
+             (<ZERO? <SET DIR2TBL <GETPT .RM .DIR2>>>
+              <RFALSE>)>
+       <SET L <PTSIZE .DIR1TBL>>
+       <COND (<NOT <==? .L <PTSIZE .DIR2TBL>>>
+              <RFALSE>)>
+       <DEC L>
+       <REPEAT ()
+               <COND (<NOT <==? <GETB .DIR1TBL .L> <GETB .DIR2TBL .L>>>
+                      <RFALSE>)
+                     (<DLESS? L 0>
+                      <RTRUE>)>>>
+
+<ROUTINE DIR-FROM (HERE THERE "AUX" (V <>) P D)
+ <COND (<DIR-FROM-TEST .HERE .THERE ,P?UP>     <RETURN ,P?UP>)
+       (<DIR-FROM-TEST .HERE .THERE ,P?DOWN>   <RETURN ,P?DOWN>)
+       (<DIR-FROM-TEST .HERE .THERE ,P?IN>     <RETURN ,P?IN>)
+       (<DIR-FROM-TEST .HERE .THERE ,P?OUT>    <RETURN ,P?OUT>)>
+ <SET P 0>
+ <REPEAT ()
+        <COND (<L? <SET P <NEXTP .HERE .P>> ,LOW-DIRECTION>
+               <RETURN .V>)
+              (<SET D <DIR-FROM-TEST .HERE .THERE .P>>
+               <COND (<AND <L? .D ,LOW-DIRECTION> <NOT .V>>
+                      <SET V .P>)
+                     (T <RETURN .P>)>)>>>
+
+<ROUTINE DIR-FROM-TEST (HERE THERE P "AUX" L TBL)
+       <COND (<ZERO? <SET TBL <GETPT .HERE .P>>>
+              <RFALSE>)>
+       <SET L <PTSIZE .TBL>>
+       <COND (<AND <EQUAL? .L ,DEXIT ,UEXIT ,CEXIT>
+                   <==? <GET-REXIT-ROOM .TBL> .THERE>>
+              <RETURN .P>)>>
+\f
+"These routines were moved to low addresses in MISC: I-FOLLOW I-ATTENTION."
+
+<ROUTINE I-PLAYER (ARG "AUX" (VAL <>))
+  <SETG HERE <LOC ,PLAYER>>
+  <COND (<==? .ARG ,G-REACHED>
+        <MAKE-ALL-PEOPLE -12 ;"listening to you">
+        <RTRUE>)
+       (<==? .ARG ,G-ENROUTE>
+        %<DEBUG-CODE <COND (<T? ,DBUG> <RFALSE>)>>
+        <COND (<==? ,OHERE ,HERE>
+               <RFALSE>)
+              (<OR <ZERO? <LIT?>>
+                   <EQUAL? ,HERE ,MAZE>
+                   <AND <FSET? <SET VAL ,HERE> ,SECRETBIT>
+                        <NOT <FSET? ,HERE ,SEENBIT>>>
+                   <AND <PROB 50>
+                        <SET VAL
+                           <FIND-FLAG-HERE-NOT ,PERSONBIT ,MUNGBIT ,PLAYER>>>>
+               <COND ;(<DIR-FROM ,HERE ,OHERE>
+                      <TELL "You have just started walking, when">)
+                     (T
+                      <TELL "But ">
+                      <COND (<FSET? ,HERE ,SURFACEBIT> <TELL "on">)
+                            (T <TELL "in">)>
+                      <TELL THE ,HERE>)>
+               <COND (<ZERO? .VAL>
+                      <TELL " you get lost in the dark">)
+                     (<FSET? .VAL ,SECRETBIT>
+                      <TELL " you realize that you don't know the way">)
+                     (<EQUAL? .VAL ,GHOST-NEW>
+                      <TELL " the ghost blocks your way">)
+                     (T
+                      <TELL HE .VAL <PICK-ONE-NEW ,PLAYER-OBSTACLES>>)>
+               <TELL ".|">
+               <MAKE-ALL-PEOPLE -12 ;"listening to you">
+               <RFATAL>)
+              (T <RFALSE>)>)>>
+
+<GLOBAL PLAYER-OBSTACLES
+       <LTABLE 0
+               " gets in your way"
+               " says hello">>
+
+<ROUTINE GOODNIGHT (RM PER "OPTIONAL" (CLOSET <>) "AUX" DR (VAL <>))
+ <COND (<EQUAL? .RM ,HERE>
+       <TELL D .PER>
+       <THIS-IS-IT .PER>
+       <TELL
+" shows you firmly to the door, saying" HE .PER is " going to bed." CR>
+       <SET VAL ,WINNER>
+       <SETG WINNER ,PLAYER>
+       <PUTP .PER ,P?LINE 0>   ;"so s/he won't prevent your leaving"
+       <GOTO <GET-REXIT-ROOM <GETPT ,HERE ,P?OUT>>>
+       <SETG WINNER .VAL>)
+       (<AND <EQUAL? .CLOSET ,HERE>
+            <SET DR <FIND-FLAG-LG .CLOSET ,DOORBIT ,SECRETBIT>>
+            <NOT <EQUAL? .DR ,SECRET-HYDE-DOOR ,SECRET-IRIS-DOOR>>
+            <FSET? .DR ,OPENBIT>>
+       <FCLEAR .DR ,OPENBIT>
+       <PUT ,FOUND-PASSAGES <GETP .PER ,P?CHARACTER> T>
+       <SETG LIT <LIT?>>
+       <TELL D .PER " closes the " D .DR " without noticing you." CR>
+       <SET VAL T>)>
+ <FCLEAR .RM ,ONBIT>
+ <FSET .PER ,MUNGBIT>
+ <FCLEAR .RM ,OPENBIT>
+ <FSET .RM ,LOCKED>
+ <COND (<EQUAL? .PER ,FOLLOWER>
+       <SETG FOLLOWER 0>)>
+ <PUTP .PER ,P?LDESC 14 ;"asleep">
+ .VAL>
+
+<ROUTINE GRAB-ATTENTION (PERSON "OPTIONAL" (OBJ <>) "AUX" N GT ATT)
+        <COND (<FSET? .PERSON ,MUNGBIT>
+               <COND (<EQUAL? <GETP .PERSON ,P?LDESC> 14 ;"asleep">
+                      <TOO-BAD-BUT .PERSON "asleep">
+                      <RFALSE>)
+                     (T
+                      <TOO-BAD-BUT .PERSON "out cold">
+                      <RFALSE>)>)
+              (<AND <==? <GET <SET GT <GET ,GOAL-TABLES
+                                           <GETP .PERSON ,P?CHARACTER>>>
+                              ,GOAL-FUNCTION>
+                         ,X-RETIRES>
+                    <NOT <EQUAL? .PERSON ,GHOST-NEW ,CONFESSED ,CAPTOR>>
+                    <NOT <EQUAL? ,VARIATION <GETP .PERSON ,P?CHARACTER>>>
+                    <OR <ZERO? .OBJ>
+                        <FSET? .OBJ ,PERSONBIT>
+                        <NOT <FSET? .OBJ ,RMUNGBIT>> ;"evidence">>
+               <TOO-BAD-BUT .PERSON "too sleepy to listen">
+               <RFALSE>)
+              (<AND <==? .PERSON ,BUTLER>
+                    <OR <VERB? ASK-FOR>
+                        <T? <GET .GT ,GOAL-S>>>
+                    <NOT <VERB? SORRY TAKE THANKS>>
+                    <NOT <DOBJ? LUGGAGE DINNER>>>
+               <BUTLER-SORRY>
+               <RFALSE>)
+              (<SET N <ANGRY-REJECT? .PERSON .OBJ>>
+               <TOO-BAD-BUT .PERSON
+                            <COND (<1? .N> "peeved")
+                                  (T "angry")>>
+               <RFALSE>)>
+        <COND (<GET .GT ,GOAL-S>
+               <SET ATT <GET .GT ,ATTENTION-SPAN>>
+               <PUT .GT ,ATTENTION .ATT>
+               <COND (<==? .ATT 0>
+                      <PUT .GT ,GOAL-ENABLE 1>
+                      <TOO-BAD-BUT .PERSON <GET ,LDESC-STRINGS 17>
+                                           ;"preparing to leave">
+                      <RFALSE>)
+                     (T
+                      <PUT .GT ,GOAL-ENABLE 0>)>)>
+        <SETG QCONTEXT .PERSON>
+        <COND (<NOT <==? <GETP .PERSON ,P?LDESC> 21 ;"searching">>
+               <PUTP .PERSON ,P?LDESC 12 ;"listening to you">)>
+        <RTRUE>>
+
+<ROUTINE ANGRY-REJECT? (PERSON OBJ "AUX" N)
+ <COND (<==? .PERSON ,GHOST-NEW>
+       <RFALSE>)
+       (<0? <SET N <GETP .PERSON ,P?LINE>>>
+       <RFALSE>)
+       (<VERB? FORGIVE SORRY TELL ;"JACK,SORRY">
+       <RFALSE>)
+       (<AND <VERB? GIVE> <==? ,PRSI .PERSON>>
+       <RFALSE>)
+       (<EVIDENCE? .OBJ .PERSON>
+       <RFALSE>)
+       (T .N)>>
+
+<ROUTINE WHERE? (PER "OPTIONAL" (X 0) (CAP 0))
+       <COND (<NOT <IN? .PER ,HERE>>
+              <COND (<ZERO? .X>
+                     <TELL !\,>
+                     <SET X <CORRIDOR-LOOK .PER>>
+                     ;<SET X <COR-DIR ,HERE <LOC .PER> <GETP .PER ,P?CAR>>>)>
+              <COND (<ZERO? .CAP> <PRINTC 32>)>
+              <COND (<EQUAL? .X ,P?DOWN>
+                     <COND (<ZERO? .CAP> <TELL !\d>)
+                           (T            <TELL !\D>)>
+                     <TELL "ownstairs">)
+                    (<EQUAL? .X ,P?IN>
+                     <COND (<ZERO? .CAP> <TELL "in">) (T <TELL "In">)>
+                     <TELL-HIS-HER-BEDROOM <GETP .PER ,P?CHARACTER>
+                                           <LOC .PER>>)
+                    (<EQUAL? .X ,P?OUT>
+                     <COND (<ZERO? .CAP> <TELL !\j>)
+                           (T            <TELL !\J>)>
+                     <TELL "ust outside">)
+                    (T
+                     <COND (<ZERO? .CAP> <TELL !\t>)
+                           (T            <TELL !\T>)>
+                     <TELL "o the ">
+                     <DIR-PRINT .X>)>
+              <RTRUE>)>>
+\f
+<ROUTINE DIR-PRINT (DIR "AUX" (CNT 0) TBL X)
+        <COND (<NOT .DIR>
+               <TELL "out of view">
+               <RTRUE>)>
+        <SET TBL ,DIR-STRINGS>
+        <REPEAT ()
+                <SET X <GET .TBL .CNT>>
+                <COND (<ZERO? .X>
+                       <TELL "out of view">
+                       <RTRUE>)
+                      (<==? .X .DIR>
+                       ;<COND (<NOT <EQUAL? .DIR ,P?UP ,P?DOWN>>
+                              <TELL "the ">)>
+                       <PRINT <GET .TBL <+ .CNT 1>>>
+                       <RTRUE>)>
+                <SET CNT <+ .CNT 2>>>>
+
+<GLOBAL DIR-STRINGS
+       <PTABLE P?SOUTH "south"         P?NORTH "north"
+               P?EAST  "east"          P?WEST  "west"
+               P?UP    "upstairs"      P?DOWN  "downstairs"
+               P?IN    "inner"         P?OUT   "outer"
+               P?SE    "southeast"     P?NW    "northwest"
+               P?SW    "southwest"     P?NE    "northeast"
+               0>>
+
+<ROUTINE OPP-DIR (DIR "AUX" (CNT 0) X)
+       <REPEAT ()
+                <SET X <GET ,DIR-STRINGS .CNT>>
+                <COND (<ZERO? .X> <RFALSE>)
+                      (<==? .X .DIR>
+                       <COND (<0? <MOD .CNT 4>>
+                              <RETURN <GET ,DIR-STRINGS <+ .CNT 2>>>)
+                             (T
+                              <RETURN <GET ,DIR-STRINGS <- .CNT 2>>>)>)>
+                <SET CNT <+ .CNT 2>>>>
+\f
+"Goal tables for the characters, offset by a constant,
+which, for a given character, is the P?CHARACTER property of the object."
+
+<GLOBAL GOAL-TABLES
+       <PTABLE <TABLE <> <> <> 1 <> I-PLAYER   5 0>
+               <TABLE <> <> <> 1 <> X-WAITS            5 0>
+               <TABLE <> <> <> 1 <> X-WAITS            5 0>
+               <TABLE <> <> <> 1 <> X-WAITS            5 0>
+               <TABLE <> <> <> 1 <> X-WAITS            5 0>
+               <TABLE <> <> <> 1 <> X-WAITS            5 0>
+               <TABLE <> <> <> 1 <> X-WAITS            5 0>
+               <TABLE <> <> <> 1 <> X-WAITS            5 0>
+               <TABLE <> <> <> 1 <> BUTLER-APPEARS     1 0>
+               <TABLE <> <> <> 1 <> LOVER-XFER         5 0>
+               <TABLE <> <> <> 1 <> GHOST-LURKS        5 0>>>
+[
+"Offsets into GOAL-TABLEs"
+
+<CONSTANT GOAL-F 0> "final goal"
+<CONSTANT GOAL-S 1> "station of final goal"
+<CONSTANT GOAL-I 2> "intermediate goal (transfer point)"
+<CONSTANT GOAL-ENABLE 3> "character can move: 0=no 1=slow 2=fast"
+<CONSTANT GOAL-QUEUED 4> "queued goal to go to after interruption"
+<CONSTANT GOAL-FUNCTION 5> "routine to apply on arrival"
+<CONSTANT ATTENTION-SPAN 6> "how long character will wait when interrupted"
+<CONSTANT ATTENTION 7> "used to count down from ATTENTION-SPAN to 0"
+]
+
+"Goal-function constants, similar to M-xxx in MAIN"
+
+<CONSTANT G-REACHED 1>
+<CONSTANT G-ENROUTE 2>
+<CONSTANT G-IMPATIENT 3>
+<CONSTANT G-DEBUG 4>
+\f
+<GLOBAL TOUR-INDEX:NUMBER 0>
+<GLOBAL TOUR-PATH
+       <PTABLE FOYER DRAWING-ROOM GREAT-HALL GALLERY YOUR-ROOM 0>>
+
+<ROUTINE I-TOUR ("OPTIONAL" (GARG <>) "AUX" L)
+       %<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
+                           <TELL "[I-TOUR:">
+                           <COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
+       <SET L <GET ,TOUR-PATH ,TOUR-INDEX>>
+       <COND (<ZERO? .L>
+              <COND (<EQUAL? ,FOLLOWER ,FRIEND ,LORD>
+                     <SETG FOLLOWER 0>)>
+              %<DEBUG-CODE <COND (,IDEBUG <TELL "0]" CR>)>>
+              <RFALSE>)>
+       <COND (<AND <==? ,HERE ,GREAT-HALL>
+                   <NOT <FSET? ,DOCTOR ,TOUCHBIT>>>
+              <QUEUE I-TOUR 3>
+              <MOVE ,DOCTOR ,HERE>
+              <SET L <DOCTOR-D>>
+              <SETG TOUR-FORCED <>>
+              %<DEBUG-CODE <COND (,IDEBUG <TELL N .L "]" CR>)>>
+              <RETURN .L>)>
+       <INC TOUR-INDEX>
+       <SETG AWAITING-REPLY <>>
+       <MAKE-ALL-PEOPLE 0>
+       <COND (<AND <NOT <QUEUED? ,I-FOUND-IT>>
+                   <ZERO? ,TOUR-FORCED>>
+              <CRLF>)>
+       <SETG FOUND-IT <>>
+       <QUEUE I-FOUND-IT 0>
+       <COND (<EQUAL? .L ,GALLERY>
+              <TELL
+"\"You two will have time to chat later,\" says " 'FRIEND ",
+\"but you must excuse us now, ">
+              <COND (<NOT <EQUAL? ,QCONTEXT <> ,FRIEND ,BUTLER>>
+                     <PRINTD ,QCONTEXT>)
+                    (T <PRINTD ,DOCTOR>)>
+              <TELL ", while I show "FN" up to ">
+              <COND (<ZERO? ,GENDER-KNOWN> <TELL "the "> <PRINT-COLOR>)
+                    (<FSET? ,PLAYER ,FEMALE> <TELL "her">)
+                    (T <TELL "his">)>
+              <TELL " bedroom. I'm sure ">
+              <COND (<ZERO? ,GENDER-KNOWN> <TELL "our guest">)
+                    (<FSET? ,PLAYER ,FEMALE> <TELL "she">)
+                    (T <TELL "he">)>
+              <TELL " wants to freshen up for dinner!\"" CR>)>
+       <TELL 'FRIEND " guides you ">
+       <COND (<EQUAL? .L ,GALLERY>
+              <PUTP ,LORD      ,P?LDESC 13 ;"lounging and chatting">
+              <PUTP ,DEB       ,P?LDESC 13 ;"lounging and chatting">
+              <PUTP ,OFFICER   ,P?LDESC 13 ;"lounging and chatting">
+              <TELL "up to">)
+             (T <TELL "into">)>
+       <TELL THE .L ".||">
+       <FSET ,FRIEND ,RMUNGBIT>        ;"to skip description"
+       <THIS-IS-IT ,FRIEND>
+       <MOVE ,FRIEND .L>
+       <COND (<EQUAL? .L ,GALLERY ,YOUR-ROOM>
+              <PUTP ,FRIEND ,P?LINE 0>
+              <TELL "She says, \"">
+              <COND (<EQUAL? .L ,GALLERY>
+                     <TELL
+"I know it's confusing, but the British call this the
+'first' floor. We just left the 'ground' floor.\"" CR>)
+                    (T <TELL
+"You'll be sleeping in the same room that Queen Victoria
+slept in!\"" CR>)>)>
+       <COND (<NOT <EQUAL? .L ,GALLERY ,YOUR-ROOM>>
+              <COND (<FSET? ,LORD ,TOUCHBIT>
+                     <FSET ,LORD ,RMUNGBIT>    ;"to skip description")>
+              <MOVE ,LORD .L>
+              <PUT ,FOLLOW-LOC ,LORD-C .L>)>
+       <SETG WINNER ,PLAYER>
+       <GOTO .L T <>>
+       <COND (<NOT <EQUAL? .L ,YOUR-ROOM>>
+              <QUEUE I-TOUR 3>)
+             (T
+              <COND (<EQUAL? ,FOLLOWER ,FRIEND ,LORD>
+                     <SETG FOLLOWER 0>)>
+              <COND (<IN? ,BUTLER .L>
+                     <ESTABLISH-GOAL ,FRIEND <LOC ,OFFICER>>
+                     <TAMARA-LEAVES-YOU>)>)>
+       <SETG TOUR-FORCED <>>
+       %<DEBUG-CODE <COND (,IDEBUG <TELL "2]" CR>)>>
+       <RFATAL>>
+
+<ROUTINE I-FRIEND-GREETS ("OPTIONAL" (GARG <>))
+  %<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
+                    <TELL "[I-FRIEND-GREETS:">
+                    <COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
+  <TELL "When a door opens in the castle">
+  <COND (<NOT <FSET? ,FRONT-GATE ,OPENBIT>>
+        <FSET ,FRONT-GATE ,OPENBIT>
+        <TELL " and the " 'FRONT-GATE " creaks open">)>
+  <TELL ", you decide to ">
+  <COND (<NOT <EQUAL? ,HERE ,COURTYARD>>
+        <MOVE ,CAR ,COURTYARD>
+        <TELL "drive through the gate and ">)>
+  <TELL "get out of the car." CR>
+  <GOTO ,COURTYARD>
+  <RTRUE>>
+
+<ROUTINE BUTLER-APPEARS ("OPTIONAL" (GARG <>) "AUX" LL L)
+  %<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
+                    <TELL "[BUTLER-APPEARS:">
+                    <COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
+  <COND (<==? .GARG ,G-REACHED>
+        ;<FCLEAR ,BUTLER ,NDESCBIT>    ;"in BUTLER-D"
+        <PUT <GT-O ,BUTLER> ,GOAL-FUNCTION ,BUTLER-FETCHES>
+        <PUTP ,BUTLER ,P?LDESC 6 ;"walking along">
+        <COND (<NOT <FSET? ,COURTYARD ,TOUCHBIT>>
+               <ESTABLISH-GOAL ,BUTLER ,COURTYARD>)
+              (T
+               <SET L <LOC ,BUTLER>>
+               <SET LL <META-LOC ,LUGGAGE>>
+               <COND (<EQUAL? .LL ,YOUR-ROOM ,YOUR-BATHROOM>
+                      <COND (<EQUAL? ,FOLLOWER ,FRIEND ,LORD>
+                             <SETG FOLLOWER 0>)>
+                      <ESTABLISH-GOAL ,BUTLER <LOC ,BUTLER>>   ;"no-op")
+                     (<EQUAL? .LL .L>
+                      <BUTLER-FETCHES ,G-REACHED>)
+                     (T
+                      <ESTABLISH-GOAL ,BUTLER .LL>)>)>
+        <RFALSE>)>>
+
+<ROUTINE BUTLER-FETCHES ("OPTIONAL" (GARG <>) "AUX" (L <LOC ,BUTLER>) LL GT)
+  %<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
+                     <TELL "[BUTLER-FETCHES:">
+                     <COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
+  <SET LL <META-LOC ,LUGGAGE>>
+  <SET GT <GT-O ,BUTLER>>
+  <PUTP ,BUTLER ,P?LDESC 6 ;"walking along">
+  <COND (<EQUAL? .LL ,YOUR-ROOM ,YOUR-BATHROOM>
+        <COND (<EQUAL? ,FOLLOWER ,FRIEND ,LORD>
+               <SETG FOLLOWER 0>)>
+        <PUT .GT ,GOAL-FUNCTION ,BUTLER-CARRIES>
+        <ESTABLISH-GOAL ,BUTLER <LOC ,BUTLER>> ;"no-op"
+        <RFALSE>)
+       (<AND <EQUAL? .L .LL>
+             <NOT <IN? ,LUGGAGE ,BUTLER>>>
+        <PUT .GT ,GOAL-FUNCTION ,BUTLER-CARRIES>
+        <ESTABLISH-GOAL ,BUTLER ,YOUR-ROOM>
+        <FCLEAR ,LUGGAGE ,OPENBIT>
+        <MOVE ,LUGGAGE ,BUTLER>
+        <MOVE ,CAR ,COURTYARD>
+        <COND (<AND <EQUAL? .L ,HERE>
+                    <NOT <FSET? ,BUTLER ,NDESCBIT>>>
+               <TELL CHE ,BUTLER " takes " 'LUGGAGE ".|">)>
+        ;<FCLEAR ,BUTLER ,NDESCBIT>
+        <RFALSE>)
+       (<==? .GARG ,G-REACHED>
+        <COND (<FSET? ,COURTYARD ,TOUCHBIT>
+               <ESTABLISH-GOAL ,BUTLER <META-LOC ,LUGGAGE>>)
+              (T
+               <ESTABLISH-GOAL ,BUTLER ,COURTYARD>)>
+        <RFALSE>)>>
+
+<ROUTINE TAMARA-LEAVES-YOU ()
+       <TELL
+CHE ,FRIEND " turns to leave, saying, \"Here's " 'BUTLER>
+       <COND (<IN? ,LUGGAGE ,BUTLER>
+              <TELL " with " D ,LUGGAGE>)>
+       <TELL ", so I'll leave you to rest or freshen up, ">
+       <COND (<PRINT-NAME ,FIRST-NAME> <TELL !\.>)>
+       <TELL
+" Dinner's at eight, by the way -- or whenever you hear the gong.\"" CR>>
+
+<ROUTINE BUTLER-CARRIES ("OPTIONAL" (GARG <>) "AUX" (L <LOC ,BUTLER>) (LL <>))
+ %<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
+                    <TELL "[BUTLER-CARRIES:">
+                    <COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
+ <COND (<==? .GARG ,G-ENROUTE>
+       <COND (<EQUAL? .L ,FOYER> <FCLEAR ,FRONT-DOOR ,OPENBIT>)>
+       <RFALSE>)
+       (<==? .GARG ,G-REACHED>
+       <PUT <GT-O ,BUTLER> ,GOAL-ENABLE 0>
+       <QUEUE I-BUTLER-HINTS 7>
+       <QUEUE I-BUTLER-COOKS 9>
+       <PUTP ,BUTLER ,P?LDESC 9 ;"waiting patiently">
+       <FCLEAR ,BUTLER ,NDESCBIT>
+       <COND (<IN? ,LUGGAGE ,BUTLER>
+              <SET LL T>
+              <MOVE ,LUGGAGE ,BED>)>
+       <COND (<AND <NOT <QUEUED? ,I-TOUR>>
+                   <NOT <==? ,FRIEND ,FOLLOWER>>>
+              <ESTABLISH-GOAL ,FRIEND <LOC ,OFFICER>>)>
+       <COND (<EQUAL? .L ,HERE>
+              <COND (<AND <IN? ,FRIEND ,HERE>
+                          <NOT <==? ,FRIEND ,FOLLOWER>>>
+                     <TAMARA-LEAVES-YOU>)>
+              <TELL "The butler enters">
+              <COND (.LL<TELL " with " D ,LUGGAGE" and lays it on the bed">)>
+              <SETG QCONTEXT ,BUTLER>
+              <THIS-IS-IT ,BUTLER>
+              <FSET ,BUTLER ,TOUCHBIT>
+              <PUTP ,BUTLER ,P?LDESC 12 ;"listening to you">
+              <SETG AWAITING-REPLY ,BUTLER-1-R>
+              <QUEUE I-REPLY ,CLOCKER-RUNNING>
+              <TELL ".|
+\"I regret to say, "TN", that the maid will be unable to unpack for you,
+due to the arrangements for the
+late Lord Lionel's memorial birthday dinner,\" he apologizes.
+\"" <GET ,QUESTIONS ,AWAITING-REPLY> "\"|">
+              <RFATAL>)>)>>
+
+<GLOBAL BUTLER-HINTS-COUNTER:NUMBER 0>
+<ROUTINE I-BUTLER-HINTS ("OPTIONAL" (GARG <>) "AUX" (SAID <>))
+       %<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
+                           <TELL "[I-BUTLER-HINTS:">
+                           <COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
+       <COND ;(<FIND-FLAG-HERE ,PERSONBIT ,PLAYER ,BUTLER>
+              <QUEUE I-BUTLER-HINTS 1>)
+             (<OR <EQUAL? ,AWAITING-REPLY ,BUTLER-1-R ,BUTLER-2-R>
+                  <EQUAL? ,AWAITING-REPLY ,BUTLER-3-R ,BUTLER-4-R>>
+              <QUEUE I-BUTLER-HINTS 1>)
+             (<L? 2 ,BUTLER-HINTS-COUNTER>
+              <QUEUE I-BUTLER-HINTS 0>
+              <RFALSE>)
+             (<AND <EQUAL? ,HERE <LOC ,BUTLER>>
+                   <ZERO? <GETP ,BUTLER ,P?LINE>>>
+              <SET SAID T>
+              <PUT <GT-O ,BUTLER> ,ATTENTION 5>
+              <SETG BUTLER-HINTS-COUNTER <+ ,BUTLER-HINTS-COUNTER 1>>
+              <QUEUE I-BUTLER-HINTS 2>
+              <SETG QCONTEXT ,BUTLER>
+              <THIS-IS-IT ,BUTLER>
+              <PUTP ,BUTLER ,P?LDESC 12 ;"listening to you">
+              <COND (<==? 1 ,BUTLER-HINTS-COUNTER>
+                     <SETG AWAITING-REPLY ,BUTLER-2-R>
+                     <QUEUE I-REPLY ,CLOCKER-RUNNING>
+                     <TELL
+'BUTLER " coughs diffidently and asks, \""TN"? "
+<GET ,QUESTIONS ,AWAITING-REPLY> "\"|">
+                     <SET SAID ,M-FATAL>)
+                    (<==? 2 ,BUTLER-HINTS-COUNTER>
+                     <COND (<NOT <IN? ,MACE ,BUTLER>>
+                            <RFALSE>)>
+                     <SETG AWAITING-REPLY ,BUTLER-3-R>
+                     <QUEUE I-REPLY ,CLOCKER-RUNNING>
+                     <TELL
+"|\"" <GET ,QUESTIONS ,AWAITING-REPLY> "\" adds " 'BUTLER ".|">
+                     <SET SAID ,M-FATAL>)
+                    (<==? 3 ,BUTLER-HINTS-COUNTER>
+                     <I-BUTLER-COOKS>
+                     <COND (<NOT <FSET? ,SECRET-YOUR-DOOR ,OPENBIT>>
+                            <TELL "\"Ah, by the way, "TN" -- s">
+                            <BUTLER-MIRROR-STORY>
+                            <TELL "Without explaining further, " 'BUTLER>
+                            <COND (<EQUAL? ,HERE ,YOUR-ROOM>
+                                   <PUT ,FOLLOW-LOC ,BUTLER-C ,GALLERY>
+                                   <MOVE ,BUTLER ,GALLERY>
+                                   <PUTP ,BUTLER ,P?LDESC 6 ;"walking along">
+                                   <TELL " abruptly leaves the room." CR>)
+                                  (T
+                                   <PUTP ,BUTLER ,P?LDESC 20 ;"ignoring you">
+                                   <TELL " turns to his work." CR>)>)
+                           (T
+                            <TELL
+"\"I hope you have a pleasant stay with us, ">
+                            <COND (<TITLE-NAME> <TELL !\.>)>
+                            <TELL " Dinner is at eight.\"" CR>)>)>)
+             (<NOT <IN? ,BUTLER ,LOCAL-GLOBALS>>
+              <QUEUE I-BUTLER-HINTS 1>)
+             ;(<==? 3 ,BUTLER-HINTS-COUNTER>
+              <QUEUE I-BUTLER-HINTS 0>
+              ;<COND (<QUEUED? ,I-BUTLER-COOKS>
+                     <I-BUTLER-COOKS>)>)>
+       %<DEBUG-CODE <COND (,IDEBUG <TELL N .SAID !\] CR>)>>
+       <RETURN .SAID>>
+
+<ROUTINE I-BUTLER-COOKS ("OPTIONAL" (GARG <>) (VAL <>))
+ %<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
+                    <TELL "[I-BUTLER-COOKS:">
+                    <COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
+ <COND (<OR <EQUAL? ,AWAITING-REPLY ,BUTLER-1-R ,BUTLER-2-R>
+           <EQUAL? ,AWAITING-REPLY ,BUTLER-3-R ,BUTLER-4-R>
+           <AND <NOT <==? 3 ,BUTLER-HINTS-COUNTER>>
+                <SET VAL <I-BUTLER-HINTS>>>>
+       <QUEUE I-BUTLER-COOKS ;-HINTS 2>)
+       (<IN? ,DINNER ,KITCHEN>
+       <PUTP ,BUTLER ,P?LDESC 17 ;"preparing to leave">
+       <PUT <GT-O ,BUTLER> ,GOAL-FUNCTION ,BUTLER-COOKS>
+       <ESTABLISH-GOAL ,BUTLER ,KITCHEN>)
+       (T <BUTLER-COOKS ,G-REACHED>)>
+ <RETURN .VAL>>
+
+<ROUTINE BUTLER-COOKS ("OPTIONAL" (GARG <>) "AUX" N)
+ %<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
+                    <TELL "[BUTLER-COOKS:">
+                    <COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
+ <COND (<==? .GARG ,G-REACHED>
+       <PUTP ,BUTLER ,P?LDESC 11 ;"preparing dinner">
+       <SET N <- %<- ,DINNER-TIME 8> ,PRESENT-TIME>>
+       <COND (<NOT <G? .N 0>> <SET N 1>)>
+       <COND (<IN? ,DINNER ,KITCHEN>
+              <QUEUE I-BUTLER-SERVES .N>)
+             (T
+              <PUT <GT-O ,BUTLER> ,GOAL-FUNCTION ,BUTLER-LEAVES>
+              <PUTP ,BUTLER ,P?LDESC 17 ;"preparing to leave">
+              <ESTABLISH-GOAL ,BUTLER ,KITCHEN>)>
+       %<DEBUG-CODE <COND (,IDEBUG <TELL "0]" CR>)>>
+       <RFALSE>)>>
+
+<ROUTINE I-BUTLER-SERVES ("OPTIONAL" (GARG <>))
+       %<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
+                           <TELL "[I-BUTLER-SERVES:">
+                           <COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
+       <MOVE ,DINNER ,BUTLER>
+       <PUTP ,BUTLER ,P?LDESC 17 ;"preparing to leave">
+       <PUT <GT-O ,BUTLER> ,GOAL-FUNCTION ,BUTLER-SERVES>
+       <ESTABLISH-GOAL ,BUTLER ,DINING-ROOM>
+       <COND (<IN? ,BUTLER ,HERE>
+              <TELL 'BUTLER " takes dinner." CR>)>>
+
+<ROUTINE BUTLER-SERVES ("OPTIONAL" (GARG <>))
+ %<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
+                    <TELL "[BUTLER-SERVES:">
+                    <COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
+ <COND (<==? .GARG ,G-REACHED>
+       <COND (<EQUAL? ,HERE ,DINING-ROOM>
+              <TELL CHE ,BUTLER " appears">)>
+       <COND (<IN? ,DINNER ,BUTLER>
+              <COND (<EQUAL? ,HERE ,DINING-ROOM>
+                     <TELL ", puts dinner on the " 'SIDEBOARD>)>
+              <MOVE ,DINNER ,SIDEBOARD>)>
+       <COND (<IN? ,LETTER ,BUTLER>
+              <COND (<EQUAL? ,HERE ,DINING-ROOM>
+                     <FCLEAR ,LETTER ,NDESCBIT>
+                     <TELL ", leaves a note on Jack's napkin">)>
+              <MOVE ,LETTER ,TABLE-DINING>
+              <FSET ,LETTER ,TAKEBIT>)>
+       ;<COND (<IN? ,CLUE-1 ,BUTLER>
+              <COND (<EQUAL? ,HERE ,DINING-ROOM>
+                     <FCLEAR ,CLUE-1 ,NDESCBIT>
+                     <TELL ", puts a card on the " 'SIDEBOARD>)>
+              <MOVE ,CLUE-1 ,SIDEBOARD>)>
+       <FSET ,CLUE-1 ,TAKEBIT>
+       <PUTP ,BUTLER ,P?LDESC 17 ;"preparing to leave">
+       <PUT <GT-O ,BUTLER> ,GOAL-FUNCTION ,BUTLER-LEAVES>
+       <ESTABLISH-GOAL ,BUTLER ,KITCHEN>
+       <COND (<EQUAL? ,HERE ,DINING-ROOM>
+              <TELL ", and looks around the room." CR>)>)>>
+
+<ROUTINE X-WAITS ("OPTIONAL" (GARG <>))
+ %<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
+                    <TELL "[X-WAITS:">
+                    <COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
+ <COND (<==? .GARG ,G-REACHED>
+       <PUTP ,GOAL-PERSON ,P?LDESC 9 ;"waiting patiently">
+       <RFALSE>)>>
+
+<GLOBAL MASS-SAID:FLAG 0>
+<GLOBAL MASS-COUNTER:NUMBER 0>
+
+<ROUTINE I-DINNER ("OPTIONAL" (GARG <>) "AUX" N CH (SAID <>))
+       %<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
+                           <TELL "[I-DINNER:">
+                           <COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
+       <SET N ,MASS-COUNTER>
+       <REPEAT ()
+               <COND (<IGRTR? N ,DEB-C>
+                      <SETG MASS-SAID <>>
+                      <SETG MASS-COUNTER 0>
+                      <COND (<NOT <QUEUED? ,I-DINNER-SIT>>
+                             <QUEUE I-DINNER-SIT 5>)>
+                      <RFALSE>)
+                     (<AND <==? .N ,FRIEND-C>
+                           <QUEUED? ,I-TOUR>>
+                      <QUEUE I-TOUR 1>
+                      <RFALSE>)>
+               <SET CH <GET ,CHARACTER-TABLE .N>>
+               <COND (<==? .CH ,FOLLOWER>
+                      <SETG FOLLOWER 0>)>
+               <COND (<AND <NOT <==? .CH ,SHOOTER>>
+                           <NOT <FSET? .CH ,MUNGBIT>>
+                           <NOT <IN? .CH ,DINING-ROOM>>>
+                      <RETURN>)>>
+       <QUEUE I-DINNER 1>
+       <SETG MASS-COUNTER .N>
+       <PUT <GET ,GOAL-TABLES .N> ,GOAL-FUNCTION ,X-WAITS>
+       <ESTABLISH-GOAL .CH ,DINING-ROOM>
+       <COND (<AND <EQUAL? <META-LOC .CH> ,HERE>
+                   <NOT <EQUAL? ,HERE ,DINING-ROOM>>
+                   <OR <ZERO? ,MASS-SAID>
+                       <==? .CH ,FOLLOWER>>>
+              <SET SAID T>
+              <SETG MASS-SAID T>
+              <COND (<==? .CH ,FOLLOWER>
+                     <SETG FOLLOWER 0>)>
+              <TELL CHE .CH " says, \"It's time for dinner now. ">
+              <COND (<OR <NOT <EQUAL? ,NOW-WEARING ,DINNER-OUTFIT>>
+                         <ZERO? ,WASHED>>
+                     <TELL "I'll see you in">)
+                    (T <TELL "Let's go to">)>
+              <TELL " the " 'DINING-ROOM ".\"" CR>)>
+       %<DEBUG-CODE <COND (,IDEBUG <TELL N .SAID "]|">)>>
+       <RETURN .SAID>>
+
+<GLOBAL BUTLER-RANG-BELL?:FLAG <>>
+<GLOBAL PLAYER-RANG-BELL?:FLAG <>>
+
+<ROUTINE BUTLER-RINGS-BELL? ("OPT" (FAKE <>) "AUX" P)
+       <COND (<OR <T? .FAKE>
+                  <ZERO? ,BUTLER-RANG-BELL?>>
+              <SETG BUTLER-RANG-BELL? T>
+              <QUEUE I-DINNER 1>       ;"in case someone's delayed"
+              <FSET ,CLUE-1 ,TAKEBIT>
+              <COND (<AND <ZERO? .FAKE>
+                          <EQUAL? ,HERE ,KITCHEN>>
+                     <TELL 'BUTLER>
+                     <COND (<NOT <==? ,HERE <GET ,FOLLOW-LOC ,BUTLER-C>>>
+                            <TELL " appears and">)>
+                     <TELL " pushes a hidden button. ">)>
+              <TELL "Suddenly, the dinner bell sounds">
+              ;<COND (<FIRST? ,BELL>
+                     <TELL ", but it doesn't ring true">
+                     <COND (<SET P <FIND-FLAG-HERE-NOT ,PERSONBIT
+                                                       ,MUNGBIT ,PLAYER>>
+                            <TELL
+". \"That's a bit odd,\" " D .P " comments">)>)>
+              <TELL "." CR>)>>
+
+<ROUTINE BUTLER-LEAVES ("OPTIONAL" (GARG <>) "AUX" L (VAL <>))
+       %<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
+                           <TELL "[BUTLER-LEAVES:">
+                           <COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
+       <COND (<==? .GARG ,G-REACHED>
+              <SET VAL <BUTLER-RINGS-BELL?>>
+              <MOVE ,BUTLER ,LOCAL-GLOBALS>
+              <PUT ,FOLLOW-LOC ,BUTLER-C 0>
+              <COND (<EQUAL? ,HERE ,DINING-ROOM>
+                     <QUEUE I-DINNER-SIT 1>)
+                    (<EQUAL? ,HERE ,KITCHEN>
+                     <TELL "Then he ">
+                     <COND (<IN? ,MACE ,BUTLER>
+                            <TELL "drops " A ,MACE ", ">)>
+                     <TELL
+"bids you good night, ducks into the areaway, locks the door
+behind him, and leaves the castle." CR>
+                     <SET VAL ,M-FATAL>)>
+              <COND (<IN? ,MACE ,BUTLER>
+                     <FCLEAR ,MACE ,NDESCBIT>
+                     <MOVE ,MACE ,KITCHEN>)>
+              .VAL)>>
+
+<GLOBAL DINNER-SIT-COUNTER:NUMBER 0>
+<GLOBAL DINNER-SAT:FLAG <>>
+
+<ROUTINE I-DINNER-SIT ("OPTIONAL" (GARG <>) "AUX" (SAID <>))
+       %<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
+                           <TELL "[I-DINNER-SIT:">
+                           <COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
+       <COND (<T? ,DINNER-SAT>
+              <RFALSE>)
+             (<OR <FSET? ,DINNER ,TAKEBIT>
+                  <L? 1 <- ,DINNER-FOR <POPULATION ,DINING-ROOM ,PLAYER>>>>
+              <COND (<L? ,DINNER-SIT-COUNTER 20>
+                     <SETG DINNER-SIT-COUNTER <+ 1 ,DINNER-SIT-COUNTER>>
+                     <COND (<AND <ZERO? <MOD ,DINNER-SIT-COUNTER 8>>
+                                 <NOT <EQUAL? ,HERE ,KITCHEN>>>
+                            <BUTLER-RINGS-BELL? T>
+                            <RTRUE>)>)>
+              <QUEUE I-DINNER-SIT 1>
+              <RFALSE>)>
+       <SETG DINNER-SAT T>
+       ;<QUEUE I-DINNER-SIT 0>
+       <QUEUE I-LIONEL-SPEAKS <- ,LIONEL-TIME ,PRESENT-TIME>>
+       <MAKE-ALL-PEOPLE 10 ;"eating with relish" ,DINING-ROOM>
+       <FSET ,DINNER ,TAKEBIT>
+       <FCLEAR ,DINNER ,TRYTAKEBIT>
+       <MOVE ,DINNER-2 ,TABLE-DINING>
+       ;<MOVE ,DINNER-3 ,TABLE-DINING>
+       <BUTLER-RINGS-BELL?>
+       <COND (<EQUAL? ,DINING-ROOM ,HERE>
+              <SET SAID ,M-FATAL>
+              <MOVE ,DINNER ,TABLE-DINING>
+              <TELL 'DEB " playfully suggests">
+              <COND (<==? ,VARIATION ,FRIEND-C>
+                     <THIS-IS-IT ,LORD>
+                     <TELL " to " 'LORD>)>
+              <TELL
+" that everyone form a self-serve food line at the buffet.
+" CHE ,LORD " and the others good-naturedly accept her suggestion." CR>
+              <COND (<IN? ,LETTER ,TABLE-DINING>
+                     <TELL
+"As " 'LORD " takes his place as host,
+he notices a note lying on his napkin. He picks it up and reads it
+with a troubled expression." CR>
+                     ;<THIS-IS-IT ,LORD>)>
+              <DINNER-TALK 28>)
+             (T <SETG MISSED-DINNER T>)>
+       <COND (<IN? ,LETTER ,TABLE-DINING>
+              <MOVE ,LETTER ,LORD>
+              <FCLEAR ,LETTER ,NDESCBIT>)>
+       %<DEBUG-CODE <COND (,IDEBUG <TELL N .SAID !\] CR>)>>
+       <RETURN .SAID>>
+
+<GLOBAL MISSED-DINNER:FLAG <>>
+<CONSTANT INIT-LIONEL-SPEAKS-COUNTER 6>
+<GLOBAL LIONEL-SPEAKS-COUNTER:NUMBER 6>
+<GLOBAL LIONEL-FORCED:FLAG <>>
+<GLOBAL LIONELS-VOICE "Lionel's voice">
+
+<ROUTINE I-LIONEL-SPEAKS ("OPTIONAL" (GARG <>) "AUX" (SAID <>) P)
+       %<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
+                           <TELL "[I-LIONEL-SPEAKS:">
+                           <COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
+       <SETG LIONEL-SPEAKS-COUNTER <- ,LIONEL-SPEAKS-COUNTER 1>>
+       <COND (<NOT <ZERO? ,LIONEL-SPEAKS-COUNTER>>
+              <QUEUE I-LIONEL-SPEAKS 2>)
+             (T
+              <QUEUE I-WITHDRAW 9>)>
+       <SET P ,SEARCHER>
+       <COND (<AND <T? .P>
+                   <OR <NOT <IN? .P ,DINING-ROOM>>
+                       <NOT <IN? ,CLUE-1 ,SIDEBOARD>>
+                       <FSET? ,CLUE-1 ,TOUCHBIT>>>
+              <SET P <>>)>
+       <COND (<==? 5 ,LIONEL-SPEAKS-COUNTER>
+              <MOVE ,VOICE ,DINING-ROOM>
+              <MAKE-ALL-PEOPLE 16 ;"listening" ,DINING-ROOM>)
+             (<==? 1 ,LIONEL-SPEAKS-COUNTER>
+              <FCLEAR ,CLUE-2 ,NDESCBIT>
+              <FCLEAR ,CLUE-2 ,SECRETBIT>
+              <FCLEAR ,CLUE-1 ,SECRETBIT>)
+             (<==? 0 ,LIONEL-SPEAKS-COUNTER>
+              <COND (<T? .P>
+                     <FSET ,CLUE-1 ,TAKEBIT>
+                     <FCLEAR ,CLUE-1 ,NDESCBIT>
+                     <MOVE ,CLUE-1 .P>)>
+              <MOVE ,VOICE ,LOCAL-GLOBALS>
+              <MAKE-ALL-PEOPLE 18 ;"deep in thought" ,DINING-ROOM>)>
+       <COND (<EQUAL? ,DINING-ROOM ,HERE>
+              <SET SAID ,M-FATAL>
+              <COND (<T? ,LIONEL-FORCED>
+                     <SETG LIONEL-FORCED <>>)
+                    (T <CRLF>)>
+              <COND (<==? 5 ,LIONEL-SPEAKS-COUNTER>
+                     <THIS-IS-IT ,BUST>
+                     <FSET ,BUST ,OPENBIT>
+                     <TELL
+D ,LORD " and his guests are startled as an unexpected voice suddenly speaks!|
+\"Good evening, all,\" it says, then breaks into a low chuckle.|
+\"Good Lord!\" Jack gasps. \"That's Uncle " ,LIONELS-VOICE "!\"|
+" D ,DOCTOR " points to" THE ,BUST ". \"There's where it's coming
+from!\"" CR>)
+                    (<==? 4 ,LIONEL-SPEAKS-COUNTER>
+                     <TELL
+,LIONELS-VOICE " continues, \"You are all here, I trust, to honor the wish
+expressed in my will -- that the seven of you should dine together
+at " D ,CASTLE " on the evening of my birthday.\"" CR>)
+                    (<==? 3 ,LIONEL-SPEAKS-COUNTER>
+                     <THIS-IS-IT ,ARTIFACT>
+                     <THIS-IS-IT ,LORD>
+                     <TELL
+,LIONELS-VOICE " continues, \"As you know, I enjoyed adventuring to
+remote corners of the world. And doubtless you've all heard of the loss of that
+valuable artifact, which I brought back from one of my
+expeditions, have you not?\"|
+The guests nod or mumble vaguely. They all glance toward Jack,
+as if looking for an official response." CR>)
+                    (<==? 2 ,LIONEL-SPEAKS-COUNTER>
+                     <TELL ,LIONELS-VOICE " goes on, ">
+                     <COND (<==? ,LORD-C ,VARIATION>
+                            <THIS-IS-IT ,LORD>
+                            <TELL
+"\"Jack, I'm sure, is only too eager for me to shuffle off this mortal coil
+so he can inherit the family title and estate. Thus he should be
+particularly interested in what I'm about to say...\" Once again
+" ,LIONELS-VOICE " chuckles slyly, then continues." CR>)>
+                     <THIS-IS-IT ,PUNCHBOWL>
+                     <TELL
+"\"The truth is that the artifact is not lost, but hidden.
+Although I am not yet ready to reveal what it is,
+I suggest you look under the " 'PUNCHBOWL ".\"" CR>)
+                    (<==? 1 ,LIONEL-SPEAKS-COUNTER>
+                     <THIS-IS-IT ,CLUE-2>
+                     <TELL
+"\"This " 'CLUE-1 " is merely to sharpen your wits,\"
+" ,LIONELS-VOICE " goes on.|
+\"" 'LOVER ", my dear: your one goal in life, I believe, is to become
+Jack's wife, heaven knows why! Not being Cupid, there is little I can do
+to help. Knowing the others, I suspect each one has private reasons for
+wanting my " 'ARTIFACT ". So, for your amusement, I have given a
+" 'CLUE-2 " to my ">
+                     <COND (<EQUAL? ,VARIATION ,LORD-C>
+                            <TELL "dear friend">)
+                           (T <TELL "heir">)>
+                     <TELL
+", which may start you down the path to finding it.\"|
+With another sardonic chuckle, " ,LIONELS-VOICE " adds, \"Perhaps, ">
+                     <COND (<EQUAL? ,VARIATION ,LORD-C>
+                            <THIS-IS-IT ,PAINTER>
+                            <TELL 'PAINTER>)
+                           (T
+                            <THIS-IS-IT ,LORD>
+                            <TELL 'LORD>)>
+                     <TELL ", you would
+care to SHARE your clue with all the others -- eh, what?\"" CR>)
+                    (<==? 0 ,LIONEL-SPEAKS-COUNTER>
+                     <TELL
+,LIONELS-VOICE " finishes, \"So now, my friends, let the game begin!\"" CR>
+                     <COND (<T? .P>
+                            <TELL
+D .P " says, \"Well, I for one want to see that " 'CLUE-1 ".\" ">
+                            <THIS-IS-IT .P>
+                            <TELL
+CHE .P " lifts the " 'PUNCHBOWL " and takes it." CR>)>)>)>
+       %<DEBUG-CODE <COND (,IDEBUG <TELL N .SAID !\] CR>)>>
+       <RETURN .SAID>>
+
+<ROUTINE MAKE-ALL-PEOPLE (NUM "OPTIONAL" (RM 0) "AUX" P NNUM)
+       <COND (<ZERO? .RM>
+              <SET RM ,HERE>)>
+       <COND (<L? .NUM 0>
+              <SET NNUM <- 0 .NUM>>)>
+       <SET P <FIRST? .RM>>
+       <REPEAT ()
+               <COND (<ZERO? .P>
+                      <RETURN>)
+                     (<FSET? .P ,PERSONBIT>
+                      <COND (<G? .NUM 0>
+                             <PUTP .P ,P?LDESC .NUM>)
+                            (<==? .NNUM <GETP .P ,P?LDESC>>
+                             <PUTP .P ,P?LDESC 0>)>)>
+               <SET P <NEXT? .P>>>>
+
+<ROUTINE I-WITHDRAW ("OPTIONAL" (GARG <>) "AUX" OBJ NXT (SAID <>))
+       %<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
+                           <TELL "[I-WITHDRAW:">
+                           <COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
+       <COND (<ZERO? ,TREASURE-FOUND>
+              <QUEUE I-SEARCH 9>
+              <PUT <GT-O ,SEARCHER> ,GOAL-FUNCTION ,X-SEARCHES>)>
+       <QUEUE I-BEDTIME <- ,BED-TIME ,PRESENT-TIME>>
+       <COND (<EQUAL? ,HERE ,DINING-ROOM ,CORR-1 ,SITTING-ROOM>
+              <SETG P-HIM-OBJECT <>>
+              <SETG P-HER-OBJECT <>>
+              <SET SAID T>
+              <TELL "|
+Normally the gentlemen would remain at the table to enjoy
+cigars and port, while the ladies repair to the " 'DRAWING-ROOM ". But because
+of tonight's mysterious developments, everyone ">
+              <COND (<EQUAL? ,HERE ,DINING-ROOM>
+                     <TELL "leaves the " 'DINING-ROOM>)
+                    (T
+                     <TELL "goes to the " 'SITTING-ROOM>)>
+              <TELL " by unspoken agreement." CR>)
+             (<OR <EQUAL? ,HERE ,JACK-ROOM ,TAMARA-ROOM ,IRIS-ROOM>
+                  <EQUAL? ,HERE ,WENDISH-ROOM ,VIVIEN-ROOM ,IAN-ROOM>
+                  <EQUAL? ,HERE ,HYDE-ROOM>>
+              <COND (<NOT <EQUAL? <LOC <GET ,CHARACTER-TABLE
+                                        <- <ZMEMQ ,HERE ,CHAR-ROOM-TABLE> 1>>>
+                                  ,HERE ,LOCAL-GLOBALS>>
+                     <SETG DISCOVERED-HERE ,HERE>
+                     <QUEUE I-DISCOVERED 1>)>)>
+       <COND (<FSET? <LOC ,DINNER  > ,PERSONBIT>
+              <MOVE ,DINNER   ,TABLE-DINING>)>
+       <COND (<FSET? <LOC ,DINNER-2> ,PERSONBIT>
+              <MOVE ,DINNER-2 ,TABLE-DINING>)>
+       ;<COND (<FSET? <LOC ,DINNER-3> ,PERSONBIT>
+              <MOVE ,DINNER-3 ,TABLE-DINING>)>
+       <SET OBJ <FIRST? ,DINING-ROOM>>
+       <SET NXT <NEXT? .OBJ>>
+       <REPEAT ()
+               <COND (<ZERO? .NXT>
+                      <RETURN>)
+                     (<FSET? .OBJ ,PERSONBIT>
+                      <COND (<NOT <EQUAL? .OBJ ,PLAYER ,CONFESSED ,CAPTOR>>
+                             <PUTP .OBJ ,P?LDESC 18 ;"deep in thought">
+                             <PUT ,FOLLOW-LOC <GETP .OBJ ,P?CHARACTER>
+                                  ,SITTING-ROOM>
+                             <MOVE .OBJ ,SITTING-ROOM>)>)>
+               <SET OBJ .NXT>
+               <SET NXT <NEXT? .OBJ>>>
+       <COND (<EQUAL? ,HERE ,DINING-ROOM>
+              <SETG WINNER ,PLAYER>
+              <GOTO ,SITTING-ROOM ;,CORR-1>)>
+       %<DEBUG-CODE <COND (,IDEBUG <TELL N .SAID !\] CR>)>>
+       <RETURN .SAID>>
+
+<GLOBAL SEARCHER:OBJECT 0>
+<GLOBAL CLUE-LOC:OBJECT 0>
+
+<GLOBAL SEARCH-ROOMS
+   <PLTABLE
+       OLD-GREAT-HALL BASEMENT ;DUNGEON STUDY LIBRARY OFFICE
+       LUMBER-ROOM CHAPEL GAME-ROOM DECK COURTYARD MAZE GARDEN GALLERY
+       FOYER DRAWING-ROOM GREAT-HALL SITTING-ROOM DINING-ROOM KITCHEN>>
+
+<ROUTINE I-SEARCH ("OPTIONAL" (GARG <>)
+                  "AUX" (SAID <>) GT L (X 0))
+       %<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
+                           <TELL "[I-SEARCH:">
+                           <COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
+       <SET L <LOC ,SEARCHER>>
+       <COND (<OR <==? .L ,DISCOVERED-HERE>
+                  <QUEUED? ,I-LIONEL-SPEAKS>>
+              <QUEUE I-SEARCH 3>
+              %<DEBUG-CODE <COND (,IDEBUG <TELL N .SAID !\] CR>)>>
+              <RFALSE>)>
+       <QUEUE I-SEARCH 19>
+       <SET X <GET ,CHARACTER-TABLE <+ 1 <RANDOM 6>>>>
+       <COND (<AND <IN? .X ,SITTING-ROOM>
+                   <NOT <EQUAL? .X ,FOLLOWER ,CONFESSED ,CAPTOR>>
+                   <NOT <==? <GETP .X ,P?LDESC> 22>>>
+              <PUTP .X ,P?LDESC 22 ;"playing the piano">
+              <COND (<==? ,HERE ,SITTING-ROOM>
+                     <SET SAID T>
+                     <THIS-IS-IT .X>
+                     <TELL D .X " begins " <GET ,LDESC-STRINGS 22> ".">)>
+              <SET X <NEXT? .X>>
+              <COND (<AND <T? .X>
+                          <FSET? .X ,PERSONBIT>
+                          <NOT <==? .X ,PLAYER>>>
+                     <COND (<AND <T? .SAID>
+                                 <==? <GETP .X ,P?LDESC>
+                                      22 ;"playing the piano">>
+                            <THIS-IS-IT .X>
+                            <TELL " And " D .X " stops.">)>
+                     <PUTP .X ,P?LDESC 13 ;"lounging and chatting">)>
+              <COND (<T? .SAID> <CRLF>)>)>
+       <SET X ,DEB-C>
+       <REPEAT ()
+               <SET GT <GET ,CHARACTER-TABLE .X>>
+               <COND (<AND <NOT <EQUAL? .GT ,FOLLOWER>>
+                           <NOT <EQUAL? <META-LOC .GT> ,HERE ,SITTING-ROOM>>
+                           <NOT <IN-MOTION? .GT>>
+                           <NOT <==? <GETP .GT ,P?LDESC>7;"sobbing quietly">>
+                           <NOT <EQUAL? <GET <GET ,GOAL-TABLES .X>
+                                             ,GOAL-FUNCTION>
+                                        ,X-RETIRES ,X-SEARCHES>>>
+                      <PUT <GET ,GOAL-TABLES .X> ,GOAL-FUNCTION ,NULL-F>
+                      <ESTABLISH-GOAL .GT ,SITTING-ROOM>)>
+               <COND (<DLESS? X 1> <RETURN>)>>
+       <COND (<T? ,CONFESSED>
+              %<DEBUG-CODE <COND (,IDEBUG <TELL N .SAID !\] CR>)>>
+              <RFALSE>)>
+       <SET GT <GT-O ,SEARCHER>>
+       <COND (<EQUAL? <GET .GT ,GOAL-FUNCTION> ,X-SEARCHES>
+              <REPEAT ()
+                      <COND (<AND <SET X ,CLUE-LOC>
+                                  <ZMEMQ .X ,SEARCH-ROOMS>>
+                             <SETG CLUE-LOC 0>)
+                            (T <SET X <PICK-ONE ,SEARCH-ROOMS>>)>
+                      <COND (<NOT <==? .X .L>>
+                             <RETURN>)>>
+              <ESTABLISH-GOAL ,SEARCHER .X>
+              <COND (<EQUAL? ,HERE .L>
+                     <SET SAID T>
+                     <TELL "|
+Suddenly" HE ,SEARCHER " heads for the ">
+                     <COND (<EQUAL? ,HERE ,MAZE ,GARDEN>
+                            <TELL "exit">)
+                           (T <TELL "door">)>
+                     <TELL ", mumbling, \"Please excuse me.\"" CR>)>)>
+       %<DEBUG-CODE <COND (,IDEBUG <TELL N .SAID !\] CR>)>>
+       <RETURN .SAID>>
+
+<ROUTINE X-SEARCHES ("OPTIONAL" (GARG <>) "AUX" (VAL <>))
+ %<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
+                    <TELL "[X-SEARCHES:">
+                    <COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
+ <COND (<==? .GARG ,G-REACHED>
+       <PUTP ,GOAL-PERSON ,P?LDESC 21 ;"searching">)>
+ %<DEBUG-CODE <COND (,IDEBUG <TELL N .VAL !\] CR>)>>
+ <RETURN .VAL>>
+
+<ROUTINE I-DISCOVERED ("OPTIONAL" (GARG <>) "AUX" (VAL <>) L GT)
+ %<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
+                    <TELL "[I-DISCOVERED:">
+                    <COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
+ <COND (<AND <EQUAL? ,DISCOVERED-HERE ,HERE>
+            <OR ;<ZERO? ,BUTLER-RANG-BELL?>    ;"before dinner"
+                <ZERO? ,LIONEL-SPEAKS-COUNTER> ;"after dinner">>
+       <SET L <- <ZMEMQ ,HERE ,CHAR-ROOM-TABLE> 1>>
+       <SET VAL <GET ,CHARACTER-TABLE .L>>
+       <COND (<ZERO? .GARG>
+              <COND (<IN? .VAL ,HERE>
+                     <RFALSE>)
+                    (<FSET? .VAL ,MUNGBIT>
+                     <RFALSE>)
+                    (<EQUAL? .VAL ,CONFESSED>
+                     <RFALSE>)
+                    (<EQUAL? <GET <GT-O .VAL> ,GOAL-FUNCTION> ,X-RETIRES>
+                     <RFALSE>)>)>
+       <PUT ,FOLLOW-LOC .L ,HERE>
+       <QUEUE I-FOUND-IT 0>
+       <COND (<EQUAL? .VAL ,GHOST-NEW>
+              <MOVE ,GHOST-NEW ,HERE>
+              <GHOST-LURKS>
+              <RFATAL>)>
+       <TELL "You freeze as">
+       <COND (T ;<NOT <EQUAL? .VAL ,GHOST-NEW>>
+              <COND (<FSET? ,HERE ,LOCKED>
+                     <FCLEAR ,HERE ,LOCKED>
+                     <TELL " a key turns in the lock,">)>
+              <TELL " the door bursts open and">)>
+       <FCLEAR ,HERE ,OPENBIT>
+       <PUTP .VAL ,P?LINE <+ 1 <GETP .VAL ,P?LINE>>>
+       <PUTP .VAL ,P?LDESC 4 ;"looking at you with suspicion">
+       <TELL HE .VAL " appears. ">
+       <TELL CHE .VAL " stares at you with a shocked look. ">
+       <COND ;(<EQUAL? ,HERE ,WENDISH-ROOM>
+              <TELL
+"\"May I ask what you are doing here?\" he inquires gently.">)
+             ;(<EQUAL? ,HERE ,HYDE-ROOM>
+              <TELL
+"\"To what do I owe the honor of this... shall we say, uninvited
+visit?\" he inquires with a sarcastic smile.">)
+             ;(<EQUAL? ,HERE ,IAN-ROOM>
+              <TELL
+"Then a mocking smile quirks the handsome young guardsman's lips.
+\"Here now, what's all this then?\" he murmurs.">)
+             (T <TELL
+"\"Well! I didn't expect MY room to be searched!\"" HE .VAL" says
+angrily. ">)>
+       <SET L <LOC .VAL>>
+       <MOVE .VAL ,HERE>
+       <SET GT <GT-O .VAL>>
+       <COND (<ZERO? <GET .GT ,GOAL-S>>
+              <ESTABLISH-GOAL .VAL .L>)
+             (T
+              <ESTABLISH-GOAL .VAL <GET .GT ,GOAL-F>>)>
+       <PUT .GT ,GOAL-ENABLE 0>
+       <TELL
+CHE .VAL " enters the room and closes the door behind" HIM .VAL ".|">
+       <COND (<AND <IN? ,BLOWGUN .VAL>
+                   <EQUAL? .VAL ,PAINTER ,DOCTOR>
+                   <NOT <FIND-FLAG-HERE ,PERSONBIT ,PLAYER .VAL>>>
+              <SETUP-SHOT .VAL>
+              <TELL "Then" HE .VAL " pulls out" THE ,BLOWGUN "!" CR>)>
+       <SET VAL ,M-FATAL>)>
+ %<DEBUG-CODE <COND (,IDEBUG <TELL N .VAL !\] CR>)>>
+ .VAL>
+
+<ROUTINE I-FOUND-PASSAGES ("OPTIONAL" (GARG <>) "AUX" (SAID <>) X)
+       %<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
+                           <TELL "[I-FOUND-PASSAGES:">
+                           <COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
+       <SET X <FIRST? ,HERE>>
+       <COND (<T? .X>
+              <SET SAID <FOUND-PASSAGES-REPEAT .X ,PASSAGE ,FOUND-PASSAGES>>)>
+       <COND (<AND <FSET? ,HERE ,SECRETBIT>
+                   <SET X <FIND-FLAG-LG ,HERE ,DOORBIT>>
+                   <SET X <DOOR-ROOM ,HERE .X>>>
+              <SET X <FIRST? .X>>
+              <COND (<AND <T? .X>
+                          <FOUND-PASSAGES-REPEAT .X ,PASSAGE ,FOUND-PASSAGES>>
+                     <SET SAID T>)>)>
+       %<DEBUG-CODE <COND (,IDEBUG <TELL N .SAID !\] CR>)>>
+       <RETURN .SAID>>
+
+<ROUTINE FOUND-PASSAGES-REPEAT (PER OBJ GL "AUX" C (SAID <>))
+ <REPEAT ()
+        <COND (<ZERO? .PER> <RETURN>)>
+        <COND (<AND <FSET? .PER ,PERSONBIT>
+                    <NOT <FSET? .PER ,MUNGBIT>>>
+               <PUTP .PER ,P?LDESC 3 ;"watching you">
+               <SET C <GETP .PER ,P?CHARACTER>>
+               <COND (<ZERO? <GET .GL .C>>
+                      <PUT .GL .C T>
+                      <COND (<NOT <==? .C ,VARIATION>>
+                             <PUTP .PER ,P?LINE 0>
+                             <COND (<ZERO? .SAID>
+                                    <SET SAID .PER>
+                                    <COND (<==? .OBJ ,PASSAGE>
+                                           <GOOD-SHOW .PER .OBJ>)>)>)>)>)>
+        <SET PER <NEXT? .PER>>>
+ .SAID>
+
+<ROUTINE I-BEDTIME ("OPTIONAL" (GARG <>) "AUX" N CH (VAL <>) L)
+       %<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
+                           <TELL "[I-BEDTIME:">
+                           <COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
+       <SET N ,MASS-COUNTER>
+       <COND (<IGRTR? N ,DEB-C>
+              <SETG MASS-SAID <>>
+              <SETG MASS-COUNTER 0>
+              %<DEBUG-CODE <COND (,IDEBUG <TELL N .VAL !\] CR>)>>
+              <RFALSE>)>
+       <QUEUE I-BEDTIME 5>
+       <SETG MASS-COUNTER .N>
+       <SET CH <GET ,CHARACTER-TABLE .N>>
+       <COND (<EQUAL? .CH ,SEARCHER>
+              <QUEUE I-SEARCH 0>)>
+       <COND (<==? .CH ,CONFESSED ,CAPTOR>
+              %<DEBUG-CODE <COND (,IDEBUG <TELL N .VAL !\] CR>)>>
+              <RFALSE>)
+             (<FSET? .CH ,MUNGBIT>
+              %<DEBUG-CODE <COND (,IDEBUG <TELL N .VAL !\] CR>)>>
+              <RFALSE>)>
+       <PUT <GET ,GOAL-TABLES .N> ,GOAL-FUNCTION ,X-RETIRES>
+       <ESTABLISH-GOAL .CH <GET ,CHAR-ROOM-TABLE <+ 1 .N>>>
+       <SET L <META-LOC .CH>>
+       <COND (<AND <NOT <OUTSIDE? .L>>
+                   <ZERO? <FIND-FLAG .L ,PERSONBIT .CH>>>
+              <FCLEAR .L ,ONBIT>)>
+       <COND (<AND <EQUAL? .L ,HERE>
+                   <OR <ZERO? ,MASS-SAID>
+                       <==? .CH ,FOLLOWER>>>
+              <SETG MASS-SAID T>
+              <SET VAL T>
+              <PUTP .CH ,P?LDESC 17 ;"preparing to leave">
+              <TELL
+D .CH " says, \"It's time for bed now.
+I'll see you in the morning.\"" CR>)>
+       <COND (<==? .CH ,FOLLOWER>
+              <SETG FOLLOWER 0>)>
+       %<DEBUG-CODE <COND (,IDEBUG <TELL N .VAL "]|">)>>
+       <RETURN .VAL>>
+
+<GLOBAL FRIEND-FOUND-PASSAGES <>>
+<ROUTINE FRIEND-PASSAGE-STORY ()
+       <TELL "\"Guess what? I just
+discovered a " 'PASSAGE " in my room! But it's so late that I'm going
+to bed now. We'll explore in the morning.\"" CR>>
+
+<ROUTINE X-RETIRES ("OPTIONAL" (GARG <>)
+                   "AUX" (L <LOC ,GOAL-PERSON>) RM C (VAL <>) OBJ GT)
+ %<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
+                    <TELL "[X-RETIRES:">
+                    <COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
+ <COND (<EQUAL? ,GOAL-PERSON ,CONFESSED ,CAPTOR>
+       <RFALSE>)
+       (<==? .GARG ,G-IMPATIENT>
+       <COND (<EQUAL? .L ,HERE>
+              <SET VAL T>
+              <TELL
+CHE ,GOAL-PERSON " says, \"I'm dead tired. Good night.\"" CR>)>)
+       (<==? .GARG ,G-REACHED>
+       <SET C <GETP ,GOAL-PERSON ,P?CHARACTER>>
+       <SET RM <GET ,CHAR-ROOM-TABLE <+ 1 .C>>>
+       <SET GT <GET ,GOAL-TABLES .C>>
+       <COND (<NOT <==? .L .RM>>       ;"unmasked ghost is quitting"
+              <COND (<NOT <FSET? .L ,SECRETBIT>> ;"or you entered a bedroom"
+                     <ESTABLISH-GOAL ,GOAL-PERSON .RM>
+                     <RFALSE>)>
+              <SET OBJ <FIND-FLAG-LG .L ,DOORBIT>>
+              <COND (<T? .OBJ>
+                     <FSET .OBJ ,OPENBIT>)>
+              <SET VAL <MOVE-PERSON ,GOAL-PERSON .RM>>
+              <COND (<T? .OBJ>
+                     <FCLEAR .OBJ ,OPENBIT>)>)>
+       ;<COND (<AND <QUEUED? ,I-DISCOVERED>
+                   <EQUAL? ,DISCOVERED-HERE ,HERE>
+                   <EQUAL? ,DISCOVERED-HERE .RM>>
+              <QUEUE I-DISCOVERED 0>
+              <RETURN <I-DISCOVERED ,G-REACHED>>)>
+       <SET OBJ <FIND-FLAG .RM ,SURFACEBIT>>
+       <COND (<T? .OBJ>
+              <ROB ,GOAL-PERSON .OBJ>)
+             (T <ROB ,GOAL-PERSON .RM>)>
+       <FCLEAR .RM ,OPENBIT>
+       <FSET .RM ,LOCKED>
+       <COND (<EQUAL? ,VARIATION ,LORD-C>
+              <SET RM ,LIMBO>)>
+       <COND (<AND <EQUAL? ,GOAL-PERSON ,FRIEND>
+                   <NOT <EQUAL? ,VARIATION ,FRIEND-C>>
+                   <ZERO? <GET ,FOUND-PASSAGES ,PLAYER-C>>
+                   <ZERO? ,FRIEND-FOUND-PASSAGES>
+                   <T? <GETP ,HERE ,P?LINE>>
+                   <T? ,NOW-WEARING>
+                   <NOT <FSET? ,HERE ,SECRETBIT>>
+                   <NOT <1? <GETP ,HERE ,P?CHARACTER>>>        ;"Dee's path"
+                   <NOT <EQUAL? ,HERE ,BACKSTAIRS>>>
+              <FCLEAR ,SECRET-TAMARA-DOOR ,SECRETBIT>
+              <SET VAL T ;,M-FATAL>
+              <COND (<NOT <VERB? SEARCH SEARCH-FOR>>
+                     <CRLF>)>
+              <COND (<EQUAL? ,HERE ,TAMARA-ROOM>
+                     <PUT .GT ,ATTENTION <GET .GT ,ATTENTION-SPAN>>
+                     <SETG WINNER ,FRIEND>
+                     <COND (<==? ,HERE <GET ,FOLLOW-LOC ,FRIEND-C>>
+                            <TELL "Preparing for bed," 'FRIEND>)
+                           (T <TELL 'FRIEND " enters and">)>
+                     <TELL " accidentally touches the bedpost. ">
+                     <THIS-IS-IT ,FRIEND>
+                     <OPEN-SECRET "turn" " the bedpost" ,SECRET-TAMARA-DOOR>
+                     <SETG WINNER ,PLAYER>)
+                    (<NOT <QUEUED? ,I-SHOT>>
+                     <FSET ,PASSAGE ,SEENBIT>
+                     <FSET ,SECRET-TAMARA-DOOR ,OPENBIT>
+                     <MOVE ,FRIEND ,HERE>
+                     <PUT ,FOLLOW-LOC ,FRIEND-C ,HERE>
+                     <PUT .GT ,GOAL-FUNCTION ,X-RETIRES>
+                     <ESTABLISH-GOAL ,FRIEND ,TAMARA-ROOM>
+                     <TELL "Suddenly " 'FRIEND " appears and says, ">
+                     <FRIEND-PASSAGE-STORY>)>)
+             (<TIME-FOR-GHOST? .RM>
+              <QUEUE I-SEARCH 0>
+              <COND (<==? ,VILLAIN-PER ,LOVER>
+                     <PUTP ,DEB ,P?LDESC 24 ;"brushing her hair">
+                     <PUT .GT ,ATTENTION <GET .GT ,ATTENTION-SPAN>>
+                     <DRESS-GHOST <LOC ,LOVER> ,LOVER-C>
+                     <PUT <GET ,GOAL-TABLES ,GHOST-NEW-C>
+                          ,GOAL-FUNCTION ,LOVER-XFER>
+                     <ESTABLISH-GOAL ,GHOST-NEW ,BASEMENT>
+                     <SET VAL <MOVE-PERSON ,GHOST-NEW ,LOVER-PATH>>)
+                    (T 
+                     <DRESS-GHOST .RM .C>
+                     <SET VAL <GHOST-INTO-PASSAGE .C>>
+                     <ESTABLISH-GOAL ,GHOST-NEW ,YOUR-CLOSET>)>)
+             (T
+              <COND (<FSET? ,GOAL-PERSON ,FEMALE>
+                     <PUTP ,GOAL-PERSON ,P?LDESC 24 ;"brushing her hair">)
+                    (T
+                     <PUTP ,GOAL-PERSON ,P?LDESC 25 ;"looking sleepy">)>
+              <PUT .GT ,ATTENTION-SPAN 5>
+              <PUT .GT ,ATTENTION 5>)>
+       <SETG FRIEND-FOUND-PASSAGES T>)>
+ %<DEBUG-CODE <COND (,IDEBUG <TELL N .VAL !\] CR>)>>
+ <RETURN .VAL>>
+
+<ROUTINE GHOST-INTO-PASSAGE (C "AUX" RM)
+       <SET RM <GET ,CHAR-CLOSET-TABLE <+ 1 .C>>>
+       <MOVE ,GHOST-NEW .RM>
+       <COND (<EQUAL? .RM ,HERE>
+              <SET RM <FIND-FLAG-LG .RM ,DOORBIT ,SECRETBIT>>
+              <FSET .RM ,OPENBIT>
+              <TELL CR CTHE .RM " bursts open!|">
+              <RETURN ,M-FATAL>)>>
+
+<ROUTINE TIME-FOR-GHOST? (RM "AUX" X)
+ <COND (<EQUAL? ,VILLAIN-PER ,LOVER>
+       <COND (<NOT <EQUAL? ,GOAL-PERSON ,DEB>>
+              <RFALSE>)>)
+       (T
+       <COND (<NOT <EQUAL? ,GOAL-PERSON ,VILLAIN-PER>>
+              <RFALSE>)>)>
+ <COND (<IN? ,VILLAIN-PER ,LOCAL-GLOBALS>
+       <RFALSE>)
+       (<EQUAL? ,GOAL-PERSON ,FRIEND>
+       <RFALSE>)
+       (<T? <GET ,FOUND-COSTUME ,PLAYER-C>>
+       <RFALSE>)
+       (<FSET? ,BLOWGUN ,TOUCHBIT>
+       <RFALSE>)
+       (<AND <SET X <FIND-FLAG-LG .RM ,DOORBIT ,SECRETBIT>>
+            <FSET? .X ,OPENBIT>>
+       <RFALSE>)
+       (<T? <FIND-FLAG .RM ,PERSONBIT ,VILLAIN-PER>>
+       <RFALSE>)
+       (T <RTRUE>)>>
+
+<ROUTINE DRESS-GHOST (L C "AUX" ADJ PT)
+       <MOVE ,GHOST-NEW .L>
+       <MOVE ,VILLAIN-PER ,LOCAL-GLOBALS>
+       <PUT ,CHAR-CLOSET-TABLE <+ 1 ,GHOST-NEW-C>
+            <GET ,CHAR-CLOSET-TABLE <+ 1 .C>>>
+       <COND (<SET ADJ <GETP ,VILLAIN-PER ,P?STATION>>
+              <SET PT <GETPT ,HEAD ,P?ADJECTIVE>>
+              <COND (<SETG OTHER-POSS-POS <ZMEMQB .ADJ .PT <RMGL-SIZE .PT>>>
+                     <PUTB .PT
+                           ,OTHER-POSS-POS ,A?G\'S>
+                     <PUTB <GETPT ,HANDS ,P?ADJECTIVE>
+                           ,OTHER-POSS-POS ,A?G\'S>
+                     <PUTB <GETPT ,EYE ,P?ADJECTIVE>
+                           ,OTHER-POSS-POS ,A?G\'S>)>)>
+       <FSET ,COSTUME ,NDESCBIT>
+       <FCLEAR ,COSTUME ,TAKEBIT>
+       <FSET ,COSTUME ,WORNBIT>
+       <MOVE ,COSTUME ,GHOST-NEW>
+       <COND (<==? .C ,DOCTOR-C>
+              <MOVE ,MUSTACHE ,WENDISH-KIT>
+              <FCLEAR ,MUSTACHE ,NDESCBIT>
+              <FSET ,MUSTACHE ,TAKEBIT>)>
+       <COND (<NOT <EQUAL? ,VARIATION ,LORD-C>>        ;"Dee is nonviolent."
+              <FSET ,BLOWGUN ,NDESCBIT>
+              <FCLEAR ,BLOWGUN ,TAKEBIT>
+              <MOVE ,BLOWGUN ,GHOST-NEW>)>
+       <PUT <GET ,GOAL-TABLES .C> ,GOAL-FUNCTION ,GHOST-LURKS>
+       <PUT <GET ,GOAL-TABLES .C> ,ATTENTION-SPAN 0 ;1>>
+
+<ROUTINE LOVER-XFER ("OPTIONAL" (GARG <>)
+                    "AUX" (VAL <>) (L <LOC ,GOAL-PERSON>))
+ %<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
+                    <TELL "[LOVER-XFER:">
+                    <COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
+ <COND (<==? .GARG ,G-ENROUTE>
+       <SET VAL <GHOST-LURKS .GARG>>)
+       (<==? .GARG ,G-REACHED>
+       <COND (<EQUAL? .L ,HERE>
+              <SET VAL <GHOST-LURKS .GARG>>)
+             (<EQUAL? .L ,BASEMENT>
+              <MOVE ,GOAL-PERSON ,KITCHEN>
+              <ESTABLISH-GOAL ,GOAL-PERSON ,BACKSTAIRS>
+              <SET VAL <GHOST-LURKS ,G-ENROUTE>>)
+             (<EQUAL? .L ,BACKSTAIRS>
+              <MOVE ,GOAL-PERSON ,DINING-PASSAGE>
+              <ESTABLISH-GOAL ,GOAL-PERSON ,YOUR-CLOSET>
+              <PUT <GT-O ,GOAL-PERSON> ,GOAL-FUNCTION ,GHOST-LURKS>
+              <SET VAL <GHOST-LURKS ,G-ENROUTE>>)>)>
+ %<DEBUG-CODE <COND (,IDEBUG <TELL N .VAL !\] CR>)>>
+ <RETURN .VAL>>
+
+<ROUTINE I-COME-TO ("OPTIONAL" (GARG <>) "AUX" P (L <>) V)
+       %<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
+                           <TELL "[I-COME-TO:">
+                           <COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
+       <COND (<IN? ,GHOST-NEW ,LOCAL-GLOBALS>
+              <SET P ,VILLAIN-PER>
+              <PUTP .P ,P?LDESC 4 ;"looking at you with suspicion">
+              <COND (<NOT <==? .P ,LOVER>>
+                     <PUT <GT-O .P> ,GOAL-FUNCTION ,X-RETIRES>
+                     <SET L <+ 1 <GETP .P ,P?CHARACTER>>>
+                     <COND (<FSET? <META-LOC .P> ,SECRETBIT>
+                            <SET L <GET ,CHAR-CLOSET-TABLE .L>>)
+                           (T <SET L <GET ,CHAR-ROOM-TABLE .L>>)>)>)
+             (T
+              <SET P ,GHOST-NEW>
+              <PUTP .P ,P?LDESC 0>
+              <FSET .P ,NDESCBIT>
+              <PUT <GT-O .P> ,GOAL-FUNCTION ,GHOST-LURKS>
+              <SET L ,YOUR-CLOSET>
+              <COND (<NOT <FSET? <LOC .P> ,SECRETBIT>>
+                    <GHOST-INTO-PASSAGE <GETP ,VILLAIN-PER ,P?CHARACTER>>)>)>
+       <FCLEAR .P ,MUNGBIT>
+       <SET V <VISIBLE? .P>>
+       <COND (<T? .V>
+              <TELL CTHE .P>
+              <COND (<WHERE? .P> <TELL !\,>)>
+              <TELL " shakes" HIS .P " head and comes to." CR>
+              <COND (<AND <EQUAL? ,VILLAIN-PER ,LOVER>
+                          <LOVER-SPEECH>>
+                     <SET V ,M-FATAL>)
+                    (<NOT <==? .P ,GHOST-NEW>>
+                     <SET V ,M-FATAL>
+                     <TELL
+CHE .P " says, \"I feel... sleepy. I think...\"" CR>)>)>
+       <COND (<T? .L>
+              <PUT <GT-O .P> ,GOAL-S T>
+              <ESTABLISH-GOAL .P .L>)>
+       %<DEBUG-CODE <COND (,IDEBUG <TELL N .V !\] CR>)>>
+       .V>
+
+<ROUTINE LOVER-SPEECH ()
+       <COND (<IN? ,GHOST-NEW ,HERE>
+              <SETG LOVER-SAID T>
+              <TELL
+CHE ,GHOST-NEW " says, \"Please don't speak, just listen! I'm really
+" 'LOVER ", and I'm alive. Jack tried to murder me, and I think he murdered
+Lionel! He pushed me down the well, but an underground stream carried me
+quickly to sea, where I was rescued by a yacht.|
+I have come back to " 'CASTLE " in disguise -- both to frighten him and
+to find some proof of Lionel's murder. And to incriminate " 'LORD " for
+my own 'murder' by planting the " 'JEWEL " from my necklace in the
+clothes he wore that night -- but then I lost it in the " 'DRAWING-ROOM
+".\"|
+She goes on, \"But now that you're on the case, I can leave the country
+with the yacht captain. Find proof of Lionel's murder, and we both can
+rest easily!\"|
+She races off ">
+              <GHOST-FLEES T>
+              <CONGRATS ,COSTUME>
+              <FSET ,LOVER ,SEENBIT>)>
+       <MOVE ,GHOST-NEW ,LIMBO>
+       <FSET ,GHOST-NEW ,MUNGBIT>
+       <PUT ,FOLLOW-LOC ,GHOST-NEW-C 0>
+       ,LOVER-SAID>
+
+<ROUTINE GHOST-FLEES ("OPT" (PART <>))
+       <COND (<ZERO? .PART>
+              <MOVE ,GHOST-NEW ,LIMBO>
+              <FSET ,GHOST-NEW ,MUNGBIT>
+              <PUT ,FOLLOW-LOC ,GHOST-NEW-C 0>
+              <TELL CHE ,GHOST-NEW " dodges your attack and flees ">)>
+       <COND (<==? ,HERE ,LOVER-PATH>
+              <TELL "down the path">)
+             (T <TELL "toward the " 'PRIEST-DOOR>)>
+       <TELL "." CR>>
+
+;<ROUTINE NEXT-ROOM (RM DIR "AUX" PT PTS)
+        <COND (<SET PT <GETPT .RM .DIR>>
+               <COND (<==? <SET PTS <PTSIZE .PT>> ,UEXIT>
+                      <GET-REXIT-ROOM .PT>)
+                     (<==? .PTS ,NEXIT>
+                      <RFALSE>)
+                     (<==? .PTS ,FEXIT>
+                      <APPLY <GET .PT ,FEXITFCN>>)
+                     (<==? .PTS ,CEXIT>
+                      <COND (<VALUE <GETB .PT ,CEXITFLAG>>
+                             <GET-REXIT-ROOM .PT>)>)
+                     (<==? .PTS ,DEXIT>
+                      <COND (T ;<FSET? <GET-DOOR-OBJ .PT> ,OPENBIT>
+                             <GET-REXIT-ROOM .PT>)>)>)>>
+
+<GLOBAL SHOOTER:OBJECT 0>
+<GLOBAL AIMED-HERE:OBJECT 0>
+
+;<GLOBAL TRIPPEE:OBJECT 0>
+;<ROUTINE FIND-TRIPPEE (RM "AUX" O)
+       <SET O <FIRST? .RM>>
+       <REPEAT ()
+        <COND (<ZERO? .O> <RETURN <>>)
+              (<AND <FSET? .O ,TAKEBIT>
+                    <L? 3 <GETP .O ,P?SIZE>>
+                    <NOT <FSET? .O ,INVISIBLE>>
+                    <NOT <==? .O ,TRIPPEE>>>
+               <RETURN .O>)
+              (T <SET O <NEXT? .O>>)>>>
+
+<ROUTINE GHOST-LURKS ("OPTIONAL" (GARG <>)
+                     "AUX" L OBJ (VAL <>) GT C)
+       %<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
+                           <TELL "[GHOST-LURKS:">
+                           <COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
+       <SET L <LOC ,GHOST-NEW>>
+       <SET C ,GHOST-NEW-C>
+       <SET GT <GET ,GOAL-TABLES .C>>
+       <COND ;(<AND <EQUAL? .GARG ,G-ENROUTE ,G-REACHED>
+                   <SET OBJ <FIND-TRIPPEE .L>>>
+              <SETG TRIPPEE .OBJ>
+              <SETG SHOOTER <>>
+              <QUEUE I-SHOT 0>
+              <FCLEAR ,GHOST-NEW ,NDESCBIT>
+              <PUTP ,GOAL-PERSON ,P?LDESC 19 ;"out cold">
+              <QUEUE I-COME-TO <+ 9 <RANDOM 6>>>
+              <COND (<EQUAL? .L ,HERE>
+                     <COND (<NOT <FSET? ,GHOST-NEW ,TOUCHBIT>>
+                            <GHOST-NEW-D>)>
+                     <SET VAL ,M-FATAL>
+                     <TELL
+CHE ,GOAL-PERSON " trips over" THE .OBJ " and falls heavily "
+<GROUND-DESC> "!" CR>)>
+              <FSET ,GOAL-PERSON ,MUNGBIT>)
+             (<EQUAL? .L ,HERE>
+              <COND (<NOT <FSET? ,GHOST-NEW ,TOUCHBIT>>
+                     <GHOST-NEW-D>)>
+              <SET VAL ,M-FATAL>
+              <SETG AIMED-HERE ,HERE>
+              <TELL "The ghost ">
+              <COND (<QUEUED? ,I-SHOT>
+                     <TELL "follows">)
+                    (T <TELL "approaches">)>
+              <THIS-IS-IT ,GHOST-NEW>
+              <TELL
+" you," HIS ,GHOST-NEW " cold eyes shining. In a moment," HE ,GHOST-NEW>
+              <COND ;(<EQUAL? ,VILLAIN-PER ,LOVER>
+                     <MOVE ,GHOST-NEW ,LIMBO>
+                     <FSET ,GHOST-NEW ,MUNGBIT>
+                     <PUT ,FOLLOW-LOC .C 0>
+                     <TELL " slips away." CR>)
+                    (T ;<NOT <QUEUED? ,I-SHOT>>
+                     <PUT .GT ,GOAL-ENABLE 0>
+                     <FSET ,PLAYER ,SEENBIT>
+                     <SETG SHOOTER ,GHOST-NEW>
+                     <QUEUE I-SHOT ,CLOCKER-RUNNING>
+                     <COND (<EQUAL? ,VILLAIN-PER ,LOVER>
+                            <PUTP ,GHOST-NEW,P?LDESC 17;"preparing to leave">
+                            <TELL " sees you and freezes." CR>)
+                           (T
+                            <PUTP ,GHOST-NEW ,P?LDESC 8 ;"poised to attack">
+                            <TELL " poi">
+                            <COND (<IN? ,BLOWGUN ,GHOST-NEW>
+                                   <SETG AIMED-HERE ,HERE>
+                                   <FCLEAR ,BLOWGUN ,NDESCBIT>
+                                   <TELL "nts" THE ,BLOWGUN " at">)
+                                  (T <TELL "ses to attack">)>
+                            <TELL " you." CR>)>)>)
+             (<==? .GARG ,G-REACHED>
+              <COND (<NOT <EQUAL? .L ,YOUR-CLOSET>>
+                     <ESTABLISH-GOAL ,GHOST-NEW ,YOUR-CLOSET>)
+                    (T
+                     <ESTABLISH-GOAL ,GHOST-NEW
+                                     <GET ,CHAR-CLOSET-TABLE <+ 1 .C>>>)>)>
+       %<DEBUG-CODE <COND (,IDEBUG <TELL N .VAL "]|">)>>
+       <RETURN .VAL>>
+
+<ROUTINE I-SHOT ("OPTIONAL" (GARG <>) "AUX" (VAL <>) L (GT <GT-O ,SHOOTER>))
+ %<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
+                    <TELL "[I-SHOT:">
+                    <COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
+ <COND (<EQUAL? ,VILLAIN-PER ,LOVER>
+       <COND (<IN? ,GHOST-NEW ,HERE>
+              <SET VAL T>
+              <TELL CHE ,GHOST-NEW " flees into the dark." CR>)>
+       <MOVE ,GHOST-NEW ,LIMBO>
+       <FSET ,GHOST-NEW ,MUNGBIT>
+       <PUT ,FOLLOW-LOC ,GHOST-NEW-C 0>)
+       (<EQUAL? ,AIMED-HERE ,HERE>
+       <COND (<NOT <IN? ,BLOWGUN ,SHOOTER>>
+              <TELL
+"You struggle to get free, but"
+THE ,SHOOTER "'s hands clench tighter around your throat! Soon
+the pain grows until the room begins to black out">
+              <COND (<==? ,SHOOTER ,GHOST-NEW>
+                     <TELL
+". Your only consolation is that the ghost's wig falls off, and just as
+you take your last breath, you see
+that it's really " D ,VILLAIN-PER>)>
+              <TELL "! But">)
+             (T
+              <COND (<FSET? ,HERE ,ONBIT>
+                     <TELL
+CHE ,SHOOTER " puts" THE ,BLOWGUN " to" HIS ,SHOOTER " lips and puffs"
+HIS ,SHOOTER " cheeks out and in. ">)>
+              <TELL
+"You feel a sharp pain in the chest. Your vision
+mists over, the room blacks out, and your legs give way beneath you.|
+The sad fact is, "FN", that you've been shot with a" ,POISON-DART ", and">)>
+       <TELL " for you, the game is over!|">
+       <FINISH>)
+       (<AND <T? ,SHOOTER>
+            <NOT <FSET? ,SHOOTER ,MUNGBIT>>>
+       <PUT .GT ,GOAL-ENABLE 2>
+       <COND (<FSET? ,HERE ,SECRETBIT>
+              <SET L ,HERE>)
+             (<EQUAL? ,SHOOTER ,GHOST-NEW>
+              <SET L <GET .GT ,GOAL-F>>)
+             (<ZERO? <SET L <GENERIC-CLOSET 0>>>
+              <SET L <GET ,CHAR-CLOSET-TABLE
+                          <+ 1 <GETP ,VILLAIN-PER ,P?CHARACTER>>>>)>
+       <PUT .GT ,GOAL-S .L>    ;"in case GOAL-REACHED called"
+       <ESTABLISH-GOAL ,SHOOTER .L>
+       <SETG SHOOTER <>>
+       <FSET ,BLOWGUN ,NDESCBIT>)>
+ %<DEBUG-CODE <COND (,IDEBUG <TELL N .VAL !\] CR>)>>
+ .VAL>
diff --git a/m5.errors b/m5.errors
new file mode 100644 (file)
index 0000000..493b0cd
--- /dev/null
+++ b/m5.errors
@@ -0,0 +1,28 @@
+Assembling M5.XZAP.1 on Wednesday, October 22, 1986 09:45:48
+Release: 9
+
+    64 Inserting M5FREQ.XZAP.1    (594 bytes)
+   658 Inserting M5DAT.ZAP.9    (25035 bytes)
+ 25693 Inserting MACROS.ZAP.4       (0 bytes)
+ 25693 Inserting MISC.ZAP.4      (1236 bytes)
+ 26929 Inserting SYNTAX.ZAP.4       (0 bytes)
+ 26929 Inserting PARSER.ZAP.4   (13085 bytes)
+ 40014 Inserting VERBS.ZAP.5    (21161 bytes)
+ 61175 Inserting GOAL.ZAP.1     (11194 bytes)
+ 72369 Inserting PEOPLE.ZAP.1   (23137 bytes)
+ 95506 Inserting CASTLE.ZAP.1   (10616 bytes)
+106122 Inserting TOWER.ZAP.1     (8181 bytes)
+114303 Inserting THINGS.ZAP.1    (2553 bytes)
+116856 Inserting PLACES.ZAP.1     (848 bytes)
+117704 Inserting GLOBAL.ZAP.1    (3165 bytes)
+120869 Inserting COLORS.ZAP.1    (4243 bytes)
+125112 Inserting M5STR.ZAP.9     (3754 bytes)
+253 objects.
+230 globals.
+955 word vocabulary.
+
+128866 bytes (126K).
+ 24439 bytes of preload.
+ 13860 bytes of impure.
+
+Outputting symbol tables
diff --git a/m5.record b/m5.record
new file mode 100644 (file)
index 0000000..2e7c312
--- /dev/null
+++ b/m5.record
@@ -0,0 +1,1353 @@
+
+Combined ZIL Compiler Ver 2.0 (MIM)
+-----------------------------------
+Input file: SS:<MOONMIST>M5.ZIL.1
+Input file: SS:<MOONMIST>MACROS.ZIL.56
+Input file: SS:<MOONMIST>MISC.ZIL.24
+Compiling routine: GO
+Compiling routine: PRINTT
+Compiling routine: THE?
+Compiling routine: START-SENTENCE
+Compiling routine: PRINTA
+Compiling routine: THIS-IS-IT
+Compiling routine: NO-PRONOUN?
+Compiling routine: HE-SHE-IT
+Compiling routine: HIM-HER-IT
+Compiling routine: QUEUE
+Compiling routine: INT
+Compiling routine: QUEUED?
+Compiling routine: CLOCKER
+Compiling routine: I-FOLLOW
+Compiling routine: I-ATTENTION
+Input file: SS:<MOONMIST>SYNTAX.ZIL.224
+Input file: SS:<MOONMIST>PARSER.ZIL.460
+ ** Note: Unknown value - PLAYER
+ ** Note: Unknown value - FRIEND
+ ** Note: Unknown value - LORD
+Compiling routine: MAIN-LOOP
+Compiling routine: MAIN-LOOP-1
+Compiling routine: TELL-I-ASSUME
+Compiling routine: VERB-ALL-TEST
+Compiling routine: GAME-VERB?
+Compiling routine: QCONTEXT-CHECK
+Compiling routine: QCONTEXT-GOOD?
+Compiling routine: NOT-IT
+Compiling routine: NOT-HERE-OBJECT-F
+Compiling routine: PRSO-VERB?
+Compiling routine: PRSI-VERB?
+Compiling routine: GEN-TEST
+Compiling routine: NOT-SECRET-TEST
+Compiling routine: PRUNE
+Compiling routine: ELIMINATE
+Compiling routine: MOBY-FIND
+Compiling routine: FIND-NOT-HERE
+Compiling routine: NOT-HERE-PRINT
+Compiling routine: SEE-VERB?
+Compiling routine: FIX-HIM-HER-IT
+Compiling routine: FAKE-ORPHAN
+Compiling routine: PERFORM
+Compiling routine: D-APPLY
+Compiling routine: I-PROMPT
+Compiling routine: BUZZER-WORD?
+Compiling routine: QUESTION-WORD?
+Compiling routine: TO-DO-X-USE-Y
+Compiling routine: NUMBER-WORD?
+Compiling routine: NAUGHTY-WORD?
+Compiling routine: NOT-THAT-WAY
+Compiling routine: PARSER
+Compiling routine: CHANGE-LEXV
+Compiling routine: PRINT-LEXV
+Compiling routine: STUFF
+Compiling routine: INBUF-STUFF
+Compiling routine: INBUF-ADD
+Compiling routine: FIX-POSSESSIVES
+Compiling routine: NAME?
+Compiling routine: XNAME?
+Compiling routine: WT?
+Compiling routine: CLAUSE
+Compiling routine: VERB-DIR-ONLY?
+Compiling routine: NUMBER?
+Compiling routine: ORPHAN-MERGE
+Compiling routine: CLAUSE-WIN
+Compiling routine: WORD-PRINT
+Compiling routine: UNKNOWN-WORD
+Compiling routine: CANT-USE
+Compiling routine: SYNTAX-CHECK
+Compiling routine: DONT-UNDERSTAND
+Compiling routine: VERB-PRINT
+Compiling routine: ORPHAN
+Compiling routine: CLAUSE-PRINT
+Compiling routine: BUFFER-PRINT
+Compiling routine: TITLE-NOUN?
+Compiling routine: CAPITAL-NOUN?
+Compiling routine: CAPITALIZE
+Compiling routine: PREP-PRINT
+Compiling routine: CLAUSE-COPY
+Compiling routine: CLAUSE-ADD
+Compiling routine: PREP-FIND
+Compiling routine: SYNTAX-FOUND
+Compiling routine: GWIM
+Compiling routine: SNARF-OBJECTS
+Compiling routine: BUT-MERGE
+Compiling routine: ADJ-CHECK
+Compiling routine: SNARFEM
+Compiling routine: RESOLVE-YOUR-HER-HIS
+Compiling routine: GET-OBJECT
+Compiling routine: GENERIC-CLUE-FCN
+Compiling routine: CLUE-TEST
+Compiling routine: GENERIC-STAIRS
+Compiling routine: GENERIC-CLOTHES
+Compiling routine: GENERIC-CLOSET
+Compiling routine: GENERIC-DINNER
+Compiling routine: GENERIC-BEDROOM
+Compiling routine: GENERIC-GREAT-HALL
+Compiling routine: GENERIC-LENS
+Compiling routine: GENERIC-RECORDER
+Compiling routine: GENERIC-BOX
+Compiling routine: GENERIC-BOOK
+Compiling routine: GENERIC-WELL
+Compiling routine: GENERIC-SKELETON
+Compiling routine: GENERIC-ROOM
+Compiling routine: GENERIC-EYE
+Compiling routine: GENERIC-BELL
+Compiling routine: GENERIC-WINE
+Compiling routine: SPEAKING-VERB?
+Compiling routine: MISSING
+Compiling routine: WHICH-PRINT
+Compiling routine: GLOBAL-SEARCH
+Compiling routine: GLOBAL-CHECK
+Compiling routine: DO-SL
+Compiling routine: SEARCH-LIST
+Compiling routine: ROOM-SEARCH
+Compiling routine: THIS-IT?
+Compiling routine: OBJ-FOUND
+Compiling routine: TAKE-CHECK
+Compiling routine: ITAKE-CHECK
+Compiling routine: MANY-CHECK
+Compiling routine: ZMEMQ
+Compiling routine: ZMEMQB
+ ** Note: Unknown value - DRIVEWAY
+Compiling routine: LIT?
+Compiling routine: NOT-HERE
+Compiling routine: PUT-ADJ-NAM
+Compiling routine: NOUN-USED?
+Compiling routine: ADJ-USED?
+Input file: SS:<MOONMIST>VERBS.ZIL.827
+Compiling routine: TRANSCRIPT
+Compiling routine: V-SCRIPT
+Compiling routine: V-UNSCRIPT
+Compiling routine: V-$VERIFY
+Compiling routine: YOU-WILL-GET
+Compiling routine: V-SUPER-BRIEF
+Compiling routine: V-BRIEF
+Compiling routine: V-VERBOSE
+Compiling routine: V-INVENTORY
+Compiling routine: V-QUIT
+Compiling routine: V-RESTART
+Compiling routine: TELL-FAILED
+Compiling routine: V-SAVE
+Compiling routine: V-RESTORE
+Compiling routine: V-FIRST-LOOK
+Compiling routine: V-VERSION
+Compiling routine: V-SCORE
+Compiling routine: YES?
+Compiling routine: NO-NEED
+Compiling routine: YOU-CANT
+Compiling routine: YOU-SHOULDNT
+Compiling routine: TELL-BEING-WORN
+Compiling routine: PRINT-CONTENTS
+Compiling routine: DESCRIBE-OBJECTS
+Compiling routine: SEE-ANYTHING-IN?
+Compiling routine: DESCRIBE-ROOM
+Compiling routine: HAR-HAR
+Compiling routine: PICK-ONE-NEW
+Compiling routine: PICK-ONE
+Compiling routine: NOT-HOLDING?
+Compiling routine: NEW-FOLLOWER
+Compiling routine: FRIEND-FOLLOWS-YOU
+Compiling routine: NOT-INTO-PASSAGE
+Compiling routine: TOUR?
+Compiling routine: CREEPY?
+Compiling routine: GOTO
+Compiling routine: HACK-HACK
+Compiling routine: HELD?
+Compiling routine: IDROP
+Compiling routine: ITAKE
+Compiling routine: CCOUNT
+Compiling routine: CHECK-DOOR
+Compiling routine: ROOM-CHECK
+Compiling routine: SEE-INSIDE?
+Compiling routine: ARENT-TALKING
+Compiling routine: ALREADY
+Compiling routine: NOT-CLEAR-WHOM
+Compiling routine: OKAY
+Compiling routine: TOO-BAD-BUT
+Compiling routine: TOO-DARK
+Compiling routine: VISIBLE?
+Compiling routine: ACCESSIBLE?
+Compiling routine: META-LOC
+Compiling routine: WHO-CARES
+Compiling routine: PRE-SAIM
+Compiling routine: V-SAIM
+Compiling routine: V-AIM
+Compiling routine: PRE-SANALYZE
+Compiling routine: V-SANALYZE
+Compiling routine: PRE-ANALYZE
+Compiling routine: V-ANALYZE
+Compiling routine: V-ANSWER
+Compiling routine: V-REPLY
+Compiling routine: WAITING-FOR-YOU-TO-SPEAK
+Compiling routine: PRE-ARREST
+Compiling routine: TELL-BAD-FORM
+Compiling routine: V-ARREST
+Compiling routine: CONFESSION
+Compiling routine: WRAP-UP
+Compiling routine: V-ASK
+Compiling routine: PRE-ASK-ABOUT
+Compiling routine: V-ASK-ABOUT
+Compiling routine: WONT-HELP-TO-TALK-TO
+Compiling routine: PRE-ASK-CONTEXT-ABOUT
+Compiling routine: V-ASK-CONTEXT-ABOUT
+Compiling routine: V-ASK-FOR
+Compiling routine: PRE-ASK-CONTEXT-FOR
+Compiling routine: V-ASK-CONTEXT-FOR
+Compiling routine: V-ATTACK
+Compiling routine: V-BOW
+Compiling routine: PRE-BRUSH
+Compiling routine: V-BRUSH
+Compiling routine: UNCLEAN
+Compiling routine: REMOVE-CAREFULLY
+Compiling routine: V-$CALL
+Compiling routine: V-CHASTISE
+Compiling routine: V-BOARD
+Compiling routine: V-CLIMB-ON
+Compiling routine: V-CLIMB-UP
+Compiling routine: V-CLIMB-DOWN
+Compiling routine: V-CLOSE
+Compiling routine: PRE-COMPARE
+Compiling routine: V-COMPARE
+Compiling routine: V-CONFRONT
+Compiling routine: V-MUNG
+Compiling routine: V-DANCE
+Compiling routine: PRE-DESCRIBE
+Compiling routine: V-DESCRIBE
+Compiling routine: V-UNDRESS
+Compiling routine: V-DRESS
+Compiling routine: FIND-OUTFIT
+Compiling routine: FIND-OUTFIT-IN
+Compiling routine: V-CHANGE
+Compiling routine: PRE-DRIVE-TO
+Compiling routine: TELL-NOT-IN
+Compiling routine: V-DRIVE-TO
+Compiling routine: V-DRINK
+Compiling routine: V-DROP
+Compiling routine: GROUND-DESC
+Compiling routine: PRE-EAT
+Compiling routine: V-EAT
+Compiling routine: PRE-EMPTY
+Compiling routine: V-EMPTY
+Compiling routine: PRE-THROUGH
+Compiling routine: V-THROUGH
+Compiling routine: PRE-EXAMINE
+Compiling routine: V-EXAMINE
+Compiling routine: NOTHING-SPECIAL
+Compiling routine: GLOBAL-IN?
+Compiling routine: V-FAINT
+Compiling routine: V-FILL
+Compiling routine: PRE-FIND
+Compiling routine: BITE-YOU
+Compiling routine: FAR-AWAY?
+Compiling routine: V-FIND
+Compiling routine: NO-FUN
+Compiling routine: TELL-LOCATION
+Compiling routine: V-FIX
+Compiling routine: FOLLOW-LOC?
+Compiling routine: V-FOLLOW
+Compiling routine: V-FOO
+Compiling routine: V-FORGIVE
+Compiling routine: PRE-GIVE
+Compiling routine: V-GIVE
+Compiling routine: PRE-SGIVE
+Compiling routine: V-SGIVE
+Compiling routine: PRE-HELLO
+Compiling routine: V-HELLO
+Compiling routine: V-HELP
+Compiling routine: HELP-TEXT
+Compiling routine: V-KILL
+Compiling routine: IKILL
+Compiling routine: V-KISS
+Compiling routine: V-KNOCK
+Compiling routine: V-STAND
+Compiling routine: V-LEAP
+Compiling routine: V-SKIP
+Compiling routine: WHEE
+Compiling routine: V-LEAVE
+Compiling routine: PRE-LIE
+Compiling routine: V-LIE
+Compiling routine: PRE-LISTEN
+Compiling routine: V-LISTEN
+Compiling routine: V-LOCK
+Compiling routine: V-LOOK
+Compiling routine: V-LOOK-BEHIND
+Compiling routine: V-LOOK-DOWN
+Compiling routine: PRE-LOOK-INSIDE
+Compiling routine: V-LOOK-INSIDE
+Compiling routine: FIRST-YOU
+Compiling routine: V-LOOK-THROUGH
+Compiling routine: NO-BEYOND
+Compiling routine: ROOM-PEEK
+Compiling routine: SEE-INTO?
+Compiling routine: TELL-CANT-FIND
+Compiling routine: V-LOOK-ON
+Compiling routine: V-LOOK-OUTSIDE
+Compiling routine: PRE-LOOK-UNDER
+Compiling routine: V-LOOK-UNDER
+Compiling routine: V-LOOK-UP
+Compiling routine: PRE-MEET
+Compiling routine: V-MEET
+Compiling routine: PRE-MOVE
+Compiling routine: V-MOVE
+Compiling routine: PRE-MOVE-DIR
+Compiling routine: V-MOVE-DIR
+Compiling routine: V-NOD
+Compiling routine: V-OPEN
+Compiling routine: PRE-OPEN-WITH
+Compiling routine: V-OPEN-WITH
+Compiling routine: V-PLAY
+Compiling routine: V-POUR
+Compiling routine: V-PRAY
+Compiling routine: V-PUSH
+Compiling routine: WEAR-CHECK
+Compiling routine: PRE-PUT
+Compiling routine: V-PUT
+Compiling routine: TELL-FIND-NONE
+Compiling routine: PRE-PUT-IN
+Compiling routine: V-PUT-IN
+Compiling routine: PUT-ON-OR-IN
+Compiling routine: WEIGHT
+Compiling routine: V-PUT-UNDER
+Compiling routine: PRE-SREAD
+Compiling routine: V-SREAD
+Compiling routine: PRE-READ
+Compiling routine: V-READ
+Compiling routine: V-REMOVE
+Compiling routine: V-RING
+Compiling routine: V-RUB
+Compiling routine: V-SAY
+Compiling routine: PRE-SEARCH
+Compiling routine: V-SEARCH
+Compiling routine: DISCOVER
+Compiling routine: CONGRATS
+Compiling routine: PRE-SSEARCH-FOR
+Compiling routine: V-SSEARCH-FOR
+Compiling routine: PRE-SEARCH-FOR
+Compiling routine: V-SEARCH-FOR
+Compiling routine: V-SHAKE
+Compiling routine: V-SHOOT
+Compiling routine: PRE-SSHOOT
+Compiling routine: V-SSHOOT
+Compiling routine: V-SHOW
+Compiling routine: PRE-SSHOW
+Compiling routine: V-SSHOW
+Compiling routine: V-SIGN
+Compiling routine: PRE-SIT
+Compiling routine: V-SIT
+Compiling routine: WONT-HELP
+Compiling routine: V-SIT-AT
+Compiling routine: V-SLAP
+Compiling routine: IF-SPY
+Compiling routine: FACE-RED
+Compiling routine: V-SMELL
+Compiling routine: V-SMILE
+Compiling routine: V-SORRY
+Compiling routine: V-SOUND
+Compiling routine: V-STOP
+Compiling routine: V-SWIM
+Compiling routine: PRE-TAKE
+Compiling routine: PRE-TAKE-WITH
+Compiling routine: V-TAKE
+Compiling routine: V-TAKE-OFF
+Compiling routine: V-TAKE-TO
+Compiling routine: V-DISEMBARK
+Compiling routine: OWN-FEET
+Compiling routine: V-HOLD-UP
+Compiling routine: V-TELL
+Compiling routine: PRE-STELL-ABOUT
+Compiling routine: V-STELL-ABOUT
+Compiling routine: PRE-TELL-ABOUT
+Compiling routine: V-TELL-ABOUT
+Compiling routine: PRE-TALK-ABOUT
+Compiling routine: V-TALK-ABOUT
+Compiling routine: V-THANKS
+Compiling routine: V-THROW
+Compiling routine: V-THROW-AT
+Compiling routine: PRE-THROW-THROUGH
+Compiling routine: V-THROW-THROUGH
+Compiling routine: V-TIME
+Compiling routine: TIME-PRINT
+Compiling routine: V-TURN
+Compiling routine: V-LAMP-OFF
+Compiling routine: V-LAMP-ON
+Compiling routine: V-UNLOCK
+Compiling routine: MORE-SPECIFIC
+Compiling routine: V-USE
+Compiling routine: V-WAIT
+Compiling routine: V-WAIT-FOR
+Compiling routine: V-WAIT-UNTIL
+Compiling routine: V-ALARM
+Compiling routine: DO-WALK
+Compiling routine: V-WALK
+Compiling routine: UNLOCK-DOOR?
+Compiling routine: WALK-THRU-DOOR?
+Compiling routine: OPEN-DOOR-AND-CLOSE-IT-AGAIN
+Compiling routine: V-WALK-AROUND
+Compiling routine: WHO-KNOWS?
+Compiling routine: WALK-WITHIN-ROOM
+Compiling routine: V-WALK-TO
+Compiling routine: ENTER-ROOM
+Compiling routine: V-RUN-OVER
+Compiling routine: NO-CHANGING?
+Compiling routine: V-WEAR
+Compiling routine: V-YELL
+Compiling routine: V-YES
+Compiling routine: V-NO
+Compiling routine: FINISH
+Compiling routine: DIVESTMENT?
+Compiling routine: REMOTE-VERB?
+Input file: SS:<MOONMIST>GOAL.ZIL.601
+Compiling routine: FOLLOW-GOAL
+Compiling routine: FOLLOW-GOAL-NEXT
+Compiling routine: GET-LINE
+Compiling routine: IN-MOTION?
+Compiling routine: ESTABLISH-GOAL
+Compiling routine: GOAL-REACHED
+Compiling routine: ENTERS?
+Compiling routine: TELL-OPEN-DOOR
+Compiling routine: TELL-HIS-HER-BEDROOM
+Compiling routine: TELL-LOCKING-THE-DOOR
+Compiling routine: MOVE-PERSON
+Compiling routine: COMPASS-EQV
+Compiling routine: DIR-EQV?
+Compiling routine: DIR-FROM
+Compiling routine: DIR-FROM-TEST
+Compiling routine: I-PLAYER
+Compiling routine: GOODNIGHT
+Compiling routine: GRAB-ATTENTION
+Compiling routine: ANGRY-REJECT?
+Compiling routine: WHERE?
+Compiling routine: DIR-PRINT
+Compiling routine: OPP-DIR
+Compiling routine: I-TOUR
+Compiling routine: I-FRIEND-GREETS
+Compiling routine: BUTLER-APPEARS
+Compiling routine: BUTLER-FETCHES
+Compiling routine: TAMARA-LEAVES-YOU
+Compiling routine: BUTLER-CARRIES
+Compiling routine: I-BUTLER-HINTS
+Compiling routine: I-BUTLER-COOKS
+Compiling routine: BUTLER-COOKS
+Compiling routine: I-BUTLER-SERVES
+Compiling routine: BUTLER-SERVES
+Compiling routine: X-WAITS
+Compiling routine: I-DINNER
+Compiling routine: BUTLER-RINGS-BELL?
+Compiling routine: BUTLER-LEAVES
+Compiling routine: I-DINNER-SIT
+Compiling routine: I-LIONEL-SPEAKS
+Compiling routine: MAKE-ALL-PEOPLE
+Compiling routine: I-WITHDRAW
+Compiling routine: I-SEARCH
+Compiling routine: X-SEARCHES
+Compiling routine: I-DISCOVERED
+Compiling routine: I-FOUND-PASSAGES
+Compiling routine: FOUND-PASSAGES-REPEAT
+Compiling routine: I-BEDTIME
+Compiling routine: FRIEND-PASSAGE-STORY
+Compiling routine: X-RETIRES
+Compiling routine: GHOST-INTO-PASSAGE
+Compiling routine: TIME-FOR-GHOST?
+Compiling routine: DRESS-GHOST
+Compiling routine: LOVER-XFER
+Compiling routine: I-COME-TO
+Compiling routine: LOVER-SPEECH
+Compiling routine: GHOST-FLEES
+Compiling routine: GHOST-LURKS
+Compiling routine: I-SHOT
+Input file: SS:<MOONMIST>PEOPLE.ZIL.806
+Compiling routine: PLAYER-NAME-F
+Compiling routine: PLAYER-F
+Compiling routine: PLEASE-ANSWER
+Compiling routine: TOO-BAD-SIT-HIDE
+Compiling routine: FRIEND-D
+ ** Note: Unknown value - BUTLER
+ ** Note: Unknown value - BUTLER
+ ** Note: Unknown value - DOCTOR
+ ** Note: Unknown value - OFFICER
+ ** Note: Unknown value - BUTLER
+ ** Note: Unknown value - DEB
+ ** Note: Unknown value - OFFICER
+ ** Note: Unknown value - BUTLER
+Compiling routine: I-REPLY
+Compiling routine: FRIEND-F
+Compiling routine: TAMARA-EVIDENCE-F
+Compiling routine: ASKING-ABOUT?
+Compiling routine: LORD-INTRO
+Compiling routine: TELL-FULL-NAME
+Compiling routine: LORD-D
+Compiling routine: LORD-GHOST-STORY
+Compiling routine: LORD-F
+Compiling routine: CLUE-2-STORY
+Compiling routine: TELL-DUNNO
+Compiling routine: JACK-TAPE-F
+Compiling routine: LOVER-D
+Compiling routine: LOVER-F
+Compiling routine: DEB-D
+Compiling routine: DEB-F
+Compiling routine: WILLING?
+Compiling routine: OFFICER-D
+Compiling routine: I-JUST-LOVE-IT
+Compiling routine: WINNER-DEFAULT
+Compiling routine: OFFICER-F
+Compiling routine: IAN-CALLS-YOU
+Compiling routine: DOCTOR-D
+Compiling routine: DOCTOR-F
+Compiling routine: MUSTACHE-F
+Compiling routine: WENDISH-BOOK-F
+Compiling routine: DEALER-D
+Compiling routine: DEALER-F
+Compiling routine: PAINTER-D
+Compiling routine: PAINTER-F
+Compiling routine: VIVIEN-DIARY-F
+Compiling routine: COUSIN-F
+Compiling routine: BOLITHO-WILL
+Compiling routine: BUTLER-D
+Compiling routine: BUTLER-SORRY
+Compiling routine: BUTLER-F
+Compiling routine: IN-CASE-OF-BLACKOUT
+Compiling routine: BUTLER-GHOST-STORY
+Compiling routine: BUTLER-MIRROR-STORY
+Compiling routine: GHOST-NEW-D
+Compiling routine: GHOST-NEW-F
+Compiling routine: GHOST-NEW-VERBS
+Compiling routine: UNDRESS-GHOST
+Compiling routine: DESCRIBE-GOWN
+Compiling routine: COSTUME-F
+Compiling routine: WEAR-SCARE
+Compiling routine: WHY-ME
+Compiling routine: DESCRIBE-PERSON
+Compiling routine: ALL-TOGETHER-NOW?
+Compiling routine: TELL-ABOUT-OBJECT
+Compiling routine: PERSON-F
+Compiling routine: SECRET-PASSAGE-OR-DOOR?
+Compiling routine: CARRY-CHECK
+Compiling routine: WINNER-DESCRIBE
+Compiling routine: TRANSIT-TEST
+Compiling routine: COM-CHECK
+Compiling routine: EVIDENCE?
+Compiling routine: SETUP-SHOT
+Compiling routine: COMMON-ASK-ABOUT
+Compiling routine: SHOWING-CLUE?
+Compiling routine: TREASURE-FOUND?
+Compiling routine: TELL-STOP-SEARCHING?
+Compiling routine: GOOD-SHOW
+Compiling routine: COMMON-DESC
+Compiling routine: COMMON-OTHER
+Compiling routine: UNSNOOZE
+Compiling routine: FIX-MUSTACHE
+Compiling routine: OBJECT-PAIR-F
+Compiling routine: CREW-GLOBAL-F
+Input file: SS:<MOONMIST>CASTLE.ZIL.721
+Compiling routine: CASTLE-F
+Compiling routine: TOWER-F
+Compiling routine: MOON-F
+Compiling routine: OCEAN-F
+Compiling routine: CAR-DOOR-PSEUDO
+Compiling routine: DRIVING?
+Compiling routine: CAR-F
+Compiling routine: CAR-TO-COURTYARD
+Compiling routine: CAR-TO-DRIVEWAY
+Compiling routine: TELL-ABOUT-CAR
+Compiling routine: VOICE-F
+Compiling routine: HORN-F
+Compiling routine: DRIVEWAY-F
+Compiling routine: DRAGON-F
+Compiling routine: TELL-ABOUT-DRAGON
+Compiling routine: I-DRAGON-EYE
+Compiling routine: DRAGON-EYE-F
+Compiling routine: TELL-ABOUT-EYE
+Compiling routine: VOICE-SAYS
+Compiling routine: GATE-OPENS
+Compiling routine: FRONT-GATE-F
+Compiling routine: COURTYARD-F
+Compiling routine: TELL-LIKE-BROCHURE
+Compiling routine: MAZE-EXIT
+Compiling routine: MAZE-F
+Compiling routine: GARDEN-F
+Compiling routine: POND-F
+Compiling routine: FRONT-DOOR-F
+Compiling routine: FOYER-F
+Compiling routine: DESCRIBE-CONTENTS
+Compiling routine: UMBRELLA-STAND-F
+Compiling routine: DRAWING-ROOM-F
+Compiling routine: LOVER-PIC-F
+Compiling routine: TAPESTRY-F
+Compiling routine: GREAT-HALL-F
+Compiling routine: GREAT-HALL-IS-FLOORED
+Compiling routine: ARMOR-F
+Compiling routine: SECRET-SITTING-DOOR-F
+Compiling routine: SITTING-ROOM-F
+Compiling routine: WYVERN-F
+Compiling routine: WRITING-DESK-F
+Compiling routine: PIANO-F
+Compiling routine: MUSIC-F
+Compiling routine: CORR-1-F
+Compiling routine: DINING-ROOM-F
+Compiling routine: I-DINNER-TALK
+Compiling routine: DINNER-TALK
+Compiling routine: POPULATION
+Compiling routine: BUST-D
+Compiling routine: BUST-F
+Compiling routine: RECORDER-F
+Compiling routine: TABLE-DINING-F
+Compiling routine: PUNCHBOWL-F
+Compiling routine: DINNER-D
+Compiling routine: DINNER-F
+Compiling routine: BACKSTAIRS-F
+Compiling routine: KITCHEN-F
+Compiling routine: LANTERN
+Compiling routine: GALLERY-F
+Compiling routine: PICTURE-F
+Compiling routine: BATHROOM-F
+Compiling routine: FIREPLACE-F
+Compiling routine: BED-PSEUDO
+Compiling routine: NIGHTSTAND-LG-F
+Compiling routine: DRESSING-TABLE-LG-F
+Compiling routine: MIRROR-GLOBAL-F
+Compiling routine: OPEN-DOOR?
+Compiling routine: YOUR-ROOM-F
+Compiling routine: ENTER-PASSAGE
+Compiling routine: BED-F
+Compiling routine: NIGHTSTAND-F
+Compiling routine: TELL-AS-WELL-AS
+Compiling routine: DRESSING-MIRROR-F
+Compiling routine: YOUR-MIRROR-F
+Compiling routine: YOUR-SWITCH-F
+Compiling routine: YOUR-BATHROOM-F
+Compiling routine: TOILET-PSEUDO
+Compiling routine: BATH-PSEUDO
+Compiling routine: IRIS-ROOM-F
+Compiling routine: WENDISH-ROOM-F
+Compiling routine: CANDLE-F
+Compiling routine: WENDISH-STUFF-D
+Compiling routine: WENDISH-STUFF-F
+Compiling routine: WENDISH-KIT-F
+Compiling routine: SEARCH-KIT-BOX
+Compiling routine: VIVIEN-ROOM-F
+Compiling routine: VIVIEN-BOX-F
+Compiling routine: FIGURINE-F
+Compiling routine: IAN-ROOM-F
+Compiling routine: TELL-IAN-FIREPLACE
+Compiling routine: ANDIRON-F
+Compiling routine: HYDE-ROOM-F
+Input file: SS:<MOONMIST>TOWER.ZIL.528
+Compiling routine: TELL-IN-BROCHURE
+Compiling routine: BROCHURE-PSEUDO
+Compiling routine: MEMENTO-F
+Compiling routine: OLD-GREAT-HALL-F
+Compiling routine: JUNCTION-F
+Compiling routine: BASEMENT-ENTER
+Compiling routine: BASEMENT-F
+Compiling routine: WINE-RACK-F
+Compiling routine: BOTTLE-F
+Compiling routine: BRICKS-D
+Compiling routine: BRICKS-F
+Compiling routine: HOLE-IN-WALL-F
+Compiling routine: WELL-F
+Compiling routine: CRYPT-F
+Compiling routine: SKELETON-F
+Compiling routine: DUNGEON-F
+Compiling routine: IRON-MAIDEN-F
+Compiling routine: COFFIN-F
+Compiling routine: LOVER-PATH-LOSE-N
+Compiling routine: LOVER-PATH-LOSE
+Compiling routine: LOVER-PATH-F
+Compiling routine: CORR-2-F
+Compiling routine: CREST-F
+Compiling routine: TV-PSEUDO
+Compiling routine: JACK-ROOM-F
+Compiling routine: NOT-FOUND
+Compiling routine: FREE-VERB?
+Compiling routine: SECRET-CHECK
+Compiling routine: OPEN-SECRET
+Compiling routine: TELESCOPE-F
+Compiling routine: LIBRARY-F
+Compiling routine: BOOKS-GLOBAL-F
+Compiling routine: BOOKCASE-F
+Compiling routine: HISTORY-BOOK-F
+ ** Note: Non-predicate jump flushed MOVE
+Compiling routine: JOURNAL-F
+Compiling routine: OFFICE-F
+Compiling routine: INKWELL-F
+Compiling routine: COMPUTER-F
+Compiling routine: TAMARA-ROOM-F
+Compiling routine: DRESSING-TABLE-TAM
+Compiling routine: TAMARA-BED-F
+Compiling routine: JEWELRY-CASE-F
+Compiling routine: EARRING-F
+Compiling routine: CORR-3-F
+Compiling routine: CAGE-PSEUDO
+Compiling routine: LUMBER-ROOM-F
+Compiling routine: LUMBER-CHEST-F
+Compiling routine: LUMBER-RING-F
+Compiling routine: PEEPHOLE-2-F
+Compiling routine: MAGAZINE-F
+Compiling routine: CHAPEL-F
+Compiling routine: STAINED-WINDOW-F
+Compiling routine: BILLIARD-PSEUDO
+Compiling routine: BUFFALO-HEAD-F
+Compiling routine: RHINO-HEAD-F
+Compiling routine: GLASS-EYE-F
+Compiling routine: DECK-F
+Compiling routine: BELL-F
+Compiling routine: GO-TO-SOUND
+Compiling routine: X-TO-BELL
+Compiling routine: LADDER-F
+Compiling routine: LEVER-AND-DOOR
+Compiling routine: SECRET-LANDING-JACK-F
+Compiling routine: PASSAGE-1-F
+Compiling routine: SECRET-LANDING-TAM-F
+Compiling routine: SECRET-VIVIEN-PASSAGE-F
+Compiling routine: DINING-PASSAGE-F
+Compiling routine: SECRET-LANDING-LIB-F
+Compiling routine: SECRET-IAN-PASSAGE-F
+Compiling routine: SITTING-PASSAGE-F
+Compiling routine: SITTING-PASSAGE-LOSE
+Compiling routine: YOUR-CLOSET-F
+Compiling routine: PASSAGE-DESC?
+Compiling routine: IRIS-CLOSET-F
+Compiling routine: WENDISH-CORNER-F
+Compiling routine: MIDPOINT-F
+Compiling routine: DRAWING-CLOSET-F
+Compiling routine: GALLERY-CORNER-F
+Compiling routine: PEEPHOLE-F
+Compiling routine: HYDE-CLOSET-F
+Input file: SS:<MOONMIST>THINGS.ZIL.207
+Compiling routine: RANDOM-PSEUDO
+Compiling routine: LUGGAGE-F
+Compiling routine: BROCHURE-F
+Compiling routine: BLOWGUN-F
+Compiling routine: NO-VIOLENCE?
+Compiling routine: SHOOTING
+Compiling routine: MACE-F
+Compiling routine: NECKLACE-OF-D-F
+Compiling routine: LENS-2-F
+Compiling routine: LENS-BOX-F
+Compiling routine: LETTER-F
+Compiling routine: LETTER-MAID-F
+Compiling routine: LETTER-DEE-F
+Input file: SS:<MOONMIST>PLACES.ZIL.94
+Compiling routine: NULL-F
+Compiling routine: DOOR-ROOM
+Compiling routine: FIND-FLAG
+Compiling routine: FIND-FLAG-NOT
+Compiling routine: FIND-FLAG-LG
+Compiling routine: FIND-FLAG-HERE
+Compiling routine: FIND-FLAG-HERE-NOT
+Compiling routine: LEVER-F
+Compiling routine: OPEN-CLOSE
+Compiling routine: OUTSIDE?
+Compiling routine: WINDOW-F
+Compiling routine: CORRIDOR-LOOK
+Compiling routine: CORRIDOR-CHECK
+Input file: SS:<MOONMIST>GLOBAL.ZIL.354
+Compiling routine: LOCAL-GLOBALS-F
+Compiling routine: UPSTAIRS-DOWNSTAIRS
+Compiling routine: DO-INSTEAD-OF
+Compiling routine: TURN-F
+Compiling routine: IT-F
+Compiling routine: FLOOR-F
+Compiling routine: START-SEARCH
+Compiling routine: I-FOUND-IT
+Compiling routine: YOU-F
+Compiling routine: WALL-F
+Compiling routine: GLOBAL-HERE-F
+Compiling routine: CHAIR-F
+Compiling routine: CLOTHES-FCN
+Compiling routine: SLEEP-GLOBAL-F
+Compiling routine: ROB
+Compiling routine: LIGHT-GLOBAL-F
+Compiling routine: HAUNTING-F
+Compiling routine: KEYHOLE-F
+Compiling routine: HANDS-F
+Compiling routine: HEAD-F
+Compiling routine: EYE-F
+Compiling routine: FIND-BODY
+Compiling routine: PASSAGE-F
+Compiling routine: CORPSE-F
+Compiling routine: UNDRESSED-F
+Compiling routine: ARTIFACT-F
+Compiling routine: TIMES-UP
+Input file: SS:<MOONMIST>COLORS.ZIL.353
+Compiling routine: INTRO
+Compiling routine: YOUR-COLOR-F
+Compiling routine: GET-COLOR
+Compiling routine: FIX-COLOR-ADJ
+Compiling routine: DO-VARIATION
+Compiling routine: CANE-F
+Compiling routine: PAINT-F
+Compiling routine: DISCOVER-WAR-CLUB
+Compiling routine: ATTACK-VERB?
+Compiling routine: WAR-CLUB-F
+Compiling routine: DESCRIBE-WAR-CLUB
+Compiling routine: SKULL-F
+Compiling routine: MOONMIST-F
+Compiling routine: CLUE-1-F
+Compiling routine: CLUE-2-F
+Compiling routine: CLUE-3-F
+Compiling routine: CLUE-4-F
+Compiling routine: PRINT-COLOR
+Compiling routine: TELL-SUFFIX
+Compiling routine: TITLE-NAME
+Compiling routine: TITLE
+Compiling routine: NON-BLANK-STUFF
+Compiling routine: FULL-NAME
+Compiling routine: GET-NAME
+Compiling routine: PRINT-NAME
+ ** Warning: Never defined - A?GREEN
+ ** Warning: Never defined - A?BLUE
+ ** Warning: Never defined - A?RED
+ ** Warning: Never defined - A?YELLOW
+
+Warnings: 4
+ ** Note: OBJECT has no properties: ROOMS
+ ** Note: OBJECT has no properties: GENERIC-CLUE
+Vocabulary: 955
+Prepositions: 24
+        IN
+        UNTIL
+        AGAINST
+        BESIDE
+        AWAY
+        BEHIND
+        AROUND
+        ACROSS
+        RID
+        FROM
+        THROUGH
+        OVER
+        DOWN
+        UP
+        OFF
+        ABOUT
+        ON
+        UNDER
+        OUT
+        FOR
+        WITH
+        TO
+        AT
+Objects: 253
+        BUST
+        HORN
+        MEMENTO
+        WENDISH-CHAIR
+        PUNCHBOWL
+        LOVER-PIC
+        POND
+        WINDOW
+        COURTYARD
+        DRAWING-ROOM
+        TOMB
+        IRIS-CHAIR
+        DRIVEWAY
+        WENDISH-ROOM
+        SECRET-SITTING-DOOR
+        WELL
+        LIBRARY-CHAIR
+        DUNGEON
+        EARRING
+        CORR-3
+        LUMBER-ROOM
+        CHAPEL
+        GAME-ROOM
+        LUMBER-CHEST
+        LUMBER-RING
+        PEEPHOLE-2
+        MAGAZINE
+        STAINED-WINDOW
+        BUFFALO-HEAD
+        RHINO-HEAD
+        GLASS-EYE
+        DECK
+        LADDER
+        SECRET-LANDING-JACK
+        PASSAGE-1
+        SECRET-LANDING-TAM
+        SECRET-VIVIEN-PASSAGE
+        DINING-PASSAGE
+        SECRET-LANDING-LIB
+        SECRET-IAN-PASSAGE
+        SITTING-PASSAGE
+        YOUR-CLOSET
+        IRIS-CLOSET
+        WENDISH-CORNER
+        MIDPOINT
+        DRAWING-CLOSET
+        GALLERY-CORNER
+        HYDE-CLOSET
+        PSEUDO-OBJECT
+        LUGGAGE
+        BROCHURE
+        BLOWGUN
+        MACE
+        NECKLACE-OF-D
+        JEWEL
+        LENS
+        LENS-BOX
+        LENS-1
+        LENS-2
+        LETTER
+        LETTER-MAID
+        LETTER-DEE
+        TURN
+        IT
+        FLOOR
+        DANGER
+        INTNUM
+        YOU
+        WALL
+        GLOBAL-HERE
+        TWEED-OUTFIT
+        SLEEP-OUTFIT
+        EXERCISE-OUTFIT
+        DINNER-OUTFIT
+        SLEEP-GLOBAL
+        LIGHT-GLOBAL
+        HAUNTING
+        KEYHOLE
+        HANDS
+        HEAD
+        EYE
+        PASSAGE
+        ROMANCE
+        ACCIDENT
+        CORPSE
+        UNDRESSED
+        ARTIFACT
+        YOUR-COLOR
+        CANE
+        PAINT
+        WAR-CLUB
+        SKULL
+        NECKLACE
+        MOONMIST
+        GENERIC-CLUE
+        CLUE-1
+        CLUE-2
+        CLUE-3
+        CLUE-4
+        TABLE-LIBRARY
+        SECRET-HYDE-DOOR
+        GARDEN
+        JUNCTION
+        WENDISH-STUFF
+        VICTORIA-CHAIR
+        BACKSTAIRS
+        MAZE
+        COAT-RACK
+        OBJECT-PAIR
+        BASEMENT
+        ARMOR
+        FIGURINE
+        DINNER
+        OCEAN
+        SECRET-VIVIEN-DOOR
+        PIANO
+        FIREPLACE
+        BOOKCASE
+        CORR-2
+        VIVIEN-BOX
+        DRESSING-TABLE
+        JOURNAL
+        SECRET-IAN-DOOR
+        TAMARA-BED
+        DRESSING-BENCH
+        WENDISH-KIT
+        GHOST-NEW
+        SECRET-DRAWING-DOOR
+        HISTORY-BOOK
+        DEB
+        NIGHTSTAND-LG
+        TABLE-DINING
+        DINNER-2
+        SECRET-YOUR-DOOR
+        BATHROOM
+        CORR-1
+        YOUR-MIRROR
+        WARDROBE
+        DRAGON
+        NOT-HERE-OBJECT
+        WRITING-DESK
+        DRAGON-EYE
+        LOVER-PATH
+        SKELETON
+        COUSIN
+        STUDY
+        CASTLE
+        BOOKS-GLOBAL
+        FRIEND
+        COFFIN
+        STAIRS
+        CAR
+        WINE-RACK
+        GHOST-OLD
+        SIDEBOARD
+        NIGHTLAMP
+        LOVER
+        CHEST-OF-DRAWERS
+        IRIS-ROOM
+        TELESCOPE
+        LAMP
+        SECRET-TAMARA-DOOR
+        JACK-ROOM
+        HYDE-ROOM
+        NIGHTSTAND
+        VIVIEN-ROOM
+        VIVIEN-DIARY
+        LIBRARY
+        SECRET-IRIS-DOOR
+        HIM
+        BOTTLE
+        PRIEST-DOOR
+        PAINTING-GALLERY
+        OLD-GREAT-HALL
+        BED
+        TABLE-RANDOM
+        FOYER
+        GALLERY
+        YOUR-BATHROOM-DOOR
+        TOWER
+        TAMARA-ROOM
+        MAID
+        GREAT-HALL
+        LEVER
+        HOLE-IN-WALL
+        CRYPT
+        FRONT-DOOR
+        CREST
+        OFFICER
+        IAN-ROOM
+        UMBRELLA-STAND
+        WARDROBE-LG
+        COSTUME
+        LORD
+        VIVIEN-STUFF
+        IRON-MAIDEN
+        DEALER
+        PAINTER
+        SECRET-WENDISH-DOOR
+        YOUR-SWITCH
+        TAMARA-EVIDENCE
+        WENDISH-BOOK
+        COMPUTER
+        DRESSING-TABLE-LG
+        DESK
+        CREW-GLOBAL
+        MUSTACHE
+        WYVERN
+        BUTLER
+        SITTING-ROOM
+        VIVIEN-CHAIR
+        BELL
+        DOCTOR
+        MOON
+        IAN-CHAIR
+        INKWELL
+        CANDLE
+        SECRET-LIBRARY-DOOR
+        YOUR-CHAIR
+        PLAYER-NAME
+        BRICKS
+        WEST-HALL
+        GLOBAL-OBJECTS
+        SECRET-DINING-DOOR
+        JACK-TAPE
+        YOUR-BATHROOM
+        DRESSING-MIRROR
+        CHAIR-DINING
+        PEEPHOLE
+        OFFICE
+        HYDE-CHAIR
+        FRONT-GATE
+        VOICE
+        MUSIC
+        TAPESTRY
+        HER
+        CHAIR
+        LOCAL-GLOBALS
+        PLAYER
+        MIRROR-GLOBAL
+        EAST-HALL
+        LIMBO
+        ROOMS
+        INTDIR
+        ANDIRON
+        YOUR-ROOM
+        DINING-ROOM
+        KITCHEN
+        RECORDER
+        OIL-PAINTING
+        JEWELRY-CASE
+        SECRET-JACK-DOOR
+        MEMENTO-2
+Properties: 27
+        P?SW
+        P?SE
+        P?NE
+        P?NW
+        P?UP
+        P?DOWN
+        P?WEST
+        P?NORTH
+        P?SOUTH
+        P?EAST
+        P?IN
+        P?OUT
+        P?THINGS
+        P?GLOBAL
+        P?STATION
+        P?GENERIC
+        P?SIZE
+        P?CAPACITY
+        P?TEXT
+        P?DESCFCN
+        P?CHARACTER
+        P?LINE
+        P?LDESC
+        P?ADJECTIVE
+        P?SYNONYM
+        P?ACTION
+Globals: 223
+        P-ACLAUSE
+        WHICH-DIR
+        BUTLER-DUTY
+        INTO-DARKNESS
+        SECRET-TAM-LIB
+        PASSAGE-EAST-WEST
+        POISON-DART
+        CLASP-MUNGED
+        COR-1
+        COR-2
+        COR-4
+        WING-STAIRS
+        TOWER-STAIRS
+        FOUND-IT
+        FOUND-IT-PERM
+        FOUND-LOC
+        NOTHING-NEW
+        NOW-WEARING
+        OHERE
+        VILLAIN-PER
+        TREASURE
+        HIDING-PLACE
+        COLOR-FORCED
+        COLOR-WORDS
+        COLOR-ADJS
+        COLOR-LETTERS
+        FAVE-COLOR
+        FIRST-NAME
+        LAST-NAME
+        SUFFIX
+        GENDER-KNOWN
+        MIDDLE-WORD
+        TITLE-WORD
+        IM-SHOCKED
+        QUITE-WELCOME
+        MISSED-DINNER
+        FOUND-FABRIC
+        P-HER-OBJECT
+        P-NCN
+        PLAYER-RANG-BELL?
+        BED-LINE
+        I-ASSUME
+        WHITISH-GLIMPSE
+        CHAR-CLOSET-TABLE
+        QUESTION-WORD-COUNT
+        CHARACTER-TABLE
+        SEARCHER
+        DINNER-SIT-COUNTER
+        MAIN-LINE
+        DISCOVERED-HERE
+        NAUGHTY-WORD-TABLE
+        CAPTOR
+        TOLD-ABOUT-EVID
+        TOLD-ABOUT-GHOST
+        DARK-TURRETS
+        VILLAIN-KNOWN?
+        QWP2-TABLE
+        NUMBER-WORD-TABLE
+        CHAR-ROOM-TABLE
+        P-IT-OBJECT
+        RESERVE-INBUF
+        FOLLOWER
+        YAWNS
+        FUMBLE-PROB
+        FUMBLE-NUMBER
+        P-AND
+        LIONELS-VOICE
+        LIONEL-FORCED
+        P-BUTS
+        P-LEN
+        REMEMBER-NOT-DRESSED
+        STAIRS-UP-RIGHT
+        AIMED-HERE
+        SHOOTER
+        SEARCH-ROOMS
+        IDENTIFIED-THE-GHOST
+        ARRESTED-THE-VILLAIN
+        FOUND-PASSAGES
+        FOUND-COSTUME
+        TOUCHED-LDESCS
+        OPRSO
+        PRSO
+        P-OFLAG
+        P-ITBL
+        P-OCL1
+        P-OCL2
+        GHOST-CACKLES
+        BUTLER-GHOST-STORY-TOLD
+        FAMOUS-YOUNG-DETECTIVE
+        VERBOSITY
+        QUOTE-FLAG
+        P-OVTBL
+        TIMER-PREVENTS-IT
+        WASHED
+        P-MOBY-FOUND
+        HO-HUM
+        PLAYER-OBSTACLES
+        TRANSFER-TABLE
+        P-OTBL
+        CLUE-LOC
+        PRSA
+        PASS-LINE
+        OTHER-POSS-POS
+        NEVER-NOTICED-HER
+        P-LEXV
+        WINNER
+        AGAIN-LEXV
+        TRESYLLIAN
+        RHYMES-WITH-RICH
+        FAWNING
+        LDESC-STRINGS
+        GLASSES-FOR
+        MASS-SAID
+        BUTLER-HINTS-COUNTER
+        YUKS
+        WHO-CARES-TBL
+        P-OFW
+        P-ADJW
+        P-NAMW
+        TREASURE-FOUND
+        PIANO-PIECES
+        INTRODUCES
+        OOPS-INBUF
+        SHOT
+        P-PHR
+        P-CCTBL
+        P-TIME
+        OFFENDED
+        BEG-PARDON
+        P-INBUF
+        RESERVE-PTR
+        QCONTEXT
+        LIT
+        RESERVE-LEXV
+        P-TABLE
+        QUESTIONS
+        QUESTIONERS
+        GUEST-TABLE
+        SOMETHING
+        QUESTION-WORD-TABLE
+        TOWER-LINE
+        TOUR-PATH
+        MUSTACHE-STORY
+        LOVER-SAID
+        BUTLER-RANG-BELL?
+        BRICKS-DOWN
+        NO-CHANGING
+        TRAILS-ALONG
+        TOUR-FORCED
+        P-PRSI
+        P-IT-WORDS
+        AWAITING-REPLY
+        P-ADJ
+        P-MERGE
+        P-XADJ
+        P-PRSO
+        P-HIM-OBJECT
+        DIR-STRINGS
+        OU-STOP-SEARCHING
+        OOPS-TABLE
+        P-CONT
+        NOT-ENOUGH-ROOM
+        NO-VIOLENCE
+        YOU-DIDNT-SAY-W
+        AHHH
+        GOAL-TABLES
+        TOUR-INDEX
+        YES-INBUF
+        YES-LEXV
+        LAST-PSEUDO-LOC
+        VARIATION
+        GOAL-PERSON
+        DINING-DESC
+        WRONG-OUTFIT
+        CREEPIES
+        WHO-CARES-VERB
+        CASTLE-IS-SOUTH
+        CHAR-POSS-TABLE
+        FOLLOW-LOC
+        PRESENT-TIME
+        CLOCKER-RUNNING
+        C-TABLE
+        EVIDENCE-FOUND
+        C-INTS
+        CLOCK-WAIT
+        DINNER-SAT
+        TOO-SLIPPERY
+        DRAGON-EYE-COLOR
+        THATS-INTERESTING
+        ANCIENT-SECRETS
+        STAIRS-DOWN-LEFT
+        P-MOBY-FLAG
+        NOW-PRSI
+        P-PROMPT
+        QWP1-TABLE
+        MASS-COUNTER
+        JACK-THINKS-GLADYS
+        P-NUMBER
+        LIONEL-SPEAKS-COUNTER
+        PRSI
+        LONG-BLOND-HAIR
+        P-VTBL
+        CONFESSED
+        P-END-ON-PREP
+        P-MERGED
+        AGAIN-DIR
+        P-ADJN
+        FRIEND-FOUND-PASSAGES
+        P-GETFLAGS
+        P-WON
+        OOPS-PRINT
+        P-PRSA-WORD
+        P-AADJ
+        P-SYNTAX
+        P-GWIMBIT
+        P-XADJN
+        P-DIRECTION
+        KEEP-WAITING
+        P-ANAM
+        P-WALK-DIR
+        P-XNAM
+        P-NAM
+        P-SLOCBITS
\ No newline at end of file
diff --git a/m5.zip b/m5.zip
new file mode 100644 (file)
index 0000000..0948e50
Binary files /dev/null and b/m5.zip differ
diff --git a/macros.zil b/macros.zil
new file mode 100644 (file)
index 0000000..1901359
--- /dev/null
@@ -0,0 +1,236 @@
+"MACROS for MOONMIST
+Copyright (c) 1986 Infocom, Inc.  All rights reserved."
+
+;<TELL-TOKENS  CR      <CRLF>
+               N *     <PRINTN .X>
+               C *     <PRINTC .X>
+               D *     <PRINTD .X>
+               A *     <PRINTA .X>
+               FN      <PRINT-NAME ,FIRST-NAME>
+               LN      <PRINT-NAME ,LAST-NAME>
+               TN      <TITLE-NAME>
+               THE *           <PRINTT .X>
+               CTHE *          <START-SENTENCE .X>
+               CHE * *:ATOM    <HE-SHE-IT .X 1 .Y>
+               CHE *           <HE-SHE-IT .X 1>
+               HE * *:ATOM     <HE-SHE-IT .X 0 .Y>
+               HE *            <HE-SHE-IT .X>
+               V * *           <HE-SHE-IT .X -1 .Y>
+               HIM *           <HIM-HER-IT .X>
+               HIS *           <HIM-HER-IT .X 0 T>
+               CHIS *          <HIM-HER-IT .X 1 T>>
+
+<DEFMAC VERB? ("TUPLE" ATMS "AUX" (O ()) (L ())) 
+       <REPEAT ()
+               <COND (<EMPTY? .ATMS>
+                      <RETURN!- <COND (<LENGTH? .O 1> <NTH .O 1>)
+                                    (ELSE <FORM OR !.O>)>>)>
+               <REPEAT ()
+                       <COND (<EMPTY? .ATMS> <RETURN!->)>
+                       <SET ATM <NTH .ATMS 1>>
+                       <SET L
+                            (<CHTYPE <PARSE <STRING "V?"<SPNAME .ATM>>> GVAL>
+                             !.L)>
+                       <SET ATMS <REST .ATMS>>
+                       <COND (<==? <LENGTH .L> 3> <RETURN!->)>>
+               <SET O (<FORM EQUAL? ',PRSA !.L> !.O)>
+               <SET L ()>>>
+
+<DEFMAC DOBJ? ("TUPLE" ATMS "AUX" (O ()) (L ())) 
+       <REPEAT ()
+               <COND (<EMPTY? .ATMS>
+                      <RETURN!- <COND (<LENGTH? .O 1> <NTH .O 1>)
+                                      (ELSE <FORM OR !.O>)>>)>
+               <REPEAT ()
+                       <COND (<EMPTY? .ATMS> <RETURN!->)>
+                       <SET ATM <NTH .ATMS 1>>
+                       <SET L (<COND (<TYPE? .ATM ATOM>
+                                      <CHTYPE .ATM GVAL>)
+                                     (T .ATM)>
+                               !.L)>
+                       <SET ATMS <REST .ATMS>>
+                       <COND (<==? <LENGTH .L> 3> <RETURN!->)>>
+               <SET O (<FORM EQUAL? ',PRSO !.L> !.O)>
+               <SET L ()>>>
+
+<DEFMAC IOBJ? ("TUPLE" ATMS "AUX" (O ()) (L ())) 
+       <REPEAT ()
+               <COND (<EMPTY? .ATMS>
+                      <RETURN!- <COND (<LENGTH? .O 1> <NTH .O 1>)
+                                      (ELSE <FORM OR !.O>)>>)>
+               <REPEAT ()
+                       <COND (<EMPTY? .ATMS> <RETURN!->)>
+                       <SET ATM <NTH .ATMS 1>>
+                       <SET L (<COND (<TYPE? .ATM ATOM>
+                                      <CHTYPE .ATM GVAL>)
+                                     (T .ATM)>
+                               !.L)>
+                       <SET ATMS <REST .ATMS>>
+                       <COND (<==? <LENGTH .L> 3> <RETURN!->)>>
+               <SET O (<FORM EQUAL? ',PRSI !.L> !.O)>
+               <SET L ()>>>
+
+<DEFMAC RFATAL ()
+       '<PROG () <PUSH 2> <RSTACK>>>
+
+<DEFMAC PROB ('BASE?)
+       <FORM NOT <FORM L? .BASE? '<RANDOM 100>>>>
+
+<DEFMAC TELL ("ARGS" A)
+ <FORM PROG ()
+  !<MAPF ,LIST
+    <FUNCTION ("AUX" E P O)
+     <COND (<EMPTY? .A> <MAPSTOP>)
+          (<SET E <NTH .A 1>>
+           <SET A <REST .A>>)>
+     <COND (<TYPE? .E ATOM>
+           <COND (<OR <=? <SET P <SPNAME .E>>
+                          "CRLF">
+                      <=? .P "CR">>
+                  <MAPRET '<CRLF>>)
+                 (<=? .P "FN">
+                  <MAPRET '<PRINT-NAME ,FIRST-NAME>>)
+                 (<=? .P "LN">
+                  <MAPRET '<PRINT-NAME ,LAST-NAME>>)
+                 (<=? .P "TN">
+                  <MAPRET '<TITLE-NAME>>)
+                 (<EMPTY? .A>
+                  <ERROR INDICATOR-AT-END? .E>)
+                 (ELSE
+                  <SET O <NTH .A 1>>
+                  <SET A <REST .A>>
+                  <COND (<OR <=? <SET P <SPNAME .E>>
+                                 "DESC">
+                             <=? .P "D">
+                             <=? .P "OBJ">
+                             <=? .P "O">>
+                         <MAPRET <FORM PRINTD .O>>)
+                        (<OR <=? .P "A">
+                             <=? .P "AN">>
+                         <MAPRET <FORM PRINTA .O>>)
+                        (<OR ;<=? .P "T">
+                             <=? .P "THE">>
+                         <MAPRET <FORM PRINTT .O>>)
+                        (<OR ;<=? .P "CT">
+                             <=? .P "CTHE">>
+                         <MAPRET <FORM START-SENTENCE .O>>)
+                        (<=? .P "CHE">
+                         <COND (<OR <EMPTY? .A>
+                                    <NOT <TYPE? <NTH .A 1> ATOM>>>
+                                <MAPRET <FORM HE-SHE-IT .O T>>)
+                               (T
+                                <SET P <SPNAME <NTH .A 1>>>
+                                <SET A <REST .A>>
+                                <MAPRET <FORM HE-SHE-IT .O T .P>>)>)
+                        (<=? .P "HE">
+                         <COND (<OR <EMPTY? .A>
+                                    <NOT <TYPE? <NTH .A 1> ATOM>>>
+                                <MAPRET <FORM HE-SHE-IT .O>>)
+                               (T
+                                <SET P <SPNAME <NTH .A 1>>>
+                                <SET A <REST .A>>
+                                <MAPRET <FORM HE-SHE-IT .O 0 .P>>)>)
+                        (<=? .P "V">
+                         <SET P <SPNAME <NTH .A 1>>>
+                         <SET A <REST .A>>
+                         <MAPRET <FORM HE-SHE-IT .O -1 .P>>)
+                        (<=? .P "HIM">
+                         <MAPRET <FORM HIM-HER-IT .O>>)
+                        ;(<=? .P "CHIM">
+                         <MAPRET <FORM HIM-HER-IT .O T>>)
+                        (<=? .P "HIS">
+                         <MAPRET <FORM HIM-HER-IT .O '<> T>>)
+                        (<=? .P "CHIS">
+                         <MAPRET <FORM HIM-HER-IT .O T T>>)
+                        (<OR <=? .P "NUM">
+                             <=? .P "N">>
+                         <MAPRET <FORM PRINTN .O>>)
+                        (<OR ;<=? .P "CHAR">
+                             ;<=? .P "CHR">
+                             <=? .P "C">>
+                         <MAPRET <FORM PRINTC <ASCII .O>>>)
+                        (ELSE
+                         <MAPRET <FORM PRINT <FORM GETP .O .E>>>)>)>)
+          (<TYPE? .E CHARACTER>
+           <MAPRET <FORM PRINTC <ASCII .E>>>)
+          (<TYPE? .E STRING ZSTRING>
+           <MAPRET <FORM PRINTI .E>>)
+          (<AND <TYPE? .E FORM>
+                <==? <NTH .E 1> QUOTE>>
+           <MAPRET <FORM PRINTD <FORM GVAL <NTH .E 2>>>>)
+          (<TYPE? .E FORM LVAL GVAL>
+           <MAPRET <FORM PRINT .E>>)
+          (ELSE <ERROR UNKNOWN-TYPE .E>)>>>>>
+
+<DEFMAC ONE? ('TERM)
+       <FORM EQUAL? .TERM 1 T>>
+
+;<ROUTINE ONE? (NUM) <EQUAL? .NUM 1 T>>
+
+<SETG C-ENABLED? 0>
+<SETG C-ENABLED 1>
+<SETG C-DISABLED 0>
+
+<DEFMAC ENABLE ('INT) <FORM PUT .INT ,C-ENABLED? 1>>
+
+<DEFMAC DISABLE ('INT) <FORM PUT .INT ,C-ENABLED? 0>>
+
+;<DEFMAC FLAMING? ('OBJ)
+       <FORM AND <FORM FSET? .OBJ ',FLAMEBIT>
+                 <FORM FSET? .OBJ ',ONBIT>>>
+
+<DEFMAC OPENABLE? ('OBJ)
+       <FORM OR <FORM FSET? .OBJ ',DOORBIT>
+                <FORM FSET? .OBJ ',CONTBIT>>> 
+
+<DEFMAC ABS ('NUM)
+       <FORM COND (<FORM L? .NUM 0> <FORM - 0 .NUM>)
+                  (T .NUM)>>
+
+<DEFMAC GET-REXIT-ROOM ('PT)
+       <COND (<AND <GASSIGNED? PLUS-MODE> ,PLUS-MODE>
+              <FORM GET .PT ',REXIT>)
+             (T <FORM GETB .PT ',REXIT>)>>
+
+<DEFMAC GET-DOOR-OBJ ('PT)
+       <COND (<AND <GASSIGNED? PLUS-MODE> ,PLUS-MODE>
+              <FORM GET .PT ',DEXITOBJ>)
+             (T <FORM GETB .PT ',DEXITOBJ>)>>
+
+<DEFMAC GET/B ('TBL 'PTR)
+       <COND (<AND <GASSIGNED? PLUS-MODE> ,PLUS-MODE>
+              <FORM GET .TBL .PTR>)
+             (T <FORM GETB .TBL .PTR>)>>
+
+<DEFMAC PUT/B ('TBL 'PTR 'OBJ)
+       <COND (<AND <GASSIGNED? PLUS-MODE> ,PLUS-MODE>
+              <FORM PUT .TBL .PTR .OBJ>)
+             (T <FORM PUTB .TBL .PTR .OBJ>)>>
+
+<DEFMAC ZMEMQ/B ('OBJ 'TBL)
+       <COND (<AND <GASSIGNED? PLUS-MODE> ,PLUS-MODE>
+              <FORM ZMEMQ .OBJ .TBL>)
+             (T <FORM ZMEMQB .OBJ .TBL>)>>
+
+<DEFMAC RMGL-SIZE ('TBL)
+       <COND (<AND <GASSIGNED? PLUS-MODE> ,PLUS-MODE>
+              <FORM - <FORM / <FORM PTSIZE .TBL> 2> 1>)
+             (T <FORM - <FORM PTSIZE .TBL> 1>)>>
+
+<DEFMAC GT-O ('OBJ)
+       <FORM GET ',GOAL-TABLES <FORM GETP .OBJ ',P?CHARACTER>>>
+
+<DEFMAC T? ('TERM)
+       <FORM NOT <FORM ZERO? .TERM>>>
+
+<DEFINE PSEUDO ("TUPLE" V)
+       <MAPF ,PLTABLE
+             <FUNCTION (OBJ)
+                  <COND (<N==? <LENGTH .OBJ> 3>
+                         <ERROR BAD-THING .OBJ>)>
+                  <MAPRET <COND (<NTH .OBJ 2>
+                                 <VOC <SPNAME <NTH .OBJ 2>> NOUN>)>
+                          <COND (<NTH .OBJ 1>
+                                 <VOC <SPNAME <NTH .OBJ 1>> ADJECTIVE>)>
+                          <3 .OBJ>>>
+             .V>>
diff --git a/parser.zil b/parser.zil
new file mode 100644 (file)
index 0000000..a8cf531
--- /dev/null
@@ -0,0 +1,3329 @@
+"PARSER for MOONMIST
+Copyright (C) 1986 Infocom, Inc.  All rights reserved."
+
+"Parser global variable convention:  All parser globals will 
+  begin with 'P-'.  Local variables are not restricted in any
+  way." 
+<SETG SIBREAKS ".,\"!?'"> 
+
+<GLOBAL PRSA:NUMBER 0>
+<GLOBAL PRSI:OBJECT 0>
+<GLOBAL PRSO:OBJECT 0> 
+<GLOBAL OPRSO:OBJECT 0>
+
+<GLOBAL P-SYNTAX 0> 
+
+<GLOBAL P-LEN:NUMBER 0>    
+
+;<GLOBAL P-DIR 0>
+
+<GLOBAL WINNER:OBJECT PLAYER>   
+
+<GLOBAL P-LEXV         <ITABLE 79 (LEXV) 0 #BYTE 0 #BYTE 0>>
+<GLOBAL AGAIN-LEXV     <ITABLE 79 (LEXV) 0 #BYTE 0 #BYTE 0>>
+<GLOBAL RESERVE-LEXV   <ITABLE 79 (LEXV) 0 #BYTE 0 #BYTE 0>>
+<GLOBAL RESERVE-PTR:NUMBER <>>
+
+"INBUF - Input buffer for READ"
+<GLOBAL P-INBUF                <ITABLE 80 (BYTE LENGTH) 0>>
+<GLOBAL OOPS-INBUF     <ITABLE 80 (BYTE LENGTH) 0>>
+<GLOBAL RESERVE-INBUF  <ITABLE 80 (BYTE LENGTH) 0>>
+
+<GLOBAL OOPS-TABLE <TABLE <> <> <> <>>>
+<CONSTANT O-PTR 0>     "word pointer to unknown token in P-LEXV"
+<CONSTANT O-START 1>   "word pointer to sentence start in P-LEXV"
+<CONSTANT O-LENGTH 2>  "byte length of unparsed tokens in P-LEXV"
+<CONSTANT O-END 3>     "byte pointer to first free byte in OOPS-INBUF"
+
+"Parse-cont variable"
+<GLOBAL P-CONT:NUMBER <>>  
+
+<GLOBAL P-IT-OBJECT:OBJECT <>>
+<GLOBAL P-HER-OBJECT:OBJECT FRIEND>
+<GLOBAL P-HIM-OBJECT:OBJECT LORD>
+"<GLOBAL P-THEM-OBJECT:OBJECT <>>"
+
+"Orphan flag"
+<GLOBAL P-OFLAG:FLAG <>> 
+
+<GLOBAL P-MERGED:FLAG <>>
+
+<GLOBAL P-ACLAUSE <>>    
+
+<GLOBAL P-ANAM <>>  
+
+<GLOBAL P-AADJ <>>
+
+"Byte offset to # of entries in LEXV"
+<CONSTANT P-LEXWORDS 1>
+
+"Word offset to start of LEXV entries"
+<CONSTANT P-LEXSTART 1>
+
+"Number of words per LEXV entry"
+<CONSTANT P-LEXELEN 2>   
+<CONSTANT P-WORDLEN 4>
+
+"Offset to parts of speech byte"
+<CONSTANT P-PSOFF %<COND (<AND <GASSIGNED? PLUS-MODE> ,PLUS-MODE> 6) (T 4)>>
+
+"Offset to first part of speech"
+<CONSTANT P-P1OFF %<COND (<AND <GASSIGNED? PLUS-MODE> ,PLUS-MODE> 7) (T 5)>>
+
+"First part of speech bit mask in PSOFF byte"
+<CONSTANT P-P1BITS 3>    
+
+<CONSTANT P-ITBLLEN 9>   
+
+<GLOBAL P-ITBL <TABLE 0 0 0 0 0 0 0 0 0 0>>  
+
+<GLOBAL P-OTBL <TABLE 0 0 0 0 0 0 0 0 0 0>>  
+
+<GLOBAL P-VTBL <TABLE 0 0 0 0>>
+
+<GLOBAL P-OVTBL <TABLE 0 0 0 0>>
+
+<GLOBAL P-NCN:NUMBER 0>    
+
+<CONSTANT P-VERB 0> 
+
+<CONSTANT P-VERBN 1>
+
+<CONSTANT P-PREP1 2>
+
+<CONSTANT P-PREP1N 3>    
+
+<CONSTANT P-PREP2 4>
+
+"<CONSTANT P-PREP2N 5>"    
+
+<CONSTANT P-NC1 6>  
+
+<CONSTANT P-NC1L 7> 
+
+<CONSTANT P-NC2 8>  
+
+<CONSTANT P-NC2L 9> 
+
+<GLOBAL QUOTE-FLAG:FLAG <>>
+
+;<GLOBAL P-ADVERB <>>
+<GLOBAL P-PRSA-WORD <>>
+<GLOBAL P-END-ON-PREP:FLAG <>>
+<GLOBAL P-WON <>>
+<CONSTANT M-FATAL 2>   
+
+<CONSTANT M-BEG 1>  
+<CONSTANT M-ENTER 2>
+<CONSTANT M-LOOK 3> 
+<CONSTANT M-FLASH 4>
+<CONSTANT M-OBJDESC 5>
+<CONSTANT M-END 6> 
+<CONSTANT M-CONT 7> 
+<CONSTANT M-WINNER 8> 
+<CONSTANT M-EXIT 9>
+<CONSTANT M-OTHER 69>
+
+<ROUTINE MAIN-LOOP ("AUX" X) <REPEAT () <SET X <MAIN-LOOP-1>>>>
+
+<ROUTINE MAIN-LOOP-1 ("AUX" ICNT OCNT NUM CNT OBJ ;TBL V PTBL OBJ1 TMP X GW)
+     <SET CNT 0>
+     <SET OBJ <>>
+     <SET PTBL T>
+     ;<COND (<NOT <==? ,QCONTEXT-ROOM ,HERE>>
+           <SETG QCONTEXT <>>)>
+     <COND (<SETG P-WON <PARSER>>
+           <SETG CLOCK-WAIT <>>
+           <SET ICNT <GET/B ,P-PRSI ,P-MATCHLEN>>
+           <SET OCNT <GET/B ,P-PRSO ,P-MATCHLEN>>
+           <COND (<AND <ZERO? .OCNT> <ZERO? .ICNT>>
+                  T)
+                 (<AND ,P-IT-OBJECT <ACCESSIBLE? ,P-IT-OBJECT>>
+                  <SET TMP <>>
+                  <REPEAT ()
+                          <COND (<IGRTR? CNT .ICNT>
+                                 <RETURN>)>
+                          <COND (<EQUAL? <GET/B ,P-PRSI .CNT> ,IT>
+                                 <PUT/B ,P-PRSI .CNT ,P-IT-OBJECT>
+                                 <TELL-I-ASSUME ,P-IT-OBJECT>
+                                 <SET TMP T>
+                                 <RETURN>)>>
+                  <COND (T ;<ZERO? .TMP>
+                         <SET CNT 0>
+                         <REPEAT ()
+                          <COND (<IGRTR? CNT .OCNT>
+                                 <RETURN>)>
+                          <COND (<EQUAL? <GET/B ,P-PRSO .CNT> ,IT>
+                                 <PUT/B ,P-PRSO .CNT ,P-IT-OBJECT>
+                                 <TELL-I-ASSUME ,P-IT-OBJECT>
+                                 <RETURN>)>>)>
+                  <SET CNT 0>)>
+           <SET NUM
+                <COND (<0? .OCNT> .OCNT)
+                      (<G? .OCNT 1>
+                       ;<SET TBL ,P-PRSO>
+                       <COND (<0? .ICNT> <SET OBJ <>>)
+                             (T <SET OBJ <GET/B ,P-PRSI 1>>)>
+                       .OCNT)
+                      (<G? .ICNT 1>
+                       <SET PTBL <>>
+                       ;<SET TBL ,P-PRSI>
+                       <SET OBJ <GET/B ,P-PRSO 1>>
+                       .ICNT)
+                      (T 1)>>
+           <COND (<AND <NOT .OBJ> <1? .ICNT>>
+                  <SET OBJ <GET/B ,P-PRSI 1>>)>
+           <COND (<EQUAL? ,PRSA ,V?WALK ;,V?FACE>
+                  <COND ;(<ZERO? ,PRSO>
+                         <SET V <PERFORM ,PRSA <GET/B ,P-PRSO 1>>>)
+                        (T <SET V <PERFORM ,PRSA ,PRSO>>)>)
+                 (<0? .NUM>
+                  <COND (<0? <BAND <GETB ,P-SYNTAX ,P-SBITS> ,P-SONUMS>>
+                         <SET V <PERFORM ,PRSA>>
+                         <SETG PRSO <>>)
+                        (<AND <ZERO? ,LIT> <SEE-VERB?>>
+                         ;<AND <NOT ,LIT>
+                              <NOT <VERB? WAIT-FOR WAIT-UNTIL>>
+                              <NOT <SPEAKING-VERB?>>
+                              <NOT <GAME-VERB?>>>
+                         <SETG QUOTE-FLAG <>>
+                         <SETG P-CONT <>>
+                         <TOO-DARK>)
+                        (T
+                         <SETG QUOTE-FLAG <>>
+                         <SETG P-CONT <>>
+                         <TELL "(There isn't any">
+                         <COND (<OR <AND .PTBL
+                                         <==? <GETB ,P-SYNTAX ,P-SFWIM1>
+                                              ,PERSONBIT>>
+                                    <AND <NOT .PTBL>
+                                         <==? <GETB ,P-SYNTAX ,P-SFWIM2>
+                                              ,PERSONBIT>>>
+                                <TELL "one">)
+                               (T <TELL "thing">)>
+                         <TELL " to ">
+                         <SET TMP <GET ,P-ITBL ,P-VERBN>>
+                         <COND (<VERB? TELL>
+                                <TELL "talk to">)
+                               (<OR ,P-MERGED ,P-OFLAG>
+                                <PRINTB <GET .TMP 0>>)
+                               (T
+                                <SET V <WORD-PRINT <GETB .TMP 2>
+                                                   <GETB .TMP 3>>>)>
+                         <TELL "!)" CR>
+                         <SET V <>>)>)
+                 (<AND .PTBL <G? .NUM 1> <VERB? COMPARE>>
+                  <SET V <PERFORM ,PRSA ,OBJECT-PAIR>>)
+                 (T
+                  <SET X 0>
+                  ;"<SETG P-MULT <>>
+                  <COND (<G? .NUM 1> <SETG P-MULT T>)>"
+                  <SET TMP 0>
+                  <SET GW <>>
+                  <REPEAT ()
+                   <COND (<IGRTR? CNT .NUM>
+                          <COND (<G? .X 0>
+                                 <TELL "The ">
+                                 <COND (<NOT <EQUAL? .X .NUM>>
+                                        <TELL "other ">)>
+                                 <TELL "object">
+                                 <COND (<NOT <EQUAL? .X 1>>
+                                        <TELL !\s>)>
+                                 <TELL " that you mentioned ">
+                                 <COND (<NOT <EQUAL? .X 1>>
+                                        <TELL "are">)
+                                       (T <TELL "is">)>
+                                 <TELL "n't here." CR>)
+                                (<NOT .TMP>
+                                 <MORE-SPECIFIC ;REFERRING>)>
+                          <RETURN>)
+                         (T
+                          <COND (.PTBL
+                                 <SET OBJ1 <GET/B ,P-PRSO .CNT>>)
+                                (T <SET OBJ1 <GET/B ,P-PRSI .CNT>>)>
+                          <COND (<OR <G? .NUM 1>
+                                     <EQUAL? <GET <GET ,P-ITBL ,P-NC1> 0>
+                                             ,W?ALL>>
+                                 <COND (<==? .OBJ1 ,NOT-HERE-OBJECT>
+                                        <SET X <+ .X 1>>
+                                        <AGAIN>)
+                                       (<AND <EQUAL? ,P-GETFLAGS ,P-ALL>
+                                             <NOT<VERB-ALL-TEST .OBJ1 .OBJ>>>
+                                        <AGAIN>)
+                                       (<NOT <ACCESSIBLE? .OBJ1>>
+                                        <AGAIN>)
+                                       (<==? .OBJ1 ,PLAYER> <AGAIN>)
+                                       ;(<FSET? .OBJ1 ,DUPLICATE> <AGAIN>)
+                                       (T
+                                        <COND (<==? .OBJ1 ,COSTUME>
+                                               <COND (<T? .GW>
+                                                      <AGAIN>)
+                                                     (T <SET GW T>)>)>
+                                        <COND (<EQUAL? .OBJ1 ,IT>
+                                               <PRINTD ,P-IT-OBJECT>)
+                                              (T <PRINTD .OBJ1>)>
+                                        <TELL ": ">)>)>
+                          <SET TMP T>
+                          <SET V <QCONTEXT-CHECK <COND (.PTBL .OBJ1)
+                                                       (T .OBJ)>>>
+                          <COND (.PTBL
+                                 <SETG PRSO .OBJ1>
+                                 <SETG PRSI .OBJ>)
+                                (T
+                                 <SETG PRSO .OBJ>
+                                 <SETG PRSI .OBJ1>)>
+                          <SET V <PERFORM ,PRSA ,PRSO ,PRSI>>
+                          <COND (<==? .V ,M-FATAL> <RETURN>)>)>>)>
+           <SETG OPRSO ,PRSO>
+           <COND (<==? .V ,M-FATAL> <SETG P-CONT <>>)>)
+          (T
+           <SETG CLOCK-WAIT T>
+           <SETG P-CONT <>>)>
+     <COND (<AND <ZERO? ,CLOCK-WAIT> <T? ,P-WON>>
+           <COND (<OR ;<VERB? SAVE RESTORE>
+                      <NOT <GAME-VERB?>>>
+                  <SETG CLOCKER-RUNNING 1>
+                  <SET V <CLOCKER>>
+                  <SETG CLOCKER-RUNNING 2 ;0>)>)>
+     <SETG PRSA <>>
+     <SETG PRSO <>>
+     <SETG PRSI <>>>
+
+<ROUTINE TELL-I-ASSUME (OBJ "OPT" (STR 0))
+       <COND (<OR <T? .STR>
+                  <AND <NOT <==? ,OPRSO .OBJ>>
+                       <NOT <FSET? .OBJ ,SECRETBIT>>>>
+              <TELL ,I-ASSUME>
+              <COND (<T? .STR> <TELL .STR>)>
+              <TELL THE .OBJ ".]" CR>)>>
+
+<ROUTINE VERB-ALL-TEST (O I "AUX" L)   ;"O=PRSO I=PRSI"
+ <SET L <LOC .O>>
+ <COND (<EQUAL? .O ,PAINT>
+       <RFALSE>)
+       (<VERB? DROP GIVE>
+       <COND (<EQUAL? .O ;,POCKET ,NOW-WEARING>
+              <RFALSE>)
+             (<OR <==? .L ,WINNER> ;<IN? ,P-IT-OBJECT ,WINNER>>
+              <RTRUE>)
+             (T <RFALSE>)>)
+       (<VERB? PUT PUT-IN>
+       <COND (<EQUAL? .O .I ;,POCKET ,NOW-WEARING>
+              <RFALSE>)
+             (<NOT <IN? ;HELD? .O .I>>
+              <RTRUE>)
+             (T <RFALSE>)>)
+       (<VERB? TAKE>
+       <COND (<FSET? .O ,SECRETBIT>
+              <RFALSE>)
+             (<AND <NOT <FSET? .O ,TAKEBIT>>
+                   <NOT <FSET? .O ,TRYTAKEBIT>>>
+              <RFALSE>)>
+       <COND (<NOT <ZERO? .I>>
+              <COND (<NOT <==? .L .I>>
+                     <RFALSE>)
+                    ;(T
+                     <SET L .I>)>)
+             (<EQUAL? .L ;,WINNER ,HERE>
+              <COND (<AND <==? .O ,CANDLE>
+                          <NOT <EQUAL? ,P-PRSA-WORD ,W?RAISE ,W?LIFT>>>
+                     <RFALSE>)
+                    (T <RTRUE>)>)>
+       <COND (<OR <FSET? .L ,PERSONBIT>
+                  <FSET? .L ,SURFACEBIT>>
+              <RTRUE>)
+             (<AND <FSET? .L ,CONTBIT>
+                   <FSET? .L ,OPENBIT>>
+              <RTRUE>)
+             (T <RFALSE>)>)
+       (<NOT <ZERO? .I>>
+       <COND (<NOT <==? .O .I>>
+              <RTRUE>)
+             (T <RFALSE>)>)
+       (T <RTRUE>)>>
+
+<ROUTINE GAME-VERB? ()
+ %<DEBUG-CODE <COND (<VERB? $GENDER $GOAL $QUEUE
+                           $RANDOM $COMMAND $RECORD $UNRECORD ;$WHERE DEBUG>
+                    <RTRUE>)>>
+ <COND (<VERB? BRIEF QUIT RESTART RESTORE SAVE SCORE SCRIPT SUPER-BRIEF
+              TELL TIME UNSCRIPT VERBOSE VERSION $VERIFY>
+       <RTRUE>)>>
+
+<ROUTINE QCONTEXT-CHECK (PER "AUX" OTHER (WHO <>) (N 0))
+        <COND (<OR <VERB? ;FIND HELP ;WHAT>
+                   <AND <VERB? SHOW TELL-ABOUT>
+                        <==? .PER ,PLAYER>>> ;"? more?"
+               <SET OTHER <FIRST? ,HERE>>
+               <REPEAT ()
+                       <COND (<NOT .OTHER> <RETURN>)
+                             (<AND <FSET? .OTHER ,PERSONBIT>
+                                   <NOT <FSET? .OTHER ,INVISIBLE>>
+                                   <NOT <==? .OTHER ,PLAYER>>>
+                              <SET N <+ 1 .N>>
+                              <SET WHO .OTHER>)>
+                       <SET OTHER <NEXT? .OTHER>>>
+               <COND (<AND <==? 1 .N> <ZERO? ,QCONTEXT>>
+                      <SETG QCONTEXT .WHO>)>
+               <COND (<AND <QCONTEXT-GOOD?>
+                           <==? ,WINNER ,PLAYER>> ;"? more?"
+                      <SETG WINNER ,QCONTEXT>
+                      <TELL "(said to " D ,QCONTEXT ")" CR>)>)>>
+
+<ROUTINE QCONTEXT-GOOD? ()
+ <COND (<AND <NOT <ZERO? ,QCONTEXT>>
+            <FSET? ,QCONTEXT ,PERSONBIT>
+            <NOT <FSET? ,QCONTEXT ,MUNGBIT ;,INVISIBLE>>
+            ;<==? ,HERE ,QCONTEXT-ROOM>
+            <==? ,HERE <META-LOC ,QCONTEXT>>>
+       <RETURN ,QCONTEXT>)>>
+
+<ROUTINE NOT-IT (WHO)
+ <COND (<EQUAL? .WHO ,P-HER-OBJECT>
+       <FCLEAR ,HER ,TOUCHBIT>)
+       (<EQUAL? .WHO ,P-HIM-OBJECT>
+       <FCLEAR ,HIM ,TOUCHBIT>)
+       ;(<EQUAL? .WHO ,P-THEM-OBJECT>
+       <FCLEAR ,THEM ,TOUCHBIT>)
+       (<EQUAL? .WHO ,P-IT-OBJECT>
+       <FCLEAR ,IT  ,TOUCHBIT>)>>
+\f
+<OBJECT NOT-HERE-OBJECT
+       (DESC "that thing")
+       (FLAGS NARTICLEBIT)
+       (ACTION NOT-HERE-OBJECT-F)>
+
+<ROUTINE NOT-HERE-OBJECT-F ("AUX" TBL (PRSO? <>) (OBJ <>))
+       ;"Protocol: return ,M-FATAL if case was handled and msg TELLed,
+                         <> if PRSO/PRSI ready to use"
+        <COND (<AND <EQUAL? ,PRSO ,NOT-HERE-OBJECT>
+                    <EQUAL? ,PRSI ,NOT-HERE-OBJECT>>
+               <TELL "(Those things aren't here!)" CR>
+               <RFATAL>)
+              (<EQUAL? ,PRSO ,NOT-HERE-OBJECT>
+               <SET TBL ,P-PRSO>
+               <SET PRSO? T>)
+              (T
+               <SET TBL ,P-PRSI>)>
+        <COND (<EQUAL? ,P-XADJ ,A?MY>
+               <COND (<EQUAL? ,P-XNAM ,W?EYE ,W?EYES>
+                      <SET OBJ ,EYE>)
+                     (<EQUAL? ,P-XNAM ,W?HANDS ,W?HAND>
+                      <SET OBJ ,HANDS>)
+                     (<EQUAL? ,P-XNAM ,W?HEAD>
+                      <SET OBJ ,HEAD>)>
+               <COND (<T? .OBJ>
+                      <COND (<T? .PRSO?>
+                             <SETG PRSO .OBJ>)
+                            (T <SETG PRSI .OBJ>)>
+                      <RFALSE>)>)>
+        ;<COND (<AND <VERB? ASK-ABOUT ASK-FOR SEARCH-FOR>
+                    <FSET? ,PRSO ,PERSONBIT>
+                    <IN? ,PRSO ,GLOBAL-OBJECTS>>
+               <NOT-HERE-PERSON ,PRSO>
+               <RFATAL>)>
+        <COND (<AND <EQUAL? ,P-ADJN ,W?YOUR ,W?HER ,W?HIS>
+                    <T? ,P-NAM>>
+               <RESOLVE-YOUR-HER-HIS>)>
+        <COND (<OR <AND .PRSO? <PRSO-VERB?>>
+                   <AND <NOT .PRSO?> <PRSI-VERB?>>>
+               <COND (<SET OBJ <FIND-NOT-HERE .TBL .PRSO?>>
+                      <COND (<NOT <==? .OBJ ,NOT-HERE-OBJECT>>
+                             <RFATAL>)>)
+                     (T
+                      <RFALSE>)>)>
+        ;"Here is the default 'cant see any' printer"
+        <TELL !\( CHE ,WINNER ;"You" " can't ">
+        <COND (<VERB? LISTEN> <TELL "hear">)
+              (T <TELL "see">)>
+        <COND (<NOT <CAPITAL-NOUN? ,P-XNAM>>
+               <TELL " any">)>
+        <NOT-HERE-PRINT>
+        <TELL " right here!)" CR>
+        <RFATAL>>
+
+<ROUTINE PRSO-VERB? ()
+ <COND (<VERB? ;ARREST ASK-CONTEXT-ABOUT ASK-CONTEXT-FOR
+              BOARD CLIMB-DOWN CLIMB-UP        ;"GO DOWN/UP TO room"
+              DISEMBARK DRESS DESCRIBE ;EXAMINE
+              FIND FOLLOW LEAVE TALK-ABOUT TELL ;"YELL TO person"
+              THROUGH USE WAIT-FOR WALK-TO ;$WHERE>
+       <RTRUE>)
+       (<AND <NOT <==? ,WINNER ,PLAYER>>
+            <VERB? ;BRING GIVE TAKE SSHOW>>
+       <RTRUE>)>>
+
+<ROUTINE PRSI-VERB? ()
+ <COND (<VERB? ASK-ABOUT ASK-FOR SEARCH-FOR ;SSHOOT TAKE-TO TELL-ABOUT ;$WHERE>
+       <RTRUE>)
+       (<NOT <==? ,WINNER ,PLAYER>>
+       <COND (<VERB? ;SBRING SGIVE SHOW>
+              <RTRUE>)
+             (<VERB? SSHOW>
+              <COND (T ;<IN? ,PRSI ,ROOMS>     ;"SHOW ME TO MY ROOM"
+                     <RTRUE>)>)>)>>
+
+<ROUTINE GEN-TEST (OBJ)
+       <COND (<VISIBLE? .OBJ> ;<IN? .OBJ ,HERE>
+              <RTRUE>)
+             (<CORRIDOR-LOOK .OBJ>
+              <RTRUE>)
+             (<AND <OR <VERB? FOLLOW> <REMOTE-VERB?>>
+                   <FSET? .OBJ ,PERSONBIT>
+                   <FSET? .OBJ ,SEENBIT>>
+              <RTRUE>)>>
+
+<ROUTINE NOT-SECRET-TEST (OBJ)
+       <COND (<AND <FSET? .OBJ ,SECRETBIT>
+                   <NOT <FSET? .OBJ ,SEENBIT>>>
+              <RFALSE>)
+             (T
+              <RTRUE>)>>
+
+<ROUTINE PRUNE (TBL LEN FCN "AUX" (CNT 1) OBJ)
+       <REPEAT ()
+               <SET OBJ <GET/B .TBL .CNT>>
+               <COND (<ZERO? <APPLY .FCN .OBJ>>
+                      <DEC LEN>
+                      <ELIMINATE .TBL .CNT .LEN>
+                      <COND (<NOT <G? .CNT .LEN>> <AGAIN>)>)>
+               <COND (<IGRTR? CNT .LEN> <RETURN>)>>
+       <PUT/B .TBL ,P-MATCHLEN .LEN>
+       .LEN>
+
+<ROUTINE ELIMINATE (TBL CNT N)
+       ;<COND (<NOT <L? .CNT .N>> <RFALSE>)>
+       <REPEAT ()
+               <PUT/B .TBL .CNT <GET/B .TBL <+ 1 .CNT>>>
+               <COND (<IGRTR? CNT .N> <RETURN>)>>>
+
+<GLOBAL P-MOBY-FOUND:OBJECT <>>
+<GLOBAL P-MOBY-FLAG:FLAG <>>   "Needed only for ZIL"
+<CONSTANT LAST-OBJECT 0> "ZILCH should stick the # of the last object here"
+
+<ROUTINE MOBY-FIND (TBL "AUX" (OBJ 1) LEN FOO)
+  <SETG P-NAM ,P-XNAM>
+  <SETG P-ADJ ,P-XADJ>
+  <PUT/B .TBL ,P-MATCHLEN 0>
+  %<COND (<GASSIGNED? PREDGEN> ;<NOT <ZERO? <GETB 0 18>>>      ;"ZIP case"
+         '<PROG ()
+           <REPEAT ()
+                <COND (<AND <SET FOO <META-LOC .OBJ T>>
+                            <SET FOO <THIS-IT? .OBJ>>>
+                       <SET FOO <OBJ-FOUND .OBJ .TBL>>)>
+                <COND (<IGRTR? OBJ ,LAST-OBJECT>
+                       <RETURN>)>>>)
+        (T             ;"ZIL case"
+         '<PROG ()
+                <SETG P-MOBY-FLAG T>
+                <SETG P-TABLE .TBL>
+                <SETG P-SLOCBITS -1>
+                <SET FOO <FIRST? ,ROOMS>>
+                <REPEAT ()
+                        <COND (<NOT .FOO> <RETURN>)
+                              (T
+                               <SEARCH-LIST .FOO .TBL ,P-SRCALL ;T>
+                               <SET FOO <NEXT? .FOO>>)>>
+                <COND (T ;<EQUAL? <SET LEN <GET/B .TBL ,P-MATCHLEN>> 0>
+                       <DO-SL ,LOCAL-GLOBALS 1 1 ;".TBL T">)>
+                <COND (T ;<EQUAL? <SET LEN <GET/B .TBL ,P-MATCHLEN>> 0>
+                       <SEARCH-LIST ,ROOMS .TBL ,P-SRCTOP ;T>)>
+                <SETG P-MOBY-FLAG <>>>)>
+  <SETG P-NAM <>>
+  <SETG P-ADJ <>>
+  <SET LEN <GET/B .TBL ,P-MATCHLEN>>
+  <COND (<EQUAL? .LEN 1>
+        <SETG P-MOBY-FOUND <GET/B .TBL 1>>)>
+  .LEN>
+
+<ROUTINE FIND-NOT-HERE (TBL PRSO? "AUX" M-F OBJ LEN CNT (LOCAL 0))
+       ;"Protocol: return T if case was handled and msg TELLed,
+           ,NOT-HERE-OBJECT if 'can't see' msg TELLed,
+                         <> if PRSO/PRSI ready to use"
+       ;"Here is where special-case code goes. <MOBY-FIND .TBL> returns
+          number of matches. If 1, then P-MOBY-FOUND is it. One may treat
+          the 0 and >1 cases alike or different. It doesn't matter. Always
+          return FALSE (not handled) if you have resolved the problem."
+       <SET M-F <MOBY-FIND .TBL>>
+       %<DEBUG-CODE 
+         <COND (,DBUG
+              <TELL "{Found " N .M-F " objects}" CR>
+              <COND (<NOT <==? 1 .M-F>>
+                     <TELL "{Namely: ">
+                     <SET CNT 1>
+                     <SET LEN <GET/B .TBL ,P-MATCHLEN>>
+                     <REPEAT ()
+                             <COND (<DLESS? LEN 0> <RETURN>)
+                                   (T <TELL D <GET/B .TBL .CNT> ", ">)>
+                             <INC CNT>>
+                     <TELL "}" CR>)>)>>
+       <COND (<G? .M-F 1>
+              <SET CNT 0>
+              <REPEAT ()
+                      <COND (<G? <SET CNT <+ .CNT 1>> .M-F>
+                             <RETURN>)>
+                      <SET OBJ <GET/B .TBL .CNT>>
+                      <COND (<GEN-TEST .OBJ>
+                             <COND (<G? <SET LOCAL <+ .LOCAL 1>> 1>
+                                    <RETURN>)
+                                   (ELSE
+                                    <SETG P-MOBY-FOUND .OBJ>)>)>>
+              <COND (<EQUAL? .LOCAL 1>
+                     <SET M-F 1>)>)>
+       <COND (<==? 1 .M-F>
+              %<DEBUG-CODE
+                <COND (,DBUG <TELL "{Namely: " D ,P-MOBY-FOUND "}" CR>)>>
+              <COND (<AND <NOT <REMOTE-VERB?>>
+                          <FSET? ,P-MOBY-FOUND ,SECRETBIT>>
+                     <NOT-FOUND ,P-MOBY-FOUND>
+                     <RETURN T ;,NOT-HERE-OBJECT>)
+                    (<AND <NOT <REMOTE-VERB?>>
+                          <NOT <VERB? $CALL>>
+                          <NOT <VISIBLE? ,P-MOBY-FOUND>>>
+                     <NOT-HERE ,P-MOBY-FOUND>
+                     <RETURN T ;,NOT-HERE-OBJECT>)
+                    (<T? .PRSO?>
+                     ;<SETG OPRSO ,PRSO>
+                     <SETG PRSO ,P-MOBY-FOUND>)
+                    (T
+                     <SETG PRSI ,P-MOBY-FOUND>)>
+              ;<THIS-IS-IT ,P-MOBY-FOUND>
+              <RFALSE>)
+            (<AND <L? 1 .M-F>
+                  <FSET? <SET OBJ <GET/B .TBL 1>> ,PERSONBIT>>
+             ;<SET FOUND 0>
+             <SET LEN <PRUNE .TBL <GET/B .TBL ,P-MATCHLEN> ,GEN-TEST>>
+             <COND (<0? .LEN>
+                    <RETURN ,NOT-HERE-OBJECT>)
+                   (<NOT <1? .LEN>>
+                    <WHICH-PRINT 0 .LEN .TBL>
+                    <COND (<==? .TBL ,P-PRSO>  <SETG P-ACLAUSE ,P-NC1>)
+                          (T                   <SETG P-ACLAUSE ,P-NC2>)>
+                    <SETG P-AADJ ,P-ADJ>
+                    <SETG P-ANAM ,P-NAM>
+                    <ORPHAN <> <>>
+                    <SETG P-OFLAG T>
+                    <RTRUE>)>
+             %<DEBUG-CODE <COND (,DBUG <TELL "{Corridor: " D .OBJ "}" CR>)>>
+             <COND (<FSET? .OBJ ,SECRETBIT>
+                    <NOT-FOUND .OBJ>
+                    <RETURN T ;,NOT-HERE-OBJECT>)
+                   (<T? .PRSO?>
+                    ;<SETG OPRSO ,PRSO>
+                    <SETG PRSO .OBJ>)
+                   (T
+                    <SETG PRSI .OBJ>)>
+             <RFALSE>)
+            (<AND <L? 1 .M-F>
+                  <SET OBJ <APPLY <GETP <SET OBJ <GET/B .TBL 1>> ,P?GENERIC>
+                                  .TBL .M-F ;"?">>>
+       ;"Protocol: returns .OBJ if that's the one to use,
+               ,NOT-HERE-OBJECT if case was handled and msg TELLed,
+                             <> if WHICH-PRINT should be called"
+              %<DEBUG-CODE <COND (,DBUG <TELL "{Generic: " D .OBJ "}" CR>)>>
+              <COND (<==? .OBJ ,NOT-HERE-OBJECT>
+                     <RTRUE>)
+                    (<FSET? .OBJ ,SECRETBIT>
+                     <NOT-FOUND .OBJ>
+                     <RETURN T ;,NOT-HERE-OBJECT>)
+                    (.PRSO?
+                     ;<SETG OPRSO ,PRSO>
+                     <SETG PRSO .OBJ>)
+                    (T
+                     <SETG PRSI .OBJ>)>
+              ;<THIS-IS-IT .OBJ>
+              <RFALSE>)
+             (<OR <AND <NOT .PRSO?>
+                       <IN? ,PRSO ,HERE>
+                       <VERB? ASK-ABOUT ASK-FOR TELL-ABOUT>>
+                  <AND .PRSO?
+                       <QCONTEXT-GOOD?>
+                       <VERB? ASK-CONTEXT-ABOUT ASK-CONTEXT-FOR>>
+                  <AND <NOT <==? ,WINNER ,PLAYER>>
+                       <VERB? FIND ;WHAT GIVE SGIVE>>>
+              <SET LEN <>>
+              <COND (<NOT <==? ,WINNER ,PLAYER>>
+                     <SET LEN ,WINNER>)
+                    (<VERB? ASK-ABOUT ASK-FOR TELL-ABOUT>
+                     <SET LEN ,PRSO>)
+                    (<QCONTEXT-GOOD?>
+                     <SET LEN ,QCONTEXT>)
+                    ;(<SET OBJ <FIND-FLAG ,HERE ,PERSONBIT ,WINNER ;,PLAYER>>
+                     <SET LEN .OBJ>)
+                    ;(<VISIBLE? ,FRIEND>
+                     <SET LEN ,FRIEND>)
+                    ;(T <SET LEN ,GAME>)>
+              <COND (<NOT <EQUAL? .LEN 0 ,PLAYER>>
+                     <START-SENTENCE .LEN>
+                     <TELL " looks confused. ">)>
+              <TELL "\"I don't know wh">
+              <COND (<0? .M-F>
+                     <TELL "at you mean by">
+                     <NOT-HERE-PRINT>)
+                    (T
+                     <TELL "ich">
+                     <NOT-HERE-PRINT>
+                     <TELL " you mean">)>
+              <TELL "!\"" CR>
+              <RTRUE>)
+             (<NOT .PRSO?>
+              <TELL CHE ,WINNER " wouldn't find">
+              <COND (<NOT <CAPITAL-NOUN? ,P-XNAM>>
+                     <TELL " any">)>
+              <NOT-HERE-PRINT>
+              <TELL " there." CR>
+              <RTRUE>)
+             (T ,NOT-HERE-OBJECT)>>
+
+<ROUTINE NOT-HERE-PRINT ()
+ ;<TELL " any">
+ <COND (<OR ,P-OFLAG ,P-MERGED>
+       <COND (<T? ,P-XADJ>
+              <TELL !\ >
+              <PRINTB ,P-XADJN>)>
+       <COND (<T? ,P-XNAM>
+              <TELL !\ >
+              <PRINTB ,P-XNAM>)>)
+       (<EQUAL? ,PRSO ,NOT-HERE-OBJECT>
+       <CLAUSE-PRINT ,P-NC1 ,P-NC1L <>>
+       ;<BUFFER-PRINT <GET ,P-ITBL ,P-NC1> <GET ,P-ITBL ,P-NC1L> <>>)
+       (T
+       <CLAUSE-PRINT ,P-NC2 ,P-NC2L <>>
+       ;<BUFFER-PRINT <GET ,P-ITBL ,P-NC2> <GET ,P-ITBL ,P-NC2L> <>>)>>
+
+%<DEBUG-CODE
+<ROUTINE TELL-D-LOC (OBJ)
+       <TELL D .OBJ>
+       <COND (<IN? .OBJ ,GLOBAL-OBJECTS>       <TELL "(gl)">)
+             (<IN? .OBJ ,LOCAL-GLOBALS>        <TELL "(lg)">)
+             (<IN? .OBJ ,ROOMS>                <TELL "(rm)">)>
+       <COND (<EQUAL? .OBJ ,TURN ,INTNUM>
+              <TELL !\( N ,P-NUMBER !\)>)>>>
+
+<ROUTINE SEE-VERB? ()
+       <VERB? ANALYZE SANALYZE CHASTISE ;COUNT EXAMINE FIND
+              ;INVENTORY LOOK LOOK-BEHIND LOOK-DOWN LOOK-INSIDE LOOK-ON
+              LOOK-OUTSIDE LOOK-THROUGH LOOK-UNDER LOOK-UP
+              READ SEARCH SEARCH-FOR SSEARCH-FOR>>
+
+<ROUTINE FIX-HIM-HER-IT (PRON OBJ)
+ <COND (<OR <ZERO? .OBJ>
+           <AND <NOT <ACCESSIBLE? .OBJ>>
+                <OR <AND <==? .PRON ,PRSI> <NOT <PRSI-VERB?>>>
+                    <AND <==? .PRON ,PRSO> <NOT <PRSO-VERB?>>>>>>
+       <COND (<EQUAL? 0 .OBJ ,PRSI>
+              <FAKE-ORPHAN>)
+             (T <NOT-HERE .OBJ>)>
+       <RFALSE>)
+       (T
+       <COND (<==? ,PRSO .PRON>
+              <COND (<==? .PRON ,IT>
+                     <PUT ,P-ADJW 0 <GET ,P-IT-WORDS 0>>
+                     <PUT ,P-NAMW 0 <GET ,P-IT-WORDS 1>>)>
+              <SETG PRSO .OBJ>
+              <TELL-I-ASSUME .OBJ>)>
+       <COND (<==? ,PRSI .PRON>
+              <COND (<==? .PRON ,IT>
+                     <PUT ,P-ADJW 1 <GET ,P-IT-WORDS 0>>
+                     <PUT ,P-NAMW 1 <GET ,P-IT-WORDS 1>>)>
+              <SETG PRSI .OBJ>
+              <TELL-I-ASSUME .OBJ>)>
+       <RTRUE>)>>
+
+<ROUTINE FAKE-ORPHAN ("AUX" TMP)
+        <ORPHAN ,P-SYNTAX <>>
+        <TELL "[Please be specific: wh">
+        <COND ;(<VERB? WALK WALK-TO>
+               <TELL "ere">)
+              (<==? <GETB ,P-SYNTAX ,P-SFWIM1> ,PERSONBIT>
+               <TELL "om">)
+              (T <TELL "at">)>
+        <TELL " do you want to ">
+        <VERB-PRINT>
+        ;<SET TMP <GET ,P-OTBL ,P-VERBN>>
+        ;<COND (<==? .TMP 0> <TELL "tell">)
+              (<0? <GETB ,P-VTBL 2>>
+               <PRINTB <GET .TMP 0>>)
+              (T
+               <WORD-PRINT <GETB .TMP 2> <GETB .TMP 3>>
+               <PUTB ,P-VTBL 2 0>)>
+        ;<PREP-PRINT <GETB ,P-SYNTAX ,P-SPREP2>>
+        <SETG P-OFLAG T>
+        <SETG P-WON <>>
+        ;<SETG CLOCK-WAIT T>
+        <TELL "?]" CR>>
+
+<GLOBAL NOW-PRSI:FLAG <>>
+
+<ROUTINE PERFORM (A "OPTIONAL" (O <>) (I <>) "AUX" V OA OO OI X)
+       %<DEBUG-CODE <COND (,DBUG
+              <TELL "{Perform: ">
+              %<COND (<GASSIGNED? PREDGEN> '<TELL N .A>)
+                     (T '<PRINC <NTH ,ACTIONS <+ <* .A 2> 1>>>)>
+              <COND (.O
+                     <TELL !\/>
+                     <COND (<EQUAL? .A ,V?WALK ;,V?FACE> <TELL N .O>)
+                           (T <TELL-D-LOC .O>)>)>
+              <COND (.I
+                     <TELL !\/>
+                     <TELL-D-LOC .I>)>
+              <TELL "}" CR>)>>
+       <SET OA ,PRSA>
+       <SET OO ,PRSO>
+       <SET OI ,PRSI>
+       <SETG PRSA .A>
+       <SETG PRSI .I>
+       <SETG PRSO .O>
+       <COND (<AND <ZERO? ,LIT>
+                   <SEE-VERB?>
+                   ;<NOT <DOBJ? GHOST-NEW COSTUME BLOWGUN>>
+                   ;<NOT <IOBJ? GHOST-NEW COSTUME BLOWGUN>>>
+              <TOO-DARK>
+              <RFATAL>)
+             (<NOT <VERB? WALK ;FACE>>
+              <COND (<EQUAL? ,IT ,PRSI ,PRSO>
+                     <COND (<NOT <FIX-HIM-HER-IT ,IT ,P-IT-OBJECT>>
+                            <RFATAL>)>)>
+              <COND (<EQUAL? ,HER ,PRSI ,PRSO>
+                     <COND (<NOT <FIX-HIM-HER-IT ,HER ,P-HER-OBJECT>>
+                            <RFATAL>)>)>
+              <COND (<EQUAL? ,HIM ,PRSI ,PRSO>
+                     <COND (<NOT <FIX-HIM-HER-IT ,HIM ,P-HIM-OBJECT>>
+                            <RFATAL>)>)>)>
+       <SET V <>>
+       <COND (<AND <NOT <EQUAL? .A ,V?WALK ;,V?FACE>>
+                   <EQUAL? ,NOT-HERE-OBJECT ,PRSO ,PRSI>>
+              <SET V <D-APPLY "Not Here" ,NOT-HERE-OBJECT-F>>
+              <COND (.V
+                     <SETG P-WON <>>
+                     ;<SETG CLOCK-WAIT T>)>)>
+       <THIS-IS-IT ,PRSI>
+       <THIS-IS-IT ,PRSO>
+       <COND (<NOT <EQUAL? ,WINNER ,PLAYER>>
+              <THIS-IS-IT ,WINNER>)>
+       <SET O ,PRSO>
+       <SET I ,PRSI>
+       %<DEBUG-CODE <COND (,DBUG
+              <TELL !\{ D ,WINNER "=}"> ;"extra output for next (...)")>>
+       <COND (<ZERO? .V>
+              <SET V <D-APPLY "Actor" <GETP ,WINNER ,P?ACTION>
+                              ,M-WINNER>>)>
+       <COND (<ZERO? .V>
+              <SET V <D-APPLY "Room (M-BEG)"
+                              <GETP <COND (<IN? ,WINNER ,CAR> ,CAR)
+                                          (T ,HERE)> ;<LOC ,WINNER>
+                                    ,P?ACTION>
+                              ,M-BEG>>)>
+       <COND (<ZERO? .V>
+              <SET V <D-APPLY "Preaction" <GET ,PREACTIONS .A>>>)>
+       <SETG NOW-PRSI 1>
+       ;<COND (<AND <ZERO? .V>
+                   .I  ;"This new clause applies CONTFCN to PRSI, BM 2/85"
+                   <NOT <EQUAL? .A ,V?WALK>>
+                   <LOC .I>>
+              <SET V <GETP <LOC .I> ,P?CONTFCN>>
+              <COND (.V
+                     <SET V <APPLY .V ,M-CONT>>)>)>
+       <COND (<AND <ZERO? .V>
+                   .I>
+              <SET V <D-APPLY "PRSI" <GETP .I ,P?ACTION>>>)>
+       <SETG NOW-PRSI 0>
+       ;<COND (<AND <ZERO? .V>
+                   .O
+                   <NOT <EQUAL? .A ,V?WALK ;,V?FACE>>
+                   <LOC .O>>
+              <SET V <GETP <LOC .O> ,P?CONTFCN>>
+              <COND (.V
+                     <SET V <APPLY .V ,M-CONT>>)>)>
+       <COND (<AND <ZERO? .V>
+                   .O
+                   <NOT <EQUAL? .A ,V?WALK ;,V?FACE>>>
+              <SET V <D-APPLY "PRSO" <GETP .O ,P?ACTION>>>
+              ;<COND (.V <THIS-IS-IT .O>)>)>
+       <COND (<ZERO? .V>
+              <SET V <D-APPLY <> <GET ,ACTIONS .A>>>)>
+       ;<COND (<NOT <==? .V ,M-FATAL>>
+              <COND (<OR ;<VERB? SAVE RESTORE> <NOT <GAME-VERB?>>>
+                     <SET V <D-APPLY "Room (M-END)"
+                               <GETP ,HERE ;<LOC ,WINNER> ,P?ACTION>
+                               ,M-END>>)>)>
+       <SETG PRSA .OA>
+       <SETG PRSO .OO>
+       <SETG PRSI .OI>
+       .V>
+
+<ROUTINE D-APPLY (STR FCN "OPTIONAL" (FOO <>) "AUX" RES)
+ <COND (<T? .FCN>
+       %<DEBUG-CODE <COND (,DBUG
+              <COND (<ZERO? .STR>
+                     <TELL "{Action:}" CR>)
+                    (T <TELL !\{ .STR ": ">)>)>>
+       <COND (<=? .STR "Container">
+              <SET FOO ,M-CONT>)>
+       <COND (.FOO <SET RES <APPLY .FCN .FOO>>)
+             (T <SET RES <APPLY .FCN>>)>
+       %<DEBUG-CODE <COND (<AND ,DBUG .STR>
+              <COND (<==? .RES ,M-FATAL>
+                     <TELL "Fatal}" CR>)
+                    (<ZERO? .RES>
+                     <TELL "Not handled}" CR>)
+                    (T <TELL "Handled}" CR>)>)>>
+       .RES)>>
+\f
+<CONSTANT P-PROMPT-START 4>
+<GLOBAL P-PROMPT:NUMBER 4>
+
+<ROUTINE I-PROMPT ("OPTIONAL" (GARG <>))
+ %<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
+                    <TELL "{I-PROMPT:">
+                    <COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
+ <SETG P-PROMPT <- ,P-PROMPT 1>>
+ %<DEBUG-CODE <COND (,IDEBUG <TELL "(0)}" CR>)>>
+ <RFALSE>>
+
+<ROUTINE BUZZER-WORD? (WRD PTR)
+ <COND (<OR <QUESTION-WORD? .WRD>
+           <NAUGHTY-WORD? .WRD>
+           <NUMBER-WORD? .WRD>>
+       <PUT ,OOPS-TABLE ,O-PTR .PTR>
+       <RTRUE>)>>
+
+<BUZZ  WHAT WHEN WHERE WHO WHY \(SOME
+       ;"ANY WHAT\'S WHEN\'S WHERE\'S WHO\'S WHY\'S">
+
+;<GLOBAL QUESTION-WORD-PAIR-TABLE
+       <PLTABLE        <PTABLE <VOC "AREN" BUZZ>       <VOC "T" BUZZ>>
+               <PTABLE <VOC "COULDN" BUZZ>     <VOC "T" <>>>
+               <PTABLE <VOC "DIDN" BUZZ>       <VOC "T" <>>>
+               <PTABLE <VOC "DON" <>>          <VOC "T" <>>>
+               <PTABLE <VOC "HASN" BUZZ>       <VOC "T" <>>>
+               <PTABLE <VOC "HAVEN" BUZZ>      <VOC "T" <>>>
+               <PTABLE <VOC "HE" BUZZ ;NOUN>   <VOC "S" <>>>
+               <PTABLE <VOC "I" <>>            <VOC "LL" BUZZ>>
+               <PTABLE <VOC "I" <>>            <VOC "M" BUZZ>>
+               <PTABLE <VOC "I" <>>            <VOC "VE" BUZZ>>
+               <PTABLE <VOC "ISN" BUZZ>        <VOC "T" <>>>
+               <PTABLE <VOC "IT" <>>           <VOC "S" <>>>
+               <PTABLE <VOC "LET" BUZZ>        <VOC "S" <>>>
+               ;<PTABLE <VOC "SHAN" BUZZ>      <VOC "T" <>>>
+               <PTABLE <VOC "SHE" BUZZ ;NOUN>  <VOC "S" <>>>
+               <PTABLE <VOC "SHOULD" BUZZ>     <VOC "T" <>>>
+               <PTABLE <VOC "THAT" BUZZ>       <VOC "S" <>>>
+               <PTABLE <VOC "THEY" BUZZ>       <VOC "RE" BUZZ>>
+               <PTABLE <VOC "WASN" BUZZ>       <VOC "T" <>>>
+               <PTABLE <VOC "WE" <>>           <VOC "RE" BUZZ>>
+               <PTABLE <VOC "WEREN" BUZZ>      <VOC "T" <>>>
+               <PTABLE <VOC "WON" BUZZ>        <VOC "T" <>>>
+               <PTABLE <VOC "WOULDN" BUZZ>     <VOC "T" <>>>
+               <PTABLE <VOC "YOU" <>>          <VOC "RE" BUZZ>>>>
+
+<GLOBAL QWP1-TABLE
+       <PLTABLE        <VOC "AREN" BUZZ>
+               <VOC "COULDN" BUZZ>
+               <VOC "DIDN" BUZZ>
+               <VOC "DON" <>>
+               <VOC "HASN" BUZZ>
+               <VOC "HAVEN" BUZZ>
+               <VOC "HE" BUZZ ;NOUN>
+               <VOC "I" <>>
+               <VOC "I" <>>
+               <VOC "I" <>>
+               <VOC "I" <>>
+               <VOC "ISN" BUZZ>
+               <VOC "IT" <>>
+               <VOC "LET" BUZZ>
+               ;<VOC "SHAN" BUZZ>
+               <VOC "SHE" BUZZ ;NOUN>
+               <VOC "SHOULD" BUZZ>
+               <VOC "THAT" BUZZ>
+               <VOC "THEY" BUZZ>
+               <VOC "WASN" BUZZ>
+               <VOC "WE" <>>
+               <VOC "WE" <>>
+               <VOC "WEREN" BUZZ>
+               <VOC "WON" BUZZ>
+               <VOC "WOULDN" BUZZ>
+               <VOC "YOU" <>>>>
+
+<GLOBAL QWP2-TABLE
+       <PLTABLE        <VOC "T" BUZZ>
+               <VOC "T" <>>
+               <VOC "T" <>>
+               <VOC "T" <>>
+               <VOC "T" <>>
+               <VOC "T" <>>
+               <VOC "S" <>>
+               <VOC "D" <>>
+               <VOC "LL" BUZZ>
+               <VOC "M" BUZZ>
+               <VOC "VE" BUZZ>
+               <VOC "T" <>>
+               <VOC "S" <>>
+               <VOC "S" <>>
+               ;<VOC "T" <>>
+               <VOC "S" <>>
+               <VOC "T" <>>
+               <VOC "S" <>>
+               <VOC "RE" BUZZ>
+               <VOC "T" <>>
+               <VOC "RE" BUZZ>
+               <VOC "LL" BUZZ>
+               <VOC "T" <>>
+               <VOC "T" <>>
+               <VOC "T" <>>
+               <VOC "RE" BUZZ>>>
+
+<GLOBAL QUESTION-WORD-TABLE
+       <PLTABLE        <VOC "AM" BUZZ>
+               <VOC "ARE" BUZZ>
+               <VOC "CAN" BUZZ>
+               <VOC "COULD" BUZZ>
+               <VOC "DID" BUZZ>
+               <VOC "DO" BUZZ>
+               <VOC "HAS" BUZZ>
+               <VOC "HAVE" BUZZ>
+               <VOC "HOW" BUZZ>
+               <VOC "IS" BUZZ>
+               <VOC "LIKE" BUZZ>
+               <VOC "MAY" BUZZ>
+               <VOC "SHALL" BUZZ>
+               <VOC "SHOULD" BUZZ>
+               <VOC "WANT" BUZZ>
+               <VOC "WAS" BUZZ>
+               <VOC "WERE" BUZZ>
+               <VOC "WHEN" BUZZ>
+               <VOC "WHICH" BUZZ>
+               <VOC "WHY" BUZZ>
+               ;<VOC "WILL" BUZZ>
+               <VOC "WOULD" BUZZ>>>
+
+<GLOBAL SOMETHING " (something).]|">
+<GLOBAL QUESTION-WORD-COUNT:NUMBER 2>
+
+<ROUTINE QUESTION-WORD? (WORD "OPTIONAL" (DO-IT <>))
+       <COND (<EQUAL? .WORD ,W?\(SOME>
+              <TELL "[Type a real word instead of" ,SOMETHING>
+              <RTRUE>)
+             (<EQUAL? .WORD ,W?WHERE>
+              <TO-DO-X-USE-Y "locate" "FIND">
+              <RTRUE>)
+             (<OR <EQUAL? .WORD ,W?WHAT ,W?WHO ,W?WHEN>
+                  <EQUAL? .WORD ,W?WHY>>
+              <TO-DO-X-USE-Y "ask about" "TELL ME ABOUT">
+              <RTRUE>)
+             (<OR <T? .DO-IT> <ZMEMQ .WORD ,QUESTION-WORD-TABLE>>
+              <TELL "[Please use commands">
+              <SETG QUESTION-WORD-COUNT <+ 1 ,QUESTION-WORD-COUNT>>
+              <COND (<ZERO? <MOD ,QUESTION-WORD-COUNT 4 ;9>>
+                     <TELL
+" to tell the computer what you want to do in the story.
+Here are some commands:|
+   GO TO MY ROOM|
+   LOOK UNDER THE RUG|
+   MADAM, DESCRIBE THE GHOST|
+Now you can try again">)
+                    (T <TELL ", not statements or questions">)>
+              <TELL ".]" CR>)>>
+
+<ROUTINE TO-DO-X-USE-Y (STR1 STR2)
+       <TELL
+"[To " .STR1 " something, use the command: " .STR2 ,SOMETHING>
+       <RTRUE>>
+
+<GLOBAL NUMBER-WORD-TABLE
+       <PLTABLE        <VOC "ZERO" BUZZ>
+               <VOC "ONE" BUZZ>
+               <VOC "TWO" BUZZ>
+               <VOC "THREE" BUZZ>
+               <VOC "FOUR" BUZZ>
+               <VOC "FIVE" BUZZ>
+               <VOC "SIX" BUZZ>
+               <VOC "SEVEN" BUZZ>
+               <VOC "EIGHT" BUZZ>
+               <VOC "NINE" BUZZ>
+               <VOC "TEN" BUZZ>
+               <VOC "ELEVEN" BUZZ>
+               <VOC "TWELVE" BUZZ>
+               ;"<VOC 'THIRTEEN' BUZZ>
+               <VOC 'FOURTEEN' BUZZ>
+               <VOC 'FIFTEEN' BUZZ>
+               <VOC 'SIXTEEN' BUZZ>
+               <VOC 'SEVENT' BUZZ>
+               <VOC 'EIGHTEEN' BUZZ>
+               <VOC 'NINETEEN' BUZZ>"
+               <VOC "TWENTY" BUZZ>
+               <VOC "THIRTY" BUZZ>
+               <VOC "FORTY" BUZZ>
+               <VOC "FIFTY" BUZZ>
+               <VOC "SIXTY" BUZZ>
+               ;<VOC "EIGHTY" BUZZ>
+               ;<VOC "NINETY" BUZZ>
+               <VOC "HUNDRED" BUZZ>
+               <VOC "THOUSAND" BUZZ>
+               ;<VOC "MILLION" BUZZ>
+               ;<VOC "BILLION" BUZZ>>>
+
+<ROUTINE NUMBER-WORD? (WRD)
+       <COND (<ZMEMQ .WRD ,NUMBER-WORD-TABLE>
+              <TELL "[Use numerals for numbers, for example \"10.\"]" CR>
+              <RTRUE>)>>
+
+<GLOBAL NAUGHTY-WORD-TABLE
+       <PLTABLE        <VOC "ASSHOLE" BUZZ>
+               <VOC "BASTARD" BUZZ>
+               <VOC "BITCH" BUZZ>
+               ;<VOC "CHOMP" BUZZ>
+               ;<VOC "CHOMPING" BUZZ>
+               <VOC "COCK" BUZZ>
+               <VOC "COCKSUCKER" BUZZ>
+               <VOC "CRAP" BUZZ>
+               <VOC "CUNT" BUZZ>
+               <VOC "CURSE" BUZZ>
+               ;<VOC "CURSES" BUZZ>
+               <VOC "CUSS" BUZZ>
+               <VOC "DAMN" BUZZ>
+               <VOC "DAMNED" BUZZ>
+               <VOC "DARN" BUZZ>
+               <VOC "FUCK" BUZZ>
+               <VOC "FUCKED" BUZZ>
+               <VOC "FUCKING" BUZZ>
+               <VOC "FUDGE" BUZZ>
+               <VOC "GODDAMN" BUZZ>
+               <VOC "HELL" BUZZ>
+               <VOC "PEE" BUZZ>
+               <VOC "PISS" BUZZ>
+               <VOC "SCREW" BUZZ>
+               <VOC "SHIT" BUZZ>
+               <VOC "SHITHEAD" BUZZ>
+               <VOC "SUCK" BUZZ>
+               <VOC "SUCKS" BUZZ>>>
+
+<ROUTINE NAUGHTY-WORD? (WORD)
+ <COND (<ZMEMQ .WORD ,NAUGHTY-WORD-TABLE>
+       <TELL !\[ <PICK-ONE-NEW ,OFFENDED> !\] CR>)>>
+
+<GLOBAL OFFENDED
+       <LTABLE 0
+               "What charming language!"
+               "Computers aren't impressed by naughty words!"
+               "You ought to be ashamed of yourself!"
+               "Hey, save that talk for the locker room!"
+               "Step outside and say that!"
+               "And so's your old man!">>
+\f
+" Grovel down the input finding the verb, prepositions, and noun phrases.
+   If the input is <direction> or <walk> <direction>, fall out immediately
+   setting PRSA to ,V?WALK and PRSO to <direction>.  Otherwise, perform
+   all required orphaning, syntax checking, and noun phrase lookup."   
+
+<BUZZ AGAIN G OOPS>
+<GLOBAL BEG-PARDON "I beg your pardon?">
+
+<ROUTINE NOT-THAT-WAY (STR)
+       <TELL "[You can't use " .STR " that way.]" CR>>
+
+<ROUTINE PARSER ("AUX" (PTR ,P-LEXSTART) WRD (VAL 0) (VERB <>) (OF-FLAG <>)
+                      LEN (DIR <>) (NW 0) (LW 0) (CNT -1) OMERGED OWINNER
+                      TMP) 
+       <REPEAT ()
+               <COND (<G? <SET CNT <+ .CNT 1>> ,P-ITBLLEN> <RETURN>)
+                     (T
+                      <COND (<NOT ,P-OFLAG>
+                             <PUT ,P-OTBL .CNT <GET ,P-ITBL .CNT>>)>
+                      <PUT ,P-ITBL .CNT 0>)>>
+       <SETG P-NAM <>>
+       <SETG P-ADJ <>>
+       <SETG P-ADJN <>>
+       <SETG P-XNAM <>>
+       <SETG P-XADJ <>>
+       <SETG P-XADJN <>>
+       ;<SETG P-ADVERB <>>
+       <COND (<ZERO? ,P-OFLAG>
+              <PUT ,P-NAMW 0 <>>
+              <PUT ,P-NAMW 1 <>>
+              <PUT ,P-ADJW 0 <>>
+              <PUT ,P-ADJW 1 <>>
+              <PUT ,P-OFW 0 <>>
+              <PUT ,P-OFW 1 <>>)>
+       <SETG P-PRSA-WORD <>>
+       <SET OMERGED ,P-MERGED>
+       <SETG P-MERGED <>>
+       <SETG P-END-ON-PREP <>>
+       <PUT/B ,P-PRSO ,P-MATCHLEN 0>
+       <PUT/B ,P-PRSI ,P-MATCHLEN 0>
+       <PUT/B ,P-BUTS ,P-MATCHLEN 0>
+       <SET OWINNER ,WINNER>
+       <COND (<AND <NOT ,QUOTE-FLAG> <N==? ,WINNER ,PLAYER>>
+              <SETG WINNER ,PLAYER>
+              <COND (<NOT <FSET? <LOC ,WINNER> ,VEHBIT>>
+                     ;<SETG OHERE ,HERE>
+                     <SETG HERE <LOC ,WINNER>>)>
+              <SETG LIT <LIT? ;,HERE>>)>
+       <COND (<NOT <ZERO? ,RESERVE-PTR>>
+              <SET PTR ,RESERVE-PTR>
+              <STUFF ,P-LEXV ,RESERVE-LEXV>
+              <INBUF-STUFF ,P-INBUF ,RESERVE-INBUF>
+              <COND (<AND <NOT <0? ,VERBOSITY>>
+                          <==? ,PLAYER ,WINNER>>
+                     <CRLF>)>
+              <SETG RESERVE-PTR <>>
+              ;<SETG P-CONT <>>)
+             (<NOT <ZERO? ,P-CONT>>
+              <SET PTR ,P-CONT>
+              ;<SETG P-CONT <>>
+              <COND (<AND <NOT <0? ,VERBOSITY>>
+                          <==? ,PLAYER ,WINNER>>
+                     <CRLF>)>
+              ;<COND (<NOT <VERB? ASK TELL SAY>> <CRLF>)>)
+             (T
+              <SETG WINNER ,PLAYER>
+              <SETG QUOTE-FLAG <>>
+              <COND (<ZERO? <GET ,OOPS-TABLE ,O-PTR>>
+                     <PUT ,OOPS-TABLE ,O-END <>>)>
+              <COND (<NOT <FSET? <LOC ,WINNER> ,VEHBIT>>
+                     ;<SETG OHERE ,HERE>
+                     <SETG HERE <LOC ,WINNER>>)>
+              <SETG LIT <LIT? ;,HERE>>
+              <FCLEAR ,IT  ,TOUCHBIT>  ;"to prevent pronouns w/o referents"
+              <FCLEAR ,HER ,TOUCHBIT>
+              <FCLEAR ,HIM ,TOUCHBIT>
+              ;<FCLEAR,THEM ,TOUCHBIT>
+              <COND (<NOT <0? ,VERBOSITY>>
+                     ;<NOT ,SUPER-BRIEF>
+                     <CRLF>)>
+              <COND (<AND ,P-PROMPT <ZERO? ,P-OFLAG> <ZERO? ,AWAITING-REPLY>>
+                     <COND (<EQUAL? ,P-PROMPT ,P-PROMPT-START>
+                            <TELL "What would you like to do?">)
+                           (<L? <SETG P-PROMPT <- ,P-PROMPT 1>> 1>
+                            <TELL
+"[You won't see \"What next?\" any more.]|
+">)
+                           (T <TELL "What next?">)>
+                     <CRLF>)>
+              %<COND (<AND <GASSIGNED? PLUS-MODE> ,PLUS-MODE>
+                      '<PROG ()
+                             <USL>
+                             <TELL !\>>>)
+                     (T
+                      '<TELL !\>>)>
+              <READ ,P-INBUF ,P-LEXV>)>
+       <SETG P-LEN <GETB ,P-LEXV ,P-LEXWORDS>>
+       ;<PUT ,P-LEXV <+ 1 <* ,P-LEN ,P-LEXELEN>> 0>    ;"for NW in SNARFEM"
+       <COND (<AND <==? ,W?QUOTE <GET ,P-LEXV .PTR>>
+                   <QCONTEXT-GOOD?>>           ;"Is quote first input token?"
+              <SET PTR <+ .PTR ,P-LEXELEN>>    ;"If so, ignore it."
+              <SETG P-LEN <- ,P-LEN 1>>)>
+       <COND (<==? ,W?THEN <GET ,P-LEXV .PTR>> ;"Is THEN first input word?"
+              <SET PTR <+ .PTR ,P-LEXELEN>>    ;"If so, ignore it."
+              <SETG P-LEN <- ,P-LEN 1>>)>
+       <COND (<AND <L? 1 ,P-LEN>
+                   <EQUAL? <GET ,P-LEXV .PTR>
+                           ,W?YOU>             ;"Is this the first word ..."
+                   <SET NW <GET ,P-LEXV <+ .PTR ,P-LEXELEN>>>
+                   <WT? .NW ,PS?VERB ;,P1?VERB> ;" followed by verb?">
+              <SET PTR <+ .PTR ,P-LEXELEN>>    ;"If so, ignore it."
+              <SETG P-LEN <- ,P-LEN 1>>)>
+       <COND (<AND <L? 1 ,P-LEN>
+                   <EQUAL? <GET ,P-LEXV .PTR>
+                           ,W?GO ,W?TO>        ;"Is this the first word ..."
+                   <SET NW <GET ,P-LEXV <+ .PTR ,P-LEXELEN>>>
+                   <WT? .NW ,PS?VERB ;,P1?VERB> ;" followed by verb?">
+              <SET PTR <+ .PTR ,P-LEXELEN>>    ;"If so, ignore it."
+              <SETG P-LEN <- ,P-LEN 1>>)>
+       <COND (<0? ,P-LEN>
+              <TELL !\[ ,BEG-PARDON "]" CR>
+              <RFALSE>)
+             (<EQUAL? <GET ,P-LEXV .PTR> ,W?OOPS>
+              <COND (<EQUAL? <GET ,P-LEXV <+ .PTR ,P-LEXELEN>>
+                             ,W?PERIOD ,W?COMMA ,W?\!>
+                     <SET PTR <+ .PTR ,P-LEXELEN>>
+                     <SETG P-LEN <- ,P-LEN 1>>)>
+              <COND (<NOT <G? ,P-LEN 1>>
+                     <NOT-THAT-WAY "OOPS">
+                     <RFALSE>)
+                    (<SET VAL <GET ,OOPS-TABLE ,O-PTR>>
+                     <COND (<AND <G? ,P-LEN 2>
+                                 ;<NOT <FIX-POSSESSIVES .PTR
+                                                       <+ .PTR
+                                                          <* ,P-LEXELEN 3>>
+                                                       ,P-LEXELEN>>>
+                            <TELL
+"[Warning: only the first word after OOPS is used.]" CR>)>
+                     <PUT ,AGAIN-LEXV .VAL <GET ,P-LEXV <+ .PTR ,P-LEXELEN>>>
+                     ;<COND (<G? ,P-LEN 2>
+                            )>
+                     <SETG WINNER .OWINNER> ;"Fixes OOPS w/chars"
+                     <SET PTR <+ <* .PTR ,P-LEXELEN> 6>>
+                     <INBUF-ADD <GETB ,P-LEXV .PTR>
+                                <GETB ,P-LEXV <+ .PTR 1>>
+                                <+ <* .VAL ,P-LEXELEN> 3>>
+                     ;<COND (<G? ,P-LEN 2>
+                            )>
+                     <STUFF ,P-LEXV ,AGAIN-LEXV>
+                     <SETG P-LEN <GETB ,P-LEXV ,P-LEXWORDS>>
+                     <SET PTR <GET ,OOPS-TABLE ,O-START>>
+                     <INBUF-STUFF ,P-INBUF ,OOPS-INBUF>
+                     <SETG OOPS-PRINT T>
+                     <PRINT-LEXV .PTR>
+                     <SETG OOPS-PRINT <>>)
+                    (T
+                     <PUT ,OOPS-TABLE ,O-END <>>
+                     <TELL "[There was no word to replace!]" CR>
+                     <RFALSE>)>)
+             (<ZERO? ,P-CONT>
+              <PUT ,OOPS-TABLE ,O-END <>>)>
+       <SETG P-CONT <>>
+       <COND (<EQUAL? <GET ,P-LEXV .PTR> ,W?AGAIN ,W?G>
+              <COND (<ZERO? <GETB ,OOPS-INBUF 1>>
+                     <TELL "[What do you want to do again?]" CR>
+                     <RFALSE>)
+                    (<NOT <ZERO? ,P-OFLAG>>
+                     <NOT-THAT-WAY "AGAIN">
+                     <RFALSE>)
+                    (<NOT ,P-WON> ;<T? ,CLOCK-WAIT>
+                     <TELL "[That would just repeat a mistake!]" CR>
+                     <RFALSE>)
+                    (<G? ,P-LEN 1>
+                     <COND (<OR <EQUAL? <SET CNT <GET ,P-LEXV
+                                                      <+ .PTR ,P-LEXELEN>>>
+                                        ,W?PERIOD ,W?COMMA ,W?THEN>
+                                <EQUAL? .CNT ,W?AND ,W?\! ,W??>>
+                            <SET PTR <+ .PTR <* 2 ,P-LEXELEN>>>
+                            <PUTB ,P-LEXV ,P-LEXWORDS
+                                  <- <GETB ,P-LEXV ,P-LEXWORDS> 2>>)
+                           (T
+                            <DONT-UNDERSTAND>
+                            <RFALSE>)>)
+                    (T
+                     <SET PTR <+ .PTR ,P-LEXELEN>>
+                     <PUTB ,P-LEXV ,P-LEXWORDS 
+                           <- <GETB ,P-LEXV ,P-LEXWORDS> 1>>)>
+              <COND (<G? <GETB ,P-LEXV ,P-LEXWORDS> 0>
+                     <STUFF ,RESERVE-LEXV ,P-LEXV>
+                     <INBUF-STUFF ,RESERVE-INBUF ,P-INBUF>
+                     <SETG RESERVE-PTR .PTR>)
+                    (T
+                     <SETG RESERVE-PTR <>>)>
+              ;<SETG P-LEN <GETB ,AGAIN-LEXV ,P-LEXWORDS>>
+              <SETG WINNER .OWINNER>
+              <SETG P-MERGED .OMERGED>
+              <INBUF-STUFF ,P-INBUF ,OOPS-INBUF>
+              <STUFF ,P-LEXV ,AGAIN-LEXV>
+              <SET CNT -1>
+              <SET DIR ,AGAIN-DIR>
+              <REPEAT ()
+               <COND (<IGRTR? CNT ,P-ITBLLEN> <RETURN>)
+                     (T <PUT ,P-ITBL .CNT <GET ,P-OTBL .CNT>>)>>)
+             (T
+              <SETG P-NUMBER -1>
+              <SET LEN <+ .PTR <* ,P-LEXELEN <GETB ,P-LEXV ,P-LEXWORDS>>>>
+              <COND (<==? T <FIX-POSSESSIVES .PTR .LEN>>
+                     <RFALSE>)>
+              <STUFF ,AGAIN-LEXV ,P-LEXV>
+              <INBUF-STUFF ,OOPS-INBUF ,P-INBUF>
+              <PUT ,OOPS-TABLE ,O-START .PTR>
+              <PUT ,OOPS-TABLE ,O-LENGTH <* 4 ,P-LEN>>
+              <COND (<ZERO? <GET ,OOPS-TABLE ,O-END>>
+                     <SET LEN <* 2 .LEN>>
+                     <PUT ,OOPS-TABLE ,O-END <+ <GETB ,P-LEXV <- .LEN 1>>
+                                                <GETB ,P-LEXV <- .LEN 2>>>>)>
+              <SETG RESERVE-PTR <>>
+              <SET LEN ,P-LEN>
+              <SETG P-DIRECTION <>>
+              <SETG P-NCN 0>
+              <SETG P-GETFLAGS 0>
+              ;"3/25/83: Next statement added."
+              <PUT ,P-ITBL ,P-VERBN 0>
+              <REPEAT ()
+               <COND (<L? <SETG P-LEN <- ,P-LEN 1>> 0>
+                      <SETG QUOTE-FLAG <>>
+                      <RETURN>)
+                     (<AND <SET WRD <GET ,P-LEXV .PTR>>
+                           <BUZZER-WORD? .WRD .PTR>>
+                      <RFALSE>)
+                     (<OR <T? .WRD>
+                          <SET WRD <NUMBER? .PTR>>
+                          <SET WRD <NAME? .PTR>>>
+                      <COND (<0? ,P-LEN> <SET NW 0>)
+                            (T <SET NW <GET ,P-LEXV <+ .PTR ,P-LEXELEN>>>)>
+                      <COND (<AND <==? .WRD ,W?TO>
+                                  <EQUAL? .VERB ,ACT?TELL ,ACT?ASK>>
+                             <PUT ,P-ITBL ,P-VERB ,ACT?TELL>
+                             ;<SET VERB ,ACT?TELL>
+                             <SET WRD ,W?QUOTE>)
+                            (<AND <EQUAL? .WRD ,W?THEN ;,W?PERIOD>
+                                  ;<NOT <EQUAL? .NW ,W?THEN ;,W?PERIOD>>
+                                  <G? ,P-LEN 0>
+                                  <ZERO? .VERB>
+                                  <ZERO? ,QUOTE-FLAG>>
+                             <PUT ,P-ITBL ,P-VERB ,ACT?TELL>
+                             <PUT ,P-ITBL ,P-VERBN 0>
+                             <SET WRD ,W?QUOTE>)>
+                      <COND (<AND <EQUAL? .WRD ,W?PERIOD>
+                                  <OR <EQUAL? .LW ,W?MRS ,W?MR ,W?MS>
+                                      <EQUAL? .LW ,W?DR ;,W?LT>>>
+                             <SET LW 0>)
+                            (<OR <EQUAL? .WRD ,W?THEN ,W?PERIOD ,W?QUOTE>
+                                 <EQUAL? .WRD ,W?\! ,W??>> 
+                             <COND (<EQUAL? .WRD ,W?QUOTE>
+                                    <COND (<NOT <ZERO? ,QUOTE-FLAG>>
+                                           <SETG QUOTE-FLAG <>>)
+                                          (T <SETG QUOTE-FLAG T>)>)>
+                             <OR <0? ,P-LEN>
+                                 <SETG P-CONT <+ .PTR ,P-LEXELEN>>>
+                             <PUTB ,P-LEXV ,P-LEXWORDS ,P-LEN>
+                             <RETURN>)
+                            (<AND <SET VAL
+                                       <WT? .WRD
+                                            ,PS?DIRECTION
+                                            ,P1?DIRECTION>>
+                                  <EQUAL? .VERB <> ,ACT?HEAD ;WALK>
+                                  <OR <==? .LEN 1>
+                                      <AND <==? .LEN 2>
+                                           <EQUAL? .VERB ,ACT?HEAD ;WALK>>
+                                      <AND <EQUAL? .NW
+                                                   ,W?THEN ,W?PERIOD ,W?QUOTE>
+                                           <G? .LEN 1 ;2>>
+                                      <AND <EQUAL? .NW ,W?\! ,W??>
+                                           <G? .LEN 1 ;2>>
+                                      <AND ,QUOTE-FLAG
+                                           <==? .LEN 2>
+                                           <EQUAL? .NW ,W?QUOTE>>
+                                      <AND <G? .LEN 2>
+                                           <EQUAL? .NW ,W?COMMA ,W?AND>>>>
+                             ;<COND (<ZERO? ,P-PRSA-WORD>
+                                    <SETG P-PRSA-WORD .WRD>)>
+                             <SET DIR .VAL>
+                             <COND (<EQUAL? .NW ,W?COMMA ,W?AND>
+                                    <CHANGE-LEXV <+ .PTR ,P-LEXELEN>
+                                                 ,W?THEN>)>
+                             <COND (<NOT <G? .LEN 2>>
+                                    <SETG QUOTE-FLAG <>>
+                                    <RETURN>)>)
+                            (<AND <SET VAL <WT? .WRD ,PS?VERB ,P1?VERB>>
+                                  <ZERO? .VERB>>
+                             <SETG P-PRSA-WORD .WRD>
+                             <SET VERB .VAL>
+                             <PUT ,P-ITBL ,P-VERB .VAL>
+                             <PUT ,P-ITBL ,P-VERBN ,P-VTBL>
+                             <PUT ,P-VTBL 0 .WRD>
+                             <PUTB ,P-VTBL 2 <GETB ,P-LEXV
+                                                   <SET TMP
+                                                        <+ <* .PTR 2> 2>>>>
+                             <PUTB ,P-VTBL 3 <GETB ,P-LEXV <+ .TMP 1>>>)
+                            (<OR <SET VAL <WT? .WRD ,PS?PREPOSITION 0>>
+                                 <AND <OR <EQUAL? .WRD ,W?ALL ,W?ONE ,W?A>
+                                          ;<EQUAL? .WRD ,W?BOTH>
+                                          <WT? .WRD ,PS?ADJECTIVE>
+                                          <WT? .WRD ,PS?OBJECT>>
+                                      <SET VAL 0>>>
+                             <COND (<AND <G? ,P-LEN 1 ;0>
+                                         <==? .NW ,W?OF>
+                                         ;<NOT <EQUAL? .VERB
+                                                      ,ACT?MAKE ,ACT?TAKE>>
+                                         <0? .VAL>
+                                         <NOT<EQUAL? .WRD ,W?ALL ,W?ONE ,W?A>>
+                                         ;<NOT <EQUAL? .WRD ,W?BOTH>>>
+                                    <PUT ,P-OFW ,P-NCN .WRD>   ;"Save OF-word"
+                                    <SET OF-FLAG T>)
+                                   (<AND <NOT <0? .VAL>>
+                                         <OR <0? ,P-LEN>
+                                             <EQUAL? .NW ,W?THEN ,W?PERIOD>
+                                             <EQUAL? .NW ,W?\! ,W??>>>
+                                    <SETG P-END-ON-PREP T>
+                                    <COND (<L? ,P-NCN 2>
+                                           <PUT ,P-ITBL ,P-PREP1 .VAL>
+                                           <PUT ,P-ITBL ,P-PREP1N .WRD>)>)
+                                   (<==? ,P-NCN 2>
+                                    <TELL
+"[I found too many nouns in that sentence!]" CR>
+                                    <RFALSE>)
+                                   (T
+                                    <SETG P-NCN <+ ,P-NCN 1>>
+                                    <COND (<ZERO?
+                                            <SET PTR <CLAUSE .PTR .VAL .WRD>>>
+                                           <RFALSE>)>
+                                    <COND (<L? .PTR 0>
+                                           <SETG QUOTE-FLAG <>>
+                                           <RETURN>)>)>)
+                            ;(<==? .WRD ,W?CLOSELY>
+                             <SETG P-ADVERB ,W?CAREFULLY>)
+                            ;(<OR <EQUAL? .WRD
+                                        ,W?CAREFULLY ,W?QUIETLY>
+                                 <EQUAL? .WRD
+                                         ,W?SLOWLY ,W?QUICKLY ,W?BRIEFLY>>
+                             <SETG P-ADVERB .WRD>)
+                            (<EQUAL? .WRD ,W?OF>
+                             <COND (<OR <ZERO? .OF-FLAG>
+                                        <EQUAL? .NW ,W?PERIOD ,W?THEN>
+                                        <EQUAL? .NW ,W?\! ,W??>>
+                                    <CANT-USE .PTR>
+                                    <RFALSE>)
+                                   (T
+                                    <SET OF-FLAG <>>)>)
+                            (<WT? .WRD ,PS?BUZZ-WORD>)
+                            (<AND <EQUAL? .VERB ,ACT?TELL>
+                                  <WT? .WRD ,PS?VERB ;,P1?VERB>>
+                             <TELL
+"[Please consult your manual on how to talk to people.]" CR>
+                             <RFALSE>)
+                            (T
+                             <CANT-USE .PTR>
+                             <RFALSE>)>)
+                     (T
+                      <UNKNOWN-WORD .PTR>
+                      <RFALSE>)>
+               <SET LW .WRD>
+               <SET PTR <+ .PTR ,P-LEXELEN>>>)>
+       <PUT ,OOPS-TABLE ,O-PTR <>>
+       <COND (<NOT <ZERO? .DIR>>
+              <SETG PRSA ,V?WALK>
+              <SETG P-WALK-DIR .DIR>
+              <SETG AGAIN-DIR .DIR>
+              <SETG PRSO .DIR>
+              <SETG P-OFLAG <>>
+              <RETURN T>)>
+       <SETG P-WALK-DIR <>>
+       <SETG AGAIN-DIR <>>
+       <COND (<AND ,P-OFLAG
+                   <ORPHAN-MERGE>>
+              <SETG WINNER .OWINNER>)>
+       <COND (<==? <GET ,P-ITBL ,P-VERB> 0>
+              <SET PTR <- .PTR ,P-LEXELEN>>
+              <SET TMP <>>
+              <COND (<G? .PTR 0>
+                     <SET TMP <GET ,P-LEXV .PTR>>)>
+              <COND (<EQUAL? .TMP ,W?PLEASE>
+                     <PUT ,P-ITBL ,P-VERB ,ACT?YES>)
+                    (<EQUAL? .TMP ,W?PERIOD>
+                     <MISSING "verb">
+                     <RFALSE>)
+                    (T <PUT ,P-ITBL ,P-VERB ,ACT?$CALL>)>)>
+       <COND (<AND <SYNTAX-CHECK> <SNARF-OBJECTS> <MANY-CHECK> <TAKE-CHECK>>
+              T)>>
+
+<ROUTINE CHANGE-LEXV (PTR WRD)
+        <PUT ,P-LEXV .PTR .WRD>
+        <PUT ,AGAIN-LEXV .PTR .WRD>>
+
+<GLOBAL OOPS-PRINT <>>
+<ROUTINE PRINT-LEXV (PTR "AUX" X)
+       <TELL ,I-ASSUME>
+       <SET X <+ ,P-LEXV <* 2 .PTR>>>
+       <BUFFER-PRINT .X <+ .X <* ,P-WORDLEN ,P-LEN>> <>>
+       <TELL "]" CR>>
+
+<GLOBAL P-WALK-DIR <>>
+<GLOBAL AGAIN-DIR <>>
+\f
+"For AGAIN purposes, put contents of one LEXV table into another:"
+
+<ROUTINE STUFF (DEST SRC "OPTIONAL" (MAX 29) "AUX" (PTR ,P-LEXSTART) (CTR 1)
+                                                  BPTR)
+        <PUTB .DEST 0 <GETB .SRC 0>>
+        <PUTB .DEST 1 <GETB .SRC 1>>
+        <REPEAT ()
+         <PUT .DEST .PTR <GET .SRC .PTR>>
+         <SET BPTR <+ <* .PTR 2> 2>>
+         <PUTB .DEST .BPTR <GETB .SRC .BPTR>>
+         <SET BPTR <+ <* .PTR 2> 3>>
+         <PUTB .DEST .BPTR <GETB .SRC .BPTR>>
+         <SET PTR <+ .PTR ,P-LEXELEN>>
+         <COND (<IGRTR? CTR .MAX>
+                <RETURN>)>>>
+
+"Put contents of one INBUF into another:"
+
+<ROUTINE INBUF-STUFF (DEST SRC "OPTIONAL" (CNT 80))
+        <REPEAT ()
+         <COND (<DLESS? CNT 0> <RETURN>)
+               (T <PUTB .DEST .CNT <GETB .SRC .CNT>>)>>> 
+
+"Put the word in the positions specified from P-INBUF to the end of
+OOPS-INBUF, leaving the appropriate pointers in AGAIN-LEXV:"
+
+<ROUTINE INBUF-ADD (LEN BEG SLOT "AUX" DBEG (CTR 0) TMP)
+        <COND (<SET TMP <GET ,OOPS-TABLE ,O-END>>
+               <SET DBEG .TMP>)
+              (T
+               <SET TMP <GET ,OOPS-TABLE ,O-LENGTH>>
+               <SET DBEG <+ <GETB ,AGAIN-LEXV .TMP>
+                            <GETB ,AGAIN-LEXV <+ .TMP 1>>>>)>
+        <PUT ,OOPS-TABLE ,O-END <+ .DBEG .LEN>>
+        <REPEAT ()
+         <PUTB ,OOPS-INBUF <+ .DBEG .CTR> <GETB ,P-INBUF <+ .BEG .CTR>>>
+         <SET CTR <+ .CTR 1>>
+         <COND (<EQUAL? .CTR .LEN> <RETURN>)>>
+        <PUTB ,AGAIN-LEXV .SLOT .DBEG>
+        <PUTB ,AGAIN-LEXV <- .SLOT 1> .LEN>>
+
+<ROUTINE FIX-POSSESSIVES (START END "OPTIONAL" (WHERE 0)
+                                   "AUX" PTR N PNAM PADJ (VAL <>) X)
+ <SET PNAM ,P-NAM>
+ <SET PADJ ,P-ADJ>
+ <SETG P-ADJ <>>
+ <SET PTR .END>
+ <REPEAT ()
+       <SET PTR <- .PTR ,P-LEXELEN>>
+       <COND (<==? .PTR .START> <RETURN>)
+             (<==? <GET ,P-LEXV .PTR> ,W?APOSTROPHE>
+              <SETG P-NAM <GET ,P-LEXV <- .PTR ,P-LEXELEN>>>
+              <SET N ,RHINO-HEAD-C ;,CHARACTER-MAX>
+              <REPEAT ()
+                      <COND (<AND <T? ,P-NAM>
+                                  <THIS-IT? <GET ,CHARACTER-TABLE .N>>>
+                             <THIS-IS-IT <GET ,CHARACTER-TABLE .N>>
+                             <SET VAL <GET ,CHAR-POSS-TABLE <+ 1 .N>>>
+                             <CHANGE-LEXV ;.PTR <- .PTR .WHERE> .VAL>
+                             <RETURN>)
+                            (<DLESS? N 0 ;1>
+                             <RETURN>)>>
+              <COND (<NOT <L? .N 0 ;1>> <AGAIN>)>
+              <COND (<NAME? <- .PTR ,P-LEXELEN>>
+                     <CHANGE-LEXV ;.PTR <- .PTR .WHERE> ,W?MY>
+                     <AGAIN>)>
+              <SET N <GET ,QWP1-TABLE 0>>
+              <SET X <GET ,P-LEXV <+ .PTR ,P-LEXELEN>>>
+              <REPEAT ()
+               <COND (<AND <==? <GET ,QWP1-TABLE .N> ,P-NAM>
+                           <==? <GET ,QWP2-TABLE .N> .X>>
+                      <QUESTION-WORD? ,P-NAM T>
+                      <RTRUE>)
+                     (<DLESS? N 1> <RETURN>)>>
+              ;<UNKNOWN-WORD .PTR ,P-LEXELEN>)>>
+ ;%<DEBUG-CODE <COND (<T? .VAL> <PRINT-LEXV .PTR>)>>
+ <SETG P-NAM .PNAM>
+ <SETG P-ADJ .PADJ>
+ <RETURN .VAL>>
+
+<ROUTINE NAME? (PTR)
+       <OR <XNAME? .PTR ,FIRST-NAME>
+           <XNAME? .PTR ,LAST-NAME>
+           <XNAME? .PTR ,FAVE-COLOR>>>
+
+<ROUTINE XNAME? (PTR TBL "AUX" MAX CNT BPTR CHR (N? T) (NCNT 0))
+        <SET BPTR <REST ,P-LEXV <* .PTR 2>>>
+        <SET CNT <GETB .BPTR 2>>
+        <COND (<G? .CNT 6>
+               <SET CNT 6>)>
+        <SET BPTR <GETB .BPTR 3>>
+        <SET MAX <GETB .TBL 0>>
+        <COND (<NOT <L? .MAX 7>>
+               <SET MAX 6>)>
+        ;%<DEBUG-CODE <COND (,DBUG <TELL "{Namelen=" N .MAX "}" CR>)>>
+        <REPEAT ()
+                <COND (<IGRTR? NCNT .MAX>
+                       ;%<DEBUG-CODE <COND (,DBUG
+                             <TELL "{NCNT=" N .NCNT " CNT=" N .CNT "}" CR>)>>
+                       <COND (<NOT <0? .CNT>> <SET N? <>>)>
+                       <RETURN>)
+                      (<DLESS? CNT 0>
+                       ;%<DEBUG-CODE <COND (,DBUG
+                                           <TELL "{CNT=" N .CNT "}" CR>)>>
+                       <SET N? <>>
+                       <RETURN>)
+                      (T
+                       <SET CHR <GETB ,P-INBUF .BPTR>>
+                       ;%<DEBUG-CODE <COND (,DBUG <TELL "{CHR=" N .CHR>)>>
+                       <COND (<NOT <EQUAL? .CHR 45 39 38>>
+                              <SET CHR <+ *140* <MOD .CHR 32>>>
+                              ;%<DEBUG-CODE <COND (,DBUG
+                                                  <TELL "->" N .CHR>)>>)>
+                       ;%<DEBUG-CODE <COND (,DBUG
+                             <TELL " Namechr=" N <GETB .TBL .NCNT> "}" CR>)>>
+                       <COND (<NOT <==? .CHR <GETB .TBL .NCNT>>>
+                              <SET N? <>>)>
+                       <SET BPTR <+ .BPTR 1>>)>>
+        <COND (.N?
+               <COND (<==? .TBL ,FIRST-NAME>
+                      <CHANGE-LEXV .PTR ,W?F.N>
+                      ,W?F.N)
+                     (<==? .TBL ,FAVE-COLOR>
+                      <CHANGE-LEXV .PTR ,W?F.C>
+                      ,W?F.C)
+                     (T
+                      <CHANGE-LEXV .PTR ,W?L.N>
+                      ,W?L.N)>)>>
+\f
+"Check whether word pointed at by PTR is the correct part of speech.
+   The second argument is the part of speech (,PS?<part of speech>).  The
+   3rd argument (,P1?<part of speech>), if given, causes the value
+   for that part of speech to be returned."
+
+<ROUTINE WT? (PTR BIT "OPTIONAL" (B1 5) "AUX" (OFFS ,P-P1OFF) TYP)
+       <COND (<BTST <SET TYP <GETB .PTR ,P-PSOFF>> .BIT>
+              <COND (<G? .B1 4> <RTRUE>)
+                    (<EQUAL? .BIT ,PS?OBJECT> 1)       ;"NEW-VOC"
+                    (T
+                     <SET TYP <BAND .TYP ,P-P1BITS>>
+                     <COND (<NOT <EQUAL? .TYP .B1>> <SET OFFS <+ .OFFS 1>>)>
+                     <GETB .PTR .OFFS>)>)>>
+
+"Scan through a noun phrase, leaving a pointer to its starting location:"
+
+<ROUTINE CLAUSE (PTR VAL WRD "AUX" OFF NUM (ANDFLG <>) (FIRST?? T) NW (LW 0))
+       <SET OFF <* <- ,P-NCN 1> 2>>
+       <COND (<NOT <==? .VAL 0>>
+              <PUT ,P-ITBL <SET NUM <+ ,P-PREP1 .OFF>> .VAL>
+              <PUT ,P-ITBL <+ .NUM 1> .WRD>
+              <SET PTR <+ .PTR ,P-LEXELEN>>)
+             (T <SETG P-LEN <+ ,P-LEN 1>>)>
+       <COND (<0? ,P-LEN> <SETG P-NCN <- ,P-NCN 1>> <RETURN -1>)>
+       <PUT ,P-ITBL <SET NUM <+ ,P-NC1 .OFF>> <REST ,P-LEXV <* .PTR 2>>>
+       <COND (<EQUAL? <GET ,P-LEXV .PTR> ,W?THE ,W?A ,W?AN>
+              <PUT ,P-ITBL .NUM <REST <GET ,P-ITBL .NUM> 4>>)>
+       <REPEAT ()
+               <COND (<L? <SETG P-LEN <- ,P-LEN 1>> 0>
+                      <PUT ,P-ITBL <+ .NUM 1> <REST ,P-LEXV <* .PTR 2>>>
+                      <RETURN -1>)>
+               <COND (<AND <SET WRD <GET ,P-LEXV .PTR>>
+                           <BUZZER-WORD? .WRD .PTR>>
+                      <RFALSE>)
+                     (<OR <T? .WRD>
+                          <SET WRD <NUMBER? .PTR>>
+                          <SET WRD <NAME? .PTR>>>
+                      <COND (<0? ,P-LEN> <SET NW 0>)
+                            (T <SET NW <GET ,P-LEXV <+ .PTR ,P-LEXELEN>>>)>
+                      ;<COND (<AND <==? .WRD ,W?OF>
+                                  <EQUAL? <GET ,P-ITBL ,P-VERB>
+                                          ,ACT?MAKE ,ACT?TAKE>>
+                             <CHANGE-LEXV .PTR ,W?WITH>
+                             <SET WRD ,W?WITH>)>
+                      <COND (<AND <EQUAL? .WRD ,W?PERIOD>
+                                  <OR <EQUAL? .LW ,W?MRS ,W?MR ,W?MS>
+                                      <EQUAL? .LW ,W?DR ;,W?LT>>>
+                             <SET LW 0>)
+                            (<EQUAL? .WRD ,W?AND ,W?COMMA> <SET ANDFLG T>)
+                            (<EQUAL? .WRD ,W?ALL ;,W?BOTH ,W?ONE>
+                             <COND (<==? .NW ,W?OF>
+                                    <SETG P-LEN <- ,P-LEN 1>>
+                                    <SET PTR <+ .PTR ,P-LEXELEN>>)>)
+                            (<OR <EQUAL? .WRD ,W?THEN ,W?PERIOD>
+                                 <EQUAL? .WRD ,W?\! ,W??>
+                                 <AND <WT? .WRD ,PS?PREPOSITION>
+                                      <GET ,P-ITBL ,P-VERB>
+                                      <NOT .FIRST??>>>
+                             <SETG P-LEN <+ ,P-LEN 1>>
+                             <PUT ,P-ITBL
+                                  <+ .NUM 1>
+                                  <REST ,P-LEXV <* .PTR 2>>>
+                             <RETURN <- .PTR ,P-LEXELEN>>)
+                            ;"3/16/83: This clause used to be later."
+                            (<AND .ANDFLG
+                                  <OR <EQUAL? <GET ,P-ITBL ,P-VERBN> 0>
+                                      <VERB-DIR-ONLY? .WRD>>>
+                             <SET PTR <- .PTR 4>>
+                             <CHANGE-LEXV <+ .PTR 2> ,W?THEN>
+                             <SETG P-LEN <+ ,P-LEN 2>>)
+                            (<WT? .WRD ,PS?OBJECT>
+                             <COND (<AND <G? ,P-LEN 0>
+                                         <EQUAL? .NW ,W?OF>
+                                         <NOT <EQUAL? .WRD ,W?ALL ,W?ONE>>>
+                                    <PUT ,P-OFW <- ,P-NCN 1> .WRD>)
+                                   (<AND <WT? .WRD ,PS?ADJECTIVE>
+                                         <T? .NW>
+                                         <NOT <WT? .NW ,PS?DIRECTION>>
+                                               ;"DRIVE CAR SOUTH"
+                                         <OR <WT? .NW ,PS?OBJECT>
+                                             <WT? .NW ,PS?ADJECTIVE>>>)
+                                   (<AND <NOT .ANDFLG>
+                                         <NOT <EQUAL? .NW ,W?BUT ,W?EXCEPT>>
+                                         <NOT <EQUAL? .NW ,W?AND ,W?COMMA>>>
+                                    <PUT ,P-ITBL
+                                         <+ .NUM 1>
+                                         <REST ,P-LEXV <* <+ .PTR 2> 2>>>
+                                    <RETURN .PTR>)
+                                   (T <SET ANDFLG <>>)>)
+                            ;"Next clause replaced by following one to allow
+                              ATTRACTIVE MAN, VERB - JW 2/15/85"
+                            ;(<AND <OR ,P-MERGED
+                                      ,P-OFLAG
+                                      <NOT <EQUAL? <GET ,P-ITBL ,P-VERB> 0>>>
+                                  <OR <WT? .WRD ,PS?ADJECTIVE>
+                                      <WT? .WRD ,PS?BUZZ-WORD>>>)
+                            (<OR <WT? .WRD ,PS?ADJECTIVE>
+                                 <WT? .WRD ,PS?BUZZ-WORD>>)
+                            (<AND .ANDFLG
+                                  <EQUAL? <GET ,P-ITBL ,P-VERB> 0>>
+                             <SET PTR <- .PTR 4>>
+                             <CHANGE-LEXV <+ .PTR 2> ,W?THEN>
+                             <SETG P-LEN <+ ,P-LEN 2>>)
+                            (<WT? .WRD ,PS?PREPOSITION> T)
+                            (T
+                             <CANT-USE .PTR>
+                             <RFALSE>)>)
+                     (T <UNKNOWN-WORD .PTR> <RFALSE>)>
+               <SET LW .WRD>
+               <SET FIRST?? <>>
+               <SET PTR <+ .PTR ,P-LEXELEN>>>> 
+
+<ROUTINE VERB-DIR-ONLY? (WRD)
+       <AND <NOT <WT? .WRD ,PS?OBJECT>>
+            <NOT <WT? .WRD ,PS?ADJECTIVE>>
+            <OR <WT? .WRD ,PS?DIRECTION>
+                <WT? .WRD ,PS?VERB>>>>
+
+<ROUTINE NUMBER? (PTR "AUX" CNT BPTR CHR (SUM 0) (TIM <>) TMP)
+        <SET TMP <REST ,P-LEXV <* .PTR 2>>>
+        <SET CNT  <GETB .TMP 2>>
+        <SET BPTR <GETB .TMP 3>>
+        <REPEAT ()
+                <COND (<L? <SET CNT <- .CNT 1>> 0> <RETURN>)
+                      (T
+                       <SET CHR <GETB ,P-INBUF .BPTR>>
+                       <COND (<==? .CHR %<ASCII !\:>>
+                              <SET TIM .SUM>
+                              <SET SUM 0>)
+                             (<G? .SUM 29999> <RFALSE>)
+                             (<OR <G? .CHR %<ASCII !\9>>
+                                  <L? .CHR %<ASCII !\0>>>
+                              <RFALSE>)
+                             (T
+                              <SET SUM <+ <* .SUM 10>
+                                          <- .CHR %<ASCII !\0>>>>)>
+                       <SET BPTR <+ .BPTR 1>>)>>
+        <CHANGE-LEXV .PTR ,W?INT.NUM ;NUMBER>
+        <COND (<G? .SUM 9999> <RFALSE>)
+              (.TIM
+               <COND (<G? .TIM 23> <RFALSE>)>
+               <SET SUM <+ .SUM <* .TIM 60>>>)>
+        <SETG P-TIME .TIM>
+        <SETG P-NUMBER .SUM>
+        ,W?INT.NUM>
+
+<GLOBAL P-NUMBER:NUMBER -1>
+<GLOBAL P-TIME:FLAG <>>
+<GLOBAL P-DIRECTION 0>
+\f
+<ROUTINE ORPHAN-MERGE ("AUX" (CNT -1) TEMP VERB BEG END (ADJ <>) WRD) 
+   <SETG P-OFLAG <>>
+   <COND (<OR <EQUAL? <WT? <SET WRD <GET <GET ,P-ITBL ,P-VERBN> 0>>
+                          ,PS?VERB ,P1?VERB>
+                     <GET ,P-OTBL ,P-VERB>>
+             <WT? .WRD ,PS?ADJECTIVE>>
+         <SET ADJ T>)
+        (<AND <WT? .WRD ,PS?OBJECT ,P1?OBJECT>
+              <EQUAL? ,P-NCN 0>>
+         <PUT ,P-ITBL ,P-VERB 0>
+         <PUT ,P-ITBL ,P-VERBN 0>
+         <PUT ,P-ITBL ,P-NC1 <REST ,P-LEXV 2>>
+         <PUT ,P-ITBL ,P-NC1L <REST ,P-LEXV 6>>
+         <SETG P-NCN 1>)>
+   <COND (<AND <NOT <ZERO? <SET VERB <GET ,P-ITBL ,P-VERB>>>>
+              <NOT .ADJ>
+              <NOT <EQUAL? .VERB <GET ,P-OTBL ,P-VERB>>>>
+         <RFALSE>)
+        (<EQUAL? ,P-NCN 2> <RFALSE>)
+        (<EQUAL? <GET ,P-OTBL ,P-NC1> 1>
+         <COND (<OR <ZERO? <SET TEMP <GET ,P-ITBL ,P-PREP1>>>
+                    <EQUAL? .TEMP <GET ,P-OTBL ,P-PREP1>>>
+                <COND (.ADJ
+                       <PUT ,P-OTBL ,P-NC1 <REST ,P-LEXV 2>>
+                       <COND (<ZERO? <GET ,P-ITBL ,P-NC1L>>
+                              <PUT ,P-ITBL ,P-NC1L <REST ,P-LEXV 6>>)>
+                       <COND (<ZERO? ,P-NCN> <SETG P-NCN 1>)>)
+                      (T
+                       <PUT ,P-OTBL ,P-NC1 <GET ,P-ITBL ,P-NC1>>
+                       ;<PUT ,P-OTBL ,P-NC1L <GET ,P-ITBL ,P-NC1L>>)>
+                <PUT ,P-OTBL ,P-NC1L <GET ,P-ITBL ,P-NC1L>>)
+               (T <RFALSE>)>)
+        (<EQUAL? <GET ,P-OTBL ,P-NC2> 1>
+         <COND (<OR <ZERO? <SET TEMP <GET ,P-ITBL ,P-PREP1>>>
+                    <EQUAL? .TEMP <GET ,P-OTBL ,P-PREP2>>>
+                <COND (.ADJ
+                       <PUT ,P-ITBL ,P-NC1 <REST ,P-LEXV 2>>
+                       <COND (<ZERO? <GET ,P-ITBL ,P-NC1L>>
+                              <PUT ,P-ITBL ,P-NC1L <REST ,P-LEXV 6>>)>)>
+                <PUT ,P-OTBL ,P-NC2 <GET ,P-ITBL ,P-NC1>>
+                <PUT ,P-OTBL ,P-NC2L <GET ,P-ITBL ,P-NC1L>>
+                <SETG P-NCN 2>)
+               (T <RFALSE>)>)
+        (,P-ACLAUSE
+         <COND (<AND <NOT <EQUAL? ,P-NCN 1>> <NOT .ADJ>>
+                <SETG P-ACLAUSE <>>
+                <RFALSE>)
+               (T
+                <SET BEG <GET ,P-ITBL ,P-NC1>>
+                <COND (.ADJ <SET BEG <REST ,P-LEXV 2>> <SET ADJ <>>)>
+                <SET END <GET ,P-ITBL ,P-NC1L>>
+                <REPEAT ()
+                        <SET WRD <GET .BEG 0>>
+                        <COND (<EQUAL? .BEG .END>
+                               <COND (.ADJ <CLAUSE-WIN .ADJ> <RETURN>)
+                                     (T <SETG P-ACLAUSE <>> <RFALSE>)>)
+                              (<OR <EQUAL? .WRD ,W?ALL ;,W?EVERYT ,W?ONE> 
+                                   <AND <BTST <GETB .WRD ,P-PSOFF>
+                                              ,PS?ADJECTIVE> ;"same as WT?"
+                                        <ADJ-CHECK .WRD .ADJ .ADJ>>>
+                               <SET ADJ .WRD>)
+                              (<EQUAL? .WRD ,W?ONE>
+                               <CLAUSE-WIN .ADJ>
+                               <RETURN>)
+                              (<AND <BTST <GETB .WRD ,P-PSOFF> ,PS?OBJECT>
+                                    <EQUAL? <+ .BEG ,P-WORDLEN> .END>>
+                               <COND (<EQUAL? .WRD ,P-ANAM>
+                                      <CLAUSE-WIN .ADJ>)
+                                     (T
+                                      <CLAUSE-WIN>)>
+                               <RETURN>)>
+                        <SET BEG <REST .BEG ,P-WORDLEN>>
+                        <COND (<EQUAL? .END 0>
+                               <SET END .BEG>
+                               <SETG P-NCN 1>
+                               <PUT ,P-ITBL ,P-NC1 <BACK .BEG 4>>
+                               <PUT ,P-ITBL ,P-NC1L .BEG>)>>)>)>
+   <PUT ,P-VTBL 0 <GET ,P-OVTBL 0>>
+   <PUTB ,P-VTBL 2 <GETB ,P-OVTBL 2>>
+   <PUTB ,P-VTBL 3 <GETB ,P-OVTBL 3>>
+   <PUT ,P-OTBL ,P-VERBN ,P-VTBL>
+   <PUTB ,P-VTBL 2 0>
+   ;<AND <NOT <EQUAL? <GET ,P-OTBL ,P-NC2> 0>> <SETG P-NCN 2>>
+   <REPEAT ()
+          <COND (<G? <SET CNT <+ .CNT 1>> ,P-ITBLLEN>
+                 <SETG P-MERGED T>
+                 <RTRUE>)
+                (T <PUT ,P-ITBL .CNT <GET ,P-OTBL .CNT>>)>>
+   T>
+
+<ROUTINE CLAUSE-WIN ("OPT" (ADJ <>)) 
+       <COND (.ADJ
+              <PUT ,P-ITBL ,P-VERB <GET ,P-OTBL ,P-VERB>>)
+             (ELSE <SET ADJ T>)>
+       <PUT ,P-CCTBL ,CC-SBPTR ,P-ACLAUSE>
+       <PUT ,P-CCTBL ,CC-SEPTR <+ ,P-ACLAUSE 1>>
+       <COND (<EQUAL? ,P-ACLAUSE ,P-NC1>
+              <PUT ,P-CCTBL ,CC-OCLAUSE ,P-OCL1>)
+             (ELSE
+              <PUT ,P-CCTBL ,CC-OCLAUSE ,P-OCL2>)>
+       <CLAUSE-COPY ,P-OTBL ,P-OTBL .ADJ>
+       <AND <NOT <EQUAL? <GET ,P-OTBL ,P-NC2> 0>> <SETG P-NCN 2>>
+       <SETG P-ACLAUSE <>>
+       <RTRUE>>
+\f
+"Print undefined word in input. PTR points to the unknown word in P-LEXV:"   
+
+<ROUTINE WORD-PRINT (CNT BUF "OPTIONAL" (TBL 0))
+        ;<COND (<G? .CNT 6> <SET CNT 6>)>
+        <COND (<ZERO? .TBL> <SET TBL ,P-INBUF>)>
+        <REPEAT ()
+                <COND (<DLESS? CNT 0> <RETURN>)
+                      (ELSE
+                       <PRINTC <GETB .TBL .BUF>>
+                       <SET BUF <+ .BUF 1>>)>>>
+
+<ROUTINE UNKNOWN-WORD (PTR ;"OPT" ;(APOST 0) "AUX" BUF)
+       <PUT ,OOPS-TABLE ,O-PTR .PTR ;<- .PTR .APOST>>
+       <COND (<T? ,P-OFLAG>
+              <PUT ,OOPS-TABLE ,O-END 0>)>
+       <COND (T ;<EQUAL? ,WINNER ,PLAYER>
+              <TELL !\[>)
+             ;(T <TELL "\"I'm sorry, but ">)>
+       <TELL "I don't know the word ">
+       <COND (T ;<EQUAL? ,WINNER ,PLAYER>
+              <TELL !\">)
+             ;(T <TELL !\'>)>
+       <SET BUF <* 2 .PTR ;<- .PTR .APOST>>>
+       <WORD-PRINT <GETB <REST ,P-LEXV .BUF> 2>
+                   <GETB <REST ,P-LEXV .BUF> 3>>
+       ;<COND (<T? .APOST>
+              <TELL !\'>
+              <SET BUF <* 2 <+ .PTR ,P-LEXELEN>>>
+              <WORD-PRINT <GETB <REST ,P-LEXV .BUF> 2>
+                          <GETB <REST ,P-LEXV .BUF> 3>>)>
+       <SETG QUOTE-FLAG <>>
+       <SETG P-OFLAG <>>
+       <COND (T ;<EQUAL? ,WINNER ,PLAYER>
+              <TELL ".\"]" CR>)
+             ;(T <TELL ".'\"" CR>)>>
+
+<ROUTINE CANT-USE (PTR "AUX" BUF) 
+       ;#DECL ((PTR BUF) FIX)
+       <SETG QUOTE-FLAG <>>
+       <SETG P-OFLAG <>>
+       <COND (T ;<EQUAL? ,WINNER ,PLAYER>
+              <TELL "[Sorry, but I don't understand the word \"">
+              <WORD-PRINT <GETB <REST ,P-LEXV <SET BUF <* .PTR 2>>> 2>
+                          <GETB <REST ,P-LEXV .BUF> 3>>
+              <TELL "\" when you use it that way.]" CR>)
+             ;(T <TELL "\"Please, to me simple English speak.\"" CR>)>>
+
+" Perform syntax matching operations, using P-ITBL as the source of
+   the verb and adjectives for this input.  Returns false if no
+   syntax matches, and does it's own orphaning.  If return is true,
+   the syntax is saved in P-SYNTAX."   
+
+<GLOBAL P-SLOCBITS 0>    
+
+<CONSTANT P-SYNLEN 8>    
+
+<CONSTANT P-SBITS 0> 
+<CONSTANT P-SPREP1 1>
+<CONSTANT P-SPREP2 2>
+<CONSTANT P-SFWIM1 3>
+<CONSTANT P-SFWIM2 4>
+<CONSTANT P-SLOC1 5>
+<CONSTANT P-SLOC2 6>
+<CONSTANT P-SACTION 7>   
+
+<CONSTANT P-SONUMS 3>    
+\f
+<ROUTINE SYNTAX-CHECK ("AUX" SYN LEN NUM OBJ (DRIVE1 <>) (DRIVE2 <>)
+                            PREP VERB)
+       <COND (<0? <SET VERB <GET ,P-ITBL ,P-VERB>>>
+              <MISSING "verb">
+              <RFALSE>)>
+       <SET SYN <GET ,VERBS <- 255 .VERB>>>
+       <SET LEN <GETB .SYN 0>>
+       <SET SYN <REST .SYN>>
+       <REPEAT ()
+               <SET NUM <BAND <GETB .SYN ,P-SBITS> ,P-SONUMS>>
+               <COND (<G? ,P-NCN .NUM> T) ;"Added 4/27/83"
+                     (<AND <NOT <L? .NUM 1>>
+                           <0? ,P-NCN>
+                           <OR <0? <SET PREP <GET ,P-ITBL ,P-PREP1>>>
+                               <==? .PREP <GETB .SYN ,P-SPREP1>>>>
+                      <SET DRIVE1 .SYN>)
+                     (<==? <GETB .SYN ,P-SPREP1> <GET ,P-ITBL ,P-PREP1>>
+                      <COND (<AND <==? .NUM 2> <==? ,P-NCN 1>>
+                             <SET DRIVE2 .SYN>)
+                            (<==? <GETB .SYN ,P-SPREP2>
+                                  <GET ,P-ITBL ,P-PREP2>>
+                             <SYNTAX-FOUND .SYN>
+                             <RTRUE>)>)>
+               <COND (<DLESS? LEN 1>
+                      <COND (<OR <T? .DRIVE1> <T? .DRIVE2>>
+                             <RETURN>)
+                            (T
+                             <DONT-UNDERSTAND>
+                             <RFALSE>)>)
+                     (T <SET SYN <REST .SYN ,P-SYNLEN>>)>>
+       <COND (<AND .DRIVE1
+                   <SET OBJ
+                        <GWIM <GETB .DRIVE1 ,P-SFWIM1>
+                              <GETB .DRIVE1 ,P-SLOC1>
+                              <GETB .DRIVE1 ,P-SPREP1>>>>
+              <PUT/B ,P-PRSO ,P-MATCHLEN 1>
+              <PUT/B ,P-PRSO 1 .OBJ>
+              <SYNTAX-FOUND .DRIVE1>)
+             (<AND .DRIVE2
+                   <SET OBJ
+                        <GWIM <GETB .DRIVE2 ,P-SFWIM2>
+                              <GETB .DRIVE2 ,P-SLOC2>
+                              <GETB .DRIVE2 ,P-SPREP2>>>>
+              <PUT/B ,P-PRSI ,P-MATCHLEN 1>
+              <PUT/B ,P-PRSI 1 .OBJ>
+              <SYNTAX-FOUND .DRIVE2>)
+             ;(<EQUAL? .VERB ,ACT?FIND ;,ACT?NAME>
+              <TELL "[Sorry, but I can't answer that question.]" CR>
+              <RFALSE>)
+             (T
+              <SET OBJ <>>
+              <COND (<AND <EQUAL? ,WINNER ,PLAYER>
+                          <NOT <EQUAL? ,P-PRSA-WORD;"can't orphan DRIVE/SOUTH"
+                                       ,W?DRIVE ,W?PROCEED ,W?STEER>>>
+                     <ORPHAN .DRIVE1 .DRIVE2>
+                     <SET OBJ T>
+                     <TELL "[Wh">)
+                    (T
+                     <TELL
+"[Your command was not complete. Next time, type wh">)>
+              <COND (<EQUAL? .VERB ,ACT?HEAD ;WALK>
+                     <TELL "ere">)
+                    (<OR <AND .DRIVE1
+                              <==? <GETB .DRIVE1 ,P-SFWIM1> ,PERSONBIT>>
+                         <AND .DRIVE2
+                              <==? <GETB .DRIVE2 ,P-SFWIM2> ,PERSONBIT>>>
+                     <TELL "om">)
+                    (T <TELL "at">)>
+              <COND (<T? .OBJ> ;<EQUAL? ,WINNER ,PLAYER>
+                     <TELL " do you want to ">)
+                    (T
+                     <TELL " you want" HIM ,WINNER " to ">)>
+              <VERB-PRINT>
+              ;<PREP-PRINT <COND (.DRIVE1 <GETB .DRIVE1 ,P-SPREP1 ;2>)
+                                (T <GETB .DRIVE2 ,P-SPREP1>)>> ;"not in X1"
+              <COND (.DRIVE2
+                     <SET PREP ,P-MERGED>
+                     <SETG P-MERGED <>>
+                     <SETG P-OFLAG <>>
+                     <CLAUSE-PRINT ,P-NC1 ,P-NC1L>
+                     <SETG P-MERGED .PREP>)>
+              <SETG P-END-ON-PREP <>>
+              <PREP-PRINT <COND (.DRIVE1 <GETB .DRIVE1 ,P-SPREP1 ;2>)
+                                (T <GETB .DRIVE2 ,P-SPREP2>)>>
+              <COND (<T? .OBJ> ;<EQUAL? ,WINNER ,PLAYER>
+                     <SETG P-OFLAG T>
+                     <TELL "?]" CR>)
+                    (T
+                     ;<SETG P-OFLAG <>>
+                     <TELL ".]" CR>)>
+              <RFALSE>)>>
+
+;<GLOBAL CANT-UNDERSTAND "[Sorry, but I don't understand that sentence.]"
+                       ;"[I couldn't understand that sentence.]">
+<ROUTINE DONT-UNDERSTAND ()
+       <SETG CLOCK-WAIT T>
+       <TELL
+"[Sorry, but I don't understand. Please say that another way, or try
+something else.]" CR>>
+
+<ROUTINE VERB-PRINT ("OPTIONAL" (GERUND <>) "AUX" TMP)
+       <SET TMP <GET ,P-ITBL ,P-VERBN>>        ;"? ,P-OTBL?"
+       <COND (<==? .TMP 0>
+              <COND (<ZERO? .GERUND> <TELL "tell"> <RTRUE>)
+                    (T <TELL "walk">)>)
+             (<OR <T? .GERUND> <0? <GETB ,P-VTBL 2>>>
+              <SET TMP <GET .TMP 0>>
+              <COND (<==? .TMP ,W?L> <PRINTB ,W?LOOK>)
+                    (<==? .TMP ,W?X> <PRINTB ,W?EXAMINE>)
+                    (<==? .TMP ,W?Z> <PRINTB ,W?WAIT>)
+                    (<T? .GERUND>
+                     <COND (<==? .TMP ,W?BATHE> <PRINTB ,W?BATH>)
+                           (<==? .TMP ,W?DIG> <PRINTI "digg">)
+                           (<==? .TMP ,W?GET> <PRINTI "gett">)
+                           (T <PRINTB .TMP>)>)
+                    (T <PRINTB .TMP>)>)
+             (T
+              <WORD-PRINT <GETB .TMP 2> <GETB .TMP 3>>
+              <PUTB ,P-VTBL 2 0>)>
+       <COND (<T? .GERUND> <TELL "ing?">)>>
+\f
+<ROUTINE ORPHAN (D1 D2 "AUX" (CNT -1))
+       <COND (<NOT ,P-MERGED>
+              <PUT ,P-OCL1 ,P-MATCHLEN 0>
+              <PUT ,P-OCL2 ,P-MATCHLEN 0>)>
+       <PUT ,P-OVTBL 0 <GET ,P-VTBL 0>>
+       <PUTB ,P-OVTBL 2 <GETB ,P-VTBL 2>>
+       <PUTB ,P-OVTBL 3 <GETB ,P-VTBL 3>>
+       <REPEAT ()
+               <COND (<IGRTR? CNT ,P-ITBLLEN> <RETURN>)
+                     (T <PUT ,P-OTBL .CNT <GET ,P-ITBL .CNT>>)>>
+       <COND (<EQUAL? ,P-NCN 2>
+              <PUT ,P-CCTBL ,CC-SBPTR ,P-NC2>
+              <PUT ,P-CCTBL ,CC-SEPTR ,P-NC2L>
+              <PUT ,P-CCTBL ,CC-OCLAUSE ,P-OCL2>
+              <CLAUSE-COPY ,P-ITBL ,P-OTBL>)>
+       <COND (<NOT <L? ,P-NCN 1>>
+              <PUT ,P-CCTBL ,CC-SBPTR ,P-NC1>
+              <PUT ,P-CCTBL ,CC-SEPTR ,P-NC1L>
+              <PUT ,P-CCTBL ,CC-OCLAUSE ,P-OCL1>
+              <CLAUSE-COPY ,P-ITBL ,P-OTBL>)>
+       <COND (.D1
+              <PUT ,P-OTBL ,P-PREP1 <GETB .D1 ,P-SPREP1>>
+              <PUT ,P-OTBL ,P-NC1 1>)
+             (.D2
+              <PUT ,P-OTBL ,P-PREP2 <GETB .D2 ,P-SPREP2>>
+              <PUT ,P-OTBL ,P-NC2 1>)>>
+
+<ROUTINE CLAUSE-PRINT (BPTR EPTR "OPTIONAL" (THE? T)) 
+       <BUFFER-PRINT <GET ,P-ITBL .BPTR> <GET ,P-ITBL .EPTR> .THE?>>    
+
+<ROUTINE BUFFER-PRINT (BEG END CP "AUX" (NOSP <>) WRD NW (FIRST?? T) (PN <>))
+ <REPEAT ()
+        <COND (<==? .BEG .END> <RETURN>)>
+        <COND (<OR <T? .NOSP>
+                   <EQUAL? .WRD ,W?APOSTROPHE>
+                   <EQUAL? .NW ,W?PERIOD ,W?COMMA ,W?APOSTROPHE>>
+               <SET NOSP <>>)
+              (T <TELL !\ >)>
+        <SET WRD <GET .BEG 0>>
+        ;<SET NW <GET .BEG ,P-LEXELEN>>
+        <COND (<==? .END <REST .BEG ,P-WORDLEN>>
+               <SET NW 0>)
+              (T <SET NW <GET .BEG ,P-LEXELEN>>)>
+        <COND (<AND <NOT <==? .WRD ,W?MY>>
+                    <ZMEMQ .WRD ,CHAR-POSS-TABLE>>
+               <SET NOSP T>)
+              (<AND <NOT <==? .NW ,W?MY>>
+                    <ZMEMQ .NW ,CHAR-POSS-TABLE>>
+               <SET NOSP T>)
+              (<AND <T? ,OOPS-PRINT>
+                    <OR <AND <EQUAL? .WRD ,W?HIM>
+                             <NOT <VISIBLE? ,P-HIM-OBJECT>>>
+                        <AND <EQUAL? .WRD ,W?HER>
+                             <NOT <VISIBLE? ,P-HER-OBJECT>>>
+                        ;<AND <EQUAL? .WRD ,W?THEM>
+                             <NOT <VISIBLE? ,P-THEM-OBJECT>>>>>
+               <SET PN T>)>
+        <COND ;(<EQUAL? .WRD ,W?PERIOD ,W?\! ,W??>
+               <SET NOSP T>)
+              (<EQUAL? .WRD ,W?MY>
+               <COND (<ZERO? ,OOPS-PRINT>
+                      <PRINTB ,W?YOUR>)
+                     (T <PRINTB ,W?MY>)>
+               ;<SET NOSP T>)
+              (<ZMEMQ .WRD ,CHAR-POSS-TABLE>
+               <TELL !\'>)
+              (<AND <ZERO? ,OOPS-PRINT>
+                    <NOT <EQUAL? .WRD ,W?ALL ,W?PERIOD ,W?APOSTROPHE>>
+                    <OR <WT? .WRD ,PS?BUZZ-WORD>
+                        <WT? .WRD ,PS?PREPOSITION>>
+                    <NOT <WT? .WRD ,PS?ADJECTIVE>>
+                    <NOT <WT? .WRD ,PS?OBJECT>>>
+               <SET NOSP T>)
+              (<AND <EQUAL? .WRD ,W?ME>
+                    <ZERO? ,OOPS-PRINT>>
+               <PRINTD ,PLAYER>
+               <SET PN T>)
+              (<CAPITAL-NOUN? .WRD>
+               <CAPITALIZE .BEG>
+               <SET PN T>)
+              (T
+               <COND (<AND .FIRST?? <NOT .PN> .CP>
+                      <COND (<NOT <EQUAL? .WRD ,W?HER ,W?HIM ,W?YOUR;,W?THEM>>
+                             <TELL "the ">)>)>
+               <COND (<OR <T? ,P-OFLAG> <T? ,P-MERGED>>
+                      <PRINTB .WRD>)
+                     (<AND <==? .WRD ,W?IT>
+                           <VISIBLE? ,P-IT-OBJECT>>
+                      <PRINTD ,P-IT-OBJECT>)
+                     (<AND <EQUAL? .WRD ,W?HER>
+                           <NOT .PN>   ;"VISIBLE check above"
+                           ;<VISIBLE? ,P-HER-OBJECT>>
+                      <PRINTD ,P-HER-OBJECT>)
+                     ;(<AND <EQUAL? .WRD ,W?THEM>
+                            <NOT .PN>
+                            ;<VISIBLE? ,P-THEM-OBJECT>>
+                       <PRINTD ,P-THEM-OBJECT>)
+                     (<AND <EQUAL? .WRD ,W?HIM>
+                           <NOT .PN>
+                           ;<VISIBLE? ,P-HIM-OBJECT>>
+                      <PRINTD ,P-HIM-OBJECT>)
+                     (T
+                      <WORD-PRINT <GETB .BEG 2> <GETB .BEG 3>>)>
+               <SET FIRST?? <>>)>
+        <SET BEG <REST .BEG ,P-WORDLEN>>>>
+
+<ROUTINE TITLE-NOUN? (WRD)
+    <OR <EQUAL? .WRD ,W?MR ,W?MRS ,W?MS>
+       <EQUAL? .WRD ,W?MISTER ,W?MISS ,W?SIR>
+       <EQUAL? .WRD ,W?LADY ,W?DAME ,W?LORD>
+       <EQUAL? .WRD ,W?DR ,W?DOCTOR ,W?DETECT>
+       <EQUAL? .WRD ,W?MADAME ,W?MADAM ,W?MASTER>
+       ;<EQUAL? .WRD ,W?LT>>>
+
+<ROUTINE CAPITAL-NOUN? (WRD)
+    <OR <TITLE-NOUN? .WRD>
+       <EQUAL? .WRD ,W?BOLITHO ,W?DEE>
+       <EQUAL? .WRD ,W?DEIRDRE ,W?FORDYCE ,W?HALLAM>
+       <EQUAL? .WRD ,W?HYDE ,W?IAN ,W?INDIAN>
+       <EQUAL? .WRD ,W?IRIS ,W?JACK ,W?LIONEL>
+       <EQUAL? .WRD ,W?LYND ,W?MONTAGUE ,W?MOONMIST>
+       <EQUAL? .WRD ,W?NICHOLAS ,W?PENTREATH ,W?TAMARA>
+       <EQUAL? .WRD ,W?TAMMY ,W?TRESYLLIAN ,W?VIV>
+       <EQUAL? .WRD ,W?VIVIEN ,W?WENDISH>
+       ;<EQUAL? .WRD ,W?AMAZON ,W?DINGAAN ,W?EGYPTIAN ,W?LONDON ,W?MAYFAIR ,W?PORSCHE ,W?ZULU>>>
+
+<ROUTINE CAPITALIZE (PTR)
+        <COND (<OR <T? ,P-OFLAG> <T? ,P-MERGED>>
+               <PRINTB <GET .PTR 0>>)
+              (T
+               <PRINTC <- <GETB ,P-INBUF <GETB .PTR 3>> 32>>
+               <WORD-PRINT <- <GETB .PTR 2> 1> <+ <GETB .PTR 3> 1>>)>>
+
+<ROUTINE PREP-PRINT (PREP "OPTIONAL" (SP? T) "AUX" WRD VRB)
+       <COND (<0? .PREP>
+              <RFALSE>)>
+       <SET VRB <GET <GET ,P-ITBL ,P-VERBN> 0>>
+       <COND (<AND <T? ,P-END-ON-PREP>
+                   <OR <NOT <EQUAL? .VRB ,W?LIE ,W?SIT>>
+                       <NOT <==? .PREP ,PR?DOWN>>>>
+              <RFALSE>)
+             (T
+              <COND (.SP? <TELL !\ >)>
+              <SET WRD <PREP-FIND .PREP>>
+              <COND (<==? .WRD ,W?AGAINST> <TELL "against">)
+                    (<==? .WRD ,W?THROUGH> <TELL "through">)
+                    (T <PRINTB .WRD>)>
+              <COND (<AND <EQUAL? .VRB ,W?SIT ,W?LIE>
+                          <EQUAL? .WRD ,W?DOWN>>
+                     <TELL " on">)>
+              <COND (<AND <EQUAL? .VRB ,W?GET>
+                          <EQUAL? .WRD ,W?OUT>>
+                     <TELL " of">)>
+              <RTRUE>)>>    
+
+"pointers used by CLAUSE-COPY (source/destination beginning/end pointers):"
+<CONSTANT CC-SBPTR 0>
+<CONSTANT CC-SEPTR 1>
+<CONSTANT CC-OCLAUSE 2>
+
+<GLOBAL P-CCTBL <TABLE 0 0 0 0 0>>
+
+<ROUTINE CLAUSE-COPY (SRC DEST "OPT" (INSRT <>)
+                     "AUX" OCL BEG END BB EE OBEG CNT B E)
+       <SET BB <GET ,P-CCTBL ,CC-SBPTR>>
+       <SET EE <GET ,P-CCTBL ,CC-SEPTR>>
+       <SET OCL <GET ,P-CCTBL ,CC-OCLAUSE>>
+       <SET BEG <GET .SRC .BB>>
+       <SET END <GET .SRC .EE>>
+       <SET OBEG <GET .OCL ,P-MATCHLEN>>
+       <REPEAT ()
+               <COND (<EQUAL? .BEG .END> <RETURN>)>
+               <COND (<AND .INSRT
+                           <EQUAL? ,P-ANAM <GET .BEG 0>>>
+                      <COND (<EQUAL? .INSRT T>
+                             <SET B <GET ,P-ITBL ,P-NC1>>
+                             <SET E <GET ,P-ITBL ,P-NC1L>>
+                             <REPEAT ()
+                                     <COND (<EQUAL? .B .E> <RETURN>)>
+                                     <CLAUSE-ADD <GET .B 0>>
+                                     <SET B <REST .B ,P-WORDLEN>>>)
+                            (ELSE
+                             <COND (<NOT <EQUAL? .INSRT <GET .OCL 1>>>
+                                    <CLAUSE-ADD .INSRT>)>
+                             <CLAUSE-ADD ,P-ANAM>)>)
+                     (ELSE
+                      <CLAUSE-ADD <GET .BEG 0>>)>
+               <SET BEG <REST .BEG ,P-WORDLEN>>>
+       <COND (<AND <EQUAL? .SRC .DEST>
+                   <G? .OBEG 0>
+                   <L? 0 <SET CNT <- <GET .OCL ,P-MATCHLEN> .OBEG>>>>
+              <PUT .OCL ,P-MATCHLEN 0>
+              <SET OBEG <+ .OBEG 1>>
+              <REPEAT ()
+                      <CLAUSE-ADD <GET .OCL .OBEG> T>
+                      <COND (<ZERO? <SET CNT <- .CNT 2>>>
+                             <RETURN>)>
+                      <SET OBEG <+ .OBEG 2>>>
+              <SET OBEG 0>)>
+       <PUT .DEST
+            .BB
+            <REST .OCL <+ <* .OBEG ,P-LEXELEN> 2>>>
+       <PUT .DEST
+            .EE
+            <REST .OCL
+                  <+ <* <GET .OCL ,P-MATCHLEN> ,P-LEXELEN> 2>>>>
+
+<ROUTINE CLAUSE-ADD (WRD "OPT" (CHECK? <>) "AUX" OCL PTR)
+       <SET OCL <GET ,P-CCTBL ,CC-OCLAUSE>>
+       <SET PTR <GET .OCL ,P-MATCHLEN>>
+       <COND (<AND .CHECK? <NOT <ZERO? .PTR>> <ZMEMQ .WRD .OCL>>
+              <RFALSE>)
+             (ELSE
+              <SET PTR <+ .PTR 2>>
+              <PUT .OCL <- .PTR 1> .WRD>
+              <PUT .OCL .PTR 0>
+              <PUT .OCL ,P-MATCHLEN .PTR>)>>   
+<ROUTINE PREP-FIND (PREP "AUX" (CNT 0) SIZE) 
+       ;#DECL ((PREP CNT SIZE) FIX)
+       <SET SIZE <* <GET ,PREPOSITIONS 0> 2>>
+       <REPEAT ()
+               <COND (<IGRTR? CNT .SIZE> <RFALSE>)
+                     (<==? <GET ,PREPOSITIONS .CNT> .PREP>
+                      <RETURN <GET ,PREPOSITIONS <- .CNT 1>>>)>>>  
+<ROUTINE SYNTAX-FOUND (SYN) 
+       ;#DECL ((SYN) <PRIMTYPE VECTOR>)
+       <SETG P-SYNTAX .SYN>
+       <SETG PRSA <GETB .SYN ,P-SACTION>>>   
+<GLOBAL P-GWIMBIT 0>
+<ROUTINE GWIM (GBIT LBIT PREP "AUX" OBJ ;WPREP)
+       ;#DECL ((GBIT LBIT) FIX (OBJ) OBJECT)
+       <COND (<==? .GBIT ,RMUNGBIT>
+              <RETURN ,ROOMS>)>
+       <SETG P-GWIMBIT .GBIT>
+       <SETG P-SLOCBITS .LBIT>
+       <PUT/B ,P-MERGE ,P-MATCHLEN 0>
+       <COND (<GET-OBJECT ,P-MERGE <>>
+              <SETG P-GWIMBIT 0>
+              <COND (<==? <GET/B ,P-MERGE ,P-MATCHLEN> 1>
+                     <SET OBJ <GET/B ,P-MERGE 1>>
+                     <TELL !\(>
+                     <COND (<PREP-PRINT .PREP <>>
+                            <THE? .OBJ>
+                            <TELL !\ >)>
+                     <TELL D .OBJ !\) CR>
+                     .OBJ)>)
+             (T <SETG P-GWIMBIT 0> <RFALSE>)>>   
+
+<GLOBAL P-PHR:NUMBER 0>                "Which noun phrase is being parsed?"
+<GLOBAL P-NAMW <TABLE 0 0>>    "noun for PRSO & PRSI"
+<GLOBAL P-ADJW <TABLE 0 0>>    "adjective for ditto"
+<GLOBAL P-OFW  <TABLE 0 0>>    "noun before OF for ditto"
+<VOC "FRONT" NOUN>             "to make P-OFW work"
+
+<ROUTINE SNARF-OBJECTS ("AUX" PTR)
+       <COND (<NOT <==? <SET PTR <GET ,P-ITBL ,P-NC1>> 0>>
+              <SETG P-PHR 0>
+              <SETG P-SLOCBITS <GETB ,P-SYNTAX ,P-SLOC1>>
+              <COND (<NOT <SNARFEM .PTR <GET ,P-ITBL ,P-NC1L> ,P-PRSO>>
+                     <RFALSE>)>
+              <COND (<T? <GET/B ,P-BUTS ,P-MATCHLEN>>
+                     <SETG P-PRSO <BUT-MERGE ,P-PRSO>>)>)>
+       <COND (<NOT <==? <SET PTR <GET ,P-ITBL ,P-NC2>> 0>>
+              <SETG P-PHR 1>
+              <SETG P-SLOCBITS <GETB ,P-SYNTAX ,P-SLOC2>>
+  &