moonmist/verbs.zil
historicalsource a2025f6d6c Final Revision
2019-04-14 13:37:43 -04:00

4468 lines
127 KiB
Plaintext
Raw 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.

"VERBS for MOONMIST
Copyright (C) 1986 Infocom, Inc. All rights reserved."
<ROUTINE TRANSCRIPT (STR)
<TELL "Here " .STR "s a transcript of interaction with" CR>>
<ROUTINE V-SCRIPT ()
<LOWCORE FLAGS <BOR <LOWCORE FLAGS> 1>>
<TRANSCRIPT "begin">
<V-VERSION>
<RTRUE>>
<ROUTINE V-UNSCRIPT ()
<TRANSCRIPT "end">
<V-VERSION>
<LOWCORE FLAGS <BAND <LOWCORE FLAGS> -2>>
<RTRUE>>
<ROUTINE V-$VERIFY ()
<COND (<T? ,PRSO>
<COND (<AND <EQUAL? ,PRSO ,INTNUM>
<EQUAL? ,P-NUMBER 105>>
<TELL N ,SERIAL CR>)
(T <DONT-UNDERSTAND>)>)
(T
<TELL "Verifying disk..." CR>
<COND (<VERIFY> <TELL "The disk is correct." CR>)
(T <TELL
"Oh, oh! The disk seems to have a defect. Try verifying again. (If
you've already done that, the disk surely has a defect.)" CR>)>)>>
<GLOBAL VARIATION:NUMBER 0>
%<DEBUG-CODE [
<ROUTINE V-$CHEAT ("AUX" (N 0) CH)
<COND (<OR <NOT <DOBJ? INTNUM>>
<NOT <EQUAL? ,P-NUMBER 1 2 3>>>
<SETG CLOCK-WAIT T>
<TELL "{Try $CHEAT 1, 2 or 3.}" CR>
<RTRUE>)>
<COND (<NOT <EQUAL? ,PRESENT-TIME %,PRESENT-TIME-ATOM>>
<TELL "Don't you want to restart first?">
<COND (<YES?> <RESTART>)
(T <TELL "Okay, but this may not work!" CR>)>)>
<COND (<ZERO? <GETB ,LAST-NAME 0>>
<REPEAT ()
<COND (<IGRTR? N 8> <RETURN>)
(<ZERO? <SET CH <GETB 0 <+ .N 55>>>> <RETURN>)
(T <PUTB ,FIRST-NAME .N <+ .CH *40*>>)>>
<COND (<1? .N> <SET N 2>)>
<PUTB ,FIRST-NAME 0 <- .N 1>>
<PUTB ,LAST-NAME 0 6>
;<TELL "Full name? ">
;<GET-NAME>
<TELL "Favorite color? ">
<GET-COLOR>
<TELL CR>)>
<FSET ,DRIVEWAY ,TOUCHBIT>
<FSET ,FRONT-GATE ,LOCKED>
<QUEUE I-DRAGON-EYE 0>
<COND (<EQUAL? ,P-NUMBER 1>
<GATE-OPENS>
<GOTO ,COURTYARD>)
(<EQUAL? ,P-NUMBER 2 3>
<QUEUE I-FRIEND-GREETS 0>
<SET N ,CHARACTER-MAX>
<REPEAT ()
<SET CH <GET ,CHARACTER-TABLE .N>>
<FSET .CH ,TOUCHBIT>
<FCLEAR .CH ,NDESCBIT>
<COND (<DLESS? N 1> <RETURN>)>>
<PUT <GT-O ,BUTLER> ,GOAL-ENABLE 0>
<MOVE ,LUGGAGE ,BED>
<MOVE ,BUTLER ,YOUR-ROOM>
<COND (<EQUAL? ,P-NUMBER 2>
;<SETG BUTLER-HINTS-COUNTER 1>
<QUEUE I-BUTLER-HINTS 2 ;-1>
<QUEUE I-BUTLER-COOKS 9>
<FCLEAR ,BUTLER ,NDESCBIT>
<GOTO ,YOUR-ROOM>)
(T
;<QUEUE I-PRE-DINNER 0>
<QUEUE I-DINNER 0>
<SETG SCORE 0>
<SETG PRESENT-TIME ,BED-TIME>
<QUEUE I-BEDTIME 1>
<MOVE ,BUTLER ,LOCAL-GLOBALS>
<MOVE ,LAMP ,PLAYER>
<MOVE ,MACE ,PLAYER>
<FCLEAR ,MACE ,NDESCBIT>
<GOTO ,GREAT-HALL>)>)>>
<ROUTINE V-$GENDER ()
<TELL "{Your gender is ">
<COND (<OR <NOT <DOBJ? INTNUM>>
<NOT <EQUAL? ,P-NUMBER 1 2 3>>>
<COND (<ZERO? ,GENDER-KNOWN> <TELL "neuter">)
(<FSET? ,PLAYER ,FEMALE> <TELL "female">)
(T <TELL "male">)>)
(T
<TELL "now ">
<COND (<EQUAL? ,P-NUMBER 1>
<SETG GENDER-KNOWN T>
<FSET ,PLAYER ,FEMALE>
<TELL "female (1)">)
(<EQUAL? ,P-NUMBER 2>
<SETG GENDER-KNOWN T>
<FCLEAR ,PLAYER ,FEMALE>
<TELL "male (2)">)
(T
<SETG GENDER-KNOWN <>>
<TELL "neuter (3)">)>)>
<TELL ".}" CR>>
<GLOBAL IDEBUG:FLAG <>>
<ROUTINE V-$GOAL ("AUX" (CNT 0) O L C S)
<REPEAT ()
<COND (<G? <SET CNT <+ .CNT 1>> ,GHOST-NEW-C ;,CHARACTER-MAX>
<RETURN>)>
<SET C <GET ,CHARACTER-TABLE .CNT>>
<SET O <GET ,GOAL-TABLES .CNT>>
<SET S <GET .O ,GOAL-S>>
<COND (<AND <SET L <LOC .C>> <NOT <ZERO? .S>>>
<TELL D .C " (in " D .L "): " D .S>
<SET L <GET .O ,GOAL-F>>
<COND (<NOT <EQUAL? .S .L>>
<TELL " F:" D .L>)>
<SET L <GET .O ,GOAL-I>>
<COND (<NOT <ZERO? .L>>
<SET L <GET ,TRANSFER-TABLE .L>>
<COND (<ZERO? .L> <TELL " I:0">)
(T
<TELL " I:" D .L>)>)>
<COND (<ZERO? <GET .O ,GOAL-ENABLE>>
<TELL " (DISABLED)">)>
<PRINTC 32>
<APPLY <GET .O ,GOAL-FUNCTION> ,G-DEBUG>
<CRLF>)>>>
<ROUTINE V-$QUEUE ("AUX" C E TICK)
<SET C <REST ,C-TABLE ,C-INTS>>
<SET E <REST ,C-TABLE ,C-TABLELEN>>
<REPEAT ()
<COND (<==? .C .E> <RETURN>)
(<AND <NOT <ZERO? <GET .C ,C-ENABLED?>>>
<NOT <ZERO? <SET TICK <GET .C ,C-TICK>>>>>
<APPLY <GET .C ,C-RTN> ,G-DEBUG>
<PRINTC 9>
<TELL N .TICK CR>)>
<SET C <REST .C ,C-INTLEN>>>>
<ROUTINE V-$VARIATION ()
<SETG CLOCK-WAIT T>
<COND (<AND <EQUAL? ,PRSO ,INTNUM>
<L? ,P-NUMBER 5>
<G? ,P-NUMBER 0>>
<SETG VARIATION ,P-NUMBER>
<DO-VARIATION>
<PRINTB <GET ,COLOR-WORDS ,VARIATION>>
<TELL " variation" CR>)
(<EQUAL? ,PRSO ,ROOMS>
<PRINTB <GET ,COLOR-WORDS ,VARIATION>>
<TELL " variation" CR>)
(T
<TELL "Wrong object!" CR>)>>
<ROUTINE V-$COMMAND ()
<DIRIN 1>
<RTRUE>>
<ROUTINE V-$RANDOM ()
<COND (<NOT <DOBJ? INTNUM>>
<TELL "Illegal." CR>)
(T
<RANDOM <- 0 ,P-NUMBER>>
<RTRUE>)>>
<CONSTANT D-RECORD-ON 4>
<CONSTANT D-RECORD-OFF -4>
<ROUTINE V-$RECORD ()
<DIROUT ,D-RECORD-ON> ;"all READS and INPUTS get sent to command file"
<RTRUE>>
<ROUTINE V-$UNRECORD ()
<DIROUT ,D-RECORD-OFF>
<RTRUE>>
<GLOBAL DBUG:FLAG <>>
<ROUTINE V-DEBUG ()
%<DEBUG-CODE <COND (<T? ,PRSO>
<SETG IDEBUG <NOT ,IDEBUG>>
<TELL !\{ N ,IDEBUG "}" CR>
<RTRUE>)>>
<COND (<SETG DBUG <NOT ,DBUG>>
<TELL "Find them bugs, boss!" CR>)
(T <TELL "No bugs left, eh?" CR>)>>
]>
;<ROUTINE V-$WHERE ("AUX" (CNT 0) O L MSG)
<COND ;(<ZERO? ,DBUG>
<SET MSG <PICK-ONE ,UNKNOWN-MSGS>>
<TELL <GET .MSG 0> "#wher" <GET .MSG 1> CR>)
(<T? ,PRSI>
<COND (<==? ,PRSI ,PLAYER>
<FSET ,PRSO ,TOUCHBIT>
<FCLEAR ,PRSO ,NDESCBIT>
<FCLEAR ,PRSO ,INVISIBLE>)>
<MOVE ,PRSO ,PRSI>)
(<T? ,PRSO>
<TELL-$WHERE ,PRSO>)
(T
<REPEAT ()
<COND (<SET O <GET ,CHARACTER-TABLE .CNT>>
;<SET L <LOC .O>>
<TELL-$WHERE .O>)>
<COND (<G? <SET CNT <+ .CNT 1>> ,GHOST-NEW-C ;,CHARACTER-MAX>
<RETURN>)>>)>>
;<ROUTINE TELL-$WHERE (O "OPTIONAL" (L 0))
<TELL D .O " is ">
<COND (<ZERO? .L> <SET L <LOC .O>>)>
<COND (.L
<TELL "in">
<TELL THE .L>
<TELL "." CR>)
(T <TELL "nowhere." CR>)>>
"ZORK game commands"
"SUBTITLE SETTINGS FOR VARIOUS LEVELS OF DESCRIPTION"
<GLOBAL VERBOSITY:NUMBER 1> "0=SUPERB 1=BRIEF 2=VERBOS"
<ROUTINE YOU-WILL-GET (STR)
<TELL "[Okay, you will get " .STR " descriptions.]" CR>>
<ROUTINE V-SUPER-BRIEF ()
<SETG VERBOSITY 0>
<YOU-WILL-GET "superbrief">>
<ROUTINE V-BRIEF ()
<SETG VERBOSITY 1>
<YOU-WILL-GET "brief">>
<ROUTINE V-VERBOSE ()
<SETG VERBOSITY 2>
<YOU-WILL-GET "verbose">
<V-LOOK>>
<ROUTINE V-INVENTORY ()
;<COND (<ZERO? ,LIT>
<TOO-DARK>
<RFATAL>)>
<TELL CHE ,WINNER is " holding">
<COND (<ZERO? <PRINT-CONTENTS ,WINNER>> ;"was PRINT-CONT"
<TELL " nothing">)>
<TELL !\.>
<COND ;(<AND <==? ,WINNER ,PLAYER>
<T? ,NOW-WEARING>>
<TELL !\ >
<PERFORM ,V?LOOK-INSIDE ,POCKET>)
(T <CRLF>)>>
<ROUTINE V-QUIT ("OPTIONAL" (ASK? T))
<V-SCORE>
<COND (<NOT .ASK?> <QUIT>)>
<TELL
"[If you want to continue from this point at another time, you must
\"SAVE\" first. Do you want to stop the story now?]">
<COND (<YES?> <QUIT>)
(T <TELL "Okay." CR>)>>
<ROUTINE V-RESTART ()
<V-SCORE>
<TELL "[Do you want to start over from the beginning?]">
<COND (<YES?>
<RESTART>
<TELL-FAILED>)
(T <TELL "Okay." CR>)>>
<ROUTINE TELL-FAILED ()
<TELL
"[Sorry, but it didn't work. Maybe your instruction manual or Reference
Card can tell you why.]" CR>>
<ROUTINE V-SAVE ("AUX" X)
<PUTB ,OOPS-INBUF 1 0>
<SETG CLOCK-WAIT T>
<COND (<SET X <SAVE>>
<TELL "[Okay.]" CR>
%<DEBUG-CODE <PROG ()
<TELL "{" ;"Note to Stu: ">
<TIME-PRINT ,PRESENT-TIME>
<TELL "}|">>>
<V-FIRST-LOOK>)
(T
<TELL-FAILED>)>
<RTRUE>>
<ROUTINE V-RESTORE ()
;<TELL
"[Do you want to go back to a position you saved?]">
<COND ;(<NOT <YES?>>
<TELL "Okay." CR>)
(<NOT <RESTORE>>
<TELL-FAILED>
<RFALSE>)>>
<ROUTINE V-FIRST-LOOK ()
<COND (<DESCRIBE-ROOM>
<COND (<NOT <0? ,VERBOSITY>>
<DESCRIBE-OBJECTS>)>)>>
<ROUTINE V-VERSION ("AUX" (CNT 17) V)
<SET V <BAND <LOWCORE ZORKID> *3777*>>
<TELL D ,MOONMIST "|
Infocom interactive fiction - a mystery story|
Copyright (c) 1986 by Infocom, Inc. All rights reserved." CR
D ,MOONMIST " is a trademark of Infocom, Inc.|
Release number " N .V " / Serial number ">
<LOWCORE-TABLE SERIAL 6 PRINTC>
<COND (<NOT <0? ,VARIATION>>
<TELL " / ">
<PRINTB <GET ,COLOR-WORDS ,VARIATION>>
<TELL " variation">)>
<CRLF>
;<PROG ()
<TELL "{This fine game was made just for you, ">
<SET CNT 55>
<REPEAT ()
<COND (<G? <SET CNT <+ .CNT 1>> 63>
<RETURN>)
(<ZERO? <SET V <GETB 0 .CNT>>>
<RETURN>)
(T <PRINTC .V>)>>
<TELL "!}" CR>>>
<GLOBAL TREASURE-FOUND:OBJECT <>>
<GLOBAL ARRESTED-THE-VILLAIN "arrested the villain">
<GLOBAL IDENTIFIED-THE-GHOST "identified the ghost">
<ROUTINE V-SCORE ("AUX" (N 0) I (FC <GET ,FOUND-COSTUME ,PLAYER-C>))
<COND (<AND <T? ,CONFESSED>
<T? ,TREASURE-FOUND>
<T? .FC>>
<TELL "[Congratulations, "TN"! You've won the game!]" CR>
<RTRUE>)>
<TELL "[Well, so far you've ">
<COND (<ZERO? <GETB ,LAST-NAME 0>>
<TELL "just gotten started.]" CR>
<RTRUE>)>
<TELL "met ">
<COND (<FSET? ,LORD ,TOUCHBIT>
<TELL 'LORD " and ">)>
<SET I <GET ,GUEST-TABLE 0>>
<REPEAT ()
<COND (<FSET? <GET ,GUEST-TABLE .I> ,TOUCHBIT>
<INC N>)>
<COND (<DLESS? I 1> <RETURN>)>>
<COND (<==? .N <GET ,GUEST-TABLE 0>> <TELL "all">)
(<0? .N> <TELL "none">)
(<1? .N> <TELL "one">)
(T <TELL "some">)>
<TELL " of the guests">
<COND (<T? ,WASHED>
<TELL ", washed up from your trip">)>
<COND (<T? ,WRONG-OUTFIT>
<TELL ", worn the ">
<COND (<1? ,WRONG-OUTFIT> <TELL "proper">) (T <TELL "wrong">)>
<TELL " outfit to dinner">)>
<COND (<T? <GET ,FOUND-PASSAGES ,PLAYER-C>>
<TELL ", discovered " 'PASSAGE "s">)>
;<COND (<OR <NOT <FSET? ,COSTUME ,SEENBIT>>
<EQUAL? ,VARIATION ,PAINTER-C ,DOCTOR-C>>
<SET I "found ">)
(<EQUAL? ,VARIATION ,LORD-C>
<SET I "detected ">)
(T ;<EQUAL? ,VARIATION ,FRIEND-C>
<SET I "examined ">)>
;<COND (<T? .FC>
<TELL ", " .I "a " ,COSTUME>)>
<COND (<FSET? ,GHOST-NEW ,TOUCHBIT>
<TELL ", seen the ghost">)>
<COND (<T? .FC>
<TELL ", " ,IDENTIFIED-THE-GHOST>)>
;<COND (<T? ,VILLAIN-KNOWN?>
<TELL ", unmasked the ghost">)>
<COND (<T? ,EVIDENCE-FOUND>
<TELL ", discovered evidence">)>
<COND (<T? ,CONFESSED>
<TELL ", " ,ARRESTED-THE-VILLAIN>)>
<COND (<T? ,TREASURE-FOUND>
<TELL ", discovered the " 'ARTIFACT>)>
<TELL "... ">
<COND (<0? .N> <TELL "and">) (T <TELL "but">)>
<TELL " you haven't ">
<COND (<ZERO? ,TREASURE-FOUND>
<TELL "found the " 'ARTIFACT>)>
<COND (<ZERO? ,EVIDENCE-FOUND>
<COND (<ZERO? ,TREASURE-FOUND>
<TELL " nor ">)>
<TELL "enough evidence">
<COND (<OR <T? ,VILLAIN-KNOWN?>
<T? .FC>>
<TELL " of why ">
<COND (<AND <==? ,VILLAIN-PER ,LOVER>
<T? ,LOVER-SAID>>
<TELL 'LORD " killed " 'COUSIN>)
(T <TELL 'VILLAIN-PER " haunted " 'CASTLE>)>)>)
(<ZERO? ,CONFESSED>
<COND (<ZERO? ,TREASURE-FOUND>
<TELL " nor ">)>
<TELL ,ARRESTED-THE-VILLAIN>)>
<COND (<ZERO? .FC>
<COND (<OR <ZERO? ,TREASURE-FOUND>
<ZERO? ,EVIDENCE-FOUND>
<ZERO? ,CONFESSED>>
<TELL " nor ">)>
;<TELL .I "a " D ,COSTUME>
<TELL ,IDENTIFIED-THE-GHOST>)>
<TELL "!]" CR>>
<GLOBAL YES-INBUF <ITABLE 19 (BYTE LENGTH) 0>
;<TABLE #BYTE 19 #BYTE 0 0 0 0 0 0 0 0 0 0>>
<GLOBAL YES-LEXV <ITABLE 3 (LEXV) 0 0>
;<TABLE #BYTE 3 #BYTE 0 0 0 0 0 0 0>>
<ROUTINE YES? ("AUX" WORD VAL)
<REPEAT ()
<PRINTI "|>">
<READ ,YES-INBUF ,YES-LEXV>
<COND (<AND <NOT <0? <GETB ,YES-LEXV ,P-LEXWORDS>>>
<SET WORD <GET ,YES-LEXV ,P-LEXSTART>>>
<SET VAL <WT? .WORD ,PS?VERB ,P1?VERB>>
<COND (<EQUAL? .VAL ,ACT?YES>
<SET VAL T>
<RETURN>)
(<OR <EQUAL? .VAL ,ACT?NO>
<EQUAL? .WORD ,W?N>>
<SET VAL <>>
<RETURN>)
(<EQUAL? .VAL ,ACT?RESTART>
<V-RESTART>)
(<EQUAL? .VAL ,ACT?RESTORE>
<V-RESTORE>)
(<EQUAL? .VAL ,ACT?QUIT>
<V-QUIT>)>)>
<TELL "[Please type YES or NO.]">>
.VAL>
<ROUTINE NO-NEED ("OPTIONAL" (STR <>) (OBJ <>))
<SETG CLOCK-WAIT T>
<TELL !\( CHE ,WINNER do "n't need to ">
<COND (.STR <TELL .STR>) (T <VERB-PRINT>)>
<COND (<EQUAL? .STR "go" "drive">
<TELL " in that " D ,INTDIR>)
(<T? .OBJ>
<TELL THE .OBJ>)
(T <TELL THE ,PRSO>)>
<TELL ".)" CR>>
<ROUTINE YOU-CANT ("OPTIONAL" (STR <>) (WHILE <>) (STR1 <>))
<SETG CLOCK-WAIT T>
<TELL !\( CHE ,WINNER " can't ">
<COND (<ZERO? .STR>
<VERB-PRINT>)
(T <TELL .STR>)>
<COND (<EQUAL? .STR "go" "drive">
<TELL " in that " D ,INTDIR>)
(T
<COND (<==? ,PRSO ,PSEUDO-OBJECT>
<TELL " it">)
(<AND <DOBJ? BUST>
<NOUN-USED? ,W?TAPE>
<OR <EQUAL? .STR "wait until" ;"throw off">
<EQUAL? .STR "pick up" "turn off" "turn on">>>
<TELL " the tape">)
(<AND <DOBJ? FLOOR>
<OUTSIDE? ,HERE>
<NOT <EQUAL? <LOC ,WINNER> ;,HERE ,CAR>>>
<TELL " the ground">)
(T <TELL THE ,PRSO>)>
<COND (.STR1
<TELL " while">
<COND (.WHILE
<TELL HE .WHILE is>
;<THIS-IS-IT .WHILE>)
(T <TELL HE ,PRSO is>)>
<TELL !\ .STR1>)
;(T <TELL " now">)>)>
<TELL ".)" CR>>
<ROUTINE YOU-SHOULDNT ("OPT" (PREP <>))
<SETG CLOCK-WAIT T>
<TELL !\( CHE ,WINNER " shouldn't ">
<VERB-PRINT>
<TELL THE ;HIM ,PRSO>
<COND (<T? .PREP>
<TELL .PREP THE ,PRSI>)>
<TELL ".)" CR>>
" "
"SUBTITLE - GENERALLY USEFUL ROUTINES & CONSTANTS"
<ROUTINE TELL-BEING-WORN (OBJ)
<COND (<FSET? .OBJ ,WORNBIT>
<TELL " (actually, wearing it)">)
;(<AND <FSET? .OBJ ,ONBIT>
<NOT <EQUAL? ,LIT ,HERE ;1>>>
<TELL " (providing light)">)>>
<GLOBAL YAWNS <LTABLE 0 "unusual" "interesting" "extraordinary" "special">>
<ROUTINE PRINT-CONTENTS (THING "AUX" OBJ NXT (1ST? T) (VAL <>))
<SET OBJ <FIRST? .THING>>
<REPEAT ()
<COND (.OBJ
<SET NXT <NEXT? .OBJ>>
<COND (<OR <FSET? .OBJ ,INVISIBLE>
<FSET? .OBJ ,NDESCBIT> ;"was semied"
<EQUAL? .OBJ ,WINNER ;,NOW-WEARING>>
<MOVE .OBJ ,INTDIR>)>
<SET OBJ .NXT>)
(T
<RETURN>)>>
<SET OBJ <FIRST? .THING>>
<COND (<NOT .OBJ>
<COND (<NOT <==? .THING ,PLAYER>>
<TELL " nothing " <PICK-ONE-NEW ,YAWNS>>)>)
(T
<REPEAT ()
<COND (.OBJ
<SET NXT <NEXT? .OBJ>>
<COND (.1ST?
<SET VAL T>
<SET 1ST? <>>)
(T
<COND (.NXT <TELL !\,>)
(T <TELL " and">)>)>
<TELL THE .OBJ>
<TELL-BEING-WORN .OBJ>
<THIS-IS-IT .OBJ>
<FCLEAR .OBJ ,SECRETBIT>
<FSET .OBJ ,SEENBIT>
<SET OBJ .NXT>)
(T
<RETURN>)>>)>
<ROB ,INTDIR .THING>
.VAL>
<ROUTINE DESCRIBE-OBJECTS ("OPTIONAL" (THING <>)
"AUX" OBJ NXT STR (VAL <>) (HE 0) (SHE 0)
(FIRST T) (TWO? <>) (IT? <>) (ANY? <>))
<COND (<ZERO? .THING>
<SET THING ,HERE>)>
<COND (<ZERO? ,LIT>
<TOO-DARK>
<RTRUE>)>
;"Hide invisible objects"
<SET OBJ <FIRST? .THING>>
<COND (<ZERO? .OBJ>
<RFALSE>)>
<REPEAT ()
<COND (.OBJ
<SET NXT <NEXT? .OBJ>>
<COND (<OR <FSET? .OBJ ,INVISIBLE>
<FSET? .OBJ ,NDESCBIT>
<EQUAL? .OBJ ,WINNER>
<AND <FSET? .OBJ ,PERSONBIT>
<OR <FSET? .OBJ ,RMUNGBIT>;"not desc'd"
;<IN-MOTION? .OBJ>>>
<EQUAL? .OBJ <LOC ,PLAYER>>>
<FCLEAR .OBJ ,RMUNGBIT>
<MOVE .OBJ ,PSEUDO-OBJECT>)>
<SET OBJ .NXT>)
(T
<RETURN>)>>
<COND (<EQUAL? .THING ,HERE>
;"Describe people in proper order:"
<SET NXT ,GHOST-NEW-C ;,CHARACTER-MAX>
<REPEAT ()
<PUT ,TOUCHED-LDESCS .NXT 0>
<COND (<DLESS? NXT 1> <RETURN>)>>
<SET NXT 0>
<REPEAT ()
<COND (<IGRTR? NXT ,GHOST-NEW-C ;,CHARACTER-MAX>
<RETURN>)
(<IN? <SET OBJ <GET ,CHARACTER-TABLE .NXT>> ,HERE>
<PUT ,FOLLOW-LOC .NXT ,HERE>
<SET VAL <APPLY <GETP .OBJ ,P?DESCFCN> ,M-OBJDESC>>
<FSET .OBJ ,SEENBIT>
<COND (<OR <==? .VAL ,M-FATAL>
<ZERO? .ANY?>>
<SET ANY? .VAL>)>
<COND (<FSET? .OBJ ,FEMALE>
<COND (<0? .SHE> <SET SHE .OBJ>)
(T <SET SHE 1>)>)
(T
<COND (<0? .HE> <SET HE .OBJ>)
(T <SET HE 1>)>)>
<MOVE .OBJ ,PSEUDO-OBJECT>)>>
<SET NXT 0>
<REPEAT ()
<COND (<IGRTR? NXT ,GHOST-NEW-C ;,CHARACTER-MAX>
<RETURN>)
(<T? <SET OBJ <GET ,TOUCHED-LDESCS .NXT>>>
;<PUT ,TOUCHED-LDESCS .NXT 0>
<SET FIRST T>
<SET STR <GET ,CHARACTER-TABLE .NXT>>
<TELL CTHE .STR>
<SET STR .NXT>
<REPEAT ()
<COND (<IGRTR? STR ,GHOST-NEW-C ;,CHARACTER-MAX>
<COND (.FIRST <TELL " is ">)
(T <TELL " are ">)>
<TELL <GET ,LDESC-STRINGS .OBJ> !\. CR>
<RETURN>)
(<==? .OBJ <GET ,TOUCHED-LDESCS .STR>>
<PUT ,TOUCHED-LDESCS .STR 0>
<SET FIRST <>>
<TELL " and" THE
<GET ,CHARACTER-TABLE .STR>>)>>)>>
<COND (<NOT <EQUAL? .SHE 0 1>>
<THIS-IS-IT .SHE>)
(<EQUAL? .SHE 1>
<SETG P-HER-OBJECT <>>)>
<COND (<NOT <EQUAL? .HE 0 1>>
<THIS-IS-IT .HE>)
(<EQUAL? .HE 1>
<SETG P-HIM-OBJECT <>>)>
<SET FIRST T>
; "Apply all DESCFCNs and hide those objects"
<SET OBJ <FIRST? .THING>>
<REPEAT ()
<COND (.OBJ
<SET NXT <NEXT? .OBJ>>
<SET STR <GETP .OBJ ,P?DESCFCN>>
<COND (.STR
;<CRLF>
<SET VAL <APPLY .STR ,M-OBJDESC>>
<COND (<OR <==? .VAL ,M-FATAL>
<ZERO? .ANY?>>
<SET ANY? .VAL>)>
<THIS-IS-IT .OBJ>
<FSET .OBJ ,SEENBIT>
;<CRLF>
<MOVE .OBJ ,PSEUDO-OBJECT>)>
<SET OBJ .NXT>)
(T
<RETURN>)>>
;"Apply all FDESCs and eliminate those objects"
;<SET OBJ <FIRST? .THING>>
;<REPEAT ()
<COND (<AND .OBJ
<NOT <FSET? .OBJ ,TOUCHBIT>>>
<SET NXT <NEXT? .OBJ>>
<SET STR <GETP .OBJ ,P?FDESC>>
<COND (.STR
;<SET VAL T>
<COND (<ZERO? .ANY?> <SET ANY? T>)>
<TELL ;CR .STR CR>
<FCLEAR .OBJ ,SECRETBIT>
<FSET .OBJ ,SEENBIT>
<THIS-IS-IT .OBJ>
<MOVE .OBJ ,PSEUDO-OBJECT>)>
<SET OBJ .NXT>)
(T
<RETURN>)>>
;"Apply all LDESC's and eliminate those objects"
<SET OBJ <FIRST? .THING>>
<REPEAT ()
<COND (.OBJ
<SET NXT <NEXT? .OBJ>>
<SET STR <GETP .OBJ ,P?LDESC>>
<COND (.STR
;<SET VAL T>
<COND (<ZERO? .ANY?> <SET ANY? T>)>
<TELL ;CR .STR CR>
<FCLEAR .OBJ ,SECRETBIT>
<FSET .OBJ ,SEENBIT>
<THIS-IS-IT .OBJ>
<MOVE .OBJ ,PSEUDO-OBJECT>)>
<SET OBJ .NXT>)
(T
<RETURN>)>>)>
;"Print whatever's left in a nice sentence"
<SET OBJ <FIRST? ,HERE>>
<SET VAL <>>
<COND (.OBJ
<REPEAT ()
<COND (.OBJ
<SET NXT <NEXT? .OBJ>>
<SET VAL T>
<COND (.FIRST
<SET FIRST <>>
;<CRLF>
<COND (<EQUAL? .THING ,HERE>
<CRLF>
<COND (<FSET? ,HERE ,ONBIT>
<TELL "You see">)
;(<OR <FIND-FLAG ,WINNER ,ONBIT>
<FIND-FLAG ,HERE ,ONBIT>>
<TELL
CHIS ,WINNER " light reveals">)
(T <TELL
"The light reveals" ;" from the next room">)>)>)
(T
<COND (.NXT <TELL !\,>)
(T <TELL " and">)>)>
<TELL THE .OBJ>
<FCLEAR .OBJ ,SECRETBIT>
<FSET .OBJ ,SEENBIT>
<THIS-IS-IT .OBJ>
<TELL-BEING-WORN .OBJ>
<COND (<AND <SEE-INSIDE? .OBJ>
<SEE-ANYTHING-IN? .OBJ>>
<MOVE .OBJ ,INTNUM>)>
<COND (<AND <NOT .IT?>
<NOT .TWO?>>
<SET IT? .OBJ>)
(T
<SET TWO? T>
<SET IT? <>>)>
<SET OBJ .NXT>)
(T
<COND (<AND .IT?
<NOT .TWO?>>
<SETG P-IT-OBJECT .IT?>)>
<COND (<EQUAL? .THING ,HERE>
<TELL " here">)>
<TELL !\.>
<COND (<ZERO? .ANY?> <SET ANY? T>)>
<RETURN>)>>)>
<SET OBJ <FIRST? ,INTNUM>>
<REPEAT ()
<COND (<ZERO? .OBJ>
<RETURN>)>
<COND (<FSET? .OBJ ,SURFACEBIT>
<TELL ;CR CR "On">)
(T
<TELL ;CR CR "Inside">)>
<SET VAL T>
<TELL THE .OBJ>
<TELL " you see">
<PRINT-CONTENTS .OBJ>
<TELL !\.>
<SET OBJ <NEXT? .OBJ>>>
<COND (<T? .VAL ;.ANY?> <CRLF>)>
<ROB ,INTNUM .THING>
<ROB ,PSEUDO-OBJECT .THING>
.ANY? ;.VAL>
<ROUTINE SEE-ANYTHING-IN? (THING "AUX" OBJ NXT (ANY? <>))
<SET OBJ <FIRST? .THING>>
<REPEAT ()
<COND (.OBJ
<COND (<AND <NOT <FSET? .OBJ ,INVISIBLE>>
<NOT <FSET? .OBJ ,NDESCBIT>>
<NOT <EQUAL? .OBJ ,WINNER>>>
<SET ANY? T>
<RETURN>)>
<SET OBJ <NEXT? .OBJ>>)
(T
<RETURN>)>>
<RETURN .ANY?>>
<ROUTINE DESCRIBE-ROOM ("OPTIONAL" (LOOK? <>) "AUX" V? STR L)
<COND (<T? .LOOK?> <SET V? T>)
(<==? 2 ,VERBOSITY> <SET V? T>)
(<==? 0 ,VERBOSITY> <SET V? <>>)
(<NOT <FSET? ,HERE ,TOUCHBIT>>
<SET V? T>)>
<COND (T ;<IN? ,HERE ,ROOMS>
<TELL !\(>
<COND (<ZERO? ,VERBOSITY>
<TELL D ,HERE>)
(T
<TELL "You are">
<COND (<NOT <FSET? ,HERE ,TOUCHBIT>>
<TELL " now">)>
<COND (<FSET? ,HERE ,SURFACEBIT>
<TELL " on">)
(<NOT <==? ,HERE ,BACKSTAIRS>>
<TELL " in">)>
<TELL THE ,HERE !\.>)>
<TELL ")|">)>
<COND (<ZERO? ,LIT>
<TOO-DARK>
;<TELL "It is pitch black." CR>
<RETURN <>>)
(<NOT <EQUAL? ,LIT ,HERE>>
;<1? ,LIT> ;<NOT <FSET? ,HERE ,ONBIT>>
<TELL "Light comes from" THE ,LIT ;" the next room" "." CR>)>
<COND (.V?
<COND (<FSET? <SET L <LOC ,WINNER>> ,VEHBIT>
<TELL "(You're ">
<COND (<EQUAL? .L ,COFFIN> <TELL "ly">)
(T <TELL "sitt">)>
<TELL "ing ">
<COND (<EQUAL? .L ,CAR ,COFFIN>
<TELL "in">)
(T ;<FSET? .L ,SURFACEBIT>
<TELL "on">)
;(T <TELL "standing in">)>
<THIS-IS-IT .L>
<TELL THE .L ".)" CR>)>
<COND (<AND .V? <APPLY <GETP ,HERE ,P?ACTION> ,M-LOOK>>
T)
;(<AND .V? <SET STR <GETP ,HERE ,P?FDESC>>>
<TELL .STR CR>)
(<AND .V? <SET STR <GETP ,HERE ,P?LDESC>>>
<TELL .STR CR>)
(T <APPLY <GETP ,HERE ,P?ACTION> ,M-FLASH>)>
;<COND (<NOT <==? ,HERE .L>>
<APPLY <GETP .L ,P?ACTION> ,M-LOOK>)>)>
<COND (<GETP ,HERE ,P?CORRIDOR>
<CORRIDOR-LOOK>)>
<FSET ,HERE ,SEENBIT>
<FSET ,HERE ,TOUCHBIT>
T>
"Lengths:"
<CONSTANT REXIT 0>
<CONSTANT UEXIT %<COND (<AND <GASSIGNED? PLUS-MODE> ,PLUS-MODE> 2) (T 1)>>
"Uncondl EXIT: (dir TO rm) = rm"
<CONSTANT NEXIT %<COND (<AND <GASSIGNED? PLUS-MODE> ,PLUS-MODE> 3) (T 2)>>
"Non EXIT: (dir ;SORRY string) = str-ing"
<CONSTANT FEXIT %<COND (<AND <GASSIGNED? PLUS-MODE> ,PLUS-MODE> 4) (T 3)>>
"Fcnl EXIT: (dir PER rtn) = rou-tine, 0"
<CONSTANT CEXIT %<COND (<AND <GASSIGNED? PLUS-MODE> ,PLUS-MODE> 5) (T 4)>>
"Condl EXIT: (dir TO rm IF f) = rm, f, str-ing"
<CONSTANT DEXIT %<COND (<AND <GASSIGNED? PLUS-MODE> ,PLUS-MODE> 6) (T 5)>>
"Door EXIT: (dir TO rm IF dr IS OPEN)= rm, dr, str-ing, 0"
<CONSTANT NEXITSTR 0>
<CONSTANT FEXITFCN 0>
<CONSTANT CEXITFLAG %<COND (<AND <GASSIGNED? PLUS-MODE> ,PLUS-MODE> 4) (T 1)>> "GET/B"
<CONSTANT CEXITSTR 1> "GET"
<CONSTANT DEXITOBJ 1> "GET/B"
<CONSTANT DEXITSTR %<COND (<AND <GASSIGNED? PLUS-MODE> ,PLUS-MODE> 2) (T 1)>> "GET"
<ROUTINE HAR-HAR ()
<SETG CLOCK-WAIT T>
<TELL !\( <PICK-ONE-NEW ,YUKS> !\) CR>>
<ROUTINE PICK-ONE-NEW (FROB "AUX" L CNT RND MSG RFROB)
<SET L <- <GET .FROB 0> 1>>
<SET CNT <GET .FROB 1>>
<SET FROB <REST .FROB 2>>
<SET RFROB <REST .FROB <* .CNT 2>>>
<SET RND <- .L .CNT>>
<SET RND <RANDOM .RND>>
%<DEBUG-CODE
<COND (<NOT <G? .RND 0>>
<TELL
"{PICK-ONE-NEW: L=" N .L " CNT=" N .CNT " RND=" N .RND " FROB="N .FROB"}"CR>)>>
<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 PICK-ONE (FROB) <GET .FROB <RANDOM <GET .FROB 0>>>>
<ROUTINE NOT-HOLDING? (OBJ)
<COND (<AND <NOT <IN? .OBJ ,WINNER>>
<NOT <IN? <LOC .OBJ> ,WINNER>>>
<SETG CLOCK-WAIT T>
<TELL !\( CHE ,WINNER is " not holding" HIM .OBJ ".)" CR>)>>
;<ROUTINE LKP (ITM TBL "AUX" (CNT 0) (LEN <GET .TBL 0>))
<REPEAT ()
<COND (<G? <SET CNT <+ .CNT 1>> .LEN>
<RFALSE>)
(<EQUAL? <GET .TBL .CNT> .ITM>
<COND (<EQUAL? .CNT .LEN> <RFALSE>)
(T
<RETURN <GET .TBL <+ .CNT 1>>>)>)>>>
<GLOBAL FOLLOWER:OBJECT 0> "LORD=Tamara+Jack"
<ROUTINE NEW-FOLLOWER (PER)
<COND (<NOT <EQUAL? ,FOLLOWER <> .PER>>
<PUTP ,FOLLOWER ,P?LDESC 0>
<TELL
"\"I'll leave you two alone, then,\" says " D ,FOLLOWER ".|">)>
<SETG FOLLOWER .PER>
<PUT <GT-O .PER> ,GOAL-ENABLE 0>>
<ROUTINE FRIEND-FOLLOWS-YOU (RM "AUX" C)
<COND (<EQUAL? .RM ,CAR ,YOUR-BATHROOM>
<RFALSE>)
(<OR <FSET? .RM ,SECRETBIT>
<EQUAL? .RM ,CRYPT>>
<NOT-INTO-PASSAGE ,FOLLOWER T>
<PUTP ,FOLLOWER ,P?LDESC 9 ;"waiting patiently">
<SETG FOLLOWER 0>
<RFALSE>)
(<ZERO? <GETP .RM ,P?LINE>>
<RFALSE>)
(<IN? ,FOLLOWER .RM>
<RFALSE>)
(T ;<NOT <==? ,OHERE .RM>>
;<SETG OHERE .RM>
;<COND (<NOT <EQUAL? .RM ;,SUB <LOC ,FOLLOWER>>>
<FCLEAR ,FOLLOWER ,TOUCHBIT>)>
<MOVE ,FOLLOWER .RM>
<PUTP ,FOLLOWER ,P?LDESC 23 ;"following you">
<COND (<==? ,FOLLOWER ,LORD>
<TELL D ,FRIEND>)
(T <TELL D ,FOLLOWER>)>
<TELL <PICK-ONE ,TRAILS-ALONG>>
<COND (<AND <==? ,FOLLOWER ,LORD>
<NOT <EQUAL? .RM ,YOUR-ROOM ,YOUR-BATHROOM>>>
<MOVE ,LORD .RM>
<PUTP ,LORD ,P?LDESC 23 ;"following you">
<TELL " So does " D ,LORD !\.>)>
;<SET C <GETP ,FOLLOWER ,P?CHARACTER>>
;<COND (<AND <FSET? ,HERE ,SECRETBIT>
<ZERO? <GET ,FOUND-PASSAGES .C>>>
<PUT ,FOUND-PASSAGES .C T>
<COND (<NOT <==? .C ,VARIATION>>
<PUTP ,FOLLOWER ,P?LINE 0>)>
<TELL " She gasps, \"Wow! You found a " D ,PASSAGE "!\"">)>
<CRLF>)>>
<ROUTINE NOT-INTO-PASSAGE (PER "OPT" (FOLLOW <>) (PASS T))
<COND (<T? .PASS>
<PUT ,FOUND-PASSAGES <GETP .PER ,P?CHARACTER> T>)>
<THIS-IS-IT .PER>
<TELL "\"I'm not ">
<COND (<T? .FOLLOW>
<TELL <GET ,LDESC-STRINGS 23> ;"following you">)
(T <TELL "going">)>
<TELL " into that ">
<COND (<T? .PASS>
<COND (<EQUAL? .PER ,OFFICER ,BUTLER>
<TELL "dirty">)
(T <TELL "spooky">)>
<TELL !\ >)>
<TELL "place!\" says " D .PER>
<COND (<T? .FOLLOW>
<TELL " as" HE .PER " stays behind">)>
<TELL "." CR>>
<GLOBAL TRAILS-ALONG
<PLTABLE " walks a few steps behind."
" trails along."
" stays at your side."
" walks along with you.">>
<GLOBAL TOUR-FORCED:FLAG <>>
<ROUTINE TOUR? ("AUX" RM)
<COND (<QUEUED? ,I-TOUR>
<QUEUE I-TOUR 1>
<SETG TOUR-FORCED T>
<COND (<QUEUED? ,I-REPLY> <QUEUE I-REPLY 1>)>
<COND (<OR <NOT <EQUAL? ,HERE ,GREAT-HALL>>
<FSET? ,DOCTOR ,TOUCHBIT>>
<SET RM <GET ,TOUR-PATH ,TOUR-INDEX>>
<COND (<VERB? FOLLOW>
<COND (<DOBJ? FRIEND>
<RTRUE>)>)
(<VERB? WALK>
<COND (<DIR-EQV? ,HERE ,PRSO <DIR-FROM ,HERE .RM>>
<RTRUE>)>)
(<VERB? WALK-TO THROUGH>
<COND (<==? <META-LOC ,PRSO> .RM>
<RTRUE>)>)>)>
<TELL
'FRIEND " says, \"Please don't wander off yet. I want you to ">
<COND (<FSET? ,DOCTOR ,TOUCHBIT>
<TELL "see " 'YOUR-ROOM ".\"" CR>)
(T <TELL "meet the other guests.\"" CR>)>
<RTRUE>)>>
<ROUTINE CREEPY? (RM)
<COND (<FSET? .RM ,SECRETBIT>
<RTRUE>)
(<EQUAL? .RM ,TOMB ,DUNGEON ,CRYPT>
<RTRUE>)
;(<EQUAL? .RM ,BASEMENT>
<RTRUE>)>>
<ROUTINE GOTO (RM "OPTIONAL" (TEST T) (FOLLOW? T) "AUX" X)
<COND (<IN? ,WINNER .RM>
<WALK-WITHIN-ROOM>
<RFALSE>)>
<COND (<APPLY <GETP ,HERE ,P?ACTION> ,M-EXIT>
<RFALSE>)
(<==? ,WINNER ,PLAYER>
<COND (<TOUR?>
<RFALSE>)>
<COND (<AND .FOLLOW?
<T? ,FOLLOWER>>
<FRIEND-FOLLOWS-YOU .RM>)>
<COND (<AND <1? <RANDOM 2 ;3>>
<ZERO? ,FOLLOWER>
<CREEPY? ,HERE>
<CREEPY? .RM>>
<TELL "You " <PICK-ONE-NEW ,CREEPIES> CR>)>)
;(<FSET? ,WINNER ,MUNGBIT>
<TELL "\"I wish I could!\"" CR>
<RFALSE>)
(<FSET? .RM ,SECRETBIT>
<NOT-INTO-PASSAGE ,WINNER>
<RFALSE>)
(<EQUAL? .RM ,YOUR-BATHROOM>
<NOT-INTO-PASSAGE ,WINNER <> <>>
<RFALSE>)>
<COND (<AND <T? .TEST>
<==? ,WINNER ,PLAYER>>
<SET X <DIR-FROM ,HERE .RM>>
<COND (<T? .X>
<COND (<==? ,M-FATAL <APPLY <GETP ,HERE ,P?ACTION> .X>>
<RFALSE>)>)>)>
<PUT ,FOLLOW-LOC <GETP ,WINNER ,P?CHARACTER> .RM>
<COND (<AND <IN? ,WINNER ,CAR>
<EQUAL? .RM ,COURTYARD>>
<MOVE ,CAR .RM>)>
<MOVE ,WINNER .RM>
<COND (<==? ,WINNER ,PLAYER>
<SETG OHERE ,HERE>
<SETG HERE .RM>
<MAKE-ALL-PEOPLE -12 ;"listening to you">
<ENTER-ROOM>
<RTRUE>)
(T <RTRUE>)>>
<GLOBAL CREEPIES
<LTABLE 0
"feel a cold shiver run down your back."
"hear footsteps behind you, but no one is there."
"hear a door creak open... or was it the wind?"
;"almost trip over a protruding stone."
"feel a cobweb brush your face."
"hear a scurrying sound underfoot.">>
<ROUTINE HACK-HACK (STR)
<TELL .STR HIM ,PRSO <PICK-ONE ,HO-HUM> CR>>
<GLOBAL HO-HUM
<PLTABLE
" won't help any."
" is a waste of time.">>
<ROUTINE HELD? (OBJ "OPTIONAL" (CONT <>) "AUX" L)
<COND (<ZERO? .CONT> <SET CONT ,PLAYER ;,WINNER>)>
<COND (<AND <EQUAL? .OBJ ,ARTIFACT>
<T? ,TREASURE-FOUND>>
<SET OBJ ,TREASURE>)>
<REPEAT ()
<SET L <LOC .OBJ>>
<COND (<NOT .L> <RFALSE>)
(<EQUAL? .L .CONT> <RTRUE>)
(<EQUAL? .CONT ,PLAYER ,WINNER>
<COND (<EQUAL? .OBJ ,HANDS ,HEAD ,EYE>
<RTRUE>)
(<EQUAL? .OBJ ,NOW-WEARING ;,POCKET>
<RTRUE>)
;(<AND <EQUAL? .OBJ ,ARTIFACT>
<EQUAL? ,WINNER .L <LOC .L>>>
<RTRUE>)
(<AND <EQUAL? .OBJ ,CAR>
<VERB? MUNG>>
<RTRUE>)
(T <SET OBJ .L>)>)
(<EQUAL? .L ,ROOMS ,GLOBAL-OBJECTS> <RFALSE>)
(T <SET OBJ .L>)>>>
<ROUTINE IDROP ()
<COND ;(<FSET? ,PRSO ,PERSONBIT>
<TELL CTHE ,PRSO " wouldn't enjoy that." CR>
<RFALSE>)
(<NOT-HOLDING? ,PRSO>
<RFALSE>)
(<AND <NOT <IN? ,PRSO ,WINNER>>
<NOT <FSET? <LOC ,PRSO> ,OPENBIT>>>
<TOO-BAD-BUT <LOC ,PRSO> "closed">
<RFALSE>)
(T
<MOVE ,PRSO ,HERE ;"<LOC ,WINNER>">
<FCLEAR ,PRSO ,WORNBIT>
<FCLEAR ,PRSO ,NDESCBIT>
<FCLEAR ,PRSO ,INVISIBLE>
<RTRUE>)>>
;<GLOBAL INDENTS
<PTABLE ""
" "
" "
" "
" "
" ">>
<GLOBAL FUMBLE-NUMBER:NUMBER 7>
<GLOBAL FUMBLE-PROB:NUMBER 8>
;<GLOBAL ITAKE-LOC:OBJECT <>>
<ROUTINE ITAKE ("OPTIONAL" (VB T) "AUX" CNT OBJ L)
<SET L <LOC ,PRSO>>
<COND (<AND .L <FSET? .L ,PERSONBIT>>
<COND (<AND <NOT <FSET? ,PRSO ,TAKEBIT>>
<NOT <FSET? .L ,MUNGBIT>>>
<COND (.VB <YOU-CANT "take">)>
<RFALSE>)
(T <FSET ,PRSO ,TAKEBIT>)>)>
<COND (<NOT <FSET? ,PRSO ,TAKEBIT>>
<COND (.VB <YOU-CANT "take">)>
<RFALSE>)
(<AND <G? <SET CNT <CCOUNT ,WINNER>> ,FUMBLE-NUMBER>
<PROB <* .CNT ,FUMBLE-PROB>>
<SET OBJ <FIND-FLAG-NOT ,WINNER ,WORNBIT>>>
<TOO-BAD-BUT>
<TELL
THE .OBJ " slips from" HIS ,WINNER " arms while" HE ,WINNER is " taking"
HIM ,PRSO ", and both tumble " <GROUND-DESC> ". " CHE ,WINNER is
" carrying too many things.|">
<MOVE .OBJ ,HERE> ;<PERFORM ,V?DROP .OBJ>
<MOVE ;-FROM ,PRSO ,HERE>
<RFATAL>)
(T
<MOVE ;-FROM ,PRSO ,WINNER>
<FSET ,PRSO ,SEENBIT>
<FSET ,PRSO ,TOUCHBIT>
<FCLEAR ,PRSO ,NDESCBIT>
<FCLEAR ,PRSO ,INVISIBLE>
<FCLEAR ,PRSO ,SECRETBIT>
;<COND (<==? ,WINNER ,PLAYER> <SCORE-OBJ ,PRSO>)>
;<SETG ITAKE-LOC <>>
<COND (<AND <NOT <VERB? TAKE>>
<NOT <==? .L ,WINNER>>
<OR <FSET? .L ,PERSONBIT>
<EQUAL? .L ,SIDEBOARD>>>
<FIRST-YOU "take" ,PRSO .L>
;<COND (<NOT .VB> <SETG ITAKE-LOC .L>)>)>
<RTRUE>)>>
<ROUTINE CCOUNT (OBJ "AUX" (CNT 0) X)
<COND (<SET X <FIRST? .OBJ>>
<REPEAT ()
<COND (<NOT <FSET? .X ,WORNBIT>>
<SET CNT <+ .CNT 1>>)>
<COND (<NOT <SET X <NEXT? .X>>>
<RETURN>)>>)>
.CNT>
<ROUTINE CHECK-DOOR (DR)
<TELL CTHE .DR " is ">
<THIS-IS-IT .DR>
<COND (<FSET? .DR ,OPENBIT> <TELL "open">)
(T
<TELL "closed and ">
<COND (<NOT <FSET? .DR ,LOCKED>> <TELL "un">)>
<TELL "locked">)>
<TELL "." CR>>
<ROUTINE ROOM-CHECK ("AUX" P PA)
<SET P ,PRSO>
<COND (<EQUAL? .P ,ROOMS>
<RFALSE>)
(<IN? .P ,ROOMS>
<COND (<EQUAL? ,HERE .P>
<RFALSE>)
(<OR <EQUAL? ,HERE <GETP .P ,P?STATION>>
<GLOBAL-IN? .P ,HERE>>
<COND (<AND <VERB? LIE SIT SEARCH SEARCH-FOR>
<NOT <==? <SET P <META-LOC .P>> ,HERE>>>
<FIRST-YOU "try to enter" .P>
<SET PA ,PRSA>
<SET P <PERFORM ,V?THROUGH .P>>
<SETG PRSA .PA>
<COND (<==? ,M-FATAL .P>
<RTRUE>)
(T <RFALSE>)>)
(T <RFALSE>)>)
(<NOT <SEE-INTO? .P>>
<RTRUE>)
(T <RFALSE>)>)
(<OR ;<==? .P ,PSEUDO-OBJECT>
<EQUAL? <META-LOC .P>
,HERE ,GLOBAL-OBJECTS ,LOCAL-GLOBALS>>
<RFALSE>)
(<NOT <VISIBLE? .P>>
<NOT-HERE .P>)>>
<ROUTINE SEE-INSIDE? (OBJ "OPTIONAL" (ONLY-IN <>))
<COND ;(<FSET? .OBJ ,INVISIBLE> <RFALSE>) ;"for LIT? - PLAYER"
(<FSET? .OBJ ,TRANSBIT> <RTRUE>)
(<FSET? .OBJ ,OPENBIT> <RTRUE>)
(.ONLY-IN <RFALSE>)
(<FSET? .OBJ ,SURFACEBIT> <RTRUE>)>>
<ROUTINE ARENT-TALKING ()
<SETG CLOCK-WAIT T>
<TELL "(You aren't talking to anyone!)" CR>>
<ROUTINE ALREADY (OBJ "OPTIONAL" (STR <>))
<SETG CLOCK-WAIT T>
<TELL !\(>
<COND ;(<NOUN-USED? ,W?DOOR> ;"confusing in secret passage"
<TELL "The door">)
(T <TELL CTHE .OBJ>)>
<COND (<EQUAL? .OBJ ,PLAYER> <TELL " are">)
(T <TELL " is">)>
<TELL " already ">
<COND (.STR <TELL .STR "!)" CR>)>
<RTRUE>>
<ROUTINE NOT-CLEAR-WHOM ()
<SETG QUOTE-FLAG <>>
<SETG P-CONT <>>
<TELL "[It's not clear whom you're talking to.]"
;"[To talk to someone, type their name, then a comma, then what you want
them to do.]" CR>>
<ROUTINE OKAY ("OPTIONAL" (OBJ <>) (STR <>))
<COND (<EQUAL? ,WINNER ,PLAYER ,BUTLER>
<COND (<VERB? THROUGH WALK WALK-TO>
<RTRUE>)>)
(T <TELL "\"">)>
<TELL "Okay">
<COND (.OBJ
<TELL !\, HE .OBJ>
<COND (.STR <TELL " is now " .STR>)>
<COND (<=? .STR "on"> <FSET .OBJ ,ONBIT>)
(<=? .STR "off"> <FCLEAR .OBJ ,ONBIT>)
(<=? .STR "open"> <FSET .OBJ ,OPENBIT>)
(<=? .STR "closed"> <FCLEAR .OBJ ,OPENBIT>)
(<=? .STR "locked"> <FSET .OBJ ,LOCKED>)
(<=? .STR "unlocked"> <FCLEAR .OBJ ,LOCKED>)>)>
<COND (<OR .STR <NOT .OBJ>>
<COND (<NOT <==? ,WINNER ,PLAYER>>
<TELL ",\" says " 'WINNER ". " CHE ,WINNER " does so."CR>
<RTRUE>)>
<TELL "." CR>)>
<COND (<AND <ZERO? ,LIT>
<T? <SETG LIT <LIT? ;,HERE>>>>
<CRLF>
<V-LOOK>)>
<RTRUE>>
<ROUTINE TOO-BAD-BUT ("OPTIONAL" (OBJ <>) (STR <>))
<TELL "Too bad, but">
<COND (.OBJ
<TELL HE .OBJ>)>
;<THIS-IS-IT .OBJ>
<COND (.STR
<TELL " is " .STR>
<COND (<EQUAL? .STR "angry" "peeved">
<TELL " with you">)>
<TELL "." CR>)>
<RTRUE>>
<ROUTINE TOO-DARK () ;("OPTIONAL" (OBJ 0)) <TELL "(It's too dark to see!)" CR>>
"<ROUTINE NOT-ACCESSIBLE? (OBJ)
<COND (<EQUAL? <META-LOC .OBJ> ,WINNER ,HERE ,GLOBAL-OBJECTS> <RFALSE>)
(<VISIBLE? .OBJ> <RFALSE>)
(T <RTRUE>)>>"
<ROUTINE VISIBLE? ;"can player SEE object?"
(OBJ "AUX" H L (X <>))
<COND (<NOT .OBJ> <RFALSE>)
(<ACCESSIBLE? .OBJ> <RTRUE>)>
<SET X <CORRIDOR-LOOK .OBJ>>
<COND (<NOT <ZERO? .X>>
<RETURN T ;.X>)>
<SET L <LOC .OBJ>>
<COND (<SEE-INSIDE? .L>
<VISIBLE? .L>)>>
<ROUTINE ACCESSIBLE? (OBJ "AUX" L) ;"can player TOUCH object?"
<COND (<NOT .OBJ> <RFALSE>)
(T <SET L <LOC .OBJ>>)>
<COND (<FSET? .OBJ ,INVISIBLE>
<RFALSE>)
(<EQUAL? .OBJ ,PSEUDO-OBJECT>
<COND (<EQUAL? ,LAST-PSEUDO-LOC ,HERE>
<RTRUE>)
(T
<RFALSE>)>)
;(<EQUAL? .OBJ ,CAR>
<COND (<EQUAL? <GETP ,CAR ,P?STATION> ,HERE>
<RTRUE>)
(T
<RFALSE>)>)
(<NOT .L>
<RFALSE>)
(<EQUAL? .L ,GLOBAL-OBJECTS>
<RTRUE>)
;(<EQUAL? .L ,ROOMS>
<RETURN <SEE-INTO? .OBJ <>>>)
(<EQUAL? .L ,LOCAL-GLOBALS>
<RETURN <GLOBAL-IN? .OBJ ,HERE>>)
(<NOT <EQUAL? <META-LOC .OBJ> ,HERE>>
<RFALSE>)
(<EQUAL? .L ,WINNER ,HERE>
<RTRUE>)
(<OR <FSET? .L ,OPENBIT>
<FSET? .L ,SURFACEBIT>
<FSET? .L ,PERSONBIT>>
<ACCESSIBLE? .L>)
(T
<RFALSE>)>>
<ROUTINE META-LOC (OBJ "OPTIONAL" (INV <>) "AUX" L)
<SET L <LOC .OBJ>>
<REPEAT ()
<COND (<NOT .L>
<RFALSE>)
(<EQUAL? .L ;,POCKET ,NOW-WEARING>
<RETURN ,HERE>)
(<EQUAL? .L ,LOCAL-GLOBALS ,GLOBAL-OBJECTS>
<RETURN .L>)
(<IN? .OBJ ,ROOMS>
<RETURN .OBJ>)
(T
<COND (<AND .INV <FSET? .OBJ ,INVISIBLE>>
<RFALSE>)>
<SET OBJ .L>
<SET L <LOC .OBJ>>)>>>
<CONSTANT WHO-CARES-LENGTH 4>
<GLOBAL WHO-CARES-VERB
<PLTABLE "do" "do" "let" "seem">>
<GLOBAL WHO-CARES-TBL
<PLTABLE "n't appear interested"
"n't care"
" out a loud yawn"
" impatient">>
<ROUTINE WHO-CARES ("AUX" N)
<SET N <RANDOM ,WHO-CARES-LENGTH>>
<HE-SHE-IT ,PRSO T <GET ,WHO-CARES-VERB .N>>
<TELL <GET ,WHO-CARES-TBL .N> "." CR>>
<GLOBAL YUKS
<LTABLE 0
"That's ridiculous!"
"Surely you jest."
;"Not a chance."
"Don't be silly."
"Not bloody likely."
;"What a fruitcake!"
"What a concept!"
;"What a screwball!"
"Like, totally grody, for sure."
"You can't be serious!">>
" "
"SUBTITLE REAL VERBS"
<ROUTINE PRE-SAIM () <PERFORM ,V?AIM ,PRSI ,PRSO> <RTRUE>>
<ROUTINE V-SAIM () <V-FOO>>
<ROUTINE V-AIM () <YOU-CANT ;"aim">>
<ROUTINE PRE-SANALYZE () <PERFORM ,V?ANALYZE ,PRSI ,PRSO> <RTRUE>>
<ROUTINE V-SANALYZE () <V-FOO>>
<ROUTINE PRE-ANALYZE ()
<COND (<ROOM-CHECK>
<RTRUE>)
(<OR <FSET? ,PRSO ,PERSONBIT> ;<EQUAL? ,PRSO ,YOU ,ME>>
<SETG CLOCK-WAIT T>
<TELL "(Leave that to the police.)" CR>)
;(<AND <EQUAL? ,PRSI ,FINGERPRINTS>
<NOT <EQUAL? <META-LOC ,PRINT-KIT> ,HERE>>>
<NOT-HERE ,PRINT-KIT>
<RTRUE>)>>
<ROUTINE V-ANALYZE ()
<COND ;(<EQUAL? ,PRSI ,FINGERPRINTS>
<TELL "You don't find any interesting prints." CR>
<RTRUE>)
(<FSET? ,PRSO ,PERSONBIT> <TELL "How?" CR>)
;(<FSET? ,PRSO ,LIGHTBIT> <CHECK-ON-OFF>)
(<FSET? ,PRSO ,DOORBIT> <CHECK-DOOR ,PRSO>)
(T <TELL CHE ,PRSO look " normal." CR> ;<YOU-CANT "check">)>>
<ROUTINE V-ANSWER ()
<COND (<T? ,AWAITING-REPLY>
<COND (<EQUAL? <GET ,P-LEXV ,P-CONT> ,W?YES>
<PERFORM ,V?YES>)
(T ;<EQUAL? <GET ,P-LEXV ,P-CONT> ,W?NO>
<PERFORM ,V?NO>)>)
(T <NOT-CLEAR-WHOM>
;<TELL "Nobody is waiting for an answer." CR>)>
<SETG P-CONT <>>
<SETG QUOTE-FLAG <>>
<RTRUE>>
<ROUTINE V-REPLY ()
<SETG P-CONT <>>
<SETG QUOTE-FLAG <>>
<COND (<AND <FSET? ,PRSO ,PERSONBIT>
<NOT <FSET? ,PRSO ,MUNGBIT>>>
<WAITING-FOR-YOU-TO-SPEAK>)
(T <YOU-CANT ;"answer">)>>
<ROUTINE WAITING-FOR-YOU-TO-SPEAK ()
<TELL CHE ,PRSO seem " to be waiting for you to speak." CR>>
<GLOBAL EVIDENCE-FOUND:OBJECT <>>
<ROUTINE PRE-ARREST ()
<COND (<EQUAL? ,PRSI ,ROOMS>
<SETG PRSI <>>)>
<COND (<OR <NOT <FSET? ,PRSO ,PERSONBIT>>
;,PRSI>
<SETG CLOCK-WAIT T>
<TELL
"(Are you sure you're a" ,FAMOUS-YOUNG-DETECTIVE "? Arresting " A ,PRSO "?!)"
CR>)
(<T? ,CONFESSED>
<ALREADY ,CONFESSED "arrested">)
(<NOT <ZERO? ,LIONEL-SPEAKS-COUNTER>>
<TELL-BAD-FORM>
<RTRUE>)
(<NOT <DOBJ? GHOST-NEW>>
<UNSNOOZE ,PRSO>
<RFALSE>)>>
<ROUTINE TELL-BAD-FORM ()
<SETG CLOCK-WAIT T>
<TELL "(Bad form">
<IAN-CALLS-YOU>
<TELL ". Wait until after dinner.)" CR>>
<GLOBAL FAMOUS-YOUNG-DETECTIVE " famous young detective">
<GLOBAL CONFESSED:OBJECT <>>
<GLOBAL CAPTOR:OBJECT <>>
<ROUTINE V-ARREST ()
<COND (<1? <QUEUED? ,I-SHOT>>
<RTRUE>) ;"I-SHOT will respond"
(<AND <==? ,VARIATION <GETP ,PRSO ,P?CHARACTER>>
;<T? <GET ,FOUND-COSTUME ,PLAYER-C>>
<T? ,EVIDENCE-FOUND>>
<CONFESSION ,PRSO>)
(T
<SETG CLOCK-WAIT T>
<TELL
"(It would be difficult to convict" HIM ,PRSO " with the evidence you've found.
If you hope
to put the culprit behind bars, you'll need more convincing proof.)"
;" to solve this case so conclusively that the police will be able"
CR>)>>
<ROUTINE CONFESSION (PER "AUX" P (DEAD <>))
<SETG CONFESSED .PER>
<PUTP .PER ,P?LINE 2> ;"angry"
;<QUEUE I-SEARCH 0>
<COND (<AND <T? ,TREASURE-FOUND>
<T? <GET ,FOUND-COSTUME ,PLAYER-C>>>
<SET P ,BUTLER>)
(<==? ,VARIATION ,LORD-C>
<SET P ,DOCTOR>)
(T <SET P ,LORD>)>
<SETG CAPTOR .P>
<UNSNOOZE .P T>
<PUTP .P ,P?LDESC 9 ;"waiting patiently">
<COND (<AND <FSET? .PER ,MUNGBIT>
<ZERO? <UNSNOOZE .PER>>>
<SET DEAD T>)
(T
<COND (<OR <ZERO? <GET ,TOLD-ABOUT-EVID
<GETP .PER ,P?CHARACTER>>>
<FIND-FLAG-HERE ,PERSONBIT ,PLAYER .PER>>
<TELL
"At first" HE .PER " denies everything, but when you tell about" THE
,EVIDENCE-FOUND "," HE .PER>)
(T <TELL CHE .PER>)>
<TELL " rushes at you! ">
<PUT <GT-O .PER> ,GOAL-FUNCTION ,NULL-F>)>
<TELL "Suddenly ">
<TELL D .P>
<COND (<NOT <IN? .P ,HERE>>
<MOVE .P ,HERE>
<PUT <GT-O .P> ,GOAL-ENABLE 0>
<TELL " appears and">)>
<COND (<ZERO? .DEAD>
<TELL
" grabs" HIM .PER " from behind, saying, \"I'll guard this villain for
you.\" Then " D .PER " glares at you and confesses to ">)
(T <TELL
" agrees that" THE ,EVIDENCE-FOUND " proves " D .PER " guilty of ">)>
<COND (<EQUAL? .PER ,FRIEND>
<TELL "fraud.|">)
(T
<COND ;(<EQUAL? .PER ,LORD>
<TELL "double ">)
(<EQUAL? .PER ,PAINTER>
<TELL "attempted ">)>
<TELL "murder.|">)>
<COND (<ZERO? .DEAD>
<PUTP .PER ,P?LDESC 20 ;"ignoring you">)>
<COND (<AND <T? ,TREASURE-FOUND>
<T? <GET ,FOUND-COSTUME ,PLAYER-C>>>
<WRAP-UP>
<FINISH>)>
<RTRUE>>
<ROUTINE WRAP-UP ()
<TELL "|
(Congratulations, "TN"! Would you like to read the authors' version of
the crime?)">
<COND (<NOT <YES?>>
<TELL "Okay." CR>)
(<EQUAL? ,VARIATION ,LORD-C>
<TELL
'LORD " murdered Lionel in order to inherit the title and castle.|"
'LOVER " was blackmailing " 'LORD " to marry her, because she knew he
was plotting to kill Lionel. So Jack tried to do away with her, too, by
dumping her down the well.|
But Jack was wrong in thinking he killed " 'LOVER ". She survived and
came back to the castle at night -- to play on " 'FRIEND "'s nerves,
since her arrival seemed to be part of Jack's plot; to hunt for proof
that Jack murdered Lionel; and to try to frame him for her own
\"murder\" by planting" THE ,JEWEL " in his trouser cuff, until she lost
it in the " 'DRAWING-ROOM "." CR>)
(<EQUAL? ,VARIATION ,FRIEND-C>
<TELL
'FRIEND " doubted that she could hold " 'LORD "'s love. She was both
jealous and fearful of " 'DEB " as a rival who might someday take Jack
away from her. So she tried to defame " 'DEB " by making it appear "
'DEB " was a vengeful ghost bent on killing Jack's new love, " 'FRIEND
". " 'LOVER "'s death was purely an accident." CR>)
(<EQUAL? ,VARIATION ,DOCTOR-C>
<TELL
'LOVER " strongly suspected that her grandfather died because of " 'DOCTOR
"'s fiendish experiments on his patients. So she wrote a letter to
Lionel, begging him to use his influence to investigate " 'DOCTOR ", which
he did. However, " 'DOCTOR " found out what they were up to, and silenced
both of them.|
He has masqueraded as a ghost to cover his midnight searches for the "
'ARTIFACT ". He intended the attacks on " 'FRIEND " to create the belief that
" 'LOVER " might still be alive." CR>)
(T ;<EQUAL? ,VARIATION ,PAINTER-C>
<TELL
'PAINTER " was intensely attached to " 'LOVER ", and
she jealously hated " 'LORD " for coming between them. When " 'LOVER "
accidentally fell down the well, " 'PAINTER " was convinced that she had
committed suicide because she felt abandoned by Jack.|
So " 'PAINTER " began her vengeful ghostly masquerade -- to find proof
that Jack was responsible for " 'LOVER "'s death, to prick his guilty
conscience and make him confess, and to terrorize " 'FRIEND ", who
replaced " 'LOVER " in Jack's affections." CR>)>>
;<ROUTINE PRE-ASK () <PRE-ASK-ABOUT>>
<ROUTINE V-ASK ()
<COND (<AND <T? ,P-CONT>
<FSET? ,PRSO ,PERSONBIT>
<NOT <FSET? ,PRSO ,MUNGBIT>>>
<SETG WINNER ,PRSO>
<SETG QCONTEXT ,PRSO>)
(T <V-ASK-ABOUT>)>>
<ROUTINE PRE-ASK-ABOUT ()
<COND (<DOBJ? BUST CREW-GLOBAL JACK-TAPE MUSIC OCEAN PIANO
PLAYER-NAME RECORDER VOICE>
<RFALSE>)
(<AND <DOBJ? COUSIN>
<IN? ,BUST ,HERE>>
<RETURN <DO-INSTEAD-OF ,BUST ,COUSIN>>)
(<AND <NOT <EQUAL? <META-LOC ,PRSO> ,HERE>>
<NOT <GLOBAL-IN? ,PRSO ,HERE>>>
<NOT-HERE ;-PERSON ,PRSO>
<RFATAL>)
(<OR <DOBJ? PLAYER>
;<DOBJ? COUSIN MAID GHOST-OLD>
<NOT <FSET? ,PRSO ,PERSONBIT>>
;<FSET? ,PRSO ,MUNGBIT>>
<COND (<AND <VERB? $CALL> <ZERO? ,P-CONT>>
<MISSING "verb">
<RFATAL>)
(<NOT <VERB? LISTEN>>
<WONT-HELP-TO-TALK-TO ,PRSO>
<RFATAL>)>)
(<NOT <GRAB-ATTENTION ,PRSO ,PRSI>>
<RFATAL>)>>
;<ROUTINE NOT-HERE-PERSON (PER "AUX" L)
<SETG CLOCK-WAIT T>
<TELL !\( CTHE .PER " isn't ">
<COND (<VISIBLE? .PER>
<TELL "close enough">
<COND (<SPEAKING-VERB?> <TELL " to hear you">)>
<TELL !\.>)
(T <TELL "here!">)>
<TELL ")" CR>>
<ROUTINE V-ASK-ABOUT ()
<COND (<OR <NOT <FSET? ,PRSO ,PERSONBIT>>
<FSET? ,PRSO ,MUNGBIT>>
<WONT-HELP-TO-TALK-TO ,PRSO>
<RFATAL>)
(<AND <VERB? ASK> <NOT <==? ,PRSO ,PLAYER>>>
<TELL "\"Ask me about something in particular.\"" CR>)
(T
<TELL CHE ,PRSO do "n't know anything interesting about">
<COND (<ZERO? ,PRSI> <TELL " that">)
(T <TELL THE ,PRSI>)>
<TELL "." CR>)>>
<ROUTINE WONT-HELP-TO-TALK-TO (OBJ)
;<VERB-PRINT>
<TELL
"You talk to" THE .OBJ " for a minute before you realize that" HE .OBJ
" won't respond." CR>>
<ROUTINE PRE-ASK-CONTEXT-ABOUT ("OPTIONAL" (V 0) "AUX" P)
<COND (<ZERO? .V> <SET V ,V?ASK-ABOUT>)>
<COND (<QCONTEXT-GOOD?>
<PERFORM .V ,QCONTEXT ,PRSO>
<RTRUE>)
(<SET P <FIND-FLAG-HERE-NOT ,PERSONBIT ,MUNGBIT ,WINNER>>
<TELL-I-ASSUME .P " Ask">
<PERFORM .V .P ,PRSO>
<RTRUE>)>>
<ROUTINE V-ASK-CONTEXT-ABOUT () <ARENT-TALKING>>
;<ROUTINE PRE-ASK-FOR () <PRE-ASK-ABOUT>>
<ROUTINE V-ASK-FOR ()
<COND (<AND <FSET? ,PRSO ,PERSONBIT>
<NOT <FSET? ,PRSO ,MUNGBIT>>
<NOT <==? ,PRSO ,PLAYER>>>
<TELL CTHE ,PRSO>
<COND (<IN? ,PRSI ,PRSO>
<MOVE ,PRSI ,WINNER>
<FSET ,PRSI ,TAKEBIT>
<FSET ,PRSI ,TOUCHBIT>
<FCLEAR ,PRSI ,NDESCBIT>
<FCLEAR ,PRSI ,SECRETBIT>
<TELL " hands you" THE ,PRSI>
<FSET ,PRSI ,SEENBIT>
<TELL "." CR>)
(T <TELL " doesn't have" THE ,PRSI "." CR>)>)
(T <HAR-HAR>)>>
<ROUTINE PRE-ASK-CONTEXT-FOR ("AUX" P)
<COND (<FSET? <SET P <LOC ,PRSO>> ,PERSONBIT>
<PERFORM ,V?ASK-FOR .P ,PRSO>
<RTRUE>)
(T <PRE-ASK-CONTEXT-ABOUT ,V?ASK-FOR>)>>
<ROUTINE V-ASK-CONTEXT-FOR () <ARENT-TALKING>>
<ROUTINE V-ATTACK () <IKILL "attack">>
<ROUTINE V-BOW ("AUX" P)
<SET P ,PRSO>
<COND (<ZERO? .P>
<SET P <FIND-FLAG-HERE-NOT ,PERSONBIT ,MUNGBIT ,WINNER>>
<COND (<ZERO? .P>
<TELL "No one notices." CR>
<RTRUE>)>)>
<COND (<OR <NOT <FSET? .P ,PERSONBIT>>
<EQUAL? .P ,PLAYER>>
<HAR-HAR>)
(<NOT <GRAB-ATTENTION .P>>
<RTRUE>)
(T
<TELL CHE .P !\ >
<COND (<FSET? .P ,FEMALE> <TELL "curtsey">) (T <TELL "bow">)>
<TELL "s back to you." CR>)>>
;<ROUTINE PRE-BRING ()
<COND (<AND <NOT <EQUAL? ,PRSI <> ,PLAYER ,GLOBAL-HERE>>
<NOT <EQUAL? ,PRSI ,PLAYER-NAME>>>
<DONT-UNDERSTAND>)>>
;<ROUTINE V-BRING () <V-TAKE> ;<YOU-CANT ;"bring">>
;<ROUTINE PRE-SBRING () <PERFORM ,V?BRING ,PRSI ,PRSO> <RTRUE>>
;<ROUTINE V-SBRING () <V-FOO>>
<ROUTINE PRE-BRUSH ()
<COND (<AND <DOBJ? ROOMS>
<NOT <EQUAL? ,P-PRSA-WORD ,W?SCRAPE ,W?SCRATCH>>>
<SETG PRSO ,WINNER>
<RFALSE>)>>
<GLOBAL AHHH "Ahhh! How refreshing!|">
<ROUTINE V-BRUSH ()
<COND (<OR <NOT <EQUAL? ,P-PRSA-WORD ,W?SCRAPE ,W?SCRATCH>>
<FSET? ,PRSO ,PERSONBIT>>
<COND (<EQUAL? ,HERE ,YOUR-BATHROOM ,KITCHEN>
<COND (<DOBJ? HANDS HEAD PLAYER ;ROOMS>
<SETG WASHED T>
<TELL ,AHHH>)
(<FSET? ,PRSO ,PERSONBIT>
<FACE-RED>)
(T <UNCLEAN>)>)
(T <TELL-FIND-NONE "a sink">)>)
(T <UNCLEAN>)>>
<ROUTINE UNCLEAN ()
<TELL
"You try for a minute and then decide it's an endless task." CR>>
;<ROUTINE PRE-BURN ()
<COND (<ZERO? ,PRSI>
<TELL-NO-PRSI>)
;(<EQUAL? ,PRSI ,LIGHTER>
<RFALSE>)
(T
<SETG CLOCK-WAIT T>
<TELL "(With a " D ,PRSI "??!?)" CR>)>>
;<ROUTINE V-BURN () <YOU-CANT>>
<ROUTINE REMOVE-CAREFULLY ("OPTIONAL" (OBJ <>) "AUX" OLIT)
<SET OLIT ,LIT>
<COND (<T? .OBJ>
<NOT-IT .OBJ>
<MOVE .OBJ ,LOCAL-GLOBALS>)>
<SETG LIT <LIT? ;,HERE>>
<COND (<AND <T? .OLIT> <ZERO? ,LIT>>
<TELL "You are left in the dark..." CR>)>
T>
;<ROUTINE PRE-$CALL () <PRE-ASK-ABOUT>>
<ROUTINE V-$CALL () ;("AUX" (MOT <>))
<UNSNOOZE ,PRSO>
<COND (<FSET? ,PRSO ,PERSONBIT>
<COND (<==? <META-LOC ,PRSO> ,HERE>
<COND (<GRAB-ATTENTION ,PRSO>
;<FCLEAR ,PRSO ,TOUCHBIT>
<PUTP ,PRSO ,P?LDESC 12 ;"listening to you">
<TELL CTHE ,PRSO>
<COND ;(.MOT
<TELL
V ,PRSO stop " and" V ,PRSO turn " toward you." CR>)
(T <TELL
" is " <GET ,LDESC-STRINGS 12> ;"listening to you" "." CR>)>)
(T
;<TELL " ignores you." CR>
<RFATAL>)>)
(<CORRIDOR-LOOK ,PRSO>
<COND ;(<COR-GRAB-ATTENTION ;,PRSO>
<RTRUE>)
(T
<TELL CTHE ,PRSO " ignores you." CR>)>)
(T <NOT-HERE ,PRSO>)>)
(T <SETG CLOCK-WAIT T> <MISSING "verb">)>>
<ROUTINE V-CHASTISE ()
<COND (<NOT <EQUAL? ,PRSO ,INTDIR>>
<TELL
,I-ASSUME " Look at" HIM ,PRSO ", not look in" HIM ,PRSO " nor look for"
HIM ,PRSO " nor any other preposition.]" CR>)>
<PERFORM ,V?EXAMINE ,PRSO>
<RTRUE>>
<ROUTINE V-BOARD ()
<COND (<OR <IN? ,PRSO ,ROOMS> <FSET? ,PRSO ,DOORBIT>>
<V-THROUGH>)
(<AND <FSET? ,PRSO ,VEHBIT>
;<FSET? ,PRSO ,CONTBIT>>
;<V-SIT T>
<COND (<IN? ,WINNER ,PRSO>
<ALREADY ,PLAYER>
<TELL "in" THE ,PRSO ".)" CR>)
(T
<MOVE ,WINNER ,PRSO>
<TELL "You are now ">
<COND (<FSET? ,PRSO ,SURFACEBIT>
<TELL "on">)
(T <TELL "in">)>
<TELL THE ,PRSO "." CR>
;<APPLY <GETP ,PRSO ,P?ACTION> ,M-ENTER>
<RTRUE>)>)
(T <YOU-CANT "get in">)>>
<ROUTINE V-CLIMB-ON ()
<PERFORM ,V?SIT ,PRSO>
<RTRUE>>
<ROUTINE V-CLIMB-UP ("OPTIONAL" (DIR ,P?UP) (OBJ <>) "AUX" X)
<COND (<IN? ,PRSO ,ROOMS> ;"GO UP TO room"
<PERFORM ,V?WALK-TO ,PRSO>
<RTRUE>)
(<GETPT ,HERE .DIR>
<DO-WALK .DIR>
<RTRUE>)
(<NOT .OBJ>
<YOU-CANT "go">)
(ELSE <HAR-HAR>)>>
<ROUTINE V-CLIMB-DOWN () <V-CLIMB-UP ,P?DOWN>>
<ROUTINE V-CLOSE ()
<COND (<NOT <OR <FSET? ,PRSO ,CONTBIT>
<FSET? ,PRSO ,DOORBIT>
<EQUAL? ,PRSO ,WINDOW>>>
<YOU-CANT ;"close">)
(<OR <FSET? ,PRSO ,DOORBIT>
<EQUAL? ,PRSO ,WINDOW>>
<COND (<FSET? ,PRSO ,OPENBIT>
<COND ;(<FSET? ,PRSO ,MUNGBIT>
<TELL
"It won't stay closed. The latch is broken." CR>)
(T
<OKAY ,PRSO "closed">)>)
(T <ALREADY ,PRSO "closed">)>)
(<AND <NOT <FSET? ,PRSO ,SURFACEBIT>>
<NOT <0? <GETP ,PRSO ,P?CAPACITY>>>>
<COND (<FSET? ,PRSO ,OPENBIT>
<OKAY ,PRSO "closed">)
(T <ALREADY ,PRSO "closed">)>)
(T <YOU-CANT ;"close">)>>
<ROUTINE PRE-COMPARE ()
<COND (<AND <ZERO? ,PRSI>
<==? 1 <GET/B ,P-PRSO ,P-MATCHLEN>>>
<SETG CLOCK-WAIT T>
<TELL "[Oops! Try: COMPARE IT TO" ,SOMETHING>
<RTRUE>)
(<==? 2 <GET/B ,P-PRSO ,P-MATCHLEN>>
<PUT/B ,P-PRSO ,P-MATCHLEN 1>
<PERFORM ,PRSA <GET/B ,P-PRSO 1> <GET/B ,P-PRSO 2>>
<RTRUE>)>>
<ROUTINE V-COMPARE ()
<COND (<==? ,PRSO ,PRSI> <TELL "They're the same thing!" CR>)
(T
<COND (<EQUAL? ,PLAYER ,PRSO ,PRSI>
<TELL "You">)
(T <TELL "They">)>
<TELL "'re not a bit alike." CR>)>>
<ROUTINE V-CONFRONT ()
<COND (<==? ,PRSO ,PLAYER>
<ARENT-TALKING>)
(<NOT <FSET? ,PRSO ,PERSONBIT>>
<TELL "Wow! That ought to put a scare into" HIM ,PRSO "!" CR>)
(T <WHO-CARES>)>>
;<ROUTINE V-COUNT () <TELL "Uhhh... ONE!" CR>>
;<ROUTINE V-CUT () <YOU-CANT ;"cut">>
<ROUTINE V-MUNG ()
<COND (<AND <FSET? ,PRSO ,DOORBIT> <ZERO? ,PRSI>>
<COND (<FSET? ,PRSO ,OPENBIT>
<TELL
"You'd fly through the open door if you tried." CR>)
(<UNLOCK-DOOR? ,PRSO>
<TELL "Why don't you just open it instead?" CR>)
(T <IF-SPY>)>)
(<NOT <FSET? ,PRSO ,PERSONBIT>>
<IF-SPY>)
(T <IKILL "hurt">)>>
<ROUTINE V-DANCE ("AUX" OW)
<COND (<AND <NOT <EQUAL? ,WINNER ,PLAYER>>
<EQUAL? ,PRSO ;<> ,PLAYER>>
<SET OW ,WINNER>
<SETG WINNER ,PLAYER>
<PERFORM ,V?DANCE .OW>
<SETG WINNER .OW>
<RTRUE>)
;(<ZERO? ,PRSO>
<TELL "You dance by " 'PLAYER " for a minute." CR>)
(<NOT <FSET? ,PRSO ,PERSONBIT>>
<HAR-HAR>)
(<IN-MOTION? ,PRSO>
<TOO-BAD-BUT ,PRSO "too busy">
;<TELL CHE ,PRSO " seems too busy to dance right now." CR>)
(<OR <AND <ZERO? ,GENDER-KNOWN>
<EQUAL? ,WINNER ,PLAYER>>
<AND <NOT <FSET? ,WINNER ,FEMALE>>
<FSET? ,PRSO ,FEMALE>>
<AND <FSET? ,WINNER ,FEMALE>
<NOT <FSET? ,PRSO ,FEMALE>>>>
<TELL CHE ,WINNER dance " with" HIM ,PRSO " for a minute." CR>)
(T <TELL CHE ,PRSO " doesn't fancy a dance with you." CR>)>>
<ROUTINE PRE-DESCRIBE ()
<COND (<==? ,WINNER ,PLAYER>
<COND (<EQUAL? ,PRSI <> ,ROOMS>
<COND (<QCONTEXT-GOOD?>
<SETG WINNER ,QCONTEXT>
<PERFORM ,PRSA ,PRSO>
<RTRUE>)
(T <ARENT-TALKING>)>)
(T
<PERFORM ,V?TELL-ABOUT ,PRSI ,PRSO>
<RTRUE>)>)>>
<ROUTINE V-DESCRIBE () <V-FOO>>
;<ROUTINE V-DIAGNOSE ()
<COND (<T? ,PRSO> <YOU-CANT ;"diagnose">)
(T <TELL CHE ,WINNER is " wide awake and in good health." CR>)>>
;<ROUTINE PRE-DISCUSS ()
<COND (<ZERO? ,PRSI> <SETG PRSI ,PLAYER>)>
<PERFORM ,V?TELL-ABOUT ,PRSI ,PRSO>
<RTRUE>>
;<ROUTINE V-DISCUSS () <V-FOO>>
<ROUTINE V-UNDRESS ()
<COND (<EQUAL? ,PRSO ,ROOMS ,PLAYER>
<COND (<ZERO? ,NOW-WEARING>
<ALREADY ,PLAYER "undressed">)
(T
<SETG PRSO <>>
<V-WEAR>)>)
(<FSET? ,PRSO ,PERSONBIT>
<COND (<FSET? ,PRSO ,MUNGBIT>
<SETG CLOCK-WAIT T>
<TELL "(Not in a family story!)" CR>)
(T <FACE-RED>)>)
(T <HAR-HAR>)>>
<ROUTINE V-DRESS ("AUX" X)
<COND (<DOBJ? ROOMS PLAYER>
<COND (<AND <ZERO? ,NOW-WEARING>
<EQUAL? ,PLAYER ,WINNER ,PRSO>>
<COND (<OR <SET X <FIND-FLAG ,WINNER ,WEARBIT>>
<SET X <FIND-FLAG ,HERE ,WEARBIT>>>
<TELL-I-ASSUME .X " Wear">
<PERFORM ,V?WEAR .X>
<RTRUE>)
(T
<SETG CLOCK-WAIT T>
<TELL "(You didn't say what to wear!)" CR>)>)
(T <ALREADY ,WINNER "dressed">)>)
(<FSET? ,PRSO ,PERSONBIT>
<ALREADY ,WINNER "dressed">)
(<FSET? ,PRSO ,WEARBIT>
<V-WEAR>
<RTRUE>)
(<SET X <FIND-OUTFIT>>
<TELL-I-ASSUME .X>
<SETG PRSO .X>
<V-WEAR>
<RTRUE>)
(T <HAR-HAR>)>>
<ROUTINE FIND-OUTFIT ("AUX" X)
<OR <FIND-FLAG ,WINNER ,WEARBIT ,NOW-WEARING>
<FIND-FLAG-HERE ,WEARBIT>
<FIND-OUTFIT-IN ,LUGGAGE>
<FIND-OUTFIT-IN ,BED>
<FIND-OUTFIT-IN ,CHEST-OF-DRAWERS>
<FIND-OUTFIT-IN ,WARDROBE>>>
<ROUTINE FIND-OUTFIT-IN (OBJ "AUX" X)
<COND (<AND <==? <META-LOC .OBJ> ,HERE>
<SET X <FIND-FLAG .OBJ ,WEARBIT>>>
<COND (<NOT <FSET? .OBJ ,OPENBIT>>
<FSET .OBJ ,OPENBIT>
<FIRST-YOU "open" .OBJ>)>
.X)>>
<ROUTINE V-CHANGE ("AUX" X)
<COND (<DOBJ? SLEEP-OUTFIT DINNER-OUTFIT
EXERCISE-OUTFIT TWEED-OUTFIT ROOMS ;CLOTHES>
<COND (<SET X <FIND-OUTFIT>>
<PERFORM ,V?WEAR .X>
<RTRUE>)
(<NOT <EQUAL? <META-LOC ,LUGGAGE> ,HERE>>
<TELL
"You look around for " D ,LUGGAGE " but don't find it." CR>)
(<SET X <FIND-FLAG ,LUGGAGE ,WEARBIT>>
<FSET ,LUGGAGE ,OPENBIT>
<PERFORM ,V?WEAR .X>
<RTRUE>)
(T <TELL "You can't find anything to change into."CR>)>)
(T <YOU-CANT ;"change">)>>
<ROUTINE PRE-DRIVE-TO ()
<COND (<NOT <DOBJ? CAR>>
<DONT-UNDERSTAND>)
(<NOT <EQUAL? <LOC ,WINNER> ;,HERE ,CAR>>
<TELL-NOT-IN ,CAR>
<RTRUE>)
(<IOBJ? INTDIR>
<DO-WALK ,P-DIRECTION>
<RTRUE>)
(T
<PERFORM ,V?WALK-TO ,PRSI>
<RTRUE>)>>
<ROUTINE TELL-NOT-IN (OBJ)
<SETG CLOCK-WAIT T>
<TELL !\( CHE ,WINNER is " not in" HIM .OBJ "!)" CR>>
<ROUTINE V-DRIVE-TO () <V-FOO>>
<ROUTINE V-DRINK () <YOU-CANT ;"drink">>
<ROUTINE V-DROP ("AUX" L)
<COND (<IDROP>
<COND (<OR <IN? <SET L ,TABLE-DINING> ,HERE>
<SET L <FIND-FLAG-HERE ,VEHBIT;,SURFACEBIT ,PRSO>>>
<MOVE ,PRSO .L>
<OKAY ,PRSO>
<TELL " is now on" THE .L "." CR>)
(T
<OKAY ,PRSO <GROUND-DESC>>)>)>>
<ROUTINE GROUND-DESC ()
<COND (<OR <NOT <OUTSIDE? ,HERE>>
<EQUAL? <LOC ,WINNER> ;,HERE ,CAR>>
"on the floor")
(T "on the ground")>>
<ROUTINE PRE-EAT ()
<COND (<EQUAL? ,PRSO <> ,ROOMS>
<COND (<EQUAL? <META-LOC ,DINNER> ,HERE>
;<SETG PRSO ,DINNER>
<PERFORM ,PRSA ,DINNER>
<RTRUE>)
(T
<NOT-HERE ,DINNER>
<RTRUE>)>)>>
<ROUTINE V-EAT () <TELL "It's hard to believe you're that hungry." CR>>
<ROUTINE PRE-EMPTY ()
<COND (<DOBJ? ROOMS>
<COND (<==? ,HERE <META-LOC ,LUGGAGE>>
<SETG PRSO ,LUGGAGE>) ;"works if LUGGAGE-F passes"
(T <NOT-HERE ,LUGGAGE> <RTRUE>)>)>
<COND (<DOBJ? POND>
<WONT-HELP>)
(<DOBJ? VIVIEN-BOX WENDISH-KIT>
<YOU-SHOULDNT>)
(<AND <NOT <DOBJ? BOTTLE>>
<NOT <FIRST? ,PRSO>>>
<ALREADY ,PRSO "empty">)
(<AND <T? ,PRSI>
<NOT <IN? ,PRSI ,ROOMS>>
<NOT <FSET? ,PRSI ,CONTBIT>>>
<TELL-FIND-NONE "an opening in" ,PRSI>
<RFATAL>)
(<AND <DOBJ? CAR>
<ZERO? ,PRSI>>
<PERFORM ,PRSA ,PRSO <LOC ,CAR>>
<RTRUE>)>>
<ROUTINE V-EMPTY ()
<COND ;(<AND <DOBJ? LUGGAGE>
<NOT <==? ,HERE ,YOUR-ROOM>>>
<TELL-FIND-NONE "a place for your stuff">)
(<FSET? ,PRSO ,CONTBIT>
<TELL CHE ,WINNER empti THE ,PRSO>
<COND (<ZERO? ,PRSI>
<COND (<AND <NOT <DOBJ? COFFIN>>
<SETG PRSI <FIND-FLAG-HERE ,CONTBIT ,PRSO>>>
<FSET ,PRSI ,OPENBIT>
<TELL " into" THE ,PRSI>)
(T
<SETG PRSI ,HERE>
<TELL !\ <GROUND-DESC>>)>)>
<TELL "." CR>
<COND (<AND <NOT <==? ,PRSI ,HERE>>
<G? <+ <WEIGHT ,PRSI> <WEIGHT ,PRSO>>
<GETP ,PRSI ,P?CAPACITY>>>
<TELL ,NOT-ENOUGH-ROOM>)
(T
<ROB ,PRSO ,PRSI>
<RTRUE>)>)
(T <YOU-CANT>)>>
<ROUTINE PRE-THROUGH ()
<COND (<DOBJ? ROOMS GLOBAL-HERE>
<DO-WALK ,P?IN>
<RTRUE>)
(<T? ,PRSI> ;"DRIVE CAR THRU object"
<COND (<DOBJ? CAR>
<COND (<EQUAL? <LOC ,WINNER> ;,HERE ,CAR>
<SETG PRSO ,PRSI>
<RFALSE>)
(T
<TELL-NOT-IN ,CAR>
<RTRUE>)>)
(T <DONT-UNDERSTAND>)>)>>
<ROUTINE V-THROUGH ;("OPTIONAL" (OBJ <>)) ("AUX" RM DIR)
<COND (<AND <OR <NOUN-USED? ,W?DOOR ,W?GATE ,W?HOLE>
<NOUN-USED? ,W?PANEL>>
;<FSET? ,PRSO ,DOORBIT>
<OR <FSET? ,PRSO ,OPENBIT>
<WALK-THRU-DOOR? <> ,PRSO <>>>>
<COND (<AND <SET RM <DOOR-ROOM ,HERE ,PRSO>>
<GOTO .RM>>
;<OKAY>
T)
(T
<V-FOO>
;<TELL
"(Sorry, but" THE ,PRSO " must be somewhere else.)" CR>)>)
(<IN? ,PRSO ,ROOMS>
<COND (<==? ,PRSO ,HERE>
<WALK-WITHIN-ROOM>)
(<SEE-INTO? ,PRSO <>>
<GOTO ,PRSO>)
(T <PERFORM ,V?WALK-TO ,PRSO>)>
<RTRUE>)
(<AND <FSET? ,PRSO ,VEHBIT>
;<FSET? ,PRSO ,CONTBIT>>
<PERFORM ,V?BOARD ,PRSO>
;<V-SIT T>)
(<FSET? ,PRSO ,PERSONBIT>
<HAR-HAR>)
(<AND ;<NOT .OBJ> <NOT <FSET? ,PRSO ,TAKEBIT>>>
<TELL CHE ,WINNER bang " into" THE ,PRSO>
<THIS-IS-IT ,PRSO>
<TELL " trying to go through" HIM ,PRSO "." CR>)
;(.OBJ <TELL "You can't do that!" CR>)
;(<IN? ,PRSO ,WINNER>
<TELL "You must think you're a contortionist!" CR>)
(ELSE <HAR-HAR>)>>
<ROUTINE PRE-EXAMINE () <ROOM-CHECK>>
<ROUTINE V-EXAMINE ("AUX" (TXT <>))
<COND (<OR <==? ,PRSO ,PSEUDO-OBJECT>
<AND <NOUN-USED? ,W?DOOR ;,W?DOORS ,W?PANEL ;,W?KEYHOLE>
<GLOBAL-IN? ,PRSO ,HERE>>>
<SET TXT T>)>
<COND (<DOBJ? INTDIR>
<SETG CLOCK-WAIT T>
<TELL "(If you want to see what's there, go there!)" CR>)
(<DOBJ? CASTLE HANDS HEAD OTHER-OUTFIT TOWER WALL LIGHT-GLOBAL>
<NOTHING-SPECIAL>)
;(<DOBJ? NOW-WEARING>
<TELL <GETP ,PRSO ,P?TEXT> CR>)
(<IN? ,PRSO ,GLOBAL-OBJECTS>
<NOT-HERE ,PRSO>
<RTRUE>)
(<AND <IN? ,PRSO ,ROOMS> ;<FSET? ,PRSO ,RLANDBIT>
<ZERO? .TXT>>
<ROOM-PEEK ,PRSO>)
(<AND <NOT <EQUAL? <META-LOC ,PRSO> ,HERE>>
<NOT <GLOBAL-IN? ,PRSO ,HERE>>
<ZERO? .TXT>>
<TOO-BAD-BUT ,PRSO "too far away">)
(<SET TXT <GETP ,PRSO ,P?TEXT>>
<TELL .TXT CR>)
(<FSET? ,PRSO ,DOORBIT>
<CHECK-DOOR ,PRSO>)
(<OR <FSET? ,PRSO ,CONTBIT>
<FSET? ,PRSO ,SURFACEBIT>
;<NOUN-USED? ,W?KEYHOLE>>
<V-LOOK-INSIDE>)
(T <NOTHING-SPECIAL>)>>
<ROUTINE NOTHING-SPECIAL ()
<TELL
"You look over" THE ,PRSO " for a minute and find nothing suspicious
-- for now." CR>>
<ROUTINE GLOBAL-IN? (OBJ1 OBJ2 "AUX" TBL (VAL <>))
<COND (<SET TBL <GETPT .OBJ2 ,P?GLOBAL>>
%<COND (<AND <GASSIGNED? PLUS-MODE> ,PLUS-MODE>
'<SET VAL <ZMEMQ .OBJ1 .TBL <RMGL-SIZE .TBL>>>)
(T
'<SET VAL <ZMEMQB .OBJ1 .TBL <RMGL-SIZE .TBL>>>)>)>
<COND (<AND <ZERO? .VAL> <EQUAL? .OBJ1 .OBJ2>>
<SET VAL T>)>
.VAL>
<ROUTINE V-FAINT ()
<TELL
CHE ,WINNER tri HIS ,WINNER " best, but" HE ,WINNER is " too excited." CR>>
;<ROUTINE PRE-FILL ()
<COND (<AND ,PRSI ;<NOT <EQUAL? ,PRSI ,GLOBAL-WATER>>>
<HAR-HAR>)>>
<ROUTINE V-FILL ()
<YOU-CANT>
;<TELL "You may know how to do that, but this story doesn't." CR>>
<ROUTINE PRE-FIND ()
<COND (<DOBJ? PLAYER PLAYER-NAME>
<RFALSE>)
(<AND <FSET? ,PRSO ,SECRETBIT>
<NOT <FSET? ,PRSO ,SEENBIT>>>
<NO-FUN>)
(<IN? ,PRSO ,ROOMS>
<COND (<==? ,PRSO ,HERE>
<ALREADY ,WINNER "here">)
(T
<PERFORM ,V?WALK-TO ,PRSO>
<RTRUE>)>)
(<AND <FSET? ,PRSO ,PERSONBIT>
;<NOT <==? ,PRSO ,OTHER-CHAR>>>
<COND (<AND <==? <META-LOC ,WINNER> <META-LOC ,PRSO>>
<NOT <FSET? ,PRSO ,NDESCBIT>>>
<BITE-YOU>
<RTRUE>)
(<NOT <FOLLOW-LOC?>>
<WHO-KNOWS? ,PRSO>
<RFATAL>)>
<RTRUE>)>>
<ROUTINE BITE-YOU ()
<TELL "If" HE ,PRSO " were any closer," HE ,PRSO "'d bite you!" CR>>
<ROUTINE FAR-AWAY? (L)
<COND (<ZERO? <GETP ,HERE ,P?LINE>>
<RTRUE>)
(<EQUAL? .L ,GLOBAL-OBJECTS>
<RTRUE>)
(<AND <FSET? .L ,SECRETBIT>
<NOT <FSET? .L ,SEENBIT>>>
<RTRUE>)
(<AND <EQUAL? .L ,YOUR-ROOM>
<EQUAL? ,HERE ,YOUR-BATHROOM>>
<RFALSE>)
(<AND <EQUAL? .L ,YOUR-BATHROOM>
<EQUAL? ,HERE ,YOUR-ROOM>>
<RFALSE>)
(<ZERO? <GETP .L ,P?LINE>>
<RTRUE>)
(<AND <NOT <FSET? ,FRIEND ,TOUCHBIT>>
<NOT <EQUAL? .L ,CAR ,DRIVEWAY ,COURTYARD>>>
<RTRUE>)
(<EQUAL? ,HERE ;,CAR ,DRIVEWAY>
<COND (<EQUAL? .L ,CAR ,DRIVEWAY>
<RFALSE>)
(<ZERO? <GETB ,LAST-NAME 0>>
<RTRUE>)>)>
<COND (<OR <AND <FSET? ,HERE ,SECRETBIT>
<NOT <FSET? .L ,SECRETBIT>>>
<AND <NOT <FSET? ,HERE ,SECRETBIT>>
<FSET? .L ,SECRETBIT>>>
<RETURN <NOT <SEE-INTO? .L <> ;T> ;<GLOBAL-IN? .L ,HERE>>>)>
<RFALSE>>
<ROUTINE V-FIND ("AUX" (L <LOC ,PRSO>))
<COND (<==? ,PRSO ,PLAYER>
<TELL "You're right here, ">
<TELL-LOCATION>
<CRLF>)
(<DOBJ? ;EYE HEAD HANDS>
<BITE-YOU>)
(<HELD? ,PRSO>
<TELL "You have it." CR>)
(<OR <FSET? ,PRSO ,SECRETBIT>
<==? ,PRSO ,ARTIFACT>>
<NO-FUN>)
(<VISIBLE? ,PRSO>
;<OR <GLOBAL-IN? ,PRSO ,HERE>
;<EQUAL? <META-LOC ,PRSO> ,HERE>
<IN? ,PRSO ,HERE>
<==? ,PRSO ,PSEUDO-OBJECT>>
<COND (<FSET? ,PRSO ,SECRETBIT>
<DISCOVER ,PRSO>)
(T <TELL "It's right here." CR>)>)
(<AND ;<NOT <FSET? ,PRSO ,TOUCHBIT>>
<NOT <FSET? ,PRSO ,SEENBIT>>
;<OR <IN? ,PRSO ,ROOMS>
;<FSET? ,PRSO ,PERSONBIT>
<FSET? ,PRSO ,SECRETBIT>>>
<NOT-HERE ,PRSO T>)
(<OR <EQUAL? .L ,GLOBAL-OBJECTS ,LOCAL-GLOBALS>
;<EQUAL? ,PRSO ,DRAPES>>
<TELL "It's around somewhere." CR>)
(<FAR-AWAY? <META-LOC ,PRSO>>
<TELL "It's far away from here." CR>)
(<FSET? .L ,PERSONBIT>
<THIS-IS-IT .L>
<TELL CTHE .L " probably has it." CR>)
(<OR <FSET? .L ,SURFACEBIT>
<FSET? .L ,CONTBIT>
<IN? .L ,ROOMS>>
<THIS-IS-IT .L>
<TELL "It's probably ">
<COND (<FSET? .L ,SURFACEBIT> <TELL "on">) (T <TELL "in">)>
<TELL THE .L "." CR>)
(ELSE
<TELL "It's nowhere in particular." CR>)>>
<ROUTINE NO-FUN ()
<SETG CLOCK-WAIT T>
<TELL "(If it's that easy, it spoils the fun!)" CR>>
<ROUTINE TELL-LOCATION ("AUX" DIR)
;<COND (<EQUAL? ,HERE ,UNCONSCIOUS>
<TELL "unconscious.">
<RTRUE>)>
<COND (<NOT <IN? ,PLAYER ,HERE>>
<TELL "sitting ">)>
;<COND (<ZERO? ,PLAYER-SEATED> T)
(<L? 0 ,PLAYER-SEATED> <TELL "sitting ">)
(T <TELL "lying ">)>
<COND (<FSET? ,HERE ,SURFACEBIT>
<TELL "on">)
(T
<TELL "in">)>
<TELL THE ,HERE ".">>
;<ROUTINE V-FIND-WITH () <V-FIND>>
<ROUTINE V-FIX () <MORE-SPECIFIC>>
<ROUTINE FOLLOW-LOC? ("AUX" L)
<SET L <GETP ,PRSO ,P?CHARACTER>>
<COND ;(<L? ,GHOST-NEW-C .L>
<RFALSE>)
(<SET L <GET ,FOLLOW-LOC .L>>
<TELL "The last you knew," HE ,PRSO " was ">
<COND (<FSET? .L ,SURFACEBIT>
<TELL "on">)
(T <TELL "in">)>
<TELL-HIS-HER-BEDROOM <GETP ,PRSO ,P?CHARACTER> .L>
<TELL ".|">
.L)>>
<ROUTINE V-FOLLOW ("AUX" L)
<COND (<==? ,PRSO ,WINNER>
<YOU-CANT>
;<NOT-CLEAR-WHOM>)
(<AND <NOT <DOBJ? GHOST-NEW>>
<NOT <FSET? ,PRSO ,PERSONBIT>>>
<TELL
"How tragic to see you, a" ,FAMOUS-YOUNG-DETECTIVE", stalking " A ,PRSO "!"CR>)
(<==? ,HERE <SET L <META-LOC ,PRSO>>>
<TELL "You're in the same place as" HE ,PRSO "!" CR>)
(<SET L <GET ,FOLLOW-LOC <GETP ,PRSO ,P?CHARACTER>>
;<FOLLOW-LOC?>>
<PERFORM ,V?WALK-TO .L>)
;(<EQUAL? .L <> ,LOCAL-GLOBALS>
<TELL CTHE ,PRSO " has left the story." CR>)
(T
<WHO-KNOWS? ,PRSO>
;<PERFORM ,V?WALK-TO ,PRSO>
<RFATAL>)>>
<ROUTINE V-FOO () <TELL "[Foo!! This is a bug!!]" CR>>
<ROUTINE V-FORGIVE () <YOU-CANT>>
;<ROUTINE PRE-GIVE ()
<COND (<AND <NOT <HELD? ,PRSO>>
<NOT <EQUAL? ,PRSI ,PLAYER ,PLAYER-NAME>>>
<TELL
"That's easy for you to say, since " HE ,WINNER is "n't holding" HIM ,PRSO "."
CR>)>>
<ROUTINE PRE-GIVE ()
<COND (<AND <NOT <EQUAL? ,PRSI ,PLAYER ,PLAYER-NAME>>
<NOT-HOLDING? ,PRSO>>
<RTRUE>)>>
<ROUTINE V-GIVE ()
<COND (<ZERO? ,PRSI> <YOU-CANT ;"give">)
(<NOT <FSET? ,PRSI ,PERSONBIT>>
<TELL
CHE ,WINNER " can't give " A ,PRSO " to " A ,PRSI "!" CR>)
;(<FSET? ,PRSI ,MUNGBIT>
<TELL CHE ,PRSI do "n't respond." CR>)
(<IOBJ? PLAYER>
<PERFORM ,V?TAKE ,PRSO>
<RTRUE>)
(<AND <DOBJ? LUGGAGE>
<FIRST? ,PRSO>
<FSET? ,YOUR-ROOM ,TOUCHBIT>>
<TELL CHE ,PRSI refuse " your gift." CR>)
(T
<MOVE ,PRSO ,PRSI>
<TELL CHE ,PRSI accept " your gift." CR>
<TREASURE-FOUND? ,PRSO ,PRSI>
<COND (<AND <EQUAL? ,VARIATION <GETP ,PRSI ,P?CHARACTER>>
<OR <FSET? ,PRSO ,RMUNGBIT> ;"evidence"
<EQUAL? ,PRSO ,BLOWGUN ,COSTUME>>>
<SETG WINNER ,PLAYER>
<PERFORM ,V?ASK-ABOUT ,PRSI ,PRSO>)>
<RTRUE>)>>
<ROUTINE PRE-SGIVE ("AUX" X)
<SET X <GET ,P-NAMW 0>>
<PUT ,P-NAMW 0 <GET ,P-NAMW 1>>
<PUT ,P-NAMW 1 .X>
<PERFORM ,V?GIVE ,PRSI ,PRSO>
<RTRUE>>
<ROUTINE V-SGIVE () <V-FOO>>
"<ROUTINE PRE-GOODBYE () <PRE-HELLO>>
<ROUTINE V-GOODBYE () <V-HELLO <>>>"
;<ROUTINE PRE-HEAT () <PRE-BURN>>
;<ROUTINE V-HEAT () <TELL CHE ,PRSO " gets a little bit hotter." CR>>
<ROUTINE PRE-HELLO (;"OPTIONAL" ;(STR 0) "AUX" P (WORD <>))
<COND (<EQUAL? ,P-PRSA-WORD ,W?HELLO ,W?HI>
<SET WORD " Greet">)
(<EQUAL? ,P-PRSA-WORD ,W?SORRY>
<SET WORD " Apologize to">)>
<COND (<NOT <DOBJ? ROOMS>>
<COND (<AND <NOT <FSET? ,PRSO ,PERSONBIT>>
<NOT <DOBJ? CREW-GLOBAL>>>
<WONT-HELP-TO-TALK-TO ,PRSO>
<RTRUE>)
(<FSET? ,PRSO ,MUNGBIT>
<PERFORM ,V?ALARM ,PRSO>
<RTRUE>)
(<T? .WORD>
<TELL ,I-ASSUME .WORD HIM ,PRSO ".]" CR>
<RFALSE>)>
;<UNSNOOZE ,PRSO>
<COND ;(<NOT <GRAB-ATTENTION ,PRSO>>
<RFATAL>)
(T <RFALSE>)>)
(<QCONTEXT-GOOD?>
<TELL ,I-ASSUME>
;<COND (<T? .WORD>
<TELL .WORD>)>
<TELL !\ D ,QCONTEXT ".]" CR>
<PERFORM ,PRSA ,QCONTEXT>
<RTRUE>)
(<AND <EQUAL? ,WINNER ,PLAYER>
<SET P <FIND-FLAG-HERE-NOT ,PERSONBIT ,MUNGBIT ,WINNER>>>
<TELL ,I-ASSUME>
;<COND (<T? .WORD>
<TELL .WORD>)>
<TELL !\ D .P ".]" CR>
<PERFORM ,PRSA .P>
<RTRUE>)
(T <NOT-CLEAR-WHOM>)>>
<ROUTINE V-HELLO () ;("OPTIONAL" (HELL T))
<COND (<FSET? ,PRSO ,PERSONBIT> ;<GETP ,PRSO ,P?CHARACTER>
<COND (<NOT <FSET? ,PRSO ,MUNGBIT>>
<COND (<ZERO? ,LIT>
<TELL "\"Hello.\"" CR>)
(T <TELL CHE ,PRSO nod " at you." CR>)>)
(T <WONT-HELP-TO-TALK-TO ,PRSO>)>)
;(<NOT <DOBJ? ROOMS>>
<TELL "Only nuts say \""
<COND (.HELL "Hello") (T "Good-bye")>
"\" to " A ,PRSO "." CR>)
(T <NOT-CLEAR-WHOM>)>>
<ROUTINE V-HELP ()
<COND (<EQUAL? ,PRSO <> ,PLAYER>
<HELP-TEXT>)
(T <MORE-SPECIFIC>)>>
<ROUTINE HELP-TEXT ()
<SETG CLOCK-WAIT T>
<TELL
"[You'll find plenty of help in your " D ,MOONMIST " package.|
If you're really stuck, you can order an InvisiClues (TM) hint booklet and map
from your dealer or via mail with the form in your package.]" CR>>
<ROUTINE V-KILL () <IKILL "kill">>
<GLOBAL YOU-DIDNT-SAY-W "[You didn't say w">
<ROUTINE IKILL ("OPTIONAL" (STR <>))
<COND (<ZERO? ,PRSO>
<SETG CLOCK-WAIT T>
<TELL "(There's nothing here to " .STR ".)" CR>)
(<ZERO? ,PRSI>
<SETG CLOCK-WAIT T>
<TELL ,YOU-DIDNT-SAY-W "hat to " .STR THE ,PRSO>
<COND (<FSET? ,PRSO ,WEAPONBIT>
<TELL " at">)
(T ;<FSET? ,PRSO ,PERSONBIT>
<TELL " with">)>
<TELL ".]" CR>)
(<NOT <FSET? ,PRSO ,PERSONBIT>>
<HAR-HAR>)
(T <TELL ,NO-VIOLENCE> <RTRUE>)>>
<GLOBAL NO-VIOLENCE "You think it over. There's no need to get violent.|">
<ROUTINE V-KISS ("AUX" X)
<COND (<EQUAL? ,PRSO ,PLAYER>
<TELL "You kiss " 'PLAYER " for a minute. Yuk!" CR>)
(<AND <FSET? ,PRSO ,PERSONBIT>
<NOT <FSET? ,PRSO ,MUNGBIT>>>
<FACE-RED>)
(T <TELL "What a (ahem!) strange idea!" CR>)>>
<ROUTINE V-KNOCK ("AUX" P)
<COND (<OR <FSET? ,PRSO ,DOORBIT>
;<EQUAL? ,PRSO ,WINDOW>>
<COND (<FSET? ,PRSO ,OPENBIT>
<TELL "It's open!" CR>)
(<AND <SET P <DOOR-ROOM ,HERE ,PRSO>>
<SET P <FIND-FLAG .P ,PERSONBIT ,PLAYER>>>
<FCLEAR ,PRSO ,LOCKED>
<FSET ,PRSO ,OPENBIT>
<FSET ,PRSO ,ONBIT>
<UNSNOOZE .P>
<THIS-IS-IT .P>
<TELL CHE .P " opens the door, then retreats into the room."
;"Someone shouts \"Come!\"" CR>)
(T <TELL "There's no answer." CR>)>)
(ELSE
<SETG CLOCK-WAIT T>
<TELL "(Why knock on " A ,PRSO "?)" CR>)>>
<ROUTINE V-STAND ("AUX" P)
<COND (<AND <==? ,WINNER ,PLAYER>
<NOT <IN? ,PLAYER ,HERE>>
;<T? ,PLAYER-SEATED>>
<OWN-FEET>)
(T
<ALREADY ,WINNER "standing up">)>>
<ROUTINE V-LEAP ()
<COND (<AND ,PRSO
<NOT <DOBJ? INTDIR>>>
<YOU-CANT>
;<PERFORM ,V?BOARD ,PRSO>
<RTRUE>)
(<EQUAL? ,HERE ,DECK ,LOVER-PATH> ;<GETPT ,HERE ,P?DOWN>
<TELL "This was not a very safe place to try jumping.">
<FINISH>)
(T <V-SKIP>)>>
<ROUTINE V-SKIP ()
<COND ;(<FSET? <LOC ,PLAYER> ,VEHBIT>
<TELL "That would be tough from your current position." CR>)
(T <WHEE>)>>
<ROUTINE WHEE ("AUX" X)
<SET X <RANDOM 5>>
<COND (<==? 1 .X>
<TELL "Very good. Now you can go to the second grade." CR>)
(<==? 2 .X>
<TELL "I hope you enjoyed that more than I did." CR>)
(<==? 3 .X>
<TELL "Are you enjoying " 'PLAYER "?" CR>)
(<==? 4 .X>
<TELL "Wheeeeeeeeee!!!!!" CR>)
(T <TELL "Do you expect someone to applaud?" CR>)>>
<ROUTINE V-LEAVE ("AUX" GT)
<COND (<==? ,WINNER ,FOLLOWER>
<SETG FOLLOWER 0>)>
<COND (<EQUAL? ,PRSO ;<> ,ROOMS ,HERE ,GLOBAL-HERE>
<DO-WALK ,P?OUT>
<PUTP ,WINNER ,P?LDESC 9 ;"waiting patiently">
<COND (<AND <EQUAL? ,WINNER ,FRIEND>
<NOT <EQUAL? ,VARIATION ,FRIEND-C>>>
<SET GT <GET ,GOAL-TABLES ,FRIEND-C>>
<COND (<L? ,BED-TIME ,PRESENT-TIME>
<COND (<NOT <EQUAL? ,HERE ,TAMARA-ROOM>>
<PUT .GT ,GOAL-FUNCTION ,X-RETIRES>
<ESTABLISH-GOAL ,FRIEND ,TAMARA-ROOM>)>)
(T
<PUT .GT ,GOAL-FUNCTION ,NULL-F>
<COND (<NOT <IN? ,LORD ,HERE>>
<ESTABLISH-GOAL ,FRIEND <LOC ,LORD>>)>)>)>
<RTRUE>)
(<EQUAL? <LOC ,PRSO> ,PLAYER ;,POCKET>
<PERFORM ,V?DROP ,PRSO>
<RTRUE>)
(<NOT <==? <LOC ,WINNER> ,PRSO>>
<TELL-NOT-IN ,PRSO>
<RFATAL>)
(T
<DO-WALK ,P?OUT>
<RTRUE>)>>
<ROUTINE PRE-LIE () <ROOM-CHECK>>
<ROUTINE V-LIE () <V-SIT T>>
<ROUTINE PRE-LISTEN ()
<COND (<AND <FSET? ,PRSO ,PERSONBIT>
<==? <GETP ,PRSO ,P?LDESC> 22 ;"playing the piano">>
<PERFORM ,V?LISTEN ,PIANO>
<RTRUE>)
(T <PRE-ASK-ABOUT>)>>
<ROUTINE V-LISTEN ()
<COND (<AND <FSET? ,PRSO ,PERSONBIT>
<NOT <FSET? ,PRSO ,MUNGBIT>>>
<WAITING-FOR-YOU-TO-SPEAK>
<RTRUE>)
(T
<TOO-BAD-BUT ,PRSO>
<TELL " makes no sound." CR>)>>
<ROUTINE V-LOCK ()
<COND (<FSET? ,PRSO ,DOORBIT>
<COND (<EQUAL? ,PRSO ,HERE>
<OKAY ,PRSO "locked">)
(T <TELL-FIND-NONE "a way to lock" ,PRSO>)>)
(T <YOU-CANT>)>>
<ROUTINE V-LOOK ()
<COND (<DESCRIBE-ROOM T>
<DESCRIBE-OBJECTS ;T>
;<CRLF>)>>
<ROUTINE V-LOOK-BEHIND ()
<COND (<AND <FSET? ,PRSO ,DOORBIT> <NOT <FSET? ,PRSO ,OPENBIT>>>
<TOO-BAD-BUT ,PRSO "closed">)
(T <TELL "There's nothing behind" HIM ,PRSO "." CR>)>>
<ROUTINE V-LOOK-DOWN ()
<COND (<==? ,PRSO ,ROOMS>
<TELL
"You see nothing suspicious " <GROUND-DESC> "." CR>)
(T <HAR-HAR>)>>
<ROUTINE PRE-LOOK-INSIDE () <ROOM-CHECK>>
<ROUTINE V-LOOK-INSIDE ("OPTIONAL" (DIR ,P?IN) "AUX" RM)
<COND (<DOBJ? ROOMS>
<COND (<==? .DIR ,P?OUT>
<COND (<GLOBAL-IN? ,WINDOW ,HERE>
<PERFORM ,PRSA ,WINDOW ,PRSI>
<RTRUE>)>)
(T
<COND (<OR <FSET? <SET RM ,P-IT-OBJECT> ,CONTBIT>
<SET RM <FIND-FLAG-LG ,HERE ,CONTBIT>>
<GLOBAL-IN? <SET RM ,WINDOW> ,HERE>
<SET RM <FIND-FLAG-LG ,HERE ,DOORBIT>>>
<TELL-I-ASSUME .RM>
<PERFORM ,PRSA .RM ,PRSI>
<RTRUE>)>)>)>
<COND (<DOBJ? GLOBAL-HERE>
<PERFORM ,V?LOOK>
<RTRUE>)
(<AND <IN? ,PRSO ,ROOMS> ;<FSET? ,PRSO ,RLANDBIT>
<NOT <NOUN-USED? ,W?DOOR>>
<OR <GLOBAL-IN? ,PRSO ,HERE>
<SEE-INTO? ,PRSO <>>
;<VISIBLE? ,PRSO>>>
<ROOM-PEEK ,PRSO>)
(<V-LOOK-THROUGH T> <RTRUE>) ;"SWG swapped this & next 5/21/86"
(<OR <FSET? ,PRSO ,CONTBIT>
<FSET? ,PRSO ,SURFACEBIT>>
<COND (<NOT <SEE-INSIDE? ,PRSO T>>
<FIRST-YOU "open" ,PRSO>)>
<COND (<FIRST? ,PRSO>
<TELL "You can see">
<PRINT-CONTENTS ,PRSO>
;<PRINT-CONT ,PRSO>
<COND (<FSET? ,PRSO ,SURFACEBIT> <TELL " on">)
(T <TELL " inside">)>
<TELL HIM ,PRSO "." CR>
<RTRUE>)
(<DOBJ? VICTORIA-CHAIR WRITING-DESK COAT-RACK WYVERN
PIANO TABLE-DINING CHAIR-DINING SIDEBOARD>
<TELL-LIKE-BROCHURE>)
(<FSET? ,PRSO ,SURFACEBIT>
<TELL "There's nothing on" HIM ,PRSO>
<COND (<IN? ,PLAYER ,PRSO>
;<EQUAL? ,PLAYER-SEATED ,PRSO <- 0 ,PRSO>>
<TELL " except you">)>
<TELL "." CR>)
(T <TOO-BAD-BUT ,PRSO "empty">)>)
(<==? .DIR ,P?IN> <YOU-CANT "look inside">)
(T ;<==? .DIR ,P?OUT> <YOU-CANT "look outside">)>>
<ROUTINE FIRST-YOU (STR "OPTIONAL" (OBJ 0) (OBJ2 0))
<TELL !\(>
<HE-SHE-IT ,WINNER T .STR>
<COND (<T? .OBJ>
<TELL THE ;HIM .OBJ>
<COND (<=? .STR "open">
<FSET .OBJ ,OPENBIT>)>
<COND (<T? .OBJ2>
<TELL " from" THE ;HIM .OBJ2>)>)>
<TELL " first.)" CR>>
<ROUTINE V-LOOK-THROUGH ("OPTIONAL" (INSIDE <>) "AUX" RM)
<COND (<FSET? ,PRSO ,DOORBIT>
<COND (<OR <FSET? ,PRSO ,OPENBIT>
<FSET? ,PRSO ,TRANSBIT>
;<NOUN-USED? ,W?KEYHOLE>>
<COND (<SET RM <DOOR-ROOM ,HERE ,PRSO>>
<ROOM-PEEK .RM T>)
(T <NO-BEYOND>)>)
(<ZMEMQ ,PRSO ,CHAR-ROOM-TABLE>
<PERFORM ,PRSA ,KEYHOLE>
<RTRUE>)
(T
<TOO-BAD-BUT ,PRSO "closed">)>)
(<EQUAL? ,PRSO ,WINDOW>
<COND ;(<SET RM <WINDOW-ROOM ,HERE ,PRSO>>
<ROOM-PEEK .RM T>)
(T <NO-BEYOND>)>)
(<FSET? ,PRSO ,PERSONBIT>
<TELL "You forgot to bring your X-ray glasses." CR>)
(.INSIDE <RFALSE>)
(<FSET? ,PRSO ,TRANSBIT>
<TELL "Everything looks bigger." CR>)
(T <YOU-CANT "look through">)>>
<ROUTINE NO-BEYOND () <TELL "You can't tell what's beyond" HIM ,PRSO "." CR>>
<ROUTINE ROOM-PEEK (RM "OPTIONAL" (SAFE <>) "AUX" (X <>) OHERE OLIT TXT)
<COND (<EQUAL? .RM ,HERE>
<V-LOOK>
<RTRUE>)
(<OR .SAFE <SEE-INTO? .RM>>
<SET OHERE ,HERE>
<SET OLIT ,LIT>
<SETG HERE .RM>
<MAKE-ALL-PEOPLE -12 ;"listening to you">
<SETG LIT <LIT? ;,HERE>>
<TELL "You peer ">
<COND (<FSET? .RM ,SURFACEBIT> <TELL "at">) (T <TELL "into">)>
<TELL HIM .RM !\: CR>
<COND (<DESCRIBE-OBJECTS ;T> <SET X T>)
(<SET TXT <GETP .RM ,P?LDESC>>
<SET X T>
<TELL .TXT CR>)>
;<COND (<CORRIDOR-LOOK> <SET X T>)>
<COND (<ZERO? .X>
<TELL "You can't see anything suspicious." CR>)>
<SETG HERE .OHERE>
<SETG LIT .OLIT>
<RTRUE>)>>
<ROUTINE SEE-INTO? (THERE "OPTIONAL" (TELL? T) (IGNORE-DOOR <>)"AUX" P L TBL O)
;<COND (<AND <EQUAL? ,CAR ,HERE .THERE>
<EQUAL? <GETP ,CAR ,P?STATION> ,HERE .THERE>>
<RTRUE>)>
<COND (<CORRIDOR-LOOK .THERE>
<RTRUE>)>
<SET P 0>
<REPEAT ()
<COND (<OR <0? <SET P <NEXTP ,HERE .P>>>
<L? .P ,LOW-DIRECTION>>
<COND (.TELL? <TELL-CANT-FIND>)>
<RFALSE>)>
<SET TBL <GETPT ,HERE .P>>
<SET L <PTSIZE .TBL>>
<COND (<==? .L ,UEXIT>
<COND (<==? <GET-REXIT-ROOM .TBL> .THERE>
<RTRUE>)>)
(<==? .L ,DEXIT>
<COND (<==? <GET-REXIT-ROOM .TBL> .THERE>
<COND (<FSET? <GET-DOOR-OBJ .TBL> ,OPENBIT>
<RTRUE>)
(<WALK-THRU-DOOR? .TBL <GET-DOOR-OBJ .TBL> <>
;.TELL?>
<RTRUE>)
(<T? .IGNORE-DOOR>
<RTRUE>)
(T
<COND (.TELL?
<SETG CLOCK-WAIT T>
<TELL
"(The door to that room is closed.)" CR>)>
<RFALSE ;RTRUE>)>)>)
(<==? .L ,CEXIT>
<COND (<==? <GET-REXIT-ROOM .TBL> .THERE>
<COND (<VALUE <GETB .TBL ,CEXITFLAG>>
<RTRUE>)
(T
<COND (.TELL? <TELL-CANT-FIND>)>
<RFALSE>)>)>)>>>
<ROUTINE TELL-CANT-FIND ()
<SETG CLOCK-WAIT T>
<TELL "(That place isn't close enough.)"
;"You can't seem to find that room." CR>>
<ROUTINE V-LOOK-ON ()
<COND (<FSET? ,PRSO ,SURFACEBIT>
<V-LOOK-INSIDE>)
(T <TELL "There's no good surface on" HIM ,PRSO "." CR>)>>
<ROUTINE V-LOOK-OUTSIDE () <V-LOOK-INSIDE ,P?OUT>>
<ROUTINE PRE-LOOK-UNDER () <ROOM-CHECK>>
<ROUTINE V-LOOK-UNDER ()
<COND (<DOBJ? EYE HANDS HEAD>
<WONT-HELP>)
(<HELD? ,PRSO>
<TELL "You're ">
<COND (<FSET? ,PRSO ,WORNBIT>
<TELL "wear">)
(T <TELL "hold">)>
<TELL "ing" THE ,PRSO "!" CR>)
(<FSET? ,PRSO ,PERSONBIT>
<TELL "Nope. Nothing hiding under" HIM ,PRSO "." CR>)
(<AND ;<EQUAL? ,PRSO ,COSTUME ,BLOWGUN>
<EQUAL? <LOC ,PRSO> ,VIVIEN-BOX ,WENDISH-KIT>>
<TELL "There's more stuff there." CR>)
(<EQUAL? <LOC ,PRSO> ,HERE ,LOCAL-GLOBALS ;,GLOBAL-OBJECTS>
<TELL "There's nothing there but dust." CR>)
(T
<TELL "That's not a bit useful." CR>)>>
<ROUTINE V-LOOK-UP ("AUX" HR)
<COND (<T? ,PRSI>
<TELL
"There's no information in" THE ,PRSI " about" THE ,PRSO "." CR>)
(<DOBJ? ROOMS>
<COND (<OUTSIDE? ,HERE>
<PERFORM ,V?EXAMINE ,MOON>
<RTRUE>)
(<CREEPY? ,HERE>
<TELL "Shadows play on the stone ceiling">
<COND (<EQUAL? ,HERE ,SITTING-PASSAGE>
<TELL " and" THE ,SECRET-SITTING-DOOR>)>
<TELL "." CR>)
(T
<TELL
"The ceiling is decorated with swirly lines and patterns.">
<COND (<AND <==? ,HERE ,TAMARA-ROOM>
<T? <GETP ,LUMBER-ROOM ,P?CORRIDOR>>>
<TELL " There's a hole directly over the bed.">)>
<CRLF>)>)
(T <YOU-CANT "look up">)>>
;<ROUTINE V-MAKE () <YOU-CANT>>
<ROUTINE PRE-MEET ()
<COND (<IN? ,PRSO ,HERE>
<PERFORM ,V?HELLO ,PRSO>
<RTRUE>)
(T
<PERFORM ,V?WALK-TO ,PRSO>
<RTRUE>)>>
<ROUTINE V-MEET () <V-FOO>>
<ROUTINE PRE-MOVE ()
<COND (<HELD? ,PRSO>
<TELL "Juggling isn't one of your talents." CR>)>>
<ROUTINE V-MOVE ()
<COND (<FSET? ,PRSO ,TAKEBIT>
<TELL "Moving" HIM ,PRSO " reveals nothing." CR>)
(T <YOU-CANT ;"move">)>>
<ROUTINE PRE-MOVE-DIR ()
<COND (<NOT <IOBJ? INTDIR>>
<DONT-UNDERSTAND>
<RTRUE>)>>
<ROUTINE V-MOVE-DIR ()
<TELL
"You can't move" HIM ,PRSO " in any particular " D ,INTDIR "." CR>>
<ROUTINE V-NOD ()
<COND (<NOT <DOBJ? ROOMS>>
<YOU-CANT>)
(<T? ,AWAITING-REPLY>
<PERFORM ,V?YES>
<RTRUE>)
(T
<PERFORM ,V?HELLO ,ROOMS>
<RTRUE>)>>
<ROUTINE V-OPEN ("AUX" F STR)
<COND (<NOT <OR <FSET? ,PRSO ,CONTBIT>
<FSET? ,PRSO ,DOORBIT>
<EQUAL? ,PRSO ,WINDOW>>>
<YOU-CANT ;"open">)
(<OR <FSET? ,PRSO ,DOORBIT>
<EQUAL? ,PRSO ,WINDOW>
<NOT <==? <GETP ,PRSO ,P?CAPACITY> 0>>>
;<COND (<AND <FSET? ,PRSO ,SECRETBIT>
<NOT <FSET? ,PRSO ,SEENBIT>>>
<NOT-FOUND ,PRSO>
<RTRUE>)> ;"in PLAYER-F"
<COND (<FSET? ,PRSO ,LOCKED>
<COND (<UNLOCK-DOOR? ,PRSO>
<FCLEAR ,PRSO ,LOCKED>
<FIRST-YOU "unlock" ,PRSO>)
(T <TOO-BAD-BUT ,PRSO "locked"> <RTRUE>)>)>
<COND (<FSET? ,PRSO ,OPENBIT>
<ALREADY ,PRSO "open">)
;(<FSET? ,PRSO ,MUNGBIT>
<TELL
"You can't open it. The latch is broken." CR>)
(T
<FSET ,PRSO ,OPENBIT>
<COND (<OR <FSET? ,PRSO ,DOORBIT>
<EQUAL? ,PRSO ,WINDOW>
<NOT <FIRST? ,PRSO>>
<FSET? ,PRSO ,TRANSBIT>>
<OKAY ,PRSO "open">)
;(<AND <SET F <FIRST? ,PRSO>>
<NOT <NEXT? .F>>
<SET STR <GETP .F ,P?FDESC>>>
<TELL "You open" HIM ,PRSO !\. CR>
<TELL .STR CR>)
(T
<TELL "You open" HIM ,PRSO " and see">
<PRINT-CONTENTS ,PRSO>
<TELL "." CR>)>)>)
(T <YOU-CANT ;"open">)>>
<ROUTINE PRE-OPEN-WITH ()
<COND (<NOT-HOLDING? ,PRSI> <RTRUE>)>>
<ROUTINE V-OPEN-WITH () <PERFORM ,V?OPEN ,PRSO> <RTRUE>>
;<ROUTINE V-PASS () <PERFORM ,V?WALK-TO ,PRSO> <RTRUE>>
<ROUTINE V-PLAY ()
<SETG CLOCK-WAIT T>
<TELL
"[Speaking of playing, you'd enjoy Infocom's other fictions, too!]" CR>>
"<ROUTINE PRE-POCKET () <PERFORM ,V?PUT-IN ,PRSO ,POCKET> <RTRUE>>
<ROUTINE V-POCKET () <V-FOO>>"
<ROUTINE V-POUR () <YOU-CANT>>
<ROUTINE V-PRAY ()
<TELL
"\"From ghoulies and ghosties and long-leggety beasties|
And things that go bump in the night, Good Lord, deliver us!\"" CR>>
<ROUTINE V-PUSH () <HACK-HACK "Pushing">>
<ROUTINE WEAR-CHECK ("AUX" X)
<COND (<EQUAL? ,NOW-WEARING ,PRSO>
<COND (<AND <NOUN-USED? ,W?CLOTHES>
<SET X <FIND-OUTFIT>>>
<TELL-I-ASSUME .X>
<SETG PRSO .X>
<RFALSE>)
(T
<YOU-CANT <> <> "being worn">
<RTRUE>)>)>>
<ROUTINE PRE-PUT ()
<COND (<WEAR-CHECK> <RTRUE>)>
<FCLEAR ,PRSO ,WORNBIT>
<COND ;(<HELD? ,PRSO> ;"SYNTAX says HAVE"
<RFALSE>)
;(<NOT <FSET? ,PRSO ,TAKEBIT>> ;"SYNTAX says TAKE"
<YOU-CANT "pick up">
<RTRUE>)
(<DOBJ? HEAD HANDS OTHER-OUTFIT>
<WONT-HELP>
<RTRUE>)
(<IN? ,PRSO ,GLOBAL-OBJECTS>
<NOT-HERE ,PRSO>
<RTRUE>)
(<IOBJ? FLOOR GLOBAL-HERE ;POCKET>
<RFALSE>)
(<IN? ,PRSI ,GLOBAL-OBJECTS>
<NOT-HERE ,PRSI>
<RTRUE>)>>
<ROUTINE V-PUT ()
<COND (<FSET? ,PRSI ,PERSONBIT>
<SETG WINNER ,PRSI>
<PERFORM ,V?WEAR ,PRSO>
<RTRUE>)
(<AND <NOT <FSET? ,PRSI ,SURFACEBIT>>
<NOT <IOBJ? BOOKCASE>>
<NOT <FSET? ,PRSI ,VEHBIT>>>
<COND (T ;<NOT <FSET? ,PRSI ,SURFACEBIT>>
<TELL "There's no good surface on" HIM ,PRSI "." CR>)>
<RTRUE>)>
<PUT-ON-OR-IN>>
<ROUTINE TELL-FIND-NONE (STR "OPTIONAL" (OBJ <>))
<TELL "You search for " .STR>
<COND (<T? .OBJ> <TELL THE .OBJ>)>
<TELL " but find none." CR>>
<ROUTINE PRE-PUT-IN ()
<COND (<EQUAL? <GET ,P-OFW 1> ,W?FRONT>
<PERFORM ,V?DROP ,PRSO>
<RTRUE>)
(<IOBJ? CHAIR EARRING FIREPLACE PSEUDO-OBJECT>
<RETURN <PRE-PUT>>)
(<IOBJ? INKWELL MOONMIST>
<YOU-SHOULDNT " in">
<RFATAL>)
(<IOBJ? EYE HANDS HOLE-IN-WALL OCEAN PEEPHOLE PEEPHOLE-2>
<WONT-HELP>
<RFATAL>)
(<FSET? ,PRSI ,READBIT>
<WONT-HELP>
<RFATAL>)
(<NOT <FSET? ,PRSI ,CONTBIT>>
<TELL-FIND-NONE "an opening in" ,PRSI>
<RFATAL>)>
<COND (<NOT <FSET? ,PRSI ,OPENBIT>>
<FIRST-YOU "open" ,PRSI>
;<TOO-BAD-BUT ,PRSI "closed">)>
<PRE-PUT>>
<ROUTINE V-PUT-IN ()
<COND (<AND <NOT <FSET? ,PRSI ,OPENBIT>>
<NOT <FSET? ,PRSI ,VEHBIT>>>
<COND (<OPENABLE? ,PRSI>
<TOO-BAD-BUT ,PRSI "closed">)
(T <TELL "You can't open" HIM ,PRSI "." CR>)>
<RTRUE>)>
<PUT-ON-OR-IN>>
<GLOBAL NOT-ENOUGH-ROOM "There's not enough room.|">
<ROUTINE PUT-ON-OR-IN ()
<COND (<ZERO? ,PRSI> <YOU-CANT ;"put">)
(<==? ,PRSI ,PRSO>
<HAR-HAR>)
(<IN? ,PRSO ,PRSI>
<TOO-BAD-BUT ,PRSO>
<TELL " is already "
<COND (<FSET? ,PRSI ,SURFACEBIT> "on") (T "in")>
HIM ,PRSI "!" CR>)
;(<AND <NOT <FSET? ,PRSI ,SURFACEBIT>>
<NOT <FSET? ,PRSI ,OPENBIT>>>
<TOO-BAD-BUT ,PRSI "closed">)
(<G? <+ <WEIGHT ,PRSI> <GETP ,PRSO ,P?SIZE>>
;<- * <GETP ,PRSI ,P?SIZE>>
<GETP ,PRSI ,P?CAPACITY>>
<TELL ,NOT-ENOUGH-ROOM>
<RTRUE>)
(<AND <NOT <HELD? ,PRSO>>
<NOT <ITAKE>>>
<RTRUE>)
(T
<MOVE ,PRSO ,PRSI>
<FSET ,PRSO ,TOUCHBIT>
<COND (<AND <FSET? ,PRSI ,PERSONBIT>
<FSET? ,PRSO ,WEARBIT>>
<FSET ,PRSO ,WORNBIT>)>
<TELL "Okay." CR>)>>
"WEIGHT: Get sum of SIZEs of supplied object," ;" recursing to the nth level."
<ROUTINE WEIGHT (OBJ "AUX" CONT (WT 0))
<COND (<SET CONT <FIRST? .OBJ>>
<REPEAT ()
<COND ;(<AND <EQUAL? .OBJ ,PLAYER>
<FSET? .CONT ,WORNBIT>>
<SET WT <+ .WT 1>>)
;"worn things shouldn't count"
;(<AND <EQUAL? .OBJ ,PLAYER>
<FSET? <LOC .CONT> ,WORNBIT>>
<SET WT <+ .WT 1>>)
;"things in worn things shouldn't count"
(T
<SET WT <+ .WT <GETP .CONT ,P?SIZE>>>)>
<COND (<NOT <SET CONT <NEXT? .CONT>>> <RETURN>)>>)>
.WT ;<+ .WT <GETP .OBJ ,P?SIZE>>>
<ROUTINE V-PUT-UNDER () <TELL ,NOT-ENOUGH-ROOM>>
<ROUTINE PRE-SREAD () <PERFORM ,V?READ ,PRSI ,PRSO> <RTRUE>>
<ROUTINE V-SREAD () <V-FOO>>
<ROUTINE PRE-READ ("AUX" VAL)
<COND ;(<ZERO? ,LIT> <TOO-DARK> <RTRUE>)
(<IN? ,PRSO ,GLOBAL-OBJECTS>
<NOT-HERE ,PRSO>)>>
<ROUTINE V-READ ()
<COND (<NOT <FSET? ,PRSO ,READBIT>> <YOU-CANT ;"read">)
(ELSE <TELL <GETP ,PRSO ,P?TEXT> CR>)>>
<ROUTINE V-REMOVE ()
<COND (<FSET? ,PRSO ,WORNBIT>
<PERFORM ,V?TAKE-OFF ,PRSO>
<RTRUE>)
(T
<PERFORM ,V?TAKE ,PRSO>
<RTRUE>)>>
<ROUTINE V-RING () <YOU-CANT>>
<ROUTINE V-RUB ()
<COND (<AND <FSET? ,PRSO ,PERSONBIT>
<NOT <FSET? ,PRSO ,MUNGBIT>>
<NOT <EQUAL? ,PRSO ,PLAYER>>>
<FACE-RED>)
(T <HACK-HACK "Rubbing" ;"Fiddling with">)>>
<ROUTINE V-SAY ("AUX" P)
<COND (<QCONTEXT-GOOD?>
<PERFORM ,V?TELL ,QCONTEXT>
<RTRUE>)
(<SET P <FIND-FLAG-HERE-NOT ,PERSONBIT ,MUNGBIT ,WINNER>>
<TELL-I-ASSUME .P " Say to">
<PERFORM ,V?TELL .P>
<RTRUE>)
(T
<NOT-CLEAR-WHOM>)>>
;<ROUTINE PRE-SAY-INTO ()
<COND (<NOT <FSET? ,PRSO ,ONBIT>>
<TELL "Sorry, but" HE ,PRSO is "n't on!" CR>)>>
;<ROUTINE V-SAY-INTO () <YOU-CANT "talk into">>
<ROUTINE PRE-SEARCH () <ROOM-CHECK>>
<ROUTINE V-SEARCH ("AUX" OBJ)
<COND (<IN? ,PRSO ,ROOMS>
<PERFORM ,PRSA ,GLOBAL-HERE>
<RTRUE>
;<START-SEARCH>)
(<AND <FSET? ,PRSO ,PERSONBIT>
<SET OBJ <FIRST? ,PRSO>>>
<FSET .OBJ ,TAKEBIT>
<FCLEAR .OBJ ,NDESCBIT>
<FCLEAR .OBJ ,WORNBIT>
<FCLEAR .OBJ ,SECRETBIT>
<THIS-IS-IT .OBJ>
<MOVE .OBJ ,PLAYER>
;<COND (<EQUAL? .OBJ ,MUSTACHE>
<SETG WENDISH-BARE T>)>
<TELL
"You find " A .OBJ " and take it. " !\Y ,OU-STOP-SEARCHING "." CR>)
(<AND <SET OBJ <FIND-FLAG ,PRSO ,SECRETBIT>>
;<FSET? .OBJ ,NDESCBIT>>
<DISCOVER .OBJ ,PRSO>)
(<FSET? ,PRSO ,DOORBIT>
<NOTHING-SPECIAL>)
(<OR <FSET? ,PRSO ,CONTBIT>
<FSET? ,PRSO ,SURFACEBIT>>
<PERFORM ,V?LOOK-INSIDE ,PRSO>
<RTRUE>)
(T <NOTHING-SPECIAL>
;<TELL "You find nothing suspicious." CR>)>>
<GLOBAL OU-STOP-SEARCHING "ou stop searching">
<ROUTINE DISCOVER (OBJ "OPTIONAL" (WHERE 0))
<COND (<NOT <EQUAL? .OBJ ,YOUR-SWITCH>>
<FCLEAR .OBJ ,NDESCBIT>)>
<FCLEAR .OBJ ,SECRETBIT>
<FCLEAR .OBJ ,WORNBIT>
<COND (<ZERO? .WHERE>
<SET WHERE <LOC .OBJ>>)>
<COND (<NOT <EQUAL? .OBJ ,MOONMIST ,YOUR-SWITCH>>
<FSET .OBJ ,TAKEBIT>)>
<COND (<OR <EQUAL? .WHERE ,COFFIN ,INKWELL ,JEWELRY-CASE>
;<EQUAL? .WHERE ,BOTTLE ,WELL>>
<TELL "Inside the " D .WHERE>)
(<EQUAL? .WHERE ,PAINT>
<TELL "Under the " D .WHERE>)
(<EQUAL? ,HERE ,GARDEN ;,DRIVEWAY>
<COND ;(<==? .WHERE ,POND>
<TELL "Projecting above the water">)
(T <TELL "Buried in the dirt">)>)
(<EQUAL? ,HERE ,CRYPT>
<TELL "Hanging on the neck of the " D .WHERE>)
;(<EQUAL? ,HERE ,LIBRARY>
<TELL "Sitting in the " D ,BOOKCASE>)
(<EQUAL? ,HERE ,YOUR-ROOM>
<TELL "Behind the " D ,YOUR-MIRROR>)
;(<EQUAL? ,HERE ,COURTYARD>
<TELL "Resting on the " D ,FRONT-GATE>)
(<EQUAL? ,HERE ,GREAT-HALL>
<TELL "Inside the helmet of the " D ,ARMOR>)
(<EQUAL? ,HERE ,CHAPEL>
<TELL "Stuck on the apple of the " D ,STAINED-WINDOW>)
(<EQUAL? ,HERE ,GAME-ROOM>
<TELL "Hidden behind the " 'GLASS-EYE " of the " D ,RHINO-HEAD>)
(<EQUAL? ,HERE ,WENDISH-ROOM>
<TELL "Underneath some items in the " 'WENDISH-KIT>)
;(<EQUAL? ,HERE ,HYDE-ROOM>
<COND (<EQUAL? .OBJ ,COSTUME>
<TELL ,HIDDEN-UNDER-PILLOWS>)
(T <TELL "Inside Hyde's zip leather toilet kit">)>)
(<EQUAL? ,HERE ,TAMARA-ROOM>
<TELL "Neatly hidden under the bed">)
(<EQUAL? ,HERE ,JACK-ROOM>
<TELL "Inside a drawer of the tallboy"
;"Hidden on a high shelf; Inside the 'CREST">)
(<EQUAL? ,HERE ,STUDY ,LUMBER-ROOM>
<TELL "Among some papers">)
(<EQUAL? ,HERE ,VIVIEN-ROOM>
<COND ;(<EQUAL? .OBJ ,COSTUME ,BLOWGUN>
<TELL
"Snugly stashed inside a wraparound batik cotton skirt in a drawer">)
(T <TELL "Inside" THE ,VIVIEN-BOX>)>)
;(<EQUAL? ,HERE ,IAN-ROOM>
<TELL "Tightly stuffed into his riding boots">)
;(<EQUAL? ,HERE ,BASEMENT>
<TELL "Inside the " 'WELL>)
(T ;<T? .WHERE>
<COND (<OR <FSET? .WHERE ,SURFACEBIT>
<FSET? .WHERE ,PERSONBIT>>
<TELL "On">)
(T <TELL "In">)>
<TELL THE .WHERE>)
;(T <TELL "Here">)>
<COND (<EQUAL? .OBJ ,COSTUME>
<TELL " are a shimmering white gown and blonde wig">)
(T <TELL " is " A .OBJ>)>
<THIS-IS-IT .OBJ>
<FSET .OBJ ,SEENBIT>
<COND (<VERB? SEARCH SEARCH-FOR>
<TELL ", so y" ,OU-STOP-SEARCHING>)>
<COND (<EQUAL? ,HERE ,TAMARA-ROOM>
;<NOT <EQUAL? .OBJ ,MOONMIST>>
<MOVE .OBJ ,PLAYER>
<COND (<VERB? SEARCH SEARCH-FOR>
<TELL " and ">)
(T <TELL ", so you ">)>
<TELL "take it">)>
<TELL ".|">
<COND (<AND <EQUAL? .OBJ ,COSTUME>
<ZERO? <GET ,FOUND-COSTUME ,PLAYER-C>>>
<CONGRATS ,COSTUME>)
(<AND <SET WHERE <FIND-FLAG-HERE-NOT ,PERSONBIT ,MUNGBIT,PLAYER>>
<NOT <EVIDENCE? .OBJ .WHERE>>>
<GOOD-SHOW .WHERE .OBJ>)>
<COND (<AND ;<T? ,CLUE-1-KNOWN>
<==? .OBJ ,TREASURE>>
<CONGRATS ,ARTIFACT>)>
<RTRUE>>
<ROUTINE CONGRATS ("OPT" (FOUND <>))
<TELL "|
(Congratulations, "TN"! You've ">
<COND (<==? .FOUND ,COSTUME>
<TELL ,IDENTIFIED-THE-GHOST>)
(T
<TELL "found">
<COND (<ZERO? .FOUND>
<TELL " evidence of the crime">)
(T <TELL THE .FOUND>)>)>
<TELL "!)" CR>
<COND (<==? .FOUND ,ARTIFACT>
<SETG TREASURE-FOUND ,TREASURE>
<COND (<AND <T? <GET ,FOUND-COSTUME ,PLAYER-C>>
<T? ,CONFESSED>>
<WRAP-UP>
<FINISH>)>)
(<==? .FOUND ,COSTUME>
<PUT ,FOUND-COSTUME ,PLAYER-C T>
<COND (<AND <T? ,TREASURE-FOUND>
<T? ,CONFESSED>>
<WRAP-UP>
<FINISH>)>)>
<RTRUE>>
<ROUTINE PRE-SSEARCH-FOR () <PERFORM ,V?SEARCH-FOR ,PRSI ,PRSO> <RTRUE>>
<ROUTINE V-SSEARCH-FOR () <V-FOO>>
<ROUTINE PRE-SEARCH-FOR ("AUX" OBJ)
<COND (<ROOM-CHECK> <RTRUE>)
;(<AND <IN? ,PRSI ,PLAYER>
;<GETP ,PRSI ,P?GENERIC>
<SET OBJ <APPLY <GETP ,PRSI ,P?GENERIC> ,PRSI>>>
<SETG PRSI .OBJ>)>
;<COND (<DOBJ? ;GLOBAL-ROOM GLOBAL-HERE>
<PERFORM ,PRSA ,HERE>
<RTRUE>)>
<RFALSE>>
<ROUTINE V-SEARCH-FOR ()
<COND (<IN? ,PRSO ,ROOMS>
<PERFORM ,PRSA ,GLOBAL-HERE ,PRSI>
<RTRUE>
;<START-SEARCH>)
(<FSET? ,PRSO ,PERSONBIT>
<COND (<IN? ,PRSI ,PRSO>
<TELL "Indeed," HE ,PRSO has HIM ,PRSI "." CR>)
(T
<TELL CTHE ,PRSO " doesn't have">
<COND (<IN? ,PRSI ,GLOBAL-OBJECTS>
<TELL THE ,PRSI "." CR>)
(<ZERO? ,PRSI>
<TELL " that." CR>)
(T
<TELL
THE ,PRSI " hidden on" HIS ,PRSO " person." CR>)>)>
<RTRUE>)
(<AND <FSET? ,PRSO ,CONTBIT> <NOT <FSET? ,PRSO ,OPENBIT>>>
<TELL "You'll have to open" HIM ,PRSO " first." CR>)
(<IN? ,PRSI ,PRSO>
<COND (<FSET? ,PRSI ,SECRETBIT>
<DISCOVER ,PRSI>)
(T <TELL
"How observant you are! There" HE ,PRSI is "!" CR>)>)
(<ZERO? ,PRSI> <YOU-CANT ;"search">)
(T
<TELL "You don't find">
<COND (<FSET? ,PRSI ,SECRETBIT>
;<==? <GET ,P-NAMW 1> ,W?EVIDENCE>
<TELL " it" ;" any evidence">)
(T <TELL HIM ,PRSI>)>
<TELL " there." CR>)>>
;<ROUTINE V-SEND () <YOU-CANT ;"send">>
;<ROUTINE PRE-SSEND () <PERFORM ,V?SEND ,PRSI ,PRSO> <RTRUE>>
;<ROUTINE V-SSEND () <V-FOO>>
;<ROUTINE V-SEND-OUT () <V-SEND>>
;<ROUTINE PRE-SEND-TO ()
<COND (<OR <EQUAL? ,PRSI <> ,PLAYER ,GLOBAL-HERE>
<EQUAL? ,PRSI ,PLAYER-NAME>>
<RFALSE>)
(<FSET? ,PRSO ,PERSONBIT>
<PERFORM ,V?$CALL ,PRSO>
<COND (<NOT <EQUAL? ,WINNER ,PLAYER>>
<PERFORM ,V?WALK-TO ,PRSI>)>
<RTRUE>)
(T
<DONT-UNDERSTAND>)>>
;<ROUTINE V-SEND-TO () <V-SEND>>
<ROUTINE V-SHAKE ("AUX" X)
<COND (<NOT <FSET? ,PRSO ,TAKEBIT>>
<SETG CLOCK-WAIT T>
<TELL "(You can't shake it if you can't take it!)" CR>)
(<AND <NOT <FSET? ,PRSO ,OPENBIT>>
<FIRST? ,PRSO>>
<TELL
"It sounds as if there is something inside" HIM ,PRSO "." CR>)
(<AND <FSET? ,PRSO ,OPENBIT> <SET X <FIRST? ,PRSO>>>
<TELL "Right " <GROUND-DESC> ;"Onto the ">
;<COND (<OUTSIDE? ,HERE> <TELL "ground">)
(T <TELL "floor">)>
<TELL " spill">
<COND (<ZERO? <NEXT? .X>> <TELL !\s>)>
<ROB ,PRSO ,HERE T>
<CRLF>)
(T <TELL "You hear nothing inside" HIM ,PRSO "." CR>)>>
<ROUTINE V-SHOOT ()
<COND (<AND <OR <ZERO? ,PRSI>
<NOT <EQUAL? <LOC ,PRSI> ,WINNER ;,POCKET>>>
<NOT <FIND-FLAG ,WINNER ,WEAPONBIT>>
;<NOT <FIND-FLAG ,POCKET ,WEAPONBIT>>>
<TELL "You're not holding anything to shoot with." CR>)
(T <IKILL "shoot">)>>
<ROUTINE PRE-SSHOOT () <PERFORM ,V?SHOOT ,PRSI ,PRSO> <RTRUE>>
<ROUTINE V-SSHOOT () <V-FOO>>
;<ROUTINE PRE-SHOW ()
<COND (<IN? ,PRSO ,ROOMS> ;"SHOW ME TO MY ROOM"
<PERFORM ,V?TAKE-TO ,PRSI ,PRSO>
<RTRUE>)>>
<ROUTINE V-SHOW ()
<COND (<==? ,PRSO ,PLAYER>
<SETG WINNER ,PLAYER>
<COND (<VISIBLE? ,PRSO> <PERFORM ,V?EXAMINE ,PRSI>)
(T <PERFORM ,V?FIND ,PRSI>)>
<RTRUE>)
(<OR <NOT <FSET? ,PRSO ,PERSONBIT>>
<FSET? ,PRSO ,MUNGBIT>>
<TELL "Don't wait for" HIM ,PRSO " to applaud." CR>)
(T <WHO-CARES>)>>
<ROUTINE PRE-SSHOW ("AUX" P)
<COND (<T? ,PRSI>
<SETG P-MERGED T>
<COND (<IN? ,PRSI ,ROOMS> ;"SHOW ME TO MY ROOM"
<PERFORM ,V?TAKE-TO ,PRSO ,PRSI>
<RTRUE>)>
<PERFORM ,V?SHOW ,PRSI ,PRSO>
<RTRUE>)
(<NOT <HELD? ,PRSO>>
<COND (<FSET? <LOC ,PRSO> ,PERSONBIT>
<PERFORM ,V?TAKE ,PRSO>)
(T
<TELL-I-ASSUME ,PRSO " Ask about">
<PERFORM ,V?ASK-CONTEXT-ABOUT ,PRSO>)>
<RTRUE>)
(<QCONTEXT-GOOD?>
<PERFORM ,V?SHOW ,QCONTEXT ,PRSO>
<RTRUE>)
(<SET P <FIND-FLAG-HERE-NOT ,PERSONBIT ,MUNGBIT ,WINNER>>
<TELL-I-ASSUME .P " Show">
<PERFORM ,V?SHOW .P ,PRSO>
<RTRUE>)
(T
<TELL-I-ASSUME ,PLAYER " Show">
<PERFORM ,V?SHOW ,PLAYER ,PRSO>
<RTRUE>)>>
<ROUTINE V-SSHOW () <V-FOO>>
<ROUTINE V-SIGN () <TELL "You would use your usual hand." CR>
;<YOU-CANT "write on">>
<ROUTINE PRE-SIT () <ROOM-CHECK>>
<ROUTINE V-SIT ("OPTIONAL" (LIE? <>))
<COND (<AND <==? ,WINNER ,PLAYER>
<OR <FSET? ,PRSO ,VEHBIT>
<AND <DOBJ? GLOBAL-HERE HERE FLOOR>
;<FSET? ,HERE ,SURFACEBIT>>>>
<TELL "You're now ">
<COND (<ZERO? .LIE?>
;<SETG PLAYER-SEATED ,PRSO>
<TELL "sitt">)
(T
;<SETG PLAYER-SEATED <- 0 ,PRSO>>
<TELL "ly">)>
<COND (<FSET? ,PRSO ,VEHBIT>
<MOVE ,PLAYER ,PRSO>)>
<TELL "ing ">
<COND (<FSET? ,PRSO ,SURFACEBIT> <TELL "on">) (T <TELL "in">)>
<TELL THE ;HIM ,PRSO "." CR>)
(T <WONT-HELP>)>>
<ROUTINE WONT-HELP ()
<SETG CLOCK-WAIT T>
<TELL "(That won't help solve this case!)" CR>>
<ROUTINE V-SIT-AT () <V-SIT>>
<ROUTINE V-SLAP ()
<COND (<IOBJ? ROOMS> <SETG PRSI <>>)>
<COND ;(<AND ,PRSI <NOT-HOLDING? ,PRSI>>
<RTRUE>)
(<DOBJ? PLAYER>
<TELL
"That sounds like a sign you could wear on your back." CR>)
(<NOT <FSET? ,PRSO ,PERSONBIT>>
<IF-SPY>)
(<FSET? ,PRSO ,MUNGBIT>
<TELL
"If" HE ,PRSO " could," HE ,PRSO " would slap you right back." CR>)
(T <FACE-RED>)>>
<ROUTINE IF-SPY ()
;<COND (<NOT <FSET? ,PRSO ,PERSONBIT>> <TELL "break">)
(T <TELL "drop">)>
<COND (<ZERO? ,PRSI>
<TELL "You give" HIM ,PRSO " a swift ">
<COND (<==? ,P-PRSA-WORD ,W?KICK>
<TELL "kick">)
(T <TELL "hand chop">)>)
(T <TELL "You swing" HIM ,PRSI " at" HIM ,PRSO>)>
;<THIS-IS-IT ,PRSO>
<TELL ", but" HE ,PRSO " seems indestructible." CR>>
<ROUTINE FACE-RED ("OPTIONAL" (P 0) "AUX" X)
<COND (<ZERO? .P> <SET P ,PRSO>)>
<UNSNOOZE .P>
<SET X <GETP .P ,P?LINE>>
<PUTP .P ,P?LINE <+ 1 .X>>
<COND (<EQUAL? ,FOLLOWER .P>
<SETG FOLLOWER <>>)>
<COND (<NOT <EQUAL? <GETP .P ,P?LDESC>
4 ;"looking at you with suspicion">>
;<EQUAL? .P ,FRIEND>
<PUTP .P ,P?LDESC 20 ;"ignoring you">)>
<TELL CHE .P>
<COND (<ZERO? .X>
<TELL " looks at you as if you were insane." CR>)
(T <TELL " gives you a good slap. It hurts, too!"
;" slaps you right back. Wow, is your face red!" CR>)>>
;<ROUTINE V-SLIDE () <YOU-CANT>>
<ROUTINE V-SMELL ()
<TELL CHE ,PRSO smell " just like " A ,PRSO "!" CR>>
<ROUTINE V-SMILE () <HAR-HAR>>
;<ROUTINE V-SMOKE () <YOU-CANT ;"burn">>
;<ROUTINE PRE-SORRY () <PRE-HELLO ;" sorry ">>
<ROUTINE V-SORRY ()
<COND (<OR ;<NOT <FSET? ,PRSO ,PERSONBIT>>
<==? ,PRSO ,CONFESSED>>
<WONT-HELP-TO-TALK-TO ,PRSO>)
(<NOT <GRAB-ATTENTION ,PRSO>>
<RFATAL>)
(<NOT <L? 0 <GETP ,PRSO ,P?LINE>>>
<TELL "\"I'm not angry with" HIM ,WINNER " now.\"" CR>)
(T
;<SETG DISCOVERED-HERE <>> ;"leave info for SECRET-CHECK"
<PUTP ,PRSO ,P?LINE 0 ;<- <GETP ,PRSO ,P?LINE> 1>>
<COND (T ;<EQUAL? ,PRSO ,FRIEND>
<PUTP ,PRSO ,P?LDESC 3 ;"watching you">)>
<TELL "\"Apology accepted.\"" CR>)>>
<ROUTINE V-SOUND () <YOU-CANT>>
<ROUTINE V-STOP ()
<COND (<EQUAL? ,PRSO <> ,GLOBAL-HERE>
<TELL "Hey, no problem." CR>)
(<FSET? ,PRSO ,PERSONBIT>
<PERFORM ,V?$CALL ,PRSO>
<RTRUE>)
(T
<PERFORM ,V?LAMP-OFF ,PRSO>
<RTRUE>)>>
<ROUTINE V-SWIM ()
<SETG CLOCK-WAIT T>
<TELL "(" CHE ,WINNER " can't swim ">
<COND (<T? ,PRSO>
<TELL "in" HIM ,PRSO>)
(T
<TELL <GROUND-DESC>>)>
<TELL ".)" CR>>
<ROUTINE PRE-TAKE ("AUX" L)
<SET L <LOC ,PRSO>>
<COND (<AND <DOBJ? MOONMIST>
<EQUAL? ,VARIATION ,DOCTOR-C>
<IN? ,MOONMIST ,INKWELL>
<T? ,TREASURE-FOUND>>
<SET L <LOC ,INKWELL>>)>
<COND (<DOBJ? CASTLE MOON OCEAN
NOW-WEARING OTHER-OUTFIT TOWER FLOOR
WALL KEYHOLE>
<HAR-HAR>)
(<DOBJ? ARTIFACT HANDS PASSAGE TREASURE YOU>
<RFALSE>)
(<DOBJ? LIGHT-GLOBAL NIGHTLAMP>
<COND (<CREEPY? ,HERE>
<NOT-HERE ,PRSO>)
(T <TELL "The cord isn't long enough." CR>)>)
(<DOBJ? MIRROR-GLOBAL>
<YOU-CANT>)
(<DOBJ? UNDRESSED>
<COND (<NOUN-USED? ,W?DRESSE>
<COND (<T? ,PRSI>
<PERFORM ,V?WEAR ,PRSI>
<RTRUE>)
(T
<PERFORM ,V?DRESS ,WINNER>
<RTRUE>)>)
(T ;<NOUN-USED? ,W?UNDRESS>
<PERFORM ,V?UNDRESS ,WINNER>
<RTRUE>)
;(T <NOT-HERE ,PRSO>)>)
(<IN? ,PRSO ,GLOBAL-OBJECTS>
<NOT-HERE ,PRSO>)
(<AND .L
<FSET? .L ,CONTBIT>
<NOT <FSET? .L ,OPENBIT>>>
<TOO-BAD-BUT .L "closed">
<RTRUE>)
(<T? ,PRSI>
<COND (<EQUAL? ,PRSI ,WALL ;,POCKET .L>
<SETG PRSI <>>
<RFALSE>)
;(<EQUAL? ,PRSI ,WALL>
<TOO-BAD-BUT ,PRSO "stuck tight">
<RTRUE>)
(<AND <NOT <FSET? ,PRSI ,SURFACEBIT>>
<NOT <FSET? ,PRSI ,OPENBIT>>
<NOT <FSET? ,PRSI ,PERSONBIT>>>
<TOO-BAD-BUT ,PRSI "closed">
<RTRUE>)
(<NOT <==? ,PRSI .L>>
<COND (<NOT <FSET? ,PRSI ,PERSONBIT>>
<TELL CHE ,PRSO is "n't in" THE ,PRSI "!" CR>)
(T <TELL
CHE ,PRSI do "n't have" THE ,PRSO "!" CR>)>)>)
(T <PRE-TAKE-WITH>)>>
<ROUTINE PRE-TAKE-WITH ("AUX" X)
<COND (<DOBJ? YOU>
<RFALSE>)
(<AND <FSET? ,PRSO ,PERSONBIT>
<NOT <DOBJ? GHOST-NEW>>
<EQUAL? ,P-PRSA-WORD ,W?SEIZE ,W?GRAB>> ;"SEIZE villain"
<PERFORM ,V?ARREST ,PRSO>
<RTRUE>)
(<EQUAL? <META-LOC ,PRSO> ,GLOBAL-OBJECTS>
<COND (<AND <NOT <HELD? ,PRSO>>
<NOT <FSET? ,PRSO ,PERSONBIT>>>
<NOT-HERE ,PRSO>)>)
(<IN? ,PRSO ,WINNER>
<ALREADY ,PLAYER>
<TELL "holding" THE ,PRSO "!)" CR>)
(<AND <FSET? <LOC ,PRSO> ,CONTBIT>
<NOT <FSET? <LOC ,PRSO> ,OPENBIT>>>
<YOU-CANT "reach">)
(<AND <IN? ,WINNER ,PRSO>
<NOT <NOUN-USED? ,W?DOOR ,W?KEYHOLE>>>
<SETG CLOCK-WAIT T>
<TELL !\( CHE ,WINNER is " in" HIM ,PRSO ", nitwit!)" CR>)>>
<ROUTINE V-TAKE ()
<COND (<==? <ITAKE> T>
<TELL CHE ,WINNER is " now holding" THE ;HIM ,PRSO "." CR>)>>
<ROUTINE V-TAKE-OFF ()
<COND (<DOBJ? NOW-WEARING>
<SETG PRSO <>>
<V-WEAR>
<RTRUE>)
;(<WEAR-CHECK>
<RTRUE>)
(<FSET? ,PRSO ,WORNBIT>
<FCLEAR ,PRSO ,WORNBIT>
<TELL "Okay," HE <LOC ,PRSO> is " no longer wearing">
<MOVE ,PRSO ,WINNER>
<TELL HIM ,PRSO "." CR>)
(T
<TELL CHE <LOC ,PRSO> is "n't wearing" HIM ,PRSO "!" CR>)>>
<ROUTINE V-TAKE-TO () ;"Parser should have ITAKEn PRSO."
<PERFORM ,V?WALK-TO ,PRSI>
<RTRUE>>
;<ROUTINE V-TAKE-WITH ()
<TELL "You can't remove" HIM ,PRSO " with" HIM ,PRSI "!" CR>>
<ROUTINE V-DISEMBARK ()
<COND (<ROOM-CHECK>
<RTRUE>)
(<DOBJ? ROOMS HERE GLOBAL-HERE ;GLOBAL-WATER>
<COND (<AND <==? ,WINNER ,PLAYER>
<NOT <IN? ,PLAYER ,HERE>>
;<T? ,PLAYER-SEATED>>
<OWN-FEET>)
(T
<DO-WALK ,P?OUT>
<RTRUE>)>)
(<DOBJ? NOW-WEARING>
<V-TAKE-OFF>
<RTRUE>)
(<==? <LOC ,PRSO> ,WINNER>
<TELL
"You don't need to take" HIM ,PRSO " out to use" HIM ,PRSO "." CR>)
;(<==? <LOC ,PRSO> ,POCKET>
<MOVE ,PRSO ,WINNER>
<TELL CHE ,WINNER is " now holding" HIM ,PRSO "." CR>)
(<AND <NOT <==? <LOC ,WINNER> ,PRSO>>
<NOT <IN? ,PLAYER ,PRSO>>
;<NOT <EQUAL? ,PLAYER-SEATED ,PRSO <- 0 ,PRSO>>>>
<TELL "You're not ">
<COND (<FSET? ,PRSO ,SURFACEBIT> <TELL "on">) (T <TELL "in">)>
<TELL HIM ,PRSO "!|">
<RFATAL>)
(T
<OWN-FEET>)>>
<ROUTINE OWN-FEET ()
<MOVE ,WINNER ,HERE>
;<COND (<==? ,WINNER ,PLAYER>
<SETG PLAYER-SEATED <>>)>
<TELL CHE ,WINNER is " on" HIS ,WINNER " own feet again." CR>
<COND (<EQUAL? ,DRIVEWAY ,HERE>
<ENTER-ROOM>)> ;"to conform with manual"
<RTRUE>>
<ROUTINE V-HOLD-UP ()
<COND (<DOBJ? ROOMS>
<PERFORM ,V?STAND>
<RTRUE>)
(T
<WONT-HELP>
;<TELL "That doesn't seem to help at all." CR>)>>
;<ROUTINE PRE-TELL () <PRE-ASK-ABOUT>>
<ROUTINE V-TELL ("AUX" P)
<COND (<==? ,PRSO ,PLAYER>
<COND (<NOT <==? ,WINNER ,PLAYER>>
<SET P ,WINNER>
<SETG WINNER ,PLAYER>
<PERFORM ,V?ASK .P>
<RTRUE>)
(<T? ,QCONTEXT>
<SETG QCONTEXT <>>
<COND (<T? ,P-CONT>
<SETG WINNER ,PLAYER>)
(T <TELL
"Okay, you're not talking to anyone else." CR>)>)
(T
<WONT-HELP-TO-TALK-TO ,PLAYER>
<SETG QUOTE-FLAG <>>
<SETG P-CONT <>>
<RFATAL>)>)
(<AND <FSET? ,PRSO ,PERSONBIT>
<NOT <FSET? ,PRSO ,MUNGBIT>>>
<UNSNOOZE ,PRSO>
<SETG QCONTEXT ,PRSO>
<COND (<T? ,P-CONT>
<SETG CLOCK-WAIT T>
<SETG WINNER ,PRSO>)
(T
<TELL
CHE ,PRSO is !\ <GET ,LDESC-STRINGS 12> ;"listening to you" "." CR>)>)
(T
<WONT-HELP-TO-TALK-TO ,PRSO>
;<YOU-CANT "talk to">
<SETG QUOTE-FLAG <>>
<SETG P-CONT <>>
<RFATAL>)>>
<ROUTINE PRE-STELL-ABOUT () <PERFORM ,V?TELL-ABOUT ,PRSI ,PRSO> <RTRUE>>
<ROUTINE V-STELL-ABOUT () <V-FOO>>
<ROUTINE PRE-TELL-ABOUT ("AUX" P)
<COND (<DOBJ? PLAYER PLAYER-NAME>
<COND (<QCONTEXT-GOOD?>
<PERFORM ,V?ASK-ABOUT ,QCONTEXT ,PRSI>)
(<AND <SET P <FIND-FLAG-HERE-NOT ,PERSONBIT ,MUNGBIT ,WINNER>>>
<TELL-I-ASSUME .P " Ask">
<PERFORM ,V?ASK-ABOUT .P ,PRSI>)
(T <ARENT-TALKING>)>
<RTRUE>)
(<AND <NOT <FSET? ,PRSI ,SEENBIT>>
<NOT <FSET? ,PRSI ,TOUCHBIT>>>
<NOT-FOUND ,PRSI>
<RTRUE>)
(<OR <EQUAL? ,PRSI ,BRICKS ,COFFIN ,CRYPT>
<EQUAL? ,PRSI ,DUNGEON ,IRON-MAIDEN ,TOMB>
<EQUAL? ,PRSI ,WELL>>
<TELL ,ANCIENT-SECRETS CR>)
(T <PRE-ASK-ABOUT>)>>
<ROUTINE V-TELL-ABOUT ("AUX" P)
<COND ;(<DOBJ? PLAYER>
<COND (<SET P <GETP ,PRSI ,P?TEXT>>
<TELL .P CR>)
(T <ARENT-TALKING>)>)
(T
<TELL "\"I'm afraid you'll have to show me instead of telling me.\""
;"\"I don't see why that's important now.\"" CR>
;<PERFORM ,V?ASK-ABOUT ,PRSO ,PRSI>
<RTRUE>)>>
<ROUTINE PRE-TALK-ABOUT ("AUX" P)
<COND (<NOT <==? ,WINNER ,PLAYER>>
<SET P ,WINNER>
<SETG WINNER ,PLAYER>
<PERFORM ,V?ASK-ABOUT .P ,PRSO>
<RTRUE>)
(<QCONTEXT-GOOD?>
<PERFORM ,V?ASK-ABOUT ,QCONTEXT ,PRSO>
<RTRUE>)
(<SET P <FIND-FLAG-HERE-NOT ,PERSONBIT ,MUNGBIT ,WINNER>>
<TELL-I-ASSUME .P " to">
<PERFORM ,V?ASK-ABOUT .P ,PRSO>
<RTRUE>)>>
<ROUTINE V-TALK-ABOUT () <ARENT-TALKING>>
<GLOBAL QUITE-WELCOME "\"You're quite welcome, I'm sure.\"|">
<ROUTINE V-THANKS ()
<COND (<T? ,PRSO>
<COND (<AND <FSET? ,PRSO ,PERSONBIT>
<NOT <FSET? ,PRSO ,MUNGBIT>>>
<TELL ,QUITE-WELCOME>
<RTRUE>)
(T <YOU-CANT>)>)
(T
<COND (<OR <QCONTEXT-GOOD?>
<FIND-FLAG-HERE-NOT ,PERSONBIT ,MUNGBIT ,WINNER>>
<TELL ,QUITE-WELCOME>)
(T <TELL "You're more than welcome." CR>)>)>>
<ROUTINE V-THROW () <COND (<IDROP> <TELL "Thrown." CR>)>>
<ROUTINE V-THROW-AT ()
<COND (<NOT <IDROP>>
<RTRUE>)>
<COND ;(<AND <FSET? ,PRSI ,PERSONBIT>
<NOT <FSET? ,PRSI ,MUNGBIT>>>
<TELL CHE ,PRSI duck>)
(T <TELL CHE ,PRSI do "n't duck">)>
<TELL " as" HE ,PRSO " flies by." CR>>
;<ROUTINE V-THROW-OFF ("AUX" X) <YOU-CANT "throw off">>
<ROUTINE PRE-THROW-THROUGH ()
<FCLEAR ,PRSO ,WORNBIT>
<RFALSE>>
<ROUTINE V-THROW-THROUGH ()
<COND (<NOT <FSET? ,PRSO ,PERSONBIT>>
<TELL "Let's not resort to vandalism, please." CR>)
(T <V-THROW>)>>
;<ROUTINE PRE-TIE-TO ()
<COND (<NOT <FSET? ,PRSO ,PERSONBIT>>
<TELL "That won't do any good." CR>)>>
;<ROUTINE V-TIE-TO ()
<TELL "You can't tie" HIM ,PRSO " to" THE ,PRSI "." CR>>
;<ROUTINE PRE-TIE-WITH ()
<COND (<OR <NOT <FSET? ,PRSO ,PERSONBIT>>
<NOT <FSET? ,PRSI ,TOOLBIT>>>
<TELL "That won't do any good." CR>)>>
;<ROUTINE V-TIE-WITH ()
<TELL "\"If you don't formally arrest me first, I'll sue!\"" CR>>
<ROUTINE V-TIME ()
<TELL "The time is now ">
<TIME-PRINT ,PRESENT-TIME>
<TELL "." CR>>
<ROUTINE TIME-PRINT (NUM "AUX" HR ;(AM <>))
<SET HR </ .NUM 60>>
<COND (<G? .HR 12>
<SET HR <- .HR 12>>
;<SET AM T>)
;(<==? .HR 12> <SET AM T>)>
<PRINTN .HR>
<TELL !\:>
<COND (<L? <SET HR <MOD .NUM 60>> 10>
<TELL !\0>)>
<TELL N .HR>
;<TELL !\ <COND (.AM "a.m.") (T "p.m.")>>>
<ROUTINE V-TURN ()
<COND ;(<EQUAL? <META-LOC ,PRSO> ,GLOBAL-OBJECTS>
<NOT-HERE ,PRSO>)
(<AND <FSET? ,PRSO ,DOORBIT> <FSET? ,PRSO ,OPENBIT>>
<PERFORM ,V?CLOSE ,PRSO>
<RTRUE>)
(T <TELL "What do you want that to do?" CR>)>>
<ROUTINE V-LAMP-OFF ()
<COND (<NOT <FSET? ,PRSO ,LIGHTBIT>>
<YOU-CANT "turn off">)
(<NOT <FSET? ,PRSO ,ONBIT>>
<ALREADY ,PRSO "off">)
(T
<OKAY ,PRSO "off">)>>
<ROUTINE V-LAMP-ON ()
<COND (<FSET? ,PRSO ,ONBIT>
<ALREADY ,PRSO "on">)
(<FSET? ,PRSO ,LIGHTBIT>
<OKAY ,PRSO "on">)
(<FSET? ,PRSO ,PERSONBIT>
<HAR-HAR>)
(T <YOU-CANT "turn on">)>>
<ROUTINE V-UNLOCK ()
<COND (<OR <FSET? ,PRSO ,DOORBIT>
<AND <FSET? ,PRSO ,CONTBIT>
<NOT <ZERO? <GETP ,PRSO ,P?CAPACITY>>>>>
<COND (<NOT <FSET? ,PRSO ,LOCKED>>
<ALREADY ,PRSO "unlocked">)
(<ZERO? <UNLOCK-DOOR? ,PRSO>>
<YOU-CANT>)
(T
;<COND (<FSET? ,PRSO ,OPENBIT>
<FCLEAR ,PRSO ,OPENBIT>
<FIRST-YOU "close" ,PRSO>)>
<FCLEAR ,PRSO ,LOCKED>
<OKAY ,PRSO "unlocked">)>)
(T
<SETG CLOCK-WAIT T>
<TELL !\( CHE ,PRSO is "n't locked!)" CR>)>>
;<ROUTINE V-UNTIE ()
<TELL "You can't tie" HIM ,PRSO ", so you can't untie" HIM ,PRSO "!" CR>>
<ROUTINE MORE-SPECIFIC ()
<SETG CLOCK-WAIT T>
<TELL "[Please be more specific.]" CR>>
<ROUTINE V-USE () <MORE-SPECIFIC>>
"V-WAIT has three modes, depending on the arguments:
1) If only one argument is given, it will wait for that many moves.
2) If a second argument is given, it will wait the least of the first
argument number of moves and the time at which the second argument
(an object) is in the room with the player.
3) If the third argument is given, the second should be FALSE. It will
wait <first argument> number of moves (or at least try to). The
third argument means that an 'internal wait' is happening (e.g. for
a 'careful' search)."
;<GLOBAL WHO-WAIT:NUMBER 0>
<GLOBAL KEEP-WAITING <>>
<ROUTINE V-WAIT ("OPTIONAL" (NUM -1) (WHO <>) (INT <>)
"AUX" (WHO-WAIT 0) VAL HR (RESULT T))
<COND (<==? -1 .NUM>
<SET NUM 10>)>
<COND (<AND <ZERO? .INT>
<AND <NOT <FSET? ,PRSO ,PERSONBIT>>
<NOT <DOBJ? INTNUM TURN GHOST-NEW>>>>
<TELL ,I-ASSUME " Wait " N .NUM " minute">
<COND (<NOT <1? .NUM>>
<TELL !\s>)>
<TELL ".]" CR>)>
<SET HR ,HERE>
<COND (<NOT .INT> <TELL "Time passes..." CR>)>
<DEC NUM>
<REPEAT ()
<COND (<L? <SET NUM <- .NUM 1>> 0>
<SETG KEEP-WAITING <>>
<RETURN>)
(<SET VAL <CLOCKER>>
<COND (<OR <==? .VAL ,M-FATAL>
<NOT <==? .HR ,HERE>>>
<SETG CLOCK-WAIT T>
<SET RESULT ,M-FATAL>
<RETURN>)
;(<0? .NUM> <RETURN>)
(<AND .WHO <IN? .WHO ,HERE>>
<SETG CLOCK-WAIT T>
<NOT-IT .WHO>
<TELL CTHE .WHO ", for wh">
<COND (<FSET? .WHO ,PERSONBIT>
<TELL "om">)
(T <TELL "ich">)>
<TELL " you're waiting, has arrived." CR>
<RETURN>)
(T
<SET WHO-WAIT <+ .WHO-WAIT 1>>
<COND (<T? <BAND <LOWCORE ZVERSION> 16>>
<TELL !\(>
<SET VAL <TIME-PRINT ,PRESENT-TIME>>
<TELL ") ">)>
<COND (<T? ,KEEP-WAITING>
<USL>
<AGAIN>)>
<TELL "Do you want to keep ">
<SET VAL <VERB-PRINT T>>
<COND (<YES?> <USL>)
(T
<SETG CLOCK-WAIT T>
<SET RESULT ,M-FATAL>
<RETURN>)>)>)
(<AND .WHO <G? <SET WHO-WAIT <+ .WHO-WAIT 1>> 30>>
<SET VAL <START-SENTENCE .WHO>>
<TELL
" still hasn't arrived. Do you want to keep waiting?">
<COND (<NOT <YES?>> <RETURN>)>
<SET WHO-WAIT 0>
<USL>)
(T <USL>)>>
%<DEBUG-CODE <COND (<NOT .INT>
<TELL "{" ;"Note to Stu: ">
<TIME-PRINT ,PRESENT-TIME>
<TELL "}|">
;<V-TIME>)>>
.RESULT>
;<ROUTINE INT-WAIT (N "AUX" TIM REQ VAL)
<SET TIM ,PRESENT-TIME>
<COND (<==? ,M-FATAL <V-WAIT <SET REQ <RANDOM <* .N 2>>> <> T>>
<RFATAL>)
(<NOT <L? <- ,PRESENT-TIME .TIM> .REQ>>
<RTRUE>)
(T <RFALSE>)>>
<ROUTINE V-WAIT-FOR ("AUX" WHO)
<COND (<AND <NOT <==? -1 ,P-NUMBER>>
<DOBJ? ROOMS TURN INTNUM>>
<COND ;(<G? ,P-NUMBER ,PRESENT-TIME> <V-WAIT-UNTIL> <RTRUE>)
;(<G? ,P-NUMBER 180>
<TELL "That's too long to wait." CR>)
(<T? ,P-TIME>
<V-WAIT-UNTIL>)
(T <V-WAIT ,P-NUMBER>)>)
(<DOBJ? ROOMS TURN GLOBAL-HERE>
<V-WAIT>)
(<DOBJ? PLAYER>
<ALREADY ,PLAYER "here">)
(<OR <FSET? ,PRSO ,PERSONBIT>
<DOBJ? GHOST-NEW>>
<COND (<==? <META-LOC ,PRSO> ,HERE>
<ALREADY ,PRSO "here">)
(T <V-WAIT 10000 ,PRSO>)>)
(T <TELL "Not a good idea. You might wait forever." CR>)>>
<ROUTINE V-WAIT-UNTIL ("AUX" N)
<COND (<AND <NOT <==? -1 ,P-NUMBER>>
<DOBJ? ROOMS TURN INTNUM>>
<SET N ,P-NUMBER>
<COND (<T? ,P-TIME>
<COND (<L? .N 420>
<SET N <+ .N 720>>)>)
(T
<COND (<L? .N 8 ;7>
<SET N <+ <* .N 60> 720>>)
(<L? .N 13>
<SET N <* .N 60>>)
(<L? .N 24>
<SET N <- <* .N 60> 720>>)
(<G? .N 99>
<SET N <+ <MOD .N 100>
<* </ .N 100> 60>>>)>
<COND (<L? .N 420>
<SET N <+ .N 720>>)>
<TELL ,I-ASSUME !\ >
<TIME-PRINT .N>
<TELL "]" CR>)>
<COND (<G? .N ,PRESENT-TIME>
<V-WAIT <- .N ,PRESENT-TIME>>)
(T
<SETG CLOCK-WAIT T>
<TELL "(It's already past that time!)" CR>)>)
(T <YOU-CANT "wait until">)>>
<ROUTINE V-ALARM ()
<COND (<==? ,PRSO ,ROOMS>
;<SETG OPRSO ,PRSO>
<SETG PRSO ,WINNER>)>
<COND ;(<FSET? ,PRSO ,PERSONBIT>
<COND (<FSET? ,PRSO ,MUNGBIT>
<WONT-HELP-TO-TALK-TO ,PRSO>
;<TELL " doesn't respond." CR>)
(T <TELL
CHE ,PRSO " is wide awake, or haven't you noticed?" CR>)>)
(T
<TOO-BAD-BUT ,PRSO "not asleep">)>>
<ROUTINE DO-WALK (DIR "AUX" P)
<SETG P-WALK-DIR .DIR>
<PERFORM ,V?WALK .DIR>>
<ROUTINE V-WALK ("AUX" PT PTS STR RM)
<COND (<ZERO? ,P-WALK-DIR>
<COND (<AND <==? ,PRSO ,P?IN>
<OR <IN? ,P-IT-OBJECT ,ROOMS>
<FSET? ,P-IT-OBJECT ,VEHBIT>
<FSET? ,P-IT-OBJECT ,CONTBIT>>>
<TELL-I-ASSUME ,P-IT-OBJECT ;" Go in">
<PERFORM ,V?THROUGH ,P-IT-OBJECT>
<RTRUE>)
(T
<V-WALK-AROUND>
<RFATAL>)>)>
<COND (<SET PT <GETPT <LOC ,WINNER> ,PRSO>>
<COND (<==? <SET PTS <PTSIZE .PT>> ,UEXIT>
<SET RM <GET-REXIT-ROOM .PT>>
<COND (<GOTO .RM> <OKAY>)>
<RTRUE>)
(<==? .PTS ,NEXIT>
<SETG CLOCK-WAIT T>
<TELL !\( <GET .PT ,NEXITSTR> !\) CR>
<RFATAL>)
(<==? .PTS ,FEXIT>
<COND (<SET RM <APPLY <GET .PT ,FEXITFCN>>>
<COND (<GOTO .RM> <OKAY>)>
<RTRUE>)
(T
<RFATAL>)>)
(<==? .PTS ,CEXIT>
<COND (<VALUE <GETB .PT ,CEXITFLAG>>
<COND (<GOTO <GET-REXIT-ROOM .PT>> <OKAY>)>
<RTRUE>)
(<SET STR <GET .PT ,CEXITSTR>>
<TELL .STR CR>
<RFATAL>)
(T
<YOU-CANT "go">
<RFATAL>)>)
(<==? .PTS ,DEXIT>
<COND (<WALK-THRU-DOOR? .PT>
<COND (<GOTO <GET-REXIT-ROOM .PT>> <OKAY>)>
<RTRUE>)
(T <RFATAL>)>)>)
(<EQUAL? ,PRSO ,P?IN ,P?OUT>
<V-WALK-AROUND>)
(<EQUAL? ,PRSO ,P?UP>
<PERFORM ,V?CLIMB-UP ,STAIRS>
<RTRUE>)
(<EQUAL? ,PRSO ,P?DOWN>
<PERFORM ,V?CLIMB-DOWN ,STAIRS>
<RTRUE>)
(<EQUAL? ,HERE ,DRIVEWAY>
<TELL ,CASTLE-IS-SOUTH>
<RFATAL>)
(T
<YOU-CANT "go">
<RFATAL>)>>
<GLOBAL CASTLE-IS-SOUTH "(The castle is south of here.)|">
<ROUTINE UNLOCK-DOOR? (DR)
<COND (<EQUAL? ,HERE .DR>
<RTRUE>)
(<EQUAL? ,HERE ;,CAR ,DRIVEWAY <GETP ,HERE ,P?STATION>>
<RFALSE>)
(<EQUAL? .DR ,SECRET-SITTING-DOOR ,FRONT-GATE>
<RFALSE>)
(T <RTRUE>)>>
<ROUTINE WALK-THRU-DOOR? (PT "OPTIONAL" (OBJ 0) (TELL? T)
"AUX" RM)
<COND (<ZERO? .OBJ>
<SET OBJ <GET-DOOR-OBJ .PT>>)>
;<SET RM <GET-REXIT-ROOM .PT>>
<COND (<FSET? .OBJ ,OPENBIT>
<RTRUE>)
(<AND <FSET? .OBJ ,SECRETBIT>
<NOT <FSET? .OBJ ,TOUCHBIT ;,SEENBIT>>>
<COND (<EQUAL? <> .TELL? ,VERBOSITY>
<RFALSE>)
(<NOT <FSET? ,HERE ,SECRETBIT>>
<YOU-CANT "go">
<RFALSE>)
(<ZERO? ,LIT>
<NOT-FOUND .OBJ>
<RFALSE>)
(T
<COND (<NOT <VERB? WALK-TO>>
<OPEN-DOOR-AND-CLOSE-IT-AGAIN .OBJ>)>
<RTRUE>)>)
(<NOT <FSET? .OBJ ,LOCKED>>
<COND (<NOT <VERB? WALK-TO>>
<FCLEAR .OBJ ,SECRETBIT>
<FSET .OBJ ,SEENBIT ;,TOUCHBIT>
;"Don't put TOUCHBIT on ROOM"
<COND (<NOT <EQUAL? <> .TELL? ,VERBOSITY>>
<OPEN-DOOR-AND-CLOSE-IT-AGAIN .OBJ>)>)>
<RTRUE>)
(<AND <T? .PT>
<SET RM <GET .PT ,DEXITSTR>>>
<COND (<T? .TELL?>
<TELL .RM CR>)>
<RFALSE>)
(T
<COND (<ZERO? .TELL?>
<RFALSE>)
(<T? <UNLOCK-DOOR? .OBJ>>
<COND (<AND <NOT <VERB? WALK-TO>>
<T? ,VERBOSITY>>
<OPEN-DOOR-AND-CLOSE-IT-AGAIN .OBJ>)>
<RTRUE>)
;(<IN? .OBJ ,ROOMS>
;<COND (<VERB? WALK-TO>
<TELL ", but t">)
(T )>
<TELL "The door is locked." CR>
;<COND (<NOT <VERB? WALK-TO>>
)>)
(T <TOO-BAD-BUT .OBJ "locked">)>
<THIS-IS-IT .OBJ>
<RFALSE>)>>
<ROUTINE OPEN-DOOR-AND-CLOSE-IT-AGAIN (OBJ)
<FSET .OBJ ,SEENBIT ;,TOUCHBIT> ;"Don't put TOUCHBIT on ROOM"
<COND (<NOT <==? ,WINNER ,PLAYER>>
<RTRUE>)>
<TELL "(You ">
<COND (<FSET? .OBJ ,LOCKED>
<FCLEAR .OBJ ,LOCKED>
<TELL "unlock and ">)>
<TELL "open the ">
<COND (<EQUAL? .OBJ ,FRONT-GATE> <TELL "gate">)
(T <TELL "door">)>
<COND (<FSET? .OBJ ,SECRETBIT>
<FSET .OBJ ,OPENBIT>)
(T <TELL " and close it again">)>
<TELL ".)" CR>>
<ROUTINE V-WALK-AROUND ()
<SETG CLOCK-WAIT T>
<TELL !\[ ,WHICH-DIR "]|">
<RFATAL>>
<ROUTINE WHO-KNOWS? (OBJ)
<SETG CLOCK-WAIT T>
<TELL "(Who knows where" HE .OBJ is "?)" CR>>
;<ROUTINE V-BACK-UP () <WALK-WITHIN-ROOM>>
<ROUTINE WALK-WITHIN-ROOM () <NO-NEED "move around within" ,HERE ;" a place">>
<ROUTINE V-WALK-TO ("AUX" L VAL)
<SET L <META-LOC ,PRSO>>
<COND (<FSET? ,PRSO ,PERSONBIT>
<COND (<AND <==? <META-LOC ,WINNER> .L>
<NOT <FSET? ,PRSO ,NDESCBIT>>>
<BITE-YOU>
<RTRUE>)
(<NOT <SET L <FOLLOW-LOC?>>>
;<ZERO? <SET L <GET ,FOLLOW-LOC <GETP ,PRSO ,P?CHARACTER>>>>
<WHO-KNOWS? ,PRSO>
<RFATAL>)
;(<==? <PRE-FIND> ,M-FATAL>
<RFATAL>)>)>
%<DEBUG-CODE <COND (<T? ,DBUG> <TELL "{WALK-TO: " D ,PRSO !\/ D .L "}|">)>>
<COND (<AND <FSET? ,PRSO ,SECRETBIT>
<NOT <==? .L ,PRSO>>>
<NO-FUN>)
(<AND <EQUAL? ,HERE <LOC ,WINNER>>
<OR <EQUAL? .L ,HERE>
<EQUAL? ,PRSO ,PSEUDO-OBJECT ,WALL>
<AND <NOT <IN? .L ,ROOMS>>
<GLOBAL-IN? ,PRSO ,HERE>>>>
<WALK-WITHIN-ROOM>)
(<AND <OR <EQUAL? .L ,LOCAL-GLOBALS> ;<FSET? ,PRSO ,DOORBIT>>
;<GLOBAL-IN? ,PRSO ,HERE>>
<MORE-SPECIFIC>)
(<TOUR?>
<RTRUE>)
(<APPLY <GETP ,HERE ,P?ACTION> ,M-EXIT>
<RTRUE>)
(<DOBJ? INTDIR>
<V-WALK-AROUND>)
(<OR ;<AND <FSET? ,PRSO ,PERSONBIT> ;"done above"
<FSET? ,PRSO ,NDESCBIT>>
<AND <NOT <IN? ,PRSO ;.L ,ROOMS>>
<NOT <FSET? ,PRSO ,TOUCHBIT>>>>
<WHO-KNOWS? ,PRSO>
<RFATAL>)
(<FAR-AWAY? .L>
<SETG CLOCK-WAIT T>
<TELL !\( CHE ,WINNER " can't go there from here">
<COND (<NOT <EQUAL? .L ,GLOBAL-OBJECTS>>
<TELL ", at least not directly">)>
<TELL ".)" CR>)
(<NOT <EQUAL? ,WINNER ,PLAYER>>
<COND (<GOTO .L>
<COND (<EQUAL? ,WINNER ,FOLLOWER>
<SETG FOLLOWER 0>)>
<SET L <GT-O ,WINNER>>
<COND (<T? <GET .L ,GOAL-S>>
<ESTABLISH-GOAL ,WINNER
<GET .L ,GOAL-F>
<GET .L ,GOAL-ENABLE>>)>
<OKAY>
;<TELL "\"Okay.\"" CR>)>
<RTRUE>)
(T
<COND (<SEE-INTO? ,PRSO <> ;T>
<SET VAL <DIR-FROM ,HERE .L>>
<COND (<T? .VAL>
<COND (<==? ,M-FATAL <APPLY <GETP ,HERE ,P?ACTION> .VAL>>
<RFATAL>)>)>
<GOTO ,PRSO <>>
<RTRUE>)
(<ZERO? ,NOW-WEARING>
<YOUR-ROOM-F ,P?OUT>
<RFATAL>)>
<TELL "You go quickly toward" THE .L ;" that place" ".|">
;<COND (<EQUAL? ,HERE ,YOUR-BATHROOM>
<MOVE ,PLAYER ,YOUR-ROOM>)>
<ESTABLISH-GOAL ,PLAYER .L>
<SETG OHERE ,HERE>
<FSET ,PLAYER ,INVISIBLE>
<REPEAT ()
<COND (<SET VAL <FOLLOW-GOAL ,PLAYER>>
<RETURN>)>>
<FCLEAR ,PLAYER ,INVISIBLE>
<COND (<T? ,FOLLOWER>
<FRIEND-FOLLOWS-YOU ,HERE>)>
<COND (<NOT <==? ,OHERE ,HERE>>
<ENTER-ROOM>)>
.VAL)>>
<GLOBAL DISCOVERED-HERE:OBJECT <>>
<ROUTINE ENTER-ROOM ("AUX" VAL)
<SETG LIT <LIT? ;,HERE>>
<COND (<FSET? ,HERE ,SECRETBIT>
<SETG WASHED <>>)
(<OR <EQUAL? ,HERE ,JACK-ROOM ,TAMARA-ROOM ,IRIS-ROOM>
<EQUAL? ,HERE ,WENDISH-ROOM ,VIVIEN-ROOM ,IAN-ROOM>
<EQUAL? ,HERE ,HYDE-ROOM>>
<TELL
"You enter the room cautiously after a preliminary peek.">
<COND (<AND ;<ZERO? ,LIONEL-SPEAKS-COUNTER>
<NOT <EQUAL? <LOC <GET ,CHARACTER-TABLE
<- <ZMEMQ ,HERE ,CHAR-ROOM-TABLE> 1>>>
,HERE ,LOCAL-GLOBALS>>>
<SETG DISCOVERED-HERE ,HERE>
<QUEUE I-DISCOVERED 6 ;5>)>
<COND (<AND <T? ,LIT>
<ZERO? <FIND-FLAG-HERE ,PERSONBIT ,PLAYER>>>
<TELL " No one is there.">)>
<CRLF>)>
<APPLY <GETP ,HERE ,P?ACTION> ,M-ENTER>
<SET VAL <V-FIRST-LOOK>>
<APPLY <GETP ,HERE ,P?ACTION> ,M-FLASH>
.VAL>
;<ROUTINE V-WALK-UNDER () <YOU-CANT "go under">>
<ROUTINE V-RUN-OVER () <TELL "That doesn't make much sense." CR>>
<GLOBAL NO-CHANGING
"Before you unfasten even the first button, you decide
that this isn't a good place to undress.|">
<ROUTINE NO-CHANGING? ("AUX" X)
;<SET X <FIRST? ,HERE>>
;<REPEAT ()
<COND (<ZERO? .X> <RETURN>)
(<AND <FSET? .X ,PERSONBIT>
<NOT <FSET? .X ,MUNGBIT>>
<NOT <FSET? .X ,RMUNGBIT>>
<NOT <FSET? .X ,NDESCBIT>>
<NOT <EQUAL? .X ,WINNER>>>
<RETURN>)
(T <SET X <NEXT? .X>>)>>
<COND (<SET X <FIND-FLAG-HERE-NOT ,PERSONBIT ,MUNGBIT ,WINNER>>
<COND (<EQUAL? .X ,GHOST-NEW>
<TELL ,NO-CHANGING>
<RTRUE>)
(T <TELL
CHE .X " says, \"I wish you wouldn't change clothes while I'm here!\"" CR>
<RTRUE>)>)
(<EQUAL? ,HERE ,YOUR-BATHROOM ,YOUR-ROOM>
;<COND (<NOT <ZERO? ,NOW-WEARING>>
;<MOVE ,NOW-WEARING ,WINNER>
<FCLEAR ,NOW-WEARING ,WORNBIT>
<SETG NOW-WEARING <>>)>
<RFALSE>)
(T
<TELL ,NO-CHANGING>
;<COND (<EQUAL? ,HERE ,YOUR-ROOM>
<TELL " Someone might come in without knocking.">)>
<RTRUE>)>>
<ROUTINE V-WEAR ("AUX" X)
<COND (<NOT <ZERO? ,PRSO>>
<COND (<NOT <FSET? ,PRSO ,WEARBIT>>
<TELL CHE ,WINNER " can't wear" HIM ,PRSO>
<COND (<DOBJ? NECKLACE-OF-D>
<TELL ", because" ,CLASP-MUNGED>)>
<TELL "." CR>
<RTRUE>)
(<FSET? ,PRSO ,WORNBIT>
<ALREADY ,PRSO "being worn">
<RTRUE>)>)>
<COND (<NOT <DOBJ? NECKLACE ;NECKLACE-OF-D EARRING ;HEADDRESS
;WIG LENS LENS-1 LENS-2>>
<COND (<NO-CHANGING?>
<RTRUE>)
(<NOT <ZERO? ,NOW-WEARING>>
;<MOVE ,NOW-WEARING ,WINNER>
<COND (<T? ,PRSO>
<FIRST-YOU "remove" ,NOW-WEARING>)>
<FCLEAR ,NOW-WEARING ,WORNBIT>
;<SETG NOW-WEARING <>>)>
<SETG NOW-WEARING ,PRSO>)>
<COND (<NOT <ZERO? ,PRSO>>
<MOVE ,PRSO ,PLAYER ;,GLOBAL-OBJECTS>
<FSET ,PRSO ,WORNBIT>
<COND (<OR <DOBJ? NECKLACE ;NECKLACE-OF-D EARRING ;HEADDRESS
;WIG LENS LENS-1 LENS-2>
<FSET? ,PRSO ,MUNGBIT>>
<TELL "Okay." CR>)
(T
<FSET ,PRSO ,MUNGBIT>
<TELL
"Ahhh! Nothing like a new outfit to change your whole outlook!" CR>)>
<RTRUE>)
(T
<TELL "Okay... ">
<COND (<ZERO? ,GENDER-KNOWN>
<TELL "You immediately wish for central heating!" CR>)
(T
<TELL "My, what a fine figure of a ">
<COND (<FSET? ,PLAYER ,FEMALE> <TELL "wo">)>
<TELL "man!" CR>)
;(<FSET? ,PLAYER ,FEMALE>
<TELL "Wow, are you ever beautiful!" CR>)>)>>
<ROUTINE V-YELL ("AUX" (N 0) RM P)
<COND (<OR <SET P <QCONTEXT-GOOD?>>
<SET P <FIND-FLAG-HERE-NOT ,PERSONBIT ,MUNGBIT ,WINNER>>>
<TELL CTHE .P " says, \"I'm right here. You needn't yell.\"" CR>
<RTRUE>)
(T
<COND (<AND <==? 3 <GETP ,HERE ,P?CHARACTER>>
<OR <FSET? ,HERE ,WEARBIT> ;"WING-ROOMS"
<AND <NOT <FSET? ,HERE ,WEARBIT>>
<NOT <FSET? ,HERE ,SECRETBIT>>>>>
<REPEAT ()
<COND (<IGRTR? N ,DEB-C> <RETURN>)>
<SET P <GET ,CHARACTER-TABLE .N>>
<COND (<NOT <EQUAL? .P ,GHOST-NEW ,CONFESSED ,CAPTOR>>
<SET RM <META-LOC .P>>
<COND (<AND <==? 3 <GETP .RM ,P?CHARACTER>>
<OR <AND <FSET? ,HERE ,WEARBIT>
<FSET? .RM ,WEARBIT>>
<AND <NOT <FSET? ,HERE ,WEARBIT>>
<NOT <FSET? .RM ,WEARBIT>>>>>
<GO-TO-SOUND ,HERE .P>)>)>>)>
<TELL "\"Aaaarrrrgggghhhh!\"" CR>)>>
"<ROUTINE V-YELL-FOR () <V-YES>>"
<ROUTINE V-YES ("OPTIONAL" (NO? <>) "AUX" PER)
<COND (<AND <OR <NOT <==? <SET PER ,WINNER> ,PLAYER>>
<AND <T? ,AWAITING-REPLY>
<SET PER <GETB ,QUESTIONERS ,AWAITING-REPLY>>>
<SET PER <QCONTEXT-GOOD?>>>
;<VERB? YES NO ANSWER>>
<COND (<NOT <D-APPLY "Actor" <GETP .PER ,P?ACTION> ,M-WINNER>>
<TELL "\"I see...\"" CR>
;<SETG CLOCK-WAIT T>
;<TELL "(That was a rhetorical question.)" CR>)>
<RTRUE>)
(<EQUAL? ,HERE ,DRIVEWAY>
<TELL "The echoes fade and silence is soon restored." CR>)
(T <ARENT-TALKING>)>>
<ROUTINE V-NO () <V-YES T>>
<ROUTINE FINISH ("OPTIONAL" (REPEATING <>) VAL)
%<DEBUG-CODE <COND (<T? ,DBUG> <RTRUE>)>>
<CRLF>
<CRLF>
<COND (<NOT .REPEATING>
<V-SCORE>
<CRLF>)>
<TELL
"Would you like to:|
RESTORE your place from where you saved it,|
RESTART the story from the beginning, or|
QUIT for now?" CR>
<REPEAT ()
<TELL !\>>
<READ ,P-INBUF ,P-LEXV>
<SET VAL <GET ,P-LEXV ,P-LEXSTART>>
<COND (<NOT <0? .VAL>>
<SET VAL <WT? .VAL ,PS?VERB ,P1?VERB>>
<COND (<EQUAL? .VAL ,ACT?RESTART>
<RESTART>
;<TELL-FAILED>
<FINISH T>)
(<EQUAL? .VAL ,ACT?RESTORE>
<COND (<V-RESTORE> <RETURN>)>
<FINISH T>)
(<EQUAL? .VAL ,ACT?QUIT>
<QUIT>)>)>
<TELL "[Type RESTORE, RESTART, or QUIT.] ">>>
<ROUTINE DIVESTMENT? (OBJ)
<AND <==? ,PRSO .OBJ>
<VERB? DISEMBARK DROP GIVE POUR PUT PUT-IN PUT-UNDER
REMOVE THROW-AT THROW-THROUGH>>>
;<ROUTINE EXIT-VERB? ("AUX" P)
<COND (<VERB? WALK> <RETURN ,PRSO>)
(<VERB? WALK-TO FOLLOW THROUGH>
<SET P <META-LOC ,PRSO>>
<COND (<==? ,HERE .P> <RFALSE>)
(<VERB? WALK-TO>
<FOLLOW-GOAL-DIR ,HERE .P>)
(T <DIR-FROM ,HERE .P>)>)>>
<ROUTINE REMOTE-VERB? ()
<COND (<VERB? ;ARREST ASK-ABOUT ASK-CONTEXT-ABOUT ASK-CONTEXT-FOR ASK-FOR ;BUY
DESCRIBE DISEMBARK DRESS FIND FOLLOW LEAVE LOOK-UP
;MAKE SEARCH SEARCH-FOR SHOW SSHOW
TAKE-TO TALK-ABOUT TELL-ABOUT WAIT-FOR WAIT-UNTIL WALK-TO
;$WHERE>
<RTRUE>)>
<RFALSE>>