cutthroats/goal.zil

746 lines
22 KiB
Plaintext
Raw Permalink Normal View History

2019-04-13 17:20:29 -07:00
"GOAL for
TOA #2
Copyright 1984 Infocom, Inc. All rights reserved.
"
"This code is the local T system."
<GLOBAL DIR-STRINGS
<PTABLE P?NORTH "north" P?SOUTH "south"
P?EAST "east" P?WEST "west"
P?NW "northwest" P?NE "northeast"
P?SW "southwest" P?SE "southeast"
P?DOWN "downstairs" P?UP "upstairs"
P?IN "in" P?OUT "out">>
<GLOBAL NAUTICAL-DIR-STRINGS
<PTABLE P?NORTH "forward" P?SOUTH "aft"
P?EAST "starboard" P?WEST "port"
P?NW "northwest" P?NE "northeast"
P?SW "southwest" P?SE "southeast"
P?DOWN "below" P?UP "above"
P?IN "in" P?OUT "out">>
<ROUTINE DIR-PRINT (DIR "AUX" (CNT 0) TBL (DRY <>))
#DECL ((DIR CNT) FIX)
<COND (<NOT .DIR>
<TELL "out of view">
<RTRUE>)
(<G? <GETP ,HERE ,P?LINE> ,BACK-ALLEY-LINE-C>
<SET TBL ,NAUTICAL-DIR-STRINGS>)
(T
<SET TBL ,DIR-STRINGS>
<SET DRY T>)>
<REPEAT ()
<COND (<==? <GET .TBL .CNT> .DIR>
<COND (<AND .DRY
<NOT <EQUAL? .DIR ,P?UP ,P?DOWN>>>
<TELL "the ">)>
<PRINT <GET .TBL <+ .CNT 1>>>
<RTRUE>)>
<SET CNT <+ .CNT 1>>>>
"Rapid Transit Line Definitions and Identifiers"
<CONSTANT ROAD-WHARF-LINE-C 0>
<CONSTANT EAST-ROAD-LINE-C 1>
<CONSTANT BEDROOM-LINE-C 2>
<CONSTANT BACK-ALLEY-LINE-C 3>
<CONSTANT TRAWLER-LINE-C 4>
<CONSTANT SALVAGER-LINE-C 5>
<CONSTANT UNDERWATER-LINE-C 6>
<GLOBAL ROAD-WHARF-LINE
<PTABLE 0 WINDING-ROAD-1 P?SE
P?NW WINDING-ROAD-2 P?NE
P?SW WINDING-ROAD-3 P?NE
P?SW WHARF-ROAD-1 P?EAST
P?WEST WHARF-ROAD-2 P?EAST
P?WEST WHARF-ROAD-3 P?NORTH
P?SOUTH WHARF 0>>
<GLOBAL EAST-ROAD-LINE
<PTABLE 0 WHARF-ROAD-4 P?EAST
P?WEST WHARF-ROAD-5 P?SE
P?NW OCEAN-ROAD-1 P?SOUTH
P?NORTH OCEAN-ROAD-2 P?SOUTH
P?NORTH OCEAN-ROAD-3 P?SW
P?NE SHORE-ROAD-2 P?WEST
P?EAST SHORE-ROAD-1 P?WEST
P?EAST FERRY-LANDING 0>>
<GLOBAL BEDROOM-LINE
<PTABLE 0 RED-BOAR-INN P?UP
P?DOWN UPSTAIRS-HALLWAY P?SOUTH
P?NORTH BEDROOM 0>>
<GLOBAL BACK-ALLEY-LINE
<PTABLE 0 BACK-ALLEY-1 P?EAST
P?WEST BACK-ALLEY-2 P?EAST
P?WEST BACK-ALLEY-3 P?EAST
P?WEST BACK-ALLEY-4 P?EAST
P?WEST BACK-ALLEY-5 0>>
<GLOBAL TRAWLER-LINE
<PTABLE 0 NW-PORT-DECK P?NE
P?SW NW-FORE-DECK P?SE
P?NW NW-STARBOARD-DECK P?SW
P?NE NW-AFT-DECK P?DOWN
P?UP NW-LOUNGE P?NORTH
P?SOUTH NW-GALLEY P?NORTH
P?SOUTH NW-CREW-QTRS 0>>
<GLOBAL SALVAGER-LINE
<PTABLE 0 MM-STARBOARD-DECK P?NW
P?SE MM-FORE-DECK P?SW
P?NE MM-PORT-DECK P?SE
P?NW MM-AFT-DECK P?DOWN
P?UP MM-LOUNGE P?NORTH
P?SOUTH MM-GALLEY P?NORTH
P?SOUTH MM-CREW-QTRS 0>>
<GLOBAL TRANSFER-TABLE
<PTABLE 0 0
WHARF-ROAD-3 WHARF-ROAD-4
WHARF-ROAD-1 RED-BOAR-INN
WHARF-ROAD-3 WHARF-ROAD-4
WHARF NW-STARBOARD-DECK
WHARF MM-PORT-DECK
WHARF-ROAD-4 WHARF-ROAD-3
0 0
WHARF-ROAD-4 WHARF-ROAD-3
OCEAN-ROAD-1 BACK-ALLEY-5
WHARF-ROAD-4 WHARF-ROAD-3
WHARF-ROAD-4 WHARF-ROAD-3
RED-BOAR-INN WHARF-ROAD-1
RED-BOAR-INN WHARF-ROAD-1
0 0
RED-BOAR-INN WHARF-ROAD-1
RED-BOAR-INN WHARF-ROAD-1
RED-BOAR-INN WHARF-ROAD-1
BACK-ALLEY-5 OCEAN-ROAD-1
BACK-ALLEY-5 OCEAN-ROAD-1
BACK-ALLEY-5 OCEAN-ROAD-1
0 0
BACK-ALLEY-5 OCEAN-ROAD-1
BACK-ALLEY-5 OCEAN-ROAD-1
NW-STARBOARD-DECK WHARF
NW-STARBOARD-DECK WHARF
NW-STARBOARD-DECK WHARF
NW-STARBOARD-DECK WHARF
0 0
NW-STARBOARD-DECK WHARF
MM-PORT-DECK WHARF
MM-PORT-DECK WHARF
MM-PORT-DECK WHARF
MM-PORT-DECK WHARF
MM-PORT-DECK WHARF
0 0>>
<GLOBAL COR-1
<PTABLE P?NW P?SE
WINDING-ROAD-1 WINDING-ROAD-2 0>>
<GLOBAL COR-2
<PTABLE P?SW P?NE
WINDING-ROAD-2 WINDING-ROAD-3 WHARF-ROAD-1 0>>
<GLOBAL COR-4
<PTABLE P?WEST P?EAST
WHARF-ROAD-1 WHARF-ROAD-2 WHARF-ROAD-3 WHARF-ROAD-4
WHARF-ROAD-5 0>>
<GLOBAL COR-8
<PTABLE P?NW P?SE
WHARF-ROAD-5 OCEAN-ROAD-1 0>>
<GLOBAL COR-16
<PTABLE P?NORTH P?SOUTH
OCEAN-ROAD-1 OCEAN-ROAD-2 OCEAN-ROAD-3 0>>
<GLOBAL COR-32
<PTABLE P?NW P?SE
OCEAN-ROAD-3 POINT-LOOKOUT 0>>
<GLOBAL COR-64
<PTABLE P?SW P?NE
SHORE-ROAD-2 OCEAN-ROAD-3 0>>
<GLOBAL COR-128
<PTABLE P?WEST P?EAST
FERRY-LANDING SHORE-ROAD-1 SHORE-ROAD-2 0>>
<GLOBAL COR-256
<PTABLE P?NORTH P?SOUTH
WHARF WHARF-ROAD-3 VACANT-LOT BACK-ALLEY-3 0>>
<GLOBAL COR-512
<PTABLE P?WEST P?EAST
BACK-ALLEY-1 BACK-ALLEY-2 BACK-ALLEY-3 BACK-ALLEY-4
BACK-ALLEY-5 0>>
;"up to 16 corridors (65536)"
"CODE"
<ROUTINE FOLLOW-GOAL (PERSON "AUX" (HERE <LOC .PERSON>) LINE LN RM GT GOAL FLG
(GOAL-FLAG <>) (IGOAL <>) LOC (CNT 1) DIR)
#DECL ((PERSON HERE LOC RM) OBJECT (LN CNT) FIX
(GOAL-FLAG) <OR ATOM FALSE>)
<SET GT <GET ,GOAL-TABLES <GETP .PERSON ,P?CHARACTER>>>
<COND (<==? .HERE <GET .GT ,GOAL-F>>
<PUT .GT ,GOAL-S <>>
<RETURN <>>)
(<NOT <GET .GT ,GOAL-ENABLE>> <RFALSE>)>
<COND (<NOT <EQUAL? <SET LOC <GETP .HERE ,P?STATION>>
.HERE>>
<RETURN <MOVE-PERSON .PERSON .LOC>>)>
;%<COND (<GASSIGNED? PREDGEN>
'<>)
(T
'<COND (<NOT <EQUAL? <SET LOC ,<GETP .HERE ,P?STATION>>
.HERE>>
<RETURN <MOVE-PERSON .PERSON .LOC>>)>)>
<COND (<==? <SET GOAL <GET ,TRANSFER-TABLE
<SET IGOAL <GET .GT ,GOAL-I>>>> 0>
<SET IGOAL <>>
<SET GOAL <GET .GT ,GOAL-S>>)>
<COND (<NOT .GOAL> <RFALSE>)
(<==? .HERE .GOAL>
<COND (.IGOAL
<SET FLG <MOVE-PERSON .PERSON
<GET ,TRANSFER-TABLE
<+ .IGOAL 1>>>>
<ESTABLISH-GOAL .PERSON <GET .GT ,GOAL-F>>
<RETURN .FLG>)
(<NOT <==? .HERE <GET .GT ,GOAL-F>>>
<PUT .GT ,GOAL-S <>>
<SET FLG <MOVE-PERSON .PERSON <GET .GT ,GOAL-F>>>
<RETURN .FLG>)
(T
<PUT .GT ,GOAL-S <>>
<RETURN <>>)>)>
<SET LINE <GET-LINE <GETP .GOAL ,P?LINE>>>
<REPEAT ()
<COND (<==? <SET RM <GET .LINE .CNT>> .HERE>
<COND (.GOAL-FLAG
<SET LOC <GET .LINE <- .CNT 3>>>)
(T
<SET LOC <GET .LINE <+ .CNT 3>>>)>
<RETURN <MOVE-PERSON .PERSON .LOC>>)
(<==? .RM .GOAL>
<SET GOAL-FLAG T>)>
<SET CNT <+ .CNT 3>>>>
<ROUTINE COR-DIR (HERE THERE "AUX" COR RM (PAST 0) (CNT 2))
<SET COR <GET-COR <BAND <GETP .THERE ,P?CORRIDOR>
<GETP .HERE ,P?CORRIDOR>>>>
<REPEAT ()
<COND (<==? <SET RM <GET .COR .CNT>> .HERE>
<SET PAST 1>
<RETURN>)
(<==? .RM .THERE>
<RETURN>)>
<SET CNT <+ .CNT 1>>>
<GET .COR .PAST>>
<ROUTINE GET-LINE (LN)
<COND (<==? .LN 0> ,ROAD-WHARF-LINE)
(<==? .LN 1> ,EAST-ROAD-LINE)
(<==? .LN 2> ,BEDROOM-LINE)
(<==? .LN 3> ,BACK-ALLEY-LINE)
(<==? .LN 4> ,TRAWLER-LINE)
(<==? .LN 5> ,SALVAGER-LINE)>>
<ROUTINE GET-COR (NUM)
#DECL ((NUM) FIX)
<COND (<==? .NUM 1> ,COR-1)
(<==? .NUM 2> ,COR-2)
(<==? .NUM 4> ,COR-4)
(<==? .NUM 8> ,COR-8)
(<==? .NUM 16> ,COR-16)
(<==? .NUM 32> ,COR-32)
(<==? .NUM 64> ,COR-64)
(<==? .NUM 128> ,COR-128)
(<==? .NUM 256> ,COR-256)
(T ,COR-512)>>
"Goal tables for the 4 characters (plus delivery boy), offset by a constant,
which, for a given character, is the P?CHARACTER property of the object."
<GLOBAL GOAL-TABLES
<TABLE <TABLE <> <> <> 1 <> I-FOLLOW 5 5>
<TABLE <> <> <> 1 <> I-MCGINTY 5 5>
<TABLE <> <> <> 1 <> I-JOHNNY 5 5>
<TABLE <> <> <> 1 <> I-PETE 5 5>
<TABLE <> <> <> 1 <> I-WEASEL 5 5>
<TABLE <> <> <> 1 <> I-DELIVERY-BOY 0 0>>>
<CONSTANT CHARACTER-MAX 5>
<CONSTANT MCGINTY-C 1>
<CONSTANT JOHNNY-C 2>
<CONSTANT PETE-C 3>
<CONSTANT WEASEL-C 4>
<CONSTANT DELIVERY-BOY-C 5>
"Offsets into GOAL-TABLEs"
<CONSTANT GOAL-F 0> ;"final goal"
<CONSTANT GOAL-S 1> ;"station of final goal"
<CONSTANT GOAL-I 2> ;"intermediate goal (transfer point)"
<CONSTANT GOAL-ENABLE 3> ;"character can move; usually false only when he's
interrupted enroute"
<CONSTANT GOAL-QUEUED 4> ;"secondary goal to go to when current, higher-
priority one has been reached"
<CONSTANT GOAL-FUNCTION 5> ;"routine to apply on arrival"
<CONSTANT ATTENTION-SPAN 6> ;"how long character will wait when interrupted"
<CONSTANT ATTENTION 7> ;"used to count down from ATTENTION-SPAN to 0"
"Goal-function constants, similar to M-xxx in MAIN"
<CONSTANT G-REACHED 1>
<CONSTANT G-ENROUTE 2>
"Routines to do looking down corridors"
<ROUTINE CORRIDOR-LOOK ("OPTIONAL" (ITM <>) "AUX" C Z COR VAL (FOUND <>))
<COND (<SET C <GETP ,HERE ,P?CORRIDOR>>
<REPEAT ()
<COND ;(<NOT <L? <SET Z <- .C 1024>> 0>>
<SET COR ,COR-1024>)
(<NOT <L? <SET Z <- .C 512>> 0>>
<SET COR ,COR-512>)
(<NOT <L? <SET Z <- .C 256>> 0>>
<SET COR ,COR-256>)
(<NOT <L? <SET Z <- .C 128>> 0>>
<SET COR ,COR-128>)
(<NOT <L? <SET Z <- .C 64>> 0>>
<SET COR ,COR-64>)
(<NOT <L? <SET Z <- .C 32>> 0>>
<SET COR ,COR-32>)
(<NOT <L? <SET Z <- .C 16>> 0>>
<SET COR ,COR-16>)
(<NOT <L? <SET Z <- .C 8>> 0>>
<SET COR ,COR-8>)
(<NOT <L? <SET Z <- .C 4>> 0>>
<SET COR ,COR-4>)
(<NOT <L? <SET Z <- .C 2>> 0>>
<SET COR ,COR-2>)
(<NOT <L? <SET Z <- .C 1>> 0>>
<SET COR ,COR-1>)
(T <RETURN>)>
<SET VAL <CORRIDOR-CHECK .COR .ITM>>
<COND (<NOT .FOUND> <SET FOUND .VAL>)>
<SET C .Z>>
.FOUND)>>
<ROUTINE CORRIDOR-CHECK (COR ITM "AUX" (CNT 2) (PAST 0) (FOUND <>) RM OBJ)
<REPEAT ()
<COND (<==? <SET RM <GET .COR .CNT>> 0>
<RFALSE>)
(<==? .RM ,HERE> <SET PAST 1>)
(<SET OBJ <FIRST? .RM>>
<REPEAT ()
<COND (.ITM
<COND (<==? .OBJ .ITM>
<SET FOUND <GET .COR .PAST>>
<RETURN>)>)
(<AND <GETP .OBJ ,P?CHARACTER>
<NOT <IN-MOTION? .OBJ>>
<OR <NOT <==? .OBJ ,MCGINTY>>
<NOT <QUEUED?
I-MCGINTY-FOLLOWS>>
<NOT <VERB? WALK FOLLOW>>>>
<START-SENTENCE .OBJ>
<TELL " is ">
;<COND (<IN-MOTION? .OBJ>
<TELL "in motion ">)>
<TELL "off to ">
<DIR-PRINT <GET .COR .PAST>>
<TELL ".">
<CRLF>)>
<SET OBJ <NEXT? .OBJ>>
<COND (<NOT .OBJ> <RETURN>)>>
<COND (.FOUND <RETURN .FOUND>)>)>
<SET CNT <+ .CNT 1>>>>
<GLOBAL CHARACTER-TABLE <PTABLE PLAYER MCGINTY JOHNNY PETE WEASEL DELIVERY-BOY>>
"Goal tables for the 6 characters (including PLAYER), offset
by the preceding constants, which, for a given character,
is the P?CHARACTER property of the object."
"The ATTENTION-TABLE is now a thing of the past. ATTENTION
in the GOAL-TABLES is used instead."
"Here's how the movement goals are done: For each player is
a table which consists of triplets, a number of minutes until
the next movement (an clock interrupt number), a number of
minutes allowed variation (for a bit of randomness), and a
room toward which to start. All movement is controlled by
the GOAL-ENABLE flag in the GOAL-TABLE for a character."
"Time starts at 8AM. Characters are at that point in their
starting positions, as reflected in PEOPLE."
<GLOBAL MOVEMENT-GOALS <TABLE
;"PLAYER"
<TABLE 0 0 0>
;"MCGINTY"
<TABLE 0
58 2 SHANTY
15 1 MCGINTY-HQ
65 2 BANK
16 5 OUTFITTERS-HQ
30 3 MCGINTY-HQ
75 5 SHANTY
30 5 MCGINTY-HQ
;69 ;2 ;MM-FORE-DECK
0>
;"JOHNNY"
<TABLE 0
61 2 WINDING-ROAD-1
75 5 SHANTY
0>
;"PETE"
<TABLE 0
72 2 WINDING-ROAD-1
81 5 SHANTY
197 5 MM-GALLEY
0>
;"WEASEL"
<TABLE 0
8 5 UPSTAIRS-HALLWAY
58 2 WINDING-ROAD-1
78 5 UPSTAIRS-HALLWAY
85 1 FERRY-LANDING
0>
;"DELIVERY-BOY"
<TABLE 0
345 1 MM-LOCKER
0>>>
<GLOBAL WEASEL-RETIRES-TABLE
<TABLE 0
5 1 BACK-ALLEY-5
45 5 BANK
10 5 FERRY-LANDING
0>>
<GLOBAL JOHNNY-CONTINUES-TABLE
<TABLE 0
5 1 OUTFITTERS-HQ
60 5 POINT-LOOKOUT
25 1 SHANTY
0>>
<GLOBAL JOHNNY-COMPLETES-TABLE
<TABLE 0
200 5 MM-CAPT-CABIN
0>>
<ROUTINE IN-MOTION? (PERSON "AUX" GT)
<SET GT <GET ,GOAL-TABLES <GETP .PERSON ,P?CHARACTER>>>
<COND (<AND <OR <GET .GT ,GOAL-ENABLE>
<==? <GET .GT ,ATTENTION> 1>>
<GET .GT ,GOAL-S>
<NOT <==? <LOC .PERSON> <GET .GT ,GOAL-F>>>>
<RTRUE>)
(T <RFALSE>)>>
<ROUTINE START-MOVEMENT ()
<ENABLE <QUEUE I-MCGINTY 1>>
<ENABLE <QUEUE I-JOHNNY 1>>
<ENABLE <QUEUE I-PETE 1>>
<ENABLE <QUEUE I-WEASEL 1>>
<ENABLE <QUEUE I-DELIVERY-BOY 1>>
<ENABLE <QUEUE I-FOLLOW -1>>
<ENABLE <QUEUE I-ATTENTION -1>>
<ENABLE <QUEUE I-DISGUSTING-WEASEL-KLUDGE 35>>>
"This routine does the interrupt-driven goal establishment
for the various characters, using the MOVEMENT-GOALS table."
<CONSTANT MG-ROOM 0>
<CONSTANT MG-TIME 1>
<CONSTANT MG-VARIATION 2>
<CONSTANT MG-LENGTH <* 3 2>>
<CONSTANT MG-NEXT 4>
<ROUTINE IMOVEMENT (PERSON INT "AUX" TB VAR DIS TIM ID RM GT)
#DECL ((PERSON) OBJECT (TB) <PRIMTYPE VECTOR> (ID VAR DIS TIM) FIX)
<SET TB <GET ,MOVEMENT-GOALS <SET ID <GETP .PERSON ,P?CHARACTER>>>>
<SET GT <GET ,GOAL-TABLES .ID>>
<COND (<NOT <==? 0 <SET RM <GET .TB ,MG-ROOM>>>>
<COND (<GET .GT ,GOAL-QUEUED>
<PUT .GT ,GOAL-QUEUED .RM>)
(T
<ESTABLISH-GOAL .PERSON .RM>)>)>
<COND (<NOT <==? 0 <SET TIM <GET .TB ,MG-TIME>>>>
<SET VAR <GET .TB ,MG-VARIATION>>
<SET DIS <RANDOM <* .VAR 2>>>
<QUEUE .INT <+ .TIM <- .DIS .VAR>>>
<PUT ,MOVEMENT-GOALS .ID <REST .TB ,MG-LENGTH>>
<COND (<NOT <==? 0 <GET .TB ,MG-NEXT>>>
<PUT .TB
,MG-NEXT
<+ <GET .TB ,MG-NEXT> <- .VAR .DIS>>>)>)>
<RFALSE>>
<ROUTINE I-FOLLOW ("AUX" (FLG <>) (CNT 0) GT VAL)
<REPEAT ()
<COND (<G? <SET CNT <+ .CNT 1>> ,CHARACTER-MAX>
<RETURN>)
(<AND <GET <SET GT <GET ,GOAL-TABLES .CNT>> ,GOAL-S>
<OR <GET .GT ,GOAL-ENABLE>
<0? <GET .GT ,ATTENTION>>>>
<PUT .GT ,GOAL-ENABLE T>
<COND (<SET VAL
<FOLLOW-GOAL <GET ,CHARACTER-TABLE .CNT>>>
<COND (<NOT <==? .FLG ,M-FATAL>>
<SET FLG .VAL>)>)>)>>
.FLG>
<ROUTINE I-ATTENTION ("AUX" (FLG <>) (CNT 0) ATT GT)
<REPEAT ()
<COND (<G? <SET CNT <+ .CNT 1>> ,CHARACTER-MAX> <RETURN>)
(<0? <SET ATT <- <GET
<SET GT <GET ,GOAL-TABLES .CNT>>
,ATTENTION> 1>>>
<PUT .GT ,GOAL-ENABLE T>)
;(<==? <SET ATT <- <GET
<SET GT <GET ,GOAL-TABLES .CNT>>
,ATTENTION> 1>> 1>
<COND (<AND <IN? <GET ,CHARACTER-TABLE .CNT> ,HERE>
<NOT ,ASLEEP?>>
<START-SENTENCE <GET ,CHARACTER-TABLE .CNT>>
<TELL " is acting impatient." CR>
<SET FLG T>)>)
;(<==? .ATT 0>
<PUT .GT ,GOAL-ENABLE T>)>
<PUT .GT ,ATTENTION .ATT>>
.FLG>
<ROUTINE GRAB-ATTENTION (PERSON "AUX" (CHR<GETP .PERSON ,P?CHARACTER>) GT ATT)
#DECL ((PERSON) OBJECT (ATT) FIX)
<SET GT <GET ,GOAL-TABLES .CHR>>
<COND (<GET .GT ,GOAL-S>
<PUT .GT ,ATTENTION <SET ATT <GET .GT ,ATTENTION-SPAN>>>
<COND (<==? .ATT 0>
<PUT .GT ,GOAL-ENABLE T>
<RFALSE>)
(<GET .GT ,GOAL-ENABLE>
<PUT .GT ,GOAL-ENABLE <>>)>)>
<SETG QCONTEXT .PERSON>
<SETG QCONTEXT-ROOM ,HERE>
<RTRUE>>
" Movement etc."
;<ROUTINE UNPRIORITIZE (PERSON "AUX" GT)
<SET GT <GET ,GOAL-TABLES <GETP .PERSON ,P?CHARACTER>>>
<COND (<GET .GT ,GOAL-QUEUED>
<ESTABLISH-GOAL .PERSON <GET .GT ,GOAL-QUEUED>>
<PUT .GT ,GOAL-QUEUED <>>)>>
<ROUTINE ESTABLISH-GOAL (PERSON GOAL "OPTIONAL" (PRIORITY <>)
"AUX" (HERE <LOC .PERSON>) HL GL GT)
#DECL ((PERSON GOAL HERE) OBJECT (HL GL) FIX
(PRIORITY) <OR FALSE ATOM>)
;<COND (<==? .HERE .GOAL>
<RETURN .HERE>)>
<SET GT <GET ,GOAL-TABLES <GETP .PERSON ,P?CHARACTER>>>
<COND (.PRIORITY
<PUT .GT ,GOAL-ENABLE T>
<PUT .GT ,GOAL-QUEUED .HERE>)>
<PUT .GT ,GOAL-I <+ <* <GETP .HERE ,P?LINE> 12>
<* <GETP .GOAL ,P?LINE> 2>>>
<PUT .GT
,GOAL-S
<GETP .GOAL ,P?STATION>
;%<COND (<GASSIGNED? PREDGEN> '<>)
(T ',<GETP .GOAL ,P?STATION>)>>
<PUT .GT ,GOAL-F .GOAL>
<LOC .PERSON>>
<ROUTINE GOAL-REACHED (PERSON "AUX" GT)
#DECL ((PERSON) OBJECT)
<PUT <SET GT <GET ,GOAL-TABLES <GETP .PERSON ,P?CHARACTER>>>
,GOAL-S <>>
<APPLY <GET .GT ,GOAL-FUNCTION>
,G-REACHED>>
<ROUTINE MOVE-PERSON (PERSON WHERE "AUX" DIR GT OL COR PCOR CHR PUSHCART
(FLG <>) ;DR (VAL <>) DF CD)
#DECL ((PERSON WHERE) OBJECT)
<SET GT <GET ,GOAL-TABLES <SET CHR <GETP .PERSON ,P?CHARACTER>>>>
<SET OL <LOC .PERSON>>
<SET DIR <DIR-FROM .OL .WHERE>>
<SET PUSHCART ", pushing his cart">
;<COND (<==? <PTSIZE <SET DR <GETPT .OL .DIR>>> ,DEXIT>
<SET DR <GETB .DR ,DEXITOBJ>>
<COND (<NOT <FSET? .DR ,OPENBIT>>
<FSET .DR ,OPENBIT>
;<COND (<NOT <FSET? .DR ,LOCKED>> <FSET .DR ,OPENBIT>)>)
(T <SET DR <>>)>)
(T <SET DR <>>)>
<COND (<AND <==? .OL ,HERE>
<NOT <FSET? .PERSON ,INVISIBLE>>>
<SET FLG T>
<START-SENTENCE .PERSON>
<COND (<==? .DIR ,P?OUT>
<TELL " leaves the room">
<COND (<==? .PERSON ,DELIVERY-BOY> <TELL .PUSHCART>)>
<TELL "." CR>)
(<==? .DIR ,P?IN>
;<COND (.DR
<TELL " opens the " D .DR " and">)>
<TELL " goes into another room">
;<COND (<AND .DR
<FSET? .DR ,LOCKED>>
;<FCLEAR .DR ,OPENBIT>
<TELL ", locking the door again">)>
<TELL "." CR>)
(T
;<COND (.DR
<TELL " opens the " D .DR " and">)>
<TELL " heads ">
<COND (<AND <L? <GETP ,HERE ,P?LINE> ,TRAWLER-LINE-C>
<NOT <EQUAL? .DIR ,P?UP ,P?DOWN>>>
<TELL "off to ">)>
<DIR-PRINT .DIR>
;<COND (<AND .DR
<FSET? .DR ,LOCKED>>
;<FCLEAR .DR ,OPENBIT>
<TELL ", locking the door again">)>
<COND (<==? .PERSON ,DELIVERY-BOY> <TELL .PUSHCART>)>
<TELL "." CR>)>)
(<AND <==? .WHERE ,HERE>
<NOT <FSET? .PERSON ,INVISIBLE>>>
<SET FLG ,M-FATAL>
<COND (<NOT <==? ,HERE <GET .GT ,GOAL-F>>>
<START-SENTENCE .PERSON>
<TELL " walks ">
<COND (<AND <VERB? WALK>
<==? .WHERE ,HERE>
<==? .OL ,LAST-PLAYER-LOC>>
<TELL "along with">)
(T <TELL "past">)>
<TELL " you">
<COND (<==? .PERSON ,DELIVERY-BOY> <TELL .PUSHCART>)>
<TELL "." CR>)>)
(<AND <SET COR <GETP ,HERE ,P?CORRIDOR>>
<NOT <FSET? .PERSON ,INVISIBLE>>>
<COND (<AND <SET PCOR <GETP .OL ,P?CORRIDOR>>
<NOT <==? <BAND .COR .PCOR> 0>>>
<SET FLG T>
<COND (<NOT <GETP .WHERE ,P?CORRIDOR>>
<START-SENTENCE .PERSON>
<TELL ", off to ">
<DIR-PRINT <COR-DIR ,HERE .OL>>
<TELL ",">
;<COND (.DR
<TELL " opens a door and">)>
<TELL " leaves your view">
<TELL " to ">
<DIR-PRINT <DIR-FROM .OL .WHERE>>
;<COND (<AND .DR
<FSET? .DR ,LOCKED>>
;<FCLEAR .DR ,OPENBIT>
<TELL ", locking the door again">)>
<COND (<==? .PERSON ,DELIVERY-BOY>
<TELL .PUSHCART>)>
<TELL "." CR>)
(<0? <BAND .COR <GETP .WHERE ,P?CORRIDOR>>>
<START-SENTENCE .PERSON>
<TELL ", off to ">
<DIR-PRINT <COR-DIR ,HERE .OL>>
<TELL ", disappears from sight to ">
<DIR-PRINT <SET PCOR <DIR-FROM .OL .WHERE>>>
<COND (<==? .PERSON ,DELIVERY-BOY>
<TELL .PUSHCART>)>
<TELL "." CR>)
(T
<START-SENTENCE .PERSON>
<TELL " is to ">
<DIR-PRINT <SET CD <COR-DIR ,HERE .WHERE>>>
<TELL ", heading ">
<COND (<==? .CD <SET DF <DIR-FROM .OL .WHERE>>>
<TELL "away from you">)
(T
<TELL "toward ">
<DIR-PRINT .DF>)>
<COND (<==? .PERSON ,DELIVERY-BOY>
<TELL .PUSHCART>)>
<TELL "." CR>)>)
(<AND <SET PCOR <GETP .WHERE ,P?CORRIDOR>>
<NOT <==? <BAND .COR .PCOR> 0>>>
<SET FLG T>
<TELL "To ">
<DIR-PRINT <COR-DIR ,HERE .WHERE>>
<TELL " ">
<THE? .PERSON>
<TELL D .PERSON " comes into view from ">
<DIR-PRINT <DIR-FROM .WHERE .OL>>
<COND (<==? .PERSON ,DELIVERY-BOY> <TELL .PUSHCART>)>
<TELL "." CR>)>)>
;<WHERE-UPDATE .PERSON .FLG>
<MOVE .PERSON .WHERE>
<COND (<==? <GET .GT ,GOAL-F> .WHERE>
<COND (<AND <NOT <SET VAL <GOAL-REACHED .PERSON>>>
<==? ,HERE .WHERE>
<NOT <FSET? .PERSON ,INVISIBLE>>>
<SET FLG ,M-FATAL>
<START-SENTENCE .PERSON>
<TELL " stops here." CR>)>)
(T <APPLY <GET .GT ,GOAL-FUNCTION> ,G-ENROUTE>)>
;<COND (,DEBUG
<TELL "[">
<START-SENTENCE .PERSON>
<TELL " just went into ">
<THE? .WHERE>
<TELL D .WHERE ".]" CR>)>
<COND (<==? .VAL ,M-FATAL> .VAL)
(T .FLG)>>
<ROUTINE DIR-FROM (HERE THERE "AUX" (V <>) (P 0) L Z O)
#DECL ((HERE THERE O) OBJECT (P L) FIX)
<REPEAT ()
<COND (<0? <SET P <NEXTP .HERE .P>>>
<RETURN .V>)
(<EQUAL? .P ,P?IN ,P?OUT> T)
(<NOT <L? .P ,LOW-DIRECTION>>
<SET Z <GETPT .HERE .P>>
<SET L <PTSIZE .Z>>
<COND (<AND <EQUAL? .L ,DEXIT ,UEXIT ,CEXIT>
<==? <GETB .Z ,REXIT> .THERE>>
<COND (<EQUAL? .P ,P?UP ,P?DOWN>
<SET V .P>)
(T <RETURN .P>)>)
(<AND <NOT .V>
<EQUAL? .L ,FEXIT>>
<SET V .P>)>)>>>
;<ROUTINE WHERE-UPDATE (PERSON "OPTIONAL" (FLG <>) "AUX" WT NC (CNT 0))
<SET NC <GETP .PERSON ,P?CHARACTER>>
<SET WT <GET ,WHERE-TABLES .NC>>
<REPEAT ()
<COND (<G? .CNT ,CHARACTER-MAX> <RETURN>)
(<==? .CNT .NC>)
(<OR <AND <0? .CNT> .FLG>
<IN? <GET ,CHARACTER-TABLE .CNT> <LOC .PERSON>>>
<PUT .WT .CNT ,PRESENT-TIME>
<PUT <GET ,WHERE-TABLES .CNT> .NC ,PRESENT-TIME>)>
<SET CNT <+ .CNT 1>>>>
;<GLOBAL WHERE-TABLES
<TABLE <TABLE 0 0 0 0 0>
<TABLE 0 0 0 0 0>
<TABLE 0 0 0 0 0>
<TABLE 0 0 0 0 0>
<TABLE 0 0 0 0 0>>>