checkpoint/verbs.zil

3446 lines
99 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

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

"VERBS for CHECKPOINT
Copyright (C) 1985 Infocom, Inc. All rights reserved."
<ROUTINE TRANSCRIPT (STR)
<TELL "Here " .STR "s a transcript of interaction with" CR>>
<ROUTINE V-SCRIPT ()
<DIROUT 2>
;<PUT 0 8 <BOR <GET 0 8> 1>>
<TRANSCRIPT "begin">
<V-VERSION>
<RTRUE>>
<ROUTINE V-UNSCRIPT ()
<TRANSCRIPT "end">
<V-VERSION>
<DIROUT -2>
;<PUT 0 8 <BAND <GET 0 8> -2>>
<RTRUE>>
<ROUTINE V-$ID ()
<TELL "EZIP #">
<PRINTN <GETB 0 30>>
<TELL " (revision ">
<PRINTC <GETB 0 31>>
<TELL ")" CR>>
<ROUTINE V-$VERIFY ()
<COND (,PRSO
<COND (<AND <EQUAL? ,PRSO ,INTNUM>
<EQUAL? ,P-NUMBER 105>>
<TELL N ,SERIAL CR>)
(T <DONT-UNDERSTAND>)>)
(T
<V-$ID>
<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>)>)>>
;<ROUTINE V-$AGAIN ("AUX" MSG)
<TELL "WINNER=" N ,L-WINNER>
<COND (<NOT <ZERO? ,L-WINNER>> <TELL " (" D ,L-WINNER ")">)>
<TELL " PRSA=">
%<COND (<GASSIGNED? PREDGEN> '<TELL N ,L-PRSA>)
(T '<PRINC <NTH ,ACTIONS <+ <* ,L-PRSA 2> 1>>>)>
<TELL " PRSO=" N ,L-PRSO>
<COND (<NOT <ZERO? ,L-PRSO>>
<TELL " ("> <TELL-D-LOC ,L-PRSO> <TELL ")">
<COND (<EQUAL? ,NOT-HERE-OBJECT ,L-PRSO>
<TELL " ("> <TELL-D-LOC ,L-PRSO-NOT-HERE> <TELL ")">)>)>
<TELL " PRSI=" N ,L-PRSI>
<COND (<NOT <ZERO? ,L-PRSI>>
<TELL " ("> <TELL-D-LOC ,L-PRSI> <TELL ")">
<COND (<EQUAL? ,NOT-HERE-OBJECT ,L-PRSI>
<TELL " ("> <TELL-D-LOC ,L-PRSI-NOT-HERE> <TELL ")">)>)>
<CRLF>>
<ROUTINE V-$ANSWER ("AUX" MSG)
<COND ;(<NOT ,DEBUG>
<SET MSG <PICK-ONE ,UNKNOWN-MSGS>>
<TELL <GET .MSG 0> "#answ" <GET .MSG 1> CR>)
(T <TELL
"Pssst! The bad spy is the " D ,BAD-SPY ".|
The contact is the " D ,CONTACT>
<COND (<NOT <ZERO? ,PICKPOCKET>>
<TELL ".|
The pickpocket is the " D ,PICKPOCKET>)>
<TELL ".|
The password is \"" D ,PASSWORD ".\"|
The passobject is" THE ,PASSOBJECT "." CR>)>>
;<ROUTINE V-$CUSTOMS ()
<SETG CUSTOMS-SWEEP <NOT ,CUSTOMS-SWEEP>>
<COND (,CUSTOMS-SWEEP
<COND (,IN-STATION
<MOVE ,PLAQUE ,PLATFORM-B>
<FCLEAR ,CUSTOMS-AGENT ,NDESCBIT>
<FCLEAR ,CUSTOMS-AGENT ,TOUCHBIT>
<PUTP ,CUSTOMS-AGENT ,P?LDESC 31>
<MOVE ,CUSTOMS-AGENT ,PLATFORM-B>)
(T
<SETG SCENERY-OBJ ,STATION-GRNZ>
<ARRIVE-STATION>)>
<TELL "[here]" CR>)
(T
<MOVE ,PLAQUE ,LIMBO-FWD>
<FSET ,CUSTOMS-AGENT ,NDESCBIT>
<MOVE ,CUSTOMS-AGENT ,GLOBAL-OBJECTS>
<TELL "[gone]" CR>)>>
<ROUTINE V-$FCLEAR ("AUX" (F <>))
<COND (<AND ,PRSO <EQUAL? ,PRSI ,INTNUM>>
<COND (<FSET? ,PRSO ,P-NUMBER> <SET F T>)>
<FCLEAR ,PRSO ,P-NUMBER>
<COND (.F <TELL "T" CR>)
(T <TELL "#FALSE ()" CR>)>)
(T <TELL "OOPS!" CR>)>>
<ROUTINE V-$FSET ("AUX" (F <>))
<COND (<AND ,PRSO <EQUAL? ,PRSI ,INTNUM>>
<COND (<FSET? ,PRSO ,P-NUMBER> <SET F T>)>
<FSET ,PRSO ,P-NUMBER>
<COND (.F <TELL "T" CR>)
(T <TELL "#FALSE ()" CR>)>)
(T <TELL "OOPS!" CR>)>>
<ROUTINE V-$QFSET ()
<COND (<AND ,PRSO <EQUAL? ,PRSI ,INTNUM>>
<COND (<FSET? ,PRSO ,P-NUMBER> <TELL "T" CR>)
(T <TELL "#FALSE ()" CR>)>)
(T <TELL "OOPS!" CR>)>>
<ROUTINE V-$GOAL ("AUX" (CNT 0) O L C S)
<REPEAT ()
<COND (<G? <SET CNT <+ .CNT 1>> ,CHARACTER-MAX>
<RETURN>)>
<SET C <GET ,CHARACTER-TABLE .CNT>>
<SET O <GET ,GOAL-TABLES .CNT>>
<SET S <GET .O ,GOAL-S>>
<COND (<AND <EQUAL? .CNT ,EXTRA-C ,STAR-C> <ZERO? .S>>
<TELL D .C ": ">
<SET L <INT I-EXTRA>>
<TELL N <GET .L ,C-TICK> " min">
<COND (<ZERO? <GET .L ,C-ENABLED?>>
<TELL " (DISABLED)">)>
<CRLF>)
(<AND <LOC .C> <NOT <ZERO? .S>>>
<TELL D .C ": " D .S>
<COND (<ON-PLATFORM? .S> <TELL " (" N <GETP .S ,P?CAR> ")">)>
<SET L <GET .O ,GOAL-F>>
<COND (<NOT <EQUAL? .S .L>>
<TELL "/F:" D .L>
<COND (<ON-PLATFORM? .L> <TELL " (" N <GETP .L ,P?CAR>")">)>)>
<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 (<ON-PLATFORM? .L>
<TELL " (" N <GETP .L ,P?CAR> ")">)>)>)>
<COND (<EQUAL? ,I-WALK-TRAIN <GET .O ,GOAL-FUNCTION>>
<TELL "/Q:" D <GET .O ,GOAL-QUEUED>
"(car #" N <GET .O ,GOAL-CAR> ")">)>
<COND (<ZERO? <GET .O ,GOAL-ENABLE>>
<TELL " (DISABLED)">)>
<PRINTC 32>
<APPLY <GET .O ,GOAL-FUNCTION> ,G-DEBUG>
<PRINTC 32>
<APPLY <GET .O ,GOAL-SCRIPT> ,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-$STATION ("AUX" TBL CNT)
<COND (<SET CNT <ZMEMZ ,PRSO ,TRAIN-TABLE-A>>
<SET TBL ,TRAIN-TABLE-A>)
(<SET CNT <ZMEMZ ,PRSO ,TRAIN-TABLE-B>>
<SET TBL ,TRAIN-TABLE-B>)
(T
<TELL "[Not in timetable!]" CR>
<RTRUE>)>
<SETG TRAIN-NAME <GET .TBL 0>>
<SETG TRAIN-TABLE <REST .TBL <* 2 <- .CNT 1>>>>
<ENABLE <QUEUE I-TRAIN-SCENERY 1>>
<TELL "[okay]" CR>>
<ROUTINE V-$WHERE ("AUX" (CNT 0) O L MSG)
<COND ;(<NOT ,DEBUG>
<SET MSG <PICK-ONE ,UNKNOWN-MSGS>>
<TELL <GET .MSG 0> "#wher" <GET .MSG 1> CR>)
(,PRSI <MOVE ,PRSO ,PRSI>)
(,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>> ,CHARACTER-MAX>
<RETURN>)>>
<SET CNT <GET ,EXTRA-TABLE 0>>
<REPEAT ()
<COND (<SET O <GET ,EXTRA-TABLE .CNT>>
;<SET L <LOC .O>>
<TELL-$WHERE .O>)>
<COND (<L? <SET CNT <- .CNT 1>> 1>
<RETURN>)>>)>>
<ROUTINE TELL-$WHERE (O "OPTIONAL" (L 0))
<TELL D .O " is ">
<COND (<ZERO? .L> <SET L <LOC .O>>)>
<COND (.L
<TELL "in">
<COND (<GETP .O ,P?CAR>
<TELL " (car #" N <GETP .O ,P?CAR> ")">)>
<TELL THE .L>
<COND (<ZMEMQ .L ,CAR-ROOMS-DINER>
<TELL " (diner)">)
(<ZMEMQ .L ,CAR-ROOMS-FANCY>
<TELL " (fancy)">)
(<ON-PLATFORM? .L>
<TELL " (" N <GETP .L ,P?CAR> ")">)>
<TELL "." CR>)
(T <TELL "nowhere." CR>)>>
<GLOBAL DEBUG <>>
<GLOBAL IDEBUG <>>
<ROUTINE V-DEBUG ()
<COND (,PRSO
<SETG IDEBUG <NOT ,IDEBUG>>
<TELL "[" N ,IDEBUG "]" CR>)
(<SETG DEBUG <NOT ,DEBUG>>
<TELL "Find them bugs, boss!" CR>)
(T <TELL "No bugs left, eh?" CR>)>>
"ZORK game commands"
"SUBTITLE SETTINGS FOR VARIOUS LEVELS OF DESCRIPTION"
<GLOBAL VERBOSE 1> "0=SUPERB 1=BRIEF 2=VERBOS"
"<GLOBAL SUPER-BRIEF <>>
<GDECL (VERBOSE SUPER-BRIEF) <OR ATOM FALSE>>"
<ROUTINE YOU-WILL-GET (STR)
<TELL "(Okay, you will get " .STR " descriptions.)" CR>>
<ROUTINE V-BRIEF ()
<SETG VERBOSE 1>
;<SETG SUPER-BRIEF <>>
;<SETG P-SPACE 1>
<YOU-WILL-GET "brief">>
<ROUTINE V-SUPER-BRIEF ()
<SETG VERBOSE 0>
;<SETG SUPER-BRIEF T>
;<SETG P-SPACE 0>
<YOU-WILL-GET "superbrief">>
<ROUTINE V-VERBOSE ()
<SETG VERBOSE 2>
;<SETG SUPER-BRIEF <>>
;<SETG P-SPACE 1>
<YOU-WILL-GET "verbose">
<V-LOOK>>
"<GLOBAL P-SPACE 1>"
<ROUTINE V-INVENTORY ("AUX" X)
<SET X <PRINT-CONT ,WINNER>>
<COND (<NOT .X>
;<HE-SHE-IT ,WINNER T "is">
<TELL CHE ,WINNER is " not holding anything.">)>
<COND (<AND <==? ,WINNER ,PLAYER>
<OR <FIRST? ,POCKET> <G? <GETP ,PLAYER ,P?SOUTH> 0>>>
<THIS-IS-IT ,POCKET>
<COND (.X <TELL "And">) (T <TELL " But">)>
<TELL " there's something in " D ,POCKET ".">)>
<CRLF>>
<ROUTINE V-QUIT ("OPTIONAL" (ASK? T))
;<V-SCORE>
<COND (<NOT .ASK?> <QUIT>)>
<COND (T ;<NOT ,SAVE-DISALLOWED>
<TELL
"(If you want to continue from this point at another time, you must
\"SAVE\" first.)|
">)>
<TELL "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>)>>
<ROUTINE TELL-FAILED ()
<TELL
"(Sorry, but it didn't work. Maybe your instruction manual or Reference
Card can tell you why.)" CR>>
"<GLOBAL SAVE-DISALLOWED <>>"
<ROUTINE V-SAVE ("AUX" X)
;<COND (,SAVE-DISALLOWED
<TELL
"(Sorry, but in this variation you are \"walking a tightrope
without a safety net.\")" CR>
<TELL
"[During testing, though, you may have to SAVE. Do you really need to?">
<COND (<NOT <YES?>>
<TELL "Good for you!]" CR>
<RTRUE>)
(T <TELL "Ain't it fun to cheat?]" CR>)>)>
<TELL
"(In this variation, 1 minute will pass in the story before you can
type another command. Are you sure you want to SAVE now?">
<COND (<NOT <YES?>>
<SETG CLOCK-WAIT T>
<TELL "Okay.)" CR>
<RTRUE>)
(T <TELL "Okay.)" CR>)>
;<SPLIT 0>
<SET X <SAVE>>
;<INIT-STATUS-LINE>
<COND (.X
<TELL "Okay." CR>
<COND (<NOT <1? .X>>
<INIT-STATUS-LINE>
<CLEAR 0>
<V-FIRST-LOOK>)>)
(T
<SETG CLOCK-WAIT T>
<TELL-FAILED>)>
<RTRUE>>
<ROUTINE V-RESTORE ()
;<SPLIT 0>
<COND (<NOT <RESTORE>>
<TELL-FAILED>
;<INIT-STATUS-LINE>
<RFALSE>)>>
<ROUTINE V-FIRST-LOOK ()
<COND (T
<DESCRIBE-ROOM>
<COND (<NOT <0? ,VERBOSE>>
;<NOT ,SUPER-BRIEF>
<DESCRIBE-OBJECTS>)>)>>
<ROUTINE V-VERSION ("AUX" (CNT 17))
<TELL D ,GAME
"|
Infocom interactive fiction - a story of intrigue|
Copyright (c) 1985 by Infocom, Inc. All rights reserved.|
">
;<COND (<NOT <==? <BAND <GETB 0 1> 8> 0>>
<TELL
"Licensed to Tandy Corporation.|
">)>
<TELL
D ,GAME " is a trademark of Infocom, Inc.|
Release ">
<PRINTN <BAND <GET 0 1> *3777*>>
<TELL " / Serial number ">
<REPEAT ()
<COND (<G? <SET CNT <+ .CNT 1>> 23>
<RETURN>)
(T
<PRINTC <GETB 0 .CNT>>)>>
<COND (<NOT <0? ,VARIATION>>
<TELL " / ">
<COND (<EQUAL? ,VARIATION 1 2>
<TELL "Traveler">)
(T <TELL "Spy">)>
<TELL "'s viewpoint, ">
<COND (<0? <MOD ,VARIATION 2>>
<TELL "long">)
(T <TELL "short">)>
<TELL " variation">)>
<CRLF>>
<GLOBAL YES-INBUF <ITABLE BYTE 12>>
<GLOBAL YES-LEXV <ITABLE BYTE 10>>
<ROUTINE YES? ("AUX" WORD VAL)
<REPEAT ()
<PRINTI " >">
<READ ,YES-INBUF ,YES-LEXV>
<SET WORD <GET ,YES-LEXV ,P-LEXSTART>>
<COND (<0? <GETB ,YES-LEXV ,P-LEXWORDS>> T)
(<NOT <ZERO? .WORD>>
<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>)>)>
<TELL "(Please type YES or NO.)">>
.VAL>
<ROUTINE YOU-CANT ("OPTIONAL" (STR <>) (WHILE <>) (STR1 <>))
<SETG CLOCK-WAIT T>
<TELL "(" CHE ,WINNER " can't ">
<COND (.STR <TELL .STR>) (T <VERB-PRINT>)>
<COND (<=? .STR "go"> <TELL " in that direction">)
(T
<COND (<EQUAL? .STR "turn off" "turn on">
<TELL THE ,PRSO>)
(T <TELL HIM ,PRSO>)>
<COND (.STR1
<TELL " while">
<COND (.WHILE
<TELL HE .WHILE is>
<THIS-IS-IT .WHILE>)
(T <TELL HE ,PRSO is>)>
<TELL C !\ .STR1>)
;(T <TELL " now">)>)>
<TELL ".)" CR>>
" "
"SUBTITLE - GENERALLY USEFUL ROUTINES & CONSTANTS"
<ROUTINE DESCRIBE-OBJECT (OBJ ;V? LEVEL "AUX" (STR <>) ;AV)
<COND (<AND <0? .LEVEL>
<APPLY <GETP .OBJ ,P?DESCFCN> ,M-OBJDESC>>
<THIS-IS-IT .OBJ>
<RTRUE>)>
<THIS-IS-IT .OBJ>
<COND (<AND <0? .LEVEL>
<OR <AND <NOT <FSET? .OBJ ,TOUCHBIT>>
<SET STR <GETP .OBJ ,P?FDESC>>>
<SET STR <GETP .OBJ ,P?LDESC>>>>
<TELL .STR CR>)
(<0? .LEVEL>
<TELL "There's " A .OBJ " on the floor." CR>)
(ELSE
;<TELL <GET ,INDENTS .LEVEL>>
<TELL A .OBJ>
<COND (<FSET? .OBJ ,WORNBIT>
<TELL " (being worn)">)>)>
<COND (<AND <SEE-INSIDE? .OBJ> <FIRST? .OBJ>>
<TELL " (">
<PRINT-CONT .OBJ ;.V? .LEVEL>
<COND (<FSET? .OBJ ,SURFACEBIT> <TELL " sitting on it">)>
<TELL ")">)>>
<ROUTINE DESCRIBE-OBJECTS ("OPTIONAL" (V? <>))
<COND (T ;,LIT
<COND (<FIRST? ,HERE>
<COND (<AND <ZERO? .V?> <==? 2 ,VERBOSE>>
<SET V? T>)>
;<SET V? <OR .V? ,VERBOSE>>
<PRINT-CONT ,HERE -1 .V?>)>)>>
<ROUTINE DESCRIBE-ROOM ("OPTIONAL" (LOOK? <>) "AUX" V? STR L)
<COND (<ZERO? .LOOK?>
<COND (<==? 2 ,VERBOSE> <SET V? T>)
(T <SET V? <>>)>)
(T <SET V? T>)>
;<SET V? <OR .LOOK? ,VERBOSE>>
<COND (<NOT <FSET? ,HERE ,TOUCHBIT>>
<SET V? T>)>
<COND (<IN? ,HERE ,ROOMS>
<TELL "(" D ,HERE ")" CR>)>
<COND (<AND ,PLAYER-NOT-FACING
<OR .LOOK?
<NOT <==? ,PLAYER-NOT-FACING
,PLAYER-NOT-FACING-OLD>>>>
<COND (.LOOK? <TELL "(">) ;(T <TELL "[">)>
<COND (.LOOK? ;T
<TELL "You're facing to ">
<DIR-PRINT <OPP-DIR ,PLAYER-NOT-FACING>>)>
<COND (.LOOK? <TELL
", but you look in all directions for a moment">)>
<COND (.LOOK? ;T
<TELL ".">)>
<COND (.LOOK? <TELL ")">) ;(T <TELL "]">)>
<COND (.LOOK? ;T
<CRLF>)>)>
<COND (.V?
<COND (<FSET? <SET L <LOC ,WINNER>> ,VEHBIT>
<TELL "(You're ">
<COND (<FSET? .L ,SURFACEBIT>
<TELL "sitting o">)
(T <TELL "standing i">)>
<TELL "n" HIM .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>
<COND (.LOOK? <SETG COR-ALL-DIRS T>)>
<CORRIDOR-LOOK>
<SETG COR-ALL-DIRS <>>)>
<FSET ,HERE ,SEENBIT>
<FSET ,HERE ,TOUCHBIT>
T>
<ROUTINE FAR-AWAY? (L)
<COND (<EQUAL? .L ,GLOBAL-OBJECTS>
<RTRUE>)
(<OR <ZMEMQ ,HERE ,CAR-ROOMS>
<AND <EQUAL? ,HERE ,BESIDE-TRACKS>
<NOT <EQUAL? ,CAR-HERE ,DINER-CAR ,FANCY-CAR>>>>
<NOT <ZMEMQ .L ,CAR-ROOMS>>)
(<OR <ZMEMQ ,HERE ,CAR-ROOMS-DINER>
<AND <EQUAL? ,HERE ,BESIDE-TRACKS>
<==? ,CAR-HERE ,DINER-CAR>>>
<NOT <ZMEMQ .L ,CAR-ROOMS-DINER>>)
(<OR <ZMEMQ ,HERE ,CAR-ROOMS-FANCY>
<AND <EQUAL? ,HERE ,BESIDE-TRACKS>
<==? ,CAR-HERE ,FANCY-CAR>>>
<NOT <ZMEMQ .L ,CAR-ROOMS-FANCY>>)
(<ZMEMQ ,HERE ,STATION-ROOMS>
<COND (<NOT <ZMEMQ .L ,STATION-ROOMS>>
<RTRUE>)
(<NOT ,CUSTOMS-SWEEP>
<RFALSE>)
(<EQUAL? ,HERE ,PLATFORM-A>
<NOT <EQUAL? .L ,PLATFORM-A>>)
(T <EQUAL? .L ,PLATFORM-A>)>)
(<EQUAL? ,HERE ,ROOF>
<NOT <EQUAL? .L ,ROOF>>)
(T <TELL "[Foo! Where is HERE?]" CR>)>>
"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 COMPASS-EQV (RM DIR "AUX" DIRTBL DIRL P L TBL (VAL <>))
<COND (<OR <EQUAL? .DIR ,P?NORTH ,P?EAST>
<EQUAL? .DIR ,P?SOUTH ,P?WEST>>
<RETURN .DIR>)>
<SET DIRTBL <GETPT .RM .DIR>>
<SET DIRL <PTSIZE .DIRTBL>>
<SET P 0>
<REPEAT ()
<COND (.VAL <RETURN .VAL>)
(<0? <SET P <NEXTP .RM .P>>> <RFALSE>)
(<AND <NOT <EQUAL? .P ,P?NORTH ,P?EAST>>
<NOT <EQUAL? .P ,P?SOUTH ,P?WEST>>>
<AGAIN>)
(<NOT <L? .P ,LOW-DIRECTION>>
<SET TBL <GETPT .RM .P>>
<SET L <PTSIZE .TBL>>
<COND (<NOT <==? .L .DIRL>> <AGAIN>)>
<DEC L>
<REPEAT ()
<COND (<NOT <==? <GETB .TBL .L> <GETB .DIRTBL .L>>>
<RETURN>)
(<DLESS? L 0>
<SET VAL .P>
<RETURN>)>>)>>>
<ROUTINE FIRSTER (OBJ LEVEL "AUX" (VAL T))
<COND (<==? .OBJ ,PLAYER>
<TELL "You're holding ">)
(<NOT <ZERO? <GETP .OBJ ,P?CHARACTER>>>;<FSET? .OBJ ,PERSONBIT>
<TELL CHE .OBJ is " holding ">)
(<NOT <IN? .OBJ ,ROOMS>>
<COND (<FSET? .OBJ ,SURFACEBIT>
<COND (<G? .LEVEL 0>
<TELL "which has ">
<RFATAL>)
(T
<TELL "Sitting on" HIM .OBJ C !\ >
<COND (<ZERO? <NEXT? <FIRST? .OBJ>>>
<TELL "is ">)
(T <TELL "are ">)>)>)
(ELSE
<COND (<G? .LEVEL 0>
<TELL "which">
<SET VAL ,M-FATAL>)
(T
<TELL CTHE .OBJ>)>
<TELL " contains ">
<RETURN .VAL>)>)>>
;<ROUTINE GO-NEXT (TBL "AUX" VAL)
<COND (<SET VAL <LKP ,HERE .TBL>>
<GOTO .VAL>)>>
<ROUTINE HAR-HAR () <TELL <PICK-ONE-NEW ,YUKS> CR>>
<ROUTINE NOT-HOLDING? (OBJ)
<COND (<AND <NOT <IN? .OBJ ,WINNER>>
<NOT <IN? <LOC .OBJ> ,WINNER>>>
;<HE-SHE-IT ,WINNER T "is">
<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>>>)>)>>>
<ROUTINE GOTO (RM "OPTIONAL" (V? T) "AUX" L)
<COND (<AND <IN? ,WINNER .RM> <NOT <==? .RM ,ROOF>>>
<HAR-HAR>
<RFALSE>)>
;<SET L <LOC ,WINNER>>
<MOVE ,WINNER .RM>
<SETG LIT T>
<COND (<==? ,WINNER ,PLAYER>
<COND (<AND <SET L <DIR-FROM ,HERE .RM>>
<SET L <COMPASS-EQV ,HERE .L>>>
;<SETG PLAYER-NOT-FACING-OLD ,PLAYER-NOT-FACING>
<SETG PLAYER-NOT-FACING <OPP-DIR .L>>)>
<SETG LAST-PLAYER-LOC ,HERE>
<SETG HERE .RM>
<APPLY <GETP ,HERE ,P?ACTION> ,M-ENTER>
<COND (.V? <V-FIRST-LOOK>)>
<APPLY <GETP ,HERE ,P?ACTION> ,M-FLASH>)>
<RTRUE>>
<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 <>))
<COND (<NOT .CONT> <SET CONT ,WINNER>)>
<COND (<NOT .OBJ>
<RFALSE>)
(<IN? .OBJ .CONT>
<RTRUE>)
(<EQUAL? <LOC .OBJ> ,ROOMS ,GLOBAL-OBJECTS>
<RFALSE>)
(T
<HELD? <LOC .OBJ> .CONT>)>>
<ROUTINE HELD? (OBJ "OPTIONAL" (CONT <>) "AUX" L X)
<COND (<NOT .CONT> <SET CONT ,PLAYER ;,WINNER>)>
<COND (<EQUAL? .OBJ ,BRIEFCASE-LATCH ,BRIEFCASE-HANDLE>
<SET OBJ ,BRIEFCASE>)>
<REPEAT ()
<SET L <LOC .OBJ>>
<COND (<NOT .L> <RFALSE>)
(<EQUAL? .L .CONT> <RTRUE>)
(<EQUAL? .CONT ,PLAYER ;,WINNER>
<SET X <GETP ,PLAYER ,P?SOUTH>>
<COND (<EQUAL? .OBJ ,GLOBAL-MONEY>
<COND (<L? 0 .X> <RTRUE>)
(T <RFALSE>)>)
(<EQUAL? .OBJ ,DOLLARS>
<COND (,P-DOLLAR-FLAG
<COND (<L? .X ,P-AMOUNT>
<RFALSE>)
(T <RTRUE>)>)
(<0? ,P-NUMBER>
<COND (<L? .X 1>
<RFALSE>)
(T <RTRUE>)>)
(T
<COND (<L? .X ,P-NUMBER>
<RFALSE>)
(T <RTRUE>)>)>)
(<EQUAL? .OBJ ,INTNUM>
<COND (<NOT ,P-DOLLAR-FLAG> <RFALSE>)
(<L? .X ,P-AMOUNT> <RFALSE>)
(T <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 7>
<GLOBAL FUMBLE-PROB 8>
<GLOBAL ITAKE-LOC <>>
<ROUTINE ITAKE ("OPTIONAL" (VB T) "AUX" CNT OBJ L)
<SET L <LOC ,PRSO>>
<COND (<OR <FSET? .L ,PERSONBIT>
<AND <EQUAL? .L ,BRIEFCASE>
<FSET? <SET L <LOC .L>> ,PERSONBIT>>>
<COND (<AND <NOT <FSET? ,PRSO ,TAKEBIT>>
<NOT <FSET? .L ,MUNGBIT>>
<NOT <BRIBED? .L>>>
<COND (.VB
<TELL
CHE .L hold HIM ,PRSO " more tightly and" V .L look " at you ">
<THIS-IS-IT .L>
<UNSNOOZE .L>
<COND (<ZERO? <GETP .L ,P?SOUTH>>
<TELL "defiant">)
(T <TELL "hopeful">)>
<TELL "ly." CR>)>
<RFALSE>)
(T <FSET ,PRSO ,TAKEBIT>)>)>
<COND (<AND <DOBJ? GLOBAL-MONEY>
<NOT <L? <GETP ,PLAYER ,P?SOUTH> ,P-AMOUNT>>>
<RTRUE>)
(<NOT <FSET? ,PRSO ,TAKEBIT>>
<COND (.VB <YOU-CANT "take">)>
<RFALSE>)
(<AND <==? ,NOW-LURCHING ,PRESENT-TIME> ,TRAIN-MOVING>
<COND (.VB <LURCH-MISS ,PRSO>)>
<RFALSE>)
(<AND <DOBJ? KILLED-PERSON>
<SET CNT <FIRST? ,WINNER>>
<NOT <EQUAL? .CNT ,POCKET ,POCKET-C>>>
<TELL
"You try to pick up the body, but" THE .CNT " keeps getting in the way." CR>
<RFALSE>)
(<AND <G? <SET CNT <CCOUNT ,WINNER>> ,FUMBLE-NUMBER>
<PROB <* .CNT ,FUMBLE-PROB>>>
<SET OBJ <FIRST? ,WINNER>>
;<SET OBJ <NEXT? .OBJ>>
<TOO-BAD-BUT .OBJ>
<TELL
" slips from" HIS ,WINNER " arms while" HE ,WINNER is " taking" HIM ,PRSO
", and both tumble " <GROUND-DESC> "." CR>
<MOVE .OBJ ,HERE> ;<PERFORM ,V?DROP .OBJ>
<MOVE-FROM ,PRSO ,HERE>
<RFATAL>)
(T
<COND (<AND <EQUAL? ,PRSO ,FILM>
<EQUAL? .L ,CAMERA>
,CAMERA-COCKED>
<SETG CAMERA-COCKED <>>
<PUT ,FILM-TBL ,PICTURE-NUMBER ,GLOBAL-OBJECTS>)>
<SETG ITAKE-LOC <>>
<COND (<FSET? .L ,PERSONBIT>
<COND (<NOT .VB> <SETG ITAKE-LOC .L>)>)>
<MOVE-FROM ,PRSO ,WINNER>
<FSET ,PRSO ,TOUCHBIT>
<FCLEAR ,PRSO ,NDESCBIT>
<FCLEAR ,PRSO ,INVISIBLE>
;<COND (<==? ,WINNER ,PLAYER> <SCORE-OBJ ,PRSO>)>
<RTRUE>)>>
<ROUTINE LURCH-MISS (OBJ)
<TELL
"The train's lurching puts you off balance, and you miss" HIM .OBJ "." CR>>
<ROUTINE MOVE-FROM (OBJ HERE "AUX" P)
<COND (<AND <EQUAL? .OBJ ,NEWSPAPER ,CIGARETTE>
<FSET? <SET P <LOC .OBJ>> ,PERSONBIT>
<EQUAL? <GETP .P ,P?LDESC> 5 6 7>>
<FCLEAR .P ,TOUCHBIT>
<PUTP .P ,P?LDESC 1>)>
<MOVE .OBJ .HERE>>
<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 ">
<COND (<FSET? .DR ,OPENBIT> <TELL "open">)
(T
<TELL "closed and ">
<COND (<NOT <FSET? .DR ,LOCKED>> <TELL "un">)>
<TELL "locked">)>
<TELL "." CR>>
;<ROUTINE CHECK-ON-OFF ()
<TELL CTHE ,PRSO " is o"
<COND (<FSET? ,PRSO ,ONBIT> "n") (T "ff")>
"." CR>>
<ROUTINE PRINT-CONT (OBJ "OPTIONAL" (LEVEL 0) (V? <>)
"AUX" Y 1ST? ;AV (STR <>) ;(PV? <>) (INV? <>) (VAL <>) (LAST <>))
<COND (<NOT <SET Y <FIRST? .OBJ>>> <RFALSE>)>
;<COND (<AND <SET AV <LOC ,WINNER>> <FSET? .AV ,VEHBIT>>
T)
(ELSE <SET AV <>>)>
<SET 1ST? T>
<COND (<EQUAL? ,WINNER .OBJ <LOC .OBJ>>
<SET INV? T>)>
<COND
(ELSE
<REPEAT ()
<COND (<NOT .Y> <RETURN ;<NOT .1ST?>>)
;(<==? .Y .AV> <SET PV? T>)
(<EQUAL? .Y ,WINNER ,POCKET>)
(<AND <==? .OBJ ,HERE>
<FSET? .Y ,PERSONBIT>
<IN-MOTION? .Y>> ;"to be described later"
<FSET .Y ,ONBIT>
<MOVE .Y ,LAST-OBJECT>)
(<AND <OR <NOT <FSET? .Y ,INVISIBLE>>
<AND ,DEBUG <TELL "[invisible] ">>>
<NOT <FSET? .Y ,TOUCHBIT>>
<SET STR <GETP .Y ,P?FDESC>>
<NOT <GETP .Y ,P?DESCFCN>>>
<COND (<OR <NOT <FSET? .Y ,NDESCBIT>>
<AND ,DEBUG <TELL "[ndescbit] ">>>
<SET 1ST? <>>
<SET LEVEL 0>
<COND (.STR
<TELL .STR CR>
<SET STR <>>
<SET VAL T>
<THIS-IS-IT .Y>)>)>
<COND (<AND <SEE-INSIDE? .Y>
<NOT <GETP <LOC .Y> ,P?DESCFCN>>
<FIRST? .Y>>
<COND (<PRINT-CONT .Y 0 .V?> <SET VAL T>)>)>)>
<COND (<AND <NOT <FSET? .Y ,INVISIBLE>>
<NOT <FSET? .Y ,NDESCBIT>>
;<NOT <EQUAL? .Y ,WINNER ,POCKET>>>
<SET LAST .Y>)>
<SET Y <NEXT? .Y>>>)>
<SET Y <FIRST? .OBJ>>
<REPEAT ()
<COND (<NOT .Y>
;<COND (<AND .PV? .AV <FIRST? .AV>>
<COND (<PRINT-CONT .AV .LEVEL .V?> <SET VAL T>)>)>
<RETURN ;.VAL ;<NOT .1ST?>>)
(<EQUAL? .Y ;.AV ,PLAYER ,POCKET>)
(<AND <OR <NOT <FSET? .Y ,INVISIBLE>>
<AND ,DEBUG <TELL "[invisible] ">>>
<OR .INV?
<FSET? .Y ,TOUCHBIT>
<NOT <GETP .Y ,P?FDESC>>>>
<COND (<OR <NOT <FSET? .Y ,NDESCBIT>>
<AND ,DEBUG <TELL "[ndescbit] ">>>
<SET VAL T>
<COND (.1ST?
<SET 1ST? <>>
<COND (<SET STR <FIRSTER .OBJ .LEVEL>>
<COND (<L? .LEVEL 0> <SET LEVEL 0>)>)>
<SET LEVEL <+ 1 .LEVEL>>)
(<NOT <IN? .OBJ ,ROOMS>>
<COND (<==? .Y .LAST> <TELL "and ">)>)>
<DESCRIBE-OBJECT .Y ;.V? .LEVEL>
<COND (<==? .Y .LAST>
<COND (<OR ;<AND <0? .LEVEL>
<NOT <FSET? .OBJ ,NDESCBIT>>>
<==? .STR ,TRUE-VALUE>
<AND <L? 0 .LEVEL>
<FSET? .OBJ ,NDESCBIT>>>
<TELL "." CR>)>)
(<NOT <IN? .OBJ ,ROOMS>>
<TELL ", ">)>)
(<AND <FIRST? .Y> <SEE-INSIDE? .Y>>
<COND (<PRINT-CONT .Y .LEVEL .V?> <SET VAL T>)>)>)>
<SET Y <NEXT? .Y>>>
<REPEAT ()
<COND (<SET Y <FIRST? ,LAST-OBJECT>> ;"people in motion"
;"<SET VAL T>
<DESCRIBE-OBJECT .Y 0>" ;"moved to MOVE-PERSON"
<MOVE .Y ,HERE>)
(T <RETURN>)>>
.VAL>
<ROUTINE PRINT-CONTENTS (OBJ "AUX" F N (1ST? T))
<COND (<SET F <FIRST? .OBJ>>
<REPEAT ()
<SET N <NEXT? .F>>
<COND (.1ST? <SET 1ST? <>>)
(ELSE
<TELL ", ">
<COND (<NOT .N> <TELL "and ">)>)>
<TELL A .F>
<THIS-IS-IT .F>
<SET F .N>
<COND (<NOT .F> <RETURN>)>>)>>
<ROUTINE ROOM-CHECK ("AUX" P)
<SET P ,PRSO>
<COND (<IN? .P ,ROOMS>
<COND (<EQUAL? .P ,HERE ;,GLOBAL-HERE>
;<PERFORM ,PRSA ,GLOBAL-HERE ,PRSI>
<RFALSE>)
(<EQUAL? .P <NEXT-ROOM ,HERE ,P?IN>>
<RFALSE>)
(<EQUAL? .P <NEXT-ROOM ,HERE ,P?OUT>>
<RFALSE>)
(T
<SETG CLOCK-WAIT T>
<TELL "(You aren't close enough to" HIM .P "!)" CR>
<RTRUE>)>)
(<OR ;<==? .P ,PSEUDO-OBJECT>
<EQUAL? <META-LOC .P>
,HERE ,GLOBAL-OBJECTS ,LOCAL-GLOBALS>>
<RFALSE>)
(<NOT <VISIBLE? .P>>
<COND (<AND <GETP .P ,P?CHARACTER> ;<FSET? .P ,PERSONBIT>
<IN? .P ,GLOBAL-OBJECTS>>
<SET P <GET ,CHARACTER-TABLE<GETP .P ,P?CHARACTER>>>
<COND (<NOT <VISIBLE? .P> ;<CORRIDOR-LOOK .P>>
<NOT-HERE .P>)>)
(T <NOT-HERE .P>)>)>>
<ROUTINE SEE-INSIDE? (OBJ "OPTIONAL" (ONLY-IN <>))
<COND (<FSET? .OBJ ,INVISIBLE> <RFALSE>)
(<FSET? .OBJ ,TRANSBIT> <RTRUE>)
(<FSET? .OBJ ,OPENBIT> <RTRUE>)
(.ONLY-IN <RFALSE>)
(<FSET? .OBJ ,PERSONBIT>
<COND (<NOT <EQUAL? .OBJ ,PLAYER>>
<RTRUE>)>)
(<FSET? .OBJ ,SURFACEBIT> <RTRUE>)>>
<ROUTINE ARENT-TALKING ()
<TELL "You aren't talking to anyone!" CR>>
<ROUTINE ALREADY (OBJ "OPTIONAL" (STR <>))
<SETG CLOCK-WAIT T>
<TELL "(" CHE .OBJ is " already ">
<COND (.STR <TELL .STR "!)" CR>)>
<RTRUE>>
<ROUTINE NOT-CLEAR-WHOM ("OPTIONAL" (GEST 0))
<SETG QUOTE-FLAG <>>
<SETG P-CONT <>>
<TELL "(It's not clear whom you're ">
<COND (<ZERO? .GEST> <TELL "talk">) (T <TELL "gestur">)>
<TELL "ing 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 (<==? ,WINNER ,PLAYER>
<COND (<VERB? THROUGH WALK WALK-TO>
<RTRUE>)>)
(T <PRODUCE-GIBBERISH> <RTRUE>)>
<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>>
<TELL ".">
;<COND (<NOT <==? ,WINNER ,PLAYER>> <TELL "\"">)>
<CRLF>)>
<RTRUE>>
<ROUTINE WONT-HELP-TO-TALK-TO (OBJ)
<TELL
"You talk to" HIM .OBJ " for a minute before you realize that" HE .OBJ
" won't respond." CR>>
<ROUTINE TOO-BAD-BUT (OBJ "OPTIONAL" (STR <>))
<TELL "Too bad, but" HE .OBJ>
<THIS-IS-IT .OBJ>
<COND (.STR <TELL V .OBJ is C !\ .STR "." CR>)>
<RTRUE>>
<ROUTINE TOO-DARK () <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 "OPTIONAL" (ALL-DIR <>) "AUX" L LL (X <>))
<COND (<NOT .OBJ> <RFALSE>)
(<ACCESSIBLE? .OBJ> <RTRUE>)
(<AND <==? .OBJ ,SCENERY-OBJ>
<OR <NOT ,ON-TRAIN>
<FIND-FLAG-LG ,HERE ,WINDOWBIT>>>
<RTRUE>)>
<SET LL ,COR-ALL-DIRS>
<SETG COR-ALL-DIRS .ALL-DIR>
<SET X <CORRIDOR-LOOK .OBJ>>
<SETG COR-ALL-DIRS .LL>
<COND (<NOT <ZERO? .X>>
<COND (<NOT <ZERO? .ALL-DIR>>
<RETURN .X>)
(<NOT <==? .X ,PLAYER-NOT-FACING>>
<RETURN .X>)
(T <RFALSE>)>)>
<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>)>)
(<NOT .L>
<RFALSE>)
(<EQUAL? .L ,GLOBAL-OBJECTS ;,ROOMS ;,POCKET>
<RTRUE>)
(<EQUAL? .L ,LOCAL-GLOBALS>
<RETURN <GLOBAL-IN? .OBJ ,HERE>>)
(<AND ;<==? .OBJ ,ROOF> <==? ,HERE .OBJ>>
<RTRUE>)
(<NOT <EQUAL? <META-LOC .OBJ> ,HERE>>
<RFALSE>)
(<EQUAL? .L ,WINNER ,HERE>
<RTRUE>)
(<AND <OR <FSET? .L ,OPENBIT>
<NOT <ZERO? <GETP .L ,P?CHARACTER>>>
;<FSET? .L ,PERSONBIT>>
<ACCESSIBLE? .L>>
<RTRUE>)
(T
<RFALSE>)>>
<ROUTINE META-LOC (OBJ "OPTIONAL" (INV <>) "AUX" L)
<SET L <LOC .OBJ>>
<REPEAT ()
<COND (<NOT .L>
<RFALSE>)
;(<EQUAL? .L ,POCKET>
<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>>)>>>
"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 <WEIGHT .CONT>>>)>
<COND (<NOT <SET CONT <NEXT? .CONT>>> <RETURN>)>>)>
<+ .WT <GETP .OBJ ,P?SIZE>>>
<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."
"Not bloody likely."
"What a fruitcake!"
"What a screwball!"
"What a concept!"
"Like, totally grody, for sure."
"You can't be serious!">>
" "
"SUBTITLE REAL VERBS"
;<ROUTINE V-AGAIN ("AUX" (OBJ <>) (N <>))
<COND (<NOT ,L-PRSA>
<SETG CLOCK-WAIT T>
<TELL "(What do you want to do again?)" CR>
<RTRUE>)
;(<AND <NOT <EQUAL? ,L-PRSA ,V?WAIT-FOR ,V?WALK-TO>>
<OR <PRSO-VERB? ,L-PRSA ,L-WINNER>
<PRSI-VERB? ,L-PRSA ,L-WINNER>>>
<SETG CLOCK-WAIT T>
<TELL "(Sorry, but you can't use AGAIN now.)" CR>
<RTRUE>)>
<COND (<EQUAL? ,NOT-HERE-OBJECT ,L-PRSO>
<COND (<OR <REMOTE-VERB?>
;<VERB? WAIT-FOR WAIT-UNTIL WALK-TO BUY>
<VISIBLE? ,L-PRSO-NOT-HERE>>
<SETG L-PRSO ,L-PRSO-NOT-HERE>)
(T
<SETG CLOCK-WAIT T>
<TELL "(You can't see that here.)" CR>
<RTRUE>)>)>
<COND (<EQUAL? ,NOT-HERE-OBJECT ,L-PRSI>
<COND (<OR <REMOTE-VERB?>
;<VERB? WAIT-FOR WAIT-UNTIL WALK-TO BUY>
<VISIBLE? ,L-PRSI-NOT-HERE>>
<SETG L-PRSI ,L-PRSI-NOT-HERE>)
(T
<SETG CLOCK-WAIT T>
<TELL "(You can't see that here.)" CR>
<RTRUE>)>)>
<COND (<EQUAL? ,L-PRSA ,V?WALK>
<SETG WINNER ,L-WINNER>
<DO-WALK ,L-PRSO>
<RTRUE>)>
<COND (<AND ,L-PRSO <NOT <VISIBLE? ,L-PRSO>>>
<SET OBJ ,L-PRSO>)
(<AND ,L-PRSI <NOT <VISIBLE? ,L-PRSI>>>
<SET OBJ ,L-PRSI>)>
<COND (<AND .OBJ
<NOT <REMOTE-VERB? ,L-PRSA>>
;<NOT <EQUAL? ,L-PRSA ,V?WAIT-UNTIL>>
<NOT <EQUAL? .OBJ ,ROOMS>>>
<SETG CLOCK-WAIT T>
<TELL "(You can't see">
<COND (.N <TELL " any " D .OBJ " here.)" CR>)
(T <TELL HIM .OBJ " any more.)" CR>)>
<RFATAL>)
(T
<SETG WINNER ,L-WINNER>
<PERFORM ,L-PRSA ,L-PRSO ,L-PRSI>)>>
<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 () <ROOM-CHECK>>
<ROUTINE V-ANALYZE ()
<COND (<FSET? ,PRSO ,PERSONBIT> <TELL "How?" CR>)
;(<FSET? ,PRSO ,ON?BIT> <CHECK-ON-OFF>)
(<FSET? ,PRSO ,DOORBIT> <CHECK-DOOR ,PRSO>)
(T <TELL CHE ,PRSO look " normal." CR> ;<YOU-CANT "check">)>>
<ROUTINE V-ANSWER ()
<TELL "Nobody seems to be 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 ()
;<HE-SHE-IT ,PRSO T "seem">
<TELL CHE ,PRSO seem " to be waiting for you to speak." CR>>
"<ROUTINE PRE-ARREST ()
<COND (<EQUAL? ,PRSI ,ROOMS>
<SETG PRSI <>>)>
<COND (<OR <NOT <FSET? ,PRSO ,PERSONBIT>>
,PRSI>
<TELL 'What a brilliant spy! \'Quick! Arrest that ' D ,PRSO>
<COND (,PRSI <TELL ' for ' D ,PRSI>)>
<TELL ' before' HE ,PRSO escape '!\'' CR>)
(T
<TELL 'For what? You have no evidence of a crime yet.' CR>)>>
<ROUTINE V-ARREST ()
<TELL
'You don't have enough evidence to arrest' HIM ,PRSO '.' CR>>"
<ROUTINE PRE-ASK () <PRE-ASK-ABOUT>>
<ROUTINE V-ASK ()
<COND (<AND ,P-CONT
<FSET? ,PRSO ,PERSONBIT>
<NOT <FSET? ,PRSO ,MUNGBIT>>>
;<SETG L-WINNER ,WINNER>
<SETG WINNER ,PRSO>
<SETG QCONTEXT ,PRSO>
<SETG QCONTEXT-ROOM ,HERE>)
(T <V-ASK-ABOUT>)>>
<ROUTINE PRE-ASK-ABOUT ("AUX" L)
<COND (<OR <NOT <FSET? ,PRSO ,PERSONBIT>>
<FSET? ,PRSO ,MUNGBIT>>
<TELL CHE ,PRSO do "n't respond at the moment." CR>)
(T
<UNSNOOZE ,PRSO>
<SET L <META-LOC ,PRSO>>
<COND (<EQUAL? .L ,HERE> <RFALSE>)
(<GLOBAL-IN? ,PRSO ,HERE> <RFALSE>)>
<NOT-HERE-PERSON ,PRSO>
<RTRUE>)>>
<ROUTINE V-ASK-ABOUT ()
<COND (<OR <==? ,PRSO ,PLAYER>
<NOT <FSET? ,PRSO ,PERSONBIT>>
<FSET? ,PRSO ,MUNGBIT>>
<WONT-HELP-TO-TALK-TO ,PRSO>
<RFATAL>)
(<VERB? ASK>
<PRODUCE-GIBBERISH>
;<TELL "\"Ask me about something in particular.\"" CR>)
(T
<TELL CHE ,PRSO do "n't seem to know about"HIM ,PRSI"." CR>)>>
<ROUTINE PRE-ASK-CONTEXT-ABOUT ("AUX" P)
<COND (<QCONTEXT-GOOD?>
<PERFORM ,V?ASK-ABOUT ,QCONTEXT ,PRSO>
<RTRUE>)
(<SET P <FIND-FLAG-HERE-NOT ,PERSONBIT ,MUNGBIT ,WINNER>>
<TELL ,I-ASSUME " ask" THE .P ".)" CR>
<PERFORM ,V?ASK-ABOUT .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>>>
<PRODUCE-GIBBERISH>)
(T <HAR-HAR>)>>
<ROUTINE PRE-ASK-CONTEXT-FOR ("AUX" P)
<COND (<QCONTEXT-GOOD?>
<PERFORM ,V?ASK-FOR ,QCONTEXT ,PRSO>
<RTRUE>)
(<SET P <FIND-FLAG-HERE-NOT ,PERSONBIT ,MUNGBIT ,WINNER>>
<TELL ,I-ASSUME " ask" THE .P ".)" CR>
<PERFORM ,V?ASK-FOR .P ,PRSO>
<RTRUE>)>>
<ROUTINE V-ASK-CONTEXT-FOR () <ARENT-TALKING>>
<ROUTINE V-ATTACK () <IKILL "attack">>
<ROUTINE PRE-BRING ()
<COND (<NOT <EQUAL? ,PRSI <> ,PLAYER ,GLOBAL-HERE>>
<SETG CLOCK-WAIT T>
<TELL "(Sorry, but I don't understand.)" CR>)>>
<ROUTINE V-BRING () <V-TAKE> ;<YOU-CANT ;"bring">>
<ROUTINE PRE-SBRING () <PERFORM ,V?BRING ,PRSI ,PRSO> <RTRUE>>
<ROUTINE V-SBRING () <V-FOO>>
<ROUTINE V-BRUSH ()
<TELL "You try for a minute and then decide it's an endless task." CR>>
<ROUTINE TELL-NO-PRSI ()
<SETG CLOCK-WAIT T>
<TELL "(You didn't say with what!)" 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 ()
<COND (<DOBJ? TICKET PASSPORT TIMETABLE CHECK
MCGUFFIN SPY-LIST NEWSPAPER CIGARETTE>
<REMOVE-CAREFULLY ,PRSO>
<TELL CHE ,PRSO catch " fire and is consumed." CR>)
(T <YOU-CANT>)>>
<ROUTINE REMOVE-CAREFULLY (OBJ "AUX" OLIT)
<NOT-IT .OBJ>
<SET OLIT ,LIT>
<REMOVE .OBJ>
<SETG LIT <LIT? ,HERE>>
<COND (<AND .OLIT <NOT <EQUAL? .OLIT ,LIT>>>
<TELL "You are left in the dark...." CR>)>
T>
"<GLOBAL POCKET-CHANGE 49>"
<ROUTINE PRE-BUY ()
<COND (<AND <NOT <IN? ,MACHINE ,HERE>>
<NOT <FIND-FLAG-HERE-NOT ,PERSONBIT ,MUNGBIT ,WINNER>>>
<SETG CLOCK-WAIT T>
<COND (<VISIBLE? ,WAITER>
<TELL CHE ,WAITER is "n't close enough!)" CR>)
(T
<TELL "(There's no one here to serve you!)" CR>)>)>>
<ROUTINE PRE-BUY-TICKET ()
<COND (<NOT <EQUAL? ,HERE ,TICKET-AREA>>
<SETG CLOCK-WAIT T>
<TELL "(You can't buy that here.)" CR>)>>
<ROUTINE V-BUY-TICKET () <YOU-CANT>>
<ROUTINE V-BUY ("AUX" COST X)
<COND (<NOT <EQUAL? ,HERE ,CAFE>>
<SETG CLOCK-WAIT T>
<TELL "(You can't buy " A ,PRSO " here.)" CR>)
(<AND <NOT <IN? ,PRSO ,ROOMS>>
<L? 0 <SET COST <GETP ,PRSO ,P?NORTH>>>
<NOT <FSET? ,PRSO ,PERSONBIT>>>
<SET X <GETP ,PLAYER ,P?SOUTH>>
<COND (<G? .COST .X>
<TELL "You don't have enough money." CR>)
(T
<PUTP ,PLAYER ,P?SOUTH <- .X .COST>>
<PUTP ,PRSO ,P?NORTH -1>
<FSET ,PRSO ,TAKEBIT>
<FCLEAR ,PRSO ,NDESCBIT>
<COND ;(<OR <NOT <EQUAL? ,HERE ,CAFE>>
;<G? <+ <WEIGHT ,PRSO> <WEIGHT ,WINNER>>
,LOAD-ALLOWED>
<G? <CCOUNT ,WINNER> ,FUMBLE-NUMBER>>
<MOVE ,PRSO ,COUNTER>)
(T <MOVE ,PRSO ,WINNER>)>
<TELL "You have bought " A ,PRSO " for ">
<PRINTC ,CURRENCY-SYMBOL>
<TELL N .COST>
;<COND (<AND <IN? ,PRSO ,COUNTER> <EQUAL? ,HERE ,CAFE>>
<TELL
". Since you can't carry it now, the waitress leaves it on the counter">)>
<TELL "." CR>)>)
(<==? .COST -1>
<TELL "You've already bought" HIM ,PRSO "." CR>)
(T ;<HE-SHE-IT ,PRSO T "is"> <TELL CHE ,PRSO is " not for sale." CR>)>>
"<ROUTINE V-CALL-LOSE ()
<TELL '(I couldn't find a verb in that sentence!)' CR>>"
<ROUTINE V-$CALL ("AUX" PER (MOT <>) C)
<SET PER ,PRSO>
<COND (<OR <NOT <FSET? .PER ,PERSONBIT>>
<FSET? .PER ,MUNGBIT>
<==? .PER ,PLAYER>>
<WONT-HELP-TO-TALK-TO .PER>
<RTRUE>)>
<UNSNOOZE .PER>
<COND (<SET C <GETP .PER ,P?CHARACTER>> ;<FSET? .PER ,PERSONBIT>
;<COND (T ;<NOT <==? .PER ,REMOTE-PERSON>>
<SET PER <GET ,CHARACTER-TABLE .C>>)>
<COND (<IN-MOTION? .PER> <SET MOT T>)>
<COND (<==? <META-LOC .PER> ,HERE>
<TELL CTHE .PER>
<COND (<GRAB-ATTENTION .PER>
<FCLEAR .PER ,TOUCHBIT>
<PUTP .PER ,P?LDESC 21 ;"listening to you">
<COND (.MOT
<TELL
V .PER stop " and" V .PER turn " toward you." CR>)
(T <TELL V .PER is " listening." CR>)>)
(T
<TELL V .PER ignore " you." CR>)>)
(<CORRIDOR-LOOK .PER>
<COND (<COR-GRAB-ATTENTION ;.PER>
<RTRUE>)
(T
<TELL CTHE .PER V .PER ignore " you." CR>)>)
(T <NOT-HERE .PER>)>)
(T <SETG CLOCK-WAIT T> <MISSING-VERB>)>>
<ROUTINE PRE-PHONE ("AUX" P PP)
<COND (<AND ,PRSI ;<NOT <IOBJ? TELEPHONE>>>
<COND (T
<TOO-BAD-BUT ,PRSI "not wired for phoning">)>)
(<AND <FSET? ,PRSO ,PERSONBIT>
<IN? ,PRSO ,HERE>
<NOT <FSET? ,PRSO ,NDESCBIT>>>
<BITE-YOU>)
(<DOBJ? PLAYER>
<HAR-HAR>)
(<NOT ,PRSI>
<TELL "There's nothing to phone with here." CR>)>>
<ROUTINE V-PHONE ("AUX" PER)
<COND (<AND <SET PER <GETP ,PRSO ,P?CHARACTER>> ;<FSET? ,PRSO ,PERSONBIT>
<SET PER <GET ,CHARACTER-TABLE .PER>>
<OR <==? <META-LOC .PER> ,HERE> <CORRIDOR-LOOK .PER>>>
<PERFORM ,V?$CALL ,PRSO>
<RTRUE>)
(<NOT <==? -1 ,P-NUMBER>> ;<DOBJ? INTNUM>
<TELL "There's no point in calling that number." CR>)
;(<DOBJ? TELEPHONE>
<TELL "You didn't say whom to call." CR>)
(<NOT <FSET? ,PRSO ,PERSONBIT>>
<TOO-BAD-BUT ,PRSO>
<TELL " has no phone." CR>)
(<AND <EQUAL? <META-LOC ,PRSO> ,HERE>
<NOT <FSET? ,PRSO ,NDESCBIT>>>
<BITE-YOU>)
(T <TELL "There's no sense in phoning" HIM ,PRSO "." CR>)>>
<ROUTINE V-CHANGE () <YOU-CANT ;"change">>
<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>)
(T <YOU-CANT "get in">)>>
<ROUTINE V-CLIMB-ON () <YOU-CANT "climb onto">>
<ROUTINE V-CLIMB-UP ("OPTIONAL" (DIR ,P?UP) (OBJ <>) "AUX" X)
<COND (<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>
<FSET? ,PRSO ,WINDOWBIT>>>
<YOU-CANT ;"close">)
(<OR <FSET? ,PRSO ,DOORBIT>
<FSET? ,PRSO ,WINDOWBIT>>
<COND (<FSET? ,PRSO ,OPENBIT>
<COND (<FSET? ,PRSO ,MUNGBIT>
<TELL
"It won't stay closed. The latch is broken." CR>)
(T
<COND (<FSET? ,PRSO ,LOCKED>
<COND (<OR;<ZMEMQ ,HERE ,CAR-ROOMS-COMPS>
<ZMEMQ ,HERE ,CAR-ROOMS-REST>>
;<FSET ,PRSO ,LOCKED>
<TELL
"(You lock" HIM ,PRSO " too.)" CR>)>)>
<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-COME-WITH ()
<PERFORM ,V?WALK-TO ,PRSI>
<RTRUE>>
<ROUTINE V-COME-WITH () <V-FOO>>
<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> <NOT ,PRSI>>
<COND (<FSET? ,PRSO ,OPENBIT>
<TELL
"You'd fly through the open door if you tried." CR>)
(T <TELL "Why don't you just open it instead?" CR>)>)
(<NOT <FSET? ,PRSO ,PERSONBIT>>
<IF-SPY>)
(<NOT ,PRSI>
<TELL
"Trying to destroy" HIM ,PRSO " with your bare hands is suicidal." CR>)
(<NOT <FSET? ,PRSI ,WEAPONBIT>>
<TELL "You can't destroy" HIM ,PRSO " with" HIM ,PRSI "!" CR>)
(T <YOU-CANT ;"destroy">)>>
"<ROUTINE V-DEVELOP () <YOU-CANT>>"
<ROUTINE V-DIAGNOSE ()
<COND (,PRSO <YOU-CANT ;"diagnose">)
(T <TELL "You're wide awake and in good health." CR>)>>
<ROUTINE PRE-DISCUSS ()
<COND (<NOT ,PRSI> <SETG PRSI ,PLAYER>)>
<PERFORM ,V?TELL-ABOUT ,PRSI ,PRSO>
<RTRUE>>
<ROUTINE V-DISCUSS () <V-FOO>>
<ROUTINE V-DRINK () <YOU-CANT ;"drink">>
<ROUTINE V-DROP ()
<COND ;(<ROOM-CHECK> <RTRUE>)
;(<EQUAL? ,PRSO ,GLOBAL-HERE <META-LOC ,WINNER>>
<DO-WALK ,P?OUT>
<RTRUE>)
(<IDROP>
<OKAY ,PRSO <GROUND-DESC>>)>>
<ROUTINE GROUND-DESC ()
<COND (<EQUAL? ,HERE ,ROOF> "on the roof")
(<EQUAL? ,HERE ,BESIDE-TRACKS> "on the ground")
(T "on the floor")>>
<ROUTINE V-EAT () <TELL "It's hard to believe that you're that hungry." CR>>
<ROUTINE PRE-EMPTY ()
<COND (<NOT <FIRST? ,PRSO>>
<ALREADY ,PRSO "empty">)>>
<ROUTINE V-EMPTY ()
<COND ;(<NOT ,PRSI>
<PERFORM ,V?EMPTY ,PRSO ,GLOBAL-WATER>
<RTRUE>)
(T <V-FILL>)>>
<ROUTINE V-ENTER ()
<DO-WALK ,P?IN>
<RTRUE>>
<ROUTINE V-THROUGH ("OPTIONAL" (OBJ <>) "AUX" RM DIR)
<COND (<IN? ,PRSO ,ROOMS>
<PERFORM ,V?WALK-TO ,PRSO>
<RTRUE>)
(<AND <FSET? ,PRSO ,DOORBIT> <FSET? ,PRSO ,OPENBIT>>
<COND (<AND <SET RM <DOOR-ROOM ,HERE ,PRSO>>
<GOTO .RM>>
<OKAY>)
(T <TELL
"Sorry, but the \"" D ,PRSO "\" must be somewhere else." CR>)>)
(<AND <NOT .OBJ> <NOT <FSET? ,PRSO ,TAKEBIT>>>
;<HE-SHE-IT ,WINNER T "bang">
<TELL
CHE ,WINNER bang " into it 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 ("AUX" VAL)
<COND (<ROOM-CHECK> <RTRUE>)
(<==? ,P-ADVERB ,W?CAREFULLY>
<COND (<NOT <SET VAL <INT-WAIT 3>>>
<TELL
"You never got to finish examining" HIM ,PRSO "." CR>)
(<==? .VAL ,M-FATAL> <RTRUE>)>)>>
<ROUTINE V-EXAMINE ("AUX" TXT P)
<COND (<DOBJ? INTDIR>
<SETG CLOCK-WAIT T>
<TELL
"(If you want to see what's there, face that way or go there!)" CR>)
(<DOBJ? HEAD HANDS>
<NOTHING-SPECIAL>)
(<AND <IN? ,PRSO ,GLOBAL-OBJECTS>
<NOT <CORRIDOR-LOOK ,PRSO
;<GET ,CHARACTER-TABLE <GETP ,PRSO ,P?CHARACTER>>>>>
<NOT-HERE ,PRSO>
<RTRUE>)
(<IN? ,PRSO ,ROOMS> ;<FSET? ,PRSO ,RLANDBIT>
<ROOM-PEEK ,PRSO>)
(<NOT <EQUAL? <META-LOC ,PRSO> ,HERE ,LOCAL-GLOBALS>>
<TOO-BAD-BUT ,PRSO "too far away">)
(<SET TXT <GETP ,PRSO ,P?TEXT>>
<TELL .TXT CR>)
(<OR <FSET? ,PRSO ,CONTBIT>
;<FSET? ,PRSO ,DOORBIT>
;<FSET? ,PRSO ,WINDOWBIT>>
<V-LOOK-INSIDE>)
;(<FSET? ,PRSO ,ON?BIT> <CHECK-ON-OFF>)
(<FSET? ,PRSO ,DOORBIT> <CHECK-DOOR ,PRSO>)
(T
<NOTHING-SPECIAL>)>>
<ROUTINE NOTHING-SPECIAL ()
<TELL "Yup. That's " A ,PRSO ", all right." CR>>
<ROUTINE GLOBAL-IN? (OBJ1 OBJ2 "AUX" TBL)
<COND (<SET TBL <GETPT .OBJ2 ,P?GLOBAL>>
%<COND (<AND <GASSIGNED? PLUS-MODE> ,PLUS-MODE>
'<ZMEMQ .OBJ1 .TBL <RMGL-SIZE .TBL>>)
(T
'<ZMEMQB .OBJ1 .TBL <RMGL-SIZE .TBL>>)>)>>
<ROUTINE V-$FACE ()
<COND (<NOT ,PLAYER-NOT-FACING>
<TELL "0" CR>)
(T
<TELL "not ">
<DIR-PRINT ,PLAYER-NOT-FACING>
<CRLF>)>>
<ROUTINE V-FACE ("AUX" P)
<COND (<NOT ,P-WALK-DIR>
<SETG CLOCK-WAIT T>
<TELL "(I can't figure out what direction that is.)" CR>
<RFATAL>)
(<NOT <SET P <COMPASS-EQV ,HERE ,PRSO>>>
<SETG CLOCK-WAIT T>
<TELL "(You can't face that way!)" CR>
<RFATAL>)>
;<SETG PLAYER-NOT-FACING-OLD ,PLAYER-NOT-FACING>
<SETG PLAYER-NOT-FACING <OPP-DIR .P>>
<TELL "Okay, you're now facing to ">
<DIR-PRINT .P>
<TELL "." CR>
<COND (<GETP ,HERE ,P?CORRIDOR>
<CORRIDOR-LOOK>)>
<RTRUE>>
<ROUTINE V-FAINT ()
<TELL "As you wish.">
<UNCONSCIOUS-FCN ;<+ 9 <RANDOM 6>>>>
<ROUTINE PRE-FILL ()
<COND (<AND ,PRSI ;<NOT <EQUAL? ,PRSI ,GLOBAL-WATER>>>
<HAR-HAR>)>>
<ROUTINE V-FILL ()
<TELL "You may know how to do that, but this story doesn't." CR>>
<ROUTINE PRE-FIND ("AUX" CHR)
<COND (<DOBJ? PLAYER> <RFALSE>)>
<COND (<IN? ,PRSO ,ROOMS>
<COND (<==? ,PRSO ,HERE>
<ALREADY ,PLAYER "here">)
(<FSET? ,PRSO ,TOUCHBIT>
<TELL "You should know - you've been there!" CR>)
(T
<TELL "You'll have to figure that out." CR>)>)
(<SET CHR <GETP ,PRSO ,P?CHARACTER>> ;<FSET? ,PRSO ,PERSONBIT>
;<COND (<IN? ,PRSO ,GLOBAL-OBJECTS>
<SETG PRSO <GET ,CHARACTER-TABLE .CHR>>)>
<COND (<AND <==? <META-LOC ,WINNER> <META-LOC ,PRSO>>
<NOT <FSET? ,PRSO ,NDESCBIT>>>
<BITE-YOU>
<RTRUE>)
(T ;<OR <NOT <LOC ,PRSO>> <FAR-AWAY? <LOC ,PRSO>>>
<WHO-KNOWS? ,PRSO>
<RTRUE>)>)>>
<ROUTINE BITE-YOU ()
<TELL "If" HE ,PRSO " were any closer," HE ,PRSO "'d bite you!" CR>>
<ROUTINE V-FIND ("AUX" (L <LOC ,PRSO>))
<COND (<==? ,PRSO ,PLAYER>
<TELL "You're right here, ">
<TELL-LOCATION>
<CRLF>)
(<HELD? ,PRSO>
<TELL "You have it." CR>)
(<OR <AND <EQUAL? .L ,LOCAL-GLOBALS>
<GLOBAL-IN? ,PRSO ,HERE>>
<AND <EQUAL? <META-LOC ,PRSO> ,HERE>
<VISIBLE? ,PRSO>>
;<IN? ,PRSO ,HERE>
;<==? ,PRSO ,PSEUDO-OBJECT>>
<TELL "It's right here." CR>)
(<AND <NOT <FSET? ,PRSO ,TOUCHBIT>>
<OR <IN? ,PRSO ,ROOMS> <FSET? ,PRSO ,PERSONBIT>>
<NOT <FSET? ,PRSO ,SEENBIT>>>
;<NOT-HERE ,PRSO>
<TELL "You can't see any " D ,PRSO " here." CR>)
(<OR <EQUAL? .L ,GLOBAL-OBJECTS ,LOCAL-GLOBALS>
<EQUAL? .L ,UNDER-SEAT-1 ,UNDER-SEAT-2 ,UNDER-SEAT-3>
<EQUAL? .L ,UNDER-SEAT-4 ,UNDER-SEAT-5>>
<TELL "It's around somewhere." CR>)
(<FAR-AWAY? <META-LOC ,PRSO>>
<TELL "It's far away from here." CR>)
(<FSET? .L ,PERSONBIT>
<TELL CTHE .L " probably has it." CR>)
(<FSET? .L ,SURFACEBIT>
<TELL "It's probably on" THE .L "." CR>)
(<OR <FSET? .L ,CONTBIT>
<IN? .L ,ROOMS>>
<TELL "It's probably in" THE .L "." CR>)
(ELSE
<TELL "It's nowhere in particular." CR>)>>
<ROUTINE V-FIND-WITH () <V-FIND>>
<ROUTINE V-FIX () <MORE-SPECIFIC>>
;<ROUTINE () <TELL "Whatever do you have in mind?" CR>>
<ROUTINE V-FLUSH ()
<COND (<GLOBAL-IN? ,TOILET ,HERE>
<PERFORM ,V?FLUSH ,PRSO ,TOILET>
<RTRUE>)
(T <TELL "You look around for a toilet but find none." CR>)>>
<ROUTINE V-FLUSH-AWAY () <V-FLUSH>>
<ROUTINE V-FLUSH-DOWN () <V-FLUSH>>
<ROUTINE V-FOLLOW ("AUX" CN CHR COR PCOR L)
<COND (<==? ,PRSO ,PLAYER>
<NOT-CLEAR-WHOM>)
(<NOT <SET CN <GETP ,PRSO ,P?CHARACTER>>
;<FSET? ,PRSO ,PERSONBIT>>
<TELL
"How tragic to see a would-be spy stalking " A ,PRSO "!" CR>)
(<==? ,HERE
<SET L <META-LOC <SET CHR <GET ,CHARACTER-TABLE .CN>>>>>
<TELL "You're in the same place as" HE ,PRSO "!" CR>)
(<OR <NOT .L> ;<==? .L ,LIMBO>>
<TELL CTHE ,PRSO " has left the story." CR>)
(T
<PERFORM ,V?WALK-TO .CHR>
<RTRUE>)>>
<ROUTINE V-FOO ()
<TELL "[Foo!! This is a bug!!]" CR>>
<ROUTINE PRE-GESTURE ()
<PERFORM ,V?MAKE ,GESTURE ,PRSO>
<RTRUE>>
<ROUTINE V-GESTURE () <V-FOO>>
<ROUTINE PRE-GIVE ()
<COND (<OR <AND <FSET? ,PRSO ,PERSONBIT>
<NOT <FSET? ,PRSO ,MUNGBIT>>>
<DOBJ? GLOBAL-MONEY>>
<MORE-SPECIFIC>)
(<AND ,P-DOLLAR-FLAG <DOBJ? INTNUM>>
<COND (<G? ,P-AMOUNT <GETP ,PLAYER ,P?SOUTH>>
<TELL "You don't have that much." CR>)>)
(<AND <NOT <HELD? ,PRSO>> <NOT <EQUAL? ,PRSI ,PLAYER>>>
<TELL "That's easy for you to say, since ">
;<HE-SHE-IT ,WINNER <> "is">
<TELL HE ,WINNER is "n't holding" HIM ,PRSO "." CR>)>>
<ROUTINE V-GIVE ()
<COND (<NOT ,PRSI> <YOU-CANT ;"give">)
(<NOT <FSET? ,PRSI ,PERSONBIT>>
<TELL "You 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>)
(T
<MOVE ,PRSO ,PRSI>
<TELL CTHE ,PRSI " accepts the offer." CR>)>>
<ROUTINE PRE-SGIVE () <PERFORM ,V?GIVE ,PRSI ,PRSO> <RTRUE>>
<ROUTINE V-SGIVE () <V-FOO>>
<ROUTINE PRE-GOODBYE () <PRE-HELLO>>
<ROUTINE V-GOODBYE () <V-HELLO <>>>
<ROUTINE PRE-HANGUP ()
<COND (<NOT <DOBJ? ROOMS ;TELEPHONE>>
<TOO-BAD-BUT ,PRSO "not wired for phoning">)>>
<ROUTINE V-HANGUP ()
<COND ;(,REMOTE-PERSON
<PERFORM ,V?GOODBYE>
<RTRUE>)
(T <TELL "You're not talking to anyone!" CR>)>>
<ROUTINE PRE-HEAT () <PRE-BURN>>
<ROUTINE V-HEAT () <TELL CHE ,PRSO " gets a little bit hotter." CR>>
<ROUTINE PRE-HELLO ("AUX" P)
<COND (,PRSO <UNSNOOZE ,PRSO> <RFALSE>)
(<QCONTEXT-GOOD?>
<PERFORM ,PRSA ,QCONTEXT>
<RTRUE>)
(<AND <EQUAL? ,WINNER ,PLAYER>
<SET P <FIND-FLAG-HERE-NOT ,PERSONBIT ,MUNGBIT ,WINNER>>
<NOT <FSET? .P ,INVISIBLE>>>
<TELL ,I-ASSUME " hello " D .P ".)" CR>
<PERFORM ,PRSA .P>
<RTRUE>)
(T <NOT-CLEAR-WHOM>)>>
<ROUTINE V-HELLO ("OPTIONAL" (HELL T))
<COND (<GETP ,PRSO ,P?CHARACTER>
<COND (<AND <FSET? ,PRSO ,PERSONBIT> <NOT <FSET? ,PRSO ,MUNGBIT>>>
<TELL CHE ,PRSO nod " at you." CR>)
(T <WONT-HELP-TO-TALK-TO ,PRSO>)>)
(,PRSO
<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 ,GAME " 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-HIDE ()
<COND ;(<EQUAL? ,HERE ,OFFICE>
<TELL "You could hide behind the lounge." CR>)
(T <TELL "There's no good hiding place here." CR>)>>
<ROUTINE V-HIDE-BEHIND ()
<COND (<FIND-FLAG-HERE-NOT ,PERSONBIT ,MUNGBIT ,WINNER>
<TELL "As you start to hide">
<COND (,PRSI <HIM-HER-IT ,PRSO>)>
<TELL ", you realize that someone may be watching you." CR>)
;(<DOBJ? LOUNGE>
<SETG PLAYER-HIDING ,PRSO>
;<SETG PLAYER-NOT-FACING-OLD ,PLAYER-NOT-FACING>
<SETG PLAYER-NOT-FACING <>>
<TELL "Okeh, you're now crouching down behind the lounge." CR>)
(T
<TELL "There's no room to hide">
<COND (,PRSI <HIM-HER-IT ,PRSO>)>
<TELL " behind">
<COND (,PRSI <HIM-HER-IT ,PRSI>) (T <HIM-HER-IT ,PRSO>)>
<TELL "." CR>)>>
<ROUTINE PRE-HOLD-OVER () <PERFORM ,V?HOLD-UNDER ,PRSI ,PRSO> <RTRUE>>
<ROUTINE V-HOLD-OVER () <V-FOO>>
<ROUTINE V-HOLD-UNDER ("AUX" X)
<COND (<SET X <ANYONE-VISIBLE?>>
<UNSNOOZE .X>
<TELL CHE .X applaud " sarcastically for your feat." CR>)
(T <TELL "Nothing happens." CR>)>>
;<ROUTINE V-KICK () <HACK-HACK "Kicking">>
<ROUTINE V-KILL () <IKILL "kill">>
<ROUTINE IKILL (STR)
<COND (<NOT ,PRSO> <TELL "There's nothing here to " .STR "." CR>)
(<AND <NOT ,PRSI> <FSET? ,PRSO ,WEAPONBIT>>
<TELL "You didn't say what to " .STR " at." CR>)
(<NOT <FSET? ,PRSO ,PERSONBIT>>
<HAR-HAR>)
(<IN? ,PRSO ,GLOBAL-OBJECTS>
<TELL "You can't do it from here." CR>)
(T <TELL
"You think it over. It's not worth the hassle." CR>)>>
<ROUTINE V-KISS ()
<COND (<AND <FSET? ,PRSO ,PERSONBIT> <NOT <FSET? ,PRSO ,MUNGBIT>>>
<FACE-RED "kiss">)
(T <TELL "What a (ahem!) strange idea!" CR>)>>
<ROUTINE V-KNOCK ("AUX" P)
<COND (<OR <FSET? ,PRSO ,DOORBIT>
<FSET? ,PRSO ,WINDOWBIT>>
<COND (<SET P <FIND-FLAG <DOOR-ROOM ,HERE ,PRSO> ,PERSONBIT ,PLAYER>>
<UNSNOOZE .P>
<TELL "Someone shouts, ">
<PRODUCE-GIBBERISH>)
(T <TELL "There's no answer." CR>)>)
(ELSE
<TELL "Why knock on " A ,PRSO "?" CR>)>>
<ROUTINE V-STAND ("AUX" P)
<COND (,PLAYER-SEATED
;<MOVE ,WINNER ,HERE>
<SETG PLAYER-SEATED <>>
<TELL "You're on your own feet again." CR>)
(T
<ALREADY ,PLAYER "standing up">)>>
<ROUTINE V-LEAP ()
<COND (<AND ,PRSO
<NOT <DOBJ? INTDIR>>>
<PERFORM ,V?BOARD ,PRSO>
<RTRUE>)
(<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 yourself?" CR>)
(<==? 4 .X>
<TELL "Wheeeeeeeeee!!!!!" CR>)
(T <TELL "Do you expect someone to applaud?" CR>)>>
<ROUTINE V-LEARN () <YOU-CANT>>
<ROUTINE V-LEAVE ()
<COND (<EQUAL? <LOC ,PRSO> ,PLAYER ,POCKET>
<PERFORM ,V?DROP ,PRSO>
<RTRUE>)
(<AND ,PRSO <NOT <==? <LOC ,WINNER> ,PRSO>>>
<TELL "You're not in" HIM ,PRSO "!" CR>
<RFATAL>)
(<AND ,ON-TRAIN
<OR ;<NOT ,PRSO> <EQUAL? ,PRSO ,TRAIN>>>
<PERFORM ,V?WALK-TO ,PLATFORM-GLOBAL>
<RTRUE>)
(T <DO-WALK ,P?OUT> <RTRUE>)>>
<ROUTINE PRE-LIE () <ROOM-CHECK>>
<ROUTINE V-LIE () <V-SIT T>>
<ROUTINE V-LISTEN ()
<COND (<AND <FSET? ,PRSO ,PERSONBIT> <NOT <FSET? ,PRSO ,MUNGBIT>>>
<WAITING-FOR-YOU-TO-SPEAK>
<RTRUE>)
(T
<TOO-BAD-BUT ,PRSO>
<TELL V ,PRSO make " no sound." CR>)>>
<ROUTINE V-LOCK ()
<COND (<FSET? ,PRSO ,DOORBIT>
<COND (<OR <ZMEMQ ,HERE ,CAR-ROOMS-COMPS>
<ZMEMQ ,HERE ,CAR-ROOMS-REST>>
<COND (<FSET? ,PRSO ,OPENBIT>
<FCLEAR ,PRSO ,OPENBIT>
<TELL "(You close" HIM ,PRSO " first.)" CR>)>
<OKAY ,PRSO "locked">)
(T
<TELL "You search for a way to lock it ">
<COND (<NOT <DOBJ? VESTIBULE-FWD-DOOR VESTIBULE-REAR-DOOR>>
<TELL "from the outside ">)>
<TELL "but find none." CR>)>)
(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>
<COND (<==? ,P-ADVERB ,W?CAREFULLY>
<PERFORM ,V?SEARCH ,FLOOR>
<RTRUE>)
(T <TELL
"A quick look reveals nothing interesting " <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 (<SET RM <FIND-FLAG-LG ,HERE ,WINDOWBIT>>
<TELL ,I-ASSUME THE .RM ;" a window" ".)" CR>
<PERFORM ,PRSA .RM ,PRSI>
<RTRUE>)>)
(T
<COND (<OR <SET RM <FIND-FLAG-LG ,HERE ,CONTBIT>>
<SET RM <FIND-FLAG-LG ,HERE ,WINDOWBIT>>
<SET RM <FIND-FLAG-LG ,HERE ,DOORBIT>>>
<TELL ,I-ASSUME THE .RM ".)" CR>
<PERFORM ,PRSA .RM ,PRSI>
<RTRUE>)>)>)>
<COND (<DOBJ? GLOBAL-HERE>
<PERFORM ,V?LOOK>
<RTRUE>)
(<IN? ,PRSO ,ROOMS> ;<FSET? ,PRSO ,RLANDBIT>
<ROOM-PEEK ,PRSO>)
(<FSET? ,PRSO ,CONTBIT>
<COND (<NOT <SEE-INSIDE? ,PRSO T>>
<FSET ,PRSO ,OPENBIT>
<TELL "(You open" HIM ,PRSO " first.)" CR>)>
<COND (<AND <FIRST? ,PRSO> <PRINT-CONT ,PRSO>>
<RTRUE>)
(T <TOO-BAD-BUT ,PRSO "empty">)>)
(<FSET? ,PRSO ,SURFACEBIT>
<COND (<AND <FIRST? ,PRSO> <PRINT-CONT ,PRSO>>
<RTRUE>)
(T <TELL "There's nothing on" HIM ,PRSO "."CR>)>)
(<V-LOOK-THROUGH T> <RTRUE>)
(<==? .DIR ,P?IN> <YOU-CANT "look inside">)
(T ;<==? .DIR ,P?OUT> <YOU-CANT "look outside">)>>
<ROUTINE V-LOOK-THROUGH ("OPTIONAL" (INSIDE <>) "AUX" RM)
<COND (<FSET? ,PRSO ,DOORBIT>
<COND (<OR <FSET? ,PRSO ,OPENBIT> <FSET? ,PRSO ,TRANSBIT>>
<COND (<SET RM <DOOR-ROOM ,HERE ,PRSO>>
<ROOM-PEEK .RM T>)
(T <TELL
"You can't tell what's beyond" HIM ,PRSO "." CR>)>)
(T
<TOO-BAD-BUT ,PRSO "closed">)>)
(<FSET? ,PRSO ,WINDOWBIT>
<COND ;(<SET RM <WINDOW-ROOM ,HERE ,PRSO>>
<ROOM-PEEK .RM T>)
(T <TELL
"You can't tell what's beyond" HIM ,PRSO "." CR>)>)
(<FSET? ,PRSO ,PERSONBIT>
<TELL "You forgot to bring your X-ray glasses." CR>)
(.INSIDE <RFALSE>)
(T <YOU-CANT "look through">)>>
<ROUTINE ROOM-PEEK (RM "OPTIONAL" (SAFE <>) "AUX" (X <>) OLD-HERE TXT)
<SET OLD-HERE ,HERE>
<COND (<OR .SAFE <SEE-INTO? .RM>>
<COND (<AND <NOT ,PLAYER-SEATED>
<NOT ,PLAYER-HIDING>
<SET TXT <COMPASS-EQV ,HERE<DIR-FROM ,HERE .RM>>>>
<SETG PLAYER-NOT-FACING <OPP-DIR .TXT>>)>
<SETG HERE .RM>
<TELL "You take a quick peek into" HIM .RM ":" CR>
<COND (<NOT <==? ,PLAYER-NOT-FACING-OLD ,PLAYER-NOT-FACING>>
<TELL "[You're facing to ">
<DIR-PRINT <OPP-DIR ,PLAYER-NOT-FACING>>
<TELL ".]" 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 (<NOT .X>
<TELL "You can't see anything interesting." CR>)>
<SETG HERE .OLD-HERE>)>>
<ROUTINE SEE-INTO? (THERE "AUX" P L TBL O)
<SET P 0>
<REPEAT ()
<COND (<0? <SET P <NEXTP ,HERE .P>>>
<TELL
"You can't seem to find that room." CR>
<RFALSE>)
;(<EQUAL? .P ,P?IN ,P?OUT> <RTRUE>)
(<NOT <L? .P ,LOW-DIRECTION>>
<SET TBL <GETPT ,HERE .P>>
<SET L <PTSIZE .TBL>>
<COND (<AND <==? .L ,UEXIT>
<==? <GET-REXIT-ROOM .TBL> .THERE>>
<RTRUE>)
(<AND <==? .L ,DEXIT>
<==? <GET-REXIT-ROOM .TBL> .THERE>>
<COND (<FSET? <GET-DOOR-OBJ .TBL> ,OPENBIT>
<RTRUE>)
(T
<TELL
"(The door to that room is closed.)" CR>
<RTRUE ;RFALSE>)>)
(<AND <==? .L ,CEXIT>
<==? <GET-REXIT-ROOM .TBL> .THERE>>
<COND (<VALUE <GETB .TBL ,CEXITFLAG>>
<RTRUE>)
(T
<TELL
"You can't seem to find that room." CR>
<RFALSE>)>)>)>>>
<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 V-LOOK-UNDER ()
<COND (<HELD? ,PRSO>
<COND (<FSET? ,PRSO ,WORNBIT>
<TELL "You're wearing it!" CR>)
(T
<TELL "You're holding it!" CR>)>)
(<FSET? ,PRSO ,PERSONBIT>
<TELL "Nope. Nothing hiding under" HIM ,PRSO "." 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 (,PRSI
<TELL "There's no information in" HIM ,PRSI " about that."CR>)
(<DOBJ? ROOMS>
<COND (<OUTSIDE? ,HERE>
<SET HR <MOD </ ,PRESENT-TIME 60> 24>>
<COND (<AND <G? .HR 6> <L? .HR 18>>
<TELL "The sun">)
(T <TELL "The moon">)>
<TELL " is shining with all its might." CR>)
(<ZMEMQ ,HERE ,STATION-ROOMS>
<COND (<ON-PLATFORM? ,HERE>
<TELL "The overhanging roof">)
(T <TELL "The ceiling">)>
<TELL
" is constructed on a grand scale, with crossed beams and numerous
chandeliers." CR>)
(T <TELL
"The ceiling has seen better years, but a little soot removal would do
wonders." CR>)>)
(<IN? ,TIMETABLE ,WINNER>
<PERFORM ,V?LOOK-UP ,PRSO ,TIMETABLE>
<RTRUE>)
(T
<TELL "Huh? Without the " D ,TIMETABLE "?" CR>
<RTRUE>)>>
<ROUTINE V-MAKE ()
<TELL
"\"Eat, drink, and make merry, for tomorrow we shall die!\"" CR>>
<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 ;(<IOBJ? INTDIR OFF SLOW MEDIUM FAST> <RFALSE>)
(T
<SETG CLOCK-WAIT T>
<TELL "(Sorry, but I don't understand that sentence.)" CR>)>>
<ROUTINE V-MOVE-DIR ()
<TELL "You can't move" HIM ,PRSO " in any particular direction." CR>>
<ROUTINE V-NOD () <YOU-CANT>>
<ROUTINE V-OPEN ("AUX" F STR)
<COND (<NOT <OR <FSET? ,PRSO ,CONTBIT>
<FSET? ,PRSO ,DOORBIT>
<FSET? ,PRSO ,WINDOWBIT>>>
<YOU-CANT ;"open">)
(<OR <FSET? ,PRSO ,DOORBIT>
<FSET? ,PRSO ,WINDOWBIT>
<NOT <==? <GETP ,PRSO ,P?CAPACITY> 0>>>
<COND (<OR <FSET? ,PRSO ,LOCKED>
>
<COND (<AND <NOT <ZMEMQ ,HERE ,CAR-ROOMS-COMPS>>
<NOT <ZMEMQ ,HERE ,CAR-ROOMS-REST>>>
<TOO-BAD-BUT ,PRSO "locked">
<RTRUE>)
(T
<FCLEAR ,PRSO ,LOCKED>
<TELL "(You unlock" HIM ,PRSO " first.)" CR>)>)>
<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>
<FSET? ,PRSO ,WINDOWBIT>
<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 PRE-PHOTO ()
<COND (<AND ,PRSI <NOT <==? ,PRSI ,CAMERA>>>
<HAR-HAR>
<RTRUE>)
(<NOT-HOLDING? ,CAMERA>
<RTRUE>)
(<FSET? ,CAMERA ,OPENBIT>
<TOO-BAD-BUT ,CAMERA "open">
<RTRUE>)
(,LENS-CRACKED
<TELL "The lens is cracked." CR>
<RTRUE>)
(<OR <NOT <EQUAL? <LOC ,FILM> ,CAMERA>>
<NOT ,CAMERA-COCKED>>
<TELL "You push the button, but it won't move." CR>
<RTRUE>)>>
<ROUTINE TAKE-PICTURE (OBJ)
<COND (<EQUAL? .OBJ ,PLAYER>
<SETG LENS-CRACKED T>
<SET OBJ ,GLOBAL-OBJECTS>
<TELL
"This camera was designed to work on the ocean floor or in outer space, in
arctic cold or tropical heat. It has photographed nuclear explosions without
the slightest difficulty. Your face, however, has cracked its lens!" CR>)>
<SETG CAMERA-COCKED <>>
<COND (<AND <==? .OBJ ,MCGUFFIN> <FSET? ,MCGUFFIN ,LOCKED>>
<FSET ,FILM ,LOCKED>)> ;"altered!"
<PUT ,FILM-TBL ,PICTURE-NUMBER .OBJ>>
<ROUTINE V-PHOTO ()
<COND (<DOBJ? CAMERA FILM>
<HAR-HAR>)
(T
<TAKE-PICTURE ,PRSO>
<TELL "\"Click!\"" CR>
<RTRUE>)>>
<ROUTINE V-PLAY ()
<SETG CLOCK-WAIT T>
<TELL
"(Speaking of playing, you ought to try Infocom's other products, too!)" CR>>
<ROUTINE PRE-POCKET () <PERFORM ,V?PUT-IN ,PRSO ,POCKET> <RTRUE>>
<ROUTINE V-POCKET () <V-FOO>>
<ROUTINE V-POUR () <YOU-CANT>>
<ROUTINE V-PUSH () <HACK-HACK "Pushing">>
<ROUTINE PRE-PUT ()
<COND (<DOBJ? GLOBAL-MONEY>
<TELL ,I-ASSUME>
<PRINTC 32>
<PRINTC ,CURRENCY-SYMBOL>
<TELL "1.)" CR>
<SETG P-DOLLAR-FLAG T>
<SETG P-AMOUNT 1>
<RFALSE>)
(<HELD? ,PRSO>
<RFALSE>)
(<NOT <FSET? ,PRSO ,TAKEBIT>>
<YOU-CANT "pick up">)
(<IN? ,PRSO ,GLOBAL-OBJECTS>
<NOT-HERE ,PRSO>)
(<IOBJ? FLOOR GLOBAL-HERE ;GLOBAL-WATER ;POCKET>
<RFALSE>)
(<IN? ,PRSI ,GLOBAL-OBJECTS>
<NOT-HERE ,PRSI>)>>
<ROUTINE PRE-SPUT-IN () <PERFORM ,V?PUT-IN ,PRSI ,PRSO> <RTRUE>>
<ROUTINE V-SPUT-IN () <V-FOO>>
<ROUTINE PRE-PUT-IN ()
<COND (<AND <IOBJ? WINE-RED WINE-WHITE> <EQUAL? <LOC ,PRSI> ,CUP-A ,CUP-B>>
<PRE-PUT> ;<SETG PRSI ,CUP>)
(<AND <IOBJ? FOOD> ;<EQUAL? <LOC ,PRSI> ,CUP-A ,CUP-B>>
<PRE-PUT> ;<SETG PRSI ,CUP>)
(<IOBJ? CHAIR>
<PRE-PUT>)
(<NOT <FSET? ,PRSI ,CONTBIT>>
<TELL "You search for an opening in" HIM ,PRSI " but find none." CR>)
(<NOT <FSET? ,PRSI ,OPENBIT>>
<TOO-BAD-BUT ,PRSI "closed">)
(T
<PRE-PUT>)>>
<ROUTINE V-PUT-IN () <V-PUT>>
<ROUTINE V-PUT ()
<COND (<IOBJ? PLAYER>
<PERFORM ,V?WEAR ,PRSO>
<RTRUE>)
(<IOBJ? FOOD WINE-RED WINE-WHITE>
T)
(<AND <NOT <FSET? ,PRSI ,OPENBIT>>
<NOT <FSET? ,PRSI ,SURFACEBIT>>
<NOT <FSET? ,PRSI ,VEHBIT>>>
<COND (<OPENABLE? ,PRSI>
<TOO-BAD-BUT ,PRSI "closed">)
(<NOT <FSET? ,PRSI ,SURFACEBIT>>
<TELL "There's no good surface on" HIM ,PRSI "." CR>)
(T <TELL "You can't open" HIM ,PRSI "." CR>)>
<RTRUE>)>
<COND (<NOT ,PRSI> <YOU-CANT ;"put">)
(<==? ,PRSI ,PRSO>
<HAR-HAR>)
(<IN? ,PRSO ,PRSI>
<TOO-BAD-BUT ,PRSO>
<TELL V ,PRSO 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> <WEIGHT ,PRSO>>
<GETP ,PRSI ,P?SIZE>>
<GETP ,PRSI ,P?CAPACITY>>
<TELL "There's not enough room." CR>)
(<AND <NOT <HELD? ,PRSO>>
<NOT <ITAKE>>>
<RTRUE>)
(T
<MOVE ,PRSO ,PRSI>
<FSET ,PRSO ,TOUCHBIT>
<COND (<IOBJ? FOOD WINE-RED WINE-WHITE>
<FSET ,PRSO ,MUNGBIT>)>
<TELL "Okay." CR>)>>
<ROUTINE V-PUT-UNDER ()
<TELL "There's not enough room." CR>>
<ROUTINE V-RAISE () <PERFORM ,V?TAKE ,PRSO> <RTRUE>>
<GLOBAL LIT <>>
<ROUTINE PRE-READ ("AUX" VAL)
<COND (<NOT ,LIT> <TOO-DARK> <RTRUE>)
(<IN? ,PRSO ,GLOBAL-OBJECTS>
<NOT-HERE ,PRSO>)
(<AND ,PRSI
<NOT <FSET? ,PRSI ,TRANSBIT>>
<==? -1 ,P-NUMBER>> ;"? INTNUM?"
<TELL
"You must have a swell method of looking through" HIM ,PRSI "." CR>)
(<==? ,P-ADVERB ,W?CAREFULLY>
<COND (<NOT <SET VAL <INT-WAIT 3>>>
<TELL
"You never got to finish reading" HIM ,PRSO "." CR>)
(<==? .VAL ,M-FATAL> <RTRUE>)>)>>
<ROUTINE V-READ ()
<COND (<NOT <FSET? ,PRSO ,READBIT>> <YOU-CANT ;"read">)
(ELSE <TELL <GETP ,PRSO ,P?TEXT> CR>)>>
<ROUTINE V-REMOVE ()
<COND (<FSET? ,PRSO ,WEARBIT>
<PERFORM ,V?TAKE-OFF ,PRSO>
<RTRUE>)
(T
<PERFORM ,V?TAKE ,PRSO>
<RTRUE>)>>
<ROUTINE V-RING () <TELL "\"DING-DONG!\"" CR>>
<ROUTINE V-RIP () <YOU-CANT>>
<ROUTINE V-RISE ()
<DO-WALK ,P?UP>
<RTRUE>>
<ROUTINE V-RUB () <HACK-HACK "Fiddling with">>
<ROUTINE PRE-RUB-OVER ()
<PERFORM ,V?RUB ,PRSI ,PRSO>
<RTRUE>>
<ROUTINE V-RUB-OVER () <V-FOO>>
<ROUTINE V-SAY ("AUX" P)
<COND (<QCONTEXT-GOOD?>
<PERFORM ,V?TELL ,QCONTEXT>
<RTRUE>)
(<OR <IN? <SET P ,CONTACT> ,HERE>
<SET P <FIND-FLAG-HERE-NOT ,PERSONBIT ,MUNGBIT ,WINNER>>>
<TELL ,I-ASSUME " say to" THE .P ".)" CR>
<PERFORM ,V?TELL .P>
<RTRUE>)
(T
<NOT-CLEAR-WHOM>)>>
<ROUTINE PRE-SAY-INTO ()
<COND ;(<DOBJ? INTERCOM> <RFALSE>)
(<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 (<NOT <ZERO? <GETP ,PRSO ,P?CHARACTER>>>
;<FSET? ,PRSO ,PERSONBIT>
<COND (<SET OBJ <FIRST? ,PRSO>>
<FSET .OBJ ,TAKEBIT>
<FCLEAR .OBJ ,NDESCBIT>
<THIS-IS-IT .OBJ>
<MOVE .OBJ ,PLAYER>
<TELL "You find " A .OBJ " and take it." CR>)
(<SET OBJ <GETP ,PRSO ,P?SOUTH>>
<THIS-IS-IT ,GLOBAL-MONEY>
<PUTP ,PLAYER ,P?SOUTH<+ <GETP ,PLAYER ,P?SOUTH> .OBJ>>
<TELL "You find ">
<PRINTC ,CURRENCY-SYMBOL>
<TELL N .OBJ " and take it." CR>)
(T <TELL "You don't find anything interesting." CR>)>)
(<FSET? ,PRSO ,CONTBIT>
<COND (<NOT <FSET? ,PRSO ,OPENBIT>>
<TOO-BAD-BUT ,PRSO "closed">
<RTRUE>)
(T
<PERFORM ,V?LOOK-INSIDE ,PRSO>
<RTRUE>)>)
(<AND <IN? ,BLOOD-SPOT ,PRSO>
<FSET? ,BLOOD-SPOT ,NDESCBIT>>
<FCLEAR ,BLOOD-SPOT ,NDESCBIT>
<TELL <GETP ,BLOOD-SPOT ,P?FDESC> CR>)
(T <TELL "You find nothing unusual." CR>)>>
<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>
<SETG PRSO ,HERE>)>
<RFALSE>>
<ROUTINE V-SEARCH-FOR ()
<COND (<FSET? ,PRSO ,PERSONBIT>
<COND (<IN? ,PRSI ,PRSO>
<TELL "Indeed," HE ,PRSO has HIM ,PRSI "." CR>)
(T
<TELL CTHE ,PRSO V ,PRSO do "n't have">
<COND (<IN? ,PRSI ,GLOBAL-OBJECTS>
<TELL " " A ,PRSI "." CR>)
(<NOT ,PRSI>
<TELL " that." CR>)
(T
<TELL
HIM ,PRSI " concealed on" HIS ,PRSO " person." CR>)>)>)
(<AND <FSET? ,PRSO ,CONTBIT> <NOT <FSET? ,PRSO ,OPENBIT>>>
<TELL "You'll have to open" HIM ,PRSO " first." CR>)
(<IN? ,PRSI ,PRSO>
<TELL "How observant you are! There ">
;<HE-SHE-IT ,PRSI <> "is">
<TELL HE ,PRSI is "!" CR>)
(<NOT ,PRSI> <YOU-CANT ;"search">)
(T <TELL "You don't find" HIM ,PRSI " 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 (<EQUAL? ,PRSI <> ,PLAYER ,GLOBAL-HERE>
<RFALSE>)
(<FSET? ,PRSO ,PERSONBIT>
<PERFORM ,V?$CALL ,PRSO>
<COND (<NOT <EQUAL? ,WINNER ,PLAYER>>
<PERFORM ,V?WALK-TO ,PRSI>)>
<RTRUE>)
(T
<SETG CLOCK-WAIT T>
<TELL "(Sorry, but I don't understand.)" CR>)>>
<ROUTINE V-SEND-TO () <V-SEND>>
<ROUTINE V-SHAKE ("AUX" X)
<COND ;(<FSET? ,PRSO ,VILLAIN>
<TELL "This seems to have no effect." CR>)
(<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 "Onto the ">
<COND (<EQUAL? ,HERE ,ROOF> <TELL "roof">)
(<EQUAL? ,HERE ,BESIDE-TRACKS> <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 PRE-SHOOT ()
<COND (<NOT ,PRSI>
<COND (<IN? ,CAMERA ,WINNER>
<SETG PRSI ,CAMERA>)
(<IN? ,GUN ,WINNER>
<SETG PRSI ,GUN>)>
<COND (,PRSI
<TELL "(with" THE ,PRSI ")" CR>)>)>
<RFALSE>>
<ROUTINE V-SHOOT ()
<COND (<AND <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 V-SHOW ()
<COND (<==? ,PRSO ,PLAYER>
;<SETG L-WINNER ,WINNER>
<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 (,PRSI
<SETG P-MERGED T>
<PERFORM ,V?SHOW ,PRSI ,PRSO>
<RTRUE>)
(<NOT <HELD? ,PRSO>>
<COND (<FSET? <LOC ,PRSO> ,PERSONBIT>
<PERFORM ,V?TAKE ,PRSO>)
(T
<PERFORM ,V?ASK-CONTEXT-FOR ,PRSO>)>
<RTRUE>)
(<QCONTEXT-GOOD?>
<PERFORM ,V?SHOW ,QCONTEXT ,PRSO>
<RTRUE>)
(<SET P <FIND-FLAG-HERE-NOT ,PERSONBIT ,MUNGBIT ,WINNER>>
<TELL ,I-ASSUME " show" THE .P ".)" CR>
<PERFORM ,V?SHOW .P ,PRSO>
<RTRUE>)
(T
<TELL ,I-ASSUME " show" THE ,PLAYER ".)" CR>
<PERFORM ,V?SHOW ,PLAYER ,PRSO>
<RTRUE>)>>
<ROUTINE V-SSHOW () <RTRUE>>
<ROUTINE V-SIGN () <TELL "You can't sign " A ,PRSO " with " A ,PRSI "!" CR>>
<ROUTINE PRE-SIT () <ROOM-CHECK>>
<ROUTINE V-SIT ("OPTIONAL" (LIE? <>))
<COND (<OR <FSET? ,PRSO ,VEHBIT>
<AND <DOBJ? GLOBAL-HERE HERE FLOOR> ;<FSET? ,HERE ,SURFACEBIT>>>
<SETG PLAYER-NOT-FACING <>>
<TELL "You're now ">
<COND (<ZERO? .LIE?>
<SETG PLAYER-SEATED ,PRSO>
<TELL "sitt">)
(T
<SETG PLAYER-SEATED <- 0 ,PRSO>>
<TELL "ly">)>
<TELL "ing on" HIM ,PRSO "." CR>)
(T <YOU-CANT>
;<SETG CLOCK-WAIT T>
;<TELL "(That won't help your mission!)" 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 that 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 "slap">)>>
<ROUTINE IF-SPY ()
;<COND (<NOT <FSET? ,PRSO ,PERSONBIT>> <TELL "break">)
(T <TELL "drop">)>
<COND (<ZERO? ,PRSI>
<TELL "You give" HIM ,PRSO " a swift hand chop">)
(T <TELL "You swing" HIM ,PRSI " at" HIM ,PRSO>)>
<THIS-IS-IT ,PRSO>
<TELL ", but" HE ,PRSO " seems indestructible. If only you were a ">
<COND (<SPY?> <TELL "better">) (T <TELL "real">)>
<TELL " spy!" CR>>
<ROUTINE FACE-RED (STR)
<UNSNOOZE ,PRSO>
<HE-SHE-IT ,PRSO T "slap" ;.STR>
<TELL " you right back. Wow, is your face red!" CR>>
<ROUTINE V-SLIDE () <YOU-CANT>>
<ROUTINE V-SMELL ()
;<HE-SHE-IT ,PRSO T "smell">
<TELL CHE ,PRSO smell " just like " A ,PRSO "!" CR>>
<ROUTINE V-SMILE ()
<COND (<AND <FSET? ,PRSO ,PERSONBIT>
<NOT <FSET? ,PRSO ,MUNGBIT>>
<NOT <IN? ,PRSO ,GLOBAL-OBJECTS>>>
<TELL CHE ,PRSO smile " back at you." CR>)
(T <HAR-HAR>)>>
<ROUTINE V-SMOKE () <YOU-CANT ;"burn">>
<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 ()
<TELL "You can't swim ">
<COND (,PRSO
<TELL "in" HIM ,PRSO "." CR>)
(T
<TELL <GROUND-DESC> "." CR>)>>
<ROUTINE PRE-TAKE ("AUX" L)
<SET L <LOC ,PRSO>>
<COND (<DOBJ? BRIEFCASE-LATCH BRIEFCASE-HANDLE>
<SET L <LOC ,BRIEFCASE>>)>
<COND (<OR <AND ,P-DOLLAR-FLAG <DOBJ? INTNUM>>
<DOBJ? GLOBAL-MONEY DOLLARS>>
<COND (<AND <EQUAL? ,PRSI <> ,POCKET>
<L? 0 <GETP ,PLAYER ,P?SOUTH>>>
<TELL-FLASHING-CASH>)>)
(<AND <DOBJ? FOOD-GLOBAL>
<EQUAL? ,HERE ,GALLEY ,CAFE>>
<YOU-CANT>)
(<DOBJ? PICTURE-GLOBAL>
<MORE-SPECIFIC>)
(<DOBJ? TRAIN>
<RFALSE>)
(<IN? ,PRSO ,GLOBAL-OBJECTS>
<NOT-HERE ,PRSO>)
(<EQUAL? .L ,WINNER ;,POCKET>
<SETG CLOCK-WAIT T>
<TELL "(You already have it!)" CR>)
(<IN? ,WINNER ,PRSO>
<TELL "You're in it, nitwit!" CR>)
(<AND .L
<FSET? .L ,CONTBIT>
<NOT <FSET? .L ,OPENBIT>>>
<TOO-BAD-BUT .L "closed">
<RTRUE>)
(,PRSI
<COND (<EQUAL? ,PRSI ,POCKET .L>
<SETG PRSI <>>
<RFALSE>)
(<AND <NOT <FSET? ,PRSI ,SURFACEBIT>>
<NOT <FSET? ,PRSI ,OPENBIT>>
<ZERO? <GETP ,PRSI ,P?CHARACTER>>
;<NOT <FSET? ,PRSI ,PERSONBIT>>>
<TOO-BAD-BUT ,PRSI "closed">
<RTRUE>)
(<NOT <==? ,PRSI .L>>
<COND (<NOT <FSET? ,PRSI ,PERSONBIT>>
<TELL CHE ,PRSO is " not in that!" CR>)
(T
<TELL
CHE ,PRSI do "n't have" HIM ,PRSO "!" CR>)>)>)
(T <PRE-TAKE-WITH>)>>
<ROUTINE PRE-TAKE-WITH ("AUX" X)
<COND (<DOBJ? YOU>
<RFALSE>)
(<DOBJ? PICTURE-GLOBAL>
<COND (<NOT-HOLDING? ,CAMERA>
<RTRUE>)
(T
<PERFORM ,V?PHOTO ,PRSI>
<RTRUE>)>)
(<AND <DOBJ? FOOD-GLOBAL>
<EQUAL? ,HERE ,GALLEY ,CAFE>>
<YOU-CANT>)
(<AND <EQUAL? ,HERE ,CAFE>
<NOT <IN? ,PRSO ,ROOMS>>
<NOT <FSET? ,PRSO ,PERSONBIT>>
<G? <GETP ,PRSO ,P?NORTH> 0>>
<TELL
CTHE ,WAITRESS " makes a gesture, asking for some money." CR>)
(<EQUAL? <META-LOC ,PRSO> ,GLOBAL-OBJECTS>
<COND (<AND <NOT <HELD? ,PRSO>>
<NOT <FSET? ,PRSO ,PERSONBIT>>>
<NOT-HERE ,PRSO>)>)
(<IN? ,PRSO ,WINNER>
<ALREADY ,PLAYER "holding it">)
(<AND <FSET? <LOC ,PRSO> ,CONTBIT>
<NOT <FSET? <LOC ,PRSO> ,OPENBIT>>>
<YOU-CANT "reach">)
(<==? ,PRSO <LOC ,WINNER>>
<TELL "You're in it, nitwit!" CR>)>>
<ROUTINE V-TAKE ()
<COND (<==? <ITAKE> T>
<COND (<DOBJ? KILLED-PERSON>
<TELL
"It's not easy, but you manage to throw" HIM ,PRSO " over your shoulder." CR>)
(T <TELL
CHE ,WINNER is " now holding" HIM ,PRSO "." CR>)>)>>
<ROUTINE V-TAKE-OFF ()
<COND (<FSET? ,PRSO ,WORNBIT>
<FCLEAR ,PRSO ,WORNBIT>
<TELL
"Okay," HE ,WINNER is " no longer wearing" HIM ,PRSO "." CR>)
(T
<TELL "You aren't wearing that!" 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 (<==? <LOC ,PRSO> ,WINNER>
<TELL
"You don't need to take" HIM ,PRSO " out to use" HIM ,PRSO "." CR>)
(<==? <LOC ,PRSO> ,POCKET>
<MOVE ,PRSO ,WINNER>
;<HE-SHE-IT ,WINNER T "is">
<TELL CHE ,WINNER is " now holding" HIM ,PRSO "." CR>)
(<DOBJ? ROOMS HERE GLOBAL-HERE ;GLOBAL-WATER>
<DO-WALK ,P?OUT>
<RTRUE>)
(<NOT <==? <LOC ,WINNER> ,PRSO>>
<TELL "You're not in" HIM ,PRSO "!" CR>
<RFATAL>)
(T
<OWN-FEET>)>>
<ROUTINE OWN-FEET ()
<MOVE ,WINNER ,HERE>
<TELL "You're on your own feet again." CR>>
<ROUTINE V-HOLD-UP ()
<COND (<DOBJ? ROOMS>
<PERFORM ,V?STAND>
<RTRUE>)
(T <TELL "That doesn't seem to help at all." CR>)>>
<ROUTINE V-TELL ("AUX" P)
<COND (<==? ,PRSO ,PLAYER>
<COND (<NOT <==? ,WINNER ,PLAYER>>
<SET P ,WINNER>
;<SETG L-WINNER ,WINNER>
<SETG WINNER ,PLAYER>
<PERFORM ,V?ASK .P>
<RTRUE>)
(,QCONTEXT
<SETG QCONTEXT <>>
<COND (,P-CONT
;<SETG L-WINNER ,WINNER>
<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>
<SETG QCONTEXT-ROOM ,HERE>
<COND (,P-CONT
<SETG CLOCK-WAIT T>
;<SETG L-WINNER ,WINNER>
<SETG WINNER ,PRSO>)
(T
<TELL CHE ,PRSO is " listening." 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 (<AND <QCONTEXT-GOOD?>
<DOBJ? PLAYER>>
<PERFORM ,V?ASK-ABOUT ,QCONTEXT ,PRSI>
<RTRUE>)
(<AND <DOBJ? PLAYER>
<SET P <FIND-FLAG-HERE-NOT ,PERSONBIT ,MUNGBIT ,WINNER>>
<NOT <FSET? .P ,INVISIBLE>>>
<TELL ,I-ASSUME " ask" THE .P ".)" CR>
<PERFORM ,V?ASK-ABOUT .P ,PRSI>
<RTRUE>)
(T <PRE-ASK-ABOUT>)>>
<ROUTINE V-TELL-ABOUT ("AUX" P)
<COND (<GETP ,PRSI ,P?TEXT> <TELL <GETP ,PRSI ,P?TEXT> CR>)
(<DOBJ? PLAYER> <ARENT-TALKING>)
(T <PERFORM ,V?ASK-ABOUT ,PRSO ,PRSI> <RTRUE>)>>
<ROUTINE PRE-TALK-ABOUT ("AUX" P)
<COND (<NOT <==? ,WINNER ,PLAYER>>
<PERFORM ,V?TELL-ABOUT ,PLAYER ,PRSO>
<RTRUE>)
(<QCONTEXT-GOOD?>
<PERFORM ,V?ASK-ABOUT ,QCONTEXT ,PRSO>
<RTRUE>)
(<SET P <FIND-FLAG-HERE-NOT ,PERSONBIT ,MUNGBIT ,WINNER>>
<TELL ,I-ASSUME " to" THE .P ".)" CR>
<PERFORM ,V?ASK-ABOUT .P ,PRSO>
<RTRUE>)>>
<ROUTINE V-TALK-ABOUT () <ARENT-TALKING>>
<ROUTINE V-THANKS ("AUX" P)
<COND (<AND ,PRSO
<FSET? ,PRSO ,PERSONBIT>
<NOT <FSET? ,PRSO ,MUNGBIT>>>
<THANKS-ACT ,PRSO>)
(<QCONTEXT-GOOD?>
<THANKS-ACT ,QCONTEXT>)
(<SET P <FIND-FLAG-HERE-NOT ,PERSONBIT ,MUNGBIT ,WINNER>>
<THANKS-ACT .P>)
(T <TELL "You're more than welcome." CR>)>>
<ROUTINE THANKS-ACT (P)
<TELL CHE .P acknowledge " your thanks." CR>>
<ROUTINE V-THROW () <COND (<IDROP> <TELL "Thrown." CR>)>>
<ROUTINE V-THROW-AT ()
<COND (<NOT <IDROP>>
<RTRUE>)>
<COND (<AND <FSET? ,PRSI ,PERSONBIT>
<NOT <FSET? ,PRSO ,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)
<COND (<IOBJ? TRAIN ROOF>
<COND (<NOT ,ON-TRAIN>
<HAR-HAR>)
(<SET X <WINDOW-IN? ,HERE>>
<PERFORM ,V?THROW-THROUGH ,PRSO .X>
<RTRUE>)
(<NOT <==? ,HERE ,ROOF>>
<TELL "You look for a window but find none." CR>)
(<NOT ,TRAIN-MOVING>
<MOVE ,PRSO <GET ,STATION-ROOMS ,HERE>>
<TELL CTHE ,PRSO " drops out of sight." CR>)
(T
<MOVE ,PRSO ,LIMBO-FWD>
<TELL CTHE ,PRSO " is gone with the wind." CR>)>)>>
<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 that." 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 () <PRODUCE-GIBBERISH>>
<ROUTINE V-TIME ()
<STATUS-LINE>
<TELL "The time is now ">
<TIME-PRINT ,PRESENT-TIME>
<TELL ".">
<CRLF>>
<ROUTINE TIME-PRINT (NUM "AUX" HR)
<SET HR <MOD </ .NUM 60> 24>>
<COND (<L? .HR 10>
<TELL "0">)>
<PRINTN .HR>
<TELL "." ;":">
<COND (<L? <SET HR <MOD .NUM 60>> 10>
<TELL "0">)>
<TELL N .HR>>
<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-TURN-AROUND ()
<COND (<NOT ,PLAYER-NOT-FACING>
<TELL "It's not clear which way you're facing." CR>)
(T
<SETG P-WALK-DIR ,PLAYER-NOT-FACING>
<PERFORM ,V?FACE ,PLAYER-NOT-FACING>
<RTRUE>)>>
<ROUTINE V-LAMP-OFF ()
<COND (<FSET? ,PRSO ,PERSONBIT>
<TELL "Your vulgar ways would turn anyone off." CR>)
(T ;<NOT <FSET? ,PRSO ,ON?BIT>>
<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 ,ON?BIT>
<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 <==? <GETP ,PRSO ,P?CAPACITY> 0>>>>
<COND (<AND <NOT <ZMEMQ ,HERE ,CAR-ROOMS-COMPS>>
<NOT <ZMEMQ ,HERE ,CAR-ROOMS-REST>>>
<TELL "You can't unlock" HIM ,PRSO " from here." CR>)
(<NOT <FSET? ,PRSO ,LOCKED>>
<ALREADY ,PRSO "unlocked">)
(T
<COND (<FSET? ,PRSO ,OPENBIT>
<FCLEAR ,PRSO ,OPENBIT>
<TELL "(You close" HIM ,PRSO " first.)" CR>)>
<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>>
<ROUTINE V-USE-AGAINST () <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 0>
<ROUTINE HAS-ARRIVED (OBJ)
<NOT-IT .OBJ>
<TELL CTHE .OBJ ", for wh"
<COND (<FSET? .OBJ ,PERSONBIT> "om") (T "ich")>
" you're waiting," V .OBJ has " arrived." CR>>
<ROUTINE V-WAIT ("OPTIONAL" (NUM -1) (WHO <>) (INT <>)
"AUX" VAL HR (RESULT T))
<COND (<==? -1 .NUM>
<SET NUM 10>
<TELL ,I-ASSUME " wait 10 minutes.)" CR>)>
<SET HR ,HERE>
<SETG WHO-WAIT 0>
<COND (<NOT .INT> <TELL "Time passes..." CR>)>
<REPEAT ()
<COND (<L? <SET NUM <- .NUM 1>> 0> <RETURN>)
(<SET VAL <CLOCKER>>
<COND (<OR <==? .VAL ,M-FATAL>
<NOT <==? .HR ,HERE>>>
<SET RESULT ,M-FATAL>
<RETURN>)
(<AND .WHO
<OR <==? ,HERE <META-LOC .WHO>>
<==? ,SCENERY-OBJ .WHO>
<AND <==? .WHO ,TRAIN> ,IN-STATION>>>
<HAS-ARRIVED .WHO>
<RETURN>)
;(<0? .NUM> <RETURN>)
(T
<SETG WHO-WAIT <+ ,WHO-WAIT 1>>
;<COND (<NOT <==? <BAND <GETB 0 1> 16> 0>>
<TELL "(">
<TIME-PRINT ,PRESENT-TIME>
<TELL ") ">)>
<COND (<IN? ,PLAYER ,UNCONSCIOUS>
<RETURN>)>
<TELL "Do you want to ">
<COND (.INT
<TELL "continue what you were doing?">)
(T <TELL "keep waiting?">)>
<COND (<NOT <YES?>> <RETURN>)
(T <STATUS-LINE>)>)>)
(<AND .WHO <IN? .WHO ,HERE>>
<HAS-ARRIVED .WHO>
<RETURN>)
(<AND .WHO <G? <SETG WHO-WAIT <+ ,WHO-WAIT 1>> 30>>
<TELL
CTHE .WHO " still" V .WHO has "n't arrived. Do you want to keep waiting?">
<COND (<NOT <YES?>> <RETURN>)>
<SETG WHO-WAIT 0>
<STATUS-LINE>)
(T <STATUS-LINE>)>>
<SETG CLOCK-WAIT T>
<COND (<NOT .INT> <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 <V-WAIT ,P-NUMBER>)>)
(<DOBJ? ROOMS TURN GLOBAL-HERE>
<V-WAIT>
<RTRUE>)
(<DOBJ? PLAYER>
<ALREADY ,PLAYER "here">)
(<SET WHO <GETP ,PRSO ,P?CHARACTER>> ;<FSET? ,PRSO ,PERSONBIT>
<SET WHO <GET ,CHARACTER-TABLE .WHO>>
<COND (<==? <META-LOC .WHO> ,HERE>
<ALREADY .WHO "here">)
(T <V-WAIT 10000 .WHO>)>)
(<AND <ZMEMZ ,PRSO ,TRAIN-TABLE> ,ON-TRAIN>
<COND (<EQUAL? ,PRSO ,SCENERY-OBJ> <ALREADY ,PRSO "here">)
(T <V-WAIT 10000 ,PRSO>)>)
(<DOBJ? TRAIN>
<COND (,ON-TRAIN <HAR-HAR>)
(,IN-STATION <ALREADY ,PRSO "here">)
(T <V-WAIT 10000 ,PRSO>)>)
(T <TELL "Not a good idea. You might wait forever." CR>)>>
<ROUTINE V-WAIT-UNTIL ()
<COND (<AND <NOT <==? -1 ,P-NUMBER>> <EQUAL? ,PRSO ,TURN ,INTNUM>>
<COND (<ZERO? ,P-CENT-FLAG>
<COND (<L? ,P-NUMBER 24>
<SETG P-NUMBER <* ,P-NUMBER 60>>)
(<G? ,P-NUMBER 99>
<SETG P-NUMBER <+ <MOD ,P-NUMBER 100>
<*</ ,P-NUMBER 100> 60>>>)>
<TELL ,I-ASSUME " ">
<TIME-PRINT ,P-NUMBER>
<TELL ".)" CR>)>
<COND (<G? ,P-NUMBER ,PRESENT-TIME>
<V-WAIT <- ,P-NUMBER ,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 PRSO ,WINNER>)>
<COND (<AND <FSET? ,PRSO ,PERSONBIT> <NOT <FSET? ,PRSO ,MUNGBIT>>>
;<HE-SHE-IT ,PRSO T "is">
<TELL CHE ,PRSO is " wide awake, or haven't you noticed?" CR>)
(T
<TOO-BAD-BUT ,PRSO "not asleep">)>>
<ROUTINE DO-WALK (DIR ;"OPTIONAL" ;(V 0) "AUX" P)
<COND ;(<ZERO? .V> <SET V ,V?WALK>)
(<SET P <COMPASS-EQV ,HERE .DIR>>
;<SETG PLAYER-NOT-FACING-OLD ,PLAYER-NOT-FACING>
<SETG PLAYER-NOT-FACING <OPP-DIR .P>>)>
<SETG P-WALK-DIR .DIR>
<PERFORM ,V?WALK ;.V .DIR>>
<ROUTINE V-WALK ("AUX" PT PTS STR RM)
<COND ;(<DOBJ? LEFT RIGHT>
<PERFORM ,V?TURN ,PRSO>
<RTRUE>)
(<NOT ,P-WALK-DIR>
<V-WALK-AROUND>
<RFATAL>)
;(<NOT ,PRSO>
;<COND (,DEBUG <TELL "[1] ">)>
<YOU-CANT "go">
<RTRUE>)>
;<COND (,DEBUG <TELL "[PRSO=" N ,PRSO "] ">)>
;<COND (<SET PT <COMPASS-EQV ,HERE ,PRSO>>
;<SETG PLAYER-NOT-FACING-OLD ,PLAYER-NOT-FACING>
<SETG PLAYER-NOT-FACING <OPP-DIR .PT>>)>
<COND (<SET PT <GETPT <LOC ,WINNER> ,PRSO>>
;<COND (,DEBUG <TELL "[GETPT OK] ">)>
<COND (<==? <SET PTS <PTSIZE .PT>> ,UEXIT>
<SET RM <GET-REXIT-ROOM .PT>>
<COND (<GOTO .RM> <OKAY>)>
<RTRUE>)
(<==? .PTS ,NEXIT>
<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
;<COND (,DEBUG <TELL "[2] ">)>
<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>)
(T
;<COND (,DEBUG <TELL "[4] ">)>
<YOU-CANT "go">
<RFATAL>)>>
<ROUTINE WALK-THRU-DOOR? (PT "AUX" OBJ RM)
<SET OBJ <GET-DOOR-OBJ .PT>>
<SET RM <GET-REXIT-ROOM .PT>>
<COND (<AND ,CUSTOMS-SWEEP
<FSET? ,PASSPORT ,LOCKED>
,ON-TRAIN
<NOT <ZMEMQ .RM ,CAR-ROOMS-VESTIB>>
<NOT <ZMEMQ .RM ,CAR-ROOMS-CORRID>>>
<COND (<VISIBLE? ,CONDUCTOR T>
<TELL
CHE ,CONDUCTOR " gestures for you to leave the train.">)
(T <TELL
"You should leave the train now to pass customs.">)>
<CRLF>
<RFALSE>)
(<FSET? .OBJ ,OPENBIT> <RTRUE>)>
<COND (<==? .RM ,GAS-CAR-RM>
<COND (<==? ,CAR-HERE ,GAS-CAR>
<FSET .OBJ ,LOCKED>)
(T <FCLEAR .OBJ ,LOCKED>)>)
(<ZMEMQ .RM ,CAR-ROOMS-REST>
<COND (<OCCUPIED? .RM ,CAR-HERE>
<FSET .OBJ ,LOCKED>)
(T <FCLEAR .OBJ ,LOCKED>)>)>
<COND (<NOT <FSET? .OBJ ,LOCKED>>
<COND (<NOT <VERB? WALK-TO>>
<TELL
"(You open" HIM .OBJ " and close it again.)" ;" for a moment.)" CR>)>
<RTRUE>)
(<OR <ZMEMQ <LOC ,WINNER> ,CAR-ROOMS-REST>
<ZMEMQ <LOC ,WINNER> ,CAR-ROOMS-COMPS>>
<FCLEAR .OBJ ,LOCKED>
<COND (<NOT <VERB? WALK-TO>>
<TELL
"(You unlock and open" HIM .OBJ " and close it again.)" CR>)>
<RTRUE>)
(<SET RM <GET .PT ,DEXITSTR>>
<TELL .RM CR>
<RFALSE>)
(T
<TOO-BAD-BUT .OBJ "locked">
<RFALSE>)>>
<ROUTINE V-WALK-AROUND ()
<SETG CLOCK-WAIT T>
<TELL "(What " D ,INTDIR " do you want to go in?)" CR>
<RFATAL>>
<ROUTINE WHO-KNOWS? (OBJ)
<SETG CLOCK-WAIT T>
<TELL "(Who knows where">
;<HE-SHE-IT .OBJ <> "is">
<TELL HE .OBJ is " now?)" CR>>
<ROUTINE V-WALK-TO ("AUX" O L)
<SET O ,PRSO>
<COND (<AND <SET L <GETP .O ,P?CHARACTER>> ;<FSET? .O ,PERSONBIT>
<FSET? .O ,SEENBIT>
<IN? .O ,GLOBAL-OBJECTS>>
<SET O <GET ,CHARACTER-TABLE .L>>)>
<SET L <META-LOC .O>>
;<COND (,DEBUG <TELL "[WALK-TO: " D .O "/" D .L "]" CR>)>
<COND (<AND <EQUAL? ,HERE <LOC ,WINNER>>
<OR <EQUAL? .L ,HERE>
<AND <EQUAL? .L ,LOCAL-GLOBALS> <GLOBAL-IN? .O ,HERE>>>>
<SETG CLOCK-WAIT T>
<TELL "(">
;<HE-SHE-IT ,WINNER T "do">
<TELL CHE ,WINNER do "n't need to walk around within a place.)" CR>)
(<EQUAL? .L ,LOCAL-GLOBALS>
<COND (<DOBJ? SCENERY-OBJ>
<TOO-BAD-BUT ,PRSO "too far away">)
(T <MORE-SPECIFIC>)>)
(<DOBJ? INTDIR>
<V-WALK-AROUND>)
(<ZMEMQ .O ,STATIONS>
<COND (<==? .O ,SCENERY-OBJ ;,STATION-NAME>
<SETG CLOCK-WAIT T>
<TELL "(You're already in " D .O "!)" CR>)
(<ZMEMQ .O ,TRAIN-TABLE>
<TELL "The train will take you there if you're patient." CR>)
(T
<TELL "You'll have to take a ">
<COND (<NOT ,IN-STATION> <TELL "different ">)>
<TELL "train." CR>)>)
(<OR <AND <FSET? .O ,PERSONBIT>
<FSET? .O ,NDESCBIT>>
<AND <NOT <IN? .L ;.O ,ROOMS>>
<NOT <FSET? .O ,TOUCHBIT>>>>
<WHO-KNOWS? .O>
<RTRUE>)
(<AND <EQUAL? .L ,ROOF>
<EQUAL? ,HERE ,VESTIBULE-REAR-DINER
,VESTIBULE-REAR-FANCY ,VESTIBULE-REAR>>
<DO-WALK ,P?UP>
<RTRUE>)
(<FAR-AWAY? .L>
<SETG CLOCK-WAIT T>
<TELL "(" CHE ,WINNER " can't get there from here">
<COND (<NOT <EQUAL? .L ,GLOBAL-OBJECTS>>
<TELL ", at least not directly">)>
<TELL ".)" CR>)
(T
;<PUT <GET ,GOAL-TABLES ,PLAYER-C> ,GOAL-ENABLE 1>
<ESTABLISH-GOAL ,PLAYER .L>
<SETG LAST-PLAYER-LOC ,HERE>
<FSET ,PLAYER ,INVISIBLE>
<REPEAT () <COND (<FOLLOW-GOAL ,PLAYER> <RETURN>)>>
<FCLEAR ,PLAYER ,INVISIBLE>
<COND (<NOT <==? ,LAST-PLAYER-LOC ,HERE>>
<SETG LIT T>
<APPLY <GETP ,HERE ,P?ACTION> ,M-ENTER>
<V-FIRST-LOOK>
<APPLY <GETP ,HERE ,P?ACTION> ,M-FLASH>)>
<RTRUE>)>>
<ROUTINE V-WALK-UNDER () <YOU-CANT "go under">>
<ROUTINE V-RUN-OVER () <TELL "That doesn't make much sense." CR>>
<ROUTINE V-WEAR ()
<COND (<NOT <FSET? ,PRSO ,WEARBIT>>
<TELL "You can't wear" HIM ,PRSO "." CR>)
(<FSET? ,PRSO ,WORNBIT>
<ALREADY ,PRSO "being worn">)
(T
<MOVE ,PRSO ,PLAYER>
<FSET ,PRSO ,WORNBIT>
<TELL "You are now wearing" HIM ,PRSO "." CR>)>>
<ROUTINE V-WHAT ("AUX" P)
<COND (<DOBJ? PLAYER>
<TELL "You're the ">
<COND (<SPY?> <TELL "good spy!" CR>)
(T <TELL "innocent traveler!" CR>)>)
(<OR <AND <QCONTEXT-GOOD?>
<FSET? <SET P ,QCONTEXT> ,PERSONBIT>
<NOT <FSET? .P ,MUNGBIT>>>
<SET P <FIND-FLAG-HERE-NOT ,PERSONBIT ,MUNGBIT ,WINNER>>>
<TELL ,I-ASSUME " ask" THE .P ".)" CR>
<PERFORM ,V?ASK-ABOUT .P ,PRSO>)
(<FSET? ,PRSO ,PERSONBIT>
<TELL <GETP ,PRSO ,P?TEXT> CR>)
(T <WONT-HELP-TO-TALK-TO ,PLAYER>)>>
<ROUTINE V-WIND () <YOU-CANT>>
<ROUTINE V-YELL () <V-YES>>
<ROUTINE V-YELL-FOR () <V-YES>>
<ROUTINE V-YES ("OPTIONAL" (NO? <>))
<COND (<AND <QCONTEXT-GOOD?> <==? ,WINNER ,PLAYER>>
;<SETG L-WINNER ,WINNER>
<SETG WINNER ,QCONTEXT>
<COND (.NO? <PERFORM ,V?NO>) (T <PERFORM ,V?YES>)>
<RTRUE>)
(T <ARENT-TALKING>)>>
<ROUTINE V-NO () <V-YES T>>
<ROUTINE FINISH ("OPTIONAL" (REPEATING <>) VAL)
<COND (,DEBUG <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?|
">
<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? DROP GIVE POUR PUT PUT-IN 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? ("OPTIONAL" (V 0))
<COND (<0? .V> <SET V ,PRSA>)>
<COND (<EQUAL? .V,V?ASK-ABOUT ,V?ASK-CONTEXT-ABOUT ,V?ASK-CONTEXT-FOR>
<RTRUE>)
(<EQUAL? .V ,V?ASK-FOR ,V?BUY ,V?DISEMBARK>
<RTRUE>)
(<EQUAL? .V ,V?FIND ,V?LEAVE ,V?LOOK-UP>
<RTRUE>)
(<EQUAL? .V ,V?MAKE ,V?SEARCH ,V?SEARCH-FOR>
<RTRUE>)
(<EQUAL? .V ,V?TALK-ABOUT ,V?TELL-ABOUT ,V?WAIT-FOR>
<RTRUE>)
(<EQUAL? .V ,V?WAIT-UNTIL>
<RTRUE>)
(<EQUAL? .V ,V?WALK-TO ,V?WHAT ,V?$WHERE>
<RTRUE>)
(<EQUAL? .V ,V?$FCLEAR ,V?$FSET ,V?$QFSET>
<RTRUE>)
(T <RFALSE>)>>