starcross/verbs.zil

1400 lines
37 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

"VERBS for
Interlogic SF Game
(c) Copyright 1981,1982 Infocom, Inc. All Rights Reserved
"
"SUBTITLE DESCRIBE THE UNIVERSE"
"SUBTITLE SETTINGS FOR VARIOUS LEVELS OF DESCRIPTION"
<GLOBAL VERBOSE <>>
<GLOBAL SUPER-BRIEF <>>
<GDECL (VERBOSE SUPER-BRIEF) <OR ATOM FALSE>>
<ROUTINE V-VERBOSE ()
<SETG VERBOSE T>
<SETG SUPER-BRIEF <>>
<TELL "Maximum verbosity." CR>>
<ROUTINE V-BRIEF ()
<SETG VERBOSE <>>
<SETG SUPER-BRIEF <>>
<TELL "Brief descriptions." CR>>
<ROUTINE V-SUPER-BRIEF ()
<SETG SUPER-BRIEF T>
<TELL "Super-brief descriptions." CR>>
\
"SUBTITLE DESCRIBERS"
<ROUTINE V-LOOK ()
<COND (<DESCRIBE-ROOM T>
<DESCRIBE-OBJECTS T>)>>
<ROUTINE V-FIRST-LOOK ()
<COND (<DESCRIBE-ROOM>
<COND (<NOT ,SUPER-BRIEF> <DESCRIBE-OBJECTS>)>)>>
<ROUTINE V-EXAMINE ()
<COND (<GETP ,PRSO ,P?TEXT>
<TELL <GETP ,PRSO ,P?TEXT> CR>)
(<OR <FSET? ,PRSO ,CONTBIT>
<FSET? ,PRSO ,DOORBIT>>
<V-LOOK-INSIDE>)
(ELSE
<TELL "I see nothing special about the "
D ,PRSO "." CR>)>>
<GLOBAL LIT <>>
<ROUTINE DESCRIBE-ROOM ("OPTIONAL" (LOOK? <>) "AUX" V? STR AV)
<SET V? <OR .LOOK? ,VERBOSE>>
<COND (<NOT ,LIT>
<TELL
"It is pitch black. You are likely to be eaten by a grue." CR>
<RETURN <>>)>
<COND (<NOT <FSET? ,HERE ,TOUCHBIT>>
<FSET ,HERE ,TOUCHBIT>
<SET V? T>)>
<COND (<IN? ,HERE ,ROOMS> <TELL D ,HERE CR>)>
<COND (<OR .LOOK? <NOT ,SUPER-BRIEF>>
<SET AV <LOC ,WINNER>>
<COND (<FSET? .AV ,VEHBIT>
<TELL "(You are in the " D .AV ".)" CR>)>
<COND (<AND .V? <APPLY <GETP ,HERE ,P?ACTION> ,M-LOOK>>
<RTRUE>)
(<AND .V? <SET STR <GETP ,HERE ,P?LDESC>>>
<TELL .STR CR>)
(T <APPLY <GETP ,HERE ,P?ACTION> ,M-FLASH>)>
<COND (<AND <NOT <==? ,HERE .AV>> <FSET .AV ,VEHBIT>>
<APPLY <GETP .AV ,P?ACTION> ,M-LOOK>)>)>
<COND (<AND <NOT <FSET? ,HERE ,ONBIT>> ,ALWAYS-LIT>
<TELL
"The room is lit by an emergency lighting system." CR>)>
T>
<ROUTINE DESCRIBE-OBJECTS ("OPTIONAL" (V? <>))
<COND (,LIT
<COND (<FIRST? ,HERE>
<PRINT-CONT ,HERE <SET V? <OR .V? ,VERBOSE>> -1>)>)
(ELSE
<TELL "I can't see anything in the dark." CR>)>>
"DESCRIBE-OBJECT -- takes object and flag. if flag is true will print a
long description (fdesc or ldesc), otherwise will print short."
<ROUTINE DESCRIBE-OBJECT (OBJ V? LEVEL "AUX" (STR <>) AV)
<COND (<AND <0? .LEVEL>
<APPLY <GETP .OBJ ,P?DESCFCN> ,M-OBJDESC>>
<RTRUE>)
(<AND <0? .LEVEL>
<OR <AND <NOT <FSET? .OBJ ,TOUCHBIT>>
<SET STR <GETP .OBJ ,P?FDESC>>>
<SET STR <GETP .OBJ ,P?LDESC>>>>
<TELL .STR>)
(<0? .LEVEL>
<TELL "There is a " D .OBJ " here.">)
(ELSE
<TELL <GET ,INDENTS .LEVEL>>
<TELL "A " D .OBJ>
<COND (<FSET? .OBJ ,WEARBIT> <TELL " (being worn)">)
(<==? .OBJ ,SAFETY-LINE>
<COND (<AND ,THIS-END ,THAT-END>
<TELL " (connecting the suit and a hook)">)
(,THIS-END <TELL " (tied to the suit)">)
(,THAT-END <TELL " (tied to a hook)">)>)>)>
<COND (<AND <0? .LEVEL>
<SET AV <LOC ,WINNER>>
<FSET? .AV ,VEHBIT>>
<TELL " (outside the " D .AV ")">)>
<CRLF>
<COND (<AND <SEE-INSIDE? .OBJ> <FIRST? .OBJ>>
<PRINT-CONT .OBJ .V? .LEVEL>)>>
<ROUTINE PRINT-CONT (OBJ "OPTIONAL" (V? <>) (LEVEL 0)
"AUX" Y 1ST? AV STR (PV? <>) (INV? <>))
#DECL ((OBJ) OBJECT (LEVEL) FIX)
<COND (<NOT <SET Y <FIRST? .OBJ>>> <RTRUE>)>
<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>)
(ELSE
<REPEAT ()
<COND (<NOT .Y> <RETURN <NOT .1ST?>>)
(<==? .Y .AV> <SET PV? T>)
(<==? .Y ,WINNER>)
(<AND <NOT <FSET? .Y ,INVISIBLE>>
<NOT <FSET? .Y ,TOUCHBIT>>
<SET STR <GETP .Y ,P?FDESC>>>
<COND (<NOT <FSET? .Y ,NDESCBIT>>
<TELL .STR CR>)>
<COND (<AND <SEE-INSIDE? .Y>
<NOT <GETP <LOC .Y> ,P?DESCFCN>>
<FIRST? .Y>>
<PRINT-CONT .Y .V? 0>)>)>
<SET Y <NEXT? .Y>>>)>
<SET Y <FIRST? .OBJ>>
<REPEAT ()
<COND (<NOT .Y>
<COND (<AND .PV? .AV <FIRST? .AV>>
<PRINT-CONT .AV .V? .LEVEL>)>
<RETURN <NOT .1ST?>>)
(<EQUAL? .Y .AV ,ADVENTURER>)
(<AND <NOT <FSET? .Y ,INVISIBLE>>
<OR .INV?
<FSET? .Y ,TOUCHBIT>
<NOT <GETP .Y ,P?FDESC>>>>
<COND (<NOT <FSET? .Y ,NDESCBIT>>
<COND (.1ST?
<COND (<FIRSTER .OBJ .LEVEL>
<COND (<L? .LEVEL 0>
<SET LEVEL 0>)>)>
<SET LEVEL <+ 1 .LEVEL>>
<SET 1ST? <>>)>
<DESCRIBE-OBJECT .Y .V? .LEVEL>)
(<AND <FIRST? .Y> <SEE-INSIDE? .Y>>
<PRINT-CONT .Y .V? .LEVEL>)>)>
<SET Y <NEXT? .Y>>>>
<ROUTINE FIRSTER (OBJ LEVEL)
<COND (<==? .OBJ ,WINNER>
<TELL "You are carrying:" CR>)
(<NOT <IN? .OBJ ,ROOMS>>
<COND (<G? .LEVEL 0>
<TELL <GET ,INDENTS .LEVEL>>)>
<COND (<==? .OBJ ,TRASH-BIN>
<TELL
"Among the trash near the top of the bin you see:" CR>)
(<FSET? .OBJ ,SURFACEBIT>
<TELL
"Sitting on the " D .OBJ " is:" CR>)
(ELSE
<TELL
"The " D .OBJ " contains:" CR>)>)
(<FSET? .OBJ ,RMUNGBIT>
<TELL
"Floating nearby is: " CR>)>>
\
"SUBTITLE SCORING"
<GLOBAL MOVES 0>
<GLOBAL SCORE 0>
<GLOBAL WON-FLAG <>>
<ROUTINE SCORE-UPD (NUM)
#DECL ((NUM) FIX)
<SETG SCORE <+ ,SCORE .NUM>>
T>
<ROUTINE SCORE-OBJ (OBJ)
#DECL ((OBJ) OBJECT (TEMP) FIX)
<COND (<G? <GETP .OBJ ,P?VALUE> 0>
<FSET .OBJ ,TOUCHBIT>
<SCORE-UPD <GETP .OBJ ,P?VALUE>>
<PUTP .OBJ ,P?VALUE 0>)>>
<GLOBAL SCORE-MAX 400>
<ROUTINE V-SCORE ("OPTIONAL" (ASK? T))
#DECL ((ASK?) <OR ATOM FALSE>)
<TELL "Your score ">
<COND (.ASK? <TELL "would be ">) (ELSE <TELL "is ">)>
<TELL N ,SCORE>
<TELL " (total of ">
<TELL N ,SCORE-MAX>
<TELL " points), in ">
<TELL N ,MOVES>
<COND (<1? ,MOVES> <TELL " move.">) (ELSE <TELL " moves.">)>
<CRLF>
<TELL "This score gives you the rank of ">
<COND (,WON-FLAG <TELL "Galactic Overlord">)
(<G? ,SCORE 360> <TELL "Cluster Admiral">)
(<G? ,SCORE 320> <TELL "System Captain">)
(<G? ,SCORE 240> <TELL "Planetary Commodore">)
(<G? ,SCORE 160> <TELL "Lieutenant">)
(<G? ,SCORE 80> <TELL "Ensign">)
(<G? ,SCORE 40> <TELL "Space Cadet">)
(T <TELL "Beginner">)>
<TELL "." CR>
,SCORE>
<ROUTINE FINISH ()
<V-SCORE>
<QUIT>>
<ROUTINE V-QUIT ("OPTIONAL" (ASK? T) "AUX" SCOR)
#DECL ((ASK?) <OR ATOM <PRIMTYPE LIST>> (SCOR) FIX)
<V-SCORE>
<COND (<OR <AND .ASK?
<TELL
"Do you wish to leave the game? (Y is affirmative): ">
<YES?>>
<NOT .ASK?>>
<QUIT>)
(ELSE <TELL "Ok." CR>)>>
<ROUTINE YES? ()
<PRINTI ">">
<READ ,P-INBUF ,P-LEXV>
<COND (<EQUAL? <GET ,P-LEXV 1> ,W?YES ,W?Y>
<RTRUE>)
(T
<RFALSE>)>>
<ROUTINE V-VERSION ("AUX" (CNT 17))
<TELL
"STARCROSS|
Infocom interactive fiction - a science-fiction story|
Copyright (c) 1982 by Infocom, Inc. All rights reserved.|
STARCROSS is a registered 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>>)>>
<CRLF>>
;<ROUTINE V-AGAIN ("AUX" OBJ)
<COND (<==? ,L-PRSA ,V?WALK>
<DO-WALK ,L-PRSO>)
(T
<SET OBJ
<COND (<AND ,L-PRSO <NOT <LOC ,L-PRSO>>>
,L-PRSO)
(<AND ,L-PRSI <NOT <LOC ,L-PRSI>>>
,L-PRSI)>>
<COND (.OBJ
<TELL "I can't see the " D .OBJ " anymore." CR>
<RFATAL>)
(T
<PERFORM ,L-PRSA ,L-PRSO ,L-PRSI>)>)>>
;"Hopefully improved AGAIN"
<ROUTINE V-AGAIN ("AUX" CONT LEXV INBUF V)
<SET LEXV <TABLE 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0>>
<SET INBUF <TABLE 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0>>
<COND (<0? ,P-LEN> <SET CONT <>>)
(T <SET CONT ,P-CONT>)>
<TABLE-COPY ,P-LEXV .LEXV 60 ;120>
<TABLE-COPY ,P-INBUF .INBUF 50 ;100>
<TABLE-COPY ,A-LEXV ,P-LEXV 60 ;120>
<TABLE-COPY ,A-INBUF ,P-INBUF 50 ;100>
<SETG P-CONT ,A-PTR>
<SETG NOT-AGAIN <>>
<SET V <MAIN-LOOP>>
<SETG NOT-AGAIN 1>
<SETG PRSA ,V?AGAIN>
<COND (<==? .V ,M-FATAL>
<SETG P-CONT <>>)
(T <SETG P-CONT .CONT>)>
<TABLE-COPY .LEXV ,P-LEXV 60 ;120>
<TABLE-COPY .INBUF ,P-INBUF 50 ;100>
<RETURN .V>>
\
"SUBTITLE DEATH AND TRANSFIGURATION"
<GLOBAL DEATHS 0>
<GLOBAL LUCKY 1>
<ROUTINE JIGS-UP (DESC "OPTIONAL" (PLAYER? <>))
<TELL .DESC CR>
<PROG ()
<SCORE-UPD -10>
<TELL "
| **** You have died ****
|
|">
<SETG DEATHS <+ ,DEATHS 1>>
<COND (<==? ,DEATHS 4>
<COND (,DOCKED?
<TELL
"The expressionless voice seems despairing. \"Four failures. They would not
be pleased. Such promising candidates, too. If only...\"
The voice trails off into background hiss. Nothing more happens, ever." CR>)
(ELSE
<TELL
"This time, you aren't given another chance." CR>)>
<FINISH>)
(<G? ,POISON-COUNT 3>
<TELL
"An expressionless voice seems to be trying to express outrage, but not
successfully. \"The candidate has not made the necessary repairs in time.
This is a disaster. All are now dead, and repairs are
not possible. They would not approve. This area will be marked, that is
certain.\" Everything fades to black, and silence reigns." CR>
<FINISH>)>
<RANDOMIZE-OBJECTS>
<COND (<FSET? ,RED-THREE ,TOUCHBIT>
<MOVE ,WINNER ,RED-THREE>)
(ELSE
<SETG IN-ARTIFACT? <>>
<FCLEAR ,AIRLOCK-OUTER ,OPENBIT>
<FCLEAR ,AIRLOCK-INNER ,OPENBIT>
<MOVE ,WINNER ,SPACESHIP-BRIDGE>
<MOVE ,SPACESUIT ,SPACESHIP-STORES>)>
<COND (,DOCKED?
<TELL
"You hear, if that is the right word, an expressionless voice. It seems
to be inside your head. \"This is not promising. The candidate does not
deserve another chance, but the instructions are explicit. There are not
even any more docking ports. They would be disappointed if they knew.\"
You wake to a brief glimpse of a pallet (on which you are lying) surrounded
by metallic threads. The whole apparatus begins to vibrate and you feel very
dizzy. As you lose consciousness, you realize that you can't see the rest of
your body. There is a feeling of dislocation, and then..." CR>)
(ELSE
<TELL
"You wake to find yourself alive, on board the \"Starcross.\" It appears
you have been given another chance." CR>)>
<SETG LIT T>
<FCLEAR ,SPACESUIT ,WEARBIT>
<SETG SUIT-ON? <>>
<SETG THIS-END <>>
<SETG THAT-END <>>
<SETG P-CONT <>>
<SETG COUNTDOWN <>>
<SETG R-VALUE 0>
<SETG PHI-VALUE 0>
<SETG THETA-VALUE 0>
<SETG LOST <>>
<SETG GIVE-UP <>>
<KILL-INTERRUPTS>
<RFATAL>>>
<ROUTINE RANDOMIZE-OBJECTS ("AUX" (R <>) F N L)
<SET N <FIRST? ,WINNER>>
<REPEAT ()
<SET F .N>
<COND (<NOT .F> <RETURN>)>
<SET N <NEXT? .F>>
<COND (<FSET? ,RED-THREE ,TOUCHBIT>
<COND (<FSET? .F ,KEYBIT> <MOVE .F ,HERE>)
(ELSE <MOVE .F ,RED-LOCK>)>)
(ELSE
<COND (<FSET? .F ,KEYBIT> <MOVE .F ,HERE>)
(ELSE
<MOVE .F ,SPACESHIP-STORES>)>)>>>
<ROUTINE KILL-INTERRUPTS ()
<DISABLE <INT I-BURN>>
<RTRUE>>
<ROUTINE V-RESTORE ()
<COND (<RESTORE>
<TELL "Ok." CR>
<V-FIRST-LOOK>)
(T
<TELL "Failed." CR>)>>
<ROUTINE V-SAVE ()
<COND (<SAVE>
<TELL "Ok." CR>)
(T
<TELL "Failed." CR>)>>
<ROUTINE V-RESTART ()
<V-SCORE T>
<TELL "Do you wish to restart? (Y is affirmative): ">
<COND (<YES?>
<TELL "Restarting." CR>
<RESTART>
<TELL "Failed." CR>)>>
<CONSTANT REXIT 0>
<CONSTANT UEXIT 1>
<CONSTANT NEXIT 2>
<CONSTANT FEXIT 3>
<CONSTANT CEXIT 4>
<CONSTANT DEXIT 5>
<CONSTANT NEXITSTR 0>
<CONSTANT FEXITFCN 0>
<CONSTANT CEXITFLAG 1>
<CONSTANT CEXITSTR 1>
<CONSTANT DEXITOBJ 1>
<CONSTANT DEXITSTR 1>
<ROUTINE V-WALK-AROUND ()
<TELL "Use directions for movement here." CR>>
<ROUTINE V-LAUNCH ()
<TELL "You can't launch that!" CR>>
<ROUTINE GO-NEXT (TBL "AUX" VAL)
#DECL ((TBL) TABLE (VAL) ANY)
<COND (<SET VAL <LKP ,HERE .TBL>>
<GOTO .VAL>)>>
<ROUTINE LKP (ITM TBL "AUX" (CNT 0) (LEN <GET .TBL 0>))
#DECL ((ITM) ANY (TBL) TABLE (CNT LEN) FIX)
<REPEAT ()
<COND (<G? <SET CNT <+ .CNT 1>> .LEN>
<RFALSE>)
(<==? <GET .TBL .CNT> .ITM>
<COND (<==? .CNT .LEN> <RFALSE>)
(T
<RETURN <GET .TBL <+ .CNT 1>>>)>)>>>
<ROUTINE V-WALK ("AUX" PT PTS STR OBJ RM)
<COND (<NOT ,P-WALK-DIR>
<PERFORM ,V?WALK-TO ,PRSO>
<RTRUE>)
(<SET PT <GETPT ,HERE ,PRSO>>
<COND (<==? <SET PTS <PTSIZE .PT>> ,UEXIT>
<GOTO <GETB .PT ,REXIT>>)
(<==? .PTS ,NEXIT>
<TELL <GET .PT ,NEXITSTR> CR>
<RFATAL>)
(<==? .PTS ,FEXIT>
<COND (<SET RM <APPLY <GET .PT ,FEXITFCN>>>
<GOTO .RM>)
(T
<RFATAL>)>)
(<==? .PTS ,CEXIT>
<COND (<VALUE <GETB .PT ,CEXITFLAG>>
<GOTO <GETB .PT ,REXIT>>)
(<SET STR <GET .PT ,CEXITSTR>>
<TELL .STR CR>
<RFATAL>)
(T
<TELL "You can't go that way." CR>
<RFATAL>)>)
(<==? .PTS ,DEXIT>
<COND (<FSET? <SET OBJ <GETB .PT ,DEXITOBJ>> ,OPENBIT>
<GOTO <GETB .PT ,REXIT>>)
(<SET STR <GET .PT ,DEXITSTR>>
<TELL .STR CR>
<RFATAL>)
(T
<TELL "The " D .OBJ " is closed." CR>
<THIS-IS-IT .OBJ>
<RFATAL>)>)>)
(<AND <NOT ,LIT> <PROB 75>>
<JIGS-UP
"Oh, no! You have walked into the slavering fangs of a lurking grue!">)
(T
<TELL "You can't go that way." CR>
<RFATAL>)>>
<ROUTINE THIS-IS-IT (OBJ)
<SETG P-IT-OBJECT .OBJ>
<SETG P-IT-LOC ,HERE>>
<ROUTINE V-INVENTORY ()
<COND (<FIRST? ,WINNER> <PRINT-CONT ,WINNER>)
(T <TELL "You are empty handed." CR>)>>
<GLOBAL INDENTS
<TABLE ""
" "
" "
" "
" "
" ">>
\
<ROUTINE PRE-TAKE ()
<COND (<IN? ,PRSO ,WINNER> <TELL "You already have it." CR>)
(<AND <FSET? <LOC ,PRSO> ,CONTBIT>
<NOT <FSET? <LOC ,PRSO> ,OPENBIT>>>
<TELL "I can't reach that." CR>
<RTRUE>)
(<AND ,PRSI <NOT <==? ,PRSO ,SPEAR>>>
<COND (<NOT <==? ,PRSI <LOC ,PRSO>>>
<TELL "It's not in that!" CR>)
(T
<SETG PRSI <>>
<RFALSE>)>)
(<==? ,PRSO <LOC ,WINNER>> <TELL "You are in it, loser!" CR>)>>
<ROUTINE V-TAKE ()
<COND (<==? <ITAKE> T>
<TELL "Taken." CR>)>>
<GLOBAL FUMBLE-NUMBER 7>
<GLOBAL FUMBLE-PROB 8>
<ROUTINE TRYTAKE ()
<COND (<IN? ,PRSO ,WINNER> <RTRUE>)
(<AND <FSET? ,PRSO ,TRYTAKEBIT>
<GETP ,PRSO ,P?ACTION>>
<PERFORM ,V?TAKE ,PRSO>
<IN? ,PRSO ,WINNER>)
(ELSE <ITAKE>)>>
<ROUTINE ITAKE ("OPTIONAL" (VB T) "AUX" CNT OBJ WLOC)
#DECL ((VB) <OR ATOM FALSE> (CNT) FIX (OBJ) OBJECT)
<COND (<NOT <FSET? ,PRSO ,TAKEBIT>>
<COND (.VB
<TELL <PICK-ONE ,YUKS> CR>)>
<RFALSE>)
(<AND <NOT <IN? <LOC ,PRSO> ,WINNER>>
<G? <+ <WEIGHT ,PRSO> <WEIGHT ,WINNER>> ,LOAD-ALLOWED>>
<COND (.VB
<TELL "Your load is too heavy." CR>)>
<RFATAL>)
(<AND <G? <SET CNT <CCOUNT ,WINNER>> ,FUMBLE-NUMBER>
<PROB <* .CNT ,FUMBLE-PROB>>>
<SET OBJ <FIRST? ,WINNER>>
<SET OBJ <NEXT? .OBJ>>
;"This must go! Chomping compiler strikes again"
<TELL
"Oh, no. The " D .OBJ " slips from your arms while taking the "
D ,PRSO " and both tumble to the floor." CR>
<SET WLOC <LOC ,WINNER>>
<COND (<==? ,PRSO ,UNDER-GLOBE>
<SETG UNDER-GLOBE <>>
<FCLEAR ,PRSO ,NDESCBIT>)>
<COND (<OR <FSET? .WLOC ,RMUNGBIT>
<EQUAL? .WLOC
,UP-A-TREE
,TREETOP-ROOM
,DRIVE-BUBBLE-ENTRANCE>
<EQUAL? .WLOC
,CONTROL-BUBBLE-ENTRANCE>>
<PERFORM ,V?DROP .OBJ>
<MOVE ,PRSO ,WINNER>
<PERFORM ,V?DROP ,PRSO>)
(ELSE
<MOVE .OBJ .WLOC>
<MOVE ,PRSO .WLOC>)>
<RFATAL>)
(T
<MOVE ,PRSO ,WINNER>
<FCLEAR ,PRSO ,NDESCBIT>
<SCORE-OBJ ,PRSO>
<FSET ,PRSO ,TOUCHBIT>
<RTRUE>)>>
<GLOBAL YUKS
<LTABLE
"A valiant attempt."
"You can't be serious."
"Not bloody likely."
"An interesting idea..."
"What a concept!">>
<ROUTINE PRE-PUT ()
<COND (<OR <IN? ,PRSO ,GLOBAL-OBJECTS>
<NOT <FSET? ,PRSO ,TAKEBIT>>>
<TELL "Nice try." CR>)>>
<ROUTINE V-PUT ()
<COND (<OR <FSET? ,PRSI ,OPENBIT>
<OPENABLE? ,PRSI>
<FSET? ,PRSI ,VEHBIT>>)
(T
<TELL "I can't do that." CR>
<RTRUE>)>
<COND (<NOT <FSET? ,PRSI ,OPENBIT>>
<TELL "The " D ,PRSI " isn't open." CR>)
(<==? ,PRSI ,PRSO>
<TELL "How can you do that?" CR>)
(<IN? ,PRSO ,PRSI>
<TELL "The " D ,PRSO " is already in the " D ,PRSI "." CR>)
(<G? <- <+ <WEIGHT ,PRSI> <WEIGHT ,PRSO>>
<GETP ,PRSI ,P?SIZE>>
<GETP ,PRSI ,P?CAPACITY>>
<TELL "There's no room." CR>)
(<AND <NOT <HELD? ,PRSO>>
<NOT <TRYTAKE>>>
<RTRUE>)
(T
<SCORE-OBJ ,PRSO>
<MOVE ,PRSO ,PRSI>
<FSET ,PRSO ,TOUCHBIT>
<TELL "Done." CR>)>>
<ROUTINE PRE-DROP ()
<COND (<==? ,PRSO <LOC ,WINNER>>
<PERFORM ,V?DISEMBARK ,PRSO>
<RTRUE>)>>
"SZAP => ZAP who WITH what"
<ROUTINE PRE-SZAP ()
<PERFORM ,V?ZAP ,PRSI ,PRSO>
<RTRUE>>
"ZAP => ZAP <weapon> <who>"
<ROUTINE PRE-ZAP ()
<COND (,PRSI <RFALSE>)
(<FSET? ,PRSO ,WEAPONBIT> <RFALSE>)
(<IN? ,ZAP-GUN ,WINNER>
<PERFORM ,V?ZAP ,ZAP-GUN ,PRSO>
<RTRUE>)
(ELSE <TELL
"You have nothing to shoot the " D ,PRSO " with." CR>)>>
<ROUTINE DONT-HAVE (OBJ)
<TELL "You don't have the " D .OBJ "." CR>>
<ROUTINE V-ZAP ()
<COND (<NOT <IN? ,PRSO ,WINNER>>
<DONT-HAVE ,PRSO>)
(<NOT <FSET? ,PRSO ,WEAPONBIT>>
<TELL "You can't use a " D ,PRSO " as a ray gun!" CR>)
(<NOT ,PRSI> <TELL "At what?" CR>)
(ELSE <TELL "Nothing happens." CR>)>>
<ROUTINE V-SZAP ()
<TELL "ZAPPP!!" CR>>
<ROUTINE PRE-GIVE ()
<COND (<NOT <HELD? ,PRSO>>
<TELL
"That's easy for you to say since you don't even have it." CR>)>>
<ROUTINE PRE-SGIVE ()
<PERFORM ,V?GIVE ,PRSI ,PRSO>
<RTRUE>>
<ROUTINE V-GIVE ()
<COND (<NOT <FSET? ,PRSI ,VICBIT>>
<TELL "You can't give a " D ,PRSO " to a " D ,PRSI "!" CR>)
(<IDROP> <TELL "Given." CR>)>>
<ROUTINE V-SGIVE ()
<TELL "FOOOO!!" CR>>
<ROUTINE V-DROP () <COND (<IDROP> <TELL "Dropped." CR>)>>
<ROUTINE V-THROW () <COND (<IDROP> <TELL "Thrown." CR>)>>
<ROUTINE IDROP ()
<COND (<EQUAL? <LOC ,PRSO> ,GLOBAL-OBJECTS ,LOCAL-GLOBALS>
<TELL "You can't throw that." CR>
<RFALSE>)
(<NOT <HELD? ,PRSO>>
<TELL "You're not carrying the " D ,PRSO "." CR>
<RFALSE>)
(<AND <NOT <IN? ,PRSO ,WINNER>>
<NOT <FSET? <LOC ,PRSO> ,OPENBIT>>>
<TELL "The " D ,PRSO " is closed." CR>
<RFALSE>)
(T <MOVE ,PRSO <LOC ,WINNER>> <RTRUE>)>>
\
<ROUTINE ALREADY (ON-OFF "OPTIONAL" (OBJ <>))
<COND (.OBJ
<TELL "The " D .OBJ " is ">)
(ELSE
<TELL "It's ">)>
<TELL "already " .ON-OFF "." CR>>
<ROUTINE V-OPEN ("AUX" F STR)
<COND (<NOT <FSET? ,PRSO ,CONTBIT>>
<TELL
"You must be very clever to do that to the " D ,PRSO "." CR>)
(<OR <FSET? ,PRSO ,DOORBIT>
<NOT <==? <GETP ,PRSO ,P?CAPACITY> 0>>>
<COND (<FSET? ,PRSO ,OPENBIT> <ALREADY "open">)
(T
<FSET ,PRSO ,OPENBIT>
<COND (<FSET? ,PRSO ,DOORBIT>
<TELL "The " D ,PRSO " is now open." CR>)
(<OR <NOT <FIRST? ,PRSO>> <FSET? ,PRSO ,TRANSBIT>>
<TELL "Opened." CR>)
(<AND <SET F <FIRST? ,PRSO>>
<NOT <NEXT? .F>>
<SET STR <GETP .F ,P?FDESC>>>
<TELL "The " D ,PRSO " opens." CR>
<TELL .STR CR>)
(T
<TELL "Opening the " D ,PRSO " reveals ">
<PRINT-CONTENTS ,PRSO>
<TELL "." CR>)>)>)
(T <TELL "The " D ,PRSO " cannot be opened." CR>)>>
<ROUTINE PRINT-CONTENTS (OBJ "AUX" F N (1ST? T))
#DECL ((OBJ) OBJECT (F N) <OR FALSE OBJECT>)
<COND (<SET F <FIRST? .OBJ>>
<REPEAT ()
<SET N <NEXT? .F>>
<COND (.1ST? <SET 1ST? <>>)
(ELSE
<TELL ", ">
<COND (<NOT .N> <TELL "and ">)>)>
<TELL "a " D .F>
<SET F .N>
<COND (<NOT .F> <RETURN>)>>)>>
<ROUTINE V-CLOSE ()
<COND (<NOT <FSET? ,PRSO ,CONTBIT>>
<TELL "You must tell me how to do that to a " D ,PRSO "." CR>)
(<AND <NOT <FSET? ,PRSO ,SURFACEBIT>>
<OR <NOT <==? <GETP ,PRSO ,P?CAPACITY> 0>>
<FSET? ,PRSO ,DOORBIT>>>
<COND (<FSET? ,PRSO ,OPENBIT>
<FCLEAR ,PRSO ,OPENBIT>
<TELL "Closed." CR>)
(T <ALREADY "closed">)>)
(ELSE
<TELL "You cannot close that." CR>)>>
<ROUTINE CCOUNT (OBJ "AUX" (CNT 0) X)
<COND (<SET X <FIRST? .OBJ>>
<REPEAT ()
<SET CNT <+ .CNT 1>>
<COND (<NOT <SET X <NEXT? .X>>>
<RETURN>)>>)>
.CNT>
"WEIGHT: Get sum of SIZEs of supplied object, recursing to the nth level."
<ROUTINE WEIGHT
(OBJ "AUX" CONT (WT 0))
#DECL ((OBJ) OBJECT (CONT) <OR FALSE OBJECT> (WT) FIX)
<COND (<SET CONT <FIRST? .OBJ>>
<REPEAT ()
<SET WT <+ .WT <WEIGHT .CONT>>>
<COND (<NOT <SET CONT <NEXT? .CONT>>> <RETURN>)>>)>
<+ .WT <GETP .OBJ ,P?SIZE>>>
<GLOBAL COPR-NOTICE
" a transcript of interaction with STARCROSS.|
STARCROSS is a registered trademark of Infocom, Inc.|
Copyright (c) 1982 Infocom, Inc. All rights reserved.|">
<ROUTINE V-SCRIPT ()
<PUT 0 8 <BOR <GET 0 8> 1>>
<TELL "Here begins" ,COPR-NOTICE CR>>
<ROUTINE V-UNSCRIPT ()
<TELL "Here ends" ,COPR-NOTICE CR>
<PUT 0 8 <BAND <GET 0 8> -2>>
<RTRUE>>
<ROUTINE PRE-MOVE
()
<COND (<HELD? ,PRSO> <TELL "I don't juggle objects!" CR>)>>
<ROUTINE V-MOVE ()
<COND (<FSET? ,PRSO ,TAKEBIT>
<TELL "Moving the " D ,PRSO " reveals nothing." CR>)
(T <TELL "You can't move the " D ,PRSO "." CR>)>>
<ROUTINE V-LAMP-ON
()
<COND (<FSET? ,PRSO ,LIGHTBIT>
<COND (<FSET? ,PRSO ,ONBIT> <ALREADY "on">)
(ELSE
<FSET ,PRSO ,ONBIT>
<TELL "The " D ,PRSO " is now on." CR>
<COND (<NOT ,LIT>
<SETG LIT <LIT? ,HERE>>
<V-LOOK>)>)>)
(T
<TELL "You can't turn that on." CR>)>
<RTRUE>>
<ROUTINE V-LAMP-OFF
()
<COND (<FSET? ,PRSO ,LIGHTBIT>
<COND (<NOT <FSET? ,PRSO ,ONBIT>>
<ALREADY "off">)
(ELSE
<FCLEAR ,PRSO ,ONBIT>
<COND (,LIT
<SETG LIT <LIT? ,HERE>>)>
<TELL "The " D ,PRSO " is now off." CR>
<COND (<NOT <SETG LIT <LIT? ,HERE>>>
<TELL "It is now pitch black." CR>)>)>)
(ELSE <TELL "You can't turn that off." CR>)>
<RTRUE>>
<ROUTINE V-WAIT ("OPTIONAL" (NUM 3))
#DECL ((NUM) FIX)
<TELL "Time passes..." CR>
<REPEAT ()
<COND (<L? <SET NUM <- .NUM 1>> 0> <RETURN>)
(<CLOCKER> <RETURN>)>
<SETG MOVES <+ ,MOVES 1>>>
<SETG CLOCK-WAIT T>>
<ROUTINE PRE-BOARD ("AUX" AV)
<SET AV <LOC ,WINNER>>
<COND (<FSET? ,PRSO ,VEHBIT>
<COND (<FSET? .AV ,VEHBIT>
<TELL "You are already in it!" CR>)
(T <RFALSE>)>)
(<EQUAL? ,PRSO ,SPACESUIT ,JUNK-SPACESUIT ,MOUSE>
<RFALSE>)
(T
<TELL "I suppose you have a theory on boarding a "
D
,PRSO
"." CR>)>
<RFATAL>>
<ROUTINE V-BOARD ("AUX" AV)
#DECL ((AV) OBJECT)
<TELL "You are now in the " D ,PRSO "." CR>
<MOVE ,WINNER ,PRSO>
<APPLY <GETP ,PRSO ,P?ACTION> ,M-ENTER>
<RTRUE>>
<ROUTINE V-DISEMBARK
()
<COND (<NOT <==? <LOC ,WINNER> ,PRSO>>
<TELL "You're not in that!" CR>
<RFATAL>)
(T
<TELL "You are on your own feet again." CR>
<MOVE ,WINNER ,HERE>)>>
<ROUTINE GOTO (RM "OPTIONAL" (V? T) "AUX" (WLOC <LOC ,WINNER>) OLIT)
#DECL ((RM WLOC) OBJECT)
<SET OLIT ,LIT>
<MOVE ,WINNER .RM>
<SETG MFOLLOW <>> ;"we moved, so can't follow him"
<SETG CHFOLLOW <>> ;"ditto"
<SETG HERE .RM>
<SETG LIT <LIT? ,HERE>>
<COND (<AND <NOT .OLIT>
<NOT ,LIT>
<PROB 75>>
<JIGS-UP
"Oh, no! A lurking grue slithered into the room and devoured you!">
<RTRUE>)>
<COND (<==? <APPLY <GETP ,HERE ,P?ACTION> ,M-ENTER> 2>
<RTRUE>)>
<COND (<NOT <==? ,ADVENTURER ,WINNER>>
<TELL "The " D ,WINNER " leaves the room." CR>)
(.V? <V-FIRST-LOOK>)>
<SCORE-OBJ .RM>
<RTRUE>>
<ROUTINE V-DRINK ()
<V-EAT>>
<ROUTINE V-EAT ()
<TELL "I don't think that the "
D
,PRSO
" would agree with you." CR>>
<ROUTINE V-CURSES ()
<COND (,PRSO
<COND (<FSET? ,PRSO ,VILLAIN>
<TELL "Insults won't help you." CR>)
(T
<TELL "What a loony!" CR>)>)
(T
<TELL
"Such language in a high-class establishment like this!" CR>)>>
<ROUTINE V-LISTEN ()
<TELL "The " D ,PRSO " makes no sound." CR>>
<ROUTINE V-FOLLOW ()
<TELL "You're nuts!" CR>>
<ROUTINE V-LEAP ("AUX" TX S)
#DECL ((T) <OR FALSE TABLE>)
<COND (,PRSO
<COND (<IN? ,PRSO ,HERE>
<COND (<FSET? ,PRSO ,VILLAIN>
<TELL "The "
D
,PRSO
" is too big to jump over." CR>)
(T <V-SKIP>)>)
(T <TELL "That would be a good trick." CR>)>)
(<SET TX <GETPT ,HERE ,P?DOWN>>
<SET S <PTSIZE .TX>>
<COND (<OR <==? .S 2> ;NEXIT
<AND <==? .S 4> ;CEXIT
<NOT <VALUE <GETB .TX 1>>>>>
<TELL
"This was not a safe place to try jumping." CR>
<JIGS-UP "You should have looked before you leaped.">)
(T <V-SKIP>)>)
(ELSE <V-SKIP>)>>
<ROUTINE V-SKIP () <TELL <PICK-ONE ,WHEEEEE> CR>>
<ROUTINE V-LEAVE () <DO-WALK ,P?OUT>>
<GLOBAL HS 0>
<ROUTINE V-HELLO ()
<COND (,PRSO
<TELL
"Only schizophrenics say \"Hello\" to a " D ,PRSO "." CR>)
(ELSE <TELL <PICK-ONE ,HELLOS> CR>)>>
<GLOBAL HELLOS
<LTABLE "Hello."
"Nice weather we're having."
"Goodbye.">>
<GLOBAL WHEEEEE
<LTABLE "Have you tried skipping from star to star, too?"
"Are you enjoying yourself?"
"Wheeeeeeeeee!!!!!">>
<ROUTINE PRE-READ ()
;<COND (<NOT ,LIT> <TELL "It is impossible to read in the dark." CR>)
(<AND ,PRSI <NOT <FSET? ,PRSI ,TRANSBIT>>>
<TELL "How does one look through a " D ,PRSI "?" CR>)>
<RFALSE>>
<ROUTINE V-READ ()
<COND (<NOT <FSET? ,PRSO ,READBIT>>
<TELL "How can I read a " D ,PRSO "?" CR>)
(ELSE <TELL <GETP ,PRSO ,P?TEXT> CR>)>>
<ROUTINE V-LOOK-UNDER () <TELL "There is nothing but dust there." CR>>
<ROUTINE V-LOOK-BEHIND () <V-LOOK-UNDER>>
<ROUTINE V-LOOK-INSIDE
()
<COND (<FSET? ,PRSO ,DOORBIT>
<COND (<FSET? ,PRSO ,OPENBIT>
<TELL "The "
D
,PRSO
" is open, but I can't tell what's beyond it.">)
(ELSE <TELL "The " D ,PRSO " is closed.">)>
<CRLF>)
(<FSET? ,PRSO ,CONTBIT>
<COND (<FSET? ,PRSO ,VICBIT>
<TELL "There is nothing special to be seen." CR>)
(<SEE-INSIDE? ,PRSO>
<COND (<AND <FIRST? ,PRSO> <PRINT-CONT ,PRSO>>
<RTRUE>)
(<FSET? ,PRSO ,SURFACEBIT>
<TELL "There is nothing on the " D ,PRSO "." CR>)
(T
<TELL "The " D ,PRSO " is empty." CR>)>)
(ELSE <TELL "The " D ,PRSO " is closed." CR>)>)
(<FSET? ,PRSO ,TRANSBIT>
<TELL "You can see dimly through the " D ,PRSO "." CR>)
(ELSE <TELL "I don't know how to look inside a " D ,PRSO "." CR>)>>
<ROUTINE SEE-INSIDE? (OBJ)
<AND <NOT <FSET? .OBJ ,INVISIBLE>>
<OR <FSET? .OBJ ,TRANSBIT> <FSET? .OBJ ,OPENBIT>>>>
<ROUTINE PRE-TURN
()
<COND (<NOT <FSET? ,PRSO ,TURNBIT>> <TELL "You can't turn that!" CR>)
(<NOT <FSET? ,PRSI ,TOOLBIT>>
<TELL "You can't turn it with a " D ,PRSI "." CR>)>>
<ROUTINE V-TURN () <TELL "That doesn't work." CR>>
<ROUTINE V-LOCK () <V-TURN>>
<ROUTINE V-PICK () <V-TURN>>
<ROUTINE V-UNLOCK () <V-TURN>>
<ROUTINE V-KILL ()
<IKILL "kill">>
<ROUTINE IKILL (STR)
<COND (<NOT ,PRSO> <TELL "There is nothing here to " .STR "." CR>)
(<AND <NOT <FSET? ,PRSO ,VILLAIN>>
<NOT <FSET? ,PRSO ,VICBIT>>>
<TELL "I've known strange people, but fighting a "
D
,PRSO
"?" CR>)
(<OR <NOT ,PRSI> <==? ,PRSI ,HANDS>>
<FUTILE .STR>)
(<NOT <FSET? ,PRSI ,WEAPONBIT>>
<TELL "Trying to "
.STR
" the "
D
,PRSO
" with a "
D
,PRSI
" is futile." CR>)
(ELSE <TELL "You can't." CR>)>>
<ROUTINE V-ATTACK () <IKILL "attack">>
<ROUTINE V-KICK () <HACK-HACK "Kicking the ">>
<ROUTINE V-WAVE () <HACK-HACK "Waving the ">>
<ROUTINE V-RAISE () <HACK-HACK "Playing in this way with the ">>
<ROUTINE V-LOWER () <HACK-HACK "Playing in this way with the ">>
<ROUTINE V-RUB () <HACK-HACK "Fiddling with the ">>
<ROUTINE V-PUSH () <HACK-HACK "Pushing the ">>
<ROUTINE PRE-MUNG ()
<COND (<NOT <FSET? ,PRSO ,VICBIT>>
<HACK-HACK "Trying to destroy the ">)
(<NOT ,PRSI>
<FUTILE "destroy">)>>
<ROUTINE FUTILE (STR)
<TELL
"Trying to " .STR " a " D ,PRSO " with your bare hands is futile." CR>>
<ROUTINE V-MUNG ()
<COND (<FSET? ,PRSO ,KEYBIT>
<REMOVE ,PRSO>
<TELL
"It shatters and disappears." CR>)
(T <TELL "You can't." CR>)>>
<ROUTINE HACK-HACK
(STR)
<TELL .STR D ,PRSO <PICK-ONE ,HO-HUM> CR>>
<GLOBAL HO-HUM
<LTABLE
" isn't notably helpful."
" does nothing."
" has no effect.">>
<ROUTINE WORD-TYPE
(OBJ WORD "AUX" SYNS)
#DECL ((OBJ) OBJECT (WORD SYNS) TABLE)
<ZMEMQ .WORD
<SET SYNS <GETPT .OBJ ,P?SYNONYM>>
<- </ <PTSIZE .SYNS> 2> 1>>>
<ROUTINE V-KNOCK
()
<COND (<WORD-TYPE ,PRSO ,W?DOOR>
<TELL "Nobody's home." CR>)
(ELSE <TELL "Why knock on a " D ,PRSO "?" CR>)>>
<ROUTINE V-FROBOZZ
()
<TELL
"The FROBOZZ Corporation sponsored this expedition." CR>>
<ROUTINE V-YELL () <TELL "Aarrrrggggggghhhhhhhh!" CR>>
<ROUTINE V-PLUG () <TELL "This has no effect." CR>>
\
<ROUTINE V-SHAKE ("AUX" X)
<COND (<FSET? ,PRSO ,VILLAIN>
<TELL "This seems to have no effect." CR>)
(<AND <NOT <FSET? ,PRSO ,OPENBIT>>
<FIRST? ,PRSO>>
<TELL "It sounds like there is something inside the "
D
,PRSO
"."
CR>)
(<AND <FSET? ,PRSO ,OPENBIT> <FIRST? ,PRSO>>
<REPEAT ()
<COND (<SET X <FIRST? ,PRSO>> <MOVE .X ,PRSO>)
(ELSE <RETURN>)>>
<TELL "All of the objects spill onto the floor." CR>)>>
<ROUTINE V-DIG () <TELL "What a silly idea!" CR>>
<ROUTINE V-SMELL ()
<COND (,SUIT-ON?
<SETG PRSO ,SPACESUIT>)>
<TELL "It smells just like a " D ,PRSO "." CR>>
<ROUTINE GLOBAL-IN? (OBJ1 OBJ2 "AUX" TX)
<COND (<SET TX <GETPT .OBJ2 ,P?GLOBAL>>
<ZMEMQB .OBJ1 .TX <- <PTSIZE .TX> 1>>)>>
<ROUTINE HERE?? (OBJ)
<OR <IN? .OBJ ,HERE> <GLOBAL-IN? .OBJ ,HERE>>>
<ROUTINE V-SWIM ()
<COND (<FSET? ,HERE ,RAIRBIT>
<TELL
"Waving your limbs doesn't help much. You move a little, but some stronger
impulse is needed." CR>)
(ELSE
<TELL "You can't swim here!" CR>)>>
<ROUTINE V-UNTIE () <TELL "Unfasten it how?" CR>>
<ROUTINE PRE-TIE
()
<COND (<==? ,PRSI ,WINNER>
<TELL "You can't tie it to yourself." CR>)>>
<ROUTINE V-TIE () <TELL "You can't tie the " D ,PRSO " to that." CR>>
<ROUTINE V-ALARM ()
<COND (<FSET? ,PRSO ,VILLAIN>
<TELL "He's wide awake, or haven't you noticed..." CR>)
(ELSE
<TELL "The " D ,PRSO " isn't sleeping." CR>)>>
<ROUTINE V-ZORK () <TELL "I see no Zork here." CR>>
\
<ROUTINE V-COMMAND ()
<COND (<FSET? ,PRSO ,VICBIT>
<TELL "The " D ,PRSO " pays no attention." CR>)
(ELSE
<TELL "You cannot talk to that!" CR>)>>
<ROUTINE V-CLIMB-ON ()
<COND (<AND <FSET? ,PRSO ,FURNITURE> <FSET? ,PRSO ,VEHBIT>>
<PERFORM ,V?BOARD ,PRSO>
<RTRUE>)
(<FSET? ,PRSO ,VEHBIT>
<V-CLIMB-UP ,P?UP T>)
(T
<TELL "You can't climb onto the " D ,PRSO "." CR>)>>
<ROUTINE V-CLIMB-FOO () <V-CLIMB-UP ,P?UP T>>
<ROUTINE V-CLIMB-UP ("OPTIONAL" (DIR ,P?UP) (OBJ <>) "AUX" X)
#DECL ((DIR) FIX (OBJ) <OR ATOM FALSE> (X) TABLE)
<COND (<GETPT ,HERE .DIR>
<DO-WALK .DIR>
<RTRUE>)
(<NOT .OBJ>
<TELL "You can't go that way." CR>)
(ELSE <TELL "Bizarre!" CR>)>>
<ROUTINE V-CLIMB-DOWN ()
<COND (<AND <FSET? ,PRSO ,FURNITURE> <FSET? ,PRSO ,VEHBIT>>
<V-CLIMB-ON>
<RTRUE>)
(T <V-CLIMB-UP ,P?DOWN>)>>
<ROUTINE V-PUT-UNDER ()
<TELL "You can't do that." CR>>
<ROUTINE V-ENTER ()
<DO-WALK ,P?IN>>
<ROUTINE V-EXIT ()
<DO-WALK ,P?OUT>>
<ROUTINE V-SEARCH ()
<TELL "You find nothing unusual." CR>>
<ROUTINE V-FIND ("AUX" (L <LOC ,PRSO>))
<COND (<EQUAL? ,PRSO ,ME ,HANDS>
<TELL "You're around here somewhere..." CR>)
(<EQUAL? .L ,GLOBAL-OBJECTS>
<TELL "You find it." CR>)
(<IN? ,PRSO ,WINNER>
<TELL "You have it." CR>)
(<OR <IN? ,PRSO ,HERE>
<==? ,PRSO ,PSEUDO-OBJECT>>
<TELL "It's right here." CR>)
(<FSET? .L ,VILLAIN>
<TELL "The " D .L " has it." CR>)
(<FSET? .L ,CONTBIT>
<TELL "It's in the " D .L "." CR>)
(ELSE
<TELL "Beats me." CR>)>>
<ROUTINE V-TELL ()
<COND (<FSET? ,PRSO ,VICBIT>
<SETG WINNER ,PRSO>)
(T
<TELL "You can't talk to the " D ,PRSO "!" CR>
<SETG QUOTE-FLAG <>>
<SETG P-CONT <>>
<RFATAL>)>>
<ROUTINE V-ANSWER ()
<TELL "Nobody is awaiting your answer." CR>
<SETG P-CONT <>>
<SETG QUOTE-FLAG <>>
<RTRUE>>
<ROUTINE V-REPLY ()
<TELL "It is doubtful that the " D ,PRSO " is interested." CR>
<SETG P-CONT <>>
<SETG QUOTE-FLAG <>>
<RTRUE>>
<ROUTINE V-IS-IN ()
<COND (<IN? ,PRSO ,PRSI>
<TELL "Yes, it is ">
<COND (<FSET? ,PRSI ,SURFACEBIT>
<TELL "on">)
(T <TELL "in">)>
<TELL " the " D ,PRSI "." CR>)
(T <TELL "No, it isn't." CR>)>>
<ROUTINE V-KISS ()
<TELL "I'd sooner kiss a pig." CR>>
<ROUTINE V-RAPE ()
<TELL "What a (ahem!) strange idea." CR>>
<ROUTINE V-DIAGNOSE ()
<TELL "You are in perfect health." CR>
<COND (<NOT <0? ,DEATHS>>
<TELL "You have been killed ">
<COND (<1? ,DEATHS> <TELL "once.">)
(<==? ,DEATHS 2> <TELL "twice.">)
(T <TELL "three times.">)>
<CRLF>)>>
<ROUTINE V-SAY ("AUX" V)
<COND (<SET V <FIND-IN ,HERE ,VICBIT>>
<SETG P-CONT <>>
<TELL "You must address the " D .V " directly." CR>)
(ELSE
<SETG QUOTE-FLAG <>>
<SETG P-CONT <>>
<TELL
"Talking to yourself is a sign of impending mental collapse." CR>)>>
<ROUTINE V-WEAR ()
<TELL "You can't wear that, and besides, it wouldn't fit." CR>>
<ROUTINE V-REMOVE ()
<COND (<FSET? ,PRSO ,WEARBIT> <PERFORM ,V?TAKE-OFF ,PRSO> <RTRUE>)
(ELSE <PERFORM ,V?TAKE ,PRSO> <RTRUE>)>>
<ROUTINE V-TAKE-OFF ()
<COND (<FSET? ,PRSO ,VEHBIT> <V-DISEMBARK>)
(T <TELL "You aren't wearing that." CR>)>>
<ROUTINE V-STEP-ON ()
<TELL "That's a silly thing to do." CR>>
<ROUTINE V-PUT-ON ()
<PERFORM ,V?PUT ,PRSO ,PRSI>>
<ROUTINE V-LAND ()
<TELL "Such complicated tasks are best left to computers." CR>>
<ROUTINE ROB (WHO "OPTIONAL" (WHERE <>) (HIDE? <>) "AUX" N X (ROBBED? <>))
<SET X <FIRST? .WHO>>
<REPEAT ()
<COND (<NOT .X> <RETURN .ROBBED?>)>
<SET N <NEXT? .X>>
<COND (<RIPOFF .X .WHERE>
<COND (.HIDE? <FSET .X ,NDESCBIT>)>
<SET ROBBED? .X>)>
<SET X .N>>>
<ROUTINE RIPOFF (X WHERE)
<COND (<AND <==? .X ,BLUE-KEY>
<IN? ,BLUE-KEY ,FORCE-FIELD-1>>
<RFALSE>)
(<AND <NOT <IN? .X .WHERE>>
<NOT <FSET? .X ,INVISIBLE>>
<FSET? .X ,TOUCHBIT>
<FSET? .X ,TAKEBIT>>
<COND (<==? .X ,UNDER-GLOBE>
<FCLEAR .X ,NDESCBIT>
<SETG UNDER-GLOBE <>>)>
<COND (<EQUAL? .X ,RED-DISK ,BLUE-DISK>
<DISK-SWITCH .X <>>)>
<COND (<AND <EQUAL? .X ,SPACESUIT ,SAFETY-LINE> ,THAT-END>
<RTRUE>)>
<COND (.WHERE <MOVE .X .WHERE>)
(ELSE <REMOVE .X>)>
<RTRUE>)>>
<ROUTINE V-STAND ()
<COND (<FSET? <LOC ,WINNER> ,VEHBIT>
<PERFORM ,V?DISEMBARK <LOC ,WINNER>>
<RTRUE>)
(ELSE
<TELL "You are already standing, I think." CR>)>>
<ROUTINE V-NO ()
<TELL "You sound rather negative." CR>>
<ROUTINE V-YES ()
<TELL "You sound rather positive." CR>>
<ROUTINE V-POINT () <TELL "It's usually impolite to point." CR>>
<ROUTINE V-SET ()
<TELL "Setting a " D ,PRSO " is a strange concept." CR>>
<ROUTINE V-PLAY ()
<TELL "Playing a " D ,PRSO "?" CR>>
<ROUTINE V-$VERIFY ()
<TELL "Verifying game..." CR>
<COND (<VERIFY> <TELL "Game correct." CR>)
(T <TELL CR "** Game File Failure **" CR>)>>
<ROUTINE V-STAND-ON ()
<TELL "Standing on a " D ,PRSO " seems like a waste of time." CR>>
<ROUTINE V-REPORT ()
<TELL
"Report?!? Wait until you've accomplished something..." CR>>
<ROUTINE V-LOOK-SAFELY ()
<COND (<FSET? ,PRSI ,TRANSBIT>
<TELL "The " D ,PRSO " looks as before">
<COND (<NOT <==? ,PRSI ,CLEAR-KEY>>
<TELL ", only tinged by the
color of the " D ,PRSI>)>
<TELL "." CR>)
(ELSE <TELL "The " D ,PRSI " isn't transparent." CR>)>>
<ROUTINE V-REACH ()
<COND (<FIRST? ,PRSO>
<TELL "There is something">)
(ELSE <TELL "There is nothing">)>
<TELL " inside the " D ,PRSO "." CR>>
<ROUTINE V-REACH-FOR ()
<COND (<FSET? ,PRSO ,TAKEBIT>
<PERFORM ,V?TAKE ,PRSO>
<RTRUE>)
(<IN? ,PRSO ,HERE>
<TELL "It's here! Now what?" CR>)
(ELSE <TELL "It is out of reach." CR>)>>
<ROUTINE DO-WALK (DIR)
<SETG P-WALK-DIR .DIR>
<PERFORM ,V?WALK .DIR>>
<ROUTINE V-WALK-TO ()
<COND (<OR <IN? ,PRSO ,HERE>
<GLOBAL-IN? ,PRSO ,HERE>>
<TELL "It's here!" CR>)
(T <TELL "You should supply a direction!" CR>)>>
<ROUTINE V-FLY ()
<TELL "Humans are not usually equipped for flying." CR>>
<ROUTINE V-SMILE ()
<TELL "How pleasant!" CR>>
<ROUTINE V-EMPTY ()
<TELL "There's nothing to empty." CR>>