moonmist/goal.zil

2021 lines
67 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"GOAL for MOONMIST
Copyright (C) 1986 Infocom, Inc. All rights reserved."
"Rapid Transit Line Definitions and Identifiers"
<CONSTANT MAIN-LINE-C 1>
<CONSTANT BED-LINE-C 2>
<CONSTANT TOWER-LINE-C 3>
<CONSTANT PASS-LINE-C 4>
<CONSTANT GOAL-I-MULTIPLIER 8> "<* 2 ,NUMBER-OF-LINES>"
<GLOBAL MAIN-LINE
<PTABLE 0 GARDEN P?OUT
P?IN MAZE P?OUT
P?EAST COURTYARD P?SOUTH
P?NORTH FOYER P?SOUTH
P?NORTH GREAT-HALL P?WEST
P?EAST CORR-1 P?NORTH
P?SOUTH DINING-ROOM P?IN
P?OUT BACKSTAIRS P?DOWN
P?UP KITCHEN 0>>
<GLOBAL BED-LINE
<PTABLE 0 WEST-HALL P?SOUTH
P?NW GALLERY P?NE
P?SOUTH EAST-HALL 0>>
<GLOBAL TOWER-LINE
<PTABLE 0 LOVER-PATH P?IN
P?NW DUNGEON P?EAST
P?WEST BASEMENT P?UP
P?DOWN JUNCTION P?WEST
P?EAST OLD-GREAT-HALL P?UP
P?DOWN CORR-2 P?UP
P?DOWN CORR-3 P?UP
P?DOWN DECK 0>>
<GLOBAL PASS-LINE
<PTABLE 0 SECRET-LANDING-JACK P?DOWN
P?WEST PASSAGE-1 P?UP
P?DOWN SECRET-LANDING-TAM P?NORTH
P?SOUTH SECRET-LANDING-LIB P?EAST
P?WEST SECRET-IAN-PASSAGE P?EAST
P?WEST HYDE-CLOSET P?EAST
P?WEST MIDPOINT P?EAST
P?WEST WENDISH-CORNER P?EAST
P?NORTH IRIS-CLOSET P?SOUTH
P?NORTH YOUR-CLOSET P?DOWN
P?UP DRAWING-CLOSET 0>>
<GLOBAL TRANSFER-TABLE
<PTABLE 0 0 ;"transfers from MAIN-LINE"
GREAT-HALL GALLERY
CORR-1 JUNCTION
GREAT-HALL GALLERY
GALLERY GREAT-HALL ;"transfers from BED-LINE"
0 0
GALLERY GREAT-HALL
YOUR-ROOM YOUR-CLOSET
JUNCTION CORR-1 ;"transfers from TOWER-LINE"
JUNCTION CORR-1
0 0
LIBRARY SECRET-LANDING-LIB
YOUR-CLOSET YOUR-ROOM ;"transfers from PASS-LINE"
YOUR-CLOSET YOUR-ROOM
SECRET-LANDING-LIB LIBRARY
0 0>>
"CODE"
<ROUTINE FOLLOW-GOAL (PERSON
"AUX" (HEER <LOC .PERSON>) GT GOAL FLG (IGOAL <>) X)
<COND (<NOT <IN? .HEER ,ROOMS>>
<SET HEER <META-LOC .HEER>>
<MOVE .PERSON .HEER>)>
<SET GT <GT-O .PERSON>>
<COND (<==? .HEER <GET .GT ,GOAL-F>>
<RETURN <GOAL-REACHED .PERSON>>)
(<ZERO? <GET .GT ,GOAL-ENABLE>>
<RFALSE>)>
<SET IGOAL <GET .GT ,GOAL-I>>
<SET GOAL <GET ,TRANSFER-TABLE .IGOAL>>
<COND (<ZERO? .GOAL>
<SET IGOAL <>>
<SET GOAL <GET .GT ,GOAL-S>>)>
<SET X <GETP .HEER ,P?STATION>>
<COND (<NOT <EQUAL? .HEER .GOAL .X>>
%<DEBUG-CODE <COND (<ZERO? .X>
<SET X .HEER>
<TELL "{!! NO STATION AT " D .HEER "}|">)>>
<RETURN <MOVE-PERSON .PERSON .X>>)
(<NOT .GOAL>
<RFALSE>)
(<==? .HEER .GOAL>
<COND (.IGOAL
<SET FLG <GET ,TRANSFER-TABLE <+ .IGOAL 1>>>
%<DEBUG-CODE
<COND (<ZERO? .FLG>
<SET FLG .HEER>
<TELL "{!! NO TRANSFER #" N .IGOAL "}|">)>>
<SET FLG <MOVE-PERSON .PERSON .FLG>>
<ESTABLISH-GOAL .PERSON <GET .GT ,GOAL-F>>
<RETURN .FLG>)
(<NOT <==? .HEER <SET FLG <GET .GT ,GOAL-F>>>>
<RETURN <MOVE-PERSON .PERSON .FLG>>)
(T
<RETURN <GOAL-REACHED .PERSON>>)>)
(<==? .HEER <GETP .GOAL ,P?STATION>>
<RETURN <MOVE-PERSON .PERSON .GOAL>>)>
<SET FLG <FOLLOW-GOAL-NEXT .HEER .GOAL ;.PERSON>>
<MOVE-PERSON .PERSON .FLG>>
<ROUTINE FOLLOW-GOAL-NEXT (HEER GOAL
"AUX" LINE (CNT 1) RM (GOAL-FLAG <>) LOC G)
<SET LINE <GET-LINE <GETP .GOAL ,P?LINE>>>
<SET G <GETP .GOAL ,P?STATION>>
<REPEAT ()
<SET RM <GET .LINE .CNT>>
<COND (<==? .RM .HEER>
<COND (.GOAL-FLAG
<SET LOC <GET .LINE <- .CNT 3>>>)
(T
<SET LOC <GET .LINE <+ .CNT 3>>>)>
<RETURN .LOC>)
(<==? .RM .G>
<SET GOAL-FLAG T>)>
<SET CNT <+ .CNT 3>>>>
<ROUTINE GET-LINE (LN)
<COND (<==? .LN ,MAIN-LINE-C> ,MAIN-LINE)
(<==? .LN ,BED-LINE-C> ,BED-LINE)
(<==? .LN ,TOWER-LINE-C> ,TOWER-LINE)
(<==? .LN ,PASS-LINE-C> ,PASS-LINE)>>
<ROUTINE IN-MOTION? (PERSON "OPTIONAL" (DISABLED-OK <>) "AUX" GT L F C)
<SET C <GETP .PERSON ,P?CHARACTER>>
<SET GT <GET ,GOAL-TABLES .C>>
<COND (<AND <EQUAL? .PERSON ,BUTLER>
<BTST ,PRESENT-TIME 1>
<ZERO? .DISABLED-OK>>
<RFALSE>)
(<AND <GET .GT ,GOAL-S>
<NOT <==? <SET L <LOC .PERSON>>
<SET F <GET .GT ,GOAL-F>>>>>
<COND (.DISABLED-OK <RTRUE>)
(<NOT <ZERO? <GET .GT ,GOAL-ENABLE>>>
<RTRUE>
;<FOLLOW-GOAL-DIR .L .F .PERSON>)>)>>
"Movement etc."
<ROUTINE ESTABLISH-GOAL (PERSON GOAL "OPTIONAL" (SPEED 1) "AUX" LOCN GT)
;%<DEBUG-CODE
<COND (<ZERO? .PERSON>
<TELL "{!! E-G: PERSON=0, GOAL=" D .GOAL ".}|">)>>
<SET LOCN <LOC .PERSON>>
<COND (<==? .LOCN .GOAL>
<RETURN <GOAL-REACHED .PERSON>>)>
<COND (<EQUAL? .PERSON ,CONFESSED ,CAPTOR>
<RETURN .LOCN>)>
;%<DEBUG-CODE
<COND (<ZERO? <GETP .LOCN ,P?LINE>>
<TELL
"{!! E-G: PERSON=" D .PERSON ", LOCN=" D .LOCN ", GOAL=" D .GOAL ".}|">)>>
;%<DEBUG-CODE
<COND (<ZERO? <GETP .GOAL ,P?LINE>>
<TELL
"{!! E-G: PERSON=" D .PERSON", GOAL=" D .GOAL ".}|">)>>
<SET GT <GT-O .PERSON>>
<PUT .GT ,GOAL-I <+ <* <- <GETP .LOCN ,P?LINE> 1> ,GOAL-I-MULTIPLIER>
<* <- <GETP .GOAL ,P?LINE> 1> 2>>>
<PUT .GT ,GOAL-S <GETP .GOAL ,P?STATION>>
<PUT .GT ,GOAL-F .GOAL>
<PUT .GT ,GOAL-ENABLE .SPEED>
.LOCN>
<GLOBAL GOAL-PERSON:OBJECT <>>
<ROUTINE GOAL-REACHED (PERSON "AUX" GT (VAL <>))
<SET GT <GT-O .PERSON>>
;<COND (<ZERO? <GET .GT ,GOAL-S>> <RFALSE>)>
<PUT .GT ,GOAL-S <>>
<PUTP .PERSON ,P?LDESC 0> ;"default desc"
<COND (<NOT <CREEPY? <SET VAL <META-LOC .PERSON>>>>
<FSET .VAL ,ONBIT>)>
<SETG GOAL-PERSON .PERSON>
<SET VAL <D-APPLY "Reached" <GET .GT ,GOAL-FUNCTION> ,G-REACHED>>
<COND (<T? .VAL> <RETURN .VAL>)
(<AND <IN? .PERSON ,HERE>
<NOT <FSET? .PERSON ,TOUCHBIT>>>
<APPLY <GETP .PERSON ,P?DESCFCN> ,M-OBJDESC>)>>
<ROUTINE ENTERS? (DIR WHERE)
<COND (<==? .DIR ,P?IN>
<RTRUE>)
(<FSET? .WHERE ,TOUCHBIT>
<RTRUE>)>>
<ROUTINE TELL-OPEN-DOOR () <TELL " opens the door for a moment and">>
<ROUTINE TELL-HIS-HER-BEDROOM (CHR WHERE)
<COND (<==? .CHR ,BUTLER-C>
<TELL THE .WHERE>
<RTRUE>)>
<INC CHR>
<COND (<NOT <EQUAL? .WHERE <GET ,CHAR-ROOM-TABLE .CHR>
<GET ,CHAR-CLOSET-TABLE .CHR>>>
<TELL THE .WHERE>
<RTRUE>)>
<TELL " h">
<COND (<FSET? <GET ,CHARACTER-TABLE <- .CHR 1>> ,FEMALE>
<TELL "er ">)
(T <TELL "is ">)>
<COND (<FSET? .WHERE ,SECRETBIT>
<TELL "entrance">)
(T <TELL "bedroom">)>>
<ROUTINE TELL-LOCKING-THE-DOOR (DOOR)
<COND (<AND <T? .DOOR> <FSET? .DOOR ,LOCKED>>
<TELL ", locking the door">)>>
<ROUTINE MOVE-PERSON (PERSON WHERE
"AUX" DIR EDIR (GT <>) OL COR PCOR CHR (DOOR <>) (VAL <>) X)
<COND (<FSET? .PERSON ,MUNGBIT>
<RFALSE>)
(<EQUAL? .PERSON ,CONFESSED ,CAPTOR ,FOLLOWER>
<RFALSE>)
(<AND <EQUAL? .PERSON ,BUTLER>
<OR <EQUAL? ,AWAITING-REPLY ,BUTLER-1-R ,BUTLER-2-R>
<EQUAL? ,AWAITING-REPLY ,BUTLER-3-R ,BUTLER-4-R>>>
<RFALSE>)>
<PUTP .PERSON ,P?LDESC 6 ;"walking along">
<COND (<AND <EQUAL? .PERSON ,BUTLER>
<BTST ,PRESENT-TIME 1>>
<RFALSE>)>
<SET CHR <GETP .PERSON ,P?CHARACTER>>
<SET GT <GET ,GOAL-TABLES .CHR>>
<SET OL <LOC .PERSON>>
<SET DIR <DIR-FROM .OL .WHERE>>
<SET EDIR <COMPASS-EQV .OL .DIR>>
<SETG GOAL-PERSON .PERSON>
<COND (<AND <NOT <ZERO? .DIR>>
<SET X <GETPT .OL .DIR>>
<==? <PTSIZE .X> ,DEXIT>>
<SET DOOR <GET-DOOR-OBJ .X>>)>
<SET PCOR <CORRIDOR-LOOK .PERSON>>
<COND (<==? ,M-FATAL <D-APPLY "Enroute" <GET .GT ,GOAL-FUNCTION>
,G-ENROUTE>>
<THIS-IS-IT .PERSON>
<RFATAL>)
(<EQUAL? .PERSON ,PLAYER>
<COND (.DOOR
<FSET .DOOR ,SEENBIT>
<COND (<NOT <WALK-THRU-DOOR? .X>>
<RFATAL>)>)>)
(<AND <T? ,NOW-WEARING>
<OR <ZERO? ,LIT>
<FSET? .PERSON ,NDESCBIT>>>
T)
(<==? .OL ,HERE>
<SET VAL T>
<TELL CHE .PERSON>
<COND (<AND <T? .DOOR>
<NOT <FSET? .DOOR ,OPENBIT>>>
<FSET .DOOR ,TOUCHBIT ;,SEENBIT>
<TELL-OPEN-DOOR>)>
<COND (<==? .DIR ,P?OUT>
<TELL " leaves.|">)
(<ENTERS? .DIR .WHERE>
<TELL " enters">
<TELL-HIS-HER-BEDROOM .CHR .WHERE>
<TELL-LOCKING-THE-DOOR .DOOR>
<TELL ".|">)
(T
<TELL " walks ">
<COND (<EQUAL? .DIR ,P?UP ,P?DOWN>
<DIR-PRINT .DIR>)
(<FSET? .WHERE ,TOUCHBIT>
<TELL "to">
<TELL-HIS-HER-BEDROOM .CHR .WHERE>)
(T
<DIR-PRINT .EDIR>)>
<TELL-LOCKING-THE-DOOR .DOOR>
<TELL ".|">)>)
(<==? .WHERE ,HERE>
<COND (<ZERO? ,NOW-WEARING>
<TELL
"When you hear the door begin to open, you" ,REMEMBER-NOT-DRESSED " and
hop into " 'YOUR-BATHROOM ".|">
<GOTO ,YOUR-BATHROOM>
<SET VAL ,M-FATAL>)
(<OR <NOT .GT>
<NOT <==? ,HERE <GET .GT ,GOAL-F>>>>
<SET VAL T>
<START-SENTENCE .PERSON>
<COND (<AND <T? .DOOR>
<NOT <FSET? .DOOR ,OPENBIT>>>
<FSET .DOOR ,TOUCHBIT ;,SEENBIT>
<TELL-OPEN-DOOR>)>
<COND (<AND <VERB? WALK>
<==? .OL ,OHERE>>
<TELL " follows you">)
(T
<TELL " walks past you from">
<COND (<EQUAL? .DIR ,P?UP ,P?DOWN>
<TELL !\ >
<DIR-PRINT <OPP-DIR .DIR>>)
(T
<TELL-HIS-HER-BEDROOM .CHR .OL>)>)>
<TELL ".|">)>)
(<SET COR <GETP ,HERE ,P?CORRIDOR>>
<COND (<NOT <ZERO? .PCOR>>
<COND (<ZERO? <CORRIDOR-LOOK .WHERE>>
<SET VAL T>
<COND (<AND <EQUAL? .PERSON ,P-HER-OBJECT>
<FSET? ,HER ,TOUCHBIT>>
<TELL "She">)
(<AND <EQUAL? .PERSON ,P-HIM-OBJECT>
<FSET? ,HIM ,TOUCHBIT>>
<TELL "He">)
(T
<START-SENTENCE .PERSON>
<TELL !\,>
<WHERE? .PERSON .PCOR>
<TELL !\,>)>
<COND (<AND <T? .DOOR>
<NOT <FSET? .DOOR ,OPENBIT>>>
<FSET .DOOR ,TOUCHBIT ;,SEENBIT>
<TELL-OPEN-DOOR>)>
<COND (<ENTERS? .DIR .WHERE>
<TELL " enters">
<TELL-HIS-HER-BEDROOM .CHR .WHERE>)
(T
<TELL " disappears ">
<COND (<NOT <EQUAL? .DIR ,P?UP ,P?DOWN>>
<TELL "to the ">)>
<DIR-PRINT .EDIR>)>
<TELL-LOCKING-THE-DOOR .DOOR>
<TELL ".|">)
(T
<SET VAL T>
<START-SENTENCE .PERSON>
<TELL " is">
<WHERE? .PERSON .PCOR>
<TELL ", heading ">
<COND (<==? .PCOR .DIR>
<TELL "away from you">)
(<==? .PCOR <OPP-DIR .DIR>>
<TELL "toward you">)
(T
<COND (<NOT <EQUAL? .DIR ,P?UP ,P?DOWN>>
<TELL "toward the ">)>
<DIR-PRINT .EDIR>)>
<TELL ".|">)>)
(<T? <SET PCOR <CORRIDOR-LOOK .WHERE>>>
<SET VAL T>
<WHERE? .PERSON .PCOR T>
<TELL HE .PERSON appear>
<SET DIR <COMPASS-EQV ,HERE <DIR-FROM .WHERE .OL>>>
<COND (<NOT <EQUAL? .DIR ,P?IN>>
<TELL " from">
<TELL-HIS-HER-BEDROOM .CHR .OL>)>
<TELL ".|">)>)>
<COND (<AND .VAL
<IN? ,LUGGAGE .PERSON>
<T? ,NOW-WEARING>
;<==? ,HERE .WHERE>>
<TELL CHE .PERSON is " carrying " D ,LUGGAGE ".|">)>
<COND (<T? .PERSON> <MOVE .PERSON .WHERE>)>
<COND (.GT
<COND (<==? <GET .GT ,GOAL-F> .WHERE>
<SET X <GOAL-REACHED .PERSON>>
<COND (<AND <ZERO? .X>
<==? ,HERE .WHERE>
<NOT <FSET? .PERSON ,NDESCBIT>>>
<SET VAL T>
<TELL CHE .PERSON " enters and nods to you." CR>)
(<AND <T? .X>
<NOT <==? .VAL ,M-FATAL>>>
<SET VAL .X>)>)
(T
<SET X <D-APPLY "Enroute" <GET .GT ,GOAL-FUNCTION>
,G-ENROUTE>>
<COND (<AND <ZERO? .X>
<IN? .PERSON ,HERE>
<NOT <FSET? .PERSON ,TOUCHBIT>>>
<COND (<SET X <APPLY <GETP .PERSON ,P?DESCFCN>
,M-OBJDESC>>
<SET VAL T>)>)
(<AND <T? .X>
<NOT <==? .VAL ,M-FATAL>>>
<SET VAL .X>)>)>)>
;%<DEBUG-CODE <COND (,DBUG
<TELL !\{>
<TELL-$WHERE .PERSON .WHERE>
<TELL "}|">)>>
<COND (<T? .VAL>
<THIS-IS-IT .PERSON>
<COND (<NOT <==? .VAL ,M-FATAL>>
<FSET .WHERE ,SEENBIT> ;"so FOLLOW CHR works"
<PUT ,FOLLOW-LOC .CHR .WHERE>)>
<RETURN .VAL>)>>
"? combine next two routines?"
<ROUTINE COMPASS-EQV (RM DIR "AUX" DIRTBL DIRL P L TBL (VAL <>))
<COND ;(<ZERO? .DIR> <RFALSE>)
(<AND <NOT <EQUAL? .DIR ,P?UP ,P?DOWN>>
<NOT <EQUAL? .DIR ,P?IN ,P?OUT>>>
<RETURN .DIR>)>
<SET DIRTBL <GETPT .RM .DIR>>
<SET DIRL <PTSIZE .DIRTBL>>
<SET P 0>
<REPEAT ()
<COND (.VAL <RETURN .VAL>)
(<0? <SET P <NEXTP .RM .P>>> <RFALSE>)
(<NOT <L? .P ,LOW-DIRECTION>>
<SET TBL <GETPT .RM .P>>
<SET L <PTSIZE .TBL>>
<COND (<NOT <==? .L .DIRL>> <AGAIN>)>
<DEC L>
<REPEAT ()
<COND (<NOT <==? <GETB .TBL .L> <GETB .DIRTBL .L>>>
<RETURN>)
(<DLESS? L 0>
<SET VAL .P>
<RETURN>)>>)>>>
<ROUTINE DIR-EQV? (RM DIR1 DIR2 "AUX" DIR1TBL DIR2TBL L)
<COND (<==? .DIR1 .DIR2>
<RTRUE>)
(<ZERO? <SET DIR1TBL <GETPT .RM .DIR1>>>
<RFALSE>)
(<ZERO? <SET DIR2TBL <GETPT .RM .DIR2>>>
<RFALSE>)>
<SET L <PTSIZE .DIR1TBL>>
<COND (<NOT <==? .L <PTSIZE .DIR2TBL>>>
<RFALSE>)>
<DEC L>
<REPEAT ()
<COND (<NOT <==? <GETB .DIR1TBL .L> <GETB .DIR2TBL .L>>>
<RFALSE>)
(<DLESS? L 0>
<RTRUE>)>>>
<ROUTINE DIR-FROM (HERE THERE "AUX" (V <>) P D)
<COND (<DIR-FROM-TEST .HERE .THERE ,P?UP> <RETURN ,P?UP>)
(<DIR-FROM-TEST .HERE .THERE ,P?DOWN> <RETURN ,P?DOWN>)
(<DIR-FROM-TEST .HERE .THERE ,P?IN> <RETURN ,P?IN>)
(<DIR-FROM-TEST .HERE .THERE ,P?OUT> <RETURN ,P?OUT>)>
<SET P 0>
<REPEAT ()
<COND (<L? <SET P <NEXTP .HERE .P>> ,LOW-DIRECTION>
<RETURN .V>)
(<SET D <DIR-FROM-TEST .HERE .THERE .P>>
<COND (<AND <L? .D ,LOW-DIRECTION> <NOT .V>>
<SET V .P>)
(T <RETURN .P>)>)>>>
<ROUTINE DIR-FROM-TEST (HERE THERE P "AUX" L TBL)
<COND (<ZERO? <SET TBL <GETPT .HERE .P>>>
<RFALSE>)>
<SET L <PTSIZE .TBL>>
<COND (<AND <EQUAL? .L ,DEXIT ,UEXIT ,CEXIT>
<==? <GET-REXIT-ROOM .TBL> .THERE>>
<RETURN .P>)>>
"These routines were moved to low addresses in MISC: I-FOLLOW I-ATTENTION."
<ROUTINE I-PLAYER (ARG "AUX" (VAL <>))
<SETG HERE <LOC ,PLAYER>>
<COND (<==? .ARG ,G-REACHED>
<MAKE-ALL-PEOPLE -12 ;"listening to you">
<RTRUE>)
(<==? .ARG ,G-ENROUTE>
%<DEBUG-CODE <COND (<T? ,DBUG> <RFALSE>)>>
<COND (<==? ,OHERE ,HERE>
<RFALSE>)
(<OR <ZERO? <LIT?>>
<EQUAL? ,HERE ,MAZE>
<AND <FSET? <SET VAL ,HERE> ,SECRETBIT>
<NOT <FSET? ,HERE ,SEENBIT>>>
<AND <PROB 50>
<SET VAL
<FIND-FLAG-HERE-NOT ,PERSONBIT ,MUNGBIT ,PLAYER>>>>
<COND ;(<DIR-FROM ,HERE ,OHERE>
<TELL "You have just started walking, when">)
(T
<TELL "But ">
<COND (<FSET? ,HERE ,SURFACEBIT> <TELL "on">)
(T <TELL "in">)>
<TELL THE ,HERE>)>
<COND (<ZERO? .VAL>
<TELL " you get lost in the dark">)
(<FSET? .VAL ,SECRETBIT>
<TELL " you realize that you don't know the way">)
(<EQUAL? .VAL ,GHOST-NEW>
<TELL " the ghost blocks your way">)
(T
<TELL HE .VAL <PICK-ONE-NEW ,PLAYER-OBSTACLES>>)>
<TELL ".|">
<MAKE-ALL-PEOPLE -12 ;"listening to you">
<RFATAL>)
(T <RFALSE>)>)>>
<GLOBAL PLAYER-OBSTACLES
<LTABLE 0
" gets in your way"
" says hello">>
<ROUTINE GOODNIGHT (RM PER "OPTIONAL" (CLOSET <>) "AUX" DR (VAL <>))
<COND (<EQUAL? .RM ,HERE>
<TELL D .PER>
<THIS-IS-IT .PER>
<TELL
" shows you firmly to the door, saying" HE .PER is " going to bed." CR>
<SET VAL ,WINNER>
<SETG WINNER ,PLAYER>
<PUTP .PER ,P?LINE 0> ;"so s/he won't prevent your leaving"
<GOTO <GET-REXIT-ROOM <GETPT ,HERE ,P?OUT>>>
<SETG WINNER .VAL>)
(<AND <EQUAL? .CLOSET ,HERE>
<SET DR <FIND-FLAG-LG .CLOSET ,DOORBIT ,SECRETBIT>>
<NOT <EQUAL? .DR ,SECRET-HYDE-DOOR ,SECRET-IRIS-DOOR>>
<FSET? .DR ,OPENBIT>>
<FCLEAR .DR ,OPENBIT>
<PUT ,FOUND-PASSAGES <GETP .PER ,P?CHARACTER> T>
<SETG LIT <LIT?>>
<TELL D .PER " closes the " D .DR " without noticing you." CR>
<SET VAL T>)>
<FCLEAR .RM ,ONBIT>
<FSET .PER ,MUNGBIT>
<FCLEAR .RM ,OPENBIT>
<FSET .RM ,LOCKED>
<COND (<EQUAL? .PER ,FOLLOWER>
<SETG FOLLOWER 0>)>
<PUTP .PER ,P?LDESC 14 ;"asleep">
.VAL>
<ROUTINE GRAB-ATTENTION (PERSON "OPTIONAL" (OBJ <>) "AUX" N GT ATT)
<COND (<FSET? .PERSON ,MUNGBIT>
<COND (<EQUAL? <GETP .PERSON ,P?LDESC> 14 ;"asleep">
<TOO-BAD-BUT .PERSON "asleep">
<RFALSE>)
(T
<TOO-BAD-BUT .PERSON "out cold">
<RFALSE>)>)
(<AND <==? <GET <SET GT <GET ,GOAL-TABLES
<GETP .PERSON ,P?CHARACTER>>>
,GOAL-FUNCTION>
,X-RETIRES>
<NOT <EQUAL? .PERSON ,GHOST-NEW ,CONFESSED ,CAPTOR>>
<NOT <EQUAL? ,VARIATION <GETP .PERSON ,P?CHARACTER>>>
<OR <ZERO? .OBJ>
<FSET? .OBJ ,PERSONBIT>
<NOT <FSET? .OBJ ,RMUNGBIT>> ;"evidence">>
<TOO-BAD-BUT .PERSON "too sleepy to listen">
<RFALSE>)
(<AND <==? .PERSON ,BUTLER>
<OR <VERB? ASK-FOR>
<T? <GET .GT ,GOAL-S>>>
<NOT <VERB? SORRY TAKE THANKS>>
<NOT <VERB? YES NO>>
<NOT <DOBJ? LUGGAGE DINNER>>>
<BUTLER-SORRY>
<RFALSE>)
(<SET N <ANGRY-REJECT? .PERSON .OBJ>>
<TOO-BAD-BUT .PERSON
<COND (<1? .N> "peeved")
(T "angry")>>
<RFALSE>)>
<COND (<GET .GT ,GOAL-S>
<SET ATT <GET .GT ,ATTENTION-SPAN>>
<PUT .GT ,ATTENTION .ATT>
<COND (<==? .ATT 0>
<PUT .GT ,GOAL-ENABLE 1>
<TOO-BAD-BUT .PERSON <GET ,LDESC-STRINGS 17>
;"preparing to leave">
<RFALSE>)
(T
<PUT .GT ,GOAL-ENABLE 0>)>)>
<SETG QCONTEXT .PERSON>
<COND (<NOT <==? <GETP .PERSON ,P?LDESC> 21 ;"searching">>
<PUTP .PERSON ,P?LDESC 12 ;"listening to you">)>
<RTRUE>>
<ROUTINE ANGRY-REJECT? (PERSON OBJ "AUX" N)
<COND (<==? .PERSON ,GHOST-NEW>
<RFALSE>)
(<0? <SET N <GETP .PERSON ,P?LINE>>>
<RFALSE>)
(<VERB? FORGIVE SORRY TELL ;"JACK,SORRY">
<RFALSE>)
(<AND <VERB? GIVE> <==? ,PRSI .PERSON>>
<RFALSE>)
(<EVIDENCE? .OBJ .PERSON>
<RFALSE>)
(T .N)>>
<ROUTINE WHERE? (PER "OPTIONAL" (X 0) (CAP 0))
<COND (<NOT <IN? .PER ,HERE>>
<COND (<ZERO? .X>
<TELL !\,>
<SET X <CORRIDOR-LOOK .PER>>
;<SET X <COR-DIR ,HERE <LOC .PER> <GETP .PER ,P?CAR>>>)>
<COND (<ZERO? .CAP> <PRINTC 32>)>
<COND (<EQUAL? .X ,P?DOWN>
<COND (<ZERO? .CAP> <TELL !\d>)
(T <TELL !\D>)>
<TELL "ownstairs">)
(<EQUAL? .X ,P?IN>
<COND (<ZERO? .CAP> <TELL "in">) (T <TELL "In">)>
<TELL-HIS-HER-BEDROOM <GETP .PER ,P?CHARACTER>
<LOC .PER>>)
(<EQUAL? .X ,P?OUT>
<COND (<ZERO? .CAP> <TELL !\j>)
(T <TELL !\J>)>
<TELL "ust outside">)
(T
<COND (<ZERO? .CAP> <TELL !\t>)
(T <TELL !\T>)>
<TELL "o the ">
<DIR-PRINT .X>)>
<RTRUE>)>>
<ROUTINE DIR-PRINT (DIR "AUX" (CNT 0) TBL X)
<COND (<NOT .DIR>
<TELL "out of view">
<RTRUE>)>
<SET TBL ,DIR-STRINGS>
<REPEAT ()
<SET X <GET .TBL .CNT>>
<COND (<ZERO? .X>
<TELL "out of view">
<RTRUE>)
(<==? .X .DIR>
;<COND (<NOT <EQUAL? .DIR ,P?UP ,P?DOWN>>
<TELL "the ">)>
<PRINT <GET .TBL <+ .CNT 1>>>
<RTRUE>)>
<SET CNT <+ .CNT 2>>>>
<GLOBAL DIR-STRINGS
<PTABLE P?SOUTH "south" P?NORTH "north"
P?EAST "east" P?WEST "west"
P?UP "upstairs" P?DOWN "downstairs"
P?IN "inner" P?OUT "outer"
P?SE "southeast" P?NW "northwest"
P?SW "southwest" P?NE "northeast"
0>>
<ROUTINE OPP-DIR (DIR "AUX" (CNT 0) X)
<REPEAT ()
<SET X <GET ,DIR-STRINGS .CNT>>
<COND (<ZERO? .X> <RFALSE>)
(<==? .X .DIR>
<COND (<0? <MOD .CNT 4>>
<RETURN <GET ,DIR-STRINGS <+ .CNT 2>>>)
(T
<RETURN <GET ,DIR-STRINGS <- .CNT 2>>>)>)>
<SET CNT <+ .CNT 2>>>>
"Goal tables for the characters, offset by a constant,
which, for a given character, is the P?CHARACTER property of the object."
<GLOBAL GOAL-TABLES
<PTABLE <TABLE <> <> <> 1 <> I-PLAYER 5 0>
<TABLE <> <> <> 1 <> X-WAITS 5 0>
<TABLE <> <> <> 1 <> X-WAITS 5 0>
<TABLE <> <> <> 1 <> X-WAITS 5 0>
<TABLE <> <> <> 1 <> X-WAITS 5 0>
<TABLE <> <> <> 1 <> X-WAITS 5 0>
<TABLE <> <> <> 1 <> X-WAITS 5 0>
<TABLE <> <> <> 1 <> X-WAITS 5 0>
<TABLE <> <> <> 1 <> BUTLER-APPEARS 1 0>
<TABLE <> <> <> 1 <> LOVER-XFER 5 0>
<TABLE <> <> <> 1 <> GHOST-LURKS 5 0>>>
[
"Offsets into GOAL-TABLEs"
<CONSTANT GOAL-F 0> "final goal"
<CONSTANT GOAL-S 1> "station of final goal"
<CONSTANT GOAL-I 2> "intermediate goal (transfer point)"
<CONSTANT GOAL-ENABLE 3> "character can move: 0=no 1=slow 2=fast"
<CONSTANT GOAL-QUEUED 4> "queued goal to go to after interruption"
<CONSTANT GOAL-FUNCTION 5> "routine to apply on arrival"
<CONSTANT ATTENTION-SPAN 6> "how long character will wait when interrupted"
<CONSTANT ATTENTION 7> "used to count down from ATTENTION-SPAN to 0"
]
"Goal-function constants, similar to M-xxx in MAIN"
<CONSTANT G-REACHED 1>
<CONSTANT G-ENROUTE 2>
<CONSTANT G-IMPATIENT 3>
<CONSTANT G-DEBUG 4>
<GLOBAL TOUR-INDEX:NUMBER 0>
<GLOBAL TOUR-PATH
<PTABLE FOYER DRAWING-ROOM GREAT-HALL GALLERY YOUR-ROOM 0>>
<ROUTINE I-TOUR ("OPTIONAL" (GARG <>) "AUX" L)
%<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
<TELL "[I-TOUR:">
<COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
<SET L <GET ,TOUR-PATH ,TOUR-INDEX>>
<COND (<ZERO? .L>
<COND (<EQUAL? ,FOLLOWER ,FRIEND ,LORD>
<SETG FOLLOWER 0>)>
%<DEBUG-CODE <COND (,IDEBUG <TELL "0]" CR>)>>
<RFALSE>)>
<COND (<AND <==? ,HERE ,GREAT-HALL>
<NOT <FSET? ,DOCTOR ,TOUCHBIT>>>
<QUEUE I-TOUR 3>
<MOVE ,DOCTOR ,HERE>
<SET L <DOCTOR-D>>
<SETG TOUR-FORCED <>>
%<DEBUG-CODE <COND (,IDEBUG <TELL N .L "]" CR>)>>
<RETURN .L>)>
<INC TOUR-INDEX>
<SETG AWAITING-REPLY <>>
<MAKE-ALL-PEOPLE 0>
<COND (<AND <NOT <QUEUED? ,I-FOUND-IT>>
<ZERO? ,TOUR-FORCED>>
<CRLF>)>
<SETG FOUND-IT <>>
<QUEUE I-FOUND-IT 0>
<COND (<EQUAL? .L ,GALLERY>
<TELL
"\"You two will have time to chat later,\" says " 'FRIEND ",
\"but you must excuse us now, ">
<COND (<NOT <EQUAL? ,QCONTEXT <> ,FRIEND ,BUTLER>>
<PRINTD ,QCONTEXT>)
(T <PRINTD ,DOCTOR>)>
<TELL ", while I show "FN" up to ">
<COND (<ZERO? ,GENDER-KNOWN> <TELL "the "> <PRINT-COLOR>)
(<FSET? ,PLAYER ,FEMALE> <TELL "her">)
(T <TELL "his">)>
<TELL " bedroom. I'm sure ">
<COND (<ZERO? ,GENDER-KNOWN> <TELL "our guest">)
(<FSET? ,PLAYER ,FEMALE> <TELL "she">)
(T <TELL "he">)>
<TELL " wants to freshen up for dinner!\"" CR>)>
<TELL 'FRIEND " guides you ">
<COND (<EQUAL? .L ,GALLERY>
<PUTP ,LORD ,P?LDESC 13 ;"lounging and chatting">
<PUTP ,DEB ,P?LDESC 13 ;"lounging and chatting">
<PUTP ,OFFICER ,P?LDESC 13 ;"lounging and chatting">
<TELL "up to">)
(T <TELL "into">)>
<TELL THE .L ".||">
<FSET ,FRIEND ,RMUNGBIT> ;"to skip description"
<THIS-IS-IT ,FRIEND>
<MOVE ,FRIEND .L>
<COND (<EQUAL? .L ,GALLERY ,YOUR-ROOM>
<PUTP ,FRIEND ,P?LINE 0>
<TELL "She says, \"">
<COND (<EQUAL? .L ,GALLERY>
<TELL
"I know it's confusing, but the British call this the
'first' floor. We just left the 'ground' floor.\"" CR>)
(T <TELL
"You'll be sleeping in the same room that Queen Victoria
slept in!\"" CR>)>)>
<COND (<NOT <EQUAL? .L ,GALLERY ,YOUR-ROOM>>
<COND (<FSET? ,LORD ,TOUCHBIT>
<FSET ,LORD ,RMUNGBIT> ;"to skip description")>
<MOVE ,LORD .L>
<PUT ,FOLLOW-LOC ,LORD-C .L>)>
<SETG WINNER ,PLAYER>
<GOTO .L T <>>
<COND (<NOT <EQUAL? .L ,YOUR-ROOM>>
<QUEUE I-TOUR 3>)
(T
<COND (<EQUAL? ,FOLLOWER ,FRIEND ,LORD>
<SETG FOLLOWER 0>)>
<COND (<IN? ,BUTLER .L>
<ESTABLISH-GOAL ,FRIEND <LOC ,OFFICER>>
<TAMARA-LEAVES-YOU>)>)>
<SETG TOUR-FORCED <>>
%<DEBUG-CODE <COND (,IDEBUG <TELL "2]" CR>)>>
<RFATAL>>
<ROUTINE I-FRIEND-GREETS ("OPTIONAL" (GARG <>))
%<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
<TELL "[I-FRIEND-GREETS:">
<COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
<TELL "When a door opens in the castle">
<COND (<NOT <FSET? ,FRONT-GATE ,OPENBIT>>
<FSET ,FRONT-GATE ,OPENBIT>
<TELL " and the " 'FRONT-GATE " creaks open">)>
<TELL ", you decide to ">
<COND (<NOT <EQUAL? ,HERE ,COURTYARD>>
<MOVE ,CAR ,COURTYARD>
<TELL "drive through the gate and ">)>
<TELL "get out of the car." CR>
<GOTO ,COURTYARD>
<RTRUE>>
<ROUTINE BUTLER-APPEARS ("OPTIONAL" (GARG <>) "AUX" LL L)
%<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
<TELL "[BUTLER-APPEARS:">
<COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
<COND (<==? .GARG ,G-REACHED>
;<FCLEAR ,BUTLER ,NDESCBIT> ;"in BUTLER-D"
<PUT <GT-O ,BUTLER> ,GOAL-FUNCTION ,BUTLER-FETCHES>
<PUTP ,BUTLER ,P?LDESC 6 ;"walking along">
<COND (<NOT <FSET? ,COURTYARD ,TOUCHBIT>>
<ESTABLISH-GOAL ,BUTLER ,COURTYARD>)
(T
<SET L <LOC ,BUTLER>>
<SET LL <META-LOC ,LUGGAGE>>
<COND (<EQUAL? .LL ,YOUR-ROOM ,YOUR-BATHROOM>
<COND (<EQUAL? ,FOLLOWER ,FRIEND ,LORD>
<SETG FOLLOWER 0>)>
<ESTABLISH-GOAL ,BUTLER <LOC ,BUTLER>> ;"no-op")
(<EQUAL? .LL .L>
<BUTLER-FETCHES ,G-REACHED>)
(T
<ESTABLISH-GOAL ,BUTLER .LL>)>)>
<RFALSE>)>>
<ROUTINE BUTLER-FETCHES ("OPTIONAL" (GARG <>) "AUX" (L <LOC ,BUTLER>) LL GT)
%<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
<TELL "[BUTLER-FETCHES:">
<COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
<SET LL <META-LOC ,LUGGAGE>>
<SET GT <GT-O ,BUTLER>>
<PUTP ,BUTLER ,P?LDESC 6 ;"walking along">
<COND (<EQUAL? .LL ,YOUR-ROOM ,YOUR-BATHROOM>
<COND (<EQUAL? ,FOLLOWER ,FRIEND ,LORD>
<SETG FOLLOWER 0>)>
<PUT .GT ,GOAL-FUNCTION ,BUTLER-CARRIES>
<ESTABLISH-GOAL ,BUTLER <LOC ,BUTLER>> ;"no-op"
<RFALSE>)
(<AND <EQUAL? .L .LL>
<NOT <IN? ,LUGGAGE ,BUTLER>>>
<PUT .GT ,GOAL-FUNCTION ,BUTLER-CARRIES>
<ESTABLISH-GOAL ,BUTLER ,YOUR-ROOM>
<FCLEAR ,LUGGAGE ,OPENBIT>
<MOVE ,LUGGAGE ,BUTLER>
<MOVE ,CAR ,COURTYARD>
<COND (<AND <EQUAL? .L ,HERE>
<NOT <FSET? ,BUTLER ,NDESCBIT>>>
<TELL CHE ,BUTLER " takes " 'LUGGAGE ".|">)>
;<FCLEAR ,BUTLER ,NDESCBIT>
<RFALSE>)
(<==? .GARG ,G-REACHED>
<COND (<FSET? ,COURTYARD ,TOUCHBIT>
<ESTABLISH-GOAL ,BUTLER <META-LOC ,LUGGAGE>>)
(T
<ESTABLISH-GOAL ,BUTLER ,COURTYARD>)>
<RFALSE>)>>
<ROUTINE TAMARA-LEAVES-YOU ()
<TELL
CHE ,FRIEND " turns to leave, saying, \"Here's " 'BUTLER>
<COND (<IN? ,LUGGAGE ,BUTLER>
<TELL " with " D ,LUGGAGE>)>
<TELL ", so I'll leave you to rest or freshen up, ">
<COND (<PRINT-NAME ,FIRST-NAME> <TELL !\.>)>
<TELL
" Dinner's at eight, by the way -- or whenever you hear the gong.\"" CR>>
<ROUTINE BUTLER-CARRIES ("OPTIONAL" (GARG <>) "AUX" (L <LOC ,BUTLER>) (LL <>))
%<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
<TELL "[BUTLER-CARRIES:">
<COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
<COND (<==? .GARG ,G-ENROUTE>
<COND (<EQUAL? .L ,FOYER> <FCLEAR ,FRONT-DOOR ,OPENBIT>)>
<RFALSE>)
(<==? .GARG ,G-REACHED>
<PUT <GT-O ,BUTLER> ,GOAL-ENABLE 0>
<QUEUE I-BUTLER-HINTS 7>
<QUEUE I-BUTLER-COOKS 9>
<PUTP ,BUTLER ,P?LDESC 9 ;"waiting patiently">
<FCLEAR ,BUTLER ,NDESCBIT>
<COND (<IN? ,LUGGAGE ,BUTLER>
<SET LL T>
<MOVE ,LUGGAGE ,BED>)>
<COND (<AND <NOT <QUEUED? ,I-TOUR>>
<NOT <==? ,FRIEND ,FOLLOWER>>>
<ESTABLISH-GOAL ,FRIEND <LOC ,OFFICER>>)>
<COND (<EQUAL? .L ,HERE>
<COND (<AND <IN? ,FRIEND ,HERE>
<NOT <==? ,FRIEND ,FOLLOWER>>>
<TAMARA-LEAVES-YOU>)>
<TELL "The butler enters">
<COND (.LL<TELL " with " D ,LUGGAGE" and lays it on the bed">)>
<SETG QCONTEXT ,BUTLER>
<THIS-IS-IT ,BUTLER>
<FSET ,BUTLER ,TOUCHBIT>
<PUTP ,BUTLER ,P?LDESC 12 ;"listening to you">
<SETG AWAITING-REPLY ,BUTLER-1-R>
<QUEUE I-REPLY ,CLOCKER-RUNNING>
<TELL ".|
\"I regret to say, "TN", that the maid will be unable to unpack for you,
due to the arrangements for the
late Lord Lionel's memorial birthday dinner,\" he apologizes.
\"" <GET ,QUESTIONS ,AWAITING-REPLY> "\"|">
<RFATAL>)>)>>
<GLOBAL BUTLER-HINTS-COUNTER:NUMBER 0>
<ROUTINE I-BUTLER-HINTS ("OPTIONAL" (GARG <>) "AUX" (SAID <>))
%<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
<TELL "[I-BUTLER-HINTS:">
<COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
<COND ;(<FIND-FLAG-HERE ,PERSONBIT ,PLAYER ,BUTLER>
<QUEUE I-BUTLER-HINTS 1>)
(<OR <EQUAL? ,AWAITING-REPLY ,BUTLER-1-R ,BUTLER-2-R>
<EQUAL? ,AWAITING-REPLY ,BUTLER-3-R ,BUTLER-4-R>>
<QUEUE I-BUTLER-HINTS 1>)
(<L? 2 ,BUTLER-HINTS-COUNTER>
<QUEUE I-BUTLER-HINTS 0>
<RFALSE>)
(<AND <EQUAL? ,HERE <LOC ,BUTLER>>
<ZERO? <GETP ,BUTLER ,P?LINE>>>
<SET SAID T>
<PUT <GT-O ,BUTLER> ,ATTENTION 5>
<SETG BUTLER-HINTS-COUNTER <+ ,BUTLER-HINTS-COUNTER 1>>
<QUEUE I-BUTLER-HINTS 2>
<SETG QCONTEXT ,BUTLER>
<THIS-IS-IT ,BUTLER>
<PUTP ,BUTLER ,P?LDESC 12 ;"listening to you">
<COND (<==? 1 ,BUTLER-HINTS-COUNTER>
<SETG AWAITING-REPLY ,BUTLER-2-R>
<QUEUE I-REPLY ,CLOCKER-RUNNING>
<TELL
'BUTLER " coughs diffidently and asks, \""TN"? "
<GET ,QUESTIONS ,AWAITING-REPLY> "\"|">
<SET SAID ,M-FATAL>)
(<==? 2 ,BUTLER-HINTS-COUNTER>
<COND (<NOT <IN? ,MACE ,BUTLER>>
<RFALSE>)>
<SETG AWAITING-REPLY ,BUTLER-3-R>
<QUEUE I-REPLY ,CLOCKER-RUNNING>
<TELL
"|\"" <GET ,QUESTIONS ,AWAITING-REPLY> "\" adds " 'BUTLER ".|">
<SET SAID ,M-FATAL>)
(<==? 3 ,BUTLER-HINTS-COUNTER>
<I-BUTLER-COOKS>
<COND (<NOT <FSET? ,SECRET-YOUR-DOOR ,OPENBIT>>
<TELL "\"Ah, by the way, "TN" -- s">
<BUTLER-MIRROR-STORY>
<TELL "Without explaining further, " 'BUTLER>
<COND (<EQUAL? ,HERE ,YOUR-ROOM>
<PUT ,FOLLOW-LOC ,BUTLER-C ,GALLERY>
<MOVE ,BUTLER ,GALLERY>
<PUTP ,BUTLER ,P?LDESC 6 ;"walking along">
<TELL " abruptly leaves the room." CR>)
(T
<PUTP ,BUTLER ,P?LDESC 20 ;"ignoring you">
<TELL " turns to his work." CR>)>)
(T
<TELL
"\"I hope you have a pleasant stay with us, ">
<COND (<TITLE-NAME> <TELL !\.>)>
<TELL " Dinner is at eight.\"" CR>)>)>)
(<NOT <IN? ,BUTLER ,LOCAL-GLOBALS>>
<QUEUE I-BUTLER-HINTS 1>)
;(<==? 3 ,BUTLER-HINTS-COUNTER>
<QUEUE I-BUTLER-HINTS 0>
;<COND (<QUEUED? ,I-BUTLER-COOKS>
<I-BUTLER-COOKS>)>)>
%<DEBUG-CODE <COND (,IDEBUG <TELL N .SAID !\] CR>)>>
<RETURN .SAID>>
<ROUTINE I-BUTLER-COOKS ("OPTIONAL" (GARG <>) (VAL <>))
%<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
<TELL "[I-BUTLER-COOKS:">
<COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
<COND (<OR <EQUAL? ,AWAITING-REPLY ,BUTLER-1-R ,BUTLER-2-R>
<EQUAL? ,AWAITING-REPLY ,BUTLER-3-R ,BUTLER-4-R>
<AND <NOT <==? 3 ,BUTLER-HINTS-COUNTER>>
<SET VAL <I-BUTLER-HINTS>>>>
<QUEUE I-BUTLER-COOKS ;-HINTS 2>)
(<IN? ,DINNER ,KITCHEN>
<PUTP ,BUTLER ,P?LDESC 17 ;"preparing to leave">
<PUT <GT-O ,BUTLER> ,GOAL-FUNCTION ,BUTLER-COOKS>
<ESTABLISH-GOAL ,BUTLER ,KITCHEN>)
(T <BUTLER-COOKS ,G-REACHED>)>
<RETURN .VAL>>
<ROUTINE BUTLER-COOKS ("OPTIONAL" (GARG <>) "AUX" N)
%<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
<TELL "[BUTLER-COOKS:">
<COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
<COND (<==? .GARG ,G-REACHED>
<PUTP ,BUTLER ,P?LDESC 11 ;"preparing dinner">
<SET N <- %<- ,DINNER-TIME 8> ,PRESENT-TIME>>
<COND (<NOT <G? .N 0>> <SET N 1>)>
<COND (<IN? ,DINNER ,KITCHEN>
<QUEUE I-BUTLER-SERVES .N>)
(T
<PUT <GT-O ,BUTLER> ,GOAL-FUNCTION ,BUTLER-LEAVES>
<PUTP ,BUTLER ,P?LDESC 17 ;"preparing to leave">
<ESTABLISH-GOAL ,BUTLER ,KITCHEN>)>
%<DEBUG-CODE <COND (,IDEBUG <TELL "0]" CR>)>>
<RFALSE>)>>
<ROUTINE I-BUTLER-SERVES ("OPTIONAL" (GARG <>))
%<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
<TELL "[I-BUTLER-SERVES:">
<COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
<MOVE ,DINNER ,BUTLER>
<PUTP ,BUTLER ,P?LDESC 17 ;"preparing to leave">
<PUT <GT-O ,BUTLER> ,GOAL-FUNCTION ,BUTLER-SERVES>
<ESTABLISH-GOAL ,BUTLER ,DINING-ROOM>
<COND (<IN? ,BUTLER ,HERE>
<TELL 'BUTLER " takes dinner." CR>)>>
<ROUTINE BUTLER-SERVES ("OPTIONAL" (GARG <>))
%<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
<TELL "[BUTLER-SERVES:">
<COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
<COND (<==? .GARG ,G-REACHED>
<COND (<EQUAL? ,HERE ,DINING-ROOM>
<TELL CHE ,BUTLER " appears">)>
<COND (<IN? ,DINNER ,BUTLER>
<COND (<EQUAL? ,HERE ,DINING-ROOM>
<TELL ", puts dinner on the " 'SIDEBOARD>)>
<MOVE ,DINNER ,SIDEBOARD>)>
<COND (<IN? ,LETTER ,BUTLER>
<COND (<EQUAL? ,HERE ,DINING-ROOM>
<FCLEAR ,LETTER ,NDESCBIT>
<TELL ", leaves a note on Jack's napkin">)>
<MOVE ,LETTER ,TABLE-DINING>
<FSET ,LETTER ,TAKEBIT>)>
;<COND (<IN? ,CLUE-1 ,BUTLER>
<COND (<EQUAL? ,HERE ,DINING-ROOM>
<FCLEAR ,CLUE-1 ,NDESCBIT>
<TELL ", puts a card on the " 'SIDEBOARD>)>
<MOVE ,CLUE-1 ,SIDEBOARD>)>
<FSET ,CLUE-1 ,TAKEBIT>
<PUTP ,BUTLER ,P?LDESC 17 ;"preparing to leave">
<PUT <GT-O ,BUTLER> ,GOAL-FUNCTION ,BUTLER-LEAVES>
<ESTABLISH-GOAL ,BUTLER ,KITCHEN>
<COND (<EQUAL? ,HERE ,DINING-ROOM>
<TELL ", and looks around the room." CR>)>)>>
<ROUTINE X-WAITS ("OPTIONAL" (GARG <>))
%<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
<TELL "[X-WAITS:">
<COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
<COND (<==? .GARG ,G-REACHED>
<PUTP ,GOAL-PERSON ,P?LDESC 9 ;"waiting patiently">
<RFALSE>)>>
<GLOBAL MASS-SAID:FLAG 0>
<GLOBAL MASS-COUNTER:NUMBER 0>
<ROUTINE I-DINNER ("OPTIONAL" (GARG <>) "AUX" N CH (SAID <>))
%<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
<TELL "[I-DINNER:">
<COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
<SET N ,MASS-COUNTER>
<REPEAT ()
<COND (<IGRTR? N ,DEB-C>
<SETG MASS-SAID <>>
<SETG MASS-COUNTER 0>
<COND (<NOT <QUEUED? ,I-DINNER-SIT>>
<QUEUE I-DINNER-SIT 5>)>
<RFALSE>)
(<AND <==? .N ,FRIEND-C>
<QUEUED? ,I-TOUR>>
<QUEUE I-TOUR 1>
<RFALSE>)>
<SET CH <GET ,CHARACTER-TABLE .N>>
<COND (<==? .CH ,FOLLOWER>
<SETG FOLLOWER 0>)>
<COND (<AND <NOT <==? .CH ,SHOOTER>>
<NOT <FSET? .CH ,MUNGBIT>>
<NOT <IN? .CH ,DINING-ROOM>>>
<RETURN>)>>
<QUEUE I-DINNER 1>
<SETG MASS-COUNTER .N>
<PUT <GET ,GOAL-TABLES .N> ,GOAL-FUNCTION ,X-WAITS>
<ESTABLISH-GOAL .CH ,DINING-ROOM>
<COND (<AND <EQUAL? <META-LOC .CH> ,HERE>
<NOT <EQUAL? ,HERE ,DINING-ROOM>>
<OR <ZERO? ,MASS-SAID>
<==? .CH ,FOLLOWER>>>
<SET SAID T>
<SETG MASS-SAID T>
<COND (<==? .CH ,FOLLOWER>
<SETG FOLLOWER 0>)>
<TELL CHE .CH " says, \"It's time for dinner now. ">
<COND (<OR <NOT <EQUAL? ,NOW-WEARING ,DINNER-OUTFIT>>
<ZERO? ,WASHED>>
<TELL "I'll see you in">)
(T <TELL "Let's go to">)>
<TELL " the " 'DINING-ROOM ".\"" CR>)>
%<DEBUG-CODE <COND (,IDEBUG <TELL N .SAID "]|">)>>
<RETURN .SAID>>
<GLOBAL BUTLER-RANG-BELL?:FLAG <>>
<GLOBAL PLAYER-RANG-BELL?:FLAG <>>
<ROUTINE BUTLER-RINGS-BELL? ("OPT" (FAKE <>) "AUX" P)
<COND (<OR <T? .FAKE>
<ZERO? ,BUTLER-RANG-BELL?>>
<SETG BUTLER-RANG-BELL? T>
<QUEUE I-DINNER 1> ;"in case someone's delayed"
<FSET ,CLUE-1 ,TAKEBIT>
<COND (<AND <ZERO? .FAKE>
<EQUAL? ,HERE ,KITCHEN>>
<TELL 'BUTLER>
<COND (<NOT <==? ,HERE <GET ,FOLLOW-LOC ,BUTLER-C>>>
<TELL " appears and">)>
<TELL " pushes a hidden button. ">)>
<TELL "Suddenly, the dinner bell sounds">
;<COND (<FIRST? ,BELL>
<TELL ", but it doesn't ring true">
<COND (<SET P <FIND-FLAG-HERE-NOT ,PERSONBIT
,MUNGBIT ,PLAYER>>
<TELL
". \"That's a bit odd,\" " D .P " comments">)>)>
<TELL "." CR>)>>
<ROUTINE BUTLER-LEAVES ("OPTIONAL" (GARG <>) "AUX" L (VAL <>))
%<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
<TELL "[BUTLER-LEAVES:">
<COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
<COND (<==? .GARG ,G-REACHED>
<SET VAL <BUTLER-RINGS-BELL?>>
<MOVE ,BUTLER ,LOCAL-GLOBALS>
<PUT ,FOLLOW-LOC ,BUTLER-C 0>
<COND (<EQUAL? ,HERE ,DINING-ROOM>
<QUEUE I-DINNER-SIT 1>)
(<EQUAL? ,HERE ,KITCHEN>
<TELL "Then he ">
<COND (<IN? ,MACE ,BUTLER>
<TELL "drops " A ,MACE ", ">)>
<TELL
"bids you good night, ducks into the areaway, locks the door
behind him, and leaves the castle." CR>
<SET VAL ,M-FATAL>)>
<COND (<IN? ,MACE ,BUTLER>
<FCLEAR ,MACE ,NDESCBIT>
<MOVE ,MACE ,KITCHEN>)>
.VAL)>>
<GLOBAL DINNER-SIT-COUNTER:NUMBER 0>
<GLOBAL DINNER-SAT:FLAG <>>
<ROUTINE I-DINNER-SIT ("OPTIONAL" (GARG <>) "AUX" (SAID <>))
%<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
<TELL "[I-DINNER-SIT:">
<COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
<COND (<T? ,DINNER-SAT>
<RFALSE>)
(<OR <FSET? ,DINNER ,TAKEBIT>
<L? 1 <- ,DINNER-FOR <POPULATION ,DINING-ROOM ,PLAYER>>>>
<COND (<L? ,DINNER-SIT-COUNTER 20>
<SETG DINNER-SIT-COUNTER <+ 1 ,DINNER-SIT-COUNTER>>
<COND (<AND <ZERO? <MOD ,DINNER-SIT-COUNTER 8>>
<NOT <EQUAL? ,HERE ,KITCHEN>>>
<BUTLER-RINGS-BELL? T>
<RTRUE>)>)>
<QUEUE I-DINNER-SIT 1>
<RFALSE>)>
<SETG DINNER-SAT T>
;<QUEUE I-DINNER-SIT 0>
<QUEUE I-LIONEL-SPEAKS <- ,LIONEL-TIME ,PRESENT-TIME>>
<MAKE-ALL-PEOPLE 10 ;"eating with relish" ,DINING-ROOM>
<FSET ,DINNER ,TAKEBIT>
<FCLEAR ,DINNER ,TRYTAKEBIT>
<MOVE ,DINNER-2 ,TABLE-DINING>
;<MOVE ,DINNER-3 ,TABLE-DINING>
<BUTLER-RINGS-BELL?>
<COND (<EQUAL? ,DINING-ROOM ,HERE>
<SET SAID ,M-FATAL>
<MOVE ,DINNER ,TABLE-DINING>
<TELL 'DEB " playfully suggests">
<COND (<==? ,VARIATION ,FRIEND-C>
<THIS-IS-IT ,LORD>
<TELL " to " 'LORD>)>
<TELL
" that everyone form a self-serve food line at the buffet.
" CHE ,LORD " and the others good-naturedly accept her suggestion." CR>
<COND (<IN? ,LETTER ,TABLE-DINING>
<TELL
"As " 'LORD " takes his place as host,
he notices a note lying on his napkin. He picks it up and reads it
with a troubled expression." CR>
;<THIS-IS-IT ,LORD>)>
<DINNER-TALK 28>)
(T <SETG MISSED-DINNER T>)>
<COND (<IN? ,LETTER ,TABLE-DINING>
<MOVE ,LETTER ,LORD>
<FCLEAR ,LETTER ,NDESCBIT>)>
%<DEBUG-CODE <COND (,IDEBUG <TELL N .SAID !\] CR>)>>
<RETURN .SAID>>
<GLOBAL MISSED-DINNER:FLAG <>>
<CONSTANT INIT-LIONEL-SPEAKS-COUNTER 6>
<GLOBAL LIONEL-SPEAKS-COUNTER:NUMBER 6>
<GLOBAL LIONEL-FORCED:FLAG <>>
<GLOBAL LIONELS-VOICE "Lionel's voice">
<ROUTINE I-LIONEL-SPEAKS ("OPTIONAL" (GARG <>) "AUX" (SAID <>) P)
%<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
<TELL "[I-LIONEL-SPEAKS:">
<COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
<SETG LIONEL-SPEAKS-COUNTER <- ,LIONEL-SPEAKS-COUNTER 1>>
<COND (<NOT <ZERO? ,LIONEL-SPEAKS-COUNTER>>
<QUEUE I-LIONEL-SPEAKS 2>)
(T
<QUEUE I-WITHDRAW 9>)>
<SET P ,SEARCHER>
<COND (<AND <T? .P>
<OR <NOT <IN? .P ,DINING-ROOM>>
<NOT <IN? ,CLUE-1 ,SIDEBOARD>>
<FSET? ,CLUE-1 ,TOUCHBIT>>>
<SET P <>>)>
<COND (<==? 5 ,LIONEL-SPEAKS-COUNTER>
<MOVE ,VOICE ,DINING-ROOM>
<MAKE-ALL-PEOPLE 16 ;"listening" ,DINING-ROOM>)
(<==? 1 ,LIONEL-SPEAKS-COUNTER>
<FCLEAR ,CLUE-2 ,NDESCBIT>
<FCLEAR ,CLUE-2 ,SECRETBIT>
<FCLEAR ,CLUE-1 ,SECRETBIT>)
(<==? 0 ,LIONEL-SPEAKS-COUNTER>
<COND (<T? .P>
<FSET ,CLUE-1 ,TAKEBIT>
<FCLEAR ,CLUE-1 ,NDESCBIT>
<MOVE ,CLUE-1 .P>)>
<MOVE ,VOICE ,LOCAL-GLOBALS>
<MAKE-ALL-PEOPLE 18 ;"deep in thought" ,DINING-ROOM>)>
<COND (<EQUAL? ,DINING-ROOM ,HERE>
<SET SAID ,M-FATAL>
<COND (<T? ,LIONEL-FORCED>
<SETG LIONEL-FORCED <>>)
(T <CRLF>)>
<COND (<==? 5 ,LIONEL-SPEAKS-COUNTER>
<THIS-IS-IT ,BUST>
<FSET ,BUST ,OPENBIT>
<TELL
D ,LORD " and his guests are startled as an unexpected voice suddenly speaks!|
\"Good evening, all,\" it says, then breaks into a low chuckle.|
\"Good Lord!\" Jack gasps. \"That's Uncle " ,LIONELS-VOICE "!\"|
" D ,DOCTOR " points to" THE ,BUST ". \"There's where it's coming
from!\"" CR>)
(<==? 4 ,LIONEL-SPEAKS-COUNTER>
<TELL
,LIONELS-VOICE " continues, \"You are all here, I trust, to honor the wish
expressed in my will -- that the seven of you should dine together
at " D ,CASTLE " on the evening of my birthday.\"" CR>)
(<==? 3 ,LIONEL-SPEAKS-COUNTER>
<THIS-IS-IT ,ARTIFACT>
<THIS-IS-IT ,LORD>
<TELL
,LIONELS-VOICE " continues, \"As you know, I enjoyed adventuring to
remote corners of the world. And doubtless you've all heard of the loss of that
valuable artifact, which I brought back from one of my
expeditions, have you not?\"|
The guests nod or mumble vaguely. They all glance toward Jack,
as if looking for an official response." CR>)
(<==? 2 ,LIONEL-SPEAKS-COUNTER>
<TELL ,LIONELS-VOICE " goes on, ">
<COND (<==? ,LORD-C ,VARIATION>
<THIS-IS-IT ,LORD>
<TELL
"\"Jack, I'm sure, is only too eager for me to shuffle off this mortal coil
so he can inherit the family title and estate. Thus he should be
particularly interested in what I'm about to say...\" Once again
" ,LIONELS-VOICE " chuckles slyly, then continues." CR>)>
<THIS-IS-IT ,PUNCHBOWL>
<TELL
"\"The truth is that the artifact is not lost, but hidden.
Although I am not yet ready to reveal what it is,
I suggest you look under the " 'PUNCHBOWL ".\"" CR>)
(<==? 1 ,LIONEL-SPEAKS-COUNTER>
<THIS-IS-IT ,CLUE-2>
<TELL
"\"This " 'CLUE-1 " is merely to sharpen your wits,\"
" ,LIONELS-VOICE " goes on.|
\"" 'LOVER ", my dear: your one goal in life, I believe, is to become
Jack's wife, heaven knows why! Not being Cupid, there is little I can do
to help. Knowing the others, I suspect each one has private reasons for
wanting my " 'ARTIFACT ". So, for your amusement, I have given a
" 'CLUE-2 " to my ">
<COND (<EQUAL? ,VARIATION ,LORD-C>
<TELL "dear friend">)
(T <TELL "heir">)>
<TELL
", which may start you down the path to finding it.\"|
With another sardonic chuckle, " ,LIONELS-VOICE " adds, \"Perhaps, ">
<COND (<EQUAL? ,VARIATION ,LORD-C>
<THIS-IS-IT ,PAINTER>
<TELL 'PAINTER>)
(T
<THIS-IS-IT ,LORD>
<TELL 'LORD>)>
<TELL ", you would
care to SHARE your clue with all the others -- eh, what?\"" CR>)
(<==? 0 ,LIONEL-SPEAKS-COUNTER>
<TELL
,LIONELS-VOICE " finishes, \"So now, my friends, let the game begin!\"" CR>
<COND (<T? .P>
<TELL
D .P " says, \"Well, I for one want to see that " 'CLUE-1 ".\" ">
<THIS-IS-IT .P>
<TELL
CHE .P " lifts the " 'PUNCHBOWL " and takes it." CR>)>)>)>
%<DEBUG-CODE <COND (,IDEBUG <TELL N .SAID !\] CR>)>>
<RETURN .SAID>>
<ROUTINE MAKE-ALL-PEOPLE (NUM "OPTIONAL" (RM 0) "AUX" P NNUM)
<COND (<ZERO? .RM>
<SET RM ,HERE>)>
<COND (<L? .NUM 0>
<SET NNUM <- 0 .NUM>>)>
<SET P <FIRST? .RM>>
<REPEAT ()
<COND (<ZERO? .P>
<RETURN>)
(<FSET? .P ,PERSONBIT>
<COND (<G? .NUM 0>
<PUTP .P ,P?LDESC .NUM>)
(<==? .NNUM <GETP .P ,P?LDESC>>
<PUTP .P ,P?LDESC 0>)>)>
<SET P <NEXT? .P>>>>
<ROUTINE I-WITHDRAW ("OPTIONAL" (GARG <>) "AUX" OBJ NXT (SAID <>))
%<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
<TELL "[I-WITHDRAW:">
<COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
<COND (<ZERO? ,TREASURE-FOUND>
<QUEUE I-SEARCH 9>
<PUT <GT-O ,SEARCHER> ,GOAL-FUNCTION ,X-SEARCHES>)>
<QUEUE I-BEDTIME <- ,BED-TIME ,PRESENT-TIME>>
<COND (<EQUAL? ,HERE ,DINING-ROOM ,CORR-1 ,SITTING-ROOM>
<SETG P-HIM-OBJECT <>>
<SETG P-HER-OBJECT <>>
<SET SAID T>
<TELL "|
Normally the gentlemen would remain at the table to enjoy
cigars and port, while the ladies repair to the " 'DRAWING-ROOM ". But because
of tonight's mysterious developments, everyone ">
<COND (<EQUAL? ,HERE ,DINING-ROOM>
<TELL "leaves the " 'DINING-ROOM>)
(T
<TELL "goes to the " 'SITTING-ROOM>)>
<TELL " by unspoken agreement." CR>)
(<OR <EQUAL? ,HERE ,JACK-ROOM ,TAMARA-ROOM ,IRIS-ROOM>
<EQUAL? ,HERE ,WENDISH-ROOM ,VIVIEN-ROOM ,IAN-ROOM>
<EQUAL? ,HERE ,HYDE-ROOM>>
<COND (<NOT <EQUAL? <LOC <GET ,CHARACTER-TABLE
<- <ZMEMQ ,HERE ,CHAR-ROOM-TABLE> 1>>>
,HERE ,LOCAL-GLOBALS>>
<SETG DISCOVERED-HERE ,HERE>
<QUEUE I-DISCOVERED 1>)>)>
<COND (<FSET? <LOC ,DINNER > ,PERSONBIT>
<MOVE ,DINNER ,TABLE-DINING>)>
<COND (<FSET? <LOC ,DINNER-2> ,PERSONBIT>
<MOVE ,DINNER-2 ,TABLE-DINING>)>
;<COND (<FSET? <LOC ,DINNER-3> ,PERSONBIT>
<MOVE ,DINNER-3 ,TABLE-DINING>)>
<SET OBJ <FIRST? ,DINING-ROOM>>
<SET NXT <NEXT? .OBJ>>
<REPEAT ()
<COND (<ZERO? .NXT>
<RETURN>)
(<FSET? .OBJ ,PERSONBIT>
<COND (<NOT <EQUAL? .OBJ ,PLAYER ,CONFESSED ,CAPTOR>>
<PUTP .OBJ ,P?LDESC 18 ;"deep in thought">
<PUT ,FOLLOW-LOC <GETP .OBJ ,P?CHARACTER>
,SITTING-ROOM>
<MOVE .OBJ ,SITTING-ROOM>)>)>
<SET OBJ .NXT>
<SET NXT <NEXT? .OBJ>>>
<COND (<EQUAL? ,HERE ,DINING-ROOM>
<SETG WINNER ,PLAYER>
<GOTO ,SITTING-ROOM ;,CORR-1>)>
%<DEBUG-CODE <COND (,IDEBUG <TELL N .SAID !\] CR>)>>
<RETURN .SAID>>
<GLOBAL SEARCHER:OBJECT 0>
<GLOBAL CLUE-LOC:OBJECT 0>
<GLOBAL SEARCH-ROOMS
<PLTABLE
OLD-GREAT-HALL BASEMENT ;DUNGEON STUDY LIBRARY OFFICE
LUMBER-ROOM CHAPEL GAME-ROOM DECK COURTYARD MAZE GARDEN GALLERY
FOYER DRAWING-ROOM GREAT-HALL SITTING-ROOM DINING-ROOM KITCHEN>>
<ROUTINE I-SEARCH ("OPTIONAL" (GARG <>)
"AUX" (SAID <>) GT L (X 0))
%<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
<TELL "[I-SEARCH:">
<COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
<SET L <LOC ,SEARCHER>>
<COND (<OR <==? .L ,DISCOVERED-HERE>
<QUEUED? ,I-LIONEL-SPEAKS>>
<QUEUE I-SEARCH 3>
%<DEBUG-CODE <COND (,IDEBUG <TELL N .SAID !\] CR>)>>
<RFALSE>)>
<QUEUE I-SEARCH 19>
<SET X <GET ,CHARACTER-TABLE <+ 1 <RANDOM 6>>>>
<COND (<AND <IN? .X ,SITTING-ROOM>
<NOT <EQUAL? .X ,FOLLOWER ,CONFESSED ,CAPTOR>>
<NOT <==? <GETP .X ,P?LDESC> 22>>>
<PUTP .X ,P?LDESC 22 ;"playing the piano">
<COND (<==? ,HERE ,SITTING-ROOM>
<SET SAID T>
<THIS-IS-IT .X>
<TELL D .X " begins " <GET ,LDESC-STRINGS 22> ".">)>
<SET X <NEXT? .X>>
<COND (<AND <T? .X>
<FSET? .X ,PERSONBIT>
<NOT <==? .X ,PLAYER>>>
<COND (<AND <T? .SAID>
<==? <GETP .X ,P?LDESC>
22 ;"playing the piano">>
<THIS-IS-IT .X>
<TELL " And " D .X " stops.">)>
<PUTP .X ,P?LDESC 13 ;"lounging and chatting">)>
<COND (<T? .SAID> <CRLF>)>)>
<SET X ,DEB-C>
<REPEAT ()
<SET GT <GET ,CHARACTER-TABLE .X>>
<COND (<AND <NOT <EQUAL? .GT ,FOLLOWER>>
<NOT <EQUAL? <META-LOC .GT> ,HERE ,SITTING-ROOM>>
<NOT <IN-MOTION? .GT>>
<NOT <==? <GETP .GT ,P?LDESC>7;"sobbing quietly">>
<NOT <EQUAL? <GET <GET ,GOAL-TABLES .X>
,GOAL-FUNCTION>
,X-RETIRES ,X-SEARCHES>>>
<PUT <GET ,GOAL-TABLES .X> ,GOAL-FUNCTION ,NULL-F>
<ESTABLISH-GOAL .GT ,SITTING-ROOM>)>
<COND (<DLESS? X 1> <RETURN>)>>
<COND (<T? ,CONFESSED>
%<DEBUG-CODE <COND (,IDEBUG <TELL N .SAID !\] CR>)>>
<RFALSE>)>
<SET GT <GT-O ,SEARCHER>>
<COND (<EQUAL? <GET .GT ,GOAL-FUNCTION> ,X-SEARCHES>
<REPEAT ()
<COND (<AND <SET X ,CLUE-LOC>
<ZMEMQ .X ,SEARCH-ROOMS>>
<SETG CLUE-LOC 0>)
(T <SET X <PICK-ONE ,SEARCH-ROOMS>>)>
<COND (<NOT <==? .X .L>>
<RETURN>)>>
<ESTABLISH-GOAL ,SEARCHER .X>
<COND (<EQUAL? ,HERE .L>
<SET SAID T>
<TELL "|
Suddenly" HE ,SEARCHER " heads for the ">
<COND (<EQUAL? ,HERE ,MAZE ,GARDEN>
<TELL "exit">)
(T <TELL "door">)>
<TELL ", mumbling, \"Please excuse me.\"" CR>)>)>
%<DEBUG-CODE <COND (,IDEBUG <TELL N .SAID !\] CR>)>>
<RETURN .SAID>>
<ROUTINE X-SEARCHES ("OPTIONAL" (GARG <>) "AUX" (VAL <>))
%<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
<TELL "[X-SEARCHES:">
<COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
<COND (<==? .GARG ,G-REACHED>
<PUTP ,GOAL-PERSON ,P?LDESC 21 ;"searching">)>
%<DEBUG-CODE <COND (,IDEBUG <TELL N .VAL !\] CR>)>>
<RETURN .VAL>>
<ROUTINE I-DISCOVERED ("OPTIONAL" (GARG <>) "AUX" (VAL <>) L GT)
%<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
<TELL "[I-DISCOVERED:">
<COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
<COND (<AND <EQUAL? ,DISCOVERED-HERE ,HERE>
<OR ;<ZERO? ,BUTLER-RANG-BELL?> ;"before dinner"
<ZERO? ,LIONEL-SPEAKS-COUNTER> ;"after dinner">>
<SET L <- <ZMEMQ ,HERE ,CHAR-ROOM-TABLE> 1>>
<SET VAL <GET ,CHARACTER-TABLE .L>>
<COND (<ZERO? .GARG>
<COND (<IN? .VAL ,HERE>
<RFALSE>)
(<FSET? .VAL ,MUNGBIT>
<RFALSE>)
(<EQUAL? .VAL ,CONFESSED>
<RFALSE>)
(<EQUAL? <GET <GT-O .VAL> ,GOAL-FUNCTION> ,X-RETIRES>
<RFALSE>)>)>
<PUT ,FOLLOW-LOC .L ,HERE>
<QUEUE I-FOUND-IT 0>
<COND (<EQUAL? .VAL ,GHOST-NEW>
<MOVE ,GHOST-NEW ,HERE>
<GHOST-LURKS>
<RFATAL>)>
<TELL "You freeze as">
<COND (T ;<NOT <EQUAL? .VAL ,GHOST-NEW>>
<COND (<FSET? ,HERE ,LOCKED>
<FCLEAR ,HERE ,LOCKED>
<TELL " a key turns in the lock,">)>
<TELL " the door bursts open and">)>
<FCLEAR ,HERE ,OPENBIT>
<PUTP .VAL ,P?LINE <+ 1 <GETP .VAL ,P?LINE>>>
<PUTP .VAL ,P?LDESC 4 ;"looking at you with suspicion">
<TELL HE .VAL " appears. ">
<TELL CHE .VAL " stares at you with a shocked look. ">
<COND ;(<EQUAL? ,HERE ,WENDISH-ROOM>
<TELL
"\"May I ask what you are doing here?\" he inquires gently.">)
;(<EQUAL? ,HERE ,HYDE-ROOM>
<TELL
"\"To what do I owe the honor of this... shall we say, uninvited
visit?\" he inquires with a sarcastic smile.">)
;(<EQUAL? ,HERE ,IAN-ROOM>
<TELL
"Then a mocking smile quirks the handsome young guardsman's lips.
\"Here now, what's all this then?\" he murmurs.">)
(T <TELL
"\"Well! I didn't expect MY room to be searched!\"" HE .VAL" says
angrily. ">)>
<SET L <LOC .VAL>>
<MOVE .VAL ,HERE>
<SET GT <GT-O .VAL>>
<COND (<ZERO? <GET .GT ,GOAL-S>>
<ESTABLISH-GOAL .VAL .L>)
(T
<ESTABLISH-GOAL .VAL <GET .GT ,GOAL-F>>)>
<PUT .GT ,GOAL-ENABLE 0>
<TELL
CHE .VAL " enters the room and closes the door behind" HIM .VAL ".|">
<COND (<AND <IN? ,BLOWGUN .VAL>
<EQUAL? .VAL ,PAINTER ,DOCTOR>
<NOT <FIND-FLAG-HERE ,PERSONBIT ,PLAYER .VAL>>>
<SETUP-SHOT .VAL>
<TELL "Then" HE .VAL " pulls out" THE ,BLOWGUN "!" CR>)>
<SET VAL ,M-FATAL>)>
%<DEBUG-CODE <COND (,IDEBUG <TELL N .VAL !\] CR>)>>
.VAL>
<ROUTINE I-FOUND-PASSAGES ("OPTIONAL" (GARG <>) "AUX" (SAID <>) X)
%<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
<TELL "[I-FOUND-PASSAGES:">
<COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
<SET X <FIRST? ,HERE>>
<COND (<T? .X>
<SET SAID <FOUND-PASSAGES-REPEAT .X ,PASSAGE ,FOUND-PASSAGES>>)>
<COND (<AND <FSET? ,HERE ,SECRETBIT>
<SET X <FIND-FLAG-LG ,HERE ,DOORBIT>>
<SET X <DOOR-ROOM ,HERE .X>>>
<SET X <FIRST? .X>>
<COND (<AND <T? .X>
<FOUND-PASSAGES-REPEAT .X ,PASSAGE ,FOUND-PASSAGES>>
<SET SAID T>)>)>
%<DEBUG-CODE <COND (,IDEBUG <TELL N .SAID !\] CR>)>>
<RETURN .SAID>>
<ROUTINE FOUND-PASSAGES-REPEAT (PER OBJ GL "AUX" C (SAID <>))
<REPEAT ()
<COND (<ZERO? .PER> <RETURN>)>
<COND (<AND <FSET? .PER ,PERSONBIT>
<NOT <FSET? .PER ,MUNGBIT>>>
<PUTP .PER ,P?LDESC 3 ;"watching you">
<SET C <GETP .PER ,P?CHARACTER>>
<COND (<ZERO? <GET .GL .C>>
<PUT .GL .C T>
<COND (<NOT <==? .C ,VARIATION>>
<PUTP .PER ,P?LINE 0>
<COND (<ZERO? .SAID>
<SET SAID .PER>
<COND (<==? .OBJ ,PASSAGE>
<GOOD-SHOW .PER .OBJ>)>)>)>)>)>
<SET PER <NEXT? .PER>>>
.SAID>
<ROUTINE I-BEDTIME ("OPTIONAL" (GARG <>) "AUX" N CH (VAL <>) L)
%<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
<TELL "[I-BEDTIME:">
<COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
<SET N ,MASS-COUNTER>
<COND (<IGRTR? N ,DEB-C>
<SETG MASS-SAID <>>
<SETG MASS-COUNTER 0>
%<DEBUG-CODE <COND (,IDEBUG <TELL N .VAL !\] CR>)>>
<RFALSE>)>
<QUEUE I-BEDTIME 5>
<SETG MASS-COUNTER .N>
<SET CH <GET ,CHARACTER-TABLE .N>>
<COND (<EQUAL? .CH ,SEARCHER>
<QUEUE I-SEARCH 0>)>
<COND (<==? .CH ,CONFESSED ,CAPTOR>
%<DEBUG-CODE <COND (,IDEBUG <TELL N .VAL !\] CR>)>>
<RFALSE>)
(<FSET? .CH ,MUNGBIT>
%<DEBUG-CODE <COND (,IDEBUG <TELL N .VAL !\] CR>)>>
<RFALSE>)>
<PUT <GET ,GOAL-TABLES .N> ,GOAL-FUNCTION ,X-RETIRES>
<ESTABLISH-GOAL .CH <GET ,CHAR-ROOM-TABLE <+ 1 .N>>>
<SET L <META-LOC .CH>>
<COND (<AND <NOT <OUTSIDE? .L>>
<ZERO? <FIND-FLAG .L ,PERSONBIT .CH>>>
<FCLEAR .L ,ONBIT>)>
<COND (<AND <EQUAL? .L ,HERE>
<OR <ZERO? ,MASS-SAID>
<==? .CH ,FOLLOWER>>>
<SETG MASS-SAID T>
<SET VAL T>
<PUTP .CH ,P?LDESC 17 ;"preparing to leave">
<TELL
D .CH " says, \"It's time for bed now.
I'll see you in the morning.\"" CR>)>
<COND (<==? .CH ,FOLLOWER>
<SETG FOLLOWER 0>)>
%<DEBUG-CODE <COND (,IDEBUG <TELL N .VAL "]|">)>>
<RETURN .VAL>>
<GLOBAL FRIEND-FOUND-PASSAGES <>>
<ROUTINE FRIEND-PASSAGE-STORY ()
<TELL "\"Guess what? I just
discovered a " 'PASSAGE " in my room! But it's so late that I'm going
to bed now. We'll explore in the morning.\"" CR>>
<ROUTINE X-RETIRES ("OPTIONAL" (GARG <>)
"AUX" (L <LOC ,GOAL-PERSON>) RM C (VAL <>) OBJ GT)
%<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
<TELL "[X-RETIRES:">
<COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
<COND (<EQUAL? ,GOAL-PERSON ,CONFESSED ,CAPTOR>
<RFALSE>)
(<==? .GARG ,G-IMPATIENT>
<COND (<EQUAL? .L ,HERE>
<SET VAL T>
<TELL
CHE ,GOAL-PERSON " says, \"I'm dead tired. Good night.\"" CR>)>)
(<==? .GARG ,G-REACHED>
<SET C <GETP ,GOAL-PERSON ,P?CHARACTER>>
<SET RM <GET ,CHAR-ROOM-TABLE <+ 1 .C>>>
<SET GT <GET ,GOAL-TABLES .C>>
<COND (<NOT <==? .L .RM>> ;"unmasked ghost is quitting"
<COND (<NOT <FSET? .L ,SECRETBIT>> ;"or you entered a bedroom"
<ESTABLISH-GOAL ,GOAL-PERSON .RM>
<RFALSE>)>
<SET OBJ <FIND-FLAG-LG .L ,DOORBIT>>
<COND (<T? .OBJ>
<FSET .OBJ ,OPENBIT>)>
<SET VAL <MOVE-PERSON ,GOAL-PERSON .RM>>
<COND (<T? .OBJ>
<FCLEAR .OBJ ,OPENBIT>)>)>
;<COND (<AND <QUEUED? ,I-DISCOVERED>
<EQUAL? ,DISCOVERED-HERE ,HERE>
<EQUAL? ,DISCOVERED-HERE .RM>>
<QUEUE I-DISCOVERED 0>
<RETURN <I-DISCOVERED ,G-REACHED>>)>
<SET OBJ <FIND-FLAG .RM ,SURFACEBIT>>
<COND (<T? .OBJ>
<ROB ,GOAL-PERSON .OBJ>)
(T <ROB ,GOAL-PERSON .RM>)>
<FCLEAR .RM ,OPENBIT>
<FSET .RM ,LOCKED>
<COND (<EQUAL? ,VARIATION ,LORD-C>
<SET RM ,LIMBO>)>
<COND (<AND <EQUAL? ,GOAL-PERSON ,FRIEND>
<NOT <EQUAL? ,VARIATION ,FRIEND-C>>
<ZERO? <GET ,FOUND-PASSAGES ,PLAYER-C>>
<ZERO? ,FRIEND-FOUND-PASSAGES>
<T? <GETP ,HERE ,P?LINE>>
<T? ,NOW-WEARING>
<NOT <FSET? ,HERE ,SECRETBIT>>
<NOT <1? <GETP ,HERE ,P?CHARACTER>>> ;"Dee's path"
<NOT <EQUAL? ,HERE ,BACKSTAIRS>>>
<FCLEAR ,SECRET-TAMARA-DOOR ,SECRETBIT>
<SET VAL T ;,M-FATAL>
<COND (<NOT <VERB? SEARCH SEARCH-FOR>>
<CRLF>)>
<COND (<EQUAL? ,HERE ,TAMARA-ROOM>
<PUT .GT ,ATTENTION <GET .GT ,ATTENTION-SPAN>>
<SETG WINNER ,FRIEND>
<COND (<==? ,HERE <GET ,FOLLOW-LOC ,FRIEND-C>>
<TELL "Preparing for bed," 'FRIEND>)
(T <TELL 'FRIEND " enters and">)>
<TELL " accidentally touches the bedpost. ">
<THIS-IS-IT ,FRIEND>
<OPEN-SECRET "turn" " the bedpost" ,SECRET-TAMARA-DOOR>
<SETG WINNER ,PLAYER>)
(<NOT <QUEUED? ,I-SHOT>>
<FSET ,PASSAGE ,SEENBIT>
<FSET ,SECRET-TAMARA-DOOR ,OPENBIT>
<MOVE ,FRIEND ,HERE>
<PUT ,FOLLOW-LOC ,FRIEND-C ,HERE>
<PUT .GT ,GOAL-FUNCTION ,X-RETIRES>
<ESTABLISH-GOAL ,FRIEND ,TAMARA-ROOM>
<TELL "Suddenly " 'FRIEND " appears and says, ">
<FRIEND-PASSAGE-STORY>)>)
(<TIME-FOR-GHOST? .RM>
<QUEUE I-SEARCH 0>
<COND (<==? ,VILLAIN-PER ,LOVER>
<PUTP ,DEB ,P?LDESC 24 ;"brushing her hair">
<PUT .GT ,ATTENTION <GET .GT ,ATTENTION-SPAN>>
<DRESS-GHOST <LOC ,LOVER> ,LOVER-C>
<PUT <GET ,GOAL-TABLES ,GHOST-NEW-C>
,GOAL-FUNCTION ,LOVER-XFER>
<ESTABLISH-GOAL ,GHOST-NEW ,BASEMENT>
<SET VAL <MOVE-PERSON ,GHOST-NEW ,LOVER-PATH>>)
(T
<DRESS-GHOST .RM .C>
<SET VAL <GHOST-INTO-PASSAGE .C>>
<ESTABLISH-GOAL ,GHOST-NEW ,YOUR-CLOSET>)>)
(T
<COND (<FSET? ,GOAL-PERSON ,FEMALE>
<PUTP ,GOAL-PERSON ,P?LDESC 24 ;"brushing her hair">)
(T
<PUTP ,GOAL-PERSON ,P?LDESC 25 ;"looking sleepy">)>
<PUT .GT ,ATTENTION-SPAN 5>
<PUT .GT ,ATTENTION 5>)>
<SETG FRIEND-FOUND-PASSAGES T>)>
%<DEBUG-CODE <COND (,IDEBUG <TELL N .VAL !\] CR>)>>
<RETURN .VAL>>
<ROUTINE GHOST-INTO-PASSAGE (C "AUX" RM)
<SET RM <GET ,CHAR-CLOSET-TABLE <+ 1 .C>>>
<MOVE ,GHOST-NEW .RM>
<COND (<EQUAL? .RM ,HERE>
<SET RM <FIND-FLAG-LG .RM ,DOORBIT ,SECRETBIT>>
<FSET .RM ,OPENBIT>
<TELL CR CTHE .RM " bursts open!|">
<RETURN ,M-FATAL>)>>
<ROUTINE TIME-FOR-GHOST? (RM "AUX" X)
<COND (<EQUAL? ,VILLAIN-PER ,LOVER>
<COND (<NOT <EQUAL? ,GOAL-PERSON ,DEB>>
<RFALSE>)>)
(T
<COND (<NOT <EQUAL? ,GOAL-PERSON ,VILLAIN-PER>>
<RFALSE>)>)>
<COND (<IN? ,VILLAIN-PER ,LOCAL-GLOBALS>
<RFALSE>)
(<EQUAL? ,GOAL-PERSON ,FRIEND>
<RFALSE>)
(<T? <GET ,FOUND-COSTUME ,PLAYER-C>>
<RFALSE>)
(<FSET? ,BLOWGUN ,TOUCHBIT>
<RFALSE>)
(<AND <SET X <FIND-FLAG-LG .RM ,DOORBIT ,SECRETBIT>>
<FSET? .X ,OPENBIT>>
<RFALSE>)
(<T? <FIND-FLAG .RM ,PERSONBIT ,VILLAIN-PER>>
<RFALSE>)
(T <RTRUE>)>>
<ROUTINE DRESS-GHOST (L C "AUX" ADJ PT)
<MOVE ,GHOST-NEW .L>
<MOVE ,VILLAIN-PER ,LOCAL-GLOBALS>
<PUT ,CHAR-CLOSET-TABLE <+ 1 ,GHOST-NEW-C>
<GET ,CHAR-CLOSET-TABLE <+ 1 .C>>>
<COND (<SET ADJ <GETP ,VILLAIN-PER ,P?STATION>>
<SET PT <GETPT ,HEAD ,P?ADJECTIVE>>
<COND (<SETG OTHER-POSS-POS <ZMEMQB .ADJ .PT <RMGL-SIZE .PT>>>
<PUTB .PT
,OTHER-POSS-POS ,A?G\'S>
<PUTB <GETPT ,HANDS ,P?ADJECTIVE>
,OTHER-POSS-POS ,A?G\'S>
<PUTB <GETPT ,EYE ,P?ADJECTIVE>
,OTHER-POSS-POS ,A?G\'S>
<PUTB <GETPT ,OTHER-OUTFIT ,P?ADJECTIVE>
,OTHER-POSS-POS ,A?G\'S>)>)>
<FSET ,COSTUME ,NDESCBIT>
<FCLEAR ,COSTUME ,TAKEBIT>
<FSET ,COSTUME ,WORNBIT>
<MOVE ,COSTUME ,GHOST-NEW>
<COND (<==? .C ,DOCTOR-C>
<MOVE ,MUSTACHE ,WENDISH-KIT>
<FCLEAR ,MUSTACHE ,NDESCBIT>
<FSET ,MUSTACHE ,TAKEBIT>)>
<COND (<NOT <EQUAL? ,VARIATION ,LORD-C>> ;"Dee is nonviolent."
<FSET ,BLOWGUN ,NDESCBIT>
<FCLEAR ,BLOWGUN ,TAKEBIT>
<MOVE ,BLOWGUN ,GHOST-NEW>)>
<PUT <GET ,GOAL-TABLES .C> ,GOAL-FUNCTION ,GHOST-LURKS>
<PUT <GET ,GOAL-TABLES .C> ,ATTENTION-SPAN 0 ;1>>
<ROUTINE LOVER-XFER ("OPTIONAL" (GARG <>)
"AUX" (VAL <>) (L <LOC ,GOAL-PERSON>))
%<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
<TELL "[LOVER-XFER:">
<COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
<COND (<==? .GARG ,G-ENROUTE>
<SET VAL <GHOST-LURKS .GARG>>)
(<==? .GARG ,G-REACHED>
<COND (<EQUAL? .L ,HERE>
<SET VAL <GHOST-LURKS .GARG>>)
(<EQUAL? .L ,BASEMENT>
<MOVE ,GOAL-PERSON ,KITCHEN>
<ESTABLISH-GOAL ,GOAL-PERSON ,BACKSTAIRS>
<SET VAL <GHOST-LURKS ,G-ENROUTE>>)
(<EQUAL? .L ,BACKSTAIRS>
<MOVE ,GOAL-PERSON ,DINING-PASSAGE>
<ESTABLISH-GOAL ,GOAL-PERSON ,YOUR-CLOSET>
<PUT <GT-O ,GOAL-PERSON> ,GOAL-FUNCTION ,GHOST-LURKS>
<SET VAL <GHOST-LURKS ,G-ENROUTE>>)>)>
%<DEBUG-CODE <COND (,IDEBUG <TELL N .VAL !\] CR>)>>
<RETURN .VAL>>
<ROUTINE I-COME-TO ("OPTIONAL" (GARG <>) "AUX" P (L <>) V)
%<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
<TELL "[I-COME-TO:">
<COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
<COND (<IN? ,GHOST-NEW ,LOCAL-GLOBALS>
<SET P ,VILLAIN-PER>
<PUTP .P ,P?LDESC 4 ;"looking at you with suspicion">
<COND (<NOT <==? .P ,LOVER>>
<PUT <GT-O .P> ,GOAL-FUNCTION ,X-RETIRES>
<SET L <+ 1 <GETP .P ,P?CHARACTER>>>
<COND (<FSET? <META-LOC .P> ,SECRETBIT>
<SET L <GET ,CHAR-CLOSET-TABLE .L>>)
(T <SET L <GET ,CHAR-ROOM-TABLE .L>>)>)>)
(T
<SET P ,GHOST-NEW>
<PUTP .P ,P?LDESC 0>
<FSET .P ,NDESCBIT>
<PUT <GT-O .P> ,GOAL-FUNCTION ,GHOST-LURKS>
<SET L ,YOUR-CLOSET>
<COND (<NOT <FSET? <LOC .P> ,SECRETBIT>>
<GHOST-INTO-PASSAGE <GETP ,VILLAIN-PER ,P?CHARACTER>>)>)>
<FCLEAR .P ,MUNGBIT>
<SET V <VISIBLE? .P>>
<COND (<T? .V>
<TELL CTHE .P>
<COND (<WHERE? .P> <TELL !\,>)>
<TELL " shakes" HIS .P " head and comes to." CR>
<COND (<AND <EQUAL? ,VILLAIN-PER ,LOVER>
<LOVER-SPEECH>>
<SET V ,M-FATAL>)
(<NOT <==? .P ,GHOST-NEW>>
<SET V ,M-FATAL>
<TELL
CHE .P " says, \"I feel... sleepy. I think...\"" CR>)>)>
<COND (<T? .L>
<PUT <GT-O .P> ,GOAL-S T>
<ESTABLISH-GOAL .P .L>)>
%<DEBUG-CODE <COND (,IDEBUG <TELL N .V !\] CR>)>>
.V>
<ROUTINE LOVER-SPEECH ()
<COND (<IN? ,GHOST-NEW ,HERE>
<SETG LOVER-SAID T>
<TELL
CHE ,GHOST-NEW " says, \"Please don't speak, just listen! I'm really
" 'LOVER ", and I'm alive. Jack tried to murder me, and I think he murdered
Lionel! He pushed me down the well, but an underground stream carried me
quickly to sea, where I was rescued by a yacht.|
I have come back to " 'CASTLE " in disguise -- both to frighten him and
to find some proof of Lionel's murder. And to incriminate " 'LORD " for
my own 'murder' by planting the " 'JEWEL " from my necklace in the
clothes he wore that night -- but then I lost it in the " 'DRAWING-ROOM
".\"|
She goes on, \"But now that you're on the case, I can leave the country
with the yacht captain. Find proof of Lionel's murder, and we both can
rest easily!\"|
She races off ">
<GHOST-FLEES T>
<CONGRATS ,COSTUME>
<FSET ,LOVER ,SEENBIT>)>
<MOVE ,GHOST-NEW ,LIMBO>
<FSET ,GHOST-NEW ,MUNGBIT>
<PUT ,FOLLOW-LOC ,GHOST-NEW-C 0>
,LOVER-SAID>
<ROUTINE GHOST-FLEES ("OPT" (PART <>))
<COND (<ZERO? .PART>
<MOVE ,GHOST-NEW ,LIMBO>
<FSET ,GHOST-NEW ,MUNGBIT>
<PUT ,FOLLOW-LOC ,GHOST-NEW-C 0>
<TELL CHE ,GHOST-NEW " dodges your attack and flees ">)>
<COND (<==? ,HERE ,LOVER-PATH>
<TELL "down the path">)
(T <TELL "toward the " 'PRIEST-DOOR>)>
<TELL "." CR>>
;<ROUTINE NEXT-ROOM (RM DIR "AUX" PT PTS)
<COND (<SET PT <GETPT .RM .DIR>>
<COND (<==? <SET PTS <PTSIZE .PT>> ,UEXIT>
<GET-REXIT-ROOM .PT>)
(<==? .PTS ,NEXIT>
<RFALSE>)
(<==? .PTS ,FEXIT>
<APPLY <GET .PT ,FEXITFCN>>)
(<==? .PTS ,CEXIT>
<COND (<VALUE <GETB .PT ,CEXITFLAG>>
<GET-REXIT-ROOM .PT>)>)
(<==? .PTS ,DEXIT>
<COND (T ;<FSET? <GET-DOOR-OBJ .PT> ,OPENBIT>
<GET-REXIT-ROOM .PT>)>)>)>>
<GLOBAL SHOOTER:OBJECT 0>
<GLOBAL AIMED-HERE:OBJECT 0>
;<GLOBAL TRIPPEE:OBJECT 0>
;<ROUTINE FIND-TRIPPEE (RM "AUX" O)
<SET O <FIRST? .RM>>
<REPEAT ()
<COND (<ZERO? .O> <RETURN <>>)
(<AND <FSET? .O ,TAKEBIT>
<L? 3 <GETP .O ,P?SIZE>>
<NOT <FSET? .O ,INVISIBLE>>
<NOT <==? .O ,TRIPPEE>>>
<RETURN .O>)
(T <SET O <NEXT? .O>>)>>>
<ROUTINE GHOST-LURKS ("OPTIONAL" (GARG <>)
"AUX" L OBJ (VAL <>) GT C)
%<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
<TELL "[GHOST-LURKS:">
<COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
<SET L <LOC ,GHOST-NEW>>
<SET C ,GHOST-NEW-C>
<SET GT <GET ,GOAL-TABLES .C>>
<COND ;(<AND <EQUAL? .GARG ,G-ENROUTE ,G-REACHED>
<SET OBJ <FIND-TRIPPEE .L>>>
<SETG TRIPPEE .OBJ>
<SETG SHOOTER <>>
<QUEUE I-SHOT 0>
<FCLEAR ,GHOST-NEW ,NDESCBIT>
<PUTP ,GOAL-PERSON ,P?LDESC 19 ;"out cold">
<QUEUE I-COME-TO <+ 9 <RANDOM 6>>>
<COND (<EQUAL? .L ,HERE>
<COND (<NOT <FSET? ,GHOST-NEW ,TOUCHBIT>>
<GHOST-NEW-D>)>
<SET VAL ,M-FATAL>
<TELL
CHE ,GOAL-PERSON " trips over" THE .OBJ " and falls heavily "
<GROUND-DESC> "!" CR>)>
<FSET ,GOAL-PERSON ,MUNGBIT>)
(<EQUAL? .L ,HERE>
<COND (<NOT <FSET? ,GHOST-NEW ,TOUCHBIT>>
<GHOST-NEW-D>)>
<SET VAL ,M-FATAL>
<SETG AIMED-HERE ,HERE>
<TELL "The ghost ">
<COND (<QUEUED? ,I-SHOT>
<TELL "follows">)
(T <TELL "approaches">)>
<THIS-IS-IT ,GHOST-NEW>
<TELL
" you," HIS ,GHOST-NEW " cold eyes shining. In a moment," HE ,GHOST-NEW>
<COND ;(<EQUAL? ,VILLAIN-PER ,LOVER>
<MOVE ,GHOST-NEW ,LIMBO>
<FSET ,GHOST-NEW ,MUNGBIT>
<PUT ,FOLLOW-LOC .C 0>
<TELL " slips away." CR>)
(T ;<NOT <QUEUED? ,I-SHOT>>
<PUT .GT ,GOAL-ENABLE 0>
<FSET ,PLAYER ,SEENBIT>
<SETG SHOOTER ,GHOST-NEW>
<QUEUE I-SHOT ,CLOCKER-RUNNING>
<COND (<EQUAL? ,VILLAIN-PER ,LOVER>
<PUTP ,GHOST-NEW,P?LDESC 17;"preparing to leave">
<TELL " sees you and freezes." CR>)
(T
<PUTP ,GHOST-NEW ,P?LDESC 8 ;"poised to attack">
<TELL " poi">
<COND (<IN? ,BLOWGUN ,GHOST-NEW>
<SETG AIMED-HERE ,HERE>
<FCLEAR ,BLOWGUN ,NDESCBIT>
<TELL "nts" THE ,BLOWGUN " at">)
(T <TELL "ses to attack">)>
<TELL " you." CR>)>)>)
(<==? .GARG ,G-REACHED>
<COND (<NOT <EQUAL? .L ,YOUR-CLOSET>>
<ESTABLISH-GOAL ,GHOST-NEW ,YOUR-CLOSET>)
(T
<ESTABLISH-GOAL ,GHOST-NEW
<GET ,CHAR-CLOSET-TABLE <+ 1 .C>>>)>)>
%<DEBUG-CODE <COND (,IDEBUG <TELL N .VAL "]|">)>>
<RETURN .VAL>>
<ROUTINE I-SHOT ("OPTIONAL" (GARG <>) "AUX" (VAL <>) L (GT <GT-O ,SHOOTER>))
%<DEBUG-CODE <COND (<OR ,IDEBUG <==? .GARG ,G-DEBUG>>
<TELL "[I-SHOT:">
<COND (<==? .GARG ,G-DEBUG> <RFALSE>)>)>>
<COND (<EQUAL? ,VILLAIN-PER ,LOVER>
<COND (<IN? ,GHOST-NEW ,HERE>
<SET VAL T>
<TELL CHE ,GHOST-NEW " flees into the dark." CR>)>
<MOVE ,GHOST-NEW ,LIMBO>
<FSET ,GHOST-NEW ,MUNGBIT>
<PUT ,FOLLOW-LOC ,GHOST-NEW-C 0>)
(<EQUAL? ,AIMED-HERE ,HERE>
<COND (<NOT <IN? ,BLOWGUN ,SHOOTER>>
<TELL
"You struggle to get free, but"
THE ,SHOOTER "'s hands clench tighter around your throat! Soon
the pain grows until the room begins to black out">
<COND (<==? ,SHOOTER ,GHOST-NEW>
<TELL
". Your only consolation is that the ghost's wig falls off, and just as
you take your last breath, you see
that it's really " D ,VILLAIN-PER>)>
<TELL "! But">)
(T
<COND (<FSET? ,HERE ,ONBIT>
<TELL
CHE ,SHOOTER " puts" THE ,BLOWGUN " to" HIS ,SHOOTER " lips and puffs"
HIS ,SHOOTER " cheeks out and in. ">)>
<TELL
"You feel a sharp pain in the chest. Your vision
mists over, the room blacks out, and your legs give way beneath you.|
The sad fact is, "FN", that you've been shot with a" ,POISON-DART ", and">)>
<TELL " for you, the game is over!|">
<FINISH>)
(<AND <T? ,SHOOTER>
<NOT <FSET? ,SHOOTER ,MUNGBIT>>>
<PUT .GT ,GOAL-ENABLE 2>
<COND (<FSET? ,HERE ,SECRETBIT>
<SET L ,HERE>)
(<EQUAL? ,SHOOTER ,GHOST-NEW>
<SET L <GET .GT ,GOAL-F>>)
(<ZERO? <SET L <GENERIC-CLOSET 0>>>
<SET L <GET ,CHAR-CLOSET-TABLE
<+ 1 <GETP ,VILLAIN-PER ,P?CHARACTER>>>>)>
<PUT .GT ,GOAL-S .L> ;"in case GOAL-REACHED called"
<ESTABLISH-GOAL ,SHOOTER .L>
<SETG SHOOTER <>>
<FSET ,BLOWGUN ,NDESCBIT>)>
%<DEBUG-CODE <COND (,IDEBUG <TELL N .VAL !\] CR>)>>
.VAL>