Revision 14 (Original Source)

This commit is contained in:
historicalsource 2019-04-13 22:21:37 -04:00
commit 1c8c4fcccb
16 changed files with 15698 additions and 0 deletions

1
README.md Normal file
View file

@ -0,0 +1 @@
# suspect

69
clock.zil Normal file
View file

@ -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>>>>

188
debug.zil Normal file
View file

@ -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>)>>

458
events.zil Normal file
View file

@ -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>)>>
"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>>

905
goal.zil Normal file
View file

@ -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"

68
m3.zil Normal file
View file

@ -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>

BIN
m3.zip Normal file

Binary file not shown.

173
macros.zil Normal file
View file

@ -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>

379
main.zil Normal file
View file

@ -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>>
<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 <>>
<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)>>>

5
p.zil Normal file
View file

@ -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>

1408
parser.zil Normal file

File diff suppressed because it is too large Load diff

4888
people.zil Normal file

File diff suppressed because it is too large Load diff

2907
places.zil Normal file

File diff suppressed because it is too large Load diff

681
syntax.zil Normal file
View file

@ -0,0 +1,681 @@
"SEARCH <SYNTAX "
"SYNTAX for M3
Copyright (C) 1984 Infocom, Inc. All rights reserved."
"SUBTITLE VOCABULARY"
<BUZZ A AN THE AND OF THEN ALL ONE BUT EXCEPT
MINUTE CARRYING IS ARE WAS WERE AM DO HAVE YOUR
PLEASE OK OKAY
\. \, \" \! \?
CAREFULLY CLOSELY QUIETLY SLOWLY QUICKLY BRIEFLY>
<SYNONYM WITH USING>
<SYNONYM THROUGH THRU>
<SYNONYM IN INSIDE INTO>
<SYNONYM UNDER UNDERNEATH BENEATH>
<SYNONYM NORTH N>
<SYNONYM SOUTH S>
<SYNONYM EAST E>
<SYNONYM WEST W>
<SYNONYM DOWN D ;DOWNSTAIRS>
<SYNONYM UP U ;UPSTAIRS>
;<SYNONYM NW NORTHWEST>
;<SYNONYM NE NORTHEAST>
;<SYNONYM SW SOUTHWEST>
;<SYNONYM SE SOUTHE>
<SYNTAX $VERIFY = V-$VERIFY>
<SYNTAX $VERIFY OBJECT = V-$VERIFY>
<SYNTAX ACCUSE OBJECT (FIND PERSON) = V-ACCUSE PRE-ACCUSE>
<SYNTAX ACCUSE OBJECT (FIND PERSON) WITH OBJECT = V-ACCUSE PRE-ACCUSE>
<SYNONYM AGAIN G>
<SYNTAX AGAIN = V-AGAIN>
<SYNONYM ANALYZE CHECK TEST DUST>
<SYNTAX ANALYZE OBJECT = V-ANALYZE ;PRE-ANALYZE>
<SYNTAX ANALYZE OBJECT FOR OBJECT = V-ANALYZE ;PRE-ANALYZE>
;<SYNTAX ANALYZE OFF OBJECT = V-ANALYZE ;PRE-ANALYZE>
;<SYNTAX ANALYZE OBJECT ON OBJECT = V-SANALYZE PRE-SANALYZE>
<SYNONYM ANSWER REPLY>
<SYNTAX ANSWER = V-ANSWER>
<SYNTAX ANSWER OBJECT = V-REPLY>
;<SYNTAX APPLY OBJECT TO OBJECT = V-PUT PRE-PUT>
<SYNTAX ARREST OBJECT (FIND PERSON) (MANY) = V-ARREST PRE-ARREST>
<SYNTAX ARREST OBJECT (FIND PERSON) (MANY) FOR OBJECT = V-ARREST PRE-ARREST>
<SYNONYM ASK QUESTION INQUIRE>
<SYNTAX ASK OBJECT (FIND PERSON) = V-TELL>
<SYNTAX ASK ABOUT OBJECT (HELD CARRIED ;HAVE)
= V-ASK-CONTEXT-ABOUT PRE-ASK-CONTEXT-ABOUT>
<SYNTAX ASK FOR OBJECT (ON-GROUND IN-ROOM ;HAVE)
= V-ASK-CONTEXT-FOR PRE-ASK-CONTEXT-FOR>
<SYNTAX ASK OBJECT (FIND PERSON)
ABOUT OBJECT (HELD CARRIED ;HAVE) = V-ASK-ABOUT PRE-ASK-ABOUT>
<SYNTAX ASK OBJECT (FIND PERSON)
FOR OBJECT (ON-GROUND IN-ROOM ;HAVE) = V-ASK-FOR>
<SYNTAX ASK OBJECT (FIND PERSON)
TO OBJECT = V-ASK-FOR>
<SYNTAX ORDER OBJECT = V-ORDER>
<SYNONYM ATTACK FIGHT HIT>
<SYNTAX ATTACK OBJECT (FIND PERSON) (ON-GROUND IN-ROOM) = V-SLAP>
<SYNTAX ATTACK OBJECT (FIND PERSON) (ON-GROUND IN-ROOM)
WITH OBJECT (FIND WEAPONBIT) (HELD CARRIED HAVE)
= V-ATTACK>
;<SYNTAX BLOW OUT OBJECT = V-LAMP-OFF>
<SYNTAX BRIEF = V-BRIEF>
;<SYNONYM BRING FETCH>
;<SYNTAX BRING = V-BRING>
<SYNONYM BRUSH CLEAN WIPE WASH>
<SYNTAX BRUSH OBJECT (HELD CARRIED ON-GROUND IN-ROOM) = V-BRUSH ;*>
<SYNTAX BRUSH OFF OBJECT (HELD CARRIED) = V-BRUSH>
<SYNTAX BRUSH OBJECT (HELD CARRIED ON-GROUND IN-ROOM)
WITH OBJECT
= V-BRUSH>
<SYNONYM BURN INCINERATE IGNITE>
<SYNTAX BURN OBJECT (FIND BURNBIT) (HELD CARRIED ON-GROUND IN-ROOM)
= V-BURN>
<SYNTAX BURN OBJECT (FIND BURNBIT) (HELD CARRIED ON-GROUND IN-ROOM)
IN OBJECT (ON-GROUND IN-ROOM)
= V-BURN>
<SYNONYM CALL PHONE DIAL>
<SYNTAX $CALL OBJECT = V-$CALL>
<SYNTAX CALL OBJECT = V-PHONE PRE-PHONE>
<SYNTAX CALL OBJECT ON OBJECT = V-PHONE PRE-PHONE>
<SYNTAX CALL TO OBJECT = V-$CALL>
<SYNTAX CALL UP OBJECT = V-PHONE PRE-PHONE>
<SYNONYM CLIMB ;SIT HATCH>
<SYNTAX CLIMB OBJECT ;(FIND CLIMBBIT) (ON-GROUND IN-ROOM) = V-CLIMB-FOO>
<SYNTAX CLIMB DOWN OBJECT ;(FIND CLIMBBIT) (ON-GROUND IN-ROOM) = V-CLIMB-DOWN>
<SYNTAX CLIMB IN OBJECT (FIND VEHBIT)(ON-GROUND IN-ROOM) = V-THROUGH>
<SYNTAX CLIMB ON OBJECT (FIND VEHBIT) (ON-GROUND IN-ROOM) = V-CLIMB-ON>
<SYNTAX CLIMB UP OBJECT ;(FIND CLIMBBIT) (ON-GROUND IN-ROOM) = V-CLIMB-UP>
<SYNTAX CLOSE OBJECT (FIND DOORBIT) (HELD CARRIED ON-GROUND IN-ROOM)
= V-CLOSE>
<SYNONYM MATCH COMPARE>
<SYNTAX MATCH OBJECT (MANY) = V-COMPARE PRE-COMPARE>
<SYNTAX MATCH OBJECT (HELD CARRIED ON-GROUND IN-ROOM)
TO OBJECT (HELD CARRIED ON-GROUND IN-ROOM) = V-COMPARE>
<SYNTAX MATCH OBJECT (HELD CARRIED ON-GROUND IN-ROOM)
WITH OBJECT (HELD CARRIED ON-GROUND IN-ROOM) = V-COMPARE>
<SYNONYM COUNT>
<SYNTAX COUNT OBJECT = V-COUNT>
;<SYNONYM CROSS FORD>
;<SYNTAX CROSS OBJECT = V-CROSS>
<SYNONYM CURSE DAMN SHIT FUCK HELL PISS>
<SYNTAX CURSE = V-CURSES>
<SYNTAX CURSE OBJECT (FIND PERSON) = V-CURSES>
<SYNTAX CURSE ON OBJECT (FIND PERSON) = V-CURSES>
<SYNONYM CUT SLICE PIERCE>
<SYNTAX CUT OBJECT WITH OBJECT (FIND WEAPONBIT) (CARRIED HELD HAVE) = V-CUT>
<SYNTAX DANCE = V-DANCE>
<SYNTAX DANCE WITH OBJECT (FIND PERSON) = V-DANCE>
<SYNONYM DESTROY DAMAGE BREAK SMASH>
<SYNTAX DESTROY OBJECT (ON-GROUND IN-ROOM HELD CARRIED)
= V-MUNG ;PRE-MUNG>
<SYNTAX DESTROY OBJECT (ON-GROUND IN-ROOM HELD CARRIED)
WITH OBJECT (HELD CARRIED TAKE)
= V-MUNG ;PRE-MUNG>
<SYNTAX DESTROY DOWN OBJECT (ON-GROUND IN-ROOM HELD CARRIED)
WITH OBJECT (HELD CARRIED TAKE)
= V-MUNG ;PRE-MUNG>
<SYNTAX DIAGNOSE = V-DIAGNOSE>
<SYNONYM DRINK IMBIBE SWALLOW SIP GUZZLE SWIG>
<SYNTAX DRINK OBJECT (FIND DRINKBIT) (HELD CARRIED ON-GROUND IN-ROOM TAKE)
= V-DRINK>
<SYNONYM DROP ;RELEASE>
<SYNTAX DROP OBJECT (HELD MANY HAVE) = V-DROP ;*>
<SYNTAX DROP OBJECT (HELD MANY HAVE) DOWN OBJECT = V-PUT PRE-PUT>
<SYNTAX DROP OBJECT (HELD MANY HAVE) IN OBJECT = V-PUT PRE-PUT>
<SYNTAX DROP OBJECT (HELD MANY HAVE) ON OBJECT = V-PUT PRE-PUT>
;<SYNTAX EASIER = V-EASIER>
<SYNONYM EAT CONSUME TASTE SAMPLE>
<SYNTAX EAT OBJECT (FIND FOODBIT) (HELD CARRIED ON-GROUND IN-ROOM TAKE)
= V-EAT>
<SYNTAX ENTER = V-ENTER>
<SYNTAX ENTER OBJECT = V-THROUGH>
<SYNONYM EXAMINE DESCRIBE INSPECT>
<SYNTAX EXAMINE OBJECT (HELD CARRIED IN-ROOM ON-GROUND)
= V-EXAMINE PRE-EXAMINE>
;<SYNTAX EXIT = V-EXIT>
;<SYNTAX EXIT OBJECT = V-EXIT>
;<SYNONYM EXTINGUISH DOUSE>
;<SYNTAX EXTINGUISH OBJECT = V-LAMP-OFF>
;<SYNTAX FILL OBJECT (FIND CONTBIT) (HELD CARRIED ON-GROUND IN-ROOM)
WITH OBJECT
= V-FILL>
;<SYNTAX FILL OBJECT (FIND CONTBIT) (HELD CARRIED ON-GROUND IN-ROOM)
= V-FILL>
<SYNONYM FIND WHERE THERE SEEN>
<SYNTAX FIND OBJECT (HELD CARRIED ;HAVE) = V-FIND PRE-FIND>
<SYNTAX FIND OBJECT OBJECT = V-FIND PRE-FIND>
<SYNTAX FIND OBJECT AT OBJECT = V-FIND PRE-FIND>
<SYNTAX FINGERPRINT OBJECT (HELD CARRIED IN-ROOM ON-GROUND)
= V-FINGERPRINT ;PRE-FINGERPRINT>
<SYNTAX FLUSH OBJECT (ON-GROUND IN-ROOM) = V-FLUSH>
<SYNONYM FOLLOW PURSUE CHASE TRACE>
<SYNTAX FOLLOW OBJECT = V-FOLLOW>
<SYNTAX FOLLOW OBJECT (FIND PERSON) OBJECT = V-FOLLOW> ;"Follow me north."
<SYNTAX FOLLOW OBJECT (FIND PERSON) TO OBJECT = V-FOLLOW> ;"F. me to office."
<SYNONYM GIVE HAND DONATE OFFER>
<SYNTAX GIVE OBJECT (MANY HELD CARRIED) ;"8/28: had ON-GROUND IN-ROOM, too"
TO OBJECT (FIND PERSON) (ON-GROUND)
= V-GIVE PRE-GIVE>
<SYNTAX GIVE OBJECT (FIND PERSON) (ON-GROUND)
OBJECT (MANY HELD CARRIED) ;"8/28: had ON-GROUND IN-ROOM, too"
= V-SGIVE PRE-SGIVE>
<SYNTAX GOODBYE = V-GOODBYE>
<SYNTAX GOODBYE OBJECT = V-GOODBYE>
<SYNONYM HANDCUFF CUFF>
<SYNTAX HANDCUFF OBJECT (FIND PERSON) = V-HANDCUFF>
;<SYNTAX HANDCUFF OBJECT TO OBJECT = V-TIE-TO PRE-TIE-TO>
<SYNTAX HANG UP OBJECT = V-HANG-UP>
<SYNTAX HANG OBJECT = V-HANG-UP>
;<SYNTAX HARDER = V-HARDER>
<SYNONYM HELLO HI>
<SYNTAX HELLO = V-HELLO ;*>
<SYNTAX HELLO OBJECT = V-HELLO>
<SYNTAX HELP = V-HELP>
<SYNTAX HELP OBJECT (FIND PERSON) = V-HELP>
<SYNONYM HIDE CROUCH>
<SYNTAX HIDE = V-HIDE PRE-HIDE>
<SYNTAX HIDE BEHIND OBJECT = V-HIDE-BEHIND PRE-HIDE>
<SYNTAX HIDE IN OBJECT = V-HIDE-INSIDE PRE-HIDE>
<SYNTAX HIDE ON OBJECT = V-THROUGH>
<SYNTAX HIDE OBJECT (CARRIED HELD HAVE) IN OBJECT = V-PUT PRE-PUT>
<SYNTAX HIDE OBJECT (CARRIED HELD HAVE) UNDER OBJECT = V-PUT-UNDER>
<SYNONYM I INVENTORY>
<SYNTAX I = V-INVENTORY>
<SYNTAX INTERVIEW OBJECT = V-INTERVIEW>
;<SYNONYM JUMP LEAP>
;<SYNTAX JUMP = V-LEAP>
;<SYNTAX JUMP ACROSS OBJECT = V-LEAP>
<SYNTAX JUMP IN OBJECT = V-LEAP>
;<SYNTAX JUMP OVER OBJECT = V-LEAP>
<SYNONYM KICK BITE TAUNT>
<SYNTAX KICK OBJECT = V-KICK>
<SYNONYM KILL ;SHOOT ;STRANGLE>
<SYNTAX KILL OBJECT (FIND PERSON) (ON-GROUND IN-ROOM) = V-KILL>
<SYNTAX KILL OBJECT (FIND PERSON) (ON-GROUND IN-ROOM)
WITH OBJECT (FIND WEAPONBIT) (HELD CARRIED HAVE)
= V-KILL>
<SYNTAX KISS OBJECT (FIND PERSON) (ON-GROUND IN-ROOM) = V-KISS>
<SYNONYM KNOCK RAP>
<SYNTAX KNOCK ON OBJECT = V-KNOCK>
<SYNTAX KNOCK AT OBJECT = V-KNOCK ;*>
<SYNTAX KNOCK DOWN OBJECT (FIND PERSON) (ON-GROUND IN-ROOM) = V-ATTACK>
<SYNTAX KNOW ABOUT OBJECT (HELD CARRIED ;HAVE) = V-WHAT>
<SYNTAX KNOW WHERE OBJECT (HELD CARRIED ;HAVE) = V-FIND PRE-FIND>
;<SYNONYM LEAN STAND PROP>
<SYNTAX STAND = V-STAND>
;<SYNTAX LEAN OBJECT AGAINST OBJECT = V-LEAN>
;<SYNTAX LEAN OBJECT ON OBJECT = V-LEAN>
;<SYNTAX LEAN OBJECT UP OBJECT = V-LEAN>
;<SYNTAX LEAN UP OBJECT (FIND RMUNGBIT) = V-STAND>
<SYNTAX LEAVE = V-LEAVE PRE-LEAVE>
<SYNTAX LEAVE OBJECT = V-LEAVE PRE-LEAVE>
<SYNTAX LIGHT OBJECT
= V-LAMP-ON ;*>
;<SYNTAX LIGHT OBJECT
WITH OBJECT (FIND FLAMEBIT) (HELD CARRIED TAKE HAVE)
= V-BURN PRE-BURN>
<SYNTAX LISTEN = V-LISTEN>
<SYNTAX LISTEN TO OBJECT = V-LISTEN>
<SYNTAX LISTEN AT OBJECT = V-LISTEN>
<SYNTAX LOCK OBJECT (ON-GROUND IN-ROOM)
;WITH ;OBJECT ;(FIND TOOLBIT) ;(HELD CARRIED ON-GROUND IN-ROOM TAKE)
= V-LOCK PRE-UNLOCK>
<SYNONYM LOOK L STARE GAZE>
<SYNTAX LOOK = V-LOOK>
<SYNTAX LOOK OBJECT = V-EXAMINE PRE-EXAMINE> ;"for Roe & others"
<SYNTAX LOOK AROUND OBJECT (FIND RMUNGBIT) = V-LOOK>
<SYNTAX LOOK AT OBJECT (HELD CARRIED ON-GROUND IN-ROOM MANY)
= V-EXAMINE PRE-EXAMINE>
<SYNTAX LOOK AT OBJECT (HELD CARRIED MANY) THROUGH OBJECT = V-READ PRE-READ>
<SYNTAX LOOK BEHIND OBJECT = V-LOOK-BEHIND>
<SYNTAX LOOK DOWN OBJECT (FIND RMUNGBIT) = V-LOOK-DOWN>
<SYNTAX LOOK FOR OBJECT (HELD CARRIED ;HAVE) = V-FIND>
<SYNTAX LOOK IN OBJECT (HELD CARRIED ON-GROUND IN-ROOM)
= V-LOOK-INSIDE PRE-LOOK-INSIDE>
;<SYNTAX LOOK NEAR OBJECT = V-SEARCH-AROUND>
<SYNTAX LOOK ON OBJECT (ON-GROUND IN-ROOM) = V-LOOK-ON>
<SYNTAX LOOK OUT OBJECT = V-LOOK-OUTSIDE>
<SYNTAX LOOK OVER OBJECT (HELD CARRIED ON-GROUND IN-ROOM)
= V-EXAMINE PRE-EXAMINE>
<SYNTAX LOOK UNDER OBJECT = V-LOOK-UNDER>
<SYNTAX LOOK UP OBJECT (FIND RMUNGBIT) = V-LOOK-UP>
<SYNTAX LOOK THROUGH OBJECT (HELD CARRIED ON-GROUND IN-ROOM)
= V-LOOK-INSIDE PRE-LOOK-INSIDE>
;<SYNTAX LOWER OBJECT = V-LOWER>
<SYNTAX MAKE OBJECT = V-MAKE>
<SYNTAX MAKE OBJECT OBJECT = V-MAKE>
;<SYNTAX MAKE OBJECT FROM OBJECT (ON-GROUND IN-ROOM) = V-MAKE>
;<SYNTAX MAKE OBJECT ;WITH OBJECT (ON-GROUND IN-ROOM) = V-MAKE>
<SYNONYM MAKE MIX>
<SYNTAX MOVE OBJECT (ON-GROUND IN-ROOM) = V-MOVE PRE-MOVE>
;<SYNONYM MUMBLE SIGH>
;<SYNTAX MUMBLE = V-MUMBLE>
<SYNTAX OPEN OBJECT (FIND DOORBIT) (HELD CARRIED ON-GROUND IN-ROOM)
= V-OPEN>
<SYNTAX OPEN UP OBJECT (FIND DOORBIT) (HELD CARRIED ON-GROUND IN-ROOM)
= V-OPEN>
<SYNTAX OPEN OBJECT (FIND DOORBIT) (HELD CARRIED ON-GROUND IN-ROOM)
WITH OBJECT (FIND TOOLBIT) (ON-GROUND IN-ROOM HELD CARRIED HAVE)
= V-OPEN>
<SYNTAX PEEK IN OBJECT (HELD CARRIED ON-GROUND IN-ROOM)
= V-LOOK-INSIDE PRE-LOOK-INSIDE>
<SYNONYM PICK PRY>
<SYNTAX PICK OBJECT (FIND DOORBIT) (HELD CARRIED ON-GROUND IN-ROOM)
WITH OBJECT (FIND TOOLBIT) (ON-GROUND IN-ROOM HELD CARRIED HAVE)
= V-PICK>
<SYNTAX PICK UP OBJECT (FIND TAKEBIT) (ON-GROUND MANY)
= V-TAKE PRE-TAKE>
;<SYNTAX PLAY OBJECT = V-PLAY>
;<SYNONYM POKE JAB BLIND>
;<SYNTAX POKE OBJECT (FIND PERSON) (ON-GROUND IN-ROOM)
WITH OBJECT (FIND WEAPONBIT) (HELD CARRIED HAVE)
= V-MUNG ;PRE-MUNG>
<SYNONYM POUR SPILL>
<SYNTAX POUR OBJECT (HELD CARRIED) = V-DROP ;*>
;<SYNTAX POUR OBJECT (HELD CARRIED) FROM OBJECT = V-DROP>
<SYNTAX POUR OBJECT (HELD CARRIED) IN OBJECT = V-POUR-ON>
<SYNTAX POUR OBJECT (HELD CARRIED) ON OBJECT = V-POUR-ON>
<SYNONYM PULL TUG DRAG>
<SYNTAX PULL OBJECT (ON-GROUND IN-ROOM) = V-MOVE PRE-MOVE ; *>
<SYNTAX PULL ON OBJECT (ON-GROUND IN-ROOM) = V-MOVE PRE-MOVE>
<SYNONYM PUSH PRESS>
<SYNTAX PUSH OBJECT (IN-ROOM ON-GROUND MANY) = V-PUSH>
<SYNTAX PUSH ON OBJECT (IN-ROOM ON-GROUND MANY) = V-PUSH>
<SYNTAX PUSH OBJECT UNDER OBJECT = V-PUT-UNDER>
<SYNONYM PUT STUFF INSERT PLACE>
<SYNTAX PUT OBJECT (HELD MANY HAVE) IN OBJECT = V-PUT PRE-PUT ;*>
;<SYNTAX PUT OBJECT (CARRIED HELD HAVE) AGAINST OBJECT = V-LEAN>
<SYNTAX PUT OBJECT (HELD MANY HAVE) ON OBJECT = V-PUT PRE-PUT>
<SYNTAX PUT OBJECT (CARRIED HELD HAVE) UNDER OBJECT = V-PUT-UNDER>
<SYNTAX PUT DOWN OBJECT (HELD MANY HAVE) = V-DROP>
<SYNTAX PUT ON OBJECT (HELD CARRIED HAVE) = V-WEAR PRE-WEAR>
<SYNTAX WEAR OBJECT (HELD CARRIED HAVE) = V-WEAR PRE-WEAR>
<SYNTAX REMOVE OBJECT = V-TAKE-OFF>
<SYNONYM QUIT Q>
<SYNTAX QUIT = V-QUIT>
<SYNONYM RAISE LIFT>
<SYNTAX RAISE OBJECT = V-RAISE ;*>
<SYNTAX RAISE UP OBJECT = V-RAISE>
<SYNTAX RAISE OBJECT OFF OBJECT = V-TAKE>
<SYNONYM RAPE MOLEST ASSAULT>
<SYNTAX RAPE OBJECT (FIND PERSON) = V-RAPE>
<SYNONYM READ SKIM PERUSE>
<SYNTAX READ OBJECT (FIND READBIT) (HELD CARRIED ON-GROUND IN-ROOM TAKE)
= V-READ PRE-READ ; *>
;<SYNTAX READ OBJECT (FIND READBIT) (HELD CARRIED ON-GROUND IN-ROOM TAKE)
OBJECT = V-READ PRE-READ>
;<SYNTAX READ OBJECT (FIND READBIT) (HELD CARRIED ON-GROUND IN-ROOM TAKE)
THROUGH OBJECT
= V-READ PRE-READ>
<SYNTAX RESTART = V-RESTART>
<SYNTAX RESTORE = V-RESTORE>
<SYNTAX REVIVE OBJECT = V-REVIVE>
<SYNONYM RING PEAL>
<SYNTAX RING OBJECT ;(TAKE) = V-RING ;*>
;<SYNTAX RING OBJECT ;(TAKE) WITH OBJECT = V-RING>
;<SYNTAX ROLL UP OBJECT (ON-GROUND IN-ROOM) = V-MOVE PRE-MOVE>
<SYNONYM RUB TOUCH FEEL SHADE PAT PET>
<SYNTAX RUB OBJECT = V-RUB>
;<SYNTAX RUB OBJECT (TAKE HAVE) ON OBJECT = V-RUB-OVER PRE-RUB-OVER>
;<SYNTAX RUB OBJECT (TAKE HAVE) OVER OBJECT = V-RUB-OVER PRE-RUB-OVER>
;<SYNTAX RUB OBJECT WITH OBJECT (TAKE HAVE) = V-RUB>
;<SYNONYM SAVE SUSPEND PAUSE>
<SYNTAX SAVE = V-SAVE>
<SYNONYM SAY TALK>
<SYNTAX SAY = V-SAY>
<SYNTAX SAY OBJECT (HELD CARRIED ;HAVE)
= V-TELL-ME-ABOUT PRE-TELL-ME-ABOUT>
<SYNTAX SAY ABOUT OBJECT (HELD CARRIED ;HAVE)
= V-TELL-ME-ABOUT PRE-TELL-ME-ABOUT>
<SYNTAX SAY TO OBJECT (FIND PERSON) (IN-ROOM) = V-TELL>
<SYNTAX SCORE = V-SCORE>
<SYNTAX SCRIPT = V-SCRIPT>
<SYNONYM SEARCH DIG>
<SYNTAX SEARCH OBJECT = V-SEARCH PRE-SEARCH>
;<SYNTAX SEARCH OBJECT AROUND OBJECT = V-SEARCH-GROUND-AROUND>
<SYNTAX SEARCH OBJECT FOR OBJECT (HELD CARRIED ;HAVE)
= V-SEARCH-OBJECT-FOR PRE-SEARCH-OBJECT-FOR>
;<SYNTAX SEARCH OBJECT NEAR OBJECT = V-SEARCH-GROUND-AROUND>
;<SYNTAX SEARCH OBJECT UNDER OBJECT = V-SEARCH-GROUND-UNDER>
;<SYNTAX SEARCH AROUND OBJECT = V-SEARCH-AROUND>
<SYNTAX SEARCH FOR OBJECT (HELD CARRIED ;HAVE) = V-FIND>
<SYNTAX SEARCH IN OBJECT = V-SEARCH PRE-SEARCH>
;<SYNTAX SEARCH NEAR OBJECT = V-SEARCH-AROUND>
<SYNTAX SEARCH UP OBJECT = V-SEARCH PRE-SEARCH>
;<SYNTAX SEND FOR OBJECT = V-SEND-FOR>
;<SYNTAX SHAKE OBJECT = V-SHAKE>
;<SYNONYM FIRE SHOOT BLAST>
;<SYNTAX FIRE OBJECT (FIND PERSON) (ON-GROUND IN-ROOM)
WITH OBJECT (FIND WEAPONBIT) (HELD CARRIED HAVE)
= V-SHOOT ;PRE-SHOOT>
;<SYNTAX FIRE OBJECT (FIND PERSON) = V-SHOOT ;PRE-SHOOT>
;<SYNTAX FIRE OBJECT (FIND WEAPONBIT) (HELD CARRIED HAVE)
AT OBJECT (FIND PERSON) (ON-GROUND IN-ROOM)
= V-SSHOOT PRE-SSHOOT>
<SYNONYM SHOW CONFRONT>
<SYNTAX SHOW OBJECT (FIND PERSON)
OBJECT (HELD CARRIED ON-GROUND) = V-SSHOW PRE-SSHOW>
<SYNTAX SHOW OBJECT (HELD CARRIED ON-GROUND)
TO OBJECT (FIND PERSON) = V-SHOW PRE-SHOW>
<SYNTAX SIT ON OBJECT (FIND FURNITURE ;SITBIT) (ON-GROUND IN-ROOM) = V-SIT>
<SYNTAX SIT DOWN OBJECT (FIND FURNITURE ;SITBIT) (ON-GROUND IN-ROOM) = V-SIT>
<SYNTAX SIT IN OBJECT (FIND FURNITURE ;SITBIT) (ON-GROUND IN-ROOM) = V-SIT>
;<SYNONYM SKIP HOP>
;<SYNTAX SKIP = V-SKIP>
<SYNONYM SLAP HURT INJURE PUNCH>
<SYNTAX SLAP OBJECT (FIND PERSON) = V-SLAP>
<SYNTAX SLAP OBJECT AROUND = V-SLAP>
;<SYNTAX SLIDE OBJECT UNDER OBJECT = V-PUT-UNDER>
<SYNONYM SMELL SNIFF>
<SYNTAX SMELL OBJECT = V-SMELL>
;<SYNTAX SMOKE OBJECT ;(FIND BURNBIT) = V-SMOKE>
<SYNTAX SPACE = V-SPACE>
;<SYNTAX SQUEEZE OBJECT = V-SQUEEZE>
;<SYNTAX SQUEEZE OBJECT ON OBJECT = V-PUT PRE-PUT>
<SYNTAX STRIKE OBJECT (FIND PERSON) (ON-GROUND IN-ROOM) = V-SLAP>
;<SYNTAX STRIKE OBJECT (ON-GROUND IN-ROOM HELD CARRIED) = V-LAMP-ON>
<SYNTAX STRIKE OBJECT (FIND PERSON) (ON-GROUND IN-ROOM)
WITH OBJECT (FIND WEAPONBIT) (HELD CARRIED ON-GROUND IN-ROOM HAVE)
= V-ATTACK>
<SYNONYM SUPER SUPERBRIEF>
<SYNTAX SUPER = V-SUPER-BRIEF>
;<SYNONYM SWIM BATHE WADE>
;<SYNTAX SWIM = V-SWIM>
;<SYNTAX SWIM IN OBJECT = V-SWIM>
;<SYNONYM SWING THRUST>
;<SYNTAX SWING OBJECT (FIND WEAPONBIT) (HELD CARRIED HAVE)
= V-SWING>
;<SYNTAX SWING OBJECT (FIND WEAPONBIT) (HELD CARRIED HAVE)
AT OBJECT (FIND PERSON) (ON-GROUND IN-ROOM)
= V-SWING>
<SYNONYM TAKE GET HOLD CARRY LEAD STEAL GRAB>
<SYNTAX TAKE OBJECT (FIND TAKEBIT) (ON-GROUND IN-ROOM MANY)
= V-TAKE PRE-TAKE ;*>
<SYNTAX TAKE OBJECT (IN-ROOM) OBJECT = V-TAKEOUT PRE-TAKEOUT>
;"TAKE person OUTSIDE"
<SYNTAX TAKE OBJECT (FIND TAKEBIT) (IN-ROOM CARRIED MANY)
FROM OBJECT
= V-TAKE PRE-TAKE>
<SYNTAX TAKE OBJECT (FIND TAKEBIT) (CARRIED IN-ROOM MANY)
OFF OBJECT
= V-TAKE PRE-TAKE>
<SYNTAX TAKE OBJECT (FIND TAKEBIT) (CARRIED IN-ROOM MANY)
OUT OBJECT
= V-TAKE PRE-TAKE>
<SYNTAX TAKE OBJECT TO OBJECT = V-SHOW>
;<SYNTAX TAKE OBJECT (FIND TAKEBIT) (IN-ROOM CARRIED TAKE HAVE)
UP OBJECT = V-HOLD-UP>
<SYNTAX TAKE IN OBJECT (FIND VEHBIT) (ON-GROUND IN-ROOM) = V-THROUGH>
<SYNTAX TAKE ON OBJECT (FIND VEHBIT) (ON-GROUND IN-ROOM) = V-CLIMB-ON>
<SYNTAX TAKE OUT OBJECT (FIND VEHBIT) (ON-GROUND IN-ROOM) = V-DISEMBARK>
<SYNTAX TAKE UP OBJECT (FIND RMUNGBIT) = V-STAND>
<SYNTAX TAKE OFF OBJECT = V-TAKE-OFF>
;<SYNTAX TASTE OBJECT = V-TASTE>
<SYNONYM TELL EXPLAIN>
<SYNTAX TELL OBJECT (FIND PERSON) (IN-ROOM) = V-TELL>
<SYNTAX TELL OBJECT (FIND PERSON)
ABOUT OBJECT = V-TELL-ME PRE-TELL-ME>
<SYNONYM THANKS THANK>
<SYNTAX THANKS = V-THANKS>
<SYNTAX THANKS OBJECT = V-THANKS>
<SYNONYM THROW HURL CHUCK TOSS>
<SYNTAX THROW OBJECT = V-THROW>
<SYNTAX THROW OBJECT (HELD CARRIED HAVE)
AT OBJECT (ON-GROUND IN-ROOM)
= V-THROW-AT>
<SYNTAX THROW OBJECT (HELD CARRIED HAVE)
IN OBJECT = V-PUT PRE-PUT>
<SYNTAX THROW OBJECT (HELD CARRIED HAVE)
ON OBJECT = V-PUT PRE-PUT>
<SYNTAX THROW OBJECT (HELD CARRIED HAVE)
OVER OBJECT = V-PUT PRE-PUT>
<SYNTAX THROW OBJECT (HELD CARRIED HAVE)
THROUGH OBJECT (FIND PERSON) (ON-GROUND IN-ROOM)
= V-THROW-THROUGH>
<SYNONYM TIE FASTEN SECURE ATTACH>
;<SYNTAX TIE OBJECT TO OBJECT = V-TIE PRE-TIE>
<SYNTAX TIE OBJECT (FIND PERSON) (ON-GROUND IN-ROOM)
TO OBJECT (FIND FURNITURE) (ON-GROUND IN-ROOM)
= V-TIE-TO PRE-TIE-TO>
<SYNTAX TIE UP OBJECT (FIND PERSON) (ON-GROUND IN-ROOM)
TO OBJECT (FIND FURNITURE) (ON-GROUND IN-ROOM)
= V-TIE-TO PRE-TIE-TO>
<SYNTAX TIE OBJECT (FIND PERSON) (ON-GROUND IN-ROOM)
WITH OBJECT ;(FIND TOOLBIT) (ON-GROUND IN-ROOM HELD CARRIED HAVE)
= V-TIE-WITH PRE-TIE-WITH>
<SYNTAX TIE UP OBJECT (FIND PERSON) (ON-GROUND IN-ROOM)
WITH OBJECT ;(FIND TOOLBIT) (ON-GROUND IN-ROOM HELD CARRIED HAVE)
= V-TIE-WITH PRE-TIE-WITH>
<SYNONYM TIME T>
<SYNTAX TIME = V-TIME>
<SYNONYM TURN FLIP SHUT>
<SYNTAX TURN OBJECT ;(FIND TURNBIT) (HELD CARRIED ON-GROUND IN-ROOM)
= V-TURN ;PRE-TURN>
<SYNTAX TURN DOWN OBJECT = V-TURN-DOWN>
<SYNTAX TURN IN OBJECT ;(FIND TURNBIT) (HELD CARRIED ON-GROUND IN-ROOM)
= V-TURN ;PRE-TURN>
<SYNTAX TURN OFF OBJECT (HELD CARRIED ON-GROUND IN-ROOM)
= V-LAMP-OFF>
<SYNTAX TURN ON OBJECT (HELD CARRIED ON-GROUND IN-ROOM)
= V-LAMP-ON>
<SYNTAX TURN TO OBJECT (HELD CARRIED ON-GROUND IN-ROOM)
= V-TURN ;PRE-TURN>
<SYNTAX TURN UP OBJECT = V-TURN-UP>
<SYNTAX UNLOCK OBJECT (ON-GROUND IN-ROOM) = V-UNLOCK PRE-UNLOCK>
<SYNTAX UNLOCK OBJECT (ON-GROUND IN-ROOM)
WITH OBJECT (FIND TOOLBIT) (HELD CARRIED ON-GROUND IN-ROOM TAKE)
= V-UNLOCK PRE-UNLOCK>
<SYNTAX UNMASK = V-UNMASK>
<SYNTAX UNMASK OBJECT (FIND PERSON) = V-UNMASK>
<SYNTAX UNSCRIPT = V-UNSCRIPT>
<SYNTAX UNSPACE = V-UNSPACE>
<SYNONYM UNTIE FREE UNFASTEN UNATTACH UNHOOK UNCUFF>
<SYNTAX UNTIE OBJECT (ON-GROUND IN-ROOM HELD CARRIED)
= V-UNTIE ;PRE-UNTIE>
<SYNTAX UNTIE OBJECT (ON-GROUND IN-ROOM HELD CARRIED)
FROM OBJECT
= V-UNTIE ;PRE-UNTIE>
<SYNTAX USE OBJECT = V-USE>
<SYNTAX VERBOSE = V-VERBOSE>
<SYNONYM RELEASE REVISION VERSION EDITION>
<SYNTAX RELEASE = V-VERSION>
<SYNTAX RELEASE OBJECT (FIND PERSON) = V-UNTIE>
<SYNONYM WAIT Z STAY ;MEDITATE>
<SYNTAX WAIT = V-WAIT>
<SYNTAX WAIT OBJECT = V-WAIT-FOR>
<SYNTAX WAIT FOR OBJECT = V-WAIT-FOR>
<SYNTAX WAIT TILL OBJECT = V-WAIT-UNTIL>
<SYNTAX WAIT UNTIL OBJECT = V-WAIT-UNTIL>
<SYNONYM WAKE AWAKE REVIVE RESUSCITATE>
<SYNTAX WAKE OBJECT (FIND PERSON) (ON-GROUND IN-ROOM) = V-ALARM ;*>
<SYNTAX WAKE UP OBJECT (FIND PERSON) (ON-GROUND IN-ROOM) = V-ALARM>
<SYNTAX JOIN OBJECT = V-WALK-TO>
<SYNONYM WALK GO RUN PROCEED>
<SYNTAX WALK OBJECT = V-WALK>
;<SYNTAX WALK AROUND OBJECT = V-WALK-AROUND>
<SYNTAX WALK BEHIND OBJECT = V-HIDE-BEHIND PRE-HIDE>
<SYNTAX WALK DOWN OBJECT ;(FIND CLIMBBIT) (ON-GROUND IN-ROOM) = V-CLIMB-DOWN>
<SYNTAX WALK IN OBJECT = V-THROUGH>
<SYNTAX WALK OBJECT OVER OBJECT = V-RUN-OVER>
<SYNTAX WALK TO OBJECT = V-WALK-TO>
<SYNTAX WALK OVER OBJECT = V-WALK-TO>
<SYNTAX WALK UP OBJECT ;(FIND CLIMBBIT) (ON-GROUND IN-ROOM) = V-CLIMB-UP>
<SYNTAX WALK THROUGH OBJECT = V-THROUGH ;PRE-THROUGH>
<SYNTAX WALK WITH OBJECT = V-FOLLOW ;PRE-THROUGH>
<SYNTAX WATCH OBJECT (HELD CARRIED ON-GROUND IN-ROOM MANY) = V-EXAMINE>
<SYNTAX WAVE = V-WAVE>
<SYNTAX WAVE AT OBJECT = V-WAVE>
<SYNTAX WAVE TO OBJECT = V-WAVE>
<SYNONYM WHAT WHATS WHAT\'S WHO>
<SYNTAX WHAT OBJECT = V-WHAT>
<SYNTAX WHAT ABOUT OBJECT (HELD CARRIED ;HAVE) = V-WHAT>
<SYNTAX WHAT IN OBJECT (HELD CARRIED IN-ROOM ON-GROUND MANY)
= V-LOOK-INSIDE PRE-LOOK-INSIDE>
<SYNTAX WHAT ON OBJECT (HELD CARRIED IN-ROOM ON-GROUND MANY)
= V-LOOK-INSIDE PRE-LOOK-INSIDE>
<SYNTAX WHAT OBJECT OBJECT = V-WHAT-IS-WAS>
<SYNTAX WHEN = V-THANKS>
<SYNONYM WHEN DID WHY HOW>
<SYNTAX WRITE WITH OBJECT = V-WRITE>
<SYNTAX WRITE ON OBJECT = V-WRITE>
<SYNTAX WRITE ON OBJECT WITH OBJECT = V-WRITE>
<SYNTAX WRITE IN OBJECT = V-WRITE>
<SYNTAX WRITE IN OBJECT WITH OBJECT = V-WRITE>
;<SYNONYM YELL SCREAM SHOUT>
;<SYNTAX YELL = V-YELL>
<SYNONYM YES Y NO MAYBE>
<SYNTAX YES = V-YN>
<SYNONYM CONTINUE C>
<SYNTAX CONTINUE = V-CONTINUE>
<SYNONYM IS WAS>
<SYNTAX IS OBJECT OBJECT = V-IS>
<SYNONYM REVEAL DISCLOSE>
<SYNTAX REVEAL OBJECT TO OBJECT (FIND PERSON) = V-REVEAL>
<SYNTAX $REVEAL OBJECT TO OBJECT (FIND PERSON) = V-$REVEAL>
<SYNTAX $DISCOVER OBJECT OBJECT (FIND PERSON) = V-$DISCOVER>
<SYNTAX TIP OBJECT (FIND PERSON) = V-TIP>
%<COND (<NOT <GASSIGNED? PREDGEN>> '<SYNTAX Z = V-ESCAPE>)>

871
things.zil Normal file
View file

@ -0,0 +1,871 @@
"THINGS for M3
Copyright (C) 1984 Infocom, Inc. All rights reserved."
<OBJECT GLOBAL-OBJECTS
(FLAGS AN BURNBIT CONTBIT DOORBIT
DRINKBIT FEMALE FOODBIT FURNITURE
INVISIBLE LOCKED NDESCBIT ONBIT
OPENBIT PERSON READBIT RMUNGBIT
SEARCHBIT SURFACEBIT TAKEBIT THE
TOLD TOOLBIT TOUCHBIT TRANSBIT
TRYTAKEBIT VEHBIT WEARBIT WEAPONBIT
WINDOWBIT MICHAELBIT ALICIABIT ;"31 BITS")
(DESCFCN NULL-F)
(CONTFCN NULL-F)
(PSEUDO NULL-F)
(TEXT "FOO")>
<OBJECT LOCAL-GLOBALS
(IN GLOBAL-OBJECTS)
(SYNONYM ZZKJLK) ;"This synonym is necessary - God knows">
<OBJECT PSEUDO-OBJECT
(DESC "pseudo" ;"Place holder (MUST BE 6 CHARACTERS!!!!!)")
(ACTION NULL-F ;"Place holder")>
<OBJECT NOT-HERE-OBJECT
(DESC "such thing")
(ACTION NOT-HERE-OBJECT-F)>
<ROUTINE NOT-HERE-OBJECT-F ("AUX" TBL (PRSO? T) OBJ)
;"Protocol: return T if case was handled and msg TELLed,
<> if PRSO/PRSI ready to use"
<COND ;"This COND is game independent (except the TELL)"
(<AND <EQUAL? ,PRSO ,NOT-HERE-OBJECT>
<EQUAL? ,PRSI ,NOT-HERE-OBJECT>>
<TELL "Those things aren't">
<TELL-HERE>
<RTRUE>)
(<EQUAL? ,PRSO ,NOT-HERE-OBJECT>
<SET TBL ,P-PRSO>)
(T
<SET TBL ,P-PRSI>
<SET PRSO? <>>)>
<COND (.PRSO?
<COND (<VERB? ASK-CONTEXT-ABOUT ASK-CONTEXT-FOR CLIMB-UP
EXAMINE FIND FOLLOW SEARCH SEARCH-OBJECT-FOR
WHAT PHONE MAKE THROUGH WALK-TO WAIT-FOR ARREST
ACCUSE ANALYZE FINGERPRINT>
<COND (<SET OBJ <FIND-NOT-HERE .TBL .PRSO?>>
<COND (<NOT <==? .OBJ ,NOT-HERE-OBJECT>>
<RTRUE>)>)
(T
<RFALSE>)>)
(<VERB? TELL>
<SETG P-CONT <>>
<SETG QUOTE-FLAG <>>)>)
(T
<COND (<VERB? ASK-ABOUT ASK-FOR SAY
SEARCH-OBJECT-FOR SGIVE TELL-ME>
<COND (<SET OBJ <FIND-NOT-HERE .TBL .PRSO?>>
<COND (<NOT <==? .OBJ ,NOT-HERE-OBJECT>>
<RTRUE>)>)
(T
<RFALSE>)>)>)>
;"Here is the default 'cant see any' printer"
<SETG P-WON <>>
<TELL-CANT-SEE "any">
<NOT-HERE-PRINT>
<TELL-HERE>
<RTRUE>>
<ROUTINE TELL-CANT-SEE (STR)
<TELL ,YOU-CANT-SEE .STR>>
<ROUTINE TELL-HERE ()
<TELL " here." CR>>
<ROUTINE FIND-NOT-HERE (TBL PRSO? "AUX" M-F OBJ (CNT 0) PB? (LOCAL 0))
;"Protocol: return T if case was handled and msg TELLed,
,NOT-HERE-OBJECT if 'can't see' msg TELLed,
<> if PRSO/PRSI ready to use"
;"Here is where special-case code goes. <MOBY-FIND .TBL> returns
number of matches. If 1, then P-MOBY-FOUND is it. One may treat
the 0 and >1 cases alike or different. It doesn't matter. Always
return RFALSE (not handled) if you have resolved the problem."
<SET M-F <MOBY-FIND .TBL>>
%<DEBUG-CODE
<COND (,HDEBUG
<TELL "[Moby-found " N .M-F " objects" "]" CR>)>>
<COND (<G? .M-F 1>
<SET PB? <IN-BALLROOM? ,PLAYER>>
<REPEAT ()
<COND (<G? <SET CNT <+ .CNT 1>> .M-F>
<RETURN>)>
<SET OBJ <GET .TBL .CNT>>
<COND (<OR <AND .PB? <IN-BALLROOM? .OBJ>>
<CORRIDOR-LOOK .OBJ>>
<COND (<G? <SET LOCAL <+ .LOCAL 1>> 1>
<RETURN>)
(ELSE
<SETG P-MOBY-FOUND .OBJ>)>)>>
<COND (<EQUAL? .LOCAL 1>
<SET M-F 1>)>)>
<COND (<==? .M-F 1>
%<DEBUG-CODE
<COND (,HDEBUG
<TELL "[Namely: " D ,P-MOBY-FOUND "]" CR>)>>
<COND (.PRSO? <SETG PRSO ,P-MOBY-FOUND>)
(T <SETG PRSI ,P-MOBY-FOUND>)>
<RFALSE>)
(<G? .M-F 1>
<COND (<VERB? EXAMINE> <RETURN ,NOT-HERE-OBJECT>)
(<SET OBJ
<APPLY <GETP <SET OBJ <GET .TBL 1>>
,P?GENERIC>
.OBJ>>
<COND (<==? .OBJ ,NOT-HERE-OBJECT> <RTRUE>)
(.PRSO? <SETG PRSO .OBJ>)
(T <SETG PRSI .OBJ>)>)
(ELSE
<WHICH-PRINT 0 .M-F .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>
<RTRUE>)>)
(<OR <AND <NOT .PRSO?>
<FSET? ,PRSO ,PERSON>
<VERB? ASK-ABOUT ASK-FOR TELL-ME WHAT-IS-WAS>>
<AND .PRSO?
<VERB? ASK-CONTEXT-ABOUT ASK-CONTEXT-FOR>>
<AND <NOT <==? ,WINNER ,PLAYER>>
<VERB? WALK-TO FOLLOW FIND WHAT GIVE SGIVE>>>
<COND (<NOT <EQUAL? ,WINNER ,PLAYER>>
<TELL CD ,WINNER>)
(<AND <VERB? ASK-ABOUT ASK-FOR TELL-ME>
<NOT <EQUAL? ,PRSO ,PLAYER ,CORPSE>>>
<TELL CD ,PRSO>)
(ELSE
<TELL-ISNT-ANYONE>
<RTRUE>)>
<TELL
" looks confused. ">
<I-DONT-KNOW-ABOUT "any" <>>
<NOT-HERE-PRINT>
<TELL "!\"" CR>
<RTRUE>)
(<NOT .PRSO?>
<TELL "You wouldn't find any">
<NOT-HERE-PRINT>
<TELL " there." CR>
<RTRUE>)
(T ,NOT-HERE-OBJECT)>>
<ROUTINE NOT-HERE-PRINT ()
<COND (<OR ,P-OFLAG ,P-MERGED>
<COND (,P-XADJ <TELL " "> <PRINTB ,P-XADJN>)>
<COND (,P-XNAM <TELL " "> <PRINTB ,P-XNAM>)>)
(<EQUAL? ,PRSO ,NOT-HERE-OBJECT>
<BUFFER-PRINT <GET ,P-ITBL ,P-NC1> <GET ,P-ITBL ,P-NC1L> <>>)
(T
<BUFFER-PRINT <GET ,P-ITBL ,P-NC2> <GET ,P-ITBL ,P-NC2L> <>>)>>
<OBJECT IT
(IN GLOBAL-OBJECTS)
(SYNONYM IT HE SHE THEY)
(DESC "it")
(FLAGS NDESCBIT AN)
;(ACTION IT-F)>
;<ROUTINE IT-F ()
<COND (<AND <EQUAL? ,PRSO ,IT>
<NOT ,P-IT-OBJECT>
,P-HIM-HER>
<PERFORM ,PRSA ,P-HIM-HER ,PRSI>
<RTRUE>)
(<OR <AND <EQUAL? ,PRSI ,IT>
<VERB? ASK-ABOUT ASK-FOR SEARCH-OBJECT-FOR TELL-ME>>
<AND <EQUAL? ,PRSO ,IT>
<VERB? ASK-CONTEXT-ABOUT ASK-CONTEXT-FOR FIND WHAT>>>
<TELL "\"I'm not sure what you're talking about.\"" CR>)>>
<ROUTINE THE? (NOUN)
<COND (<OR <EQUAL? .NOUN ,IT ,YOU ,HIM-HER>
<FSET? .NOUN ,PERSON>>
<RTRUE>)
(T <TELL " the">)>>
<ROUTINE THIS-IS-IT (OBJ)
%<DEBUG-CODE
<COND (,IDEBUG
<TELL "[It's " D .OBJ "]" CR>)>>
<SETG P-IT-OBJECT .OBJ>
<SETG P-IT-LOC ,HERE>>
<OBJECT INTNUM
(IN GLOBAL-OBJECTS)
(SYNONYM INTNUM)
(DESC "number")
;(ACTION INTNUM-F)>
<OBJECT WEATHER
(IN GLOBAL-OBJECTS)
(SYNONYM WEATHER SKY RAIN CLOUDS)
(DESC "weather")
(ACTION WEATHER-F)>
<GLOBAL SAW-RAIN-SLACK-OFF? <>>
<ROUTINE WEATHER-F ()
<COND (<VERB? EXAMINE FIND LISTEN>
<COND (<AND <NOT <OUTSIDE? ,HERE>>
<NOT <GLOBAL-IN? ,WINDOW ,HERE>>>
<TELL-YOU-CANT "see the outside from here">)
(<L? ,PRESENT-TIME 550>
<TELL
"The rain is pouring down. It's a great night for ducks!" CR>)
(<L? ,PRESENT-TIME 570>
<SETG SAW-RAIN-SLACK-OFF? T>
<TELL
"The rain has slacked off, it's just a drizzle now." CR>)
(<L? ,PRESENT-TIME 630>
<TELL
"The rain is coming down in buckets">
<COND (,SAW-RAIN-SLACK-OFF? <TELL " again">)>
<TELL "." CR>)
(ELSE
<TELL
"The rain is almost stopped, and the storm seems to be passing off to the
northeast." CR>)>)
(<VERB? RUB>
<COND (<OUTSIDE? ,HERE>
<TELL "It's wet." CR>)
(ELSE
<TELL-YOU-CANT "touch that">)>)>>
<GLOBAL RAIN-STATE 2>
<ROUTINE I-RAIN-SLOWS ()
<SETG RAIN-STATE 1>
<COND (<OUTSIDE? ,HERE>
<SETG SAW-RAIN-SLACK-OFF? T>
<TELL
"Now the rain has slowed. It's just a light shower now." CR>
<RFALSE>)>>
<ROUTINE I-RAIN-POURS ()
<SETG RAIN-STATE 2>
<COND (<OUTSIDE? ,HERE>
<TELL
"Now the rain is coming down in torrents, a real cloudburst." CR>
<RFALSE>)>>
<ROUTINE I-RAIN-STOPS ()
<SETG RAIN-STATE 0>
<COND (<OUTSIDE? ,HERE>
<TELL
"Now the rain has slowed down almost to a stop. Only a few drops
are falling now." CR>
<RFALSE>)>>
<OBJECT MIDNIGHT
(IN GLOBAL-OBJECTS)
(DESC "midnight")
(SYNONYM MIDNIGHT)
(FLAGS NDESCBIT)>
<OBJECT HANDCUFFS
(IN DUFFY)
(DESC "handcuffs")
(SYNONYM HANDCUFF CUFF CUFFS)
(FLAGS NDESCBIT)>
<OBJECT WATER
(IN LOCAL-GLOBALS)
(DESC "water")
(SYNONYM WATER)
(ACTION WATER-F)
(FLAGS NDESCBIT)>
<ROUTINE WATER-F ()
<COND (<VERB? WALK>
<PERFORM ,V?LAMP-ON ,WATER>
<RTRUE>)>>
<OBJECT TELEPHONE
(IN LOCAL-GLOBALS)
(DESC "telephone")
(SYNONYM TELEPHONE PHONE)
(ACTION TELEPHONE-F)
(FLAGS NDESCBIT)>
<ROUTINE TELEPHONE-F ()
<COND (<VERB? REPLY>
<TELL "It wasn't ringing." CR>)
(<VERB? TAKE>
<TELL "You hear a dial tone." CR>)
(<AND <VERB? PHONE> <EQUAL? ,PRSO ,TELEPHONE>>
<TELL ,YOU-SHOULD "dial a number, such as 911." CR>)
(<VERB? HANG-UP>
<DISABLE <INT I-HANG-UP>>
<TELL "You replace the receiver." CR>)>>
<OBJECT GLOBAL-FINGERPRINTS
(IN GLOBAL-OBJECTS)
(DESC "fingerprints")
(SYNONYM FINGERPRINT PRINT PRINTS)
;(ADJECTIVE FINGER)
(FLAGS NDESCBIT)>
<OBJECT SINK
(IN LOCAL-GLOBALS)
(DESC "sink")
(SYNONYM SINK BASIN TAP)
(ACTION SINK-F)
(FLAGS NDESCBIT)>
<ROUTINE SINK-F ()
<COND (<AND <VERB? BRUSH> <EQUAL? ,PRSO ,HANDS>>
<TELL "Your hands are now clean." CR>)>>
<OBJECT SHOWER
(IN LOCAL-GLOBALS)
(DESC "shower")
(SYNONYM BATH STALL)
(ADJECTIVE SHOWER)
(ACTION SHOWER-F)
(FLAGS NDESCBIT)>
<ROUTINE SHOWER-F ()
<COND (<VERB? TAKE LAMP-ON>
<TELL "You'd get your costume all wet." CR>)
(<VERB? LOOK-INSIDE>
<TELL ,THERE-IS "no blood in the shower." CR>)>>
<OBJECT TOILET
(IN LOCAL-GLOBALS)
(DESC "toilet")
(SYNONYM TOILET)
(ACTION TOILET-F)
(CAPACITY 30)
(FLAGS NDESCBIT FURNITURE VEHBIT OPENBIT SURFACEBIT)>
<ROUTINE TOILET-F ("OPTIONAL" (RARG <>))
<COND (<EQUAL? .RARG ,M-END> <RFALSE>)
(<EQUAL? ,PRSO ,TOILET>
<COND (<VERB? WALK USE>
<TELL "You now feel refreshed." CR>)
(<VERB? LOOK-INSIDE SMELL>
<TELL
"The toilet is immaculate. Nosey, aren't you?" CR>)
(<VERB? FLUSH>
<TELL ,YOU-ARE "a model and considerate guest." CR>)>)>>
<OBJECT GLOBAL-HERE
(IN GLOBAL-OBJECTS)
(DESC "here")
(SYNONYM HERE)
(FLAGS NDESCBIT)>
<OBJECT HALLWAY
(IN GLOBAL-OBJECTS)
(DESC "hallway")
(SYNONYM HALL HALLWAY CORRIDOR)
(FLAGS NDESCBIT)>
<OBJECT GLOBAL-ROOM
(IN GLOBAL-OBJECTS)
(DESC "room")
(SYNONYM ROOM FLOOR)
(ACTION GLOBAL-ROOM-F)
(FLAGS NDESCBIT)>
<ROUTINE GLOBAL-ROOM-F ()
<COND (<VERB? EXAMINE LOOK-ON>
<PERFORM ,V?LOOK>
<RTRUE>)
(<VERB? SEARCH-OBJECT-FOR>
<PERFORM ,V?FIND ,PRSI>
<RTRUE>)
(<AND <VERB? PUT> <EQUAL? ,PRSI ,GLOBAL-ROOM>>
<PERFORM ,V?DROP ,PRSO>
<RTRUE>)>>
<OBJECT GLOBAL-MURDER
(IN GLOBAL-OBJECTS)
(DESC "murder")
(SYNONYM MURDER KILLING DEATH DEAD)
(ADJECTIVE VERONICA)
(ACTION GLOBAL-MURDER-F)
(FLAGS NDESCBIT)>
<ROUTINE GLOBAL-MURDER-F ("AUX" OW)
<COND (<AND <VERB? TELL-ME>
<EQUAL? ,WINNER ,PLAYER>
<EQUAL? ,PRSI ,GLOBAL-MURDER>>
<PERFORM ,V?REVEAL ,GLOBAL-MURDER ,PRSO>
%<DEBUG-CODE
<COND (<AND ,GOSSIP <NOT <FSET? ,PLAYER ,TOLD>>>
<TELL "[Murder: Player revealed to self?]" CR>)>>
<FSET ,PLAYER ,TOLD>
%<DEBUG-CODE
<COND (<AND ,GOSSIP <NOT <FSET? ,PRSO ,TOLD>>>
<TELL
"[Murder: Player revealed to " D ,PRSO "]" CR>)>>
<FSET ,PRSO ,TOLD>
<RTRUE>)
(<AND <VERB? $REVEAL>
<EQUAL? ,PRSO ,GLOBAL-MURDER>>
<REVEAL-MURDER ,PRSI>
%<DEBUG-CODE
<COND (<AND ,GOSSIP <NOT <FSET? ,WINNER ,TOLD>>>
<TELL
"[Murder: " D ,WINNER " revealed to self?]" CR>)>>
<FSET ,WINNER ,TOLD>
<COND (<IN? ,PRSI ,HERE>
<TELL
CD ,WINNER " sees " D ,PRSI " and they speak for a few moments. "
CD ,PRSI "'s eyes widen as " HE/SHE ,PRSI " is told of the murder.
There is an apparent conflict between shock and the desire to immediately
tell someone else about it." CR>)
(<NEARBY? ,PRSI>
<TELL
CD ,WINNER " is speaking excitedly and urgently to " D ,PRSI " some
distance away. You can't hear what is being said, but " D ,PRSI " is
very agitated by what " HE/SHE ,PRSI " has heard." CR>)>
<RTRUE>)
(<AND <VERB? IS>
<EQUAL? ,PRSO ,VERONICA ,CORPSE ,GLOBAL-VERONICA>
<NOT <EQUAL? ,PLAYER ,WINNER>>>
<SET OW ,WINNER>
<SETG WINNER ,PLAYER>
<PERFORM ,V?REVEAL ,GLOBAL-MURDER .OW>
<RTRUE>)>>
<OBJECT GLOBAL-EMBEZZLEMENT
(IN GLOBAL-OBJECTS)
(DESC "theft")
(SYNONYM THEFT EMBEZZLEMENT)
(FLAGS NDESCBIT)>
<OBJECT HORSE
(IN GLOBAL-OBJECTS)
(DESC "horse")
(SYNONYM HORSE GRUE HORSES)
(ADJECTIVE LURKING)
(FLAGS NDESCBIT)>
<OBJECT GLASS
(DESC "broken glass")
(SYNONYM GLASS GOBLET)
(ADJECTIVE BROKEN)
(FLAGS TAKEBIT TRYTAKEBIT CONTBIT OPENBIT SEARCHBIT)
(ACTION GLASS-F)>
<ROUTINE GLASS-F ("AUX" (W ,WINNER))
<COND (<AND <VERB? TAKE> <IN? ,GLASS ,BUTLER>>
<SETG WINNER ,BUTLER>
<PERFORM ,V?GIVE ,GLASS .W>
<SETG WINNER .W>)
(<AND <VERB? CUT> <EQUAL? ,PRSO ,PLAYER>>
<TELL
"Suicide is not the answer." CR>)
(<VERB? SMELL>
<TELL
,THERE-IS "something on the glass which smells sweet -- probably the remains
of " 'VERONICA "'s drink." CR>)
(<VERB? EXAMINE>
<TELL
"This is a large fragment of " 'GLASS " from a highball glass.
There is a film of red liquid on the inside." CR>)
(<VERB? ANALYZE>
<COND (<EQUAL? ,PRSI ,GLOBAL-FINGERPRINTS>
<TELL ,YOU-DONT-HAVE "the equipment." CR>)
(T
<TELL
"Since you're not a psychiatrist or a laboratory chemist, your chances
of a successful analysis are poor. Perhaps you should get someone more
competent to do the job." CR>)>)>>
<OBJECT LIQUID
(IN GLASS)
(DESC "liquid")
(SYNONYM LIQUID FILM)
(ADJECTIVE RED SWEET)
(FLAGS NDESCBIT)
(ACTION LIQUID-F)>
<ROUTINE LIQUID-F ()
<COND (<VERB? EXAMINE EAT SMELL RUB>
<TELL
"This seems to be the remains of " 'VERONICA "'s drink." CR>)>>
<OBJECT RECEIPT
(IN PLAYER)
(DESC "costume receipt")
(SYNONYM RECEIPT)
(ADJECTIVE COSTUME)
(FLAGS TAKEBIT BURNBIT READBIT)
(SIZE 2)
(TEXT
"(A copy is in your game package.)")>
;"\"Costumes Unlimited|
312 Wisconsin Ave.|
Rockville, MD|
555-9009|
|
(1) Cowboy costume with lariat and gunbelt: $65\"
"
<OBJECT COSTUME-SHOP
(IN GLOBAL-OBJECTS)
(DESC "Costumes Unlimited")
(SYNONYM SHOP)
(ADJECTIVE COSTUME UNLIMITED)
(FLAGS NDESCBIT)
(ACTION SHOP-F)>
<ROUTINE SHOP-F ()
<COND (<VERB? PHONE>
<COND (<G? ,PRESENT-TIME 600>
<TELL
"The telephone rings continuously for as long as you wait." CR>)
(ELSE
<MOVE ,JACK ,HERE>
<ENABLE <QUEUE I-HANG-UP 5>>
<TELL
"A tired-sounding voice answers. \"Costumes Unlimited, Jack
speaking. We're closing at ten. We don't have many costumes left.
Better make it quick.\"" CR>)>)>>
<ROUTINE I-HANG-UP ()
<COND (<IN? ,JACK ,HERE>
<REMOVE ,JACK>
<TELL
"You hear a click as the telephone is hung up at the other end." CR>)>>
<OBJECT JACK
(DESC "Jack")
(SYNONYM JACK)
(ACTION JACK-F)
(FLAGS NDESCBIT TRANSBIT PERSON)>
<ROUTINE JACK-F ()
<COND (<NOT <IN? ,JACK ,HERE>>
<TELL "He hung up." CR>)
(<OR <EQUAL? ,JACK ,WINNER>
<VERB? $CALL>>
<COND (<VERB? SGIVE TELL-ME> <RFALSE>)
(ELSE
<TELL "\"Get to the point, I'm busy.\"" CR>)>)
(<VERB? TAKE EXAMINE>
<TELL "Jack's on the telephone, not">
<TELL-HERE>)
(<AND <VERB? ASK-ABOUT> <EQUAL? ,PRSO ,JACK>>
<COND (<==? ,PRSI ,GLOBAL-VERONICA ,VERONICA ,CORPSE>
<COND (<NOT ,JACK-ASKED?>
<SETG JACK-ASKED? T>
<TELL
"\"" 'VERONICA " Ashcroft, eh? Upper crust type, right? Yeah, she rented " A
,FAIRY-COSTUME ". Real expensive. Great costume, though.\"" CR>)
(ELSE <TELL ,REPEATING-YOURSELF CR>)>)
(<==? ,PRSI ,FAIRY-COSTUME>
<COND (<NOT ,JACK-ASKED?>
<SETG JACK-ASKED? T>
<TELL
"\"Yeah, we rented one of them. Some society dame rented it. Just a minute,
I can tell you who...\" There is a short pause. \"Yeah, here she is.
" 'VERONICA " Ashcroft, one Titania costume, a hundred and twenty dollars.
We don't get much call for that one. Heck of a costume, though.\"" CR>)
(ELSE <TELL ,REPEATING-YOURSELF CR>)>)
(T
<TELL "\"Get to the point, I'm busy.\"" CR>)>)>>
<GLOBAL REPEATING-YOURSELF "\"You're repeating yourself.\"">
<GLOBAL JACK-ASKED? <>>
<OBJECT JACKSON
(IN GLOBAL-OBJECTS)
(DESC "Earl Davis Jackson")
(SYNONYM JACKSON EDITOR)
(ADJECTIVE EARL DAVIS)
(ACTION JACKSON-F)
(FLAGS NDESCBIT TRANSBIT PERSON)>
<ROUTINE JACKSON-F ()
<COND (<VERB? PHONE>
<TELL-NO-ANSWER>)>>
<OBJECT CARD
(IN WASTE-BASKET)
(DESC "business card")
(SYNONYM CARD)
(ADJECTIVE BUSINESS CRUMPLED)
(FLAGS NDESCBIT BURNBIT READBIT)
(TEXT
"(A copy is in your game package.)")>
;"The front reads:|
|
\"Kings Point Realty|
Specializing in finer homes|
William Cochrane,|
President\"|
|
On the back is a handwritten message:|
|
\"Don't do something you'll regret. Call me ASAP.|
Bill\"|
"
<OBJECT WASTE-BASKET
(IN OFFICE)
(SYNONYM BASKET WASTEBASKET)
(ADJECTIVE WASTE)
(DESC "waste basket")
(FDESC "Next to the large desk is a waste basket.")
(ACTION WASTE-BASKET-F)
(CAPACITY 15)
(SIZE 15)
(FLAGS SEARCHBIT CONTBIT OPENBIT TAKEBIT)>
<ROUTINE WASTE-BASKET-F ()
<COND (<AND <VERB? LOOK-INSIDE EXAMINE SEARCH SEARCH-OBJECT-FOR>
<EQUAL? ,PRSO ,WASTE-BASKET>>
<COND (<IN? ,CARD ,WASTE-BASKET>
<FCLEAR ,CARD ,NDESCBIT>
<FSET ,CARD ,TAKEBIT>
<TELL
"A crumpled " 'CARD " is on top">)
(ELSE
<TELL
"It's nearly full">)>
<TELL " of boring trash">
<PRINT-CONTENTS ,WASTE-BASKET ", including " ,CARD>
<TELL "." CR>)>>
<OBJECT DISCUSSION
(IN GLOBAL-OBJECTS)
(SYNONYM DISCUSSION ARGUMENT)
(ADJECTIVE HEATED)
(DESC "heated discussion")
(FLAGS NDESCBIT)>
<GLOBAL NUMBERS <LTABLE "one" "two" "three" "too many">>
<OBJECT TAXI
(IN GLOBAL-OBJECTS)
(SYNONYM TAXI CAB)
(DESC "taxi")
(ACTION TAXI-F)
(FLAGS NDESCBIT)>
<ROUTINE TAXI-F ()
<COND (<VERB? PHONE>
<TELL
"Since this is late on a rainy, disgusting night, the taxi company has
all its telephones off the hook. Too bad." CR>)>>
<OBJECT HANDS
(IN GLOBAL-OBJECTS)
(DESC "hands")
(SYNONYM HANDS)
(ACTION HANDS-F)
(FLAGS NDESCBIT)>
<ROUTINE HANDS-F ()
<COND (<VERB? BRUSH>
<COND (<GLOBAL-IN? ,SINK ,HERE>
<PERFORM ,V?BRUSH ,HANDS ,SINK>
<RTRUE>)
(ELSE
<TELL "There are sinks in the bathrooms." CR>)>)>>
<OBJECT FOOD
(IN LOCAL-GLOBALS)
(DESC "food")
(SYNONYM D\'OEUVRES OEUVRES MUNCHIES FOOD)
(ADJECTIVE HORS SHRIMP SANDWICHES)
(ACTION FOOD-F)
(FLAGS FOODBIT NDESCBIT TAKEBIT TRYTAKEBIT)>
<ROUTINE FOOD-F ()
<COND (<VERB? THROW THROW-AT THROW-THROUGH>
<TELL "This isn't \"Animal House.\"" CR>)
(<VERB? TAKE>
<TELL
"I suppose you plan to take it home in your pockets and eat it later?" CR>)
(<VERB? EAT SMELL>
<TELL
"Not bad. Obviously " 'VERONICA " found a good caterer." CR>)>>
<OBJECT GLOBAL-CHAIR
(IN LOCAL-GLOBALS)
(DESC "chair")
(SYNONYM CHAIR ARMCHAIR)
(ADJECTIVE ARM LAWN)
(FLAGS FURNITURE VEHBIT TRYTAKEBIT TAKEBIT OPENBIT)
(SIZE 100)
(ACTION GLOBAL-CHAIR-F)>
<OBJECT GLOBAL-SOFA
(IN LOCAL-GLOBALS)
(DESC "sofa")
(SYNONYM COUCH SOFA)
(ADJECTIVE LARGE)
(FLAGS FURNITURE VEHBIT TRYTAKEBIT TAKEBIT OPENBIT)
(SIZE 100)
(ACTION GLOBAL-CHAIR-F)>
<ROUTINE GLOBAL-CHAIR-F ("OPTIONAL" (RARG <>))
<COND (<EQUAL? .RARG ,M-BEG ,M-END> <RFALSE>)
(<AND <VERB? TAKE> <EQUAL? ,PRSO ,GLOBAL-CHAIR>>
<TELL ,RIDICULOUS CR>)
(<AND <VERB? PUT> <EQUAL? ,PRSI ,GLOBAL-CHAIR ,GLOBAL-SOFA>>
<FCLEAR ,PRSO ,WEARBIT>
<MOVE ,PRSO ,HERE>
<TELL
"It seems a shame to mar " THE ,PRSI " with " A ,PRSO ", so you put it on
the floor instead." CR>)
(<AND <VERB? SIT>
<EQUAL? ,PRSO ,GLOBAL-CHAIR ,GLOBAL-SOFA>
<HELD? ,CORPSE>>
<TELL CTHE ,PRSO " can't take that much weight." CR>)
(<AND <VERB? HIDE-BEHIND> <NOT ,PLAYER-HIDING>>
<NOW-CONCEALED>)>>
<ROUTINE NOW-CONCEALED ()
<SETG PLAYER-HIDING ,PRSO>
<TELL
,YOU-ARE "now concealed behind ">
<TELL-PRSO>>
<OBJECT CURTAINS
(IN LOCAL-GLOBALS)
(DESC "curtains")
(SYNONYM CURTAINS)
(FLAGS NDESCBIT)
(ACTION CURTAINS-F)>
<ROUTINE CURTAINS-F ()
<COND (<NOT <GLOBAL-IN? ,CURTAINS ,HERE>>
<TELL "There are no curtains">
<TELL-HERE>)
(<VERB? LOOK-INSIDE>
<COND (<FSET? ,HERE ,OPENBIT>
<TELL "You see darkness." CR>)
(T <TELL "The curtains are closed." CR>)>)
(<VERB? EXAMINE>
<TELL "The curtains are ">
<COND (<FSET? ,HERE ,OPENBIT> <TELL "open">)
(T <TELL "closed">)>
<TELL "." CR>)
(<VERB? OPEN>
<COND (<FSET? ,HERE ,OPENBIT>
<TELL ,THEY-ARE-ALREADY "open." CR>)
(ELSE
<FSET ,HERE ,OPENBIT>
<TELL ,CURTAINS-ARE "open." CR>)>)
(<VERB? CLOSE>
<COND (<NOT <FSET? ,HERE ,OPENBIT>>
<TELL ,THEY-ARE-ALREADY "closed." CR>)
(ELSE
<FCLEAR ,HERE ,OPENBIT>
<TELL ,CURTAINS-ARE "closed." CR>)>)>>
<GLOBAL THEY-ARE-ALREADY "They are already ">
<GLOBAL CURTAINS-ARE "Okay, the curtains are ">
<OBJECT WINDOW
(IN LOCAL-GLOBALS)
(SYNONYM WINDOW)
(DESC "window")
(ACTION WINDOW-F)
(FLAGS WINDOWBIT NDESCBIT)>
<ROUTINE WINDOW-F ()
<COND (<VERB? OPEN CLOSE>
<TELL
"All the windows are closed and locked. The house has a reasonably
serious security setup." CR>)
(<VERB? LOOK-INSIDE LOOK-OUTSIDE>
<COND (<OR <FSET? ,HERE ,OPENBIT>
<NOT <GLOBAL-IN? ,CURTAINS ,HERE>>>
<PERFORM ,V?EXAMINE ,WEATHER>
<RTRUE>)
(ELSE
<TELL "The curtains are drawn." CR>)>)>>
<OBJECT GLOBAL-PLANTS
(IN LOCAL-GLOBALS)
(SYNONYM PLANTS POTS PLANT POT)
(DESC "plant")
(ACTION GLOBAL-PLANTS-F)
(FLAGS WINDOWBIT NDESCBIT)>
<ROUTINE GLOBAL-PLANTS-F ()
<COND (<VERB? EXAMINE>
<TELL
"These are ">
<COND (<EQUAL? ,HERE ,PORCH>
<TELL "small potted shrubs, bushes">)
(T
<TELL "large shrubs, bushes, trees">)>
<TELL ", and so on." ,DOING-WELL CR>)
(<VERB? TAKE MUNG EAT>
<TELL-CARE>)>>
<OBJECT HOUSE
(IN GLOBAL-OBJECTS)
(SYNONYM HOUSE)
(ADJECTIVE FARM)
(DESC "house")
(ACTION HOUSE-F)
(FLAGS NDESCBIT)>
<ROUTINE HOUSE-F ()
<COND (<VERB? EXAMINE>
<COND (<OUTSIDE? ,HERE>
<TELL
"It's dark, but you know that the Ashcroft house is a large, mostly
colonial structure. It was extensively rebuilt in the late nineteenth
century. It is partly brick, and partly white-painted wood." CR>)
(T
<TELL "The house is in good repair." CR>)>)>>
<OBJECT KEY
(IN GLOBAL-OBJECTS)
(SYNONYM KEY KEYS)
(DESC "key")
(ACTION KEY-F)
(FLAGS NDESCBIT)>
<ROUTINE KEY-F ()
<COND (<VERB? FIND>
<TELL "I don't know where the keys are." CR>)>>
<OBJECT STAIR
(IN LOCAL-GLOBALS)
(SYNONYM STAIR STAIRS)
(DESC "stair")
(ACTION STAIR-F)
(FLAGS NDESCBIT)>
<ROUTINE STAIR-F ()
<COND (<VERB? CLIMB-FOO CLIMB-UP>
<DO-WALK ,P?UP>
<RTRUE>)
(<VERB? CLIMB-DOWN>
<DO-WALK ,P?DOWN>
<RTRUE>)>>
<OBJECT PARTY
(IN GLOBAL-OBJECTS)
(SYNONYM PARTY)
(DESC "party")
(ACTION PARTY-F)
(FLAGS NDESCBIT)>
<ROUTINE PARTY-F ()
<COND (<VERB? LEAVE>
<TELL
"Don't be such a wet blanket!" CR>)>>

2697
verbs.zil Normal file

File diff suppressed because it is too large Load diff