Revision 14 (Original Source)
authorhistoricalsource <historicalsoftware@textfiles.com>
Sun, 14 Apr 2019 02:21:37 +0000 (22:21 -0400)
committerhistoricalsource <historicalsoftware@textfiles.com>
Sun, 14 Apr 2019 02:21:37 +0000 (22:21 -0400)
16 files changed:
README.md [new file with mode: 0644]
clock.zil [new file with mode: 0644]
debug.zil [new file with mode: 0644]
events.zil [new file with mode: 0644]
goal.zil [new file with mode: 0644]
m3.zil [new file with mode: 0644]
m3.zip [new file with mode: 0644]
macros.zil [new file with mode: 0644]
main.zil [new file with mode: 0644]
p.zil [new file with mode: 0644]
parser.zil [new file with mode: 0644]
people.zil [new file with mode: 0644]
places.zil [new file with mode: 0644]
syntax.zil [new file with mode: 0644]
things.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..0316c9a
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+# suspect
diff --git a/clock.zil b/clock.zil
new file mode 100644 (file)
index 0000000..8bcc79b
--- /dev/null
+++ b/clock.zil
@@ -0,0 +1,69 @@
+"CLOCK for M3
+Copyright (C) 1984 Infocom, Inc.  All rights reserved."
+
+<CONSTANT C-TABLELEN 300>
+
+<GLOBAL C-TABLE <ITABLE NONE %<COND (<GASSIGNED? PREDGEN> 150)
+                                   (ELSE 300)>>>
+
+<GLOBAL C-INTS 300>
+
+<CONSTANT C-INTLEN 6>
+
+<CONSTANT C-ENABLED? 0>
+
+<CONSTANT C-TICK 1>
+
+<CONSTANT C-RTN 2>
+
+<ROUTINE QUEUE (RTN TICK "AUX" CINT)
+        #DECL ((RTN) ATOM (TICK) FIX (CINT) <PRIMTYPE VECTOR>)
+        <PUT <SET CINT <INT .RTN>> ,C-TICK .TICK>
+        .CINT>
+
+<ROUTINE INT (RTN "AUX" E C INT)
+        #DECL ((RTN) ATOM (E C INT) <PRIMTYPE VECTOR>)
+        <SET E <REST ,C-TABLE ,C-TABLELEN>>
+        <SET C <REST ,C-TABLE ,C-INTS>>
+        <REPEAT ()
+                <COND (<==? .C .E>
+                       <SETG C-INTS <- ,C-INTS ,C-INTLEN>>
+                       <SET INT <REST ,C-TABLE ,C-INTS>>
+                       <PUT .INT ,C-RTN .RTN>
+                       <RETURN .INT>)
+                      (<EQUAL? <GET .C ,C-RTN> .RTN> <RETURN .C>)>
+                <SET C <REST .C ,C-INTLEN>>>>
+
+<GLOBAL CLOCK-WAIT <>>
+
+<ROUTINE CLOCKER ("AUX" C E TICK (FLG <>) VAL)
+        #DECL ((C E) <PRIMTYPE VECTOR> (TICK) FIX ;(FLG) ;<OR FALSE ATOM>)
+        <COND (,CLOCK-WAIT <SETG CLOCK-WAIT <>> <RFALSE>)>
+        <SETG PRESENT-TIME <+ ,PRESENT-TIME 1>>
+        <COND (<G? <SETG MOVES <+ ,MOVES 1>> 59>
+               <SETG MOVES 0>
+               <COND (<G? <SETG SCORE <+ ,SCORE 1>> 23>
+                      <SETG SCORE 0>)>)>
+        <SET C <REST ,C-TABLE ,C-INTS>>
+        <SET E <REST ,C-TABLE ,C-TABLELEN>>
+        <REPEAT ()
+                <COND (<==? .C .E>
+                       %<DEBUG-CODE
+                         <COND (,SHADOW <SETG PRSO ,SHADOW> <V-$TABLE>)>>
+                       <RETURN .FLG>)
+                      (<NOT <0? <GET .C ,C-ENABLED?>>>
+                       <SET TICK <GET .C ,C-TICK>>
+                       <COND (<0? .TICK>)
+                             (T
+                              <PUT .C ,C-TICK <- .TICK 1>>
+                              <COND (<AND <NOT <G? .TICK 1>>
+                                          <SET VAL
+                                               %<DEBUG-CODE
+                                                 <D-APPLY
+                                                  "Int" <GET .C ,C-RTN>>
+                                                 <APPLY
+                                                  <GET .C ,C-RTN>>>>>
+                                     <COND (<OR <NOT .FLG>
+                                                <==? .VAL ,M-FATAL>>
+                                            <SET FLG .VAL>)>)>)>)>
+                <SET C <REST .C ,C-INTLEN>>>>
diff --git a/debug.zil b/debug.zil
new file mode 100644 (file)
index 0000000..0299b50
--- /dev/null
+++ b/debug.zil
@@ -0,0 +1,188 @@
+<GLOBAL DEBUG <>>
+<GLOBAL HDEBUG <>>
+<GLOBAL GDEBUG <>>
+<GLOBAL EDEBUG <>>
+<GLOBAL SHADOW <>>
+<GLOBAL GOSSIP <>>
+<GLOBAL IDEBUG <>>
+
+<SYNTAX $DEBUG = V-$DEBUG>
+<SYNTAX $HANDLE = V-$HANDLE>
+<SYNTAX $NEXT = V-$NEXT>
+<SYNTAX $GOAL = V-$GOAL>
+<SYNTAX $TRS = V-$TANDY>
+<SYNTAX $WHERE = V-$WHERE>
+<SYNTAX $WHERE OBJECT = V-$WHERE>
+<SYNTAX $WHERE OBJECT OBJECT = V-$WHERE>
+<SYNTAX $TABLE OBJECT = V-$TABLE>
+<SYNTAX $FOLLOW OBJECT = V-$FOLLOW>
+<SYNTAX $ESTABLISH OBJECT = V-$ESTABLISH>
+<SYNTAX $SCORE = V-$SCORE>
+<SYNTAX $TOLD = V-$TOLD>
+<SYNTAX $IT = V-$IT>
+
+<ROUTINE V-$DEBUG ()
+        <COND (<SETG DEBUG <NOT ,DEBUG>>
+               <TELL "Find them bugs, boss!" CR>)
+              (T <TELL "No bugs left, eh?" CR>)>>
+
+<ROUTINE TELL-UNKNOWN (STR)
+        <TELL
+"Sorry, but the word \"" .STR "\" is not in the vocabulary that
+you can use." CR>>
+
+<ROUTINE V-$HANDLE ()
+        <COND (<NOT ,DEBUG>
+               <TELL-UNKNOWN "$ha">
+               <RTRUE>)>
+        <COND (<SETG HDEBUG <NOT ,HDEBUG>>
+               <TELL "Watch perform." CR>)
+              (T <TELL "No performance." CR>)>>
+
+<ROUTINE V-$GOAL ()
+        <COND (<NOT ,DEBUG>
+               <TELL-UNKNOWN "$go">
+               <RTRUE>)
+              (<SETG GDEBUG <NOT ,GDEBUG>>
+               <TELL "Showing goals." CR>)
+              (T <TELL "No more goals." CR>)>>
+
+<ROUTINE V-$TANDY ("AUX" X)
+       <COND (<NOT ,DEBUG>
+              <TELL-UNKNOWN "$ta">
+              <RTRUE>)>
+       <SET X <GETB 0 1>>
+       <COND (<==? <BAND .X 8> 0>
+              <PUTB 0 1 <BOR .X 8>>
+              <TELL "[on]" CR>)
+             (T
+              <PUTB 0 1 <BAND .X -9>>
+              <TELL "[off]" CR>)>>
+
+<ROUTINE V-$NEXT ("AUX" (CNT 0) O L NUM RM)
+        <COND (<NOT ,DEBUG>
+               <TELL-UNKNOWN "$ne">
+               <RTRUE>)>
+        <REPEAT ()
+                <COND (<G? <SET CNT <+ .CNT 1>> ,CHARACTER-MAX>
+                       <RETURN>)
+                      (<SET O <GET ,CHARACTER-TABLE .CNT>>
+                       <SET L <GET ,MOVEMENT-GOALS .CNT>>
+                       <REPEAT ()
+                               <COND (<0? <SET NUM <GET .L ,MG-TIME>>>
+                                      <RETURN>)
+                                     (<SET RM <GET .L 3>>
+                                      <TELL
+CD .O " will go in " N .NUM " minutes to " THE .RM "." CR>
+                                      <SET L <REST .L ,MG-LENGTH>>)>>)>>>
+
+<ROUTINE V-$WHERE ("AUX" (CNT 0) O L)
+        <COND (<NOT ,DEBUG>
+               <TELL-UNKNOWN "$wh">)
+              (,PRSI <MOVE ,PRSI ,PRSO>)
+              (,PRSO <GOTO ,PRSO>)
+              (T
+               <REPEAT ()
+                       <COND (<SET O <GET ,CHARACTER-TABLE .CNT>>
+                              <SET L <LOC .O>>
+                              <TELL CD .O " is ">
+                              <COND (.L
+                                     <TELL "in " THE .L "."CR>)
+                                    (T  <TELL "nowhere." CR>)>)>
+                       <COND (<G? <SET CNT <+ .CNT 1>> ,CHARACTER-MAX>
+                              <RETURN>)>>)>>
+
+<ROUTINE V-$TABLE ("AUX" CH TAB X)
+        <COND (<NOT ,DEBUG>
+               <TELL-UNKNOWN "$ta">)
+              (<AND ,PRSO <SET CH <GETP ,PRSO ,P?CHARACTER>>>
+               <SET TAB <GET ,GOAL-TABLES .CH>>
+               <TELL "[">
+               <COND (<SET X <LOC <GET ,CHARACTER-TABLE .CH>>>
+                      <TELL CD ,PRSO " in " D .X>
+                      <COND (<SET X <GET .TAB ,GOAL-F>>
+                             <COND (<NOT <EQUAL? .X <LOC ,PRSO>>>
+                                    <TELL " going to " D .X>)>)
+                            (ELSE <TELL ", no goal">)>
+                      <COND (<AND <GET .TAB ,GOAL-S>
+                                  <NOT <EQUAL? .X <GET .TAB ,GOAL-S>>>>
+                             <TELL ", via " D <GET .TAB ,GOAL-S>>)>
+                      <COND (<AND <SET X <GET .TAB ,GOAL-I>>
+                                  <SET X <GET ,TRANSFER-TABLE <+ .X 1>>>>
+                             <TELL ", changing at " D .X>)>
+                      <COND (<NOT <GET .TAB ,GOAL-ENABLE>>
+                             <TELL ", stopped">)>
+                      <COND (<SET X <GET .TAB ,GOAL-QUEUED>>
+                             <TELL ", queued " D .X>)>
+                      <COND (<NOT <GET .TAB ,GOAL-ENABLE>>
+                             <TELL ", attention ">
+                             <TELL N <GET .TAB ,ATTENTION-SPAN> ","
+                                   N <GET .TAB ,ATTENTION>>)>)
+                     (ELSE <TELL "Nowhere.">)>
+               <TELL "]" CR>)
+        (ELSE <TELL "Not a character?" CR>)>>
+
+<ROUTINE V-$FOLLOW ("AUX" MSG)
+        <COND (<NOT ,DEBUG>
+               <TELL-UNKNOWN "$fo">)
+              (T
+               <SETG SHADOW <CHARACTERIZE? ,PRSO>>
+               <COND (,SHADOW <TELL "[" CD ,SHADOW "]" CR>)
+                     (ELSE <TELL "[Nobody]" CR>)>)>>
+
+<ROUTINE V-$ESTABLISH ("AUX" MSG)
+        <COND (<NOT ,DEBUG>
+               <TELL-UNKNOWN "$es">)
+              (ELSE
+               <SETG EDEBUG <CHARACTERIZE? ,PRSO>>
+               <COND (,EDEBUG <TELL "[" CD ,EDEBUG "]" CR>)
+                     (ELSE <TELL "[Nobody]" CR>)>)>>
+
+<ROUTINE V-$SCORE ()
+        <COND (<NOT ,DEBUG>
+               <TELL-UNKNOWN "$sc">)
+              (T
+               <TELL "[Missing ">
+               <COND (<NOT ,DETECTIVE-SEEN-CORPSE?> <TELL "corpse, ">)>
+               <COND (<NOT ,DETECTIVE-SEEN-ROPE?> <TELL "rope, ">)>
+               <COND (<NOT ,DETECTIVE-SEEN-COAT?> <TELL "coat, ">)>
+               <COND (<NOT ,DETECTIVE-TOLD-ABOUT-RAIN?> <TELL "rain, ">)>
+               <COND (<NOT ,DETECTIVE-SEEN-GLASS?> <TELL "glass, ">)>
+               <COND (<NOT ,DETECTIVE-SEEN-HAIR?> <TELL "hair, ">)>
+               <COND (<NOT ,DETECTIVE-SEEN-CARD?> <TELL "card, ">)>
+               <COND (<NOT ,DETECTIVE-SEEN-AGREEMENT?> <TELL "p&s, ">)>
+               <COND (<NOT ,DETECTIVE-SEEN-TRUST-DOCUMENTS?> <TELL "trust, ">)>
+               <COND (<NOT ,DETECTIVE-SEEN-LIST?> <TELL "list, ">)>
+               <COND (<NOT ,GLASS-ANALYZED?> <TELL "glass(lab), ">)>
+               <COND (<NOT ,GLASS-ANALYZED-FOR-PRINTS?> <TELL "glass(prints), ">)
+                     (<FSET? ,GLASS ,TOUCHBIT>
+                      <TELL "touched glass, ">)>
+               <COND (<EQUAL? ,DETECTIVE-SEEN ,DETECTIVE-CONVINCED>
+                      <TELL "nothing, ">)>
+               <TELL "means " N ,DETECTIVE-SEEN "/" N ,DETECTIVE-CONVINCED " gotten.]" CR>)>>
+
+<ROUTINE V-$TOLD ("AUX" (CNT 0) O L)
+        <COND (<NOT ,DEBUG>
+               <TELL-UNKNOWN "$to">)
+              (,GOSSIP <SETG GOSSIP <>>)
+              (T
+               <SETG GOSSIP T>
+               <COND (,MURDER-PUBLIC?
+                      <TELL CD ,MURDER-PUBLIC? " called police." CR>)>
+               <REPEAT ()
+                       <COND (<SET O <GET ,CHARACTER-TABLE .CNT>>
+                              <TELL CD .O>
+                              <COND (<FSET? .O ,TOLD>
+                                     <TELL " knows." CR>)
+                                    (T
+                                     <TELL " doesn't know." CR>)>)>
+                       <COND (<G? <SET CNT <+ .CNT 1>> ,CHARACTER-MAX>
+                              <RETURN>)>>)>>
+
+<ROUTINE V-$IT ()
+        <COND (<NOT ,DEBUG>
+               <TELL-UNKNOWN "$it">
+               <RTRUE>)
+              (<SETG IDEBUG <NOT ,IDEBUG>>
+               <TELL "Showing it." CR>)
+              (T <TELL "No more it." CR>)>>
\ No newline at end of file
diff --git a/events.zil b/events.zil
new file mode 100644 (file)
index 0000000..597566f
--- /dev/null
@@ -0,0 +1,458 @@
+"EVENTS for M3
+Copyright (C) 1984 Infocom, Inc.  All rights reserved."
+
+"SCORE INDICATES HOURS / MOVES = MINUTES"
+
+<GLOBAL SCORE 21>
+<GLOBAL MOVES 0>
+
+<GLOBAL PRESENT-TIME 540>              ;"9 PM"
+
+<ROUTINE INTRO ()
+        <TELL
+
+"|
+It's Halloween night. " 'VERONICA " Ashcroft and her mania for Halloween parties
+are putting new twists on a 110-year-old tradition. It isn't a very nice
+night for a party. The rain has
+been pelting down since early morning, but the weather hasn't deterred
+many guests. The ballroom at Ashcroft Farm is filled with oddly costumed
+visitors. The rather ridiculous " 'COWBOY-COSTUME " you are wearing was the
+only thing you could find at the costumer's on such short notice, but
+it's out of place only for its relative sobriety and taste in this
+crowd.|
+" CR>>
+
+<ROUTINE QUEUE-MAIN-EVENTS ()
+        <ENABLE <QUEUE I-RAIN-SLOWS <- 550 ,PRESENT-TIME>>>
+        <ENABLE <QUEUE I-RAIN-POURS <- 570 ,PRESENT-TIME>>>
+        <ENABLE <QUEUE I-RAIN-STOPS <- 630 ,PRESENT-TIME>>>
+        <ENABLE <QUEUE I-PARTY-OVER <- 750 ,PRESENT-TIME>>>
+        <ENABLE <QUEUE I-MUSIC 9>>
+        <SETG BAND-PLAYING? "Breathless">
+        <ENABLE <QUEUE I-WAVE-2 1>>
+        <ENABLE <QUEUE I-SPILL 2>>
+        <ENABLE <QUEUE I-GAME-OVER 720>>
+        <NEW-SCRIPT ,BUTLER ,BUTLER-LOOP>>
+
+<ROUTINE I-WAVE ()
+        <CRLF>
+        <THIS-IS-S-HE ,MICHAEL>
+        <TELL
+
+"A sheik, whom you can recognize as " 'MICHAEL " Wellman, and a fairy queen,
+presumably " 'VERONICA " Ashcroft under her ornate mask, are discussing
+something with a small group of guests near the fireplace. The sheik
+notices you and waves for you to join them." CR>>
+
+<ROUTINE I-WAVE-2 ()
+        <COND (<NOT <EQUAL? ,HERE ,BALLROOM-8>>
+               <THIS-IS-S-HE ,MICHAEL>
+               <CRLF>
+               <TELL
+"The sheik, seeing your reluctance to join them, shrugs his shoulders and
+rejoins the conversation, a proprietary hand on the fairy's shoulder." CR>)>>
+
+<ROUTINE I-SPILL ()
+        <SETG SLAPSTICK? <>>
+        <ESTABLISH-GOAL ,VERONICA ,OFFICE>
+        <MOVE ,GLASS ,BALLROOM-8>
+        <COND (<EQUAL? ,HERE ,BALLROOM-8>
+               <THIS-IS-S-HE ,VERONICA>
+               <CRLF>
+               <TELL
+'VERONICA " is discussing an upcoming horse show. One of her horses, named
+\"Lurking Grue,\" will appear, and she describes its attributes in glowing
+detail, muffled only by the ornate mask covering her face and slurred by the
+effects of whatever liquid it is she has in a large glass. Emphasizing a
+point, she waves the glass on high, but it's affected her coordination as well
+as her speech. A bright red liquid punctuated with ice cubes pours out
+of the glass and all over her dress. As might be expected, the gown is
+white. She utters a word that silver-winged fairies aren't usually expected
+to know, and throws the glass to the floor. " 'MICHAEL " reaches under his robes
+and takes out a handkerchief, dabbing futilely at the stain. " 'VERONICA " snorts
+in exasperation and pushes him away. \"I'm
+going to go clean this up. You just stay here.\"" CR>)
+              (<IN-BALLROOM? ,PLAYER>
+               <THIS-IS-S-HE ,VERONICA>
+               <CRLF>
+               <TELL
+"Off near the fireplace, the sheik and the fairy queen are conversing
+with a small group. The fairy is emphasizing some point when suddenly,
+she manages to spill her drink on her gown. Her reaction is audible even
+where you are standing, and she stalks off." CR>)>>
+
+<ROUTINE IN-BALLROOM? (P)
+        <COND (<EQUAL? <GETP .P ,P?LINE> ,BALLROOM-LINE-C> <RTRUE>)
+              (<AND <LOC .P>
+                    <EQUAL? <GETP <LOC .P> ,P?LINE> ,BALLROOM-LINE-C>>
+               <RTRUE>)>>
+
+\f
+
+"What happens at end..."
+
+<ROUTINE TELL-MICHAELS-ALIBI ()
+        <TELL
+" " 'MICHAEL " has a perfect alibi, as he was in the
+Ballroom from the time " 'VERONICA " left to when the body was discovered.">>
+
+<ROUTINE ARREST (PER "OPTIONAL" (HELPER <>) "AUX" FLG CORRECT?)
+        <COND (.HELPER
+               <COND (<OR <EQUAL? .PER ,VERONICA ,DETECTIVE ,DUFFY>
+                          <EQUAL? .HELPER ,VERONICA ,DETECTIVE ,DUFFY>>
+                      <TELL
+"\"Working on your insanity defense, eh?\"" CR>
+                      <RTRUE>)
+                     (<OR <AND <EQUAL? .HELPER ,ALICIA>
+                               <EQUAL? .PER ,MICHAEL>>
+                          <AND <EQUAL? .PER ,ALICIA>
+                               <EQUAL? .HELPER ,MICHAEL>>>
+                      <SET PER ,MICHAEL>
+                      <SET HELPER ,ALICIA>
+                      <COND (<L? ,DETECTIVE-SEEN ,DETECTIVE-CONVINCED>
+                             <TELL
+"\"I don't think there's enough evidence to obtain a conviction.">
+                             <COND (<NOT ,DETECTIVE-SEEN-LIST?>
+                                    <TELL " What's Michael's motive?">)>
+                             <COND (<AND <NOT ,DETECTIVE-SEEN-COAT?>
+                                         <NOT ,DETECTIVE-TOLD-ABOUT-RAIN?>>
+                                    <TELL " She wasn't even here until
+after the murder.">)
+                                   (<OR <NOT ,DETECTIVE-SEEN-COAT?>
+                                        <NOT ,DETECTIVE-TOLD-ABOUT-RAIN?>>
+                                    <TELL
+" If only the evidence was more conclusive that " 'ALICIA " was already here at
+the time of the murder.">)>
+                             <COND (<NOT ,GLASS-ANALYZED-FOR-PRINTS?>
+                                    <TELL " What part do you
+think " 'ALICIA " played?">
+                                    <COND (<AND <NOT ,DETECTIVE-SEEN-HAIR?>
+                                                <NOT ,DETECTIVE-TOLD-ABOUT-RAIN?>
+                                                <NOT ,DETECTIVE-SEEN-COAT?>>
+                                           <TELL " She seems guiltless.">)>)>
+                             <COND (<EQUAL? <+ ,DETECTIVE-SEEN 2>
+                                            ,DETECTIVE-CONVINCED>
+                                    <TELL " But I think we're very close.">)>
+                             <TELL "\"" CR>)>)
+                     (<AND ,DETECTIVE-SEEN-LIST?
+                           <OR <EQUAL? .PER ,MICHAEL>
+                               <EQUAL? .HELPER ,COL-MARSTON>>
+                           <OR <EQUAL? .HELPER ,MICHAEL>
+                               <EQUAL? .PER ,COL-MARSTON>>>
+                      <TELL
+"\"That's a plausible idea. Unfortunately, it doesn't tell us how the
+murder was committed.">
+                      <COND (<NOT ,GLASS-ANALYZED-FOR-PRINTS?>
+                             <TELL-MICHAELS-ALIBI>)>
+                      <TELL " Motive doesn't equal guilt.\"" CR>
+                      <RTRUE>)
+                     (ELSE
+                      <TELL
+CTHE ,DETECTIVE " ruminates a moment. \"It only casts suspicion back
+on you to suggest such a thing.\"" CR>
+                      <RTRUE>)>)>
+        <COND (.HELPER T)
+              (<EQUAL? .PER ,DUFFY ,DETECTIVE>
+               <TELL "\"You think you're some sort of comedian, eh?\"" CR>
+               <RTRUE>)
+              (<EQUAL? .PER ,MICHAEL>
+               <COND (<NOT ,GLASS-ANALYZED-FOR-PRINTS?>
+                      <TELL "\"No.">
+                      <TELL-MICHAELS-ALIBI>
+                      <TELL "\"" CR>
+                      <RTRUE>)
+                     (,DETECTIVE-SEEN-LIST?
+                      <COND (<L? ,DETECTIVE-SEEN ,DETECTIVE-CONVINCED>
+                             <TELL
+"\"You may be right, but while he may have been in with " 'COL-MARSTON ", that
+doesn't make him guilty of murder.\"" CR>)
+                            (ELSE
+                             <TELL
+"\"He couldn't have done it by himself.\"" CR>)>)
+                     (T
+                      <TELL
+"\"You've produced no evidence he did it. Do you merely dislike him?\"" CR>
+                      <RTRUE>)>)
+              (<EQUAL? .PER ,ALICIA>
+               <COND (<AND <NOT ,GLASS-ANALYZED-FOR-PRINTS?>
+                           <NOT ,DETECTIVE-SEEN-COAT?>
+                           <NOT ,DETECTIVE-SEEN-HAIR?>>
+                      <TELL
+"\"She wasn't even in the house when the murder was committed. I don't
+buy it.\"" CR>)
+                     (ELSE
+                      <TELL
+"\"I agree that she must have been involved, but it seems unlikely she
+did it by herself. For one thing, what's her motive?\"" CR>)>) 
+              (<EQUAL? .PER ,SEN-ASHER>
+               <TELL
+"\"He was in the next room, it's true, but what motive did he have?
+How did he do it?\"" CR>
+               <RTRUE>)
+              (<EQUAL? .PER ,COCHRANE>
+               <COND (,DETECTIVE-SEEN-AGREEMENT?
+                      <COND (,DETECTIVE-SEEN-CARD?
+                             <TELL
+"\"The combination of the threat in that " 'CARD " and his anger
+over the sale of the farm certainly present a strong circumstantial
+case, at least as far as motive goes, but there is no direct evidence.\"" CR>)
+                            (ELSE
+                             <TELL
+"\"It's clear he felt aggrieved by her behavior regarding the sale of
+the farm, but murder? He seems like a mostly harmless drunk to me.\"" CR>)>)
+                     (,DETECTIVE-SEEN-CARD?
+                      <TELL
+"\"That card certainly looks like a veiled threat to me, but what does it
+refer to?\"" CR>)
+                     (ELSE
+                      <TELL
+"\"Just because he's a boor doesn't make him guilty.\"" CR>
+                      <RTRUE>)>)
+              (<EQUAL? .PER ,BUTLER>
+               <TELL
+"\"I suppose you think the butler always does it?">
+               <COND (,DETECTIVE-SEEN-AGREEMENT?
+                      <TELL
+" Even if he knew about the sale of the farm, I don't see
+any likelihood he could have done it.">)>
+               <TELL "\"" CR>
+               <RTRUE>)
+              (<EQUAL? .PER ,RICHARD>
+               <TELL
+"\"If everyone who hated a relative was guilty of murder, we'd have to
+build a lot more prisons.\"" CR>
+               <RTRUE>)
+              (<EQUAL? .PER ,COL-MARSTON>
+               <COND (<OR ,DETECTIVE-SEEN-TRUST-DOCUMENTS?
+                          ,DETECTIVE-SEEN-LIST?>
+                      <TELL
+"\"You've certainly shown a pattern of theft on his part, which may
+well establish a motive, but what about the method and opportunity?
+Theft for sure, but we're looking at murder here.\"" CR>)
+                     (ELSE
+                      <TELL "\"I don't see it, where's the motive?\"" CR>
+                      <RTRUE>)>)
+              (ELSE
+               <TELL
+"\"Aside from motive, method, and opportunity, you seem to have a
+perfect case.\"" CR>
+               <RTRUE>)>
+        <SET CORRECT?
+             <AND <EQUAL? .PER ,MICHAEL>
+                  <EQUAL? .HELPER ,ALICIA>>>
+        <COND (<AND .CORRECT?
+                    ,FLEEING?
+                    <OUTSIDE? <LOC ,MICHAEL>>
+                    <NOT <EQUAL? ,HERE <LOC ,MICHAEL> <LOC ,ALICIA>>>>
+               <MOVE ,DUFFY ,HERE>
+               <ESTABLISH-GOAL ,DUFFY ,HERE>
+               <TELL
+'DUFFY " runs up, out of breath. \"I can't find them anywhere!\"" CR>)
+              (ELSE
+               <DUFFY-PERFORMS-ARREST .PER .HELPER>
+               <CASE-OVER .CORRECT?>)>
+        <RTRUE>>
+
+<ROUTINE TELL-ONE-HERE-ONE-NOT (INHERE NOTHERE)
+        <TELL
+'DUFFY " appears with " D .NOTHERE " in tow.">
+        <DUFFY-HANDCUFFS .INHERE>>
+
+<ROUTINE TELL-ALL-HERE (PER "OPTIONAL" (HELPER <>))
+        <TELL
+'DUFFY " appears with a solemn look.">
+        <DUFFY-HANDCUFFS .PER .HELPER>>
+
+<ROUTINE TELL-NONE-HERE (PER "OPTIONAL" (HELPER <>))
+        <TELL
+'DUFFY " seems to read your thoughts, as he appears with " D .PER>
+        <COND (.HELPER
+               <TELL
+" and " D .HELPER>)>
+        <TELL " in handcuffs.">>
+
+<ROUTINE DUFFY-HANDCUFFS (PER "OPTIONAL" (HELPER <>))
+        <TELL " He puts handcuffs on the wrists of ">
+        <COND (.HELPER <TELL "both ">)>
+        <TELL D .PER>
+        <COND (.HELPER <TELL " and " D .HELPER>)>
+        <TELL ", who stand">
+        <COND (<NOT .HELPER> <TELL "s">)>
+        <TELL " stiff and quiet.">>
+
+<ROUTINE DUFFY-PERFORMS-ARREST (PER HELPER)
+        <CRLF>
+        <COND (,MICHAEL-DEAD?
+               <TELL-ALL-HERE ,ALICIA>
+               <TELL " \"" ,AMBULANCE-COMING ",\" he tells her.">)
+              (.HELPER
+               <COND (<AND <IN? .HELPER ,HERE>
+                           <IN? .PER ,HERE>>
+                      <TELL-ALL-HERE .PER .HELPER>)
+                     (<IN? .HELPER ,HERE>
+                      <TELL-ONE-HERE-ONE-NOT .HELPER .PER>)
+                     (<IN? .PER ,HERE>
+                      <TELL-ONE-HERE-ONE-NOT .PER .HELPER>)
+                     (T
+                      <TELL-NONE-HERE .PER .HELPER>)>)
+             (<EQUAL? ,HERE <META-LOC .PER>>
+              <TELL-ALL-HERE .PER>)
+             (T
+              <TELL-NONE-HERE .PER>)>
+        <TELL
+" \"Let's not have any trouble, now,\" says " 'DUFFY ", in his unique way.
+They head for the driveway, where a police car waits with engine
+purring." CR>>
+
+<ROUTINE CASE-OVER (CORRECT?)
+        <CRLF>
+        <COND (<AND .CORRECT? <==? ,DETECTIVE-SEEN ,DETECTIVE-CONVINCED>>
+               <COND (,MICHAEL-DEAD?
+                      <TELL
+"Well, they got " 'ALICIA ", but not " 'MICHAEL ". He's beyond the reach of justice
+now. Too bad you didn't figure it all out sooner.">)
+                     (ELSE
+                      <TELL
+"Congratulations! Your testimony as star witness for the prosecution
+secures the conviction of " 'MICHAEL " for the first degree murder of his wife,
+and of " 'ALICIA " as his accomplice. Not only are they sent to prison with the
+proverbial key thrown away, but " 'COL-MARSTON " is convicted in a parallel
+case of embezzlement and grand theft for his role in the
+milking of the family Trust.|
+|
+Best of all, your syndicated twelve-part story of the tangled plot and
+its aftermath wins the Pulitzer Prize, and the book is number one on the
+bestseller lists for 42 weeks! (Not to mention the movie and book club
+sales.)|
+|
+As your book explains, the murder was triggered by " 'VERONICA "'s desire to
+sell the farm and move to a more rural area. Even with the proceeds of
+the sale, still more funds from the family Trust would have been required
+to purchase the new property and build on it. " 'MICHAEL " and " 'COL-MARSTON "
+were alarmed, as they had been milking the Trust by investing in dummy
+corporations under their control. After a time, " 'VERONICA " grew suspicious
+and had the Trust's dealings investigated. She expected that " 'COL-MARSTON "
+would be implicated, but was surprised to find that " 'MICHAEL " was an equal
+partner in the scheme. For " 'MICHAEL ", time was running out. He wanted out of
+the marriage, but not the Ashcroft fortune, and enlisted " 'ALICIA "'s help in
+the bizarre scheme. " 'ALICIA " would impersonate the murdered " 'VERONICA " to
+establish an alibi. Your appearance on the scene as an old friend suggested
+another red herring. A few pieces of evidence planted, and you might be
+framed. Fortunately for all but the plotters, the plans were for naught.">)>)
+              (ELSE
+               <TELL
+,TOO-BAD "your testimony fails to convince the jury, for precisely
+the reasons outlined by " THE ,DETECTIVE " before the arrest. Your editor
+demotes you to covering flower shows and computer software conventions.
+As a final blow, when " THE ,DETECTIVE " solves the case and makes the
+arrest, you realize how simple it all should have been.">)>
+        <CRLF>
+        <FINISH>>
+
+<ROUTINE FINISH ("AUX" Y)
+        <TELL "|
+The story has come to an end.|
+">
+       <REPEAT ()
+               <TELL "|
+Would you like to start over from scratch or restore a saved position?">
+               <COND (<NOT <SET Y <YES? T>>> <QUIT>)
+                     (<EQUAL? .Y ,M-FATAL>
+                      <V-RESTORE>)
+                     (ELSE <RESTART>)>>>
+
+<ROUTINE I-PARTY-OVER ("AUX" STR)
+        <SETG OVER-COUNT <+ ,OVER-COUNT 1>>
+        <COND (<SET STR <GET ,OVER-TABLE ,OVER-COUNT>>
+               <QUEUE I-PARTY-OVER <+ 10 <RANDOM 10>>>)
+              (ELSE
+               <SETG OFFICE-EXPEDITION? T>
+               <COND (<NOT ,FLEEING?>
+                      <ESTABLISH-GOAL ,MICHAEL ,BALLROOM-9>
+                      <ESTABLISH-GOAL ,ALICIA ,BALLROOM-9>)>
+               <ESTABLISH-GOAL ,RICHARD ,BALLROOM-9>
+               <ESTABLISH-GOAL ,LINDA ,BALLROOM-9>
+               <ESTABLISH-GOAL ,COL-MARSTON ,BALLROOM-9>
+               <ESTABLISH-GOAL ,SEN-ASHER ,BALLROOM-9>
+               <ESTABLISH-GOAL ,COCHRANE ,BALLROOM-9>
+               <ESTABLISH-GOAL ,OSTMANN ,BALLROOM-9>
+               <ESTABLISH-GOAL ,BUTLER ,BALLROOM-9>
+               <ESTABLISH-GOAL ,DETECTIVE ,BALLROOM-9>
+               <ESTABLISH-GOAL ,DUFFY ,BALLROOM-9>
+               <SETG ON-DANCE-FLOOR? <>>
+               <SETG PARTY-OVER T>)>
+        <COND (<OR <IN-BALLROOM? ,PLAYER>
+                   <EQUAL? ,HERE ,HALLWAY-12 ,HALLWAY-11 ,HALLWAY-10>
+                   <EQUAL? ,HERE ,HALLWAY-9 ,HALL>>
+               <COND (.STR <TELL .STR CR>)
+                     (ELSE
+                      <TELL
+"The last of the guests has left. No one is left but the suspects">
+                      <COND (<LOC ,CORPSE>
+                             <TELL" and the victim">)>
+                      <TELL "." CR>)>)>>
+
+<GLOBAL PARTY-OVER <>>
+<GLOBAL OVER-COUNT 0>
+
+<GLOBAL OVER-TABLE <LTABLE
+"Guests are starting to leave."
+"Some guests get their coats and depart."
+"Most of the guests have left now. A few more are tossing down the last
+of their drinks as they depart."
+"A few stragglers continue their exhausted revelry, but the party is
+clearly over."
+<>>>
+
+<ROUTINE DISCOVER-BODY (LISTENER "AUX" OW (L <LOC .LISTENER>))
+        <COND (<AND <EQUAL? <META-LOC ,CORPSE> .L>
+                    <OR <IN? ,CORPSE .L>
+                        <FSET? <LOC ,CORPSE> ,OPENBIT>
+                        <FSET? <LOC ,CORPSE> ,PERSON>>>
+               <SET OW ,WINNER>
+               <SETG WINNER ,PLAYER>
+               <PERFORM ,V?$DISCOVER ,CORPSE .LISTENER>
+               <SETG WINNER .OW>)>>
+
+<ROUTINE MURDER-TELL (LISTENER TELLER "AUX" OW)
+        <SET OW ,WINNER>
+        <COND (<EQUAL? ,PLAYER .TELLER>
+               <DISCOVER-BODY .LISTENER>)>
+        <COND (<EQUAL? ,PLAYER .TELLER>
+               <RFALSE>)
+              (<NOT <FSET? .LISTENER ,TOLD>>
+               %<DEBUG-CODE
+                 <COND (,GOSSIP
+                        <TELL
+"[" CD .TELLER " tells " D .LISTENER " in " D <LOC .TELLER> ".]" CR>)>>
+               <COND (<EQUAL? .LISTENER ,PLAYER>
+                      <COND (,PLAYER-HIDING <RFALSE>)
+                            (<EQUAL? .TELLER ,MICHAEL>
+                             <TELL
+'MICHAEL " notices you. He looks very distraught, almost in shock.
+\"" 'VERONICA "'s been murdered!\" he says. He chokes back a sob as a
+tremor travels through his body." CR>)
+                            (ELSE
+                             <TELL
+CD .TELLER " notices you and approaches. ">
+                             <COND (<EQUAL? .TELLER ,DETECTIVE ,DUFFY>
+                                    <TELL
+"\"There has been a murder. " 'VERONICA " Ashcroft has been killed. I
+must warn you that everyone here is a suspect, and you aren't to leave
+the premises without permission.\"" CR>)
+                                   (T
+                                    <TELL
+"\"Did you hear?\" "
+HE/SHE .TELLER " says quietly. \"Someone has murdered " 'VERONICA "!
+They found the body, she was strangled. The office was ransacked!
+Someone said it was a prowler, but no one's been caught yet.\"" CR>)>)>)
+                     (ELSE
+                      <SETG WINNER .TELLER>
+                      <PERFORM ,V?$REVEAL ,GLOBAL-MURDER .LISTENER>
+                      <SETG WINNER .OW>)>
+               <FSET .LISTENER ,TOLD>)>>
+
+<ROUTINE I-GAME-OVER ()
+        <TELL "Sorry, you have missed the morning edition deadline." CR>
+        <FINISH>>
diff --git a/goal.zil b/goal.zil
new file mode 100644 (file)
index 0000000..fb31080
--- /dev/null
+++ b/goal.zil
@@ -0,0 +1,905 @@
+"GOAL for M3
+Copyright 1984 Infocom, Inc.  All rights reserved.
+"
+
+"This code is the local T system."
+
+<GLOBAL DIR-STRINGS
+       <PTABLE P?NORTH "north" P?SOUTH "south"
+               P?EAST "east" P?WEST "west"
+               P?NW "northwest" P?NE "northeast"
+               P?SW "southwest" P?SE "southeast"
+               P?DOWN "downstairs" P?UP "upstairs"
+               P?IN "in" P?OUT "out">>
+
+<ROUTINE DIR-PRINT (DIR "AUX" (CNT 0))
+        #DECL ((DIR CNT) FIX)
+        <REPEAT ()
+                <COND (<==? <GET ,DIR-STRINGS .CNT> .DIR>
+                       <COND (<NOT <EQUAL? .DIR ,P?UP ,P?DOWN>>
+                              <TELL "the ">)>
+                       <PRINT <GET ,DIR-STRINGS <+ .CNT 1>>>
+                       <RTRUE>)>
+                <SET CNT <+ .CNT 1>>>>
+
+<GLOBAL HALL-LINE
+       <PTABLE 0 HALLWAY-1 P?EAST
+               P?WEST HALLWAY-2 P?EAST
+               P?WEST HALLWAY-3 P?EAST
+               P?WEST HALLWAY-4 P?NORTH
+               P?SOUTH HALLWAY-5 P?EAST
+               P?WEST HALLWAY-8 P?EAST
+               P?WEST HALLWAY-9 P?EAST
+               P?WEST HALLWAY-10 P?EAST
+               P?WEST HALLWAY-11 P?NORTH
+               P?SOUTH HALLWAY-12 P?NORTH
+               P?SOUTH HALLWAY-13 P?NORTH
+               P?SOUTH HALLWAY-14 P?NORTH
+               P?SOUTH HALLWAY-15 P?NORTH
+               P?SOUTH DINING-ROOM P?EAST
+               P?WEST KITCHEN P?NORTH
+               P?SOUTH BACK-ENTRY 0>>
+
+<GLOBAL BALLROOM-LINE
+       <PTABLE 24      BALLROOM-2 P?EAST
+               P?WEST  BALLROOM-3 P?SOUTH
+               P?NORTH BALLROOM-6 P?SOUTH
+               P?NORTH BALLROOM-9 P?WEST
+               P?EAST  BALLROOM-8 P?WEST
+               P?EAST  BALLROOM-7 P?NORTH
+               P?SOUTH BALLROOM-4 P?EAST
+               P?WEST  BALLROOM-5 P?NORTH
+               P?SOUTH BALLROOM-2 0>>
+
+<GLOBAL EAST-HALL-LINE
+       <PTABLE 0 HALLWAY-16 P?EAST
+               P?WEST HALLWAY-17 P?EAST
+               P?WEST HALLWAY-19 0>>
+
+<GLOBAL GARAGE-LINE
+       <PTABLE 0 HALLWAY-6 P?NORTH
+               P?SOUTH HALLWAY-7 P?NORTH
+               P?SOUTH WALKWAY P?WEST
+               P?EAST GARAGE 0>>
+
+<GLOBAL OUTSIDE-LINE
+       <PTABLE 24      GARDEN         P?NW
+               P?SE    NORTH-OF-HOUSE P?WEST
+               P?EAST  WEST-OF-GARAGE P?SOUTH
+               P?NORTH WEST-OF-HOUSE  P?SOUTH
+               P?WEST  CIRCLE         P?EAST
+               P?SOUTH OUTSIDE        P?NORTH
+               P?SOUTH PATIO          P?NORTH
+               P?EAST  BACK-PORCH     P?WEST
+               P?NE    GARDEN         0>>
+
+<GLOBAL TRANSFER-TABLE
+       <PTABLE ;"transfers for hall-line"
+               0             0
+               HALLWAY-12    BALLROOM-7
+               HALLWAY-11    HALLWAY-16
+               HALLWAY-5     HALLWAY-6
+               HALLWAY-1     WEST-OF-HOUSE
+
+               ;"transfers for ballroom-line"
+               BALLROOM-7    HALLWAY-12
+               0             0
+               BALLROOM-7    HALLWAY-12
+               BALLROOM-7    HALLWAY-12
+               BALLROOM-7    HALLWAY-12
+
+               ;"transfers for east-hall-line"
+               HALLWAY-16    HALLWAY-11
+               HALLWAY-16    HALLWAY-11
+               0             0
+               HALLWAY-16    HALLWAY-11
+               HALLWAY-16    HALLWAY-11
+
+               ;"transfers for garage-line"
+               HALLWAY-6     HALLWAY-5
+               HALLWAY-6     HALLWAY-5
+               HALLWAY-6     HALLWAY-5
+               0             0
+               WALKWAY       GARDEN
+
+               ;"transfers for outside-line"
+               WEST-OF-HOUSE HALLWAY-1
+               WEST-OF-HOUSE HALLWAY-1
+               WEST-OF-HOUSE HALLWAY-1
+               GARDEN        WALKWAY
+               0             0>>
+
+;"corridors are described by the direction they run (west-to-east,
+for example) and the rooms one would visit going in that direction"
+
+<GLOBAL COR-1
+       <PTABLE P?WEST P?EAST
+               HALLWAY-1 HALLWAY-2 HALLWAY-3 HALLWAY-4 0>>
+
+<GLOBAL COR-2
+       <PTABLE P?SOUTH P?NORTH
+               HALLWAY-4 HALLWAY-5 HALLWAY-6 HALLWAY-7 0>>
+
+<GLOBAL COR-4
+       <PTABLE P?WEST P?EAST
+               HALLWAY-5 HALLWAY-8 HALLWAY-9 HALLWAY-10 HALLWAY-11 0>>
+
+<GLOBAL COR-8
+       <PTABLE P?SOUTH P?NORTH
+               HALLWAY-16 HALLWAY-11 HALLWAY-12
+               HALLWAY-13 HALLWAY-14 HALLWAY-15 0>>
+
+<GLOBAL COR-16
+       <PTABLE P?WEST P?EAST
+               HALLWAY-16 HALLWAY-17 HALLWAY-19 0>>
+
+<GLOBAL COR-32
+       <PTABLE P?EAST P?WEST
+               BALLROOM-1 HALLWAY-14 0>>
+
+<GLOBAL COR-64
+       <PTABLE P?EAST P?WEST
+               BALLROOM-4 HALLWAY-13 0>>
+
+<GLOBAL COR-128
+       <PTABLE P?EAST P?WEST
+               BALLROOM-7 HALLWAY-12 0>>
+
+<GLOBAL COR-256
+       <PTABLE P?WEST P?EAST
+               BALLROOM-6 PATIO 0>>
+
+;"up to 16 corridors (65536) add them to GET-COR if new ones made"
+
+"CODE"
+
+<ROUTINE GOALS? (PER VAL)
+        <PUT <GET-GOALS .PER> ,GOAL-ENABLE .VAL>>
+
+<ROUTINE FOLLOW-GOAL (PER
+                     "AUX" (HERE <LOC .PER>) LINE RM GT GOAL FLG TMP
+                     (HERE-FLAG 0) (GOAL-FLAG <>) (IGOAL <>) LOC (CNT 1))
+        #DECL ((PER HERE LOC RM) OBJECT (LN CNT) FIX
+               (HERE-FLAG GOAL-FLAG) <OR FIX FALSE>)
+        <SET GT <GET-GOALS .PER>>
+        <COND (<==? .HERE <GET .GT ,GOAL-F>>
+               <RETURN <GOAL-REACHED .PER T>>)
+              (<NOT <GET .GT ,GOAL-ENABLE>> <RFALSE>)>
+        <COND (<NOT <EQUAL? <SET LOC <GETP .HERE ,P?STATION>>
+                            .HERE>>
+               <RETURN <MOVE-PERSON .PER .LOC>>)>
+        <COND (<==? <SET GOAL
+                         <GET ,TRANSFER-TABLE
+                              <SET IGOAL <GET .GT ,GOAL-I>>>>
+                    0>
+               <SET IGOAL <>>
+               <SET GOAL <GET .GT ,GOAL-S>>)>
+        <COND (<NOT .GOAL> <RFALSE>)
+              (<==? .HERE .GOAL>
+               <COND (.IGOAL
+                      <SET FLG
+                           <MOVE-PERSON .PER
+                                        <GET ,TRANSFER-TABLE
+                                             <+ .IGOAL 1>>>>
+                      <ESTABLISH-GOAL .PER <GET .GT ,GOAL-F>>
+                      <RETURN .FLG>)
+                     (<NOT <==? .HERE <GET .GT ,GOAL-F>>>
+                      ;<PUT .GT ,GOAL-S <>> ;"before move-person!"
+                      <SET FLG <MOVE-PERSON .PER <GET .GT ,GOAL-F>>>
+                      <RETURN .FLG>)
+                     (T
+                      <RETURN <GOAL-REACHED .PER>>)>)>
+        <SET LINE <GET-LINE <GETP .GOAL ,P?LINE>>>
+        <REPEAT ()
+                <COND (<==? <SET RM <GET .LINE .CNT>> .HERE>
+                       <RETURN>)
+                      (<==? .RM .GOAL>
+                       <SET GOAL-FLAG .CNT>)
+                      (<==? <GET .LINE <+ .CNT 1>> 0>
+                       %<DEBUG-CODE
+                         <TELL
+"*** " CD .PER " lost between " D .HERE " and " D .GOAL " on line " N <GETP .GOAL ,P?LINE> " ***">>
+                       <CRLF>
+                       <QUIT>)>
+                <SET CNT <+ .CNT 3>>>
+        <SET HERE-FLAG .CNT>
+        <COND (<G? <GET .LINE 0> 0>
+               <COND (<NOT .GOAL-FLAG>
+                      <REPEAT ()
+                              <SET RM <GET .LINE .CNT>>
+                              <COND (<==? .RM .GOAL>
+                                     <SET GOAL-FLAG .CNT>
+                                     <RETURN>)>
+                              <SET CNT <+ .CNT 3>>>)>
+               <SET GOAL-FLAG <- .GOAL-FLAG .HERE-FLAG>>
+               <SET TMP <- <GET .LINE 0> <ABS .GOAL-FLAG>>>
+               <COND (<G? <ABS .GOAL-FLAG> .TMP>
+                      <COND (<L? .GOAL-FLAG 0>
+                             <SET GOAL-FLAG <>>)
+                            (ELSE
+                             <SET GOAL-FLAG 1>)>)
+                     (<G? .GOAL-FLAG 0>
+                      <SET GOAL-FLAG <>>)>)>
+        <COND (<AND .GOAL-FLAG <EQUAL? .HERE-FLAG 1>>
+               <SET HERE-FLAG <+ <GET .LINE 0> 1>>)>
+        <SET LOC
+             <GET .LINE
+                  <COND (.GOAL-FLAG <- .HERE-FLAG 3>)
+                        (T <+ .HERE-FLAG 3>)>>>
+        <MOVE-PERSON .PER .LOC>>
+
+<ROUTINE COR-DIR (HERE THERE "AUX" COR RM (PAST 0) (CNT 2))
+        <SET COR <GET-COR <BAND <GETP .THERE ,P?CORRIDOR>
+                                <GETP .HERE ,P?CORRIDOR>>>>
+        <REPEAT ()
+                <COND (<==? <SET RM <GET .COR .CNT>> .HERE>
+                       <SET PAST 1>
+                       <RETURN>)
+                      (<==? .RM .THERE>
+                       <RETURN>)>
+                <SET CNT <+ .CNT 1>>>
+        <GET .COR .PAST>>
+
+<ROUTINE GET-LINE (LN)
+        <COND (<==? .LN 0> ,HALL-LINE)
+              (<==? .LN 1> ,BALLROOM-LINE)
+              (<==? .LN 2> ,EAST-HALL-LINE)
+              (<==? .LN 3> ,GARAGE-LINE)
+              (<==? .LN 4> ,OUTSIDE-LINE)
+              (ELSE <TELL "**UNDEFINED LINE**">)>>
+
+<ROUTINE GET-COR (NUM)
+        #DECL ((NUM) FIX)
+        <COND (<==? .NUM 1> ,COR-1)
+              (<==? .NUM 2> ,COR-2)
+              (<==? .NUM 4> ,COR-4)
+              (<==? .NUM 8> ,COR-8)
+              (<==? .NUM 16> ,COR-16)
+              (<==? .NUM 32> ,COR-32)
+              (<==? .NUM 64> ,COR-64)
+              (<==? .NUM 128> ,COR-128)
+              (T ,COR-256)>>
+
+<GLOBAL CHARACTER-TABLE
+       <TABLE PLAYER MICHAEL VERONICA ALICIA RICHARD
+              COL-MARSTON LINDA SEN-ASHER COCHRANE OSTMANN
+              BUTLER BARTENDER DETECTIVE DUFFY>>
+
+<CONSTANT PLAYER-C 0>
+<CONSTANT MICHAEL-C 1>
+<CONSTANT VERONICA-C 2>
+<CONSTANT ALICIA-C 3>
+<CONSTANT RICHARD-C 4>
+<CONSTANT COL-MARSTON-C 5>
+<CONSTANT LINDA-C 6>
+<CONSTANT SEN-ASHER-C 7>
+<CONSTANT COCHRANE-C 8>
+<CONSTANT OSTMANN-C 9>
+<CONSTANT BUTLER-C 10>
+<CONSTANT BARTENDER-C 11>
+<CONSTANT DETECTIVE-C 12>
+<CONSTANT DUFFY-C 13>
+
+<ROUTINE INHABITED? (RM)
+        <OR <IN? ,MICHAEL .RM> <IN? ,VERONICA .RM> <IN? ,ALICIA .RM>
+            <IN? ,RICHARD .RM> <IN? ,COL-MARSTON .RM> <IN? ,LINDA .RM>
+            <IN? ,SEN-ASHER .RM> <IN? ,COCHRANE .RM> <IN? ,OSTMANN .RM>
+            <IN? ,BUTLER .RM> <IN? ,BARTENDER .RM> <IN? ,DETECTIVE .RM>
+            <IN? ,DUFFY .RM>>>
+
+"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
+       <TABLE <TABLE <> <> <> 1 <> <> 5 0>
+              <TABLE <> <> <> 1 <> G-MICHAEL 5 0> ;"1"
+              <TABLE <> <> <> 1 <> G-VERONICA 5 0> ;"2"
+              <TABLE <> <> <> 1 <> G-ALICIA 5 0> ;"3"
+              <TABLE <> <> <> 1 <> G-RICHARD 5 0> ;"4"
+              <TABLE <> <> <> 1 <> G-COL-MARSTON 5 0> ;"5"
+              <TABLE <> <> <> 1 <> G-LINDA 5 0> ;"6"
+              <TABLE <> <> <> 1 <> G-SEN-ASHER 5 0> ;"7"
+              <TABLE <> <> <> 1 <> G-COCHRANE 5 0> ;"8"
+              <TABLE <> <> <> 1 <> G-OSTMANN 5 0> ;"9"
+              <TABLE <> <> <> 1 <> G-BUTLER 5 0> ;"10"
+              <TABLE <> <> <> 1 <> G-BARTENDER 5 0> ;"11"
+              <TABLE <> <> <> 1 <> G-DETECTIVE 5 0> ;"12"
+              <TABLE <> <> <> 1 <> G-DUFFY 5 0> ;"13">>
+
+<CONSTANT CHARACTER-MAX 13>
+
+"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; usually false only when he's
+                          interrupted enroute"
+<CONSTANT GOAL-QUEUED 4> ;"secondary goal to go to when current, higher-
+                          priority one has been reached"
+<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-ALREADY 4>
+
+"Routines to do looking down corridors"
+
+<ROUTINE CORRIDOR-LOOK ("OPTIONAL" (ITM <>)
+                       "AUX" C Z COR VAL (FOUND <>))
+        <COND (<SET C <GETP ,HERE ,P?CORRIDOR>>
+               <REPEAT ()
+                       <COND (<NOT <L? <SET Z <- .C 256>> 0>>
+                              <SET COR ,COR-256>)
+                             (<NOT <L? <SET Z <- .C 128>> 0>>
+                              <SET COR ,COR-128>)
+                             (<NOT <L? <SET Z <- .C 64>> 0>>
+                              <SET COR ,COR-64>)
+                             (<NOT <L? <SET Z <- .C 32>> 0>>
+                              <SET COR ,COR-32>)
+                             (<NOT <L? <SET Z <- .C 16>> 0>>
+                              <SET COR ,COR-16>)
+                             (<NOT <L? <SET Z <- .C 8>> 0>>
+                              <SET COR ,COR-8>)
+                             (<NOT <L? <SET Z <- .C 4>> 0>>
+                              <SET COR ,COR-4>)
+                             (<NOT <L? <SET Z <- .C 2>> 0>>
+                              <SET COR ,COR-2>)
+                             (<NOT <L? <SET Z <- .C 1>> 0>>
+                              <SET COR ,COR-1>)
+                             (T <RETURN>)>
+                       <SET VAL <CORRIDOR-CHECK .COR .ITM>>
+                       <COND (<NOT .FOUND> <SET FOUND .VAL>)>
+                       <SET C .Z>>
+               .FOUND)>>
+
+<ROUTINE CORRIDOR-CHECK (COR ITM "AUX" (CNT 2) (PAST 0) (FOUND <>) RM OBJ)
+        <REPEAT ()
+                <COND (<==? <SET RM <GET .COR .CNT>> 0>
+                       <RFALSE>)
+                      (<==? .RM ,HERE> <SET PAST 1>)
+                      (<SET OBJ <FIRST? .RM>>
+                       <REPEAT ()
+                               <COND (.ITM
+                                      <COND (<==? .OBJ .ITM>
+                                             <SET FOUND <GET .COR .PAST>>
+                                             <RETURN>)>)
+                                     (<AND <GETP .OBJ ,P?CHARACTER>
+                                           <NOT <IN-MOTION? .OBJ>>>
+                                      <TELL CTHE .OBJ " is off to ">
+                                      <DIR-PRINT <GET .COR .PAST>>
+                                      <TELL ".">
+                                      <CRLF>)>
+                               <SET OBJ <NEXT? .OBJ>>
+                               <COND (<NOT .OBJ> <RETURN>)>>
+                       <COND (.FOUND <RETURN .FOUND>)>)>
+                <SET CNT <+ .CNT 1>>>>
+
+"Goal tables for the characters (including PLAYER), offset
+by the preceding constants, which, for a given character,
+is the P?CHARACTER property of the object."
+
+"The ATTENTION-TABLE is now a thing of the past. ATTENTION
+in the GOAL-TABLES is used instead."
+
+"Here's how the movement goals are done:  For each player is
+a table which consists of triplets, a number of minutes until
+the next movement (an clock interrupt number), a number of
+minutes allowed variation (for a bit of randomness), and a
+room toward which to start. All movement is controlled by
+the GOAL-ENABLE flag in the GOAL-TABLE for a character."
+
+"Time starts at 8AM. Characters are at that point in their
+starting positions, as reflected in PEOPLE."
+
+<GLOBAL MOVEMENT-GOALS
+       <TABLE
+        ;"PLAYER"
+        <TABLE 0 0 0>
+        ;"MICHAEL"
+        <TABLE 0 0 0>
+        ;"VERONICA"
+        <TABLE 0 0 0>
+        ;"ALICIA"
+        <TABLE 0 0 0>
+        ;"RICHARD"
+        <TABLE 0
+               20 -3 SUN-ROOM
+               15 -3 BALLROOM-9
+               0>
+        ;"COL-MARSTON"
+        <TABLE 0
+               40 -3 MORNING-ROOM
+               20 -5 LIVING-ROOM
+               0>
+        ;"LINDA"
+        <TABLE 0
+               20 -2 SUN-ROOM
+               15 -3 BALLROOM-9
+               0>
+        ;"SEN-ASHER"
+        <TABLE 0
+               30 -2 BALLROOM-9
+               5 -2 LIVING-ROOM
+               10 -2 SITTING-ROOM
+               0>
+        ;"COCHRANE"
+        <TABLE 0
+               4 -2 BALLROOM-9
+               0>
+        ;"OSTMANN"
+        <TABLE 0
+               0
+               0>
+        ;"BUTLER"
+        <TABLE 0
+               0
+               0>
+        ;"BARTENDER"
+        <TABLE 0
+               0
+               0>
+        ;"DETECTIVE"
+        <TABLE 0
+               0
+               0>
+        ;"DUFFY"
+        <TABLE 0
+               0
+               0>>>
+
+<GLOBAL DETECTIVE-SCRIPT
+        <TABLE 0
+               3 -1 OFFICE
+               18 -3 MEDIA-ROOM
+               10 -3 HALLWAY-7
+               8 -2 LIVING-ROOM
+               10 -2 BALLROOM-8
+               0>>
+
+<GLOBAL DUFFY-SCRIPT
+       <TABLE 0
+               3 -1 OFFICE
+               20 -3 MEDIA-ROOM
+               12 -3 HALLWAY-7
+               10 -3 LIVING-ROOM
+               12 -3 BALLROOM-8
+               0>>
+
+<GLOBAL MICHAEL-LOOP
+        <TABLE 0
+               5 -2 BALLROOM-1
+               5 -2 BALLROOM-9
+               5 -2 BALLROOM-7
+               5 -2 BALLROOM-9
+               5 -2 BALLROOM-3
+               5 -2 BALLROOM-9
+               5 -2 BALLROOM-8
+               0>>
+
+<GLOBAL BUTLER-LOOP
+       <TABLE 0
+              10 -1 EAST-COAT-CLOSET
+              10 -5 KITCHEN
+              8 -2 BALLROOM-9
+              8 -1 LIVING-ROOM
+              10 -1 HALL
+              0>>
+
+<GLOBAL COCHRANE-LOOP
+       <TABLE 0
+              6 -4 BALLROOM-1
+              6 -4 BALLROOM-9
+              0>>
+
+<GLOBAL OSTMANN-LOOP
+       <TABLE 0
+              12 -4 BALLROOM-3
+              9 -2 BALLROOM-7
+              15 -2 HALLWAY-15
+              10 -1 BALLROOM-9
+              0>>
+
+<ROUTINE IN-MOTION? (PER "AUX" GT)
+        <COND (<SET GT <GET-GOALS .PER>>
+               <COND (<AND <GET .GT ,GOAL-ENABLE>
+                           <GET .GT ,GOAL-S>
+                           <NOT <==? <LOC .PER> <GET .GT ,GOAL-F>>>>
+                      <RTRUE>)
+                     (T <RFALSE>)>)>>
+
+<ROUTINE START-MOVEMENT ()
+        <ENABLE <QUEUE G-MICHAEL 1>>
+        <ENABLE <QUEUE G-ALICIA 1>>
+        <ENABLE <QUEUE G-RICHARD 1>>
+        <ENABLE <QUEUE G-COL-MARSTON 1>>
+        <ENABLE <QUEUE G-LINDA 1>>
+        <ENABLE <QUEUE G-SEN-ASHER 1>>
+        <NEW-SCRIPT ,COCHRANE ,COCHRANE-LOOP>
+        <NEW-SCRIPT ,OSTMANN ,OSTMANN-LOOP>
+        <NEW-SCRIPT ,BUTLER ,BUTLER-LOOP>
+        <ENABLE <QUEUE I-FOLLOW -1>>
+        <ENABLE <QUEUE I-ATTENTION -1>>>
+
+"This routine does the interrupt-driven goal establishment
+for the various characters, using the MOVEMENT-GOALS table."
+
+<CONSTANT MG-ROOM 0>
+<CONSTANT MG-TIME 1>
+<CONSTANT MG-VARIATION 2>
+<CONSTANT MG-LENGTH <* 3 2>>
+<CONSTANT MG-NEXT 4>
+
+<ROUTINE GET-GOALS (PER)
+        <SET PER <GETP .PER ,P?CHARACTER>>
+        <GET ,GOAL-TABLES .PER>>
+
+<ROUTINE NEW-SCRIPT (PER SCRIPT "AUX" CH GT)
+        <SET CH <GETP .PER ,P?CHARACTER>>
+        <PUT ,MOVEMENT-GOALS .CH .SCRIPT>
+        <SET GT <GET ,GOAL-TABLES .CH>>
+        <PUT .GT ,GOAL-QUEUED <>>
+        <IMOVEMENT .PER
+                   %<COND (<GASSIGNED? PREDGEN>
+                           '<GET .GT ,GOAL-FUNCTION>)
+                          (ELSE '<NTH!- .GT <+ 1 <* ,GOAL-FUNCTION 2>>>)>>
+        <RFALSE>>
+
+<ROUTINE IMOVEMENT (PER INT "AUX" TB VAR DIS TIM ID RM GT (FLAG <>))
+        #DECL ((PER) OBJECT (TB) <PRIMTYPE VECTOR> (ID VAR DIS TIM) FIX)
+        <SET ID <GETP .PER ,P?CHARACTER>>
+        <SET TB <GET ,MOVEMENT-GOALS .ID>>
+        <SET GT <GET ,GOAL-TABLES .ID>>
+        <COND (<NOT <==? 0 <SET RM <GET .TB ,MG-ROOM>>>>
+               <COND (<GET .GT ,GOAL-QUEUED>
+                      <PUT .GT ,GOAL-QUEUED .RM>)
+                     (T
+                      <ESTABLISH-GOAL .PER .RM>)>)>
+        <COND (<NOT <==? 0 <SET TIM <GET .TB ,MG-TIME>>>>
+               <COND (<L? <SET VAR <GET .TB ,MG-VARIATION>> 0>
+                      <SET VAR <- .VAR>>
+                      <SET FLAG T>)>
+               <SET DIS <COND (<G? .VAR 0> <RANDOM <* .VAR 2>>)
+                              (ELSE 0)>>
+               <ENABLE <QUEUE .INT <+ .TIM <- .DIS .VAR>>>>
+               <PUT ,MOVEMENT-GOALS .ID <REST .TB ,MG-LENGTH>>
+               <COND (<AND <NOT .FLAG> <NOT <==? 0 <GET .TB ,MG-NEXT>>>>
+                      <PUT .TB
+                           ,MG-NEXT
+                           <+ <GET .TB ,MG-NEXT> <- .VAR .DIS>>>)>)>
+        <RFALSE>>
+
+<ROUTINE I-FOLLOW ("AUX" (FLG <>) (CNT 0) GT VAL)
+        <REPEAT ()
+                <COND (<G? <SET CNT <+ .CNT 1>> ,CHARACTER-MAX>
+                       <RETURN>)
+                      (<AND <GET <SET GT <GET ,GOAL-TABLES .CNT>> ,GOAL-S>
+                            <GET .GT ,GOAL-ENABLE>>
+                       <COND (<SET VAL
+                                   <FOLLOW-GOAL <GET ,CHARACTER-TABLE .CNT>>>
+                              <COND (<NOT <==? .FLG ,M-FATAL>>
+                                     <SET FLG .VAL>)>)>)>>
+        .FLG>
+
+<ROUTINE I-ATTENTION ("AUX" (FLG <>) (CNT 0) ATT GT)
+        <REPEAT ()
+                <COND (<G? <SET CNT <+ .CNT 1>> ,CHARACTER-MAX> <RETURN>)>
+                <SET GT <GET ,GOAL-TABLES .CNT>>
+                <SET ATT <GET .GT ,ATTENTION>>
+                <COND (<G? .ATT 0>
+                       <SET ATT <- .ATT 1>>
+                       <COND (<==? .ATT 0> <PUT .GT ,GOAL-ENABLE T>)
+                             (<AND <==? .ATT 1>
+                                   <IN? <GET ,CHARACTER-TABLE .CNT> ,HERE>
+                                   %<DEBUG-CODE
+                                     <D-APPLY "Impatient"
+                                              <GET .GT ,GOAL-FUNCTION>
+                                              ,G-IMPATIENT>
+                                     <APPLY <GET .GT ,GOAL-FUNCTION>
+                                            ,G-IMPATIENT>>>
+                              <SET FLG T>)>
+                       <PUT .GT ,ATTENTION .ATT>)>>
+        .FLG>
+
+<ROUTINE GRAB-ATTENTION (PER "OPTIONAL" (LEN <>) "AUX" GT ATT)
+        #DECL ((PER) OBJECT (ATT) FIX)
+        <SET GT <GET-GOALS .PER>>
+        <COND (<GET .GT ,GOAL-S>
+               <COND (.LEN <SET ATT .LEN>)
+                     (ELSE <SET ATT <GET .GT ,ATTENTION-SPAN>>)>
+               <PUT .GT ,ATTENTION .ATT>
+               <COND (<==? .ATT 0>
+                      <PUT .GT ,GOAL-ENABLE T>
+                      <RFALSE>)
+                     (<GET .GT ,GOAL-ENABLE>
+                      <PUT .GT ,GOAL-ENABLE <>>)>)>
+        <SETG QCONTEXT .PER>
+        <SETG QCONTEXT-ROOM ,HERE>
+        <RTRUE>>
+
+"Movement etc."
+
+<ROUTINE UNPRIORITIZE (PER "AUX" GT)
+        <SET GT <GET-GOALS .PER>>
+        <PUT .GT ,GOAL-ENABLE T>
+        <COND (<GET .GT ,GOAL-QUEUED>
+               <ESTABLISH-GOAL .PER <GET .GT ,GOAL-QUEUED>>
+               <PUT .GT ,GOAL-QUEUED <>>)>>
+
+<ROUTINE ESTABLISH-GOAL (PER GOAL "OPTIONAL" (PRIORITY <>)
+                        "AUX" H HL GL GT)
+        #DECL ((PER GOAL H) OBJECT (HL GL) FIX)
+        <SET H
+             <COND (<EQUAL? .PER ,PLAYER> ,HERE)
+                   (ELSE <LOC .PER>)>>
+        %<DEBUG-CODE
+          <COND (<NOT <IN? .GOAL ,ROOMS>>
+                 <TELL
+"***Establish goal for " D .PER " to " D .GOAL "***" CR>
+                 <RFALSE>)
+                (<EQUAL? ,EDEBUG .PER>
+                 <TELL
+"[" CD .PER " establishes ">
+                 <COND (.PRIORITY
+                        <TELL "priority ">)>
+                 <TELL "goal of " D .GOAL "]" CR>)>>
+        <SET GT <GET-GOALS .PER>>
+        <COND (.PRIORITY
+               <PUT .GT ,ATTENTION 0>
+               <PUT .GT ,GOAL-ENABLE T>
+               <COND (<NOT <EQUAL? .GOAL <GET .GT ,GOAL-F>>>
+                      %<DEBUG-CODE 
+                        <COND (<AND ,DEBUG <GET .GT ,GOAL-QUEUED>>
+                               <TELL
+"[" CD .PER ": queued=" D <GET .GT ,GOAL-QUEUED>
+", new=" D .GOAL
+", here=" D .H "!]" CR>)>>
+                      <PUT .GT ,GOAL-QUEUED .H>)>)>
+        <PUT .GT
+             ,GOAL-I
+             <* 2
+                <+ <* %<COND (<GASSIGNED? PREDGEN>
+                              '<GETP .H ,P?LINE>)
+                             (ELSE
+                              '<OR <GETP .H P?LINE> <ERROR .H LINE>>)>
+                      ,LINES>
+                   <GETP .GOAL ,P?LINE>>>>
+        <PUT .GT ,GOAL-S <GETP .GOAL ,P?STATION>>
+        <PUT .GT ,GOAL-F .GOAL>
+        <LOC .PER>>
+
+<ROUTINE GOAL-REACHED (PER "OPTIONAL" (THERE? <>) "AUX" GT)
+        #DECL ((PER) OBJECT)
+        <SET GT <GET-GOALS .PER>>
+        <COND (<GET .GT ,GOAL-S>
+               <PUT .GT ,GOAL-S <>>
+               %<DEBUG-CODE
+                 <COND (,HDEBUG <TELL "[" D .PER "=]">)>>
+               %<DEBUG-CODE
+                 <D-APPLY <COND (.THERE? "Already") (T "Reached")>
+                          <GET .GT ,GOAL-FUNCTION>
+                          <COND (.THERE? ,G-ALREADY) (T ,G-REACHED)>>
+                 <APPLY <GET .GT ,GOAL-FUNCTION>
+                        <COND (.THERE? ,G-ALREADY) (T ,G-REACHED)>>>)>>
+
+<ROUTINE MOVE-PERSON (PER WHERE "AUX" DIR GT OL COR PCOR CD DF
+                                        (FLG <>) DR (VAL <>) PB?)
+        #DECL ((PER WHERE) OBJECT)
+        <SET GT <GET-GOALS .PER>>
+        <SET OL <LOC .PER>>
+        <SET DIR <DIR-FROM .OL .WHERE>>
+        %<DEBUG-CODE <COND (<NOT .DIR>
+                            <TELL
+"[Goal bug: " D .PER " from " D .OL " to " D .WHERE "]" CR>)>>
+        <COND (<==? <PTSIZE <SET DR <GETPT .OL .DIR>>> ,DEXIT>
+               <SET DR <GETB .DR ,DEXITOBJ>>
+               <COND (<NOT <FSET? .DR ,OPENBIT>>
+                      <COND (<AND <EQUAL? .PER ,PLAYER>
+                                  <FSET? .DR ,LOCKED>>
+                             T)
+                            (T
+                             <FCLEAR .DR ,LOCKED>
+                             <FSET .DR ,OPENBIT>)>)
+                     (T <SET DR <>>)>)
+              (T <SET DR <>>)>
+        <SET PB? <IN-BALLROOM? ,PLAYER>>
+        <COND (<FSET? .PER ,INVISIBLE> T)
+              (<AND .PB?
+                    <OR <IN-BALLROOM? .PER>
+                        <IN-BALLROOM? .WHERE>>>
+               <COND (<NOT <EQUAL? ,HERE <GET .GT ,GOAL-F>>>
+                      <SET FLG T>
+                      <TELL CTHE .PER>
+                      <COND (<NOT <IN-BALLROOM? .WHERE>>
+                             <TELL " leaves the ballroom." CR>)
+                            (T
+                             <COND (<EQUAL? .OL ,HERE>
+                                    <TELL " leaves you, and">)>
+                             <TELL " is now ">
+                             <COND (<EQUAL? .WHERE ,HERE>
+                                    <TELL "with you ">)>
+                             <TELL <GETP .WHERE ,P?FDESC>>
+                             <TELL "." CR>)>)>)
+              (<==? .OL ,HERE>
+               <SET FLG T>
+               <TELL CTHE .PER>
+               <COND (<==? .DIR ,P?OUT>
+                      <TELL " leaves the room." CR>)
+                     (<==? .DIR ,P?IN>
+                      <COND (.DR
+                             <TELL " opens " THE .DR " and">)>
+                      <TELL " goes into another room." CR>)
+                     (T
+                      <COND (.DR
+                             <TELL " opens " THE .DR " and">)>
+                      <TELL " heads off to ">
+                      <DIR-PRINT .DIR>
+                      <TELL "." CR>)>)
+              (<==? .WHERE ,HERE>
+               <COND (<NOT <==? ,HERE <GET .GT ,GOAL-F>>>
+                      <SET FLG T>
+                      <TELL CTHE .PER>
+                      <COND (.DR
+                             <TELL " opens " THE .DR " and">)>
+                      <COND (<AND <VERB? WALK>
+                                  <==? .DIR ,P-WALK-DIR>
+                                  <NOT <==? <LOC ,PLAYER> ,LAST-PLAYER-LOC>>>
+                             <TELL " walks along with">)
+                            (T <TELL " approaches">)>
+                      <TELL " you." CR>)>)
+              (<SET COR <GETP ,HERE ,P?CORRIDOR>>
+               <COND (<AND <SET PCOR <GETP .OL ,P?CORRIDOR>>
+                           <NOT <==? <BAND .COR .PCOR> 0>>>
+                      <SET FLG T>
+                      <COND (<NOT <GETP .WHERE ,P?CORRIDOR>>
+                             <TELL CTHE .PER ", off to ">
+                             <DIR-PRINT <COR-DIR ,HERE .OL>>
+                             <TELL ",">
+                             <COND (.DR
+                                    <TELL " opens a door and">)>
+                             <TELL " leaves your view to ">
+                             <DIR-PRINT <DIR-FROM .OL .WHERE>>
+                             <TELL "." CR>)
+                            (<0? <BAND .COR <GETP .WHERE ,P?CORRIDOR>>>
+                             <TELL CTHE .PER ", off to ">
+                             <DIR-PRINT <COR-DIR ,HERE .OL>>
+                             <TELL ", disappears from sight to ">
+                             <DIR-PRINT <SET PCOR <DIR-FROM .OL .WHERE>>>
+                             <TELL "." CR>)
+                            (T
+                             <TELL CTHE .PER " is to ">
+                             <DIR-PRINT <SET CD <COR-DIR ,HERE .WHERE>>>
+                             <TELL ", heading ">
+                             <COND (<==? .CD <SET DF <DIR-FROM .OL .WHERE>>>
+                                    <TELL "away from you">)
+                                   (ELSE
+                                    <TELL "toward ">
+                                    <DIR-PRINT .DF>)>
+                             <TELL "." CR>)>)
+                     (<AND <SET PCOR <GETP .WHERE ,P?CORRIDOR>>
+                           <NOT <==? <BAND .COR .PCOR> 0>>>
+                      <SET FLG T>
+                      <TELL "To ">
+                      <DIR-PRINT <SET CD <COR-DIR ,HERE .WHERE>>>
+                      <TELL " " THE .PER>
+                      <TELL " comes into view">
+                      <COND (<==? .CD <DIR-FROM .OL .WHERE>>
+                             <TELL " heading toward you">)
+                            (ELSE
+                             <TELL " from ">
+                             <DIR-PRINT <DIR-FROM .WHERE .OL>>)>
+                      <TELL "." CR>)>)>
+        <MOVE .PER .WHERE>
+        <COND (<EQUAL? .PER ,PLAYER>
+               <SETG HERE .WHERE>
+               <RFALSE>)>
+        %<DEBUG-CODE <COND (,HDEBUG <TELL "[" D .PER "=]">)>>
+        <COND (<==? <GET .GT ,GOAL-F> .WHERE>
+               <COND (<AND <NOT <SET VAL <GOAL-REACHED .PER>>>
+                           <NOT <FSET? .PER ,INVISIBLE>>>
+                      <COND (.FLG T)
+                            (<OR <==? ,HERE .WHERE>
+                                 <AND .PB? <IN-BALLROOM? .WHERE>>
+                                 <CORRIDOR-LOOK .PER>>
+                             <SET FLG T>
+                             <TELL CTHE .PER>
+                             <COND (.DR
+                                    <TELL " opens " THE .DR ", enters and">)>
+                             <TELL " stops">
+                             <COND (<==? ,HERE .WHERE>
+                                    <TELL " here">)
+                                   (.PB?
+                                    <TELL " " <GETP .WHERE ,P?FDESC>>)
+                                   (T
+                                    <TELL ", to ">
+                                    <DIR-PRINT <COR-DIR ,HERE .WHERE>>)>
+                             <TELL "." CR>)>)>)
+              (T
+               <COND (%<DEBUG-CODE
+                        <D-APPLY "Enroute"
+                                 <GET .GT ,GOAL-FUNCTION>
+                                 ,G-ENROUTE>
+                        <APPLY <GET .GT ,GOAL-FUNCTION>
+                               ,G-ENROUTE>>
+                      <SET FLG T>)>)>
+        <WHERE-UPDATE .PER .FLG>
+        %<DEBUG-CODE
+          <COND (,GDEBUG
+                 <TELL
+"[" CTHE .PER " just went into " THE .WHERE ".]" CR>)>>
+        <COND (<NOT .VAL> .FLG)
+              (T .VAL)>>
+
+<ROUTINE DIR-FROM (HERE THERE "AUX" (P 0) L T O)
+        #DECL ((HERE THERE O) OBJECT (P L) FIX)
+ <REPEAT ()
+        <COND (<0? <SET P <NEXTP .HERE .P>>>
+               <RFALSE>)
+              (<EQUAL? .P ,P?IN ,P?OUT> T)
+              (<NOT <L? .P ,LOW-DIRECTION>>
+               <SET T <GETPT .HERE .P>>
+               <SET L <PTSIZE .T>>
+               <COND (<AND <EQUAL? .L ,DEXIT ,UEXIT ,CEXIT>
+                           <==? <GETB .T ,REXIT> .THERE>>
+                      <RETURN .P>)>)>>>
+
+<ROUTINE LISTENING? (PER)
+        <COND (<SET PER <GET-GOALS .PER>>
+               <G? <GET .PER ,ATTENTION> 0>)>>
+
+<ROUTINE WHERE-UPDATE (PER "OPTIONAL" (FLG <>)
+                      "AUX" OW WT NC (CNT 0) CHR L (PER? <>))
+        <COND (<NOT <SET L <LOC .PER>>> <RFALSE>)>
+        <SET NC <GETP .PER ,P?CHARACTER>>
+        <SET WT <GET ,WHERE-TABLES .NC>>
+        <COND (<AND <NOT <EQUAL? .PER ,PLAYER>>
+                    <HELD? ,CORPSE>>
+               <SET PER? <DISCOVER-BODY .PER>>)>
+        <REPEAT ()
+                <COND (<G? .CNT ,CHARACTER-MAX> <RETURN>)
+                      (<==? .CNT .NC>)
+                      (<OR <IN? <SET CHR <GET ,CHARACTER-TABLE .CNT>>
+                                .L>
+                           <AND <0? .CNT> .FLG>>
+                       <COND (<IN? .CHR .L>
+                              <COND (<AND <NOT <EQUAL? .PER ,PLAYER>>
+                                          <FSET? .PER ,TOLD>
+                                          <NOT <FSET? .CHR ,TOLD>>>
+                                     <MURDER-TELL .CHR .PER>)
+                                    (<AND <NOT <EQUAL? .CHR ,PLAYER>>
+                                          <FSET? .CHR ,TOLD>
+                                          <NOT <FSET? .PER ,TOLD>>>
+                                     <MURDER-TELL .PER .CHR>)
+                                    (<LOC ,CORPSE>
+                                     <COND (<EQUAL? .PER ,PLAYER>
+                                            <DISCOVER-BODY .CHR>)
+                                           (<AND <NOT .PER?>
+                                                 <EQUAL? .CHR ,PLAYER>>
+                                            <DISCOVER-BODY .PER>)>)>)>
+                       <PUT .WT .CNT ,PRESENT-TIME>
+                       <PUT <GET ,WHERE-TABLES .CNT> .NC ,PRESENT-TIME>)>
+                <SET CNT <+ .CNT 1>>>>
+
+<GLOBAL WHERE-TABLES
+ <TABLE ;"PLA MIC VER ALI RIC MAR LIN ASH COC OST BUT BAR DET DUF"
+   <TABLE 500 500 500   0 500 500 500 500 500 540 500 540   0   0> ;"PLAYER"
+   <TABLE 500 540 540   0 500 500 500 500 500 500 500 500   0   0> ;"MICHAEL"
+   <TABLE 500 540 540   0 500 500 500 500 500 500 500 500   0   0> ;"VERONICA"
+   <TABLE   0   0   0   0   0   0   0   0   0   0   0   0   0   0> ;"ALICIA"
+   <TABLE 500 500 500   0 500 500 500 500 500 500 500 500   0   0> ;"RICHARD"
+   <TABLE 500 500 500   0 500 500 500 500 500 500 500 500   0   0> ;"COL. M."
+   <TABLE 500 500 500   0 500 500 500 500 500 500 500 500   0   0> ;"LINDA"
+   <TABLE 500 500 500   0 500 500 500 500 500 500 500 500   0   0> ;"SEN. A."
+   <TABLE 500 500 500   0 500 500 500 500 500 500 500 500   0   0> ;"COCHRANE"
+   <TABLE 540 500 500   0 500 500 500 500 500 500 500 500   0   0> ;"OSTMANN"
+   <TABLE 500 500 500   0 500 500 500 500 500 500 500 500   0   0> ;"BUTLER"
+   <TABLE 540 500 500   0 500 500 500 500 500 500 500 500   0   0> ;"BARTENDER"
+   <TABLE   0   0   0   0   0   0   0   0   0   0   0   0   0   0> ;"DETECTIVE"
+   <TABLE   0   0   0   0   0   0   0   0   0   0   0   0   0   0> ;"DUFFY">>
+
+;"END"
\ No newline at end of file
diff --git a/m3.zil b/m3.zil
new file mode 100644 (file)
index 0000000..4e36564
--- /dev/null
+++ b/m3.zil
@@ -0,0 +1,68 @@
+"COMPILE/LOAD FILE for M3
+Copyright (C) 1984 Infocom, Inc.  All rights reserved."
+
+<REPEAT (CHR)
+       <PRINC "Debugging? (Y or N): " ,OUTCHAN>
+       <SET CHR <TYI>>
+       <COND (<MEMQ .CHR "Yy ">
+              <PRINC " Debugging!
+" ,OUTCHAN>
+              <RETURN <SETG DEBUGGING? T>>)
+             (<MEMQ .CHR "Nn">
+              <PRINC " No debugging!
+" ,OUTCHAN>
+              <RETURN <SETG DEBUGGING? <>>>)
+             (ELSE
+              <PRINC " ??
+" ,OUTCHAN>)>>
+
+<DEFINE DEBUG-CODE ('X "OPTIONAL" ('Y T))
+       <COND (,DEBUGGING? .X)(ELSE .Y)>>
+
+<COND (<GASSIGNED? PREDGEN>
+       <PRINC "Compiling">
+       <ID 0>)
+      (T <PRINC "Loading">)>
+
+<PRINC " Suspect: An INTERLOGIC Mystery
+">
+
+<BLOAT 90000 0 0 3500 0 0 0 0 0 512>
+
+<SET REDEFINE T>
+
+;<GLOBAL BIGFIX 10000>
+
+<OR <GASSIGNED? ZILCH>
+    <SETG WBREAKS <STRING !\" !,WBREAKS>>>
+
+<DEFINE IFILE (STR "OPTIONAL" (FLOAD? <>) "AUX" (TIM <TIME>))
+       <INSERT-FILE .STR .FLOAD?>>
+
+<DIRECTIONS NORTH SOUTH EAST WEST NE NW SE SW UP DOWN IN OUT>
+
+<CONSTANT SERIAL 0>
+<PROPDEF SIZE 5>
+<PROPDEF CAPACITY 0>
+
+<COND (<GASSIGNED? PREDGEN>
+       <SETG ZSTR-ON <SETG ZSTR-OFF ,TIME>>)>
+
+<IFILE "MACROS" T>
+<IFILE "SYNTAX" T>
+
+%<DEBUG-CODE <IFILE "DEBUG" T>>
+
+<IFILE "PARSER" T>
+<ENDLOAD> ;"ZILCH ignores this, of course"
+<IFILE "CLOCK" T>
+<IFILE "MAIN" T>
+<IFILE "GOAL" T>
+<IFILE "VERBS" T>
+<IFILE "PLACES" T>
+<IFILE "PEOPLE" T>
+<IFILE "THINGS" T>
+<IFILE "EVENTS" T>
+
+<GC-MON T>
+<GC 0 T 5>
diff --git a/m3.zip b/m3.zip
new file mode 100644 (file)
index 0000000..b40920e
Binary files /dev/null and b/m3.zip differ
diff --git a/macros.zil b/macros.zil
new file mode 100644 (file)
index 0000000..2e9de94
--- /dev/null
@@ -0,0 +1,173 @@
+<ZSTR-OFF>
+
+"MACROS for M3
+Copyright (c) 1984 Infocom, Inc.  All rights reserved."
+
+<SETG C-ENABLED? 0>
+<SETG C-ENABLED 1>
+<SETG C-DISABLED 0>
+
+<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 "V">
+                                       <MAPRET '<VPRINT>>)
+                                      (<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 DPRINT .O>>)
+                                             (<=? .P "CD">
+                                              <MAPRET <FORM DPRINT .O T>>)
+                                             (<=? .P "HE/SHE">
+                                              <MAPRET
+                                                <FORM HE/SHE-PRINT .O>>)
+                                             (<=? .P "HIM/HER">
+                                              <MAPRET
+                                                <FORM HIM/HER-PRINT .O>>)
+                                             (<=? .P "HIS/HER">
+                                              <MAPRET
+                                                <FORM HIM/HER-PRINT .O T>>)
+                                             (<=? .P "THE">
+                                              <MAPRET
+                                                <FORM THE-PRINT .O>>)
+                                             (<=? .P "CTHE">
+                                              <MAPRET
+                                                <FORM THE-PRINT .O T>>)
+                                             (<OR <=? .P "A">
+                                                  <=? .P "AN">>
+                                              <MAPRET <FORM PRINTA .O>>)
+                                             (<OR <=? .P "NUM">
+                                                  <=? .P "N">>
+                                              <MAPRET <FORM PRINTN .O>>)
+                                             (<OR <=? .P "CHAR">
+                                                  <=? .P "CHR">
+                                                  <=? .P "C">>
+                                              <MAPRET <FORM PRINTC .O>>)
+                                             (ELSE
+                                              <MAPRET
+                                                <FORM PRINT
+                                                      <FORM GETP .O .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>)>>>>>
+
+<ROUTINE DPRINT (O "OPTIONAL" (CAP? <>) "AUX" S)
+        <COND (<FSET? .O ,THE>
+               <COND (.CAP? <PRINTI "The ">)
+                     (T <PRINTI "the ">)>)>
+        <COND (<SET S <GETP .O ,P?SDESC>>
+               <PRINT .S>)
+              (ELSE <PRINTD .O>)>>
+
+<ROUTINE THE-PRINT (O "OPTIONAL" (CAP? <>) "AUX" S)
+        <COND (<OR <FSET? .O ,THE>
+                   <AND <NOT <FSET? .O ,PERSON>>
+                        <NOT <FSET? .O ,FEMALE>>>>
+               <COND (.CAP? <PRINTI "The ">)
+                     (T <PRINTI "the ">)>)>
+        <COND (<SET S <GETP .O ,P?SDESC>>
+               <PRINT .S>)
+              (ELSE <PRINTD .O>)>>
+
+<ROUTINE HE/SHE-PRINT (O)
+        <COND (<NOT <FSET? .O ,PERSON>> <PRINTI "it">)
+              (<FSET? .O ,FEMALE> <PRINTI "she">)
+              (ELSE <PRINTI "he">)>>
+
+<ROUTINE HIM/HER-PRINT (O "OPTIONAL" (POSSESSIVE? <>))
+        <COND (<NOT <FSET? .O ,PERSON>>
+               <COND (.POSSESSIVE? <PRINTI "it's">)
+                     (ELSE <PRINTI "it">)>)
+              (<FSET? .O ,FEMALE> <PRINTI "her">)
+              (.POSSESSIVE? <PRINTI "his">)
+              (ELSE <PRINTI "him">)>>
+
+<ROUTINE PRINTA (O "AUX" S)
+        <COND (<FSET? .O ,THE> <PRINTI "the ">)
+              (<FSET? .O ,AN> <PRINTI "an ">)
+              (<NOT <FSET? .O ,PERSON>> <PRINTI "a ">)>
+        <COND (<SET S <GETP .O ,P?SDESC>>
+               <PRINT .S>)
+              (ELSE <PRINTD .O>)>>
+
+<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
+                            (<FORM GVAL <PARSE <STRING "V?" <SPNAME .ATM>>>>
+                             !.L)>
+                       <SET ATMS <REST .ATMS>>
+                       <COND (<==? <LENGTH .L> 3> <RETURN!->)>>
+               <SET O (<FORM EQUAL? ',PRSA !.L> !.O)>
+               <SET L ()>>>
+
+<DEFMAC RFATAL ()
+       '<PROG () <PUSH 2> <RSTACK>>>
+
+;<ROUTINE RANDOM-ELEMENT (FROB)
+        <GET .FROB <RANDOM <GET .FROB 0>>>>
+
+<ROUTINE PICK-ONE (FROB
+                  "AUX" (L <GET .FROB 0>) (CNT <GET .FROB 1>) RND MSG RFROB)
+        <SET L <- .L 1>>
+        <SET FROB <REST .FROB 2>>
+        <SET RFROB <REST .FROB <* .CNT 2>>>
+        <SET RND <RANDOM <- .L .CNT>>>
+        <SET MSG <GET .RFROB .RND>>
+        <PUT .RFROB .RND <GET .RFROB 1>>
+        <PUT .RFROB 1 .MSG>
+        <SET CNT <+ .CNT 1>>
+        <COND (<==? .CNT .L> <SET CNT 0>)>
+        <PUT .FROB 0 .CNT>
+        .MSG>
+
+<ROUTINE PROB (BASE)
+        <NOT <L? .BASE <RANDOM 100>>>>
+
+<DEFMAC ENABLE ('INT) <FORM PUT .INT ,C-ENABLED? 1>>
+
+<DEFMAC DISABLE ('INT) <FORM PUT .INT ,C-ENABLED? 0>>
+
+<DEFMAC ENABLED? ('INT) <FORM NOT <FORM EQUAL? <FORM GET .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>>> 
+
+;"DO NOT MAKE THIS A MACRO"
+
+<ROUTINE ABS (NUM)
+       <COND (<L? .NUM 0> <- 0 .NUM>)
+             (T .NUM)>>
+
+<ZSTR-ON>
diff --git a/main.zil b/main.zil
new file mode 100644 (file)
index 0000000..3905eaf
--- /dev/null
+++ b/main.zil
@@ -0,0 +1,379 @@
+"MAIN for M3
+Copyright (C) 1984 Infocom, Inc.  All rights reserved."
+
+<GLOBAL P-WON <>>
+
+<CONSTANT M-FATAL 2>
+
+<CONSTANT M-HANDLED 1>   
+
+;<CONSTANT M-NOT-HANDLED <>>   
+
+<CONSTANT M-BEG 1>  
+
+<CONSTANT M-END 6> 
+
+<CONSTANT M-ENTER 2>
+
+<CONSTANT M-LOOK 3> 
+
+<CONSTANT M-FLASH 4>
+
+<CONSTANT M-OBJDESC 5>
+
+<ROUTINE GO ()
+        <SETG SCORE 21>
+        <SETG WINNER ,PLAYER>
+        <SETG HERE ,BALLROOM-9>
+        <COND (<NOT <FSET? ,HERE ,TOUCHBIT>>
+               <QUEUE-MAIN-EVENTS>
+               <START-MOVEMENT>
+               <V-VERSION>
+               <INTRO>)>
+        <THIS-IS-S-HE ,MICHAEL>
+        <MOVE ,PLAYER ,HERE>
+        <V-LOOK>
+        <I-WAVE>
+        <MAIN-LOOP>
+        <AGAIN>>    
+
+\f
+
+<ROUTINE MAIN-LOOP ("AUX" ICNT OCNT NUM CNT OBJ TBL V PTBL OBJ1 TMP ACTED) 
+   #DECL ((CNT OCNT ICNT NUM) FIX (V) <OR 'T FIX FALSE> (OBJ)<OR FALSE OBJECT>
+         (OBJ1) OBJECT (TBL) TABLE (PTBL) <OR FALSE ATOM>)
+   <REPEAT ()
+     <SET CNT 0>
+     <SET OBJ <>>
+     <SET PTBL T>
+     <SET ACTED <>>
+     <COND (<NOT <==? ,QCONTEXT-ROOM ,HERE>>
+           <SETG QCONTEXT <>>)>
+     <SETG P-WALK-DIR <>> ;"8/24 PER JW"
+     <COND (<SETG P-WON <PARSER>>
+           <SETG LAST-PLAYER-LOC <LOC ,PLAYER>>
+           <COND (<NOT <EQUAL? ,P-WON ,M-FATAL>>
+                  <SET ICNT <GET ,P-PRSI ,P-MATCHLEN>>
+                  <SET NUM
+                       <COND (<0? <SET OCNT <GET ,P-PRSO ,P-MATCHLEN>>> .OCNT)
+                             (<G? .OCNT 1>
+                              <SET TBL ,P-PRSO>
+                              <COND (<0? .ICNT> <SET OBJ <>>)
+                                    (T <SET OBJ <GET ,P-PRSI 1>>)>
+                              .OCNT)
+                             (<G? .ICNT 1>
+                              <SET PTBL <>>
+                              <SET TBL ,P-PRSI>
+                              <SET OBJ <GET ,P-PRSO 1>>
+                              .ICNT)
+                             (T 1)>>
+                  <COND (<AND <NOT .OBJ> <1? .ICNT>>
+                         <SET OBJ <GET ,P-PRSI 1>>)>)
+                 (ELSE <SET NUM 0>)>
+           <COND (<AND <==? ,PRSA ,V?WALK> ,P-WALK-DIR>
+                  <SET V <PERFORM ,PRSA ,PRSO>>)
+                 (<0? .NUM>
+                  <COND (<OR <EQUAL? ,PRSA ,V?CONTINUE>
+                             <0? <BAND <GETB ,P-SYNTAX ,P-SBITS> ,P-SONUMS>>>
+                         <SET V <PERFORM ,PRSA>>
+                         <SETG PRSO <>>)
+                        (T
+                         <TELL-NOTHING-TO>
+                         <SET V <>>)>)
+                 (<AND .PTBL
+                       <G? .NUM 1>
+                       <VERB? ARREST COMPARE EXAMINE>>
+                  <SET V <PERFORM ,PRSA ,OBJECT-PAIR>>)
+                 (T
+                  <SET TMP 0>
+                  <REPEAT ()
+                   <COND (<G? <SET CNT <+ .CNT 1>> .NUM>
+                          <COND (<G? .TMP 0>
+                                 <TELL "The other object">
+                                 <COND (<NOT <EQUAL? .TMP 1>>
+                                        <TELL "s">)>
+                                 <TELL " that you mentioned ">
+                                 <COND (<NOT <EQUAL? .TMP 1>>
+                                        <TELL "are">)
+                                       (T <TELL "is">)>
+                                 <TELL "n't">
+                                 <TELL-HERE>)
+                                (<NOT .ACTED>
+                                 <TELL-NOTHING-TO>)>
+                          <RETURN>)
+                         (T
+                          <COND (.PTBL <SET OBJ1 <GET ,P-PRSO .CNT>>)
+                                (T <SET OBJ1 <GET ,P-PRSI .CNT>>)>
+                          <COND (<G? .NUM 1>
+;"start of reformatted shit"
+<COND (<==? .OBJ1 ,NOT-HERE-OBJECT>
+       <SET TMP <+ .TMP 1>>
+       <AGAIN>)
+      (<EQUAL? ,P-GETFLAGS ,P-ALL>
+       <COND (<AND <VERB? TAKE>
+                  <OR <AND <NOT <EQUAL? <LOC .OBJ1>
+                                        ,WINNER ,HERE .OBJ>>
+                           <NOT <FSET? <LOC .OBJ1> ,SURFACEBIT>>>
+                      <AND <NOT <FSET? .OBJ1 ,TAKEBIT>>
+                           <NOT <FSET? .OBJ1 ,TRYTAKEBIT>>>>>
+             <AGAIN>)
+            (<AND <VERB? TAKE>
+                  .OBJ
+                  <OR <==? .OBJ .OBJ1>
+                      <NOT <IN? .OBJ1 .OBJ>>>>
+             <AGAIN>)
+            (<AND <VERB? DROP>
+                  <NOT <IN? .OBJ1 ,WINNER>>
+                  ;"next frob semied by JW"
+                  ;<NOT <IN? ,P-IT-OBJECT
+                             ,WINNER>>>
+             <AGAIN>)
+            (<AND <VERB? PUT>
+                  <HELD? .OBJ1 .OBJ>>
+             <AGAIN>)>)>
+;"end of reformated shit"
+                                 <COND (<EQUAL? .OBJ1 ,IT>
+                                        <TELL D ,P-IT-OBJECT>)
+                                       (T <TELL D .OBJ1>)>
+                                 <TELL ": ">)>
+                          <SET V
+                               <QCONTEXT-CHECK
+                                <COND (.PTBL .OBJ1) (T .OBJ)>
+                                <COND (.PTBL .OBJ)(T .OBJ1)>>>
+                          <SET ACTED T>
+                          <SET V
+                               <PERFORM ,PRSA ;"? SETG PRSx to these?"
+                                        <COND (.PTBL .OBJ1) (T .OBJ)>
+                                        <COND (.PTBL .OBJ)(T .OBJ1)>>>
+                          <COND (<==? .V ,M-FATAL> <RETURN>)>)>>)>
+           <COND (<==? .V ,M-FATAL> <SETG P-CONT <>>)>)
+          (T
+           <SETG P-CONT <>>)>
+     <COND (,P-WON
+           %<DEBUG-CODE
+             <COND (<VERB? $NEXT $WHERE $DEBUG $TANDY $GOAL
+                           $TABLE $FOLLOW $SCORE $HANDLE>
+                    <AGAIN>)>>
+           <COND (<VERB? TELL
+                         BRIEF SUPER-BRIEF VERBOSE
+                         SAVE RESTORE RESTART
+                         SPACE UNSPACE
+                         SCRIPT UNSCRIPT
+                         VERSION SCORE TIME
+                         $VERIFY>
+                  T)
+                 (T
+                  <SET V <CLOCKER>>)>)>>>
+
+<GLOBAL LAST-PLAYER-LOC <>>
+
+<ROUTINE TELL-NOTHING-TO ("AUX" TMP)
+        <TELL "There isn't anything to ">
+        <SET TMP <GET ,P-ITBL ,P-VERBN>>
+        <COND (,P-MERGED
+               <PRINTB <GET .TMP 0>>)
+              (T
+               <WORD-PRINT <GETB .TMP 2> <GETB .TMP 3>>)>
+        <TELL "." CR>>
+
+<ROUTINE QCONTEXT-CHECK (PRSO PRSI "AUX" OTHER (WHO <>) (N 0))
+        <COND (<VERB? TELL> <RFALSE>)
+              (<OR <VERB? HELP WHAT>
+                   <AND <VERB? TELL-ME>
+                        <EQUAL? .PRSO ,PLAYER ,ME>>
+                   <AND <VERB? SHOW GIVE>
+                        <EQUAL? .PRSI ,PLAYER ,ME>>>
+               <SET OTHER <FIRST? ,HERE>>
+               <REPEAT ()
+                       <COND (<NOT .OTHER> <RETURN>)
+                             (<FSET? .OTHER ,PERSON>
+                              <SET N <+ 1 .N>>
+                              <SET WHO .OTHER>)>
+                       <SET OTHER <NEXT? .OTHER>>>
+               <COND (<AND <==? 1 .N> <NOT ,QCONTEXT>>
+                      <SAID-TO .WHO>)>
+               <COND (<AND ,QCONTEXT
+                           <IN? ,QCONTEXT ,HERE>
+                           <==? ,QCONTEXT-ROOM ,HERE>
+                           <==? ,WINNER ,PLAYER>> ;"? more?"
+                      <SETG WINNER ,QCONTEXT>
+                      <TELL "(said to " D ,QCONTEXT ")" CR>)>)>>
+
+<ROUTINE SAID-TO (WHO)
+ <SETG WINNER .WHO>
+ <SETG QCONTEXT .WHO>
+ <SETG QCONTEXT-ROOM ,HERE>>
+
+<GLOBAL L-PRSA <>>  
+<GLOBAL L-PRSO <>>  
+<GLOBAL L-PRSI <>>  
+\f
+<ROUTINE FAKE-ORPHAN ()
+        <ORPHAN ,P-SYNTAX <>>
+        <TELL "Be specific: ">
+        <VERB-PRINT ,P-OTBL>
+        <SETG P-OFLAG T>
+        <SETG P-WON <>>
+        <TELL " what object?" CR>>
+
+<GLOBAL NOW-PRSI <>>
+
+<ROUTINE NULL-F () <RFALSE>>
+
+<ROUTINE PERFORM (A "OPTIONAL" (O <>) (I <>) "AUX" V OA OO OI WALK?) 
+       #DECL ((A) FIX (O) <OR FALSE OBJECT FIX> (I) <OR FALSE OBJECT> (V)ANY)
+       %<DEBUG-CODE
+         <COND (,HDEBUG
+                <TELL "[Perform: ">
+                %<COND (<GASSIGNED? PREDGEN> '<TELL N .A>)
+                       (T '<PRINT <SPNAME <NTH ,ACTIONS <+ <* .A 2> 1>>>>)>
+                <COND (.O
+                       <COND (<AND <==? .A ,V?WALK>
+                                   ,P-WALK-DIR>
+                              <TELL "/" N .O>)
+                             (ELSE
+                              <TELL "/" D .O>)>)>
+                <COND (.I <TELL "/" D .I>)>
+                <TELL "]" CR>)>>
+       <SET OA ,PRSA>
+       <SET OO ,PRSO>
+       <SET OI ,PRSI>
+       <SETG PRSA .A>
+       <SET WALK? <AND <VERB? WALK> ,P-WALK-DIR>>
+       <COND (.WALK? T)
+             (<AND ,P-IT-OBJECT
+                   <EQUAL? ,IT .I .O>
+                   <NOT <EQUAL? ,P-IT-LOC ,HERE>>>
+              <COND (<NOT .I> <FAKE-ORPHAN>)
+                    (T
+                     <TELL CTHE ,P-IT-OBJECT ,ISNT-HERE CR>)>
+              <RFATAL>)
+             (<AND <EQUAL? ,HIM-HER .I .O>
+                   <NOT <EQUAL? <META-LOC ,P-HIM-HER> ,HERE>>>
+              <THIS-IS-S-HE <CHARACTERIZE ,P-HIM-HER>>)>
+       <COND (.WALK? T)
+             (<==? .O ,IT>
+              <COND (,P-IT-OBJECT <SET O ,P-IT-OBJECT>)
+                    (ELSE <SET O ,P-HIM-HER>)>)
+             (<==? .O ,HIM-HER> <SET O ,P-HIM-HER>)>
+       <COND (.WALK? T)
+             (<==? .I ,IT>
+              <COND (,P-IT-OBJECT <SET I ,P-IT-OBJECT>)
+                    (ELSE <SET I ,P-HIM-HER>)>)
+             (<==? .I ,HIM-HER> <SET I ,P-HIM-HER>)>
+       <SETG PRSO .O>
+       <SETG PRSI .I>
+       <COND (<AND ,PRSO
+                   <NOT .WALK?>
+                   <EQUAL? ,HERE <META-LOC ,WINNER>>>
+              <COND (<FSET? ,PRSO ,PERSON>
+                     <COND (<EQUAL? ,PRSO ,CORPSE>
+                            <THIS-IS-IT ,PRSO>)>
+                     <THIS-IS-S-HE ,PRSO>)
+                    (T
+                     <THIS-IS-IT ,PRSO>)>)>
+       <COND (<AND <NOT <VERB? AGAIN WALK $DISCOVER>>
+                   <EQUAL? ,WINNER ,PLAYER>>
+              <SETG L-PRSA .A>
+              <SETG L-PRSO .O>
+              <SETG L-PRSI .I>)>
+       <COND (<AND <NOT .WALK?>
+                   <EQUAL? ,NOT-HERE-OBJECT ,PRSO ,PRSI>
+                   <SET V
+                        %<DEBUG-CODE
+                          <D-APPLY "Not Here" ,NOT-HERE-OBJECT-F>
+                          <APPLY ,NOT-HERE-OBJECT-F>>>>
+              .V)
+             (<AND <SET O ,PRSO> <SET I ,PRSI> <NULL-F>>
+              %<DEBUG-CODE
+                <TELL "[in case last clause changed PRSx]">>)
+             (<SET V
+                   %<DEBUG-CODE
+                     <DD-APPLY "Actor" ,WINNER <GETP ,WINNER ,P?ACTION>>
+                     <APPLY <GETP ,WINNER ,P?ACTION>>>>
+              .V)
+             (<SET V
+                   %<DEBUG-CODE
+                     <D-APPLY "Room (M-BEG)"
+                              <GETP <LOC ,WINNER> ,P?ACTION>
+                              ,M-BEG>
+                     <APPLY <GETP <LOC ,WINNER> ,P?ACTION>
+                            ,M-BEG>>>
+              .V)
+             (<SET V
+                   %<DEBUG-CODE
+                     <D-APPLY "Preaction"
+                              <GET ,PREACTIONS .A>>
+                     <APPLY <GET ,PREACTIONS .A>>>>
+              .V)
+             (<AND .I
+                   <SETG NOW-PRSI T>
+                   <SET V
+                        %<DEBUG-CODE
+                          <D-APPLY "PRSI" <GETP .I ,P?ACTION>>
+                          <APPLY <GETP .I ,P?ACTION>>>>>
+              .V)
+             (<AND <NOT <SETG NOW-PRSI <>>>
+                   .O
+                   <NOT .WALK?>
+                   <LOC .O>
+                   <GETP <LOC .O> ,P?CONTFCN>
+                   <SET V
+                        %<DEBUG-CODE
+                          <DD-APPLY "Container" <LOC .O>
+                                    <GETP <LOC .O> ,P?CONTFCN>>
+                          <APPLY <GETP <LOC .O> ,P?CONTFCN>>>>>
+              .V)
+             (<AND .O
+                   <NOT .WALK?>
+                   <SET V
+                        %<DEBUG-CODE
+                          <D-APPLY "PRSO"
+                                   <GETP .O ,P?ACTION>>
+                          <APPLY <GETP .O ,P?ACTION>>>>>
+              .V)
+             (<SET V
+                   %<DEBUG-CODE
+                     <D-APPLY <>
+                              <GET ,ACTIONS .A>>
+                     <APPLY <GET ,ACTIONS .A>>>>
+              .V)>
+       <COND (<NOT <==? .V ,M-FATAL>>
+              <COND (<==? <LOC ,WINNER> ,PRSO> ;"was not in compiled PERFORM"
+                     <SETG PRSO <>>)>
+              <SET V
+                   %<DEBUG-CODE
+                     <D-APPLY "Room (M-END)"
+                              <GETP <LOC ,WINNER> ,P?ACTION> ,M-END>
+                     <APPLY <GETP <LOC ,WINNER> ,P?ACTION> ,M-END>>>)>
+       <SETG PRSA .OA>
+       <SETG PRSO .OO>
+       <SETG PRSI .OI>
+       .V>
+
+%<DEBUG-CODE
+  <ROUTINE DD-APPLY (STR OBJ FCN)
+          <COND (,HDEBUG <TELL "[" D .OBJ "=]">)>
+          <D-APPLY .STR .FCN>>>
+
+%<DEBUG-CODE
+  <ROUTINE D-APPLY (STR FCN "OPTIONAL" (FOO <>) "AUX" RES)
+       <COND (<NOT .FCN> <>)
+             (T
+              <COND (,HDEBUG
+                     <COND (<NOT .STR>
+                            <TELL "[Action:]" CR>)
+                           (T <TELL "[" .STR ": ">)>)>
+              <SET RES
+                   <COND (.FOO <APPLY .FCN .FOO>)
+                         (T <APPLY .FCN>)>>
+              %<DEBUG-CODE
+                <COND (<AND ,HDEBUG .STR>
+                       <COND (<==? .RES ,M-FATAL>
+                              <TELL "Fatal]" CR>)
+                             (<NOT .RES>
+                              <TELL "Not handled]" CR>)
+                             (T <TELL "Handled]" CR>)>)>>
+              .RES)>>>
diff --git a/p.zil b/p.zil
new file mode 100644 (file)
index 0000000..ea22d16
--- /dev/null
+++ b/p.zil
@@ -0,0 +1,5 @@
+
+<DEFINE PZSUBR (Z) <PRINC!- "#ZSUBR "><PRIN1!- <NTH <NTH .Z 2>>>>
+<PRINTTYPE ZSUBR ,PZSUBR>
+<DEFINE PRSUBR (R) <PRINC!- "#RSUBR-ENTRY "><PRIN1!- <NTH .R 2>>>
+<PRINTTYPE RSUBR-ENTRY ,PRSUBR>
diff --git a/parser.zil b/parser.zil
new file mode 100644 (file)
index 0000000..5614421
--- /dev/null
@@ -0,0 +1,1408 @@
+"PARSER for M3
+Copyright (C) 1984 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 GWIM-DISABLE <>> 
+<GLOBAL PRSA 0>
+<GLOBAL PRSI 0>
+
+<GLOBAL PRSO 0>
+
+<GLOBAL P-TABLE 0>  
+<GLOBAL P-ONEOBJ 0> 
+<GLOBAL P-SYNTAX 0> 
+;<GLOBAL P-CCSRC 0>  
+<GLOBAL P-LEN 0>    
+<GLOBAL P-DIR 0>    
+<GLOBAL HERE 0>
+<GLOBAL WINNER 0>   
+<GLOBAL P-LEXV <ITABLE BYTE 120>>
+;"INBUF - Input buffer for READ"   
+<GLOBAL P-INBUF <ITABLE BYTE 100>>
+;"Parse-cont variable"  
+<GLOBAL P-CONT <>>  
+<GLOBAL P-IT-OBJECT <>>
+<GLOBAL P-IT-LOC <>>
+
+<GLOBAL P-HIM-HER <>>
+<GLOBAL P-HIM-HER-LOC <>>
+<ROUTINE THIS-IS-S-HE (PER)
+        %<DEBUG-CODE
+          <COND (,IDEBUG
+                 <TELL "["
+                       <COND (<FSET? .PER ,FEMALE> "She")
+                             (T "He")>
+                       "'s " D .PER "]" CR>)>>
+        <SETG P-HIM-HER .PER>
+        <SETG P-HIM-HER-LOC <LOC .PER>>>
+
+;"Orphan flag" 
+<GLOBAL P-OFLAG <>> 
+<GLOBAL P-MERGED <>>
+
+<GLOBAL P-ACLAUSE <>>    
+<GLOBAL P-ANAM <>>  
+<GLOBAL P-AADJ <>>
+;"Parser variables and temporaries"
+<CONSTANT P-PHRLEN 3>    
+<CONSTANT P-ORPHLEN 7>   
+<CONSTANT P-RTLEN 3>
+;"Byte offset to # of entries in LEXV"
+\f
+<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 4>
+;"Offset to first part of speech"
+<CONSTANT P-P1OFF 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 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 <>>
+
+" Grovel down the input finding the verb, prepositions, and noun clauses.
+   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 clause lookup."   
+\f
+
+;<GLOBAL X-IS-LISTENING <>>
+
+<ROUTINE PARSER ("AUX" (PTR ,P-LEXSTART) WORD (VAL 0) (VERB <>)
+                      LEN (DIR <>) (NW 0) (LW 0) NUM SCNT (CNT -1) OWINNER) 
+       <REPEAT ()
+               <COND (<G? <SET CNT <+ .CNT 1>> ,P-ITBLLEN> <RETURN>)
+                     (T <PUT ,P-ITBL .CNT 0>)>>
+       <SETG P-NAM <>>
+       <SETG P-ADJ <>>
+       <SETG P-MERGED <>>
+       <PUT ,P-PRSO ,P-MATCHLEN 0>
+       <PUT ,P-PRSI ,P-MATCHLEN 0>
+       <PUT ,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 HERE <LOC ,WINNER>>)>)>
+       <COND (,P-CONT
+              <SET PTR ,P-CONT>
+              <SETG P-CONT <>>
+              <COND (<NOT <VERB? TELL>> <CRLF>)>)
+             (T
+              <SETG WINNER ,PLAYER>
+              <SETG QUOTE-FLAG <>>
+              <COND (<NOT <FSET? <LOC ,WINNER> ,VEHBIT>>
+                     <SETG HERE <LOC ,WINNER>>)>
+              <SET SCNT ,P-SPACE>
+              <REPEAT ()
+                      <COND (<L? <SET SCNT <- .SCNT 1>> 0> <RETURN>)
+                            (T <CRLF>)>>
+              <PUTB ,P-LEXV 0 59>
+              <TELL ">">
+              <READ ,P-INBUF ,P-LEXV>)>
+       <SETG P-LEN <GETB ,P-LEXV ,P-LEXWORDS>>
+       <COND (<0? ,P-LEN>
+              <COND (<GET <GET ,GOAL-TABLES ,PLAYER-C> ,GOAL-S>
+                     <SETG PRSA ,V?CONTINUE>
+                     <SETG PRSO <>>
+                     <SETG PRSI <>>
+                     <RFATAL>)
+                    (ELSE
+                     <TELL "What?" CR>
+                     <RFALSE>)>)
+             (<OR <EQUAL? <SET WORD <GET ,P-LEXV .PTR>> ,W?WHY ,W?HOW ,W?WHEN>
+                  <EQUAL? .WORD ,W?DID>>
+              <TELL
+"Sorry, but this program can't handle questions like that.
+Check your manual for more details." CR>
+              <RFALSE>)>
+       <SET LEN ,P-LEN>
+       <SETG P-DIR <>>
+       <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>)
+                     (<OR <SET WORD <GET ,P-LEXV .PTR>>
+                          <SET WORD <NUMBER? .PTR>>>
+                      <COND (<AND <==? .WORD ,W?TO>
+                                  <EQUAL? .VERB ,ACT?TELL ,ACT?ASK>>
+                             <SET WORD ,W?QUOTE>)
+                            (<AND <==? .WORD ,W?THEN>
+                                  <NOT .VERB>>
+                             <PUT ,P-ITBL ,P-VERB ,ACT?TELL>
+                             <PUT ,P-ITBL ,P-VERBN 0>
+                             <SET WORD ,W?QUOTE>)>
+                      <COND (<ABBREV? .LW .WORD> <SET LW 0>)
+                            (<OR <EQUAL? .WORD ,W?THEN ,W?PERIOD>
+                                 <EQUAL? .WORD ,W?QUOTE>> 
+                             <COND (<EQUAL? .WORD ,W?QUOTE>
+                                    <COND (,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? .WORD
+                                            ,PS?DIRECTION
+                                            ,P1?DIRECTION>>
+                                  <OR <==? .LEN 1>
+                                      <AND <==? .LEN 2><==? .VERB ,ACT?WALK>>
+                                      <AND <EQUAL? <SET NW
+                                                    <GET ,P-LEXV
+                                                        <+ .PTR ,P-LEXELEN>>>
+                                                   ,W?THEN
+                                                   ,W?QUOTE>
+                                           <G? .LEN 2>>
+                                      <AND <EQUAL? .NW ,W?PERIOD>
+                                           <G? .LEN 1>>
+                                      <AND ,QUOTE-FLAG
+                                           <==? .LEN 2>
+                                           <EQUAL? .NW ,W?QUOTE>>
+                                      <AND <G? .LEN 2>
+                                           <EQUAL? .NW ,W?COMMA ,W?AND>>>>
+                             <SET DIR .VAL>
+                             <COND (<EQUAL? .NW ,W?COMMA ,W?AND>
+                                    <PUT ,P-LEXV
+                                         <+ .PTR ,P-LEXELEN>
+                                         ,W?THEN>)>
+                             <COND (<NOT <G? .LEN 2>>
+                                    <SETG QUOTE-FLAG <>>
+                                    <RETURN>)>)
+                            (<AND <SET VAL <WT? .WORD ,PS?VERB ,P1?VERB>>
+                                  <OR <NOT .VERB>
+                                      <AND <EQUAL? .VERB ,ACT?WHAT>
+                                           <NOT <EQUAL? .WORD ,W?IS>>>>>
+                             <SET VERB .VAL>
+                             <PUT ,P-ITBL ,P-VERB .VAL>
+                             <PUT ,P-ITBL ,P-VERBN ,P-VTBL>
+                             <PUT ,P-VTBL 0 .WORD>
+                             <PUTB ,P-VTBL 2 <GETB ,P-LEXV
+                                                   <SET NUM
+                                                        <+ <* .PTR 2> 2>>>>
+                             <PUTB ,P-VTBL 3 <GETB ,P-LEXV <+ .NUM 1>>>)
+                            (<OR <SET VAL <WT? .WORD ,PS?PREPOSITION 0>>
+                                 <AND <OR <EQUAL? .WORD ,W?ALL ,W?ONE ,W?A>
+                                          <WT? .WORD ,PS?ADJECTIVE>
+                                          <WT? .WORD ,PS?OBJECT>>
+                                      <SET VAL 0>>>
+                             <COND (<AND <G? ,P-LEN 0>
+                                         <==? <GET ,P-LEXV
+                                                   <+ .PTR ,P-LEXELEN>>
+                                              ,W?OF>
+                                         <NOT <EQUAL? .VERB
+                                                      ,ACT?ACCUSE
+                                                      ,ACT?MAKE>>
+                                         <0? .VAL>
+                                         <NOT <EQUAL? .WORD
+                                                      ,W?ALL ,W?ONE ,W?A>>>)
+                                   (<AND <NOT <0? .VAL>>
+                                         <OR <0? ,P-LEN>
+                                             <EQUAL? <GET ,P-LEXV <+ .PTR 2>>
+                                                     ,W?THEN ,W?PERIOD>>>
+                                    <COND (<L? ,P-NCN 2>
+                                           <PUT ,P-ITBL ,P-PREP1 .VAL>
+                                           <PUT ,P-ITBL ,P-PREP1N .WORD>)>)
+                                   (<==? ,P-NCN 2>
+                                    <TELL
+"There were more than two nouns in that sentence." CR>
+                                    <RFALSE>)
+                                   (T
+                                    <SETG P-NCN <+ ,P-NCN 1>>
+                                    <OR <SET PTR <CLAUSE .PTR .VAL .WORD>>
+                                        <RFALSE>>
+                                    <COND (<L? .PTR 0>
+                                           <SETG QUOTE-FLAG <>>
+                                           <RETURN>)>)>)
+                            (<WT? .WORD ,PS?BUZZ-WORD>)
+                            (T
+                             <CANT-USE .PTR>
+                             <RFALSE>)>)
+                     (T
+                      <UNKNOWN-WORD .PTR>
+                      <RFALSE>)>
+               <SET LW .WORD>
+               <SET PTR <+ .PTR ,P-LEXELEN>>>
+       <COND (.DIR
+              <SETG PRSA ,V?WALK>
+              <SETG P-WALK-DIR .DIR>
+              <SETG PRSO .DIR>
+              <SETG P-OFLAG <>>
+              <RETURN T>)>
+       <COND (<AND ,P-OFLAG <ORPHAN-MERGE>>
+              <SETG WINNER .OWINNER>)>
+       <COND (<==? <GET ,P-ITBL ,P-VERB> 0>
+              <PUT ,P-ITBL ,P-VERB ,ACT?$CALL>)>
+       <COND (<AND <SYNTAX-CHECK> <SNARF-OBJECTS> <TAKE-CHECK> <MANY-CHECK>>
+              T)>>
+
+"add any word that's a legit abbreviation here"
+
+<ROUTINE ABBREV? (LW WORD)
+        <AND <EQUAL? .WORD ,W?PERIOD>
+             <OR <EQUAL? .LW ,W?MRS ,W?MR ,W?MS>
+                 <EQUAL? .LW ,W?SGT ,W?COL ,W?SEN>>>>
+
+\f
+
+<ROUTINE WT? (PTR BIT "OPTIONAL" (B1 5) "AUX" (OFFSET ,P-P1OFF) TYP) 
+       <COND (<BTST <SET TYP <GETB .PTR ,P-PSOFF>> .BIT>
+              <COND (<G? .B1 4> <RTRUE>)
+                    (T
+                     <SET TYP <BAND .TYP ,P-P1BITS>>
+                     <COND (<NOT <==? .TYP .B1>> <SET OFFSET <+ .OFFSET 1>>)>
+                     <GETB .PTR .OFFSET>)>)>>
+"Scan through a noun clause, leave a pointer to its starting location"
+
+<ROUTINE CLAUSE (PTR VAL WORD "AUX" OFF NUM (ANDFLG <>) (FIRST?? T) NW (LW 0)) 
+       #DECL ((PTR VAL OFF NUM) FIX (WORD NW) <OR FALSE FIX TABLE>
+              (ANDFLG FIRST??) <OR ATOM FALSE>)
+       <SET OFF <* <- ,P-NCN 1> 2>>
+       <COND (<NOT <==? .VAL 0>>
+              <PUT ,P-ITBL <SET NUM <+ ,P-PREP1 .OFF>> .VAL>
+              <PUT ,P-ITBL <+ .NUM 1> .WORD>
+              <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 (<OR <SET WORD <GET ,P-LEXV .PTR>>
+                          <SET WORD <NUMBER? .PTR>>>
+                      <COND (<0? ,P-LEN> <SET NW 0>)
+                            (T <SET NW <GET ,P-LEXV <+ .PTR ,P-LEXELEN>>>)>
+                      <COND (<AND <==? .WORD ,W?OF>
+                                  <EQUAL? <GET ,P-ITBL ,P-VERB>
+                                          ,ACT?ACCUSE ,ACT?MAKE>>
+                             <PUT ,P-LEXV .PTR ,W?WITH>
+                             <SET WORD ,W?WITH>)>
+                      <COND (<ABBREV? .LW .WORD>
+                             <SET LW 0>)
+                            (<EQUAL? .WORD ,W?AND ,W?COMMA> <SET ANDFLG T>)
+                            (<EQUAL? .WORD ,W?ALL ,W?ONE>
+                             <COND (<==? .NW ,W?OF>
+                                    <SETG P-LEN <- ,P-LEN 1>>
+                                    <SET PTR <+ .PTR ,P-LEXELEN>>)>)
+                            (<OR <EQUAL? .WORD ,W?THEN ,W?PERIOD>
+                                 <AND <WT? .WORD ,PS?PREPOSITION>
+                                      <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 ;"3/25/83: next statement added."
+                                      <EQUAL? <GET ,P-ITBL ,P-VERBN> 0>
+                                      <WT? .WORD ,PS?DIRECTION>
+                                      <WT? .WORD ,PS?VERB>>>
+                             <SET PTR <- .PTR 4>>
+                             <PUT ,P-LEXV <+ .PTR 2> ,W?THEN>
+                             <SETG P-LEN <+ ,P-LEN 2>>)
+                            (<WT? .WORD ,PS?OBJECT>
+                             <COND  ;"First clause added 1/10/84 to fix
+                                     'verb AT synonym OF synonym' bug"
+                                   (<AND <G? ,P-LEN 0>
+                                         <EQUAL? .NW ,W?OF>
+                                         <NOT <EQUAL? .WORD ,W?ALL ,W?ONE>>>
+                                    T)
+                                   (<AND <WT? .WORD
+                                              ,PS?ADJECTIVE
+                                              ,P1?ADJECTIVE>
+                                         <NOT <==? .NW 0>>
+                                         <WT? .NW ,PS?OBJECT>>)
+                                   (<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 <>>)>)
+                            (<OR <WT? .WORD ,PS?ADJECTIVE>
+                                 <WT? .WORD ,PS?BUZZ-WORD>>)
+                            (<WT? .WORD ,PS?PREPOSITION> T)
+                            (T
+                             <CANT-USE .PTR>
+                             <RFALSE>)>)
+                     (T <UNKNOWN-WORD .PTR> <RFALSE>)>
+               <SET LW .WORD>
+               <SET FIRST?? <>>
+               <SET PTR <+ .PTR ,P-LEXELEN>>>> 
+
+<ROUTINE NUMBER? (PTR "AUX" CNT BPTR CHR (SUM 0) (TIM <>) (EXC <>))
+        <SET CNT <GETB <REST ,P-LEXV <* .PTR 2>> 2>>
+        <SET BPTR <GETB <REST ,P-LEXV <* .PTR 2>> 3>>
+        <REPEAT ()
+                <COND (<L? <SET CNT <- .CNT 1>> 0> <RETURN>)
+                      (T
+                       <SET CHR <GETB ,P-INBUF .BPTR>>
+                       <COND (<==? .CHR 58>
+                              <COND (.EXC <RFALSE>)>
+                              <SET TIM .SUM>
+                              <SET SUM 0>)
+                             (<==? .CHR 45>
+                              <COND (.TIM <RFALSE>)>
+                              <SET EXC .SUM>
+                              <SET SUM 0>)
+                             (<G? .SUM 9999> <RFALSE>)
+                             (<AND <L? .CHR 58> <G? .CHR 47>>
+                              <SET SUM <+ <* .SUM 10> <- .CHR 48>>>)
+                             (T <RFALSE>)>
+                       <SET BPTR <+ .BPTR 1>>)>>
+        <PUT ,P-LEXV .PTR ,W?INTNUM>
+        <COND (<G? .SUM 9999> <RFALSE>)
+              (.EXC
+               <SETG P-EXCHANGE .EXC>)
+              (.TIM
+               <SETG P-EXCHANGE 0>
+               <COND (<G? .TIM 23> <RFALSE>)
+                     (<G? .TIM 19> T)
+                     (<G? .TIM 12> <RFALSE>)
+                     (<G? .TIM  7> T)
+                     (T <SET TIM <+ 12 .TIM>>)>
+               <SET SUM <+ .SUM <* .TIM 60>>>)
+              (T <SETG P-EXCHANGE 0>)>
+        <SETG P-NUMBER .SUM>
+        ,W?INTNUM>
+
+<GLOBAL P-NUMBER 0>
+<GLOBAL P-EXCHANGE 0>
+\f
+<ROUTINE ORPHAN-MERGE ("AUX" (CNT -1) TEMP VERB BEG END (ADJ <>) WRD) 
+   <SETG P-OFLAG <>>
+   <COND (<WT? <SET WRD <GET <GET ,P-ITBL ,P-VERBN> 0>>
+              ,PS?ADJECTIVE ,P1?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 <0? <SET VERB <GET ,P-ITBL ,P-VERB>>>>
+              <NOT .ADJ>
+              <NOT <==? .VERB <GET ,P-OTBL ,P-VERB>>>>
+         <RFALSE>)
+        (<==? ,P-NCN 2> <RFALSE>)
+        (<AND ,P-CONT
+              <==? .VERB ,ACT?TELL>>
+         <RFALSE>)
+        (<==? <GET ,P-OTBL ,P-NC1> 1>
+         <COND (<OR <==? <SET TEMP <GET ,P-ITBL ,P-PREP1>>
+                         <GET ,P-OTBL ,P-PREP1>>
+                    <0? .TEMP>>
+                <COND (.ADJ
+                       <PUT ,P-OTBL ,P-NC1 <REST ,P-LEXV 2>>
+                       ;<PUT ,P-OTBL ,P-NC1L <REST ,P-LEXV 6>>)
+                      (T
+                       <PUT ,P-OTBL ,P-NC1 <GET ,P-ITBL ,P-NC1>>
+                       ;<PUT ,P-OTBL ,P-NC1L <GET ,P-ITBL ,P-NC1L>>)>
+                <COND (<EQUAL? <GET ,P-ITBL ,P-NC1L> 0>
+                       <PUT ,P-ITBL ,P-NC1L <REST ,P-LEXV 6>>)>
+                <PUT ,P-OTBL ,P-NC1L <GET ,P-ITBL ,P-NC1L>>)
+               (T <RFALSE>)>)
+        (<==? <GET ,P-OTBL ,P-NC2> 1>
+         <COND (<OR <==? <SET TEMP <GET ,P-ITBL ,P-PREP1>>
+                         <GET ,P-OTBL ,P-PREP2>>
+                    <0? .TEMP>>
+                <COND (.ADJ
+                       <PUT ,P-ITBL ,P-NC1 <REST ,P-LEXV 2>>
+                       ;<PUT ,P-ITBL ,P-NC1L <REST ,P-LEXV 6>>)>
+                <PUT ,P-OTBL ,P-NC2 <GET ,P-ITBL ,P-NC1>>
+                <COND (<EQUAL? <GET ,P-ITBL ,P-NC1L> 0>
+                       <PUT ,P-ITBL ,P-NC1L <REST ,P-LEXV 6>>)>
+                <PUT ,P-OTBL ,P-NC2L <GET ,P-ITBL ,P-NC1L>>
+                <SETG P-NCN 2>)
+               (T <RFALSE>)>)
+        (,P-ACLAUSE
+         <COND (<AND <NOT <==? ,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 (<==? .BEG .END>
+                               <COND (.ADJ <ACLAUSE-WIN .ADJ> <RETURN>)
+                                     (T <SETG P-ACLAUSE <>> <RFALSE>)>)
+                              (<AND <NOT .ADJ>
+                                    <OR <BTST <GETB .WRD ,P-PSOFF>
+                                              ,PS?ADJECTIVE> ;"same as WT?"
+                                        <EQUAL? .WRD ,W?ALL ,W?ONE>>>
+                               <SET ADJ .WRD>)
+                              (<==? .WRD ,W?ONE>
+                               <ACLAUSE-WIN .ADJ>
+                               <RETURN>)
+                              (<BTST <GETB .WRD ,P-PSOFF> ,PS?OBJECT>
+                               <COND (<EQUAL? .WRD ,P-ANAM>
+                                      <ACLAUSE-WIN .ADJ>)
+                                     (T
+                                      <NCLAUSE-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>
+   <COND (<NOT <==? <GET ,P-OTBL ,P-NC2> 0>> <SETG P-NCN 2>)
+        (T <SETG P-NCN 1>)>
+   <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 ACLAUSE-WIN (ADJ) 
+       <PUT ,P-ITBL ,P-VERB <GET ,P-OTBL ,P-VERB>>
+       <COND ;(<EQUAL? .ADJ ,W?TEA> ;"special case"
+              <NCLAUSE-WIN>)
+             (T
+              <PUT ,P-CCTBL ,CC-SBPTR ,P-ACLAUSE>
+              <PUT ,P-CCTBL ,CC-SEPTR <+ ,P-ACLAUSE 1>>
+              <PUT ,P-CCTBL ,CC-DBPTR ,P-ACLAUSE>
+              <PUT ,P-CCTBL ,CC-DEPTR <+ ,P-ACLAUSE 1>>
+              <CLAUSE-COPY ,P-OTBL ,P-OTBL .ADJ>)>
+       <AND <NOT <==? <GET ,P-OTBL ,P-NC2> 0>> <SETG P-NCN 2>>
+       <SETG P-ACLAUSE <>>
+       <RTRUE>>
+
+<ROUTINE NCLAUSE-WIN ()
+        <PUT ,P-CCTBL ,CC-SBPTR ,P-NC1>
+       <PUT ,P-CCTBL ,CC-SEPTR ,P-NC1L>
+       <PUT ,P-CCTBL ,CC-DBPTR ,P-ACLAUSE>
+       <PUT ,P-CCTBL ,CC-DEPTR <+ ,P-ACLAUSE 1>>
+       <CLAUSE-COPY ,P-ITBL ,P-OTBL>
+       <AND <NOT <==? <GET ,P-OTBL ,P-NC2> 0>> <SETG P-NCN 2>>
+       <SETG P-ACLAUSE <>>
+       <RTRUE>>
+
+;"These are pre-Hitchhikers versions; replaced by JW 9/17/84"
+;<ROUTINE ORPHAN-MERGE ("AUX" (CNT -1) TEMP VERB BEG END (ADJ <>) WRD) 
+   #DECL ((CNT TEMP VERB) FIX (BEG END) <PRIMTYPE VECTOR> (WRD) TABLE)
+   <SETG P-OFLAG <>>
+   <COND
+    (<AND <NOT <0? <SET VERB <GET ,P-ITBL ,P-VERB>>>>
+         <NOT <==? .VERB <GET ,P-OTBL ,P-VERB>>>>
+     <RFALSE>)
+    (<==? ,P-NCN 2>
+     <RFALSE>)
+    (<==? <GET ,P-OTBL ,P-NC1> 1>
+     <COND (<OR <==? <SET TEMP <GET ,P-ITBL ,P-PREP1>> <GET ,P-OTBL ,P-PREP1>>
+               <0? .TEMP>>
+           <PUT ,P-OTBL ,P-NC1 <GET ,P-ITBL ,P-NC1>>
+           <PUT ,P-OTBL ,P-NC1L <GET ,P-ITBL ,P-NC1L>>)
+          (T <RFALSE>)>)
+    (<==? <GET ,P-OTBL ,P-NC2> 1>
+     <COND (<OR <==? <SET TEMP <GET ,P-ITBL ,P-PREP1>> <GET ,P-OTBL ,P-PREP2>>
+               <0? .TEMP>>
+           <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
+      (<NOT <==? ,P-NCN 1>> <SETG P-ACLAUSE <>> <RFALSE>)
+      (T
+       <SET BEG <GET ,P-ITBL ,P-NC1>>
+       <SET END <GET ,P-ITBL ,P-NC1L>>
+       <REPEAT ()
+              <COND (<==? .BEG .END>
+                     <COND (.ADJ
+                            <ACLAUSE-WIN .ADJ>
+                            <RETURN>)
+                           (T
+                            <SETG P-ACLAUSE <>>
+                            <RFALSE>)>)
+                    (<AND <NOT .ADJ>
+                          <BTST <GETB <SET WRD <GET .BEG 0>> ,P-PSOFF>
+                                ,PS?ADJECTIVE>>
+                     <SET ADJ .WRD>)
+                    (<OR <BTST <GETB .WRD ,P-PSOFF> ,PS?OBJECT>
+                         <==? .WRD ,W?ONE>>
+                     <COND (<NOT <EQUAL? .WRD ,P-ANAM ,W?ONE>> <RFALSE>)
+                           (T
+                            <ACLAUSE-WIN .ADJ>
+                            <RETURN>)>)>
+              <SET BEG <REST .BEG ,P-WORDLEN>>>)>)>
+   <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 ACLAUSE-WIN (ADJ)
+        <SETG P-CCSRC ,P-OTBL>
+        <CLAUSE-COPY ,P-ACLAUSE <+ ,P-ACLAUSE 1> .ADJ>
+        <AND <NOT <==? <GET ,P-OTBL ,P-NC2> 0>>
+             <SETG P-NCN 2>>
+        <SETG P-ACLAUSE <>>
+        <RTRUE>>
+
+;"Print undefined word in input.
+   PTR points to the unknown word in P-LEXV"   
+\f
+<ROUTINE WORD-PRINT (CNT BUF)
+        <REPEAT ()
+                <COND (<DLESS? CNT 0> <RETURN>)
+                      (ELSE
+                       <PRINTC <GETB ,P-INBUF .BUF>>
+                       <SET BUF <+ .BUF 1>>)>>>
+
+<ROUTINE UNKNOWN-WORD (PTR "AUX" BUF) 
+        #DECL ((PTR BUF) FIX)
+        <TELL "Sorry, but the word \"">
+        <SET BUF <REST ,P-LEXV <* .PTR 2>>>
+        <WORD-PRINT <GETB .BUF 2> <GETB .BUF 3>>
+        <TELL "\" is not in the vocabulary you can use." CR>
+        <SETG QUOTE-FLAG <>>
+        <SETG P-OFLAG <>>>
+
+<ROUTINE CANT-USE (PTR "AUX" BUF) 
+        #DECL ((PTR BUF) FIX)
+        <TELL "Sorry, but you can't use the word \"">
+        <SET BUF <REST ,P-LEXV <* .PTR 2>>>
+        <WORD-PRINT <GETB .BUF 2> <GETB .BUF 3>>
+        <TELL "\" in that sense." CR>
+        <SETG QUOTE-FLAG <>>
+        <SETG P-OFLAG <>>>
+
+;" 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) 
+       #DECL ((DRIVE1 DRIVE2) <OR FALSE <PRIMTYPE VECTOR>>
+              (SYN) <PRIMTYPE VECTOR> (LEN NUM VERB PREP) FIX
+              (OBJ) <OR FALSE OBJECT>)
+       <COND (<0? <SET VERB <GET ,P-ITBL ,P-VERB>>>
+              <TELL ,SEEMS-TO-BE "no verb in that sentence." CR>
+              <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 .DRIVE1 .DRIVE2> <RETURN>)
+                            (T
+                             <TELL ,SORRY-I-DONT CR>
+                             <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 ,P-PRSO ,P-MATCHLEN 1>
+              <PUT ,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 ,P-PRSI ,P-MATCHLEN 1>
+              <PUT ,P-PRSI 1 .OBJ>
+              <SYNTAX-FOUND .DRIVE2>)
+             (<EQUAL? .VERB ,ACT?FIND ,ACT?WHAT>
+              <TELL "Sorry, but I can't answer that question." CR>
+              <RFALSE>)
+             (T
+              <COND (<EQUAL? ,WINNER ,PLAYER>
+                     <ORPHAN .DRIVE1 .DRIVE2>
+                     <TELL "What do you want to ">)
+                    (T
+                     <TELL 
+"Next time, say what you want " D ,WINNER " to ">)>
+              <VERB-PRINT ,P-ITBL>
+              <COND (.DRIVE2
+                     <CLAUSE-PRINT ,P-NC1 ,P-NC1L>)>
+              <PREP-PRINT <COND (.DRIVE1 <GETB .DRIVE1 ,P-SPREP1>)
+                                (T <GETB .DRIVE2 ,P-SPREP2>)>>
+              <COND (<EQUAL? ,WINNER ,PLAYER>
+                     <SETG P-OFLAG T>
+                     <TELL "?" CR>)
+                    (T
+                     <SETG P-OFLAG <>>
+                     <TELL "." CR>)>
+              <RFALSE>)>>
+
+<GLOBAL SEEMS-TO-BE "There seems to be ">
+
+<GLOBAL SORRY-I-DONT
+"Sorry, I don't understand. Please rephrase that.">
+
+<ROUTINE VERB-PRINT (TBL "AUX" TMP)
+       <SET TMP <GET .TBL ,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>)>>
+\f
+<ROUTINE ORPHAN (D1 D2 "AUX" (CNT -1)) 
+       #DECL ((D1 D2) <OR FALSE <PRIMTYPE VECTOR>>)
+       <COND (<NOT ,P-MERGED>
+              <PUT ,P-OCLAUSE ,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>>
+       ;<SETG P-CCSRC ,P-ITBL>
+       <REPEAT ()
+               <COND (<IGRTR? CNT ,P-ITBLLEN> <RETURN>)
+                     (T <PUT ,P-OTBL .CNT <GET ,P-ITBL .CNT>>)>>
+       <COND (<==? ,P-NCN 2>
+              <PUT ,P-CCTBL ,CC-SBPTR ,P-NC2>
+              <PUT ,P-CCTBL ,CC-SEPTR ,P-NC2L>
+              <PUT ,P-CCTBL ,CC-DBPTR ,P-NC2>
+              <PUT ,P-CCTBL ,CC-DEPTR ,P-NC2L>
+              <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-DBPTR ,P-NC1>
+              <PUT ,P-CCTBL ,CC-DEPTR ,P-NC1L>
+              <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 (FIRST?? T) (PN <>))
+        #DECL ((BEG END) <PRIMTYPE VECTOR> (CP) <OR FALSE ATOM>)
+        <REPEAT ()
+               <COND (<==? .BEG .END> <RETURN>)
+                     (T
+                      <COND (.NOSP <SET NOSP <>>)
+                            (T <TELL " ">)>
+                      <COND (<==? <SET WRD <GET .BEG 0>> ,W?PERIOD>
+                             <SET NOSP T>)
+                            (<==? .WRD ,W?MRS> <TELL "Mrs."> <SET PN T>)
+                            (<==? .WRD ,W?MS> <TELL "Ms."> <SET PN T>)
+                            (<==? .WRD ,W?MR> <TELL "Mr."> <SET PN T>)
+                            (<==? .WRD ,W?COL> <TELL "Col."> <SET PN T>)
+                            (<OR <EQUAL? .WRD ,W?ASHCROFT ,W?WELLMAN ;"ETC">
+                                 <EQUAL? .WRD ,W?DUFFY>>
+                             <CAPITALIZE .BEG>
+                             <SET PN T>)
+                            (T
+                             <COND (<AND .FIRST?? <NOT .PN> .CP>
+                                    <TELL "the ">)>
+                             <COND (<OR ,P-OFLAG ,P-MERGED> <PRINTB .WRD>)
+                                   (<AND <==? .WRD ,W?IT>
+                                         <==? ,P-IT-LOC ,HERE>>
+                                    <TELL D ,P-IT-OBJECT>)
+                                   (<AND <EQUAL? .WRD ,W?HIM ,W?HER>
+                                         <==? ,P-HIM-HER-LOC ,HERE>>
+                                    <TELL D ,P-HIM-HER>)
+                                   (T
+                                    <WORD-PRINT <GETB .BEG 2> <GETB .BEG 3>>)>
+                             <SET FIRST?? <>>)>)>
+               <SET BEG <REST .BEG ,P-WORDLEN>>>>
+
+<ROUTINE CAPITALIZE (PTR)
+        <PRINTC <- <GETB ,P-INBUF <GETB .PTR 3>> 32>>
+        <WORD-PRINT <- <GETB .PTR 2> 1> <+ <GETB .PTR 3> 1>>>
+
+<ROUTINE PREP-PRINT (PREP "AUX" WRD) 
+       #DECL ((PREP) FIX)
+       <COND (<NOT <0? .PREP>>
+              <TELL " ">
+              <SET WRD <PREP-FIND .PREP>>
+              <COND ;(<==? .WRD ,W?AGAINST> <TELL "against">)
+                    (T <PRINTB .WRD>)>
+              <COND (<AND <==? ,W?SIT <GET <GET ,P-ITBL ,P-VERBN> 0>>
+                          <==? ,W?DOWN .WRD>>  ;"Will it ever work? --SWG"
+                     <TELL " on">)>)>>    
+
+<GLOBAL P-CCTBL <TABLE 0 0 0 0>>  
+
+;"pointers used by CLAUSE-COPY (source/destination beginning/end pointers)"
+<CONSTANT CC-SBPTR 0>
+<CONSTANT CC-SEPTR 1>
+<CONSTANT CC-DBPTR 2>
+<CONSTANT CC-DEPTR 3>
+
+<ROUTINE CLAUSE-COPY (SRC DEST "OPTIONAL" (INSRT <>) "AUX" BEG END)
+       <SET BEG <GET .SRC <GET ,P-CCTBL ,CC-SBPTR>>>
+       <SET END <GET .SRC <GET ,P-CCTBL ,CC-SEPTR>>>
+       <PUT .DEST
+            <GET ,P-CCTBL ,CC-DBPTR>
+            <REST ,P-OCLAUSE
+                  <+ <* <GET ,P-OCLAUSE ,P-MATCHLEN> ,P-LEXELEN> 2>>>
+       <REPEAT ()
+               <COND (<==? .BEG .END>
+                      <PUT .DEST
+                           <GET ,P-CCTBL ,CC-DEPTR>
+                           <REST ,P-OCLAUSE
+                                 <+ <* <GET ,P-OCLAUSE ,P-MATCHLEN> ,P-LEXELEN>
+                                    2>>>
+                      <RETURN>)
+                     (T
+                      <COND (<AND .INSRT <==? ,P-ANAM <GET .BEG 0>>>
+                             <CLAUSE-ADD .INSRT>)>
+                      <CLAUSE-ADD <GET .BEG 0>>)>
+               <SET BEG <REST .BEG ,P-WORDLEN>>>>
+
+;"replaced by above (more general) version 9/17/84 by JW"
+;<ROUTINE CLAUSE-COPY (BPTR EPTR "OPTIONAL" (INSERT <>) "AUX" BEG END) 
+       #DECL ((BPTR EPTR) FIX (BEG END) <PRIMTYPE VECTOR>
+              (INSERT) <OR FALSE TABLE>)
+       <SET BEG <GET ,P-CCSRC .BPTR>>
+       <SET END <GET ,P-CCSRC .EPTR>>
+       <PUT ,P-OTBL
+            .BPTR
+            <REST ,P-OCLAUSE
+                  <+ <* <GET ,P-OCLAUSE ,P-MATCHLEN> ,P-LEXELEN> 2>>>
+       <REPEAT ()
+               <COND (<==? .BEG .END>
+                      <PUT ,P-OTBL
+                           .EPTR
+                           <REST ,P-OCLAUSE
+                                 <+ <* <GET ,P-OCLAUSE ,P-MATCHLEN> ,P-LEXELEN>
+                                    2>>>
+                      <RETURN>)
+                     (T
+                      <COND (<AND .INSERT <==? ,P-ANAM <GET .BEG 0>>>
+                             <CLAUSE-ADD .INSERT>)>
+                      <CLAUSE-ADD <GET .BEG 0>>)>
+               <SET BEG <REST .BEG ,P-WORDLEN>>>>  
+\f
+<ROUTINE CLAUSE-ADD (WRD "AUX" PTR) 
+       #DECL ((WRD) TABLE (PTR) FIX)
+       <SET PTR <+ <GET ,P-OCLAUSE ,P-MATCHLEN> 2>>
+       <PUT ,P-OCLAUSE <- .PTR 1> .WRD>
+       <PUT ,P-OCLAUSE .PTR 0>
+       <PUT ,P-OCLAUSE ,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) 
+       #DECL ((GBIT LBIT) FIX (OBJ) OBJECT)
+       <COND (<==? .GBIT ,RMUNGBIT>
+              <RETURN ,ROOMS>)>
+       <SETG P-GWIMBIT .GBIT>
+       <SETG P-SLOCBITS .LBIT>
+       <PUT ,P-MERGE ,P-MATCHLEN 0>
+       <COND (<GET-OBJECT ,P-MERGE <>>
+              <SETG P-GWIMBIT 0>
+              <COND (<==? <GET ,P-MERGE ,P-MATCHLEN> 1>
+                     <SET OBJ <GET ,P-MERGE 1>>
+                     <TELL "(">
+                     <COND (<NOT <0? .PREP>>
+                            <PRINTB <PREP-FIND .PREP>>
+                            <THE? .OBJ>
+                            <TELL " ">
+                            ;<COND (<NOT <FSET? .OBJ ,PERSON>>
+                                   <TELL " the ">)
+                                  (T <TELL " ">)>)>
+                     <TELL D .OBJ ")" CR>
+                     .OBJ)>)
+             (T <SETG P-GWIMBIT 0> <RFALSE>)>>   
+<ROUTINE SNARF-OBJECTS ("AUX" PTR) 
+       #DECL ((PTR) <OR FIX <PRIMTYPE VECTOR>>)
+       <COND (<NOT <==? <SET PTR <GET ,P-ITBL ,P-NC1>> 0>>
+              <SETG P-SLOCBITS <GETB ,P-SYNTAX ,P-SLOC1>>
+              <OR <SNARFEM .PTR <GET ,P-ITBL ,P-NC1L> ,P-PRSO> <RFALSE>>
+              <OR <0? <GET ,P-BUTS ,P-MATCHLEN>>
+                  <SETG P-PRSO <BUT-MERGE ,P-PRSO>>>)>
+       <COND (<NOT <==? <SET PTR <GET ,P-ITBL ,P-NC2>> 0>>
+              <SETG P-SLOCBITS <GETB ,P-SYNTAX ,P-SLOC2>>
+              <OR <SNARFEM .PTR <GET ,P-ITBL ,P-NC2L> ,P-PRSI> <RFALSE>>
+              <COND (<NOT <0? <GET ,P-BUTS ,P-MATCHLEN>>>
+                     <COND (<==? <GET ,P-PRSI ,P-MATCHLEN> 1>
+                            <SETG P-PRSO <BUT-MERGE ,P-PRSO>>)
+                           (T <SETG P-PRSI <BUT-MERGE ,P-PRSI>>)>)>)>
+       <RTRUE>>  
+\f
+<ROUTINE BUT-MERGE (TBL "AUX" LEN BUTLEN (CNT 1) (MATCHES 0) OBJ NTBL) 
+       #DECL ((TBL NTBL) TABLE (LEN BUTLEN MATCHES) FIX (OBJ) OBJECT)
+       <SET LEN <GET .TBL ,P-MATCHLEN>>
+       <PUT ,P-MERGE ,P-MATCHLEN 0>
+       <REPEAT ()
+               <COND (<DLESS? LEN 0> <RETURN>)
+                     (<ZMEMQ <SET OBJ <GET .TBL .CNT>> ,P-BUTS>)
+                     (T
+                      <PUT ,P-MERGE <+ .MATCHES 1> .OBJ>
+                      <SET MATCHES <+ .MATCHES 1>>)>
+               <SET CNT <+ .CNT 1>>>
+       <PUT ,P-MERGE ,P-MATCHLEN .MATCHES>
+       <SET NTBL ,P-MERGE>
+       <SETG P-MERGE .TBL>
+       .NTBL>    
+<GLOBAL P-NAM <>>   
+<GLOBAL P-XNAM <>>
+
+<GLOBAL P-ADJ <>>   
+<GLOBAL P-XADJ <>>
+
+<GLOBAL P-ADJN <>>  
+<GLOBAL P-XADJN <>>
+
+<GLOBAL P-PRSO <ITABLE NONE 50>>   
+<GLOBAL P-PRSI <ITABLE NONE 50>>   
+<GLOBAL P-BUTS <ITABLE NONE 50>>   
+<GLOBAL P-MERGE <ITABLE NONE 50>>  
+<GLOBAL P-OCLAUSE <ITABLE NONE 50>>
+<GLOBAL P-MATCHLEN 0>    
+<GLOBAL P-GETFLAGS 0>    
+<CONSTANT P-ALL 1>  
+<CONSTANT P-ONE 2>  
+<CONSTANT P-INHIBIT 4>   
+\f
+<GLOBAL P-CSPTR <>>
+<GLOBAL P-CEPTR <>>
+
+<ROUTINE SNARFEM (PTR EPTR TBL "AUX" (AND <>) (BUT <>) LEN WV WORD NW
+                 (WAS-ALL <>)) 
+   #DECL ((TBL) TABLE (PTR EPTR) <PRIMTYPE VECTOR> (AND) <OR ATOM FALSE>
+         (BUT) <OR FALSE TABLE> (WV) <OR FALSE FIX ATOM>)
+   <SETG P-AND <>>
+   <COND (<==? ,P-GETFLAGS ,P-ALL> <SET WAS-ALL T>)>
+   <SETG P-GETFLAGS 0>
+   <SETG P-CSPTR .PTR>
+   <SETG P-CEPTR .EPTR>
+   <PUT ,P-BUTS ,P-MATCHLEN 0>
+   <PUT .TBL ,P-MATCHLEN 0>
+   <SET WORD <GET .PTR 0>>
+   <REPEAT ()
+          <COND (<==? .PTR .EPTR>
+                 <SET WV <GET-OBJECT <OR .BUT .TBL>>>
+                 <COND (.WAS-ALL <SETG P-GETFLAGS ,P-ALL>)>
+                 <RETURN .WV>)
+                (T
+                 <SET NW <GET .PTR ,P-LEXELEN>>
+                 <COND (<==? .WORD ,W?ALL>
+                        <SETG P-GETFLAGS ,P-ALL>
+                        <COND (<==? .NW ,W?OF>
+                               <SET PTR <REST .PTR ,P-WORDLEN>>)>)
+                       (<EQUAL? .WORD ,W?BUT ,W?EXCEPT>
+                        <OR <GET-OBJECT <OR .BUT .TBL>> <RFALSE>>
+                        <SET BUT ,P-BUTS>
+                        <PUT .BUT ,P-MATCHLEN 0>)
+                       (<EQUAL? .WORD ,W?A ,W?ONE>
+                        <COND (<NOT ,P-ADJ>
+                               <SETG P-GETFLAGS ,P-ONE>
+                               <COND (<==? .NW ,W?OF>
+                                      <SET PTR <REST .PTR ,P-WORDLEN>>)>)
+                              (T
+                               <SETG P-NAM ,P-ONEOBJ>
+                               <OR <GET-OBJECT <OR .BUT .TBL>> <RFALSE>>
+                               <AND <0? .NW> <RTRUE>>)>)
+                       (<AND <EQUAL? .WORD ,W?AND ,W?COMMA>
+                             <NOT <EQUAL? .NW ,W?AND ,W?COMMA>>>
+                        <SETG P-AND T>
+                        <OR <GET-OBJECT <OR .BUT .TBL>> <RFALSE>>
+                        T)
+                       (<WT? .WORD ,PS?BUZZ-WORD>)
+                       (<EQUAL? .WORD ,W?AND ,W?COMMA>)
+                       (<==? .WORD ,W?OF>
+                        <COND (<0? ,P-GETFLAGS>
+                               <SETG P-GETFLAGS ,P-INHIBIT>)>)
+                       (<AND <SET WV <WT? .WORD ,PS?ADJECTIVE ,P1?ADJECTIVE>>
+                             <NOT ,P-ADJ>>
+                        <SETG P-ADJ .WV>
+                        <SETG P-ADJN .WORD>)
+                       (<WT? .WORD ,PS?OBJECT ,P1?OBJECT>
+                        <SETG P-NAM .WORD>
+                        <SETG P-ONEOBJ .WORD>)>)>
+          <COND (<NOT <==? .PTR .EPTR>>
+                 <SET PTR <REST .PTR ,P-WORDLEN>>
+                 <SET WORD .NW>)>>>   
+<CONSTANT SH 128> ;"SEARCH HELD"
+<CONSTANT SC 64>  ;"SEARCH CARRIED"    
+<CONSTANT SIR 32> ;"SEARCH IN-ROOM"   
+<CONSTANT SOG 16> ;"SEARCH ON-GROUND"   
+<CONSTANT STAKE 8> ;"TRY TAKE"  
+<CONSTANT SMANY 4> ;"MANY OKAY"  
+<CONSTANT SHAVE 2> ;"MUST HAVE"
+
+<ROUTINE TELL-NO-NOUNS ()
+        <TELL "There aren't enough nouns in that sentence." CR>>
+
+\f
+
+<ROUTINE GET-OBJECT (TBL
+                   "OPTIONAL" (VRB T)
+                   "AUX" BITS LEN XBITS TLEN (GCHECK <>) (OLEN 0) OBJ)
+       #DECL ((TBL) TABLE (XBITS BITS TLEN LEN) FIX (GWIM) <OR FALSE FIX>
+              (VRB GCHECK) <OR ATOM FALSE>)
+ <SET XBITS ,P-SLOCBITS>
+ <SET TLEN <GET .TBL ,P-MATCHLEN>>
+ <COND (<BTST ,P-GETFLAGS ,P-INHIBIT> <RTRUE>)>
+ <COND (<AND <NOT ,P-NAM> ,P-ADJ <WT? ,P-ADJN ,PS?OBJECT ,P1?OBJECT>>
+       <SETG P-NAM ,P-ADJN>
+       <SETG P-ADJ <>>)>
+ <COND (<AND <NOT ,P-NAM>
+            <NOT ,P-ADJ>
+            <NOT <==? ,P-GETFLAGS ,P-ALL>>
+            <0? ,P-GWIMBIT>>
+       <COND (.VRB
+              <TELL-NO-NOUNS>)>
+       <RFALSE>)>
+ <COND (<OR <NOT <==? ,P-GETFLAGS ,P-ALL>> <0? ,P-SLOCBITS>>
+       <SETG P-SLOCBITS -1>)>
+ <SETG P-TABLE .TBL>
+ <PROG ()
+  <COND (.GCHECK <GLOBAL-CHECK .TBL>)
+       (T
+        <FCLEAR ,PLAYER ,TRANSBIT>
+        <DO-SL ,HERE ,SOG ,SIR>
+        <FSET ,PLAYER ,TRANSBIT>
+        <DO-SL ,PLAYER ,SH ,SC>)>
+  <SET LEN <- <GET .TBL ,P-MATCHLEN> .TLEN>>
+  <COND (<BTST ,P-GETFLAGS ,P-ALL>)
+       (<AND <BTST ,P-GETFLAGS ,P-ONE>
+             <NOT <0? .LEN>>>
+        <COND (<NOT <==? .LEN 1>>
+               <PUT .TBL 1 <GET .TBL <RANDOM .LEN>>>
+               <TELL "How about the " D <GET .TBL 1> "?" CR>)>
+        <PUT .TBL ,P-MATCHLEN 1>)
+       (<OR <G? .LEN 1>
+            <AND <0? .LEN> <NOT <==? ,P-SLOCBITS -1>>>>
+        <COND (<==? ,P-SLOCBITS -1>
+               <SETG P-SLOCBITS .XBITS>
+               <SET OLEN .LEN>
+               <PUT .TBL ,P-MATCHLEN <- <GET .TBL ,P-MATCHLEN> .LEN>>
+               <AGAIN>)
+              (T
+               <COND (<0? .LEN> <SET LEN .OLEN>)>
+               <COND (<AND ,P-NAM
+                           ;<VERB? ASK-ABOUT ASK-CONTEXT-ABOUT TELL-ME WHAT
+                                  GIVE SGIVE ASK-FOR ASK-CONTEXT-FOR TAKE
+                                  FIND SEARCH SEARCH-OBJECT-FOR
+                                  MAKE DISEMBARK>
+                           <SET OBJ <GET .TBL <+ .TLEN 1>>>
+                           <SET OBJ
+                                <APPLY <GETP .OBJ ,P?GENERIC>
+                                       ,P-NAM>>>
+                      <COND (<==? .OBJ ,NOT-HERE-OBJECT> <RFALSE>)>
+                      <PUT .TBL 1 .OBJ>
+                      <PUT .TBL ,P-MATCHLEN 1>
+                      <SETG P-NAM <>>
+                      <SETG P-ADJ <>>
+                      <RTRUE>)
+                     (<AND .VRB ,P-NAM>
+                      <WHICH-PRINT .TLEN .LEN .TBL>
+                      <SETG P-ACLAUSE
+                            <COND (<==? .TBL ,P-PRSO> ,P-NC1)
+                                  (T ,P-NC2)>>
+                      <SETG P-AADJ ,P-ADJ>
+                      <SETG P-ANAM ,P-NAM>
+                      <ORPHAN <> <>>
+                      <SETG P-OFLAG T>)
+                     (.VRB
+                      <TELL-NO-NOUNS>)>
+               <SETG P-NAM <>>
+               <SETG P-ADJ <>>
+               <RFALSE>)>)
+       (<AND <0? .LEN> .GCHECK>
+        <SETG P-SLOCBITS .XBITS>
+        <COND (.VRB
+               ;"Changed 6/10/83 - MARC"
+               <OBJ-FOUND ,NOT-HERE-OBJECT .TBL>
+               ;<PUT .TBL ,P-MATCHLEN 1>
+               ;<PUT .TBL 1 ,NOT-HERE-OBJECT>
+               <SETG P-XNAM ,P-NAM>
+               <SETG P-XADJ ,P-ADJ>
+               <SETG P-XADJN ,P-ADJN>
+               <SETG P-NAM <>>
+               <SETG P-ADJ <>>
+               <SETG P-ADJN <>>
+               <RTRUE>)>
+        <SETG P-NAM <>>
+        <SETG P-ADJ <>>
+        <RFALSE>)
+       (<0? .LEN> <SET GCHECK T> <AGAIN>)>
+  <SETG P-SLOCBITS .XBITS>
+  <SETG P-NAM <>>
+  <SETG P-ADJ <>>
+  <RTRUE>>>
+
+<ROUTINE MOBY-FIND (TBL "AUX" FOO LEN)
+        <SETG P-MOBY-FLAG T>
+        <SETG P-TABLE .TBL>
+        <SETG P-SLOCBITS -1>
+        <SETG P-NAM ,P-XNAM>
+        <SETG P-ADJ ,P-XADJ>
+        <PUT .TBL ,P-MATCHLEN 0>
+        <SET FOO <FIRST? ,ROOMS>>
+        <REPEAT ()
+                <COND (<NOT .FOO> <RETURN>)
+                      (T
+                       <SEARCH-LIST .FOO .TBL ,P-SRCALL>
+                       <SET FOO <NEXT? .FOO>>)>>
+        <COND (<EQUAL? <SET LEN <GET .TBL ,P-MATCHLEN>> 0>
+               <DO-SL ,LOCAL-GLOBALS 1 1>)>
+        <COND (<EQUAL? <SET LEN <GET .TBL ,P-MATCHLEN>> 0>
+               <DO-SL ,ROOMS 1 1>)>
+        <COND (<EQUAL? <SET LEN <GET .TBL ,P-MATCHLEN>> 1>
+               <SETG P-MOBY-FOUND <GET .TBL 1>>)>
+        <SETG P-MOBY-FLAG <>>
+        .LEN>
+
+<GLOBAL P-MOBY-FLAG <>>
+<GLOBAL P-MOBY-FOUND <>>
+<GLOBAL P-AND <>>
+
+<ROUTINE WHICH-PRINT (TLEN LEN TBL "AUX" OBJ RLEN)
+        <SET RLEN .LEN>
+        <COND (<EQUAL? ,WINNER ,PLAYER>
+               <TELL "Which">)
+              (ELSE
+               <TELL "Tell " THE ,WINNER " which">)>
+         <COND (<OR ,P-OFLAG ,P-MERGED ,P-AND> <TELL " "> <PRINTB ,P-NAM>)
+              (<==? .TBL ,P-PRSO>
+               <CLAUSE-PRINT ,P-NC1 ,P-NC1L <>>)
+              (T <CLAUSE-PRINT ,P-NC2 ,P-NC2L <>>)>
+        <COND (<EQUAL? ,WINNER ,PLAYER> <TELL " do">)>
+        <TELL " you mean,">
+        <REPEAT ()
+                <SET TLEN <+ .TLEN 1>>
+                <SET OBJ <GET .TBL .TLEN>>
+                <TELL " " THE .OBJ>
+                <COND (<==? .LEN 2>
+                       <COND (<NOT <==? .RLEN 2>> <TELL ",">)>
+                       <TELL " or">)
+                      (<G? .LEN 2> <TELL ",">)>
+                <COND (<L? <SET LEN <- .LEN 1>> 1>
+                       <RETURN>)>>
+        <TELL "?" CR>>
+
+\f
+<ROUTINE GLOBAL-CHECK (TBL "AUX" LEN RMG RMGL (CNT 0) OBJ OBITS FOO) 
+       #DECL ((TBL) TABLE (RMG) <OR FALSE TABLE> (RMGL CNT) FIX (OBJ) OBJECT)
+       <SET LEN <GET .TBL ,P-MATCHLEN>>
+       <SET OBITS ,P-SLOCBITS>
+       <COND (<SET RMG <GETPT ,HERE ,P?GLOBAL>>
+              <SET RMGL <- <PTSIZE .RMG> 1>>
+              <REPEAT ()
+                      <COND (<THIS-IT? <SET OBJ <GETB .RMG .CNT>> .TBL>
+                             <OBJ-FOUND .OBJ .TBL>)>
+                      <COND (<IGRTR? CNT .RMGL> <RETURN>)>>)>
+       <COND (<SET RMG <GETPT ,HERE ,P?PSEUDO>>
+              <SET RMGL <- </ <PTSIZE .RMG> 4> 1>>
+              <SET CNT 0>
+              <REPEAT ()
+                      <COND (<==? ,P-NAM <GET .RMG <* .CNT 2>>>
+                             <PUTP ,PSEUDO-OBJECT
+                                   ,P?ACTION
+                                   <GET .RMG <+ <* .CNT 2> 1>>>
+                             <SET FOO
+                                  <BACK <GETPT ,PSEUDO-OBJECT ,P?ACTION> 5>>
+                             <PUT .FOO 0 <GET ,P-NAM 0>>
+                             <PUT .FOO 1 <GET ,P-NAM 1>>
+                             <OBJ-FOUND ,PSEUDO-OBJECT .TBL>
+                             <RETURN>)
+                            (<IGRTR? CNT .RMGL> <RETURN>)>>)>
+       <COND (<==? <GET .TBL ,P-MATCHLEN> .LEN>
+              <SETG P-SLOCBITS -1>
+              <SETG P-TABLE .TBL>
+              <DO-SL ,GLOBAL-OBJECTS 1 1>
+              <SETG P-SLOCBITS .OBITS>)>>
+
+<ROUTINE DO-SL (OBJ BIT1 BIT2 "AUX" BITS) 
+       #DECL ((OBJ) OBJECT (BIT1 BIT2 BITS) FIX)
+       <COND (<AND <NOT <EQUAL? .OBJ ,ROOMS>>
+                   <BTST ,P-SLOCBITS <+ .BIT1 .BIT2>>>
+              <SEARCH-LIST .OBJ ,P-TABLE ,P-SRCALL>)
+             (T
+              <COND (<BTST ,P-SLOCBITS .BIT1>
+                     <SEARCH-LIST .OBJ ,P-TABLE ,P-SRCTOP>)
+                    (<BTST ,P-SLOCBITS .BIT2>
+                     <SEARCH-LIST .OBJ ,P-TABLE ,P-SRCBOT>)
+                    (T <RTRUE>)>)>>  
+
+<CONSTANT P-SRCBOT 2>    
+<CONSTANT P-SRCTOP 0>    
+<CONSTANT P-SRCALL 1>    
+<ROUTINE SEARCH-LIST (OBJ TBL LVL "AUX" FLS ;NOBJ) 
+       #DECL ((OBJ ;NOBJ) <OR FALSE OBJECT> (TBL) TABLE (LVL) FIX (FLS) ANY)
+ <COND (<SET OBJ <FIRST? .OBJ>>
+       <REPEAT ()
+               <COND (<AND <NOT <==? .LVL ,P-SRCBOT>>
+                           <GETPT .OBJ ,P?SYNONYM>
+                           <THIS-IT? .OBJ .TBL>>
+                      <OBJ-FOUND .OBJ .TBL>)>
+               <COND (<AND <OR <NOT <==? .LVL ,P-SRCTOP>>
+                               <FSET? .OBJ ,SEARCHBIT>
+                               <FSET? .OBJ ,SURFACEBIT>>
+                           <FIRST? .OBJ> ;<SET NOBJ <FIRST? .OBJ>>
+                           <NOT <EQUAL? .OBJ ,PLAYER ,LOCAL-GLOBALS>>
+                           <OR <FSET? .OBJ ,OPENBIT>
+                               <FSET? .OBJ ,TRANSBIT>
+                               ,P-MOBY-FLAG>>
+                      <SET FLS
+                       <SEARCH-LIST .OBJ .TBL
+                                   <COND (<FSET? .OBJ ,SURFACEBIT> ,P-SRCALL)
+                                         (<FSET? .OBJ ,SEARCHBIT> ,P-SRCALL)
+                                         (T ,P-SRCTOP)>>>)>
+               <COND (<SET OBJ <NEXT? .OBJ>>) (T <RETURN>)>>)>>
+
+<ROUTINE THIS-IT? (OBJ TBL "AUX" SYNS) 
+ <COND (<FSET? .OBJ ,INVISIBLE> <RFALSE>)
+       (<AND ,P-NAM
+            <NOT <ZMEMQ ,P-NAM
+                        <SET SYNS <GETPT .OBJ ,P?SYNONYM>>
+                        <- </ <PTSIZE .SYNS> 2> 1>>>>
+       <RFALSE>)
+       (<AND ,P-ADJ
+            <OR <NOT <SET SYNS <GETPT .OBJ ,P?ADJECTIVE>>>
+                <NOT <ZMEMQB ,P-ADJ .SYNS <- <PTSIZE .SYNS> 1>>>>>
+       <RFALSE>)
+       (<AND <NOT <0? ,P-GWIMBIT>> <NOT <FSET? .OBJ ,P-GWIMBIT>>>
+       <RFALSE>)>
+ <RTRUE>> 
+
+<ROUTINE OBJ-FOUND (OBJ TBL "AUX" PTR) 
+       #DECL ((OBJ) OBJECT (TBL) TABLE (PTR) FIX)
+       <SET PTR <GET .TBL ,P-MATCHLEN>>
+       <PUT .TBL <+ .PTR 1> .OBJ>
+       <PUT .TBL ,P-MATCHLEN <+ .PTR 1>>> 
+<ROUTINE TAKE-CHECK () 
+       <AND <ITAKE-CHECK ,P-PRSO <GETB ,P-SYNTAX ,P-SLOC1>>
+            <ITAKE-CHECK ,P-PRSI <GETB ,P-SYNTAX ,P-SLOC2>>>> 
+\f
+<ROUTINE ITAKE-CHECK (TBL BITS "AUX" PTR OBJ TAKEN) 
+        #DECL ((TBL) TABLE (BITS PTR) FIX (OBJ) OBJECT
+               (TAKEN) <OR FALSE FIX ATOM>)
+        <COND (<AND <SET PTR <GET .TBL ,P-MATCHLEN>>
+                    <OR <BTST .BITS ,SHAVE>
+                        <BTST .BITS ,STAKE>>>
+               <REPEAT ()
+                       <COND (<L? <SET PTR <- .PTR 1>> 0> <RETURN>)
+                             (T
+                              <SET OBJ <GET .TBL <+ .PTR 1>>>
+                              <COND (<==? .OBJ ,IT> <SET OBJ ,P-IT-OBJECT>)
+                                    (<==? .OBJ ,HIM-HER>
+                                     <SET OBJ ,P-HIM-HER>)>
+                              <COND (<NOT <HELD? .OBJ>>
+                                     <SETG PRSO .OBJ>
+                                     <COND (<FSET? .OBJ ,TRYTAKEBIT>
+                                            <SET TAKEN T>)
+                                           (<NOT <==? ,WINNER ,PLAYER>>
+                                            <SET TAKEN <>>)
+                                           (<AND <BTST .BITS ,STAKE>
+                                                 <==? <ITAKE <>> T>>
+                                            <SET TAKEN <>>)
+                                           (T <SET TAKEN T>)>
+                                     <COND (<AND .TAKEN <BTST .BITS ,SHAVE>>
+                                            <TELL ,YOU-DONT-HAVE>
+                                            <COND (<EQUAL? .OBJ
+                                                           ,NOT-HERE-OBJECT>
+                                                   <TELL "that">)
+                                                  (T
+                                                   <THIS-IS-IT .OBJ>
+                                                   <TELL THE .OBJ>)>
+                                            <TELL ".">
+                                            <CRLF>
+                                            <RFALSE>)
+                                           (<AND <NOT .TAKEN>
+                                                 <==? ,WINNER ,PLAYER>>
+                                            <TELL "(taking " THE .OBJ
+                                                  " first)" CR>)>)>)>>)
+              (T)>>
+
+<ROUTINE MANY-CHECK ("AUX" (LOSS <>) TMP) 
+       #DECL ((LOSS) <OR FALSE FIX>)
+       <COND (<AND <G? <GET ,P-PRSO ,P-MATCHLEN> 1>
+                   <NOT <BTST <GETB ,P-SYNTAX ,P-SLOC1> ,SMANY>>>
+              <SET LOSS 1>)
+             (<AND <G? <GET ,P-PRSI ,P-MATCHLEN> 1>
+                   <NOT <BTST <GETB ,P-SYNTAX ,P-SLOC2> ,SMANY>>>
+              <SET LOSS 2>)>
+       <COND (.LOSS
+              <TELL "You can't use multiple ">
+              <COND (<==? .LOSS 2> <TELL "in">)>
+              <TELL "direct objects with \"">
+              <SET TMP <GET ,P-ITBL ,P-VERBN>>
+              <COND (<0? .TMP> <TELL "tell">)
+                    (<OR ,P-OFLAG ,P-MERGED>
+                     <PRINTB <GET .TMP 0>>)
+                    (T
+                     <WORD-PRINT <GETB .TMP 2> <GETB .TMP 3>>)>
+              <TELL "\"." CR>
+              <RFALSE>)
+             (T)>>  
+<ROUTINE ZMEMQ (ITM TBL "OPTIONAL" (SIZE -1) "AUX" (CNT 1)) 
+       <COND (<NOT .TBL> <RFALSE>)>
+       <COND (<NOT <L? .SIZE 0>> <SET CNT 0>)
+             (ELSE <SET SIZE <GET .TBL 0>>)>
+       <REPEAT ()
+               <COND (<==? .ITM <GET .TBL .CNT>> <RTRUE>)
+                     (<IGRTR? CNT .SIZE> <RFALSE>)>>>    
+\f
+<ROUTINE ZMEMQB (ITM TBL SIZE "AUX" (CNT 0)) 
+       #DECL ((ITM) ANY (TBL) TABLE (SIZE CNT) FIX)
+       <REPEAT ()
+               <COND (<==? .ITM <GETB .TBL .CNT>> <RTRUE>)
+                     (<IGRTR? CNT .SIZE> <RFALSE>)>>>  
+
diff --git a/people.zil b/people.zil
new file mode 100644 (file)
index 0000000..f1972b3
--- /dev/null
@@ -0,0 +1,4888 @@
+"PEOPLE for M3
+Copyright (C) 1984 Infocom, Inc.  All rights reserved."
+
+"Necessary Flags"
+
+;<GLOBAL LOAD-MAX 100>
+<GLOBAL LOAD-ALLOWED 100>
+
+<ROUTINE GLOBAL-PERSON-F ("AUX" PER)
+        <COND (<VERB? $CALL>
+               <SET PER <CHARACTERIZE ,PRSO>>
+               <COND (<NEARBY? .PER>
+                      <PERFORM ,V?$CALL .PER>
+                      <RTRUE>)
+                     (ELSE <TELL-ISNT-HERE .PER>)>)
+              (<VERB? GIVE>
+               <TELL-ISNT-HERE ,PRSI>)
+              (<VERB? SLAP MUNG KILL ATTACK DANCE HELP
+                      ACCUSE SEARCH LOOK-INSIDE>
+               <TELL-ISNT-HERE ,PRSO>)
+              (<OR <AND <VERB? SHOW REVEAL>
+                        <IN? ,PRSI ,GLOBAL-OBJECTS>
+                        <SET PER ,PRSI>>
+                   <AND <VERB? ASK-ABOUT TELL-ME ;PHONE>
+                        <IN? ,PRSO ,GLOBAL-OBJECTS>
+                        <SET PER ,PRSO>>>
+               <COND (<EQUAL? .PER ,ME> <RFALSE>)
+                     (<NEARBY? .PER>
+                      <TELL
+CD .PER " is waiting for you to come justify your interruption." CR>)
+                     (ELSE
+                      <TELL
+"Your audience isn't listening." CR>)>)>>
+
+<GLOBAL I-DONT-KNOW "\"I don't know ">
+<GLOBAL ISNT-HERE " isn't here.">
+
+<ROUTINE TELL-ISNT-HERE (PER)
+        <TELL CTHE .PER ,ISNT-HERE CR>>
+
+<OBJECT HIM-HER
+       (IN GLOBAL-OBJECTS)
+       (SYNONYM HIM HER THEM GROUP)
+       (DESC "him or her")
+       (FLAGS NDESCBIT)>
+
+<OBJECT YOU
+       (IN GLOBAL-OBJECTS)
+       (SYNONYM YOU YOURSELF HIMSELF HERSELF)
+       (DESC "himself or herself")
+       (FLAGS NDESCBIT)
+       (ACTION YOU-F)>
+
+<ROUTINE YOU-F ()
+        <COND (<AND <VERB? ASK-ABOUT> <EQUAL? ,PRSI ,YOU>>
+               <PERFORM ,V?ASK-ABOUT ,PRSO ,PRSO>
+               <RTRUE>)
+              (<AND <VERB? TELL-ME> <EQUAL? ,PRSI ,YOU>>
+               <PERFORM ,V?TELL-ME ,PRSO ,WINNER>
+               <RTRUE>)>>
+
+<OBJECT OBJECT-PAIR
+       (DESC "such things")
+       (ACTION OBJECT-PAIR-F)>
+
+<ROUTINE LOCALIZE (P)
+        <COND (<AND <FSET? .P ,PERSON>
+                    <IN? .P ,GLOBAL-OBJECTS>
+                    <GETP .P ,P?CHARACTER>>
+               <CHARACTERIZE .P>)
+              (ELSE .P)>>
+
+<ROUTINE CHARACTERIZE (P)
+        <COND (<FSET? .P ,PERSON>
+               <GET ,CHARACTER-TABLE <GETP .P ,P?CHARACTER>>)>>
+
+<ROUTINE CHARACTERIZE? (P)
+        <COND (<SET P <GETP .P ,P?CHARACTER>>
+               <GET ,CHARACTER-TABLE .P>)>>
+
+<ROUTINE OBJECT-PAIR-F ("AUX" P1 P2)
+        <COND (<VERB? ARREST>
+               <TELL-YOU-CANT
+"arrest anyone. Only the police can do that. Besides, this
+seems pretty far-fetched. It could only mean humiliation for you">)
+              (<G? <GET ,P-PRSO ,P-MATCHLEN> 2>
+               <COND (<VERB? EXAMINE COMPARE>
+                      <TELL
+"That's more than one per eye. " ,YOU-ARENT "up to it." CR>)>
+               <RTRUE>)>
+        <SET P1 <1 ,P-PRSO>>
+        <SET P2 <2 ,P-PRSO>>
+        <COND (<VERB? COMPARE>
+               <PERFORM ,PRSA .P1 .P2>
+               <RTRUE>)
+              (<VERB? EXAMINE>
+               <COND (<OR <NOT <FSET? .P1 ,PERSON>>
+                          <NOT <FSET? .P2 ,PERSON>>>
+                      <TELL-BORING>)
+                     (<EQUAL? <LOC .P1> <LOC .P2>>
+                      <TELL-YOU-CANT
+"overhear or see anything out of the ordinary">)
+                     (T <THEY-ARENT "together">)>)>>
+
+<ROUTINE THEY-ARENT (STR)
+        <TELL "They aren't " .STR "." CR>>
+
+<ROUTINE TELL-BORING ()
+        <TELL
+"You see nothing interesting." CR>>
+
+"People"
+
+<OBJECT PLAYER
+       (IN BALLROOM-9)
+       (DESC "reporter")
+       (SYNONYM REPORTER)
+       (ACTION PLAYER-F)
+       (FLAGS NDESCBIT TRANSBIT THE PERSON INVISIBLE)
+       (CHARACTER 0)
+       (SIZE 0)>
+
+<GLOBAL PLAYER-HIDING <>>
+
+<ROUTINE PLAYER-F ()
+        <COND (<EQUAL? ,WINNER ,PLAYER>
+               <COND (<AND <VERB? EXAMINE> <EQUAL? ,PRSO ,PLAYER>>
+                      <TELL
+"You look pretty much like you always do, excepting the fact that you are
+wearing a fairly ridiculous looking " 'COWBOY-COSTUME "." CR>)
+                     (<EQUAL? ,NOT-ROPE ,PRSO ,PRSI>
+                      <NOT-ROPE-F>)
+                     (<AND <VERB? ACCUSE ARREST>
+                           <EQUAL? ,PRSO ,PLAYER ,ME>>
+                      <TELL "Turning yourself in, eh?" CR>)
+                     (<AND <VERB? KILL ATTACK>
+                           <IN? ,PRSO ,HERE>
+                           <NOT <EQUAL? ,PRSO ,CORPSE ,VERONICA ,DOG>>>
+                      <COND (<EQUAL? ,PRSO ,PLAYER>
+                             <TELL "Suicide">)
+                            (<FSET? ,PRSO ,PERSON>
+                             <TELL <COND (<FSET? ,PLAYER ,TOLD>
+                                          "Another ")
+                                         (T "A ")>
+                                   'GLOBAL-MURDER>)
+                            (T
+                             <TELL "This">)>
+                      <TELL " is not the way to clear up this mess." CR>)
+                     (<AND <VERB? GIVE> <EQUAL? ,PRSI ,PLAYER>>
+                      <TELL
+"Taking up juggling, eh?" CR>)
+                     (<AND <VERB? TAKE DANCE> <EQUAL? ,PRSO ,PLAYER>>
+                      <TELL
+"Usually, you say that to someone else." CR>)
+                     (<AND <IN? ,DETECTIVE ,HERE>
+                           <EQUAL? ,TARGET ,PLAYER>>
+                      <COND (<VERB? SSHOW SGIVE> <RFALSE>)
+                            (<AND <PLAYER-ARRESTED? ,DETECTIVE>
+                                  <VERB? WALK WALK-TO FOLLOW THROUGH>>
+                             <RTRUE>)>)
+                     (<AND <IN? ,DETECTIVE ,HERE>
+                           <LAB-RESULTS-TO-PLAYER>>
+                      <CRLF>
+                      <RFALSE> ;"so what you were doing gets handled")
+                     (<AND <IN? ,DUFFY ,HERE>
+                           <EQUAL? ,TARGET ,PLAYER>>
+                      <COND (<VERB? SSHOW SGIVE> <RFALSE>)
+                            (<AND <PLAYER-ARRESTED? ,DUFFY>
+                                  <VERB? WALK WALK-TO FOLLOW THROUGH>>
+                             <RTRUE>)>)
+                     (<OR <AND <VERB? REVEAL> <EQUAL? ,PRSI ,PLAYER>>
+                          <AND <VERB? TELL-ME TELL $CALL>
+                               <EQUAL? ,PRSO ,PLAYER>>>
+                      <COND (<VERB? TELL>
+                             <SETG P-CONT <>>
+                             <SETG QUOTE-FLAG <>>)>
+                      <INTERVIEW-SELF>)
+                     (<OR <AND <VERB? REVEAL>
+                               <EQUAL? ,PRSO ,GLOBAL-MURDER>>
+                          <AND <VERB? TELL-ME ASK-ABOUT>
+                               <EQUAL? ,PRSI ,GLOBAL-MURDER>>>
+                      <COND (<NOT <FSET? ,PLAYER ,TOLD>>
+                             <TELL
+"What murder? " ,YOU-DONT "know anything about a murder." CR>)>)
+                     (<OR <AND <VERB? THROW-AT POUR-ON>
+                               <EQUAL? ,PRSI ,PLAYER>>
+                          <AND <VERB? RUB FOLLOW>
+                               <EQUAL? ,PRSO ,PLAYER>>>
+                      <TELL ,YOU-ARENT "coordinated enough." CR>)
+                     (<AND <VERB? ALARM>
+                           <EQUAL? ,PRSO <> ,PLAYER ,ME>>
+                      <TELL "Getting sleepy, huh?" CR>)>)
+              (ELSE <RFALSE>)>>
+
+<OBJECT ME
+       (IN GLOBAL-OBJECTS)
+       (DESC "yourself")
+       (SYNONYM ME REPORTER MYSELF ;I)
+       (ADJECTIVE COWBOY COWGIRL)
+       (ACTION ME-F)
+       (FLAGS NDESCBIT TRANSBIT PERSON)
+       (CHARACTER 0)
+       (SIZE 0)>
+
+<ROUTINE ME-F ()
+        <COND (<VERB? RUB> <RFALSE>) 
+              (<EQUAL? ,ME ,PRSO ,PRSI>
+               <PERFORM ,PRSA
+                        <COND (<EQUAL? ,PRSO ,ME> ,PLAYER)
+                              (T ,PRSO)>
+                        <COND (<EQUAL? ,PRSI ,ME> ,PLAYER)
+                              (T ,PRSI)>>
+               <RTRUE>)>>
+
+<OBJECT COWBOY-COSTUME
+       (IN PLAYER)
+       (SYNONYM COSTUME OUTFIT)
+       (ADJECTIVE COWBOY COWGIRL MY WESTERN)
+       (DESC "western outfit")
+       (ACTION COWBOY-COSTUME-F)
+       (GENERIC GENERIC-STUFF-F)
+       (FLAGS NDESCBIT WEARBIT)>
+
+<ROUTINE COWBOY-COSTUME-F ()
+        <COND (<VERB? EXAMINE>
+               <PERFORM ,V?EXAMINE <LOC ,PRSO>>
+               <RTRUE>)
+              (<VERB? TAKE-OFF DROP>
+               <TELL "The result would be embarrassing." CR>)>>
+
+<OBJECT GUNBELT
+       (IN PLAYER)
+       (DESC "gunbelt")
+       (SYNONYM GUNBELT HOLSTER LOOP LOOPS)
+       (ADJECTIVE WESTERN LEATHER BELT)
+       (ACTION GUNBELT-F)
+       (CAPACITY 10)
+       (FLAGS TAKEBIT BURNBIT WEARBIT CONTBIT OPENBIT)>
+
+<ROUTINE GUNBELT-F ()
+        <COND (<VERB? EXAMINE>
+               <TELL
+"This is fine western gunbelt, with a holster for a six-gun and loops
+with lots of bullets. It's expertly tooled leather and is really the
+nicest element of your costume.">
+               <COND (<AND <NOT <FSET? ,GUNBELT ,WEARBIT>>
+                           <NOT <IN? ,BULLET ,GUNBELT>>>
+                      <TELL
+" Now that you have it off, you can see that in the back one of the
+cartridge loops is empty: a bullet is missing.">)>
+               <CRLF>)
+              (<VERB? LOOK-INSIDE>
+               <TELL
+"Don't you remember, you left the gun at home. It was just a toy
+anyway." CR>)
+              (<AND <VERB? PUT>
+                    <NOT <EQUAL? ,PRSO ,BULLET>>
+                    <EQUAL? ,PRSI ,GUNBELT>>
+               <TELL-WONT-FIT>)>>
+
+<OBJECT PEN
+       (IN PLAYER)
+       (DESC "pen")
+       (SYNONYM PEN)
+       (ACTION PEN-F)
+       (FLAGS TAKEBIT)>
+
+<ROUTINE PEN-F ()
+        <COND (<AND <VERB? WRITE> <EQUAL? ,PRSO ,PEN>>
+               <COND (<IN? ,NOTEBOOK ,PLAYER>
+                      <PERFORM ,V?WRITE ,NOTEBOOK ,PEN>
+                      <RTRUE>)
+                     (T
+                      <TELL "On your cuff, no doubt." CR>)>)>>
+
+<OBJECT NOTEBOOK
+       (IN PLAYER)
+       (DESC "notebook")
+       (SYNONYM NOTEBOOK NOTES)
+       (ADJECTIVE REPORTER)
+       (FLAGS TAKEBIT BURNBIT READBIT)
+       (ACTION NOTEBOOK-F)
+       (TEXT
+"The notebook contains a few doodles, a truncated phrase or two, and
+little else.")>
+
+<ROUTINE NOTEBOOK-F ()
+        <COND (<OR <VERB? WRITE>
+                   <AND <VERB? TAKE> <IN? ,NOTEBOOK ,PLAYER>>>
+               <COND (<IN? ,PEN ,PLAYER>
+                      <TELL
+"The notebook now contains more doodles, phrases, and such than before." CR>)
+                     (ELSE
+                      <TELL
+,YOU-DONT-HAVE "a writing implement." CR>)>)>>
+
+<OBJECT YOUR-COAT
+       (IN EAST-COAT-CLOSET)
+       (DESC "reporter's overcoat")
+       (SYNONYM OVERCOAT COAT)
+       (ADJECTIVE PLAYER REPORTER MY)
+       (ACTION YOUR-COAT-F)
+       (FLAGS TAKEBIT BURNBIT OPENBIT TRANSBIT CONTBIT)>
+
+<ROUTINE YOUR-COAT-F ()
+        <COND (<VERB? THROUGH>
+               <PERFORM ,V?WEAR ,YOUR-COAT>
+               <RTRUE>)
+              (<VERB? LOOK-INSIDE>
+               <TELL
+,THERE-IS "nothing in the coat." CR>)
+              (<VERB? SMELL>
+               <TELL
+"It smells slightly damp, which is expected, as it was raining when you
+arrived." CR>)
+              (<VERB? RUB>
+               <TELL
+"It feels slightly damp. It hasn't finished drying off from the rain." CR>)>>
+
+\\f
+
+<OBJECT GLOBAL-MICHAEL
+       (IN GLOBAL-OBJECTS)
+       (DESC "Michael")
+       (SYNONYM WELLMAN SHEIK MICHAEL MIKE)
+       (ADJECTIVE MR MICHAEL MIKE)
+       (ACTION GLOBAL-PERSON-F)
+       (FLAGS TRANSBIT PERSON)
+       (CHARACTER 1)>
+
+<OBJECT MICHAEL
+       (IN BALLROOM-8)
+       (DESC "Michael")
+       (LDESC "Michael, costumed as a sheik, is here.")
+       (SYNONYM WELLMAN SHEIK MICHAEL MIKE)
+       (ADJECTIVE MR MICHAEL MIKE)
+       (ACTION MICHAEL-F)
+       (FLAGS TRANSBIT PERSON)
+       (CHARACTER 1)>
+
+<GLOBAL MICHAEL-SEEN 0>
+
+"add verbs that in general non-player ,winner doesn't want to handle here."
+
+<ROUTINE DONT-HANDLE? ()
+        <COND (<VERB? WHAT SGIVE SSHOW FIND DANCE EXAMINE 
+                      IS $REVEAL THANKS>
+               <RTRUE>)
+              (<AND <VERB? TELL-ME>
+                    <EQUAL? ,PRSO ,ME ,PLAYER>>
+               <RTRUE>)>>
+
+<ROUTINE MICHAEL-F ()
+        <COND (<EQUAL? ,WINNER ,MICHAEL>
+               <COND (<VERB? HELLO>
+                      <COND (<FSET? ,MICHAEL ,TOLD>
+                             <TELL
+"\"How could this have happened? You must feel lucky, something like
+this happening when you're here, but it's horrible, horrible!\"" CR>)
+                            (T
+                             <TELL
+"\"Glad you could make it. I don't see where you'll find a story here,
+but you'll have fun, at least.\"" CR>)>)
+                     (<DONT-HANDLE?> <RFALSE>)
+                     (ELSE
+                      <TELL 'MICHAEL " pays you no heed." CR>)>)
+              (<AND <VERB? $REVEAL> <EQUAL? ,PRSO ,GLOBAL-MURDER>>
+               <ENABLE <QUEUE I-MICHAEL-TO-GARAGE 5>>
+               <COND (<REVEAL-MURDER ,MICHAEL>
+                      <COND (<IN? ,WINNER ,HERE>
+                             <TELL
+CD ,WINNER " breaks the news of the murder to " 'MICHAEL ", who responds
+jokingly, then realizes that " D ,WINNER " is serious. He seems to be
+in a state of shock." CR>)
+                            (<NEARBY? ,MICHAEL>
+                             <TELL
+CD ,WINNER " has just told " 'MICHAEL " something that seems to have
+shocked him terribly." CR>)>)
+                     (ELSE
+                      <COND (<IN? ,WINNER ,HERE>
+                             <TELL
+CD ,WINNER " breaks the news of the murder to " 'MICHAEL ". He already
+knows about it, and replies scornfully." CR>)>)>)
+              (<AND <VERB? REVEAL> <EQUAL? ,PRSO ,GLOBAL-MURDER>>
+               <ENABLE <QUEUE I-MICHAEL-TO-GARAGE 5>>
+               <COND (<REVEAL-MURDER ,MICHAEL>
+                      <TELL
+"\"What! You're kidding... No, you're not, are you?\" He seems to be
+in a state of shock." CR>)
+                     (ELSE
+                      <TELL
+"\"I already know. You're a cruel person to harp on it.\"" CR>)>)
+              (<VERB? EXAMINE>
+               <TELL
+'MICHAEL " Wellman is a tall, greying man about forty years of age. He is
+costumed as an Arab sheik straight out of a bad movie of the twenties." CR>)
+              (<AND <VERB? ASK-ABOUT> <EQUAL? ,PRSO ,MICHAEL>>
+               <COND (<NOT <FSET? ,PRSI ,PERSON>>
+                      <COND (<AND <EQUAL? ,PRSI ,DRINK>
+                                  <IN-BALLROOM? ,VERONICA>>
+                             <TELL
+"\"" 'VERONICA "'s drink? She was drinking a Singapore Sling.\"" CR>)
+                            (<EQUAL? ,PRSI ,HORSE>
+                             <TELL
+"\"'Lurking Grue' is " 'VERONICA "'s prize show jumper. He's really quite a
+beautiful animal. He's coal black, you can barely see him in the dark.\"" CR>)
+                            (<EQUAL? ,PRSI ,GLOBAL-MURDER>
+                             <COND (<FSET? ,PRSO ,TOLD>
+                                    <TELL
+"\"You reporters have all the sensitivity of buffalo. Can't you leave
+me alone?\"" CR>)
+                                   (T
+                                    <TELL
+"\"Murder?\"" CR>)>)
+                            (ELSE
+                             <TELL
+"\"I'm not sure what I can tell you about " THE ,PRSI ".\"" CR>)>)
+                     (<EQUAL? ,PRSI ,PLAYER>
+                      <TELL
+"\"I thought you were a friend of " 'VERONICA "'s. Didn't you go to school
+together or something?\"" CR>)
+                     (<EQUAL? ,PRSI ,MICHAEL ,GLOBAL-MICHAEL>
+                      <TELL
+"\"What can I say? I didn't realize the rich had to serve any function
+but decoration and public amusement. That's what I do, and I take my job
+seriously.\" He smiles." CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-VERONICA ,VERONICA ,CORPSE>
+                      <COND (<FSET? ,MICHAEL ,TOLD>
+                             <TELL
+'MICHAEL " stares at you. \"What a strange question! She was my wife, and
+I loved her, and she's dead! Murdered! Why would anyone want to kill
+her?\" His words trail off. \"I can't understand this. Things were so
+good for us...\"" CR>)
+                            (<IN? ,VERONICA ,HERE>
+                             <TELL
+'MICHAEL " hugs " 'VERONICA". He smiles." CR>)
+                            (<IN-BALLROOM? ,VERONICA>
+                             <TELL
+"\"That's her over there. I guess she's going to try to get that costume
+cleaned up.\"" CR>)
+                            (T
+                             <TELL
+"\"That's an odd question. She's my wife: I love her.\"">
+                             <COND (<G? ,PRESENT-TIME 555>
+                                    <TELL
+" He looks around
+quizzically. \"I wonder where she's gotten off to?\"">)>
+                             <CRLF>)>)
+                     (<EQUAL? ,PRSI ,ALICIA ,GLOBAL-ALICIA>
+                      <TELL
+"\"She's an excellent horsewoman, and a good friend of " 'VERONICA"'s. She
+boards her horses here, so she's here a lot.\"" CR>)
+                     (<EQUAL? ,PRSI ,COL-MARSTON ,GLOBAL-COL-MARSTON>
+                      <TELL
+"\"" 'COL-MARSTON "? One of the ablest men I know. He's done a lot with our family
+trust, and I can always count on his advice.\"" CR>)
+                     (<EQUAL? ,PRSI ,SEN-ASHER ,GLOBAL-SEN-ASHER>
+                      <TELL
+"\"" 'VERONICA " and I are quite fond of him. With a little luck he'll be
+president some day. The man has a lot on the ball.\"" CR>)
+                     (<EQUAL? ,PRSI ,OSTMANN ,GLOBAL-OSTMANN>
+                      <TELL
+"\"" 'OSTMANN " would love to buy the farm, but we turned him down. Our roots are
+here, even though this part of the county is getting so suburban. Some
+think it's past time to make a move upcounty. Most of the Club has
+moved already. " 'OSTMANN " wanted to develop the land as town houses.
+Imagine that!\"" CR>)
+                     (<IN? ,PRSI ,HERE>
+                      <TELL
+'MICHAEL " glances toward " D ,PRSI ". \"What a rude question! Are you hoping
+I'll say something derogatory and start a shouting match?\"" CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-RICHARD>
+                      <TELL
+"\"It's common knowledge Richard and I have our disagreements. " 'VERONICA "
+tries to keep him in line, but you know how it is sometimes between brother
+and sister. Linda is another problem. She just doesn't fit in this sort of
+group.\"" CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-LINDA>
+                      <TELL
+,I-DONT-KNOW "why Richard keeps company with her. Well, I suppose I do.
+But have you ever talked to her? With a
+good tail wind she has an outside chance at a two-digit IQ.\" He shakes his
+head ruefully. \"Richard is still a bit immature.\"" CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-COCHRANE>
+                      <TELL
+"\"The fellow is a crook. I hear he's going up before" ,REAL-ESTATE-BOARD
+" for unethical practices. He and " 'OSTMANN " hate each other, if
+you believe the stories. I certainly didn't invite him, but
+I'm not going to throw him out and make a scene.\"" CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-BUTLER>
+                      <TELL
+"\"" 'BUTLER " has been with us forever. He worked for " 'VERONICA"'s
+parents when they were still alive. He's lived on the farm for most of
+his life.\"" CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-BARTENDER>
+                      <I-DONT-KNOW-ABOUT "him: " <>>
+                      <TELL
+'VERONICA " hired him from some agency for
+the party. He mixes a pretty good martini, I can say that.\"" CR>)
+                     (ELSE
+                      <TELL
+"\"I can't say much one way or the other.\"" CR>)>)
+              (<OR <VERB? SHOW>
+                   <AND <VERB? $DISCOVER>
+                        <IN? ,MICHAEL ,HERE>
+                        <NOT <IN? ,MICHAEL ,OFFICE>>>>
+               <COND (<EQUAL? ,PRSO ,CORPSE>
+                      <COND (<REVEAL-MURDER ,MICHAEL>
+                             <TELL
+'MICHAEL " stares at the corpse, stunned. He rushes over, cradles the body
+in his arms, and seems about to cry. Then, suddenly, he turns to you: \"Did
+you do this?" ,CALLING-POLICE>
+                             <COND (<GLOBAL-IN? ,TELEPHONE ,HERE>
+                                    <TELL-MICHAEL-CALLS-POLICE>)>
+                             <CRLF>)
+                            (ELSE
+                             <TELL
+"He looks away. \"I can't bear it,\" he says, trying to compose
+himself." CR>)>)
+                     (<FSET? ,PRSO ,MICHAELBIT>
+                      <FCLEAR ,PRSO ,MICHAELBIT>
+                      <SETG MICHAEL-SEEN <+ ,MICHAEL-SEEN 1>>
+                      <ENABLE <QUEUE I-FLEE 5>>
+                      <TELL
+"\"I have no idea what this has to do with me.\"" CR>)>)>>
+
+<GLOBAL THREE-STOOGES-IN-OFFICE? <>>
+
+<ROUTINE TELL-MICHAEL-CALLS-POLICE ()
+        <TELL
+'MICHAEL " picks up the telephone
+and calls the police.">
+        <COND (<FSET? ,MICHAEL ,TOLD>
+               <TELL " His voice breaks towards the end.">)>
+        <RTRUE>>
+
+<ROUTINE G-MICHAEL (GARG "AUX" (L <LOC ,MICHAEL>) (BODY? <>))
+        <COND (<NOT .GARG> <IMOVEMENT ,MICHAEL G-MICHAEL>)
+              (<EQUAL? .GARG ,G-IMPATIENT>
+               <COND (<EQUAL? .L ,HERE ,OFFICE> <RFALSE>)
+                     (<EQUAL? .L ,LIBRARY>
+                      <FCLEAR ,LIBRARY-DOOR ,LOCKED>
+                      <RFALSE>)>
+               <TELL 'MICHAEL " is looking ">
+               <COND (<EQUAL? .L ,GARAGE>
+                      <TELL
+"angry and impatient." CR>)
+                     (<FSET? ,MICHAEL ,TOLD>
+                      <TELL
+"impatient, nervous, and distraught." CR>)
+                     (ELSE
+                      <TELL "very bored with all this." CR>)>)
+              (<EQUAL? .GARG ,G-REACHED ,G-ALREADY>
+               <COND (<AND <EQUAL? .L ,BALLROOM-5>
+                           <IN? ,ALICIA ,BALLROOM-5>>
+                      <THEY-DANCE ,MICHAEL>)
+                     (<AND <EQUAL? .L ,BALLROOM-8>
+                           <NOT ,PARTY-OVER>>
+                      <NEW-SCRIPT ,MICHAEL ,MICHAEL-LOOP>
+                      <RFALSE>)
+                     (<AND <EQUAL? .L ,BALLROOM-9>
+                           <NOT ,OFFICE-EXPEDITION?>>
+                      <GOALS? ,MICHAEL <>>
+                      <ESTABLISH-GOAL ,COL-MARSTON ,BALLROOM-9 T>
+                      <ESTABLISH-GOAL ,COCHRANE ,BALLROOM-9 T>
+                      <ENABLE <QUEUE I-ARGUMENT 5>>
+                      <RFALSE>)
+                     (<EQUAL? .L ,GARAGE>
+                      <ENABLE <QUEUE I-MICHAEL-HIDES-FOLDER 1>>
+                      <RFALSE>)
+                     (<AND <EQUAL? .L ,HALLWAY-3>
+                           <NOT ,THREE-STOOGES-IN-OFFICE?>>
+                      <GOALS? ,MICHAEL <>>
+                      <COND (<AND <IN? ,COCHRANE ,HALLWAY-3>
+                                  <IN? ,COL-MARSTON ,HALLWAY-3>>
+                             <GANGS-ALL-HERE>)>)
+                     (<EQUAL? .L ,OFFICE>
+                      <SETG THREE-STOOGES-IN-OFFICE? T>
+                      <ESTABLISH-GOAL ,MICHAEL ,LIVING-ROOM>
+                      <GRAB-ATTENTION ,MICHAEL>
+                      <COND (<NOT ,MURDER-PUBLIC?>
+                             <SET BODY? <EQUAL? <META-LOC ,CORPSE> ,OFFICE>>
+                             <COND (.BODY?
+                                    <FCLEAR ,MICHAEL ,TOLD>
+                                    <REVEAL-MURDER ,MICHAEL>)
+                                   (ELSE
+                                    <SETG MURDER-PUBLIC? T>
+                                    <ENABLE <QUEUE I-POLICE-ARRIVE 25>>)>
+                             <COND (<EQUAL? .L ,HERE>
+                                    <COND (.BODY?
+                                           <TELL-LOOK-AROUND>
+                                           <TELL
+"The three of them start to search the room, examine the body, and so on.
+Then " 'MICHAEL " says, \"Wait! This is a job for the police! Don't touch
+anything!\" The others agree, though " D ,COCHRANE " takes some convincing. ">
+                                           <TELL-MICHAEL-CALLS-POLICE>
+                                           <CRLF>)
+                                          (ELSE
+                                           <TELL-LOOK-AROUND>
+                                           <TELL
+'MICHAEL " is particularly shocked. \"There must have
+been a prowler in here, or maybe some kids out for a thrill.\" He looks
+around some more. ">
+                                           <COND (<IN? ,FAIRY-MASK .L>
+                                                  <TELL
+"\"" 'VERONICA "'s mask is here!\" he says. ">)>
+                                           <COND (<IN? ,ROPE .L>
+                                                  <TELL
+"\"And isn't that your rope?\" He asks you. ">)>
+                                           <TELL
+"He seems puzzled. \"Nothing seems to be taken." ,CALLING-POLICE
+" He does so." CR>)>
+                                    <RTRUE>)>)>)
+                     (<EQUAL? .L ,LIBRARY>
+                      <COND (<IN? ,COL-MARSTON ,LIBRARY>
+                             <LIBRARY-MEETING ,MICHAEL>)
+                            (ELSE
+                             <GOALS? ,MICHAEL <>>
+                             <RFALSE>)>)
+                     (<AND ,FLEEING? <EQUAL? .L ,SITTING-ROOM>>
+                      <UNPRIORITIZE ,MICHAEL>
+                      <COND (<IN? ,ALICIA .L>
+                             <GOALS? ,ALICIA T>
+                             <ESTABLISH-GOAL ,ALICIA ,BARN T>
+                             <ESTABLISH-GOAL ,MICHAEL ,BARN T>)
+                            (T
+                             <GOALS? ,MICHAEL <>>)>
+                      <RFALSE>)
+                     (<EQUAL? .L ,BARN>
+                      <GOALS? ,MICHAEL <>>
+                      <BARN-DANCE ,MICHAEL>)>)>>
+
+<ROUTINE TELL-LOOK-AROUND ()
+        <TELL
+'MICHAEL " and the others look around the room, startled. They see the total
+wreck of the office. ">>
+
+<ROUTINE I-MICHAEL-HIDES-FOLDER ()
+        <COND (<AND <EQUAL? ,HERE ,GARAGE>
+                    <NOT ,PLAYER-HIDING>>
+               <COND (<LISTENING? ,MICHAEL>
+                      <TELL "\"Get out of here!\" " 'MICHAEL " screams." CR>
+                      <RTRUE>)>
+               <SETG MICHAEL-TO-GARAGE? <>>
+               <ENABLE <QUEUE I-MICHAEL-TO-GARAGE 25>>
+               <ESTABLISH-GOAL ,MICHAEL ,BALLROOM-9 T>
+               <GRAB-ATTENTION ,MICHAEL>
+               <TELL
+'MICHAEL " eyes you suspiciously. \"What are you doing in here?\" he asks.">
+               <COND (<OR <FSET? ,BMW-TRUNK ,OPENBIT>
+                          <IN? ,CROWBAR ,PLAYER>
+                          <FIRST? ,BMW-TRUNK>>
+                      <TELL
+" \"Have you been fooling with my car? What are you doing in here! I'll
+have you thrown out!\" He seems serious.">)>
+               <COND (<FSET? ,MICHAEL ,TOLD>
+                      <TELL
+" \"Are you trying to hide something? You've been acting pretty oddly.
+Did you kill my wife?\" He breaks off, torn between several courses of
+action.">)>
+               <TELL
+" Finally he just says \"Get out of here!\"" CR>)
+              (ELSE
+               <ENABLE <QUEUE I-LIBRARY-MEETING 20>>
+               <COND (<AND <NOT <FIRST? ,BMW-TRUNK>>
+                           <NOT <FSET? ,BMW-TRUNK ,OPENBIT>>>
+                      <FSET ,BMW-TRUNK ,LOCKED>
+                      <MOVE ,TRUST-FOLDER ,BMW-TRUNK>
+                      <FCLEAR ,TRUST-FOLDER ,INVISIBLE>
+                      <COND (<EQUAL? ,HERE ,GARAGE>
+                             <TELL-MIKE-WALKS>
+                             <TELL
+", and after a few seconds, closes it again. Unfortunately, the trunk lid
+blocks your view of what he was doing when the trunk was open." CR>)>)
+                     (ELSE
+                      <REMOVE ,TRUST-FOLDER>
+                      <COND (<EQUAL? ,HERE ,GARAGE>
+                             <TELL-MIKE-WALKS>
+                             <TELL
+", and becomes extremely agitated. He looks around, fails to see you, and
+stands for a moment, confused." CR>)>)>)>>
+
+<ROUTINE TELL-MIKE-WALKS ()
+        <TELL
+'MICHAEL " walks to the rear of the BMW, ">
+        <COND (<FSET? ,BMW-TRUNK ,OPENBIT>
+               <TELL "notices the trunk is open">)
+              (T
+               <TELL "opens the trunk">)>>
+
+<ROUTINE I-LIBRARY-MEETING ()
+        %<DEBUG-CODE
+          <COND (,DEBUG
+                 <TELL "[Michael and Marston to Library]" CR>)>>
+        <ESTABLISH-GOAL ,MICHAEL ,LIBRARY T>
+        <ESTABLISH-GOAL ,COL-MARSTON ,LIBRARY T>
+        <RFALSE>>
+
+<ROUTINE TELL-THREE-STOOGES ()
+        <TELL 'MICHAEL ", " 'COL-MARSTON ", and " 'COCHRANE>>
+
+<ROUTINE TELL-THREE-ARRIVE (KNEW?)
+        <COND (<EQUAL? ,HERE ,OFFICE ,HALLWAY-3>
+               <FSET ,PLAYER ,TOLD>
+               <TELL-THREE-STOOGES>
+               <TELL
+" arrive at the office door.
+" 'COL-MARSTON " glances through the door. \"Look in there!\" he cries.
+\"The place is a shambles!">
+               <COND (.KNEW?
+                      <TELL " It must be true, then!">)>
+               <COND (<EQUAL? ,HERE ,OFFICE>
+                      <TELL
+"\" They see you">)
+                     (ELSE
+                      <TELL
+"\" " 'MICHAEL " and " 'COCHRANE " look startled as well">)>
+               <TELL ,THREE-CROWD CR>)
+              (<CORRIDOR-LOOK ,MICHAEL>
+               <TELL-THREE-STOOGES>
+               <TELL
+" are down the hall, in front of the
+office. " 'COL-MARSTON " shouts" ,THREE-CROWD CR>)>>
+
+<GLOBAL THREE-CROWD ", and the three of them crowd into the room.">
+
+<GLOBAL GANG-BEEN-TO-OFFICE? <>>
+
+<ROUTINE GANGS-ALL-HERE ("AUX" (KNEW <>))
+        <COND (,GANG-BEEN-TO-OFFICE? <RFALSE>)>
+        <SETG GANG-BEEN-TO-OFFICE? T>
+        <UNPRIORITIZE ,MICHAEL>
+        <ESTABLISH-GOAL ,MICHAEL ,OFFICE T>
+        <UNPRIORITIZE ,COCHRANE>
+        <ESTABLISH-GOAL ,COCHRANE ,OFFICE T>
+        <UNPRIORITIZE ,COL-MARSTON>
+        <ESTABLISH-GOAL ,COL-MARSTON ,OFFICE T>
+        <COND (<OR <FSET? ,MICHAEL ,TOLD>
+                   <FSET? ,COCHRANE ,TOLD>
+                   <FSET? ,COL-MARSTON ,TOLD>>
+               <SET KNEW T>)>
+        %<DEBUG-CODE
+          <COND (<AND ,GOSSIP <NOT .KNEW>>
+                 <TELL
+"[Michael, Marston, Cochrane find out at office]" CR>)>>
+        <COND (<EQUAL? <META-LOC ,CORPSE> ,OFFICE>
+               <FSET ,MICHAEL ,TOLD>
+               <FSET ,COL-MARSTON ,TOLD>
+               <FSET ,COCHRANE ,TOLD>)>
+        <COND (<FSET? ,SOUTH-OFFICE-DOOR ,OPENBIT>
+               <TELL-THREE-ARRIVE .KNEW>)
+              (T
+               <FCLEAR ,SOUTH-OFFICE-DOOR ,LOCKED>
+               <FSET ,SOUTH-OFFICE-DOOR ,OPENBIT>
+               <COND (<EQUAL? ,HERE ,OFFICE>
+                      <TELL
+"Outside, you hear voices. ">
+                      <COND (<NOT .KNEW>
+                             <TELL
+                         " You hear someone say," ,LET-ME ,THERE-IS "a pause."
+,I-HAD-THEM "Another pause. The doorknob turns." ,WAIT-A-MINUTE>)>
+                      <TELL "The door opens, revealing ">
+                      <TELL-THREE-STOOGES>
+                      <TELL ". They crowd forward." CR>)
+                     (<EQUAL? ,HERE ,HALLWAY-3>
+                      <FSET ,PLAYER ,TOLD>
+                      <COND (.KNEW
+                             <TELL
+'MICHAEL " says, \"If it's true, I can take it, just let me go in.\" He
+opens the door, and the three of them crowd around." CR>)
+                            (T
+                             <TELL
+'MICHAEL " says," ,LET-ME "He roots around underneath
+his robes for a moment, obviously trying to find his keys. He clearly
+can't find them." ,I-HAD-THEM "He gets more and more
+frantic." ,WAIT-A-MINUTE 'MICHAEL " throws open the door of the office, the others crowding
+closely around him." CR>)>)
+                     (<CORRIDOR-LOOK ,MICHAEL>
+                      <TELL
+"You see, at the office door, a group which includes ">
+                      <TELL-THREE-STOOGES>
+                      <TELL ". " 'MICHAEL>
+                      <COND (<NOT .KNEW>
+                             <TELL " is looking for something in his
+robes, getting more and more frantic. Then, suddenly, he">)>
+                      <TELL " opens the door,
+and the other two crowd around him, staring into the office." CR>)>)>>
+
+<GLOBAL LET-ME " \"Let me unlock this door...\" ">
+<GLOBAL I-HAD-THEM " \"I had them! I unlocked the wine cellar only an hour
+ago; Smythe needed to get to it! My keys are gone!\" ">
+<GLOBAL WAIT-A-MINUTE " \"Wait a minute! This door isn't
+locked! Something's going on here!\" ">
+
+<ROUTINE LIBRARY-MEETING (LAST "AUX" FIRST)
+        <COND (<EQUAL? .LAST ,MICHAEL> <SET FIRST ,COL-MARSTON>)
+              (ELSE <SET FIRST ,MICHAEL>)>
+        <FCLEAR ,LIBRARY-DOOR ,OPENBIT>
+        <FCLEAR ,LH-DOOR ,OPENBIT>
+        <FSET ,LIBRARY-DOOR ,LOCKED>
+        <FSET ,LH-DOOR ,LOCKED>
+        <MOVE ,INVESTOR-LIST ,COL-MARSTON>
+        <ENABLE <QUEUE I-END-MEETING 2>>
+        <COND (<NOT <EQUAL? <META-LOC ,PLAYER> ,LIBRARY>>
+               <RFALSE>)>
+        <TELL D .LAST " enters the library. ">
+        <COND (<EQUAL? ,PLAYER-HIDING ,CHAIR>
+               <TELL
+'MICHAEL " and " 'COL-MARSTON " greet each other, then glance suspiciously
+around the room. They do not see you hiding behind the overstuffed
+chair. " 'MICHAEL " closes and locks the doors. He then passes the Colonel a
+piece of paper, which the latter avidly scans, then folds up and
+stuffs into a pocket. Both men grin." CR>)
+              (<EQUAL? <META-LOC ,PLAYER> ,LIBRARY>
+               <GRAB-ATTENTION ,MICHAEL 2>
+               <GRAB-ATTENTION ,COL-MARSTON 2>
+               <TELL
+"He seems surprised to see you. " D .FIRST "
+looks at him and shrugs his shoulders. \"Please leave us. We have some
+private business to transact. I'm sure you understand,\" says " 'MICHAEL ".
+The two of them unceremoniously show you the door." CR>
+               <GOTO ,HALLWAY-16>
+               <RTRUE>)>>
+
+<ROUTINE I-END-MEETING ()
+        <UNPRIORITIZE ,COL-MARSTON>
+        <ESTABLISH-GOAL ,COL-MARSTON ,BALLROOM-8 T>
+        <UNPRIORITIZE ,MICHAEL>
+        <ESTABLISH-GOAL ,MICHAEL ,BALLROOM-8 T>
+        <RFALSE>>
+
+<GLOBAL OFFICE-EXPEDITION? <>>
+
+<ROUTINE I-ARGUMENT ("AUX" S (FLG <>))
+        <COND (<AND <NOT ,OFFICE-EXPEDITION?>
+                    <NOT <FSET? ,MICHAEL ,TOLD>>
+                    <IN? ,MICHAEL ,BALLROOM-9>
+                    <IN? ,COL-MARSTON ,BALLROOM-9>
+                    <IN? ,COCHRANE ,BALLROOM-9>>
+               <SET S <GET ,ARGUMENT-TABLE ,ARGUMENT-COUNT>>
+               <COND (<EQUAL? ,HERE ,BALLROOM-9>
+                      <SET FLG T>
+                      <TELL .S CR>)
+                     (<IN-BALLROOM? ,PLAYER>
+                      <SET FLG T>
+                      <TELL
+,SEEMS-TO-BE A ,DISCUSSION " going on at the bar." CR>)
+                     (<EQUAL? ,ARGUMENT-COUNT 0>
+                      <SETG ARGUMENT-POSTPONE <- ,ARGUMENT-POSTPONE 1>>
+                      <COND (<G? ,ARGUMENT-POSTPONE 0>
+                             <QUEUE I-ARGUMENT 2>
+                             <RFALSE>)>)>
+               <SETG ARGUMENT-COUNT <+ ,ARGUMENT-COUNT 1>>
+               <COND (<SET S <GET ,ARGUMENT-TABLE ,ARGUMENT-COUNT>>
+                      <QUEUE I-ARGUMENT 1>)
+                     (ELSE
+                      <SETG ARGUMENT-COUNT 0> ;"argument over"
+                      <SETG OFFICE-EXPEDITION? T>
+                      <THIS-IS-S-HE ,MICHAEL>
+                      <ESTABLISH-GOAL ,MICHAEL ,HALLWAY-3 T>
+                      <ESTABLISH-GOAL ,COL-MARSTON ,HALLWAY-3 T>
+                      <ESTABLISH-GOAL ,COCHRANE ,HALLWAY-3 T>)>
+               <RETURN .FLG>)
+              (<FSET? ,MICHAEL ,TOLD>
+               <SETG OFFICE-EXPEDITION? T>
+               <SETG ARGUMENT-COUNT 0>
+               <RFALSE>)
+              (ELSE
+               <QUEUE I-ARGUMENT 5>
+               <RFALSE>)>>
+
+<GLOBAL ARGUMENT-POSTPONE 5>
+<GLOBAL ARGUMENT-COUNT 0>
+
+<GLOBAL ARGUMENT-TABLE
+       <TABLE
+"Some guests are discussing this year's horse sales. Col. Marston
+maintains that no stallion went for more than one
+hundred thousand dollars, while Cochrane contends that he's wrong."
+
+"Michael joins in the discussion. \"I recall a black stallion that
+went for a high price last year. It was probably over a hundred thousand.\"
+Col. Marston glares at him."
+
+"Col. Marston says, \"I have a good memory for figures. The top price last
+year was ninety two thousand. I even remember the horse, it was a chestnut,
+about fifteen hands. Beautiful animal!\" Michael nods, apparently convinced.
+Cochrane glances at Michael, feeling betrayed. \"Nonsense,\" he says, angrily."
+
+"Cochrane takes another gulp of his drink. \"You're just
+getting senile, Colonel. It was a black stallion, and I remember who bought
+it. It was Jeffries! So there!\" He makes a gesture of
+finality, almost spilling his drink on Marston, who is beginning to get
+angry himself."
+
+"Michael steps between them. \"Look here,\" he says, \"No need to fight.
+We've got all the auction records in the office. Veronica
+gets everything published. We can settle
+this like gentlemen. Okay?\" Cochrane seems mollified, and
+Marston comments under his breath, \"Some of us aren't gentlemen.\"
+They head off towards the office."
+
+       <>>>
+
+<GLOBAL MURDER-PUBLIC? <>>
+
+\\f
+
+<ROUTINE VERONICA-UNMASKED? ()
+        <EQUAL? <GETP ,VERONICA ,P?SDESC> ,VERONICA-SDESC>>
+
+<ROUTINE VERONICA-UNMASKS ()
+        <FCLEAR ,VERONICA ,THE>
+        <PUTP ,VERONICA ,P?SDESC ,VERONICA-SDESC>
+        <FCLEAR ,GLOBAL-VERONICA ,THE>
+        <PUTP ,GLOBAL-VERONICA ,P?SDESC ,VERONICA-SDESC>>
+
+<GLOBAL VERONICA-SDESC "Veronica">
+
+<OBJECT GLOBAL-VERONICA
+       (IN GLOBAL-OBJECTS)
+       (DESC "Veronica")
+       (SDESC "fairy queen")
+       (SYNONYM VERONICA TITANIA QUEEN ASHCROFT ;WELLMAN)
+       (ADJECTIVE VERONICA MRS MS FAIRY WIFE)
+       (ACTION GLOBAL-VERONICA-F)
+       (GENERIC GENERIC-VERONICA-F)
+       (FLAGS TRANSBIT PERSON FEMALE THE)
+       (CHARACTER 2)>
+
+<ROUTINE GLOBAL-VERONICA-F ()
+        <COND (<AND <NOT <LOC ,VERONICA>>
+                    <EQUAL? <META-LOC ,CORPSE> ,HERE>
+                    <NOT <VERB? TELL-ME ASK-ABOUT>>>
+               <PERFORM ,PRSA
+                        <COND (<EQUAL? ,PRSO ,GLOBAL-VERONICA> ,CORPSE)
+                              (T ,PRSO)>
+                        <COND (<EQUAL? ,PRSI ,GLOBAL-VERONICA> ,CORPSE)
+                              (T ,PRSI)>>
+               <RTRUE>)
+              (ELSE
+               <GLOBAL-PERSON-F>)>>
+
+<OBJECT VERONICA
+       (IN BALLROOM-8)
+       (DESC "Veronica")
+       (SDESC "fairy queen")
+       (SYNONYM VERONICA TITANIA QUEEN ASHCROFT ;WELLMAN)
+       (ADJECTIVE VERONICA MRS MS FAIRY WIFE)
+       (ACTION VERONICA-F)
+       (DESCFCN VERONICA-DESC-F)
+       (GENERIC GENERIC-VERONICA-F)
+       (FLAGS TRANSBIT PERSON FEMALE THE)
+       (CHARACTER 2)>
+
+<ROUTINE GENERIC-VERONICA-F (NAM)
+        <COND (<NOT <EQUAL? .NAM ,W?COSTUME>> ,VERONICA)
+              (ELSE <GENERIC-STUFF-F .NAM>)>>
+
+<ROUTINE VERONICA-DESC-F ("OPTIONAL" (RARG <>))
+        <TELL "Titania, Queen of Faery,">
+        <COND (<VERONICA-UNMASKED?>
+               <TELL " in the person of " 'VERONICA ",">)>
+        <TELL " is">
+        <TELL-HERE>>
+
+<ROUTINE TELL-IGNORES () <TELL "She" ,IGNORES-YOU "." CR>>
+
+<GLOBAL IGNORES-YOU " ignores you">
+
+<ROUTINE LONG-MASK-DESC ()
+        <TELL
+" It covers the entire head with a glittery silver stocking. The hair is
+silver and gold wire streaming out behind as though blown by the wind.
+The ears are silvered butterfly wings, and the eyebrows turn up into
+antennae." CR>>
+
+<ROUTINE VERONICA-F ()
+        <COND (<EQUAL? ,WINNER ,VERONICA>
+               <COND (<VERB? WHAT>
+                      <COND (<EQUAL? ,PRSO ,YOU>
+                             <TELL
+"\"I'm Queen of Faery, stupid!\" she growls." CR>)>)
+                     (<VERB? HELLO>
+                      <TELL "She pauses for a moment and greets you." CR>)
+                     (<DONT-HANDLE?> <RFALSE>)
+                     (ELSE
+                      <TELL-IGNORES>)>)
+              (<VERB? $CALL WAIT>
+               <TELL-IGNORES>)
+              (<VERB? EXAMINE>
+               <COND (<VERONICA-UNMASKED?>
+                      <TELL 'VERONICA " Ashcroft">)
+                     (ELSE <TELL "Titania, Queen of Faery">)>
+               <TELL " is in her early thirties, about 5'3\" in height,
+weighing about 100 pounds. She is wearing a voluminous white gown and
+silvered fairy wings. Her mask is quite striking.">
+               <LONG-MASK-DESC>)
+              (<VERB? UNMASK ATTACK KILL TAKE CUT>
+               <TELL
+"\"Stop that! " 'MICHAEL ", help me!\"">
+               <COND (<IN? ,MICHAEL ,HERE>
+                      <TELL " " 'MICHAEL " restrains you, a quizzical look in
+his eye.">)>
+               <CRLF>)
+              (<VERB? HELP RUB BRUSH>
+               <TELL
+"She fends you off, angrily. \"I don't need any help from you!\"" CR>)
+              (<AND <VERB? ASK-ABOUT> <EQUAL? ,PRSO ,VERONICA>>
+               <TELL-IGNORES>)
+              (<VERB? DANCE>
+               <TELL
+"\"Some other time.\" You get the impression this will be soon after the
+first ski resort opens in the infernal regions." CR>)>>
+
+<ROUTINE G-VERONICA (GARG)
+        <COND (<NOT .GARG> <IMOVEMENT ,VERONICA G-VERONICA>)
+              (<EQUAL? .GARG ,G-REACHED ,G-ALREADY>
+               <COND (<IN? ,VERONICA ,OFFICE>
+                      <SETG YELL-TIME
+                            <+ <- ,PRESENT-TIME
+                                  <MOD ,PRESENT-TIME 5>>
+                               5>>
+                      <ENABLE <QUEUE I-ALICIA-SNEAKS 2>>
+                      <MOVE ,FAIRY-COSTUME ,CORPSE>
+                      <MOVE ,FAIRY-MASK ,OFFICE>
+                      <FCLEAR ,FAIRY-MASK ,NDESCBIT>
+                      <MOVE ,STAIN ,CORPSE>
+                      <MOVE ,HAIR ,FAIRY-MASK>
+                      <REMOVE ,VERONICA>
+                      <FSET ,VERONICA ,NDESCBIT>
+                      <RFALSE>)>)>>
+
+<GLOBAL YELL-TIME <>>
+
+<OBJECT CORPSE
+       (IN OFFICE)
+       (DESC "Veronica's body")
+       (SYNONYM CORPSE BODY VERONICA TITANIA)
+       (ADJECTIVE MS MRS FAIRY QUEEN WIFE ASHCROFT VERONICA ;"9/17")
+       (DESCFCN CORPSE-DESC-F)
+       (ACTION CORPSE-F)
+       (GENERIC GENERIC-VERONICA-F)
+       (FLAGS INVISIBLE SEARCHBIT TAKEBIT TRANSBIT CONTBIT SURFACEBIT
+              PERSON OPENBIT FEMALE TOLD)
+       (CAPACITY 30)
+       (SIZE 70)>
+
+<ROUTINE CORPSE-DESC-F ("OPTIONAL" (RARG <>))
+        %<DEBUG-CODE
+                 <COND (<AND ,GOSSIP <NOT <FSET? ,WINNER ,TOLD>>>
+                        <TELL "[Corpse: " CD ,WINNER " sees it.]" CR>)>>
+        <FSET ,WINNER ,TOLD>
+        <COND (<NOT <FSET? ,CORPSE ,TOUCHBIT>>
+               <TELL
+"Slumped behind " THE ,LARGE-DESK " is the body of " 'VERONICA " Ashcroft.">
+               <COND (<NOT <IN? ,FAIRY-MASK ,CORPSE>>
+                      <TELL " Her
+mask has been pulled off, though the rest of the costume is intact.">)>
+               <COND (<FSET? ,ROPE ,NDESCBIT>
+                      <REMOVE ,NOT-ROPE>
+                      <TELL
+" Around her neck is the agent of death, a rope. In fact, it's your lariat,
+which you got tired of carrying around and hung in the closet with your
+coat.">)>
+               <CRLF>)
+              (ELSE
+               <TELL
+"Lying in a heap is the body of " 'VERONICA " Ashcroft, strangled">
+               <COND (<FSET? ,ROPE ,NDESCBIT>
+                      <REMOVE ,NOT-ROPE>
+                      <TELL " with a cowboy's lariat">)>
+               <TELL "." CR>)>>
+
+<ROUTINE TALKING-TO? (PER)
+        <COND (<VERB? SHOW REVEAL $REVEAL>
+               <COND (<EQUAL? ,PRSI .PER> <RTRUE>)>)
+              (<VERB? $CALL ASK-ABOUT ASK-FOR TELL-ME HELLO>
+               <COND (<EQUAL? ,PRSO .PER> <RTRUE>)>)>>
+
+<GLOBAL STOPS-YOU " stops you from tampering with evidence.">
+
+<ROUTINE CORPSE-F ()
+        <COND (<OR <EQUAL? ,WINNER ,CORPSE>
+                   <AND <VERB? TELL>
+                        <EQUAL? ,PRSO ,CORPSE>>>
+               <SETG P-CONT <>>
+               <SETG QUOTE-FLAG <>>
+               <TELL
+"At this point, it would take a seance." CR>)
+              (<TALKING-TO? ,CORPSE>
+               <TELL
+"For obvious reasons, there is no response." CR>)
+              (<AND <VERB? SHOW>
+                    <EQUAL? ,PRSO ,CORPSE>
+                    <FSET? ,PRSI ,PERSON>
+                    <NOT <EQUAL? ,PRSI ,PLAYER>>>
+               <REVEAL-MURDER ,PRSI>
+               <TELL
+CD ,PRSI " recoils in horror. \"No!" ,CALLING-POLICE " " HE/SHE ,PRSI
+" says." CR>)
+              (<VERB? DANCE>
+               <TELL
+,HAVE-TO "lead, you can be sure of that." CR>)
+              (<VERB? EXAMINE>
+               <TELL
+'VERONICA " is still wearing her costume, stained with whatever she was
+drinking."> <COND (<NOT <IN? ,FAIRY-MASK ,CORPSE>>
+                  <TELL " Her mask has been removed.">)>
+           <TELL " She was obviously strangled">
+           <COND (<IN? ,CORPSE ,OFFICE>
+                  <TELL ", but
+there are few signs of a struggle">)>
+          <TELL "." CR>)
+              (<VERB? HELP BRUSH ALARM>
+               <TELL
+"It's too late to help " 'VERONICA " now." CR>)
+              (<VERB? LISTEN>
+               <TELL
+,THERE-IS "no sign of breathing." CR>)
+              (<VERB? RUB>
+               <TELL "The body is ">
+               <COND (<L? ,PRESENT-TIME 570>
+                      <TELL "still warm." CR>)
+                     (<L? ,PRESENT-TIME 630>
+                      <TELL "cooling off." CR>)
+                     (ELSE
+                      <TELL "cold." CR>)>)
+              (<VERB? LOOK-UNDER RAISE SEARCH>
+               <COND (<IN? ,BULLET ,CORPSE>
+                      <FCLEAR ,BULLET ,INVISIBLE>
+                      <MOVE ,BULLET ,HERE>
+                      <TELL
+"As you look under the body, you notice a small object on the floor
+beneath it." CR>)
+                     (<VERB? SEARCH>
+                      <TELL
+"A search reveals nothing beyond what was first apparent." CR>)>)
+              (<AND <VERB? TAKE MOVE> <EQUAL? ,PRSO ,CORPSE>>
+               <COND (<IN? ,DETECTIVE ,HERE>
+                      <TELL
+CTHE ,DETECTIVE ,STOPS-YOU CR>)
+                     (<IN? ,DUFFY ,HERE>
+                      <TELL
+'DUFFY ,STOPS-YOU CR>)
+                     (<OR <VERB? MOVE>
+                          <EQUAL? <ITAKE> ,M-HANDLED>>
+                      <COND (<VERB? MOVE>
+                             <TELL "Moved">)
+                            (T
+                             <SETG PLAYER-MOVED-BODY? T>
+                             <TELL "Taken">)>
+                      <TELL
+", but the body is heavy.">
+                      <FCLEAR ,ROPE ,NDESCBIT>
+                      <COND (<IN? ,BULLET ,CORPSE>
+                             <FCLEAR ,BULLET ,INVISIBLE>
+                             <MOVE ,BULLET ,HERE>
+                             <TELL
+" As you move the body a small object drops to the floor beneath it.">)>
+                      <CRLF>)>
+               <RTRUE>)
+              (<VERB? DROP>
+               <MOVE ,PRSO ,HERE>
+               <TELL "The body drops like a sack of potatoes." CR>)
+              (<AND <VERB? SLAP KILL MUNG ATTACK TIE-WITH TIE-TO>
+                    <EQUAL? ,PRSO ,CORPSE>>
+               <TELL
+"You haven't been paying very close attention, have you?" CR>)
+              (<AND <VERB? THROW-AT> <EQUAL? ,PRSI ,CORPSE>>
+               <MOVE ,PRSO ,HERE>
+               <TELL "That wasn't very sporting." CR>)
+              (<AND <VERB? WALK-TO> <NOT <FSET? ,WINNER ,TOLD>>>
+               <TELL "What corpse?" CR>)
+              (<AND <VERB? PUT>
+                    <EQUAL? ,PRSI ,CORPSE>
+                    <NOT <EQUAL? ,PRSO ,FAIRY-MASK>>>
+               <TELL-WONT-FIT>)>>
+
+<ROUTINE TELL-WONT-FIT ()
+        <TELL "It won't fit." CR>>
+
+<OBJECT BULLET
+       (IN CORPSE)
+       (DESC "silver bullet")
+       (SYNONYM BULLET OBJECT)
+       (ADJECTIVE SILVER SMALL)
+       (ACTION BULLET-F)
+       (FLAGS INVISIBLE TAKEBIT TRYTAKEBIT)>
+
+<GLOBAL IN-GUNBELT " in your gunbelt.">
+
+<ROUTINE BULLET-F ()
+        <COND (<VERB? EXAMINE>
+               <TELL "It looks just like the ones" ,IN-GUNBELT CR>)
+              (<VERB? COUNT>
+               <COND (<EQUAL? <META-LOC ,GUNBELT> ,HERE>
+                      <COND (<IN? ,BULLET ,GUNBELT>
+                             <TELL "All the loops have bullets in them." CR>)
+                            (T
+                             <TELL
+,SEEMS-TO-BE "one empty loop" ,IN-GUNBELT CR>)>)
+                     (T <TELL "One." CR>)>)
+              (<AND <VERB? PUT> <EQUAL? ,PRSI ,GUNBELT>>
+               <COND (<IN? ,BULLET ,GUNBELT>
+                      <TELL "All the bullets are" ,IN-GUNBELT CR>)
+                     (T
+                      <FSET ,BULLET ,NDESCBIT>
+                      <MOVE ,BULLET ,GUNBELT>
+                      <TELL
+"Okay, each loop of the belt now has a bullet in it." CR>)>)
+              (<VERB? TAKE>
+               <COND (<DONT-TAKE-EVIDENCE ,BULLET> <RTRUE>)
+                     (<IN? ,BULLET ,GUNBELT>
+                      <FCLEAR ,BULLET ,NDESCBIT>)
+                     (<EQUAL? ,PRSI ,GUNBELT>
+                      <TELL
+"Isn't one enough? " ,DO-YOU-WANT-TO "scatter them all over?" CR>
+                      <RTRUE>)>
+               <FSET ,BULLET ,RMUNGBIT>
+               <RFALSE>)
+              (<VERB? BRUSH>
+               <FCLEAR ,BULLET ,RMUNGBIT>
+               <TELL
+"It's now shiny clean again." CR>)>>
+
+<OBJECT FAIRY-COSTUME
+       (IN VERONICA)
+       (DESC "fairy costume")
+       (SYNONYM COSTUME TITANIA)
+       (ADJECTIVE FAIRY VERONICA)
+       (ACTION FAIRY-COSTUME-F)
+       (GENERIC GENERIC-VERONICA-F)
+       (FLAGS NDESCBIT ;TAKEBIT ;TRYTAKEBIT)>
+
+<ROUTINE FAIRY-COSTUME-F ("AUX" (DEAD? <IN? ,FAIRY-COSTUME ,CORPSE>))
+        <COND (<VERB? EXAMINE>
+               <TELL
+"This is a gossamer " 'FAIRY-COSTUME ", intended to represent Titania, Queen of
+Faery. It has a silver belt. On the back are fairy wings">
+<COND (.DEAD? <TELL ", now crushed">)> <TELL ". The
+beauty of the costume is marred by a large red stain on the front." CR>)
+              (<VERB? TAKE>
+               <TELL
+"Taking the costume would get you into even deeper trouble than you are
+in now." CR>)>>
+
+<OBJECT STAIN
+       (IN VERONICA)
+       (DESC "stain")
+       (SYNONYM STAIN)
+       (ADJECTIVE RED)
+       (ACTION STAIN-F)
+       (FLAGS NDESCBIT)
+       (SIZE 0)>
+
+<OBJECT STAIN-SAMPLE
+       (DESC "cloth sample")
+       (SYNONYM CLOTH SAMPLE)
+       (FLAGS TAKEBIT BURNBIT)
+       (SIZE 1)>
+
+<ROUTINE STAIN-F ()
+        <COND (<VERB? EXAMINE>
+               <TELL
+"The large red stain spreads over the front of the costume." CR>)>>
+
+<OBJECT FAIRY-MASK
+       (IN VERONICA)
+       (DESC "fairy mask")
+       (FDESC
+"Crumpled on the floor is the fairy costume's mask.")
+       (SYNONYM MASK)
+       (ADJECTIVE FAIRY)
+       (ACTION FAIRY-MASK-F)
+       (FLAGS NDESCBIT TRYTAKEBIT TAKEBIT BURNBIT CONTBIT OPENBIT)
+       (CAPACITY 10)
+       (SIZE 5)>
+
+<ROUTINE FAIRY-MASK-F ()
+        <COND (<VERB? EXAMINE>
+               <TELL
+"This is a very ornate and beautiful mask.">
+               <LONG-MASK-DESC>)
+              (<AND <IN? ,FAIRY-MASK ,VERONICA>
+                    <VERB? TAKE LOOK-INSIDE LOOK-UNDER RUB LOOK-BEHIND MOVE>>
+               <TELL
+"As you reach for the mask, " 'VERONICA " pulls back, surprised.">
+               <COND (<IN? ,MICHAEL ,HERE>
+                      <TELL
+" " 'MICHAEL " knocks your hand away. \"What do you think you're doing?\"
+he says angrily. \"Are you trying to hurt my wife?\"">)>
+               <CRLF>)
+              (<VERB? TAKE> <FCLEAR ,FAIRY-MASK ,WEARBIT> <RFALSE>)
+              (<AND <VERB? PUT> <EQUAL? ,PRSI ,CORPSE>>
+               <MOVE ,FAIRY-MASK ,CORPSE>
+               <FSET ,FAIRY-MASK ,WEARBIT>
+               <TELL "Okay, the mask is on the body." CR>)
+              (<OR <VERB? LOOK-INSIDE SEARCH>
+                   <AND <VERB? SEARCH-OBJECT-FOR>
+                        <EQUAL? ,PRSO ,FAIRY-MASK>>>
+               <COND (<IN? ,FAIRY-MASK ,WINNER>
+                      <TELL
+"The inside of the mask is slightly damp with sweat.">
+                      <COND (<AND <IN? ,HAIR ,FAIRY-MASK>
+                                  <NOT <FSET? ,HAIR ,TOUCHBIT>>>
+                             <FCLEAR ,HAIR ,INVISIBLE>
+                             <TELL
+" Caught in the silver mesh is " A ,HAIR>
+                             <PRINT-CONTENTS ,FAIRY-MASK
+                                             ". There is also "
+                                             ,HAIR>
+                             <TELL ".">)
+                            (<PRINT-CONTENTS ,FAIRY-MASK
+                                             " The mask contains ">
+                             <TELL ".">)>
+                      <CRLF>)
+                     (ELSE <TELL ,YOU-DONT-HAVE "it." CR>)>)>>
+
+<OBJECT HAIR
+       (IN FAIRY-MASK)
+       (DESC "dark hair")
+       (SYNONYM HAIR)
+       (ADJECTIVE DARK)
+       (ACTION HAIR-F)
+       (FLAGS TAKEBIT BURNBIT INVISIBLE)
+       (SIZE 1)>
+
+<ROUTINE HAIR-F ()
+        <COND (<VERB? EXAMINE>
+               <TELL
+"The hair is dark and medium in length." CR>)
+              (<VERB? COMPARE>
+               <COND (<EQUAL? ,VERONICA-HAIR ,PRSO ,PRSI>
+                      <THEY-ARENT "even the same color">)
+                     (<EQUAL? ,ALICIA-HAIR ,PRSO ,PRSI>
+                      <TELL
+"The hairs look very similar in both color and length." CR>)
+                     (<EQUAL? ,LINDA-HAIR ,PRSO ,PRSI>
+                      <TELL
+"They don't resemble each other at all." CR>)>)>>
+
+<OBJECT VERONICA-HAIR
+       (IN CORPSE)
+       (DESC "Veronica's hair")
+       (SYNONYM HAIR)
+       (ADJECTIVE VERONICA)
+       (ACTION VERONICA-HAIR-F)
+       (FLAGS NDESCBIT FEMALE ;"means never use 'the'")
+       (SIZE 0)>
+
+<ROUTINE VERONICA-HAIR-F ()
+        <COND (<VERB? EXAMINE>
+               <TELL
+'PRSO " is short and blonde." CR>)>>
+
+<OBJECT ALICIA-HAIR
+       (IN ALICIA)
+       (DESC "Alicia's hair")
+       (SYNONYM HAIR)
+       (ADJECTIVE ALICIA)
+       (ACTION ALICIA-HAIR-F)
+       (FLAGS NDESCBIT FEMALE ;"means never use 'the'")>
+
+<ROUTINE ALICIA-HAIR-F ()
+        <COND (<VERB? EXAMINE>
+               <TELL
+'ALICIA-HAIR " is medium length and dark." CR>)
+              (<VERB? MOVE>
+               <TELL
+'ALICIA " fends you off. \"Are you crazy?\"" CR>)>>
+
+<OBJECT LINDA-HAIR
+       (IN LINDA)
+       (DESC "Linda's hair")
+       (SYNONYM HAIR)
+       (ADJECTIVE LINDA)
+       (ACTION LINDA-HAIR-F)
+       (FLAGS NDESCBIT FEMALE ;"means never use 'the'")>
+
+<ROUTINE LINDA-HAIR-F ()
+        <COND (<VERB? EXAMINE>
+               <TELL
+"Linda's hair is long and red." CR>)
+              (<VERB? MOVE>
+               <TELL
+"Linda pushes you away. \"Ouch!\"" CR>)>>
+
+<OBJECT PULSE
+       (IN CORPSE)
+       (DESC "vital signs")
+       (SYNONYM PULSE BREATH SIGNS)
+       (ADJECTIVE VITAL)
+       (ACTION PULSE-F)
+       (FLAGS NDESCBIT)
+       (SIZE 0)>
+
+<ROUTINE PULSE-F ()
+        <COND (<NOT <EQUAL? <META-LOC ,CORPSE> ,HERE>>
+               <NOT-HERE ,PULSE>)
+              (<VERB? TAKE ANALYZE RUB FIND>
+               <TELL ,THERE-IS "no sign of life in the corpse." CR>)
+              (<VERB? PUT> <TELL-YOU-CANT "take that">)
+              (<VERB? LISTEN>
+               <TELL "You hear nothing." CR>)>>
+
+<ROUTINE REVEAL-MURDER (WHO "AUX" N X (NEWS? <NOT <FSET? .WHO ,TOLD>>))
+        <COND (.NEWS?
+               <FSET .WHO ,TOLD>
+               %<DEBUG-CODE
+                 <COND (,GOSSIP
+                        <TELL
+"[" CD .WHO " revealed in " D <LOC .WHO> ".]" CR>)>>)>
+        <SET X <FIRST? <LOC .WHO>>>
+        <REPEAT ()
+                <COND (<NOT .X> <RETURN>)>
+                <SET N <NEXT? .X>>
+                <COND (<AND <FSET? .X ,PERSON>
+                            <NOT <FSET? .X ,TOLD>>>
+                       %<DEBUG-CODE
+                         <COND (,GOSSIP
+                                <TELL
+"[" CD .X " overhears in " D <LOC .X> ".]" CR>)>>
+                       <FSET .X ,TOLD>)>
+                <SET X .N>>
+        <COND (<NOT ,MURDER-PUBLIC?>
+               <SETG MURDER-PUBLIC? .WHO>
+               %<DEBUG-CODE
+                  <COND (,GOSSIP
+                         <TELL "[" D ,MURDER-PUBLIC? " called police.]" CR>)>>
+               <FSET ,DETECTIVE ,TOLD>
+               <FSET ,DUFFY ,TOLD>
+               <ENABLE <QUEUE I-POLICE-ARRIVE 25>>)>
+        <RETURN .NEWS?>>
+
+<OBJECT POLICE
+       (IN GLOBAL-OBJECTS)
+       (DESC "police")
+       (SYNONYM POLICE COPS)
+       (ADJECTIVE STATE COUNTY)
+       (ACTION POLICE-F)
+       (FLAGS PERSON NDESCBIT)>
+
+<ROUTINE POLICE-F ("AUX" WHO)
+        <COND (<VERB? PHONE>
+               <COND (<NOT <GLOBAL-IN? ,TELEPHONE ,HERE>>
+                      <TELL
+"If you yell loud enough, perhaps you can overcome the lack of a
+telephone." CR>
+                      <RTRUE>)>
+               <TELL "A bored desk sergeant answers the telephone. ">
+               <COND (,MURDER-PUBLIC?
+                      <TELL
+"You describe the situation,
+but he says, \"Hey, we're sending someone over, in fact, two of our best
+officers are on the case.\"" CR>)
+                     (<NOT <FSET? ,OFFICE ,TOUCHBIT>>
+                      <TELL
+"After a few minutes of listening
+to you, he asks angrily if you have anything to report. Not getting a
+reasonable answer to that poser, he hangs up." CR>)
+                     (ELSE
+                      <REVEAL-MURDER ,PLAYER>
+                      <TELL
+"He becomes considerably less
+bored as you describe the situation. \"Don't let anyone leave,\" he says.
+\"There'll be someone there in no time. Don't touch anything!\"" CR>)>)
+              (<VERB? WAIT-FOR>
+               <PERFORM ,V?WAIT-FOR ,DETECTIVE>
+               <RTRUE>)
+              (<OR <AND <IN? ,DETECTIVE ,HERE>
+                        <SET WHO ,DETECTIVE>>
+                   <AND <IN? ,DUFFY ,HERE>
+                        <SET WHO ,DUFFY>>>
+               <PERFORM ,PRSA
+                        <COND (<EQUAL? ,PRSO ,POLICE> .WHO)
+                              (ELSE ,PRSO)>
+                        <COND (<EQUAL? ,PRSI ,POLICE> .WHO)
+                              (ELSE ,PRSI)>>
+               <RTRUE>)
+              (<AND <VERB? ASK-ABOUT TELL-ME>
+                    <EQUAL? ,PRSI ,POLICE>>
+               <RFALSE>)
+              (<VERB? FIND>
+               <TELL
+"You never can find a policeman when you want one, can you?" CR>)
+              (ELSE
+               <COND (<VERB? TELL>
+                      <SETG P-CONT <>>
+                      <SETG QUOTE-FLAG <>>)>
+               <TELL ,HAVE-TO "find one first." CR>)>>
+
+\\f
+
+<OBJECT GLOBAL-ALICIA
+       (IN GLOBAL-OBJECTS)
+       (DESC "Alicia")
+       (SYNONYM GIRL BARRON ALICIA)
+       (ADJECTIVE ALICIA HAREM MS MISS)
+       (ACTION GLOBAL-PERSON-F)
+       (FLAGS TRANSBIT CONTBIT PERSON FEMALE)
+       (CHARACTER 3)>
+
+<OBJECT ALICIA
+       (DESC "Alicia")
+       (SYNONYM GIRL BARRON ALICIA)
+       (ADJECTIVE ALICIA HAREM MS MISS)
+       (ACTION ALICIA-F)
+       (DESCFCN ALICIA-DESC-F)
+       (FLAGS TRANSBIT CONTBIT PERSON FEMALE)
+       (CHARACTER 3)>
+
+<GLOBAL ALICIA-SEEN 0>
+
+<ROUTINE ALICIA-DESC-F ("OPTIONAL" (RARG <>))
+        <TELL 'ALICIA ", ">
+        <COND (<IN? ,ALICIA-COAT ,ALICIA>
+               <TELL "wearing a wet overcoat">)
+              (ELSE
+               <TELL "dressed in harem silks">)>
+        <TELL ", is">
+        <TELL-HERE>>
+
+<OBJECT ALICIA-COAT
+       (IN ALICIA)
+       (DESC "wet overcoat")
+       (SYNONYM OVERCOAT COAT)
+       (ADJECTIVE ALICIA WET)
+       (ACTION ALICIA-COAT-F)
+       (FLAGS TAKEBIT BURNBIT NDESCBIT CONTBIT
+              TRYTAKEBIT OPENBIT SEARCHBIT ALICIABIT)>
+
+<OBJECT LABEL
+       (IN ALICIA-COAT)
+       (DESC "label")
+       (SYNONYM LABEL)
+       (ACTION ALICIA-COAT-F)
+       (FLAGS INVISIBLE READBIT)
+       (TEXT
+"In the coat is a label which reads \"Lord and Taylor\" and underneath
+that in sewn script, \"Alicia Barron.\"")>
+
+<ROUTINE ALICIA-COAT-F ()
+        <COND (<VERB? LOOK-INSIDE LOOK-UNDER EXAMINE TAKE TAKE-OFF READ>
+               <COND (<IN? ,ALICIA-COAT ,ALICIA>
+                      <COND (<NOT <VERB? EXAMINE>>
+                             <TELL
+'ALICIA " draws the coat more tightly around herself. \"Just what do you
+think you're doing?\" she asks, frostily." CR>)
+                            (ELSE
+                             <TELL
+"It's a wet overcoat." CR>)>)
+                     (<IN? ,ALICIA-COAT ,BUTLER>
+                      <TELL "The butler has the coat now." CR>)
+                     (<NOT <VERB? TAKE TAKE-OFF>>
+                      <FCLEAR ,LABEL ,INVISIBLE>
+                      <TELL <GETP ,LABEL ,P?TEXT> CR>)>)
+              (<VERB? SMELL>
+               <TELL
+"It smells wet." CR>)
+              (<VERB? RUB>
+               <TELL
+"It feels wet." CR>)
+              (<VERB? THROUGH WEAR>
+               <IT-DOESNT-FIT>)>>
+
+<ROUTINE ALICIA-F ("AUX" (HADBIT? <>))
+        <COND (<EQUAL? ,WINNER ,ALICIA>
+               <COND (<VERB? HELLO>
+                      <TELL
+"\"Hello. You must be the reporter " 'VERONICA " said was coming tonight.\"" CR>)
+                     (<AND <VERB? GIVE>
+                           <EQUAL? ,PRSO ,ALICIA-COAT>
+                           <EQUAL? ,PRSI ,BUTLER>>
+                      <MOVE ,ALICIA-COAT ,BUTLER>
+                      <FCLEAR ,ALICIA-COAT ,NDESCBIT>
+                      <COND (<EQUAL? ,HERE <LOC ,ALICIA>>
+                             <TELL
+'ALICIA " gives " 'BUTLER " her coat, which is soaking wet. Underneath
+she is wearing a harem girl costume which leaves little to the imagination."
+CR>)>
+                      <RTRUE>)
+                     (<DONT-HANDLE?> <RFALSE>)
+                     (ELSE
+                      <TELL
+"\"I beg your pardon?\" she replies." CR>)>)
+              (<VERB? EXAMINE>
+               <TELL
+'ALICIA " Barron, a dark-haired young woman about 5'2\" tall, is dressed ">
+               <COND (<IN? ,ALICIA-COAT ,ALICIA>
+                      <TELL
+"in a soaking wet overcoat. ">
+                      <TELL-YOU-CANT "tell what costume she may be wearing
+underneath">)
+                     (ELSE
+                      <TELL "as
+a harem girl. She is a slender, attractive woman. The costume is a
+revealing one, and she seems to be pleased with the results." CR>)>)
+              (<AND <VERB? $REVEAL> <EQUAL? ,PRSO ,GLOBAL-MURDER>>
+               <REVEAL-MURDER ,ALICIA>
+               <COND (<IN? ,PRSI ,HERE>
+                      <SOMEONE-TELLS-ALICIA T>)
+                     (<NEARBY? ,ALICIA>
+                      <SOMEONE-TELLS-ALICIA <>>)>)
+              (<AND <VERB? REVEAL> <EQUAL? ,PRSO ,GLOBAL-MURDER>>
+               <COND (<REVEAL-MURDER ,ALICIA>
+                      <ALICIA-HORRIFIED>)
+                     (T
+                      <TELL "\"Yes, I know, isn't it horrible?\"" CR>)>)
+              (<AND <VERB? ASK-ABOUT> <EQUAL? ,PRSO ,ALICIA>>
+               <COND (<NOT <FSET? ,PRSI ,PERSON>>
+                      <COND (<EQUAL? ,PRSI ,GLOBAL-MURDER>
+                             <COND (<FSET? ,PRSO ,TOLD>
+                                    <ALICIA-HORRIFIED>)
+                                   (T
+                                    <TELL
+"\"What murder do you mean?\"" CR>)>)
+                            (<EQUAL? ,PRSI ,ALICIA-COAT>
+                             <TELL
+"\"What about it? It's just my wet overcoat.\"" CR>)
+                            (<EQUAL? ,PRSI ,ALICIA-CAR>
+                             <TELL
+"\"I parked it on the other side of the barn, out of the way of all
+the other cars.\"" CR>)
+                            (<EQUAL? ,PRSI ,HAIR>
+                             <COND (<EQUAL? <META-LOC ,HAIR> ,HERE>
+                                    <TELL
+"She examines the hair carefully. \"It doesn't look like one of mine to
+me,\" she says. She doesn't sound terribly convincing." CR>)
+                                   (ELSE
+                                    <TELL
+,I-DONT-KNOW "what you mean.\"" CR>)>)
+                            (<EQUAL? ,PRSI ,HORSE>
+                             <TELL
+"\"I'm not the rider that some here are: " 'VERONICA " "
+<COND (<FSET? ,ALICIA ,TOLD> "was") (T "has been")> " a dressage
+champion several times. I like riding to hounds though. Except at the
+end when the dogs get the fox. I can't stand the sight of blood.\"" CR>)
+                            (ELSE
+                             <I-DONT-KNOW-ABOUT "that">)>)
+                     (<EQUAL? ,PRSI ,PLAYER>
+                      <TELL
+"\"" 'VERONICA " mentioned you to me a week or two ago, and I suggested she
+invite you. She remembers you fondly from school.\"" CR>)
+                     (<EQUAL? ,PRSI ,ALICIA ,GLOBAL-ALICIA>
+                      <TELL
+"\"There's not much to say. I've had a pretty dull life, not anything
+that would interest your readers.\"" CR>)
+                     (<IN? ,PRSI ,HERE>
+                      <TELL
+"\"I have nothing but good things to say about " HIM/HER ,PRSI ".\"" CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-MICHAEL>
+                      <COND (<NOT <FSET? ,PRSO ,TOLD>>
+                             <TELL
+"\"" 'MICHAEL " is a fine man. I wish I could say that " 'VERONICA " treats him
+as well as he deserves.\"" CR>)
+                            (ELSE
+                             <TELL
+"\"Now he's free of that creature! It serves her right.\"" CR>)>)
+                     (<EQUAL? ,PRSI ,GLOBAL-VERONICA>
+                      <COND (<NOT <FSET? ,PRSO ,TOLD>>
+                             <TELL
+"\"" 'VERONICA " and I went to school together. I probably know her as
+well as anyone. She has her faults. Of course, I suppose
+we all do.\"" CR>)
+                            (ELSE
+                             <TELL
+"\"She was too hard a woman. She must have just pushed someone too hard.
+I knew it would happen eventually.\"" CR>)>)
+                     (<EQUAL? ,PRSI ,GLOBAL-RICHARD>
+                      <TELL
+"\"Poor Richard. He's such a wimp where " 'VERONICA " is concerned.\"" CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-COL-MARSTON>
+                      <TELL
+"\"A silly old fool, if you ask me. He has that sinecure job with the
+trust. I doubt he's had an original thought in his life.\"" CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-LINDA>
+                      <TELL
+"\"Isn't she something? I never thought I'd see an Ashcroft hanging around
+with the likes of her. Richard acts like he's thirteen years old sometimes,
+especially where women are concerned.\"" CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-SEN-ASHER>
+                      <TELL
+"\"I'll vote for him any time. He's so handsome!\"" CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-COCHRANE>
+                      <TELL
+"\"What an oaf! I can't imagine why he's here, unless it's to make trouble
+of some kind.\"" CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-OSTMANN>
+                      <TELL
+"\"A courtly gentleman, isn't he? That black cape makes him look almost
+cuddly.\"" CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-BUTLER>
+                      <TELL
+"\"" 'BUTLER " is so silly in that gorilla suit, and he keeps trying to look
+dignified. Perhaps I should find him some bananas to carry around.\" She
+giggles." CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-BARTENDER>
+                      <TELL
+"\"" 'VERONICA " hired him for tonight.\"" CR>)
+                     (ELSE
+                      <TELL
+"\"I have no opinion.\"" CR>)>)
+              (<VERB? SHOW>
+               <COND (<FSET? ,PRSO ,ALICIABIT>
+                      <SET HADBIT? T>
+                      <FCLEAR ,PRSO ,ALICIABIT>
+                      <SETG ALICIA-SEEN <+ ,ALICIA-SEEN 1>>
+                      <ENABLE <QUEUE I-FLEE 10>>)>
+               <COND (<EQUAL? ,PRSO ,MASK>
+                      <TELL
+"\"That looks like " 'VERONICA "'s mask.\"" CR>)
+                     (<AND <EQUAL? ,PRSO ,HAIR>
+                           <IN? ,HAIR ,FAIRY-MASK>>
+                      <TELL
+"\"I don't see what this has to do with me. " 'VERONICA " probably
+dyed her hair. I wouldn't put it past her.\"" CR>)
+                     (<EQUAL? ,PRSO ,HAIR>
+                      <TELL
+"\"Why are you showing me this? It's just a hair.\"" CR>)
+                     (<EQUAL? ,PRSO ,HAIR-ANALYSIS>
+                      <TELL
+"\"That's silly! You think it's my hair? Millions of women have dark
+hair! You know those costume places, they don't really clean the costumes
+very well, the hair's probably been there for months.\"" CR>)
+                     (<EQUAL? ,PRSO ,CORPSE>
+                      <COND (<REVEAL-MURDER ,ALICIA>
+                             <TELL
+"It takes Alicia a few moments to recover from the shock. Then, suddenly,
+she laughs! \"This is wonderful! Now I can marry " 'MICHAEL "! But why
+are you doing this?" ,CALLING-POLICE CR>)
+                            (ELSE
+                             <TELL
+"\"Yes, I know. It's horrible, isn't it?\" She chuckles. \"She was my
+friend, but I'm glad she's dead. Now I can marry " 'MICHAEL ".\"" CR>)>)
+                     (.HADBIT?
+                      <TELL
+,I-DONT-KNOW "what you hope to accomplish waving these things in my
+face.\"" CR>)>)>>
+
+<ROUTINE ALICIA-HORRIFIED ()
+        <TELL
+"\"It's horrible! She was my best friend. Who could have done such
+a thing?\"" CR>>
+
+<ROUTINE SOMEONE-TELLS-ALICIA (HERE?)
+        <TELL
+CD ,WINNER " tells Alicia " <COND (.HERE? "of the murder") (T "something")>
+". It horrifies and then elates her." CR>>
+
+<GLOBAL CALLING-POLICE " I'm calling the police!\"">
+
+<OBJECT ALICIA-CAR
+       (IN GLOBAL-OBJECTS)
+       (DESC "Alicia's car")
+       (SYNONYM CAR)
+       (ADJECTIVE ALICIA)
+       (FLAGS NDESCBIT)>
+
+<GLOBAL FLEEING? <>>
+
+<ROUTINE I-FLEE ()
+        <COND (<G? ,ALICIA-SEEN 2>
+               <SETG FLEEING? T>
+               <ESTABLISH-GOAL ,ALICIA ,SITTING-ROOM T>)>
+        <COND (<G? ,MICHAEL-SEEN 1>
+               <SETG FLEEING? T>
+               <ESTABLISH-GOAL ,MICHAEL ,SITTING-ROOM T>)>
+        <RFALSE>>
+
+<OBJECT NOT-ROPE
+       (IN PLAYER)
+       (DESC "lariat (no, you left it with your coat)")
+       (SYNONYM LARIAT LASSO ROPE)
+       (ACTION NOT-ROPE-F)
+       (FLAGS NDESCBIT TRYTAKEBIT TAKEBIT)>
+
+<ROUTINE NOT-ROPE-F ()
+        <REMOVE ,NOT-ROPE>
+        <TELL
+"Remember, the silly thing was getting in your way, particularly when you
+danced, so you went back and hung it in the closet with your coat.">
+        <COND (<EQUAL? ,HERE ,EAST-COAT-CLOSET>
+               <TELL
+" But it doesn't seem to be here now.">)>
+
+        <CRLF>>
+
+<OBJECT ROPE
+       (IN OFFICE)
+       (DESC "lariat")
+       (SYNONYM LARIAT LASSO ROPE)
+       (ACTION ROPE-F)
+       (FLAGS NDESCBIT TRYTAKEBIT TAKEBIT BURNBIT WEAPONBIT)>
+
+<ROUTINE ROPE-F ()
+        <REMOVE ,NOT-ROPE>
+        <COND (<VERB? EXAMINE>
+               <TELL
+"It's a fairly thin rope, like the sort of rope movie cowboys carry. It
+looks serviceable, though." CR>)
+              (<VERB? TAKE>
+               <COND (<DONT-TAKE-EVIDENCE ,ROPE> <RTRUE>)
+                     (T
+                      <FCLEAR ,ROPE ,NDESCBIT>
+                      <RFALSE>)>)>>
+
+<ROUTINE DONT-TAKE-EVIDENCE (OBJ "AUX" WHO)
+        <COND (<IN? ,DETECTIVE ,HERE>
+               <SET WHO ,DETECTIVE>)
+              (<IN? ,DUFFY ,HERE>
+               <SET WHO ,DUFFY>)
+              (ELSE <RFALSE>)>
+        <TELL CD .WHO " stops you. \"That " D .OBJ " is evidence. Don't
+take it!\"" CR>>
+
+<GLOBAL ALICIA-HERE? <>>
+
+<ROUTINE TELL-ALICIA-ARRIVES ()
+        <TELL "Alicia Barron" ,ARRIVES>>
+
+<GLOBAL ARRIVES " arrives at the ">
+
+<ROUTINE TELL-ARRIVES (WHO)
+        <TELL CD .WHO ,ARRIVES>>
+
+<ROUTINE G-ALICIA (GARG "AUX" (L <LOC ,ALICIA>))
+        <COND (<NOT .GARG> <IMOVEMENT ,ALICIA G-ALICIA>)
+              (<EQUAL? .GARG ,G-IMPATIENT>
+               <TELL
+"Alicia seems to be looking for any excuse to leave you." CR>)
+              (<EQUAL? .GARG ,G-ENROUTE>
+               <COND (<AND <EQUAL? .L ,HALLWAY-12>
+                           <IN? ,ALICIA-COAT ,ALICIA>>
+                      <FCLEAR ,ALICIA-COAT ,NDESCBIT>
+                      <MOVE ,ALICIA-COAT ,EAST-COAT-CLOSET>
+                      <COND (<OR <CORRIDOR-LOOK ,ALICIA>
+                                 <EQUAL? ,HERE ,EAST-COAT-CLOSET>>
+                             <TELL
+'ALICIA " deposits her coat in the coat closet." CR>)>)>)
+              (<EQUAL? .GARG ,G-REACHED ,G-ALREADY>
+               <COND (<AND <IN? ,ALICIA ,BALLROOM-5>
+                           <IN? ,MICHAEL ,BALLROOM-5>>
+                      <SETG ALICIA-HERE? T>
+                      <THEY-DANCE ,ALICIA>)
+                     (<EQUAL? .L ,PORCH>
+                      <SETG NEW-ARRIVAL ,ALICIA>
+                      <ESTABLISH-GOAL ,MICHAEL ,BALLROOM-5>
+                      <ESTABLISH-GOAL ,BUTLER ,HALL T>
+                      <COND (<EQUAL? ,HERE ,PORCH>
+                             <TELL-ALICIA-ARRIVES>
+                             <TELL
+"front porch. Her overcoat is soaking wet.">
+                             <COND (<NOT ,PLAYER-HIDING>
+                                    <TELL
+" \"Hi,\" she says. \"Late as usual. I parked back near the barn, there
+are so many cars out here I'm afraid someone would dent mine.\"">)>
+                             <TELL
+" She rings " THE ,DOORBELL "." CR>)
+                            (<EQUAL? ,HERE ,CIRCLE>
+                             <TELL-ALICIA-ARRIVES>
+                             <TELL
+'FRONT-DOOR " and rings the bell." CR>)
+                            (<NOT <OUTSIDE? ,HERE>>
+                             <TELL
+CTHE ,DOORBELL " rings." CR>)>)
+                     (<AND ,FLEEING? <EQUAL? .L ,SITTING-ROOM>>
+                      <UNPRIORITIZE ,ALICIA>
+                      <COND (<IN? ,MICHAEL .L>
+                             <GOALS? ,MICHAEL T>
+                             <ESTABLISH-GOAL ,ALICIA ,BARN T>
+                             <ESTABLISH-GOAL ,MICHAEL ,BARN T>)
+                            (T
+                             <GOALS? ,ALICIA <>>)>
+                      <RFALSE>)
+                     (<EQUAL? .L ,BARN>
+                      <GOALS? ,ALICIA <>>
+                      <BARN-DANCE ,ALICIA>)>)>>
+
+<ROUTINE BARN-DANCE (WHO "AUX" (FLG <>))
+        <ENABLE <QUEUE I-ESCAPE 20>>
+        <COND (<FSET? ,BARN-DOOR ,LOCKED>
+               <FCLEAR ,BARN-DOOR ,LOCKED>
+               <COND (<EQUAL? ,HERE ,WEST-OF-GARAGE>
+                      <TELL
+'WHO " unlocks the barn door and enters." CR>
+                      <SET FLG T>)>)>
+        <OR <I-SCREAMS> .FLG>>
+
+<ROUTINE I-SCREAMS ()
+        <ENABLE <QUEUE I-SCREAMS 1>>
+        <COND (<AND <IN? ,MICHAEL ,BARN>
+                    <IN? ,ALICIA ,BARN>
+                    <EQUAL? ,HERE
+                            ,WEST-OF-HOUSE
+                            ,WEST-OF-GARAGE
+                            ,NORTH-OF-HOUSE>>
+               <TELL
+"You hear shouting and screams from the direction of the barn." CR>)>>
+
+<ROUTINE I-ESCAPE ()
+        <REMOVE ,ALICIA>
+        <DISABLE <INT I-SCREAMS>>
+        <COND (<OUTSIDE? ,HERE>
+               <TELL
+"You hear a car off behind the barn. The sound grows fainter and
+fainter." CR>)>>
+
+<ROUTINE I-ALICIA-SNEAKS ()
+        <COND (<AND <NOT <EQUAL? ,HERE ,GARDEN ,WALKWAY ,HALLWAY-7>>
+                    <NOT <EQUAL? ,HERE ,NORTH-OF-HOUSE ,HALLWAY-14>>>
+               <START-ALICIA ,WALKWAY>)
+              (<AND <NOT <EQUAL? ,HERE
+                                 ,HALLWAY-4 ,HALLWAY-3 ,HALLWAY-2>>
+                    <NOT <EQUAL? ,HERE
+                                 ,HALLWAY-1 ,WEST-OF-GARAGE>>>
+               <COND (,ALICIA-WAITED?
+                      <START-ALICIA ,WEST-OF-GARAGE>)
+                     (ELSE
+                      <SETG ALICIA-WAITED? T>
+                      <QUEUE I-ALICIA-SNEAKS 3>)>)>
+        <RFALSE>>
+
+<GLOBAL ALICIA-WAITED? <>>
+
+<ROUTINE START-ALICIA (RM)
+        <DISABLE <INT I-ALICIA-SNEAKS>>
+        <MOVE ,ALICIA .RM>
+        <ESTABLISH-GOAL ,ALICIA ,PORCH>
+        <FCLEAR ,CORPSE ,INVISIBLE>
+        <FSET ,NORTH-DOOR ,LOCKED>
+        <FSET ,WEST-DOOR ,LOCKED>
+        <FCLEAR ,NORTH-OFFICE-DOOR ,LOCKED>
+        <FCLEAR ,SOUTH-OFFICE-DOOR ,LOCKED>
+        <FCLEAR ,MEDIA-OFFICE-DOOR ,LOCKED>
+        <FCLEAR ,NORTH-OFFICE-DOOR ,OPENBIT>
+        <FCLEAR ,SOUTH-OFFICE-DOOR ,OPENBIT>
+        <FCLEAR ,MEDIA-OFFICE-DOOR ,OPENBIT>>
+
+<ROUTINE THEY-DANCE (LAST "AUX" FIRST)
+        <ENABLE <QUEUE I-MICHAEL-TO-GARAGE 5>>
+        <NEW-SCRIPT ,MICHAEL ,MICHAEL-LOOP>
+        <COND (<IN-BALLROOM? ,PLAYER>
+               <COND (<EQUAL? .LAST ,MICHAEL> <SET FIRST ,ALICIA>)
+                     (ELSE <SET FIRST ,MICHAEL>)>
+               <TELL
+D .LAST " walks up to " D .FIRST " and they begin to dance." CR>)>>
+
+<ROUTINE I-MICHAEL-TO-GARAGE ()
+        <COND (,MICHAEL-TO-GARAGE? <RFALSE>)
+              (<AND <OR <FSET? ,MICHAEL ,TOLD>
+                        ,GANG-BEEN-TO-OFFICE?>
+                    <NOT <EQUAL? <GET <GET ,GOAL-TABLES ,MICHAEL-C>
+                                      ,GOAL-F>
+                                 ,OFFICE
+                                 ,HALLWAY-3>>>
+               %<DEBUG-CODE
+                 <COND (,DEBUG
+                        <TELL "[Michael heads to Garage]" CR>)>>
+               <SETG MICHAEL-TO-GARAGE? T>
+               <ESTABLISH-GOAL ,ALICIA ,BALLROOM-9>
+               <ESTABLISH-GOAL ,MICHAEL ,GARAGE T>)
+              (ELSE
+               %<DEBUG-CODE
+                 <COND (,DEBUG
+                        <TELL "[Michael isn't ready]" CR>)>>
+               <ENABLE <QUEUE I-MICHAEL-TO-GARAGE 5>>)>
+        %<DEBUG-CODE <COND (,DEBUG <RTRUE>)>>
+        <RFALSE>>
+
+<GLOBAL MICHAEL-TO-GARAGE? <>>
+
+\\f
+
+<OBJECT GLOBAL-RICHARD
+       (IN GLOBAL-OBJECTS)
+       (DESC "Richard")
+       (SDESC "Werewolf")
+       (SYNONYM ASHCROFT WEREWOLF RICHARD)
+       (ADJECTIVE MR RICHARD)
+       (ACTION GLOBAL-PERSON-F)
+       (FLAGS TRANSBIT PERSON THE)
+       (CHARACTER 4)>
+
+<OBJECT RICHARD
+       (IN SITTING-ROOM)
+       (SDESC "Werewolf")
+       (LDESC "A petulant werewolf slouches nearby.")
+       (SYNONYM ASHCROFT WEREWOLF RICHARD)
+       (ADJECTIVE MR RICHARD)
+       (ACTION RICHARD-F)
+       (FLAGS TRANSBIT PERSON THE)
+       (CHARACTER 4)>
+
+<GLOBAL RICHARD-SDESC "Richard">
+
+<ROUTINE RICHARD-UNMASKED? ()
+        <EQUAL? <GETP ,RICHARD ,P?SDESC> ,RICHARD-SDESC>>
+
+<ROUTINE RICHARD-UNMASKS ()
+        <FCLEAR ,RICHARD ,THE>
+        <PUTP ,RICHARD ,P?SDESC ,RICHARD-SDESC>
+        <FCLEAR ,GLOBAL-RICHARD ,THE>
+        <PUTP ,GLOBAL-RICHARD ,P?SDESC ,RICHARD-SDESC>
+        <PUTP ,RICHARD ,P?LDESC
+"Richard Ashcroft, the petulant werewolf, slouches nearby.">>
+
+<ROUTINE RICHARD-F ()
+        <COND (<EQUAL? ,WINNER ,RICHARD>
+               <COND (<OR <VERB? UNMASK>
+                          <AND <VERB? WHAT> <EQUAL? ,PRSO ,YOU>>>
+                      <COND (<RICHARD-UNMASKED?>
+                             <TELL
+"\"I'm still Richard.\"" CR>)
+                            (<PROB 50>
+                             <TELL
+"\"None of your business! Grrr!\"" CR>)
+                            (ELSE
+                             <RICHARD-UNMASKS>
+                             <TELL
+"He answers somewhat gruffly, \"Oh, I'm Richard under all this fur.\"" CR>)>)
+                     (<VERB? HELLO>
+                      <TELL
+"Richard mumbles a surly greeting." CR>)
+                     (<DONT-HANDLE?> <RFALSE>)
+                     (ELSE
+                      <TELL
+"\"Not on your life!\" he says angrily." CR>)>)
+              (<VERB? EXAMINE>
+               <COND (<RICHARD-UNMASKED?>
+                      <TELL
+"Richard Ashcroft is " 'VERONICA "'s younger brother, and">)
+                     (ELSE
+                      <TELL "The wearer of the costume">)>
+               <TELL" appears as a plump and petulant
+werewolf, although he has gone to the trouble of smearing something wet
+and red on his chin which looks authentically bloody." CR>)
+              (<AND <VERB? REVEAL> <EQUAL? ,PRSO ,GLOBAL-MURDER>>
+               <COND (<REVEAL-MURDER ,RICHARD>
+                      <TELL
+"\"You're joking, of course. No, you're not, are you?\" He seems
+shocked, but it's hard to tell if it's just a pose." CR>)
+                     (ELSE
+                      <TELL
+"\"I already know.\"" CR>)>)
+              (<VERB? UNMASK>
+               <TELL
+"\"Hey, watch it! I'll bite you!\"" CR>)
+              (<AND <VERB? ASK-ABOUT> <EQUAL? ,PRSO ,RICHARD>>
+               <COND (<NOT <RICHARD-UNMASKED?>>
+                      <COND (<NOT <FSET? ,PRSO ,TOLD>>
+                             <TELL "\"Grrr!\"" CR>
+                             <RTRUE>)
+                            (ELSE
+                             <RICHARD-UNMASKS>
+                             <TELL
+"The werewolf removes his mask, revealing him as Richard, " 'VERONICA "'s
+younger brother. ">)>)>
+               <COND (<EQUAL? ,PRSI ,PLAYER>
+                      <TELL
+"\"I've never met you before tonight. You work for the paper,
+right?\"" CR>)
+                     (<EQUAL? ,PRSI ,RICHARD>
+                      <TELL
+"\"Me? I'm not interesting enough to write about. Write about my sister
+instead, she's interesting: she's the Dragon Lady, not the Fairy Queen.\"" CR>)
+                     (<IN? ,PRSI ,HERE>
+                      <TELL
+"\"Are you trying to cause trouble? You must think I'm drunk and will say
+anything about anyone.\"" CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-MICHAEL>
+                      <TELL
+"\"" 'MICHAEL "? He thinks he's pretty wonderful, but he just slides around
+after my sister, taking whatever he can. I don't think he ever loved
+her, but then, I don't think anyone ever loved her.\"" CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-VERONICA>
+                      <COND (<FSET? ,PRSO ,TOLD>
+                             <TELL
+"\"You think I did it, don't you? If I was the sort of person
+who could kill her, I would have long ago, believe me!\"" CR>)
+                            (ELSE
+                             <TELL
+"\"She's my older sister, but she acts like she's my keeper.
+I have to account for my every move, like I was still ten years old.\"" CR>)>)
+                     (<EQUAL? ,PRSI ,GLOBAL-ALICIA>
+                      <TELL
+"\"She's such a goodie two-shoes, she's been " 'VERONICA "'s friend for years,
+but you know something? Whenever they're apart, she cuts her
+up something fierce. I have my suspicions about her.\"" CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-COL-MARSTON>
+                      <TELL
+"\"That pompous blowhard! He's been in clover for
+years, just because he was a crony of my father's. Now he runs the trust
+and " 'VERONICA " has him in the palm of her hand! But I'll get mine
+one of these days, just wait!\"" CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-LINDA>
+                      <TELL
+"\"Linda's a perfect example of my sister's interference. She's sweet, and
+lovely, and I love her, but my sister can't stand her because her family
+didn't come over on the Mayflower.\"" CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-SEN-ASHER>
+                      <TELL
+"\"Our family has known him for years, since he was just on the county
+council. I'd think more of him if " 'VERONICA " didn't like him so much.\"" CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-COCHRANE>
+                      <TELL
+,I-DONT-KNOW "why " 'VERONICA " invited him. He's making a fool
+of himself. He's going to have trouble from me if he keeps
+staring at Linda like that.\"" CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-OSTMANN>
+                      <TELL
+"\"Who's he? He seems like a nice enough fellow.\"" CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-BUTLER>
+                      <TELL
+"\"He's been here so long he's part of the furniture.
+He taught me to ride when I was a child. " 'VERONICA ", too. Dad was
+too busy.\"" CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-BARTENDER>
+                      <TELL
+"\"He's somebody " 'VERONICA " hired.\"" CR>)
+                     (ELSE
+                      <I-WOULDNT-KNOW>)>)>>
+
+<ROUTINE G-RICHARD (GARG)
+        <COND (<NOT .GARG> <IMOVEMENT ,RICHARD G-RICHARD>)
+              (<EQUAL? .GARG ,G-IMPATIENT>
+               <TELL
+CD ,RICHARD " seems to find you more and more boring as time passes." CR>)>>
+
+\\f
+
+<OBJECT GLOBAL-COL-MARSTON
+       (IN GLOBAL-OBJECTS)
+       (DESC "Colonel Marston")
+       (SYNONYM MARSTON EXPLORER HUNTER ROBERT)
+       (ADJECTIVE COLONEL ROBERT)
+       (ACTION GLOBAL-PERSON-F)
+       (FLAGS TRANSBIT PERSON)
+       (CHARACTER 5)>
+
+<OBJECT COL-MARSTON
+       (IN LIVING-ROOM)
+       (DESC "Colonel Marston")
+       (LDESC "Colonel Marston, the African Explorer, is here.")
+       (SYNONYM MARSTON EXPLORER HUNTER ROBERT)
+       (ADJECTIVE COL COLONEL ROBERT)
+       (ACTION COL-MARSTON-F)
+       (FLAGS TRANSBIT PERSON)
+       (CHARACTER 5)>
+
+<GLOBAL MARSTON-SEEN-TRUST-DOCUMENTS? <>>
+
+<ROUTINE COL-MARSTON-F ()
+        <COND (<EQUAL? ,WINNER ,COL-MARSTON>
+               <COND (<VERB? HELLO>
+                      <TELL
+"He replies, somewhat curtly." CR>)
+                     (<DONT-HANDLE?> <RFALSE>)
+                     (ELSE
+                      <TELL 'COL-MARSTON " only scowls at you." CR>)>)
+              (<VERB? EXAMINE>
+               <TELL
+'COL-MARSTON " is bedecked as an explorer or perhaps a big-game hunter.
+From pith helmet down to whipcord trousers, he looks the part. His
+gaze is steely and his white mustache painstakingly trimmed." CR>)
+              (<AND <VERB? REVEAL> <EQUAL? ,PRSO ,GLOBAL-MURDER>>
+               <COND (<REVEAL-MURDER ,COL-MARSTON>
+                      <TELL
+"\"Are you sure? I mean, how terrible!\" He seems to have conflicting
+feelings about what he has just heard." CR>)
+                     (ELSE
+                      <TELL
+"\"I already know. Only a reporter would be spreading this like it was
+some bit of dirty gossip.\"" CR>)>)
+              (<VERB? ACCUSE>
+               <COND (<EQUAL? ,PRSI ,GLOBAL-EMBEZZLEMENT>
+                      <COND (,MARSTON-SEEN-TRUST-DOCUMENTS?
+                             <TELL
+"\"You'd have a hard time proving anything, documents or no. At the worst,
+they would say I've made some bad investments. Of course, you could try
+to ruin me in the press, but I'll sue if you do. You know most libel
+suits are found for the plaintiff these days.\"" CR>)
+                            (ELSE
+                             <TELL
+"\"What could you mean by that? I've never stolen anything in my life.
+I've never had to.\" He grins." CR>)>)
+                     (<EQUAL? ,PRSI ,GLOBAL-MURDER>
+                      <TELL
+"\"What a ridiculous accusation!\"" CR>)>)
+              (<AND <VERB? ASK-ABOUT> <EQUAL? ,PRSO ,COL-MARSTON>>
+               <COND (<NOT <FSET? ,PRSI ,PERSON>>
+                      <COND (<EQUAL? ,PRSI ,GLOBAL-MURDER>
+                             <COND (<FSET? ,PRSO ,TOLD>
+                                    <TELL
+"\"Maybe she surprised someone. A sneak thief, probably.\"" CR>)
+                                   (T
+                                    <TELL
+,I-DONT-KNOW "of any murder.\"" CR>)>)
+                            (<EQUAL? ,PRSI ,TRUST ,TRUST-FOLDER
+                                     ,TRUST-DOCUMENTS>
+                             <COND (,MARSTON-SEEN-TRUST-DOCUMENTS?
+                                    <TELL
+"\"What more could I tell you? You'll just write lies anyway!\"" CR>)
+                                   (ELSE
+                                    <TELL
+"\"I've run the Trust for almost twenty years. I'm proud of what I've done.
+Sure, there have been some bad years, but the trend is up.\" He looks
+resolved and confident." CR>)>)
+                            (ELSE
+                             <I-DONT-KNOW-ABOUT "it that would interest you">)>)
+                     (<EQUAL? ,PRSI ,PLAYER>
+                      <TELL
+"\"I don't like reporters very much, if that's what you're getting at.\"" CR>)
+                     (<EQUAL? ,PRSI ,COL-MARSTON>
+                      <TELL
+"\"Well, I'm really semi-retired. I run the Ashcroft Family Trust, but it
+mostly runs itself: I don't need to be involved in day-to-day operations
+too much. Just a decision now and then.\"" CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-VERONICA ,CORPSE>
+                      <COND (,MARSTON-SEEN-TRUST-DOCUMENTS?
+                             <TELL
+"\"She was conspiring against me! She had some foolish idea that I'm not
+running the trust properly. That's what those ridiculous documents are
+about! Now she's dead, and it's only just desserts!\" He turns livid with
+embarrassment. \"I didn't mean that... I didn't kill her... Don't jump to
+conclusions...\"" CR>)
+                            (<FSET? ,PRSO ,TOLD>
+                             <TELL
+"\"'Nil nisi,' they say, but I never liked her very much. Didn't have the
+vision a man would have. Home and hearth. Should be a man at the
+head of a great old family like the Ashcrofts. Of course, Richard's the
+head now, officially.\"" CR>)
+                            (ELSE
+                             <TELL
+"\"I can't say that working with her is as rewarding as working with her father
+was, still, I can't really complain.\"" CR>)>)
+                     (<IN? ,PRSI ,HERE>
+                      <TELL
+'COL-MARSTON " glances at " D ,PRSI ", then sniffs disdainfully at you, as though
+you had asked him to stand on his head." CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-MICHAEL>
+                      <COND (,MARSTON-SEEN-TRUST-DOCUMENTS?
+                             <TELL
+"\"" 'MICHAEL "? Well, sometimes he makes big promises and doesn't
+follow through...  Fundamentally a sound fellow, though.\" "
+'COL-MARSTON " seems somewhat distracted." CR>)
+                            (<FSET? ,PRSO ,TOLD>
+                             <TELL
+"\"He must be devastated. But he's a strong man, he'll survive it.\"" CR>)
+                            (ELSE
+                             <TELL
+"\"A fine man. You can count on him. " 'VERONICA "'s father would have approved
+of him. He'll get her straightened out one day.\"" CR>)>)
+                     (<EQUAL? ,PRSI ,GLOBAL-ALICIA>
+                      <TELL
+"\"She's one of " 'VERONICA "'s cronies. Went to school with her, but then I heard
+you did too? Anyway, I hardly know her.\"" CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-RICHARD>
+                      <TELL
+"\"As Teddy Roosevelt said, 'I could carve a man with more backbone out of a
+banana.' The only thing he stands up to " 'VERONICA " on is that Linda person. He's
+never really grown up.\"" CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-LINDA>
+                      <TELL
+"\"She's just not our sort. I know that sounds prejudiced, but she's not happy
+here, you can tell, and she'd be better off if she and Richard stopped seeing
+each other. It would be kinder to her.\"" CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-SEN-ASHER>
+                      <TELL
+"\"A fine Senator. He has plans. You'll hear more from him, mark my
+words.\"" CR> )
+                     (<EQUAL? ,PRSI ,GLOBAL-COCHRANE>
+                      <TELL
+"\"The man is clearly an alcoholic. I don't approve of people who can't hold
+their liquor.\"" CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-OSTMANN>
+                      <TELL
+"\"That's a man with a true eye for business. I wonder why he's here tonight?
+" 'VERONICA " and " 'MICHAEL " don't mix too much with his crowd, and vice versa.\"" CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-BUTLER>
+                      <TELL
+"\"" 'BUTLER " is the disproof of the canard that there are no good servants
+anymore.\"" CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-BARTENDER>
+                      <TELL
+"\"He told me he's studying law. Lawyers and accountants! Two
+professions we would be better off without! We can always use a good
+bartender.\"" CR>)
+                     (ELSE
+                      <TELL
+"\"I have nothing to say about that.\"" CR>)>)
+              (<VERB? SHOW>
+               <COND (<EQUAL? ,PRSO ,SALE-FOLDER ,SALE-AGREEMENT>
+                      <TELL
+'COL-MARSTON " glances cursorily through the agreement. " ,I-DONT-KNOW
+"where you got this. It's true, " 'VERONICA " was going to sell the farm and
+move further upcountry, away from the suburbs. It wasn't supposed to be
+announced until tomorrow." <COND (<FSET? ,COL-MARSTON ,TOLD>
+                                 " Too bad it was never")
+                                (T
+                                 " Odd that it isn't")>
+                          " signed.\" He smiles
+frostily." CR>)
+                     (<OR <EQUAL? ,PRSO ,TRUST-DOCUMENTS>
+                          <AND <EQUAL? ,PRSO ,TRUST-FOLDER>
+                               <IN? ,TRUST-DOCUMENTS ,TRUST-FOLDER>>>
+                      <COND (,MARSTON-SEEN-TRUST-DOCUMENTS?
+                             <TELL
+"\"I have nothing more to say. I've said too much already. If you publish
+anything you'll hear from my lawyer!\"" CR>)
+                            (ELSE
+                             <SETG MARSTON-SEEN-TRUST-DOCUMENTS? T>
+                             <COND (<IN? ,INVESTOR-LIST ,MICHAEL>
+                                    %<DEBUG-CODE
+                                      <COND (,DEBUG
+                                             <TELL
+"[Marston scared]" CR>)>>
+                                    <ESTABLISH-GOAL ,COL-MARSTON ,LIBRARY T>
+                                    <ESTABLISH-GOAL ,MICHAEL ,LIBRARY T>)>
+                             <TELL
+"The colonel's composure breaks for a moment, then reforms. \"Where did
+you get that? I've run that Trust for twenty years, and all my
+investments have been good: for her. I finally decided I should get
+something out of it. Do you know what she pays me? Peanuts! And she
+wallows in luxury, decadence. I wanted a turn. Besides, I did nothing
+wrong, you can't prove anything, no matter what those accountants
+say.\"" CR>)>)>)>>
+
+<ROUTINE G-COL-MARSTON (GARG "AUX" (L <LOC ,COL-MARSTON>))
+        <COND (<NOT .GARG> <IMOVEMENT ,COL-MARSTON G-COL-MARSTON>)
+              (<EQUAL? .GARG ,G-IMPATIENT>
+               <COND (<IN? ,COL-MARSTON ,OFFICE>
+                      <RFALSE>)
+                     (<IN? ,COL-MARSTON ,LIBRARY>
+                      <FCLEAR ,LIBRARY-DOOR ,LOCKED>
+                      <RFALSE>)>
+               <TELL
+'COL-MARSTON " looks at his watch, and not very surreptitiously." CR>)
+              (<EQUAL? .GARG ,G-REACHED ,G-ALREADY>
+               <COND (<AND <EQUAL? .L ,BALLROOM-9>
+                           <ENABLED? <INT I-ARGUMENT>>>
+                      <GOALS? ,COL-MARSTON <>>
+                      <RFALSE>)
+                     (<AND <EQUAL? .L ,HALLWAY-3>
+                           <NOT ,THREE-STOOGES-IN-OFFICE?>>
+                      <GOALS? ,COL-MARSTON <>>
+                      <COND (<AND <IN? ,COCHRANE ,HALLWAY-3>
+                                  <IN? ,MICHAEL ,HALLWAY-3>>
+                             <GANGS-ALL-HERE>)>)
+                     (<EQUAL? .L ,OFFICE>
+                      <UNPRIORITIZE ,COL-MARSTON>
+                      <ESTABLISH-GOAL ,COL-MARSTON ,BALLROOM-9>
+                      <GRAB-ATTENTION ,COL-MARSTON>
+                      <RFALSE>)
+                     (<EQUAL? .L ,LIBRARY>
+                      <COND (<IN? ,MICHAEL ,LIBRARY>
+                             <LIBRARY-MEETING ,COL-MARSTON>)
+                            (ELSE
+                             <GOALS? ,COL-MARSTON <>>
+                             <RFALSE>)>)
+                     (<AND <IN? ,INVESTOR-LIST ,COL-MARSTON>
+                           <EQUAL? .L ,BALLROOM-8>>
+                      <FCLEAR ,INVESTOR-LIST ,INVISIBLE>
+                      <MOVE ,INVESTOR-LIST ,FIREPLACE>
+                      <ENABLE <QUEUE I-BURNED 1>>
+                      <COND (<EQUAL? ,HERE ,BALLROOM-8>
+                             <TELL-ARRIVES ,COL-MARSTON>
+                             <TELL
+"fireplace, warms his hands briefly, and then
+turns to warm his back. As he does, you notice a crumpled piece of paper
+drop from his hands into the fireplace. It doesn't land quite in the fire
+though. It's beginning to singe a bit." CR>)
+                            (<IN-BALLROOM? ,PLAYER>
+                             <TELL
+'COL-MARSTON " is now warming his hands and back at the fireplace. You
+catch an odd movement out of the corner of your eye." CR>)>)>)>>
+
+<GLOBAL LIST-BURNING? <>>
+
+<ROUTINE I-BURNED ()
+        <COND (<IN? ,INVESTOR-LIST ,FIREPLACE>
+               <COND (<NOT ,LIST-BURNING?>
+                      <SETG LIST-BURNING? T>
+                      <QUEUE I-BURNED 1>
+                      <COND (<EQUAL? ,HERE ,BALLROOM-8>
+                             <TELL
+"The piece of paper is beginning to smolder." CR>)>)
+                     (ELSE
+                      <MOVE ,INVESTOR-LIST ,POLICE-LAB>
+                      <COND (<EQUAL? ,HERE ,BALLROOM-8>
+                             <TELL
+"The crumpled piece of paper bursts into flame and is reduced to ashes." CR>)>)>)>>
+
+\\f
+
+<OBJECT GLOBAL-LINDA
+       (IN GLOBAL-OBJECTS)
+       (DESC "Linda")
+       (SYNONYM LINDA MEADE BALLERINA)
+       (ADJECTIVE LINDA MISS MS)
+       (ACTION GLOBAL-PERSON-F)
+       (FLAGS TRANSBIT PERSON FEMALE)
+       (CHARACTER 6)>
+
+<OBJECT LINDA
+       (IN SITTING-ROOM)
+       (DESC "Linda")
+       (LDESC "Linda Meade, prima ballerina, is here.")
+       (SYNONYM LINDA MEADE BALLERINA)
+       (ADJECTIVE LINDA MISS MS)
+       (ACTION LINDA-F)
+       (FLAGS TRANSBIT PERSON FEMALE)
+       (CHARACTER 6)>
+
+<GLOBAL BOOP-CNT 1>
+
+<ROUTINE LINDA-F ()
+        <COND (<EQUAL? ,WINNER ,LINDA>
+               <COND (<VERB? HELLO>
+                      <TELL "\"Hi! What's your sign?\"" CR>)
+                     (<DONT-HANDLE?> <RFALSE>)
+                     (ELSE
+                      <TELL "Linda bats her eyes and looks confused." CR>)>)
+              (<VERB? EXAMINE>
+               <TELL
+"Linda Meade is dressed as a ballerina. Her costume and hair are both
+flaming red. She is a beautiful woman, and knows it. Eyes
+follow her every move." CR>)
+              (<VERB? UNMASK RUB>
+               <TELL
+"\"Stop that, silly!\" she giggles." CR>)
+              (<AND <VERB? REVEAL> <EQUAL? ,PRSO ,GLOBAL-MURDER>>
+               <COND (<REVEAL-MURDER ,LINDA>
+                      <TELL
+"\"Yuck! I think I don't feel too well.\" She shivers, and then
+composes herself. \"Now Richard will be out from under her thumb.\" She
+looks at you as though she committed an indiscretion, and then
+smiles inanely." CR>)
+                     (T
+                      <TELL
+"\"Everyone will treat it like a juicy piece of gossip! Just wait. She's dead,
+poor thing. I didn't like her very much, but honestly!\"" CR>)>)
+              (<AND <VERB? ASK-ABOUT> <EQUAL? ,PRSO ,LINDA>>
+               <COND (<EQUAL? ,PRSI ,PLAYER>
+                      <TELL
+"\"I heard you're a reporter. Will you write about me?\"">)
+                     (<EQUAL? ,PRSI ,LINDA>
+                      <TELL
+"\"Until I met Richard I was working at the drug store, checking people
+out. It wasn't very exciting. Now I'm going to be a model! It's my
+ambition: I'll be on TV someday!\"">)
+                     (<AND <FSET? ,PRSI ,PERSON> <IN? ,PRSI ,HERE>>
+                      <TELL
+"\"You wouldn't want me to commit a faux pas, would you?\"">)
+                     (<EQUAL? ,PRSI ,GLOBAL-MICHAEL>
+                      <TELL
+"\"He's nasty to me. I don't think he likes Richard much.\"">)
+                     (<EQUAL? ,PRSI ,GLOBAL-VERONICA>
+                      <TELL
+"\"She hates me. She hates Richard! I hate her! She thinks she's
+so great because she's got a lot of money. She treats Richard like a child,
+doling out an allowance! Really! He's thirty years old! Just because
+she's got control of the Trust! Confidentially, he hates her, too.\"">)
+                     (<EQUAL? ,PRSI ,GLOBAL-ALICIA>
+                      <TELL
+,I-DONT-KNOW "her.\"">)
+                     (<EQUAL? ,PRSI ,GLOBAL-RICHARD>
+                      <TELL
+"\"We're in love! " 'VERONICA " is keeping us from being married, by
+not giving Richard what's coming to him from the Trust. It's not
+fair at all!\"">)
+                     (<EQUAL? ,PRSI ,GLOBAL-COL-MARSTON>
+                      <TELL
+"\"That old monster! He hates Richard! He won't make " 'VERONICA " give
+him what's coming to him lawfully. He says he can't change the rules,
+but that's silly: doesn't he run it?\"">)
+                     (<EQUAL? ,PRSI ,GLOBAL-SEN-ASHER>
+                      <TELL
+"\"Isn't it exciting? A real Senator. He's even distinguished dressed in
+that silly costume.\"">)
+                     (<EQUAL? ,PRSI ,GLOBAL-COCHRANE>
+                      <TELL
+,I-DONT-KNOW "him. He's drunk, isn't he?\"">)
+                     (<EQUAL? ,PRSI ,GLOBAL-OSTMANN>
+                      <TELL
+"\"He owns that building company. Their signs are all over the
+place!\"">)
+                     (<EQUAL? ,PRSI ,GLOBAL-BUTLER>
+                      <TELL
+"\"He hates me. He kicked me out once when I came
+over without Richard.\"">)
+                     (<EQUAL? ,PRSI ,GLOBAL-BARTENDER>
+                      <TELL
+,I-DONT-KNOW "him. I don't think he usually works here.\"">)
+                     (ELSE
+                      <TELL-DONT-KNOW>
+                      <RTRUE>)>
+               <SETG BOOP-CNT <- ,BOOP-CNT 1>>
+               <COND (<EQUAL? ,BOOP-CNT 0>
+                      <SETG BOOP-CNT 10>
+                      <TELL
+" Linda's voice is high and squeaky, a sort of Betty Boop voice.">)>
+               <CRLF>)>>
+
+<ROUTINE G-LINDA (GARG)
+        <COND (<NOT .GARG> <IMOVEMENT ,LINDA G-LINDA>)
+              (<EQUAL? .GARG ,G-IMPATIENT>
+               <TELL "Linda seems increasingly impatient with you." CR>)>>
+
+\\f
+
+<OBJECT GLOBAL-SEN-ASHER
+       (IN GLOBAL-OBJECTS)
+       (DESC "Senator Asher")
+       (SYNONYM ASHER HARLEQUIN ALAN AL)
+       (ADJECTIVE SENATOR ALAN AL)
+       (ACTION GLOBAL-PERSON-F)
+       (FLAGS TRANSBIT PERSON)
+       (CHARACTER 7)>
+
+<OBJECT SEN-ASHER
+       (IN MEDIA-ROOM)
+       (DESC "Senator Asher")
+       (SYNONYM ASHER HARLEQUIN ALAN AL)
+       (ADJECTIVE SENATOR ALAN AL SEN)
+       (ACTION SEN-ASHER-F)
+       (DESCFCN SEN-ASHER-DESC-F)
+       (FLAGS TRANSBIT PERSON)
+       (CHARACTER 7)>
+
+<ROUTINE SEN-ASHER-DESC-F ("OPTIONAL" (RARG <>))
+        <COND (<IN? ,SEN-ASHER ,MEDIA-ROOM>
+               <TELL
+'SEN-ASHER ", dressed in harlequin costume, is relaxing on a sofa,
+watching the news on CNN." CR>)
+              (ELSE
+               <TELL 'SEN-ASHER ", a distinguished harlequin, is">
+               <TELL-HERE>)>>
+
+<ROUTINE SEN-ASHER-F ()
+        <COND (<EQUAL? ,WINNER ,SEN-ASHER>
+               <COND (<VERB? HELLO>
+                      <TELL
+"The Senator greets you and shakes your hand. His handshake is firm, warm,
+and dry." CR>)
+                     (<DONT-HANDLE?> <RFALSE>)
+                     (ELSE
+                      <TELL
+"\"You can't order me around! You reporters have a lot of nerve.\"" CR>)>)
+              (<AND <VERB? $REVEAL> <EQUAL? ,PRSO ,GLOBAL-MURDER>>
+               <REVEAL-MURDER ,SEN-ASHER>
+               <COND (<IN? ,PRSI ,HERE>
+                      <TELL
+CD ,WINNER " tells the Senator of the murder. He looks like he has been
+hit with a sandbag." CR>)
+                     (<NEARBY? ,SEN-ASHER>
+                      <TELL
+CD ,WINNER " tells the Senator something that horrifies him." CR>)>)
+              (<AND <VERB? REVEAL> <EQUAL? ,PRSO ,GLOBAL-MURDER>>
+               <COND (<REVEAL-MURDER ,SEN-ASHER>
+                      <TELL
+"\"No! That's ridiculous! Who did it?\" He recoils from the idea as
+though he had been punched." CR>)
+                     (T
+                      <TELL
+"\"Horrible, horrible.\" The Senator hasn't yet recovered from the
+revelation." CR>)>)
+              (<AND <VERB? ACCUSE> <EQUAL? ,PRSI ,GLOBAL-MURDER>>
+               <TELL
+"\"You must be insane. Sure, I was in the next room when it happened.
+How do you suppose that makes me feel? I was in love with her once...
+I suppose I still am. I could no more kill her than, than...\" He chokes
+back a sob." CR>)
+              (<VERB? EXAMINE>
+               <TELL
+"Senator Alan Asher is two years into a successful first term, a man the
+party is already eyeing for higher office. He is tall and not quite so
+handsome as to be too handsome for a politician. Even dressed as he is
+in harlequin costume, he manages to look commanding and at ease." CR>)
+              (<AND <VERB? ASK-ABOUT> <EQUAL? ,PRSO ,SEN-ASHER>>
+               <COND (<NOT <FSET? ,PRSI ,PERSON>>
+                      <COND (<EQUAL? ,PRSI ,GLOBAL-MURDER>
+                             <COND (<FSET? ,PRSO ,TOLD>
+                                    <TELL
+"\"You know, I heard a muffled yell from the office at about ">
+                                    <TIME-PRINT ,YELL-TIME <>>
+                                    <TELL " I didn't really notice
+it consciously; I was watching television and relaxing.\"" CR>)
+                                   (ELSE
+                                    <TELL
+"\"What murder? Is this some sort of trick question?\"" CR>)>)
+                            (ELSE
+                             <TELL
+"\"No comment.\"" CR>)>)
+                     (<EQUAL? ,PRSI ,PLAYER>
+                      <TELL
+"\"Your paper has always been fair and impartial to me. I appreciate
+that.\"" CR>)
+                     (<EQUAL? ,PRSI ,SEN-ASHER>
+                      <TELL
+"\"Tell your readers I'm just a dedicated public servant.\" He grins
+winningly." CR>)
+                     (<IN? ,PRSI ,HERE>
+                      <TELL "\"It would be impolitic to say anything.\"" CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-MICHAEL>
+                      <TELL
+"\"" 'MICHAEL " is a fine man. He was a lucky man to capture " 'VERONICA ".\"" CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-VERONICA>
+                      <COND (<FSET? ,PRSO ,TOLD>
+                             <TELL
+"The Senator tries to compose himself. \"She was always one of my greatest
+friends. We knew each other for many years. How could anyone have done this
+to her?\"" CR>)
+                            (ELSE
+                             <TELL
+"\"She gives a great party. It's always a pleasure to come out here: the
+pressure's off for a while and I can just relax.\"" CR>)>)
+                     (<EQUAL? ,PRSI ,GLOBAL-ALICIA>
+                      <TELL
+"\"She's an old friend of " 'VERONICA "'s. When they were in school together
+they were roommates. Borrowing each other's clothes, stealing boyfriends
+back and forth, and all that.\"" CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-RICHARD>
+                      <TELL
+"\"He is, unfortunately, not much. " 'VERONICA " despair"
+<COND (<FSET? ,PRSO ,TOLD> "ed")(ELSE "s")> " of him ever amounting to
+anything.\"" CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-COL-MARSTON>
+                      <TELL
+"\"He's a hidebound old reactionary. It's unfortunate. The trust could do
+so much good with a different administrator. But " 'VERONICA " likes him.\"" CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-LINDA>
+                      <TELL
+"\"I've never been introduced. I know Richard is well and truly smitten,
+though.\"" CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-COCHRANE>
+                      <TELL
+"\"Construction is a big business around here. These suburbs are among the
+fastest growing areas in the country. It's driving the Hunt Club types
+further out into the country. " 'COCHRANE " is a big force in the industry,
+not that anyone is terribly pleased at that.\"" CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-OSTMANN>
+                      <TELL
+"\"He's done a lot of construction in the area, mostly office buildings,
+and many of those for the government. You'd be surprised at how little
+of the space the government occupies is actually government-owned. We're
+tenants in a lot of places, and " 'OSTMANN " owns a lot of those.\"" CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-BUTLER>
+                      <TELL
+"\"" 'BUTLER " is a family retainer. He'll live here for the rest of his life,
+if he can. They'll let him, too.\"" CR>)
+                     (<EQUAL? ,PRSI ,GLOBAL-BARTENDER>
+                      <TELL
+"\"Seems a nice kid. He told me he's in Law School.\"" CR>)
+                     (ELSE
+                      <TELL
+"\"Nothing to say, not even off-the-record.\"" CR>)>)>>
+
+<ROUTINE G-SEN-ASHER (GARG)
+        <COND (<NOT .GARG> <IMOVEMENT ,SEN-ASHER G-SEN-ASHER>)
+              (<EQUAL? .GARG ,G-IMPATIENT>
+               <TELL "The Senator is becoming bored with you." CR>)>>
+
+\\f
+
+<OBJECT GLOBAL-COCHRANE
+       (IN GLOBAL-OBJECTS)
+       (DESC "Cochrane")
+       (SDESC "Astronaut")
+       (SYNONYM COCHRANE ASTRONAUT SPACEMAN BILL)
+       (ADJECTIVE BILL WILLIAM MR)
+       (ACTION GLOBAL-PERSON-F)
+       (FLAGS TRANSBIT PERSON THE AN)
+       (CHARACTER 8)>
+
+<OBJECT COCHRANE
+       (IN EAST-BATH)
+       (SDESC "Astronaut")
+       (DESC "Cochrane")
+       (LDESC
+"An astronaut in an itchy spacesuit is here.")
+       (SYNONYM COCHRANE ASTRONAUT SPACEMAN BILL)
+       (ADJECTIVE BILL WILLIAM MR)
+       (ACTION COCHRANE-F)
+       (FLAGS TRANSBIT PERSON AN THE)
+       (CHARACTER 8)>
+
+<GLOBAL COCHRANE-SDESC "Cochrane">
+
+<ROUTINE COCHRANE-UNMASKS ()
+        <COND (<EQUAL? <GETP ,COCHRANE ,P?SDESC> ,COCHRANE-SDESC>
+               <RFALSE>)
+              (ELSE
+               <FCLEAR ,COCHRANE ,THE>
+               <FCLEAR ,COCHRANE ,AN>
+               <PUTP ,COCHRANE ,P?SDESC ,COCHRANE-SDESC>
+               <FCLEAR ,GLOBAL-COCHRANE ,THE>
+               <FCLEAR ,GLOBAL-COCHRANE ,AN>
+               <PUTP ,GLOBAL-COCHRANE ,P?SDESC ,COCHRANE-SDESC>
+               <PUTP ,COCHRANE ,P?LDESC
+"William Cochrane, who looks like his spacesuit itches, is here.">
+               <TELL
+"The figure lifts its visor. \"I'm Bill " 'COCHRANE "! This costume is
+so hot and itchy, I'm sorry I got it.\" He wipes his brow. ">)>>
+
+<GLOBAL COCHRANE-SEEN-AGREEMENT? <>>
+
+<ROUTINE COCHRANE-F ("AUX" UNMASKED?)
+        <COND (<EQUAL? ,WINNER ,COCHRANE>
+               <COND (<VERB? HELLO SAY> <TELL "\"Uh, hi.\"" CR>)
+                     (<AND <VERB? WHAT> <EQUAL? ,PRSO ,YOU>>
+                      <COND (<COCHRANE-UNMASKS> <CRLF> <RTRUE>)
+                            (ELSE
+                             <TELL
+"\"You know who I am: I'm " 'COCHRANE "!\"" CR>)>)
+                     (<DONT-HANDLE?> <RFALSE>)
+                     (ELSE
+                      <TELL
+"\"Wha? Whatcha mean?\" he responds, in a slightly slurred voice." CR>)>)
+              (<VERB? EXAMINE>
+               <COND (<EQUAL? <GETP ,COCHRANE ,P?SDESC> ,COCHRANE-SDESC>
+                      <TELL "William " 'COCHRANE>)
+                     (ELSE <TELL "The Astronaut">)>
+               <TELL
+ " is crammed into an ill-fitting, obviously rented, spacesuit.
+The helmet is badly attached and bounces as he moves. It's clear he's
+uncomfortable. It's also clear he has already had quite a lot to drink." CR>)
+              (<VERB? ACCUSE>
+               <COND (<AND <FSET? ,COCHRANE ,TOLD>
+                           ,COCHRANE-SEEN-AGREEMENT?>
+                      <TELL
+"\"You can't scare me. Sure, I'm just as happy she's dead, but I wouldn't
+do it. I've hardly been out of the ballroom all night. You can't pin this
+on me.\"" CR>)>)
+             (<VERB? SHOW>
+              <COCHRANE-UNMASKS>
+              <COND (<EQUAL? ,PRSO ,CARD>
+                     <TELL
+"\"Yeah. I just wanted to keep her from doing something she'd regret.
+I just want an equal chance to buy this property. If she's going to
+sell it, why a sweetheart deal with " 'OSTMANN "? I went to her office earlier
+to try to convince her, but the door was locked and she wouldn't answer.">
+                     <COND (<FSET? ,COCHRANE ,TOLD>
+                            <TELL
+" That was at about quarter of eight, so you can't pin this
+on me: she was still alive then, everybody saw her.">)>
+                     <TELL "\"" CR>)
+                    (<EQUAL? ,PRSO ,SALE-FOLDER ,SALE-AGREEMENT>
+                     <COND (,COCHRANE-SEEN-AGREEMENT?
+                            <TELL
+"\"Yeah. I've seen it, remember?\"" CR>
+